From cb0f5ed1c81a15c05a4de652210e0d5e869e88de Mon Sep 17 00:00:00 2001 From: Martin Poirier Date: Tue, 27 Apr 2010 02:18:35 +0000 Subject: [PATCH 001/182] branching for GSOC 2010 From 34058faa0ef08f85c89f920298d54849a55b6052 Mon Sep 17 00:00:00 2001 From: Nick Samarin Date: Wed, 19 May 2010 01:01:21 +0000 Subject: [PATCH 002/182] added RecastNavigation library as extern project --- .../Detour/Include/DetourCommon.h | 167 ++ .../Detour/Include/DetourDebugDraw.h | 32 + .../Detour/Include/DetourNode.h | 149 ++ .../Detour/Include/DetourStatNavMesh.h | 234 +++ .../Detour/Include/DetourStatNavMeshBuilder.h | 29 + .../Detour/Include/DetourTileNavMesh.h | 315 ++++ .../Detour/Include/DetourTileNavMeshBuilder.h | 29 + .../Detour/Source/DetourCommon.cpp | 244 +++ .../Detour/Source/DetourDebugDraw.cpp | 496 ++++++ .../Detour/Source/DetourNode.cpp | 140 ++ .../Detour/Source/DetourStatNavMesh.cpp | 876 ++++++++++ .../Source/DetourStatNavMeshBuilder.cpp | 346 ++++ .../Detour/Source/DetourTileNavMesh.cpp | 1428 +++++++++++++++++ .../Source/DetourTileNavMeshBuilder.cpp | 213 +++ extern/recastnavigation/License.txt | 18 + extern/recastnavigation/Readme.txt | 120 ++ .../recastnavigation/Recast/Include/Recast.h | 500 ++++++ .../Recast/Include/RecastDebugDraw.h | 59 + .../Recast/Include/RecastLog.h | 80 + .../Recast/Include/RecastTimer.h | 31 + .../recastnavigation/Recast/Source/Recast.cpp | 272 ++++ .../Recast/Source/RecastContour.cpp | 732 +++++++++ .../Recast/Source/RecastDebugDraw.cpp | 799 +++++++++ .../Recast/Source/RecastFilter.cpp | 249 +++ .../Recast/Source/RecastLog.cpp | 77 + .../Recast/Source/RecastMesh.cpp | 1212 ++++++++++++++ .../Recast/Source/RecastMeshDetail.cpp | 981 +++++++++++ .../Recast/Source/RecastRasterization.cpp | 308 ++++ .../Recast/Source/RecastRegion.cpp | 1081 +++++++++++++ .../Recast/Source/RecastTimer.cpp | 58 + .../make/msvc_9_0/recastnavigation.vcproj | 275 ++++ projectfiles_vc9/blender/blender.sln | 23 + 32 files changed, 11573 insertions(+) create mode 100644 extern/recastnavigation/Detour/Include/DetourCommon.h create mode 100644 extern/recastnavigation/Detour/Include/DetourDebugDraw.h create mode 100644 extern/recastnavigation/Detour/Include/DetourNode.h create mode 100644 extern/recastnavigation/Detour/Include/DetourStatNavMesh.h create mode 100644 extern/recastnavigation/Detour/Include/DetourStatNavMeshBuilder.h create mode 100644 extern/recastnavigation/Detour/Include/DetourTileNavMesh.h create mode 100644 extern/recastnavigation/Detour/Include/DetourTileNavMeshBuilder.h create mode 100644 extern/recastnavigation/Detour/Source/DetourCommon.cpp create mode 100644 extern/recastnavigation/Detour/Source/DetourDebugDraw.cpp create mode 100644 extern/recastnavigation/Detour/Source/DetourNode.cpp create mode 100644 extern/recastnavigation/Detour/Source/DetourStatNavMesh.cpp create mode 100644 extern/recastnavigation/Detour/Source/DetourStatNavMeshBuilder.cpp create mode 100644 extern/recastnavigation/Detour/Source/DetourTileNavMesh.cpp create mode 100644 extern/recastnavigation/Detour/Source/DetourTileNavMeshBuilder.cpp create mode 100644 extern/recastnavigation/License.txt create mode 100644 extern/recastnavigation/Readme.txt create mode 100644 extern/recastnavigation/Recast/Include/Recast.h create mode 100644 extern/recastnavigation/Recast/Include/RecastDebugDraw.h create mode 100644 extern/recastnavigation/Recast/Include/RecastLog.h create mode 100644 extern/recastnavigation/Recast/Include/RecastTimer.h create mode 100644 extern/recastnavigation/Recast/Source/Recast.cpp create mode 100644 extern/recastnavigation/Recast/Source/RecastContour.cpp create mode 100644 extern/recastnavigation/Recast/Source/RecastDebugDraw.cpp create mode 100644 extern/recastnavigation/Recast/Source/RecastFilter.cpp create mode 100644 extern/recastnavigation/Recast/Source/RecastLog.cpp create mode 100644 extern/recastnavigation/Recast/Source/RecastMesh.cpp create mode 100644 extern/recastnavigation/Recast/Source/RecastMeshDetail.cpp create mode 100644 extern/recastnavigation/Recast/Source/RecastRasterization.cpp create mode 100644 extern/recastnavigation/Recast/Source/RecastRegion.cpp create mode 100644 extern/recastnavigation/Recast/Source/RecastTimer.cpp create mode 100644 extern/recastnavigation/make/msvc_9_0/recastnavigation.vcproj diff --git a/extern/recastnavigation/Detour/Include/DetourCommon.h b/extern/recastnavigation/Detour/Include/DetourCommon.h new file mode 100644 index 00000000000..d824efc06e4 --- /dev/null +++ b/extern/recastnavigation/Detour/Include/DetourCommon.h @@ -0,0 +1,167 @@ +// +// Copyright (c) 2009 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#ifndef DETOURCOMMON_H +#define DETOURCOMMON_H + +////////////////////////////////////////////////////////////////////////////////////////// + +template inline void swap(T& a, T& b) { T t = a; a = b; b = t; } +template inline T min(T a, T b) { return a < b ? a : b; } +template inline T max(T a, T b) { return a > b ? a : b; } +template inline T abs(T a) { return a < 0 ? -a : a; } +template inline T sqr(T a) { return a*a; } +template inline T clamp(T v, T mn, T mx) { return v < mn ? mn : (v > mx ? mx : v); } + +inline void vcross(float* dest, const float* v1, const float* v2) +{ + dest[0] = v1[1]*v2[2] - v1[2]*v2[1]; + dest[1] = v1[2]*v2[0] - v1[0]*v2[2]; + dest[2] = v1[0]*v2[1] - v1[1]*v2[0]; +} + +inline float vdot(const float* v1, const float* v2) +{ + return v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2]; +} + +inline void vmad(float* dest, const float* v1, const float* v2, const float s) +{ + dest[0] = v1[0]+v2[0]*s; + dest[1] = v1[1]+v2[1]*s; + dest[2] = v1[2]+v2[2]*s; +} + +inline void vadd(float* dest, const float* v1, const float* v2) +{ + dest[0] = v1[0]+v2[0]; + dest[1] = v1[1]+v2[1]; + dest[2] = v1[2]+v2[2]; +} + +inline void vsub(float* dest, const float* v1, const float* v2) +{ + dest[0] = v1[0]-v2[0]; + dest[1] = v1[1]-v2[1]; + dest[2] = v1[2]-v2[2]; +} + +inline void vmin(float* mn, const float* v) +{ + mn[0] = min(mn[0], v[0]); + mn[1] = min(mn[1], v[1]); + mn[2] = min(mn[2], v[2]); +} + +inline void vmax(float* mx, const float* v) +{ + mx[0] = max(mx[0], v[0]); + mx[1] = max(mx[1], v[1]); + mx[2] = max(mx[2], v[2]); +} + +inline void vcopy(float* dest, const float* a) +{ + dest[0] = a[0]; + dest[1] = a[1]; + dest[2] = a[2]; +} + +inline float vdist(const float* v1, const float* v2) +{ + float dx = v2[0] - v1[0]; + float dy = v2[1] - v1[1]; + float dz = v2[2] - v1[2]; + return sqrtf(dx*dx + dy*dy + dz*dz); +} + +inline float vdistSqr(const float* v1, const float* v2) +{ + float dx = v2[0] - v1[0]; + float dy = v2[1] - v1[1]; + float dz = v2[2] - v1[2]; + return dx*dx + dy*dy + dz*dz; +} + +inline void vnormalize(float* v) +{ + float d = 1.0f / sqrtf(sqr(v[0]) + sqr(v[1]) + sqr(v[2])); + v[0] *= d; + v[1] *= d; + v[2] *= d; +} + +inline bool vequal(const float* p0, const float* p1) +{ + static const float thr = sqr(1.0f/16384.0f); + const float d = vdistSqr(p0, p1); + return d < thr; +} + +inline int nextPow2(int v) +{ + v--; + v |= v >> 1; + v |= v >> 2; + v |= v >> 4; + v |= v >> 8; + v |= v >> 16; + v++; + return v; +} + +inline float vdot2D(const float* u, const float* v) +{ + return u[0]*v[0] + u[2]*v[2]; +} + +inline float vperp2D(const float* u, const float* v) +{ + return u[2]*v[0] - u[0]*v[2]; +} + +inline float triArea2D(const float* a, const float* b, const float* c) +{ + return ((b[0]*a[2] - a[0]*b[2]) + (c[0]*b[2] - b[0]*c[2]) + (a[0]*c[2] - c[0]*a[2])) * 0.5f; +} + +inline bool checkOverlapBox(const unsigned short amin[3], const unsigned short amax[3], + const unsigned short bmin[3], const unsigned short bmax[3]) +{ + bool overlap = true; + overlap = (amin[0] > bmax[0] || amax[0] < bmin[0]) ? false : overlap; + overlap = (amin[1] > bmax[1] || amax[1] < bmin[1]) ? false : overlap; + overlap = (amin[2] > bmax[2] || amax[2] < bmin[2]) ? false : overlap; + return overlap; +} + +void closestPtPointTriangle(float* closest, const float* p, + const float* a, const float* b, const float* c); + +bool closestHeightPointTriangle(const float* p, const float* a, const float* b, const float* c, float& h); + +bool intersectSegmentPoly2D(const float* p0, const float* p1, + const float* verts, int nverts, + float& tmin, float& tmax, + int& segMin, int& segMax); + +float distancePtSegSqr2D(const float* pt, const float* p, const float* q, float& t); + +void calcPolyCenter(float* tc, const unsigned short* idx, int nidx, const float* verts); + +#endif // DETOURCOMMON_H \ No newline at end of file diff --git a/extern/recastnavigation/Detour/Include/DetourDebugDraw.h b/extern/recastnavigation/Detour/Include/DetourDebugDraw.h new file mode 100644 index 00000000000..8e1cfe44fdb --- /dev/null +++ b/extern/recastnavigation/Detour/Include/DetourDebugDraw.h @@ -0,0 +1,32 @@ +// +// Copyright (c) 2009 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#ifndef DETOURDEBUGDRAW_H +#define DETOURDEBUGDRAW_H + +#include "DetourStatNavMesh.h" +#include "DetourTileNavMesh.h" + +void dtDebugDrawStatNavMeshPoly(const dtStatNavMesh* mesh, dtStatPolyRef ref, const float* col); +void dtDebugDrawStatNavMeshBVTree(const dtStatNavMesh* mesh); +void dtDebugDrawStatNavMesh(const dtStatNavMesh* mesh, bool drawClosedList = false); + +void dtDebugDrawTiledNavMesh(const dtTiledNavMesh* mesh); +void dtDebugDrawTiledNavMeshPoly(const dtTiledNavMesh* mesh, dtTilePolyRef ref, const float* col); + +#endif // DETOURDEBUGDRAW_H \ No newline at end of file diff --git a/extern/recastnavigation/Detour/Include/DetourNode.h b/extern/recastnavigation/Detour/Include/DetourNode.h new file mode 100644 index 00000000000..316d5bf4cf6 --- /dev/null +++ b/extern/recastnavigation/Detour/Include/DetourNode.h @@ -0,0 +1,149 @@ +// +// Copyright (c) 2009 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#ifndef DETOURNODE_H +#define DETOURNODE_H + +enum dtNodeFlags +{ + DT_NODE_OPEN = 0x01, + DT_NODE_CLOSED = 0x02, +}; + +struct dtNode +{ + float cost; + float total; + unsigned int id; + unsigned int pidx : 30; + unsigned int flags : 2; +}; + +class dtNodePool +{ +public: + dtNodePool(int maxNodes, int hashSize); + ~dtNodePool(); + inline void operator=(const dtNodePool&) {} + void clear(); + dtNode* getNode(unsigned int id); + const dtNode* findNode(unsigned int id) const; + + inline unsigned int getNodeIdx(const dtNode* node) const + { + if (!node) return 0; + return (unsigned int)(node - m_nodes)+1; + } + + inline dtNode* getNodeAtIdx(unsigned int idx) + { + if (!idx) return 0; + return &m_nodes[idx-1]; + } + + inline int getMemUsed() const + { + return sizeof(*this) + + sizeof(dtNode)*m_maxNodes + + sizeof(unsigned short)*m_maxNodes + + sizeof(unsigned short)*m_hashSize; + } + +private: + inline unsigned int hashint(unsigned int a) const + { + a += ~(a<<15); + a ^= (a>>10); + a += (a<<3); + a ^= (a>>6); + a += ~(a<<11); + a ^= (a>>16); + return a; + } + + dtNode* m_nodes; + unsigned short* m_first; + unsigned short* m_next; + const int m_maxNodes; + const int m_hashSize; + int m_nodeCount; +}; + +class dtNodeQueue +{ +public: + dtNodeQueue(int n); + ~dtNodeQueue(); + inline void operator=(dtNodeQueue&) {} + + inline void clear() + { + m_size = 0; + } + + inline dtNode* top() + { + return m_heap[0]; + } + + inline dtNode* pop() + { + dtNode* result = m_heap[0]; + m_size--; + trickleDown(0, m_heap[m_size]); + return result; + } + + inline void push(dtNode* node) + { + m_size++; + bubbleUp(m_size-1, node); + } + + inline void modify(dtNode* node) + { + for (int i = 0; i < m_size; ++i) + { + if (m_heap[i] == node) + { + bubbleUp(i, node); + return; + } + } + } + + inline bool empty() const { return m_size == 0; } + + inline int getMemUsed() const + { + return sizeof(*this) + + sizeof(dtNode*)*(m_capacity+1); + } + + +private: + void bubbleUp(int i, dtNode* node); + void trickleDown(int i, dtNode* node); + + dtNode** m_heap; + const int m_capacity; + int m_size; +}; + + +#endif // DETOURNODE_H \ No newline at end of file diff --git a/extern/recastnavigation/Detour/Include/DetourStatNavMesh.h b/extern/recastnavigation/Detour/Include/DetourStatNavMesh.h new file mode 100644 index 00000000000..71ee4cb0b51 --- /dev/null +++ b/extern/recastnavigation/Detour/Include/DetourStatNavMesh.h @@ -0,0 +1,234 @@ +// +// Copyright (c) 2009 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#ifndef DETOURSTATNAVMESH_H +#define DETOURSTATNAVMESH_H + +// Reference to navigation polygon. +typedef unsigned short dtStatPolyRef; + +// Maximum number of vertices per navigation polygon. +static const int DT_STAT_VERTS_PER_POLYGON = 6; + +// Structure holding the navigation polygon data. +struct dtStatPoly +{ + unsigned short v[DT_STAT_VERTS_PER_POLYGON]; // Indices to vertices of the poly. + dtStatPolyRef n[DT_STAT_VERTS_PER_POLYGON]; // Refs to neighbours of the poly. + unsigned char nv; // Number of vertices. + unsigned char flags; // Flags (not used). +}; + +struct dtStatPolyDetail +{ + unsigned short vbase; // Offset to detail vertex array. + unsigned short nverts; // Number of vertices in the detail mesh. + unsigned short tbase; // Offset to detail triangle array. + unsigned short ntris; // Number of triangles. +}; + +const int DT_STAT_NAVMESH_MAGIC = 'NAVM'; +const int DT_STAT_NAVMESH_VERSION = 3; + +struct dtStatBVNode +{ + unsigned short bmin[3], bmax[3]; + int i; +}; + +struct dtStatNavMeshHeader +{ + int magic; + int version; + int npolys; + int nverts; + int nnodes; + int ndmeshes; + int ndverts; + int ndtris; + float cs; + float bmin[3], bmax[3]; + dtStatPoly* polys; + float* verts; + dtStatBVNode* bvtree; + dtStatPolyDetail* dmeshes; + float* dverts; + unsigned char* dtris; +}; + +class dtStatNavMesh +{ +public: + + dtStatNavMesh(); + ~dtStatNavMesh(); + + // Initializes the navmesh with data. + // Params: + // data - (in) Pointer to navmesh data. + // dataSize - (in) size of the navmesh data. + // ownsData - (in) Flag indicating if the navmesh should own and delete the data. + bool init(unsigned char* data, int dataSize, bool ownsData); + + // Finds the nearest navigation polygon around the center location. + // Params: + // center - (in) The center of the search box. + // extents - (in) The extents of the search box. + // Returns: Reference identifier for the polygon, or 0 if no polygons found. + dtStatPolyRef findNearestPoly(const float* center, const float* extents); + + // Returns polygons which touch the query box. + // Params: + // center - (in) the center of the search box. + // extents - (in) the extents of the search box. + // polys - (out) array holding the search result. + // maxPolys - (in) The max number of polygons the polys array can hold. + // Returns: Number of polygons in search result array. + int queryPolygons(const float* center, const float* extents, + dtStatPolyRef* polys, const int maxPolys); + + // Finds path from start polygon to end polygon. + // If target polygon canno be reached through the navigation graph, + // the last node on the array is nearest node to the end polygon. + // Params: + // startRef - (in) ref to path start polygon. + // endRef - (in) ref to path end polygon. + // path - (out) array holding the search result. + // maxPathSize - (in) The max number of polygons the path array can hold. + // Returns: Number of polygons in search result array. + int findPath(dtStatPolyRef startRef, dtStatPolyRef endRef, + const float* startPos, const float* endPos, + dtStatPolyRef* path, const int maxPathSize); + + // Finds a straight path from start to end locations within the corridor + // described by the path polygons. + // Start and end locations will be clamped on the corridor. + // Params: + // startPos - (in) Path start location. + // endPos - (in) Path end location. + // path - (in) Array of connected polygons describing the corridor. + // pathSize - (in) Number of polygons in path array. + // straightPath - (out) Points describing the straight path. + // maxStraightPathSize - (in) The max number of points the straight path array can hold. + // Returns: Number of points in the path. + int findStraightPath(const float* startPos, const float* endPos, + const dtStatPolyRef* path, const int pathSize, + float* straightPath, const int maxStraightPathSize); + + // Finds intersection againts walls starting from start pos. + // Params: + // startRef - (in) ref to the polygon where the start lies. + // startPos - (in) start position of the query. + // endPos - (in) end position of the query. + // t - (out) hit parameter along the segment, 0 if no hit. + // endRef - (out) ref to the last polygon which was processed. + // Returns: Number of polygons in path or 0 if failed. + int raycast(dtStatPolyRef startRef, const float* startPos, const float* endPos, + float& t, dtStatPolyRef* path, const int pathSize); + + // Returns distance to nearest wall from the specified location. + // Params: + // centerRef - (in) ref to the polygon where the center lies. + // centerPos - (in) center if the query circle. + // maxRadius - (in) max search radius. + // hitPos - (out) location of the nearest hit. + // hitNormal - (out) normal of the nearest hit. + // Returns: Distance to nearest wall from the test location. + float findDistanceToWall(dtStatPolyRef centerRef, const float* centerPos, float maxRadius, + float* hitPos, float* hitNormal); + + // Finds polygons found along the navigation graph which touch the specified circle. + // Params: + // centerRef - (in) ref to the polygon where the center lies. + // centerPos - (in) center if the query circle + // radius - (in) radius of the query circle + // resultRef - (out, opt) refs to the polygons touched by the circle. + // resultParent - (out, opt) parent of each result polygon. + // resultCost - (out, opt) search cost at each result polygon. + // maxResult - (int) maximum capacity of search results. + // Returns: Number of results. + int findPolysAround(dtStatPolyRef centerRef, const float* centerPos, float radius, + dtStatPolyRef* resultRef, dtStatPolyRef* resultParent, float* resultCost, + const int maxResult); + + // Returns closest point on navigation polygon. + // Params: + // ref - (in) ref to the polygon. + // pos - (in) the point to check. + // closest - (out) closest point. + // Returns: true if closest point found. + bool closestPointToPoly(dtStatPolyRef ref, const float* pos, float* closest) const; + + // Returns height of the polygon at specified location. + // Params: + // ref - (in) ref to the polygon. + // pos - (in) the point where to locate the height. + // height - (out) height at the location. + // Returns: true if oer polygon. + bool getPolyHeight(dtStatPolyRef ref, const float* pos, float* height) const; + + // Returns pointer to a polygon based on ref. + const dtStatPoly* getPolyByRef(dtStatPolyRef ref) const; + // Returns polygon index based on ref, or -1 if failed. + int getPolyIndexByRef(dtStatPolyRef ref) const; + // Returns number of navigation polygons. + inline int getPolyCount() const { return m_header ? m_header->npolys : 0; } + // Rerturns pointer to specified navigation polygon. + inline const dtStatPoly* getPoly(int i) const { return &m_header->polys[i]; } + // Returns number of vertices. + inline int getVertexCount() const { return m_header ? m_header->nverts : 0; } + // Returns pointer to specified vertex. + inline const float* getVertex(int i) const { return &m_header->verts[i*3]; } + // Returns number of navigation polygons details. + inline int getPolyDetailCount() const { return m_header ? m_header->ndmeshes : 0; } + // Rerturns pointer to specified navigation polygon detail. + const dtStatPolyDetail* getPolyDetail(int i) const { return &m_header->dmeshes[i]; } + // Returns pointer to specified vertex. + inline const float* getDetailVertex(int i) const { return &m_header->dverts[i*3]; } + // Returns pointer to specified vertex. + inline const unsigned char* getDetailTri(int i) const { return &m_header->dtris[i*4]; } + + bool isInClosedList(dtStatPolyRef ref) const; + + int getMemUsed() const; + + inline unsigned char* getData() const { return m_data; } + inline int getDataSize() const { return m_dataSize; } + inline const dtStatNavMeshHeader* getHeader() const { return m_header; } + inline const dtStatBVNode* getBvTreeNodes() const { return m_header ? m_header->bvtree : 0; } + inline int getBvTreeNodeCount() const { return m_header ? m_header->nnodes : 0; } + +private: + + // Copies the locations of vertices of a polygon to an array. + int getPolyVerts(dtStatPolyRef ref, float* verts) const; + // Returns portal points between two polygons. + bool getPortalPoints(dtStatPolyRef from, dtStatPolyRef to, float* left, float* right) const; + // Returns edge mid point between two polygons. + bool getEdgeMidPoint(dtStatPolyRef from, dtStatPolyRef to, float* mid) const; + + unsigned char* m_data; + int m_dataSize; + + dtStatNavMeshHeader* m_header; + + class dtNodePool* m_nodePool; + class dtNodeQueue* m_openList; +}; + +#endif // DETOURSTATNAVMESH_H diff --git a/extern/recastnavigation/Detour/Include/DetourStatNavMeshBuilder.h b/extern/recastnavigation/Detour/Include/DetourStatNavMeshBuilder.h new file mode 100644 index 00000000000..3b8f7519b2f --- /dev/null +++ b/extern/recastnavigation/Detour/Include/DetourStatNavMeshBuilder.h @@ -0,0 +1,29 @@ +// +// Copyright (c) 2009 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#ifndef DETOURSTATNAVMESHBUILDER_H +#define DETOURSTATNAVMESHBUILDER_H + +bool dtCreateNavMeshData(const unsigned short* verts, const int nverts, + const unsigned short* polys, const int npolys, const int nvp, + const float* bmin, const float* bmax, float cs, float ch, + const unsigned short* dmeshes, const float* dverts, const int ndverts, + const unsigned char* dtris, const int ndtris, + unsigned char** outData, int* outDataSize); + +#endif // DETOURSTATNAVMESHBUILDER_H \ No newline at end of file diff --git a/extern/recastnavigation/Detour/Include/DetourTileNavMesh.h b/extern/recastnavigation/Detour/Include/DetourTileNavMesh.h new file mode 100644 index 00000000000..d615b1748f0 --- /dev/null +++ b/extern/recastnavigation/Detour/Include/DetourTileNavMesh.h @@ -0,0 +1,315 @@ +// +// Copyright (c) 2009 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#ifndef DETOURTILENAVMESH_H +#define DETOURTILENAVMESH_H + +// Reference to navigation polygon. +typedef unsigned int dtTilePolyRef; + +// The bits used in the poly ref. +static const int DT_TILE_REF_SALT_BITS = 12; +static const int DT_TILE_REF_TILE_BITS = 12; +static const int DT_TILE_REF_POLY_BITS = 8; +static const int DT_TILE_REF_SALT_MASK = (1<> (DT_TILE_REF_POLY_BITS+DT_TILE_REF_TILE_BITS)) & DT_TILE_REF_SALT_MASK; + it = ((ref >> DT_TILE_REF_POLY_BITS) & DT_TILE_REF_TILE_MASK) - 1; + ip = ref & DT_TILE_REF_POLY_MASK; +} + +static const int DT_TILE_LOOKUP_SIZE = DT_MAX_TILES/4; + +class dtTiledNavMesh +{ +public: + dtTiledNavMesh(); + ~dtTiledNavMesh(); + + // Initializes the nav mesh. + // Params: + // orig - (in) origin of the nav mesh tile space. + // tileSiz - (in) size of a tile. + // portalheight - (in) height of the portal region between tiles. + // Returns: True if succeed, else false. + bool init(const float* orig, float tileSize, float portalHeight); + + // Adds new tile into the navmesh. + // The add will fail if the data is in wrong format, + // there is not enough tiles left, or if there is a tile already at the location. + // Params: + // x,y - (in) Location of the new tile. + // data - (in) Data of the new tile mesh. + // dataSize - (in) Data size of the new tile mesh. + // ownsData - (in) Flag indicating if the navmesh should own and delete the data. + // Returns: True if tile was added, else false. + bool addTileAt(int x, int y, unsigned char* data, int dataSize, bool ownsData); + + // Removes tile at specified location. + // Params: + // x,y - (in) Location of the tile to remove. + // data - (out) Data associated with deleted tile. + // dataSize - (out) Size of the data associated with deleted tile. + // Returns: True if remove suceed, else false. + bool removeTileAt(int x, int y, unsigned char** data, int* dataSize); + + // Returns pointer to tile at specified location. + // Params: + // x,y - (in) Location of the tile to get. + // Returns: pointer to tile if tile exists or 0 tile does not exists. + dtTile* getTileAt(int x, int y); + + // Returns pointer to tile in the tile array. + // Params: + // i - (in) Index to the tile to retrieve, must be in range [0,DT_MAX_TILES[ + // Returns: Pointer to specified tile. + dtTile* getTile(int i); + const dtTile* getTile(int i) const; + + // Finds the nearest navigation polygon around the center location. + // Params: + // center - (in) The center of the search box. + // extents - (in) The extents of the search box. + // Returns: Reference identifier for the polygon, or 0 if no polygons found. + dtTilePolyRef findNearestPoly(const float* center, const float* extents); + + // Returns polygons which touch the query box. + // Params: + // center - (in) the center of the search box. + // extents - (in) the extents of the search box. + // polys - (out) array holding the search result. + // maxPolys - (in) The max number of polygons the polys array can hold. + // Returns: Number of polygons in search result array. + int queryPolygons(const float* center, const float* extents, + dtTilePolyRef* polys, const int maxPolys); + + // Finds path from start polygon to end polygon. + // If target polygon canno be reached through the navigation graph, + // the last node on the array is nearest node to the end polygon. + // Params: + // startRef - (in) ref to path start polygon. + // endRef - (in) ref to path end polygon. + // path - (out) array holding the search result. + // maxPathSize - (in) The max number of polygons the path array can hold. + // Returns: Number of polygons in search result array. + int findPath(dtTilePolyRef startRef, dtTilePolyRef endRef, + const float* startPos, const float* endPos, + dtTilePolyRef* path, const int maxPathSize); + + // Finds a straight path from start to end locations within the corridor + // described by the path polygons. + // Start and end locations will be clamped on the corridor. + // Params: + // startPos - (in) Path start location. + // endPos - (in) Path end location. + // path - (in) Array of connected polygons describing the corridor. + // pathSize - (in) Number of polygons in path array. + // straightPath - (out) Points describing the straight path. + // maxStraightPathSize - (in) The max number of points the straight path array can hold. + // Returns: Number of points in the path. + int findStraightPath(const float* startPos, const float* endPos, + const dtTilePolyRef* path, const int pathSize, + float* straightPath, const int maxStraightPathSize); + + // Finds intersection againts walls starting from start pos. + // Params: + // startRef - (in) ref to the polygon where the start lies. + // startPos - (in) start position of the query. + // endPos - (in) end position of the query. + // t - (out) hit parameter along the segment, 0 if no hit. + // endRef - (out) ref to the last polygon which was processed. + // Returns: Number of polygons in path or 0 if failed. + int raycast(dtTilePolyRef startRef, const float* startPos, const float* endPos, + float& t, dtTilePolyRef* path, const int pathSize); + + // Returns distance to nearest wall from the specified location. + // Params: + // centerRef - (in) ref to the polygon where the center lies. + // centerPos - (in) center if the query circle. + // maxRadius - (in) max search radius. + // hitPos - (out) location of the nearest hit. + // hitNormal - (out) normal of the nearest hit. + // Returns: Distance to nearest wall from the test location. + float findDistanceToWall(dtTilePolyRef centerRef, const float* centerPos, float maxRadius, + float* hitPos, float* hitNormal); + + // Finds polygons found along the navigation graph which touch the specified circle. + // Params: + // centerRef - (in) ref to the polygon where the center lies. + // centerPos - (in) center if the query circle + // radius - (in) radius of the query circle + // resultRef - (out, opt) refs to the polygons touched by the circle. + // resultParent - (out, opt) parent of each result polygon. + // resultCost - (out, opt) search cost at each result polygon. + // maxResult - (int) maximum capacity of search results. + // Returns: Number of results. + int findPolysAround(dtTilePolyRef centerRef, const float* centerPos, float radius, + dtTilePolyRef* resultRef, dtTilePolyRef* resultParent, float* resultCost, + const int maxResult); + + // Returns closest point on navigation polygon. + // Params: + // ref - (in) ref to the polygon. + // pos - (in) the point to check. + // closest - (out) closest point. + // Returns: true if closest point found. + bool closestPointToPoly(dtTilePolyRef ref, const float* pos, float* closest) const; + + // Returns height of the polygon at specified location. + // Params: + // ref - (in) ref to the polygon. + // pos - (in) the point where to locate the height. + // height - (out) height at the location. + // Returns: true if over polygon. + bool getPolyHeight(dtTilePolyRef ref, const float* pos, float* height) const; + + // Returns pointer to a polygon based on ref. + const dtTilePoly* getPolyByRef(dtTilePolyRef ref) const; + + // Returns pointer to a polygon vertices based on ref. + const float* getPolyVertsByRef(dtTilePolyRef ref) const; + + // Returns pointer to a polygon link based on ref. + const dtTileLink* getPolyLinksByRef(dtTilePolyRef ref) const; + +private: + + // Returns base id for the tile. + dtTilePolyRef getTileId(dtTile* tile); + // Returns neighbour tile based on side. + dtTile* getNeighbourTileAt(int x, int y, int side); + // Returns all polygons in neighbour tile based on portal defined by the segment. + int findConnectingPolys(const float* va, const float* vb, + dtTile* tile, int side, + dtTilePolyRef* con, float* conarea, int maxcon); + // Builds internal polygons links for a tile. + void buildIntLinks(dtTile* tile); + // Builds external polygon links for a tile. + void buildExtLinks(dtTile* tile, dtTile* target, int side); + // Removes external links at specified side. + void removeExtLinks(dtTile* tile, int side); + // Queries polygons within a tile. + int queryTilePolygons(dtTile* tile, const float* qmin, const float* qmax, + dtTilePolyRef* polys, const int maxPolys); + + float getCost(dtTilePolyRef prev, dtTilePolyRef from, dtTilePolyRef to) const; + float getFirstCost(const float* pos, dtTilePolyRef from, dtTilePolyRef to) const; + float getLastCost(dtTilePolyRef from, dtTilePolyRef to, const float* pos) const; + float getHeuristic(const float* from, const float* to) const; + + // Returns portal points between two polygons. + bool getPortalPoints(dtTilePolyRef from, dtTilePolyRef to, float* left, float* right) const; + // Returns edge mid point between two polygons. + bool getEdgeMidPoint(dtTilePolyRef from, dtTilePolyRef to, float* mid) const; + + float m_orig[3]; + float m_tileSize; + float m_portalHeight; + + dtTile* m_posLookup[DT_TILE_LOOKUP_SIZE]; + dtTile* m_nextFree; + dtTile m_tiles[DT_MAX_TILES]; + + dtTileLink* m_tmpLinks; + int m_ntmpLinks; + + class dtNodePool* m_nodePool; + class dtNodeQueue* m_openList; +}; + +#endif // DETOURTILENAVMESH_H diff --git a/extern/recastnavigation/Detour/Include/DetourTileNavMeshBuilder.h b/extern/recastnavigation/Detour/Include/DetourTileNavMeshBuilder.h new file mode 100644 index 00000000000..643dec1edb1 --- /dev/null +++ b/extern/recastnavigation/Detour/Include/DetourTileNavMeshBuilder.h @@ -0,0 +1,29 @@ +// +// Copyright (c) 2009 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#ifndef DETOURTILEDNAVMESHBUILDER_H +#define DETOURTILEDNAVMESHBUILDER_H + +bool dtCreateNavMeshTileData(const unsigned short* verts, const int nverts, + const unsigned short* polys, const int npolys, const int nvp, + const unsigned short* dmeshes, const float* dverts, const int ndverts, + const unsigned char* dtris, const int ndtris, + const float* bmin, const float* bmax, float cs, float ch, int tileSize, int walkableClimb, + unsigned char** outData, int* outDataSize); + +#endif // DETOURTILEDNAVMESHBUILDER_H \ No newline at end of file diff --git a/extern/recastnavigation/Detour/Source/DetourCommon.cpp b/extern/recastnavigation/Detour/Source/DetourCommon.cpp new file mode 100644 index 00000000000..e55ce5e6351 --- /dev/null +++ b/extern/recastnavigation/Detour/Source/DetourCommon.cpp @@ -0,0 +1,244 @@ +// +// Copyright (c) 2009 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#include +#include "DetourCommon.h" + +void closestPtPointTriangle(float* closest, const float* p, + const float* a, const float* b, const float* c) +{ + // Check if P in vertex region outside A + float ab[3], ac[3], ap[3]; + vsub(ab, b, a); + vsub(ac, c, a); + vsub(ap, p, a); + float d1 = vdot(ab, ap); + float d2 = vdot(ac, ap); + if (d1 <= 0.0f && d2 <= 0.0f) + { + // barycentric coordinates (1,0,0) + vcopy(closest, a); + return; + } + + // Check if P in vertex region outside B + float bp[3]; + vsub(bp, p, b); + float d3 = vdot(ab, bp); + float d4 = vdot(ac, bp); + if (d3 >= 0.0f && d4 <= d3) + { + // barycentric coordinates (0,1,0) + vcopy(closest, b); + return; + } + + // Check if P in edge region of AB, if so return projection of P onto AB + float vc = d1*d4 - d3*d2; + if (vc <= 0.0f && d1 >= 0.0f && d3 <= 0.0f) + { + // barycentric coordinates (1-v,v,0) + float v = d1 / (d1 - d3); + closest[0] = a[0] + v * ab[0]; + closest[1] = a[1] + v * ab[1]; + closest[2] = a[2] + v * ab[2]; + return; + } + + // Check if P in vertex region outside C + float cp[3]; + vsub(cp, p, c); + float d5 = vdot(ab, cp); + float d6 = vdot(ac, cp); + if (d6 >= 0.0f && d5 <= d6) + { + // barycentric coordinates (0,0,1) + vcopy(closest, c); + return; + } + + // Check if P in edge region of AC, if so return projection of P onto AC + float vb = d5*d2 - d1*d6; + if (vb <= 0.0f && d2 >= 0.0f && d6 <= 0.0f) + { + // barycentric coordinates (1-w,0,w) + float w = d2 / (d2 - d6); + closest[0] = a[0] + w * ac[0]; + closest[1] = a[1] + w * ac[1]; + closest[2] = a[2] + w * ac[2]; + return; + } + + // Check if P in edge region of BC, if so return projection of P onto BC + float va = d3*d6 - d5*d4; + if (va <= 0.0f && (d4 - d3) >= 0.0f && (d5 - d6) >= 0.0f) + { + // barycentric coordinates (0,1-w,w) + float w = (d4 - d3) / ((d4 - d3) + (d5 - d6)); + closest[0] = b[0] + w * (c[0] - b[0]); + closest[1] = b[1] + w * (c[1] - b[1]); + closest[2] = b[2] + w * (c[2] - b[2]); + return; + } + + // P inside face region. Compute Q through its barycentric coordinates (u,v,w) + float denom = 1.0f / (va + vb + vc); + float v = vb * denom; + float w = vc * denom; + closest[0] = a[0] + ab[0] * v + ac[0] * w; + closest[1] = a[1] + ab[1] * v + ac[1] * w; + closest[2] = a[2] + ab[2] * v + ac[2] * w; +} + +bool intersectSegmentPoly2D(const float* p0, const float* p1, + const float* verts, int nverts, + float& tmin, float& tmax, + int& segMin, int& segMax) +{ + static const float EPS = 0.00000001f; + + tmin = 0; + tmax = 1; + segMin = -1; + segMax = -1; + + float dir[3]; + vsub(dir, p1, p0); + + for (int i = 0, j = nverts-1; i < nverts; j=i++) + { + float edge[3], diff[3]; + vsub(edge, &verts[i*3], &verts[j*3]); + vsub(diff, p0, &verts[j*3]); + float n = vperp2D(edge, diff); + float d = -vperp2D(edge, dir); + if (fabs(d) < EPS) + { + // S is nearly parallel to this edge + if (n < 0) + return false; + else + continue; + } + float t = n / d; + if (d < 0) + { + // segment S is entering across this edge + if (t > tmin) + { + tmin = t; + segMin = j; + // S enters after leaving polygon + if (tmin > tmax) + return false; + } + } + else + { + // segment S is leaving across this edge + if (t < tmax) + { + tmax = t; + segMax = j; + // S leaves before entering polygon + if (tmax < tmin) + return false; + } + } + } + + return true; +} + +float distancePtSegSqr2D(const float* pt, const float* p, const float* q, float& t) +{ + float pqx = q[0] - p[0]; + float pqz = q[2] - p[2]; + float dx = pt[0] - p[0]; + float dz = pt[2] - p[2]; + float d = pqx*pqx + pqz*pqz; + t = pqx*dx + pqz*dz; + if (d > 0) + t /= d; + if (t < 0) + t = 0; + else if (t > 1) + t = 1; + + dx = p[0] + t*pqx - pt[0]; + dz = p[2] + t*pqz - pt[2]; + + return dx*dx + dz*dz; +} + +void calcPolyCenter(float* tc, const unsigned short* idx, int nidx, const float* verts) +{ + tc[0] = 0.0f; + tc[1] = 0.0f; + tc[2] = 0.0f; + for (int j = 0; j < nidx; ++j) + { + const float* v = &verts[idx[j]*3]; + tc[0] += v[0]; + tc[1] += v[1]; + tc[2] += v[2]; + } + const float s = 1.0f / nidx; + tc[0] *= s; + tc[1] *= s; + tc[2] *= s; +} + +inline float vdot2(const float* a, const float* b) +{ + return a[0]*b[0] + a[2]*b[2]; +} + +#include + +bool closestHeightPointTriangle(const float* p, const float* a, const float* b, const float* c, float& h) +{ + float v0[3], v1[3], v2[3]; + vsub(v0, c,a); + vsub(v1, b,a); + vsub(v2, p,a); + + const float dot00 = vdot2(v0, v0); + const float dot01 = vdot2(v0, v1); + const float dot02 = vdot2(v0, v2); + const float dot11 = vdot2(v1, v1); + const float dot12 = vdot2(v1, v2); + + // Compute barycentric coordinates + float invDenom = 1.0f / (dot00 * dot11 - dot01 * dot01); + float u = (dot11 * dot02 - dot01 * dot12) * invDenom; + float v = (dot00 * dot12 - dot01 * dot02) * invDenom; + + // The (sloppy) epsilon is needed to allow to get height of points which + // are interpolated along the edges of the triangles. + static const float EPS = 1e-4f; + + // If point lies inside the triangle, return interpolated ycoord. + if (u >= -EPS && v >= -EPS && (u+v) <= 1+EPS) + { + h = a[1] + v0[1]*u + v1[1]*v; + return true; + } + + return false; +} diff --git a/extern/recastnavigation/Detour/Source/DetourDebugDraw.cpp b/extern/recastnavigation/Detour/Source/DetourDebugDraw.cpp new file mode 100644 index 00000000000..25f32f12481 --- /dev/null +++ b/extern/recastnavigation/Detour/Source/DetourDebugDraw.cpp @@ -0,0 +1,496 @@ +// +// Copyright (c) 2009 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#include "DetourDebugDraw.h" +#include "DetourStatNavMesh.h" +#include "SDL.h" +#include "SDL_Opengl.h" + +void dtDebugDrawStatNavMeshPoly(const dtStatNavMesh* mesh, dtStatPolyRef ref, const float* col) +{ + int idx = mesh->getPolyIndexByRef(ref); + if (idx == -1) return; + + glColor4f(col[0],col[1],col[2],0.25f); + + if (mesh->getPolyDetailCount()) + { + const dtStatPoly* p = mesh->getPoly(idx); + const dtStatPolyDetail* pd = mesh->getPolyDetail(idx); + glBegin(GL_TRIANGLES); + for (int j = 0; j < pd->ntris; ++j) + { + const unsigned char* t = mesh->getDetailTri(pd->tbase+j); + for (int k = 0; k < 3; ++k) + { + if (t[k] < p->nv) + glVertex3fv(mesh->getVertex(p->v[t[k]])); + else + glVertex3fv(mesh->getDetailVertex(pd->vbase+(t[k]-p->nv))); + } + } + glEnd(); + } + else + { + const dtStatPoly* p = mesh->getPoly(idx); + glBegin(GL_TRIANGLES); + unsigned short vi[3]; + for (int j = 2; j < (int)p->nv; ++j) + { + vi[0] = p->v[0]; + vi[1] = p->v[j-1]; + vi[2] = p->v[j]; + for (int k = 0; k < 3; ++k) + { + const float* v = mesh->getVertex(vi[k]); + glVertex3f(v[0], v[1]+0.2f, v[2]); + } + } + glEnd(); + } +} + +static void drawBoxWire(float minx, float miny, float minz, float maxx, float maxy, float maxz, const float* col) +{ + glColor4fv(col); + + // Top + glVertex3f(minx, miny, minz); + glVertex3f(maxx, miny, minz); + glVertex3f(maxx, miny, minz); + glVertex3f(maxx, miny, maxz); + glVertex3f(maxx, miny, maxz); + glVertex3f(minx, miny, maxz); + glVertex3f(minx, miny, maxz); + glVertex3f(minx, miny, minz); + + // bottom + glVertex3f(minx, maxy, minz); + glVertex3f(maxx, maxy, minz); + glVertex3f(maxx, maxy, minz); + glVertex3f(maxx, maxy, maxz); + glVertex3f(maxx, maxy, maxz); + glVertex3f(minx, maxy, maxz); + glVertex3f(minx, maxy, maxz); + glVertex3f(minx, maxy, minz); + + // Sides + glVertex3f(minx, miny, minz); + glVertex3f(minx, maxy, minz); + glVertex3f(maxx, miny, minz); + glVertex3f(maxx, maxy, minz); + glVertex3f(maxx, miny, maxz); + glVertex3f(maxx, maxy, maxz); + glVertex3f(minx, miny, maxz); + glVertex3f(minx, maxy, maxz); +} + +void dtDebugDrawStatNavMeshBVTree(const dtStatNavMesh* mesh) +{ + const float col[] = { 1,1,1,0.5f }; + const dtStatNavMeshHeader* hdr = mesh->getHeader(); + + const dtStatBVNode* nodes = mesh->getBvTreeNodes(); + int nnodes = mesh->getBvTreeNodeCount(); + + glBegin(GL_LINES); + + for (int i = 0; i < nnodes; ++i) + { + const dtStatBVNode* n = &nodes[i]; + if (n->i < 0) // Leaf indices are positive. + continue; + drawBoxWire(hdr->bmin[0] + n->bmin[0]*hdr->cs, + hdr->bmin[1] + n->bmin[1]*hdr->cs, + hdr->bmin[2] + n->bmin[2]*hdr->cs, + hdr->bmin[0] + n->bmax[0]*hdr->cs, + hdr->bmin[1] + n->bmax[1]*hdr->cs, + hdr->bmin[2] + n->bmax[2]*hdr->cs, col); + } + glEnd(); +} + + +static float distancePtLine2d(const float* pt, const float* p, const float* q) +{ + float pqx = q[0] - p[0]; + float pqz = q[2] - p[2]; + float dx = pt[0] - p[0]; + float dz = pt[2] - p[2]; + float d = pqx*pqx + pqz*pqz; + float t = pqx*dx + pqz*dz; + if (d != 0) t /= d; + dx = p[0] + t*pqx - pt[0]; + dz = p[2] + t*pqz - pt[2]; + return dx*dx + dz*dz; +} + +static void drawStatMeshPolyBoundaries(const dtStatNavMesh* mesh, bool inner) +{ + static const float thr = 0.01f*0.01f; + + glBegin(GL_LINES); + for (int i = 0; i < mesh->getPolyCount(); ++i) + { + const dtStatPoly* p = mesh->getPoly(i); + const dtStatPolyDetail* pd = mesh->getPolyDetail(i); + + for (int j = 0, nj = (int)p->nv; j < nj; ++j) + { + if (inner) + { + // Skip non-connected edges. + if (p->n[j] == 0) continue; + } + else + { + // Skip connected edges. + if (p->n[j] != 0) continue; + } + + const float* v0 = mesh->getVertex(p->v[j]); + const float* v1 = mesh->getVertex(p->v[(j+1) % nj]); + + // Draw detail mesh edges which align with the actual poly edge. + // This is really slow. + for (int k = 0; k < pd->ntris; ++k) + { + const unsigned char* t = mesh->getDetailTri(pd->tbase+k); + const float* tv[3]; + for (int m = 0; m < 3; ++m) + { + if (t[m] < p->nv) + tv[m] = mesh->getVertex(p->v[t[m]]); + else + tv[m] = mesh->getDetailVertex(pd->vbase+(t[m]-p->nv)); + } + for (int m = 0, n = 2; m < 3; n=m++) + { + if (((t[3] >> (n*2)) & 0x3) == 0) continue; // Skip inner edges. + if (distancePtLine2d(tv[n],v0,v1) < thr && + distancePtLine2d(tv[m],v0,v1) < thr) + { + glVertex3fv(tv[n]); + glVertex3fv(tv[m]); + } + } + } + } + } + glEnd(); +} + +void dtDebugDrawStatNavMesh(const dtStatNavMesh* mesh, bool drawClosedList) +{ + glBegin(GL_TRIANGLES); + for (int i = 0; i < mesh->getPolyDetailCount(); ++i) + { + const dtStatPoly* p = mesh->getPoly(i); + const dtStatPolyDetail* pd = mesh->getPolyDetail(i); + + if (drawClosedList && mesh->isInClosedList(i+1)) + glColor4ub(255,196,0,64); + else + glColor4ub(0,196,255,64); + + for (int j = 0; j < pd->ntris; ++j) + { + const unsigned char* t = mesh->getDetailTri(pd->tbase+j); + for (int k = 0; k < 3; ++k) + { + if (t[k] < p->nv) + glVertex3fv(mesh->getVertex(p->v[t[k]])); + else + glVertex3fv(mesh->getDetailVertex(pd->vbase+(t[k]-p->nv))); + } + } + } + glEnd(); + + // Draw inter poly boundaries + glColor4ub(0,48,64,32); + glLineWidth(1.5f); + drawStatMeshPolyBoundaries(mesh, true); + + // Draw outer poly boundaries + glLineWidth(2.5f); + glColor4ub(0,48,64,220); + drawStatMeshPolyBoundaries(mesh, false); + + glLineWidth(1.0f); + + glPointSize(3.0f); + glColor4ub(0,0,0,196); + glBegin(GL_POINTS); + for (int i = 0; i < mesh->getVertexCount(); ++i) + { + const float* v = mesh->getVertex(i); + glVertex3f(v[0], v[1], v[2]); + } + glEnd(); + glPointSize(1.0f); +} + + +static void drawTilePolyBoundaries(const dtTileHeader* header, bool inner) +{ + static const float thr = 0.01f*0.01f; + + glBegin(GL_LINES); + for (int i = 0; i < header->npolys; ++i) + { + const dtTilePoly* p = &header->polys[i]; + const dtTilePolyDetail* pd = &header->dmeshes[i]; + + for (int j = 0, nj = (int)p->nv; j < nj; ++j) + { + if (inner) + { + if (p->n[j] == 0) continue; + if (p->n[j] & 0x8000) + { + bool con = false; + for (int k = 0; k < p->nlinks; ++k) + { + if (header->links[p->links+k].e == j) + { + con = true; + break; + } + } + if (con) + glColor4ub(255,255,255,128); + else + glColor4ub(0,0,0,128); + } + else + glColor4ub(0,48,64,32); + } + else + { + if (p->n[j] != 0) continue; + } + + const float* v0 = &header->verts[p->v[j]*3]; + const float* v1 = &header->verts[p->v[(j+1)%nj]*3]; + + // Draw detail mesh edges which align with the actual poly edge. + // This is really slow. + for (int k = 0; k < pd->ntris; ++k) + { + const unsigned char* t = &header->dtris[(pd->tbase+k)*4]; + const float* tv[3]; + for (int m = 0; m < 3; ++m) + { + if (t[m] < p->nv) + tv[m] = &header->verts[p->v[t[m]]*3]; + else + tv[m] = &header->dverts[(pd->vbase+(t[m]-p->nv))*3]; + } + for (int m = 0, n = 2; m < 3; n=m++) + { + if (((t[3] >> (n*2)) & 0x3) == 0) continue; // Skip inner detail edges. + if (distancePtLine2d(tv[n],v0,v1) < thr && + distancePtLine2d(tv[m],v0,v1) < thr) + { + glVertex3fv(tv[n]); + glVertex3fv(tv[m]); + } + } + } + } + } + glEnd(); +} + +static void drawTile(const dtTileHeader* header) +{ + glBegin(GL_TRIANGLES); + for (int i = 0; i < header->npolys; ++i) + { + const dtTilePoly* p = &header->polys[i]; + const dtTilePolyDetail* pd = &header->dmeshes[i]; + + glColor4ub(0,196,255,64); + + for (int j = 0; j < pd->ntris; ++j) + { + const unsigned char* t = &header->dtris[(pd->tbase+j)*4]; + for (int k = 0; k < 3; ++k) + { + if (t[k] < p->nv) + glVertex3fv(&header->verts[p->v[t[k]]*3]); + else + glVertex3fv(&header->dverts[(pd->vbase+t[k]-p->nv)*3]); + } + } + } + glEnd(); + + // Draw inter poly boundaries + glColor4ub(0,48,64,32); + glLineWidth(1.5f); + + drawTilePolyBoundaries(header, true); + + // Draw outer poly boundaries + glLineWidth(2.5f); + glColor4ub(0,48,64,220); + + drawTilePolyBoundaries(header, false); + + glLineWidth(1.0f); + + glPointSize(3.0f); + glColor4ub(0,0,0,196); + glBegin(GL_POINTS); + for (int i = 0; i < header->nverts; ++i) + { + const float* v = &header->verts[i*3]; + glVertex3f(v[0], v[1], v[2]); + } + glEnd(); + glPointSize(1.0f); + + // Draw portals +/* glBegin(GL_LINES); + + for (int i = 0; i < header->nportals[0]; ++i) + { + const dtTilePortal* p = &header->portals[0][i]; + if (p->ncon) + glColor4ub(255,255,255,192); + else + glColor4ub(255,0,0,64); + glVertex3f(header->bmax[0]-0.1f, p->bmin[1], p->bmin[0]); + glVertex3f(header->bmax[0]-0.1f, p->bmax[1], p->bmin[0]); + + glVertex3f(header->bmax[0]-0.1f, p->bmax[1], p->bmin[0]); + glVertex3f(header->bmax[0]-0.1f, p->bmax[1], p->bmax[0]); + + glVertex3f(header->bmax[0]-0.1f, p->bmax[1], p->bmax[0]); + glVertex3f(header->bmax[0]-0.1f, p->bmin[1], p->bmax[0]); + + glVertex3f(header->bmax[0]-0.1f, p->bmin[1], p->bmax[0]); + glVertex3f(header->bmax[0]-0.1f, p->bmin[1], p->bmin[0]); + } + for (int i = 0; i < header->nportals[1]; ++i) + { + const dtTilePortal* p = &header->portals[1][i]; + if (p->ncon) + glColor4ub(255,255,255,192); + else + glColor4ub(255,0,0,64); + glVertex3f(p->bmin[0], p->bmin[1], header->bmax[2]-0.1f); + glVertex3f(p->bmin[0], p->bmax[1], header->bmax[2]-0.1f); + + glVertex3f(p->bmin[0], p->bmax[1], header->bmax[2]-0.1f); + glVertex3f(p->bmax[0], p->bmax[1], header->bmax[2]-0.1f); + + glVertex3f(p->bmax[0], p->bmax[1], header->bmax[2]-0.1f); + glVertex3f(p->bmax[0], p->bmin[1], header->bmax[2]-0.1f); + + glVertex3f(p->bmax[0], p->bmin[1], header->bmax[2]-0.1f); + glVertex3f(p->bmin[0], p->bmin[1], header->bmax[2]-0.1f); + } + for (int i = 0; i < header->nportals[2]; ++i) + { + const dtTilePortal* p = &header->portals[2][i]; + if (p->ncon) + glColor4ub(255,255,255,192); + else + glColor4ub(255,0,0,64); + glVertex3f(header->bmin[0]+0.1f, p->bmin[1], p->bmin[0]); + glVertex3f(header->bmin[0]+0.1f, p->bmax[1], p->bmin[0]); + + glVertex3f(header->bmin[0]+0.1f, p->bmax[1], p->bmin[0]); + glVertex3f(header->bmin[0]+0.1f, p->bmax[1], p->bmax[0]); + + glVertex3f(header->bmin[0]+0.1f, p->bmax[1], p->bmax[0]); + glVertex3f(header->bmin[0]+0.1f, p->bmin[1], p->bmax[0]); + + glVertex3f(header->bmin[0]+0.1f, p->bmin[1], p->bmax[0]); + glVertex3f(header->bmin[0]+0.1f, p->bmin[1], p->bmin[0]); + } + for (int i = 0; i < header->nportals[3]; ++i) + { + const dtTilePortal* p = &header->portals[3][i]; + if (p->ncon) + glColor4ub(255,255,255,192); + else + glColor4ub(255,0,0,64); + glVertex3f(p->bmin[0], p->bmin[1], header->bmin[2]+0.1f); + glVertex3f(p->bmin[0], p->bmax[1], header->bmin[2]+0.1f); + + glVertex3f(p->bmin[0], p->bmax[1], header->bmin[2]+0.1f); + glVertex3f(p->bmax[0], p->bmax[1], header->bmin[2]+0.1f); + + glVertex3f(p->bmax[0], p->bmax[1], header->bmin[2]+0.1f); + glVertex3f(p->bmax[0], p->bmin[1], header->bmin[2]+0.1f); + + glVertex3f(p->bmax[0], p->bmin[1], header->bmin[2]+0.1f); + glVertex3f(p->bmin[0], p->bmin[1], header->bmin[2]+0.1f); + } + glEnd();*/ +} + +void dtDebugDrawTiledNavMesh(const dtTiledNavMesh* mesh) +{ + if (!mesh) return; + + for (int i = 0; i < DT_MAX_TILES; ++i) + { + const dtTile* tile = mesh->getTile(i); + if (!tile->header) continue; + + drawTile(tile->header); + } +} + +void dtDebugDrawTiledNavMeshPoly(const dtTiledNavMesh* mesh, dtTilePolyRef ref, const float* col) +{ + unsigned int salt, it, ip; + dtDecodeTileId(ref, salt, it, ip); + if (it >= DT_MAX_TILES) return; + const dtTile* tile = mesh->getTile(it); + if (tile->salt != salt || tile->header == 0) return; + const dtTileHeader* header = tile->header; + + if (ip >= (unsigned int)header->npolys) return; + + glColor4f(col[0],col[1],col[2],0.25f); + + const dtTilePoly* p = &header->polys[ip]; + const dtTilePolyDetail* pd = &header->dmeshes[ip]; + + glBegin(GL_TRIANGLES); + for (int i = 0; i < pd->ntris; ++i) + { + const unsigned char* t = &header->dtris[(pd->tbase+i)*4]; + for (int j = 0; j < 3; ++j) + { + if (t[j] < p->nv) + glVertex3fv(&header->verts[p->v[t[j]]*3]); + else + glVertex3fv(&header->dverts[(pd->vbase+t[j]-p->nv)*3]); + } + } + glEnd(); +} + diff --git a/extern/recastnavigation/Detour/Source/DetourNode.cpp b/extern/recastnavigation/Detour/Source/DetourNode.cpp new file mode 100644 index 00000000000..1a2305fcede --- /dev/null +++ b/extern/recastnavigation/Detour/Source/DetourNode.cpp @@ -0,0 +1,140 @@ +// +// Copyright (c) 2009 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#include "DetourNode.h" +#include + +////////////////////////////////////////////////////////////////////////////////////////// +dtNodePool::dtNodePool(int maxNodes, int hashSize) : + + m_nodes(0), + m_first(0), + m_next(0), + m_maxNodes(maxNodes), + m_hashSize(hashSize), + m_nodeCount(0) +{ + m_nodes = new dtNode[m_maxNodes]; + m_next = new unsigned short[m_maxNodes]; + m_first = new unsigned short[hashSize]; + memset(m_first, 0xff, sizeof(unsigned short)*m_hashSize); + memset(m_next, 0xff, sizeof(unsigned short)*m_maxNodes); +} + +dtNodePool::~dtNodePool() +{ + delete [] m_nodes; + delete [] m_next; + delete [] m_first; +} + +void dtNodePool::clear() +{ + memset(m_first, 0xff, sizeof(unsigned short)*m_hashSize); + m_nodeCount = 0; +} + +const dtNode* dtNodePool::findNode(unsigned int id) const +{ + unsigned int bucket = hashint(id) & (m_hashSize-1); + unsigned short i = m_first[bucket]; + while (i != 0xffff) + { + if (m_nodes[i].id == id) + return &m_nodes[i]; + i = m_next[i]; + } + return 0; +} + +dtNode* dtNodePool::getNode(unsigned int id) +{ + unsigned int bucket = hashint(id) & (m_hashSize-1); + unsigned short i = m_first[bucket]; + dtNode* node = 0; + while (i != 0xffff) + { + if (m_nodes[i].id == id) + return &m_nodes[i]; + i = m_next[i]; + } + + if (m_nodeCount >= m_maxNodes) + return 0; + + i = (unsigned short)m_nodeCount; + m_nodeCount++; + + // Init node + node = &m_nodes[i]; + node->pidx = 0; + node->cost = 0; + node->total = 0; + node->id = id; + node->flags = 0; + + m_next[i] = m_first[bucket]; + m_first[bucket] = i; + + return node; +} + + +////////////////////////////////////////////////////////////////////////////////////////// +dtNodeQueue::dtNodeQueue(int n) : + m_heap(0), + m_capacity(n), + m_size(0) +{ + m_heap = new dtNode*[m_capacity+1]; +} + +dtNodeQueue::~dtNodeQueue() +{ + delete [] m_heap; +} + +void dtNodeQueue::bubbleUp(int i, dtNode* node) +{ + int parent = (i-1)/2; + // note: (index > 0) means there is a parent + while ((i > 0) && (m_heap[parent]->total > node->total)) + { + m_heap[i] = m_heap[parent]; + i = parent; + parent = (i-1)/2; + } + m_heap[i] = node; +} + +void dtNodeQueue::trickleDown(int i, dtNode* node) +{ + int child = (i*2)+1; + while (child < m_size) + { + if (((child+1) < m_size) && + (m_heap[child]->total > m_heap[child+1]->total)) + { + child++; + } + m_heap[i] = m_heap[child]; + i = child; + child = (i*2)+1; + } + bubbleUp(i, node); +} diff --git a/extern/recastnavigation/Detour/Source/DetourStatNavMesh.cpp b/extern/recastnavigation/Detour/Source/DetourStatNavMesh.cpp new file mode 100644 index 00000000000..bf59cd89dda --- /dev/null +++ b/extern/recastnavigation/Detour/Source/DetourStatNavMesh.cpp @@ -0,0 +1,876 @@ +// +// Copyright (c) 2009 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#include +#include +#include +#include +#include "DetourStatNavMesh.h" +#include "DetourNode.h" +#include "DetourCommon.h" + + +////////////////////////////////////////////////////////////////////////////////////////// +dtStatNavMesh::dtStatNavMesh() : + m_data(0), + m_dataSize(0), + m_header(0), + m_nodePool(0), + m_openList(0) +{ +} + +dtStatNavMesh::~dtStatNavMesh() +{ + delete m_nodePool; + delete m_openList; + if (m_data) + delete [] m_data; +} + +bool dtStatNavMesh::init(unsigned char* data, int dataSize, bool ownsData) +{ + dtStatNavMeshHeader* header = (dtStatNavMeshHeader*)data; + + if (header->magic != DT_STAT_NAVMESH_MAGIC) + return false; + if (header->version != DT_STAT_NAVMESH_VERSION) + return false; + + const int headerSize = sizeof(dtStatNavMeshHeader); + const int vertsSize = sizeof(float)*3*header->nverts; + const int polysSize = sizeof(dtStatPoly)*header->npolys; + const int nodesSize = sizeof(dtStatBVNode)*header->npolys*2; + const int detailMeshesSize = sizeof(dtStatPolyDetail)*header->ndmeshes; + const int detailVertsSize = sizeof(float)*3*header->ndverts; + const int detailTrisSize = sizeof(unsigned char)*4*header->ndtris; + + + unsigned char* d = data + headerSize; + header->verts = (float*)d; d += vertsSize; + header->polys = (dtStatPoly*)d; d += polysSize; + header->bvtree = (dtStatBVNode*)d; d += nodesSize; + header->dmeshes = (dtStatPolyDetail*)d; d += detailMeshesSize; + header->dverts = (float*)d; d += detailVertsSize; + header->dtris = (unsigned char*)d; d += detailTrisSize; + + m_nodePool = new dtNodePool(2048, 256); + if (!m_nodePool) + return false; + + m_openList = new dtNodeQueue(2048); + if (!m_openList) + return false; + + if (ownsData) + { + m_data = data; + m_dataSize = dataSize; + } + + m_header = header; + + return true; +} + +const dtStatPoly* dtStatNavMesh::getPolyByRef(dtStatPolyRef ref) const +{ + if (!m_header || ref == 0 || (int)ref > m_header->npolys) return 0; + return &m_header->polys[ref-1]; +} + +int dtStatNavMesh::getPolyIndexByRef(dtStatPolyRef ref) const +{ + if (!m_header || ref == 0 || (int)ref > m_header->npolys) return -1; + return (int)ref-1; +} + +int dtStatNavMesh::findPath(dtStatPolyRef startRef, dtStatPolyRef endRef, + const float* startPos, const float* endPos, + dtStatPolyRef* path, const int maxPathSize) +{ + if (!m_header) return 0; + + if (!startRef || !endRef) + return 0; + + if (!maxPathSize) + return 0; + + if (startRef == endRef) + { + path[0] = startRef; + return 1; + } + + m_nodePool->clear(); + m_openList->clear(); + + static const float H_SCALE = 1.1f; // Heuristic scale. + + dtNode* startNode = m_nodePool->getNode(startRef); + startNode->pidx = 0; + startNode->cost = 0; + startNode->total = vdist(startPos, endPos) * H_SCALE; + startNode->id = startRef; + startNode->flags = DT_NODE_OPEN; + m_openList->push(startNode); + + dtNode* lastBestNode = startNode; + float lastBestNodeCost = startNode->total; + while (!m_openList->empty()) + { + dtNode* bestNode = m_openList->pop(); + + if (bestNode->id == endRef) + { + lastBestNode = bestNode; + break; + } + + const dtStatPoly* poly = getPoly(bestNode->id-1); + for (int i = 0; i < (int)poly->nv; ++i) + { + dtStatPolyRef neighbour = poly->n[i]; + if (neighbour) + { + // Skip parent node. + if (bestNode->pidx && m_nodePool->getNodeAtIdx(bestNode->pidx)->id == neighbour) + continue; + + dtNode* parent = bestNode; + dtNode newNode; + newNode.pidx = m_nodePool->getNodeIdx(parent); + newNode.id = neighbour; + + // Calculate cost. + float p0[3], p1[3]; + if (!parent->pidx) + vcopy(p0, startPos); + else + getEdgeMidPoint(m_nodePool->getNodeAtIdx(parent->pidx)->id, parent->id, p0); + getEdgeMidPoint(parent->id, newNode.id, p1); + newNode.cost = parent->cost + vdist(p0,p1); + // Special case for last node. + if (newNode.id == endRef) + newNode.cost += vdist(p1, endPos); + + // Heuristic + const float h = vdist(p1,endPos)*H_SCALE; + newNode.total = newNode.cost + h; + + dtNode* actualNode = m_nodePool->getNode(newNode.id); + if (!actualNode) + continue; + + if (!((actualNode->flags & DT_NODE_OPEN) && newNode.total > actualNode->total) && + !((actualNode->flags & DT_NODE_CLOSED) && newNode.total > actualNode->total)) + { + actualNode->flags &= ~DT_NODE_CLOSED; + actualNode->pidx = newNode.pidx; + actualNode->cost = newNode.cost; + actualNode->total = newNode.total; + + if (h < lastBestNodeCost) + { + lastBestNodeCost = h; + lastBestNode = actualNode; + } + + if (actualNode->flags & DT_NODE_OPEN) + { + m_openList->modify(actualNode); + } + else + { + actualNode->flags |= DT_NODE_OPEN; + m_openList->push(actualNode); + } + } + } + } + bestNode->flags |= DT_NODE_CLOSED; + } + + // Reverse the path. + dtNode* prev = 0; + dtNode* node = lastBestNode; + do + { + dtNode* next = m_nodePool->getNodeAtIdx(node->pidx); + node->pidx = m_nodePool->getNodeIdx(prev); + prev = node; + node = next; + } + while (node); + + // Store path + node = prev; + int n = 0; + do + { + path[n++] = node->id; + node = m_nodePool->getNodeAtIdx(node->pidx); + } + while (node && n < maxPathSize); + + return n; +} + +bool dtStatNavMesh::closestPointToPoly(dtStatPolyRef ref, const float* pos, float* closest) const +{ + int idx = getPolyIndexByRef(ref); + if (idx == -1) + return false; + + float closestDistSqr = FLT_MAX; + const dtStatPoly* p = getPoly(idx); + const dtStatPolyDetail* pd = getPolyDetail(idx); + + for (int j = 0; j < pd->ntris; ++j) + { + const unsigned char* t = getDetailTri(pd->tbase+j); + const float* v[3]; + for (int k = 0; k < 3; ++k) + { + if (t[k] < p->nv) + v[k] = getVertex(p->v[t[k]]); + else + v[k] = getDetailVertex(pd->vbase+(t[k]-p->nv)); + } + float pt[3]; + closestPtPointTriangle(pt, pos, v[0], v[1], v[2]); + float d = vdistSqr(pos, pt); + if (d < closestDistSqr) + { + vcopy(closest, pt); + closestDistSqr = d; + } + } + + return true; +} + +bool dtStatNavMesh::getPolyHeight(dtStatPolyRef ref, const float* pos, float* height) const +{ + int idx = getPolyIndexByRef(ref); + if (idx == -1) + return false; + + const dtStatPoly* p = getPoly(idx); + const dtStatPolyDetail* pd = getPolyDetail(idx); + + for (int i = 0; i < pd->ntris; ++i) + { + const unsigned char* t = getDetailTri(pd->tbase+i); + const float* v[3]; + for (int j = 0; j < 3; ++j) + { + if (t[j] < p->nv) + v[j] = getVertex(p->v[t[j]]); + else + v[j] = getDetailVertex(pd->vbase+(t[j]-p->nv)); + } + float h; + if (closestHeightPointTriangle(pos, v[0], v[1], v[2], h)) + { + if (height) + *height = h; + return true; + } + } + + return false; +} + +int dtStatNavMesh::findStraightPath(const float* startPos, const float* endPos, + const dtStatPolyRef* path, const int pathSize, + float* straightPath, const int maxStraightPathSize) +{ + if (!m_header) return 0; + + if (!maxStraightPathSize) + return 0; + + if (!path[0]) + return 0; + + int straightPathSize = 0; + + float closestStartPos[3]; + if (!closestPointToPoly(path[0], startPos, closestStartPos)) + return 0; + + // Add start point. + vcopy(&straightPath[straightPathSize*3], closestStartPos); + straightPathSize++; + if (straightPathSize >= maxStraightPathSize) + return straightPathSize; + + float closestEndPos[3]; + if (!closestPointToPoly(path[pathSize-1], endPos, closestEndPos)) + return 0; + + float portalApex[3], portalLeft[3], portalRight[3]; + + if (pathSize > 1) + { + vcopy(portalApex, closestStartPos); + vcopy(portalLeft, portalApex); + vcopy(portalRight, portalApex); + int apexIndex = 0; + int leftIndex = 0; + int rightIndex = 0; + + for (int i = 0; i < pathSize; ++i) + { + float left[3], right[3]; + if (i < pathSize-1) + { + // Next portal. + getPortalPoints(path[i], path[i+1], left, right); + } + else + { + // End of the path. + vcopy(left, closestEndPos); + vcopy(right, closestEndPos); + } + + // Right vertex. + if (vequal(portalApex, portalRight)) + { + vcopy(portalRight, right); + rightIndex = i; + } + else + { + if (triArea2D(portalApex, portalRight, right) <= 0.0f) + { + if (triArea2D(portalApex, portalLeft, right) > 0.0f) + { + vcopy(portalRight, right); + rightIndex = i; + } + else + { + vcopy(portalApex, portalLeft); + apexIndex = leftIndex; + + if (!vequal(&straightPath[(straightPathSize-1)*3], portalApex)) + { + vcopy(&straightPath[straightPathSize*3], portalApex); + straightPathSize++; + if (straightPathSize >= maxStraightPathSize) + return straightPathSize; + } + + vcopy(portalLeft, portalApex); + vcopy(portalRight, portalApex); + leftIndex = apexIndex; + rightIndex = apexIndex; + + // Restart + i = apexIndex; + + continue; + } + } + } + + // Left vertex. + if (vequal(portalApex, portalLeft)) + { + vcopy(portalLeft, left); + leftIndex = i; + } + else + { + if (triArea2D(portalApex, portalLeft, left) >= 0.0f) + { + if (triArea2D(portalApex, portalRight, left) < 0.0f) + { + vcopy(portalLeft, left); + leftIndex = i; + } + else + { + vcopy(portalApex, portalRight); + apexIndex = rightIndex; + + if (!vequal(&straightPath[(straightPathSize-1)*3], portalApex)) + { + vcopy(&straightPath[straightPathSize*3], portalApex); + straightPathSize++; + if (straightPathSize >= maxStraightPathSize) + return straightPathSize; + } + + vcopy(portalLeft, portalApex); + vcopy(portalRight, portalApex); + leftIndex = apexIndex; + rightIndex = apexIndex; + + // Restart + i = apexIndex; + + continue; + } + } + } + } + } + + // Add end point. + vcopy(&straightPath[straightPathSize*3], closestEndPos); + straightPathSize++; + + return straightPathSize; +} + +int dtStatNavMesh::getPolyVerts(dtStatPolyRef ref, float* verts) const +{ + if (!m_header) return 0; + const dtStatPoly* poly = getPolyByRef(ref); + if (!poly) return 0; + float* v = verts; + for (int i = 0; i < (int)poly->nv; ++i) + { + const float* cv = &m_header->verts[poly->v[i]*3]; + *v++ = cv[0]; + *v++ = cv[1]; + *v++ = cv[2]; + } + return (int)poly->nv; +} + +int dtStatNavMesh::raycast(dtStatPolyRef centerRef, const float* startPos, const float* endPos, + float& t, dtStatPolyRef* path, const int pathSize) +{ + if (!m_header) return 0; + if (!centerRef) return 0; + + dtStatPolyRef prevRef = centerRef; + dtStatPolyRef curRef = centerRef; + t = 0; + + float verts[DT_STAT_VERTS_PER_POLYGON*3]; + int n = 0; + + while (curRef) + { + // Cast ray against current polygon. + int nv = getPolyVerts(curRef, verts); + if (nv < 3) + { + // Hit bad polygon, report hit. + return n; + } + + float tmin, tmax; + int segMin, segMax; + if (!intersectSegmentPoly2D(startPos, endPos, verts, nv, tmin, tmax, segMin, segMax)) + { + // Could not a polygon, keep the old t and report hit. + return n; + } + // Keep track of furthest t so far. + if (tmax > t) + t = tmax; + + if (n < pathSize) + path[n++] = curRef; + + // Check the neighbour of this polygon. + const dtStatPoly* poly = getPolyByRef(curRef); + dtStatPolyRef nextRef = poly->n[segMax]; + if (!nextRef) + { + // No neighbour, we hit a wall. + return n; + } + + // No hit, advance to neighbour polygon. + prevRef = curRef; + curRef = nextRef; + } + + return n; +} + + +float dtStatNavMesh::findDistanceToWall(dtStatPolyRef centerRef, const float* centerPos, float maxRadius, + float* hitPos, float* hitNormal) +{ + if (!m_header) return 0; + if (!centerRef) return 0; + + m_nodePool->clear(); + m_openList->clear(); + + dtNode* startNode = m_nodePool->getNode(centerRef); + startNode->pidx = 0; + startNode->cost = 0; + startNode->total = 0; + startNode->id = centerRef; + startNode->flags = DT_NODE_OPEN; + m_openList->push(startNode); + + float radiusSqr = sqr(maxRadius); + + hitNormal[0] = 1; + hitNormal[1] = 0; + hitNormal[2] = 0; + + while (!m_openList->empty()) + { + dtNode* bestNode = m_openList->pop(); + const dtStatPoly* poly = getPoly(bestNode->id-1); + + // Hit test walls. + for (int i = 0, j = (int)poly->nv-1; i < (int)poly->nv; j = i++) + { + // Skip non-solid edges. + if (poly->n[j]) continue; + + // Calc distance to the edge. + const float* vj = getVertex(poly->v[j]); + const float* vi = getVertex(poly->v[i]); + float tseg; + float distSqr = distancePtSegSqr2D(centerPos, vj, vi, tseg); + + // Edge is too far, skip. + if (distSqr > radiusSqr) + continue; + + // Hit wall, update radius. + radiusSqr = distSqr; + // Calculate hit pos. + hitPos[0] = vj[0] + (vi[0] - vj[0])*tseg; + hitPos[1] = vj[1] + (vi[1] - vj[1])*tseg; + hitPos[2] = vj[2] + (vi[2] - vj[2])*tseg; + } + + // Check to see if teh circle expands to one of the neighbours and expand. + for (int i = 0, j = (int)poly->nv-1; i < (int)poly->nv; j = i++) + { + // Skip solid edges. + if (!poly->n[j]) continue; + + // Expand to neighbour if not visited yet. + dtStatPolyRef neighbour = poly->n[j]; + + // Skip parent node. + if (bestNode->pidx && m_nodePool->getNodeAtIdx(bestNode->pidx)->id == neighbour) + continue; + + // Calc distance to the edge. + const float* vj = getVertex(poly->v[j]); + const float* vi = getVertex(poly->v[i]); + float tseg; + float distSqr = distancePtSegSqr2D(centerPos, vj, vi, tseg); + + // Edge is too far, skip. + if (distSqr > radiusSqr) + continue; + + dtNode* parent = bestNode; + dtNode newNode; + newNode.pidx = m_nodePool->getNodeIdx(parent); + newNode.id = neighbour; + + // Cost + float p0[3], p1[3]; + if (!parent->pidx) + vcopy(p0, centerPos); + else + getEdgeMidPoint(m_nodePool->getNodeAtIdx(parent->pidx)->id, parent->id, p0); + getEdgeMidPoint(parent->id, newNode.id, p1); + newNode.total = parent->total + vdist(p0,p1); + + dtNode* actualNode = m_nodePool->getNode(newNode.id); + if (!actualNode) + continue; + + if (!((actualNode->flags & DT_NODE_OPEN) && newNode.total > actualNode->total) && + !((actualNode->flags & DT_NODE_CLOSED) && newNode.total > actualNode->total)) + { + actualNode->flags &= ~DT_NODE_CLOSED; + actualNode->pidx = newNode.pidx; + actualNode->total = newNode.total; + + if (actualNode->flags & DT_NODE_OPEN) + { + m_openList->modify(actualNode); + } + else + { + actualNode->flags |= DT_NODE_OPEN; + m_openList->push(actualNode); + } + } + } + bestNode->flags |= DT_NODE_CLOSED; + } + + // Calc hit normal. + vsub(hitNormal, centerPos, hitPos); + vnormalize(hitNormal); + + return sqrtf(radiusSqr); +} + +int dtStatNavMesh::findPolysAround(dtStatPolyRef centerRef, const float* centerPos, float radius, + dtStatPolyRef* resultRef, dtStatPolyRef* resultParent, float* resultCost, + const int maxResult) +{ + if (!m_header) return 0; + if (!centerRef) return 0; + + m_nodePool->clear(); + m_openList->clear(); + + dtNode* startNode = m_nodePool->getNode(centerRef); + startNode->pidx = 0; + startNode->cost = 0; + startNode->total = 0; + startNode->id = centerRef; + startNode->flags = DT_NODE_OPEN; + m_openList->push(startNode); + + int n = 0; + if (n < maxResult) + { + if (resultRef) + resultRef[n] = startNode->id; + if (resultParent) + resultParent[n] = 0; + if (resultCost) + resultCost[n] = 0; + ++n; + } + + const float radiusSqr = sqr(radius); + + while (!m_openList->empty()) + { + dtNode* bestNode = m_openList->pop(); + const dtStatPoly* poly = getPoly(bestNode->id-1); + for (unsigned i = 0, j = (int)poly->nv-1; i < (int)poly->nv; j=i++) + { + dtStatPolyRef neighbour = poly->n[j]; + + if (neighbour) + { + // Skip parent node. + if (bestNode->pidx && m_nodePool->getNodeAtIdx(bestNode->pidx)->id == neighbour) + continue; + + // Calc distance to the edge. + const float* vj = getVertex(poly->v[j]); + const float* vi = getVertex(poly->v[i]); + float tseg; + float distSqr = distancePtSegSqr2D(centerPos, vj, vi, tseg); + + // If the circle is not touching the next polygon, skip it. + if (distSqr > radiusSqr) + continue; + + dtNode* parent = bestNode; + dtNode newNode; + newNode.pidx = m_nodePool->getNodeIdx(parent); + newNode.id = neighbour; + + // Cost + float p0[3], p1[3]; + if (!parent->pidx) + vcopy(p0, centerPos); + else + getEdgeMidPoint(m_nodePool->getNodeAtIdx(parent->pidx)->id, parent->id, p0); + getEdgeMidPoint(parent->id, newNode.id, p1); + newNode.total = parent->total + vdist(p0,p1); + + dtNode* actualNode = m_nodePool->getNode(newNode.id); + if (!actualNode) + continue; + + if (!((actualNode->flags & DT_NODE_OPEN) && newNode.total > actualNode->total) && + !((actualNode->flags & DT_NODE_CLOSED) && newNode.total > actualNode->total)) + { + actualNode->flags &= ~DT_NODE_CLOSED; + actualNode->pidx = newNode.pidx; + actualNode->total = newNode.total; + + if (actualNode->flags & DT_NODE_OPEN) + { + m_openList->modify(actualNode); + } + else + { + if (n < maxResult) + { + if (resultRef) + resultRef[n] = actualNode->id; + if (resultParent) + resultParent[n] = m_nodePool->getNodeAtIdx(actualNode->pidx)->id; + if (resultCost) + resultCost[n] = actualNode->total; + ++n; + } + actualNode->flags |= DT_NODE_OPEN; + m_openList->push(actualNode); + } + } + } + } + bestNode->flags |= DT_NODE_CLOSED; + + } + + return n; +} + +// Returns polygons which are withing certain radius from the query location. +int dtStatNavMesh::queryPolygons(const float* center, const float* extents, + dtStatPolyRef* polys, const int maxIds) +{ + if (!m_header) return 0; + + const dtStatBVNode* node = &m_header->bvtree[0]; + const dtStatBVNode* end = &m_header->bvtree[m_header->nnodes]; + + // Calculate quantized box + const float ics = 1.0f / m_header->cs; + unsigned short bmin[3], bmax[3]; + // Clamp query box to world box. + float minx = clamp(center[0] - extents[0], m_header->bmin[0], m_header->bmax[0]) - m_header->bmin[0]; + float miny = clamp(center[1] - extents[1], m_header->bmin[1], m_header->bmax[1]) - m_header->bmin[1]; + float minz = clamp(center[2] - extents[2], m_header->bmin[2], m_header->bmax[2]) - m_header->bmin[2]; + float maxx = clamp(center[0] + extents[0], m_header->bmin[0], m_header->bmax[0]) - m_header->bmin[0]; + float maxy = clamp(center[1] + extents[1], m_header->bmin[1], m_header->bmax[1]) - m_header->bmin[1]; + float maxz = clamp(center[2] + extents[2], m_header->bmin[2], m_header->bmax[2]) - m_header->bmin[2]; + // Quantize + bmin[0] = (unsigned short)(ics * minx) & 0xfffe; + bmin[1] = (unsigned short)(ics * miny) & 0xfffe; + bmin[2] = (unsigned short)(ics * minz) & 0xfffe; + bmax[0] = (unsigned short)(ics * maxx + 1) | 1; + bmax[1] = (unsigned short)(ics * maxy + 1) | 1; + bmax[2] = (unsigned short)(ics * maxz + 1) | 1; + + // Traverse tree + int n = 0; + while (node < end) + { + bool overlap = checkOverlapBox(bmin, bmax, node->bmin, node->bmax); + bool isLeafNode = node->i >= 0; + + if (isLeafNode && overlap) + { + if (n < maxIds) + { + polys[n] = (dtStatPolyRef)node->i; + n++; + } + } + + if (overlap || isLeafNode) + node++; + else + { + const int escapeIndex = -node->i; + node += escapeIndex; + } + } + + return n; +} + +dtStatPolyRef dtStatNavMesh::findNearestPoly(const float* center, const float* extents) +{ + if (!m_header) return 0; + + // Get nearby polygons from proximity grid. + dtStatPolyRef polys[128]; + int npolys = queryPolygons(center, extents, polys, 128); + + // Find nearest polygon amongst the nearby polygons. + dtStatPolyRef nearest = 0; + float nearestDistanceSqr = FLT_MAX; + for (int i = 0; i < npolys; ++i) + { + dtStatPolyRef ref = polys[i]; + float closest[3]; + if (!closestPointToPoly(ref, center, closest)) + continue; + float d = vdistSqr(center, closest); + if (d < nearestDistanceSqr) + { + nearestDistanceSqr = d; + nearest = ref; + } + } + + return nearest; +} + +bool dtStatNavMesh::getPortalPoints(dtStatPolyRef from, dtStatPolyRef to, float* left, float* right) const +{ + const dtStatPoly* fromPoly = getPolyByRef(from); + if (!fromPoly) + return false; + + // Find common edge between the polygons and returns the segment end points. + for (unsigned i = 0, j = (int)fromPoly->nv - 1; i < (int)fromPoly->nv; j = i++) + { + unsigned short neighbour = fromPoly->n[j]; + if (neighbour == to) + { + vcopy(left, getVertex(fromPoly->v[j])); + vcopy(right, getVertex(fromPoly->v[i])); + return true; + } + } + + return false; +} + +bool dtStatNavMesh::getEdgeMidPoint(dtStatPolyRef from, dtStatPolyRef to, float* mid) const +{ + float left[3], right[3]; + if (!getPortalPoints(from, to, left,right)) return false; + mid[0] = (left[0]+right[0])*0.5f; + mid[1] = (left[1]+right[1])*0.5f; + mid[2] = (left[2]+right[2])*0.5f; + return true; +} + +bool dtStatNavMesh::isInClosedList(dtStatPolyRef ref) const +{ + if (!m_nodePool) return false; + const dtNode* node = m_nodePool->findNode(ref); + return node && node->flags & DT_NODE_CLOSED; +} + +int dtStatNavMesh::getMemUsed() const +{ + if (!m_nodePool || ! m_openList) + return 0; + return sizeof(*this) + m_dataSize + + m_nodePool->getMemUsed() + + m_openList->getMemUsed(); +} diff --git a/extern/recastnavigation/Detour/Source/DetourStatNavMeshBuilder.cpp b/extern/recastnavigation/Detour/Source/DetourStatNavMeshBuilder.cpp new file mode 100644 index 00000000000..a2bfb94edbc --- /dev/null +++ b/extern/recastnavigation/Detour/Source/DetourStatNavMeshBuilder.cpp @@ -0,0 +1,346 @@ +// +// Copyright (c) 2009 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#include +#include +#include +#include "DetourStatNavMesh.h" + +struct BVItem +{ + unsigned short bmin[3]; + unsigned short bmax[3]; + int i; +}; + +static int compareItemX(const void* va, const void* vb) +{ + const BVItem* a = (const BVItem*)va; + const BVItem* b = (const BVItem*)vb; + if (a->bmin[0] < b->bmin[0]) + return -1; + if (a->bmin[0] > b->bmin[0]) + return 1; + return 0; +} + +static int compareItemY(const void* va, const void* vb) +{ + const BVItem* a = (const BVItem*)va; + const BVItem* b = (const BVItem*)vb; + if (a->bmin[1] < b->bmin[1]) + return -1; + if (a->bmin[1] > b->bmin[1]) + return 1; + return 0; +} + +static int compareItemZ(const void* va, const void* vb) +{ + const BVItem* a = (const BVItem*)va; + const BVItem* b = (const BVItem*)vb; + if (a->bmin[2] < b->bmin[2]) + return -1; + if (a->bmin[2] > b->bmin[2]) + return 1; + return 0; +} + +static void calcExtends(BVItem* items, int nitems, int imin, int imax, + unsigned short* bmin, unsigned short* bmax) +{ + bmin[0] = items[imin].bmin[0]; + bmin[1] = items[imin].bmin[1]; + bmin[2] = items[imin].bmin[2]; + + bmax[0] = items[imin].bmax[0]; + bmax[1] = items[imin].bmax[1]; + bmax[2] = items[imin].bmax[2]; + + for (int i = imin+1; i < imax; ++i) + { + const BVItem& it = items[i]; + if (it.bmin[0] < bmin[0]) bmin[0] = it.bmin[0]; + if (it.bmin[1] < bmin[1]) bmin[1] = it.bmin[1]; + if (it.bmin[2] < bmin[2]) bmin[2] = it.bmin[2]; + + if (it.bmax[0] > bmax[0]) bmax[0] = it.bmax[0]; + if (it.bmax[1] > bmax[1]) bmax[1] = it.bmax[1]; + if (it.bmax[2] > bmax[2]) bmax[2] = it.bmax[2]; + } +} + +inline int longestAxis(unsigned short x, unsigned short y, unsigned short z) +{ + int axis = 0; + unsigned short maxVal = x; + if (y > maxVal) + { + axis = 1; + maxVal = y; + } + if (z > maxVal) + { + axis = 2; + maxVal = z; + } + return axis; +} + +static void subdivide(BVItem* items, int nitems, int imin, int imax, int& curNode, dtStatBVNode* nodes) +{ + int inum = imax - imin; + int icur = curNode; + + dtStatBVNode& node = nodes[curNode++]; + + if (inum == 1) + { + // Leaf + node.bmin[0] = items[imin].bmin[0]; + node.bmin[1] = items[imin].bmin[1]; + node.bmin[2] = items[imin].bmin[2]; + + node.bmax[0] = items[imin].bmax[0]; + node.bmax[1] = items[imin].bmax[1]; + node.bmax[2] = items[imin].bmax[2]; + + node.i = items[imin].i; + } + else + { + // Split + calcExtends(items, nitems, imin, imax, node.bmin, node.bmax); + + int axis = longestAxis(node.bmax[0] - node.bmin[0], + node.bmax[1] - node.bmin[1], + node.bmax[2] - node.bmin[2]); + + if (axis == 0) + { + // Sort along x-axis + qsort(items+imin, inum, sizeof(BVItem), compareItemX); + } + else if (axis == 1) + { + // Sort along y-axis + qsort(items+imin, inum, sizeof(BVItem), compareItemY); + } + else + { + // Sort along z-axis + qsort(items+imin, inum, sizeof(BVItem), compareItemZ); + } + + int isplit = imin+inum/2; + + // Left + subdivide(items, nitems, imin, isplit, curNode, nodes); + // Right + subdivide(items, nitems, isplit, imax, curNode, nodes); + + int iescape = curNode - icur; + // Negative index means escape. + node.i = -iescape; + } +} + +static int createBVTree(const unsigned short* verts, const int nverts, + const unsigned short* polys, const int npolys, const int nvp, + float cs, float ch, + int nnodes, dtStatBVNode* nodes) +{ + // Build tree + BVItem* items = new BVItem[npolys]; + for (int i = 0; i < npolys; i++) + { + BVItem& it = items[i]; + it.i = i+1; + // Calc polygon bounds. + const unsigned short* p = &polys[i*nvp*2]; + it.bmin[0] = it.bmax[0] = verts[p[0]*3+0]; + it.bmin[1] = it.bmax[1] = verts[p[0]*3+1]; + it.bmin[2] = it.bmax[2] = verts[p[0]*3+2]; + + for (int j = 1; j < nvp; ++j) + { + if (p[j] == 0xffff) break; + unsigned short x = verts[p[j]*3+0]; + unsigned short y = verts[p[j]*3+1]; + unsigned short z = verts[p[j]*3+2]; + + if (x < it.bmin[0]) it.bmin[0] = x; + if (y < it.bmin[1]) it.bmin[1] = y; + if (z < it.bmin[2]) it.bmin[2] = z; + + if (x > it.bmax[0]) it.bmax[0] = x; + if (y > it.bmax[1]) it.bmax[1] = y; + if (z > it.bmax[2]) it.bmax[2] = z; + } + // Remap y + it.bmin[1] = (unsigned short)floorf((float)it.bmin[1]*ch/cs); + it.bmax[1] = (unsigned short)ceilf((float)it.bmax[1]*ch/cs); + } + + int curNode = 0; + subdivide(items, npolys, 0, npolys, curNode, nodes); + + delete [] items; + + return curNode; +} + + +bool dtCreateNavMeshData(const unsigned short* verts, const int nverts, + const unsigned short* polys, const int npolys, const int nvp, + const float* bmin, const float* bmax, float cs, float ch, + const unsigned short* dmeshes, const float* dverts, const int ndverts, + const unsigned char* dtris, const int ndtris, + unsigned char** outData, int* outDataSize) +{ + if (nvp > DT_STAT_VERTS_PER_POLYGON) + return false; + if (nverts >= 0xffff) + return false; + + if (!nverts) + return false; + if (!npolys) + return false; + if (!dmeshes || !dverts || ! dtris) + return false; + + // Find unique detail vertices. + int uniqueDetailVerts = 0; + if (dmeshes) + { + for (int i = 0; i < npolys; ++i) + { + const unsigned short* p = &polys[i*nvp*2]; + int ndv = dmeshes[i*4+1]; + int nv = 0; + for (int j = 0; j < nvp; ++j) + { + if (p[j] == 0xffff) break; + nv++; + } + ndv -= nv; + uniqueDetailVerts += ndv; + } + } + + // Calculate data size + const int headerSize = sizeof(dtStatNavMeshHeader); + const int vertsSize = sizeof(float)*3*nverts; + const int polysSize = sizeof(dtStatPoly)*npolys; + const int nodesSize = sizeof(dtStatBVNode)*npolys*2; + const int detailMeshesSize = sizeof(dtStatPolyDetail)*npolys; + const int detailVertsSize = sizeof(float)*3*uniqueDetailVerts; + const int detailTrisSize = sizeof(unsigned char)*4*ndtris; + + const int dataSize = headerSize + vertsSize + polysSize + nodesSize + + detailMeshesSize + detailVertsSize + detailTrisSize; + unsigned char* data = new unsigned char[dataSize]; + if (!data) + return false; + memset(data, 0, dataSize); + + unsigned char* d = data; + dtStatNavMeshHeader* header = (dtStatNavMeshHeader*)d; d += headerSize; + float* navVerts = (float*)d; d += vertsSize; + dtStatPoly* navPolys = (dtStatPoly*)d; d += polysSize; + dtStatBVNode* navNodes = (dtStatBVNode*)d; d += nodesSize; + dtStatPolyDetail* navDMeshes = (dtStatPolyDetail*)d; d += detailMeshesSize; + float* navDVerts = (float*)d; d += detailVertsSize; + unsigned char* navDTris = (unsigned char*)d; d += detailTrisSize; + + // Store header + header->magic = DT_STAT_NAVMESH_MAGIC; + header->version = DT_STAT_NAVMESH_VERSION; + header->npolys = npolys; + header->nverts = nverts; + header->cs = cs; + header->bmin[0] = bmin[0]; + header->bmin[1] = bmin[1]; + header->bmin[2] = bmin[2]; + header->bmax[0] = bmax[0]; + header->bmax[1] = bmax[1]; + header->bmax[2] = bmax[2]; + header->ndmeshes = dmeshes ? npolys : 0; + header->ndverts = dmeshes ? uniqueDetailVerts : 0; + header->ndtris = dmeshes ? ndtris : 0; + + // Store vertices + for (int i = 0; i < nverts; ++i) + { + const unsigned short* iv = &verts[i*3]; + float* v = &navVerts[i*3]; + v[0] = bmin[0] + iv[0] * cs; + v[1] = bmin[1] + iv[1] * ch; + v[2] = bmin[2] + iv[2] * cs; + } + + // Store polygons + const unsigned short* src = polys; + for (int i = 0; i < npolys; ++i) + { + dtStatPoly* p = &navPolys[i]; + p->nv = 0; + for (int j = 0; j < nvp; ++j) + { + if (src[j] == 0xffff) break; + p->v[j] = src[j]; + p->n[j] = src[nvp+j]+1; + p->nv++; + } + src += nvp*2; + } + + header->nnodes = createBVTree(verts, nverts, polys, npolys, nvp, + cs, ch, npolys*2, navNodes); + + + // Store detail meshes and vertices. + // The nav polygon vertices are stored as the first vertices on each mesh. + // We compress the mesh data by skipping them and using the navmesh coordinates. + unsigned short vbase = 0; + for (int i = 0; i < npolys; ++i) + { + dtStatPolyDetail& dtl = navDMeshes[i]; + const int vb = dmeshes[i*4+0]; + const int ndv = dmeshes[i*4+1]; + const int nv = navPolys[i].nv; + dtl.vbase = vbase; + dtl.nverts = ndv-nv; + dtl.tbase = dmeshes[i*4+2]; + dtl.ntris = dmeshes[i*4+3]; + // Copy vertices except the first 'nv' verts which are equal to nav poly verts. + if (ndv-nv) + { + memcpy(&navDVerts[vbase*3], &dverts[(vb+nv)*3], sizeof(float)*3*(ndv-nv)); + vbase += ndv-nv; + } + } + // Store triangles. + memcpy(navDTris, dtris, sizeof(unsigned char)*4*ndtris); + + *outData = data; + *outDataSize = dataSize; + + return true; +} diff --git a/extern/recastnavigation/Detour/Source/DetourTileNavMesh.cpp b/extern/recastnavigation/Detour/Source/DetourTileNavMesh.cpp new file mode 100644 index 00000000000..0813c7755cc --- /dev/null +++ b/extern/recastnavigation/Detour/Source/DetourTileNavMesh.cpp @@ -0,0 +1,1428 @@ +// +// Copyright (c) 2009 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#include +#include +#include +#include +#include "DetourTileNavMesh.h" +#include "DetourNode.h" +#include "DetourCommon.h" + + +inline int opposite(int side) { return (side+2) & 0x3; } + +inline bool overlapBoxes(const float* amin, const float* amax, + const float* bmin, const float* bmax) +{ + bool overlap = true; + overlap = (amin[0] > bmax[0] || amax[0] < bmin[0]) ? false : overlap; + overlap = (amin[1] > bmax[1] || amax[1] < bmin[1]) ? false : overlap; + overlap = (amin[2] > bmax[2] || amax[2] < bmin[2]) ? false : overlap; + return overlap; +} + +inline bool overlapRects(const float* amin, const float* amax, + const float* bmin, const float* bmax) +{ + bool overlap = true; + overlap = (amin[0] > bmax[0] || amax[0] < bmin[0]) ? false : overlap; + overlap = (amin[1] > bmax[1] || amax[1] < bmin[1]) ? false : overlap; + return overlap; +} + +static void calcRect(const float* va, const float* vb, + float* bmin, float* bmax, + int side, float padx, float pady) +{ + if ((side&1) == 0) + { + bmin[0] = min(va[2],vb[2]) + padx; + bmin[1] = min(va[1],vb[1]) - pady; + bmax[0] = max(va[2],vb[2]) - padx; + bmax[1] = max(va[1],vb[1]) + pady; + } + else + { + bmin[0] = min(va[0],vb[0]) + padx; + bmin[1] = min(va[1],vb[1]) - pady; + bmax[0] = max(va[0],vb[0]) - padx; + bmax[1] = max(va[1],vb[1]) + pady; + } +} + +inline int computeTileHash(int x, int y) +{ + const unsigned int h1 = 0x8da6b343; // Large multiplicative constants; + const unsigned int h2 = 0xd8163841; // here arbitrarily chosen primes + unsigned int n = h1 * x + h2 * y; + return (int)(n & (DT_TILE_LOOKUP_SIZE-1)); +} + +////////////////////////////////////////////////////////////////////////////////////////// +dtTiledNavMesh::dtTiledNavMesh() : + m_tileSize(0), + m_portalHeight(0), + m_nextFree(0), + m_tmpLinks(0), + m_ntmpLinks(0), + m_nodePool(0), + m_openList(0) +{ +} + +dtTiledNavMesh::~dtTiledNavMesh() +{ + for (int i = 0; i < DT_MAX_TILES; ++i) + { + if (m_tiles[i].data && m_tiles[i].dataSize < 0) + { + delete [] m_tiles[i].data; + m_tiles[i].data = 0; + m_tiles[i].dataSize = 0; + } + } + delete [] m_tmpLinks; + delete m_nodePool; + delete m_openList; +} + +bool dtTiledNavMesh::init(const float* orig, float tileSize, float portalHeight) +{ + vcopy(m_orig, orig); + m_tileSize = tileSize; + m_portalHeight = portalHeight; + + // Init tiles + memset(m_tiles, 0, sizeof(dtTile)*DT_MAX_TILES); + memset(m_posLookup, 0, sizeof(dtTile*)*DT_TILE_LOOKUP_SIZE); + m_nextFree = 0; + for (int i = DT_MAX_TILES-1; i >= 0; --i) + { + m_tiles[i].next = m_nextFree; + m_nextFree = &m_tiles[i]; + } + + if (!m_nodePool) + { + m_nodePool = new dtNodePool(2048, 256); + if (!m_nodePool) + return false; + } + + if (!m_openList) + { + m_openList = new dtNodeQueue(2048); + if (!m_openList) + return false; + } + + return true; +} + +////////////////////////////////////////////////////////////////////////////////////////// +int dtTiledNavMesh::findConnectingPolys(const float* va, const float* vb, + dtTile* tile, int side, + dtTilePolyRef* con, float* conarea, int maxcon) +{ + if (!tile) return 0; + dtTileHeader* h = tile->header; + + float amin[2], amax[2]; + calcRect(va,vb, amin,amax, side, 0.01f, m_portalHeight); + + // Remove links pointing to 'side' and compact the links array. + float bmin[2], bmax[2]; + unsigned short m = 0x8000 | (unsigned short)side; + int n = 0; + + dtTilePolyRef base = getTileId(tile); + + for (int i = 0; i < h->npolys; ++i) + { + dtTilePoly* poly = &h->polys[i]; + for (int j = 0; j < poly->nv; ++j) + { + // Skip edges which do not point to the right side. + if (poly->n[j] != m) continue; + // Check if the segments touch. + const float* vc = &h->verts[poly->v[j]*3]; + const float* vd = &h->verts[poly->v[(j+1) % (int)poly->nv]*3]; + calcRect(vc,vd, bmin,bmax, side, 0.01f, m_portalHeight); + if (!overlapRects(amin,amax, bmin,bmax)) continue; + // Add return value. + if (n < maxcon) + { + conarea[n*2+0] = max(amin[0], bmin[0]); + conarea[n*2+1] = min(amax[0], bmax[0]); + con[n] = base | (unsigned int)i; + n++; + } + break; + } + } + return n; +} + +void dtTiledNavMesh::removeExtLinks(dtTile* tile, int side) +{ + if (!tile) return; + dtTileHeader* h = tile->header; + + // Remove links pointing to 'side' and compact the links array. + dtTileLink* pool = m_tmpLinks; + int nlinks = 0; + for (int i = 0; i < h->npolys; ++i) + { + dtTilePoly* poly = &h->polys[i]; + int plinks = nlinks; + int nplinks = 0; + for (int j = 0; j < poly->nlinks; ++j) + { + dtTileLink* link = &h->links[poly->links+j]; + if ((int)link->side != side) + { + if (nlinks < h->maxlinks) + { + dtTileLink* dst = &pool[nlinks++]; + memcpy(dst, link, sizeof(dtTileLink)); + nplinks++; + } + } + } + poly->links = plinks; + poly->nlinks = nplinks; + } + h->nlinks = nlinks; + if (h->nlinks) + memcpy(h->links, m_tmpLinks, sizeof(dtTileLink)*nlinks); +} + +void dtTiledNavMesh::buildExtLinks(dtTile* tile, dtTile* target, int side) +{ + if (!tile) return; + dtTileHeader* h = tile->header; + + // Remove links pointing to 'side' and compact the links array. + dtTileLink* pool = m_tmpLinks; + int nlinks = 0; + for (int i = 0; i < h->npolys; ++i) + { + dtTilePoly* poly = &h->polys[i]; + int plinks = nlinks; + int nplinks = 0; + // Copy internal and other external links. + for (int j = 0; j < poly->nlinks; ++j) + { + dtTileLink* link = &h->links[poly->links+j]; + if ((int)link->side != side) + { + if (nlinks < h->maxlinks) + { + dtTileLink* dst = &pool[nlinks++]; + memcpy(dst, link, sizeof(dtTileLink)); + nplinks++; + } + } + } + // Create new links. + unsigned short m = 0x8000 | (unsigned short)side; + for (int j = 0; j < poly->nv; ++j) + { + // Skip edges which do not point to the right side. + if (poly->n[j] != m) continue; + + // Create new links + const float* va = &h->verts[poly->v[j]*3]; + const float* vb = &h->verts[poly->v[(j+1)%(int)poly->nv]*3]; + dtTilePolyRef nei[4]; + float neia[4*2]; + int nnei = findConnectingPolys(va,vb, target, opposite(side), nei,neia,4); + for (int k = 0; k < nnei; ++k) + { + if (nlinks < h->maxlinks) + { + dtTileLink* link = &pool[nlinks++]; + link->ref = nei[k]; + link->p = (unsigned short)i; + link->e = (unsigned char)j; + link->side = (unsigned char)side; + + // Compress portal limits to a byte value. + if (side == 0 || side == 2) + { + const float lmin = min(va[2], vb[2]); + const float lmax = max(va[2], vb[2]); + link->bmin = (unsigned char)(clamp((neia[k*2+0]-lmin)/(lmax-lmin), 0.0f, 1.0f)*255.0f); + link->bmax = (unsigned char)(clamp((neia[k*2+1]-lmin)/(lmax-lmin), 0.0f, 1.0f)*255.0f); + } + else + { + const float lmin = min(va[0], vb[0]); + const float lmax = max(va[0], vb[0]); + link->bmin = (unsigned char)(clamp((neia[k*2+0]-lmin)/(lmax-lmin), 0.0f, 1.0f)*255.0f); + link->bmax = (unsigned char)(clamp((neia[k*2+1]-lmin)/(lmax-lmin), 0.0f, 1.0f)*255.0f); + } + nplinks++; + } + } + } + + poly->links = plinks; + poly->nlinks = nplinks; + } + h->nlinks = nlinks; + if (h->nlinks) + memcpy(h->links, m_tmpLinks, sizeof(dtTileLink)*nlinks); +} + +void dtTiledNavMesh::buildIntLinks(dtTile* tile) +{ + if (!tile) return; + dtTileHeader* h = tile->header; + + dtTilePolyRef base = getTileId(tile); + dtTileLink* pool = h->links; + int nlinks = 0; + for (int i = 0; i < h->npolys; ++i) + { + dtTilePoly* poly = &h->polys[i]; + poly->links = nlinks; + poly->nlinks = 0; + for (int j = 0; j < poly->nv; ++j) + { + // Skip hard and non-internal edges. + if (poly->n[j] == 0 || (poly->n[j] & 0x8000)) continue; + + if (nlinks < h->maxlinks) + { + dtTileLink* link = &pool[nlinks++]; + link->ref = base | (unsigned int)(poly->n[j]-1); + link->p = (unsigned short)i; + link->e = (unsigned char)j; + link->side = 0xff; + link->bmin = link->bmax = 0; + poly->nlinks++; + } + } + } + h->nlinks = nlinks; +} + +bool dtTiledNavMesh::addTileAt(int x, int y, unsigned char* data, int dataSize, bool ownsData) +{ + if (getTileAt(x,y)) + return false; + // Make sure there is enough space for new tile. + if (!m_nextFree) + return false; + // Make sure the data is in right format. + dtTileHeader* header = (dtTileHeader*)data; + if (header->magic != DT_TILE_NAVMESH_MAGIC) + return false; + if (header->version != DT_TILE_NAVMESH_VERSION) + return false; + + // Make sure the tmp link array is large enough. + if (header->maxlinks > m_ntmpLinks) + { + m_ntmpLinks = header->maxlinks; + delete [] m_tmpLinks; + m_tmpLinks = 0; + m_tmpLinks = new dtTileLink[m_ntmpLinks]; + } + if (!m_tmpLinks) + return false; + + // Allocate a tile. + dtTile* tile = m_nextFree; + m_nextFree = tile->next; + tile->next = 0; + + // Insert tile into the position lut. + int h = computeTileHash(x,y); + tile->next = m_posLookup[h]; + m_posLookup[h] = tile; + + // Patch header pointers. + const int headerSize = sizeof(dtTileHeader); + const int vertsSize = sizeof(float)*3*header->nverts; + const int polysSize = sizeof(dtTilePoly)*header->npolys; + const int linksSize = sizeof(dtTileLink)*(header->maxlinks); + const int detailMeshesSize = sizeof(dtTilePolyDetail)*header->ndmeshes; + const int detailVertsSize = sizeof(float)*3*header->ndverts; + const int detailTrisSize = sizeof(unsigned char)*4*header->ndtris; + + unsigned char* d = data + headerSize; + header->verts = (float*)d; d += vertsSize; + header->polys = (dtTilePoly*)d; d += polysSize; + header->links = (dtTileLink*)d; d += linksSize; + header->dmeshes = (dtTilePolyDetail*)d; d += detailMeshesSize; + header->dverts = (float*)d; d += detailVertsSize; + header->dtris = (unsigned char*)d; d += detailTrisSize; + + // Init tile. + tile->header = header; + tile->x = x; + tile->y = y; + tile->data = data; + tile->dataSize = dataSize; + tile->ownsData = ownsData; + + buildIntLinks(tile); + + // Create connections connections. + for (int i = 0; i < 4; ++i) + { + dtTile* nei = getNeighbourTileAt(x,y,i); + if (nei) + { + buildExtLinks(tile, nei, i); + buildExtLinks(nei, tile, opposite(i)); + } + } + + return true; +} + +dtTile* dtTiledNavMesh::getTileAt(int x, int y) +{ + // Find tile based on hash. + int h = computeTileHash(x,y); + dtTile* tile = m_posLookup[h]; + while (tile) + { + if (tile->x == x && tile->y == y) + return tile; + tile = tile->next; + } + return 0; +} + +dtTile* dtTiledNavMesh::getTile(int i) +{ + return &m_tiles[i]; +} + +const dtTile* dtTiledNavMesh::getTile(int i) const +{ + return &m_tiles[i]; +} + +dtTile* dtTiledNavMesh::getNeighbourTileAt(int x, int y, int side) +{ + switch (side) + { + case 0: x++; break; + case 1: y++; break; + case 2: x--; break; + case 3: y--; break; + }; + return getTileAt(x,y); +} + +bool dtTiledNavMesh::removeTileAt(int x, int y, unsigned char** data, int* dataSize) +{ + // Remove tile from hash lookup. + int h = computeTileHash(x,y); + dtTile* prev = 0; + dtTile* tile = m_posLookup[h]; + while (tile) + { + if (tile->x == x && tile->y == y) + { + if (prev) + prev->next = tile->next; + else + m_posLookup[h] = tile->next; + break; + } + prev = tile; + tile = tile->next; + } + if (!tile) + return false; + + // Remove connections to neighbour tiles. + for (int i = 0; i < 4; ++i) + { + dtTile* nei = getNeighbourTileAt(x,y,i); + if (!nei) continue; + removeExtLinks(nei, opposite(i)); + } + + + // Reset tile. + if (tile->ownsData) + { + // Owns data + delete [] tile->data; + tile->data = 0; + tile->dataSize = 0; + if (data) *data = 0; + if (dataSize) *dataSize = 0; + } + else + { + if (data) *data = tile->data; + if (dataSize) *dataSize = tile->dataSize; + } + tile->header = 0; + tile->x = tile->y = 0; + tile->salt++; + + // Add to free list. + tile->next = m_nextFree; + m_nextFree = tile; + + return true; +} + + + +bool dtTiledNavMesh::closestPointToPoly(dtTilePolyRef ref, const float* pos, float* closest) const +{ + unsigned int salt, it, ip; + dtDecodeTileId(ref, salt, it, ip); + if (it >= DT_MAX_TILES) return false; + if (m_tiles[it].salt != salt || m_tiles[it].header == 0) return false; + const dtTileHeader* header = m_tiles[it].header; + + if (ip >= (unsigned int)header->npolys) return false; + const dtTilePoly* poly = &header->polys[ip]; + + float closestDistSqr = FLT_MAX; + const dtTilePolyDetail* pd = &header->dmeshes[ip]; + + for (int j = 0; j < pd->ntris; ++j) + { + const unsigned char* t = &header->dtris[(pd->tbase+j)*4]; + const float* v[3]; + for (int k = 0; k < 3; ++k) + { + if (t[k] < poly->nv) + v[k] = &header->verts[poly->v[t[k]]*3]; + else + v[k] = &header->dverts[(pd->vbase+(t[k]-poly->nv))*3]; + } + float pt[3]; + closestPtPointTriangle(pt, pos, v[0], v[1], v[2]); + float d = vdistSqr(pos, pt); + if (d < closestDistSqr) + { + vcopy(closest, pt); + closestDistSqr = d; + } + } + + return true; +} + +bool dtTiledNavMesh::getPolyHeight(dtTilePolyRef ref, const float* pos, float* height) const +{ + unsigned int salt, it, ip; + dtDecodeTileId(ref, salt, it, ip); + if (it >= DT_MAX_TILES) return false; + if (m_tiles[it].salt != salt || m_tiles[it].header == 0) return false; + const dtTileHeader* header = m_tiles[it].header; + + if (ip >= (unsigned int)header->npolys) return false; + const dtTilePoly* poly = &header->polys[ip]; + + const dtTilePolyDetail* pd = &header->dmeshes[ip]; + for (int j = 0; j < pd->ntris; ++j) + { + const unsigned char* t = &header->dtris[(pd->tbase+j)*4]; + const float* v[3]; + for (int k = 0; k < 3; ++k) + { + if (t[k] < poly->nv) + v[k] = &header->verts[poly->v[t[k]]*3]; + else + v[k] = &header->dverts[(pd->vbase+(t[k]-poly->nv))*3]; + } + float h; + if (closestHeightPointTriangle(pos, v[0], v[1], v[2], h)) + { + if (height) + *height = h; + return true; + } + } + + return false; +} + + +dtTilePolyRef dtTiledNavMesh::findNearestPoly(const float* center, const float* extents) +{ + // Get nearby polygons from proximity grid. + dtTilePolyRef polys[128]; + int npolys = queryPolygons(center, extents, polys, 128); + + // Find nearest polygon amongst the nearby polygons. + dtTilePolyRef nearest = 0; + float nearestDistanceSqr = FLT_MAX; + for (int i = 0; i < npolys; ++i) + { + dtTilePolyRef ref = polys[i]; + float closest[3]; + if (!closestPointToPoly(ref, center, closest)) + continue; + float d = vdistSqr(center, closest); + if (d < nearestDistanceSqr) + { + nearestDistanceSqr = d; + nearest = ref; + } + } + + return nearest; +} + +dtTilePolyRef dtTiledNavMesh::getTileId(dtTile* tile) +{ + if (!tile) return 0; + const unsigned int it = tile - m_tiles; + return dtEncodeTileId(tile->salt, it, 0); +} + +int dtTiledNavMesh::queryTilePolygons(dtTile* tile, + const float* qmin, const float* qmax, + dtTilePolyRef* polys, const int maxPolys) +{ + float bmin[3], bmax[3]; + const dtTileHeader* header = tile->header; + int n = 0; + dtTilePolyRef base = getTileId(tile); + for (int i = 0; i < header->npolys; ++i) + { + // Calc polygon bounds. + dtTilePoly* p = &header->polys[i]; + const float* v = &header->verts[p->v[0]*3]; + vcopy(bmin, v); + vcopy(bmax, v); + for (int j = 1; j < p->nv; ++j) + { + v = &header->verts[p->v[j]*3]; + vmin(bmin, v); + vmax(bmax, v); + } + if (overlapBoxes(qmin,qmax, bmin,bmax)) + { + if (n < maxPolys) + polys[n++] = base | (dtTilePolyRef)i; + } + } + return n; +} + +int dtTiledNavMesh::queryPolygons(const float* center, const float* extents, + dtTilePolyRef* polys, const int maxPolys) +{ + float bmin[3], bmax[3]; + bmin[0] = center[0] - extents[0]; + bmin[1] = center[1] - extents[1]; + bmin[2] = center[2] - extents[2]; + + bmax[0] = center[0] + extents[0]; + bmax[1] = center[1] + extents[1]; + bmax[2] = center[2] + extents[2]; + + // Find tiles the query touches. + const int minx = (int)floorf((bmin[0]-m_orig[0]) / m_tileSize); + const int maxx = (int)ceilf((bmax[0]-m_orig[0]) / m_tileSize); + + const int miny = (int)floorf((bmin[2]-m_orig[2]) / m_tileSize); + const int maxy = (int)ceilf((bmax[2]-m_orig[2]) / m_tileSize); + + int n = 0; + for (int y = miny; y < maxy; ++y) + { + for (int x = minx; x < maxx; ++x) + { + dtTile* tile = getTileAt(x,y); + if (!tile) continue; + n += queryTilePolygons(tile, bmin, bmax, polys+n, maxPolys-n); + if (n >= maxPolys) return n; + } + } + + return n; +} + +int dtTiledNavMesh::findPath(dtTilePolyRef startRef, dtTilePolyRef endRef, + const float* startPos, const float* endPos, + dtTilePolyRef* path, const int maxPathSize) +{ + if (!startRef || !endRef) + return 0; + + if (!maxPathSize) + return 0; + + if (!getPolyByRef(startRef) || !getPolyByRef(endRef)) + return 0; + + if (startRef == endRef) + { + path[0] = startRef; + return 1; + } + + if (!m_nodePool || !m_openList) + return 0; + + m_nodePool->clear(); + m_openList->clear(); + + static const float H_SCALE = 1.1f; // Heuristic scale. + + dtNode* startNode = m_nodePool->getNode(startRef); + startNode->pidx = 0; + startNode->cost = 0; + startNode->total = vdist(startPos, endPos) * H_SCALE; + startNode->id = startRef; + startNode->flags = DT_NODE_OPEN; + m_openList->push(startNode); + + dtNode* lastBestNode = startNode; + float lastBestNodeCost = startNode->total; + while (!m_openList->empty()) + { + dtNode* bestNode = m_openList->pop(); + + if (bestNode->id == endRef) + { + lastBestNode = bestNode; + break; + } + + // Get poly and tile. + unsigned int salt, it, ip; + dtDecodeTileId(bestNode->id, salt, it, ip); + // The API input has been cheked already, skip checking internal data. + const dtTileHeader* header = m_tiles[it].header; + const dtTilePoly* poly = &header->polys[ip]; + + for (int i = 0; i < poly->nlinks; ++i) + { + dtTilePolyRef neighbour = header->links[poly->links+i].ref; + if (neighbour) + { + // Skip parent node. + if (bestNode->pidx && m_nodePool->getNodeAtIdx(bestNode->pidx)->id == neighbour) + continue; + + dtNode* parent = bestNode; + dtNode newNode; + newNode.pidx = m_nodePool->getNodeIdx(parent); + newNode.id = neighbour; + + // Calculate cost. + float p0[3], p1[3]; + if (!parent->pidx) + vcopy(p0, startPos); + else + getEdgeMidPoint(m_nodePool->getNodeAtIdx(parent->pidx)->id, parent->id, p0); + getEdgeMidPoint(parent->id, newNode.id, p1); + newNode.cost = parent->cost + vdist(p0,p1); + // Special case for last node. + if (newNode.id == endRef) + newNode.cost += vdist(p1, endPos); + + // Heuristic + const float h = vdist(p1,endPos)*H_SCALE; + newNode.total = newNode.cost + h; + + dtNode* actualNode = m_nodePool->getNode(newNode.id); + if (!actualNode) + continue; + + if (!((actualNode->flags & DT_NODE_OPEN) && newNode.total > actualNode->total) && + !((actualNode->flags & DT_NODE_CLOSED) && newNode.total > actualNode->total)) + { + actualNode->flags &= DT_NODE_CLOSED; + actualNode->pidx = newNode.pidx; + actualNode->cost = newNode.cost; + actualNode->total = newNode.total; + + if (h < lastBestNodeCost) + { + lastBestNodeCost = h; + lastBestNode = actualNode; + } + + if (actualNode->flags & DT_NODE_OPEN) + { + m_openList->modify(actualNode); + } + else + { + actualNode->flags |= DT_NODE_OPEN; + m_openList->push(actualNode); + } + } + } + } + bestNode->flags |= DT_NODE_CLOSED; + } + + // Reverse the path. + dtNode* prev = 0; + dtNode* node = lastBestNode; + do + { + dtNode* next = m_nodePool->getNodeAtIdx(node->pidx); + node->pidx = m_nodePool->getNodeIdx(prev); + prev = node; + node = next; + } + while (node); + + // Store path + node = prev; + int n = 0; + do + { + path[n++] = node->id; + node = m_nodePool->getNodeAtIdx(node->pidx); + } + while (node && n < maxPathSize); + + return n; +} + +int dtTiledNavMesh::findStraightPath(const float* startPos, const float* endPos, + const dtTilePolyRef* path, const int pathSize, + float* straightPath, const int maxStraightPathSize) +{ + if (!maxStraightPathSize) + return 0; + + if (!path[0]) + return 0; + + int straightPathSize = 0; + + float closestStartPos[3]; + if (!closestPointToPoly(path[0], startPos, closestStartPos)) + return 0; + + // Add start point. + vcopy(&straightPath[straightPathSize*3], closestStartPos); + straightPathSize++; + if (straightPathSize >= maxStraightPathSize) + return straightPathSize; + + float closestEndPos[3]; + if (!closestPointToPoly(path[pathSize-1], endPos, closestEndPos)) + return 0; + + float portalApex[3], portalLeft[3], portalRight[3]; + + if (pathSize > 1) + { + vcopy(portalApex, closestStartPos); + vcopy(portalLeft, portalApex); + vcopy(portalRight, portalApex); + int apexIndex = 0; + int leftIndex = 0; + int rightIndex = 0; + + for (int i = 0; i < pathSize; ++i) + { + float left[3], right[3]; + if (i < pathSize-1) + { + // Next portal. + if (!getPortalPoints(path[i], path[i+1], left, right)) + { + if (!closestPointToPoly(path[i], endPos, closestEndPos)) + return 0; + vcopy(&straightPath[straightPathSize*3], closestEndPos); + straightPathSize++; + return straightPathSize; + } + } + else + { + // End of the path. + vcopy(left, closestEndPos); + vcopy(right, closestEndPos); + } + + // Right vertex. + if (vequal(portalApex, portalRight)) + { + vcopy(portalRight, right); + rightIndex = i; + } + else + { + if (triArea2D(portalApex, portalRight, right) <= 0.0f) + { + if (triArea2D(portalApex, portalLeft, right) > 0.0f) + { + vcopy(portalRight, right); + rightIndex = i; + } + else + { + vcopy(portalApex, portalLeft); + apexIndex = leftIndex; + + if (!vequal(&straightPath[(straightPathSize-1)*3], portalApex)) + { + vcopy(&straightPath[straightPathSize*3], portalApex); + straightPathSize++; + if (straightPathSize >= maxStraightPathSize) + return straightPathSize; + } + + vcopy(portalLeft, portalApex); + vcopy(portalRight, portalApex); + leftIndex = apexIndex; + rightIndex = apexIndex; + + // Restart + i = apexIndex; + + continue; + } + } + } + + // Left vertex. + if (vequal(portalApex, portalLeft)) + { + vcopy(portalLeft, left); + leftIndex = i; + } + else + { + if (triArea2D(portalApex, portalLeft, left) >= 0.0f) + { + if (triArea2D(portalApex, portalRight, left) < 0.0f) + { + vcopy(portalLeft, left); + leftIndex = i; + } + else + { + vcopy(portalApex, portalRight); + apexIndex = rightIndex; + + if (!vequal(&straightPath[(straightPathSize-1)*3], portalApex)) + { + vcopy(&straightPath[straightPathSize*3], portalApex); + straightPathSize++; + if (straightPathSize >= maxStraightPathSize) + return straightPathSize; + } + + vcopy(portalLeft, portalApex); + vcopy(portalRight, portalApex); + leftIndex = apexIndex; + rightIndex = apexIndex; + + // Restart + i = apexIndex; + + continue; + } + } + } + } + } + + // Add end point. + vcopy(&straightPath[straightPathSize*3], closestEndPos); + straightPathSize++; + + return straightPathSize; +} + +// Returns portal points between two polygons. +bool dtTiledNavMesh::getPortalPoints(dtTilePolyRef from, dtTilePolyRef to, float* left, float* right) const +{ + unsigned int salt, it, ip; + dtDecodeTileId(from, salt, it, ip); + if (it >= DT_MAX_TILES) return false; + if (m_tiles[it].salt != salt || m_tiles[it].header == 0) return false; + if (ip >= (unsigned int)m_tiles[it].header->npolys) return false; + const dtTileHeader* fromHeader = m_tiles[it].header; + const dtTilePoly* fromPoly = &fromHeader->polys[ip]; + + for (int i = 0; i < fromPoly->nlinks; ++i) + { + const dtTileLink* link = &fromHeader->links[fromPoly->links+i]; + if (link->ref == to) + { + // Find portal vertices. + const int v0 = fromPoly->v[link->e]; + const int v1 = fromPoly->v[(link->e+1) % fromPoly->nv]; + vcopy(left, &fromHeader->verts[v0*3]); + vcopy(right, &fromHeader->verts[v1*3]); + // If the link is at tile boundary, clamp the vertices to + // the link width. + if (link->side == 0 || link->side == 2) + { + // Unpack portal limits. + const float smin = min(left[2],right[2]); + const float smax = max(left[2],right[2]); + const float s = (smax-smin) / 255.0f; + const float lmin = smin + link->bmin*s; + const float lmax = smin + link->bmax*s; + left[2] = max(left[2],lmin); + left[2] = min(left[2],lmax); + right[2] = max(right[2],lmin); + right[2] = min(right[2],lmax); + } + else if (link->side == 1 || link->side == 3) + { + // Unpack portal limits. + const float smin = min(left[0],right[0]); + const float smax = max(left[0],right[0]); + const float s = (smax-smin) / 255.0f; + const float lmin = smin + link->bmin*s; + const float lmax = smin + link->bmax*s; + left[0] = max(left[0],lmin); + left[0] = min(left[0],lmax); + right[0] = max(right[0],lmin); + right[0] = min(right[0],lmax); + } + return true; + } + } + return false; +} + +// Returns edge mid point between two polygons. +bool dtTiledNavMesh::getEdgeMidPoint(dtTilePolyRef from, dtTilePolyRef to, float* mid) const +{ + float left[3], right[3]; + if (!getPortalPoints(from, to, left,right)) return false; + mid[0] = (left[0]+right[0])*0.5f; + mid[1] = (left[1]+right[1])*0.5f; + mid[2] = (left[2]+right[2])*0.5f; + return true; +} + +int dtTiledNavMesh::raycast(dtTilePolyRef centerRef, const float* startPos, const float* endPos, + float& t, dtTilePolyRef* path, const int pathSize) +{ + t = 0; + + if (!centerRef || !getPolyByRef(centerRef)) + return 0; + + dtTilePolyRef curRef = centerRef; + float verts[DT_TILE_VERTS_PER_POLYGON*3]; + int n = 0; + + while (curRef) + { + // Cast ray against current polygon. + + // The API input has been cheked already, skip checking internal data. + unsigned int salt, it, ip; + dtDecodeTileId(curRef, salt, it, ip); + const dtTileHeader* header = m_tiles[it].header; + const dtTilePoly* poly = &header->polys[ip]; + + // Collect vertices. + int nv = 0; + for (int i = 0; i < (int)poly->nv; ++i) + { + vcopy(&verts[nv*3], &header->verts[poly->v[i]*3]); + nv++; + } + if (nv < 3) + { + // Hit bad polygon, report hit. + return n; + } + + float tmin, tmax; + int segMin, segMax; + if (!intersectSegmentPoly2D(startPos, endPos, verts, nv, tmin, tmax, segMin, segMax)) + { + // Could not hit the polygon, keep the old t and report hit. + return n; + } + // Keep track of furthest t so far. + if (tmax > t) + t = tmax; + + if (n < pathSize) + path[n++] = curRef; + + // Follow neighbours. + dtTilePolyRef nextRef = 0; + for (int i = 0; i < poly->nlinks; ++i) + { + const dtTileLink* link = &header->links[poly->links+i]; + if ((int)link->e == segMax) + { + // If the link is internal, just return the ref. + if (link->side == 0xff) + { + nextRef = link->ref; + break; + } + + // If the link is at tile boundary, + const int v0 = poly->v[link->e]; + const int v1 = poly->v[(link->e+1) % poly->nv]; + const float* left = &header->verts[v0*3]; + const float* right = &header->verts[v1*3]; + + // Check that the intersection lies inside the link portal. + if (link->side == 0 || link->side == 2) + { + // Calculate link size. + const float smin = min(left[2],right[2]); + const float smax = max(left[2],right[2]); + const float s = (smax-smin) / 255.0f; + const float lmin = smin + link->bmin*s; + const float lmax = smin + link->bmax*s; + // Find Z intersection. + float z = startPos[2] + (endPos[2]-startPos[2])*tmax; + if (z >= lmin && z <= lmax) + { + nextRef = link->ref; + break; + } + } + else if (link->side == 1 || link->side == 3) + { + // Calculate link size. + const float smin = min(left[0],right[0]); + const float smax = max(left[0],right[0]); + const float s = (smax-smin) / 255.0f; + const float lmin = smin + link->bmin*s; + const float lmax = smin + link->bmax*s; + // Find X intersection. + float x = startPos[0] + (endPos[0]-startPos[0])*tmax; + if (x >= lmin && x <= lmax) + { + nextRef = link->ref; + break; + } + } + } + } + + if (!nextRef) + { + // No neighbour, we hit a wall. + return n; + } + + // No hit, advance to neighbour polygon. + curRef = nextRef; + } + + return n; +} + +int dtTiledNavMesh::findPolysAround(dtTilePolyRef centerRef, const float* centerPos, float radius, + dtTilePolyRef* resultRef, dtTilePolyRef* resultParent, float* resultCost, + const int maxResult) +{ + if (!centerRef) return 0; + if (!getPolyByRef(centerRef)) return 0; + if (!m_nodePool || !m_openList) return 0; + + m_nodePool->clear(); + m_openList->clear(); + + dtNode* startNode = m_nodePool->getNode(centerRef); + startNode->pidx = 0; + startNode->cost = 0; + startNode->total = 0; + startNode->id = centerRef; + startNode->flags = DT_NODE_OPEN; + m_openList->push(startNode); + + int n = 0; + if (n < maxResult) + { + if (resultRef) + resultRef[n] = startNode->id; + if (resultParent) + resultParent[n] = 0; + if (resultCost) + resultCost[n] = 0; + ++n; + } + + const float radiusSqr = sqr(radius); + + while (!m_openList->empty()) + { + dtNode* bestNode = m_openList->pop(); + + // Get poly and tile. + unsigned int salt, it, ip; + dtDecodeTileId(bestNode->id, salt, it, ip); + // The API input has been cheked already, skip checking internal data. + const dtTileHeader* header = m_tiles[it].header; + const dtTilePoly* poly = &header->polys[ip]; + + for (int i = 0; i < poly->nlinks; ++i) + { + const dtTileLink* link = &header->links[poly->links+i]; + dtTilePolyRef neighbour = link->ref; + if (neighbour) + { + // Skip parent node. + if (bestNode->pidx && m_nodePool->getNodeAtIdx(bestNode->pidx)->id == neighbour) + continue; + + // Calc distance to the edge. + const float* va = &header->verts[poly->v[link->e]*3]; + const float* vb = &header->verts[poly->v[(link->e+1)%poly->nv]*3]; + float tseg; + float distSqr = distancePtSegSqr2D(centerPos, va, vb, tseg); + + // If the circle is not touching the next polygon, skip it. + if (distSqr > radiusSqr) + continue; + + dtNode* parent = bestNode; + dtNode newNode; + newNode.pidx = m_nodePool->getNodeIdx(parent); + newNode.id = neighbour; + + // Cost + float p0[3], p1[3]; + if (!parent->pidx) + vcopy(p0, centerPos); + else + getEdgeMidPoint(m_nodePool->getNodeAtIdx(parent->pidx)->id, parent->id, p0); + getEdgeMidPoint(parent->id, newNode.id, p1); + newNode.total = parent->total + vdist(p0,p1); + + dtNode* actualNode = m_nodePool->getNode(newNode.id); + if (!actualNode) + continue; + + if (!((actualNode->flags & DT_NODE_OPEN) && newNode.total > actualNode->total) && + !((actualNode->flags & DT_NODE_CLOSED) && newNode.total > actualNode->total)) + { + actualNode->flags &= ~DT_NODE_CLOSED; + actualNode->pidx = newNode.pidx; + actualNode->total = newNode.total; + + if (actualNode->flags & DT_NODE_OPEN) + { + m_openList->modify(actualNode); + } + else + { + if (n < maxResult) + { + if (resultRef) + resultRef[n] = actualNode->id; + if (resultParent) + resultParent[n] = m_nodePool->getNodeAtIdx(actualNode->pidx)->id; + if (resultCost) + resultCost[n] = actualNode->total; + ++n; + } + actualNode->flags = DT_NODE_OPEN; + m_openList->push(actualNode); + } + } + } + } + } + + return n; +} + +float dtTiledNavMesh::findDistanceToWall(dtTilePolyRef centerRef, const float* centerPos, float maxRadius, + float* hitPos, float* hitNormal) +{ + if (!centerRef) return 0; + if (!getPolyByRef(centerRef)) return 0; + if (!m_nodePool || !m_openList) return 0; + + m_nodePool->clear(); + m_openList->clear(); + + dtNode* startNode = m_nodePool->getNode(centerRef); + startNode->pidx = 0; + startNode->cost = 0; + startNode->total = 0; + startNode->id = centerRef; + startNode->flags = DT_NODE_OPEN; + m_openList->push(startNode); + + float radiusSqr = sqr(maxRadius); + + while (!m_openList->empty()) + { + dtNode* bestNode = m_openList->pop(); + + // Get poly and tile. + unsigned int salt, it, ip; + dtDecodeTileId(bestNode->id, salt, it, ip); + // The API input has been cheked already, skip checking internal data. + const dtTileHeader* header = m_tiles[it].header; + const dtTilePoly* poly = &header->polys[ip]; + + // Hit test walls. + for (int i = 0, j = (int)poly->nv-1; i < (int)poly->nv; j = i++) + { + // Skip non-solid edges. + if (poly->n[j] & 0x8000) + { + // Tile border. + bool solid = true; + for (int i = 0; i < poly->nlinks; ++i) + { + const dtTileLink* link = &header->links[poly->links+i]; + if (link->e == j && link->ref != 0) + { + solid = false; + break; + } + } + if (!solid) continue; + } + else if (poly->n[j]) + { + // Internal edge + continue; + } + + // Calc distance to the edge. + const float* vj = &header->verts[poly->v[j]*3]; + const float* vi = &header->verts[poly->v[i]*3]; + float tseg; + float distSqr = distancePtSegSqr2D(centerPos, vj, vi, tseg); + + // Edge is too far, skip. + if (distSqr > radiusSqr) + continue; + + // Hit wall, update radius. + radiusSqr = distSqr; + // Calculate hit pos. + hitPos[0] = vj[0] + (vi[0] - vj[0])*tseg; + hitPos[1] = vj[1] + (vi[1] - vj[1])*tseg; + hitPos[2] = vj[2] + (vi[2] - vj[2])*tseg; + } + + for (int i = 0; i < poly->nlinks; ++i) + { + const dtTileLink* link = &header->links[poly->links+i]; + dtTilePolyRef neighbour = link->ref; + if (neighbour) + { + // Skip parent node. + if (bestNode->pidx && m_nodePool->getNodeAtIdx(bestNode->pidx)->id == neighbour) + continue; + + // Calc distance to the edge. + const float* va = &header->verts[poly->v[link->e]*3]; + const float* vb = &header->verts[poly->v[(link->e+1)%poly->nv]*3]; + float tseg; + float distSqr = distancePtSegSqr2D(centerPos, va, vb, tseg); + + // If the circle is not touching the next polygon, skip it. + if (distSqr > radiusSqr) + continue; + + dtNode* parent = bestNode; + dtNode newNode; + newNode.pidx = m_nodePool->getNodeIdx(parent); + newNode.id = neighbour; + + float p0[3], p1[3]; + if (!parent->pidx) + vcopy(p0, centerPos); + else + getEdgeMidPoint(m_nodePool->getNodeAtIdx(parent->pidx)->id, parent->id, p0); + getEdgeMidPoint(parent->id, newNode.id, p1); + newNode.total = parent->total + vdist(p0,p1); + + dtNode* actualNode = m_nodePool->getNode(newNode.id); + if (!actualNode) + continue; + + if (!((actualNode->flags & DT_NODE_OPEN) && newNode.total > actualNode->total) && + !((actualNode->flags & DT_NODE_CLOSED) && newNode.total > actualNode->total)) + { + actualNode->flags &= ~DT_NODE_CLOSED; + actualNode->pidx = newNode.pidx; + actualNode->total = newNode.total; + + if (actualNode->flags & DT_NODE_OPEN) + { + m_openList->modify(actualNode); + } + else + { + actualNode->flags = DT_NODE_OPEN; + m_openList->push(actualNode); + } + } + } + } + } + + // Calc hit normal. + vsub(hitNormal, centerPos, hitPos); + vnormalize(hitNormal); + + return sqrtf(radiusSqr); +} + +const dtTilePoly* dtTiledNavMesh::getPolyByRef(dtTilePolyRef ref) const +{ + unsigned int salt, it, ip; + dtDecodeTileId(ref, salt, it, ip); + if (it >= DT_MAX_TILES) return 0; + if (m_tiles[it].salt != salt || m_tiles[it].header == 0) return 0; + if (ip >= (unsigned int)m_tiles[it].header->npolys) return 0; + return &m_tiles[it].header->polys[ip]; +} + +const float* dtTiledNavMesh::getPolyVertsByRef(dtTilePolyRef ref) const +{ + unsigned int salt, it, ip; + dtDecodeTileId(ref, salt, it, ip); + if (it >= DT_MAX_TILES) return 0; + if (m_tiles[it].salt != salt || m_tiles[it].header == 0) return 0; + if (ip >= (unsigned int)m_tiles[it].header->npolys) return 0; + return m_tiles[it].header->verts; +} + +const dtTileLink* dtTiledNavMesh::getPolyLinksByRef(dtTilePolyRef ref) const +{ + unsigned int salt, it, ip; + dtDecodeTileId(ref, salt, it, ip); + if (it >= DT_MAX_TILES) return 0; + if (m_tiles[it].salt != salt || m_tiles[it].header == 0) return 0; + if (ip >= (unsigned int)m_tiles[it].header->npolys) return 0; + return m_tiles[it].header->links; +} diff --git a/extern/recastnavigation/Detour/Source/DetourTileNavMeshBuilder.cpp b/extern/recastnavigation/Detour/Source/DetourTileNavMeshBuilder.cpp new file mode 100644 index 00000000000..95dd34b04f6 --- /dev/null +++ b/extern/recastnavigation/Detour/Source/DetourTileNavMeshBuilder.cpp @@ -0,0 +1,213 @@ +// +// Copyright (c) 2009 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#include +#include +#include +#include +#include "DetourTileNavMesh.h" +#include "DetourCommon.h" + +bool dtCreateNavMeshTileData(const unsigned short* verts, const int nverts, + const unsigned short* polys, const int npolys, const int nvp, + const unsigned short* dmeshes, const float* dverts, const int ndverts, + const unsigned char* dtris, const int ndtris, + const float* bmin, const float* bmax, float cs, float ch, int tileSize, int walkableClimb, + unsigned char** outData, int* outDataSize) +{ + if (nvp != DT_TILE_VERTS_PER_POLYGON) + return false; + if (nverts >= 0xffff) + return false; + + if (!nverts) + return false; + if (!npolys) + return false; + if (!dmeshes || !dverts || ! dtris) + return false; + + // Find portal edges which are at tile borders. + int nedges = 0; + int nportals = 0; + for (int i = 0; i < npolys; ++i) + { + const unsigned short* p = &polys[i*2*nvp]; + for (int j = 0; j < nvp; ++j) + { + if (p[j] == 0xffff) break; + int nj = j+1; + if (nj >= nvp || p[nj] == 0xffff) nj = 0; + const unsigned short* va = &verts[p[j]*3]; + const unsigned short* vb = &verts[p[nj]*3]; + + nedges++; + + if (va[0] == tileSize && vb[0] == tileSize) + nportals++; // x+ + else if (va[2] == tileSize && vb[2] == tileSize) + nportals++; // z+ + else if (va[0] == 0 && vb[0] == 0) + nportals++; // x- + else if (va[2] == 0 && vb[2] == 0) + nportals++; // z- + } + } + + const int maxLinks = nedges + nportals*2; + + + // Find unique detail vertices. + int uniqueDetailVerts = 0; + if (dmeshes) + { + for (int i = 0; i < npolys; ++i) + { + const unsigned short* p = &polys[i*nvp*2]; + int ndv = dmeshes[i*4+1]; + int nv = 0; + for (int j = 0; j < nvp; ++j) + { + if (p[j] == 0xffff) break; + nv++; + } + ndv -= nv; + uniqueDetailVerts += ndv; + } + } + + // Calculate data size + const int headerSize = sizeof(dtTileHeader); + const int vertsSize = sizeof(float)*3*nverts; + const int polysSize = sizeof(dtTilePoly)*npolys; + const int linksSize = sizeof(dtTileLink)*maxLinks; + const int detailMeshesSize = sizeof(dtTilePolyDetail)*npolys; + const int detailVertsSize = sizeof(float)*3*uniqueDetailVerts; + const int detailTrisSize = sizeof(unsigned char)*4*ndtris; + + const int dataSize = headerSize + vertsSize + polysSize + linksSize + + detailMeshesSize + detailVertsSize + detailTrisSize; + unsigned char* data = new unsigned char[dataSize]; + if (!data) + return false; + memset(data, 0, dataSize); + + unsigned char* d = data; + dtTileHeader* header = (dtTileHeader*)d; d += headerSize; + float* navVerts = (float*)d; d += vertsSize; + dtTilePoly* navPolys = (dtTilePoly*)d; d += polysSize; + d += linksSize; + dtTilePolyDetail* navDMeshes = (dtTilePolyDetail*)d; d += detailMeshesSize; + float* navDVerts = (float*)d; d += detailVertsSize; + unsigned char* navDTris = (unsigned char*)d; d += detailTrisSize; + + + // Store header + header->magic = DT_TILE_NAVMESH_MAGIC; + header->version = DT_TILE_NAVMESH_VERSION; + header->npolys = npolys; + header->nverts = nverts; + header->maxlinks = maxLinks; + header->bmin[0] = bmin[0]; + header->bmin[1] = bmin[1]; + header->bmin[2] = bmin[2]; + header->bmax[0] = bmax[0]; + header->bmax[1] = bmax[1]; + header->bmax[2] = bmax[2]; + header->ndmeshes = npolys; + header->ndverts = uniqueDetailVerts; + header->ndtris = ndtris; + + // Store vertices + for (int i = 0; i < nverts; ++i) + { + const unsigned short* iv = &verts[i*3]; + float* v = &navVerts[i*3]; + v[0] = bmin[0] + iv[0] * cs; + v[1] = bmin[1] + iv[1] * ch; + v[2] = bmin[2] + iv[2] * cs; + } + + // Store polygons + const unsigned short* src = polys; + for (int i = 0; i < npolys; ++i) + { + dtTilePoly* p = &navPolys[i]; + p->nv = 0; + for (int j = 0; j < nvp; ++j) + { + if (src[j] == 0xffff) break; + p->v[j] = src[j]; + p->n[j] = (src[nvp+j]+1) & 0xffff; + p->nv++; + } + src += nvp*2; + } + + // Store portal edges. + for (int i = 0; i < npolys; ++i) + { + dtTilePoly* poly = &navPolys[i]; + for (int j = 0; j < poly->nv; ++j) + { + int nj = j+1; + if (nj >= poly->nv) nj = 0; + + const unsigned short* va = &verts[poly->v[j]*3]; + const unsigned short* vb = &verts[poly->v[nj]*3]; + + if (va[0] == tileSize && vb[0] == tileSize) // x+ + poly->n[j] = 0x8000 | 0; + else if (va[2] == tileSize && vb[2] == tileSize) // z+ + poly->n[j] = 0x8000 | 1; + else if (va[0] == 0 && vb[0] == 0) // x- + poly->n[j] = 0x8000 | 2; + else if (va[2] == 0 && vb[2] == 0) // z- + poly->n[j] = 0x8000 | 3; + } + } + + // Store detail meshes and vertices. + // The nav polygon vertices are stored as the first vertices on each mesh. + // We compress the mesh data by skipping them and using the navmesh coordinates. + unsigned short vbase = 0; + for (int i = 0; i < npolys; ++i) + { + dtTilePolyDetail& dtl = navDMeshes[i]; + const int vb = dmeshes[i*4+0]; + const int ndv = dmeshes[i*4+1]; + const int nv = navPolys[i].nv; + dtl.vbase = vbase; + dtl.nverts = ndv-nv; + dtl.tbase = dmeshes[i*4+2]; + dtl.ntris = dmeshes[i*4+3]; + // Copy vertices except the first 'nv' verts which are equal to nav poly verts. + if (ndv-nv) + { + memcpy(&navDVerts[vbase*3], &dverts[(vb+nv)*3], sizeof(float)*3*(ndv-nv)); + vbase += ndv-nv; + } + } + // Store triangles. + memcpy(navDTris, dtris, sizeof(unsigned char)*4*ndtris); + + *outData = data; + *outDataSize = dataSize; + + return true; +} diff --git a/extern/recastnavigation/License.txt b/extern/recastnavigation/License.txt new file mode 100644 index 00000000000..95f4bfc9654 --- /dev/null +++ b/extern/recastnavigation/License.txt @@ -0,0 +1,18 @@ +Copyright (c) 2009 Mikko Mononen memon@inside.org + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not +claim that you wrote the original software. If you use this software +in a product, an acknowledgment in the product documentation would be +appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be +misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + diff --git a/extern/recastnavigation/Readme.txt b/extern/recastnavigation/Readme.txt new file mode 100644 index 00000000000..0c2f7b1675f --- /dev/null +++ b/extern/recastnavigation/Readme.txt @@ -0,0 +1,120 @@ + +Recast & Detour Version 1.4 + + +Recast + +Recast is state of the art navigation mesh construction toolset for games. + + * It is automatic, which means that you can throw any level geometry + at it and you will get robust mesh out + * It is fast which means swift turnaround times for level designers + * It is open source so it comes with full source and you can + customize it to your hearts content. + +The Recast process starts with constructing a voxel mold from a level geometry +and then casting a navigation mesh over it. The process consists of three steps, +building the voxel mold, partitioning the mold into simple regions, peeling off +the regions as simple polygons. + + 1. The voxel mold is build from the input triangle mesh by rasterizing + the triangles into a multi-layer heightfield. Some simple filters are + then applied to the mold to prune out locations where the character + would not be able to move. + 2. The walkable areas described by the mold are divided into simple + overlayed 2D regions. The resulting regions have only one non-overlapping + contour, which simplifies the final step of the process tremendously. + 3. The navigation polygons are peeled off from the regions by first tracing + the boundaries and then simplifying them. The resulting polygons are + finally converted to convex polygons which makes them perfect for + pathfinding and spatial reasoning about the level. + +The toolset code is located in the Recast folder and demo application using the Recast +toolset is located in the RecastDemo folder. + +The project files with this distribution can be compiled with Microsoft Visual C++ 2008 +(you can download it for free) and XCode 3.1. + + +Detour + +Recast is accompanied with Detour, path-finding and spatial reasoning toolkit. You can use any navigation mesh with Detour, but of course the data generated with Recast fits perfectly. + +Detour offers simple static navigation mesh which is suitable for many simple cases, as well as tiled navigation mesh which allows you to plug in and out pieces of the mesh. The tiled mesh allows to create systems where you stream new navigation data in and out as the player progresses the level, or you may regenerate tiles as the world changes. + + +Latest code available at http://code.google.com/p/recastnavigation/ + + +-- + +Release Notes + +---------------- +* Recast 1.4 + Released August 24th, 2009 + +- Added detail height mesh generation (RecastDetailMesh.cpp) for single, + tiled statmeshes as well as tilemesh. +- Added feature to contour tracing which detects extra vertices along + tile edges which should be removed later. +- Changed the tiled stat mesh preprocess, so that it first generated + polymeshes per tile and finally combines them. +- Fixed bug in the GUI code where invisible buttons could be pressed. + +---------------- +* Recast 1.31 + Released July 24th, 2009 + +- Better cost and heuristic functions. +- Fixed tile navmesh raycast on tile borders. + +---------------- +* Recast 1.3 + Released July 14th, 2009 + +- Added dtTileNavMesh which allows to dynamically add and remove navmesh pieces at runtime. +- Renamed stat navmesh types to dtStat* (i.e. dtPoly is now dtStatPoly). +- Moved common code used by tile and stat navmesh to DetourNode.h/cpp and DetourCommon.h/cpp. +- Refactores the demo code. + +---------------- +* Recast 1.2 + Released June 17th, 2009 + +- Added tiled mesh generation. The tiled generation allows to generate navigation for + much larger worlds, it removes some of the artifacts that comes from distance fields + in open areas, and allows later streaming and dynamic runtime generation +- Improved and added some debug draw modes +- API change: The helper function rcBuildNavMesh does not exists anymore, + had to change few internal things to cope with the tiled processing, + similar API functionality will be added later once the tiled process matures +- The demo is getting way too complicated, need to split demos +- Fixed several filtering functions so that the mesh is tighter to the geometry, + sometimes there could be up error up to tow voxel units close to walls, + now it should be just one. + +---------------- +* Recast 1.1 + Released April 11th, 2009 + +This is the first release of Detour. + +---------------- +* Recast 1.0 + Released March 29th, 2009 + +This is the first release of Recast. + +The process is not always as robust as I would wish. The watershed phase sometimes swallows tiny islands +which are close to edges. These droppings are handled in rcBuildContours, but the code is not +particularly robust either. + +Another non-robust case is when portal contours (contours shared between two regions) are always +assumed to be straight. That can lead to overlapping contours specially when the level has +large open areas. + + + +Mikko Mononen +memon@inside.org diff --git a/extern/recastnavigation/Recast/Include/Recast.h b/extern/recastnavigation/Recast/Include/Recast.h new file mode 100644 index 00000000000..5fe5447ab7c --- /dev/null +++ b/extern/recastnavigation/Recast/Include/Recast.h @@ -0,0 +1,500 @@ +// +// Copyright (c) 2009 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#ifndef RECAST_H +#define RECAST_H + +// The units of the parameters are specified in parenthesis as follows: +// (vx) voxels, (wu) world units +struct rcConfig +{ + int width, height; // Dimensions of the rasterized heighfield (vx) + int tileSize; // Width and Height of a tile (vx) + int borderSize; // Non-navigable Border around the heightfield (vx) + float cs, ch; // Grid cell size and height (wu) + float bmin[3], bmax[3]; // Grid bounds (wu) + float walkableSlopeAngle; // Maximum walkble slope angle in degrees. + int walkableHeight; // Minimum height where the agent can still walk (vx) + int walkableClimb; // Maximum height between grid cells the agent can climb (vx) + int walkableRadius; // Radius of the agent in cells (vx) + int maxEdgeLen; // Maximum contour edge length (vx) + float maxSimplificationError; // Maximum distance error from contour to cells (vx) + int minRegionSize; // Minimum regions size. Smaller regions will be deleted (vx) + int mergeRegionSize; // Minimum regions size. Smaller regions will be merged (vx) + int maxVertsPerPoly; // Max number of vertices per polygon + float detailSampleDist; // Detail mesh sample spacing. + float detailSampleMaxError; // Detail mesh simplification max sample error. +}; + +// Heightfield span. +struct rcSpan +{ + unsigned int smin : 15; // Span min height. + unsigned int smax : 15; // Span max height. + unsigned int flags : 2; // Span flags. + rcSpan* next; // Next span in column. +}; + +static const int RC_SPANS_PER_POOL = 2048; + +// Memory pool used for quick span allocation. +struct rcSpanPool +{ + rcSpanPool* next; // Pointer to next pool. + rcSpan items[1]; // Array of spans (size RC_SPANS_PER_POOL). +}; + +// Dynamic span-heightfield. +struct rcHeightfield +{ + inline rcHeightfield() : width(0), height(0), spans(0), pools(0), freelist(0) {} + inline ~rcHeightfield() + { + // Delete span array. + delete [] spans; + // Delete span pools. + while (pools) + { + rcSpanPool* next = pools->next; + delete [] reinterpret_cast(pools); + pools = next; + } + } + int width, height; // Dimension of the heightfield. + float bmin[3], bmax[3]; // Bounding box of the heightfield + float cs, ch; // Cell size and height. + rcSpan** spans; // Heightfield of spans (width*height). + rcSpanPool* pools; // Linked list of span pools. + rcSpan* freelist; // Pointer to next free span. +}; + +struct rcCompactCell +{ + unsigned int index : 24; // Index to first span in column. + unsigned int count : 8; // Number of spans in this column. +}; + +struct rcCompactSpan +{ + unsigned short y; // Bottom coordinate of the span. + unsigned short reg; // Region ID + unsigned short dist; // Distance to border + unsigned short con; // Connections to neighbour cells. + unsigned char h; // Height of the span. + unsigned char flags; // Flags. +}; + +// Compact static heightfield. +struct rcCompactHeightfield +{ + inline rcCompactHeightfield() : maxDistance(0), maxRegions(0), cells(0), spans(0) {} + inline ~rcCompactHeightfield() { delete [] cells; delete [] spans; } + int width, height; // Width and height of the heighfield. + int spanCount; // Number of spans in the heightfield. + int walkableHeight, walkableClimb; // Agent properties. + unsigned short maxDistance; // Maximum distance value stored in heightfield. + unsigned short maxRegions; // Maximum Region Id stored in heightfield. + float bmin[3], bmax[3]; // Bounding box of the heightfield. + float cs, ch; // Cell size and height. + rcCompactCell* cells; // Pointer to width*height cells. + rcCompactSpan* spans; // Pointer to spans. +}; + +struct rcContour +{ + inline rcContour() : verts(0), nverts(0), rverts(0), nrverts(0) { } + inline ~rcContour() { delete [] verts; delete [] rverts; } + int* verts; // Vertex coordinates, each vertex contains 4 components. + int nverts; // Number of vertices. + int* rverts; // Raw vertex coordinates, each vertex contains 4 components. + int nrverts; // Number of raw vertices. + unsigned short reg; // Region ID of the contour. +}; + +struct rcContourSet +{ + inline rcContourSet() : conts(0), nconts(0) {} + inline ~rcContourSet() { delete [] conts; } + rcContour* conts; // Pointer to all contours. + int nconts; // Number of contours. + float bmin[3], bmax[3]; // Bounding box of the heightfield. + float cs, ch; // Cell size and height. +}; + +// Polymesh store a connected mesh of polygons. +// The polygons are store in an array where each polygons takes +// 'nvp*2' elements. The first 'nvp' elements are indices to vertices +// and the second 'nvp' elements are indices to neighbour polygons. +// If a polygona has less than 'bvp' vertices, the remaining indices +// are set os 0xffff. If an polygon edge does not have a neighbour +// the neighbour index is set to 0xffff. +// Vertices can be transformed into world space as follows: +// x = bmin[0] + verts[i*3+0]*cs; +// y = bmin[1] + verts[i*3+1]*ch; +// z = bmin[2] + verts[i*3+2]*cs; +struct rcPolyMesh +{ + inline rcPolyMesh() : verts(0), polys(0), regs(0), nverts(0), npolys(0), nvp(3) {} + inline ~rcPolyMesh() { delete [] verts; delete [] polys; delete [] regs; } + unsigned short* verts; // Vertices of the mesh, 3 elements per vertex. + unsigned short* polys; // Polygons of the mesh, nvp*2 elements per polygon. + unsigned short* regs; // Regions of the polygons. + int nverts; // Number of vertices. + int npolys; // Number of polygons. + int nvp; // Max number of vertices per polygon. + float bmin[3], bmax[3]; // Bounding box of the mesh. + float cs, ch; // Cell size and height. +}; + +// Detail mesh generated from a rcPolyMesh. +// Each submesh represents a polygon in the polymesh and they are stored in +// excatly same order. Each submesh is described as 4 values: +// base vertex, vertex count, base triangle, triangle count. That is, +// const unsigned char* t = &dtl.tris[(tbase+i)*3]; and +// const float* v = &dtl.verts[(vbase+t[j])*3]; +// If the input polygon has 'n' vertices, those vertices are first in the +// submesh vertex list. This allows to compres the mesh by not storing the +// first vertices and using the polymesh vertices instead. + +struct rcPolyMeshDetail +{ + inline rcPolyMeshDetail() : + meshes(0), verts(0), tris(0), + nmeshes(0), nverts(0), ntris(0) {} + inline ~rcPolyMeshDetail() + { + delete [] meshes; delete [] verts; delete [] tris; + } + + unsigned short* meshes; // Pointer to all mesh data. + float* verts; // Pointer to all vertex data. + unsigned char* tris; // Pointer to all triangle data. + int nmeshes; // Number of meshes. + int nverts; // Number of total vertices. + int ntris; // Number of triangles. +}; + + +// Simple dynamic array ints. +class rcIntArray +{ + int* m_data; + int m_size, m_cap; +public: + inline rcIntArray() : m_data(0), m_size(0), m_cap(0) {} + inline rcIntArray(int n) : m_data(0), m_size(0), m_cap(n) { m_data = new int[n]; } + inline ~rcIntArray() { delete [] m_data; } + void resize(int n); + inline void push(int item) { resize(m_size+1); m_data[m_size-1] = item; } + inline int pop() { if (m_size > 0) m_size--; return m_data[m_size]; } + inline const int& operator[](int i) const { return m_data[i]; } + inline int& operator[](int i) { return m_data[i]; } + inline int size() const { return m_size; } +}; + +enum rcSpanFlags +{ + RC_WALKABLE = 0x01, + RC_REACHABLE = 0x02, +}; + +// If heightfield region ID has the following bit set, the region is on border area +// and excluded from many calculations. +static const unsigned short RC_BORDER_REG = 0x8000; + +// If contour region ID has the following bit set, the vertex will be later +// removed in order to match the segments and vertices at tile boundaries. +static const int RC_BORDER_VERTEX = 0x10000; + +// Compact span neighbour helpers. +inline int rcGetCon(const rcCompactSpan& s, int dir) +{ + return (s.con >> (dir*4)) & 0xf; +} + +inline int rcGetDirOffsetX(int dir) +{ + const int offset[4] = { -1, 0, 1, 0, }; + return offset[dir&0x03]; +} + +inline int rcGetDirOffsetY(int dir) +{ + const int offset[4] = { 0, 1, 0, -1 }; + return offset[dir&0x03]; +} + +// Common helper functions +template inline void rcSwap(T& a, T& b) { T t = a; a = b; b = t; } +template inline T rcMin(T a, T b) { return a < b ? a : b; } +template inline T rcMax(T a, T b) { return a > b ? a : b; } +template inline T rcAbs(T a) { return a < 0 ? -a : a; } +template inline T rcSqr(T a) { return a*a; } +template inline T rcClamp(T v, T mn, T mx) { return v < mn ? mn : (v > mx ? mx : v); } + +// Common vector helper functions. +inline void vcross(float* dest, const float* v1, const float* v2) +{ + dest[0] = v1[1]*v2[2] - v1[2]*v2[1]; + dest[1] = v1[2]*v2[0] - v1[0]*v2[2]; + dest[2] = v1[0]*v2[1] - v1[1]*v2[0]; +} + +inline float vdot(const float* v1, const float* v2) +{ + return v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2]; +} + +inline void vmad(float* dest, const float* v1, const float* v2, const float s) +{ + dest[0] = v1[0]+v2[0]*s; + dest[1] = v1[1]+v2[1]*s; + dest[2] = v1[2]+v2[2]*s; +} + +inline void vadd(float* dest, const float* v1, const float* v2) +{ + dest[0] = v1[0]+v2[0]; + dest[1] = v1[1]+v2[1]; + dest[2] = v1[2]+v2[2]; +} + +inline void vsub(float* dest, const float* v1, const float* v2) +{ + dest[0] = v1[0]-v2[0]; + dest[1] = v1[1]-v2[1]; + dest[2] = v1[2]-v2[2]; +} + +inline void vmin(float* mn, const float* v) +{ + mn[0] = rcMin(mn[0], v[0]); + mn[1] = rcMin(mn[1], v[1]); + mn[2] = rcMin(mn[2], v[2]); +} + +inline void vmax(float* mx, const float* v) +{ + mx[0] = rcMax(mx[0], v[0]); + mx[1] = rcMax(mx[1], v[1]); + mx[2] = rcMax(mx[2], v[2]); +} + +inline void vcopy(float* dest, const float* v) +{ + dest[0] = v[0]; + dest[1] = v[1]; + dest[2] = v[2]; +} + +inline float vdist(const float* v1, const float* v2) +{ + float dx = v2[0] - v1[0]; + float dy = v2[1] - v1[1]; + float dz = v2[2] - v1[2]; + return sqrtf(dx*dx + dy*dy + dz*dz); +} + +inline float vdistSqr(const float* v1, const float* v2) +{ + float dx = v2[0] - v1[0]; + float dy = v2[1] - v1[1]; + float dz = v2[2] - v1[2]; + return dx*dx + dy*dy + dz*dz; +} + +inline void vnormalize(float* v) +{ + float d = 1.0f / sqrtf(rcSqr(v[0]) + rcSqr(v[1]) + rcSqr(v[2])); + v[0] *= d; + v[1] *= d; + v[2] *= d; +} + +inline bool vequal(const float* p0, const float* p1) +{ + static const float thr = rcSqr(1.0f/16384.0f); + const float d = vdistSqr(p0, p1); + return d < thr; +} + + +// Calculated bounding box of array of vertices. +// Params: +// verts - (in) array of vertices +// nv - (in) vertex count +// bmin, bmax - (out) bounding box +void rcCalcBounds(const float* verts, int nv, float* bmin, float* bmax); + +// Calculates grid size based on bounding box and grid cell size. +// Params: +// bmin, bmax - (in) bounding box +// cs - (in) grid cell size +// w - (out) grid width +// h - (out) grid height +void rcCalcGridSize(const float* bmin, const float* bmax, float cs, int* w, int* h); + +// Creates and initializes new heightfield. +// Params: +// hf - (in/out) heightfield to initialize. +// width - (in) width of the heightfield. +// height - (in) height of the heightfield. +// bmin, bmax - (in) bounding box of the heightfield +// cs - (in) grid cell size +// ch - (in) grid cell height +bool rcCreateHeightfield(rcHeightfield& hf, int width, int height, + const float* bmin, const float* bmax, + float cs, float ch); + +// Sets the WALKABLE flag for every triangle whose slope is below +// the maximun walkable slope angle. +// Params: +// walkableSlopeAngle - (in) maximun slope angle in degrees. +// verts - (in) array of vertices +// nv - (in) vertex count +// tris - (in) array of triangle vertex indices +// nt - (in) triangle count +// flags - (out) array of triangle flags +void rcMarkWalkableTriangles(const float walkableSlopeAngle, + const float* verts, int nv, + const int* tris, int nt, + unsigned char* flags); + +// Rasterizes a triangle into heightfield spans. +// Params: +// v0,v1,v2 - (in) the vertices of the triangle. +// flags - (in) triangle flags (uses WALKABLE) +// solid - (in) heighfield where the triangle is rasterized +void rcRasterizeTriangle(const float* v0, const float* v1, const float* v2, + unsigned char flags, rcHeightfield& solid); + +// Rasterizes the triangles into heightfield spans. +// Params: +// verts - (in) array of vertices +// nv - (in) vertex count +// tris - (in) array of triangle vertex indices +// norms - (in) array of triangle normals +// flags - (in) array of triangle flags (uses WALKABLE) +// nt - (in) triangle count +// solid - (in) heighfield where the triangles are rasterized +void rcRasterizeTriangles(const float* verts, int nv, + const int* tris, const unsigned char* flags, int nt, + rcHeightfield& solid); + +// Removes WALKABLE flag from all spans that are at ledges. This filtering +// removes possible overestimation of the conservative voxelization so that +// the resulting mesh will not have regions hanging in air over ledges. +// Params: +// walkableHeight - (in) minimum height where the agent can still walk +// walkableClimb - (in) maximum height between grid cells the agent can climb +// solid - (in/out) heightfield describing the solid space +void rcFilterLedgeSpans(const int walkableHeight, + const int walkableClimb, + rcHeightfield& solid); + +// Removes WALKABLE flag from all spans which have smaller than +// 'walkableHeight' clearane above them. +// Params: +// walkableHeight - (in) minimum height where the agent can still walk +// solid - (in/out) heightfield describing the solid space +void rcFilterWalkableLowHeightSpans(int walkableHeight, + rcHeightfield& solid); + +// Marks spans which are reachable from any of the topmost spans. +// Params: +// walkableHeight - (in) minimum height where the agent can still walk +// walkableClimb - (in) maximum height between grid cells the agent can climb +// solid - (in/out) heightfield describing the solid space +// Returns false if operation ran out of memory. +bool rcMarkReachableSpans(const int walkableHeight, + const int walkableClimb, + rcHeightfield& solid); + +// Builds compact representation of the heightfield. +// Params: +// walkableHeight - (in) minimum height where the agent can still walk +// walkableClimb - (in) maximum height between grid cells the agent can climb +// hf - (in) heightfield to be compacted +// chf - (out) compact heightfield representing the open space. +// Returns false if operation ran out of memory. +bool rcBuildCompactHeightfield(const int walkableHeight, const int walkableClimb, + unsigned char flags, + rcHeightfield& hf, + rcCompactHeightfield& chf); + +// Builds distance field and stores it into the combat heightfield. +// Params: +// chf - (in/out) compact heightfield representing the open space. +// Returns false if operation ran out of memory. +bool rcBuildDistanceField(rcCompactHeightfield& chf); + +// Divides the walkable heighfied into simple regions. +// Each region has only one contour and no overlaps. +// The regions are stored in the compact heightfield 'reg' field. +// The regions will be shrinked by the radius of the agent. +// The process sometimes creates small regions. The parameter +// 'minRegionSize' specifies the smallest allowed regions size. +// If the area of a regions is smaller than allowed, the regions is +// removed or merged to neighbour region. +// Params: +// chf - (in/out) compact heightfield representing the open space. +// walkableRadius - (in) the radius of the agent. +// minRegionSize - (in) the smallest allowed regions size. +// maxMergeRegionSize - (in) the largest allowed regions size which can be merged. +// Returns false if operation ran out of memory. +bool rcBuildRegions(rcCompactHeightfield& chf, + int walkableRadius, int borderSize, + int minRegionSize, int mergeRegionSize); + +// Builds simplified contours from the regions outlines. +// Params: +// chf - (in) compact heightfield which has regions set. +// maxError - (in) maximum allowed distance between simplified countour and cells. +// maxEdgeLen - (in) maximum allowed contour edge length in cells. +// cset - (out) Resulting contour set. +// Returns false if operation ran out of memory. +bool rcBuildContours(rcCompactHeightfield& chf, + const float maxError, const int maxEdgeLen, + rcContourSet& cset); + +// Builds connected convex polygon mesh from contour polygons. +// Params: +// cset - (in) contour set. +// nvp - (in) maximum number of vertices per polygon. +// mesh - (out) poly mesh. +// Returns false if operation ran out of memory. +bool rcBuildPolyMesh(rcContourSet& cset, int nvp, rcPolyMesh& mesh); + +bool rcMergePolyMeshes(rcPolyMesh** meshes, const int nmeshes, rcPolyMesh& mesh); + +// Builds detail triangle mesh for each polygon in the poly mesh. +// Params: +// mesh - (in) poly mesh to detail. +// chf - (in) compacy height field, used to query height for new vertices. +// sampleDist - (in) spacing between height samples used to generate more detail into mesh. +// sampleMaxError - (in) maximum allowed distance between simplified detail mesh and height sample. +// pmdtl - (out) detail mesh. +// Returns false if operation ran out of memory. +bool rcBuildPolyMeshDetail(const rcPolyMesh& mesh, const rcCompactHeightfield& chf, + const float sampleDist, const float sampleMaxError, + rcPolyMeshDetail& dmesh); + +bool rcMergePolyMeshDetails(rcPolyMeshDetail** meshes, const int nmeshes, rcPolyMeshDetail& mesh); + + +#endif // RECAST_H diff --git a/extern/recastnavigation/Recast/Include/RecastDebugDraw.h b/extern/recastnavigation/Recast/Include/RecastDebugDraw.h new file mode 100644 index 00000000000..27ba0a1aa71 --- /dev/null +++ b/extern/recastnavigation/Recast/Include/RecastDebugDraw.h @@ -0,0 +1,59 @@ +// +// Copyright (c) 2009 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#ifndef RECAST_DEBUGDRAW_H +#define RECAST_DEBUGDRAW_H + +inline int bit(int a, int b) +{ + return (a & (1 << b)) >> b; +} + +inline void intToCol(int i, float* col) +{ + int r = bit(i, 0) + bit(i, 3) * 2 + 1; + int g = bit(i, 1) + bit(i, 4) * 2 + 1; + int b = bit(i, 2) + bit(i, 5) * 2 + 1; + col[0] = 1 - r*63.0f/255.0f; + col[1] = 1 - g*63.0f/255.0f; + col[2] = 1 - b*63.0f/255.0f; +} + +void rcDebugDrawHeightfieldSolid(const struct rcHeightfield& hf); +void rcDebugDrawHeightfieldWalkable(const struct rcHeightfield& hf); + +void rcDebugDrawMesh(const float* verts, int nverts, const int* tris, const float* normals, int ntris, const unsigned char* flags); +void rcDebugDrawMeshSlope(const float* verts, int nverts, const int* tris, const float* normals, int ntris, const float walkableSlopeAngle); + +void rcDebugDrawCompactHeightfieldSolid(const struct rcCompactHeightfield& chf); +void rcDebugDrawCompactHeightfieldRegions(const struct rcCompactHeightfield& chf); +void rcDebugDrawCompactHeightfieldDistance(const struct rcCompactHeightfield& chf); + +void rcDebugDrawRegionConnections(const struct rcContourSet& cset, const float alpha = 1.0f); +void rcDebugDrawRawContours(const struct rcContourSet& cset, const float alpha = 1.0f); +void rcDebugDrawContours(const struct rcContourSet& cset, const float alpha = 1.0f); +void rcDebugDrawPolyMesh(const struct rcPolyMesh& mesh); +void rcDebugDrawPolyMeshDetail(const struct rcPolyMeshDetail& dmesh); + +void rcDebugDrawCylinderWire(float minx, float miny, float minz, float maxx, float maxy, float maxz, const float* col); +void rcDebugDrawBoxWire(float minx, float miny, float minz, float maxx, float maxy, float maxz, const float* col); +void rcDebugDrawBox(float minx, float miny, float minz, float maxx, float maxy, float maxz, + const float* col1, const float* col2); +void rcDrawArc(const float* p0, const float* p1); + +#endif // RECAST_DEBUGDRAW_H diff --git a/extern/recastnavigation/Recast/Include/RecastLog.h b/extern/recastnavigation/Recast/Include/RecastLog.h new file mode 100644 index 00000000000..026ef73a3aa --- /dev/null +++ b/extern/recastnavigation/Recast/Include/RecastLog.h @@ -0,0 +1,80 @@ +// +// Copyright (c) 2009 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#ifndef RECAST_LOG_H +#define RECAST_LOG_H + +enum rcLogCategory +{ + RC_LOG_PROGRESS = 1, + RC_LOG_WARNING, + RC_LOG_ERROR, +}; + +class rcLog +{ +public: + rcLog(); + ~rcLog(); + + void log(rcLogCategory category, const char* format, ...); + inline void clear() { m_messageCount = 0; m_textPoolSize = 0; } + inline int getMessageCount() const { return m_messageCount; } + inline char getMessageType(int i) const { return *m_messages[i]; } + inline const char* getMessageText(int i) const { return m_messages[i]+1; } + +private: + static const int MAX_MESSAGES = 1000; + const char* m_messages[MAX_MESSAGES]; + int m_messageCount; + static const int TEXT_POOL_SIZE = 8000; + char m_textPool[TEXT_POOL_SIZE]; + int m_textPoolSize; +}; + +struct rcBuildTimes +{ + int rasterizeTriangles; + int buildCompact; + int buildContours; + int buildContoursTrace; + int buildContoursSimplify; + int filterBorder; + int filterWalkable; + int filterMarkReachable; + int buildPolymesh; + int buildDistanceField; + int buildDistanceFieldDist; + int buildDistanceFieldBlur; + int buildRegions; + int buildRegionsReg; + int buildRegionsExp; + int buildRegionsFlood; + int buildRegionsFilter; + int buildDetailMesh; + int mergePolyMesh; + int mergePolyMeshDetail; +}; + +void rcSetLog(rcLog* log); +rcLog* rcGetLog(); + +void rcSetBuildTimes(rcBuildTimes* btimes); +rcBuildTimes* rcGetBuildTimes(); + +#endif // RECAST_LOG_H diff --git a/extern/recastnavigation/Recast/Include/RecastTimer.h b/extern/recastnavigation/Recast/Include/RecastTimer.h new file mode 100644 index 00000000000..d4f21e58776 --- /dev/null +++ b/extern/recastnavigation/Recast/Include/RecastTimer.h @@ -0,0 +1,31 @@ +// +// Copyright (c) 2009 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// +#ifndef RECAST_TIMER_H +#define RECAST_TIMER_H + +#ifdef __GNUC__ +#include +typedef int64_t rcTimeVal; +#else +typedef __int64 rcTimeVal; +#endif + +rcTimeVal rcGetPerformanceTimer(); +int rcGetDeltaTimeUsec(rcTimeVal start, rcTimeVal end); + +#endif // RECAST_TIMER_H diff --git a/extern/recastnavigation/Recast/Source/Recast.cpp b/extern/recastnavigation/Recast/Source/Recast.cpp new file mode 100644 index 00000000000..4bd8b7a12a9 --- /dev/null +++ b/extern/recastnavigation/Recast/Source/Recast.cpp @@ -0,0 +1,272 @@ +// +// Copyright (c) 2009 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#include +#define _USE_MATH_DEFINES +#include +#include +#include +#include +#include "Recast.h" +#include "RecastLog.h" +#include "RecastTimer.h" + + +void rcIntArray::resize(int n) +{ + if (n > m_cap) + { + if (!m_cap) m_cap = 8; + while (m_cap < n) m_cap *= 2; + int* newData = new int[m_cap]; + if (m_size && newData) memcpy(newData, m_data, m_size*sizeof(int)); + delete [] m_data; + m_data = newData; + } + m_size = n; +} + +void rcCalcBounds(const float* verts, int nv, float* bmin, float* bmax) +{ + // Calculate bounding box. + vcopy(bmin, verts); + vcopy(bmax, verts); + for (int i = 1; i < nv; ++i) + { + const float* v = &verts[i*3]; + vmin(bmin, v); + vmax(bmax, v); + } +} + +void rcCalcGridSize(const float* bmin, const float* bmax, float cs, int* w, int* h) +{ + *w = (int)((bmax[0] - bmin[0])/cs+0.5f); + *h = (int)((bmax[2] - bmin[2])/cs+0.5f); +} + +bool rcCreateHeightfield(rcHeightfield& hf, int width, int height, + const float* bmin, const float* bmax, + float cs, float ch) +{ + hf.width = width; + hf.height = height; + hf.spans = new rcSpan*[hf.width*hf.height]; + vcopy(hf.bmin, bmin); + vcopy(hf.bmax, bmax); + hf.cs = cs; + hf.ch = ch; + if (!hf.spans) + return false; + memset(hf.spans, 0, sizeof(rcSpan*)*hf.width*hf.height); + return true; +} + +static void calcTriNormal(const float* v0, const float* v1, const float* v2, float* norm) +{ + float e0[3], e1[3]; + vsub(e0, v1, v0); + vsub(e1, v2, v0); + vcross(norm, e0, e1); + vnormalize(norm); +} + +void rcMarkWalkableTriangles(const float walkableSlopeAngle, + const float* verts, int nv, + const int* tris, int nt, + unsigned char* flags) +{ + const float walkableThr = cosf(walkableSlopeAngle/180.0f*(float)M_PI); + + float norm[3]; + + for (int i = 0; i < nt; ++i) + { + const int* tri = &tris[i*3]; + calcTriNormal(&verts[tri[0]*3], &verts[tri[1]*3], &verts[tri[2]*3], norm); + // Check if the face is walkable. + if (norm[1] > walkableThr) + flags[i] |= RC_WALKABLE; + } +} + +static int getSpanCount(unsigned char flags, rcHeightfield& hf) +{ + const int w = hf.width; + const int h = hf.height; + int spanCount = 0; + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + for (rcSpan* s = hf.spans[x + y*w]; s; s = s->next) + { + if (s->flags == flags) + spanCount++; + } + } + } + return spanCount; +} + +inline void setCon(rcCompactSpan& s, int dir, int i) +{ + s.con &= ~(0xf << (dir*4)); + s.con |= (i&0xf) << (dir*4); +} + +bool rcBuildCompactHeightfield(const int walkableHeight, const int walkableClimb, + unsigned char flags, rcHeightfield& hf, + rcCompactHeightfield& chf) +{ + rcTimeVal startTime = rcGetPerformanceTimer(); + + const int w = hf.width; + const int h = hf.height; + const int spanCount = getSpanCount(flags, hf); + + // Fill in header. + chf.width = w; + chf.height = h; + chf.spanCount = spanCount; + chf.walkableHeight = walkableHeight; + chf.walkableClimb = walkableClimb; + chf.maxRegions = 0; + vcopy(chf.bmin, hf.bmin); + vcopy(chf.bmax, hf.bmax); + chf.bmax[1] += walkableHeight*hf.ch; + chf.cs = hf.cs; + chf.ch = hf.ch; + chf.cells = new rcCompactCell[w*h]; + if (!chf.cells) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "rcBuildCompactHeightfield: Out of memory 'chf.cells' (%d)", w*h); + return false; + } + memset(chf.cells, 0, sizeof(rcCompactCell)*w*h); + chf.spans = new rcCompactSpan[spanCount]; + if (!chf.spans) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "rcBuildCompactHeightfield: Out of memory 'chf.spans' (%d)", spanCount); + return false; + } + memset(chf.spans, 0, sizeof(rcCompactSpan)*spanCount); + + const int MAX_HEIGHT = 0xffff; + + // Fill in cells and spans. + int idx = 0; + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + const rcSpan* s = hf.spans[x + y*w]; + // If there are no spans at this cell, just leave the data to index=0, count=0. + if (!s) continue; + rcCompactCell& c = chf.cells[x+y*w]; + c.index = idx; + c.count = 0; + while (s) + { + if (s->flags == flags) + { + const int bot = (int)s->smax; + const int top = (int)s->next ? (int)s->next->smin : MAX_HEIGHT; + chf.spans[idx].y = (unsigned short)rcClamp(bot, 0, 0xffff); + chf.spans[idx].h = (unsigned char)rcClamp(top - bot, 0, 0xff); + idx++; + c.count++; + } + s = s->next; + } + } + } + + // Find neighbour connections. + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + const rcCompactCell& c = chf.cells[x+y*w]; + for (int i = (int)c.index, ni = (int)(c.index+c.count); i < ni; ++i) + { + rcCompactSpan& s = chf.spans[i]; + for (int dir = 0; dir < 4; ++dir) + { + setCon(s, dir, 0xf); + const int nx = x + rcGetDirOffsetX(dir); + const int ny = y + rcGetDirOffsetY(dir); + // First check that the neighbour cell is in bounds. + if (nx < 0 || ny < 0 || nx >= w || ny >= h) + continue; + // Iterate over all neighbour spans and check if any of the is + // accessible from current cell. + const rcCompactCell& nc = chf.cells[nx+ny*w]; + for (int k = (int)nc.index, nk = (int)(nc.index+nc.count); k < nk; ++k) + { + const rcCompactSpan& ns = chf.spans[k]; + const int bot = rcMax(s.y, ns.y); + const int top = rcMin(s.y+s.h, ns.y+ns.h); + + // Check that the gap between the spans is walkable, + // and that the climb height between the gaps is not too high. + if ((top - bot) >= walkableHeight && rcAbs((int)ns.y - (int)s.y) <= walkableClimb) + { + // Mark direction as walkable. + setCon(s, dir, k - (int)nc.index); + break; + } + } + } + } + } + } + + rcTimeVal endTime = rcGetPerformanceTimer(); + + if (rcGetBuildTimes()) + rcGetBuildTimes()->buildCompact += rcGetDeltaTimeUsec(startTime, endTime); + + return true; +} + +static int getHeightfieldMemoryUsage(const rcHeightfield& hf) +{ + int size = 0; + size += sizeof(hf); + size += hf.width * hf.height * sizeof(rcSpan*); + + rcSpanPool* pool = hf.pools; + while (pool) + { + size += (sizeof(rcSpanPool) - sizeof(rcSpan)) + sizeof(rcSpan)*RC_SPANS_PER_POOL; + pool = pool->next; + } + return size; +} + +static int getCompactHeightFieldMemoryusage(const rcCompactHeightfield& chf) +{ + int size = 0; + size += sizeof(rcCompactHeightfield); + size += sizeof(rcCompactSpan) * chf.spanCount; + size += sizeof(rcCompactCell) * chf.width * chf.height; + return size; +} diff --git a/extern/recastnavigation/Recast/Source/RecastContour.cpp b/extern/recastnavigation/Recast/Source/RecastContour.cpp new file mode 100644 index 00000000000..96f763a18f3 --- /dev/null +++ b/extern/recastnavigation/Recast/Source/RecastContour.cpp @@ -0,0 +1,732 @@ +// +// Copyright (c) 2009 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#define _USE_MATH_DEFINES +#include +#include +#include +#include "Recast.h" +#include "RecastLog.h" +#include "RecastTimer.h" + + +static int getCornerHeight(int x, int y, int i, int dir, + const rcCompactHeightfield& chf, + bool& isBorderVertex) +{ + const rcCompactSpan& s = chf.spans[i]; + int ch = (int)s.y; + int dirp = (dir+1) & 0x3; + + unsigned short regs[4] = {0,0,0,0}; + + regs[0] = s.reg; + + if (rcGetCon(s, dir) != 0xf) + { + const int ax = x + rcGetDirOffsetX(dir); + const int ay = y + rcGetDirOffsetY(dir); + const int ai = (int)chf.cells[ax+ay*chf.width].index + rcGetCon(s, dir); + const rcCompactSpan& as = chf.spans[ai]; + ch = rcMax(ch, (int)as.y); + regs[1] = as.reg; + if (rcGetCon(as, dirp) != 0xf) + { + const int ax2 = ax + rcGetDirOffsetX(dirp); + const int ay2 = ay + rcGetDirOffsetY(dirp); + const int ai2 = (int)chf.cells[ax2+ay2*chf.width].index + rcGetCon(as, dirp); + const rcCompactSpan& as2 = chf.spans[ai2]; + ch = rcMax(ch, (int)as2.y); + regs[2] = as2.reg; + } + } + if (rcGetCon(s, dirp) != 0xf) + { + const int ax = x + rcGetDirOffsetX(dirp); + const int ay = y + rcGetDirOffsetY(dirp); + const int ai = (int)chf.cells[ax+ay*chf.width].index + rcGetCon(s, dirp); + const rcCompactSpan& as = chf.spans[ai]; + ch = rcMax(ch, (int)as.y); + regs[3] = as.reg; + if (rcGetCon(as, dir) != 0xf) + { + const int ax2 = ax + rcGetDirOffsetX(dir); + const int ay2 = ay + rcGetDirOffsetY(dir); + const int ai2 = (int)chf.cells[ax2+ay2*chf.width].index + rcGetCon(as, dir); + const rcCompactSpan& as2 = chf.spans[ai2]; + ch = rcMax(ch, (int)as2.y); + regs[2] = as2.reg; + } + } + + // Check if the vertex is special edge vertex, these vertices will be removed later. + for (int j = 0; j < 4; ++j) + { + const int a = j; + const int b = (j+1) & 0x3; + const int c = (j+2) & 0x3; + const int d = (j+3) & 0x3; + + // The vertex is a border vertex there are two same exterior cells in a row, + // followed by two interior cells and none of the regions are out of bounds. + const bool twoSameExts = (regs[a] & regs[b] & RC_BORDER_REG) != 0 && regs[a] == regs[b]; + const bool twoInts = ((regs[c] | regs[d]) & RC_BORDER_REG) == 0; + const bool noZeros = regs[a] != 0 && regs[b] != 0 && regs[c] != 0 && regs[d] != 0; + if (twoSameExts && twoInts && noZeros) + { + isBorderVertex = true; + break; + } + } + + return ch; +} + +static void walkContour(int x, int y, int i, + rcCompactHeightfield& chf, + unsigned char* flags, rcIntArray& points) +{ + // Choose the first non-connected edge + unsigned char dir = 0; + while ((flags[i] & (1 << dir)) == 0) + dir++; + + unsigned char startDir = dir; + int starti = i; + + int iter = 0; + while (++iter < 40000) + { + if (flags[i] & (1 << dir)) + { + // Choose the edge corner + bool isBorderVertex = false; + int px = x; + int py = getCornerHeight(x, y, i, dir, chf, isBorderVertex); + int pz = y; + switch(dir) + { + case 0: pz++; break; + case 1: px++; pz++; break; + case 2: px++; break; + } + int r = 0; + const rcCompactSpan& s = chf.spans[i]; + if (rcGetCon(s, dir) != 0xf) + { + const int ax = x + rcGetDirOffsetX(dir); + const int ay = y + rcGetDirOffsetY(dir); + const int ai = (int)chf.cells[ax+ay*chf.width].index + rcGetCon(s, dir); + const rcCompactSpan& as = chf.spans[ai]; + r = (int)as.reg; + } + if (isBorderVertex) + r |= RC_BORDER_VERTEX; + points.push(px); + points.push(py); + points.push(pz); + points.push(r); + + flags[i] &= ~(1 << dir); // Remove visited edges + dir = (dir+1) & 0x3; // Rotate CW + } + else + { + int ni = -1; + const int nx = x + rcGetDirOffsetX(dir); + const int ny = y + rcGetDirOffsetY(dir); + const rcCompactSpan& s = chf.spans[i]; + if (rcGetCon(s, dir) != 0xf) + { + const rcCompactCell& nc = chf.cells[nx+ny*chf.width]; + ni = (int)nc.index + rcGetCon(s, dir); + } + if (ni == -1) + { + // Should not happen. + return; + } + x = nx; + y = ny; + i = ni; + dir = (dir+3) & 0x3; // Rotate CCW + } + + if (starti == i && startDir == dir) + { + break; + } + } +} + +static float distancePtSeg(int x, int y, int z, + int px, int py, int pz, + int qx, int qy, int qz) +{ +/* float pqx = (float)(qx - px); + float pqy = (float)(qy - py); + float pqz = (float)(qz - pz); + float dx = (float)(x - px); + float dy = (float)(y - py); + float dz = (float)(z - pz); + float d = pqx*pqx + pqy*pqy + pqz*pqz; + float t = pqx*dx + pqy*dy + pqz*dz; + if (d > 0) + t /= d; + if (t < 0) + t = 0; + else if (t > 1) + t = 1; + + dx = px + t*pqx - x; + dy = py + t*pqy - y; + dz = pz + t*pqz - z; + + return dx*dx + dy*dy + dz*dz;*/ + + float pqx = (float)(qx - px); + float pqz = (float)(qz - pz); + float dx = (float)(x - px); + float dz = (float)(z - pz); + float d = pqx*pqx + pqz*pqz; + float t = pqx*dx + pqz*dz; + if (d > 0) + t /= d; + if (t < 0) + t = 0; + else if (t > 1) + t = 1; + + dx = px + t*pqx - x; + dz = pz + t*pqz - z; + + return dx*dx + dz*dz; +} + +static void simplifyContour(rcIntArray& points, rcIntArray& simplified, float maxError, int maxEdgeLen) +{ + // Add initial points. + bool noConnections = true; + for (int i = 0; i < points.size(); i += 4) + { + if ((points[i+3] & 0xffff) != 0) + { + noConnections = false; + break; + } + } + + if (noConnections) + { + // If there is no connections at all, + // create some initial points for the simplification process. + // Find lower-left and upper-right vertices of the contour. + int llx = points[0]; + int lly = points[1]; + int llz = points[2]; + int lli = 0; + int urx = points[0]; + int ury = points[1]; + int urz = points[2]; + int uri = 0; + for (int i = 0; i < points.size(); i += 4) + { + int x = points[i+0]; + int y = points[i+1]; + int z = points[i+2]; + if (x < llx || (x == llx && z < llz)) + { + llx = x; + lly = y; + llz = z; + lli = i/4; + } + if (x >= urx || (x == urx && z > urz)) + { + urx = x; + ury = y; + urz = z; + uri = i/4; + } + } + simplified.push(llx); + simplified.push(lly); + simplified.push(llz); + simplified.push(lli); + + simplified.push(urx); + simplified.push(ury); + simplified.push(urz); + simplified.push(uri); + } + else + { + // The contour has some portals to other regions. + // Add a new point to every location where the region changes. + for (int i = 0, ni = points.size()/4; i < ni; ++i) + { + int ii = (i+1) % ni; + if ((points[i*4+3] & 0xffff) != (points[ii*4+3] & 0xffff)) + { + simplified.push(points[i*4+0]); + simplified.push(points[i*4+1]); + simplified.push(points[i*4+2]); + simplified.push(i); + } + } + } + + // Add points until all raw points are within + // error tolerance to the simplified shape. + const int pn = points.size()/4; + for (int i = 0; i < simplified.size()/4; ) + { + int ii = (i+1) % (simplified.size()/4); + + int ax = simplified[i*4+0]; + int ay = simplified[i*4+1]; + int az = simplified[i*4+2]; + int ai = simplified[i*4+3]; + + int bx = simplified[ii*4+0]; + int by = simplified[ii*4+1]; + int bz = simplified[ii*4+2]; + int bi = simplified[ii*4+3]; + + // Find maximum deviation from the segment. + float maxd = 0; + int maxi = -1; + int ci = (ai+1) % pn; + + // Tesselate only outer edges. + if ((points[ci*4+3] & 0xffff) == 0) + { + while (ci != bi) + { + float d = distancePtSeg(points[ci*4+0], points[ci*4+1]/4, points[ci*4+2], + ax, ay/4, az, bx, by/4, bz); + if (d > maxd) + { + maxd = d; + maxi = ci; + } + ci = (ci+1) % pn; + } + } + + + // If the max deviation is larger than accepted error, + // add new point, else continue to next segment. + if (maxi != -1 && maxd > (maxError*maxError)) + { + // Add space for the new point. + simplified.resize(simplified.size()+4); + int n = simplified.size()/4; + for (int j = n-1; j > i; --j) + { + simplified[j*4+0] = simplified[(j-1)*4+0]; + simplified[j*4+1] = simplified[(j-1)*4+1]; + simplified[j*4+2] = simplified[(j-1)*4+2]; + simplified[j*4+3] = simplified[(j-1)*4+3]; + } + // Add the point. + simplified[(i+1)*4+0] = points[maxi*4+0]; + simplified[(i+1)*4+1] = points[maxi*4+1]; + simplified[(i+1)*4+2] = points[maxi*4+2]; + simplified[(i+1)*4+3] = maxi; + } + else + { + ++i; + } + } + + // Split too long edges. + if (maxEdgeLen > 0) + { + for (int i = 0; i < simplified.size()/4; ) + { + int ii = (i+1) % (simplified.size()/4); + + int ax = simplified[i*4+0]; + int az = simplified[i*4+2]; + int ai = simplified[i*4+3]; + + int bx = simplified[ii*4+0]; + int bz = simplified[ii*4+2]; + int bi = simplified[ii*4+3]; + + // Find maximum deviation from the segment. + int maxi = -1; + int ci = (ai+1) % pn; + + // Tesselate only outer edges. + if ((points[ci*4+3] & 0xffff) == 0) + { + int dx = bx - ax; + int dz = bz - az; + if (dx*dx + dz*dz > maxEdgeLen*maxEdgeLen) + { + int n = bi < ai ? (bi+pn - ai) : (bi - ai); + maxi = (ai + n/2) % pn; + } + } + + // If the max deviation is larger than accepted error, + // add new point, else continue to next segment. + if (maxi != -1) + { + // Add space for the new point. + simplified.resize(simplified.size()+4); + int n = simplified.size()/4; + for (int j = n-1; j > i; --j) + { + simplified[j*4+0] = simplified[(j-1)*4+0]; + simplified[j*4+1] = simplified[(j-1)*4+1]; + simplified[j*4+2] = simplified[(j-1)*4+2]; + simplified[j*4+3] = simplified[(j-1)*4+3]; + } + // Add the point. + simplified[(i+1)*4+0] = points[maxi*4+0]; + simplified[(i+1)*4+1] = points[maxi*4+1]; + simplified[(i+1)*4+2] = points[maxi*4+2]; + simplified[(i+1)*4+3] = maxi; + } + else + { + ++i; + } + } + } + + for (int i = 0; i < simplified.size()/4; ++i) + { + // The edge vertex flag is take from the current raw point, + // and the neighbour region is take from the next raw point. + const int ai = (simplified[i*4+3]+1) % pn; + const int bi = simplified[i*4+3]; + simplified[i*4+3] = (points[ai*4+3] & 0xffff) | (points[bi*4+3] & RC_BORDER_VERTEX); + } + +} + +static void removeDegenerateSegments(rcIntArray& simplified) +{ + // Remove adjacent vertices which are equal on xz-plane, + // or else the triangulator will get confused. + for (int i = 0; i < simplified.size()/4; ++i) + { + int ni = i+1; + if (ni >= (simplified.size()/4)) + ni = 0; + + if (simplified[i*4+0] == simplified[ni*4+0] && + simplified[i*4+2] == simplified[ni*4+2]) + { + // Degenerate segment, remove. + for (int j = i; j < simplified.size()/4-1; ++j) + { + simplified[j*4+0] = simplified[(j+1)*4+0]; + simplified[j*4+1] = simplified[(j+1)*4+1]; + simplified[j*4+2] = simplified[(j+1)*4+2]; + simplified[j*4+3] = simplified[(j+1)*4+3]; + } + simplified.pop(); + } + } +} + +static int calcAreaOfPolygon2D(const int* verts, const int nverts) +{ + int area = 0; + for (int i = 0, j = nverts-1; i < nverts; j=i++) + { + const int* vi = &verts[i*4]; + const int* vj = &verts[j*4]; + area += vi[0] * vj[2] - vj[0] * vi[2]; + } + return (area+1) / 2; +} + +static void getClosestIndices(const int* vertsa, const int nvertsa, + const int* vertsb, const int nvertsb, + int& ia, int& ib) +{ + int closestDist = 0xfffffff; + for (int i = 0; i < nvertsa; ++i) + { + const int* va = &vertsa[i*4]; + for (int j = 0; j < nvertsb; ++j) + { + const int* vb = &vertsb[j*4]; + const int dx = vb[0] - va[0]; + const int dz = vb[2] - va[2]; + const int d = dx*dx + dz*dz; + if (d < closestDist) + { + ia = i; + ib = j; + closestDist = d; + } + } + } +} + +static bool mergeContours(rcContour& ca, rcContour& cb, int ia, int ib) +{ + const int maxVerts = ca.nverts + cb.nverts + 2; + int* verts = new int[maxVerts*4]; + if (!verts) + return false; + + int nv = 0; + + // Copy contour A. + for (int i = 0; i <= ca.nverts; ++i) + { + int* dst = &verts[nv*4]; + const int* src = &ca.verts[((ia+i)%ca.nverts)*4]; + dst[0] = src[0]; + dst[1] = src[1]; + dst[2] = src[2]; + dst[3] = src[3]; + nv++; + } + + // Copy contour B + for (int i = 0; i <= cb.nverts; ++i) + { + int* dst = &verts[nv*4]; + const int* src = &cb.verts[((ib+i)%cb.nverts)*4]; + dst[0] = src[0]; + dst[1] = src[1]; + dst[2] = src[2]; + dst[3] = src[3]; + nv++; + } + + delete [] ca.verts; + ca.verts = verts; + ca.nverts = nv; + + delete [] cb.verts; + cb.verts = 0; + cb.nverts = 0; + + return true; +} + +bool rcBuildContours(rcCompactHeightfield& chf, + const float maxError, const int maxEdgeLen, + rcContourSet& cset) +{ + const int w = chf.width; + const int h = chf.height; + + rcTimeVal startTime = rcGetPerformanceTimer(); + + vcopy(cset.bmin, chf.bmin); + vcopy(cset.bmax, chf.bmax); + cset.cs = chf.cs; + cset.ch = chf.ch; + + const int maxContours = chf.maxRegions*2; + cset.conts = new rcContour[maxContours]; + if (!cset.conts) + return false; + cset.nconts = 0; + + unsigned char* flags = new unsigned char[chf.spanCount]; + if (!flags) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "rcBuildContours: Out of memory 'flags'."); + return false; + } + + rcTimeVal traceStartTime = rcGetPerformanceTimer(); + + + // Mark boundaries. + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + const rcCompactCell& c = chf.cells[x+y*w]; + for (int i = (int)c.index, ni = (int)(c.index+c.count); i < ni; ++i) + { + unsigned char res = 0; + const rcCompactSpan& s = chf.spans[i]; + if (!s.reg || (s.reg & RC_BORDER_REG)) + { + flags[i] = 0; + continue; + } + for (int dir = 0; dir < 4; ++dir) + { + unsigned short r = 0; + if (rcGetCon(s, dir) != 0xf) + { + const int ax = x + rcGetDirOffsetX(dir); + const int ay = y + rcGetDirOffsetY(dir); + const int ai = (int)chf.cells[ax+ay*w].index + rcGetCon(s, dir); + const rcCompactSpan& as = chf.spans[ai]; + r = as.reg; + } + if (r == s.reg) + res |= (1 << dir); + } + flags[i] = res ^ 0xf; // Inverse, mark non connected edges. + } + } + } + + rcTimeVal traceEndTime = rcGetPerformanceTimer(); + + rcTimeVal simplifyStartTime = rcGetPerformanceTimer(); + + rcIntArray verts(256); + rcIntArray simplified(64); + + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + const rcCompactCell& c = chf.cells[x+y*w]; + for (int i = (int)c.index, ni = (int)(c.index+c.count); i < ni; ++i) + { + if (flags[i] == 0 || flags[i] == 0xf) + { + flags[i] = 0; + continue; + } + unsigned short reg = chf.spans[i].reg; + if (!reg || (reg & RC_BORDER_REG)) + continue; + + verts.resize(0); + simplified.resize(0); + walkContour(x, y, i, chf, flags, verts); + simplifyContour(verts, simplified, maxError, maxEdgeLen); + removeDegenerateSegments(simplified); + + // Store region->contour remap info. + // Create contour. + if (simplified.size()/4 >= 3) + { + if (cset.nconts >= maxContours) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "rcBuildContours: Too many contours %d, max %d.", cset.nconts, maxContours); + return false; + } + + rcContour* cont = &cset.conts[cset.nconts++]; + + cont->nverts = simplified.size()/4; + cont->verts = new int[cont->nverts*4]; + memcpy(cont->verts, &simplified[0], sizeof(int)*cont->nverts*4); + + cont->nrverts = verts.size()/4; + cont->rverts = new int[cont->nrverts*4]; + memcpy(cont->rverts, &verts[0], sizeof(int)*cont->nrverts*4); + +/* cont->cx = cont->cy = cont->cz = 0; + for (int i = 0; i < cont->nverts; ++i) + { + cont->cx += cont->verts[i*4+0]; + cont->cy += cont->verts[i*4+1]; + cont->cz += cont->verts[i*4+2]; + } + cont->cx /= cont->nverts; + cont->cy /= cont->nverts; + cont->cz /= cont->nverts;*/ + + cont->reg = reg; + } + } + } + } + + // Check and merge droppings. + // Sometimes the previous algorithms can fail and create several countours + // per area. This pass will try to merge the holes into the main region. + for (int i = 0; i < cset.nconts; ++i) + { + rcContour& cont = cset.conts[i]; + // Check if the contour is would backwards. + if (calcAreaOfPolygon2D(cont.verts, cont.nverts) < 0) + { + // Find another contour which has the same region ID. + int mergeIdx = -1; + for (int j = 0; j < cset.nconts; ++j) + { + if (i == j) continue; + if (cset.conts[j].nverts && cset.conts[j].reg == cont.reg) + { + // Make sure the polygon is correctly oriented. + if (calcAreaOfPolygon2D(cset.conts[j].verts, cset.conts[j].nverts)) + { + mergeIdx = j; + break; + } + } + } + if (mergeIdx == -1) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_WARNING, "rcBuildContours: Could not find merge target for bad contour %d.", i); + } + else + { + rcContour& mcont = cset.conts[mergeIdx]; + // Merge by closest points. + int ia, ib; + getClosestIndices(mcont.verts, mcont.nverts, cont.verts, cont.nverts, ia, ib); + if (!mergeContours(mcont, cont, ia, ib)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_WARNING, "rcBuildContours: Failed to merge contours %d and %d.", i, mergeIdx); + } + } + } + } + + + delete [] flags; + + rcTimeVal simplifyEndTime = rcGetPerformanceTimer(); + + rcTimeVal endTime = rcGetPerformanceTimer(); + +// if (rcGetLog()) +// { +// rcGetLog()->log(RC_LOG_PROGRESS, "Create contours: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f); +// rcGetLog()->log(RC_LOG_PROGRESS, " - boundary: %.3f ms", rcGetDeltaTimeUsec(boundaryStartTime, boundaryEndTime)/1000.0f); +// rcGetLog()->log(RC_LOG_PROGRESS, " - contour: %.3f ms", rcGetDeltaTimeUsec(contourStartTime, contourEndTime)/1000.0f); +// } + + if (rcGetBuildTimes()) + { + rcGetBuildTimes()->buildContours += rcGetDeltaTimeUsec(startTime, endTime); + rcGetBuildTimes()->buildContoursTrace += rcGetDeltaTimeUsec(traceStartTime, traceEndTime); + rcGetBuildTimes()->buildContoursSimplify += rcGetDeltaTimeUsec(simplifyStartTime, simplifyEndTime); + } + + return true; +} diff --git a/extern/recastnavigation/Recast/Source/RecastDebugDraw.cpp b/extern/recastnavigation/Recast/Source/RecastDebugDraw.cpp new file mode 100644 index 00000000000..fecee4c6172 --- /dev/null +++ b/extern/recastnavigation/Recast/Source/RecastDebugDraw.cpp @@ -0,0 +1,799 @@ +// +// Copyright (c) 2009 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#define _USE_MATH_DEFINES +#include +#include "RecastDebugDraw.h" +#include "SDL.h" +#include "SDL_Opengl.h" +#include "MeshLoaderObj.h" +#include "Recast.h" + +void rcDebugDrawMesh(const float* verts, int nverts, + const int* tris, const float* normals, int ntris, + const unsigned char* flags) +{ + glBegin(GL_TRIANGLES); + for (int i = 0; i < ntris*3; i += 3) + { + float a = (2+normals[i+0]+normals[i+1])/4; + if (flags && !flags[i/3]) + glColor3f(a,a*0.3f,a*0.1f); + else + glColor3f(a,a,a); + glVertex3fv(&verts[tris[i]*3]); + glVertex3fv(&verts[tris[i+1]*3]); + glVertex3fv(&verts[tris[i+2]*3]); + } + glEnd(); +} + +void rcDebugDrawMeshSlope(const float* verts, int nverts, + const int* tris, const float* normals, int ntris, + const float walkableSlopeAngle) +{ + const float walkableThr = cosf(walkableSlopeAngle/180.0f*(float)M_PI); + + glBegin(GL_TRIANGLES); + for (int i = 0; i < ntris*3; i += 3) + { + const float* norm = &normals[i]; + float a = (2+norm[0]+norm[1])/4; + if (norm[1] > walkableThr) + glColor3f(a,a,a); + else + glColor3f(a,a*0.3f,a*0.1f); + glVertex3fv(&verts[tris[i]*3]); + glVertex3fv(&verts[tris[i+1]*3]); + glVertex3fv(&verts[tris[i+2]*3]); + } + glEnd(); +} + +void drawBoxWire(float minx, float miny, float minz, float maxx, float maxy, float maxz, const float* col) +{ + glColor4fv(col); + + // Top + glVertex3f(minx, miny, minz); + glVertex3f(maxx, miny, minz); + glVertex3f(maxx, miny, minz); + glVertex3f(maxx, miny, maxz); + glVertex3f(maxx, miny, maxz); + glVertex3f(minx, miny, maxz); + glVertex3f(minx, miny, maxz); + glVertex3f(minx, miny, minz); + + // bottom + glVertex3f(minx, maxy, minz); + glVertex3f(maxx, maxy, minz); + glVertex3f(maxx, maxy, minz); + glVertex3f(maxx, maxy, maxz); + glVertex3f(maxx, maxy, maxz); + glVertex3f(minx, maxy, maxz); + glVertex3f(minx, maxy, maxz); + glVertex3f(minx, maxy, minz); + + // Sides + glVertex3f(minx, miny, minz); + glVertex3f(minx, maxy, minz); + glVertex3f(maxx, miny, minz); + glVertex3f(maxx, maxy, minz); + glVertex3f(maxx, miny, maxz); + glVertex3f(maxx, maxy, maxz); + glVertex3f(minx, miny, maxz); + glVertex3f(minx, maxy, maxz); +} + +void drawBox(float minx, float miny, float minz, float maxx, float maxy, float maxz, + const float* col1, const float* col2) +{ + float verts[8*3] = + { + minx, miny, minz, + maxx, miny, minz, + maxx, miny, maxz, + minx, miny, maxz, + minx, maxy, minz, + maxx, maxy, minz, + maxx, maxy, maxz, + minx, maxy, maxz, + }; + static const float dim[6] = + { + 0.95f, 0.55f, 0.65f, 0.85f, 0.65f, 0.85f, + }; + static const unsigned char inds[6*5] = + { + 0, 7, 6, 5, 4, + 1, 0, 1, 2, 3, + 2, 1, 5, 6, 2, + 3, 3, 7, 4, 0, + 4, 2, 6, 7, 3, + 5, 0, 4, 5, 1, + }; + + const unsigned char* in = inds; + for (int i = 0; i < 6; ++i) + { + float d = dim[*in]; in++; + if (i == 0) + glColor4f(d*col2[0],d*col2[1],d*col2[2], col2[3]); + else + glColor4f(d*col1[0],d*col1[1],d*col1[2], col1[3]); + glVertex3fv(&verts[*in*3]); in++; + glVertex3fv(&verts[*in*3]); in++; + glVertex3fv(&verts[*in*3]); in++; + glVertex3fv(&verts[*in*3]); in++; + } +} + +void rcDebugDrawCylinderWire(float minx, float miny, float minz, float maxx, float maxy, float maxz, const float* col) +{ + static const int NUM_SEG = 16; + float dir[NUM_SEG*2]; + for (int i = 0; i < NUM_SEG; ++i) + { + const float a = (float)i/(float)NUM_SEG*(float)M_PI*2; + dir[i*2] = cosf(a); + dir[i*2+1] = sinf(a); + } + + const float cx = (maxx + minx)/2; + const float cz = (maxz + minz)/2; + const float rx = (maxx - minx)/2; + const float rz = (maxz - minz)/2; + + glColor4fv(col); + glBegin(GL_LINES); + for (int i = 0, j=NUM_SEG-1; i < NUM_SEG; j=i++) + { + glVertex3f(cx+dir[j*2+0]*rx, miny, cz+dir[j*2+1]*rz); + glVertex3f(cx+dir[i*2+0]*rx, miny, cz+dir[i*2+1]*rz); + glVertex3f(cx+dir[j*2+0]*rx, maxy, cz+dir[j*2+1]*rz); + glVertex3f(cx+dir[i*2+0]*rx, maxy, cz+dir[i*2+1]*rz); + } + for (int i = 0; i < NUM_SEG; i += NUM_SEG/4) + { + glVertex3f(cx+dir[i*2+0]*rx, miny, cz+dir[i*2+1]*rz); + glVertex3f(cx+dir[i*2+0]*rx, maxy, cz+dir[i*2+1]*rz); + } + glEnd(); +} + +void rcDebugDrawBoxWire(float minx, float miny, float minz, float maxx, float maxy, float maxz, const float* col) +{ + glBegin(GL_LINES); + drawBoxWire(minx, miny, minz, maxx, maxy, maxz, col); + glEnd(); +} + +void rcDebugDrawBox(float minx, float miny, float minz, float maxx, float maxy, float maxz, + const float* col1, const float* col2) +{ + glBegin(GL_QUADS); + drawBox(minx, miny, minz, maxx, maxy, maxz, col1, col2); + glEnd(); +} + + +void rcDebugDrawHeightfieldSolid(const rcHeightfield& hf) +{ + static const float col0[4] = { 1,1,1,1 }; + + const float* orig = hf.bmin; + const float cs = hf.cs; + const float ch = hf.ch; + + const int w = hf.width; + const int h = hf.height; + + glBegin(GL_QUADS); + + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + float fx = orig[0] + x*cs; + float fz = orig[2] + y*cs; + const rcSpan* s = hf.spans[x + y*w]; + while (s) + { + drawBox(fx, orig[1]+s->smin*ch, fz, fx+cs, orig[1] + s->smax*ch, fz+cs, col0, col0); + s = s->next; + } + } + } + glEnd(); +} + +void rcDebugDrawHeightfieldWalkable(const rcHeightfield& hf) +{ + static const float col0[4] = { 1,1,1,1 }; + static const float col1[4] = { 0.25f,0.44f,0.5f,1 }; + + const float* orig = hf.bmin; + const float cs = hf.cs; + const float ch = hf.ch; + + const int w = hf.width; + const int h = hf.height; + + glBegin(GL_QUADS); + + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + float fx = orig[0] + x*cs; + float fz = orig[2] + y*cs; + const rcSpan* s = hf.spans[x + y*w]; + while (s) + { + bool csel = (s->flags & 0x1) == 0; + drawBox(fx, orig[1]+s->smin*ch, fz, fx+cs, orig[1] + s->smax*ch, fz+cs, col0, csel ? col0 : col1); + s = s->next; + } + } + } + glEnd(); +} + +void rcDebugDrawCompactHeightfieldSolid(const rcCompactHeightfield& chf) +{ + const float cs = chf.cs; + const float ch = chf.ch; + + glColor3ub(64,112,128); + + glBegin(GL_QUADS); + for (int y = 0; y < chf.height; ++y) + { + for (int x = 0; x < chf.width; ++x) + { + const float fx = chf.bmin[0] + x*cs; + const float fz = chf.bmin[2] + y*cs; + const rcCompactCell& c = chf.cells[x+y*chf.width]; + + for (unsigned i = c.index, ni = c.index+c.count; i < ni; ++i) + { + const rcCompactSpan& s = chf.spans[i]; + const float fy = chf.bmin[1] + (s.y+1)*ch; + glVertex3f(fx, fy, fz); + glVertex3f(fx, fy, fz+cs); + glVertex3f(fx+cs, fy, fz+cs); + glVertex3f(fx+cs, fy, fz); + } + } + } + glEnd(); +} + +void rcDebugDrawCompactHeightfieldRegions(const rcCompactHeightfield& chf) +{ + const float cs = chf.cs; + const float ch = chf.ch; + + float col[4] = { 1,1,1,1 }; + + glBegin(GL_QUADS); + for (int y = 0; y < chf.height; ++y) + { + for (int x = 0; x < chf.width; ++x) + { + const float fx = chf.bmin[0] + x*cs; + const float fz = chf.bmin[2] + y*cs; + const rcCompactCell& c = chf.cells[x+y*chf.width]; + + for (unsigned i = c.index, ni = c.index+c.count; i < ni; ++i) + { + const rcCompactSpan& s = chf.spans[i]; + if (s.reg) + { + intToCol(s.reg, col); + glColor4fv(col); + } + else + { + glColor4ub(0,0,0,128); + } + const float fy = chf.bmin[1] + (s.y+1)*ch; + glVertex3f(fx, fy, fz); + glVertex3f(fx, fy, fz+cs); + glVertex3f(fx+cs, fy, fz+cs); + glVertex3f(fx+cs, fy, fz); + } + } + } + glEnd(); +} + + +void rcDebugDrawCompactHeightfieldDistance(const rcCompactHeightfield& chf) +{ + const float cs = chf.cs; + const float ch = chf.ch; + + float maxd = chf.maxDistance; + if (maxd < 1.0f) maxd = 1; + float dscale = 1.0f / maxd; + + glBegin(GL_QUADS); + for (int y = 0; y < chf.height; ++y) + { + for (int x = 0; x < chf.width; ++x) + { + const float fx = chf.bmin[0] + x*cs; + const float fz = chf.bmin[2] + y*cs; + const rcCompactCell& c = chf.cells[x+y*chf.width]; + + for (unsigned i = c.index, ni = c.index+c.count; i < ni; ++i) + { + const rcCompactSpan& s = chf.spans[i]; + const float fy = chf.bmin[1] + (s.y+1)*ch; + float cd = (float)s.dist * dscale; + glColor3f(cd, cd, cd); + glVertex3f(fx, fy, fz); + glVertex3f(fx, fy, fz+cs); + glVertex3f(fx+cs, fy, fz+cs); + glVertex3f(fx+cs, fy, fz); + } + } + } + glEnd(); +} + +static void getContourCenter(const rcContour* cont, const float* orig, float cs, float ch, float* center) +{ + center[0] = 0; + center[1] = 0; + center[2] = 0; + if (!cont->nverts) + return; + for (int i = 0; i < cont->nverts; ++i) + { + const int* v = &cont->verts[i*4]; + center[0] += (float)v[0]; + center[1] += (float)v[1]; + center[2] += (float)v[2]; + } + const float s = 1.0f / cont->nverts; + center[0] *= s * cs; + center[1] *= s * ch; + center[2] *= s * cs; + center[0] += orig[0]; + center[1] += orig[1] + 4*ch; + center[2] += orig[2]; +} + +static const rcContour* findContourFromSet(const rcContourSet& cset, unsigned short reg) +{ + for (int i = 0; i < cset.nconts; ++i) + { + if (cset.conts[i].reg == reg) + return &cset.conts[i]; + } + return 0; +} + +static void drawArc(const float* p0, const float* p1) +{ + static const int NPTS = 8; + float pts[NPTS*3]; + float dir[3]; + vsub(dir, p1, p0); + const float len = sqrtf(vdistSqr(p0, p1)); + for (int i = 0; i < NPTS; ++i) + { + float u = (float)i / (float)(NPTS-1); + float* p = &pts[i*3]; + p[0] = p0[0] + dir[0] * u; + p[1] = p0[1] + dir[1] * u + (len/4) * (1-rcSqr(u*2-1)); + p[2] = p0[2] + dir[2] * u; + } + for (int i = 0; i < NPTS-1; ++i) + { + glVertex3fv(&pts[i*3]); + glVertex3fv(&pts[(i+1)*3]); + } +} + +void rcDrawArc(const float* p0, const float* p1) +{ + glBegin(GL_LINES); + drawArc(p0, p1); + glEnd(); +} + +void rcDebugDrawRegionConnections(const rcContourSet& cset, const float alpha) +{ + const float* orig = cset.bmin; + const float cs = cset.cs; + const float ch = cset.ch; + + // Draw centers + float pos[3], pos2[3]; + + glColor4ub(0,0,0,196); + + glLineWidth(2.0f); + glBegin(GL_LINES); + for (int i = 0; i < cset.nconts; ++i) + { + const rcContour* cont = &cset.conts[i]; + getContourCenter(cont, orig, cs, ch, pos); + for (int j = 0; j < cont->nverts; ++j) + { + const int* v = &cont->verts[j*4]; + if (v[3] == 0 || (unsigned short)v[3] < cont->reg) continue; + const rcContour* cont2 = findContourFromSet(cset, (unsigned short)v[3]); + if (cont2) + { + getContourCenter(cont2, orig, cs, ch, pos2); + drawArc(pos, pos2); + } + } + } + glEnd(); + + float col[4] = { 1,1,1,alpha }; + + glPointSize(7.0f); + glBegin(GL_POINTS); + for (int i = 0; i < cset.nconts; ++i) + { + const rcContour* cont = &cset.conts[i]; + intToCol(cont->reg, col); + col[0] *= 0.5f; + col[1] *= 0.5f; + col[2] *= 0.5f; + glColor4fv(col); + getContourCenter(cont, orig, cs, ch, pos); + glVertex3fv(pos); + } + glEnd(); + + + glLineWidth(1.0f); + glPointSize(1.0f); +} + +void rcDebugDrawRawContours(const rcContourSet& cset, const float alpha) +{ + const float* orig = cset.bmin; + const float cs = cset.cs; + const float ch = cset.ch; + float col[4] = { 1,1,1,alpha }; + glLineWidth(2.0f); + glPointSize(2.0f); + for (int i = 0; i < cset.nconts; ++i) + { + const rcContour& c = cset.conts[i]; + intToCol(c.reg, col); + glColor4fv(col); + glBegin(GL_LINE_LOOP); + for (int j = 0; j < c.nrverts; ++j) + { + const int* v = &c.rverts[j*4]; + float fx = orig[0] + v[0]*cs; + float fy = orig[1] + (v[1]+1+(i&1))*ch; + float fz = orig[2] + v[2]*cs; + glVertex3f(fx,fy,fz); + } + glEnd(); + + col[0] *= 0.5f; + col[1] *= 0.5f; + col[2] *= 0.5f; + glColor4fv(col); + + glBegin(GL_POINTS); + for (int j = 0; j < c.nrverts; ++j) + { + const int* v = &c.rverts[j*4]; + + float off = 0; + if (v[3] & RC_BORDER_VERTEX) + { + glColor4ub(255,255,255,255); + off = ch*2; + } + else + { + glColor4fv(col); + } + + float fx = orig[0] + v[0]*cs; + float fy = orig[1] + (v[1]+1+(i&1))*ch + off; + float fz = orig[2] + v[2]*cs; + glVertex3f(fx,fy,fz); + } + glEnd(); + } + glLineWidth(1.0f); + glPointSize(1.0f); +} + +void rcDebugDrawContours(const rcContourSet& cset, const float alpha) +{ + const float* orig = cset.bmin; + const float cs = cset.cs; + const float ch = cset.ch; + float col[4] = { 1,1,1,1 }; + glLineWidth(2.5f); + glPointSize(3.0f); + for (int i = 0; i < cset.nconts; ++i) + { + const rcContour& c = cset.conts[i]; + intToCol(c.reg, col); + glColor4fv(col); + + glBegin(GL_LINE_LOOP); + for (int j = 0; j < c.nverts; ++j) + { + const int* v = &c.verts[j*4]; + float fx = orig[0] + v[0]*cs; + float fy = orig[1] + (v[1]+1+(i&1))*ch; + float fz = orig[2] + v[2]*cs; + glVertex3f(fx,fy,fz); + } + glEnd(); + + col[0] *= 0.5f; + col[1] *= 0.5f; + col[2] *= 0.5f; + glColor4fv(col); + glBegin(GL_POINTS); + for (int j = 0; j < c.nverts; ++j) + { + const int* v = &c.verts[j*4]; + float off = 0; + if (v[3] & RC_BORDER_VERTEX) + { + glColor4ub(255,255,255,255); + off = ch*2; + } + else + { + glColor4fv(col); + } + + float fx = orig[0] + v[0]*cs; + float fy = orig[1] + (v[1]+1+(i&1))*ch + off; + float fz = orig[2] + v[2]*cs; + glVertex3f(fx,fy,fz); + } + glEnd(); + } + glLineWidth(1.0f); + glPointSize(1.0f); +} + +void rcDebugDrawPolyMesh(const struct rcPolyMesh& mesh) +{ + const int nvp = mesh.nvp; + const float cs = mesh.cs; + const float ch = mesh.ch; + const float* orig = mesh.bmin; + float col[4] = {1,1,1,0.75f}; + glBegin(GL_TRIANGLES); + for (int i = 0; i < mesh.npolys; ++i) + { + const unsigned short* p = &mesh.polys[i*nvp*2]; + intToCol(i, col); + glColor4fv(col); + unsigned short vi[3]; + for (int j = 2; j < nvp; ++j) + { + if (p[j] == 0xffff) break; + vi[0] = p[0]; + vi[1] = p[j-1]; + vi[2] = p[j]; + for (int k = 0; k < 3; ++k) + { + const unsigned short* v = &mesh.verts[vi[k]*3]; + const float x = orig[0] + v[0]*cs; + const float y = orig[1] + (v[1]+1)*ch; + const float z = orig[2] + v[2]*cs; + glVertex3f(x, y, z); + } + } + } + glEnd(); + + // Draw tri boundaries + glColor4ub(0,48,64,32); + glLineWidth(1.5f); + glBegin(GL_LINES); + for (int i = 0; i < mesh.npolys; ++i) + { + const unsigned short* poly = &mesh.polys[i*nvp*2]; + for (int j = 0; j < nvp; ++j) + { + if (poly[j] == 0xffff) break; + if (poly[nvp+j] == 0xffff) continue; + int vi[2]; + vi[0] = poly[j]; + if (j+1 >= nvp || poly[j+1] == 0xffff) + vi[1] = poly[0]; + else + vi[1] = poly[j+1]; + for (int k = 0; k < 2; ++k) + { + const unsigned short* v = &mesh.verts[vi[k]*3]; + const float x = orig[0] + v[0]*cs; + const float y = orig[1] + (v[1]+1)*ch + 0.1f; + const float z = orig[2] + v[2]*cs; + glVertex3f(x, y, z); + } + } + } + glEnd(); + + // Draw boundaries + glLineWidth(2.5f); + glColor4ub(0,48,64,220); + glBegin(GL_LINES); + for (int i = 0; i < mesh.npolys; ++i) + { + const unsigned short* poly = &mesh.polys[i*nvp*2]; + for (int j = 0; j < nvp; ++j) + { + if (poly[j] == 0xffff) break; + if (poly[nvp+j] != 0xffff) continue; + int vi[2]; + vi[0] = poly[j]; + if (j+1 >= nvp || poly[j+1] == 0xffff) + vi[1] = poly[0]; + else + vi[1] = poly[j+1]; + for (int k = 0; k < 2; ++k) + { + const unsigned short* v = &mesh.verts[vi[k]*3]; + const float x = orig[0] + v[0]*cs; + const float y = orig[1] + (v[1]+1)*ch + 0.1f; + const float z = orig[2] + v[2]*cs; + glVertex3f(x, y, z); + } + } + } + glEnd(); + glLineWidth(1.0f); + + glPointSize(3.0f); + glColor4ub(0,0,0,220); + glBegin(GL_POINTS); + for (int i = 0; i < mesh.nverts; ++i) + { + const unsigned short* v = &mesh.verts[i*3]; + const float x = orig[0] + v[0]*cs; + const float y = orig[1] + (v[1]+1)*ch + 0.1f; + const float z = orig[2] + v[2]*cs; + glVertex3f(x, y, z); + } + glEnd(); + glPointSize(1.0f); +} + +void rcDebugDrawPolyMeshDetail(const struct rcPolyMeshDetail& dmesh) +{ + float col[4] = {1,1,1,0.75f}; + + glBegin(GL_TRIANGLES); + for (int i = 0; i < dmesh.nmeshes; ++i) + { + const unsigned short* m = &dmesh.meshes[i*4]; + const unsigned short bverts = m[0]; + const unsigned short btris = m[2]; + const unsigned short ntris = m[3]; + const float* verts = &dmesh.verts[bverts*3]; + const unsigned char* tris = &dmesh.tris[btris*4]; + + intToCol(i, col); + glColor4fv(col); + for (int j = 0; j < ntris; ++j) + { + glVertex3fv(&verts[tris[j*4+0]*3]); + glVertex3fv(&verts[tris[j*4+1]*3]); + glVertex3fv(&verts[tris[j*4+2]*3]); + } + } + glEnd(); + + // Internal edges. + glLineWidth(1.0f); + glColor4ub(0,0,0,64); + glBegin(GL_LINES); + for (int i = 0; i < dmesh.nmeshes; ++i) + { + const unsigned short* m = &dmesh.meshes[i*4]; + const unsigned short bverts = m[0]; + const unsigned short btris = m[2]; + const unsigned short ntris = m[3]; + const float* verts = &dmesh.verts[bverts*3]; + const unsigned char* tris = &dmesh.tris[btris*4]; + + for (int j = 0; j < ntris; ++j) + { + const unsigned char* t = &tris[j*4]; + for (int k = 0, kp = 2; k < 3; kp=k++) + { + unsigned char ef = (t[3] >> (kp*2)) & 0x3; + if (ef == 0) + { + // Internal edge + if (t[kp] < t[k]) + { + glVertex3fv(&verts[t[kp]*3]); + glVertex3fv(&verts[t[k]*3]); + } + } + } + } + } + glEnd(); + + // External edges. + glLineWidth(2.0f); + glColor4ub(0,0,0,64); + glBegin(GL_LINES); + for (int i = 0; i < dmesh.nmeshes; ++i) + { + const unsigned short* m = &dmesh.meshes[i*4]; + const unsigned short bverts = m[0]; + const unsigned short btris = m[2]; + const unsigned short ntris = m[3]; + const float* verts = &dmesh.verts[bverts*3]; + const unsigned char* tris = &dmesh.tris[btris*4]; + + for (int j = 0; j < ntris; ++j) + { + const unsigned char* t = &tris[j*4]; + for (int k = 0, kp = 2; k < 3; kp=k++) + { + unsigned char ef = (t[3] >> (kp*2)) & 0x3; + if (ef != 0) + { + // Ext edge + glVertex3fv(&verts[t[kp]*3]); + glVertex3fv(&verts[t[k]*3]); + } + } + } + } + glEnd(); + + glLineWidth(1.0f); + + glPointSize(3.0f); + glBegin(GL_POINTS); + for (int i = 0; i < dmesh.nmeshes; ++i) + { + const unsigned short* m = &dmesh.meshes[i*4]; + const unsigned short bverts = m[0]; + const unsigned short nverts = m[1]; + const float* verts = &dmesh.verts[bverts*3]; + for (int j = 0; j < nverts; ++j) + { + glColor4ub(0,0,0,64); + glVertex3fv(&verts[j*3]); + } + } + glEnd(); + glPointSize(1.0f); +} diff --git a/extern/recastnavigation/Recast/Source/RecastFilter.cpp b/extern/recastnavigation/Recast/Source/RecastFilter.cpp new file mode 100644 index 00000000000..3421ea1899e --- /dev/null +++ b/extern/recastnavigation/Recast/Source/RecastFilter.cpp @@ -0,0 +1,249 @@ +// +// Copyright (c) 2009 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#define _USE_MATH_DEFINES +#include +#include +#include "Recast.h" +#include "RecastLog.h" +#include "RecastTimer.h" + + +void rcFilterLedgeSpans(const int walkableHeight, + const int walkableClimb, + rcHeightfield& solid) +{ + rcTimeVal startTime = rcGetPerformanceTimer(); + + const int w = solid.width; + const int h = solid.height; + const int MAX_HEIGHT = 0xffff; + + // Mark border spans. + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + for (rcSpan* s = solid.spans[x + y*w]; s; s = s->next) + { + // Skip non walkable spans. + if ((s->flags & RC_WALKABLE) == 0) + continue; + + const int bot = (int)s->smax; + const int top = (int)s->next ? (int)s->next->smin : MAX_HEIGHT; + + // Find neighbours minimum height. + int minh = MAX_HEIGHT; + + for (int dir = 0; dir < 4; ++dir) + { + int dx = x + rcGetDirOffsetX(dir); + int dy = y + rcGetDirOffsetY(dir); + // Skip neighbours which are out of bounds. + if (dx < 0 || dy < 0 || dx >= w || dy >= h) + { + minh = rcMin(minh, -walkableClimb - bot); + continue; + } + + // From minus infinity to the first span. + rcSpan* ns = solid.spans[dx + dy*w]; + int nbot = -walkableClimb; + int ntop = ns ? (int)ns->smin : MAX_HEIGHT; + // Skip neightbour if the gap between the spans is too small. + if (rcMin(top,ntop) - rcMax(bot,nbot) > walkableHeight) + minh = rcMin(minh, nbot - bot); + + // Rest of the spans. + for (ns = solid.spans[dx + dy*w]; ns; ns = ns->next) + { + nbot = (int)ns->smax; + ntop = (int)ns->next ? (int)ns->next->smin : MAX_HEIGHT; + // Skip neightbour if the gap between the spans is too small. + if (rcMin(top,ntop) - rcMax(bot,nbot) > walkableHeight) + minh = rcMin(minh, nbot - bot); + } + } + + // The current span is close to a ledge if the drop to any + // neighbour span is less than the walkableClimb. + if (minh < -walkableClimb) + s->flags &= ~RC_WALKABLE; + + } + } + } + + rcTimeVal endTime = rcGetPerformanceTimer(); +// if (rcGetLog()) +// rcGetLog()->log(RC_LOG_PROGRESS, "Filter border: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f); + if (rcGetBuildTimes()) + rcGetBuildTimes()->filterBorder += rcGetDeltaTimeUsec(startTime, endTime); +} + +void rcFilterWalkableLowHeightSpans(int walkableHeight, + rcHeightfield& solid) +{ + rcTimeVal startTime = rcGetPerformanceTimer(); + + const int w = solid.width; + const int h = solid.height; + const int MAX_HEIGHT = 0xffff; + + // Remove walkable flag from spans which do not have enough + // space above them for the agent to stand there. + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + for (rcSpan* s = solid.spans[x + y*w]; s; s = s->next) + { + const int bot = (int)s->smax; + const int top = (int)s->next ? (int)s->next->smin : MAX_HEIGHT; + if ((top - bot) <= walkableHeight) + s->flags &= ~RC_WALKABLE; + } + } + } + + rcTimeVal endTime = rcGetPerformanceTimer(); + +// if (rcGetLog()) +// rcGetLog()->log(RC_LOG_PROGRESS, "Filter walkable: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f); + if (rcGetBuildTimes()) + rcGetBuildTimes()->filterWalkable += rcGetDeltaTimeUsec(startTime, endTime); +} + + +struct rcReachableSeed +{ + inline void set(int ix, int iy, rcSpan* is) + { + x = (unsigned short)ix; + y = (unsigned short)iy; + s = is; + } + unsigned short x, y; + rcSpan* s; +}; + +bool rcMarkReachableSpans(const int walkableHeight, + const int walkableClimb, + rcHeightfield& solid) +{ + const int w = solid.width; + const int h = solid.height; + const int MAX_HEIGHT = 0xffff; + + rcTimeVal startTime = rcGetPerformanceTimer(); + + // Build navigable space. + const int MAX_SEEDS = w*h; + rcReachableSeed* stack = new rcReachableSeed[MAX_SEEDS]; + if (!stack) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "rcMarkReachableSpans: Out of memory 'stack' (%d).", MAX_SEEDS); + return false; + } + int stackSize = 0; + + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + rcSpan* topSpan = solid.spans[x + y*w]; + if (!topSpan) + continue; + while (topSpan->next) + topSpan = topSpan->next; + + // If the span is not walkable, skip it. + if ((topSpan->flags & RC_WALKABLE) == 0) + continue; + // If the span has been visited already, skip it. + if (topSpan->flags & RC_REACHABLE) + continue; + + // Start flood fill. + topSpan->flags |= RC_REACHABLE; + stackSize = 0; + stack[stackSize].set(x, y, topSpan); + stackSize++; + + while (stackSize) + { + // Pop a seed from the stack. + stackSize--; + rcReachableSeed cur = stack[stackSize]; + + const int bot = (int)cur.s->smax; + const int top = (int)cur.s->next ? (int)cur.s->next->smin : MAX_HEIGHT; + + // Visit neighbours in all 4 directions. + for (int dir = 0; dir < 4; ++dir) + { + int dx = (int)cur.x + rcGetDirOffsetX(dir); + int dy = (int)cur.y + rcGetDirOffsetY(dir); + // Skip neighbour which are out of bounds. + if (dx < 0 || dy < 0 || dx >= w || dy >= h) + continue; + for (rcSpan* ns = solid.spans[dx + dy*w]; ns; ns = ns->next) + { + // Skip neighbour if it is not walkable. + if ((ns->flags & RC_WALKABLE) == 0) + continue; + // Skip the neighbour if it has been visited already. + if (ns->flags & RC_REACHABLE) + continue; + + const int nbot = (int)ns->smax; + const int ntop = (int)ns->next ? (int)ns->next->smin : MAX_HEIGHT; + // Skip neightbour if the gap between the spans is too small. + if (rcMin(top,ntop) - rcMax(bot,nbot) < walkableHeight) + continue; + // Skip neightbour if the climb height to the neighbour is too high. + if (rcAbs(nbot - bot) >= walkableClimb) + continue; + + // This neighbour has not been visited yet. + // Mark it as reachable and add it to the seed stack. + ns->flags |= RC_REACHABLE; + if (stackSize < MAX_SEEDS) + { + stack[stackSize].set(dx, dy, ns); + stackSize++; + } + } + } + } + } + } + + delete [] stack; + + rcTimeVal endTime = rcGetPerformanceTimer(); + +// if (rcGetLog()) +// rcGetLog()->log(RC_LOG_PROGRESS, "Mark reachable: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f); + if (rcGetBuildTimes()) + rcGetBuildTimes()->filterMarkReachable += rcGetDeltaTimeUsec(startTime, endTime); + + return true; +} diff --git a/extern/recastnavigation/Recast/Source/RecastLog.cpp b/extern/recastnavigation/Recast/Source/RecastLog.cpp new file mode 100644 index 00000000000..27868042a1c --- /dev/null +++ b/extern/recastnavigation/Recast/Source/RecastLog.cpp @@ -0,0 +1,77 @@ +// +// Copyright (c) 2009 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#include "RecastLog.h" +#include +#include + +static rcLog* g_log = 0; +static rcBuildTimes* g_btimes = 0; + +rcLog::rcLog() : + m_messageCount(0), + m_textPoolSize(0) +{ +} + +rcLog::~rcLog() +{ + if (g_log == this) + g_log = 0; +} + +void rcLog::log(rcLogCategory category, const char* format, ...) +{ + if (m_messageCount >= MAX_MESSAGES) + return; + char* dst = &m_textPool[m_textPoolSize]; + int n = TEXT_POOL_SIZE - m_textPoolSize; + if (n < 2) + return; + // Store category + *dst = (char)category; + n--; + // Store message + va_list ap; + va_start(ap, format); + int ret = vsnprintf(dst+1, n-1, format, ap); + va_end(ap); + if (ret > 0) + m_textPoolSize += ret+2; + m_messages[m_messageCount++] = dst; +} + +void rcSetLog(rcLog* log) +{ + g_log = log; +} + +rcLog* rcGetLog() +{ + return g_log; +} + +void rcSetBuildTimes(rcBuildTimes* btimes) +{ + g_btimes = btimes; +} + +rcBuildTimes* rcGetBuildTimes() +{ + return g_btimes; +} diff --git a/extern/recastnavigation/Recast/Source/RecastMesh.cpp b/extern/recastnavigation/Recast/Source/RecastMesh.cpp new file mode 100644 index 00000000000..0bcca9314c6 --- /dev/null +++ b/extern/recastnavigation/Recast/Source/RecastMesh.cpp @@ -0,0 +1,1212 @@ +// +// Copyright (c) 2009 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#define _USE_MATH_DEFINES +#include +#include +#include +#include "Recast.h" +#include "RecastLog.h" +#include "RecastTimer.h" + + +struct rcEdge +{ + unsigned short vert[2]; + unsigned short polyEdge[2]; + unsigned short poly[2]; +}; + +static bool buildMeshAdjacency(unsigned short* polys, const int npolys, + const int nverts, const int vertsPerPoly) +{ + // Based on code by Eric Lengyel from: + // http://www.terathon.com/code/edges.php + + int maxEdgeCount = npolys*vertsPerPoly; + unsigned short* firstEdge = new unsigned short[nverts + maxEdgeCount]; + if (!firstEdge) + return false; + unsigned short* nextEdge = firstEdge + nverts; + int edgeCount = 0; + + rcEdge* edges = new rcEdge[maxEdgeCount]; + if (!edges) + return false; + + for (int i = 0; i < nverts; i++) + firstEdge[i] = 0xffff; + + // Invalida indices are marked as 0xffff, the following code + // handles them just fine. + + for (int i = 0; i < npolys; ++i) + { + unsigned short* t = &polys[i*vertsPerPoly*2]; + for (int j = 0; j < vertsPerPoly; ++j) + { + unsigned short v0 = t[j]; + unsigned short v1 = (j+1 >= vertsPerPoly || t[j+1] == 0xffff) ? t[0] : t[j+1]; + if (v0 < v1) + { + rcEdge& edge = edges[edgeCount]; + edge.vert[0] = v0; + edge.vert[1] = v1; + edge.poly[0] = (unsigned short)i; + edge.polyEdge[0] = (unsigned short)j; + edge.poly[1] = (unsigned short)i; + edge.polyEdge[1] = 0; + // Insert edge + nextEdge[edgeCount] = firstEdge[v0]; + firstEdge[v0] = edgeCount; + edgeCount++; + } + } + } + + for (int i = 0; i < npolys; ++i) + { + unsigned short* t = &polys[i*vertsPerPoly*2]; + for (int j = 0; j < vertsPerPoly; ++j) + { + unsigned short v0 = t[j]; + unsigned short v1 = (j+1 >= vertsPerPoly || t[j+1] == 0xffff) ? t[0] : t[j+1]; + if (v0 > v1) + { + for (unsigned short e = firstEdge[v1]; e != 0xffff; e = nextEdge[e]) + { + rcEdge& edge = edges[e]; + if (edge.vert[1] == v0 && edge.poly[0] == edge.poly[1]) + { + edge.poly[1] = (unsigned short)i; + edge.polyEdge[1] = (unsigned short)j; + break; + } + } + } + } + } + + // Store adjacency + for (int i = 0; i < edgeCount; ++i) + { + const rcEdge& e = edges[i]; + if (e.poly[0] != e.poly[1]) + { + unsigned short* p0 = &polys[e.poly[0]*vertsPerPoly*2]; + unsigned short* p1 = &polys[e.poly[1]*vertsPerPoly*2]; + p0[vertsPerPoly + e.polyEdge[0]] = e.poly[1]; + p1[vertsPerPoly + e.polyEdge[1]] = e.poly[0]; + } + } + + delete [] firstEdge; + delete [] edges; + + return true; +} + + +static const int VERTEX_BUCKET_COUNT = (1<<12); + +inline int computeVertexHash(int x, int y, int z) +{ + const unsigned int h1 = 0x8da6b343; // Large multiplicative constants; + const unsigned int h2 = 0xd8163841; // here arbitrarily chosen primes + const unsigned int h3 = 0xcb1ab31f; + unsigned int n = h1 * x + h2 * y + h3 * z; + return (int)(n & (VERTEX_BUCKET_COUNT-1)); +} + +static int addVertex(unsigned short x, unsigned short y, unsigned short z, + unsigned short* verts, int* firstVert, int* nextVert, int& nv) +{ + int bucket = computeVertexHash(x, 0, z); + int i = firstVert[bucket]; + + while (i != -1) + { + const unsigned short* v = &verts[i*3]; + if (v[0] == x && (rcAbs(v[1] - y) <= 2) && v[2] == z) + return i; + i = nextVert[i]; // next + } + + // Could not find, create new. + i = nv; nv++; + unsigned short* v = &verts[i*3]; + v[0] = x; + v[1] = y; + v[2] = z; + nextVert[i] = firstVert[bucket]; + firstVert[bucket] = i; + + return i; +} + +inline int prev(int i, int n) { return i-1 >= 0 ? i-1 : n-1; } +inline int next(int i, int n) { return i+1 < n ? i+1 : 0; } + +inline int area2(const int* a, const int* b, const int* c) +{ + return (b[0] - a[0]) * (c[2] - a[2]) - (c[0] - a[0]) * (b[2] - a[2]); +} + +// Exclusive or: true iff exactly one argument is true. +// The arguments are negated to ensure that they are 0/1 +// values. Then the bitwise Xor operator may apply. +// (This idea is due to Michael Baldwin.) +inline bool xorb(bool x, bool y) +{ + return !x ^ !y; +} + +// Returns true iff c is strictly to the left of the directed +// line through a to b. +inline bool left(const int* a, const int* b, const int* c) +{ + return area2(a, b, c) < 0; +} + +inline bool leftOn(const int* a, const int* b, const int* c) +{ + return area2(a, b, c) <= 0; +} + +inline bool collinear(const int* a, const int* b, const int* c) +{ + return area2(a, b, c) == 0; +} + +// Returns true iff ab properly intersects cd: they share +// a point interior to both segments. The properness of the +// intersection is ensured by using strict leftness. +bool intersectProp(const int* a, const int* b, const int* c, const int* d) +{ + // Eliminate improper cases. + if (collinear(a,b,c) || collinear(a,b,d) || + collinear(c,d,a) || collinear(c,d,b)) + return false; + + return xorb(left(a,b,c), left(a,b,d)) && xorb(left(c,d,a), left(c,d,b)); +} + +// Returns T iff (a,b,c) are collinear and point c lies +// on the closed segement ab. +static bool between(const int* a, const int* b, const int* c) +{ + if (!collinear(a, b, c)) + return false; + // If ab not vertical, check betweenness on x; else on y. + if (a[0] != b[0]) + return ((a[0] <= c[0]) && (c[0] <= b[0])) || ((a[0] >= c[0]) && (c[0] >= b[0])); + else + return ((a[2] <= c[2]) && (c[2] <= b[2])) || ((a[2] >= c[2]) && (c[2] >= b[2])); +} + +// Returns true iff segments ab and cd intersect, properly or improperly. +static bool intersect(const int* a, const int* b, const int* c, const int* d) +{ + if (intersectProp(a, b, c, d)) + return true; + else if (between(a, b, c) || between(a, b, d) || + between(c, d, a) || between(c, d, b)) + return true; + else + return false; +} + +static bool vequal(const int* a, const int* b) +{ + return a[0] == b[0] && a[2] == b[2]; +} + +// Returns T iff (v_i, v_j) is a proper internal *or* external +// diagonal of P, *ignoring edges incident to v_i and v_j*. +static bool diagonalie(int i, int j, int n, const int* verts, int* indices) +{ + const int* d0 = &verts[(indices[i] & 0x0fffffff) * 4]; + const int* d1 = &verts[(indices[j] & 0x0fffffff) * 4]; + + // For each edge (k,k+1) of P + for (int k = 0; k < n; k++) + { + int k1 = next(k, n); + // Skip edges incident to i or j + if (!((k == i) || (k1 == i) || (k == j) || (k1 == j))) + { + const int* p0 = &verts[(indices[k] & 0x0fffffff) * 4]; + const int* p1 = &verts[(indices[k1] & 0x0fffffff) * 4]; + + if (vequal(d0, p0) || vequal(d1, p0) || vequal(d0, p1) || vequal(d1, p1)) + continue; + + if (intersect(d0, d1, p0, p1)) + return false; + } + } + return true; +} + +// Returns true iff the diagonal (i,j) is strictly internal to the +// polygon P in the neighborhood of the i endpoint. +static bool inCone(int i, int j, int n, const int* verts, int* indices) +{ + const int* pi = &verts[(indices[i] & 0x0fffffff) * 4]; + const int* pj = &verts[(indices[j] & 0x0fffffff) * 4]; + const int* pi1 = &verts[(indices[next(i, n)] & 0x0fffffff) * 4]; + const int* pin1 = &verts[(indices[prev(i, n)] & 0x0fffffff) * 4]; + + // If P[i] is a convex vertex [ i+1 left or on (i-1,i) ]. + if (leftOn(pin1, pi, pi1)) + return left(pi, pj, pin1) && left(pj, pi, pi1); + // Assume (i-1,i,i+1) not collinear. + // else P[i] is reflex. + return !(leftOn(pi, pj, pi1) && leftOn(pj, pi, pin1)); +} + +// Returns T iff (v_i, v_j) is a proper internal +// diagonal of P. +static bool diagonal(int i, int j, int n, const int* verts, int* indices) +{ + return inCone(i, j, n, verts, indices) && diagonalie(i, j, n, verts, indices); +} + +int triangulate(int n, const int* verts, int* indices, int* tris) +{ + int ntris = 0; + int* dst = tris; + + // The last bit of the index is used to indicate if the vertex can be removed. + for (int i = 0; i < n; i++) + { + int i1 = next(i, n); + int i2 = next(i1, n); + if (diagonal(i, i2, n, verts, indices)) + indices[i1] |= 0x80000000; + } + + while (n > 3) + { + int minLen = -1; + int mini = -1; + for (int i = 0; i < n; i++) + { + int i1 = next(i, n); + if (indices[i1] & 0x80000000) + { + const int* p0 = &verts[(indices[i] & 0x0fffffff) * 4]; + const int* p2 = &verts[(indices[next(i1, n)] & 0x0fffffff) * 4]; + + int dx = p2[0] - p0[0]; + int dy = p2[2] - p0[2]; + int len = dx*dx + dy*dy; + + if (minLen < 0 || len < minLen) + { + minLen = len; + mini = i; + } + } + } + + if (mini == -1) + { + // Should not happen. + if (rcGetLog()) + rcGetLog()->log(RC_LOG_WARNING, "triangulate: Failed to triangulate polygon."); +/* printf("mini == -1 ntris=%d n=%d\n", ntris, n); + for (int i = 0; i < n; i++) + { + printf("%d ", indices[i] & 0x0fffffff); + } + printf("\n");*/ + return -ntris; + } + + int i = mini; + int i1 = next(i, n); + int i2 = next(i1, n); + + *dst++ = indices[i] & 0x0fffffff; + *dst++ = indices[i1] & 0x0fffffff; + *dst++ = indices[i2] & 0x0fffffff; + ntris++; + + // Removes P[i1] by copying P[i+1]...P[n-1] left one index. + n--; + for (int k = i1; k < n; k++) + indices[k] = indices[k+1]; + + if (i1 >= n) i1 = 0; + i = prev(i1,n); + // Update diagonal flags. + if (diagonal(prev(i, n), i1, n, verts, indices)) + indices[i] |= 0x80000000; + else + indices[i] &= 0x0fffffff; + + if (diagonal(i, next(i1, n), n, verts, indices)) + indices[i1] |= 0x80000000; + else + indices[i1] &= 0x0fffffff; + } + + // Append the remaining triangle. + *dst++ = indices[0] & 0x0fffffff; + *dst++ = indices[1] & 0x0fffffff; + *dst++ = indices[2] & 0x0fffffff; + ntris++; + + return ntris; +} + +static int countPolyVerts(const unsigned short* p, const int nvp) +{ + for (int i = 0; i < nvp; ++i) + if (p[i] == 0xffff) + return i; + return nvp; +} + +inline bool uleft(const unsigned short* a, const unsigned short* b, const unsigned short* c) +{ + return ((int)b[0] - (int)a[0]) * ((int)c[2] - (int)a[2]) - + ((int)c[0] - (int)a[0]) * ((int)b[2] - (int)a[2]) < 0; +} + +static int getPolyMergeValue(unsigned short* pa, unsigned short* pb, + const unsigned short* verts, int& ea, int& eb, + const int nvp) +{ + const int na = countPolyVerts(pa, nvp); + const int nb = countPolyVerts(pb, nvp); + + // If the merged polygon would be too big, do not merge. + if (na+nb-2 > nvp) + return -1; + + // Check if the polygons share an edge. + ea = -1; + eb = -1; + + for (int i = 0; i < na; ++i) + { + unsigned short va0 = pa[i]; + unsigned short va1 = pa[(i+1) % na]; + if (va0 > va1) + rcSwap(va0, va1); + for (int j = 0; j < nb; ++j) + { + unsigned short vb0 = pb[j]; + unsigned short vb1 = pb[(j+1) % nb]; + if (vb0 > vb1) + rcSwap(vb0, vb1); + if (va0 == vb0 && va1 == vb1) + { + ea = i; + eb = j; + break; + } + } + } + + // No common edge, cannot merge. + if (ea == -1 || eb == -1) + return -1; + + // Check to see if the merged polygon would be convex. + unsigned short va, vb, vc; + + va = pa[(ea+na-1) % na]; + vb = pa[ea]; + vc = pb[(eb+2) % nb]; + if (!uleft(&verts[va*3], &verts[vb*3], &verts[vc*3])) + return -1; + + va = pb[(eb+nb-1) % nb]; + vb = pb[eb]; + vc = pa[(ea+2) % na]; + if (!uleft(&verts[va*3], &verts[vb*3], &verts[vc*3])) + return -1; + + va = pa[ea]; + vb = pa[(ea+1)%na]; + + int dx = (int)verts[va*3+0] - (int)verts[vb*3+0]; + int dy = (int)verts[va*3+2] - (int)verts[vb*3+2]; + + return dx*dx + dy*dy; +} + +static void mergePolys(unsigned short* pa, unsigned short* pb, + const unsigned short* verts, int ea, int eb, + unsigned short* tmp, const int nvp) +{ + const int na = countPolyVerts(pa, nvp); + const int nb = countPolyVerts(pb, nvp); + + // Merge polygons. + memset(tmp, 0xff, sizeof(unsigned short)*nvp); + int n = 0; + // Add pa + for (int i = 0; i < na-1; ++i) + tmp[n++] = pa[(ea+1+i) % na]; + // Add pb + for (int i = 0; i < nb-1; ++i) + tmp[n++] = pb[(eb+1+i) % nb]; + + memcpy(pa, tmp, sizeof(unsigned short)*nvp); +} + +static void pushFront(int v, int* arr, int& an) +{ + an++; + for (int i = an-1; i > 0; --i) arr[i] = arr[i-1]; + arr[0] = v; +} + +static void pushBack(int v, int* arr, int& an) +{ + arr[an] = v; + an++; +} + +static bool removeVertex(rcPolyMesh& mesh, const unsigned short rem, const int maxTris) +{ + static const int nvp = mesh.nvp; + + int* edges = 0; + int nedges = 0; + int* hole = 0; + int nhole = 0; + int* hreg = 0; + int nhreg = 0; + int* tris = 0; + int* tverts = 0; + int* thole = 0; + unsigned short* polys = 0; + unsigned short* pregs = 0; + int npolys = 0; + + // Count number of polygons to remove. + int nrem = 0; + for (int i = 0; i < mesh.npolys; ++i) + { + unsigned short* p = &mesh.polys[i*nvp*2]; + for (int j = 0; j < nvp; ++j) + if (p[j] == rem) { nrem++; break; } + } + + edges = new int[nrem*nvp*3]; + if (!edges) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_WARNING, "removeVertex: Out of memory 'edges' (%d).", nrem*nvp*3); + goto failure; + } + + hole = new int[nrem*nvp]; + if (!hole) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_WARNING, "removeVertex: Out of memory 'hole' (%d).", nrem*nvp); + goto failure; + } + hreg = new int[nrem*nvp]; + if (!hreg) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_WARNING, "removeVertex: Out of memory 'hreg' (%d).", nrem*nvp); + goto failure; + } + + + for (int i = 0; i < mesh.npolys; ++i) + { + unsigned short* p = &mesh.polys[i*nvp*2]; + const int nv = countPolyVerts(p, nvp); + bool hasRem = false; + for (int j = 0; j < nv; ++j) + if (p[j] == rem) hasRem = true; + if (hasRem) + { + // Collect edges which does not touch the removed vertex. + for (int j = 0, k = nv-1; j < nv; k = j++) + { + if (p[j] != rem && p[k] != rem) + { + int* e = &edges[nedges*3]; + e[0] = p[k]; + e[1] = p[j]; + e[2] = mesh.regs[i]; + nedges++; + } + } + // Remove the polygon. + unsigned short* p2 = &mesh.polys[(mesh.npolys-1)*nvp*2]; + memcpy(p,p2,sizeof(unsigned short)*nvp); + mesh.regs[i] = mesh.regs[mesh.npolys-1]; + mesh.npolys--; + --i; + } + } + + // Remove vertex. + for (int i = (int)rem; i < mesh.nverts; ++i) + { + mesh.verts[i*3+0] = mesh.verts[(i+1)*3+0]; + mesh.verts[i*3+1] = mesh.verts[(i+1)*3+1]; + mesh.verts[i*3+2] = mesh.verts[(i+1)*3+2]; + } + mesh.nverts--; + + // Adjust indices to match the removed vertex layout. + for (int i = 0; i < mesh.npolys; ++i) + { + unsigned short* p = &mesh.polys[i*nvp*2]; + const int nv = countPolyVerts(p, nvp); + for (int j = 0; j < nv; ++j) + if (p[j] > rem) p[j]--; + } + for (int i = 0; i < nedges; ++i) + { + if (edges[i*3+0] > rem) edges[i*3+0]--; + if (edges[i*3+1] > rem) edges[i*3+1]--; + } + + if (nedges == 0) + return true; + + hole[nhole] = edges[0]; + hreg[nhole] = edges[2]; + nhole++; + + while (nedges) + { + bool match = false; + + for (int i = 0; i < nedges; ++i) + { + const int ea = edges[i*3+0]; + const int eb = edges[i*3+1]; + const int r = edges[i*3+2]; + bool add = false; + if (hole[0] == eb) + { + pushFront(ea, hole, nhole); + pushFront(r, hreg, nhreg); + add = true; + } + else if (hole[nhole-1] == ea) + { + pushBack(eb, hole, nhole); + pushBack(r, hreg, nhreg); + add = true; + } + if (add) + { + // Remove edge. + edges[i*3+0] = edges[(nedges-1)*3+0]; + edges[i*3+1] = edges[(nedges-1)*3+1]; + edges[i*3+2] = edges[(nedges-1)*3+2]; + --nedges; + match = true; + --i; + } + } + + if (!match) + break; + } + + tris = new int[nhole*3]; + if (!tris) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_WARNING, "removeVertex: Out of memory 'tris' (%d).", nhole*3); + goto failure; + } + + tverts = new int[nhole*4]; + if (!tverts) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_WARNING, "removeVertex: Out of memory 'tverts' (%d).", nhole*4); + goto failure; + } + + thole = new int[nhole]; + if (!tverts) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_WARNING, "removeVertex: Out of memory 'thole' (%d).", nhole); + goto failure; + } + + // Generate temp vertex array for triangulation. + for (int i = 0; i < nhole; ++i) + { + const int pi = hole[i]; + tverts[i*4+0] = mesh.verts[pi*3+0]; + tverts[i*4+1] = mesh.verts[pi*3+1]; + tverts[i*4+2] = mesh.verts[pi*3+2]; + tverts[i*4+3] = 0; + thole[i] = i; + } + + // Triangulate the hole. + int ntris = triangulate(nhole, &tverts[0], &thole[0], tris); + + // Merge the hole triangles back to polygons. + polys = new unsigned short[(ntris+1)*nvp]; + if (!polys) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_WARNING, "removeVertex: Out of memory 'polys' (%d).", (ntris+1)*nvp); + goto failure; + } + pregs = new unsigned short[ntris]; + if (!pregs) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_WARNING, "removeVertex: Out of memory 'pregs' (%d).", ntris); + goto failure; + } + + unsigned short* tmpPoly = &polys[ntris*nvp]; + + // Build initial polygons. + memset(polys, 0xff, ntris*nvp*sizeof(unsigned short)); + for (int j = 0; j < ntris; ++j) + { + int* t = &tris[j*3]; + if (t[0] != t[1] && t[0] != t[2] && t[1] != t[2]) + { + polys[npolys*nvp+0] = (unsigned short)hole[t[0]]; + polys[npolys*nvp+1] = (unsigned short)hole[t[1]]; + polys[npolys*nvp+2] = (unsigned short)hole[t[2]]; + pregs[npolys] = hreg[t[0]]; + npolys++; + } + } + if (!npolys) + return true; + + // Merge polygons. + if (nvp > 3) + { + while (true) + { + // Find best polygons to merge. + int bestMergeVal = 0; + int bestPa, bestPb, bestEa, bestEb; + + for (int j = 0; j < npolys-1; ++j) + { + unsigned short* pj = &polys[j*nvp]; + for (int k = j+1; k < npolys; ++k) + { + unsigned short* pk = &polys[k*nvp]; + int ea, eb; + int v = getPolyMergeValue(pj, pk, mesh.verts, ea, eb, nvp); + if (v > bestMergeVal) + { + bestMergeVal = v; + bestPa = j; + bestPb = k; + bestEa = ea; + bestEb = eb; + } + } + } + + if (bestMergeVal > 0) + { + // Found best, merge. + unsigned short* pa = &polys[bestPa*nvp]; + unsigned short* pb = &polys[bestPb*nvp]; + mergePolys(pa, pb, mesh.verts, bestEa, bestEb, tmpPoly, nvp); + memcpy(pb, &polys[(npolys-1)*nvp], sizeof(unsigned short)*nvp); + pregs[bestPb] = pregs[npolys-1]; + npolys--; + } + else + { + // Could not merge any polygons, stop. + break; + } + } + } + + // Store polygons. + for (int i = 0; i < npolys; ++i) + { + if (mesh.npolys >= maxTris) break; + unsigned short* p = &mesh.polys[mesh.npolys*nvp*2]; + memset(p,0xff,sizeof(unsigned short)*nvp*2); + for (int j = 0; j < nvp; ++j) + p[j] = polys[i*nvp+j]; + mesh.regs[mesh.npolys] = pregs[i]; + mesh.npolys++; + } + + delete [] edges; + delete [] hole; + delete [] hreg; + delete [] tris; + delete [] thole; + delete [] tverts; + delete [] polys; + delete [] pregs; + + return true; + +failure: + delete [] edges; + delete [] hole; + delete [] hreg; + delete [] tris; + delete [] thole; + delete [] tverts; + delete [] polys; + delete [] pregs; + + return false; +} + + +bool rcBuildPolyMesh(rcContourSet& cset, int nvp, rcPolyMesh& mesh) +{ + rcTimeVal startTime = rcGetPerformanceTimer(); + + vcopy(mesh.bmin, cset.bmin); + vcopy(mesh.bmax, cset.bmax); + mesh.cs = cset.cs; + mesh.ch = cset.ch; + + int maxVertices = 0; + int maxTris = 0; + int maxVertsPerCont = 0; + for (int i = 0; i < cset.nconts; ++i) + { + maxVertices += cset.conts[i].nverts; + maxTris += cset.conts[i].nverts - 2; + maxVertsPerCont = rcMax(maxVertsPerCont, cset.conts[i].nverts); + } + + if (maxVertices >= 0xfffe) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMesh: Too many vertices %d.", maxVertices); + return false; + } + + unsigned char* vflags = 0; + int* nextVert = 0; + int* firstVert = 0; + int* indices = 0; + int* tris = 0; + unsigned short* polys = 0; + + vflags = new unsigned char[maxVertices]; + if (!vflags) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMesh: Out of memory 'mesh.verts' (%d).", maxVertices); + goto failure; + } + memset(vflags, 0, maxVertices); + + mesh.verts = new unsigned short[maxVertices*3]; + if (!mesh.verts) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMesh: Out of memory 'mesh.verts' (%d).", maxVertices); + goto failure; + } + mesh.polys = new unsigned short[maxTris*nvp*2]; + if (!mesh.polys) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMesh: Out of memory 'mesh.polys' (%d).", maxTris*nvp*2); + goto failure; + } + mesh.regs = new unsigned short[maxTris]; + if (!mesh.regs) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMesh: Out of memory 'mesh.regs' (%d).", maxTris); + goto failure; + } + mesh.nverts = 0; + mesh.npolys = 0; + mesh.nvp = nvp; + + memset(mesh.verts, 0, sizeof(unsigned short)*maxVertices*3); + memset(mesh.polys, 0xff, sizeof(unsigned short)*maxTris*nvp*2); + memset(mesh.regs, 0, sizeof(unsigned short)*maxTris); + + nextVert = new int[maxVertices]; + if (!nextVert) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMesh: Out of memory 'nextVert' (%d).", maxVertices); + goto failure; + } + memset(nextVert, 0, sizeof(int)*maxVertices); + + firstVert = new int[VERTEX_BUCKET_COUNT]; + if (!firstVert) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMesh: Out of memory 'firstVert' (%d).", VERTEX_BUCKET_COUNT); + goto failure; + } + for (int i = 0; i < VERTEX_BUCKET_COUNT; ++i) + firstVert[i] = -1; + + indices = new int[maxVertsPerCont]; + if (!indices) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMesh: Out of memory 'indices' (%d).", maxVertsPerCont); + goto failure; + } + tris = new int[maxVertsPerCont*3]; + if (!tris) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMesh: Out of memory 'tris' (%d).", maxVertsPerCont*3); + goto failure; + } + polys = new unsigned short[(maxVertsPerCont+1)*nvp]; + if (!polys) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMesh: Out of memory 'polys' (%d).", maxVertsPerCont*nvp); + goto failure; + } + unsigned short* tmpPoly = &polys[maxVertsPerCont*nvp]; + + for (int i = 0; i < cset.nconts; ++i) + { + rcContour& cont = cset.conts[i]; + + // Skip empty contours. + if (cont.nverts < 3) + continue; + + // Triangulate contour + for (int j = 0; j < cont.nverts; ++j) + indices[j] = j; + + int ntris = triangulate(cont.nverts, cont.verts, &indices[0], &tris[0]); + if (ntris <= 0) + { + // Bad triangulation, should not happen. +/* for (int k = 0; k < cont.nverts; ++k) + { + const int* v = &cont.verts[k*4]; + printf("\t\t%d,%d,%d,%d,\n", v[0], v[1], v[2], v[3]); + if (nBadPos < 100) + { + badPos[nBadPos*3+0] = v[0]; + badPos[nBadPos*3+1] = v[1]; + badPos[nBadPos*3+2] = v[2]; + nBadPos++; + } + }*/ + ntris = -ntris; + } + // Add and merge vertices. + for (int j = 0; j < cont.nverts; ++j) + { + const int* v = &cont.verts[j*4]; + indices[j] = addVertex((unsigned short)v[0], (unsigned short)v[1], (unsigned short)v[2], + mesh.verts, firstVert, nextVert, mesh.nverts); + if (v[3] & RC_BORDER_VERTEX) + { + // This vertex should be removed. + vflags[indices[j]] = 1; + } + } + + // Build initial polygons. + int npolys = 0; + memset(polys, 0xff, maxVertsPerCont*nvp*sizeof(unsigned short)); + for (int j = 0; j < ntris; ++j) + { + int* t = &tris[j*3]; + if (t[0] != t[1] && t[0] != t[2] && t[1] != t[2]) + { + polys[npolys*nvp+0] = (unsigned short)indices[t[0]]; + polys[npolys*nvp+1] = (unsigned short)indices[t[1]]; + polys[npolys*nvp+2] = (unsigned short)indices[t[2]]; + npolys++; + } + } + if (!npolys) + continue; + + // Merge polygons. + if (nvp > 3) + { + while (true) + { + // Find best polygons to merge. + int bestMergeVal = 0; + int bestPa, bestPb, bestEa, bestEb; + + for (int j = 0; j < npolys-1; ++j) + { + unsigned short* pj = &polys[j*nvp]; + for (int k = j+1; k < npolys; ++k) + { + unsigned short* pk = &polys[k*nvp]; + int ea, eb; + int v = getPolyMergeValue(pj, pk, mesh.verts, ea, eb, nvp); + if (v > bestMergeVal) + { + bestMergeVal = v; + bestPa = j; + bestPb = k; + bestEa = ea; + bestEb = eb; + } + } + } + + if (bestMergeVal > 0) + { + // Found best, merge. + unsigned short* pa = &polys[bestPa*nvp]; + unsigned short* pb = &polys[bestPb*nvp]; + mergePolys(pa, pb, mesh.verts, bestEa, bestEb, tmpPoly, nvp); + memcpy(pb, &polys[(npolys-1)*nvp], sizeof(unsigned short)*nvp); + npolys--; + } + else + { + // Could not merge any polygons, stop. + break; + } + } + } + + + // Store polygons. + for (int j = 0; j < npolys; ++j) + { + unsigned short* p = &mesh.polys[mesh.npolys*nvp*2]; + unsigned short* q = &polys[j*nvp]; + for (int k = 0; k < nvp; ++k) + p[k] = q[k]; + mesh.regs[mesh.npolys] = cont.reg; + mesh.npolys++; + } + } + + + // Remove edge vertices. + for (int i = 0; i < mesh.nverts; ++i) + { + if (vflags[i]) + { + if (!removeVertex(mesh, i, maxTris)) + goto failure; + for (int j = i; j < mesh.nverts-1; ++j) + vflags[j] = vflags[j+1]; + --i; + } + } + + delete [] vflags; + delete [] firstVert; + delete [] nextVert; + delete [] indices; + delete [] tris; + + // Calculate adjacency. + if (!buildMeshAdjacency(mesh.polys, mesh.npolys, mesh.nverts, nvp)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMesh: Adjacency failed."); + return false; + } + + rcTimeVal endTime = rcGetPerformanceTimer(); + +// if (rcGetLog()) +// rcGetLog()->log(RC_LOG_PROGRESS, "Build polymesh: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f); + if (rcGetBuildTimes()) + rcGetBuildTimes()->buildPolymesh += rcGetDeltaTimeUsec(startTime, endTime); + + return true; + +failure: + delete [] vflags; + delete [] tmpPoly; + delete [] firstVert; + delete [] nextVert; + delete [] indices; + delete [] tris; + + return false; +} + +bool rcMergePolyMeshes(rcPolyMesh** meshes, const int nmeshes, rcPolyMesh& mesh) +{ + if (!nmeshes || !meshes) + return true; + + rcTimeVal startTime = rcGetPerformanceTimer(); + + int* nextVert = 0; + int* firstVert = 0; + unsigned short* vremap = 0; + + mesh.nvp = meshes[0]->nvp; + mesh.cs = meshes[0]->cs; + mesh.ch = meshes[0]->ch; + vcopy(mesh.bmin, meshes[0]->bmin); + vcopy(mesh.bmax, meshes[0]->bmax); + + int maxVerts = 0; + int maxPolys = 0; + int maxVertsPerMesh = 0; + for (int i = 0; i < nmeshes; ++i) + { + vmin(mesh.bmin, meshes[i]->bmin); + vmax(mesh.bmax, meshes[i]->bmax); + maxVertsPerMesh = rcMax(maxVertsPerMesh, meshes[i]->nverts); + maxVerts += meshes[i]->nverts; + maxPolys += meshes[i]->npolys; + } + + mesh.nverts = 0; + mesh.verts = new unsigned short[maxVerts*3]; + if (!mesh.verts) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "rcMergePolyMeshes: Out of memory 'mesh.verts' (%d).", maxVerts*3); + return false; + } + + mesh.npolys = 0; + mesh.polys = new unsigned short[maxPolys*2*mesh.nvp]; + if (!mesh.polys) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "rcMergePolyMeshes: Out of memory 'mesh.polys' (%d).", maxPolys*2*mesh.nvp); + return false; + } + memset(mesh.polys, 0xff, sizeof(unsigned short)*maxPolys*2*mesh.nvp); + + mesh.regs = new unsigned short[maxPolys]; + if (!mesh.regs) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "rcMergePolyMeshes: Out of memory 'mesh.regs' (%d).", maxPolys); + return false; + } + memset(mesh.regs, 0, sizeof(unsigned short)*maxPolys); + + nextVert = new int[maxVerts]; + if (!nextVert) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "rcMergePolyMeshes: Out of memory 'nextVert' (%d).", maxVerts); + goto failure; + } + memset(nextVert, 0, sizeof(int)*maxVerts); + + firstVert = new int[VERTEX_BUCKET_COUNT]; + if (!firstVert) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "rcMergePolyMeshes: Out of memory 'firstVert' (%d).", VERTEX_BUCKET_COUNT); + goto failure; + } + for (int i = 0; i < VERTEX_BUCKET_COUNT; ++i) + firstVert[i] = -1; + + vremap = new unsigned short[maxVertsPerMesh]; + if (!vremap) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "rcMergePolyMeshes: Out of memory 'vremap' (%d).", maxVertsPerMesh); + goto failure; + } + memset(nextVert, 0, sizeof(int)*maxVerts); + + for (int i = 0; i < nmeshes; ++i) + { + const rcPolyMesh* pmesh = meshes[i]; + + const unsigned short ox = (unsigned short)floorf((pmesh->bmin[0]-mesh.bmin[0])/mesh.cs+0.5f); + const unsigned short oz = (unsigned short)floorf((pmesh->bmin[2]-mesh.bmin[2])/mesh.cs+0.5f); + + for (int j = 0; j < pmesh->nverts; ++j) + { + unsigned short* v = &pmesh->verts[j*3]; + vremap[j] = addVertex(v[0]+ox, v[1], v[2]+oz, + mesh.verts, firstVert, nextVert, mesh.nverts); + } + + for (int j = 0; j < pmesh->npolys; ++j) + { + unsigned short* tgt = &mesh.polys[mesh.npolys*2*mesh.nvp]; + unsigned short* src = &pmesh->polys[j*2*mesh.nvp]; + mesh.regs[mesh.npolys] = pmesh->regs[j]; + mesh.npolys++; + for (int k = 0; k < mesh.nvp; ++k) + { + if (src[k] == 0xffff) break; + tgt[k] = vremap[src[k]]; + } + } + } + + // Calculate adjacency. + if (!buildMeshAdjacency(mesh.polys, mesh.npolys, mesh.nverts, mesh.nvp)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "rcMergePolyMeshes: Adjacency failed."); + return false; + } + + + delete [] firstVert; + delete [] nextVert; + delete [] vremap; + + rcTimeVal endTime = rcGetPerformanceTimer(); + + if (rcGetBuildTimes()) + rcGetBuildTimes()->mergePolyMesh += rcGetDeltaTimeUsec(startTime, endTime); + + return true; + +failure: + delete [] firstVert; + delete [] nextVert; + delete [] vremap; + + return false; +} diff --git a/extern/recastnavigation/Recast/Source/RecastMeshDetail.cpp b/extern/recastnavigation/Recast/Source/RecastMeshDetail.cpp new file mode 100644 index 00000000000..ef17531d7bc --- /dev/null +++ b/extern/recastnavigation/Recast/Source/RecastMeshDetail.cpp @@ -0,0 +1,981 @@ +// +// Copyright (c) 2009 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#include +#define _USE_MATH_DEFINES +#include +#include +#include +#include +#include "Recast.h" +#include "RecastLog.h" +#include "RecastTimer.h" + + +struct rcHeightPatch +{ + inline rcHeightPatch() : data(0) {} + inline ~rcHeightPatch() { delete [] data; } + unsigned short* data; + int xmin, ymin, width, height; +}; + + +static int circumCircle(const float xp, const float yp, + const float x1, const float y1, + const float x2, const float y2, + const float x3, const float y3, + float& xc, float& yc, float& rsqr) +{ + static const float EPSILON = 1e-6f; + + const float fabsy1y2 = rcAbs(y1-y2); + const float fabsy2y3 = rcAbs(y2-y3); + + /* Check for coincident points */ + if (fabsy1y2 < EPSILON && fabsy2y3 < EPSILON) + return 0; + + if (fabsy1y2 < EPSILON) + { + const float m2 = - (x3-x2) / (y3-y2); + const float mx2 = (x2 + x3) / 2.0f; + const float my2 = (y2 + y3) / 2.0f; + xc = (x2 + x1) / 2.0f; + yc = m2 * (xc - mx2) + my2; + } + else if (fabsy2y3 < EPSILON) + { + const float m1 = - (x2-x1) / (y2-y1); + const float mx1 = (x1 + x2) / 2.0f; + const float my1 = (y1 + y2) / 2.0f; + xc = (x3 + x2) / 2.0f; + yc = m1 * (xc - mx1) + my1; + } + else + { + const float m1 = - (x2-x1) / (y2-y1); + const float m2 = - (x3-x2) / (y3-y2); + const float mx1 = (x1 + x2) / 2.0f; + const float mx2 = (x2 + x3) / 2.0f; + const float my1 = (y1 + y2) / 2.0f; + const float my2 = (y2 + y3) / 2.0f; + xc = (m1 * mx1 - m2 * mx2 + my2 - my1) / (m1 - m2); + if (fabsy1y2 > fabsy2y3) + yc = m1 * (xc - mx1) + my1; + else + yc = m2 * (xc - mx2) + my2; + } + + float dx,dy; + + dx = x2 - xc; + dy = y2 - yc; + rsqr = dx*dx + dy*dy; + + dx = xp - xc; + dy = yp - yc; + const float drsqr = dx*dx + dy*dy; + + return (drsqr <= rsqr) ? 1 : 0; +} + +static int ptcmp(void* up, const void *v1, const void *v2) +{ + const float* verts = (const float*)up; + const float* p1 = &verts[(*(const int*)v1)*3]; + const float* p2 = &verts[(*(const int*)v2)*3]; + if (p1[0] < p2[0]) + return -1; + else if (p1[0] > p2[0]) + return 1; + else + return 0; +} + +// Based on Paul Bourke's triangulate.c +// http://astronomy.swin.edu.au/~pbourke/terrain/triangulate/triangulate.c +static void delaunay(const int nv, float *verts, rcIntArray& idx, rcIntArray& tris, rcIntArray& edges) +{ + // Sort vertices + idx.resize(nv); + for (int i = 0; i < nv; ++i) + idx[i] = i; +#ifdef WIN32 + qsort_s(&idx[0], idx.size(), sizeof(int), ptcmp, verts); +#else + qsort_r(&idx[0], idx.size(), sizeof(int), verts, ptcmp); +#endif + + // Find the maximum and minimum vertex bounds. + // This is to allow calculation of the bounding triangle + float xmin = verts[0]; + float ymin = verts[2]; + float xmax = xmin; + float ymax = ymin; + for (int i = 1; i < nv; ++i) + { + xmin = rcMin(xmin, verts[i*3+0]); + xmax = rcMax(xmax, verts[i*3+0]); + ymin = rcMin(ymin, verts[i*3+2]); + ymax = rcMax(ymax, verts[i*3+2]); + } + float dx = xmax - xmin; + float dy = ymax - ymin; + float dmax = (dx > dy) ? dx : dy; + float xmid = (xmax + xmin) / 2.0f; + float ymid = (ymax + ymin) / 2.0f; + + // Set up the supertriangle + // This is a triangle which encompasses all the sample points. + // The supertriangle coordinates are added to the end of the + // vertex list. The supertriangle is the first triangle in + // the triangle list. + float sv[3*3]; + + sv[0] = xmid - 20 * dmax; + sv[1] = 0; + sv[2] = ymid - dmax; + + sv[3] = xmid; + sv[4] = 0; + sv[5] = ymid + 20 * dmax; + + sv[6] = xmid + 20 * dmax; + sv[7] = 0; + sv[8] = ymid - dmax; + + tris.push(-3); + tris.push(-2); + tris.push(-1); + tris.push(0); // not completed + + for (int i = 0; i < nv; ++i) + { + const float xp = verts[idx[i]*3+0]; + const float yp = verts[idx[i]*3+2]; + + edges.resize(0); + + // Set up the edge buffer. + // If the point (xp,yp) lies inside the circumcircle then the + // three edges of that triangle are added to the edge buffer + // and that triangle is removed. + for (int j = 0; j < tris.size()/4; ++j) + { + int* t = &tris[j*4]; + if (t[3]) // completed? + continue; + const float* v1 = t[0] < 0 ? &sv[(t[0]+3)*3] : &verts[idx[t[0]]*3]; + const float* v2 = t[1] < 0 ? &sv[(t[1]+3)*3] : &verts[idx[t[1]]*3]; + const float* v3 = t[2] < 0 ? &sv[(t[2]+3)*3] : &verts[idx[t[2]]*3]; + float xc,yc,rsqr; + int inside = circumCircle(xp,yp, v1[0],v1[2], v2[0],v2[2], v3[0],v3[2], xc,yc,rsqr); + if (xc < xp && rcSqr(xp-xc) > rsqr) + t[3] = 1; + if (inside) + { + // Collect triangle edges. + edges.push(t[0]); + edges.push(t[1]); + edges.push(t[1]); + edges.push(t[2]); + edges.push(t[2]); + edges.push(t[0]); + // Remove triangle j. + t[0] = tris[tris.size()-4]; + t[1] = tris[tris.size()-3]; + t[2] = tris[tris.size()-2]; + t[3] = tris[tris.size()-1]; + tris.resize(tris.size()-4); + j--; + } + } + + // Remove duplicate edges. + const int ne = edges.size()/2; + for (int j = 0; j < ne-1; ++j) + { + for (int k = j+1; k < ne; ++k) + { + // Dupe?, make null. + if ((edges[j*2+0] == edges[k*2+1]) && (edges[j*2+1] == edges[k*2+0])) + { + edges[j*2+0] = 0; + edges[j*2+1] = 0; + edges[k*2+0] = 0; + edges[k*2+1] = 0; + } + } + } + + // Form new triangles for the current point + // Skipping over any null. + // All edges are arranged in clockwise order. + for (int j = 0; j < ne; ++j) + { + if (edges[j*2+0] == edges[j*2+1]) continue; + tris.push(edges[j*2+0]); + tris.push(edges[j*2+1]); + tris.push(i); + tris.push(0); // not completed + } + } + + // Remove triangles with supertriangle vertices + // These are triangles which have a vertex number greater than nv + for (int i = 0; i < tris.size()/4; ++i) + { + int* t = &tris[i*4]; + if (t[0] < 0 || t[1] < 0 || t[2] < 0) + { + t[0] = tris[tris.size()-4]; + t[1] = tris[tris.size()-3]; + t[2] = tris[tris.size()-2]; + t[3] = tris[tris.size()-1]; + tris.resize(tris.size()-4); + i--; + } + } + // Triangle vertices are pointing to sorted vertices, remap indices. + for (int i = 0; i < tris.size(); ++i) + tris[i] = idx[tris[i]]; +} + +inline float vdot2(const float* a, const float* b) +{ + return a[0]*b[0] + a[2]*b[2]; +} + +static float distPtTri(const float* p, const float* a, const float* b, const float* c) +{ + float v0[3], v1[3], v2[3]; + vsub(v0, c,a); + vsub(v1, b,a); + vsub(v2, p,a); + + const float dot00 = vdot2(v0, v0); + const float dot01 = vdot2(v0, v1); + const float dot02 = vdot2(v0, v2); + const float dot11 = vdot2(v1, v1); + const float dot12 = vdot2(v1, v2); + + // Compute barycentric coordinates + float invDenom = 1.0f / (dot00 * dot11 - dot01 * dot01); + float u = (dot11 * dot02 - dot01 * dot12) * invDenom; + float v = (dot00 * dot12 - dot01 * dot02) * invDenom; + + // If point lies inside the triangle, return interpolated y-coord. + static const float EPS = 1e-4f; + if (u >= -EPS && v >= -EPS && (u+v) <= 1+EPS) + { + float y = a[1] + v0[1]*u + v1[1]*v; + return fabsf(y-p[1]); + } + return FLT_MAX; +} + +static float distancePtSeg(const float* pt, const float* p, const float* q) +{ + float pqx = q[0] - p[0]; + float pqy = q[1] - p[1]; + float pqz = q[2] - p[2]; + float dx = pt[0] - p[0]; + float dy = pt[1] - p[1]; + float dz = pt[2] - p[2]; + float d = pqx*pqx + pqy*pqy + pqz*pqz; + float t = pqx*dx + pqy*dy + pqz*dz; + if (d > 0) + t /= d; + if (t < 0) + t = 0; + else if (t > 1) + t = 1; + + dx = p[0] + t*pqx - pt[0]; + dy = p[1] + t*pqy - pt[1]; + dz = p[2] + t*pqz - pt[2]; + + return dx*dx + dy*dy + dz*dz; +} + +static float distancePtSeg2d(const float* pt, const float* p, const float* q) +{ + float pqx = q[0] - p[0]; + float pqz = q[2] - p[2]; + float dx = pt[0] - p[0]; + float dz = pt[2] - p[2]; + float d = pqx*pqx + pqz*pqz; + float t = pqx*dx + pqz*dz; + if (d > 0) + t /= d; + if (t < 0) + t = 0; + else if (t > 1) + t = 1; + + dx = p[0] + t*pqx - pt[0]; + dz = p[2] + t*pqz - pt[2]; + + return dx*dx + dz*dz; +} + +static float distToTriMesh(const float* p, const float* verts, int nverts, const int* tris, int ntris) +{ + float dmin = FLT_MAX; + for (int i = 0; i < ntris; ++i) + { + const float* va = &verts[tris[i*4+0]*3]; + const float* vb = &verts[tris[i*4+1]*3]; + const float* vc = &verts[tris[i*4+2]*3]; + float d = distPtTri(p, va,vb,vc); + if (d < dmin) + dmin = d; + } + if (dmin == FLT_MAX) return -1; + return dmin; +} + +static float distToPoly(int nvert, const float* verts, const float* p) +{ + + float dmin = FLT_MAX; + int i, j, c = 0; + for (i = 0, j = nvert-1; i < nvert; j = i++) + { + const float* vi = &verts[i*3]; + const float* vj = &verts[j*3]; + if (((vi[2] > p[2]) != (vj[2] > p[2])) && + (p[0] < (vj[0]-vi[0]) * (p[2]-vi[2]) / (vj[2]-vi[2]) + vi[0]) ) + c = !c; + dmin = rcMin(dmin, distancePtSeg2d(p, vj, vi)); + } + return c ? -dmin : dmin; +} + + +static unsigned short getHeight(const float* pos, const float* bmin, const float ics, const rcHeightPatch& hp) +{ + int ix = (int)floorf((pos[0]-bmin[0])*ics + 0.01f); + int iz = (int)floorf((pos[2]-bmin[2])*ics + 0.01f); + ix = rcClamp(ix-hp.xmin, 0, hp.width); + iz = rcClamp(iz-hp.ymin, 0, hp.height); + unsigned short h = hp.data[ix+iz*hp.width]; + return h; +} + +static bool buildPolyDetail(const float* in, const int nin, unsigned short reg, + const float sampleDist, const float sampleMaxError, + const rcCompactHeightfield& chf, const rcHeightPatch& hp, + float* verts, int& nverts, rcIntArray& tris, + rcIntArray& edges, rcIntArray& idx, rcIntArray& samples) +{ + static const int MAX_VERTS = 256; + static const int MAX_EDGE = 64; + float edge[(MAX_EDGE+1)*3]; + + nverts = 0; + + for (int i = 0; i < nin; ++i) + vcopy(&verts[i*3], &in[i*3]); + nverts = nin; + + const float ics = 1.0f/chf.cs; + + // Tesselate outlines. + // This is done in separate pass in order to ensure + // seamless height values across the ply boundaries. + if (sampleDist > 0) + { + for (int i = 0, j = nin-1; i < nin; j=i++) + { + const float* vj = &in[j*3]; + const float* vi = &in[i*3]; + // Make sure the segments are always handled in same order + // using lexological sort or else there will be seams. + if (fabsf(vj[0]-vi[0]) < 1e-6f) + { + if (vj[2] > vi[2]) + rcSwap(vj,vi); + } + else + { + if (vj[0] > vi[0]) + rcSwap(vj,vi); + } + // Create samples along the edge. + float dx = vi[0] - vj[0]; + float dy = vi[1] - vj[1]; + float dz = vi[2] - vj[2]; + float d = sqrtf(dx*dx + dz*dz); + int nn = 1 + (int)floorf(d/sampleDist); + if (nn > MAX_EDGE) nn = MAX_EDGE; + if (nverts+nn >= MAX_VERTS) + nn = MAX_VERTS-1-nverts; + for (int k = 0; k <= nn; ++k) + { + float u = (float)k/(float)nn; + float* pos = &edge[k*3]; + pos[0] = vj[0] + dx*u; + pos[1] = vj[1] + dy*u; + pos[2] = vj[2] + dz*u; + pos[1] = chf.bmin[1] + getHeight(pos, chf.bmin, ics, hp)*chf.ch; + } + // Simplify samples. + int idx[MAX_EDGE] = {0,nn}; + int nidx = 2; + for (int k = 0; k < nidx-1; ) + { + const int a = idx[k]; + const int b = idx[k+1]; + const float* va = &edge[a*3]; + const float* vb = &edge[b*3]; + // Find maximum deviation along the segment. + float maxd = 0; + int maxi = -1; + for (int m = a+1; m < b; ++m) + { + float d = distancePtSeg(&edge[m*3],va,vb); + if (d > maxd) + { + maxd = d; + maxi = m; + } + } + // If the max deviation is larger than accepted error, + // add new point, else continue to next segment. + if (maxi != -1 && maxd > rcSqr(sampleMaxError)) + { + for (int m = nidx; m > k; --m) + idx[m] = idx[m-1]; + idx[k+1] = maxi; + nidx++; + } + else + { + ++k; + } + } + // Add new vertices. + for (int k = 1; k < nidx-1; ++k) + { + vcopy(&verts[nverts*3], &edge[idx[k]*3]); + nverts++; + } + } + } + + // Tesselate the base mesh. + edges.resize(0); + tris.resize(0); + idx.resize(0); + delaunay(nverts, verts, idx, tris, edges); + + if (sampleDist > 0) + { + // Create sample locations in a grid. + float bmin[3], bmax[3]; + vcopy(bmin, in); + vcopy(bmax, in); + for (int i = 1; i < nin; ++i) + { + vmin(bmin, &in[i*3]); + vmax(bmax, &in[i*3]); + } + int x0 = (int)floorf(bmin[0]/sampleDist); + int x1 = (int)ceilf(bmax[0]/sampleDist); + int z0 = (int)floorf(bmin[2]/sampleDist); + int z1 = (int)ceilf(bmax[2]/sampleDist); + samples.resize(0); + for (int z = z0; z < z1; ++z) + { + for (int x = x0; x < x1; ++x) + { + float pt[3]; + pt[0] = x*sampleDist; + pt[2] = z*sampleDist; + // Make sure the samples are not too close to the edges. + if (distToPoly(nin,in,pt) > -sampleDist/2) continue; + samples.push(x); + samples.push(getHeight(pt, chf.bmin, ics, hp)); + samples.push(z); + } + } + + // Add the samples starting from the one that has the most + // error. The procedure stops when all samples are added + // or when the max error is within treshold. + const int nsamples = samples.size()/3; + for (int iter = 0; iter < nsamples; ++iter) + { + // Find sample with most error. + float bestpt[3]; + float bestd = 0; + for (int i = 0; i < nsamples; ++i) + { + float pt[3]; + pt[0] = samples[i*3+0]*sampleDist; + pt[1] = chf.bmin[1] + samples[i*3+1]*chf.ch; + pt[2] = samples[i*3+2]*sampleDist; + float d = distToTriMesh(pt, verts, nverts, &tris[0], tris.size()/4); + if (d < 0) continue; // did not hit the mesh. + if (d > bestd) + { + bestd = d; + vcopy(bestpt,pt); + } + } + // If the max error is within accepted threshold, stop tesselating. + if (bestd <= sampleMaxError) + break; + + // Add the new sample point. + vcopy(&verts[nverts*3],bestpt); + nverts++; + + // Create new triangulation. + // TODO: Incremental add instead of full rebuild. + edges.resize(0); + tris.resize(0); + idx.resize(0); + delaunay(nverts, verts, idx, tris, edges); + + if (nverts >= MAX_VERTS) + break; + } + } + + return true; +} + +static void getHeightData(const rcCompactHeightfield& chf, + const unsigned short* poly, const int npoly, + const unsigned short* verts, + rcHeightPatch& hp, rcIntArray& stack) +{ + // Floodfill the heightfield to get 2D height data, + // starting at vertex locations as seeds. + + memset(hp.data, 0xff, sizeof(unsigned short)*hp.width*hp.height); + + stack.resize(0); + + // Use poly vertices as seed points for the flood fill. + for (int j = 0; j < npoly; ++j) + { + const int ax = (int)verts[poly[j]*3+0]; + const int ay = (int)verts[poly[j]*3+1]; + const int az = (int)verts[poly[j]*3+2]; + if (ax < hp.xmin || ax >= hp.xmin+hp.width || + az < hp.ymin || az >= hp.ymin+hp.height) + continue; + + const rcCompactCell& c = chf.cells[ax+az*chf.width]; + int dmin = 0xffff; + int ai = -1; + for (int i = (int)c.index, ni = (int)(c.index+c.count); i < ni; ++i) + { + const rcCompactSpan& s = chf.spans[i]; + int d = rcAbs(ay - (int)s.y); + if (d < dmin) + { + ai = i; + dmin = d; + } + } + if (ai != -1) + { + stack.push(ax); + stack.push(az); + stack.push(ai); + } + } + + while (stack.size() > 0) + { + int ci = stack.pop(); + int cy = stack.pop(); + int cx = stack.pop(); + + // Skip already visited locations. + int idx = cx-hp.xmin+(cy-hp.ymin)*hp.width; + if (hp.data[idx] != 0xffff) + continue; + + const rcCompactSpan& cs = chf.spans[ci]; + hp.data[idx] = cs.y; + + for (int dir = 0; dir < 4; ++dir) + { + if (rcGetCon(cs, dir) == 0xf) continue; + + const int ax = cx + rcGetDirOffsetX(dir); + const int ay = cy + rcGetDirOffsetY(dir); + + if (ax < hp.xmin || ax >= (hp.xmin+hp.width) || + ay < hp.ymin || ay >= (hp.ymin+hp.height)) + continue; + + if (hp.data[ax-hp.xmin+(ay-hp.ymin)*hp.width] != 0xffff) + continue; + + const int ai = (int)chf.cells[ax+ay*chf.width].index + rcGetCon(cs, dir); + + stack.push(ax); + stack.push(ay); + stack.push(ai); + } + } +} + +static unsigned char getEdgeFlags(const float* va, const float* vb, + const float* vpoly, const int npoly) +{ + // Return true if edge (va,vb) is part of the polygon. + static const float thrSqr = rcSqr(0.001f); + for (int i = 0, j = npoly-1; i < npoly; j=i++) + { + if (distancePtSeg2d(va, &vpoly[j*3], &vpoly[i*3]) < thrSqr && + distancePtSeg2d(vb, &vpoly[j*3], &vpoly[i*3]) < thrSqr) + return 1; + } + return 0; +} + +static unsigned char getTriFlags(const float* va, const float* vb, const float* vc, + const float* vpoly, const int npoly) +{ + unsigned char flags = 0; + flags |= getEdgeFlags(va,vb,vpoly,npoly) << 0; + flags |= getEdgeFlags(vb,vc,vpoly,npoly) << 2; + flags |= getEdgeFlags(vc,va,vpoly,npoly) << 4; + return flags; +} + + + +bool rcBuildPolyMeshDetail(const rcPolyMesh& mesh, const rcCompactHeightfield& chf, + const float sampleDist, const float sampleMaxError, + rcPolyMeshDetail& dmesh) +{ + rcTimeVal startTime = rcGetPerformanceTimer(); + + if (mesh.nverts == 0 || mesh.npolys == 0) + return true; + + const int nvp = mesh.nvp; + const float cs = mesh.cs; + const float ch = mesh.ch; + const float* orig = mesh.bmin; + + rcIntArray edges(64); + rcIntArray tris(512); + rcIntArray idx(512); + rcIntArray stack(512); + rcIntArray samples(512); + float verts[256*3]; + float* poly = 0; + int* bounds = 0; + rcHeightPatch hp; + int nPolyVerts = 0; + int maxhw = 0, maxhh = 0; + + bounds = new int[mesh.npolys*4]; + if (!bounds) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMeshDetail: Out of memory 'bounds' (%d).", mesh.npolys*4); + goto failure; + } + poly = new float[nvp*3]; + if (!bounds) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMeshDetail: Out of memory 'poly' (%d).", nvp*3); + goto failure; + } + + // Find max size for a polygon area. + for (int i = 0; i < mesh.npolys; ++i) + { + const unsigned short* p = &mesh.polys[i*nvp*2]; + int& xmin = bounds[i*4+0]; + int& xmax = bounds[i*4+1]; + int& ymin = bounds[i*4+2]; + int& ymax = bounds[i*4+3]; + xmin = chf.width; + xmax = 0; + ymin = chf.height; + ymax = 0; + for (int j = 0; j < nvp; ++j) + { + if(p[j] == 0xffff) break; + const unsigned short* v = &mesh.verts[p[j]*3]; + xmin = rcMin(xmin, (int)v[0]); + xmax = rcMax(xmax, (int)v[0]); + ymin = rcMin(ymin, (int)v[2]); + ymax = rcMax(ymax, (int)v[2]); + nPolyVerts++; + } + xmin = rcMax(0,xmin-1); + xmax = rcMin(chf.width,xmax+1); + ymin = rcMax(0,ymin-1); + ymax = rcMin(chf.height,ymax+1); + if (xmin >= xmax || ymin >= ymax) continue; + maxhw = rcMax(maxhw, xmax-xmin); + maxhh = rcMax(maxhh, ymax-ymin); + } + + hp.data = new unsigned short[maxhw*maxhh]; + if (!hp.data) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMeshDetail: Out of memory 'hp.data' (%d).", maxhw*maxhh); + goto failure; + } + + dmesh.nmeshes = mesh.npolys; + dmesh.nverts = 0; + dmesh.ntris = 0; + dmesh.meshes = new unsigned short[dmesh.nmeshes*4]; + if (!dmesh.meshes) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMeshDetail: Out of memory 'dmesh.meshes' (%d).", dmesh.nmeshes*4); + goto failure; + } + + int vcap = nPolyVerts+nPolyVerts/2; + int tcap = vcap*2; + + dmesh.nverts = 0; + dmesh.verts = new float[vcap*3]; + if (!dmesh.verts) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMeshDetail: Out of memory 'dmesh.verts' (%d).", vcap*3); + goto failure; + } + dmesh.ntris = 0; + dmesh.tris = new unsigned char[tcap*4]; + if (!dmesh.tris) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMeshDetail: Out of memory 'dmesh.tris' (%d).", tcap*4); + goto failure; + } + + for (int i = 0; i < mesh.npolys; ++i) + { + const unsigned short* p = &mesh.polys[i*nvp*2]; + + // Find polygon bounding box. + int npoly = 0; + for (int j = 0; j < nvp; ++j) + { + if(p[j] == 0xffff) break; + const unsigned short* v = &mesh.verts[p[j]*3]; + poly[j*3+0] = orig[0] + v[0]*cs; + poly[j*3+1] = orig[1] + v[1]*ch; + poly[j*3+2] = orig[2] + v[2]*cs; + npoly++; + } + + // Get the height data from the area of the polygon. + hp.xmin = bounds[i*4+0]; + hp.ymin = bounds[i*4+2]; + hp.width = bounds[i*4+1]-bounds[i*4+0]; + hp.height = bounds[i*4+3]-bounds[i*4+2]; + getHeightData(chf, p, npoly, mesh.verts, hp, stack); + + // Build detail mesh. + int nverts = 0; + if (!buildPolyDetail(poly, npoly, mesh.regs[i], + sampleDist, sampleMaxError, + chf, hp, verts, nverts, tris, + edges, idx, samples)) + { + goto failure; + } + + // Offset detail vertices, unnecassary? + for (int j = 0; j < nverts; ++j) + verts[j*3+1] += chf.ch; + + // Store detail submesh. + const int ntris = tris.size()/4; + + dmesh.meshes[i*4+0] = dmesh.nverts; + dmesh.meshes[i*4+1] = (unsigned short)nverts; + dmesh.meshes[i*4+2] = dmesh.ntris; + dmesh.meshes[i*4+3] = (unsigned short)ntris; + + // Store vertices, allocate more memory if necessary. + if (dmesh.nverts+nverts > vcap) + { + while (dmesh.nverts+nverts > vcap) + vcap += 256; + + float* newv = new float[vcap*3]; + if (!newv) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMeshDetail: Out of memory 'newv' (%d).", vcap*3); + goto failure; + } + if (dmesh.nverts) + memcpy(newv, dmesh.verts, sizeof(float)*3*dmesh.nverts); + delete [] dmesh.verts; + dmesh.verts = newv; + } + for (int j = 0; j < nverts; ++j) + { + dmesh.verts[dmesh.nverts*3+0] = verts[j*3+0]; + dmesh.verts[dmesh.nverts*3+1] = verts[j*3+1]; + dmesh.verts[dmesh.nverts*3+2] = verts[j*3+2]; + dmesh.nverts++; + } + + // Store triangles, allocate more memory if necessary. + if (dmesh.ntris+ntris > tcap) + { + while (dmesh.ntris+ntris > tcap) + tcap += 256; + unsigned char* newt = new unsigned char[tcap*4]; + if (!newt) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMeshDetail: Out of memory 'newt' (%d).", tcap*4); + goto failure; + } + if (dmesh.ntris) + memcpy(newt, dmesh.tris, sizeof(unsigned char)*4*dmesh.ntris); + delete [] dmesh.tris; + dmesh.tris = newt; + } + for (int j = 0; j < ntris; ++j) + { + const int* t = &tris[j*4]; + dmesh.tris[dmesh.ntris*4+0] = (unsigned char)t[0]; + dmesh.tris[dmesh.ntris*4+1] = (unsigned char)t[1]; + dmesh.tris[dmesh.ntris*4+2] = (unsigned char)t[2]; + dmesh.tris[dmesh.ntris*4+3] = getTriFlags(&verts[t[0]*3], &verts[t[1]*3], &verts[t[2]*3], poly, npoly); + dmesh.ntris++; + } + } + + delete [] bounds; + delete [] poly; + + rcTimeVal endTime = rcGetPerformanceTimer(); + + if (rcGetBuildTimes()) + rcGetBuildTimes()->buildDetailMesh += rcGetDeltaTimeUsec(startTime, endTime); + + return true; + +failure: + + delete [] bounds; + delete [] poly; + + return false; +} + +bool rcMergePolyMeshDetails(rcPolyMeshDetail** meshes, const int nmeshes, rcPolyMeshDetail& mesh) +{ + rcTimeVal startTime = rcGetPerformanceTimer(); + + int maxVerts = 0; + int maxTris = 0; + int maxMeshes = 0; + + for (int i = 0; i < nmeshes; ++i) + { + if (!meshes[i]) continue; + maxVerts += meshes[i]->nverts; + maxTris += meshes[i]->ntris; + maxMeshes += meshes[i]->nmeshes; + } + + mesh.nmeshes = 0; + mesh.meshes = new unsigned short[maxMeshes*4]; + if (!mesh.meshes) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMeshDetail: Out of memory 'pmdtl.meshes' (%d).", maxMeshes*4); + return false; + } + + mesh.ntris = 0; + mesh.tris = new unsigned char[maxTris*4]; + if (!mesh.tris) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMeshDetail: Out of memory 'dmesh.tris' (%d).", maxTris*4); + return false; + } + + mesh.nverts = 0; + mesh.verts = new float[maxVerts*3]; + if (!mesh.verts) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMeshDetail: Out of memory 'dmesh.verts' (%d).", maxVerts*3); + return false; + } + + // Merge datas. + for (int i = 0; i < nmeshes; ++i) + { + rcPolyMeshDetail* dm = meshes[i]; + if (!dm) continue; + for (int j = 0; j < dm->nmeshes; ++j) + { + unsigned short* dst = &mesh.meshes[mesh.nmeshes*4]; + unsigned short* src = &dm->meshes[j*4]; + dst[0] = mesh.nverts+src[0]; + dst[1] = src[1]; + dst[2] = mesh.ntris+src[2]; + dst[3] = src[3]; + mesh.nmeshes++; + } + + for (int k = 0; k < dm->nverts; ++k) + { + vcopy(&mesh.verts[mesh.nverts*3], &dm->verts[k*3]); + mesh.nverts++; + } + for (int k = 0; k < dm->ntris; ++k) + { + mesh.tris[mesh.ntris*4+0] = dm->tris[k*4+0]; + mesh.tris[mesh.ntris*4+1] = dm->tris[k*4+1]; + mesh.tris[mesh.ntris*4+2] = dm->tris[k*4+2]; + mesh.tris[mesh.ntris*4+3] = dm->tris[k*4+3]; + mesh.ntris++; + } + } + + rcTimeVal endTime = rcGetPerformanceTimer(); + + if (rcGetBuildTimes()) + rcGetBuildTimes()->mergePolyMeshDetail += rcGetDeltaTimeUsec(startTime, endTime); + + return true; +} + diff --git a/extern/recastnavigation/Recast/Source/RecastRasterization.cpp b/extern/recastnavigation/Recast/Source/RecastRasterization.cpp new file mode 100644 index 00000000000..658b0e1fb51 --- /dev/null +++ b/extern/recastnavigation/Recast/Source/RecastRasterization.cpp @@ -0,0 +1,308 @@ +// +// Copyright (c) 2009 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#define _USE_MATH_DEFINES +#include +#include +#include "Recast.h" +#include "RecastTimer.h" +#include "RecastLog.h" + +inline bool overlapBounds(const float* amin, const float* amax, const float* bmin, const float* bmax) +{ + bool overlap = true; + overlap = (amin[0] > bmax[0] || amax[0] < bmin[0]) ? false : overlap; + overlap = (amin[1] > bmax[1] || amax[1] < bmin[1]) ? false : overlap; + overlap = (amin[2] > bmax[2] || amax[2] < bmin[2]) ? false : overlap; + return overlap; +} + +inline bool overlapInterval(unsigned short amin, unsigned short amax, + unsigned short bmin, unsigned short bmax) +{ + if (amax < bmin) return false; + if (amin > bmax) return false; + return true; +} + + +static rcSpan* allocSpan(rcHeightfield& hf) +{ + // If running out of memory, allocate new page and update the freelist. + if (!hf.freelist || !hf.freelist->next) + { + // Create new page. + // Allocate memory for the new pool. + const int size = (sizeof(rcSpanPool)-sizeof(rcSpan)) + sizeof(rcSpan)*RC_SPANS_PER_POOL; + rcSpanPool* pool = reinterpret_cast(new unsigned char[size]); + if (!pool) return 0; + pool->next = 0; + // Add the pool into the list of pools. + pool->next = hf.pools; + hf.pools = pool; + // Add new items to the free list. + rcSpan* freelist = hf.freelist; + rcSpan* head = &pool->items[0]; + rcSpan* it = &pool->items[RC_SPANS_PER_POOL]; + do + { + --it; + it->next = freelist; + freelist = it; + } + while (it != head); + hf.freelist = it; + } + + // Pop item from in front of the free list. + rcSpan* it = hf.freelist; + hf.freelist = hf.freelist->next; + return it; +} + +static void freeSpan(rcHeightfield& hf, rcSpan* ptr) +{ + if (!ptr) return; + // Add the node in front of the free list. + ptr->next = hf.freelist; + hf.freelist = ptr; +} + +static void addSpan(rcHeightfield& hf, int x, int y, + unsigned short smin, unsigned short smax, + unsigned short flags) +{ + int idx = x + y*hf.width; + + rcSpan* s = allocSpan(hf); + s->smin = smin; + s->smax = smax; + s->flags = flags; + s->next = 0; + + // Empty cell, add he first span. + if (!hf.spans[idx]) + { + hf.spans[idx] = s; + return; + } + rcSpan* prev = 0; + rcSpan* cur = hf.spans[idx]; + + // Insert and merge spans. + while (cur) + { + if (cur->smin > s->smax) + { + // Current span is further than the new span, break. + break; + } + else if (cur->smax < s->smin) + { + // Current span is before the new span advance. + prev = cur; + cur = cur->next; + } + else + { + // Merge spans. + if (cur->smin < s->smin) + s->smin = cur->smin; + if (cur->smax > s->smax) + s->smax = cur->smax; + + // Merge flags. +// if (s->smax == cur->smax) + if (rcAbs((int)s->smax - (int)cur->smax) <= 1) + s->flags |= cur->flags; + + // Remove current span. + rcSpan* next = cur->next; + freeSpan(hf, cur); + if (prev) + prev->next = next; + else + hf.spans[idx] = next; + cur = next; + } + } + + // Insert new span. + if (prev) + { + s->next = prev->next; + prev->next = s; + } + else + { + s->next = hf.spans[idx]; + hf.spans[idx] = s; + } +} + +static int clipPoly(const float* in, int n, float* out, float pnx, float pnz, float pd) +{ + float d[12]; + for (int i = 0; i < n; ++i) + d[i] = pnx*in[i*3+0] + pnz*in[i*3+2] + pd; + + int m = 0; + for (int i = 0, j = n-1; i < n; j=i, ++i) + { + bool ina = d[j] >= 0; + bool inb = d[i] >= 0; + if (ina != inb) + { + float s = d[j] / (d[j] - d[i]); + out[m*3+0] = in[j*3+0] + (in[i*3+0] - in[j*3+0])*s; + out[m*3+1] = in[j*3+1] + (in[i*3+1] - in[j*3+1])*s; + out[m*3+2] = in[j*3+2] + (in[i*3+2] - in[j*3+2])*s; + m++; + } + if (inb) + { + out[m*3+0] = in[i*3+0]; + out[m*3+1] = in[i*3+1]; + out[m*3+2] = in[i*3+2]; + m++; + } + } + return m; +} + +static void rasterizeTri(const float* v0, const float* v1, const float* v2, + unsigned char flags, rcHeightfield& hf, + const float* bmin, const float* bmax, + const float cs, const float ics, const float ich) +{ + const int w = hf.width; + const int h = hf.height; + float tmin[3], tmax[3]; + const float by = bmax[1] - bmin[1]; + + // Calculate the bounding box of the triangle. + vcopy(tmin, v0); + vcopy(tmax, v0); + vmin(tmin, v1); + vmin(tmin, v2); + vmax(tmax, v1); + vmax(tmax, v2); + + // If the triangle does not touch the bbox of the heightfield, skip the triagle. + if (!overlapBounds(bmin, bmax, tmin, tmax)) + return; + + // Calculate the footpring of the triangle on the grid. + int x0 = (int)((tmin[0] - bmin[0])*ics); + int y0 = (int)((tmin[2] - bmin[2])*ics); + int x1 = (int)((tmax[0] - bmin[0])*ics); + int y1 = (int)((tmax[2] - bmin[2])*ics); + x0 = rcClamp(x0, 0, w-1); + y0 = rcClamp(y0, 0, h-1); + x1 = rcClamp(x1, 0, w-1); + y1 = rcClamp(y1, 0, h-1); + + // Clip the triangle into all grid cells it touches. + float in[7*3], out[7*3], inrow[7*3]; + + for (int y = y0; y <= y1; ++y) + { + // Clip polygon to row. + vcopy(&in[0], v0); + vcopy(&in[1*3], v1); + vcopy(&in[2*3], v2); + int nvrow = 3; + const float cz = bmin[2] + y*cs; + nvrow = clipPoly(in, nvrow, out, 0, 1, -cz); + if (nvrow < 3) continue; + nvrow = clipPoly(out, nvrow, inrow, 0, -1, cz+cs); + if (nvrow < 3) continue; + + for (int x = x0; x <= x1; ++x) + { + // Clip polygon to column. + int nv = nvrow; + const float cx = bmin[0] + x*cs; + nv = clipPoly(inrow, nv, out, 1, 0, -cx); + if (nv < 3) continue; + nv = clipPoly(out, nv, in, -1, 0, cx+cs); + if (nv < 3) continue; + + // Calculate min and max of the span. + float smin = in[1], smax = in[1]; + for (int i = 1; i < nv; ++i) + { + smin = rcMin(smin, in[i*3+1]); + smax = rcMax(smax, in[i*3+1]); + } + smin -= bmin[1]; + smax -= bmin[1]; + // Skip the span if it is outside the heightfield bbox + if (smax < 0.0f) continue; + if (smin > by) continue; + // Clamp the span to the heightfield bbox. + if (smin < 0.0f) smin = bmin[1]; + if (smax > by) smax = bmax[1]; + + // Snap the span to the heightfield height grid. + unsigned short ismin = (unsigned short)rcClamp((int)floorf(smin * ich), 0, 0x7fff); + unsigned short ismax = (unsigned short)rcClamp((int)ceilf(smax * ich), 0, 0x7fff); + + addSpan(hf, x, y, ismin, ismax, flags); + } + } +} + +void rcRasterizeTriangle(const float* v0, const float* v1, const float* v2, + unsigned char flags, rcHeightfield& solid) +{ + rcTimeVal startTime = rcGetPerformanceTimer(); + + const float ics = 1.0f/solid.cs; + const float ich = 1.0f/solid.ch; + rasterizeTri(v0, v1, v2, flags, solid, solid.bmin, solid.bmax, solid.cs, ics, ich); + + rcTimeVal endTime = rcGetPerformanceTimer(); + + if (rcGetBuildTimes()) + rcGetBuildTimes()->rasterizeTriangles += rcGetDeltaTimeUsec(startTime, endTime); +} + +void rcRasterizeTriangles(const float* verts, int nv, + const int* tris, const unsigned char* flags, int nt, + rcHeightfield& solid) +{ + rcTimeVal startTime = rcGetPerformanceTimer(); + + const float ics = 1.0f/solid.cs; + const float ich = 1.0f/solid.ch; + // Rasterize triangles. + for (int i = 0; i < nt; ++i) + { + const float* v0 = &verts[tris[i*3+0]*3]; + const float* v1 = &verts[tris[i*3+1]*3]; + const float* v2 = &verts[tris[i*3+2]*3]; + // Rasterize. + rasterizeTri(v0, v1, v2, flags[i], solid, solid.bmin, solid.bmax, solid.cs, ics, ich); + } + + rcTimeVal endTime = rcGetPerformanceTimer(); + + if (rcGetBuildTimes()) + rcGetBuildTimes()->rasterizeTriangles += rcGetDeltaTimeUsec(startTime, endTime); +} diff --git a/extern/recastnavigation/Recast/Source/RecastRegion.cpp b/extern/recastnavigation/Recast/Source/RecastRegion.cpp new file mode 100644 index 00000000000..5c557cf0681 --- /dev/null +++ b/extern/recastnavigation/Recast/Source/RecastRegion.cpp @@ -0,0 +1,1081 @@ +// +// Copyright (c) 2009 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#include +#define _USE_MATH_DEFINES +#include +#include +#include +#include +#include "Recast.h" +#include "RecastLog.h" +#include "RecastTimer.h" + + +static unsigned short* calculateDistanceField(rcCompactHeightfield& chf, + unsigned short* src, unsigned short* dst, + unsigned short& maxDist) +{ + const int w = chf.width; + const int h = chf.height; + + // Init distance and points. + for (int i = 0; i < chf.spanCount; ++i) + src[i] = 0xffff; + + // Mark boundary cells. + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + const rcCompactCell& c = chf.cells[x+y*w]; + for (int i = (int)c.index, ni = (int)(c.index+c.count); i < ni; ++i) + { + const rcCompactSpan& s = chf.spans[i]; + int nc = 0; + for (int dir = 0; dir < 4; ++dir) + { + if (rcGetCon(s, dir) != 0xf) + nc++; + } + if (nc != 4) + src[i] = 0; + } + } + } + + // Pass 1 + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + const rcCompactCell& c = chf.cells[x+y*w]; + for (int i = (int)c.index, ni = (int)(c.index+c.count); i < ni; ++i) + { + const rcCompactSpan& s = chf.spans[i]; + + if (rcGetCon(s, 0) != 0xf) + { + // (-1,0) + const int ax = x + rcGetDirOffsetX(0); + const int ay = y + rcGetDirOffsetY(0); + const int ai = (int)chf.cells[ax+ay*w].index + rcGetCon(s, 0); + const rcCompactSpan& as = chf.spans[ai]; + if (src[ai]+2 < src[i]) + src[i] = src[ai]+2; + + // (-1,-1) + if (rcGetCon(as, 3) != 0xf) + { + const int aax = ax + rcGetDirOffsetX(3); + const int aay = ay + rcGetDirOffsetY(3); + const int aai = (int)chf.cells[aax+aay*w].index + rcGetCon(as, 3); + if (src[aai]+3 < src[i]) + src[i] = src[aai]+3; + } + } + if (rcGetCon(s, 3) != 0xf) + { + // (0,-1) + const int ax = x + rcGetDirOffsetX(3); + const int ay = y + rcGetDirOffsetY(3); + const int ai = (int)chf.cells[ax+ay*w].index + rcGetCon(s, 3); + const rcCompactSpan& as = chf.spans[ai]; + if (src[ai]+2 < src[i]) + src[i] = src[ai]+2; + + // (1,-1) + if (rcGetCon(as, 2) != 0xf) + { + const int aax = ax + rcGetDirOffsetX(2); + const int aay = ay + rcGetDirOffsetY(2); + const int aai = (int)chf.cells[aax+aay*w].index + rcGetCon(as, 2); + if (src[aai]+3 < src[i]) + src[i] = src[aai]+3; + } + } + } + } + } + + // Pass 2 + for (int y = h-1; y >= 0; --y) + { + for (int x = w-1; x >= 0; --x) + { + const rcCompactCell& c = chf.cells[x+y*w]; + for (int i = (int)c.index, ni = (int)(c.index+c.count); i < ni; ++i) + { + const rcCompactSpan& s = chf.spans[i]; + + if (rcGetCon(s, 2) != 0xf) + { + // (1,0) + const int ax = x + rcGetDirOffsetX(2); + const int ay = y + rcGetDirOffsetY(2); + const int ai = (int)chf.cells[ax+ay*w].index + rcGetCon(s, 2); + const rcCompactSpan& as = chf.spans[ai]; + if (src[ai]+2 < src[i]) + src[i] = src[ai]+2; + + // (1,1) + if (rcGetCon(as, 1) != 0xf) + { + const int aax = ax + rcGetDirOffsetX(1); + const int aay = ay + rcGetDirOffsetY(1); + const int aai = (int)chf.cells[aax+aay*w].index + rcGetCon(as, 1); + if (src[aai]+3 < src[i]) + src[i] = src[aai]+3; + } + } + if (rcGetCon(s, 1) != 0xf) + { + // (0,1) + const int ax = x + rcGetDirOffsetX(1); + const int ay = y + rcGetDirOffsetY(1); + const int ai = (int)chf.cells[ax+ay*w].index + rcGetCon(s, 1); + const rcCompactSpan& as = chf.spans[ai]; + if (src[ai]+2 < src[i]) + src[i] = src[ai]+2; + + // (-1,1) + if (rcGetCon(as, 0) != 0xf) + { + const int aax = ax + rcGetDirOffsetX(0); + const int aay = ay + rcGetDirOffsetY(0); + const int aai = (int)chf.cells[aax+aay*w].index + rcGetCon(as, 0); + if (src[aai]+3 < src[i]) + src[i] = src[aai]+3; + } + } + } + } + } + + maxDist = 0; + for (int i = 0; i < chf.spanCount; ++i) + maxDist = rcMax(src[i], maxDist); + + return src; + +} + +static unsigned short* boxBlur(rcCompactHeightfield& chf, int thr, + unsigned short* src, unsigned short* dst) +{ + const int w = chf.width; + const int h = chf.height; + + thr *= 2; + + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + const rcCompactCell& c = chf.cells[x+y*w]; + for (int i = (int)c.index, ni = (int)(c.index+c.count); i < ni; ++i) + { + const rcCompactSpan& s = chf.spans[i]; + int cd = (int)src[i]; + if (cd <= thr) + { + dst[i] = cd; + continue; + } + + int d = cd; + for (int dir = 0; dir < 4; ++dir) + { + if (rcGetCon(s, dir) != 0xf) + { + const int ax = x + rcGetDirOffsetX(dir); + const int ay = y + rcGetDirOffsetY(dir); + const int ai = (int)chf.cells[ax+ay*w].index + rcGetCon(s, dir); + d += (int)src[ai]; + + const rcCompactSpan& as = chf.spans[ai]; + const int dir2 = (dir+1) & 0x3; + if (rcGetCon(as, dir2) != 0xf) + { + const int ax2 = ax + rcGetDirOffsetX(dir2); + const int ay2 = ay + rcGetDirOffsetY(dir2); + const int ai2 = (int)chf.cells[ax2+ay2*w].index + rcGetCon(as, dir2); + d += (int)src[ai2]; + } + else + { + d += cd; + } + } + else + { + d += cd*2; + } + } + dst[i] = (unsigned short)((d+5)/9); + } + } + } + return dst; +} + + +static bool floodRegion(int x, int y, int i, + unsigned short level, unsigned short minLevel, unsigned short r, + rcCompactHeightfield& chf, + unsigned short* src, + rcIntArray& stack) +{ + const int w = chf.width; + + // Flood fill mark region. + stack.resize(0); + stack.push((int)x); + stack.push((int)y); + stack.push((int)i); + src[i*2] = r; + src[i*2+1] = 0; + + unsigned short lev = level >= minLevel+2 ? level-2 : minLevel; + int count = 0; + + while (stack.size() > 0) + { + int ci = stack.pop(); + int cy = stack.pop(); + int cx = stack.pop(); + + const rcCompactSpan& cs = chf.spans[ci]; + + // Check if any of the neighbours already have a valid region set. + unsigned short ar = 0; + for (int dir = 0; dir < 4; ++dir) + { + // 8 connected + if (rcGetCon(cs, dir) != 0xf) + { + const int ax = cx + rcGetDirOffsetX(dir); + const int ay = cy + rcGetDirOffsetY(dir); + const int ai = (int)chf.cells[ax+ay*w].index + rcGetCon(cs, dir); + unsigned short nr = src[ai*2]; + if (nr != 0 && nr != r) + ar = nr; + + const rcCompactSpan& as = chf.spans[ai]; + + const int dir2 = (dir+1) & 0x3; + if (rcGetCon(as, dir2) != 0xf) + { + const int ax2 = ax + rcGetDirOffsetX(dir2); + const int ay2 = ay + rcGetDirOffsetY(dir2); + const int ai2 = (int)chf.cells[ax2+ay2*w].index + rcGetCon(as, dir2); + + unsigned short nr = src[ai2*2]; + if (nr != 0 && nr != r) + ar = nr; + } + } + } + if (ar != 0) + { + src[ci*2] = 0; + continue; + } + count++; + + // Expand neighbours. + for (int dir = 0; dir < 4; ++dir) + { + if (rcGetCon(cs, dir) != 0xf) + { + const int ax = cx + rcGetDirOffsetX(dir); + const int ay = cy + rcGetDirOffsetY(dir); + const int ai = (int)chf.cells[ax+ay*w].index + rcGetCon(cs, dir); + if (chf.spans[ai].dist >= lev) + { + if (src[ai*2] == 0) + { + src[ai*2] = r; + src[ai*2+1] = 0; + stack.push(ax); + stack.push(ay); + stack.push(ai); + } + } + } + } + } + + return count > 0; +} + +static unsigned short* expandRegions(int maxIter, unsigned short level, + rcCompactHeightfield& chf, + unsigned short* src, + unsigned short* dst, + rcIntArray& stack) +{ + const int w = chf.width; + const int h = chf.height; + + // Find cells revealed by the raised level. + stack.resize(0); + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + const rcCompactCell& c = chf.cells[x+y*w]; + for (int i = (int)c.index, ni = (int)(c.index+c.count); i < ni; ++i) + { + if (chf.spans[i].dist >= level && src[i*2] == 0) + { + stack.push(x); + stack.push(y); + stack.push(i); + } + } + } + } + + int iter = 0; + while (stack.size() > 0) + { + int failed = 0; + + memcpy(dst, src, sizeof(unsigned short)*chf.spanCount*2); + + for (int j = 0; j < stack.size(); j += 3) + { + int x = stack[j+0]; + int y = stack[j+1]; + int i = stack[j+2]; + if (i < 0) + { + failed++; + continue; + } + + unsigned short r = src[i*2]; + unsigned short d2 = 0xffff; + const rcCompactSpan& s = chf.spans[i]; + for (int dir = 0; dir < 4; ++dir) + { + if (rcGetCon(s, dir) == 0xf) continue; + const int ax = x + rcGetDirOffsetX(dir); + const int ay = y + rcGetDirOffsetY(dir); + const int ai = (int)chf.cells[ax+ay*w].index + rcGetCon(s, dir); + if (src[ai*2] > 0 && (src[ai*2] & RC_BORDER_REG) == 0) + { + if ((int)src[ai*2+1]+2 < (int)d2) + { + r = src[ai*2]; + d2 = src[ai*2+1]+2; + } + } + } + if (r) + { + stack[j+2] = -1; // mark as used + dst[i*2] = r; + dst[i*2+1] = d2; + } + else + { + failed++; + } + } + + // rcSwap source and dest. + rcSwap(src, dst); + + if (failed*3 == stack.size()) + break; + + if (level > 0) + { + ++iter; + if (iter >= maxIter) + break; + } + } + + return src; +} + + +struct rcRegion +{ + inline rcRegion() : count(0), id(0), remap(false) {} + + int count; + unsigned short id; + bool remap; + rcIntArray connections; + rcIntArray floors; +}; + +static void removeAdjacentNeighbours(rcRegion& reg) +{ + // Remove adjacent duplicates. + for (int i = 0; i < reg.connections.size() && reg.connections.size() > 1; ) + { + int ni = (i+1) % reg.connections.size(); + if (reg.connections[i] == reg.connections[ni]) + { + // Remove duplicate + for (int j = i; j < reg.connections.size()-1; ++j) + reg.connections[j] = reg.connections[j+1]; + reg.connections.pop(); + } + else + ++i; + } +} + +static void replaceNeighbour(rcRegion& reg, unsigned short oldId, unsigned short newId) +{ + bool neiChanged = false; + for (int i = 0; i < reg.connections.size(); ++i) + { + if (reg.connections[i] == oldId) + { + reg.connections[i] = newId; + neiChanged = true; + } + } + for (int i = 0; i < reg.floors.size(); ++i) + { + if (reg.floors[i] == oldId) + reg.floors[i] = newId; + } + if (neiChanged) + removeAdjacentNeighbours(reg); +} + +static bool canMergeWithRegion(rcRegion& reg, unsigned short id) +{ + int n = 0; + for (int i = 0; i < reg.connections.size(); ++i) + { + if (reg.connections[i] == id) + n++; + } + if (n > 1) + return false; + for (int i = 0; i < reg.floors.size(); ++i) + { + if (reg.floors[i] == id) + return false; + } + return true; +} + +static void addUniqueFloorRegion(rcRegion& reg, unsigned short n) +{ + for (int i = 0; i < reg.floors.size(); ++i) + if (reg.floors[i] == n) + return; + reg.floors.push(n); +} + +static bool mergeRegions(rcRegion& rega, rcRegion& regb) +{ + unsigned short aid = rega.id; + unsigned short bid = regb.id; + + // Duplicate current neighbourhood. + rcIntArray acon; + acon.resize(rega.connections.size()); + for (int i = 0; i < rega.connections.size(); ++i) + acon[i] = rega.connections[i]; + rcIntArray& bcon = regb.connections; + + // Find insertion point on A. + int insa = -1; + for (int i = 0; i < acon.size(); ++i) + { + if (acon[i] == bid) + { + insa = i; + break; + } + } + if (insa == -1) + return false; + + // Find insertion point on B. + int insb = -1; + for (int i = 0; i < bcon.size(); ++i) + { + if (bcon[i] == aid) + { + insb = i; + break; + } + } + if (insb == -1) + return false; + + // Merge neighbours. + rega.connections.resize(0); + for (int i = 0, ni = acon.size(); i < ni-1; ++i) + rega.connections.push(acon[(insa+1+i) % ni]); + + for (int i = 0, ni = bcon.size(); i < ni-1; ++i) + rega.connections.push(bcon[(insb+1+i) % ni]); + + removeAdjacentNeighbours(rega); + + for (int j = 0; j < regb.floors.size(); ++j) + addUniqueFloorRegion(rega, regb.floors[j]); + rega.count += regb.count; + regb.count = 0; + regb.connections.resize(0); + + return true; +} + +static bool isRegionConnectedToBorder(const rcRegion& reg) +{ + // Region is connected to border if + // one of the neighbours is null id. + for (int i = 0; i < reg.connections.size(); ++i) + { + if (reg.connections[i] == 0) + return true; + } + return false; +} + +static bool isSolidEdge(rcCompactHeightfield& chf, unsigned short* src, + int x, int y, int i, int dir) +{ + const rcCompactSpan& s = chf.spans[i]; + unsigned short r = 0; + if (rcGetCon(s, dir) != 0xf) + { + const int ax = x + rcGetDirOffsetX(dir); + const int ay = y + rcGetDirOffsetY(dir); + const int ai = (int)chf.cells[ax+ay*chf.width].index + rcGetCon(s, dir); + r = src[ai*2]; + } + if (r == src[i*2]) + return false; + return true; +} + +static void walkContour(int x, int y, int i, int dir, + rcCompactHeightfield& chf, + unsigned short* src, + rcIntArray& cont) +{ + int startDir = dir; + int starti = i; + + const rcCompactSpan& ss = chf.spans[i]; + unsigned short curReg = 0; + if (rcGetCon(ss, dir) != 0xf) + { + const int ax = x + rcGetDirOffsetX(dir); + const int ay = y + rcGetDirOffsetY(dir); + const int ai = (int)chf.cells[ax+ay*chf.width].index + rcGetCon(ss, dir); + curReg = src[ai*2]; + } + cont.push(curReg); + + int iter = 0; + while (++iter < 40000) + { + const rcCompactSpan& s = chf.spans[i]; + + if (isSolidEdge(chf, src, x, y, i, dir)) + { + // Choose the edge corner + unsigned short r = 0; + if (rcGetCon(s, dir) != 0xf) + { + const int ax = x + rcGetDirOffsetX(dir); + const int ay = y + rcGetDirOffsetY(dir); + const int ai = (int)chf.cells[ax+ay*chf.width].index + rcGetCon(s, dir); + r = src[ai*2]; + } + if (r != curReg) + { + curReg = r; + cont.push(curReg); + } + + dir = (dir+1) & 0x3; // Rotate CW + } + else + { + int ni = -1; + const int nx = x + rcGetDirOffsetX(dir); + const int ny = y + rcGetDirOffsetY(dir); + if (rcGetCon(s, dir) != 0xf) + { + const rcCompactCell& nc = chf.cells[nx+ny*chf.width]; + ni = (int)nc.index + rcGetCon(s, dir); + } + if (ni == -1) + { + // Should not happen. + return; + } + x = nx; + y = ny; + i = ni; + dir = (dir+3) & 0x3; // Rotate CCW + } + + if (starti == i && startDir == dir) + { + break; + } + } + + // Remove adjacent duplicates. + if (cont.size() > 1) + { + for (int i = 0; i < cont.size(); ) + { + int ni = (i+1) % cont.size(); + if (cont[i] == cont[ni]) + { + for (int j = i; j < cont.size()-1; ++j) + cont[j] = cont[j+1]; + cont.pop(); + } + else + ++i; + } + } +} + +static bool filterSmallRegions(int minRegionSize, int mergeRegionSize, + unsigned short& maxRegionId, + rcCompactHeightfield& chf, + unsigned short* src) +{ + const int w = chf.width; + const int h = chf.height; + + int nreg = maxRegionId+1; + rcRegion* regions = new rcRegion[nreg]; + if (!regions) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "filterSmallRegions: Out of memory 'regions' (%d).", nreg); + return false; + } + + for (int i = 0; i < nreg; ++i) + regions[i].id = (unsigned short)i; + + // Find edge of a region and find connections around the contour. + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + const rcCompactCell& c = chf.cells[x+y*w]; + for (int i = (int)c.index, ni = (int)(c.index+c.count); i < ni; ++i) + { + unsigned short r = src[i*2]; + if (r == 0 || r >= nreg) + continue; + + rcRegion& reg = regions[r]; + reg.count++; + + + // Update floors. + for (int j = (int)c.index; j < ni; ++j) + { + if (i == j) continue; + unsigned short floorId = src[j*2]; + if (floorId == 0 || floorId >= nreg) + continue; + addUniqueFloorRegion(reg, floorId); + } + + // Have found contour + if (reg.connections.size() > 0) + continue; + + // Check if this cell is next to a border. + int ndir = -1; + for (int dir = 0; dir < 4; ++dir) + { + if (isSolidEdge(chf, src, x, y, i, dir)) + { + ndir = dir; + break; + } + } + + if (ndir != -1) + { + // The cell is at border. + // Walk around the contour to find all the neighbours. + walkContour(x, y, i, ndir, chf, src, reg.connections); + } + } + } + } + + // Remove too small unconnected regions. + for (int i = 0; i < nreg; ++i) + { + rcRegion& reg = regions[i]; + if (reg.id == 0 || (reg.id & RC_BORDER_REG)) + continue; + if (reg.count == 0) + continue; + + if (reg.connections.size() == 1 && reg.connections[0] == 0) + { + if (reg.count < minRegionSize) + { + // Non-connected small region, remove. + reg.count = 0; + reg.id = 0; + } + } + } + + + // Merge too small regions to neighbour regions. + int mergeCount = 0 ; + do + { + mergeCount = 0; + for (int i = 0; i < nreg; ++i) + { + rcRegion& reg = regions[i]; + if (reg.id == 0 || (reg.id & RC_BORDER_REG)) + continue; + if (reg.count == 0) + continue; + + // Check to see if the region should be merged. + if (reg.count > mergeRegionSize && isRegionConnectedToBorder(reg)) + continue; + + // Small region with more than 1 connection. + // Or region which is not connected to a border at all. + // Find smallest neighbour region that connects to this one. + int smallest = 0xfffffff; + unsigned short mergeId = reg.id; + for (int j = 0; j < reg.connections.size(); ++j) + { + if (reg.connections[j] & RC_BORDER_REG) continue; + rcRegion& mreg = regions[reg.connections[j]]; + if (mreg.id == 0 || (mreg.id & RC_BORDER_REG)) continue; + if (mreg.count < smallest && + canMergeWithRegion(reg, mreg.id) && + canMergeWithRegion(mreg, reg.id)) + { + smallest = mreg.count; + mergeId = mreg.id; + } + } + // Found new id. + if (mergeId != reg.id) + { + unsigned short oldId = reg.id; + rcRegion& target = regions[mergeId]; + + // Merge neighbours. + if (mergeRegions(target, reg)) + { + // Fixup regions pointing to current region. + for (int j = 0; j < nreg; ++j) + { + if (regions[j].id == 0 || (regions[j].id & RC_BORDER_REG)) continue; + // If another region was already merged into current region + // change the nid of the previous region too. + if (regions[j].id == oldId) + regions[j].id = mergeId; + // Replace the current region with the new one if the + // current regions is neighbour. + replaceNeighbour(regions[j], oldId, mergeId); + } + mergeCount++; + } + } + } + } + while (mergeCount > 0); + + // Compress region Ids. + for (int i = 0; i < nreg; ++i) + { + regions[i].remap = false; + if (regions[i].id == 0) continue; // Skip nil regions. + if (regions[i].id & RC_BORDER_REG) continue; // Skip external regions. + regions[i].remap = true; + } + + unsigned short regIdGen = 0; + for (int i = 0; i < nreg; ++i) + { + if (!regions[i].remap) + continue; + unsigned short oldId = regions[i].id; + unsigned short newId = ++regIdGen; + for (int j = i; j < nreg; ++j) + { + if (regions[j].id == oldId) + { + regions[j].id = newId; + regions[j].remap = false; + } + } + } + maxRegionId = regIdGen; + + // Remap regions. + for (int i = 0; i < chf.spanCount; ++i) + { + if ((src[i*2] & RC_BORDER_REG) == 0) + src[i*2] = regions[src[i*2]].id; + } + + delete [] regions; + + return true; +} + +bool rcBuildDistanceField(rcCompactHeightfield& chf) +{ + rcTimeVal startTime = rcGetPerformanceTimer(); + + unsigned short* dist0 = new unsigned short[chf.spanCount]; + if (!dist0) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "rcBuildDistanceField: Out of memory 'dist0' (%d).", chf.spanCount); + return false; + } + unsigned short* dist1 = new unsigned short[chf.spanCount]; + if (!dist1) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "rcBuildDistanceField: Out of memory 'dist1' (%d).", chf.spanCount); + delete [] dist0; + return false; + } + + unsigned short* src = dist0; + unsigned short* dst = dist1; + + unsigned short maxDist = 0; + + rcTimeVal distStartTime = rcGetPerformanceTimer(); + + if (calculateDistanceField(chf, src, dst, maxDist) != src) + rcSwap(src, dst); + + chf.maxDistance = maxDist; + + rcTimeVal distEndTime = rcGetPerformanceTimer(); + + rcTimeVal blurStartTime = rcGetPerformanceTimer(); + + // Blur + if (boxBlur(chf, 1, src, dst) != src) + rcSwap(src, dst); + + // Store distance. + for (int i = 0; i < chf.spanCount; ++i) + chf.spans[i].dist = src[i]; + + rcTimeVal blurEndTime = rcGetPerformanceTimer(); + + delete [] dist0; + delete [] dist1; + + rcTimeVal endTime = rcGetPerformanceTimer(); + +/* if (rcGetLog()) + { + rcGetLog()->log(RC_LOG_PROGRESS, "Build distance field: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f); + rcGetLog()->log(RC_LOG_PROGRESS, " - dist: %.3f ms", rcGetDeltaTimeUsec(distStartTime, distEndTime)/1000.0f); + rcGetLog()->log(RC_LOG_PROGRESS, " - blur: %.3f ms", rcGetDeltaTimeUsec(blurStartTime, blurEndTime)/1000.0f); + }*/ + if (rcGetBuildTimes()) + { + rcGetBuildTimes()->buildDistanceField += rcGetDeltaTimeUsec(startTime, endTime); + rcGetBuildTimes()->buildDistanceFieldDist += rcGetDeltaTimeUsec(distStartTime, distEndTime); + rcGetBuildTimes()->buildDistanceFieldBlur += rcGetDeltaTimeUsec(blurStartTime, blurEndTime); + } + + return true; +} + +static void paintRectRegion(int minx, int maxx, int miny, int maxy, + unsigned short regId, unsigned short minLevel, + rcCompactHeightfield& chf, unsigned short* src) +{ + const int w = chf.width; + for (int y = miny; y < maxy; ++y) + { + for (int x = minx; x < maxx; ++x) + { + const rcCompactCell& c = chf.cells[x+y*w]; + for (int i = (int)c.index, ni = (int)(c.index+c.count); i < ni; ++i) + { + if (chf.spans[i].dist >= minLevel) + src[i*2] = regId; + } + } + } +} + +bool rcBuildRegions(rcCompactHeightfield& chf, + int walkableRadius, int borderSize, + int minRegionSize, int mergeRegionSize) +{ + rcTimeVal startTime = rcGetPerformanceTimer(); + + const int w = chf.width; + const int h = chf.height; + + unsigned short* tmp1 = new unsigned short[chf.spanCount*2]; + if (!tmp1) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "rcBuildDistanceField: Out of memory 'tmp1' (%d).", chf.spanCount*2); + return false; + } + unsigned short* tmp2 = new unsigned short[chf.spanCount*2]; + if (!tmp2) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "rcBuildDistanceField: Out of memory 'tmp2' (%d).", chf.spanCount*2); + delete [] tmp1; + return false; + } + + rcTimeVal regStartTime = rcGetPerformanceTimer(); + + rcIntArray stack(1024); + rcIntArray visited(1024); + + unsigned short* src = tmp1; + unsigned short* dst = tmp2; + + memset(src, 0, sizeof(unsigned short) * chf.spanCount*2); + + unsigned short regionId = 1; + unsigned short level = (chf.maxDistance+1) & ~1; + + unsigned short minLevel = (unsigned short)(walkableRadius*2); + + const int expandIters = 4 + walkableRadius * 2; + + // Mark border regions. + paintRectRegion(0, borderSize, 0, h, regionId|RC_BORDER_REG, minLevel, chf, src); regionId++; + paintRectRegion(w-borderSize, w, 0, h, regionId|RC_BORDER_REG, minLevel, chf, src); regionId++; + paintRectRegion(0, w, 0, borderSize, regionId|RC_BORDER_REG, minLevel, chf, src); regionId++; + paintRectRegion(0, w, h-borderSize, h, regionId|RC_BORDER_REG, minLevel, chf, src); regionId++; + + rcTimeVal expTime = 0; + rcTimeVal floodTime = 0; + + while (level > minLevel) + { + level = level >= 2 ? level-2 : 0; + + rcTimeVal expStartTime = rcGetPerformanceTimer(); + + // Expand current regions until no empty connected cells found. + if (expandRegions(expandIters, level, chf, src, dst, stack) != src) + rcSwap(src, dst); + + expTime += rcGetPerformanceTimer() - expStartTime; + + rcTimeVal floodStartTime = rcGetPerformanceTimer(); + + // Mark new regions with IDs. + for (int y = 0; y < h; ++y) + { + for (int x = 0; x < w; ++x) + { + const rcCompactCell& c = chf.cells[x+y*w]; + for (int i = (int)c.index, ni = (int)(c.index+c.count); i < ni; ++i) + { + if (chf.spans[i].dist < level || src[i*2] != 0) + continue; + + if (floodRegion(x, y, i, minLevel, level, regionId, chf, src, stack)) + regionId++; + } + } + } + + floodTime += rcGetPerformanceTimer() - floodStartTime; + + } + + // Expand current regions until no empty connected cells found. + if (expandRegions(expandIters*8, minLevel, chf, src, dst, stack) != src) + rcSwap(src, dst); + + rcTimeVal regEndTime = rcGetPerformanceTimer(); + + rcTimeVal filterStartTime = rcGetPerformanceTimer(); + + // Filter out small regions. + chf.maxRegions = regionId; + if (!filterSmallRegions(minRegionSize, mergeRegionSize, chf.maxRegions, chf, src)) + return false; + + rcTimeVal filterEndTime = rcGetPerformanceTimer(); + + // Write the result out. + for (int i = 0; i < chf.spanCount; ++i) + chf.spans[i].reg = src[i*2]; + + delete [] tmp1; + delete [] tmp2; + + rcTimeVal endTime = rcGetPerformanceTimer(); + +/* if (rcGetLog()) + { + rcGetLog()->log(RC_LOG_PROGRESS, "Build regions: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f); + rcGetLog()->log(RC_LOG_PROGRESS, " - reg: %.3f ms", rcGetDeltaTimeUsec(regStartTime, regEndTime)/1000.0f); + rcGetLog()->log(RC_LOG_PROGRESS, " - exp: %.3f ms", rcGetDeltaTimeUsec(0, expTime)/1000.0f); + rcGetLog()->log(RC_LOG_PROGRESS, " - flood: %.3f ms", rcGetDeltaTimeUsec(0, floodTime)/1000.0f); + rcGetLog()->log(RC_LOG_PROGRESS, " - filter: %.3f ms", rcGetDeltaTimeUsec(filterStartTime, filterEndTime)/1000.0f); + } +*/ + if (rcGetBuildTimes()) + { + rcGetBuildTimes()->buildRegions += rcGetDeltaTimeUsec(startTime, endTime); + rcGetBuildTimes()->buildRegionsReg += rcGetDeltaTimeUsec(regStartTime, regEndTime); + rcGetBuildTimes()->buildRegionsExp += rcGetDeltaTimeUsec(0, expTime); + rcGetBuildTimes()->buildRegionsFlood += rcGetDeltaTimeUsec(0, floodTime); + rcGetBuildTimes()->buildRegionsFilter += rcGetDeltaTimeUsec(filterStartTime, filterEndTime); + } + + return true; +} + + diff --git a/extern/recastnavigation/Recast/Source/RecastTimer.cpp b/extern/recastnavigation/Recast/Source/RecastTimer.cpp new file mode 100644 index 00000000000..51ffb7d3160 --- /dev/null +++ b/extern/recastnavigation/Recast/Source/RecastTimer.cpp @@ -0,0 +1,58 @@ +#include "RecastTimer.h" + +#if defined(WIN32) + +// Win32 +#include + +rcTimeVal rcGetPerformanceTimer() +{ + __int64 count; + QueryPerformanceCounter((LARGE_INTEGER*)&count); + return count; +} + +int rcGetDeltaTimeUsec(rcTimeVal start, rcTimeVal end) +{ + static __int64 freq = 0; + if (freq == 0) + QueryPerformanceFrequency((LARGE_INTEGER*)&freq); + __int64 elapsed = end - start; + return (int)(elapsed*1000000 / freq); +} + +#elif defined(__MACH__) + +// OSX +#include + +rcTimeVal rcGetPerformanceTimer() +{ + return mach_absolute_time(); +} + +int rcGetDeltaTimeUsec(rcTimeVal start, rcTimeVal end) +{ + static mach_timebase_info_data_t timebaseInfo; + if (timebaseInfo.denom == 0) + mach_timebase_info(&timebaseInfo); + uint64_t elapsed = end - start; + uint64_t nanosec = elapsed * timebaseInfo.numer / timebaseInfo.denom; + return (int)(nanosec / 1000); +} + +#else + +// TODO: Linux, etc + +rcTimeVal rcGetPerformanceTimer() +{ + return 0; +} + +int rcGetDeltaTimeUsec(rcTimeVal start, rcTimeVal end) +{ + return 0; +} + +#endif \ No newline at end of file diff --git a/extern/recastnavigation/make/msvc_9_0/recastnavigation.vcproj b/extern/recastnavigation/make/msvc_9_0/recastnavigation.vcproj new file mode 100644 index 00000000000..c0f451176c6 --- /dev/null +++ b/extern/recastnavigation/make/msvc_9_0/recastnavigation.vcproj @@ -0,0 +1,275 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/projectfiles_vc9/blender/blender.sln b/projectfiles_vc9/blender/blender.sln index 8cbf5cf35c7..c9cc7fa20b4 100644 --- a/projectfiles_vc9/blender/blender.sln +++ b/projectfiles_vc9/blender/blender.sln @@ -19,6 +19,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "blender", "blender.vcproj", {7495FE37-933A-4AC1-BB2A-B3FDB4DE4284} = {7495FE37-933A-4AC1-BB2A-B3FDB4DE4284} {51FB3D48-2467-4BFA-A321-D848252B437E} = {51FB3D48-2467-4BFA-A321-D848252B437E} {FFD3C64A-30E2-4BC7-BC8F-51818C320400} = {FFD3C64A-30E2-4BC7-BC8F-51818C320400} + {FB55B14E-D38E-4D04-BA7B-748EBC97FDB6} = {FB55B14E-D38E-4D04-BA7B-748EBC97FDB6} {31628053-825D-4C06-8A21-D13883489718} = {31628053-825D-4C06-8A21-D13883489718} {EADC3C5A-6C51-4F03-8038-1553E7D7F740} = {EADC3C5A-6C51-4F03-8038-1553E7D7F740} {59567A5B-F63A-4A5C-B33A-0A45C300F4DC} = {59567A5B-F63A-4A5C-B33A-0A45C300F4DC} @@ -340,6 +341,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BF_collada", "collada\BF_co EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BL_modifiers", "modifiers\modifiers.vcproj", "{7CB0C521-91E0-40CE-A7C4-45FEA7ABE8BC}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "EXT_recastnavigation", "..\..\extern\recastnavigation\make\msvc_9_0\recastnavigation.vcproj", "{FB55B14E-D38E-4D04-BA7B-748EBC97FDB6}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution 3D Plugin Debug|Win32 = 3D Plugin Debug|Win32 @@ -1617,6 +1620,26 @@ Global {7CB0C521-91E0-40CE-A7C4-45FEA7ABE8BC}.Debug|Win32.Build.0 = Blender Debug|Win32 {7CB0C521-91E0-40CE-A7C4-45FEA7ABE8BC}.Release|Win32.ActiveCfg = Blender Release|Win32 {7CB0C521-91E0-40CE-A7C4-45FEA7ABE8BC}.Release|Win32.Build.0 = Blender Release|Win32 + {FB55B14E-D38E-4D04-BA7B-748EBC97FDB6}.3D Plugin Debug|Win32.ActiveCfg = Debug|Win32 + {FB55B14E-D38E-4D04-BA7B-748EBC97FDB6}.3D Plugin Debug|Win32.Build.0 = Debug|Win32 + {FB55B14E-D38E-4D04-BA7B-748EBC97FDB6}.3D Plugin Release|Win32.ActiveCfg = Release|Win32 + {FB55B14E-D38E-4D04-BA7B-748EBC97FDB6}.3D Plugin Release|Win32.Build.0 = Release|Win32 + {FB55B14E-D38E-4D04-BA7B-748EBC97FDB6}.3DPlugin Debug|Win32.ActiveCfg = Debug|Win32 + {FB55B14E-D38E-4D04-BA7B-748EBC97FDB6}.3DPlugin Debug|Win32.Build.0 = Debug|Win32 + {FB55B14E-D38E-4D04-BA7B-748EBC97FDB6}.3DPlugin Release|Win32.ActiveCfg = Release|Win32 + {FB55B14E-D38E-4D04-BA7B-748EBC97FDB6}.3DPlugin Release|Win32.Build.0 = Release|Win32 + {FB55B14E-D38E-4D04-BA7B-748EBC97FDB6}.Blender Debug|Win32.ActiveCfg = Debug|Win32 + {FB55B14E-D38E-4D04-BA7B-748EBC97FDB6}.Blender Debug|Win32.Build.0 = Debug|Win32 + {FB55B14E-D38E-4D04-BA7B-748EBC97FDB6}.Blender Release|Win32.ActiveCfg = Release|Win32 + {FB55B14E-D38E-4D04-BA7B-748EBC97FDB6}.Blender Release|Win32.Build.0 = Release|Win32 + {FB55B14E-D38E-4D04-BA7B-748EBC97FDB6}.BlenderPlayer Debug|Win32.ActiveCfg = Debug|Win32 + {FB55B14E-D38E-4D04-BA7B-748EBC97FDB6}.BlenderPlayer Debug|Win32.Build.0 = Debug|Win32 + {FB55B14E-D38E-4D04-BA7B-748EBC97FDB6}.BlenderPlayer Release|Win32.ActiveCfg = Release|Win32 + {FB55B14E-D38E-4D04-BA7B-748EBC97FDB6}.BlenderPlayer Release|Win32.Build.0 = Release|Win32 + {FB55B14E-D38E-4D04-BA7B-748EBC97FDB6}.Debug|Win32.ActiveCfg = Debug|Win32 + {FB55B14E-D38E-4D04-BA7B-748EBC97FDB6}.Debug|Win32.Build.0 = Debug|Win32 + {FB55B14E-D38E-4D04-BA7B-748EBC97FDB6}.Release|Win32.ActiveCfg = Release|Win32 + {FB55B14E-D38E-4D04-BA7B-748EBC97FDB6}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From 56784fcde9e4a4ff1553bf555e66b59208c90b3c Mon Sep 17 00:00:00 2001 From: Nick Samarin Date: Wed, 19 May 2010 01:42:17 +0000 Subject: [PATCH 003/182] added converting mesh of game object to Detour StatNavMesh (game object is defined by property "navmesh") --- .../Detour/Include/DetourStatNavMeshBuilder.h | 4 + .../Source/DetourStatNavMeshBuilder.cpp | 2 +- .../recastnavigation/Recast/Include/Recast.h | 1 + .../Recast/Source/RecastMesh.cpp | 2 +- .../gameengine/converter/KX_converter.vcproj | 6 +- .../gameengine/ketsji/KX_ketsji.vcproj | 14 +- .../Converter/BL_BlenderDataConversion.cpp | 21 ++ source/gameengine/Ketsji/KX_KetsjiEngine.cpp | 5 + source/gameengine/Ketsji/KX_Pathfinder.cpp | 332 ++++++++++++++++++ source/gameengine/Ketsji/KX_Pathfinder.h | 51 +++ source/gameengine/Ketsji/KX_Scene.cpp | 12 +- source/gameengine/Ketsji/KX_Scene.h | 5 +- 12 files changed, 444 insertions(+), 11 deletions(-) create mode 100644 source/gameengine/Ketsji/KX_Pathfinder.cpp create mode 100644 source/gameengine/Ketsji/KX_Pathfinder.h diff --git a/extern/recastnavigation/Detour/Include/DetourStatNavMeshBuilder.h b/extern/recastnavigation/Detour/Include/DetourStatNavMeshBuilder.h index 3b8f7519b2f..03c79c429e7 100644 --- a/extern/recastnavigation/Detour/Include/DetourStatNavMeshBuilder.h +++ b/extern/recastnavigation/Detour/Include/DetourStatNavMeshBuilder.h @@ -26,4 +26,8 @@ bool dtCreateNavMeshData(const unsigned short* verts, const int nverts, const unsigned char* dtris, const int ndtris, unsigned char** outData, int* outDataSize); +int createBVTree(const unsigned short* verts, const int nverts, + const unsigned short* polys, const int npolys, const int nvp, + float cs, float ch, int nnodes, dtStatBVNode* nodes); + #endif // DETOURSTATNAVMESHBUILDER_H \ No newline at end of file diff --git a/extern/recastnavigation/Detour/Source/DetourStatNavMeshBuilder.cpp b/extern/recastnavigation/Detour/Source/DetourStatNavMeshBuilder.cpp index a2bfb94edbc..2ca455fb53d 100644 --- a/extern/recastnavigation/Detour/Source/DetourStatNavMeshBuilder.cpp +++ b/extern/recastnavigation/Detour/Source/DetourStatNavMeshBuilder.cpp @@ -160,7 +160,7 @@ static void subdivide(BVItem* items, int nitems, int imin, int imax, int& curNod } } -static int createBVTree(const unsigned short* verts, const int nverts, +/*static*/ int createBVTree(const unsigned short* verts, const int nverts, const unsigned short* polys, const int npolys, const int nvp, float cs, float ch, int nnodes, dtStatBVNode* nodes) diff --git a/extern/recastnavigation/Recast/Include/Recast.h b/extern/recastnavigation/Recast/Include/Recast.h index 5fe5447ab7c..f25ab47f8fa 100644 --- a/extern/recastnavigation/Recast/Include/Recast.h +++ b/extern/recastnavigation/Recast/Include/Recast.h @@ -496,5 +496,6 @@ bool rcBuildPolyMeshDetail(const rcPolyMesh& mesh, const rcCompactHeightfield& c bool rcMergePolyMeshDetails(rcPolyMeshDetail** meshes, const int nmeshes, rcPolyMeshDetail& mesh); +bool buildMeshAdjacency(unsigned short* polys, const int npolys, const int nverts, const int vertsPerPoly); #endif // RECAST_H diff --git a/extern/recastnavigation/Recast/Source/RecastMesh.cpp b/extern/recastnavigation/Recast/Source/RecastMesh.cpp index 0bcca9314c6..45ed4a2fdc6 100644 --- a/extern/recastnavigation/Recast/Source/RecastMesh.cpp +++ b/extern/recastnavigation/Recast/Source/RecastMesh.cpp @@ -32,7 +32,7 @@ struct rcEdge unsigned short poly[2]; }; -static bool buildMeshAdjacency(unsigned short* polys, const int npolys, +/*static */bool buildMeshAdjacency(unsigned short* polys, const int npolys, const int nverts, const int vertsPerPoly) { // Based on code by Eric Lengyel from: diff --git a/projectfiles_vc9/gameengine/converter/KX_converter.vcproj b/projectfiles_vc9/gameengine/converter/KX_converter.vcproj index 474ecb36f46..8dc9b41b9bc 100644 --- a/projectfiles_vc9/gameengine/converter/KX_converter.vcproj +++ b/projectfiles_vc9/gameengine/converter/KX_converter.vcproj @@ -1,7 +1,7 @@ + + @@ -856,6 +860,10 @@ RelativePath="..\..\..\source\gameengine\Ketsji\KX_OdePhysicsController.h" > + + diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp index 4a2aa3695fa..09c7c8eeed9 100644 --- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp +++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp @@ -172,6 +172,8 @@ extern "C" { #include "BL_ArmatureObject.h" #include "BL_DeformableGameObject.h" +#include "KX_Pathfinder.h" + #ifdef __cplusplus extern "C" { #endif @@ -2669,6 +2671,25 @@ void BL_ConvertBlenderObjects(struct Main* maggie, logicbrick_conversionlist->Release(); + //create navigation mesh + KX_Pathfinder* pathfinder = kxscene->GetPathfinder(); + if (pathfinder) + { + for ( i=0;iGetCount();i++) + { + KX_GameObject* gameobj = static_cast(objectlist->GetValue(i)); + struct Object* blenderobject = gameobj->GetBlenderObject(); + if (blenderobject->type==OB_MESH && gameobj->GetProperty("navmesh") && gameobj->GetMeshCount()>0) + { + RAS_MeshObject* meshobj = gameobj->GetMesh(0); + pathfinder->createFromMesh(meshobj); + gameobj->SetVisible(0, 0); + } + } + } + + + // Calculate the scene btree - // too slow - commented out. //kxscene->SetNodeTree(tf.MakeTree()); diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp index 71cd8b36045..52a3471f481 100644 --- a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp +++ b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp @@ -75,6 +75,8 @@ #include "DNA_world_types.h" #include "DNA_scene_types.h" +#include "KX_Pathfinder.h" + // If define: little test for Nzc: guarded drawing. If the canvas is // not valid, skip rendering this frame. //#define NZC_GUARDED_OUTPUT @@ -1323,6 +1325,9 @@ void KX_KetsjiEngine::RenderFrame(KX_Scene* scene, KX_Camera* cam) if (scene->GetPhysicsEnvironment()) scene->GetPhysicsEnvironment()->debugDrawWorld(); + + if (scene->GetPathfinder()) + scene->GetPathfinder()->debugDraw(); } /* To run once per scene diff --git a/source/gameengine/Ketsji/KX_Pathfinder.cpp b/source/gameengine/Ketsji/KX_Pathfinder.cpp new file mode 100644 index 00000000000..df9d9cb4869 --- /dev/null +++ b/source/gameengine/Ketsji/KX_Pathfinder.cpp @@ -0,0 +1,332 @@ +/** +* $Id: +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. +* All rights reserved. +* +* The Original Code is: all of this file. +* +* Contributor(s): none yet. +* +* ***** END GPL LICENSE BLOCK ***** +*/ + +#include "KX_Pathfinder.h" +#include "RAS_MeshObject.h" + +#include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" +extern "C" { +#include "BKE_scene.h" +#include "BKE_customdata.h" +#include "BKE_cdderivedmesh.h" +#include "BKE_DerivedMesh.h" +} +#include "KX_PythonInit.h" +#include "Recast.h" +#include "DetourStatNavMeshBuilder.h" + +static void calcMeshBounds(const float* vert, int nverts, float* bmin, float* bmax) +{ + bmin[0] = bmax[0] = vert[0]; + bmin[1] = bmax[1] = vert[1]; + bmin[2] = bmax[2] = vert[2]; + for (int i=1; ivert[i+0]) bmin[0] = vert[i+0]; + if (bmin[1]>vert[i+1]) bmin[1] = vert[i+1]; + if (bmin[2]>vert[i+2]) bmin[2] = vert[i+2]; + + if (bmax[0]HasColliderPolygon()==false) + { + return false; + } + + DerivedMesh* dm = CDDM_from_mesh(meshobj->GetMesh(), NULL); + + MVert *mvert = dm->getVertArray(dm); + MFace *mface = dm->getFaceArray(dm); + int numpolys = dm->getNumFaces(dm); + int numverts = dm->getNumVerts(dm); + int* index = (int*)dm->getFaceDataArray(dm, CD_ORIGINDEX); + MTFace *tface = (MTFace *)dm->getFaceDataArray(dm, CD_MTFACE); + + vector vert_tag_array(numverts, false); + vector vert_remap_array(numverts, 0); + + // Tag verts we're using + for (int p2=0; p2GetPolygon((index)? index[p2]: p2); + // only add polygons that have the collision flag set + if (poly->IsCollider()) + { + if (vert_tag_array[mf->v1]==false) + {vert_tag_array[mf->v1]= true;vert_remap_array[mf->v1]= (size_t)nverts;nverts++;} + if (vert_tag_array[mf->v2]==false) + {vert_tag_array[mf->v2]= true;vert_remap_array[mf->v2]= (size_t)nverts;nverts++;} + if (vert_tag_array[mf->v3]==false) + {vert_tag_array[mf->v3]= true;vert_remap_array[mf->v3]= (size_t)nverts;nverts++;} + if (mf->v4 && vert_tag_array[mf->v4]==false) + {vert_tag_array[mf->v4]= true;vert_remap_array[mf->v4]= (size_t)nverts;nverts++;} + npolys += (mf->v4 ? 2:1); /* a quad or a tri */ + } + } + + if (nverts >= 0xffff) + return false; + + vertices = new float[nverts*3]; + faces = new unsigned short[npolys*3*2]; + memset(faces,0xff,sizeof(unsigned short)*3*2*npolys); + float *bt= vertices; + unsigned short *tri_pt= faces; + + for (int p2=0; p2GetPolygon((index)? index[p2]: p2); + // only add polygons that have the collisionflag set + if (poly->IsCollider()) + { + MVert *v1= &mvert[mf->v1]; + MVert *v2= &mvert[mf->v2]; + MVert *v3= &mvert[mf->v3]; + + // the face indicies + tri_pt[0]= vert_remap_array[mf->v1]; + tri_pt[1]= vert_remap_array[mf->v2]; + tri_pt[2]= vert_remap_array[mf->v3]; + tri_pt= tri_pt+6; + + // the vertex location + if (vert_tag_array[mf->v1]==true) { /* *** v1 *** */ + vert_tag_array[mf->v1]= false; + *bt++ = v1->co[0]; + *bt++ = v1->co[1]; + *bt++ = v1->co[2]; + } + if (vert_tag_array[mf->v2]==true) { /* *** v2 *** */ + vert_tag_array[mf->v2]= false; + *bt++ = v2->co[0]; + *bt++ = v2->co[1]; + *bt++ = v2->co[2]; + } + if (vert_tag_array[mf->v3]==true) { /* *** v3 *** */ + vert_tag_array[mf->v3]= false; + *bt++ = v3->co[0]; + *bt++ = v3->co[1]; + *bt++ = v3->co[2]; + } + + if (mf->v4) + { + MVert *v4= &mvert[mf->v4]; + + tri_pt[0]= vert_remap_array[mf->v1]; + tri_pt[1]= vert_remap_array[mf->v3]; + tri_pt[2]= vert_remap_array[mf->v4]; + tri_pt= tri_pt+3; + + // the vertex location + if (vert_tag_array[mf->v4]==true) { /* *** v4 *** */ + vert_tag_array[mf->v4]= false; + *bt++ = v4->co[0]; + *bt++ = v4->co[1]; + *bt++ = v4->co[2]; + } + } + } + } + + dm->release(dm); + dm = NULL; + const int vertsPerPoly = 3; + buildMeshAdjacency(faces, npolys, nverts, vertsPerPoly); + return true; +} + +bool KX_Pathfinder::createFromMesh(RAS_MeshObject* meshobj) +{ + float* vertices = NULL; + unsigned short* faces = NULL; + int nverts = 0, npolys = 0; + if (!buildVertIndArrays(meshobj, vertices, nverts, faces, npolys)) + return false; + + + int ndtris = npolys; + int uniqueDetailVerts = 0; + float cs = 0.2f; + + if (!nverts || !npolys) + return false; + + float bmin[3], bmax[3]; + calcMeshBounds(vertices, nverts, bmin, bmax); + + // Calculate data size + const int headerSize = sizeof(dtStatNavMeshHeader); + const int vertsSize = sizeof(float)*3*nverts; + const int polysSize = sizeof(dtStatPoly)*npolys; + const int nodesSize = sizeof(dtStatBVNode)*npolys*2; + const int detailMeshesSize = sizeof(dtStatPolyDetail)*npolys; + const int detailVertsSize = sizeof(float)*3*uniqueDetailVerts; + const int detailTrisSize = sizeof(unsigned char)*4*ndtris; + + const int dataSize = headerSize + vertsSize + polysSize + nodesSize + + detailMeshesSize + detailVertsSize + detailTrisSize; + unsigned char* data = new unsigned char[dataSize]; + if (!data) + return false; + memset(data, 0, dataSize); + + unsigned char* d = data; + dtStatNavMeshHeader* header = (dtStatNavMeshHeader*)d; d += headerSize; + float* navVerts = (float*)d; d += vertsSize; + dtStatPoly* navPolys = (dtStatPoly*)d; d += polysSize; + dtStatBVNode* navNodes = (dtStatBVNode*)d; d += nodesSize; + dtStatPolyDetail* navDMeshes = (dtStatPolyDetail*)d; d += detailMeshesSize; + float* navDVerts = (float*)d; d += detailVertsSize; + unsigned char* navDTris = (unsigned char*)d; d += detailTrisSize; + + // Store header + header->magic = DT_STAT_NAVMESH_MAGIC; + header->version = DT_STAT_NAVMESH_VERSION; + header->npolys = npolys; + header->nverts = nverts; + header->cs = cs; + header->bmin[0] = bmin[0]; + header->bmin[1] = bmin[1]; + header->bmin[2] = bmin[2]; + header->bmax[0] = bmax[0]; + header->bmax[1] = bmax[1]; + header->bmax[2] = bmax[2]; + header->ndmeshes = npolys; + header->ndverts = uniqueDetailVerts; + header->ndtris = ndtris; + + memcpy(navVerts, vertices, nverts*3*sizeof(float)); + + // Store polygons + const int nvp = 3; + const unsigned short* src = faces; + for (int i = 0; i < npolys; ++i) + { + dtStatPoly* p = &navPolys[i]; + p->nv = 0; + for (int j = 0; j < nvp; ++j) + { + p->v[j] = src[j]; + p->n[j] = src[nvp+j]+1; + p->nv++; + } + src += nvp*2; + } + + //quantize vertex pos to creating BVTree + unsigned short* vertsi = new unsigned short[3*nverts]; + float* vf = vertices; + unsigned short* vi = vertsi; + float ics = 1.f/cs; + for (int i=0; i(vf[i]*ics); + } + header->nnodes = createBVTree(vertsi, nverts, faces, npolys, nvp, + cs, cs, npolys*2, navNodes); + + //create fake detail meshes + unsigned short vbase = 0; + for (int i = 0; i < npolys; ++i) + { + dtStatPolyDetail& dtl = navDMeshes[i]; + dtl.vbase = 0; + dtl.nverts = 0; + dtl.tbase = i; + dtl.ntris = 1; + } + // setup triangles. + unsigned char* tri = navDTris; + const unsigned short* face = faces; + for(size_t i=0; iinit(data, dataSize, true); + + delete [] vertices; + delete [] faces; + + return true; +} + +void KX_Pathfinder::debugDraw() +{ + if (!m_navMesh) + return; + MT_Vector3 color(0.f, 0.f, 0.f); + + for (int i = 0; i < m_navMesh->getPolyDetailCount(); ++i) + { + const dtStatPoly* p = m_navMesh->getPoly(i); + const dtStatPolyDetail* pd = m_navMesh->getPolyDetail(i); + + for (int j = 0; j < pd->ntris; ++j) + { + const unsigned char* t = m_navMesh->getDetailTri(pd->tbase+j); + MT_Vector3 tri[3]; + for (int k = 0; k < 3; ++k) + { + if (t[k] < p->nv) + tri[k].setValue(m_navMesh->getVertex(p->v[t[k]])); + else + tri[k].setValue(m_navMesh->getDetailVertex(pd->vbase+(t[k]-p->nv))); + } + + for (int k=0; k<3; k++) + KX_RasterizerDrawDebugLine(tri[k], tri[(k+1)%3], color); + } + } +} diff --git a/source/gameengine/Ketsji/KX_Pathfinder.h b/source/gameengine/Ketsji/KX_Pathfinder.h new file mode 100644 index 00000000000..587f5af2b4f --- /dev/null +++ b/source/gameengine/Ketsji/KX_Pathfinder.h @@ -0,0 +1,51 @@ +/** +* $Id: +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. +* All rights reserved. +* +* The Original Code is: all of this file. +* +* Contributor(s): none yet. +* +* ***** END GPL LICENSE BLOCK ***** +*/ +#ifndef __KX_PATHFINDER +#define __KX_PATHFINDER +#include "DetourStatNavMesh.h" +#include + +class RAS_MeshObject; + +class KX_Pathfinder +{ +public: + KX_Pathfinder(); + ~KX_Pathfinder(); + bool createFromMesh(RAS_MeshObject* meshobj); + void debugDraw(); +protected: + bool buildVertIndArrays(RAS_MeshObject* meshobj, float *&vertices, int& nverts, + unsigned short *&faces, int& npolys); + + dtStatNavMesh* m_navMesh; +}; + +#endif //__KX_PATHFINDER + diff --git a/source/gameengine/Ketsji/KX_Scene.cpp b/source/gameengine/Ketsji/KX_Scene.cpp index ebd0fa5c525..4f2884ee751 100644 --- a/source/gameengine/Ketsji/KX_Scene.cpp +++ b/source/gameengine/Ketsji/KX_Scene.cpp @@ -94,7 +94,7 @@ #endif #include "KX_Light.h" - +#include "KX_Pathfinder.h" #include void* KX_SceneReplicationFunc(SG_IObject* node,void* gameobj,void* scene) @@ -150,7 +150,8 @@ KX_Scene::KX_Scene(class SCA_IInputDevice* keyboarddevice, m_networkDeviceInterface(ndi), m_active_camera(NULL), m_ueberExecutionPriority(0), - m_blenderScene(scene) + m_blenderScene(scene), + m_pathfinder(NULL) { m_suspendedtime = 0.0; m_suspendeddelta = 0.0; @@ -210,6 +211,8 @@ KX_Scene::KX_Scene(class SCA_IInputDevice* keyboarddevice, m_rootnode = NULL; m_bucketmanager=new RAS_BucketManager(); + + m_pathfinder = new KX_Pathfinder(); #ifndef DISABLE_PYTHON m_attr_dict = PyDict_New(); /* new ref */ @@ -265,6 +268,11 @@ KX_Scene::~KX_Scene() delete m_bucketmanager; } + if (m_pathfinder) + { + delete m_pathfinder; + } + #ifndef DISABLE_PYTHON PyDict_Clear(m_attr_dict); Py_DECREF(m_attr_dict); diff --git a/source/gameengine/Ketsji/KX_Scene.h b/source/gameengine/Ketsji/KX_Scene.h index 4755eee6a6b..e19d846f0ad 100644 --- a/source/gameengine/Ketsji/KX_Scene.h +++ b/source/gameengine/Ketsji/KX_Scene.h @@ -83,6 +83,7 @@ class SCA_JoystickManager; class btCollisionShape; class KX_BlenderSceneConverter; struct KX_ClientObjectInfo; +class KX_Pathfinder; /* for ID freeing */ #define IS_TAGGED(_id) ((_id) && (((ID *)_id)->flag & LIB_DOIT)) @@ -276,6 +277,8 @@ protected: struct Scene* m_blenderScene; RAS_2DFilterManager m_filtermanager; + + KX_Pathfinder* m_pathfinder; public: KX_Scene(class SCA_IInputDevice* keyboarddevice, class SCA_IInputDevice* mousedevice, @@ -611,7 +614,7 @@ public: // m_bucketmanager->PrintStats(verbose_level) //} - + KX_Pathfinder *GetPathfinder() {return m_pathfinder; }; }; typedef std::vector KX_SceneList; From d7a701c2c5ffbe9313431c6367a264e54136accb Mon Sep 17 00:00:00 2001 From: Nick Samarin Date: Thu, 27 May 2010 20:18:56 +0000 Subject: [PATCH 004/182] - added new game object type for navigation mesh - added py api for path finding and ray casting - set svn properties for KX_Pathfinder --- source/blender/makesdna/DNA_object_types.h | 2 + source/blender/makesrna/intern/rna_object.c | 21 +- .../Converter/BL_BlenderDataConversion.cpp | 31 +- source/gameengine/Ketsji/KX_KetsjiEngine.cpp | 3 - source/gameengine/Ketsji/KX_Pathfinder.cpp | 345 ++++++++++++------ source/gameengine/Ketsji/KX_Pathfinder.h | 39 +- .../gameengine/Ketsji/KX_PythonInitTypes.cpp | 2 + source/gameengine/Ketsji/KX_Scene.cpp | 11 +- source/gameengine/Ketsji/KX_Scene.h | 3 - 9 files changed, 302 insertions(+), 155 deletions(-) diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h index f50909e641b..6132cb2174b 100644 --- a/source/blender/makesdna/DNA_object_types.h +++ b/source/blender/makesdna/DNA_object_types.h @@ -463,6 +463,7 @@ extern Object workob; #define OB_SOFT_BODY 0x20000 #define OB_OCCLUDER 0x40000 #define OB_SENSOR 0x80000 +#define OB_NAVMESH 0x100000 /* ob->gameflag2 */ #define OB_NEVER_DO_ACTIVITY_CULLING 1 @@ -483,6 +484,7 @@ extern Object workob; #define OB_BODY_TYPE_SOFT 4 #define OB_BODY_TYPE_OCCLUDER 5 #define OB_BODY_TYPE_SENSOR 6 +#define OB_BODY_TYPE_NAVMESH 7 /* ob->scavisflag */ #define OB_VIS_SENS 1 diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c index 93a133bf380..f0eaf34a35b 100644 --- a/source/blender/makesrna/intern/rna_object.c +++ b/source/blender/makesrna/intern/rna_object.c @@ -737,6 +737,8 @@ static int rna_GameObjectSettings_physics_type_get(PointerRNA *ptr) if (!(ob->gameflag & OB_COLLISION)) { if (ob->gameflag & OB_OCCLUDER) { ob->body_type = OB_BODY_TYPE_OCCLUDER; + } else if (ob->gameflag & OB_NAVMESH){ + ob->body_type = OB_BODY_TYPE_NAVMESH; } else { ob->body_type = OB_BODY_TYPE_NO_COLLISION; } @@ -766,31 +768,35 @@ static void rna_GameObjectSettings_physics_type_set(PointerRNA *ptr, int value) switch (ob->body_type) { case OB_BODY_TYPE_SENSOR: ob->gameflag |= OB_SENSOR|OB_COLLISION|OB_GHOST; - ob->gameflag &= ~(OB_OCCLUDER|OB_DYNAMIC|OB_RIGID_BODY|OB_SOFT_BODY|OB_ACTOR|OB_ANISOTROPIC_FRICTION|OB_DO_FH|OB_ROT_FH|OB_COLLISION_RESPONSE); + ob->gameflag &= ~(OB_OCCLUDER|OB_NAVMESH|OB_DYNAMIC|OB_RIGID_BODY|OB_SOFT_BODY|OB_ACTOR|OB_ANISOTROPIC_FRICTION|OB_DO_FH|OB_ROT_FH|OB_COLLISION_RESPONSE); break; case OB_BODY_TYPE_OCCLUDER: ob->gameflag |= OB_OCCLUDER; - ob->gameflag &= ~(OB_SENSOR|OB_COLLISION|OB_DYNAMIC); + ob->gameflag &= ~(OB_SENSOR|OB_COLLISION|OB_DYNAMIC|OB_NAVMESH); + break; + case OB_BODY_TYPE_NAVMESH: + ob->gameflag |= OB_NAVMESH; + ob->gameflag &= ~(OB_SENSOR|OB_COLLISION|OB_DYNAMIC|OB_OCCLUDER); break; case OB_BODY_TYPE_NO_COLLISION: - ob->gameflag &= ~(OB_SENSOR|OB_COLLISION|OB_OCCLUDER|OB_DYNAMIC); + ob->gameflag &= ~(OB_SENSOR|OB_COLLISION|OB_OCCLUDER|OB_DYNAMIC|OB_NAVMESH); break; case OB_BODY_TYPE_STATIC: ob->gameflag |= OB_COLLISION; - ob->gameflag &= ~(OB_DYNAMIC|OB_RIGID_BODY|OB_SOFT_BODY|OB_OCCLUDER|OB_SENSOR); + ob->gameflag &= ~(OB_DYNAMIC|OB_RIGID_BODY|OB_SOFT_BODY|OB_OCCLUDER|OB_SENSOR|OB_NAVMESH); break; case OB_BODY_TYPE_DYNAMIC: ob->gameflag |= OB_COLLISION|OB_DYNAMIC|OB_ACTOR; - ob->gameflag &= ~(OB_RIGID_BODY|OB_SOFT_BODY|OB_OCCLUDER|OB_SENSOR); + ob->gameflag &= ~(OB_RIGID_BODY|OB_SOFT_BODY|OB_OCCLUDER|OB_SENSOR|OB_NAVMESH); break; case OB_BODY_TYPE_RIGID: ob->gameflag |= OB_COLLISION|OB_DYNAMIC|OB_RIGID_BODY|OB_ACTOR; - ob->gameflag &= ~(OB_SOFT_BODY|OB_OCCLUDER|OB_SENSOR); + ob->gameflag &= ~(OB_SOFT_BODY|OB_OCCLUDER|OB_SENSOR|OB_NAVMESH); break; default: case OB_BODY_TYPE_SOFT: ob->gameflag |= OB_COLLISION|OB_DYNAMIC|OB_SOFT_BODY|OB_ACTOR; - ob->gameflag &= ~(OB_RIGID_BODY|OB_OCCLUDER|OB_SENSOR); + ob->gameflag &= ~(OB_RIGID_BODY|OB_OCCLUDER|OB_SENSOR|OB_NAVMESH); /* assume triangle mesh, if no bounds chosen for soft body */ if ((ob->gameflag & OB_BOUNDS) && (ob->boundtypeGetLogicManager()->RegisterMeshName(meshobj->GetName(),meshobj); + if (ob->gameflag & OB_NAVMESH) + { + gameobj = new KX_Pathfinder(kxscene,KX_Scene::m_callbacks); + gameobj->AddMesh(meshobj); + break; + } + gameobj = new BL_DeformableGameObject(ob,kxscene,KX_Scene::m_callbacks); // set transformation @@ -2671,22 +2678,18 @@ void BL_ConvertBlenderObjects(struct Main* maggie, logicbrick_conversionlist->Release(); - //create navigation mesh - KX_Pathfinder* pathfinder = kxscene->GetPathfinder(); - if (pathfinder) + //build navigation mesh + for ( i=0;iGetCount();i++) { - for ( i=0;iGetCount();i++) + KX_GameObject* gameobj = static_cast(objectlist->GetValue(i)); + struct Object* blenderobject = gameobj->GetBlenderObject(); + if (blenderobject->type==OB_MESH && (blenderobject->gameflag & OB_NAVMESH)) { - KX_GameObject* gameobj = static_cast(objectlist->GetValue(i)); - struct Object* blenderobject = gameobj->GetBlenderObject(); - if (blenderobject->type==OB_MESH && gameobj->GetProperty("navmesh") && gameobj->GetMeshCount()>0) - { - RAS_MeshObject* meshobj = gameobj->GetMesh(0); - pathfinder->createFromMesh(meshobj); - gameobj->SetVisible(0, 0); - } - } - } + KX_Pathfinder* pathfinder = static_cast(gameobj); + pathfinder->BuildNavMesh(); + pathfinder->SetVisible(0, true); + } + } diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp index 52a3471f481..dc5a7832432 100644 --- a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp +++ b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp @@ -1325,9 +1325,6 @@ void KX_KetsjiEngine::RenderFrame(KX_Scene* scene, KX_Camera* cam) if (scene->GetPhysicsEnvironment()) scene->GetPhysicsEnvironment()->debugDrawWorld(); - - if (scene->GetPathfinder()) - scene->GetPathfinder()->debugDraw(); } /* To run once per scene diff --git a/source/gameengine/Ketsji/KX_Pathfinder.cpp b/source/gameengine/Ketsji/KX_Pathfinder.cpp index df9d9cb4869..b6368012b63 100644 --- a/source/gameengine/Ketsji/KX_Pathfinder.cpp +++ b/source/gameengine/Ketsji/KX_Pathfinder.cpp @@ -1,5 +1,5 @@ /** -* $Id: +* $Id$ * ***** BEGIN GPL LICENSE BLOCK ***** * * This program is free software; you can redistribute it and/or @@ -38,9 +38,14 @@ extern "C" { #include "BKE_DerivedMesh.h" } #include "KX_PythonInit.h" +#include "KX_PyMath.h" +#include "Value.h" #include "Recast.h" #include "DetourStatNavMeshBuilder.h" +static const int MAX_PATH_LEN = 256; +static const float polyPickExt[3] = {2, 4, 2}; + static void calcMeshBounds(const float* vert, int nverts, float* bmin, float* bmax) { bmin[0] = bmax[0] = vert[0]; @@ -48,18 +53,24 @@ static void calcMeshBounds(const float* vert, int nverts, float* bmin, float* bm bmin[2] = bmax[2] = vert[2]; for (int i=1; ivert[i+0]) bmin[0] = vert[i+0]; - if (bmin[1]>vert[i+1]) bmin[1] = vert[i+1]; - if (bmin[2]>vert[i+2]) bmin[2] = vert[i+2]; + if (bmin[0]>vert[3*i+0]) bmin[0] = vert[3*i+0]; + if (bmin[1]>vert[3*i+1]) bmin[1] = vert[3*i+1]; + if (bmin[2]>vert[3*i+2]) bmin[2] = vert[3*i+2]; - if (bmax[0]HasColliderPolygon()==false) @@ -87,111 +98,87 @@ bool KX_Pathfinder::buildVertIndArrays(RAS_MeshObject* meshobj, float *&vertices int* index = (int*)dm->getFaceDataArray(dm, CD_ORIGINDEX); MTFace *tface = (MTFace *)dm->getFaceDataArray(dm, CD_MTFACE); - vector vert_tag_array(numverts, false); - vector vert_remap_array(numverts, 0); - - // Tag verts we're using - for (int p2=0; p2GetPolygon((index)? index[p2]: p2); - // only add polygons that have the collision flag set - if (poly->IsCollider()) - { - if (vert_tag_array[mf->v1]==false) - {vert_tag_array[mf->v1]= true;vert_remap_array[mf->v1]= (size_t)nverts;nverts++;} - if (vert_tag_array[mf->v2]==false) - {vert_tag_array[mf->v2]= true;vert_remap_array[mf->v2]= (size_t)nverts;nverts++;} - if (vert_tag_array[mf->v3]==false) - {vert_tag_array[mf->v3]= true;vert_remap_array[mf->v3]= (size_t)nverts;nverts++;} - if (mf->v4 && vert_tag_array[mf->v4]==false) - {vert_tag_array[mf->v4]= true;vert_remap_array[mf->v4]= (size_t)nverts;nverts++;} - npolys += (mf->v4 ? 2:1); /* a quad or a tri */ - } - } - + nverts = numverts; if (nverts >= 0xffff) return false; - - vertices = new float[nverts*3]; - faces = new unsigned short[npolys*3*2]; - memset(faces,0xff,sizeof(unsigned short)*3*2*npolys); - float *bt= vertices; - unsigned short *tri_pt= faces; - + //calculate count of tris + npolys = numpolys; for (int p2=0; p2GetPolygon((index)? index[p2]: p2); - // only add polygons that have the collisionflag set - if (poly->IsCollider()) + if (mf->v4) + npolys+=1; + } + + //create verts + vertices = new float[nverts*3]; + for (int vi=0; vico[j]; + } + //create tris + faces = new unsigned short[npolys*3*2]; + memset(faces,0xff,sizeof(unsigned short)*3*2*npolys); + unsigned short *face = faces; + for (int p2=0; p2v1; + face[1]= mf->v2; + face[2]= mf->v3; + face += 6; + if (mf->v4) { - MVert *v1= &mvert[mf->v1]; - MVert *v2= &mvert[mf->v2]; - MVert *v3= &mvert[mf->v3]; - - // the face indicies - tri_pt[0]= vert_remap_array[mf->v1]; - tri_pt[1]= vert_remap_array[mf->v2]; - tri_pt[2]= vert_remap_array[mf->v3]; - tri_pt= tri_pt+6; - - // the vertex location - if (vert_tag_array[mf->v1]==true) { /* *** v1 *** */ - vert_tag_array[mf->v1]= false; - *bt++ = v1->co[0]; - *bt++ = v1->co[1]; - *bt++ = v1->co[2]; - } - if (vert_tag_array[mf->v2]==true) { /* *** v2 *** */ - vert_tag_array[mf->v2]= false; - *bt++ = v2->co[0]; - *bt++ = v2->co[1]; - *bt++ = v2->co[2]; - } - if (vert_tag_array[mf->v3]==true) { /* *** v3 *** */ - vert_tag_array[mf->v3]= false; - *bt++ = v3->co[0]; - *bt++ = v3->co[1]; - *bt++ = v3->co[2]; - } - - if (mf->v4) - { - MVert *v4= &mvert[mf->v4]; - - tri_pt[0]= vert_remap_array[mf->v1]; - tri_pt[1]= vert_remap_array[mf->v3]; - tri_pt[2]= vert_remap_array[mf->v4]; - tri_pt= tri_pt+3; - - // the vertex location - if (vert_tag_array[mf->v4]==true) { /* *** v4 *** */ - vert_tag_array[mf->v4]= false; - *bt++ = v4->co[0]; - *bt++ = v4->co[1]; - *bt++ = v4->co[2]; - } - } + face[0]= mf->v1; + face[1]= mf->v3; + face[2]= mf->v4; + face += 6; } } dm->release(dm); dm = NULL; - const int vertsPerPoly = 3; - buildMeshAdjacency(faces, npolys, nverts, vertsPerPoly); + return true; } -bool KX_Pathfinder::createFromMesh(RAS_MeshObject* meshobj) +bool KX_Pathfinder::BuildNavMesh() { + if (GetMeshCount()==0) + return false; + + RAS_MeshObject* meshobj = GetMesh(0); + float* vertices = NULL; unsigned short* faces = NULL; int nverts = 0, npolys = 0; - if (!buildVertIndArrays(meshobj, vertices, nverts, faces, npolys)) + if (!BuildVertIndArrays(meshobj, vertices, nverts, faces, npolys)) return false; + //prepare vertices and indices + MT_Transform worldTransform = GetSGNode()->GetWorldTransform(); + MT_Point3 pos; + for (int i=0; i((vertices[3*i+0]-bmin[0])*ics); + vertsi[3*i+1] = static_cast((vertices[3*i+1]-bmin[1])*ics); + vertsi[3*i+2] = static_cast((vertices[3*i+2]-bmin[2])*ics); + } // Calculate data size const int headerSize = sizeof(dtStatNavMeshHeader); @@ -244,7 +240,16 @@ bool KX_Pathfinder::createFromMesh(RAS_MeshObject* meshobj) header->ndverts = uniqueDetailVerts; header->ndtris = ndtris; - memcpy(navVerts, vertices, nverts*3*sizeof(float)); + // Store vertices + for (int i = 0; i < nverts; ++i) + { + const unsigned short* iv = &vertsi[i*3]; + float* v = &navVerts[i*3]; + v[0] = bmin[0] + iv[0] * cs; + v[1] = bmin[1] + iv[1] * cs; + v[2] = bmin[2] + iv[2] * cs; + } + //memcpy(navVerts, vertices, nverts*3*sizeof(float)); // Store polygons const int nvp = 3; @@ -262,15 +267,6 @@ bool KX_Pathfinder::createFromMesh(RAS_MeshObject* meshobj) src += nvp*2; } - //quantize vertex pos to creating BVTree - unsigned short* vertsi = new unsigned short[3*nverts]; - float* vf = vertices; - unsigned short* vi = vertsi; - float ics = 1.f/cs; - for (int i=0; i(vf[i]*ics); - } header->nnodes = createBVTree(vertsi, nverts, faces, npolys, nvp, cs, cs, npolys*2, navNodes); @@ -302,7 +298,7 @@ bool KX_Pathfinder::createFromMesh(RAS_MeshObject* meshobj) return true; } -void KX_Pathfinder::debugDraw() +void KX_Pathfinder::DebugDraw() { if (!m_navMesh) return; @@ -319,10 +315,15 @@ void KX_Pathfinder::debugDraw() MT_Vector3 tri[3]; for (int k = 0; k < 3; ++k) { + const float* v; if (t[k] < p->nv) - tri[k].setValue(m_navMesh->getVertex(p->v[t[k]])); + v = m_navMesh->getVertex(p->v[t[k]]); else - tri[k].setValue(m_navMesh->getDetailVertex(pd->vbase+(t[k]-p->nv))); + v = m_navMesh->getDetailVertex(pd->vbase+(t[k]-p->nv)); + float pos[3]; + vcopy(pos, v); + flipAxes(pos); + tri[k].setValue(pos); } for (int k=0; k<3; k++) @@ -330,3 +331,131 @@ void KX_Pathfinder::debugDraw() } } } + +int KX_Pathfinder::FindPath(MT_Vector3& from, MT_Vector3& to, float* path, int maxPathLen) +{ + if (!m_navMesh) + return 0; + float spos[3], epos[3]; + from.getValue(spos); flipAxes(spos); + to.getValue(epos); flipAxes(epos); + dtStatPolyRef sPolyRef = m_navMesh->findNearestPoly(spos, polyPickExt); + dtStatPolyRef ePolyRef = m_navMesh->findNearestPoly(epos, polyPickExt); + + int pathLen = 0; + if (sPolyRef && ePolyRef) + { + dtStatPolyRef* polys = new dtStatPolyRef[maxPathLen]; + int npolys; + npolys = m_navMesh->findPath(sPolyRef, ePolyRef, spos, epos, polys, maxPathLen); + if (npolys) + { + pathLen = m_navMesh->findStraightPath(spos, epos, polys, npolys, path, maxPathLen); + for (int i=0; ifindNearestPoly(spos, polyPickExt); + float t=0; + static dtStatPolyRef polys[MAX_PATH_LEN]; + m_navMesh->raycast(sPolyRef, spos, epos, t, polys, MAX_PATH_LEN); + return t; +} + +#ifndef DISABLE_PYTHON +//---------------------------------------------------------------------------- +//Python + +PyTypeObject KX_Pathfinder::Type = { + PyVarObject_HEAD_INIT(NULL, 0) + "KX_Pathfinder", + sizeof(PyObjectPlus_Proxy), + 0, + py_base_dealloc, + 0, + 0, + 0, + 0, + py_base_repr, + 0, + 0, + 0, + 0,0,0,0,0,0, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + 0,0,0,0,0,0,0, + Methods, + 0, + 0, + &CValue::Type, + 0,0,0,0,0,0, + py_base_new +}; + +PyAttributeDef KX_Pathfinder::Attributes[] = { + { NULL } //Sentinel +}; + +//KX_PYMETHODTABLE_NOARGS(KX_GameObject, getD), +PyMethodDef KX_Pathfinder::Methods[] = { + KX_PYMETHODTABLE(KX_Pathfinder, findPath), + KX_PYMETHODTABLE(KX_Pathfinder, raycast), + KX_PYMETHODTABLE(KX_Pathfinder, draw), + {NULL,NULL} //Sentinel +}; + +KX_PYMETHODDEF_DOC(KX_Pathfinder, findPath, + "findPath(start, goal): find path from start to goal points\n" + "Returns a path as list of points)\n") +{ + PyObject *ob_from, *ob_to; + if (!PyArg_ParseTuple(args,"OO:getPath",&ob_from,&ob_to)) + return NULL; + MT_Vector3 from, to; + if (!PyVecTo(ob_from, from) || !PyVecTo(ob_to, to)) + return NULL; + + float path[MAX_PATH_LEN*3]; + int pathLen = FindPath(from, to, path, MAX_PATH_LEN); + PyObject *pathList = PyList_New( pathLen ); + for (int i=0; i class RAS_MeshObject; +class MT_Transform; -class KX_Pathfinder +class KX_Pathfinder: public KX_GameObject { -public: - KX_Pathfinder(); - ~KX_Pathfinder(); - bool createFromMesh(RAS_MeshObject* meshobj); - void debugDraw(); -protected: - bool buildVertIndArrays(RAS_MeshObject* meshobj, float *&vertices, int& nverts, - unsigned short *&faces, int& npolys); + Py_Header; +protected: dtStatNavMesh* m_navMesh; + + bool BuildVertIndArrays(RAS_MeshObject* meshobj, float *&vertices, int& nverts, + unsigned short *&faces, int& npolys); + +public: + KX_Pathfinder(void* sgReplicationInfo, SG_Callbacks callbacks); + ~KX_Pathfinder(); + bool BuildNavMesh(); + int FindPath(MT_Vector3& from, MT_Vector3& to, float* path, int maxPathLen); + float Raycast(MT_Vector3& from, MT_Vector3& to); + void DebugDraw(); + + +#ifndef DISABLE_PYTHON + /* --------------------------------------------------------------------- */ + /* Python interface ---------------------------------------------------- */ + /* --------------------------------------------------------------------- */ + + KX_PYMETHOD_DOC(KX_Pathfinder, findPath); + KX_PYMETHOD_DOC(KX_Pathfinder, raycast); + KX_PYMETHOD_DOC_NOARGS(KX_Pathfinder, draw); +#endif }; #endif //__KX_PATHFINDER diff --git a/source/gameengine/Ketsji/KX_PythonInitTypes.cpp b/source/gameengine/Ketsji/KX_PythonInitTypes.cpp index 6b9d7a2cccf..e4bdeeb103e 100644 --- a/source/gameengine/Ketsji/KX_PythonInitTypes.cpp +++ b/source/gameengine/Ketsji/KX_PythonInitTypes.cpp @@ -93,6 +93,7 @@ #include "SCA_PythonController.h" #include "SCA_RandomActuator.h" #include "SCA_IController.h" +#include "KX_Pathfinder.h" static void PyType_Attr_Set(PyGetSetDef *attr_getset, PyAttributeDef *attr) { @@ -210,6 +211,7 @@ void initPyTypes(void) PyType_Ready_Attr(dict, KX_SCA_EndObjectActuator, init_getset); PyType_Ready_Attr(dict, KX_SCA_ReplaceMeshActuator, init_getset); PyType_Ready_Attr(dict, KX_Scene, init_getset); + PyType_Ready_Attr(dict, KX_Pathfinder, init_getset); PyType_Ready_Attr(dict, KX_SceneActuator, init_getset); PyType_Ready_Attr(dict, KX_SoundActuator, init_getset); PyType_Ready_Attr(dict, KX_StateActuator, init_getset); diff --git a/source/gameengine/Ketsji/KX_Scene.cpp b/source/gameengine/Ketsji/KX_Scene.cpp index 4f2884ee751..bfa372018cb 100644 --- a/source/gameengine/Ketsji/KX_Scene.cpp +++ b/source/gameengine/Ketsji/KX_Scene.cpp @@ -94,7 +94,6 @@ #endif #include "KX_Light.h" -#include "KX_Pathfinder.h" #include void* KX_SceneReplicationFunc(SG_IObject* node,void* gameobj,void* scene) @@ -150,8 +149,7 @@ KX_Scene::KX_Scene(class SCA_IInputDevice* keyboarddevice, m_networkDeviceInterface(ndi), m_active_camera(NULL), m_ueberExecutionPriority(0), - m_blenderScene(scene), - m_pathfinder(NULL) + m_blenderScene(scene) { m_suspendedtime = 0.0; m_suspendeddelta = 0.0; @@ -212,8 +210,6 @@ KX_Scene::KX_Scene(class SCA_IInputDevice* keyboarddevice, m_bucketmanager=new RAS_BucketManager(); - m_pathfinder = new KX_Pathfinder(); - #ifndef DISABLE_PYTHON m_attr_dict = PyDict_New(); /* new ref */ m_draw_call_pre = NULL; @@ -268,11 +264,6 @@ KX_Scene::~KX_Scene() delete m_bucketmanager; } - if (m_pathfinder) - { - delete m_pathfinder; - } - #ifndef DISABLE_PYTHON PyDict_Clear(m_attr_dict); Py_DECREF(m_attr_dict); diff --git a/source/gameengine/Ketsji/KX_Scene.h b/source/gameengine/Ketsji/KX_Scene.h index e19d846f0ad..bc608d9eb2a 100644 --- a/source/gameengine/Ketsji/KX_Scene.h +++ b/source/gameengine/Ketsji/KX_Scene.h @@ -83,7 +83,6 @@ class SCA_JoystickManager; class btCollisionShape; class KX_BlenderSceneConverter; struct KX_ClientObjectInfo; -class KX_Pathfinder; /* for ID freeing */ #define IS_TAGGED(_id) ((_id) && (((ID *)_id)->flag & LIB_DOIT)) @@ -278,7 +277,6 @@ protected: RAS_2DFilterManager m_filtermanager; - KX_Pathfinder* m_pathfinder; public: KX_Scene(class SCA_IInputDevice* keyboarddevice, class SCA_IInputDevice* mousedevice, @@ -614,7 +612,6 @@ public: // m_bucketmanager->PrintStats(verbose_level) //} - KX_Pathfinder *GetPathfinder() {return m_pathfinder; }; }; typedef std::vector KX_SceneList; From 05b92f0fc90b5f2cd5d933f97df20c774b42479f Mon Sep 17 00:00:00 2001 From: Nick Samarin Date: Mon, 31 May 2010 22:35:22 +0000 Subject: [PATCH 005/182] Added new actuator type for following steering behaviors: seek, flee, path following; renamed KX_Pathfinder to KX_NavMeshObject --- .../gameengine/ketsji/KX_ketsji.vcproj | 14 +- source/blender/blenkernel/intern/sca.c | 8 + source/blender/blenloader/intern/readfile.c | 10 + source/blender/blenloader/intern/writefile.c | 3 + .../editors/space_logic/logic_window.c | 19 +- source/blender/makesdna/DNA_actuator_types.h | 15 + source/blender/makesrna/intern/rna_actuator.c | 53 ++++ .../Converter/BL_BlenderDataConversion.cpp | 6 +- .../Converter/KX_ConvertActuators.cpp | 35 +++ source/gameengine/GameLogic/SCA_IActuator.h | 1 + source/gameengine/Ketsji/KX_KetsjiEngine.cpp | 2 +- ...KX_Pathfinder.cpp => KX_NavMeshObject.cpp} | 77 ++++-- .../{KX_Pathfinder.h => KX_NavMeshObject.h} | 24 +- .../gameengine/Ketsji/KX_PythonInitTypes.cpp | 4 +- .../gameengine/Ketsji/KX_SteeringActuator.cpp | 256 ++++++++++++++++++ .../gameengine/Ketsji/KX_SteeringActuator.h | 95 +++++++ 16 files changed, 575 insertions(+), 47 deletions(-) rename source/gameengine/Ketsji/{KX_Pathfinder.cpp => KX_NavMeshObject.cpp} (87%) rename source/gameengine/Ketsji/{KX_Pathfinder.h => KX_NavMeshObject.h} (74%) create mode 100644 source/gameengine/Ketsji/KX_SteeringActuator.cpp create mode 100644 source/gameengine/Ketsji/KX_SteeringActuator.h diff --git a/projectfiles_vc9/gameengine/ketsji/KX_ketsji.vcproj b/projectfiles_vc9/gameengine/ketsji/KX_ketsji.vcproj index 9e3316846e4..a62c8902ad2 100644 --- a/projectfiles_vc9/gameengine/ketsji/KX_ketsji.vcproj +++ b/projectfiles_vc9/gameengine/ketsji/KX_ketsji.vcproj @@ -552,7 +552,7 @@ > + + @@ -857,11 +861,11 @@ > + + diff --git a/source/blender/blenkernel/intern/sca.c b/source/blender/blenkernel/intern/sca.c index 5a06c251b88..6a43251efdd 100644 --- a/source/blender/blenkernel/intern/sca.c +++ b/source/blender/blenkernel/intern/sca.c @@ -468,6 +468,8 @@ void init_actuator(bActuator *act) case ACT_ARMATURE: act->data = MEM_callocN(sizeof( bArmatureActuator ), "armature act"); break; + case ACT_STEERING: + act->data = MEM_callocN(sizeof( bSteeringActuator), "steering act"); default: ; /* this is very severe... I cannot make any memory for this */ /* logic brick... */ @@ -611,6 +613,7 @@ void sca_remove_ob_poin(Object *obt, Object *ob) bMessageActuator *ma; bParentActuator *para; bArmatureActuator *aa; + bSteeringActuator *sta; sens= obt->sensors.first; while(sens) { @@ -658,6 +661,11 @@ void sca_remove_ob_poin(Object *obt, Object *ob) if (aa->target == ob) aa->target = NULL; if (aa->subtarget == ob) aa->subtarget = NULL; break; + case ACT_STEERING: + sta = act->data; + if (sta->target==ob) sta->target = NULL; + if (sta->navmesh==ob) sta->navmesh = NULL; + break; } act= act->next; } diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 381fc868a0d..5b732d5b1de 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -3612,6 +3612,11 @@ static void lib_link_object(FileData *fd, Main *main) arma->target= newlibadr(fd, ob->id.lib, arma->target); arma->subtarget= newlibadr(fd, ob->id.lib, arma->subtarget); } + else if(act->type==ACT_STEERING) { + bSteeringActuator *steeringa = act->data; + steeringa->target = newlibadr(fd, ob->id.lib, steeringa->target); + steeringa->navmesh = newlibadr(fd, ob->id.lib, steeringa->navmesh); + } act= act->next; } @@ -11745,6 +11750,11 @@ static void expand_object(FileData *fd, Main *mainvar, Object *ob) bArmatureActuator *arma= act->data; expand_doit(fd, mainvar, arma->target); } + else if(act->type==ACT_STEERING) { + bSteeringActuator *sta= act->data; + expand_doit(fd, mainvar, sta->target); + expand_doit(fd, mainvar, sta->navmesh); + } act= act->next; } diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index 5f2ee73e129..8e15601ff51 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -858,6 +858,9 @@ static void write_actuators(WriteData *wd, ListBase *lb) case ACT_ARMATURE: writestruct(wd, DATA, "bArmatureActuator", 1, act->data); break; + case ACT_STEERING: + writestruct(wd, DATA, "bSteeringActuator", 1, act->data); + break; default: ; /* error: don't know how to write this file */ } diff --git a/source/blender/editors/space_logic/logic_window.c b/source/blender/editors/space_logic/logic_window.c index f9310909f2c..70635e76055 100644 --- a/source/blender/editors/space_logic/logic_window.c +++ b/source/blender/editors/space_logic/logic_window.c @@ -710,6 +710,8 @@ static char *actuator_name(int type) return "State"; case ACT_ARMATURE: return "Armature"; + case ACT_STEERING: + return "Steering"; } return "unknown"; } @@ -2895,7 +2897,6 @@ static short draw_actuatorbuttons(Object *ob, bActuator *act, uiBlock *block, sh uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1); yco-= ysize; break; - default: ysize= 4; @@ -4232,6 +4233,20 @@ static void draw_actuator_visibility(uiLayout *layout, PointerRNA *ptr) uiItemR(row, ptr, "children", 0, NULL, 0); } +static void draw_actuator_steering(uiLayout *layout, PointerRNA *ptr) +{ + uiLayout *row; + + uiItemR(layout, ptr, "mode", 0, NULL, 0); + uiItemR(layout, ptr, "target", 0, NULL, 0); + uiItemR(layout, ptr, "navmesh", 0, NULL, 0); + + row = uiLayoutRow(layout, 0); + uiItemR(row, ptr, "distance", 0, NULL, 0); + uiItemR(row, ptr, "movement", 0, NULL, 0); +} + + void draw_brick_actuator(uiLayout *layout, PointerRNA *ptr, bContext *C) { uiLayout *box; @@ -4296,6 +4311,8 @@ void draw_brick_actuator(uiLayout *layout, PointerRNA *ptr, bContext *C) case ACT_VISIBILITY: draw_actuator_visibility(box, ptr); break; + case ACT_STEERING: + draw_actuator_steering(box, ptr); } } diff --git a/source/blender/makesdna/DNA_actuator_types.h b/source/blender/makesdna/DNA_actuator_types.h index 03200b784b4..7f2323b941e 100644 --- a/source/blender/makesdna/DNA_actuator_types.h +++ b/source/blender/makesdna/DNA_actuator_types.h @@ -214,6 +214,15 @@ typedef struct bArmatureActuator { struct Object *subtarget; } bArmatureActuator; +typedef struct bSteeringActuator { + char pad[4]; + int type; /* 0=seek, 1=flee, 2=path following */ + float dist; + float movement; + struct Object *target; + struct Object *navmesh; +} bSteeringActuator; + typedef struct bActuator { struct bActuator *next, *prev, *mynew; short type; @@ -286,6 +295,7 @@ typedef struct FreeCamera { #define ACT_SHAPEACTION 21 #define ACT_STATE 22 #define ACT_ARMATURE 23 +#define ACT_STEERING 24 /* actuator flag */ #define ACT_SHOW 1 @@ -502,6 +512,11 @@ typedef struct FreeCamera { #define ACT_CAMERA_X (float)'x' #define ACT_CAMERA_Y (float)'y' +/* steeringactuator->type */ +#define ACT_STEERING_SEEK 0 +#define ACT_STEERING_FLEE 1 +#define ACT_STEERING_PATHFOLLOWING 2 + #endif diff --git a/source/blender/makesrna/intern/rna_actuator.c b/source/blender/makesrna/intern/rna_actuator.c index 5f802fd47f1..5a55888614f 100644 --- a/source/blender/makesrna/intern/rna_actuator.c +++ b/source/blender/makesrna/intern/rna_actuator.c @@ -54,6 +54,7 @@ EnumPropertyItem actuator_type_items[] ={ {ACT_SOUND, "SOUND", 0, "Sound", ""}, {ACT_STATE, "STATE", 0, "State", ""}, {ACT_VISIBILITY, "VISIBILITY", 0, "Visibility", ""}, + {ACT_STEERING, "STEERING", 0, "Steering", ""}, {0, NULL, 0, NULL, NULL}}; EnumPropertyItem edit_object_type_items[] ={ @@ -109,6 +110,8 @@ static StructRNA* rna_Actuator_refine(struct PointerRNA *ptr) return &RNA_StateActuator; case ACT_ARMATURE: return &RNA_ArmatureActuator; + case ACT_STEERING: + return &RNA_SteeringActuator; default: return &RNA_Actuator; } @@ -401,6 +404,7 @@ EnumPropertyItem *rna_Actuator_type_itemf(bContext *C, PointerRNA *ptr, int *fre RNA_enum_items_add_value(&item, &totitem, actuator_type_items, ACT_PROPERTY); RNA_enum_items_add_value(&item, &totitem, actuator_type_items, ACT_RANDOM); RNA_enum_items_add_value(&item, &totitem, actuator_type_items, ACT_SCENE); + RNA_enum_items_add_value(&item, &totitem, actuator_type_items, ACT_STEERING); if (ob != NULL) { if (ob->type==OB_MESH){ @@ -1841,6 +1845,54 @@ static void rna_def_armature_actuator(BlenderRNA *brna) RNA_def_property_update(prop, NC_LOGIC, NULL); } +static void rna_def_steering_actuator(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + static EnumPropertyItem prop_type_items[] ={ + {ACT_STEERING_SEEK, "SEEK", 0, "Seek", ""}, + {ACT_STEERING_FLEE, "FLEE", 0, "Flee", ""}, + {ACT_STEERING_PATHFOLLOWING, "PATHFOLLOWING", 0, "Path following", ""}, + {0, NULL, 0, NULL, NULL}}; + + srna= RNA_def_struct(brna, "SteeringActuator", "Actuator"); + RNA_def_struct_ui_text(srna, "Steering Actuator", ""); + RNA_def_struct_sdna_from(srna, "bSteeringActuator", "data"); + + prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "type"); + RNA_def_property_enum_items(prop, prop_type_items); + RNA_def_property_ui_text(prop, "Behavior", ""); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "movement", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "movement"); + RNA_def_property_range(prop, 0.0, 1000.0); + RNA_def_property_ui_text(prop, "Move", "Movement value"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "distance", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "dist"); + RNA_def_property_range(prop, 0.0, 1000.0); + RNA_def_property_ui_text(prop, "Dist", "Relax distance"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE); + RNA_def_property_struct_type(prop, "Object"); + RNA_def_property_pointer_sdna(prop, NULL, "target"); + RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Target Object", "Set target object"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "navmesh", PROP_POINTER, PROP_NONE); + RNA_def_property_struct_type(prop, "Object"); + RNA_def_property_pointer_sdna(prop, NULL, "navmesh"); + RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "NavMesh Object", "Navigation mesh"); + RNA_def_property_update(prop, NC_LOGIC, NULL); +} + void RNA_def_actuator(BlenderRNA *brna) { rna_def_actuator(brna); @@ -1863,6 +1915,7 @@ void RNA_def_actuator(BlenderRNA *brna) rna_def_shape_action_actuator(brna); rna_def_state_actuator(brna); rna_def_armature_actuator(brna); + rna_def_steering_actuator(brna); } #endif diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp index 37f5009d319..04bd1178e52 100644 --- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp +++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp @@ -172,7 +172,7 @@ extern "C" { #include "BL_ArmatureObject.h" #include "BL_DeformableGameObject.h" -#include "KX_Pathfinder.h" +#include "KX_NavMeshObject.h" #ifdef __cplusplus extern "C" { @@ -1717,7 +1717,7 @@ static KX_GameObject *gameobject_from_blenderobject( if (ob->gameflag & OB_NAVMESH) { - gameobj = new KX_Pathfinder(kxscene,KX_Scene::m_callbacks); + gameobj = new KX_NavMeshObject(kxscene,KX_Scene::m_callbacks); gameobj->AddMesh(meshobj); break; } @@ -2685,7 +2685,7 @@ void BL_ConvertBlenderObjects(struct Main* maggie, struct Object* blenderobject = gameobj->GetBlenderObject(); if (blenderobject->type==OB_MESH && (blenderobject->gameflag & OB_NAVMESH)) { - KX_Pathfinder* pathfinder = static_cast(gameobj); + KX_NavMeshObject* pathfinder = static_cast(gameobj); pathfinder->BuildNavMesh(); pathfinder->SetVisible(0, true); } diff --git a/source/gameengine/Converter/KX_ConvertActuators.cpp b/source/gameengine/Converter/KX_ConvertActuators.cpp index 9b41470769f..f7151dfd8c3 100644 --- a/source/gameengine/Converter/KX_ConvertActuators.cpp +++ b/source/gameengine/Converter/KX_ConvertActuators.cpp @@ -62,6 +62,7 @@ #include "KX_SCA_ReplaceMeshActuator.h" #include "KX_ParentActuator.h" #include "KX_SCA_DynamicActuator.h" +#include "KX_SteeringActuator.h" #include "KX_Scene.h" #include "KX_KetsjiEngine.h" @@ -89,6 +90,7 @@ #include "BL_ActionActuator.h" #include "BL_ShapeActionActuator.h" #include "BL_ArmatureActuator.h" +#include "RNA_access.h" /* end of blender include block */ #include "BL_BlenderDataConversion.h" @@ -1028,6 +1030,39 @@ void BL_ConvertActuators(char* maggiename, baseact = tmparmact; break; } + case ACT_STEERING: + { + bSteeringActuator *stAct = (bSteeringActuator *) bact->data; + KX_GameObject *navmeshob = NULL; + if (stAct->navmesh) + { + PointerRNA settings_ptr; + RNA_pointer_create((ID *)stAct->navmesh, &RNA_GameObjectSettings, stAct->navmesh, &settings_ptr); + if (RNA_enum_get(&settings_ptr, "physics_type") == OB_BODY_TYPE_NAVMESH) + navmeshob = converter->FindGameObject(stAct->navmesh); + } + KX_GameObject *targetob = converter->FindGameObject(stAct->target); + + int mode = KX_SteeringActuator::KX_STEERING_NODEF; + switch(stAct->type) + { + case ACT_STEERING_SEEK: + mode = KX_SteeringActuator::KX_STEERING_SEEK; + break; + case ACT_STEERING_FLEE: + mode = KX_SteeringActuator::KX_STEERING_FLEE; + break; + case ACT_STEERING_PATHFOLLOWING: + mode = KX_SteeringActuator::KX_STEERING_PATHFOLLOWING; + break; + } + + KX_SteeringActuator *tmpstact + = new KX_SteeringActuator(gameobj, mode, targetob, navmeshob, + stAct->movement, stAct->dist); + baseact = tmpstact; + break; + } default: ; /* generate some error */ } diff --git a/source/gameengine/GameLogic/SCA_IActuator.h b/source/gameengine/GameLogic/SCA_IActuator.h index f456183a16c..3d2f5189c01 100644 --- a/source/gameengine/GameLogic/SCA_IActuator.h +++ b/source/gameengine/GameLogic/SCA_IActuator.h @@ -85,6 +85,7 @@ public: KX_ACT_SHAPEACTION, KX_ACT_STATE, KX_ACT_ARMATURE, + KX_ACT_STEERING, }; SCA_IActuator(SCA_IObject* gameobj, KX_ACTUATOR_TYPE type); diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp index dc5a7832432..8697710b02d 100644 --- a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp +++ b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp @@ -75,7 +75,7 @@ #include "DNA_world_types.h" #include "DNA_scene_types.h" -#include "KX_Pathfinder.h" +#include "KX_NavMeshObject.h" // If define: little test for Nzc: guarded drawing. If the canvas is // not valid, skip rendering this frame. diff --git a/source/gameengine/Ketsji/KX_Pathfinder.cpp b/source/gameengine/Ketsji/KX_NavMeshObject.cpp similarity index 87% rename from source/gameengine/Ketsji/KX_Pathfinder.cpp rename to source/gameengine/Ketsji/KX_NavMeshObject.cpp index b6368012b63..efcb3bdee6b 100644 --- a/source/gameengine/Ketsji/KX_Pathfinder.cpp +++ b/source/gameengine/Ketsji/KX_NavMeshObject.cpp @@ -26,7 +26,7 @@ * ***** END GPL LICENSE BLOCK ***** */ -#include "KX_Pathfinder.h" +#include "KX_NavMeshObject.h" #include "RAS_MeshObject.h" #include "DNA_mesh_types.h" @@ -68,23 +68,36 @@ inline void flipAxes(float* vec) std::swap(vec[1],vec[2]); } -KX_Pathfinder::KX_Pathfinder(void* sgReplicationInfo, SG_Callbacks callbacks) +KX_NavMeshObject::KX_NavMeshObject(void* sgReplicationInfo, SG_Callbacks callbacks) : KX_GameObject(sgReplicationInfo, callbacks) , m_navMesh(NULL) { } -KX_Pathfinder::~KX_Pathfinder() +KX_NavMeshObject::~KX_NavMeshObject() { if (m_navMesh) delete m_navMesh; } -bool KX_Pathfinder::BuildVertIndArrays(RAS_MeshObject* meshobj, float *&vertices, int& nverts, +CValue* KX_NavMeshObject::GetReplica() +{ + KX_NavMeshObject* replica = new KX_NavMeshObject(*this); + replica->ProcessReplica(); + return replica; +} + +void KX_NavMeshObject::ProcessReplica() +{ + KX_GameObject::ProcessReplica(); + BuildNavMesh(); +} + +bool KX_NavMeshObject::BuildVertIndArrays(RAS_MeshObject* meshobj, float *&vertices, int& nverts, unsigned short* &faces, int& npolys) { - if (!meshobj || meshobj->HasColliderPolygon()==false) + if (!meshobj) { return false; } @@ -144,7 +157,7 @@ bool KX_Pathfinder::BuildVertIndArrays(RAS_MeshObject* meshobj, float *&vertices return true; } -bool KX_Pathfinder::BuildNavMesh() +bool KX_NavMeshObject::BuildNavMesh() { if (GetMeshCount()==0) return false; @@ -162,12 +175,11 @@ bool KX_Pathfinder::BuildNavMesh() MT_Point3 pos; for (int i=0; i(navmesh); + if (m_navmesh) + m_navmesh->RegisterActuator(this); + if (m_target) + m_target->RegisterActuator(this); +} + +KX_SteeringActuator::~KX_SteeringActuator() +{ + if (m_navmesh) + m_navmesh->UnregisterActuator(this); + if (m_target) + m_target->UnregisterActuator(this); +} + +CValue* KX_SteeringActuator::GetReplica() +{ + KX_SteeringActuator* replica = new KX_SteeringActuator(*this); + // replication just copy the m_base pointer => common random generator + replica->ProcessReplica(); + return replica; +} + +void KX_SteeringActuator::ProcessReplica() +{ + if (m_target) + m_target->RegisterActuator(this); + if (m_navmesh) + m_navmesh->RegisterActuator(this); + SCA_IActuator::ProcessReplica(); +} + + +bool KX_SteeringActuator::UnlinkObject(SCA_IObject* clientobj) +{ + if (clientobj == m_target) + { + // this object is being deleted, we cannot continue to track it. + m_target = NULL; + return true; + } + else if (clientobj == m_navmesh) + { + // this object is being deleted, we cannot continue to track it. + m_navmesh = NULL; + return true; + } + return false; +} + +void KX_SteeringActuator::Relink(GEN_Map *obj_map) +{ + void **h_obj = (*obj_map)[m_target]; + if (h_obj) { + if (m_target) + m_target->UnregisterActuator(this); + m_target = (KX_GameObject*)(*h_obj); + m_target->RegisterActuator(this); + } + + h_obj = (*obj_map)[m_navmesh]; + if (h_obj) { + if (m_navmesh) + m_navmesh->UnregisterActuator(this); + m_navmesh = (KX_NavMeshObject*)(*h_obj); + m_navmesh->RegisterActuator(this); + } +} + +bool KX_SteeringActuator::Update() +{ + bool bNegativeEvent = IsNegativeEvent(); + RemoveAllEvents(); + + if (bNegativeEvent) + return false; // do nothing on negative events + + KX_GameObject *obj = (KX_GameObject*) GetParent(); + const MT_Point3& mypos = obj->NodeGetWorldPosition(); + const MT_Point3& targpos = m_target->NodeGetWorldPosition(); + MT_Vector3 vectotarg = targpos - mypos; + MT_Vector3 steervec = MT_Vector3(0, 0, 0); + bool apply_steerforce = false; + + switch (m_mode) { + case KX_STEERING_SEEK: + if (vectotarg.length2()>m_distance*m_distance) + { + apply_steerforce = true; + steervec = vectotarg; + steervec.normalize(); + } + break; + case KX_STEERING_FLEE: + if (vectotarg.length2()m_distance*m_distance) + { + static const int MAX_PATH_LENGTH = 128; + static const MT_Vector3 PATH_COLOR(1,0,0); + + float path[MAX_PATH_LENGTH*3]; + int pathlen = m_navmesh->FindPath(mypos, targpos, path, MAX_PATH_LENGTH); + if (pathlen > 1) + { + //debug draw + m_navmesh->DrawPath(path, pathlen, PATH_COLOR); + + apply_steerforce = true; + MT_Vector3 waypoint(&path[3]); + steervec = waypoint - mypos; + steervec.z() = 0; + steervec.normalize(); + } + } + break; + } + + if (apply_steerforce) + { + MT_Vector3 vel = m_movement*steervec; + obj->ApplyMovement(vel, false); + } + + return true; +} + +#ifndef DISABLE_PYTHON + +/* ------------------------------------------------------------------------- */ +/* Python functions */ +/* ------------------------------------------------------------------------- */ + +/* Integration hooks ------------------------------------------------------- */ +PyTypeObject KX_SteeringActuator::Type = { + PyVarObject_HEAD_INIT(NULL, 0) + "KX_SteeringActuator", + sizeof(PyObjectPlus_Proxy), + 0, + py_base_dealloc, + 0, + 0, + 0, + 0, + py_base_repr, + 0,0,0,0,0,0,0,0,0, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + 0,0,0,0,0,0,0, + Methods, + 0, + 0, + &SCA_IActuator::Type, + 0,0,0,0,0,0, + py_base_new +}; + +PyMethodDef KX_SteeringActuator::Methods[] = { + {NULL,NULL} //Sentinel +}; + +PyAttributeDef KX_SteeringActuator::Attributes[] = { + KX_PYATTRIBUTE_RW_FUNCTION("target", KX_SteeringActuator, pyattr_get_target, pyattr_set_target), + { NULL } //Sentinel +}; + +PyObject* KX_SteeringActuator::pyattr_get_target(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef) +{ + KX_SteeringActuator* actuator = static_cast(self); + if (!actuator->m_target) + Py_RETURN_NONE; + else + return actuator->m_target->GetProxy(); +} + +int KX_SteeringActuator::pyattr_set_target(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value) +{ + KX_SteeringActuator* actuator = static_cast(self); + KX_GameObject *gameobj; + + if (!ConvertPythonToGameObject(value, &gameobj, true, "actuator.object = value: KX_SteeringActuator")) + return PY_SET_ATTR_FAIL; // ConvertPythonToGameObject sets the error + + if (actuator->m_target != NULL) + actuator->m_target->UnregisterActuator(actuator); + + actuator->m_target = (KX_GameObject*) gameobj; + + if (actuator->m_target) + actuator->m_target->RegisterActuator(actuator); + + return PY_SET_ATTR_SUCCESS; +} + +#endif // DISABLE_PYTHON + +/* eof */ + diff --git a/source/gameengine/Ketsji/KX_SteeringActuator.h b/source/gameengine/Ketsji/KX_SteeringActuator.h new file mode 100644 index 00000000000..fce2205ca6e --- /dev/null +++ b/source/gameengine/Ketsji/KX_SteeringActuator.h @@ -0,0 +1,95 @@ +/** +* Add steering behaviors +* +* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. The Blender +* Foundation also sells licenses for use in proprietary software under +* the Blender License. See http://www.blender.org/BL/ for information +* about this. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. +* All rights reserved. +* +* The Original Code is: all of this file. +* +* Contributor(s): none yet. +* +* ***** END GPL LICENSE BLOCK ***** +*/ + +#ifndef __KX_STEERINGACTUATOR +#define __KX_STEERINGACTUATOR + +#include "SCA_IActuator.h" +#include "SCA_LogicManager.h" + +class KX_GameObject; +class KX_NavMeshObject; + +class KX_SteeringActuator : public SCA_IActuator +{ + Py_Header; + + /** Target object */ + KX_GameObject *m_target; + KX_NavMeshObject *m_navmesh; + + int m_mode; + MT_Scalar m_distance; + MT_Scalar m_movement; +public: + enum KX_STEERINGACT_MODE + { + KX_STEERING_NODEF = 0, + KX_STEERING_SEEK, + KX_STEERING_FLEE, + KX_STEERING_PATHFOLLOWING, + KX_STEERING_MAX + }; + + KX_SteeringActuator(class SCA_IObject* gameobj, + int mode, + KX_GameObject *target, + KX_GameObject *navmesh, + MT_Scalar movement, + MT_Scalar distance); + virtual ~KX_SteeringActuator(); + virtual bool Update(); + + virtual CValue* GetReplica(); + virtual void ProcessReplica(); + virtual void Relink(GEN_Map *obj_map); + virtual bool UnlinkObject(SCA_IObject* clientobj); + +#ifndef DISABLE_PYTHON + + /* --------------------------------------------------------------------- */ + /* Python interface ---------------------------------------------------- */ + /* --------------------------------------------------------------------- */ + + /* These are used to get and set m_target */ + static PyObject* pyattr_get_target(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef); + static int pyattr_set_target(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value); + +#endif // DISABLE_PYTHON + +}; /* end of class KX_SteeringActuator : public SCA_PropertyActuator */ + +#endif + From d3d2e92fccc7ed65d753dbf8872b720ffe0fd6ad Mon Sep 17 00:00:00 2001 From: Nick Samarin Date: Mon, 31 May 2010 23:44:43 +0000 Subject: [PATCH 006/182] synched branch with trunk at revision 29109 --- CMake/macros.cmake | 6 + CMakeLists.txt | 490 +- SConstruct | 12 +- config/darwin-config.py | 3 + config/linux2-config.py | 2 + config/linuxcross-config.py | 9 +- config/win32-mingw-config.py | 7 +- config/win32-vc-config.py | 1 + config/win64-vc-config.py | 1 + intern/ghost/intern/GHOST_SystemCocoa.mm | 8 +- intern/ghost/intern/GHOST_WindowWin32.cpp | 2 +- release/datafiles/blenderbuttons | Bin 209681 -> 209697 bytes release/scripts/io/export_fbx.py | 32 +- release/scripts/io/import_anim_bvh.py | 24 +- .../scripts/keyingsets/keyingsets_utils.py | 2 +- release/scripts/modules/add_object_utils.py | 82 + release/scripts/modules/bpy/__init__.py | 8 +- release/scripts/modules/bpy_types.py | 89 +- release/scripts/op/add_mesh_torus.py | 34 +- release/scripts/op/console_python.py | 72 +- release/scripts/op/object.py | 21 + release/scripts/op/sequencer.py | 8 +- release/scripts/op/uv.py | 22 +- release/scripts/op/uvcalc_follow_active.py | 2 +- release/scripts/op/wm.py | 2 +- .../templates/operator_modal_view3d.py | 55 + release/scripts/ui/properties_animviz.py | 2 + release/scripts/ui/properties_data_lamp.py | 2 +- release/scripts/ui/properties_object.py | 2 +- .../ui/properties_object_constraint.py | 18 +- release/scripts/ui/properties_particle.py | 11 - release/scripts/ui/properties_render.py | 12 +- release/scripts/ui/space_info.py | 106 +- release/scripts/ui/space_sequencer.py | 7 + release/scripts/ui/space_userpref.py | 39 +- release/scripts/ui/space_view3d.py | 32 +- source/blender/blenkernel/BKE_global.h | 3 - source/blender/blenkernel/BKE_multires.h | 6 +- source/blender/blenkernel/BKE_particle.h | 2 + source/blender/blenkernel/BKE_utildefines.h | 5 +- source/blender/blenkernel/CMakeLists.txt | 4 + source/blender/blenkernel/SConscript | 3 + source/blender/blenkernel/intern/Makefile | 4 + source/blender/blenkernel/intern/anim.c | 117 +- source/blender/blenkernel/intern/armature.c | 4 +- source/blender/blenkernel/intern/blender.c | 2 +- source/blender/blenkernel/intern/cloth.c | 7 +- source/blender/blenkernel/intern/collision.c | 32 +- source/blender/blenkernel/intern/constraint.c | 219 +- source/blender/blenkernel/intern/customdata.c | 10 +- source/blender/blenkernel/intern/depsgraph.c | 43 +- source/blender/blenkernel/intern/fcurve.c | 2 +- source/blender/blenkernel/intern/fmodifier.c | 2 +- source/blender/blenkernel/intern/image.c | 57 +- source/blender/blenkernel/intern/implicit.c | 65 +- source/blender/blenkernel/intern/multires.c | 10 +- source/blender/blenkernel/intern/node.c | 12 +- source/blender/blenkernel/intern/object.c | 28 +- source/blender/blenkernel/intern/particle.c | 91 +- .../blenkernel/intern/particle_system.c | 90 +- source/blender/blenkernel/intern/sca.c | 23 +- source/blender/blenlib/BLI_args.h | 12 +- source/blender/blenlib/intern/BLI_args.c | 97 +- source/blender/blenlib/intern/bpath.c | 6 +- source/blender/blenlib/intern/threads.c | 5 +- source/blender/blenloader/BLO_writefile.h | 4 +- source/blender/blenloader/intern/readfile.c | 48 +- source/blender/blenloader/intern/writefile.c | 24 +- source/blender/editors/CMakeLists.txt | 4 + .../editors/animation/anim_channels_edit.c | 15 +- .../blender/editors/animation/anim_filter.c | 77 +- source/blender/editors/armature/poselib.c | 2 +- source/blender/editors/curve/curve_intern.h | 6 + source/blender/editors/curve/curve_ops.c | 10 +- source/blender/editors/curve/editcurve.c | 160 +- .../editors/datafiles/blenderbuttons.c | 13077 ++++++++-------- source/blender/editors/include/ED_anim_api.h | 1 + source/blender/editors/include/UI_interface.h | 6 +- source/blender/editors/interface/interface.c | 4 +- .../editors/interface/interface_handlers.c | 43 +- .../editors/interface/interface_intern.h | 3 +- .../editors/interface/interface_regions.c | 4 +- .../editors/interface/interface_templates.c | 36 +- .../editors/interface/interface_widgets.c | 61 +- source/blender/editors/interface/resources.c | 22 + source/blender/editors/object/object_add.c | 91 - source/blender/editors/object/object_bake.c | 12 +- .../editors/object/object_constraint.c | 169 +- source/blender/editors/object/object_edit.c | 164 +- source/blender/editors/object/object_intern.h | 13 +- .../blender/editors/object/object_modifier.c | 4 +- source/blender/editors/object/object_ops.c | 6 +- source/blender/editors/object/object_select.c | 2 + .../blender/editors/physics/particle_edit.c | 2 +- .../blender/editors/physics/physics_fluid.c | 107 +- .../blender/editors/render/render_internal.c | 17 +- source/blender/editors/render/render_opengl.c | 110 +- .../blender/editors/render/render_preview.c | 6 +- source/blender/editors/screen/screen_ops.c | 3 +- source/blender/editors/screen/screendump.c | 4 +- source/blender/editors/sound/sound_ops.c | 42 +- .../editors/space_action/action_edit.c | 36 +- .../editors/space_action/action_select.c | 33 +- source/blender/editors/space_file/Makefile | 4 + source/blender/editors/space_file/SConscript | 4 + source/blender/editors/space_file/filelist.c | 10 +- .../blender/editors/space_file/writeimage.c | 5 +- .../editors/space_graph/graph_buttons.c | 94 +- .../blender/editors/space_graph/graph_edit.c | 42 +- .../editors/space_graph/graph_select.c | 24 +- .../blender/editors/space_graph/space_graph.c | 2 +- source/blender/editors/space_image/Makefile | 4 + source/blender/editors/space_image/SConscript | 2 + .../blender/editors/space_image/image_ops.c | 3 +- .../blender/editors/space_info/space_info.c | 4 + .../blender/editors/space_logic/logic_ops.c | 43 - .../editors/space_logic/logic_window.c | 47 +- source/blender/editors/space_nla/nla_select.c | 2 +- source/blender/editors/space_node/node_edit.c | 16 +- .../editors/space_sequencer/sequencer_add.c | 1 + .../editors/space_sequencer/sequencer_edit.c | 8 +- .../blender/editors/space_text/space_text.c | 2 +- .../editors/space_view3d/drawanimviz.c | 27 +- .../blender/editors/space_view3d/drawobject.c | 96 +- .../editors/space_view3d/space_view3d.c | 4 + .../editors/space_view3d/view3d_draw.c | 8 +- .../editors/space_view3d/view3d_edit.c | 4 +- .../editors/transform/transform_conversions.c | 2 +- source/blender/gpu/GPU_draw.h | 1 + source/blender/gpu/intern/gpu_draw.c | 11 + source/blender/imbuf/CMakeLists.txt | 17 +- source/blender/imbuf/IMB_thumbs.h | 9 +- source/blender/imbuf/SConscript | 3 + source/blender/imbuf/intern/Makefile | 6 +- source/blender/imbuf/intern/anim.c | 1 + source/blender/imbuf/intern/dynlibtiff.c | 280 - source/blender/imbuf/intern/dynlibtiff.h | 59 - source/blender/imbuf/intern/filetype.c | 6 +- .../imbuf/intern/openexr/openexr_api.cpp | 82 +- source/blender/imbuf/intern/thumbs.c | 27 +- source/blender/imbuf/intern/thumbs_blend.c | 185 + source/blender/imbuf/intern/tiff.c | 310 +- source/blender/imbuf/intern/util.c | 13 +- source/blender/makesdna/DNA_action_types.h | 2 + .../blender/makesdna/DNA_constraint_types.h | 56 +- source/blender/makesdna/DNA_node_types.h | 4 +- source/blender/makesdna/DNA_object_types.h | 5 +- source/blender/makesdna/DNA_userdef_types.h | 4 +- source/blender/makesrna/RNA_access.h | 1 + source/blender/makesrna/SConscript | 3 + source/blender/makesrna/intern/CMakeLists.txt | 4 + source/blender/makesrna/intern/Makefile | 4 + source/blender/makesrna/intern/SConscript | 3 + source/blender/makesrna/intern/rna_actuator.c | 64 +- .../blender/makesrna/intern/rna_animation.c | 2 +- source/blender/makesrna/intern/rna_animviz.c | 9 +- .../blender/makesrna/intern/rna_constraint.c | 60 + source/blender/makesrna/intern/rna_curve.c | 4 +- source/blender/makesrna/intern/rna_fcurve.c | 30 +- source/blender/makesrna/intern/rna_image.c | 2 +- source/blender/makesrna/intern/rna_internal.h | 1 + source/blender/makesrna/intern/rna_main_api.c | 8 +- source/blender/makesrna/intern/rna_material.c | 4 +- source/blender/makesrna/intern/rna_object.c | 6 +- .../blender/makesrna/intern/rna_object_api.c | 20 + source/blender/makesrna/intern/rna_scene.c | 35 +- source/blender/makesrna/intern/rna_sensor.c | 33 +- .../blender/makesrna/intern/rna_sequencer.c | 34 +- source/blender/makesrna/intern/rna_space.c | 53 +- source/blender/makesrna/intern/rna_texture.c | 4 +- source/blender/makesrna/intern/rna_userdef.c | 7 + .../blender/modifiers/intern/MOD_meshdeform.c | 18 +- .../nodes/intern/CMP_nodes/CMP_displace.c | 139 +- source/blender/python/BPY_extern.h | 6 +- source/blender/python/doc/sphinx_doc_gen.py | 3 +- .../blender/python/generic/mathutils_vector.c | 45 +- source/blender/python/intern/bpy_driver.c | 10 +- source/blender/python/intern/bpy_interface.c | 36 +- .../render/extern/include/RE_pipeline.h | 2 +- .../render/extern/include/RE_shader_ext.h | 2 +- .../render/intern/include/render_types.h | 4 +- .../render/intern/source/convertblender.c | 7 +- .../render/intern/source/imagetexture.c | 110 +- .../blender/render/intern/source/pipeline.c | 21 +- .../blender/render/intern/source/rendercore.c | 20 +- source/blender/render/intern/source/texture.c | 3 +- source/blender/windowmanager/WM_api.h | 7 +- source/blender/windowmanager/WM_types.h | 1 + source/blender/windowmanager/intern/wm.c | 4 +- .../blender/windowmanager/intern/wm_files.c | 74 +- source/blender/windowmanager/intern/wm_jobs.c | 65 +- .../windowmanager/intern/wm_operators.c | 10 +- source/blender/windowmanager/wm_event_types.h | 2 +- source/creator/CMakeLists.txt | 73 +- source/creator/Makefile | 4 + source/creator/SConscript | 3 + source/creator/creator.c | 406 +- .../Converter/BL_BlenderDataConversion.cpp | 6 +- .../Converter/BL_ModifierDeformer.cpp | 16 + .../Converter/BL_ModifierDeformer.h | 1 + source/gameengine/Ketsji/KX_Scene.cpp | 4 +- source/gameengine/PyDoc/bge.events.rst | 6 +- source/gameengine/PyDoc/bge.logic.rst | 4 +- source/gameengine/PyDoc/bge.render.rst | 4 +- source/gameengine/PyDoc/bge.types.rst | 4 +- source/nan_definitions.mk | 24 +- source/nan_link.mk | 6 +- tools/Blender.py | 4 + tools/btools.py | 9 +- tools/crossmingw.py | 1 + 210 files changed, 10935 insertions(+), 8773 deletions(-) create mode 100644 release/scripts/modules/add_object_utils.py create mode 100644 release/scripts/templates/operator_modal_view3d.py delete mode 100644 source/blender/imbuf/intern/dynlibtiff.c delete mode 100644 source/blender/imbuf/intern/dynlibtiff.h create mode 100644 source/blender/imbuf/intern/thumbs_blend.c diff --git a/CMake/macros.cmake b/CMake/macros.cmake index 73458d7312e..54b14dbd5ce 100644 --- a/CMake/macros.cmake +++ b/CMake/macros.cmake @@ -61,6 +61,9 @@ MACRO(SETUP_LIBDIRS) IF(WITH_OPENEXR) LINK_DIRECTORIES(${OPENEXR_LIBPATH}) ENDIF(WITH_OPENEXR) + IF(WITH_TIFF) + LINK_DIRECTORIES(${TIFF_LIBPATH}) + ENDIF(WITH_TIFF) IF(WITH_QUICKTIME) LINK_DIRECTORIES(${QUICKTIME_LIBPATH}) ENDIF(WITH_QUICKTIME) @@ -134,6 +137,9 @@ MACRO(SETUP_LIBLINKS IF(WITH_QUICKTIME) TARGET_LINK_LIBRARIES(${target} ${QUICKTIME_LIB}) ENDIF(WITH_QUICKTIME) + IF(WITH_TIFF) + TARGET_LINK_LIBRARIES(${target} ${TIFF_LIBRARY}) + ENDIF(WITH_TIFF) IF(WITH_OPENEXR) IF(WIN32) FOREACH(loop_var ${OPENEXR_LIB}) diff --git a/CMakeLists.txt b/CMakeLists.txt index 038b61e56a6..287b3394456 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ - # $Id$ +# $Id$ # ***** BEGIN GPL LICENSE BLOCK ***** # # This program is free software; you can redistribute it and/or @@ -63,6 +63,7 @@ OPTION(WITH_BULLET "Enable Bullet (Physics Engine)" ON) OPTION(WITH_INTERNATIONAL "Enable I18N (International fonts and text)" ON) OPTION(WITH_ELBEEM "Enable Elbeem (Fluid Simulation)" ON) OPTION(WITH_OPENEXR "Enable OpenEXR Support (http://www.openexr.com)" ON) +OPTION(WITH_TIFF "Enable LibTIFF Support" ON) OPTION(WITH_DDS "Enable DDS Support" ON) OPTION(WITH_FFMPEG "Enable FFMPeg Support (http://ffmpeg.mplayerhq.hu/)" OFF) OPTION(WITH_PYTHON "Enable Embedded Python API" ON) @@ -91,7 +92,7 @@ IF(UNIX AND NOT APPLE) OPTION(WITH_OPENCOLLADA "Enable OpenCollada Support (http://www.opencollada.org/)" OFF) ELSE() OPTION(WITH_OPENMP "Enable OpenMP (has to be supported by the compiler)" OFF) - OPTION(WITH_OPENCOLLADA "Enable OpenCollada Support (http://www.opencollada.org/)" ON) + OPTION(WITH_OPENCOLLADA "Enable OpenCollada Support (http://www.opencollada.org/)" OFF) ENDIF() IF (APPLE) @@ -124,11 +125,9 @@ IF(UNIX AND NOT APPLE) IF(WITH_OPENAL) FIND_PACKAGE(OpenAL) - IF(OPENAL_FOUND) - SET(WITH_OPENAL ON) - ELSE(OPENAL_FOUND) + IF(NOT OPENAL_FOUND) SET(WITH_OPENAL OFF) - ENDIF(OPENAL_FOUND) + ENDIF(NOT OPENAL_FOUND) ENDIF(WITH_OPENAL) IF(WITH_JACK) @@ -163,19 +162,23 @@ IF(UNIX AND NOT APPLE) FIND_PACKAGE(Freetype) # UNSET(FREETYPE_INCLUDE_DIRS CACHE) # cant use - # No way to set py31. remove for now. - # FIND_PACKAGE(PythonLibs) - SET(PYTHON /usr) - SET(PYTHON_VERSION 3.1) - SET(PYTHON_INC "${PYTHON}/include/python${PYTHON_VERSION}" CACHE STRING "") - # SET(PYTHON_BINARY python) # not used yet - SET(PYTHON_LIB python${PYTHON_VERSION} CACHE STRING "") - SET(PYTHON_LIBPATH ${PYTHON}/lib CACHE STRING "") - - # FIND_PACKAGE(PythonInterp) # not used yet - # SET(PYTHON_BINARY ${PYTHON_EXECUTABLE} CACHE STRING "") - - SET(PYTHON_LINKFLAGS "-Xlinker -export-dynamic") + + IF(WITH_PYTHON) + # No way to set py31. remove for now. + # FIND_PACKAGE(PythonLibs) + SET(PYTHON /usr) + SET(PYTHON_VERSION 3.1) + SET(PYTHON_INC "${PYTHON}/include/python${PYTHON_VERSION}" CACHE STRING "") + # SET(PYTHON_BINARY python) # not used yet + SET(PYTHON_LIB python${PYTHON_VERSION} CACHE STRING "") + SET(PYTHON_LIBPATH ${PYTHON}/lib CACHE STRING "") + + # FIND_PACKAGE(PythonInterp) # not used yet + # SET(PYTHON_BINARY ${PYTHON_EXECUTABLE} CACHE STRING "") + + SET(PYTHON_LINKFLAGS "-Xlinker -export-dynamic") + ENDIF(WITH_PYTHON) + IF(WITH_SDL) FIND_PACKAGE(SDL) @@ -185,23 +188,27 @@ IF(UNIX AND NOT APPLE) ENDIF(NOT SDL_FOUND) ENDIF(WITH_SDL) - SET(OPENEXR /usr CACHE FILEPATH "OPENEXR Directory") - FIND_PATH(OPENEXR_INC - ImfXdr.h - PATHS - ${OPENEXR}/include/OpenEXR - /usr/local/include/OpenEXR - /sw/include/OpenEXR - /opt/local/include/OpenEXR - /opt/csw/include/OpenEXR - /opt/include/OpenEXR - ) - SET(OPENEXR_LIB Half IlmImf Iex Imath) + IF(WITH_OPENEXR) + SET(OPENEXR /usr CACHE FILEPATH "OPENEXR Directory") + FIND_PATH(OPENEXR_INC + ImfXdr.h + PATHS + ${OPENEXR}/include/OpenEXR + /usr/local/include/OpenEXR + /sw/include/OpenEXR + /opt/local/include/OpenEXR + /opt/csw/include/OpenEXR + /opt/include/OpenEXR + ) + SET(OPENEXR_LIB Half IlmImf Iex Imath) + ENDIF(WITH_OPENEXR) - SET(FFMPEG /usr CACHE FILEPATH "FFMPEG Directory") - SET(FFMPEG_INC ${FFMPEG}/include) - SET(FFMPEG_LIB avformat avcodec avutil avdevice swscale CACHE STRING "FFMPEG Libraries") - SET(FFMPEG_LIBPATH ${FFMPEG}/lib) + IF(WITH_FFMPEG) + SET(FFMPEG /usr CACHE FILEPATH "FFMPEG Directory") + SET(FFMPEG_INC ${FFMPEG}/include) + SET(FFMPEG_LIB avformat avcodec avutil avdevice swscale CACHE STRING "FFMPEG Libraries") + SET(FFMPEG_LIBPATH ${FFMPEG}/lib) + ENDIF(WITH_FFMPEG) IF(WITH_FFTW3) SET(FFTW3 /usr) @@ -215,6 +222,13 @@ IF(UNIX AND NOT APPLE) SET(LIBSAMPLERATE_LIB samplerate) SET(LIBSAMPLERATE_LIBPATH ${LIBSAMPLERATE}/lib) + IF(WITH_TIFF) + FIND_PACKAGE(TIFF) + IF(NOT TIFF_FOUND) + SET(WITH_TIFF OFF) + ENDIF(NOT TIFF_FOUND) + ENDIF(WITH_TIFF) + FIND_PACKAGE(JPEG REQUIRED) FIND_PACKAGE(PNG REQUIRED) @@ -241,6 +255,10 @@ IF(UNIX AND NOT APPLE) IF(CMAKE_SYSTEM_NAME MATCHES "Linux") # BSD's dont use libdl.so SET(LLIBS "${LLIBS} -ldl") + + # binreloc is linux only + SET(BINRELOC ${CMAKE_SOURCE_DIR}/extern/binreloc) + SET(BINRELOC_INC ${BINRELOC}/include) ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux") IF(WITH_OPENMP) @@ -261,6 +279,7 @@ IF(UNIX AND NOT APPLE) INCLUDE_DIRECTORIES(${JPEG_INCLUDE_DIR} ${PNG_INCLUDE_DIR} ${ZLIB_INCLUDE_DIR} ) ENDIF(UNIX AND NOT APPLE) + IF(WIN32) # this file is included anyway when building under Windows with cl.exe @@ -273,133 +292,19 @@ IF(WIN32) message("64 bit compiler detected.") SET(LIBDIR ${CMAKE_SOURCE_DIR}/../lib/win64) ENDIF(CMAKE_CL_64) + + ADD_DEFINITIONS(-DWIN32) - SET(PYTHON ${LIBDIR}/python) - SET(PYTHON_VERSION 3.1) - SET(PYTHON_INC "${PYTHON}/include/python${PYTHON_VERSION}") - # SET(PYTHON_BINARY python) # not used yet - SET(PYTHON_LIB python31) - SET(PYTHON_LIBPATH ${PYTHON}/lib) - - SET(OPENAL ${LIBDIR}/openal) - SET(OPENAL_INCLUDE_DIR ${OPENAL}/include) - SET(OPENAL_LIBRARY wrap_oal) - SET(OPENAL_LIBPATH ${OPENAL}/lib) - - IF(WITH_JACK) - SET(JACK ${LIBDIR}/jack) - SET(JACK_INC ${JACK}/include/jack ${JACK}/include) - SET(JACK_LIB libjack) - SET(JACK_LIBPATH ${JACK}/lib) - ENDIF(WITH_JACK) - - IF(WITH_SNDFILE) - SET(SNDFILE ${LIBDIR}/sndfile) - SET(SNDFILE_INC ${SNDFILE}/include) - SET(SNDFILE_LIB libsndfile-1) - SET(SNDFILE_LIBPATH ${SNDFILE}/lib) - ENDIF(WITH_SNDFILE) - - IF(CMAKE_CL_64) - SET(PNG_LIBRARIES libpng) - ELSE(CMAKE_CL_64) - SET(PNG_LIBRARIES libpng_st) - ENDIF(CMAKE_CL_64) - SET(JPEG_LIBRARY libjpeg) - - SET(ZLIB ${LIBDIR}/zlib) - SET(ZLIB_INC ${ZLIB}/include) - IF(CMAKE_CL_64) - SET(ZLIB_LIBRARIES libz) - ELSE(CMAKE_CL_64) - SET(ZLIB_LIBRARIES zlib) - ENDIF(CMAKE_CL_64) - SET(ZLIB_LIBPATH ${ZLIB}/lib) - - SET(PTHREADS ${LIBDIR}/pthreads) - SET(PTHREADS_INC ${PTHREADS}/include) - SET(PTHREADS_LIB pthreadVC2) - SET(PTHREADS_LIBPATH ${PTHREADS}/lib) - SET(ICONV ${LIBDIR}/iconv) SET(ICONV_INC ${ICONV}/include) SET(ICONV_LIB iconv) SET(ICONV_LIBPATH ${ICONV}/lib) - - IF(WITH_FFTW3) - SET(FFTW3 ${LIBDIR}/fftw3) - SET(FFTW3_INC ${FFTW3}/include) - SET(FFTW3_LIB libfftw) - SET(FFTW3_LIBPATH ${FFTW3}/lib) - ENDIF(WITH_FFTW3) - - SET(GETTEXT ${LIBDIR}/gettext) - SET(GETTEXT_INC ${GETTEXT}/include) - IF(CMAKE_CL_64) - SET(GETTEXT_LIB gettext) - ELSE(CMAKE_CL_64) - SET(GETTEXT_LIB gnu_gettext) - ENDIF(CMAKE_CL_64) - SET(GETTEXT_LIBPATH ${GETTEXT}/lib) - - SET(FREETYPE ${LIBDIR}/freetype) - SET(FREETYPE_INCLUDE_DIRS ${FREETYPE}/include ${FREETYPE}/include/freetype2) - SET(FREETYPE_LIBPATH ${FREETYPE}/lib) - SET(FREETYPE_LIBRARY freetype2ST) - - SET(OPENEXR ${LIBDIR}/openexr) - SET(OPENEXR_INC ${OPENEXR}/include ${OPENEXR}/include/IlmImf ${OPENEXR}/include/Iex ${OPENEXR}/include/Imath) - SET(OPENEXR_LIB Iex Half IlmImf Imath IlmThread) - IF (MSVC80) - SET(OPENEXR_LIBPATH ${OPENEXR}/lib_vs2005) - ELSE (MSVC80) - SET(OPENEXR_LIBPATH ${OPENEXR}/lib_msvc) - ENDIF(MSVC80) - IF (MSVC90) - SET(OPENEXR_LIBPATH ${OPENEXR}/lib_vs2008) - ENDIF(MSVC90) - - - SET(QUICKTIME ${LIBDIR}/QTDevWin) - SET(QUICKTIME_INC ${QUICKTIME}/CIncludes) - SET(QUICKTIME_LIB qtmlClient) - SET(QUICKTIME_LIBPATH ${QUICKTIME}/Libraries) - - SET(FFMPEG ${LIBDIR}/ffmpeg) - SET(FFMPEG_INC ${FFMPEG}/include ${FFMPEG}/include/msvc) - SET(FFMPEG_LIB avcodec-52 avformat-52 avdevice-52 avutil-50 swscale-0) - SET(FFMPEG_LIBPATH ${FFMPEG}/lib) SET(LIBSAMPLERATE ${LIBDIR}/samplerate) SET(LIBSAMPLERATE_INC ${LIBSAMPLERATE}/include) SET(LIBSAMPLERATE_LIB libsamplerate) SET(LIBSAMPLERATE_LIBPATH ${LIBSAMPLERATE}/lib) - IF(CMAKE_CL_64) - SET(LLIBS kernel32 user32 vfw32 winmm ws2_32 ) - ELSE(CMAKE_CL_64) - SET(LLIBS kernel32 user32 gdi32 comdlg32 advapi32 shell32 ole32 oleaut32 uuid ws2_32 vfw32 winmm) - ENDIF(CMAKE_CL_64) - - SET(CMAKE_CXX_FLAGS_DEBUG "/D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /wd4800 /wd4244 /wd4305 /D_DEBUG /Od /Gm /EHsc /RTC1 /MTd /W3 /nologo /ZI /J" CACHE STRING "MSVC MT flags " FORCE) - SET(CMAKE_CXX_FLAGS_RELEASE "/D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /wd4800 /wd4244 /wd4305 /O2 /Ob2 /DNDEBUG /EHsc /MT /W3 /nologo /J" CACHE STRING "MSVC MT flags " FORCE) - SET(CMAKE_CXX_FLAGS_MINSIZEREL "/D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /wd4800 /wd4244 /wd4305 /O1 /Ob1 /DNDEBUG /EHsc /MT /W3 /nologo /J" CACHE STRING "MSVC MT flags " FORCE) - SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /wd4800 /wd4244 /wd4305 /O2 /Ob1 /DNDEBUG /EHsc /MT /W3 /nologo /Zi /J" CACHE STRING "MSVC MT flags " FORCE) - SET(CMAKE_C_FLAGS_DEBUG "/D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /wd4800 /wd4244 /wd4305 /D_DEBUG /Od /Gm /EHsc /RTC1 /MTd /W3 /nologo /ZI /J" CACHE STRING "MSVC MT flags " FORCE) - SET(CMAKE_C_FLAGS_RELEASE "/D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /wd4800 /wd4244 /wd4305 /O2 /Ob2 /DNDEBUG /EHsc /MT /W3 /nologo /J" CACHE STRING "MSVC MT flags " FORCE) - SET(CMAKE_C_FLAGS_MINSIZEREL "/D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /wd4800 /wd4244 /wd4305 /O1 /Ob1 /DNDEBUG /EHsc /MT /W3 /nologo /J" CACHE STRING "MSVC MT flags " FORCE) - SET(CMAKE_C_FLAGS_RELWITHDEBINFO "/D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /wd4800 /wd4244 /wd4305 /O2 /Ob1 /DNDEBUG /EHsc /MT /W3 /nologo /Zi /J" CACHE STRING "MSVC MT flags " FORCE) - - IF(WITH_OPENMP) - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /openmp ") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /openmp ") - ENDIF(WITH_OPENMP) - - SET(SDL ${LIBDIR}/sdl) - SET(SDL_INCLUDE_DIR ${SDL}/include) - SET(SDL_LIBRARY SDL) - SET(SDL_LIBPATH ${SDL}/lib) - SET(PNG "${LIBDIR}/png") SET(PNG_INC "${PNG}/include") SET(PNG_LIBPATH ${PNG}/lib) @@ -408,30 +313,266 @@ IF(WIN32) SET(JPEG_INC "${JPEG}/include") SET(JPEG_LIBPATH ${JPEG}/lib) - SET(TIFF ${LIBDIR}/tiff) - SET(TIFF_INC ${TIFF}/include) - SET(WINTAB_INC ${LIBDIR}/wintab/include) - SET(OPENCOLLADA ${LIBDIR}/opencollada) - SET(OPENCOLLADA_INC ${OPENCOLLADA}/include) - SET(OPENCOLLADA_LIBPATH ${OPENCOLLADA}/lib) - SET(OPENCOLLADA_LIB OpenCOLLADASaxFrameworkLoader OpenCOLLADAFramework OpenCOLLADABaseUtils OpenCOLLADAStreamWriter MathMLSolver GeneratedSaxParser UTF xml2 buffer ftoa) - #pcre is bundled with openCollada - #SET(PCRE ${LIBDIR}/pcre) - #SET(PCRE_LIBPATH ${PCRE}/lib) - SET(PCRE_LIB pcre) + IF(WITH_PYTHON) + SET(PYTHON ${LIBDIR}/python) + SET(PYTHON_VERSION 3.1) + SET(PYTHON_INC "${PYTHON}/include/python${PYTHON_VERSION}") + # SET(PYTHON_BINARY python) # not used yet + SET(PYTHON_LIB python31) + SET(PYTHON_LIBPATH ${PYTHON}/lib) + ENDIF(WITH_PYTHON) + IF(WITH_OPENAL) + SET(OPENAL ${LIBDIR}/openal) + SET(OPENAL_INCLUDE_DIR ${OPENAL}/include) + SET(OPENAL_LIBRARY wrap_oal) + SET(OPENAL_LIBPATH ${OPENAL}/lib) + ENDIF(WITH_OPENAL) + + IF(WITH_SNDFILE) + SET(SNDFILE ${LIBDIR}/sndfile) + SET(SNDFILE_INC ${SNDFILE}/include) + SET(SNDFILE_LIB libsndfile-1) + SET(SNDFILE_LIBPATH ${SNDFILE}/lib) + ENDIF(WITH_SNDFILE) + + IF(WITH_SDL) + SET(SDL ${LIBDIR}/sdl) + SET(SDL_INCLUDE_DIR ${SDL}/include) + SET(SDL_LIBRARY SDL) + SET(SDL_LIBPATH ${SDL}/lib) + ENDIF(WITH_SDL) + + IF(WITH_QUICKTIME) + SET(QUICKTIME ${LIBDIR}/QTDevWin) + SET(QUICKTIME_INC ${QUICKTIME}/CIncludes) + SET(QUICKTIME_LIB qtmlClient) + SET(QUICKTIME_LIBPATH ${QUICKTIME}/Libraries) + ENDIF(WITH_QUICKTIME) + + IF(MSVC) + IF(CMAKE_CL_64) + SET(LLIBS kernel32 user32 vfw32 winmm ws2_32 ) + ELSE(CMAKE_CL_64) + SET(LLIBS kernel32 user32 gdi32 comdlg32 advapi32 shell32 ole32 oleaut32 uuid ws2_32 vfw32 winmm) + ENDIF(CMAKE_CL_64) + + SET(CMAKE_CXX_FLAGS "/D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /wd4800 /wd4244 /wd4305" CACHE STRING "MSVC MT C++ flags " FORCE) + SET(CMAKE_C_FLAGS "/D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /wd4800 /wd4244 /wd4305" CACHE STRING "MSVC MT C++ flags " FORCE) + + SET(CMAKE_CXX_FLAGS_DEBUG "/D_DEBUG /Od /Gm /EHsc /RTC1 /MTd /W3 /nologo /ZI /J" CACHE STRING "MSVC MT flags " FORCE) + SET(CMAKE_CXX_FLAGS_RELEASE "/O2 /Ob2 /DNDEBUG /EHsc /MT /W3 /nologo /J" CACHE STRING "MSVC MT flags " FORCE) + SET(CMAKE_CXX_FLAGS_MINSIZEREL "/O1 /Ob1 /DNDEBUG /EHsc /MT /W3 /nologo /J" CACHE STRING "MSVC MT flags " FORCE) + SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/O2 /Ob1 /DNDEBUG /EHsc /MT /W3 /nologo /Zi /J" CACHE STRING "MSVC MT flags " FORCE) + SET(CMAKE_C_FLAGS_DEBUG "/D_DEBUG /Od /Gm /EHsc /RTC1 /MTd /W3 /nologo /ZI /J" CACHE STRING "MSVC MT flags " FORCE) + SET(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /DNDEBUG /EHsc /MT /W3 /nologo /J" CACHE STRING "MSVC MT flags " FORCE) + SET(CMAKE_C_FLAGS_MINSIZEREL "/O1 /Ob1 /DNDEBUG /EHsc /MT /W3 /nologo /J" CACHE STRING "MSVC MT flags " FORCE) + SET(CMAKE_C_FLAGS_RELWITHDEBINFO "/O2 /Ob1 /DNDEBUG /EHsc /MT /W3 /nologo /Zi /J" CACHE STRING "MSVC MT flags " FORCE) + + IF(WITH_OPENMP) + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /openmp ") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /openmp ") + ENDIF(WITH_OPENMP) + + SET(GETTEXT ${LIBDIR}/gettext) + SET(GETTEXT_INC ${GETTEXT}/include) + SET(GETTEXT_LIBPATH ${GETTEXT}/lib) + IF(CMAKE_CL_64) + SET(GETTEXT_LIB gettext) + ELSE(CMAKE_CL_64) + SET(GETTEXT_LIB gnu_gettext) + ENDIF(CMAKE_CL_64) + + IF(CMAKE_CL_64) + SET(PNG_LIBRARIES libpng) + ELSE(CMAKE_CL_64) + SET(PNG_LIBRARIES libpng_st) + ENDIF(CMAKE_CL_64) + SET(JPEG_LIBRARY libjpeg) + + SET(ZLIB ${LIBDIR}/zlib) + SET(ZLIB_INC ${ZLIB}/include) + SET(ZLIB_LIBPATH ${ZLIB}/lib) + IF(CMAKE_CL_64) + SET(ZLIB_LIBRARIES libz) + ELSE(CMAKE_CL_64) + SET(ZLIB_LIBRARIES zlib) + ENDIF(CMAKE_CL_64) + + SET(PTHREADS ${LIBDIR}/pthreads) + SET(PTHREADS_INC ${PTHREADS}/include) + SET(PTHREADS_LIBPATH ${PTHREADS}/lib) + SET(PTHREADS_LIB pthreadVC2) + + SET(FREETYPE ${LIBDIR}/freetype) + SET(FREETYPE_INCLUDE_DIRS ${FREETYPE}/include ${FREETYPE}/include/freetype2) + SET(FREETYPE_LIBPATH ${FREETYPE}/lib) + SET(FREETYPE_LIBRARY freetype2ST) + + IF(WITH_FFTW3) + SET(FFTW3 ${LIBDIR}/fftw3) + SET(FFTW3_LIB libfftw) + SET(FFTW3_INC ${FFTW3}/include) + SET(FFTW3_LIBPATH ${FFTW3}/lib) + ENDIF(WITH_FFTW3) + + IF(WITH_OPENCOLLADA) + SET(OPENCOLLADA ${LIBDIR}/opencollada) + SET(OPENCOLLADA_INC ${OPENCOLLADA}/include) + SET(OPENCOLLADA_LIBPATH ${OPENCOLLADA}/lib) + SET(OPENCOLLADA_LIB OpenCOLLADASaxFrameworkLoader OpenCOLLADAFramework OpenCOLLADABaseUtils OpenCOLLADAStreamWriter MathMLSolver GeneratedSaxParser UTF xml2 buffer ftoa) + #pcre is bundled with openCollada + #SET(PCRE ${LIBDIR}/pcre) + #SET(PCRE_LIBPATH ${PCRE}/lib) + SET(PCRE_LIB pcre) + ENDIF(WITH_OPENCOLLADA) + + IF(WITH_FFMPEG) + SET(FFMPEG ${LIBDIR}/ffmpeg) + SET(FFMPEG_INC ${FFMPEG}/include ${FFMPEG}/include/msvc) + SET(FFMPEG_LIB avcodec-52 avformat-52 avdevice-52 avutil-50 swscale-0) + SET(FFMPEG_LIBPATH ${FFMPEG}/lib) + ENDIF(WITH_FFMPEG) + + IF(WITH_OPENEXR) + SET(OPENEXR ${LIBDIR}/openexr) + SET(OPENEXR_INC ${OPENEXR}/include ${OPENEXR}/include/IlmImf ${OPENEXR}/include/Iex ${OPENEXR}/include/Imath) + SET(OPENEXR_LIB Iex Half IlmImf Imath IlmThread) + IF (MSVC80) + SET(OPENEXR_LIBPATH ${OPENEXR}/lib_vs2005) + ELSE (MSVC80) + SET(OPENEXR_LIBPATH ${OPENEXR}/lib_msvc) + ENDIF(MSVC80) + IF (MSVC90) + SET(OPENEXR_LIBPATH ${OPENEXR}/lib_vs2008) + ENDIF(MSVC90) + ENDIF(WITH_OPENEXR) + + IF(WITH_TIFF) + SET(TIFF ${LIBDIR}/tiff) + SET(TIFF_LIBRARY libtiff) + SET(TIFF_INCLUDE_DIR ${TIFF}/include) + SET(TIFF_LIBPATH ${TIFF}/lib) + ENDIF(WITH_TIFF) + + IF(WITH_JACK) + SET(JACK ${LIBDIR}/jack) + SET(JACK_INC ${JACK}/include/jack ${JACK}/include) + SET(JACK_LIB libjack) + SET(JACK_LIBPATH ${JACK}/lib) + ENDIF(WITH_JACK) + + # MSVC only, Mingw doesnt need + IF(CMAKE_CL_64) + SET(PLATFORM_LINKFLAGS "/MACHINE:X64 /NODEFAULTLIB:libc.lib;MSVCRT.lib ") + ELSE(CMAKE_CL_64) + SET(PLATFORM_LINKFLAGS "/NODEFAULTLIB:libc.lib ") + ENDIF(CMAKE_CL_64) + + SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} /NODEFAULTLIB:libcmt.lib;libc.lib ") + + ELSE(MSVC) # MINGW + SET(LLIBS "-lshell32 -lshfolder -lgdi32 -lmsvcrt -lwinmm -lmingw32 -lm -lws2_32 -lz -lstdc++ -lole32 -luuid") + + SET(CMAKE_CXX_FLAGS "-pipe -funsigned-char -fno-strict-aliasing -mwindows" CACHE STRING "Mingw C++ flags ") + SET(CMAKE_C_FLAGS "-pipe -funsigned-char -fno-strict-aliasing" CACHE STRING "Mingw C flags ") + + SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g" CACHE STRING "Mingw debug C++ flags ") + SET(CMAKE_CXX_FLAGS_RELEASE " -O2" CACHE STRING "Mingw release C++ flags ") + SET(CMAKE_CXX_FLAGS_MINSIZEREL " -Os" CACHE STRING "Mingw minsize release C++ flags ") + SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g" CACHE STRING "Mingw release, debug C++ flags ") + + SET(CMAKE_C_FLAGS_DEBUG "-O0 -g" CACHE STRING "Mingw debug C flags ") + SET(CMAKE_C_FLAGS_RELEASE "-O2" CACHE STRING "Mingw release C flags ") + SET(CMAKE_C_FLAGS_MINSIZEREL "-Os" CACHE STRING "Mingw minsize release C flags ") + SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g" CACHE STRING "Mingw release, debug C++ flags ") + ADD_DEFINITIONS(-DFREE_WINDOWS) + + IF(WITH_OPENMP) + SET(LLIBS "${LLIBS} -lgomp") + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fopenmp") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp") + ENDIF(WITH_OPENMP) + + SET(GETTEXT ${LIBDIR}/gcc/gettext) + SET(GETTEXT_INC ${GETTEXT}/include) + SET(GETTEXT_LIBPATH ${GETTEXT}/lib) + SET(GETTEXT_LIB intl) + + SET(JPEG_LIBRARY jpeg) + SET(PNG_LIBRARIES png) + + SET(ZLIB ${LIBDIR}/zlib) + SET(ZLIB_INC ${ZLIB}/include) + SET(ZLIB_LIBPATH ${ZLIB}/lib) + SET(ZLIB_LIBRARIES z) + + SET(PTHREADS ${LIBDIR}/pthreads) + SET(PTHREADS_INC ${PTHREADS}/include) + SET(PTHREADS_LIBPATH ${PTHREADS}/lib) + SET(PTHREADS_LIB pthreadGC2) + + SET(FREETYPE ${LIBDIR}/gcc/freetype) + SET(FREETYPE_INCLUDE_DIRS ${FREETYPE}/include ${FREETYPE}/include/freetype2) + SET(FREETYPE_LIBPATH ${FREETYPE}/lib) + SET(FREETYPE_LIBRARY freetype) + + IF(WITH_FFTW3) + SET(FFTW3 ${LIBDIR}/gcc/fftw3) + SET(FFTW3_LIB fftw3) + SET(FFTW3_INC ${FFTW3}/include) + SET(FFTW3_LIBPATH ${FFTW3}/lib) + ENDIF(WITH_FFTW3) + + IF(WITH_OPENCOLLADA) + SET(OPENCOLLADA ${LIBDIR}/gcc/opencollada) + SET(OPENCOLLADA_INC ${OPENCOLLADA}/include) + SET(OPENCOLLADA_LIBPATH ${OPENCOLLADA}/lib ${OPENCOLLADA}/lib) + SET(OPENCOLLADA_LIB OpenCOLLADAStreamWriter OpenCOLLADASaxFrameworkLoader OpenCOLLADAFramework OpenCOLLADABaseUtils GeneratedSaxParser UTF MathMLSolver expat pcre buffer ftoa) + #pcre is bundled with openCollada + #SET(PCRE ${LIBDIR}/pcre) + #SET(PCRE_LIBPATH ${PCRE}/lib) + SET(PCRE_LIB pcre) + ENDIF(WITH_OPENCOLLADA) + + IF(WITH_FFMPEG) + SET(FFMPEG ${LIBDIR}/ffmpeg) + SET(FFMPEG_INC ${FFMPEG}/include ${FFMPEG}/include) + SET(FFMPEG_LIB avcodec-52 avformat-52 avdevice-52 avutil-50 swscale-0) + SET(FFMPEG_LIBPATH ${FFMPEG}/lib) + ENDIF(WITH_FFMPEG) + + IF(WITH_OPENEXR) + SET(OPENEXR ${LIBDIR}/gcc/openexr) + SET(OPENEXR_INC ${OPENEXR}/include ${OPENEXR}/include/OpenEXR) + SET(OPENEXR_LIB Half IlmImf Iex) + SET(OPENEXR_LIBPATH ${OPENEXR}/lib) + ENDIF(WITH_OPENEXR) + + IF(WITH_TIFF) + SET(TIFF ${LIBDIR}/gcc/tiff) + SET(TIFF_LIBRARY tiff) + SET(TIFF_INCLUDE_DIR ${TIFF}/include) + SET(TIFF_LIBPATH ${TIFF}/lib) + ENDIF(WITH_TIFF) + + IF(WITH_JACK) + SET(JACK ${LIBDIR}/jack) + SET(JACK_INC ${JACK}/include/jack ${JACK}/include) + SET(JACK_LIB jack) + SET(JACK_LIBPATH ${JACK}/lib) + + # TODO, gives linking errors, force off + SET(WITH_JACK OFF) + ENDIF(WITH_JACK) + + ENDIF(MSVC) - IF(CMAKE_CL_64) - SET(PLATFORM_LINKFLAGS "/MACHINE:X64 /NODEFAULTLIB:libc.lib;MSVCRT.lib ") - ELSE(CMAKE_CL_64) - SET(PLATFORM_LINKFLAGS "/NODEFAULTLIB:libc.lib ") - ENDIF(CMAKE_CL_64) - - SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} /NODEFAULTLIB:libcmt.lib;libc.lib ") ENDIF(WIN32) + IF(APPLE) IF(WITH_LIBS10.5) SET(LIBDIR ${CMAKE_SOURCE_DIR}/../lib/darwin-9.x.universal) @@ -478,7 +619,7 @@ IF(APPLE) # SET(PYTHON_BINARY "${PYTHON}/bin/python${PYTHON_VERSION}") # not used yet SET(PYTHON_LIB python${PYTHON_VERSION}) SET(PYTHON_LIBPATH "${PYTHON}/lib/python${PYTHON_VERSION}") - # SET(PYTHON_LINKFLAGS "-u _PyMac_Error") # won't build with this enabled + # SET(PYTHON_LINKFLAGS "-u _PyMac_Error") # won't build with this enabled ELSE(PYTHON_VERSION MATCHES 3.1) # otherwise, use custom system framework @@ -585,7 +726,9 @@ IF(APPLE) SET(JPEG_LIBPATH ${JPEG}/lib) SET(TIFF ${LIBDIR}/tiff) - SET(TIFF_INC ${TIFF}/include) + SET(TIFF_INCLUDE_DIR ${TIFF}/include) + SET(TIFF_LIBRARY tiff) + SET(TIFF_LIBPATH ${TIFF}/lib) SET(EXETYPE MACOSX_BUNDLE) @@ -608,11 +751,6 @@ IF(APPLE) ENDIF(APPLE) -IF(CMAKE_SYSTEM_NAME MATCHES "Linux") - SET(BINRELOC ${CMAKE_SOURCE_DIR}/extern/binreloc) - SET(BINRELOC_INC ${BINRELOC}/include) -ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux") - # buildinfo IF(WITH_BUILDINFO) diff --git a/SConstruct b/SConstruct index 30d8788f040..dc6198bd81e 100644 --- a/SConstruct +++ b/SConstruct @@ -182,7 +182,7 @@ if os.path.exists(userconfig): else: print B.bc.WARNING + userconfig + " not found, no user overrides" + B.bc.ENDC -opts = btools.read_opts(optfiles, B.arguments) +opts = btools.read_opts(env, optfiles, B.arguments) opts.Update(env) if not env['BF_FANCY']: @@ -457,8 +457,6 @@ if env['OURPLATFORM']!='darwin': if env['WITH_BF_FHS']: dir= os.path.join(*([BLENDERPATH] + dp.split(os.sep)[2:])) # skip bin/.blender else: dir= os.path.join(*([BLENDERPATH] + dp.split(os.sep)[1:])) # skip bin - # print dir+ os.sep + f - print dir dottargetlist.append(dir + os.sep + f) @@ -569,10 +567,12 @@ if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'win64-vc', 'linuxcross'): #currently win64-vc doesn't appear to have libpng.dll if env['OURPLATFORM'] != 'win64-vc': - dllsources += ['${BF_PNG_LIBPATH}/libpng.dll', - '${BF_ZLIB_LIBPATH}/zlib.dll'] + dllsources += ['${BF_PNG_LIBPATH}/libpng.dll'] - dllsources += ['${BF_TIFF_LIBPATH}/${BF_TIFF_LIB}.dll'] + dllsources += ['${BF_ZLIB_LIBPATH}/zlib.dll'] + # Used when linking to libtiff was dynamic + # keep it here until compilation on all platform would be ok + # dllsources += ['${BF_TIFF_LIBPATH}/${BF_TIFF_LIB}.dll'] if env['OURPLATFORM'] != 'linuxcross': # pthreads library is already added diff --git a/config/darwin-config.py b/config/darwin-config.py index bac4c9ab165..2c3d0a7e87e 100644 --- a/config/darwin-config.py +++ b/config/darwin-config.py @@ -163,8 +163,11 @@ BF_PNG_INC = '${BF_PNG}/include' BF_PNG_LIB = 'png' BF_PNG_LIBPATH = '${BF_PNG}/lib' +WITH_BF_TIFF = True BF_TIFF = LIBDIR + '/tiff' BF_TIFF_INC = '${BF_TIFF}/include' +BF_TIFF_LIB = 'tiff' +BF_TIFF_LIBPATH = '${BF_TIFF}/lib' WITH_BF_ZLIB = True BF_ZLIB = '/usr' diff --git a/config/linux2-config.py b/config/linux2-config.py index 3951dac2454..199ea391d4e 100644 --- a/config/linux2-config.py +++ b/config/linux2-config.py @@ -68,8 +68,10 @@ BF_PNG = '/usr' BF_PNG_INC = '${BF_PNG}/include' BF_PNG_LIB = 'png' +WITH_BF_TIFF = True BF_TIFF = '/usr' BF_TIFF_INC = '${BF_TIFF}/include' +BF_TIFF_LIB = 'tiff' WITH_BF_ZLIB = True BF_ZLIB = '/usr' diff --git a/config/linuxcross-config.py b/config/linuxcross-config.py index fe5e954f3bc..0f8a15a8c75 100644 --- a/config/linuxcross-config.py +++ b/config/linuxcross-config.py @@ -55,7 +55,7 @@ WITH_BF_OPENEXR = True WITH_BF_STATICOPENEXR = False BF_OPENEXR = LIBDIR + '/gcc/openexr' BF_OPENEXR_INC = '${BF_OPENEXR}/include ${BF_OPENEXR}/include/OpenEXR' -BF_OPENEXR_LIB = ' Half IlmImf Iex ' +BF_OPENEXR_LIB = ' Half IlmImf Iex IlmThread ' BF_OPENEXR_LIBPATH = '${BF_OPENEXR}/lib' # Warning, this static lib configuration is untested! users of this OS please confirm. BF_OPENEXR_LIB_STATIC = '${BF_OPENEXR}/lib/libHalf.a ${BF_OPENEXR}/lib/libIlmImf.a ${BF_OPENEXR}/lib/libIex.a ${BF_OPENEXR}/lib/libImath.a ${BF_OPENEXR}/lib/libIlmThread.a' @@ -75,9 +75,9 @@ BF_PNG_LIB = 'png' BF_PNG_LIBPATH = '${BF_PNG}/lib' WITH_BF_TIFF = True -BF_TIFF = LIBDIR + '/tiff' +BF_TIFF = LIBDIR + '/gcc/tiff' BF_TIFF_INC = '${BF_TIFF}/include' -BF_TIFF_LIB = 'libtiff' +BF_TIFF_LIB = 'tiff' BF_TIFF_LIBPATH = '${BF_TIFF}/lib' WITH_BF_ZLIB = True @@ -174,9 +174,6 @@ BF_OPENCOLLADA_LIBPATH = '${BF_OPENCOLLADA}/lib ${BF_ICONV_LIBPATH}' WITH_BF_RAYOPTIMIZATION = False BF_RAYOPTIMIZATION_SSE_FLAGS = ['-msse'] -CC = 'i586-mingw32msvc-gcc' -CXX = 'i586-mingw32msvc-g++' - CCFLAGS = [ '-pipe', '-funsigned-char', '-fno-strict-aliasing' ] CPPFLAGS = ['-DWIN32', '-DFREE_WINDOWS'] diff --git a/config/win32-mingw-config.py b/config/win32-mingw-config.py index 9088db5a5d8..141658d3217 100644 --- a/config/win32-mingw-config.py +++ b/config/win32-mingw-config.py @@ -54,7 +54,7 @@ WITH_BF_OPENEXR = True WITH_BF_STATICOPENEXR = False BF_OPENEXR = LIBDIR + '/gcc/openexr' BF_OPENEXR_INC = '${BF_OPENEXR}/include ${BF_OPENEXR}/include/OpenEXR' -BF_OPENEXR_LIB = ' Half IlmImf Iex ' +BF_OPENEXR_LIB = ' Half IlmImf Iex IlmThread ' BF_OPENEXR_LIBPATH = '${BF_OPENEXR}/lib' # Warning, this static lib configuration is untested! users of this OS please confirm. BF_OPENEXR_LIB_STATIC = '${BF_OPENEXR}/lib/libHalf.a ${BF_OPENEXR}/lib/libIlmImf.a ${BF_OPENEXR}/lib/libIex.a ${BF_OPENEXR}/lib/libImath.a ${BF_OPENEXR}/lib/libIlmThread.a' @@ -73,9 +73,10 @@ BF_PNG_INC = '${BF_PNG}/include' BF_PNG_LIB = 'png' BF_PNG_LIBPATH = '${BF_PNG}/lib' -BF_TIFF = LIBDIR + '/tiff' +WITH_BF_TIFF = True +BF_TIFF = LIBDIR + '/gcc/tiff' BF_TIFF_INC = '${BF_TIFF}/include' -BF_TIFF_LIB = 'libtiff' +BF_TIFF_LIB = 'tiff' BF_TIFF_LIBPATH = '${BF_TIFF}/lib' WITH_BF_ZLIB = True diff --git a/config/win32-vc-config.py b/config/win32-vc-config.py index 3e8dfc3d5df..b3766247d2d 100644 --- a/config/win32-vc-config.py +++ b/config/win32-vc-config.py @@ -79,6 +79,7 @@ BF_PNG_INC = '${BF_PNG}/include' BF_PNG_LIB = 'libpng_st' BF_PNG_LIBPATH = '${BF_PNG}/lib' +WITH_BF_TIFF = True BF_TIFF = LIBDIR + '/tiff' BF_TIFF_INC = '${BF_TIFF}/include' BF_TIFF_LIB = 'libtiff' diff --git a/config/win64-vc-config.py b/config/win64-vc-config.py index 41772dea14b..c1cbb7cfee8 100644 --- a/config/win64-vc-config.py +++ b/config/win64-vc-config.py @@ -75,6 +75,7 @@ BF_PNG_INC = '${BF_PNG}/include' BF_PNG_LIB = 'libpng' BF_PNG_LIBPATH = '${BF_PNG}/lib' +WITH_BF_TIFF = True BF_TIFF = LIBDIR + '/tiff' BF_TIFF_INC = '${BF_TIFF}/include' BF_TIFF_LIB = 'libtiff' diff --git a/intern/ghost/intern/GHOST_SystemCocoa.mm b/intern/ghost/intern/GHOST_SystemCocoa.mm index eb89258e1dd..2cec24714be 100644 --- a/intern/ghost/intern/GHOST_SystemCocoa.mm +++ b/intern/ghost/intern/GHOST_SystemCocoa.mm @@ -1106,7 +1106,7 @@ GHOST_TSuccess GHOST_SystemCocoa::handleDraggingEvent(GHOST_TEventType eventType { droppedStr = [droppedArray objectAtIndex:i]; - pastedTextSize = [droppedStr lengthOfBytesUsingEncoding:NSISOLatin1StringEncoding]; + pastedTextSize = [droppedStr lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; temp_buff = (GHOST_TUns8*) malloc(pastedTextSize+1); if (!temp_buff) { @@ -1114,7 +1114,7 @@ GHOST_TSuccess GHOST_SystemCocoa::handleDraggingEvent(GHOST_TEventType eventType break; } - strncpy((char*)temp_buff, [droppedStr cStringUsingEncoding:NSISOLatin1StringEncoding], pastedTextSize); + strncpy((char*)temp_buff, [droppedStr cStringUsingEncoding:NSUTF8StringEncoding], pastedTextSize); temp_buff[pastedTextSize] = '\0'; strArray->strings[i] = temp_buff; @@ -1125,7 +1125,7 @@ GHOST_TSuccess GHOST_SystemCocoa::handleDraggingEvent(GHOST_TEventType eventType case GHOST_kDragnDropTypeString: droppedStr = (NSString*)data; - pastedTextSize = [droppedStr lengthOfBytesUsingEncoding:NSISOLatin1StringEncoding]; + pastedTextSize = [droppedStr lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; temp_buff = (GHOST_TUns8*) malloc(pastedTextSize+1); @@ -1133,7 +1133,7 @@ GHOST_TSuccess GHOST_SystemCocoa::handleDraggingEvent(GHOST_TEventType eventType return GHOST_kFailure; } - strncpy((char*)temp_buff, [droppedStr cStringUsingEncoding:NSISOLatin1StringEncoding], pastedTextSize); + strncpy((char*)temp_buff, [droppedStr cStringUsingEncoding:NSUTF8StringEncoding], pastedTextSize); temp_buff[pastedTextSize] = '\0'; diff --git a/intern/ghost/intern/GHOST_WindowWin32.cpp b/intern/ghost/intern/GHOST_WindowWin32.cpp index 19c3e061159..1da64850198 100644 --- a/intern/ghost/intern/GHOST_WindowWin32.cpp +++ b/intern/ghost/intern/GHOST_WindowWin32.cpp @@ -162,7 +162,7 @@ GHOST_WindowWin32::GHOST_WindowWin32( height = th; top = rect.top; } - else if(top > rect.top) + else if(top < rect.top) top = rect.top; m_hWnd = ::CreateWindow( diff --git a/release/datafiles/blenderbuttons b/release/datafiles/blenderbuttons index a38525c7f461586576104488f463e9b410fa6338..b9fa75cc2540dda65beeb0290ebaee2d29568014 100644 GIT binary patch delta 28575 zcmYg%byQUE_w^9c0@5NaB~sE|(kUU`(x8-dTtd1eM_NEiQX1)!E@|nO?ymRo^Zn!f zEoRn22ktQUIkC^)`^0WwWo=-Uw_+eD2DV{@v|%9BwqYPLmO{m0bgntSNWFMX?Wf=T zP&i;NFSpA~KERnC3{NoVl!PcZJ%Y_$Er%D9>zxnk4}1=8Fhs8Z=ImMyXC&H6Wy9fG zH)lIjH*VYG=-f8rZ*WN1{icd_I2Q_3a|~(e=+dj>OR>dq_0R*pk_0~ufFyV|xMbsK zyK#|6Q_W{!0T5M2C38cj$(P@VwMoG-2p_5CIIv(O!S#=p7>#fG8lZS}W}*;8F<;;N zz3>%UG#Ub!b`lHQrbDbO7b%R3bnu{@np{J*+%{mkd}b8przeVx0Nb5m_$7^heyi!| zeeOUI$Qp?9Sog4-61s&gwayk?QcyG(`5HD4*{*CphagFD>CoSlvP(!JQfDJ$r$MN# zA7Eq*4Eg@vA}!U1WfyA>e7&Ac_uk6NL)Zy%2yGiX*SHw3MTF2cGKK7!(aBXJ39@-A z7W^#|kPpq5>pzI~E(^)qdeeJ)c${e#YFrUW{b1BS(?85#at<*0!j-GW|Babdj&OWM zA+)6G2}BwnO`abuQ#DRJsAG(Vsqy^9??jU?W-v=ReC&0)>^a0C z#0aX@$S-;vV0;|Z&X~x=;CK-&Y9?N7Gs-n+j5qjaf^zT5cCnTxyd;H!f>6<5k2tdFjW7O%G~UBCqc3k%Epes`vlwZU~yK;Yxw5m=byF|wGF z;1-X$g+;Ix7wP5Yr5$W!iA94ZAiLmhVPRo+r7HsG)2B~$FB9d*5?-ha7&dvHJx|H= znx?KHKo&1{adUIKI_jp(b|N0dcXN}PMM`vgCffVi?lS+%h(qnLy9GRFN>#;na`_nD;)c&otHE2AV zD%9o0ix*_D!_!kcW_Z7r?q(I&4H`+*FZ~itLD@nLqGxDs)2D><2*$Z>jYfyMlOp9C zpII2lw^eb84=m3@4Por%>~AlJZTvcx*|R9{XJ%ix21RboH2d7>fb21tuX#Uf51t!D zl$0%h+k-HhGrf;{%Q-EFmiFNq|?Th>xt1k&%$k^|;4u&HHNT;qGE#W@g3+G1Lb?Hg`x`IGw_T8B?Yo zNr6hwxRvFcdcO(DbmvAXmFMmdd|+n%I$W6M%++15u-EzSPy0oY(S2yXK`M%rJ0K(k z6$4d0sdfDR{=UY56GfCwP#{}8;h4mCFTUc<8j|`+hJRDTW6Z$7A`*!gs58mmf5v?1 za=Z4L8k16aJ_c!YFMB1B#UF_JS5}?`6SEms#mmx`H9p*4os6`$wvxe&W?s(e8yM7b zV&(J?43MG2IFfg9!X%+=S!Lz>^Y@R<1{l9fEjULcbr}`a>4zZ8akBi1eky}Saw*q0 zw#i0<4HrGU48va$aM}L+^KFr_yh@1U?{6FVDw#az&-k=Eazm96?k75-{pqbA_6He6 zus%FpZycPMlFgy?lkxQ&ZEgnnj~65cDB}h^6u7e6IoG1|=YuJc;FkR3xqA zUGPQW)o2I{?LzZJTb|XE2j-un%g$O1c7ME1kH*Mqo`nxbX)tkcaO9ou&wJT}#L$0) zh|t*B7)l}R`HhZ_ZjiOs=7plk>p0r?ce;w6RC-G}Zy3M6VT85bD9L0*M@JW#ap)K& z%I8wc#nGV!Ozc2sG(i%MnVjoFYp+w$TE# zXB*rOZj(7JZ8Ak-j(jgK`Kg~AKP4t6-UnrwUjfcaIF!O|%hF%rvsag4D|)qt-!Wwb zrQiPD!mRbe$*fSLo?2U3Q8Z}sOniaEAQxwwr=0$sloPU0)Xd}Pey)(%jZv2{+R+i{ zywr*?f4(={JDMX?W&q-^{*{HpYnbrGgt9ET1a@DJo)Np&)@0C|&)2cCrY1xPR&7>@136 zT%M)OdUSq{J>1*d%c(h2nmf{)!hFRgvlEv=>&Z41q>l_U6#2bJhDCr` zk8^9yx>0`}`X|5JW}{$Lo=|~Ofi}+2rrJ}*WK+LVul7To=NS{MijhEfPcH5@!Q=~c z29sA<=g9(vf^v7ZRs{tHQqzCbN>WS=<}O5W=`B*HUrHw!8g=;5#l=4Yi5P>SS7z~c zGG0A5n#}sthjGU4i#ECY5Z?IqT4*`WY<$S1q>tC%sgTDfavx=wKOV>rE606X+MjPY zJU;eZ_X*F2eRbhyv=o8v8+FXgXrVvVw!D>~Os7Amp%LQX{2O8ex)>yt4COZ0&MB8bKQktQmA*&H| z$IXYRV|DkreB0Y!Qrc0f0^F=BpZi;n-&NLQLeIEu%!n;>q@xHR(2;o1r7A4$?-8nZ zP^b2FL8~$(!|qPV$e<83>%kocN7pdhv9+<0_l4(uO79fgSM_`x5xYM8UNS!Kuy?-A zNxr9lRd*wwatghE{d(SRd0=>W^JiV%*AMeQ3-EFM($dI4VBw_lyl=lg+xhXX8=K4S zirS3hXYtT9W{NnVE`M+E@idR}U@<0LCqFu8u^+CS3WxV}Akrc|+&9!7bRc3PAXCoPV#4n` z5y_BTJ5b={U5JJ_cS~)7axkmKX5l9U1XbAZ@Ge9~s1B*T(7)P2KtP~$`**Iw;@)iS z32bSu-kI;?U)=r0mKX+=40aO}lhXdl1H($2v!vW6-B0e-@5wavQs9Z3`}+$409`)o zpD{n*ox!0HiEyFf*T;_Of6}v#=N6>6vPw(ji76|Ql9`!V0X{j37_lBds2Mja%VXLy z0c(&$9T}?%6QQ8*c%i{_*pmNxp~m-d&@Z3vF5fPPP-Z90cwk_|`_~;9`>PW|B}+~H z{mRC+@ZfAlr9VQP|9em22xl7f02;Ko=Ww~Sbn?#9QnlEKFRzc@GQC}yEYW+v!bO7B zI6kf+s+I~Qa)nG2i?)|K(Q&#pcCex;=9So#^B{zyb5cn_K$2CGc&W$mX?QFb4P3vc4KcVtG_b|P(p%*d~U@) zfGX0b`|~$lt^P=Y+Q>Phb$2~&O@II7;MhExGT_{ueSg;H&NFk<`ctX5cWbu#&+WZ_ zskZlC%2>ukkwG!sn}MD_+v{RqpCV@Jd!!TV{zQ@1gU`+Rivi8_emL9eLX%f$SlGX; z6o~BYs0(^Dw@OrTdFTvjstxgUBB~O)^Y!z?rJ2jlJT6lN$O`d^A@399r)(}>@=LU! zt<{tmwfKHAEDJF#n?hpb`Ce9ATU+jXcTK`+f%O7Fwge63YTXh+&r?Ql8v@u`Zt=j3 z;wO;>gZFnOy@!5!bC}uk0mFT)fd-Fef(bMcK(`0UFm{u>;N@O2DY(pDfL;$Nc9&>EpQgUte}IN zjix+?Nuz{7C^+P?(B+}YtIS~;J3HpM`1l{@WAs0pQuRJC*xOGeDWz&R8R8_FgOvFM z4k=t@Uz9!SjrDz%NlN#aP>YCZXXunjCWkr3niD@-z+w6F+O^V``F@$@gD-t~cB%n* zh-6P&W053K#i)=jP5;siGs)GcD`sjwZ$g;noIrxu*vgVY>v4&Sj5K@8L zeLz7)weiY@;GbBm zoD$8Fl#rRMd6W|m?T+Bb{8)AFmwfcxJk+l)0&51Dllld+Ows|?)I)vrh?^FzJ&&%J zCYG^EvqYCHZUt`$Be_hG$*EQ`i%$UJadUFnlc}(a&d<+Jm8Hd~UY+B|a(8fZc5-lW zOmMZC%9gI&7_^zR{avNw5Ex8}Pan@jMb$dEOKTLI`?k*K#&sZ-7w7Emc4=?#F)uH# zezW&e5E3C0Sz@}nqyQNO+}&Js7_;~6mZ;Q(mi#v6Nbbo-ETZ*|mF@hJz6L3@1C&*p z%%X$OplnxfH&YP-V9RIu+&bSo0qIB*N5`&kLYD4m@(56qmb)T|pUJO2V>fOsR?U%S zi3ts*0vIgo4dY0W7MtC4x&J$kWS;Y#sRP#*-@6ZEM+_~qO}=gG1r4>YeA}nIn|k>M zgU2kn)vQYkU2NA`b6!CZEQZ0g&S!ROT5ut(Sfj9uUHo1q6^1+Txm zyI3NbI219ctZ>ZmYzNOM=1&eD7VNI%9%R?=9GaE~vf0Cy;dRSr* zeT-79Ykuid!Sh%Yeprp7o~KwCpOh2~;NlYKt8_YkRj4==`UwymjtW80DVQ?3{iNxH zc&(<(seig1M7!?&$pZO3@=S5gH?YHY9*W&>GVVn@nrXR+C1#U;Gkc!#(Q0zPV_hhD z^KEFF@O%DYZvp(Q3`&#vWc0N@=hwM<*dh@SB`N6+%C4l8)N(&t%Xl+&ZWnB2XD7mWbI4@mtN5Ss@$r`rlm7!l z4#foD9vvMW&0qwzH-LcpW?07dC2qPh#IVJ2^$D045n%Qc_AMnx=SSAO?mf8eR$SS( zQ>C{ZAvl7fDhmD8Ssfnh7XWProA)Onz#xEtF(a(g%iB!kw*6Sse{v^uD`@sT9*pvM zo7r0`e=PY}{FonC%@|91EWT=iH&eLKK<3*(@#L$z$CH_V{?KJk?pM^eJ&AaxkgGP= z=%GGSZqi|wWKO;@l)ghl6!EO3ts1(zJX)P((XF~nqwS5x>PS;oQZjh7lpD23i3%;D z!jfWh4a-pF;*52OkWjE%K_A+gYjDH)R~5FWf2_WR&A_A)87FP>)C#%&Rl9UyFCwgt z*4|!pr+P9(e;AnX1mR2F65d1;D!2WFk1Sl zh_0|+wGFo~7z(e4(gjaYu}J)Wy6n_|-{*sUeb*hWU1O)yzuXbBIxPCo32O1j_p>#3 z8vv?=F=~%qk&*;&HG`tLD+$jNzbGhTqe zz`y|N=;s790u_JVwkQOBRG7v|fItr=F*@Q5vvrF~>{pEMKQGaq|FZwS!|1lUeEFR( zP5Wt!QL4X@ar^Ux-IIxt#YIYMYimBw(*jaP)zAJW&=;weyYtxu`<6RRTmk}QSQhL9 zfm^X8jX!9xQrg%g0zAe8Yd^9VC~J^HRs-y+pCs2yGwOf4v~Ut#-U?obnk>Cs{VE+O z-MX`fAinggx`B8HJrEXvywcku?k7fJf-J7etTYxH5rNcSK{D3tdC^MM7ma7nKp z6FGthIta&gaCOBV92n>XIN=p&mz|N3k?LSzl2lW}gE97tTR%C;%F42ut9u0y6C1#` z2gJCzOX(RI3%BnxR8(1xMd_--eMTaG>Hg%l{VL)^dK=I1qrd;9O3{SxBdX@Zw#+)~ zlMMyoQvKMSoSY{P2NZSD(OKt2#;d=g-av&KJ-xjMuwwmsJf=hp`e*n4)!d%GzKsy8h~FxB*R9<#>O^QL>b5sBI2T3QcM@%u2RVqQGLc^ z$KID(ZIuC9Cv^L@O%)ZJY=k)2ozW|FxS}>w$V1}Fygii z8QuTQ+93xub-c-!kQxULEXa8WG!+^*UQ6X>=}d-|irX)GyqQ{$ZAoCTKYCNc=r$8X zUElH)zP~N9z|WV?sZam%MYg`7!P#^bA6r14uGC4UI}c{uGgz;@{c(!`zM7GdTsUsU z#bzgb0SbttknnuLD#I|D6EWtTnRm3l81APpG#Wzq@zewn^M>@a5Ti~K%c#WVyYr=m zM;Er|nVNHTUKgy<2Ht4sMW|VWZM{k@??%S$7pD)(n18%wwVnL)Csyh*RzLXp?N{+Y z3;Wrc!4<#b!{ygi_KOQbgZ|3t0$G3;biX{LMnpn#Jm1wpkWvk33q)nRT#XTpPO`o* zs>OaT9mzQKlJcT0m=gS<8@i(bT(}YFiST*ic?k zpYT$pl&^+2=TB>@Tr7&BHH#j>`-AjZLn3`}wWJ18Y?y5YThrc@t6Ag@l^N%BL;ZH_0lk&cN z@d7;~BO_Nt1-d=zhI3CKYC@MTU3kKo9e1M{n~79tSa;h+k!j`Z>zdU9&=-ByQVPn0 zk0+hz#DQ(b_#rdjS65fxJ<$=Oz#(gX$tWj$m@X*3JBkV|;{7F~oo0()sq6f)HiB(x zG+-~%>TDFDA~YOYWc=C$600CHT|6|h(R3?eYEPVh!FOfbZuEy>01-N@D&CwkX1B6V zL6M7Fa^Ra3@rU1E@34XXgkO#^8=so0pib~8>kS(0x7r^;P}9I8t-*8QDn6#+3H%^U zBI2`u&j2SCcemfJH&xvz*7#l>rJKQFp#in7a$vwS|bW&0l=U?ou-M z%ca|lh6}fQ*T2@#iFC>Ast56KY!T!&r;kGE1pqoo995RI+D z@=In3%+~sBY%6;IrDp3}cRmUswEcJn5|NJu`piUSV&ai`L~4bnQ-B`p)hA;8G<9_n z%I{4g&3Ym2A)h~L)w=A!oJ0~PiI|e7n$~+!jXLt_Wmw_pQVtVIxkvZglCsC%A{~3> zeWHhjDZ~(8cXi<`MoZGvI5I=b0i&e8zK|8W>maXf^&hfo-Kdd~H=C)v_L?~8=#EU@ z57*BYzE}XxqM@m&$q3;7J(Q7w=z|Y+4$Fv);qApbm7h~nF$3HD1_l&6ySl{7rk+z% zBLF%uz_3gPaAzNXR-n>ib%?RTUl;XuY+o&!KpR!PJsw11pT24E3COaWv?I%BytjvBM)SjuU5BH=QY4P0{W)i_{_~o~MlwO(s!dN)Y6%}oE zT9>D>!(5OJ(&T*g>J=>`V?k1c5x0Nqm|*Irj#Srn)fCzRQ^{np4!+CQ?_63h zK8OxaZjVK;W*mqOW&MOsIW z2@t+5!jxQSPL`l-QB-ZhMezRadVe-$WN%dO)J3lxo~=kL7tp^h!A!IY@Dz!t4V8CO zy6Q_tG;)#DP(Xa?db=}*GyRZRgc=>%v)EN=@N8{mOyBSIfNv`#f4sf)aO|EQCrxCZ zw+fsV@Z6uPmjVr8)ottdqp4DZj?gF1S@!`=19RB>!>yRYwY37MUUt`AZBW=UAV5(W znY`YmjPLyv^^CXOj6<9$u^k|=`JXPYH8jSj!E_*{uD_pe;N=|&Jx9G*9=$90kxGnJ zBgn`u7x$Orqm{I@L%CC>e4?mY7A|V;H@>?juiA*m5>a2R|Im~UWOp<=UY0J&ZU;QK z{nVi1A#I31x5C@r@q5M6@oFtpWbrCz*zNu=fAt>+N5W#bMq3@Lk>-2iksgHaTu9gt zc=$zwof5DZJCC8K!H~!2FJI6^GGmzDeji6RKF6G6_dNZ}wlR>*`Ls2y{o>o+pK8pZ z{{9Z2=)jgNUQ8PIGri7bl72H-L?K}l<1e8~8740rm*81!G>;ieys^B|OC72t=iigV zYZYHw`Z&B1R-7ah>YZte}}XmxT=vnbHFzm!mxD z#eM(lRO5}4&EeF&g{B5_zvQ#+i3U7k;;CDpO;me(dut}Z$H|Cj=;=2SOW2t|HNWBd z_=3P$7(uc9S#d=z(&oZD%gg7C6@SVLMk=rgf?+`t7F?uwpwpOB$>Ev)AnA~fq|$mg z*DLZLOi6$I04)W+vm8!CxBdMMT|4QKT-@c!uqd}~3H{jA)YNE_bjLM<8W5GT6652M zfE<>Zk3GSZCgLo_5s@nzv2*;faJf6dP^sc+O8o0*u{kEOMUOT~x5mx1jqN)kqLnD5 zB#nl~f9p1ADtyb$^#OpqMNvgXMS>OHF*}E1->VL1;eVabpt6ltluJ^FDlTPM@Ik_=QWQd3Zwis>$98CA;$< zGsc{<<^3*oKDdPOuiMPF)uTSbouc5PIzwT$nGU(@k&UO(~o&?Hu|Kx7;2pjK+xG7rdV=PNwJP zeoL#$_sEfqZ08qkzHBPD?fFXOut7u?{dOsUr>F>_oD)W^Tr(>i=MNSv5&W7_xx?MyMopih9^2Hl$tuGMfQtO^Xecq znRGOn$A81SOf)lz74Q2$1b~dQ<$w1pG6EcfOb9kPE-vnyjdtRcJQI#&c84V~FgAS4 z&tE-S?bfdSK(3uci0GFOS9uK*NwD_A+A!J78jc{d&ZjdfdNwv3pYEuB*#gzq_4Lo5 zLkSYpr9{tmXvcP%RKtxR8gX1>l3z5%0|7;UHK$eoAioxIKE17>g^BI78UB~U!(vB$ znt>RR3tpSTmd^2iDNQ<&1eqs69cn<4k&!vwnNkspTa!3(Cw%myGAX4V8L=&n`gQPU zpf&!3XRx#vg$AZNlTP~{@`zj=-MM<*j>oqYjf#pgb}2-bOMGHQ%6{VUXg=pG1s_dQ zF$PwTe(y{ab@SMahnnjU4QB{*c6I(r`M|9AYvCDZ@MmG)0sJt@Pc1E?pCqWC6JT&Y zbPe5Pv95lrTDjAxpKwd5E8KVik&`MxjU-x(s{HnY zlM@FrqJI~IM6O!f!~`J_ZE7r<7X;vy3jjW8!WR}0xd^~Km-eUDUX+`Y(>b3dxV5gX zjs;G?h^UYFObh;L5s?ELoUT46c0H&er`G){=iuN#97juzV1;?tXea+(oosXKbx3=a zSUeIc_Qxj?T@0r@~kIsu$NS5%(0R?#Sb zwOKD7b_Y8_e+5b$?PCVzw699^>T#MyexTRMug&Uq8N`DR}bX7w+u0>Mmx21r&N(?BUC z`gn9f*Ih9{P%dq6V*n`~7y0M{I5m8cVBufgVPD6#KZ=V-+0`roOHtW)VVLSjiV)_#mczx zJsJ$5_T)cJW>{XEeT@EUSj-Vw)to=8oY_m1nwpx5iptOZ>Npo2rZC23Yc|u?nxY4UMMfg~g*-^HeZa28B_w>SR`;mk%|8-%b2yXOs#-Tq5OTwgdZst& zdY3rP<2J0>vCx|})U z`eb(O+x0|2+#D?V0`#8(rkrlPYFjNSoQ8*zAO8_MH?T2NO_vg;P95*Xxga+m; zS7kbY;adb;w*;aXUQ5UrH5Q1h}nX* znS*=H0B)TC%y(%Mu&V$ zsx3MR%Y<~P`h7{m))ENFgq{A@5V5Q9Vq22rv39V#AYidcHBNUWXJ#6)iHf!uN;y?9 z>&2KuI;s36KG{jE2Bhg}X+pFtEG6+C{e6AgU*Pa59`J*S7S?Y=Zg0J78ykgGN;GG2 z#lDfdEFkU_jDdu&1oU-SMW0+$1bxlJ?U@lE-p;&V-)r?H$HxA!1hP*SFgG9oDy|zy z3gxC<800X(nu=SR_Z~-ug;{H~S3xE+FKv4#aYS!F3q$upo@d+U=(N{22Q3|D9EHFF z(+cyGPAxNiO62)E?Bt-#Kt&|;A=af)%$eN+aHL7*szv7gk-ML9*MFs@-Rhie_jUvZ z1W%!$5O>SrcD~e1&rT&zV%~AevyNlGE_=illggq8%oKn0@y{PFISf*xp+yBe(cJU~ zwZhvKP!z^r5MX$Nx$cW7bYGCfqPJ03UvE&Nn)9m(0SSdxMq1hzsI`K?K7%a!aO>=< zsX6)eHy?UHx%RQA>t2C=(=l=0>(nFMh&6U6pR55+8ihd#HY-FC6+h*{0LQb=4R77D z1vSm|;r{+vLAz;o!WgJK(6G$1UY`~Dk#9Fvt+VCp6I2{Uu6_<=@ui}&W;IK5^F8Ka zXEW4d{+CR165TX+DpH?<+@EdUi@Y;c>g_cq_2&)Q4z z^Yd%}FnxqiN-8f;iw6i=a8_+3WMl($a(Li1D!Jp>CA_Iua6wx?HUn*w_& zFaKP7c1-(8sog3Fi8yoY+=rPbkK~<;&usaJ@1Xhec^rS6B{uSIv#HjlVFgS>xv~E& za2r6f^77Z;pfui~o}nQWaa`cxFr_$~E2$_Y^H{94T6=it@O0P5%jYfwu@@Imj zeBfBV%Dcf7?rUJ;xL^fJU3lJB70Aw%G9(3D$vk-(zTNNhk^jkw6MU7jW(nldfTSQ>ptgzxxNFO{ocbM?_wzM=vbvIcLP8iLJAn%K_@<} zn2t8Mk#Aw|(9k{Rr53(oOQHj&JvFmrkWOW>(Sz2TUHm@i%~~$Etrm2;8J$i+Amu6K zb$=@zBjSUvk}j~`>Fi*IJpDVm+6u6o$nKx&mxzdn#$2ST;3WT^c_O2rNaT;1 z0NonUp2?AFP8m;-5#oEz9Ba0PVSbmN;J z_K13q-pbXbBd+ARKaZ$>77-PD7JQ5P&(#EjQ3$!?iaIQ{S_3Oa8s?IfqT&Fg>lF%M z!X>i;1y%{}GWC3H=(|Q?0J!pVVPSH&gM}`jdtzHx|KY&5d70QZHHMF#-pKPH zurm@B5oKGmEug3|72&_oN+WXq)M8jaGn4FQ&A-j;@8f60+rUie0vPR0AjQ}10Q%I- z*VmUIru#WUIgm=t7!<#J9qQ@f%T_C#yzBQly#fd%M3vwzl(kH>K*cOc$Aou(FXHn3 z#v|%+!3yWX;;@^Qqw+oiM$kaZcQM&{a9>UXa?^AuUQN(Q(ViP_y+Nz<-Spi z%F<7fepV+}p3qru%77LAz>+B6KwRT84=5i=2ZzJ*3O)cEKK!h&&n5WKyT8Bx-}A$V z4|4yWfbKq^qo~e6sFzWdy8?0gCj3ODiiCFtL({0#-Q$J27$Zyd1_a z7@~dwQjdHOjME<;A`eZmm@av<#axQl{{NRZ4u5aoj?Rm!T>{-QJBzHY!bYCN0&wK2 zVe(KTO5QP^M!PbBV6|dGw)|cg_ge~cub*+1|L5!Efqe4;^H#6-9n;|V#I*nW^{`Wr zCQ$spYiVTTCAuqUThi4TCQB3(=$;26A3pVKhJDYWO1-0iwPblaUpv9ZU{zvm+iAow z*007c%8=puIx7V$E9;_Dy}ry>s_L+-iEAh&uktO^L_n71kY zNtJj9^fm(g{C8OzOsH*4y-svYM=dZdt*IX6^2iALvSdg zVSXUlsu5ryO8aT$u4hj$u{s(-&t-k(my!eJteS^s8?JJZMsZ+=#OuwuDblM4$miNz zM(ax=wweS@TIUqQDa&%9Tez2sCM4KOXo$puCbVWjl)NJ#qmxDB_2 zgalLLE$~PK`KmZhKKJp-@$m;3NoHD_cXvibiXweEv+WB@V3B6hv$$aoAKrAs#=^2I z9^0xgY;<=_&)Ygsb>#m;2J>daMN82rGn~Hwo%#qRaG4Y%j(St$Q;*G9-e4E-h)sCR z)j1Ng>DP@^sM)<;X$gSJ%F1$dOAK+SBKy}p(SjsGC9?_q#T@i#@uC_(ZmHEYrEw`i zl=%3oqrgVi1){o=lY^rQTv`!;KQq|(-_3d&fOn?pzb3R8?Rp{fib!l$i-06#75~|@ z9eM(cHulI|&X+%v7pHd43iN7Avm&v(c|}APqJ}s17RG=Z_3-@M0uK*w4r7c$`|H@& z((397>$=eOKyU9023A(!g5ex^de?Pok9u||=6H2%zL66n@*61V-oXK#g*@CF$l`X% zz@lrHrM>TcevCAqBrJpX+E(*9y-J3n(iiq+Z*A>qFadG-0n05gzUouqYOpl=I_l`? zP&O-YLqFcgIv#o+YJ*h*SJVU`3x1N$@pxaPo0kQ@J|M1`d+`VN(lxr>Un)?eF(g9o}ymo#jpG}?FC41 zu&^RC_#Csc4%k_A68{a5{$E?3vRp6H08v+I#c34om@rAL?uQXtpQp<4||IY?x$xR z>{v_KW0>KZ=a@gcNcG@ApY5$WhtYoFC$LkYb z;EXOqVzm2uFP+@smA8JACt(fpOWu50#%gZHNOs@NAyE{VvrNb4iR0GqBJp)VvsqLI zZ@}8*yh@r z)ltklYXLtTJI3f1Nt!Eku`l3sP{2w-To3zzZ?*0n`Mund?FEcjj9p&&Q5PTu4tpU0 z=`tTs)7}D`3o&4&aAcy%+JGz`1yngsaA2mlmq+2icHoLoe*4(o84lP_!HH6XXCMUH z<{R9&{r&y3f$=_|W0}wAX0MhKVfvO{^s5HbrqA8kl%DJEG_}{!$|K+#Sm!Wq^$P{_ zFpp~}3xXdy?2jtJgv~TmZj#5=d>Nn+_YK^%+)_ZXkhHElbpV^}`={SxVH=TT{7#(! z*_QnC>nzU9Jmpf-WA4K0s7u}{?lqHm^X7BR#D&yB(Fm2?ZvfGV{c!zCi|-!jV%OK! zxReVu?l+c~5!~D^rvB)sE2Cz;={Y$(yleu>=^UV#68NA;vTr&sP~C>kT-ADDu>Q%k z9#lVof-vReqr!6f)_?BS)y51_3oqX^4y&VZVg%cSnrB2NrU< zsltjwDblzARzGxS+QQngiGf`kNgVf^@TQ?Zqvzrvjw7R=UeL{Ki9q6B(7`-MM2Ts! zVSYq7@yTiGs8uI$ub`wV(nr62uBy>Wz+h@8;HIK791jzrLPPX~N;DtFhDG%t@5;~~ z0fXO_W?ZD=V_cgcE%l3j4n3kmSZc3emW^w)>=4Gli|B#__Jh_Q7>e39PXNaX7@ze9 ztI_ON0G{8=mS|43?evbluRmx5O2QjdWMqPuWWWKJ51`R|d0Z*`R8DGc?&>L2N^f=^ zVC?^6#_`?<>1!!~G$kTF*J8AI)nis%{fpm*8tUuM>=qjNK^O%|MG(0lJD`Z6Cd#|~ zl!>8m`1o-*F+IKM>TyO+3fSGb_W^#*isv%XRP5}y_4W0a+eKw_V1*^b8BnY5OEMzj z_;x@!7zE@UJoXfk;xRAMUv+7IIoQc081&(dr-&F1QJk$;P1{5*~v&-XCA~~n}iJ=Rz?g(q*QjDxC^Cz(p)|=Po{>KogqF$ z2b4KwYGPtF3ViGgkqaRSj&_dt0unSCtw>>Q?5bc+kf#HV`v5RVEO12NCdvn`t(m!d zdM+?kc_;8k^|1f*&10biO0{ZFP)GQ^qEt{FZ*t0L*AJ2y{RupRx9JV8M>Q#GI|(#Lo8{aSZ=LQHJARX0#i2m1N@JS_jE9l&3xFVs1{qk%X%@v%CzNqZN4 zZjoc((m^yv&I5>C>mOa&qE^h7@XQYV1yHvb9FOS6%%m3Q1CC zAPiW&4i=im0cmHh&pJg@#YYw`WtHswGU;6&HPrB?ihpBmZLP751rN5Q7s2c=1_O_* zHqFFo@9P6^Je-DTruY1t) z!X6`icchj3;Q>k1=REiR{*ipLXxMfo~yQUX3W6l%-4hIT3Mo>40`=vgl~_36-T0BVCZJ10!Tnil>q4NWl+mK zlg(V+5thFgdrR^#2|wfi7o?#TerB=+G0D?r7^CnqNCBwy7E$*fZ* z;ceVwx@J*NIX5UWhwTr$h>fT~<{b|JV*n|byOJym53j0P093nYgHHjE;<`4`7d;NM_48g^@~)>?Wi+c`wLrW$PN4)W=8X#iP z6NF#^RDEPhz`$n>Ujfe z9}gDpwgEkBmH)>;AWitkpwE?-dJMU+Cjp~FWDOxPXo;A0XFP3Sa zY>#iLm6M7`ef@BQO)igut3w*5&3x_!9WIG~J(EBLuJ0e(k(HLiKf@(yv|u1<|H1VV zBK#IWPoVahajb1_f(@89E3N<&5?o{iV9o^$beN>+L0|JMOay2yJLkZ(NX^Gb0D{=o?^=x9X>IK9b)Jx{5y z$@q-FTBpDh52x>neET*?Q;AHc*F}goK5MZ$a*hA{AJ( zWrBEB!VX!5a?}dl!KNF}#>U1m@NlaSz7M(5eHJC1s>#|=S2s7%)3a2fU;q0{a&oV; zo0|&viJ7J4iR;0_dyPU3Aym|mRKN|JADf$*VUYsDJ_u}C*1aJJnx57+v#@9%9eo14 zbwQx^0SYWfgDEk`_j)V;X%I~jGiAvnQ0tDM{-L2@;J5?<|6!pq42&{Vz+y!!_wQGM zRZ>qx9JlW`s57c%hldU_Ff<$-H!K_+wwgfO$>OH~0=(6*n&D(G*G@0)jQyv6fx9rL zA=nkW!2Bm%w-P9n^AXl0!OK~#x&Gzm59DIcfD!!VwS}**$ne-$Wg&ztRuqNiXQe*#vbUlBfidd2T2M`s;-F_2PSDw*}RfNB`QO7E05 zB0Tf=Cruso5N{DtNRX9P*>t`TsL{Z(|BAUEuM53|_thikdi@!I#w)eT42Ay!yJDr? z)zJQMV0mt6k8Y*a(D%fM4Sr$4X7n8`<}7Q{SWxP16XEb~$Im3Ou~F}WX!ISX2~oxgUDjo zSof>Kyq^a+>et~?4~Pm-iOU_B^GXCxDB6zgI8)7eLMURklq09xo;0f422Nm!JsLf(WNjn<@ z)YUA-q8o^clk_bwPj`DQjo%rtE>-zTtZ9Fk9ADxnLiF+aj0E3-g?Vu|6RfP6)N&W~ zz(z9e9Uu5-O9R#ktba7c`o;z{`HF?* zu{k(=S-U2Sb&d;(O@L>l30O;L2ikinvff@ECeEDTA^QW6*Wa9)nmXTN{xU5+eFBj4 z@gSSXv;nnI&#YrhG^kVUu#cnM7orvWIRVQ&<<;>@6Z{5Y7Zp}q;uB5s?5+sR;;h-Y ztTB}jfvof1Hz6uCqBqcPWfCA$2cL3TjUX3l=#Ck)o9ziY(dGf2e8MV)BAmlC8gQo5 zAlP+{RIb2E-TXUKQ+D6m%hS%zPP?6V?_cD!8HYYbM}Oh?b3`Z?4F=%z4_E!){)`{J zhk<<<1PK_XN2;vV^&8!v0RLB`dCXgdqKWq5VH{ATAe(9dN|gQ=(~P~H*1 zQD4Eu*-4`$2q-mIjoQ|F<1_abTOPDQE0X~W$u_TXkvYx#5-8W5`0wZ&b@=PuPq`*( zK81fMWmR@P5%!?4zYI~jFwRh!o9^v)SA0Ly{3|F)~bNV#p6fSt~w|Bc8l&emrT zrARNrSA>182|!Lr#nVGd?9jb8*Z~8QbKBrx)GN}cS}c@~D~`Giz>Wl?8rx-=7cF## z;V086BrO3rNrahH&Dq$b9x|!Pu){(_W6G2{Y>A*Bc;}yS210%PheZ=h<6vSW09j8s zl8f~K5%N;Agos6#1RycC>AvTQ@|BF?PAGnzoszP&c+din_=&Tr+<8DS*SsmzIQ~vp zlMgsHFqP8%{Gnf;{u8~G{-ilRUfoGqIohf>j?M#6J>w%>B}fiDf`YSnGB3dx7Sg{i zz%L-+nHr?&2qxXvy+kDvbiG7`lE~tX8($5BN0`*jM!D|76WewV4d?6$UANa$1eghQ z+96;SdjHQ<&8^pBxtCLYzF8kJK(n)-tImg;9{K7=h^&x`tV(qarEuX z(SL4`^Zlr2QTD)pZU)$fw-_&z@LI`XcP1T7=^!wbr399{g(!v%n2DYPd*T6@#9dW- z!EOHNiAnhR9gz;01l$jo5dJ{bwy3Z=_oII!i+@j#EJ%YTB0p)y=WmKetp>nQQq%Pl zIKnz$V(v~HlOCRcvsl`054s$(>huiU`3>)&xGn>Le^9iK=QE7})+v zm|qz&063Sn*bt5I2PYSC6M4-RL=@6t0``H4s;$RRz_tq|x7CR8`r&d1{$hgGGSzF@ zblBgI0^k8!1T`-&F%S|0mGc7|Qgi0LOKmaKQ#%&g8y)W?-Fj2qlHf5t>HEjGl1(s8F0ayZFHRMxI;r90S!?j*~F55{g zP?V=W0Iqa|sDs__DG)mSb?gl491wu$4|aUY&{--E-YtK3WYfd2C6d%k%0D0@Cw~k} zN*udJhJig};_)I#OND^|<0>fo{Z{JXTUsV#x_4oRhlgMOuB`kX1#1ytKo9~}tAFte zQppUwbUCL<;V*XhxqG#ml|*sme>)87VA8rV2Y?t*Kvz!na~uVwZ;OaN3e3M2WVUzy zu2~`w*u6S9+|$Fz%8dN~TKevIs^9njV}yhdl1<1sW;PiiE1|4oMfNIWkB&q_Hb-P+ z6SB8#*(C3bhCP#=y?)pE{J#CyBMwgY>%N}XbD16)(HWZGHW#Edqd>n`uI@SE$Fku1 zJUi5xmJkP|DSA2CHsw2w{1bkz?_+5vDIu{kz~*>~CfT|M3V6Sr;PYh0dy)q~04lL?OI=m3~Z&7iBn7%gkvN3|?& zXjS!OruAijfN4Wcv0f2o6w-|`7z_azYvE|V8eZ<^GpUOqG!H2`$kTSZ0cTF=7)Aqj z$@b^uBI?b5U;(RpX@CU)?7&E!!$F$-weeDeH?6+8`AfU~cg_x*=U}f7%Lv#a#R^;*rvvxh-!7j+y5 z8MzLqVt~E~rl-7UU*BWiBJzl~cW^pgU_wES1-}tmJC(*qi`?wvp>RgRUayazUpJuS zeVo>*`sbmf07*SY9jc4pzc+RhN@FgTL<5DwJ3YGUUfkFyT{2>4HV-k4;^=6tC-$jb z<`a;+Hb5Wz_R{=YCr|UhQWXLm`<5aT@hF>3nr3)T&%2>IHaSAI2D%~3U)BZCYx zRU$(yUTW)PZF&_OOw(=YraPBTo)62{yo^Rl_b6LEi+U$qnM+7WC}%_a`uo}*+6nZz z`0yDdq53?D@=JlAtxu+|1iW&avIdHXC(#L()1uK;!<0OfBcjd`@0Oz=?F1}yG&Lu` zsQXt}SC4j%c9)$1R?c4;+`jhRLDZNEMl!fr8BgGjsDZcb2SmloU>ZgDapkv^mTp2f zMiLR?rKi9CpS@q7(SBZt{)%iv45@$xeOHCkSM(stJKzzh=exVRC|F$}7gi3S8~cs; z!Km2pOXU3vt`9?~2hlZ_81(o3oUT`>>jbGzxUdajmAt2{T#nUpnPvSA8KxamK^1U( z^zh*hKd9L)KsI5^M?w*&i2roCsJI`a{kJbcDUN0T5ySUcxBA-ad`9kPaHAGN4)Q-N zNofIB^RgtvkTb%g?}(uuhMXDX$x^s^c_RjghHQYEEYdGRMc(W9v*$ZzCsF~5u`STz zCHWjJ+}1IoVb+tSD9oa+yRmK8?~hp$yjdkT)xK#@c#7~%@C977pm}UT6?*~6Zv-r0 zwqi)+-|7;DR|J3ST<0gi5>*MXar7#+_5(6vn$Jjx`M%nQ;ot<`9TXx>eUxppaz6tRN=&a3PHQPJ(kY4UbiktuQs8eFS3MS|CE3R22On2EP>=WF zlf?ISqM;)yme=5u|KcHdG?GEqOHI2~FDWA8{#@ClWcR?bS;qCBKvJHjk#&DsYB*!a z`ne2I=ft-XBmB_R7P~eEm0hZZjM|44)lv)|D3pFn{wh3mKxKqT&avoJUvb?@A^F6W+@%pA?_=zl|fWfzTta z7oah!=%a6w;ggm=>3|I?HH+(G%J=6BxGWu~CS}MqOiIdeEMG9b0y4muwD;%2iw@6~ z&xXC;V7s4$wx0#`;n7jR+VZlBjkPr^7>Hq`?dZU3Yiol^XO1-~nE$A3oE0Jvfw9IT3L-+x;3Gf}Hmi2fdoY@(Ig+DxEmhi!3{;j${F&ft(V_wxpX*yJ zR8DC>SvJJw>4VxNF-kvYR5emRXR#G6*UwM&V;?K-28km@Z}ux zf}XhsvsBIze)4Bj%9q1+Cnl<@s?eeak4Geo(i;Btc|Ur<9bJ5W*t4ms+24vi0&aWm zKX2VQ(s`DB3OqvEv~}S#(MUro@pZM&k4*L|SXt~*l7HT`yRcF3#N_AXAd`hGzmSAp zp+UOb@%;Plm;ZTEFe#p!DH+%LoPN|STy7*`B zSOt2im_(j04O|yPNr*kmLu}E$rif$b#$mZdbk~B$2wwpn1{O|Eg6V(*#sGM?GZ3fd zD$^rLkI3+(&|c>2a|SyMDawYfC)TVgmUJz1oo5_U*ZOJi54^dxdUW-?rA9XQa-sNu z_8Zkv~hyS|pMbuHp^hoFtKx1nbWpPn#7R>Wc&6z2)8VFg%M9OWR9QCX?ETt+ghI9QJwl(mt8F$V($)0hv%J0Q z1u7Cg8^pQ}j9hWS+4tYV!*WeyeBEQR%4T)gKp^$cN4@2LWg2-AlGB>&zYXX9D&dht zmNo{fHsA4IlU{hA_mi(;D3u~VH}6SQ(sc>WYr*W7Srz0}<6?-=AuCN5cuP#uoasj+ zDv3|l&?FBF-Rr(kCY;ifpm+g}MzgFHR-gzvZYY0@r9;p!=~p(cmLxA{Rv_ z;%TNJx{xs=ktkF99r)#bt4qHgUd~_L^F64jQ;qwlcK^QnwTP|{_6>sc2+JF)#H z=u#=H4zzMFnij=rU$;S}87B#|ECXOZa)6q$1T($E-ibQWz^nSgE9(UVoHscs|Bz;MwcPq=jsoTQ((%V6HF0aJ{Yb@TE{g4E2St*vdww^jFSo%1Sg_N0DBT_DyW0%x`XV$Th1 z_Yr_4&V<`KmET26qTB8E5OKgO`O3juD8ZGC2b6#OfgzO=(TMO)bTy$2JTDtfF%1j9 zh6B&7&7Y`}R8p|*u+=>MZ3ME3k3K$FEKUvCVsoy9v`6=&9#FP6p<{2V+|w^L zJ9Ek`t9X+FpPs=a>9*jEs8lal>vHvlc7Q=ZEQyD(#H-%F9}Idl)Zu`_EJ8;L>nMP4 zc2`f&bFxceLC%t1>91aO!~@OrF90G3*a8bBUEKsLpe^n|u#_2(JYn894$vt5RR)PI z6#Ub0Gf)t9K%efJK*JLk$l4`{0=KDb?Q+9k7JUia13;=`8Kl%Y@cC2$p6vn-vAwT% zQl2xu8r$&l9Jciwu(Wd^Q5C_^fELgXh)L>h>KV(2gBxv6gT zrvtFVpi1;3K=Oj;g%zR;u;MG)*lS4c7fw?qIg%Pv^1T(LbjT#4!t6T->&t=(*_tO6~Z=x>)Jv0vr= zW@9x1ir-4Z*miBSOnnuHylBLfUJLjHJD=x&)g9lb&eZ!p-`I8SBut*Zl}j==0Id z5Dx|dGUd7BFx(DmHJu)vwU{(p`Du%5X)hihpRvR%7(2X8YLGWC)BVx-AdP21Q9-0# zwt*-GXX46lij>8Bm(msv^q1+DRB*J^t8FBt!m0MwEMd-oKrvH}lvUO2`W<#H^Jn9A zcEnUSbN25FYl+RpOIITaCgX2)p!W`4w-($ezBwD8%9G>&sBw+}_cP$jUq_v=X&k@1 zpSQbM9|qP^=UIS*IsU;s7(YsDfUF#N5Dlbs#>4KLZ%V%XubiU9Fo1Zz~gmZ-j{L|<&R_Tpq+ zd>osR@ITt&P>l=L=IYGPc%kkfLWe!GVnyHo;Ov_y@+V2#!88*!uCi+ji;B8eiMAPZ z0S*i63<7@Wm&2p{2aJWItA8Ws=eTJi*03`0c5`zx=5;Qp_U?dV62UWFja{bz={)zN z#P~&Y&3yo#mvcDzc76v$8~t$Q!NYYG!chms4+}}Kopu#K6kHbD@c}#RHz;IC!gzj# zwv`H<7?(*jbL$n|x#^(G^0W%%wODHd5=m=zGq_#B16AQA$6M)ub%>-bWAsDZ75 zJhmyVh+WKK;+H`7*_D+y0KDzKJM4)VUr`?w0WAxha#+g>(y$BxUL#<3OT$XqJ%{tY z3|k4$!V*7GUc&<)E)FvrpO;B^^`#FKtFC4ZFeF3m3Vv^g({Vtb@gfY#1VC%bnR7lkzi0|F!|av z&aO>$xiI?*k^#1$1al8;BR43V4Sp<{ZVgrD4KAAq>Jvb29eg{RPAApDQ)Y95M zIvoNQW4hdH(<~I0>ej)*^~ey6Jd53LpcNU7Yn;%rQ1WC6M{);P^Jmd--~P=VU3H>( zU;3sP4vjS|;j>;%Qp)d|-~}V$5jjT6$o!&cowz&w@?jVDh3Lu2xB3e7S-1qn)YvH@ zz6C}MSQA*0$hR}QM|{qbw#oO$;OkE<023b@7l#X3O4ZzlUqvFJu1QA&oy6~4r2kXA zV{vWmXC;UssStXYhs*oxs=N2;p%AFlkmzbR2BGBuNOQjs{ok;h={m+*zgA*nbr>ry zbocapif9F~<^UqaTE=xQ7He>W7zdd_IiW8P0{OW4G^nV^5f4#A%vXl&hnCq}HKj1DvUish{dxIfdXA`5(Ox9;`_#k zNF=z)=ie7T;$tgv;lyLw*l_W5Z3F(lpUMaTtQ>=sJ5jD=2eXuW&kmZx_ORkaGCb%( zeg~S6`81wqAAYvl(^6d?1)YQ=Bk~$I2g46ZTNwup{(IkfX&T}rG`_KIW_c9RmQ(B7 zrS0K=rM@I<)GH4KK3d=YE0R!h>uKL+CM%j-LWl`aH|@*KJZK=&z%X4x_@CJ;{F;s&bpO2Km9C6_si-p}UDw*y%lK9;I<+cEqIS~&(fVVs zQ6Y|9f`M4-PGl>OnK>7Ju{Y`w8@M!#T%w_x!M7XJUuetkxr2@tQ2w&(t zT4Af6eK-}N(ADsH-vy*?FXxf0u1R=58-2aKoA!Ow)rsLg!=$IBIU8t;gDc1tCiD2S zA607DN@K7jLHKn~bItBmp62_F=|-VTrbDo}$or6q4T z>U7O-19J`snO#lzaJpLyF;Fz4k4NMa+Gj&y49O2g2rU7DLe9u&Y8Gq#bh9}bNRM8y zWvLFl(vMXQ21w@!`bcwm5v33b_^qsCkW|DJG&D98sQ+1in4xjA3C$K;R{nPD-xj0{ z6eC;ZW%!&_1}?7PGq)Aw7<0caziKTFbrVqeA() zEZi0G#|^qj?&cs0NFDtLgoV=QX~24n9x=0_GrA$}nW4md~0kjASja zkeI|m!NIFGM64=4##%v#>il$9YZ=^PjFAx$j*pE{%HW~6I~xqUN;h0{V)9|JXkR|8 zpCVPn{-Iaoy~?_T=TQbciA+$C3G3b~U7ipKutGErfGfD)U^yDG6A`CLu1N(`qHlVy zl^fQmC4BqhNIj89FD5OG^tHv#`sa7xl`X_qI0Rap5EQzVU-h@KWi%pAhJwR!}@&tw-U93b6|m5$97y`4UN{PNYF#H=Zw6*fVt%fp(e&f6}x z91g~Gf8dS?0BK#y814qJK>-^(=}h?NyAhBG1agd4+7k(q+BW3T0y}06#e!InH2i)u zOJ>LIDwT@npmH2!+ z8QCii9h69;CB4wnTwLLd#rnJPza<@G_vR-&J7h`pXJ(QeXKqyB1U%*Tnji|g^|BGK z*6=ZFP!1CZJ7*h;6^=~^y;{}_mp1eLo)EjkL&8^Z*=bYdu;Dy>6xTKz6Rm!Xo@{{9 z>B3cGz1acf*F{X}8yvI*bUicky(+hCGas802dF15A{{A=2;wg{Ma$LPzdl8LRb`^V z$w5$))i8&R3t*0yjT`5Bvbpxap6^Jp;v`@ zBsWrlayRRLdwa_8O9oiTiL}8q0P3ejThOIr;1(oi?~UDoAhGa#ea-=tAE1-YyM zE@39*u>uyPs^>l=tPJ~|PElW7M@fW_89bE@?KrwHA4wsaVIrOr4A_lACl1aXLZw$2 zeA7zz?qz{}2&))xMZaqL4SBsI8!!($?5a0!HlI9z7NwKO&(4DV6)=$tK!XG<8w}WZ z4r1ScLupv8_IsKsIpL6r_8aQs<{mMezc5n z1_}nV4jp)&(xs26LX0XgA2g&KC!-oDG3)2!mg@6J=ybpQ&Vb(N7KWby&hAppz+8>a ze>a#A_g{D$M_GhC1{t-fu% z8uTU8Uy4ZTd;27x@xJf+B#6#cMS8Uq$#JmMs3=4H&6az1oKJr%zC31m!M<)@xMH z6k~YHWq}Xw<{Vs{Dk(-0&TBvTjct!c;AcX2x6$DMO zEw2M$*=1ea9uWppUYeGg+Kq3J*K~$^>-nFbwWY!w9M*3lUucyo6n)=_jE)`#?6Wck za8(*SZHD*Q7C#o_$Bv*OVEmG=JJGc#_3rY1c?hP&7o_g`x40L)jsr%}mVhqe{vryp z_C45k^tDn%>^p%1Fon_#aI;2tD*|Rk7TJNb(h$=H%4uRO22=Cvi{EYRxha8u+$SLG zBxrLfIXLh@!d@Lf1GjOB{#D*k@+qtjuNFPn-@nT&>Ods`HCS|!*w)Swtnoo1dt`!f zs}{DQ;U|`s#!Jh~wqad!S!1$y*Xv#g-ela2BGtff2ZJES*RErN;m1KzhYLUZ&v{hYWpG^2A zJ$-lS$o#`7c&^g4eY&vfV?8}+;;*|)?NXl+qE)1^*w1Vg9TJP$GYWl|R?^%2T;)HX zGhY*CVf-nPNFo6N3DhA82hK`=eXOPvo4Mw+9&BK4bXWI!03DJO3TWmodB6Po9Lqh+T?%x3767VoJRvEady|WcOg#ghT*O!5D<6UIHQX-|=Vj)5FFz^*9fEL}Wze6S zkS!3rfW#s}?nC?duUTB-Y(%(t1QRtZNAX&+3gC<3qSs?p*1_f)lDpq|6qcmQ%E~S- zRgJN2#?nDBm4WV&rr;4k? z>|@tILba9uO0V#JKJVC+@{kf*UeR%#AAG;x!K%39;Tv$vk7)-ooItPMzQfI3c%@IM+JN#uhdncdA8)u8_NG-;JuCoz3oFxY z97o|N-;Utxz@EIvP@5uYrin}m0NQjJn)cZMQ+2omJ;1FIH(N26M^$VY5};3uT)l6qH8J#2+|&iPxx|sD4P(bJ*efDl=OL|OcBK_ zcfJAqn=tG^@4*P_%e954j#D;breO62B=rp$zkMX+;~MQ*^KTM=qb(62wEYHKTmUe2 zN}#1;vbdo25YsVR7V<(AiGYn*6(NrfQ$PJ#7VHH~Yz+;{rby4QAH(;IIvlxcySObN zJt#OpzqkekN}xuz0sEz+ue96#JwOTNZxcbIIf`|GqA!{`Y?6E$zB2r1vl32hFiOj_ zH!2;+R@PRjIjv8W}_=z1Zf&lb)5ZI2p#sckc{y@;P3yt9tvMv<{c@DEU+V96Kv+_Ba~I zZTeL_#Nq1UF=L80J9dr8!@&{8<-93Rj}uQ}PW*UqQ>b*Tp73hL0 zb-US>1@|XonTk)on9DCM^pd~7Pfio1PW(U#G5V|i5}V`J%xUUhr^bg{km>sc72q6q z?woxNC)xb-$2Zt|5-MijzTVWX|Anx^6QsHw;}UXqE@z{Q_VDmX1L6BN#yU+cZr};+ zlDd)64>rUw&&lWo$x_eO_dW@J($*v{7viYGCZ`K29+^v8%Fx5N`U66Ubdbi6A0yjb zGW1zmWZ|0JZ2C)F<_@$>(v2z9lfL`ReLz z^D{H(vVTzRl>QY$N#7Wv+I?^5UlD!=h#4&F))$_Yf#D1JzRsOEt*so)T?=$4a!BhR-N+i7ztaLstYcZ@_?=Y>tg+v@7(cfsF;;0|@AA63Pl=(1@$ zd#Cf2cG=atZBx&*oqm0pLmEN4$y1WDxg-&>RCW?_+S%A=AHc{Xtk-I+D(&(qOESV_ z7@9lVsW~aiSZ4|#dP#Bcxu;&A=$WJv#x#{$Z*yAAR{4&GvLtWT)OD}v>A5=}3*7X3 zD$)PM{`d>+El2u9xaoIR>LygO{W)uCLs1MrbWNq!+0T%ZRV4*}@S=^Pw#wVr7YpB<=rSz7 z$J7S9=^xg&*nhsLmEb*O((9?z4X$*)bQMkT!)Sf@qv}w&FD9IOnSMHdPGY*Mi6f!1 zefTrmaZGL3$z!7`!-`I+@=rbcr9_bzPU=GsHZHgyNax#1HHY|JWMC@UBqK28Z25ju zHj=z?qfr&-!>-NG4$e%Q(mA$2_g3kujg8dm423UL#h##pc1btDfZr$TaVTcdy!C`y zMp)sJvH8>w9|IT3pUtFKW{u@Tk}6$tPCJYx4h|Mm^kp>?hrdZ5AgK%Eoq4}L)Xl^! xXQfha(~mJw>#0od*BdNU{uA3cJ9&LUj|g#CXR1C>S4Y4fHRT6NpYECm{Xchb^p delta 28565 zcmYg&1yGe+)b^n}rKCl=r5iz|BqXJ~yQN>GJB1@HARyA+B_LhW-EjqJq~YIw-^@SX zaG1Gs84kGLz1Dhak-LMPxPx8UiHRT<+=Ut5g^AG6g^9>q4jokWIL1`{T#22d5YRaI zC5pw)zG$^`i{x2DXF>X6VztjZ+azsyzUG7F;gav6@9J%PP`tzq^X+_%)wXWp-uCu% zKzA6ya%L>-bULg1mDy!mB_PRq=B^|8;~) z3RvI3fDLWVm{Zy8zPK=@aMJ%TYXA2zWYVxX%m(Da9*h&3wLoVrmGcGs*%9IV%nZC z^aw1VL$UIGaq4}~b$>_iuyco?d`~3$Z;)G&C$Q!#M)+yc@j2C>rF+Z@yXhbPoUjkD z4+x6L3Ga)c2Yw=tFiAw(dAi!tAIlAYX3F$JIyzLc+S_i}$wVzFrBvzj4p(>mM9iXFI_+Vodm_nV;s*wcToiKvY>eH8u5OA^fr# zQ3eupqz}WP_(_N?WzCn)0UKnfr6(Ntt(+x-f{KbN0sTGDfg7}VQc;PxTL-?T^G5tq znB|_q%gg(Uj~vI(&rbl+`j~{3KuUEgz{$zU^JJqJOO4S~|6 z_yN8iW)SU6Q%g(B-PLBi3Wb2Z*Lzz0;~YrLn=V_-`}AvHJk6z*jwiP9d$e3ybki(2 z96l6;f@S*S$B#TOG3uj%WTqsi_G?R1cX#(DA^9Zz#jo;DdhsOhjw`jwbm1&f8%*@{ z2{o1@H+NIT>i1+}PxZ20o12U*hX60HXR9`h%qj5q+?QfzEVU@p(SGc@5>}a%o z`%{x~FPI~uFKc{WbHT{8KeOIh@prB}e|{GqdGLp*Mf&Ht{c8JtX^qubxy@qzAHl^2 zrw`Hb@kZ|JKTuXxB(BZp(s->%EX^VFgW_+4W4jp0$nr1giH016v)?8yb6y?@-!#a^ z|Im_=y)6+J&rtl#-PNX&Bk{GOf-76X|97kZ?cart`@ece2L}gS2tDnQ{c2YE*~;Hnj`byUxSS^w zOWxJpjT9Qp^48cEf}q9nr@=XJDyj)u1#j$<+pp|I*PTnt;-9OgWSi{~8N_iH3 zKg`!V$$D71aG#j$Kc|^?xuRz1+qzX*J2+@P>5V4+1FjLdUgjn?`8FQ(x8 z_p?;k-FrN|yt0Uaij21gbcqmiQgU*KzaG+4-YDC|%cVSvlUY{I*=JI}6r-!mei9&| z1|*%HUt@)JZ{vvtY=ks|oB7pon)UOqNs~;z;_Lq=i(>Clac7)aOx*$@{*xT&;C!y( zg9;YR0)qo|fWCUS-BIt`+uP@&q7*M)ym(hKy|>yS+3+TsWCfhzGL)K}JoyWEDAgB- zW_0~U_wCf(UN;G$)9PJ5Dy)1apHv^f!6=@oW*>*r~a5nj^AnI z`hG=+a=`g{=we&AicWEYovVvWVYy-3;HU6p`hhz2B4y3krw}hAn|j)2V!@ypivHl< z`g)hJ^ID)|UmVre-bDT^5BB6(+<-WTDbf!0BBMh;>LI zAWGg{h-Bn<0==njOJNvxlTPa!w+ospxPI>AB1CC*q`oz9*LWp znrM)?=iV{Fy?lMccel2-(#k|Q!pAdbav7!W$z>$sc}|*DOe2y@&^;0)IT2x8H2-6O95LFP*Kq${ur`uLk=~g~prYET1=0gnACBiKGOD`WV z$UO|9!U_spGsZ!q!2A1WkqIeK-1l#%H6I-af6z@LF)HQ6}68;MW$0*a-$VpbTo95cE@tyLj|X*Tt=gIlQ<$0k_k^5JHdz&`;%wT|<&?{_pK2`+ z{g;{&Ic>S;-W;u}s+vznM@I&`x;^Tc567d4^G;S}?&j_v9YyWt)>v=9zK|@#b8Yf- z*d5K1jEs#XrV{lW7Utv}-QFI8mjeI;ZL#Y&9!F?deTm^K5uEtBv~_!#V^vVNvQTT2 z97Y?lBJl9DFFQMXbh1bVt&3Q&T(iZHwwG8qLBBm%CcnU_)r&w96sqmBXU`0oKO5FW zP7VzXZG*}~m8HchqaoDF;!5aeE|;76DxX{r4qYW(z#-i#Uncfo!+z>pqA3J!I%BTf z%q8pYPBdt;T2R6vgGQ4#Ac6QsMpGi1bMJe={16x)HGukdH(? z(cuq0h?Gc_^Kr3_EibpB3{@it zq}B`_%-7I}`H}3ubZw-hhCfdjVmQQ1>*V!gFowBTrMMj~HE~f( z#Cp)nLAc>V>!)AUsy1b_7Wffi)Y{n!1q#cp-Zfp+qcj0m&lJ+Kiq@Q)^l`(h_1{Ly zZLyM|Ux{RKx?G=bllux;jb-1jP1Fc6CDAem(F(h!^~}#p9sFh`Zi)~lGAdAGa9pe( zVN?$8>U^uD)Y~17x4!s|01U8DR?Y8UpvQ+RXe(KTmN0U>T}NCoM}lfBTRgbS7@w%m z=5I19CKp#le>JO0;!(TW=sUbhwu^P~QWP!uJ7r~McbA#+yi9{;_v=G25vCg)7H7=* z6P}TR{|GBo%Gg-%4*#ZAMqY0}9|W+*)mBDYg$zw(1D3_wk#c#f7IWO0Bw=Wx3#8@S_;gzmtW@fg( zDj7K%+m7m;Ef@ZyQ}eUeXW)aWDP8l2qtWdXud+er-3`MwpNmxhFn-uiH~C%j94@zn zfBsBnZe^9<{aGwVPrFmx@mVyUBxJ>~ZU2fLU-M&lO{SYo)sctu%vqKM1Mt)NQ6 ziCRMuvT_~(Z;Q7V`?7l%KHw!DXqtcH&VvtNEF8e)3>bH;wW+Cwf2RcU|s_cs~+L{oQ+87RSYOni)kP?f8~ z*diWz=O*>8l_lqa=$@JG;-TSwMz-pGx|MwnS-8gLtJ>d3XpirD=_9#<27SdHLJTr5 zeoxzZ-`{vh?a!1EP*7lT&hljEt$xh}y`03lPIsxv4eeDpt`Z*^cJj*C%)i>T!@67I z-8Xc4uJR;h^Dtv`XUO_^oZuStEt0cqzn-5z>4b%!>Ipg(F19pnd!GK)a#(Ino8G@L z)*+FSlG=>mmu()1wKI*NJK^e&s z`9?LsyIKTZ|LU&+vc)XdK*%LxHN$bU7)27lVJCKv zAjpLFo>bPR$dkjC&u*pEvW-zG14YpK>V*kUF(M-3(y;QWg|==eXjh%B-e>Pt$M9BG zR-E13y1`g+0apTCy{`oYCId+fa~+T*Hfr$j%8hyS94iiEawI!zrNRbjS2J|5{$A!VEcXO zn-Mcv{uudwU;WUdn>T zr-x*%@xv_`aM3(~t*vLvseaE^;I(!2{1Fstow+CdZv`ur9Y5#Zm&W_V6uHj-NIu;1 zkA(hcvbSMq|NLa?*>Djr!S8E=nVhtj2ls1)OOg;f9pluonzqxB~UEOjVs!_HMLHjvwcD;IR7DgZ|+OH4f|A^38Sk}dLIaIDs)pK6g zdcsF=;g&NTe1*roE`I<={^Fu>yJS;55Qu3=D4uh4*Y|!-n z-Kr=pP?QFbCw|X=*DN^!B|ZM(a4AjFxDy5-RKqs-egqhRjXl*CL%O&$5|q%xH4}j9 zMRxyqJ;0T3Uw1`~&USJuUV7}$5Z4j?Fz4yA=JQEcWE}fZk3Iyi=oj+d;BLS66j;(1 zmv$(9)l*r~F*;Xmj*$x8T{E?pYbmw<=|ak!vaQ-bn2-6f$}%aaUZ!OiM=j2}T4zT} zNk#QbEBlemI>`OZ7l+;6`9Dcv0{H=c!vgW(#URkmi0d5Ae zO%!;2?|avK2CwcHu6ei~*w|1v`_09yQIX&6pN60> zUua?ID9-tfW(j^id8o4@KN3jOm+tWC=_qz!z5pfQ56Xw4&2tQFT#Q1qNd_%w$;`qao z@4b@Kz0OP{8L-p_)TVG)+jW`CsQq9CFobFB?vPaHZ2RSA51^!BISWw=2?+(hc*^a2sy+TGkk{k) z)VPHI&1;9H#tCMpnLKYx%boj^U{qNuA?KGyWE;5$&m@Lc0#3Iuwl}wxs|x*OejtT> zfY@g@h=EnNTnM7~qD6%SgElBbJskg|Er|vm=I1%^a8g4Eak< zU@&VZ14*WDntDXZ>72z{W$8+pyQDqy(DV{7) z*N^k{u`E=}pJ=VTSjrLi{dscko*$PZ=GJe(?woug?1~_TZyNRPL{Ty99lNJ*S_1UN zT&Mmu)_VMWurKLS#XO|zvI(%Fkmt!W`cmo;0W>DT$1o}N4u7+bj_Mw*rc#}KTUnBI zS=Xm=$DlQ*w*kHqjWh_5^+dbB?-?JOh{x{`My2#M0D#f4v3r1cjY9MW0~L?Db?tH$ zlGH6+hVFf0$X?_L_5HSj)j}b3%uYA)dIq1;p31#dX>!>2phZXQZhsIl%QB3onk_ep zculu*dd|`;U=!r?XVGfz*9_1CbjwKeIZ0icDF4mI6R$6ghHJ;KUY>fP+Ytvb7|EZ8 z2ZRtKf3!!SY4F-0^!GrQCq6gT`F6T_(x8(dbk+5dZ8Mv)PNZM;5dCL&6>*hNlL-9F zFGOCP#i~VyT93fv;8c&w3;5bEL^=eg2Bb+uRs`&@-kRfOxYRME?nZPlY$Syd@XtAktRbj8JA(xOGYK6pr!sh@QW7eJ|jL1G;H!h&Sj zy6J^dN%TULadj$d1sxAJSb|O~$fZC2Ztd*+B6=gmOoSL%`{^$(I7sl?Ezkb&u(j#f zvn^UQPG?TbbA~N9@`6^B2HlYl$wTz8Z<(|Sz03%nca@aedtzfmXGj&^o`(0C{04cV ziVclgLa1Z+@II@9+Ghc3RkicTeSrX=1-lgf!PkjZiB$o*Xu}tKoZS-`Irq^@Z8;?+ z`xaJKyEUO3{VI&f2B+ueF*04!@kj#$15&ni%_x{8R=t*%mi1hnQ3iWz_L zE$2JmMil-x&ZLq(g@J?PkB^V9MQS_8&bMFZKD&pBy}7bUeN6pMi?FyD`|8u+dKUH;!q7%197_<_OziN zp~oT+^^0)4?*8o+W|jYd&JGT-m+*O_+{;P6DBkP#zp!*?h8O(gei|r90!NMCFX}#y zSv68=U86~8o*_cJjRGEe>$9in>1$gjRG|^k(P%h7%daiVv@-IwN(jiwfBOM3;5Se# zltYhgHy`O_q?B7TMS+1o#&{ zJ^dOOAmjTN5s{G}mEZpj3^5_=-*&a;_txfp6di^#1)d6z(IqB)!jwhBU{w74l7$E} z%;fWTKBW)lWR_(dmjmD14bCqv%38cmHbhoOjE0ikPPIQO_8(gyrW&=d$P89wEl z_PsCHmk)915|xLMcK`Tc%gD$WhKzzT?Rrwei0|cNbtYEwO*`u^`MN>D^g^9oKBqzR zCv&_a=rvt&8<@n+hlhtAO>~Lel1x@`7NfQdR}FOercGIZYU7t$J~%~*XMX(nQR-}W z46hvMUzOpI$H)FfLG`^&ILmiZx?Q9OzC7@TmdD(#rfzId~{ zZy%2@JY~wh(7IpQ)BQbMwmVtRW&Ykn?LP$lzzF{#7AaR+LKW#z_qAX1mud_=GWI~tI^D^xhk`N zeeEF>i&U#SY)+Cf8ROs78ZZyiU=2-9e$wo*ANK9rx2g<5r?|q#C6$)HS7fpf?qPTS zt*TiAJDL55cg9Kd6Bc{pF)?e#+axKh&{yeaxC-(vH@=sSq!c0KQj@iB^wZvidv6{a zbR|xq$j+dD$T^K^Wo+zq3JEXh9osk^AnVqnpqS8A*tV zvQFcS1_l(U7lr_yJ>%4Ge94WClt0nG^IhYhESfYoGJ!6RqZc2b!Y?Z!Oi?O{^RTsz;N9s87$!mu6nIydCyoRB!%P_9!) zfXeOPKN&`3l~b0ZM;(ubcY71hm1``akr);h7M{qOx9Hn@Q+pP!-&JwD2x zx=-dwgZj%QWdy01SjOR72HpCdtAs&}XgqD`}%WxTsdK&kUlsr_vZ*#4;*=FSEKJsDHvIUq$QRD~<`Z?ihJt82xntgFr=h%`D67n`#R&7;*}MKD4-1?LZX5qs!`UAGvUOPe+lIK!t!r_ww9j#Kd>oyYE`eHEuwX`ln*+Uf|MdtE zf9~5Xm@Ro9?=ba^V5piMc#oD*k+J;C+VwGQf|l6NeD6Lp5k{f|;}JbnT85d(@*z6w zQV*lynB<4F##hbg-rGp?*5-wA!p_>pzyjm#JOp2@3KzJ^3L-CUsv23`OWMjiM^{%K zWWXqnoN9qXFHa7bvQ&m*A$^&a=%JEsA`qs@zy!*Qg@WFY)$5iRolLSS&Z|2L#E|K9sc~aAZ8jY&R z_~f6?fBt(KtGv7%XncrL_)t7K|L^y(FX&NdFp)B4QlhDTODxX#zM5JOP%fz{K{Nq3 zkj>998mQ-p97l$QXakvsW-NFtJ9L%HI&=P4sfa}+yPg3#-@w)13KTAJn7gC+999{c zZ?39}V9;0eCDF9VZB3XRR)F+rj)t65Q34tt!7y;)pN{3bQDb<8&mBn}j+$B<6 z%v-%alZ|IirTq*vPMFt~(fP)XGZt`;7((?bvHnNHeYo@fs8!P21i9^wH&$6V%tGY% zE4tCGR_I(iZ5I{VwT8uW*j;6sHH;(AtD4?l9$q&%t=7lf)XrAC^1l^yy%9y|9i$X{yYSWRGHk@asW*}hO>st&}c$)Ch0N# zVt@A014!NUF!zJG#8RV<2Zc}BtVJ5ix$l@^fk1U;`Nu}D$8%pP>|Z);>34XYm`3!P zepX}z2re2*y(sB24g}_L9HlT~dSU!0O=Y8w@3fG9iP?T`jZjV(TYP`Dv({z8)Ty(J z#KmM#Q@M`H^TdRN&TOH8ttb+?;ep;^dwyG+b9@2ZmrKPStChUE-4Pq_add_Dz2t1Y zTSRiMu8UBr4~i1yl;yi7o`*ZyA)L8yI)|D3=D}7c?L1cNi8lCWRb8B(o$YJVGYwT= zXhW%WX_E^~w*UPqm;e?0>esJdB54h!rKNEI%sYT$)3Zs{^5`EM`v6R~vnks;9E8^k zs=FMOaUxlnnPO}}y=E@SoNBZ-?HeUafD7FntEuZvaf#r{8@%U5u)&{txmPSJ?_Sv2e>dF6lLnmJP@;>P-IO04o(#t zW?g&Dnrf0O_(|yTVc}xy?3zZW4~q}YZ0GD6sPuKZ^~3$R7^;qg0|Pml71?59%+_8G z#?CI8$WpDQ(=5&NCIi)+R_Tlw`H#BCr;YQ~44+)TjPRR0#&b>9{Rdr@(VwU8#AReGP6O$8iGthsrK`F57AasH-N{TU$7f@bR#p}k zIIOYBwCK?c6;`uxgZyleiAe2Jyec`|=d+}PV$Z9m*w2F)*Upglrr62etJn_|UHmSy zn7#(ia2qhd)lVQVF>pOV21feb+J|9h(GLQA&~fMM8unNC$n7`3**vtgW=2oNWIa36 zYw~_@xU>Iy)Of8O(cp4;#5+S;b8j}m!&S`JL5Tcnk}ufyVcPr!*QVCR(W;Xms~YZ@*xEoLkgPRJZT3*P967JpMY;k%%;Vi zo16RfHQmQ9 zjy8R7N6#iNQ_W$Hb}EL0EzPGa>Tiv4YvJIqn*C3DNlUd#7&bOG=1{Om8e^%&Z^D70 zp#lwht4ACh*yAI25ed-msCI~-xvJ_lIEs(Ad^pMmCdf;7_gagnab4@Q_cQ>3a#M7k zSIaf&b86Wy2OpGTH@5gnF%#ytvaw&&3)@XB9WC=v8#3gTXIgl!DkGoT&x&11zN;0BbZYYV49@cTmCGyc;rgUfkzSqZVMo&K*J`lbS*^iXm#0t8&7 zlJgUAw~Nc8)gyxi$embe(gwKld`4)gv=NFaan5s^Es^e5pO<@j0pc+?{=&=iZHFeT zJ`29FR^{uiHXMv5qcnp`F?f3bl0dgWja_`qaB3&8FgG6;$%+Gj7>^$meEPOC8FhFt zSI3=Na#q$o>2U?)=K!{Kk`-y~2+SHwosNf!FLO+vpxpkqcC%&Idt;KGKJSSBJ2|*M zqY%G2R}%C1{prbASMCd#jHKrQaj7C@u-oBfJNKyJ)HdXa`&GC+T+NQK5gLu2YGkS%6_ zLjQ@n&6DHB<9tnbxKaE03!dTiU)f`rBsvulW%p->oFbKb7P2zoAUUazkZ_EexyxnH ztYHOgs20GZXIeoeLEqF0Fu^;=oS(ZdwfT|)w^QWnwC#}Mw=xY@BNY{T_tS-HpP5_= zQi@soX^+p}%1M#hKEClg;2q9xdL}9ScK|7PV4OmLb85nxZy#WhQE_njW;IK+2JY_e zn5pAs5sjTzS_hOrb4z6K&{_fuYx5nie zImNqPtJaR3qw$T*B_txuG)VL4IFMChv*gx0_Tuug*euxQ1@L}p&d$%VQDA6j;n@Je zUs6$0`jEsS`huWYIB1#qk8j*8iZelBQGSNQFLl6eKuf;_0r zp@F1$yQyyzZe2krG>^a-$N|UA$BtG6>paru6igZ0EplmE(m4CM?ySZVrGQddj%=qR zTcSGp=EH|evVWg=c=7-9siHDAD?myLkFGZyqs6lsV$?K;|Mphkn(>4qYxam^o+i}W z>-Vm!iL1p zra)deirWm|Lb8}WZPS?Fq%1tK`z|*4*PX%Y|9tE|ijF>#UNt23X{2ki3IE@Z$5~Zj z5AFYbuWzpzSWi+bR}`GvctW*VY7fvb)_7t52pY0d0=MF@fH&7W=i9JC1nZAM)52UZ z{g++8GojYOApoyb1si#=zF$9$<#tjy*j zyA{KV(i8~M-WU{X;09?XZ7XPOKnQ?xnBkyyV^hZqN{Wm7k38n9LrUgtbhZD?GXxm$ zHtdjK;FiMWlg=Aa-5iDTJls1Ur+kgt4n|{+}|fNDqVqK zK{bfec{wdN^Cy{nmSSd@`0a~{s}N_UwO~~dIJ7OoNKfA%8038{ZGw_NfewMsI^EcW zgak~k*6?syGAaC$uWB~k03cDoeljsJtyUG40uhdVNOw@DNI7dTbzUN7c} z-@UmMm?`>2HaET+`f&niuvIMNAjavE_m}>sTk@@4#*JY?=KaFN&#FO>b8`XAV-$?* z7B4`6Qd3Mz2p@?dKYxF!Y1<1_mA?gKpV;BC&RX?uC8W8dYAHdIS*t^p6JX}a7S}0uSZtF7TSMpx(G>BRaH4k z=i*~`Ym3z6WnBA%P#5TW9)r&?+ zqP9n^xFp9Nmfh%I)LQbJf|frOg7IWDJT&xvlv@#L&SYMVnWzs1QEK|fJ}EpUy1V{le0ECT~q7XSS!WUe$9sM{U_ zv4V;eUS?+WluE2g%dzaX<4F}s6s1YMu}S#^^*1*9X@*VzuYBsw+cNP*oNF&<{oxS z5xOx4eT4;XDQw~5;(q3}iu(%w6@;)xpqh`HbccD!$;o}wOPXUtzH zBZUc0-?e)NZkOg9Vd+vPUGCJ(7w#WdS)z|*uwg2koUy)ww-u-A%~?o!HQ@G-EUdnD0FOCk(Ax;QznGDHxO(*$*sG_6%mAbNl#~ZU}6gWU3Y4O@qKa zkbf&K>OhrA=O*l~ub=3F7)%oomzZ5J6TU#z!o^k*?`SFFtD-Nnak_Hsq6Q(oX|B|3MiJ)1r6$SYhK$Xy4|B0odzI3)u}v- z0Iw!}N7b|E=t0JBH`!6U=?Uc{bju8F`u1jiG~J%j+7l~MS&zP6*xnDCErW4(P(n?% z9vK2FPb|wn7Yry4UU@oSe*Z{4N+<8B8>e2Tn|1uV_Px%wy}0|{xC2wgPkiZT@qM|> zjzd2DS^iYaXiwMhAMXaXffYNO!DFGoCMu*lw{8kFTUzv>+TA5K{Gw=r^9JqIP_^P7 z@O(k6?0wCbplgsb3EkQ<2Z1bT1+kOkk5778v85`=c~y3S@RZrK91$^hZzNg9=S_Fq0z)B$;(Fyq$#e#zU^;pxR!u^gCF_&4FKG*R;5X3MfLGz<-ZgwJnkHk8m9rar!FHb4?6=pL4xq6b3_F)7Abs2 zJ)uZw>J56}zQvzSkJ$t$|DGKaPH}-KjRfilZhV2rjerVIyg+=4sPhh9dVxrR0XiK; zMoLN@34Htlkq==8j`A0g1!^&!;6VWSjg6Uq&jy$oc2y{;7JzvNfBVK<>$prFidd>> z#1Up<%uNPf?1(?V{C5` zdR?YmlwlC(#-Kp>8b%8rQmW)I^-RkIm%={c-2YK`bFo}rh zPJ+;gDhO(&ivhk7%W4atZ-z^gKJeU>&^pDc<3KXLyc|3>L?feB%lUbMmeMI~OiYn& zXlI9!ry&<$nI)jL4G}(h0!&bDhXp?O{TUoiPR`GOeBW;LMnhx3JAIcvkv_KTX*N<25S$|<2<`s?0t%_JaZvyw_zZGc?av!!#W#CbikSkcuD6T$DUTVGaWOcZy?0? zJpsIsT0RMcuz>uPc{mH=N{3+jn%X~`u&rA}Mnsq$8Nq?!laWOL4f0i)7B6VW&hGB? zW@cu&6V?ftnb;r~%_*O>_--xyj+}E?o&htB* zCSb1y5Xu!W^{Fw9TZpF*F6U&2*sDv89tm^-sLSxUI$js(jr{?-Oz3sqIa+LMz2)60_XYuRMXv`hSk4!Ai@8H0###EF3I#P z#1)d2z0&wkr1X7G3$wPrHCy)1&Q8?#+lUMLVutVNLOd!MDr>p#yw1*>`I@A=W`X{} z%z(iMYiw!B0Tmdq;~y%$4gxm7pA!=oFCcm&UhmUrs;;gsnxe@K)^MI6e(a2=m&Zp& zh{^*to?KGxor)?EdeBRdFS1uuRAfS;7`=p#Q6Z5-g*LD3c0Zhb`Dc2QtedtCm{$wF zs4_a3t)Ky;MX=tP``I(}y!PPW?tBpBUD!hFu4cy$gK+sj7=}LJdorLEGJjVGVU>u? zOv;)-WRQk^qY84Az*{EacURT0ucl z+d6U}%5sxogE&+ipVIyiw3cqeQ4JghxA?JL!K;mEE&z{>y?4My5YC4WABJi)<`@^J zx!r^)(UB34y;=`Iwmpy*-NfGB-n(#P3#OsZ33uYC1eXz5kAFFG#<&L3HGjDcEYv(2 z1=B`Yh*7JoZEf|`kUN7MJ_{gfS_pflo8IAo$>}UyCL}=kJ$-#gV*>+ElTuSrljs`~ z>E{>4d zEdHqD;j~d~Jd}$elU_PY!~j$4`8R?oht=Fy12DR`&k3S?1MsND&}$9lzRd1FBZ+na z5$yMga$A@%@>o4#s8AK41^|1ag#zw` ze9rfzD21FmL863)7RJ8q()m0jW zf~0)4Vj-~XyYVmX?Q*yzJO-ZE$43jcTFVjg4p1L`;0OO(xC;gy#@E}&C;J*yHH7+Z z(oh130U4CIeX<2=C!R+u4#OiO+fB{Qh3Sj9XLSPPu>xiKo-Qs;X^DwldQGkcFL-&A zcMlJn<3%a?w4sH$g_mlAf+<^sR5-z#Sn1J5&4-bdr=RdD^ zSVRR~4TMx>i#1qf@6RVycro8-=}737W$@W-z_YS&WMyT)P1`QDdOrcwLP|}IP%i1; zcLv;F%=!h9-+bZUv~EHRJ~liNHZOvtD){a$0}{ar<<1#i}x=d`oCdj=Yj-uyGatT%ax z!O1x}G_J0$)@_E8#$de3z|gUbTkZ_}0wyY`*hl+|y zNNA{3(In7@pMvt1NiX~W_UXc0JUpmQPWoun6B842kUnc9k$8`RoZMR?-B8R^%E0uNE+6DA6Jbp3VztF<09YhtdZs z%~lx2AAnuG0ww6sO~L2kF6w1UB6|fv|GM|>#ptxHH`p6@MmcuTiPiS>6i`!Bi^Aj< z1DCPR%z>3sKB&;J{@`1Znuh1ELezZ2308QDuwJJR*l-YvWIl z#uWfs@&#P`5%Db)`^L`?a6>Ji0=D}7o?;0F=L=?b;^)s1z%MZddX_Da5fD2!0hLD* zaPgpUGuA`a46^hRmCK*YU9a0)o&>+TSc}^lsO~j9ZPJhRuA|fgm(>2Xu)?*J4 zYK=8Vp;Kshc=(7I_%e4xED#XD9IgdG!NTVefH(K)@0vDIdCU?yctNzZB++l}k9E?s zCjC2y-)n(TH7*%8Dj=U&U`r7^^`F2GW?>N(^`(Q2Mm}K*1FB_;s~hCD|2Z`^th%<} zm%iSx#x>11*A4Wk=a_IULd$jY_;FUhtHA?rjG&jUuGJQ+BO@b+tJTCH2l5+8`~v`| z;Ie}=)ldE3M=f-T#jxzGU)eeY1y)Zm4=JRv%SVmBs^)s{T z0RSjn0u>{MMp8l?=)Q|L+IoZ5++?P&q@@)yIr&sr5MP4(UrGg^s&3}y<$VG++z`XN zrT*31$;O*n`}tqx#Ni-?38wY9ZQZ*PX!;t4y!c%c3Feob7MUS=A5wxv`lDH5F$w^m z8erq~w)tLunf#C2c8VEBi@9Ge{)`uqIqLTkh+lERz_{oEAnzFwCdb$h5J67({24un z7Vs=T&{n@AcefvQH-3(zLZ zcdfE05O*~O_W5;xe}5pT>WmBuGd^;sr`Ta<7S1D2c`dQ=I_IQ^wA#RJ;Q_0vDq zld#)adHELMmX#^b=mGUcLn3Dku@UtaNqj$Aw|3BM#7EC7gY7AhV4s`w==^hF-W!`0pWTmY+V z16<^=Bo5tBg(MEv2=pMY5vexpT+PD%JewP0w&3~ow#HS~gQ+2Y4{he^klVk|pT&A0 zi`dl%j4jC8Eswd8roEY2ep}>BE5c;<`$xghpf8$jOT>Oli)hZRO&8^L&8A+Z-7?p~ zGKC=dYNLx;KNz+pL|W_&fugXR?l4Ue@Gr}Xa{m$UEtcJ)%`O8nR4V{c9AqaA^!M+b zld!I_(d|Fn-~QWEfvs&oz0rV!gc_I*S@T)WmK!XZE&~VH1V$?+{B&PjyldUr*<)SW z&x+5qJquBSo<5{4;9dm0r!h|&*!)%bbe3B|K}6(!1EyBFS}_r5|Dd;$3D}dNVw1su zV*{?jCRm?L7%&HS6}+MVmNE>uyK=FEsl3J4wTFNh=?wm|z&oN)AZ0!0JXA-^CC&-YzAD4qMX10Fw8n&tjA$S-fg#hi zJTl?fUfImg?guIn{K$U=aPA|nuYW+O+YbH;$c-<69;15o_7h;~5K8TE-Byt1gm-^8 zt0E-;GU)j}2rrfaKn&J%5rHgZVqyYp9}EEg!@$q6`zNSaN1Kp!#()jJPWF0WrUnAi z-)~+$8-(420)U9l1p zS0+JKuf4py6y051{@Xh`il3U&pw1bSjV9s120;3;)`VM$1-}nDx z&#a6RvXac|gN!1wH`#lytPqNNtjw}^_DHfFk+Mg|F+#S4l8nskasHR@|L4`K6wX7> zeP8!=z1OoPQ@=g0%UM(~_vgcvIKnxcfMPmFBSO-*6gMKD>GPCcYj_|pPY7p}1-+pq z>MInrC4-vb2z5Zz;fWX%g;8IsWnDLJi@dzNOtDV7LgXTy z;pXP%!T%N;2z0bv03A=TyyU8=7_I>_fC#A3IH)5~$wHx9fHe*~+yR6N=j!A-C?YSi z($mFrCuZX;ePJ9W57?u;Dv96+V7L|MZED#Q57PKE-2lMQ=SrZv!Wg7~ld*an*K)qW zYk4?E3VX71Rsqn)@)ZyIM?))PWmkm6@o2O??~iafkUM(s7#i1{Yg+xwSRVH%r>Y8h z2#f45E>KDy%ykT8O5B4;0Z^-?fpW9~`h+@vsHX#NmE8`V2=IuCusZF>3`b3UZJ zv1j;bvhE%syWIyZ9PD1$GAL9+Psep78aUt4|E@t)LTFeR5i>LMy&1hT@UQ6WvC#+L zf~qgsk{a~OJ~ ze`q+179`OhGJFh^ZIhI*y-7*wTJaK3e(N~Kh+3a&>0u-%6yfE?m?V2-e=aIo!hj|c z4YwplP^e1-jJ(cT(4W_WUgUg=n*djq6KEaUo;`ae$&;UP*3{Hw4;&Rc3V&+Luz1{a zfBidx!-t8sG8AbDaiPUjOJjxY=Xcd?ff^qiv_HRoVqyn$;AprlYp^6HdG*UH;j64+ z323{_3+*iLJ_GY>6)*{<^7)pdPQq8{=sIT`o+dm$*tC4?U-4L6LZU)NNvY>EP}OIk zSJ;8WjRkiTPxE1}W`X}!C&Eyw!}FSd32hjLS)4ViaTwYKPf8K&Qq5)N zT8H!P#?sFE?>~Qh58+kbmX`8~NJzZVE!HVDDzg)2yihW}Y6y~Mn8&l8`1sUiC7--a z4BX{Rwr#dEOnx}zl1b-N61h+sUK`D+^uTg@sK%o1-zoNe1_F%NfhDxC&Y*yptgNgY zuZ3z*3G|XR?9RS37=om9?u&_W8~m%z0r2w+pzM{9n_-XR#iJJ0Fc^esNd3Yz8(8^* z02SOyg+17^9yH>*NPq&A;zj>$+t={<&=dLUO;ubW4?O^x@uv!-50Q^-aYK7-tm5O5 z`0gZL{U(nS(6xh};Ksl}!VC=~gt`*ZQckAzLoQ` z9)Hk-0rMJ*==`Uo+k?h8CXJZC3y44PtjpVQhfI}MPp{<|l|}o7@%(T>S-xylj8eZa zOGu^X&{O?r(UMw)63kP4V_!WCWDODY%TfQ;*Yy4L9myicbP11N ziovk)HemFXN6A9P69vJevz1j|^?9lZ4Da4eu)VS^Q>%mMo50(-p&31>EC)8)te^cO z6Ae$)|4W?Yxf`Rz_sU`*AX@Fif$rtkT->^8-o`aqjjDXAx8#G7w+W<&q)ZEwr6<*X z7b%JsVKDm?%c%r5c-=Z^Ob%eXXQ38Qth~G>f0Ox*U(~TBK2Y+t5Mq4ue5d~o&<^;T zg|Ww0xz|b>sQX5$(P*jjDe6XK-h0D)3IeFxeS?s5;0i*TtCKQ{R2{>0qd5&~>vvj@ ztK+voT92Rs&FR_N**P8?9E|Df?UezMFif@ZV}r~PM%mW8AVg>dX+`g=9(~Y;pz?PglOBVH$lhf-#lnSG6oj!5;(bTvYh|YZ&abtB}MMGml$p2tdU(_*u z42Y8#W8joFzY$48TU>d*)v!+GO?i)N#GfoDZN1IVW-&b7iu)0po*XFUR%o-hvRtci zdpmzt{t%!9iRN}?tcY?J4d37Y-jt4t;B)fxDlltZQZJBU*-lJMyhe2{esYH?uN<0^ zgf~RoDG3+wJWOlt_tvo2McwCG`rsUMd+gyc#X?1;iTVEBRDdP|<^hl0XQ%mKkEKi( z^ZZTrhL6d(Rukn*-cGC(pNNXRh@X3tj6aAK;B8RW25&SSM@xGC?$bcMsI;D&O0lBA z6GyNupE@gki3vqjF6?1sqQ3~e=!`g4@#0Fpm6}SeF}!p2M9MWlb@8N>&tFq(P@5p@ zkq(4i>_9;ngut`cIIL1qSSM}mVH4VN9=_Eb<#QPORpo&27^Y z#GSV$>BH7(=XvXgav(&3g02uHYyq5+chnN_fkS*4M$*+_MuHMDbf3$6qp|_$sh=s1 z{Cj|EZa<@|E60~+vNNnT&UKea(W1l~z`>@lQsG77c&C(5;mH#|nQ6_tMVzuvg~yA- zk-|ZZC%|HQ%P=YbWZ>P%shyyY%YAJ*o{tC9H5$xfH!bHHm{Z)S@qCF$bF>U`639~4 zsqsvak(0rO1ncZ)F@~E8YHew*$J`GStX3(vLxzL!JNYp@onzQb1=`E* zpbqK;vd4XIe?JVAgxbYkPoZ=E19r<$kf03$(7DP}p>vH#i(LjMG4XFM@SGu<+^VBa zA6yHW+n07m{yl5-Gc@5;I^yKw`V`S=^;O6;^+G@uc|jREo0jmsoTg@Mu8=xFb+zLB z{AKxK8aYWhJoGR@Ft2_qMvLFMv)@kBfmtKD$fa6pTvt9xs*_5PJ15M+fd^{;x)VsM z5d|PB1i(WM;PSL@EUhp7{w+_-MJq@Rd1h@;ODe58NrOPHko@=_Z^(!q|F*e7Wp6k+ zf?pBpBf6dbwVI9-!<32CIk$I|0(pY#{)?%hS1A;fKNX@TTv_==HSEF6_2ib^?7HK#hscjC@%gx z*FrAIH0>n;ZtEY2c@i-F;FKgPEKCQ0V~!&uh!=pm?*NJ}6Na5nz@~5n0s6SONA3)b z*E5(cW00Be->*SsIh>rFEbjQwFVNS183hlIYT z=5ha8Tnv2ch)D(efOlXnVTZ);~p!8Bt^^bt=A|1rkq->>ci=s zng)Vf|7cWxNxj%x93SRb+F%oqTo;ZbK;6-BmG{tQca^(t@ily~(4+omj2z=Pnv~b# z-M&(4t3R|;?Nt$(a@-u;gSp7j)Ty$j`vO0clHa$r-I&|a5V-q%ioM$Cj~CTfAypw4 zYQtv`F*Th^+H;Z5e4y*G?%hDBTaLWZ9J%NMBw}L1%CVJmo+XqFo=W~Wh}EodswA)fr9@IX8wz#JWf7(w>TXH=uOu(o!>OiDvA z?Xi9rv~<@&`}_BJdr@T>B$E-qdxDEYLl>Ph|*?SDI z=t@1%o?2kannr0ZHYns;RefwvyzwvUIYh38LW02}w#o2dZ*ClCtfk z{S7_{CBP0;3?La`5;j0GNYE?Xt}m6tSJp+u#O!N;;3GLUR#TXbE!PS97jr<6lOVeA zM@@~;xx))dMtL__4-R38)T0d*ZzL%*iFx3^94pa$6j!KS40NCK*(+-mu|kiLd4F>@cb$wKYSkH zbj-V(U6lLXpY`cqXvPMgb2z#AHu3a{Ms9KWUtXD#_gy|w*Y_?4iUbHdp&m$DbmQd@ z6185$k-uOeUp-s$FT?;XU4&_4)%teY zK*|!AxTxsNFLzN%TW0&)X*6&P*VO-On|C+5<2Y=Ch1*U`7@R93&*m@L>~4Sx=6F2R(dro)qT(WNrJ>|FV2 z3c;EWwt-7yh2u4s>Kt{3;gS~GpUFJE5~2yu3-u=JIWQKFI}ha%0MpLcpNQDezxk`e9saX;_(HXRI;q8Ny!<}9L%&$*$FD))FE5%%uGBcWz2Ejm| zymXr_f}jL7BM>q!lqJ6OjJU@yV(?!DaVSLR03c9T+Ie3`ht{ah^|ee?vRac7EXol8 zzn@rwmVQB>5$}H#&?m3uJl&Gf5odmGwGmJcfyCT9hI4q;LY^b22LsH_6<9SS?T>e`DLw1B(dq&W2^Z}g$3#$ii z#qJ$eCNje9(rp6w?JFlU#!8`B2!pxLYm#km+xR=AYmsD{;M+T;j%&PtPqIFCm)gJ`|tA)ye1T{;cxdv<)6b@j#r z)=bYW-KG0l2d#)-Gke#>Y%QzYG})Tv1g%8)ii>PLKY^L`E{&6iwXptOs>QKQNBX9oA+IzJcHxn7Vhbb7@Bc zTvul?fQXBOm;(i{q#IuiKCbj?G_%B6)ss~{1QM-*E zt1aM0BJCv)LwexG&3t>Ol|R_l-p-8kivJ%ox2`jo9BV=9Q}N1)APCnw0UAZ{XF>2R z0HcsUM=Y8BV>sC}xyObX(uvgI+oFac60{T{Iy|5?yd>;I`@suY9 zc>QUqN3fDm@<{-}g(2gCK+1VYTLWZ)_-LrA*62HoUZAAZ_&{%Hr^rc@2a8b|G6@J# zYt%+h&XKYjP#@Jo+DFZ`Ka0@z6ydhOeiZ!p>5~Y`qU0+srn>KXwm%I99A*Ebgv}?x zz5_#FV%pUutfkfnaf=|gV)-$1z@rVtdRIK+)u|69a?Vhw$)QP+2lj3KN3$D$^_o(p z|Fnb9>}0*C{SMp)YP~@Qz%2q`HvV3n1R4ooodr^&uBjxqSlm1h(ddGs0wfc}K`3b| zNB}aZvU+Lymql%4q8hO!Yf2LzWv?c+zdbjfzdZ_w94g;Ky$+U zX;c?UZEX2+%uoYmsx_CNM4mXGzssrC82NxRjE@OBk5uxwQdsP0w?4w+trtX9+AM3K zTE??QWKW}aa(x zWVByI-la?73#8m2RHWgQzTfv#y3WTfaQydCkmM>X{qE+oAXQeB9Mv3cdJYCJNtqys zwG#46I%C-$ctg~olu60x`iC&csr~#2km~{0$?8r}3I6;r_)uH>Cdl9ZfivlI&?l0Y zZ80$I*PkakZi9b@9n>BmQ*tv>K(2t5+Y1X|CNnUr5d4S-3lH!v3Gd}$TQ?Xx?NM>I z?tL}%hSpzR)f2T`XsM7Bc9^%{E$z^w2v9~;;V8v1sDa)>!b=NQf{0^^8lfo?_oS84!CRa1OvhrqBH#;#d$XuYp|E7xw zd2Jg~6h;Jzm`?bF3yzi&R%hm{RG?u=RkdZ@_8`lgx~{v~XxX3lPG_Vl1@!8-qEu_y zMNLgiVpCG=d6y(2X!wlma!2V9f+nMimp%@7b4+HY+DhPca5WJvZ?B{bHqB8&NOJoK zLacT944={No7>=`lGi>)Nd5N0kyU@U7>h%BxoAJXX8a{RPO^moJyRrK#^*vP#)->4 z27B!jGI1Y>6a-}3ud^OxKQ#$LO$_tamEgIZew0*`E0(>@)Yw5q8ubTJAfS}hrTIC1 z6z;|}T#lq#bEEUA;%x$VB&2CqXCBbMkf)ZF{-^(?N#r}YeXMMH2+Y=dg-N=cG`l>s>co_kKID{? zZg`28ipPUCH{H7caC$QCAQYt{w&Yu=z05`vQ3-JviiO%BaRWb`bg_;MAAPW`A;@4n zt>YXq5kQ|WrKxg-S$9RV0pC@jQ>={;z~ES730KEYe_(F73y`T1*be6>L;-w*$t z^V}9&4&pYe`D!B9^+G{^A&HI@TXG+F_f)lb8>!wNgdq|l%>%_)Z{QOZaB7o2V6IBD z!?6bCB&aX@;H^o-Ai^wo$l;_E5Ubu-ugF!zFe7uR^S^$1*#KIt4q|Aogr2q=G!gf; zXrbmnFNu5vDOgfES~-7+$pBQ7A}FvsOTJ+RT9|c=2EXcUcP)4YiC3+K5yt+r;g68W zC+p=U#7iF~twjqf9Qv_NPGD7YhGuGUO-aV2~z2xhVM>E@Hn;U zX;-h^WBQ*z$Gv@d+Dps4+mJ=9Uw#L!pDnK3Mpw zQOO`wT!SG&75bx1RSgXv^ekvvzC#N8cM!~chnoH!bPeC3ZCS1dPMZXHOtj05>vCG> zKfL7mF*bTcBGP+x<@cLw)wcheu^g0MN%6WdE! zfB3}Tyf-b>yh0(LcoWy=5}|e=$|#e9F@eM-g&(cT5RV@?jauP14#oKG%M2{x;Rg1X z$V6T=0z>&Fcp!qEhsSp8_JKoM?#S{$Q2|mwzC2yGu?NVk*zVtH{j~V_+a2=FMdLZ6 zPWxZFx|Yt3Nz>4+X299O#}VhDs~6P$=WA|oOY+ZNQ5*GK&*T3oHGmQ~kq^Ws3EKgM zQQkaC`_l-8QRdJq)_DYC51|DZg9KnE!#+Xr=-Yu^`n#$a??0}@HqzDv33Rgy%UP)Ne17f#Bcvi;r@5RMK$cBhafqvn& zd@y9m{<-5am6$W+utsqJ2`y-Q5ZCd8`5xV2^;qlCRgfMs;!N04+8Y>5>_An23w=lw zBnHo{BI6bNLQ$o_1Z4p~&#c*2{YQI+n1hPgtjdD!^#2xq<^$>OS3Vai!b>5DDIcal zQ~+pO@*t1}j4kX&wa$({d}T5xW!lA7gP9WgUE|{nkOTFUWX{cx%#q#*Ofz^y6tV#G zYZWRd>FZrd$JQx0gNPrp8W9HZMwYuQgSUly=H2I3eusjTVbW%ZU8&j}aG7o*N)`*C z$R;3BDWZ#l(>X0GjI*#@W`j5Lb*?+VOJr)M?~G%^3RzW2uY;ZP=#OtT8t7 zYc(kiA)>#v87(X->b}SIn<;!+2EEqwysnx88Nt1|c1F949J}(S3gEXCd=InSx1h3O zFj4%)u3#;y?ce#IGj?@ZSNlGH_jf@zZsbkt^ z%P{|u6S`D=;7w79&YW!s#WS}G=?#{vT$M`mAjaOSAS>4-Fj=>sA6d~p+$Nf|wzSb} z9AmSye^k9OgHS)2t;87*BM-cz#?gi$Q#TP{!pDup$LXJM|JdMmb%p@o>xW_DY~kt3uI5E=o3KT-UcJJCu&nz+5vPXv>SWYOXkG-+w;?%My|fYv zoQ}f6!v0KXDo?FDx%B;^z18G;`Z2;hWl-9+d`@w3j$})8_nqA0^oNG zkfY@yK?qR~hKH1RK;n{F#rQ+^I7NXt#Ws`)8}UN!y$k?RlrIZA>AZp`FMI&dj?AO} zgj|{mKc?$pxNM#`iX9kFC(7$e@vlDYzJG_%XAfer3;DYOZ8WoN0N#Uw_hwY-O%#YD z7WvT=k*|`a|_ zi(+Cl>cz@Fbbscoj67}@)zTft+hWW@iX4AmI9nY47j|Rn`B3p;0;=-!MwG^wPod;V zr5&!f?AHHCP7bv}T(`857bNpDsJ%{Gf(+}0N_2OZOv9i4o=#2^j7kM|6G95q`^28<%=lvH?_L$7F=M=d|MFo3%t*aIrF(zU zg_jnpi#UH}5%<&lT&H=x4!W zHK3-Ry#TG~033oLpq7JtJ8DqRfU<=LZdw~WPbK>=9~vZ37i!IvO{vG>Jr|fuW=*t0 z;Cju+Fk`5~gG{*YvQ)5;o&;#4oU8Sz(r!VlF(Ltg9R|#Cu14L<;Xy+3S9)91ymo%8 zWkZpU108%JH!1wS=q~Dpix*djO#zE;PpA$0MpS;{S7-Hsc9*XlyLiIh1RaU0I39EM6uj{2Wq}hK7}OE+3pU zpYZ9H`ofZMgowOwkD%v&xLh2)>dE*pRaDG zsXVPW%v4!eS!wy)@b4$R8Xm3YtgMIw6>i6e5l`Su>%7^Q zR8vzUhsx63E5csxi<>V=dThcNAgDD*%k=Q+g}9n33*64=!0C#`JR6PMyJK7H%s@Wxw#5H~GuK+KYG?27JO65Mh$PHOXr6>4492 z@^E%89dGVAWFafx9c!C58^K4kFlxiu1V?ceEAjZPcdC5J>92QYoS3^^Ykyn(U%8@? z8JF(KSNpF^1G;#)Bt9B$RIG97@!=B;8WX3@6$3gYiD+TQ-IZZqCp?_dUk%^=8HFwB z@5^mJY!q2QSoQdn0mi%HBR7wx5^l>; zOW#}j6OvJ5h;aae1}k$f1IhG%@(=l`P+^$o1>;TwD?(3=wc5Pqnx<4i<&Wvhq(ru-IvuSutLy&nlbV)2b(F;>@06)rn>jZ0rQBkr zT?^K%+`mG5rLIaeiXMEDrqLm8kFEuXt-WBA+A8-jG7pPXrQ4(*rpPF97+@bqBY8JV z++Ql;I}?jK4c6;-JQwsRr)x8&h_hv|mm58<>o)`ig4RIfyZz4Z`*prCJnu8;w)q-g zi<_&SKDD0B%b?rhqgyNue};8)*Xuy*Fxks}JC0vJJ$A~yt-(Ma>dWd(WxR?Lz&9x8 zcg6Qg1ShW%RU?0uV;I42sio36KSZb`7R|13$Ax!=rSbKVD_rkH?kUfLBwg3x+eQA| z47wNVZblne{sGb^1-LTZyt8p@aA2+8F`6eHotIT;)qD75zgTqO4!;}8V(F%5MY!ZI zm#woDdj4d-D)myq>Qi2spHgq)(Fw;$47si2gTlPepFUW}38yR`=avJ-5BwNvN=b q+~`o<^L4sI_)ql1HeH&>5~9MWa5$Ov;;T^brX;5>TP|Y}^#1@|$?<*w diff --git a/release/scripts/io/export_fbx.py b/release/scripts/io/export_fbx.py index ee92399287f..f0b20837e26 100644 --- a/release/scripts/io/export_fbx.py +++ b/release/scripts/io/export_fbx.py @@ -1504,17 +1504,14 @@ def write(filename, batch_objects = None, \ file.write('\n\t\tPolygonVertexIndex: ') i=-1 for f in me.faces: - fi = [v for v in f.verts] - # fi = [v_index for j, v_index in enumerate(f.verts) if v_index != 0 or j != 3] -# fi = [v.index for v in f] + fi = f.verts[:] - # flip the last index, odd but it looks like - # this is how fbx tells one face from another - fi[-1] = -(fi[-1]+1) + # last index XORd w. -1 indicates end of face + fi[-1] = fi[-1] ^ -1 fi = tuple(fi) + if i==-1: if len(fi) == 3: file.write('%i,%i,%i' % fi ) -# if len(f) == 3: file.write('%i,%i,%i' % fi ) else: file.write('%i,%i,%i,%i' % fi ) i=0 else: @@ -1522,10 +1519,26 @@ def write(filename, batch_objects = None, \ file.write('\n\t\t') i=0 if len(fi) == 3: file.write(',%i,%i,%i' % fi ) -# if len(f) == 3: file.write(',%i,%i,%i' % fi ) else: file.write(',%i,%i,%i,%i' % fi ) i+=1 + # write loose edges as faces. + for ed in me.edges: + if ed.loose: + ed_val = ed.verts[:] + ed_val = ed_val[0], ed_val[-1] ^ -1 + + if i==-1: + file.write('%i,%i' % ed_val) + i=0 + else: + if i==13: + file.write('\n\t\t') + i=0 + file.write(',%i,%i' % ed_val) + i+=1 + + file.write('\n\t\tEdges: ') i=-1 for ed in me.edges: @@ -2960,8 +2973,7 @@ Takes: {''') # --------------------------- Footer if world: m = world.mist - has_mist = m.enabled -# has_mist = world.mode & 1 + has_mist = m.use_mist mist_intense = m.intensity mist_start = m.start mist_end = m.depth diff --git a/release/scripts/io/import_anim_bvh.py b/release/scripts/io/import_anim_bvh.py index bab692f9daf..4a708d684c8 100644 --- a/release/scripts/io/import_anim_bvh.py +++ b/release/scripts/io/import_anim_bvh.py @@ -458,13 +458,11 @@ def bvh_node_dict2armature(context, bvh_nodes, ROT_MODE='XYZ', IMPORT_START_FRAM pose_bone = pose_bones[bone_name] pose_bone.rotation_mode = eul_order_lookup[tuple(bvh_node.rot_order)] - elif ROT_MODE == 'XYZ': - print(2) + elif ROT_MODE != 'QUATERNION': for pose_bone in pose_bones: - pose_bone.rotation_mode = 'XYZ' + pose_bone.rotation_mode = ROT_MODE else: # Quats default - print(3) pass context.scene.update() @@ -520,13 +518,13 @@ def bvh_node_dict2armature(context, bvh_nodes, ROT_MODE='XYZ', IMPORT_START_FRAM lx, ly, lz, rx, ry, rz = bvh_node.anim_data[frame_current + 1] if bvh_node.has_rot: - bone_rotation_matrix = Euler(rx, ry, rz).to_matrix().resize4x4() + bone_rotation_matrix = Euler((rx, ry, rz)).to_matrix().resize4x4() bone_rotation_matrix = bone_rest_matrix_inv * bone_rotation_matrix * bone_rest_matrix if ROT_MODE == 'QUATERNION': pose_bone.rotation_quaternion = bone_rotation_matrix.to_quat() else: - euler = bone_rotation_matrix.to_euler('XYZ', prev_euler[i]) # pose_bone.rotation_mode # TODO, XYZ default for now + euler = bone_rotation_matrix.to_euler(pose_bone.rotation_mode, prev_euler[i]) pose_bone.rotation_euler = euler prev_euler[i] = euler @@ -569,17 +567,17 @@ class BvhImporter(bpy.types.Operator): loop = BoolProperty(name="Loop", description="Loop the animation playback", default=False) rotate_mode = EnumProperty(items=( ('QUATERNION', "Quaternion", "Convert rotations to quaternions"), - # ('NATIVE', "Euler (Native)", "Use the rotation order defined in the BVH file"), + ('NATIVE', "Euler (Native)", "Use the rotation order defined in the BVH file"), ('XYZ', "Euler (XYZ)", "Convert rotations to euler XYZ"), - # ('XZY', "Euler (XZY)", "Convert rotations to euler XZY"), - # ('YXZ', "Euler (YXZ)", "Convert rotations to euler YXZ"), - # ('YZX', "Euler (YZX)", "Convert rotations to euler YZX"), - # ('ZXY', "Euler (ZXY)", "Convert rotations to euler ZXY"), - # ('ZYX', "Euler (ZYX)", "Convert rotations to euler ZYX")), + ('XZY', "Euler (XZY)", "Convert rotations to euler XZY"), + ('YXZ', "Euler (YXZ)", "Convert rotations to euler YXZ"), + ('YZX', "Euler (YZX)", "Convert rotations to euler YZX"), + ('ZXY', "Euler (ZXY)", "Convert rotations to euler ZXY"), + ('ZYX', "Euler (ZYX)", "Convert rotations to euler ZYX"), ), name="Rotation", description="Rotation conversion.", - default='QUATERNION') + default='NATIVE') def execute(self, context): # print("Selected: " + context.active_object.name) diff --git a/release/scripts/keyingsets/keyingsets_utils.py b/release/scripts/keyingsets/keyingsets_utils.py index 777f5f052e2..77b0f3ebacd 100644 --- a/release/scripts/keyingsets/keyingsets_utils.py +++ b/release/scripts/keyingsets/keyingsets_utils.py @@ -26,7 +26,7 @@ def RKS_POLL_selected_objects(ksi, context): def RKS_POLL_selected_bones(ksi, context): # we must be in Pose Mode, and there must be some bones selected if (context.active_object) and (context.active_object.mode == 'POSE'): - if context.active_pose_bone or len(context.select_pose_bones): + if context.active_pose_bone or len(context.selected_pose_bones): return True; # nothing selected diff --git a/release/scripts/modules/add_object_utils.py b/release/scripts/modules/add_object_utils.py new file mode 100644 index 00000000000..350191af807 --- /dev/null +++ b/release/scripts/modules/add_object_utils.py @@ -0,0 +1,82 @@ +# ##### BEGIN GPL LICENSE BLOCK ##### +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# ##### END GPL LICENSE BLOCK ##### + +# + +import bpy +import mathutils + +def add_object_align_init(context, operator): + + if operator and operator.properties.is_property_set("location") and operator.properties.is_property_set("rotation"): + location = mathutils.TranslationMatrix(mathutils.Vector(operator.properties.location)) + rotation = mathutils.Euler(operator.properties.rotation).to_matrix().resize4x4() + else: + # TODO, local view cursor! + location = mathutils.TranslationMatrix(context.scene.cursor_location) + + if context.user_preferences.edit.object_align == 'VIEW' and context.space_data.type == 'VIEW_3D': + rotation = context.space_data.region_3d.view_matrix.rotation_part().invert().resize4x4() + else: + rotation = mathutils.Matrix() + + # set the operator properties + if operator: + operator.properties.location = location.translation_part() + operator.properties.rotation = rotation.to_euler() + + return location * rotation + + +def add_object_data(context, obdata, operator=None): + + scene = context.scene + + # ugh, could be made nicer + for ob in scene.objects: + ob.selected = False + + obj_new = bpy.data.objects.new(obdata.name, obdata) + + base = scene.objects.link(obj_new) + base.selected = True + + if context.space_data and context.space_data.type == 'VIEW_3D': + base.layers_from_view(context.space_data) + + + obj_new.matrix = add_object_align_init(context, operator) + + obj_act = scene.objects.active + + if obj_act and obj_act.mode == 'EDIT' and obj_act.type == obj_new.type: + bpy.ops.object.mode_set(mode='OBJECT') + + obj_act.selected = True + scene.update() # apply location + #scene.objects.active = obj_new + + bpy.ops.object.join() # join into the active. + + bpy.ops.object.mode_set(mode='EDIT') + else: + scene.objects.active = obj_new + if context.user_preferences.edit.enter_edit_mode: + bpy.ops.object.mode_set(mode='EDIT') + + return base diff --git a/release/scripts/modules/bpy/__init__.py b/release/scripts/modules/bpy/__init__.py index f0025290f09..1e6db441599 100644 --- a/release/scripts/modules/bpy/__init__.py +++ b/release/scripts/modules/bpy/__init__.py @@ -43,17 +43,11 @@ def _main(): ## people need to explain how this is even a fix. # _sys.path[:] = filter(None, _sys.path) - # a bit nasty but this prevents help() and input() from locking blender - # Ideally we could have some way for the console to replace sys.stdin but - # python would lock blender while waiting for a return value, not easy :| - - if not app.debug: - _sys.stdin = None - # because of how the console works. we need our own help() pager func. # replace the bold function because it adds crazy chars import pydoc pydoc.getpager = lambda: pydoc.plainpager + pydoc.Helper.getline = lambda self, prompt: None pydoc.TextDoc.bold = lambda self, text: text diff --git a/release/scripts/modules/bpy_types.py b/release/scripts/modules/bpy_types.py index edead35dafe..28a30c232a9 100644 --- a/release/scripts/modules/bpy_types.py +++ b/release/scripts/modules/bpy_types.py @@ -38,6 +38,16 @@ class Context(StructRNA): return new_context +class Group(bpy_types.ID): + __slots__ = () + + @property + def users_dupli_object(self): + """The dupli group this group is used in, XXX, TODO, WHY DOESNT THIS WORK???""" + import bpy + return tuple(obj for obj in bpy.data.objects if self == obj.dupli_object) + + class Object(bpy_types.ID): __slots__ = () @@ -48,18 +58,16 @@ class Object(bpy_types.ID): return tuple(child for child in bpy.data.objects if child.parent == self) @property - def group_users(self): + def users_group(self): """The groups this object is in""" import bpy - name = self.name - return tuple(group for group in bpy.data.groups if name in group.objects) + return tuple(group for group in bpy.data.groups if self in group.objects[:]) @property - def scene_users(self): + def users_scene(self): """The scenes this object is in""" import bpy - name = self.name - return tuple(scene for scene in bpy.data.scenes if name in scene.objects) + return tuple(scene for scene in bpy.data.scenes if self in scene.objects[:]) class _GenericBone: @@ -303,7 +311,7 @@ class Mesh(bpy_types.ID): edge_face_count_dict = self.edge_face_count_dict return [edge_face_count_dict.get(ed.key, 0) for ed in self.edges] - def edge_loops(self, faces=None, seams=()): + def edge_loops_from_faces(self, faces=None, seams=()): """ Edge loops defined by faces @@ -314,7 +322,7 @@ class Mesh(bpy_types.ID): return a list of edge key lists [ [(0,1), (4, 8), (3,8)], ...] - optionaly, seams are edge keys that will be removed + return a list of edge vertex index lists """ OTHER_INDEX = 2, 3, 0, 1 # opposite face index @@ -379,6 +387,71 @@ class Mesh(bpy_types.ID): return edge_loops + def edge_loops_from_edges(self, edges=None): + """ + Edge loops defined by edges + + Takes me.edges or a list of edges and returns the edge loops + + return a list of vertex indices. + [ [1, 6, 7, 2], ...] + + closed loops have matching start and end values. + """ + line_polys = [] + + # Get edges not used by a face + if edges is None: + edges = self.edges + + if not hasattr(edges, "pop"): + edges = edges[:] + + edge_dict= dict((ed.key, ed) for ed in self.edges if ed.selected) + + while edges: + current_edge= edges.pop() + vert_end, vert_start = current_edge.verts[:] + line_poly = [vert_start, vert_end] + + ok = True + while ok: + ok = False + #for i, ed in enumerate(edges): + i = len(edges) + while i: + i -= 1 + ed = edges[i] + v1, v2 = ed.verts + if v1 == vert_end: + line_poly.append(v2) + vert_end = line_poly[-1] + ok = 1 + del edges[i] + #break + elif v2 == vert_end: + line_poly.append(v1) + vert_end = line_poly[-1] + ok = 1 + del edges[i] + #break + elif v1 == vert_start: + line_poly.insert(0, v2) + vert_start = line_poly[0] + ok = 1 + del edges[i] + #break + elif v2 == vert_start: + line_poly.insert(0, v1) + vert_start = line_poly[0] + ok = 1 + del edges[i] + #break + line_polys.append(line_poly) + + return line_polys + + class MeshEdge(StructRNA): __slots__ = () diff --git a/release/scripts/op/add_mesh_torus.py b/release/scripts/op/add_mesh_torus.py index f9ca0f60468..16bf4e1c92c 100644 --- a/release/scripts/op/add_mesh_torus.py +++ b/release/scripts/op/add_mesh_torus.py @@ -102,6 +102,10 @@ class AddTorus(bpy.types.Operator): description="Total Interior Radius of the torus", default=0.5, min=0.01, max=100.0) + # generic transform props + location = FloatVectorProperty(name="Location") + rotation = FloatVectorProperty(name="Rotation") + def execute(self, context): props = self.properties @@ -120,36 +124,10 @@ class AddTorus(bpy.types.Operator): mesh.add_geometry(int(len(verts_loc) / 3), 0, int(len(faces) / 4)) mesh.verts.foreach_set("co", verts_loc) mesh.faces.foreach_set("verts_raw", faces) - - scene = context.scene - - # ugh - for ob in scene.objects: - ob.selected = False - mesh.update() - ob_new = bpy.data.objects.new("Torus", mesh) - scene.objects.link(ob_new) - ob_new.selected = True - ob_new.location = scene.cursor_location - - obj_act = scene.objects.active - - if obj_act and obj_act.mode == 'EDIT': - bpy.ops.object.mode_set(mode='OBJECT') - - obj_act.selected = True - scene.update() # apply location - #scene.objects.active = ob_new - - bpy.ops.object.join() # join into the active. - - bpy.ops.object.mode_set(mode='EDIT') - else: - scene.objects.active = ob_new - if context.user_preferences.edit.enter_edit_mode: - bpy.ops.object.mode_set(mode='EDIT') + import add_object_utils + add_object_utils.add_object_data(context, mesh, operator=self) return {'FINISHED'} diff --git a/release/scripts/op/console_python.py b/release/scripts/op/console_python.py index 87abe0b6f47..1f0d9dbde60 100644 --- a/release/scripts/op/console_python.py +++ b/release/scripts/op/console_python.py @@ -85,7 +85,7 @@ def execute(context): sc = context.space_data try: - line = sc.history[-1].line + line_object = sc.history[-1] except: return {'CANCELLED'} @@ -102,13 +102,26 @@ def execute(context): sys.stdout = stdout sys.stderr = stderr - # run the console - if not line.strip(): - line_exec = '\n' # executes a multiline statement - else: - line_exec = line + # dont allow the stdin to be used, can lock blender. + stdin_backup = sys.stdin + sys.stdin = None - is_multiline = console.push(line_exec) + # incase exception happens + line = "" # incase of encodingf error + is_multiline = False + + try: + line = line_object.line + + # run the console, "\n" executes a multiline statement + line_exec = line if line.strip() else "\n" + + is_multiline = console.push(line_exec) + except: + # unlikely, but this can happen with unicode errors for example. + import traceback + stderr.write(traceback.format_exc()) + stdout.seek(0) stderr.seek(0) @@ -144,6 +157,9 @@ def execute(context): if output_err: add_scrollback(output_err, 'ERROR') + # restore the stdin + sys.stdin = stdin_backup + return {'FINISHED'} @@ -154,23 +170,37 @@ def autocomplete(context): console = get_console(hash(context.region))[0] - current_line = sc.history[-1] - line = current_line.line - if not console: return {'CANCELLED'} if sc.console_type != 'PYTHON': return {'CANCELLED'} - # This function isnt aware of the text editor or being an operator - # just does the autocomp then copy its results back - current_line.line, current_line.current_character, scrollback = \ - intellisense.expand( - line=current_line.line, - cursor=current_line.current_character, - namespace=console.locals, - private=bpy.app.debug) + # dont allow the stdin to be used, can lock blender. + # note: unlikely stdin would be used for autocomp. but its possible. + stdin_backup = sys.stdin + sys.stdin = None + + scrollback = "" + scrollback_error = "" + + try: + current_line = sc.history[-1] + line = current_line.line + + # This function isnt aware of the text editor or being an operator + # just does the autocomp then copy its results back + current_line.line, current_line.current_character, scrollback = \ + intellisense.expand( + line=current_line.line, + cursor=current_line.current_character, + namespace=console.locals, + private=bpy.app.debug) + except: + # unlikely, but this can happen with unicode errors for example. + # or if the api attribute access its self causes an error. + import traceback + scrollback_error = traceback.format_exc() # Separate automplete output by command prompts if scrollback != '': @@ -182,6 +212,12 @@ def autocomplete(context): if scrollback: add_scrollback(scrollback, 'INFO') + if scrollback_error: + add_scrollback(scrollback_error, 'ERROR') + + # restore the stdin + sys.stdin = stdin_backup + context.area.tag_redraw() return {'FINISHED'} diff --git a/release/scripts/op/object.py b/release/scripts/op/object.py index 8a11ef7aaf6..a6e0930e69c 100644 --- a/release/scripts/op/object.py +++ b/release/scripts/op/object.py @@ -507,6 +507,26 @@ class MakeDupliFace(bpy.types.Operator): return {'FINISHED'} +class IsolateTypeRender(bpy.types.Operator): + '''Select object matching a naming pattern''' + bl_idname = "object.isolate_type_render" + bl_label = "Isolate Render Selection" + bl_options = {'REGISTER', 'UNDO'} + + def execute(self, context): + act_type = context.object.type + + for obj in context.visible_objects: + + if obj.selected: + obj.restrict_render = False + else: + if obj.type == act_type: + obj.restrict_render = True + + return {'FINISHED'} + + classes = [ SelectPattern, SelectCamera, @@ -514,6 +534,7 @@ classes = [ SubdivisionSet, ShapeTransfer, JoinUVs, + IsolateTypeRender, MakeDupliFace] diff --git a/release/scripts/op/sequencer.py b/release/scripts/op/sequencer.py index 8715f7eeec5..48f83613147 100644 --- a/release/scripts/op/sequencer.py +++ b/release/scripts/op/sequencer.py @@ -94,11 +94,14 @@ class SequencerCutMulticam(bpy.types.Operator): s = context.scene.sequence_editor.active_strip + if s.multicam_source == camera: + return {'FINISHED'} + if not s.selected: s.selected = True cfra = context.scene.frame_current - bpy.ops.sequencer.cut(frame=cfra, type='HARD', side='RIGHT') + bpy.ops.sequencer.cut(frame=cfra, type='SOFT', side='RIGHT') for s in context.scene.sequence_editor.sequences_all: if s.selected and s.type == 'MULTICAM' and s.frame_final_start <= cfra and cfra < s.frame_final_end: context.scene.sequence_editor.active_strip = s @@ -135,7 +138,6 @@ def register(): register(SequencerCutMulticam) register(SequencerDeinterlaceSelectedMovies) - def unregister(): unregister = bpy.types.unregister @@ -143,5 +145,7 @@ def unregister(): unregister(SequencerCutMulticam) unregister(SequencerDeinterlaceSelectedMovies) + + if __name__ == "__main__": register() diff --git a/release/scripts/op/uv.py b/release/scripts/op/uv.py index f22db9d87a8..ad25553a41c 100644 --- a/release/scripts/op/uv.py +++ b/release/scripts/op/uv.py @@ -167,18 +167,34 @@ class ExportUVLayout(bpy.types.Operator): fw('1 setlinewidth\n') fw('1 setlinejoin\n') fw('1 setlinecap\n') + fw('/DRAW {') + # can remove from here to next comment to disable filling, aparently alpha is not supported + fw('gsave\n') + fw('0.7 setgray\n') + fw('fill\n') + fw('grestore\n') + fw('0 setgray\n') + # remove to here + fw('stroke\n') + fw('} def\n') fw('newpath\n') - + + firstline = True for i, uvs in self._face_uv_iter(context): for j, uv in enumerate(uvs): x, y = uv[0], uv[1] if j == 0: + if not firstline: + fw('closepath\n') + fw('DRAW\n') + fw('newpath\n') + firstline = False fw('%.5f %.5f moveto\n' % (x * image_width, y * image_height)) else: fw('%.5f %.5f lineto\n' % (x * image_width, y * image_height)) fw('closepath\n') - fw('stroke\n') + fw('DRAW\n') fw('showpage\n') fw('%%EOF\n') @@ -203,7 +219,7 @@ def register(): bpy.types.IMAGE_MT_uvs.append(menu_func) -def unreguster(): +def unregister(): bpy.types.unregister(ExportUVLayout) bpy.types.IMAGE_MT_uvs.remove(menu_func) diff --git a/release/scripts/op/uvcalc_follow_active.py b/release/scripts/op/uvcalc_follow_active.py index c8a13441048..81229f73461 100644 --- a/release/scripts/op/uvcalc_follow_active.py +++ b/release/scripts/op/uvcalc_follow_active.py @@ -180,7 +180,7 @@ def extend(obj, operator, EXTEND_MODE): #SEAM = me.edges.seam if EXTEND_MODE == 'LENGTH': - edge_loops = me.edge_loops(face_sel, [ed.key for ed in me.edges if ed.seam]) + edge_loops = me.edge_loops_from_faces(face_sel, [ed.key for ed in me.edges if ed.seam]) me_verts = me.verts for loop in edge_loops: looplen = [0.0] diff --git a/release/scripts/op/wm.py b/release/scripts/op/wm.py index af72c96a412..0d204ce72ae 100644 --- a/release/scripts/op/wm.py +++ b/release/scripts/op/wm.py @@ -418,7 +418,7 @@ class WM_OT_context_modal_mouse(bpy.types.Operator): class WM_OT_url_open(bpy.types.Operator): - "Open the Blender Wiki in the Webbrowser" + "Open a website in the Webbrowser" bl_idname = "wm.url_open" bl_label = "" diff --git a/release/scripts/templates/operator_modal_view3d.py b/release/scripts/templates/operator_modal_view3d.py new file mode 100644 index 00000000000..afe179376ed --- /dev/null +++ b/release/scripts/templates/operator_modal_view3d.py @@ -0,0 +1,55 @@ +from mathutils import Vector +from bpy.props import FloatVectorProperty + +class ViewOperator(bpy.types.Operator): + '''Translate the view using mouse events.''' + bl_idname = "view3d.modal_operator" + bl_label = "Simple View Operator" + + offset = FloatVectorProperty(name="Offset", size=3) + + + def execute(self, context): + v3d = context.space_data + rv3d = v3d.region_3d + + rv3d.view_location = self._initial_location + Vector(self.properties.offset) + + def modal(self, context, event): + v3d = context.space_data + rv3d = v3d.region_3d + + if event.type == 'MOUSEMOVE': + self.properties.offset = (self._initial_mouse - Vector((event.mouse_x, event.mouse_y, 0.0))) * 0.02 + self.execute(context) + + elif event.type == 'LEFTMOUSE': + return {'FINISHED'} + + elif event.type in ('RIGHTMOUSE', 'ESC'): + rv3d.view_location = self._initial_location + return {'CANCELLED'} + + return {'RUNNING_MODAL'} + + def invoke(self, context, event): + + if context.space_data.type == 'VIEW_3D': + v3d = context.space_data + rv3d = v3d.region_3d + + context.manager.add_modal_handler(self) + + if rv3d.view_perspective == 'CAMERA': + rv3d.view_perspective = 'PERSP' + + self._initial_mouse = Vector((event.mouse_x, event.mouse_y, 0.0)) + self._initial_location = rv3d.view_location.copy() + + return {'RUNNING_MODAL'} + else: + self.report({'WARNING'}, "Active space must be a View3d") + return {'CANCELLED'} + + +bpy.types.register(ViewOperator) diff --git a/release/scripts/ui/properties_animviz.py b/release/scripts/ui/properties_animviz.py index 3e9c2158cb7..9eb046cc2c8 100644 --- a/release/scripts/ui/properties_animviz.py +++ b/release/scripts/ui/properties_animviz.py @@ -61,6 +61,8 @@ class MotionPathButtonsPanel(bpy.types.Panel): col.label(text="Display:") col.prop(mps, "show_frame_numbers", text="Frame Numbers") col.prop(mps, "highlight_keyframes", text="Keyframes") + if bones: + col.prop(mps, "search_all_action_keyframes", text="+ Non-Grouped Keyframes") col.prop(mps, "show_keyframe_numbers", text="Keyframe Numbers") diff --git a/release/scripts/ui/properties_data_lamp.py b/release/scripts/ui/properties_data_lamp.py index 4338489ac5a..14493301b1e 100644 --- a/release/scripts/ui/properties_data_lamp.py +++ b/release/scripts/ui/properties_data_lamp.py @@ -24,7 +24,7 @@ narrowui = bpy.context.user_preferences.view.properties_width_check class LAMP_MT_sunsky_presets(bpy.types.Menu): - bl_label = "Render Presets" + bl_label = "Sun & Sky Presets" preset_subdir = "sunsky" preset_operator = "script.execute_preset" COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'} diff --git a/release/scripts/ui/properties_object.py b/release/scripts/ui/properties_object.py index 6dbfe269436..f1b3e63f7ab 100644 --- a/release/scripts/ui/properties_object.py +++ b/release/scripts/ui/properties_object.py @@ -182,7 +182,7 @@ class OBJECT_PT_groups(ObjectButtonsPanel): col.prop(group, "dupli_offset", text="") prop = col.operator("wm.context_set_value", text="From Cursor") - prop.path = "object.group_users[%d].dupli_offset" % index + prop.path = "object.users_group[%d].dupli_offset" % index prop.value = value index += 1 diff --git a/release/scripts/ui/properties_object_constraint.py b/release/scripts/ui/properties_object_constraint.py index f53bac05a7c..11527ad9bda 100644 --- a/release/scripts/ui/properties_object_constraint.py +++ b/release/scripts/ui/properties_object_constraint.py @@ -76,7 +76,7 @@ class ConstraintButtonsPanel(bpy.types.Panel): else: layout.prop_object(con, "subtarget", con.target.data, "bones", text="") - if con.type in ('COPY_LOCATION', 'STRETCH_TO', 'TRACK_TO'): + if con.type in ('COPY_LOCATION', 'STRETCH_TO', 'TRACK_TO', 'PIVOT'): row = layout.row() row.label(text="Head/Tail:") row.prop(con, "head_tail", text="") @@ -730,6 +730,22 @@ class ConstraintButtonsPanel(bpy.types.Panel): col.prop(con, "xz_scaling_mode", text="") col.prop(con, "use_curve_radius") + def PIVOT(self, context, layout, con, wide_ui): + self.target_template(layout, con, wide_ui) + + if con.target: + col = layout.column() + col.prop(con, "offset", text="Pivot Offset") + else: + col = layout.column() + col.prop(con, "use_relative_position") + if con.use_relative_position: + col.prop(con, "offset", text="Relative Pivot Point") + else: + col.prop(con, "offset", text="Absolute Pivot Point") + + col = layout.column() + col.prop(con, "enabled_rotation_range", text="Pivot When") class OBJECT_PT_constraints(ConstraintButtonsPanel): bl_label = "Object Constraints" diff --git a/release/scripts/ui/properties_particle.py b/release/scripts/ui/properties_particle.py index 35c1f84cca5..328a9816524 100644 --- a/release/scripts/ui/properties_particle.py +++ b/release/scripts/ui/properties_particle.py @@ -705,12 +705,6 @@ class PARTICLE_PT_render(ParticleButtonsPanel): sub = split.column() sub.prop(part, "velocity_length") elif part.ren_as == 'PATH': - - if part.type != 'HAIR' and part.physics_type != 'KEYED' and (psys.point_cache.baked is False): - box = layout.box() - box.label(text="Baked or keyed particles needed for correct rendering.") - return - sub.prop(part, "render_strand") subsub = sub.column() subsub.active = (part.render_strand is False) @@ -862,11 +856,6 @@ class PARTICLE_PT_draw(ParticleButtonsPanel): path = (part.ren_as == 'PATH' and part.draw_as == 'RENDER') or part.draw_as == 'PATH' - if path and part.type != 'HAIR' and part.physics_type != 'KEYED' and psys.point_cache.baked is False: - box = layout.box() - box.label(text="Baked or keyed particles needed for correct drawing.") - return - row = layout.row() row.prop(part, "display", slider=True) if part.draw_as != 'RENDER' or part.ren_as == 'HALO': diff --git a/release/scripts/ui/properties_render.py b/release/scripts/ui/properties_render.py index 0f856ec9fd1..3166023a83a 100644 --- a/release/scripts/ui/properties_render.py +++ b/release/scripts/ui/properties_render.py @@ -187,14 +187,14 @@ class RENDER_PT_shading(RenderButtonsPanel): split = layout.split() col = split.column() - col.prop(rd, "render_textures", text="Textures") - col.prop(rd, "render_shadows", text="Shadows") - col.prop(rd, "render_sss", text="Subsurface Scattering") - col.prop(rd, "render_envmaps", text="Environment Map") + col.prop(rd, "use_textures", text="Textures") + col.prop(rd, "use_shadows", text="Shadows") + col.prop(rd, "use_sss", text="Subsurface Scattering") + col.prop(rd, "use_envmaps", text="Environment Map") if wide_ui: col = split.column() - col.prop(rd, "render_raytracing", text="Ray Tracing") + col.prop(rd, "use_raytracing", text="Ray Tracing") col.prop(rd, "color_management") col.prop(rd, "alpha_mode", text="Alpha") @@ -233,7 +233,7 @@ class RENDER_PT_performance(RenderButtonsPanel): sub.active = rd.use_compositing sub.prop(rd, "free_image_textures") sub = col.column() - sub.active = rd.render_raytracing + sub.active = rd.use_raytracing sub.label(text="Acceleration structure:") sub.prop(rd, "raytrace_structure", text="") if rd.raytrace_structure == 'OCTREE': diff --git a/release/scripts/ui/space_info.py b/release/scripts/ui/space_info.py index 0cd92bb91fd..62db983b87e 100644 --- a/release/scripts/ui/space_info.py +++ b/release/scripts/ui/space_info.py @@ -199,6 +199,18 @@ class INFO_MT_mesh_add(bpy.types.Menu): layout.operator("mesh.primitive_grid_add", icon='MESH_GRID', text="Grid") layout.operator("mesh.primitive_monkey_add", icon='MESH_MONKEY', text="Monkey") +class INFO_MT_curve_add(bpy.types.Menu): + bl_idname = "INFO_MT_curve_add" + bl_label = "Curve" + + def draw(self, context): + layout = self.layout + layout.operator_context = 'INVOKE_REGION_WIN' + layout.operator("curve.primitive_bezier_curve_add", icon='CURVE_BEZCURVE', text="Bezier") + layout.operator("curve.primitive_bezier_circle_add", icon='CURVE_BEZCIRCLE', text="Circle") + layout.operator("curve.primitive_nurbs_curve_add", icon='CURVE_NCURVE', text="Nurbs Curve") + layout.operator("curve.primitive_nurbs_circle_add", icon='CURVE_NCIRCLE', text="Nurbs Circle") + layout.operator("curve.primitive_nurbs_path_add", icon='CURVE_PATH', text="Path") class INFO_MT_armature_add(bpy.types.Menu): bl_idname = "INFO_MT_armature_add" @@ -221,7 +233,8 @@ class INFO_MT_add(bpy.types.Menu): #layout.operator_menu_enum("object.mesh_add", "type", text="Mesh", icon='OUTLINER_OB_MESH') layout.menu("INFO_MT_mesh_add", icon='OUTLINER_OB_MESH') - layout.operator_menu_enum("object.curve_add", "type", text="Curve", icon='OUTLINER_OB_CURVE') + #layout.operator_menu_enum("object.curve_add", "type", text="Curve", icon='OUTLINER_OB_CURVE') + layout.menu("INFO_MT_curve_add", icon='OUTLINER_OB_CURVE') layout.operator_menu_enum("object.surface_add", "type", text="Surface", icon='OUTLINER_OB_SURFACE') layout.operator_menu_enum("object.metaball_add", "type", text="Metaball", icon='OUTLINER_OB_META') layout.operator("object.text_add", text="Text", icon='OUTLINER_OB_FONT') @@ -245,7 +258,7 @@ class INFO_MT_add(bpy.types.Menu): layout.operator_context = 'INVOKE_DEFAULT' layout.operator("object.group_instance_add", text="Group Instance...", icon='OUTLINER_OB_EMPTY') else: - layout.operator_menu_enum("object.group_instance_add", "type", text="Group Instance", icon='OUTLINER_OB_EMPTY') + layout.operator_menu_enum("object.group_instance_add", "group", text="Group Instance", icon='OUTLINER_OB_EMPTY') class INFO_MT_game(bpy.types.Menu): @@ -297,19 +310,19 @@ class INFO_MT_help(bpy.types.Menu): def draw(self, context): layout = self.layout - layout.operator("help.manual", icon='HELP') - layout.operator("help.release_logs", icon='URL') + layout.operator("wm.url_open", text="Manual", icon='HELP').url = 'http://wiki.blender.org/index.php/Doc:Manual' + layout.operator("wm.url_open", text="Release Log", icon='URL').url = 'http://www.blender.org/development/release-logs/blender-250/' layout.separator() - layout.operator("help.blender_website", icon='URL') - layout.operator("help.blender_eshop", icon='URL') - layout.operator("help.developer_community", icon='URL') - layout.operator("help.user_community", icon='URL') + layout.operator("wm.url_open", text="Blender Website", icon='URL').url = 'http://www.blender.org/' + layout.operator("wm.url_open", text="Blender e-Shop", icon='URL').url = 'http://www.blender.org/e-shop' + layout.operator("wm.url_open", text="Developer Community", icon='URL').url = 'http://www.blender.org/community/get-involved/' + layout.operator("wm.url_open", text="User Community", icon='URL').url = 'http://www.blender.org/community/user-community/' layout.separator() - layout.operator("help.report_bug", icon='URL') + layout.operator("wm.url_open", text="Report a Bug", icon='URL').url = 'http://projects.blender.org/tracker/?atid=498&group_id=9&func=browse' layout.separator() - layout.operator("help.python_api", icon='URL') + layout.operator("wm.url_open", text="Python API Reference", icon='URL').url = 'http://www.blender.org/documentation/250PythonDoc/contents.html' layout.operator("help.operator_cheat_sheet") layout.separator() layout.operator("wm.splash") @@ -318,70 +331,6 @@ class INFO_MT_help(bpy.types.Menu): # Help operators -class HelpOperator(bpy.types.Operator): - - def execute(self, context): - import webbrowser - webbrowser.open(self._url) - return {'FINISHED'} - - -class HELP_OT_manual(HelpOperator): - '''The Blender Wiki manual''' - bl_idname = "help.manual" - bl_label = "Manual" - _url = 'http://wiki.blender.org/index.php/Doc:Manual' - - -class HELP_OT_release_logs(HelpOperator): - '''Information about the changes in this version of Blender''' - bl_idname = "help.release_logs" - bl_label = "Release Log" - _url = 'http://www.blender.org/development/release-logs/blender-250/' - - -class HELP_OT_blender_website(HelpOperator): - '''The official Blender website''' - bl_idname = "help.blender_website" - bl_label = "Blender Website" - _url = 'http://www.blender.org/' - - -class HELP_OT_blender_eshop(HelpOperator): - '''Buy official Blender resources and merchandise online''' - bl_idname = "help.blender_eshop" - bl_label = "Blender e-Shop" - _url = 'http://www.blender.org/e-shop' - - -class HELP_OT_developer_community(HelpOperator): - '''Get involved with Blender development''' - bl_idname = "help.developer_community" - bl_label = "Developer Community" - _url = 'http://www.blender.org/community/get-involved/' - - -class HELP_OT_user_community(HelpOperator): - '''Get involved with other Blender users''' - bl_idname = "help.user_community" - bl_label = "User Community" - _url = 'http://www.blender.org/community/user-community/' - - -class HELP_OT_report_bug(HelpOperator): - '''Report a bug in the Blender bug tracker''' - bl_idname = "help.report_bug" - bl_label = "Report a Bug" - _url = 'http://projects.blender.org/tracker/?atid=498&group_id=9&func=browse' - - -class HELP_OT_python_api(HelpOperator): - '''Reference for operator and data Python API''' - bl_idname = "help.python_api" - bl_label = "Python API Reference" - _url = 'http://www.blender.org/documentation/250PythonDoc/contents.html' - - class HELP_OT_operator_cheat_sheet(bpy.types.Operator): bl_idname = "help.operator_cheat_sheet" bl_label = "Operator Cheat Sheet (new textblock)" @@ -416,19 +365,12 @@ classes = [ INFO_MT_file_external_data, INFO_MT_add, INFO_MT_mesh_add, + INFO_MT_curve_add, INFO_MT_armature_add, INFO_MT_game, INFO_MT_render, INFO_MT_help, - HELP_OT_manual, - HELP_OT_release_logs, - HELP_OT_blender_website, - HELP_OT_blender_eshop, - HELP_OT_developer_community, - HELP_OT_user_community, - HELP_OT_report_bug, - HELP_OT_python_api, HELP_OT_operator_cheat_sheet] diff --git a/release/scripts/ui/space_sequencer.py b/release/scripts/ui/space_sequencer.py index e300cfd3d32..b94acf6f3ad 100644 --- a/release/scripts/ui/space_sequencer.py +++ b/release/scripts/ui/space_sequencer.py @@ -457,6 +457,7 @@ class SEQUENCER_PT_effect(SequencerButtonsPanel): row = layout.row(align=True) sub = row.row() sub.scale_x = 2.0 + if not context.screen.animation_playing: sub.operator("screen.animation_play", text="", icon='PLAY') else: @@ -665,6 +666,12 @@ class SEQUENCER_PT_sound(SequencerButtonsPanel): row.prop(strip.sound, "caching") layout.prop(strip, "volume") + layout.prop(strip, "attenuation") + + col = layout.column(align=True) + col.label(text="Trim Duration:") + col.prop(strip, "animation_start_offset", text="Start") + col.prop(strip, "animation_end_offset", text="End") class SEQUENCER_PT_scene(SequencerButtonsPanel): diff --git a/release/scripts/ui/space_userpref.py b/release/scripts/ui/space_userpref.py index a850f543e04..d0d91c2accf 100644 --- a/release/scripts/ui/space_userpref.py +++ b/release/scripts/ui/space_userpref.py @@ -554,6 +554,10 @@ class USERPREF_PT_theme(bpy.types.Panel): ui = theme.user_interface.wcol_scroll col.label(text="Scroll Bar:") ui_items_general(col, ui) + + ui = theme.user_interface.wcol_progress + col.label(text="Progress Bar:") + ui_items_general(col, ui) ui = theme.user_interface.wcol_list_item col.label(text="List Item:") @@ -1187,7 +1191,7 @@ class USERPREF_PT_addons(bpy.types.Panel): # If there are Infos or UI is expanded if info["expanded"]: row.operator("wm.addon_expand", icon="TRIA_DOWN").module = module_name - elif info["author"] or info["version"] or info["url"] or info["location"]: + elif info["author"] or info["version"] or info["wiki_url"] or info["location"]: row.operator("wm.addon_expand", icon="TRIA_RIGHT").module = module_name else: # Else, block UI @@ -1216,12 +1220,19 @@ class USERPREF_PT_addons(bpy.types.Panel): split = column.row().split(percentage=0.15) split.label(text='Description:') split.label(text=info["description"]) - if info["url"]: + if info["wiki_url"] or info["tracker_url"]: split = column.row().split(percentage=0.15) split.label(text="Internet:") - split.operator("wm.addon_links", text="Link to the Wiki").link = info["url"] - split.separator() - split.separator() + if info["wiki_url"]: + split.operator("wm.url_open", text="Link to the Wiki", icon='HELP').url = info["wiki_url"] + if info["tracker_url"]: + split.operator("wm.url_open", text="Report a Bug", icon='URL').url = info["tracker_url"] + + if info["wiki_url"] and info["tracker_url"]: + split.separator() + else: + split.separator() + split.separator() # Append missing scripts # First collect scripts that are used but have no script file. @@ -1245,7 +1256,7 @@ class USERPREF_PT_addons(bpy.types.Panel): from bpy.props import * -def addon_info_get(mod, info_basis={"name": "", "author": "", "version": "", "blender": "", "location": "", "description": "", "url": "", "category": "", "expanded": False}): +def addon_info_get(mod, info_basis={"name": "", "author": "", "version": "", "blender": "", "location": "", "description": "", "wiki_url": "", "tracker_url": "", "category": "", "expanded": False}): addon_info = getattr(mod, "bl_addon_info", {}) # avoid re-initializing @@ -1410,19 +1421,6 @@ class WM_OT_addon_expand(bpy.types.Operator): return {'FINISHED'} -class WM_OT_addon_links(bpy.types.Operator): - "Open the Blender Wiki in the Webbrowser" - bl_idname = "wm.addon_links" - bl_label = "" - - link = StringProperty(name="Link", description="Link to open") - - def execute(self, context): - import webbrowser - webbrowser.open(self.properties.link) - return {'FINISHED'} - - classes = [ USERPREF_HT_header, USERPREF_PT_tabs, @@ -1440,8 +1438,7 @@ classes = [ WM_OT_addon_enable, WM_OT_addon_disable, WM_OT_addon_install, - WM_OT_addon_expand, - WM_OT_addon_links] + WM_OT_addon_expand] def register(): diff --git a/release/scripts/ui/space_view3d.py b/release/scripts/ui/space_view3d.py index 8be176843fc..4a3818eae73 100644 --- a/release/scripts/ui/space_view3d.py +++ b/release/scripts/ui/space_view3d.py @@ -32,14 +32,13 @@ class VIEW3D_HT_header(bpy.types.Header): obj = context.active_object toolsettings = context.tool_settings - row = layout.row() + row = layout.row(align=True) row.template_header() - sub = row.row(align=True) - # Menus if context.area.show_menus: - + sub = row.row(align=True) + sub.menu("VIEW3D_MT_view") # Select Menu @@ -54,6 +53,7 @@ class VIEW3D_HT_header(bpy.types.Header): else: sub.menu("VIEW3D_MT_object") + row = layout.row() row.template_header_3D() # do in C for now since these buttons cant be both toggle AND exclusive. @@ -675,6 +675,7 @@ class VIEW3D_MT_object(bpy.types.Menu): layout.menu("VIEW3D_MT_object_track") layout.menu("VIEW3D_MT_object_group") layout.menu("VIEW3D_MT_object_constraints") + layout.menu("VIEW3D_MT_object_game_properties") layout.separator() @@ -706,14 +707,13 @@ class VIEW3D_MT_object_specials(bpy.types.Menu): def poll(self, context): # add more special types - obj = context.object - return bool(obj and obj.type == 'LAMP') + return context.object def draw(self, context): layout = self.layout obj = context.object - if obj and obj.type == 'LAMP': + if obj.type == 'LAMP': layout.operator_context = 'INVOKE_REGION_WIN' props = layout.operator("wm.context_modal_mouse", text="Spot Size") @@ -736,6 +736,10 @@ class VIEW3D_MT_object_specials(bpy.types.Menu): props.path_item = "data.shadow_buffer_clip_end" props.input_scale = 0.05 + layout.separator() + + props = layout.operator("object.isolate_type_render") + class VIEW3D_MT_object_apply(bpy.types.Menu): bl_label = "Apply" @@ -793,6 +797,7 @@ class VIEW3D_MT_object_constraints(bpy.types.Menu): layout = self.layout layout.operator("object.constraint_add_with_targets") + layout.operator("object.constraints_copy") layout.operator("object.constraints_clear") @@ -840,6 +845,17 @@ class VIEW3D_MT_make_links(bpy.types.Menu): layout.operator_enums("object.make_links_data", "type") # inline +class VIEW3D_MT_object_game_properties(bpy.types.Menu): + bl_label = "Game Properties" + + def draw(self, context): + layout = self.layout + + layout.operator("object.game_property_copy", text="Replace").operation="REPLACE" + layout.operator("object.game_property_copy", text="Merge").operation="MERGE" + # layout.operator("object.game_property_copy").operation="CLEAR" doesn't really belong as part of copy... + layout.operator_menu_enum("object.game_property_copy", "property", text="Copy...") + # ********** Vertex paint menu ********** @@ -1145,6 +1161,7 @@ class VIEW3D_MT_pose_constraints(bpy.types.Menu): layout = self.layout layout.operator("pose.constraint_add_with_targets", text="Add (With Targets)...") + layout.operator("pose.constraints_copy") layout.operator("pose.constraints_clear") @@ -2205,6 +2222,7 @@ classes = [ VIEW3D_MT_object_track, VIEW3D_MT_object_group, VIEW3D_MT_object_constraints, + VIEW3D_MT_object_game_properties, VIEW3D_MT_object_showhide, VIEW3D_MT_make_single_user, VIEW3D_MT_make_links, diff --git a/source/blender/blenkernel/BKE_global.h b/source/blender/blenkernel/BKE_global.h index 291deb5ea70..6a602339e11 100644 --- a/source/blender/blenkernel/BKE_global.h +++ b/source/blender/blenkernel/BKE_global.h @@ -83,9 +83,6 @@ typedef struct Global { struct VFont *selfont; struct ListBase ttfdata; - /* libtiff flag used to determine if shared library loaded for libtiff*/ - int have_libtiff; - /* this variable is written to / read from FileGlobal->fileflags */ int fileflags; diff --git a/source/blender/blenkernel/BKE_multires.h b/source/blender/blenkernel/BKE_multires.h index e5c7745f637..258fb6f1b3f 100644 --- a/source/blender/blenkernel/BKE_multires.h +++ b/source/blender/blenkernel/BKE_multires.h @@ -52,9 +52,9 @@ void multiresModifier_join(struct Object *); void multiresModifier_del_levels(struct MultiresModifierData *, struct Object *, int direction); void multiresModifier_subdivide(struct MultiresModifierData *mmd, struct Object *ob, int updateblock, int simple); -int multiresModifier_reshape(struct MultiresModifierData *mmd, struct Object *dst, struct Object *src); -int multiresModifier_reshapeFromDM(struct MultiresModifierData *mmd, struct Object *ob, struct DerivedMesh *srcdm); -int multiresModifier_reshapeFromDeformMod(struct MultiresModifierData *mmd, struct Object *ob, struct ModifierData *md); +int multiresModifier_reshape(struct Object *dst, struct Object *src); +int multiresModifier_reshapeFromDM(struct Object *ob, struct DerivedMesh *srcdm); +int multiresModifier_reshapeFromDeformMod(struct Object *ob, struct ModifierData *md); void multires_stitch_grids(struct Object *); diff --git a/source/blender/blenkernel/BKE_particle.h b/source/blender/blenkernel/BKE_particle.h index fcef00ae9b3..33a41821fe2 100644 --- a/source/blender/blenkernel/BKE_particle.h +++ b/source/blender/blenkernel/BKE_particle.h @@ -255,9 +255,11 @@ void psys_threads_free(ParticleThread *threads); void psys_make_billboard(ParticleBillboardData *bb, float xvec[3], float yvec[3], float zvec[3], float center[3]); /* particle_system.c */ +void psys_update_path_cache(struct ParticleSimulationData *sim, float cfra); struct ParticleSystem *psys_get_target_system(struct Object *ob, struct ParticleTarget *pt); void psys_count_keyed_targets(struct ParticleSimulationData *sim); void psys_update_particle_tree(struct ParticleSystem *psys, float cfra); +void psys_update_children(struct ParticleSimulationData *sim); void psys_make_temp_pointcache(struct Object *ob, struct ParticleSystem *psys); void psys_get_pointcache_start_end(struct Scene *scene, ParticleSystem *psys, int *sfra, int *efra); diff --git a/source/blender/blenkernel/BKE_utildefines.h b/source/blender/blenkernel/BKE_utildefines.h index 0b3fce9408c..925b1d7171a 100644 --- a/source/blender/blenkernel/BKE_utildefines.h +++ b/source/blender/blenkernel/BKE_utildefines.h @@ -38,6 +38,9 @@ #define TRUE 1 #endif +/* Macro to convert a value to string in the preprocessor */ +#define QUOTE(x) #x + /* these values need to be hardcoded in structs, dna does not recognize defines */ /* also defined in DNA_space_types.h */ #ifndef FILE_MAXDIR @@ -163,7 +166,7 @@ #define IMAG MAKE_ID('I','M','A','G') #define DNA1 MAKE_ID('D','N','A','1') -#define TEST MAKE_ID('T','E','S','T') +#define TEST MAKE_ID('T','E','S','T') /* used as preview between 'REND' and 'GLOB' */ #define REND MAKE_ID('R','E','N','D') #define USER MAKE_ID('U','S','E','R') diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt index afb29fbcd62..68684bcc0a1 100644 --- a/source/blender/blenkernel/CMakeLists.txt +++ b/source/blender/blenkernel/CMakeLists.txt @@ -50,6 +50,10 @@ IF(WITH_OPENEXR) ADD_DEFINITIONS(-DWITH_OPENEXR) ENDIF(WITH_OPENEXR) +IF(WITH_TIFF) + ADD_DEFINITIONS(-DWITH_TIFF) +ENDIF(WITH_TIFF) + IF(WITH_OPENJPEG) ADD_DEFINITIONS(-DWITH_OPENJPEG) ENDIF(WITH_OPENJPEG) diff --git a/source/blender/blenkernel/SConscript b/source/blender/blenkernel/SConscript index 57d7e45d986..6198520c853 100644 --- a/source/blender/blenkernel/SConscript +++ b/source/blender/blenkernel/SConscript @@ -38,6 +38,9 @@ else: if env['WITH_BF_OPENEXR']: defs.append('WITH_OPENEXR') +if env['WITH_BF_TIFF']: + defs.append('WITH_TIFF') + if env['WITH_BF_OPENJPEG']: defs.append('WITH_OPENJPEG') diff --git a/source/blender/blenkernel/intern/Makefile b/source/blender/blenkernel/intern/Makefile index 4e365f363c3..15c022592f9 100644 --- a/source/blender/blenkernel/intern/Makefile +++ b/source/blender/blenkernel/intern/Makefile @@ -132,6 +132,10 @@ ifeq ($(WITH_QUICKTIME), true) CPPFLAGS += -DWITH_QUICKTIME endif +ifeq ($(WITH_TIFF), true) + CPPFLAGS += -DWITH_TIFF +endif + ifeq ($(OS), darwin) ifeq ($(WITH_BF_OPENMP), true) CPPFLAGS += -DPARALLEL=1 diff --git a/source/blender/blenkernel/intern/anim.c b/source/blender/blenkernel/intern/anim.c index 8619ab1eb1c..20afc715c77 100644 --- a/source/blender/blenkernel/intern/anim.c +++ b/source/blender/blenkernel/intern/anim.c @@ -52,6 +52,7 @@ #include "BKE_anim.h" #include "BKE_curve.h" #include "BKE_DerivedMesh.h" +#include "BKE_depsgraph.h" #include "BKE_font.h" #include "BKE_group.h" #include "BKE_global.h" @@ -63,6 +64,7 @@ #include "BKE_particle.h" #include "BKE_scene.h" #include "BKE_utildefines.h" +#include "BKE_depsgraph.h" // XXX bad level call... @@ -187,6 +189,8 @@ bMotionPath *animviz_verify_motionpaths(Scene *scene, Object *ob, bPoseChannel * if (avs->path_bakeflag & MOTIONPATH_BAKE_HEADS) mpath->flag |= MOTIONPATH_FLAG_BHEAD; + else + mpath->flag &= ~MOTIONPATH_FLAG_BHEAD; /* allocate a cache */ mpath->points= MEM_callocN(sizeof(bMotionPathVert)*mpath->length, "bMotionPathVerts"); @@ -250,6 +254,83 @@ void animviz_get_object_motionpaths(Object *ob, ListBase *targets) /* ........ */ +/* Note on evaluation optimisations: + * Optimisations currently used here play tricks with the depsgraph in order to try and + * evaluate as few objects as strictly necessary to get nicer performance under standard + * production conditions. For those people who really need the accurate version, + * disable the ifdef (i.e. 1 -> 0) and comment out the call to motionpaths_calc_optimise_depsgraph() + */ + +/* tweak the object ordering to trick depsgraph into making MotionPath calculations run faster */ +static void motionpaths_calc_optimise_depsgraph(Scene *scene, ListBase *targets) +{ + Base *base, *baseNext; + MPathTarget *mpt; + + /* make sure our temp-tag isn't already in use */ + for (base= scene->base.first; base; base= base->next) + base->object->flag &= ~BA_TEMP_TAG; + + /* for each target, dump its object to the start of the list if it wasn't moved already */ + for (mpt= targets->first; mpt; mpt= mpt->next) { + for (base=scene->base.first; base; base=baseNext) { + baseNext = base->next; + + if ((base->object == mpt->ob) && !(mpt->ob->flag & BA_TEMP_TAG)) { + BLI_remlink(&scene->base, base); + BLI_addhead(&scene->base, base); + + mpt->ob->flag |= BA_TEMP_TAG; + break; // we really don't need to continue anymore once this happens, but this line might really 'break' + } + } + } + + /* "brew me a list that's sorted a bit faster now depsy" */ + DAG_scene_sort(scene); +} + +/* update scene for current frame */ +static void motionpaths_calc_update_scene(Scene *scene) +{ +#if 1 // 'production' optimisations always on + Base *base, *last=NULL; + + /* only stuff that moves or needs display still */ + DAG_scene_update_flags(scene, scene->lay); + + /* find the last object with the tag + * - all those afterwards are assumed to not be relevant for our calculations + */ + // optimise further by moving out... + for (base=scene->base.first; base; base=base->next) { + if (base->object->flag & BA_TEMP_TAG) + last = base; + } + + /* perform updates for tagged objects */ + // XXX: this will break if rigs depend on scene or other data that + // is animated but not attached to/updatable from objects + for (base=scene->base.first; base; base=base->next) { + /* update this object */ + object_handle_update(scene, base->object); + + /* if this is the last one we need to update, let's stop to save some time */ + if (base == last) + break; + } +#else // original, 'always correct' version + /* do all updates + * - if this is too slow, resort to using a more efficient way + * that doesn't force complete update, but for now, this is the + * most accurate way! + */ + scene_update_for_newframe(scene, scene->lay); // XXX this is the best way we can get anything moving +#endif +} + +/* ........ */ + /* perform baking for the targets on the current frame */ static void motionpaths_calc_bake_targets(Scene *scene, ListBase *targets) { @@ -311,7 +392,7 @@ void animviz_calc_motionpaths(Scene *scene, ListBase *targets) // TODO: this method could be improved... // 1) max range for standard baking - // 2) minimum range for recalc baking (i.e. between keyfames, but how?) + // 2) minimum range for recalc baking (i.e. between keyframes, but how?) for (mpt= targets->first; mpt; mpt= mpt->next) { /* try to increase area to do (only as much as needed) */ sfra= MIN2(sfra, mpt->mpath->start_frame); @@ -319,14 +400,14 @@ void animviz_calc_motionpaths(Scene *scene, ListBase *targets) } if (efra <= sfra) return; + /* optimise the depsgraph for faster updates */ + // TODO: whether this is used should depend on some setting for the level of optimisations used + motionpaths_calc_optimise_depsgraph(scene, targets); + /* calculate path over requested range */ for (CFRA=sfra; CFRA<=efra; CFRA++) { - /* do all updates - * - if this is too slow, resort to using a more efficient way - * that doesn't force complete update, but for now, this is the - * most accurate way! - */ - scene_update_for_newframe(scene, scene->lay); // XXX this is the best way we can get anything moving + /* update relevant data for new frame */ + motionpaths_calc_update_scene(scene); /* perform baking for targets */ motionpaths_calc_bake_targets(scene, targets); @@ -334,7 +415,7 @@ void animviz_calc_motionpaths(Scene *scene, ListBase *targets) /* reset original environment */ CFRA= cfra; - scene_update_for_newframe(scene, scene->lay); // XXX this is the best way we can get anything moving + motionpaths_calc_update_scene(scene); /* clear recalc flags from targets */ for (mpt= targets->first; mpt; mpt= mpt->next) { @@ -1107,11 +1188,21 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p BLI_srandom(31415926 + psys->seed); lay= scene->lay; - if((psys->renderdata || part->draw_as==PART_DRAW_REND) && - ((part->ren_as == PART_DRAW_OB && part->dup_ob) || - (part->ren_as == PART_DRAW_GR && part->dup_group && part->dup_group->gobject.first))) { + if((psys->renderdata || part->draw_as==PART_DRAW_REND) && ELEM(part->ren_as, PART_DRAW_OB, PART_DRAW_GR)) { - psys_check_group_weights(part); + /* first check for loops (particle system object used as dupli object) */ + if(part->ren_as == PART_DRAW_OB) { + if(ELEM(part->dup_ob, NULL, par)) + return; + } + else { /*PART_DRAW_GR */ + if(part->dup_group == NULL || part->dup_group->gobject.first == NULL) + return; + + for(go=part->dup_group->gobject.first; go; go=go->next) + if(go->ob == par) + return; + } /* if we have a hair particle system, use the path cache */ if(part->type == PART_HAIR) { @@ -1125,6 +1216,8 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p totpart = psys->totcached; } + psys_check_group_weights(part); + psys->lattice = psys_get_lattice(&sim); /* gather list of objects or single object */ diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c index 4f9b9435a80..557f3900d7b 100644 --- a/source/blender/blenkernel/intern/armature.c +++ b/source/blender/blenkernel/intern/armature.c @@ -2055,7 +2055,7 @@ static void splineik_evaluate_bone(tSplineIK_Tree *tree, Scene *scene, Object *o /* we need to clamp this within sensible values */ // NOTE: these should be fine for now, but should get sanitised in future - scale= MIN2( MAX2(scale, 0.0001) , 100000); + scale= MIN2(MAX2(scale, 0.0001) , 100000); } else scale= 1.0f; @@ -2127,8 +2127,6 @@ static void splineik_execute_tree(Scene *scene, Object *ob, bPoseChannel *pchan_ splineik_evaluate_bone(tree, scene, ob, pchan, i, ctime); } - // TODO: if another pass is needed to ensure the validity of the chain after blending, it should go here - /* free the tree info specific to SplineIK trees now */ if (tree->chain) MEM_freeN(tree->chain); if (tree->free_points) MEM_freeN(tree->points); diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c index 5d12675952c..046b8de2431 100644 --- a/source/blender/blenkernel/intern/blender.c +++ b/source/blender/blenkernel/intern/blender.c @@ -534,7 +534,7 @@ void BKE_write_undo(bContext *C, char *name) sprintf(numstr, "%d.blend", counter); BLI_make_file_string("/", tstr, btempdir, numstr); - success= BLO_write_file(CTX_data_main(C), tstr, G.fileflags, NULL); + success= BLO_write_file(CTX_data_main(C), tstr, G.fileflags, NULL, NULL); strcpy(curundo->str, tstr); } diff --git a/source/blender/blenkernel/intern/cloth.c b/source/blender/blenkernel/intern/cloth.c index 2b11c4bdfa0..ce5bca1da56 100644 --- a/source/blender/blenkernel/intern/cloth.c +++ b/source/blender/blenkernel/intern/cloth.c @@ -27,16 +27,13 @@ #include "MEM_guardedalloc.h" -#include "BKE_cloth.h" - #include "BKE_cdderivedmesh.h" +#include "BKE_cloth.h" #include "BKE_effect.h" #include "BKE_global.h" #include "BKE_modifier.h" -#include "BKE_utildefines.h" - #include "BKE_pointcache.h" - +#include "BKE_utildefines.h" #ifdef _WIN32 void tstart ( void ) diff --git a/source/blender/blenkernel/intern/collision.c b/source/blender/blenkernel/intern/collision.c index ffd504f5945..a77ac9b8e24 100644 --- a/source/blender/blenkernel/intern/collision.c +++ b/source/blender/blenkernel/intern/collision.c @@ -59,7 +59,7 @@ Collision modifier code start /* step is limited from 0 (frame start position) to 1 (frame end position) */ void collision_move_object ( CollisionModifierData *collmd, float step, float prevstep ) { - float tv[3] = {0,0,0}; + float tv[3] = {0, 0, 0}; unsigned int i = 0; for ( i = 0; i < collmd->numverts; i++ ) @@ -69,6 +69,7 @@ void collision_move_object ( CollisionModifierData *collmd, float step, float pr VECADDS ( collmd->current_xnew[i].co, collmd->x[i].co, tv, step ); VECSUB ( collmd->current_v[i].co, collmd->current_xnew[i].co, collmd->current_x[i].co ); } + bvhtree_update_from_mvert ( collmd->bvhtree, collmd->mfaces, collmd->numfaces, collmd->current_x, collmd->current_xnew, collmd->numverts, 1 ); } @@ -527,7 +528,7 @@ int cloth_collision_response_static ( ClothModifierData *clmd, CollisionModifier float magtangent = 0, repulse = 0, d = 0; double impulse = 0.0; float vrel_t_pre[3]; - float temp[3]; + float temp[3], spf; // calculate tangential velocity VECCOPY ( temp, collpair->normal ); @@ -565,10 +566,12 @@ int cloth_collision_response_static ( ClothModifierData *clmd, CollisionModifier // Apply repulse impulse if distance too short // I_r = -min(dt*kd, m(0,1d/dt - v_n)) + spf = (float)clmd->sim_parms->stepsPerFrame / clmd->sim_parms->timescale; + d = clmd->coll_parms->epsilon*8.0/9.0 + epsilon2*8.0/9.0 - collpair->distance; - if ( ( magrelVel < 0.1*d*clmd->sim_parms->stepsPerFrame ) && ( d > ALMOST_ZERO ) ) + if ( ( magrelVel < 0.1*d*spf ) && ( d > ALMOST_ZERO ) ) { - repulse = MIN2 ( d*1.0/clmd->sim_parms->stepsPerFrame, 0.1*d*clmd->sim_parms->stepsPerFrame - magrelVel ); + repulse = MIN2 ( d*1.0/spf, 0.1*d*spf - magrelVel ); // stay on the safe side and clamp repulse if ( impulse > ALMOST_ZERO ) @@ -1541,20 +1544,15 @@ int cloth_bvh_objcollision (Object *ob, ClothModifierData * clmd, float step, fl overlap = BLI_bvhtree_overlap ( cloth_bvh, collmd->bvhtree, &result ); // go to next object if no overlap is there - if(!result || !overlap) - { - if ( overlap ) - MEM_freeN ( overlap ); - continue; + if( result && overlap ) { + /* check if collisions really happen (costly near check) */ + cloth_bvh_objcollisions_nearcheck ( clmd, collmd, &collisions[i], &collisions_index[i], result, overlap); + + // resolve nearby collisions + ret += cloth_bvh_objcollisions_resolve ( clmd, collmd, collisions[i], collisions_index[i]); + ret2 += ret; } - - /* check if collisions really happen (costly near check) */ - cloth_bvh_objcollisions_nearcheck ( clmd, collmd, &collisions[i], &collisions_index[i], result, overlap); - - // resolve nearby collisions - ret += cloth_bvh_objcollisions_resolve ( clmd, collmd, collisions[i], collisions_index[i]); - ret2 += ret; - + if ( overlap ) MEM_freeN ( overlap ); } diff --git a/source/blender/blenkernel/intern/constraint.c b/source/blender/blenkernel/intern/constraint.c index a3f1cb0cb0c..171276d118e 100644 --- a/source/blender/blenkernel/intern/constraint.c +++ b/source/blender/blenkernel/intern/constraint.c @@ -820,12 +820,12 @@ static void childof_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *ta /* extract components of both matrices */ VECCOPY(loc, ct->matrix[3]); - mat4_to_eulO( eul, ct->rotOrder,ct->matrix); - mat4_to_size( size,ct->matrix); + mat4_to_eulO(eul, ct->rotOrder, ct->matrix); + mat4_to_size(size, ct->matrix); VECCOPY(loco, invmat[3]); - mat4_to_eulO( eulo, cob->rotOrder,invmat); - mat4_to_size( sizo,invmat); + mat4_to_eulO(eulo, cob->rotOrder, invmat); + mat4_to_size(sizo, invmat); /* disable channels not enabled */ if (!(data->flag & CHILDOF_LOCX)) loc[0]= loco[0]= 0.0f; @@ -1017,7 +1017,7 @@ static void trackto_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *ta float tmat[4][4]; /* Get size property, since ob->size is only the object's own relative size, not its global one */ - mat4_to_size( size,cob->matrix); + mat4_to_size(size, cob->matrix); /* Clear the object's rotation */ cob->matrix[0][0]=size[0]; @@ -1385,9 +1385,9 @@ static void rotlimit_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *t float size[3]; VECCOPY(loc, cob->matrix[3]); - mat4_to_size( size,cob->matrix); + mat4_to_size(size, cob->matrix); - mat4_to_eulO( eul, cob->rotOrder,cob->matrix); + mat4_to_eulO(eul, cob->rotOrder, cob->matrix); /* constraint data uses radians internally */ @@ -1638,11 +1638,11 @@ static void rotlike_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *ta float size[3]; VECCOPY(loc, cob->matrix[3]); - mat4_to_size( size,cob->matrix); + mat4_to_size(size, cob->matrix); /* to allow compatible rotations, must get both rotations in the order of the owner... */ - mat4_to_eulO( eul, cob->rotOrder,ct->matrix); - mat4_to_eulO( obeul, cob->rotOrder,cob->matrix); + mat4_to_eulO(eul, cob->rotOrder, ct->matrix); + mat4_to_eulO(obeul, cob->rotOrder, cob->matrix); if ((data->flag & ROTLIKE_X)==0) eul[0] = obeul[0]; @@ -1868,29 +1868,29 @@ static void samevolume_evaluate (bConstraint *con, bConstraintOb *cob, ListBase { bSameVolumeConstraint *data= con->data; + float volume = data->volume; + float fac = 1.0f; float obsize[3]; - float volume=data->volume; mat4_to_size(obsize, cob->matrix); - + + /* calculate normalising scale factor for non-essential values */ + if (obsize[data->flag] != 0) + fac = sqrt(volume / obsize[data->flag]) / obsize[data->flag]; + + /* apply scaling factor to the channels not being kept */ switch (data->flag) { case SAMEVOL_X: - if (obsize[0]!=0) { - mul_v3_fl(cob->matrix[1], sqrt(volume/obsize[0])/obsize[0]); - mul_v3_fl(cob->matrix[2], sqrt(volume/obsize[0])/obsize[0]); - } + mul_v3_fl(cob->matrix[1], fac); + mul_v3_fl(cob->matrix[2], fac); break; case SAMEVOL_Y: - if (obsize[1]!=0) { - mul_v3_fl(cob->matrix[0], sqrt(volume/obsize[1])/obsize[1]); - mul_v3_fl(cob->matrix[2], sqrt(volume/obsize[1])/obsize[1]); - } + mul_v3_fl(cob->matrix[0], fac); + mul_v3_fl(cob->matrix[2], fac); break; case SAMEVOL_Z: - if (obsize[2]!=0) { - mul_v3_fl(cob->matrix[0], sqrt(volume/obsize[2])/obsize[2]); - mul_v3_fl(cob->matrix[1], sqrt(volume/obsize[2])/obsize[2]); - } + mul_v3_fl(cob->matrix[0], fac); + mul_v3_fl(cob->matrix[1], fac); break; } } @@ -2770,7 +2770,7 @@ static void stretchto_evaluate (bConstraint *con, bConstraintOb *cob, ListBase * float dist; /* store scaling before destroying obmat */ - mat4_to_size( size,cob->matrix); + mat4_to_size(size, cob->matrix); /* store X orientation before destroying obmat */ xx[0] = cob->matrix[0][0]; @@ -3353,7 +3353,7 @@ static void transform_evaluate (bConstraint *con, bConstraintOb *cob, ListBase * mat4_to_size( dvec,ct->matrix); break; case 1: /* rotation (convert to degrees first) */ - mat4_to_eulO( dvec, cob->rotOrder,ct->matrix); + mat4_to_eulO(dvec, cob->rotOrder, ct->matrix); for (i=0; i<3; i++) dvec[i] = (float)(dvec[i] / M_PI * 180); break; @@ -3364,8 +3364,8 @@ static void transform_evaluate (bConstraint *con, bConstraintOb *cob, ListBase * /* extract components of owner's matrix */ VECCOPY(loc, cob->matrix[3]); - mat4_to_eulO( eul, cob->rotOrder,cob->matrix); - mat4_to_size( size,cob->matrix); + mat4_to_eulO(eul, cob->rotOrder, cob->matrix); + mat4_to_size(size, cob->matrix); /* determine where in range current transforms lie */ if (data->expo) { @@ -3485,73 +3485,73 @@ static void shrinkwrap_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstr float co[3] = {0.0f, 0.0f, 0.0f}; float no[3] = {0.0f, 0.0f, 0.0f}; float dist; - + SpaceTransform transform; DerivedMesh *target = object_get_derived_final(cob->scene, ct->tar, CD_MASK_BAREMESH); BVHTreeRayHit hit; BVHTreeNearest nearest; - + BVHTreeFromMesh treeData; - memset( &treeData, 0, sizeof(treeData) ); - + memset(&treeData, 0, sizeof(treeData)); + nearest.index = -1; nearest.dist = FLT_MAX; - + hit.index = -1; hit.dist = 100000.0f; //TODO should use FLT_MAX.. but normal projection doenst yet supports it - + unit_m4(ct->matrix); - + if(target != NULL) { space_transform_from_matrixs(&transform, cob->matrix, ct->tar->obmat); - + switch(scon->shrinkType) { case MOD_SHRINKWRAP_NEAREST_SURFACE: case MOD_SHRINKWRAP_NEAREST_VERTEX: - + if(scon->shrinkType == MOD_SHRINKWRAP_NEAREST_VERTEX) bvhtree_from_mesh_verts(&treeData, target, 0.0, 2, 6); else bvhtree_from_mesh_faces(&treeData, target, 0.0, 2, 6); - + if(treeData.tree == NULL) { fail = TRUE; break; } - + space_transform_apply(&transform, co); - + BLI_bvhtree_find_nearest(treeData.tree, co, &nearest, treeData.nearest_callback, &treeData); dist = len_v3v3(co, nearest.co); interp_v3_v3v3(co, co, nearest.co, (dist - scon->dist)/dist); /* linear interpolation */ space_transform_invert(&transform, co); break; - + case MOD_SHRINKWRAP_PROJECT: if(scon->projAxis & MOD_SHRINKWRAP_PROJECT_OVER_X_AXIS) no[0] = 1.0f; if(scon->projAxis & MOD_SHRINKWRAP_PROJECT_OVER_Y_AXIS) no[1] = 1.0f; if(scon->projAxis & MOD_SHRINKWRAP_PROJECT_OVER_Z_AXIS) no[2] = 1.0f; - + if(INPR(no,no) < FLT_EPSILON) { fail = TRUE; break; } - + normalize_v3(no); - - + + bvhtree_from_mesh_faces(&treeData, target, scon->dist, 4, 6); if(treeData.tree == NULL) { fail = TRUE; break; } - + if(normal_projection_project_vertex(0, co, no, &transform, treeData.tree, &hit, treeData.raycast_callback, &treeData) == FALSE) { fail = TRUE; @@ -3560,17 +3560,17 @@ static void shrinkwrap_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstr VECCOPY(co, hit.co); break; } - + free_bvhtree_from_mesh(&treeData); - + target->release(target); - + if(fail == TRUE) { /* Don't move the point */ co[0] = co[1] = co[2] = 0.0f; } - + /* co is in local object coordinates, change it to global and update target position */ mul_m4_v3(cob->matrix, co); VECCOPY(ct->matrix[3], co); @@ -3704,7 +3704,7 @@ static void damptrack_evaluate (bConstraint *con, bConstraintOb *cob, ListBase * /* construct rotation matrix from the axis-angle rotation found above * - this call takes care to make sure that the axis provided is a unit vector first */ - axis_angle_to_mat3( rmat,raxis, rangle); + axis_angle_to_mat3(rmat, raxis, rangle); /* rotate the owner in the way defined by this rotation matrix, then reapply the location since * we may have destroyed that in the process of multiplying the matrix @@ -3831,6 +3831,118 @@ static bConstraintTypeInfo CTI_SPLINEIK = { NULL /* evaluate - solved as separate loop */ }; +/* ----------- Pivot ------------- */ + +static void pivotcon_id_looper (bConstraint *con, ConstraintIDFunc func, void *userdata) +{ + bPivotConstraint *data= con->data; + + /* target only */ + func(con, (ID**)&data->tar, userdata); +} + +static int pivotcon_get_tars (bConstraint *con, ListBase *list) +{ + if (con && list) { + bPivotConstraint *data= con->data; + bConstraintTarget *ct; + + /* standard target-getting macro for single-target constraints */ + SINGLETARGET_GET_TARS(con, data->tar, data->subtarget, ct, list) + + return 1; + } + + return 0; +} + +static void pivotcon_flush_tars (bConstraint *con, ListBase *list, short nocopy) +{ + if (con && list) { + bPivotConstraint *data= con->data; + bConstraintTarget *ct= list->first; + + /* the following macro is used for all standard single-target constraints */ + SINGLETARGET_FLUSH_TARS(con, data->tar, data->subtarget, ct, list, nocopy) + } +} + +static void pivotcon_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targets) +{ + bPivotConstraint *data= con->data; + bConstraintTarget *ct= targets->first; + + float pivot[3], vec[3]; + float rotMat[3][3]; + + /* firstly, check if pivoting should take place based on the current rotation */ + if (data->rotAxis != PIVOTCON_AXIS_NONE) { + float rot[3]; + + /* extract euler-rotation of target */ + mat4_to_eulO(rot, cob->rotOrder, cob->matrix); + + /* check which range might be violated */ + if (data->rotAxis < PIVOTCON_AXIS_X) { + /* negative rotations (data->rotAxis = 0 -> 2) */ + if (rot[data->rotAxis] > 0.0f) + return; + } + else { + /* positive rotations (data->rotAxis = 3 -> 5 */ + if (rot[data->rotAxis - PIVOTCON_AXIS_X] < 0.0f) + return; + } + } + + /* find the pivot-point to use */ + if (VALID_CONS_TARGET(ct)) { + /* apply offset to target location */ + add_v3_v3v3(pivot, ct->matrix[3], data->offset); + } + else { + /* no targets to worry about... */ + if ((data->flag & PIVOTCON_FLAG_OFFSET_ABS) == 0) { + /* offset is relative to owner */ + add_v3_v3v3(pivot, cob->matrix[3], data->offset); + } + else { + /* directly use the 'offset' specified as an absolute position instead */ + VECCOPY(pivot, data->offset); + } + } + + /* get rotation matrix representing the rotation of the owner */ + // TODO: perhaps we might want to include scaling based on the pivot too? + copy_m3_m4(rotMat, cob->matrix); + normalize_m3(rotMat); + + /* perform the pivoting... */ + /* 1. take the vector from owner to the pivot */ + sub_v3_v3v3(vec, pivot, cob->matrix[3]); + /* 2. rotate this vector by the rotation of the object... */ + mul_m3_v3(rotMat, vec); + /* 3. make the rotation in terms of the pivot now */ + add_v3_v3v3(cob->matrix[3], pivot, vec); +} + + +static bConstraintTypeInfo CTI_PIVOT = { + CONSTRAINT_TYPE_PIVOT, /* type */ + sizeof(bPivotConstraint), /* size */ + "Pivot", /* name */ + "bPivotConstraint", /* struct name */ + NULL, /* free data */ + NULL, /* relink data */ + pivotcon_id_looper, /* id looper */ + NULL, /* copy data */ + NULL, /* new data */ // XXX: might be needed to get 'normal' pivot behaviour... + pivotcon_get_tars, /* get constraint targets */ + pivotcon_flush_tars, /* flush constraint targets */ + default_get_tarmat, /* get target matrix */ + pivotcon_evaluate /* evaluate */ +}; + /* ************************* Constraints Type-Info *************************** */ /* All of the constraints api functions use bConstraintTypeInfo structs to carry out * and operations that involve constraint specific code. @@ -3867,6 +3979,7 @@ static void constraints_init_typeinfo () { constraintsTypeInfo[22]= &CTI_SPLINEIK; /* Spline IK Constraint */ constraintsTypeInfo[23]= &CTI_TRANSLIKE; /* Copy Transforms Constraint */ constraintsTypeInfo[24]= &CTI_SAMEVOL; /* Maintain Volume Constraint */ + constraintsTypeInfo[25]= &CTI_PIVOT; /* Pivot Constraint */ } /* This function should be used for getting the appropriate type-info when only @@ -4149,9 +4262,9 @@ void copy_constraints (ListBase *dst, const ListBase *src, int do_extern) /* perform custom copying operations if needed */ if (cti->copy_data) cti->copy_data(con, srccon); - + /* for proxies we dont want to make extern */ - if(do_extern) { + if (do_extern) { /* go over used ID-links for this constraint to ensure that they are valid for proxies */ if (cti->id_looper) cti->id_looper(con, con_extern_cb, NULL); diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c index 69327eccfaf..361e6f3fd22 100644 --- a/source/blender/blenkernel/intern/customdata.c +++ b/source/blender/blenkernel/intern/customdata.c @@ -798,10 +798,12 @@ const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { }; const char *LAYERTYPENAMES[CD_NUMTYPES] = { - "CDMVert", "CDMSticky", "CDMDeformVert", "CDMEdge", "CDMFace", "CDMTFace", - "CDMCol", "CDOrigIndex", "CDNormal", "CDFlags","CDMFloatProperty", - "CDMIntProperty","CDMStringProperty", "CDOrigSpace", "CDOrco", "CDMTexPoly", "CDMLoopUV", - "CDMloopCol", "CDTangent", "CDMDisps", "CDWeightMCol", "CDClothOrco"}; + /* 0-4 */ "CDMVert", "CDMSticky", "CDMDeformVert", "CDMEdge", "CDMFace", + /* 5-9 */ "CDMTFace", "CDMCol", "CDOrigIndex", "CDNormal", "CDFlags", + /* 10-14 */ "CDMFloatProperty", "CDMIntProperty","CDMStringProperty", "CDOrigSpace", "CDOrco", + /* 15-19 */ "CDMTexPoly", "CDMLoopUV", "CDMloopCol", "CDTangent", "CDMDisps", + /* 20-23 */"CDWeightMCol", "CDIDMCol", "CDTextureMCol", "CDClothOrco" +}; const CustomDataMask CD_MASK_BAREMESH = CD_MASK_MVERT | CD_MASK_MEDGE | CD_MASK_MFACE; diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c index 1e5f276ba95..bdeacdf6946 100644 --- a/source/blender/blenkernel/intern/depsgraph.c +++ b/source/blender/blenkernel/intern/depsgraph.c @@ -2250,6 +2250,16 @@ void DAG_on_load_update(void) } } +static void dag_id_flush_update__isDependentTexture(void *userData, Object *ob, ID **idpoin) +{ + struct { ID *id; int is_dependent; } *data = userData; + + if(*idpoin && GS((*idpoin)->name)==ID_TE) { + if (data->id == (*idpoin)) + data->is_dependent = 1; + } +} + void DAG_id_flush_update(ID *id, short flag) { Main *bmain= G.main; @@ -2276,11 +2286,7 @@ void DAG_id_flush_update(ID *id, short flag) /* no point in trying in this cases */ if(!id || id->us <= 1) id= NULL; - /* curves and surfaces only need to mark one object, since - otherwise cu->displist would be computed multiple times */ - else if(ob->type==OB_CURVE || ob->type==OB_SURF) - id= NULL; - /* also for locked shape keys we make an exception */ + /* for locked shape keys we make an exception */ else if(ob_get_key(ob) && (ob->shapeflag & OB_SHAPE_LOCK)) id= NULL; } @@ -2291,19 +2297,38 @@ void DAG_id_flush_update(ID *id, short flag) idtype= GS(id->name); if(ELEM7(idtype, ID_ME, ID_CU, ID_MB, ID_LA, ID_LT, ID_CA, ID_AR)) { + int first_ob= 1; for(obt=bmain->object.first; obt; obt= obt->id.next) { if(!(ob && obt == ob) && obt->data == id) { + + /* try to avoid displist recalculation for linked curves */ + if (!first_ob && ELEM(obt->type, OB_CURVE, OB_SURF)) { + /* if curve object has got derivedFinal it means this + object has got constructive modifiers and object + should be recalculated anyhow */ + if (!obt->derivedFinal) + continue; + } + obt->recalc |= OB_RECALC_DATA; BKE_ptcache_object_reset(sce, obt, PTCACHE_RESET_DEPSGRAPH); - /* for these we only flag one object, otherwise cu->displist - would be computed multiple times */ - if(obt->type==OB_CURVE || obt->type==OB_SURF) - break; + first_ob= 0; } } } + /* set flags based on textures - can influence depgraph via modifiers */ + if(idtype == ID_TE) { + for(obt=bmain->object.first; obt; obt= obt->id.next) { + struct { ID *id; int is_dependent; } data = {id, 0}; + + modifiers_foreachIDLink(obt, dag_id_flush_update__isDependentTexture, &data); + if (data.is_dependent) + obt->recalc |= OB_RECALC_DATA; + } + } + /* set flags based on ShapeKey */ if(idtype == ID_KE) { for(obt=bmain->object.first; obt; obt= obt->id.next) { diff --git a/source/blender/blenkernel/intern/fcurve.c b/source/blender/blenkernel/intern/fcurve.c index 619bb1a58f9..43f01199b69 100644 --- a/source/blender/blenkernel/intern/fcurve.c +++ b/source/blender/blenkernel/intern/fcurve.c @@ -1418,7 +1418,7 @@ static float evaluate_driver (ChannelDriver *driver, float evaltime) /* this evaluates the expression using Python,and returns its result: * - on errors it reports, then returns 0.0f */ - driver->curval= BPY_pydriver_eval(driver); + driver->curval= BPY_eval_driver(driver); } #endif /* DISABLE_PYTHON*/ } diff --git a/source/blender/blenkernel/intern/fmodifier.c b/source/blender/blenkernel/intern/fmodifier.c index 868b06f2348..6fcc49f9ec1 100644 --- a/source/blender/blenkernel/intern/fmodifier.c +++ b/source/blender/blenkernel/intern/fmodifier.c @@ -44,7 +44,7 @@ #include "BKE_utildefines.h" #ifndef DISABLE_PYTHON -#include "BPY_extern.h" /* for BPY_pydriver_eval() */ +#include "BPY_extern.h" /* for BPY_eval_driver() */ #endif #define SMALL -1.0e-10 diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c index eb478eaddf5..39efd9fe72e 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -779,10 +779,12 @@ void BKE_add_image_extension(char *string, int imtype) if(!BLI_testextensie(string, ".bmp")) extension= ".bmp"; } - else if(G.have_libtiff && (imtype==R_TIFF)) { +#ifdef WITH_TIFF + else if(imtype==R_TIFF) { if(!BLI_testextensie(string, ".tif") && !BLI_testextensie(string, ".tiff")) extension= ".tif"; } +#endif #ifdef WITH_OPENEXR else if( ELEM(imtype, R_OPENEXR, R_MULTILAYER)) { if(!BLI_testextensie(string, ".exr")) @@ -980,6 +982,7 @@ void BKE_stamp_buf(Scene *scene, unsigned char *rect, float *rectf, int width, i struct StampData stamp_data; float w, h, pad; int x, y; + float h_fixed; if (!rect && !rectf) return; @@ -996,16 +999,24 @@ void BKE_stamp_buf(Scene *scene, unsigned char *rect, float *rectf, int width, i BLF_buffer_col(mono, scene->r.fg_stamp[0], scene->r.fg_stamp[1], scene->r.fg_stamp[2], 1.0); pad= BLF_width(mono, "--"); + /* use 'h_fixed' rather then 'h', aligns better */ + // BLF_width_and_height(mono, "^|/_AgPpJjlYy", &w, &h_fixed); + { + rctf box; + BLF_boundbox(mono, "^|/_AgPpJjlYy", &box); + h_fixed= box.ymax - box.ymin; + } + x= 0; y= height; if (stamp_data.file[0]) { /* Top left corner */ - BLF_width_and_height(mono, stamp_data.file, &w, &h); + BLF_width_and_height(mono, stamp_data.file, &w, &h); h= h_fixed; y -= h; /* also a little of space to the background. */ - buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y-3, w+3, y+h+3); + buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y-3, w+3, y+h+2); /* and draw the text. */ BLF_position(mono, x, y, 0.0); @@ -1017,11 +1028,11 @@ void BKE_stamp_buf(Scene *scene, unsigned char *rect, float *rectf, int width, i /* Top left corner, below File */ if (stamp_data.note[0]) { - BLF_width_and_height(mono, stamp_data.note, &w, &h); + BLF_width_and_height(mono, stamp_data.note, &w, &h); h= h_fixed; y -= h; /* and space for background. */ - buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, 0, y-2, w+3, y+h+2); + buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, 0, y-3, w+3, y+h+2); BLF_position(mono, x, y+1, 0.0); BLF_draw_buffer(mono, stamp_data.note); @@ -1032,11 +1043,11 @@ void BKE_stamp_buf(Scene *scene, unsigned char *rect, float *rectf, int width, i /* Top left corner, below File (or Note) */ if (stamp_data.date[0]) { - BLF_width_and_height(mono, stamp_data.date, &w, &h); + BLF_width_and_height(mono, stamp_data.date, &w, &h); h= h_fixed; y -= h; /* and space for background. */ - buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, 0, y-3, w+3, y+h+3); + buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, 0, y-3, w+3, y+h+2); BLF_position(mono, x, y, 0.0); BLF_draw_buffer(mono, stamp_data.date); @@ -1047,11 +1058,11 @@ void BKE_stamp_buf(Scene *scene, unsigned char *rect, float *rectf, int width, i /* Top left corner, below File, Date or Note */ if (stamp_data.rendertime[0]) { - BLF_width_and_height(mono, stamp_data.rendertime, &w, &h); + BLF_width_and_height(mono, stamp_data.rendertime, &w, &h); h= h_fixed; y -= h; /* and space for background. */ - buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, 0, y-3, w+3, y+h+3); + buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, 0, y-3, w+3, y+h+2); BLF_position(mono, x, y, 0.0); BLF_draw_buffer(mono, stamp_data.rendertime); @@ -1062,10 +1073,10 @@ void BKE_stamp_buf(Scene *scene, unsigned char *rect, float *rectf, int width, i /* Bottom left corner, leaving space for timing */ if (stamp_data.marker[0]) { - BLF_width_and_height(mono, stamp_data.marker, &w, &h); + BLF_width_and_height(mono, stamp_data.marker, &w, &h); h= h_fixed; /* extra space for background. */ - buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y, w+2, y+h+3); + buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y, w+2, y+h+2); /* and pad the text. */ BLF_position(mono, x, y+3, 0.0); @@ -1077,10 +1088,10 @@ void BKE_stamp_buf(Scene *scene, unsigned char *rect, float *rectf, int width, i /* Left bottom corner */ if (stamp_data.time[0]) { - BLF_width_and_height(mono, stamp_data.time, &w, &h); + BLF_width_and_height(mono, stamp_data.time, &w, &h); h= h_fixed; /* extra space for background */ - buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y, x+w+2, y+h+3); + buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y, x+w+2, y+h+2); /* and pad the text. */ BLF_position(mono, x, y+3, 0.0); @@ -1091,10 +1102,10 @@ void BKE_stamp_buf(Scene *scene, unsigned char *rect, float *rectf, int width, i } if (stamp_data.frame[0]) { - BLF_width_and_height(mono, stamp_data.frame, &w, &h); + BLF_width_and_height(mono, stamp_data.frame, &w, &h); h= h_fixed; /* extra space for background. */ - buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y, x+w+2, y+h+3); + buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y, x+w+2, y+h+2); /* and pad the text. */ BLF_position(mono, x, y+3, 0.0); @@ -1105,22 +1116,22 @@ void BKE_stamp_buf(Scene *scene, unsigned char *rect, float *rectf, int width, i } if (stamp_data.camera[0]) { - BLF_width_and_height(mono, stamp_data.camera, &w, &h); + BLF_width_and_height(mono, stamp_data.camera, &w, &h); h= h_fixed; /* extra space for background. */ - buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y, x+w+2, y+h+3); + buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y, x+w+2, y+h+2); BLF_position(mono, x, y+3, 0.0); BLF_draw_buffer(mono, stamp_data.camera); } if (stamp_data.scene[0]) { - BLF_width_and_height(mono, stamp_data.scene, &w, &h); + BLF_width_and_height(mono, stamp_data.scene, &w, &h); h= h_fixed; /* Bottom right corner, with an extra space because blenfont is too strict! */ x= width - w - 2; /* extra space for background. */ - buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y, x+w+3, y+h+3); + buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y, x+w+3, y+h+2); /* and pad the text. */ BLF_position(mono, x, y+3, 0.0); @@ -1128,14 +1139,14 @@ void BKE_stamp_buf(Scene *scene, unsigned char *rect, float *rectf, int width, i } if (stamp_data.strip[0]) { - BLF_width_and_height(mono, stamp_data.scene, &w, &h); + BLF_width_and_height(mono, stamp_data.scene, &w, &h); h= h_fixed; /* Top right corner, with an extra space because blenfont is too strict! */ x= width - w - pad; y= height - h; /* extra space for background. */ - buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y-3, x+w+pad, y+h+3); + buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y-3, x+w+pad, y+h+2); BLF_position(mono, x, y, 0.0); BLF_draw_buffer(mono, stamp_data.strip); @@ -1187,12 +1198,14 @@ int BKE_write_ibuf(Scene *scene, ImBuf *ibuf, char *name, int imtype, int subimt else if ((imtype==R_BMP)) { ibuf->ftype= BMP; } - else if ((G.have_libtiff) && (imtype==R_TIFF)) { +#ifdef WITH_TIFF + else if (imtype==R_TIFF) { ibuf->ftype= TIF; if(subimtype & R_TIFF_16BIT) ibuf->ftype |= TIF_16BIT; } +#endif #ifdef WITH_OPENEXR else if (imtype==R_OPENEXR || imtype==R_MULTILAYER) { ibuf->ftype= OPENEXR; diff --git a/source/blender/blenkernel/intern/implicit.c b/source/blender/blenkernel/intern/implicit.c index c625fb28840..902965bd2f6 100644 --- a/source/blender/blenkernel/intern/implicit.c +++ b/source/blender/blenkernel/intern/implicit.c @@ -37,6 +37,10 @@ #include "BKE_global.h" #include "BKE_utildefines.h" +#include "BLI_threads.h" + +#define CLOTH_OPENMP_LIMIT 25 + #ifdef _WIN32 #include static LARGE_INTEGER _itstart, _itend; @@ -230,8 +234,11 @@ DO_INLINE float dot_lfvector(float (*fLongVectorA)[3], float (*fLongVectorB)[3], { long i = 0; float temp = 0.0; +// XXX brecht, disabled this for now (first schedule line was already disabled), +// due to non-commutative nature of floating point ops this makes the sim give +// different results each time you run it! // schedule(guided, 2) -#pragma omp parallel for reduction(+: temp) +//#pragma omp parallel for reduction(+: temp) if(verts > CLOTH_OPENMP_LIMIT) for(i = 0; i < (long)verts; i++) { temp += INPR(fLongVectorA[i], fLongVectorB[i]); @@ -577,11 +584,12 @@ DO_INLINE void mul_bfmatrix_S(fmatrix3x3 *matrix, float scalar) DO_INLINE void mul_bfmatrix_lfvector( float (*to)[3], fmatrix3x3 *from, lfVector *fLongVector) { unsigned int i = 0; - lfVector *temp = create_lfvector(from[0].vcount); + unsigned int vcount = from[0].vcount; + lfVector *temp = create_lfvector(vcount); - zero_lfvector(to, from[0].vcount); + zero_lfvector(to, vcount); -#pragma omp parallel sections private(i) +#pragma omp parallel sections private(i) if(vcount > CLOTH_OPENMP_LIMIT) { #pragma omp section { @@ -962,7 +970,7 @@ DO_INLINE void BuildPPinv(fmatrix3x3 *lA, fmatrix3x3 *P, fmatrix3x3 *Pinv) unsigned int i = 0; // Take only the diagonal blocks of A -// #pragma omp parallel for private(i) +// #pragma omp parallel for private(i) if(lA[0].vcount > CLOTH_OPENMP_LIMIT) for(i = 0; i 10 || j >= 10 || k >= 10) + continue; grid[i][j][k].velocity[0] += lV[v][0]; grid[i][j][k].velocity[1] += lV[v][1]; @@ -1523,6 +1533,8 @@ static void hair_velocity_smoothing(ClothModifierData *clmd, lfVector *lF, lfVec i = HAIR_GRID_INDEX(lX[v], gmin, gmax, 0); j = HAIR_GRID_INDEX(lX[v], gmin, gmax, 1); k = HAIR_GRID_INDEX(lX[v], gmin, gmax, 2); + if (i < 0 || j < 0 || k < 0 || i > 10 || j >= 10 || k >= 10) + continue; lF[v][0] += smoothfac * (grid[i][j][k].velocity[0] - lV[v][0]); lF[v][1] += smoothfac * (grid[i][j][k].velocity[1] - lV[v][1]); @@ -1537,6 +1549,7 @@ static void hair_velocity_smoothing(ClothModifierData *clmd, lfVector *lF, lfVec free_collider_cache(&colliders); } + static void cloth_calc_force(ClothModifierData *clmd, float frame, lfVector *lF, lfVector *lX, lfVector *lV, fmatrix3x3 *dFdV, fmatrix3x3 *dFdX, ListBase *effectors, float time, fmatrix3x3 *M) { /* Collect forces and derivatives: F,dFdX,dFdV */ @@ -1731,9 +1744,10 @@ int implicit_solver (Object *ob, float frame, ClothModifierData *clmd, ListBase ClothVertex *verts = cloth->verts; unsigned int numverts = cloth->numverts; float dt = clmd->sim_parms->timescale / clmd->sim_parms->stepsPerFrame; + float spf = (float)clmd->sim_parms->stepsPerFrame / clmd->sim_parms->timescale; Implicit_Data *id = cloth->implicit; - int result = 0; - + int do_extra_solve; + if(clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL) /* do goal stuff */ { for(i = 0; i < numverts; i++) @@ -1778,60 +1792,50 @@ int implicit_solver (Object *ob, float frame, ClothModifierData *clmd, ListBase if(clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_ENABLED && clmd->clothObject->bvhtree) { - float temp = clmd->sim_parms->stepsPerFrame; - /* not too nice hack, but collisions need this correction -jahka */ - clmd->sim_parms->stepsPerFrame /= clmd->sim_parms->timescale; - // collisions // itstart(); // update verts to current positions for(i = 0; i < numverts; i++) - { + { VECCOPY(verts[i].tx, id->Xnew[i]); - + VECSUB(verts[i].tv, verts[i].tx, verts[i].txold); VECCOPY(verts[i].v, verts[i].tv); } - + // call collision function // TODO: check if "step" or "step+dt" is correct - dg - result = cloth_bvh_objcollision(ob, clmd, step/clmd->sim_parms->timescale, dt/clmd->sim_parms->timescale); - - // correct velocity again, just to be sure we had to change it due to adaptive collisions - for(i = 0; i < numverts; i++) - { - VECSUB(verts[i].tv, verts[i].tx, id->X[i]); - } + do_extra_solve = cloth_bvh_objcollision(ob, clmd, step/clmd->sim_parms->timescale, dt/clmd->sim_parms->timescale); // copy corrected positions back to simulation for(i = 0; i < numverts; i++) { - if(result) + // correct velocity again, just to be sure we had to change it due to adaptive collisions + VECSUB(verts[i].tv, verts[i].tx, id->X[i]); + + if(do_extra_solve) { if((clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_GOAL) && (verts [i].flags & CLOTH_VERT_FLAG_PINNED)) continue; - + VECCOPY(id->Xnew[i], verts[i].tx); VECCOPY(id->Vnew[i], verts[i].tv); - mul_v3_fl(id->Vnew[i], clmd->sim_parms->stepsPerFrame); + mul_v3_fl(id->Vnew[i], spf); } } - /* restore original stepsPerFrame */ - clmd->sim_parms->stepsPerFrame = temp; - // X = Xnew; cp_lfvector(id->X, id->Xnew, numverts); - + // if there were collisions, advance the velocity from v_n+1/2 to v_n+1 - if(result) + if(do_extra_solve) { // V = Vnew; cp_lfvector(id->V, id->Vnew, numverts); - + // calculate cloth_calc_force(clmd, frame, id->F, id->X, id->V, id->dFdV, id->dFdX, effectors, step+dt, id->M); @@ -1851,7 +1855,6 @@ int implicit_solver (Object *ob, float frame, ClothModifierData *clmd, ListBase cp_lfvector(id->V, id->Vnew, numverts); step += dt; - } for(i = 0; i < numverts; i++) diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c index 52c6f9355a3..d8c39abc44a 100644 --- a/source/blender/blenkernel/intern/multires.c +++ b/source/blender/blenkernel/intern/multires.c @@ -207,7 +207,7 @@ void multiresModifier_join(Object *ob) } #endif -int multiresModifier_reshapeFromDM(MultiresModifierData *mmd, Object *ob, DerivedMesh *srcdm) +int multiresModifier_reshapeFromDM(Object *ob, DerivedMesh *srcdm) { DerivedMesh *mrdm = get_multires_dm (ob); @@ -228,13 +228,13 @@ int multiresModifier_reshapeFromDM(MultiresModifierData *mmd, Object *ob, Derive } /* Returns 1 on success, 0 if the src's totvert doesn't match */ -int multiresModifier_reshape(MultiresModifierData *mmd, Object *dst, Object *src) +int multiresModifier_reshape(Object *dst, Object *src) { DerivedMesh *srcdm = src->derivedFinal; - return multiresModifier_reshapeFromDM(mmd, dst, srcdm); + return multiresModifier_reshapeFromDM(dst, srcdm); } -int multiresModifier_reshapeFromDeformMod(MultiresModifierData *mmd, Object *ob, ModifierData *md) +int multiresModifier_reshapeFromDeformMod(Object *ob, ModifierData *md) { ModifierTypeInfo *mti = modifierType_getInfo(md->type); DerivedMesh *dm, *ndm; @@ -256,7 +256,7 @@ int multiresModifier_reshapeFromDeformMod(MultiresModifierData *mmd, Object *ob, dm->release(dm); /* Reshaping */ - result= multiresModifier_reshapeFromDM(mmd, ob, ndm); + result= multiresModifier_reshapeFromDM(ob, ndm); /* Cleanup */ ndm->release(ndm); diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index 3d49548cba7..13ea55ebf0f 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -2434,7 +2434,7 @@ void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview) bNode *node; ListBase threads; ThreadData thdata; - int totnode, rendering= 1; + int totnode, curnode, rendering= 1; if(ntree==NULL) return; @@ -2455,7 +2455,7 @@ void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview) BLI_srandom(rd->cfra); /* sets need_exec tags in nodes */ - totnode= setExecutableNodes(ntree, &thdata); + curnode = totnode= setExecutableNodes(ntree, &thdata); BLI_init_threads(&threads, exec_composite_node, rd->threads); @@ -2465,14 +2465,14 @@ void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview) node= getExecutableNode(ntree); if(node) { - if(ntree->timecursor) - ntree->timecursor(ntree->tch, totnode); + if(ntree->progress) + ntree->progress(ntree->prh, (1.0 - curnode/(float)totnode)); if(ntree->stats_draw) { char str[64]; - sprintf(str, "Compositing %d %s", totnode, node->name); + sprintf(str, "Compositing %d %s", curnode, node->name); ntree->stats_draw(ntree->sdh, str); } - totnode--; + curnode--; node->threaddata = &thdata; node->exec= NODE_PROCESSING; diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 24c23e5ea41..576b3481d07 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -2879,15 +2879,18 @@ static KeyBlock *insert_meshkey(Scene *scene, Object *ob, char *name, int from_m newkey= 1; } - kb= add_keyblock(key, name); - if(newkey || from_mix==FALSE) { /* create from mesh */ + kb= add_keyblock(key, name); mesh_to_key(me, kb); } else { /* copy from current values */ - kb->data= do_ob_key(scene, ob); + float *data= do_ob_key(scene, ob); + + /* create new block with prepared data */ + kb= add_keyblock(key, name); + kb->data= data; kb->totelem= me->totvert; } @@ -2907,16 +2910,20 @@ static KeyBlock *insert_lattkey(Scene *scene, Object *ob, char *name, int from_m newkey= 1; } - kb= add_keyblock(key, name); - if(newkey || from_mix==FALSE) { + kb= add_keyblock(key, name); + /* create from lattice */ latt_to_key(lt, kb); } else { /* copy from current values */ + float *data= do_ob_key(scene, ob); + + /* create new block with prepared data */ + kb= add_keyblock(key, name); kb->totelem= lt->pntsu*lt->pntsv*lt->pntsw; - kb->data= do_ob_key(scene, ob); + kb->data= data; } return kb; @@ -2936,16 +2943,19 @@ static KeyBlock *insert_curvekey(Scene *scene, Object *ob, char *name, int from_ newkey= 1; } - kb= add_keyblock(key, name); - if(newkey || from_mix==FALSE) { /* create from curve */ + kb= add_keyblock(key, name); curve_to_key(cu, kb, lb); } else { /* copy from current values */ + float *data= do_ob_key(scene, ob); + + /* create new block with prepared data */ + kb= add_keyblock(key, name); kb->totelem= count_curveverts(lb); - kb->data= do_ob_key(scene, ob); + kb->data= data; } return kb; diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c index fffbd31aa02..0c55cc2aaac 100644 --- a/source/blender/blenkernel/intern/particle.c +++ b/source/blender/blenkernel/intern/particle.c @@ -433,7 +433,7 @@ void free_keyed_keys(ParticleSystem *psys) } } } -static void free_child_path_cache(ParticleSystem *psys) +void psys_free_child_path_cache(ParticleSystem *psys) { psys_free_path_cache_buffers(psys->childcache, &psys->childcachebufs); psys->childcache = NULL; @@ -451,7 +451,7 @@ void psys_free_path_cache(ParticleSystem *psys, PTCacheEdit *edit) psys->pathcache= NULL; psys->totcached= 0; - free_child_path_cache(psys); + psys_free_child_path_cache(psys); } } void psys_free_children(ParticleSystem *psys) @@ -462,7 +462,7 @@ void psys_free_children(ParticleSystem *psys) psys->totchild=0; } - free_child_path_cache(psys); + psys_free_child_path_cache(psys); } void psys_free_particles(ParticleSystem *psys) { @@ -1037,6 +1037,7 @@ typedef struct ParticleInterpolationData { ParticleKey *kkey[2]; PointCache *cache; + PTCacheMem *pm; PTCacheEditPoint *epoint; PTCacheEditKey *ekey[2]; @@ -1045,31 +1046,74 @@ typedef struct ParticleInterpolationData { int bspline; } ParticleInterpolationData; /* Assumes pointcache->mem_cache exists, so for disk cached particles call psys_make_temp_pointcache() before use */ -static void get_pointcache_keys_for_time(Object *ob, PointCache *cache, int index, float t, ParticleKey *key1, ParticleKey *key2) +/* It uses ParticleInterpolationData->pm to store the current memory cache frame so it's thread safe. */ +static void get_pointcache_keys_for_time(Object *ob, PointCache *cache, PTCacheMem **cur, int index, float t, ParticleKey *key1, ParticleKey *key2) { - static PTCacheMem *pm = NULL; /* not thread safe */ + static PTCacheMem *pm = NULL; if(index < 0) { /* initialize */ - pm = cache->mem_cache.first; + *cur = cache->mem_cache.first; - if(pm) - pm = pm->next; + if(*cur) + *cur = (*cur)->next; } else { - if(pm) { - while(pm && pm->next && (float)pm->frame < t) - pm = pm->next; + if(*cur) { + while(*cur && (*cur)->next && (float)(*cur)->frame < t) + *cur = (*cur)->next; + + pm = *cur; BKE_ptcache_make_particle_key(key2, pm->index_array ? pm->index_array[index] - 1 : index, pm->data, (float)pm->frame); - BKE_ptcache_make_particle_key(key1, pm->prev->index_array ? pm->prev->index_array[index] - 1 : index, pm->prev->data, (float)pm->prev->frame); + if(pm->prev->index_array && pm->prev->index_array[index] == 0) + copy_particle_key(key1, key2, 1); + else + BKE_ptcache_make_particle_key(key1, pm->prev->index_array ? pm->prev->index_array[index] - 1 : index, pm->prev->data, (float)pm->prev->frame); } else if(cache->mem_cache.first) { - PTCacheMem *pm2 = cache->mem_cache.first; - BKE_ptcache_make_particle_key(key2, pm2->index_array ? pm2->index_array[index] - 1 : index, pm2->data, (float)pm2->frame); + pm = cache->mem_cache.first; + BKE_ptcache_make_particle_key(key2, pm->index_array ? pm->index_array[index] - 1 : index, pm->data, (float)pm->frame); copy_particle_key(key1, key2, 1); } } } +static int get_pointcache_times_for_particle(PointCache *cache, int index, float *start, float *end) +{ + PTCacheMem *pm; + int ret = 0; + + for(pm=cache->mem_cache.first; pm; pm=pm->next) { + if(pm->index_array) { + if(pm->index_array[index]) { + *start = pm->frame; + ret++; + break; + } + } + else { + *start = pm->frame; + ret++; + break; + } + } + + for(pm=cache->mem_cache.last; pm; pm=pm->prev) { + if(pm->index_array) { + if(pm->index_array[index]) { + *end = pm->frame; + ret++; + break; + } + } + else { + *end = pm->frame; + ret++; + break; + } + } + + return ret == 2; +} static void init_particle_interpolation(Object *ob, ParticleSystem *psys, ParticleData *pa, ParticleInterpolationData *pind) { @@ -1091,10 +1135,15 @@ static void init_particle_interpolation(Object *ob, ParticleSystem *psys, Partic pind->dietime = (key + pa->totkey - 1)->time; } else if(pind->cache) { - get_pointcache_keys_for_time(ob, pind->cache, -1, 0.0f, NULL, NULL); - + float start, end; + get_pointcache_keys_for_time(ob, pind->cache, &pind->pm, -1, 0.0f, NULL, NULL); pind->birthtime = pa ? pa->time : pind->cache->startframe; pind->dietime = pa ? pa->dietime : pind->cache->endframe; + + if(get_pointcache_times_for_particle(pind->cache, pa - psys->particles, &start, &end)) { + pind->birthtime = MAX2(pind->birthtime, start); + pind->dietime = MIN2(pind->dietime, end); + } } else { HairKey *key = pa->hair; @@ -1224,7 +1273,7 @@ static void do_particle_interpolation(ParticleSystem *psys, int p, ParticleData memcpy(keys + 2, pind->kkey[1], sizeof(ParticleKey)); } else if(pind->cache) { - get_pointcache_keys_for_time(NULL, pind->cache, p, real_t, keys+1, keys+2); + get_pointcache_keys_for_time(NULL, pind->cache, &pind->pm, p, real_t, keys+1, keys+2); } else { hair_to_particle(keys + 1, pind->hkey[0]); @@ -2672,7 +2721,7 @@ void psys_cache_child_paths(ParticleSimulationData *sim, float cfra, int editupd } else { /* clear out old and create new empty path cache */ - free_child_path_cache(sim->psys); + psys_free_child_path_cache(sim->psys); sim->psys->childcache= psys_alloc_path_cache_buffers(&sim->psys->childcachebufs, totchild, ctx->steps+1); sim->psys->totchildcache = totchild; } @@ -2743,7 +2792,7 @@ void psys_cache_paths(ParticleSimulationData *sim, float cfra) int keyed, baked; /* we don't have anything valid to create paths from so let's quit here */ - if((psys->flag & PSYS_HAIR_DONE || psys->flag & PSYS_KEYED || psys->pointcache->flag & PTCACHE_BAKED)==0) + if((psys->flag & PSYS_HAIR_DONE || psys->flag & PSYS_KEYED || psys->pointcache)==0) return; if(psys_in_edit_mode(sim->scene, psys)) @@ -2753,7 +2802,7 @@ void psys_cache_paths(ParticleSimulationData *sim, float cfra) BLI_srandom(psys->seed); keyed = psys->flag & PSYS_KEYED; - baked = !hair_dm && psys->pointcache->flag & PTCACHE_BAKED; + baked = !hair_dm && psys->pointcache->mem_cache.first; /* clear out old and create new empty path cache */ psys_free_path_cache(psys, psys->edit); @@ -3148,7 +3197,7 @@ void psys_cache_edit_paths(Scene *scene, Object *ob, PTCacheEdit *edit, float cf edit->totcached = totpart; - if(psys && psys->part->type == PART_HAIR) { + if(psys) { ParticleSimulationData sim = {scene, ob, psys, psys_get_modifier(ob, psys), NULL}; psys_cache_child_paths(&sim, cfra, 1); } diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c index 25328a06328..ce84ee96d01 100644 --- a/source/blender/blenkernel/intern/particle_system.c +++ b/source/blender/blenkernel/intern/particle_system.c @@ -3075,66 +3075,18 @@ static void deflect_particle(ParticleSimulationData *sim, int p, float dfra, flo /* Hair */ /************************************************/ /* check if path cache or children need updating and do it if needed */ -static void psys_update_path_cache(ParticleSimulationData *sim, float cfra) +void psys_update_path_cache(ParticleSimulationData *sim, float cfra) { ParticleSystem *psys = sim->psys; ParticleSettings *part = psys->part; - ParticleEditSettings *pset = &sim->scene->toolsettings->particle; - int distr=0, alloc=0, skip=0; - - if((psys->part->childtype && psys->totchild != get_psys_tot_child(sim->scene, psys)) || psys->recalc&PSYS_RECALC_RESET) - alloc=1; - - if(alloc || psys->recalc&PSYS_RECALC_CHILD || (psys->vgroup[PSYS_VG_DENSITY] && (sim->ob && sim->ob->mode & OB_MODE_WEIGHT_PAINT))) - distr=1; - - if(distr){ - if(alloc) - realloc_particles(sim, sim->psys->totpart); - - if(get_psys_tot_child(sim->scene, psys)) { - /* don't generate children while computing the hair keys */ - if(!(psys->part->type == PART_HAIR) || (psys->flag & PSYS_HAIR_DONE)) { - distribute_particles(sim, PART_FROM_CHILD); - - if(part->from!=PART_FROM_PARTICLE && part->childtype==PART_CHILD_FACES && part->parents!=0.0) - psys_find_parents(sim); - } - } - else - psys_free_children(psys); - } - - if((part->type==PART_HAIR || psys->flag&PSYS_KEYED || psys->pointcache->flag & PTCACHE_BAKED)==0) - skip = 1; /* only hair, keyed and baked stuff can have paths */ - else if(part->ren_as != PART_DRAW_PATH && !(part->type==PART_HAIR && ELEM(part->ren_as, PART_DRAW_OB, PART_DRAW_GR))) - skip = 1; /* particle visualization must be set as path */ - else if(!psys->renderdata) { - if(part->draw_as != PART_DRAW_REND) - skip = 1; /* draw visualization */ - else if(psys->pointcache->flag & PTCACHE_BAKING) - skip = 1; /* no need to cache paths while baking dynamics */ - else if(psys_in_edit_mode(sim->scene, psys)) { - if((pset->flag & PE_DRAW_PART)==0) - skip = 1; - else if(part->childtype==0 && (psys->flag & PSYS_HAIR_DYNAMICS && psys->pointcache->flag & PTCACHE_BAKED)==0) - skip = 1; /* in edit mode paths are needed for child particles and dynamic hair */ - } - } - - if(!skip) { + + /* only hair, keyed and baked stuff can have paths */ + if(part->type==PART_HAIR || psys->flag&PSYS_KEYED || psys->pointcache->mem_cache.first) { psys_cache_paths(sim, cfra); /* for render, child particle paths are computed on the fly */ - if(part->childtype) { - if(!psys->totchild) - skip = 1; - else if((psys->part->type == PART_HAIR && psys->flag & PSYS_HAIR_DONE)==0) - skip = 1; - - if(!skip) - psys_cache_child_paths(sim, cfra, 0); - } + if(part->childtype && psys->totchild) + psys_cache_child_paths(sim, cfra, 0); } else if(psys->pathcache) psys_free_path_cache(psys, NULL); @@ -3249,6 +3201,8 @@ static void do_hair_dynamics(ParticleSimulationData *sim) psys->hair_out_dm = clothModifier_do(psys->clmd, sim->scene, sim->ob, dm, 0, 0); psys->clmd->sim_parms->effector_weights = NULL; + + psys_free_path_cache(psys, NULL); } static void hair_step(ParticleSimulationData *sim, float cfra) { @@ -3278,10 +3232,6 @@ static void hair_step(ParticleSimulationData *sim, float cfra) if(psys->part->type==PART_HAIR && psys->flag & PSYS_HAIR_DYNAMICS) do_hair_dynamics(sim); - psys_update_effectors(sim); - - psys_update_path_cache(sim, cfra); - psys->flag |= PSYS_HAIR_UPDATED; } @@ -3500,14 +3450,19 @@ static void dynamics_step(ParticleSimulationData *sim, float cfra) } free_collider_cache(&sim->colliders); + + if(psys->pathcache) + psys_free_path_cache(psys, NULL); } -static void update_children(ParticleSimulationData *sim) +void psys_update_children(ParticleSimulationData *sim) { if((sim->psys->part->type == PART_HAIR) && (sim->psys->flag & PSYS_HAIR_DONE)==0) /* don't generate children while growing hair - waste of time */ psys_free_children(sim->psys); - else if(sim->psys->part->childtype && sim->psys->totchild != get_psys_tot_child(sim->scene, sim->psys)) - distribute_particles(sim, PART_FROM_CHILD); + else if(sim->psys->part->childtype) { + if(sim->psys->totchild != get_psys_tot_child(sim->scene, sim->psys)) + distribute_particles(sim, PART_FROM_CHILD); + } else psys_free_children(sim->psys); } @@ -3762,8 +3717,6 @@ static void system_step(ParticleSimulationData *sim, float cfra) if(ELEM(cache_result, PTCACHE_READ_EXACT, PTCACHE_READ_INTERPOLATED)) { cached_step(sim, cfra); - update_children(sim); - psys_update_path_cache(sim, cfra); BKE_ptcache_validate(cache, framenr); @@ -3827,9 +3780,6 @@ static void system_step(ParticleSimulationData *sim, float cfra) BKE_ptcache_write_cache(use_cache, framenr); } - if(init) - update_children(sim); - /* cleanup */ if(psys->lattice){ end_latt_deform(psys->lattice); @@ -3992,6 +3942,13 @@ void particle_system_update(Scene *scene, Object *ob, ParticleSystem *psys) /* execute drivers only, as animation has already been done */ BKE_animsys_evaluate_animdata(&part->id, part->adt, cfra, ADT_RECALC_DRIVERS); + /* TODO: only free child paths in case of PSYS_RECALC_CHILD */ + if(psys->recalc & PSYS_RECALC) + psys_free_path_cache(psys, NULL); + + if(psys->recalc & PSYS_RECALC_CHILD) + psys_free_children(psys); + if(psys->recalc & PSYS_RECALC_TYPE) psys_changed_type(&sim); else if(psys->recalc & PSYS_RECALC_PHYS) @@ -4048,7 +4005,6 @@ void particle_system_update(Scene *scene, Object *ob, ParticleSystem *psys) if(part->phystype == PART_PHYS_KEYED) { psys_count_keyed_targets(&sim); set_keyed_keys(&sim); - psys_update_path_cache(&sim,(int)cfra); } break; } diff --git a/source/blender/blenkernel/intern/sca.c b/source/blender/blenkernel/intern/sca.c index 6a43251efdd..80904c1b1e7 100644 --- a/source/blender/blenkernel/intern/sca.c +++ b/source/blender/blenkernel/intern/sca.c @@ -44,6 +44,7 @@ #include "BKE_utildefines.h" #include "BKE_global.h" #include "BKE_main.h" +#include "BKE_library.h" /* ******************* SENSORS ************************ */ @@ -348,7 +349,19 @@ void unlink_actuators(ListBase *lb) void free_actuator(bActuator *act) { - if(act->data) MEM_freeN(act->data); + bSoundActuator *sa; + + if(act->data) { + switch (act->type) { + case ACT_SOUND: + sa = (bSoundActuator *) act->data; + if(sa->sound) + id_us_min((ID *) sa->sound); + break; + } + + MEM_freeN(act->data); + } MEM_freeN(act); } @@ -365,6 +378,7 @@ void free_actuators(ListBase *lb) bActuator *copy_actuator(bActuator *act) { bActuator *actn; + bSoundActuator *sa; act->mynew=actn= MEM_dupallocN(act); actn->flag |= ACT_NEW; @@ -372,6 +386,13 @@ bActuator *copy_actuator(bActuator *act) actn->data= MEM_dupallocN(act->data); } + switch (act->type) { + case ACT_SOUND: + sa= (bSoundActuator *)act->data; + if(sa->sound) + id_us_plus((ID *) sa->sound); + break; + } return actn; } diff --git a/source/blender/blenlib/BLI_args.h b/source/blender/blenlib/BLI_args.h index 61f83ccf6f9..cc4d65980c9 100644 --- a/source/blender/blenlib/BLI_args.h +++ b/source/blender/blenlib/BLI_args.h @@ -41,12 +41,18 @@ typedef int (*BA_ArgCallback)(int argc, char **argv, void *data); struct bArgs *BLI_argsInit(int argc, char **argv); void BLI_argsFree(struct bArgs *ba); -/* pass starts at 1, -1 means valid all the time */ -void BLI_argsAdd(struct bArgs *ba, char *arg, int pass, BA_ArgCallback cb, void *data); -void BLI_argsAddCase(struct bArgs *ba, char *arg, int pass, BA_ArgCallback cb, void *data); /* not case specific */ +/* pass starts at 1, -1 means valid all the time + * short_arg or long_arg can be null to specify no short or long versions + * */ +void BLI_argsAdd(struct bArgs *ba, int pass, char *short_arg, char *long_arg, char *doc, BA_ArgCallback cb, void *data); +/* short_case and long_case specify if those arguments are case specific */ +void BLI_argsAddCase(struct bArgs *ba, int pass, char *short_arg, int short_case, char *long_arg, int long_case, char *doc, BA_ArgCallback cb, void *data); void BLI_argsParse(struct bArgs *ba, int pass, BA_ArgCallback default_cb, void *data); +void BLI_argsPrintArgDoc(struct bArgs *ba, char *arg); +void BLI_argsPrintOtherDoc(struct bArgs *ba); + void BLI_argsPrint(struct bArgs *ba); char **BLI_argsArgv(struct bArgs *ba); diff --git a/source/blender/blenlib/intern/BLI_args.c b/source/blender/blenlib/intern/BLI_args.c index 61ddf8314e5..dc964639e68 100644 --- a/source/blender/blenlib/intern/BLI_args.c +++ b/source/blender/blenlib/intern/BLI_args.c @@ -33,10 +33,22 @@ #include "MEM_guardedalloc.h" +#include "BLI_listbase.h" #include "BLI_string.h" #include "BLI_args.h" #include "BLI_ghash.h" +char NO_DOCS[] = "NO DOCUMENTATION SPECIFIED"; + +struct bArgDoc; +typedef struct bArgDoc { + struct bArgDoc *next, *prev; + char *short_arg; + char *long_arg; + char *documentation; + int done; +} bArgDoc; + typedef struct bAKey { char *arg; uintptr_t pass; /* cast easier */ @@ -47,9 +59,11 @@ typedef struct bArgument { bAKey *key; BA_ArgCallback func; void *data; + bArgDoc *doc; } bArgument; struct bArgs { + ListBase docs; GHash *items; int argc; char **argv; @@ -70,7 +84,7 @@ static unsigned int case_strhash(void *ptr) { static unsigned int keyhash(void *ptr) { bAKey *k = ptr; - return case_strhash(k->arg) ^ BLI_ghashutil_inthash((void*)k->pass); + return case_strhash(k->arg); // ^ BLI_ghashutil_inthash((void*)k->pass); } static int keycmp(void *a, void *b) @@ -103,6 +117,7 @@ bArgs *BLI_argsInit(int argc, char **argv) bArgs *ba = MEM_callocN(sizeof(bArgs), "bArgs"); ba->passes = MEM_callocN(sizeof(int) * argc, "bArgs passes"); ba->items = BLI_ghash_new(keyhash, keycmp, "bArgs passes gh"); + ba->docs.first = ba->docs.last = NULL; ba->argc = argc; ba->argv = argv; @@ -118,6 +133,7 @@ void BLI_argsFree(struct bArgs *ba) { BLI_ghash_free(ba->items, freeItem, freeItem); MEM_freeN(ba->passes); + BLI_freelistN(&ba->docs); MEM_freeN(ba); } @@ -134,7 +150,25 @@ char **BLI_argsArgv(struct bArgs *ba) return ba->argv; } -static void internalAdd(struct bArgs *ba, char *arg, int pass, int case_str, BA_ArgCallback cb, void *data) +static bArgDoc *internalDocs(struct bArgs *ba, char *short_arg, char *long_arg, char *doc) +{ + bArgDoc *d; + + d = MEM_callocN(sizeof(bArgDoc), "bArgDoc"); + + if (doc == NULL) + doc = NO_DOCS; + + d->short_arg = short_arg; + d->long_arg = long_arg; + d->documentation = doc; + + BLI_addtail(&ba->docs, d); + + return d; +} + +static void internalAdd(struct bArgs *ba, char *arg, int pass, int case_str, BA_ArgCallback cb, void *data, bArgDoc *d) { bArgument *a; bAKey *key; @@ -157,30 +191,73 @@ static void internalAdd(struct bArgs *ba, char *arg, int pass, int case_str, BA_ a->key = key; a->func = cb; a->data = data; + a->doc = d; BLI_ghash_insert(ba->items, key, a); } -void BLI_argsAdd(struct bArgs *ba, char *arg, int pass, BA_ArgCallback cb, void *data) +void BLI_argsAddCase(struct bArgs *ba, int pass, char *short_arg, int short_case, char *long_arg, int long_case, char *doc, BA_ArgCallback cb, void *data) { - internalAdd(ba, arg, pass, 0, cb, data); + bArgDoc *d = internalDocs(ba, short_arg, long_arg, doc); + + if (short_arg) + internalAdd(ba, short_arg, pass, short_case, cb, data, d); + + if (long_arg) + internalAdd(ba, long_arg, pass, long_case, cb, data, d); + + } -void BLI_argsAddCase(struct bArgs *ba, char *arg, int pass, BA_ArgCallback cb, void *data) +void BLI_argsAdd(struct bArgs *ba, int pass, char *short_arg, char *long_arg, char *doc, BA_ArgCallback cb, void *data) { - internalAdd(ba, arg, pass, 1, cb, data); + BLI_argsAddCase(ba, pass, short_arg, 0, long_arg, 0, doc, cb, data); } +static void internalDocPrint(bArgDoc *d) +{ + if (d->short_arg && d->long_arg) + printf("%s or %s", d->short_arg, d->long_arg); + else if (d->short_arg) + printf("%s", d->short_arg); + else if (d->long_arg) + printf("%s", d->long_arg); + + printf(" %s\n\n", d->documentation); +} + +void BLI_argsPrintArgDoc(struct bArgs *ba, char *arg) +{ + bArgument *a = lookUp(ba, arg, -1, -1); + + if (a) + { + bArgDoc *d = a->doc; + + internalDocPrint(d); + + d->done = 1; + } +} + +void BLI_argsPrintOtherDoc(struct bArgs *ba) +{ + bArgDoc *d; + + for( d = ba->docs.first; d; d = d->next) + { + if (d->done == 0) + { + internalDocPrint(d); + } + } +} void BLI_argsParse(struct bArgs *ba, int pass, BA_ArgCallback default_cb, void *default_data) { int i = 0; for( i = 1; i < ba->argc; i++) { /* skip argv[0] */ - /* stop on -- */ - if (BLI_streq(ba->argv[i], "--")) - break; - if (ba->passes[i] == 0) { /* -1 signal what side of the comparison it is */ bArgument *a = lookUp(ba, ba->argv[i], pass, -1); diff --git a/source/blender/blenlib/intern/bpath.c b/source/blender/blenlib/intern/bpath.c index 8ce9511467c..a2bdcfd0076 100644 --- a/source/blender/blenlib/intern/bpath.c +++ b/source/blender/blenlib/intern/bpath.c @@ -62,7 +62,7 @@ /* for sequence */ //XXX #include "BSE_sequence.h" //XXX define below from BSE_sequence.h - otherwise potentially odd behaviour -#define SEQ_HAS_PATH(seq) (seq->type==SEQ_MOVIE || seq->type==SEQ_IMAGE) +#define SEQ_HAS_PATH(_seq) ( (_seq)->type==SEQ_MOVIE || (_seq)->type==SEQ_IMAGE || (_seq)->type==SEQ_SOUND ) @@ -262,7 +262,7 @@ static void seq_getpath(struct BPathIterator *bpi, char *path) { path[0] = '\0'; /* incase we cant get the path */ if (seq==NULL) return; if (SEQ_HAS_PATH(seq)) { - if (seq->type == SEQ_IMAGE || seq->type == SEQ_MOVIE) { + if (ELEM3(seq->type, SEQ_IMAGE, SEQ_MOVIE, SEQ_SOUND)) { BLI_strncpy(path, seq->strip->dir, FILE_MAX); BLI_add_slash(path); /* incase its missing */ if (seq->strip->stripdata) { /* should always be true! */ @@ -281,7 +281,7 @@ static void seq_setpath(struct BPathIterator *bpi, char *path) { if (seq==NULL) return; if (SEQ_HAS_PATH(seq)) { - if (seq->type == SEQ_IMAGE || seq->type == SEQ_MOVIE) { + if (ELEM3(seq->type, SEQ_IMAGE, SEQ_MOVIE, SEQ_SOUND)) { BLI_split_dirfile(path, seq->strip->dir, seq->strip->stripdata->name); } else { /* simple case */ diff --git a/source/blender/blenlib/intern/threads.c b/source/blender/blenlib/intern/threads.c index c63ceb1e5b0..0ad6f84e8f0 100644 --- a/source/blender/blenlib/intern/threads.c +++ b/source/blender/blenlib/intern/threads.c @@ -214,10 +214,7 @@ static void *tslot_thread_start(void *tslot_p) } int BLI_thread_is_main(void) { - pthread_t tid; - tid = pthread_self(); - - return !memcmp(&tid, &mainid, sizeof(pthread_t)); + return pthread_equal(pthread_self(), mainid); } void BLI_insert_thread(ListBase *threadbase, void *callerdata) diff --git a/source/blender/blenloader/BLO_writefile.h b/source/blender/blenloader/BLO_writefile.h index a95e5867c7e..182c582cc0f 100644 --- a/source/blender/blenloader/BLO_writefile.h +++ b/source/blender/blenloader/BLO_writefile.h @@ -35,10 +35,12 @@ struct MemFile; struct Main; struct ReportList; -extern int BLO_write_file(struct Main *mainvar, char *dir, int write_flags, struct ReportList *reports); +extern int BLO_write_file(struct Main *mainvar, char *dir, int write_flags, struct ReportList *reports, int *thumb); extern int BLO_write_file_mem(struct Main *mainvar, struct MemFile *compare, struct MemFile *current, int write_flags, struct ReportList *reports); extern int BLO_write_runtime(struct Main *mainvar, char *file, char *exename, struct ReportList *reports); +#define BLEN_THUMB_SIZE 128 + #endif diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 5b732d5b1de..4423758ba7f 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -2082,7 +2082,7 @@ static void direct_link_nodetree(FileData *fd, bNodeTree *ntree) ntree->init= 0; /* to set callbacks and force setting types */ ntree->owntype= NULL; - ntree->timecursor= NULL; + ntree->progress= NULL; ntree->adt= newdataadr(fd, ntree->adt); direct_link_animdata(fd, ntree->adt); @@ -4179,7 +4179,7 @@ static void lib_link_scene(FileData *fd, Main *main) if(seq->ipo) seq->ipo= newlibadr_us(fd, sce->id.lib, seq->ipo); if(seq->scene) { seq->scene= newlibadr(fd, sce->id.lib, seq->scene); - seq->scene_sound = sound_scene_add_scene_sound(sce, seq, seq->startdisp, seq->enddisp, seq->startofs); + seq->scene_sound = sound_scene_add_scene_sound(sce, seq, seq->startdisp, seq->enddisp, seq->startofs + seq->anim_startofs); } if(seq->scene_camera) seq->scene_camera= newlibadr(fd, sce->id.lib, seq->scene_camera); if(seq->sound) { @@ -4190,7 +4190,7 @@ static void lib_link_scene(FileData *fd, Main *main) seq->sound= newlibadr(fd, sce->id.lib, seq->sound); if (seq->sound) { seq->sound->id.us++; - seq->scene_sound = sound_add_scene_sound(sce, seq, seq->startdisp, seq->enddisp, seq->startofs); + seq->scene_sound = sound_add_scene_sound(sce, seq, seq->startdisp, seq->enddisp, seq->startofs + seq->anim_startofs); } } seq->anim= 0; @@ -4218,8 +4218,7 @@ static void lib_link_scene(FileData *fd, Main *main) srl->light_override= newlibadr_us(fd, sce->id.lib, srl->light_override); } /*Game Settings: Dome Warp Text*/ -// sce->r.dometext= newlibadr_us(fd, sce->id.lib, sce->r.dometext); // XXX deprecated since 2.5 - sce->gm.dome.warptext= newlibadr_us(fd, sce->id.lib, sce->gm.dome.warptext); + sce->gm.dome.warptext= newlibadr(fd, sce->id.lib, sce->gm.dome.warptext); sce->id.flag -= LIB_NEEDLINK; } @@ -10853,8 +10852,10 @@ static void do_versions(FileData *fd, Library *lib, Main *main) } } + /* put 2.50 compatibility code here until next subversion bump */ { + Object *ob; bScreen *sc; for (sc= main->screen.first; sc; sc= sc->id.next) { @@ -10876,6 +10877,41 @@ static void do_versions(FileData *fd, Library *lib, Main *main) } do_version_mdef_250(fd, lib, main); + + /* parent type to modifier */ + for(ob = main->object.first; ob; ob = ob->id.next) { + if(ob->parent) { + Object *parent= (Object *)newlibadr(fd, lib, ob->parent); + if(parent) { /* parent may not be in group */ + if(parent->type==OB_ARMATURE && ob->partype==PARSKEL) { + ArmatureModifierData *amd; + bArmature *arm= (bArmature *)newlibadr(fd, lib, parent->data); + + amd = (ArmatureModifierData*) modifier_new(eModifierType_Armature); + amd->object = ob->parent; + BLI_addtail((ListBase*)&ob->modifiers, amd); + amd->deformflag= arm->deformflag; + ob->partype = PAROBJECT; + } + else if(parent->type==OB_LATTICE && ob->partype==PARSKEL) { + LatticeModifierData *lmd; + + lmd = (LatticeModifierData*) modifier_new(eModifierType_Lattice); + lmd->object = ob->parent; + BLI_addtail((ListBase*)&ob->modifiers, lmd); + ob->partype = PAROBJECT; + } + else if(parent->type==OB_CURVE && ob->partype==PARCURVE) { + CurveModifierData *cmd; + + cmd = (CurveModifierData*) modifier_new(eModifierType_Curve); + cmd->object = ob->parent; + BLI_addtail((ListBase*)&ob->modifiers, cmd); + ob->partype = PAROBJECT; + } + } + } + } } /* WATCH IT!!!: pointers from libdata have not been converted yet here! */ @@ -10976,7 +11012,7 @@ BlendFileData *blo_read_file_internal(FileData *fd, const char *filename) switch(bhead->code) { case DATA: case DNA1: - case TEST: + case TEST: /* used as preview since 2.5x */ case REND: bhead = blo_nextbhead(fd, bhead); break; diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index 8e15601ff51..9f66d907ef5 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -62,6 +62,7 @@ Any case: direct data is ALWAYS after the lib block - write library block - per LibBlock - write the ID of LibBlock +- write TEST (128x128, blend file preview, optional) - write FileGlobal (some global vars) - write SDNA - write USER if filename is ~/.B.blend @@ -2393,9 +2394,19 @@ static void write_global(WriteData *wd, int fileflags, Main *mainvar) writestruct(wd, GLOB, "FileGlobal", 1, &fg); } +/* preview image, first 2 values are width and height + * second are an RGBA image (unsigned char) + * note, this uses 'TEST' since new types will segfault on file load for older blender versions. + */ +static void write_thumb(WriteData *wd, int *img) +{ + if(img) + writedata(wd, TEST, (2 + img[0] * img[1]) * sizeof(int), img); +} + /* if MemFile * there's filesave to memory */ static int write_file_handle(Main *mainvar, int handle, MemFile *compare, MemFile *current, - int write_user_block, int write_flags) + int write_user_block, int write_flags, int *thumb) { BHead bhead; ListBase mainlist; @@ -2410,6 +2421,7 @@ static int write_file_handle(Main *mainvar, int handle, MemFile *compare, MemFil mywrite(wd, buf, 12); write_renderinfo(wd, mainvar); + write_thumb(wd, thumb); write_global(wd, write_flags, mainvar); /* no UI save in undo */ @@ -2461,7 +2473,7 @@ static int write_file_handle(Main *mainvar, int handle, MemFile *compare, MemFil } /* return: success (1) */ -int BLO_write_file(Main *mainvar, char *dir, int write_flags, ReportList *reports) +int BLO_write_file(Main *mainvar, char *dir, int write_flags, ReportList *reports, int *thumb) { char userfilename[FILE_MAXDIR+FILE_MAXFILE]; char tempname[FILE_MAXDIR+FILE_MAXFILE+1]; @@ -2500,7 +2512,7 @@ int BLO_write_file(Main *mainvar, char *dir, int write_flags, ReportList *report makeFilesRelative(dir, NULL); /* note, making relative to something OTHER then G.sce */ /* actual file writing */ - err= write_file_handle(mainvar, file, NULL,NULL, write_user_block, write_flags); + err= write_file_handle(mainvar, file, NULL,NULL, write_user_block, write_flags, thumb); close(file); /* rename/compress */ @@ -2553,7 +2565,7 @@ int BLO_write_file_mem(Main *mainvar, MemFile *compare, MemFile *current, int wr { int err; - err= write_file_handle(mainvar, 0, compare, current, 0, write_flags); + err= write_file_handle(mainvar, 0, compare, current, 0, write_flags, NULL); if(err==0) return 1; return 0; @@ -2649,7 +2661,7 @@ int BLO_write_runtime(Main *mainvar, char *file, char *exename, ReportList *repo outfd= open(gamename, O_BINARY|O_WRONLY|O_CREAT|O_TRUNC, 0777); if (outfd != -1) { - write_file_handle(mainvar, outfd, NULL,NULL, 0, G.fileflags); + write_file_handle(mainvar, outfd, NULL,NULL, 0, G.fileflags, NULL); if (write(outfd, " ", 1) != 1) { BKE_report(reports, RPT_ERROR, "Unable to write to output file."); @@ -2735,7 +2747,7 @@ int BLO_write_runtime(Main *mainvar, char *file, char *exename, ReportList *repo datastart= lseek(outfd, 0, SEEK_CUR); - write_file_handle(mainvar, outfd, NULL,NULL, 0, G.fileflags); + write_file_handle(mainvar, outfd, NULL,NULL, 0, G.fileflags, NULL); if (!handle_write_msb_int(outfd, datastart) || (write(outfd, "BRUNTIME", 8)!=8)) { BKE_report(reports, RPT_ERROR, "Unable to write to output file."); diff --git a/source/blender/editors/CMakeLists.txt b/source/blender/editors/CMakeLists.txt index 86085aa0573..bf379ae3ca6 100644 --- a/source/blender/editors/CMakeLists.txt +++ b/source/blender/editors/CMakeLists.txt @@ -57,6 +57,10 @@ IF(WITH_OPENEXR) ADD_DEFINITIONS(-DWITH_OPENEXR) ENDIF(WITH_OPENEXR) +IF(WITH_TIFF) + ADD_DEFINITIONS(-DWITH_TIFF) +ENDIF(WITH_TIFF) + IF(WITH_OPENJPEG) ADD_DEFINITIONS(-DWITH_OPENJPEG) ENDIF(WITH_OPENJPEG) diff --git a/source/blender/editors/animation/anim_channels_edit.c b/source/blender/editors/animation/anim_channels_edit.c index 97c93c6a913..bdaf0bf700a 100644 --- a/source/blender/editors/animation/anim_channels_edit.c +++ b/source/blender/editors/animation/anim_channels_edit.c @@ -939,7 +939,7 @@ static int animchannels_delete_exec(bContext *C, wmOperator *op) /* do groups only first (unless in Drivers mode, where there are none) */ if (ac.datatype != ANIMCONT_DRIVERS) { /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_CHANNELS | ANIMFILTER_FOREDIT); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_CHANNELS | ANIMFILTER_FOREDIT | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); /* delete selected groups and their associated channels */ @@ -978,7 +978,7 @@ static int animchannels_delete_exec(bContext *C, wmOperator *op) /* now do F-Curves */ if (ac.datatype != ANIMCONT_GPENCIL) { /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_FOREDIT); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_FOREDIT | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); /* delete selected F-Curves */ @@ -1038,7 +1038,7 @@ static int animchannels_visibility_set_exec(bContext *C, wmOperator *op) ANIM_animdata_filter(&ac, &all_data, filter, ac.data, ac.datatype); /* hide all channels not selected */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_UNSEL); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_UNSEL | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); for (ale= anim_data.first; ale; ale= ale->next) { @@ -1054,7 +1054,7 @@ static int animchannels_visibility_set_exec(bContext *C, wmOperator *op) BLI_freelistN(&anim_data); /* make all the selected channels visible */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); for (ale= anim_data.first; ale; ale= ale->next) { @@ -1113,11 +1113,11 @@ static int animchannels_visibility_toggle_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; /* get list of all channels that selection may need to be flushed to */ - filter= ANIMFILTER_CHANNELS; + filter= (ANIMFILTER_CHANNELS | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(&ac, &all_data, filter, ac.data, ac.datatype); /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); /* See if we should be making showing all selected or hiding */ @@ -1215,7 +1215,8 @@ static void setflag_anim_channels (bAnimContext *ac, short setting, short mode, } /* filter data that we're working on */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CHANNELS); + // XXX: noduplis enabled so that results don't cancel, but will be problematic for some channels where only type differs + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CHANNELS | ANIMFILTER_NODUPLIS); if (onlysel) filter |= ANIMFILTER_SEL; ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); diff --git a/source/blender/editors/animation/anim_filter.c b/source/blender/editors/animation/anim_filter.c index 5ac7f6d4119..67f2cb834e0 100644 --- a/source/blender/editors/animation/anim_filter.c +++ b/source/blender/editors/animation/anim_filter.c @@ -68,6 +68,7 @@ #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" +#include "BLI_ghash.h" #include "BKE_animsys.h" #include "BKE_action.h" @@ -2512,6 +2513,65 @@ static short animdata_filter_dopesheet_summary (bAnimContext *ac, ListBase *anim return 1; } +/* ----------- Cleanup API --------------- */ + +/* Remove entries with invalid types in animation channel list */ +static int animdata_filter_remove_invalid (ListBase *anim_data) +{ + bAnimListElem *ale, *next; + int items = 0; + + /* only keep entries with valid types */ + for (ale= anim_data->first; ale; ale= next) { + next= ale->next; + + if (ale->type == ANIMTYPE_NONE) + BLI_freelinkN(anim_data, ale); + else + items++; + } + + return items; +} + +/* Remove duplicate entries in animation channel list */ +static int animdata_filter_remove_duplis (ListBase *anim_data) +{ + bAnimListElem *ale, *next; + GHash *gh; + int items = 0; + + /* build new hashtable to efficiently store and retrieve which entries have been + * encountered already while searching + */ + gh= BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "animdata_filter_duplis_remove gh"); + + /* loop through items, removing them from the list if a similar item occurs already */ + for (ale = anim_data->first; ale; ale = next) { + next = ale->next; + + /* check if hash has any record of an entry like this + * - just use ale->data for now, though it would be nicer to involve + * ale->type in combination too to capture corner cases (where same data performs differently) + */ + if (BLI_ghash_haskey(gh, ale->data) == 0) { + /* this entry is 'unique' and can be kept */ + BLI_ghash_insert(gh, ale->data, NULL); + items++; + } + else { + /* this entry isn't needed anymore */ + BLI_freelinkN(anim_data, ale); + } + } + + /* free the hash... */ + BLI_ghash_free(gh, NULL, NULL); + + /* return the number of items still in the list */ + return items; +} + /* ----------- Public API --------------- */ /* This function filters the active data source to leave only animation channels suitable for @@ -2527,7 +2587,6 @@ int ANIM_animdata_filter (bAnimContext *ac, ListBase *anim_data, int filter_mode /* only filter data if there's somewhere to put it */ if (data && anim_data) { - bAnimListElem *ale, *next; Object *obact= (ac) ? ac->obact : NULL; /* firstly filter the data */ @@ -2572,16 +2631,12 @@ int ANIM_animdata_filter (bAnimContext *ac, ListBase *anim_data, int filter_mode break; } - /* remove any weedy entries */ - // XXX this is weedy code! - for (ale= anim_data->first; ale; ale= next) { - next= ale->next; - - if (ale->type == ANIMTYPE_NONE) { - items--; - BLI_freelinkN(anim_data, ale); - } - } + /* remove any 'weedy' entries */ + items = animdata_filter_remove_invalid(anim_data); + + /* remove duplicates (if required) */ + if (filter_mode & ANIMFILTER_NODUPLIS) + items = animdata_filter_remove_duplis(anim_data); } /* return the number of items in the list */ diff --git a/source/blender/editors/armature/poselib.c b/source/blender/editors/armature/poselib.c index 71033fbe3ec..613a3bd99db 100644 --- a/source/blender/editors/armature/poselib.c +++ b/source/blender/editors/armature/poselib.c @@ -854,7 +854,7 @@ static void poselib_preview_apply (bContext *C, wmOperator *op) /* get search-string */ index= pld->search_cursor; - if (IN_RANGE(index, 0, 64)) { + if (index >= 0 && index <= 64) { memcpy(&tempstr[0], &pld->searchstr[0], index); tempstr[index]= '|'; memcpy(&tempstr[index+1], &pld->searchstr[index], 64-index); diff --git a/source/blender/editors/curve/curve_intern.h b/source/blender/editors/curve/curve_intern.h index a9f9aac70d5..ac0825ae612 100644 --- a/source/blender/editors/curve/curve_intern.h +++ b/source/blender/editors/curve/curve_intern.h @@ -85,6 +85,12 @@ void CURVE_OT_tilt_clear(struct wmOperatorType *ot); void CURVE_OT_smooth(struct wmOperatorType *ot); void CURVE_OT_smooth_radius(struct wmOperatorType *ot); +void CURVE_OT_primitive_bezier_curve_add(struct wmOperatorType *ot); +void CURVE_OT_primitive_bezier_circle_add(struct wmOperatorType *ot); +void CURVE_OT_primitive_nurbs_curve_add(struct wmOperatorType *ot); +void CURVE_OT_primitive_nurbs_circle_add(struct wmOperatorType *ot); +void CURVE_OT_primitive_nurbs_path_add(struct wmOperatorType *ot); + void CURVE_OT_de_select_first(struct wmOperatorType *ot); void CURVE_OT_de_select_last(struct wmOperatorType *ot); void CURVE_OT_select_all(struct wmOperatorType *ot); diff --git a/source/blender/editors/curve/curve_ops.c b/source/blender/editors/curve/curve_ops.c index fa341ee19ef..59e4490a63e 100644 --- a/source/blender/editors/curve/curve_ops.c +++ b/source/blender/editors/curve/curve_ops.c @@ -96,6 +96,12 @@ void ED_operatortypes_curve(void) WM_operatortype_append(CURVE_OT_shade_smooth); WM_operatortype_append(CURVE_OT_shade_flat); WM_operatortype_append(CURVE_OT_tilt_clear); + + WM_operatortype_append(CURVE_OT_primitive_bezier_curve_add); + WM_operatortype_append(CURVE_OT_primitive_bezier_circle_add); + WM_operatortype_append(CURVE_OT_primitive_nurbs_curve_add); + WM_operatortype_append(CURVE_OT_primitive_nurbs_circle_add); + WM_operatortype_append(CURVE_OT_primitive_nurbs_path_add); WM_operatortype_append(CURVE_OT_smooth); WM_operatortype_append(CURVE_OT_smooth_radius); @@ -179,8 +185,8 @@ void ED_keymap_curve(wmKeyConfig *keyconf) /* only set in editmode curve, by space_view3d listener */ keymap= WM_keymap_find(keyconf, "Curve", 0, 0); keymap->poll= ED_operator_editsurfcurve; - - WM_keymap_add_item(keymap, "OBJECT_OT_curve_add", AKEY, KM_PRESS, KM_SHIFT, 0); + + WM_keymap_add_menu(keymap, "INFO_MT_curve_add", AKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "CURVE_OT_vertex_add", LEFTMOUSE, KM_CLICK, KM_CTRL, 0); WM_keymap_add_item(keymap, "CURVE_OT_select_all", AKEY, KM_PRESS, 0, 0); diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c index 5c64b82ec87..1b1af31095a 100644 --- a/source/blender/editors/curve/editcurve.c +++ b/source/blender/editors/curve/editcurve.c @@ -4886,7 +4886,6 @@ int join_curve_exec(bContext *C, wmOperator *op) } /************ add primitive, used by object/ module ****************/ - Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname) { static int xzproj= 0; /* this function calls itself... */ @@ -5258,6 +5257,165 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname) return nu; } +static int curve_prim_add(bContext *C, wmOperator *op, int type){ + + Object *obedit= CTX_data_edit_object(C); + ListBase *editnurb; + Nurb *nu; + int newob= 0;//, type= RNA_enum_get(op->ptr, "type"); + int enter_editmode; + unsigned int layer; + float loc[3], rot[3]; + float mat[4][4]; + + //object_add_generic_invoke_options(C, op); // XXX these props don't get set right when only exec() is called + ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer); + + if(obedit==NULL || obedit->type!=OB_CURVE) { + Curve *cu; + obedit= ED_object_add_type(C, OB_CURVE, loc, rot, TRUE, layer); + newob = 1; + + cu= (Curve*)obedit->data; + cu->flag |= CU_DEFORM_FILL; + if(type & CU_PRIM_PATH) + cu->flag |= CU_PATH|CU_3D; + } + else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA); + + ED_object_new_primitive_matrix(C, loc, rot, mat); + + nu= add_nurbs_primitive(C, mat, type, newob); + editnurb= curve_get_editcurve(obedit); + BLI_addtail(editnurb, nu); + + /* userdef */ + if (newob && !enter_editmode) { + ED_object_exit_editmode(C, EM_FREEDATA); + } + + WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, obedit); + + return OPERATOR_FINISHED; +} + +static int add_primitive_bezier_exec(bContext *C, wmOperator *op) +{ + return curve_prim_add(C, op, CU_BEZIER|CU_PRIM_CURVE); +} + +void CURVE_OT_primitive_bezier_curve_add(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Add Bezier"; + ot->description= "Construct a Bezier Curve"; + ot->idname= "CURVE_OT_primitive_bezier_curve_add"; + + /* api callbacks */ + ot->invoke= ED_object_add_generic_invoke; + ot->exec= add_primitive_bezier_exec; + ot->poll= ED_operator_scene_editable; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + ED_object_add_generic_props(ot, TRUE); +} + +static int add_primitive_bezier_circle_exec(bContext *C, wmOperator *op) +{ + return curve_prim_add(C, op, CU_BEZIER|CU_PRIM_CIRCLE); +} + +void CURVE_OT_primitive_bezier_circle_add(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Add Circle"; + ot->description= "Construct a Bezier Circle"; + ot->idname= "CURVE_OT_primitive_bezier_circle_add"; + + /* api callbacks */ + ot->invoke= ED_object_add_generic_invoke; + ot->exec= add_primitive_bezier_circle_exec; + ot->poll= ED_operator_scene_editable; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + ED_object_add_generic_props(ot, TRUE); +} + +static int add_primitive_nurbs_curve_exec(bContext *C, wmOperator *op) +{ + return curve_prim_add(C, op, CU_NURBS|CU_PRIM_CURVE); +} + +void CURVE_OT_primitive_nurbs_curve_add(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Add Nurbs Curve"; + ot->description= "Construct a Nurbs Curve"; + ot->idname= "CURVE_OT_primitive_nurbs_curve_add"; + + /* api callbacks */ + ot->invoke= ED_object_add_generic_invoke; + ot->exec= add_primitive_nurbs_curve_exec; + ot->poll= ED_operator_scene_editable; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + ED_object_add_generic_props(ot, TRUE); +} + +static int add_primitive_nurbs_circle_exec(bContext *C, wmOperator *op) +{ + return curve_prim_add(C, op, CU_NURBS|CU_PRIM_CIRCLE); +} + +void CURVE_OT_primitive_nurbs_circle_add(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Add Nurbs Circle"; + ot->description= "Construct a Nurbs Circle"; + ot->idname= "CURVE_OT_primitive_nurbs_circle_add"; + + /* api callbacks */ + ot->invoke= ED_object_add_generic_invoke; + ot->exec= add_primitive_nurbs_circle_exec; + ot->poll= ED_operator_scene_editable; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + ED_object_add_generic_props(ot, TRUE); +} + +static int add_primitive_curve_path_exec(bContext *C, wmOperator *op) +{ + return curve_prim_add(C, op, CU_NURBS|CU_PRIM_PATH); +} + +void CURVE_OT_primitive_nurbs_path_add(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Add Path"; + ot->description= "Construct a Path"; + ot->idname= "CURVE_OT_primitive_nurbs_path_add"; + + /* api callbacks */ + ot->invoke= ED_object_add_generic_invoke; + ot->exec= add_primitive_curve_path_exec; + ot->poll= ED_operator_scene_editable; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + ED_object_add_generic_props(ot, TRUE); +} + + + /***************** clear tilt operator ********************/ static int clear_tilt_exec(bContext *C, wmOperator *op) diff --git a/source/blender/editors/datafiles/blenderbuttons.c b/source/blender/editors/datafiles/blenderbuttons.c index 8408bb813ae..f4afe8b0252 100644 --- a/source/blender/editors/datafiles/blenderbuttons.c +++ b/source/blender/editors/datafiles/blenderbuttons.c @@ -1,6559 +1,6560 @@ /* DataToC output of file */ -int datatoc_blenderbuttons_size= 209681; +int datatoc_blenderbuttons_size= 209697; char datatoc_blenderbuttons[]= { -137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, - 0, 2, 90, 0, 0, 2,128, 8, 6, 0, 0, 0, 68,254,214,163, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,215, 0, 0, 13,215, - 1, 66, 40,155,120, 0, 0, 10, 79,105, 67, 67, 80, 80,104,111,116,111,115,104,111,112, 32, 73, 67, 67, 32,112,114,111,102,105, -108,101, 0, 0,120,218,157, 83,103, 84, 83,233, 22, 61,247,222,244, 66, 75,136,128,148, 75,111, 82, 21, 8, 32, 82, 66,139,128, - 20,145, 38, 42, 33, 9, 16, 74,136, 33,161,217, 21, 81,193, 17, 69, 69, 4, 27,200,160,136, 3,142,142,128,140, 21, 81, 44, 12, -138, 10,216, 7,228, 33,162,142,131,163,136,138,202,251,225,123,163,107,214,188,247,230,205,254,181,215, 62,231,172,243,157,179, -207, 7,192, 8, 12,150, 72, 51, 81, 53,128, 12,169, 66, 30, 17,224,131,199,196,198,225,228, 46, 64,129, 10, 36,112, 0, 16, 8, -179,100, 33,115,253, 35, 1, 0,248,126, 60, 60, 43, 34,192, 7,190, 0, 1,120,211, 11, 8, 0,192, 77,155,192, 48, 28,135,255, - 15,234, 66,153, 92, 1,128,132, 1,192,116,145, 56, 75, 8,128, 20, 0, 64,122,142, 66,166, 0, 64, 70, 1,128,157,152, 38, 83, - 0,160, 4, 0, 96,203, 99, 98,227, 0, 80, 45, 0, 96, 39,127,230,211, 0,128,157,248,153,123, 1, 0, 91,148, 33, 21, 1,160, -145, 0, 32, 19,101,136, 68, 0,104, 59, 0,172,207, 86,138, 69, 0, 88, 48, 0, 20,102, 75,196, 57, 0,216, 45, 0, 48, 73, 87, -102, 72, 0,176,183, 0,192,206, 16, 11,178, 0, 8, 12, 0, 48, 81,136,133, 41, 0, 4,123, 0, 96,200, 35, 35,120, 0,132,153, - 0, 20, 70,242, 87, 60,241, 43,174, 16,231, 42, 0, 0,120,153,178, 60,185, 36, 57, 69,129, 91, 8, 45,113, 7, 87, 87, 46, 30, - 40,206, 73, 23, 43, 20, 54, 97, 2, 97,154, 64, 46,194,121,153, 25, 50,129, 52, 15,224,243,204, 0, 0,160,145, 21, 17,224,131, -243,253,120,206, 14,174,206,206, 54,142,182, 14, 95, 45,234,191, 6,255, 34, 98, 98,227,254,229,207,171,112, 64, 0, 0,225,116, -126,209,254, 44, 47,179, 26,128, 59, 6,128,109,254,162, 37,238, 4,104, 94, 11,160,117,247,139,102,178, 15, 64,181, 0,160,233, -218, 87,243,112,248,126, 60, 60, 69,161,144,185,217,217,229,228,228,216, 74,196, 66, 91, 97,202, 87,125,254,103,194, 95,192, 87, -253,108,249,126, 60,252,247,245,224,190,226, 36,129, 50, 93,129, 71, 4,248,224,194,204,244, 76,165, 28,207,146, 9,132, 98,220, -230,143, 71,252,183, 11,255,252, 29,211, 34,196, 73, 98,185, 88, 42, 20,227, 81, 18,113,142, 68,154,140,243, 50,165, 34,137, 66, -146, 41,197, 37,210,255,100,226,223, 44,251, 3, 62,223, 53, 0,176,106, 62, 1,123,145, 45,168, 93, 99, 3,246, 75, 39, 16, 88, -116,192,226,247, 0, 0,242,187,111,193,212, 40, 8, 3,128,104,131,225,207,119,255,239, 63,253, 71,160, 37, 0,128,102, 73,146, -113, 0, 0, 94, 68, 36, 46, 84,202,179, 63,199, 8, 0, 0, 68,160,129, 42,176, 65, 27,244,193, 24, 44,192, 6, 28,193, 5,220, -193, 11,252, 96, 54,132, 66, 36,196,194, 66, 16, 66, 10,100,128, 28,114, 96, 41,172,130, 66, 40,134,205,176, 29, 42, 96, 47,212, - 64, 29, 52,192, 81,104,134,147,112, 14, 46,194, 85,184, 14, 61,112, 15,250, 97, 8,158,193, 40,188,129, 9, 4, 65,200, 8, 19, - 97, 33,218,136, 1, 98,138, 88, 35,142, 8, 23,153,133,248, 33,193, 72, 4, 18,139, 36, 32,201,136, 20, 81, 34, 75,145, 53, 72, - 49, 82,138, 84, 32, 85, 72, 29,242, 61,114, 2, 57,135, 92, 70,186,145, 59,200, 0, 50,130,252,134,188, 71, 49,148,129,178, 81, - 61,212, 12,181, 67,185,168, 55, 26,132, 70,162, 11,208,100,116, 49,154,143, 22,160,155,208,114,180, 26, 61,140, 54,161,231,208, -171,104, 15,218,143, 62, 67,199, 48,192,232, 24, 7, 51,196,108, 48, 46,198,195, 66,177, 56, 44, 9,147, 99,203,177, 34,172, 12, -171,198, 26,176, 86,172, 3,187,137,245, 99,207,177,119, 4, 18,129, 69,192, 9, 54, 4,119, 66, 32, 97, 30, 65, 72, 88, 76, 88, - 78,216, 72,168, 32, 28, 36, 52, 17,218, 9, 55, 9, 3,132, 81,194, 39, 34,147,168, 75,180, 38,186, 17,249,196, 24, 98, 50, 49, -135, 88, 72, 44, 35,214, 18,143, 19, 47, 16,123,136, 67,196, 55, 36, 18,137, 67, 50, 39,185,144, 2, 73,177,164, 84,210, 18,210, - 70,210,110, 82, 35,233, 44,169,155, 52, 72, 26, 35,147,201,218,100,107,178, 7, 57,148, 44, 32, 43,200,133,228,157,228,195,228, - 51,228, 27,228, 33,242, 91, 10,157, 98, 64,113,164,248, 83,226, 40, 82,202,106, 74, 25,229, 16,229, 52,229, 6,101,152, 50, 65, - 85,163,154, 82,221,168,161, 84, 17, 53,143, 90, 66,173,161,182, 82,175, 81,135,168, 19, 52,117,154, 57,205,131, 22, 73, 75,165, -173,162,149,211, 26,104, 23,104,247,105,175,232,116,186, 17,221,149, 30, 78,151,208, 87,210,203,233, 71,232,151,232, 3,244,119, - 12, 13,134, 21,131,199,136,103, 40, 25,155, 24, 7, 24,103, 25,119, 24,175,152, 76,166, 25,211,139, 25,199, 84, 48, 55, 49,235, -152,231,153, 15,153,111, 85, 88, 42,182, 42,124, 21,145,202, 10,149, 74,149, 38,149, 27, 42, 47, 84,169,170,166,170,222,170, 11, - 85,243, 85,203, 84,143,169, 94, 83,125,174, 70, 85, 51, 83,227,169, 9,212,150,171, 85,170,157, 80,235, 83, 27, 83,103,169, 59, -168,135,170,103,168,111, 84, 63,164,126, 89,253,137, 6, 89,195, 76,195, 79, 67,164, 81,160,177, 95,227,188,198, 32, 11, 99, 25, -179,120, 44, 33,107, 13,171,134,117,129, 53,196, 38,177,205,217,124,118, 42,187,152,253, 29,187,139, 61,170,169,161, 57, 67, 51, - 74, 51, 87,179, 82,243,148,102, 63, 7,227,152,113,248,156,116, 78, 9,231, 40,167,151,243,126,138,222, 20,239, 41,226, 41, 27, -166, 52, 76,185, 49,101, 92,107,170,150,151,150, 88,171, 72,171, 81,171, 71,235,189, 54,174,237,167,157,166,189, 69,187, 89,251, -129, 14, 65,199, 74, 39, 92, 39, 71,103,143,206, 5,157,231, 83,217, 83,221,167, 10,167, 22, 77, 61, 58,245,174, 46,170,107,165, - 27,161,187, 68,119,191,110,167,238,152,158,190, 94,128,158, 76,111,167,222,121,189,231,250, 28,125, 47,253, 84,253,109,250,167, -245, 71, 12, 88, 6,179, 12, 36, 6,219, 12,206, 24, 60,197, 53,113,111, 60, 29, 47,199,219,241, 81, 67, 93,195, 64, 67,165, 97, -149, 97,151,225,132,145,185,209, 60,163,213, 70,141, 70, 15,140,105,198, 92,227, 36,227,109,198,109,198,163, 38, 6, 38, 33, 38, - 75, 77,234, 77,238,154, 82, 77,185,166, 41,166, 59, 76, 59, 76,199,205,204,205,162,205,214,153, 53,155, 61, 49,215, 50,231,155, -231,155,215,155,223,183, 96, 90,120, 90, 44,182,168,182,184,101, 73,178,228, 90,166, 89,238,182,188,110,133, 90, 57, 89,165, 88, - 85, 90, 93,179, 70,173,157,173, 37,214,187,173,187,167, 17,167,185, 78,147, 78,171,158,214,103,195,176,241,182,201,182,169,183, - 25,176,229,216, 6,219,174,182,109,182,125, 97,103, 98, 23,103,183,197,174,195,238,147,189,147,125,186,125,141,253, 61, 7, 13, -135,217, 14,171, 29, 90, 29,126,115,180,114, 20, 58, 86, 58,222,154,206,156,238, 63,125,197,244,150,233, 47,103, 88,207, 16,207, -216, 51,227,182, 19,203, 41,196,105,157, 83,155,211, 71,103, 23,103,185,115,131,243,136,139,137, 75,130,203, 46,151, 62, 46,155, - 27,198,221,200,189,228, 74,116,245,113, 93,225,122,210,245,157,155,179,155,194,237,168,219,175,238, 54,238,105,238,135,220,159, -204, 52,159, 41,158, 89, 51,115,208,195,200, 67,224, 81,229,209, 63, 11,159,149, 48,107,223,172,126, 79, 67, 79,129,103,181,231, - 35, 47, 99, 47,145, 87,173,215,176,183,165,119,170,247, 97,239, 23, 62,246, 62,114,159,227, 62,227, 60, 55,222, 50,222, 89, 95, -204, 55,192,183,200,183,203, 79,195,111,158, 95,133,223, 67,127, 35,255,100,255,122,255,209, 0,167,128, 37, 1,103, 3,137,129, - 65,129, 91, 2,251,248,122,124, 33,191,142, 63, 58,219,101,246,178,217,237, 65,140,160,185, 65, 21, 65,143,130,173,130,229,193, -173, 33,104,200,236,144,173, 33,247,231,152,206,145,206,105, 14,133, 80,126,232,214,208, 7, 97,230, 97,139,195,126, 12, 39,133, -135,133, 87,134, 63,142,112,136, 88, 26,209, 49,151, 53,119,209,220, 67,115,223, 68,250, 68,150, 68,222,155,103, 49, 79, 57,175, - 45, 74, 53, 42, 62,170, 46,106, 60,218, 55,186, 52,186, 63,198, 46,102, 89,204,213, 88,157, 88, 73,108, 75, 28, 57, 46, 42,174, - 54,110,108,190,223,252,237,243,135,226,157,226, 11,227,123, 23,152, 47,200, 93,112,121,161,206,194,244,133,167, 22,169, 46, 18, - 44, 58,150, 64, 76,136, 78, 56,148,240, 65, 16, 42,168, 22,140, 37,242, 19,119, 37,142, 10,121,194, 29,194,103, 34, 47,209, 54, -209,136,216, 67, 92, 42, 30, 78,242, 72, 42, 77,122,146,236,145,188, 53,121, 36,197, 51,165, 44,229,185,132, 39,169,144,188, 76, - 13, 76,221,155, 58,158, 22,154,118, 32,109, 50, 61, 58,189, 49,131,146,145,144,113, 66,170, 33, 77,147,182,103,234,103,230,102, -118,203,172,101,133,178,254,197,110,139,183, 47, 30,149, 7,201,107,179,144,172, 5, 89, 45, 10,182, 66,166,232, 84, 90, 40,215, - 42, 7,178,103,101, 87,102,191,205,137,202, 57,150,171,158, 43,205,237,204,179,202,219,144, 55,156,239,159,255,237, 18,194, 18, -225,146,182,165,134, 75, 87, 45, 29, 88,230,189,172,106, 57,178, 60,113,121,219, 10,227, 21, 5, 43,134, 86, 6,172, 60,184,138, -182, 42,109,213, 79,171,237, 87,151,174,126,189, 38,122, 77,107,129, 94,193,202,130,193,181, 1,107,235, 11, 85, 10,229,133,125, -235,220,215,237, 93, 79, 88, 47, 89,223,181, 97,250,134,157, 27, 62, 21,137,138,174, 20,219, 23,151, 21,127,216, 40,220,120,229, - 27,135,111,202,191,153,220,148,180,169,171,196,185,100,207,102,210,102,233,230,222, 45,158, 91, 14,150,170,151,230,151, 14,110, - 13,217,218,180, 13,223, 86,180,237,245,246, 69,219, 47,151,205, 40,219,187,131,182, 67,185,163,191, 60,184,188,101,167,201,206, -205, 59, 63, 84,164, 84,244, 84,250, 84, 54,238,210,221,181, 97,215,248,110,209,238, 27,123,188,246, 52,236,213,219, 91,188,247, -253, 62,201,190,219, 85, 1, 85, 77,213,102,213,101,251, 73,251,179,247, 63,174,137,170,233,248,150,251,109, 93,173, 78,109,113, -237,199, 3,210, 3,253, 7, 35, 14,182,215,185,212,213, 29,210, 61, 84, 82,143,214, 43,235, 71, 14,199, 31,190,254,157,239,119, - 45, 13, 54, 13, 85,141,156,198,226, 35,112, 68,121,228,233,247, 9,223,247, 30, 13, 58,218,118,140,123,172,225, 7,211, 31,118, - 29,103, 29, 47,106, 66,154,242,154, 70,155, 83,154,251, 91, 98, 91,186, 79,204, 62,209,214,234,222,122,252, 71,219, 31, 15,156, - 52, 60, 89,121, 74,243, 84,201,105,218,233,130,211,147,103,242,207,140,157,149,157,125,126, 46,249,220, 96,219,162,182,123,231, - 99,206,223,106, 15,111,239,186, 16,116,225,210, 69,255,139,231, 59,188, 59,206, 92,242,184,116,242,178,219,229, 19, 87,184, 87, -154,175, 58, 95,109,234,116,234, 60,254,147,211, 79,199,187,156,187,154,174,185, 92,107,185,238,122,189,181,123,102,247,233, 27, -158, 55,206,221,244,189,121,241, 22,255,214,213,158, 57, 61,221,189,243,122,111,247,197,247,245,223, 22,221,126,114, 39,253,206, -203,187,217,119, 39,238,173,188, 79,188, 95,244, 64,237, 65,217, 67,221,135,213, 63, 91,254,220,216,239,220,127,106,192,119,160, -243,209,220, 71,247, 6,133,131,207,254,145,245,143, 15, 67, 5,143,153,143,203,134, 13,134,235,158, 56, 62, 57, 57,226, 63,114, -253,233,252,167, 67,207,100,207, 38,158, 23,254,162,254,203,174, 23, 22, 47,126,248,213,235,215,206,209,152,209,161,151,242,151, -147,191,109,124,165,253,234,192,235, 25,175,219,198,194,198, 30,190,201,120, 51, 49, 94,244, 86,251,237,193,119,220,119, 29,239, -163,223, 15, 79,228,124, 32,127, 40,255,104,249,177,245, 83,208,167,251,147, 25,147,147,255, 4, 3,152,243,252, 99, 51, 45,219, - 0, 0, 0, 32, 99, 72, 82, 77, 0, 0,122, 37, 0, 0,128,131, 0, 0,249,255, 0, 0,128,233, 0, 0,117, 48, 0, 0,234, 96, - 0, 0, 58,152, 0, 0, 23,111,146, 95,197, 70, 0, 3, 40, 60, 73, 68, 65, 84,120,218,236, 93,119,120, 20,197, 3,125,187,183, - 87,114,119,201,165, 55, 18, 72,161, 67, 0,105, 10, 72,239, 66, 40, 22, 4, 17, 69,108, 63,105, 22, 4, 65, 17,165,131, 34, 85, - 69,196, 6, 40,210, 68, 16, 80,138, 72,239, 69,122,135, 0,233, 61,151,235,109,231,247, 71,110,207,203,113, 45, 16, 80, 96,222, -247,237,119,183,237,237,204,206,236,236,219, 55,141, 33,132,128,130,130,130,130,130,130,130,130,162,242,193,210, 91, 64, 65, 65, - 65, 65, 65, 65, 65,241, 31,193,134, 13, 27, 42, 98,129,117,246,151,211,190,180,251,175,115,222,197,184,147, 74,228,108,103,231, -252,248, 62, 9,103,187,255, 42,167, 16,223, 10,240,118,174, 72, 62,170,172,251,233, 20, 78, 82,217,225,188, 91,156,149,245, 28, -185, 9, 39,185, 11,233,254,241,125, 18,206,118,255, 53, 78,215,252,227, 39,111,133, 56,253,204, 83, 21, 13, 39,169,236,112,222, - 45,206, 59,125,142,188,132,147,220,105, 94,242,144,246, 31,227, 33, 1, 33, 4,220, 93, 20, 89,126, 35, 53, 53,149,113,226,103, -254,171,156,206,247, 65,224,175,204,176, 86, 34,118, 84, 54,167,203,253,172, 44,124,156,154,154,202,108,216,176, 97, 39,128,118, -149, 25,247,202, 72,119,151,184, 86, 10,239,109,136,172, 10,113, 86, 86,190,191,219,156,149,245, 44,185,114, 86, 70,190,119,151, -238,119, 49,141, 42, 43,156,149,242, 44,221,141, 60,239, 38,255,220, 49,175, 43,103,101, 60, 75,174,156,149,145,239,239, 5,103, -101, 60, 75,238, 56, 43, 35,223,123, 74,251,135,205,160, 98,111,231,166,221, 69,167,172,253,127, 89, 16,221, 45,177, 89, 1, 7, -230, 95,231,172,228, 52,250,216,206, 89,153, 95, 55,237, 43, 43,141,238, 70,126,119,230,172, 44,126, 87,158,202, 72, 39,119,156, -119, 26, 94, 15,225,172,244,184,223,105,190,191, 87,156,149,156, 70,149,242, 44,185,112,182,175,228,143,129,246, 78,235, 31, 87, - 38,103,101, 61, 75,110,194,121,199,233,228,142,243, 78,195,235, 33,156,149, 30,247,202,120,135,220, 45,222, 7, 26,119,171,250, -172,178, 57, 43,200,253, 64,113, 86,176,122,166,243, 93, 72,251,127, 53,156,149,201,233, 26,198,202,172,238,185,155,225,172, 76, -206, 10,132,245,129,227,188,223,210,253,191,120, 63, 61,241,221, 73,181,148, 39,119,244,110,132,179, 50, 57,253,228,126, 32, 56, -239, 32,237, 31, 40, 84,184,234,240, 94, 8,184, 74,254, 50, 65, 37, 59, 48,119, 83,184, 86,102, 56,219,223, 13,135,240, 46,160, -210,195,105,255, 82,254,232, 46,196,253,126,185,167,244, 89,162,207,210,127,238, 89,114,201,147,237, 43,209, 41,170, 84,231,217, -149,179, 50,174,225,204, 81, 89,121,244,110,199,189, 50,159,165,187,145,246, 20,119,224, 66, 80, 78,202, 73, 57, 41, 39,229,164, -156,148,243,161,229,124,224, 64, 8,161,195, 59, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,220, 71,240, -218, 70,171, 74,149, 42, 27, 20, 10, 69, 13, 79,251,181, 90,109, 86, 86, 86, 86, 7,122, 27,255, 61,208, 52,162,184,143,192,226, -159, 94,206, 60, 0, 98, 95, 40, 40, 40, 40, 30,104,120, 20, 90, 50,153, 44,249,220,185,115,181,120,158,135,205,102,131,213,106, -117,252,154, 76, 38,180,109,219,182,194, 13,233,163,163,163,119,137, 68,162,196,138,156, 99,179,217,110,228,228,228,180,246,114, -200, 62, 0,201, 12,243, 79,155, 64,225,191,167, 95, 0,153, 22,139,165,137, 55, 78,134, 97,146, 93,249, 60,112, 9,255,189,114, - 6, 7, 7, 31,225, 56, 46,222, 29,151,167,255, 60,207, 95,205,203,203,107,117, 47,211,232, 97, 70,116,116,244, 46,142,227, 42, -156, 63,179,179,179, 61,230,207,216,216,216,227, 44,203, 86,169, 0,165,136,231,249, 11, 89, 89, 89,173,189, 8,145,125, 0,146, -189,145,184,230, 39,134, 97,210,109, 54, 91, 51, 95,207,145, 55, 46, 55,121,212, 23,167, 67,100,113, 28, 55, 35, 42, 42,234, 13, -157, 78,103, 0, 64, 68, 34, 17,113, 10, 27, 0,192,106,181,230, 21, 23, 23, 55,160, 57,145,130,130,226,161, 16, 90, 60,207,179, - 70,163, 17, 23, 47, 94,132,135,249, 16,109,183,113,189, 90, 71,255,220, 26, 21, 20, 21, 13,171,217, 12,101, 68,164,131, 59,231, -236,105, 88, 45,102, 88, 77, 38, 84,107,222, 66, 8, 3,234,213,171, 39,242,193, 25, 63,115,230,204,168,160,160, 32, 24, 12, 6, - 24, 12, 6, 24,141, 70, 24, 12, 6,152, 76, 38,152, 76, 38,152,205,102,152,205,102, 88,173, 86, 24,141, 70,108,219,182,205,102, -177, 88,188,114, 78,157, 58, 53, 74,165, 82, 57,248,132, 69,224, 20,120, 45, 22, 11, 12, 6, 3,182,111,223,238,149,147,227,184, -248,204,204,204, 40,137, 68, 2, 66, 8,120,158, 7, 33,164,220,226,138,234,213,171,155,189, 5,242, 46,165,209,195,140, 90, 83, -151,111,140, 10,150,203, 96,229,121,164, 54,170,238,216,113,245,155, 85, 32, 86, 27,120,171, 21, 53,135, 15,114,108,175, 91,183, -174,215,252, 73, 8, 73,152,186,124, 99,136,191,156, 5, 5, 5,250, 58,117,234,100,162,108,112, 63, 79, 66, 43, 94,175,215, 71, -217,249,111, 17, 68, 44,203,150, 91, 54,111,222,140,212,212, 84, 95,113,143,127,251,237,183,163, 44, 22, 11, 76, 38, 19,140, 70, - 35, 44, 22, 11,172, 86,171, 99,177,217,108,142,197,100, 50,225,224,193,131,254, 58, 89, 51,187,116,233, 50,100,227,198,141,202, - 95,127,253, 85,153,152,152, 8,137, 68, 2,145, 72, 4,145, 72, 4,150,101,193,113, 28, 30,123,236, 49,134,102, 65, 10, 10,138, -135, 70,104, 25,141,198,107,141, 27, 55, 38,246,255,113, 50,153, 76,226,242,149, 91,165,102,205,154, 23, 92,207,243, 85, 93, 21, - 20, 21,141,113, 85,195, 0, 0, 19,174, 23, 56, 94, 16,159,180,122,196,113,204,164,140, 18, 0,128, 92, 46, 7,227,252, 25,237, - 1, 74,165, 18, 93,186,116,129, 84, 42, 69,179,102,205, 32, 22,139,221, 46, 18,137, 4, 98,177,216,231, 77, 97, 24, 6,129,129, -129,152, 56,113,162, 32,146,160, 12,144, 97, 68,171,102, 8, 0,193,215,167, 47,193,196, 19,112, 28,231, 88,252,225,148, 72, 36, - 56,117,234, 20, 56,142,131, 72, 36,114,252, 10,255,215,175, 95,143,103,158,121, 6, 28,199, 65, 46,151, 3, 62, 70, 14,118, 78, - 35,147,201, 20, 43,149, 74,205, 0, 4,113, 38, 97, 24, 38,230,118,210,232, 97, 70,176, 92,134, 23, 23,174, 5, 0,220,156, 51, -220,145,118, 7,135, 78,112, 28,147,240,218,179, 96, 24, 6, 98,177, 24, 44,203, 86, 26,103, 97, 97,161,126,192,128, 1,123,130, -130,130, 54,171,213,106,248, 16,112,184,121,243, 38, 56,142,243,152,223, 89,150,197,236,217,179,113,249,242,101,191,226,110, 48, - 24,176,120,241, 98,216,108,182,114,188,194,127,215,109,126,138,172, 41, 93,187,118, 29,180,113,227,198, 80,134, 97,240,249,231, -159, 67, 34,145,160, 71,143, 30, 8, 15, 15,199,150, 45, 91, 32,145, 72, 48,102,204, 24,154,249, 40, 40, 40,188,149,121, 98, 0, -143, 0,136,180,155, 8,165, 0, 66,156, 14,201,179,255, 70, 10,235, 12,195, 28,118,195,211,220,126, 76, 30,195, 48,135,157,214, - 77, 0,164,110,182, 23, 0,144,219, 23, 35,202,220,255, 20,167,235, 8,231,193,211,117, 57,160,108,254, 33, 0, 59, 0,180, 79, - 77, 77,221, 9, 0,217,217,217, 79,100,103,103, 3, 0,146,147,147,207, 93,184,112,161,142,160,121,236,213, 83, 18,171,213, 90, - 75,168,170, 18,220,162,206,157, 59,123,253,194,183,154,205,183, 8, 16,119, 90,202, 93,117,133, 39, 1, 99, 54,155,241,236,179, -207, 2,128,199,151,142,243,226,135,118,131,201,100, 2,199,113,168, 93, 53, 18, 31,118,107,140, 71,137, 5, 90, 13, 3,107,137, - 22,125, 2, 45, 56, 87,175, 9, 22,221,200,195,117,181, 6, 28,199,249,197,201,243,188, 71,145, 37, 18,137,176,112,225, 66, 12, - 24, 48, 0, 34,145,200, 47, 62,231, 52, 74, 74, 74,218,120,225,194,133,112,134, 97,140,246, 52,146, 89,173, 86,149,213,106, 13, -183,217,108,225, 21, 73,163,135, 25, 86,158,119,155, 15, 61,229, 89,127,210,201, 31,206,194,194, 66,125,106,106,234, 1,153, 76, -182, 36, 58, 58, 58, 51, 61, 61,221,167,208,114, 21, 63,174, 31, 21,159,125,246, 25,230,207,159,143, 14, 29, 58,248, 21, 78,163, -209, 8,134, 97,176,104,209,162, 91,246, 77,158, 60,249,150,235,249,224,100, 0,176, 85,170, 84, 25,250,199, 31,127,168,132, 99, - 35, 34, 34, 32, 22,139,209,160, 65, 3, 4, 5, 5, 97,207,158, 61,176,217,108,126, 63,151, 20, 20, 20, 15, 46,220,105, 17, 39, -180, 29, 55,110, 92,179, 25, 51,102, 76,107,217,178,229,207,251,246,237, 91,206, 48,204, 6,167, 50, 49,213, 94,190,110, 16,214, - 9, 33,205,157, 69,143, 93,172, 69, 50, 12,179, 65, 56,222,121, 93,248, 37,132,116, 6, 32, 21,214,199,141, 27,151, 50, 99,198, -140,105, 99,199,142,125,127,250,244,233,146,113,227,198, 53,156, 49, 99,198, 52,225, 58,238,194,225,206,209,242, 58,247,148, 80, - 69,117,254,252,121, 79, 85, 84,206, 47, 0,175,165,165, 50, 34,210,225,100, 77, 74, 8,119,108,159,152, 94,236,120,129, 45,104, - 90, 3, 74,165, 18,221, 38,125,234,151, 83,100, 50,153,144,155,155,235,112, 25,124, 45,254,114, 42,228, 1,216,246,118, 3,220, - 44,144,226,227,253,133,216,248,247,101,136,197, 98,116,175,215, 0, 79, 72,130, 48, 62, 65,138,183, 47,165,193, 66,252,107,211, - 75, 8,113, 43,176,132,255, 66, 21,138,191, 66,203, 37,141,110, 26, 12,134,130,139, 23, 47,234,249,178, 23,187,156, 16, 18,202, - 48, 76,169,221,229,138,245, 55,141, 30,102,164, 54,170,238,112,157, 14, 6,117,114,108,127, 70,123,202,145, 38,163, 22,126, 2, - 0,232,208,228, 49,159,207,131, 63,156, 5, 5, 5,250,214,157,218,239,180,233, 77, 63, 12, 26, 52,232,218, 95,127,253, 37,247, - 39,172,238,132,150,224,218, 10, 34,139,227, 56,152, 76, 38,191,226,110, 50,153, 60, 62, 31, 18,137,228,118, 28, 45,104,181, 90, -211,186,117,235,176, 96,193, 2,132,135,135,163,107,215,174,136,141,141,197,170, 85,171, 64, 8,193,240,225,195, 33,151,203, 5, -247,154,102, 64, 10,138,135, 27,222,180,136,108,198,140, 25,211, 92,133,140,243,186,179,128,114, 17, 83,206, 98, 45,197,199,251, -127,131,171,120, 18,174,203, 48,204,134,233,211,167,167,250, 8, 71,158, 39,161,229,117, 72,124,163,209,120,173, 81,163, 70,126, -169, 9,157, 78,151,237, 75,108,184,251,170,119,118, 9, 2, 3, 3,161, 84, 5,130,245,179,220,181, 88, 44, 14,161,178,117,235, - 86,200,229,114,244,232,209,227,142, 28, 45,179,217, 12,169, 68, 12, 54, 34, 26, 47,206,249, 11, 5,165,122,199, 11,102,199,213, -107, 56,150,147,139,183, 91,118,130, 82,158, 11,141,201,228,151,243,198,243,252, 45, 34,139,227, 56, 60,251,236,179, 14, 55,193, -185,221, 10,188, 84, 29,134,135,135, 31,225, 56, 46,222, 41,141, 2,146,147,147,129,127,218,245, 48, 60,207,107, 66, 66, 66,126, - 1, 80,133, 16, 18, 15, 32,200,159, 52,162,112,159, 63, 93,183,243, 46, 78,213,237,112, 22, 20, 20,232, 83, 83, 83, 15,216,244, -166, 31, 50, 50, 50, 14, 0, 8,120,244,209, 71, 43, 44,180, 4,129, 37, 22,139, 49,123,246,108,204,159, 63,223,177,223, 95,161, -101,181, 90,203, 9,168, 75,151, 46,149,187,150,171,176,243, 81,109, 74, 80,214,187,144, 79, 78, 78,118,156, 19, 19, 19,131,144, -144, 16,240, 60, 15,158,231, 17, 16, 16, 0,185, 92, 14,137, 68, 66, 51, 29, 5, 5,133, 55, 45,162, 31, 59,118,236,251, 12,195, -108,176, 59, 75,167,189, 8, 42,119,218,163,185,139, 88,203,243,112, 92,170, 59,177,229,252, 95,192,184,113,227, 82, 92,195,225, -174,186,210, 81,170,186, 12,187, 95, 14,206, 85, 84,149,245, 18,243,246, 34, 11, 12, 81, 65,174, 84, 66, 36, 98,193, 48, 12,241, -197,101, 54,155, 29, 5,255, 27,111,188,225,181,221,138,191,237,169,204,102, 51, 88, 78,132,172,152, 36,216,216,221,142,115,133, -133,229,196,184, 30, 83, 7,162,243,199, 33,246,243,133,235,234,104, 13, 31, 62, 28,139, 23, 47, 6,203,178,142,123,194,113, 28, -106,214,172,137,107,215,174,121,229,226, 56, 46,254,250,245,235, 81,206,247, 81, 16,177,132, 16,216,108, 54, 84,175, 94,221,112, -241,226,197, 55,233,163,123,103, 34,203,211,118,155,141,247,219,133,113,119, 92, 65, 65,129,190, 95,191,126, 59, 75, 74, 74,126, -168, 95,191,254, 37,148, 31, 2,193, 39, 31,199,113,229, 4,150, 32,178,230,205,155, 87, 78, 20, 89, 44, 22,191, 62, 4, 44, 22, -203, 45,130,103,214,172, 89,229,126, 1,160, 85,171, 86,126, 57,195, 0, 8,203,178, 68, 34,145,160, 75,151, 46,104,216,176, 33, -126,253,245, 87,240, 60,143, 97,195,134, 65, 46,151, 99,238,220,185,176, 90,173,152, 57,115, 38,117,180, 40, 40, 40,188,105, 17, -227,244,233,211, 79, 79,159, 62,221,225, 44,185, 58, 90, 30,222,187, 61,237,162, 42, 82, 16,105, 0,140,238, 4,145, 59,151,204, - 85,128, 57,111,155, 49, 99,198, 52,215,112,184, 86, 87,150, 19, 90,247, 10,217,103, 78,225,211,199, 27, 3, 40, 95, 93,184,240, -177, 58, 80, 6, 42,161, 12, 10, 68,191,245,187, 1,192, 94,232,143,245,203,209, 18,132, 86, 65, 65,129, 87,145, 85, 17, 71,139, -149,114, 88, 29, 95, 4, 34, 21,131, 51, 89,202, 9, 45, 17, 39,198,205,240, 36,176, 98, 9, 56,155,213, 47, 78, 66,200, 45, 85, -133,131, 7, 15, 6,195, 48,142, 30, 98,141, 26, 53,114,230, 98,124,189, 28, 71,135,149,181,193,115,173,142,157,153,111,160, 79, -236,237,228,207, 35,223,224,220,154,161, 0,128,214, 90,173, 35, 45,166, 54,250,167,239,192,156, 83, 59, 29,238,227, 36,188,123, - 91,156, 5, 5, 5,250, 71,235,166, 28,144,132, 5,255,112,227,198,141, 3, 0,216,254,253,251,135, 52,106,212,200,175,103, 82, -232, 92,225, 42,178,156,157, 44,225,215, 71, 15, 91, 39,225,104,243, 75, 64, 9,213,136,126,228,121, 34,228,109,149, 74,133,192, -192, 64, 71,143,219,128,128, 0, 40, 20, 10, 71,251, 78, 63,133, 27, 5, 5,197,195,139, 80, 65,232,216,197, 82, 57,167,201,222, -182, 42,213,121,221,157,227,101,119,160,118,249, 40, 95, 55,218, 5,154, 91, 8,206,154,203, 57, 27, 60,137, 52, 78, 80,144,206, -191, 49, 49, 49,191, 7, 6, 6, 38,249, 27,251,138,244, 98,179, 89,204,183, 56, 91, 12,195, 32, 48, 40, 16,242, 64, 37,228, 65, -129, 30, 93, 47,111, 66, 75,112,138,132,151,206,146, 37, 75, 16, 24, 24,136,151, 94,122,169,194,109,180, 28, 66, 75,194, 98,139, -108, 59, 68, 82,174,156,200,226, 56, 14, 34,177, 24,217,129,177, 96,197, 98,112, 86,255, 92,178,146,146, 18,112, 28,135, 15, 63, -252,208,241, 5,239, 44,178, 42, 18,103,111, 96, 25, 70,112,183,100, 53,106,212,120,151, 97,152, 4, 0,137, 90,173, 86,150,149, -149,213,145, 62,175, 94,148,129,205,114,139, 11,229,201,125,189, 93, 78,193,201,146,132, 5,255, 80,167, 78, 29,135,147,165, 80, - 40,132,222,166,190,211,152,101,221,138, 44,215, 30,130, 28,199,149,229,101, 31,189, 35,157, 29,173,233,211,167, 59,120,157,157, - 44, 1, 21,121,142,132,176,238,220,185, 19,199,142, 29,195, 27,111,188, 1,185, 92,142,249,243,231,195,106,181, 98,242,228,201, -144,203,229,144, 74,165, 52,243, 81, 80, 80, 55,171,156, 22,113, 65,158, 75, 59, 40,198, 69,212,228,185, 19, 88,206,213,132,194, -127,134, 97, 44,110,120, 77, 46, 85,138,174,219,133,223,130,233,211,167,255, 37, 56, 89, 78,219,203,133,195,167,163, 37,147,201, -146, 46, 94,188,232, 24, 8,211,219,175,201,100, 66,135, 14, 29,252,118,198,132, 94,135, 28, 39, 42, 39, 44, 20, 65,129, 80,168, -130, 32, 15, 12,116, 21, 28,140,175, 66, 92,248, 34,118, 22, 90, 31,125,244, 17, 56,142,195,226,197,139, 1, 0,239,190,251,174, -223,109,180, 4, 78,216, 24,164,147, 43,104, 60,231, 25,152,126,180, 32,103,239, 9,112, 28,135,168, 22, 79,128,127,244, 25,232, -228,129,224,108, 86,191,123, 29, 22, 22, 22,226,218,181,107, 16,137, 68,120,231,157,119,202,141,117,228,218,147,109,235,214,173, - 62,227,238,206,201,250,232, 70,161,131, 71, 46,151,179, 39, 78,156, 72,226,121, 62, 89,175,215,215,104,213,170, 21, 79, 31,101, - 31,162,136,183,250, 37,170,252,205,159,174,156, 66,155,172,146,146,146, 31,110,220,184,113, 16, 0, 59,104,208,160, 16,133, 66, -129,111,191,253, 86, 7, 64,186,106,213, 42,185, 47, 81, 36,228, 27, 95, 34, 75, 44, 22,151,229,101,127,226, 78,202, 15, 89,226, -171, 97,188, 63,121, 94, 8, 43,195, 48,176,217,108,144,203,229,229,156,172,128,128, 0,200,100, 50,154,241, 40, 40, 40,124,149, - 37,135,253, 46,199, 9,105,238, 36,170, 14,223, 14,111, 69,174,231, 11,156, 39,161, 97, 52, 26,113,246,236, 89,127,121,252, 30, - 24,179,106,179,199, 48, 41,163, 4, 12,195,224,235, 86,245,161, 84, 5, 66,161, 84,226,233, 95,119, 58, 10,238, 83,211,222,133, - 76, 25,136, 42,109,186,250, 85,144, 11, 85,135,206, 66,171,184,184, 24, 98,177, 24, 83,166, 76, 1,203,178,152, 57,115, 38,226, -226,226,144,149,149,133, 85,171, 86,249,229,104,137,108, 34,196,190, 80, 23,138,193,193, 80,189,208, 22,161, 93, 62, 66,134,137, -195, 62,131, 2,109, 13,103, 32,221, 50, 15, 38,222,230,119, 15, 44,171,213,138,157, 59,119,186, 54,120,119,180,169,178, 90,173, -176, 88, 44, 48,155,205,152, 57,115,166, 63, 61, 60,111, 73, 55,225, 30,218, 7, 65, 21, 93,184,112, 33,146, 16, 18, 6, 32, 24, - 64, 62,125, 92,189, 35,182,197,112, 68, 54,251, 31, 0, 96,253,244,151, 29,219, 63, 60,245, 79,254,156,253, 99,217, 4, 0,117, - 18,187, 86,136,179,160,160, 64,223,189, 67,171, 93, 6, 94,252,125,131, 6, 13,202, 57, 89, 1, 1, 1,140,125,221, 47,187,140, -101, 89,136, 68,162, 91,170, 11, 61,137, 45,127,218,104, 89,173, 86,199, 64,162,222,218, 51,222,142,163,245,242,203, 47, 35, 54, - 54,214,225,100, 77,154, 52, 9,114,185, 28,227,198,141,131,197, 98,193,188,121,243,104,230,163,160,160,184,231,162,236, 94,192, -109, 73,106, 48, 24,210, 26, 54,108, 8, 15,251,226, 2, 2, 2,196, 46,145,170, 82,179,102,205, 11,110,170, 16, 59, 3,216,230, -174, 80,103, 24, 6, 65,170, 32, 4, 4, 42,161,112,113,177, 2,130, 84,144, 5, 6,130,149,184, 45,204,111,225, 20,218,150, 56, - 11, 45, 97, 41, 41, 41,129, 88, 44,198,130, 5, 11,160, 82,169, 96, 52, 26,125,114, 10, 47, 29,145, 72, 4,221,205, 82,156,155, -182, 13,210,128,125,168,209,117, 0, 98,197,114, 72,246,252, 2,189,205,226,107,192,210, 91, 56,107,213,170,133, 9, 19, 38,220, - 50,172,131, 39,196,197,197,249,140,187,171,147, 53,187,126, 53, 72,164, 18,140, 58,115, 19, 70,163,145, 25, 48, 96, 0, 15, 64, - 15, 32, 79,175,215,223,240,231,126, 86, 2,238,123, 78,111,189, 98, 5,240,196,230, 78,192,184,229, 20,156, 44, 3, 47,254,254, -218,181,107,130,147, 21,172, 80, 40,240,213, 87, 95,233, 0,176,147, 39, 79, 86, 36, 36, 36,136,252,201, 75, 34,145, 8,115,230, -204,113,219, 38,203,157,232,170,200,115,228,124,110,187,118,237,220, 14, 88,234, 65,188,221,194, 41,132, 53, 60, 60,220,225,100, -217,108, 54, 71,111, 67, 97,244,121, 47, 31, 21, 52,127, 82, 78,202,249,240,112, 62,144,112, 91, 2,103,101,101,117,247,116, 66, -245,234,213, 47, 94,188,120,177,166, 48, 21,135,189,224,148, 24, 12,134, 90,173, 90,181,242,105,237,240, 60, 15,153, 76, 6, 66, - 8, 58, 78,152, 1,134, 5, 88,148,127,137, 69, 61,222, 9, 34, 17, 7,190,108,170, 15,159,189, 14,245,122,125,185,151,131,187, - 69,163,209,192,104, 52,250, 61,154,183,193, 96, 40, 55, 4, 3, 67,120, 92,255,115,229, 45,189, 15,133,197,223,118, 59, 1, 1, - 1,229,170,126,124, 56, 86,140, 63,142,150,115,213,163, 68, 42, 1, 39, 17, 11,142, 86,233,165, 75,151,250,209,108,238, 63,132, - 14, 11, 0, 80,187, 85, 15,240,188, 13,196,102, 43, 55, 77, 82,221,164,238,224,137, 13,102,139, 14, 70,163,209,215,176, 39, 76, -126,126,190,190, 95,191,126, 59, 1,124,215,167, 79,159, 11, 40, 27, 93,152, 4, 6, 6,202,196, 98, 49, 15,160, 16, 0, 41, 42, - 42, 10,206,200,200,224, 13, 6, 67, 53, 95,225,220,184,113, 35,206,158, 61,139, 54,109,218,148,155, 14, 74,112, 69,157, 71,119, -247, 39,127, 10,213,229,238, 70,132,247, 36,228,252,133, 72, 36, 66,112,112, 48, 36, 18, 9,166, 76,153, 2,137, 68, 2,133, 66, - 1, 0,152, 55,111,158, 99,240, 85, 10, 10, 10,138,135, 70,104,249, 42, 55,189, 84, 43,122,173, 66,180, 90,173,233, 9, 9, 9, - 21,186,152,205,102,203,241, 33,220,210, 87,173, 90, 37,113,118, 33,124,253, 18, 66,114,124,188,108,211,215,175, 95, 47,113,231, -110,120,154, 96,218, 23,167,205,102, 75, 79, 76, 76,244,232,152,184,131,197, 98,201,240, 37, 90,103,228,233,203,137,132, 81,103, -110,122,156, 59,145,194,103, 94,243,146, 63, 63,184,221,252,121,169,118,237,218, 25, 33, 33, 33,155,162,163,163, 11,246,238,221, - 27,222,188,121,243,112,231, 99,154, 55,111, 30,235,114,154, 9,158,231, 57, 4,195, 48,233,125,250,244,113,155,231, 5,209,228, - 38,127,166,251,202,243,135, 14, 29,146, 56,159,239,137,223,233, 57, 74,247, 67,184, 94,111,220,184, 49,235,204,227, 41,239, 91, - 44,150, 60,154, 11, 41, 40, 40, 30,122,161,165,215,235,111, 54,108,216,208,234, 97,223, 13,111,231, 22, 20, 20, 52,171,236, 8, - 88, 44,150, 86,247, 3,103,126,126,126,165,198,221,106,181,166,219, 7, 40,245,122, 12,205,226,255, 94, 26, 1, 64,110,110,238, -163, 0,160,213,106,225,107, 90,157, 10, 8,194, 74,207,159, 86,171,181,213,221,184,167,133,133,133, 45,105,206,162,160,160,160, - 66,171, 2,160,147, 17,255, 55,112, 55, 68, 43, 5, 5, 5, 5, 5, 5, 69,229,130,165,183,128,130,130,130,130,130,130,130,226, -238,128, 65, 89,207, 1,119,168, 72,111,130,206,183,113,237,109,148,147,114, 82, 78,202, 73, 57, 41, 39,229,124,232, 56,125,113, - 63, 48,189, 25,239, 69,123,233,206,148,147,114, 82, 78,202, 73, 57, 41, 39,229,164,156, 15, 35, 8, 33,180,234,144,130,130,130, -130,130,130,130,226,110,129,163,183,224, 95,131, 8, 21, 24, 81,223, 15,213, 28, 10,192,211,132,113, 38,134, 97,138,110,131,147, - 1, 32,177, 47,194, 64, 71, 22, 0,102, 0,102,134, 97,136,111,142,143,217,204,204,208, 20, 98, 19, 55, 39, 12, 35,230,121,252, - 93,173, 90,213,227, 12,243,132, 9, 0,148,209,117,235, 5, 42,229,157,141,102, 83,146, 76, 44, 61, 91,172,213,108, 53,230, 94, - 76,163,217,131,130,226, 95, 65, 47, 0, 19, 81,214,172,100, 58,128,149,244,150, 80, 80,220, 37,161, 21, 24, 24,120,132,101,217, -120, 95,227,243, 8,176,207,101,150, 94, 84, 84,212,172, 2,215,238, 23, 24, 24,216, 65, 44, 22, 63, 14, 0, 22,139,101,175, 70, -163,249, 11,192, 42, 0,214,219,140,147, 10,192,179, 0, 6,218,215,127,178, 23, 22,234,219,228,107, 24, 28, 28,188, 70, 44, 22, -147,252,252,252, 22, 0, 16, 30, 30,126,192, 98,177, 48,106,181,250,105, 0, 39, 43,200,199,138,197,226,217, 45, 90,180,104,187, -123,247,238,239, 0, 44,168,164,180,148,177, 44,235, 86,160,240, 60,159,120, 27, 34, 75, 2, 32,120,193,130, 5,225,203,150, 45, -107,156,158,158,222, 0, 0,226,227,227, 79, 13, 26, 52,232,248,136, 17, 35, 10, 8, 33, 37, 12,195,152,189,241,100,102,134,166, -228,102, 95,125, 35, 39,247,236,179, 0, 16, 19,219, 96,165, 72,196, 74, 8, 57,186, 95, 17, 49, 48,162,102,141,196,255,253,252, -237, 2, 73, 98, 82, 85,108,223,119,236,145, 17,111,190,159,146, 1,124, 70,197,214,189, 67, 80, 80,208, 17,150,101,227,189, 61, -227,238,158,121,155,205,150, 94, 88, 88,216,204, 19, 39,199,113,241,222,202, 11,119,219,120,158,191,154,159,159,239,118,168, 9, -149, 74,181,159,227,184, 36,127,185,132, 95,171,213,154,238,169,151,174, 74,165, 58, 34, 18,137,226,189,197,211,221, 62,158,231, -175,230,229,229,121, 10,231, 45,113,175,140,112,222, 14,167,183,112, 10,229, 17,128,121,225,225,225,143, 21, 20, 20, 60, 15,224, -125,181, 90,221, 72, 36, 18, 33, 44, 44,236,125,147,201,116, 57, 56, 56,248,155,146,146,146,125, 0,222, 4, 64,231, 75,165,160, -168, 44,168, 84,170, 28,141, 70, 67, 4,240, 60, 79, 44, 22, 11, 49, 26,141, 68,175,215, 19,173, 86, 75, 52, 26, 13, 81,171,213, -164,164,164,132, 20, 20, 20,144,200,200, 72,215,193, 27, 61,213,225, 54, 80,169, 84, 23,103,204,152, 97,188,118,237, 26, 49,155, -205,196,108, 54,147,180,180, 52,242,233,167,159, 26, 85, 42,213, 69, 0, 13, 60,156,219,217, 67, 97,209, 5,192,242,198,141, 27, -155, 54,110,220, 72, 12, 6, 3,209,106,181,100,229,202,149,164,126,253,250, 38, 0,203,237,199,176,126,114, 2, 64,235,152,152, -152,244, 43, 87,174,216,182,110,221,106, 14, 14, 14,222, 22, 28, 28,188, 45, 45, 45,205,118,229,202, 21, 62, 34, 34, 34, 29, 64, -235, 10,132, 19, 0,158, 25, 53,106, 84, 78, 90, 90, 26,105,215,174,221,223, 78,219, 25,248,158,231,174,179, 59, 39,139, 16, 18, - 67, 8,137, 69,217, 32,151,183, 44,132,144, 88,251, 49,161,126,114, 42,175, 94,189, 90, 53, 58, 58,122, 6,195, 48, 38, 87, 62, -134, 97, 76,209,209,209, 51,174, 94,189, 90,149, 16,162,244,198,153,126, 99,225,171,155, 54,118, 42,214, 22,157, 39,218,162,243, -228,187,239,219,171, 95, 31,241,252,242,216,234, 77, 22,135,196,167, 44, 56,123,254,210, 34, 66,200,162,191, 14, 95, 92,244,209, -151,191, 47,122,114,196,220,175,194, 19, 26,191, 94,129,251,121, 39,160,156, 0, 66, 66, 66,178,181, 90, 45, 33,132, 16,155,205, - 70,204,102, 51, 49, 26,141, 68,167,211, 17,141, 70, 67, 74, 75, 75, 29,207,121, 73, 73,137,227,127, 84, 84,148,199,231, 61, 52, - 52, 52, 71,175,215,151, 43, 59, 76, 38,147,163,252,208,233,116, 68,167,211, 17,173, 86,235, 88, 52, 26, 13,169, 82,165,202, 77, - 47,225,204, 18,194,201,243, 60,177, 90,173,196,108, 54, 59,120, 13, 6, 67,185,197,104, 52, 18,163,209, 72, 18, 18, 18,252, 14, -167, 63,156, 6,131,129,196,199,199,103,122,226, 12, 11, 11,203, 49, 24, 12,229, 56,157,227,239,202, 43,172,199,196,196,100, 87, -132,211,159,112,122,187,159,118, 44,184,112,225, 2,209,235,245, 36, 46, 46,174,224,233,167,159,182,216,108, 54,178,113,227, 70, -210,184,113, 99,190,125,251,246,230,252,252,124,242,210, 75, 47, 17, 47, 31,133,244, 57,162,156, 20,158, 77, 11,207,142, 22,195, - 48, 80, 42,149, 88,177, 98,133,199,233, 56,156,255, 87,171, 86,205,223,235, 54, 75, 74, 74,218,185,103,207, 30,121,108,236, 63, - 3, 98,155, 76, 38,132,134,134, 98,216,176, 97,210, 94,189,122,213,236,218,181,235,129,235,215,175,183, 3,112,196, 7,223, 83, -145,145,145,159,127,248,225,135,209,253,251,247, 71,120,120,185, 65,183,209,175, 95, 63, 60,253,244,211,146, 11, 23, 46, 12, 88, -178,100,201,128,133, 11, 23,102,107, 52,154, 17, 0,126,241, 70, 42,151,203,251, 84,169, 82,229,171, 61,123,246, 68, 69, 69, 69, - 33, 57, 57,153, 29, 51,102, 76,205, 90,181,106,201,227,227,227,217,172,172, 44,252,250,235,175,113,207, 61,247,220,234,156,156, -156,255,153,205,230,117,126,196, 93, 26, 30, 30,254,254,255,254,247,191, 8,181, 90,109, 61,122,244,232, 69, 97,187, 84, 42,157, -220,178,101,203,230, 59,118,236,248, 17,192, 55,183,227,100, 17, 66,212,248,167,138, 79,128, 69,216,239,143,179, 69, 8,145,254, -253,247,223, 97, 45, 91,182,252,197,104, 52, 54,121,227,141, 55,110, 76,155, 54, 77,174, 82,169, 84, 0, 24,181, 90, 93, 52,113, -226, 68,211,220,185,115,223,171, 87,175, 94,167,253,251,247, 63, 69, 8,177,216, 5,217,173,124, 12,227, 8,207,205,140, 60,236, -220,199, 75, 39,140,123, 55,254,147,169, 73,215, 15,159,185,201,115,114, 21,126,219,117, 26, 57, 5, 26,252,190,255, 12, 98,194, -131, 24,137, 76,156, 18, 28, 87,191, 93, 73,198,153, 93,240, 50, 66, 58, 69,229,128, 97, 24, 40, 20, 10,252,246,219,111,183, 76, - 93,229,110, 90, 43,142,227, 16, 18, 18,226,115,118,131,128,128, 0,108,221,186,213,237,220,139,238,166,244, 9, 14, 14,134,183, -143, 13,134, 97, 16, 16, 16,128,189,123,247,130,101, 89,183, 83, 3,185,110, 83, 42,149, 96,189,204,117, 37,112,238,218,181,203, - 39,151,240, 27, 24, 24, 8,148, 85,253,123,126, 40,101, 50,236,217,179,199, 99,156, 93,255, 7,218,231,123,245,197,185,119,239, -222,114, 83,127,185, 78, 9,230,188,174, 84, 42,193,248, 32, 13, 13, 13,109, 17, 31, 31,143, 67,135, 14, 97,213,170, 85, 97, 41, - 41, 41,184,116,233, 18, 24,134,193,180,105,211,152,250,245,235,139,179,179,179,209,166, 77, 27,172, 93,187,182,149, 90,173,166, - 15, 12,197,191, 37, 88,196, 0, 30, 1, 16,137,178,102, 55,165, 0, 66, 80, 54,147,134, 20, 64, 1, 0,185,125, 49, 2,208, 0, -136,176,159,158,111, 47, 91,156, 5, 66,158,243,228,211,132,144,230,118,110, 97,134,138, 72,167, 99,133,107,184,174,187,254,186, -229,230, 0, 96,195,134, 13,194,203,172,125,106,106,234, 78,231,200,249, 35,178,132,121,202,220, 60,211,174, 93, 52,101, 74,165, -114,205,129, 3, 7,228,145,145,255,196,193,104, 52,162,180,180, 20, 26,141, 6,165,165,165, 8, 10, 10,194,170, 85,171,228,157, - 58,117, 90, 83, 90, 90, 90,203,126,211, 60,113,206,201,202,202,138,182, 90,173,144, 74,221, 55, 81, 98, 89, 22,117,235,214,197, -251,239,191,143,110,221,186,197,116,232,208, 97,142,139,208,186,165, 43,169, 66,161,248,234,232,209,163, 81, 10,133, 2, 23, 47, - 94, 68,122,122, 58, 70,141, 26, 85,149,231,121,220,188,121, 19,151, 46, 93, 66, 70, 70, 6,150, 44, 89, 18,213,183,111,223,175, -220, 8, 45,119,221, 83,223,120,251,237,183,235,132,134,134,178,159,126,250,105,177, 86,171,253,194,190,125,194,252,249,243, 95, -104,219,182,109,212, 43,175,188, 66,246,238,221,187,204,158,112, 30,239,167,115,155, 44,123, 53, 31,236,153,239,156,203, 57,117, -157,246,131, 16, 18, 3,192,200, 48, 76,177, 27, 78, 6, 64,112,215,174, 93,223, 49, 26,141, 77,246,236,217,115,249,241,199, 31, - 79, 0,144, 37,100,190,224,224, 96,229,156, 57,115,162, 83, 83, 83, 47,116,236,216,177, 73,215,174, 93,223,201,203,203,155, 70, - 8,201,115,106,179,229,224,228,121,252, 29, 19,219, 96,229,174,253, 35,158,221,177,215, 36,121,247,205,143,110, 84,171,154, 88, -242,247,197, 66,219,153,171,121, 40,213, 91,241,100,199,178, 9,204, 91, 52,168,134,207, 87,236,193,176,183, 62, 16,255,178,114, -233,211,151, 9,148,154,204, 51, 27,189,220,207, 59, 5,229,132,163,138, 9, 98,177, 24, 79, 60,241, 4, 24,134,185,101, 46, 79, -177, 88,140,253,251,247,163, 99,199,142, 16,139,197,120,249,229,151,253,226,228, 56, 14, 93,187,118,117,204,163,232,204,231, 42, - 26, 60,104,130,109,183,124, 29,114, 28, 88,150,245, 56,145,182, 43,167,175,114, 73, 8,167, 55, 46,231,125,190,194,105,159,242, -200,111,145,229, 47,167, 16, 78,142,227,208,170, 85, 43, 28, 63,126,220,171,232,242,160, 47,203,197,189,168,168,232,197, 90,181, -106,237, 90,176, 96, 65, 24, 0, 20, 20, 20, 56, 38,188, 23,137, 68, 56,127,254, 60, 76, 38, 19, 62,254,248, 99,179, 90,173,126, -133, 62, 71,148,243,110,114,122,211, 34, 0,218,142, 27, 55,174,217,140, 25, 51,166,181,108,217,242,231,125,251,246, 45,103, 24, -102, 3, 33, 36, 85,248, 29, 55,110, 92,202,140, 25, 51,166,141, 29, 59,246,253,233,211,167,159,102, 24,102, 3, 0,184,174,219, -203,146, 84, 23, 17, 23, 41,240,216,159,185,114,199,186, 91,119,253,117,199,237, 16, 90, 0,144,154,154,202,216, 35,201, 56, 23, -106,254, 10, 45,127,230,238,227, 56,110,248,180,105,211,162,189,137, 44,141, 70,131,204,204, 76, 36, 36, 36,224,229,151, 95,142, - 94,176, 96,193,112,171,213, 58,203, 11,173, 68, 36, 18,225,208,161, 67,200,205,205, 69,195,134, 13,145,148,148, 84,238,128, 43, - 87,174, 96,211,166, 77, 40, 46, 46, 70,211,166, 77,129,178,198,221,110,209,168, 81,163,143,235,214,173,219,149,101, 89,171, 92, - 46,199,223,127,255,141, 38, 77,154, 96,197,138, 21,168, 86,173, 26, 20, 10, 5, 46, 92,184,128,134, 13, 27, 98,231,206,157,136, -140,140, 68,227,198,141,173,106,181,122,119, 97, 97,225, 95,215,175, 95,255,216, 83, 56,227,226,226, 62,122,253,245,215,165,153, -153,153,252, 15, 63,252,176, 7,192, 30, 0,195, 63,248,224,131, 33,221,186,117,139, 58,118,236, 88,201,225,195,135, 15,122, 16, - 89,254, 56, 89, 86,215,151,146,205,102, 51,234,245,122,147,209,104,180,176, 44,155,198, 48,140,201,102,179,213,242,100, 66, 12, - 30, 60,184,122,126,126,254,176,183,222,122,235,154, 93,100,157, 71, 89, 3,120, 0,128,213,106, 53,106, 52, 26,117,203,150, 45, - 19,158,123,238,185,203,203,151, 47, 31, 54,120,240,224, 85, 63,252,240,131, 6,128,222,149,176, 90,181,170,199, 69, 34, 86,162, - 45, 13,187,186,122,213, 55,111,111, 90, 63,188,234,205,155, 25, 53,195, 35, 34,181,146,192,200,204, 85, 63,125,127, 4,128, 41, - 51, 79,141,147, 87,178, 33, 22,139,112,246,102, 9,218,118,239, 39,190,124,113,106,107, 0, 27,233,183,220,221,255, 88, 20, 38, -161,222,177, 99,135, 87, 71,107,255,254,253, 16,139,197,144,203,229,152, 59,119,174, 87, 82, 65, 24, 8,110,145, 47, 49, 35, 76, -142,238,205,125,226,121,222, 49,209,187,235,242,197, 23, 95,224,173,183,222, 42,119, 13,187,216, 96,124,113,122, 10, 95, 66, 98, - 34,114,115,114,202,109,243,103, 82,122,155,205, 6,177, 88,140,197,139, 23, 35, 53, 53, 21, 27, 54,108,240,250,251,196, 19, 79, -128,101, 89,226,207,253,108,213,170, 21,204,102,179, 35,204,231,207,159,119,203,187,112,225, 66, 95,193,236, 5, 96, 98,147, 38, - 77, 84, 29, 58,116,192,174, 93,187,240,244,211, 79, 27,205,102,243, 69, 0,232,217,179,103,237, 5, 11, 22, 72,143, 30, 61,138, -240,240,112,241,141, 27, 55,190, 3,109, 32, 79,113,151,225, 78,139, 8,239,188, 25, 51,102, 76,115, 21, 49,206, 16,246, 51, 12, -179, 97,250,244,233,169,206,162,200,121, 93,112,157, 92, 68, 92,138,179, 35,229, 44,162, 60, 9, 40,151,247,173,243,241,121,110, -133,150, 61, 98,237,157, 93, 32,161,240,245, 37,178,188,124, 57,150, 67,112,112,112,143, 39,159,124,210, 33,114, 12, 6,131, 67, - 96, 9, 34, 75, 88,191,112,225, 2,154, 53,107, 38, 9, 14, 14,238, 81, 80, 80, 48,203, 15, 17,135, 42, 85,170, 32, 63, 63, 31, -167, 78,157, 66, 66, 66, 2, 44, 22, 11, 54,111,222,140,146,146, 18,136,197, 98, 72, 36, 18,152,205, 94,219,110,163,110,221,186, - 79, 44, 91,182,172,217,210,165, 75,139,132, 47,186,159,126,250, 9,132, 16, 68, 70, 70, 66,167,211, 33, 39, 39, 7,127,253,245, - 23,172, 86, 43, 2, 3, 3,145,156,156, 44,237,211,167, 79,235,137, 19, 39,138,189, 8,173, 86, 79, 63,253,116,176, 74,165,194, -155,111,190, 73,204,102,243,116,251,182,143, 70,140, 24, 17,158,150,150,102,122,245,213, 87, 15,153,205,230, 79, 5, 51,209, 89, -224,120, 72, 88,143, 78,150,197, 98, 17,238,233, 53,141, 70,131,136,136,136, 4,103,103,203,147, 24,220,187,119,111, 43, 0,162, -201,147, 39, 7, 0,200,113, 14,131,201,100,130, 70,163,129, 86,171,181,148,148,148,228,142, 30, 61,218,186,124,249,114,145,253, -156,179,238,132, 22,195, 60, 97, 82,169, 20, 82, 66, 68, 31, 44, 90,180, 40,176, 91,183,110,108, 96, 96, 32, 74, 75, 75, 85,191, -255,241, 71, 96,167, 14,173,147,167,205,248,100,139, 42,190, 97,206,222,191,175, 34, 35,187, 4, 38,139, 5,201,177,193,101,126, - 24,197, 93,135,189, 35,139,195,209,114, 22, 21,187,118,237, 66,247,238,221, 29,207,186, 68, 34, 41,231,124,249,226,228, 56, 14, -221,187,119,191,197,225,217,177, 99,135, 91,247,201, 23,156, 69,145,171, 56,114, 39,192, 88,150,245, 57, 96,160,224,230,185, 19, - 91,206,174,190,139,120,243, 85,205, 1,142,227, 48, 98,196, 8,136,197, 98,140, 25, 51, 6, 28,199,161,113,227,198,224, 56, 14, - 45, 91,182,132, 88, 44, 70,199,142, 29, 43, 28,247, 3, 7, 14,160, 73,147, 38,142, 48, 53,110,220, 24,205,155, 55, 7,199,113, -104,211,166, 13,196, 98, 49,186,118,237,234, 15,231,251,165,165,165,141, 2, 3, 3,113,225,194, 5,136, 68, 34, 48, 12,115, 9, - 64, 35, 0,136,141,141,189,172,211,233,170, 27, 12, 6,188,254,250,235,140,201,100,106, 56,102,204,152, 15, 12, 6, 3, 21, 90, - 20,119, 13,174, 90,196, 9,250,177, 99,199,190,207, 48,204, 6,193,161,114,117,158,220,173,187, 41,155, 4, 7,234,176,253, 89, -109,238, 34,226,242, 24,134, 57, 76, 8,233,233,233, 92, 0, 38, 23, 97, 85,174,234,208,185,218,208,167,163, 37, 20,190,254, 10, - 45, 95, 48, 24, 12,143, 68, 69, 69,121, 20, 89,206,191, 38,147, 9, 73, 73, 73, 48, 24, 12,143, 84,244,165, 17, 27, 27, 11,179, -217,140,111,190,249, 6, 18,137, 4, 18,201, 63,250,194,100,242,110, 22,157, 57,115,230,218,129, 3, 7,154, 52,109,218, 52,116, -237,218,181,121,237,218,181,139,236,214,173, 27,228,114, 57,244,122, 61, 44, 22, 11, 90,180,104,129,186,117,235, 34, 61, 61, 29, -191,255,254,123,126,173, 90,181, 34, 14, 30, 60,200,103,103,103, 95,247, 66,221,165, 83,167, 78, 96, 24, 6,127,252,241, 71, 62, -128,195, 50,153,108,211,212,169, 83, 67, 77, 38, 19, 63,104,208,160, 27,133,133,133,111, 1, 48, 75,165,210,249,237,218,181,107, -185,109,219,182, 31,121,158,159, 91,209,140,234,122,111,181, 90, 45, 2, 2, 2,252, 25, 74, 66, 92, 88, 88,216, 0, 0,148, 74, -101, 24,128,203,142, 28,174,215,151, 19,195, 38,147,201, 16, 22, 22,166, 4, 0,251, 57, 98, 15,156,145, 86, 43, 86, 95,191,126, - 53,200,185,253, 92, 72, 72, 8, 6, 62,247, 28,251,120,171, 86,210, 70,143, 60,210,117,252,103, 75, 87, 84, 9, 87,153,146,171, -132,195, 98,179, 96,219,150,205, 60,225, 45, 91,104,177,115,111,132,150, 32, 54, 92, 29, 45,177, 88,140,157, 59,119,222,178, 77, - 34,145,224,235,175,191,246, 75, 24, 8,162,202, 83,213,153, 75, 85, 23,227, 75,192,136,197, 98,136, 68, 34, 44, 94,188, 24, 60, -207,227,237,183,223, 46, 87,157,232,204,239,151,157,231, 36, 2,235,126,196, 3, 48, 33,125,182,204,113,190,107,120,237,231,248, -229,146, 45, 88,176,192, 47, 71,171,103,207,158, 62,133,171,115, 13,131,115,184,142, 31, 63,238,150,119,209,162, 69, 62,239,167, -205,102,195,198,141, 27, 29, 34, 85,192,248,241,227, 95,151, 74,165,209,187,119,239, 70,118,118, 54,180, 90, 45, 52, 26, 13, 90, -180,104,145,204,178,236,223,217,217,217,105,103,207,158,125,146, 62, 61, 20,247,208,209, 50, 78,159, 62,253,244,244,233,211,221, - 58, 86,174,206,146, 55,231, 73, 16, 88,118, 65, 20, 41,136, 55,148, 53,171, 57,236,235, 92, 0, 82,215,170, 67,175, 70,144,139, -138,156,232,174,240,245,167,250,208, 79, 59,157, 99, 24, 6, 6,131,193,173,192,114, 22, 7,102,179, 25,133,133,133,176,217,108, -183, 61,214,151,187, 47, 89, 95, 66,235,212,169, 83, 47, 13, 25, 50, 36, 51, 56, 56,184, 81, 94, 94, 94, 46,207,243, 29,247,239, -223, 31,201,113, 28, 84, 42, 21, 84, 42, 21, 54,109,218, 4,133, 66,129, 17, 35, 70,228,218,108,182, 93, 65, 65, 65,225,122,189, -254, 68,118,118,246,120,143, 10, 70, 44,238,218,166, 77, 27, 28, 61,122, 20, 69, 69, 69, 91, 1, 52,126,254,249,231,187, 87,173, - 90,149,153, 58,117,170,225,202,149, 43,115, 1,228, 42,149,202,101,203,150, 45,235,208,180,105,211,160, 65,131, 6, 97,231,206, -157,139, 0, 24,252,141,179, 86,171, 45, 39,176,212,106, 53, 74, 75, 75,161, 84, 42,173,126,222, 51, 49,254,233, 97, 8, 66,136, - 35,109,236,110,150,144, 62,132,227, 56,161, 87,163, 39,145, 5,165, 82, 57,121,233,210,165,114,215, 78, 10, 54,155, 13, 57, 57, - 57, 80,169, 84,248,112,252,120,201,164, 81,175, 52, 17, 5, 70,239,103, 89, 6, 38, 51, 41, 38,188,105,179, 54,167,255,110,224, - 99, 90,242,220, 3, 8,194,160,119,239,222,183, 84, 23, 74, 36, 18,108,221,186, 21,125,251,246,117,124,184, 52,109,218,212,231, -199,149, 32, 12,122,245,234,229,112,134, 54,111,222,236,182,218, 79,112,164,252, 17,132,194,177, 35, 71,142, 4,199,113,248,252, -243,207,241,206, 59,239,128,101, 89,204,158, 61, 27, 44,203, 98,194,132, 9,126,139, 76,103, 1,147,246, 73,217,111,252, 59,106, - 20, 44,140, 6, 0, 4,169, 84, 66,132, 42, 84,246,112, 28,231,112,178, 30,121,228, 17,136,197, 98,180,108,217, 18, 28,199, 57, -156,172, 30, 61,122, 56,223, 71,226, 15, 39,199,113,184,120,241,162, 35,204, 45, 91,182, 44,231,100,113, 28,135,158, 61,123,250, - 19,204,105, 33, 33, 33, 19,235,214,173, 91,111,206,156, 57, 98,145, 72,132, 78,157, 58,213,142,137,137,185,110,181, 90,195, 39, - 79,158,172,112,115,142, 28, 64,163,122,245,234, 41,233, 83, 67,113, 23, 29,173,137,110,118,133, 58,183,185,170,192,135,228, 6, -231,227, 5, 14, 87,113,100,119,200,118,249,226,114,119,174, 47,112,130,130,244,102,169,251, 35,180,236,182,179,215,139, 41, 20, -138,147,185,185,185, 45,229,114,121, 57,145,229, 78,112,137, 68, 34,100,103,103, 67,161, 80,156, 52, 26,141,149,150,136,190,170, - 14, 1, 24, 46, 93,186, 52,202,105,189,115,143, 30, 61,126,216,186,117,107,236,182,109,219,112,240,224, 65, 68, 70, 70, 98,193, -130, 5, 89, 57, 57, 57, 47, 1,216,154,159,159,239,243,186,213,171, 87,111, 16, 24, 24,136,189,123,247, 2,192, 78, 0,175, 12, - 27, 54,140,177, 88, 44, 88,184,112,161, 22,192, 31, 33, 33, 33, 27, 87,173, 90,213,164, 81,163, 70,210,109,219,182,169, 15, 30, - 60,248,167,159, 34,203,198,243,252, 45, 2,203,249,158, 6, 5, 5,249,227,104, 89,130,131,131, 79,169,213,234,126,122,189, 94, - 45,147,201,130,212,106,181,209, 89, 96, 9,252, 28,199,137, 47, 94,188,152, 9, 32, 57, 56, 56,248, 20, 60, 84,115,114, 28,215, -169, 83,167, 78,156,107, 26,228,228,228, 32, 59, 59, 27,102,179, 25, 77,155, 54,101, 68,140, 69, 84,116,243,164,203,176, 14, 84, -100,221, 35, 71,139, 8,207,186,208, 75,208, 93, 79,195,205,155, 55, 59,214, 89,150,197,247,223,127,239,151, 40,218,186,117,171, -215, 6,235, 46, 85,135, 62,173,113,225,248, 47,191,252,178,108,122, 11,187,147,197,178, 44,198,142, 29, 11,153, 76,134,169, 83, -167, 98,236,216,177,224, 56,206,103,213,161,179,128, 73, 28,163,115,254, 56, 42,123, 40,236,237,161, 24,134,113, 22, 91,140,191, -226,205,155,155,231, 79, 77,128, 51,167,112, 94, 64, 64,128,199,134,240, 46,156,222, 46,240, 27,128,171,177,177,177,123, 91,182, -108, 25,124,228,200, 17,204,158, 61, 91, 98, 52, 26,171,109,219,182,205,113, 93,119,247, 75,171,213,202,233,147, 67,113, 55,220, - 44, 47,187,243, 92,218, 87, 49,206,213,120, 94,126, 93,143,135,211, 54,103,222, 60,134, 97, 44,110,174,151,231, 70, 92,185, 94, -195,249,152, 60,143,142,150,175,194,194,151,224,242,199,209,210,233,116,127,254,241,199, 31,205,159,123,238, 57,206, 91,181,161, - 86,171, 69,116,116, 52, 78,159, 62,109,213,233,116,127,250,225,148, 85,166,208,114,197,182,220,220, 92,145,197, 98, 65,205,154, - 53, 17, 23, 23, 7,131,193,128,226,226, 98, 17,128,173,126,114, 72,148, 74,165, 8, 0,138,139,139,129,178,174,166,181,107,213, -170,133,163, 71,143,162,176,176,240, 23, 0,221, 38, 78,156,216,180, 69,139, 22,146, 21, 43, 86,232,222,120,227,141, 95, 44, 22, -139, 95, 74,131,231,121,147,213,106, 77, 98, 89,214, 92, 92, 92,156,225,124, 63,163,163,163,195,148, 74, 37,147,147,147, 99,241, - 71,104, 53,106,212,232,208,141, 27, 55, 48,121,242,228,188,105,211,166,213, 42, 45, 45, 45, 42, 41, 41,177, 58,139, 45,131,193, -192, 70, 68, 68,200, 22, 46, 92, 40, 7,128, 70,141, 26, 29,242, 36,180,180, 90,109, 85,133,226,159, 15, 99,163,209,136,236,236, -108,100,103,103, 35, 39, 39, 7,165,165,165, 72, 78, 78,134, 78,167, 75,160,197,204,191, 38,180,202, 85,159, 57, 63,223,206, 47, -242,138, 60,235,206, 2,166,119,239,222,142,182, 93,130, 67, 38, 44,171, 87,175,118,109, 96,238,151,208,250,242,203, 47, 49,114, -228, 72, 4, 4, 4, 96,206,156, 57,229,170, 14, 93,197, 1,207,243,140, 63,113, 79,122, 79,143,236,249, 97, 16,139,197, 8,127, - 35,167, 92, 21,157, 27,193,225, 87, 56,167, 77,155, 86, 41, 85,135,206,156, 9, 9,101,143,202,226,197,139,209,175, 95, 63,236, -222,189,251,182,171, 14, 83, 82, 82,126,218,176, 97, 67,240,153, 51,103,160, 86,171,145,151,151, 7,163,209,136,244,244,116,143, -181, 2,246,178, 60,128, 62, 57, 20,247,184,156, 58,124, 47,121, 43,243,122,156,143, 23,184,223, 66,203, 31, 71,203,104, 52,206, -121,243,205, 55,135,117,238,220, 57, 44, 40, 40, 8,153,153,153,183,136, 44,141, 70,131,192,192, 64,232,245,122,172, 95,191, 94, -109, 52, 26,231,248, 18, 7, 22,139, 5, 81, 81, 81,200,207,207, 7,239,161,253, 52,203,178,144,203,229,208,104, 52,128,143, 70, -230,238, 94, 24,102,179, 25, 22,139, 5, 22,139, 5,102,179,185,162, 51,114, 43,148, 74,165, 32, 60, 0, 64, 91,165, 74,149,154, - 1, 1, 1,184,118,237, 26, 80,214,179,175,115,247,238,221,197, 5, 5, 5,228,213, 87, 95,221, 67, 8,121, 29,222, 71,199, 55, -237,218,181, 43, 9, 0,228,114,249, 5, 0, 72, 79, 79,183, 20, 23, 23,151,115, 10, 21, 10, 5,233,219,183,111, 44, 33, 4,187, -118,237, 74,146, 72, 36, 4,158,123, 53, 26,214,173, 91,119, 38, 56, 56,120,249,140, 25, 51,158, 75, 77, 77, 61,221,160, 65,131, - 36,173, 86,155,171,215,235,245, 6,131,129,136, 68, 34, 73,104,104,104,192,150, 45, 91, 46,239,223,191,191,179, 74,165, 90,190, -110,221,186, 51,158,156, 55,165, 82,153,174,211,233, 18,133, 52,117, 22, 89,217,217,217, 32,132,224,234,213,171, 80, 40, 20, 55, -124, 85,235, 82,220, 61, 8, 31, 85,174,206,139,235, 54,127, 69,150,179, 48,216,178,101,139,215, 49,180,252,229,116, 22, 69,239, -188,243, 14,230,207,159,127,139,163, 53,117,234, 84, 0,192,248,241,227,253,110,163, 37,184, 87,217,243,195, 16, 51,178,176, 92, -216, 1,128, 17,194, 87,177,103, 30, 28,199, 97,242,228,201,183, 52, 82,119,174,218,243,179,138,175, 92, 56,115,115,115,193,113, - 28,194,194,194, 48,112,224, 64,116,237,218,213, 81, 5, 89, 81,222,115,231,206,237,125,239,189,247, 26,166,164,164, 96,202,148, - 41,133, 33, 33, 33, 65,175,189,246, 26, 87, 92, 92,204,120,115,180,168,208,162,160,168, 4,161, 37, 60, 96,254,246, 58,244, 80, - 88,118, 70,249,177, 54, 74,116, 58,221,192, 46, 93,186,172, 93,185,114,165,188,122,245,234, 56,119,238, 28, 10, 11, 11, 97, 50, -153, 32,145, 72, 16, 27, 27,139,226,226, 98,124,255,253,247,122,157, 78, 55, 16, 64,137, 15,206, 15,154, 53,107,246,213,172, 89, -179, 2, 26, 55,110,140,194,194, 66,104, 52, 26,135, 16, 98, 24, 6, 42,149, 10,114,185, 28,135, 14, 29,194,230,205,155,245, 0, - 62,240,193,233, 78,205,193,108, 54, 59, 4,151, 31, 66,203,153, 83, 41,184, 58, 58,157, 14, 0, 44, 85,171, 86,141, 1,128,171, - 87,175, 2, 64, 90,114,114,242,196,234,213,171, 51,203,150, 45, 35,132,144,205, 30, 68,150,131,147, 97,152, 66, 66, 72, 17,128, - 24,147,201, 36, 1,128,146,146, 18,115, 68, 68, 68,148, 76, 38,227,229,114, 57, 31, 16, 16,192,103,102,102, 90,173, 86,171, 4, - 0,218,180,105, 99, 2,144,237, 50, 71,161, 51, 39, 79, 8, 81, 47, 90,180,104,226,160, 65,131, 90,182,106,213, 42,101,232,208, -161,167, 94,125,245, 85, 54, 46, 46, 46,180,180,180,212,112,233,210,165,162,207, 62,251,172,244,192,129, 3,157,197, 98,241,245, - 69,139, 22, 77, 4,160,102, 24,134,119,199,105,181, 90,255,220,182,109,219, 75,169,169,169, 92, 70, 70, 6,114,114,114, 28, 34, - 43, 39, 39, 7,117,235,214,197,254,253,251,109,102,179,121, 91, 5,238,103,101,129,114,150,125,132, 16,225, 89,247, 36,176,132, -143, 41,127, 57,157, 69, 81,191,126,253,202,185, 88, 18,137, 4,107,214,172,113, 91,110,184,121,174,202,197,221,121,140,175,247, -222,123,175,156,104,251,240,195, 15, 61, 22,103,190,238,167,192, 83,178, 56,174,124,175, 67, 15,207,185,183,112, 10,101,167, 88, - 44,198,135, 31,126,232,183,163,133, 91,219,104,221,194, 41,196,189, 93,187,118,208,233,116, 14, 33,235,201,209,242,117, 63,109, - 54,219,200,249,243,231, 19,149, 74,245,152, 90,173,126,254,198,141, 27, 75,116, 58,221,163, 37, 37, 37, 94, 29, 45,163,209, 40, -163,207, 17,229,196,221, 25,159,235,225, 17, 90,246,151, 36,170, 86,173, 90,110,238, 44,150,101,203, 45, 21,105,103, 96,199,150, -139, 23, 47, 62,245,248,227,143,255, 56,114,228,200,160,198,141, 27,139, 19, 19, 19,161,213,106,113,237,218, 53,156, 62,125,218, -186,110,221, 58,181, 78,167,123, 30,128, 63,189,206,150,158, 57,115,102,115,183,110,221, 38,180,104,209,226,127, 31,125,244,145, -168,118,237,218, 40, 41, 41, 65,104,104, 40,162,162,162,112,254,252,121,172, 95,191,222,150,159,159,255, 21,128, 73,112, 83,135, -234,235,131,223,108, 54, 99,192,128, 1,224,121, 30,115,231,206,133, 63, 19, 42, 59,193,108, 54,155, 9, 0,198,222,158, 75,103, - 31, 93, 26,151, 46, 93, 2,128,235, 73, 73, 73, 65, 0,176,109,219, 54, 6,101,227,107,249,243,133, 79, 8, 33, 14,103,171,110, -221,186,215, 92, 11, 71,193,201, 18, 92, 48, 95,225,102, 24,198, 64, 8,201,213,233,116,221,222,121,231,157, 9, 95,126,249,229, -115, 95,126,249,229, 45,199,169, 84,170,229,179,103,207,158,244,236,179,207,230, 50, 12,227,177, 29,153, 86,171, 29,255,226,139, - 47, 62,123,242,228,201,160,128,128, 0,104,181, 90, 20, 20, 20,192,108, 54, 35, 57, 57, 25,185,185,185, 88,186,116,105,169, 94, -175,255,152, 62,142,255, 14,156,133,129, 39, 87,203, 15,145,229,209,213,249,237,183,223,220,142, 81, 85, 81, 78, 87,177,225,239, -216, 86,222, 62,138,132, 97,105,220, 13, 25, 81,193,114,237, 22, 94,142,227,240,233,167,159, 58, 6,109,117,231,100, 85,196,209, - 18, 56,195,194,194,202,108,114,133, 2, 60,207,163,103,207,158,119,194,203, 3, 24,225, 52,226,251,180,209,163, 71, 79,172, 91, -183,110,109, 0, 50,231,123, 80, 65, 23,159,130,130,194,151,208,178,217,108,233,117,234,212, 41, 87,192,249,154,204,212, 98,177, -164,251,121,221,205, 90,173, 54,121,246,236,217,111, 42,149,202,206, 58,157,174,161,189,224, 56,169,213,106,183, 25,141,198,121, -168,216, 36,208,121, 0,134, 31, 56,112, 96,110,183,110,221,166,118,236,216,241,153, 81,163, 70, 49,132, 16, 44, 92,184,144, 92, -185,114,101,181,221,197,186,114, 59, 55, 41, 44, 44,236,204,247,223,127, 31,189,118,237, 90, 88, 44, 22,204,155, 55, 15, 65, 65, - 65,103, 10, 11, 11,253,165,200,221,190,125,251, 15,173, 90,181,122, 97,255,254,253, 75, 1,156,216,185,115,231,146,214,173, 91, -191,184,127,255,254,159, 0,156,254,235,175,191,150,180,104,209,226,197,195,135, 15,175, 2,112,188, 2,133,175,195,217,178, 90, -221,215, 52,122,112,178,188,113,170, 9, 33,230, 33, 67,134,140,122,246,217,103,191, 57,124,248,240,163,197,197,197, 13, 1, 32, - 36, 36,228,100,243,230,205, 15,173, 92,185,242,188,221,201,242,213, 88, 63, 79,171,213,246,109,216,176,225, 47, 83,166, 76, 81, -166,164,164,112, 53,107,214, 68, 90, 90, 26, 78,157, 58,101,253,238,187,239, 52,122,189,190, 55,128, 34,250, 56,254,123, 66,139, - 16,130,144,144,144,114, 31, 81, 66,151,255,138, 86, 23, 58,191,152,133,169,122, 92,121, 61,113,122, 27, 54, 65, 64, 96, 96,160, - 99,112, 83,127,154, 44,240,188,247,241,216, 8, 33, 14, 78, 97,241, 67,100,249,236, 33,104,159, 2,199,111, 78,127,134,119, 80, - 42,149,176, 88, 44, 14, 94, 63,122,126, 86, 84, 45,254, 6,224, 55,139,197,114, 9, 64, 13, 42,174, 40, 40,238,162,208, 42, 42, - 42,106,118,151,175,173, 54, 26,141,147,140, 70,227, 36, 97,131,193, 96,184, 83,206, 43, 0,158,221,190,125,251,172,237,219,183, - 11,245, 8,147,225,123,190, 68,175, 56,119,238, 92,170, 88, 44,254,122,249,242,229, 45, 8, 33, 8, 14, 14, 62,144,150,150,246, - 90, 69, 56,108, 54,219,144,253,251,247, 15,131,189, 45,147,217,108, 30,178,119,239,222, 55, 81, 54, 31, 19,108, 54,219,144,131, - 7, 15, 58,214, 43,248,162, 36,132, 16, 35, 33,164,138,135, 67,140, 21,116,224, 4,103,203,180,114,229, 74, 13,128,191,241,207, - 56, 89, 22,251, 98,112,169, 46,244,134,191,180, 90,109,205, 15, 63,252,112,154, 72, 36,234,164,213,106,227,148, 74,229, 77,171, -213,250,167, 78,167,251, 0,101,115, 84, 81,252, 75, 48,153, 76, 25,117,234,212,225,220,125, 64,121,123,145,123,251,176,178,217, -108,233,181,106,213,242,249,113,230,134, 51,195,139,104,184,158,156,156,204,250,203, 37,192,108, 54,231,122, 11,103,114,114, 50, - 42,202,233, 43,238, 73, 73, 73,110,227,238, 67, 16,122,140,187,213,106,189, 45, 78,111,247,211, 27,244,122,125, 81,100,100,164, -198, 96, 48,136,141, 70,163,216,106,181,150,179, 31,229,114,121,158, 94,175,167, 15, 15, 5,197,157, 8,173,251, 28, 71, 80, 54, -189, 68,101,193,120,242,228,201, 23, 28,246, 84,110,238,237,242,184, 42, 73,141,143,245,138, 8,163, 74,119,132,236, 66, 74, 87, - 73,116,249, 26,141,230, 85, 97, 69,104, 3, 66,241,239,163,160,160,224,177,202,230, 44, 44, 44,172,244, 15,181,252,252,252,150, -119, 33,238,205, 30, 86, 78,111,200,204,204,124,204,135, 16,163, 15, 14, 5,133,159, 96,233, 45,160,160,160,160,160,160,160,160, -184, 59, 96, 80,214,115,192, 29, 42,210,155,160,243,109, 92,123, 27,229,164,156,148,147,114, 82, 78,202, 73, 57, 31, 58, 78, 95, -220, 15, 76,111,198,123,209,206,177, 51,229,164,156,148,147,114, 82, 78,202, 73, 57, 41,231,195, 8, 66, 8,173, 58,164,160,160, -160,160,160,160,160,184, 91,160, 66,139,130,130,130,130,130,130,130,130, 10, 45, 10, 10,138,251, 20,181,171, 86,173,122,182,118, -237,218, 25, 0, 6,223,229,107, 13,108,209,162, 69,129, 76, 38,219, 2,160, 54,189,245, 20, 20, 20, 84,104, 81, 80, 80, 60,208, - 34,171, 97,195,134,123,206,157, 59, 87,119,219,182,109, 85,226,226,226, 62,185,155, 23,107,214,172,217,204,221,187,119,135,253, -241,199, 31, 93, 98, 98, 98,118,221,166,216,170, 93,173, 90,181,179,181,107,215, 78, 7, 48,176,146,131, 56,184,101,203,150,133, - 82,169,116, 51, 21,130, 20, 15, 1, 26, 0,104, 72,133, 22, 5, 5, 5,197, 93, 20, 89,251,246,237, 11, 55, 24, 12, 56,119,238, - 28,242,242,242,142,223,205, 11, 94,184,112,161,104,223,190,125,136,143,143,199, 79, 63,253, 20,153,148,148,180,187,130,130,166, -118,195,134, 13,247,156, 61,123,182,238,182,109,219,226,162,162,162, 62,171,204,240, 61,250,232,163, 83,119,239,222, 29,186,101, -203,150,174,145,145,145,183, 43, 4, 41, 40,254,203,144, 1,120,129, 97,152, 67, 13, 26, 52, 56,153,146,146,114,130, 97,152,253, - 0,250,225,193, 29,187,211, 63,108,216,176, 97,231,134, 13, 27,118,210, 60, 66, 65, 65, 81, 9, 72, 73, 73, 73,209,106,181, 90, -146,151,151, 71, 62,255,252,115, 18, 22, 22,102, 6,240, 39,128,117,110,150,247, 1,168,252,228, 86,217,143,119,199,243,103, 88, - 88,152,249,243,207, 63, 39, 87,175, 94, 37,103,206,156, 33,181,107,215,214,251, 41,104,106, 55,108,216, 48, 95, 8,243,166, 77, -155, 8,199,113,155, 43,243,166,168, 84,170,211,187,118,237, 34, 87,174, 92, 33, 91,182,108, 33,209,209,209,185, 84,108, 81, 60, - 32, 72, 4, 48, 51, 48, 48,176,176, 87,175, 94,228,219,111,191, 37,235,215,175, 39,191,252,242, 11,153, 51,103, 14,233,208,161, - 3,145, 74,165, 25, 0,198, 0, 8,121, 88,180, 8, 33,164,108, 86,251, 13, 27, 54, 16, 0,237, 1, 32, 53, 53,149,138, 45, 10, - 10,138, 59,197, 62,157, 78,215, 82,167,211,161,180,180, 20, 85,171, 86,133, 88, 44,118,123, 96,110,110, 46,246,238,221,139, 17, - 35, 70,156,201,206,206,110, 11,239,243, 94,134, 54,105,210,100,223, 95,127,253, 85, 59, 40, 40,200,177,145,231,121,152,205,102, - 88, 44, 22,152,205,102, 24,141, 70, 24,141, 70, 72,165, 82,200,229,114,132,133,133,157,130,247, 42, 12,135,251,166,215,235,113, -236,216, 49, 12, 26, 52, 40,175,160,160,160, 45,128, 11,149,120, 95,106, 71, 69, 69,237, 90,186,116,105,100,114,114, 50,110,220, -184,129,151, 95,126, 57,255,250,245,235,109, 42,249, 58, 20, 20,247, 18, 99,159,122,234,169,169,209,209,209,108,131, 6, 13, 16, - 27, 27, 11,163,209, 8,189, 94, 15, 66, 8, 56,142, 3, 33, 4, 37, 37, 37,216,181,107, 23,254,250,235, 47, 99, 81, 81,209,247, - 0,230, 1,184,232, 36,178, 30, 56, 45, 82, 78,104,165,166,166, 50, 52,175, 80, 80, 80, 84, 18, 78,150,148,148, 52, 48, 26,141, -208,106,181,126,157,112,245,234, 85, 12, 30, 60,248, 76,118,118,246,227,112, 63,169,188,170, 73,147, 38, 7,119,237,218, 85,219, - 96, 48, 64,173,246, 61,239,188, 84, 42, 69, 64, 64, 0,194,195,195,247, 3,104,229,233, 75,188, 65,131, 6, 71,246,239,223, 31, -166,215,235,113,252,248,113, 12, 28, 56,208, 92, 88, 88,184, 7,128,167,192, 23,162,108, 30,213,235,110,246, 37, 0,120,211,254, -133,239, 14,202,200,200,200,214,203,150, 45,147, 84,175, 94, 29, 58,157, 14,253,250,245, 43,188,112,225, 66,115, 0,215,104,214, -161,184, 15,113,225,220,185,115,181,108, 54, 27,242,243,243, 97, 52, 26,161,211,233, 28, 66, 75, 36, 18,129, 16, 2,171,213,234, -248, 48, 58,122,244, 40,182,109,219, 70,174, 94,189,250,145,253, 89,122, 32,181, 8, 21, 90, 20, 20, 20,119, 11,181,107,213,170, -117,252,247,223,127, 15,144, 72, 36, 88,191,126, 61, 62,250,232, 35, 75, 97, 97,225,110, 87,241, 18, 29, 29,157,178,100,201,146, -164,228,228,100,156, 56,113, 2, 79, 63,253,244, 7, 0,166,185,225,124, 95,173, 86, 79, 53,155,205, 56,126,252, 56, 94,124,241, -197,107, 57, 57, 57,167, 93, 69, 76, 82, 82, 82,155,207, 62,251, 76,220,180,105, 83,168,213,106, 60,243,204, 51,186,243,231,207, -183, 0,112,218, 67, 88, 63, 43, 44, 44,124,199,102,179,161,180,180, 20,241,241,241,144, 72, 36, 94, 35,167,215,235,145,152,152, -184, 63, 47, 47,239, 22,241, 22, 30, 30,190,253,198,141, 27, 29,228,114,185, 87, 14,179,217,140,244,244,116, 72,165, 82, 24,141, - 70,212,168, 81,227,123, 0, 67,104,214,161,184, 31,133,214,223,127,255, 93,235,231,159,127, 70,147, 38, 77, 80,175, 94, 61,104, - 52, 26,135,232, 50,153, 76,176, 88, 44,183,156,164, 86,171,241,246,219,111, 95,132,189,250,252, 65, 21, 90, 66,195,180,137, 66, -157,104,106,106,106, 59,154,103, 40, 40, 40,238,180,224,189,120,241, 98,227,206,157, 59,239, 94,189,122,117, 68,143, 30, 61, 80, -163, 70, 13,241,147, 79, 62, 25,169,211,233, 58, 57, 31,152,147,147, 19,250,226,139, 47, 30,185,121,243,102,146,125, 83,115, 15, -156,205,131,130,130,112,245,234, 85, 65,100, 53,131, 75, 53,163, 84, 42,221,252,247,223,127,139,165, 82, 41, 14, 31, 62,140,193, -131, 7,231, 95,187,118,205, 87,181, 92,136,201,100,130, 72, 36, 2, 0,164,167,167,251,140,220,141, 27, 55,192,243,188,209,221, - 62,150,101,101, 71,143, 30, 69,149, 42, 85,188,114,176, 44,235, 42,232,138,105,182,161,184, 79, 97, 49,153, 76,104,214,172, 25, -174, 93,187,134,163, 71,143, 58, 4, 87,126,126, 62, 50, 51, 51,203, 29,124,232,208, 33, 28, 59,118, 12,109,219,182,117,229,121, - 32,181,136, 67, 57,110,216,176,161,157, 61,114, 59,105,158,161,160,160,168, 36,212,174, 82,165,202,174,165, 75,151, 70,198,198, -198,162, 67,135, 14, 55,179,179,179,171,185, 57,110, 29, 33,164,247,213,171, 87, 81,189,122,245,245, 0,250,220,206, 49, 9, 9, - 9,121,135, 15, 31,142, 56,115,230, 12, 6, 14, 28,152,103,111,243,229,171,237, 83, 82,221,186,117, 15,111,217,178, 37,140,101, - 89,156, 62,125,218,159,170,195, 52,148,181, 47,185,238,102, 95, 2,128, 15, 1,132,121, 56, 87, 89,171, 86,173,214, 71,142, 28, -145, 48, 12,131,180,180, 52,161,234,176,153,157,151,130,226,126, 67,223, 42, 85,170,124, 55,108,216,176,224, 22, 45, 90, 32, 61, - 61, 29, 25, 25, 25, 40, 42, 42, 66,227,198,141,145,146,146,130, 43, 87,174, 96,243,230,205, 56,118,236, 24,100, 50, 25,226,227, -227, 17,184,252,103,124,205,224, 12,128,148, 7, 85,139,220,139,185, 14, 41, 40, 40, 40,106, 75, 36,146,205,113,113,113,185,112, - 63, 46, 85,232, 51,207, 60,147,105,179,217,200,149, 43, 87, 8,202,122, 15,194,131,208, 34, 87,174, 92, 33,209,209,209, 87, 1, -132,186, 57,102,112, 76, 76,204, 77,133, 66,113, 10, 21, 28,214,161,102,205,154,121,231,207,159, 39, 55,111,222, 36,127,252,241, - 7, 9, 15, 15,191, 27, 61, 2,107,215,169, 83, 39,191,180,180,148, 24, 12, 6,178,107,215, 46,146,144,144,144, 7,218,243,144, -226,254, 71, 16,128,201,201,201,201,134, 89,179,102,145,205,155, 55,147,197,139, 23,147,169, 83,167,146, 81,163, 70,145,150, 45, - 91,146,150, 45, 91,146,126,253,250,145,119,222,121,135,116,239,222,157, 4, 6, 6,150, 0,120,242, 65,190, 41, 84,104, 81, 80, - 80,252, 27, 72, 0, 48,199, 46,168,214, 61,243,204, 51,153, 70,163,145,100,100,100,144, 53,107,214, 16,148, 13,221,224, 14,239, -103,103,103,147,236,236,108, 97,104,132,171,248,103, 88,135,111,237,188,119, 36,130, 18, 19, 19,243,142, 28, 57, 66,210,210,210, -200,166, 77,155,136, 93,176, 85, 26,228,114,249, 22,181, 90, 77, 12, 6, 3,217,190,125, 59, 29,222,129,226, 65, 68, 20,128, 5, -245,235,215,183,204,157, 59,151,172, 91,183,142,124,254,249,231,164,111,223,190,100,204,152, 49,164,127,255,254, 36, 50, 50,210, - 8, 96, 6,128,224, 7,253,102,220, 11,161, 69,103, 54,167,156,148,147,114,186, 98,243,153, 51,103,136, 0,155,205, 70, 50, 50, - 50,200,150, 45, 91, 72, 76, 76,204,105,148, 31, 79,203,153, 83, 85,175, 94,189,115,231,207,159, 39, 55,110,220, 32,102,179,217, -193,113,238,220, 57, 2, 96,103, 37,132,179,118, 92, 92, 92,238,142, 29, 59,200,249,243,231, 73, 76, 76,204,205,202,140,123, 98, - 98, 98,110, 94, 94, 30,217,190,125, 59,137,140,140,244, 37,178,104, 94,162,156,247, 51,103, 34,128,101, 77,155, 54,181,205,159, - 63,159,252,239,127,255, 35, 9, 9, 9, 54,251, 71, 81,220,195,162, 58,157, 27,195, 83, 80, 80, 80,220, 43,200, 14, 28, 56, 0, -153, 76,230,216,112,226,196, 9,231,113,180, 60,141,219,160, 62,123,246,236,227, 61,122,244,216, 61,127,254,252,122,206,189,152, -118,236,216, 1, 0,198, 74, 8,219,133,140,140,140,182,221,186,117,155, 23, 30, 30,254, 72,118,118,246,132,202,140,120, 90, 90, -218, 59, 13, 27, 54,156, 86, 90, 90,170,214,233,116,253, 64,199,206,162,120,112,145, 6, 96,208,209,163, 71, 63, 57,122,244,232, - 7, 0, 8,128, 41, 0,206, 62,108, 55,130, 10, 45, 10, 10,138,123,141,193,175,190,250,170,107, 99,241,195, 0,190,240, 34,178, - 4, 20, 93,187,118,173, 85,207,158, 61,135,161,124,239, 68,161,113,122,101,224,130,201,100,234,234,218, 83,170,146,240, 83,118, -118,246, 79, 52, 11, 80, 60, 68, 56, 13,160,255,195,124, 3,168,208,162,160,160,184,215,184, 14,224,229, 59, 56, 95, 13,247,227, -108, 81, 80, 80, 80,252,231, 64, 39,149,166,160,160,160,160,160,160,160,160, 66,139,130,130,130,130,130,130,130,226,254, 2, 3, -207, 61, 7,182, 85,128,231,118,122, 52,108,163,156,148,147,114, 82, 78,202, 73, 57, 41,231, 67,199,233,139,123, 27, 30, 16,208, -225, 29, 40, 39,229,164,156,148,147,114,222, 13, 78,198,190,176,246, 69, 88,255, 47,199,157,249, 15,199,253, 97,225,124,224,240, -111, 14,239, 32, 36, 4,143,178, 46,159, 20,255, 61, 56, 63, 32,132,166, 19, 5, 5, 69, 5,203, 14,145,211,203,214,102, 95,240, - 31, 44, 75,156, 69, 1,127,135,239,165,187, 17,247,135,153,243,129,128, 55,161,245,136, 82,169,252, 72, 42,149, 38, 51, 12, 99, -211,106,181, 39,141, 70,227, 34, 0,251,239,240,154,223, 70, 71, 71, 15, 46, 40, 40,224, 89,150, 5,203,178, 96, 24, 6, 44,203, - 66, 44, 22,235, 75, 74, 74, 84,183, 67, 26,217,160,239,187, 28,195,140,180, 17,219,162,220, 83,235,167,250,218, 78,225,253,129, -145, 72, 36, 79,133,133,133,133,228,229,229, 17,150, 45,107,202, 39, 18,137,132,137,112,173, 37, 37, 37, 63,248, 75, 22, 26, 26, -122, 40, 44, 44, 44, 68, 56,159, 97, 24, 20, 20, 20, 20,231,230,230, 62, 10, 0, 1, 1, 1,123,149, 74,101, 56,199,113, 16,137, - 68, 16,137, 68,208,233,116, 5, 5, 5, 5,143,211,164,184, 63,177,106,213, 42, 81,183,184,151,107,112, 68,223,136,101, 73, 48, -207, 51, 37, 86, 70,126, 98,115,198,183,151,253, 57,191, 95,191,126, 54,122, 23,239, 29,164, 82,233,220,232,232,232, 87, 52, 26, -141,142, 97, 24,194, 48, 12, 24,166,236, 59,203,245,215,102,179,165, 23, 20, 20, 52,243,241,178, 21, 75,165,210,217, 49, 49, 49, - 47,234,116, 58,157,157,207, 45, 47, 0, 88, 44,150,244,252,252,252,102,126,149,245,145,145,139,228,114,249,243, 58,157, 78,203, - 48, 12,239,226, 30, 56,191,204,175,228,231,231,183,241, 37, 12,164, 82,233,188,232,232,232,151,236,113,119,132,243, 78,227, 30, - 29, 29,253,162, 86,171,245,139,211, 75,220,111,225,188, 27,225,252,143,114, 62,248, 66,171,113,227,198, 63, 31, 60,120,176,150, - 88, 44, 6, 0, 24, 12,134,134, 11, 22, 44,120,225,189,247,222,155, 1, 96,220,109, 94,111, 73,155, 54,109, 6,236,218,181,139, - 93,183,110, 29,219,188,121,115, 48, 12, 3,155,205, 6,155,205,134, 6, 13, 26,200,111, 55, 34,193, 74,197,216, 99, 91,191, 14, -120,164,243,171, 35,115,129,169,190,182,123, 19,152, 0,198, 3, 72,174, 96, 16,242,236,247,229,152, 7,177,177,143,101,217, 10, -113,242, 60,127,181,168,168,168,149, 23, 1, 83,233,156,118,145,245,116,155, 54,109,130,183,109,219,198,220,188,121,147,145,203, -229,224,121, 30, 54,155, 13, 22,139, 5,245,235,215,175,144, 19, 26, 18, 18,162, 26, 59,118,108,141, 39,158,120, 2,107,214,172, -193, 11, 47,188,128,214,173, 91, 95,204,205,205, 5, 0, 40,149,202,240, 51,103,206,212, 10, 11, 11,131, 78,167, 67, 73, 73, 9, -186,116,233,130,130,130,130,251,250,225,122,172,113,252, 20,134,101, 28, 99, 69, 17,171,173,240,224,137,204,241,119,202, 27, 22, - 22,118, 76, 38,147, 69,251, 84,203, 78, 47, 50,131,193,144, 83, 88, 88,216,196,199, 41,137, 0,122,137, 68,162,154, 28,199,213, - 1,144,104,181, 90,163, 1, 64, 34,145,228,136, 68,162, 52,139,197,114,222,100, 50, 93, 2,240, 27,188, 76,128,220, 45,238,229, - 26,140, 85,247, 76,169,145,239,161,168, 62,163,182,238,202,216, 11, 10,153,110, 83,183,184,151, 87,251, 43,182,254, 69,212, 6, -176, 18,101, 19, 74,255, 15,101,227, 0,221, 9,226, 0,244, 70,217,156,143, 73,102,179, 57, 31,192, 81,148,181, 67,185, 8, 32, - 33, 50, 50,242, 39,158,231,141, 5, 5, 5, 47,195,205, 68,213, 45,154, 86, 61,194,178,108,188,224, 9,240,196,150,126,224,104, -122,165,188,160, 88,150,157,151,154,154,250,210,234,213,171, 21, 71,143, 30, 85,212,171, 87,207,241, 65,196,243,252, 45,109, 76, -146,146,146,124,185, 26, 28,203,178,115,159,121,230,153,231,150, 45, 91,166,184,126,253,186,162, 74,149, 42, 14, 78,103,177, 37, -160, 74,149, 42,254,230,253,111,187,118,237, 58,104,233,210,165,226,245,235,215,203, 35, 34, 34, 16, 30, 30, 14,137, 68,114,203, -177,143, 63,254, 56,239, 59,234,236,188, 62,125,250, 12, 90,177, 98,133,226,224,193,131,138, 6, 13, 26, 64, 36, 18,221,113,220, -251,246,237,251,220,207, 63,255,172, 56,121,242,164,162,102,205,154, 16, 76, 5, 87, 62,150,101, 81,181,106, 85,191, 56,123,247, -238,253,220,202,149, 43, 21,199,142, 29, 83,212,169, 83,199,113, 63, 9, 33,183, 29,206,255, 56,231, 67,225,104, 73,205,102, 51, -118,238,220, 9,150,101, 17, 22, 22,134,193,131, 7, 99,235,214,173, 99,183,111,223,190,225, 54,156,173,111,237, 34, 75, 12, 0, -191, 60,223, 23, 87,197,192,136, 92, 19, 36, 18, 9,174, 92,185, 2,145, 72, 84, 97,107, 81, 38,147,189, 72, 8,249, 80,151,113, - 88,166,215, 91, 96,200, 60,162,144,203,229,142, 23,128, 46,211,190, 61,235,136, 66, 46,151, 95, 17,137, 68,147, 53, 26,205, 18, - 79,124, 53,107,214,252,241,244,233,211,117,221, 61,184,222,160,211,233, 80,173, 90,181,132,194,194,194,154,238,246,139,197,226, -248,235,215,175, 71, 73,165, 82, 16, 66, 28, 15,177,235,175,240,223,108, 54,163,126,253,250,102,111,215,244,198,105,181, 90, 17, - 16, 16, 0,193,141, 50,153, 76,208,104, 52,190, 56, 25,137, 68,242,148, 32,178, 0, 96,249,242,229,136,137,137, 65, 84, 84, 20, -148, 74, 37,228,114,185,131,211, 95,136, 68, 34,116,235,214, 13, 31,127,252, 49,102,204,152,129,209,163, 71,151, 43,104,197, 98, - 49,194,194,194,240,199, 31,127, 64,165, 82, 33, 33, 33, 1,130,192,191,175,109, 65,150, 9,219,127,228,134,195,161,237,222,177, - 46,247, 88, 19,238, 75,251,171, 18, 44, 11,240,124,217,171,147, 97, 64,172, 22,190,232,200,201,204, 9,126,220,207, 42,105,105, -105, 81,254,222, 35,171,213,138, 42, 85,170,136,124, 28,214, 35, 37, 37,229,151,161, 67,135, 74,106,214,172,201, 72, 36, 18,112, - 28, 7,142,227, 4,129,158, 64, 8, 73,224,121,190,125, 78, 78, 14, 89,176, 96,193, 39, 59,118,236,120, 18,192, 38,183, 5, 11, -209, 55, 42, 53,242, 61,118, 31,199,163,207,116,126, 15,127,172, 26,251,104,155,198, 60,130, 20,250,203, 0,254,203, 66,171,118, - 74, 74,202,241,131, 7, 15, 6,152,205,102,180,104,209,226,192,133, 11, 23,154,226,246, 70,112, 15, 5,240,217,184,113,227, 6, - 13, 29, 58, 84, 20, 18, 18, 2,169, 84,138,210,210, 82, 92,190,124,249,197, 31,126,248,129,124,245,213, 87, 95, 0, 8, 74, 75, - 75,107,121,232,208, 33,116,232,208,225, 77, 0,111,223,170, 8, 68,241,123, 15, 93,139, 18,214,123,119,107, 40,105,217,140,205, - 41,115,113, 92,143, 38,224,109,124,250,161,191, 51,252, 17, 98,159,244,237,219,119,224,234,213,171, 3, 1, 96,225,194,133,120, -234,169,167, 16, 22, 22, 6,133, 66, 1,137, 68, 2,177, 88, 92,238,215,199,203, 86, 4,224,147,254,253,251, 63,179,108,217,178, - 32, 0, 88,182,108, 25,250,246,237,139,240,240,112, 4, 5, 5, 65, 42,149, 66, 36, 18, 85,248,102,134,133,133,125,219,250,209, - 71,135, 44, 93,186, 20, 0,240,193, 91,111,225,137,199, 30, 67,160, 66, 14,133, 92, 10,225, 94, 72, 69, 98,116, 31, 49,210,167, -190, 4, 48,235,169,167,158,122,118,197,138, 21, 65, 0,112,244,232, 81,228,230,230, 34, 58, 58, 26,114,185, 28, 82,169,212, 17, -103,134, 97, 32,151,203,253,138,251, 83, 79, 61,245,204,207, 63,255, 28, 4, 0, 75,150, 44, 65,183,110,221, 28,113,151,201,100, -144, 72, 36,229, 22, 87,209,233,142,243,201, 39,159,124,102,229,202,149, 65, 0,240,195, 15, 63,160,115,231,206, 8, 13, 13,117, -220, 79,129,171, 34,105,244, 31,231,124, 56,132,214,241,227,199,159, 86, 42,149,211, 1, 68, 74,165,210,144,231,158,123,174,234, -144, 33, 67,208,191,127,127,108,223,190,253,245, 10, 10, 45, 38, 58, 58,122,240,174, 93,187, 28,111,104, 19,185, 69, 48, 85,248, - 5,110,199,135, 71, 94,127, 61,102,198,101, 13, 14, 28, 58,143, 0,176,204,161, 89,179, 34, 13,151, 46,193,102, 50, 97,210,149, -210,178,237, 86,194,236,124,103, 68,204, 35,115,191,248, 16,192, 18, 47, 46,128,204,104, 52,226,226,197,139, 21, 10,196,205,155, - 55,193,243,188,209,155,187, 32,145, 72,112,234,212, 41,191,122, 33, 36, 36, 36,120,123, 0,125,114,110,222,188, 25,163, 70,141, -194,249,243,231, 33, 76, 85,226, 7, 39, 19, 22, 22, 22, 34,136, 44, 65, 4,201,229,114,136,197, 98,134,227, 56, 70,168,218,179, - 63, 92,126, 9, 99,150,101,241,227,143, 63, 98,230,204,153, 24, 51,102, 12, 22, 45, 90,132, 70,141, 26,253,147, 9, 57, 14,106, -181, 26,161,161,161, 8, 13, 13, 45, 39, 16,239,103,184, 38,243,236, 57,243, 21,224, 73, 89, 35, 16,194, 3, 60, 64, 64,192, 19, - 30, 57, 25,151,241,209,199,159,250,253,246, 17,139,197,184,116,233,146, 35, 31, 8,206,176, 32,140,156, 93,131,196,196, 68,159, -121, 73, 34,145, 76,252,245,215, 95,165, 63,254,248, 35, 86,172, 88, 1,134, 97, 32,147,201,160, 84, 42, 17, 18, 18,130,240,240, -112,199, 18, 31, 31,207,124,247,221,119,146, 70,141, 26, 77, 84,171,213,155,220,167, 57, 9, 86, 84,159, 81,251,153,206,239, 1, - 0,158,121,143,160,232,226,212, 71,216,226, 9,193,255,101,145,213,176, 97,195, 61,251,246,237, 11,208,233,116,224,121, 30,155, - 54,109, 82,116,238,220,121,247,181,107,215,218, 84, 84,108, 37, 38, 38,174,223,183,111,223,227,145,145,145, 40, 41, 41,129, 90, -173,134,197, 98,129, 72, 36, 66, 66, 66, 2, 62,249,228, 19,166, 79,159, 62,195, 95,124,241, 69,131, 92, 46, 23,156,141, 68,247, -121,169,124,102, 90,240,249,151, 33,132,148,229, 31,194,147,114,191,133,185,105,120,235,157,143,252, 10, 99,213,170, 85,255,183, -102,205,154, 64,103,103,201, 89, 4, 56,139, 44, 97,241, 33, 12,216,106,213,170, 13,249,233,167,159, 28,156, 17, 17, 17,224, 56, - 14, 98,177, 24, 28,199,129,101, 89,236,222,189, 27,211, 39,142, 67,104,100, 21,204,255,124,161,207,112, 70, 70, 70, 46,234,214, -173,219,243, 75,150,252, 83,116, 55,172, 94, 29, 61, 31,127, 12, 81, 17, 42, 68,132, 6,149,221, 39,158,193,137,243,215,124,190, -143, 0,176, 85,171, 86,125,121,213,170, 85,129,206, 31,132, 66, 92,133,143,103,193,197, 55,153, 76,104,214,172,153, 95,113,119, -230, 20,220, 54, 65,180, 9,247, 83,184,142,240,188,250, 8,231, 16, 65, 8,219, 5,103, 57, 14,177, 88,140, 85,127, 44,245,232, -102,223, 46,103, 69,211,221,149, 51, 45, 45, 13,211,166, 77,131,240,209,230,220, 84, 40, 46, 46, 14,243,231,207,247, 89, 46,185, - 60, 3,205, 1, 68, 58,109, 50, 1,144, 58,253,230, 49, 12,115,216,205,113,194,118,177,189,198, 42, 18,101,237,198, 74, 1,132, -184,225,243,196,147,111,127,231, 69,186, 28, 95,238, 58, 30,133,214,134, 13, 27,132,167,184,125,106,106,234, 78,251,255, 98,153, - 76,118, 83,161, 80,196, 0, 40,221,180,105, 19, 94,123,237, 53,216,173,213,222,193,193,193,167,221,184, 58,199,141, 70,227,123, - 0,114,236,155,132, 46,154,108, 97, 97, 33,191,117,235, 86,118,217,147, 93, 97, 34, 64,227, 15,167,163, 91,106, 42, 54,199, 73, - 33, 2,240,232,185,124, 40, 20, 10, 78,173, 86, 91,156,219,109,185,105,187,181,205, 37, 67,137, 2, 56, 14, 45,246,108,196,168, - 61, 27,241,168, 82,138,130,213, 43, 81,186,119, 23, 88,150, 65, 91,101, 4, 70, 15,220,138, 86, 42, 25,164, 70, 45, 88,150,117, -151,179, 29,156, 23, 47, 94,236,167, 82,169,166,187,220, 96,127,112, 21,101,243, 56,193, 67, 56, 65, 8, 65,163, 70,141,192, 48, -140,195, 45, 16, 22,225,161, 19,150, 99,199,220,214, 64,122,228,180, 87,193, 65,169, 84,226,207, 63,255,116, 28,211,169, 83, 39, - 24, 12, 6,132,133,133,249,197,153,151,151, 71, 50, 51, 51,153,101,203,150, 65, 44, 22, 35, 60, 60, 28, 10,133,130, 89,186,116, -233, 56,137, 68, 18,111, 48, 24,120,147,201, 4,169, 84, 58, 95, 72, 31,142,227,180,106,181, 58,220, 19,167, 72, 36,194,208,161, - 67,241,238,187,239, 98,209,162, 69,120,253,245,215,111,113,188, 12, 6, 3, 34, 34, 34, 28, 98,203,205, 3,120, 55,186,251,222, - 93, 78,158,224,244,177,205, 56,115,114, 27,120, 27, 15, 27, 79, 64,136, 13,188, 21, 56,186,245, 64,173,172,171,153,113, 4,164, -172,233, 45, 0, 89,137,198,218, 46, 92, 90, 7,192,186,157, 5,166,185,190,194,201,113, 28, 12, 6, 3,126,253,245, 87,156, 59, -119, 14,155, 54,109,130, 94,175, 71, 68, 68, 4, 66, 66, 66,240,216, 99,143,225,197, 23, 95, 68, 98, 98,162,207,184, 19, 66,150, -220,188,121,179,113,235,214,173,153,226,226, 98, 20, 23, 23, 67,175,215,195,102,179,193,106,181,130,227, 56, 4, 4, 4, 64, 46, -151, 35, 58, 58, 26, 6,131,129, 24,141,198, 37,158, 56,121,158, 41,209, 93, 25,123,225,143, 85, 99, 31,125,230, 61,130,213, 51, - 25,212,168, 38,211,253,121, 36,104,200,186, 61,163,187, 0, 32, 60,113, 88, 11,196, 98,227,243,223, 29,247,217,240,123,158, 70, -183,138,172,112,189, 94,143,210,210,210, 50, 91, 95, 42,197,234,213,171, 35,122,245,234,181, 43, 51, 51,179,173, 23,177,117, 11, -103, 80, 80, 80,130, 72, 36,194,169, 83,167,240,213, 87, 95,225,207, 63,255, 68, 78, 78, 78, 81,149, 42, 85,130,219,183,111,207, -190,245,214, 91,104,220,184, 49,190,255,254,251, 0, 95,156,132, 16,164, 93,220,141,180, 75,123,192,243,101,174,117,217,226,254, - 63,241, 51,238, 90,173,214,112,252,248,241,192,111,190,249, 6, 81, 81, 81, 72, 74, 74,130, 66,161, 64, 64, 64, 64,185,151,172, -243,139,215,215,179,169,215,235, 13,105,105,105,129, 63,255,252, 51,194,195,195,145,152,152, 8,133, 66, 1,169, 84, 10,142,227, -192, 48, 12,150, 45, 91,134,229, 31, 15, 68,218,249,147,232,219,179,139,207,112, 42, 20,138,231,151, 44, 89, 82,206, 2,137, 14, - 13, 5, 39,102, 33, 18, 51, 8,237,244, 36, 0,160,104,251, 90,111,163, 67, 58,115, 50,165,165,165,134,131, 7, 15, 6, 30, 57, -114, 4, 60,207, 35, 49, 49, 17, 58,157, 14, 42,149,202, 17,255,173, 91,183,162, 79,159, 62,248,241,199, 31,209,178,101, 75,159, -113,215,104, 52,134,147, 39, 79, 6,254,244,211, 79, 8, 11, 11, 67,213,170, 85, 29,113, 23, 22,177, 88, 12,145, 72,132,228,228, -100,148,148,148, 32, 48, 48,208,103, 26, 29, 61,122, 52,240,167,159,126, 66,104,104, 40,226,227,227, 29,142,155, 32,142,102,126, -249,113, 57,130, 0, 38,246,142, 57, 43,154,238,174,156,125,251,246, 69,141, 26, 53,160, 82,169,160, 84, 42, 29,220,222, 56, 61, -104, 17,135,222,102, 24,102,131,211, 51,145,202, 48,204, 6,231, 95, 79,199,217,255,182, 29, 55,110, 92,179, 25, 51,102, 76,107, -217,178,229,207,251,246,237, 91,238,137,207, 19,207,184,113,227, 82,102,204,152, 49,205,249,120, 55,215,241,236,104,165,166,166, - 50,246, 72, 50, 0,146,154, 54,109,122,120,251,246,237, 97, 65, 65, 65,142,131,111,220,184,129,226,226, 98, 4, 5, 5,169,102, -207,158,173,106,223,190, 61,162,163,163, 29, 95, 0, 23, 47, 94,172, 95,187,118,109, 53, 0, 87,223,150,103, 89, 22,173, 90,181, -194,105,123,109, 71,183,212, 84,196,199,199, 59, 26,121, 4, 4, 4, 96,248,240,225,204,168, 81,163, 56,193,205, 32,132, 64,175, -215, 35, 54, 54, 86,238,205,213, 1,128, 20,125, 62,214,182,111, 11,150, 1,116,199, 14, 65, 34,101,192,138, 24, 52, 33, 5,248, -189, 67, 91, 48, 0, 76,127,239,135, 31, 46,204, 49, 0, 93,238,142,195, 65,112,249,242,101,191, 28, 45,123,188,152,219,229, 20, - 28,141,125,251,246,193,102,179,249,203, 73, 88,150,133, 82,169, 68, 76, 76, 12,228,114, 57, 20, 10, 5,243,243,207, 63,143, 79, - 74, 74,138, 29, 53,106, 20,171, 86,171,217, 86,173, 90,225,169,167,158,226,132, 42,206,148,148, 20,159,113,217,185,115, 39,190, -250,234, 43,188,254,250,235,110, 29, 45,134, 97, 16, 25, 25, 9,149, 74,133, 7, 5, 60, 0,179,213, 2,157, 70,239,168,210,181, -217,108, 56,185,227,239, 90, 87,255,190,152,178,225,231, 31,197, 0, 96,216,177,214,249,180,216,167,190, 92, 89,187, 93,168,248, -224,206, 34,203, 65,111,121,158,227, 56, 12, 30, 60, 24, 51,102,204,192,243,207, 63,143, 77,155, 54, 97,194,132, 9,120,229,149, - 87,110,113,181,124,125, 57, 90, 44,150,175, 95,120,225,133,215, 87,175, 94, 93,231,189,247,222, 99, 5, 71, 75,161, 80,128, 97, - 24, 24, 12, 6, 24,141, 70,232,245,122,156, 63,127,158,127,245,213, 87, 47,152, 76,166,175, 61, 86, 87, 50,242, 19, 10,153,110, - 83,245,120,182,134,246,218,167, 65,173, 31, 75,212, 51,242,166, 37, 79,214,238, 76,122, 12, 78, 12, 5, 33, 32, 60,192, 19,192, -104,212, 98,248,240, 55, 69,255, 98, 82, 57, 68,150,193, 96,192,241,227,199,209,161, 67, 7,220,188,121, 19,103,207,158, 69,173, - 90,181,176,116,233,210,200,231,158,123,110, 87,110,110,110, 91,127,157,173,147, 39, 79,142,123,228,145, 71,230,105, 52,154, 66, -141, 70, 51, 15,192,114, 0,197,151, 47, 95,174,119,249,242,229, 5,155, 55,111,110,243,209, 71, 31,137, 92,218,232,136, 60,217, -163, 22,139, 21,122,189,209,171,192, 18,214, 9,225,253,138, 56,195, 48,164, 78,157, 58,232,213,171, 23,196, 98, 49, 20, 10, 5, - 2, 3, 3,203, 85,155,185, 10, 46,111,229, 7, 0,158, 97, 24, 84,169, 82, 5, 61,122,244,128, 68, 34, 41,199, 41,228,195, 30, - 61,122, 96,228,164, 15,241,245,200,142,248,234,133, 90,232, 60, 37,199,107, 56,117, 58,157,230,175,191,254,146,191,251,250,235, -120,164,102, 77, 68,168, 84,168, 22, 29, 9,185, 76, 10,137,115,152, 24,191, 76,118, 2,128, 23,137, 68,104,208,160, 1,114,114, -114,112,237,218, 53, 92,187,118, 13, 44,203,162,117,235,214, 14, 23,230,210,165, 75,152, 52,105, 18,140, 70,163,223,113,175, 89, -179, 38, 58,118,236, 8,169, 84, 10,133, 66, 81,174,202, 80,184,167,165,165,165,168, 81,163, 6,214,173, 91,135,218,181,107,251, -228,172, 91,183, 46,218,181,107, 87,238,126,202,229,114,135, 40, 2,128,155, 7, 53,142,107,196,197,197, 85,136,115,203,161, 27, -248,102,235, 95, 48,154,120,168,117,150,114, 39,196, 70,168,176,231,167,247,252,138,187,192,185,120,241, 98, 20, 23, 23, 59,140, - 3,225,163, 92, 48, 81,170, 86,173,138,133, 11,221, 59,153, 46, 90,196,221, 59, 47,213,207,247,173,112,156,144,185,100, 51,102, -204,152,230,122,190, 47, 62,231,253, 46,231,155, 92,196, 89, 78,133,170, 14,101, 50,217,251,127,253,245, 87, 88, 73, 73, 9, 46, - 93,186, 4,150,101, 29,117,234, 28,199,193,108, 54,227,202,149, 43, 8, 11, 11, 67,110,110, 46,100, 50, 25, 68, 34, 17, 76, 38, - 19, 0, 52,241,244, 2, 39,132, 96,100, 94, 89, 19,161, 63,170, 72,144, 6,160,103, 94,217,131, 33, 52,136, 95,179,102, 13, 2, - 3, 3, 17, 20, 20,228,248,245, 85,141,116,242,218,101,228,136, 25,176,251,119,131, 97, 1,150, 1, 24, 17,192,178, 4, 44,195, -128,221,191, 11, 12, 3, 40,195, 67, 43, 90, 0,251,106, 24,239,181, 1,188, 39,247,201,157,139,229,250,127,199,142, 29,240,151, -179, 70,141, 26, 8, 12, 12,116, 44,155, 55,111, 46,231,104,217,108, 54,132,135,135,251,195, 73,202,220, 8, 30, 81, 81, 81, 16, -139,197,204,210,165, 75,199, 37, 39, 39,199,190,243,206, 59,172, 72, 36,194,177, 99,199,112,230,204, 25, 36, 38, 38,250,221,102, -171,184,184, 56,107,220,184,113,182,113,227,202,250, 80,164,164,164,160,184,184, 56, 87,216,175, 86,171, 11,186,118,237, 90,174, -221, 70,126,126,254,253,221, 18,222,126, 31,173,102, 43,116, 6, 3, 52,165, 58,135, 59,148,155,153, 19,242,222,168,183,197,179, -134,191, 4, 0, 24, 53,247,115,148, 46,250,167, 32, 91, 59,106, 64,212,147,159,173, 24, 11,160,143, 55,126,141, 70, 3,131,193, -128,234,213,171, 99,223,190,125, 40, 45, 45, 69,247,238,221,193, 48,140,163,135,104, 5, 96,202,200,200,120, 60, 53, 53,245,240, -156, 57,115,170,215,171, 87,143,209,106,181,208,233,116,112,254, 61,121,242, 36, 89,190,124,249, 85,157, 78,215,202,110,157,187, -197,230,140,111, 47,119,139,123,121,245,159,199, 68,169, 81, 53, 46,168, 50,138,170, 91, 11, 50,100, 90,181,254,188,193, 70,206, -128,216, 0, 27,120, 16, 43, 15,155,189,218,235,223,130, 92, 46, 95,176,103,207,158,112,131,193,128,163, 71,143, 98,208,160, 65, -166,252,252,124, 41, 0, 60,255,252,243,166,101,203,150, 73,107,212,168,129,165, 75,151, 70, 62,245,212, 83,171,180, 90,109, 3, - 63,169,127,204,202,202,250,209,117, 99,120,120,248,252, 27, 55,110,180,119,110,243, 99,181, 90, 29,193,113,251, 96,242,128,197, - 98,129, 94,111, 68, 73, 73, 41, 76,102,139,189,204,228, 97,179, 89,237,191, 60,172,246,114, 84, 42,225,130,154, 52,136,209, 16, - 66,192, 50, 76,241,209, 83,217, 85,189,137,118,119, 85, 92,126,186, 89,174,176, 9,189,204,194,195,195, 33, 22,139,241,227,143, - 63,226,196,222,205,144,138, 8,108, 86, 11,172, 22, 51,108, 22, 19,196, 34, 17,254, 60,118, 13, 93,234, 6,249, 37, 8, 35, 34, - 34,208,179,101, 75,164,182,108, 89,214,189,141,227, 16, 40,147, 65, 33, 9, 40,115,178, 0, 16, 27,235,239, 32, 2,188, 16,206, -232,232,104, 28, 57,114, 4, 35, 71,142,196,204,153, 51, 33,151,203, 29,189,159,207,157, 59,135,149, 43, 87,162, 75,151, 46, 21, -142,187,224,224,141, 29, 59, 22,153,153,153,152, 59,119, 46,154, 54,109, 10,177, 88,140,226,226, 98,180,106,213, 10, 57, 57, 57, -126,113, 58, 87,239, 73,165,210,114,238,147, 32, 0, 43,154, 70,206,156, 47,245,141,197,250,189,203,193,128,193,129,159,222, 46, - 39, 10, 23,174,216, 93, 97,206, 9, 19, 38,148, 11,167, 63,110,150,191,112,113,157,124, 30,199, 48,204, 81,193,108, 29, 59,118, -236,251, 12,195,108, 24, 59,118,236,251,211,167, 79, 63,237, 15,159,187,253, 12,195,108,180,139,176,158, 78,219,142, 86, 72,104, - 41, 20,138, 71, 3, 3, 3,113,233,210, 37,116,239,222,221, 84, 80, 80,112, 65, 44, 22,215,202,207,207,151,229,230,230, 66,167, -211,105, 38, 79,158,124, 13,128,188, 69,139, 22, 53,254,252,243, 79,220,188,121, 19,203,150, 45, 3,128,181,238,219,108,176,224, -121,222,145, 41, 92, 63,219, 68, 34, 17,246,239,223,143,253,251,203, 55,253,250,230,155,111,124,190, 48,158,250,245, 55, 28, 59, -118, 12,206,195, 3, 8,255,157,183, 5, 4, 4, 0,222,123,120,148,131,175,134,241,190, 26,192,187,131,191,109,191,220,245,204, -241,132,140,140, 12,143,231,239,223,191,191,156,163,229,139, 83, 36, 18,193,102,179, 65, 46,151, 51, 18,137,132,145, 72, 36,241, -130,200, 18,137, 68,142, 7, 70, 38,147, 65, 38,147,149,251, 74,245,132,204,204,204, 14,153,153,153, 30,247,231,229,229, 61,158, -151,151,135, 7, 17,102,139, 5,122,157, 9,165, 26, 61, 38, 78,255,190,108,227, 68, 28, 4,112,240,241,255,141,196,208,110, 93, - 58, 86,180,154, 90,184,223, 81, 81, 81,216,185,115, 39, 24,134,193,170, 85,171, 16, 28, 28,140,110,221,186, 65,165, 82, 97,236, -216,177,232,215,175, 95, 69, 11,179,146,130,130,130,199,223,122,235,173,195,159,126,250,105,181,170, 85,171,194,100, 50,193,108, - 54,195,100, 50,225,242,229,203, 88,190,124,249, 77,157, 78,247, 56,128, 18, 95,100,155, 51,190,189,252,203,174, 81,153,157,251, - 63,165, 63,151,243, 7,178,179, 11, 96,181,102,128,183, 89, 97,182,218,202, 28, 62,171, 21, 86,171, 13, 18,137, 72,245,233,212, -183,183,242, 32, 96, 89,198, 4,224,137,123,149, 70, 33, 33, 33, 41,121,121,121,184,120,241, 34, 94,124,241,197,236,130,130,130, -179, 0, 58, 1, 64, 65, 65,193,158, 65,131, 6,213, 91,178,100, 73, 76, 82, 82, 18, 2, 3, 3, 85, 90,173,214, 23,101, 32,128, -161, 0,186,162,172, 29,136,128, 66, 0,147, 89,150,149, 29, 61,122,244,150,158,118,187,118,237, 2,128,131,238,191,128,236,142, -150,193,128,188,130, 34,188,242,191,241,255,124, 25,129,148, 19, 23, 4, 4,111,140, 64, 0, 0,228,231, 92,198, 75,175,140,148, -249,250, 32,112,247, 34,172, 64, 27,157,114, 31,106, 66, 30, 13, 12, 12, 44,171,126, 91,183, 28, 27, 63,251, 31, 96, 51,131, 88, -244,128, 89, 7,152, 53,224, 77, 58, 48, 18, 57, 96,209,251, 37,180, 2, 3, 3, 17, 40,151, 35, 42, 36,164,108, 16, 72,145, 8, - 98, 49, 7,222, 2, 48, 54,198, 33, 72,121,255, 6, 6,113,124, 84,202,229,114,164,165,165, 97,232,208,161, 48,155,205,232,219, -183, 47, 76, 38, 19, 12, 6, 3,244,122, 61,146,147,147,161,211,233,252,226, 19,122, 43, 6, 6, 6, 66, 34,145,224,237,183,223, - 70,179,102,205, 48,105,210, 36,140, 25, 51, 6,201,201,201,120,227,141, 55,176,124,249,114,164,164,164,248,226, 37,206,105, 36, -220, 79, 65,108, 57, 87,241, 1,168,112, 26,185,114, 50, 12, 91, 78,176, 9,203,155, 47,116,170, 48,231,140, 25, 51,144,151,151, -119,139,147, 37,252,143,139,139,195,151, 95,126,121,187, 53, 67,130,123, 20,237,102, 95, 79, 87, 39,138, 16,210,220,222,118,202, - 56,125,250,244,211,211,167, 79, 79,101, 24,102,195,244,233,211, 83, 61, 57, 90,238,120,220,236,247,251,165,197,185,212,141,182, -119,222, 41,220,232,176,176, 48, 81,181,106,213, 88,149, 74,133,226,226, 98, 68, 70, 70,146,188,188,188,254, 10,133,226,227,159, -127,254,185,134, 70,163,193,185,115,231, 48,127,254,252,131, 0,230,121, 19, 90,155, 34,237,214,177,221,201,114, 94,239,213,171, - 23,146,146,146,202,185, 89,114,185,220,107,230, 17,246, 9,142,144, 72, 36, 66,237,218,181,229, 87,175, 94,213, 75, 36, 18,196, -199,199,203,179,179,179,245, 18,137,164,194, 61, 93,124, 53,140,247,213, 0,222,157,240,105,222,188,121, 57, 7,203,249,215,249, -255,250,245,235,125, 86, 29, 10,156,245,234,213,115,220,175,160,160, 32,225, 92, 0, 64,247,238,221,193,243, 60, 34, 34, 34,252, -226, 20, 68,173,189, 1, 60, 12, 6, 3, 95, 90, 90,202, 30, 61,122, 20, 82,169, 20, 65, 65, 65,142,182, 58, 1, 1, 1, 14, 55, -147,194, 93,129,192,195,100,177, 64,175,215, 67,163,209, 0, 0, 46,159, 90, 83, 94,136, 25,213,183,205, 47, 20,176,133,133,133, -216,188,121, 51,254,248,227, 15, 52,107,214,204,173,168,174,128,224,202, 43, 44, 44,108, 61,122,244,232, 3, 83,166, 76,169, 18, - 22, 22, 6,179,217,140, 27, 55,110,224,187,239,190,203,212,233,116,173, 43, 82,192,128, 0, 22,139, 21, 6,157, 17, 37,234, 82, -124, 60,245, 7,143, 89, 15, 0, 10,115,207,163, 87,239,126,210,123,153, 78,153,153,153,239,180,110,221,122,106,105,105,105,177, - 78,167,235, 7, 96,150,243,247, 84, 65, 65, 65,155,222,189,123,207, 9, 11, 11,107,154,155,155,251,190, 31,148, 99,211,210,210, -222, 79, 72, 72, 40,183,209,104, 52, 34, 33, 33,161,118,110,110,238,192,182,109,219,126, 8, 32,204,105,119, 16,128, 45, 0,190, -244,148,151,132,170, 67,141, 70, 15, 85, 72, 44, 50,174,237,244, 25, 16,137,200, 0,194,243, 94,203, 16,225, 3,216,211,226,163, -103,220, 45, 65, 21,142, 21, 94,216, 79, 60,253, 2,158, 24, 58, 3, 10, 49, 48,237,165,199,145, 28, 2, 64, 30, 6, 73,219,247, -192,132,216,239,209,208,223,252, 34, 31,243,213, 87, 56,102, 47,143,227, 35, 35, 49,186,127,127, 16, 11,176,239,204, 25,172,248, -235, 47,244,239,208, 1,138,128, 0,191, 63, 88,120,158,135, 68, 34,193,229,203,151,177,111,223, 62,212,173, 91, 23,151, 46, 93, - 42, 55, 12, 5, 33,196,223,248, 59,226, 46,147,201, 32, 22,139,145,157,157,141,212,212, 84, 72, 36, 18,252,240,195, 15,216,185, -115, 39, 70,143, 30,141, 33, 67,134,160,125,251,246, 56,123,246,172, 95,156,132,144, 91,122, 43,186, 86,231, 86, 52,141, 92, 57, - 93,223,251,183,147,238, 2,231,148, 41, 83,220,118,168,240,135,211,157, 22,113,147,118, 71,157,197,144,224, 60, 57, 11, 35,215, -117, 0,161,194,182,177, 99,199,190,239,239,121,206,235,130, 35, 86,145, 42, 76,135,208, 74, 77, 77, 45, 23,243,194,194,194, 3, - 7, 14, 28,168,175, 84, 42,113,254,252,121,169, 74,165,170, 47, 20,232, 44,203, 98,213,170, 85, 65, 61,122,244,216, 58,107,214, -172,120,158,231,145,147,147,131,119,223,125, 87, 99,181, 90, 7, 0,176,122,122,129,251,114,166,126,251,237,214,135,109,221,186, -117,126, 85,129, 8, 66,138,227, 56,132,134,134,234,245,122, 61, 20, 10, 5, 66, 67, 67,245, 58,157, 14, 74,165, 82,168, 43,102, -241, 79, 79, 5, 95,238,147,175,134,241,174, 13,224,125,226,204,153, 51,126, 29,103,175,106,245, 43,151,167,165,165,121, 44, 72, -118,238,220, 9,222, 94,208,250,203,105,255,202, 35,130,240, 83, 40, 20, 8, 11, 11,131, 76, 38,131, 92, 46, 47, 39,178,100, 50, -153,207, 7,199,215,128,164, 1, 1, 1,135,148, 74,101,136,176, 95, 44, 22,163,180,180,180,184,176,176,240,209,251,186,234, 16, - 4, 86,179, 21,122,189, 1,154, 82,125,165,243,155, 76, 38,200,100, 50, 44, 95,190, 28,143, 63,254, 56, 90,180,104,113,139,200, -186, 77,123, 62,189,176,176,176,253,188,121,243, 14,206,158, 61, 59, 84,163,209,224,251,239,191, 47,209,104, 52,237, 1,164, 87, - 72,108,242, 4, 22,179, 25, 58,131, 17, 90, 77,217, 61,184,114,122,205,127, 45,169,150,103,103,103, 47,247,178,255,138,213,106, - 77, 21,198,125,243, 3,143, 37, 36, 36, 32, 59, 59,187,220,198,235,215,175,195,102,179, 25, 81, 54, 78,214,203,206, 70, 50,254, - 25, 61,219,211, 87,124,153, 59,170, 55, 66,163, 41,115, 65, 12,218,252,202,201,167,118,177,225,169, 77,214,237,228, 33,134, 97, - 28,141,190,135, 15, 31,142,147, 39, 78,160, 83, 21, 53,146, 99,130, 64,212, 25,144,116,252, 8,127,231,201, 49,107,206,166, 10, -115,175,116,106, 2, 49,107,229, 74,183,251,174,244,233, 83,161,184, 95,184,112, 1,114,185, 28, 54,155,237,150,247, 77, 69,227, -239, 44, 96,230,204,153,131,209,163, 71,227,135, 31,126,192,201,147, 39,241,200, 35,143,160,115,231,206,200,205,205,197,137, 19, - 39, 96, 52, 26,253, 14,167,115,187,185, 11, 87,207, 96,219,190,223,113, 61,253, 26, 50,179,111,222,118,186, 59,115,186, 10,173, - 95,182, 29,199,211, 93,154,220, 22,231,199, 31,127,140,220,220,220,114, 78,150,115,185,228,201,209,114,213, 34, 46,200,119,105, - 11, 37,172,155, 92, 68,143,235,186,235,241, 0,144, 11, 64,228,227, 60,215,245,252,233,211,167,239, 16,156, 48, 59,175,200, 87, -251,172,114,142,150, 11,102,244,233,211,167,247,252,249,243, 35, 3, 2, 2, 28, 61,144,198,142, 29,139,209,163, 71,163,122,245, -234,136,136,136,136, 11, 9, 9, 65, 65, 65, 1,102,206,156,137,180,180,180,215,224,102,160, 61, 87,161,213,230,106, 41,164,210, -127, 62, 88, 5,103, 11, 0,134, 12, 25,114,139,163, 37, 36,144, 55, 88, 44, 22,132,135,135, 67,167,211, 65, 36, 18,161,111,223, -190,162, 83,167, 78,217,186,117,235,134, 39,159,124, 82,116,226,196, 9, 91,207,158, 61, 33, 18,137,208,177, 99, 71,245, 47,191, -252, 50, 10,192,103,126,136,173, 74,107, 24, 47,100, 50,127,199, 62,242, 71, 92,122,227,100, 24, 6, 58,157, 14, 28,199, 57, 26, -202,251,195, 41, 84, 29, 58, 63,128, 44,203, 34, 36, 36,196, 81,120, 8,142,150, 32,180,124,241,250, 26,144, 84,161, 80,168,206, -159, 63, 95, 67,232,120,145,159,159,143,142, 29, 59, 94, 44, 44, 44,188,191, 45, 45, 30, 48, 91,109,208,232, 13,208,232,117,149, - 70, 43, 60, 15,139, 22, 45,194,217,179,103, 97, 48, 24,176, 96,193, 2, 71,167, 2,103,145,117, 7,130,235,178, 92, 46,231,187, -119,239,142, 3, 7, 14, 64, 38,147, 89,112, 27,227, 95,241,132,135,217,106,133, 65,175,135,198,119,149,219,131, 2,135,170, 62, -123,246, 44, 76, 38, 19, 38, 77,154,100, 59,124,248,240, 14,148, 13,128, 42, 56,120, 3,219,181,107, 55, 89,169, 84,134,108,220, -184,241, 77, 0, 63,120,123,121, 91,172,118,209, 94,137,247,209,185, 70,192, 93,155,172,219, 25,102,197,249,197,202,243, 60, 94, -123,245, 85,116,174,162,198,147, 77, 35,161,205,186, 8, 69,112, 36,152,144, 68,204,154,179, 9,167,175,250,221, 20,147, 0, 64, -247,118,125,208,168,238,173,195,131,181,238, 84,246, 77,182,231,207, 67,200,201,207,172,112,220,181, 90,173, 71,231,170, 2,142, -150,227,153, 19,238, 95,227,198,141, 81,171, 86, 45,236,216,177, 3, 77,154, 52,193,165, 75,151,112,233,210, 37,164,165,165,225, -228,201,147, 40, 42, 42,170,112, 26,253,186,101, 5,138, 74, 11, 33,149, 72, 81, 88,156,143,235, 25,215, 16, 29, 30,115,199,233, - 46,160, 78,207,143, 1, 0, 85, 34,131, 43, 36,180,156, 57, 63,249,228,147, 91,196,251,157, 14,217,195, 48,204, 33,111,235, 21, - 61,255, 94,194,147,208,186,150,151,151,215,162,127,255,254, 99, 1, 52,183,111, 43, 1,176,114,235,214,173,125,162,162,162, 58, -180,108,217,146,147, 74,165,216,183,111, 31,126,249,229,151, 31, 0,172,240,118, 33,169, 84,170, 79, 76, 76,148, 11, 25, 81,120, - 16, 85, 42,149,104,230,204,153,204, 55,223,124,227,209,229,242,149, 64, 37, 37, 37,208,106,181, 8, 14, 14,134,217,108, 70,247, -238,221,109,103,207,158,133, 68, 34, 65,239,222,189,109,103,206,156,113, 36,244,226,197,139,227,245,122,125,171, 63,254,248,163, - 43,128,182, 21,184, 87, 66,195,248, 64,248,217, 0,222,211, 87,158, 63,240,183, 58,206, 19,231,200,145, 35,111,139, 83, 34,145, - 88,133,145,223, 89,150,133,217,108, 70,147, 38, 77,144,155,155,235,120,104,148, 74,165, 67,100,249, 35,180,124, 13, 72,202,113, - 28, 76, 38, 19,218,182,109, 11,134, 97,240,249,231,159, 63, 24,213,145, 60,207, 4, 6,134,163, 74,149,218,136,140, 50,128,231, - 43,119, 86,153, 49, 99,198,148, 19, 83,238, 70, 94, 22,238,255,237, 64,224,186,147,217,231, 9,224,168,242,210,106, 13,247, 93, - 18, 70, 69, 69,181,200,205,205, 93,231,178,185, 16,192,100, 47, 31,150,142,132,190,121,243, 38,186,117,235,134,223,127,255, 93, -180,118,237,218, 78,235,215,175, 63,115,241,226,197,155, 77,154, 52,169,250,250,235,175,203,218,182,109,139,252,252,124, 52,109, -218,116, 98, 70, 70,134, 23,161,101,191,143, 6, 35,180,218,202,119, 71,221,185, 89,119,242, 98, 20,242,228,132, 9, 31,162,115, -108, 49,250, 62, 18,140, 37, 27,246, 98, 96, 99, 57, 96,146, 85,152, 79, 8, 75, 88,149, 36, 36,166,180,184,101,191, 76, 85, 54, -150,107, 98, 74, 11,176, 55, 47, 85, 56,238,206, 97,118, 21, 85,183,227,232, 57,223,207, 87, 94,121, 5,239,189,247, 30,186,118, -237,138, 75,151, 46, 97,215,174, 93,184,116,233, 18, 70,142, 28,137,148,148, 20, 60,242,200, 35, 21,226, 92,191,109, 53,212,154, - 18,176, 12,139,194,146, 2, 24,140,122,140,121, 99,194, 29,167,187,227,229,191,109, 58, 0, 96,205,214, 99,183,205,249,193, 7, - 31, 32, 59, 59,187,156,147,117, 39,237,178,238,119,120, 27, 45,237, 26,128,215, 92, 55,154, 76,166,160, 73,147, 38,117,137,136, -136, 0,195, 48,152, 51,103, 14,194,194,194, 30, 7,112,218,100, 50,229,107,181,218,209, 78, 34,164, 51,236, 99,109,228,228,228, -184,237,183,175,213,106,205, 93,186,116, 17,199,198,198,150,235,109,168, 84, 42, 61,185, 59, 14, 78, 97,159,213,106,197,152, 49, - 99, 48,109,218, 52, 84,171, 86, 13, 61,123,246, 68,106,106, 42, 24,134, 65,247,238,221,209,179,231, 63, 85,185, 33, 33, 33,146, -223,127,255,189, 29,203,178,103,156, 94, 32,229, 56,221, 65,104, 24,111,177, 88,252,109, 0, 95,142, 83,200,108, 35, 71,142,196, -180,105,211,240,254,251,222,155,122,124,245,213, 87,192,173,237,169,238, 58,103, 97, 97, 97,185,194, 94,161, 80,124,254,228,147, - 79,114, 55,111,222, 44, 39,174,156, 23, 55, 5, 81, 57, 78, 95, 3,146,138, 68, 34, 68, 71, 71, 99,202,148, 41, 8, 15, 15, 71, - 76, 76,140,187,129,252,124,166,209,109,224,174,114,218, 8,127,244,211, 25, 31,182,254,126,217,122,177, 76, 10,236,223,181, 6, -234,162,242,213, 73, 70,243, 63, 93,169,165, 77, 58,193,116,236, 79,191,242,146, 32,166, 63,254,248, 99,124,252,241,199, 94, 3, -180,104,209,162, 59,142,187,159, 98,235, 86, 78,158, 48, 10,101, 40, 2,148, 85, 80, 63, 37, 20, 60,177,254,167,210,200, 3, 14, - 31, 58,116,168,119,120,120, 56,210,211,211, 35,197, 98,113,239,114,118,149, 94,143,196,196,196,218,121,121,121,173,124,113,142, - 28, 57,210, 56,126,252,120,217,128, 1, 3,240,228,147, 79, 98,192,128, 1, 50,137, 68, 82,147, 16, 2,179,217,140,244,244,116, -252,249,231,159,200,203,203, 59,231, 45,156, 60, 33,140, 92, 17,130, 0,101, 44,234, 55, 8, 1,207, 91, 43, 37,238,206,174,184, -179,155, 85, 65,145,229, 54,127, 2,192,225, 63,215, 97,194,219, 13,240,195,198,131,152,127, 8,104, 20,146,139,250,145,121,224, -243,206,225,221,129,205, 48,235,167, 35, 0,128, 93, 59,125,166, 17,241,150, 7, 13,122,243, 29,197,221,217,185,114,190,142, 31, -109,180,110,225, 20, 62, 18, 75, 75, 75, 81, 92, 92,140, 37, 75,150,224,165,151, 94, 66,110,110, 46,210,210,210,112,241,226, 69, -252,252,243,207, 80, 40, 20,183,149, 70,163, 94,253, 0,227,103,189, 3, 2,130, 58, 53,234, 99,236,208,143,209,188, 81,203, 59, - 78,119, 87,248,225,102,121,228,156, 59,119,238,237,230,165,135, 78,104,185, 69, 68, 68,196,128,118,237,218,193, 96, 48, 32, 50, - 50, 18,105,105,105, 96, 89,182, 58, 80, 86,133, 23, 23, 23,183, 50, 47, 47,175,186,191,124, 34,145, 8, 86,171,213,209,246, 71, - 88, 0,160, 87,175, 94,248,237,183,223,124,126, 81,196,196,196,160,106,213,170,120,235,173,183,110,233,229,224,220,211, 65, 46, -151, 99,227,198,141,217,133,133,133,133,132,144, 10,117,115, 19, 26,198,239,217,179,199,239, 6,240,206, 48,155,205, 55, 47, 94, -188, 24,187,104,209, 34,145,151,151,159, 3,187,118,237,178,194, 71, 85,205,221,224,116,247,101, 74, 8,241, 40,178,252, 25, 70, -192,215,128,164, 28,199,225,194,133, 11,152, 48, 97, 2, 24,134,193,154, 53,107, 30,136,135,235,212,249,130,111, 88,150, 13,237, -245, 68,235,134, 96, 24,152, 77,183,214, 84, 7, 22,105, 28, 34,235,201,207, 86, 96,237,168,254,254,136,158,203,187,119,239, 14, - 91,180,104, 17,231, 79,186,239,222,189,219, 74, 8,169,112,181,159,240,194, 49,155,205,208,235,111,207, 69, 33,132,236,155, 62, -117,124,151,165, 63,110, 18, 51,140, 9,251,119,174, 65, 73,177,251,230, 12, 82, 49,135,111,150,252, 98,149,136, 69, 55,255,229, -164,251,162,111,223,190, 3, 22, 44, 88, 80,223,221, 78, 63, 58,193,164, 25, 12, 6,100,100,100, 64,167,211,173, 30, 55,110,156, -121,211,166, 77, 47, 63,245,212, 83,120,228,145, 71, 16, 27, 27,139,172,172, 44, 92,190,124, 25, 75,150, 44, 33,123,247,238, 93, - 13, 96,152,143,251,184,110,198,212,241, 47, 46,249,105,147,148,101,204,216,191,107, 13, 74, 92, 68,251,173,238,180, 24,223,254, -240,139, 89, 34, 17,159,247,229, 22, 57,187, 89,149,249, 98,236, 61,104, 40,158,156, 55, 31,213,155,119,195,140,153,157,241,237, -212,126,152,221, 93, 2,243,170,129,104,244,204, 82, 44,159,212, 3, 0, 80,229, 91, 63,221, 18, 78,130, 27,110, 28,171,226,146, - 0,187,184,169,152,107, 42,196,221,155,115, 85, 81, 71,139,101, 89, 36, 37, 37,161,122,245,234,120,252,241,199,209,164, 73, 19, -116,232,208, 1, 39, 78,156,192,137, 19, 39, 48,114,228, 72,111, 34,203,103, 26,181,111,213, 5, 7,219,156,191,227,180,113, 77, -247,202,128, 63,121,105,232,208,161, 0,240, 80,185, 91, 21, 22, 90,106,181,250, 4,207,243, 13,131,131,131, 5, 71,202,177,239, -250,245,235,224,121, 94, 87,209,132, 49,153, 76,194,224,152,229,198,101, 18, 26,199,123,123,240, 9, 33,182,194,194, 66,180,107, -215, 14,109,218,180,113, 84,159, 56, 47, 78,194, 4,107,215,174, 5, 33,164,194,141,172,157, 26,198,107, 80,193, 6,240, 0,144, -155,155,219,173,109,219,182, 91, 57,142,243,107, 22, 77,158,231,211,114,114,114,158,184,215,156,238,210,135,231,121,143, 34,203, -159,130,200,215,128,164, 28,199, 65,169, 84,226,215, 95,127, 69, 68, 68,196, 3,245,128,157, 56,155,247,137,183,253,237,194,165, - 59, 1, 68, 62,249,217,138, 27, 59, 11,204, 9, 79,126,182,226,250,218, 81,253,171,121, 59, 39, 59, 59,187,107,255,254,253,127, -247, 55,221,173, 86,235,181,236,236,236, 10, 15,151, 64, 8,193,249,243,231,249, 87, 94,121, 37, 63, 47, 47,175,223,237,196,127, -236,132,249,179,167, 77, 28, 30,222,189, 75,139,230, 96, 1,147,231,198,191,132, 1, 8, 39, 22,221, 28,253,254,220, 87,251,245, -235,247,111, 38,155, 58, 59, 59,251,241,167,159,126,122, 24,254,105, 58, 81, 78, 72,193, 67,239,106, 59,230, 85,173, 90,181,129, - 72, 36,146, 1,152, 0,224,250,222,189,123,191,216,187,119,111, 87, 0,143,137, 68,162, 88,155,205,150, 97,255,232, 89, 1,224, -111,223,249, 40,247,117, 16, 62,190,123,231,199,186,129, 97,136,201,100,244,241,129, 4, 2, 66,136, 68, 34, 62,127,248, 68, 86, - 35,111, 31, 82, 78, 51,112, 84,122,149,253,176, 97,195, 48,108,216, 48, 71,126,250,252,243, 54, 88,125,106, 15,158,105,148, 14, -227,215,173,193,168,170,249,253,193, 7, 0, 31,124,248, 74,165,133,205, 57,238,206,142,150,187,231,160, 34,109,180, 68, 34, 17, -242,243,243,113,225,194, 5,228,228,228, 64,167,211,225,236,217,179, 48,155,205, 40, 42, 42, 66,131, 6, 13,110, 59,156,149,149, - 70,255, 38,231,195, 88,125, 88, 97,161,101, 54,155, 63, 74, 74, 74, 18, 7, 4, 4,212,183,217,108, 32,132,192,102,179, 17,187, -168,169,112, 47, 60,177, 88,108,168, 85,171, 22,227,174,119,130,240, 95,169, 84,234,189,184, 37,211, 19, 19, 19,199, 49, 12, 35, -242,244, 21, 34,252,231,121,222,198,113,220,244,219,188, 87,119,218, 48, 94,155,151,151,215,178,146,211,239,110,112,186,166,143, -182,110,221,186,142, 25,237, 93,199, 68,177, 79,182,170,245, 33,206,189, 14, 72,170,213,106,179,186,117,235,102,115,222,239, 60, -160,233, 3, 13,134, 92,239, 49,224,229,132,157, 5,230, 4, 0, 16,196, 22, 8,185,238,229, 44,125,118,118,118,187,187, 29,180, -171, 87,175,154, 30,123,236,177, 31, 75, 75, 75,135, 2,184,237,214,252,239,127,244,249,251,247, 97,202,168, 1, 76,187,205,115, -175, 23, 20, 20,116,116,217,246,183, 32,168,132,113,237, 42, 44,218,207,229, 87,250,216, 98, 86,171, 53,189,122,245,234, 21,114, -110, 44, 22, 75,186,175,253,174, 99,132, 57,227, 52,130,241,254, 1,160,172,243,119,129, 95,156, 6,131,161,176,101,203,150,226, - 10,198, 45,215,223,184,199,198,198,162, 74,149, 42,142, 95, 1,174,219,125,133,211,106,181,166,199,199,199, 35, 34, 34,194,227, -136,239,174,109,178,252,225,172,236, 52,242,198, 89,165,202,210, 74,231,188,221,112, 82,248,135,206,148,147,114, 82,206,251,150, - 83, 68,239, 39,229,164,156,148,243, 30,114, 62,112, 32,132,128,182, 82,163,160,160,240, 4, 27,189, 5, 20, 20, 20, 20,119, 6, -198,139, 42,173, 72, 79,159,219, 81,182,219, 40, 39,229,164,156,148,147,114, 82, 78,202,249,208,113,250,226,174,236,158,198,255, - 26,238,100,120,156,187, 41,192, 40, 39,229,164,156,148,147,114, 82, 78,202,249,240,113, 62,112,160, 85,135, 20, 20, 20, 20, 20, - 20, 20, 20,119, 17, 84,104, 81, 80, 80, 80, 80, 80, 80, 80, 80,161, 69, 65, 65, 65, 65, 65, 65, 65, 65,133, 22, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 21, 90, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,247, 21, 8, 33,101, 83,240,108, -216,176,193, 49,208, 67,106,106, 42, 67,111, 13, 5, 5, 5, 5, 5, 5,197,189,196,131,170, 69, 56, 42,176, 40, 40, 40, 40, 40, - 40, 40,254, 11,120, 16,181, 8,235, 78, 73, 82, 80, 80, 80, 80, 80, 80, 80,220,107, 60,136, 90,132,125,144, 85, 36, 5, 5, 5, - 5, 5, 5,197,253,131, 7,222,209,162,174, 22, 5, 5, 5, 5, 5, 5,197,191,133,251, 88,139, 16,251,226,188, 78, 65, 65, 65, - 65, 65, 65, 65, 65,113,135, 2,203,227, 47,157,235,144,130,130,130,130,130,130,130,226,246,193,184, 89,191,167,110, 22,157,217, -156,114, 82, 78,202, 73, 57, 41, 39,229,164,156, 15, 37, 28,227,104, 81, 80, 80, 80, 80, 80, 80, 80, 80,220,153,174,114,250,239, -112,186,168,208,162,160,160,160,160,160,160,160,184,115,145,197,184, 91,167,109,180, 40, 40, 40, 40, 40, 40, 40, 40,238, 18,168, -163, 69, 65, 65, 65, 65, 65, 65, 65,113,103,112,109, 4, 79,171, 14, 41, 40, 40, 40, 40, 40, 40, 40, 42, 89,108,185,221,232,169, -231,192,182, 10,144,223, 78,239,131,109,148,147,114, 82, 78,202, 73, 57, 41, 39,229,124,232, 56,125,113,111,195,253,135,118, 0, -118, 0,104,111,255, 5, 0,134,144,187, 63,210, 3,237,250, 74, 57, 41, 39,229,164,156,148,147,114, 82,206, 7, 29,174, 3,150, -150,173,208, 1, 75, 41,252, 0, 7,239, 85,204,190,246, 83, 80, 80, 80, 80, 80, 60,108, 98,139, 56,191, 36,221,161, 38,128,247, - 1, 4, 59,109, 59, 4, 96,186,203,113, 63, 1, 80, 56,173,107, 1, 76, 2,112,201,103,104, 8,145,216,249,101,246,133, 7, 96, - 0, 96, 4, 80,202, 48,140,133,166,217,191,142,150, 0, 82,237,255, 55, 0,216, 95,193,253, 15, 20, 98, 99, 99,229,161,161,161, - 93,143, 29, 59, 38, 61,123,246, 44,118,239,222, 77,190,249,230, 27,115, 81, 81,209,150,172,172, 44, 61,205, 46, 15, 4,186, 1, - 24,107,255, 63, 3,192,230, 59,228, 99, 20, 10,197, 72,165, 82,217, 67, 38,147, 85,177, 90,173,140, 78,167,203,212,106,181, 91, -173, 86,235,103,246,114,175,162,232, 19, 22, 22,246,114,157, 58,117,106,166,165,165,101,100,102,102,254, 4, 96, 21,128,126, 85, -170, 84, 25,152,152,152, 24,119,254,252,249, 75,133,133,133,223, 2, 88,247, 47,134,147,130,226, 97, 2,227,205,141,112,135, 9, -132,144,129,229, 24,152, 91, 57, 58,118,236,216,123,203,150, 45, 10,158,231, 33, 44,114,185,220, 10, 96,176, 15,145, 21,190,111, -223,190,132,161, 67,135, 62,153,153,153,217,172,180,180,244, 81, 0, 80, 40, 20, 7,163,162,162, 14,207,155, 55,239,103, 66, 72, - 58,195, 48,165, 21,140, 40, 39, 22,139, 95, 10, 13, 13,237, 97,181, 90,155, 16, 66, 32, 22,139,143, 21, 21, 21,109,182, 88, 44, -223, 2,184, 29,241, 38,229, 56,110,152, 76, 38,235,102,181, 90, 27, 2, 0,199,113, 39,141, 70,227,102,171,213,250, 5, 0,211, -109,112, 6, 72,165,210, 97, 42,149,170,139,201,100,106, 8, 0, 82,169,244,164, 90,173,222,106, 50,153,190,176, 11,206,127, 27, - 28,128, 84, 66,136, 24, 0, 68, 34, 81,159, 71, 31,125, 52,129, 97, 24,158, 97, 24, 66, 8, 97, 14, 30, 60,216,216,102,179,177, -246,252,145, 10,224, 48, 0,235,253,248,132, 68, 68, 68, 76,227,121,190,138,215, 68, 11, 8,104,118,236,216,177, 58, 43, 87,174, -180,125,253,245,215,197, 67,134, 12, 9, 28, 58,116, 40,247,249,231,159,127,145,149,149,245,166,235,241,225,225,225,179, 89,150, -141,240,231,250, 60,207,231, 23, 20, 20,188, 67,203,170,127, 29, 99,191,220, 86,218,150, 16, 96, 88,151, 32,246, 78,133, 86, 92, - 92,220,146, 23, 95,124,113, 64,195,134, 13, 57, 66, 8, 44, 22, 11,140, 70, 99,157,253,251,247,183, 95,179,102, 77,179,210,210, -210,126, 21,164,124,245,189,247,222,155, 50,121,242,228, 8,177, 88,204, 88, 44,150, 26, 43, 87,174,108,242,250,235,175,191,181, -104,209,162,170,207, 62,251,108,144,176,125,194,132, 9,205,103,204,152,145, 12,224,179,127, 33,156, 20, 20, 15, 27,218,161,124, - 27,173,137, 0, 62,246, 38,180,148,246,151,103, 14,202,156, 44, 56,253, 58,176,125,251,246,245, 28,199, 9,142,214,163, 90,173, - 54, 26,229, 93, 48,119, 34, 43,113,208,160, 65, 45, 87,175, 94, 61,237,217,103,159,205, 86, 40, 20,181,158,122,234,169, 82,134, - 97, 68, 43, 87,174,108, 92,189,122,117,121,175, 94,189, 6,117,236,216,113, 20, 33,100, 55,195, 48,121,126, 70,178,126, 88, 88, -216, 47,159,124,242, 73, 66,183,110,221, 36, 17, 17, 17, 32,132, 32, 51, 51, 51,110,227,198,141,221, 39, 78,156, 56,170,176,176, -176, 47,128, 51, 21,184,113,205,229,114,249,234,137, 19, 39,198,118,239,222,157,139,137,137,129,193, 96,192,217,179,103, 59,111, -222,188,185,237,162, 69,139,222,212,235,245,207,216, 5,134,191,120, 52, 56, 56,120,205,247,239,189, 23,221,226,165,151,184,176, -176, 48, 16, 66,144,151,151,215,121,207,210,165,237,223,248,228,147, 55, 75, 74, 74,158,118,119,191,255, 77, 72,165, 82,118,217, -178,101,143, 72,165, 82, 0,128,201,100, 66, 74, 74, 10,243,192,124,138, 48, 76,124,102,102,102,176, 68, 34,113,187,223,102,179, -161,109,219,182, 73, 18,137, 4,159,125,246,153, 37, 63, 63,191,241,130, 5, 11,142, 45, 95,190, 60,226,139, 47,190,120, 6,192, - 45, 66,139,101,217,136,244,244,116,183,156, 54,155, 13,102,179, 25, 86,171, 21, 38,147, 9,245,234,213,163,197,212,127, 3, 9, - 0,176,233,132, 1, 0,194,238,148, 76,169, 84,214,125,238,185,231,184,188,188, 60,136,197, 98,152,205,102,100,103,103, 35, 37, - 37, 69,244,227,143, 63,214,174, 40, 95,141, 26, 53,134,204,152, 49, 35,114,211,166, 77,230,101,203,150,153,186,116,233, 34, 30, - 50,100,136,170,109,219,182,245,226,227,227,217,239,190,251,206,184,117,235, 86,203,160, 65,131,164,211,167, 79,143,220,184,113, - 99,175, 51,103,206,124,118,175,195, 73, 65,241, 16, 98, 7,254, 25,226, 65,248,245, 42,180,224, 36,174,250, 0,128, 88, 44,110, - 28, 29, 29,189,196,106,181,198,216, 93,157,236,156,156,156,207, 44, 22,203,113,251,177,235,120,158,239,237,203,201, 26, 52,104, - 80,203,223,127,255,125,214,254,253,251, 75, 10, 10, 10, 98,214,175, 95,111, 24, 53,106, 84, 26, 0, 92,189,122, 53,185, 87,175, - 94,113,195,135, 15, 79,239,218,181,235,188, 14, 29, 58,140, 32,132,108,101, 24, 70,235, 75,100,165,164,164,236,219,181,107, 87, - 80, 72, 72, 72,185, 29,137,137,137, 24, 49, 98,132,164,119,239,222,213, 59,117,234,180,247,242,229,203,109, 0,156,242, 71, 16, -213,172, 89,115,219,246,237,219, 3, 67, 67, 67, 81, 92, 92,140,236,236,108,232,116, 58,168, 84, 42, 60,251,236,179,146,118,173, - 31,175, 58,124,228,155,219,210, 51, 50, 58,251, 41,182, 30,125,188,126,253,109,203,167, 79, 15,180,220,184, 1,185, 92, 14,141, - 70, 3, 0, 8, 10, 10, 66,179,164, 36,238,200,210,165,113, 3,199,140,217,118,248,194,133,206,255,146,216,146,217,127,141, 0, - 54,136, 68,162, 62, 82,169,148,237,211,167, 15,182,109,219,198, 24, 12, 6,206,238,238, 88,251,244,233, 3,185, 92, 14,147,201, -196,163,172,234,208,122, 63, 63, 37, 82,169, 20,151, 47, 95, 46,183,173,180,180, 20,121,121,121, 40, 40, 40,128,209,104, 68,113, -113, 49,120,158,103,228,114,121, 30,207,243, 96,217, 50, 67,207, 19,167, 68, 34,193,133, 11, 23,202,109,179, 90,173,208,106,181, - 48, 26,141, 48,155,205, 40, 45, 45,149, 7, 5, 5,213,140,136,136, 72, 7,176,174,176,176,240,179,156,156,156,235,180,220,250, - 87,112, 99,195,113, 67, 53,148, 57,213,215, 42,129,143, 7,128,221,187,119, 35, 39, 39, 7,249,249,249,200,203,203, 67,124,124, - 60, 8, 33, 21,174,142,187,124,249,242,151, 13, 26, 52, 96, 78,159, 62,189, 25,192,231, 43, 87,174, 28, 92, 88, 88, 56,118,244, -232,209, 97,159,126,250,105,225,152, 49, 99,102, 0,248, 97,229,202,149,255,171, 91,183,110,143,115,231,206, 45,250, 55,194, 73, - 65, 81,217, 32,132, 52, 7, 16,105, 95,205,183,151,187,225, 78,235, 39, 24,134, 49, 57, 29,103, 2, 32,117,243, 43, 64, 88,207, - 99, 24,230,176,211,121,121, 12,195, 28,190,221, 96,186,252,150,125,116, 3,192,134, 13, 27,136,176,184, 59, 51, 42, 42,106,100, -199,142, 29,103, 29, 61,122,180, 94, 86, 86, 86,104, 86, 86, 86,232,209,163, 71,235,117,236,216,113, 86, 84, 84,212, 72,167, 27, -225,122,234, 54,167,125,146,125,251,246, 37,252,242,203, 47, 51,182,109,219, 86,210,184,113, 99,211,246,237,219,173, 93,187,118, -205,181,191,160,173, 93,187,118,205,253,235,175,191,108, 45, 90,180,144,255,254,251,239, 55,247,238,221, 59,123,245,234,213,209, -132, 16,145, 59, 78, 59,196, 33, 33, 33,191,238,220,185,243, 22,145,229,140,170, 85,171, 98,195,134, 13,170,144,144,144,117, 0, - 36,158,194,105, 71, 64, 64, 64,192,154,191,254,250, 43, 48, 40, 40, 8,185,185,185, 16,139,197,136,138,138, 66, 73, 73, 9,178, -179,178,112,253,226, 69,176, 38, 19,230, 76,157, 28, 36,151,203, 87,187, 36,160, 91,206,224,224,224, 53,203,167, 77, 11, 44,216, -182, 13,127, 79,153, 2,179,217,236,168,114, 53,155,205,216, 59,116, 40,242,254,252, 19,223, 77,152, 16, 24, 28, 28,188, 6, 64, -128, 15,206,202,128, 51,231, 80, 0,133,246,101, 40,128,253, 41, 41, 41, 71,207,158, 61,139, 54,109,218, 96,213,170, 85,141, 70, -143, 30, 61,116,244,232,209, 67, 87,173, 90,213,168, 77,155, 54, 56,123,246, 44, 82, 82, 82,142,162,124,251,172,187, 29,206,187, -198,105,179,217,202, 45, 60,255,207, 59,166, 74,149, 42,185,191,252,242, 11,158,125,246, 89, 86, 42,149,102,245,239,223, 95,182, -103,207, 30, 98, 23,153,126,135,211, 96, 48, 64,175,215, 67,171,213,226,234,213,171,242, 79, 62,249,164,245,199, 31,127, 92, 99, -219,182,109,113,239,191,255,254, 27,145,145,145,199,162,163,163, 19, 30,132,251,121, 31,114,102, 3, 48,163,172,189,233,245, 59, -225,236,216,177, 99,131, 26, 53,106, 68,175, 60, 29,138, 34, 73, 29,240,146, 16,240,146, 16,216,194,155,227,178,244, 9, 84,171, - 86, 45, 58, 48, 48,176,101, 5,195,185,236,244,233,211,143,217,191,148, 11, 0,204, 26, 51,102,204, 68,134, 97,118,143, 25, 51, -102, 50,128, 89,246,237, 83,206,157, 59,215, 2,192,242,127, 41,156, 52, 47, 81,206, 10,195,135, 22,137,100, 24,102, 3,195, 48, - 27,198,141, 27,215, 1, 64,184,203,122, 43,231,227, 0, 72,221,253, 10,139,211,246, 72, 66, 72, 79,167,243, 34,111, 51,248,140, -155,229, 31,161, 5, 0,169,169,169, 76,106,106,170,176,227, 16,195, 48,235, 1, 28, 18,139,197,141, 31,121,228,145, 62,127,252, -241, 71, 80,100,228, 63,215,143,140,140,196,234,213,171,131,234,215,175,223, 71, 44, 22, 55, 6,112, 72,165, 82,173,247,226,194, -132, 12, 29, 58,244,201, 23, 94,120, 65,221,184,113, 99, 0, 40, 62,115,230,140,162, 69,139, 22, 90,171,213,202, 88,173, 86,166, - 69,139, 22,218, 51,103,206, 40, 44, 22, 75,105,243,230,205,149,157, 58,117, 74,123,231,157,119, 6,185, 17, 28,206,120,110,230, -204,153,241,161,161,161,222,148, 48, 74, 75, 75, 17, 29, 29,141,161, 67,135,198,136,197,226,151,189,221, 45,142,227,134,205,156, - 57, 51, 42, 36, 36, 4, 69, 69, 69,136,143,143,135,201,100,194,133, 11, 23, 96,208,106, 96, 41, 85,195,162, 46, 70,222,149, 75, - 8, 17,115, 24,212, 59, 53,154,227,184, 97, 62,220,146, 97,223,142, 25, 19,109, 74, 75,195,213, 85,171, 96,179,222,106,254, 88, -205,102,156, 92,188, 24,134,244,116,204,120,229,149,104,169, 84, 58,236, 30, 59, 89,159, 18, 66,228,132, 16, 57,195, 48,243, 90, -182,108,249,163, 92, 46, 31, 58,125,250,244,110, 91,182,108,233,190,107,215,174,246, 86,171, 85,108,181, 90,197,187,119,239,110, - 99, 48, 24, 56,153, 76, 6,142,227, 8, 30, 80,136,197, 98, 72, 36, 18,200,229,114,180,110,221,250,202, 55,223,124, 99,137,143, -143, 23,175, 89,179, 38,180, 74,149, 42,202,207, 63,255,188,184,180,180,116,166,191,124,102,179, 25, 70,163, 17,122,189, 30, 6, -131, 1,219,183,111, 79, 26, 62,124, 56,103, 48, 24,108,189,122,245, 42,180, 88, 44,198, 49, 99,198,168,194,194,194, 70,209,111, -216,127, 5, 86, 0, 26,187,208, 50,186, 60, 31, 13,157, 28, 95,159, 40, 46, 46, 94,244,237,183,223,198,179,178, 16,236, 49,245, -192,207,252, 68,108, 9,254, 28,185, 9,239, 34, 42,190, 6, 6, 12, 24, 16, 69, 8,249,188, 18,194,188, 0, 64, 91, 0,243,110, -231,228,123, 16,206, 4,165, 82,185, 42, 40, 40,104,143, 82,169, 92, 5,123,245,236,157,160, 75, 13,116,238, 93,151, 77,239, 82, - 29,164,119, 93, 54,189, 75, 13, 58,212,192,131, 2, 23, 45,226,140, 60, 66, 72, 42, 33, 36,117,198,140, 25,211,156,222,239,194, -186,220, 79,103, 44,149, 16,146, 90, 78, 33,149, 9,172, 59, 54,221,220, 44,101,154,194, 89, 73, 58, 69,206,209,187, 48, 58, 58, -122,201,146, 37, 75,130, 92, 25,179,178,178,160, 86,171, 49,126,252,248,160, 23, 94,120,225,205,244,244,244, 23,125, 4, 66,154, -157,157,221,100,224,192,129, 1,102,179,185,136,231,121, 86,173, 86,115,193,193,193, 54,225,128,224,224, 96, 91, 73, 73,137, 88, -171,213,138,108, 54,155,241,133, 23, 94,144,190,242,202, 43,205, 0,136, 60,145, 70, 70, 70,118,233,209,163,135,212,211,126,139, -197, 2,173, 86, 11,173, 86, 11,179,217,140,214,173, 91,203,190,249,230,155,174,185,185,185, 11, 61, 42, 14,153,172, 75,151, 46, - 93,196,133,133,133, 8, 14, 14,198,245,235,215,113,237,218, 53, 24, 53, 26,152, 53,106,152, 53,165,176,150,170, 65,212, 37, 40, -184,116, 30, 45,234,214,145,252, 36,147,117,211,106,181,179, 61,113,170, 84,170, 46, 45, 6, 15,230,148, 74, 37,218, 15, 44,235, -103,240,123,221,186, 32, 54, 27,120,155, 13, 54,171, 21,221, 46, 92,128,197, 98, 1,203,178,104, 94, 88,200,169,150, 46,237,146, -151,151, 55,235,223,200,236, 50,153,140, 91,182,108,217,115, 82,169, 20,132, 16,198,100, 50, 97,203,150, 45, 15,221, 67, 47,149, - 74, 17, 16, 16, 0,179,217,140,196,196, 68,253,192,129, 3,247, 77,157, 58,181, 26,203,178, 74,137, 68,242, 71, 65, 65,193,180, -172,172,172,171,254,242, 89, 44, 22,152, 76, 38,152, 76, 38,232,245,122, 92,185,114, 37, 38, 41, 41,137, 25, 58,116,168, 77,167, -211, 37,207,159, 63,255,242,150, 45, 91, 20, 51,103,206,124, 10,192, 8, 90,236,222,219,228, 6, 16, 92, 45,156,211,138, 69,208, - 0, 8,178,139,130,167, 24,134,105, 81,175, 94,189,208,179,103,207, 22, 17, 66, 14, 0,248, 25, 64,150, 55, 50,158,231, 25,158, -231,241,250,163,197, 24,218, 82, 4,139,165, 4, 37, 37, 37,184,126,253, 58,206,156, 57,131,131, 7,207,220,238,179,249,114, 96, - 96, 96,215,128,128,128, 68,171,213,202,106, 52,154,235, 58,157,110, 27,207,243,139,224, 82,101,225, 15,238, 86, 56, 5, 40,149, -202, 79,222,127,255,253,199,131,131,131,113,252,248,241,228, 21, 43, 86,124,162,213,106,239,168,113,125,128,152,253,110,246,220, -207,227,226,162, 66,112, 98,215,111,113,211,190, 90,249, 29,192,199,211, 44,124,255,195, 69,139, 56,139,161,195,132,144,158, 12, -195,108,112, 21, 74, 21,178,157,238,240,124, 31,142,150,235,196,210,229,133,150, 7, 5, 9,171,213, 26,227,236,100, 17, 66,144, -149,149,133,140,140, 12,228,229,229, 33, 52, 52, 20,102,179, 57,198,159,242,161,180,180,244,209,240,240,112,157, 88, 44, 54,234, -245,122, 40, 20, 10, 94, 44, 22, 19,251,117, 24,123,175, 69,155,209,104,100, 56,142,179, 4, 5, 5, 5, 26,141,198, 58,240,210, -150,140, 16,242,104,120,120,184,219,125, 70,163, 17, 26,141, 6, 90,173, 22, 26,141, 6, 70,163, 17,209,209,209,176, 90,173, 77, -188,126,210, 90,173, 13, 35, 35, 35,145,153,153, 9,185, 92,142,244,244,116,152, 52,165, 48,151,150,194,170, 85,195, 86, 82, 2, - 94,173, 6,175, 85,195, 98,210, 33,174, 86, 93, 8, 61, 18, 61,193,100, 50, 53, 12, 15, 15,135, 86,251, 79,115, 51, 98, 23, 88, - 86,171, 21, 86,123,227,104,161, 58, 49, 34, 34, 2, 66,143,196,123, 4, 35,128,209, 44,203,206,147,201,100,220, 27,111,188,129, -172,172,172,114,121,226,141, 55,222,112,180,201,106,219,182,237,238,128,128, 0,107, 94, 94, 30,140, 70,163,248, 65,125,232, 25, -134, 1,195, 48,101,105,100,181, 34, 34, 34, 66,155,159,159,127,176,184,184,248,185,219,225,179, 88, 44, 66,143, 46,232,245,122, - 16, 66,112,252,248,113, 4, 4, 4,136,109, 54,219,105,171,213,170, 16,139,197, 96,237,141,191, 40,238, 25,218,215, 9,145,206, -158,222, 34, 42,228,145, 94, 74,173, 66, 42,210,242,215, 31, 73,252,254,211, 51, 43, 94, 24,244,114,208,164, 73,147, 18, 34, 34, - 34, 2, 46, 95,190,108,152, 60,121,114,210,178,101,203, 24,148, 85,211,121,196,141, 27, 55,214,190,255,254,251, 97, 61,122,244, - 72,150,201,100, 76, 73, 73, 9,242,242,242,144,147,147,131,107,215,174,145, 19, 39, 78, 92, 49, 26,141,171, 42, 18,200,216,216, -216,111,158,123,238,185, 23,154, 54,109, 42, 22, 28, 82,173, 86,219,120,231,206,157,189,127,255,253,247, 54, 90,173,182,194,249, -242,230,205,155,171, 62,248,224, 3,229, 19, 79, 60, 81, 71, 38,147,177,149, 17, 78,103,176, 44, 27, 29, 24, 24,136,109,219,182, - 33, 36, 36, 4, 44,203, 70,223,105, 98, 25,204,124, 92,149,152,112, 24,246,206, 70,157,200, 4, 24,204,124, 28,205,194, 15,142, -163,229,225, 93,223, 92,112,164,124,136, 37,253,216,177, 99,223,103, 24,102,195,216,177, 99,223,119,231,104,217,255,218,156,143, -115, 58,222, 88,217, 98,171, 66, 3, 77,242, 60,143,140,140, 12,100,102,102, 34, 35, 35, 3, 5, 5, 5, 96, 89, 22,132, 16,127, -122,159, 17,134, 97,248,173, 91,183,134,238,219,183, 79,219,188,121,243, 98,161,253,139,213,106,101, 44, 22, 11, 99,111, 23,195, - 92,191,126, 93,178,103,207,158,144,115,231,206, 69,163,172,193, 26,239,195, 10,188,101,155, 32,176,156, 23,131,193,128,128,128, - 0,255, 84,135,253, 69,120,252,232,209, 50,145,165, 41,181, 87, 25,150,192,166, 46, 1,209,150, 66,106,179, 64, 10, 2,198,160, -243,251,254, 57, 67, 16, 89,102,187,208, 50,153, 76,176, 88, 44,224,121, 30, 86,235,191,210,174,252,203, 70,141, 26, 53, 89,187, -118,237,144,140,140,140, 91,118,246,237,219, 23, 35, 70,140,192,240,225,195,207,245,236,217,243,196,111,191,253,134, 97,195,134, -129,231,249, 71, 0,148, 0,248,253, 65,123,232,141, 70,163,195,129, 50, 24, 12, 48,155,205,128,151,198,239,190,242,166,144,182, - 86,171, 85,224,102,214,174,253, 5,187,119,239,102,207,156, 57, 29,255,198, 27, 67,133, 6,247,180,196,189, 55,120, 66,202, 50, - 95,143,108, 24, 22, 48,170, 81,184, 86,202, 49,154, 11, 95,191,175,185, 86, 77,165,141,174,170, 48,197, 39,133, 84,153, 54,109, -106,236,185,115,231,141,227,199,143, 63,219,191,127,255,168, 81,163, 70,213, 91,179,102, 77, 27,131,193,240, 45,128, 98, 79,166, - 75,239,222,189, 15, 68, 69, 69, 37,125,245,213, 87,185, 55,111,222, 12,181, 88, 44, 74,179,217,204,107,181,218,107,122,189,126, -155,217,108,222, 6,224,104, 69, 2, 27, 20, 20,212,104,240,224,193,226,226,226, 98,112, 28, 7,179,217,140,220,220, 92, 60,254, -248,227,162,245,235,215,215,191,157, 27, 80, 84, 84, 52,251,219,111,191,221,177,124,249,242,174, 42,149,170,169, 76, 38,139, 1, - 96, 43, 45, 45,205,209,106,181,127,223, 78, 56,203,149,115, 54, 91,206,209,163, 71,171,171, 84, 42,220,184,113, 3, 54,155, 45, -231, 78, 19, 45, 64,194,222, 60,185,107,125,213,186, 17, 73,216,179,239, 0, 2, 36,236, 77, 58,212,215, 3, 15,161, 13, 21,156, - 5,148, 27,129,180,111,250,244,233,242, 25, 51,102, 96,250,244,233,167,221, 57, 90,130,224,154, 62,125,250,105,225, 56,167,227, -119,221, 65, 24, 61, 59, 90,158, 20, 36, 80,214,187, 48, 47, 47, 47, 52, 36, 36,196, 33,176, 50, 51, 51,145,153,153, 9,169, 84, -138,235,215,175, 67, 42,149,102,249,243, 17, 34,151,203,143, 52,110,220,184,246,213,171, 87, 37,147, 39, 79,174,122,244,232, 81, -213,227,143, 63,222, 64, 46,151,219, 8, 33, 48, 24, 12,236,217,179,103, 3,103,205,154, 21,247,232,163,143,154, 30,125,244,209, - 99, 43, 87,174,212,195,203,248, 87, 12,195, 28,202,202,202, 74, 78, 76, 76, 20, 68, 91, 57,113,229, 44,184,128,178, 42, 79,142, -227,142,121, 11, 40,199,113, 39, 47, 92,184,208, 89, 17, 32,131,169, 84, 13,179, 70, 13,107,105, 41,108,165, 37,176,149,148, 0, - 90, 53,164, 86, 43,196, 54, 11,228, 1, 1,200, 72, 79, 7,199,113, 39,189,113, 74,165,210,147, 57, 57, 57,157, 67, 66, 66, 28, - 47, 81,139,213, 90,182,216,108, 48, 89,173, 14, 71, 75, 44, 22,227,230,205,155,144, 74,165, 39,239,117, 78,102, 89,214, 38, 12, -225,224, 33, 30,136,142,142,230, 91,180,104,129, 97,195,134,193,102,179,217,147,129,105, 15, 96, 15,202,218,183,220,151,112, 39, -110,133, 70,235,122,189, 30, 26,141, 6, 69, 69, 69,156, 92, 46,175, 29, 23, 23,119,192,100, 50,173,178, 90,173,223, 93,187,118, - 77,237,137,211, 46,204, 28,162,139,231,121, 16, 66, 96,179,217, 96,177, 88, 32,145, 72,248,157, 59,119, 97,214,156, 79,176,228, -187,101,164,119,239,222,204,250,245,235,193,243,124, 58, 45, 87,239, 9, 62, 43,254,121,106, 0,172, 54,173,113,231,114,205,143, - 23,213,218, 73, 63,206, 61, 98,146,138,212,205,218, 69, 55, 76, 78,170, 45, 10, 9, 9,101, 23, 46,154, 87,240,211,178,213,151, -111,220,184,161,254,226,139, 47, 90,214,174, 93, 59,248,239,191,255,142,243, 36,180, 20, 10, 69,205,151, 95,126,121,112, 81, 81, -145,100,201,146, 37, 43,179,178,178,142,160,108,104, 25,231, 30,212, 61, 1,252,128,178, 42,203,104,123, 57,183, 7,192,100,111, -223,107, 12,195,224,175,191,254,186,165,119, 32,127,103,234, 60,164, 70,141, 26,207, 94,189,122,117,119, 78, 78,206,211,174, 59, - 37, 18,201,164, 90,181,106,117, 59,125,250,244, 68, 0,155, 42, 66,172,211,233,198,172, 94,189,250, 83,145, 72, 84,197,102,179, -101,234,245,250, 49,119,236,104, 89,248, 87,166, 47, 92,177, 88,111,178, 85,147, 75, 69, 55, 12, 22,254, 85,154,149, 31, 92, 55, -203,142, 60, 39, 55, 42, 15,101,243, 8, 58,175,255,109,127, 25,153, 8, 33,194,177,121, 78, 46,150,201,197, 5,115,183, 47,239, - 14, 6, 75,119,215,227,144,241,230,104,141, 3,240, 40,128, 67, 57, 57, 57,243, 94,120,225,133, 89, 63,253,244, 83,144, 90,173, - 70, 78, 78, 14,114,115,115,193,113, 28, 84, 42, 21,190,252,242, 75,125, 78, 78,206, 60,231,115,112,235, 8,242, 0, 96,136,136, -136, 56,178,108,217,178,152,175,191,254,154,123,241,197, 23,175,247,236,217,179,206,151, 95,126,121, 85, 34,145, 16,155,205,198, - 24,141, 70,230,245,215, 95,175, 62,103,206,156, 52,145, 72,164,120,246,217,103, 25,165, 82,121, 8, 94,134, 13,200,203,203,219, -250,235,175,191, 62,249,206, 59,239,200, 76, 38,147, 91, 39, 75,216, 22, 18, 18,130,189,123,247,154,138,138,138,182,248,112, 49, -182,254,177,105, 99,219,231,251,247,151, 88, 74,213,176,148,170, 97, 85,171, 97, 43, 45, 6,163, 81, 67,108,179, 66, 46,225, 17, - 19, 31, 0,171, 62, 16, 27, 15,255,109, 49, 26,141, 94, 7, 54, 84,171,213, 91,247, 44, 89,210,254,209,132, 4,110,239,200,145, - 48, 91, 44,120,226,194, 5,135,184, 50,155,205, 88,215,176, 33,108, 12,131, 71, 94,123, 13,151,172, 86,171, 90,173,222,250, 95, -124, 24, 78,156, 56,145, 59,112,224,192,163, 60,207, 55,169,136,187,243, 95,135,197, 98,185,197,141,178,217,108,101,174, 99,153, -115, 32,221,184,113, 99,219,179,103,207, 74, 78,157, 58,133,221,187,119, 63,242,211, 79, 63,141,171, 86,173, 90,195, 27, 55,110, -100,251, 18,111,238, 6,253,133,189,253,225,202,229,171,240,191,255,253,143,201,206,206,198,207, 63,255, 12, 95,131,167, 82, 84, - 26,180,176,218,228,166,157,203, 53, 61, 55,221, 40,221,159,165,159, 12, 96, 51, 12, 54,114,233, 24, 57,209,180,105,104, 4, 0, - 24, 13,182,152,154, 53,107,182,227, 56, 78, 10, 0,129,129,129, 77,195,195,195,191, 44, 40, 40,104,237, 46, 77, 83, 83, 83, 91, - 68, 69, 69, 53,254,253,247,223,255,206,202,202, 58, 13,224,160,235, 65,213,171, 87, 31,127,238,220,185,230, 98,177,152,241,145, - 71, 0, 0,237,218,181,171, 45,147,201,194, 55, 93, 12,134, 90, 82, 3, 68, 84, 2,112, 1,176,133, 52,194,117, 73, 61,196,199, - 31, 8, 47, 42, 42,122,164,164,164,228,239, 10,222,131, 14, 79, 62,249,228,119, 75,150, 44,137,111,215,174, 29, 57,118,236, 24, - 11, 23,123,168,122,245,234, 93,247,239,223,223,228,213, 87, 95,253,106,197,138, 21, 67, 81,190,167,173, 47, 92,183,143, 55, 88, -105,216,122, 25,219, 0, 91,130,221, 51,163,185,248, 33, 64, 69,134, 92,184,131,225, 25,238, 40,136, 30, 13, 12, 15,219, 31,181, -143,137,245,168,197, 98, 57,126,226,196,137,117,207, 62,251,172,166,160,160, 0,225,225,225, 72, 76, 76, 4,195, 48,248,242,203, - 47,245,215,174, 93, 91, 99, 31, 75,235,209,204,204,204,222,118,177,229, 14,165,243,231,207, 95,177,116,233,210,144,163, 71,143, -138,172, 86,171,170, 78,157, 58,186,125,251,246, 5,138,197, 98, 34,145, 72,248,163, 71,143, 42,170, 87,175,110, 96, 24, 70,246, -231,159,127, 22, 28, 56,112,160,218,232,209,163,191, 69, 89,119,107, 79, 88, 62,101,202,148,140,171, 87,175,194,104, 52, 66,173, - 86,163,164,164,196,177, 20, 23, 23,163,164,164, 4, 98,177, 24,217,217,217,248,229,151, 95,178,236,163,196,123,115, 54,190,248, -252,203,133,121, 89, 55,174, 67,165,144,195,170, 46,134,173,164, 0, 40, 45,129,212, 98,134, 82,108, 67,213, 26,114, 4, 40, 84, -200, 81,107,176,100,223,225,108,251, 40,241, 30, 97, 50,153,190, 24, 49,103, 78,142, 85, 34, 65, 66,191,126, 48,219,171, 10,157, -133,150,141, 97, 80,173, 83, 39,176,193,193,152,182,102, 77,142,125,148,248,123, 10,158,231, 69, 38,147,201, 91, 60,192,243,124, -250,217,179,103, 87, 0,216,193, 48, 12, 97, 24,134,160,108,176, 54,205,253,252, 32, 91, 44, 22, 76,152, 48, 1, 18,137, 4, 19, - 38, 76,192, 71, 31,125,132, 89,179,102, 97,225,194,133,248,241,199, 31,177,113,227,198,164, 61,123,246, 72,118,237,218, 69,166, - 79,159,158, 95,189,122,117,209,107,175,189, 22, 34,151,203,223,246,198, 57,102,204, 24, 4, 5, 5, 97,204,152, 49,248,228,147, - 79,240,205, 55,223, 96,221,186,117,216,187,119, 47, 68, 34, 17,159,158,126, 19, 6,131,129,204,159, 63, 63, 99,221,186,117,250, -121,243,230,129,227, 56,134, 22,173,247, 4, 31,200, 7,126,120, 54,100,241,249, 43,251,179,244, 31, 0,248, 67,248, 34, 85,169, - 84,242,181,107,127,229, 0, 96,205,234, 95,196, 23, 46, 92, 8,254,245,215, 95, 3,162,162,162,240,227,143, 63, 6,200,229,242, - 40, 15,156,182,117,235,214, 25,165, 82,105,248, 43,175,188,210,189,121,243,230,111,217, 63, 68, 59, 1,168,143,178,222,139, 93, -174, 92,185,114, 38, 34, 34,226,226,150, 45, 91,180,254, 4,180,180,180,244,219, 31,126,248, 33,177,208, 22,134, 77,218, 39,177, -132,255, 20, 27, 67,190,195,245,132,143,160,168,210, 12,207, 61,247, 92, 21,155,205,182,184,130,241,127,174,111,223,190, 63, 44, - 89,178, 36,254,149, 87, 94,201, 62,118,236, 88, 14,128, 37, 0,150, 57, 47,231,206,157,203,127,225,133, 23,178, 22, 47, 94, 28, -251,236,179,207, 46, 4,240, 52,205, 58, 20, 20,229,191,133,224,161,215,161,167,194,124,157,213,106,237,205,113,220,122,148, 31, -176,244, 77,147,201, 20,203, 48, 12,145, 72, 36,217, 57, 57, 57,243,156, 7, 44, 77, 79, 79,239, 29, 31, 31,239, 56, 7,101,179, -123, 59,143,165,165,122,226,137, 39, 58,239,223,191,127,193,134, 13, 27,114, 75, 75, 75, 3, 87,175, 94, 45,159, 49, 99,198,117, -158,231,201,123,239,189,151,208,173, 91, 55,157,205,102,203,122,237,181,215,170, 39, 37, 37,189,118,238,220,185,109, 12,195, 56, - 11,173,114,156,118,212,175, 81,163,198,222, 53,107,214,168, 66, 66, 66,144,155,155,139,194,194, 66,104,181, 90,216,108, 54,136, -197, 98,228,229,229, 97,242,228,201,234,204,204, 76,119, 3,150,186,227,124, 52, 49, 46,110,235,188,137, 19,130, 66, 56, 22, 5, -231,207,194, 90, 84, 0,177,213,130,170,245,131, 33,145,202,113,233, 66, 41,222, 94,254, 75,233,141,194, 98,119, 3,150,186,229, -108, 86,179,230,182,175, 70,143, 14, 52,220,188,137,216,151, 94,130, 78,167,131,217,108, 6,203,178,184, 50,111, 30, 36,145,145, - 24,191,114,165,246,244,141, 27,157,112,235, 80, 25,238, 56,239, 20,206,156, 67, 25,134,113, 52,134,239,219,183,111,185, 3,127, -253,245, 87, 44, 92,184, 16, 70,163,209, 74, 8,121, 19,192,151, 0, 2,237,187, 53,247, 48,156,149,206, 25, 22, 22, 54,239,247, -223,127, 79,140,138,138, 98,156, 71,108,183,139, 79, 0,192,176, 97,195, 58, 29, 56,112, 64,214,184,113, 99, 99,126,126,126,243, -200,200,200,237,203,150, 45,139,120,246,217,103, 51,207,156, 57, 19,231,202, 25, 30, 30, 62,107,205,154, 53, 53,106,212,168,193, - 10,174,152,107,245,228,144, 33, 67, 58, 47, 91,182, 76,250,228,147, 79, 26,181, 90,109,116, 80, 80,208,229, 53,107,214, 68,244, -233,211, 39,251,204,153, 51,177,247,235,253,124, 16, 56,235,215,175,127,233,244,233,211, 53,132,117,189, 94,143,188,188, 60,228, -231,231, 35, 36, 36, 4, 93,186,116,185,146,150,150, 86,195, 3,103,227,103,158,121,102,226,226,197,139, 59, 43,149, 74,201,174, - 93,187,180,219,182,109, 51, 92,191,126,221,106,177, 88, 72,108,108, 44,215,186,117,235,128, 30, 61,122, 40,101, 50, 25,251,225, -135, 31,230, 79,157, 58, 53,130, 97,152,229, 0, 6,186,227,108,220,184,241,193, 63,254,248,227, 81,134, 97, 32, 18,137, 96, 50, -153, 81, 92, 92,140,140,140,116,156, 57,115, 6,251,247,239,199,150, 45, 91,254,214,106,181,141,253,140,123, 56,128, 93, 70,163, -177,142, 84, 42,245, 91,216,219,108, 54,112, 28,119, 30, 64, 87, 0,233, 52, 47, 81, 78,138, 50,137, 3, 55,141,225, 9, 33, 94, -123,243,193,238, 78,173,179,127,153, 31,114, 51,132,195, 56, 0, 19,156, 92, 48, 95,118,158,154, 16,178,187,115,231,206,195, 58, -117,234, 52,167,107,215,174, 89, 89, 89, 89,201,179,103,207,142,183, 90,173,230, 51,103,206,176,151, 47, 95,190,126,228,200,145, - 26,181,106,213,122,237,220,185,115, 59, 93, 68,150, 39,156,185,124,249,242,227, 29, 58,116,248,229,181,215, 94,171,214,162, 69, - 11,105, 72, 72, 8, 56,142,195,213,171, 87,241,247,223,127,155, 86,174, 92,153, 94, 92, 92, 92,145, 41,120, 14,165,101,100,116, -121,118,248,155,107, 94,235,219, 43,226,177, 58,181,165,177,177,177,128, 94,143,243, 55,178,113,224,252,223,230,111,118, 31,200, - 51, 26,141, 79,195,255, 41,120, 14, 29,185,116,169,115,199,209,163,215, 76,122,254,249,104,100,101,113,177,177,177,144, 74,165, -184,118,237, 26, 46,243,188,117,230,162, 69, 57,106,181,250,223,152,130, 71, 6,224, 83,158,231, 57, 0,144,203,229, 24, 49, 98, - 4,156,167,220, 89,184,112, 33,244,122, 61, 0,112, 12,195,124, 10,224,187,251,221,197, 18, 80, 88, 88, 56,254,137, 39,158,152, -206,113,156,199, 81,111, 67, 67, 67, 81, 90, 90, 10,171,213,106,203,200,200, 56, 31, 26, 26, 10,177, 88, 12, 66,136,219,231,168, -160,160, 96,252,211, 79, 63, 61,133,101, 89, 79,206, 7, 84, 42,213,245,237,219,183,215,124,245,213, 87,217,239,191,255,254,234, - 43,175,188, 34,219,190,125,187,141, 16,242, 11, 45,183,254, 99,165,168, 83,199, 6,251, 71,156,183,161, 20,142,175, 94,189,122, -206,145, 35, 71, 34,135, 13, 27,150,252,252,243,207,171, 58,116,232, 16,232,124,128, 94,175,231,127,251,237, 55,237,194,133, 11, - 75,118,239,222,157, 54,100,200,144, 22,240, 50,119,234,141, 27, 55, 54, 78,155, 54, 45,184, 71,143, 30,181, 0, 56,218,103,229, -229,229,225,250,245,235, 56,117,234,212,117,179,217,188,190, 2, 81, 42, 0, 48,105,192,128, 1,159, 46, 93,186,180,202, 43,175, -188,146,189,114,229,202, 83, 40, 27,176,216, 21, 33,125,251,246,109,184,116,233,210,216, 87, 94,121, 37, 27,101,237,200,104, 59, - 66, 10,138,127,208, 30,183,182,211,242,250, 1,243,131,201,100, 34, 6,131,129,232,116, 58,162,209,104, 8,220,207, 2,191, 46, - 51, 51,147,164,167,167,147, 27, 55,110,144,180,180, 52, 2,224, 71, 23,197,235,174,192, 82,254,244,211, 79, 53,226,226,226, 38, - 42, 20,138,205, 34,145, 72, 45, 18,137,212, 50,153,236,143,240,240,240,143,102,206,156, 25, 71, 8,145,120, 81,209,158,192,137, -197,226, 87,163,162,162,214,133,133,133,165,135,134,134,166, 71, 69, 69,173, 19,139,197,255, 3, 32,246,161,204, 61, 33,128,227, -184,119,149, 74,229, 86,153, 76,150, 43,147,201,114,149, 74,229, 86,142,227,222,133,247,129, 84,189,114, 74,165,210,119, 35, 35, - 35,183,170, 84,170, 92,149, 74,149, 27, 25, 25,185, 85, 42,149,222, 9,231,157,124,149, 8, 66, 75, 71,236, 96, 24,198,242,200, - 35,143,124,213,164, 73,147, 47,155, 52,105,242,101,163, 70,141,190,102, 24,198, 34,236, 7,160,131,231,193, 27,239,102, 56,255, - 53,206,148,148,148,101, 75,151, 46,229,199,143, 31,175,174, 85,171, 86,225,248,241,227,213, 75,151, 46,229, 83, 82, 82,150,221, - 46,103,116,116,116, 66, 74, 74, 74,225,226,197,139,173, 23, 46, 92, 32,139, 23, 47,182,166,164,164, 20,186,140, 12,255, 64,222, -207,255, 58,103,253,250,245, 47, 17, 39,152, 76, 38,146,151,151, 71, 46, 92,184, 64,118,239,222, 77,226,227,227, 47,249,193, 25, - 14,224,117, 0,191,197,196,196,156,107,217,178,229,141,199, 31,127,252, 70, 66, 66,194, 85,177, 88,188, 31,101, 35,188,167,216, -151, 79, 1,212,242,193,217, 50, 36, 36,100, 90,124,124,252,250,154, 53,107,238, 77, 76, 76,220, 31, 22, 22,182, 33, 32, 32, 96, - 6,254, 25, 25,187,162,113,239,240,228,147, 79, 94,215,104, 52,182,166, 77,155,158,115,119, 82,221,186,117,247,104, 52, 26, 91, -255,254,253,211, 1,164,210,188, 68, 57,239, 18,231, 3,253,129,230,138,154,118,193,180,206,105, 25,231,230,184,113, 46,199,252, - 96, 63,215,103, 66, 16, 66, 68,132, 16, 37, 33, 36,152, 16, 18, 70, 8, 9, 33,132, 4, 18, 66,100,132, 16,150,102,194,127,133, -115,168, 93, 64,233,236,255, 93,225,107,255, 3,125, 63,227,226,226, 66,155, 55,111, 62,124,237,218,181,239, 94,185,114,229,221, -181,107,215,190,219,188,121,243,225,113,113,113,161,119, 18,206,232,232,232,132,122,245,234, 45,168, 91,183,110,122,189,122,245, - 22,184,136, 44,154, 63,255, 37,206,164,164,164,223, 27, 54,108,120,169, 81,163, 70,151, 27, 53,106,116,169,126,253,250,151,234, -212,169,115,169,122,245,234,151,170, 86,173,122, 41, 34, 34,226,247,219, 8,103, 24,128, 88,220, 58, 13,216,191, 29,247,246, 41, - 41, 41, 7, 2, 2, 2,220,142, 13,198,113,220,164, 70,141, 26,157, 68, 89, 79, 73,154,151, 40, 39, 21, 90,149, 32,180,104,134, -121,120, 57,101,240, 62,205,136,175,253,244,126, 82, 78,202, 73, 57, 41, 39,229,164,176, 11, 45, 58,250, 52,133, 43,140,240, 62, - 50,174,175,253, 20, 20, 20, 20, 20, 20, 15,157,166,114, 89,218, 9, 59, 24, 47,170,180, 34,189, 9,110, 71,217,110,163,156,148, -147,114, 82, 78,202, 73, 57, 41,231, 67,199, 41, 96,142,135,237,231, 93,214,191,190, 79,133, 23, 67,171, 14, 41, 39,229,164,156, -148,147,114, 82, 78,202,249, 95,225,116,135,215,238, 83,145,213, 14,240, 49,188, 3, 5, 5, 5, 5, 5, 5, 5, 5, 69,133,225, -123, 82,233, 85,171, 86,137,132,255, 3, 6, 12, 24, 98,179,217,134, 11,235, 34,145,232,243,159,127,254,249, 59,111, 87,232,215, -175,159,205, 27,167, 59,248,186,142, 59,206,250,181, 84,111,132, 7, 43,222, 44, 46,209,205,189,154,105,219,109, 48, 24,234, 9, -251, 2, 2, 2,206,126,247,221,119, 23, 43, 59,156, 67,134, 12,169,229,122,157,196,120,113,251,176,160,128, 17,133,197,154,217, -167, 47,105,190,166,121,236, 95, 65, 4,128,212,160, 0, 73,239,250, 33,146,150,167, 10, 12,251,180,102,219,111, 40,235, 13, 91, -244, 32, 70, 56, 38, 38,166,142, 74,165, 26, 4,160,190, 78,167,139, 82, 40, 20,185, 0,206,168,213,234,101,217,217,217,231,253, -229,105,151,136,235, 0,170,217, 87,111,236, 76, 67,130, 63,251,124,161,107,117, 24, 8, 32, 99, 24,152,183, 92,134, 99, 2,205, -110, 53, 96,224,201,173,219,187,214,128,137, 16, 72, 24,192,184,229, 10, 2, 30,160,164, 82, 1,232,130,178, 33, 28, 78, 0,216, -130,178,158,187, 20, 20, 20, 15, 14, 92, 39,148,118,172,115, 30,196, 68, 91, 9,199, 44, 32, 32, 33, 0, 9, 55, 26,141, 98,169, - 84, 10,147,201, 4,133, 66,254,197,235,175, 12,153, 8, 22,197, 22, 43, 70,124,247,221,119,183, 61,211,117, 69,174, 3,224, 47, -215,243, 67, 85,242, 41, 59,126,123, 47,180,109,207,153, 51, 76,215,242,199,148,150,150,178, 50,153, 12, 70,163, 17,193,193,193, -143,191,241,218,107, 77, 89, 49, 49, 73, 36,202,125,115,230,204,201,190,221,112,190,253,246,219, 49,102,179,161, 21,207,243, 82, -147,201, 36,115,189, 78,176, 66, 57,115,199,111,239, 41,218,165,206,152, 8, 80,161,245, 47, 64,154, 16,170,220, 57,119, 64,251, -186, 45,235,215, 4,127,102, 23, 12, 38,115,239, 29,233,154,222, 31,237,207,124, 39, 93, 99,110, 2, 47, 3, 65,222,135, 16, 37, - 39, 39, 15,139,140,140,236,191,104,209, 34, 73,114,114, 50, 2, 2, 2,160,215,235, 99,175, 92,185, 18,251,198, 27,111,180,147, -203,229, 43,174, 94,189,250, 5,252,155, 8,174,218,142, 31, 62, 4, 0, 60, 62,104,114, 53, 0,239, 58, 9, 1,199,190,246,131, - 39, 87, 3, 48, 26,229, 39, 70,206, 2,176,222, 67,169, 35,221,176,116, 22,122,191,240, 46, 7,224, 13, 71,224, 89,224,143, 31, -231,161,251,128, 55,203,109,103, 8,184,223,150,206, 66,234, 11,239,122,156,213,188, 91, 77,198,194,243,196,163, 19,207,178,140, -117,243, 37,226,110,130,225, 28, 0,238,230, 35,237,134,178, 9,157,221, 30,223,179,142, 40,199,108,177,185, 29,112, 86, 34, 22, -229,110, 60,111,187,229,220, 23, 27,195, 98,177,149,149,173, 18, 14,182,117, 87,131,119,124,240,193, 7, 92,106,106, 42,190,249, -230,155,214, 95,127,253,245,107,165,165,165,127,218,239,219,101,250,248, 82, 80, 60,208,130,203,189,208,226, 68,248,106,253,154, -239,106,228,228,230,227,197, 87, 71, 97,249,242,229, 40, 42, 42, 66,104,104, 40,164, 18,137,120,238,167, 31,198,168, 84,202,152, - 23, 95, 27,243, 21,128, 58,183, 27,154, 10, 94,167,166,235,249,140,125, 14, 68, 78,196,138,165, 82, 41,187, 98,197, 10, 20, 23, - 23, 35, 36, 36, 4, 82,169,152,157, 51, 99,156, 92,165, 10,148,191, 60,116,108,107, 0,171,110, 55,156, 38,147,166,245,218,229, -223,169,242,242,242, 48,248,127, 99,224,122, 29,137, 68, 98, 19, 94, 44, 52,143,253, 43,248, 96,209,136, 23,234, 54, 8, 2,204, -167,247, 66, 44, 18, 65, 17, 28,138, 46,156, 8, 34, 6,245, 94,220,156,246, 62,128,143, 30,148,200, 38, 39, 39, 15,235,215,175, - 95,255, 41, 83,166, 72, 88,182,172,227,176, 86,171,133, 94,175, 71, 92, 92, 28,118,236,216, 33, 25, 63,126,124,255, 95,127,253, - 21, 87,175, 94,157, 95, 81,254,211,167, 79, 39, 86,171, 86,205, 0, 0,189, 26, 6,185,238, 75, 16,246, 1, 64, 80, 80,144, 79, -190,240, 16,165,241,244,233, 3,245,133,243,134,117,138,179,121,216,110, 0,160,240,198,197,243,132,219,178,224, 13,143,251, 95, -157,242,147,245,196,170,221,117,146,147,147,245,206,219, 3, 3, 3, 61,157, 18,173,209,104,170,185,110, 20,142, 55, 91,108, 81, -158,174,215,117,196, 66,183, 2,204, 98, 3,247,211, 79, 63, 1, 0, 62,123,119,160,104,241,193,124,142,227,202,138,218, 79, 63, -253, 20,147, 38, 77,146,110,222,188,185,199,210,165, 75,123,172, 91,183,110,174, 39,161, 74, 65, 65,113, 95,138, 44,231, 95,207, - 66,139,101,152, 32, 85, 80, 32,158,121,238,117,252,254,251, 31,104,219,182,173, 99, 95, 82, 82, 18,250, 61,221, 7, 63,255, 48, - 7, 0,130,238, 36, 68,119,122,157,162, 18,237, 71,221,251, 47,152,124, 35, 91,179,127,195,134, 13,104,211,166, 77,185,243,159, -123,246, 25,252,248,237,167,240, 50,202,188, 95, 96, 8, 43, 9, 82, 41, 49,224,197,255,193,221,117, 94, 27,220,119, 67,183,126, -243, 58,231, 20,104,231,208,124,118,239, 81, 35, 38,188,107,195,186,117, 80,244,203, 23,248,187,216,128,223, 51, 13,120,185,203, - 99, 72, 9,147,163,141,213,134, 24,165,184, 99,182,214,242, 64, 8,173,152,152,152, 58,145,145,145,229, 68, 86,105,105, 41, 52, - 26, 13,212,106, 53, 74, 75, 75,193,178, 44,198,140, 25, 35,217,185,115,103,255,152,152,152,109,126, 84, 35,222,176, 59, 89,128, - 72,172,153, 48, 97,130, 49, 42, 42,202,168, 80, 40, 8, 39,145,149,182, 31, 60, 57, 8, 0, 88, 78, 82, 58,119,238, 92, 83, 92, - 92,156,129,227, 56,233,155,111,190,233,215,240, 48, 70,163,145, 56,115,154, 76, 70,199,246,153, 51,103,154,162,163,163,141, 10, -133,130,152,205,254,155,142, 39,175, 21, 66, 38, 17, 65, 38, 17, 33, 64, 42, 70, 80, 98,115,200,138, 78,193,106,181,226,147, 79, - 62, 49,199,196,196,152, 20, 10, 5,145, 74,165,146,145, 35, 71,250, 12,231,144, 33, 67, 72, 72, 72,136, 89,161, 80, 72, 38, 77, -154,116,203,180, 25,219, 79,100, 64, 46, 21, 67, 33,227, 80, 51, 41, 30, 50,162,247, 59,172, 34, 81,249,214, 8, 50,153, 12,173, - 91,183, 70,253,250,245,177,110,221,186,246, 84,104, 81, 80, 60, 16,240, 56,221, 14, 7, 0, 27, 54,108,104, 7, 96, 7, 0,164, -166,166, 50,101,103, 16,140, 30,246, 52, 94, 30, 60, 0, 54, 27,239, 24,221,148, 97, 25, 12,125,169, 7,120,222,159, 26, 9,223, - 93, 60,111,227, 58,255, 76, 82,205,176, 34, 0,168,145, 16, 75, 94,123,249,121,216,120,254,159,138, 18, 17,240,250,224,238,101, -219, 42, 33,156, 34,216, 48,234,141,167,224,238, 58,117,106, 84, 97,173,102, 3,152,242,147, 61,222,141,201, 54, 41,167, 27,212, -175, 26, 91,221,162,215,195, 96,176, 96,201,249, 66,253,214, 12,109, 20, 27,146,150, 55,239,153, 22, 1,162,188, 76, 36, 4, 73, -107,102,107, 45, 15, 68,220, 85, 42,213,160, 69,139, 22,221, 34,178,114,114,114, 88,141, 70, 3,179,217,204,151,150,150,194,102, -179, 97,236,216,177,226,241,227,199, 15,202,206,206,158, 36,104, 30,119,156,246,118, 87,163, 79,159, 62,157,240,193, 7, 31,152, - 59,118,236,120, 35, 41, 41, 73, 43, 18,137, 16, 27, 27, 59,175, 75,151, 46, 97, 83,166, 76, 49,247,232,209, 35, 77, 36, 18,161, -102,205,154,218, 83,167, 78, 37, 0,144,251, 27,119,103,206,239,182,127, 78, 0,128, 97, 24,116,233,210,229,122,205,154, 53,181, - 34,145, 8, 23,127,155, 73,252,189,159, 98,142, 69,173,184, 96,123, 33,194, 0,242, 64, 71, 75,188, 46, 93,186,164,215,169, 83, - 71,195,178, 44, 78,158, 60, 25,143, 91,167,181,186,133, 83, 46,151, 91,158,123,238,185, 27,231,207,159,119,119, 60, 56, 17,139, - 22,117,236, 6, 86, 92, 19, 32,125,143,199,112,138, 69,176,142, 31, 54,144, 11, 9, 0,100, 65, 17, 70,181, 90, 13,149, 74, 85, -230,144,153,205, 56,126,252, 56, 90,182,108,217,110,213,170, 85, 59,233,243, 78, 57, 41,231, 63,112,167, 69,238, 67, 55,139,113, - 90, 47,215, 70,107,135,107,164,108, 54, 43,146,170, 69, 99,230,135, 67, 96,179,241,176,217,108,176,218,127,109, 54, 27, 44,102, -115,165,132,236, 78,174, 19,170,146, 79,249, 99,197,136,208,142,125, 63,237, 52,253,131,193, 91,109, 54,128,231, 45,176, 88, 0, - 27,111, 1,111,179,193, 98,169,156,166, 57, 22,158, 71, 66,124, 12,166,127, 48, 24,174,215, 89,246,243,170, 94,219,215,143, 81, -180, 77,157, 49,234,226,117,221, 39, 84,216,223, 91, 4, 72,100, 28,225, 2, 96, 50, 89, 81,106,226, 77, 0,180, 6, 11,111, 38, -202,136, 0, 0,224, 88,230, 65,234, 93, 91, 63, 57, 57,185,156,200,154, 53,107, 86,196,151, 95,126, 25, 7, 0, 79, 63,253,116, - 70,167, 78,157,242, 47, 92,184,128,216,216, 88, 38, 63, 63,191, 39,128, 55,237,231,142, 6,240,165, 7, 94,109,181,106,213, 12, -145,145,145, 70, 65, 16,177, 44, 11,142,227, 80,173, 90, 53, 67, 84, 84,148,177,102,205,154, 90,137, 68, 2,150,101, 33, 8, 61, -191, 62,243, 24, 6, 34,145, 8, 2,167,171,219, 35,112, 86, 4, 98,142,189,181,120,115,226,100, 89,214,237,245, 60,230,161,128, - 0, 2,192,227,241, 34,214,169,120,228,188,183, 16, 88,114, 28, 98, 0, 59, 8, 33, 56,118,236, 24,174, 94,189, 10,137, 68,130, -152,152, 24, 76,154, 52, 9, 70, 99,153,222,237,215,175, 95, 59, 0, 39,233, 19, 76, 65,225,192,142,251, 80, 96,185,186, 90,222, -219,104,109,216,176,161, 93,106,106,234, 78, 65, 0,149,137, 29, 55,226,199, 98,133,197, 98, 6, 42, 97, 32, 46,111,215,177,217, -120,175,215, 17,218,104,241, 60,225,220,138, 44,158,135,213, 98,169,148,187,199,219, 44,224,121, 11,220, 93,135, 97, 88,155,189, -192,151,208,231,228,222, 35,166, 90, 2,107,169,150,132,221, 86, 3,226,194,101, 82,228,235,145, 92,187,174,232,184,206,130,189, - 39,206, 34, 34, 80,245,192,164,139, 78,167,139, 10, 8, 8,128, 86,171,117, 56, 89, 95,126,249,101,156,201,100, 98, 1,128,227, -196,241,121,124, 92,128,141, 7,130, 85, 89, 40, 42, 42, 9, 39,132, 48,118,193,243, 41,128,239,224,101,100,127,137, 68,226, 16, - 40,206, 2, 72, 38,147,221,150,128, 17, 32,136, 51,137, 68,226,118,187,107,245,154, 47, 72,156,133, 22, 72,153,171,229, 34,182, - 68, 34, 17,132,182, 81,190, 32,149, 74, 29,113,119, 7, 78,228,116, 61, 81,197,155, 98,154,205,102,104, 52, 26, 20, 23, 23, 35, - 32,160,204, 48, 35,132,128, 97,152, 55, 1,188, 69,159, 98, 10, 10,247, 90,228, 62, 22, 91,238,133, 22,202, 44, 59, 6, 0,172, - 22,179, 91,241,179,234,183,189,184,145,173, 69, 76,196, 33, 16, 47,117,146,238,208,191,127,255, 31, 98, 99, 99, 91, 8,235, 50, -121, 96,248,107, 35, 62,134,213,106, 70,144,156,197,171,131,186,151, 19, 89,101,142,150, 9,158,228, 92, 81,137,246,163,238,253, -230, 79, 14, 86,133,239,119, 21, 63,211,151, 28,125,166, 72,109,140,103,217,195, 40, 98, 98,109,253, 94,255,120,136, 83,225,126, - 98,197,194, 9,239,248,237, 7, 50,172,248,153, 55,230,189, 70,184,192,122, 10,182,116,215,123,131, 31, 91,235, 44,230,194,194, -194, 54,116,125,102,110,231,156, 66,218, 70,235,223, 64, 80,112, 8, 27,223,172, 61,154,189,185, 0,219,199,189, 71,128, 34,132, -199,198,177, 29,134, 77, 69, 96,179, 94, 56,240,234, 32, 30, 40,124, 32,226,170, 80, 40,114,117, 58, 93,172, 94,175,135, 90,173, -134, 90,173, 46, 47, 8,196, 98,230,181,255, 13,143, 16, 75,164,176,152, 77,248,125,217, 84,159,156,194, 16, 14,189, 26, 6, 65, - 36,150,150,158, 73, 78,158,199,113, 28, 88,150,197,111, 95,188,247,230, 47,179, 71, 4, 1,192,137, 13, 95,168, 7,140,249,124, - 62,203,178, 48, 26,141,178,138,132,251,230,205,155,241, 70,163,209, 96, 23,104,130,240,195,181,107,215,170, 26,141, 70,189,243, -118,127, 32, 87, 4, 1, 33, 73,128, 34,234, 22,247, 44, 45, 45,173,138,197, 98,209,113, 28, 7,147,201,228,151, 42, 98, 89, 86, -114,242,228,201,120,158,231,221, 30, 95,191,122, 21, 32,166, 33, 32, 13,246, 59,206,254,140, 8,109, 23, 91, 4, 21, 44, 75, 41, - 40, 30,116,103,235, 62,124, 38, 24, 15,255, 29, 66,171,253,134, 13, 27,136,243, 23,162,213, 98,177,139,172,127, 68,143,205,198, - 35, 51,207,128, 11, 23, 46, 98,238,220,185,216,123,224,221,224, 41, 83,166,200,198,143, 31,111,236,223,191,255,108,158,231, 27, -177, 44,123, 2,255, 84, 85,148,119,133,120,190,234,209,163, 71,147,133,117,139,197,130,160,160, 32, 4, 5, 5,161, 78,205,248, - 91, 68,150,205,102,131,217, 75,213,161,208, 70,139, 33, 60,177, 88,108,176,241,188, 67,252, 20,169,141,241,235,183, 29,171,225, -116,120,109,225, 79,235,230,245, 60,139,193, 55, 38, 57,226,177, 98,225,132,119,166,124,243,141,172,200, 22, 57,114,192, 51, 47, -167,244, 27, 48, 8,207, 61,245, 68, 59,163,201,180, 78,196, 18,222,226,184, 30, 88, 16,184,182,209,162,184, 71,184, 92,172,181, -136,101,114, 4,198, 36,226,162,198, 38, 17,137, 68,135,174, 20,235, 36,172,136, 3,203, 73,112,166,200, 96,121,128,162,123,230, -242,229,203,177, 85,171, 86,133, 90,173,134,213,106,229,159,126,250,233, 12,142, 19,199,115, 98, 49,147, 58, 96, 56,159,157,157, -105, 97, 89, 17, 8,177,225,137,126,111, 48,178, 0,185,196,108, 50, 89, 81, 86,117,232,206,205,114, 30,194, 33,168, 75,151, 46, - 97, 66, 79,192, 95,102,143, 8,114,218,167,106,218,180,105,152,115,175, 67, 63,221, 34,166,127,255,254,242,106,213,170, 49, 0, -112,120,217, 7,130,123,198,244,234,213, 43,160, 90,181,178,118,248,127,126, 49,194,111,206, 8, 5, 1, 74,174, 1, 37,105,183, - 56, 89,189,122,245,146, 37, 39, 39, 87,232, 89,180, 55,128,247, 56,118,151,146,179, 2,217,199,252,226,122,177, 49, 44,113,129, -224,102, 63,193, 66, 26, 24,110,108,241,222,230,131, 84,108, 81, 80,248, 5, 23, 45,114, 95,161,157, 93, 32,182,183,255, 58, 4, - 23, 7, 0,118,139,142,113,210, 89,176, 88,205,183,136, 44,155,205, 6, 49, 99,196,220,185,115,241,214, 91,111, 1,128,228,157, -119,222, 89, 59,101,202,148, 39,121,158,111, 68, 8,105,195, 48,140,183,175,198, 29,177,177,177, 57,132, 16, 49,203,178,109,190, -248,226,139,176, 30, 61,122, 32, 40, 40, 8,132, 39,183,136, 44,155,141,135,217,108,130, 39, 75, 43, 84, 37,159,242,199,170,145, -161, 29,251,124,218,201,198,243, 91, 5,145,197,219,108, 0, 95,118, 82, 65,110, 6,182,252,190, 14, 95, 45,252,170, 8, 12, 57, - 7, 2,222, 46, 6,225, 65, 12, 54,218,115,248,108,155,214,205,235, 97,202, 55,223,200, 78, 31,205, 90, 59,252,237,247, 83,250, - 13, 24,132, 85, 63, 47, 3,107, 45, 62,230, 44,178,108, 22, 30, 37, 69,249,189,254,162,109,180,254, 45,132,109,217,186,149, 25, - 52,104, 16, 95, 90, 90, 10,137, 84,202, 91, 44, 22, 81,171, 86,173,108,111,189,245, 22,155,157,157, 13,117,169,134, 3, 16,134, - 7,192,214, 82,171,213,203,222,120,227,141,118,187,118,237,146,176, 44, 11,181, 90,141, 14, 29, 58,228,231,241,113, 1,175,253, -111,120, 68,102,102,134, 85, 37,231,140, 18,137, 24,185,185,185,124,187, 30, 3,245, 3,134,188, 85,229,173, 15,166, 47,202,218, -183,240, 75,127,174,225,220, 19,208,117,223,226,197,139, 77,113,113,113, 6,153, 76, 38, 29, 60,120,176, 95,245,135, 38,147,137, -204,156, 57,211,232,218,187,208,100, 50,145,185,115,231,154,226,227,227,141,114,185,156, 88, 44,190,219,125,178, 44, 99,125,117, -202, 79, 86,171,213, 90,206,197, 18, 68,150,133,103, 52, 11, 22, 44, 48,199,199,199,155, 20, 10, 5,145,201,100, 18,127,194, 57, -124,248,112, 18, 26, 26,106, 86, 42,149,146, 49, 99,198,220, 81,175, 67,139, 13,220,148, 47, 28,195, 59,200,130,130,130, 80, 90, - 90,234, 8,107,108,108, 44, 21, 91, 20, 20,110,112,139, 22,185, 63, 93, 56,255,198,209,226, 1, 77, 78,110,126, 84, 68,116, 34, -172, 86,171,125,177,192,106,177, 96,228,235, 3, 48,123,225, 2, 0, 16,196, 86,151,119,222,121,103, 45, 0,159,133,217,138, 21, - 43, 38,191,243,206, 59,170,156,156,156,205, 63,252,240, 67,216,192,129, 3, 49,122,244,104,124,250,233,167, 16, 75, 3, 16, 22, - 89,213,113, 29,225,186,249,121,133, 32, 32, 26, 15, 62,157,185,172,144, 2, 23, 30,153, 0,139,205, 2,222, 98,129,197, 98, 1, - 35, 42,139,218,150,223,215, 97,224, 75,195, 33,150,169, 66, 63,159,251,137, 62,165, 89,236,147,227, 95,121,197,232,135, 9,200, -158, 62,154,181,118,248, 91, 99,186, 8, 34,107,205,178,133,231, 62, 27,219,103,185, 76,202, 57,174, 99,225,121,176,172,136,182, -209,250,151, 68,150, 76, 38, 91,189,105,211,166, 75, 77,154, 52, 97,180, 90, 45, 44, 22, 11,242,243,243,177,118,237,218, 51,132, - 16,132,134,134, 98,211,166, 77,252,192,129, 3, 87, 27,141,198,103,238,119,177,149,157,157,125, 94, 46,151,175,120,255,253,247, - 7,140, 29, 59, 86,204,243, 60, 46, 92,184, 0, 48, 12, 17, 75,164, 96, 89, 22, 98, 49,135,146, 18, 53,175, 8, 12,201, 50, 19, -145, 66, 44,145,130, 21, 73,188,117, 19,190, 97, 31,140, 20, 44, 39, 41, 21,122, 2, 74, 36, 18, 28, 88, 53, 75,221,126,240,100, - 21, 0, 72,100,242,162,174, 93,187, 94,175, 87,175,158,246,200,145, 35, 9,184,181,215,161,235,243,105,237, 59,120,140, 72, 33, - 15,208,118,233,210,229,134,192,153,182,245,115,245,160,161, 31, 48,140, 72,170, 77, 77, 77,189,158,146,146,162, 21,137, 68, 56, -187,238, 19,117,223,193, 99, 2, 24, 47,131,172,110,190, 68, 94, 61,177,106,119,157,169, 83,167, 90,122,244,232,113, 83,104, 47, -150,150,150, 86,165,103,207,158,178, 57,115,230, 88,122,246,236,153,222,160, 65, 3, 13,203,178, 56,122,244,104,188, 55,167, 74, -128, 92, 46,183,188,252,242,203, 55, 78,157, 58,117,187,189, 14,189,162,106,213,170,224,121, 30, 29, 58,116,128,193, 96,160,206, - 22, 5,197,131, 9,215,113,180, 60,143, 12,111,177, 90,134,191,254,230,196,207, 1, 38,208,169, 20,248,199, 88, 34, 96,222,125, -119,148, 18,128, 92, 16, 91,111,191,253,182,207,105, 78,156, 68, 86,179,129, 3, 7, 98,220,184,113,248,236,179,207,108,159,126, -250,169,232,252,197,107,230,193, 67, 63, 42,118,185, 14, 8,136,134,183,240,195,221,241, 21,149,104, 63,106,211,115,198,196,140, - 28,221,158,193,111,140,119,148, 94, 54, 0,106, 38,214, 6, 0, 95, 45, 92,168, 21,203, 84,202,126, 3, 6, 1, 64,151,207,231, -126,178,118, 10,190,241, 45,182, 8, 83,119,248,219, 99, 66, 5,145,245,197,156,169,167,130,153,156, 5, 35, 70,157,177, 56, 95, - 7, 0,194,130,176,182, 77,207, 25,221,114, 11,181,243,104, 62,187,119,144, 74,165,147,183,111,223,174,108,216,176, 33, 83, 80, - 80, 0,155,173, 44, 69,204,102, 51, 74, 74, 74, 80, 90, 90, 10,163,209,136,166, 77,155,178,243,231,207, 87,142, 24, 49, 98,178, -201,100, 26,122,191,199,251,234,213,171, 95,172, 95,191, 30, 59,119,238,236, 63,118,236, 88,113, 76, 76, 12, 19, 28,156,195, 88, -204, 38, 0,132,228,229,229,241,138,192,144,172,136,232,248, 27,153,217,185,117, 45,102, 19,120,155,217, 99,107,115,251,240, 14, -239,158, 62,125, 58,113,214,172, 89, 38,231,158,128, 3,198,124, 62,191,105,211,166, 97, 11, 22, 44, 48,165,166,166, 94, 23, 26, -175,251,211, 24,126,203, 21,188,121,250,244,201,250,174,156,237, 95,155,245,173,192,233,220, 27,177,215,168, 69,223,214,172, 89, - 51, 44, 37, 37,229,186, 55,222,228,228,100,125,108,108,172,169, 78,157, 58, 26,177, 88,252,127,246,206, 58, 60,138,171,141,226, -103,102, 93,227, 78, 72, 8, 22,197, 37,184, 91,209, 22, 45, 78, 41, 86,172, 80,138,180,120,161, 80,188, 88,129,150, 2,165,248, - 71,139,107,113, 39, 9,193, 18, 36, 16,119,151,117,153,251,253,145,108,154,132,200,110, 66, 75,105,231,247, 60,243,108, 50,114, -246,142,238,153,247,222,251,222,252, 72,150, 94,175,172, 89,179, 38,227,236,236,172,245,243,243,203,179,180,209,190, 88, 44, 38, -166,168, 88,105, 88,210,235,144,199,129, 97,216,176, 97,133,153,225,103,213,169,147, 56, 98,196, 8,215,153, 51,103, 98,231,206, -157,184,121,243,230, 27,102,191,125,251,246,184,118,237,218, 18,252,139, 18,235,178,176,252,199, 40, 63,143, 86, 73,118,237,218, -251, 7,138,180,105, 42,141,101,203,150, 9, 11, 34, 89, 93, 63,255,252,115,168, 84, 42,219, 82, 86,235,130,130, 92, 27,165,153, -172, 85,171, 86,237, 39,132,184, 3,104, 99, 52, 50,119,127,252,105, 87,199,178,190,111,208,160, 65,111,104, 18,138,230,208, 52, -149, 39,224,145, 7, 63,236,216,249,107,177,245,243, 27,191,123,131,194,195,205, 27, 86,169, 0,116, 45,105,182,240,231, 48, 35, -133,154, 38, 38, 78,154, 88,104,178, 54,111, 88,117, 33,160,169,199, 71,243, 63,253,166, 84,115,246,205,162, 9, 82,154,166, 90, -149,104,163,245,134,230, 91,128,213,252,147,142,195,134, 13,107, 16, 24, 24, 72, 23, 53, 89, 90,173,182, 48,113,167,169,177,120, -124,124, 60,218,183,111, 79, 55,104,208,160,222,189,123,247, 58,226,207,225,156,222,215,125, 55,190,126,253,122,163,139,139,203, -197,133, 11, 23,142, 72, 75, 75,235,149,153,153,101,127,114,215, 55,232, 49,104, 18,213,190,231, 80,133,150,112, 69,113,137,201, - 62, 87, 78,239,179, 59,115,112, 11,116, 90,237, 4, 0,225,248, 51,189, 67, 73, 77,165, 41,141,131,143,143,143,162,168, 81,241, -240,240, 80,187,185,185,105, 2, 2, 2, 10,231,151,209,155,239,141,125,183, 84,179,160,253,151,162,162,227,105, 50,109, 37,211, - 70, 72, 36, 18,152,204,151, 37,229, 44,218,219,178,212, 7,101,197,189, 14, 11, 53, 11,210, 59, 20,243,105,123,247,238,237,178, -119,239,222,166, 0, 30, 32,127,172, 67, 61,144, 95,149, 88,164,209,252,226,130,137,189,223, 89,205,255,170,230,251, 76,123,252, -217, 54, 11,200,111,171,117,181, 76,163, 85, 17,166,134,239, 0,232, 25, 51,102,100,170, 84, 42,219, 17, 35, 70,148,187, 77, 82, - 82,210,206, 61,123,246, 20, 51, 89,253,251,247, 31,115,228,200,145,139, 41, 41, 41,149,218, 43, 91, 43,241,178,171, 39,230,216, -182,239,189,242,115, 0,171,203, 8,228, 49, 1, 77, 93, 63,218,188, 97,213,111, 37,204,214, 47, 0,250,151,229, 74,187,125,208, - 15,251,118,109, 54,181,237, 18, 63, 14,138, 63, 51, 36,100,105,169,189, 21,109,100,194,165, 5,229,152,201,182,209,250,123,224, -243,249, 29,230,206,157,203, 87, 40, 20,111,152,172,146, 70, 43, 39, 39, 7, 15, 31, 62,196,232,209,163,133,161,161,161, 29,116, - 58,221,229,127,195, 49, 72, 74, 74,122, 86,144,140,116,186, 41,133,131, 80, 36,230, 15,253,228,115,247,194, 94,135, 7,183, 64, -163, 86, 1, 0,215,156,244, 14, 92, 46,151, 31, 26, 26,234,105,138, 90,233,116, 58,161,105,126, 80, 80,144,167, 41,183,150, 90, -173, 54,187,215,225, 95,165,249,232,209, 35,119, 83,239, 72, 83,239, 66, 46,151,203, 15, 14, 14,118, 55,105,106, 52, 26,179,122, - 29, 10, 4, 2,126,104,104,168,187,209,104,124,107,189, 14,139, 26, 99,228,143,179, 88,108,172,197,130,182,101, 20, 69, 81,132, -173, 54,100, 97,121,239, 41,217, 83,178,252, 65,165, 43,194,212,240,221,130, 77,184,213,171, 87,239,246,241,199, 31, 23, 51, 89, - 3, 7, 14, 52, 30, 61,122,244,138,171,171,107, 50, 77,211,207, 44, 45, 71, 97, 27, 45,188,241, 6, 9,154,166, 31,182,105,230, - 7,154,166, 31,206,255,244, 83,205, 50,252, 84,204,108, 29,251,237, 80,247,184,204,167,165, 91, 51, 0,246, 78,213, 48,108,204, - 20, 12, 27, 51,197, 22, 64,107,160,236,222,138,229,149,131,229,175,129,162, 40,129,155,155,219, 99,181, 90, 13,138,162,160,209, -104, 10, 13, 86,110,110, 46,178,179,179, 11,255,215,233,116, 72, 77, 77,133,135,135, 7, 40,138,250, 87,183,163,211,233,116,134, -185, 75,214,236,225,112,249, 6,134,209, 81, 58,157,238, 19, 75,238,243,185,115,231,210, 40,165,237,213,212,169, 83, 75,157,255, -174, 52,191,250,234,171, 82,123, 9, 78,157, 58,181,220,222,131,101,241,197, 23, 95,188,181, 94,135,230, 63,190, 88, 88, 88,254, -101,148,218,117,175, 82, 70,139,166,233,135,165,244, 46,164, 0, 16,154,166, 31,150,146,229,192, 16, 19, 19,179,196,198,198,102, -130, 66,161, 56,219,191,127,255, 25, 3, 7, 14, 52, 2,249, 13,228, 43,187, 71,153,217,138, 69, 29,250,124, 55, 51, 43, 79,179, -169,228,178,146,145, 39,147,217,218,242,253,170,173,191, 29, 57, 48, 48, 41, 33,110,107, 89,251, 86,150,161, 42,171,183, 98,118, -142,106, 73,135, 62,223,125,158,153,163, 98,219,104,253, 77, 24,141,198,243, 98,177,152, 50, 13,166, 92, 52,122,149,147,147, 3, -165, 82,137,130, 33,105, 0, 0,121,121,121,176,182,182,134,209,104, 36,255,178, 67,161, 1,240,101, 65,180, 10, 0,190,140,188, -178,177,232,181,253,168,232,178,114,162, 89,137,230, 12, 16, 93,218,118,229, 45,251, 11, 52,147,203, 25, 32,186, 60,146, 45,212, - 75, 6, 0, 62,143,147, 82,214,224,209,124, 30, 39,165,156,118,251, 22,190, 55, 80, 4,192, 18,246,206,102, 97,121,127,223,255, -223,213, 23,119, 97, 53, 89, 77, 86,243,111,209, 20, 22, 76,230, 46, 99,143, 39,171,201,106,178,154,255, 52,205,210, 24,255,158, - 24, 45, 82,202, 4, 66, 8,254, 77, 99,192,177,176,252,151,209, 84,114, 25, 11, 11, 11, 11, 75,213,121, 99, 48,233,162, 11,202, -114,165,150,244, 38,168,140,179,189,200,106,178,154,172, 38,171,201,106,178,154,172,230,127, 78,179, 34,237,162,219,143, 7,176, -227, 61, 49, 91,111,152, 44, 66,254,250,214, 42,108, 88,149,213,100, 53, 89, 77, 86,147,213,100, 53, 89,205,202,194, 86, 29,178, -176,176,176,176,176,176,176,252,199,177, 44, 97, 41, 75, 41,120,244,155, 15, 6, 95, 21, 28,206, 85,136, 61,182,248,223,182,139, - 3, 7, 14,228, 88,178,126,100,164, 13, 29, 2,215,181, 86, 82,126,159, 60,133,126, 45, 19,178,104, 83, 69, 23,162, 67,205,198, - 35, 37, 34,201,103, 90,173,214, 75, 38,151,167,100,164,167,110,203,136,121,180,165,200, 58, 86,119,239,222,117, 13, 12, 12, 76, - 0,144, 91,228, 77,129,133,133,229,109, 98,227, 87, 29, 20,245, 9, 64,254,236,118,201,144,167,200, 14,223, 85,108, 61,107,223, - 49,160, 41,255, 34,115, 84, 32,248, 17, 89, 97,177, 21,252,224,216, 68, 68, 68,120,214,174, 93, 59, 26, 64, 86,201,111, 47,101, - 25,123,159,179,188,207,180, 71,241,132,165,133,247, 66,213,141, 86,157,254, 94, 48,208,163, 64, 48, 28, 20, 66, 17,121,100, 64, -165,116,106,125, 84, 13, 12,183, 57,128,198, 0,105, 44, 21,139, 26,169,180,186, 20,134,144,145,120,117,232,129,197,122, 94, 3, - 39,161,236,225, 44,150, 32,242,200, 15, 22,233, 49,228,235,251,215,142, 10,109, 36, 20,106, 55,233, 63, 27,197, 51, 56, 87, 22, - 1,128,182, 52, 77,251, 75, 36, 18, 87,165, 82,153,202, 48, 76, 44,242,235,167, 51, 43,169, 73, 3, 24, 43,147, 74,123,120,202, - 5,141, 99,210,178,227,115,245,198,235,200, 79,232,154,249,182,174,168,124,147,229,178,227,243,161,129,163, 87, 77,235, 2,155, - 14,223,205, 86, 2,229, 25, 45,202,221,187,213,177, 33, 31, 15,234, 48,121,252,104, 89, 53, 71, 25, 18,211, 20,246, 63,236,220, -187,102,239,222,125,189, 63, 29,210,181, 7, 0,124,243,205, 55, 31, 86,175, 94,189, 6,135,195,137, 92,176, 96,193, 47,139, 22, - 45, 34, 84,217, 35,149,187, 22, 92,195,166, 7,190, 20, 64, 0,128,154, 0, 94, 3,120,130,226, 89,198, 43,195,123,161, 89,173, - 90, 53, 55,134, 97, 62,117,118,118,238,149,156,156,124,138,166,233,159,226,227,227, 19,222,229, 83,135, 16,178,157,162,168,241, -132,144, 29, 22,124, 78,176,228, 59, 68, 34, 81,178, 90,173,118, 42,248, 59, 69,173, 86, 59,255, 85,251,243,119,126,215,223,244, -254, 61,238,252,141, 39, 61,138,206,234,214,198,191,148, 39, 10,229,127,254,198,211,118,197,215, 11, 48,150,241, 12,164, 8, 33, - 88,178,100, 9,181,116,233,210, 49,181,106,213,170, 67,211,244,243,133, 11, 23, 22, 75,125, 83,114, 89,145,251,156, 53, 91, 44, -239, 43,150, 13, 42, 93, 33,126, 3,165, 80,147,129, 0, 53,186,125,179, 70,109, 38,140,236, 67, 17,142, 8, 67,199,205, 49, 88, -172,229, 57, 90, 8,142,106, 89,125,127,239, 25,131,250,116,161,155, 6,212,128,171,163, 53, 64,243,176,253,116,148,253,166, 85, - 11,182, 2, 8,172, 68, 41, 23,189,186,189,223, 41, 49,203, 8,138, 2, 40, 10,160, 41, 32, 79,205,160,219,135,163, 22, 1,248, -193,194,167, 18,109, 35,161, 48, 99,191, 26, 0, 56,111,225,164,212,112,116,116, 28, 51,125,250,116,105, 64, 64,128,141, 72, 36, - 18,168,213,106,231,136,136, 8,199, 5, 11, 22, 4,168, 84,170, 19, 0,238, 91,168,233, 81,219,221,237,208,166, 25, 99,155, 55, -168,233, 9,158, 54, 15,140, 70, 81,253, 69,196,203,150, 19,183, 30, 30,247, 52, 67,253, 49, 42, 49,100, 66, 90, 90, 26, 5, 0, - 14, 14, 14,164,184,201,106, 49,122,253,204,110,152,177,238, 60,148,106,237,175,229,105,216,213,104, 56,226,163,143,250,117, 88, -254,245, 84, 89,124,186, 14,161,145, 42,216,201,248, 88,244,229, 36,129, 70,163,111,185,245,151,189,227, 55,175,156,243,163,209, -104,236, 4,160,169,209,104, 12, 2,240,203,146, 37, 75,202,122,248, 46, 5,240, 85,193, 5,189,143,195,225, 92,232,216,177,163, -215,167,159,126, 74, 53,105,210, 4,193,193,193, 53,247,239,223,223,229,212,169, 83,145, 70,163,241, 17,128,231, 40, 24,246,196, - 12,120, 0,188, 57, 28, 78,253,127,178,166,171,171,171, 88,171,213,142,114,119,119, 31,223,170, 85,171,250,125,250,244,161,188, -189,189,241,236,217,179, 38,103,206,156, 89,116,253,250,245, 71,113,113,113, 59, 4, 2,193,158,196,196, 68,213,223,254, 59, 78, - 81,227, 1,184, 21,248,228, 37,102,124, 38, 32, 63,151, 84,162,185,223,161, 86,171,157, 76,141, 77, 41,138,114,250, 43,247,199, -194,239, 10,163, 40,202,174, 96, 93,148,247, 73,211, 52, 12, 6,131,194,104, 52,214,170, 64,211,187,224, 69,202,108,175, 11,160, -188, 68,208, 98, 0,232,214,218, 63, 3, 20,158, 22, 70,180,222,124,201,124, 90,104,192, 8,252,207,223,124,106, 87, 44, 10, 86, -242, 45,118,201, 18,106,209,162, 69, 88,188,120,113, 31, 0,109, 25,134,185,238,235,235,187,177,152, 36,195, 20, 46, 91,180,104, -209,247,229,220,231, 44, 44,239, 11, 29, 96,201,160,210,101,190,255,212, 26,208, 14, 70,140,246,180,119, 26, 56,237,211,193,226, - 0,223,218, 80, 67,134,168, 52, 35, 78,159, 60, 3, 0, 7, 45,139, 58, 13,110,202,229,170,247,172, 90,252,165, 79,219,230, 1, -120, 28,175, 71, 80,188, 17,202, 72, 61, 56,180, 30, 70,134, 0, 4,234,202,238,117, 92,166, 1, 55,158,107, 65, 83, 0,135, 6, -104,154, 2,135,174,164, 24,163,125,241,205,174,144,128,180,100, 6, 96,180, 47,170,120, 66,252,235,214,173, 59, 98,233,210,165, - 54, 73, 73, 73,210,224,224, 96, 8,133, 66,216,218,218,114, 92, 93, 93,221,214,173, 91,167,154, 54,109, 90, 47,157, 78, 23, 5, - 32,205, 76, 77,223,158, 77,235,223,218,177,234, 27,107,253,221, 51,200, 58,240, 63,112,104, 2,190, 84, 6, 47,177, 24,103, 62, -170,109, 55,240,100,228,209,123,201, 10, 95, 0,241, 21,137,133,135,135,115, 52, 26,205,199, 86, 86, 86, 45,120, 60,158,179,200, -182, 6,147,192,109,154,158, 74,213,124,157,226,164,108, 55,179,139,115,143,181,159,119,196,140,117,231,177, 97,255,157,221,141, -145,180,176,188,188,217, 18,137,108,194,180,207, 62,149,197,165,233,176,236,104, 26,118, 93,203,193,168,182,114,204,248,192, 26, -195,134, 14,145, 30,254,223,145, 9, 0,126, 44,178,201, 51, 95, 95, 95, 42, 60, 60,188,180,135,175, 45,128, 57, 90,173,150,230, -243,249,148, 72, 36, 26,177,124,249,114,221,208,161, 67,227, 76, 43,180,109,219, 22,109,219,182,165,114,115,115,107, 94,190,124, -185,230,222,189,123, 13,183,111,223, 14, 3,112,172,236,136,133, 56, 70,173, 86, 85, 23,137,197,202, 31,182,110, 93,219,174, 93, - 59, 70, 40,252, 51,253, 84,101, 52, 1,192,218,218,250, 71, 39, 39, 39,106,222,188,121, 9,111, 75,179, 70,141, 26,231,155, 55, -111,222,177, 91,183,110,220,214,173, 91,195,205,205,173,112,153,131,131, 3,218,182,109, 75,197,198,198, 54,184,126,253,250,214, -243,231,207,111,124,240,224,193,229,168,168,168,110,127,115, 68,107, 71,129,153, 72,180,112,253,247, 30,138,162,100,219,183,111, -119, 50,141,201,168,215,235, 97, 52, 26, 11, 63, 77, 19,195, 48, 48, 26,141, 88,190,124,185, 81,161, 80,152,115,140, 20, 69,222, -154, 77, 19, 83,218,167, 64, 32,112, 48, 37,236,173,224,201,254,212, 85,152,229, 39,149, 74, 61, 1,244,132, 99,157, 57,197, 87, -200,127,127, 86, 40, 20,209,137, 26,155,167, 0,218,149,163,102,179,116,233,210, 81,139, 23, 47,238, 87, 36, 74, 91,127,208,160, - 65, 37,135,189,170, 95,240,169,160, 40,234, 10, 77,211, 39, 0,236,194, 91,140,186,179,252,187, 32,132, 52, 3,224, 88,100,150, - 22,249,181, 66, 40,248,157,164, 0,216,151,152, 95,116, 61,211,103,106,193,124,199,130,237, 72, 17,221, 84,138,162,238, 87,178, -136, 87, 81, 70, 59, 45, 46, 0,156, 60,121,146,244,238,221,155, 50,125,150,110,138, 6,158, 30, 59,180,111,143, 94,157, 91,129, - 22,217,226, 69, 10,112, 59,134,128, 75,235, 65,131,224,238,205,203, 4, 92,102, 79,137,173,202,142,158,212, 24,240, 69,253, 0, -223,239,126, 90, 53,157, 19,150,194,197,174,235, 74,232,212,121, 72, 77,138, 65, 74, 66, 52, 18,227, 94, 35, 62,230,245, 35,128, - 90,100,182,230, 27, 39, 6, 48, 50, 5,239,128, 12, 74,139,232,153,175,169, 83,132,215,244, 14, 8,200, 20, 24, 1,157, 34,220, -140,175, 47, 75,179, 94,157, 58,117,134,126,253,245,215,118, 79,158, 60, 17, 43,149, 74,205,153, 51,103,158, 69, 69, 69, 89,185, -186,186,102, 76,154, 52,169,142,155,155,155, 85,255,254,253, 5, 7, 14, 28,248, 16,197,187,181,150,165, 25,208,183, 69,163,219, - 59, 55,174,151,166, 31,222, 4,109,196, 67,156, 78, 84,224,102,178,146,212,180, 22, 82, 83, 26, 56, 66, 38,228,226,155,214,110, -178,158,191, 69,124,167,103,152, 97,229,105,222,186,117,203, 85, 34,145,172, 27, 62,124,184,235,212,169, 83,133, 70,174, 13,247, -200,237,116,235, 57, 91,111,187, 41, 53, 58,206,208,142, 53, 48,115,120,125,204,220,112,201,100,178,198,123,121,101, 49, 33, 33, -101,107,234,117, 58, 47,119, 39, 43,132, 70,169,176,235, 90, 14,254,248,218, 13,157,151, 39,160,127, 99, 46,124, 61,100, 48,232, -244,222,131, 6, 13,218, 83,240,214,126, 31,192,135,131, 6, 13,242,225,112, 56,151, 0,252, 94,209, 57, 18,137, 74, 31, 61,197, -214,214, 22,237,219,183,135,175,175, 47,183, 93,187,118,245, 75, 24,152, 98,154, 58,157,214,149, 97, 8,228,114,185,216,222,222, -222, 86, 46,151,167,151,246, 67,101,137, 38, 0,216,217,217, 13,104,223,190, 61,119,255,254,253,105,145,145,145,119,135, 14, 29, -250,218,202,202,170, 88,244, 87, 42,149,162, 78,157, 58, 88,176, 96, 1,183, 71,143, 30, 21,106, 58, 59, 59,119,221,187,119, 47, - 40,138, 42,252,209,126, 35, 88,236,233, 9, 23, 23, 23,244,236,217,147, 59, 96,192,128,174, 81, 81, 81,149,186,143, 44,224, 98, - 41, 17,173, 37, 37,206, 83,153,213,111,165,173,111,198,121, 79, 49, 69,151, 10,244, 80,133,123,179,220,234, 78,145, 72, 84, 24, -133, 42,229,187,222,208,164,105, 26,243,231,207, 7, 69, 81,224,241,120,224,243,249,165,126,118,232,208,193,210,114,198, 82, 20, - 69,243,249,252, 57, 92, 46,247, 83,141, 70,227, 46, 18,137, 18,140, 70,227,110,141, 70,179, 28,128,158, 16, 98, 83,134,201, 42, - 85, 83, 42,149,122,190,120,241,162,110, 89, 5,209,104, 52,168, 95,191, 62,160, 65, 88,121,154, 17, 17, 17,158,181,106,213,242, - 6, 96, 26,162,237, 26, 33,164, 93,145,255,139,114,141, 16,242, 65,193,223,207, 95,189,122,229, 89,187,118,237,204,191,235,250, -100, 53,255,121,154, 21,120, 17, 71,138,162, 78, 22,185, 87,123,155,254,159, 59,119,238, 87, 43, 86,172,120, 66, 81,212,201,162, -243,139,174, 87,244,179,224,121,115,146, 16,210,123,222,188,121, 1, 43, 87,174,252,214,180,238, 95, 97, 18, 45,137,104, 89,165, -170,165,184, 30, 99, 5, 46,199, 8, 46, 77,129,203, 1, 64, 40, 68, 71, 69, 32, 55, 39,235, 6, 34,143, 70,154, 23,201, 26,216, -186, 97,195,122,171,246,109,152, 77,255,124, 93,137, 44,133, 26,225, 15,174,224,254,149,223,147,140, 6,227,239,160, 72, 16, 64, - 7,227, 53,243, 12, 56, 82,185, 49, 46, 40,194,205, 55, 90, 5,230,170,152,217,122,103, 52,240,241,241, 25,178, 96,193, 2,135, -144,144, 16, 81,118,118,118,238,190,125,251, 18, 52, 26, 77, 20,128,115,209,209,209, 62,223,127,255,189, 96,213,170, 85,245,234, -213,171,231,122,232,208, 33,109, 41,195, 25,189,161,249,229,232, 97,183, 63,157,246,185, 40,236,208, 22, 8,194,130, 49,255, 97, -154,241,143, 68,229,215, 0, 54, 32, 54,175,117,170,218,112, 97,125,251,234,116, 13, 57, 31,181,109, 4, 29,194, 51,212,229, 70, -178, 36, 18,201,186,189,123,247,122, 54,107,214,140, 6,128,235,207, 13,194, 57, 91,111,187,157, 91,209,154,106,237,111,143,148, - 44, 13,166,111, 9,197,153,219, 41,103, 77, 38,171,162, 66,202,229,242,212,184,148, 28,103,123,153, 8, 35,219,200,208,121,121, - 2, 6, 54, 21, 66,200,167,240, 44, 50, 9,181,107,213,160, 66,111, 28,107, 90, 96,178,154, 37, 38, 38, 2, 64, 83, 0,145,177, -177,177,174,129,129,129,217, 69,228, 50, 1,124, 39, 16, 8,230, 83, 20, 69,154, 53,107, 22, 90,175, 94,189, 60, 91, 91, 91,168, - 84, 42,104, 52, 26,240,249,124,168, 84, 42, 68, 71, 71,227,238,221,187,176,181,181,181,232, 68,229,229,229, 65, 46,151,131, 97, -152, 42,107, 26,141, 70,106,219,182,109,210, 39, 79,158, 72,143, 28, 57,226, 60, 99,198,140,116, 63, 63,191,160, 33, 67,134,188, -116,114,114,210, 60,124,248, 16,183,110,221, 66,102,102, 38, 90,180,104, 97,150,166, 86,171, 5,151,203,133, 74,165,130, 80, 40, - 4,151,203,133,193, 96, 0,195, 48,133,230, 43, 47, 47, 15, 25, 25, 25,224,243,249,208,106,181,239,226, 13,244,141, 8, 85,121, -213,111,149,137,104, 21, 53,106,102,154,172,138, 34, 81,101, 86,119,102,101,101,137,109,108,108,230, 0, 72,172,232,187, 40,138, - 2,135,195, 1,159,207, 7, 69, 81,104,215,174, 29,198,142, 29,139,198,141, 27, 35, 34, 34, 2, 7, 14, 28,192,253,251,247,193, -227,241, 10,215, 55,187,126,162, 67, 7,142, 72, 36,186,213,183,111,223,128,175,191,254, 90, 84,163, 70, 13,132,133,133,121,172, - 92,185,114,206,197,139, 23,251, 41, 20,138,166,166,167, 93,249, 81,250,130, 42,193,252,234,194,158, 26,141, 6, 97, 97, 97,150, -108,243, 6,181,107,215,142,166,105,250, 37,195, 48,215, 1,212, 39,132,180,163, 40,234, 12,242,219, 37, 22, 69, 65, 8,249,128, -162,168, 28, 0,143,104,154,126,206, 48, 76, 52, 27,183, 97, 49,227,185,210,187,228,255, 20, 69,157, 92,177, 98, 69,239,210,204, - 85, 41,247,102,177,249, 43, 87,174,252,182,200,255, 85,137,168,182, 71,241,198,240, 29, 10,162, 92,127, 26,173,147, 39, 79,150, -239, 64, 24,244, 63,121,116,255,157,206, 58,120, 6, 52,105, 91, 36, 58, 68, 16,124,247, 22, 0,178,219,172,162,184,246, 22,211, - 28,238,238,109,223, 78,165,183, 95, 81, 34, 54, 33, 5,183, 78,239, 70,106, 98,212, 46,128,204, 64,228,145,156, 42,159,137, 26, -253,235, 57,217, 59,216,168,117, 4, 12, 1,240,134,217,122, 39, 52,246,246,246, 30,112,251,246,109, 7,181, 90, 45,186,113,227, -134,114,239,222,189, 73, 58,157,238, 10,128,155, 5,235,132,164,166,166, 14, 42, 48, 38, 28, 46,151, 43,208,233,116,229,181, 93, -104,252,229,167,163,110,124,183,109,167,232,229,227, 80,124,127,228, 52,178,148, 74,227,149, 20,213,135, 0, 76,142,254, 82, 72, -154, 42,158,128, 84,231,209, 20, 92,165, 60,151,240, 12,181, 8, 40,189, 74, 86,163,209, 12, 29, 62,124,184,171,201,100, 1, 64, - 90,174,158,171,212,232, 57,173,253,237,209,164,227, 32, 4, 95, 62,140, 67,215,226, 81,203, 81,114,205, 75,154,101,214, 17, 77, - 77, 73,220,182,126,211,246,245,223, 45,249, 82, 48,179,167, 53, 6, 54,229, 65,196,167, 96, 37,225, 97,249,198, 31,245, 33,119, -175, 61,116,117,117, 61, 9,224,195,196,196, 68,184,186,186,230, 1,120,206,225,112, 34,141, 70, 99,105,141,186, 23, 2,112,222, -179,103, 15,173,215,235,243, 34, 34, 34,224,226,226, 2,103,103,103, 88, 91, 91, 35, 60, 60, 28,127,252,241, 7,158, 61,123, 6, -134, 97,208,176, 97, 67,139, 78, 86,122,122, 58, 30, 62,124,136,158, 61,123,205, 72, 77, 77,177,178,181,179, 87,220,184,126,109, - 77,101, 52, 25,134,161, 0, 32, 32, 32, 0, 1, 1, 1,162,248,248,120,247,147, 39, 79, 58, 45, 91,182, 44,198,211,211,115,159, - 74,165, 42, 22, 57, 48,215,104,153,204,133,201, 4,138, 68, 34,240,249,124,228,228,228, 32, 57, 57, 25,185,185,249,157, 54,109, -108,108,222,137,209, 42, 35, 66,245,214,214,255,139,205,225, 27,213,157, 54, 54, 54,195, 1,204, 49,115, 95, 96, 48, 24,192,231, -243, 17, 24, 24,136, 77,155, 54,225,254,253,251,248,253,247,223,225,225,225,129,209,163, 71,131,166,105, 60,121,242,196,210, 34, - 50,183,111,223,158,243,225,135, 31, 6,236,217,179, 71, 20, 29, 29,141,103,207,158,193,198,198, 6,155, 54,109, 18,142, 31, 63, -190,246,229,203,151, 23, 34,191,243, 75,249, 20,233, 93,168, 16,187, 14,174, 95,191,254, 27,171,184,184,184, 88,159, 59,119,206, -169,208,128,149,236,145,248, 38, 89, 11, 23, 46, 92,239,235,235,187,161,160,186,176, 45, 0, 41, 33,164,195,145, 35, 71, 40, 0, - 24, 56,112, 32,161, 40,202,244,131,244,232,240,225,195, 29,195,195,195,201,226,197,139,217, 54, 90, 44,101,121,145,241,166,123, -178, 44, 3,101,137, 81, 43, 26,241, 50, 49,111,222,188,128, 21, 43, 86,220,171,162,201, 42,250,198, 68, 76,102,171,240,199,180, -204, 42,195,194,216, 23,237,234,226,100,111, 55,119,116,107, 48, 12, 96, 48, 2, 6, 35,129, 66,169, 66,216,227,251, 74,136,168, - 35,102, 21, 71, 40, 88,181,236,235,207,107,134,198,209, 72,200,212,225,234,177,237, 36, 53, 49,106, 0, 34, 15,127,242,118, 76, -214,224,250, 46,206, 78, 87,247,111,255,134,190,255, 90, 11, 35,147,239,179, 24,134, 20,254,253, 14,112,113,116,116, 28,118,231, -206, 29, 71,161, 80, 40,122,241,226, 5,115,248,240,225, 76,157, 78,119,177,136,201, 2,128,214, 77,155, 54, 53,200,100, 50, 40, - 20, 10,157, 78,167, 83,151, 99,178,220, 59, 52,110,112,237,187,109, 59, 69,106,173, 22,217, 42, 13, 56,246, 78, 37, 77, 22, 0, -180,234, 88,183, 90, 53, 74, 36, 7, 1, 16,149,163, 75, 40,203,100, 1,128, 80, 40,236, 50,117,234,212, 98,227,226, 57,200,121, - 6,137,144,103,188,249, 52,141, 9,190,124, 24,215,159,164, 49, 34, 62,199,232, 72, 94,215, 52,247, 0,100,197, 61,221,246,251, -241,147, 23,190, 88,176, 42, 79,169,200, 69, 45, 55, 49,242,114,179,177,124,197,119,250,219,183,175, 95,153, 51, 99, 98,203,195, -135, 15,175, 68,126, 99,112, 0,120,126,248,240,225, 81, 11, 22, 44,248, 5,127,166,121, 40, 73,194,176, 97,195,226,252,253,253, -179,125,125,125,179,211,211,211,241,244,233, 83,100,102,102,226,251,239,191, 71, 88, 88, 24, 76, 17, 65,179,218,170,188,105,144, -144,153,153, 33, 35,132, 32, 51, 35, 93,250,245,215, 95, 91, 87, 70,211,104, 52, 22,187,183,170, 85,171,134, 73,147, 38,241,149, - 74,165, 77, 76, 76,140, 85,209,101,230,106,106,181,218,194,140,195,132, 16,104,181, 90,100,103,103, 67,171,213,226,229,203,151, -133, 38,171,224,251,223, 89, 68,203,244,183, 72, 36, 74, 54, 93,203,166, 42, 56,145, 72,148, 82,214,250, 85,161,200,119,145,130, -191, 45, 53,135, 21,238,143,153,231, 29,124, 62, 31, 99,199,142,197,189,123,247, 16, 17, 17, 1, 14,135, 3,133, 66, 1,165, 82, -137,174, 93,187, 66, 32, 16, 88, 26,209, 34,124, 62,127,248, 87, 95,125, 37,138,140,140, 68, 90, 90,154,169, 49, 61,140, 70, 35, -102,204,152, 33, 22, 10,133,195, 45, 13,221, 39, 38, 38,118,127,249,242,165,119,201, 41, 41, 41, 41,187,104,155,194,202,114,228, -200, 17,106,224,192,129,100,224,192,129,196,100,184, 88, 88, 74,163, 12, 47,178,163,172,136,214,219,136,138,153, 34, 91, 40,232, - 32, 82, 9, 76, 38,171,125, 17,227, 69,153, 34, 92,230, 85, 29,214, 26,220,200,217,222,238,242,158, 45, 75,101, 39, 31, 83,136, -139,141, 66,106, 98, 52,154,182,236,128,176,199,161, 96,244,198,163,120,121,164,226,150,156, 53, 6,214,245,245,245,251,172,125, -203,122, 88,117, 50, 15, 47,130,207, 33, 43, 53,113, 51,162, 14, 31,125, 43,103,200,115, 96, 3,103, 39,187,203,191,108, 89,106, -115,230, 41,141,216,216, 40, 28,251,101, 61,209,235, 52, 89, 40,222,147,203,226,183,102, 49,163, 21,228,101, 37, 67,155,107,132, -136, 86,138, 44,172,164, 72, 2,112,125,253,250,245,157, 91,180,104, 33, 24, 54,108, 88, 82,102,102,230, 49, 0,119,138,172,227, - 95,183,110,221,158,155, 54,109,114,142,141,141,197,197,139, 23,147,144,223,245,191, 44,226,174,133, 62,222,250,199, 47, 63,126, - 41,174,233,131,239,191,250,194,112,228,254,211,190, 0,206, 20, 89,199,183, 75,253,186, 39,151,205,154, 76, 51, 33,103,241, 48, - 58, 25,175,179, 53,127,148, 37,152,150,150, 70, 41,149, 74, 79, 27, 27,155,162, 23, 36, 92,165, 10,205,236,193,117, 19,186,206, -185,225,166,214, 25, 33,228,209,100,122, 63,207,132,123,199,142,216,167,169,211, 40, 83,111,196,138, 24, 55,164, 75,191, 45,123, -127, 27,121,242,228,169,207,116, 26,117, 61, 31, 31,111, 18,116,251,242,195, 57, 51, 38,246,168,228, 25,151,221,187,119,143,230, -112, 56,197, 12,122,209, 8,145,165,145, 34, 75, 48, 87,179,164,209, 50, 97, 48, 24,168,202,106,106, 52,154, 82,135,118, 40,173, -173, 22,195, 48,127,201,254, 91, 18,161, 42, 90,101,104,106, 79,167, 86,171,157, 10,218,108, 57,191,205,136, 86, 85,122, 34,150, - 87,125,105, 73,249,104,154, 6,195, 48,224,243,249,104,216,176, 33, 78,158, 60, 9, 59, 59, 59, 88, 89, 89,193,202,202, 10, 98, -177, 24,246,246,246,133, 70,139,166,205,238,165, 67, 52, 26,141,135,135,135, 7, 94,190,124, 9,145, 72, 84, 56, 9,133, 66, 4, - 4, 4, 64,161, 80, 84,195,187,140,221,179,176,252,181,207,149,147, 69,205, 18, 69, 81, 39,231,206,157,251, 85,101,245,230,206, -157,251, 85,105, 17,174, 42, 26,174, 98,209, 45,110, 81, 7, 89,170,147, 44, 48, 89,187, 54, 47,177,250,237, 1, 16, 23, 23,137, - 11,135, 54,230,234,117,218, 76,134,209,123,190,126, 22, 10,208,216,109, 86, 17,104,210,188, 95,207,142,212,133, 39, 90,228,100, -165,226,121,208,185, 40,168, 4,243,222,154,201,114,118,184,188,103,203, 18,155, 19,143, 41,196,198, 70,225,204,254,239,115,244, - 58, 93, 23, 68, 30, 9,170,138,244,112, 62,191, 31,191,122, 76,239, 79,219, 38,192, 72, 25, 49, 60, 44,252,131,148, 36,244, 75, -188, 81,126,207,176,162,164,166,166, 30, 91,191,126, 61,181,122,245,234,246,106,181,250,127, 0,138,134, 40,235,213,170, 85,235, -227, 29, 59,118,216,197,198,198,242,110,220,184,161,184,124,249, 50, 1,112,162,130,136,203,236,174,159, 76,226, 52,174, 81,109, -106, 72, 84,124, 95, 0,103,139, 44, 14,232,221,196,255,230,206, 21, 11,229,250,155, 71,144,151, 24,139,121, 55,227,114, 0,152, -125,188,245,122, 61,178,179,179,161,207, 75, 55, 52,117, 85,100, 47, 30,228,164, 73,206, 84,115,121,140,210,224,107,149,162,185, -156,254,154, 35,145, 72, 44, 58,150, 91, 86,124,185, 23,192,222, 65,131, 6,237,121,116,251, 84, 83, 87, 87,215, 83,190,190,190, - 20, 0,148,209,195,176, 44,150, 2,152,209,170, 85, 43, 42, 48, 48,240,238,134, 13, 27,206,151,103, 86, 42, 19,209,170, 8,115, - 53, 25,134,161,203, 56,190, 84,101, 53,139, 70,180, 42, 50, 90,239, 50,162, 85,154,105, 41,106, 18,139, 26,161,127, 66,175,195, -242,204,148, 37,229, 51,181,147,227,243,249, 8, 13, 13, 69,245,234,213,161,211,233, 32,151,203, 33,151,203, 33,147,201,144,155, -155, 11, 30,143, 7, 11,247,153, 17,137, 68, 49, 79,159, 62,245,118,116,116,132,209,104, 44,102,182, 94,188,120, 1,169, 84, 26, -111,105, 68,203,213,213,245, 92, 65,175,195, 98,184,184,184, 88,191,141,227, 90, 52,146, 53,112,224, 64,182,138,144,165,220,104, - 86, 25, 81,173,212, 18,145, 40,109,145,255, 83,145,159,195,173,119,193,223, 40,229,111,109, 41,243,210, 87,172, 88,113,185, 72, -251,174,212, 42,238,130, 41,197, 67,177, 30, 46,220,138, 34, 89, 78,118,182,151,127,250,126,177,213,161, 96, 32, 62, 54, 18, 87, -143,110,202, 54, 24,117,157,192,144,196,219, 23,143, 30, 1, 5, 37, 94, 31,185,106,222, 35, 2,141, 27,251,121,226,247, 39,122, -164,198,189, 0, 33,204, 46,164,236, 85, 86,249,236,212,234,223,208,201,206,225,242,174, 77,139,173,127, 11,165, 16, 23, 27,137, - 11,135, 54,229, 24,244,202,206,136, 60, 26, 92, 89,217,177,128, 45, 71, 42,218, 58,160, 67,227,193,158,181,220,193, 16, 61, 24, - 62, 65,255,217, 14,220,231, 33,202,223,175,139,178, 15, 49,121,204,103,241,119,204,107, 64,151,151,151,247, 59,128, 32, 20, 79, -175,208,160, 78,157, 58,131,183,110,221,234, 24, 23, 23, 39, 10, 9, 9, 81,109,223,190, 61,133, 97,152,223, 0,152, 83,149,250, - 69, 72, 84,252, 79, 40,158, 47,167,193,151,159, 12,187, 61,108,204,167,162,200,139,123, 97, 27, 25,134, 89, 55, 19,140,207, 51, -181, 67, 11,162,107,165,226,224,224, 64,210,210,210,162,179,178,178,188,165, 82, 41,210,211,211,145,145,145,129,236,236,108,104, -114, 50, 12,246,198, 44, 5,101,200, 0,143,199, 67, 74,172, 30, 70,163, 49,201,220,104, 22, 0,219,165, 75,151,142, 99, 24,198, -148, 17,177, 88,239,194, 34,235,153,174, 7,239, 65,131, 6,237, 41,210,235, 48,187,168, 22,242,211, 59, 80, 5,233, 29, 90,156, - 61,123, 54,188, 71,143, 30,113,165,153, 21,161, 80,104,113, 67,233,178,122, 49, 86, 70,179,172,136, 86,201,249,150,104,154,170, - 47, 77,141,224, 75,206, 55,193,225,112,192, 48, 12,204,232, 84,241,151,154,150,162,189, 3, 43, 99,114, 74,156,155,114, 19,135, - 86,178, 39,226, 91,141,104,153,206, 5,159,207,199,241,227,199, 49,102,204, 24, 24,141, 70, 72, 36, 18,200,100, 50, 72,165, 82, - 28, 61,122, 20,166,244, 15,150,248, 87,189, 94,255,235,138, 21, 43,190,218,182,109,155,152, 16, 2,129, 64, 80,104,180, 22, 47, - 94,172,210,233,116,191,154,101,180, 76, 25,223, 25,242, 84, 42, 53,148,219,235,176,180,109,202,104,175,101,179,116,233,210, 81, - 12,195,244, 67,137, 20, 14, 37,214, 43,150,250,129, 77,239,192, 98,198,243,228,254, 63,184,120, 38,131, 69, 21,137,100, 21, 26, - 46,186, 60,243,226,104,107,115,249,199,239, 23, 91,237,187, 79, 33,242,245,107, 92,249,223,198,124,147,245,234,208, 3, 68, 31, - 73, 70,228,145, 54,120,125,164,187,217,111, 79, 20,213,216,205,201, 6, 25, 10, 6, 57,105, 49, 0, 65,200,219, 48, 89,142,182, -142,151,127,222,180,216,250,240, 3, 26,145,145,145,184,112,104, 99,182,193,160,238, 84, 21,147, 53,156,207,239, 87,167,174,123, -196,252,113,253, 6, 7,214,118,129,125, 76, 56, 78,140, 30,140,111, 14,124, 4,185, 35, 7,205,123,202, 49,118,185,203, 96,215, - 0,225, 75,215, 54,232,103,129,116, 81,147,213,216,203,203,107,240,157, 59,119, 28,234,215,175, 47,122,246,236,153,122,251,246, -237, 41, 42,149,234, 60,128, 80, 11, 52,139,154,172,198,115,199,143,190,253,221,143,123, 68, 52, 95,128, 85,191,158,192,180,107, -113,198, 83,209, 57,131, 80,188, 90,177, 84, 52, 26,205,197, 77,155, 54,105,104,154, 70, 70, 70, 6,210,210,210,144,146,146, 82, -248,153,149,149, 5, 14,135,131, 75,151, 46,105,115,114,114,238,152, 91,192, 91,183,110,121,197,199,199,251, 38, 38, 38, 54, 45, -152,158, 33,191,119,161,172,200,188,166,137,137,137,237, 1,220, 55,205,143,139,139,171,113,247,238, 93,215,138,244,229,114, 57, -248,124,126,177,136,150, 80, 40,132,179,179, 51, 12, 6, 3, 14, 30, 60, 8, 0, 25,229,105,240,249,130, 68,154,166,192, 16, 70, - 35, 18,137, 24, 87, 87,215, 82, 13,150, 37,154, 5,196,125,240,193, 7,234,224,224,224, 82, 35, 90,149,209, 36,132, 40,187,117, -235,134,132,132, 4,136, 68,162,194, 31,107,147,161,162,105, 26, 66,161, 16, 73, 73, 73,152, 48, 97, 2, 8, 33,202,191,251,201, - 83,180, 77, 83,129, 25,162, 0, 80, 5, 70,232,141,118, 90,230,182,129, 50, 85, 13, 18, 66, 96, 50, 92, 37,150, 23,126,151, 57, -217,219, 75,180,233, 26,159,149,149,245, 93,126,113,200,246, 18,159, 59, 44,248, 81, 40, 52, 90, 97, 97, 97,216,179,103, 15,178, -178,178, 32, 16, 8,144,153,153,137,157, 59,119,226,233,211,167, 16, 8, 4, 48, 29, 11,115,253, 91, 96, 96,224,119,215,175, 95, -127, 58,116,232, 80, 85,104,104, 40, 84, 42, 21, 66, 67, 67,209,189,123,119,245,205,155, 55, 35, 84, 42,213, 82,152, 83,117,104, -202,248, 94, 48,188,142, 70,163, 65, 72, 72, 72,169, 83, 89,219,148, 36, 34, 34,194,211,104, 52,122, 19, 66,218, 18, 66,172, 80, -144,194,161,224,255,162,211, 7, 5,203,172, 8, 33,109,141, 70, 99,157,136,136, 8, 79,214, 78,176,188,167, 92, 45, 98,182, 72, - 17,147,117,181,252,136, 22, 67,111,250,105,227, 18,171, 95,239,209,136,141,142, 64,208,233,173,217, 70, 70,223,201,194,225,112, -186,160, 72,174, 13,145, 88, 90,143,161,242,187, 51,231,164,197, 2,132, 83, 25,163, 85, 76, 19, 12,189,105,231,198,197,214,251, -131, 40, 36,196,190,194,205, 99, 91,178, 13, 6, 77,103,188, 62, 18, 82, 25,205,225,124,254, 2, 30,135,154,223,173,117, 35,126, -155, 70,117, 33, 77,137, 66, 82, 92, 2, 14,134,165,102, 68,100,106, 62,189, 73,233, 16,253, 74,243, 83,207,113,118,118,182, 46, - 60,244,158,104,111,119,231, 68,206,239, 20, 79,161, 35, 58,178, 34,241,102,225,176, 20,197,203,249, 38, 46,114,185,124,104, 80, - 80,144,149, 72, 36, 18, 7, 5, 5, 49,219,183,111, 79, 87,169, 84,167, 1,220, 54,107,223,223,196,189, 89,221, 90, 87,191,221, -242,163, 40, 79,161,132, 66,171,131,208,217,213,248,219,237,199, 3, 80,118, 2,204, 98,154, 66,161,112,255,254,253,251,123,182, -107,215,206,179, 94,189,122,116, 70, 70, 6,242,242,242, 10, 27, 87, 59, 58, 58, 34, 44, 44,140,137,140,140, 76, 16, 10,133, 7, -204, 45,103,171, 86,173, 34,105,154,126, 86, 80,141,246, 12, 37,122, 23, 22, 89,213, 59, 49, 49,177,153,171,171,235, 85, 0,146, - 34,189, 14,139,106,154,210, 59,124, 5,128,166, 40,234,126,104,104,104, 94,143, 30, 61, 32, 22,139,161, 80, 40,224,225,225, 1, -131,193,128,211,167, 79, 35, 56, 56, 88,193, 48,204,213, 82,204,107,177,114,170,213, 42, 15, 0,180, 74,169,108, 56,106,212,168, -246, 51,103,206, 44,214, 37,221,201,201, 9,118,118,118, 22,105, 2, 64, 70, 70,134,223,217,179,103, 63, 15, 13, 13,253,162,103, -207,158,214, 95,125,245,149,208,203,203, 11, 70,163,145,174,172,102,102,102,166,117, 72, 72,200,154, 54,109,218, 76,238,209,163, - 7,247,219,111,191,133,181,181, 53,140, 70, 35,196, 98, 49,114,114,114,176,116,233, 82,220,184,113,195, 64, 8,217,146,157,157, - 61,203,194,107, 9, 85,189, 55,203,138, 0,149,149,146,161,140,245,255,242,114,150,104,211,133,130, 20, 14,115,202,200, 96, 15, -115,175,121,147,209,226,112, 56,136,138,138,194,246,237,219,223,200,163,101, 74,255, 80,134,118,105,251, 78,174, 92,185, 98,164, - 40,170,101, 80, 80,208,156,145, 35, 71,126,170, 80, 40,220,165, 82,105,130, 94,175,223,173, 82,169,150, 35,191, 61, 42,223,146, -103,136, 66,161,136, 46,173,215, 97,201,117, 0,155,114, 53, 75,164,119, 40,150,194,161,196, 54,197, 82, 63,148,146,222,225, 47, - 63,239,172,230, 63, 82,243,125, 55, 91,101, 39, 44,125,131,198,227,121, 60,149,190,254,245, 8,170, 42, 38,235,205,104,137, 90, - 25,177,112,127, 76, 35,173, 70, 13, 69,118,242,115, 68, 29, 76,169,210,110, 21,148,243, 90, 4,133,168,200, 87,184,119,114, 75, -126, 57, 95, 31,169,116, 57, 41, 96,222, 15,103,142,240, 41,107, 59, 60,252,124, 12, 18,178, 20, 56,243, 58,243, 16, 81,106, 62, -251, 21,200,196, 13,128, 54,104,174,239,252, 58,105,107,219,254,214,131, 29,170,241,176,238,203,221, 16,205,181,231, 55,239,220, -206,146, 49, 16,147, 68, 34,209,245,239,191,255,190, 75,219,182,109,133,131, 6, 13, 42,173,129,188,165,196,221,127,241,234,135, - 83,219,214,126,105, 95,191, 5, 54, 47,152,109,220,127,251,113,201, 94,136,229,226,235,235,107,188,117,235,214,204, 9, 19, 38, -172,235,210,165,139, 91,223,190,125, 5, 30, 30, 30, 16, 10,133,120,245,234, 21,174, 95,191,174,125,253,250,117,130, 82,169,156, -217,160, 65, 3, 75,114,156,101, 46, 92,184,240,187,130,239,160, 10,170, 11,155,162,160,119,161,105,165,130,164,165, 77, 1, 72, - 22, 47, 94, 60, 18, 0,202,232,246,189, 16,192, 54, 0, 92, 66, 72,210,222,189,123, 91, 30, 59,118,172,229,140, 25, 51,248, 61, -123,246,196,157, 59,119,112,225,194, 5,157, 78,167,187, 93, 96, 92,205, 29, 42,135, 1, 16, 98, 48, 24, 30,175, 90,181,170, 37, -135,195, 89,104, 90,240,244,233, 83,236,218,181,171, 50,154, 6, 0,107,146,147,147,127,216,187,119,239,194,139, 23, 47,126, 50, -106,212, 40, 43,189, 94,143,176,176, 48,252,252,243,207,149,210,204,206,206,254,220,193,193, 97,254,233,211,167,119,159, 63,127, -254,195, 17, 35, 70,208,211,166, 77,195,166, 77,155,240,191,255,253,143, 49, 26,141,199,120, 60,222,168,180,180, 52,197,187,120, -234, 20, 84,195, 37, 88, 56,214, 97,133,186, 85,169, 26, 52,147,196,170, 10,152,246,163, 67,135, 14,133, 81, 70, 83, 20,174,232, - 58, 20, 69, 89, 92,117, 8,192,134, 16,194, 0,216,130,252,241, 69,139,102,133,231,224,207,204,241,230, 42,250, 39,106,108,158, - 66,131,176,242, 7,149,182, 1, 8,252, 43, 80,203, 90,184,112,225,250, 69,139, 22,173, 47,153,194,161,232, 74, 37, 83, 63, 44, - 89,178, 4,108,122, 7,150,127, 43,165, 27,173,144, 29,122,125,205, 1, 95,125,255,237,236, 69, 6,189, 54,155, 64, 55, 16,175, -142,134, 86,245,203, 8, 67,230, 94,218,183,120, 19, 8, 50,137,209, 48,167,202,165,255,139,202, 73, 89,219, 33,119,233, 36,252, -239, 73, 2, 73, 82,232, 63,250, 85,167, 43, 22, 13,202,111,147,197, 12,185,172,206, 60,104,235,198,251,237,243, 78,246,212,169, -140,145, 22,127, 79, 74, 74,202,241,245,235,215,211,107,215,174,109,175, 84, 42, 75, 54,144,175, 44,179,251, 76,157,203,105, 94, -199,115,234,189,151,209,253, 96, 70,117, 97, 73, 90,181,106,149, 24, 30, 30, 62,236,252,249,243, 67,175, 93,187,214, 69,161, 80, -120, 82, 20, 5,137, 68, 18,173,209,104, 46, 10,133,194,253, 22,154, 44, 0,192,162, 69,139,200,146, 37, 75,168,240,240,112,194, -225,112,254, 0, 16,201,225,112,162,138, 54,130, 47, 58,223,180,205,226,197,139,205,249, 65,188,150,151,151, 23,188,116,233,210, -118, 75,151, 46,109, 88, 16, 21,186,134, 63,219,124, 89,138, 30,192, 53, 62, 95,144, 64, 81,148, 59, 95, 32, 84,220,186,117,235, - 98, 21, 53,149, 58,157,110, 78,108,108,236,186,117,235,214, 45,151, 74,165,205,158, 62,125,250, 71, 85, 52, 11, 76,212, 0, 59, - 59, 59,183, 61,123,246, 28,222,185,115,103, 11, 46,151,123,135,162,168, 65,217,217,217,239,116, 80,233,130, 1,162,151, 88, 48, -214,161, 89,186,111, 59, 73,233, 95, 97,220,140, 70, 99,222,252,249,243, 83, 74, 26,175,146,209, 43,211,255, 5,169, 92,204, 57, -166,150,244,162,172,192,184, 80,121, 0,144, 63,118, 97,254,176, 58,230, 14, 42, 13, 64, 85,209,125, 78,211,244, 49, 0,207,105, -154,126, 89,178,163, 75,209,101, 75,150, 44,169,232, 62,103, 97,121,175, 49,227,201,182,152, 6, 22, 87,182, 37,237,223, 24,174, -124, 59,229, 28,198,231, 47,161,129, 47, 1, 80, 4, 88,247,171, 78,247,117,121, 27,186,180,194,114, 66, 97, 70,193,193,252, 54, -233, 38,150, 85, 98,223,171,193,140,241, 7, 45,212,244, 65,249, 3,202,190,161, 57,112,224, 64, 78, 25, 63,230,197, 6,149, 46, -139, 35, 71, 10,179,248,151, 85,206,162,215,155,252,238,221,187,110,129,129,129,137, 40,222,232,191,180,249,196,194,125,231, 0, - 48,190,229,227,249, 94,104,214,170, 85, 75,240,234,213, 43,237, 63,235,222,100, 53,255,145,154, 54,126,213, 65, 97, 28,138,230, - 14, 42, 55,162, 85,196,160, 17,242, 51,178,194, 98,203, 40,167,233, 62,183,137,136,136,240,172, 93,187,118, 52,128,172, 18,229, - 40,109, 25, 97,207,209,127, 94,179, 52,198,163,248, 80,116,239, 21,165,245, 14,199, 95,112, 34, 88, 77, 86,147,213,100, 53, 89, - 77, 86,147,213,100, 53, 43,107,180,222, 91, 8, 33,160,193,194,194,194,194,194,194,194,194,242,151, 64,149,227, 74, 45, 9, 9, - 86,198,217, 94,100, 53, 89, 77, 86,147,213,100, 53, 89, 77, 86,243, 63,167, 89,145,118,209,237,223,215,170,195,241, 0,118,176, - 85,135,172, 38,171,201,106,178,154,172, 38,171,201,106,254, 83, 52,203, 50, 44,239, 45,132, 16, 51,199, 58,100, 97, 97, 97, 97, - 97, 97,249, 71,208,165, 46, 92,185, 70,208,103, 95,153,213,137,170, 66,122,212, 66, 53, 0,120, 91,122,255, 81, 92, 1,244, 42, -242,255, 41, 20,244,140,103,141,214,251, 75, 29, 0, 95, 1,176, 46, 50,239, 30,128, 21, 37,214,219, 7,160,232,128,132, 10,228, -143, 19,248,210,146, 47,163,105,122, 69,187,118,237, 62,187,113,227,198, 90,131,193,176,180, 18,229,245,116,117,117,253,142,162, -168, 38, 0,120, 20, 69,189, 74, 78, 78, 94, 97, 48, 24,170,210,107,165,166,139,139,203, 74, 0,141,104,154,230, 81, 20, 21,145, -156,156,188,204, 96, 48, 92,169,130,166,220,217,217,185, 53, 33,196, 5, 0,135,199,227,165,199,199,199,223, 69, 37,115, 43, 13, - 92, 28,198,207, 81, 24,120, 0, 96, 37,229,234,143, 44,246,211,153, 59,143,189,196, 89, 88,254,219,144,252,158,201,197,232, 94, - 11,203,137, 1,179,140, 0,213,205, 11, 27,207, 69, 98, 86, 89,219, 83,165,244,106, 46,169,217,189, 22,150, 27, 73,190, 70,183, - 90, 88,115,238, 21,202,237,105,111,142,166,137, 29, 0, 61,222,140, 81, 10, 40,243,122, 95,255,211,233,133,226, 85,156,133, 85, -158,229, 26,173, 33,117,225,106,228,130,123, 36, 12,166,110,188,114, 0, 13, 11,126,228, 95, 34, 63, 87, 81,110, 21, 11,247,190, -104,254,211, 88, 72, 8, 25, 86,236, 98, 45, 37, 15, 81,167, 78,157,250,158, 63,127, 94, 98, 26,239,142, 97, 24,136,197, 98, 3, -128,209, 22,124,151,211,144, 33, 67,230,254,244,211, 79, 24, 60,120,240,252,147, 39, 79,174, 7,144,103,238,198,182,182,182, 3, -109,108,108, 54,253,248,227,143,142, 45, 90,180,164, 4, 2, 1, 94,189,138,112,159, 48, 97, 66,189,240,240,240, 99, 41, 41, 41, -159, 90,186,243,118,118,118,195,109,108,108,214,109,223,190,221,161, 77,155, 54,160, 40, 10,193,193,193,238,159,127,254,121,195, -152,152,152, 3,201,201,201,147, 45,213,180,183,183,175,107,109,109,221,113,243,230,205,226,214,173, 91, 67, 36, 18, 33, 52, 52, - 84, 54,113,226, 68,151,248,248,248,176,228,228,228,171,150,154,172, 71,193, 39, 62, 52,232, 52,171, 0,128,203, 23,206,110,177, -238,246,137, 71,151, 79,244,169,104,222,192,197, 97,191,179,102,139,133,133,165, 40,195,221,224, 66, 8,190, 60,255,243, 2, 26, - 0,186,125,242,205,180,225,110, 88,251,107, 66,217, 99,216, 90,168, 55,107, 84, 53,108,218, 19,143,228,170,148,115, 7, 64,127, -206,229, 78,107, 30, 24,232, 48,229,230,205, 8, 29,176,251, 63,114,138, 74,173,230, 44,211,104, 13,240,195, 82, 67,126,196,132, -234, 81, 27, 7, 46, 68,114,174,119,234,212,169,246,216,177, 99,169,198,141, 27, 35, 56, 56,184,238,129, 3, 7,122,157, 58,117, - 42,194,104, 52, 6, 3,120, 2,243,179, 90,243, 0, 4,112, 56,156, 38,255,112,205,127, 50,210, 2,115,149,140, 63, 19,157,190, -145,240,244,210,165, 75,199,185, 92,174, 41,162,213, 92,161, 80, 56,151,136,130,153, 67, 13,189, 94,143,103,207,158,129,166,105, - 30, 0, 47,188, 57,164, 70, 89,184, 75, 36,146,173,183,239, 5,219, 83, 92, 49, 50,213, 0,212, 58, 8,100,206,248,105,215, 94, -187,153,211, 39, 15,184,114,229,202,245,220,220,220, 95, 44, 40,143,151, 84, 42, 93,255,240,225, 67,123,137, 68, 2,134, 97,144, -155,155, 11, 23, 23, 23,252,248,227,143, 54, 51,103,206, 28,150,147,147,115, 69,173, 86,255,207, 18,115,110,109,109,221,241,241, -227,199, 98,211,128,210, 90,173, 22,238,238,238,216,183,111,159,112,218,180,105,126, 89, 89, 89,113, 90,173,246,181,185,130, 57, - 10, 3,207,160,211,172,218,179,101,113,117, 0, 24, 53,121,241, 42, 65,174,213,105,115,230,229, 40, 12,167, 0,176, 70,139,229, -239,166,137,131,131,195,145,180,180,180,171, 0, 62,197,219,137, 52,212, 21,137, 68, 13, 24,134,113,161,105, 26, 28, 14, 39, 73, -161, 80, 60, 4,240,162,178,130,246,181, 58,244,129, 80, 50, 6,132,105, 72, 3,160,104, 58,212,168, 83,238, 74,127,113,229, 68, -149, 52, 5,226, 79, 0,210,144, 6, 24,138,166, 31, 50, 6,229,143,105,207,174,156,249,167,156,156, 59,217,240,174,229, 98,254, -192,152,111, 67,239,227,154,112,165, 25,208,251,162,204,175, 86,156, 10,244,156, 62,125,186,203,228,207, 62,163,198,140, 30, 93, -231,234,141, 27, 84,123, 75, 70, 43,120, 63, 41,179,193,126,169, 70,107,160, 31,108, 9, 48,231,192,166,175,104, 46,135, 67, 13, -157,190, 98,216,206, 45,107,232,174,125, 6, 21, 86,159,180,109,219, 22,109,219,182,165, 86,173, 90, 85,231,143, 63,254,168,179, -111,223, 62,195,237,219,183, 31, 2, 56, 88,214,151,117,175, 5, 21, 3,136,248, 60,174, 98,232,130, 95,182, 7, 6, 6, 66, 40, - 20,162, 42,154, 0,208,181, 54,253,154,103, 87,243,225,208,169, 11,163, 91,180,104, 69,222,134,230,123,196, 61,160,112, 80,107, -219,234,213,171,183, 54, 24, 12, 34, 0,224,114,185,234,216,216,216,169,200, 31, 27, 16, 0,142, 49, 12,211,215, 2,109, 26,192, -162,190,125,251,206,159, 50,101, 10, 60, 60, 60, 48,109,218, 52,232,245,250,224, 51,103,206, 44, 4,176, 18, 21,220, 60, 78, 78, - 78, 11,183,110,221,106,199, 21, 72,209,120, 78, 36, 18,179, 12, 0, 0,153, 16, 56, 62,137, 96,218,180,105, 86, 65, 65, 65,203, - 44, 49, 90, 78, 78, 78, 75,127,252,241, 71, 59,137, 68, 2, 66, 72,225, 88,140,121,121,121,200,203,203,195,228,201,147,173,194, -194,194,190,179,196,104, 57, 59, 59,183,222,188,121,179, 88, 36, 18, 33, 47, 47,143,175,211,233,168,220,220, 92, 40,149, 74,162, -213,106,117, 83,167, 78, 21, 62,121,242,164, 67, 98, 98,226,107,176,252, 83,224, 0,248,136,199,227,245,175, 93,187,118,211,151, - 47, 95, 62, 48, 24, 12, 71, 1, 28,125, 11, 47, 83,157,221,220,220,150, 39, 36, 36,108, 6,176,247,191,114, 64,157,157,157,143, -222,186,117,171,250,214,173, 91, 71,175, 93,187,246, 52,128,255, 85, 65,142,207,231,243, 7,180,111,223,190,250,168, 81,163, 4, -206,206,206,208,104, 52,136,140,140,180, 58,116,232,144,103,104,104,104, 92,193,136, 24,102,191, 80,216,215,109, 37, 3,215,234, - 64,203, 86,173,219, 12, 30,240,145,220,217,222, 26, 42,173, 17, 47,163, 19, 61,206,158, 62,222, 62,156, 47,190,165,211,101,127, -156,254,226, 86,158,165,154, 29, 59,118,110,211,165,115,103,185,181,141, 53,178, 21, 58,188,138,138,247,188,124,225, 68, 91, 46, - 87,124,141,161,244, 35, 82, 30, 95, 80,190,203,115, 51, 13,224, 42, 68,246, 13, 26,182,106, 28,212,109,236,178,166,132, 16,208, - 4, 27, 75, 70,179,166, 1,220,141,249,195,126, 89,164, 7, 66, 8, 69, 97, 77,209,104, 86,247, 90, 88, 78, 8,102,129, 6,213, -189,130,106, 74, 19,221, 0,161,141,157, 93,224,196,241,227,169,220,156, 28,132,134,134, 42, 75,154,172,245,213,192,191, 70,163, -198,177,216,202,155,237,127,104, 52,171,212,170, 67,179,243,104, 73, 36,146, 82,231, 91, 91, 91,163, 99,199,142, 88,177, 98, 5, - 23, 64,147, 18,139,139, 15,178, 10, 8, 79,110,155, 7,107,169,144,246,240,240,144, 91, 89, 89, 85, 89, 19, 0, 64, 24,175, 86, - 30,228,131,251,191,124, 53,250,226,190,117, 1,138,220, 44, 94,201, 85,100, 50, 25,188,189,189, 49,127,254,124,243, 52,171,206, -223,170,233,226,226,226,211,182,109,219, 38,151,174, 94,181, 73, 72, 72, 16, 38, 36, 36, 8,207, 95,186,100,211,178,101,203, 38, - 46, 46, 46, 62,133,135,234,205,174,166,229,149,243,155, 45, 91,182, 44, 60,118,236, 24,221,182,109, 91,216,218,218,162, 99,199, -142, 56,125,250, 52,119,237,218,181,223, 2,152, 95, 81, 57,105,154,110,211,182,109, 91, 10,132, 32, 41,219,128,187, 43,124, 16, -186,198, 23,185,106,130,140,236, 28,168, 84,106, 72, 36, 18, 17,242,171,123,205,221,247, 86, 45, 91,182,164, 0, 20,154,171,220, -220,252, 41, 47, 79, 1,173, 86, 7,161, 80, 40, 7, 32, 50, 87,147, 16,226,210,186,117,107, 0,128, 78,167, 43,124,195,203,202, -202,162,178,179,179,161,213,106,193,227,241,248,168,184, 93, 99,161,166,149,148,171,231,242,133,179, 71, 77, 94, 28, 59,106,242, -226, 88, 46, 95, 56, 91, 43,207, 49,154, 51,207, 74,202,213,191,227,235,211,145,166,233,159,107,213,170, 21, 70,211,244, 30, 0, - 46, 85,212,108, 6,224, 91,177, 88,124,209,215,215, 55, 86, 34,145, 92, 42, 48,234, 45, 43,169, 41,144, 72, 36,151,190,253,246, -219,195, 15, 30, 60, 24,252,199, 31,127,120, 61,122,244,104,192,170, 85,171, 14,200,100,178,235, 40,222, 46,209,226,123,211,203, -203,107,231,221,187,119,155,181,106,213,234, 39, 0,194,183,116,191,115, 0, 52,130, 89, 35,114,188,147,243,238,214,184,113,227, -234, 34,145, 8, 93,186,116, 1,128, 14, 85,209,228,243,249, 3,230,207,159, 95,107,193,130, 5,130,196,196, 68, 92,186,116, 9, -247,238,221,131,193, 96,192,164, 73,147,132,163, 70,141,170, 41,151,203, 7, 88, 84, 78,174,213,129,233,159,207,232,241,229,180, -113,242,135, 49, 58,236,186, 24,131,223,111, 39, 34, 69, 41, 64,159, 1,163,172,187,247, 27,210, 93, 32,180, 62, 96,169,230,220, - 57,115,122,140,255,100,152,252,105, 34,131,227,119,146,112,231, 89, 54, 12, 60, 27,244, 28,240,169,109,195,214, 61,122,113,193, -219,253,174,207,209,143, 64,139,233,211,167, 59,206, 94,243,235, 77,183,102, 31,109, 76,205, 68,219,162,198,167, 46, 96, 99, 39, -149,126,244,172,125,251,113,226,252,241, 98,203,213, 44,166,215,164,223,166,148, 76,180, 43,218, 62,171,157, 29,234, 20, 84, 43, -114,206,255,188,128, 38, 20,166, 13,119, 43,246, 28, 40,181,156, 87,128,193,211,103,204,224, 89,219,218, 98,203,150, 45,208, 40, - 20,197,218,204,118,174,142, 30, 23, 37,220,184,154,190,238, 97, 29, 61,169,235,255,194,247,149,241,101, 70,180, 78,158, 60, 73, -122,247,238, 77, 1,192,145, 48,100, 14,240,195,119, 67,166,124, 59,159,162, 41, 82, 35,160,213,211,106,181,252, 21,246,246,246, - 80, 42,149,208,104, 52,224,243,249, 80,171,213,136,137,137,193,157, 59,119, 96,107,107,107, 81, 73,114,114,114, 32,147,201, 32, -147,201,222,138,230,188,209, 93,132,175, 98, 83,133,231,238, 92,105,255,253,103,255,107, 81,171, 81,135, 71,157,135, 76,123,108, -229,232,166,126,244,232, 17,110,221,186,133,204,204, 76, 4, 6, 6,254, 91, 78,230,189,130, 54, 89,247, 0,216,214,174, 93,219, -253,220,197,107,182,121,106,198, 42, 42, 89,207, 99, 24, 6, 18,137,171,225,224,145,227,217,131, 7,244,161,146,146,146, 82, 0, -220, 43, 48,183, 21,141,169, 40, 2,224, 51,112,224,192,185,159,125,246, 25, 34, 34, 34, 48,110,220, 56,213,189,123,247,210, 91, -181,106,101,255,227,143, 63,138,103,206,156,137,171, 87,175, 46, 58,121,242,228,111, 0, 34, 1,148, 58, 86, 27, 33,132,207,231, -243, 97, 40,176, 13, 58, 35, 83,232,239,115,114,114, 64, 84,153,224,243,249, 28, 0,142, 48,179, 29, 29,195, 48,124, 30,143, 87, -104,178, 98,146,115, 16,147,162, 68, 78,158, 22, 42,149, 1, 90, 21, 1, 71, 98,207, 5,162,156, 1, 68,153, 27, 29, 17,137, 68, - 48, 24, 12,200,205,205, 47,134, 41, 82,166,213,106,145,157,157, 13, 14,135, 35, 3, 96, 5, 32,195, 28,193,130, 70,238,191, 23, - 84, 3,226,254,175,125, 29, 94,158,154, 87,108,158,149,148,171, 63, 50,211,143, 99,239,222,240, 70,163,193,187,125, 11,231,189, -219,246, 89, 66, 71, 71,199,203,135, 15, 31,246,171, 83,167, 14, 34, 35, 35,125, 7, 13, 26, 20,152,152,152,216, 8,150,143,201, - 40,161,105,250,187, 81,163, 70,125, 54,116,232, 80,170,110,221,186,224,114,185, 48, 24, 12,238, 17, 17, 17, 29, 15, 29, 58, 52, -103,231,206,157, 63, 26,141,198, 47, 96,126,187, 63, 90, 32, 16, 28,220,190,125,123,187,192,192, 64,236,217,179, 7,247,238,221, - 99,154, 53,107, 70,143, 28, 57, 18,158,158,158,129, 35, 71,142,252, 93,163,209,244,172,100,100,203,179,101,203,150,213, 57, 28, - 14, 90,181,106,197,191,117,235, 86, 99, 0,183,170,120, 76,101,238,238,238, 87, 59,116,232,208,232,226,197,139, 33, 73, 73, 73, - 29, 44,216, 95, 0,232,231,230,230,182,202,218,218,218,214,130,103,172, 50, 62, 62,126, 22,128, 35,102,110,210,162, 73,147, 38, -136,142,142,134,143,143, 15,248,124,126, 75,157, 78, 55, 1, 64, 15, 0, 95, 3, 8,179,160,188,117, 59,119,238, 92,189, 67,135, - 14,212,145, 35, 71, 10,219,135,210, 52, 13,131,193, 0, 62,159,143, 22, 45, 90,208,193,193,193,213,238,223,191, 95, 23,102, 84, - 35,218,215,234,208,167, 85,155,246,109,218, 5, 54,160,215, 30,121, 9, 35, 99, 4,135, 50,128, 75, 49, 96,244, 66, 8,249, 28, -212, 13,104,202,121,246,228, 97,160, 86,163,235,147,254,226,226, 9,115, 52,123,116,235,218,214,207,167, 46,253,253,239,175,144, - 21, 31,102,140, 15,191,150, 70,115,104,248, 53,233,228, 80,215,191, 17,167, 81, 96, 7, 94, 66,228,147,142,106,117,187, 46,153, - 17,215, 46,190,139, 27,114, 9,192,113,175,230,240, 81,239,174, 29,248,137, 9, 9,138, 67, 71, 78, 60, 86,234,113, 7, 0,174, - 2, 84, 79,160, 65,253,230,205,219,255,184,114,165,189,171,171, 43,111,196,208,161,134, 29, 33, 33, 33, 40,163,234,119, 9,192, -113,112,113,233, 50,113,226, 68, 78, 98, 66, 2, 57,116,244,212, 35,147, 30,242,223, 82,234, 55,112,247,237, 13,197, 51,139,170, - 41,251, 0, 2,103, 23, 23,191, 9, 19, 38, 32, 41, 33, 1,123,246,238,205, 83, 3,183, 77, 81,172,227, 28,108,246,175,229, 50, -102,246,167,125,169,234,174, 14,152,184,104, 71,203,142,186,148, 90, 72,252,243,252, 23,245, 34,239,177,201, 26, 95,170,209, 42, -201,255,194,176, 80,206,135,215,161, 67,251,233,212, 92,157, 34, 34, 34, 2, 14, 14, 14,112,117,117,133,181,181, 53,158, 62,125, -138, 75,151, 46,225,249,243,231, 96, 24, 6, 13, 27, 54,180,168, 52,105,105,105,120,248,240, 33,108,109,109,223,154,102,173,234, -142,152, 82,221,145,159,156,158,195,191,120,239,121,224,142,121, 3,252,105,223, 1, 59,139, 14, 18,171,213,106,241, 47,161,176, -119, 97,245,234,213, 91,239,218,181,139,175, 49, 64, 94,119,194,237,213, 10,181, 81, 10, 0, 82, 17, 71, 17,188,202,251,139,111, -190,249, 70,241,201, 39,159,248,198,198,198,174, 48, 35,214,191,188,115,231,206, 95, 18, 66,120,211,167, 79, 7, 0,140, 26, 53, - 42,231,206,157, 59,117, 1,164, 92,186,116,201,109,236,216,177, 47, 46, 95,190, 44,153, 49, 99, 6,199, 96, 48, 60,229,114,185, -228,228,201,147, 75, 1, 44,126,227, 23,145,166,131, 66, 66, 66,106,184,121,122,195,211,158, 70,219,249,207,243, 31,112, 18, 6, -113, 81,175, 16,254,232, 30, 92, 92, 92,172, 93, 93, 93,195,226,226,226,116,241,241,241,115, 20, 10,197,214, 10,202, 24, 26, 28, - 28,236,234,233,233,137,188,188, 60,196,165, 42, 49,237,168, 4, 57,170,252, 32, 6, 15, 42, 52,170,238, 45, 23,211,218,123, 41, - 41, 41, 58,173, 86,187, 32, 59, 59,123, 87,121,154, 60, 30, 47,253,209,163, 71, 50, 15, 15, 15,168,213,106,146,145,145, 65, 41, - 20, 10,228,230,230, 82,167, 78,157,250, 48, 49, 49,177,153,151,151, 23,229,238,238,190, 52, 49, 49, 81, 21, 31, 31, 63,206,156, -170,201, 2,195,100,228,114,185,107,199,143, 31, 63,248,183,223,126, 11, 58,178,216,175, 95,145,234, 18,235,128,128,128,115, 13, - 26,248,187,237, 93, 83,127, 35,128,213,255,128,107,107,204, 87, 95,125,229,103,103,103,135,137, 19, 39, 98,201,146, 37, 88,184, -112, 97,157,137, 19, 39,142, 7,176,222, 2, 29,177,139,139,203,253,239,191,255,222,183,117,235,214, 56,125,250, 52,246,239,223, -143,215,175, 95, 27,188,188,188,184,129,129,129, 88,180,104, 17,186,119,239, 62,110,234,212,169,237, 19, 18, 18, 26,155,105, 62, - 62, 89,180,104, 81,191, 54,109,218, 96,244,232,209,154, 43, 87,174, 12, 6,112,254,194,133, 11,157,174, 94,189,122,228,215, 95, -127, 21,127,251,237,183, 93,102,206,156, 57, 17,192,166, 74,236,255,135,237,218,229,143,161,220,166, 77, 27,172, 90,181,170,123, - 21,141,150,192,222,222,254,212,158, 61,123, 26,121,123,123, 99,196,136, 17,141, 7, 15, 30,124, 42, 51, 51,179, 43, 0,179, 30, - 72,213,170, 85,251,238,216,177, 99,181,203,170, 89, 40, 13,141, 70, 99,247,209, 71, 31,173,140,138,138,178,200,104,237,219,183, - 15,179,102,205, 66,195,134, 13, 27,180,104,209, 98,219,132, 9, 19, 48,112,224,192,206, 79,159, 62,117, 70,126,175,229, 10, 17, -137, 68, 13, 62,254,248, 99,193,221,187,119, 1, 0, 1, 1, 1,104,212,168, 17,162,163,163, 17, 20, 20, 4,141, 70, 3,103,103, -103,244,239,223, 95, 20, 21, 21,213, 32, 45, 45,173, 66,163, 69, 11, 37, 99,250,245,238, 41, 63,126, 39, 17, 70,198,128,166,181, -173, 16,232,235,132,103,113, 57, 8, 14,139,131, 81,203,135,149,157, 61, 90,182,239,102,151, 20,255,122, 76, 58, 80,113,123, 45, -161,100, 76,255,126,189,100,199,111, 39, 32, 43, 33,156,188,188,247,219, 37,189, 90, 49, 14, 0,130,254, 56,176,205,197, 94,220, -181,110,147,166,156, 14, 93,251,218, 30,221,159, 52, 38,243,239, 25,219,239, 13,174, 86,199,118, 79, 94,218,168,217,195,218, 18, -158,173,251, 61,185, 94,191,217,180,172, 59,208,109,206, 87, 95,181,248,116,252,120, 17,195, 48,248,245,151, 95,114, 30,134,132, - 60, 27, 15, 48, 19,202,208,219, 12,120, 14,238,215, 79, 40,183,178,194,231,211,166, 65,174,215, 95, 46, 60, 36, 64,231,207,191, -252,178,245,228,201,147,197,219,150,126, 22,212,125,236,178, 38, 12, 33,148,169,154,114, 95,249,161,184,102, 99,251,245,131,220, -202, 10,211,167, 79, 7,165,211,157, 43, 52, 80, 92, 92,254,228,195,182,129,195,250,180, 1, 5, 10,251, 79,222,192,203,232,212, - 71,151, 19,241,234,125,117, 85, 37, 40,179,141, 86,185, 85,135,185, 58, 36,119,238, 53, 32,177,110,221,186,185,117,234,212,201, - 77, 79, 79,199,227,199,143,145,153,153,137, 77,155, 54, 33, 60, 60, 28, 12,195, 84,218,192, 48, 12,131,183,173, 9, 0,206,246, - 86, 24,209,179, 57, 87,163, 86,136, 82, 83, 83,139, 85, 31,253,139,140, 86, 33, 6,131, 65,228,229,229, 5, 26,160,178,149,122, - 89,210,190,118, 84,210,190,118, 84,182, 82, 47,211,106,181,180, 76, 38,131, 70,163, 17,153, 33,197,251,224,131, 15,190,252,237, -183,223,120,203,151, 47, 71,189,122,245,160,211,233,112,231,206,157, 56, 0, 41, 5,235, 36, 92,187,118, 45,193,100,132, 87,172, - 88,129,163, 71,143, 82, 93,186,116,153, 83,218,245,148,152,152,248,221,132, 9, 19, 50,148,185, 25,216, 62, 68,133, 35, 35, 82, -241,115,191,215, 24,106,127, 24, 25,201, 49,216,177, 99, 7, 46, 92,184, 72,157, 63,127,129,127,229,202, 21,105,175, 94,189, 54, - 86,171, 86,237,100,121,133, 76, 72, 72, 88, 62,121,242,228,172,220,220, 92,228,230,230, 66,165, 82, 35, 67, 1, 60, 90,231,135, - 71,235,252,160,102,196,216,178,121, 43,253,232,209, 35,135,215,175, 95,187,245,233,211,103,157,171,171,235,206,242, 52,227,227, -227,239, 78,153, 50, 69,157,147,147, 3,173, 86,171, 51, 26,141, 90,149, 74,165, 63,112,224,192, 12,123,123,251,150,167, 79,159, -230, 93,184,112,145,123,229,202, 85,254,165, 75,151,172, 59,118,236,120,208,217,217,121,183, 57,145, 50, 14,135,179, 97,239,222, -189, 99,182,108,217,226, 28, 24, 24,232, 95,162, 42,202,181,107,215,174, 53,126,249,229,151,106,171, 86,173,154,131,252, 14, 40, -239, 20, 7, 7,135,169,253,250,245,195,150, 45, 91,112,226,196,137,153, 27, 55,110,196, 7, 31,124, 0, 55, 55,183, 41, 48,191, -218, 11, 0, 86,175, 95,191,222,215,215,215, 23,163, 70,141,210,142, 27, 55,238,139, 93,187,118,121, 93,191,126,157,191,123,247, -238, 26, 19, 39, 78,156, 62,108,216, 48,117,205,154, 53,177,105,211,166,218, 52, 77,111, 48,235,254,118,118,158, 49,116,232, 80, -172, 89,179, 6, 87,174, 92, 25,128,252, 31, 84, 45,128, 51, 55,111,222,236,243,237,183,223, 98,192,128, 1,112,119,119,159, 94, -153,200,147,159,159,223,130, 30, 61,122,224,250,245,235,104,220,184, 49, 90,182,108, 57, 19,128, 67, 37, 15, 39, 45,147,201, 14, -238,218,181,171,109,141, 26, 53,176,108,217, 50,212,170, 85, 11, 59,119,238,108, 43,149, 74, 15,194,204,230, 27,214,214,214, 50, -137, 68,130, 57,115,230,144, 1, 3, 6,100, 84, 52,205,156, 57,147, 8,133, 66,216,218,218, 90,155,107,138, 69, 34, 81,171,122, -245,234,225,206,157, 59,184,112,225, 2,230,207,159,143, 25, 51,102, 32, 53, 53, 21, 31,127,252,177, 4,192, 64, 11,246,219,201, -209,209, 17, 57, 57,249,227,194,215,171, 87, 15, 15, 30, 60, 64,106,106, 42,220,221,221,145,148,148, 4,123,123,123,120,123,123, -131, 97, 24, 39,243, 36, 73, 61, 7, 59,107,164,100,106,192,133, 1, 77,234, 58,224,242,227,116,196,164,106,225,100,111,131,164, -148, 84, 84,179, 23,161,122,117, 15, 16,194,212, 51,203, 1,115,232, 38, 66,145, 24, 25,185, 58,196,135, 93, 73,215, 25, 53, 19, -178, 34,111,198,102, 69,222,140,213,105,212, 19,130,110, 92, 72,175,225, 44, 70,245,234,213, 65, 17,166,249,187,184, 31, 7,121, -160,186, 84,204, 29,117,225,231, 5,212,201, 31,231, 81,154,244,152,102, 61,156,243, 35,203,142,128,215,160,143, 63,110,245,197, - 23, 95,136,146,147,147,153, 97, 67,134,100, 44, 95,188,248,226,217, 10, 94, 12,242,128, 58, 93,187,118, 5, 13,224,236,249,243, -138, 36, 32, 14, 0,156,129,234,125, 63,250,168,221, 87,115,231,138,211,210,211,153, 59, 17,121,199,195, 83, 72,127, 59, 35,188, -204,105,159,101, 4,234,155,116,207,157, 59, 71, 84, 64, 16, 0,116,168,142, 41,221, 90, 7, 4,142,236,215, 14,137, 41,153,152, -190,252,103,108, 59,116,245,156,181,158,116,250, 23,253, 20,143,175,148,209, 42,168,250,121, 99,158, 82,249,102,237, 65, 85, 13, -204, 95,161, 89, 26,255, 70,163,101, 66,175,207,175, 37,209,234, 25,104,245,140,233,173, 22, 42,149,202,108,137,115,231,206,237, -153, 54,109, 26,214,173, 91,135, 23, 47, 94,128,207,231,163, 94,189,122,174, 0,100,166,103,126,147, 38, 77,156,104,154,198,179, -103,207,176,118,237, 90,124,242,201, 39,228,214,173, 91, 59, 81,122,190,148, 7, 25, 25, 25,155, 39,140,251, 36, 43, 51, 57, 6, -122, 85, 38, 82,226, 95, 65,163,200,194,178, 21,223, 65,169,231, 34, 41, 91,135,164,108, 29,104,161, 29,182,253,184,139,227,231, -231,215,131,195,225,244, 46,167,156,119,146,147,147,127,156, 52,105, 82, 86, 82, 82, 82,225,254,105,245, 4, 90,125,241,235, 85, - 34,145, 96,195,134, 13,214,117,235,214,237,199,229,114, 59,150,163,153, 24, 27, 27, 27, 62,105,210, 36,109,114,114, 50,178,179, -179,113,252,248,241, 62, 53,106,212,176, 93,185,122, 29,165,208,113,145,148,165, 67, 82,150, 14, 2,153, 19, 14, 30,249,141,227, -237,237, 61,140,203,229,182,172,200,100,253,250,235,175, 35,135, 12, 25, 34, 95,189,122,117,198,177, 99,199,182, 0, 40,122, 66, -158,109,216,176,225,208,193,131, 7,115,191,252,242, 75,187, 85,171, 86,205,124,199,102,171,227,144, 33, 67,124, 24,134,193,225, -195,135, 31, 1, 88,255,219,111,191,221,215,104, 52,248,248,227,143,189, 10,170,145,204,161,217,176, 97,195, 62,107,219,182, 45, - 62,255,252,115,221,197,139, 23,155, 0, 88,135,252,170, 92, 2, 32, 26,192,198,171, 87,175, 54,156, 58,117,170,166,121,243,230, - 24, 61,122,244, 39, 0,218, 86,160,219,106,232,208,161,190, 12,195,224,192,129, 3, 15, 1,156, 46,177,252,210,145, 35, 71,238, -104,181, 90, 12, 31, 62,188, 38, 0, 75, 30,228,124,161, 80,120,248,155,111,190,177,137,143,143,199,200,145, 35, 53,207,158, 61, -195,226,197,139,197,214,214,214,167,139,220, 3,102, 35, 20, 10,119,252,240,195, 15,253,234,215,175,143, 73,147, 38,105,183,110, -221, 58,237,179,207, 62,211, 54,105,210, 4, 91,182,108,233, 39, 16, 8, 44, 26, 90, 36, 33, 33, 33, 43, 44, 44,204,190,162, 41, - 46, 46,206,220,238,249, 18,153, 76,118, 59, 32, 32, 32,167, 94,189,122, 77, 13, 6, 3,158, 62,125,250,106,207,158, 61, 76,189, -122,245,176,121,243,102,172, 90,181, 10,189,123,247, 6,135,195, 49,219,104,113, 56, 28,232,116, 58, 72, 36, 18,112,185, 92,188, -122,245,202,148, 90, 6,124, 62, 31, 0, 32,149, 74, 33, 22,139, 65,211,180, 89,189,209, 40, 10, 36, 71,169, 7,143, 71,131, 75, - 51, 8,143,206,134, 78,207, 64,196,231,128,199,165, 0,194,192, 70,202,131, 72,192, 1, 77, 81,140,153,154,200, 86,232, 32,224, -211,224,241, 5, 20,109, 48,138, 11,127, 28,185, 70,177, 88, 44,160, 28,172,132, 16,241,255, 65,195, 2, 83,249, 13,203,199, 0, - 60,169,135,199,224, 53,107,215, 10,114,242,242, 48, 96,192,128,140,168,251,247,247,170,128,251,237, 43,232,164, 68,115,185,117, - 59,180,111,143,224,144, 16,228,102,102,190, 4,242, 27,199, 11,220,220,134,108,216,176, 65,160, 82,171, 49,160,127,255,172, 23, - 55,110,252, 26,155,135,147, 7,162,243,141, 88,133,231,157,207,119, 49,233,102,103,102,102, 2,249, 41, 36,156, 29,101, 43, 39, - 15,235,142, 92,165, 26,179,191,219,203,132,132, 39, 78,185, 30,135, 94,191, 37, 32,251, 95,246, 51, 60,190,196, 4,192,140,132, -165,166,232, 82, 69,102, 69,163,209,188,117, 3, 84, 85,205,210, 76, 98, 85, 53,255,137,112,185, 92,245,243,231,207, 5, 86,246, -110,140,189,156,151, 89,227,147, 27,214, 0, 96, 39,227,102,235,140,122, 38, 33, 33, 1, 66,161, 80,109,102,117,195,184, 29, 59, -118, 44, 3,224,207,229,114, 79,238,218,181,139,218,187,119,175,237,208,161, 67, 35,194,194,194,226, 3, 2, 2, 60,119,237,218, -101, 5, 0, 27, 55,110, 36, 7, 15, 30,236,142,252,148, 25,101,230,113, 73, 78, 78, 94,156,158,158,126,107,242,228,201,155, 4, - 2,129,173, 84, 42,181,191,126,253, 58,165,214, 17, 52,251, 42,186,176, 39,162,149,152,198,181,121, 86, 24, 63,126, 60, 39, 44, - 44,108, 69,124,124,252,201,114, 52,231,100,101,101, 93,127,241,226,197, 58,107,247, 70,142, 82,207,175,172, 3,231, 61, 3, 0, -120, 58,240, 64, 23, 60, 23,179,178,178,144,154,154,138,207, 62,251,204, 54, 34, 34, 98, 78,124,124,252,229,114,162, 90, 87,211, -210,210,226,158, 60,121,210,129,199,227, 9,164, 82,105,179,219,183,111, 83,106, 45,131, 6,115,162,145,145,151, 95, 78, 59, 25, - 23, 65,223, 56, 99,202,148, 41,220,151, 47, 95,126,151,152,152,216,166,212,135, 25, 77,175, 42,106,178,102,207,158, 29, 10,160, - 38,128, 98, 85,163, 70,163,145, 26, 62,124,248, 99, 0,245,190,252,242, 75, 59, 66,200,204, 57,115,230,100, 0,216,254,119, 95, - 75, 86, 86, 86, 43, 39, 76,152,128,131, 7, 15, 34, 51, 51,115, 3, 0,228,228,228,172,223,183,111,223,129,113,227,198,225,151, - 95,126, 89,153,154,154,122, 22, 21,119,213,254,224,227,143, 63,198,153, 51,103,240,199, 31,127, 44, 0,240,180,140,245, 94, 92, -191,126,125,206,177, 99,199,190, 31, 58,116, 40,126,254,249,231, 30, 0,202,107, 32,219,181,123,247,238, 56,125,250, 52,210,211, -211,183,148,182, 66, 86, 86,214,214,227,199,143,183,232,222,189, 59, 86,172, 88,209, 21,192, 37, 51,118,221,215,218,218,122,215, -247,223,127,223,172,126,253,250, 24, 54,108,152, 90,167,211,245,248,242,203, 47, 79,236,223,191, 95,190,103,207,158,166,227,199, -143,191, 91,144,243,237,142, 89,161, 44,154,254,118,237,218,181, 99, 59,116,232,128,153, 51,103, 26,206,157, 59,215, 23,192,249, -179,103,207, 70,204,158, 61,251,212,218,181,107, 57,107,214,172, 25, 59,125,250,244, 84,134, 97,222,149,185,254,102,227,198,141, - 45,186,117,235,134, 87,175, 94,225,206,157, 59,208,233,116,191,220,190,125,251, 90,157, 58,117,190,209,106,181, 39,164, 82,233, - 40,185, 92, 30,208,168, 81,163, 78, 65, 65, 65, 18,152,215, 78, 47, 57, 50, 50,210,198,218,218, 26, 6,131, 1,143, 30, 61,130, -135,135, 7,116, 58, 29, 94,191,126,141,250,245,235,131,207,231, 35, 57, 57, 25, 69,162,229, 21,152, 34,250, 81, 68, 84, 66, 77, - 59,185, 20, 48,138,240,224, 89, 28, 28, 29,108, 97,164,104, 36, 37, 37,162,145,143, 59, 40,138, 66, 86,122, 18, 40,138,122,108, -142,166,145, 48,193, 49, 9, 41,213,236,229, 66,212,111,209,205,254,246,217,212,189, 86, 53, 91,143,231,114, 40,142, 64, 40,219, - 62,118,244,104, 7,134, 33,200, 74, 79, 6,151,166,239,189,139, 19,116, 56, 6,177,237,107,137, 30,116, 27,187,172, 17, 69, 64, - 84, 58,236,249, 57, 25,153, 18,160,209,198,175,191,182,177,119,112,192,176, 97,195,152,244,248,248,139, 74, 51, 19, 43,215,172, - 83,199, 89, 38,151,227,230,205,155,224,228,183,177,197, 78,192,119,213,236,217,246, 78, 46, 46,248,100,236, 88, 38, 57, 38,230, -146, 10, 72,176,164,172, 53,107,213,226,153,116,233, 2,221, 68, 14,166,125,217,183,173, 80, 42, 22,226,219,109,191, 33, 54, 77, -113,224,118, 34,182,253, 75,227, 29, 59,202,141,104,149,213,248, 44,191, 81,181,164, 92,179, 34, 18,137, 10,163, 41, 22,188,233, -189,117,205,138,248, 43, 52,223, 33,243, 0, 28, 3, 48, 47, 54, 54, 54,124,236,216,177, 58,131, 78,147,123,107, 89,205,185, 33, - 43,106, 76,186,189,216,117,210,239,211,172,231, 42,179, 51,114, 55,110,220,168,143,141,141, 13, 47,186, 77, 5,218, 49, 0, 78, -239,222,189,123,235,225,195,135, 81,175, 94, 61, 60,125,250,212, 73,161, 80, 52,126,252,248,177,157,175,175, 47,246,238,221,139, -131, 7, 15,174, 3,112,161, 60,147,101,194, 96, 48, 92, 76, 74, 74,242,142,142,142,174,109, 99, 99,163,183,177,177, 65,201,158, -136, 57, 42, 6,233, 89,217,176,179,179,135,149,149,149,151, 25,230,252,116, 82, 82, 82, 93,198,214,167, 93,221,180, 13,217,193, -223, 86, 71,240,183,213,113,122,142, 27, 92,109, 4,200,204,204, 68,106,106, 42, 82, 83, 83, 65, 81, 20,244,122,189,159, 25,154, -175, 19, 19, 19,127,138,137,137, 57,230,236,236, 12,185, 92, 14, 2, 32, 41, 75,143,208, 53,190, 8, 93,227,139,164, 44, 61,114, -114,115, 81,163, 70, 13,200,229,242,178,170, 40,232,106,213,170,245, 28, 50,100,136, 28, 0, 10, 12, 84,103, 66,200,164, 82,166, -137, 6,131,161,181,105,221, 89,179,102,217, 1,232,254, 55, 95, 79, 28, 0,147,199,141, 27,215, 84, 36, 18, 97,243,230,205,175, - 1,252,106,122,214,111,221,186,245, 25, 0, 76,155, 54, 45, 0,192, 76,148,145, 9,186, 48, 52,196,231, 55,241,243,243,195,237, -219,183, 1,224,183, 10,190,251,200,173, 91,183, 80,167, 78, 29,136, 68,162,102, 21,172,235, 85,189,122,117, 60,123,246, 12, 0, - 30,148,177,206,131,103,207,158,229, 87,247, 80,148,151, 25,251,222,175, 91,183,110,143, 46, 95,190,220,172, 85,171, 86, 24, 59, -118,172,246,238,221,187, 61, 1, 92,123,240,224, 65,199,225,195,135, 43,234,214,173,139,171, 87,175,250, 14, 31, 62,252, 22, 77, -211,203,204,208,252,100,233,210,165,243, 62,252,240, 67, 44, 93,186,148, 28, 58,116,104, 24,128,243, 5,203,206, 29, 56,112, 96, -228,242,229,203, 73,255,254,253,177,100,201,146,121, 0, 38,149, 39,166, 80, 40,178,141, 70, 35, 20, 10,133, 89, 33,121,115,215, -119,112,112,248,160, 91,183,110,152, 63,127, 62,170, 85,171,134, 19, 39, 78, 16, 0, 39, 1, 92,215,106,181,237, 0,172, 85, 40, - 20,191,223,190,125, 27, 93,187,118,229,163,248, 16, 35,229,125,255,163,125,251,246,105,172,173,173,225,233,233,137,154, 53,107, - 34, 41, 41, 9, 81, 81, 81,168, 95,191, 62,154, 52,105, 2,131,193,128,159,126,250, 73,157,155,155,107, 86, 78, 62,131, 86,177, -231,194,169,163,217,246,114, 33,220,157,172, 81,163,154, 29,242,178,210,144,154,148,128, 38,126, 30,104,223,164, 6,210,178,181, - 56,119,242,104,102,110,174,114,143, 89, 33,124,141,114,215,197,179, 39,178,109,229,124,120,251, 4, 96,248,216,105,141, 26, 53, - 14,188,208,188,121,235,115,171, 87,126,219,160,115, 75, 63, 42, 46, 77,141, 51, 39,127,203,204,206,201,217,245, 46, 30,244, 75, - 0,142,218,186,238,181, 45,199,130,127,242,239, 49,238,167,240, 56,108, 0, 0, 61,135,227,219,243,131, 15, 16, 23, 23,135,163, -135, 15, 39, 42,129,135,230,234,137,197, 98, 26, 0,178,179,179, 33, 44,104,119,103, 0,124,122,245,234,133,212,180, 52,236,251, -245,215,212, 51, 64,136, 37,229,236, 3, 8, 36,226,252,128, 96,118,118, 54, 40, 32, 7, 0, 40, 46,122, 54,175, 87, 7,169, 25, - 57,184,124, 47, 60,175,134, 10,159,149,167,243, 30, 55,132,175, 92, 27, 45, 0,105, 51,103,206,132, 80, 40,132,171,171,107,161, - 57, 50,153, 21,129, 64, 0, 87, 87, 87, 24, 12, 6, 28, 56,112, 0, 0,210,202,125,195, 3, 52,125, 39,173, 96, 52,122,162,228, -241,120,111, 69,179,224,205, 81, 51, 96,246,207,204,217, 91,165,119,138,169,140,230,123, 64,243,130,156, 88,205, 1,100, 70, 69, - 69,197, 13, 30,208, 55, 59, 58,226, 73,146, 34, 43, 33, 49, 39, 61, 54, 49,246,245,227,164,175,230,204,204,142,139,139,139, 69, -126, 46,173,230, 9, 9, 9,166,109,204, 97,230,224,193,131,127, 24, 55,110, 28, 9, 13, 13, 5, 0, 4, 7, 7, 99,244,232,209, -100,228,200,145, 27, 0,204,173, 68,185, 21, 42,149,170, 88, 52, 68,103,100, 10,171,252,114,114,114,144,144,144, 0,173, 86,107, -182, 35,126,113,110,205,243,140,168, 32,125,128,167, 20, 1,158, 82,248, 86,151,128, 50,228, 21,154,172,212,212, 84,211,155,179, -218,130,114,230,104, 52,154, 98,229, 44, 90, 53,153,147,147,131,164,164, 36, 24,141,198,178,126,200,152,248,248,248,115, 7, 15, - 30,204, 5,128,213,171, 87,103, 80, 20,245, 7, 69, 81, 63,148, 50,109,227,114,185, 55, 77,235,174, 89,179, 38, 3,111, 86,137, -253,149,124, 88,191,126,253,204,121,243,230,109,158, 62,125, 58,182,109,219,134,196,196,196,185,248, 51, 23, 15,147,150,150, 54, -123,203,150, 45, 24, 51,102, 12, 22, 46, 92,184,166,113,227,198, 57, 0,134,151, 37,232,232,232,232,206,229,114, 17, 18, 18,146, - 3,224, 85, 5,223,159, 20, 18, 18,146, 76, 81, 20, 92, 93, 93,107,149,183,162,157,157, 93,109,185, 92,142,248,248,120,160,224, -141,185, 20,162, 18, 18, 18,136, 64, 32,128,155,155, 91,157,138,118,222,214,214,118,246, 79, 63,253,196,125,242,228, 9, 58,119, -238, 28,119,245,234,213,174, 0, 76, 93,210, 67,130,131,131,219,118,236,216,241,249,133, 11, 23,240,221,119,223, 81, 13, 27, 54, -156, 84,145,166,167,167,231,196, 79, 62,249, 4,155, 54,109,194,246,237,219, 39, 1, 56, 92, 98,149,253, 91,182,108,153,182,125, -251,118,140, 29, 59, 22, 94, 94, 94,195,203,211,139,142,142,158,211,161, 67,135,224, 23, 47, 94,152, 53,226,129,153,235,119, 12, - 12, 12,172,173, 82,169,176,107,215,174, 87,181,107,215,190,127,248,240,225,153,120,243, 7,251,247,163, 71,143, 98,196,136, 17, -104,216,176,225, 46, 0, 67,205,185, 45,195,194,194, 98, 47, 93,186,196,240,249,124,120,122,122,162,119,239,222, 24, 54,108, 24, - 26, 52,104, 0,157, 78,135,163, 71,143, 50,143, 31, 63,142,211,106,181,102,229, 82, 74,127,113,229, 68,100,228,243,155, 33,119, -175,233,185, 28, 26, 30,174,118,248,168, 75, 35,124, 58,176, 53,154,248, 86, 67,116,138, 10,151, 46, 93,208, 71, 70,190,186,109, - 78,143, 67,147,102,248,211,135,183,158,132,220, 48,240,184, 20,124,125,234, 98,254, 87,179,109,151, 47,154, 99, 83,183,150, 7, - 30,190,206,198,133,243,103,244, 9,113,177,151,223, 85,143,195,171, 0, 95, 38,164,164, 28,154,134,145, 22, 42, 56, 5, 29,105, -234,249,251,123, 59,187,184,224,212,169, 83,160, 45,232, 17,122, 21,224,203,100,249,181,224,121,121,121, 48,233,213,246,241,241, -241,240,244,196,233, 83,167,192, 97,152,176,246, 22, 38, 24,125,150, 95, 13, 93,168, 75, 1,234,207,170, 67, 94,187,186,147,143, -173,181, 20,119, 31,190,132, 70, 79,238,253,154,137,119,154,143,236, 47,100, 60, 42, 89,117,184,122,219,182,109,205,127,250,233, -167,174, 51,103,206,148,141, 26, 53, 10, 34,145, 8, 74,165, 18,238,238,238, 48, 26,141, 56,123,246, 44,130,130,130,242, 24,134, -185,128, 55,211, 6,116, 65,145, 94, 26,231, 94, 65,156,239,183,148,205,143, 13, 26,244, 86, 52, 1, 64,246,146,177, 74,175,161, -221,187,241,240,141,254,251,206,133, 80,159, 15,109, 79, 55,241,169, 14, 0,112,118,118,134,149,149,149,197,154,111,129,191, 92, -179,104,181,110, 82, 82,210,179,164,164,164,148,113,227,198,249,154, 26,190, 11,133, 66,117, 65, 36, 43,179,180,109,204, 40,167, - 14,192,103, 63,253,244,211,241,236,236,236,115, 95,126,249, 37,150, 47, 95,142, 19, 39, 78,180, 5,112,179,146,251,110,204,204, -204,204,186,119,239,158,115, 29,191,198,168,233,196, 67,187, 5, 47, 64, 8,129,189,132, 32, 55, 43, 3, 15, 30,132, 32, 55, 55, -247,174, 37,229,212,233,116, 89, 41, 41, 41, 14, 78, 78, 78,200,200,200, 64, 90, 90, 90,161,201,202,204,204, 68, 70, 70, 6,161, -168, 55,114,182,148,167,169, 72, 73, 73, 81,134,135,135, 11,156,171,215, 65, 45, 39, 62, 2,191,122, 6, 16, 2, 15, 59, 26,185, - 57, 89,184,125,251, 54,178,179,179,175,148,165,201, 48,204, 23,195,135, 15,231, 0, 24,249,229,151, 95,218, 1,104, 56,123,246, -236, 11, 40,209,179,144,203,229,174,223,187,119,111, 61, 83, 21,227,156, 57,115,214, 1,248,233,239,186,150,236,237,237,191, 56, -117,234,148, 92,167,211, 97,227,198,141, 88,183,110,221, 78,188,153,168,242,212,230,205,155,183,208, 52, 61,121,202,148, 41,152, - 48, 97,130,164,105,211,166, 51, 19, 19, 19,127, 45, 77, 51, 62, 62,126,126,147, 38, 77, 22,166,164,164,124,107,150, 89,126,241, - 98,124,147, 38, 77,230,167,164,164,172, 42,239, 28, 73,165, 82,169,209,104, 68,100,100,100, 38, 80,102,251, 14,117,100,100,100, -188,209,104,116,151, 72, 36,118, 21, 93,159,153,153,153,223, 54,109,218,116,113,114,114,242,121, 0,203, 74, 49,228,161,137,137, -137, 1,211,167, 79,159,186,114,229,202,254, 73, 73, 73, 7, 42,210,140,142,142,254,182, 99,199,142, 11,158, 63,127,190, 27,101, - 87, 1,111, 94,178,100,137,110,239,222,189,147, 34, 35, 35, 87, 84,160,121, 50, 45, 45,237,164, 5,231,183,172,245, 11, 53, 57, - 28,206,236,149, 43, 87,210,219,182,109, 3, 33,100,141,209,104, 44,171,156, 15,127,255,253,247, 61,173, 91,183, 30,117,248,240, - 97, 81, 64, 64,192, 4,141, 70,179,191,162,235, 83,169, 84, 30, 61,124,248,112,255,135, 15, 31,186,143, 26, 53, 74,228,237,237, - 13,157, 78,135,196,196, 68,108,219,182, 77,253,248,241,227,184,172,172,172,163,150, 60, 67, 12,218,156,161,183, 46, 29,219, 31, -245,226,113,203, 14, 61,250,217,106,117,238, 16,166,115,144,149,158,132,179, 39,143,102, 70, 70,190,186,173, 84,102, 13,181, 68, - 83,167,201,254,248,246,229,227, 7,226, 34,195, 91,180,235,216,211, 86,173,245,132,144, 79, 35, 61, 57, 30,103, 79, 29,203,136, -140,124,125, 93,173,215,140,126, 87,207,121,142, 23,150,113,146,130,198, 77,236,211, 8, 98, 91,247, 7, 60, 96, 99,107, 64,236, -224,236,204, 47,184,119, 32,203,111,243,104,150,102, 50, 32,168, 83, 80, 75,165, 84, 42,193, 3,180, 99, 0,158,163,163,163, 24, - 0,158, 63,127, 14, 73,126,173,134, 69,229,204, 3,164,146, 34,186, 52,160, 76,231,162, 90,109, 43, 41, 5, 0,113, 73,233,208, -234,203,253,221,120,223,217, 81,196,112,237,168,140, 0, 31, 64, 23,153, 76,182,124,225,194,133,107,238,222,189,187,166,119,239, -222,107,132, 66,225,242,130,131,205, 47,231, 68,252,109,154,205,220, 96,215,177, 22,117,173, 91,109,138,153,216,214,214, 56, 58, - 80,170,237,212,169,211,150, 42,150,179, 42, 55,203, 95,169,121, 76,175,215, 19,228, 87,219, 29, 67,217, 85,130,243,138, 44, 79, -138,137,137, 33, 5,127, 91, 82, 78,135, 33, 67,134, 48,185,185,185,100,240,224,193, 4, 21, 15,225, 83,174,166, 80, 40,236,216, -174, 93, 59,125,114,106, 6,121,246, 58,158,220, 9,126, 74,206, 93,186, 69, 14, 28, 61, 69, 54,109,217, 78, 26, 52,104,160, 5, -224,105,137, 38,151,203,237,212,177, 99,199,244,228,228,100, 18, 30, 30, 78,174, 93,187, 70,142, 28, 57, 66,182,111,223, 78,126, -248,225, 7, 82,189,122,245,100, 0,206,150,104,138,197,226,126, 31,124,240,129, 62, 43, 71, 73, 34,227,211,201,163,240, 72,114, -243,222, 35,114,246,210, 77,242,235,254,195,196,223,223, 95,109,134, 38,135,195,225,108, 58,112,224, 64, 14, 33,132,244,235,215, - 47, 14,197, 19,169,214,252,226,139, 47, 82, 8, 33,100,213,170, 85,233, 40,189, 33,252, 95,125, 45,245,168, 86,173,218, 51, 62, -159,127, 10,192,200, 10,182,251,152,203,229,158,112,113,113,185, 15,224,163,119,112, 31,245,118,114,114,186, 3,160,162, 17, 14, - 76,235,125,248, 47,185,223,255, 10,205, 78, 92, 46,247, 26, 80,254, 32,194, 69,158,215,223,112, 56,156,211, 0, 58, 91, 88,206, -186, 14, 14, 14,131,109,109,109, 63,183,181,181,253,220,201,201,105,176, 64, 32,168, 91,149,125,183,175,219,165,143, 71,227,190, -191, 87,111,216, 43,218,163, 81,239,104,175, 38,253,126,183,175,219,165, 79, 85, 53, 61,155,244, 59,230,209,168,119,140, 71,163, - 62, 81, 53,155,245,251,221,193,167,203, 7,239,242, 28,141,172, 6,183,174, 53, 97, 32,215, 22, 16,114,109, 1,233, 82, 19, 76, - 75, 27,248, 55, 7,228,221,187,116, 89, 75,140,198,181,253, 63,252,112,109, 29,192,158, 0,156,146, 83,105,154,141, 1,171,194, -109,251,245, 91, 91, 11,112,232, 10, 72,218,183,109,187,134, 24,141,107,135,127,252,241, 90, 15,192,165, 52,189,178, 52, 9,192, -169, 6,184, 21,213,117, 0,106, 15,244, 66,192,188, 62, 94,132, 92, 91, 64,150, 12,242, 38, 77,156, 49,178, 2,205,178, 34, 69, -239,109, 68,171,180,182,226, 21, 33, 45,120,184,174, 40,248,148,190,133,139,240,173,107,182,112,133,119,151,218, 84,120, 79, 31, -110, 6,242,187, 36, 75,255,133, 15,201,221, 90,173,150,168,213,106,162, 84, 42, 73, 94, 94, 94, 73, 3, 85,104,200, 18, 18, 18, - 72, 92, 92, 28,137,137,137, 33, 81, 81, 81, 4,127,182,189, 49,187,156, 86, 86, 86, 63, 13, 26, 52,200,200,227,241, 54,189,141, -125,183,179,179, 91, 17, 24, 24,168,251,254,251,239,201,239,191,255, 78,126,252,241, 71, 50,101,202, 20, 82,175, 94, 61,141,141, -141,205,208,202,104,186,184,184,204,247,241,241, 73,223,185,115, 39,249,245,215, 95,201,134, 13, 27,200,215, 95,127,109,116,119, -119, 79,146,203,229,221, 43,163,233,228,228,180,163, 77,155, 54,186, 29, 59,118,144, 11, 23, 46,144,125,251,246,145, 47,190,248, -130,248,250,250,106,164, 82,233, 0, 51, 53, 57, 92, 46,119,237,196,137, 19,147,220,220,220, 78,149, 88, 38,241,247,247,191, 63, -124,248,240, 4, 0,115,254, 69,215, 39,171,201,106,178,154,127,129,209, 26,230,134,106, 4,224, 72,248,252,143,219,183,109,187, -134, 15,124,108,169, 41, 18,113, 56, 3, 91, 7, 6,174,225, 3, 67, 77,235,138, 56,156,129,237,219,182, 93,195,227,112, 70,148, -165, 87,158, 38, 1, 56,124, 46,119, 78,235,150, 45,215,114,129,175, 76,243, 58,213,164,194,190,232, 81,157,180,245,164, 94,142, -112,130,228, 95,108,180, 74,165, 50, 70,171, 48,128,240, 23, 92,132,239,139,230, 63,229,166,174, 83, 96,152,142, 89, 16,209, 58, -134,252, 81,212,235, 84,178,156,226,183,188,239,245, 29, 28, 28,206,212,169, 83, 39,181, 70,141, 26, 9,182,182,182,251, 1,184, - 87, 81, 51,192,197,197,229, 23,103,103,231, 23,174,174,174, 15, 29, 28, 28,214, 35, 63,235,124,165, 53,121, 60, 94,160,179,179, -243, 21, 47, 47,175, 44, 79, 79,207,100, 7, 7,135, 3,165, 68,178,204,209,116, 69,233, 15, 21,126,193, 50,246, 71,135,213,100, - 53, 89,205, 98, 6,166, 91, 45,172,236, 90, 19,134,174, 53, 97,236,230,133,245, 69, 13, 74,111, 64, 92, 89, 83, 52, 26, 16,150, - 92,191, 34,189,138, 52, 9,192,105, 5,200, 74,110,211,211, 29,254,102,106,190,239, 17, 45,211,115,190, 88, 68,139, 91, 73, 65, -195, 95, 80,200,247, 69,243,159,194, 75,148,211, 24,185, 8, 43,222,226,119,170,222,242, 62, 60, 74, 75, 75,251, 32, 45,237,173, -246, 77,120,146,148,148, 52,242,109, 10,234,245,250,187,201,201,201, 29,222,130, 84, 89, 93,175,117, 48,179, 91, 54, 11, 11,203, -127, 7, 10, 48,226, 21,230,118,169,139,141, 92, 35,232,179,175, 17, 95,162, 75,158,138,170,140,102, 62,198,221,165, 60,227,169, -202,150,243, 79,242,222,208,136,195, 83,234,191,115,218, 18,145,223, 70,203,252, 60, 90, 44, 44, 44, 44, 44, 44, 44,239,142,139, - 47,216, 23,177,247,128, 83, 40, 30,125, 59, 85,196,136,150, 25,250,180,164, 39, 69,101,194,167, 23, 89, 77, 86,147,213,100, 53, - 89, 77, 86,147,213,252,207,105,154, 40,107,236,212,103, 37,254,175, 84, 47,190,127, 2, 85,105,163,245, 87, 26, 48, 86,147,213, -100, 53, 89, 77, 86,147,213,100, 53,255,123,154,239, 51,101,246, 58,100,171, 14, 89, 88, 88, 88, 88, 88, 88, 88,170, 70,153, 81, - 55,214,104,177,176,176,176,176,176,176,176, 84, 13, 87,228, 15, 81,117, 10,127, 14, 85,181,131, 53, 90, 44, 44, 44, 44, 44, 44, - 44, 44, 85,167, 23,254,236,109, 88, 44,186, 69,179,199,134,133,133,133,133,133,133,133,165,202,140, 47,242,201,166,119, 96, 97, - 97, 97, 97, 97, 97, 97,121, 75,152,215, 51,242,228,201,147,132, 61, 86, 44, 44, 44, 44, 44, 44, 44,239,138,247,212,139,152,162, - 88,197, 70,249, 96,123, 29,178,176,176,176,176,176,176,176, 84,157, 29, 69, 12, 87,177,121,172,209, 98, 97, 97, 97, 97, 97, 97, - 97,169, 26, 38,131,117, 10, 37,134, 84,163, 1,182,202,144,133,133,133,133,133,133,229,221,242,158,123,145, 29, 5,211, 27,195, - 37,153,122, 29,118, 40,216,193, 14,236,169,102, 97, 97, 97, 97, 97, 97,121, 7,188,207, 94,196, 21,165,180,209, 98, 97, 97, 97, - 97, 97, 97, 97, 97,169, 58,227, 75,124, 2,200,111, 12, 79,177,199,134,133,133,133,133,133,133,133,229,173, 24,173,162,236,248, - 59, 6,149,102, 97, 97, 97, 97, 97, 97, 97,249, 79, 66, 8,249,203, 51,195,179, 35,155,179,154,172, 38,171,201,106,178,154,172, - 38,171,249, 95, 96, 60, 74,100,133, 7,216,244, 14, 44, 44, 44, 44, 44, 44, 44, 44,111,195,100,237, 40,237,127,118,172, 67, 22, - 22, 22, 22, 22, 22, 22,150,191, 8, 54,162,197,194,194,194,194,194,194,194, 82, 53,118,160,148,172,240,172,209, 98, 97, 97, 97, - 97, 97, 97, 97,121,123,102,235, 13,216,170, 67, 22, 22, 22, 22, 22, 22, 22,150,170, 49,190,172,255, 41,148,221,115,224,162, 5, - 95, 80,153,222, 7, 23, 89, 77, 86,147,213,100, 53, 89, 77, 86,147,213,252,207,105, 86,164,125, 17,239, 31,165, 54,134,255, 59, -242,104,177, 93, 95, 89, 77, 86,147,213,100, 53, 89, 77, 86,147,213,252,183, 99, 26,130,199, 52,185, 2,249,121,180,216, 54, 90, - 44, 44,239, 57,228, 48, 56,200,244,241, 2, 33,110,224, 8, 18,145,248,232, 21,181, 24, 76,149, 53,147,253, 61, 33,214, 59,195, - 32, 74, 69,242,195,215, 85,213,100, 97, 97, 97,249, 23,147,136, 50,218,104,177, 70,139,133,229,125, 39,213,215, 27, 92,172, 0, - 13, 87, 16, 93, 4, 28,253, 87, 0, 79, 31, 87, 89,147,207, 44,131,145,118, 7,209, 61,135,147,207, 74,224,217, 83,246, 96,179, -176,176,176, 88,198,223,222, 24,158,199,227, 37, 3, 96, 68, 34,209, 81,176,163, 92,179,252,181,184, 22, 92,103, 76,193,117,103, - 9, 50, 46,151,187, 80, 34,145, 92, 22, 10,133, 41, 66,161, 48, 69, 42,149, 94,230,114,185, 11, 1,200,254, 41, 59, 72,126,169, - 39, 1,109,252, 64,171,103,170,157,125,148,229,164,212, 24,189, 65, 27,122,146,157,117,101, 85,210,228, 82,221,212, 58,198,227, -215,123, 74,103,133,214,224, 7,130, 42,105, 22,193,134,207,231,159, 5,224,192, 94,158,255, 78,252,128,166, 77,185,220, 89,190, - 64, 39,128, 29, 79,151,133,229,111, 55, 90,122,189,222, 41, 45, 45,141,218,179,103, 79, 95,107,107,235, 8, 46,151, 59, 15, 0, -255,191,114,192,101, 50,217, 45, 43, 43,171,100,107,107,235,100, 43, 43,171,144,138,230,255, 75,241,118,116,116,140,182,179,179, -123, 94,116,166, 99,131,143, 90,213,105, 61,114,145,189,127,191,246, 85,212,231,115,185,220,121,214,214,214, 17,123,246,236,233, - 27, 31, 31, 79,233,245,122, 39, 11,182,111,103,107,107, 27,118,247,238,221, 5,105,105,105,237, 99,239,236,116, 76,186,187,221, - 49,250,202,218, 14, 65,167, 55, 45,176,177,177,126, 10,160,221, 63,226, 72,170, 25,103,208,156,142, 79, 18,149,146,196, 28,189, -115,112,148, 82, 14,112, 58, 64, 91,133,151,152,108,198, 25, 32,157, 66,227, 84,210, 91, 25,142,206,215, 95,105,172, 64,211, 29, -161,166, 92,170,252,192,161,233, 73, 12,195,116,229,243,249,159,179,143,223,127, 39, 2,154,110,125,171,111,223,101,115, 26, 52, -152,234, 11,244, 41,195,108, 81, 0,166,249,250,250,158, 1,240,241, 91,252,250,239,124,124,124,226, 1, 76,103,207, 4,203,223, - 76, 99,211, 11, 62,138,180,209,178,200,104, 13,244, 66,235,161, 53,113,117,176, 23,114,135,212, 68,222,136,154,184, 49,192, 11, -157, 42, 83, 26,123,123,123,180,107,215,142, 19, 31, 31, 47,254,226,139, 47, 22,137, 68,162, 72, 0,221, 43,163, 37, 22,139,131, - 36, 18, 73, 44,151,203, 45, 86, 22,137, 68, 18, 36,149, 74, 99,185, 92,110,231,162,243,229,114,249, 45, 43, 43,171,100,185, 92, - 30, 82,134, 17, 10,178,178,178, 74,150,201,100, 65, 69,231,115,185,220,206, 50,153, 44, 78, 46,151,151,156,223, 73, 46,151,199, -150,156, 95, 22, 60, 30,207, 61, 54, 54,214, 41, 46, 46,206, 73, 32, 16, 56, 23,157, 31, 19, 19,227, 20, 27, 27, 91,108,190, 37, -112,185,220, 78, 82,169, 52, 86, 34,145, 4,149, 54,191,228, 62,149, 69,145, 99,215,201,156,249,150,154,172,110,221,186,221, 72, - 76, 76,244,176,177,177,177, 41,186,192,206,218,166,251, 47, 59,183,204,236,215,179,219, 36, 71,191, 15,235, 87, 82,191,187, 72, - 36,138,252,226,139, 47, 22,197,199,199,139, 91,182,108,201,161,105,139,222, 39,186,244,235,215,239, 88,114,114,114,181,134, 13, - 27,114, 12, 6, 3,158, 28, 95, 8,201,195,207, 33,138,220,134,234,226, 84,110,196,133,149,238,221, 58, 52, 61,134,119,220, 24, -148, 28,246,227,131, 98,218, 49,132, 56,134,197,171, 29,123,245, 29,196,125, 16,171,114,212, 27,141,118, 0,167, 3,217,229, 41, -172,148, 38, 87,223,150, 33,196,249,143, 40,158, 99,199,193, 83, 57,151,162,184,142,122,163,209, 30, 52,218, 87, 70,179,232,229, -207,225,112,102,174, 93,187,150, 6, 48, 5,128,224,191,244, 20,110,238,134,106,157,106,115,238, 53,118, 69,235,183, 40, 27, 80, -112,191,123,255, 83,246, 83,203, 48,207, 14,188,126,125,110, 68,237,218,189,231, 52,104, 48,166, 20,179, 69, 1,152,179,114,229, -202,145, 79,158, 60,113,172, 89,179,230,132,183,244,210,191, 97,229,202,149,179,159, 60,121,226,230,229,229,181, 4,108,250,162, -127, 21,132, 16, 1, 33,164, 35, 33,164, 23, 33,164, 51, 33,164,121,193,223,205, 10,166, 94,132,144, 46, 37, 62,155, 21,108,107, - 90, 30, 88,134, 70,175,146,219, 21,217,166,228,255,197,254, 46,197,104,245, 66,126, 91,173, 94,197,118,224,228,201,147,164,232, -103, 73,134,120, 97,241,212, 86,213,148, 97, 39,246,145,188,216,215, 36, 51,252, 1,121,176,227, 91, 50,181,153,163,114, 88, 77, -124,103,249,241, 34,228,230,205,155,228,201,147, 39, 36, 47, 47,143,188,120,241,130, 4, 6, 6,170, 36, 18,201, 31, 0,188, 44, - 17,147,203,229,201,127,252,241, 7,233,214,173, 91,182, 76, 38, 91, 99,186,185,172,172,172,146,111,222,188, 73,186,117,235,150, - 45,151,203, 55, 0,224, 0,192,128, 1, 3, 82, 8, 33,196,209,209, 49,161, 52,189,126,253,250,101, 18, 66,136,181,181,181,169, -170,137, 35,151,203, 55, 76,158, 60, 57,239,254,253,251,196,214,214,214, 52,159,182,178,178, 90, 51,101,202,148,188,224,224,224, -162,243,203,197,206,206, 46,214,104, 52,146, 19, 39, 78, 16, 39, 39,167,194, 50,216,218,218,198, 26,141, 70,114,236,216,177, 50, -203, 86, 94,160, 64, 38,147,173, 30, 49, 98, 68,110, 84, 84, 20,177,183,183, 79, 46, 50,127,205,168, 81,163,114, 99, 98, 98,136, -131,131,131, 89,101,180,183,183, 79,190,117,235, 22,233,223,191,127, 78,209, 99,106,111,111,159,124,251,246,109,211,252,213,230, - 60,200,220,220,220, 38, 56, 57, 57, 37, 56, 57, 57, 37,216,216,216, 44,119,117,117, 77, 74, 77, 77, 37,132, 16, 82,171, 86,173, -148,162,145, 44,167,128,190, 51,182, 29,190,125,247,218,227,244,212, 6, 93, 39,173,182,110,208,207,218,130, 99,224, 37,145, 72, -254,104,223,190,189, 42, 54, 54,150, 40, 20, 10,242,240,225, 67,114,243,230, 77,242,242,229, 75, 2,192,156, 62,182,114,153, 76, - 22,175,209,104, 24,141, 70,195,164,166,166, 26, 83, 82, 82,140,225,107, 92, 9,249,153, 87, 56,101, 29,235, 67,146,174,173, 96, -172,100,146, 56, 0,242,119,246,224,217,226,239, 78,182,251, 28,120,186,208, 35,252,218,202, 30,122, 18,117,137,236, 27,227,168, -191, 58,163, 90, 4,249,193,247,127,100,187, 95,245, 74,105,254,224,183,239,225,215, 30,207, 54, 45,153,166,143,142,142, 38,179, - 70,245, 48,156,159, 90,237, 21,217,230,123,184, 50,154, 69, 24,250,209, 71, 31,229,197,196,196, 16,127,127,127, 5,135,195, 25, -251, 95, 50, 89, 93,188, 5,241, 15,127,157,197,244, 9,144,164,191, 37,179, 21,224,228,228,148,182,123,247,110, 34,151,203, 83, -254, 65,102,139,242, 5,250,238,105,208,224, 24, 51,112,160,113, 79,131, 6,199,124,129,190, 5, 6,139, 2, 48,119,213,170, 85, -193,122,189, 62,120,215,174, 93,193,125,251,246, 13, 6, 48,171,138,223,249,253,119,223,125, 71,244,122, 61,217,181,107, 23,233, -219,183, 47, 1,176,209,220,141,101, 50, 89,157,250,245,235,239,245,247,247,143,105,216,176,161,214,207,207, 79,237,237,237, 29, - 21, 16, 16,176, 91, 40, 20,122,129,229,111,161, 60, 47, 66, 8,105, 62,119,238,220,121, 0,200,220,185,115,231, 17, 66,122, 21, -248,137, 94, 69,255, 46,249,105, 50, 79,166,255, 75,211, 48, 77,165,105,150,246, 29, 37,190, 7,101, 68,178,198, 23,148,251,207, -157, 59,121,242,100,251,147, 39, 79, 94, 45,185,115,131,106,162,213,212, 86,213, 84,170,212, 68,242,248,219,207,201,229,142,238, -228,102, 7, 23,242,124,230, 71, 36,241,215, 13,228,179, 70,182,202,129, 53,209,209, 82,163, 21, 28, 28, 76,130,131,131, 73, 72, - 72, 8,137,140,140, 36,217,217,217,228,224,193,131, 70,123,123,123,149, 80, 40, 92, 9, 64,108,142,152,149,149, 85, 50, 33,132, -104, 52, 26,178,124,249,114,117, 65,164,202,217,218,218, 58,153, 16, 66,178,178,178,200,202,149, 43,213,214,214,214, 15, 1,184, - 57, 56, 56,196,190,126,253,154, 56, 59, 59,151,106,102,108,109,109,147,159, 61,123,102, 50, 78,213,108,109,109, 31, 31, 63,126, - 92, 71, 8, 33,113,113,113,196,206,206, 46, 25,128,179,189,189,253,131,147, 39, 79,234, 8, 33, 36, 33, 33,193, 52,223, 44,163, -165, 82,169,200,249,243,231,139,149,193, 52,255,204,153, 51,197, 12,152, 25, 56, 91, 91, 91, 7, 31, 60,120, 80,107, 52, 26,201, -227,199,143, 77, 38,209,217,198,198, 38,228,240,225,195, 90,163,209, 72,194,195,195,205, 54,131, 53,106,212, 72, 33,132, 16,131, -193, 64,182,109,219,166, 49, 29, 83,211,124,173, 86, 75,182,110,221,170,177,178,178, 10, 6, 80,110,244,205,193,193, 33, 65,171, -213,146,172,172, 44, 18, 24, 24,152,119,243,230, 77,146,147,147, 67, 8, 33,164, 70,141, 26, 41, 0,224,211,126,236, 55,119, 95, -228,229,124, 50,123,203, 33,175,230,195,190, 61,119, 47, 62,238,167,223,131,130, 29, 2,250,245, 48, 39,168, 41, 20, 10, 87,186, -186,186,170,175, 95,191,110,212,233,116, 36, 38, 38,134,132,132,132, 20, 94, 99,143, 30, 61, 50,203,104,113,185,220,133,119,239, -222,213, 25,141, 70, 38, 45, 45,205,152,146,146, 98, 76, 73, 73, 49,148, 52, 90,228,103, 30, 73, 59, 51,142,156,218, 49, 93,203, -231,243, 23,190,155,104, 22, 56,100,187, 79, 63,178,221, 39,120,247, 8,135,180,220,144,253,132, 92,152, 78, 94,125, 83,147, 44, -236, 33,207,101,182,251, 4,147,237,190, 3,201,226,246, 92,139, 52,119,248,245, 33,219,125,130,191, 27,228,153,254, 32,248, 62, -185,122,245, 42,217,186, 97, 21,153,218,165,154,130,217,238, 19, 76,126,240,235,111,137,102, 81,132, 66,225,139, 27, 55,110,144, -107,215,174,145, 37, 75,150, 16,137, 68, 18,243, 54,162,122,228, 7,111, 79,242,163,119,123,178,179,174, 43,185,210,254, 31,215, -193,167,185, 27,170,117,245, 22,196,165, 61,248,157,144,140,151, 36,105,141, 63,233,225,195,171,170,217, 10,112,114,114, 74,141, -138,138, 34, 73, 73, 73,100,221,186,117,196,202,202,234, 31,109,182,124,128,126, 0,230,173, 94,189,186,208,100,109,217,178, 37, -248,209,163, 71,193, 30, 30, 30,167,171,240, 93, 27, 87,175, 94, 93,104,178,182,108,217, 66, 30, 61,122, 68, 60, 61, 61, 99, 43, -218,112,196,136, 17,146, 86,173, 90, 5, 15, 31, 62, 92,185,123,247,110, 18, 21, 21, 69, 30, 62,124, 72, 86,175, 94, 77, 22, 45, - 90, 68,126,254,249,103,210,191,127,127, 69, 96, 96,224,221,129, 3, 7,138, 44,140, 40,112, 11,162, 48, 2, 66, 8,143, 16, 98, - 50,154, 92, 0, 60,211,203, 63, 75,113,163, 85,150, 23, 41,203, 76,149,101,176, 74, 46, 43,199,136,149,107,216,204,248,190, 66, - 83, 85,198,117, 80, 44, 34,113,165,119,239,222,237,223,248,241, 33, 88, 58,254,139,111, 68,145,187,215, 33,249,224,102,112,178, -146,193,203, 77,135,230,198, 41,232,111, 28,199,200,150, 45,197, 98,138, 90,102,233, 1, 21, 8, 4, 16, 8, 4,224,243,249, 80, - 42,149, 72, 72, 72, 64,155, 54,109,232,144,144, 16,209,132, 9, 19,166,139,197,226, 24, 0, 31, 86,120, 55, 83,249, 17,233, 91, -183,110, 97,220,184,113,194,189,123,247, 54,116,116,116, 12, 53, 26,141, 2, 0, 8, 15, 15,199,144, 33, 67,132,251,247,239,175, -231,230,230, 22,162,211,233, 36, 66,161, 16, 28, 14,167, 76, 61,129, 64, 0,189, 94, 47,172, 91,183,238,195,208,208,208,128,222, -189,123,243,162,163,163,241,250,245,107,232,245,122,129,183,183,247,163,144,144,144,134,189,122,245,226,197,198,198, 34, 58, 58, -186,176, 28,230,148, 87,171,213, 66, 40, 20,162,104,149, 22, 69, 81,208,104, 52, 16, 8, 4,102,107,113,185,220, 78,190,190,190, -143, 66, 67, 67, 27,247,235,215,143,127,255,254,125,196,197,197,193,104, 52, 10,252,252,252, 30,133,134,134, 54,234,219,183, 47, -255,225,195,135, 72, 78, 78,134,185, 85,104,166,245, 66, 67, 67, 49,124,248,112,193,217,179,103, 27,185,186,186, 62, 52, 24, 12, - 2, 0,120,244,232, 17,134, 12, 25, 34, 56,119,238, 92,227,234,213,171, 63,172,160, 42,145, 3, 0,122,189, 30, 19, 38, 76,144, - 90, 89, 89, 33, 54, 54, 22, 12,195,192,104, 52, 2, 0,210, 51,211, 31,133, 62,122, 28, 62,114,232,160,246, 42,157, 70,115,251, - 94, 80, 88,173, 26,158,238, 20, 69,106, 84, 80,212, 15,165, 82,105,204,154, 53,107,102, 68, 69, 69, 9,125,125,125,233, 87,175, - 94, 33, 55, 55, 23,124, 62,191,240, 26, 51,119,191, 5, 2, 65, 7,127,127,127,174, 90,173, 6,195, 48, 0, 64,104,154, 46,245, -100,136,178,110,192,207,217,192, 19,139,197, 29,222,201, 19, 41,199,223, 30, 12,186, 70,167,106,133, 66, 27,119,185,204,213, 27, -136,185,134,154,142, 66,112,104,142,232,254,107,165, 20, 32, 93,225,145,102,111,153, 38,211,245,117,138, 86,168,183,171, 39,115, -115,247, 64,122,122, 58,170,215,242,133, 90,224, 40,184,245, 82, 33, 3,101,161,230,159,180,173, 91,183,174, 75,157, 58,117,144, -150,150,134,198,141, 27,195,214,214,214, 22, 64,215, 74,155,172, 93,158, 66,228,160, 53, 64,175,129,145, 90, 2, 61,119, 5, 94, -166, 54, 38,219, 27,243,254, 73, 38,203, 74, 38,184,179,255,192,193,106,246, 30,126,192,169, 79,224,108, 35,196,206, 73,141,237, - 28,173,133,199, 42,105,182, 2,156,157,157, 47,221,189,123,215, 65, 36, 18, 33, 36, 36, 4,254,254,254, 88,183,110,157,163,173, -173,237,181,127,136,217, 34,225,192,137,239, 30, 62,220,181, 55, 34,226,228,136,218,181,123, 15,247,246, 94, 62,241,227,143,199, - 78,155, 54, 13,171, 86,173,194,177, 99,199,208,186,117,107,140, 31, 63, 94, 31, 19, 19,179,167,146,223,179,121,205,154, 53, 83, -167, 79,159, 94, 82, 83, 23, 29, 29, 93,110,109,139,191,191,191,251,139, 23, 47,226,103,206,156,217,120,239,222,189, 98,137, 68, -130,172,172, 44,252,248,227,143,152, 55,111, 30, 40,138, 2, 33, 4, 63,255,252,179,100,204,152, 49,205, 35, 34, 34,226, 61, 61, - 61, 43,108,214, 65, 8,161, 8, 33, 34, 0,146,130, 73, 10, 64,178,127,255,126,235,126,253,250, 89, 21,204, 19, 23, 76, 66,176, -148,164, 84, 47, 82,228,183,242,100,137,227,221,187,228,188,146,203, 8, 33,189,203,211,176,208, 64,151,246,125,167,202, 51, 91, - 69,127,129, 58,148,234, 34,129, 6, 46, 94, 62,200,190,112, 24, 98, 46, 5, 49,167, 96,226, 82,160, 95, 61, 66,117, 17, 15,122, - 66, 2, 42,107,180, 76, 19,143,199,131, 82,169,132,209,104,196,188,121,243,132,231,207,159,183,167,105,250,127, 21,233, 20, 53, - 76,207,159, 63,135,159,159, 31,117,226,196, 9,231, 41, 83,166,136, 77,223,147,157,157,141, 58,117,234, 80,103,206,156,113,250, -250,235,175,101,229,153, 25,138,162,192,231,243, 49,125,250,116,241,189,123,247,236,220,220,220,240,234,213, 43,100,100,100, 64, - 38,147, 97,250,244,233,226,187,119,239, 58,186,185,185, 33, 42, 42, 10,217,217,217,144,201,100, 22, 27, 45, 62,159, 95,108, 27, -138,162,160,211,233, 44, 50, 6,214,214,214,251,130,131,131, 29,173,173,173,241,240,225, 67, 24, 12, 6, 88, 91, 91, 99,234,212, -169,226,224,224, 96, 71, 27, 27, 27,132,135,135,131, 16, 2, 43, 43, 43,139,202, 8, 0, 12,195, 32, 60, 60, 28, 53,106,212,192, -181,107,215,156, 38, 78,156, 40, 50,205,127,249,242, 37,220,221,221,113,237,218, 53, 39,169, 84,186,175, 44, 45,134, 97,144,152, -152,136, 39, 79,158,224,213,171, 87, 72, 77, 77, 69, 90, 90, 26,114,115,115, 97, 48, 24, 0, 0,146,220,156, 83,251, 15,157, 8, - 21,139,197, 18,127,239,186, 30,143, 30, 63, 77, 17,139,197, 18, 79, 15, 15,111, 96, 49, 93,142, 33,252, 95,116,116,180,253,152, - 49, 99,248, 73, 73, 73,200,204,204, 4,151,203,125,227,218, 18, 8,204,107, 10,100, 48, 24,252, 68, 34, 17,165,211,233, 10, 35, - 96, 2,129, 0, 51,246, 41,225,191, 16,197,166,143, 55,164,128, 24,245,208,106,181,126,127,251, 47, 24, 64,129,210,214, 5, 69, - 53,190,243, 74, 97,215,182,247, 80, 62, 94,159, 5, 24, 61, 64,115,209,161,129, 59,247,216, 35,133, 51, 8, 26, 64, 3, 95, 66, - 42,238,249, 69, 0, 10,208,213, 1,168,166,231, 95, 24,236, 91,127, 52,137, 31, 31, 31, 15, 62,159, 15,161, 80,136,198,157, 6, -112,247,135,234, 93, 64,161, 33,116,240, 49, 71,179, 88,216, 81, 44, 94,176,104,209, 34,105, 81,205,177, 99,199, 74,173,173,173, - 23, 85,218,100, 41, 36, 45, 97, 32,211,159,196, 43,107, 44, 63,149,228, 23,145,162,242, 1, 33, 51, 1,125,163,183, 96,182, 58, - 8,133,194,215, 0,218, 84,201,100,201, 5,183, 15, 28, 56, 88,205,174,122,190,201,130, 65, 13,240,196,112,113,180,193,206, 25, - 29,237, 28,109,196,150,154,173, 0,103,103,231, 63,238,220,185,227, 32, 18,137, 16, 28, 28, 12, 62,159, 15,145, 72,132,250,245, -235, 99,251,246,237,142,118,118,118,255, 40,179,181,242,225,195,221, 43,158, 60,121, 62, 55, 32,192,247, 67,169,212,110,242,240, -225,214, 95,127,253,245,201,227,199,143,239,234,213,171, 87,218,189,123,247,214, 3, 56,108,105,196, 12,192,150,181,107,215, 78, - 54, 25,183,175,191,254,250,231,227,199,143,175,232,213,171, 87,226,189,123,247,102, 2,216, 82,158, 64, 94, 94,222,241,249,243, -231, 91,127,244,209, 71,166,255,113,227,198, 13,236,217,179, 7, 82,169,180,216,186,125,251,246,197,184,113,227,108,181, 90,109, -185,191, 73, 78, 78, 78,157,239,220,185,227,143,252, 14, 94, 66,147,209,122,252,248,177, 77, 78, 78,142,141, 76, 38,179,113,117, -117,149,155,204,214, 71, 31,125,100,195,229,114,219,128, 5, 21,121,145,162, 70,199,156,121,149, 93,223, 92,179, 85, 98, 86,153, - 57,180,138, 25,173,222,189,123, 95, 69, 25, 61,169,116, 25,201, 16,194, 8, 49,135,130,132, 83,196,108,129, 1, 55, 59, 5, 84, - 37, 58,240,150,246, 99, 40, 16, 8,192,225,112,160,213,106,145,158,158,110,145, 41,176,178,178,130, 76, 38,131, 74,165,130,193, - 96,128, 72, 36, 50,153, 17, 88, 89, 89,129,199,227,129,199,227, 65, 36, 18,189, 17, 77, 42, 25,205,225,243,249,144, 74,165, 72, - 76, 76, 68,116,116, 52, 24,134,129, 76, 38,131, 84, 42,133, 64, 32, 64, 66, 66, 2, 18, 18, 18, 64, 8,129, 84, 42,133, 84, 42, -133, 37, 13,174,141, 70, 99,169, 63,254,122,189,222,162,136,150,193, 96, 64, 88, 88, 24, 98, 98, 98, 32, 18,137, 10,247, 85, 40, - 20,226,229,203,151, 72, 74, 74,130, 68, 34,129,149,149, 21,172,173,173,205,214, 53,237,139, 92, 46,135, 88, 44, 70,102,102, 38, -148, 74,101,225, 49,181,178,178,130, 84, 42, 69,118,118, 54, 82, 82, 82,202,221,119,163,209,136,132,132, 4,164,166,166, 34, 54, - 54, 22,105,105,105,133,102,171, 32,106, 84,181,192, 78, 78, 14,210,211,211, 11, 35,145,101, 77,230,192, 48, 12,114,115,115,113, -231,206, 29,138, 97, 24,100,101,101, 49,169, 73, 73,198,207, 18, 4, 56,182,248, 7,114,240,236, 3,245,254,211,193,170,163,127, - 60, 81,109, 57,250, 72, 37, 10, 92, 98,120, 39,143,161,173, 1,214,208,243,186,165,229,233,133,169, 58,190,181,115, 64, 23,224, -245, 25,128,230, 2, 34, 91,180,168, 87, 19,209,153, 70,233,179,100,173, 8, 20,186, 99,139,183,173, 89,154, 70, 94,215,212, 92, -189, 48, 74,231,104,229,215,160, 9,146,147,147, 33, 20, 10, 33, 20, 10,209,180,117, 23,188, 78, 55, 74,158,198,171, 36, 32,232, -102,150,230,159,212,146,201,100, 45,219,180,105, 67, 21,213,236,217,179, 39, 40,138,170, 15,192,215,162,135,220,198, 90, 2,232, - 36, 45,192, 37,211,159, 38, 42,221,142, 61, 86,123,247,249,112,128,221,247, 23, 83,252,194,146, 52, 94, 32,250, 47, 64,116, 77, -170, 96,182,218,203,229,242,147,155, 54,109,242, 18,137, 68,103, 0,180,173,140,136, 76,204,217,182, 96,242,208,106,182, 38,147, -165, 87, 2, 92, 49,192, 19, 3, 92, 49, 92,156, 28,176,108, 92, 87, 59,137,136,119,212, 2,195,186,127,203,150, 45,142, 37, 77, -150,105,106,220,184, 49, 22, 46, 92,232,104,103,103,183,239, 29,255, 88,118,179,182,182,222,219,165, 75,151, 59, 9,114,249,184, -196, 38, 77, 4,127, 88, 91,103,119,206,206,182,246,124,252, 88,231, 3, 60, 2,176, 53, 46, 46,174,135, 5, 38,235, 99, 43, 43, -171,224,206,157, 59,235,228,114,121,204,186,117,235, 62,155, 50,101, 10, 86,173, 90,133,249,243,231,255, 8,224, 83, 0, 95,197, -197,197,185, 85,100,178, 0, 32, 41, 41,105,216,156, 57,115,210,210,210,210, 0, 0,245,235,215, 71, 86, 86, 22,102,205,154,133, -207, 63,255, 28, 0,208,168, 81, 35, 16, 66,144,156,156,140, 53,107,214, 36, 39, 37, 37,141,174,224,217, 30,123,248,240,225,230, - 58,157,206, 29,249,213,131,194,172,172, 44,171,140,140, 12,185, 78,167,147, 50, 12, 35,181,177,177,145, 1,144,140, 28, 57,146, -251,244,233, 83, 63,131,193, 16,207,122,171, 63, 41,207,139, 84, 6,138,162, 78, 85, 37,114, 85, 90, 68,172, 12,202,143,104,245, -238,221,155, 42,250, 89, 44, 98, 68,225, 97, 76,208, 53,216, 5, 52, 41, 22,205,146,112, 40,136,173,172,241, 58, 54, 26,124, 80, - 79,222,150,209,202,204,204,196,103,159,125,166, 26, 54,108, 88, 58,195, 48, 3,204, 53, 5,214,214,214,176,182,182,198,211,167, - 79, 73,255,254,253,147,215,173, 91,167, 42,106,180,158, 63,127, 78,186,117,235,150,178,104,209,162,188,242,140,150, 41,162,181, -114,229, 74, 85,135, 14, 29, 82,159, 60,121, 66, 76,102, 74, 38,147, 97,205,154, 53,170,142, 29, 59, 38,223,191,127,159,152,230, - 89, 18,209,162,105,186,208,104, 21,221,134,166,105, 48, 12, 99,145,209, 82, 40, 20,195,122,245,234,149, 28, 30, 30, 78, 76,251, -105,109,109,141,117,235,214,169,186,118,237,154,252,228,201, 19, 98,154,103,101,101,101,182, 25, 52,125,191, 92, 46,135,149,149, - 21,158, 62,125, 74,186,117,235,150,188,113,227, 70,117,209,249, 97, 97, 97,164,111,223,190,201,185,185,185,195,202, 51, 47,166, -234, 60,131,193, 0,181, 90,141,180,180, 52,196,198,198, 22, 86, 29,170,164, 86, 61,134, 14,238,211, 80,165, 82, 41,159, 62,127, - 17, 83,191,158,191,147, 74,165, 82, 70,199,196, 60, 7, 22, 51,229,104, 15, 8, 8, 8, 72,255,236,179,207, 84,153,153,153, 85, - 54, 90, 2,129, 32,156,203,229,146,182,109,219, 18,173, 86, 75, 98, 99, 99,245,105,153,153, 6,223,111,191, 37, 79,102,204,160, -196, 65, 65, 66,153, 76, 70, 21,104,210,175, 94,189, 98,196, 98,113,248,223,254, 36,162, 25, 23, 80,164,205,245, 23,121, 54, 93, -251, 12, 17, 80, 73,247, 0, 93, 30, 32,180, 5,132,182,224, 74,237,241, 65,219, 70,156,221,119,114, 92, 64,152, 86,224, 11,221, - 43,212,228, 17,103,128,105,123,225,185,218,182,205,192,169,130,140,140, 12,112, 56,156, 66, 83, 36,145, 74,209,249,195,145,244, -207,247, 52, 46, 0,105, 13,138,227,110,193,189, 62,123,193,130, 5,252,204,204, 76,208, 52,253,167,166, 68,130,137, 19, 39, 10, -173,172,172,230,155,253,240, 59,236,199, 7, 79,216, 2, 32,159, 63, 75, 82,187, 29,127,164,242,249, 98,229, 78,113, 64,163,230, -152,208,193, 73,188,242, 84, 74, 64,104,172,170, 38, 96,156, 1,131,182,105, 37,204, 86, 91,185, 92,126, 42, 40, 40, 72,210,179, -103, 79,172, 89,179, 70, 42, 22,139,207, 84,230,193,175,200, 51, 78, 89,186,241,151,228,135,235,187, 3, 58, 69,190,193, 42, 50, -165,228, 49, 88,184,243, 82,182, 94, 79,134,154,171,169, 82,169, 70,125,250,233,167,233, 71,143, 30,125,195,100,137, 68, 34, 68, - 70, 70, 98,249,242,229, 25, 25, 25, 25,163,223,165,201,154, 50,101,202,242,184,184, 56,159, 11, 23, 46,112, 83, 83, 83,157,214, -254,244, 83,246,145,236,236,140, 21,143, 31, 63,251,170, 94,189,186,115, 27, 52, 24, 93, 78,234,135, 82, 77,214,228,201,147,247, -199,197,197, 53,190,120,241, 34, 47, 53, 53,213,125,242,228,201, 88,189,122, 53,230,207,159,191, 29,192, 4,152,215,225,229,207, - 0,130, 78,247, 44, 51, 51,179,119,247,238,221,179, 50, 51, 51,209,160, 65, 3,244,233,211, 7, 46, 46, 46,112,115,115, 67,191, -126,253,224,237,237,141,244,244,116, 12, 29, 58, 52, 35, 53, 53,181, 59,128, 87,229,105,166,167,167, 71,236,219,183,239,249,212, -169, 83, 27,199,197,197,249, 1,176,207,205,205,149,230,230,230, 10,181, 90,173,216,214,214,214,182, 81,163, 70, 14,227,199,143, -151, 61,120,240,192, 47, 46, 46, 46, 15, 64, 52,107,175, 10, 77, 86,153, 94, 4, 64,106,129,225,209,150,248, 76,173, 96,153,185, -219,150,250,183, 25,235,149, 52, 91, 69,167, 55,170, 14, 75,191, 24,129,133,123, 14,239, 86, 11, 60,234,192,218,167, 33, 36, 34, - 17,196, 2, 1,196,182,246,208, 48, 12,126,138, 76, 82, 42, 8,153,111,233, 1, 45,249, 67, 72, 81, 20, 54,111,222,108,104,217, -178,165,250,210,165, 75,155, 84, 42,149, 7,128,223, 45, 49, 5, 27, 55,110, 84, 78,159, 62, 61, 52, 37, 37,165,161, 72, 36,210, -154,230,111,218,180, 73, 57,114,228,200,199,113,113,113,141, 37, 18,137,178,172,246, 89, 69,141,150, 80, 40,212,164,164,164, 52, - 31, 59,118,108,248,214,173, 91, 21, 18,137, 4, 82,169, 20, 66,161, 80,155,146,146,210,240,179,207, 62, 11, 93,189,122,181, 82, - 44, 22, 67, 42,149, 90, 84, 45, 71, 8,121,195, 80, 21,157,111, 46, 6,131,225, 82, 74, 74, 74,195,233,211,167, 63,248,254,251, -239, 21, 38, 3, 84,180,140,107,215,174, 85,202,100, 50,139, 34, 90,166,245,164, 82, 41, 54,108,216,160,156, 58,117,106,104, 74, - 74, 74, 67,161, 80,168, 45, 50, 95, 49,101,202,148, 7, 41, 41, 41, 13, 13, 6,195,165,114,222,240,140, 57, 57, 57,224,114,185, -120,252,248,177,134,207,231,131,166,105,188,124,249,178,208,104,217,217,217,249, 55,172, 95,207,247,151,253,135,175,138,249, 66, - 97,203,230, 77,253, 94, 69, 69,199, 17, 66, 69, 85, 80,212,223, 85, 42,149,199,165, 75,151, 54,181,108,217, 82,189,121,243,102, - 67, 89,145, 45,115,208,104, 52, 87, 67, 66, 66,244, 34,145,136, 74, 76, 76, 52,112, 56, 28, 24,141, 70,162,105,222, 92, 83,255, -251,239,201,211,185,115, 41, 43,169,148,203,231,243, 33,145, 72,168,179,103,207,106,149, 74,229,213,191,223,104, 65, 2, 10,226, - 23, 41, 26,185,136, 54, 80,120,254,123,190,201, 18,217, 0, 34, 91, 64,100,139,106,213,220,113, 47, 82, 41, 7, 13, 1,140,102, -228, 16, 35, 68, 10, 10,146,199,201,144,243, 4, 98, 42, 41, 41,169,208, 16,153, 38,175, 58,126, 8,137,206,147,129, 34, 66,112, - 96, 73, 10,146,222,246,246,246,220,196,196,196, 55, 52,253,253,253, 57,122,189,222,252,212, 46, 9, 70, 87,128,153,252, 60, 73, -237,250, 91,168,194,103,198,138,159,197, 98, 99, 22, 16,180, 17, 1,181,220, 48, 99, 96, 35,193,215,199, 83, 3,238, 71, 41,107, -129, 67, 38,128,201,115,180,160,156,109,228,114,249,153,251,247,239, 75,228,114, 57, 94,189,122,133,230,205,155, 99,199,142, 29, - 18,137, 68,114, 26,128, 69,237,241,238, 38, 35, 58, 47,215,216,114,246,225,152,164,135,137,134, 98, 38, 43, 85, 65,240,233,119, -199,179, 50,115,212, 3,238,196,150,125,255,148,194,131,172,172,172,110,243,231,207, 79, 79, 77, 77, 45,102,178,162,163,163, 77, -134,160, 3,128, 39,239,234,199,210,218,218,122,248,138, 21, 43,112,255,254,125,244,236,217, 19,215,174, 93, 67, 70, 70, 6, 14, -156, 57,243, 98,223,139, 23, 95,153,218,108,149,145,250,161, 84,172,172,172,190, 88,177, 98, 5,130,130,130, 10, 53,211,211,211, -177, 98,197,138, 56, 0,147, 44, 53, 89, 38, 82, 82, 82,238, 61,123,246,172,123,131, 6, 13,194, 54,109,218, 20,231,234,234,202, -140, 31, 63, 30,159,126,250, 41, 28, 29, 29,141, 27, 54,108,136,105,219,182,237,227,136,136,136, 46, 74,165,242,145, 57,239, 2, -105,105,105,183,118,236,216,113,167, 83,167, 78,146, 81,163, 70, 57, 30, 59,118,204, 94,169, 84,186, 9,133, 66, 39,173, 86, 43, - 8, 11, 11,227, 28, 57,114,196,229,233,211,167,145,106,181,250, 94,101,203,254, 95,131,162,168,251, 20, 69,157,162, 40,234, 98, -137,207,251,229, 45,179, 96,219,178,254, 46,119,189, 18,197,220, 81, 98, 50,159,225,181,176,120, 98, 61,185,242,214,136, 22, 36, -105,124, 27,146, 60,196,143,220,104,111, 71,198,214,166, 20,163, 42,153,222, 65,165, 82, 21, 78, 71,143, 30, 37, 46, 46, 46, 10, -185, 92,110,113,122, 7, 23, 23,151,228,156,156, 28,210,172, 89,179, 12, 71, 71,199,194, 84, 4,174,174,174,201, 10,133,130,180, -104,209, 34,195,201,201,105, 3, 10, 26,101,187,187,187,199, 18, 66,136,167,167,103, 66, 89,122, 6,131,129,184,184,184,152,122, -232,241,236,236,236,126, 8, 12, 12,204, 72, 78, 78, 38,174,174,174,133,169, 19, 28, 29, 29,215, 52,111,222,188,228,252,138,202, - 27, 27, 23, 23, 71,226,226,226, 72,245,234,213, 19,138,206,143,142,142, 38,209,209,209,196,221,221,221,226,244, 14,142,142,142, -171, 75, 41, 75,165,202,232,225,225,145,172, 82,169, 72,171, 86,173,138, 29, 83, 15, 15,143,100,181, 90,109,154,111, 86,122, 7, -177, 88, 60, 65, 36, 18, 37,136, 68,162, 4,161, 80,184,188, 70,141, 26, 41,135, 14, 29, 34, 27, 54,108, 48,117, 73,135,163,127, -223,150,117, 90,141,254,202,209,191,223, 23, 85, 73,239, 32,151,203,255,112,113,113, 81, 28, 61,122,180,216,245,165, 82,169,204, - 78,239, 32, 22,139,227,242,242,242,152,228,228,100,253,205,155, 55,149, 65, 65, 65,202,199,143, 31, 43, 35, 35, 35, 85,233, 41, - 41,186,228,228,100, 85,118,118,182, 38, 52, 52, 84, 35,145,188,155,244, 14,100,135,119, 29,242,131,239,241,136,165, 94, 79,167, -183,147,168, 31, 45,107, 72,200,255, 62, 34,228,244,167,132, 92,154, 77,238,109, 31, 79, 90,121, 9,141, 55,103, 85,127, 78,182, -249,252,102, 78, 74, 6,178,163,126, 29,242,131,239,233, 23, 75,188,158,142,106,235,166,254,105,235, 6,114,247,238, 93,242,248, -241, 99,242,234,213, 43,114,250,247, 67,164, 85, 45, 73,190,230, 15,190,199, 45, 76,243,208, 90, 40, 20,230,173, 91,183,142,220, -185,115,167, 80,243,248,241,227, 68, 34,145, 40, 1,243,122, 45, 19,128, 34, 63,248,127,104,216,234,115,253,235,174,178,220,244, -147,179, 9,121,180,155,144, 29, 1,132,236, 10, 36,228, 80, 47, 66, 78,140, 38,119, 54, 12, 36,173,189,248,122,178,205,231, 26, -217,238,111,118, 99,123, 30,143,151,115,244,232, 81,146,144,144, 64,174, 93,187, 70,130,130,130, 72,120,120, 56,137,137,137, 33, -167, 78,157, 34, 60, 30, 79,141, 74, 12, 91, 22,232, 12,207, 46,117,249,137,161, 43, 91, 19,114,108, 40, 73,221, 55,156,244,174, - 39,207,104, 81,189, 74,249,232, 26,217,219,219,167,157, 58,117,138, 68, 70, 70,146,171, 87,175, 18, 39, 39,167, 52, 0, 1,239, -250, 7,177, 75,151, 46,119, 9, 33,193, 61,123,246, 12, 6,112,182, 75,151, 46,193,175, 95,191, 14,110,222,188,249, 29,148,159, -250,161, 76, 58,119,238,172, 35,132,144,158, 61,123, 18, 0, 9, 93,186,116, 33,175, 95,191, 38,205,155, 55,215,190,165, 98,115, - 0,140,230,241,120, 63,217,217,217, 93,182,181,181,189,196,225,112,118, 0, 24,129,202,231,227,226, 0,112, 3,224, 15,160,105, -193,228, 87, 48,143,237,113,248, 31,161, 48,189,131, 57, 12,244, 66,235, 49,181,168,171,195,106, 34,119,104, 77,228,125, 82,155, - 50, 39, 97,105,151,178,140, 22,195, 48,228,249,243,231,164, 99,199,142, 10,169, 84, 26, 15,243, 19,150, 22,211,116,112,112, 8, -114,114,114,122, 35,137,102,145,249,197, 18,150, 58, 57, 57,221,114,117,117, 77,118,116,116, 12, 41, 77,211,193,193, 33,200,213, -213, 53,217,193,193,161, 88,114, 79, 14,135,211,211,193,193, 33,190,228,124, 46,151,219,201,201,201, 41,182,228,252, 50,246, 29, - 46, 46, 46,177, 9, 9, 9, 36, 53, 53,149,120,120,120, 36,148, 52, 96, 73, 73, 73,197, 12,152, 57,154, 21,149,165,156, 50,150, -170,105,198, 49,173,204,121, 55,225, 93,173, 90,181,148,181,107,215, 18,153, 76,150, 82,116,129, 79,187, 79, 22,220,125,145,151, -243,233,156, 31, 14,149,146,176,212,220,228,160,221,165, 82,105,124,199,142, 29, 21,207,159, 63, 39, 12,195, 16,134, 97,202, 50, - 90,165,105,246,104,218,180,105,122, 90, 90,154, 49, 55, 55,215, 16, 27, 27,171,121,253,250,181,106,217,178,101,186,212,212, 84, -117, 94, 94,158,246,225,195,135, 26, 87, 87,215, 84, 0, 61, 44, 61, 71,149,253,237, 42, 89,125, 70,182,251,181, 38,219,252, 78, -133, 47,242, 12, 27, 29, 40,213, 4,175,237, 73,200,165,217,228,206, 15,159,146,150, 94,130,124, 67,180,221,247, 12,249,217,187, - 29,217, 88, 75, 96,150,230, 79,181,219,146,237,190,103,158, 46,244, 12,251,168,137,163,118,255,238,237,228,229,203,151,228,248, -145,125,164, 69,205, 2,147,181,205,239, 60,249,193,175,163, 57,154,165,153,173,157, 59,119,146,151, 47, 95,146,223,126,251,205, - 92,147,213,165, 52,163, 53,175,139, 44,235,211, 64,145,102,104, 35,129,182, 95, 0, 95,215,173, 14,223,208,202,147,107,108,232, - 74, 51,126,142, 32,221,124,196, 26,178,205,231, 26,217,230,215,221,220,114, 10, 4,130, 24, 20,201,169, 83,114, 18, 10,133,169, -229, 24,173, 46, 21,154, 45,111, 97,226, 31, 75, 59,145, 62, 13,228,233,102,154,172,138,174,165, 70, 14, 14, 14,105,187,118,237, - 34,206,206,206,169,102,154,172,191,252,250,180,182,182,222,155,151,151, 23,124,238,220,185,224, 46, 93,186, 4,239,221,187, 55, -248,198,141, 27,193, 18,137,100,175, 41, 56, 81,210,108,249,189,249,252,239, 82, 34,162, 21,156,155,155, 75,206,157, 59, 71,186, -116,233, 66,246,238,221, 75,110,220,184, 65, 36, 18, 73,112,101,203,249, 87,236, 59,171,249,159,102,124, 41,147,101, 70,235, 45, -158, 8,162, 86,171,201,172, 89,179,180, 34,145, 72,201,231,243, 45, 29,130,231,189,190, 8, 29, 28, 28,110, 57, 59, 59, 39, 59, - 59, 59, 23, 51,123, 69,231, 59, 56, 56,132,252,203,111, 64,111, 62,159, 31,205,227,241,138, 15,193,227,223,183,101,237,214,163, -230, 59, 7,244,253,160,138,229,228,243,249,252,121, 34,145, 72, 57,107,214, 44,109, 94, 94,158, 37, 70, 11, 0,186, 74, 36,146, -248, 61,123,246,168, 94,188,120,161,207,200,200, 48,220,189,123, 87, 31, 20, 20,164, 93,188,120,113,174, 68, 34,137, 71,217,105, - 9,254,150,227, 73, 54,214, 18,152,204,214,163,249,158,225,125,234, 73,116, 59,102,118, 35, 45,107,148, 48, 89,101,103,114, 47, - 93,179,192,108, 61,248,218, 35,188,163,183,204,176, 98,254, 12,210,162,166,184,184,201,178, 64,179,164,217,146, 72, 36,185,139, - 22, 45,178, 36,146, 85,220, 16,254,228,227, 65,182,251,238,205, 55, 81, 21, 76, 63,248,252, 72, 54,251,120,252, 83,238,163, 64, -103,120,118,246, 22, 62,177, 32,146,101, 78, 57, 27,217,218,218,134, 89, 16,201,250, 59,246,189,219,196,137, 19,131, 95,191,126, - 29,252,234,213,171,224, 27, 55,110, 4,127,248,225,135,193, 0,186, 21, 89,167,208,108,233,250,247,215, 52,162,233, 25, 21,104, -126, 60,113,226, 68,242,250,245,107,242,234,213, 43,114,227,198, 13,242,225,135, 31, 18, 88, 54,124, 15,107,138, 88,163,245, 78, - 34, 90,127,245,128,159, 93, 0, 92, 44, 58, 67, 36, 18, 37,171,213,106, 71,153, 76,246,123, 94, 94,222, 84,228,119,139,172,146, -230, 95, 81, 78, 86,243, 95,161,233, 42,147,201, 54,229,229,229,125, 40, 18,137, 82,213,106,181,179, 5,154, 54, 66,161,112,134, - 72, 36,234,168, 84, 42,189, 1, 64, 42,149, 62,215,104, 52,151, 85, 42,213,122, 0, 89,239,122,223,201,198, 90, 2, 8, 4, 77, - 65, 48, 55, 56, 70, 81,115,197,185, 12,207,153,157,108, 99, 90,213,150, 70,130,199,124, 7, 74,115,143, 26, 19,173,177, 88, 83, - 76, 53,135,145, 55,247, 94,148,178,198,119, 23,114, 61,191,232, 40,139,105, 85, 75, 22, 3,130,239, 32, 84,222,182, 84,179,164, -217,146, 74,165,123, 20, 10,197, 56, 0,151, 45,221,119,114,216,143, 15,133,190, 26,244,156,122, 32,229, 12,225, 67,136, 18, 52, -231, 49,146,144, 76, 45, 14,211,177,247,209,223,174,217, 77, 38,147, 13,247,245,245,173,245,244,233,211, 87, 74,165,242, 87, 0, -231, 75,172, 67,249, 2, 29, 37, 92,110, 67,149,193,112, 45, 12, 8,170, 64,243, 99,153, 76,246,133,175,175,111,192,211,167, 79, -159, 40,149,202,181, 0, 14,176,231,232, 95,165,249,175, 52, 90,127,123, 22,101,211,143, 93, 94, 94, 30,123, 6, 88,254,106, 18, -243,242,242,250, 23, 92,119,150,110,155,165,209,104, 22,106, 52,154,133, 40,104, 63,146,153,153,249,143,106,180, 74, 77,123,165, - 37, 27,107, 5, 65, 32, 88,217,196, 67, 60,245,232, 68,177, 18,132,138, 3,143,217, 80,129,201,170, 72,243, 30,196,250,149,205, - 61,197,159,255, 54, 65,172, 4, 65, 18, 8,214, 87, 96,178,204,229,166, 66,161,168, 89,233,125, 30, 20,166, 3, 16, 73,128, 40, - 44, 46,231, 69,113, 49, 8,197, 54, 50,126,151,156,207,203,203, 59,127,239,222,189,114,127,131,194,129, 75, 48,152,221, 25,224, - 64, 94, 94,222,129, 10, 52, 89, 88,254,113,112,217, 67,192,194, 82,241, 75,201, 63,181, 96,212,180, 87, 90,114,216,239, 62,210, - 56,179, 64,163, 38, 96,136,134,194,144, 68, 77,139,214, 86, 81,243, 46,210,168,233,224,192, 27, 2, 67, 4,242,180, 73,212,164, -104,237, 63,102,191, 1,130,197,172,145, 98, 97, 97,249,199, 48, 30,197,123, 26, 22,254,207, 26, 45, 22,150,247,156,130, 40, 79, - 92,193,244,143,213,100, 97, 97, 97,249, 15, 26, 46, 80, 40,187, 65,155, 37,117,175,149,105, 20,119,145,213,172,148, 38, 7,128, - 53, 0, 27,228, 15,227, 96,234, 38, 92, 81,154,141, 15, 0,232,217,227,201,106,178,154,172, 38,171,201,106,190, 99,205,138,180, -223,199,182, 95,165,101,134,223,241,174,122, 29,178,154,149,167, 59,123, 60, 89, 77, 86,147,213,100, 53, 89,205,127,169,230,191, - 14, 66, 72,165, 19,177,177,188, 27, 68,236, 33, 96, 97, 97, 97, 97, 97,249,199,209,184,224,211, 21,249,209, 45, 87,211,130,119, -218, 70, 75,108, 95,215, 21, 92,186, 1,197, 16, 95, 0, 32, 52, 21, 14, 3,243, 80,149,254, 34,177,170,218, 50, 55,111, 59, 2, -193, 97, 10,218, 65,121, 9,207, 51,170,170, 87,207,219,170,191,179,131,124,120, 82,122,246,158, 39,207,242,142, 89,178,173,181, -181,167,181,200,206,118,160, 70,167,175, 39,224,243, 99,116, 89, 57, 59, 50, 51, 95,229, 86,162, 24,118,229, 45, 92,188,152, 80, - 39, 19, 67, 40,190, 68, 71,219, 91,241,169, 60,228,145,188, 68, 25,227,149, 21, 73,142, 28, 25, 68, 44, 61, 55, 20,141, 14, 82, -185,188,137, 80, 36,105, 46,145,219,214,101, 8,144,145, 28, 31,165,213, 27,110, 24,181,202, 96,194,224,202,219, 56, 87, 44, 44, - 44, 44, 44, 44,255, 2,163, 21, 2,160, 23,242,219,104, 85,220, 24,222,211,191,205,125,145, 72,236, 5, 0, 12, 33, 96, 8,160, -200,201, 10, 78,122, 21,212, 29, 0, 28,106, 52, 62,199, 19, 89, 53, 97, 72,254,114, 35, 3, 24,116,234,200,156,232,187,205,204, - 41,145,212,209,251,163, 78, 93, 58,247,239,221,187,151, 79,253,122,245,107, 3,192,163,199,143, 34, 78,158, 60,245,236,210, 69, -234,168, 34,245,249,111, 85,217, 99, 2,209, 55, 77,155, 54,106, 19, 20, 20,178, 20,192,228,170, 30, 65,123,123,217,212,243,255, -155,213,174,115,255, 53, 82,192, 50,163, 37,178,179, 29,216,175, 79,143, 70, 95, 78,155, 72,127, 58,235, 91,175,251, 55,175,172, -146,185, 6,100, 17, 70,127, 94,145, 60,228,122,121, 3, 39,151,244,143,101, 25,172, 95, 51,206,210, 27,118,181,180, 85,101, 68, - 12, 33,140,113, 8, 69, 81,224, 8, 36, 71, 28,107,181, 57,100,211, 97,102, 38, 0,179,123,140, 89,185,250,119,113,114,117, 63, - 58,228,147, 25, 34,137,181, 51, 23, 28, 62, 0, 10, 9, 81, 97,184,116, 96,133,237,231, 75,118, 54,190,249, 48,218,240,199,255, -182,168, 41, 62,175,191, 50,241, 41,155, 75,133,133,133,133,133,229,191,204,169, 2,115,117,170,228,130, 50,141,150, 72, 36,246, -186,115,229,164,221,111, 55, 98, 1, 0, 93, 26,187,224,171,101,155,186,237,221, 24,244, 12, 0, 90,118,234,237,189,116,222, 52, -220,122,146, 2, 66, 8, 26,213,177,199, 7,253, 6,153,103, 60,156,253,154, 13, 28, 56, 96,216,172, 89, 95,244,125,249,242,101, -212,254,253,251,175, 3, 64,219,118,237,234,124,251,237,183,131,215,216,218, 9, 15, 30,249, 95,188, 58, 57,236,126,101,246, 86, -228, 86,171,154, 79,221,154,195, 15,254,188,137,238,208,125,192,208, 40, 40, 86,168, 19, 94,197,155,179,173,131,131,195,116, 30, -143,103, 13, 0, 12,243,167,255,209,233,136, 11, 0, 24,140,140,220,214,205, 39,151,195, 23, 25,133, 66,254,211,220,188,188, 61, - 57,241, 97, 63,149,167,169,209,235, 3, 62,159, 52,134,126,240, 42, 29, 94, 1,109, 57, 27, 86,124, 13,198,168,183,157, 49,111, -217,192,160,187, 7,161, 72,198, 85, 51,119,141, 87,114, 70,181,106, 45, 56,223,172,144,117,165, 40,140,246,108,249,201,135, 75, -119, 31,225, 53,173, 99, 5,141,158,193,153,224,244,150, 63,172,255,102,245,205, 31,122,157, 0,176, 29,192, 31, 0, 42, 52,117, -118,246,118,191, 78,159,191, 94,166,208,254,153,166,168,192,100,225,199, 61,135, 17, 26,203,192,215,199,151,235, 50,125,149,108, -251,178,241,187,149,249, 99,119,177,176,176,176,176,176,252, 87, 73, 68,241,222,134, 59, 42, 52, 90, 0, 32, 19,115,241,236,117, - 18, 0,192, 70, 12, 76,157, 48, 10,233,105,169,222, 90, 3,131, 79, 70,141, 64, 72,120, 34,158, 69,166,130, 16, 2,111,119,137, -217,165,225,128,105,250,201,216, 79,218,159, 59,127,254,222,130,249, 11,126,161, 40,220, 6,128,237, 59,126,108,185,112,209,194, -113, 35, 70,141,232,122,228,200,145, 39, 0, 42,101,180,184,148,124,211,234,149,203, 5,113,105,106,245,244, 89,115,153, 47,102, - 78,223, 0, 96,128, 89, 78,134,199,179,142,139,139,147,209,116,241,230,107,223, 45,159,123,173,107,255, 53, 47,162, 98,178, 30, -156, 59,126,188,153,191,191, 63,226,226,147, 90,175,250,126, 91,195, 51,231,196, 99,114,115, 84,253,149,105, 97,165, 14,218, 44, -228,241,158, 44, 89,245, 67, 35,198,166, 14,253,213,184,158, 8,168,237,134,248,148, 44,180,235,222,151, 27,124,255,126, 55,192, -108,163, 85, 50, 65,227, 64, 45,147,210,240,219, 61,119, 59,127,216,202,173, 41, 77,115,144,167,210, 35, 53, 91, 3, 35, 3,180, -245,179, 70,143,189,223,115, 51, 20,250,143,150,253, 47,246,163,219, 27,123, 39,171,179, 19,166, 0, 56, 90,254,215, 16, 59,119, - 39, 43, 60,139,205, 45,213,100, 41,212, 6, 0, 0,159, 99, 4, 5, 98,207,222, 95, 44, 44, 44, 44, 44,255,113, 74,237,117, 8, - 20,140, 74,126,242,228,201, 82,219,239, 24,141, 4,207, 34, 19,241, 44, 50, 17,247,194, 83,161, 35, 60,108, 88,181, 4,107, 87, - 44, 66,134,138,198,111,183, 98,241, 60, 50, 9,207, 35,147,144,150, 89,106,166,247, 98, 85, 74,107, 86,136, 27,175, 95,111,181, -186, 91, 59,105, 7, 59, 91, 91,219, 23, 79,126, 81, 44,156,153,236,183,228,243, 88, 62, 79, 43,140,147,202,164,173, 14, 31, 62, -228,239,236,232, 36,149,201,228,179, 37,213, 26,238,180,182,110, 96, 93,158,102, 73,196, 78,190,125,251,246,234,209,201,197,197, -153,153,184, 33, 56,188,158,159,175,190,110,157,186,173,197, 78,117,251,150,179, 89,161, 38,195, 48,160,105, 26,201,201,201, 72, - 72, 72,192,235,215,175,241,252,249,115,196,198, 70, 37, 51,132,240,140, 96,104, 87, 87,119,112,185, 2,120,213,240,196, 15, 27, - 86, 72,150, 45,254,170,185, 72, 42, 56, 86,194, 8, 21,106,170, 51, 50,143,156, 62,123, 62,254,204,254, 31,140, 0,144,146,153, -135, 75,247, 95, 34,228,105,172,165, 39,178,100, 10,135, 26,241,209, 47,115, 12,145,167, 56, 75,191,254, 34,246,198,141,155, 81, -217,185, 90,228, 42,117, 80,170,245,208,104,141,208, 27, 25,120, 58,138,240,251,220,122, 56,126,249,161, 51, 69, 81,235, 43, 58, -158, 26,141,222,216,198, 87,138,161, 29,171,195,215, 93,138,248,103,183, 49,125,254,122, 4,189,214, 32, 51, 51, 11,122, 69, 26, -152,188, 56,164, 69,134,192, 96, 52,146,138,206,251, 91,130,213,100, 53, 89, 77, 86,147,213,252, 23,107,150,229, 69,222, 19,118, -148, 50,161,208,104,149, 69, 68,108, 6,158,189, 78, 66, 19,223,106,168, 93,195, 21,247,158,103,226,215, 75,177,216,121, 46, 26, -151, 66, 83,193,112,229, 72,202, 1, 94, 68, 37,227, 69,116, 90,133,249,179, 57, 66,222,144,207, 63,207,158, 85,223, 63,167,197, -149, 51, 83, 81,205,241,133,255,156, 57, 89, 83, 57, 66,222, 16,219,234,242,253,115,103,205, 24, 46,151, 72, 4, 90,141, 22,181, -106,122,138,166, 77,153, 58,134,178, 21,238, 55,119, 47,229,213,252,108,133, 98,241, 79,203, 22,207, 22,174,255,237, 69,140, 66, - 11,197,209,219,201,175,190,152,187, 48,131,203, 19,253, 32,175,230,103,107,174,150, 94,175,135, 70,163,129, 86,171,133, 78,167, - 67,124,108, 88,223, 63,126,251,178,123,205,234,118,221,133, 34, 17, 8,128, 28,149, 1,175, 19,149,232,216,185, 43,167, 73,227, -198, 1, 50, 87,191,177,165,105,101,103, 71,103, 51,132, 35, 63,249,251, 62,206,161, 11, 15,240,203,201,251, 56,118,249, 1,238, - 93, 61, 99, 32,140,190,112,252, 47,153,107, 29,111,153,107,253,104,153, 91,131,228,194,169, 90,189,160,114,143, 41,135, 38, 29, - 59,119,185, 56, 97,242,180, 43,202,220,244,148,159, 54, 45,137, 79, 77,136, 10, 19,242, 41,131, 68,200, 65,158,218,128,221,127, - 36, 96,224,138, 80, 60,141,201, 3, 33,164,194, 1,188, 25, 96,230,144,177, 95, 26,245, 58, 29,124, 60,100,216,183, 99, 37,250, -118,108,136, 78,245,109,209,172,182, 20, 18,174, 6, 79,194,159,225,192,190,221, 6,134,161,191, 96, 95,100, 88, 88, 88, 88, 88, -216,136, 86,225,228, 90,116, 65,153, 85,135,106,181, 42,114,192,144, 17,112,117,114,145,245,235, 48,154, 31, 28,145,133,212,196, -104,188,124,254, 24, 74,181, 30,124,219,154,128,200, 5, 53,188, 60,241,240,217, 49,221,198,213,167,242, 24,131, 38,178, 44,189, -190,125, 93,221, 95,134, 83,244,234, 85, 30,119,158, 63,203,108,178,111,254, 46, 12, 27, 38,115, 88,189,202,227, 78,212, 43, 41, - 45, 17,145, 86, 99, 70, 13,165,104,138, 96,206,156, 89,232,215,187, 7, 62, 25, 51,146,218,179,103,119,139, 44, 51,247,146, 1, -111,243,188,175,151, 8,146,179, 12,218,123,207,243, 52, 18,169, 88,124,243, 69,158, 34,192,203, 67,220,179,255,232,132, 83,135, -127, 90, 15, 96,148, 57, 90, 38,131,165,215,235,161,211,233, 0,192, 8, 0, 52,157,255,153,158,171, 69, 74,150, 6,201, 89, 26, - 24,140, 12,250, 15, 25, 37,190, 31, 20, 58, 10, 64, 25,237,181, 24, 70,111,208,227,232,133, 16,196,223, 63,194, 80, 52, 39,187, - 72, 99,120,200, 92,235,120,187,184,120, 92,235,221,127,164,163, 64,148, 95, 13,155,171,208, 96,207,182, 85,229,150,147,166, 40, -194, 24, 13, 89, 6,189, 94, 81,171,102,173,120, 95,255,134,162, 27, 87,206,245,189,121,241,104,158,161,214, 72,155,136,168, 68, -112,120, 66,112,248, 34,104,116,230,189, 44, 36,191,188,179, 5, 0, 53,246,179, 89, 27,102,124,249, 21,103,230,198,235,208,170, -149,208,168, 20,200,201,206,132,152,171,199,147, 91,199, 13,196,168,159,161, 72,124,176,133,189,191, 88, 88, 88, 88, 88,254,227, -148, 28,126,167,112, 94,153, 70, 43,250,233,141,102, 0,224,221,180, 91,186, 76,196,181,227,210, 20,146,227, 34,176,103,205,116, - 48, 12, 65,207,113,171, 33,247,114,129,152,207,129, 38, 47, 61, 47, 35,226,106,185,109,117, 40, 74,223,117,203,246,120,175,207, - 38,213,178,218,183, 47,143, 7, 0,251,246,229,241, 38, 77,172,110,181,117,123,164, 87, 96,155, 38, 32, 70, 35,122,247, 27,128, - 33, 31, 15, 65, 84,146, 18,255,187, 22, 3,133, 74,107, 86,111, 57,177,131,111, 67, 7,123,199, 30,159,143,238, 33,229,114, 40, -170,174,167, 53, 39, 54, 85,111,224,112,120,198, 19,247,179, 19,250,247,255,216,225,210,233, 67,157,140, 14,190, 13, 85,105,225, -161, 21,233,105, 52, 26, 24,141, 70,104, 52, 26,232,245,122,216, 57,212, 60,221,117,192,154,184,196,164,220, 83, 73,153,234, 64, -133,222,128,228, 44, 13, 82,178, 52,200, 82,232,224, 34,183,133, 65,175,173, 95,150, 30, 33,228,151, 15, 7,140, 24, 9,128,166, -104,195,174,188,196,240,231,249, 75,254, 52, 89, 61,250, 13,115,188, 22, 28,129,151, 65,103, 50, 9, 99,200,207,226, 78, 49,113, -229, 31, 87, 16, 14, 5,134,207,165,244, 28,154,102,116,186, 60,189,147,147,227,165,171,151,206,246, 81, 27, 94,129,195, 23, 22, -174,171,210, 26,205,190, 98,146, 95,222,217, 12, 0,223,111,220,176,182, 85,215, 97,252,171, 33,145, 80,233,129,150,141,189,241, -251,193, 31, 53,132,232,191, 84, 36, 62,216,204,222, 91, 44, 44, 44, 44, 44, 44,197, 12,214, 41,228, 55,142, 47, 30,209, 50,213, -141,246,238,221,187,100,131,107,196, 39,103,192, 94,198,133,163,155, 23,134, 79, 95,139, 95,214,207,132,209,168, 7, 33,128,193, -104, 94,102, 2, 66,120, 23, 38, 79,242,242,173,225,197,113, 28, 62, 76,162,250,117,159, 82, 60,124,152, 68, 85,175,190,125,246, -228, 73, 94,145,185,106,143,214, 6,163, 17, 55,159,164,224,113,100, 54, 30, 71,229, 64, 38, 54, 63,205, 23, 71,192,159,180,106, -229, 10, 62,151, 67, 81, 79,162,243,242,226,210, 13,121, 28, 30, 79, 39, 17, 11,136,150,112, 53, 81,105, 36,189,243,135, 99, 84, - 39,246,126, 63, 22,192,148,178,116, 76, 61, 13, 77,145, 44,211, 39, 33,132, 80, 0,195, 80, 70, 99, 92,154, 26,121, 58, 61,146, - 51,255, 52, 90,148,161,236,154, 83,153,107, 29,111, 43,185,236, 44,135,195, 17, 18, 2,232,117,134,193,112,173,211, 61, 47,241, -229,243,162, 38,235,206,147, 4, 68, 60,184,152,108,212, 41, 71, 40, 83,158,253, 97,238,190, 83, 20, 8,135, 3,134, 67, 83, 12, - 69,129,225,209, 68, 11, 66,152,146, 37, 82, 90, 96,180, 76,102, 75,192,227,204, 63,127, 96,189,211, 39,189,252,112,240, 90,190, -231, 83,231,166,230, 40,226, 89,147,197,194,194,194,194,242,118, 41,207,139,188, 71, 81,173, 55, 35, 90,229,237, 16, 33,192,139, -232, 52,212,112,119,132,123,141,218,120, 30,246,240,207,101, 0, 12, 70,243,170,163,142, 31, 79,140, 91,187,214,138,153, 57, 51, -187,229,170, 85, 30,183, 39, 77,172,110, 93,175,190,125,246,236,217, 49, 45,215,173,179,190,125,225, 14,207, 72, 10,242,117,153, -114,115, 89, 54, 70, 16,221,188,161,127, 77,206,146,125, 47, 98,254,120,148,155,194,231,243,245, 46,182, 34, 74, 46, 19,112, 56, - 52, 79,160,209,211, 26,239,128,198,156, 19, 52,213,184, 60, 21,147,209, 42, 89,117,152,158, 26,209,247,252,255,102,213,235,240, -225,106,187,248, 84, 21,178,181,156,194,170, 67, 14, 77,225, 81, 88, 52,192,225, 63, 46, 77,211, 74,110,119,110,255,175,191,120, -172, 91,181, 28, 58,131, 17,147,103, 46,192,152, 81, 35,206,193,181, 78,119, 15, 47,159,224,235, 39,118, 73,186, 79,252, 1,209, -207,130,146, 12,154,156, 3,150,152,172, 66,179, 5, 16, 35, 97,232,140,204, 28,153,198, 0, 17, 74,241,125, 26, 29, 83,169, 43, - 39, 79,101,192,137,187, 73, 56,249,219, 1, 88,203,165,236,147,128,133,133,133,133,229,173,243,158,154, 43,148, 48, 87, 64, 89, - 17,173,242,240,116,119,198,221,199,145,168,239, 91, 19,214, 86,114,132, 71,196,129, 67,243, 64, 83,128,222, 96,190, 25, 34, 58, -253,193,117,235,172, 17, 29, 41,165,183,254, 16,233, 53,121,146, 87,228,186,117,214,183,137, 78,127, 16,192, 8, 66,242,199, 5, - 50, 37, 72, 53, 90,224, 11, 8,163,175,238,108, 39,225, 4,189, 82,164,211, 52, 71, 99,111, 45, 98,236,173,133,180,189, 92,192, -227,243, 56,140,129,208, 58,119, 39, 47, 53, 97,152,134,230,232, 21,173, 58, 52, 26,141,160, 40,218, 88, 96,196,164,177,233, 42, -100,171, 57, 72,206,210, 32, 51, 87,135,186,213,164,184,120,233,136,210,168, 87,237, 43, 77,139,195,227, 91,215,246,114,199, 87, -223,172,131, 74, 99,196,139,248, 60,240,133, 66, 23,103,151,128,208, 17,159,205, 21, 78,219, 17,129,177,157,236, 49,243,122, 68, -188, 50, 89, 52,215,146, 51,107, 52, 26,161, 82,107,249,201,105,153,182, 57,185, 10, 43,177, 72,168,114,180,179, 78, 43,109, 93, -181,133, 17, 45, 19, 18, 17, 23,125, 90,184, 64,173, 27, 10,149,198,128, 91,127, 28,101,159, 8, 44, 44, 44, 44, 44, 44,127,178, -163,172, 5,102, 25, 45,153, 68, 4,194, 17,225,122,112, 4,124,252, 27, 96,247,241,123,168, 83,191, 5, 18,115, 13, 32,160, 43, -236,109,104, 98,214, 60, 85, 8,128,144,190,125, 37,238, 31,125, 84,173, 43, 33,188, 11, 63,108,207,137, 3,128,154,245,242,101, - 24,134,128, 16,128, 48,249,134,203,108, 40,110,116,100, 98, 78, 13, 47, 23, 41,158,198,233, 52, 82, 33,159,182,149, 10, 56,142, -214, 2, 62,159,203,133,145, 80,154,196,196, 8, 13, 5, 68,153, 35, 87,178,234, 80, 34,115, 61,221,249,195,213,169, 81, 49,217, - 65,117, 51,148, 13,179,117, 2, 16, 2,212,173, 38,197,227, 59,167,140,201,241, 47, 95,168,146,159,109, 43, 77,139, 97,192,209, - 25, 24,132,190,202, 70,150, 66,143,172, 60, 29, 90,119,236,195,111,221,165, 47,174, 63, 78, 3, 99,208, 99,213,143,167,114,141, - 68, 63, 4, 8,211, 91,176,211,244,221,144, 39,238,169,153, 10, 33,143,203,205,242,173,227,249, 90,192,231, 25,114,114,114, 4, -197,215,226, 64, 42, 22, 32, 35, 79, 15, 0,122, 75,175,158,108,133, 30,199,239, 36,225,196,209,253, 16,139,197, 32,236, 13,197, -194,194,194,194,194, 82, 20, 87,228, 15,191,115,170,224,179,208,124,153, 53,168,180,145, 33,112,176,183,131, 72,106,133,200,100, - 29,114, 41, 39,100, 42, 9,140,198,252,136, 86, 57,129,167, 82, 71,247, 62,126, 60, 49,238,216,177,180,157,199,143, 39, 22,105, -232,253,103, 36,171,240,147, 33,102,107, 82,196,120,241,248,153, 43,217,125, 3, 29,109,105, 14, 71,197,231,209, 26, 46,159,163, -227,115,105, 61,159, 75,107,157,173,120,156, 43, 39, 14, 8, 8,133, 43, 21,105,170,213,106,116,233,210, 5, 61,123,246, 68,191, -126,253, 48,104,208, 32,120,123,251, 57,209, 28, 74, 75, 40,134,113, 20,228,162,182, 35, 5,174, 58, 22,127, 28,248, 78,249,248, -230,239,161, 70,141,186, 15,138, 91,206, 63, 53, 9, 97, 50,178, 53, 80,235,140,200,204,211, 33, 83,161,131,193,177, 37,126,191, -149, 0,149,214,136,232,224, 35,170,212,164,184,233,154,148,151,145, 21,156,138, 57,197,255, 37,113,159,126, 50, 42, 85, 46,162, - 95,182,109,213, 44,213,193,222,206, 64, 81,127, 70, 94, 41,138,130,200,202, 9,182, 54,114, 68,134,156,193,249, 85,157, 85, 0, -190, 54,231,120, 22,197, 74,194, 69,223, 64, 23,244,233, 63, 20,245, 91,116, 55,199, 88,179, 35,218,179,154,172, 38,171,201,106, -178,154,255, 37, 76, 99, 28,154, 62,205,203, 12,111, 50, 64,181, 92,165,168, 83, 77, 10,181,206, 9,106,173, 17, 10,181, 17, 57, - 74, 29,114,148,122, 68, 38, 41,241,248,120,213, 75,152, 31,197,202,207,248, 73, 8, 0, 42,223,224,153, 27, 61, 17,232,180,223, -172, 93,245,237,224, 3,141, 27,105,167,245,114,173,254, 48, 82,155, 64, 81,180,138,230,112,245,118,114, 46, 47, 60,252, 97,234, -237,107,167,219,137, 12,198,145,202,114,116, 12, 6, 67,118,181,106,213, 0, 20, 31,130,199,175,182,184,223,205, 83,115,106,182, -239,187,202,113,253,242, 89, 74,154,195,103, 40, 46,255,177, 81,175,218,175, 74,126,246, 3,202,177, 31, 52, 95, 20,118,247,193, -211, 22, 54,118,213,241, 50, 94, 1,133,218, 0,157,129,129,173,140,143,184, 71,231,116,145,225, 65,135,242, 18, 30,238,174,196, - 97,219,247, 60,236,177,123,143, 30,221, 7,180,104,209,146,179,112,225, 2,248,248,248, 64,165, 82,129,166,105, 84,175, 81, 27, -145,207, 31,224,206,169,111,140,202,244,168,109, 0,150, 2, 72,181,244, 75,210,114,180, 56, 19,148,130, 83,191, 29, 4,135, 39, - 96,111, 39, 22, 22, 22, 22, 22,150, 55, 25, 95,226,115,135, 89, 70, 75,173, 86, 71,182,233,210, 7, 12, 67, 96, 36, 0, 99, 44, -136, 60, 49,127, 70,159,140,122,117,100, 85, 75,199, 48,198,123,155,119,236,236,217,184,121,123,142,191,135, 12, 57,233, 73,184, -115,243,178, 1, 12,185,109,206,246,233,233, 47,242,196,206,117, 6, 12, 30,248,209,225, 81,159, 76,204,106,215,177,163,212,201, -201, 69, 19, 23, 31,167,252,121,239,175,250,115,167,143,181, 99, 96,248, 56, 61,253,101, 94,121, 58,217,217,217,223,151, 54, 95, - 40,144,181, 6, 80,147,195,165,180,170,212, 23, 22,181, 8, 79,139,143,237,255,237, 55,139,163,134,141,155, 33,168, 85,173, 54, - 82,178, 57,136,140, 75, 66,248,181, 99,154,248,231,247,127,203,137, 11, 25,107,166, 84, 98, 41,243,226, 0,172,191,115,231,118, - 64,143, 30, 61,186,119,234,212,137,140, 31, 63, 30,132, 0,127,236,152, 68, 50, 34,239, 28, 65,126, 20,235, 85, 37,207, 75,244, -181,219, 15,236, 6,181,107,202,181,151,143,197,206,131,167,245, 32, 76, 52,123, 63,177,176,176,176,176,176, 20, 82,249, 54, 90, -177, 97,249,249,180,254,106,114,147, 82, 70,236,222,253,203,178, 95,246, 30,104,173,214,106,171, 17,240, 99,141, 6,237,213, 60, - 35, 22,154,171,161, 74,126, 25,100,111, 95,183,222,207, 63,110,254,250,231,157, 91,219,131, 49,250, 82, 64, 20,161,112, 69,164, - 55,142,170,200,100,149,107,150,210,114,183,119, 29,176, 70,149,158,158,247,139,165,219,170,210,159, 37,209, 28, 93,245,237, 27, -190, 89, 77,211,156,110, 70, 35,195, 99,140,250,151, 70,157,250, 59, 85,234,179,227, 48,187,149, 27, 50,202, 89,246, 4,192,147, - 75,151, 46,181,189,116,233, 82,115, 0,223, 35,127, 12,197,160,170,156, 23, 77,122,110,231, 47,103,125,249,199, 23,160, 60, 25, -134,192, 96,100,162,249, 42,101,103,246,158, 98, 97, 97, 97, 97, 97, 41,100, 60,222, 76, 90,106, 94, 68,235,239, 34, 51,243, 85, - 46, 50, 49,173,170, 58,233,233, 47,242, 0,188,209,115, 79, 89, 69,221,199, 47,114,254,135, 23, 57,255,171,236,246,138,148,215, -169,192,235, 81, 85, 44,134, 57, 13,217,175, 23, 76,111,133,180,180, 48, 5,210, 16,200,222, 67, 44, 44, 44, 44, 44, 44, 22, 27, - 46,243, 26,195,179,176,176,176,176,176,176,176,176, 84,104,178,138,126, 2,200,111,123, 94, 86,207, 1, 75, 70,230,174, 76,239, -131,139,172,102,149, 53,121, 0, 4, 0,100, 0, 42,170,210,236,142,130,241, 26,217,227,201,106,178,154,172, 38,171,201,106,190, - 67,205,138,180, 47,226, 95,130,101,137,215, 43, 7,219,245,149,213,100, 53, 89, 77, 86,147,213,100, 53, 89,205,127, 59,227, 75, -153, 64, 8,249,231,180,209, 98, 97, 97, 97, 97, 97,249,187,176,183,175, 43, 3, 10,219,245, 86,136,196,193,207, 25, 0,148,105, - 97,201,236,209, 99, 41,133,162,227, 28,190,149, 54, 90, 60,154, 43,248, 82, 34,183, 15,147, 90,219,199,255,199, 15, 46,229, 93, - 67, 58,181,107, 59,175,223,125,106,138,251, 89,178,161,196,209,123,151, 75,237,192, 24,169,147,247, 84,184, 54, 22, 87,165, 16, - 82,167,154,142,178,234, 77,111,202,171, 5,124,240, 23,236,163,208,223,223,191,165,191,191,127, 75, 0,194,183, 33, 40,113,242, - 30,234, 94,167,197, 53,167, 90,141, 46, 75,157,235, 14,124,219, 5,150,185,214,177,151, 85,111,242, 63,153, 91,131, 76,153,107, -131, 28,153,123,147,171,114, 7,191, 90, 21,109, 87,189,239,183,190, 75,246, 63,222, 95,189,239,183,190,165, 45,183,237,177, 81, -190,232,192,139,229,246,125,190,147,177,207,149,202, 81,189,245, 80, 27,215,246, 95,216, 91,186, 93, 53,239, 22, 79,106, 4,180, - 77,113,171, 27,248,216,220,109,220,125, 90,134,120,250,183, 78,118,247,110, 25,196, 30,121,243, 16, 57,214,108, 41,178,245, 56, - 37,180,245, 56, 45,180,171,217,177,170,122,174,174,174, 98, 95, 95,223, 30, 45, 90,180,152,208,185,115,231,207, 27, 53,106, 52, -222,211,211,179, 27,222, 97,103, 44,137,147,247, 60, 13,143, 74,211,240,168, 52,137,147,247,188,138,159,175, 62,203, 40,218,152, - 64,209,198, 4,169,147,207,178,127,202,185, 18, 58,123,123, 74,156,188,215,201, 93,252,239,137,157,234,246,177,116,123, 91, 91, -219,110,142,142,142, 31,154, 38, 91, 91,219,110,236, 29, 80,105, 10,163, 88, 37,254,174,212,133,206,225, 9, 37, 55,134,125, 50, -185,222,202,197,115, 69, 27,118,254,142, 13,203,103, 61,213, 40,178,252,255,137,123,238, 80,179,121, 16,135,230,184, 23,157,103, -100,140,113,105,175,239, 53,125, 27,250, 62, 53,196, 99,191,158, 61, 98,230,208,193, 93, 60,187,244,158, 78, 61,123,173, 58,102, -190, 69, 67,195, 67,255,251,173,250,181, 43,151, 55,238,220,185, 99,105,170,193,103, 29, 79,200,221,156, 19,251, 36,203,146, 50, - 88, 57,214,170,201,149, 58, 92,107,211,111,178, 75,240,197, 95,119, 27,181, 76, 87,101, 90,145,209,191, 43,143, 99,237,218,181, -155,113, 56, 28,251,169, 83,167,242, 1, 96,253,250,245,117,140, 70, 99,122, 68, 68,196,125, 84, 34,249,105,190,193,244, 25,241, -253,234, 37,191,124,240, 65, 79, 36,164, 41,176,106,221,150, 14,103, 79, 30, 26,164, 72,126,113,228,109,156, 19, 27, 27, 47, 43, -240,229,143,166,207, 94,234,212,163, 67, 51, 78,158,218,128,179,215, 30,180,253,117,203,210,123,128, 95,243,220,180,176, 50,115, -138, 49,202,236,249,206, 50,210,131, 81,102, 3,192,208, 55,126,236,101,250, 46,142, 98, 99, 15, 87, 33,247, 65, 58, 80,225,160, -143, 54, 53, 90,159,227, 9,133,158, 52, 77,131,166, 0,154,166,192,161,168,252,113, 66,117,170,232,248,240,235,221,255, 9,247, -137,220,163,121, 18, 56, 92,123,154,250,179,124, 20, 93,240, 73, 72, 78,210,139, 27,246,111,225,107,172,235,213,177, 9,104, 93, - 71,241,243,213,215, 25, 82,110,187,207, 79, 81,132,222, 26,115,125, 93,168, 89, 6, 64, 36,178, 61,113,226,132, 99,143, 30, 61, -172,157, 2,250, 93, 53,103, 27, 1, 39,207,255,228,201,227,252, 30, 61,186, 91,112,125,122,119, 5, 77,239,165, 0, 30,195,144, -245, 28,134, 28,202, 75,127, 30, 1, 88, 54,250,148,216,201,103, 44, 13, 98,246,115,134, 1, 21,164, 74,121,182,179,178, 7,151, - 43,180,234,204,227,243, 63,175,233, 93,191,113,124,212,203, 32, 69, 94,238, 58,131, 38,251,170,197, 66,122,195,151, 23,175, 7, -127,192,229,241,168, 30,157, 3, 57, 26,224,114, 85, 78,186,179,179,243,135,155, 54,109,170,213,178,101, 75, 0,128,193, 96,176, - 58,124,248,176,203, 55,223,124, 35,125,254,252,121,101, 7, 78,173,230,232,232,232, 33, 16, 8,170, 1,128, 86,171,141, 79, 77, - 77,141, 1, 80,225,139,191,212,185,150, 3, 8,150, 94,191,118,141, 11, 0,109,219,182, 91,230,209,102,138, 45,135, 47, 83,149, -122, 56,180,185,210,172,136,203, 51,238,220,189, 77, 1, 64,139,192,150,115, 37, 14,126,155,223,101,100, 75,228,228, 19, 72, 3, - 51, 91,180,237,210,127,200,199, 35,232,128,186, 30,232,214,181,211, 28, 21,112,194,162,107,134,203, 21,223,187,119,175, 54, 77, -211, 28,131,193,160,110,209,162, 69, 76, 85,202,229,230,221,242, 22, 5,186,186,206,160,253, 49,245, 85,208, 50,224,141,129, 99, - 56,214,213, 27,127, 13, 14,119, 28,195, 48,177,185, 49, 65,173,254,133, 17,173, 55,143,179,165, 74, 52, 87,240,249,208, 49,159, -213,155,241,197, 87,162,233, 27, 46,225,212,150,185,105,255, 84,147, 5, 0, 28,154,227,126,238,252, 57, 39,137,128, 3, 0,200, - 83, 27,240, 65,143, 30, 21,255, 34,212,104,126,133,166, 40, 31,211,128, 54, 70,131, 78,196,229, 9,212, 84,190, 65, 2, 5,192, -193,173,198, 37,103,195, 13,201,208,193, 93, 60,247, 30,184, 16, 23, 19,151,110,241, 67,141,226,240,209,162, 93, 55,116,233,218, -221,250,222,221, 91, 75,119,108,251, 97,158, 65,167,255,129,209, 51,235,212, 25, 47, 19, 42,124,152,187,212,109, 34,144, 57,156, -237, 63,225, 27,123, 53,109,135,133,203,191,119,184,118,102,223,213,248,216,134, 76,116,116,172,154, 80,212,211,204,140,196,207, - 21, 73, 17,207,204, 61,100, 50,153,172,150, 76, 38,107,216,160, 65, 3,209,172, 89,179,120, 29, 58,116,248,211,178,143, 31,207, -191,114,229,138,235,154, 53,107,122, 62,124,248, 80,157,151,151, 23,154,151,151,247, 10, 22, 52,180,119,113,113,156, 50,224,163, - 62,232,212,127, 50,140, 12,133,241,159,205,192,185, 51, 71, 39, 2,120, 43, 70, 75, 47,177,250,102,220,132, 89,142, 45,154, 53, -226, 44,221,247, 12, 98, 1, 23,221,155,250, 80, 99,166,206,183,217,185,113,233, 79, 72, 67,251,210, 34, 89,140, 50,123,126, 61, - 7,237,199,125, 91,214,196,241,253,218,143,209,121, 54,104,137,245,178,216,227, 95,133, 3, 64,173, 30, 83,229, 66, 99,234, 38, - 55, 27,142,147,208,152,186,169, 86,143,169, 23, 95,157,221,148, 91, 94, 89,120, 66,161,231,254,125,251,234,218,202,249,224,210, - 20, 56, 28, 10, 92, 14, 13,181,214,136, 65,131, 63,126,107,151,185,216,169,110, 79, 26, 24,147,255,131,141, 93,170,148, 23,167, - 45, 57, 39, 20,135,111,127,242,248,111, 92, 39,107, 33, 56, 28, 10, 28, 26,224,208, 20,162,146, 85, 24, 59,118,140,117, 85, 13, -251, 7,173,157,154,125, 57,196,167,123,139,122,118, 13, 14,222,166,172, 91,124, 48,196, 62, 77, 45, 25,125,224,216,229,143, 73, -219, 25,119, 9, 97, 86,199,221,248,254,124,121, 34, 26,141, 38,185,123,143, 15,172, 40,174, 84,114,241,247,221,237,184, 52, 5, -189,145,192, 96, 36, 48, 22,140,141, 74, 21,188,193,208, 52, 5,194, 16,140, 27, 55, 22,221,123,124,160,100, 12, 76,156,249, 15, - 57,122,239,217,139, 55, 29, 53,122, 6,107, 54,237, 92,170,200, 78, 93,250, 58,220, 62, 42, 47, 59,109,134, 42,229,133,217,227, - 96,208, 32, 77, 99, 95, 61,158,176,239,228, 29,212,243,247,131,145,201, 47,167,143,187, 20,251, 78,221,129,175,143,111,126,185, - 25, 2,239,234, 50, 52,107,218, 12, 0, 42,101,180,184, 66,249,194,246,189, 70, 44,233, 61,232, 19, 56, 57, 58,130, 38,250,222, - 23, 79,237,235,189,107,235,234, 47, 13,234,156, 53, 22,137, 17, 99,225,239, 2, 97,152, 42, 71,157,220,220,220, 28,155, 53,251, - 51, 29,163,193, 96,128,151,151, 23,226,227,227,125, 42,243,158,230,234,234,218,107,209,162, 69, 78, 61,123,246,228,185,184,184, - 0, 0,146,146,146,170,157, 61,123,182,241,162, 69,139, 82, 18, 19, 19, 79,161,156,140, 62, 70, 61,205,167,185,224,136, 68,146, -252,125, 4, 69,207,154, 50,178,129,179,171,155,166,180,245, 83, 83,147, 4,179, 39, 95,166,184, 92,126,193,250,160, 9, 97,168, -114,162, 68, 93,120, 60, 94,169, 53, 20, 58,142, 85, 11,194,179,254,148,230,208,249, 23,171, 65,159,154, 25, 19,226,103, 65, 36, - 46,128, 39,224,255, 48, 96,200, 39,173, 6,246,239, 7, 87, 71,107, 92,188,241, 16, 19,167,204,212, 27,116,250,117,149,122,120, -112, 56,220,148,148,148, 40, 91, 91, 91,151,170,255,222, 82, 53, 47,156, 59,227,116,241,143, 75,115,215,110,216, 56, 73,167, 53, -232, 25, 66, 10,199, 49, 22,139,133,188,174,189, 7, 91, 57,213,110, 33,218,184,232, 83,222,191, 48,162,181,227,173, 24, 45,129, - 88, 62,120,193,236,169,162,111,126,189,131, 83, 91, 38,166, 41,115,210, 28, 11,223, 20,172,108, 66, 20, 57, 89,141, 43, 83, 66, -153,163,119, 75,138,195,157, 64,113, 56, 82,138,166, 4,140,145,137, 53,104,181,203, 84,233, 47, 18,171,186,247, 12, 67,240,191, - 91, 41,150, 25, 32,130, 58,123, 15,254,230,244,127,246,206, 58, 60,138,227,255,227,239, 61,215,184, 39, 36, 1, 66, 66,176, 0, -193,221, 61, 56,197,165, 56,133,210, 66,105,129, 66,177, 2,165, 80,188,180, 64, 41, 80,164,184, 6,119, 43,154, 64, 32, 64, 18, -136,251,197, 46,231,126,243,251, 35,210, 64,163,208,254,190,149,121, 61,207, 61,201,222,237,189,111,118,119,118,247,189,159,249, -204,140,155,189, 0, 58,163, 5,195, 70,140,198,158, 61,123,108, 92,236,248,208, 25,204, 88,179,118,173, 82,149,112,198, 53, 33, - 57, 47,181,107,223,217, 23, 99,227,101,207,146,210,117,135,170, 90, 54,189,209, 2,133,198, 12,141,158,133,128,250,205,176,102, - 93, 29, 97, 82, 98,220,236,221,187,118,204,124,254,156,189,199,202,102, 45,213,165,191, 72, 46,245,164,115,111,208,195,214,193, -233,215,129, 83, 86,216,199,200, 56, 32, 48,226,181,173, 16, 67,199,205,180,245,115, 23, 65, 34,100,219,199, 37,166,122,204,249, -252,243,219,177, 22,210, 92,145, 21, 27, 87, 81,121,170, 87,175, 62, 40, 36, 36, 68,252,217,103,159,113,189,189,189,177,107,255, - 97,223,118, 61, 62,232,155,150,158,233, 77, 8,129,155,171,107,242,164, 15, 63, 56,125,246,236,217,196,228,228,100,238,234,213, -171, 91, 28, 63,126,188, 94, 70, 70, 70,165,159, 76, 45,132, 64,167,183,192, 82,120,131,204,202,215, 87,217,159,122,121,121, 9, - 82, 83, 83,245, 37,162, 12,204,239,129, 66,166, 71,151, 14, 45, 56,219,206,197, 67,165,179, 64, 34,228, 34, 62, 83,131,166,141, -131,152,159, 44,230, 70,165, 9, 78, 24,218,103,161,155,148,244,236,215,170, 38, 92, 29,196,216,249,253, 10,156,186, 27,215, 51, - 83,197, 96, 51, 97, 79,241, 16,112,186, 73,172,233,155, 59, 54,173,229,222,185,137, 47, 30, 54,173,229,126, 51, 44, 42, 90,244, -193,218,143, 83, 85,220,203,121,231,103, 42, 75,191,240,176,224,104,195,195,207, 23, 18, 33, 22,114, 32, 17,114, 32, 17, 20,252, -101,177,152,247,123,170,245,168,235,205,182, 90, 38,176,217,156, 9,195,135,126,224, 57,114,248, 7, 4,108, 22, 14, 31, 61,221, -127,223,190,189,233, 38,163, 97,135,133,197,254,185,172,250,243,198, 14,101, 1,174,118,124,124,190,227, 25,108, 69, 92,216,136, -185,176, 21,115,209,185,161, 11,216,239, 62, 8,140,195,212,254,126,189,167, 14,172,222, 41,208, 71, 26,240,228,117,254,243, 9, -203, 31,109,184, 46,239,244,233,247,235,235, 57,169,228, 6,206,162, 57,147, 56, 41,105,105,157, 14,159,190,209,217, 98, 24, 31, -101, 54,170,191,204,138, 56, 92,106, 84, 56, 37,234,110,176, 87,203, 33, 66,163,202,244,244, 73, 84, 74,173, 60,189, 0,145, 9, - 10, 72,132, 28, 72,139,246,173,144, 3,137,144, 11,169,144,131,180,148,120,228,170,217,183, 83,157, 88,157,112,227,174,185, 42, - 5,215, 25, 45,120, 28,167, 66,245,192,198,240,240,240,132,161,247,168,234,247,175, 30, 61,249,224,198,137,111, 52, 25, 47,191, -172,172,206,254,208,123,152, 55,107, 74, 24, 3,132, 23,222,164,131, 23,173,218,210,100,217,188,233,111,188, 55,103,233,166, 38, -239, 30,201,178, 89,216,121,224, 71, 75,219,117, 27, 8,101,110, 38,126,187,120, 8, 61, 66, 6, 99,212,248, 79, 96,111,239,188, -102,221,242, 47,158,152,245,138,171,127,184,230,186,215,105, 27,212,160,238, 62, 47, 79, 79,111,171,181, 96,150, 15, 66, 0,149, - 50, 31, 95,124, 58, 9, 86, 66,208, 40,184,121,103, 97,187,110,132, 20,206, 6,146,157,147,173,142,122,249,188,171, 78, 22,117, -191,210,251, 82,167, 51,101,101,101,225,241,227,199,136,142,142, 70,100,100, 36,114,114,114, 96,103,103,167, 82,171,213, 85, 10, -222, 55,108,216,112,228,213,171, 87,133, 14, 14, 14,197,111, 26, 12, 6,216,216,216, 96,228,200,145,220,238,221,187,123,245,233, -211,103,236,179,103,207,246, 3, 80,148, 90,158,220, 87,105, 54,110,129, 91, 59,116,236, 48, 13, 0, 68,182, 30,113,155,119,157, -142, 44,247,129,214,206,211,183,117,235, 54,181, 64, 8, 24,144,141,154,156,232,140,114,162, 68,146,123,247,238,249,177,217,108, -206,239,247, 32, 43,126,216,121,176,206,165, 91, 79, 7,173, 90,243,157,208, 86, 34, 64, 86,190, 1, 19, 71, 13,172,244, 61, 88, -228, 22,216,187,117,235,246, 39,151, 45,253,138, 35,149, 72,112,241,126, 44, 62,254,244,115, 93,122,194,179,239,136,149,187, 69, -147, 21, 45,123,207, 91,229,159,210, 61, 46,160,154, 20, 54,253,122, 8,167,142,233, 39, 52,152, 44,144,171, 77,208, 27, 45,176, - 88, 9,242,213, 38, 60, 79, 82,194,217,182,234, 83,185, 17, 66,154, 1,112, 1,144,197, 48,204,195,146,203, 69, 15,116, 69,222, -248,173,229,236,194,251,131, 19, 0, 3, 10,122,234, 23, 87,159,194,229,178,222, 47,250,254,115, 0,117, 11, 53, 45, 0, 30, 48, - 12,147, 87,134,217,250, 67,148,139, 19, 26, 26, 74, 66, 66, 66,138,175,248,111, 47,191,141,128,199,245,148,216,185,128,144, 23, - 40, 57,129,177,171,187, 87,206,119,235, 54, 56,206,248,104, 74,162, 66,158,235, 91,248,246,229,202,220, 44, 56, 12,123, 93,135, - 54, 45,187, 79,251,232, 35, 4,250, 85,227, 89, 44, 22,242, 44, 58,206,180,251,231,157,227,110,222,229,111, 80,164, 60, 91, 88, - 34, 4, 89,165,110,159, 22,171, 37,229,237, 8,150,197,106,121,251,233,246, 15,154, 12, 3,216, 75,249,216,122, 46, 30,132, 0, - 12, 8,236, 36, 92, 28,184,158,130,184,176, 99,138,144, 70, 10,245,200, 85, 75, 58,119,234, 61,243,234,243,215,186, 67, 50,153, -238, 2,128,140,242, 52, 75,191,160, 91,161, 55, 90, 96, 50,155,113,228,244,105,244,236,220, 2,173, 91,183, 64,251,118,173, 57, -143,194, 34,198,127, 52,109,146, 55,126,239,221, 81,172, 41,116,243,111, 38,181,115, 62, 52,104,218,106,155,167, 41,102,112,216, - 64, 77,119, 17, 28,109,120, 48,152, 25, 36,100, 25, 11,207, 28,123,124, 60,103,169,227,188,217,211,206, 42,178,248, 13,128, 23, -198,242,182, 93,163,209,240, 71,143, 30,205, 53,153, 76,198,145, 19, 63,233,158,145,145,213,255,135,141,223, 10, 92, 93,221,160, -209,153, 17, 22,249,170,238,178,101, 75,107,158, 62,127,253,196,146,207,167,158,236,217,179,167,221,193,131, 7,173, 21,237,207, - 55,158, 16, 51,179,191,223,185,239,200,158,245,223,173, 68, 84, 98, 30,126,222,182, 5,196, 98,222, 90,193,174, 42,169, 73, 70, -143, 30, 45, 58,113,226, 68,181,148,148, 20,133, 70,163,201,122, 35, 30,193, 98, 56,153,185, 26, 56,219,240,193,227,176,224,230, - 32,132,171,157, 0, 92, 54,192, 98, 24, 75,105,154, 63, 31, 58,179,220,170,201,199,169, 95, 13,195,119,126,191, 2,227,103, 44, -192,179,108,254,121,150,216,110,249,244,225,131,230,185,136, 44, 61, 61,237, 89,174,157,155, 84,135, 68,200,195,252,153,163,209, - 60, 44,193, 53, 85,110, 93,144,165,101, 55, 94,122,190,120,178,238,203,111, 6, 71, 10, 34, 88, 54, 98, 46,206,239, 91, 35, 83, -231,103,229, 23, 53,201, 25,244,186,196, 74, 86,227,203,165, 60,217,206,107, 28, 84,127,197,180,201, 19, 88,109, 90, 53, 39, 44, - 22, 23,217, 74, 3, 67, 8,240,233,199, 83, 49,125,234, 36,247,228, 52,217,162, 45, 91,182, 46,188,122,137,124,173,206,122,185, -164, 60, 77, 22, 83, 16, 5,146, 10, 57,144,138, 10,140,139, 84,200,129,206, 96, 1,195,128,109,239, 19,156,207, 20, 68,114,211, -114, 19,203,124, 2,127, 67,211,209,167,254,149, 75,113, 54,117,242, 14,229,221,141, 79,139, 92, 30, 22,145,249, 0, 64,174,119, -123,251,177, 70, 51,129, 74,103, 70,124,166, 6,102, 35, 97,198,247,242, 69,141, 33, 76,224,202,157,225,123,206, 69,192,182,196, - 69,255, 13,205,212,123, 71,116, 78, 13, 6, 14, 91,191,105,219,195,239, 86, 44, 96,103,231, 27, 96, 37, 4, 66, 62, 27, 34, 62, -167,240,197,134, 86,157,143, 45, 63,254,148, 97, 6, 51, 8, 55,110,152,171, 82, 63, 97, 37,163, 6,246,110,127,128, 1,248, 12, -139,151,226,233, 91,221,183, 75,223,113,194, 46,253, 70,195, 98, 54,204, 11,187, 69,174,105,100, 81, 87, 42,163,217,160, 94, 93, - 48, 64,184, 90, 22, 61, 21, 0, 36,174,181,183,214, 9,172,211,228,237,247,252,253, 3,155, 84,230,184, 23, 71, 74,133, 54, 51, - 28, 28, 93, 22, 4,214,111,236,154,153,167,103,108,156,170, 33, 62,230, 49,126,253,113,209, 94,171,206,176,244,202,153, 67, 43, - 54,252,124,124,104,151,158, 3,177,243,135,111,231,231,164, 23, 27,173,203, 37,162, 85,163,118,239,216,238,205,229, 11, 96, 50, - 91, 97,178,144,130,191,102, 11,114,115,243, 96, 50, 91, 33, 20,219,192,108,101, 96,178, 88, 97, 50, 91,161, 55,152, 37, 83, 71, -247,249, 72, 7,220, 47,173,156, 94,117, 58, 92,224, 9, 4,190, 4, 5,115,215, 18, 66, 16,159,161,101,121,120,120,236, 7, 0, -129, 64, 0,129, 64, 0,171,213,138,176,168,172, 25,206,129,181,167,161,208,224, 89,140,134, 68,121,194,157, 30,101,109,187,187, -187,123,223,183, 77,150, 78,167,131, 74,165,194,173,187, 15,237,118,236, 57,210, 51, 62, 49,197,207, 74,236,244, 54,174,126, 61, -148,178,216,190,101,237, 79,101,102,212, 71,182, 45, 39,177, 62,155, 62,214,127,211,238,208, 7,175, 46, 44, 47, 55, 79,171, 70, -151,185,134,207,166, 12,110,186,106,227,207, 49,121,119,182,206,170,232, 24,113, 56, 28,110, 86, 86, 86,241,249,189,249,167, 95, -155,134, 71,165, 14,216,176,126,131, 48, 44, 86,137,167,241,105, 24,219,213,167,224, 9,167, 18,199, 93,226,230,231, 92,179, 86, -173,253, 91, 54,174,226,196,164,233,240,253,177, 7,184,122,114,235,173, 12,217,253,158,200, 76,215,190,203, 53,228, 79, 48, 90, -101,106, 94,139,200,134, 74,103,134,222, 96,134,201, 74,160,208,152, 32,147, 27,160,208, 24,161,210,154, 49,182,155, 79,169,223, -171,192,143,184, 48, 12, 19, 74, 8, 9, 33,132,116, 5,192, 47, 90, 46,184,103, 51,161,133,134,236,141,229,121,243,230,125,249, -205, 55,223, 68, 22,173, 91,244,126,209,186,229,189, 95,226,251, 78,243,231,207,111,176,106,213,170,149,173, 90,181, 58,240,219, -111,191,197, 1,200,171,108,243, 33,167,228,198,132,134,134, 86,180,163,253,140, 38,163,192, 86,196, 69,205, 26, 62,248,240,203, -157,206,191,172,154, 32, 19,242, 57,236,115,231,206, 57,230, 24,164, 96,177,216,149,126, 68,145,186, 4,180,230,241,248,103,214, -174, 93,139,225,125,219,137,146,178, 77,170,136, 36,109,166,218, 0,179,171, 75,109,254,242,149,171,164,171, 86,175,153, 30,122, -202, 42, 87,101, 62, 95, 83,122, 19, 95,211, 71,108,166, 68, 14, 22,195,128, 88, 45, 41,121, 9, 15,155, 2,192,251,228, 98,169, -116, 38,176, 11,115,107, 24, 6,208,232,204, 96,179, 25,153, 60,234,208,243,145, 95, 47,239,188,247,192,165, 52,194,178, 87,170, -213,241, 98, 20,204, 57, 88,101,116, 6, 11,244, 38, 11, 34,159,132,161,125,203,122,104,221,180, 14, 52, 58, 11, 52,122, 51,106, -212, 10, 4, 0,231, 82, 15, 28,155, 21, 71, 44, 38, 29, 33, 22,155,144,102, 46,112,181,231,195,195, 65, 0, 1,159, 3,147, 25, -208, 26,172,208, 25, 44, 72,144,105,161,212,138, 16,212,225,131,154, 78, 30,143,244, 25, 9,162, 19,185, 73,143, 6,149,107, 78, - 45, 22,236,222,127,196, 63, 45, 45,179,255,217, 19,251, 4, 89, 10, 19, 34, 18,212,144,201,245, 0,219, 5,139, 87,126, 47,152, - 59,107,242,128,221,191, 30, 77,236,210,174, 69, 98, 85,183, 89,147, 21,181,247,208,225, 35, 91, 67, 66, 6,136, 34,239,159, 69, -204,227, 43, 43,212,178, 42,229,103,177, 26, 53,106,100,158, 60,121,178,114,229,202,149,222,167, 78,157,170,145,149,149,245, 24, -128,201,222,222,190, 78,109,127,223, 39, 23,207,159,243,234, 51,224, 3,110, 74,182, 22,118, 98, 30,124, 93,197,184,123,235,130, -137,207,231,150,154,111, 82,216, 60, 56, 2, 93,190,192,169,187,113, 61, 35,115,132,215, 39, 77, 24,155,120,241,102, 84,206,230, - 61, 23,191,245,146,154, 30, 11,173, 89,155, 31, 53,173,229, 62,239,227,209,248,102,211, 94,220, 8,139,146,169, 89, 30, 43,210, -245,230, 75,101,135,210, 1, 14,155,129,141,136, 11,181, 34, 43,255,117,248,249,218,127, 82,152,122,236,197, 19,123, 89,185, 74, - 19,146,179,117, 76, 90,174, 18, 22, 43,129,189,152, 7,179,149, 64,158,155,205,236,219,187, 7, 15, 31,222,101,129,205,154, 8, - 96, 73,185, 59,148, 41,104, 42,148, 10,185, 5, 17, 33, 81,193, 95,147,197,138, 64,255, 90,216,190,121,157,173,179,171, 27,218, -182,175,124,110,180,141,147,111,163, 3,187, 54,227,250,111,225, 29,111,108,248,190,153,212,211,101, 19,195, 88,190, 3,129, 78, -111,180, 32, 95,158, 7,190, 33, 25,205,189,178,224, 40,182, 32, 65,225,129,103, 25, 49,210,138, 46,248, 57,207,142, 63,102,200, -128,133, 71, 78, 95,253,166, 71,183,142,120,150,160,128,136,207,129,144,207,134,144,207, 6,151,177, 96,221,143, 91, 77,121,249, -202,144,156,200,147,217,239, 80, 63, 47, 23, 62,253, 22,152, 59,139,202,101,239,166,133,191, 76,250, 98,117,143,158, 3,199, 49, -207, 30, 94,251, 82, 3, 92,169,220,131, 30,169,212,123, 86,107,229,239,113, 66, 27,231,141, 51,231, 46,159,217, 61,228, 3,176, -217, 28,152, 76, 38, 28, 61,184, 23,187,190, 95,252,210,160,202, 25, 7,192,106,144,177, 39, 31,218,251,227, 7, 95, 44, 90,199, - 52,104,212,188,197,181,244, 63, 78, 71,107,101, 51,219,198, 76,152, 50,204,205,205,205,230,247,136, 22, 65,237,192,122,232,221, -111, 48, 46,156, 60,142,231,145, 17,176,146, 2,195,100,181, 18,200,243,114, 50,204, 38,195,238, 50, 91, 60,132, 66,223,157,187, -246, 4,176, 88, 12,140, 38, 43, 12,102, 43,102,125,244,161, 97,234,167, 95,182,237,221,189, 67, 36,159, 13, 69, 66, 82,186,253, -221,240, 23, 65, 86,174,212,123,194,156,117, 60,157,222,130,124,141, 9,103,127, 46,219,235, 8, 29,124, 90, 85,111,210,123,194, -212,175,182, 11, 4,108,150,177,126,109,239,184, 14, 45,235, 39,251,120, 58, 43,151,173,250,190,249,237,251,225,189,135,142,156, - 32, 28, 91,167, 9,227,233, 36,178,249,112,228,192,134, 22,179,113,140, 38, 55,185,204,241, 5,185, 98, 7,185, 79, 13,127,205, -239, 17,163,218,199, 24,130,154,111, 56, 15, 6,113,218,204,232, 65, 0,224,225,233,163,227, 10,108,149, 85,136,192, 16, 0,216, -244,211,175, 77,159, 68,167, 77, 90,191,126,131, 56, 44, 86,137,199,177,249, 16,240, 88, 48,154,172, 96, 42, 25,212,182, 18,246, -148, 5,243,231,217,230,169, 45,184, 30,145,133,200, 71,215,136, 65,165, 27, 41, 54,219, 14,130,171,205, 24, 0,181, 0,188,102, - 24,178, 77,157,233,126, 18,184, 97,174,106,189,183, 90, 11,158,151,109, 93,252,106, 90, 56,130,222, 92,190,164, 21,195,144,250, - 12,129, 3, 64, 82,115, 11,239,169,149,117,106,234,204,104,172, 94,185, 8, 27,119, 28, 71, 90,142, 14,118,150,100,156,252,121, - 57, 62,251,102, 63,180,250,178,179, 26, 42,242, 35,165, 25,163,183, 13, 87,209,255, 69,235,125,243,205, 55, 33,111, 29,155,144, - 50,142,217, 31,214, 43,250,254,170, 85,171, 86,150,248, 92, 83, 89,147, 85,108,180,138, 54,170, 2,179, 85,219,197,195,247,183, -147, 39,142, 57,228,169,140, 16,242,216,240,169,225,143, 37,155, 79,186,244,106,234,140,108,163, 29,126,221,254, 93,174, 78,163, - 60, 88,169,139,133,107, 96, 11,145, 84,114,246,216,209,227,240,243,113,229,237,187,149, 27, 31, 30,167, 45, 14,245, 42,178, 18, -249, 53,108, 53,156, 65, 3, 7,138,175, 92,189,246,169, 10, 40,213,104,177, 25,118,181,159,246, 28,117,181, 17,113,193, 48,128, - 82,107,198,164, 49,131,223,255, 54, 70,172,236, 9,227,198,130, 41, 52, 89,138,156, 12,124, 57,247, 35,157,196, 20,243, 60, 41, - 33, 41,181,107,223,207,174, 40, 84,140,110,216,232,143, 30, 62,143,254, 38, 79,163,121,183, 73,126,244, 6, 11,244, 70, 43, 98, - 99, 95, 99,214,216,110,224,178, 89, 96,179,173, 5,201,210,230,178, 43,163, 42, 45, 58, 23,238,188, 33,123,215,206,248,201,211, -205,213, 73, 42, 17, 17,169, 88,192,212,175, 19,192,107,217,178, 53,191, 70, 96, 67,222,173, 23, 90, 36,101,105, 17,151,150, 15, -129, 91, 99,206,240,206,189,176,119,195,156,142,185, 73,143, 88,248, 99,146,226, 27, 92,186,126,175,239,142, 31,215, 11, 50,229, - 70,188, 76, 82, 33, 35, 79,135,244, 60, 61, 50,114,117,144,138,184,104,223,111,178,224,204,201,109,125,187,180,107,177,233, 93, -182, 59, 46, 46,254, 76, 66,106,250, 7, 13,131,155, 99,239, 47,187,218,217,219,215,176,149,203,227, 21,149, 61, 58,203,151, 47, -231,175, 90,181,138,179,121,243,102, 69,203,150, 45,221,231,207,159,223, 67, 38,147, 61,168, 94,189,122,224,133, 99,187,175, 54, -110,223,191, 25,172, 70,151,118, 29, 58,241, 4, 86, 14, 46,134,134, 26, 15, 29,220,151,163,213, 42,167,150,107, 56,196,118,203, - 51, 85, 12, 92,188,188, 34,165,124, 75, 55, 14, 75, 30,157,119,126,230,158, 60,224,152, 95,207,143, 47, 95,123, 20, 21,221, 52, - 44,193,245,106,216, 43, 89,174,198, 88, 59,246,252,103,229, 94,120,217, 12, 3, 46,155, 5, 27, 17, 7,172,194,171,170,212,179, -225, 43, 48,140, 75, 81,228,148, 1, 83,248, 23, 96, 24,164,229, 37, 61,174, 68,206, 6, 67,172, 4,136, 74, 81, 67,165, 43, 8, -205, 87,115, 22, 35, 43, 51, 5, 63,108,218,141,240, 71, 15,209,189, 87, 63,108,249,105, 31, 38,141,249, 64, 87,209,211, 15,139, - 85, 24,209, 42, 17,205,146,138, 56, 0, 24,200,213, 38, 28,189,157,140, 90, 53, 89,149,190, 49, 0,128,141, 84,140,124,165, 22, - 44,158, 13, 94,135,157, 21,159,187,118,127,254,194,175,215,127,158,151, 30,145,244,234,233, 45, 4, 58,231,163,166,151, 17,145, - 25,182,120,148, 83, 3,129,254,126, 96,241, 30, 86, 74, 59, 59, 50,104,245, 73,214,209,144,166,141,235,181,242,117,181,135,214, - 96, 41,140,106,177,177,107,231, 30, 36,196,167, 76,200,121,126, 50,252,207,112,180,106, 89, 92,150,192,213,127,250,211,251, 87, -226, 6,142,156, 14, 15, 47,159, 70,242,164,199,149, 78, 91,168,204,123,150, 74, 26, 45,158,216,126,254,172, 5,223,206,236,222, -103, 8,238,221,186,130,199,145,175,209,162, 69, 51,244, 26, 48, 28, 74, 69,110,157,195,123, 54,116, 51,107,148, 23, 56, 2,243, -204,230,173, 59, 51, 86,139, 5, 49, 47,159,189, 46, 77, 75,155, 30,245,248,110,122,148,237, 27,205, 83,206,117, 26, 73,237, 28, - 31,235,141, 22,164,166,166,224,206,111,215,131,181,233, 81,143,171,178,191, 4, 60, 54, 46,134,203, 96, 52, 89, 97, 52, 91,209, -190, 67, 55, 3,143,165,111,183, 98,253,206,150,233,105,233, 44,137,173,179,213,209,171, 46,207, 67, 96,212, 63,137,205,231, 25, - 77, 86,248,121, 74,202,213,116,241,244, 95, 57,103,206,172,186,108,158, 8, 74,181,222,144,158,150,234,190,253,215,107,170, 23, - 47,159,122, 85,115,181,179,253,118,195, 54,158, 66,199, 64,150,175, 71,174, 82,193,140,156,242,133,231,142,239,191, 25, 85,158, -209, 42, 37, 93,164,230,153,139,183,234, 56,216,240, 24,149,206,108,205, 81, 24, 45, 35, 7,188, 95,167,203, 66,147, 53,121,253, -186, 13,226,240, 88, 37,158,196,230, 67,200, 99,131,207, 99,193, 96,178,162,146,167, 19,203,221,213,125,106,235,166, 65,184,240, - 56, 27,108, 54, 11, 90,101,158,134,131,156,232,166, 29,187,139,155, 52,111,137, 78, 29, 59,224, 85,116,148, 79,232,169,163, 93, -238,222,185,145, 97, 54,214,158,161,206,138, 62, 94,165,192,130, 70,195, 54,241,221, 63,244,240,170,222,102,208,240, 15,237,124, -125,188, 24, 87,103, 39,152, 9, 7,147,199, 12,174,244,153, 95, 96,204,129, 85, 95,207,135, 94,111,128,139, 61, 31,132, 0, 59, - 55, 45,129,193, 96,128,167,147, 0,249,234,178,103,147,171,200,143,148, 21,133,170, 82,238, 73, 9, 51, 86,222,251, 12,195,132, -206,155, 55,239, 75, 0,100,222,188,121, 95, 22, 45,127,243,205, 55, 90, 0,105, 21, 52, 29,110,127,195,104, 21,109, 92,217,103, - 55, 47,208,217,201,227,238,197, 11,231,237, 78, 60,177,226,222,241, 71,232,211,194, 3, 60, 14, 11, 98, 59, 79, 60,137,207,199, -153, 99, 63,202, 79, 30,216,150,170,215,235,215, 84,220,214,236,223, 84, 42,150, 92,248,101,239, 65,171,179,147, 19,235,135,139, - 89,177, 57, 74,115,113,147, 86,244,253, 83,214, 71, 23,182,123, 16, 48,231,133, 66,161,191,193, 96,112,168,232,192,238,188,152, - 88,152,196,203,252, 25,215, 86, 48,108,182,101,239,190,189,112,182,229, 67,111,178, 98,222,231,159,104,199,118,151,202, 71, 14, - 29,222,185, 83,239,153, 87,185,146,128, 43,173,131, 3, 72,227,198,141,229,108, 54,187, 82,169, 20,174,174,174, 75, 88, 44,214, - 8, 62,159,111, 99, 48, 24,148, 6,171, 78,172,214, 25,160, 51, 2, 26,141, 14, 92, 94,129, 89,228,178, 25,104,117, 6,104,180, -134,242, 79,140,140,103,183, 1,212, 86,148,136, 41, 93,121,225,199,223,127,248,228, 39, 67,134, 14, 91,232,213,104,128, 52, 62, - 61, 31, 60,198,136,102,117, 61,112,237,252,113,146,146, 16, 61,171, 34,147, 5, 0,178,172, 92,111, 23, 23, 55,132,199,169,144, -154,163, 69, 70,161,201, 74,207,211, 67,169, 85,162,161,175, 39,228,249,249,222,239,188,127,129,227, 23, 46, 92,248,160,119,255, - 97,152,249,249,210,182, 63,255,248, 93,132,132,207, 29,175,206,140,185, 94, 25,163,245,236,217,179,220,185,115,231,214,250,233, -167,159, 88,163, 70,141,210, 6, 5, 5, 9, 71,143, 30,221,118,207,158, 61, 66,177, 88,168,125,114,235,212,194,137, 31,207,235, -191,125,227,242, 70,121,121,121,140,217,100, 58,103,204,203,155,167,170,192,204, 37,159,250,242,229,226, 88,227,184,110,237, 92, - 78, 57,138, 89,245, 5,196, 48, 28,117,151, 28,196,139, 37,198,216,243,155,149,162, 15,214,126,156, 38,183, 46,208,177, 92, 87, - 84,100,178, 0,128,197,102, 96, 48, 91, 96, 35,226,130,197, 98, 21,153,120,143, 93, 7,207,137, 93,236,248,224,178, 89,224,176, - 25, 40, 52, 38,100, 43,140,152,254, 97,255, 74, 63, 9,152, 45, 4, 90,131, 25,154,194,167, 67,165, 34, 27,243, 63,159,141, 94, -125, 7, 98,226,212,217,200,211, 2,143,226,148, 48,154, 76, 21,158, 20, 44,134, 5,141,222,140,241,221,125,145,171, 50, 66,173, - 53,195, 96,182, 66,204,231,128,203, 97, 65, 34,228,192, 86,204, 5, 8,225, 21, 93, 76,184, 92,174,206,100, 50,237, 45,231,137, - 30, 53,188,221,160, 53,177,208,124,216,119,232,218,170, 54, 34,111, 31,229,220,184,247,180,230,167,159, 47,192, 39,147,250,226, -200,203, 90,112,116,245,133, 84, 34,130,137,176, 0,144, 74, 38,236, 45,177,178,140, 3, 71,108,253,105,103,212,178, 69,243,132, -114, 53, 3, 1,143,141,171, 87, 46,227,238,253, 71, 27,179,159,159,220,139, 63, 17, 46, 97,185,217,218,218, 66,200,103,195, 96, -212, 27, 42,159,186, 64, 64,128, 96,137,107,237,173,133, 79,252,193, 22, 43, 74,121,175, 98,163,197, 17,218,206,155,241,249,178, -149,221,251, 12,193,197,208, 35, 56,124,228,160,165, 85,207, 9,236,125,187,126, 68,219,174,253,208,182,251, 48,156, 59,190,103, -182,218,202,212,155, 60,115,225,215,237, 59,247,198,197, 51, 71,144,153,145,178,182,178,229,101,115,153,153,157,187,245,133,206, - 96, 65,187, 46, 33, 56,127,250,248,199, 40,236,100, 81,249,155,216, 91,215,103,176,204,179,103,205,228,202,228, 6,110,150,194, -128,148, 44, 13,226, 51, 53, 56,121,224,103, 82,249,235,133,161, 89,251,134,213,184,147, 87, 95, 77,246,174,230,161,231,234,181, -162,232,215,177,117, 38,126, 56,150, 91,211,191, 14, 75,150,175, 71, 86,190, 30,217,249,122,168,116,102,248, 87, 11, 96,153,204, - 76,171,170, 30,103,103, 59, 62,119,203,233, 56,216, 74,184,104, 93,231,221, 59,218, 90,173,214,223, 77,214,250, 2,147, 21, 17, -151, 15, 1,143, 13, 1,143, 5, 1,143, 13,179,133, 84,234,193, 69,228, 90,187,247,244, 25, 31,121, 26,204, 64, 78,190, 1, 28, - 54, 3, 87,103, 7, 73,179, 70, 35,176,243,187,143, 1, 0,147,230,254,128,137,227, 71,163,110,253, 32,200,243,242,220, 71, 12, -233,189, 30,192,241,202,150,245,236,197,235, 62, 23,111,134,207,157, 62,103,177,116,104,223, 78,236,199,177,249, 72,207,213,227, -117,180,178, 74,145, 55, 0, 48, 91,172, 32, 32,216,125, 48, 20, 34, 62, 7, 89,249, 70, 16, 66,176,124,243, 33,216,136,184, 72, -207, 43,104,238, 47,143,114,253, 72, 57, 17,169, 42, 68, 27, 67, 80,144,203,229, 82,217,136,214, 55,223,124, 19,249,205, 55,223, -148, 26, 33, 43, 97,178,222,109, 82,105, 30, 79, 82,199,214,201,249,222,197,243,103,109,142, 63,177,224,218,147, 28, 12,105, 87, - 13,170,220, 36,172,249,124,104, 46, 3, 98, 96,177,217,114,189, 86,115, 76,171, 85,175, 0, 96, 44,183,210,184,215, 14,150, 8, -165,151,183,108,255,197,236,236,234,138,189,183,114, 83,242,212,102,211,239,205, 86, 38,230,209,133,237, 53,205, 86, 83, 79, 93, -230,171,135, 21, 61,137, 91, 9,120,223,252,120, 18, 0,129,213,106, 5,177, 90,193, 21, 74, 37,206,126, 45, 51, 11, 47,116, 66, - 14,139,209,149,188, 2, 16,171, 57, 37, 59,174,252, 48, 40, 3,192, 78,204,197,193, 27,169, 0,144,201, 86,134,189, 24, 57,180, -160,185, 80,103, 16, 42,234,215,170, 69,154, 53,107, 38, 23,137, 42, 53,252, 21,219,205,205,237,193,194,133, 11,235, 76,156, 56, - 81,192,231,243, 97, 54,155, 29,183,109,223,110,221,190, 98, 18, 6,125,188, 5, 60,190, 0, 90,157, 17, 92, 46, 7,121,249, 42, -200, 21, 26, 40, 53,166,170,215,160,216, 88, 67, 22,176,250,196,113,254,192, 30,210,134,205,249, 44, 30,154, 4,122,224,218,133, - 19,228,222,249,157,147,180,178,232, 95, 42, 89, 17,161,210,153,144,150,163, 67,106,142, 14, 25,121, 58,100,228,234,145,145,167, - 3,195, 48,208, 25,204,239,117,227, 82,203,162, 14,239,253,101, 71, 63,189, 17,195,219,119, 31,136,217,139,183,248,238,221,186, -234,114, 28, 97,181,169,100,162,173, 37, 50, 50, 50,225,195, 15, 63,108,244,235,175,191,178, 27, 52,104,160,125,241,226,133,184, -208, 68, 26,165, 82,177,232,231,239,191,185,208,188,121,243, 3,169,209, 47,175, 22,182,167, 87,120, 97,247,237, 48, 78, 32, 50, -134, 79,246,145,180,238,225,231, 46,134,143, 68,217,163,142,244,201,154,156,206,159,172,204,186,186, 81,150,174, 55, 95,202,210, -178, 27,167,170,184,149,202,193, 51,233,117,137,131,134, 12, 7,155, 97,193,168,211, 36, 22, 85, 46, 87, 59, 62,150,236,123, 9, -169,144, 11, 27, 17, 7, 82, 17, 23,109,235, 57,162, 10,215, 51, 98,178, 88,161,209, 91,160,213,155,161, 51,152,225,236,237,128, -159,246, 30, 70,146, 76,139,147, 15,179, 17,149,168, 68, 64, 53, 9, 8,169,248, 50,105,181,152,212,125, 7,143,178, 97,179, 24, -176, 89, 12,171, 94,157,218,200, 85, 25,193,227,176,192, 19,138, 32, 17,112, 96, 43,226,130,199,227, 66, 38,147, 65,175,215,195, -199,199, 71, 88,190, 21, 36,176,145,138, 16, 80,211, 19, 70,147, 25,103,111, 62,199,138, 89,131,208,173,125, 83, 48, 92, 41, 94, -234,131, 97,227,104, 3, 43,139, 5,163,217, 10,131,209, 2,128,165, 43, 75,207,219,219,187,179, 68, 34,145,104, 52, 26,101, 82, - 82,210,245,140,168,227, 73, 22,118,255,201,231, 47, 94,221, 27,210,171, 27,194, 35, 34,113,228,248,169, 91,217, 78,249,115,138, -190, 83,191,126,253,150,206,206,206,210,156,156, 28,197,179,103,207, 30,188,235,115, 1, 97,177, 62,109,213,182, 35, 84,114, 25, - 50,147,227, 43,253, 20, 93,215,215, 6, 95,125,179,165, 73, 96,237,192, 38, 22, 82, 96,188,234,249,216,224,179,197,155,154,212, - 10,168,221,164,168, 67, 72, 93,159,242,135,101,227,136,109,186,143,153, 56,251,155,126, 67,198,225,234,197, 83, 88,183,226,243, -189, 18, 59,151,186,142, 14,118,141, 27,180,236,142, 91,151, 79, 65,104,227, 14, 7, 39,247,182,163,198,207,232, 58,100,212, 20, -220,189,117, 25, 27, 87,125,185,199,162, 87,238,175, 76, 89, 37,174, 53, 93, 26, 5, 55, 31,105,227,232, 6,121,190, 18, 54, 14, -174,168,219,176,217,200,231, 79,244,115,213,178,184,172,119, 54, 29,132, 64,111, 36,200, 83, 25,145,156,165, 69, 66, 70,129,209, -178, 90,171,144, 19,100,177, 50, 82, 33,135,227,104,122,229,243,244,242, 85,226,235,237,198,172,254,250,115,182, 17, 66,100,201, - 11, 76, 86,150,194,128,172,124, 3, 84, 58, 19, 28, 37, 28, 88, 45,214, 42, 63,117,231,169,140,176, 17,115, 97, 39,230, 85, 58, -202, 88, 26, 63,238, 58, 24,248, 36, 58,109,192,186,117, 27,196,143,227, 74,152, 44,110, 65, 52, 75,192, 99,195, 98,181, 2,149, - 56,227,185, 28,238,204,254,189,187, 34, 57, 91, 91,208,107,153,197, 32, 32,168, 57,156, 69, 86,116, 25, 54, 15, 0,208,183,119, - 65,106, 91, 92,186, 26,167,239,101, 1,111, 38,118,151,127, 45,214,106,217,219,247,157,249,244,240,161, 3,118, 58, 11, 7,219, -206, 37, 64,163, 55, 67,200, 99, 67,192, 99, 67,196, 99,191,145,143, 93,177,209, 42,200,185, 75,202, 54, 65,163,211, 65,161, 53, -129, 0,120,240, 74, 5,173,193,140,124,181, 9, 45,235, 56,188, 95, 32,132, 97,206, 16, 66,250,188,109,136,222, 54, 75, 37, 34, - 82,165,105, 60, 44,169, 81,180,126, 89, 70,174,100,206, 22,128, 42,245,224,226,188,237, 28, 75, 46,243, 36, 14,117,237,108,236, -238,157, 63, 23, 42, 61,254,196,138,235, 17, 5, 38,203,164,205,198,218,185, 35, 82, 20,242,236, 78, 0, 98, 43,251, 99, 98,231, -186, 13,133,124,193,213,111, 55,108, 51,186,186,121, 89,143,221,147,203,242, 53,150, 55,220,132, 69,175,103, 17, 43,225,233, 50, - 95, 85,170, 13,129,197, 98,140,139, 63, 30, 8, 43, 33, 88,178,225, 48, 86,206, 25, 6,169,104,148,152, 97, 24,177, 90,103,198, -172,165, 59,176,246,171, 9, 54, 98, 1, 7, 12, 83,144, 19, 53,102,248,192,202, 85, 64,157, 25,175,239,255,170, 82,198,133,190, - 40,217, 92,216,162,109,175, 71, 45, 90,180,144, 59, 56, 56, 64, 36, 18,253, 30,169, 40, 3, 55, 55,183,175, 22, 47, 94, 28, 56, -117,234,212,226,193, 62, 57, 28, 14,166,127,244, 17,203, 98, 33, 56,119,110, 39, 92,170, 7,227,212,165,123,232,217,185, 25, 84, - 26, 29,114,229, 74, 88,193,126,231,138,168,148,103, 95,205, 72,120,218,188, 77,167,190,184,126,225, 4,185,119,238,231, 73, 85, - 25,163,199,193,209, 33, 57,236,233,235,186, 12,227, 88, 16,209, 42, 52, 89, 6,147, 21,190,110, 98, 36, 39,188,134,189,157, 93, -114,101,245, 68, 46,129,253, 25, 22,153,202,128,236, 84,103,198, 28, 6, 64,212,233, 47, 70, 28,222,191, 61, 34,242,217,227, 21, - 33, 35,103,114,186, 15,249,136,189,245,155, 25, 95, 2,168,236,192,123,198,168,168,168,231, 19, 38, 76,104,125,247,238, 93, 11, - 0, 13,195, 48, 38, 54,155, 45, 54, 24, 12,188, 78,157, 58,229,191,124,249,242, 6, 74, 79, 90,124,131,182, 31, 30,118,102, 4, -202, 94,124,171,113,132,175,141,178, 91,167,118,173,208,170,190, 55,146,219,181, 2,128,153,137, 42,105,160,174,214,142,131, 38, -179,232,236,214, 93,167, 87, 78, 26,214,117,214, 94,206,146,117,233,161, 75,202, 77, 68, 77,126,113,163, 71,105, 54,158,195,102, -193, 70,196,133, 84,196,129,141,136, 11, 27, 33, 23, 38, 51,169,202,147, 35, 49,153,173, 5, 17, 45,131, 25, 42,173, 25, 87, 31, -103, 34, 35,223, 0,185,210, 8,173,209, 2, 2, 82,240, 52, 90,137,171,121,214,171, 59,246, 69,119, 82,123,159,224,252,237,155, -191,179, 61,122, 59,165,184, 71,159,157,152, 15, 27,113, 65,111,236,155, 55,111,194,201,169,226,167,125,171,213,138, 35,231, 31, - 96,221,238,171, 56,191,243, 11, 8,121,108, 52,236,191, 20,227, 6,180,128,149, 88,241, 58, 42, 50, 51,160, 94, 35, 55, 22, 75, - 4, 22,195, 64,111,178, 2, 32,101,238, 79,131,193,224,148,148,148,164,240,247,247,119,247,244,244, 28,194,102,179, 9,148,143, -245, 39, 14,228,106,174,132,238, 23,171,181,122,139,216,156,191,211, 63, 93,219, 7,254,254, 96, 24,134,216,218,218,242,174, 94, -189,170, 10, 10, 10,114,121,199, 83,137, 37,114,173,189,113,226,180, 79,135,212,242,243,195,225,253, 59, 65, 8,115,180,178, 95, -222,119,250, 46,190,158,255,102, 15,195,207, 22,111,106,178,118,233,204, 55,222,155, 54,127, 93,185,189, 14, 69, 2,233,156, 65, - 35, 38,227,209,131,223,176,102,233,103, 7,244,170,220,113, 38,179,233,131,220,244,184, 3, 53,235,181, 0, 49, 42,113,241,208, -119, 24, 54,122,146,160,123,200, 16,220,189,117, 25, 43,191,156,182, 79, 35,151,125,136, 74, 38, 57, 91, 9,119,106,167, 30, 3, -184, 90,189, 17,155, 86, 47,194,148, 57, 43,208,178,115, 95,238,179,199,247,166, 2, 88, 86,233,116, 8,163, 5,157,130,156, 11, -204,179,201,138, 83,113,108, 78,105, 53,144,195,102, 88,141,253,236,161, 53,152,161,168,224,161,146,195,227,102,200,243, 21,213, -191, 95,249, 41, 91,173, 51, 35, 43,223, 0, 89,190, 30,217,242,223, 13, 86,118,190, 30, 89,249, 6,112, 57, 12,162, 99, 19,193, -226,114,170,156,159,151,167, 50,161,121,109,135,130,115,244, 29, 91, 71, 76, 28,219, 22,231,111, 60, 25,180,110,221,122,225,147, -120, 37, 34,226, 20,133,145, 44, 54, 4, 92, 22,248,133,255, 91,172, 5,185,145,229, 97,235,226, 87,115,236,152, 81, 93,108,165, - 34,164,197,200,192, 97, 23, 12, 17, 99,231,234, 13, 59,129, 14, 51,166, 77,134,179,147, 61,146,178,245,216,120, 60, 26, 17,207, - 95,193,170,173,218,102,111,218,118,160,231,196,233,159,217,179,184,124,236,185, 16, 95, 80, 78,182, 5, 47,239,157,214,165,189, -126,170, 86, 41,114, 8,136,165,146, 57,200, 12, 49, 91, 10,170,219,202, 37,243,112, 96,247, 15,184, 16, 38, 43,174,129,183,143, -174,197,167,243,151, 35, 91, 97, 64,105,245,178, 60, 63, 2, 32,171, 68, 36,234, 15,203, 37,204, 81,105,203, 76,225,178,161, 12, - 13,195, 91,230,202,240,214,251,134,183,244, 74, 27,251,111,123,133, 77,135,127, 48, 69,246, 46, 13,196, 66,201,111,231,206,157, -150,156,136, 32,197, 38,203,168,201, 38, 43,102,246, 77, 81,200,179,186, 87,201,100,185, 4, 52, 16,136, 5, 55, 22, 46,223,168, -119,243,170,110, 62,251, 88,145,163,212, 89,204,127,204, 65,144, 88, 36,118, 46, 58, 14, 95,176,142,171, 53, 44,202,206,126,161, -174, 40,242,100, 37, 4,161,247, 51, 64, 72,193, 35,210,161,155,169, 40,124, 50,135,197, 90,208,172,114,233,177, 12,156,194, 60, -148,202,134,191,127,220,246,131,162, 79, 80,190,122,228,202, 37,197,205,133, 45, 27, 21, 68,178,108,109,109, 97,111,111, 15,169, - 84,138,138,154, 14, 25,134, 25, 51,113,226,196, 63, 60,253,203,100, 50,116,237,210, 9,155,127,248, 9,141,186,140,197,165, 59, - 23, 96, 52, 89,209,176,158, 31,170,123, 58, 32, 57, 83,249, 78, 39,186,196, 45,112,122,243, 78, 3,190,108,219,185, 47,174,158, - 63, 70,238,157,223, 53,185,170, 3, 33,246,233,218,250,244,215, 95, 47,169,185,112,197,247, 2, 27, 33, 7, 47, 84, 6,176, 24, - 6,190,110, 98, 56, 73, 88,184,126, 98,143,110, 88,223,214,149, 30, 28,207,219,219,107,239,218,205,219, 37,107, 87, 45,237,244, - 40,140,185,170, 74,139,206, 5, 0, 77,102,212,234,151,192,243,106,191, 93, 60,219,168,195, 64,184,121,250,117,139,203,124, 89, -105,179, 1, 64, 19, 27, 27, 27,183,112,225,194,192, 85,171, 86, 17, 54,155,109, 5, 32,216,176, 97,131, 38, 38, 38,230, 49, 10, -186,230,162,162,155, 77,151,110,245,103, 73,249,150,150,142, 98, 86,125, 63,119, 49, 90,213, 47,104, 21, 29,214,167, 45,188,125, -124, 16,155,161,105,156,171,177,114, 85, 6,182,223,150,109, 17, 15,107, 56,179, 39,153,181,134,231, 0, 78,190, 67,179,105,113, -130,124, 81, 52,203, 70,196,133,181,160,174, 84,201,104,233,141, 22,104,245, 22,104, 13,102,168, 13, 22,104, 12, 22, 88, 73,193, - 57,193, 48, 12,140,102, 43, 42,245,216,252, 86,221,183,117,116,134, 95, 13, 6,182,226,130,178,217, 22, 14,247,192, 0,112,114, -114,130,171,171,107,165,162,162, 6, 99,193, 41,110, 48, 89,139,155,245, 13, 70, 51, 8, 33,136,142,142,250, 34, 33, 46,174,191, -127,128,127,251,122, 13, 27, 57,138, 5, 44, 0, 40,211,104,105, 52, 26,139,141,141,141,171,163,163, 35, 43, 53, 53,181,216, 60, -251, 55,238,100, 62,126,236, 40, 6, 13, 26,168,122,241,224, 73,113, 23,119,173, 86,203,180,105,211,198,214,219,219,155,165,215, -235, 21, 85, 61, 76, 18,151,218, 3, 28,156, 28, 87,140,249,112, 74,237, 78, 93,123,226,218,149,139, 56,121,236,215, 95, 52, 89, -209, 23, 43, 43, 18, 24, 88,231, 15,189, 14,107, 5,212,254, 67,175,195,234, 53, 3,202, 53, 90,245, 26, 54,107, 65, 24, 14, 46, -132, 30, 34, 58,150,113, 26, 0,171, 69,167, 60,116,240,199,175,150,141,152, 58,191, 86,239,126, 35, 48,102,244, 56,112, 56,108, - 92,191,116, 26,107,151,206, 62,163,202,151,141,173, 76,154, 64, 65,232,173, 46,207, 75,228,253,137, 79,173, 6, 8,187,119, 11, -175,163,159, 69, 62,121,120,183,190,127, 80, 75,184,120,250,126,146,232,204, 94,133, 23, 47,140, 21,201, 24,116,186,196,113, 99, - 71,163,100,175,195, 86,193,129, 78,204,219, 39, 0, 0,141, 82,102,252,249,187, 89, 49, 69,189, 14,173, 70, 67, 98, 89,186,249, -121, 89, 71,174,223,185, 63,167,127,159,158,172,108,133,161, 32,130,149,111, 40,124,233,145, 93,244,191, 66,143, 0, 79, 41,162, - 34,195,172,186,252,236,163, 85, 60, 47,117,227, 62,232,241,188,168,238, 90,173, 4, 12,160,171,114,179, 20,215,118,242,234, 53, -235,132, 79,226, 84,136,136, 87, 20, 52, 21,114,217, 5, 6,139,203, 42, 54, 93, 5,189,217, 43,136, 14, 49,236,149,227,199, 14, - 71,182,194, 8,171, 21,224,176, 89,133, 47, 30,146,148, 12,146,149, 26,100,231,101, 33, 46, 33, 17,242,140,215, 96,177, 88,112, -246,172, 93,233,145,164, 45,132,239,161, 49,144,160, 33,125,218,115,142,253,150, 14,177,128, 3,189, 50, 19,231, 14,126,151,165, - 87, 41, 86,104, 53,170, 99,149, 25,207,241,247, 20, 4, 38, 75,161,210,185, 9,184,108, 28,222,253, 61, 62, 24, 55,237,141,171, -239, 23, 11,190, 6, 88, 12,114,243,148, 96, 24, 38,171,106,215, 37,230, 97,121,203,239, 24, 25,123,111,141, 82,204,214, 31, 31, - 20,202,126, 26, 37,231, 46,158, 63, 45,185,157, 32,192,131,168,244, 66,147,149,101, 93,254,113,159, 20,101,126,110, 15, 0,209, - 85,123, 46,100,245, 24, 54,126, 78,164, 95,237,122,250,107,207, 84,241,114,181,169,204, 60,135, 86, 67, 22, 70, 62, 58,179,185, -119,190, 41,246, 35,137, 71, 61,139,213,108, 94,173,205,138, 94, 90, 70,211, 33,127,233,198,195,197,205,134,115, 87,237, 41,248, -223, 98,129,133, 88, 65,172,192,140,175,126,132,217,106,129,213, 98,129,213, 66, 96,178, 16,113, 69,197,117,245,172,126, 44,239, -229,161, 58, 35,151,253,177,185,208,222,222, 30, 78, 78, 78,112,114,114,130,173,173,109,133, 70,139,203,229, 74, 57,156, 55,119, -117, 98, 98, 34, 18, 18, 18, 96,107,107, 11, 98, 53,193, 96, 2, 26,180,236,142,167,175,159,225,242,237,199, 32, 86, 11, 36,210, -170,207,242, 34,113, 11,252,168, 89,199,254,223,119,238, 55, 1,151,142,109, 35, 15,111,158,158,162,149, 69,239,168,116,132,222, - 98, 97, 76, 38, 19,250,116,239,152, 24, 30,249,234,252,130, 57, 83,123,182, 14,153, 34,104, 21,232, 5,157,193,130,148,132,215, -184,126, 98,151,174,118, 77,143, 11, 93,218,181, 72, 52,153, 76,176, 88, 44, 21,222,200,117, 6, 99, 54,155, 43,146, 12, 31, 62, -146,251,240,193,131,163, 18,151,128,195, 22,134,245,132, 33,214,134, 12, 33,131, 26, 54,172, 11,163,201, 10,141, 70,145, 87,213, -109, 86, 42,149,113, 59,119,238,172, 57,118,236, 88,113,189,122,245,184,175, 95,191,198,218,181,107,115,148, 74,101, 92,101, 53, - 46,222,140,218,192, 97,242, 98,138, 34, 90, 73,109, 91, 97,120, 72, 91, 28, 56,115, 27,215,111,221, 69,162, 74,250, 88,101,230, -156, 72, 78, 76,211,215,119, 84, 28,237,215,170, 58,251,240,238,188,163,145, 29,231, 13, 37, 68,112, 49,251,198, 18,117,229, 79, -110, 64,169, 53,193, 86, 92, 48,222, 83, 81,100,139,205, 48,149,118, 68, 12, 16,119,235,110, 88,131,166, 1,245, 16, 30,151, 15, -153, 92, 15,173,222, 12,171,149,192, 10, 2, 39, 27, 62,132, 60, 22,146, 18,226, 96, 37,198,248, 42,222, 42,178, 58,180,239,192, - 1, 24, 48, 12,225,112, 57, 28, 16, 20,140,175, 40, 18,137, 84,174,174,174,149,138,104, 25,205,102, 12,234,217, 2, 45,155, 53, - 68,255, 41, 5, 99,102, 94,249,101, 30, 28,164, 92, 28,216,187, 3,201, 55, 55,236,173,217,106,234,197,103, 79, 35, 7, 71,134, -255, 54,178, 87, 19, 81, 99,119, 78, 26,175,172, 48,169, 90,173, 62, 10,128,207,227,241,122,182,111,223,222,241,232,209,163,114, -103,103,103, 43,159,199,203,234,215, 55,196,202,229,241,114,139,214,189,115,231, 14,119,202,148, 41, 54,121,121,121, 73,153,153, -153,119, 1,152,202,127, 16, 12,236, 10, 22,126, 5,195, 8,165, 34,113, 98,141, 26,126,158,205, 90,182,176, 27, 48,232, 3, 8, -248, 2, 92,186,120, 30,155,214,175, 58,164, 74,127, 49,190, 42,123,242,207,234,117,152,146, 20, 31,167,209,234,131, 26, 52,237, -200,220,186,120, 98,166, 17,206,235,217, 2,227,119, 93, 7, 77,171, 21,151,166,194,166,111,190,128,131,157, 4,241,175, 95,106, - 99, 94, 60,253,209,164, 83,124, 81,105,147, 5, 64,156, 99, 25,220,106,116, 79, 7,189,209,130,155, 87,207,232,172,102,107,207, -187, 55,206,190,174, 86,187,153,176, 65,179, 46, 14,217, 39,119, 12,210, 0, 7, 42,210, 73,125,249,199, 8, 46, 49,200,227,175, - 92,189,108,231,230, 91,159,205,128,129, 81,175, 67, 86,236, 67,179, 38,243,165, 66,145,250,172, 82,189,112,115,146,241,213,252, -197,223,126,212,172,105, 83, 9,129,240,141, 8, 86,145,193,202, 86, 24,224,108,195,135, 86,145,133,152,135,231,117,154, 44,118, -185,227,157,153, 13,106,113,182, 44,147,255,123, 58, 67,116,203,242,214,207,150,101,242,205, 6,181,184,226, 91, 29, 27,182, 18, - 62,158,198,167, 22, 39,190, 11,184, 5,185, 89,124, 46,187, 56, 79,171,232, 90, 80, 1, 29,121, 66,123,164,230,232,192,128,192, -106, 49,195,108, 50, 64,169, 80, 32, 53, 45, 3,153, 25,153, 80, 42,229, 16, 75, 29,208,160,113,115,216, 72,132,120,114,253, 16, - 8, 33,149, 26,215,208,196,112, 3,155,181,108, 39,120,150, 80,144,139, 37,228, 18,156,254,117, 85,142, 74, 33,107,167, 74,143, -137,169,234,181,216,108,177, 92,142,120, 30, 83,191,154, 71, 13,230,241,235,124,236,253,105, 51, 12,133,145, 77,147,201,130,103, - 73,106,164,231,106,144, 20,251,130, 88, 45,150,203,248,143,192, 41, 59, 0, 8, 78,195, 6,117,209,125,212, 0,252,240,195,143, -136,141, 75,176,174,152,217, 59, 73,165,148,247,170,130,201,234,138,194,177, 54, 52,153, 81,171,181, 14,205, 82, 78,133,231,178, -180, 6, 82,110,130,143,208,197, 23,237,198,175,189,160, 85,230,242, 45,122, 13,231,244,222,241,191,150,166, 89,224,160, 97, 88, -241,217, 48, 72, 69, 28, 48, 12,131,162,230,194, 45, 95, 79,134, 88, 80,208,182,172,213,155, 49,106,214, 58,236, 93, 55, 27, 4, -192,136, 15,110,107,202, 42, 39, 10,230, 46,156,225,129, 7,213, 18, 19,100,169, 93,251,126,118, 69,103, 20,232, 67, 6,142,125, -212,180,105, 83,185, 72, 36,130, 72, 36,130,173,173, 45, 28, 28, 28, 96,111,111, 95,225,182,155, 76, 38,149,193, 96,112,226,243, -249,176, 90,173,136,143,143, 71,124,124, 60,242,243,243,145,149,149, 5,181, 74, 97,126,112,229, 48,167, 65,171,222,240,244, 11, -130,111, 64, 35,112,217, 12, 56, 28, 22,174,159,250,169,172,114,150,110,178, 58,244,219,210,165,255, 68, 92, 58,182,157, 60,188, -121,122,170, 86, 22,253, 83,101,143, 81, 97,115,207,147, 65,131, 6, 5, 77,153, 50,133,183,120,206,148, 11,103, 46, 94,143, 62, - 28,186,189,111, 94,158,220,155, 16, 2,123, 59,187,228, 97,125, 91,159,238,212,166, 89,226,149, 43, 87,172,191,254,250,171,158, - 97,152,167,229,105, 22, 92,164,100,191, 92,185,124,117, 73,187, 14, 29,177, 99,247,175, 29, 34,159,191,232,240,250,117, 12,188, -125,253, 80,163,102, 0, 52,140, 3,174,222,184, 5,149, 92,246, 75,101,202,249, 86, 84,139,201,203,203,251,109,216,176, 97,221, -111,223,190,205, 26, 54,108,152, 38, 59, 59,251, 78,137, 40, 22,169, 72,243,238,214,129, 89, 0,126,241,237, 48,238, 80,170, 81, -254, 9,128, 85, 62,190, 62,184,126,235, 46,238,222,190,255, 99,182,216,103,233,248, 81, 31, 78,174,222,143, 61,177, 95,171,234, -108, 87, 7, 49,246,111, 95,203, 62,117, 55, 97, 93, 66,142,101,199,170, 27, 75,190,174,204, 49, 42,190,113, 40,141,104, 83,215, - 17, 38, 11,129,149, 20, 92,112,109,132,220,178, 46,188,127,208,228, 24, 4,227,167, 78,153,242,186, 65,195,198,159,142,250,112, - 42,175,177,159, 55, 30,188,146, 3, 12, 3, 71,119, 9,210,211,211,113,243,200,118,115, 94,234,203, 31,217,108,235,178, 42,236, - 79,228, 37, 62,246, 47,177, 56, 57, 59, 59, 27,215,175, 95, 71,145,193,114,113,113, 41,203,104,189,161,153,147,153,118,231,235, - 53,219,218, 76, 26, 51, 16, 33, 29,235,227,198,195,215, 48, 20,142,215, 84,212,149, 60,238,238, 86,254, 39,195,252, 12, 31, 13, -170,173,208,154,248, 9, 95,197,231,223, 68,193, 28,172,214, 50,202,105,200,205,205, 61, 21, 21, 21,213,182, 81,163, 70,213,207, -158, 61,155, 27,121,255,194,204,146,133,248,236,179,207,164, 63,252,240,131,152, 16,114,199, 96, 48,196, 86,106,219, 89,216, 31, -246,232,145,147,209,100,197,173,251, 79,234,118,105,211, 24, 86, 2, 60,124,248, 16, 59,126,222,161,123, 26,241,248, 59,117,166, -251,178,114,204, 75,169,251,211,242,126,189, 14,139, 53,211, 83, 19,190,187,116,230,200,222,102, 29,250, 98,228,140,101,203,174, -159,249,117, 73,147,118, 33,172,186,205,186, 35,236,238, 85, 92, 62,123,254, 91,163, 42,119, 9, 42,206, 29, 41,181,156, 2,145, -248,227,122, 77, 58, 32, 41, 49, 1,241, 49,207,126,209,229,190, 74, 75,124,205,254, 37, 45, 37,113,106,205,250,109,112,251,194, -129,153,229, 24,173,114,235,188,183,139,104,251,217,208, 83,195, 83, 82,182,186,171,181, 58, 1, 33, 68, 39,224,115, 50,164, 44, -229, 65, 69,165,203,249,194,152,149, 86,125,208, 7,163,166,158,217,180,105, 61,215,205, 94,140,140, 60, 29, 20, 90, 35,148, 26, - 35, 88, 12, 3,127, 79, 9, 52,202, 92,220, 56,178,198,100, 80,229, 13, 3, 94, 27,203,210,148,184, 6, 46,207,123,117,117,198, -103,211,174,129,111,231,237, 89,163,243,252,114,163,117,202,212,199,125, 63,155,118, 58,144, 16,210, 69,226, 26,168, 84,203,162, - 22,150,181,237, 12, 83,112,126,143,236,228, 13,163,185, 96,252, 49,179, 21,176, 88,173,133, 81, 62,128, 20,183,231, 51, 21,108, - 59, 99, 61,120,230, 14,210, 50,229,208, 26, 76,208, 27,204, 48,154, 44, 96,177,217,176,119,176, 71, 64,141, 96,216,217,219, 34, - 51, 35, 13,119,175,156, 66,116,196,141, 59, 12,193, 82,109, 86,204,149,202, 28, 35,158,200, 62,208,195,211,157,149,174, 48, 64, -196,103,227,241,141,179, 70,147, 65,255, 93, 37, 77,214, 31, 52,229, 57,185,235, 62,157,243,249,136, 93, 59,119,187, 7,213,180, - 69, 74,182, 22, 41, 89, 58, 40,117,166, 66, 35,102,133, 94,149,141,136,171,187, 51, 44, 58,229, 58,252, 71, 40,211,104,153,141, - 58,229,209,243, 15,156,230, 45, 89,195,126,245, 58,214,180,252,147, 62, 41, 90,149,162,119,149, 35, 89, 37,216, 53,189,230,129, -191, 98, 35,254,208, 92, 72,172,176, 18,130,211,247, 51,138,155, 11,173,133,153,151,225,175,203,159, 70,176,228,220,133, 29,123, -207,188, 20, 17,165,220,167,213,102,218,189,124,245, 93, 30, 0,176,217,236,226, 87, 81,110,150, 78,167, 51, 84,208,132,178,231, -167,159,126,154, 59,117,234, 84, 65,114,114, 50, 94,191,126, 13,185, 92, 14,161, 80,136,243,231,207,155, 96, 53,127, 23,113,251, -120,124, 84,216,197, 69,129, 77,187, 87, 11,106,213, 27, 98,177, 4, 28, 82,249,100, 76,177,107,237,225, 77, 59,244,251,190,203, -128, 73,184,124,252, 39,242,240,198,169,105,218,172,232,237, 85,221,151,114,185, 60, 18, 64,204,119,223,125,215,120,199,142, 29, - 53,231,204,153, 19,187,231,251, 37,155, 0, 32, 39, 39, 7, 0, 16, 30, 30, 78,166, 77,155,166,215,233,116,113,121,121,121, 97, -168,160, 3, 4, 0,104,179,196, 43,119,108, 89,213, 32, 57, 53,125,160, 95,131,230,112,169,217, 28,238,254, 45,144,167, 52,226, -193,171, 52,196,190,184,130, 23,183,142,156,213, 72,205, 75, 80,197,241,141, 27, 53,106,228,205, 98,177,106,168, 84, 42,247,122, -245,234, 53,146, 72, 36,225,141, 26, 53, 10,230,112, 56, 41,143, 30, 61, 74,168,138, 86,226,141,221,122,223, 14,227, 54, 38, 42, -109, 58,197,102,104,130, 19,149, 54,225, 26,129,221,236,172,171, 27,245,187,216, 94,235,136, 49, 59,242,240,110,197,209,253,219, -215,178, 71, 77,254,204,242, 44,223,225, 19,142,136,127,169,106,225,106, 86,250, 71, 99,251,255, 62,188, 67, 97, 36,171,240,255, - 74,133,233,243,243, 35,242, 1,204,141,120,206,253,254,217, 39, 83,190,110,216,172,205,232,246,189,134,177,204, 60, 41, 46, 28, -223, 74,226, 34,174, 30,230, 16,203, 2,109, 37,102, 3,168,176, 57,200, 96,168,140,201,250, 99, 25,147, 37, 29, 15,255,250,243, -184,163,199,143,125, 51,160, 95,127,167, 45, 95, 13,197,154,109, 39, 32, 17, 9, 64,172, 86, 12,237,228, 61,100,209,196, 58,125, -189,221,132, 94, 71,175,165,220,156,177,254,217, 92,141,198, 24, 93,137, 72, 12,201,206,206,190, 37,149, 74,179,218,182,109,219, - 82, 32, 16, 48,217,217,217, 28, 87, 87, 87,179,157,157,157, 33, 37, 37, 69,163,215,235,143, 2,168,210,176,227, 70,147, 21,241, -153, 58,156, 60,118, 20, 79,238, 95,193,139, 23, 81,202, 23,207, 95,108,102, 56,100,189, 58, 51, 38, 23,168,242, 3, 62,172,165, -246, 58, 36, 85,238,117,104,209, 43,247,239,249,113,121,103,141, 78, 63,174, 81,235, 62,168, 94,183, 13,203,104,178,224,233,195, -107,184,118,100,253, 26,163, 42,119,222,251, 28, 99,207,106, 53, 3, 8,155,143,223,174,159, 1,177, 90,127, 4, 0, 98,181,254, - 24,126,251,236,212, 22,189, 39,194,209,181,122, 35,121, 82, 56,131,119, 24, 61,156,199, 97,169,207, 29,221,117, 60, 62, 62, 30, - 47, 95,190,196,171, 87,175,144,155,155,139,253,251,227,171,116,124, 52,121, 9,151,162,159,179,122, 12, 30, 58,242,244,144,225, - 99,132, 53, 3,130, 88,129,213, 28,224, 36,229, 32,234, 85, 2,162, 31, 69, 88,163, 30,156,213, 25, 21,178, 1,218,188,132, 50, -141,159,216,185,174, 27, 96,153, 87, 52,119, 97,171, 86,109, 2, 63, 95,241, 77, 75, 39, 23,215, 82,175,227, 57, 89, 50,254, 23, - 51, 78, 5,222,189,247, 91,165,230, 58,180, 90, 44, 57,147,199, 13,179,178, 11, 38, 10, 69,113,156,186,112,239, 21, 60, 76, 21, -188, 79,172,230, 10, 35,248, 31, 14,108, 7,179,213, 10,181,214, 8,133, 90,143,124,165, 14,233,178, 28, 60,137,136,192,141,211, -167,240, 58,234, 73,156,201, 96,184,200, 98, 49, 71,180,153,209, 55,170,214,210,196,169,233,228,232,136,184, 92, 21,132,124, 14, - 18,162, 31,233,213,138,252,125,239, 90,143,180, 57, 49,233, 50, 54,211,125,216,176,225,231, 59,247,232,103,215,172,117, 87,177, -179,173, 61,120, 28,130,152,248, 52,132,221, 57,175,142,125,114, 83, 97, 50,168,122,254, 25,179,190,252,205,169,184,215,161, 81, -175,238, 59,162,127,135, 99,108, 54,135,111,181,154,245, 70,131,126,240,251,152,172,191, 10, 66, 44, 41,227, 70, 12,124,227,217, -192,108, 37,162, 17, 31, 92,208,150,124, 86, 48, 89,136,120,196, 7,119, 52, 5, 23,144,178, 19,251, 60, 60, 28,251, 20,205, 93, -152,152,152,243, 48, 55, 87,127, 13, 64,138, 78,167,123,231, 50,102,102,102,126,189, 98,197,138, 16,141, 70, 83,167, 99,199,142, - 2, 91, 91, 91,228,228,228,224,226,197,139,166,208,208,208,231, 50,153,108, 17, 32, 51,107, 17,252, 75,132,238,248,216,168, 71, - 23, 23,213,105,218,163, 90, 80,235,222,149,191,152, 9, 68,147, 58,247,155,192, 92, 62,241, 19,121,112,253,196, 71,218,172,152, -109,239,177, 91,141, 58,157,238,190, 78,167,123,182, 96,193,130,102,110,110,110,110,139, 22, 45, 18, 42, 20, 10,238,150, 45, 91, -116,217,217,217, 25, 10,133,226, 46,202,201,167,249, 35,225,166,252, 84, 12, 58,119,244,167, 78,228,232, 79,221,236,157,189,186, -219,185, 84,171, 37,207, 74,141,203,207, 74,187, 8,224,114,225, 64,145, 85,162,113,227,198,126, 12,195, 12, 3,208, 64, 34,145, -248, 75,165, 82, 1, 33,164, 14,195, 48,145, 86,171, 53,162, 94,189,122,161,207,159, 63,175,210, 96,178,137, 55,118,235,189, 3, -219,252,154,171,177,242, 12, 44,222,175,137, 55,118,235, 1, 64,118,233,115, 13,128,147,207, 59,206, 29,116,234,110,194,166,200, - 60,187,153, 89,215,191, 57, 85,213, 50,231,167, 60,241,255,179,234,191, 46,253,121, 10,128,113, 17,143,176,246,105,248,221,197, - 12, 1,215, 2,243,114,173,236,213,163, 63, 67,159,203,229,234,188,188,188, 74,237, 93, 40, 16, 8,116,122,125,121, 1,148, 27, -102, 85, 58,118, 0, 29,118, 31, 59,180,123,220,137, 83, 39,191,105,223,101,128,147,176, 90, 53,212,112,101,176,123, 94,147,153, - 87,194,179, 30,244,251,252,230, 15,177,105,186, 8, 84, 49, 31, 70,165, 82, 69, 3,200, 83,169, 84,253, 9, 33,201, 12,195,120, -231,229,229, 61, 54,153, 76, 79,171,108, 8,172, 24,217,170, 85,243,253, 12,195,112,136,217,186,250, 46,151,253,171, 46,253, 69, - 10,222,115, 90,146,160, 26,182,152,181,104, 99,147, 90,254,181,155, 20,205,117, 88,191,186, 13,166,204, 93,219,164,122,205,128, - 38,191,207,127, 88, 97,154, 0, 49,105,242,198, 31,251,121,245,205,240,123,215,190,116,246,168, 94, 61, 35, 37,246, 69,242,171, -199, 95, 91,116,138, 99,239,123,156,227, 95, 69,174,223,241,221,220, 57,233,169,113, 59, 52, 89, 49,207, 0, 64,147, 21,243,236, - 69, 24,190,202,206, 72,153,147, 35,139,253,238, 93,247,133, 90,173, 78,219,183,111,159,125,155, 54,109, 88,110,110,110,200,202, -202,194,181,107,215,172, 86,171, 53,181,202, 90,185,113,215,212,185,140,227, 47,219,190, 95,205,147,216,244, 54,155,205,158,132, - 0, 28, 14, 39,221,160, 81,156, 87,178, 36,159, 35, 47, 65, 87,254, 61,195,202, 0, 96, 21,205, 93,104,181, 90,153,213,155,118, - 39,112,133, 54,165, 14,134,104,210, 41,197, 86,171,181,210,115, 29,202,147,194,106,253, 89,231, 55, 67,200,210, 70, 77, 91,126, -105, 50, 25,117,133,231,135, 14,128,142, 16,228,176, 88,204, 13,182,213,116, 65,241, 30, 15, 83, 12, 3, 91,194,112, 96, 35,226, -128, 1, 3, 85,126, 46,169, 74, 78, 86,169,134, 88, 22, 29,169,145,117,240, 61,103, 56, 52,246,234,165,179, 31, 88, 44,150, 26, -133, 49,131,120,189, 86,125, 88,149,238,240, 11,240,200,140,127, 63,103,138,204, 22,243, 23,255, 80,165,154, 81,254, 78,154,129, - 53, 69,253,171,121,185,141,141, 79,144, 61,136, 77,214,252,130, 55,167,213,121,159,114,178,221,220,220,190, 98, 24,102, 52,159, -207,151, 26, 12, 6, 53, 33,100, 79,102,102,230,215,248,195,228,191,193, 92,145,171,118, 44, 95, 40, 94,104,212,169,127,211,200, -162, 71, 86,180,237, 98,151,218,221,133, 18,201, 92,157, 86,189, 71,147, 25,189,251, 79,222,159,118, 2,129, 32, 88, 42,149,114, -179,179,179,239, 3,200,255, 59, 29,247, 70,141, 26,249,176, 88,172, 26, 86,171,213, 13,128, 29, 10,122,133,100,115, 56,156,212, -194,136, 22,169,170,102,219, 15, 15, 59,119,233, 86,127,214,197,155, 81, 27, 10,155, 21,139,241, 26,178, 78, 56,186,119,167,207, -126, 57,118,178,180, 94,135,255,184, 58,255,255,167,217,129, 35,245,200, 30,199,226,219, 45,239, 18,168,211,100,167,165, 78,187, -245, 52,235, 62, 0,229,251,148,147,199,227,141, 50, 26,141, 34, 30,143,167, 53, 26,141,251,254, 46,219, 46,114, 13,156,192, 2, -169,244,204, 20, 86, 48,143,222,234,180,242,111,169, 75,236,160,160,160,118, 60, 30,207,199, 98,177,136, 13, 6,131, 70,171,213, -198, 39, 36, 36,252,134,178, 39, 62,255, 75,203, 41,113, 13, 88,207,227, 9, 62, 1, 0,163, 81,191, 81, 45,139,153, 85,222, 23, -203, 89,255, 31,125,140,156,107, 52,141,225,176,185, 46, 40, 28,152,219,106, 54,103,101,198, 61, 12,248, 31,150,243, 95, 7, 33, -228, 47,255,141,174, 84,147,106, 82, 77,170, 89, 10, 44,186, 63,169,230,255, 82, 83,232, 81,215, 91,232, 81,183,210,131, 46,151, -177, 62,221,159,148, 34, 38,151,242, 2, 33, 4, 28,186,111, 40, 20,202,255, 0, 43,221, 5,148,255, 37,186,244, 23,201,127,229, -250,148,255, 28,101,230, 68, 51,229,184,210,170,132, 4,223,197,217, 94,166,154, 84,147,106, 82, 77,170, 73, 53,169,230,127, 78, -179, 34,237,127, 98,147,228,228,183,150,207, 0, 72,167, 77,135, 84,147,106, 82, 77,170, 73, 53,169, 38,213,252,187,104,254,155, - 40,110, 58,100,209,125, 65,161, 80, 40, 20, 10,133,242,215, 64,115,180, 40, 20, 10,133, 66,161, 80,222,143,210,154, 14,169,209, -162, 80, 40, 20, 10,133, 66,249, 19, 40, 51, 25,158, 54, 29, 82, 40, 20, 10,133, 66,161,188, 31, 69, 17, 45, 15,148, 24,222,129, - 26, 45, 10,133, 66,161, 80, 40,148, 63,143,116,148, 22,221, 10, 13, 13, 37,165,253, 79,161, 80, 40, 20, 10,133,242,255,193, 63, -220,139,148,140,100, 77, 46, 92,126,179,215, 33, 53, 88, 20, 10,133, 66,161, 80,254, 46,102,235, 31, 70, 81, 36,171,232, 85, 60, -105,118,177,209, 10, 9, 9, 97,168,217,162, 80, 40, 20, 10,133,242,191,226,223,232, 69, 88,111,111, 32, 61,204, 20, 10,133, 66, -161, 80,254,151,102,235,223,180, 61,116,120, 7, 10,133, 66,161, 80, 40,148,247,195, 3, 64,159, 18,203,103, 80,162,249,144, 66, -161, 80, 40, 20, 10,133,242,238, 76, 46,109,153, 16, 66, 35, 90, 20, 10,133, 66,161, 80, 40,127,129,217,162, 80, 40, 20, 10,133, - 66,161,252, 85,252,127, 76, 42, 77,103, 54,167,154, 84,147,106, 82, 77,170, 73, 53,169,230,191,157,162,113,180,128, 18,227,104, - 1,116,100,120, 10,133, 66,161, 80, 40,148,247,165, 15, 10,198,207,154, 92,248,183, 15, 53, 90, 20, 10,133, 66,161, 80, 40,127, - 46,127,152,126,135, 26, 45, 10,133, 66,161, 80, 40,148, 63,215, 96,109,167, 70,139, 66,161, 80, 40, 20, 10,229, 47,134, 26, 45, - 10,133, 66,161, 80, 40,148,191, 8, 6,101,247, 28,184, 92, 5,157,119,233,125,112,153,106, 82, 77,170, 73, 53,169, 38,213,164, -154,255, 57,205,138,180, 47,227,159, 71,209,200,240,103,240,123, 34,252,118, 66,254,250,105, 27,105,215, 87,170, 73, 53,169, 38, -213,164,154, 84,147,106,254,219,153,252,214, 95, 0,255, 63,227,104, 81, 40, 20, 10,133, 66,161,252,215,204, 86,177,225,162, 83, -240, 80, 40, 20, 10,133, 66,161,188, 31,219,203,250,128, 70,180, 40, 20, 10,133, 66,161, 80,222,143,201,101, 45, 83,163, 69,161, - 80, 40, 20, 10,133,242,215, 24, 46,106,180, 40, 20, 10,133, 66,161, 80,254, 68,147, 53,185,212, 79, 67, 67, 67, 9,221, 71, 20, - 10,133, 66,161, 80,254, 87,252,219,188, 72,241,240, 14, 69, 27, 70,205, 22,133, 66,161, 80, 40,148,255,165,201,250,135,122, 17, - 15,252,222,219,112,114,225, 50, 8, 33,180,215, 33,133, 66,161, 80, 40, 20,202,123,210, 7,111,246, 60,156, 92,180, 76,141, 22, -133, 66,161, 80, 40, 20,202,251, 51,185,220, 79,105,179, 33,133, 66,161, 80, 40,148,255, 37,255,198, 28, 45,134, 30, 86, 10,133, - 66,161, 80, 40,148,247,162,180,104,214,255,203, 92,135, 20, 10,133, 66,161, 80, 40,255, 73,195, 69,141, 22,133, 66,161, 80, 40, - 20,202, 95, 96,178,138,140,214, 95, 61, 96, 41,157,217,156,106, 82, 77,170, 73, 53,169, 38,213,164,154,255, 21,147, 85,114,136, - 7, 0,180,215, 33,133, 66,161, 80, 40, 20,202,251, 66, 39,149,166, 80, 40, 20, 10,133, 66,249,139,160,147, 74, 83, 40, 20, 10, -133, 66,161,252, 63, 27, 46,106,180, 40, 20, 10,133, 66,161, 80,254, 68,147,245,134,217,162, 57, 90, 20, 10,133, 66,161, 80, 40, -239, 71,153, 57, 90, 12,202,238, 57,112,185, 10, 63,240, 46,189, 15, 46, 83, 77,170, 73, 53,169, 38,213,164,154, 84,243, 63,167, - 89,145,246,101,252,243,153,140,255,167, 1, 75,105,215, 87,170, 73, 53,169, 38,213,164,154, 84,147,106,254,215,152, 12, 20,140, -163, 69,155, 14, 41, 20, 10,133, 66,161, 80,254, 4, 99, 85, 26,212,104, 81, 40, 20, 10,133, 66,161,188, 31,116, 28, 45, 10,133, - 66,161, 80, 40,148,191, 8, 15, 20, 68,181,138,254, 6, 83,163, 69,161, 80, 40, 20, 10,133,242,231,208, 7, 5, 81,173,162,191, -212,104, 81, 40, 20, 10,133, 66,161,252,137,148, 58,142, 22, 3, 0,161,161,161, 69,253, 15, 59,134,132,132,220,160,251,138, 66, -161, 80, 40, 20,202,255, 39,255, 70, 47, 66, 8,249, 61,162, 21, 18, 18,194, 0,184, 78, 15, 53,133, 66,161, 80, 40,148,255, 5, -255, 70, 47,194,122,203, 73,118,164,135,153, 66,161, 80, 40, 20,202,255,130,127,163, 23,225,188,229, 34, 41, 20, 10,133, 66,161, - 80,254, 39,252,131,189,136, 7, 10, 18,225,207, 20,254, 5, 10,135,124,160,227,104, 81, 40, 20, 10,133, 66,161,188, 31, 69,189, - 13, 39,227,173, 49,181,104, 20,139, 66,161, 80, 40, 20, 10,229,253, 40,109,100,248,255,151,185, 14, 41, 20, 10,133, 66,161, 80, -254,147,208,185, 14, 41, 20, 10,133, 66,161, 80,254, 28, 74, 70,181,182,255,127,253, 40,157,217,156,106, 82, 77,170, 73, 53,169, - 38,213,164,154,255, 37,147, 85,188,252,198, 56, 90, 20, 10,133, 66,161, 80, 40,148, 63, 23,218,116, 72,161, 80, 40, 20, 10,133, -242,126, 20,245, 56, 44,185, 76,141, 22,133, 66,161, 80, 40, 20,202,159,104,182,254, 0,109, 58,164, 80, 40, 20, 10,133, 66,121, - 63, 38,151,245, 1, 53, 90, 20, 10,133, 66,161, 80, 40,127,145,225, 98, 80,118,207,129,203, 85, 16,126,151,222, 7,151,169, 38, -213,164,154, 84,147,106, 82, 77,170,249,159,211,172, 72,251, 50,254,121,252,207, 6, 44,165, 93, 95,169, 38,213,164,154, 84,147, -106, 82, 77,170,249,159,132, 14,239, 64,161, 80, 40, 20, 10,133,242, 23, 82, 21,163,229,194,225,112,190, 20,137, 68, 63,136, 68, -162,109, 28, 14,231, 59, 0, 14, 85,253, 65,137, 68, 50,211,221,221,253,165,187,187,123,138,143,143,207, 89, 27, 27,241,167,126, - 2,180, 7,192,253,147,182, 39, 16,192,167, 34,145,232,133, 80, 40, 76, 0,176, 23,192,167, 0,156,223, 71,248,107, 79, 12,126, -246, 73,255, 19, 95,123, 98,240, 91, 31,245,113,115,115,187, 5,160,251,159,117, 80,134,139,209,117,136, 4, 73, 67, 36, 72, 26, - 46,126,247,167, 6, 27, 27,155,209, 30, 30, 30,119,157,156,156, 82, 61, 60, 60,238, 8,133,194, 33, 85,148,112,117,115,115, 91, -227,237,237, 29,237,233,233,185, 1, 5,179,147,255,109,105, 39, 64,187,150, 2,100,181,226, 67,217,134,143, 31, 90,241,209,173, - 27, 32,126, 71,185,182, 0,142,216,218,218, 62,230,112, 56,161, 0, 6, 21,214,175, 65, 28, 14, 39,212,214,214,246, 49,128, 35, -133,235,189, 75, 61, 93, 3, 32, 21,192,202,194,229,143,189,189,189,149, 13, 27, 54, 76,104,216,176,225, 46,127,127,255, 49,149, - 21, 19,139,197,221,188,189,189,143,250,248,248, 36,180,106,213, 42,215,203,203, 43,170, 90,181,106,187, 5, 2, 65, 71,122,137, -163, 80, 40,148,191, 63,125, 1,124, 3, 96,115, 68, 68, 68, 24, 33, 36,140, 16, 18, 22, 17, 17, 17, 6,224, 7, 0,171, 80,118, - 8,241,141,247,157,156,156,150, 46, 95,190, 92,151,158,158, 78,178,178,178, 72,116,116, 52, 89,191,112,174,181,135, 35,135,248, -185, 56,104, 60, 60, 60, 94,251, 86,171,118,160,190,148, 53, 23, 64,173,202,104,150,192, 65, 36, 18,221, 95,184,112,161,234,214, -173, 91, 42,131,193,160,178, 90,173,170,180,180, 52,213,229,203,151, 85,109,218,180, 81, 1,152, 5,128, 93, 5,205, 98,150,121, -226, 6,249,249, 43,178,204, 19, 55, 74,190, 95,167, 78,157,231, 86,171,149, 12, 30, 60, 88, 15,192,171, 42,154,111,227, 5, 8, -235,219,194,126,136, 20,153,230,221, 95, 19,178,101, 14, 25, 34, 65,210,187,104,186,186,186,158,156, 57,115,166, 34, 53, 53,149, -232,245,122,146,148,148, 68,166, 76,153,146,239,234,234,186,175,146,219,238, 20, 20, 20,148,121,247,238, 93,171, 92, 46, 39,215, -175, 95,183, 54,104,208, 32,179,146,102,171,235, 91,101,217,238,233,233,121,182, 42, 47, 87, 87,215, 29, 85, 61, 70, 45, 4, 72, - 50,134, 93, 35,228,225, 69,114,106,112, 43,178,190,105, 53, 50,200,145, 47,111,203,199,199, 29, 74, 31,202,164, 44,205, 15, 58, -116,232,160,126,250,244,169, 37, 39, 39,135, 60,127,254,220, 58,105,210, 36, 29,128,200, 73,147, 38,233,158, 63,127,110,205,201, -201, 33, 79,159, 62,181,116,232,208, 65, 13, 96, 98, 21,202,201, 2,176,115,201,146, 37,132, 16, 66,150, 47, 95, 78, 26, 54,108, - 72, 58,119,238, 76, 84, 42, 21, 33,132, 36, 16, 66,118,153,205,230,113,149,209,180,179,179, 27, 61,115,230, 76,149, 70,163, 33, - 69, 88,173, 86, 34,151,203,201,230,205,155,213,238,238,238,103,203,120,200,160, 77, 30, 84,147,106, 82,205,191,155,230, 63, 25, - 15, 20,228,105, 21,189, 60,128,130,166,195,138, 24, 49,119,238,220, 34, 83,117,174,109,219,182, 15,198,141, 27, 23, 54,110,220, -184,176,182,109,219, 94, 7,112,225,209,163, 71, 97, 95,124,241, 69, 24,128, 17, 21, 28, 8,135,214,173, 91,203, 51, 50, 50, 72, - 64, 64, 0,169, 94,189, 58,201,200,200, 32,132, 16,242,240,131, 38,228, 74, 93,144,228,155,231,200,197,227, 71,200, 36, 15, 14, -105,231, 97,103,242,112,119,207,113,118,118, 94,129,130,164,253,242, 14,238,192,186,117,235, 42, 35, 35, 35, 85, 49, 49, 49,170, -165, 75,151,170, 58,119,238,172, 10, 10, 10, 82, 13, 26, 52, 72,181,105,211, 38,149,209,104, 84,237,216,177, 67,101,107,107, 27, - 89,138,217,122,103,163,197,225,112, 54, 70, 68, 68,144,215,175, 95,147,194, 40, 69, 89,154,118,246,246,246, 61, 29, 28, 28,102, -217,219,219,247, 4, 96, 7, 0, 1,128,180,145, 29,124, 62,110,228, 87, 39,116, 68,215, 90,155,187, 54,107, 50,196,134, 37, 55, -125, 63,135,144,193, 62,239,100,180,236,236,236, 70,127,250,233,167, 74,189, 94, 79, 52, 26, 13, 81,169, 84, 68,163,209, 16,165, - 82, 73, 70,140, 24,161, 16, 10,133, 3, 43,210,116,118,118,254,250,230,205,155,230,140,140, 12,114,243,230, 77,114,246,236, 89, -178,101,203, 22,171,171,171,235,186,170,158,128,238,238,238,151, 46, 94,188, 24, 22, 30, 30, 30,118,255,254,253, 48,147,201, 20, -102, 52, 26,195,140, 70, 99, 88,104,104,104,216,177, 99,199,194, 14, 30, 60, 24,102, 48, 24,194, 12, 6, 67,152, 94,175, 15,171, - 89,179,230,249,170, 30,163,230, 2, 36, 27,110,157, 34,100,221,116,146,255,237, 52, 34,159,221,155,200,166,180, 39, 63, 52,171, - 70,218,139,112,250,173,122, 84,166, 38,151,203,189,145,144,144, 96,157, 63,127,190,161, 94,189,122,249,227,199,143,215,233,245, -122, 66, 8, 33,122,189,158,140, 31, 63, 94, 87,175, 94,189,252,249,243,231, 27,226,227,227,173, 28, 14,231,114, 21,202,185,170, -200,100,221,184,113,131,148, 68,165, 82,145,206,157, 59, 39, 52,108,216,112, 87,141, 26, 53, 70, 86,164, 41,149, 74,251,207,155, - 55, 79, 69, 74,193,100, 50, 17,165, 82, 73,226,227,227,173,213,171, 87, 79, 3,224, 68, 47,230, 84,147,106, 82, 77,106,180,254, - 50,202,156,130,167,220,157,248,197, 23, 95,132, 17, 66,194, 22, 44, 88, 16, 86, 24,217,226, 1,144, 22,190, 56, 0,134,207,155, - 55, 47,140, 16, 18, 54,119,238,220,162,117,202, 58, 16,125, 15, 31, 62,108,220,176, 97, 3,113,115,115, 35,238,238,238,100,227, -198,141,196,106,181,146,140,208,125,228, 74, 93,144, 23, 95,142, 37,132, 16, 18,189, 98, 6,185, 82, 23, 36,246,199,101,100,212, -168, 81, 26,177, 88, 60,162,156,131,235,216,164, 73, 19,165, 86,171, 85,237,222,189, 91, 37, 22,139, 31, 2,168,135,130,166, 72, -166,176,172, 99,234,213,171,167,120,246,236,153,234,215, 95,127, 85, 1, 88, 90,201, 10, 83, 11, 64, 39,137, 68, 50,104,158, 23, - 55,134,252,252, 21,153,231,134,167, 0, 26, 0,112, 41, 92,199,115,238,220,185,132, 16, 66,188,189,189,111,150,161,105, 23, 20, - 20, 52, 55, 38, 38,102,177,201,100, 90, 28, 30, 30,190,184,118,237,218,243,251,213,244,104,117, 98, 68,183,224,252,101,211,130, -201,218,217, 65,223,245,106,222,245,192,176,142, 35, 62,172,225,124,107,188,171, 80, 51,212,142,173,124,171,233,176, 82, 21,219, -203,203,235,126, 82, 82, 82,177,185, 82, 42,149, 36, 53, 53,149,196,197,197,145, 91,183,110, 17, 15, 15,143, 43, 21,105,186,187, -187, 63, 79, 74, 74, 34, 63,174, 95, 79, 6, 55,168, 67,218,219,219,144, 14, 14, 54,164,169, 84,168,174, 11, 52,173,170,209,122, -252,248,113, 24,128, 48, 0, 97, 57, 57, 57, 97, 57, 57, 57, 97,121,121,121,197,239, 1, 8,203,207,207, 15,203,207,207, 15, 51, - 24, 12, 97,126,126,126, 85, 54, 90,109,132,104,211, 66,136,220, 86, 2,104,251,122, 57,167, 77,171,233,108,185, 55,162, 21,201, -155,222,153,108, 8,246, 34,109,249,248,184,146,154,125,249,124,254,117, 0,115, 10, 77,249,216,158, 61,123,106, 8, 33,164,103, -207,158, 26, 0, 99, 11,223,255,180,208,100,245,172,100, 57, 89,254,254,254,234,162, 72, 22,128,223,252,253,253,213, 13, 27, 54, - 36, 13, 27, 54, 36,222,222,222,202, 66,237, 74, 93,208,106,213,170, 21,173,213,106,139, 13,160, 92, 46, 39,105,105,105, 36, 54, - 54,150, 68, 70, 70,146,135, 15, 31,146,132,132, 4,114,232,208, 33,139,189,189,253, 25,122, 49,167,154, 84,147,106, 82,163,245, -151, 26,173,183, 95,111, 26,173,208,208,208,183,109,215,183,143, 30, 61, 10,155, 55,111, 94, 24,202, 25,136, 11,192,228, 5, 11, - 22, 20, 69,189,190, 41,231,230,191, 35, 58, 58,154,140, 29, 59,150, 4, 6, 6,146,192,192, 64, 50,110,220, 56,146,159,159, 79, - 84,175,158,145, 43,117, 65, 30, 14,109, 74, 8, 33, 68,249, 34,156, 92,169, 11, 18, 54,170, 53,121,242,228, 9,169, 86,173,218, -197,114,126,255,244,157, 59,119,178,246,237,219,151,129,130,124, 44, 46,128,150, 0, 54,138, 68,162,157, 40,104, 46,172, 14,192, - 33, 32, 32, 32, 87,163,209,168, 6, 15, 30,172, 2,224, 83,142,102,135,192,192,192,215, 59,118,236, 32, 50,153,140,228,230,230, -146,213,109,106, 19,242,243, 87,100,121,211,234,214, 31,127,252, 81, 63,103,206, 28,181,163,163, 99, 40, 0,207,193,131, 7,155, - 9, 33,164,125,251,246,153,165,137,217,219,219,247,140,137,137, 89,172,211,233, 22,203,229,242,197,185,185,185,139, 79,157, 56, -177,184, 71,131,218, 99,243,151, 77, 11, 62, 49,162, 91,112, 47, 47,135, 65,235,186, 55,155,154, 58,127,226,224, 5,173,235,189, -208,173,250,228,218, 7, 53,221,214,188,203,209,118,113,113, 73,215,235,245, 4,192, 31, 94,175, 95,191, 38, 78, 78, 78, 73, 21, -105, 56, 58, 58, 46,248,116,248, 48,203,192,234, 94,228,245,134,133,196,116,233, 87, 98, 58,187,155,188,250,118, 54,233,231,238, -172,104,201, 99,205,171,108,121,220,221,221, 47,221,191,127,255, 13,163,149,151,151, 87,170,209, 82, 40, 20, 97, 6,131, 33,204, -223,223,255,252,251,214,250,150,124,248,117, 16,177, 31,134,143,109, 71,178,166,117, 38, 61,237,184, 9,239, 33, 55, 28,192,117, - 0,163,170,248, 61, 22,128, 85, 69,134,234,219,111,191, 37,132, 16,226,239,239,175,198,251,141, 99,103, 87,167, 78,157,184,137, - 19, 39,154,235,214,173, 43,107,211,166,141,252,193,131, 7,228,198,141, 27,228,236,217,179,228,200,145, 35,228,217,179,103, 36, - 53, 53,149, 68, 71, 71,147, 62,125,250,200, 1,116,160,215, 66, 10,133,242,119,166, 20, 47,242,143,166,184,215, 97,104,104, 40, - 9, 9, 9, 97, 74,108,160, 29, 0, 97,211,166, 77,179, 86,173, 90,181, 22, 5,195,202, 51, 65,108,124,208, 89,196,121,210, 89, -196,121, 18,196,198, 7,133, 17,163,237, 43, 86,172,248,186, 97,195,134,233, 0, 68, 0,220,203,248,177,118, 78, 78, 78, 72, 74, - 74,130,157,157, 29,236,236,236,144,148,148, 4, 66, 8,204, 4, 48, 17, 64,111, 52, 66,171,213, 66,103, 37,208, 90, 1,133, 74, - 5,119,119,119, 24,141, 70,191, 50,182,161,209,208,161, 67,253,130,130,130,178,190,248,226,139, 52, 20,228,202,236,156, 48, 97, -194,165,223,126,251, 45, 72,165, 82,229, 70, 70, 70,234, 26, 52,104,208, 19,128,123, 76, 76,204,232,205,155, 55, 99,236,216,177, - 40,231,166,211,160, 79,159, 62,103,159, 61,123,230, 55,106,212, 40, 92,191,126, 29,171, 87,175, 70,118,118, 54, 1, 0,189, 94, - 79, 44, 22,139,177,117,235,214,198, 13, 27, 54, 52,111,223,190,253,253,154, 53,107,178, 1, 32, 46, 46,238, 85,105,130, 12,195, -212,246,245,245,133, 94,175, 71, 86, 86, 22,158, 61,123, 6, 27, 59, 59, 68,164,101,187,117, 92,247, 99,206,151, 39, 46,113,135, - 55, 15,114,156,213,173,141,126,229,197,235, 1,245, 60,221,220, 12, 70,147,123,116,122,102,218,187, 28, 88, 30,143,151,148,157, -157, 13,131,193, 0,173, 86, 11,133, 66,129,156,156, 28,100,103,103, 35, 45, 45, 13, 60, 30,239,117, 69, 26,182,185,185, 55,227, -238,220, 96, 14,109,253, 22,126,230, 92,112,142,110, 4,231,228, 15,168,101,200,194,182,133, 83,108, 12, 78, 46, 75,108,109,108, -242,236,237,237,183, 3,240,175, 72, 47, 56, 56, 24, 57, 57, 57,200,201,201,129,147,147, 19, 28, 28, 28,224,224,224, 0,185, 92, -142,252,252,124, 40, 20, 10, 4, 4, 4,160, 81,163, 70,216,179,103,207,159, 82,193,239, 25, 16,107,134,101,218,165,168, 52,240, - 36, 18,212,116,144,250, 54,147,194,177,156,175,116,230,114,185,135, 29, 29, 29, 47, 2,152, 14, 64, 2, 96,186,163,163,227, 69, - 46,151, 59, 0,192,114, 0,251,170, 88,140,149, 75,150, 44,153, 27, 19, 19, 35,126,242,228, 9,190,248,226, 11, 44, 93,186, 20, -175, 94,189,250, 30,128,181,112,157,143,156,156,156, 66, 89, 44,214, 79, 0,122, 3,232,233,225,225,209,165, 2,221, 1,115,230, -204,209, 53,105,210, 36,250,197,139, 23, 3,238,220,185,211,116,246,236,217,249,137,137,137,136,142,142,134,135,135, 7,188,189, -189,161, 82,169,144,151,151,135, 1, 3, 6,216,217,218,218,142,160,151,113, 10,133,242,119, 54, 89,111,121,145,127, 90, 68,171, -212,229, 82,159,168,197, 98,241,146,176,176,176, 86, 13, 27, 54,228, 0, 56, 4, 0, 65,108, 12, 25,208,186,241,206, 19,219,191, -109,120,108,195,194,134, 61, 26, 6,236, 12, 98,163,168, 23, 91,104,211,166, 77, 29,194,194,194, 90, 11, 4,130,143,203, 50,118, - 0,224,224,224, 0, 59, 59, 59,216,219,219,195,193,193, 1, 86,171, 21, 42,141, 14,106, 11,160,212, 25,144,159,159, 15,101,225, -178, 74,111,132, 90,173, 46,254,110, 41,116,156, 56,113, 98,214,230,205,155,101,233,233,233,223, 2,104, 48,118,236,216,254,155, - 54,109,194,213,171, 87,117,189, 3,107, 57,173,104,215,248,235,122,233,175, 22, 7,114, 49, 9,192,205,155, 55,111,162,117,235, -214, 96, 24,102, 88,105,130, 34,145,232,135, 3, 7, 14,136, 34, 35, 35, 81,171, 86,173,200, 97,195,134,125,240,237,183,223,250, - 73, 84,185,183, 1,192,156,147, 17, 57, 99,198,140,175, 86,172, 88,145,149,149,149,101,212,104, 52,174,253,250,245, 67, 82, 82, - 18, 82, 83, 83,127, 43,195,100, 70,135,135,135,147,252,252,124,196,198,198, 34, 60, 60, 92,244,213, 87, 95, 53,183,176, 88,253, - 83, 96,243,225,216, 54, 77,155,143,106,217, 24,251,238, 62,225,221,138,138,179,111, 90,221,203,225,113,114,122, 13, 19,131,215, -239,114,180,149, 74,229,198,175,191,254, 90,165, 82,169,144,146,146,130,167, 79,159,226,197,139, 23, 72, 72, 72,192,234,213,171, - 85,185,185,185,155, 42,210,240, 20,114, 62, 91, 51,123, 2,195,121,254, 27,240,228, 6,160, 81, 2, 90, 21,244, 47,195,176,235, -101, 6,182, 28, 61,206, 79, 76, 74,178, 63,120,240,224, 68, 31, 31,159, 48, 0, 1, 21,185,122, 0, 96,177, 88,111,155, 80,176, - 88, 44, 37,128, 12,137, 68,146,108, 99, 99,147,204, 98,177, 50, 8, 33,234, 63,163,230,179,204, 48,130,205, 6,248, 34,176,184, -229, 78,237,249,193,176, 97,195, 14, 36, 39, 39,247,136,141,141,109,181,105,211,166,175,133, 66, 97,196,166, 77,155,190,142,141, -141,109,149,156,156,220, 99,216,176, 97, 7, 0,140,169,202,239,251,251,251,207, 88,188,120, 49, 86,175, 94,141, 70,141, 26, 33, - 32, 32, 64,179,100,201,146,141, 0, 22, 2,248,216,223,223,255,246,140, 25, 51,198,203,100, 50,247,148,148,148, 70,223,127,255, -253,148,141, 27, 55, 54, 75, 75, 75, 19, 86, 32,221,182,123,247,238, 56,119,238, 28, 0,164, 3,136,205,201,201, 49,167,165,165, -161, 78,157, 58,104,222,188, 57, 84, 42, 21, 84, 42, 21,228,114, 57,124,125,125, 97,181, 90, 91,209, 75, 57,133, 66,161,252,191, - 26,174,210,141,150, 80, 40,116, 8, 14, 14, 70,205,154, 53, 29, 80,216, 91,203,137,207,153, 63,107,226,112,177, 52,236, 60,152, -240, 43, 24,214,174,190,216,137,207,153, 95,248, 21,142,175,175,175, 32, 56, 56, 24, 18,137,196,171,140, 31,191,158,145,145,129, -224,224, 96,216,219,219,195,206,206, 14,193,193,193, 48, 26,141,200, 87, 42,161,182, 0, 26,147, 21,249,249,249,200,205,202,132, -198, 2,152,109,156,144,144,144, 0, 54,155, 29, 87,134,166, 71,173, 90,181,178, 34, 34, 34,178, 0,220, 4, 48,117,233,210,165, -152, 55,111, 30, 22, 45, 90,116, 64,156, 30,223,253,192,185,147, 78,251,151,124,228, 18,192,103,134, 3, 48, 38, 39, 39,195,222, -222, 30, 18,137,164, 84, 99,208,190,125,251, 38, 18,137, 4,187,119,239, 38, 41, 41, 41,109, 80,208,133, 63,142, 97, 10,204,158, -136,133,124, 0, 27,195,194,194, 90,124,245,213, 87, 81, 93,187,118,229,182,108,217, 18,203,151, 47, 7,128,208,210, 52,229,114, -249,189, 49, 99,198, 24,174, 93,187,134,151, 47, 95, 74, 78,156, 56, 49,100,249,242,229,245, 19, 19, 19, 5,167,207,158,239,181, - 55, 89, 49,228,219,139,183,132, 43, 46, 92,191,231,108, 43,169, 87,195,217, 17,225,137,169, 60, 11, 27, 15, 42, 58,162, 45,184, -236,137, 29,133,156,240,118, 2, 86,122, 71, 33, 39,172, 25,151, 61, 65,169, 84, 30, 60,117,234,212,133,217,179,103,171,100, 50, - 25,108,108,108,144,147,147,131,149, 43, 87,170,194,195,195,143, 26, 12,134,211, 21,233, 90,172,164,137,119,117, 31,224,117, 68, -241,123, 70, 43,193, 3, 3, 15, 33, 83, 63, 65, 96,157, 58, 48, 24, 12,104,208,160, 1,179,116,233, 82,137,157,157,221,231, 21, -154, 30,214, 31,170,155,153, 97,152, 12, 66, 72,170, 74,165, 74, 17,137, 68,137, 60, 30, 47, 49, 55, 55, 55,133, 16,146,249,103, -248, 44,194,194,103,173, 27,248, 3, 2, 17, 18,115, 84,105, 15, 85,200, 45,109, 69, 27, 27,155, 9, 91,182,108, 17,254,252,243, -207,166, 25, 51,102,232,167, 76,153,194,213,106,181,174, 83,166, 76,225,206,152, 49, 67,255,243,207, 63,155,182,108,217, 34,148, - 74,165,131,222,165, 32, 38,147, 9, 17, 17, 17,223,190,122,245, 74,130,130,225, 70, 62, 89,178,100,201,216,152,152, 24,225,230, -205,155,113,228,200, 17, 28, 57,114, 4,253,251,247,199,204,153, 51,177,120,241,226,242,228,196, 13, 27, 54, 12,118,114,114,194, -141, 27, 55,210, 0, 36, 2,104, 34,149, 74,109,250,247,239,143, 30, 61,122, 64,167,211,193,104, 52, 22, 27, 45, 54,155, 13,123, -123,123, 39,122, 13,164, 80, 40,148,191,220,100,189, 97,182, 56, 0, 80, 20,170, 11, 9, 9, 97,202,187, 49, 90,242,100,144,171, - 53, 72,200,215, 32, 41,207,250,198,103, 86,171,181,220, 95, 79, 75, 75, 59,125,247,238,221, 9,193,193,193,156,180,180,130, 22, -177,224,224, 96,104, 52, 26,164, 61,185, 15,181, 21,144,212, 10,130, 90,173, 70,222,139,199,144, 54,108, 5,167, 62,163,176,110, -243,102,125, 78, 78,206,214,210, 52,249,124, 62,183, 90,181,106, 89,113,113,113,102, 0,185,118,118,118,221,125,124,124,112,253, -250,117, 0,216, 71,128, 53, 8,191, 6,220, 56, 6, 82, 16, 82,145,250,250,250, 66, 38,147, 65,165, 82, 93, 47, 77,243,238,221, -187, 49, 38,147,169, 65,191,126,253,152, 95,126,249,229,144, 66,161, 88, 4,224,169,222, 10,246,147,228, 76,168, 45, 16, 2,232, -230,224,224,240,233,226,197,139,187,204,152, 49, 3,167, 78,157,194,197,139, 23,141, 40,200, 5,187, 91,138,108,126,108,108,236, -182, 57,115,230,180,100,177, 88, 83, 47, 93,186,100, 14, 8, 8, 80, 24,141, 70, 75,237,192, 64,214,162,165,203,120,211,167, 78, -182,207,209,224,121,143,218, 30,173, 25, 6,120,158, 42, 75,124,165, 66, 78,121,251,180, 61,159, 29, 58,160, 77,195,246, 19,134, -245,149, 74,106,213,131,250,217,125,247,109,135,207,174, 19,133,199,132,220,144,201,250,159, 58,117,106,200,245,235,215,167, 27, - 12,134,154, 2,129,224,181, 92, 46,223,160, 82,169, 42, 52, 89,108, 54,187,143,222,163,154,131, 60, 55, 23,194,194, 72,148,194, -100, 69,182,222,140,151,246, 1, 24, 81,205,187,184, 25, 52, 35, 35, 3,238,238,238,140,197, 98,233, 91,158,230,197,139, 23, 17, - 18, 18, 82,100, 60,193, 48, 12, 24,134,201, 14, 12, 12,204, 20, 8, 4, 57, 60, 30, 79,177,102,205, 26,157, 78,167, 3,135,195, - 17, 90, 44, 22,246,251,212,246,230, 98,184, 10, 8,243,195,148,126,157,186, 54,170, 87,135,220,124,248,132,201,211,232,118,149, - 19, 5,252,222,223,223,159,147,155,155,123, 26,192, 75,147,201,180,255,208,161, 67,194,209,163, 71,235, 14, 31, 62, 60, 18,128, -223,218,181,107,135,168, 84,170,237, 85, 41,199,171, 87,175,190, 95,177, 98,197,220, 5, 11, 22, 96,207,158, 61, 51, 94,189,122, - 53,175, 48,210,213,127,241,226,197, 88,179,102, 13,246,236,217, 99,125,249,242,229, 89,171,213,250,106,246,236,217, 13,221,220, -220,178,211,211,211, 95,149, 35,219,180,103,207,158,250,219,183,111,243,149, 74,229, 45, 0,159, 78,155, 54,109, 98,139, 22, 45, - 20,195,134, 13,147,230,230,230,202,197, 98, 49,127,199,142, 29, 14, 28, 14, 7,106,181, 26, 12,195, 64,169, 84, 26,232,117,144, - 66,161,252, 93, 41,203,139,252, 67, 40,243,222,192, 41,109, 3, 53, 26, 77,102, 82, 82, 82,157,212,212, 84, 51, 0, 51, 0,228, - 24,204,223,172,216,113,236,231, 65, 45,253, 37,233, 38, 19, 78, 60,140,212,228, 24,204, 69,201,239,230,212,212, 84,101, 98, 98, -162,141, 86,171, 85,149,241, 91,191,253,240,195, 15,218,107,215,174,217,196,198,198,194, 98,177,160, 73,147, 38,136,142,142, 70, -222,203, 8, 72,234, 52,129,164, 67, 8, 34,195, 30, 34,252,226,101,196,171, 12,230,168,133, 43,242, 85,106,245, 98,163,209,120, -162, 52, 65, 46,151,155, 11,128, 16, 66, 44, 0,160, 80, 40,158,170, 84,170,118,110,110,110,120,254,252,185, 68,109,193,204, 33, -243,215,109, 34,132, 88,120, 5,189,185,102, 13, 27, 54, 12,143, 30, 61, 2,128, 71,165,105, 42, 20,138, 25,147, 38, 77,186,182, -123,247,110, 78,108,108,108,143,159,127,254,185, 71, 84, 84, 20, 97,114,147, 44,183, 53, 92,248,141,157,217,236, 71,223,192,139, - 33, 33, 33,240,240,240,192,142, 29, 59,176, 97,195, 6,211, 71, 31,125, 20,179, 97,195,134,102, 50,153,108,127, 25,219,159, 47, -151,203,207, 59, 57, 57, 77,175, 95,191,190, 82,173, 86, 35, 39, 39, 7,105,105,105,112,116,114, 98,153,193,106,237, 98,111,191, -255,116,134, 82,194, 57,127, 15,247, 83,210,203,141,102,181,228,178,199, 12,106,223,184,253,199, 11,230, 75,113,251, 4,152, 73, -139, 65,126,254, 26,159,140, 27, 98,163,211,239,239,160,126,146, 48, 58, 76,161,216,171, 80, 40,142, 84,177,178,244,108,221,186, -245,129, 21, 43, 86,136,190, 92,189, 2,107,235,120,193,156,147,131, 44,189, 5,217,122, 51, 20,121, 47,241,252,121, 36,156,156, -156, 17, 31, 31, 15,157, 78,135, 23, 47, 94, 16, 54,155,125,186,162,136, 78, 17, 37,154, 11,229, 2,129, 32,135,203,229,102,114, - 56,156,220,216,216, 88,181, 78,167, 3,139,197,146, 88, 44, 22, 81, 37,202, 90,205,217,217,121, 54, 10, 6, 19, 61,165,204,206, -222, 24,204,133, 61, 56,232,232,235,236,212,107,225,148,209,206, 62,158,174,242,216,152,215,166,173, 23,238,100,235,244,101,119, -214, 0, 16,154,155,155, 91, 28,145, 60,124,248,240, 39,135, 15, 31,158, 8, 96, 39, 10,230,221,186, 44,151,203,127,124,135,147, -111,225,209,163, 71,231, 46, 88,176, 0, 34,145,168,120,240, 84,145, 72, 36, 4,128, 95,127,253, 21,207,159, 63,111,129,194,124, - 45,171,213,122, 32, 61, 61,189, 34, 77,191,160,160,160,216, 99,199,142,241, 1,120, 78,155, 54,173,213,166, 77,155, 48,110,220, -184,172,200,200,200,150, 0,226, 0,248, 77,157, 58,245,193,158, 61,123, 28,172, 86, 43,242,242,242, 96, 48, 24,226,232,165,156, - 66,161, 80,179,245,151, 16, 12, 32, 28, 5,227,103,245, 1,112, 6, 5,105, 29,101,226, 93,232,206, 46, 0,232, 87,116,127, 44, - 35, 25, 30, 40,232,145,117, 30,192, 79, 0,220,202, 18,117,114,114,250,124,236,216,177,166,148,148, 20,146,145,145, 65,142, 28, - 57, 66,102, 77, 24,107,233, 86,203,211, 90,203,211, 77,237,226,226, 18,237,225,236,184,171,177, 24,179, 0, 84,171,196,134,141, -141,138,138,154, 60,118,236,216, 9,133,191, 59,225,192,129, 3,170, 75,151, 46,169,216,108,118, 40, 10,134,118, 40, 50,148, 99, -250,246,237,171,210,235,245,170,192,192,192, 92, 20, 36,238,151,197,144,142, 29, 59,230,157, 59,119,142, 88, 44,150, 63,140, 81, -148,149,149, 69, 46, 94,188, 72,218,180,105, 35, 7, 48,186, 75,151, 46,215,239,220,185,115,189,109,219,182, 71, 43, 42,176,179, -179,243,252, 39, 79,158, 60, 74, 72, 72, 8, 59,115,230, 76,216,254,253,251,195,166, 78,157,250,180, 97,195,134,218,152,152, 24, -171,217,108, 38, 79, 30, 63, 38,129,181,107,171, 1,248,150,165,211, 89,196,121,160,216,241, 53,209, 45, 31, 71,116, 3,188, 9, - 0,162, 92,247, 57,201,156,209,149, 68, 79,239, 69, 58, 9,217,119,223,165,166, 56, 58, 58, 94,120,244,232, 17, 81, 42,149,228, -217,179,103,100, 76, 72, 15,114,119, 98, 87,114,190,135, 63,217,211,161, 6, 89,215,189, 33,233,209,161, 29,249,225,135, 31,200, -177, 99,199,200,252,249,243,173,206,206,206, 74,148,147,163,229,238,238,126,233,208,161, 67, 97, 0,194,216,108,118,152, 66,161, - 8, 83, 42,149,167,147,147,147,183, 4, 6, 6,206,173, 95,191,254,200, 58,117,234,116,238, 84,195,119,110, 23, 27, 65,116, 87, - 91,225,235,218, 82,241, 58,252,113,220,171, 98,236, 0,223, 90,126,126,202, 27, 55,110, 88,245,122, 61,185,117,235,150,181,110, -237, 0,221,218,161, 61,143,198,239, 88,117, 84,119,238,151, 11,154,147,219,239, 28,254, 48, 36,162,163,152,245, 75, 43, 73,241, -112, 28,239,202,112, 0, 39,240,123,175,195,177, 0, 78,162,252, 94,136, 44, 0, 59,151, 47, 95, 94,178,167, 33, 0,176, 26, 54, -108, 24, 70, 8, 9,107,216,176, 97, 88, 85, 11, 34, 22,139,103,159, 58,117,106,137,143,143,207,234, 97,195,134,237,144,203,229, -103, 70,142, 28, 25,129,130,206, 32, 12, 10,102, 71,232, 91,173, 90,181,172,240,240,112,114,253,250,117, 50,120,240, 96, 37,143, -199, 27, 69, 47,227, 20, 10,133,242,151, 48,185,180,191, 21,141,163,181, 34, 34, 34,162,104, 12,173,105,229,137,207,155, 55, 47, -236,209,163, 71, 97, 40, 24, 37,190, 92, 56, 28,206,241,143, 62,250,136,184,185,185,169, 92, 93, 93,143,115,217,236,137,222, 34, - 4,227,221,186,186,183,219,187,119,111,255,239,191,255,190, 15,128, 22, 0,184, 94, 94, 94,105, 25, 25, 25,170, 59,119,238,168, -218,180,105,163,114,118,118,150, 5, 5, 5,169,214,174, 93,171, 50,153, 76,170,217,179,103,171,240,199,241,190, 74, 67, 8, 96, - 58,159,207, 63, 94,183,110,221,136,133,253, 58,155, 86,207,156, 72,198,250,187,168, 0,124, 15,224, 35, 0,246, 0,184, 67,134, - 12,185,242,226,197,139, 11, 65, 65, 65,219, 42,161,235, 89,191,126,253,171, 7, 14, 28,120,116,236,216,177,176,207, 63,255,252, -145,147,147, 83, 74, 76, 76,140, 85,167,211,145,188,188, 60, 34,151,203,201,153, 51,103, 44,142,142,142,155,203,220,112, 1, 59, -157, 92,220, 87,234, 16, 14,201, 11, 70,145, 54,124, 86,234,187,212, 20,137, 68,146,155,147,147, 67, 50, 50, 50, 72,108,108, 44, - 57,122,244, 40,233,217,186, 57, 57, 56,117, 16,217, 55,161, 63, 89,211,179, 57,105, 97, 35, 84,187,219, 72, 31,217,216,216,200, - 42,211,235,208,221,221,253,146, 94,175, 47, 30,190,161, 90,181,106, 97,129,129,129,199,130,130,130,214,157, 58,117,234,147,245, -235,215,247,239, 84,195,119,238,202, 30,173,181,154,203,135,137,242,208,247,100, 94,147, 0, 93,161,153, 47, 21, 47, 39,199,189, - 55,174, 95,183, 22,153, 95,179,217, 76, 78, 28, 63, 78,134,246,234, 22,145,127,254,215,159,110, 45,158,113, 96,118,147,128, 19, -109,132, 24, 94,158, 97, 43,126, 20,145,194,169,189, 45,107, 75,111, 31,199,244,118,118,172,239, 91,218,188, 49,189,212,208,128, -128,128, 88, 66, 72,122,157, 58,117, 98, 1,236,171, 83,167, 78,201,229, 15,203,144, 45, 30,156,116,201,146, 37,164,240,252, 96, - 1, 88,180, 98,197,138, 48, 66, 72,152,191,191,255,109, 0,104, 36,129,115, 7, 59,214, 79,253,252,220,114, 58,216,177,126,106, - 36, 41,125,202, 40, 95, 30,106,183,115, 17,223,234,239,239,161,236,232,101,119,115,223,174,159, 87,247,238,221,123, 7,128,205, - 0,190,118,114,114,186, 53,124,248,240,231,123,246,236,121,190,118,237, 90, 99, 76, 76, 12, 25, 63,126,188, 90, 32, 16,124, 77, -175,131, 20, 10,133,242,151, 81, 52, 50,188, 71, 85,140, 86,223,185,115,231,134, 17, 66,138,198,210, 26, 93,202, 58,253, 22, 44, - 88, 16, 70, 8, 41, 26, 29,254,237, 1,204, 74, 27,208,108,201,150, 45, 91,136, 64, 32,248,233, 29, 55,166,164,166,251,128, 1, - 3, 90, 42, 20,138,102,110,110,110,205, 10, 35, 87,222,206,206,206,177,251,247,239, 87,105,181, 90, 21, 33, 68,101, 54,155, 85, -143, 30, 61, 82,117,236,216, 81, 85,226,169,191,162,114,190,193,151,238,184,253,112,225, 4,242,165, 59,110,191,245,209,168,157, - 59,119,158,139,139,139, 59,109,107,107,251, 69, 37, 53,189, 93, 92, 92, 22, 57, 58, 58, 94,112,118,118,254,210,209,209, 49,221, -104, 52,146,188,188, 60, 18, 29, 29, 77,174, 95,191, 78,238,222,189, 75, 28, 29, 29, 83,202, 42,103, 23, 17,231, 94,222,234,233, -196,186,115, 5, 49,108,154, 79, 0, 16,249,250,121, 36,251,135,165,228,225,164, 30,164,163,144,253,219, 59,236, 79,216,219,219, -111, 63,126,252,184,245,213,171, 87, 36, 52, 52,148,156, 57,115,134,204,156, 57,147,212,246,244,208,183,228,179, 50,219, 9, 56, - 23,222,101,192, 82,189, 94, 31,166, 80, 40,194, 84, 42, 85, 88,221,186,117,195,154, 55,111,126,172,101,203,150,235, 14, 31, 62, -252,201,202,149, 43,251,119,177, 17, 68,107, 46, 31, 38,228,243, 94,132, 76,111, 75, 94, 79,236, 72, 58,139, 56, 79,202,212,116, -115, 75, 41, 26,173, 93,173, 86,147,155, 55,111,146,171, 87,175, 18,119,103,103, 69,123, 17,123,114, 27, 1, 58,180,177,133,125, -101,203,217,201,142,181,235,222, 15,223, 88,180,231,246,144, 95,199,246, 50,119,180,103,109, 41,177,222, 65, 66, 72,250,224,193, -131,227, 9, 33,233, 71,143, 30, 77, 38,132,164, 15, 26, 52, 40,158, 16,146, 14,224, 64,105,154,111, 13, 78,186,179,208,100, 77, - 95,178,100, 73, 24, 33, 36,108,201,146, 37, 97, 64,193, 32,170, 29,236, 88,187,239,111, 91, 99,213,159,217, 77, 14,143,239, 99, -233, 96,199,218, 93,106, 57,237, 57,167,195,119,174, 39,134, 11,251,200,241,153, 35, 45,109,221,109,111, 4, 4, 4,172,249,228, -147, 79,142,221,189,123,247,169,197, 98,121, 30, 27, 27,251,124,243,230,205,207, 91,181,106,117,219,201,201, 41,130,207,231,127, - 84,209, 49,250,147,160,154, 84,147,106, 82, 77, 74, 9, 8, 33, 40,175,191,251,233,111,191,253, 86, 66, 8,153, 61,100,200, 16, -172, 90,181,106,104,253,250,245,135,123,121,121,185, 0, 64, 90, 90,154,230,217,179,103,138, 33, 67,134, 96,209,162, 69, 88,189, -122,245, 58, 20,228,178,252,127,146,113,226,196,137,106, 51,102,204,144,173, 92,185,210, 58,126,252,248, 58, 0,158,101,103,103, -215, 30, 57,114,228,116, 14,135, 51,196,215,215, 55, 40, 61, 61, 61, 75,171,213,238, 3,176, 13, 21,180,153,150,133,128, 5, 75, -211,234, 30,184,192,130,165,196,219,189, 22, 45, 90, 52,108,208,160, 65,198,245,235,215,155, 21, 10,197,169, 74,202, 37,103,101, -101, 45, 43, 90,112,116,116,116,127,242,228,201, 71,174,174,174,172,216,216, 88,232,245,122,188,122,245,202,138,130,166,169, 82, - 81,153,201,198, 31,143, 94, 10,156, 61, 42,196, 86,243,242, 49,120,108, 54, 76, 92, 62, 50,238, 93,192,206,155, 47, 21,106, 35, - 54,189,203,118,202,229,242,239,102,206,156, 57,242,139, 47,190, 16,250,250,250, 50,191,253,246, 27, 14, 29, 58,164,151,201,100, - 61, 1,220,248,125,232,167,170, 97,181, 90,193,231,243, 1, 0,243,230,205, 3,139,197,226,202,100, 50, 62,195, 48, 2,134, 97, -196, 12,195,176, 77,113,207, 97, 85,228, 33, 51, 79,142,228, 76,121,185,122, 22,171,245,208,253,251,247,103, 53,110,220,152,245, -240,225, 67,100,101,101,225,213,171, 87,196, 66,200,129,155, 90, 75, 65, 82,162,190,242,229, 19, 59, 58, 13,104,228, 32, 96,241, -119, 45, 66,123, 3,139,189,213,138,193, 40, 24, 75, 11, 0,118, 50, 12,195, 3,144, 83,183,110,221, 78, 47, 94,188, 16,213,173, - 91, 87,251,242,229,203,115, 12,195,120, 1,216, 93,154,166, 72, 36,202, 6,144,125,244,232, 81, 0,152,132,130,157,215,100,241, -226,197,233, 55,111,222,196,146, 37, 75, 50, 1,108, 1, 0,169,131, 83,191, 32, 59, 30,195,255,101, 9, 90,233,193,218,100, 37, -165, 70, 93,165,174,110,157,235, 75, 88,224,254,252, 21,154,185, 7,178,248,102, 99,131,165, 75,151,222, 84,169, 84,250,131, 7, - 15, 26, 62,252,240, 67,118, 76, 76,204, 3, 0,183, 0, 28, 69, 97,142, 37,133, 66,161, 80,254, 82,222, 30,214,161,194, 28,173, -183, 93,235, 42, 0, 63, 70, 69, 69, 21, 79, 42, 29, 21, 21, 21, 6, 96, 43, 10, 70,131,239, 91, 5,199,187,176, 48,162,181,237, - 29, 55,230,109, 77, 97,112,112,176,232,197,139, 23, 60,148, 62,225, 49,243, 14,154,127,160,180,185, 14, 3, 2, 2, 54,152, 76, -166, 99, 91,183,110, 61,204,102,179, 71,190,135,219,247,245,247,247,207,219,191,127,191, 53, 52, 52,148, 44, 92,184,208,226,225, -225,145,135, 63,230,104,189,161,217,158,207, 62, 50,167,142,151,226,209,232,182,228,245, 39,253,200,173, 81, 29,201,100, 47,169, -162,189,144,125,232, 61,159, 74,252,237,236,236,118,138, 68, 34,133,173,173,237, 37, 0,173,223,231, 24, 57, 57, 57,237,113,119, -119,191, 84,242,229,230,230,118,204,197,197,229,123,103,103,231,133,246,246,246, 83,252,132,252,245,159,212,246,212, 69, 12,168, - 75, 46,183,113, 33,163,156,249,111, 55, 29,190, 93, 78, 15, 63, 63,191,156,189,123,247, 90, 79,159, 62, 77,230,207,159,111,173, - 94,189,186, 2,229,228,181,149, 27,209,178,103, 31, 58, 50,168,165, 53,179,143, 23, 89, 85,199,198,218,201,129, 93, 86, 15,197, - 81,133, 6,120,108, 69,154,181,106,213,218, 74, 8,217,181,124,249,242, 93,248,125, 46,208,110, 75,151, 46, 93, 76, 8, 89,188, -116,233,210,197, 0,122, 0, 64,123, 59,214,222,125,253,155, 90,210,122,123,146,111,234, 72, 45,237,237, 88,123, 75,141,100, 58, -114, 78,156,156,216,199,154, 62,177, 13, 89,228, 47,177,180,116, 20, 92,225,243,249,159,160, 32,226,220, 28, 0,159, 62, 53, 83, - 77,170, 73, 53,105, 68,235,239, 97,188, 42, 51,169,116, 73,220, 29, 29, 29,119,214,172, 89,243,176,175,175,239, 97,169, 84,186, - 14, 5, 73,243, 85, 61, 16,126, 43, 86,172, 80,216,217,217, 53,250, 19, 15,174, 43, 0, 47,252,113,226,220, 63,173,194, 44,243, -192,140,152, 47,134, 62, 89,230,129, 25, 37,222,110, 94,167, 78,157,111, 80, 48,154,247,251, 86, 66, 95, 71, 71,199,205,142,142, -142, 41,133,185, 89,190,149,209,108,202,102,143,236, 36,100,255,214,154,207,202,232, 36,228,220,105,198,102,143,248,135,158,128, -229,117,182, 40, 75,179,154,179,179,243,122, 71, 71,199, 52,103,103,231,205, 85, 52, 89,111,104, 54, 18,193,163,179, 61,251, 68, -107, 27, 70,221,217,142,125,180,169,184,236, 78, 29, 85,216,246,224, 37, 75,150,140, 35,132,140,243,244,244, 28, 82,194,248, 7, - 45, 90,180, 40,132, 16, 18, 82, 52, 2,124,115, 49, 92, 59,218,179,247,183,177,101,228, 29,237,217,251,155,139,225, 90, 86, 57, - 59,217,179, 15,181,177,101,228,237,109, 89,251,125, 4,168, 78, 47,230, 84,147,106, 82, 77,106,180,254, 29, 70,139, 86, 24,170, - 73, 53,169, 38,213,164,154, 84,147,106, 82,163, 85,186,177, 42,249,242, 40, 50, 90, 28,186,111, 40, 20, 10,133, 66,161, 80,222, -139, 50, 7, 44,101,202,113,165, 85, 73,108,127, 23,103,123,153,106, 82, 77,170, 73, 53,169, 38,213,164,154,255, 57,205,138,180, -255,191, 59,214,253,101,208,166, 67,170, 73, 53,169, 38,213,164,154, 84,147,106,254, 93, 52,255,117, 16, 66,222,105,144, 80, 10, -133, 66,161, 80, 40, 20,202,239, 4, 23,254, 45, 30,184,180, 40,154, 85,106,142, 22,167,249,242, 76,179,217,236, 10, 0, 28, 14, - 71,102,122,176,208,163, 60,117, 46,208,197, 92, 48,253, 14, 56,192, 36, 51,112,169, 20,205, 75,102,179,217,161, 80, 51,207,244, - 96, 97,143,114, 53,155, 47,191, 80,114,125,243,131,133,221,254,224, 20, 1, 54,183,249,242,180,183,202,234, 89,217,189,194,224, -141, 49,177,254,178,114,254, 83, 52,255,203,112, 91, 44,207, 52,153, 10,234, 17,151,203,145, 25,239,151, 95,143,120, 45,150,167, -149, 92,223,116,127,161, 91,121,154, 98,145, 32,167,150,151,203,186,242, 52, 99,211,178,103,171, 53, 58,167,242, 52,171,122,110, -122,123,120,116,177, 20,158,155,108, 96, 82, 74,122,250,165,191, 89, 93,106, 10, 96, 33, 0,219, 18,239, 69, 0,248,148,214, 74, - 10,133,242, 15, 51, 90,225, 40,152,231,112,123,161,217,218, 94,166,209, 50,155,205,174, 97,199, 23, 67,173, 7,186,140, 89,238, -234, 55, 96,219, 31, 38, 74, 54,235,242,248,242,200,131, 65,108,147,194,193,133, 99,180, 77, 75, 75, 99, 0,128, 97,152,159, 0, -248,148,162,233, 16,118,124, 49, 52, 6,160,253,240,165, 14, 62,128,109, 22,143,247,153, 72, 34,233,164,213,106,235, 3,128, 72, - 36,138,212,170,213,215, 92,140,198,181,111,175, 95,214,150,149, 44,107,231,209,203, 93,235, 12,216, 54,211, 98,181,242, 83, 31, -110,109,175,203,142,225,112,205,250, 45, 95, 2,231, 22,151, 98,170,202,208,251,253,119, 63,152,239,196, 5, 58,243,133,194, 70, -246, 14, 14,237,172,132,212,181, 90,173,140,197,108,126,174,200,207,191,101, 53,155,159,152, 13,106,167,176, 83,223, 88,203, 43, -231,219,219,242, 1,192, 57, 14, 12,145, 72,165,157,216, 92,110,107, 0,176,152, 76,191,169, 85,170,107, 3,129, 35,149,217,246, -202,238,159,119, 93,255,191,134,201,100,118,141,187,176, 24,122, 19, 16, 60,248, 27,215,134, 35,127,217, 15, 0, 6,217, 19, 55, - 85,204,169, 22, 0, 32,169, 21,114, 95,224, 30,156, 9, 0,156,196,116,215,232,208, 5,208,155,128,186, 33, 75, 93, 43,210,252, -112,209, 33,167, 47, 38, 15, 18, 0,192,197,163,223,215,190,122,236,199, 94, 0,208,121,208,180,115,221, 7,207,136, 6,128,213, -219,143, 57, 29,248,102,104,185,154,149, 59, 55,243,121,249, 49,161,254, 6, 69,186,189,183,132,227, 30, 19, 19,195, 2, 0, 79, - 79,207, 74,157,155,213, 0,187,116, 96, 58,139,205,110, 87,203,223, 63, 24, 0,137,125,253, 58,220, 98, 54,223,246, 0,182,252, -201,117,105, 38, 33,111, 14,206,202, 48, 12,173,144, 20, 10,229,159,198,153, 66,115,117,230, 15, 15,179,101,125, 67,173, 7,110, -188, 2, 58,180,108,136,201, 35,123, 75, 75,126,118,100,219, 82,159,152,135, 39,235,252,252,203, 90, 86,195,134, 13, 17, 23, 23, - 87,169, 82,104, 12,192,245, 24, 0,242, 23, 54,121, 18,201,235,245,107,214,216,118,235,214,141,227,233,233, 9,134, 97,144,145, -145,209,242,242,229,203, 77,103,205,154, 53, 21,242, 23,121, 26, 3,148,215, 99, 42,214, 45, 42,107,253,218,213,177,112,198, 80, - 59, 0,248,114,204,150,166, 15,163, 50, 29, 95,191,126,221,101,238,220,185, 57,236,107,215,126,116, 6,118,101, 2,201,149, 41, -231,158,211,247,133,118,233,191,250,141,154, 49,227,168,191,191,191,212,215,215,151,177,177,177, 1,155,205, 70, 94, 94,158,207, -179,103,207,122, 61,120,240, 64,125,249,198, 79,252, 71, 15,250,197,202,132, 45,116,149,218,118,109,154,240,162,141, 77,228,232, -129, 3,171, 13, 29, 58, 84, 88,171, 86, 45, 0,192,235,215,175, 3,142, 28, 57, 50,252,232,209,163,139,160, 77, 51,107, 12,208, - 85,180,237,197,154, 0,132, 64,107,123, 87,215, 81,108, 46,183,190,217,108,246, 42,140, 54,164, 90, 76,166, 72,185, 76,182,239, -237,245, 41,127, 68,111, 2, 94,164, 3, 93,219, 5, 99,244,160,174, 18, 0,152, 59,108, 69,203,196,248, 87, 60,131,193,128,218, -129,117,219,124,253,205,186, 11, 96,177,176,247,216,229,226,245, 43,163, 25,241, 34, 14,139,191, 94,143,180,167, 71, 90, 90,242, - 95,117, 82, 42,242,217, 0, 96,107,103, 55,232,200,193, 95,175,121, 6, 13,185,247, 42,219, 88, 41,205,242,206,205,243, 7, 55, -123,164, 60,187, 86,239,135,139, 59,185, 62, 62, 62,120,250,244,105,213,206,205,252, 40, 27,171,135,199,243,181,159,127,238,222, -190,125,123, 72,165, 82,112, 56, 28,152,205,230,174,183,111,223,238,186,120,241,226,105,200,143, 82, 87,246,220,172, 4,107, 25, -134,233,244,225,228,153, 30,189,251, 15,193,160,158,109,104, 69,164, 80, 40,255, 52,138,162, 87, 37,123, 30,110, 47,215,104,113, - 56, 28, 89,183,177, 43, 93,219,181,104,128,135, 79,162,243, 19,146,210, 85, 69,159,229, 70, 30,169,221,191,141, 87,189,155, 55, -111, 64,175,215,227,183,223,126,195,147, 39, 79, 16, 31, 31,143, 41, 83,166,232, 11,155, 14, 75,211,204,107, 63,124,169, 3,242, - 99,164, 1,252,168, 26,151, 95,190,100,235,116, 58,220,188,121, 19,121,121,121,224,243,249,168, 86,173, 26,186,119,239,206,121, -249,242,165, 99,151,110, 61,237,218,247, 28, 17, 7,187, 0, 21,135,195,201, 43,107, 30, 17, 14,135, 35,235, 50,102,185,107,189, -128,234,120,157,144,150,191,240,155,159, 85, 86, 43,225,196,198, 39, 26,111,220,184,129,224,224, 96, 92,186,116,201, 41, 55, 55, -247,171, 45, 91,182, 44,228,126,251,195, 70,147, 33,103, 14,202,214,203,107, 63,124,169,131,147,236,176,239,213,243, 39,120,145, -145,145,188,173, 91,183, 34, 39, 39, 7,124, 62, 31,246,246,246,112,119,119, 71,237,218,181,153, 47,191,252, 82, 26, 18, 18,137, -143, 39, 13,241, 53,250, 77,140, 42,171,156,197,219,174, 74, 20, 59, 43, 46,214, 58,118,230, 12,171,109,219,182,111, 60,182,215, -172, 89, 19, 61,122,244, 16,142, 26, 53,170,214,208,225, 35,173,237,251,124,248, 26, 82, 95, 77,133,154,234,100,145,147,230,174, -103,215,225,195, 79, 45, 93,186,212,222,221,221, 29, 18,137, 4, 0,144,159,159, 95, 45, 33, 33,161,229,162, 69,139, 6,223,143, - 56,200,105, 31,146,156, 6,137,183,182,188,253,249, 95,133,203,229,200,138,162, 72, 54, 18, 81, 94,114, 74,166, 26, 0, 12, 6, - 3, 12, 6, 3,244,122, 61, 62,154, 54,133, 61,105,112,115,127,223,118, 51, 31,199,167,102,230,214,189,124,207,177,232,187,166, - 10, 52, 57,154,120,185, 60,233,202,164,197,159,127,238,238,230,246,123,139,224,222, 61,123,216,185,185,185, 93, 23, 47, 94, 92, -143,136, 59,202,235,134, 44,181, 47, 79,179,188,115, 83, 30,125,166,198,215, 51,122, 52,218,246, 77, 40, 44, 22, 11,238,222,189, -139,155, 55,111, 98,221,186,117,228,220,185,115,249,182, 18,201, 36,148,123,110, 70,217,180,245,200,240,251,246,219,163,140, 64, - 32,192,201,147, 39,241,242,229, 75,176, 88, 44, 52,108,216, 16,163, 71,143, 70,215,174, 93,221, 39, 79,158, 66,218,247, 28, 22, - 11,187, 64,229,123,214, 37, 22,128,153,243, 23,127,235, 49,102,226,116,172,254,250, 75,106,180, 40, 20,202, 63, 57,154, 85,230, - 16, 15, 8, 13, 13, 37,133,175, 14, 0, 64, 0, 86,205, 1,219, 14, 28,126,100, 61, 83,115,192,182, 3, 4, 96, 17,128,101, 11, - 84,111,220,184,177, 73, 46,151,147, 7, 15, 30,144,143, 62,250, 72,189,113,227,198,107,103,206,156, 57, 98, 54, 26,119,120,122, -120,124, 71, 80,122,130, 61, 1, 88,190,128,157, 88, 44,206, 74, 74, 74, 34,103,207,158, 37, 75,150, 44, 33,251,246,237, 35,231, -206,157, 35,151, 47, 95, 38,231,206,157, 35, 7, 14, 28, 32, 17, 17, 17, 36, 58, 58,154, 72, 36,146, 44, 95,192,174, 28, 77, 54, - 1,216,181, 7,108,157,115,244,161,105,105,224,128,109,179, 8,192,118, 0,234, 52,110,220,216,114,228,200, 17,178,119,239, 94, -242,203, 47,191,144,136,136, 8,146,157,157, 77, 56, 2, 73, 86,209,247,202, 42, 39, 1, 88, 94, 94, 94, 89,114,185,156,120,123, -123, 19, 62,159, 79,220,220,220, 72,237,218,181, 73,203,150, 45, 73,175, 94,189,200,200,145, 35,201, 87, 95,125, 69,228,114, 57, - 17, 10,133,153, 69,223, 43, 75, 51, 24, 16, 73, 36,146,164,176,176, 48, 82, 22, 90,173,150,100,103,103,147, 11, 23, 46, 16,137, - 68,146, 20, 12,136,202,211, 20, 1, 77,130,130,130,178,178,179,179,137,209,104, 36, 73, 73, 73,228,217,179,103,228,229,203,151, - 36, 41, 41,137,104,181,218, 98,237,232,232,104,226,231,231,151, 37, 2,154,148,165,249, 95,166,168, 78,188,253,242,113,115,235, -229,238,238,174, 61,122,244, 40, 73, 77, 77, 37,187,119,239, 38, 44, 96,197,219,235,149,167,201, 7,186,183,109,219,214,114,247, -238, 93,242,248,241, 99, 50,111,222, 60,210,163, 71, 15,210,179,103, 79,178,120,241, 98,146,146,146, 66, 82, 82, 82, 72,175, 94, -189, 44,124,160,123, 69,245,179,180,115,211, 14,240, 9, 9, 9,209, 26,141, 70, 18, 27, 27, 75,234,215,175,159,194, 6, 70, 73, -128,122, 29, 0, 65, 69,245,211, 11,112,240,240,240, 72,191,123,247, 46, 57,118,236, 24,241,245,245,205, 98, 3, 31,218, 2, 53, -109,129,154,108,224,195,154, 53,107,102,221,189,123,151,228,228,228, 16, 31, 31,159,116, 47,192,225, 61,234, 18, 11,192,206,249, -139,191, 37, 81, 41,106, 50,127,241,183, 4, 64, 18, 41,200, 30,189, 68,107, 36,133,242,223,227,109, 47,242,143,191,175, 16,242, -102,175,195,144,144, 16, 6,192,245,242,190,164,101,179, 87,174, 94,189,154,163,211,233,240,243,207, 63, 43, 63, 24, 60,248,112, -135,118,237, 98,107,248,250,202, 25, 22,171,194,217,134,179, 4,130, 79, 86,175, 94,109,111, 48, 24,240,232,209, 35, 52,109,218, - 20,238,238,238,144, 74,165,144, 74,165,112,117,117, 69, 96, 96, 32,100, 50, 25,108,108,108,240,197, 23, 95,216,101, 9, 4,159, - 84,164,107,181, 18, 14, 0, 88,172, 86, 62, 15,152,236,215,172,217,163, 69,139, 22,177,156,156,156,224,232,232, 8,169, 84,138, -151, 47, 95,194, 96, 48, 64, 44, 18, 87,106,144, 86, 22,139,197,146, 74,165,184,122,245, 42,102,206,156,137,214,173, 91,195,222, -222, 30, 54, 54, 54,168, 95,191, 62,186,119,239,142, 73,147, 38, 33, 54, 54, 22, 76, 37,146, 74,158,115, 56,211, 39, 77,154,228, - 26, 28, 28, 92,234,231, 58,157, 14,114,185, 28, 89, 89, 89,168, 86,173, 26,134, 12, 25,226,250,156,195,153, 94,150,158, 19,224, - 94, 45, 32,224,212,131, 7, 15,156, 37, 18, 9,246,238,221,139, 19, 39, 78,224,252,249,243, 56,123,246, 44, 66, 67, 67,113,242, -228, 73,100,101,101, 1, 0, 2, 2, 2,112,232,208, 33,103,169,171,107,168, 19,224, 78, 79,233,202,145,152,153,121,177,126, 70, -134,243,168,145, 35,111,169, 84, 42,140, 26, 53, 10, 43, 87,173,250,146, 11,204,170,204,247, 3, 1, 59, 71, 15,143, 93,223,126, -251, 45, 43, 35, 35, 3, 3, 7, 14,204, 94,187,106,213,132,240, 11, 23,106,133,157, 63, 95,107,229,210,165, 19, 58,116,232,144, -157,146,146,130, 61,123,246,176,220,124,124,118, 5, 2,118, 85, 45,167, 18,152,185, 97,195, 6,161, 78,167, 67,183,110,221, 98, -173,145,145,129,102,224, 87, 21,240,242, 58, 96,172,232,251,233,192,244, 47,190,248,194, 93, 32, 16,224,179,207, 62,203,214, 36, - 38, 54, 48, 3,191,228, 3, 9,249, 64,130, 25,248, 69, 25, 23,215, 96,204,152, 49,217, 2,129, 0,235,215,175,119, 79,255,125, -210,237,202,210, 20,192, 41, 0, 55, 0,164,125, 56,121,230,135,193,205, 91, 97,207,142, 45,248,102,233,220, 93, 0, 62, 96, 24, -102, 31,128, 57,180,230, 81, 40,255, 77, 42,227, 69,254,166, 76, 46,235, 3, 78, 73, 39, 9,160, 99,121, 42, 14, 78, 78, 77, 27, - 52,104,128,155, 55,111, 34, 40, 40,232,129,189,189,189,153, 39, 16,128,203,229,130, 88, 43,244, 89, 16, 73, 36, 93,186,118,237, -202,185,119,239, 30,252,252,252, 32, 18,137,192,229,114,223,120,241,120, 60,120,120,120, 64,161, 80,160, 75,151, 46,220, 77,155, - 54,117,129, 94,255,117,133, 55,196,152,103,210,172,123,223,142,252,105,247,174,154,237,219,183, 71,126,190, 2, 86,171, 21, 98, -177, 24, 6,131, 1, 28, 14,167,160, 9,200, 68, 20,149,217, 99, 22,139,197,194,102,179,225,231,231,135,149, 43, 87, 66,167,211, -129,199,227, 1, 0, 20, 10, 5,228,114, 57,158, 61,123,134,132,132, 4,144, 74,140, 72,102, 99,103,215,123,232,208,161,165, 78, -248,171,215,235,145,159,159,143,252,252,124,200,229,114,232,116, 58,180,106,213,138,127, 38, 52,180, 55,114,114,214,150,250, 29, -161,112,240,158, 61,123, 92,249,124, 62,180, 90, 45,148, 74, 37,146,147,147,145,152,152,168,147,201,100,102, 27, 27, 27,150,175, -175, 47, 75, 32, 16, 8, 6, 12, 24,192, 40, 20, 10, 48, 12,131,144,144, 16,167,253,123,247, 14,133,193,176,142,158,210,149,227, - 34,160,111, 98, 48,244,109,209,188,249,213, 7, 15, 31, 6,127,242,201, 39,136,136,136,248, 86,124,240,224, 13, 13,240,164,188, -239,198, 2,211,191, 43, 97, 96, 72, 98, 98,144, 17,200, 42,177, 74,130,111, 92,220,249, 49, 99,198, 60,141,136,136,112, 94,191, -126,189,251, 7, 3, 7, 78, 7,176,162, 42,101,180,177,179,107,230,225,225,129,115,231,206, 33, 41, 62,126,174, 25,208, 86, 41, -188,196,102,183,109,223,190, 61, 78,158, 60,137,148,196,196,185,230, 55,203, 88,240,160, 4,100,113, 98, 99,231,238,218,181,107, -231,248,241,227,193,230,112,218,194, 92,165,134,195, 63, 36,190,143,159,242, 9,118,109,223,180, 11,192, 68, 0, 86, 0, 15,104, -141,163, 80,254,219, 81,173,138,188,200, 63,200,108,109, 7, 80,181,136,150,171,171,171,151, 84, 42, 69, 90, 90, 26,234,214,169, - 35, 19, 8, 4,224,115,185, 16,242,249,149, 42,129, 70,163, 9,242,244,244, 68,126,126, 62,156,157,157,193,227,241,138, 95,124, - 62,191,248,127, 27, 27, 27,176, 88, 44,248,248,248, 64,163,209, 4, 85,168,155,249,204,245,224,166,105, 31,221,189,113,174,230, -192,129,131,224,224,224, 8,111,239,106,112,117,117,133, 72, 36,130,183,183, 55,106,213,170, 69,214,174, 93, 11,177,107,195, 74, - 93,200, 75,154, 39, 14,135, 3,139,197,130,204,204, 76, 68, 69, 69, 33, 34, 34, 2,119,239,222,197,227,199,143,161, 84, 42, 43, - 53,242,171, 70,171,109,196,225,112, 74, 53, 89,114,185, 28,114,185,188,216,104,101,101,101, 33, 33, 33, 1, 42,181,186,113, 57, -166,119, 80,131, 6, 13,216, 0, 32, 18,137,208,184,113, 99,108,219,182,205,124,250,196,137, 97,245,238,222,117,244,190,112,193, -254,167,173, 91,135, 13, 25, 50,196,114,239,222, 61, 40, 20, 10,188,120,241, 2, 46, 46, 46, 28,190, 80, 56,148,158,206, 85, 35, - 12, 80, 59, 43,149, 61, 91,183,110, 29,151,159,159,143, 53,107,214,176,184, 54, 54,219,151,150,209,196, 87, 12,155,221,166,125, -251,246, 56,117,234, 20,210, 18, 19,231, 37,150, 98, 96, 18,129,172,164,216,216,121,187,118,237, 66,247,238,221,193,112, 56, 85, - 78, 84,106,217,178,101, 3,171,213,138,167, 79,159,194, 30,184, 95,213,239,215,242,247, 15, 46,138,252, 74,128, 91,101,173, 39, - 1,110,133,135,135, 67, 36, 18,161,110,189,122, 77,170,248, 51,107, 25,134, 73, 31, 63,229, 19, 28, 59,127, 7, 0,176,107,251, -166,204, 18, 38,139, 66,161,208,136,214, 63, 53,162, 85,100,172, 74,190,240,134,209,170,164,249, 0, 0,112,185, 92,240, 5, 2, -240,249,252, 2,131, 36, 16, 84, 90,131, 97, 24, 8,133,194, 98, 99, 85,210, 96,149,252, 95, 44, 22, 87,122,232,250,188, 87,231, -219, 77,156, 48,158, 47, 16, 8, 96, 48,232, 65, 8,129, 64, 32,132,189,189, 61,252,252,252,160, 80, 40,208,186, 77, 7,125,178, -156, 23,234, 84,119, 64,196,187,236, 61,179,217, 12,181, 90,141,188,188, 60,228,230,230, 66,161, 80, 64,171,213, 86,186, 43,186, -213,106,101, 39, 39, 39,227,215, 95,127, 69, 78, 78, 14,128,130, 68,235, 34,115, 85,244, 55, 46, 46, 14,123,247,238, 69,124,124, -124,149,142, 79,187,118,237, 16, 26, 26,202,238,216,165,203,142, 75,190,190,105,151,124,125,211, 58,118,233,178,227,212,169, 83, -108, 47, 47, 47, 36, 36, 36,224,209,163, 71,200,203,203, 3, 33,132,246,159,127, 7, 94, 3,121,154,220,220,241, 95,126,249, 37, -145, 74,165, 88,243,221,119,141, 86, 0, 35, 42,107, 96,236,202, 49, 48,118,239,103, 96, 64, 8,129,213,106,133,197, 98,121,167, -109, 99, 24,134,225,114,185, 85, 29, 90,161, 42, 43, 23, 39,190,127,241,213, 74,156, 61,121,164,232,253, 24,106,178, 40, 20,202, -191,128, 50, 19,225, 57, 37, 28,100,241,223,178,200,204,204, 76, 85,171,213, 53,125,125,125,145,146,146,226,234,227,227,147,200, -231,114,193,227,243,193,176, 42,246, 4, 98,177,248,105, 90, 90, 90, 27, 47, 47, 47,152,205,230, 98, 83,245,118,211, 97, 81,148, -230,241,227,199, 16,139,197, 79,161, 43,119,228, 4, 88, 12,121,213,155, 52,105, 82, 28, 25,178,183,183,135,189,189, 29, 4, 2, - 33, 22, 44, 88, 96, 93,191,118,237, 22,159,206, 75,243,199,205,250,146,124,185, 98,199,159,186,103, 43,123, 99, 18,139,197, 79, -189,189,189, 91,217,217,217,225,216,177, 99, 72, 72, 72, 64, 94, 94, 30, 52, 26, 13,244,122, 61, 52, 26, 13, 12, 6, 3,132, 66, - 33,234,213,171, 7, 91, 91, 91, 92,190,124,249, 41,244,250,210,205,101, 78,206,177,167, 79,159,182,106,222,188,121,113, 68,165, - 83,167, 78, 76,167, 78,157,156,139,163,104, 26, 13,178,179,179,241,224,193, 3, 92,190,124, 25, 12,195, 32, 38, 38,198,162,215, -106, 15,208,115,226,221,208, 1,191,177,119,237,218, 57,117,234,212, 9,109,218,180,129, 5,232, 5, 96,239,255,208,192, 0, 0, -238,222,189,251,204, 98,177,180,169, 93,187, 54,228, 64, 11, 0, 39,171,100, 34, 95,189, 10, 55,155,205, 93, 26, 53,106,132, 99, -135, 15,183, 3,144, 80,218,122,106,160, 93,112,112, 48,180, 90, 45, 94, 60,127, 30, 86, 5,147,181, 99,254,226,111, 63, 28, 51, -113, 58,246,236,216,130, 93,219, 55, 37,239,220,182,209, 27,149,200, 31,163, 80, 40,255,169,104, 86,133, 94,228,111,202,228,178, -204, 23,167, 42, 42,249,121,121, 97,225,225,225, 53,155, 52,105,130, 29, 59,118, 52,111,221,170, 85, 42,143,207, 55,243,121, 60, -176, 42,113, 35,209,170,213, 87,174, 92,185,210, 98,192,128, 1,156,123,247,238,193,221,221,189,216,104, 21,253,229,112, 56, 32, -132, 64, 44, 22,227,248,241,227, 70,173, 90,125,165,194,104,145,197,106, 97, 21, 26, 61, 66, 8,228,114, 57,120, 60, 30,214,173, - 91,143,205,107,215,142,180, 0, 71, 2, 36, 46,159, 3, 16,254,207,110,208, 26,205,213,179,103,207, 54, 93,180,104, 17,183, 90, -181,106,144,203,229,200,203,203, 67, 78, 78, 14, 20, 10, 5, 20, 10, 5,242,242,242, 32,151,203, 33, 20, 10, 17, 17, 17, 97,210, -105, 52, 87,203,210, 19,232,116, 71,199,142, 29,251, 69,120,120,184, 7,135,195,129,201,100,130,213,106,133,213,106,133,209,104, -196,171, 87,175, 16, 25, 25,137,151, 47, 95, 34, 55, 55, 23, 92, 46, 23,108, 54, 27,143, 31, 63,206,147,152, 76,135, 13,244,156, -126,103,184,192,177,219,183,111, 79, 24, 61,122, 52, 60,171, 85,235,128,148,148, 74, 25,152, 19,229, 24,152,252,119, 51, 48,191, - 27, 32,165,242, 97, 92, 92, 92,155,142, 29, 59,194,163, 90,181,111,235,165,164, 92,122, 94,133, 60, 45,139,217,124,235,246,237, -219, 93,198,140, 25,131, 29, 59,118,124,235, 18, 23,119, 62,235,173,102, 78, 23,192,165, 70,173, 90,223,126,248,225,135,184,120, -241, 34, 44,102,243,173,114, 36, 75,142,248, 94,253,195,201, 51,189,223, 74,124,223,198, 48,204, 12, 0,107,104,141,162, 80, 40, -255,230,136, 86,149,154, 14, 69, 22,203,252, 57,115,230,152, 88, 44, 22, 6, 13, 26,100,115,242,212,169, 33,143,159, 60,241,147, -201,100,246, 22,139,165, 66, 45, 23,189,126,227,156, 57,115,228, 6,131, 1,129,129,129,200,205,205,133,197, 98, 1,135,195, 1, -135,195, 1,195, 48, 96,177, 88,144, 74,165, 8, 15, 15,199,206,157, 59, 21, 46,122,253,198, 10,111, 18, 22,203,211,189,123,247, -130,205,102, 19,161, 80, 8,134, 97,192,225,112,176,126,253,122,217,102,224, 24, 0,176, 89, 44, 3, 0,176, 88, 76,101,179,119, - 43,108,183,228,243,249,176, 22,116, 2,168,112, 93, 7,189,126,195,234,213,171,149, 47, 94,188,128, 90,173, 46,142,190,169, 84, -170,226,228,122,185, 92, 14,134, 97,160, 86,171,113,234,212, 41,165,131, 94,191,161, 44,189, 28, 32, 35, 37, 38,166, 95,243,230, -205,115,226,226,226,144,159,159,143,167, 79,159,226,242,229,203, 56,116,232, 16, 46, 94,188,136, 87,175, 94,193,108, 54,195,203, -203, 11,132, 16,156, 56,113, 34,223,172, 84,246,202, 1, 50,232, 57, 81, 54,213,221,221,187,184,185,186, 38,185, 56, 59,167, 84, -119,119,239,242,246,231,118, 64,116,116,116, 52,204,102, 51,252,252,252, 28,203,203,211, 34,102,243,237,219,183,111, 99,204,152, - 49,240,174, 89,115,149, 47,224,242,246, 58,190,128,139,111,173, 90,171,138, 12, 12, 49,155,111, 87,181,204, 54,192,166,207, 63, -255, 92,203,227,241,112,240,224, 65, 63,147,191,255, 75, 14, 48, 66, 10,212,233, 8,240, 42,250,190, 7,176,229,171,175,190,202, - 96, 24, 6,251,246,237,115,182,171, 85,235, 25, 7, 24,107, 7, 84,183, 3,170,115,128,177,118,181,106, 61, 59,120,240,160,179, -217,108,198,172, 89,179, 50, 60,128, 45,229, 72,206, 36,132,244, 37,132,180, 39,132,120,239,220,182, 17,103, 79, 30, 41, 50, 89, - 19, 81,144,244, 62, 26,192, 51, 90,227, 40, 20,202,191,153, 82,195, 80,156,230,203, 51, 1,226,218,161,101, 67, 60,124, 18,149, -239,236, 96,123,161,232,179,220,200, 35,181, 59, 7,217, 54,252,225,135, 31,192,229,114,145,156,156,140,231,207,159,195,214,214, - 22, 35, 71,142,212,107,149,202,126, 37,230, 58,236, 10,224,114,161,102,193,124,106,249, 49,210, 90,156,136,154,231,207,134,178, -237,236,236,160, 82,169,192, 98,177, 32, 20, 10, 33, 22,139, 33, 18,137,240,232,209, 35,244,233,219,223,146, 37,110,255,251,128, -165,191,207,167, 86,172, 89, 52,214, 80, 11, 64, 28, 14,124,230,234,233, 57,103,225,194,133,162, 30, 61,122,128,199,227,161, 90, -245,128, 12,191,158,107, 54,177, 88,140, 57, 37, 71,177,160, 86,117, 79,187,231, 49, 9, 0, 24,153,233,193, 66,207, 18,115, 29, -254,161,156, 62,134, 27,126,199,127, 89,107,219,184,113, 65, 62,186, 92, 46, 71,102,102, 38,100, 50, 25,228,114, 57,212,106, 53, - 0, 32, 52, 52, 20,103,111,190, 84,104,171, 13,137, 45,171,156,191,111,123,148,141,167,241,126,141,253,123,127, 97,187,184,184, - 32, 51, 51, 19, 89, 89, 89,144,203,229,208,106,181,176, 88, 44,200,205,205,197,207,187,126,177,228, 72,219,199, 23, 15, 8, 89, -158,166, 58, 89,228,168,186,227, 21, 92,207,151, 76,152, 48,193,198,214,214, 22, 86,171, 21,121,121,121, 72, 74, 74, 66, 92, 92, - 28,110,222,188,169,150,201, 13, 80, 59,119, 75, 41, 30,176,180, 20,205, 63,145,127,156,102,201,113,171, 60, 61, 60,210, 18, 19, - 19, 93, 45, 22, 11,188,188,188,204,242,220,220, 85,124,224,162, 13,144, 14,128,100, 3, 11, 55,108,218, 52,190,127,255,254,104, -214,172, 89,114, 70,102,102,141,210,234, 18, 1,216,129,128,157,166, 90,181,200, 7, 15, 30,184, 39, 37, 37, 97,204,152, 49,217, -137,175, 95,207,179, 43,204,215,202, 7,218,249,214,170,181,234,224,193,131,206, 53,107,214, 68, 80, 80, 80,134, 48, 41,169,126, - 20,144, 95, 70,253, 44,243,220,148, 71,159,169, 49,109, 96,131,102, 31,125,244, 17,204,102, 51,110,222,188,137,251,247,239, 35, - 49, 49, 17,119,238,220,145,219, 74, 36,195, 74,204,117, 88,106,253,236, 21,160,246,219,183,111, 47,195,227,241,176,107,215, 46, -132,135,135, 3, 0,130,131,131,241,225,135, 31,194,108, 54, 99,212,168,209,228, 76,148, 40,182,188,250, 9,160, 1,128,239, 80, - 96,242,154, 17, 66,132, 12,195,164, 1,240, 70,213,114,178,104,253,164,154, 84,243,191,163,249,175,162,220, 73,165, 75,206,167, -182,252, 71,216,189, 57,205,199,164,180, 35,219,150,114,218,182,107, 95,103,233,146,197,172,230,205,155,195,219,219, 27,193,193, -193, 72, 74, 74, 18,216,219,219, 87, 52,159,154,170,125,207, 17,113, 13, 27, 54,180,159, 55,111,158, 93,247,238,221,185,222,222, -222, 32,132, 32, 60, 60, 28,199,142, 29, 51,238,216,177, 67,161,113,235, 43, 15,187,246,171,170, 50,243,169,221, 7, 52, 0,150, - 85, 75, 75,219, 62,125,218,180,197,141,155, 52,153,176,100,201, 18,150, 84, 44,226,174, 92, 48, 81, 8, 0,203,191, 63,100,215, -127,200, 72,108,240, 7, 58,140, 40,125, 30,185,146,229, 76, 74,153,148,216,123, 96, 23,255,207,102,140,183, 12, 29, 58, 84, 98, -107,107, 11,111,111,111, 56, 56, 56, 32, 54, 54, 22, 41, 41, 41,228,244,233,211,170,187,143,163,185, 39, 46, 62, 76, 20,218,121, - 84,102, 94, 66,101,251, 30, 31,196,247,238,221,219, 97,236,216,177, 54, 77,155, 54,229, 10, 4, 2, 8, 4, 2,100,102,102,226, -213,171, 87,198,211,167, 79,171, 52,174,189,242,194,174, 29, 84, 86,114,174, 67,109,251,225, 75, 95,221,186,180,100, 86,228,211, -167,163,173, 64, 35,163,209,232,101,177, 88, 24, 22,139,149,110,181, 90,159, 26,149,202,157,250,224, 37,235,233, 92,135,149,195, - 98,177,240, 44, 22, 11,228,114, 57, 46, 93,186,196,121,253,250,245,194, 39, 79,158, 44, 76, 75, 75,131,201,100,194,224,193,131, - 17, 28, 28,140,107,215,174, 33, 43, 51,243,116,121, 90, 81, 64,190, 32, 37,229,195, 73,147, 38,157,219,187,119, 47,235,201,147, - 39,206,187,118,237,250,185, 52, 3, 51,122,244,104,107,102, 82,210,135,122, 32,191,156,250, 89,222,185,153,125,254,224,230, 39, - 3, 6, 13,169,183,100,209, 66,110,235,214,173,225,236,236,140,118,237,218,193,104, 52,218,215,173, 91,183,162,115, 83,217,190, -231,176,216, 70,141, 26, 73,214,175, 95,239, 62,126,252,120,204,152, 49, 3, 0,160,213,106,113,241,226, 69,204,154, 53, 43, 35, -137,211, 66, 93, 81,253, 44,140, 84, 21, 25,176, 27, 0,218, 3,136, 5, 77,124,167, 80, 40,255, 78,138, 38,149,246, 64,193,196, -210,103, 80,240,112, 94,241, 92,135,183,238, 63, 67,201,105, 62, 10,240,120,110,246, 25,251,122,202,156, 85, 65,108,147,194,129, -203,232,108, 99,162,163,153,138,230, 60, 44,158, 79,205, 46, 64,229, 20,119,160,249,202,229,203, 63,217,176, 97, 67,151,162, 33, - 28,196, 98,241, 83,173, 90,125,197, 69,175,223,168,177, 11,184, 82,213,185,249, 82,128, 76, 0,211, 28,194,194, 54,133,244, 31, -188, 90,232,232,199,253,114,197, 14, 29,155,197, 50,188, 74,203,194, 6,127, 64, 82,137, 14,146, 26, 3, 16, 41,247, 48,103, 58, - 13,137,250,234,243,207, 63, 91,190,108, 89,115,169, 84,218,193,104, 54, 7, 88,173, 86,192,106,141,209,168,213, 55,136,209,248, - 64, 31,188,104,173,208,206,131, 84,122, 94, 66,251,186, 74,199,248, 35,205,119,239,220, 57,243,240,225,195,127,216,118, 39,189, -126,147,198,190,238,229,202,108,123,201,117,116,192,111,144,201,126, 43, 47,116, 73,231, 58,172, 28, 28,171,117,178,131,131,195, -158, 46, 93,186, 8,187,118,237,138, 62,125,250,160,117,235,214,176, 90,173, 32,132, 64,169, 84,226,208,161, 67, 88,189,122,117, - 76, 13, 96, 89, 69,122,122,224,138,224,236,217, 94,141, 26, 53,218, 85,158,129, 41, 52, 89, 21,230, 36,150,127,110, 10, 98,204, -118,253, 18,134, 79, 95,233,111, 80,164,219, 59,137,205,238,145,207,158,178, 42,127,110, 6, 42, 45,225,135, 90, 12, 30, 56,112, - 58,155,195,105, 87,216, 3,146,188,120,254, 60,172,104, 82,105, 4,127,120,169,138,117,169,104,236, 58,154,248, 78,161, 80,254, -237, 70,171, 15, 10,242,181,138,167,228, 41,115,174,195,162,168, 15,135,195,145,197,158,152, 50,178, 60,117, 46,208,165, 48,146, -133, 10,231, 58, 44,252, 63, 1, 80, 66,175,255,250,141,193, 72, 75,244, 46,228,190,181,126, 85,134, 69,204, 3,162, 96,214,135, - 64,246, 28, 56, 53,173, 64,175,249,242,185, 37,183,169,204,155,236, 27,191,203,203,213, 1,183,160, 82,221,130, 74, 85,106,210, - 46,151,195,203,173,168,156,111,111,123, 18,160,120,223,109,127, 91,179, 66,243,240, 30,251,243,191, 70,106,118,246, 9, 0,210, -106,161,161,110,231, 67, 67,135,126, 54,123,246, 96, 15, 79,207, 90,206,206,206, 14, 54, 54, 54,172,123,247,238,197,153,117,186, - 77,141,129,221,133,209,212, 10,209, 3, 87, 2,147,146,234,127, 48,112,224,116,134,195,105, 91,210,192, 16,179,249,142, 31,176, -165,188, 72,214,187,158,155,222, 2,143, 46,133,145, 44,176,129, 73,149,169, 27, 41, 5,229, 88, 1,179,121, 5, 34, 34, 74,169, -243, 85,174, 75,203, 25,134, 81,130, 38,190, 83, 40,148,127, 47, 69,243, 29,158,249,255,254,225,174, 84,147,106,254,139, 52,217, - 40,232, 69, 71,247, 39,213,164,154, 84,147,106, 82,202,165,104,174, 67, 14,221, 21, 20, 74,165,177,224,247,102, 48, 10,133, 66, -161, 80,138, 40,202,205, 42,201,118,160, 32,117,167, 44, 87, 90,149,222, 4,239,226,108, 47, 83, 77,170, 73, 53,169, 38,213,164, -154, 84,243, 63,167, 89,145,246, 63,177, 55, 99, 81, 78, 86,113,110, 86,101,103,183,121, 95,104, 88,149,106, 82, 77,170, 73, 53, -169, 38,213,164,154,255,118, 60, 10, 77, 86,241,171,168,233,144, 69,247, 13,133, 66,161, 0, 75,150,128, 69, 8, 24, 66,150,176, - 8, 57,204, 38,100, 8,155, 16,188,215, 84, 32, 67,134,148, 62,152,237,199, 35, 29,108,232, 30,167, 80,254, 85,164,163,140, 73, -165,105,142,214,255, 22, 31,119,119,247,109, 0,152,140,140,140,201, 0,146,232, 46,249,251,225,232,232,216,197,108, 54, 67,161, - 80, 92,249, 55,110, 95,189, 90, 24, 72, 88,168, 91,252, 6, 65,210,139, 87,216, 83,218,186,117,253, 49, 6,204,239, 99,113, 49, - 86,188,120,254, 26,199,171,240,115,172, 94, 93,189,183, 0,192,185,203,201,211,241,215,140,171, 85,219,197,197,229, 2,135,195, -225, 88, 44,150,105, 50,153, 44,180,108, 35, 52,132, 13, 0, 92,114,109,190, 60,195,117,222,167, 83, 25,174, 70,191, 83,174,215, -170,243,217, 92,118,188,128,235,126,123,202,120,214,185, 60, 85,171,231,165,125,255,200,145, 35,101,206,226, 93,223, 31,189, 88, -150,122,125,131, 27,196,197,126,183,177,249,134, 14,126,206,220,184,228,199,210,111,183,230,111,227,219,251,246, 29, 51,148, 9, -229,136,153,209, 59,119,230,168,232, 89, 86,121, 86, 2,142, 70, 32,136, 43, 16,120, 91,204,102, 55, 6, 32,108, 14, 39,211,164, -215, 39,243,128,136,249,128,252,223,174,201, 19, 8,170, 89,204,102, 55, 0,248, 59,150,147,242, 38,101, 26, 45,169, 84,250,136, -197, 98, 85, 43, 57, 25,110,209,124,130, 69,239,149,252,140, 97, 24, 88, 44,150,148,188,188,188,166, 85,248,125, 91, 0, 67, 1, - 20,117, 81,223, 15,224, 16,222, 61,225,216,150,199,227,205,145, 72, 36,157,181, 90,109,125, 0, 16,137, 68,145,106,181,250,170, -209,104,252,238, 29,117, 57, 0, 62,144, 74,165,157, 88, 44, 86, 39, 66, 8, 67, 8,185,166, 82,169,174, 2, 56, 12,224, 93, 70, - 74, 16,185,186,186,174,112,116,116, 28, 49,127,254,252, 28, 39, 39,167,192, 89,179,102, 61,204,205,205,253, 53, 59, 59,123, 1, -170, 48, 71,221, 95, 76, 45,119,119,247,253, 92, 46,151,157,156,156,220, 9, 0,188,189,189,175, 25, 12, 6,139, 76, 38, 27, 9, -224,117, 21,245, 36, 0, 90, 74,165,210,166, 82,169,180,189,197, 98,169, 91, 56, 63,227, 11,149, 74,117,211,104, 52, 62, 2,112, - 15,128,250,111,116,142,216,112, 56,156,189,133,117, 61, 0,128,242,223,118, 17, 32, 44,212,125, 30,249, 50,176,216,120,213,175, - 83,246,202, 12,124, 74, 89,183,210, 70,171,115, 7,143,190,253,250,117, 99, 1,128,193,116,174,239,213, 27,233, 39,255,108,147, - 53,104,208,160,223,246,238,221,235,160,215,235, 49,121,242,228,253,151, 47, 95,222,162, 80, 40,230,151,123,225,144, 58,204, 90, -179,254,162,152, 97, 88, 0,224,106,181, 90, 92, 83, 83, 95, 7, 60,127,246, 91,207,200,200,187, 43,181, 47,175,222,179, 50,220, - 41, 70,180,123, 89,153, 66,212,245, 67, 72,223,193, 3,251, 44, 91,182, 4, 35,134,141,168, 30, 25,169, 19,121,217,198,242,115, -181, 18,127, 39, 23,215,126,203,150, 31, 97,110,223, 58,209,111,239,174,165, 87,199,143,119,234, 76,205, 86,165, 96,150,115, 56, - 45,237,252,253,219, 15, 59,113, 2, 82,111,111, 14, 71, 32, 96, 1,128, 89,175,247, 86, 37, 39,123, 28,236,215,175,197,146,232, -232,235, 75,128,251, 84,243,127,162, 73,169,138,209, 98,177, 88,213, 82, 83, 83, 93, 37, 18, 73,193,197,152, 16, 88, 44, 22, 88, - 44,150,226,201,139, 9, 33,197,127,205,102, 51,234,212,169, 83,169, 39, 90, 0,157, 1,140,235,216,177,227,144,239,190,251,142, - 27, 20, 20, 84, 52,101, 72,187, 47,191,252,242,251,240,240,240,163, 0,118,163, 96,240,198,202, 62,241,246,144, 72, 36,251,214, -172, 89, 99,219,173, 91, 55,142,167,167, 39, 24,134, 65, 70, 70, 70,203,203,151, 47, 55,157, 53,107,214, 52,181, 90, 61, 10,192, -133, 42,236,159, 6, 54, 54, 54, 71, 6, 14, 28, 88,173, 67,135, 14,194,122,245,234,193, 98,177,224,241,227,199,227, 31, 61,122, - 52,252,232,209,163,139,149, 74,229, 16, 84,126,190, 54, 70, 42,149,142,181,181,181, 93,177,104,209, 34,199, 81,163, 70,241,159, - 61,123,150,231,231,231,199,220,190,125,219,229,208,161, 67,211, 86,173, 90,245,129, 66,161, 88,160, 82,169,126, 65, 37,230, 80, -180,177,177,121,196, 98,177,170, 85,198, 8, 3,168,138, 25,110, 92,163, 70,141, 67,183,110,221,170,145,144,144, 96, 25, 48, 96, -192, 30, 0,184,122,245,106,144,201,100, 98,186,119,239,126, 46, 37, 37,101, 40,128,199,149,220,246,134,142,142,142, 39, 71,140, - 24,225, 88,171, 86, 45,113,141, 26, 53, 24,137, 68, 2, 54,155,141,252,252,124,207,103,207,158,117,189,127,255,190,246,242,229, -203,185,122,189,190, 31,128,136, 42, 28,167,214,174,174,174,163,185, 92,110, 3,179,217,236, 5, 0, 28, 14, 39,213,100, 50, 61, -147,201,100,123, 1,252,246,174, 39,136,155,155,219,230, 21, 43, 86, 56,203,100, 50,178,106,213,170,205, 74,165,114,236,191,245, - 98,176,255,215,195,120,244,240, 62, 80, 48,109, 14, 83, 74,253, 99, 0,240, 62,253,116, 54,154, 54,107,129,145, 35, 62,168, 80, -179,119,151,106,107,184,124,158,147, 78,167,251, 45, 95,163, 63, 44, 17, 11,135,142, 24, 30, 18, 3, 0,231,206, 95, 31,218,188, -185,195, 53, 59,177,224, 3,161, 80,216,218,100, 48,230,156,189,146,242,121, 85, 76,149,151,151,215, 5, 7, 7, 7,113,110,110, -110, 70, 86, 86,214,143,125,251,246, 93,190,123,247,110,135,184,184, 56, 36, 39, 39,227,147, 79, 62,145,166,164,164, 76,143,136, -136,184,107, 48, 24,202,140,108, 41,149,185, 27,191,156,215,127,145,157,157, 51, 91, 34,182,133,141,157, 35,252,106, 53, 66,203, -214,125,209,171,207, 4,188,138, 9,111,185,123,215,178,240,212,212,203,223, 72, 29,107, 46,151,203,107,148,121, 93,170, 87, 27, - 29,250, 13, 44, 48, 89,139, 22, 45, 65,244,203,151,202,132,120,214,199,103, 78,112,196,189,186,212, 17,152, 13, 25, 9,183,111, -157,168,209,182,221, 0, 0,104,186,119,215,210,171, 31,143,116,232,178,121,127,158,146,222,146,202,190,118, 46,227,114,199,246, - 88,191,222, 53,120,218, 52,158, 42, 62,222, 24,187,117,171, 38,243,230, 77, 11, 71, 32, 32,222, 61,123, 50, 46,157, 58, 9,167, -189,120,193,187,179,106, 85,123,238,210,165,126, 11,140,198,125, 84,243,255, 85,243,191, 78, 81, 18,124,201,222,135,219,203, 53, - 90, 12,195, 64, 34,145,224,224,193,131,224,114,185,224,112, 56,224,114,185,101,254,239,227,227, 83,153,130, 12,114,119,119,255, -126,203,150, 45,110, 61,122,244,128, 80, 40, 44,254,128,205,102,163, 91,183,110,232,218,181, 43, 55, 45, 45,109,248,193,131, 7, -135,175, 92,185, 50, 83, 46,151,207, 64,225,196,208,229,208, 41, 48, 48,240,216,197,139, 23, 69, 58,157, 14, 55,111,222, 68, 94, - 94, 30,248,124, 62,170, 85,171,134,238,221,187,115, 94,190,124,233,216,173, 91,183, 99,209,209,209, 33, 0,174, 85,162,172, 77, - 93, 93, 93,111, 28, 62,124, 88,216,168, 81, 35,230,213,171, 87, 8, 14, 14, 6, 0,228,231,231, 99,192,128, 1,194, 81,163, 70, -213, 26, 62,124,248, 61,153, 76,214, 1,192,163, 10,244,154,184,187,187,255, 50,112,224, 64,207,149, 43, 87,218,218,216,216, 32, - 33, 33, 33,221,221,221, 61,160,104,127, 15, 31, 62,156,223,183,111, 95,143,213,171, 87,111, 60,114,228,200,231, 50,153,108, 44, -128,176,114, 93,107,161, 33, 22,139,197,200,204,204,196,254,253,251, 49,125,250,116,176,217,108,200,100, 50, 28, 58,116, 8, 31, -127,252,113,145,161,169,148, 25, 22,139,197, 93,253,253,253,127,190,122,245,106, 53,123,123,123,120,122,122,178,190,250,234,171, - 6,126,126,126,162,234,213,171,179,211,211,211,113,236,216, 49,191,209,163, 71,159, 76, 74, 74, 26,175,215,235, 43,108, 82,115, -115,115,219,121,230,204, 25,159,200,200, 72,108,221,186, 21,185,185,185,224,243,249,176,183,183,135,187,187, 59, 2, 2, 2,152, -121,243,230,137,251,246,237, 43,158, 49, 99,198, 78,131,193,208,184, 18,199,168,145,171,171,235,182, 78,157, 58,249, 45, 93,186, -212,222,221,221, 29, 69, 15, 6,249,249,249,213, 18, 18, 18, 90, 46, 90,180,104,200,163, 71,143,226,100, 50,217, 20, 0, 79,170, -120,226, 52,174, 87,175, 94,200,128, 1, 3,216,233,233,233,216,187,119,111,136, 82,169,108, 92, 5,115,249,143,226,209,195,251, -152,252,209, 39, 42, 79,111,111,222,197, 11, 63, 15, 58,114,188,246, 67,123, 81,193,132,212,114, 45,140, 67, 6, 70, 55,235,222, - 99, 2,175,119,159, 1,170,237, 63,108,148, 86,198,104,113,249, 60,167,253,251,214, 37,221,186,253,168,193,165,203,247,123, 14, -234,215,143,240,120,246,126, 0,240,249,172, 79,185,199, 78,157,218,213,173,107,139,180,118,109,155, 38,141, 28, 53,219,167, 10, -197,173, 93,187,118,237,235,225,225,225,110, 2,129, 0,185,185,185, 78,219,183,111, 95,215,182,109, 91, 86,108,108, 44, 94,190, -124,137,248,248,120,228,231,231,163, 91,183,110,210,176,176,176, 31, 1,148,105,180,140,172,206, 43, 60,171,155, 54, 57,137, 36, - 53,140, 22,133, 43, 49,165,215,187,116,230, 82,195, 3,123,181,193,110, 30,117, 2,198,125,184, 24,203,150, 31,229,254,186,255, -219, 69, 87, 46, 31, 0, 88, 53,202,158, 17,128,160,245,151, 11,230, 67,161,212, 99,212,136, 73, 24, 61, 98,146, 19,129,193,131, - 88,116, 18,131, 54,207,222,134,247, 34,116,203,142,117, 3, 1, 84, 43, 97,182,174, 80,179, 85, 54,203, 56,156, 22, 33,223,127, -239,210, 96,226, 68,193,147,165, 75,213,217, 55,111,106,253,123,247,206, 11,158, 58, 85, 15, 0,202,248,120, 94,244,226,197, 98, -151,246,237, 69,173,230,204,113,176, 24, 12,238,203,150, 45,107,190,168, 96,242,242, 42,105,250, 12, 29,106, 89,180,107, 87,179, -155,179,103,119,100, 76, 38,118,207, 86,173, 30,175,218,187, 55,245,125, 52,255,204,114,166,221,184,161,207,245,243, 67,240,128, - 1, 57, 62,174,174,250, 63,115,219,223,167,156,148, 98,138,114,181, 38,151,124, 66, 69,104,104,104, 7, 0,215, 1, 44, 13, 9, - 9, 89, 2, 0,118,118,118,153,114,185,220,245,216,177, 99, 21,154, 44, 46,151, 11, 15, 15, 15, 4, 4, 4,200,100, 50,153, 91, - 57, 5, 72,182, 90,173,213, 8, 33,197,209,151,178,208,235,245,136,137,137, 65,195,134, 13, 83, 80, 48, 17,109,153, 65, 29,177, - 88, 28,251,242,229, 75,231,231,207,159,227,209,163, 71,240,243,243,131,131,131, 3,184, 92, 46, 76, 38, 19, 20, 10, 5, 2, 3, - 3, 33, 16, 8,208,164, 73,147,108,181, 90,237, 87, 65, 19,144, 64, 34,145,196,220,184,113,195, 59, 56, 56, 24, 15, 30, 60,128, -183,183, 55,220,221,221, 1, 0,241,241,241,184,125,251, 54,122,247,238,141,240,240,112, 12, 30, 60, 56, 89,173, 86, 7, 0,208, -151, 37,232,232,232,152,126,245,234,213,148,160,160, 32,157, 90,173,102,101,102,102,114,111,222,188,105, 86, 42,149,210,252,252, -124,174, 92, 46,231, 42, 20, 10,142, 90,173,230,178, 88, 44,158, 86,171,229, 94,185,114,133,109, 52, 26,203, 29, 32,179,232, 56, -157, 58,117, 10, 65, 65, 65, 56,118,236, 24, 62,251,236, 51,220,185,115, 7,222,222,222, 56,124,248, 48,230,204,153,131,168,168, - 40, 56, 59, 59,163, 94,189,122, 21, 29, 35,212,170, 85,235,213,211,167, 79,107,241,120,188,162,121, 29,139,230,203, 67, 86, 86, - 22, 94,191,126,141,212,212, 84,248,251,251, 99,196,136, 17,175, 83, 83, 83,253, 43,170,121, 94, 94, 94, 89,145,145,145,206, 13, - 27, 54, 68,102,102, 38,236,237,237, 97,103,103, 7,123,123,251,226,255,253,252,252, 48,123,246,108,184,187,187,203,116, 58,157, - 91, 69, 38, 40, 40, 40,232,194,149, 43, 87,156,109,109,109,145,145,145, 1,133, 66, 1, 14,135, 3,177, 88, 12,103,103,231, 98, - 35, 31, 19, 19,131, 62,125,250,100,199,198,198,246,168,130, 73, 98,185,185,185,189,140,136,136, 8, 32,132, 32, 41, 41, 9, 81, - 81, 81,248,232,163,143, 98,116, 58, 93, 29,252,139,230,236, 43,145,119,197, 27,251,225,100,222,192,254,173, 13, 47, 34, 67, 25, -129, 53, 10,141, 27,216,230, 3,192,227,103, 10, 59, 61, 43, 16,117,235,135,144,227, 39,127,227,255,178,123, 59, 23, 86,184,129, - 65,212,139, 24,124, 93,150,118,247, 78, 30, 19, 63,253,116,124,131,142,109, 59,176,148,106,181,235,143, 63,174,111, 18, 27,251, -194, 21, 0,252,252,234,202,166, 77,155, 21,102, 35,145,200,174,223,190, 97,221,176, 97,231,179,139,215,210,119, 84,162,200,126, - 1, 1, 1,119, 79,157, 58,229,236,234,234, 10, 59, 59, 59,168,213,106, 24,141, 70, 60,127,254, 92,119,240,224, 65,147,173,173, -173, 77, 70, 70, 6,228,114, 57, 24,134,193,169, 83,167,146, 0,248,190, 45, 84,148,163, 5, 0, 31,245,170,203,173,215, 57,192, -129, 39, 48,139, 68,220,104, 15, 48, 22, 1, 67,164,110,231, 46, 60,110,120,238,210,131,145, 3, 7,125,230,210,174,195, 64, 44, - 90, 56,196,148,150,150, 20,108, 68,187,151,165,229,104,213,241, 71,231, 1,131, 7,126,176,108,217, 18, 44, 89,180, 20,161,167, - 78,228, 75, 37, 44,189,173, 61,215,174,125,203, 54,186,217,211,251, 39,171, 84,105,222,203, 86, 31, 28,209,167,255,236,106,109, -219, 13,192,237, 91, 39,176,119,215,210, 71,140,136,208,102,196,183, 88, 2, 56,216,251,249, 77,153, 25, 19,195,123,178,100,137, -202,156,150,150,215,116,214,172,236,210,214, 77,185,116, 73,194,247,244,180,117,232,215,207,113,163,175, 47, 49,201,100,219, 74, -203, 49, 42, 77,243,178, 84,106,127,224,220,185, 46,132,203,237,240,197,220,185,162,144,144, 16, 40, 20, 10, 28, 61,122, 20,219, -182,110,213,123,120,120, 60,245,124,246, 44,188,129, 66,177,176,178,154, 77,103,205,202,182, 88, 44,204, 7,115,230,116,139,140, -143,239,156, 33,147, 85, 7, 0, 15, 71,199,228,166,126,126,143,118,134,134, 70,109,174, 81,195, 90,217,114,254,116,254,188,219, -145,132,132,137,142,142,142,162, 76,153,140, 35,224,243,115, 90,214,171,119,248,135, 5, 11,174,155, 35, 34,120,194,106,213,108, -237, 66, 66,170,188,237, 77,103,205,202,206, 85, 42, 57, 51,151, 47,111,147,152,153, 89, 93,165,215,251,203,149, 74,119,139,201, -196,178, 21,139,115,106, 6, 6,202,180, 55,111,166,215,212,104, 62,217, 1,200,254,170, 99, 93,154, 23,249, 7,241,246, 56, 90, -103, 8, 33,111,204,117,120, 61, 36, 36,228, 15,189,107, 8, 33,149,138,102,113,185,220, 55,154,169,202,129,199, 48, 12,194,194, -194,224,228,228, 4,119,119,119, 8, 4,111, 78, 62,152,149,149,133, 59,119,238,224,197,139, 23,104,212,168, 81, 81, 51, 70,217, -142, 72, 32,248,116,245,234,213,246, 6,131, 1,143, 30, 61, 66,211,166, 77, 33, 16, 8,192,227,241,222, 48,129, 50,153, 12,245, -235,215,199, 23, 95,124, 97,183,114,229,202, 79,245,122,125,153, 79,164, 28, 14,103,198,164, 73,147, 92,139, 34, 88,201,201,201, -104,210,164, 73,241,231, 46, 46, 46,120,252,248, 49,154, 54,109,138,106,213,170, 97,200,144, 33,174,123,247,238,157, 97, 54,155, -191, 43, 75,147,207,231,179,130,130,130,154, 1,128, 68, 34, 1,139,197,138,182,181,181,117,113,115,115,147,216,218,218,254, 97, - 27,119,237,218, 37,103,177, 88,166, 10,221, 0,139,133,140,140, 12, 52,104,208, 0,249,249,249, 0, 0,181, 90, 13,127,127,127, - 40, 20,138, 98,211,234,233,233, 9,173,182,252,212,175,134, 13, 27, 46,169, 83,167, 78,119,137, 68, 34,224,114,185,120,242,228, - 9,130,131,131,113,240,224, 65,248,248,248, 64, 44, 22, 35, 38, 38, 6, 65, 65, 65,184,113,227, 6, 92, 92, 92, 80,191,126,125, -129,171,171,235,173,220,220,220,107,137,137,137, 75,202, 41, 39, 75, 42,149,226,198,141, 27,216,185,115, 39,226,227,227,145,150, -150, 6, 27, 27, 27, 52,110,220, 24,245,234,213, 67,235,214,173, 17, 19, 19, 3,166,226,202,228, 30, 16, 16, 16,250,224,193, 3, -103, 66, 8,246,238,221, 11,149, 74, 5,131,193, 0, 22,139, 5,161, 80, 8, 7, 7, 7,116,238,220, 25, 46, 46, 46, 8, 8, 8, -192,161, 67,135,156,123,245,234,117, 86, 38,147, 53, 6,144, 81,209,126,117,112,112,248,100,241,226,197,222,174,174,174, 72, 72, - 72, 64,126,126, 62,220,220,220,208,177, 99, 71,175,203,151, 47,127, 98, 50,153,214,255, 91,110,100, 37, 18,223,153,139, 23,126, - 30, 20, 80, 51, 47,168, 81,160,216,251, 88,168,155,247,193, 80, 89,125, 0,104, 80,215, 45,114, 80,136, 56,249, 73,100,104,242, -197, 11, 39, 30,189,136,198, 49, 84,162,105, 59, 95,163, 63,124,233,242,253,158,193,141,154, 88, 87,127, 59,167,207,244,143, 38, - 10, 92,221, 38, 32, 51,233, 4, 46, 95, 13,243,153,243,217, 36,151,239,214,254,116,238,210,229,251,172,124,141,126, 97,229, 66, - 89, 62,155,119,255,208,218, 89,153,125, 4,175, 94,242, 33,178,105, 0, 63,191,218, 80, 40, 20, 16, 10,133,194, 17, 35, 70, 88, -230,207,159,175,177,181,181, 21, 51, 12,131,107,215,174,201, 0,244,168, 72, 87,231,234, 64, 44, 70,147,153,240,217, 86,194,216, -104, 25, 75, 46,255,217,243, 56,116,239,218, 41,179,109,139, 6, 43,231, 47, 91,251,101, 64,237, 96,151,241, 19,151,114,151, 47, - 25,185, 21, 12,218,149,166,243,242, 21,174, 50,135,143,139, 0,244, 89,246,245, 18,196,198,198, 56, 76, 30, 39, 95,202, 17,136, - 60,235,248,182,177,217,186,243, 90, 79,127,255, 26,213,103,207, 24,114,102,221,247,235,250,148,140,108,237,222,181,248, 36,128, - 46,149,217,183,255, 33, 26,142, 14, 13,133, 42, 41,201,148,123,235,150,174,203,247,223,103,123,247,232,177,222, 96, 52, 58, 23, - 93, 42, 88, 12, 3,166, 40,117,194,106,101, 56, 95,124,193, 34, 28, 14, 76, 14, 14,227,144,151, 87,187, 34,205,207,210,211, 7, -141,156, 56,177,207,201,243,231, 81,163, 70,141,226,251,153,189,189, 61,230,204,153,131, 89,179,102, 9, 30, 63,126,220,252,200, -145, 35,205,191, 91,179,198, 13,192,160,202,148,243,226,189,123, 14, 83,151, 45, 91,208,168,105, 83,159, 61,251,247, 11,106,213, -170, 5, 0,120,253,250,117,192,183,171, 86,249, 54, 8, 10,202, 92,249,233,167,187, 35,231,207,175, 15,224, 86,121,154, 25, 55, -111, 26,142, 36, 36, 76,188,122,237,154,125,131, 6, 13, 0, 0, 81, 81, 81,174, 27, 55,110,156, 84,127,200,144, 81,203,166, 77, - 91, 24,162,211,201,109,179,178, 4, 33,155, 55,115, 14,124,240, 65,133,154, 69,229, 4,128,142,227,199,127,218,174, 83,167,122, -131, 38, 78,116,244,241,241, 97,164, 82, 41,140, 70, 35,210,210,210, 28, 34, 35, 35,107,133, 42,149,138,227,247,238,237,133,197, -210,237, 47, 60,214,165,122,145,127, 88, 36,235,143,158,162,240,111,199,208,208, 80, 2,160, 99, 72, 72,200,141,162, 27,184,197, - 98,169,148,201,226,112, 56, 96, 24,166,178,102, 11,132, 16,100,103,103, 35, 59, 59,187,184,233, 72, 38,147,225,234,213,171,136, -137,137, 1,151,203, 5,143,199,131,209, 88,241, 28,180, 18,137,164,107,215,174, 93, 57,247,238,221,131,159,159, 31, 68, 34, 81, -113,185,138, 94, 60, 30, 15, 30, 30, 30, 80, 40, 20,232,210,165, 11,119,211,166, 77, 93,203, 51, 90,118,118,118,189,135, 14, 29, -202, 47, 90, 86,169, 84, 96,179,217,197,166, 69,165, 82, 33, 55, 55, 23,114,185, 28, 58,157, 14,173, 90,181,226,135,134,134,246, -206,201,201,249,174, 50,219,175,209,104, 84, 50,153,204,190, 93,187,118, 14,187,119,239,142,106,213,170, 85,224, 27, 53,237,250, -117,157, 78,167,227,178, 88,172, 74,205,163,183,111,223,190,226,125,159,154,154,138,173, 91,183, 22,127, 22, 19, 19,131, 77,155, - 54, 21, 79, 5, 80,222, 49,170, 83,167, 78,175,189,123,247, 54,221,179,103, 79, 30,155,205, 70, 84, 84, 20,246,239,223, 15, 66, - 8, 92, 92, 92,160,209,104,144,153,153,137,107,215,174,193,108, 54, 67, 42,149,194,203,203, 75, 56, 99,198,140,182, 75,151, 46, -229,150,103,180, 44, 22,139,133,205,102,195,215,215, 23,139, 22, 45,130, 78,167, 3,143, 87,224, 47, 21, 10, 5,228,114, 57,194, -195,195,145,144,144, 0, 82,193, 40,111, 66,161,112,200,158, 61,123, 92,249,124, 62,180, 90, 45,148, 74, 37,146,147,147,145,152, -152,168,147,201,100,102, 27, 27, 27,150,175,175, 47, 75, 32, 16, 8, 6, 12, 24,192, 20, 25,206,144,144, 16,167,189,123,247, 14, - 51, 24, 12, 21,153, 36, 23,119,119,247, 47, 39, 77,154, 36, 44, 89,103, 51, 50, 50, 48,104,208, 32,241,111,191,253, 54, 95,161, - 80,236, 7,144,245, 47,187,161,145, 35,199,107, 63,124,116, 57, 42,232, 88,168,155,119, 98,138,165,205,156,207,215,114, 0, 96, -251,182,111,218, 28, 11, 77,189, 83,167, 70,102,242,145,227,181, 31, 58, 56,188,168,200, 8,176, 58,119,240,232, 43, 17, 11,135, - 14,234,215,143,252,248,227,250, 38,211, 63,154, 40,240,173, 61,167, 32,194,201,117, 69, 23,243,215,140, 70,251, 90,248,227,143, -235,155, 12,234, 55, 56, 60, 62, 62, 97, 91,231, 14,130, 67, 87,111,164,159, 46, 47, 98,232,234, 36,244, 18, 11,212,240,242,171, -135,192,186, 18, 60,126, 18,133,163,135,239,162,110,253,150,208,235,245, 48,155,205,146,190,125,251,106, 14, 30, 60,168,139,142, -142, 86,106,181,218, 14, 0,162, 43,218,248,148,148,231,214, 64,247,150, 70,158, 72, 96, 86,230,243, 52,243, 22, 30,249,160, 73, -139,238, 77, 29, 60,188,184, 46, 18,235,233, 94,221,154,239,223,185, 99,209,172,133,139,247,163, 89,243,238,173, 94, 68,221,170, - 7,224,105,169,230, 53, 22,161,172,163,199,205,177,175, 94,245, 73, 76, 72, 72,169,237,230,110,120, 45, 39,166, 79,230,253,212, -173, 93,135, 33, 13,107,213,109,207,127,241,252, 6,179,232,139, 97,191, 46, 91,189,110, 68,145,217,186,114,233,215, 14,227,198, -221,229,239,222, 93,118,116,252,191, 6, 79, 32,168, 38,245,245,229,196,239,222,173,245,235,219, 55, 15, 0, 12, 70,163,115,124, - 66,130,157, 88, 44, 6, 33, 4, 38,147,233,141, 28,226,162,188,225, 6,129,129,110,149,209,140,255,234,171,134, 95,124,241, 5, - 50, 50, 50, 96, 54,155,193,229,114,223,190,102, 67,173, 86, 99,220,184,113,216,188,102, 77,203,202,104, 90, 44, 22,102,234,178, -101, 11,230, 46, 88, 80,107,202,148, 41,172,146,215, 94, 71, 71, 71, 28, 57,122,148,191,101,203,150,106, 95,110,222, 60,110,164, - 64, 16, 11,189,190, 92,205,108,127,127, 56,102,102,138,138, 76, 22, 0, 4, 6, 6, 98,235,214,173,130, 9, 19, 38,240,251,246, -237,187,246,113,163, 70, 27,215,183,109,251,202,169,118,109, 91,190, 64, 80,173, 34,205,162,253, 9, 0, 74,157,174,193,250,141, - 27, 29,238,223,191,143,204,204, 76,100,100, 20, 60,143, 50, 12,131,102,205,154, 49,163, 71,143,182,171,233,237,221, 28, 22,203, - 95,121,184,255,224, 69,254, 65, 76, 46,229,189,223,115,180, 10, 55,136, 41,220, 64,166,196,205,241, 13,195, 82,145,209,122, 23, -228,114, 57,228,114, 57,118,236,216, 1, 30,143, 87,124,243, 5, 0,131,193, 80, 25,211, 18,228,233,233,137,252,252,124,212,174, - 93,251,141, 72, 22,143,199, 3,135,195, 1,143,199,131, 64, 32,128, 94,175,135,143,143, 15, 52, 26, 77, 80,121,154, 90,173,182, -177,163,163, 99,241, 13, 86, 95, 88, 89,245,122,125,113,121, 13, 6, 3,242,242,242,160, 82,169,160, 84, 42,161, 86,171,131, 43, -179,189, 86,171, 21,207,158, 61,123, 29, 24, 24,216,152,205,102, 67, 42,149, 74,212,106,117,113,110, 81,110,110, 46,126,249,229, - 23,245,152, 49, 99,156, 79,157, 58, 85,161,209, 98, 24, 6, 31,127,252, 49, 4, 2, 1, 52, 26, 13,126,252,241, 71,204,156, 57, - 19, 60, 30, 15, 74,165, 18, 91,183,110,197,236,217,179,193,225,112, 96, 48, 24,176,113,227,198, 50,181,158, 63,127, 30,127,239, -222,189,224, 38, 77,154, 56, 28, 63,126, 60,171, 91,183,110, 46, 61,122,244,128, 72, 36,130, 86,171,133,201,100, 66,203,150, 45, - 81,167, 78, 29,200,100, 50,156, 59,119, 46, 59, 32, 32,192,249,254,253,251,214,140,140,140,196, 10,204, 53, 41, 17, 49,132,197, - 98, 65,102,102, 38,228,114, 57,178,178,178,144,150,150,134,148,148, 20,112, 56,156, 10, 71,211,117,114,114, 26,220,160, 65, 3, - 54, 0,136, 68, 34, 52,110,220, 24, 11, 22, 44, 48,107,181,218,161, 0,206, 21,174,214,235,167,159,126, 58,126,251,246,109,142, -167,167, 39, 94,190,124, 9, 23, 23, 23,142, 80, 40,172,208,104,185,187,187,239, 58,125,250,180, 99,145,185, 46,218,207, 26, 77, -193,225, 24, 52,104,144,227,158, 61,123,118,153,205,230,222,255,182,155,154,189, 8,188,198, 13,108,243, 15,134,202,234,207,249, -124, 45,167, 78,131,130,135,215,201, 83,192,249,110,205,103,245, 71,245,183, 61, 99, 47, 82,240, 42,210,233,213,213,123, 75,191, -126,221, 88, 35,134,135,196,240,120,246,126,219,182, 47,117,117,117,155, 80,194,134,217,194,201,217, 22,126,190,124,230,200,153, - 23,174,243,230,127,173,223,183,103, 93,236,175, 7, 66,123,242,185,151,186,159,187,156, 60,173, 44,237,232,215,242, 83, 26,189, -176,174, 34, 39,130,113,116,107,131,198,141, 2,225,234,146,135,159,118, 29, 68,141,154,205,160,215,235, 97,107,107, 43,182, 88, - 44, 70, 54,155,189,175, 50, 38, 11, 0,174, 92,145, 91,235,215,151, 27,216, 74,171,121,250,204,239, 6,118,235,213,175, 94,231, -206, 93,173, 23, 47,253, 31,123, 87, 29, 31,197,241,190,159,221, 61,205,197,229,226, 2, 4, 8, 4,130, 21,105,113,215, 80,164, - 88, 11, 5, 74,209,210, 2,133, 34, 69, 75, 5, 41,180, 64,113,104, 11, 20,119, 8, 30, 74,112, 13, 18, 15, 36, 16,191,184, 92, -114,126, 43,191, 63, 34,223, 4, 34,119,129, 26,191,125, 62,159,253,236,221,222,238,115, 51, 59,179, 59,207,188,243,206, 59, 23, - 13, 29, 90, 25, 20,253,250,180,204, 56,127,105,211, 83, 69,218,243,134, 77,155,117, 68,100,196,149,190, 28,135,112,130,168,220, -250, 20,241, 12,231,181,108,228,149,131, 7, 39,177, 26,246,161,197,119,223,135,245, 27, 48, 96,108, 64,231, 78,157,217, 75,193, -127,234,197,200,142,178,233,216, 62,245,179, 79,251, 29,255,117,239,250,222,231,207,253,222,160, 64,153, 24,196,139,172,151, 58, -105, 52,237, 34,144, 72,200,172, 43, 87,232,102, 19, 38,232, 74,159, 71,153, 76,134,147, 39, 79, 66, 44, 22,151,109, 34,145,168, -236,179,139,139, 11,136,146,105,164,166,112, 2,128, 66,161, 64,122,122, 58,108,109,109, 33,151,203,145,158,158,142, 91,183,110, - 33, 54, 54, 22, 66,161, 16,125,251,246, 5, 89,133,111,243,203,156,195,231,204,233,229,223,172,153,247,203, 34, 11, 0, 12, 6, - 3,114,115,115, 49,104,208, 32,242,220,185,115,174,231,147,146,222, 7,176,183, 58,206, 86, 3, 6,228,100, 28, 57, 82,233,127, -191,243,206, 59,196,205,155, 55, 37,125,251,244,153, 53,251,251,239, 55,253,178,103, 79, 50, 67,211,174,230,228,157, 36, 73,146, - 32, 8,120,121,121, 33, 55, 55, 23, 69, 69,197, 35,216, 86, 86, 86,176,183,183,135,209,104, 4,203,113,194,191,178,172,171,210, - 34,255, 17,108, 47, 39,184,182,191, 98,209, 42,201, 20, 0,116, 45,223,176,176, 44,107,146,200, 18, 10,133, 53,250, 92,153, 98, -229,122, 25,166, 8,173,210,180, 74,165,210,178, 7,173,188,192, 42, 77, 39, 73,146,160, 40,202,164,144,248, 44,203, 82,133,133, -133, 56,122,244, 40,186,116,233, 82, 54, 44, 85, 80, 80,128,252,252,124, 20, 20, 20, 64,171,213,226,197,139, 23,184,124,249, 50, - 26, 52,104, 0,192,180,224,175,241,241,241, 15,234,214,173,219,186,180, 17,239,214,173,155,231,174, 93,187,210,250,247,239,239, -206,113, 28, 22, 45, 90,148,253,238,187,239, 58,149,111,228,107, 2, 69, 81,184,117,235, 22, 26, 52,104, 0,142,227, 32, 18,137, - 16, 19, 19, 3,103,103,103,176, 44, 11,129, 64,128,172,172, 44, 88, 91, 87, 31, 35, 49, 60, 60,124,252, 39,159,124,146,102,107, -107,219, 60, 39, 39, 71, 33,145, 72, 58, 93,187,118,205,203, 96, 48,192,198,198, 6, 54, 54, 54, 56,123,246, 44,236,236,236, 48, -115,230,204, 36,141, 70,115,203,210,210,210, 69,163,209, 60, 73, 79, 79, 95,100, 78,121,211, 52, 13,149, 74,133,188,188, 60,228, -230,230, 66,169, 84, 66,171,213,214,152,198,202,208,169, 83, 39, 4, 5, 5, 81, 43, 86,172,248, 53, 62, 62, 30, 0,224,235,235, -139,153, 51,103, 82, 30, 30, 30,120,241,226, 5, 30, 60,120, 0,131,193, 0,142,227,170,125,120, 5, 2, 65,183,143, 63,254,184, -163,183,183, 55, 97, 48, 24,192,178, 44,116, 58, 29, 74, 63, 39, 37, 37,193,223,223,159,244,241,241,121, 47, 62, 62,190, 27, 76, -155, 88,193, 3, 64, 70,210, 9,120, 8,157, 1,210, 6,156,230, 4,114,178,107, 23,197, 37, 51, 51,243,251,185,139,111, 78,248, -101,181,193, 37, 69, 1, 52, 10, 24,140,134, 77,122, 96,252, 24, 26, 43,126, 60, 10,111,159, 70, 72, 76, 76, 68,183,110,221, 68, -105,105,105,159, 20, 21, 21,205, 49,149,251,210,165, 59,204,197,179,231,134, 13, 31, 57,182,117,207,158,253,233, 11, 23,206, 34, -252,201,133,136, 79, 70,126,144,201,177, 69,132,131,157,197,195,152,232,251, 13,155,183,236, 10, 61,205,116, 2,150,173, 6,150, -113, 85, 63,239,208,159, 57,227, 70,158, 57,241,251,152, 15, 71,143,107,209,163, 71,111,227,133, 75,167,241,224,246,165,199,107, - 87, 79,188,186, 98,253,161,110,189,250,126,208, 84,238,114,235,108,128,159,238, 83, 47, 71,219,184, 29,187,114,249,202, 82,217, -179, 41,149,178, 40,121, 47,146, 4, 1,142,227, 42,136,172,151,133, 22, 73,146, 53, 26, 0,202,115,150,111,139, 74, 59,212,219, -182,109,131, 68, 34,129, 88, 44,134, 80, 40,172,209,253,162, 60,103,196,139, 23,221,119,239,221, 43,169, 76,100,229,228,228, 32, - 39, 39, 7, 69, 69, 69, 24, 53,106,148,232,155,251,247,223, 65,137,235, 71, 85,156,222,110,110, 58, 75, 11,139,140,200,200, 72, -247, 38, 77,154, 84, 72,175, 82,169,132,133,133, 5,246,238,219, 39, 10, 28, 48, 96, 90,143,179,103,215,162,134,248, 87,149,229, -157, 32, 8, 56, 59, 59,195,222,222, 30, 4, 65,128,166,105,164,167,167, 35, 34, 34, 2,247,239,223, 7, 69, 16,244, 95, 89,198, -149,105,145,255,160, 85,107,123,165, 67,135, 85,141,137,154, 35,180, 40,138,170,181, 85,171, 42,152, 50,116, 40,147,201,194,210, -210,210, 58,120,120,120,128,166,233, 50,161,245,242,208, 97,169,245,227,209,163, 71,144,201,100, 97, 90,173,182, 90, 78,142,227, -222,107,219,182, 45,142, 29, 59,134, 43, 87,174,224,249,243,231, 80,171,213,208,233,116,208,104, 52,136,136,136, 0,203,178, 8, - 8, 8,128,165,165, 37,100, 50, 89,152, 78, 87,125, 71, 84,165, 82, 41,132, 66, 97, 35, 11, 11,139,178, 99,110,110,110,200,201, -201, 97,141, 70, 35,118,239,222,173,116,117,117,181,180,176,176, 48, 89,184, 18, 4,129,204,204, 76,120,122,122,150,249,104, 21, - 22, 22,194,217,217,185, 84, 88, 64,167,211,193,218,218,186,198,161, 67, 0,218,103,207,158,205, 46,247,189,205,240,225,195,247, - 31, 60,120,176, 94,112,112, 48,238,222,189, 11,185, 92,142, 31,126,248,225,121, 66, 66,194,135, 0,238,103,102,190, 89,191, 72, - 83,234, 80, 78, 78,206,209,176,176,176,247,218,182,109, 91,246,150,232,214,173, 27,209,173, 91, 55,167,242,166,254,172,172, 44, -220,187,119, 15,193,193,193, 32, 8, 2, 79,159, 62,101, 52, 26,205,254,234, 70, 41, 60, 60, 60,118, 45, 92,184,208,138,166,233, -178,186,109, 97, 97, 1,169, 84, 10,145, 72, 4,138,162,144,144,144,128, 65,131, 6,217,110,220,184,241,119,157, 78, 87, 31,128, - 1,111, 9,242, 53, 48, 60, 10, 87,218, 6,248,187, 68,108,223,182,162,195,164,201, 40, 29, 58,164, 3,252,157, 35, 30,133,103, -216,182,118,174, 57,191,231,130,147, 63,211, 27,207, 13, 60,119, 62,100,196, 87,179,102, 10,125,125,253, 51,131,255, 12,245,238, - 65,127, 75, 56, 58,217, 32, 39, 91,137,132,164, 12,196, 39,234, 57, 95, 95,255,204, 7,247,194, 36, 63,254,188,174,161, 74,173, - 45, 29, 58,172,182,158, 94,191,245,124,240,218, 13,146,171, 99, 63,105, 35,182,176,112, 71,110,118, 24,188,189,229, 24, 20,216, - 28,191,237,185, 5, 91, 91, 7,184,184,184,128, 36, 73, 75, 83,243,158,157,157, 77, 28, 61,112,125,194,199,227, 38,190,219,167, -247, 0,250,252,133, 51,130, 43, 23, 79,221,250,125,251,215,199, 57, 74, 37, 35,184, 66,139, 58,117, 93,159,196, 61,123,244, 97, -247,158,163, 96, 33,178,110, 0, 52,174,180,194,150, 77, 48,224,144,116,236,224, 50,233,199,227, 38,181,239,211,231,125,250,194, -133, 19,184,112,118,207,157,165, 75,235,156,125,158,186, 79,116,251,126,138,116,240,176,169,121, 65,231,162,244, 31, 12,172, 27, -235,110,217, 82, 3, 60,231, 85, 85,249,142,164, 64,144, 65,235,116, 94,158,125,250, 80,234,196, 68,161,149,139, 11, 13, 0, 70, -163,177, 70,161,133, 42,134,160, 95,230, 52, 53, 45,106,181, 26,108, 21,177, 19, 95,230, 76,207,204,172, 83,210, 9, 47,131,209, -104, 44, 19, 89, 57, 57, 57,200,207,207,135,165,165, 37,178,116, 58, 23, 83, 56,123,183,107,183,251,155,101,203,230, 28, 57,122, - 84, 84, 94,100,149,110, 66,161, 16,171, 86,175, 22,125,241,213, 87, 83,167, 9, 4, 51, 64,211, 38,223,207,210, 78, 59, 69, 81, - 16, 8, 4, 72, 76, 76, 68, 82, 82, 18, 18, 19, 19,145,152,152, 8, 11, 11, 11,112,127,241, 36,160,255,176,127, 86,169,200, 42, -191, 47,179,114, 85, 27,222,193, 28,103,120, 83,133, 1, 99,198,248,174, 41, 66, 75,165, 82, 5, 95,190,124,185,221,224,193,131, - 5,119,238,220,129,171,171,107,153,208, 42,221,151, 14, 71,201,100, 50, 28, 63,126,220,160, 82,169,130,107,120,152, 46,159, 61, -123,182,245,146, 37, 75,132,227,199,143, 71,100,100, 36, 38, 79,158,140,252,252,124, 40,149, 74,228,228,228, 64,173, 86,163, 93, -187,118,144, 74,165,120,242,228,137, 81,173, 86, 95,174,193, 98,199,101,102,102, 22,201,229,114,183,151,127, 27, 54,108,152,203, -230,205,155,213,209,209,209,198, 14, 29, 58,216,152, 42, 56, 74,113,224,192,129, 50, 75, 93,108,108, 44, 54,111,222, 92,230,147, - 21, 26, 26,138, 53,107,214,148,197, 62, 51, 19,247,179,179,179,105,163,209,136, 6, 13, 26,192,195,195, 3, 90,173, 22,235,214, -173,163, 1,220,255,167,106,179, 86,171, 61, 50,118,236,216,121, 15, 31, 62,116, 19, 8, 4,197, 38,237,146,252, 25, 12, 6, 60, -123,246, 12, 17, 17, 17,136,142,142, 70,110,110,110, 89, 71,224,209,163, 71,121, 70,163,241, 80, 85,188,114,185,124,209,111,191, -253,230, 42,147,201, 42,212,231, 82,107,104,169,149, 52, 43, 43, 11,118,118,118,232,209,163,135,243,229,203,151, 23,233,116,186, - 37,111, 73,155, 70, 12, 27, 18,219,230,139,207, 6, 99,104,160, 44,249, 88, 80,234,205, 53, 63,206, 46,113,134,119,142, 24, 26, -232,145,252, 56,198, 14,195,134,156,104, 3, 32, 5,213, 59,108,179,127, 94, 85,156,108,219,214,254,202,177, 83,167,126, 95, 48, -119, 86,232,156,217, 19,229,106, 77,156,212,215, 71, 76, 0, 64,124,162,158,123, 18,201,106,215,172,157, 21,186, 98,245, 70, 50, - 35, 39,127,242,189,123, 85,135, 55, 40, 47, 94, 72, 18, 82,223,198, 93,210, 26,250,117,172,123,231,214, 94, 88,201, 52,104,212, -184, 13,250,244,126, 15, 87, 66, 30, 33, 61, 75, 11,133, 66, 1,157, 78, 87,109,184,132,232, 39,199,199,112, 4,231, 77,112, 68, - 18, 65,114,210, 49, 99, 63,237, 52, 96,192,251, 92, 80,208, 41,250,196,241,189, 55, 14,253,177,225, 8, 41, 18, 10, 52,122, 91, - 61, 65,104, 11, 64,134, 71, 22,169,138, 59, 52, 66,137,168,106,243,107, 73, 96,215, 38, 77, 27,187,142, 25, 59,217,182,127,191, - 65,220,217,179, 39,216, 67, 7,119, 95, 57,180,179,217, 94,150, 84,138, 20,201,106, 73,129,210, 88,192, 17, 98,187, 34, 37,171, -206,136,175,175,117, 31, 48,204, 0, 28,225,213, 85,249,118, 64,167, 75, 41, 74, 78,118,115,232,210, 69,242,108,217, 50,153, 75, -187,118, 90,162,196,135,184, 58,161, 69, 81, 20, 64,146,172, 41,156,166,166, 69,163,209,128, 5,140,181,225,164,105,186,130,200, - 42, 21, 90,165,207,139, 41,156,219,151, 46,189,227,221,167, 79,110, 72, 72,136, 75,215,174, 93,137,194,194, 66, 20, 22, 22, 86, - 16, 91,238,238,238, 68,147,128, 0,217,129, 43, 87,124, 77,189,159,166,228,157, 36,201,191, 92,104,253,199,177,189, 74,235, 97, -117, 87,149, 90,180, 76, 17, 90, 38, 90,180,140, 70,163, 17,206,206,206,200,206,206,174,178,225, 39, 73, 18, 22, 22, 22,165, 99, -196,213,206,188,211,233,116,235,230,204,153, 51,189, 95,191,126, 78,141, 26, 53, 66, 86, 86, 22, 92, 92, 92, 32,149, 74,203,124, -199, 74,249, 66, 67, 67,241,219,111,191, 41,117, 58,221,186, 26, 56,127, 94,189,122,245,103, 67,135, 14,117,112,117,117,133,189, -189, 61,158, 60,121, 2,123,123,123, 40,149, 74,196,196,196,192,218,218,186,204,111,231,212,169, 83,133, 58,157,238,231, 26,196, - 27,119,237,218, 53,131,181,181,245,147,172,172, 44, 42, 55, 55, 87,144,151,151, 39, 80, 42,149,194,130,130, 2,225,249,243,231, -157,108,109,109,213,127,254,249,103,150,183,183, 55,245,252,249,115,202,104, 52,214,168, 94, 9,130,192,140, 25, 51, 32, 18,137, -160,211,233,176,110,221, 58,204,153, 51,167,204, 39,107,245,234,213, 88,184,112, 97,153,112,222,177, 99,135, 89, 53,135,227, 56, - 24, 12, 6, 24,141, 70, 24,141, 70,147,196,239,235,192, 68,193,158,254,244,233,211,192,182,109,219, 94, 60,124,248,176, 99, 73, - 76, 50,100,100,100, 32, 35, 35, 3, 89, 89, 89, 40, 42, 42, 2, 77,211,240,240,240, 64, 70, 70, 6, 78,156, 56, 81, 80, 88, 88, -216, 7,213,204, 56,164, 40,106,108,167, 78,157, 4, 47,167,161,180,151, 87, 42,222, 37, 18, 9,210,210,210,208,173, 91, 55,113, - 72, 72,200, 88, 0,255,105,161, 85, 62,188, 67,239, 62, 19, 68,254, 77,219,235, 31, 71, 4, 37, 55,174,155,145, 60,122,144,205, - 25, 0,120, 20,158, 97,251, 56,198, 14,254, 77, 3,185,222,125,236, 91,103,164,111,111, 6,192, 80,221,114, 61, 0, 96, 43,147, - 12,239,213,179, 93,154,181,165, 37,185,102,237,142,115, 91,182,252,252,206,145, 51,255, 11,239,176,102,109,113,120,135, 94, 61, -219,177,209, 81,209,195, 1,236, 52, 85,188, 4, 6, 14,124,248,219,174,223, 16, 29,241,167,251,188, 25,205,197,185, 25, 70, 88, - 88,121,161,117, 75, 23,108,223, 21,134,199,143, 31,167,235,245,250,110,213,214,111,130,243,142,136, 12,247,107,214,180,137,235, -152,177,147,108, 2, 3, 7, 33, 40,232, 36,254,216,189,243,218, 7,163,134,254,154,154,167,164,156,133, 50,145,140, 99,197,148, -200, 86, 32,146, 88,100,234,245,197,115, 32,132, 66,169, 13, 48,188,218,134,103,202,164,209,182,221,123, 14,194,153,179, 39,241, -199,238,237, 87, 23, 55, 29,182,179,110, 43,127,162,221, 59, 63, 78,173, 91,175,174,143,170, 40, 67, 73, 18, 98,131, 86,203, 90, -255,184, 59,225,167,248,133, 99,227, 1,172, 5, 63,235,176, 60,158,252,209,191,127,219, 47,226,226, 68,242,142, 29, 45,210,174, - 92,145,149,172, 68, 82,173,208, 18, 8, 4,224,170, 30,234,170,192, 73,236,217, 67, 2,168,118, 18,150, 72, 36,130, 90,173,134, -177,106, 11,118, 5, 78,183, 11, 23,146,227,226,226, 26, 58, 56, 56, 84, 16, 89,185,185,185,101,159,181, 90, 45,212,106, 53, 44, - 44, 44, 34, 52,149,143,136, 84,224,204,184,118, 77,187,114,198,140, 37, 31,142, 26,181, 33,248,242,101,169,163,163, 35, 10, 10, - 10, 42, 8, 45,189, 94,143,238, 61,122,136, 86, 63,124, 56, 6, 74,229, 82, 83,238,167, 75,183,110, 53,250, 3, 83, 20, 5,246, - 47, 30, 58,124, 11, 48,169, 50,225, 69,214, 52,132, 99,234,172,195, 42, 26,200,151, 87,247, 94,216,186,117,107,109,108,108, 44, -188,189,189,203,196, 74,249,255,180,177,177,129,157,157, 29, 66, 67, 67,241,253,247,223,107, 0, 44,172,129,179, 80,173, 86,143, -236,213,171,151, 70, 32, 16,160,113,227,198,101,241,179, 88,150,133, 88, 44,134,165,165, 37, 30, 62,124,136,129, 3, 7,170,213, -106,245, 72,188, 26, 67,235,101,206, 2,181, 90,253, 81,239,222,189,213,145,145,145,232,212,169, 19, 30, 63,126,140,162,162, 34, - 20, 21, 21,225,197,139, 23,104,210,164, 9,212,106, 53, 54,111,222,172, 81,171,213, 31, 1, 40,168,142,179,176,176,112,224,156, - 57,115,168,253,251,247,215,245,240,240,104,218,166, 77,155, 70, 61,122,244,168, 63,100,200, 16,159,254,253,251,187, 53,108,216, - 80,219,167, 79, 31,121,191,126,253,228,106,181, 90,120,243,230, 77,133,209,104,236, 87, 67, 58,203,196, 73,108,108,108,217, 80, -161, 64, 32, 64,118,118,118, 89,228,254,210,151, 82, 21, 66,184,103, 77, 98,187, 84, 96,149, 10, 46, 19,252,220, 42,227,172,241, - 34,177, 88, 92,106,241,228, 76,224,124, 20, 21, 21,213,171, 75,151, 46,143, 38, 76,152, 80,152,158,158, 14,107,107,107,248,250, -250,194,207,207, 15, 78, 78, 78, 48, 24, 12, 56,126,252,184,234,196,137, 19, 97, 5, 5, 5,221,240,106, 12,173,158, 47,221,199, - 23,149,189,100, 75,173, 89,165, 66, 75, 42,149,194,195,195,163,244,222,190, 48,231,126,214, 18,127, 45,103,137,128,233,209,189, - 79,189,254, 3, 6,219, 30, 63,121, 75,188, 97,211,137,176,214, 61,177,195,177,142,242,148, 99, 29,229,169,214, 61,177, 99,195, -166, 19, 97,199, 79,222, 18,247, 31, 48,216,182, 71,247, 62,245, 34, 35,162, 27,149, 95,247,176,178,116, 74,165,210,246,157, 58, -182,206, 11,185,113,149, 93,177,122, 35,217,189,219, 7, 15,119,254,122,252,248,206, 95,143, 31,239,222,237,131,135, 43, 86,111, - 36, 67,110, 92,101, 59,117,108,157, 39,149, 74,219,155,146,247, 41,147, 70,219, 14,232, 63, 8, 65, 65,199,233, 35, 7, 54,175, - 62,120,244,105,151, 79,167, 95,203,136,141,125,204,101,166, 92,128,144, 76, 68, 84, 84, 84, 65,137,200,138, 53,133,115,242,196, -209,229, 69,214,117, 71,215, 78, 59,162,162,192, 92,186,116,218,120,249,242, 67,205,245, 71,153, 5, 15, 34,179,115,211,178,114, -159, 43,149, 57,122,150,101,192, 48, 12,245,205, 55,101, 14,187,149,150, 81,135, 14, 93,241,103,240, 62,236,222,181,173,128,101, -161, 29,126,228, 8, 51,124,248, 50,206,167, 78, 29,159,189, 7,246, 17,129,239, 15,182,229, 0,118,224,208, 65,118,251, 15,238, - 39,234, 53,168, 87,199,215,183, 44,164,205,127,175, 46,253, 5,156,203,128, 60,101, 98,226,213,208,141, 27,117, 46, 35, 71, 58, -136, 93, 92,108,192, 48, 68,233,251,189,170, 77, 32, 16,188,108,129,169,146,211,195,201, 41,245,212,169, 83,240,243,243,131,135, -135, 7,202,251,200,150, 6,228,118,116,116,196,209,163, 71,193, 85, 12, 78, 93, 37,103,171,186,117, 67, 87,173, 92,169,103, 89, - 22,121,121,121,175, 88,179,242,242,242,192,178, 44,206,158, 57,163, 87, 22,175, 4, 98, 82,222,187, 81, 84,209,135,157, 59,175, - 24, 48, 96,128, 33, 46, 46, 14, 44,203,162,188,101, 43, 51, 51, 19, 86, 86, 86,208,234,116, 94, 0,100,166,112,102,158, 63,111, -137, 26,222,235,149, 88,180,254,138,114,255,175,139,172,242, 11, 74, 79, 50,201,162, 69,211, 52,188,188,188, 42, 44,233, 66,146, -100,133,205,204, 25,135,123, 34, 35, 35, 47,244,233,211,103,201,187,239,190, 59,101,201,146, 37, 84,163, 70,141, 80, 80, 80, 0, -123,123,123, 56, 59, 59, 35, 38, 38, 6,167, 78,157, 98,178,179,179,183, 2, 88, 14,211,166,208, 95,121,250,244,105, 96,243,230, -205, 15,206,159, 63,223,182,119,239,222, 66, 47, 47, 47,112, 28,135,135, 15, 31,226,216,177, 99,134,157, 59,119, 42, 75, 68,150, -169,206,203, 23,211,210,210, 62,232,215,175,223,222,177, 99,199, 90, 51, 12, 35,124,241,226, 5,116, 58, 29,140, 70, 35,146,146, -146, 12, 65, 65, 65, 69,106,181,122, 52,128,139, 38,240,133,230,231,231, 55,185,116,233,210,216,155, 55,111,126, 63, 97,194, 4, -199, 30, 61,122,136,104,154,198,141, 27, 55,178, 90,181,106,229,156,153,153,105, 56,122,244,104,142, 86,171, 93,200, 48,140, 73, - 75,240, 16, 4, 1,165, 82, 9, 39, 39, 39,232,116, 58,176, 44, 11,189, 94, 15, 43, 43,171,178,101,147, 56,142,131, 57,206,245, - 47,213, 1,202, 96, 48, 96,212,168, 81, 96, 89, 22,235,214,173, 3, 77,211,102,147,217,218,218, 62,120,244,232, 81, 96,203,150, - 45,203,196, 75,105, 29,146, 72, 36,112,114,114,130,163,163, 35,130,130,130, 32, 20, 10, 31,212,228,239, 86,130,199,217,217,217, -173, 46, 93,186,212, 62, 44, 44,236, 99, 0, 45, 13, 6,131, 7,195, 48, 4, 73,146, 10,142,227,158, 40,149,202, 95, 97,226, 18, - 60,153,153,153,223,143, 27, 55,174,213,190,125,251,172, 4,130,255, 61, 26, 2,129, 0, 18,137, 4,165,193, 49, 57,142,131, 94, -175,199,162, 69,139,148, 42,149,234,251,183,229, 45,209,186, 77, 59,108,223,188,222,234,242,159, 23,178,162,158,226, 88, 37, 33, - 28, 82, 50,210,183, 55, 75, 75, 78,182,106,221,166,157, 73,156, 70,189, 33,231,163,209, 95,122,151, 44,193,179,232,197,139,132, -109,123,247,252, 20, 15, 0, 63,254,188,174, 97, 70, 78,254,228,232,168,232,225,219,182, 29,104,111,212, 27,114, 76,225,252,159, -120,217, 91, 0, 14, 90, 0,119, 31,134,101,212, 29, 56,242,252,194, 6,245,108,222,207,204,209,164, 22, 21,169, 63, 7, 16,111, -106,222, 59,118,232,130, 63, 47,238,199, 31,187,247, 42, 57,150,210, 58, 57, 57,113, 0, 16, 21,229,196, 69, 69,229,115,255,243, - 43,182, 83, 9,185,199,203,191,252,188,199,151, 5,202,220,159,215,109,174,126, 40,165,121,139,119,209,188,197,187,152,254,249, -215,182, 77,154, 54,246, 6,128, 35, 71,192, 52,109, 16,121,122,201,226,101,239, 47, 95,190, 12,202, 66, 29,150, 47, 47, 94,174, - 39, 38, 60,242, 76,124, 60,244,124,155, 85, 17, 75,104,250, 46,190,252,178,161, 58, 55, 87,222,113,222, 60, 39,193, 87, 95,145, -213, 57,195,151,127,126, 77,225,188,255,228,201,153,201,159,126,154,186,116,201,146, 62, 91,183,109,179,104,214,172, 25,210,211, -211,209,184,113, 99,120,120,120,224,210,165, 75, 56,122,232,144, 42,191,176,112, 33,128, 45,166,112,238, 57,123, 54,166, 81,211, -166,217,219,182,109,115, 31, 48, 96, 0,161, 82,169, 80, 80, 80,128,130,130, 2,232,116, 58,148, 4,132,230, 98,159, 62,141, 50, - 26,141, 91, 77,205, 59,147,149, 37, 93,222,174, 93,138,136,101, 87,125, 48,116,232,156,229,223,126, 43,169, 87,175, 30,161,211, -233,202,172, 90, 6,131, 1, 86, 86, 86, 6,189, 94,239, 8, 64,109, 10,167,100,231, 78, 58, 43, 43, 11,114,185,188, 44, 92, 83, -249,184,132,133,133,133,224, 56,142, 15,166, 91, 11, 84,169,144,236,237,237, 31, 8, 4, 2,207,242,214,173,202,214,206, 43,127, -204,104, 52,166,100,103,103,183,126, 73,241, 86,229, 15,229, 11,224,135,238,221,187,127, 48,123,246,108, 34, 36, 36, 4, 39, 78, -156,224,226,227,227,143,148, 88,177,226,171,233,233, 84,197,105, 45,145, 72,102, 90, 90, 90,246, 44, 13,225, 32,147,201,194, 84, - 42, 85,112,201,112, 97, 97, 45, 56,109, 36, 18,201, 12, 75, 75,203, 94, 37,203,175,192,218,218,250,145, 74,165,186,164,211,233, -214,163,234,133,170,171,227,180,176,181,181,253,222,201,201,233,163,175,190,250,202,241,218,181,107,138, 63,255,252, 83,148,159, -159,191, 79,175,215, 87,183,168,244, 43,156, 14, 14, 14, 15, 40,138,242,252,139,202, 8,205,155, 55, 15, 26, 56,112,224,128,209, -163, 71,195,104, 52, 98,203,150, 45,184,116,233,210,153,103,207,158, 5,214,208, 27,125,153,211,201,211,211, 51,100,202,148, 41, - 62,163, 70,141,146,217,219,219, 67, 32, 16, 64,165, 82,225,217,179,103,120,248,240, 33,119,242,228,201,162,208,208,208, 20,181, - 90,221, 21, 64,182, 25,247,243,117,122,205, 21, 56, 5, 2, 65, 23, 47, 47,175, 3, 75,151, 46,181,238,213,171,151,133,163,163, - 35, 40,138,130,209,104,132, 66,161, 64,120,120, 56, 46, 92,184,160, 58,114,228,136, 42, 39, 39,103, 20,128,171,255, 68, 58,223, - 36,167,127, 67, 44,126,105,161,232, 42,163,189,215,112,110,141,233,236,222,197,109,208,240, 15,250,245, 5,128,195, 71,207,157, - 55, 97, 81,233, 42,211, 89, 83, 90, 77,225,108,220,128, 92, 26, 17, 25, 94, 33,160,101,211, 38, 1,177,254,205,134,126,103, 10, - 81,185,200,240, 21,242, 94,110, 56,182,188, 77,183,194, 48,171,191, 47, 2, 7, 13, 31, 50,224,235,133, 11,240,195,247, 43,112, -242,240,241, 51, 81,241, 21,150, 9,250,207,213,165,191,152,147,248, 78, 32,120, 87,230,230,214,121, 29,203, 46,120, 28, 30,110, - 85,190,195, 86,106,121, 46,223,169,116,119,119,207, 84, 40, 20, 46,166,112, 6,254,242,139, 65,109,105, 41, 89,176,106, 85,151, - 34,173,182,203,242,229,203, 5,247,239,223,199,230,141, 27,105,109, 74,202,222, 44, 96, 70, 21,163, 33, 85,114,250,204,152, 33, -157,187,121,243,120,223, 6, 13,156, 63,254,248, 99,161, 80, 40,132, 74,165, 66,114,114, 50, 46, 94,184,160,143,140,138,138, 84, - 42,149,239, 3, 72, 51,149, 51,240,151, 95, 12,118,190,190,144,201,229,220,229, 43, 87,108, 39,207,156, 57,165, 78,221,186,182, -125,250,246, 21,218,216,216, 32, 47, 47, 15, 47, 94,188,192,241,227,199, 51,139,138,138,220, 1, 48,166,112,238,189,121,179,249, -217,171, 87,135,125,247,221,119,226,128,128, 0,216,218,218,162,176,176, 16,225,225,225,184,122,245,170,110,235,214,173, 5, 5, - 5, 5, 83, 24,134, 57,245, 23,150,251,219, 96,213, 42,197,246,210,209,159,191,218,195,223,148,130,104, 13, 96,113,201,231,111, - 81,243,154,129,111,211,203,199,219,193,193, 97,187, 86,171,229, 52, 26,205,100, 0, 73,255,194,116, 10, 90,183,110,189, 57, 51, - 51,179, 61,199,113,176,181,181,189, 21, 17, 17, 49, 13, 85,204,188,169,129,147, 2,208,222,202,202,170,157,181,181,117, 23,157, - 78,231, 95, 50,252, 22,165, 82,169,174, 26, 12,134,187, 37,214, 39,230, 31,206, 59, 5,160,151,187,187,251,167, 44,203, 54, 32, - 8,194,142, 97, 24, 24,141,198,124,150,101,159, 21, 20, 20,236, 4,112,233, 95,144,206, 55,194,217,164, 62,134,112, 36,252,171, - 18, 4, 21,132,214, 75, 2,130, 96, 17, 21, 25,135,227,102,164,147,236,215,211,107, 19, 80, 60, 51, 17, 53, 59,215,254, 79,104, -153, 32, 94,204, 22,153,245,169,113, 28,193, 85,224, 36, 56, 34,169,113,243, 33,127,188,142,208, 50, 21, 77,252,208, 5, 28,218, -179, 28,238, 70, 63,195,159,111,241,187,238,141,113,254, 0, 56,108,180,183,191, 69, 10, 4,174, 0,200, 18,235, 11,203, 18, 4, -195, 17, 4, 93,126,120,235,165,142,101,181,156, 6,160,153, 80, 34,241, 98,104,218, 37, 29,176, 58,203, 48,239,104, 57,174,200, - 19, 88,252, 8,136,169, 77, 58, 13, 64, 51, 74, 34,241, 62,203,113,131,178, 44, 45,155,103,106, 52,114, 0,156,149,165,101,148, - 82,165,218,173,213,106, 55,225,213,145,139, 26, 57, 69, 18,137, 39, 67,211, 46, 0, 64, 10, 4,153, 7,117, 58,175, 20, 27,155, -143,181, 58,157,143,149,149,149, 81,175,215, 43,181, 90,237,104,154,166, 47,155,147,247,103, 52,221,228, 38, 73,118, 50, 88, 90, - 58, 26, 8,194, 82, 79,211, 6,189,193,144,172,213,106,195, 0,252, 4, 32,238, 47, 46,247,183, 10,166,132,147,122, 83, 15, 11, -207,201,115,242,156, 60, 39,207,201,115,242,156,127, 61,167, 12,128,119, 73,103,241,191,152,247,183,202,186, 85, 58,251, 95,192, -223, 11, 30, 60,120,240,224,193,227,173,128, 26,149,248,100,241,248,103, 65, 84,163, 74,205, 49, 9,214, 70,217, 6,243,156, 60, - 39,207,201,115,242,156, 60, 39,207,249,255,142,179, 38,238,255,226,144,228, 43,107, 29,114, 28,183,253,239,248, 99,222,252,203, -115,242,156, 60, 39,207,201,115,242,156, 60,231,255, 59,148, 14, 29,146,252,173,168, 18, 46, 37,219,155, 62,151,199,219, 93, 23, - 94,134, 71,201,102,206,249,110,252, 45,231,193,131, 7,143,183, 3,255,132,208, 50,181,209,122,157,198,237,117,133,207, 10,130, - 64, 26, 65, 32, 13,192,138, 55,120,110, 77,112,119,114,114,250,162, 73,147, 38,123, 93, 92, 92,166, 3,112, 54,243,250,134, 50, -153,108,189,165,165,101,136,165,165,101,136, 76, 38, 91, 15,160,225, 27, 42, 55, 2,192,100,137, 68,114,197,205,205, 45, 85, 44, - 22, 95, 1, 48, 5,181,159,185,218, 8,197,113,210,190, 5,208,220,156, 11,157,155, 14, 58, 36,111, 58,232,137,188,233,160,112, -199,128,129, 13,229, 77, 7,133,203,155, 14,122,226,220,116,208,161,191,160,190,190, 78,249,174, 32, 8, 36, 17, 4,146, 76,188, -246, 39, 2, 72, 38, 8,164,188,129,186,196,131, 7, 15, 30, 60,254,107,112,119,119,255,192,205,205, 45,216,205,205,237,146,187, -187,251, 7, 38, 92,210,179,146,134,135, 33, 8, 48, 53, 52, 36,213,157, 87,147,185,178,252,181,107, 76,204, 90,121, 78, 23,130, - 0,195,149,128, 32,192, 58, 59, 59,111,112,115,115, 91,241,242,230,236,236,188,129, 32,192,150, 59,151, 41, 39,240,204, 53,171, -186,140, 25, 51,230,112, 94, 94, 94,144, 94,175, 15,122,250,244,105, 80,215,174, 93, 15,190,100,221,168,146, 83, 42,149,126,216, -182, 93,251,208,171, 55,238, 62,141,125,150,144, 22, 25,243, 60,225,244,249,203,247, 3,154, 53,191, 39,149, 74, 63, 52,163,140, - 8, 0,147, 5, 2,193, 21, 43, 43,171, 20,129, 64,112, 5,192, 84,138,162, 78,173, 92,185, 50, 33, 34, 34, 34,227,230,205,155, -249, 87,175, 94, 77,157, 48, 97,194, 51,130, 32, 78, 87, 34,216,123, 86, 98,165,121,217,170,179, 36, 49, 49,241,188, 66,161,184, - 96, 97, 97,241,189, 9,231,151,113,202,155, 14,122,146, 89, 96,224, 50, 11, 12,156,188,233, 32,174,220,231, 39,102,222,243,154, -202,232,149,186, 32,145, 72,188,107, 16,244, 61,171,186, 22,128,107,201,111,173, 1,252, 82,178,149, 78, 61,119,149, 74, 36,111, -170, 46,189,137,188,243,156, 60, 39,207,201,115,254,221,156,255,101,180, 42,217,187,161,216, 95,203,173,182,179, 14, 63,123,250, -244,169, 21, 0,248,249,249, 77, 3,112,212, 28, 33, 65, 16,152,203,178, 28, 9, 0, 36, 73,204,235,214,173,123, 43, 11, 11,139, - 10, 81,144, 53, 26,141,248,202,149, 63,123,176, 44, 71,148,156, 55,151,227,176, 30, 64,134,169,255,161,215,235, 72,161, 80, 12, -146, 36,190, 12, 8,104, 86, 39, 59, 59,251, 26, 73,146,123, 83, 83, 83,243,204, 54,227, 16, 4,118,236,216,225,231,230,230,246, - 74,180,102,133, 66, 33, 30, 52,232,125,179,248,198, 1, 18,157, 68,210, 78, 68, 16,110, 12, 77,219, 1,128, 64, 32,200,187, 47, - 22,183,254,225,187,239,100, 4, 65,176, 57, 57, 57,208,104, 52,152, 53,107,150, 69,100,100,228,224,236,236,236, 77, 53,208,250, - 53,111,209,106,214,133, 11,231,253,149,185,121,218, 29, 63,111, 11,213, 8, 68,234,186, 77, 26,139, 54,111,223,109, 63,105,252, -232,207,163,163, 35, 30,161,242,229, 72,202,131, 4,112,124,230,204,153, 77, 3, 3, 3,197,133,133,133, 82,141, 70, 83,103,239, -222,189,139, 90,183,110,109,213,178,101, 75,241,129, 3, 7,136,130,130, 2,112, 28, 39,107,220,184, 49, 55, 98,196, 8,237,193, -131, 7,167, 3,216, 80,141,240,157, 91,124, 47,201,117,141, 26, 53, 90, 10, 0, 79,159, 62, 21,149,187,199, 66,127,127,127, 75, - 0,136,137,137,249,134,227,216,153, 0,192,113, 88, 13, 96, 65, 37,166,181,167, 77, 59, 14, 7, 8, 52,136,184,113, 88,218,180, -211,112, 45, 56, 60, 35,128,167, 37, 29,130,229, 64,185,184, 80, 21, 17,149,150,150, 86,171,181, 9, 7, 12, 8, 36, 8,130, 56, - 18, 26, 26,122, 52, 51, 51,179, 46,203, 50, 19,171, 75,231, 75,245,136,112,116,116, 28,151,157,157,189, 2,192,167, 81, 81, 81, -173, 0,192,223,223, 95, 4,224,129,141,141, 77, 7,131, 94, 79,240,239, 42, 30, 60,120,240,248,207, 10,173,135, 0, 6,224,127, - 75,240,108, 7, 96,182,208, 18, 3,192,181,107,215, 0, 64, 82,139,132, 16,229, 5,204,140, 25, 51,224,230,230,246,178,120, 65, - 72,200,149,215,201,108,133,255,248,246,219,111,173,242,243,243,123,254,250,235,175,157, 57,142, 91,147,150,150,118,167,134,235, - 51, 56, 14,171, 73,146,152, 71, 16, 4, 36, 18,105,236,148, 41, 83, 30,150,252, 86,231,244,233,211,178,129, 3, 7,170, 1, 36, - 0,128, 68, 34,245,160, 40,210,175, 88,185, 98,117,117,130,112, 24,224, 75,139,197,221, 39,255,242, 11,253,206,192,129, 2, 75, -185,156, 0,128,132,232,104,199,213, 63,254,216, 33, 47, 62, 94,172,113,116,204,201, 81,169, 52,177,177,177,144, 72, 36, 4, 69, - 81,239,212,148, 97, 75, 75,203, 47,190,251, 97,149,165, 50, 55, 95,163, 85, 22,234, 41,218,168,179,182,144, 49, 25,233,153, 57, - 86, 22,150,234,121,139,151,137, 63,155, 56,246, 11,149, 74, 53,173, 6,170,233, 95,126,249,165,127,219,182,109, 61, 14, 29, 58, - 68, 20, 20, 20, 64, 32, 16, 88,181,108,217, 18,173, 91,183,102,254,252,243, 79,162,110,221,186, 8, 8, 8,192,141, 27, 55,112, -235,214, 45,162, 85,171, 86,178, 99,199,142,141, 49, 26,141, 27,106, 18,215, 20, 69,206,106,220,184,113, 75, 75, 75, 75,189,159, -159, 31, 38, 78,156, 8,142,227,208,179,103,207, 0, 43, 43,171,163, 42,149, 74, 28, 19, 19,221,185, 38,145,157, 25,113,114, 68, -169,101, 11, 64, 51,112,120,150, 21,113,178,121,185, 83,252, 99, 98, 98,222,205,203,203, 43,115, 70, 44, 93,192,188,115,231,206, -230,212,165, 12,142,195,234,129, 3, 3,231, 1, 4,209,179,103,207,252,233,211,167,147,209,209,209, 31, 13, 25, 50, 56,224,233, -211,103,168, 38,157,229,235, 17, 49,110,220,248, 12, 43, 43,171,161, 71,142, 28,137, 81, 40, 20, 2,145,168, 76,103, 82,206,206, -206,114, 63, 63,191,169, 14, 14, 14,153, 20, 73, 58,115,224,184,154,234, 18, 15, 30, 60,120,240,248, 87,225, 76,137,184, 58,243, -242, 15, 2, 0, 8, 10, 10, 42, 11, 95, 26, 24, 24, 88,101,175,154,227,184,140,199,143, 31,123,169,213,106,112, 28,103, 74, 35, - 80,126,138,102, 6, 65,144,155, 73,146,152, 70, 16, 4, 2, 2,154, 61, 95,183,110, 93,101,107,122,233, 3, 2,154, 61,167, 40, -178, 30,199,113, 32, 8,114, 11,199,177, 25, 85,112, 86,218, 48,138,197,146,185, 0,224,234,234, 22,127,238,220, 57,253,176, 97, -195,240,227,143, 63,138,230,207,159, 63, 71, 32, 16, 76, 79, 74, 74, 74,175, 38,157, 0,176, 64, 46,119,150,237,216,177,195,111, -202,148, 41, 15, 21, 10,197, 2, 0,112,115,115, 91, 1,160, 9,128,132,114,199,176,117,235,193,212,137, 19, 39,198,102,102,102, - 46,168,138,115, 40, 80,223,171,113,227,238,203,175, 93,227, 72,157,142,200,190,126, 93,153,149,145, 97,140,203,202,146,237,122, -240, 32,112,209,138, 21, 66, 47,111,111,132,156, 58,229,148,173, 86,103, 21,232,116,218,140,140, 12,142,166,233, 91, 38,228,189, -169,179,220, 89,182,237,167, 45,247,173,133, 20,235,236,233, 65, 8, 29, 28, 4,164,204, 70, 76, 9, 72, 93,189, 58, 13,197, 0, -154,214, 84, 70, 34,145,104, 76,239,222,189,101, 7, 15, 30, 36, 2, 2, 2, 96,103,103,135,235,215,175,227,209,163, 71,200,203, -203, 35,141, 70, 35,218,180,105,131, 85,171, 86,193,219,219, 27,249,249,249, 72, 74, 74,114, 18,139,197,114,163,209, 88,213,253, -172, 80,159,230,206,157, 11, 55, 55, 55,208, 52,141,220,220, 92,208, 52, 13, 43, 43, 43, 0, 64, 74, 74, 10, 78,157, 58,105, 74, - 93,170, 17, 28,199,225,189,247,222, 43, 36, 8, 34,234,101,139,150, 57,156, 30, 30, 30, 7,178,178,178,251,117,239,222, 29,121, -121,121,198,101,203,150,161,121,243,230,240,243,243, 51, 37,157, 11, 68, 34,241,175, 62, 62, 62, 63,205,152, 49,195,205,193,193, - 1, 58,157,110, 81,122,122, 58,166, 78,157, 10, 0,232,223,191,127,115,161, 80,120,110,194,132, 9,168, 91,183,110,106,110,110, -110, 82,104,104,232, 68,181, 90, 29, 94,219,188,155, 8,158,147,231,228, 57,121,206,127, 21,167,169, 90,228, 95, 10, 69,169, 5, -171, 4,219, 43, 8,173,192,192, 64, 34, 40, 40,136, 51, 33, 99, 57,158,158,158, 94, 22, 22, 22, 0,144, 99,110, 42, 88,150,157, -238,232,232,152,185, 96,193,130,142,126,126,126,250,233,211,167,135, 39, 36, 36, 44, 44,127, 78,157, 58,117,190,223,184,113, 35, - 98, 99, 99, 19, 86,172, 88,113, 35, 39, 39,199,220,117,204,230,115, 28,214,149, 88,199,178, 79,157, 58,213,252,218,181,107,211, -126,254,249,103,249,103,159,125, 38,250,226,139, 47, 70, 3,248,177, 38, 18,138,162,212,149, 13, 23, 86, 6, 55, 55, 55, 61, 69, - 81, 85, 6,137, 11, 4, 44,164, 98,113,183,229,215,174,113,250,132, 4,245,111,107,215, 90,111,187,119,111,169,145,227, 92,156, -157,157,209,169, 67,135, 34, 41, 69,101,103,166,167,179,206,245,235, 83, 47,206,157,115,210,136,197,105, 7, 15, 30, 44,200,201, -201, 57, 81,163, 9,143, 32,148, 44,199,233,173, 60,189,141,195, 6,247, 10,184,127,247, 81,180,181,179, 19,217,170,101, 64,243, -232,216,132, 80,176,172,129, 32, 8,101, 77, 60,182,182,182,126, 57, 57, 57, 80, 42,149,144,203,229, 88,183,110, 29, 92, 93, 93, -161, 86,171, 17, 17, 17,193,121,122,122, 18,215,174, 93,131,167,167, 39,178,178,178,160,215,235, 81, 88, 88,152,169,211,233,170, - 90,155, 49,131, 36,169,223, 73,146, 24, 79, 16, 4,234,213,243, 77,220,180,105,147,158,101, 89,248,251,251, 99,200,144, 33, 56, -118,236, 24, 34, 34, 34, 74, 45, 79,122, 31,159, 58,137, 36, 73,248,148,104,165, 90, 91,117, 74,151,246, 73, 75, 75, 27, 90,203, -135,134,116,119,119, 31,221,160, 65,131,105, 31,126,248,161, 81, 44, 22, 67,165, 82,149,222, 11, 99,191,126,253,243, 7, 14, 12, -180, 61,115,230, 76,181,233,212,235,245,241, 5, 5, 5,159,126,249,229,151,123,183,110,221,106,191,112,225, 66,176, 44, 11,142, -227, 64,211,116,217,162,223, 44,203,226,248,241,227,136,139,139,251,254, 37,145,197,131, 7, 15, 30,255, 47, 96,134, 22,249, 55, -194, 13,197,195,134,120, 89,108,253,237,145,225, 41,138,218,118,241,226,197,150,157, 59,119, 22,244,232,209, 35,224,252,249,243, - 1,169,169,169,225, 37,214,131,128, 30, 61,122, 4, 56, 59, 59, 99,253,250,245,106,138,162,182,213,242,111,202, 26,189,244,244, -244,135, 0,214, 28, 59,118,108,245,228,201,147,225,234,234,218, 68,161, 80,252,173,121,182,145, 72, 90, 77, 88,183,142, 22, 26, -141,228, 47,107,214,216,172,189,114,101,245,161,195,135, 5,239,189,247, 30,193,113, 28,194,158, 60,177, 88,181, 97,131,108,212, -224,193, 9, 49,241,241,244,201, 11, 23,140, 25,169,169,185,169, 89, 89, 75, 0,228,214,196,111, 52, 26,111, 63,125,250,212,189, - 83,151,247, 60,174,222, 11,127, 52,108,112,255,238, 66, 1, 73, 60, 75, 72,121,224,230,234,100, 27,114, 37, 88, 99, 52, 26,111, -215,196,163, 82,169, 94,208, 52,237,192,113,156, 60, 36, 36, 4,114,185, 28,121,121,121, 48, 26,141,208,235,245,122,181, 90, 45, -205,201,201,129, 86,171,133, 78,167,131,141,141, 13,194,194,194, 50,104,154,254,179, 42, 78,134, 97, 38, 72, 36,146,111,133, 66, -161, 88, 36, 18,165, 61,120,240, 0, 74,165,178,142,157,157,221,143, 52, 77, 35, 45, 45, 13,215,174, 93,251,202,198,198, 38, 1, - 0,164, 82, 41,196, 98,137,163, 78,167,163, 1,164,214,246,158,191,206, 26, 83,174,174,174,222, 22, 22, 22,203,231,205,155,235, -223,162, 69, 75,100,101,101,129,101, 89, 88, 90, 90, 66,173, 86,195,198,198, 6,237,219,183,127,177,124,249,114, 5,199, 97, 82, - 77, 98, 48, 51, 51, 51, 75, 32, 16, 76,159, 60,121,242,183,126,126,126,245, 56,142, 67,195,134, 13,209,187,119,111,156, 59,119, - 14,177,177,177, 80,169, 84,204,157, 59,119,246, 43, 20,138,211,252,235,150, 7, 15, 30, 60,254,115,120,197, 55,171,130, 69,235, -239, 68,102,102,102, 86,116,116,244,249,208,208,208,192, 17, 35, 70, 32, 36, 36,100, 28,128, 47, 1, 64, 34,145,140, 27, 49, 98, - 4, 66, 67, 67, 17, 29, 29,125, 62, 51, 51, 51,235, 77,252,167, 88, 44,214,234,245,197,198, 41,169, 84, 42, 53,243,242, 58, 37, - 67,134, 0, 80,167,154, 99, 85,155, 70, 4, 2,183,102,125,251, 10,242, 30, 61, 82,238,184,123,247,219,189,123,247, 10, 58,118, -236, 72, 24, 13, 6, 48, 44, 11, 95, 95, 95,162, 71,207,158,150,191,239,221,235,192,168, 84,215,190,155, 55,239,250,246, 9, 19, -138,158,150,248,129,213, 4,157, 78,183, 97,218,212, 79,123, 94, 9,185,238,209,164,113,125,135,243, 23,175, 60,116,116,180,149, -249, 53,104, 96,153,147,151,203, 44,156,255,149, 64,167,211,253, 82, 19,143, 70,163, 57, 30, 28, 28, 60,216,203,203, 75, 30, 30, - 30, 14,189, 94, 15,134, 97,208,163, 71, 15,112, 28, 39, 1,192, 10, 4, 2, 68, 71, 71,195, 96, 48,100, 62,125,250, 52,237,217, -179,103, 18, 0, 43,107, 72, 95,162, 78,167, 67, 84, 84,241,168,157,167,167,103,175, 1, 3, 6,128,166,105,244,237,219, 23, 39, - 79,158,236, 21, 21, 21,181,182,188,230,123,221, 50, 47,177,144,249,187,187,187, 31, 43, 57,100,146, 19,188,135,135, 71,128,175, -175,239,214,149, 43, 87,138, 60, 61, 61,193,113, 28,236,237,237,160, 86,171,145,157,157,131, 38, 77,154,192,203,203, 11, 43, 87, -174, 4,128,253,166, 90,220,210,210,210,158,165,165,165,141,200,204,204, 20,229,231,231,183,238,213,171,215,250,158, 61,123,226, -225,195,135,184,126,253,250, 40,137, 68,146,105, 48, 24,104, 87, 87,215, 73, 4, 65,216, 24, 12,134,125, 57, 57, 57, 10,254,221, -197,131, 7, 15, 30,255, 9,148,250,104,161,220,222, 60,139,150,191,191,191,101, 66, 66,194,199,117,234,212, 17, 3,128,133,133, - 69, 19, 95, 95,223, 57,241,241,241,133,230,166, 70,173, 86, 31,218,187,119,111,239,159,126,250, 73,212,191,127,255,250,199,142, - 29,107, 11, 0,253,251,247,175,111,109,109,141,189,123,247, 26,212,106,245, 27,139,137,100, 52, 26, 59,183,105,211, 6,185,185, -185, 72, 72, 72, 48,107, 88,230,244,233,211, 50, 20,251,101, 85,123,172, 58,208,122,189,189,157,135, 7,153,122,229,138, 33, 87, -169,116,235,220,165, 11, 97, 52, 24, 64,146, 36,114,114,114,144,148,148, 4, 91, 59, 59, 34,250,233, 83,171,157,115,231,158,174, -211,162,133,152,209,235, 29,205, 72,166, 42, 59, 51, 99,252,231,211, 63, 59,190,111,223,126,121,190, 82, 25,103, 97, 33,211, 73, - 36, 34,215, 25,159,127,206,228,230,230,142, 5, 80,100, 2,207,202,125,251,246,245,237,219,183,239, 19,111,111,111,231,172,172, - 44,215,252,252,124, 38, 55, 55,151, 66,177,175, 21, 1, 0, 87,174, 92,129, 82,169,164, 25,134,185,134,226, 88, 88,122, 83, 19, -234,227,227, 99,219,186,117,235,174,114,185, 28, 5, 5, 5,112,116,116, 68,203,150, 45,187, 82, 20,245,107, 98, 98, 98,193,155, -172,245,151, 46, 93,178,230, 56,238, 93,142,227,208,183,111, 95,147,174, 97, 24,230,147, 1, 3, 6,136, 8,130,128, 70,163,134, - 84,106, 1, 75, 75, 43, 88, 91,219,192,207,175, 17,210,210,210,208,167, 79, 31,125, 92, 92,220,102,133, 66, 97,118, 29, 45, 40, - 40, 24,212,190,125,251,217, 83,167, 78, 5, 77,211, 24, 52,104, 16,146,147,147,215,190,120,241,226,160,187,187,251,232, 79, 62, -249, 68,238,232,232,136,217,179,103, 91, 0,248,134,127,119,241,224,193,131,199,127, 2, 47,251,104,189,106,209,170,110, 76,212, -213,213,181, 19, 65, 16,139, 52, 26,141,184,116, 72,134, 32, 8,177, 92, 46, 63,169,209,104, 86, 40, 20, 10,179,156,226,242,243, -243,149,207,159, 63, 63,121,251,246,237,225, 67,135, 14,197,165, 75,151,198, 2,192,208,161, 67,113,251,246,109, 60,127,254,252, -100,126,126,190,242, 77,228,220,195,195,163, 95,151, 46, 93,134,182,105,211, 6, 65, 65, 65, 96, 24,230,150, 57,215,151,159, 97, -136, 74,102, 29,150, 30, 51,137,140,162, 64, 16, 4,104,154, 6, 0,100,103,101, 33, 54, 38, 6,185,121,121,208,105,181, 80,169, -213,140, 95,221,186,154, 2,189, 94, 72, 0,230,142,125, 37,134,222,191,147,164, 86,169,156, 29,237, 29, 52, 50,153, 4,249,202, - 2,209,131,251,119,138, 0,196,153,200,161,231, 56,174,203,185,115,231,150, 80, 20, 53,194,202,202, 10,211,166, 77,163,186,118, -237, 10,145, 72, 4,157, 78,135,252,252,124,236,221,187, 55,139, 97,152,122, 37,215, 88,201,100,178,221, 20, 69,165, 20, 22, 22, - 46,170,241, 15,244,250,254,129,129,129, 2,189, 94,143,239,190,251, 14, 75,151, 46, 69,223,190,125, 5,247,239,223,239, 15, 96, -223,155,170,241, 44,203,162, 87,175, 94,229,157,225,163, 76,185, 78, 40, 20, 6, 52,104,208, 0, 89, 89, 89,200,202,202,130, 92, - 46,135,187,187, 59, 92, 93, 93,177,118,237, 90,110,253,250,245,231, 13, 6,195,230,236,236,236,140, 90,212,197, 73, 99,199,142, -157, 52,124,248,112, 20, 21, 21,225,246,237,219,232,208,161, 3, 86,175, 94,237,118,237,218,181, 47,219,180,105, 3,161, 80,136, -144,144, 16,208, 52,157,204,191,183,120,240,224,241,255, 13,255, 81,255,172,106, 81,173, 69,203,203,203,203,142, 97,152,175, 6, - 12, 24,208,107,240,224,193,232,211,167, 79,133,223,247,237,219,103,125,244,232,209, 21, 27, 54,108,232,107, 48, 24, 86,154, 51, -212,199,178,236,241,125,251,246,245,127,239,189,247,100,221,186,117,243, 5, 0,137, 68,162,223,183,111,159,154,101,217,227,181, -200, 75,105,112,199, 12, 0,112,119,119,111, 46, 16, 8,134,246,235,215,175,249,248,241,227, 17, 17, 17,129,189,123,247, 62,243, -243,243,187,145,145, 97, 86, 27,153, 80,195,172,195, 21, 53, 89,183, 40,177, 56, 39, 63, 61,221,206,202,219, 91,104,111,109,173, - 8, 10, 10,242,234,217,179, 39,145,156,156,140,188,188, 60,104,181, 90,220,191,127,159, 21, 0,137, 2,123,123, 34,241,246,109, -130, 18,139,115, 80,113, 38, 95,141,240,114,179,111,184,120,254,148, 58, 90,157,182,105, 65, 65, 1, 45, 16, 10,133,158,174,118, -201, 49,113,102,141,196,233,100, 50, 89,107, 0, 2,150,101,213, 14, 14, 14,178,139, 23, 47, 66, 44, 22,131, 32, 8, 52,107,214, - 12, 82,169, 84,196,113, 92, 18, 0, 88, 91, 91,139,183,109,219,102, 59,122,244,232,235, 53, 17,183,106,213, 74, 40,145, 72,222, -247,243,243,195,237,219,183, 17, 30, 30,158,120,251,246,109,159, 86,173, 90,193,219,219,251,125, 55, 55,183,195, 15, 31, 62, 52, -190,137,138, 93, 60, 99,213,124,103,120,134, 97, 88,130, 32, 64,146, 36, 88,150, 69, 86, 86, 22,234,213,171,135, 77,155, 54, 97, -221,186,117,223, 41, 20,138, 83,181, 73,143,191,191,191,168, 94,189,122, 99,135, 15, 31,142,248,248,120,172, 88,177, 34, 91,161, - 80, 92,185,112,225,194, 7, 83,167, 78,165, 58,116,232,128,156,156, 28,252,254,251,239,244,131, 7, 15,126, 75, 79, 79,223,195, -191,114,121,240,224,193,227, 45, 22, 90, 94, 94, 94,195, 69, 34,209,236,145, 35, 71, 82,141, 26, 53, 66, 70, 70, 6,108,108,108, -140, 4, 65, 8, 1,192,206,206,206,104, 97, 97,129, 41, 83,166,160, 69,139, 22,157,230,206,157,219, 65, 32, 16,108, 74, 75, 75, -219,109,202, 31,103,102,102,170, 73,146, 60, 50,109,218,180,149,143, 30, 61,172, 7, 0,247,238,221,123,158,150,150, 54, 63, 51, - 51, 83,109,102, 62, 74,131, 98, 18, 18,137,244,110,195,134, 13, 95,180,110,221,218,102,240,224,193,144,203,229, 8, 13, 13,197, -170, 85,171,158,234,245,250, 37, 87,175, 94,165,255,238,155, 76,235,116,233, 15, 78,156,176,238,250,209, 71, 54, 51, 6, 12, 88, -243,217,180,105, 63, 45, 94,188, 88,208,168, 81, 35, 66,173, 86,227,238,221,187,220,209,163, 71,141,191,127,251,237, 58, 88, 90, - 10,111, 31, 61, 42,214,235,245,137,102, 90, 75,186,116,236,220,169,209,154,159, 54, 64,171, 41,194,221, 91,103,144,151,151,133, -109,219,143, 53,242,240,224,186,164,166,166, 94, 53,149,139, 32, 8,191, 75,151, 46, 57,115, 28, 7,177, 88,140,229,203,151,195, -221,221, 29, 54, 54, 54, 40, 44, 44,196,151, 95,126,105, 59,115,230, 76, 91, 0,136,136,136, 40, 11,207, 80, 19,210,210,210,218, - 79,153, 50,197,154,166,105,156, 63,127, 94, 79, 16,196,162,224,224,224, 95,155, 53,107, 38,238,212,169,147,245,158, 61,123, 58, - 0, 8,121, 83, 66,171,150,215, 61,187,120,241, 98,155, 17, 35, 70,112, 66,161,144,200,207,207,135,157,157, 29, 54,109,218,164, - 82, 40, 20,103,106, 93, 7,104, 90, 44,147,201,196, 28,199,225,200,145, 35, 72, 76, 76,252, 36, 39, 39, 39,157, 97,152, 99, 95, -125,245,213,156, 70,141, 26,213,141,137,137, 73, 44, 44, 44, 92,157,153,153,249,130,127, 53,241,224,193,131,199,127, 10,165, 78, -240,165,179, 15,207,160,120, 56,177,106,161,197, 48,204,148, 11, 23, 46, 80, 44,203, 98,251,246,237,120,240,224, 1, 39,147,201, - 22,201,100,178,141, 22, 22, 22,140, 70,163,153, 60,113,226,196,209, 75,151, 46, 37, 59,117,234,132,219,183,111,147,245,234,213, - 27, 11,160,188,208,234,137,106, 98,109, 20, 20, 20,220,207,200, 72,175, 87, 46, 64,101, 61,137, 68,122,191,134,204,188,204,249, -114, 80,204,118,203,151, 47, 87,185,185,185,233,195,195,195,177,117,235, 86,246,193,131, 7, 87,196, 98,241, 54,133, 66,161, 51, -145,243, 77,160,140, 83, 76,211,161,127,204,153,227,255,206,160, 65,236,167,179,103, 23,137, 44, 44,190, 88,179, 97,195,220,252, -194, 66,119, 16, 4,231,104,107,155,184,125,249,242, 21,125,223,127,191, 40,226,234, 85,233,163, 75,151,132,114,163,241,177, 57, -233, 76, 77, 77,189, 26, 18,114, 29,187,118,252, 4,131, 65, 7, 69,106,177, 78,203,206, 41, 64, 13, 34,235, 21, 78,154,166, 11, - 62,248,224, 3, 17, 0,139, 49, 99,198,136, 51, 51, 51, 81,191,126,125, 0,128, 82,169,196,153, 51,103,208,184,113, 99, 0, 64, - 88, 88, 88,217,231,154,210,105,105,105,249,126,135, 14, 29,144,152,152,136,136,136,136,203, 10,133, 34, 7,192,229,228,228,228, -254,109,218,180,193,241,227,199, 7, 86, 35,180,204, 42, 35, 19,133,214, 43,156, 22, 22, 22,243,143, 29, 59,246,201,173, 91,183, - 70,204,153, 51, 71,216,163, 71, 15, 0, 64, 97, 97,161, 26, 0, 83, 27,206,242,105, 50, 26,141, 96, 89, 22, 14, 14, 14,170,156, -156, 28,100,102,102,190,200,204,204,156, 22, 23, 23, 87, 43,206, 55, 81, 63,121, 78,158,147,231,228, 57,255, 37,156,111, 3, 76, -143, 12,207,113, 28,205,178, 44, 66, 66, 66,112,236,216, 49,198, 96, 48, 76, 82, 40, 20, 97,229, 78,217, 16, 26, 26,122,233,131, - 15, 62,216, 29, 19, 19, 67, 69, 70, 70,130,227, 56,198,156,212,104,181, 90, 35, 65,188,122,236,117,115,185,107,215, 46,164,167, -167, 27,146,147,147,131,105,154, 62,254,154,179, 23, 95,123,214,225, 46, 64,247,161, 94, 31,188,180, 99,199, 94, 75, 46, 93,146, -124,250,245,215,186,113,227,199,127,197,232,245, 70, 74, 36, 98,197,150,150, 36, 35,145, 8, 35,174, 94,149,174,159, 58,213, 65, -163,211,157,223,107,134,131,121,169, 69,171,107,215, 78, 24,247,233, 44,104,202, 89,180,110,223,143,133,206, 0,179, 44, 90, 58, -157,174,169, 66,161,128, 84, 42, 77, 2,224,250,241,199, 31,131,101, 89,104, 52, 26, 20, 22, 22, 34, 45, 45,173, 96,252,248,241, - 76,137,120, 18, 12, 29, 58,212,198, 20, 94, 95, 95, 95,119,161, 80,136,243,231,207, 67, 40, 20,158, 1, 0,161, 80,120,230,210, -165, 75,253, 71,141, 26, 5, 15, 15, 15,223,248,248,120, 2, 53,248,167, 57, 55, 29,116,136, 3, 26,130, 64,131, 98, 19, 28, 26, -200,155, 14,122, 66, 0, 79, 75,162,198, 71,181,106,213, 10, 48,209, 47,171, 60, 74, 38,119,172, 51, 26,141,135,231,206,157, 59, -173, 93,187,118,189,151, 46, 93, 74, 0,160,222,196, 19, 72,211,244,107,133,158,224,193,131, 7, 15, 30,255,106,171,214, 43,168, - 82,104, 17, 4,177,189, 75,151, 46,147, 0, 80, 4, 65,108, 77, 75, 75, 11,123,249, 28,133, 66, 17,235,238,238,254, 99,221,186, -117, 39, 3,224, 8,130,216,110,102,162, 50, 56, 14,171, 72,146,152, 91, 44,238,106, 21,160,178,116,169,147,185, 0, 8,146,164, -118, 63,124,248,240,235,164,164,164, 44, 19, 45, 16,213,226, 77,204, 58, 4,128,253,192,139,145,137,137, 23,102, 7, 4,244,236, - 59,117, 42,154,247,237,107,227,238,227,195,104, 12, 6, 54,236,198, 13,226,214,145, 35,162, 71,151, 46, 9, 53, 58,221,249,227, - 64,146,185,233, 76, 77, 77,189,250,231,149,171, 23,135, 13,237,223,219,183,174,123,177,104,120,145,134,236,220,130,139,230,136, -172,151, 68,239,160, 77,155, 54,157, 18,137, 68,130,242, 75,217, 24, 12,134, 92,157, 78,215, 20, 0,242,242,242,220,183,111,223, -126,128, 36,201,196,154,248, 34, 35, 35, 79, 46, 89,178,100,104, 66, 66,194,197,228,228,228, 4, 0, 72, 74, 74, 74, 48, 26,141, -187, 21, 10,197,208,196,196,196,163, 48, 97, 18, 0, 7, 52,140,184,113,184, 25, 0, 52,237, 56, 28, 17, 55, 14, 75, 1, 52,107, -218,113, 56, 0,160,182,107, 25,150, 71, 73,104,133, 69,183,111,223,222,215,187,119,239,137,120,141,152, 94, 0,160,215,235,141, - 26,141,134,102, 24, 70, 96, 48, 24, 56,189, 94,111,228,223, 73, 60,120,240,224, 97, 58, 56,142,107, 3, 64, 94,242,181,212,128, - 34,127,233,179, 30, 37,203, 5,150,190,126, 75,190,103, 17, 4,113,191, 28, 71,217,113, 19,174, 5,128,108, 0, 79, 8,130,168, -202, 8,178,189,170,239, 85, 10,173,180,180,180,163, 48, 97,209,104, 83,207,171, 6, 11, 74,214,137, 3,106,191,182, 91, 25, 7, -195, 48, 25, 73, 73, 73,175, 93,160, 36, 73,190, 24, 56,112,160, 89,231,215,116,206, 65, 32,241,115,157,110, 79,208, 47,191,180, - 60,191,117,171, 7, 67,211,142, 4,192, 81, 98,113,142, 94,175, 79,144, 27,141,143,205,181,100, 85,176,198, 60, 79,237, 19,255, - 60, 21, 13, 26, 52,224,158, 61,123, 86,108,235,121, 61, 60, 86,169, 84, 94, 53, 85, 1,181, 90,221,201, 68, 49,184, 63, 53, 53, -117,127, 37,130,253,128, 66,161, 56, 96,106,162,202, 22,149, 6, 72,150, 96,135, 53,237, 56,252, 8, 0,182,116, 81,233, 55,137, -244,244,244, 24,148,196,121,123, 29, 36, 38, 38,234, 8,130,248, 99,213,170, 85, 99, 30, 61,122,116, 48, 45, 45, 77,199,191, 54, -121,240,224,193,195, 60,145, 69, 16, 68, 80,201,247,192, 18,163, 80,208,203,159, 75,207, 41, 61,175,252, 57,165, 28, 47, 31,175, -238, 90, 0,152, 63,127,254,215, 43, 86,172,144, 1, 48,117, 49,230, 90, 47, 42,253, 87, 33,227, 95,194, 81, 94, 20,236,248, 43, - 50,250, 11,160, 7, 77,223, 1, 93,206, 39,223,248,102,141, 27,207,158, 61, 35,222,230, 7,174,116, 81,233,114, 8,248, 47,164, - 59, 33, 33, 97,147,183,183,247,182,180,180, 52, 26, 60,120,240,224,193,195, 28,200, 43, 19, 70, 85,136,178,192,234,126,175,208, -113,175,228,188,202,190, 19, 4, 17,180, 98,197,138, 64, 51,210, 91,102,209, 34,249,178,227,193,227,239,195, 63, 49,235,149, 7, - 15, 30, 60,120, 84,142,151,173, 88,165,226,235,229,239,243,231,207,255, 26,213,143, 56,185,161,216,138,229, 86,242,189,204, 95, -139, 64,241,204,129,202, 96,206,108,130,158,181,200, 95, 48,207,201,115,242,156, 60, 39,207,201,115,242,156,255,239, 56,107,226, - 14,174, 68, 16, 13,168,106,168,175,186, 97,196,151, 63,215,116,109, 77,231, 18, 4, 81, 85,152,159,210,161,194,178, 61,199,113, -219,241, 55,160, 39,207,201,115,242,156, 60, 39,207,201,115,242,156, 60,231,235,128,227,184, 54, 28,199, 13, 64,241,132, 41,142, -227,184, 1, 28,199,245,157, 63,127,254,130,210, 99,243,231,207, 95,192,113, 92,143,210,243, 74,206, 41,187,166,244,216,203,251, -151,143, 85,119,110, 53, 73,156,244,210,231, 73,165,147,200,254, 45, 62, 90, 60,120,240,224,193,131, 7, 15, 30,149,162,116,198, - 96, 57,107, 83, 22,128,176, 21, 43, 86,228,149,243,157,202, 2,240, 24, 64,139,146,243,178, 74, 68, 90,121,223, 42,125,201,119, -125, 37,231,232, 77, 57,183, 10,108,175,226, 51, 47,180,170, 66, 11, 87,242, 91,111, 79,231,214, 37, 5, 0,142,101, 1, 0,108, - 73, 12, 36,174, 52, 24, 18,203,130,227, 56,164,101,230,135,134,101, 98,113,109,255,207,207, 29, 14,206, 82,233, 58,150,227, 58, -150, 28,186, 90,144,163,155, 21,161, 68,190,169, 28,141, 93,224, 47, 37,241, 21,203,161, 57, 0,144, 4,158,104, 89,252, 24,157, - 97,126, 60,169,202,234,121, 83, 57, 38,137, 45,100, 35,109,237,236, 27,228,229,101, 63, 53,104,117,135, 35,179,176, 13,230,175, -203, 8, 95,123,188,203,114,248, 26, 0, 41, 36,177,246,105,174,201, 51, 57,120,240,224,193,227,117,173, 35,175, 21, 23,143, 32, - 8,166, 18, 78,226, 53, 57,249, 0,123, 38,136,173, 74, 14,223,171,228,216,253,127, 83,186,205, 18, 90, 77,228,152, 10, 2,203, - 0,112,224,240, 77,100, 22,182,152,117,189, 27,122, 74, 41,106, 39, 0, 74,107, 96,102,115, 44,174, 85,122, 51, 73,116,150,138, -168,181, 0, 88, 45,195, 76,136, 84,152,238, 47,214,212, 3,125, 5, 44,249, 7,203,113, 66,134,229,118,131, 67,144,149, 8, 55, -239,164, 66,107, 78, 90,189, 61,157, 91,159,184,167,232,125,101,203, 12,180,107, 94, 31, 28, 67, 3,172, 17,178, 78, 95,225,242, -207, 31,163,157,191, 55, 56,214, 8,176, 52,172,250,173, 65,191, 0, 91, 46, 44,179,118,235, 96,251,185,195,193,199,201, 57,124, -199,142,157,174,238,190, 77, 8,150, 54, 32,230,222,197,209, 51,231, 46,233,222, 20, 5, 1,166,136,173,230,110,248,212,187, 78, -163,175,102, 45,251,137,114,115,247,178,100,141, 58, 58,253, 69, 84,171, 13,171,151, 28, 21,145,137,107,159, 40,176,211,212,186, -220, 68,142,201, 2,137,120,184,133,212,178,129, 90, 93,248,140, 49, 24, 15,147, 66, 65,223, 31,215,172,107,217,181, 87,127, 43, -166, 48,157, 52,178,104,114,232,224, 1,159, 95, 54,109,238, 31,174, 96,222, 7,192,154,147,103,150,195,220,216, 61,147,250, 11, - 5, 20,225,255,201, 14, 10,160,107, 37,180,252,157,241, 33,193,161,198,240, 18, 28,129,235, 81,153,216, 95,155,255,104,236,140, - 95, 9, 14,126, 32,112,132,224,112, 32, 50, 11,153,252, 43,143, 7,143,183, 11, 36, 73, 94, 97, 89,182,219, 27, 22, 6,239,114, - 28,119,135,191,187,255,191, 97,158, 69,139,192,119, 17,113,201,246, 96, 12,104,234,231,251, 45, 96,158,208,146, 82,212,238,251, - 79, 51, 92, 65, 27,176,227,251,105, 7,245, 70,128, 54, 26,192,208, 70, 48,180, 17, 52,109, 0, 99, 52,130, 51,234,176,228,183, - 43,128,190, 16,173, 3, 26,238, 6, 24, 55, 83,255, 67,200,145,127,132,222,184,232, 64,232, 11,176,127,203,138,207,147,179,138, - 62, 15,126,146,150,221,196, 89,179, 32, 50, 19,191,155, 35, 8,174,108,157,129,189,199,207,164,172,255, 85, 21,205,114, 28, 28, -108, 44, 26,141, 14,140,240,218,115,242, 74,242,186,221,218,104, 0,176,181, 20, 55, 26,251,228,169,247,235, 20,130,179, 84,186, -110,219,230, 95, 92,221, 28, 45, 8,250,214, 74,208, 12, 3, 47,159, 1,212,130,233,163,221,190,251,121,231,207, 80,234,198, 85, -119,125, 35,103, 52,169, 83,215,127,246,238, 51,183,188, 85,202, 76,253,197,125, 95,199, 65, 7,163,171,135,191,240,219, 21, 63, - 81, 11,231,205,248, 82,207,164,220,141,201, 68,100, 77,239, 26,127,103,156, 92,177,114, 77,243,238,253, 2,173,216,162, 44, 74, -171, 42,242,219,241,219,206,101,141,155,183,149,117, 10,240, 20,101, 30,158, 66,104, 10,115, 97, 32,165,146,238, 77,123,218,104, -198,140, 50,238,216,181,119,122,100, 38, 54,152,147,103,166,220,176, 53,203,214, 62,234, 58,193,161,211,163, 59, 87, 38, 51,105, -247,193, 49, 70,128, 49,148,237,193, 24,193,177,197,251,118, 83,126, 3, 80, 59,161, 69,114,232, 29,124,227,190, 91, 70,186,162, -205,207,107,126, 88,192,221,191,127, 14, 12,254,136,202,197, 85,115, 5, 38, 15, 30, 60,254,213, 22, 19,154,227, 56,193, 27,230, -236,207,113,220,217,215,164,249, 10,192,167, 37,159,119, 2,248,241, 13, 36,205, 19,128,107,201,231,116, 0, 41,124, 13,120, 45, -148,197,205,122,249,187,185, 21, 74, 10,142, 5,142, 12, 6, 0, 11,115, 83,193, 1, 82, 16, 20, 96, 84, 97, 80,191, 94,112,114, -118, 5,140,106,192,160, 6,140, 26,192,168, 2,140, 26,100, 43, 18, 1,131, 10,136, 63, 7,154,227, 36,102,103, 87, 87, 0,196, - 30, 70,143, 86,222,144,219, 74, 49, 99, 80, 19,167,237,231, 99,119,238,188, 24,211, 51, 50, 19, 35, 77, 74, 43,199,161, 93,179, - 6, 88,191, 83, 21,125,250, 97, 86, 31, 0,232,223,194,241,124,187, 38, 62, 94,235,118,107,163,207,134,229,245, 5,128,190, 77, -109,206,181,109,228,230,205,162,246, 86, 95,150,227, 58,185,215,105, 64, 48,143,182,129, 85,166, 64,169,212, 32,229,197, 30,216, -123,188, 67, 50, 44,186,212,116,189, 5,133,249, 95, 44, 92, 37, 84, 43, 51,244,172, 33,139,145, 83,121,148, 64,204, 18, 72,189, -170, 43, 98,243,153, 89,147, 62,166,103, 47,254,126, 62,128,209,213,241, 52,113,198,244,181,107,215, 53,235,208,186,177,115,250, -209, 25, 68, 81, 94, 6,104, 74, 38, 25,244, 94, 7,216, 53,108,194,102,132,172, 37,196,190, 61, 97,231,232,139,212, 91,251,144, -112,231, 24,209,177,213, 80,201,239,251, 69, 99, 0, 67,165, 66,171,129, 19, 58,246,233,220,246,160,175,183,187, 27,199,177, 96, - 89, 14, 28,203,160, 72,107,196,130, 67,241, 96, 24, 6, 31,244,233,216,195, 82, 76,112, 44,203,130,227, 88, 36,167,231,168,255, -188, 27,221, 35, 62, 15,119, 77,177, 84,181,120,183, 91,199, 39,161,119, 26, 27, 99, 79,163,245,232, 21,209, 4,112,163, 92,157, -235,248,240,194,239,141,129,223,106,175,229, 8, 48, 9,231, 87,194,187,243, 36,106,219,254,243,242,130,172,212,177, 71,247,108, - 30,182,101,219,182,189,209,153,152,194,191, 95,120,240,120, 59,192,113,220, 27, 23, 91,137,137,137,105,175, 35,182, 60, 60, 60, - 58,167,166,166,174, 46,245, 86, 33, 8, 98,117,157, 58,117,150,252,175,163, 90,161,175, 87,192, 48,204,232,212,212,212,107,213, -113, 14, 24, 48,192,253,204,153, 51,117,203,113,214, 5, 80,183,178,115,237,236,236,152,246,237,219, 39,156, 57,115, 38,141,175, - 33,181, 18, 92,102, 11,173,232,164,195, 51, 90,233, 20, 69, 0, 16,109,194,249, 21,134,252,180, 70,102,229,174,101, 31,175,108, - 90,199, 1,133, 42, 61, 46, 62, 72, 0,195, 24,193,208,116,137,101,139, 6, 67, 27,209,167,133, 19,218,107,167, 96, 67, 80, 12, -104,134, 93, 81, 29,231,203, 48,112,236,135, 45,123,142, 56,196,178,156, 88, 34, 36, 11,252,188, 28,157,103,127,208,130,156, 49, -168, 41, 52, 6,122,196,190,144,184, 63,163, 50,177,195, 36, 78,246,213,144, 71, 92,101,199, 24,186,198,188, 87, 99,141,106,215, -179,107, 39, 27, 78, 87, 0, 99,118, 60, 10,213, 70,196,231, 24,145,174,205,135,132, 80,152,196,201,114,104,238,233,225, 38,187, -121,112,222, 11, 71, 74, 41,112,166,104,145,152,164,193,176, 28,197,229, 71,234, 28, 26,247, 18,150,250,109, 85,151, 78, 11,153, -245,199,157,123, 15,176, 77,218, 55,137,176,240,235, 3,231, 86, 94,120,113,109, 23, 50, 31, 4, 33, 39, 45,129,176,209,230,195, -197,177, 62,250,141, 30,137, 31, 71,182, 65,161,178, 16,148, 34,206, 86, 44,148,216, 1,134, 74, 57, 57, 6,163,215,174,250,222, - 77, 64,145,197,247,179,116, 99,140,208,232,116, 0, 67, 67, 42, 96, 65,112,165,191, 25,193, 24, 13,178,230, 67,231, 77, 3,152, -187, 53,229, 61, 42, 19,251,155,200,209, 9,172,177, 49,103,212,128, 0,110, 68,102,253, 79,252,248, 59,227,195,119,250,140,239, -196, 17,184, 94,155, 50, 10,112, 68, 96,235,186, 86,150,150,202,104,164, 28,249, 28,113,144,114, 46, 29, 62,197,135,159, 76,151, -109,223,190,125, 32,192, 77, 69, 69, 31,181,191, 98,145, 85,158,147,231,252, 79,114,218,216,216,212,171, 83,167,206, 18,163,209, -216, 89, 36, 18,185, 24, 12, 6,176, 44,155, 46, 22,139,175, 39, 36, 36, 44, 87, 42,149,207,255,109,121,127,242,228,137, 57, 98, -171, 70, 78,161, 80,136,152,152,152,103,102,136,173,224,151,174,255,227,198,141, 27, 56,116,232, 16, 0, 32, 54, 54, 22, 13, 27, - 54,180,172,236,194, 23, 47, 94, 88,118,237,218,245, 15, 0, 94,213,113,134,133,133,213, 59,125,250, 52,142, 28, 57, 2, 0,136, -137,137,129,159,159, 95,165,137,185,113,227, 6,245,209, 71, 31,213, 3,144,246, 55,148,209,219, 32,178,202,239,255, 39,180,130, -130,130,184,192,192, 64,226,229,207,149, 32,222,219, 94,220, 10, 90, 6, 0,226,205, 77, 65, 84, 6, 86,173,223,115,161,239,229, - 35,155, 58, 75, 69, 36,150,238,152,157,156,149, 91,248,174,128, 40, 30,126,161, 57,144,246, 86,226,219, 43,198,182,240,206, 43, -210,226,212,189,212,107,145,153,230,153, 72, 35, 21,184, 4,176,118,197,223, 24,104, 53,153,126, 99,127,188,116,224,192,252,190, -205,103, 13,106,142,147,183, 18,102, 1,116,141, 81,223, 57,150, 5,199,210,101,206,239, 37, 93, 7,128,173,184, 40, 48, 11,174, -248, 24,107,158, 69,171, 11, 32,200,115, 70, 63,107,153,120,227,228,201, 19,109,140, 89, 79,145,171, 23, 33, 57, 79,139,116,141, - 16, 69, 2,103,164, 70,135, 49, 36,129, 75, 53,154, 92, 8, 40, 57, 90,107,103, 47,182, 34, 3,122, 77,243, 80,158,255, 58, 79, - 76,208,148,205,144,239,236,178, 47,255,148, 64,171,178, 84, 4,129, 26,195,207,219,218,218, 53,212,230, 36, 80, 5,121,217,176, -115,109,138,190, 35, 2,241,205,128, 38, 40, 84,170,144,149,123,155,107,224,102, 67, 36, 94,223,139,133,253,252,145,147,161,128, -206, 8, 16, 42, 93,174, 86,175, 45,170,242, 62,146,216, 54,115,206,220, 15,125,220,228,150,165,147, 10, 56,150, 65, 11,127, 95, -244,234,220, 14,151,110,220,196,253,176, 88,176, 37,147, 10, 56,150, 69, 74,102, 94,134,214,192,236, 50,235,134, 50, 52, 56,163, -182, 82, 33,134, 90, 12, 25, 6, 56, 67,198, 0,139,219,212,179,158, 48, 63,208,199,218, 82, 66, 64,107,100,160,213, 27, 81,120, -115, 35, 28,235, 52,131, 76, 42, 37, 90, 65, 35,120, 8,240,235, 22,242,224, 81, 14,195,134, 13,147,102,100,100,132,120,121,121, - 53,233,213,171,151,172, 83,167, 78, 80,169, 84,184,120,241, 34, 84, 42,149,143,151,151,151,207,197,139, 23,135, 38, 37, 37, 69, -122,122,122,118, 61,114,228,136,201, 62,180, 37, 2,136, 42,123, 5, 3, 52, 65, 16, 40, 57, 70,148, 28,171,245, 58,183, 98,177, - 24,137,137,137,111,220,178,149,154,154,250,172, 54,150,173,162,162, 34,145,135,135, 7,228,114, 57, 24,134,129, 74,165,194,137, - 19, 39, 80, 80, 80, 0,150,101, 97, 97, 97,129,239,214,238, 64,244,195, 16,220,189,123, 23, 5, 5, 5,162,154, 56, 83, 82, 82, -136, 22, 45, 90, 64,167,211,129,166,105,104,181, 90, 4, 7, 7,151,125, 23, 8, 4,152,251,237,207,136,125, 16,130, 71,143, 30, - 33, 37, 37,229,111, 89,109,196, 12, 45,242,111, 68,149, 49,179,254,246, 89,135, 12, 67, 47,216,190,251,192,237, 5, 83, 70, 98, -250,168,158, 94,203, 55, 29,235, 25,149,141,221, 0,224,239,132,177, 99,186, 53,240,182,147, 9,241,205,190, 7, 0,199, 45,120, -221,255,139,200, 69,108, 19, 23,118,214,241,187,137, 33, 95,143,108, 5, 95, 55,155,134,121,226, 92,113,124,188, 9,107, 10,178, - 52,236,173, 36,141,250,183,112, 60, 15,150,133,157,181,164, 49, 24, 26,118, 86,146, 70,125,155,218,156, 3, 0, 27,153,176,113, -101,150,175,170,208,218, 75, 56, 73, 38, 17, 76,178,180,182,243, 30, 55,176,151, 69,255,129, 67, 45,172,132, 52,114,238, 94,132, - 82,232, 9,163,131, 15,116,198, 92,164, 60,143, 99, 46,223,137, 74,205, 46,212,205,174, 49,153, 28,174,165, 62,143,145,215,107, -222,203, 62, 59,104, 97,102,189,241,251,234,146, 96,201,194,189, 67, 50, 44,157,219, 90,220,139,127, 94,196,114,149, 90,116, 42, - 64, 89, 80,144, 96,100,224,166, 97, 4,214,113, 87,126,199,252,126,205,144,151,155, 9,173,129, 70,129,134, 54,184,218, 73, 37, -186,231,225,208, 25,104,232,141, 44,132,118, 30,184,120, 59, 44,155, 53, 26,207, 85,197, 25,159,131, 71,241, 39, 30, 89,149, 63, -230,235,132, 22,243,108, 44, 30,193,168, 65, 98, 74, 26,118,159,185,221, 42, 62, 7,143, 94,167,156, 57,150, 46, 30,126, 46,103, -201, 34, 56,116,170,141, 19,124, 99,103,180, 21, 73, 69,191,172,158,245, 81,147,247,252, 28, 36,108,202,109, 16,172, 1,150,140, - 0, 26, 49, 3, 91, 47, 95,176,250, 66, 78,173,213,230, 71, 0,124,164,119, 30, 60,202,161, 81,163, 70,174,169,169,169, 17,115, -230,204,113, 24, 50,100, 8,142, 31, 63, 14,165, 82,137, 93,187,118, 97,221,186,117, 88,182,108, 25,140, 70, 35,182,111,223, 46, - 59,122,244,104,219,205,155, 55,167,120,123,123, 55, 77, 74, 74, 74,175, 65, 96, 17, 0, 36, 0,132, 37,109, 23, 1,128, 61,123, -246, 44,250,247,239,143,179,103,207,178, 37,199, 24, 20,119,126,106,181,158,168, 88, 44,134, 88, 44, 70, 65, 65,193, 27, 17, 91, - 66,161, 16, 86, 86, 86, 16,139,197, 40, 44, 44, 52, 91,108,209, 52, 77,165,164,164,160,160,160, 0,189, 6, 14,196,207, 43, 86, -160, 91,183,110,232,213,171, 23, 56,142, 67,112,112, 48,122,118, 8,192,200,247,187, 34, 42, 42, 10, 52, 77,155,148,222,244,244, -116,100,100,100,160,239,192,129,216,177,121, 51,218,181,107,135, 70,141, 26,129,166,105,132,132,132, 96, 88,159, 14,144, 14,238, -137,216,216, 88,190, 82,155,110,205,122, 35, 62, 90,175,141,136, 44,220, 97, 79, 94, 13, 26,213,167,109,224,192,142, 77,176,227, -224,229,239, 33, 87, 30, 0, 0, 71,157,228,187,143,187,249, 34, 50, 41, 15,151, 31,165, 5, 69,101,227,141,204,214, 96, 25, 56, - 57,218,200, 0, 74, 12,141,129,165,109,226,107,118, 96,102, 57, 14,178,206,243, 48,102, 96,164, 87,187, 38, 94, 94,165,179, 14, -173,250,255,132,177, 97,207,188,219, 52,114,245, 6, 99, 4, 24, 35,108, 70,238, 3,190,181,172, 49, 29, 29,234,138, 47,205,156, - 49,163,125,191,193, 35, 44,196, 50, 91, 48,202,100, 24,211,195,144,243,244, 26, 84,178,134, 72, 79,140,199,161, 11,119, 11,158, -166,228, 40, 73, 18, 23, 51, 10,116, 95,197,231,161,168, 38, 94,173, 17, 43,150, 44,156, 61,224,208,129,131,214, 18,223,142, 68, -220,198,254, 5, 98, 1, 45,145,215,125,135, 84, 75,157,184, 31,118, 29,180, 81,233,177,178, 38, 30,181, 74,121, 44,248,226,249, -145, 13,234,117,180,126,113,255, 12, 52, 90, 29,116, 70,160,105,219,174, 96, 24, 78, 76,144, 4,107, 67, 81, 68,102, 78, 30, 8, - 35,147,113,253,241, 11,197,141,199,241,148,206, 26, 43,171,141, 46,242,178,186, 39,168, 47, 6,118,109, 9, 24, 53,120,191,115, - 51,252,188,247,242,231, 0, 51,254,245, 10,185,216,162,197, 1, 29,155,200,177,149,227,208,241,193,137,117,141, 91, 15,158, 9, -115, 44, 90, 77,157,208,207,191,158,251,239, 63,127, 55,207,193,209,179, 33, 69,176, 70,112,174,205, 1,101, 10, 71,164,220,134, -173, 71, 59, 48,238, 29,176,125,195,154, 34,150,229, 14, 0,224,167,100,243,224, 81,254,125,164,213, 30, 91,181,106,149, 67, 96, - 96, 96,169, 69, 6,183,111,223,198,206,157, 59, 97,105, 89,241, 61,217,191,127,127,112, 28,231,176,116,233,210, 99, 0,222,171, -138,179,125,251,246, 3, 31, 61,122,148,214,178,101,203,248, 18,177, 37, 2, 64,134,135,135,147,201,201,201,132,189,189, 61,231, -238,238,110, 76, 75, 75, 99, 1, 48,159,124,242, 9,117,248,240,225, 6, 42,149,234,106,109,133,150, 88, 44,126, 35, 62, 91, 66, -161, 16, 4, 65, 64, 44, 22, 67, 36, 18,129,227, 56,179,196, 22,195, 48,130,179,103,207,226,193,131, 7, 88,214,178, 37,102,121, -120,192,193,193, 1, 33, 33, 33,224, 56, 14,150,150,150,200,205,205,197,129, 3, 7,208,189,123,119,208, 52, 45, 50,133,247,200, -145, 35, 8, 13, 13,197,183,173, 91, 99,150,173, 45,172,172,172, 16, 28, 92, 60, 26, 40,145, 72,144,152,152,136,224,224, 96,116, -237,218,149,175,212,175, 9,147, 43, 79, 23, 64,144, 75,192,213,160,215,128,163, 57,128,128,187,191, 63, 68, 81, 81, 21,157,115, - 76, 1, 73, 98,225,134,221, 65, 3,126,154, 57,144,152, 52,168,149,251,242,223,175, 76, 5,128, 9, 31,248,121,200, 36, 2,172, - 63, 25,201,145, 36, 22,190,137, 12,250,251, 67, 68,228, 96,106,175,118,141,144,150,175, 71, 92, 90,254,159, 81, 38, 14,245, 92, -254,105, 12,246,156, 10, 73, 94,183, 71, 27,205,113, 28,236,172, 36,141,198, 62,137,243,254,253,108,104,210,218, 67,218,104,142, -229, 96, 39, 19, 54, 30, 31,213,161,198, 89,135,173,189,132,147,190,156, 61,187,195,160,241,115,164,116,244, 97,232,227, 46,128, - 53,104,160, 52,136,144, 79,185, 34, 37, 41, 9, 63,108, 15, 74, 86,170,244, 35, 35,178,204, 19,152, 79,115, 80, 36, 32,148, 67, -126,248,230,235, 75, 43,190, 91,106,165,137, 15, 41,162, 8, 90, 67,213,233, 34,248,110,217, 79, 68,161, 78, 63, 34, 62, 15,133, - 53,241,232,172,177,114,213,218, 13, 3, 38,142, 30, 26,237,215,176,139, 35,147,246,220, 81,171, 84,102,238, 59, 31,234, 90,210, - 83, 36, 0, 32, 46, 37, 7, 89, 5, 42,154,161,141, 87,173,133, 88, 30,105,138,117,176, 4,245,156, 33, 15,236,216,244, 35,185, -181, 8,154,162,124, 56, 91, 11,209,167, 93,253,143,140,247, 98,231, 61,207, 52, 71,174,189, 44,180,140,224,140, 26,220, 89,217, -189, 49,199, 24, 27,131, 49,194,240,228, 15,243, 45, 99, 4,102, 77,239,108,101, 99,175,127, 65, 66,101, 9, 88, 56,129,176,241, - 1,108,235, 18, 66,255, 17, 72,139,143,160, 63,255,104,116,206,243,132,148, 95,157, 44,222,200,204, 31, 30, 60,222, 42, 36, 38, - 38,126,188, 96,193,130, 27,237,218,181,115,113,114,114, 66,179,102,205,112,234,212, 41,204,153, 51,167,236,156,150, 45, 91,130, -227, 56,228,230,230, 98,213,170, 85,233,105,105,105, 31, 87,219, 65,143,136,136,222,179,103, 79,231, 38, 77,154, 24, 68, 34, 81, - 62, 0, 73,126,126,190, 52, 55, 55,151,208,106,181, 96, 89,150,181,181,181,101,210,210,210,140, 35, 71,142,212,221,186,117,171, -190, 74,165, 74,124, 29,139,150,151,151, 87,120, 78, 78, 78, 1, 65, 16,175, 29,250,161, 84,100, 57, 57, 57,201,139,138,138, 88, - 0,121,181, 9,253, 64,211, 52, 90,183,110,141, 11,215, 30,226,236,229, 91, 80,166,197, 96,234,196,143,209,172, 89, 51, 92,184, -112,161,214,101,214,162, 69, 11,156, 15,190,129, 27, 15, 30, 35, 49,246, 9, 62,159, 58, 17, 77,155, 54,197,249,243,231,249, 10, -109, 58,206,160,162,111,214,153,151,133, 86,215,160,160,160,210,158,249, 43,242,181,177, 19, 90, 8,237,196,127, 44,237, 87,223, - 95,216,107, 41, 8,161, 5, 14, 55, 60,223, 97,225, 15, 27,163, 41,231,196,209,225,153, 53,207, 14,171,240,208,100, 34,130,187, - 27,189,255,113, 84,227,143,222,111,231,133, 29,167,100,139, 1, 96, 68,167,122,184,247, 52, 11,119, 99, 51,247, 71,102, 33,226, -117,115, 29,224, 12, 25,147,141,253,171,190, 24,212,213,199,211, 21, 59,143,223, 0, 65,224,152, 73, 13, 46,199,113,237,154,248, - 96,221,158,151,103, 24,186,122,175, 61,164,141,190, 24, 81,216, 15, 0,122, 53,150,157,107, 83,223,222,155, 43,239,184, 85, 9, - 44,196,130,201,253,134,142,145,210,177,167,128,132, 96, 16,180, 14, 26, 3, 11, 69,118, 33,212,182, 94, 8,185,253, 88, 83,160, -213,207,140,204,170,157, 21, 47, 42, 27,241,162,251,143,147,138, 84, 26, 55,153,188,190,150, 34, 89,182, 72,199,225, 94,100,130, - 50, 50, 29, 49,166,112,196,199, 67,255,174, 7,221,105,235,238, 67, 75,132, 34,241, 8,138, 0,225,108,103, 41,223,250,211,183, -176,182,182, 2,171, 47, 2, 84, 89, 24,242,217, 15, 89,225,105,198,122, 0,208,208, 17, 86,157,234, 9,119, 11, 72, 34,229, 74, -156, 97, 81, 77,255, 65, 24, 49,101,116,159,150, 66, 86,175,194, 23,171, 14, 98,219,188, 65, 24,211,195, 95,120,230,102,236, 20, - 0,203,107, 91,214, 28, 67,131, 51,106,240,222,215,215,162, 9,224, 6, 7,116,124,112,232,187,198,192, 67,147, 57, 90, 1, 66, - 70, 64,248, 55,247,182, 20,177, 41, 55,193,166,220,228, 40,175, 14, 32,188, 59, 19,132,107,107,238,151,213,203, 84, 59,118,236, -188,200,146,248,198,132, 80, 25, 60,120,252,127, 69,124, 90, 90, 90,223,254,253,251, 95,190,112,225,130, 67, 64, 64, 0, 0,224, -193,131, 7,197,157,206,214,173,225,231,231,135,140,140, 12,140, 26, 53, 42, 91,161, 80,244, 69, 13, 62,191,133,133,133,207,143, - 28, 57,226,162, 82,169, 90, 46, 90,180, 40,211,199,199, 71,169,213,106,137,252,252,124,150,166,105,216,219,219,139, 91,182,108, -137,246,237,219, 23,221,190,125,187, 78,114,114,114, 33,128,132,218, 36,126,208,160, 65,184,118,173,120,210,222,155,136,171, 37, - 18,137, 16, 16, 16,224, 17, 31, 31,159, 90,210,182,152,253,142, 47,223,188, 60,126,252, 24, 87, 31,166, 64,160,215, 64,156,149, -134, 59,199,143, 96,224,228,105,160,233,218,123, 49, 60,126,252, 24, 39,130,239,192, 82, 34, 64, 76, 76, 4,142, 28, 57,130,169, - 83,167,190, 22,103, 45, 81,173, 22,249,151, 67,129, 42,252,180, 4, 0, 16, 24, 24,120,181,212, 90, 81, 30,190,190, 16, 75,138, -176,180, 87, 43,143,185, 35, 58,214,167,140,202, 52,176, 12, 11, 74, 8, 56, 59,217,224,143, 63,246,215,219,127,240,224,237,205, -155, 54,111, 96,105,122, 97,120, 38,212,102, 36,106,233, 79, 7,111,140,248, 99,118, 87,193,212,126,141, 29, 0, 64, 36, 32,177, -254, 84, 4, 13, 96,233,235,228,246, 93, 15, 72,139,140,152,228,236,104,187,120,193,167, 3, 28,186,182,246,195,213,187,225,216, -112,228,246, 53,113, 38,246,152, 92,185, 89, 35, 94,214, 79,149,205, 58, 4, 91,179,223, 37,195,112,174, 34, 75,123, 24, 18,174, - 0, 6, 45,180, 58, 3,146,115, 24, 36,231,106, 33,144,137,240, 32, 54, 69,227,152,142,160,215,200, 54, 97, 41,147,186, 47,249, -126,173,167, 86, 83, 68, 43,243,178,105,145,248,142, 80,102, 33, 81,152,227,170,112, 39, 21,218,206,117,133,239, 0, 44, 37,150, -114,234,175,191, 28,103,153, 26,121, 1, 13,200, 52, 16, 28, 7, 11,255, 1,176,182,160, 68, 29,235, 8,147, 0,192,210, 82, 38, - 94,245,205, 28,219,153,243,190,169,209, 7,204, 31, 16,249,249,186,206, 12,240,177,199,181,208,104, 92, 11, 75,140,184,246, 32, -166,105,183,102,238,240,243,180,155, 33,206,203, 95, 25, 5,243, 45,164,197, 5, 67, 3, 70,109,217,172, 67,127,103,124,216,102, -196,162,170,102, 27, 86,138,186, 0, 27,203,112, 32, 40, 10, 32,200,226, 25,144,201, 55, 33,176,243,229,246, 31, 58,161,222,185, -115,207,183, 81,217,188, 21,139, 7,143,154, 80, 80, 80,240, 36, 42, 42,170, 79,243,230,205,119,125,241,197, 23,214,163, 71,143, -118,159, 56,113, 34, 9, 0, 25, 25, 25,236,186,117,235,210,126,249,229,151,130,236,236,236,241, 70,163, 49,204,148, 39, 92,161, - 80,220,250,245,215, 95,179,174, 95,191,222,180,109,219,182,146,119,222,121,135,181,183,183, 23, 72, 36, 18, 70,175,215,107, 99, - 99, 99,153,248,248,120,183,252,252,252,103, 0,226, 80,139, 97,253, 18,235,213,114,138,162,150,112, 28, 23,240, 38,124,180,100, - 50,153, 59,128,103, 4, 65, 52, 48,119,216,240,149, 6, 91, 32, 64, 94, 94, 30,212,233, 17,144,166, 60, 69,115, 75, 18, 77,236, -173, 96, 99, 99,243, 90,162,168,160,160, 0, 80,165,226,198,141,199, 0, 77,195,214,214, 22,182,182,182,127,187,208,170, 74,139, -252, 71, 48,169,146, 99,213,251,104, 53,145, 99,170,133, 30,235, 38, 15,168, 47,170,235,237, 9, 93,202, 3, 60, 78, 46,194,194, -119,219, 70, 82, 18,107,237,228,143, 7,181, 30, 58,172, 14,186,182,111, 67,212,117,179,157,177,242,167, 45,159, 53, 65,246,156, -200, 76,172, 55, 37, 69,145, 89,120,206, 34,115,231,149, 39, 41, 83, 60,101, 26,176, 44,135, 43, 97, 10,132, 37,228,237,140,206, -194,115,115,114,215,196, 13, 61, 5, 32, 15,114, 28, 39,181,181,180, 44,108,226,231,233,212,243,189, 22,100,223, 46,173, 33,162, -128, 27,247, 30, 99,214, 79,199,238,176, 44, 55,192,228, 25, 98, 44,251,138,128, 42,158, 97,104,172, 48,195,144,227, 56,174,120, -214, 97,245,110, 95, 20, 69,164,171, 19,239,187, 10, 29, 27, 66, 19,119, 5, 9,121, 44, 18, 51, 11,161, 20,184, 66,151,154, 10, -112,108,210,213,215,112,172,118,114,114,114,174,215,196,175,254,198,221, 71, 96, 80, 23,224,121,200, 46, 20,229, 41,240,221,214, - 83,245, 61, 60, 28,187,164,166,166, 94, 53,227,101,227,119, 57,104,191, 51, 56,128, 18, 74,112,102,243, 33,100, 59, 90,192, 73, - 38, 2,171,201,194,228,153,163,109,251,245, 26,109, 11, 0,137, 49,143,224, 35,211,152,196,107,112,196,208, 17,221, 26,217,193, -168,193,238,243,143,180, 36,208,119,207,197,136,184,110,141,237,164, 35, 58,250,216, 47, 79,203,255, 0, 57,181, 11, 42, 90,106, -209, 42,179,240,213, 98,182,225, 17,128,105,204, 34,238,224,173, 76,203, 97,189,222,145,137, 4, 4,193, 21,165,130,179,112,194, -150,221,135,139,196, 70,108, 7, 15, 30, 60, 76,130, 70,163, 9,213,104, 52,205,190,250,234,171, 15,191,254,250,235,206,150,150, -150,245, 0, 64,165, 82, 61, 55, 26,141,215, 74,158, 79,115,102, 7,114, 0,158,197,197,197, 61,143,139,139,115,217,187,119,175, - 29, 0,105,201,111, 90, 0,249, 0, 50,240, 26, 51, 14, 75, 69, 21, 65, 16, 75,222,212,125, 40, 21, 85, 4, 65, 52,168,205,245, - 36, 73, 50, 4, 65,128, 32, 8, 72, 36, 18, 92,191,126, 29,195, 7,244, 66,212,153,124, 4,216, 89,161,237,248,201, 56,120,233, - 18, 40,138, 2, 65, 16,160, 40,202,172,118, 68, 32, 16,224,198,141, 27, 24, 51,106, 24, 36, 2,192,214,214, 22, 95,125,245, 21, - 78,158, 60, 9,129,128, 95,165,207, 12,108, 47, 39,184, 76,140,163, 69, 96,249,165, 93, 63,136,192, 24,113,122,215, 26, 4,133, - 23,233, 99,178,176,176, 81, 22,214, 29, 65, 33,155,245,211,158, 41,151,110,132,255,248,201,200, 64, 89,247,110,189,208,189,107, - 55, 65,211, 54, 93, 22, 3, 21,132, 86, 79, 84, 19,107,131, 97,241,237,246,243,209,147, 15,134,196, 18, 48, 20, 98,100,239, 54, - 28,195,226,219, 26, 50,243, 10,167,173,133,213,193, 27,183,111,219,195, 80,132,132, 71,127, 74,235,212,171, 15, 48, 6, 60,123, -246, 20,191,236, 62,206,134,220,139,249, 67, 79,227,139,248, 60,168, 76,229, 44, 86, 86, 52,108, 45,197,141,250, 54,181, 57,199, -130,131,157, 76,212,152, 99, 25,216,201,132,141,123, 53,150,157,227, 56,142,179,182, 16, 54,230, 24, 99,141,156, 26, 61,189,109, -247,111, 59,215, 78,152, 48,193, 50, 59, 37, 29,105,202,112, 20,137, 61, 96,148,121, 33,238,209, 53,141, 90, 71,155,210,136, 87, -121, 63,179,179,179, 51, 67,239,230,226,224,214, 21, 48,234,117,200, 76, 41,214,170,105,217, 74,216, 56,121,220, 78, 77, 77, 53, -153,211, 64,179, 5, 67, 71, 79, 18, 89, 88,195, 98,204,208, 64,113, 92,142, 14,173,220,173,139, 95, 26, 69, 89,136, 10,190,129, -174, 37, 62,166,241,201, 36,124, 90,184,155,148, 78,107,169,232,139,126,239,120,224,121,146, 2,215, 35, 82,119, 63,207, 69, 26, - 19,173,216, 29,151,150, 63,101,208,187,222,248,249,100,228,231,128,113,191, 57,121,247,119,198,135, 28,135,142,197,206,240, 26, -112, 64, 71,127,103,124,104,226, 76,195, 87, 56, 5, 34,124,180,246, 92,226,162,195,247,179, 7,205,253,168,147, 77,251,246,253, -197,160,245, 40,212,232,140, 81,249, 80,190, 78, 25,189, 6,120, 78,158,243,191,202,201, 0,248,195,104, 52,254,145,159,159,255, - 38, 57,211,240,106, 92,167,215,202,123,249, 97, 66,142,227, 4, 37,214,172,154,156,225,171,229, 44, 63, 76,200,113,220,217, 18, -107, 86, 77, 86,173, 10,156, 44,203,166,181,110,221,218, 97,224,192,129, 96, 24, 6, 79,159, 62, 69, 98,114, 50,122, 78,249, 28, -118,118,118,184,246,228, 9, 98, 98, 98,176,100,201, 18, 24,141, 70,156, 56,113, 34,165, 38, 78,129, 64, 96,168, 95,191,190,104, -240,224,193,160,105, 26,241,241,241, 72, 77, 77,197,172, 89,179, 96,107,107,139,208,208,208, 50,206,236,236,108, 8, 4, 2, 67, - 37,214,173,191,162, 46,253,215,241,138,200,170, 94,104, 1, 12, 24, 35, 10, 46, 45,197,250,235, 48, 24,140,104, 28,153,133, 23, -145,255,179, 72,109,161,238, 62, 57,253, 36, 60,250,121,232,205,238, 98,100,134,193,220,158,196,211, 28, 40,172,165,133,133, 48, - 20,218, 32,254, 28, 94,100, 20, 22, 61,205,129,194,236, 30, 3,203, 16, 48,168, 1,197, 3,220,186,118, 21, 33,119, 30,227,126, - 88, 52,115, 43, 52,246, 32,201,226,219,168, 28, 60,173, 69, 47, 4, 86, 3,126,198,184,176,103,222,109,252, 92,188,193,208,224, - 88, 35,108, 71,238,199,248,200,246,222,109,124,237,188,139, 45, 89, 70,216,127,250, 39,176, 86, 90, 45,223,131,100,227,118,241, -201, 11, 31, 20,230,231,188,219,163,203,123,150,182,254,253,144,253, 44, 22, 79, 31,223,208,132,134,199,221,122,144,108,124, 45, -107,137,135,135, 71,231, 30, 93, 26, 97,228,228, 5, 48,168, 11, 16, 31,242, 27,138,114,211,113,253,182, 21,162,149,202,247, 0, -152,108,209,186,157, 68, 55, 69, 82, 30, 58,212, 17, 38, 89, 67,231,250,113,224, 64, 72, 8, 45, 88,157, 18,132, 58, 27,113,169, -250,130, 15,182, 38, 51, 0, 32,147, 16, 2, 75,174,192,198, 36,203,163,143, 99, 67, 25,101,196,158, 75, 17, 96,217,226,229,155, - 88, 22, 91,246,252, 25, 55,229,219, 49,173,208,196,219,190,197,163,212, 76, 2,102,152,252, 9, 14,157,238, 31,252,166,177,246, -242, 98,128, 53,224,198, 12,135,198,157,214,231,118, 66, 45,151,219, 9, 79, 67, 42,128, 41, 16,168,183,205, 88,127,126,113,235, - 75,145, 29,103,127, 58,200, 6, 28,191, 0, 59, 15, 30, 60,254,126, 20, 21, 21, 77, 30, 63,126,252, 54,161, 80, 40, 7, 64,176, - 44, 11,150,101, 5, 63,254,248,163,144, 97, 24,146, 36, 73,134,162, 40,250,236,217,179, 70,134, 97,178,180, 90,237,228,154, 56, -105,154,142,155, 54,109, 90,253,154,102, 40, 30, 56,112,160, 84,100,197,241, 37, 97,146,200, 42,191, 47,179,114, 85,221,120,112, -248,166,195,152,165, 75, 1, 16,224,176, 44, 50, 11, 47, 94, 62, 37, 44, 23,105, 77, 40,195,172,166,109,186, 44, 45,189,198,220, -148,105, 25,102, 88,155,102,126, 7, 0, 64,199, 49, 99,106,147, 59,165, 78, 51,162,101,155,247, 14,178, 28, 39,160, 57,110, 39, -201,226,168,150, 70,148, 41, 51,237,170, 66, 90,102,126,104,191, 0, 91, 14, 40, 30, 50, 44, 27, 46, 44, 9,227,192,113, 28, 87, - 54, 92,184, 70,138,236, 2, 93,141,113,160,110,190,208,247,210,211,247, 39, 93,188,249,104, 50,195,112,174, 20, 69,164,107,244, -244,182,215, 21, 89, 0,144,154,154,122, 53,248, 82,234,197, 39, 45, 92,122, 59,201, 74,172, 92,106, 32, 91,141,139,169, 89, 69, - 87,107,195,153,167, 50, 14,250,122,221,201, 83, 98, 33, 37, 0,199, 21, 7, 20,229, 56,104, 13, 76,238,237, 36,186, 41, 0, 52, -115,128,251, 87, 39,232, 3, 20, 69, 36,214,196,119, 55, 70,241,243,200,149,193,115, 34, 18,242,118, 38,228, 35, 28, 0, 18,242, - 17,126,232,198,139,197,113,233,133,115,194, 19,243,214,192, 76,191, 10,142,192,245, 54, 35,151,190,114,236,117,239,103,180, 2, -143, 1, 12, 1, 82,122,141,156,253,203,108,130, 0,191,252, 4, 15, 30,255,143, 80,106,213, 34, 73,114,249, 27,228, 60, 75, 16, - 68,127, 0,207,204,184,236,110, 81, 81, 81,179, 55,156,189, 28,154,166,115, 76, 57,241, 31,112,136,255,175,226, 31,115, 45,233, -201,115,254,253,156, 13, 26, 52,224,204, 16, 44,252,253,228, 57,121, 78,158,243,255, 21, 39,199,113,212,235,108, 85,112, 18,175, -179,241,101,244,159,199,203,206,240,147, 74,141, 19,252,112,200, 91,136,103,207,158, 17,252, 93,224,193,131, 7,143,202, 65, 16, - 4,243, 23,112,242,193,139,121,148, 10,174, 10,214, 45,146,191, 39, 60,120,240,224,193,131, 7, 15, 30,111, 68,100,149,223, 23, -139,112, 84,109,254, 51,103, 54, 65,109, 76,136,193, 60, 39,207,201,115,242,156, 60, 39,207,201,115,254,191,227,172,137,251,173, -152,205, 88, 67, 28,243, 55, 6,222, 31,128,231,228, 57,121, 78,158,147,231,228, 57,121,206,183, 29, 85,250,104,241, 67,135, 60, -120,240,224,193,131, 7, 15, 30,127, 17,120,103,120, 30, 60,120,240,224,193,131, 7,143,215, 67,141,139, 74,243,224,193,131, 7, - 15, 30, 60,120,240,168, 29,170, 95, 84,154, 7, 15, 30, 60,120,240,224,193,131, 71,173, 97,254,162,210, 60,120,240,224,193,131, - 7, 15, 30, 60, 76,194,118,254, 22,240,224,193,131, 7, 15, 30, 60,120,252, 61,168, 56,235, 48, 40, 40,136, 43,191,231,193,131, - 7, 15, 30, 60,120,240,248, 59,241,182,106, 17,126,232,144, 7, 15, 30, 60,120,240,224,193,227,245, 48,137, 23, 90, 60,120,240, -224,193,131, 7, 15, 30,127, 13,170,244,209, 42, 13, 88,218,181,196, 84,215,149,191, 87, 60,120,240,224,193,131, 7,143,127, 0, -111,183, 22,225,253,179,120,240,224,193,131, 7, 15, 30,188, 22,121, 51, 40,117,134,231,193,131, 7, 15, 30, 60,120,240,224,241, -122,224,215, 58,228,193,131, 7, 15, 30, 60,120,240,248,155, 5,215, 95, 46,180,248,149,205,121, 78,158,147,231,228, 57,121, 78, -158,147,231,252,255, 36,178, 42,136, 45,126,214, 33, 15, 30, 60,120,240,224,193,131,199,235,161,198, 89,135, 60,120,240,224,193, -131, 7, 15, 30, 60,106,135, 73, 0, 2, 75, 62, 7,162,156, 85,139,183,104,241,224,193,131, 7, 15, 30, 60,120,188, 30,182, 3, -112, 43, 17, 88,103, 0, 40,120,161,197,131, 7, 15, 30, 60,120,240,224,241,102, 80,222, 47,107, 64, 57,241,197, 11, 45, 30, 60, -120,240,224,193,131, 7,143,215, 68,149, 62, 90, 4,170,158, 57, 16,108,198, 31,212,102,246, 65, 48,207,201,115,242,156, 60, 39, -207,201,115,242,156,255,239, 56,107,226, 14,198,127, 15,175,132,117,224, 56,110,251,223,241,199,252,212, 87,158,147,231,228, 57, -121, 78,158,147,231,228, 57,255,223,225, 47, 11, 88,218, 10,176,224,111,239, 91, 9,151,146,141, 7, 15, 30, 60,120,240,224, 81, - 61,254,154, 89,135,254,192,167,163, 3,228, 91,141,225, 89, 54,225,128,186,186,115,229,114,249, 54,153, 76, 54, 90,173, 86,171, - 8,130, 96,203, 43, 64, 0,229, 23, 7,138,207,202,202,234, 84,211,127,139,197,226,117, 46, 46, 46,159, 22, 21, 21,169, 9,130, -224, 8,130, 0, 65, 16, 0,240,202,158, 97,152,148,156,156,156,214,255,113,169, 76, 57,185,184,220, 19, 82,148,135,185,151, 50, - 44,251, 34, 51, 35,227, 61, 51, 46, 89, 65, 16,152, 91,252,183, 88, 13, 96,193, 91,215,243, 0, 40, 83,206, 11, 0,172, 99,129, -145, 12, 73,126, 46, 4, 54,233, 88,118, 43, 0, 16, 0, 83,219,255,214,221, 69,125,130, 67, 11,130,128, 45,199,161,128, 35,240, - 88,210, 14,113,255,208,173, 24, 42, 20, 10, 7,217,216,216, 88,229,228,228, 92, 5,112, 0,192, 40, 71, 71,199, 46, 74,165,178, -200,104, 52,158, 4,112,172, 54,196,157, 90, 96,158, 88, 36,252, 68,107, 48,174,186,249, 24,191,117,105, 5, 71,154,197, 74,169, - 72,208, 73,167,167, 87,223,120,130,157,102, 82, 18, 37, 91,233, 59,195,236, 69,197, 14,155, 88,238, 0,112,194,222,222, 79, 34, -183,185, 44, 20, 83, 47,242, 51,138, 70, 15,203,204, 76, 30,254, 26,229,254,111,132,147,147,211, 56,146, 36,191,231, 56, 14, 12, -195, 44,204,205,205,221,245,134,168, 23, 2,176, 43,249,156, 15,224,251,215,228, 75, 4,224, 93,242, 57, 9,128, 15,223,174,215, - 26, 91,142, 31, 63, 62,165, 91,183,110,248,249,231,159,177,101,203,150,132,172,172,172,149, 0,118, 3,208,255, 3, 60, 60,170, - 66, 19,160,255,143,125,218, 49,198,223,191,101,203, 29,238, 89,197,195,252,235,199, 31,127,108,224, 56,142,139,137,137,225,244, -122, 61,103, 52, 26, 57,154,166, 57,154,166, 57,163,209, 88,182,121,120,120,164,190,116,249, 43,156, 36, 73,174,255,224,131, 15, - 10, 57,142,227, 30, 60,120,192,105, 52, 26, 78,167,211,113,122,189,158,211,106,181,156, 70,163,169,176,185,184,184,100, 84,199, -105, 99, 99,243,192,222,222, 62,195,222,222, 62,195,193,193, 33,195,193,193, 33,195,209,209,177,108,115,114,114, 42,219,228,114, -121,134, 92, 46,207,112,112,112,120, 80, 83, 58, 75,208, 7,192, 85, 19,182, 62,149, 92,219,179,188,208,114,115,115,203,224,106, - 1, 79, 79,207,100, 19,210, 89, 10, 23,130, 0, 83,122, 45, 65,128,149, 72, 36,222,229,127,199,171,150,174, 26, 77,202,238,238, -238, 31,184,185,185, 5,187,185,185, 93,114,119,119,255,192,132, 42, 86,129,211,218,218,250,129,147,147, 83,134,171,171,107,102, -233,230,230,230, 86, 97,115,119,119, 47,219, 92, 92, 92, 50,236,237,237,171, 44, 35, 14,160,170,218, 66, 0,129, 4,232, 46,160, -168, 32, 23, 23, 23,101, 88, 88, 24,195,113, 28, 71,146,100,106,233, 57,230,228,253,101,145,165,190,129,133,217, 87, 36,119,139, - 94,172, 44,200,190, 34,185,171,190,129,133,186,187,168, 95, 91, 78, 19, 81, 25,231,216,177, 99,199, 62,206,200,200, 72,205,207, -207, 87,108,221,186, 53, 86, 42,149,222,216,186,117,107,108,126,126,190, 34, 35, 35, 35,117,236,216,177,143, 1, 76, 51,131, 19, - 0,240, 94, 11,188, 59, 97,168,155,250,241,137, 49,234,238,109, 4,143, 58, 4, 32,176,215,123,162,212,141,243,253,213,215,118, -116, 84,119,123,135, 12, 55,147,147, 16, 8, 4,237,189,189,189, 63,145,203,229, 31,151,108, 99, 74, 55, 87, 87,215, 49,174,174, -174, 99,236,237,237,135, 87,199,121, 24,160, 76,217,188,164,210,246,195,235,121,171, 19,151, 47,227,194,102,126,206,125,226,235, -165, 28,230,236, 92,231, 31, 40,163,191,148,211,217,217, 57,205,104, 52,114, 6,131,129,115,116,116, 76,123,131,233, 92,195,113, -220, 26,142,227,214, 0, 88,243, 6, 56,203,222,103,102, 8,236,234, 56,165, 2,146,156, 45, 19,139, 47, 73, 4,130, 76,137, 64, -144, 41, 19,139, 47, 9, 72,114, 14, 0,233,191,169,140,254, 2, 78, 43,185, 92,254,124,221,186,117,156, 90,173,230,212,106, 53, -183,110,221, 58, 78, 46,151, 63, 7, 96,101, 6,103,109,121,222, 38, 11, 86,133,173,116,232,240,141, 88,180,252,129,214,221, 91, - 52, 56, 58, 99,220, 72,176, 71,214, 17, 53,244,152,126,125,175,117,235, 79,118,239,222, 13, 0, 24, 61,104, 16,122,183,109, 11, -107, 43, 75,136,197,197,201, 33, 56, 2, 34,161, 8,131,103,125,105,202,223,175, 30, 60,120,240, 71, 71,142, 28,177, 2,128, 45, - 91,182, 96,232,208,161,112,112,112,128, 76, 38,131, 72, 36,130, 80, 40,172,176,175, 9, 20, 69,121,166,166,166, 58, 75,165,210, - 50, 43, 27,203,178, 21,182,242,171,114,211, 52,141,134, 13, 27,154,122,187,230, 23, 20, 20,116, 86,169, 84,101, 28,149,109,245, -234,213, 3,128, 11,166, 16,126,255,221,183, 96,105, 21, 4, 2,128,166, 1,157,129, 4,203, 85, 42,110, 48,109,218,180,215, 90, - 77,124,192,128, 64,130, 32,136, 35,161,161,161, 71, 51, 51, 51,235,178, 44, 51,177,150,150,174,207,158, 62,125,106, 5, 0,126, -126,126,211, 0, 28, 53, 39, 29, 2,129,192,243,201,147, 39,206, 18,137,164, 74,203,101, 57, 11, 38, 12, 6, 3, 90,181,106, 69, -155,243, 31, 46,128,119, 46, 73, 78,108,249,206, 59,147,150, 14, 30, 44,189,119,239,158,148, 36, 73,208, 52,141, 31,127,252,145, -230, 56,206,174, 9, 96, 19, 9, 40,171,161,249, 26,192,184,146,198, 96, 39,128, 31, 43,168, 5, 14, 45, 52, 70, 73, 96,124,209, -224,182,237,234,204, 67,100, 68, 88, 91, 95,171, 19,176, 22,232,226,128,191,215,170,101, 99, 99, 51,232,231,159,127,150,239,220, -185, 83, 25, 19, 19, 99,216,186,117,171,124,242,228,201,214, 6,131, 1, 83,166, 76,201,106,212,168,145,232,231,159,127,150, 31, - 59,118,172,187, 74,165,218,108, 86,121, 17,248,118,212,160,222,208, 26, 73, 24,141,180,220, 77,110,253,199,140,177, 93,133, 28, -167,199,158,147,161, 48,210,236,111,102, 90,178,222, 27, 54,108,152,239,254,253,251, 5,209,209,209,130,198,141, 27,131,101, 89, - 48, 12, 3,163,209, 8, 0, 96, 89, 22, 13, 26, 52,120,237,251,242, 9,224,231,228,226,112,233,189,254,253, 44,220,164, 18, 56, -228,101, 97,130, 72, 96,189, 75,166,219, 11,160,253, 91,101,217,229, 56, 8, 4, 2, 36, 39, 39,195,217,217,217,130,101, 89, 5, -128,101,121,121,121,219,241,246,162,173, 88, 32, 56,186,231,183,245,174,237,218,183,167, 92,220,156, 17,251, 52, 9, 2,130,233, -249,228,126,104,215, 79,166,206,158,161,167,233, 15, 0,220,123,219, 50,238,218,126,218, 16,130,164,182, 16, 28,139,111, 54,158, - 42, 92,177,122,157,108,202,196,177,212,172, 89,179,224,229,229, 85,119,200,144, 33,171, 1, 76,173,145,167,221,180, 33,160,200, - 45,224, 56, 44,253,229, 84,225, 15,171,215,201,166,214,130,231, 63,142, 42,159,145,215, 22, 90,254,128,111, 83, 47,231,139, 43, -230, 78, 21,114,231,126, 39,213, 57,153, 85,158, 43,151,203,183,245,237,219,119,244,174, 93,255,179, 70,191, 23, 16,128, 33,221, - 59,194,217,209, 22, 50, 75,113,113,115,196, 18,120, 28,243,194, 36, 65,224,229,229, 53,229,232,209,163, 86,229,197,132, 72, 36, - 42,219,202,139,172,210,173,180, 1,174, 14, 82,169, 20,193,193,193, 16, 8, 4,160, 40, 10, 2,129,160,108, 43,255,157,162, 40, -184,184,152,229,186,180,210,214,214,182,121, 97, 97,161, 77,126,126, 62,188,189,189,149, 0,158,148,251,189,121, 86, 86,150,141, - 57,132, 44,173,194,172, 9,254, 16,234,239, 64, 47,108, 11,141,160, 3,110,221,143, 66,208,133,171, 72, 77, 75, 71,199,119, 91, -226,227, 15,135,225,210,165, 75, 96, 24,179, 71, 58, 50, 56, 14,171, 7, 14, 12,156, 7, 16, 68,207,158, 61,243,167, 79,159, 78, - 70, 71, 71,127, 52,100,200,224,128,167, 79,159,149, 88, 21,137,185, 28,135,245, 0, 50, 76,228, 21, 3,192,181,107,215, 0, 64, - 82,155,186, 39,145, 72,112,251,246,109,148, 14, 19,147, 36, 9,146, 36, 65, 81, 20, 78, 63,115,130, 74, 79, 66,157, 17,142,207, - 3,189, 81,175, 94, 61,144,100,205, 46,137, 93, 1,233, 45, 96, 8, 33, 20,206,114,115,119,175,219,197,215, 87, 22, 28, 28, 76, - 1,128,143,143, 15,167, 80, 40,242, 79,158, 60, 89, 40, 0,182,248,112,220,238,234, 68,150,151,151, 87,135,212,212,212,239, 75, -239, 57, 65, 16,171,235,212,169,179,164,172,220, 88, 22,203,126, 83, 9,103,204,152, 41,106,215,117, 17, 0,160,221,192,253, 80, -198,175,240, 39,114,191,182,253,187,223, 18, 74,165,242, 96,131, 6, 13,168,156,156,156, 91, 0, 18,141, 70,227,252, 63,254,248, -195,121,194,132, 9,153,123,247,238, 93, 9,192,125,213,170, 85, 93, 85, 42,213, 33,115,120, 59, 54, 71,255,119,154, 7,188,235, -237,229,133,171,183,238, 65, 36, 22,218, 77, 27, 23, 8, 43, 43, 1,214,236, 60,195, 38,166,228, 78,191,241, 4,187,205, 16, 89, -109,135, 13, 27, 86,119,255,254,253, 98, 0,120,242,228, 9,210,211,211, 33,151,203, 97, 97, 97, 1,161, 80, 8,138,162, 32, 20, - 10,223,136,200,178,245,114,188,123,226,196, 73, 11, 7, 7, 59,108,252,114, 6, 62,206,204,128,157,181, 21,140, 69,170,186,111, - 89, 67,225,215,169, 83, 39, 41,195, 48, 80,169, 84, 8, 9, 9,177,181,176,176,176,245,244,244, 92, 90, 93, 35, 82,201,187, 51, - 67,171,213, 58,151,124,206,212,106,181, 46, 0,148, 18,137,164,244, 61, 93, 84,178, 55,117, 56, 49, 17,175, 14, 19, 38, 17, 4, - 81,254, 88,109,209,166,109,155,230,193,199,142,236,179, 42, 40, 76,135,157,125, 38, 72, 20, 96,251,246, 77,176,176,176,193,210, -165, 95, 11, 94,244,236,238,209,167,255, 7,193, 17, 81,177, 61,223, 58,177,197, 17,219,123, 14, 28,237, 96, 33,179, 46,105, 75, -140,216,181, 99, 6, 72,146,196,146, 37, 75,208,180,105,211, 73, 17, 17, 17,139, 0,228, 86, 79,131,237,205, 58,143,112, 16, 75, -139,139,152,101,140,216,122, 96, 78, 49,207,130,201, 24, 53,176,222,164,175,134, 61, 63,223,212, 23,133, 37, 29,115,141,144, 68, - 18,209, 14,101,130, 33, 40, 40,168, 75, 96, 96,224,213,170,190,255, 7,224,134,255,197,207,170, 32,190, 4, 65, 65, 65, 92, 96, - 96, 32, 81, 46,115, 21,190, 87,135, 22,128,147,189,173, 44,120,203,178, 25, 86,130, 59,103, 40, 77,210, 51,164,105, 43, 52,228, - 21,166,104,202,100,178,209,187,118,237,170, 96, 82,242,118,113,134, 72, 36,132, 80, 68,192,174, 83,113,244,250,252,235, 65, 32, -136, 42, 69, 86, 5, 78,149, 74,165,125,244,232,145,213,206,157, 59,225,236,236,140,186,117,235, 66, 38,147, 65, 42,149, 86, 16, - 87,229, 5, 87, 37, 66,171, 2,103,233,239, 2,129, 0, 36, 73,226,210,165, 75,160,105, 26,195,134, 13,123, 69,100, 9, 4,130, -170,132, 91, 85,211, 83, 47, 0,120,194,113, 92,231,146, 6,248, 9,128, 46,229,126,239, 35,151,203,231, 3, 88,105, 42, 39, 69, -113,160,180,183,192,122,174,131, 32,121, 6,244,194, 22,184,114, 35, 20,187,182,253, 12, 0,168,219,184, 13,134, 15, 9, 44,179, -198,153,152,206, 50,120,120,120, 28,200,202,202,238,215,189,123,119,228,229,229, 25,151, 45, 91,134,230,205,155,195,207,207,207, -164, 50,170,162,231,156,241,228,201, 19, 47,141, 70, 3,142,227, 76, 17,103,175,112, 18, 4,129, 63,254,248, 3, 90,173,246,149, -147,237,187,252,128, 57, 67,125, 48,254,243,221, 88, 29,115, 8,155, 55,111,174, 54,239, 50,160,185,214,182,193,122, 49, 69, 55, - 95,249,245,103,146,143, 63,254,152, 26, 63,126, 60,146,146,146, 48, 97,194, 4,237,165, 75,151,244,233, 10,197, 73, 49,203,110, - 52, 84, 20,198, 85,114, 74, 36,146, 61, 23, 46, 92,192,161, 67,197,186, 36, 54, 54, 22, 13, 27, 54,180,172, 32,146,115, 15,163, - 48,113, 35,238,158,142, 70,187,129,251,113,247,244,135, 96,242,207, 8, 91, 55, 68,129, 57,247,179, 22,168,140,243, 80, 78, 78, - 78,153,136,218,187,119,175,197,222,189,123, 7, 3, 56, 5,224, 16, 0,228,230,230,254,100, 38, 39, 64, 96,252,136,161,131, 33, - 16, 89, 35,250, 89, 10,186,188,215, 10, 46,206,206,120, 18, 21,135,196,212,220, 12,130,192,184, 62,237,197, 43, 53, 26,253,162, -235,143,241,107, 13,156,132,167,167,167,223,225,195,135, 69,229, 44,208,101,207, 56, 69, 81,101,223, 75,133,119,109,234,103,169, -200,178,246,180,186,251,237,166, 14,150,119,195,246,162,161, 79,127,216,247, 15,196,175, 23, 47,226,105, 68,164, 86,175,166,123, -252, 3,101,244, 87,113,250, 13, 29, 58,244,214,190,125,251,236,146,147,147,113,237,218, 53,212,173, 91, 23,106,181,218,148, 14, -111, 5, 78,173, 86,235, 92,122, 13, 65, 16,206,165,134,119,189, 94, 95, 90, 24,165, 15,162, 93,185,243,236,170,225,244, 46,119, - 94,169,184,242,121, 3,121, 23, 75, 69,162,195, 39,142, 29,176,138,140,190,134,150, 45,222,133,149,109, 19,176, 76, 58,114,114, -139,144,247, 44, 13,223,125,183, 26, 75,151, 45,196,169,227, 71,172, 26,249,183, 56,170,167,233, 6, 0,180,111, 77,185, 19,220, -164,224,211,123,183, 16, 28, 11, 77, 70,180, 68,168,122, 46, 27,253,225, 7,212,200,145, 35,113,234,212, 41, 68, 68, 68,108,169, - 70,100, 5,151,179,204, 79, 10,191,118,104, 11, 56, 14,154,204,104,137, 72,243, 92, 54,246,163,225,212,199,163,122,227,206,159, -235,209,187,229,243,112,119,103, 12,201, 43,145,216, 2, 10, 57, 18, 41,110,114,119,113,167,156,216, 10, 1, 64,148, 19, 88, 33, -248,159, 15,230,127, 1, 3, 74,132,213,164,151, 59, 38,130,218, 8, 44, 0,104, 8, 88, 17, 98,209,221, 93, 75, 63,115,151, 37, - 69, 8,116,225,183,145,166, 99,185,173, 9, 52,219, 10,176,120, 8,104, 94,190, 70,173, 86,171,226,226,226, 44,198, 13, 25,130, -246, 1, 1,112,115,116, 68, 3, 79, 79, 88, 72,196, 16,139,132, 21,186,172, 38,143, 33, 16, 4,215,168, 81, 35, 12, 28, 56, 16, - 66,161, 16, 50,153, 12, 86, 86, 86, 16,139,197,149, 90,179, 76,237,229,114, 28, 7,138,162, 16, 30, 30,142,196,196, 68,216,217, -217,225,230,205,155,232,209,163,199, 43, 86,173,242,226,204, 28, 19,125, 37, 13,127,169, 16,187, 96, 14, 23,195, 16, 40,226, 90, - 64,154, 48, 29,106,162, 21,116, 58, 26, 58,157, 14,191,222, 48,224, 94,156, 10, 6,131, 30, 58,157,174,186,255,172, 10,164,187, -187,251,232, 6, 13, 26, 76,251,240,195, 15,141, 98,177, 24, 42,149, 10,106,181, 26, 17, 17, 17,198,126,253,250,231, 15, 28, 24, -104,123,230,204, 25,174,100,232, 48,195, 12,238, 28, 15, 15, 15,175,146,225,217,156,218,212,106,130, 32,202, 68,204,203, 24,247, - 83, 36, 4, 84,113,153,108,217,178, 5, 12,195,128,227,184, 42, 11, 73, 75, 16,151,151,253,176,214,118,213,186,223, 96,235,224, -130,171, 87,175, 50,231,207,159, 47, 36,128,216,167, 17, 17, 63,189, 15,156, 61, 12, 24,204, 73, 95, 94, 94,158, 69,221,186,117, -225,233,233, 9,150,101, 97, 52, 26,203,172, 47, 57, 57, 57,208,104, 52,112,176,204, 71,125, 71, 79,208,133, 33, 80,132,127, 3, - 55,171,104,236,190,160, 55,190,227,135,199,255,130, 23,199,239, 37,219,107,246,154,225,225,236,234, 5,146, 51, 34, 45, 51, 7, -131, 7,244, 6, 37,178,194,139,228,108,180,104,226,235,246,209,251, 29,220, 40,130,198,220,149,251,167, 1,236,175, 53,209, 21, - 21, 21, 49,209,209,209,120,242,164, 88,239,218,216,216,192,210,210,178,194, 51, 78,146,228,107, 89,180, 74, 69,214, 15, 91,122, - 88,146, 66, 21,148, 76, 48,118,254, 17,138, 22,141, 2,177,245,238,125, 45,147,145,219,115,141, 86, 27,123,224, 63,108,204,112, -117,117,157,204,178,236, 82,142,227,242, 59,118,236,232,178,127,255,126,251,212,212, 84,132,134,134, 98,201,146, 37, 89, 12,195, -208, 28,199, 17, 28,199,125,243, 6,254,142, 45, 39,176,222, 36,132, 50, 41, 62,119,178, 33, 6, 9, 72,155,186,180,178,232, 69, -182,158, 59,169,166,217, 95, 0, 24,171,125,185,145,228,167, 71, 14,110,113,119,146,179,232, 42,239, 14, 69,134, 1, 63,124, 57, - 22, 57, 57,133,248,117,199, 10, 0, 98, 24,104, 10,157,187,126, 0,103,103, 15, 76,154, 56,201,117,203,182,173,159,209, 44,187, - 6,111, 9,210,111,109, 62, 14, 32, 88, 46,151, 71,124, 54,105,146,188,110,221, 49,144, 74,165, 56,112,224, 0,246,111,220,200, -172, 3,134, 75,128, 43, 83,128,227,213,242,220,253, 31,207,140, 41, 83,228,254,254, 83, 32,145, 72,240,231,249,223,161, 77,255, -163,112, 64,123, 24,212, 90, 12,168, 51,144,115, 72, 56, 77,228, 10,133,120, 6, 0, 66, 41, 20, 0, 94, 30, 6,251,175, 9,172, - 82,156,193,255,102, 26, 78,170, 96,209,170,245,187, 83, 40, 14,219, 49,115,148,143, 11,116,132,254,198,105,164,234, 88,102,213, - 83, 3,245,176,128,155, 19, 85,137,200, 42,169,216,172,183,183, 55,186,183,110,141, 33,157, 58, 65, 32, 16, 64, 42, 22,193, 90, -106, 1,142, 41,182,100,149, 14, 29, 86,211, 38,162, 50,235,147,163,163, 35, 68, 34, 81,153,192, 50,195,154, 85, 41, 39,203,178, - 16, 8, 4,120,242,228, 9, 58,118,236, 8, 47, 47, 47, 28, 58,116, 8,125,250,244,121,101, 40,209, 92,145, 85, 42,180, 94, 26, -198,235, 3,160,212,146,101,150,208,210,234, 9,100,235, 91,128, 32, 2, 64,211, 0,195, 1, 58,173, 22, 28, 7,112, 28, 96, 52, -232,161,213,106,203,254,211,148, 33, 89, 87, 87, 87,111, 11, 11,139,229,243,230,205,245,111,209,162, 37,178,178,178,192,178, 44, - 44, 45, 45,161, 86,171, 97, 99, 99,131,246,237,219,191, 88,190,124,185,130,227, 48,201, 76,145,245,218, 40,189,231, 23, 47, 94, -172, 48,108, 88,186,169, 20, 41, 24,255,197, 94,136, 5,197, 67, 75,165, 62, 60,213,189,119,187,117,238,128, 91, 15, 99,233, 79, -231,174,215, 9,115, 66, 87,186,178,236,174,148,215,200, 23,199,113,200,206,206, 70, 70, 70, 6, 6, 13, 30,140,253,251,246, 33, - 33, 33, 1, 77,154, 52, 65,183,110,221,224,236,236,140,132,132, 4,220,187,174,131, 46, 47, 23,185,250, 80,200,172,219,225,196, -213, 56,221,146, 45,134,184,127,240,133, 49, 8,192, 88, 27, 27,155,122,106,181, 90, 65,211,244, 97, 0,135, 1, 12, 23, 8, 4, -195,101, 50,153,155, 82,169,124,142,226,217, 68, 39,107, 34,179,144, 74, 29, 37, 82, 27,176,180, 14, 2,129, 0, 94, 94,117,193, - 49,122,228, 41, 53, 24, 55,114, 32, 30, 62,137,194,249, 43,119,104,163,145,221, 96,202,109,165, 40,138,243,243,243, 67,102,102, - 38,132, 66, 33, 44, 44, 44, 96,101,101,133, 5, 11, 22, 96,227,198,141,101, 34,171,182, 66,235, 19,192,207,198,219,234,206,247, -155,138, 69, 86,122,154, 2, 25, 41, 66,200, 29, 93,176, 97,227, 58, 85, 94, 66,122,187,223,128,216,255,122, 35,203,178,236, 55, -169,169,169,206, 2,129,192,149,166,105, 36, 39, 39,227,193,131, 7,152, 62,125,122, 70, 78, 78, 78, 87,212, 50,143, 82,169, 52, -179,212,146, 85, 50,116, 88,213,112, 98,126, 57, 75, 86,126, 53,148, 85, 13, 19,250,214,245,180,190,180,227,231, 89,222,109,218, -181, 39,101, 2,155,188,162,103,233, 29,111, 92,187,218,126,250,207,191,126,150,152, 87,212, 27, 64,124, 85,164, 18,161,176,223, -187, 29, 58, 8,192,101, 64, 32,238,136,213,171, 70, 34, 43, 91,137,188,220, 66,136, 68,150,208, 27, 41, 48, 44,129,246, 29, 59, -225,247,221, 7,209,116,226, 4, 74, 44, 20,246,162,245,250,183, 70,104,149, 96,197, 47,191,252,226,221,168, 81, 35,236,218,181, - 11, 87,246,236,193,199, 5, 5,184, 74,146,148, 81, 40,116, 58,107, 52,110, 71, 13, 66,171, 60, 79,211,166, 77,241,219,111,191, -225,143, 63,254, 72, 26,221, 35,243,232,172,209,112, 54, 24,208, 55, 52, 6, 14,117, 6, 2,161, 49,112,120,167, 17, 26,208, 2, - 60, 35,136,138,225,160,130,130,130,186,148,223,255,199,160, 64, 21, 67,236, 2, 0, 93,131,130,130,184,242,251, 26, 95,156,242, -134, 83, 86,244,174,231, 19, 80,223,155, 48, 30, 90,143,100, 21,173, 95, 20, 99, 16, 63, 45,226,102, 69, 1,235,170,233, 65,112, - 20, 69,193,218,194, 2,114, 59,187, 98, 51, 63, 73, 2, 44,192, 26, 1,130, 41, 22, 0, 28, 75,128, 99,204,122, 97, 64, 44, 22, - 87,234,248,110,174,111, 86,121,206,194,194, 66,188,120,241, 2,147, 38, 77,130, 76, 38, 43, 86,238,233,233,240,241,241,129, 64, - 32, 64,106,106, 42,254,252,243, 79,212,171, 87, 15, 18,137,196, 44,181, 85,206,186,212, 28,197,179, 12,155, 43, 20, 10, 27, 55, - 55, 55,152,109,209, 98, 57,168,117, 4,244,122, 6, 79,159, 62, 69, 90, 90, 26, 94, 60,127,134, 54, 42, 37, 56, 80,224, 56,206, - 44,139,150,135,135, 71,128,175,175,239,214,149, 43, 87,138, 60, 61, 61,193,113, 28,236,237,237,160, 86,171,145,157,157,131, 38, - 77,154,192,203,203, 11, 43, 87,174, 4,128,253,127,183,200,122,169, 78,149, 9,173,242,130,235,139,247,189,145,155,107, 5,138, - 34,203,132,115, 13, 62, 90, 34, 0,232,218,123,168,224,210,249,179,150, 52,176, 60,157,162,150, 11,106, 46, 71, 35,195,178,178, -170,126, 79, 78, 78,134, 80, 40,196,145,195,135,145,155,145,129, 22, 45, 90,160,109,219,182,120,246,236, 25, 30, 62,124, 8, 71, - 71, 71,200, 61,223,195,213,231, 6, 68,166,105, 96,107,107,139,184, 20,242,159, 12, 25, 48,177,103,207,158, 75,126,250,233, 39, -103, 87, 87, 87, 97, 86, 86, 86,163, 77,155, 54,181,216,180,105,211,140,207, 62,251,204,229,179,207, 62,179,151,203,229,130,244, -244,116,191, 47,191,252,242,157,224,224,224,122, 0,214, 86, 71,104,105,105,237, 64,137, 44, 65, 16, 2,216,217,218, 67, 32,182, - 4, 75, 11,192,176,128,141,173, 28,183, 30, 30,193,205,176,194,201,153, 57, 56,108,146,125,172,164,220, 29, 29, 29, 95,177, 84, - 79,159, 62, 29, 59,118,236, 40, 27, 70,172,173,200,250, 97, 83, 15, 43,162, 68,100,165, 39, 11, 64,232,234,225,244,241,219,249, -121, 9,233, 29,223, 6,145, 85,250,142,227, 56, 14,207,159, 63,135, 90,173,198,245,235,215,241,205, 55,223,100,189, 44,178,156, -157,157, 39,218,216,216, 44, 43, 42, 42, 90,157,158,158,190,190,198,142, 95,177,136, 42,253, 92,186,175,116, 56,209,196,164,250, - 84,102,201,242,114,147, 94,120,120,125,175,143, 45,247,152, 64,226, 36,224,169, 50,194,250,174,115,231,254,109, 6,144,173, 54, -127, 91,167,237,228, 5, 23,146,149,218, 70, 85, 89,182, 88,134,105,101,105,101, 13, 32, 19,161, 15, 66,202, 68, 86, 78,110, 1, -116, 6, 10, 58, 61, 1,173,129, 68,247,158,125,177,113,235, 31, 72,205,204, 5,195, 48,205,222, 50,145,229, 16, 16, 16, 48,101, -248,240,225, 88,190,124, 57,130,127,250, 73, 63,149, 32,148, 2,128, 59,195, 48, 96, 57,142, 32, 77,115, 98,175,192,179,102,205, -154,227, 0, 70,173,156,142,247,242,138, 48,206,125, 32,231, 80,103, 96,241,137,195,230,113, 0,224,144, 21, 92,177,201, 12, 12, - 12, 36, 74, 71,214,204, 29, 97,251,183, 67, 16, 24, 24,120, 53, 40, 40, 8,229,247,213, 93, 96,237,210,168,255, 87,179,167,173, -106,211,167, 19,161,152,221, 11,185, 74, 45,253,117,164, 65,156,162,169, 94,100,149,199, 87,155, 54,225, 97,108,241,115,236,233, -236,140,185, 31,125, 4,142, 6,110, 70, 68,226, 96,112, 48, 70,246,236, 9, 75,169,212,100,203, 6,203,178,149, 90,177,202, 91, -179,204,181, 58,229,231,231,227,240,225,195,104,219,182, 45,100, 50, 25, 4, 2, 1,154, 55,111,142,168,168, 40,248,250,250,130, - 32, 8,156, 56,113, 2, 67,134, 12, 65,124,124, 60,222,123,239, 61,171,196,196, 68,179,133, 86,100,100,164, 13,199,113,157, 75, -173, 31,181,133, 78,167, 67,116,116, 52, 6, 14, 28, 8,123,123,123,120,120,236, 71,240,133,189,144, 5,124, 12,130,128, 89, 66, -139, 97,152, 79, 6, 12, 24, 32, 34, 8, 2, 26,141, 26, 82,169, 5, 44, 45,173, 96,109,109, 3, 63,191, 70, 72, 75, 75, 67,159, - 62,125,244,113,113,113,155, 21, 10,197, 33,115,211,234,239,239,111,153,144,144,240,113,157, 58,117,196, 0, 96, 97, 97,209,196, -215,215,119, 78,124,124,124,161,185, 86,173, 82,129, 69, 16, 4, 40,138, 42, 19, 90, 2,146,132,155,171,115,217,247, 18,255, 52, -162, 26, 46,101,106,142, 78, 2, 0,222,222,222,216,184,237, 20, 57, 96,192, 0,204,152, 49, 3, 70,163, 17,155, 55, 23, 79,178, -251,240,195, 15, 97, 48, 24,112,244,104,241, 36, 73,129, 64, 80,173,217,228,193,131, 7, 8, 13, 13,133,209,104, 68, 65, 65, 1, -206,157, 59,135,171,215,174,225,192,137,203, 72,120,254, 12,205, 27,249, 96,194,132, 79, 32, 20, 10,177,123,247,110,116,236,216, -241, 31,125, 33, 8,133,194,209, 59,118,236,112,219,181,107, 87,254,137, 19, 39, 84,239,190,251,174,100,221,186,117,206, 27, 55, -110,148,235,245,122,204,156, 57, 51,243,206,157, 59,186,193,131, 7, 91,110,223,190,221,173,126,253,250,189,104,154,174, 76,104, - 89, 2, 24, 9, 96, 76, 94,161, 94,144, 95,168, 1, 75,235,241, 60,225, 5, 10,138,244, 96, 25, 3,146, 82,210, 80,164,101,144, -147, 91,136,230,173,122,255, 18, 18, 18,178,208, 96, 48,124, 13, 32,168,166,116, 70, 68, 68,224,206,157, 59, 72, 72, 72,192,243, -231,207, 43, 42,197,137, 19,241,199, 31,127,152,109,209,170, 92,100, 81, 32,116,190, 8, 58,113, 55, 63,243,153,226,173, 17, 89, - 37,239,160,165,110,110,110, 75,221,220,220,164, 23, 47, 94,180,173, 83,167, 14,104,154,214,191,108,201,234,218,181,235,162, 29, - 59,118,184,249,250,250, 78, 7,176,254,223,144,118,146,196,196,213, 91,166, 56, 89,139,147,210,240,116,109, 73, 44, 65, 10, 80, - 43,129,144,125, 16,116, 88,252, 98,250,224,121,246,243,119, 45,159,200,130,173,114,134,108, 92,124, 50,182,108,217,136, 89, 51, -199,225,247, 95, 87,131,101, 5,208, 25, 41,120,215,125, 23, 58, 3, 11,130, 20,160, 69,171,214,184, 18,114, 29, 66, 18, 56,188, -107,203, 91,166,179,144, 27, 30, 30,190,249,196,137, 19,159,207,152, 49, 3, 44,203,138,151,109,217,162,201,202,202, 90, 1,243, -226, 95,189,204, 51,100,203,150, 45,177,243, 55,102, 29,159, 53, 26, 84,194,105, 34, 55, 52, 6, 14,195,230,113, 56,178,138,192, - 59,141,144, 43,171,188,137,191,246,210,254,237, 16, 90,165, 74,178,252,190, 50,180,106, 88,239, 91, 91, 7,251, 79, 72,107, 15, -167,185, 51,166, 10,226,211,181, 56, 90,231,163,162, 63,247,108,176, 76,167, 37,191,196, 65,187,206,156, 63, 62,248,231,159,101, -159,127,220,191,191,210,223, 20,195,134,153,220, 51,171,202,138,101,174, 37, 11, 0,100, 50,153, 93,175, 94,189,208,163, 71, 15, -124,240,193, 7,101, 62, 89, 45, 91,182,196,129, 3, 7, 48,116,232, 80, 60,122,244, 8,110,110,110,104,220,184, 49, 26, 55,110, -140,179,103,207,154,251,146, 3,195, 48, 8, 8, 8, 40,157,117,216, 60, 37, 37,197,166,182, 5,169,211,233,144,147,147, 3, 7, - 7, 7,136,197, 98,180,107,215, 22,159,127,209, 14, 78,110,191, 33,192,191, 17, 84, 42, 85,217,244,119, 19, 26,219,128, 6, 13, - 26, 32, 43, 43, 11, 89, 89, 89,144,203,229,112,119,119,135,171,171, 43,214,174, 93,203,173, 95,191,254,188,193, 96,216,156,157, -157,109,182, 37,203,213,213,181, 19, 65, 16,139, 52, 26,141,184, 92, 15, 87, 44,151,203, 79,106, 52,154, 21, 10,133,194,100, 71, - 80,130, 32, 96, 48, 24, 64, 16, 4,206, 60,119,135, 74, 79, 64,153, 18,138, 25,239,251, 84, 16, 94, 66,161,176,198,225, 82,142, -227, 84,163, 70,141,114,246,242,242, 68,114, 92, 4,142, 28,225,240,211, 79, 63,149,206,138, 68,108, 73,199,160,244,123,183,110, -221, 80,183,110, 93,112,102,196,202, 96, 89, 22, 79,158, 60,193,254,147, 87,225,230,227,143,164,167,209,120,120,246, 52,234,200, - 29,208,180, 85,107, 24,141,198,215, 10,189,241, 38, 96, 52, 26,119, 54,108,216,144,211,235,245, 87, 1,108, 12, 11, 11, 27,167, - 80, 40,102,158, 58,117,202,125,248,240,225,105,167, 79,159, 94, 7, 96, 87, 88, 88,216,148,239,190,251,174, 7, 77,211,149,206, - 22,164, 40,234,247, 47,191,252,178,235,240,225,195, 9, 17,105,212, 95,188,176, 91, 64,211, 70,226,171,175,119, 50, 33, 55,174, -146, 52,109, 36, 62, 24,245, 37,123,246,207, 48,114,242, 23, 63, 50, 45,223, 29,128,240,240,112,215,192,192,192,239,140, 70, 99, -181, 66,171,212, 82, 85,149,133,146,162, 40,140, 27, 55, 14, 7, 14,152,238, 65, 53, 1,240,181,241,177,186,243,195,166,158, 86, -132,160,168,156,200,170,143,160, 19,119,243, 51,158,166,189, 85, 34, 11, 0,114,114,114,182, 1,216,198,178,108,134,165,165, 37, - 10, 11, 11, 43,171,127,210,176,176, 48,169, 88, 44, 70,239,222,189, 29,130,131,131, 99, 73,146, 92,159,150,150, 86,165,226,168, -108,152,176,178,225, 68,188,198,172, 67,123, 57, 2,219,117,106,101, 29, 99,187,220, 90, 42,208, 62,170, 19, 43,181, 33, 0, 20, -232, 92,158,223, 74, 28,169, 36, 50, 37, 45, 91,119,123, 7, 54, 2,203,192,124,186,176, 82,161, 69, 82,212,195,130,188,252,126, -202, 66, 61,110,220, 12,199,168,145, 13,160, 51, 16, 96, 89, 18, 69, 42, 29, 64, 9, 65, 2,248,240,163,177,224, 8, 1,114, 51, -210, 64, 81, 84, 24,104, 26,111, 25, 22, 76,153, 50,165,223,215, 95,127, 93,111,238,220,185,152, 59,119,174,207,142, 29, 59,182, -253,240,195, 15,115,179,178,178,154,161,134,224,227,213,240,212, 57,125, 96,241,236,147,215,183, 22, 12,104,175,121,250, 78,163, - 98,203,215, 59,141,144, 43, 20,226,153,128, 66, 14,199, 85,116, 51, 10, 12, 12,236, 82,126,255, 31,195,203, 78,240,101,223, 77, -242,209,106, 80,207,163,111,171,150, 1, 95, 44,252,122,161,117,212,173, 16,204,255,118, 35,215,176,117,175,194,109,215, 31,234, -139, 44,235,246, 43,202,126,118,211, 84,125, 1, 0,125,187, 15, 69,243, 38,109, 95,249,177, 99,183,226, 96,237, 55,174, 60, 64, - 70, 86,170,201,141,109,137, 56,168,212, 39,203,148, 41,253, 47, 67,163,209,228,135,135,135, 59,167,164,164, 84,112,124,175, 91, -183, 46, 8,130,192,221,187,119,113,231,206, 29,140, 26, 53, 10, 2,129, 0, 66,161, 16, 87,175, 94, 53,203, 26, 83,206,186,244, - 4,197,179, 14,251,120,122,122, 86, 53,219,176, 70, 46,141, 70,131,130,130, 2, 92,184,112, 1, 13, 26, 52,192, 15, 63,252, 0, -119, 55, 23, 44, 92, 56, 27, 44,203, 66,169, 84,130, 97, 24, 83, 45, 90,108,169,181,136,101, 89,100,101,101,161, 94,189,122,216, -180,105, 19,214,173, 91,247,157, 66,161, 56,101,110, 26,189,188,188,236, 24,134,249,106,192,128, 1,189, 6, 15, 30,140, 62,125, - 42,198, 99,221,183,111,159,245,209,163, 71, 87,108,216,176,161,175,193, 96, 88,153,153,153,153,101, 10,239,111,191, 21,135, 95, -146,189,187, 20,243,135,215,193,152,105,187,177,118,237, 49, 72, 36,146, 10, 13,239,242,229,203,171, 21, 49, 44,199, 53, 20,101, -223, 74,155, 61,111,141,243,138, 21,193, 8, 14,206, 4, 73,146,112,115,115, 3, 73,146,120,241,226, 5, 72,146,132,143,143, 15, - 72,146, 68,106,106,106,169, 79, 96, 30, 42,153,245, 88,121, 47,156,132, 86,171, 69,114, 82, 2, 82,226, 98, 97,165, 76,135,220, - 70,134,188,136, 39,104, 62, 97, 98, 89,252,167,127, 24,127,232,245,250, 63,202,125, 95,115,250,244,105, 61, 65, 16, 31,160,216, - 79,163,212,162,241, 29, 77,211,223, 85, 69,242,238,187,239,182,252,250,235,175,133,165,225, 54,220,189,191,167, 13, 6, 3, 11, - 0,141,154,119,174,160,246,159, 61,123,134,181,107,215, 66,165, 82, 65, 36, 18,137, 76,185, 15, 44,203,150,205, 48,172, 76,132, -153, 35,178, 0,192,209,199,243,151,187,161, 87,153,199,113, 91, 53, 97, 49,231, 44, 20, 73, 36, 72,253,219, 43,178, 94,182,108, -121,122,122, 46,101, 89,150,227, 56,110,113,185,159, 36,222,222,222,215, 47, 94,188,232, 72,211, 52, 54,108,216, 96,151,158,158, -110,215,185,115,231,249, 0,170, 20, 90,149, 13, 19, 86, 54,156,136,114,179, 14, 37, 18,137,131, 94, 95,165,241,228,149, 89,135, - 12, 3, 63, 27,107, 59,228, 33, 5, 58, 39, 99,203,124, 71, 58,247,146, 98,226, 35,247,196, 86, 77, 44, 25, 99, 61, 82,169,135, -135,204, 14, 44,199, 85, 57, 53, 90,103, 52,158,123, 20,250,176,183,183, 87, 3,234, 84,208, 53, 12, 26, 50, 28, 58, 29, 9,173, -145, 0, 65, 9, 65, 80, 34, 52,107,222, 10,141,155, 54, 7, 7,224,193,189, 91,180,222,104,188,244, 54,149,189, 91,135,207, 71, - 17, 4,214,131, 99,185, 74,226,104,213, 27, 50,100,200, 10, 0, 95,212,196,227,252,238,231,163, 72,178,152,167,124, 28,173, 47, - 63,159,130,136,123, 66,219,107,161,171, 68,125,222,197,153,172, 96, 2, 50,233,255,102, 29, 10,201,215, 10,205,241, 95, 17, 92, - 53, 11, 45, 47, 47, 47, 59, 27,137,244,183,207, 38,124, 98,157,248,248, 54,210, 35,239,226,230,181,216,188,131, 71,143,229,170, -114, 50, 39,152, 33,178,202,134,249, 28, 93,235,160,174,255,171, 66, 75,106, 37, 7, 0,212,245,111, 11,202,210,214,220, 33,143, - 87,172, 89,181, 17, 89,229, 95,216,149,197,208,154, 60,121, 50,118,236,216,129, 14, 29, 58,160, 97,195,134,101, 47,123,115,173, -102,149, 88,151,204,158,109, 88, 30,133,133,133,240,241,241,193,246,237,219, 17, 22, 22, 6,107,107,107,140, 26, 53, 10,133,133, -133,101, 2,203, 84,103,120,142,227,158, 93,188,120,177,205,136, 17, 35, 56,161, 80, 72,228,231,231,195,206,206, 14,155, 54,109, - 82, 41, 20,138, 51,181, 16, 89,195, 69, 34,209,236,145, 35, 71, 82,141, 26, 53, 66, 70, 70, 6,108,108,108,140, 4, 65, 8, 1, -192,206,206,206,104, 97, 97,129, 41, 83,166,160, 69,139, 22,157,230,206,157,219, 65, 32, 16,108, 74, 75, 75,219, 93, 93, 93, 34, - 8,162,172, 65,157,176, 62, 26,122,125,113, 3,189,121,243,102,148,248,186,253,111,136, 32, 46, 14, 48, 97, 38,139,149,149, 21, - 26, 54,108, 88,105,217,119,234,212, 9, 15, 30, 60, 40, 30,154, 20, 8,224,236,236,140,155, 55,111,154, 52,147,170, 52, 16,100, -120,120, 56,252,235, 58, 33, 44,248, 34,156,100, 66,180,112,119,133,103,167, 46,136,141,141,253, 39,173, 89, 4,138,253, 48,122, -150,212,193,157, 0, 38,151,251,190, 9,192, 47,230, 16,210, 52,205,145, 36, 73, 36, 39, 39, 27,100, 50, 25,225,224,224, 32,144, - 72, 36,208,233,116,101,130,235,217,179,103, 8, 10, 10, 66, 74, 74, 10, 28, 28, 28, 72, 91, 91, 91, 24, 12,134, 60, 83,248,253, -252,252,224,234,234, 90,193,241,125,194,132, 9,181, 18, 89,227,128,128, 29,223,175,172, 35, 33, 41, 91,127,167,190,120, 30,253, - 66, 75,234, 33,253,255, 32,178, 0, 32, 63, 63,127, 27,128,109,165,223,157,156,156,198, 83, 20,181, 80,167,211,217, 94,189,122, -213, 78, 46,151, 19,187,119,239, 54, 46, 94,188, 56,159,162,168, 60,130, 32,126,254,231,197, 33, 34,179, 11,226,124,132,246,238, -236, 99, 45,119,107,102,242,252,198,121,194, 6,114,162,105, 0,134,100, 70,221, 24, 79,199,181,207, 80,164,147, 28,216,200,106, -222,193, 59,231,127,189,252,171,216,232,135,222, 82, 27, 41, 38, 79,249, 26,103,206, 95, 1, 65, 10,113,253,214, 93,232, 13, 12, -178,115, 11, 48,242,195,209,240,116,115, 66,228,157, 11, 89, 52,203,110,122,187, 68, 54,187,177,247,160,241,246, 18, 11, 89,201, - 61, 97,240,199,175,179, 65,146,235,177,100,201, 18, 4, 4, 4, 76, 11, 15, 15,255, 6, 53,196,209, 34, 8,118, 99,179, 46, 31, -218,139, 36,197, 60, 28,203, 96,251,225,249, 37,113,180,102, 97,211,182,163,205,154,214,125,190,172,186, 56, 90,111,145,200, 42, -191,175, 94,104,249,248,248, 72, 44,133,152, 36,164, 4,115, 63,251,104,176, 60, 51, 46, 2, 41, 81, 15,139,135, 23, 12, 26, 67, -250,211, 40, 83, 66,161,247, 68,197,248, 29, 92,117, 67, 87, 90,173, 73, 61,250, 10,156,165, 13,238,203,214, 44, 51, 69,214, 43, -156,229,197, 86,249,184, 89, 94, 94, 94, 88,177, 98,133, 41,113,180, 94,206,123, 41,250,160,216, 1,190,188, 51,124, 31, 19, 69, - 86,165,156,114,185, 28, 57, 57,197, 17, 18,186,118,237,138,174, 93,255, 55,159,193, 96, 48,148, 89,177,172,173,173, 43,179,104, -189,194,105, 97, 97, 49,255,216,177, 99,159,220,186,117,107,196,156, 57,115,132, 61,122,244, 40, 21,115,106,152,182,182, 91, 5, - 78,134, 97,166, 92,184,112,129, 98, 89, 22,219,183,111,199,131, 7, 15, 56,153, 76,182, 72, 38,147,109,180,176,176, 96, 52, 26, -205,228,137, 19, 39,142, 94,182,108, 25,217,169, 83, 39,220,190,125,155,172, 87,175,222, 88,160, 66, 16,203, 74,243,126,247,238, - 93,144, 36, 9, 58, 55, 9,211,230, 31,132,165,133, 0,209,209,209,200,205,205,125, 37,136,169, 41,247,179,188,165,164,116,235, -212,169, 83,217, 48,100,187,118,237, 64, 81, 20, 30, 61,122, 84,213, 48,108,121, 78,206,209,209,177,172,126,136, 68, 34, 92,185, -114, 5,223,126,251, 45,188, 29,236,144, 23, 21, 6,215,174,221,209,235,147,137, 24, 53,106, 20, 40,138,130,131,131, 67,153,229, -215,132,186,244, 58, 40,207,249,137,191,191,255,216,200,200, 72,207,102,205,154,185,133,135,135,119, 11, 8, 8,240, 9, 11, 11, - 43,253, 46,129,105,190, 57,101,156,247,239,223, 63,178,113,227,198, 41,227,198,141, 19,177, 44,203, 36, 38, 38, 26, 1, 16,174, -174,174,212,253,251,247,217, 83,167, 78, 65,163,209,192,211,211,147,244,240,240, 32, 46, 93,186,196, 70, 69, 69,221,229, 56,238, -107, 83,242,206, 48, 76,133, 48, 14,165,159,247,237,219,103,246,243, 94,167,177,223, 15, 61, 58, 55,242,202, 78,123, 4, 69,106, - 28,152, 2,185, 33,232,196,105,157,153, 34,235,175, 46,163,191,147,115,249,211,167, 79, 61,116, 58, 29,196, 98, 49, 54,111,222, -108, 88,177, 98, 69,100,118,118,118, 71, 84, 62,163,188, 2,103, 45,103, 29,230, 86,195,249,202,172,195,130, 28,156, 57,113,242, -126, 27,171, 33, 59, 49, 45, 45,171,204,177,145, 35, 8,135, 99, 46, 77, 58,202,218, 54, 75, 37,207, 46, 37, 11, 25,245,153,106, -242,174,215,232,245,195,135, 12,253,240,242,129, 3,251,173, 22, 47, 93,138,155,119,195,144,147, 95, 4,150,163,192, 18, 4, 22, - 46, 92, 12, 87, 39, 7, 40,211,158,170,117, 6,195, 16, 84,140,161,245,159, 47,119,130, 32,167, 95, 58,181,123, 61, 73,128, 85, -101,196, 72,168,194, 56,217,152, 81, 67, 4,195,135, 15,199,177, 99,199, 16, 30, 30,190,181, 26,145, 85,198,201,113,228,244,176, -171, 7,215, 19, 0,171,201,138,145, 8,138,158,203,198,126, 52, 68, 48,106,212, 40, 28, 15,186,133, 3,167,159,111, 57,112, 26, -167,241,118,195,252,200,240,214, 2,132,119,108,226,235,209,169, 85, 83,169,128,209, 32, 37, 42, 14,185, 42, 45, 46, 69, 36,230, -147, 28, 89,235,216, 58,197, 47, 72, 17,146,146,158, 86,210,179,146,150, 52,232, 90,179, 56, 73,146,172, 96,205,122, 29, 75, 86, -249,116,186,184,184, 84, 88,206,165,124,195, 93,234, 3, 84,139,208, 14,243,147,146,146,108,146,146,146,192,113, 28,238,222,189, -107,211,174, 93,187,249,175, 99,205,154, 61,123,118,153,213,234,229,125,101,199,106, 66,137, 83,250, 58,163,209,120,120,238,220, -185,211,218,181,107,215,123,233,210,165, 4,204, 88,128,247, 37,107, 14,205,178, 44, 66, 66, 66,112,236,216, 49,198, 96, 48, 76, - 82, 40, 20, 97,229, 78,217, 16, 26, 26,122,105,232,208,161,187, 99, 98, 98,168,200,200, 72,112, 92,205,243, 78, 53, 26, 13, 26, - 54,108, 8,154,166,177,106,154, 23, 10, 11,155,129,166,105, 48, 12, 3, 75, 75,203, 50, 43, 94,121,241, 92, 83, 61, 98, 24,230, - 21,161,117,247,238, 93, 80, 20,133,142, 29, 59,226,225,195,135,101, 22,173,154, 44, 80, 6,131, 33,201,197,197,197,101,249,242, -229,101,233,202,202,202,194,197,139, 23,241,238,123,237,209,100,210,100,164,165,165,225,231,159,127,134,187,187, 59,126,248,225, - 7,228,230,230,130,166,233,191,219,156,222, 47, 50, 50,210,243,163,143, 62,202, 12, 11, 11,243, 12, 10, 10,178, 11, 12, 12,180, -252,240,195, 15, 51,195,194,194, 60, 9,130,104, 15, 51,157,160, 89,150, 93,176,112,225,194,243, 63,252,240,195,252, 47,190,248, -162,221,184,113,227,132, 66,161,144, 77, 77, 77,165,247,239,223, 79, 52,108,216,144, 20,137, 68,196,133, 11, 23,216,123,247,238, -221,161,105,122, 21,128,235,230, 88,156,203,139, 44,138,162, 76, 21, 89, 21, 48,211, 89, 50,214,154,204,234,184,113,243, 10,178, - 81, 93, 79,195,158,253, 23,147,175,223,126, 26, 79,233,232,153,191, 85, 19, 26,224,109, 6, 69, 81,135,252,253,253,199, 79,159, - 62,221,162, 79,159, 62,146,101,203,150, 21, 20, 22, 22, 86, 37,178, 42,233, 48,255, 45,179, 14,127, 93, 48, 39,104,230,151,205, -198,251,126,234, 90, 7,193,170, 76,228, 9, 40,210,198,142, 68, 43, 31, 10,133,217,207,228,167, 47,239,122, 1,160,166,184,108, -247, 67,159,132,247,108,218,172,229,209, 85, 63,172,114, 94, 52,111,174,240,104,208, 57,112,180, 1,119,175, 94,133,149,136,225, -162, 66,131, 51,116, 6,253, 96,188,133, 75,240, 40,110,254,114, 0,192, 73, 7, 7,135,199,159,140, 27,215,208,223,255, 67,200, -100, 50, 28, 57,114, 4,127,108,216,192,172, 3, 70, 72,128,135, 83,106,136,167,151,121,167,140,231,209,196, 79, 62,241,107,213, -234, 83,200,100, 50, 28, 62,124, 24,187,215,173, 51,153,231, 63,142,210,200,240,103,240,191, 8,241, 53,248,104,145, 68,225,157, -167,137, 69,119,159, 38, 22,129,229, 56,150,227,116, 36,137,100,149,193,240,195,211,231,169,181, 18, 5,165, 67,135,223,125, 63, -253,205,141,121,148, 19, 63,181,157,210, 93,137,200, 74, 41,191, 70, 90,249, 70,186,170,207, 70,163, 49,197, 68,250,149,222,222, -222,175, 28,171,189,233,151, 51, 75,100,153, 26, 71, 11, 0,114,114,114, 20, 0, 22,221,190,125,123, 95,239,222,189, 39, 2, 72, -173,101, 25,109,239,210,165,203, 36, 0, 20, 65, 16, 91,211,210,210,194, 94,121,224, 21,138, 88,119,119,247, 31,235,214,173, 59, -185,184, 99, 74,108,175,161, 33,127,222,172, 89, 51, 67,101,101, 81,213,119,150,101,107, 44,163,252,252,124,180,109,219,246,149, - 53, 45, 57,142, 67, 98, 98, 98,169,197,169,236,222, 87, 39,224,138,138,138, 38,127,254,249,231,219,132, 66,161, 55, 0,162, 84, -228, 50, 12, 67,253,242,203, 47, 82,134, 97, 40, 0, 4, 73,146,180, 80, 40,212, 30, 59,118,140,166,105, 58, 73,167,211, 77,254, -155, 95, 16,135,137,226,165, 24, 84,145,145,145,141, 74, 44, 89, 41,225,225,225,143, 14, 28, 56, 32, 7,112,176,150,188,215,213, -106,245,245, 21, 43, 86,116,218,188,121,243,130,201,147, 39,183, 29, 53,106,148,160,107,215,174, 56,115,230, 12, 19, 18, 18,114, - 87,163,209,172, 52, 71, 96,149,148,101,129,151,151, 87,153,224,170,225, 89,174,214,145,215,209, 71,178,113,244, 84,119,233,246, -149, 23,139,178,211,244,183,140, 69,250,175,119, 1,225,248,127,140,140,140,140, 57, 0, 22,255,252,243,207,105, 45, 90,180,144, -136, 68, 34,189,169, 34,235,111, 4,205,230, 23,245,255,169,215,176,147, 93, 22,126, 94,183, 87,183,142, 50,175, 58,206, 30, 81, -113, 25,120,118,251,140,234,241,233,239, 19, 56, 93,222, 32, 0,166,120,174,223,211, 25, 12, 13,102,207,157, 61, 77, 44, 20,246, -102, 24,166,121,143, 75, 39, 56,138,162,194,244, 70,227,165,146,225, 66,237, 91, 92,228,223,253,248,227,143, 13,253,253,253,113, -228,200, 17, 92,218,187, 23, 35,179,179,113,133,162, 40, 82, 36,114, 60,109, 48,172,129,105, 2,233,187,181,107,215,250, 5, 4, - 4,224,208,161, 67,184,176,123, 55, 70,212,142,167,170,182,174, 13, 0,121,201,215,108, 0, 49, 0,222, 1, 96, 1, 64,135,226, -165,157,156,202, 55, 97, 37,191,149,254,126,141, 32,136,191,210, 17,182,230,200,240, 47, 35,252, 89,194, 59,111, 58, 21, 26,141, - 38,183, 97,195,134,102,205,185, 54, 26,141,213,142,225,210, 52,157,226,235,235,107,178,213,194, 20, 81,148,155,155,219,250, 47, - 44,140,215,242,197,170,208,136,176,108,130,155,155, 27, 91,218,232, 87, 38,194, 42, 59,198, 1, 47,204,249,159,244,244,244, 24, - 0, 95,214, 54,157,105,105,105, 71, 97,194,162,209,166,158, 7, 0,121,121,121,111,124, 49, 95,130,227, 82,151, 45, 91,102,150, -192, 6,199, 85, 39, 62,195,138,138,138,218,153,242,223, 6,131, 1,255, 32, 14,149,108,100,120,120,248, 68,130, 32,250,160,120, - 72, 96, 43,222, 76, 52,239,235, 74,165,242,250,234,213,171, 59,109,223,190,125, 38,199,113, 80, 42,149,235,204, 21, 88,101,189, -231,204,204, 51,111, 42,227,185, 25,250, 63,247,111, 77,233,174,201, 55,204,220, 81,164,223, 13, 30,101,198, 40,142,227,126, 31, - 51,102,204,187, 0,118,189, 46, 89, 21,179, 14, 95, 23, 47,216,188,130, 22, 87,102,127,251,201, 21, 59,235, 1, 96, 4,141,160, - 39, 79, 67,159,115, 6,192,111, 48,205,205,161, 44,191, 52,203,174,165,245,250,181,229, 26,151,255, 15,229,236, 16, 16, 16, 48, -115,252,248,241, 88,188,120, 49, 46,172, 89, 99,152, 74, 16, 5, 66,128, 59, 95,220,209, 36, 9, 96,158,169, 60, 99,199,142,197, -226,197,139,113,118,213,170,218,242, 84, 7, 57, 65, 16, 65, 0, 48,127,254,252,175, 87,172, 88, 97,191, 96,193,130,230, 43, 87, -174,252,161,228,123, 68,233,239, 37,109, 93,224,130, 5, 11,154,150,251,189, 16,192,253,191,248,126, 86, 26, 25,254,175, 70, 79, -158,147,231,228, 57,121, 78,158,147,231,228, 57,121,206,215, 1,199,113, 3,138,119, 85,239,171,250, 92,110,143,191, 57,205,197, - 19,161,248,142, 27, 15, 30, 60,120,240,224,193,227,191,136,242, 86,172,218,252,254, 6, 81,234,163, 85, 30,219,129,226,105,221, - 85,169, 82,115,102, 61,212, 70,217, 6,243,156, 60, 39,207,201,115,242,156, 60, 39,207,249,255,142,179, 38,238, 87,174,231, 56, -110, 0, 65, 16, 65, 28,199, 5, 86,181, 47, 21, 86, 47,127, 46,183,127, 99,110, 7,149,160,212, 55,171,204, 71,235,239, 10,217, -195,155, 85,121, 78,158,147,231,228, 57,121, 78,158,147,231,124, 45,148, 14, 1, 2,224,230,207,159,191,224, 95, 56,116,232, 86, - 34,178,202,182, 26,135, 14, 57,238, 48,149,154, 10, 27,177, 88, 38, 2, 0,189, 94,109,240,240,128,146, 32,134,255,147, 11,222, -242,248,111,162,116,186,119,198, 27, 62,151, 7, 15, 30, 60,120,252,255, 64, 86,169,165, 10, 64, 22, 0,162,228,187,190,100,159, - 85, 34,200, 94,254, 92,225,247,191, 16, 10, 84,225,252, 46,168, 74,100,101,103,203,156, 4,130, 60, 63,134,209, 54, 6, 0,129, -128,140,206,206,182,143,229,184,195,217,181, 17, 91, 78,206,206,161, 66,138,242, 48,229, 92, 35,195,164,102,103,100, 84, 12, 29, - 79, 16,111,131,192, 51, 85, 68,188,142,216,248,203,133,138,147,147,147,139,139,139,203,251, 54, 54, 54,239,229,231,231,223,203, -202,202, 58, 94,205,186,135, 43, 8, 2,115,139,235, 21, 86, 3, 88, 80, 13,181, 57,231,190,140,134, 50,153,108, 26, 65, 16, 1, - 37, 15, 88,184, 90,173,222, 12,224,233,255,195, 23,146, 5,128,193, 2,129, 96,172,147,147, 83,219,244,244,244,101, 0,106, 27, -205, 91, 0, 96,182,157,157,221, 72, 59, 59, 59,223,220,220,220,120,165, 82,121, 8,192, 90, 0, 53, 78,149, 94,246,133,219,123, - 93,251,116, 93, 20,114, 33,228,187,101, 27, 20,183, 95,249,125,182,155, 99,239, 94, 29, 22,135,156,190,181,252,235, 77,105,185, -102,166,141, 44,217,128,226,217,145, 28, 94, 13,246,250,186, 16, 2, 24, 8,160, 43,128, 16, 0,167, 77,201,119, 21,120, 23,192, -215, 37,105, 94, 11,224,202,191,188, 30, 89,186,184,184,172, 2, 48, 80, 32, 16, 68,166,166,166, 78, 2,144,242, 15,167, 73, 0, -160, 13,128, 0, 20,135,225,184, 15,211, 66, 56,212, 8, 71, 71,199, 64,129, 64, 48,173, 36,180,203,230,156,156,156,160,127,107, -193,136,197,226,117,174,174,174,159,106, 52, 26, 53, 65, 16, 92,249,120,143, 52, 77,167,100,103,103,183,126,219, 94,106, 4, 65, -220,255,151, 39,113, 82, 37,199,170,142,163,149,154, 10, 27,129, 32,207, 47, 51, 61,108,100,154,226,201, 8, 0,112,119,107,126, -200,217,181,217,193,212, 84,177,193,181,209, 16, 43,161, 76,176,153,162,132, 45,181,122,157,147, 80, 32,204, 54,208,198, 71,164, -158,155,150, 30,115,188,210, 96,139, 66,138,242, 72,136,189,226, 76, 27,114, 33,148,186, 67,104,225, 93,101,106,221,221,221,107, -149, 75,123,123, 95,107,131, 68, 58, 83, 40,164,122,177, 28, 29,192,177, 0, 73, 8,195,105,198,120, 89,164,211,253,148,151, 23, - 95, 88,219, 59,216,200, 17,174, 28, 48, 10, 4,122,129,195, 37, 2, 56, 16,147,131,116, 51, 40, 76, 21, 17,175, 35, 54,202, 95, -251, 51,128, 57,111,186, 38,121,120,120,216, 7, 6, 6,174,251,246,219,111, 45,172,172,172,136,164,164,164, 62,243,230,205,235, -252,224,193,131, 47, 83, 83, 83,211, 94, 22,125, 4,129,185, 44,203,145, 0, 64,146,196, 60,185,220, 89, 70, 81,212, 43,177,141, - 24,134,145,101,101,101, 78,103, 89,142, 40, 57,119, 46,199, 97,189, 41,130, 81, 42,149,126, 24,208,172,229,151,171,126, 92,107, -229,226,236,108, 73, 51,172,225, 69, 98,130,108,209,252, 57,237,226,158, 61, 93,175,213,106,247,215,230,185,166, 40,106,164, 68, - 34, 9, 4,224, 95,114, 44, 74,167,211, 5, 49, 12,115,208,212, 6,221,197,197,229, 26, 69, 81,117,204,249, 99,134, 97,146, 50, - 50, 50, 58,214,178,136,134,123,123,123,255,214,165, 75, 23, 89,219,182,109, 33, 22,139,177,120,241,226,217, 10,133,162, 38,161, - 37, 0, 48, 91, 38,147,141,180,180,180,244, 45, 42, 42,138,211,104, 52, 71,197, 98,113,207,245,235,215,123,117,232,208,193, 58, - 35, 35,131,160, 40,202,229,236,217,179, 31,175, 91,183,174, 15, 77,211, 61,106,106,228, 10,226,184, 69,146,129,254,157, 10,226, -174, 44, 2,208,239,229,223,105,173,116, 44, 71,121, 5,106,184,135,201, 37,226,195,100,145, 37, 20, 10,215,187,186,186,142,215, - 22,199, 10,224, 94,110,112, 0, 64,175,215,231,229,231,231, 55,170,205, 35, 15, 96,130,157,157,221,248,175,190,250,202,190, 95, -191,126,216,187,119,239,103, 59,118,236,200, 83, 42,149,191,163, 56, 16,102,140,153,156,115,211,211,211,251, 11,133, 66,194,203, -203,139,210,104, 52,230, 8, 45, 63, 20, 47,194,124, 31,192,102, 20,135, 46,232, 6, 20, 63,239, 0, 86,151, 10, 55,146, 36, 55, - 55,106,212,232,253,168,168,168, 45, 0,190,171,237,179,238,234,234,186,109,211,166, 77, 35, 6, 13, 26, 68,101,101,101,121,180, -104,209, 98, 95,122,122,122,167, 55,240, 26,249, 68, 34,145,204,106,222,188,121,147,152,152,152, 88,165, 82,185,182,228,126, 86, -247, 76,121, 2,232,105,103,103,215, 99,225,194,133, 86,129,129,129,216,190,125,123,255, 29, 59,118, 20, 21, 22, 22, 94, 70,177, - 79,207,107,137, 64,129, 64, 48, 45, 37, 37,197,137,227, 56,184,185,185, 77, 3,240,175, 20, 90, 36, 73,174, 31, 58,116,232,248, -125,251,246,201, 18, 18, 18,100, 30, 30, 30,101,193,179, 9,130,168,117,251,201,227,181,177,189,156,224,170, 57,142,150, 88, 44, - 19, 49,140,182,113,154,226,201,136,206, 93,126,177, 5,128,107, 87, 63, 31,225,236,218, 52, 92, 44,150,197, 74,108,164,199,134, - 14,236,217,114, 88, 96, 23,194,211,205, 25, 41,138, 76,151, 95, 15, 92,232, 27,116,225,202, 49, 20, 7, 16,171, 20,180, 33, 23, - 22,134, 96,196,220,216, 0,167,174,105,216,120, 54, 5,183, 31,191,128,186, 32, 27,117, 92, 45,240,227,204,222,112,181,151,213, -174,235,229,220,176, 27, 45,144, 28,252,232,195, 49,182,239, 15,246, 23,250,184,186,130,227, 36,136,141, 43,106,127,238,226,149, - 54, 71, 15,239,159,102, 41,108, 56, 82,149,249,212,228,151, 91, 43, 55, 88,168, 12, 24, 44,160,136,143, 59,180,110,210,227,195, -254,157,200, 38,254, 13, 16, 25, 17,213,251,228,159,119,127, 36,111, 69, 92,166, 25,110,143,165, 8, 39, 30, 42,170, 13,232,247, -138,224,232,209,163,103, 39,137, 68, 82, 33,120,146, 78,167, 19, 93,190, 28,252,110,109,196, 70,233,127,232,245, 58, 82, 40, 20, -131, 36,137, 47, 3, 2,154,249,103,103,103, 95, 33, 8,226,183,180, 52,243,172, 5,159, 3,226, 60,129,224, 29, 82, 34,113, 99, -244,122, 71, 0, 32,196,226,188, 23, 36,217,108,225,215, 95, 91, 81, 20,197,230,228,228, 64,173, 86, 19, 19, 39, 78,148,198,197, -197, 13, 77, 77, 77,221, 80, 67,143, 4, 59,118,236,240,115,115,115,123,101,245, 88,133, 66, 33, 30, 52,232,253,218, 20,189, 95, -243, 22,173,102, 93,184,112,222, 95,153,155,167,221,241,243,182, 80,163, 84,166,171,231,223, 72,184,121,251,110,219, 73,227, 71, -127, 30, 29, 29,241, 8,230,173, 87,231,109, 97, 97,113,108,205,154, 53, 1,221,186,117, 19, 58, 59, 59, 35, 35, 35, 3, 81, 81, - 81, 1,127,254,249,231,224,221,187,119,207,214,104, 52, 67, 1,147, 22, 68,109,120,121,207,111,206,150, 14,142, 96,140, 70,184, - 55,111, 85,230, 32,249,236,207,139,160, 13, 6,176, 70, 35,252, 3, 7,151, 88,147, 57,248,251,251,215, 54,234,174,123,211,166, - 77,255,248,225,135, 31, 68, 58,157, 14,119,239,222,197,149, 43, 87, 88,133, 66, 81, 83, 64, 92, 1, 65, 16, 23,151, 46, 93,234, -217,177, 99, 71,235,236,236,108, 48, 12,227,116,226,196,137,105, 45, 91,182,180,241,242,242, 18,239,217,179, 7, 69, 69, 69,160, -105,218,193,215,215,215,225,195, 15, 63,212,239,217,179,103, 54,128, 85, 85, 89,178,148,113,220, 34, 5,225,219,183,209, 59, 99, -145, 78,156,239, 59,171, 47,206,217,212, 39,202, 44, 91,125,125,125,173,149,169,178,121, 86, 54,205, 28,148,169,193,243,250,250, -250,238, 56, 31,111, 82,103,136, 44,105,108, 62, 58,112,224,128, 44, 42, 42, 74,230,239,239, 15,150,101,203, 34,240,151, 6,156, -109,216,176, 97,109,238,227,202, 41, 83,166,204, 27, 49, 98, 4,154, 55,111, 94, 22, 20,117,201,146, 37,152, 55,111,158,253,181, -107,215,102,239,223,191,127,246,241,227,199, 87, 1,152,111,166, 53,166, 20,230,150,241, 55,207,159, 63, 31,126,236,216,177,209, -115,231,206,109, 8, 96, 58,128,197, 57, 57, 57, 93, 74,172, 49,226, 18,161,245,201,236,217,179,167,206,159, 63, 31,253,251,247, - 95,124,247,238,221,239,107,105,229,163,104,154,238, 63,104,208, 32,202,104, 52,194,210,210, 18, 70,163,177,254,235, 26, 37, 0, -108,154, 60,121,242,212, 41, 83,166,192,222,222, 30, 70,163,209,239,192,129, 3, 59, 22, 47, 94,252, 30,128, 9, 85,164,117,236, -212,169, 83, 63, 24, 51,102, 12, 90,183,110, 13,129,160,248, 54,174, 89,179, 6,203,151, 47,183,186,120,241,226,224, 61,123,246, - 12, 62,121,242,228, 81, 84, 92,182,203, 44,176, 44, 11,129, 64,128,228,228,100, 56, 59, 59, 75, 88,150,189, 64, 16,196,246,220, -220,220,227,255,162,198,124,245,240,225,195, 63,218,183,111,159, 21, 0,252,248,227,143,152, 53,107, 22, 92, 92, 92, 96,101,101, -197, 75,157,127,143, 69,107, 82,141, 22,173,154,160, 86,171, 91, 45,248,226, 99,144,100,113,175,177, 65, 61,111,172,248,122, 18, -113, 50,232, 66,171,106,109,240, 82,119,196,220,216, 0,137,215, 76,232,140, 52,238, 60,126,142, 75, 63,246, 41,110, 45,251, 45, -132,206,208,163,180,177,113, 16, 91, 88,172,214, 51,204, 77,184,186,222, 69, 98, 98, 86, 77, 34, 75,238,234, 18,180,117,235, 42, -139,128,250,141, 96,160,141, 72,205, 76, 5, 65, 72,224,233, 97,141, 79,198,246, 19,118,233,226,238,244,205, 55,219,206,164,179, - 24,162,206,126, 90, 99,192, 80, 63, 39,236,106, 21,208,112,196,135, 3, 58, 74,154, 5, 52,133, 72, 98, 81,246,219, 59,173, 91, -227,157,214,173,201,249, 69,133,189,238,221, 15,237,117,228,226, 29,157,218,152,120, 40, 54, 27,227,106,120,201,148, 9,142, 25, - 51,102,192,197,197,165,194, 9, 25, 25, 25,248,243,207,203,149, 94, 99,198,139,172,236, 63,190,255,254,123,235,188,188,188,126, - 59,119,238,236,206,178,236,247,233,233,233, 55, 76, 33, 25, 3,212, 41,144, 72,122,140, 95,187,150,109,249,254,251,148,157,171, - 43,201, 50, 12,145, 22, 31,239,248,243,134, 13, 93,115,159, 61,179, 80, 57, 56,228,230,105, 52,234,216,216, 88, 72,165, 82, 66, - 32, 16,180,169,132, 42,131,227,176,154, 36,137,121, 4, 65, 64, 34,145,198, 78,153, 50,229, 97,201,111,117, 78,159, 62, 45, 27, - 56,112,160, 26, 64, 2, 0, 72, 36, 82, 15,138, 34,253,138, 29, 8,177,218, 20,129,105,105,105,249,197,119, 63,172,178, 84,230, -230,107, 12, 42,149, 81,110, 99, 69, 16, 86,214,148,178,160,176, 48, 85,145,165, 91,184,108, 57, 53,249,147, 49, 95,168, 84,170, -105,166,138,172, 22, 45, 90,220, 59,118,236,152,179,163,163, 35,242,243,243,145,147,147,131,123,247,238,129,101, 89, 12, 29, 58, - 84,210,190, 93,219, 86, 95, 47, 92,116, 59, 57, 53,245, 61, 83,196,150,165,131, 19,126,236,216,178,184,177, 78,200, 41, 43,159, -237,195, 3,203,206, 89,158, 82, 80,106,157,123,157, 37,164,222,235,209,163,135, 8, 0, 38, 76,152,160, 44, 44, 44, 92, 1, 96, - 31,106,142,232, 63,123,209,162, 69, 30,245,234,213,243,217,183,111, 31,138,138,138, 0,192,185, 94,189,122,240,243,243, 99, 66, - 66, 66,224,231,231, 7,107,107,107, 92,187,118, 13,183,111,223, 70,235,214,173,173, 69, 34,209, 8,131,193, 80,169,208,234,218, -167,235, 34,201, 64,255, 78,141,222, 25, 11, 43, 27, 55,236,216,127, 16, 49,161,187, 59,233, 12, 81,139, 68,204,213, 49, 26, 78, - 50, 46, 43,201,106,126,157,214, 93, 28, 27, 52,125, 31, 62,239, 60,116,210, 50,215,159, 47,234, 85,111,165, 64,170,221,189,108, -173, 34,167, 42,145, 5,224,199,161, 67,135, 14, 63,112,224,128, 29, 0,132,133,133, 33, 35, 35, 3,114,185, 28, 82,169, 20, 66, -161,176,108,125,210, 90, 98,220,230,205,155,203, 68, 27, 77,211,101,171, 0,200,100, 50,116,238,220, 25, 45, 91,182,196,241,227, -199,199, 85, 33,180, 58,182,107,215,110,175,143,143,143, 87,249,131, 42,149, 10,163, 70,141, 2, 0,116,233,210,165,135,133,133, - 5, 87, 42, 8, 21, 10, 69,209,253,251,247,123, 1,184, 91,133,178,212,164,166,166,226,171,175,190,194,139, 23, 47, 62,219,186, -117,107, 34, 0,169, 88, 44, 46,235, 31, 3,240,107,218,180,233,250, 89,179,102, 33, 46, 46, 14,145,145,145,247, 80,251,161, 84, -198,210,210,242,153,209,104,108, 77,211, 52, 52, 26, 13,134, 12, 25, 34, 61,122,244,104, 6, 69, 81,209,217,217,217,163, 81,236, -147, 98, 42,164, 0,214, 78,153, 50,101,234,220,185,115,113,249,242,101,156, 60,121, 18, 99,198,140,193,204,153, 51, 97,101,101, - 53,126,230,204,153,183, 81,188,160,249,203,232,177,121,243,102, 48, 12,243,202,179, 33,149, 74,209,177, 99, 71, 52,105,210, 4, - 39, 79,158,236,241, 26, 66,203,167, 99,199,142, 98,150,101,161, 82,169, 16, 18, 18, 98,101, 97, 97, 97,229,233,233, 57, 17,192, -191, 70,104,249,248,248, 76, 57,112,224,128, 85,249,209, 31,137, 68,130,114,245,128,199, 63,111,209,170,182,135, 85, 6,189, 94, -109, 16, 8,200,104,119,183,230,135,174, 93,253,188,108,232, 16, 32,163,245,122,181, 1, 0, 24,150,131, 82, 77,195, 66, 66, 34, - 33,189, 16, 17,241,217,149, 81, 85,152,162, 41,180,240,134,164,109, 2, 56,142,131,222,192, 64, 87,144,142, 21,103,212,136, 74, -209, 66,175,202,131,222, 80,236,134,229,228,228, 36,184,112,225,220,172,224,224, 63,167,254,254,251,239, 84,138,173,109,100, 33, -208,170, 50, 78,123,123, 95,107, 86, 44, 62,180,101,235, 98, 11,142,138, 71,108,146, 10, 13, 60,219,194,201,206, 11,233,217, 42, -220,140, 60,139,232,167, 65,168,231,230,131,153, 95,244,149,126,247,195,190,131, 34,186,174,119,126,254, 11,101, 85,233, 44,237, - 69,109, 59, 31, 11, 58, 55, 30, 76, 78, 28,152,194,180, 87, 78,176,146,123,227,157,110, 30,144,123,213,151,140,155,185,124, 44, - 80, 65,104,149,231,204, 32, 8,114, 11, 73, 18, 83, 9,130, 64,243,230, 45, 82,214,174, 93, 91, 89, 40,112, 67,243,230, 45, 82, - 40,138,244, 44,126,177,147,155, 57,142,205,168, 33,157, 21, 68,141, 88, 44,153, 91,108,246,119, 75, 62,115,230,140, 97,248,240, -225, 88,179,102,141,120,222,188,121, 11, 41,138,154, 80,201,240, 94, 5,206, 33,128,183, 93,253,250,189,191,191,121,147, 19, 26, -141, 68,238,189,123,202,124,133,130, 78, 47, 44, 20, 31,142,142,238,255,233,156, 57, 98, 47, 47, 47,220, 8, 10,114,204, 82,169, -184,124,157, 78,147,159,159,207,209, 52,125,175, 10,206, 5,114,185,179,108,199,142, 29,126, 83,166, 76,121,168, 80, 40, 22, 0, -128,155,155,219, 10, 0, 77, 0, 36,148, 59,134,173, 91, 15,166, 78,156, 56, 49, 54, 51, 51,115, 65,117,233, 44,135,166,206,114, -103,217,254,109,123,158, 56, 88, 91,144,114, 79,119, 82,104,103, 39,160,197, 22, 34, 22,208,212,243,170,111, 9,160,105, 21,215, -190,204, 73, 88, 88, 88, 28, 59,117,234,148,179, 80, 40, 4,195, 48,144,203,229,120,241,226, 5,242,243,243, 81, 88, 88,136,231, -209, 81,168,235,229,133,111,230,207,115,155, 62,111,254, 49,181, 90,221,250,165,198,236,213, 5,144,141,134, 87, 44,123,149,173, - 98,240,242,176,151,137,229, 94, 30, 47,146,146,146, 96,101,101,133,128,128, 0,171,155, 55,111, 94,175, 70,100,149, 95, 4,120, - 68,135, 14, 29,172,247,237,219,135,214,173, 91,195,214,214, 22, 33, 33, 33, 8, 11, 11,131,193, 96, 32,139,138,138, 96,101,101, -133,149, 43, 87,194,219,219, 27,133,133,133, 72, 72, 72,112, 20, 10,133, 78, 47, 69,180, 47,227, 12,185, 16,242, 93, 65,220,149, - 69,233,196,249,190, 59,246, 31,196,196, 15, 71,194,149,139,191,110, 91,159,248,174,247,192, 14, 75, 56,202, 43,208,210,186,185, -125,195,128,129, 16,137,173, 48,125,238,114,196,134,159,182, 87, 23, 62,249,140, 96,146,189,150,173, 61, 60,163,146,188, 19, 0, - 72, 47, 47,175, 79, 15, 31, 62,108, 93,102,122,161,168,178, 53, 15,203, 47, 2, 95,205,130,239, 53,222, 79,130, 32,240,226,197, - 11, 56, 59, 59,195,202,202,170,108, 1,241,168,168, 40,220,185,115, 7,165,171, 81, 84,193, 57, 58, 56, 56,216,203,210,210,178, -194, 9, 28,199, 33, 59, 59, 27, 52, 77, 67, 38,147,129, 97, 24, 24, 12, 6, 24,141, 70,104,181, 90,171, 38, 77,154, 76, 51, 26, -141,119, 43,227,100, 89,246,203, 17, 35, 70,116,184,123,247,174,239,134, 13, 27,160,215,235,127, 76, 79, 79,199, 7, 31,124, 0, -150,101,209,163, 71,143,119, 57,142,139, 89,184,112, 33, 0, 96,214,172, 89, 70,149, 74, 53,165, 54,121, 47, 65,147,119,222,121, -199,247,242,229,203,232,212,169, 19,116, 58, 29,214,172, 89, 99,179,117,235, 86,155, 61,123,246,200,231,206,157,251, 91, 86, 86, - 86,159, 26, 56, 9, 0, 63,186,186,186, 78,237,218,181,171, 69,201, 26,166,216,189,123, 55,190,249,230,155, 3, 0, 22,158, 59, -119,110,233,201,147, 39,199,126,250,233,167,248,230,155,111,102,230,231,231,239,172,138,243,249,243,231,144,203,229,176,177,177, - 41,126, 89, 26, 12,120,244,232, 17, 46, 93,186,132,198,141, 27,155,146,167,170,210,233, 51,116,232,208,223,246,239,223,111,157, -156,156,140,107,215,174,161,110,221,186, 80,171,213,166,172, 13, 27,252, 23, 52,216, 85,114,106, 52, 26,109, 82, 82,146,213,170, - 85,171,224,230,230, 6, 31, 31, 31, 72,165, 82, 16, 4, 1,163,209, 88, 93, 56,129, 26,211,217,165, 11, 4,217,169,246,131,108, -237,236, 63,227, 56, 78, 80, 80,144,183,205,128,252, 35,241,241,208,255,141,121,255, 47,163, 21,128,135,168,184,230,161,162, 76, -104, 5, 5, 5,113,129,129,129, 68,233,222,195, 3,202,236,108,251, 88,103,215,102, 7,157, 93,155,150,172,251, 69, 70, 83,148, -125,172,139,139, 90, 9, 0, 6,154,195,173,232,124, 60,121,150,142,176,103,233,176,148,152,102,124,209, 25,232, 98,143, 85,142, -131,182,232,127,157, 86,131, 58, 15, 58, 67,177,187,135, 94,167, 70, 65, 86, 36, 49,124, 72, 47,233,212,169,147,225,230,230, 33, -175,138,207, 32,145,206,156, 62,171,191,157,131,157, 16, 65, 55,207,227,221,198, 67, 32,149, 8,145, 83,160, 5, 8,224,105,252, - 37,128,181, 70,120,108, 18,218, 53,149,161, 79,111,127,171,227, 71, 98,230, 0, 88,108, 74,122,233,148,123, 16, 53,236, 7, 33, - 99,132, 49, 59, 6,108,126, 34, 96,233, 10, 13, 97,133, 28, 69, 34,162,175, 31, 53,169,207,200,178,236,103, 78, 78, 78,249, 11, - 23, 46,236,218,160, 65, 3,195,180,105,211, 30, 39, 38, 38,126,249, 82,111,229,167,205,155, 55,227,217,179,103,169,223,127,255, -125, 72,118,118,246, 34, 51, 11,122, 62,199, 97, 93,201, 80, 92,246,137, 19, 39,222,185,122,245,234,204,117,235,214,185,124,254, -249,231,226,207, 63,255,252, 19, 0,223, 86, 55, 92,168,148, 72,122,126,127,237, 26, 71,167,164,232,254,248,229, 23,241,166, 91, -183, 22, 26, 88,214,221,201,217,153,104,223,174,157, 74, 70,146,217, 57, 25, 25,180,220,215,151,122,113,233,146, 35,103, 97,145, -118,238,220, 57,101, 81, 81, 81,149, 75,231, 80, 20,165,174,108,184,176, 50,184,185,185,233, 43,243,225,170,166, 65, 84,178, 28, -103,176,171, 87,143,235,221,227,189, 6,207, 98,226,227,165,118,118, 84,195, 6,117, 27, 69, 68,191,184,199, 49,140,150, 32, 8, -165, 73, 99, 37, 20, 53,114,221,186,117,205,108,108,108,192,178, 44,108,109,109,145,149,149, 5,189, 94, 15,165, 82, 9,125, 97, - 1,244, 5, 5, 8, 75,124,129, 14, 93,187,226,255,216,187,234,240, 40,174,246,123,102,125, 55,187,113, 23, 8, 16, 8, 16, 8, - 4,183, 64, 8, 78, 9, 20,247,162,133, 82,130, 67, 9, 80,138, 20, 8, 45,238, 78,113,183, 18, 92,131, 4,143, 19, 72, 32, 46, - 27,247,245, 29,249,253, 17,105, 8,145, 77,160,223,239,251,218, 61,207,179,207,202,204,156,189,115,239,157,185,103,222,247,189, -239, 29,209,175,143,203,177,203,127,142,162, 40,234,116,149,254,188,150,173, 75, 45, 89,171,235,153,255,229, 11, 74,204, 45, 21, - 93,191,181,118, 6, 79, 34, 65,239,249, 62, 95,114,161, 7, 94,187,118,237,250,208,161, 67,191, 89,184,112, 33, 75, 42,149,222, -140,141,141,237, 2,224,109, 85, 7, 73, 36,146,134,153,153,153, 40, 44, 44,132,177,177, 49,182,110,221, 10,107,107,107,200,229, -114,188,122,245,138,113,112,112, 32, 30, 62,124, 8, 7, 7, 7,100,101,101, 65,163,209, 64,161, 80,164,170,213,234, 74,221,229, -197,238,193,254,243,250,225,198,251, 55, 71,187,218, 19, 49,175, 70, 46,240,248,240, 62,244, 93,194,237, 59, 79,127, 37,149,194, -196,220,164,187,139, 27,180, 11,180,152,185,104, 21,118,110, 88,129,247, 47, 30,101, 91,215,205,223, 37, 34, 84, 71,170, 42,175, - 76, 38, 83,190,123,247,206, 48, 56, 56, 24, 4, 65,192,216,216, 24, 6, 6, 6, 21,138,173, 90,128, 85,214, 2, 37,147,201,192, -227,241, 96,110,110,142,131, 7, 15,150, 14,188,245,235,215,175,138, 99, 95,239,222,189, 71,213,173, 91,215,176,236,143,237,218, -181,195,244,233,211,177,103,207, 30, 4, 4, 4,124,178,158,102,106,106,170, 84,171,213, 86,117,222,185,105,105,105,253,134, 12, - 25,242,230,241,227,199, 70, 7, 15, 30, 4, 73,146, 21,190, 14, 28, 56,128,231,207,159, 47, 7,240,174,150,253,168,233,176, 97, -195, 30,157, 56,113,194, 36, 35, 35, 3, 37,125, 67, 38,147,129,162, 40, 52,105,210,132, 32, 73,178,186,184, 55, 22,155,205,190, -188, 99,199,142,129,223,127,255, 61, 56, 28, 14,212,106, 53,118,236,216,129,197,139, 23,167, 21, 63,148,106, 0, 44, 59,114,228, -200,132, 65,131, 6,193,205,205,205,229,193,131,202, 35, 59, 10, 11, 11, 81, 88, 88, 8, 46,151, 11, 27, 27, 27,172, 89,179, 6, -106,117,209,109,165,113,227,198,165,151, 49,128,125,141, 27, 55, 30, 24, 25, 25,185, 17, 69,177,107,159,193,198,198,102, 8,195, - 48,211, 40,138, 42,232,218,181,171,249,169, 83,167, 12,147,147,147,241,230,205, 27, 44, 95,190, 60,135,166,105,138,166,105, 66, -161, 80,196, 88, 89, 89,189, 17, 8, 4, 34,185, 92,158,157,149,149,181, 14,192,205,255,175,145,156, 32, 8,130,203,229, 98,202, -148, 41,224,112, 56, 16,137, 68, 80, 42,149,208,106,181,165, 98, 30, 53,116, 75, 55,106, 36, 49,231,128,247,189,169, 97,179,185, - 35,230,120, 89,218,218,217,195,196, 72,128,136,136,183, 93,238,223,187,179,131,207,121,191,151, 86,107,247,190,143,203,251,219, - 23,187, 47,175, 69,254, 71,133,214,103,107, 30,114, 42,110,204, 17, 20,195,156,203, 76, 78,230,107,248,124,131,200, 18, 43,151, -181,181, 60,159, 32, 70, 80,150,205,191, 5,169,209, 22,223, 40,152,226,151,142, 66, 75, 75,225,195,251, 48, 60,190,253, 39, 44, -228,201,200,140,105, 5,240, 90, 64,173,200,131, 82,173, 41, 22, 37, 20,130,223,220, 67,126, 94, 54, 92,219,122, 1, 44,214,243, -202,248,140,205, 9,175,206,109, 90,178, 63, 36,132,161, 93,227,225,112,114,232,138,120,105, 62,114, 11, 85,200,201, 87,162,149, -171, 15, 50,114, 20,200,151, 43,241,246,195, 49,216,219, 57,177, 8, 78,116, 79, 93,133,150,234,237, 69,168,222, 93, 1,207,177, - 11,248, 77, 6,129,237,232,142,132,144, 7, 8,190,177, 5, 73,225, 79,192,208, 20,108, 27,183,215,245, 34,217,113,243,230,205, -246, 93,186,116,225,244,234,213,203,237,250,245,235,110, 82,169, 52,184, 88, 96,184,245,234,213,203,205,210,210, 18,219,182,109, - 83, 16, 4,177,163,150,141, 93,106, 1, 75, 79, 79,127, 9, 96,237,197,139, 23,119, 76,159, 62, 29, 86, 86, 86, 45, 82, 82, 82, - 42, 61, 48,131,203,117,155,184,110, 29,195,101,179,153,211, 59,119,242, 86,221,188,185,233,143, 35, 71,120, 61, 60, 61, 9,134, - 97, 16, 20, 20,100,240,219,206,157, 6, 99,191,253, 54, 46, 62, 61,157,244, 15, 8,208, 72,147,146, 10,210,101,178, 85, 82,169, - 52,245,255,163,103,107,181,218,103, 49,177, 49,246,109, 59,180,178, 12,140,136, 9,239,219,163,115,103, 22,139,197,122, 31, 29, - 31, 96,105,105,100,112,231,246, 29,141, 86,171,125,166, 11,151, 64, 32,240,234,209,163, 7, 39, 39, 39, 7,118,118,118,200,200, -200, 64,114,114,114,145,197, 33, 47, 7,154,188, 60,104,243,115, 65,201, 10, 17,243,234, 37, 90, 57, 53, 16,156, 19, 8,188,228, -114,121,149, 66,171,228, 41,179,162,133,174, 75,126,227, 27, 26,130, 47,145,128,168,185,219,240, 91, 19, 19,147,197,185,185,185, -215, 1,172,209,104, 52,222,139, 23, 47,110,183,125,251,118,139,181,107,215, 26, 77,155, 54,237, 92, 97, 97, 97, 43, 20, 45,170, - 90,217, 0,246,145, 36, 73,115, 0,214,247,238,221,131,149,149, 21,242,242,242, 74, 44, 45,106,185, 92, 46,204,202,202,130, 74, -165,130, 90,173,134,145,145, 17, 94,191,126,157, 77,146,228,213,234, 10,103,212,144, 88,163,210, 68,252,108,238, 34, 78,209,144, -166, 30,233,217,116,206,202, 77,210,213, 0, 54,245,115,114, 58,160,161, 31,197, 68,133, 93, 53,141,125,245, 48, 59, 37, 74,230, -116,240,122, 76, 85, 49, 90, 12, 0,154, 32, 8,166,113,227,198,200,200,200, 0,155,205,134,129,129, 1, 36, 18, 9,150, 44, 89, -130, 29, 59,118,212, 70,104, 9,197, 98,241, 58, 22,139, 53,138,197, 98, 89, 82, 20, 5, 31, 31, 31, 12, 28, 56, 16,124, 62, 31, - 26,141,166,212,162, 89, 98,165,170,198,210, 17,244,252,249,115,163,231,207, 63,185,109,121, 90, 88, 88,220, 87,169, 84,136,142, -142,198,229,203,151,187, 3,240,175, 97, 91, 71, 7, 5, 5,245,115,119,119, 63,218,166, 77,155,134, 12,195,160, 69,139, 22, 24, - 61,122, 52,142, 29, 59,134,224,224, 96,228,229,229,209,119,238,220,249, 3,192,198,154,142,225,197,245,219,100,216,176, 97, 79, - 78,158, 60,105,154,149,149, 5,133, 66, 1,153, 76,134,115,231,206,161, 75,151, 46,176,176,176,192,137, 19, 39, 72,134, 97,170, -106,123, 22,139,197, 58,184,119,239,222,129, 83,167, 78,197,174, 93,187,112,250,244,105, 12, 26, 52, 8,163, 70,141, 66, 70, 70, -134,245,134, 13, 27, 38, 20,187, 9, 87,140, 30, 61, 26,133,133,133,120,245,234, 85,132,142,215, 60,114,115,115,145,155,155, 11, -145, 72, 84,246, 26, 35, 0, 28,219,178,101,203,152,185,115,231,194,201,201,105, 69, 76, 76,204, 22, 84, 48, 75,148,166,233, 31, -146,147,147, 77, 57, 28,142, 57, 73,146, 72, 76, 76,196,235,215,175, 49,115,230,204,236,236,236,236,233, 0,226, 1, 44,155, 50, -101,202,154,249,243,231,151,246,165,249,243,231,251, 93,191,126,189,223,127,218,154,211,184,177, 73,115, 62, 91, 48, 39,167,128, -109,158,147,147, 83,122,239, 80,171,213, 80,169, 84,159, 88,178,120, 60,174,121,187, 86,117,175, 41,228, 5, 75,223, 70,229, 86, -186, 64,186, 75, 67,227,150, 6, 98,227,185, 93,186,246, 24,215,167,223, 96, 54,169,213,226,214,173,171, 56,116,104, 55, 60,221, - 27,195,169, 81, 11,204,154, 61,199, 88,165, 38,125,238,220,185,185,216,228,249,227,155, 5,249,185, 75,170,226,252,151,227, 90, -177,184,186, 86,161,235,176, 34, 5, 89,156,194, 33,167,248,171,133,169,169,233, 78,138,162, 60,141,140,140, 64,231, 70,226,237, -235, 23,200,206,225, 66,165,160, 64, 51, 69, 98, 75, 39,225,162, 82,227,209,173, 43,216,186,101, 19,178,178,178,224,222,173, 59, - 10, 57,117, 80,183, 78, 93, 40, 21,242,226,139, 6,208,168,181,176,180,118, 68, 96, 96,176, 54, 95, 38,171,244,134,196, 19,106, - 92,234, 90, 55,134, 74,211, 9, 66, 62, 31,121, 5,106,228, 20,139,172, 19,231, 71, 66, 37, 87,128, 84,107, 64,170,181,176,172, - 59, 12, 77,173,123,128,166,174, 54,175, 81,245,209, 20, 52,177,143,160,137,125, 4, 81,167,217,248,211,119, 76,185,129, 84,183, -117,119, 51, 50, 50,210,195,195,195,175, 6, 5, 5, 13, 25, 57,114, 36, 30, 60,120, 48, 13,192,140, 98,247,205,180,145, 35, 71, - 34, 40, 40, 8,225,225,225, 87, 51, 50, 50,210,191, 70,203,243,249,124,133, 74, 85, 52,198, 26, 24, 24, 8,171,217,215,190,221, -208,161,172,188,192,192,252, 45, 79,159,174, 56,112,240, 32,175, 87,207,158,132,150, 36, 65, 83, 20, 26, 57, 59, 19,125,250,244, - 17, 31, 59,123,214,156,173,213, 62, 95,228,237,125,111,207,248,241, 5, 47,101, 50, 93, 3,205,235, 21,187, 12, 1,160, 94, 21, -191,233, 12,149, 74,181,253,135,239, 39,245,242,127,244,164, 78,221, 58,246, 70,183,238,248, 7, 11, 68,124,150, 83,253,134,236, -156,188,108,206,234, 21, 75, 69, 42,149, 74, 87,209,234, 98, 97, 97,129,212,212, 84,124,248,240, 1, 42,149, 10, 90,173, 22,180, - 92, 6,117, 78, 46,212,121,217, 32,148, 10, 8, 40, 10,202,204, 52,212,115,106, 0,252, 53, 35,177, 90, 87, 84, 69, 66,171,228, - 93,104,100, 4,158, 88, 2, 22,151,171,243,226,232, 0,218,180,111,223,254,236,133, 11, 23,120,147, 39, 79,238,112,247,238,221, -157, 0,226,147,147,147,123, 46, 95,190,252,229,206,157, 59, 5,211,167, 79,111,178,113,227,198, 9, 0,246, 85, 70,162, 84, 42, -207, 94,187,118,109,172,163,163,163,117,104,104, 40,148, 74, 37,104,154, 70,255,254,253,129,162,216, 26, 0,192,251,247,239, 21, - 74,165, 50, 61, 44, 44, 44, 63, 62, 62, 94, 3, 29,102, 9,174,220, 46,125,150,159,250,104,168,181,141,253,115,161,168, 94,125, -166, 48,112,200,188,225,246, 27,182,156, 79, 86,222,140,142, 46,248,185,119,131,245,178,130,144,153, 38, 14,133,187,110,250,197, -232, 18, 8, 95, 58,187,208,220,220, 28, 28, 14, 7, 92, 46, 23, 60, 30, 15, 4, 65, 96,246,236,217,216,191,127,127,117,174,195, - 79, 68,150,161,161, 97,248,170, 85,171, 28,166, 79,159,206, 19, 10,133,200,201,201,193,137, 19, 39, 48,101,202, 20, 28, 58,116, -168,194,248, 23, 29, 92, 74,229,173,165,115,199,143, 31, 15,181, 90,141,209,163, 71,227,192,129, 3,115, 41,138,242,175,197, 37, -253, 60, 56, 56,216, 57, 56, 56,216, 8,192,160, 81,163, 70, 29, 25, 54,108, 24,252,253,253,113,245,234,213,238, 40,154,244,161, - 0,224, 11,192,170,248,189,170,235, 83,108,109,109,189,155,166,233, 65,150,150,150,193,141, 27, 55,118, 61,121,242,164, 73,122, -122,122,201,228, 7,196,198,198,226,240,225,195,210,131, 7, 15,230, 83, 20,101,206, 98,177,174,229,230,230, 46,169, 66,176, 29, -220,178,101,203,164, 98,119, 32, 46, 92,184,192,108,218,180,137, 88,190,124, 57,114,114,114,224,233,233,137,189,123,247,206, 41, - 44, 44,116,219,180,105,211,247, 35, 70,140,192,234,213,171, 33,147,201,182, 84,247,176, 82,133,248, 34, 0,116,222,178,101,139, -227,220,185,115,113,225,194, 5,180,105,211, 70, 20, 19, 19,179, 7,192,212,138,218,143, 97, 24,196,196,196, 64, 46,151,227,201, -147, 39, 88,177, 98, 69, 78, 25,145, 53,103,198,140, 25,107,230,204,153,131,117,235,214, 49,161,161,161,233,195,134, 13,179,222, -191,127, 63,187, 81,163, 70,115,228,114,249,127, 76,104, 53,105,100,182,190, 93,155,174,139,109,237, 27,225,196,201, 83,200,206, -206, 46,173,147,146,122, 97, 24, 6, 5, 5, 5, 72, 77, 77,133,177,145, 33, 54,108, 92,243,205,143,211, 38,213, 65, 81, 26,140, -207, 77,150, 78,166, 27,135,141,154,188, 96,244,216, 73, 8, 13,126,131, 99, 71,246, 33, 44, 52,168,148,143,212,106, 16, 25,241, - 26,145, 17,175, 97,109,227,136, 62,189,186, 19, 99,198,140,233, 63,126,236, 40, 75, 0,127, 91,234,136,255, 97,107, 22,240,121, - 30,173,253,159, 8,173,106,204,117, 22,166,166,166,225,103,206,156, 49,119,119,119,103,147, 36,137,155,183,110, 97,230,140,239, - 48, 97,188, 15, 52, 48, 5,169,230,129,230, 9,117, 42,137, 66, 33, 7, 3, 6, 50,153, 12, 1, 1, 1, 96,104, 18,199,246,111, - 2,195,208,165, 66, 11, 96,160,214,104, 96, 95,183, 9,118, 31, 88, 75,130,203,125, 9,109,197,169,107,242,179,216,148,150,100, -144,156,158,128, 4,105, 24,140, 13,235,130,195,173,139,172, 92, 57, 56, 44, 27,104,149,239, 65, 21, 31, 43,151, 37, 65,161,249, -178,246,163, 42,176,158, 50, 53,184,233, 42, 20,138,227,199,143, 31,255,102,243,230,205,252, 1, 3, 6, 52, 62,127,254,124,103, - 0, 24, 48, 96, 64, 99, 35, 35, 35, 28, 63,126, 92,173, 80, 40,142,127, 69,139, 79,143,246,237,219, 35, 39, 39, 7,177,177,177, -193, 85,158,155, 90,109, 46,177,178, 98,167, 63,120,160,205,200,201,169,211,163, 71, 15, 66, 75,146, 96, 17, 4,178,243,242, 16, - 31, 23, 7, 19, 19, 19, 34,252,253,123,201,142, 89,179, 46, 53,118,117,229,148,204, 72,212, 5, 87,175, 94, 53, 64, 81, 92, 86, -149,191,213, 16,178,244,180,212, 73,222,222,222,151,142, 31, 63, 97,156,150,158, 22, 41,224,243, 73,137, 68,104, 55,126,220,143, -156,220,220,220,177, 0, 10,117, 37,203,201,201, 65, 76, 76, 12, 68, 34, 17,120, 92, 46,104,133, 28,148,172, 16,202,236, 12,176, - 53,106,240, 41, 10,102, 6, 2,212,177,182, 70, 93, 75, 11,157, 56, 63,220,191, 93, 26,248, 94,214, 93,184,161,189, 11,248, 98, - 9,248,134, 18,252,232,247,176,248,105,148, 7, 44,255, 85, 23, 90, 11,123,123,251, 63, 79,158, 60,201,203,200,200, 64, 80, 80, - 80, 48,128, 60, 0,134, 0,232,136,136,136,187, 97, 97, 97, 94,197,179,238,170,155, 45,182,233,226,197,139,189,221,221,221,201, -250,245,235,139,211,211,211,235,228,228,228,208, 82,169,244, 19,147,208,237,219,183, 5, 5, 5, 5, 50,154,166, 47, 21,139,172, -106,243, 23,205, 27,110, 47, 12, 8,196,108,143,190,245, 90, 24, 89,180, 68, 54, 25,216,226,121,176,116,246,188,225,246,219,183, -156, 79, 86,138, 8,213, 17,130, 74,172,195, 17, 42,117, 13, 98,102,128,162, 88,169,128,128, 0,196,199,199, 35, 38, 38,230, 19, - 65, 53,109,218, 52, 28, 59,118, 76, 39,139,150, 88, 44, 94,183,114,229, 74,135,185,115,231,242,202,136, 34,120,123,123, 35, 47, - 47, 15, 7, 14, 28,128,183,183,119,141, 7,254,114,104,208,163, 71,143, 1,182,182,182,200,202,202,130,141,141, 13,220,221,221, - 7,250,251,251,215, 7, 16, 91,203,126,255, 99,223,190,125,215,172, 90,181, 10, 90,173, 22, 83,166, 76, 65, 84, 84,212,217,168, -168,168,173,117,235,214,157,253,211, 79, 63, 89, 91, 91, 91, 99,228,200,145, 98,146, 36,135, 86, 70, 98,102,102,230,187,111,223, -190,177, 3, 6, 12, 96,105, 52,154,110,247,239,223, 71, 92, 92, 28,212,106, 53, 72,146,196,199,143, 31,225,237,237, 45, 45,158, -221,248, 81,135,114, 77, 94,182,108,217,164,217,179,103,227,183,223,126,195,202,149, 43,255, 48, 54, 54,118,109,213,170, 85,235, -149, 43, 87, 98,209,162, 69,112,116,116,132,185,185,121,211,229,203,151,187,204,159, 63, 31,219,183,111,199,138, 21, 43,254, 0, -112,184, 54, 21, 65,211, 52,177,126,253,122,183, 45, 91,182,216,150,136, 44, 22,139,133, 51,103,206, 32, 48, 48,112, 96,116,116, -116, 69,199,236,181,177,177,153,102,107,107,203,191,115,231,142,196,209,209, 17, 36, 73,106,139, 69,214,142,186,117,235,206,252, -248,241, 35, 6, 12, 24,128,232,232,232,227, 0, 38, 24, 27, 27,203,230,207,159,111, 32, 18,137,140,229,114, 57,254, 83, 96,179, -136,137,235, 86, 47,194,171,192,247,184,120,145,135, 87,175, 94,193,218,218, 26, 2,129, 0, 12,195, 64,165, 82, 33, 35, 35, 3, - 90,141, 10, 45,154, 55,192,209,131,235,145,158,158, 1,176,136, 74, 67,110, 8, 22, 49,110,210,119, 67,240,248,201, 45,236,217, -179, 15,133,133,178, 74, 30,190,133,104,212,216, 5,246,118, 86, 72, 76, 74, 4,193,130,197,223,121,174,255,227,174,195,210, 91, - 16,116, 73,239, 80, 22, 38, 38, 38, 91, 79,159, 62,109,238,233,233,201,150,201,100,160,105, 26, 93,221,221, 49,123,238, 92, 92, - 61,121, 18,206, 29, 70,131, 80, 75, 64, 26,232, 54,235, 65,169,144,163, 89,235,206, 24, 49,114, 20, 18,226,227,209,215,107, 24, -148, 74,121,233, 19, 70,137, 69, 75,173,214,192,194,170, 14,110,223,190,205,198,148, 41,111,177,163, 98,163, 4,165,225,135, 68, -126, 84,118,201, 85, 4, 34,224,213, 49,104, 84, 26,180,104,177, 28, 26,218, 28, 86, 14,211,160,213, 94, 70,126,198,253, 34, 55, -134,185, 39,146, 18, 18,192, 98,243,194,107, 91,131,180, 44,227,139,110,186,121,121,121,121, 49, 49, 49,231, 3, 2, 2,198, 13, - 29, 58, 20,183,111,223,254, 30, 0,134, 14, 29,138,128,128, 0,196,196,196,156,207,203,203,203,251, 26,173,109,107,107, 59,168, -123,247,238,163,219,181,107, 7, 63, 63, 63, 48, 12,243, 88,167, 11,155,203,101, 88, 44, 22,104,154, 6, 1, 32, 43, 55, 23, 81, - 81, 81,200,202,204,132, 86,171,133,172,176,144,118,105,220,184,144,161,105,195,154,148,167,236, 12, 67, 84, 48,235,176,228,183, - 90,156,106,252,203,231, 79, 19, 10, 10, 11, 45, 77, 77, 76, 11,248,124, 62,149,147,155,155,247, 54, 60, 84,173,227,224, 80,130, -136,176,176, 48,215,148,148, 20, 36, 36, 36,128,148, 21,128,173, 82,131,165,146,163,103,231, 78, 16,129,129, 16, 52,184,180, 22, - 92, 54, 23, 5, 69,179,243,170,117,119, 80,101, 30, 18, 74, 68, 22, 65, 16, 69,238, 66,177, 24,124,137,225, 39, 22, 46, 93,250, -147, 64, 32, 56,121,238,220, 57, 91,123,123,123,172, 94,189, 26, 14, 14, 14, 77,237,236,236,228,198,198,198, 34,107,107,107, 52, -107,214, 12,157, 59,119,198,141, 27, 55,160, 67, 29,144, 12,195,244,121,252,248,241,130,167, 79,159,142, 16,139,197,196,172, 89, -179, 56,253,251,247,135, 64, 32,128, 92, 46, 71, 78, 78, 14, 78,157, 58,149, 73,211,116,201,164, 20,115, 3, 3,131,195, 4, 65, -196,202,100,178,185,229, 9,143,110,110, 97,151,158, 77, 79, 97, 10, 13,134,120,244,173,215,162, 71,223, 94,104,224,220, 3, 61, -250, 38, 0,192,122, 51, 78,220,232,223,151,153, 92, 50, 49, 36, 14,223,190,121,103,133,187, 71,143,101,139, 11, 31,172,249,109, -127,110,181,241,116, 4, 65,128,166,233, 79,114, 7,149,223, 62, 97,194, 4,156, 57,115,166,218,122,100,177, 88,163,166, 79,159, -206, 43,103,121, 70,114,114, 50,188,188,188, 48,116,232,208, 79,132,150,133,133, 5,108,108,108, 16, 23, 23, 7, 0, 89, 58,246, -171,217,147, 39, 79, 38, 20, 10, 5,166, 78,157,138, 3, 7, 14, 96,244,232,209,132,191,191,255,108, 0,115,107,218,217, 89, 44, -214,134,159,126,250,105,129,183,183, 55,178,179,179,113,253,250,117,244,239,223, 31,103,206,156,177,188,126,253,250, 58, 79, 79, - 79,176,217,108,248,249,249,129, 36,201, 42,115,125,241,120,188, 65, 3, 6, 12, 96, 37, 38, 38,130,199,227,161,109,219,182, 72, - 74, 74,130, 92, 46, 71,114,114, 50,230,204,153,147,154,149,149,213, 93,215,235,136,199,227,205,157, 61,123, 54, 78,159, 62, 13, - 31, 31,159, 35, 0,166,230,229,229,141,120,250,244,233,233,111,191,253, 22,201,201,201,184,116,233, 18, 86,172, 88, 65, 76,152, - 48, 1,187,118,237,194,156, 57,115,254, 40,182, 58, 85,214,241, 11,210,211,211,141, 27, 54,108,136,180,180, 52, 20, 22, 22,226, -210,165, 75, 86, 55,110,220,168,111,111,111,111, 20, 19, 19, 67,253,250,235,175,252,185,115,231, 98,235,214,173, 8, 10, 10,194, -177, 99,199,208,163, 71, 15, 50, 58, 58,186, 66, 43, 89,113,202,134, 75, 12,195,220, 17,139,197, 40, 40, 40, 40,185,238, 22,250, -248,248,120,251,250, 22, 25,217, 83, 82, 82, 48,113,226,196,241,247,238,221,163, 61, 61, 61, 13,120, 60, 30,148, 74,165,236, 63, - 57,106,211, 20, 13,128, 70,253, 58, 18,220,186,122, 16,111,130,163,241, 38, 56, 12,124, 65, 81, 16,188, 66, 33, 71,235, 22,141, -208,161,109,123,164, 72,147,113,252,216, 65,152, 89,216, 87,121, 31, 97, 24, 6, 60, 14, 5,151,198, 54, 56,121,108, 31,252,174, -223,195,177,227,167, 74, 99,222, 56, 28, 46, 90,181,238,128,182,109,221, 17, 29,243, 17, 7, 15,238,129,165, 85, 29,189,115,176, -150, 40,117, 29,150,125, 47,167,252,123,184,187,187,179, 11, 11, 11,161, 84, 42,145,154,154,138,184,184, 56,152,152,154, 32, 58, - 37, 22,221, 13, 52, 72,165,243, 17, 17, 28, 78, 17,108,110, 80,117,127, 56,192,163, 21,224,209, 10, 51, 39,143,174,226,145,149, -129,216,200,162,200,117, 67,146, 31,176,125, 59, 89,153,208, 34, 41,237,221, 91,119,238,183,159, 60, 97, 16,247,246,253, 3,208, -170,105, 40,180,198,144, 41,213,144,105,184, 96, 25,247, 7, 50,253,193,230, 8,208,209,173, 17, 46, 93,188,161, 97, 72,237, 61, -157, 43,200,218, 21,100, 90, 88, 25,161,149, 94,206,239, 96,166,179,235,176,116,224,165,168, 51, 39, 78,156, 24,220,169, 83, 39, - 3, 79, 79,207,134,197, 3,167,230,196,137, 19,242,226,100,152, 53,197, 39,217,224,109,108,108, 90,243,120,188,209,253,251,247, -111, 61,105,210, 36,188,125,251, 22,199,143, 31,143,108,212,168,209, 3,169,180,242, 25,217,108, 62, 63,171, 48, 61,221, 68, 82, -191, 62,199,212,208, 48,229,198,245,235,142,189,122,247, 38, 18, 18, 18,144,149,149, 5,165, 82,137,160,224, 96,134,203,102, 39, - 17, 70, 70,172,247,129,129, 44, 54,159,159, 85,153,181,177, 2,196, 85, 51,235,208,183,182,214,173, 58,182,166, 13, 87,248,252, -208, 64,169, 82,186,230,231,231,147, 28, 46,151,235, 96, 99, 18,255,254,163,238,247, 68,149, 74,229,119,247,238,221,193,189,122, -245, 18, 68,134, 4,129,204,203,131, 58, 47, 7, 60,154,130, 89,107, 55,176, 53, 42, 64,173,133,189, 11, 3,101,174, 1,252, 95, -188,215,170, 84,170,106,147, 26,150, 8, 45, 86, 57, 97,192,151, 72, 32, 48, 52,130, 64, 34, 41, 47, 24,170,123,146, 51,232,211, -167, 79,207,142, 29, 59,130, 97, 24,236,223,191, 31, 26,141,134,175,209,104,160, 86,171,161,209,104,144,159,159,143, 99,199,142, - 97,247,238,221, 79, 1,252,161,195,233,147, 34,145,232, 91,130, 32,172, 56, 28,142,220,210,210, 82,124,230,204,153,210,116, 19, -173, 90,181,130,161,161, 33, 15,197, 73, 33,173,172,172,184,135, 14, 29, 50, 25, 56,112,224,163, 10,221, 29, 45,154, 46,106, 64, -154,122, 8, 69,245,234, 27, 89,180, 68, 3,231, 30, 0,128,222, 94,147,209,160, 81, 93,228,103,134,212, 87, 42,226,134,240, 56, - 57,166,225,219,147,223,138, 6,184, 78,146,165, 63,140, 66,197,211,251, 43, 28, 40, 88, 44, 86,165,238, 88, 93, 68, 86,145,102, - 97, 89,150,196,249, 0, 64, 86, 86, 22,164, 82, 41, 34, 34, 34,208,164, 73, 19,100,103,103,195,222,222, 30,106,181, 26,237,218, -181,131, 66,161,192,150, 45, 91,240,228,201,147,167, 0,230,232,240, 31, 34,103,103,231,137,173, 91,183,198,245,235,215,241,234, -213,171,228, 91,183,110,217,187,187,187,163,126,253,250,147, 98, 99, 99,151, 22,187,250,116,133,216,221,221,125,150,183,183, 55, -194,194,194,240,195, 15, 63,100, 37, 38, 38, 94, 58,123,246,236,212, 21, 43, 86,176,250,246,237, 11,169, 84,138, 13, 27, 54, 80, - 79,158, 60,217, 8, 96,117, 53,245,248, 46, 49, 49,209, 65,169, 84, 34, 59, 59, 27, 36, 73, 66, 46,151,227,198,141, 27, 56,118, -236, 88, 90,177,200,250,160,107,225,220,220,220,154,177, 88, 44,156, 62,125, 26, 0,126, 70, 81,198,254, 75, 67,134, 12, 73,254, -245,215, 95,237,151, 44, 89,130,239,191,255, 30, 26,141, 6,191,253,246, 27,150, 44, 89,114,173, 88,100, 85,117, 19,221,108, 99, - 99, 51,237,135, 31,126,104, 58,127,254,124, 4, 4, 4, 88,189,126,253,186,109, 80, 80, 16,234,212,169,131,172,172, 44,142,185, -185, 57,182,110,221,138,121,243,230, 93, 0,144,249,236,217,179, 81, 49, 49, 49,190, 0, 54, 84, 35,218,247,218,219,219, 79, 99, - 24,134,145,203,229,113, 62, 62, 62, 27,214,174, 93,139,121,243,230, 33, 60, 60, 28,121,121,121, 48, 52, 52, 36,126,250,233,167, -137, 63,255,252, 51,166, 76,153,194,200,100,178,221,255,233,129,154, 97, 40,200,115,194, 64,169, 76,209,170, 69, 19,180,114,173, -135, 91,247,223, 0, 0,122, 14,115,135, 92, 86,128, 35, 71,246,227,195,135, 40,112,184, 92,152,152,217,232, 98, 9,132, 58,255, - 29,114, 53, 82,244,242,108,139,254,125,187,227,143,163,103, 64,106, 53,152, 58,121, 44,114,114,115,113,244,232, 65, 68,199,124, - 4,135,203,133,185,197,223,159, 8,181, 42, 45,242, 63, 47,180,116,112, 63,129,166,105, 36, 39, 39,227,245,235,215,136,141,141, -133,129,129, 1, 20, 36, 69,239,185,251,132, 38, 8, 94, 18,205, 48, 79, 25,178, 52, 75,241,231, 28, 20,149, 92, 38, 99,173,177, -169,169, 41, 95,165, 82,128, 36,181,101, 70, 21, 2, 32, 0, 30, 7,176,181,107,128,196,132, 68, 70,169, 84, 62,172,242, 9, 74, -165,220,122,229,210, 57,239,206, 93,220, 45,250,247, 92,133, 75,151,151, 35, 39, 63, 31, 74, 13, 23, 50,165, 6,114, 37, 96, 98, -214, 24,237, 90,180, 68, 74, 74, 22, 66, 94,249, 23,114, 84,114, 93, 2, 69,163,118, 44,155,236, 60,121,230, 34,136, 28,187, 64, - 21,113, 9,116, 97, 90,169, 69, 75, 40, 49,133, 89, 93, 23,228,202, 84, 56,119,239, 13, 80,131,165, 94,210,211,211,229,108, 54, -251,132,183,183,247,111,111,222,188,118, 0,128, 55,111,222, 36, 73,165,210,197,233,233,233, 53,181, 73,151,100,131, 39,132, 66, -209,155, 70,141, 26,165,180,109,219,214,120,200,144, 33,176,176,176, 64, 80, 80, 16,124,125,125,223,105, 52,154, 69,254,254,254, - 85,186,122,212,106,117,242,155,203,151,141,186,127,247,157,201,162,129, 3, 55,120,123,123,111, 93,189,122, 53,215,217,217,153, -208,106, 52, 8, 13, 13,101, 78,158, 56,161,221,189,100,201, 22,190, 88,204,121,121,229, 10,151, 84,169,146,255,191, 59,177,189, -189,189,135,123,183,174, 46, 27, 55,111,135, 82, 81,136, 23, 1,215,144,147,147,129,125,251, 47,186,216,219, 51, 30,201,201,201, -254,186, 10,224,195,135, 15, 47,232,208,186,117,107,167, 58,117, 16, 26, 31, 11, 62, 77,129, 71,146, 96,107, 84, 96,145, 74,212, -113,101, 64,176, 12, 33, 77,205,199,218,211,231,195,116, 17,198, 77,191, 25,132,213, 73,121, 32, 8, 2,155, 58,185,130,111, 40, - 1, 79, 44,193,143,127,222, 47, 21, 6,126,171,151,128, 47,145,160, 97, 7,157, 18,194,203, 31, 60,120,240, 58, 52, 52,180,157, -171,171, 43, 22, 44, 88,128,184,184, 56,208, 52,141,180,180, 52,165, 84, 42, 77,206,200,200,136, 67, 81,254,159, 3,213, 12, 98, -101, 85,135,189,191,191,127,169,187,225,222,189,123,176,179,179,131,177,177, 49,242,243,243, 49,125,250,116,147, 95,126,249, 5, - 0,240,250,245,107,148, 21, 40,229, 17,250, 38, 98, 99,110, 1,147,195, 20, 6, 14,201, 38, 3, 91,244,232,155,136,222, 94,147, -112,199,239, 15,220,191,117, 23,102,156,184, 88,136, 11,110,100,198,102,230, 39,201,156,247,186,180,153,202,150,202,110,237,157, - 53, 40,146,109,107, 75,159, 91,178, 39, 63,183,170,178, 58, 59, 59,195,218,218,186, 52, 70,139,195,225, 96,202,148, 41, 96, 24, - 70, 87,145, 85, 60,214,208, 25, 74,165,210, 90, 40, 20, 34, 53, 53, 21, 31, 63,126, 68,116,116,116,105,234, 0,154,166,181, 11, - 23, 46,228,206,154, 53, 11,123,246,236,193,195,135, 15,159, 2, 88, 5, 64,215,135,181,177, 35, 71,142, 52, 84,171,213, 56,117, -234, 20, 9,192,235,220,185,115,175,219,181,107,199,233,215,175,159,225,174, 93,187,198, 22,183,145,206, 66,203,200,200,136,167, -209,104,176,107,215, 46, 36, 38, 38,122, 0,136,120,249,242,229,222,145, 35, 71,238,118,117,117,109, 20, 22, 22, 22, 85, 88, 88, -248, 35,128,144,234,200,210,210,210, 38,183,109,219,246, 28, 77,211,142,189,122,245, 18,111,222,188,217,232,253,251,247,112,112, -112, 0, 77,211,161,168,225, 18, 86, 81, 81, 81, 17, 82,169,212,165,123,247,238,184,113,227,198,122,138,162,214, 1,248,109,198, -140, 25,246,241,241,241,104,221,186, 53,204,204,204,240,254,253,251, 2,169, 84,186, 27, 69, 75, 18, 85,103,194,141, 1,176,120, -239,222,189, 45,247,238,221, 59,218,204,204,172, 99, 80, 80, 16, 30, 63,126,140,141, 27, 55,226,151, 95,126, 65,215,174, 93,177, - 96,193,130, 76, 0,163, 1,144, 49, 49, 49, 58,229,205, 43,177,108, 1, 64,155, 54,109, 82,124,125,125, 49,117,234, 84,230,208, -161, 67,219, 78,156, 56, 49,119,236,216,177,165, 99,224,196,137, 19,153,227,199,143, 79, 68,209, 50, 76,255, 73,104, 53, 26, 53, -140,204, 26,160, 48, 55, 1, 25,137, 1, 48, 48,180, 65,223, 30,110,144, 43,212,184,122,229, 2, 66, 66,131,193, 98,177, 96,109, - 83, 7, 38,166, 22,136,140,140, 2,170,158,109,172,213,104, 52, 48, 52,173,135,194,188, 68,168,211,223, 64, 36,177,194,164,239, -134, 64,174,208,224,226,165, 11, 8, 11, 11, 1,155,205,134,141,109, 29, 24,155, 20,113, 18, 76,213, 51,152,245, 0, 80, 65, 62, -173,106,133, 22,155,205,126,112,243,230,205,225, 29, 58,116,224,124,248,240, 1, 31, 62, 20, 61,220,228,228,228,144, 4,168,243, -233,161, 87,198, 84,113,120, 47, 20,207,206, 40,187,118,161,196,208, 48,249,253,187, 8,235,156,236, 52, 4, 7, 62,193,135,200, - 80,196, 70, 71, 64,163, 81,130,205, 98,129,197,102,161, 94,131,230,120,242, 52, 64,173, 36,201,128,202, 56,139,202, 17, 93, 32, -182,114, 30,181,102,245, 82,191,121,139, 86,138, 70, 12,223,131,144,247,111, 81, 72,218,128, 97, 0, 27,115, 49, 90, 57,253,132, -228,148, 12,156,254, 99,151,156,214,104,198,149,203,161,245, 25, 39, 0, 88,103,162,217,238,253,127, 76, 57,112,236,228,202, 69, -179,166, 91,127, 59,116, 28,248,217,111,161, 77,121,131, 6,237,250,131, 16,152,224,250,237,251,240,127,253, 54,141,166,152,149, -214, 89, 56, 20, 89, 13,103, 89,228,230,230, 62, 75, 77,149, 58,148,201, 2,239, 32, 16, 8,171,155, 29, 87,158,243,147,140,243, -108, 54,171,205,154, 53,107,180,214,214,214,154,176,176, 48,236,217,179,135,126,243,230,205,109, 22,139,181, 67, 42,149, 42,171, -227,180,212,106,131, 79,250,248, 52,107, 63,116, 40, 51,102,214, 44, 57, 4,130,217, 27, 54,109,242,201,200,201,177, 99,104, 26, -150,102,102, 73, 27,150, 44,241, 29, 62,114,100, 78,248,147, 39,162,128,203,151, 69,124,146,124,163, 67, 57,191, 6, 42,229, 76, - 78, 78,246,127,248,240, 49,142, 28,216, 12,141, 70, 5,105,114, 60, 0, 32, 51, 43, 15,213,136,172,242,156,140, 92, 46, 31,250, -243, 47,191, 60,255,121,222, 92,155,110, 61,123, 33, 33, 56, 8,154,236, 12, 16, 90, 18, 92,130, 3, 89,186, 1,210,211, 10,177, -248,248,217,244, 66,185,124,104, 5,131, 68,133,229, 44,177, 88, 9,140, 12,193, 19, 75,192,151, 24,126, 98,197, 18, 26, 25,129, - 47,150,128,195,231, 87, 20,192,253, 25,103, 97, 97,225,176,225,195,135,135,188,124,249,210,116,234,212,169,232,220,185,115,160, - 66,161,240, 4, 80, 80,219,250,164,105, 58,185, 91,183,110, 44,130, 32, 36,227,198,141, 19,100,100,100,148,102, 86, 47, 44, 44, -196,141, 27, 55,208,164, 73,209,172,254,240,240,112, 52,111,222,188, 82,206,239, 23,135, 37, 3, 88, 61,111,184,253,134,231,193, -210,217, 0,214, 55,104, 84, 7,247,111,221,197,227,251, 1, 62, 29, 93,233,237,223,140,107,247,171,129,231,200, 69, 46,109,166, -178, 37, 70,182, 56,122,241, 2, 59,226,205,193,181,114,121,104, 67,236,185,180,176,178,114, 18, 4, 1,134, 97, 62, 75,229,192, -102,179,113,226,196,137,154,158,251,217, 3, 7, 14,204,248,225,135, 31,120, 82,169, 20,239,222,189,131, 76, 38,131, 80, 40,196, -173, 91,183, 72, 0,187, 78,156, 56,113,235,196,137, 19,253, 80, 52,155,232, 94, 77,250,167, 88, 44,246,238,219,183, 47,222,189, -123,135, 87,175, 94, 93, 0, 16, 18, 24, 24,120,225,195,135, 15,163,186,118,237,138, 63,254,248,195, 91,161, 80, 28,168, 9, 39, - 77,211,101,115, 38,149,172,248, 16, 92, 88, 88,216, 49, 32, 32,160,166,237, 46,205,202,202,234, 82, 44,172, 19,173,173,173,141, -130,131,131, 81,183,110, 93,104, 52,154, 14, 53,237, 75,121,121,121,155,119,236,216,113,104,242,228,201,248,245,215, 95,199,157, - 61,123,118,220, 55,223,124,131, 1, 3, 6,224,240,225,195, 8, 9, 9, 89, 15,221,150, 21,171,232,220, 67, 0,132, 88, 91, 91, -207,172, 83,167, 14, 54,110,220,136,208,208, 80,223,213,171, 87, 47, 9, 9, 9, 65,147, 38, 77, 4, 17, 17, 17,100,109,238, 33, - 0, 96,100,100,100,164,213,106,113,249,242,229, 23, 0,230,141, 27, 55,206,106,235,214,173,163, 37, 18, 9,178,179,179, 21, 97, - 97, 97, 99, 1, 92,249, 79,223,235, 24,130, 88, 54,245,251,217,123,191,159, 58, 86,216,182, 77, 43,200,243,147,160, 40, 76,131, -188, 32, 21, 59, 14,220, 6, 65,176, 96,105,105, 11, 43, 27, 7,196,199, 39,224,233,181,235,106,153, 92,177,149,175,165,215, 87, -205, 57,171,136,179,117, 17,167, 92,150, 14, 69, 97,122, 41,167,149,149, 93, 49,103, 60,158, 4, 92, 87, 42,100,178,205,106,134, -248,253,111, 62,247,255,101,212,108,173,195,178,200,201,201,153, 51,125,250,116,207,197,139, 23,155,147, 36,201, 54, 51, 51, 67, -124,124, 60,121,254,252,249,236,194,194,194, 57,181, 41, 13,135,203, 13,113,110,220,196,243,219,111,191, 37, 7, 13, 26,200, 27, - 63,185, 31,199,210,202, 10,121,185, 89,136,124, 23,132,247,111,223,192,185,137, 27, 86,172,222, 2,152,152, 84,187,144,100,241, -178, 58, 94,171,126, 94,120,166,139, 71, 31,163, 38,205,221,120,173, 26, 26, 67,163, 37,145,148,148,132, 43,151,131, 53, 97,175, - 31,231,211,164,122,148, 60, 83,183, 37,120,252, 1, 18, 89,216,231,106,165, 57,177,110,195,142, 5,187,246, 29, 89,180,120,246, - 84,113, 87,247,222, 8,189,251, 7, 46,248,157,145, 41, 85,234, 13, 60, 54, 54,133,101, 65, 30, 89,195, 58, 80, 42,149,154,242, -227,169, 82,169,212,124,105, 75, 31, 62,124, 24,105,105,105,234,184,184,184,155, 36, 73,158,173, 98,177,231,207,176, 3, 80, 15, - 81,169,238,254,236,238,222,239,231, 91,183,132, 19,127,250, 73, 61,110,252,248,133, 80,169, 52,224,243, 25,142, 88,204,130, 64, -192, 13,127,242, 68,180,109,198, 12, 51, 66,173,190,115,164,138,180, 1, 21,224,171,207, 58, 44,177,104,117,239,222, 21, 19,167, -206,131,162,140, 69,235,217,171, 72,168, 52,208,217,162, 85,140,132,184,196,196,142,179,151,253,124,113, 84,223,158, 46,174,142, -245, 4,150,245,235, 65, 98, 99,131,172,140, 12, 60,121,245, 94,187,250,204,197,176, 98,145,165, 83, 94, 25,154,166,139,130,220, - 1,244,156,179, 24, 4,155, 13, 20,167,113, 40,153, 57, 84,191, 93,103, 16, 28, 14, 40,134,134, 74,165,210, 37,232, 47,233,227, -199,143,195,198,141, 27,119,207,207,207,143,213,183,111,223, 86,151, 46, 93,162,191,164,239, 40, 20,138,142, 0, 32, 20, 10, 99, - 77, 76, 76,236, 39, 79,158, 12,173, 86, 11,185, 92,142,188,188, 60, 36, 37, 37,229, 78,158, 60, 89, 3, 0, 34,145,136, 63,124, -248,112,163,234, 56,183,156, 79, 86,206, 27,110,191,221,140, 19, 55, 58, 63, 51,164,190, 25, 39, 46,182,163, 43,189,125,203,249, -100,165,145,157,108, 77,102,156,127,164, 84,118,107,239,209,139, 23,216, 19,134, 12,163, 28, 36, 81, 62, 66, 43,230,124,117,188, - 4, 65,124,150,156, 84, 71,145,245, 9, 10, 10, 10,150, 44, 95,190,124, 64, 78, 78,142, 67,191,126,253,120, 46, 46, 46,120,254, -252, 57,252,252,252,200,103,207,158, 37,202,100,178,165, 0,148, 0,110,215,166, 78, 27, 55,110, 92,159,195,225,148,184,210,118, - 22,255,188,243,210,165, 75,163,166, 78,157,138,122,245,234, 53,139,136,136, 16,160, 6,215, 17,195, 48,165, 94,134,175, 9,130, - 32,162,183,109,219,102,111, 99, 99, 67,220,184,113,131,100,179,217,181,177,220, 28, 62,120,240, 96, 7,173, 86,251,253,180,105, -211,224,225,225, 1,146, 36,113,252,248,113, 28, 60,120, 80, 87,145, 85, 37, 34, 35, 35,223, 36, 38, 38,118, 91,184,112, 33, 54, -110,220,184,100,225,194,133, 72, 76, 76, 68,100,100,100,208,151,240,230,231,231, 43, 18, 18, 18, 12, 58,117,234,212, 54, 44, 44, - 44,204,211,211,179,249,212,169, 83,177,126,253,122,230,225,195,135,195, 1,220,248,255, 24,189,223,127,200, 62,198,165, 56,183, - 86,175,217,252, 75, 67,167,250, 63, 76,153, 52,146,221,216,185, 57,100,121, 73, 48,183,176,134, 67,157, 6,200, 72,207,196,205, -155, 55,168,204,204,220,195, 20,139, 88,245,225, 67,118,202,151,112,218, 59, 52, 64,122,122, 58,174, 95,191, 78,229,230,228,239, -135,150,181, 58, 34, 62, 55, 13,122,232, 98,201,154,134, 42,178,196, 87, 5, 11, 83, 83,211, 83, 70, 70, 70,105, 70, 70, 70,105, -166,166,166,167, 0,157,102, 31,244, 42,115,119, 96,127,242, 26, 62, 92, 8,161,176, 35, 56,156,249, 38,166,166, 55,140,141,141, -179,186,119,239,174,222,187,119,175, 50, 34, 34,156, 78, 78, 78,100,140,141,141,243, 74,247,175,136,179, 28, 76, 77,157, 12,197, -182,205,127, 49,118,104,245, 68, 98,219,172, 64, 98,219,172,192,216,193,237,169,216,182,217, 74, 83, 83, 39, 67,157,202, 89, 9, - 26, 88,193,210,217, 2,187,154, 88, 18, 10,103, 11,236,106, 96, 5, 75,157,207,189,106,183, 31, 69, 16,160, 80, 52, 13, 27,181, -224, 44,225,160,217,108,246, 17, 7, 7, 7, 91,212, 44, 97,221,103,156,227,129,122,227, 5,130,239,207,249,248, 76,140,125,248, -112, 92,126, 76,204,152,188,232,232,145, 65,103,206,140,218, 57,106,212,248, 49, 2,193,180,225,128,147,174,156,182,182,182,190, -111,222,188,241,211,245, 85, 70,120,233, 92,159, 78, 13,236,111,245,237,213,129,241,158, 62,148,241,158, 62,148,233,219,171, 3, -227,212,192,254,214, 23,180, 17,193,102,179, 71, 27, 24, 24,156, 18, 27, 24,132,138, 13, 12, 66, 13, 12, 12, 78,177,217,236,209, -168, 58,134,234, 19, 78,115,115,243,215,214,214,214,105, 53,121, 89, 88, 88, 4,214,160,156, 99,234,215,175,159,200, 98,177,182, -212,240,154,174,138,211, 89, 36, 18, 69,139,197,226,164,178, 47,145, 72, 84, 54, 49,148,185,129,129,193, 85,177, 88,188, 85, 23, -206,223,151, 53,255,229,233,237,153, 33,191, 47,107,254, 75,249,109,179, 6,155, 78,126,126,111, 85,214,172,193,166,147,117, 41, -167,149,149,213, 67, 43, 43, 43,169,149,149,149,212,218,218,186,202,151,133,133,197,107, 29, 56,133,134,134,134, 91, 13, 13, 13, -211,196, 98, 49, 37,145, 72,210,196, 98,241, 22,148, 73,109, 81,219,250,100,177, 88,235,155, 53,107,166,100,179,217,135,202,109, -218,216,176, 97, 67, 37,135,195,217, 80, 67, 78,163,174, 93,187, 82,193,193,193,140,135,135, 7, 3,192,244, 43,182,187,141,169, -169,233, 13, 35, 35,163, 4, 67, 67,195, 29, 0,196,181,228, 36, 0,140,182,183,183, 15,234,209,163,135,220,222,222, 62, 0,192, -183, 95,177,156, 3, 6, 15, 30, 76, 39, 36, 36, 48, 12,195, 48, 9, 9, 9,204,224,193,131,105, 20, 37,138,252,146,123,242,178, - 25, 51,102, 48,207,158, 61, 99,158, 61,123,198, 4, 4, 4, 48, 3, 6, 12,160, 1,124,247,133,247,121,124,173,115,119,105, 96, -225,212,180,145,233,217,177,195,220,233,219, 87,182, 48, 43,150,254,192,244,246,104,206, 52,105,104,122,209,217,217,220,249,107, -112,254,178,116, 58,211,171, 91, 51,218,197,201,244,140, 75, 3, 11,167,255,240,185,255,163,172, 90, 37, 15,210,127,119,192,217, - 95,166,197, 79,197, 82,197,176,179,179, 67, 86, 86, 7, 33,135,227, 46, 16, 8, 60, 89,108,246,131,236,140,140,185,197,143, 91, -212,127,202, 84, 91,229,128,238, 4,126, 21, 75, 18,212,134,243,147, 64,246, 90,114,214,132, 67, 39,206,202, 22,149,166, 85,170, - 20,115,146,124,189, 3, 85,214,193, 39,156,246,246,246,223,211, 52, 93, 95,215, 2,177, 88,172,216,228,228,228, 3,181,169,207, - 70,141, 26, 49,197,238,109,226,107,182,251,223,209,151,254, 77,156, 71, 55,183,176,107,210,162,233,162,208, 55, 17, 27,139,221, -138,165, 88, 57,203,212,208,189, 71,247,229, 79,238, 63,252,117,229,142,156,130,255,231,115,103, 65,199,152,182,175,192, 89,146, - 36,180, 70,156, 92, 46,119,111,251,246,237,191,127,254,252,249, 33,138,162,166,253, 75,251,231, 0, 54,155,189,176,113,227,198, -173, 34, 35, 35,131, 40,138,218,136, 10, 18, 69,214,162,156, 75,235,215,175,255, 35,143,199, 19, 20, 22, 22,230,164,164,164, 44, - 7,112,246,191,173, 62, 93, 26,153,181,101,152,210,164,219,107,223,125,204,126,249,213, 56, 25,154,162, 25,246,154,200,152,172, -192,255,135,118,255,199,136,172, 98,161,181,255, 63,241,199,189,244,156,122, 78, 61,167,158, 83,207,249,213, 57, 69,250,250,212, -115,254, 3, 57,255, 81, 40,177,104,113,244, 85,161,135, 30,122,232,241, 63, 7,133,190, 10,244,208,227,191, 14,101,173, 90,165, -214, 44,162, 10, 85, 90, 19,147, 96,109,148,237, 93, 61,167,158, 83,207,169,231,212,115,234, 57,245,156,255, 58,206,127,170,200, - 42,235, 42,156,166,119, 29,234, 57,245,156,122, 78, 61,167,158, 83,207,169,231,252,111,226,252, 95, 23, 90, 40, 39,180,244,174, - 67, 61,254, 51,216, 62, 4,246, 0, 48,251, 18,146,255,142,253,245,208, 67, 15, 61,244,208,227,255, 25,251, 81,137,235,240,191, - 65,104,217, 1,232,136,162,133,111,223, 3,120, 12, 32,231, 11,248, 44, 0,140, 36, 8, 98, 4, 0, 48, 12,115, 14, 69,179, 70, - 50,117, 57, 88, 40, 20,166, 41,149, 74,171,226,207,233, 74,165,178,236, 90, 6, 4, 62,159,205,198,148,121, 85,136,250,245,235, -167,169, 84, 42, 43, 29,254, 62,143, 97,152, 16, 22,139, 21, 42,145, 72,238, 71, 70, 70,250,213,228,196, 61, 61, 61, 39,178,217, -236,181, 0, 64, 81,212,178, 7, 15, 30, 28,249, 27,219,173, 67, 29, 59,155, 63, 52, 90, 13,153,150,145,189, 28,159, 39,242, 3, - 0,236,242,130, 47, 65, 98, 81,241,231, 13, 51,253,170,206,163, 83,211,253,171, 64, 91, 46,151,235,109,109,109,221, 63, 41, 41, -233, 53,128,159,128,234,179, 26,215,169, 83,231, 59, 14,135, 51,142,162, 40, 39, 54,155, 29, 77,146,228,137,196,196,196, 99,250, -123,136, 30,122,232,161,135, 30, 58,136,173,207, 80, 35,161,213,196, 28, 54, 12, 48, 26, 4,122,131,193, 29, 2, 56,253, 62, 11, -169,186, 30,255, 77, 19,104,181,100,209,127,242, 88,160,110,124,100,237,239,223,191,191,195,172, 89,179,208,185,115,103, 60,127, -254,188,211,225,195,135, 39,159, 61,123, 54,132,166,233, 7, 0,158, 3, 58,165, 82, 16,163, 40, 79,203,216,254,253,251,247, 90, -187,118, 45,187,121,243,230, 80, 40, 20,120,248,240,161,251,134, 13, 27,182, 62,125,250,244, 46,128,147,197,130,160,210, 5,240, -148, 74,165, 85,201, 98,156, 4, 65, 88, 13, 31, 62,252,101, 89,113, 85,188,190, 26,193, 48,204, 51,130, 32, 2, 40,138,122,126, -254,252,249,196, 38, 64,135,233,245,121,231,231,198,106, 28,202,115,170, 84, 42,171,203,191,175, 3, 71, 32,128,170, 32, 31,157, - 38,253, 37,122,239,252,178, 8, 4, 77,130, 13, 38,199,115,205,214, 16, 0,161, 41, 41, 41, 33, 30, 30, 30,177, 53,109, 97, 54, -155,189,246,230,205,155,182, 12,195,160,111,223,190,107, 1,252, 93, 66, 75,208,177,173,219,131,171, 23, 78, 9, 11,179,211,208, -239,219, 81, 39,162, 18,211, 39, 2,184,240,137,104,234, 15,107,130,192,162, 25,235, 78,178, 1, 96,247,210,177, 63,109,233,131, -237,243,110, 35, 21,128,103,177,248, 1,128,223, 1, 60,216,213, 31,214, 0, 22,207, 88,119,146, 0,128, 61, 75,199, 46,218,213, - 31,219,102,222,168,113,218,138, 31, 39, 78,156,184,125,237,218,181,108, 91, 91, 91, 36, 39, 39,247,107,214,172, 89,227,252,252, -252,102,168, 34,136,184, 94,189,122,103,186,246, 24,216, 96,232,136,209, 6,150, 22,166, 72,145,102, 26,157, 57,117,104, 58,251, -217,195,254,113,113,113,163,244,247, 16, 61,244,208, 67, 15, 61, 42, 65,237, 51,195,183,182,133, 72,166,193, 96, 14,155,248,174, - 75,219,102, 61,199,124,211,149,213,204,165, 17,222,134, 71,244,185,114,255,197, 6, 86, 64,248, 61,146, 98,142,137,121,184, 28, - 40,173,122, 38,140,150, 4,231,246,229,147, 69, 35,225,228,177,236,151, 47, 95, 54,106,211,166, 77,233,210, 48, 61,123,246, 68, -207,158, 61,137,221,187,119,187,221,190,125,219,237,224,193,131,154,123,247,238,253,129,170,243,163,120, 55,108,216,112,195,246, -237,219, 5, 30, 30, 30, 16, 8, 4,165, 27, 36, 18, 9, 6, 14, 28,136,129, 3, 7,178, 83, 82, 82,250, 94,189,122,181,239,239, -191,255,174,142,143,143, 95,136,191,178, 52, 87,137,229,203,151,183,173,224,231,155, 4, 65,124, 36, 73, 50,200,205,205, 45,177, - 49,208,104,250, 55,157,239,252,216,197, 89, 60,119,201,225, 10,121, 56,124, 62,142, 78, 44, 26,171,203, 10,173,216,251, 55, 32, - 49, 50,204, 50, 48, 52, 12, 1, 16, 10, 32,132, 97,152,208,232,232,232,136,166,128, 91, 71, 83,214, 31,135,114,232,150, 53, 16, - 91, 72, 76, 76,132,177,177,177,200,195,195, 67, 74, 16,196,202,135, 15, 31,126,237,128,188, 14, 43, 23,253,200,203,137, 11, 65, -234,187,103,152, 63,194,221, 96,238,142, 63,127, 85,170,181, 23,170, 58,136, 32, 88,172,223, 3,104, 31, 20, 45,198,187, 60, 43, - 43,203, 3, 0,204,205,205,249, 0, 30,108,121,129,111,230,117, 33,190, 36,183, 27,143,205,102,239, 58,124,248,240,212,239,190, -251,174,104,233,136, 39, 79, 32,145, 72,176,122,245,234,122, 11, 22, 44,240, 37, 73,114, 78,101,150,172,174, 61, 6, 54,216,182, -241,215,102, 5,217,121,170,125,187,206,190,178,115,109,194,154,225,189,192,112,155, 70,101, 67, 81,212,119,122,203,150, 30,122, -232,161,135, 30, 53,177,102, 85, 43,180, 26, 91,224, 72,107, 87,231,145, 99, 6,184, 11, 90,184, 54, 7, 79,240, 87,234,150, 54, -109,219,162, 77,219,182, 44,159,194,130,222, 47, 95,189,233,125,254,246,115,149, 92, 27,127, 54, 50, 19, 19,117, 45, 85,201,162, -180,107,191,181,238, 33,203, 77, 23, 2,128,216,196, 74,185,244,114,234,253, 46, 93,186,192,193,193,129,119,239,222,189, 41,213, - 8,173,165,239,223,191, 23,176,217, 85,231, 67,181,179,179,195,240,225,195,209,164, 73, 19,126,247,238,221,151, 86, 38,180,132, - 66, 97, 58, 65, 16, 86, 0, 96,102,102, 70,173, 92,185, 50,136, 41, 2, 0, 48, 12,195, 60, 99,177, 88,207,105,154,126,241,231, -159,127, 38, 53, 3,172,250,181,105,242,248,199,241,195, 13,152,243, 91, 43, 21, 9,202,252,252, 10,127, 55,144,136, 51, 68, 98, -113,136,192, 64, 24,138,162,181,188, 66, 29, 28, 28, 34,154, 1, 14,237,155,212,191,189,123,222, 88,195, 67,211,126,173,182, 46, - 91,183,110,221,184,101,203,150, 66,138,162, 32,147,201,176,103,207, 30, 99,145, 72,100,220,191,127,255, 21,101, 59,128, 11,208, - 98,152, 29,123,218,170, 20,106,102, 45, 58,146, 73,215, 78,109,227,134, 15,236,111,212,182, 99, 87, 68, 61, 56,142,236,236, 2, -228,229, 22,130,166,233,207,242,250,204,188,129,180, 93, 94,216,176,123,201,216,197, 4,139, 69,184, 13,249, 9,131,108,242,102, -239,221,187, 55, 28, 0,151,207,231,151,237,135,118, 34,123,215, 13,141,250,116,197,158,101,227,193,208, 52, 3, 96, 67, 13,172, - 89, 86,134,134,134, 87,110,223,190,221,161, 93,187,118,120,254,252, 57, 98, 98, 98,240,227,143, 63,170,103,206,156,201,155, 48, - 97, 2, 49,127,254,252, 89,191,255,254,251,121, 0, 79, 63,187, 16, 56,156,113,223, 14, 29,197, 47,204,205, 87,170, 85, 26,181, -153,133, 9,173,146, 41,229,153, 57,249,202, 81, 99,191, 87,135, 7,190, 24, 7,224, 51,161,245,133,245,169,135, 30,122,232,161, -135, 14, 96, 24,166, 29, 0, 75, 0, 25, 4, 65,188, 42,251,189,120,151,146,213, 90,202,127,207, 68,145, 87,202,188, 12, 93, 38, -138,194,125, 44, 1, 80, 0, 94, 18, 4,145,243,133, 69,172,122,233, 29, 63, 63, 63,166,236,123, 25,161,197, 48, 12,195,104,179, - 62, 50,170,200, 27,140,252,213,129,207, 94,138,240, 11,140,244,229, 89,230,197,201, 95,152,198, 22, 85,175,194,254, 77, 19,104, -199,182, 4, 51,163, 29,152, 57,221, 77,148, 47, 95,190,188, 71,211,180,159, 79, 87, 48,204,219,147, 12,243,246, 36, 51,175, 19, -152,243,231,207,223,244,245,245,245, 59,118,236,152, 31,128,234,226,148,210, 10, 94, 5, 48, 47,172,192, 84,134,247,239,223, 51, -123,247,238,101,150, 44, 89,194, 28, 58,116,136, 65, 53, 25,212,251,246,237,251, 48, 44, 44,140,153, 48, 97, 66, 16,170, 72, 12, -232, 2,136,199,213,179,121,167, 58,179, 85,163,254,174, 5,147,211, 77, 88,225,249,219,218,218,126, 82,158,245,206, 54,204,206, -246,206,204,145,222,109, 82, 25,134,185,201, 48,204,122,134, 97, 70, 49, 12,211, 4, 0, 90, 3, 70,223,218,154,127, 80,158,221, -166, 80, 79,235, 88,237,186,119,173, 91,183,110,188,112,225,194,108,181, 90,205,196,198,198, 50,251,246,237, 99,238,220,185,195, - 92,190,124,153,113,119,119, 79, 41, 83, 94,235,201, 77, 28,211,212, 7, 87,169,106,211,139,184,108,246,206, 87,119,206, 51, 31, - 30,159, 99, 94,158,246,101, 78,252, 60,134,153,245,109, 7,141,145, 72,160, 4,208,163,178,227,102,118, 65,163, 38,245, 44, 35, -227,227,227, 25,141, 70,195, 76,154, 52,137,233,219,183, 47,211,167, 79, 31,166, 87,175, 94, 76,207,158, 61,153, 30, 61,122, 48, -247,239,223,103, 82, 82, 82,152, 94, 93,219,200,188, 92,208,182, 6, 69,115,117,116,116, 76,141,141,141,101, 52, 26, 13,115,239, -222, 61,230,248,241,227,204,189,123,247, 24, 31, 31, 31, 6,192,145, 25, 51,102, 40,114,114,114,152,190,125,251, 38,161,130,172, -241,142,142,142, 17, 97,145,137,137, 91,214, 29,184,127,116,231,169,251, 23,207,223,185,127,229,214,203,107,151,111,189, 58,251, - 34, 56,250,178,163,163, 99, 68, 5,237,255, 69,245,169,135, 30,122,232,161, 71,245, 90,164, 88,104, 13, 40, 54,118, 12, 96, 24, -166, 87,185,239, 3,138,133,211,103,223,125,124,124,150,148,253, 94,178,143,143,143,207, 18, 0, 76,167, 78,157, 78, 49, 12,211, -232, 43, 20,127, 90,249, 87,141,102, 29,146, 73, 47,193,115,238, 15, 46,165,133, 54,243, 61,232,220,120, 64,108, 3, 5, 33, 65, -150, 52, 30,239, 30, 95,168,122, 33,137, 98, 92,127, 15, 46,128,123, 17, 17, 17,120,247,238, 29, 18, 19, 19, 97, 96, 96,240,217, -126, 79,158, 60,129, 72, 36,130,173,173,173,110, 74, 87,253,233, 56, 23,210,198, 17,146, 78, 30,200, 28,243, 3,238,221,187,135, -244,244,116,240,120, 60,240,249,124,144, 36, 89, 45, 31,139, 85,180,226,111,137, 21,171,162,125, 60, 0,142,192, 76,114,117,247, -138, 57,245, 89,207,252,184,138,132, 15, 72, 81, 82,186, 89,242, 36, 98, 24,136, 13,164, 34,145, 65, 8,138,221,133, 0, 66, 9, -130,136,106, 13,112,197, 18,225,213, 63,214,204,183, 97, 7,222, 19, 42, 62,132, 84,200,209,171, 87,175,233, 0, 86, 48, 12,147, -219,178,101, 75,235,181,107,215,154, 38, 39, 39,227,237,219,183, 56,123,246,108, 6, 89,116,162, 4,195, 48,171, 0,160, 35, 32, - 52,177, 52,185,181,243,151, 57,134,120,112,134, 95,155, 94,100,236, 50,240,218,176, 9, 51,102,110,159, 51, 16,178, 2, 5, 78, -222, 9,196,205, 55, 31, 7, 1,120,130, 42,226,222,118, 61,197, 7, 32,163,231,208,161, 67,131, 30, 61,122,100,113,240,224, 65, -144, 36, 89,225,235,224,193,131,184,251,248,205,108, 0,175,117, 44,150, 93,253,250,245,239,190,120,241,194,210,192,192, 0,119, -238,220, 65,110,110,110,169, 37,107,226,196,137, 68,110,110,238,232, 61,123,246, 12,139,139,139,219,248,248,241,227, 44, 20,173, - 5,249, 73, 71, 96,179,217, 31, 73, 82,211,212,214,165, 17,103,196,192,174, 93, 11,179, 66, 32, 49,111,137,103,193, 31,175,230, -230,100, 41,216,108,246,199,178,251,127,141,250,212, 67, 15, 61,244,208,163,102, 32, 8,194,143, 97, 24, 47,130, 32,252,202,255, - 86,254,115,201,126,190,190,190,165,223, 75,142, 89,191,126,253,186, 50,223,229, 95,169,120, 85, 6,195,119, 47, 86,144,221, 43, -218, 73,245,246, 34, 84,239,174,128,231,216, 5,252, 38,131,192,118,116, 71, 66,200, 3, 4,223,216,130,164,240, 39, 96,104, 10, -182,141,219,235, 90, 16,101,211,166, 77,161, 84, 22,133,102,169, 84, 42,240,196,166,202,249,211,198, 10, 1,128,230, 8, 85,101, - 20,172, 78,132,134, 93, 60,209, 62,141,193, 75,235, 34, 67, 69,251,180,162,227,214, 76,154, 4, 30,143, 7, 30,143, 7,162, 56, -244, 71, 23,161, 69, 20,239, 76, 23,185,175, 42, 42, 4, 33, 23,112, 79,158, 94,225,221, 94, 16, 23,202, 87,133, 61, 67,138,138, -102,174,166, 81,215,116, 41,175,129,216, 32, 89,100, 96, 16, 42,146,136, 75,133, 22, 65, 16, 31, 1,128,225,114,143, 29, 95,229, -221, 82,156, 22, 45, 86,190,186, 7,169,146,214, 84, 66,179,234,198,141, 27, 86, 28, 14,199,134,162, 40, 36, 36, 36, 32, 60, 60, - 28,219,182,109, 75, 43, 40, 40,232, 30, 24, 24, 24, 89, 86, 59, 82, 34,254,217, 99,171,231, 52,224,132,248, 11, 85, 31,195,106, -220,123, 44, 92, 7,247, 29,212,221,237,218,244,241,203, 48,248,155, 62,152,208,189, 25, 19,155,146,173, 4,112,167,216,244, 90, - 29,146, 3, 3, 3,123,119,235,214,237, 68,171, 86,173, 92, 24,134, 65,139, 22, 45, 48,122,244,104, 28, 59,118, 12,193,193,193, -200,207,207,215,220,190,125,123, 43,128,195, 58, 22,203,192,212,212,244,230,253,251,247, 45, 13, 12, 12,112,251,246,109, 40, 20, - 10,216,218,218, 98,230,204,153,252,245,235,215, 31,205,207,207, 31,225,235,235, 43,140,141,141,221,121,235,214,173,122, 40, 90, -119,238,179, 78,160, 86,171,247,159, 60,118,100,251, 76,239, 89,246,247,159,191,189,167, 42, 44, 48,118,116, 76,204,183, 52,149, - 24,110,253,109, 85, 93,181, 90, 61,189,226,250,124, 88,171,250,212, 67, 15, 61,244,208,227, 51, 84,169, 69,202,138,167,242, 98, -171, 38, 34, 13,128,194,199,199,103, 41, 65, 16,126, 62, 62, 62, 75,125,125,125, 21, 0, 82,254, 14,145, 85, 42,180,188,188,188, -252,253,252,252,224,229,229,229, 95, 41, 5, 77, 65, 19,251, 8,154,216, 71, 16,117,154,141, 63,125,199,148, 59,121,186,214,165, - 27,184,250,206,125,149, 74,197, 57,114,228, 72,105,220, 22, 0, 80, 20,245,213, 91,177, 38, 66,171, 88,232,125, 86,136,250, 2, -137,255,254,121, 35, 58,154, 83,114,174,250,201, 85, 36,171,104,114,227, 7,141,252, 85, 46,243,123,101,156,151,231, 78, 71,226, -227,187, 48,144, 72, 18,167, 62, 10, 45,181, 98, 21,139,172, 24, 0,168, 39, 48,188,183,119,206, 96,119, 27, 30,120,234,107,231, -144,162,162, 85,123,227,180,135, 43,233,108, 96, 24, 6, 49, 49, 49,144,203,229, 8, 8, 8,192,133, 11, 23, 50, 42, 16, 89,168, - 47,144, 60, 60,244,211,184, 14, 70, 5,169, 60,245,171,187, 72, 81,209, 58,185,186, 44, 90, 12,238,194, 99, 17,183, 9, 22, 91, -212,179, 99, 99,204,253,126, 8,182, 28,250,147, 84, 91,117,245,218,126,229,250,200, 66,149,102,169,142, 34,171,212,216, 24, 24, - 24,216, 44, 48, 48, 80, 0,192,115,244,232,209,215,135, 13, 27, 6,127,127,127, 92,189,122,213, 25,128,180,120,191,213, 40, 90, - 40,251,119, 0,209,149, 25, 30,121, 60,222,233,187,119,239, 54,183,179,179,195,221,187,119,161, 80, 40, 48, 99,198, 12,181,183, -183, 55,111,226,196,137, 68, 94, 94, 94,169, 37, 43, 32, 32, 32,171, 50,145, 5, 0,201,201,201, 55, 46,156, 61,222,185, 91,183, -110, 67, 26, 56, 55, 49,138, 46,200, 79, 55, 48, 16,138, 30,251, 63,224,189,122,241,116,103,114,114,242,203,138,235,243,158,206, -245,169,135, 30,122,232,161, 71,229,208, 73,139,148,179, 76,213, 4,101,142,227,250,250,250,134,251,250,250,126, 98,241,250, 66, -148,159,117,120,173,100, 76,171, 85, 30, 45, 42, 47,225,243, 19,160,233,154,156,236,103,191,153,154,154,146, 34,145,232, 19,161, - 69,235,200,153,125,233, 20,162,127, 28, 91,106,201, 42,177,108,161,223,196, 47, 18, 90, 52, 77, 7, 0,248,164, 16, 6, 86,141, -199,108, 29,232,210,165, 89, 3,123,150,246,236, 54, 36,201, 73,229,138,247, 26,229,187, 2,102, 80, 68, 5, 65,214,165,156,164, - 22, 66,177, 40, 94, 36, 17,151, 23, 89,113, 0, 32,182,118, 30,182,177,127,147,238,110, 77, 26,178,200, 51,155,145, 44,215, 22, -250, 68,104, 52,209, 50,230, 98, 37,117,184,162, 79,159, 62, 43,204,205,205,133,219,183,111, 55,118,116,116, 4, 73,146,234,242, - 34,203,192,170,241,152,109,131, 93,187, 52,182, 49,101,105,207,239, 64,162,130,146,111,139,214, 30,213, 69,100, 89, 24, 75,110, -237, 93,247,163,200, 64,192,133, 82,169,196,250,221,231,113,251,105,152, 87,102,216,229, 91, 0,110,125, 65,135,156,234,229,229, -181,101,245,234,213,208,106,181,152, 50,101, 10, 62,126,252,120,251,253,251,247,219,234,214,173,187,240,167,159,126,178,179,177, -177,193,200,145, 35,121, 90,173,118, 98, 37, 28,191,157, 60,121,210,203,205,205, 13,254,254,254,200,205,205,133,173,173, 45,188, -189,189,249,190,190,190, 71,243,243,243, 71,172, 91,183, 78, 24, 19, 19, 83,165, 37,235,147,126, 77, 81,107,246,109,249,113, 97, -187,142,238,172, 15, 31, 34,201,132,246, 30,172, 7,119,175, 62, 50, 55, 55, 63,154,144,144,240, 87,125, 14,105, 81,227,250,212, - 67, 15, 61,244,208,227,235,128, 32,136,107,197,113, 87,159, 88,185,202,139,176, 18,139, 85,217,239,229,247, 47,222,254, 53, 30, -150,247, 87, 32,188, 62, 77,239,224,229,229,165,243,180,122, 90,150,161,147,120, 42,143,111,154, 64,107, 47, 1,103,169, 7, 11, - 60,177,169,114,224,234, 59,247, 43,219, 87, 44, 22,235,108,209,162, 85,202,234, 26,165, 70, 66,171, 56, 70,235, 38,195, 48,159, - 8, 45, 99,235,198, 30,139,127,154,179,213,125, 88, 63, 86,218,247,157,144, 91,168, 82,253,244,150,164,147,228, 85,139,172,162, - 81, 92, 27,107, 32,150,132, 10,197, 6,101, 69, 86, 2, 0, 8,173, 26,182, 95, 52,119,230,238, 30, 99, 6, 18, 25, 51,220,145, -147,171, 80, 45, 12, 39,137,100, 5, 51, 34, 2,120, 80, 17,221,253,251,247,247, 1,216,231,225,225,145, 38, 22,139, 81, 88, 88, -248, 89, 27,148,148,183,203,176,126,172,180,169, 29,144, 45,211,168,126, 10, 39,145,162,160, 79, 87, 39,178, 44, 77, 12,111,237, - 93,251,163, 65, 74, 82, 28,120, 60, 30, 36, 18, 9,238, 60, 9, 69,102,248,149, 47, 17, 88, 96,177, 88, 43,125,124,124, 86,204, -156, 57, 19, 89, 89, 89,184,122,245, 42,190,249,230, 27,156, 58,117,202,241,250,245,235, 91, 60, 61, 61,193,102,179,225,231,231, - 7,173, 86, 27, 85, 9,205,144,105,211,166, 45, 28, 54,108, 24, 94,190,124, 9,169, 84,250,137, 37, 43, 55, 55,119,244,238,221, -187,135,197,198,198, 86,107,201, 42,135,246,245, 27,182,230, 45, 89,190, 9, 42,121, 58, 39, 35,249,185,255,189, 59,172,103,217, -217,217, 6, 0,242,106, 91,159,122,232,161,135, 30,122,232,108,213,170, 76,139,100, 20,139,168,140,138,190,151, 17, 88, 21,125, - 39,202, 89,193,212,229,182, 7,255,157,231,164,147, 69,139, 99,237, 10, 50, 45,172,140,208, 74,255,100,187,208,208, 76, 39,215, -161,150, 4,103,239,225,210, 60, 90,194,172,172, 44,161,133,133,133,178,172, 64, 48, 48, 48,128,157,157, 29,114,114,114,176,127, -255,126,160,250,160,104,210,104,216,120,180, 31, 51, 5,175, 28,248, 96,180,154, 82,203,214,222, 73,147, 62, 17, 91, 60, 30,175, - 36, 54,172,186, 65,247, 69,177,165,233, 25, 0,166,181,115,131, 95,133, 98,241, 36,161, 69, 29,139,185, 63, 78,229,198,166,171, -112,223,125, 73,238,249,223, 22, 75, 18, 25,201,204, 4,228, 61,173,134, 47,250,219, 61,199,203, 91,178,146, 90, 57, 55, 88, 38, - 52, 16,126,207, 55,171,103,227, 51,255, 71,110,108,154,138,184,223,254,167,252, 11,191,255,100, 16, 3,195,133, 73,200,125,160, - 67,243,172,248,230,155,111, 86, 48, 12,195,208, 52,189, 28, 0,202,150,119,190,247,247,220,232, 84, 37,238,185, 47,203,185,240, -219, 98,195, 68, 84, 93, 94,139, 22,131,187, 88,155, 26,221,218,187,110,166,129, 52, 57, 30, 2,129, 0,134,134,134, 72, 76,203, - 3,151,195, 86,124, 97,127, 19,116,237,218,117,241,143, 63,254,136,208,208, 80,204,152, 49, 67,154,144,144,112,241,204,153, 51, - 51,126,249,229, 23, 78,223,190,125, 33,149, 74,177, 97,195, 6,237,147, 39, 79,214, 1,216, 80, 97,127,228,112,166,254,250,235, -175, 76, 74, 74, 10, 17, 19, 19, 3, 91, 91, 91,204,154, 53,139,191,110,221,186,210,152,172,154, 88,178, 74,144,156,156,236,127, -251,238, 51, 12,186,177, 21,164, 86,229,159,155,149,240,232, 93,116,142,191, 25,159,191,192,190,117,139, 90,213,167, 30,122,232, -161,135, 30, 95,197,138,245,170,170,239,255, 5,168,200,117,168,147,208,138,218,177,108,178,243,228,153,139, 32,114,236, 2, 85, -196, 37,208,133,105,165, 22, 45,161,196, 20,102,117, 93,144, 43, 83,225,220,189, 55, 0, 16, 85,147, 82, 21, 20, 20,160, 77,155, - 54,216, 53,177,113, 15,101, 65,150, 80, 4, 64, 37, 48, 82, 94,230,119,189,127,253,250,117, 57, 77,211,167, 1, 92,175,134,102, -101,243,230,205,119,110,218,180,137,239, 50,102, 50, 10,159, 63, 46,111, 65,129, 72, 36,130, 64, 32, 64, 72, 72, 8,238,223,191, -175, 6,176,178,154, 6,125, 65,146,100,240,153, 51,103,146, 26, 53,176,239,215,166, 85,203,217, 75,151,248, 24,190,125,124, 27, -203,215,237,164, 27,181,237,155,183,254,212,229,130, 60, 73,221,158, 10,233,251, 32, 29, 78, 53,184,156,200, 74,105, 90,191, 78, -143, 86,174,205, 23, 45, 95,190,204, 40,252,241, 29,252,242,251, 94,198,217,173, 87,222,239, 23,174,228,103, 26,212,235,163, 76, -127,247, 82,151, 58,244,247,247,223, 7, 96, 95,201,247,242,229,245, 89,189,141,110,220,174, 95,206,250, 83, 23,100,249,134,117, -123, 85, 85, 94, 75,151, 33,157, 29, 44, 77,111,237, 88,243,131, 65,106,114, 2, 4, 2, 1, 36, 18, 9, 18,164,185, 88,177,245, -172, 76, 67,211,253,190, 84,104, 25, 26, 26, 10, 52, 26, 13,118,237,218,133,132,132,132, 78, 0, 18, 94,191,126,189,119,212,168, - 81,219, 91,180,104,209, 52, 60, 60, 60,170,176,176,112, 38,128,119,149,145,152,152,152,116,178,180,180, 36,158, 61,123,134, 31, -126,248, 65, 61,107,214, 44,222,132, 9, 19,136,156,156,156,218, 90,178, 0, 0,246,246,246, 30,189,123,118, 68,151,222, 51,252, -213,202,220, 71,177,239,142,250,179,152,167,194,218,214,167, 30,122,232,161,135, 30,255, 26,212, 46, 49,184, 7,192,105,108,142, -233,205,237,121,169,199,126,155,197, 20, 68, 7, 48,138,151,251,152,252, 75,223, 51,215, 54, 76, 96,174,239,152,203,204, 24,208, -156,105,106, 69,164, 54, 54,199,116,143,207,133,219, 39,171,123,127,211, 4,218,222, 13,193,244,110, 8,102, 64, 99,104, 1, 44, -109,221,186,245,101,239,246,127,229,209,242,110, 15, 6,192, 15, 0, 36,149, 20,171,162, 21,195,109, 1,236,111,211,166, 13,249, -224,193, 3,230,253,136, 94, 76, 96, 83, 11,102,230,204,153,204, 47,191,252,194,140, 29, 59,150,177,180,180, 36,139, 43,194,182, - 58,206, 65,131, 6, 57, 0, 64,157, 58,117, 76,218,186, 52, 74, 13,185,119,149,121,116,108, 59,115,200,123, 40,211,161,133, 75, -166, 77,211,110,193, 34,219, 38,173,170,169,190, 82, 78, 27, 27,155, 37, 12,195,244, 99, 24,198, 22, 0,156,157,205, 37,173,155, - 54, 74, 9,190,123,149,121,124,124, 39,115,200,123, 40,211,177,101,179, 44, 7, 23,207,119, 66,171,166,237,117,225,172, 8, 21, -150,215,181,105,166,117,163,206, 65, 85,148,183,148,179, 65,251,145, 87,146, 82,210,152, 23, 47, 94, 48,215,175, 95,103, 30, 63, -126,204, 28, 59,115,133,169,219,110, 68,161, 69,139,193, 93,106,208,117, 42, 43,167,241,128, 1, 3,152,168,168, 40,166,127,255, -254, 12, 0,227, 90,114, 94,142,141,141,101,194,194,194,152,165, 75,151, 50, 0,142,252,248,227,143,138,188,188, 60,166, 87,175, - 94, 9,197, 2,139, 83,155,114, 58,213,183, 95, 63,100, 96,215,149,222, 63, 12,243,248,210,250,252,138,208,115,234, 57,245,156, -122,206,127, 3,231,255, 50,108,139,173, 90, 37,239,173,117,202,163,229, 15,144,200,194, 62, 87, 43,205,137,117, 27,118, 44,216, -181,239,200,162,197,179,167,138,187,186,247, 70,232,221, 63,112,193,239,140, 76,169, 82,111,224,177,177, 41, 44, 11,242,200,106, - 74, 81,156, 71,235, 19, 4, 6, 6, 26,152, 53,252, 43, 7,211,135,162,220,172,123,107,120,130, 82, 0,211,222,188,121,179,201, -211,211,115,237,247, 93,218, 15,245,238,220, 3, 90,173, 22,199,142, 29, 67,124,124,252, 69, 0,203,116,181,184,133,134,134,102, - 54,107,232, 56,135,203,230, 44,154, 57,118,136,101,198,199,183, 72,138, 8, 4, 0,168, 84, 10,109,106,212, 35,183,154, 20, 78, - 36, 18,189,176,180,180,124,111,105,105,153,211,184, 65,157,105, 2,112,151,207, 24,253,173, 85, 86,236, 59, 36,134, 23,121, 70, - 85, 74,185, 38, 41,234, 65,211,218,180,174,163,163,163, 64,204,197,244, 10,203,171, 86,106,211, 62,188,107,165, 11,143, 92,165, - 94,183,106,203,177, 62,107, 22, 77, 18, 24, 25, 25,225, 77,216, 7, 44,223,124, 74,166, 80,107,251,101,134, 94,254, 42,238, 49, -134, 97,160,213,106,117,158,232, 80, 9, 22,187,185,185, 53, 89,187,118,173,243,196,137, 19,241,165,150,172,178,136,142, 77,246, -177,175,227,212,236,195,251, 55,158,102, 34,222,137, 47,169, 79, 61,244,208, 67, 15, 61,254, 53, 24, 80,108,204,153, 86,230, 61, - 16, 58, 62,245, 35, 44, 29,114, 0,171, 27,176, 11,247, 46, 89,187,101, 5,139,216, 58,137,102,152, 63, 72, 22, 86,197,100, 33, -227, 11, 11, 39,231,114, 64,246, 25, 60,150, 3, 0, 92, 78,237, 6,200, 98, 68, 1, 24,118,224,233,203,118, 7,158,190,252,185, -248,183, 53, 0,106,228,203, 53,228, 32,204,189,153,147,125,215,214,205,133,108, 74,129,164,136,143,200,150, 41,113, 39, 60, 62, -151,197,176,254,168,105,161, 98, 98, 98, 30, 2,128,181,177, 65, 68,215,102, 13,235,118,107,211,220,128, 75,168,145,244,246, 13, -242, 20,106,220, 14,143,207, 3, 65,212, 58,160,250,107,149, 55, 45,244,202,171, 63, 65,244, 34, 8,226,238, 82,239, 49,130, 21, -155, 79,127, 85,145, 5, 64,158,156,156,156, 37,151,203,205, 83, 82, 82,212,168,125,146,184, 15,249,249,249, 45,230,206,157,187, -122,225,194,133,139,126,251,237, 55, 94,109, 98,178, 42, 67, 78,114,252,165,110,205,191, 94,251,235,161,135, 30,122,232,241,175, -192,180,114,239,208, 89,104,149, 10,134,116,100, 0,152,233,228,196,204,143,142,134,250,107,149,172, 34, 75,215, 23,226, 21,128, -129,181, 62,154, 69, 20, 60,143,138, 47,124, 17, 21, 95, 8,154, 97,104,134, 81,177, 88, 72,148,105, 52,235,162, 98,146,107, 63, -235,142, 32,168, 87, 31, 18, 20,175, 63, 38, 42, 25,154,102,104,134, 81, 19, 4, 82,181, 90,122, 93,120, 76,252,149,255,134,242, -102,134, 94,126,234, 71, 18, 93,159,190, 8,155, 47,147,105,118,102, 70, 92, 14,248,138,237,162, 13, 13, 13, 29,215,169, 83,167, -201, 20, 69,237, 5,160,253, 2, 46, 53, 73,146,139,215,175, 95,127, 49, 52, 52,244,108, 64, 64,128,244,107,136,172,191,181,253, -245,208, 67, 15, 61,244,248,167,162,118,139, 74, 87,134,175, 41,178,254, 27, 17,246, 33,174,205,223,193, 27,254, 33,206,245,127, -161,188,105, 17,151, 94,167, 1,163,255,166,234,189, 77, 81,212,237,175, 41,170,111,222,188, 89, 31, 21, 44,171,243,223,214,254, -122,232,161,135, 30,122,252, 99, 49,173, 50,241,197,209,215,141, 30,255, 0, 48, 95, 75,100,233,161,135, 30,122,232,161, 71, 45, - 80,169, 69,139, 64,229, 51, 7,238,214,224, 15,106, 51,251,224,174,158, 83,207,169,231,212,115,234, 57,245,156,122,206,127, 29, -231, 63, 17,182, 40, 10,136,191, 86,252, 14,134, 97,246,255, 39,254, 88, 63,245, 85,207,169,231,212,115,234, 57,245,156,122, 78, - 61,231, 63, 29,159, 5,194,151,164,119, 96,233,235, 70, 15, 61,244,208, 67,143,191, 17,130,226, 87,109,183,235,161,199,255,162, -216, 42, 21, 92,181,137,209,106, 84,252,254,225,111, 44,172,183,173,173,237,180,150, 45, 91,186,240,120, 60, 86, 65, 65,193,170, - 7, 15, 30,172, 44,191, 83,215,102,156,215,108, 22, 28,254,250,133, 0, 8, 54,192, 98,129, 98,144,244, 56, 68,209, 86,223,238, -255,213,112, 20, 25, 89,254, 73,176,216,124,138,212,128,210,106, 80, 20,110, 85, 4,154, 38,227, 41,141,170,111,101, 7,219,184, - 13,169, 75, 82,244,111, 0,179, 11, 96,253, 8,208,187, 9,112,102, 48, 32,247, 16, 96,255, 0, 54,243, 59, 40,226, 39, 14,151, -189, 68, 26,120, 62,241,159, 80, 97,231,206,157, 99,127,201,241, 35, 70,140,168,112, 1, 81, 59, 59, 59, 63, 3, 3,131,134,149, - 29, 39,147,201,164, 82,169,212,243, 31,222, 31,187, 1,216, 1,160,121,185,223,223, 1,152, 3,224,222,151,254,129, 7,192,177, - 6,166,243,128,159, 0, 64, 3,252,158, 6,236,243,255, 47,138, 49,180,180,180,124,196,225,112,156,101, 50,153,172,160,160,192, -201,208,208, 48, 90, 44, 22,139, 73,146,140,202,200,200,232, 86, 67,186, 31,241,215, 82, 90,139, 0,236,174,225,118, 61,244,248, - 95,193, 23,205, 58,108, 92,116,127,128, 7,128,110,237,218,181,179,150,201,100,120,247,238, 93, 26,128, 71, 0,252,139, 95,145, - 95,163,164, 44, 22,107,227,150, 45, 91, 22,204,154, 53,171,116, 49,232,144,144, 16,184,185,125,158, 35,148,205,130,195,131,171, -119,173, 94,133, 70,162, 93,175,225,197, 66,139, 5,200,164,240,236,221,190,182, 69, 48, 52, 53, 53, 93, 69, 16,196, 8, 22,139, - 85,237,160, 70,211, 52,197, 48,204,185,156,156,156, 21, 0, 10,106,242, 71, 98, 3,129,150,164,168, 10,255,131,195,102, 83, 50, -185,170,210,180, 23,102,102,102, 1, 44, 22,171, 65,217, 5,179,129, 79, 23,208,174,108, 27, 73,146, 73,153,153,153,186,136, 80, - 33,139,195,155, 67, 16,188,222, 96,209,141, 1, 2, 4, 88,145, 52,165,190, 67,147,154,109, 0,148, 95, 34,178,108,235, 56, 61, -158,183,108,189, 67, 88,196, 59, 44,245, 30,139,223,118, 28,193,146, 57,147,177,109,255, 41,204,153, 54, 6,205,154, 53, 71, 85, -203,138,211,224,173, 91, 54,123, 68, 47,223, 93,103,221,151,204, 28, 33,240,221,117,174,235, 82,239, 81,252,117, 59,207,118, 93, -234, 61, 82,224,187,243,172,251,146,217, 35, 68,235,118,159,167, 1,140,175, 77, 33,199, 56,219,201, 8,146,172,240,105,155,225, -112, 84,167,162, 82,196,255, 31, 87,244,196,137, 19, 91, 42, 20,138, 55, 99,123,183, 94,223,170,177,125,114, 69,251,100,165, 38, -219, 71,191, 15,244,225,242, 68,109,190,245, 57, 18, 82,165,201, 65, 32,104,240,238,221, 59,103,154,166, 65, 81, 20, 72,146, 44, -125, 87,171,213,232,214,173,219,215,154, 56, 51, 16,192,170,162,139, 21,190, 0,206,126, 1,151,132,195,225,204,227,243,249, 30, - 36, 73,186, 0, 0,151,203,141, 80,169, 84,254, 36, 73,110, 1, 80, 88, 67,190,173,201,201,201,205, 36, 18, 9, 52, 26, 77,233, - 2,244,108, 54,187,105,221,186,117,119, 41,149, 74,231, 47, 61,121,107, 96,122,103,119,247,109, 19, 22, 44, 96, 43, 30, 61,194, -182,195,135,183, 34, 63, 31, 0,118, 85,119, 44,159,207,191,197, 98,177, 28,107,242,127, 52, 77,199,171,213,234,190, 53, 57,134, -195,225, 56,167,164,164, 88,217,217,217,161,160,160, 0, 98,177, 88, 92,242,189, 22,150,172, 13, 12,195,136,138,239,237,219, 58, -118,236,216,137, 32, 8, 18, 0, 67,211, 52,235,197,139, 23, 99,104,154,230, 20,223,159, 54, 0, 56, 12, 64,165, 31,179,245,248, - 31,181,102,237,175,169,208,186, 14,192,163, 93,187,118,162,209,163, 71,195,195,195, 3,206,206,206, 16, 10,133, 69, 55,241,172, - 44,235,160,160,160,145,143, 30, 61, 26,121,245,234, 85,188,125,251, 86, 1,224, 9,128, 10, 47,234,158, 94,238,179,132, 18,193, -118, 0,200, 72,202,146, 38,197,164,111,151, 74,165, 27, 0,148, 77, 17,238, 52,126,252,248,249,179,103,207,134,159,159, 31, 78, -157, 58, 5,149, 74,133,130,130, 42,244,139, 60, 29, 57,247,215, 3,226, 88, 32,193, 31, 48,176, 2,196,214,181,174, 41, 83, 83, -211, 85,115,230,204,153,219,172, 89,179,210, 44,230, 90,173, 22, 36, 73, 66,171,213, 34, 39, 39, 7,243,231,207, 47, 26,104, 25, - 6, 52, 77,227,198,141, 27,179,166, 77,155,134,156,156,156,121, 21,113,118,108, 83,231, 53,139, 96, 57,148,216,106, 24,138, 74, -122, 30,148,212,150,164, 40,182, 82,169,169,112,165,114,161,144, 87,165,200,227,114,185, 14,111,255,252,211,138,197,231,131,161, - 40,128,166,193,208,116,113,117, 22,191,152,162,223, 24,138, 6,163,165, 64,147, 52, 72,133, 10,237,127,252, 81,151,170,232,204, -229,139, 78,141,251,126,129, 77,135,142, 29,185,245,234,216,129,164,104,124,140, 77,178,121,243,250,121,151,115, 71,119,205, 80, - 43, 10,198, 0,168, 85,158, 45,190,129,209,237,157,123, 14, 56,188, 10, 10,195,189, 7,143,112,247,190, 63, 0,224,214,131,128, - 18,193, 93,109, 83,129, 44,108, 49,103,202, 96,193,250,157,167,185,115,166, 12, 97,255,182,243, 12,119,246,228,111,217,235,183, -159,226,205,158,252, 45,123,253,142, 83,188,217, 83, 6,179,125,183, 29,106, 9,192, 20, 64, 78,101,100,149,181, 17, 65,146,130, - 19,209,105,108, 0,200,216,187, 23,218,244,116,216,173, 88, 1, 0, 24,231,100,173,179,187,195,194,194,226, 53,151,203,117,168, -110, 63,173, 86, 91,173, 8,158, 56,113,162,155, 66,161,120, 77,146, 36,195,225,112,124,198, 14,233,115,185, 95, 87,183,172,178, -251,132,132, 4,155,175, 91,247,231,224,179,111, 10,152,145,109, 12,223,248,109,156,216,214,107,225,145,224, 42, 6,100,150, 74, -165, 66, 84, 84, 20,202, 46,242, 94, 6, 84,109,159,157, 0,108, 51, 55, 55,239,144,149,149, 53, 14,192,210,252,252,252,150,108, - 54, 27,102,102,102, 75,213,106,245, 71, 99, 99,227,131,121,121,121, 1,197, 86, 35, 93,151, 12,232,102,100,100,116,236,210,165, - 75,166,173, 91,183,102,101,102,102,162,126,253,250,200,206,206,110,255,232,209,163, 54, 83,166, 76,153, 82, 80, 80,240, 93,241, -195,160,174,104, 98, 96, 96,192, 76,152, 48,129,160,168,191, 78,247,208,161, 67,232,235, 74, 54,180, 52, 49,144, 43,213, 76,222, -189, 40,227, 31,120, 60,222,147,248,248,248,188,154, 86, 6, 15,248,105,194,130, 5,108, 73, 92, 28, 36,193,193, 24,151,159,207, -249,173,200,186, 85,173,208, 98,177, 88,142,199, 78,253,225,204,231,243, 65,146,100,169, 24, 44,185, 71,105,181, 90,104, 52, 26, -104,181, 90, 80, 20, 5,173, 70, 11,223, 53,191,215,250, 94,104, 96, 96, 96, 96,107,107,155,102, 96, 96, 96,240, 53, 70, 33,129, - 64,192, 57,122,244,232, 24, 62,159, 15, 0, 80,171,213,112,117,117, 37,244,227,179, 30,255, 48,177,245,153,149,171, 42,161,213, - 63, 63, 63, 31, 20, 69,193,208,208, 16,108,246,167,227,190,185,185, 57,122,247,238,141,110,221,186, 97,244,232,209,120,251,246, -173,104,244,232,209,189, 43, 35, 27,187,192, 11,117,156,173,139, 7, 19,218,246,233,181,160,245,135,126, 61,111,153,154,154,186, -160,204,110, 83,166, 79,159, 78,100,101,101, 97,196,136, 17,143, 84, 42,213, 32, 0,249,149,113, 82, 52,146, 60, 71,143, 3,205, - 16,162, 45, 47, 14, 16,106,165,130, 97,177, 88,138, 18,215, 97,109,106,137, 32,136, 17,118,118,118, 56,125,250, 52,212,234,207, -211,133, 25, 25, 25, 33, 60, 60,252, 47,171, 26,155,141,142, 29, 59,178, 9,130, 24, 1, 96, 94,197,156, 44,135,167,175,226,172, - 74,190,123,245,110,206,235,216,134,149,150,146, 38, 99, 0, 16,203,150, 45, 43, 21,110, 0,176,106,213, 42, 93,202, 9, 22,151, -139, 12,127,255,191,110,196, 28, 22, 88, 60, 2, 4, 23, 96,113,138,188,168, 96, 0,134, 2,104, 18,160,181,128,208,182,142, 46, -213,208,222,190,174,179,223,186,205,187, 77, 84, 90, 6,167,175,220, 67,108,108, 12,216, 44, 22,156, 26, 58,163, 79,247,174,220, - 54,237, 58,213,249,125,229,130,171, 41, 9, 31,250, 3,120, 89,227,138,166, 25, 97,195,186, 22, 56,120,232, 13, 44, 77, 37, 24, - 49,248, 27,136,132, 2,252,182,227, 15,172, 89,226, 13,103, 39, 71,236,219,186,182,210,195,141,141,141, 87,187, 56, 55,116,220, -125,244, 26, 92,154, 54,101,239, 62,118, 13, 46,205,138,223,155,187,176,119, 31,187,134,102,205,155,177,119, 31,187,134,150,205, -155,212,123, 45,125,177, 58, 59, 59,219,187,242,250, 44,215, 70,125,138,218,136, 91, 72,151, 14, 4,113, 51,102, 0, 64,169,208, -170, 9,184, 92,174, 67, 74, 74,138, 85,117,251, 85,103, 53, 40,182,100,189, 38, 73, 18,233,233,233, 68,110,110, 46, 99, 98, 98, - 50,248,230,190,165,151,250,186,187,101, 3, 64,112,112,176,153,175,239,186,193,103, 94,231, 67,241,124, 39,113,226, 79,127,122, -220, 32,143,215, 87,214, 79,108,131,226, 37, 33,202, 67,165, 82,197,182,106,213,138, 41,254,108, 47, 16, 8,120,229,250,155, 93, -163, 70,141, 62,179, 90,235,224, 82,220,246,236,217, 51,239,102,205,154,161,105,211,166, 1, 29, 58,116, 48, 18,139,197,184,121, -243, 38, 92, 92, 92,154, 27, 25, 25,189, 56,119,238, 28,119,241,226,197,110,135, 15, 31, 6,128, 89, 58, 84,103, 47, 79, 79,207, -211,126,126,126, 66, 30,143, 7,133, 66,129,240,240,112, 24, 27, 27,131,207,231,227,219,111,191,101,119,233,210,197,188,123,247, -238, 23, 34, 35, 35,199,160, 6, 51,160,148, 74, 37,179,116,233, 82, 24, 24, 24,192,192,192, 0, 98,177, 24, 98,177, 24, 18, 33, -136,189,115,234,138,102,239,207, 21,205, 91,177,119,253,177,221, 43, 31,212,169, 67,255,146,152,152,152, 91,211,190,160,120,244, - 8,146,224, 96,160,204,181,171, 43,140,197,102,240,241,241,169,206, 34, 5, 30,143,135,206,157, 59, 87,203,103,102,102,118,145, -195,225,124,242,100, 74,146,164,208,199,199,135,138,140,140, 20,179, 88, 44, 49, 77,211,240,241,241,161, 72,146, 20, 90, 89, 89, - 5,208, 52,157,150,153,153, 57, 84,135,226,170, 0, 44, 98,177, 88,219, 4, 2, 1,167, 94,189,122,241,203,151, 47,127, 86,108, -205, 4,195, 48,172,122,245,234,181, 23,137, 68,142, 42,149,138, 68,145,235, 80,111,205,210,163, 66, 48, 12,211,166,200, 40, 92, - 10, 53, 0,126,241,231,172,162,209, 14, 22,229,126, 7,128,204,226, 7, 69,235, 74,190,103, 1,120, 11,160, 9, 0,171,226,109, -175, 8,130,200,174, 69, 49, 43,183,104,249,249,249,149, 62,194,122,121,121,149, 14, 44,134,134,134,120,245,234, 21, 8,130,128, -161,161, 33,140,140,140, 96,108,108,140,252,252,124,188,125,251, 22,239,222,189, 67, 92, 92, 28, 8,130,128,147,147, 19, 74, 46, -160, 50, 40,189,193,157,220,228, 7,161, 68, 0,130, 0, 90,247,104,137,150,221, 92,209,238,101,244,156,215,119,137,253, 82,169, - 52, 10, 0,199,213,213,117, 74,199,142, 29,177,121,243,102,168, 84,170,205,149,136,172, 82,206,199,111,201,182, 0, 96,107,107, -187,240,248,205,143, 6,227,251, 53,148, 75,165,210,141,181,168,156, 79,110,196,153,153,153, 58,175,197, 71,211, 52,114,114,114, -170,228, 44,111, 33,216,178,109,167, 73, 65, 94, 26,126,253,237, 56,180, 90, 45, 22, 44, 88, 0,154,166, 75, 95,185,185,185, 58, -149,147,161,168,207,109, 7,172, 34,239, 41,193, 1,234,142, 42,210, 21, 9,167,119,130, 96, 0,130, 2,240,249,121,149, 31,132, -132,108,158,232,204,202,223,182,155, 4,190, 75,194,149,123,129,208,228, 39, 67, 26,124,169,200,228,216,121, 12,206,170,216,232, -208,178, 33,230, 46,251,221,244,231,185,223,157, 81, 43, 10,154,226, 83, 55,226,221,234, 47, 26, 10,191,174, 94,141,253,219, 55, -227,247,205,219,145,159,151, 11, 46,215,162,248, 70, 79,129,162,168,170,207,157, 97,250,249,204,153, 68,252,182,231, 34,218, 55, -179,197,133,155, 47,225,222,202, 17,151,110,191, 70,183, 54,245,113,229,110, 32,122,116,104,136,235,254, 97,152, 59,125, 12, 49, -230,214,225,126, 53,105,163,173, 91,119,154, 20,228,167,193,111,237, 81,164,239,218,133,120,111,111,180, 47,222,231, 37, 65,128, -231,224, 0,240,170,111,163,242,136,136,136,128, 74,165,170,232,105, 31, 46, 46, 46,213,182,187, 66,161,120, 67,146, 36,147,150, -150, 70,164,165,165, 65, 44, 22, 19,225,225, 97, 84,243,230,174, 67,152,119,231, 15, 0,128,175,239,186, 33,103,223,228, 67, 30, -176, 29,138,103, 59,192,171, 31,194,218,191,106,186,102,218,138,125,111,202, 92,163,159,148, 51, 53, 53,181,127,106,106, 42, 0, -160, 65,131, 6,239, 34, 35, 35,155,148,184,154,139, 93,136, 60,146, 36,157, 75,220,137, 36, 73, 66,165, 82,161, 87,175, 94,236, -170,206,221,212,212,180,163,139,139, 11, 2, 3, 3,177,125,251,118, 51, 79, 79, 79,124,248,240, 1, 4, 65, 96,221,186,117, 68, -179,102,205,184,153,153,153,232,219,183, 47, 46, 94,188,216, 57, 63, 63,191,186,250, 52, 20,139,197,135,175, 94,189, 42,100,177, - 88, 40, 40, 40, 0, 77,211,232,210,165, 11, 88, 44, 22,194,194,194,176,108,217, 50, 92,188,120, 17,151, 47, 95, 22,181,105,211, -230,176, 92, 46,119,193,167,110,253,202,218,136, 81, 42,149,140, 64, 32,128, 64, 32,128, 80, 40,132, 80, 40, 4,159,207, 71,161, - 18,152,182, 37, 94,197, 22, 90,208,205, 91,185, 55,156, 52,123, 29,107,227,242,201,247, 1, 92,209,181,207, 3, 69, 49, 89,219, -254,248, 99,251,184,188, 60, 22, 0, 28, 36, 8, 90,195, 48,191,235,114,189, 3, 64,161, 50, 15,142, 78, 14,184,112,230, 50,134, -141, 26, 92,161,200,226,114,121,224,113,185, 48, 50, 19, 87,203,201,227,241,172,223,189,123,103,206,229,114,193, 48, 12, 40,138, -130, 70,163, 73,251,249,231,159, 45, 7, 12, 24, 96,120,227,198, 13,214,128, 1, 3,104, 83, 83, 83,217,203,151, 47,211, 73,146, - 52,239,218,181,107, 77,250,252,238,150, 45, 91,182,190,116,233,210,100, 31, 31,159,215, 11, 23, 46,252,181,236,198, 13, 27, 54, -172,190,126,253,186,227,144, 33, 67,142, 5, 7, 7,239,174,201, 61,228, 75,239,243,122,206,255, 62,206,202,180, 72, 49,172, 9, -130,240, 43,115,207,246, 42,249,238,227,227,179,212,215,215, 55,156, 32, 8,191,178,191,151,236, 87,252,176,232, 87,209,247,226, - 99,205,150, 44, 89,226,186,126,253,250,117,157, 58,117, 58, 29, 16, 16, 16, 3,160,166, 66,171,234, 24,173,146, 19, 42,123,146, -229, 6, 53,228,231,231, 35, 63, 63, 31,137,137,137,216,187,119,111,241, 5,205, 5,135,195, 1,135,195, 41,141,103,168, 12,247, -252,158,236, 0,176,163,117,235,214,220,208,103,231,110,252,180,127,118,207,182,189, 90,179,223,220, 11, 29,142,162,245, 8,251, - 79,152, 48,193, 2, 0,142, 30, 61,154, 9,224,198,255,147,106, 62, 23, 21, 21, 53,215,214,214,182, 52, 70,165,172,251,144, 36, - 73, 8,133, 66,148,196,178, 40,149, 74,236,221,187,151,100, 24,230, 92, 21,156,136, 12,191,143,168,240, 7, 69,199,209, 52,104, -234,175,227, 87,174, 92, 89, 58, 13, 20, 0,102, 20, 91, 78,170, 21,121, 21,213, 57, 83,238,189,220,239, 12, 69, 85,227,158,224, -205, 30,254,157,183, 45, 77,112,240,231,253, 32,112,185, 92,208,101,172,153, 92,118,209,211,114,248,135, 20,216, 89, 55,199,160, - 49,211,109, 46, 29,219, 57,155,212, 40,127,171,105, 93, 55,109,217, 9,115,230,206,197,129,253,251,177,108,197,234, 82, 5, 64, - 82, 20,200,106,203,201, 98,245,234,226, 10,178, 48, 5,108, 54, 27, 61,218, 55, 4,155,205, 70,239, 78,141,193,102,179,209,183, - 75, 83,112, 56, 28,244,115,111,134, 70,141, 26,129,195,225,176,170,105,119, 68,134,223, 67, 84,248,195, 50,162,151, 1, 3, 64, - 35,149,126,182,191, 86, 42, 5, 83,215,188,166,125, 11, 83,166, 76,201, 77, 76, 76,212,148,223, 86,167, 78, 29,222,163, 71,143, - 76, 42,113,219,149, 66, 36, 18,181,225,112, 56,111,178,179,179,105, 3, 3, 3, 22, 77, 83,116,243,230,174,236,155,251,150, 94, - 42,217,103,201,146,165,151, 70,182, 49, 26,114,252,156, 31,195,171,231, 78, 16, 92, 1,249,253,138,125, 60, 46, 79,212, 6, 80, -232,242,240,192, 82,169, 84,120,255,254, 61,170, 43, 15,195, 48, 85,186,126,114,114,114, 38,184,184,184, 60,218,177, 99,135, 25, - 65, 16,120,252,248, 49,216,108,118,233, 43, 58, 58, 26, 44, 22, 11, 63,253,244,147, 38, 63, 63,127,106,117,101,227,112, 56,115, - 47, 92,184, 96,204,231,243, 81, 80, 80, 80,122,221,176,217,108,188,123,247, 14, 27, 55,110,196,132, 9, 19,144,144,144, 0, 59, - 59, 59, 44, 88,176, 64,178,126,253,250,185, 26,141,102,181, 14, 77, 20,162, 86,171,219, 26, 24, 24, 64, 40, 20,162, 68,112, 1, -192,237,112,110,152, 66,161,104, 97,110, 46,183,177,244,247,251,179,179,231, 32, 55,115, 75,219, 78, 82,169,244, 74, 77,250,192, - 71, 96,127, 44, 69,253,220,255,210, 37,171,167,151, 46,209,207,175, 94, 77, 18, 20, 20,236,211,185, 15,105, 89,136,143, 78, 66, -155, 54,109,240,230,205, 27,180,105,211,166,172,104, 2,159,207, 7,143,199, 3,143,199,131,133,169, 78, 33, 20, 12,139,197,194, -211,167, 79, 65, 81, 20,212,106, 53,212,106, 53,154, 53,107,150,253,224,193, 3, 9, 0, 68, 71, 71, 51,227,199,143,207,125,241, -226, 5, 90,181,170,122, 61,117,107,107,235, 71,108, 54,187, 94,217,223,178,178,178, 76,135, 14, 29,138,156,156,156,111,134, 14, - 29,234, 94,124,253, 38,159, 63,127,126, 60, 0,240,249,124,176, 88, 44, 10,122,252,235, 81,157, 22, 41, 43,148,202, 11, 46, 95, - 95, 95,175,242,191,149, 21, 85, 21,125, 46,123,236,250,245,235,215,149,225, 86,212,162,248,213,199,104,249,249,249, 49, 21, 40, - 72,157, 81,157,208, 42, 65, 96, 96,160,214,206,206,238, 64, 84, 80, 92,207,134, 45,157, 32, 18, 11,250, 0,216, 33, 16, 8,230, -127,247,221,119,120,254,252, 57,194,194,194, 14,225, 11,103,225,184,186,186,222, 18, 8, 4,142,149,184, 73,226,195,194,194,250, - 86, 50, 48,172,184,122,245, 42,170, 10,134,191,127,255,126,217, 65,169,108, 48,124,197, 29,131,102,160,213,104, 33,147, 43,254, - 26,196,139,133,150, 76, 38,195,168, 81,163, 62,177,104,165,167,167, 87,123,126, 4, 65, 96,227,149, 43,184,115,238, 28,190,113, -115,195,197,151, 47,177,254,187,177,104,234,104, 15,134, 34,192, 16, 64,194,169,157,200,202, 47,196,201,123, 79,145, 93, 32,199, -184,174, 93,225,108,100, 81, 53, 47,151,215,187,125,199, 78,188,187, 1,111,193,229,114,192, 2, 13, 70, 43,135,157, 75,119,176, - 89, 44, 24, 91,215, 7,143,203, 5,151,203, 65,116, 98, 38, 92, 92,219,241,253,248,194,222,181, 17, 90,117, 28,235,131,162, 40, - 76,152, 48, 1,167, 79,159,134,185,141, 35,140,235,184, 98,205,230,253,248,166, 87,215,106,207,191,228, 9,158,195,225,128,205, -102,127,246, 94,242, 89, 23,235, 36, 67, 51,208,148,111, 35,154, 1, 24, 6, 14,107,215,194, 97,237, 90,188, 44,254,207,102, 50, - 25, 20, 10, 5,208,161,121,141, 68,150, 90,173, 70, 98, 98,162, 38, 53, 53,213,186,130,237,105,106,181,186, 90, 97,115,228,200, -145,144,137, 19, 39,182, 53, 51, 51,123, 29, 18, 28,172,109,233,230,198,189,177,119,233,229, 18,183, 33, 0,184,185,185,101, 47, - 93,186,244,242,248, 17, 94,131,119,251,140,166,126, 92,125,140, 35, 16,137,218,122, 45, 60, 18,114,106,196,136,234,253, 61, 42, - 85,108,203,150, 45, 25, 93,206, 75, 46,151,167, 86,177,121, 32,128, 85,173, 91,183, 54,242,244,244,196,163, 71,143, 48,108,216, - 48,149, 70,163,137, 2,128, 1, 3, 6, 52, 62,121,242, 36,255,237,219,183,176,180,180,228,198,199,199, 31, 70, 53, 1,242,124, - 62,191,123,187,118,237, 88, 42,149,234, 51,145,181,126,253,122,140, 25, 51, 6,141, 27, 55, 6, 77,211, 40, 44, 44,132,167,167, - 39,119,251,246,237,221,117, 20, 90,115,154, 54,109,186, 17, 69,179, 14,203,222, 11, 35, 80,228,214, 66, 86, 86, 86,106,208,139, -123,225, 93,123, 13,109, 91,175,145,171,109, 88,200,155, 42, 9,173,172,172,150,176, 88,172,145, 52, 77,179,243,243,243, 19,131, -212,234, 70,205, 28, 29,173,187, 12, 30,140, 60, 46,151,189,237,222, 61, 86, 90, 65,129, 4,128, 78, 46, 72,165, 86, 6, 71,167, -162, 80,191, 97,163, 6,227,205,155, 55, 24, 62,122, 8,120, 60, 30, 56, 28,110,209,181,201, 43,178,104,153, 88, 24,233,212, 55, -181, 90,109,233, 61,188, 36,206, 75,163,209,160, 36, 52,203,192,192,160,116,155, 74,165, 2, 65, 16, 85,245, 13,231,179,171,151, - 91,137,140,140, 65,105,181,104, 62,120,120,105,159,126,113,112,183, 8, 52, 45,202,141,143,197,172,115, 87,185,208, 67,143, 74, -172, 90, 85,105,145,178, 66,233, 75, 65, 16,132,159,143,143,207, 82, 0,140,143,143,207,210,146,239,190,190,190, 10, 0,201,181, - 20, 91,159, 89,185, 56, 95, 67,100,149,184, 23,170,130,167,167,231, 44, 67, 67,195,237, 37,223, 19,159, 39, 35,241,121, 50, 92, -154, 52,239,210,218,173,109,222,152, 49, 99, 96,110,110,142,133, 11, 23, 50, 0, 14,213,244,255,163, 35,195, 37, 0, 24, 91, 91, -219,133,197, 55,100,183,151, 47, 95, 90,190,122,245, 10,237,218,181,251,203,116,175,209,192,221,221,189, 42,170,130,226,160,246, -121, 95,207, 74, 70, 67,163,209, 64, 46, 87, 64,173,214,128,212,210, 32, 73, 18,109,154, 27,226,216,126,159,162,223,200, 18,235, - 89,145,213,204,193,198, 16,134, 18,174,150,197, 34, 20,175, 67, 82, 43,188, 99,170,213,106,132,196,199, 35, 56, 46, 14, 0, 48, -200,183,234,192,215, 99,247, 30,161, 89,179,102,213,149,182,161,131,157, 13, 82,238,132, 20,221,188, 21,137,120,245,228, 44, 12, - 13, 37, 0,128,230, 30,227,192,227, 21, 9, 45,153, 66, 3,139, 38,117, 64, 48, 76,165,105, 1, 12, 76,109,110,113,120, 66, 71, -134,162,193, 48, 52, 24,154, 2,195,208, 96,115,121, 6,179,102, 76, 6, 77, 83,104,223,190, 61, 8, 54, 27,148, 86,133, 17, 3, -123, 35, 39,175, 0,230, 38,186, 13, 18, 60, 30, 15, 30, 30, 30,162,202,182,127,248,240, 65, 81, 86,152, 85,221, 70, 90,200,100, - 10,168, 84, 42,104,212, 36, 52, 90, 18, 84, 3, 30,126,253,121, 44, 72, 13, 9,249,232, 78,208,104, 73,208,115,135, 64,163,214, - 34,193,128,197,106,233, 98,161,101,129, 80, 4, 69,100, 24, 85, 39,180, 74,196, 65,101,168, 40, 38,176, 18,177, 21, 60,113,226, -196, 54, 45,221,220,222,140,236,229,182, 41, 52, 44, 60, 37, 52, 44,252,179,253, 28, 27,187,197,254,184,254,244, 2, 46, 79,212, -198,107, 97,213,179, 14,203,162,172, 27,241, 11,177,180,160,160,160,165, 68, 34, 65,100,100, 36,216,108, 54, 8,130,248, 0,160, - 37, 0,216,218,218,126,228,112, 56, 78,108, 54, 27,187,118,237, 34, 56, 28, 78,139, 78,157, 58, 45, 85, 42,149,103,171,120,160, -115, 49, 52, 52,252,196,154,197,227,241,224,227,227,131,241,227,199,151,138, 44, 30,143,135, 35, 71,142,160,109,219,182, 80,171, -213, 46, 58,150,247, 21,128,174, 58, 88,252,136, 98,113, 94,173, 24, 37, 73,114, 98,214,200,145,141,224,239,143, 46, 78, 78,205, -218,180,105, 3,141,230, 47,131,166,147,147, 83,157,130,130,130, 84,133, 66,113, 2, 69,169, 13,130,170, 20, 69, 74, 26,241,209, - 69,225,167,111,222,188, 65,251,246,237, 75, 45, 88,101,173, 89, 60, 30, 15, 34,190,164, 70, 66,139,166,139,238, 75, 5, 5, 5, - 44,127,127,127,139,166, 77,155, 18, 0,208,180,105, 83, 34, 40, 40,200,204,192,192, 32,179, 97,195,134,213, 62, 0,139,140,140, -113,100,226, 40, 0,192, 47,189,250,149, 62, 24,221, 92,181, 20, 92, 46, 23, 61, 23, 46,253,172,223,211, 52,205,134, 30,122,145, -165,131, 22,249, 90, 34,171,188, 69,203,215,215, 55,220,215,215,247, 51,235, 88, 13, 81,189, 69,171,172,233,174,166, 40,185, 88, - 43,195,230,205,155,209,162, 69,139, 42, 7,162,237,219,183,227,248,241,227,155, 1, 68,215,216,228,216,179,117,115,108,185, 20, -238,212,184, 57, 1, 0,171,231, 14,100,201,100, 50, 60,125,250, 20,198,198,198,248,240, 65,231,180, 95,134,198,198,198,171, 88, - 44,214, 8,118,249, 25, 0, 21, 11, 76,138,166,233,115,121,121,121,149,166,119, 96, 24, 64,163, 37, 33,147, 43,161, 86,171, 49, -247,167,157,213, 22,194, 23, 32, 52,234, 2,142, 71,183, 78,162,202, 44, 58,237, 91,116,199,204,239, 36,159, 13,222,108, 22,192, - 98, 1,173,218, 23, 89, 92,130, 94,134,131,166, 1,138, 6, 44,172, 76,113,232,212,166, 42, 69, 62, 73,209,197, 79,199, 20, 10, - 85, 20, 92, 58,122, 33, 41,194,191,212,130,196,231, 21,185,140,121, 92, 46,104,134, 40,202,250, 80,153, 16,226,139, 28,115,164, -209,206,251,253, 66, 49,205,171, 5,206,223, 13,193,240, 94, 45,241,224,197, 91,120,118,104,134,240,168, 56, 52,119,174,135, 93, -135,207,129, 97, 80,176,103,203,154,212,191, 6, 52, 50, 94, 23,139,214,243,231,207, 21,229,173, 88,101,223,153,234,199, 67, 48, -204, 95, 22, 45,133, 82,133,133, 75,116, 74,231, 83,212, 70, 93, 59,138,116,217,185, 42,139,149, 46, 66,172,188,101, 11,213,164, -103,105, 0,160, 45,176,248,255,243,198, 73, 81, 20,174, 93,187, 86,218, 30, 21,181, 99,217,182,211, 65,228, 32, 62, 62, 30,225, -225,225,232,216,177, 35,242,242,242,192,101,177,176, 32, 52, 20,205,190,251, 14,106, 30, 15, 52, 77,131,207,231, 99,250,244,233, - 58,215,103, 13,239,206,197,193,220, 84,117,228,155, 58,117,234,212, 40, 82, 38, 67,248,187,119,232,181,114, 37, 0,224,250,245, -235,159,244,137,249,243,231,243,223,190,125, 59,229,245,235,215, 83, 82, 82, 82, 54, 3, 88, 80,233,125,150, 81,149,198,104,141, - 28, 59, 12,141,154, 54,192,241, 63, 78,149,110,159,191,104, 14,184, 92, 30,184, 60, 46, 76,140, 77,116, 58, 27,173, 86, 91, 42, - 90,229,114, 57,235,250,245,235, 14,189,123,247,230,205,153, 51,135, 0,128,227,199,143,179,118,236,216, 33,190,115,231, 14,207, -222,222, 94, 90,173,184,212,104, 62,107, 99,130, 32,192,229,114,193,227,243, 0,154, 6, 65, 16,226, 13, 27, 54,172, 14, 15, 15, -111,215,180,105, 83,168, 84,170,239, 80, 52, 81, 67,159, 71, 75, 47,182,170,212, 34, 21,197, 90, 21, 91,165, 42, 67, 70,217,184, -173,202,132, 90,217,152, 45,212,110, 82,134,110, 49, 90, 21,129,205,102, 87,107,173, 98,177, 88,213,186, 14,231,207,159, 15, 67, - 67,195,202, 6, 32, 38, 52, 52,244,173, 84, 42,221, 15, 96,103,173, 26,231, 94, 96,248,170,121, 67, 10, 80,236, 91, 53, 49, 49, -201,236,209,163, 71, 33, 0,205,217,179,159, 62, 32,171, 84,170, 74, 7,112, 99, 99,227, 85, 7, 15, 30,156, 61,120,240, 96, 86, -249, 20, 3,101,221,123, 37, 47,173, 86,139,179,103,207,206, 94,188,120, 49,242,242,242,230, 85, 53,136,203,101, 10, 40,138, 3, -161, 63,134,157,215,245,166, 94,233, 38,137,137, 45, 28, 26,180,172,116, 48, 97,241,138, 98,136,172,235,254, 53,128, 25, 26, 10, - 65, 85,193, 73, 16,172,232,184,132, 20,251, 58, 54,102,248,152,152, 1,235,122, 45,144,147,252, 87, 61,112, 56,108,112,139, 93, -135, 38, 70, 98,100,164,167,131,197, 98, 87, 41,140,215,156, 12,196,139,176, 56, 92,184, 27, 4,141, 82,134, 45, 71,111, 66,163, - 42,132, 70, 41,131, 70, 89,244,190,110,241,247, 32, 8,164,106, 85,178,198, 53,105,119, 14,135,131, 14, 29, 58, 84, 42,116,146, -147,147,117,180,104, 49,165, 22, 45,133,178,134,109,164,219,147, 83,149, 22,171,146,237,181, 21, 6, 37, 41, 31, 68, 34, 81,219, - 35, 71, 42, 79,227, 80, 17,108,108,108,110, 72, 36,146,250,186,238, 95,131,228,165,235, 76, 76, 76, 86, 53,109,218,212,101,203, -150, 45, 92, 54,155,141,158, 61,123, 54,182,177,177,137, 7,128,230,205,155,219,149,220, 99,126,252,241, 71,230,249,243,231, 97, - 69,207, 24,149,131,207,231,191, 51, 54, 54,110,235,233,233,137,188,188, 60, 36, 38, 38, 66, 44, 22,163,217,166, 77, 8,253,241, - 71,184,237,221, 11, 86,143, 30, 32, 8, 2,124, 62, 31,161,161,161, 16,137, 68,239,148,202, 74, 83,190,117, 0,240, 59,128, 46, -248,203, 93,200, 0,120,138,162,180, 11, 47, 42,184,223,177, 0,128,162,233,234, 26,107,236,194,133, 11,145,203,229, 2, 3, 6, -128, 23, 29, 13,141, 70,131,142, 29, 59,150, 90,217, 59,118,236, 8, 14,135,131,150, 45, 91,194,206,206, 14,187,118,237, 26, 91, -149,208, 82, 22,106, 16, 31,157,132, 78,157, 58,149, 90,174, 6, 12, 24, 80,106,209,226,114,185,165,150, 45,130,170, 94,184, 18, - 4,193,148,125, 72,166, 40,138,224,112, 56,156,121,243,230, 17,195,134, 13, 99,212,106, 53,205,231,243, 89, 23, 46, 92, 32, 30, - 60,120,192,145,201,100,213, 62,136,187, 14, 25,129, 95,122,247, 47,186,246,235, 91,130,203,227,130,207,227, 97,225,187,164,210, -118, 49, 58,114,154,191,126,253,250,225, 77,155, 54, 45,114,195, 3, 28,125, 30, 45, 61,170, 49,244,100,148, 19, 73,234, 50,223, - 51, 0, 16,197,223, 51,202, 8,170, 12,130, 32, 94, 49, 12,211,174,220,190, 37,219,213,229,222, 75,182, 7,215,162,248, 37,107, - 29,126, 38,190,170,122, 34,142,122,246,236,153,115,155, 54,109,144,144,144,240,217, 76,184,146,129, 75, 44, 22, 67, 36, 18, 33, - 32, 32, 0, 0,162, 42, 35,123,240,224,193, 14, 20,101, 93, 46, 42,145,173,109, 39,207,145,221, 3,218,247,107,135,147,190,167, -242,164, 82,105, 75,252,149, 67,135,176,179,179, 27,207,229,115, 70, 57,185,214,245, 0, 77,255,126,239,234,211,149, 85,157,161, - 83,227,230,133, 0, 20, 37,179, 14,107, 57,251, 16, 44, 22,107,196,224,193,131, 89,111,223,190,197,168, 81,163,112,252,248,241, - 74,247, 29, 63,126, 60, 78,159, 62,141,193,131, 7,179,150, 44, 89, 82,105,122,135, 79,173, 37,234,175,214, 41, 35, 63, 4,227, -216,233,131,149,198, 32, 89, 89, 21,197, 99,165,167,103,150,254,214,174, 77,213,158, 17,154, 84,223, 9,124,253,178, 83,231,110, - 61,121,137,105,185,160, 73, 21,148, 5,127, 29, 47,207, 77, 3, 67, 42,193, 51, 48,131,141,133, 49,222, 60,187,173,214,168,149, -119,170,226,156, 61,184, 57,126, 28,232, 2, 48, 52,134, 44, 56, 4,191,157,179, 74,159,160,221,135,205,193,189,179,219,116,142, -241, 43, 15, 46,151,139,208,208, 80, 69,101,214, 44, 54,155,173, 75, 78,174, 98,171,163, 22,114,185, 2,114,133,242,107,222, 59, - 44,173,173,173,247,152,154,154, 10, 43, 17, 82,150,150,150,150,123,204,205,205,133,186,186, 14, 43, 19, 89,197,121,181, 94, 79, -156, 56,177, 70, 98, 75, 32, 16,212,143,138,138, 42, 77, 86, 90,213,187, 90,173,134,167,167,167,174,201, 75,175, 2,136,177,181, -181,125,218,172, 89, 51,227,143, 31, 63,226,212,169, 83, 60, 46,151, 91,183,228,254, 81, 80, 80, 0, 54,155,141,244,244,116, 45, -128,201,168,198,117,166, 82,169,252,253,253,253, 91, 13, 28, 56,144,253,238,221, 59,176,217,236,162,114,117,234, 4,183,189,123, - 17, 54,111, 30, 60,226,226,160,212,104, 32, 20, 10,113,235,214, 45,141, 92, 46,247,175,140, 79, 36, 18,237,143,141,141,109, 46, - 20, 10,161,209,104, 64,211, 52, 88, 44, 22,193,225,112,220, 77, 76, 76,182, 3,104, 87,174,177,172,220,218,121, 54,161, 72,146, -146, 38,124,204,168,174, 2,178,178,178,112,245,234, 85,116,236,216, 17, 30, 30, 30, 72, 78, 78, 70,116,116, 52,190,249,230,155, -210,125,130,131,131, 17, 24, 24,136,134, 13, 27, 86,111,209, 99,105,209,176, 73,125,240,120,188, 34, 11, 17,151, 87,252,224,195, - 45,181,100,241,184, 60,112, 57, 92, 8, 69, 66,157, 45, 90, 4, 65,128,197, 98,129, 32, 8,136, 68,162,146,135,108,218,193,193, - 65,154,157,157,109, 11,128, 45, 18,137, 64, 81,148, 78, 15, 45, 37, 99, 68,137,200,226,241,121,165,150, 45, 0,200,205,205, 85, - 14, 30, 60,248,132, 74,165,154,132,218,173, 80,162,199,191, 12, 4, 65,188,250,255, 56,182, 6, 24, 80, 44,172, 62, 11,138,175, -170,131,127,211,185,115,231,189, 99,198,140,233,185,117,235, 86, 72, 36, 18, 72,165,210,210, 1,145,207,231,163, 78,157, 58,200, -206,206,198,190,125,251,144,148,148,116, 31,192,116, 93, 75, 36,149, 74,159,127, 8,138,202,242, 28,222,217,188,121,231, 38, 38, -137, 81, 73, 29,165, 82,105, 64,177,200, 58, 52,102,254, 55,147, 60,135,182, 7,143,207, 69,226,135, 84,220,187,250,244, 63,210, -152,108, 54,155, 77, 16, 4, 70,141, 26,165,211,254,163, 71,143,134,191,191, 63,170,114, 51,210, 37, 22, 45,185, 18, 50,197,215, -123, 88,155, 57,107, 60,102,206, 26, 95, 42, 38,116,113,189, 0,128,157,221,153, 42,132,150,102,171,223,153,125,211, 90,183,239, -228,216,182,121,125,188,120, 29,132,147,123,255, 50, 50, 28,222,177, 26,191, 29,190,143, 58,214,166,208,168,100,184,113,254, 64, -170, 70, 37,223, 90, 75,163, 92,145,184, 37, 8, 48, 12, 93,163,115, 47, 17, 79, 92, 46, 23,174,174,174,149, 90,180,178,179,179, - 21,213, 13, 12,165,109,164,214,162, 80,166,128, 66,254,213,132,150,155,187,187,251,157,115,231,206,153, 91, 89, 89, 33, 37, 37, -165,188,208,114,235,210,165,203,157,115,231,206,153, 91, 91, 91, 35, 49, 49, 81,231,180, 34, 21,136, 44,100,100,100, 16, 57, 57, - 57,180,169,169,105,141,196, 22,139,197,130, 74,165, 66, 68, 68,132,174,127,171,243, 12, 49, 99, 99,227, 35,167, 79,159, 54,206, -204,204, 4,155,205, 70, 68, 68,196, 39,179, 14, 75, 94,135, 14, 29,226, 13, 25, 50,228, 96,110,110,110,149,211,218, 72,146,220, - 60,126,252,248, 41,201,201,201,166, 86, 86, 86,144, 74,165,224,243,249, 96, 24, 6,132,167, 39,186,198,196, 64, 67, 81, 16,137, - 68,136,140,140,196,254,253,251,101,197,169, 98, 42, 52,144, 17, 4,225,204,227,241, 48,110,220,184, 79, 54, 28, 61,122, 20,131, -218,178,219, 90, 26,115, 10, 73, 8, 85,105,162,254, 55,216,108, 54,225,214,161, 71,227, 14,221, 6,184,190, 15,123,241, 49, 35, - 45,169,186,155,146, 86,173, 86,163,105,211,166,120,245,234, 21,238,222,189,139, 30, 61,122,192,195,195, 3, 33, 33, 33,184,125, -251, 54, 2, 3, 3, 65, 16, 4,204,205,205, 75,194, 47,170,140,193, 80,203, 73,164,167,100,125,102,189, 42,255,157,199,227, 65, -165,208,232,212, 70,239,222,189,195,171, 87,175, 74, 83,203,176,217,108,242,187,239,190, 3,195, 48, 76,108,108, 44, 12, 13, 13, -153,137, 19, 39, 82, 28, 14,135, 76, 78,214, 45, 62,184, 68, 84,149,136, 44, 14,143,251,137, 64,163,105,186, 32, 36, 36,100, 26, -128,144, 98, 75, 22,160,207,163,165,199,255, 54,174,225,243,133,165,171,181,104,197, 0,232,117,234,212,169,177,151, 47, 95,222, -188,125,251,118, 75, 47, 47, 47,228,228,228,192,209,209, 17,182,182,182,240,243,243,195,245,235,215, 51, 41,138, 90, 0,160, 34, -211, 79, 47, 84,145,179, 38,249,163,244,156,170,176,240,199, 54, 30, 46,184,127,246,177,175,141,141,205,116, 54,155, 61,119,226, -210,111, 39,117, 31,220, 14,145,129,177,120,126, 59, 20,105, 9,153,213,114,150, 15,134, 55, 49, 49,153, 98, 96, 96,192, 7,160, -169,224,169,184,252,172,195, 82, 78,138,162, 40,181, 90,141, 51,103,206,232, 36,182, 78,157, 58, 5,165, 82, 9,234,115,255,106, - 41, 39, 67, 51, 4,135, 43,128, 93,157,166,208,104,100,160,233, 90, 79,168, 44,229, 44,121, 2,253,200,231,195, 42, 51, 19, 47, - 94,188,208, 77,114, 15, 24, 80, 93, 27, 41,213,202,130,113,219,214, 46,244,243,246,249,221,164, 71,231, 86,248,101,211, 81,104, - 52,135,193, 98,179, 32, 18,240,208,166,125, 23,176,161,194,158,245,139,114,229,249, 57,227,240,249, 82, 60,159,112, 50, 85,121, - 88, 24,128,162,105,220,125,244, 82,231,115, 47, 29,237, 41, 10, 28, 14, 7, 31, 62,124, 80, 84, 52,219,144,205, 46,114,115,150, - 60,169, 87,197,201,208, 52,193,229, 9, 81,199,177, 25,212,170,194,175,210, 70, 86, 86, 86,139, 46, 93,186,100, 94,146, 42, 33, - 36, 36, 4, 4, 65, 68,252,101,113, 44,218,174, 80, 40, 16, 22, 22,134,144,144, 16,160,104,134,155,206,215, 81,137, 37, 43, 35, - 35,131,144, 74,165, 48, 48, 48, 96,133,132,132,168, 90,182,108,249,186,154,235,187,148, 83,169, 84,198, 85, 22, 63,169, 84, 42, -237,133, 66, 33,183,220, 32,106,215,168, 81,163,200, 10, 92,136,159,149, 51, 47, 47,239,197,226,197,139,219,244,235,215, 15,139, - 22, 45,202, 54, 53, 53, 53,220,179,103, 15,135,205,102, 19,222,222,222, 84,122,122,122,225,129, 3, 7,140, 47, 95,190,140,220, -220,220, 0, 29,206,189, 64,169, 84, 78,235,220,185,243,209,155, 55,111, 26, 56, 59, 59, 35, 63, 63, 31, 12,195,224,200,145, 35, -240,246,246,134, 80, 40, 68,100,100, 36, 6, 13, 26, 36,151,203,229,211,240,121,236,100, 9, 39, 65, 16, 4, 67,211, 52,150, 47, - 95, 94,154,156,180, 36, 89,169,161,136,192,254,249, 13,196,115, 14,228,137,199,254,114,224, 59, 0,160, 72,146,122, 31,246,226, -227,145,157,191, 60,224,241,120,143,170,105,163,101,115,230,204,217, 51, 96,192, 0,145, 68, 34, 65,118,118, 54,158, 62,125,138, -103,207,158,225,249,243,231, 80,171,213, 48, 55, 55,135,169,169, 41,164, 82, 41,222,189,123,167, 0,176,172, 42, 78,190, 1, 23, - 78,141, 75,102,254, 22, 89,176,184,101,102, 27,150,181,110,241,184, 92,157,174,163,110,221,186,161, 67,135, 14, 37, 2,136,138, -143,143,151,170, 84, 42,162,140,232, 79, 46, 17,228,117,235,214, 37,143, 31, 63,206, 84,197,249,124,255, 46,220,252,117, 25,248, - 60, 30, 22, 68, 36,150,138,174,163, 61, 90,131,203,231,193,101,224,176,178,199,238, 70,145,187, 16,229, 68, 86, 85, 99,199, 23, - 95,155,122,206,255, 90,206,255,101, 72, 81,139, 37,120, 74,112, 82,169, 84,222,248,254,251,239,215,187,185,185,125,191,101,203, - 22,130,199,227, 97,229,202,149, 76, 74, 74,202, 31,197, 79, 33, 57,181, 41, 21,195, 48,127, 60,188, 24, 48, 99,130,207, 96, 98, -254,214,137,238,175,239,133,189,107,209,217, 25, 45, 58, 59,227,245,253,183,216,185,244,212,113, 74, 75, 45, 79, 77, 77, 77,168, -134, 74,213,171, 75,147,242,193,240,230,254, 15,238,153,215,116,214, 33, 77,211,231, 78,157, 58, 53,123,232,208,161,172,151, 47, - 95,126, 22,147, 85,178,236, 14, 77,211,184,115,231, 14, 52, 26, 13,254,248,227, 15,154,166,233,202,243,104,129,185,178,109,235, -250, 9,127, 28,187,194,231,243, 8, 60,123,116, 1,121, 57, 85,207,234,226,241,184, 56,116,228,162,134,199,227,190,175,104,187, - 70,163, 73,188,119,239,158,117, 95,138,226,178, 88,172,138, 4, 84,133, 56,119,238,156,150,166,233,248,106,118, 11, 72, 75, 74, - 24,184,102,209,228, 83, 3, 70,126,111,221,185,179, 59,215,194,202, 26, 4, 65, 32, 61, 45, 29,145, 97, 47,181, 55, 46, 28, 76, -147,201,117, 91,130,103,242,198,135,165, 49, 89, 0,224,229,189,189, 52, 62, 11, 0, 6, 78, 92, 12,207,142,205, 65,232, 98,122, -250, 75,100,209, 36, 73, 66, 44, 22,131, 36,201, 10, 83, 60, 24, 27, 27,139,148, 74,165,162, 56, 17, 99,149,166, 34, 6,248,234, -109, 68, 81,148, 75, 78, 78, 14,100, 50, 25,158, 61,123,198,172, 93,187, 54, 35, 35, 35,163, 52,104, 83,171,213,186,100,103,103, -163,176,176, 16, 1, 1, 1,204,250,245,235, 51,178,178,178,150,214,228, 26, 18,137, 68,109, 57, 28,206,235,156,156, 28,218,192, -192,128,165,213,106,181, 45, 91,182, 20,136, 68, 34,157, 23, 84,151, 74,165,253, 42,219,230,228,228, 20, 21, 21, 21,213,136,162, -168,178,107, 32,242,148, 74,165,115,231,206,157,117,185,127,204, 57,124,248, 48, 46, 94,188,216, 62, 63, 63,127,124,124,124,252, - 81, 0,237, 57, 28, 14,130,130,130, 34,148, 74,229,152,161, 67,135, 30,201,201,201,121,129,162, 37,120,116,193,205,200,200,200, -113, 46, 46, 46,135, 87,173, 90, 37,241,240,240,224,216,217,217,161, 93,187,118,136,140,140,196,181,107,215,180,187,119,239,150, -201,229,242,201, 0,238, 84,221,236, 32, 72,146, 4,159,207, 47,125, 9, 4, 2,240,120, 60, 20, 40, 24, 76,221, 20,173, 32, 33, - 82,108, 94, 57,237, 26, 3, 16,169,137,209,153,233,169,137, 47, 8,130,120, 36,149, 74,243, 42,169, 51,190, 82,169,108,197, 48, - 12,155, 32,136,173, 26,141,102,226,172, 89,179,108,215,173, 91,135, 38, 77,154, 32, 51, 51, 19, 98,177, 24,206,206,206,200,200, -200,192,203,151, 47, 41,185, 92,190, 23,192,106, 20,199,143, 84,134,220,204,124, 56,216,212,253,196,242,201, 48, 12, 24, 10,208, -170, 40, 80, 26, 6,106, 66, 11, 46, 87, 11, 30,143,167,139,229,137,161,105, 26, 57,182,182,160,195,194,240,252,249,115, 48, 12, - 83,169, 85,173,105,211,166, 58,220,216,105,240, 5,252, 79,220,133, 4, 65,128,199,231,131,203,231, 85, 52,115, 70,111,197,210, -227, 31, 13, 93,125,227,185, 0,166, 7, 7, 7, 31,237,222,189,187, 31,195, 48, 92, 20,249, 35, 31,127,201,159,167,166,166,190, - 9,184,246,102,137,181,131,233,250,254,227,221,209,164,149, 35, 40,146,194,211,235, 65,248, 99,221,229,211,201,137,201, 19,161, -195,218,103, 52, 77, 63,232,210,182, 9, 11,101,114,117,219,217,217,209,181,153,117,152,151,151,183, 98,193,130, 5, 88,180,104, - 81,109,102, 29, 86,136,208,119, 25,211, 9, 48, 14, 3,251,119,237, 11,130,197,168,213,170, 42,110,124, 40,205, 92,202,227,113, -223,191, 10,145,182,172,104,191,140,140,140,190,147, 38, 77,186,195,225,112,234,215,164,206,105,154,142, 79, 75, 75,235, 89,253, -158,228, 83,149, 34,223,249,234,233,125,243,110, 94, 60,220,151,166,169,134, 4, 0, 54,135,247, 81,171,209,220, 82, 41,242,183, - 64,199, 69,165, 55, 76,239,132, 57,219,110, 99,215,162,129,152,181,254, 44, 14, 46,159,138, 37,155, 78,225,247, 69,115,176,118, -251, 9,252, 50,103, 28,134,143,157, 68, 51, 4,235,137,174,231,193,102,179,111,238,219,183,111,194,212,169, 83, 75, 39, 45, 48, - 12,243,201,141, 93,171,213, 42,104,154,198,222,189,123,105, 0, 55,171,226,251,180,141, 8,166,170,120, 41, 93,219, 40, 63, 63, -127,114,167, 78,157,142, 0, 16, 48, 12,243, 33, 39, 39,231, 7,224,175,165,161, 10, 11, 11, 39,119,238,220,249, 8,195, 48, 2, -130, 32, 62,219,174, 11,138, 83, 61,180, 53, 53, 53,125, 93,108,201, 18,212, 38, 32,190,170,170,174,194,173,168,139, 11,145, 6, - 48,171, 76,198,247,117,237,219,183, 47,187,168,116, 68, 78, 78, 78,219, 90,148,235,142, 66,161,104,190,124,249,242,121, 66,161, -208, 83, 46,151, 55, 6, 0,177, 88, 28,169, 82,169, 30, 40, 20,138, 45,168, 62, 55,149,154,166,233, 72,146, 36, 93, 45, 45, 45, -139,102,212, 22,139, 45, 0,248,243, 53,245, 26,160,218, 21, 25,197, 79,234, 92,176,235,215,175,215, 51, 53, 53,237, 67, 16,196, -112,134, 97,154, 22, 20, 20,168,150, 47, 95, 30,112,238,220,185,188,250,245,235,247, 31, 48, 96, 0, 97,102,102,134, 87,175, 94, - 49, 89, 89, 89, 23, 0, 44,133, 14, 51,173,105,154,142,223,176, 97, 3,106,122,189, 87,181, 93,163,209,164, 94,191,126,221,162, - 95,122, 58,135,166,105, 12, 28, 56,240, 19, 1, 87, 30,239,223,191,135, 74,165,170, 50,153,163, 42, 47, 7, 61,230, 45, 6,138, -103,127,150,160,200,146,197,128, 81,235,117,149, 30,255, 46,252,221, 11,122,234,100, 90,180,181,181, 29, 37, 20, 11,102, 58, 54, -182,109,153, 18,157,254,182, 32, 79,126, 92, 42,149,238,171,228, 70,174, 19,103, 13, 19,150,234,205,191,127, 19,231, 95,121,180, - 40, 48, 12, 5,134,102,192, 48, 52,104,154, 42, 90,240,154,161,193, 80, 20, 65, 16,120,162, 86, 84,153, 25,188,124, 57, 77, 45, - 44, 44, 86, 51, 12,211,143,205,102,179,202, 26,195,202,126, 46,182,100,221,204,200,200,248,165, 2,203,235,255, 92,125,158, 59, -119,174, 66,241,175,235,172,195, 17, 35, 70, 80, 53,188, 54, 31,136,197, 98,219,138,182,201,100,178, 4,169, 84,218,231,191,164, - 62,203,206, 24,172, 9,103,141,103, 29, 86,199,233,232,232, 40,208,104, 52,173, 1, 56, 19, 4, 97, 2, 32, 91,163,209,220,202, -204,204, 76, 3,208, 22,192,242,226, 99,126, 5,240,250,255,249,122, 23, 89, 88, 88, 28,102,177, 88, 14,186, 28, 76,146,164, 58, - 59, 59,123, 66,185, 7,130, 82, 78,115,115,243,215, 28, 14,199, 65, 7,158,164,172,172,172,182,250,251,167,158,243, 31,132,242, - 65,240,211, 24,134,217,255,159,248,227, 94,122, 78, 61,167,158, 83,207,169,231,212,115,234, 57,245,156,255, 2,161,133,114, 66, - 11, 12,195,232,167,213,234,161,135, 30,122,232,161,135, 30,122,124, 33,174,149, 19, 91,215, 74, 62, 16, 85,168,210,154,152, 4, -107,163,108,239,234, 57,245,156,122, 78, 61,167,158, 83,207,169,231,252,215,113,254, 43,240,183,172, 76,241,149, 26, 72,207,169, -231,212,115,234, 57,245,156,122, 78, 61,231,191,143,243,127, 25,149,186, 14, 89,250,186,209, 67, 15, 61,244,208, 67, 15, 61,244, -248,123,160,179,208, 18, 91, 55,117,177,112,108,121,196,212,161, 69,136,169, 67,139, 16, 11,199,150, 71,196,214, 77, 93,254,165, -245, 38, 2, 48,150,195,225,220,177,177,177,201, 71, 37, 75,239,252, 3, 96, 4, 96, 56,138,242,251, 12, 1, 96,240, 53,201, 61, - 0,206, 40, 96,230,119, 64,194,119, 64,194, 40, 96,166,199, 63,112, 57,142,149,179,109, 59, 61,186, 49,246,198,202,217,182,157, - 42,220,190,192,214,252,249,237, 17,219,214,205,180, 51,251, 74,127,105,104,101,101,181,223,218,218, 58,206,202,202, 42,222,202, -202,234, 48, 0, 99,253,237, 78, 15, 61,244,208,227,111, 67, 73,140, 86,201,171, 52, 70,139, 3, 0,126,126,126, 30, 0, 30, 2, -232,238,229,229,229, 95,254,104,211,186,174, 83, 27, 54,104,184,104,205,202,165,132,141,149,133, 1, 73,209,154,216,184,196,102, - 43,214,172, 63,159,194,231,108,206, 73, 8, 59, 88,139, 66, 17,108, 54,123,148, 64, 32,240, 2, 80, 34,216, 34, 84, 42,149, 31, - 69, 81,103,160,219, 52,109, 88, 91, 91, 63, 98,179,217,245,106,242,199, 20, 69, 37,164,165,165,185,215,178, 50, 71,212,173, 91, -247,176,135,135,135, 65,251,246,237,193,231,243,177,124,249,242, 5, 82,169,116,139,174, 4,166,166, 78,134, 26,129,112, 46,135, -207,239,205,104,213,174, 12, 24,128, 37, 8,163, 73,213, 61,158, 74,181, 57, 39, 39,186, 64, 71,170,165, 0, 38, 22,215,213, 65, - 0, 27,190,164,151, 76,104, 5,173,150, 42,234, 19, 60, 14,168, 43, 49,198, 15,151, 45, 91,198,241,242,242,194,193,131, 7,221, -247,239,223, 63,173,160,160,224, 30,128, 63, 1,124,252,210, 94,105, 13, 76,239,236,238,190,109,194,130, 5,108,197,163, 71,216, -118,248,240, 86, 20,229, 91,218, 85,211,190,196,227, 97,184,133, 5,215,139, 97,208,154, 0, 8, 2, 8,202,200,162,175,107, 52, -212, 25,232,144,139,173, 10,140,197,167,211,241, 79,214,148, 32,239, 35,243,179, 96,160, 75,215,188,143, 15,126, 6,208,191,252, -118, 82, 41,156,192,176,235,120, 41,152,192, 68, 0,155,190,176, 90, 13, 44, 45, 45, 67,174, 92,185,226,208,190,125,123, 14, 0, -188,126,253,250, 59, 47, 47,175, 30, 25, 25, 25,174, 0,242,255,159,110, 66, 66, 14,139, 53,147,207,229,246,166, 40,170, 5, 0, -176,217,236, 80,181, 86,123,135,164,233, 93,208, 49, 39,155, 30,122,232,241,207, 69,117, 90,228,191, 28,149,102,134, 47, 57, 57, -166,236,123, 89,136,173,154, 52,235,216,115,216,251,188, 2,185, 50, 46, 46, 57,103,254,204,181,119,166,205,217,120,121,211, 1, -191,235,254, 47, 34,158,187,180,239,243, 86,108,213,164, 89, 37,212,149,249,112,235,138, 68,162, 55,187,119,239,214, 68, 70, 70, - 50,185,185,185,204,251,247,239,153, 11, 23, 46, 48, 51,102,204, 80,138, 68,162, 55, 0,234,234,194,105,109,109,157,246,254,254, -109, 38, 41, 36,144,137,127,253,130,209,106,181,140, 70,163, 97, 52, 26, 13,243,246,166, 31, 19,242,231, 69, 38,232,194, 25, 70, -173, 86, 51,106,181,154, 81,169, 84, 76,131, 6, 13, 82,116, 44,103,121,216, 53,111,222, 92,237,231,231,199,156, 63,127,158, 89, -176, 96, 1,227,230,230, 70, 1,240,214,245,220,197, 86,206,158,134,246, 45, 51,166,250,236,210, 92, 11,184,197,132,199, 4, 49, -225, 49, 81,204,185,187, 17,204,196,133,219, 53,134,246,110, 25, 98, 43,103,207,234,206,221,212,212,180, 35, 65, 16, 76, 9, 0, - 48,245,234,213, 43, 44,251,170, 91,183,238, 39,175, 58,117,234, 20,214,175, 95,255,163,185,185,121,235,138, 56,199,180, 0,195, -188, 61,201, 48,111, 79, 50,203,186,129, 9, 15, 15,127,206, 48,204,195,146,151, 66,161,120,120,233,210,165,135,223,126,251,237, - 67, 0,131,170,168, 39,157,234,243, 59, 32,161,224,202, 21,134,217,178,133, 97, 60, 60,152, 8,128,249, 14, 72,168, 33,103, 3, - 27, 27,110,208,198, 13,211,212, 87,174,252,193,220,184,113,141,185,126,221,143,185,124,233, 48,179,117,203, 76,141,181, 53, 55, - 12, 64,163, 26,112,114, 0,172, 5,176, 25, 69,150,203,200,140,140, 12, 38, 53, 53,149, 1, 16, 89,252,219,102, 75, 75,203, 77, -168,216,250,214,171,172, 37,107, 94, 63,155, 27, 35,251,187, 51, 5,121, 41,204,200,254,238,204,188,126, 54,159, 88,182,250, 57, - 57, 25,206, 26,216, 34, 35,252,245,113,106,214,192, 22, 25,253,156,156, 12,107, 89,159, 4,138,214, 9,221,125,255,254,125,146, - 41, 3,173, 86,203, 28, 61,122,148, 50, 53, 53,253,163, 6,156,141, 45, 45, 45,227,205,204,204, 34,203,254,104,217,114, 72,231, -166, 93,191, 91, 97,222,236, 91,143, 26,148,179,189,144,199, 75,186,115,118, 15,149,149, 16,202,168, 21,105, 76,222,135, 64, 38, - 41,226, 57,115,116,223,102, 45,159,195, 73, 2,208,254, 75,250, 82, 13,161,231,212,115,234, 57,255, 11, 57,171,210, 34,255,139, -248, 44,189, 67,101, 39, 38, 16,240,125, 86, 44, 91, 76,228,102,229, 42,148,249, 5,106,173, 82,169,100,241, 24,101,232,219,152, -116, 22,135,157, 59,111,206,108, 67,159, 37,203,124,100,192, 56, 29,255,187,174,155,155,219,203,139, 23, 47, 90,153,153,153, 33, - 47, 47, 15, 89, 89, 89,120,249,242, 37, 24,134,193,208,161, 67, 5, 29,218,181,107,253,243,242,229,207,146,146,147, 59,161,242, -129,247, 47,241, 98,102,129, 13,238, 69,107,209,254, 18,151, 85, 52,234, 16, 4,246,143,240, 42,221,103,117, 82, 94,209, 99,181, - 80, 88,186, 32,113, 45,208,169,103,207,158, 60, 0,152, 50,101, 74,126, 65, 65,129,111,177,133, 67,167,149, 86,197, 86,206,158, - 22,182,118,126,123,246,110, 16,181,104,232, 12,141,150, 68,124,106, 10, 56, 92, 19, 56, 56,240, 48,105, 92,111,110,183,206,102, - 22,107,127,221,127, 45,149,198, 16,121,102,212,173,202,184, 76, 76, 76,142,158, 57,115, 6,103,207,158, 5, 0, 68, 70, 70,194, -217,217, 89, 92, 93, 25,194,194,194,156, 6, 13, 26,116, 58, 43, 43,171, 81,117,251,150, 79,140, 47, 16, 8,224,238,238,142,102, -205,154,225,202,149, 43,221,139, 45, 91, 95, 4,197,163, 71,144, 4, 7, 3,254,181,122,120,105,208,166,141,227,243,235,215,142, - 91, 92,187, 30,129, 77,155, 14,227,227,199, 34, 67,155,147,147, 19,198,142, 25,193, 13, 13, 13,104, 62,124,248,216,128,199,143, - 63,186, 23, 11,165,234,176,234,192,129, 3, 75,235,215,175,143,225,195,135,143,104,222,188,185,141,145,145, 17,246,237,219, 7, - 91, 91, 91, 39,181, 90,253,225,202,149, 43,118,169,169,169,152, 61,123, 54,210,210,210, 22, 84, 70,212,189,111,247,159, 5, 3, - 93,186, 54,105, 51, 1, 18, 35, 91, 28, 56,117, 6,239,223, 28,237,170,210, 68,252,204,163,252,199, 43, 24,193,196,140, 4,137, - 79,189,182, 30,230,141,154, 15,130, 99,155, 64, 11, 37,245, 56,230,231,222, 13,214,115,132,202,163, 43, 55, 73,179, 62, 35, 29, -126,142,237,154,255,206, 44,236, 14,178,128,149,116,137,192, 42,181,214, 50, 24,212,173, 91,183,210,134,139,139,139,131, 74,165, -130,139,139, 11, 75,173, 86,123,234, 88,175,141,251,244,233,243,228,250,245,235,230,141, 27, 55,206,200,206,206, 46,221, 96, 99, -110,210,215,255,226,214,217,107,183,157,104,122,140, 33,114, 51, 34, 46,135, 86,195,213,190, 75,199, 54,119,111, 92, 60, 46, 33, - 10, 19,193, 55,201, 4,232, 44, 68,159, 62, 4,194,192, 12,163,102,204,231,120,246,236, 97,223,187,255,176,187,239,163, 62,246, - 4,240, 74,255, 92,175,135, 30,255,106,171, 22,243, 79, 59,167, 82,161,229,229,229, 69, 84,116,130, 52, 67,183,180,182, 50, 23, -109,221,120,228, 21, 91,163, 86,139, 77,140,213, 92, 99, 35,154, 48, 52,102,107,212,218, 66, 71, 39, 71, 62,205,208, 45, 43,225, - 47, 63,197,147, 16,137, 68, 23,255,252,243, 79, 43, 46,151, 11,154,166, 97,105,105,137,216,216, 88,228,230,230,162,160,160, 0, - 31, 35, 34, 80,191,110, 29,172,244, 89,108, 59,123,177,207, 69,185, 92,222, 22,159,186, 17, 63,155, 54, 74,105, 63, 93, 55,186, -100, 9,150,207, 30,249,139,127,171, 96,155,174, 83, 81, 99, 19, 18, 18, 32,145, 72,224,234,234, 42,121,250,244,233,227, 42, 68, -214, 39,156,166,166, 78,134,180,128,127,118,247,158,229, 34,141, 54, 12,111,163,179,209,164,126, 87, 88,155,215, 69, 74,182, 26, -207, 95,254,137,176,144,147,104,104, 95, 23,222, 51,122, 8,215,111, 56,127,134, 71,214,175,155,155, 27,155, 95, 17,103,126,126, -190,164, 65,131, 6,168, 91,183,104,221, 51,138,162,240,246,237, 91, 80, 20, 85,250,189,236,251,145, 11,247, 65,230,199, 99,194, -119,223, 33, 43, 43, 75, 82, 17, 39,151, 13,114,254,180,177, 28, 17, 23,224,139,205,212,133,133,133,165,211, 83, 53, 26, 13,130, -130,130,208,169, 83, 39,143,115,231,206, 85,167,138,116,170, 79, 13,240,251,182, 63,254,216, 62, 46, 47,143, 5, 0, 7, 9,130, -214, 48,204,239,186,246, 37, 43, 43,238,133,155, 55,142, 89,176, 89,239, 96,102,252, 27, 94,190,140,135, 70, 83, 84,222,172,172, -116,204,154,153, 15, 30,215, 16, 87,174,156, 48,119,113,113,191,144,154,170,113,197,167,110,196,138,202, 41,188,113,227, 6,102, -205,154,133,183,111,223,218,177,217,108,188,120,241, 2, 34,145, 8, 27, 55,110,100,187,184,184,216,137,197, 98,220,188,121, 19, -105,105,105, 68, 85,229,124,120,235,225,154,188,143, 15,126, 78, 37,110,246, 59,112,234, 12,190, 31, 51, 10, 54, 76,244, 99,227, -134,196,154, 62, 3,187,252,194,176,235,120,137, 13, 91,154, 58,187, 14, 4,143, 47,129,247, 79,171, 17, 25,118,213, 84, 94, 16, - 50,147,160, 18,235,172,220,116,110,206,103,229, 60, 63,130,154,114,242,105,155, 59,117, 95, 57, 6, 7, 77,123, 33, 13,220, 31, -242,151,208,114,226, 16, 44,202,184,228, 73,234,195,135, 15,248,248,241, 35, 56, 28, 14, 20, 10, 5, 72,146,172,176,156,118,118, -118,211, 73,146,252,165,184,157,143, 8,133,194,201,199,143, 31, 55, 47, 43,180, 45, 91, 14,233,108,110, 40,238,153,150,158,149, - 19,240, 42,252,253,252,233,195,187, 63,122, 30,150,168,225,126,155,144, 23,114, 37,175,146,250, 20,138,248,252, 11, 55, 47,157, -144,104, 99,238, 67,236,210, 29, 92,137, 51, 40,109, 50,228, 57, 50, 20,124,148, 66,181,103, 39, 90,205,156,135,171,151,207, 75, -154,183,104,123, 78,165,213, 58, 3, 80,215,226,218,172, 9,244,156,122, 78, 61,231,127, 39,103,165, 90,132, 97,152, 54, 0,172, -139,191,102, 21,235, 2, 11, 0,153, 40, 90, 69,198,186,248,222,193, 47,115, 88,249,239,101,247, 45,255,189,236,231,172,226,207, - 86,197,239,175, 8,130,200,174,166,232,182, 40, 90,154,240, 90,241, 59, 80,236, 74,172, 54,240,152, 32, 88,249, 20, 69, 11,120, -150, 86,202, 41, 35,123,182,184,125,247,117,144,129,133, 17,167,111,247,214, 30, 47, 67, 99,158, 17, 44, 66, 75, 16, 44,157,226, - 62,216,108,246,168,173, 91,183,182, 48, 50, 50, 2, 77,211, 48, 54, 54, 70, 70, 70, 6,212,106, 53,242,242,242,160, 42,200,135, -166, 32, 31,193,137,113,232,226,209, 29,195,250,245,113, 57,113,249,207, 81, 20, 69,157,174,138,215,174,101,235, 82, 75,214,234, -122,230,127,153, 38, 18,115, 75, 69,215,111,173,157,193,147, 72,208,123,190,207,151,244,129,192,107,215,174,221, 24, 58,116,104, -255,133, 11, 23,178,164, 82,233,205,216,216,216, 46, 0,222, 86, 43, 42, 4,194,185, 63,206,245, 50, 53,149, 48, 56,119,231, 79, -116,107, 61, 6, 6,124, 54,178,242, 53, 32, 8, 32, 34,252, 34, 8,194, 12, 33,145, 82,116,109,101,132, 62,125, 93, 36,151,207, - 71, 44,196, 95,241, 65,159, 53, 77, 78, 78, 14,210,211,211,161,213,106,161,213,106, 49,124,196, 8, 28, 59,122, 20, 50,153, 12, - 10,133, 2,106,181, 26, 20, 69,129,197, 98,225,142,223, 57, 36,198, 68,160,115,167, 78, 64, 37, 75, 47, 29, 13, 2, 23,192,243, -247,239,223, 35, 34, 34, 2, 73, 73, 73, 16, 10,133,176,177,177,193,234,213,171,161, 82, 21,173, 81, 54, 98,196, 8, 15, 0,161, - 95,122, 65,125, 4,246,199, 82,212,207,253, 47, 93,178,122,122,233, 18,253,252,234,213, 36, 65, 65,193, 62, 93,142,229,241, 48, -124,195,239, 51,154,136,197, 98, 36, 37,108, 69,211,166, 60, 44,152,103, 14,223,223, 50, 1, 0,179,103, 57,160, 93, 91, 11,228, -231,158,135,133,213, 82,108,223, 62,167,225,196,137,155,191,147,203,169, 35,213, 80,255,252,231,159,127, 14,115,118,118,182, 15, - 12, 12, 36,248,124, 62, 68, 34, 17, 68, 34, 17,132, 66, 33,210,211,211, 17, 27, 27,203,108,216,176, 33, 25,192,207, 85, 17,173, -220, 46,125, 6,160,255,188,126,184,241,254,205,209,174,246,236,152,224, 97,222,238,113, 33,207, 3, 11,110,223,121,250, 43,169, - 20, 38,230, 38,221, 93,220,160, 93,160,197,204, 69,171,176,115,195, 10,188,127,241, 40,219,186,110,254, 46, 17,161,170,176,156, - 30, 30, 43, 57,182,214,102,228,244,137,195, 76,174, 90, 7, 76,191,206, 33, 50, 82, 51,223,108, 68,108,160, 66,208,168,245,248, -198, 78, 44,245,253,251,247, 69,221,186,117,131, 82,169, 44,181, 76, 30, 63,126,156, 38, 73,242, 65,133,125, 83,163,249, 37, 57, - 57,217, 86,161, 80,160, 95,191,126,179, 55,110,220, 40, 46, 89,163,142,162,168, 79, 44, 89,107,182, 28,187, 53,247,151, 93, 15, -110,157,254,205,110,141,207,228,238,227,188,215, 62, 64, 37,235, 72,114, 88,172,153, 87, 47, 29,182, 17,154,106, 33, 50,235, 3, -101,154, 2,239,247,127, 15,121,190, 18,237,214,172, 2,192,135, 90,203,194,190,129,195,193, 53,183,195,138,169,147,237,150,237, - 59, 48,131,166,233,173,250,231,122, 61,244,208,163, 28,172, 9,130,240, 3, 0, 31, 31,159,165,190,190,190,225, 4, 65,248, 49, - 12,227, 85,108, 64,241, 99, 24,198,171,100,159, 98,113,246,217,247,146,125,203,127, 47,255,121,201,146, 37,205,215,175, 95,191, -174, 83,167, 78,167, 3, 2, 2, 98, 0, 84, 39,180, 6, 20, 11,171,242, 75,241, 20,205, 58,244,242,242, 34,202,190,127, 98,209, -162,233, 71, 31, 98,226,228,125,122,117,112,240,243, 15,125, 53,105,210,128,158,163, 6,118,235, 27,155,144, 21,209,208,209,198, - 34, 60, 60,212,136,166,233, 71,186,212,146, 64, 32,240,234,209,163, 7, 39, 39, 39, 7, 6, 6, 6,200,200,200, 64,114,114, 50, - 52, 26, 13,148,121,185, 80,229,229, 66,153,155, 3, 77, 94, 14, 62,190,126,137,150, 13,157, 4,197,193,242, 85,162,196,234, 82, -222, 82, 85,214,178,197, 55, 52,132,192,208, 16, 68,205,221,134,223,154,152,152, 60, 47, 25, 84, 53, 26,205,204,197,139, 23,103, -210, 52,141,181,107,215, 26, 73, 36,146,115, 0, 4,213,145, 24, 90,178,189, 58,181,114,101,189,139, 13,129,187,219, 4, 52,110, -240, 13, 98,211, 20,200, 44,208, 32, 61, 87,131,118,221,118,160,158,219, 42,212,105,229,139,136,248,108,216,217, 59,179,192, 17, - 84,185,248,115, 98, 98,226, 39,223, 79,159, 58, 5,185, 92,142,134, 13, 27, 98,204,152, 49, 88,188,120, 49,198,140, 25, 3, 59, - 59, 59,140, 27, 57, 8, 43, 86,172, 64,106,106,106,117, 69, 85, 53,110,220, 88,229,232,232,168,114,116,116, 84,105, 52, 26, 20, - 22, 22, 34, 55, 55,183,124,125,207,169,105, 69, 90, 89, 89, 45,177,177,177, 9,177,178,178, 10, 23, 8, 4,215,131, 8,226,157, -210,209,209,186,203,224,193, 68,179,145, 35,217,241, 34, 17,225, 15, 72,116,225,178, 48,227, 14,240,236,209,159,159,155,115,184, -212, 72, 53,121,146, 37,158,248, 55,199,211,199,109, 49,107,102, 67, 16, 44, 33, 8, 22, 31,114,217,125,116,104,223,137,103, 98, - 66, 84,215,151,198, 2, 8,234,210,165,139,157,183,183, 55, 33, 16, 8, 48,123,246,108,205,212,169, 83,163,198,140, 25, 19,117, -239,222, 61,202,209,209, 17,117,234,212, 33,234,212,169, 99, 11, 32,168,248,152, 42, 97,212,144, 88,163,210, 68, 60, 54,113, 22, -199, 80,176,232, 92,168, 21, 12, 95,185, 73,154,181,102,119,204,166,216,247,114,167,247, 47, 30,101, 69,133, 93,165, 99, 95, 61, -204, 76,137, 42,112, 90,179, 59,102,211,210, 93, 41, 21, 94,212,254,254,160, 47,250,249,107,228, 50, 57,103,240, 64, 79,249,244, - 41,163, 26,155, 73,154, 31,135,125, 31,183,122,117, 29,198,173, 88,183, 93, 51,117,198, 92,205,193, 67,135,153,130,130, 2,228, -231,231, 99,251,246,237,228,213,171, 87,147, 41,138,154, 91,217, 51, 16, 0,104,181, 90, 76,159, 62, 93,108,100,100,132,196,196, -196, 82,139, 40, 0, 72, 51,178, 66,159,190, 10,123, 55,255,135, 17, 30, 50,149, 74,117,235,225,235,136,102,206,142, 14, 4,193, - 84, 58, 17,133,207,229,246,110,219,161, 3,155, 97,114, 65,112,234,226,227,209, 13,200, 79,205, 70,126,122, 54,216, 92, 49, 72, - 8,160,165,249, 48,105,217, 30,145,175, 2, 97,111,105,205, 17,112,185,125,245,227,137, 30,122,252, 59, 81,149, 22, 41, 43,150, -214,175, 95,191,174,170,237,101,222,213,229,190,151, 10,169,242, 34,172,236,103, 0, 88,191,126,253, 58,134, 97,188, 2, 2, 2, - 78, 1, 80,232,120, 10,211,202,188, 79,251, 68,104, 85,105,133, 82,170,125, 23, 46,254, 25,166,198, 34,227,246,173,157,109,174, -220,244,127,253, 40,224,117, 68,189, 58, 22,150,140, 86,109,250,251,230,157, 14,132, 92,177, 94,199, 66,184, 88, 88, 88, 64,163, -209,224,195,135, 15, 72, 74, 74,130, 70,163, 1, 41,147, 65,149,155, 11,101, 78, 14, 40, 89, 1,120, 20, 5, 69, 70, 58,204, 13, -132,192, 95, 51, 18,171,177,188, 17, 21, 10,173,146,119,161,145, 17, 4,134, 70, 96,113,185, 21,186, 21, 43, 65,155,246,237,219, -159, 13, 11, 11,235,208,171, 87,175, 95, 81, 52, 69, 62, 62, 57, 57,185,231,242,229,203, 85,214,214,214,152, 62,125,122, 19, 0, - 19,170, 21,153,124,181,139,163, 77, 19, 52,118,154,128,122,117,122, 32, 87,166, 69, 70,190, 22,233,185, 26,236,219,209, 9, 23, - 14,182,199,147, 11, 93, 17,118,171, 55,114,181, 54,144,216,125, 11,134, 82, 55,175,138,243,206,157, 59, 88,189,122, 53,126,253, -245, 87,172, 93,187, 22,191,254,250, 43,146,147,147,225,234,234,138,132,132, 4,220,184,113, 3, 82,169, 20, 22, 22, 22,120,249, -242, 37,182,108,217,130, 39, 79,158, 84,123,210,186,100,179, 45,222,167, 70,190,116,146, 36, 39, 74, 7, 15,110,145,102,102,214, -172,117,235,214,253,103,207,158,237,212,165, 75,151,210,237, 78, 78, 78,117, 69, 34, 81, 42,138,102, 80,182,170,138,139, 6, 90, - 91, 90,186, 66,173,122, 87,220,198, 92, 16,132, 16, 61,122, 71,160, 75,215,215,208,104,121, 96, 17, 2,176, 88, 66,144,100, 22, - 76, 77,237,192, 48,132,107, 53, 69, 92,158,145,145,225,124,247,238, 93, 86,108,108, 44,132, 66, 33, 0,196,173, 92,185,114,231, -166, 77,155,222,154,155,155, 83,126,126,126,184,124,249, 50,188,188,188,216, 83,167, 78,117,174, 83,167,206,222,234,206,123,229, -118,233,179,147,155,111,140,230,106, 77, 91, 9, 69,245,234, 67, 38,249,246, 71, 15, 11, 49, 0,220,140,142, 46,176,170,155,191, - 94, 86, 16,146, 96,226, 80,248,219,205,232,234,102,156,174,164,223, 68,189,123,126,242,210,205,188,244,180, 28,110,235, 22,205, - 21,190,171, 23,241,234,213,111,244,251,138,197, 63,216, 36,231, 11,115,123,207,190,241,238,226,205,151,133,227, 39,125, 79, 78, -153,230,173,188,113,243,206, 37,154,166, 91,160,146, 25,135, 52, 77, 67, 42,149, 34, 60, 60, 28,209,209,209,200,200,200, 64,102, -102, 38, 10, 10, 10, 74,221,141, 6, 5,249,215,118,254,113, 53, 88, 44, 18, 25,116,104,225, 92,247, 69,224,219,116,177, 72,100, -224, 92,191,110, 99, 96,101,133,247, 17,138,162, 90, 8, 13, 68, 0, 8,228,134, 61, 66, 97, 78, 33, 10,115, 11, 81,144, 93, 8, -149,134, 13,165,138, 5,133,154, 5, 71,143, 62, 40,148, 41, 81,152,149, 7,154,162,220,244,195,141, 30,122,232, 81,197, 88,239, -231,227,227,179, 84,199,125,117,118,111,150, 23, 94, 62, 62, 62, 75, 9,130,240, 91,178,100, 73,115, 84, 62,161,170, 44,246, 87, -240, 2,160, 67,122,135,172,172,168, 66, 67,194,101,232,188,159,126,185,113,234,208, 14, 43,149, 74,158, 96,110, 42,161, 36, 6, -124,139, 41,211,215,162,160, 48,103,136, 76,247,116, 4,200,201,201, 65, 76, 76, 12, 68, 34, 17,120, 92, 46, 40,133, 2,148, 66, - 6, 69, 78, 22, 88, 26, 21,120, 20, 5, 51, 3, 17, 28,237,108, 80,207,218, 70, 39,206, 15,247,111,151, 6,190,151,117, 23,110, -104,239, 2,190, 88, 2,190,161, 4, 63,250, 61, 4, 0,240,120, 60, 96,249,175, 58, 25, 77,236,237,237,255, 60,121,242, 36, 47, - 35, 35, 3, 65, 65, 65,193, 0,242, 0, 24, 2,160, 35, 34, 34,238,134,133,133,121, 57, 59, 59, 3, 64,195,234,200,242, 51, 89, -148,150,100,144,152, 26,135,216,164, 64,152, 25, 55, 0,215,160, 49,210,115, 53, 16,136, 26, 64,171,250,203,251,168,204,143,135, - 66,195,214,233,220,213,106, 53, 72,146, 4, 73,146, 80,171,213,152, 54,109, 26,158, 6, 4,224,244,229,123,136,249, 24,137, 38, -245,109,240,221,119,227,209,190,125,123, 4, 4, 4, 84,201, 53,161, 21,180,246, 18,112, 54,247,103,129, 47, 49, 87,117, 92,124, -235, 69,117, 98,139, 32, 8, 6,149,184, 34,203, 97, 83,167, 78,157, 26, 69,202,100, 8,127,247, 14,189, 86,174, 4, 0, 92,191, -126,253,147,115,153, 63,127, 62,255,237,219,183, 83, 94,191,126, 61, 37, 37, 37,101, 51,128,138,131,205, 25,224,218,181,103,248, -225,135,183,200,200,200, 0, 0,156, 57,245,151, 46,141,141,209,160,223,128, 34,143,150,137,137, 9, 54,111,118,213,169, 62, 41, -138,194,254,253,251, 75,221,133, 0,192,225,112,186,204,159, 63,127,104, 69,251, 55,106,212,136, 87, 29,231,188,225,246,194, 39, -193,204, 76,227, 70,245,154, 27, 89,180, 68,150, 54,208, 53, 48, 89, 58,107,222,112,251,173, 91,206, 39, 43, 69,132,234, 8, 65, - 37,214,225, 8,149, 71,117, 41, 99,244,205, 29,234, 44,199,137, 71, 83, 51,242,151,121,127, 63,214,220,200,196, 74,118,112,167, -175, 41,139,205, 98,254,124,173,201,109,238,100,110,242,109,199,109,133, 63,204, 91, 30,168, 38, 19,189,145,248,103, 36,170, 72, -113, 65, 81, 20, 82, 82, 82,144,145,145,129,132,132, 4,100,102, 22,185, 95, 51, 51, 51, 65,211,244,151,220, 16,161, 72, 72, 64, -252,165,131,168, 55,126, 60,218,253,186, 26, 20,205,129, 66, 78, 97,115,231,158,200,201, 83, 64, 69, 19,176,107,211, 25,223, 95, -127, 12, 22, 67, 1,251,118,233, 71, 18, 61,244,248,151, 66,151,244, 14, 37,130,200,215,215,215,235,107,255,127, 89,177,229,235, -235, 27,238,235,235, 91,147,255, 42,239, 50, 44,253, 94, 18,163,245,176, 76, 0,218,103,131,102, 65,102, 68,244,219,183,156, 20, -153, 66,102, 96,109,101,169, 50, 16, 10,232,188,252, 2,118, 96,104,176, 70,150,250,241,125, 13,206, 35, 34, 44, 44,204, 53, 37, - 37, 5, 9,241,241, 32, 21, 50,176, 84,106, 48, 74, 57,122,185,119,134, 16,128,144, 69,128, 71,107,192, 97,243, 81, 80,152, 15, - 0, 17,213, 14,142, 90,237,103,150, 45,130, 32,192, 55, 52, 4, 95, 44, 6, 95, 98,248,137,133, 75, 23,139,141, 64, 32, 56,121, -238,220, 57, 91,123,123,123,172, 94,189, 26, 14, 14, 14, 77,237,236,236,228,198,198,198, 34,107,107,107, 52,107,214, 12,157, 59, -119,198,141, 27, 55, 0, 29,114, 74,105, 73, 97,200,251, 56,116,201,204, 14,192,227,135,123,160, 86,168,208,218, 99, 15, 52,156, -122,176,108,190, 10,244,135,227,144,167, 94, 41,178, 30,216, 12, 68, 82, 66, 28, 8, 54, 63, 92, 87,203, 83,201,231,224,224, 96, -156,186,226, 15, 91, 71, 23, 36, 68,189,195,187, 7,119,241,212,210, 28,142, 46,205, 74,221, 64,149,150,145, 2,103,205,174,162, - 52, 81, 63,207, 28, 43,200,206,206, 22,152,153,153,169, 74,234,206,214,214,246, 75,196,214,216,133, 11, 23, 34,151,203, 5, 6, - 12, 0, 47, 58, 26, 26,141, 6, 29, 59,118, 68,187,118,237, 0, 0, 29, 59,118, 4,135,195, 65,203,150, 45, 97,103,103,135, 93, -187,118,141,173, 76,104,177, 8, 4,145,100, 86, 83, 39, 39,167, 82,161,117,244, 88, 6, 2, 95,247, 6, 1, 62,182,239,252, 80, -186,111,221,186,117,145, 42,141, 6, 65, 48, 97,213,148,241, 87, 27, 27,155,229,182,182,182, 78,155, 54,109, 98, 11,133, 66,204, -152, 49,163, 65, 97, 97, 97,189, 98, 83, 50,150, 44, 89, 2, 0, 88,177, 98, 5, 86,174, 92, 9,149, 74, 37,175,140,236,232,230, - 22,118,233,217,244, 20,166,208, 96,136,167, 69,189, 22, 61,250,246, 66, 3,231, 30,232,209, 55, 1, 0,214,153,113,226, 70,254, -190,204,228,146,137, 33,113,248,246,205, 59, 43,220, 61,122, 44, 91, 92,248, 96,205,111,251,115,171,141,121,204,139, 63, 82,240, -158, 63,106,203,142,189,199,182,252,178,100,142, 48, 33, 67,157,147,156,195, 20, 74, 4, 28, 73, 67,107, 66, 50,235,167, 95, 99, - 82, 82,162, 23, 32,241,102,181, 51, 45,105,154, 70,116,116,116,105, 76,159, 82,169,132, 76, 38, 67, 98, 98, 98,105,159, 81,136, -141,250,121, 79, 26,232, 38, 83, 40,228, 47, 66,163, 18,126,158, 61,174,147, 76,161,144, 71,197, 38, 68, 2,219, 43, 84, 99, 44, - 22, 43, 84, 94, 32,239, 37,207, 85, 34, 35,232, 61, 28,122, 58, 66, 75, 18, 80,147, 20, 50,178, 10,160, 34, 1,138,197, 69,243, -145,223,129, 34, 56,200, 76, 73, 6,139,205, 14,198,167, 65,251,122,232,161,199,191, 7, 85,106,145, 18,139, 86,167, 78,157, 78, -151,181, 58,149,124, 6,160, 66,213,161, 60, 25,101,197, 84,137, 59,177,178,255, 41,199,171, 43, 62,139,209,170, 54,189, 67,201, -127,214, 49,206,183,219,176, 98,156, 3, 77,146, 77,210, 51,211, 72, 14, 71,192,173, 99,172,144,102, 39,232,254,239, 42,149,202, -239,238,221,187,131,123,247,238, 45,136, 10, 13,134, 58, 47, 15,234,188, 92,112,105, 18,102,162,182, 96,105, 84, 32,212,106,216, - 55,165,161, 44, 16,193,255,105,152, 86,165, 82,249,233, 42,180, 88,108,246,167,113, 89, 18, 9, 4,134, 70, 16, 72, 36,229, 93, -139,213,137, 2,131, 62,125,250,244,236,216,177, 35, 24,134,193,254,253,251,161,209,104,248, 26,141, 6,106,181, 26, 26,141, 6, -249,249,249, 56,118,236, 24,118,239,222,253, 20,192, 31,213, 14,102,164,250,238,173, 59,247,219, 79, 30,231,197,189,238,183, 25, -164,154,130,130,112,128, 76,166, 69,161,218, 0,148,249,120, 32,237, 26,216, 28, 33, 58,181,108,128, 43,231, 47,106, 64,170,238, -233,168,194, 63,177, 10, 37, 38,196, 33,233, 99, 36, 36,249,169,176, 52, 50,128, 60, 58, 18,173,191,155, 80, 43,235, 68,157, 58, -117, 64,211, 52, 60, 61, 61, 75,131,171,107, 43,182,178,178,178,112,245,234, 85,116,236,216, 17, 30, 30, 30, 72, 78, 78, 70,116, -116, 52,190,249,230,155,210,125,130,131,131, 17, 24, 24,136,134, 13,171, 54, 18,102,102,107,175, 39, 37, 6,141,248,246,219,111, -121,207,159, 63, 7,195, 48,112,118, 54,130,145,161, 24, 4, 75, 0, 23, 23, 43, 0, 69,207, 0,221,187,119, 71,126,126, 52,153, -147,195, 92,175,230,116, 79, 2,184,172, 86,171, 63,116,235,214,205,238,227,199,143,152, 55,111, 30,231,204,153, 51, 37,166,100, -248,248,124, 58,153, 66,161,168,220,117,223,164, 69,211, 69, 13, 72, 83, 15,161,168, 94,125, 35,139,150,104,224,220, 3, 0,208, -219,107, 50, 26, 52,170,139,252,204,144,250, 74, 69,220, 16, 30, 39,199, 52,100,123,242, 91,209, 0,215, 73,202,244,135, 81, 40, -114,157, 86,219,236,138,168, 51,105, 9,220,241,103, 47,255,121, 99,250, 55, 94,131,184, 90,138, 36, 93, 29,185, 38,231, 46, 93, - 75, 79,142, 79,216,134,132,155, 97,127,217,255,170,180,226, 81,249,249,249, 16,139,197, 8, 11, 11, 83, 13, 24, 48, 64,192, 98, -177,240,225,195,135, 82,161,101,101, 97,214,172, 75, 59,215,166,107,182, 28,187, 37, 22, 8, 4,125,187,183,117,121, 27, 21,159, -196, 48, 68, 92,165,214, 86,173,246, 78,104, 80,176,167,165, 93, 35,118,244,195,231, 48,239,250, 13, 84, 42, 22, 20,106, 26, 42, - 18, 32,217, 60,216,182,234, 0,147,134, 46, 96, 0,188,122,254, 84,171,210,106,111,233,199, 26, 61,244,248, 87, 91,181,152,170, - 68, 82,241,231,108, 0,113,190,190,190,153,101,172, 77, 25, 0,130, 1,184, 21,239,151, 81,238,184, 12,130, 32, 94, 49, 12,211, -174, 12, 79, 70, 25,193, 85,246,179,186,220, 62,193, 53, 16, 89,101,223, 63, 21, 90,149, 77,169, 4, 0, 11, 11, 11,171,214,173, -219, 54, 60,112,232, 44, 24,134,193,251,192,141,200, 73,127,135,229,235,158, 53,180,183,183,247, 72, 78, 78,246,215,165, 4, 20, - 69,157, 57,124,248,240,130, 14,109, 90,183,174,239,224,128,224,184, 88,240, 24, 10, 60,138, 2, 75,163, 2,135, 82,195,193,149, - 2,139,144, 32, 37, 37, 15,235, 79,158, 13, 43,206, 18, 95, 37,154,126, 51, 8,171,147,242, 64, 16, 4, 54,117,114, 5,223, 80, - 2,158, 88,130, 31,255,188, 95, 42,174,252, 86, 47, 1, 95, 34, 65,195, 14, 58, 37,132,151, 63,120,240,224,117,104,104,104, 59, - 87, 87, 87, 44, 88,176, 0,113,113,113,160,105, 26,105,105,105, 74,169, 84,154,156,145,145, 17, 7,224, 18,128, 3,208, 33,243, - 56, 79,165,220,234,119,225,168,119, 39,119, 15,139,111,135,236,198,229,243,243,145,155,151, 15, 57, 41,130, 76, 73, 66,166, 98, -195,204,188, 5, 58,180,108,137,148,228,116,132, 63,191, 85,200, 81,201, 55,214,164,131, 18, 4,129,192,192, 64, 56,217, 25, 34, -242,177, 63, 44, 12,184,112,179,179,129, 93, 23,247,210,252, 82, 85,129,203, 6, 57,118,236,216,210,204,240,125,250,244,137, 29, - 63,126,188,237,252,249,243,113,232,208, 33, 60,125,250,244,179, 0,109, 15, 15, 15, 60,122,244,104, 21,128, 21,213, 25,245,212, -106, 53,154, 54,109,138, 87,175, 94,225,238,221,187,232,209,163, 7, 60, 60, 60, 16, 18, 18,130,219,183,111, 35, 48, 48, 16, 4, - 65,192,220,220, 28,218, 34,241,172,173,140, 76,163,193,185,223,126, 63,188,116,203,150,221,205,199,141, 27,135, 11, 23, 78, 99, -242,164, 38, 32, 88, 2, 16,132, 0,131, 6, 54,193,234, 95, 95,161, 67,135,238,176,176,224, 98,203,230, 43, 49, 10, 5,117, 76, -135,106, 92,115,251,246,109, 59,165, 82,137,220,220, 92, 70, 34,145, 16, 89, 89, 69, 51, 90, 43,178,104,201,229,114, 97,101, 68, -161,111, 34, 54,230, 22, 48, 57, 76, 97,224,144,108, 50,176, 69,143,190,137,232,237, 53, 9,119,252,254,192,253, 91,119, 97,198, -137,139,133,184,224, 70,102,108,102,190, 84,230,188,215,165,205, 84,118,146,236,214,222, 89,131, 34,217,182,182,244,185, 37,123, -242,115,171, 18, 90, 0,136,236,183,199,255,188,196, 96, 80,231, 78, 29, 26,185,214,181,229,231,100,166, 51,231,175,220, 8,211, -196, 94,184, 90, 70, 96, 49,213, 8,245,213, 62, 62, 62,191, 20,127, 62,242,243,207, 63, 79, 93,191,126,189,101,106,106,106,105, -140, 86,122,102,246,253,206, 3,102, 81, 89,185,121,234,195, 91,126, 26, 46, 18, 10,248, 63,175, 63,252, 80,203,198,243,202,120, - 73,154,222, 53,114,222,242, 57, 81,239, 3,237,235,137,248,184,242,211, 10, 4,223,126, 0, 45,139,135, 31,238,190,128, 74, 67, - 33, 55, 51, 11,247,166,204,132,196,218, 20,187, 31, 94, 72,163,105,122,143,126,168,209, 67,143,127, 47, 42,211, 34, 4, 65, 84, -148, 99, 47,173,130,223, 94, 85,117, 92, 37, 60, 95, 3,149,102,133,215,105, 10, 94,102,102,102,250,163, 71, 47,240,208,111, 13, -252,253,214, 32, 60, 48, 24, 41,201,106, 36,167, 41, 97,100,100,244,172,138, 67,203,103,142,101,228,114,249,208,159,151,255,146, - 42, 20, 25,160, 91,207,158,176,177,180,130, 1,143, 11, 54, 73,131, 77,112, 81,152, 97,130,200, 16, 57, 22, 31, 62,158, 94, 40, -151, 15,173, 96,144,232, 85,153,200, 32, 8, 2, 2, 35, 67,240, 37,134, 16, 24, 26,125,226, 70, 20, 26, 25, 65,104,104, 4, 14, -159, 95, 81, 48,252,103,156,133,133,133,195,134, 15, 31,158,147,151,151,135,169, 83,167,194,223,223, 63,240,214,173, 91, 70, 33, - 33, 33,162,140,140,140, 70, 0,250, 0,216, 87,133,200,250,132, 51, 39, 39,186,128, 33, 85,163,124,127,153,171, 80,146,230, 24, - 49,225, 12,196,172, 68,144, 20, 13, 6,128,157, 25, 31, 93,122,253,138,116,117,103,156,217,187, 86, 78,107,148,227,202,229,208, -250,132,147, 97, 24,198,218,218,250,179, 58,184,123,247, 46, 70, 12, 31,134,190, 67, 6,195,178,190, 19,172,122,125,131,190, 83, -127,192,222,189,123,193, 98,177, 96, 97, 97, 81,126,224, 45,229, 60, 26, 4,238,169, 80, 16,167, 66, 65, 28, 9, 4, 7,192,119, -199,143, 31,255,205,205,205,237,193,211,167, 79, 55, 2, 24, 85,246,191,202, 96,101, 57,107, 86, 69,109,180,108,206,156, 57,138, -168,168, 40,136,197, 98,144, 36,137,167, 79,159, 98,247,238,221,216,180,105, 19, 2, 3, 3, 97,110,110,142,134, 13, 27, 66,165, - 82,225,213,171, 87, 10, 0,203,170,224,164, 51, 50,200, 97,219,183,175,207,242,242,234,138,195,135,119,194,198,166, 51,184, 28, - 27,112,184,150, 16, 75,154,226,224,129,223,208,191,127,107,252,121,229,108,118,102, 22, 57, 12, 0,169, 67, 95, 82,190,120,241, - 2,123,247,238,197,240,225,195,147, 71,140, 24, 65,229,229,229,149, 90,180, 74, 50,253,174, 44,142, 49, 83,169, 84,130,202, 56, -191, 95, 28,150,252,211,218,240,213,105,169,201, 29,253, 31, 60, 27,123,255,214, 93,196, 68,221,199,253, 91,119,241,248,126,128, - 79, 90,106,114,199,214,237, 27,243,134, 78,245, 94,116,244,226, 5,182,196,200, 22, 71, 47, 94, 96,143,153, 53,119,109,219,190, - 61,150, 85,215,231,139,219,145, 41, 76, 79, 91,178,110,227,142, 66, 82,163,100,109,216,182, 43, 69,145, 33, 93, 86,166, 95, 50, -213,245, 79,133, 66,177, 79,169, 84,218, 41,149, 74, 59,149, 74,181, 44, 46, 46,174,219,130, 5, 11, 50, 40,138, 42,181,150,102, -188,253,243,217,187, 39, 71,214, 89, 89,152,138, 58,183,107,222,100,243,190,243, 15, 19, 18,211, 78,148,201,161, 85, 81, 57,149, -133, 10,229,176,193, 67,199,203,114,115, 84,232, 52,215, 7,180, 80, 2, 21, 5,104, 25, 54, 72,130,131,208, 53,155, 33, 50, 51, -196,201,216, 55,242, 60,173,102, 24, 62,205,161, 85,213,185,127, 9,244,156,122, 78, 61,231,127, 39,231,255, 50,108,241,233, 90, -135,182,159, 88,180,170,155, 82,105,111,111,223,237,219, 65,189,208,221,235,103, 48, 12,131,119,111,126, 71, 78,198,123,216,219, - 8, 16,157,144,223, 9,128,127, 13, 10,147, 16,151,152,216,113,206,178,159, 47,142,232,211,211,197,181,126,125, 65,189,122,142, - 16, 91, 89, 33, 51, 51, 3, 79,158,191,213,174, 61,117, 46,172, 88,100,233,228,152,164,105,186, 40,200, 29, 64,207, 57,139, 65, -176,217, 64,113, 26,135,146,129,177,126,187,206, 32, 56, 28, 80, 12, 13,149, 74,165,203,108,185,164,143, 31, 63, 14, 27, 55,110, -220, 61, 63, 63, 63, 86,223,190,125, 91, 93,186,116,233, 75,214,204,131, 44, 61,234, 1, 0,175,181, 75,166,159,233,216, 99,176, -145,115,243,182,188,182,245,216,208,104, 9,164, 36,199,195,239,226, 75,205,219, 23,183,242, 25, 82, 57, 74,158, 25,245,160, 42, - 46,141, 70,147,208,168, 81, 35,235,189,123,247,150, 6,195, 83, 20,133,204,204, 76, 60,123,246, 12, 45,218,117,128,203,164, 41, -200,200,200,192,246,237,219, 81,183,110, 93, 12, 28, 56, 16,217,217,217, 32, 73, 82, 87,135, 47, 5,224, 86,241, 11,229, 68, 22, - 81,188, 4, 80,149,110, 67, 39, 39, 39,190, 82,169,108,197, 48, 12,155, 32,136,173,106,181,122,226,146, 37, 75,108,215,173, 91, -135, 38, 77,154, 32, 51, 51, 19, 98,177, 24,206,206,206,200,200,200,192,203,151, 47, 41,185, 92,190, 23, 69, 11, 89,103, 84, 83, -190, 15, 47, 95,198,118,156, 61,251,199,139,191,173,159,238,172, 84,117,231,155,153,185,131, 97, 72,100,100,196,161, 32,255,169, -230,215,213,127,124, 76, 75,215, 14, 5, 16,165,227, 57,175,240,246,246, 6, 0, 33,128,159,163,163,163,131, 92, 92, 92,156, 43, -179,104,233,130, 45,231,147,149, 0, 78, 13,235,107, 55, 47, 63, 51,196,217,140, 19, 23,219,209,149,222,190,229,124,178,210,200, - 78,182, 38, 51,206, 63, 82, 42,187,181,247,232,197, 11,236, 9, 67,134, 81, 14,146, 40, 31,161, 21,115, 94, 7,106,198,205,205, -173, 14, 65,100, 55, 72,207,122,255,122,242,212,233, 35,141,121,138,235,110, 14, 89, 13, 89,117, 91, 11, 3, 3, 3, 99, 81,195, -153,161,197,136, 76, 78, 78,238,182,100,201,146, 91, 12,195,124, 18,155,144,158,153,125,191,147,151, 55,147,155,155, 23,148, 17, -241,167, 46,185,212, 94,190,124, 19,216,211,181, 69,235, 11,191,173, 91,111,221,125,206, 2, 78,228,131,135, 0,165, 69,188,255, - 67, 80, 2, 53,189, 57,224, 78, 90,158, 70, 51, 4,250,172,240,122,232,241,175,183,102, 85,165, 69,254,203, 49, 0,149, 4,195, -235,124, 50, 78, 13,236,111, 53,113,174,215,167,174,131, 37, 0, 32, 58, 54, 5,209,177,201,183,163, 99,146,251, 86,163,120, 43, -155, 94, 89,186,168, 52, 81,156,194,129,209,109, 81,233, 79, 56,205,205,205, 95,115, 56, 28,135,154,212, 6, 69, 81, 41,153,153, -153,173,117, 44,231,152,250,245,235,175,143,143,143,191, 72,211,244,188, 26,170,253, 10, 57, 75, 22,149,102,113,248,189, 24, 82, -221, 2, 0, 8, 14, 95,151, 69,165,203,114,182,144, 72, 36,251,184, 92,110,221,146,118, 44,137,193,162, 40,138,173,209,104,132, - 20, 69,177, 1, 16, 44, 22,139,228,114,185, 74,130, 32, 72,146, 36, 19, 84, 42,213,116,252,149,112,180,170,115,175,118,160, 47, - 22, 90,168,192,162,117, 23, 0,162,162,162, 26,155,154,154,142, 34, 8, 98, 56,195, 48, 77, 11, 10, 10, 84,203,151, 47, 15, 60, -119,238, 92,126,253,250,245,251, 13, 24, 48,128, 8, 9, 9, 65, 88, 88, 24,147,149,149,117,190,216,138, 21, 93,195,190,196, 18, - 8,216,163,205,204, 88, 3, 24, 6,110, 96, 64, 16, 44,132,230,229,209,215,229,114,234, 68,177, 96,172,105,255, 44,193,216,122, -245,234,253, 17, 27, 27,203,173,204,146, 90,217,185,151,199,239,203,154,255,220,169,107,215, 97,207, 30, 63,190,244,211,218,240, -213,101,183,205, 26,108, 58,121,204,204, 57,191,159,218,181,237,167, 29,151,115, 14,235, 82,206, 86,173, 90, 57, 17, 4, 49, 10, -128, 43,195, 48,141, 24,134, 16, 18, 4,147, 67, 16, 68, 56,128, 16,181, 90,237,247,246,237,219,164, 47, 56,247,218, 60,225, 86, -198, 89,186,168, 52, 40,170, 37, 5, 48, 58, 46, 42,253,159, 46,167,158, 83,207,169,231,252,255,227,252, 95,198,180, 10, 6, 72, -221, 50,195,151, 32, 58, 38,185,111,116, 76, 50, 26, 53,106,196,124,248,240,161, 70, 34,173,178, 65,154,162,168,211,114,185,252, -244,151,144,100,101,101,181,253,155, 43,239, 84,108,108,236,169,175, 73, 88, 44,164, 86, 23,191,106,139,208,194,194,194, 14,186, -238,172,209,104,254,142,186, 33,138,173, 89,171, 42,219,161, 79,159, 62,241, 26,141,230, 46,128, 68,130, 32, 76, 0,100,107, 52, -154, 91, 36, 73,166,125,248,240,161,237,230,205,155, 75, 50,223,255, 10,224,117, 45,203, 65,171, 84,212,201,148, 20,234,228,223, -112,142, 39,213,106,245,124,115,115,243,134, 74,165,146,175, 84, 42,121,101, 39, 31,136, 68,162,140,170, 2,226,203,194,196,144, - 56,194,227,228,152,155, 24, 18,229,133, 20,204,236,113, 65, 33, 11,107, 98,102,143, 11,186, 22, 44, 40, 40, 40,218,205,205,237, - 56,139,197,170,207, 48,140, 53,192, 24, 51, 12, 50, 24,134,201,228,112, 56,201,111,223,190, 77,254, 47,186, 9, 41, 73,154,222, - 72,170,213,127,197, 29,234,103, 23,234,161,135, 30,255, 28, 84, 26,163,197,169, 41,211,135, 15, 31, 8,125,125,234, 81, 86,108, - 85,181, 49, 62, 62, 94, 5, 32,160,248, 85, 30,175, 1, 12,252,111, 63, 65,169, 84,218,186,178,109,186,138, 44,160, 40,102, 11, - 8,155, 91,209,182,149, 59,114, 10,176,227,226,162,154,150, 45, 56, 56, 56, 1, 58,186,216,245,208, 67, 15, 61,244,248,219, 48, -173, 50,241,197,209,215,141, 30,122,232,161,135, 30,122,232,161,199, 23, 97,127, 25,193,245,137,117,139, 64,229, 51, 7,106,226, -123,173,205,236,131,187,122, 78, 61,167,158, 83,207,169,231,212,115,234, 57,255,117,156,255, 84,124, 34,178,116, 73,142,254, 53, -160,159,250,170,231,212,115,234, 57,245,156,122, 78, 61,167,158,243,223, 32,178, 62,121,149,100, 61,208,187, 14,245,208, 67,143, -127, 45,206,157, 59,167,211,162,162,163,127, 58,232, 37,145,152, 46, 47,204,207, 91,127,122,227,228, 75, 37,191,143, 24, 49,130, -210,215,162, 30,122,232,129,218, 4,195, 55,104,224,208,140, 69,209, 93, 24,134,197,102, 88,140,150,200, 87,156,137,206,201,249, - 36,237, 64,157, 58,117, 76,184, 44, 12, 36, 24, 70, 76, 16, 52, 69,179, 89, 79, 99, 98,146,222,214,160, 96,124, 83, 83, 83,111, - 30,143,215, 75,173, 86, 59,176, 88,172, 36,149, 74,117, 87, 46,151,239,196,231,137, 11,255,223,208,184,113,227, 49, 15, 31, 62, - 52,113,119,119, 87,137, 68, 34, 82,161, 80,112,110,222,188,249,127,236, 93,119, 88, 20,215,219, 61, 51,179,189,194,210,171, 40, - 40,138,162, 2,246, 94, 19,141, 93, 99,137,177, 23,212,152, 24, 53,209,104,162,137,221,104, 76,236,177,196,110,140,177,198,222, -141,216, 27, 54, 84,236,210, 59, 11, 44, 44,219,103,230,251, 3,118,179, 34,101, 23, 49,209,223,199,121,158, 97,153,221,217,179, -119,102,238,220,123,238,123,223,251,190,130,143, 62,250, 40,251,217,179,103,229, 90,145,232,229,229,213,126,195,134, 13,254,157, - 58,117, 66,141, 26, 53,212, 3, 6, 12,224, 53,107,214,140, 55,106,212,168, 23, 73, 73, 73,103,237,164,171, 67, 16,196, 54,130, - 32, 40,134, 97,134,224,159,208, 13, 21, 13,146, 36,201, 49, 4, 65,244,102, 89, 54,128, 32,136,231, 44,203,238,103, 24,166,180, -192,173,165,225, 99, 0, 93, 72,146, 12, 3, 0,134, 97,110, 1, 56, 10,216,190,242,238,223,228, 20,139,197,161, 0,144,159,159, -127,187,162, 56, 9,130, 8, 5, 0,150,101,203,203, 57, 92, 36, 18,141, 6, 0,141, 70,243, 27,108, 72, 7, 85, 20,236,218, 32, - 54,108,118, 52, 0,224,214, 15, 65, 0, 0,123,246,137,177,209,132, 61,191, 85, 28,159, 61, 28,197,160,203,160, 65,131, 22,252, -254,251,239, 63, 0, 56,240, 54, 42,190,135,135,239,170,159,151,175,247,154,248,249,200, 31, 81,144, 17,162,244, 7, 18,248,128, - 79, 81, 61,244, 52,125,225, 1,176, 27, 0,199,201,201,105, 32,159,207,111,173,215,235, 61, 57, 28, 78,178, 94,175, 63,159,147, -147,243, 7, 74,201,128, 96,243,117,125, 8,133, 33, 31, 30, 4,243, 79,158, 55,150,132,142, 39, 70, 10, 81, 27, 89,239, 64, 51, - 74, 2,248,178,240, 92, 55,162,228,112, 30,165, 53, 62, 19,189,188,188,122,171, 84,170,124,138,162, 88, 20,172,122, 46,248, 83, -240, 57,193, 48, 76,154, 82,169, 28, 82, 22,151,164, 10,106,241, 37,196, 54,218, 8,141, 73,199,142, 83,199, 35, 90,234,139,230, - 44, 48,132, 5,170,145, 20,233,202, 48, 76, 50,128,179,164, 9,135,242,146,240,244, 29,237,220,253, 10,175,107,213,194,125, 46, - 0,119, 0,119, 1, 76, 4,144, 87,169,127,254, 53, 20,117,134, 63, 2, 32,217, 34,180,172,194,221,183,237,214,173, 91,132,191, -191, 79,157,190,189,250, 44, 24, 59,102, 28, 65, 81, 36,162,238,223,231,124, 58,100,248,135, 10,133,194, 91,170,211,213, 6, 65, - 48,249, 66, 97,148, 74,149,147,184,251,143,223,101, 65,181,106,209, 52,205, 96,237,186, 53, 31,237,249,107,223,183, 54,138,173, -154, 30, 30, 30,219,166, 77,155,230,209,163, 71, 15,202,195,195, 3, 49, 49, 49,142, 59,119,238,172,181,114,229,202,254, 89, 89, - 89, 67, 0, 60, 46,199,201,182,242,112, 34, 63,148,137,136, 14,200,165,145,107,196,153, 20, 13, 78, 2,184, 80,222,171,151,159, -159,255, 69,126,126,126,147, 70,141, 26,177, 27, 55,110, 36,134, 13, 27,198, 18, 4, 65,104, 52,154, 45, 0,202, 37,180, 36, 18, -201,234, 78,157, 58, 5, 6, 6, 6, 62,127,246,236, 89,151, 93,187,118, 29, 29, 58,116,104,128, 68, 34,121, 2,160,166,157,116, -155, 51, 51, 51, 67, 52, 26, 13,124,124,124, 54, 2,104,240, 22, 42, 17, 65, 81,212,126,111,111,111,118,241,226,197, 7, 66, 66, - 66,220,149, 74,165,105,202,148, 41, 29,175, 94,189,250, 17, 77,211, 61,236, 16, 91, 10,130, 32,214,185,187,187,187,252,248,227, -143, 79, 27, 54,108,120, 87, 32, 16,240,159, 60,121, 34,158, 60,121,242,164,199,143, 31,247,103, 89,118, 12, 96, 87, 7,161, 32, - 8, 98,157,151,151,151,203,130, 5, 11, 98,194,194,194,162,120, 60, 30,239,201,147, 39,146,111,190,249,102, 98,116,116,116,185, - 56, 73,146, 92,219,164, 73, 19,197, 15, 63,252,240,176, 86,173, 90,151, 41,138,226, 39, 36, 36,144,179,102,205,250,252,212,169, - 83,253, 24,134, 25, 91,158,114,186,185,185, 41,102,205,154,245,176, 89,179,102, 87,121, 60, 30,239,209,163, 71,228,180,105,211, - 62,127,250,244,169,205,229,116,114,114,106, 71, 16,196,250,148,148, 20, 14, 0,120,122,122, 54,150,203,229, 43,173,115, 90,154, -125, 4,140, 70, 99,174, 86,171, 29,164, 84, 42,139, 13,132, 59,108,250,138,238, 0,176,210, 96,222, 47,120, 45,107, 31, 88,123, -200,150,147, 14,245, 40,136,139,247,179,122, 68, 47, 0, 24, 88,152, 42,252,103, 53,192,225,112,152, 80,143,137,236,237, 20,187, - 66,198,244,108,223,190,253,172,179,103,207,174,105,219,182,237, 55,219,183,111,119,139,143,143, 95,116,225,194, 5,223, 79, 62, -249,100,216,153, 51,103, 22,102,100,100,236,169,168,202,207,231, 9, 4, 4, 73, 64, 36, 20,203,109, 57,158, 75,146,221, 46,247, -236, 57,250,183, 71,143,194, 86, 70, 71,251,171, 61, 61,155, 76,152, 48,193,189, 79,159, 62,164,175,175, 47,158, 62,125,234,188, -125,251,246,218,191,253,246, 91,239,236,236,236, 47, 1,196,190,137,200, 82,103,163,158, 78,143, 48,150,133,163,229,129, 37,144, - 45, 48,224, 22,251, 16,247,222, 1,177,245,253,230,205,155,127,120,250,244, 41, 22, 46, 92, 8, 0,171,236,252,254,228,158, 61, -123,118,221,183,111,159,104,247,238,221,162, 70,141, 26,193,195,195, 3,133,131, 41, 75, 96,106,127,127,127,219,174, 25,131,159, -151, 29, 29,209, 32, 74,121, 12,171,251,164, 44, 20,249,192,212,188,103, 96,239,110,195,194,224,224, 42,134, 80,202, 65,118,166, -170,238,163, 91,241,157,254,222,245,116,209,211,200,244, 31,213,113,248, 30, 37,199,228,251, 79,224,236,236,188,241,197,139, 23, -237, 36, 18,201, 43,239, 63,127,254, 60, 52, 48, 48, 48, 7,192, 87,246, 10, 55, 87, 87,215, 29, 12,195,232, 50, 51, 51, 71, 2, -128, 76, 38,251, 93, 34,145, 40,146,147,147,191,125, 91, 3, 25, 51,138,106,145,247,220,162,101,241,215, 42, 46,215, 33, 65,210, - 76,139,177, 99,198, 17, 3, 6,126,146,242,244,249, 11,134,195,229, 15, 60,126,226,132,184, 78,157, 58,164,110,213, 42,152,210, -211, 97,156, 52,169,249,233,211,167,141,253, 6, 14,214,112, 41, 98,115,128,127, 53,241,159,127,236,244,216,183,119, 79, 11, 0, -101, 9, 45,190,135,135,199,182,115,231,206,121,251,251,251, 35, 59, 59, 27, 49, 49, 49, 80,171,213,232,223,191, 63,183, 69,139, - 22,222,125,251,246,221,150,147,147,211,210, 14,203,150,123, 13, 31,206,225, 49,195,251,212,252,232,195, 22, 18,111,223,234, 96, - 83,180,136,127, 22,221,232,240,185,171, 19, 54,239, 61,250,248,105, 14,219, 13,197,231, 70, 42, 21, 25, 25, 25, 83,123,247,238, -189,183, 93,187,118,174, 2,129, 0, 94, 94, 94, 68,143, 30, 61,210,146,146,146,102,151, 91,181, 20,166,176, 33, 73,146,182,126, - 45, 38, 61,144, 45,240, 81, 40, 20, 80, 40, 20, 0,224,253,166, 35, 79, 71, 71,199, 85, 50,153,172,175, 74,165,210,144, 36,201, - 18, 4,193,234,245,122,145, 66,161,184,243, 48,250,177,151, 78,167,171,177,100,217,111,203,219,183, 10,145,159, 58,117, 10,125, -250,244, 97, 79,158, 60, 57,198,214, 60,117, 4, 65,172,235,221,187,119,254,204,153, 51,181, 79,159,199,120, 63,124,252,156,144, - 8,249,140,139,139, 11,247,250,245,235,156,165, 75,151, 10,103,205,154,181,142,101,217,190,118, 92,207,117,159,124,242,137,225, -235,175,191, 78,126,244,244,133,219,189,135, 79, 89,169,144,107,114,113,113,166,174, 94,189,202,148,135,147, 36,201,181, 83,167, - 78, 85,141, 25, 51, 38, 43, 83,153,227,145,165,202, 99, 5, 92,202,232,225,225,193, 57,112,224,128,110,199,142, 29,228,232,209, -163,215, 50, 12,211,207,142,235,187,182, 71,143, 30,185,211,166, 77,203,126,242,252,165,199,189, 7,143, 33, 22,112,141,238,238, -110,212,141, 27, 55, 12, 75,150, 44, 33,231,205,155,103, 83, 57, 37, 18,201,214, 93,187,118,113, 14, 28, 40,104,251,174, 92,185, - 66, 6, 4, 4,136,173,143,209,104,117, 32, 9, 32, 35, 35, 67,220,172, 89,179,173, 0, 94, 11,238, 27, 54, 59, 26,195,166, 3, - 95,124,241, 69,178,189,149, 37,204,115, 66,153,199,208,107,130,216,165,249, 35,122,113, 56, 28,102,244,232,209, 41, 69, 63,215, -106,181, 4,128, 30, 88,100,187,216,234,210,165,203,119, 71,142, 28,169,190,125,251,246, 95,118,236,216,161, 7, 0,161, 80,232, -178,115,231,206,133,253,251,247, 71,255,254,253,103,238,217,179,167,194,132, 22,205,210, 6, 0, 16, 8, 5,130,232,232,104, 34, - 40, 40,168, 84, 47, 87, 3,195,220,252,237,209,163,134,159, 5, 5, 53, 82, 50, 76, 13,222, 71, 31,229, 77,158, 60, 57, 67,165, - 82, 33, 38, 38, 6, 6,131, 1,195,134, 13,163,218,182,109,235,213,191,127,255, 21,185,185,185, 31, 3, 48,216, 80, 39,151,120, -123,123,135,231,228,228,228,153,173, 58, 45,135,208,156,214,161, 38, 65,253, 26, 70, 62,143, 50,241,186, 79, 98,136,147,171, 8, -117,144, 63, 46, 2, 0, 47, 31,233,118, 14, 6,138,133,220, 7,254, 52, 23,243, 92,125, 68,237,211, 99, 53,115,212,113,165,138, -165,143, 37, 18, 73, 47,181, 90,189,167,176,115,174,217,173, 91, 55, 92,189,122, 21, 0, 90, 20, 10,173,246, 36, 73,126,202, 48, -204, 6, 0,165,165,114,155,208,179,103,207, 15,246,237,219, 39, 3,128, 61,123,246,192,104, 52, 34, 32, 32, 0, 60, 30, 15,124, - 62, 31, 92, 46,215,146, 29,196, 70,120,186,186,186,192,197,129, 11,133,147,228,163,111,126,237,201,169, 82, 71,142, 52,250, 62, -148,108, 54, 76,172, 14, 60,103, 9,106,117,114, 68,216,135,237,201, 67,107,163,190, 61,180,250, 97,195,124, 18,221, 17, 11,221, -187,210,179,147, 36, 41,184,123,247, 46,188,188,188, 94,121,159,162, 40, 0,104, 93, 14,202,153,207,159, 63,111, 22, 25, 25,137, -118,237,218,205,172, 87,175, 94,231,136,136, 8,143,204,204, 76,180,107,215,110, 69, 66, 66,194,129,183,125, 78,214, 90,228,127, -197,212, 69, 22, 81,146,109, 11, 70,193, 36, 69, 81, 36, 94, 60,143, 49,182,107,215, 97,104, 92, 92,156,180, 73,147, 38, 36,151, -203,133,250,236, 89,104,111,220,128, 84, 42, 69,239,222,189,185,231,207,159,151,203,165,242, 81, 47, 95,188,204,165, 40, 18, 44, - 75,150,233,243,160, 80, 40, 62,255,246,219,111, 61, 2, 3, 3, 97, 50,153, 44, 17,205, 77, 38, 19,226,227,227, 33,149, 74, 49, -100,200, 16, 55,177, 88,252,185,141,231, 81,181,102,128,219,173,115, 71,215, 53,152, 60,182,139,164,166,248, 20, 36,241, 95, 66, -186,231, 51,212, 78, 58,142,105,189,154, 72, 78,174,158, 25, 86,221,203,233,150,149,137,213,102,232,116,186,139, 81, 81, 81,163, - 34, 34, 34, 24, 0,248,251,239,191,217,135, 15, 31,142,121,147, 81, 40,195, 48,200,206,206, 6,195, 48, 84,225,190,249,245, 63, -173, 15,114,185,124,109,231,206,157, 63,137,141,141, 21, 29, 59,118,204, 57, 46, 46,206,229,229,203,151,174, 53,107,214,228, 44, - 92,184,240,136, 86,103,160,140, 52,171, 55,209,198,220,228,251,247,159,103,165,166,222,218,180,105,147,134, 32,136,222, 54,254, -198,199,158,158,158,206,211,167, 79, 7,193, 21, 55,174, 85,187, 94, 32,197, 21, 57,144, 92,190,131, 70,163,165, 95,188,120, 17, - 63,125,250,244,106, 33, 33, 33, 94, 40,152, 94,179,137,211,203,203,203,229,235,175,191, 6, 71, 32, 11,173, 31, 18, 86,157, 47, -144,200, 40,174, 72,214,164, 73,147,182,207,159, 63, 79,154, 54,109,154,103,163, 70,141,236,226,108,212,168,145, 98,244,232,209, - 38,161, 72,214,204,223, 63,160,118,253,224,218, 93,107,214,172,217,139,195,225,152,210,211,211, 99,135, 12, 25,226,217,189,123, -119,119,123, 56,221,220,220, 20,211,166, 77, 51,249,250, 5,116,234,244,193,135, 77,121, 34,153, 3,135, 47,113,204,207,215,210, -143, 30, 61,138,157, 49, 99,134,103,104,104,168,155, 45,156,249,249,249, 92, 23, 23, 23,212,173, 91, 23,117, 2, 2,144,147,147, -131,125,251,246, 97,243,230,205,216,176, 97, 3,254,248,227, 15, 52,108,249, 33,100, 50, 25,146,146,146,160, 82,169,184,255,118, -133,162,215, 4,177, 43,245,225, 61,198,141, 27,151, 52,122,244,232, 20,145, 72,196, 20,221,156,156,156,232, 65,131, 6,165, 14, -249,102, 89, 15,243,212, 98, 25,150,172,187, 71,143, 30,125,182,125,251,118,212,169, 83, 7,157, 58,117,226, 3,192,231,159,127, -206,239,223,191, 63,118,237,218,133, 61,123,246, 60, 8, 12, 12,188, 4,160,167, 45,229, 28, 50,100, 72,203,126,253,250, 93,232, -215,175,223,237, 1, 3, 6,172, 31, 51,102,204, 43, 61, 87,114, 82,194, 77,189, 94,143,144,176, 70,226,185, 27,175, 13, 42,139, -239, 33,176,125,125,116,244,230, 31,239,223,143,157, 89,167,142,163,223,203,151, 78, 91,150, 44,113, 49, 39,233, 54, 26,141,136, -143,143,135, 66,161,192,160, 65,131, 92, 4, 2,193, 16, 27,138,185,180,103,207,158,195,227,226,226,164,191,253,246,155,231,237, -219,183,189,146,147,147, 61,207,156, 62,225, 58,229,171,207,101, 14, 82, 62, 63, 41,157, 37, 0,224,101, 18, 36,209, 47,208,146, -101,225,104, 61,157, 88, 46,120, 66, 36,242,193,202,234, 45, 29, 31,127,189, 43,116,192,180,195, 97, 46, 10, 79,193,244, 82,190, - 81,127,241,226,197,187, 15, 29, 58, 52,176,101,203,150,123, 1,136,138, 57, 70,216,176, 97,195,125,187,118,237, 26,222,170, 85, -171,139, 0,234,150, 56,138,244,241,233,253,215, 95,127, 57,155,247, 93, 92, 92, 32, 20, 10, 95, 19, 89, 60, 30, 15, 36, 73,218, -125,122,243,119, 14,228, 56,213,214, 33, 42,235, 40,118, 45,190,139,197, 31, 61, 98, 22, 52,127,169, 91, 53, 36, 26, 39,119,221, - 69, 26,238,162,203,103,213, 49,112, 70, 72, 71, 49,141,121,239, 82, 7,158,158,158,254,105,235,214,173,119,119,233,210, 69, 23, - 25, 25,137,244,244,116,120,123, 91,198,218, 41,229,160,116, 18,139,197,240,245,245, 69, 96, 96,224,192,243,231,207,123, 24,141, - 70,188,124,249, 18,105,105,105,183,254,141,115,178,214, 34,239, 25,138, 58,195, 31,121, 77,104, 21,230, 22, 58, 7, 0, 44, 65, -168,239, 70, 69,113, 41, 62,127,240,239, 59,118, 8,120, 60, 30, 98, 99, 99,241,224,193, 3,228,159, 57, 3,205,229,203, 72, 77, - 77, 69, 94, 94, 30,220,221,221,177,110,227, 70,137,158,102, 71, 60,122,252,152, 98, 73,214,218,223,160,216, 37,158, 2,129,160, - 99,159, 62,125, 74, 20,100, 73, 73, 73,232,210,165, 11,151,162,168,226, 86, 53, 20,229, 36,188, 92,137, 67,103,246,206,245,244, -228, 63, 0,158, 78, 6,114,111, 1,172, 14, 48,233,129,196,123,192,145,217,240,203,139, 38, 78,204, 29,234,225, 45,230, 28, 42, - 70, 41,151,181, 20, 53, 32, 40, 40,104,195,224,193,131, 73, 0,104,223,190, 61, 17, 20, 20,180, 30, 64, 64, 41,223, 57, 93, 70, - 39,121, 53, 43, 43, 11,253,251,247,119,174, 94,189,250,233,254,253,251, 59,155,223, 47, 47,167,217,154, 92,167, 78,157, 76,161, - 80,248, 7, 96, 83, 3,107,225,116,116,116, 92,213,165, 75,151,190, 59,118,236,224, 1,192,185,115,231,112,232,208, 33,220,191, -127, 31, 79,158, 60, 97,194,194,194, 92,151,109,216,189,118,213,154,173, 75,123,181, 8,241,106,219, 56,172,182, 52, 47, 43,207, -221,221,189, 5,203,178, 1, 54,150,179,203,236,217,179, 31, 60,124, 22,235, 64,114,184, 28, 30,151, 35,144,203, 37,238, 10,153, -196,199, 73, 44,244, 22,144,132, 52, 63, 63, 63,229,143, 63,254, 96, 0,116,177,149,115,238,220,185, 47, 30, 62,141,117, 36, 72, - 14,135,203,225,242,164, 82,177,227, 71,157,218, 53, 2, 0, 30, 88,158, 74,165, 74,221,188,121,179,193, 30,206, 31,126,248, 33, - 74,153,157,167,224,112,185, 92, 14,135,178, 92, 75,137, 72,228, 42, 22, 8,248, 58,157, 46,113,249,242,229, 26,123, 56,103,207, -158,253,224,209,179, 56, 39,146, 32, 40,130, 32, 57,114,153,196,217,217, 65,236,234, 42, 21,185,136, 57, 20, 95,165, 82, 37,110, -219,182,205, 38, 78,131,193,192, 75, 77, 77,197,195,135, 15,225,219,168, 17, 78,157, 58,133, 42, 85,170,160,127,255,254,248,228, -147, 79, 32, 18,137,208,190, 89, 61, 76,159, 62, 29,207,158, 61,131,193, 96, 16, 20,199,105,246,147, 42, 10, 47, 47,175,200,178, - 42, 79,145,239,190, 82,206, 80, 15,176, 43,245,225, 61,172, 5, 86, 73,252, 78, 78, 78,116,113,214,174,162,156, 93,186,116,249, -238,204,153, 51,213,183,109,219,214, 99,200,144, 33, 23,183,109,219,134,166, 77,155,226,225,195,135,168, 86,173, 26,182,108,217, -130, 79, 62,249,228,226,138, 21, 43,122, 68, 70, 70,134,248,251,251,127, 91, 22,231,128, 1, 3,198,135,134,134,158, 77, 73, 73, -105,166, 84, 42,235,238,219,183,111, 68,239,222,189, 95, 12, 28, 56,176,131, 69, 48, 26,141, 59,142, 28,220,139,174, 61,250,160, - 86,112,221,181,195,190,221, 94,175,140,103,147,189, 15,172,223,156,156,156,190, 67,171,205,239,207,229,138,197,215,174, 57,237, - 89,179,198,197,122,201,119, 98, 98, 34,186,119,239,206,229,241,120,173,202, 40,231,226, 94,189,122,245,223,183,111,159,194,108, -213,185,124,249, 50,238,221,187,135,152,152, 24,100,103,103,163,195,152, 60,140, 91, 88,192, 61,110, 33,139, 15, 63,103, 37,229, -108, 67, 44, 16, 85,129,135,179,156,115,105,196,242, 90,159,135,175,173,195,145, 58,113,241,251, 55, 79,144,241, 82,183,167, 4, - 78,162, 89,179,102,219,251,245,235, 71,232,245,122,232,245,122, 61,128, 98,163,250,122,123,123, 11,235,215,175,143, 49, 99,198, -144,114,185,124, 69, 73,229, 84,171,213,186,163, 71,143, 98,200,144, 33,248,242,203, 47, 81,163, 70, 13, 40, 20, 10,112,185, 92, -108,221,254,167,203, 39, 35,198,214,108,208,178,117, 72,157, 6, 77,235,231,234,168, 70, 92,145, 98,116, 9,214,144, 98,207, 61, -207, 45, 18, 81, 47,175, 96,101,143, 4,230,250,150,252,188, 41,159,254, 20,253, 40, 34,245,254,183,253,214, 71,177, 87,154,103, -108,159, 24,135, 84,227, 67,180,234,239, 7,255, 80,197, 36,137, 47,130,202,123, 61,109,132, 93,156,245,234,213,107,121,253,250, -117, 65,235,214,173, 17, 27, 27, 11, 46,215, 50,158,162,223,164,156,179,103,207, 22,104,181, 90,220,185,115, 7, 67,135, 14, 77, - 52, 24, 12,147,222,164,156,246, 88,180,204, 90,228, 61,195,250, 34, 91,114, 73, 22,173,217, 0, 96,100,112,104,240,208, 17,249, -135, 15, 31, 22,243,249,124,196,198,198, 34, 57, 57, 25, 91, 55,111,166,219,187,185,229,118,242,246, 86,109,221,188,153,213,235, -245, 96, 89, 22, 65, 65, 65,232,219,183,175,232,227,254, 3,211, 8,149,230, 79, 27,166,121, 60,205,243,235, 35, 70,140,120,237, -243, 41, 83,166, 64, 46,151,131, 32, 8, 15, 27, 78,174,223,132,217,189,124, 20,254,142,169,108,202, 86, 37, 40, 33,192,145, 1, - 28, 57, 32,116, 0, 4, 50,128, 47,134, 46,242,172,146,100, 59,197,244,105, 53,210, 27,128, 61, 83, 61,240,242,242,154,121,246, -236, 89,215,200,200, 72, 86,165, 82, 33, 57, 57,153, 93,176, 96,129,171,151,151,215,204,242,222,145,164,164,164,185, 93,187,118, - 77, 29, 58,116,168,195,241,227,199,125,135, 14, 29,234,208,181,107,215,212,164,164,164,185,111,114,167,121, 60, 30,117,255,254, -125,167,121,243,230,125, 2,224,102,112,112,112,166,183,183,247, 77, 20, 56, 77,150, 10,153, 76,102, 17, 89,102,235, 26,135,195, - 1,151,203,133,151,151,151, 94,169, 84,210,173, 26, 4,136,130, 28, 72,163,151,128, 39,114, 18, 9,125,100,114,135, 38,153,153, -153,119, 9,130,120,110,227, 20, 95,104,227,198,141,185, 52,203,101,198, 13,110,239,245,249,240,118,110,191,206, 27, 93,101,249, -220,112,239,197,179, 70, 5,205,157, 58,168, 29,201, 48,218,106,213,170,121,152, 29,218,109, 48,159,135, 53,108,216,144,195,128, -139,135,143, 99, 82, 99, 19, 18,115, 63,104,219,204, 98,185,172, 19, 26,214,201,213,213,181,117, 80, 80, 80, 67,130, 32,108, 90, -146, 44, 18,137, 66,107,213,170,197, 33, 41, 46,225,172,144,249,202,164, 34,119,203, 20,138,163, 99,115, 39, 87,215,126, 36,203, -230,120,122,122,186,137, 68,162, 80, 59,206,157,195,128, 7,119, 55, 39, 7, 87, 23, 71,105,167,118, 45,106, 52,107,222,172,102, -189, 38, 77,155, 5, 55,104,248, 49, 97, 50,169, 2, 2, 2,220,204, 78,242,101, 88, 90,133, 59,118,236,192,188,121,243, 80,223, -207, 15,222,222,222,112,115,115,195,229,203,151,113,253,250,117, 40, 20, 10,164,165,165, 97,201,146, 37,216,191,127, 63, 12, 6, -131,204,222,250,100,139,216, 42, 13, 38,147,137, 44, 42,176, 74,226, 23,137, 68,140,217, 73,190, 36, 28, 61,122,116,187,217,146, - 53,113,226,196,150,203,150, 45,187, 24, 29, 29, 13,169, 84,138,235,215,175, 99,196,136, 17, 23, 87,172, 88,209,114,236,216,177, -216,188,121, 51, 94,188,120,177,177, 52,190, 1, 3, 6,204, 26, 53,106,212,242,136,136, 8,210,221,221, 29, 10,133, 2,189,122, -245,194,198,141, 27, 57, 38,147,105, 83,191,126,253,110,247,235,215,239, 54, 29,127,242,187,221, 27, 22, 92,142,186,123, 27,227, - 39,124,205,215,155,140,211,108, 56,125, 86, 35,149,230,154, 90,183, 86,238, 50, 26,243, 7,240,120, 98,135,219,183,157, 14,109, -218,100, 17, 91,211,167, 79,135,131,131, 3, 80,224,192,140, 82,172, 58,225,251,247,239,183,180,135,206,206,206,224,243,249,224, -241,120,224,114,185,160, 40, 10,167,215, 74,176,102,122,129,190, 88, 51,157,192,201, 85,132,250, 77,238,157,216, 27,117, 21,238, -252,219,159,109, 9, 14,169,219,193, 25,151,119,166, 96, 65,215,200,132,235,187,210, 39,107,211,240,115, 9, 95,107, 48,101,202, -148, 58,105,105,105,184,113,227, 6,110,220,184, 81,146, 5, 72,123,240,224,193, 69,121,121,121,240,247,247, 71,207,158, 61, 91, - 3,104, 84,194,115,131,134, 13, 27,162,123,247,238,104,215,174, 29,234,215,175, 15,189,193,196,237, 55, 56,188,214,253, 23,233, -222, 11,150, 44, 16,159,253,123, 31,121,241, 98, 4,181,125,239, 73,135,102,237, 62, 92,206,147,121, 94,133,200,217,211,150,243, -204,167, 51, 17,234,249, 17,214,159,153, 64,174, 60, 55, 84,186,245,208,202, 0,153, 76, 70,220,186,113,219,184,117,245,174,184, -186,146,158,105, 87,119,102, 34,159, 72, 65,135,225,254, 36, 3,244,125, 87,122,118,161, 80,184, 44, 34, 34,194,195, 96, 48, 32, - 42, 42, 10, 95,126,249,165,246, 13, 41, 45, 6, 16, 95, 95, 95,156, 59,119, 14,131, 6, 13,210,166,166,166, 94,249,183,206,201, - 90,139,252,175,128, 99,165, 32, 45,136,143,143,207, 86, 40, 20,222,181,106,213, 34,245,122,125,193,148,196,158, 61,244,134, 77, -155,142,104,181,218, 9, 0,120,171,126,253,117,173,183,143, 79,187,193, 67,134, 16, 70,163, 17, 93,187,118,229, 31, 62,124,216, -249,121, 90, 90,174, 13, 29,206, 43,191, 55,108,216, 48, 44, 91,182, 12, 0,240,197, 23, 95, 88, 76,235,132, 13, 14, 75, 82, 7, -116,233,212,173,161, 60, 94,178, 82,110,104,110,204,171,250, 76,118, 85,146, 39,106, 8,146,207,129,144, 2, 99, 48,154,158,164, -245,190,249,236, 73,237, 58, 34,101,102,181,142,193,109,176,225,212,182, 46,249,180,118,151,205, 13,142, 88,220, 88, 42,149,226, -230,205,155,202,134, 13, 27,102,179, 44,235, 48,119,238, 92, 23,177, 88,220,248, 13,174,253,203,199,143, 31,183,110,209,162,197, -231, 36, 73,118,100, 24,230,116,106,106,234, 42, 0, 47,109,252,254, 56, 0, 63, 0,176,140, 44,245,122, 61, 72,146, 4,203,178, - 24, 48, 96, 0,166, 79,159, 94,231,222,189,123, 56,123,246,172, 83,199,142, 29,175, 2,200, 6, 48, 18, 64,177, 86, 51,149, 74, -165,185,126,253,186,232,236,217,179, 96, 24, 6, 78, 78, 78,144,203,229, 16, 8, 4,232,213,171,151,116,218,180,105, 29, 78,156, - 56,145,166,170, 90,133, 18, 38, 39,170, 5, 82,169, 12, 30,222,173,198, 14,252, 52,154,101,217,253,118, 52, 14,124, 17,199,164, - 37,104, 29,185,248,251, 21,164,152,199, 35,132, 60, 14, 4, 76, 62,190, 91, 52,159,224,177, 52, 7,118,206,207,243,120, 60,158, - 76, 0, 61,197,167,140, 98, 2, 21, 18, 37,142,162, 40,190,144, 87,178, 63, 6,151, 36, 73,146, 36,121, 0,108, 78,218, 39, 16, - 8,120, 50, 1, 91, 34,167,136, 34, 40,130, 32,248, 40, 97, 37, 90,168, 7, 88,179, 21,137, 63,225,185,206, 90, 20,183,106,213, - 10, 71,206,222,196,158, 67,167,145, 17,123, 23, 51,190,153,136, 70,141, 26,225,240,225,195,165,150,201,236,163, 85,146,117,217, -203,203, 43, 50, 41, 41,169, 65, 73,223, 45,109,202,176, 4, 43,213,235,252,223, 59, 32,108,118, 52,202,240,209,234,217,170, 85, -171,241, 59,118,236,208,119,238,220,153, 63, 96,192, 0,212,173, 91,183,229,240,225,195, 1, 0, 29, 59,118,196,178,101,203, 90, - 14, 31, 62, 28,127,254,249, 39,246,237,219,167,107,219,182,237, 55,231,206,157, 75, 68,193,138,206,215,192, 48, 76,247,117,235, -214, 21,181, 20,194,100, 50,193,104, 52,122,154, 76, 38,207,194,182, 8,203,151,175,200, 56,121,226, 48,190,249,118, 54,220, 92, - 61, 66,109,172, 67,196,176,175,191,206,216,178,100, 9,150,252,249, 39,190,174, 86, 77,188,237,193, 3,156,212,106,177,235,236, -217,140,194,223, 41,211, 55, 83,173, 86,107,142, 30, 61, 42,223,181,107, 23, 28, 29, 29, 81,163, 70, 13, 56, 57, 57,129,203,229, -130,164, 68,160,120, 10,212, 10,110, 12,224, 58, 0,160,154, 23,212, 65,254,184, 72, 16,200,102, 73,251,125,138, 4, 85, 80,213, -197, 71, 24, 49,126,115, 93, 71,185, 27, 15,199, 87,197,225,196,202,248,253,218, 12,252, 2, 19, 30,161,100,159,175,134,254,254, -254, 72, 75, 75,195,209,163, 71,213, 64,137,130, 12, 12,195, 44,250,245,215, 95,167,124,251,237,183,130,160,160, 32, 0, 8, 5, -112,163,184, 99, 37, 18, 9,188,189,189, 45,194,114,192,208,177, 1, 99, 38,143, 21,245,254,176, 29, 56, 28, 23,100,171,141,200, -204, 53, 66,225, 34,197, 55,147,251, 9, 79, 55,244,110,180,110,197,239, 7, 53, 26, 52, 2, 94,111, 15, 8, 2, 55,174,221,189, - 88, 79, 24, 4, 16, 36, 16, 79,254, 13, 2, 4,242, 8, 35, 8,138, 98,105,154, 70, 92, 92, 28, 88,150,197,160,222, 35,226,195, - 23,236,115,107, 57, 72, 5,223, 90, 94, 32, 88,180,121, 87,132,128,179,179,115,104,102,102, 38, 94,190,124,137,161, 67,135, 38, -102,100,100,156, 82,171,213, 35,146,146,146, 0, 64, 89, 14, 74,139,152, 15, 13, 13, 69,227,198,141,209,191,127,127, 97,126,126, -126,191,128,128, 0,239,244,244,244,230,111,243,124,138,106,145,255, 41,161, 85,236,131,102, 52,214,210,173, 93, 11,245,233,211, -224,159, 60,137, 93, 94, 94,121, 90,173,246, 43, 0,241,133, 15,254,196,205, 91,182, 92,234,113,229,138, 92, 31, 29,141,128,123, -247,192,117,116, 12,181,183, 0,155, 54,109,130, 74,165, 66, 78, 78, 14, 0, 96,229,202,149, 80,169, 84, 48,217,152,112,150,195, - 67, 75, 15,183,106, 72,193, 19, 48, 28, 82, 26, 83, 43,191,169, 84, 43, 75,242,142,115, 87,231,144,222,136,142,109, 34,209,100, -234,155, 18,148, 30,218,140,124,120,183,168, 1, 14, 56, 45,237, 41,163,121,222,159,195,225, 40, 31, 63,126,220,189,102,205,154, -135, 0,184,148,199, 31,160, 8,158,166,166,166, 78, 40,207, 23, 41,138,250,225,197,139, 23,110, 27, 55,110,252,124,238,220,185, -172,181,208, 50,255,207,225,112,192,178, 44, 28, 28, 28,192,229,114,221, 47, 95,190,236,222,164, 73,147,213, 12,195,132,150,112, -158,108,221,186,117,241,226,197, 11,112, 56, 28, 56, 56, 56,128, 49, 25, 48,123,242, 88,208,148,128, 51,117,234,212,208, 62,125, -250, 68,109,220,184,209, 40,111,214,162,121,102,102,230,253,241,131, 6, 71, 29, 56,112, 64, 95, 24,226,161,236, 33, 62,203,222, -126,242,228, 9,229,227,229, 78,177,166,124, 70,194, 3,132,119,151,179,124,169, 7,132, 28,138,229, 17, 36, 4, 66,145,195,203, -132,132, 76,134, 97, 30,218,194,201, 48,204,173, 23, 47, 94,136,220,221,156, 57,249, 26,125,158,136,203,242, 99,110,221,124, 94, - 53,172, 97, 0, 0,104,111, 93, 63, 39,168, 85, 91, 20,147,154, 46,169, 86,173,154, 77,156, 26,141,230,118, 98, 98, 34,229,238, -238,206,137,141, 79, 56,232, 40,149,184,202, 29, 29,155, 2,128, 33, 55,231, 58,169,211,165, 83, 92,142,123,122,102,166, 82,163, -209,188,176,245,220,159, 61,123,198,241,244,116,163,142,159, 60,115,200, 93, 44,112,147,241, 57,114, 1, 65, 16, 98,138, 80,241, - 76, 76,134, 80, 44,118,123,153,144,160,100, 89,182, 68, 11,225,143,217,131,123, 23,220,175,217,127, 90,113,227,238,221,187, 56, -118,241, 33, 36,172, 30,132, 54, 7, 39, 55,255,134, 65, 83,191,125, 99,191,191,178,196, 86,185,172, 89,235,106, 71, 22,225, 71, -114, 25,142,240,131, 6, 13,154,189,125,251,118,139, 3,202,195,135, 15,209,190,125,123,243, 52, 7, 58,117,234,132, 38, 77,154, -224,225,195,135, 8, 12, 12,196,217,179,103, 5, 20, 69, 9, 6, 15, 30,188,224,247,223,127, 63, 90,166,221,127,253,122,140, 24, - 49,162, 56,199,234,103, 0,180,132, 34, 40,111,250,143, 91, 93,148,153, 25, 72, 75, 79,185,109,235,117, 32, 8, 2,195,190,254, - 58, 99,157, 94,143, 29,215,174, 97,136, 68, 34,222,242,244, 41,186, 54,105,130,122,237,219,103,216,210,214,153,173, 58, 90,173, - 22, 92, 46, 23,114,185, 28,206,206,206,224,241,120,160,184, 94,224,240, 67, 64,242,120, 8,107, 21,130, 37, 95, 73,242,135,126, -132, 21, 4,129,108, 1, 31,183,120,226, 18,125,117, 8, 73, 21,244, 98, 89,168,242,227,241,183, 89,144, 56,248,193,129, 43,227, -158, 28,181, 58,200, 81,238,198,195,177, 21,177, 56,185, 58, 97,175, 54, 5, 51, 10,175, 5, 83,202, 64,162,158,163,163, 35,226, -227,227, 17, 23, 23,247, 0,165, 59,248,231, 63,124,248,240,185, 64, 32,168,227,234,234, 10, 0,254, 37, 13,204, 25,134,177,248, - 97,109,219,177,219, 37,180,117,128,240,131,150,117,176,245,208,124,124,214,111, 5,184, 20, 1,154, 54,224,151,101,221, 64,235, -242,208,175, 71, 56,209,166, 99, 96,200,233, 67,250, 81, 70, 77,214,111,175, 13, 4, 56,152,247,211, 39,151, 29, 5, 82,178, 30, - 24,194,209,197,197, 77,194,227,241,224, 44,247,212,127, 59,102, 82, 50,203,178,150,231,134, 75,241,140,100,174,147, 38, 51, 37, - 79,228,200,213, 0, 44, 89,181,124,209,108, 42, 30, 9, 9, 9, 19, 90,183,110,189, 32, 55, 55, 55, 75,173, 86, 15, 2, 0,127, -127,127, 63,146, 36, 5, 0, 74,155, 29,241, 67,241, 97, 33,120,247,238,221,131, 76, 38, 67, 98, 98,162,181,241, 5, 12,195,188, - 51,139, 0,222, 81,132, 1,184, 5,192, 19, 64, 87, 88,133,119, 32, 11, 77,117,109, 14, 31, 62,204, 30, 62,124,184,141,165,243, - 98, 89,198,164, 84,130,213, 21, 92, 91, 46,151,203, 2,176, 94,209, 36,118,116,116, 36,184, 62, 62, 32, 4, 5,174, 31,108, 5, - 46,125, 53, 26,109, 11, 45,195,208,160, 64, 24,192, 90, 13, 90,212, 66, 2,243, 93, 58, 96, 2,127, 38, 82,248,142,214, 61, 29, - 96, 98, 65,131,161,236, 44, 14,171, 86,171, 97, 50,153, 20,213,171, 87, 63, 98, 50,153, 20,133,157, 27,251, 95,221, 81,154,166, -159, 83, 20,133,207, 63,255, 28,102,235,143, 94,175, 71, 74, 74, 10,116, 58, 29,244,122, 61, 94,188,120,129,156,156, 28,232,245, -122,220,191,127, 31,254,254,254,160, 40,202,179,148,198,156,101, 89, 22,190,190,190,168, 90,181, 42, 40,130,197,134,197,179,240, -221,151, 99,241,137, 63,131, 77,171,126, 65,219,182,109,107, 87,171, 86,173, 25,135,195,161, 61, 60, 60,120,251,246,237, 59, 72, -211,116, 47,216,222,242, 28,157, 62,125,122,213,224,224, 96, 55, 71,185,204, 40,224, 83,224, 27,213,172, 64,151,201,114,242, 51, -224,235,235,103,130, 72, 28, 56,100,200, 16,186, 36, 43, 68,113,156, 95,125,245,149,103, 80, 80,144,131,194, 81,166,230,115,169, - 52, 30,216,140,156,187, 55,174, 2, 0,223,213, 77, 11,161,184,206,208,161, 67, 77,246,112,206,156, 57,211,223,213,213,213,145, - 4,155, 75, 27, 12,255,204,183,235,244,153, 4,151,171, 1,143,223,240,139, 47,190, 32,236,225,156, 50,101, 74,181, 58,117,234, - 56, 58,202, 37,121, 28, 46,149,204, 99,152,100, 33,152, 20,174,222,144, 37,116,117,201,135, 88, 26, 54,100,200,144, 18, 57,205, -214,172,105,211,166,197, 23, 17,222, 80, 42,149,208,166, 68,129,151, 24,141, 16, 41, 23,141, 92, 21, 16, 8, 4,150,165,239, 37, - 85,215,146,124,180,138, 19, 91,182,126,183,225,156, 82,166, 0,215,213,142, 44, 26, 55, 43, 41, 41, 9,158,158,158,165, 62, 79, -191,255,254,251,183,237,218,181, 75,235,212,169,147,254,200,145, 35, 32, 8, 2,103,207,158, 69, 98, 98, 34, 58,117,234, 4,150, -101,205,171,218,112,251,246,109,116,236,216, 81,223,186,117,235,196,194,248, 90,101, 98,196,136, 17, 48, 26,141,200,203,203,131, - 82,169,196,225,195,135, 17, 18, 18,194,138,197,226, 62,148,239,135,243,251,141,250,182,121,221,250,161, 88,189, 98,137,158,207, -225,254,104,207,243, 74, 16, 4,134,126,245, 85, 70, 78, 88,152,114,155, 90,157, 63, 76, 46, 23, 87,143,143,119,186,121,226,132, -139,193, 96,176,137,195,108,213,241,241,241,177,136, 44, 30,143, 7, 14,223, 21,148,164, 30,248,206,157, 32,246,232,131,191,111, - 9,116, 14, 18,236,151, 73,113, 92,226, 88,114,104, 7,177, 47,230, 55, 31,224,185,175,197, 39,158,103,196, 85,176,177,176, 63, - 32, 89, 14,177,111,248, 47, 53,171,187, 86, 21,225,202,238, 20,156, 92,157,240,151, 54, 5,179, 0, 60, 45,235, 57, 55, 24, 12, - 90,154,166, 65,146, 36, 56, 28,142,181, 79,224,165,191,254,250, 11, 55,111,222, 4,172,194,246,228,230,230,210, 20, 69, 65, 40, - 20, 2,128,180,148,246, 14, 92, 46, 23, 92, 46, 23,231,174,158,119,254,228,227,110,196,229, 59,167,208, 34,100, 32, 50,243, 12, - 72,205, 49, 32, 59, 31, 8,110, 52, 3,117, 59,238,199,221, 23,185, 8,173, 95,151,162,248,146,161,197,241,105, 95, 34, 94, 29, -135,190,153, 15,152, 26,250, 4,209,177, 43, 7, 30, 62, 56,191,231,238,253,157,191, 30,122,218,188, 81,107,117,161, 49, 1,121, -121,121, 44, 65, 16,236,164,209,223, 62,223, 54, 34,139, 94, 49,232, 46,195,209, 9,159,253,139, 77,189,159,171,171,235,101,103, -103,231,179,133,226,200, 79, 38,147, 93,242,244,244,140, 70,193, 66,143, 3,201,201,201, 65,106,181,186, 5, 10, 22,103,197,102, -102,102,182, 47,180, 60,197,150, 98, 9,219,168, 82,169, 38,210, 52,221,163,112,251,136,166,233,208, 39, 79,158,212, 9, 13, 13, -125, 16, 16, 16,112, 59, 32, 32,224, 88, 64, 64,192,193,128,128,128,131,237,218,181, 91,102, 14,247,240,150,167, 13, 95,211, 34, -239,153,208, 66,161,200, 90, 95,248, 10,139,208, 2,112,174,168, 3,154, 73, 32,184,111, 26, 63, 30,142, 7, 15,130,251,228, 9, -134, 15, 29, 42, 23,139,197, 43, 80, 16,163,169,133, 84, 42, 93, 61,107,214, 44,153,203,194,133,240, 58,127, 30, 49,135, 15,195, -200,229,222, 40, 79,233, 52, 26, 13, 56, 28,142,197, 18, 35,145, 72, 64,211, 52,138, 51,249,190,246, 0,154,112, 37, 49, 53, 26, -124, 84, 5, 3, 54,239,184,170,245,181,129,207,103,184, 29, 86,249, 7, 62, 85,243, 2,231,184, 54,117, 91,225,215,242,154,154, -224,228,241, 29,133,136,139,139, 7, 13,198,174,249,102,173, 86,155,163, 86,171, 17, 26, 26,234,124,243,230,205,234, 33, 33, 33, - 78,133,239, 95,127,195, 27,211,204,203,203,107,183,183,183,247, 75, 47, 47,175,221, 0,154,217,241,221,141, 23, 46, 92, 0, 69, - 81,152, 53,107, 22,114,115,115, 97, 48, 24,144,153,153,137,184,184, 56,232,245,122, 36, 36, 36,224,209,163, 71,208,235,245,136, -137,137,129, 78, 87,246,128,132, 97, 24,200,229,114,104, 53,121, 88, 51,255, 59,204,156, 54, 25, 57,207, 34,145,144,148, 10, 71, - 7, 9, 38, 76,152, 64, 41, 20, 10,134, 97,152,170, 52, 77,119,100, 24,102,173, 45,247,201,170,190, 93,244,245,245,173,187,120, -241,226, 58,223,205, 95,203,147,115,242, 88,129, 76,200,240,101, 2,150, 95,187, 41, 70,204, 88,193, 91,190,244,231,199, 87,174, - 92, 73,132,109,193, 59, 73, 0, 23,195,194,194,106, 38, 38, 38,134, 4, 5, 5,213,114,241,171, 38, 16,120,122,103,243, 60,171, -168, 88,157,246, 26,225, 93,165,213,218,181,107,163, 46, 93,186,148,100, 15,167, 68, 34,169,189,117,235,214,186,238,238,238,117, -185, 34,145, 48, 63, 39,103,151, 41, 95,189,155,114, 84, 8, 73,185,227, 71,251,247,239,143,220,187,119,111,138, 61,156,129,129, -129, 65,243,231,207, 15,174, 87,175, 94,176,135,127,117,129,200,219, 55, 83,232,227,151, 41,170, 23, 34,128, 79,213,206,171, 87, -175,190,125,229,202, 21,155, 56, 41,138, 50,145, 36, 9, 46,151, 11,177, 88,140,227,199,143, 99,252,168,129,240,245,118, 70,173, -160, 32,116,248,108, 34,246,238,221,107,241,225,161, 40,170,196, 30,125,203,194, 9,135,194, 60,137, 72,172,171, 29,137,117,181, - 35,195, 60,137,200, 18,197, 86,225,231,197, 29, 99, 83,107, 84,194,116,163, 13, 98,235,232,185,115,231, 22, 13, 27, 54,140,223, -165, 75, 23, 92,187,118, 13, 35, 70,140,184,184,111,223, 62, 0,192,181,107,215, 48,105,210,164,139,103,206,156,193,216,177, 99, -209,190,125,123,254,133, 11, 23, 86,195,134,216, 63, 38,147, 9,155, 54,109,130,201,100,130, 84, 42,133,147,147, 19,186,117,235, -134,168,168,168,177,155, 55,111,142,166,184,220, 79,187,246,248, 24, 71, 14,238,195,163,251, 81, 99,183, 44, 24,108,119, 80, 96, -146, 36,209,101,232,208,140,140,224, 96,229, 22,149, 42,127,164, 66, 33, 14, 74, 73,113,250,123,247,110, 23, 27,132, 26, 65,211, -180, 69, 92,153, 69,135,121,227,240, 93,193,145,212, 5, 71,214, 8,119,159,242,140,188, 38,184,197,111,132,135,165,197,207,226, -242,201, 17,125,190,243, 71,159,239,252,209,115,106,181,225,226, 42,216, 32,169,130,113, 93,190,172,218, 46,160,145, 3, 84,105, - 6, 28,254, 37, 38, 86,155,137,133, 0, 30,217,242,156, 51, 12,243, 32, 49, 49, 17,124, 62, 31, 85,170, 84,169, 9,192,236, 23, -184,113,244,232,209, 95,204,153, 51,103, 50,128, 57,133,239, 73,219,181,107, 23,156,151,151,135, 39, 79,158, 0,192,205, 82,172, -193,150, 85,134, 74, 85,140,160,154, 87, 61,132,212, 30, 3,133,162, 62, 18,149,122, 36, 41,245,216,176,166, 23, 34, 47,204,195, -205,147, 67, 16,155,146, 2,145, 71,111,208, 38, 93, 93, 27, 6,245, 94,119,238,220, 33, 46, 92,184, 64, 48, 12, 3,163,209,200, -230,170, 84,236,173,139, 23,161,137,136, 32,228,114, 57,209,178,113,235,188, 45,243,142, 92,223,191,234,226, 77, 67,190,221, 3, -245, 55,193,204,231,207,159, 55,219,189,123,119, 59, 0, 51,235,213,171,119, 37, 46, 46,174,249,249,243,231,107,249,248,248,172, - 40, 47,169, 57, 44, 68, 76, 76,204, 43, 91, 97, 88, 8,125,161,104,232, 82, 40,230,122, 2,152,132, 55, 88,101,111, 7,206,189, -199,206,240, 71, 80,100,181, 97, 81,161,101, 29, 40, 12, 1, 10,133,204,104, 52, 36,156, 58,117,202, 64,146, 36,196, 98, 49,134, -141, 24, 65,174,249,245,215, 86, 3,155, 53, 59, 27,254,193, 7,199,206,158, 57, 19,214,164, 73, 19,176, 44, 11,146, 36,241,231, -159,127,106,180, 90, 77,166,175,175,175,163, 45,141,134,245, 3,164, 82,169, 44, 66, 43, 39, 39, 7,238,238,238, 54, 79, 29,170, - 85, 56,125,230,120,100, 22, 75,127, 22,215,229,233, 82,195,143, 41,189,154,100, 51, 52, 39,135, 54, 34, 71,195, 34, 87, 11,206, - 53,210,169,201,176,192,222,134, 23, 29,155, 60,138,136,190,156,169,165,181,118,173,150, 72, 75, 75,251,174, 95,191,126,153,158, -158,158,132, 92, 46,135,183,183, 55,217,179,103,207,140,248,248,248, 57,229,189, 35,206,206,206,159,180,107,215,238, 80, 98, 98, - 98,223,136,136,136,170,231,207,159,239,219,174, 93,187, 67,206,206,206,159,216, 72,177,235,219,111,191, 85,243,249,124, 52,109, -218, 20,185,185,185, 40, 92,229, 83,234,102,203, 20, 41,143,199,195,186,197, 63, 96,230,180,201, 80, 70, 95,195,221,139,167,112, - 46,133,192,140,249, 63,131,199,227,149, 43,214, 87, 13, 87,113,189,122, 94,178,135,147, 70, 12, 72,154, 62,109,154,236,246,237, -219,220, 47,190,156,196,198, 36, 43,193,239,178,132, 66,155,239,200, 59,106, 87,116,253,168, 3,102,205,252,186, 94, 97,208,206, - 82, 81,219, 85, 92,175,174,151,236,193,215,225, 3,159,127,249,229,151,162, 31,127,252, 81,219,172, 89, 51, 77,106,106,170, 72, -162,112, 10,226, 56, 56,214,141, 73, 78,145, 54,107,214,236,197,103,159,125,150,109, 47,231,140, 25, 51,196, 39, 78,156,224,244, -235,215,207,148,149,149, 37,229,138, 68,161,132, 64,216, 56, 61, 43,203,161,111,191,126, 79,251,246,237,155, 95, 24,176,212,102, -206,239,191,255, 94,252,232,209, 35, 78,179,102,205,140, 41, 41, 41, 50,137,179, 75, 8,229,232,212,232,101,114,170,188,113,147, - 38,207,190,248,226, 11,117,105,229,180, 22, 41, 50,153, 44,177, 69,139, 22,248,229,151, 95,176,124,249,114,116,238,220, 25, 81, -247,163,208,245,139,201,168, 51,110, 18, 14, 94,190,138,196,196, 68,204,157, 59, 23, 33, 33, 33,224,241,120,143,138,125, 30,199, - 70, 19,183, 83, 64,220, 78, 1, 65,140,141, 38,204,251, 37, 90,182,230,228,192,250,248,226,142,187,249,125,241,150,174, 48, 79, - 34,178, 52, 63,172,178,196, 86,223,190,125,199,155, 67, 56,140, 28, 57,242,226,138, 21, 43, 90,142, 28, 89, 48,208,110,218,180, - 41,230,205,155,215,114,198,140, 25, 23,231,207,159,143, 14, 29, 58, 32, 32, 32,160,204,133, 47, 52, 77,195,100, 50, 97,224,192, -129, 48,153, 76, 72, 79, 79,199,227,199,143,177,126,253,122,176, 44, 43, 4, 0, 79, 47,159,134,124, 62, 31,119,110,221,200,159, - 57,178,201,239,118, 88,178, 8,235, 65, 76, 94, 94, 30,250,142, 27,151,145, 80,163,134,114,109, 70, 70,254, 40,133, 66, 92, 45, - 54,214, 73,166,215,123,163, 20,191, 68,130, 32,192, 48,140, 69, 88,153, 5, 87,209,173,176,163,180, 9,134,124,230,232,249,237, - 73, 0,128,214,131,189,208,115,106,181,225,158,129,226,149,173, 6, 21, 24,189,247,206,123,206,230, 38,209, 63,194,136, 7,118, - 88,172,175, 93,187,118, 13,142,142,142,232,215,175,159,128, 36,201,133,230,241, 42, 10, 98,103, 45, 53,115, 9, 4,130, 37, 67, -134, 12, 33,179,179,179,113,247,238, 93, 0, 56, 83, 82,187,196,178,172,229,220,243,148, 4,104,134,143, 75,183,142,227,228,249, - 61,120,153,152,142,216, 52, 45,192,113,128, 86,157, 0,131, 38, 17,250,236, 91, 80,233,196, 54, 21,152,199,227,165,215,171, 87, -143,109,212,168, 17,203,178, 44,158, 61,123,102,138,137,141, 53,221, 88,182,140,189, 55,102, 12, 33,123,252,152, 39, 18,137, 8, -127,127,127, 8,133, 66, 70, 40, 20,102,254,139,157,247, 91, 9,183,240, 22,194, 66, 84,164, 85,139,197,251,137,100,188,186,218, -208, 18,192,180,184,128,165, 96,229,162, 1,123, 86,175,113,232, 55,112,176, 58, 36, 36, 68,225,237,237, 13,130, 32,208,171,119, -111,162, 93, 68,132,140,235,229, 5,231, 6, 13, 44,211, 17,167, 79,157,194,241,227,199,213, 71,254,218,239, 61, 98,212,168,238, - 0,182,150, 82, 24,142, 64, 32,176,252,110,114,114, 50, 4, 2,129,197, 39, 66,165, 82,193,213,213, 21,201,201,201,182,102,190, -222, 54,125,218,213,105,105, 77,190,243,111, 34,227, 18,199,212, 41,160, 89, 22, 92,130, 6, 52, 44,140, 52,160, 51,178,104, 88, -141,114, 58,169, 49, 41, 14, 95,219,247, 2,192, 54,123,174,158, 78,167,251,251,246,237,219, 99, 24,134,217, 3,128,140,136,136, - 96, 30, 60,120, 48, 30,182, 59,174,191,110,182, 23,139,167,158, 61,123,214,105,234,212,169, 89,135, 15, 31,206,233,214,173,155, -195,250,245,235,157,218,183,111, 63, 53, 51, 51,115,167, 45,134,192,184,184,184,173,241,241,241,227, 27, 53,106, 4,165, 82, 9, -131,193,128,200,200, 72, 4, 6, 6,226,230,205,155,168, 89,179, 38,110,220,184,129, 90,181,106,129,166,105,104,181, 90, 48, 12, - 67,151,213,152, 43, 51,210,129,204, 56, 36, 93, 59,134,199,247, 34,113, 54,137,192,170,157,135, 80,165,170,127,185,226,212,212, -116, 19, 7,123,186, 58,159,252,113,246,247,110, 49,127,255,137,125,155, 86, 49,231,142, 29,171,195,151, 97, 76,155,129, 19, 63, -214, 27,225, 7,128,223,188, 73, 35,116, 81, 60,162,197, 85,145,114,246, 65,233, 1, 22,107,186,137,131,221, 93,156, 79,252,180, -112,142,236,217,241, 45,216,181,238, 23,118,239,246, 63, 66,180, 64,147,224,224,224, 46, 36, 73, 58, 2,208, 22,250,121,217,148, -218,166, 56,206,211,135, 14,133,105,129, 38, 7, 14, 28,232, 34, 22,139, 61, 0, 24,243,243,243,159,191, 9,231,153,195,135,195, -204,229, 36, 8,194, 13,128,129,101,217,103,176, 51, 5, 79,255,254,253,231, 77,154, 52,105, 26, 77,211,174, 86,163,115,106,201, -146, 37, 28,134, 97, 40,150,101, 13, 36, 73, 26, 78,156, 56, 65,155, 76,166, 36,173, 86, 59,238, 77, 90,145,143, 63,254, 24, 87, -175, 94,157,141,130, 69, 24,182, 90,171, 95,241,211, 42, 76,217, 83,110,254,136,136,136,185,159,126,250,233,244,157, 59,119, 62, - 94,177, 98, 69,143,177, 99,199,226,207, 63,255, 68,141, 26, 53,112,231,206, 29,124,247,221,119, 0,208,114,198,140, 25, 7, 55, -110,220, 24, 16, 19, 19,179,196, 6,139, 6, 76, 38, 19,254,248,227, 15,244,234,213, 11,174,174,174,240,242,242, 2, 65, 16,127, -143, 26, 53,234, 87, 0,160, 8,138, 7, 0, 58,173, 78, 23, 20,212,200,102, 11, 46,143,199,179,180,117, 41, 41, 41,150,149,130, - 31,126,250,105,198,134, 31,127,196,239, 26, 13, 70, 41, 20,226, 4, 31, 31,207,131,207,158,133,223, 47,104,156,217,210,172, 58, -101,137, 44, 91, 93, 26, 52,201,248,246,175, 5, 47, 61, 0,116,110, 61,216, 11,173, 7,123,161, 81, 79, 55,130,164, 8,220, 59, -153,137,168,211,202,189, 70, 21,254,134,125,233,114, 30, 44, 92,184,240, 96,155, 54,109,122,212,174, 93, 27,163, 71,143,254,108, -211,166, 77, 60,163,209,248, 37,254, 9,243,224, 64,146,228,156,117,235,214,133, 59, 57, 57,225,194,133, 11, 56,127,254,252,223, - 0,226, 74,106,151, 0, 88, 98,102, 85,241,173,169,125, 20,147, 39, 78, 75,188,132,139, 23,254, 66,141,144,137, 16,121,116,135, - 83,208,124, 24,162,151, 67,159,121, 18, 78,190,221,144, 16,243, 12, 20, 71, 16, 85,150, 19, 10,203,178,247, 19, 18, 18, 2, 2, - 2, 2,136,151, 47, 95,154, 0,176, 52, 77,179,134, 86,173,140,117,126,252,145, 27,245,217,103, 68,243, 71,143, 40,150, 32,152, -200,200, 72, 0,120,248, 95,244,226,230,112, 11, 81, 81, 81, 37,133, 91,176, 11,245,234,213,107,121,254,252,121,129, 86,171,197, -185,115,231,208,184,177,101,109,215,127, 26,253,222, 90,139,188,103, 8, 47,230,189,245,175, 88,180, 94,169,216, 12,193,173, 85, -179, 38,205, 35,177,185, 87,247,238,249,183,111,223,182,140,250,180,215,175, 67,125,252, 56,104,154, 6,203,178, 56, 31, 17,129, - 33,131, 7,231,113, 41, 98, 67,181,106, 85, 89,130,125, 37,118, 75,199, 98, 70, 15,253,250,245,235,103,105,124,226,227,227, 33, -145, 72,192,231,243,193, 48, 12, 76, 38, 19, 40,138,130,131,131, 3, 76, 38, 83,113, 38,152,162,156, 70, 90,169,238,187,177,235, -160,100,175, 60, 3, 59,198,177, 26,252,120, 34,203,195,233, 33, 39,208, 35,132, 11, 23, 78, 26,123,102,201, 7, 73,140, 46,179, - 47, 94, 95,209, 85,214,146,255,154,245,235,215,255,117,200,144, 33, 36, 0,116,236,216,145,172, 95,191,254, 74,148,158, 42,167, - 84, 78,161, 80, 40, 0,128, 67,135, 14, 41, 31, 63,126,220,249,208,161, 67, 74,235,247,109,228, 92,191,120,241, 98,136,197, 98, -152, 76, 38,232,245,122,139,127,150,245,171,193, 96,128,139,139, 11,142, 28, 57, 2,154,166,143,148, 85, 78, 95,191,170, 32, 92, -171, 99,235,161,179, 56,159,193, 43,143,200,178,112, 86,247,144,212,242,112,113, 62,245,211,130,185,174, 89, 79, 35,145,144,144, -192,158, 56,126,228,138, 22, 72,204,201,197,204,108, 53,106,105,244, 16, 54, 14, 64,220,169,117,223,176, 51, 90,195,136,226, 87, - 13, 90, 56,235,120, 72,106,121,187, 58,159,248,249,167, 5,178,236,167,145, 72, 78, 73,193,209, 35,135,110,107, 1,243,116,227, -112,134, 97,234, 50, 12, 83, 23,192,240, 82,196,139, 93,156,249,249,249,245,242,243,243,235, 85, 36, 39,203,178,245, 88,150,181, -153,211,218, 39,106,233,210,165,209,201,201,201, 67,210,210,210, 58,153,183,172,172,172,142,121,121,121,109,243,243,243, 91,105, -150, 86,117,200,207,207,119,203,203,203,243,212,106,181, 13, 1, 68,218, 81,231, 45,176,142, 58,157,156,156, 60, 43, 57, 57,153, - 40,171,156,212,184,104, 98,199,207, 95,255,181,110,221, 58,207, 55,228,127,165,156, 25, 25, 25,123,118,238,220, 25,234,239,239, - 31, 48,124,248,112,172, 93,187, 22, 43, 86,172,208, 1,192,198,141, 27,117, 86,150, 44,223,152,152,152, 70, 37, 76, 27,118,180, -178,150,108,251,240,195, 15,217,243,231,207,163, 87,175, 94,150, 64,162,191,253,246, 27, 76, 38,147,170, 67,135, 14, 12, 0,104, -180,249, 42,150, 97,161, 55,148, 56,255,254,218,245,228,243,249, 31, 89,199, 11, 52, 7, 99,230,243,249, 96, 89, 22,181, 90,182, -204,200, 14, 9, 81,110,202,201,201,159, 85,175,158, 60, 60, 40,104,120,109, 96,112,113,156, 4, 65,188, 98,213, 41,186,217, 97, -201,178, 46,103,154, 38, 9,163,255, 90,240,242,184,217,178, 37,148,114,160,205, 53, 97,255,143, 47,211,181,233,248,173, 36,241, - 83,218,185, 43,149,202, 47,126,252,241, 71,157, 66,161,192,199, 31,127,140,249,243,231,143,106,217,178,101,142,155,155,219,213, - 26, 53,106,220, 27, 48, 96, 64,114,100,100,228, 23,237,218,181,195,147, 39, 79,240,243,207, 63,103,103,101,101, 13, 42,141,147, - 32, 8,139, 37,175,103,215,142,202, 53, 43,127, 97, 58,180, 25, 15,177, 72, 14, 35,215, 23,202, 60, 35,178,212, 44,244,130, 38, -224,243, 4,232,212, 44, 24, 87, 79,108,201,167,245,234,173,101,213,249,188,188,188,189,195,134, 13, 83,241,120, 60,232,245,122, -150,203,229, 66, 80,224,119,204,112, 59,119, 54, 52,127,240,192, 68,179, 44, 67, 16, 4,190,250,234, 43,117, 86, 86,214,206,242, - 60, 71,118,192,154,179,162,194, 45,116, 44,210,255, 84, 68, 88,136,183,113,238,239, 51,214, 23,179,253, 99,209, 50, 47,169, 52, -191, 18, 4, 67,211, 52,131,106,254,213,100, 49, 47,227, 86,245,239,223,111,100,151, 46, 93,197, 93,187,118, 21, 6, 71, 23,140, - 70, 15, 29, 58,132,125,251,246,229,159, 60,121, 82, 37,224, 82, 27,125,171,248,186,211, 52, 3,130, 96, 74, 85,195, 50,153,236, -203,111,191,253, 86,148,147,147,131, 21, 43, 86, 48,161,161,161,164, 68, 34,129,193, 96,192,198,141, 27,141,193,193,193, 92,146, - 36,145,147,147, 3,146, 36, 31,217,120,130,119,115,226, 18, 59,253,218,174,207,190, 70,159,143,112,174,211,174,185,162,173,175, - 55,140, 13, 88, 36,197,191,196,227, 51, 39,179,238,159, 88,150, 9,109,106, 31,148,157, 30,168,184,142,224,135,147, 39, 79,186, -125,241,197, 23,172, 86,171, 37,226,226,226,216, 5, 11, 22,184,141, 30, 61,250,135,164,164,164, 79,202,121, 83,136,236,236,108, - 16, 4,193, 20, 54, 36,230, 81,191, 61,243,114, 81, 91,183,110, 61,208,187,119,239,158, 29, 58,116, 64,116,116,180,101,138,208, - 90,104,153, 87, 31, 46, 92,184, 48, 27,192,244,178, 72,185, 92, 46, 86,108,221,131,236,172, 12,184,187,123, 65, 40, 18,161,188, - 43, 44,249, 36, 57,107,209,220,239,221, 50, 30, 94, 37,162,174,156,101,118,223, 77, 77, 51,209,108,241, 17,255,115,147,216, 66, -245, 95,250,104,134,164,102, 45, 90, 48,199,193, 60,173,185,243, 86,178,138,160,217, 47,222,232, 17,121, 95, 56,255,101,120,121, -121, 33, 57, 57,153,240,242,242, 98, 11,125,180,216, 82,132,214,171, 21,188, 96,186,140, 40,109,218,176,188,252, 47, 94,188, 88, -208,160, 65,131,175,159, 60,121,178,187, 78,157, 58, 99, 1, 84,209,233,116,217, 51,102,204,248,105,227,198,141, 35,109,177,100, - 1,192,159,127,254,185,108,196,136, 17,199,187,119,239,254, 13,195, 48,245,173, 58,246, 23,110,110,110,150, 41,220,244,212,148, -105, 99, 70, 14,156,150,151,151,101,115,156, 59,169, 84, 26, 62, 99,198, 12,161, 90,173,198,234,213,171,153,224,224, 96,210, 60, - 40,218,190,125,187,169,102,205,154,156,126,227,199,103, 44, 77, 73,193,188, 11, 23,212,211,234,214, 13,221,244,248,113, 67, 48, -204,182,146,172, 58,197, 89,178,204,110, 23,229, 68, 82,161,216,250, 13, 64,231,230,253, 61,112, 96,241, 75,100,197,232,127,130, - 9,207, 96, 67, 90,160, 98,144,176,119,239,222, 78,169,169,169, 7,190,255,254,123,135,134, 13, 27,162,110,221,186, 92,169, 84, -218,196, 28, 46, 38, 39, 39, 7,167, 79,159,198,218,181,107,245,247,239,223,239, 93,218,116, 21, 77,211,105, 53,107,214, 52, 95, - 7,150, 32,136, 76,149,142,112,216, 85,187,137,116,248,152,221,196,197, 27,151,145,100, 96,160, 51, 50,168,230, 31,134,182,157, -151,226,224,177,123,116, 82,204,131, 7, 70, 77,214, 6, 27,202,251,236,233,211,167,251,231,206,157,219,255,155,111,190, 17,101, -100,100,208, 58,157,142,217,179,103, 15, 53,124,248,112,154,229,112, 24, 30,135,131, 47,191,252, 82,147,157,157,253, 23,240,175, - 38,152,126, 43,225, 22,222, 66, 88,136, 10,179,102, 89,191,254,175,160,216, 39,148,161,200, 75,107,215,173,249,232,207, 63,118, -122, 80, 20,233,241,236,249,243, 27, 61,250,244, 77, 60,117,234,148, 19,207,193,161, 49, 0, 70, 63,118,236, 21,131, 78,163, 60, -124,224,128, 95,181,106, 85, 67, 10,147, 74,179, 12, 69, 94, 42,237, 7,243,242,242,212, 23, 46, 92,200,159, 62,125, 58, 17, 31, - 31,191,195,221,221,125,192,177, 99,199,164,125,250,244,209, 68, 71, 71,239,245,240,240,232,217,174, 93, 59,217,215, 95,127,173, -203,203,203,179, 39,241,232, 3, 54, 61,171,246,245,239,151,124,122,125,241,154, 15,192,161, 90, 64,199, 5, 24,227, 37, 24,114, - 79, 1,216, 1, 59,226, 29, 89, 67, 34,145,132,136,197, 98,220,190,125, 59,171, 73,147, 38,122,173, 86,203,155, 63,127,190,179, - 68, 34, 9, 41,239,133,103, 89,150,205,202,202, 2,195, 48, 28, 0, 68,225, 43, 24,251,215,226,127,210,163, 71,143, 3,187,118, -237,250,176,107,215,174, 8, 8, 8,128,209,104, 68,205,154, 53,161,215,235, 17, 24, 24, 8,157, 78,135,217,179,103, 35, 39, 39, -103, 50, 74,201,121, 70, 16, 4, 76, 38,147,197,217,214,219,199,175, 32, 78,207, 27,132,177,144,112,201,128, 71,135, 55, 33, 45, - 51,131,217,117, 39, 53, 53,223, 64,119,122,154,158,127,191,232,113,249, 52,212,237,134, 79, 72, 4, 0, 29, 83,122,198,121, 9, - 31, 1,143,143,252,134,212,180, 12,252,121, 43, 57, 91,109, 96, 58, 63, 46,134,211,174,114,190, 39,156, 97,179,163,209,119,130, -237,199,190, 9,108, 21, 84, 37,225,118, 10,136,155,226, 77, 44,214,109, 42, 54, 70,214, 27,242, 31,120,242,228,201, 1, 0,120, -240,224, 65,252,192,129, 3,167,189,124,249,114, 46,128,163, 49, 49, 49,235,236, 33,218,180,105,211, 19, 0, 35, 74, 59,102,231, -146, 17,251, 1,236,183,135, 55, 55, 55, 87, 27, 25, 25,169,253,250,235,175,137,248,248,248, 99, 30, 30, 30, 31, 30, 63,126, 92, -220,167, 79, 31, 93, 84, 84,212, 25, 47, 47,175,214, 29, 59,118,148, 30,189,118, 45, 49,255,217,179,195,135, 95,190,244, 49, 50, -204,225,210,158,207, 10, 22, 89,175,136,173,253,243, 94, 46, 58,176,232,101, 71, 70,135,189,250, 44, 92, 1,144,240, 6,156,231, - 47, 93,186, 84,103,240,224,193,187,186,117,235,214,188, 78,157, 58,168, 82,165, 10, 30, 63,126,140,244,244,116,220,189,123, 23, -135, 14, 29, 58,164,213,106,203, 76,168,173, 84, 42, 95, 79, 79, 36,116,242,218,178,122,214,161, 27, 23, 27,215,108,213,117,152, -168,174, 23, 3,189,129, 69,124,236, 51,204,158,185, 33, 63, 57,246,201, 3,131,201,208, 27, 54, 46,212,209,104, 52,235,151, 47, - 95,206, 61,124,248,112,215, 85,171, 86,201,252,252,252, 40, 30,143, 71, 2, 96,111,222,188,201, 78,152, 48, 65,157,145,145,113, - 68,165, 82,173,255,151,251,232,243,207,159, 63, 15,163, 40,170, 66,195, 45,188, 65, 88,136, 74, 84, 36,252,253,125,234, 84,247, -243, 26, 27, 80,197,103,188,191,159,239,208,226,156,220, 3, 20, 10,153,127, 85,239,240,128, 42, 62,227,171,251,121,141,245,247, -247,169, 99,131,105, 49, 64, 46,151, 31,243,244,244, 12, 5, 0, 7, 7,135,158,142,142,142,247, 29, 28, 28,122, 22,142, 2,123, - 74,165,210,135,193,193,193,163,255, 69,115,101,169,156, 53,107,214, 28,152,151,151,247, 89,205,154, 53, 7,154,247,159, 61,123, -102,217, 47, 15,167,175,175,111,135,155, 55,111,126,178,100,201,146,143,107,212,168,209,115,193,130, 5, 31,255,245,215, 95,159, -248,248,248, 52, 44, 7,167, 0,192,239, 92, 46, 55,149,207,231,167,113,185,220, 84,243,198,225,112, 82, 41,138, 74, 5,176,174, - 4,107, 89, 71,171, 81,206, 69,119,119,247, 24,119,119,247, 24, 15, 15,143, 24, 15, 15,143, 24, 79, 79,207,215, 54, 23, 23,151, -139,182, 94,207, 32, 15,105,203, 38, 85,100,151,234,121, 74, 47,214,118,151, 4, 85,196, 61, 10,242,144,182,108, 92,197,225, 82, - 61, 79,217,133,255,111,156,161, 30, 96,217,181, 65, 44,187, 54,136, 13,245, 0, 91,214,126, 69,154,253, 61, 61, 61, 89, 79, 79, -207, 89,111,107, 42,161, 4,254,127,253,121,175, 64,206, 0,153, 76,182,179, 74,149, 42,230,182,174,187, 92, 46,255, 91, 42,149, -118, 47,108,235,186, 75, 36,146,136,224,224,224, 97,101,113, 58, 57, 57,221,116,115,115, 75, 41,220,146,221,221,221,147,221,221, -221,147,221,220,220,146,220,220,220,146, 92, 93, 93, 19,205,155,163,163,227,213,114,158,187, 27,128,166, 0, 26, 2,144, 87,224, -245,244, 7, 48,166,176, 13,250, 17,192,104, 0,245, 43,224, 30, 17, 92,145,211, 56,129,163,239, 37,174,212, 53,151, 43,117,205, - 21, 56,248, 92, 42, 37, 5,143, 45,156,181,156,156,156,230,203,229,242,191,100, 50,217, 5,153, 76,118,192,197,197,101, 1,128, - 90,255, 81, 93,146, 2,216,136,130,248, 76, 71, 81, 48, 21,126, 0, 5,139, 10,252,222,193, 58,255,255, 25,225,197, 24, 84,240, -111, 68,129,234, 88,201, 89,201, 89,201, 89,201, 89,201, 89,201,249, 30,114,146,149,215,179, 82,104,217, 41,180, 94,217,204, 66, -139, 83,121,109, 42, 81,137, 74, 84,162, 18,149,120, 13, 76,229, 37,168,132,157, 40,118,106,153, 40, 69,149,218, 19,107,170, 60, -202,246,116, 37,103, 37,103, 37,103, 37,103, 37,103, 37,103, 37,231,255, 59,206,255, 23,248,183,146,199, 84,154, 85, 43, 57, 43, - 57, 43, 57, 43, 57, 43, 57, 43, 57, 43, 57,255,215, 81, 57,117, 88,137, 74, 84,162, 18,149,168, 68, 37, 42,241,150,176,222, 74, -112,189, 50,133, 88, 41,180,236, 7, 9,224, 51, 0,125, 1, 84, 71, 65, 54,251, 61, 0,126, 69,249,230,244,229, 0,166, 1,104, -129,130,213, 57, 47, 0, 92, 64,193,234,156,188,202,203, 93, 60, 92, 92, 92,190,229,114,185,142, 64, 65,106, 19,243,171,245,255, - 52, 77,103,171, 84,170, 5,111,169, 8, 20,108,140,160,108, 46,171,117,217,172, 95,141, 70,227,219, 44,103, 37,222, 77,212,116, -114,114,250, 93,169, 84, 14,130, 85,146,229, 74, 84,226,127, 1,174,174,174, 99, 13, 6,195, 12, 30,143, 55, 63, 61, 61,125,205, -255,163, 83,127, 77,100,189, 34,180, 14, 31, 62, 28, 1, 0,221,186,117,107, 3, 0,142,142,142,151, 73,146,244,183,231, 23, 24, -134,121,145,157,157, 93, 98, 0, 53, 71, 71,199,203, 20, 69,189,198,105, 52, 26,101, 28, 14, 39,183,184,239,152, 76,166, 4,149, - 74,213,240, 29,185,136, 4,128,195, 10,133, 66, 59,119,238,220, 95,219,182,109,235,155,148,148,100,154, 58,117,106,235, 59,119, -238,116, 5,240,145,157, 98,171, 25, 65, 16, 91, 66, 67, 67,247, 15, 29, 58,116, 87,147, 38, 77,248,153,153,153,178, 61,123,246, -120,111,221,186, 53,146, 97,152, 65, 40, 37,209,234,123, 10, 14, 74,142,103, 86,218,103,175,128,203,229, 58, 38, 36, 36,200,128, -130,121,240, 66, 97, 5,163,209, 8,163,209, 8,181, 90,141,144,144,144, 10, 47,188,135,135, 71, 24, 65, 16,171,164, 82,105,195, -188,188,188, 27, 0,198, 39, 39, 39,223,177,167,172, 38,147, 9, 44,203, 90,202, 89,167, 78,157,202,150,217, 62,140,226,243,249, -157, 3, 3, 3, 27,235,116,186,172, 23, 47, 94, 92,167,105,250,123, 84, 92,142, 54, 7, 0,223, 11, 4,130, 38,213,171, 87,247, -125,242,228, 73,188,193, 96,184,134,130,100,200, 57, 21, 33,178,218,180,105,115,113,245,234,213,206,227,198,141,187,120,225,194, -133,150,149, 98,171, 18,255, 21,124,125,125, 29,213,106,245, 6, 0, 97, 92, 46,215, 67, 40, 20, 66, 36, 18,165, 8, 4,130,219, - 34,145,104,228,165, 75,151,178,237,229,164,105,250,251,152,152, 24,143,166, 77,155, 46,118,115,115,155,157,145,145,161, 53, 24, - 12,103,178,178,178, 38, 3, 80,149,246,221,162, 90,228, 61, 19, 89,214,175, 48,139, 46, 78,225,137,177, 0,218,190,210,227,113, - 56, 62,177,177,177,110, 66,161, 16, 12,195, 88, 58,179,162,155,249,125,189, 94,143,186,117,235, 26,202,232,112,124,227,227,227, -221,248,124,190,229, 61,189, 94, 15,111,111,111, 38, 33, 33,193,173, 48,237,129, 5, 58,157, 14, 62, 62, 62,239, 82,206,163,207, -156,156,156,114,226,226,226, 67,180, 58,195,156,209, 95, 76,255,118, 80,223, 15, 20,151, 47, 95,102, 62,250,232, 35, 93, 68, 68, -196,103, 40, 72,156,106, 83, 99, 78, 16,196,214,169, 83,167,206, 22,138,229,206,103, 47, 63,208,109,221,115, 36, 49,180,102, 53, - 98,242,228,201,212,132, 9, 19,206,135,133,133,253,206, 48, 76, 3,216, 97,217, 82, 40, 20,199, 5, 2, 65,213,194,235, 23,151, -149,149,245,225, 59,116,253, 66, 81, 16, 15, 38, 12,192,109, 59, 62, 43, 17,153,153,153,208,104, 52,175,109,117,234,212,121, 27, -142,136, 28, 46,151,123, 96,225,194,133,222, 41,201,201,248,101,233,210,166, 40,176,100, 54,181,229,203,105,105,105,175,149, 51, - 40, 40, 8,149,176, 11,211,102,207,158,189,240,211, 79, 63, 5, 77,211,208,104, 52, 94, 79,159, 62, 13,158, 49, 99, 70,239,103, -207,158, 53, 6,240,252, 77, 7,227,129,129,129,209, 19, 39, 78,116,106,220,184, 49, 10,179, 84,120, 93,184,112,161,233,198,141, - 27,135,196,197,197, 5, 1, 72,127,147, 31,112,114,114,250,253,183,223,126,115, 22,139,197, 56,120,240,160,115,135, 14, 29, 46, -220,186,117,171,213, 27,136, 45,210,217,217,121, 2,128,246, 12,195,240, 1, 92,203,202,202,154, 7,251,163,186,123, 74,165,210, -189, 36, 73, 86, 3,254,137, 70, 79,146,164, 11, 65, 16, 25,230,247, 8,130,112, 99, 24,230,138, 82,169,108, 94, 89, 29,223,111, - 56, 59, 59,143, 74, 77, 77, 93, 45, 16, 8,120, 10,133, 2, 98,177, 24, 28, 14, 7, 28, 14,167,138, 64, 32,168, 34, 16, 8,186, -180,107,215,110,252,223,127,255, 93,106,132,253,102,161,238,195, 65, 18,115, 40,130,164, 0,128,228, 74,228, 14, 14, 14,152, 51, -103,142,164,103,207,158, 18, 0,184,120,241,226,208, 97,195,134,117, 72, 72, 72,168, 91,146,216, 42, 78,139,188, 71, 88, 95,154, -117, 1,133,234, 49,226,149, 39,151, 36,193,231,243,113,245,234, 85,216, 18,172,220,156, 34,161,212,214,160, 48,194,248,157, 59, -255, 24, 0,204, 29, 13,159,207,199,165, 75,175, 6,149,111,214,172,153,229, 97,255,183,208,183, 78, 65,144,199,221,159, 23,148, -171,223,170,130,232,218,187, 63, 15, 66,235,159, 99,209,119,194,172, 1,249, 90, 67, 35, 0,234,236,172,172,172, 27,251,246, 37, -133,214,172,201,251,253,247,223, 27,123,123,123,247,181, 67,104, 77,107,208,160,193, 94, 74,228,224, 50,116,216,240,161, 35, 57, -164, 97,200,152,175,231,199, 39,103,168,195,195,195,247, 29, 60,120,112,232,162, 69,139, 30, 78,153, 50,101, 26,128,239,108, 45, -191, 80, 40,172,250,232,209,163, 64,154,166, 81,167, 78,157,119, 41,141, 65, 40,128, 91, 44,203,130, 32,136,162,130,170,180,207, - 74,133,217,130, 85,220, 86,209,240,246,246, 14, 26, 60,120,176,139, 50, 35, 3,191, 44, 93,106,126,187, 33,202,152, 70, 52, 63, - 63,122,189, 30, 31,127,252,241, 96,154,166, 57,102, 17,168,211,233,244, 57, 57, 57, 90,252,227, 88,154, 14,224, 3, 27,138,227, - 47,145, 72,126, 2, 16,166,209,104,188, 1, 64, 34,145, 36, 50, 12,179, 95,173, 86,127,135,127, 18,248,218, 61,192, 5, 16,140, -146, 83, 65,177, 11, 23, 46,124, 50,125,250,244,231,255, 1,103, 85,119,119,247, 5,253,250,245,195,145, 35, 71,112,244,232, 81, -163, 72, 36,226, 12, 27, 54,140, 24, 63,126,188, 98,226,196,137, 93, 0, 44,127,195,219,220,101,246,236,217, 78,181,107,215,198, -158, 61,123,112,247,238, 93, 77, 96, 96,160,168,109,219,182,224,112, 56, 78,223,126,251,237, 71, 0,182,188,201, 15, 40,149,202, -121, 95,127,253,245,214, 63,254,248, 67,246,226,197, 11,172, 90,181,202,101,192,128, 1, 17,113,113,113,109,236, 16, 91, 2, 0, - 19, 0,180,163, 40,170,213,176, 97,195, 76, 95,124,241, 5,151, 36, 73,227,210,165, 75, 93, 55,110,220, 56,128,203,229,134,101, -102,102,218, 50, 72, 35, 1,204, 25, 57,114,228,136,191,255,254, 91,113,253,250,117,190,179,179, 51,104,154,182, 88,138, 25,134, -113, 51,215, 89,147,201,132,160,160, 32, 31,171,239,139,222, 87,161, 65,146,164,129, 97, 24, 46, 0, 33, 0, 93, 89,251,255, 75, - 34,203,201,201,105,156, 82,169,252,213,195,195, 3,238,238,238,175,245,181, 58,157, 14, 66,161,144,231,225,225,241, 91,207,158, - 61,185, 7, 14, 28, 40,113, 10,144,160,136,239, 15,238,156,235,237,164,144, 1, 0,150,173, 61,145, 15, 0,127,253,245, 23,146, -146,146,160, 80, 40, 80,183,110, 93,106,238,220,185,158,147, 39, 79,254, 37, 43, 43,107,100, 73, 92, 69,181,200,123,102,209, 90, - 95,220,126,169, 62, 90, 44,203, 90,242,228,217, 88,105,139,190,117,186, 8, 31,161,215,235, 81,212,162,101,126,120,185, 92,110, - 81,243, 35, 8,130, 96, 75,227, 44, 6,195, 36, 18, 73,136, 90,173, 94,105,199,232,214,194,185,251,243, 32,108, 21, 76, 29,104, -206, 68,218,229,235,130,215,173, 0, 46,191, 28,185,106,117,155, 54,222, 19,102,174,152,165,201, 76,202,248,118,112,247,170,129, - 30,206, 34, 73,118, 90,142, 83,173, 90,157,240,234,180, 87, 89,229,108, 61,116,232,208,109, 39,175,198, 16, 66, 33,143,199,161, - 40,110,203,122, 53,157,125, 29, 40, 7, 25,224, 16,255,252,201,229,225,195,135,215,155, 50,101, 74, 43, 59, 56, 81,216,225, 98, -251,246,237, 32, 8,130,180,231,220, 43, 16,167,139, 17,244,183, 88,150,133, 82,169,196,145, 35, 71,208,181,107, 87,179,160,130, -249, 51,149, 74,133,228,228,100,120,122,122,222, 2,192, 45,237,122,154,173,169,102, 81, 53,108,216,176,193, 38,147,137, 99,213, - 72, 20, 21, 48,197,137, 24,155,206,221,211,211,243, 36,128, 15, 8,130,128, 94,171,213,255,244,243,207,214, 31,223, 44, 34,178, - 78,151,244, 44, 25,141, 70,208, 52,205,185,117,235, 22,215,170,174,115, 1, 72, 0,184,176, 44, 11,146, 36,239,217,112, 61,131, -196, 98,241,229, 67,135, 14,201, 27, 54,108, 72,240,249,124,152, 76, 38, 68, 69, 69,249, 46, 90,180,104,204,233,211,167, 63, 82, -171,213,117,240,122,242,116, 91,238,123,240,133, 11, 23,212, 1, 1, 1,197, 10, 71,149, 74,197,169, 89,179,102,155, 18, 68,209, -219,230, 76, 72, 77, 77,237,245,193, 7, 31,140, 77, 73, 73,137, 54,153, 76,223, 0,168,235,226,226,114,171, 79,159, 62, 16,137, - 68,237, 52, 26,205,242, 55,169,243,110,110,110, 61,155, 55,111,142, 85,171, 86, 97,209,162, 69, 29, 1,156, 1,208, 65,165, 82, -157,238,209,163, 7, 28, 29, 29,123,101,103,103,111,121,131,231,168,102,235,214,173,127,155, 51,103,142,236,200,145, 35, 8, 12, - 12, 68,110,110, 46,190,250,234, 43,183, 31,126,248,225, 92,118,118,118, 91, 43,177, 85, 18,103, 29,129, 64,176,229,143, 63,254, -144, 6, 4, 4, 4,240,120, 60, 50, 32, 32, 0, 74,165, 18, 90,173, 86, 48,127,254,252,122, 34,145,232,206,242,229,203,183, 0, -232, 83, 70, 57, 73, 0,243,214,173, 91, 55, 54, 60, 60,220,113,240,224,193,180, 94,175,199,174, 93,187, 64, 81, 20,184, 92, 46, -196, 98,177, 37,121, 53,143,199, 67,173, 90,175, 5, 73, 63, 88,202,249,230,160,192, 15,213, 17,246, 77,187,158, 46,133,207, 50, -245,193,229,114, 33, 20, 10, 33, 20, 10, 33, 16, 8,240,232,209,163,153, 66,161,112, 41, 65, 16, 38, 91, 56,137,127,212, 69, 8, -128,235,101,237,227,117,215,144,127,163,253, 44, 10, 31,130, 32,150, 1,104, 87,208,237,146, 17, 46, 46, 46, 95,166,166,166,198, -218,202,233,233,233,233,156,153,153,185,220,211,211, 19,238,238,238,150,254,219,219,219, 27, 70,163, 17,169,169,169, 96, 89, 22, -217,217,217, 16,139,197,240,242,242, 90, 30, 30, 30,190,103,253,250,245,153,197,114, 50, 88,212, 99,192,140,239, 41,138, 34, 1, -128,226, 72,165, 19,167, 3, 85,171, 86, 69,203,150, 45,161,213,106,145,147,147,131,224,224, 96, 14, 65, 16, 67, 9,130,144,179, - 44,187, 6,192,217,255, 65, 67, 97,137,206,240,179,139,206,139,154,179,197,243,120, 60,155,132, 86,225,241,101, 89, 80, 72,163, -209, 8, 30,143,247,138, 69,130, 32, 8,208, 52,253,202,251,102,161, 85, 30,161, 62,126,252,120,230,183,223,126, 27,155,149,149, -181, 22,229,156, 74, 24, 58,116,232,107,254, 30,147, 39, 79, 78, 72, 75, 75, 99, 63,238, 20, 34,137, 62,150,148, 92, 93, 33, 21, -185,202,100,213,132, 10, 39,199,204,204,204, 43,133,141,137,173,168,209,160, 65, 3,209,214,125, 23, 18, 70, 79, 90, 56,183, 97, -128,179,188,190,143,139,194,195, 65,196,151,146,132, 90,104, 50, 38, 56, 57, 57, 5,218, 91,110,115,187, 32, 22,139, 65,146,228, -187, 98,209, 50, 1, 8, 35, 8,226,214,145, 35, 71,208,164, 73, 19,107,177, 5,150,101,145,147,147,131,168,168, 40,180,110,221, - 26,133, 2,172, 76, 95, 45,134, 97, 96, 48, 24, 96, 48, 24, 44, 2,198,170, 14, 89, 4,140,249, 88,138,162,238,149,179,252,115, - 21, 10, 69,235,118,237,218,241,119,238,218,197,103, 89, 86,141,130, 28,106,121, 44, 91, 66,130,236,162, 23,192,100,178, 88,217, -184, 92, 46,226,226,226, 44, 29,151, 57,183,164, 80, 40,180,205,148, 33, 16,124,253,231,159,127,202, 27, 55,110, 76,100,102,102, -130, 97, 24, 75, 35,249,235,175,191, 10,251,246,237,235, 29, 25, 25,249,173, 78,167,155, 93,142,115, 37, 74, 18, 68, 0, 32,151, -203, 77,176, 45, 98,118,153,156, 38,147,137,104,209,162,197,148,140,140,140,122, 26,141,102,190,141,245,232, 96, 66, 66,130,117, -199,126, 39, 58, 58, 90,211,191,127,127, 81,181,106,213,154, 60,120,240,224,141, 42,106,205,154, 53,155,113,185, 92, 92,187,118, - 77, 7,192, 60,178,142,184,123,247,174,174, 79,159, 62, 2, 95, 95,223,102,217,217, 54,187,172,212, 12, 10, 10, 58,229,230,230, - 38, 50,183,161,174,174,174,220,245,235,215,203, 18, 19, 19, 97, 48, 24, 48,109,218, 52,116,235,214, 13, 46, 46, 46,152, 60,121, -178,251,226,197,139,127,207,203,203,107, 80,154,209,154,207,231,111,123,250,244,105,160,167,167,167,232,234,213,171,168, 95,191, - 62, 50, 50, 50,144,146,146,130,188,188, 60,164,164,164, 96,228,200,145,110,191,252,242,139,151, 13,150, 44,139,200, 90,191,126, -125,246,222,189,123,169, 13, 27, 54,200,184, 92,174, 69,104,113, 56, 28,139,208, 50,231, 86, 44,199, 76, 67,118,161,104,115,204, -201,201,201,121,131, 91, 36, 0,192,183, 22, 89, 2,129, 0, 2,129, 0, 66,161,240,141,242,178,190, 39,240, 38, 8,226, 1,143, -199, 19,136,197, 98, 30, 73,146, 16, 8, 4,157,156,156,156,238,215,173, 91,183,238,169, 83,167, 98,108, 33,209,106,181,219, 4, - 2, 1,215,205,205, 13, 0, 16, 24, 24,136,250,245,235, 67,173, 86, 51, 57, 57, 57,112,116,116, 36, 99, 99, 99,161,209,104,144, -156,156, 12, 63, 63, 63, 46, 73,146,219, 80,224,135,252, 26, 46,223, 74, 89, 11, 96,173,121,223,197,197, 37,213,218,210, 41, 20, - 10,225,237,237,141,196,196, 68,200,100, 50,234,135, 31,126,232,179,107,215,174,222,151, 47, 95, 30, 10, 96,187, 21,213,236,247, -216, 71,203, 44,178,172, 95,255, 17, 90,221,186,117,155,117,248,240,225, 54,197,141,194,185, 92,110,133,249,186,152, 5,149, 92, - 46, 47,106,181, 2,195, 48, 37, 89,180,236,254, 29,161, 80, 40, 26, 55,110, 92,238,154, 53,107,236, 22, 91,253, 86, 69, 91,172, - 88,175, 13, 35,235,212,185,252,237,183,223,246,252,251,239,191, 19, 27, 6, 84,227, 72,146, 98,243,132,114, 71, 71,248, 84,233, - 58,172, 87,159,187, 40, 88,125,104, 43,158,230,230,230,138,170,251,136,245, 36,169, 37,170, 8, 56, 50, 79, 9, 79,224,161, 80, -120,243,244,186, 52,185, 66,193,215,233,116,217, 40, 37, 9, 52, 0,184,187,187,159, 16,137, 68,126,230,125,133, 66,225,192,178, - 44,196, 98, 49, 60, 61, 61,165, 20, 69, 61,182,122,184, 98, 83, 83, 83, 59,149, 85, 48, 71, 71,199, 19, 2,129,192,143, 36, 73, - 16, 4, 1,138,162, 64,146, 36, 72,146,180,252, 79, 81, 20, 8,130, 64,126,126,126,108, 76, 76, 76, 39, 27,206,247, 54,128,176, -174, 93,187, 90,196,214,177, 99,199,208,185,115,103,100,103,103,227,254,253,251,214, 34,203,166,105, 67,107,231,119,243,160,224, -209,163, 71, 22,225, 98,189,201,100,178, 55, 49,177, 95,236,215,175, 31,126,251,237, 55,182,112, 48, 33, 33, 8,162,190,131,131, -195,163,135, 15, 31,218,228, 7,195,178, 44, 12,134,127, 14, 53,119, 94,133,254, 16,118, 37, 7,166, 40,170, 83,131, 6, 13,136, -156,156, 28,179,128, 4,135,195, 1, 69, 81,160, 40, 10,171, 87,175, 22, 53,110,220,120,134, 64, 32,152,194,227,241, 84, 70,163, -113,167, 86,171,157, 15, 32,251, 93,106,145, 90,181,106, 53, 41, 62, 62,190,155,159,159,223,161, 55,160, 97,141, 70,163, 30,128, -136,162, 40,110, 5,180, 81, 84, 97,221,210, 90,137,125, 83,225,190, 0, 5,211,196, 54,193,197,197,229,247,163, 71,143,250,248, -249,249,193,104, 52,194,100, 50, 33, 47, 47, 15, 17, 17, 17,208,233,116, 48,153, 76, 8, 12, 12,196,247,223,127,175,253,242,203, - 47,133,235,214,173, 75,203,203,203, 27, 84, 6,237,151,123,246,236,145,120,122,122,138, 52, 26, 13,158, 63,127,142, 6, 13, 26, - 32, 55, 55, 23,106,181, 26,249,249,249, 48, 24, 12, 80,169, 84,142, 52, 77,235,203,224,154,105, 45,178,198,140, 25,115,143,207, -231, 55,248,226,139, 47,144,144,144, 96,121,230, 71,143, 30, 13,119,119,119,203,179, 84,216, 38,219,213, 48,115, 56, 28, 8, 4, - 2,240,120,188,236, 42, 85,170,128, 32, 8, 97,108,108,108,121,166,226,228, 0, 84, 92, 46,151,111, 45,176, 4, 2, 1,174, 93, -187,246, 45,159,207, 47,201,154, 85,210,115,201,218,179,255, 95,131, 32,136,101, 60, 30, 79,224,228,228,196,179, 26,112,242,164, - 82, 41,220,220,220, 86, 1,232, 98,227,121,135, 58, 57, 57, 89,218,247,144,144, 16,196,199,199,239,207,201,201, 25,146,150,150, - 6,146, 36,183,145, 36,217,219, 60, 72,205,202,202,130,175,175,111,104, 73,124,205,195, 60,198,130, 96, 95,177,104, 21, 25,160, - 65, 46,151,227,229,203,151, 80,171,213,236,147, 39, 79,136,113,227,198, 17,122,189,126,115,100,100,228, 21, 20,172,182, 47, 81, -139,188, 39,176,223, 71,203,108,209,178,181, 3, 32, 8,162,204,209,132,209,104,148, 6, 7, 7, 23,231,240, 69, 20, 39,180, 10, -125,118,202, 85,209,185, 92,174,172,188, 98,171, 40, 14,237,253,195,125,209,247,211,190,119,242,170, 86,125,202,148,153,156,238, -221,187, 95,221,186,117, 43,237, 84,187, 75,135,179, 39,182,187, 47,255,106,234,177,163, 71,143, 2, 5,142,209,182,226,226,225, -195,135, 61, 38, 79, 24,143,239,191,254,242,184, 60,208,133, 47, 37,156, 36, 66,157, 58, 93, 10, 86, 35,168, 17,212,109,223,161, - 67,201, 0, 34, 75, 35, 17,139,197,126, 15, 30, 60, 8,180, 94, 72,160,215,235, 33, 22,139,113,246,236, 89, 87,145, 72,228, 10, - 0, 26,141, 6,117,235,214,181,213, 98,226,247,248,241,227, 64,153, 76,134,252,252,124,232,116, 58, 24,141, 70, 48, 12, 3,130, - 32,192,229,114,193,231,243, 33,145, 72,236, 93,217,103, 17, 91,199,142, 29, 67,112,112, 48,178,178,178, 16, 29, 29,109,183,200, -178,182, 18, 89,251, 99,113, 56, 28,252, 30, 16,128,209, 73, 73, 22, 1,179,204,193, 1,223, 51,229,203,166, 81,183,110, 93,246, -226,197,139, 56,126,252, 56,122,244,232, 65, 28, 56,112,192, 64,211, 52, 47, 41, 41,233, 94, 82, 82,146, 77, 28, 12,195, 88,202, -106,110,183,173, 5,150,189, 66,203,100, 50,201,248,124, 62,180, 90, 45,204,150, 7,235,205,223,223, 31, 74,165,146,163, 82,169, - 56, 73, 73, 73,226,121,243,230,125,113,238,220, 57,207,220,220,220,129,255,101, 43,180,102,205, 26,191,209,163, 71,199,113, 56, - 28,182,115,231,206,131, 99, 99, 99,123,121,122,122,158,249,251,239,191,127, 6, 80,211, 94, 62, 23, 23,151,155, 28, 14,199, 71, -165, 82,241,118,239,222,109,204,205,205,229,185,186,186,166,154,219, 14,243,181, 54, 26,141, 54,173, 92,118,113,113,185,153,145, -145,193, 91,185,114,165, 49, 51, 51,147,231,238,238,158,106,230,201,206,206,230,237,222,189,219,168, 82,169,120, 14, 14, 14, 55, -115,114,114,202,228,203,200,200, 24, 52,116,232,208, 11,103,206,156,113,161, 40, 10,177,177,177,200,204,204,132,163,163, 35,182, -109,219, 6, 63, 63, 63,236,217,179, 71,169, 84, 42, 71,253,244,211, 79, 51, 10, 69, 86, 89, 62, 90,173,155, 52,105,226,151,157, -157, 13, 71, 71, 71,168,213,106,220,188,121, 19,117,234,212, 65, 82, 82, 18, 72,146,132,163,163, 35,126,253,245,215,124,130, 32, -148,165, 17,137, 68,162, 94,225,225,225,142, 0, 16, 30, 30,238, 24, 30, 30, 94,108, 7,215,172, 89, 51,172, 90,181,170,168,208, -178,103, 96, 96,177, 58, 89,137, 35,109,211,166, 77,113,238,220,185,169,118,138, 35,189, 89,180, 21,181,102, 9, 4, 2,147,189, -117,136, 97, 24, 30, 10,124, 68, 9, 91,246,223, 1,180, 17,137, 68,188,162,111,230,231,231,243, 60, 61, 61, 91,217, 33,124,157, - 69,162, 2,131,147,159,159, 31,114,114,114,104,189, 94, 63, 96,251,246,237, 70, 0, 8, 11, 11, 27, 64,211,180,214,100, 50, 81, -124, 62, 31,106,181, 26,110,110,110,206,165,216, 70,191, 57,184,115,158, 71, 81, 31, 45, 79, 79, 79,132,133,133, 65,167,211, 33, - 57, 57, 25, 17, 17, 17, 70,154,166,119,172, 89,179,134,113,117,117, 29,241,241,199, 31, 83,145,145,145,159, 3,152, 84,146, 22, -121,207,172, 89,235, 75, 20, 90,133, 10,242, 28,128,182, 69, 79,178,168,248, 41, 77,104,149, 53,117,200,231,243,179,227,226,226, - 36,214,157,138,201,100,130,151,151, 23,195,178, 44, 81,156,208,122, 19, 83, 48,151,203,149, 77,159, 62, 61,123,205,154, 53,131, - 94,190,124, 57,203,150,239,236,254, 60, 8, 91,139,136,172,181,139,230,172, 90,185,104,158,211,179,227,155,177, 97,197, 18,154, -166, 17, 89,175, 94,189, 86,121,121,121, 28, 7,137, 17, 25,217, 56, 86, 40,178,108, 21,133, 36,128, 77,215,175, 95,143,236,210, -165,203,165, 77,127,238,115, 74,122,254,252,138, 64,149,145, 44,175, 17,200,225,121,251,245,206,213,106,121, 3, 6, 12,112, 5, -240,113, 89,141, 88,118,118, 54, 82, 82, 82,138, 10, 48, 60,122,244,232,181, 99,109, 42, 28, 73,130,166,105,236,221,187, 23, 98, -177, 24, 18,137,228,149,205, 44,178,222,100,161, 66,231,206,157,161, 84, 42, 33,149, 74,109, 46, 87, 81,241,194,178, 44,244,122, - 61,244,122, 61, 12, 6, 3, 13,128,203,225,112, 48, 50, 33,193, 98,229,177, 71,192, 20, 69,189,122,245,216,203,151, 47,227,210, -165, 75, 80,171,213, 88,185,114, 37, 60, 61, 61,219, 3,152,105, 47,151,149,147, 62,173, 82,169,184, 42,149,202, 98, 29,228,114, -185, 22,235,129,141,150, 60, 30,135,195,177,140, 70,205,155,181, 85,139,162, 40,184,187,187,195,195,195, 3,107,215,174,229, 85, -171, 86,173,219,127,217, 2, 45, 94,188,184,198,178,101,203, 54,110,221,186,245,216,160, 65,131,118, 69, 69, 69, 13,119,112,112, -184,119,246,236,217,121, 2,129,128, 41,231,243,237,147,148,148,228,102,253, 22,195, 48, 98,147,201,100, 17,182,249,249,249, 54, - 15, 48,184, 92,174,207,131, 7, 15,196, 0, 48,111,222, 60, 46, 0,177,217, 25,220,204,153,159,159,207,173, 83,167,142,143,141, - 69,124,124,225,194,133, 86, 29, 59,118,188,124,234,212, 41,133,159,159, 31, 18, 19, 19,145,152,152,136, 26, 53,106, 96,193,130, - 5,106,149, 74,213, 2,192,227,188,188,188, 3, 54,114,122, 41, 20, 10,110, 92, 92, 28, 76, 38, 19, 66, 67, 67,241,235,175,191, - 98,192,128, 1,168, 91,183, 46, 84, 42, 21, 30, 60,120,128, 45, 91,182, 40,120, 60, 94,169,109,135, 70,163, 57,176,126,253,122, -223,162, 22,173,193,131, 7, 75, 82, 83, 83, 45,117,114,206,156, 57,175, 76, 33,218,211, 38, 23, 78,109,149,184,149, 7, 38,147, - 73, 46, 20, 10, 85, 2,129,128,111,246,207,138,136,136,176,219,154, 85,100, 0,104,207,254,127, 6,179,104, 45,166,111,133,135, -135,135,205, 60, 2,129,128, 48,183,141, 38,147, 9, 57, 57, 57,180,167,167,167,101,122,255,214,173, 91,116,213,170, 85,105,138, -162, 40, 62,159, 15,130, 32, 32, 22,139, 75,108,240, 89,154,157,211,125,192,204, 87, 86, 29, 78,156, 14, 24, 12, 6,220,186,117, - 11, 6,131, 1, 17, 17, 17,198,159,126,250, 41, 41, 59, 59,123, 34, 0,206,137, 19, 39,134, 78,157, 58,149,114,115,115,235,152, -150,150,134,178,180,200,123, 36,182, 94,179,114,153,123,161,115,221,186,117, 35, 10,151, 86, 18,102,225,100,143,208, 42,124,248, -202,236,121, 9,130, 64,114,114,178,101,223,205,205,205,238,223,178, 21,206,206,206,234,102,205,154,201, 50, 50, 50, 14, 44, 94, -188,184, 92,150,172,181,139,230,172, 90, 56,247, 7, 39,229,195,171, 72, 72, 74,134, 50,205, 24,121,241,222,203,253, 0,246, 3, - 0,214,213, 62, 71,140,141, 94,109, 43,103,144,139, 40,132,203,227,236,255,160, 75, 55,223,254,225,147,200,207, 62,251,172,229, -208,161, 67,115, 6, 13, 26, 52, 65, 42,149,214, 52, 24, 12, 89,251,142, 28,137,233,223,191,127, 53,154,166,135,162,140,152, 35, - 26,141, 38,182,109,219,182,214,215, 83,126,250,244,105,247,152,152, 24,140, 31, 63, 62, 61, 49, 49, 49,219,250, 88, 91,202,104, - 48, 24, 98, 67, 66, 66, 74,156, 46, 52, 79, 41, 2, 64,110,110,110,172, 29,151,212,178,186, 48, 51, 51, 19,143, 30, 61, 2,135, -195, 65,211,166, 77,113,241,226, 69,180,108,217,210,174, 21,135, 90,173, 22,126,126,126,208,106,181, 80,171,213,249, 0, 4,219, -170, 85, 3, 0,124,158,153,137,155, 63,253,132,171, 11, 23,194,186, 62,219,138,250,245,235,179, 87,175, 94,197,189,123,247,160, -211,233, 48,106,212, 40, 0, 32, 10,235,174, 61, 33, 51, 2, 40,138,234,220,165, 75, 23, 47, 0, 80,171,213,196,245,235,215, 33, - 20, 10, 45,207,194,161, 67,135,144,152,152, 8,130, 32,160, 80, 40,124,178,178,178,170, 1,120, 89,138,217,159,120,249,242, 37, -126,252,241, 71, 48, 12,131,169, 83,167, 34, 48, 48,208, 34,176, 98, 99, 99, 49,111,222, 60,208, 52,141, 31,126,248, 1, 53,106, -212,128,209,104, 20,194,142, 56,101, 21,141,201,147, 39, 63,219,191,127,255,177,248,248,248,143, 22, 45, 90,212,134, 32, 8,102, -202,148, 41, 63,202,229,114,250, 77,120,179,114,114,241,232,105,172, 69, 8, 21,221, 92, 93,156,236,230,123,242, 60,222,242,125, -154,182,230,163,225,236,164,176,183,136,249, 70,163, 81,221,187,119,111,199,189,123,247, 18, 53,106,212,192,139, 23, 47,204,150, -161,124,216, 31,210, 33, 81,169, 84, 6, 82, 20,197,123,250,244, 41,170, 86,173,138, 38, 77,154, 96,254,252,249,200,200,200,128, -201,100,130,155,155, 27, 99, 52, 26,111, 25, 12,134,243,101,112,205, 25, 51,102, 12, 15,192,216, 66,203, 86,189,137, 19, 39, 50, - 75,150, 44,193,173, 91,183, 44, 22, 44,107,103,120,123,167, 14,173,173, 78,214, 91, 68, 68,196, 84, 62,159,207, 2,184, 6,251, - 3, 61,235,139, 90,180,202, 99,205,122, 91,120,155, 43, 25, 61, 61, 61, 35,100, 50, 89,183,172,172,172, 87,172, 90, 45, 90,180, - 48,184,187,187, 95,176,149, 71, 42,149,102, 81, 20,229, 12, 0,137,137,137,144, 72, 36,188,231,207,159, 47, 68, 65,240,108, 84, -171, 86,109,161, 82,169,228, 85, 43,108, 79, 61, 60, 60,160,215,235, 75,116, 99,185,114, 59,117, 51,128,205,230,125, 39, 39,167, -228,156,156, 28,209,146, 37, 75,242, 22, 46, 92,168,161,105, 90, 7,224,108,118,118,182, 37,142, 86, 74, 74, 74, 14,151,203,117, -114,116,116,244, 54, 11,173,226,180,200,123,134,146, 45, 90,133, 74,146, 45, 42,136, 8,130,120,205, 65,189, 12,161, 85,166,200, -162,105,250, 21, 43,131,217,225,189,184,223, 42,236,212,203, 53,117, 88, 40,178,132,251,246,237,219,182,120,241,226,107,182,126, -207,218, 71,107,221,207,115, 23,153, 69,214,221, 75,167,112, 32, 58, 39, 99,234,194,165,203,202,123, 7,106,187,136,235,187,187, - 59,159,251,105,193, 28,249,179,227, 91,176,107,221, 47,236,221, 27, 55, 26,223,184,113, 99,200,248,241,227,171, 20, 86, 44, 37, -128, 59, 0,250,195,134, 85, 58,137,137,137,157,138,116,194,143,121, 60,158,187, 88, 44, 70, 98, 98, 98,222,147, 39, 79,236,158, -146,201,200,200,232,244, 22, 42,224, 43, 34,235,254,253,251,104,215,174, 29, 0,224,226,197,139,104,209,162,133, 93, 98,203,104, - 52,102,215,174, 93,219, 98,221,202,201,201, 97, 0, 32, 60, 57, 25,235, 61, 61,193,225,112,112,117,225, 66,124,103, 52, 98,190, -157, 2, 62, 36, 36,132,189,126,253, 58, 98, 98, 98, 96, 50,153,208,179,103, 79,148,243,161,175, 27, 20, 20,116,250,236,217,179, -174, 82,169, 20,106,181, 26,121,121,121, 24, 54,108, 24, 6, 12, 24, 0,157, 78,135,221,187,119,227,224,193,131,144,201,100, 80, -171,213, 80,171,213,138,174, 93,187, 94,126,252,248,113,107, 0, 79, 75, 16, 90,108,167, 78,157,112,225,194, 5, 80, 20,133,198, -141, 27, 35, 51,243,159,197, 64,238,238,238,197,125, 70,253,151, 66,139,195,225,176, 17, 17, 17,139,218,180,105,131,248,248,248, -143, 26, 52,104,176,114,248,240,225,137,111,202,171,112,144, 33,164, 78, 0,116, 58, 29,116, 58, 29,188,188,188,144,155,155,139, -103,207,158, 65,167,211,193,221,205,209,110,190,176,186, 53, 44,124,110,110,110, 80,171,213,120,249,242, 37,244,122, 61, 92, 92, -236, 18, 90,190,157, 58,117,250,123,199,142, 29,206, 91,182,108,209,183,109,219,150,191,114,229, 74, 66, 46,151,195,170, 99,177, - 23, 17, 23, 47, 94,244,235,216,177, 99,173,135, 15, 31, 34, 34, 34, 2,122,189, 30, 97, 97, 97,120,242,228, 9,154, 53,107,134, -188,188,188,107, 55,110,220, 56,104,139, 97, 24,192,140, 49, 99,198,192, 44,182, 46, 92,184,128,228,228,100,200,100,178,215,132, -150,217,247,177,112,213,184,151, 45,133, 53, 11, 34, 43,203,211,119,142,142,142, 6, 0,203,202,105,125, 2, 0,196,199,199, 11, -234,213,171,167, 19, 10,133,252, 66,209,182,244, 77,248, 42, 18, 21,176,146,177, 68,120,120,120, 76,116,113,113,233,232,239,239, -143,212,212, 84, 30,159,207, 71,139, 22, 45, 12,141, 26, 53, 50,120,120,120,124,110, 43,143, 64, 32,120,200,227,241, 90, 23, 12, - 38,104,196,197,197,129,101,217,169,117,235,214,253, 50, 55, 55, 23,153,153,153,124,185, 92,110, 25, 84,215,170, 85, 11, 58,157, -238,161, 29,150,183, 57, 85,171, 86,157,193,227,241,230,103,100,100, 20, 23, 22,130,239,232,232, 40,231,241,120, 48, 24, 12,175, -136,205,162, 90,228,125, 23, 89,175, 8, 45, 43, 21,249,138,208,177,199,162,101,139,213,192,236, 96,111,189,111, 22,117, 69,127, -171,188, 83, 83, 14, 14, 14, 58,179,200,154, 63,127,254,181,242,112,236,217,177,221,211,129,201,247, 77,186,118, 20,143,239, 69, - 98,255,131,236,140,169, 11,151, 78,232,254,241,192,212,162,194,204, 22, 4,186,138,235,186,187, 57,159,251,121,241, 66,185,242, -225, 85, 36,167,164,224,232,181, 27,145, 6,224, 1,128,169, 21,105, 90, 6, 10,166, 14, 41,138,122, 87, 42,172, 37,188, 67, 70, - 70, 6, 30, 60,120, 96, 22, 89, 97, 0,208,178,101,203, 91,102,177, 21, 25, 25,137, 6, 13, 26, 20, 23,222,225, 21,100,103,103, - 23, 77, 89,211, 17,128,139,249,252, 57, 28, 14, 90,204,152, 97,183,200, 2,192, 70, 70, 70, 66,169, 84,154, 71,138,229, 21, 89, -240,240,240,248,250,236,217,179,174,155, 54,109, 82,109,221,186, 53,147, 97, 24,110, 72, 72,136, 79,195,134, 13,137,109,219,182, - 1, 0,250,247,239,143,169, 83,167,226,254,253,251,144, 72, 36,104,217,178, 37, 61,107,214, 44,183,137, 19, 39,126,158,154,154, - 58,161,216,222,145, 97,120, 66,161,240, 12,128,246, 15, 31, 62, 4,128,203, 40, 72,225,100,182, 34,148,248,153, 45,157,111,110, -110, 46, 87, 38,147, 21, 27, 26,130, 87, 48, 26,178,215, 2, 97,225,188,116,233,210,143, 63,255,252,243,254,175,190,250,234,233, - 27,114, 22,107,209,234,214,173, 27, 52, 58, 3, 18, 82,115, 64,211, 38,104, 12,105,118,243, 89, 91,180,186,117,235,134,124,173, - 30,113,201, 74,152, 76, 52,114, 53, 54,247,229,226, 15, 62,248,224,196,206,157, 59, 61,174, 92,185, 2,154,166,153, 39, 79,158, -188,236,221,187,183,124,202,148, 41,206,111,176,200,104,197,192,129, 3,251, 94,186,116, 73, 89,171, 86, 45,167,107,215,174, 33, - 45, 45, 13, 38,147, 9,237,219,183, 7,159,207,143, 91,184,112, 33, 15,192, 10, 91,239, 77,161,216, 50,220,184,113, 99,244,213, -171, 87,157,156,156,156,248, 76, 80, 16,146, 79,157,194,222,189,123, 95,251,194,186,117,235, 0, 27,163,240,155, 45, 78,215,175, - 95,175, 16,129,245, 74, 79,205,231,151,123,250,241,125,197,245,235,215, 19, 63,251,236,179, 58,114,185,124, 89,171, 86,173,218, - 57, 59, 59,147, 10,133, 34,194,219,219,251,203,144,144, 16,155,103, 23,184, 92,238,112,137, 68,242,204,100, 50, 81,121,121,121, - 80,171,213, 0, 0,147,201,196, 39, 73, 18,213,170, 85,179,244, 37,141, 27, 55,134,135,135, 7, 29, 29, 29, 61,220, 86,254,244, -244,244, 87, 86, 33, 22,131, 49, 45, 90,180,224,232,116, 58,196,196,196, 92,180,254,160, 56, 45,242,158, 32,188, 84,241,101, 62, - 41,235,147,243,246,246,142, 55, 26,141,236, 3,128,189,115,231, 14, 27, 30, 30, 94,234,166,213,106, 89, 55, 55,183,228, 98, 58, - 63, 88,115,234,116,186, 87,190,167,211,233, 88,119,119,119, 90,163,209,188,198,169,209,104, 88, 31, 31,159,196,210, 56,139,193, -176,219,183,111,175,249,238,187,239,154,216,113,129, 44,156,236,218, 32,118,203,150, 45,159,176, 44,219,166, 85, 29,191,123,253, - 66,220,217, 22,129,110, 73, 7,247,236, 24,192,178,108,155,162,155, 57,192,105,105,156, 65,238,146,218, 29,130,171,100,221, 61, -254, 7,123,118,201, 23,236,207, 61, 3,217, 6, 62,178,236, 32, 23,145,189, 57, 98,202,204,150, 30, 28, 28,252,152, 97, 24, 86, -175,215,179,193,193,193, 79, 42,130,179, 28,232, 88,130, 69,139, 77, 78, 78,102, 81,224,203, 22, 90,244,179,200,200,200,226, 62, -179,181,156,119, 89,150,101,149, 74, 37,155,151,151,199,234,116, 58,150,166,105,214, 26, 0,238,218,192,201, 26, 12, 6, 54, 43, - 43,203, 92,150,114,159,187,167,167,231,203,231,207,159,179,213,171, 87,143, 47, 52,199, 79, 84,171,213,108, 81,168,213,106,182, - 93,187,118,236,147, 39, 79,216,170, 85,171,106,159, 60,121,194,122,122,122, 62, 42,163,156,254,190,190,190,103, 92, 92, 92, 34, - 0, 4,218,241, 89,169,215,115,247,238,221, 1, 44,203,142, 98, 89, 54,188,132,109, 20,203,178, 65,255, 53,103,225,245, 77,101, - 89,150,205,207,207,103,149, 74, 37,155,148,148,196,230,231,231,179,121,121,121,236,237,219,183,217, 43, 87,174,176,247,238,221, - 99,157,156,156, 82,109,225, 52,243,233,245,122, 86,165, 82,177,105,105,105,172, 70,163, 97,213,106, 53, 27, 21, 21,197,222,188, -121,147,125,248,240, 97,113,124,175,113, 58, 59, 59,175, 75, 73, 73,201,187,124,249,114,254,218,181,107,243, 61, 60, 60, 30, 2, -240, 3, 80, 83,161, 80,164,124,241,197, 23,172, 84, 42,141, 45,231,179, 89,135,203,229,222, 94,180,104,209,245,195,135, 15,167, - 30, 60,120, 80,191,113,227,198,132,241,227,199,159,231,112, 56,183, 1,212, 41,231,243,238,230,232,232,120,249,218,181,107,166, -172,172, 44, 54, 59, 59,155, 85,169, 84,172, 90,173,102, 53, 26, 13,171,215,235, 89,163,209,200,158, 63,127,158,117,119,119,183, -158,150,252,166,148,129,245, 36,150,101,191,102, 89,150, 83,209,109,157, 21,119,171,138,226,172,136,182,142, 36, 73, 67, 97,219, -209,180, 96,183,244,253,255,170,156, 29, 58,116,248, 97,192,128, 1,108,231,206,157,217,176,176,176,215,182, 6, 13, 26,176,227, -198,141, 99, 15, 31, 62,204,254,244,211, 79, 63, 84, 64, 57, 57, 40, 88,244,178,160, 67,135, 14,198, 11, 23, 46,176,253,251,247, -103, 1,116, 42, 77,139,188,207,130,203,188,152,198, 28,222,129,176,126, 5, 0,131,193, 16,255,248,241, 99,207, 90, 38, 19, 5, - 0,171, 87,175,126,205, 50,101,141, 11, 23, 46,152, 8,130,120, 86,218,175, 27, 12,134,248,179,103,207,186,175, 90,181,138,107, -101, 2,134,201,100, 98,146,146,146,200,149, 43, 87,190,114,252,185,115,231, 76, 38,147, 41,206,206,147,220, 18, 26, 26,186,165, - 34,174,214,249,251, 49, 95,158, 56,250,151, 75,211, 38,173,178,229, 78, 78,197,142,194,118,127, 30, 4, 98,108,233, 86, 45,130, - 67,206, 95,180, 96,142,163,121, 10,242,207, 91, 41,217, 90, 29,221, 46, 58, 67,115,183,162,239,112, 94, 94, 94,140,121, 37,160, - 90,173,142,123,135, 42,223,109, 0, 97,133,193, 72,139, 78, 13,222, 6, 16, 86,104,201,178,107,229, 97, 17, 75, 15, 28, 28, 28, - 44,214,208,114, 88, 68, 89,179,133,213,124,235,222,228,132, 89,150,189, 20, 21, 21, 85,117,216,176, 97,178,173, 91,183, 62,167, -105,154, 59,114,228, 72,131,135,135, 7,239,226,197,139, 70, 0, 68,155, 54,109, 56, 41, 41, 41,108, 98, 98,162,178, 71,143, 30, -185,163, 71,143,118,190,115,231, 14,159, 97,152,178,130, 22,190,136,143,143,239, 80,142,207, 74, 69,191,126,253,158,227,205,211, -216,188,117, 78, 51,148,217, 42, 60,143, 73, 44,140, 96,206,128,142, 77,181,248, 85, 25,141, 38, 40, 85,153,118, 91,180,158,189, - 76, 44, 76, 49, 70,131,166,147, 10,249, 10, 28,226,217,172,252,178,123, 19, 14,167,229,172, 89,179,186,144, 36, 73, 94,189,122, - 85,183,120,241,226,248,244,244,244,158, 0,226, 0, 32, 43, 43,171,237,150, 45, 91,126,183, 33,148, 67, 73,120, 96, 52, 26,155, -125,243,205, 55, 19, 0,180, 4, 80,165,144,251, 98,161, 37,171,188, 17,204,211,178,179,179, 63,236,210,165,203, 41,138,162,170, - 89, 61, 71, 46, 0, 50,204,207, 5,203,178,110,169,169,169, 31,217, 66, 72, 16,196,210,183,213,160,188, 77,238, 55,193,251,178, -146,241,204,153, 51,179,123,246,236,201,241,243,243,251,214,207,207,143,204,202,202, 66, 94, 94, 30, 72,146,132,135,135, 7,130, -131,131,225,225,225,193, 60,124,248,112,193,180,105,211,202,140,201, 87,187,118,237, 0,163,209, 88,157, 36,201, 0, 0, 1, 44, -203, 6, 16, 4, 17, 0,192, 9, 0,228,114,185,188,106,213,170,156,166, 77,155,162, 73,147, 38, 56,119,238, 28,246,236,217,179, - 25,192, 9,107,107, 86, 81, 45,242, 46,224, 65, 40,216, 58,183, 65,220,111,128, 54, 4,131,115, 44,137,182,193,145,150, 56,123, - 69, 69, 86,201, 73,165,139, 49,253,117,106,223,190,189,229,129,179,161, 83,137, 41,235,225, 75, 79, 79,239, 52,124,248,240, 87, - 56,105,154,214,101,102,102,126,214,188,121,243, 95, 41,138, 18, 20,169,176,177,105,105,105,255,106,174,190,162,113,180, 58,117, -233,149,241,166,156, 82, 30, 89,253,241,145,223,144,154,150,129, 63,111,165,100,229,234,233,182, 79, 50,242,163,222, 70,249, 99, - 99, 99, 59,191,195, 74,255, 54, 74,158, 18, 44,237, 51,155,172,213, 54, 4, 36, 45, 43, 71, 29, 81, 24, 78,164, 66, 30,242,148, -148,148, 37, 51,102,204,248,112,193,130, 5,174,199,142, 29,147,155, 7, 40,125,250,244, 73,139,138,138,106, 5, 64,160,213,106, - 79, 47, 88,176,192,117,206,156, 57,206, 0,156, 1,160,107,215,174,169,169,169,169,171, 80,137, 82, 97, 52, 26, 19,130,107,215, -122,101,228,104, 30, 0, 90,255,111, 50,153, 18,236,225, 43,142,199,122,159,166,233, 82,249, 40,138,250,170, 73,147, 38,212, 87, - 95,125,149,122,236,216, 49,115, 34, 93,107,133,246,184,140,160,164,182, 64, 7, 96,113,225, 86,145, 80, 43,149,202,102,118,126, -135,174,172,141,197,182,103,246,236,255, 39, 56,112,224,192,204,254,253,251,111,113,114,114,218, 30, 16, 16, 80,203,221,221, 93, - 46, 18,137,160,211,233,114,245,122,253,163,199,143, 31, 15,154, 57,115,230, 11,155, 44, 28, 91,182, 80, 0,120, 12,195, 8, 73, -146,148, 0,144, 19, 4,161, 48, 11, 45,130, 32, 96, 48, 24, 16, 19, 19,131,239,190,251,142, 62,115,230,204, 79, 0,126,176, 99, -224,218, 8,128,171, 85, 59,238, 10, 64,143,130, 0,182,233, 4, 65,220,120,219,215,139, 96,112,174,206,109, 16, 15, 66, 81, 92, - 63, 81,122, 82,233,146, 30,184,244,244,244,102, 21,253, 16,151,196,153,158,158,238,247,174, 60, 33, 67,117,139,255,192,186,197, -175,228, 57, 52,139,176,226,246,203, 66,142,198, 52,126,197,137,251, 75,116, 38,150, 49,152,152, 17, 79,210,243, 31,252, 63,110, -128, 76,229,252,172, 44,124, 80, 81,207, 82, 5,158,107, 84,116,116,116,243,241,227,199,207, 20,139,197,141, 1, 32, 63, 63,255, -106, 82, 82,210, 92, 20,174, 42, 44,235,243, 74,148,140,140,140,140,134,239, 34,159, 94,175,255,178,121,243,230,203,105,154,254, -217,100, 50, 93,252,127,112, 43,180,149,181,241,253,197,174, 93,187, 94, 0,104, 6, 0,125,251,246,165, 0, 96,207,158, 61,118, -139,231, 97,195,134,209, 44,203, 26, 10,235,131, 26, 5,171, 11,179,204,109,170, 90,173,206, 74, 74, 74,122, 72,211,244, 67, 0, -191,195,254, 21,183,174, 4, 65, 28,102, 89,182, 91,161,112, 59,204,178,108, 55,235,247,222,182, 85,171,140, 67,202,118,134,175, +137, + 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 2, 90, 0, 0, 2,128, 8, 6, 0, 0, 0, 68,254,214,163, + 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,215, 0, 0, 13,215, 1, 66, 40,155,120, 0, 0, 10, 79,105, 67, 67, 80, 80,104,111, +116,111,115,104,111,112, 32, 73, 67, 67, 32,112,114,111,102,105,108,101, 0, 0,120,218,157, 83,103, 84, 83,233, 22, 61,247,222, +244, 66, 75,136,128,148, 75,111, 82, 21, 8, 32, 82, 66,139,128, 20,145, 38, 42, 33, 9, 16, 74,136, 33,161,217, 21, 81,193, 17, + 69, 69, 4, 27,200,160,136, 3,142,142,128,140, 21, 81, 44, 12,138, 10,216, 7,228, 33,162,142,131,163,136,138,202,251,225,123, +163,107,214,188,247,230,205,254,181,215, 62,231,172,243,157,179,207, 7,192, 8, 12,150, 72, 51, 81, 53,128, 12,169, 66, 30, 17, +224,131,199,196,198,225,228, 46, 64,129, 10, 36,112, 0, 16, 8,179,100, 33,115,253, 35, 1, 0,248,126, 60, 60, 43, 34,192, 7, +190, 0, 1,120,211, 11, 8, 0,192, 77,155,192, 48, 28,135,255, 15,234, 66,153, 92, 1,128,132, 1,192,116,145, 56, 75, 8,128, + 20, 0, 64,122,142, 66,166, 0, 64, 70, 1,128,157,152, 38, 83, 0,160, 4, 0, 96,203, 99, 98,227, 0, 80, 45, 0, 96, 39,127, +230,211, 0,128,157,248,153,123, 1, 0, 91,148, 33, 21, 1,160,145, 0, 32, 19,101,136, 68, 0,104, 59, 0,172,207, 86,138, 69, + 0, 88, 48, 0, 20,102, 75,196, 57, 0,216, 45, 0, 48, 73, 87,102, 72, 0,176,183, 0,192,206, 16, 11,178, 0, 8, 12, 0, 48, + 81,136,133, 41, 0, 4,123, 0, 96,200, 35, 35,120, 0,132,153, 0, 20, 70,242, 87, 60,241, 43,174, 16,231, 42, 0, 0,120,153, +178, 60,185, 36, 57, 69,129, 91, 8, 45,113, 7, 87, 87, 46, 30, 40,206, 73, 23, 43, 20, 54, 97, 2, 97,154, 64, 46,194,121,153, + 25, 50,129, 52, 15,224,243,204, 0, 0,160,145, 21, 17,224,131,243,253,120,206, 14,174,206,206, 54,142,182, 14, 95, 45,234,191, + 6,255, 34, 98, 98,227,254,229,207,171,112, 64, 0, 0,225,116,126,209,254, 44, 47,179, 26,128, 59, 6,128,109,254,162, 37,238, + 4,104, 94, 11,160,117,247,139,102,178, 15, 64,181, 0,160,233,218, 87,243,112,248,126, 60, 60, 69,161,144,185,217,217,229,228, +228,216, 74,196, 66, 91, 97,202, 87,125,254,103,194, 95,192, 87,253,108,249,126, 60,252,247,245,224,190,226, 36,129, 50, 93,129, + 71, 4,248,224,194,204,244, 76,165, 28,207,146, 9,132, 98,220,230,143, 71,252,183, 11,255,252, 29,211, 34,196, 73, 98,185, 88, + 42, 20,227, 81, 18,113,142, 68,154,140,243, 50,165, 34,137, 66,146, 41,197, 37,210,255,100,226,223, 44,251, 3, 62,223, 53, 0, +176,106, 62, 1,123,145, 45,168, 93, 99, 3,246, 75, 39, 16, 88,116,192,226,247, 0, 0,242,187,111,193,212, 40, 8, 3,128,104, +131,225,207,119,255,239, 63,253, 71,160, 37, 0,128,102, 73,146,113, 0, 0, 94, 68, 36, 46, 84,202,179, 63,199, 8, 0, 0, 68, +160,129, 42,176, 65, 27,244,193, 24, 44,192, 6, 28,193, 5,220,193, 11,252, 96, 54,132, 66, 36,196,194, 66, 16, 66, 10,100,128, + 28,114, 96, 41,172,130, 66, 40,134,205,176, 29, 42, 96, 47,212, 64, 29, 52,192, 81,104,134,147,112, 14, 46,194, 85,184, 14, 61, +112, 15,250, 97, 8,158,193, 40,188,129, 9, 4, 65,200, 8, 19, 97, 33,218,136, 1, 98,138, 88, 35,142, 8, 23,153,133,248, 33, +193, 72, 4, 18,139, 36, 32,201,136, 20, 81, 34, 75,145, 53, 72, 49, 82,138, 84, 32, 85, 72, 29,242, 61,114, 2, 57,135, 92, 70, +186,145, 59,200, 0, 50,130,252,134,188, 71, 49,148,129,178, 81, 61,212, 12,181, 67,185,168, 55, 26,132, 70,162, 11,208,100,116, + 49,154,143, 22,160,155,208,114,180, 26, 61,140, 54,161,231,208,171,104, 15,218,143, 62, 67,199, 48,192,232, 24, 7, 51,196,108, + 48, 46,198,195, 66,177, 56, 44, 9,147, 99,203,177, 34,172, 12,171,198, 26,176, 86,172, 3,187,137,245, 99,207,177,119, 4, 18, +129, 69,192, 9, 54, 4,119, 66, 32, 97, 30, 65, 72, 88, 76, 88, 78,216, 72,168, 32, 28, 36, 52, 17,218, 9, 55, 9, 3,132, 81, +194, 39, 34,147,168, 75,180, 38,186, 17,249,196, 24, 98, 50, 49,135, 88, 72, 44, 35,214, 18,143, 19, 47, 16,123,136, 67,196, 55, + 36, 18,137, 67, 50, 39,185,144, 2, 73,177,164, 84,210, 18,210, 70,210,110, 82, 35,233, 44,169,155, 52, 72, 26, 35,147,201,218, +100,107,178, 7, 57,148, 44, 32, 43,200,133,228,157,228,195,228, 51,228, 27,228, 33,242, 91, 10,157, 98, 64,113,164,248, 83,226, + 40, 82,202,106, 74, 25,229, 16,229, 52,229, 6,101,152, 50, 65, 85,163,154, 82,221,168,161, 84, 17, 53,143, 90, 66,173,161,182, + 82,175, 81,135,168, 19, 52,117,154, 57,205,131, 22, 73, 75,165,173,162,149,211, 26,104, 23,104,247,105,175,232,116,186, 17,221, +149, 30, 78,151,208, 87,210,203,233, 71,232,151,232, 3,244,119, 12, 13,134, 21,131,199,136,103, 40, 25,155, 24, 7, 24,103, 25, +119, 24,175,152, 76,166, 25,211,139, 25,199, 84, 48, 55, 49,235,152,231,153, 15,153,111, 85, 88, 42,182, 42,124, 21,145,202, 10, +149, 74,149, 38,149, 27, 42, 47, 84,169,170,166,170,222,170, 11, 85,243, 85,203, 84,143,169, 94, 83,125,174, 70, 85, 51, 83,227, +169, 9,212,150,171, 85,170,157, 80,235, 83, 27, 83,103,169, 59,168,135,170,103,168,111, 84, 63,164,126, 89,253,137, 6, 89,195, + 76,195, 79, 67,164, 81,160,177, 95,227,188,198, 32, 11, 99, 25,179,120, 44, 33,107, 13,171,134,117,129, 53,196, 38,177,205,217, +124,118, 42,187,152,253, 29,187,139, 61,170,169,161, 57, 67, 51, 74, 51, 87,179, 82,243,148,102, 63, 7,227,152,113,248,156,116, + 78, 9,231, 40,167,151,243,126,138,222, 20,239, 41,226, 41, 27,166, 52, 76,185, 49,101, 92,107,170,150,151,150, 88,171, 72,171, + 81,171, 71,235,189, 54,174,237,167,157,166,189, 69,187, 89,251,129, 14, 65,199, 74, 39, 92, 39, 71,103,143,206, 5,157,231, 83, +217, 83,221,167, 10,167, 22, 77, 61, 58,245,174, 46,170,107,165, 27,161,187, 68,119,191,110,167,238,152,158,190, 94,128,158, 76, +111,167,222,121,189,231,250, 28,125, 47,253, 84,253,109,250,167,245, 71, 12, 88, 6,179, 12, 36, 6,219, 12,206, 24, 60,197, 53, +113,111, 60, 29, 47,199,219,241, 81, 67, 93,195, 64, 67,165, 97,149, 97,151,225,132,145,185,209, 60,163,213, 70,141, 70, 15,140, +105,198, 92,227, 36,227,109,198,109,198,163, 38, 6, 38, 33, 38, 75, 77,234, 77,238,154, 82, 77,185,166, 41,166, 59, 76, 59, 76, +199,205,204,205,162,205,214,153, 53,155, 61, 49,215, 50,231,155,231,155,215,155,223,183, 96, 90,120, 90, 44,182,168,182,184,101, + 73,178,228, 90,166, 89,238,182,188,110,133, 90, 57, 89,165, 88, 85, 90, 93,179, 70,173,157,173, 37,214,187,173,187,167, 17,167, +185, 78,147, 78,171,158,214,103,195,176,241,182,201,182,169,183, 25,176,229,216, 6,219,174,182,109,182,125, 97,103, 98, 23,103, +183,197,174,195,238,147,189,147,125,186,125,141,253, 61, 7, 13,135,217, 14,171, 29, 90, 29,126,115,180,114, 20, 58, 86, 58,222, +154,206,156,238, 63,125,197,244,150,233, 47,103, 88,207, 16,207,216, 51,227,182, 19,203, 41,196,105,157, 83,155,211, 71,103, 23, +103,185,115,131,243,136,139,137, 75,130,203, 46,151, 62, 46,155, 27,198,221,200,189,228, 74,116,245,113, 93,225,122,210,245,157, +155,179,155,194,237,168,219,175,238, 54,238,105,238,135,220,159,204, 52,159, 41,158, 89, 51,115,208,195,200, 67,224, 81,229,209, + 63, 11,159,149, 48,107,223,172,126, 79, 67, 79,129,103,181,231, 35, 47, 99, 47,145, 87,173,215,176,183,165,119,170,247, 97,239, + 23, 62,246, 62,114,159,227, 62,227, 60, 55,222, 50,222, 89, 95,204, 55,192,183,200,183,203, 79,195,111,158, 95,133,223, 67,127, + 35,255,100,255,122,255,209, 0,167,128, 37, 1,103, 3,137,129, 65,129, 91, 2,251,248,122,124, 33,191,142, 63, 58,219,101,246, +178,217,237, 65,140,160,185, 65, 21, 65,143,130,173,130,229,193,173, 33,104,200,236,144,173, 33,247,231,152,206,145,206,105, 14, +133, 80,126,232,214,208, 7, 97,230, 97,139,195,126, 12, 39,133,135,133, 87,134, 63,142,112,136, 88, 26,209, 49,151, 53,119,209, +220, 67,115,223, 68,250, 68,150, 68,222,155,103, 49, 79, 57,175, 45, 74, 53, 42, 62,170, 46,106, 60,218, 55,186, 52,186, 63,198, + 46,102, 89,204,213, 88,157, 88, 73,108, 75, 28, 57, 46, 42,174, 54,110,108,190,223,252,237,243,135,226,157,226, 11,227,123, 23, +152, 47,200, 93,112,121,161,206,194,244,133,167, 22,169, 46, 18, 44, 58,150, 64, 76,136, 78, 56,148,240, 65, 16, 42,168, 22,140, + 37,242, 19,119, 37,142, 10,121,194, 29,194,103, 34, 47,209, 54,209,136,216, 67, 92, 42, 30, 78,242, 72, 42, 77,122,146,236,145, +188, 53,121, 36,197, 51,165, 44,229,185,132, 39,169,144,188, 76, 13, 76,221,155, 58,158, 22,154,118, 32,109, 50, 61, 58,189, 49, +131,146,145,144,113, 66,170, 33, 77,147,182,103,234,103,230,102,118,203,172,101,133,178,254,197,110,139,183, 47, 30,149, 7,201, +107,179,144,172, 5, 89, 45, 10,182, 66,166,232, 84, 90, 40,215, 42, 7,178,103,101, 87,102,191,205,137,202, 57,150,171,158, 43, +205,237,204,179,202,219,144, 55,156,239,159,255,237, 18,194, 18,225,146,182,165,134, 75, 87, 45, 29, 88,230,189,172,106, 57,178, + 60,113,121,219, 10,227, 21, 5, 43,134, 86, 6,172, 60,184,138,182, 42,109,213, 79,171,237, 87,151,174,126,189, 38,122, 77,107, +129, 94,193,202,130,193,181, 1,107,235, 11, 85, 10,229,133,125,235,220,215,237, 93, 79, 88, 47, 89,223,181, 97,250,134,157, 27, + 62, 21,137,138,174, 20,219, 23,151, 21,127,216, 40,220,120,229, 27,135,111,202,191,153,220,148,180,169,171,196,185,100,207,102, +210,102,233,230,222, 45,158, 91, 14,150,170,151,230,151, 14,110, 13,217,218,180, 13,223, 86,180,237,245,246, 69,219, 47,151,205, + 40,219,187,131,182, 67,185,163,191, 60,184,188,101,167,201,206,205, 59, 63, 84,164, 84,244, 84,250, 84, 54,238,210,221,181, 97, +215,248,110,209,238, 27,123,188,246, 52,236,213,219, 91,188,247,253, 62,201,190,219, 85, 1, 85, 77,213,102,213,101,251, 73,251, +179,247, 63,174,137,170,233,248,150,251,109, 93,173, 78,109,113,237,199, 3,210, 3,253, 7, 35, 14,182,215,185,212,213, 29,210, + 61, 84, 82,143,214, 43,235, 71, 14,199, 31,190,254,157,239,119, 45, 13, 54, 13, 85,141,156,198,226, 35,112, 68,121,228,233,247, + 9,223,247, 30, 13, 58,218,118,140,123,172,225, 7,211, 31,118, 29,103, 29, 47,106, 66,154,242,154, 70,155, 83,154,251, 91, 98, + 91,186, 79,204, 62,209,214,234,222,122,252, 71,219, 31, 15,156, 52, 60, 89,121, 74,243, 84,201,105,218,233,130,211,147,103,242, +207,140,157,149,157,125,126, 46,249,220, 96,219,162,182,123,231, 99,206,223,106, 15,111,239,186, 16,116,225,210, 69,255,139,231, + 59,188, 59,206, 92,242,184,116,242,178,219,229, 19, 87,184, 87,154,175, 58, 95,109,234,116,234, 60,254,147,211, 79,199,187,156, +187,154,174,185, 92,107,185,238,122,189,181,123,102,247,233, 27,158, 55,206,221,244,189,121,241, 22,255,214,213,158, 57, 61,221, +189,243,122,111,247,197,247,245,223, 22,221,126,114, 39,253,206,203,187,217,119, 39,238,173,188, 79,188, 95,244, 64,237, 65,217, + 67,221,135,213, 63, 91,254,220,216,239,220,127,106,192,119,160,243,209,220, 71,247, 6,133,131,207,254,145,245,143, 15, 67, 5, +143,153,143,203,134, 13,134,235,158, 56, 62, 57, 57,226, 63,114,253,233,252,167, 67,207,100,207, 38,158, 23,254,162,254,203,174, + 23, 22, 47,126,248,213,235,215,206,209,152,209,161,151,242,151,147,191,109,124,165,253,234,192,235, 25,175,219,198,194,198, 30, +190,201,120, 51, 49, 94,244, 86,251,237,193,119,220,119, 29,239,163,223, 15, 79,228,124, 32,127, 40,255,104,249,177,245, 83,208, +167,251,147, 25,147,147,255, 4, 3,152,243,252, 99, 51, 45,219, 0, 0, 0, 32, 99, 72, 82, 77, 0, 0,122, 37, 0, 0,128,131, + 0, 0,249,255, 0, 0,128,233, 0, 0,117, 48, 0, 0,234, 96, 0, 0, 58,152, 0, 0, 23,111,146, 95,197, 70, 0, 3, 40, 76, + 73, 68, 65, 84,120,218,236, 93,119,120, 20,197, 3,125,187,183, 87,114,119,201,165, 55, 18, 72,161, 67, 0,105, 10, 72,239, 66, + 40, 22, 4, 17, 69,108, 63,105, 22, 4, 65, 17,165,131, 34, 85, 69,196, 6, 40,210, 68, 16, 80,138, 72,239, 69,122,135, 0,233, + 61,151,235,109,231,247, 71,110,207,203,113, 45, 16, 80, 96,222,247,237,119,183,237,237,204,206,236,236,219, 55,141, 33,132,128, +130,130,130,130,130,130,130,130,162,242,193,210, 91, 64, 65, 65, 65, 65, 65, 65, 65,241, 31,193,134, 13, 27, 42, 98,129,117,246, +151,211,190,180,251,175,115,222,197,184,147, 74,228,108,103,231,252,248, 62, 9,103,187,255, 42,167, 16,223, 10,240,118,174, 72, + 62,170,172,251,233, 20, 78, 82,217,225,188, 91,156,149,245, 28,185, 9, 39,185, 11,233,254,241,125, 18,206,118,255, 53, 78,215, +252,227, 39,111,133, 56,253,204, 83, 21, 13, 39,169,236,112,222, 45,206, 59,125,142,188,132,147,220,105, 94,242,144,246, 31,227, + 33, 1, 33, 4,220, 93, 20, 89,126, 35, 53, 53,149,113,226,103,254,171,156,206,247, 65,224,175,204,176, 86, 34,118, 84, 54,167, +203,253,172, 44,124,156,154,154,202,108,216,176, 97, 39,128,118,149, 25,247,202, 72,119,151,184, 86, 10,239,109,136,172, 10,113, + 86, 86,190,191,219,156,149,245, 44,185,114, 86, 70,190,119,151,238,119, 49,141, 42, 43,156,149,242, 44,221,141, 60,239, 38,255, +220, 49,175, 43,103,101, 60, 75,174,156,149,145,239,239, 5,103,101, 60, 75,238, 56, 43, 35,223,123, 74,251,135,205,160, 98,111, +231,166,221, 69,167,172,253,127, 89, 16,221, 45,177, 89, 1, 7,230, 95,231,172,228, 52,250,216,206, 89,153, 95, 55,237, 43, 43, +141,238, 70,126,119,230,172, 44,126, 87,158,202, 72, 39,119,156,119, 26, 94, 15,225,172,244,184,223,105,190,191, 87,156,149,156, + 70,149,242, 44,185,112,182,175,228,143,129,246, 78,235, 31, 87, 38,103,101, 61, 75,110,194,121,199,233,228,142,243, 78,195,235, + 33,156,149, 30,247,202,120,135,220, 45,222, 7, 26,119,171,250,172,178, 57, 43,200,253, 64,113, 86,176,122,166,243, 93, 72,251, +127, 53,156,149,201,233, 26,198,202,172,238,185,155,225,172, 76,206, 10,132,245,129,227,188,223,210,253,191,120, 63, 61,241,221, + 73,181,148, 39,119,244,110,132,179, 50, 57,253,228,126, 32, 56,239, 32,237, 31, 40, 84,184,234,240, 94, 8,184, 74,254, 50, 65, + 37, 59, 48,119, 83,184, 86,102, 56,219,223, 13,135,240, 46,160,210,195,105,255, 82,254,232, 46,196,253,126,185,167,244, 89,162, +207,210,127,238, 89,114,201,147,237, 43,209, 41,170, 84,231,217,149,179, 50,174,225,204, 81, 89,121,244,110,199,189, 50,159,165, +187,145,246, 20,119,224, 66, 80, 78,202, 73, 57, 41, 39,229,164,156,148,243,161,229,124,224, 64, 8,161,195, 59, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,220, 71,240,218, 70,171, 74,149, 42, 27, 20, 10, 69, 13, 79,251,181, 90,109, + 86, 86, 86, 86, 7,122, 27,255, 61,208, 52,162,184,143,192,226,159, 94,206, 60, 0, 98, 95, 40, 40, 40, 40, 30,104,120, 20, 90, + 50,153, 44,249,220,185,115,181,120,158,135,205,102,131,213,106,117,252,154, 76, 38,180,109,219,182,194, 13,233,163,163,163,119, +137, 68,162,196,138,156, 99,179,217,110,228,228,228,180,246,114,200, 62, 0,201, 12,243, 79,155, 64,225,191,167, 95, 0,153, 22, +139,165,137, 55, 78,134, 97,146, 93,249, 60,112, 9,255,189,114, 6, 7, 7, 31,225, 56, 46,222, 29,151,167,255, 60,207, 95,205, +203,203,107,117, 47,211,232, 97, 70,116,116,244, 46,142,227, 42,156, 63,179,179,179, 61,230,207,216,216,216,227, 44,203, 86,169, + 0,165,136,231,249, 11, 89, 89, 89,173,189, 8,145,125, 0,146,189,145,184,230, 39,134, 97,210,109, 54, 91, 51, 95,207,145, 55, + 46, 55,121,212, 23,167, 67,100,113, 28, 55, 35, 42, 42,234, 13,157, 78,103, 0, 64, 68, 34, 17,113, 10, 27, 0,192,106,181,230, + 21, 23, 23, 55,160, 57,145,130,130,226,161, 16, 90, 60,207,179, 70,163, 17, 23, 47, 94,132,135,249, 16,109,183,113,189, 90, 71, +255,220, 26, 21, 20, 21, 13,171,217, 12,101, 68,164,131, 59,231,236,105, 88, 45,102, 88, 77, 38, 84,107,222, 66, 8, 3,234,213, +171, 39,242,193, 25, 63,115,230,204,168,160,160, 32, 24, 12, 6, 24, 12, 6, 24,141, 70, 24, 12, 6,152, 76, 38,152, 76, 38,152, +205,102,152,205,102, 88,173, 86, 24,141, 70,108,219,182,205,102,177, 88,188,114, 78,157, 58, 53, 74,165, 82, 57,248,132, 69,224, + 20,120, 45, 22, 11, 12, 6, 3,182,111,223,238,149,147,227,184,248,204,204,204, 40,137, 68, 2, 66, 8,120,158, 7, 33,164,220, +226,138,234,213,171,155,189, 5,242, 46,165,209,195,140, 90, 83,151,111,140, 10,150,203, 96,229,121,164, 54,170,238,216,113,245, +155, 85, 32, 86, 27,120,171, 21, 53,135, 15,114,108,175, 91,183,174,215,252, 73, 8, 73,152,186,124, 99,136,191,156, 5, 5, 5, +250, 58,117,234,100,162,108,112, 63, 79, 66, 43, 94,175,215, 71,217,249,111, 17, 68, 44,203,150, 91, 54,111,222,140,212,212, 84, + 95,113,143,127,251,237,183,163, 44, 22, 11, 76, 38, 19,140, 70, 35, 44, 22, 11,172, 86,171, 99,177,217,108,142,197,100, 50,225, +224,193,131,254, 58, 89, 51,187,116,233, 50,100,227,198,141,202, 95,127,253, 85,153,152,152, 8,137, 68, 2,145, 72, 4,145, 72, + 4,150,101,193,113, 28, 30,123,236, 49,134,102, 65, 10, 10,138,135, 70,104, 25,141,198,107,141, 27, 55, 38,246,255,113, 50,153, + 76,226,242,149, 91,165,102,205,154, 23, 92,207,243, 85, 93, 21, 20, 21,141,113, 85,195, 0, 0, 19,174, 23, 56, 94, 16,159,180, +122,196,113,204,164,140, 18, 0,128, 92, 46, 7,227,252, 25,237, 1, 74,165, 18, 93,186,116,129, 84, 42, 69,179,102,205, 32, 22, +139,221, 46, 18,137, 4, 98,177,216,231, 77, 97, 24, 6,129,129,129,152, 56,113,162, 32,146,160, 12,144, 97, 68,171,102, 8, 0, +193,215,167, 47,193,196, 19,112, 28,231, 88,252,225,148, 72, 36, 56,117,234, 20, 56,142,131, 72, 36,114,252, 10,255,215,175, 95, +143,103,158,121, 6, 28,199, 65, 46,151, 3, 62, 70, 14,118, 78, 35,147,201, 20, 43,149, 74,205, 0, 4,113, 38, 97, 24, 38,230, +118,210,232, 97, 70,176, 92,134, 23, 23,174, 5, 0,220,156, 51,220,145,118, 7,135, 78,112, 28,147,240,218,179, 96, 24, 6, 98, +177, 24, 44,203, 86, 26,103, 97, 97,161,126,192,128, 1,123,130,130,130, 54,171,213,106,248, 16,112,184,121,243, 38, 56,142,243, +152,223, 89,150,197,236,217,179,113,249,242,101,191,226,110, 48, 24,176,120,241, 98,216,108,182,114,188,194,127,215,109,126,138, +172, 41, 93,187,118, 29,180,113,227,198, 80,134, 97,240,249,231,159, 67, 34,145,160, 71,143, 30, 8, 15, 15,199,150, 45, 91, 32, +145, 72, 48,102,204, 24,154,249, 40, 40, 40,188,149,121, 98, 0,143, 0,136,180,155, 8,165, 0, 66,156, 14,201,179,255, 70, 10, +235, 12,195, 28,118,195,211,220,126, 76, 30,195, 48,135,157,214, 77, 0,164,110,182, 23, 0,144,219, 23, 35,202,220,255, 20,167, +235, 8,231,193,211,117, 57,160,108,254, 33, 0, 59, 0,180, 79, 77, 77,221, 9, 0,217,217,217, 79,100,103,103, 3, 0,146,147, +147,207, 93,184,112,161,142,160,121,236,213, 83, 18,171,213, 90, 75,168,170, 18,220,162,206,157, 59,123,253,194,183,154,205,183, + 8, 16,119, 90,202, 93,117,133, 39, 1, 99, 54,155,241,236,179,207, 2,128,199,151,142,243,226,135,118,131,201,100, 2,199,113, +168, 93, 53, 18, 31,118,107,140, 71,137, 5, 90, 13, 3,107,137, 22,125, 2, 45, 56, 87,175, 9, 22,221,200,195,117,181, 6, 28, +199,249,197,201,243,188, 71,145, 37, 18,137,176,112,225, 66, 12, 24, 48, 0, 34,145,200, 47, 62,231, 52, 74, 74, 74,218,120,225, +194,133,112,134, 97,140,246, 52,146, 89,173, 86,149,213,106, 13,183,217,108,225, 21, 73,163,135, 25, 86,158,119,155, 15, 61,229, + 89,127,210,201, 31,206,194,194, 66,125,106,106,234, 1,153, 76,182, 36, 58, 58, 58, 51, 61, 61,221,167,208,114, 21, 63,174, 31, + 21,159,125,246, 25,230,207,159,143, 14, 29, 58,248, 21, 78,163,209, 8,134, 97,176,104,209,162, 91,246, 77,158, 60,249,150,235, +249,224,100, 0,176, 85,170, 84, 25,250,199, 31,127,168,132, 99, 35, 34, 34, 32, 22,139,209,160, 65, 3, 4, 5, 5, 97,207,158, + 61,176,217,108,126, 63,151, 20, 20, 20, 15, 46,220,105, 17, 39,180, 29, 55,110, 92,179, 25, 51,102, 76,107,217,178,229,207,251, +246,237, 91,206, 48,204, 6,167, 50, 49,213, 94,190,110, 16,214, 9, 33,205,157, 69,143, 93,172, 69, 50, 12,179, 65, 56,222,121, + 93,248, 37,132,116, 6, 32, 21,214,199,141, 27,151, 50, 99,198,140,105, 99,199,142,125,127,250,244,233,146,113,227,198, 53,156, + 49, 99,198, 52,225, 58,238,194,225,206,209,242, 58,247,148, 80, 69,117,254,252,121, 79, 85, 84,206, 47, 0,175,165,165, 50, 34, +210,225,100, 77, 74, 8,119,108,159,152, 94,236,120,129, 45,104, 90, 3, 74,165, 18,221, 38,125,234,151, 83,100, 50,153,144,155, +155,235,112, 25,124, 45,254,114, 42,228, 1,216,246,118, 3,220, 44,144,226,227,253,133,216,248,247,101,136,197, 98,116,175,215, + 0, 79, 72,130, 48, 62, 65,138,183, 47,165,193, 66,252,107,211, 75, 8,113, 43,176,132,255, 66, 21,138,191, 66,203, 37,141,110, + 26, 12,134,130,139, 23, 47,234,249,178, 23,187,156, 16, 18,202, 48, 76,169,221,229,138,245, 55,141, 30,102,164, 54,170,238,112, +157, 14, 6,117,114,108,127, 70,123,202,145, 38,163, 22,126, 2, 0,232,208,228, 49,159,207,131, 63,156, 5, 5, 5,250,214,157, +218,239,180,233, 77, 63, 12, 26, 52,232,218, 95,127,253, 37,247, 39,172,238,132,150,224,218, 10, 34,139,227, 56,152, 76, 38,191, +226,110, 50,153, 60, 62, 31, 18,137,228,118, 28, 45,104,181, 90,211,186,117,235,176, 96,193, 2,132,135,135,163,107,215,174,136, +141,141,197,170, 85,171, 64, 8,193,240,225,195, 33,151,203, 5,247,154,102, 64, 10,138,135, 27,222,180,136,108,198,140, 25,211, + 92,133,140,243,186,179,128,114, 17, 83,206, 98, 45,197,199,251,127,131,171,120, 18,174,203, 48,204,134,233,211,167,167,250, 8, + 71,158, 39,161,229,117, 72,124,163,209,120,173, 81,163, 70,126,169, 9,157, 78,151,237, 75,108,184,251,170,119,118, 9, 2, 3, + 3,161, 84, 5,130,245,179,220,181, 88, 44, 14,161,178,117,235, 86,200,229,114,244,232,209,227,142, 28, 45,179,217, 12,169, 68, + 12, 54, 34, 26, 47,206,249, 11, 5,165,122,199, 11,102,199,213,107, 56,150,147,139,183, 91,118,130, 82,158, 11,141,201,228,151, +243,198,243,252, 45, 34,139,227, 56, 60,251,236,179, 14, 55,193,185,221, 10,188, 84, 29,134,135,135, 31,225, 56, 46,222, 41,141, + 2,146,147,147,129,127,218,245, 48, 60,207,107, 66, 66, 66,126, 1, 80,133, 16, 18, 15, 32,200,159, 52,162,112,159, 63, 93,183, +243, 46, 78,213,237,112, 22, 20, 20,232, 83, 83, 83, 15,216,244,166, 31, 50, 50, 50, 14, 0, 8,120,244,209, 71, 43, 44,180, 4, +129, 37, 22,139, 49,123,246,108,204,159, 63,223,177,223, 95,161,101,181, 90,203, 9,168, 75,151, 46,149,187,150,171,176,243, 81, +109, 74, 80,214,187,144, 79, 78, 78,118,156, 19, 19, 19,131,144,144, 16,240, 60, 15,158,231, 17, 16, 16, 0,185, 92, 14,137, 68, + 66, 51, 29, 5, 5,133, 55, 45,162, 31, 59,118,236,251, 12,195,108,176, 59, 75,167,189, 8, 42,119,218,163,185,139, 88,203,243, +112, 92,170, 59,177,229,252, 95,192,184,113,227, 82, 92,195,225,174,186,210, 81,170,186, 12,187, 95, 14,206, 85, 84,149,245, 18, +243,246, 34, 11, 12, 81, 65,174, 84, 66, 36, 98,193, 48, 12,241,197,101, 54,155, 29, 5,255, 27,111,188,225,181,221,138,191,237, +169,204,102, 51, 88, 78,132,172,152, 36,216,216,221,142,115,133,133,229,196,184, 30, 83, 7,162,243,199, 33,246,243,133,235,234, +104, 13, 31, 62, 28,139, 23, 47, 6,203,178,142,123,194,113, 28,106,214,172,137,107,215,174,121,229,226, 56, 46,254,250,245,235, + 81,206,247, 81, 16,177,132, 16,216,108, 54, 84,175, 94,221,112,241,226,197, 55,233,163,123,103, 34,203,211,118,155,141,247,219, +133,113,119, 92, 65, 65,129,190, 95,191,126, 59, 75, 74, 74,126,168, 95,191,254, 37,148, 31, 2,193, 39, 31,199,113,229, 4,150, + 32,178,230,205,155, 87, 78, 20, 89, 44, 22,191, 62, 4, 44, 22,203, 45,130,103,214,172, 89,229,126, 1,160, 85,171, 86,126, 57, +195, 0, 8,203,178, 68, 34,145,160, 75,151, 46,104,216,176, 33,126,253,245, 87,240, 60,143, 97,195,134, 65, 46,151, 99,238,220, +185,176, 90,173,152, 57,115, 38,117,180, 40, 40, 40,188,105, 17,227,244,233,211, 79, 79,159, 62,221,225, 44,185, 58, 90, 30,222, +187, 61,237,162, 42, 82, 16,105, 0,140,238, 4,145, 59,151,204, 85,128, 57,111,155, 49, 99,198, 52,215,112,184, 86, 87,150, 19, + 90,247, 10,217,103, 78,225,211,199, 27, 3, 40, 95, 93,184,240,177, 58, 80, 6, 42,161, 12, 10, 68,191,245,187, 1,192, 94,232, +143,245,203,209, 18,132, 86, 65, 65,129, 87,145, 85, 17, 71,139,149,114, 88, 29, 95, 4, 34, 21,131, 51, 89,202, 9, 45, 17, 39, +198,205,240, 36,176, 98, 9, 56,155,213, 47, 78, 66,200, 45, 85,133,131, 7, 15, 6,195, 48,142, 30, 98,141, 26, 53,114,230, 98, +124,189, 28, 71,135,149,181,193,115,173,142,157,153,111,160, 79,236,237,228,207, 35,223,224,220,154,161, 0,128,214, 90,173, 35, + 45,166, 54,250,167,239,192,156, 83, 59, 29,238,227, 36,188,123, 91,156, 5, 5, 5,250, 71,235,166, 28,144,132, 5,255,112,227, +198,141, 3, 0,216,254,253,251,135, 52,106,212,200,175,103, 82,232, 92,225, 42,178,156,157, 44,225,215, 71, 15, 91, 39,225,104, +243, 75, 64, 9,213,136,126,228,121, 34,228,109,149, 74,133,192,192, 64, 71,143,219,128,128, 0, 40, 20, 10, 71,251, 78, 63,133, + 27, 5, 5,197,195,139, 80, 65,232,216,197, 82, 57,167,201,222,182, 42,213,121,221,157,227,101,119,160,118,249, 40, 95, 55,218, + 5,154, 91, 8,206,154,203, 57, 27, 60,137, 52, 78, 80,144,206,191, 49, 49, 49,191, 7, 6, 6, 38,249, 27,251,138,244, 98,179, + 89,204,183, 56, 91, 12,195, 32, 48, 40, 16,242, 64, 37,228, 65,129, 30, 93, 47,111, 66, 75,112,138,132,151,206,146, 37, 75, 16, + 24, 24,136,151, 94,122,169,194,109,180, 28, 66, 75,194, 98,139,108, 59, 68, 82,174,156,200,226, 56, 14, 34,177, 24,217,129,177, + 96,197, 98,112, 86,255, 92,178,146,146, 18,112, 28,135, 15, 63,252,208,241, 5,239, 44,178, 42, 18,103,111, 96, 25, 70,112,183, +100, 53,106,212,120,151, 97,152, 4, 0,137, 90,173, 86,150,149,149,213,145, 62,175, 94,148,129,205,114,139, 11,229,201,125,189, + 93, 78,193,201,146,132, 5,255, 80,167, 78, 29,135,147,165, 80, 40,132,222,166,190,211,152,101,221,138, 44,215, 30,130, 28,199, +149,229,101, 31,189, 35,157, 29,173,233,211,167, 59,120,157,157, 44, 1, 21,121,142,132,176,238,220,185, 19,199,142, 29,195, 27, +111,188, 1,185, 92,142,249,243,231,195,106,181, 98,242,228,201,144,203,229,144, 74,165, 52,243, 81, 80, 80, 55,171,156, 22,113, + 65,158, 75, 59, 40,198, 69,212,228,185, 19, 88,206,213,132,194,127,134, 97, 44,110,120, 77, 46, 85,138,174,219,133,223,130,233, +211,167,255, 37, 56, 89, 78,219,203,133,195,167,163, 37,147,201,146, 46, 94,188,232, 24, 8,211,219,175,201,100, 66,135, 14, 29, +252,118,198,132, 94,135, 28, 39, 42, 39, 44, 20, 65,129, 80,168,130, 32, 15, 12,116, 21, 28,140,175, 66, 92,248, 34,118, 22, 90, + 31,125,244, 17, 56,142,195,226,197,139, 1, 0,239,190,251,174,223,109,180, 4, 78,216, 24,164,147, 43,104, 60,231, 25,152,126, +180, 32,103,239, 9,112, 28,135,168, 22, 79,128,127,244, 25,232,228,129,224,108, 86,191,123, 29, 22, 22, 22,226,218,181,107, 16, +137, 68,120,231,157,119,202,141,117,228,218,147,109,235,214,173, 62,227,238,206,201,250,232, 70,161,131, 71, 46,151,179, 39, 78, +156, 72,226,121, 62, 89,175,215,215,104,213,170, 21, 79, 31,101, 31,162,136,183,250, 37,170,252,205,159,174,156, 66,155,172,146, +146,146, 31,110,220,184,113, 16, 0, 59,104,208,160, 16,133, 66,129,111,191,253, 86, 7, 64,186,106,213, 42,185, 47, 81, 36,228, + 27, 95, 34, 75, 44, 22,151,229,101,127,226, 78,202, 15, 89,226,171, 97,188, 63,121, 94, 8, 43,195, 48,176,217,108,144,203,229, +229,156,172,128,128, 0,200,100, 50,154,241, 40, 40, 40,124,149, 37,135,253, 46,199, 9,105,238, 36,170, 14,223, 14,111, 69,174, +231, 11,156, 39,161, 97, 52, 26,113,246,236, 89,127,121,252, 30, 24,179,106,179,199, 48, 41,163, 4, 12,195,224,235, 86,245,161, + 84, 5, 66,161, 84,226,233, 95,119, 58, 10,238, 83,211,222,133, 76, 25,136, 42,109,186,250, 85,144, 11, 85,135,206, 66,171,184, +184, 24, 98,177, 24, 83,166, 76, 1,203,178,152, 57,115, 38,226,226,226,144,149,149,133, 85,171, 86,249,229,104,137,108, 34,196, +190, 80, 23,138,193,193, 80,189,208, 22,161, 93, 62, 66,134,137,195, 62,131, 2,109, 13,103, 32,221, 50, 15, 38,222,230,119, 15, + 44,171,213,138,157, 59,119,186, 54,120,119,180,169,178, 90,173,176, 88, 44, 48,155,205,152, 57,115,166, 63, 61, 60,111, 73, 55, +225, 30,218, 7, 65, 21, 93,184,112, 33,146, 16, 18, 6, 32, 24, 64, 62,125, 92,189, 35,182,197,112, 68, 54,251, 31, 0, 96,253, +244,151, 29,219, 63, 60,245, 79,254,156,253, 99,217, 4, 0,117, 18,187, 86,136,179,160,160, 64,223,189, 67,171, 93, 6, 94,252, +125,131, 6, 13,202, 57, 89, 1, 1, 1,140,125,221, 47,187,140,101, 89,136, 68,162, 91,170, 11, 61,137, 45,127,218,104, 89,173, + 86,199, 64,162,222,218, 51,222,142,163,245,242,203, 47, 35, 54, 54,214,225,100, 77,154, 52, 9,114,185, 28,227,198,141,131,197, + 98,193,188,121,243,104,230,163,160,160,184,231,162,236, 94,192,109, 73,106, 48, 24,210, 26, 54,108, 8, 15,251,226, 2, 2, 2, +196, 46,145,170, 82,179,102,205, 11,110,170, 16, 59, 3,216,230,174, 80,103, 24, 6, 65,170, 32, 4, 4, 42,161,112,113,177, 2, +130, 84,144, 5, 6,130,149,184, 45,204,111,225, 20,218,150, 56, 11, 45, 97, 41, 41, 41,129, 88, 44,198,130, 5, 11,160, 82,169, + 96, 52, 26,125,114, 10, 47, 29,145, 72, 4,221,205, 82,156,155,182, 13,210,128,125,168,209,117, 0, 98,197,114, 72,246,252, 2, +189,205,226,107,192,210, 91, 56,107,213,170,133, 9, 19, 38,220, 50,172,131, 39,196,197,197,249,140,187,171,147, 53,187,126, 53, + 72,164, 18,140, 58,115, 19, 70,163,145, 25, 48, 96, 0, 15, 64, 15, 32, 79,175,215,223,240,231,126, 86, 2,238,123, 78,111,189, + 98, 5,240,196,230, 78,192,184,229, 20,156, 44, 3, 47,254,254,218,181,107,130,147, 21,172, 80, 40,240,213, 87, 95,233, 0,176, +147, 39, 79, 86, 36, 36, 36,136,252,201, 75, 34,145, 8,115,230,204,113,219, 38,203,157,232,170,200,115,228,124,110,187,118,237, +220, 14, 88,234, 65,188,221,194, 41,132, 53, 60, 60,220,225,100,217,108, 54, 71,111, 67, 97,244,121, 47, 31, 21, 52,127, 82, 78, +202,249,240,112, 62,144,112, 91, 2,103,101,101,117,247,116, 66,245,234,213, 47, 94,188,120,177,166, 48, 21,135,189,224,148, 24, + 12,134, 90,173, 90,181,242,105,237,240, 60, 15,153, 76, 6, 66, 8, 58, 78,152, 1,134, 5, 88,148,127,137, 69, 61,222, 9, 34, + 17, 7,190,108,170, 15,159,189, 14,245,122,125,185,151,131,187, 69,163,209,192,104, 52,250, 61,154,183,193, 96, 40, 55, 4, 3, + 67,120, 92,255,115,229, 45,189, 15,133,197,223,118, 59, 1, 1, 1,229,170,126,124, 56, 86,140, 63,142,150,115,213,163, 68, 42, + 1, 39, 17, 11,142, 86,233,165, 75,151,250,209,108,238, 63,132, 14, 11, 0, 80,187, 85, 15,240,188, 13,196,102, 43, 55, 77, 82, +221,164,238,224,137, 13,102,139, 14, 70,163,209,215,176, 39, 76,126,126,190,190, 95,191,126, 59, 1,124,215,167, 79,159, 11, 40, + 27, 93,152, 4, 6, 6,202,196, 98, 49, 15,160, 16, 0, 41, 42, 42, 10,206,200,200,224, 13, 6, 67, 53, 95,225,220,184,113, 35, +206,158, 61,139, 54,109,218,148,155, 14, 74,112, 69,157, 71,119,247, 39,127, 10,213,229,238, 70,132,247, 36,228,252,133, 72, 36, + 66,112,112, 48, 36, 18, 9,166, 76,153, 2,137, 68, 2,133, 66, 1, 0,152, 55,111,158, 99,240, 85, 10, 10, 10,138,135, 70,104, +249, 42, 55,189, 84, 43,122,173, 66,180, 90,173,233, 9, 9, 9, 21,186,152,205,102,203,241, 33,220,210, 87,173, 90, 37,113,118, + 33,124,253, 18, 66,114,124,188,108,211,215,175, 95, 47,113,231,110,120,154, 96,218, 23,167,205,102, 75, 79, 76, 76,244,232,152, +184,131,197, 98,201,240, 37, 90,103,228,233,203,137,132, 81,103,110,122,156, 59,145,194,103, 94,243,146, 63, 63,184,221,252,121, +169,118,237,218, 25, 33, 33, 33,155,162,163,163, 11,246,238,221, 27,222,188,121,243,112,231, 99,154, 55,111, 30,235,114,154, 9, +158,231, 57, 4,195, 48,233,125,250,244,113,155,231, 5,209,228, 38,127,166,251,202,243,135, 14, 29,146, 56,159,239,137,223,233, + 57, 74,247, 67,184, 94,111,220,184, 49,235,204,227, 41,239, 91, 44,150, 60,154, 11, 41, 40, 40, 30,122,161,165,215,235,111, 54, +108,216,208,234, 97,223, 13,111,231, 22, 20, 20, 52,171,236, 8, 88, 44,150, 86,247, 3,103,126,126,126,165,198,221,106,181,166, +219, 7, 40,245,122, 12,205,226,255, 94, 26, 1, 64,110,110,238,163, 0,160,213,106,225,107, 90,157, 10, 8,194, 74,207,159, 86, +171,181,213,221,184,167,133,133,133, 45,105,206,162,160,160,160, 66,171, 2,160,147, 17,255, 55,112, 55, 68, 43, 5, 5, 5, 5, + 5, 5, 69,229,130,165,183,128,130,130,130,130,130,130,130,226,238,128, 65, 89,207, 1,119,168, 72,111,130,206,183,113,237,109, +148,147,114, 82, 78,202, 73, 57, 41, 39,229,124,232, 56,125,113, 63, 48,189, 25,239, 69,123,233,206,148,147,114, 82, 78,202, 73, + 57, 41, 39,229,164,156, 15, 35, 8, 33,180,234,144,130,130,130,130,130,130,130,226,110,129,163,183,224, 95,131, 8, 21, 24, 81, +223, 15,213, 28, 10,192,211,132,113, 38,134, 97,138,110,131,147, 1, 32,177, 47,194, 64, 71, 22, 0,102, 0,102,134, 97,136,111, +142,143,217,204,204,208, 20, 98, 19, 55, 39, 12, 35,230,121,252, 93,173, 90,213,227, 12,243,132, 9, 0,148,209,117,235, 5, 42, +229,157,141,102, 83,146, 76, 44, 61, 91,172,213,108, 53,230, 94, 76,163,217,131,130,226, 95, 65, 47, 0, 19, 81,214,172,100, 58, +128,149,244,150, 80, 80,220, 37,161, 21, 24, 24,120,132,101,217,120, 95,227,243, 8,176,207,101,150, 94, 84, 84,212,172, 2,215, +238, 23, 24, 24,216, 65, 44, 22, 63, 14, 0, 22,139,101,175, 70,163,249, 11,192, 42, 0,214,219,140,147, 10,192,179, 0, 6,218, +215,127,178, 23, 22,234,219,228,107, 24, 28, 28,188, 70, 44, 22,147,252,252,252, 22, 0, 16, 30, 30,126,192, 98,177, 48,106,181, +250,105, 0, 39, 43,200,199,138,197,226,217, 45, 90,180,104,187,123,247,238,239, 0, 44,168,164,180,148,177, 44,235, 86,160,240, + 60,159,120, 27, 34, 75, 2, 32,120,193,130, 5,225,203,150, 45,107,156,158,158,222, 0, 0,226,227,227, 79, 13, 26, 52,232,248, +136, 17, 35, 10, 8, 33, 37, 12,195,152,189,241,100,102,134,166,228,102, 95,125, 35, 39,247,236,179, 0, 16, 19,219, 96,165, 72, +196, 74, 8, 57,186, 95, 17, 49, 48,162,102,141,196,255,253,252,237, 2, 73, 98, 82, 85,108,223,119,236,145, 17,111,190,159,146, + 1,124, 70,197,214,189, 67, 80, 80,208, 17,150,101,227,189, 61,227,238,158,121,155,205,150, 94, 88, 88,216,204, 19, 39,199,113, +241,222,202, 11,119,219,120,158,191,154,159,159,239,118,168, 9,149, 74,181,159,227,184, 36,127,185,132, 95,171,213,154,238,169, +151,174, 74,165, 58, 34, 18,137,226,189,197,211,221, 62,158,231,175,230,229,229,121, 10,231, 45,113,175,140,112,222, 14,167,183, +112, 10,229, 17,128,121,225,225,225,143, 21, 20, 20, 60, 15,224,125,181, 90,221, 72, 36, 18, 33, 44, 44,236,125,147,201,116, 57, + 56, 56,248,155,146,146,146,125, 0,222, 4, 64,231, 75,165,160,168, 44,168, 84,170, 28,141, 70, 67, 4,240, 60, 79, 44, 22, 11, + 49, 26,141, 68,175,215, 19,173, 86, 75, 52, 26, 13, 81,171,213,164,164,164,132, 20, 20, 20,144,200,200, 72,215,193, 27, 61,213, +225, 54, 80,169, 84, 23,103,204,152, 97,188,118,237, 26, 49,155,205,196,108, 54,147,180,180, 52,242,233,167,159, 26, 85, 42,213, + 69, 0, 13, 60,156,219,217, 67, 97,209, 5,192,242,198,141, 27,155, 54,110,220, 72, 12, 6, 3,209,106,181,100,229,202,149,164, +126,253,250, 38, 0,203,237,199,176,126,114, 2, 64,235,152,152,152,244, 43, 87,174,216,182,110,221,106, 14, 14, 14,222, 22, 28, + 28,188, 45, 45, 45,205,118,229,202, 21, 62, 34, 34, 34, 29, 64,235, 10,132, 19, 0,158, 25, 53,106, 84, 78, 90, 90, 26,105,215, +174,221,223, 78,219, 25,248,158,231,174,179, 59, 39,139, 16, 18, 67, 8,137, 69,217, 32,151,183, 44,132,144, 88,251, 49,161,126, +114, 42,175, 94,189, 90, 53, 58, 58,122, 6,195, 48, 38, 87, 62,134, 97, 76,209,209,209, 51,174, 94,189, 90,149, 16,162,244,198, +153,126, 99,225,171,155, 54,118, 42,214, 22,157, 39,218,162,243,228,187,239,219,171, 95, 31,241,252,242,216,234, 77, 22,135,196, +167, 44, 56,123,254,210, 34, 66,200,162,191, 14, 95, 92,244,209,151,191, 47,122,114,196,220,175,194, 19, 26,191, 94,129,251,121, + 39,160,156, 0, 66, 66, 66,178,181, 90, 45, 33,132, 16,155,205, 70,204,102, 51, 49, 26,141, 68,167,211, 17,141, 70, 67, 74, 75, + 75, 29,207,121, 73, 73,137,227,127, 84, 84,148,199,231, 61, 52, 52, 52, 71,175,215,151, 43, 59, 76, 38,147,163,252,208,233,116, + 68,167,211, 17,173, 86,235, 88, 52, 26, 13,169, 82,165,202, 77, 47,225,204, 18,194,201,243, 60,177, 90,173,196,108, 54, 59,120, + 13, 6, 67,185,197,104, 52, 18,163,209, 72, 18, 18, 18,252, 14,167, 63,156, 6,131,129,196,199,199,103,122,226, 12, 11, 11,203, + 49, 24, 12,229, 56,157,227,239,202, 43,172,199,196,196,100, 87,132,211,159,112,122,187,159,118, 44,184,112,225, 2,209,235,245, + 36, 46, 46,174,224,233,167,159,182,216,108, 54,178,113,227, 70,210,184,113, 99,190,125,251,246,230,252,252,124,242,210, 75, 47, + 17, 47, 31,133,244, 57,162,156, 20,158, 77, 11,207,142, 22,195, 48, 80, 42,149, 88,177, 98,133,199,233, 56,156,255, 87,171, 86, +205,223,235, 54, 75, 74, 74,218,185,103,207, 30,121,108,236, 63, 3, 98,155, 76, 38,132,134,134, 98,216,176, 97,210, 94,189,122, +213,236,218,181,235,129,235,215,175,183, 3,112,196, 7,223, 83,145,145,145,159,127,248,225,135,209,253,251,247, 71,120,120,185, + 65,183,209,175, 95, 63, 60,253,244,211,146, 11, 23, 46, 12, 88,178,100,201,128,133, 11, 23,102,107, 52,154, 17, 0,126,241, 70, + 42,151,203,251, 84,169, 82,229,171, 61,123,246, 68, 69, 69, 69, 33, 57, 57,153, 29, 51,102, 76,205, 90,181,106,201,227,227,227, +217,172,172, 44,252,250,235,175,113,207, 61,247,220,234,156,156,156,255,153,205,230,117,126,196, 93, 26, 30, 30,254,254,255,254, +247,191, 8,181, 90,109, 61,122,244,232, 69, 97,187, 84, 42,157,220,178,101,203,230, 59,118,236,248, 17,192, 55,183,227,100, 17, + 66,212,248,167,138, 79,128, 69,216,239,143,179, 69, 8,145,254,253,247,223, 97, 45, 91,182,252,197,104, 52, 54,121,227,141, 55, +110, 76,155, 54, 77,174, 82,169, 84, 0, 24,181, 90, 93, 52,113,226, 68,211,220,185,115,223,171, 87,175, 94,167,253,251,247, 63, + 69, 8,177,216, 5,217,173,124, 12,227, 8,207,205,140, 60,236,220,199, 75, 39,140,123, 55,254,147,169, 73,215, 15,159,185,201, +115,114, 21,126,219,117, 26, 57, 5, 26,252,190,255, 12, 98,194,131, 24,137, 76,156, 18, 28, 87,191, 93, 73,198,153, 93,240, 50, + 66, 58, 69,229,128, 97, 24, 40, 20, 10,252,246,219,111,183, 76, 93,229,110, 90, 43,142,227, 16, 18, 18,226,115,118,131,128,128, + 0,108,221,186,213,237,220,139,238,166,244, 9, 14, 14,134,183,143, 13,134, 97, 16, 16, 16,128,189,123,247,130,101, 89,183, 83, + 3,185,110, 83, 42,149, 96,189,204,117, 37,112,238,218,181,203, 39,151,240, 27, 24, 24, 8,148, 85,253,123,126, 40,101, 50,236, +217,179,199, 99,156, 93,255, 7,218,231,123,245,197,185,119,239,222,114, 83,127,185, 78, 9,230,188,174, 84, 42,193,248, 32, 13, + 13, 13,109, 17, 31, 31,143, 67,135, 14, 97,213,170, 85, 97, 41, 41, 41,184,116,233, 18, 24,134,193,180,105,211,152,250,245,235, +139,179,179,179,209,166, 77, 27,172, 93,187,182,149, 90,173,166, 15, 12,197,191, 37, 88,196, 0, 30, 1, 16,137,178,102, 55,165, + 0, 66, 80, 54,147,134, 20, 64, 1, 0,185,125, 49, 2,208, 0,136,176,159,158,111, 47, 91,156, 5, 66,158,243,228,211,132,144, +230,118,110, 97,134,138, 72,167, 99,133,107,184,174,187,254,186,229,230, 0, 96,195,134, 13,194,203,172,125,106,106,234, 78,231, +200,249, 35,178,132,121,202,220, 60,211,174, 93, 52,101, 74,165,114,205,129, 3, 7,228,145,145,255,196,193,104, 52,162,180,180, + 20, 26,141, 6,165,165,165, 8, 10, 10,194,170, 85,171,228,157, 58,117, 90, 83, 90, 90, 90,203,126,211, 60,113,206,201,202,202, +138,182, 90,173,144, 74,221, 55, 81, 98, 89, 22,117,235,214,197,251,239,191,143,110,221,186,197,116,232,208, 97,142,139,208,186, +165, 43,169, 66,161,248,234,232,209,163, 81, 10,133, 2, 23, 47, 94, 68,122,122, 58, 70,141, 26, 85,149,231,121,220,188,121, 19, +151, 46, 93, 66, 70, 70, 6,150, 44, 89, 18,213,183,111,223,175,220, 8, 45,119,221, 83,223,120,251,237,183,235,132,134,134,178, +159,126,250,105,177, 86,171,253,194,190,125,194,252,249,243, 95,104,219,182,109,212, 43,175,188, 66,246,238,221,187,204,158,112, + 30,239,167,115,155, 44,123, 53, 31,236,153,239,156,203, 57,117,157,246,131, 16, 18, 3,192,200, 48, 76,177, 27, 78, 6, 64,112, +215,174, 93,223, 49, 26,141, 77,246,236,217,115,249,241,199, 31, 79, 0,144, 37,100,190,224,224, 96,229,156, 57,115,162, 83, 83, + 83, 47,116,236,216,177, 73,215,174, 93,223,201,203,203,155, 70, 8,201,115,106,179,229,224,228,121,252, 29, 19,219, 96,229,174, +253, 35,158,221,177,215, 36,121,247,205,143,110, 84,171,154, 88,242,247,197, 66,219,153,171,121, 40,213, 91,241,100,199,178, 9, +204, 91, 52,168,134,207, 87,236,193,176,183, 62, 16,255,178,114,233,211,151, 9,148,154,204, 51, 27,189,220,207, 59, 5,229,132, +163,138, 9, 98,177, 24, 79, 60,241, 4, 24,134,185,101, 46, 79,177, 88,140,253,251,247,163, 99,199,142, 16,139,197,120,249,229, +151,253,226,228, 56, 14, 93,187,118,117,204,163,232,204,231, 42, 26, 60,104,130,109,183,124, 29,114, 28, 88,150,245, 56,145,182, + 43,167,175,114, 73, 8,167, 55, 46,231,125,190,194,105,159,242,200,111,145,229, 47,167, 16, 78,142,227,208,170, 85, 43, 28, 63, +126,220,171,232,242,160, 47,203,197,189,168,168,232,197, 90,181,106,237, 90,176, 96, 65, 24, 0, 20, 20, 20, 56, 38,188, 23,137, + 68, 56,127,254, 60, 76, 38, 19, 62,254,248, 99,179, 90,173,126,133, 62, 71,148,243,110,114,122,211, 34, 0,218,142, 27, 55,174, +217,140, 25, 51,166,181,108,217,242,231,125,251,246, 45,103, 24,102, 3, 33, 36, 85,248, 29, 55,110, 92,202,140, 25, 51,166,141, + 29, 59,246,253,233,211,167,159,102, 24,102, 3, 0,184,174,219,203,146, 84, 23, 17, 23, 41,240,216,159,185,114,199,186, 91,119, +253,117,199,237, 16, 90, 0,144,154,154,202,216, 35,201, 56, 23,106,254, 10, 45,127,230,238,227, 56,110,248,180,105,211,162,189, +137, 44,141, 70,131,204,204, 76, 36, 36, 36,224,229,151, 95,142, 94,176, 96,193,112,171,213, 58,203, 11,173, 68, 36, 18,225,208, +161, 67,200,205,205, 69,195,134, 13,145,148,148, 84,238,128, 43, 87,174, 96,211,166, 77, 40, 46, 46, 70,211,166, 77,129,178,198, +221,110,209,168, 81,163,143,235,214,173,219,149,101, 89,171, 92, 46,199,223,127,255,141, 38, 77,154, 96,197,138, 21,168, 86,173, + 26, 20, 10, 5, 46, 92,184,128,134, 13, 27, 98,231,206,157,136,140,140, 68,227,198,141,173,106,181,122,119, 97, 97,225, 95,215, +175, 95,255,216, 83, 56,227,226,226, 62,122,253,245,215,165,153,153,153,252, 15, 63,252,176, 7,192, 30, 0,195, 63,248,224,131, + 33,221,186,117,139, 58,118,236, 88,201,225,195,135, 15,122, 16, 89,254, 56, 89, 86,215,151,146,205,102, 51,234,245,122,147,209, +104,180,176, 44,155,198, 48,140,201,102,179,213,242,100, 66, 12, 30, 60,184,122,126,126,254,176,183,222,122,235,154, 93,100,157, + 71, 89, 3,120, 0,128,213,106, 53,106, 52, 26,117,203,150, 45, 19,158,123,238,185,203,203,151, 47, 31, 54,120,240,224, 85, 63, +252,240,131, 6,128,222,149,176, 90,181,170,199, 69, 34, 86,162, 45, 13,187,186,122,213, 55,111,111, 90, 63,188,234,205,155, 25, + 53,195, 35, 34,181,146,192,200,204, 85, 63,125,127, 4,128, 41, 51, 79,141,147, 87,178, 33, 22,139,112,246,102, 9,218,118,239, + 39,190,124,113,106,107, 0, 27,233,183,220,221,255, 88, 20, 38,161,222,177, 99,135, 87, 71,107,255,254,253, 16,139,197,144,203, +229,152, 59,119,174, 87, 82, 65, 24, 8,110,145, 47, 49, 35, 76,142,238,205,125,226,121,222, 49,209,187,235,242,197, 23, 95,224, +173,183,222, 42,119, 13,187,216, 96,124,113,122, 10, 95, 66, 98, 34,114,115,114,202,109,243,103, 82,122,155,205, 6,177, 88,140, +197,139, 23, 35, 53, 53, 21, 27, 54,108,240,250,251,196, 19, 79,128,101, 89,226,207,253,108,213,170, 21,204,102,179, 35,204,231, +207,159,119,203,187,112,225, 66, 95,193,236, 5, 96, 98,147, 38, 77, 84, 29, 58,116,192,174, 93,187,240,244,211, 79, 27,205,102, +243, 69, 0,232,217,179,103,237, 5, 11, 22, 72,143, 30, 61,138,240,240,112,241,141, 27, 55,190, 3,109, 32, 79,113,151,225, 78, +139, 8,239,188, 25, 51,102, 76,115, 21, 49,206, 16,246, 51, 12,179, 97,250,244,233,169,206,162,200,121, 93,112,157, 92, 68, 92, +138,179, 35,229, 44,162, 60, 9, 40,151,247,173,243,241,121,110,133,150, 61, 98,237,157, 93, 32,161,240,245, 37,178,188,124, 57, +150, 67,112,112,112,143, 39,159,124,210, 33,114, 12, 6,131, 67, 96, 9, 34, 75, 88,191,112,225, 2,154, 53,107, 38, 9, 14, 14, +238, 81, 80, 80, 48,203, 15, 17,135, 42, 85,170, 32, 63, 63, 31,167, 78,157, 66, 66, 66, 2, 44, 22, 11, 54,111,222,140,146,146, + 18,136,197, 98, 72, 36, 18,152,205, 94,219,110,163,110,221,186, 79, 44, 91,182,172,217,210,165, 75,139,132, 47,186,159,126,250, + 9,132, 16, 68, 70, 70, 66,167,211, 33, 39, 39, 7,127,253,245, 23,172, 86, 43, 2, 3, 3,145,156,156, 44,237,211,167, 79,235, +137, 19, 39,138,189, 8,173, 86, 79, 63,253,116,176, 74,165,194,155,111,190, 73,204,102,243,116,251,182,143, 70,140, 24, 17,158, +150,150,102,122,245,213, 87, 15,153,205,230, 79, 5, 51,209, 89,224,120, 72, 88,143, 78,150,197, 98, 17,238,233, 53,141, 70,131, +136,136,136, 4,103,103,203,147, 24,220,187,119,111, 43, 0,162,201,147, 39, 7, 0,200,113, 14,131,201,100,130, 70,163,129, 86, +171,181,148,148,148,228,142, 30, 61,218,186,124,249,114,145,253,156,179,238,132, 22,195, 60, 97, 82,169, 20, 82, 66, 68, 31, 44, + 90,180, 40,176, 91,183,110,108, 96, 96, 32, 74, 75, 75, 85,191,255,241, 71, 96,167, 14,173,147,167,205,248,100,139, 42,190, 97, +206,222,191,175, 34, 35,187, 4, 38,139, 5,201,177,193,101,126, 24,197, 93,135,189, 35,139,195,209,114, 22, 21,187,118,237, 66, +247,238,221, 29,207,186, 68, 34, 41,231,124,249,226,228, 56, 14,221,187,119,191,197,225,217,177, 99,135, 91,247,201, 23,156, 69, +145,171, 56,114, 39,192, 88,150,245, 57, 96,160,224,230,185, 19, 91,206,174,190,139,120,243, 85,205, 1,142,227, 48, 98,196, 8, +136,197, 98,140, 25, 51, 6, 28,199,161,113,227,198,224, 56, 14, 45, 91,182,132, 88, 44, 70,199,142, 29, 43, 28,247, 3, 7, 14, +160, 73,147, 38,142, 48, 53,110,220, 24,205,155, 55, 7,199,113,104,211,166, 13,196, 98, 49,186,118,237,234, 15,231,251,165,165, +165,141, 2, 3, 3,113,225,194, 5,136, 68, 34, 48, 12,115, 9, 64, 35, 0,136,141,141,189,172,211,233,170, 27, 12, 6,188,254, +250,235,140,201,100,106, 56,102,204,152, 15, 12, 6, 3, 21, 90, 20,119, 13,174, 90,196, 9,250,177, 99,199,190,207, 48,204, 6, +193,161,114,117,158,220,173,187, 41,155, 4, 7,234,176,253, 89,109,238, 34,226,242, 24,134, 57, 76, 8,233,233,233, 92, 0, 38, + 23, 97, 85,174,234,208,185,218,208,167,163, 37, 20,190,254, 10, 45, 95, 48, 24, 12,143, 68, 69, 69,121, 20, 89,206,191, 38,147, + 9, 73, 73, 73, 48, 24, 12,143, 84,244,165, 17, 27, 27, 11,179,217,140,111,190,249, 6, 18,137, 4, 18,201, 63,250,194,100,242, +110, 22,157, 57,115,230,218,129, 3, 7,154, 52,109,218, 52,116,237,218,181,121,237,218,181,139,236,214,173, 27,228,114, 57,244, +122, 61, 44, 22, 11, 90,180,104,129,186,117,235, 34, 61, 61, 29,191,255,254,123,126,173, 90,181, 34, 14, 30, 60,200,103,103,103, + 95,247, 66,221,165, 83,167, 78, 96, 24, 6,127,252,241, 71, 62,128,195, 50,153,108,211,212,169, 83, 67, 77, 38, 19, 63,104,208, +160, 27,133,133,133,111, 1, 48, 75,165,210,249,237,218,181,107,185,109,219,182, 31,121,158,159, 91,209,140,234,122,111,181, 90, + 45, 2, 2, 2,252, 25, 74, 66, 92, 88, 88,216, 0, 0,148, 74,101, 24,128,203,142, 28,174,215,151, 19,195, 38,147,201, 16, 22, + 22,166, 4, 0,251, 57, 98, 15,156,145, 86, 43, 86, 95,191,126, 53,200,185,253, 92, 72, 72, 8, 6, 62,247, 28,251,120,171, 86, +210, 70,143, 60,210,117,252,103, 75, 87, 84, 9, 87,153,146,171,132,195, 98,179, 96,219,150,205, 60,225, 45, 91,104,177,115,111, +132,150, 32, 54, 92, 29, 45,177, 88,140,157, 59,119,222,178, 77, 34,145,224,235,175,191,246, 75, 24, 8,162,202, 83,213,153, 75, + 85, 23,227, 75,192,136,197, 98,136, 68, 34, 44, 94,188, 24, 60,207,227,237,183,223, 46, 87,157,232,204,239,151,157,231, 36, 2, +235,126,196, 3, 48, 33,125,182,204,113,190,107,120,237,231,248,229,146, 45, 88,176,192, 47, 71,171,103,207,158, 62,133,171,115, + 13,131,115,184,142, 31, 63,238,150,119,209,162, 69, 62,239,167,205,102,195,198,141, 27, 29, 34, 85,192,248,241,227, 95,151, 74, +165,209,187,119,239, 70,118,118, 54,180, 90, 45, 52, 26, 13, 90,180,104,145,204,178,236,223,217,217,217,105,103,207,158,125,146, + 62, 61, 20,247,208,209, 50, 78,159, 62,253,244,244,233,211,221, 58, 86,174,206,146, 55,231, 73, 16, 88,118, 65, 20, 41,136, 55, +148, 53,171, 57,236,235, 92, 0, 82,215,170, 67,175, 70,144,139,138,156,232,174,240,245,167,250,208, 79, 59,157, 99, 24, 6, 6, +131,193,173,192,114, 22, 7,102,179, 25,133,133,133,176,217,108,183, 61,214,151,187, 47, 89, 95, 66,235,212,169, 83, 47, 13, 25, + 50, 36, 51, 56, 56,184, 81, 94, 94, 94, 46,207,243, 29,247,239,223, 31,201,113, 28, 84, 42, 21, 84, 42, 21, 54,109,218, 4,133, + 66,129, 17, 35, 70,228,218,108,182, 93, 65, 65, 65,225,122,189,254, 68,118,118,246,120,143, 10, 70, 44,238,218,166, 77, 27, 28, + 61,122, 20, 69, 69, 69, 91, 1, 52,126,254,249,231,187, 87,173, 90,149,153, 58,117,170,225,202,149, 43,115, 1,228, 42,149,202, +101,203,150, 45,235,208,180,105,211,160, 65,131, 6, 97,231,206,157,139, 0, 24,252,141,179, 86,171, 45, 39,176,212,106, 53, 74, + 75, 75,161, 84, 42,173,126,222, 51, 49,254,233, 97, 8, 66,136, 35,109,236,110,150,144, 62,132,227, 56,161, 87,163, 39,145, 5, +165, 82, 57,121,233,210,165,114,215, 78, 10, 54,155, 13, 57, 57, 57, 80,169, 84,248,112,252,120,201,164, 81,175, 52, 17, 5, 70, +239,103, 89, 6, 38, 51, 41, 38,188,105,179, 54,167,255,110,224, 99, 90,242,220, 3, 8,194,160,119,239,222,183, 84, 23, 74, 36, + 18,108,221,186, 21,125,251,246,117,124,184, 52,109,218,212,231,199,149, 32, 12,122,245,234,229,112,134, 54,111,222,236,182,218, + 79,112,164,252, 17,132,194,177, 35, 71,142, 4,199,113,248,252,243,207,241,206, 59,239,128,101, 89,204,158, 61, 27, 44,203, 98, +194,132, 9,126,139, 76,103, 1,147,246, 73,217,111,252, 59,106, 20, 44,140, 6, 0, 4,169, 84, 66,132, 42, 84,246,112, 28,231, +112,178, 30,121,228, 17,136,197, 98,180,108,217, 18, 28,199, 57,156,172, 30, 61,122, 56,223, 71,226, 15, 39,199,113,184,120,241, +162, 35,204, 45, 91,182, 44,231,100,113, 28,135,158, 61,123,250, 19,204,105, 33, 33, 33, 19,235,214,173, 91,111,206,156, 57, 98, +145, 72,132, 78,157, 58,213,142,137,137,185,110,181, 90,195, 39, 79,158,172,112,115,142, 28, 64,163,122,245,234, 41,233, 83, 67, +113, 23, 29,173,137,110,118,133, 58,183,185,170,192,135,228, 6,231,227, 5, 14, 87,113,100,119,200,118,249,226,114,119,174, 47, +112,130,130,244,102,169,251, 35,180,236,182,179,215,139, 41, 20,138,147,185,185,185, 45,229,114,121, 57,145,229, 78,112,137, 68, + 34,100,103,103, 67,161, 80,156, 52, 26,141,149,150,136,190,170, 14, 1, 24, 46, 93,186, 52,202,105,189,115,143, 30, 61,126,216, +186,117,107,236,182,109,219,112,240,224, 65, 68, 70, 70, 98,193,130, 5, 89, 57, 57, 57, 47, 1,216,154,159,159,239,243,186,213, +171, 87,111, 16, 24, 24,136,189,123,247, 2,192, 78, 0,175, 12, 27, 54,140,177, 88, 44, 88,184,112,161, 22,192, 31, 33, 33, 33, + 27, 87,173, 90,213,164, 81,163, 70,210,109,219,182,169, 15, 30, 60,248,167,159, 34,203,198,243,252, 45, 2,203,249,158, 6, 5, + 5,249,227,104, 89,130,131,131, 79,169,213,234,126,122,189, 94, 45,147,201,130,212,106,181,209, 89, 96, 9,252, 28,199,137, 47, + 94,188,152, 9, 32, 57, 56, 56,248, 20, 60, 84,115,114, 28,215,169, 83,167, 78,156,107, 26,228,228,228, 32, 59, 59, 27,102,179, + 25, 77,155, 54,101, 68,140, 69, 84,116,243,164,203,176, 14, 84,100,221, 35, 71,139, 8,207,186,208, 75,208, 93, 79,195,205,155, + 55, 59,214, 89,150,197,247,223,127,239,151, 40,218,186,117,171,215, 6,235, 46, 85,135, 62,173,113,225,248, 47,191,252,178,108, +122, 11,187,147,197,178, 44,198,142, 29, 11,153, 76,134,169, 83,167, 98,236,216,177,224, 56,206,103,213,161,179,128, 73, 28,163, +115,254, 56, 42,123, 40,236,237,161, 24,134,113, 22, 91,140,191,226,205,155,155,231, 79, 77,128, 51,167,112, 94, 64, 64,128,199, +134,240, 46,156,222, 46,240, 27,128,171,177,177,177,123, 91,182,108, 25,124,228,200, 17,204,158, 61, 91, 98, 52, 26,171,109,219, +182,205,113, 93,119,247, 75,171,213,202,233,147, 67,113, 55,220, 44, 47,187,243, 92,218, 87, 49,206,213,120, 94,126, 93,143,135, +211, 54,103,222, 60,134, 97, 44,110,174,151,231, 70, 92,185, 94,195,249,152, 60,143,142,150,175,194,194,151,224,242,199,209,210, +233,116,127,254,241,199, 31,205,159,123,238, 57,206, 91,181,161, 86,171, 69,116,116, 52, 78,159, 62,109,213,233,116,127,250,225, +148, 85,166,208,114,197,182,220,220, 92,145,197, 98, 65,205,154, 53, 17, 23, 23, 7,131,193,128,226,226, 98, 17,128,173,126,114, + 72,148, 74,165, 8, 0,138,139,139,129,178,174,166,181,107,213,170,133,163, 71,143,162,176,176,240, 23, 0,221, 38, 78,156,216, +180, 69,139, 22,146, 21, 43, 86,232,222,120,227,141, 95, 44, 22,139, 95, 74,131,231,121,147,213,106, 77, 98, 89,214, 92, 92, 92, +156,225,124, 63,163,163,163,195,148, 74, 37,147,147,147, 99,241, 71,104, 53,106,212,232,208,141, 27, 55, 48,121,242,228,188,105, +211,166,213, 42, 45, 45, 45, 42, 41, 41,177, 58,139, 45,131,193,192, 70, 68, 68,200, 22, 46, 92, 40, 7,128, 70,141, 26, 29,242, + 36,180,180, 90,109, 85,133,226,159, 15, 99,163,209,136,236,236,108,100,103,103, 35, 39, 39, 7,165,165,165, 72, 78, 78,134, 78, +167, 75,160,197,204,191, 38,180,202, 85,159, 57, 63,223,206, 47,242,138, 60,235,206, 2,166,119,239,222,142,182, 93,130, 67, 38, + 44,171, 87,175,118,109, 96,238,151,208,250,242,203, 47, 49,114,228, 72, 4, 4, 4, 96,206,156, 57,229,170, 14, 93,197, 1,207, +243,140, 63,113, 79,122, 79,143,236,249, 97, 16,139,197, 8,127, 35,167, 92, 21,157, 27,193,225, 87, 56,167, 77,155, 86, 41, 85, +135,206,156, 9, 9,101,143,202,226,197,139,209,175, 95, 63,236,222,189,251,182,171, 14, 83, 82, 82,126,218,176, 97, 67,240,153, + 51,103,160, 86,171,145,151,151, 7,163,209,136,244,244,116,143,181, 2,246,178, 60,128, 62, 57, 20,247,184,156, 58,124, 47,121, + 43,243,122,156,143, 23,184,223, 66,203, 31, 71,203,104, 52,206,121,243,205, 55,135,117,238,220, 57, 44, 40, 40, 8,153,153,153, +183,136, 44,141, 70,131,192,192, 64,232,245,122,172, 95,191, 94,109, 52, 26,231,248, 18, 7, 22,139, 5, 81, 81, 81,200,207,207, + 7,239,161,253, 52,203,178,144,203,229,208,104, 52,128,143, 70,230,238, 94, 24,102,179, 25, 22,139, 5, 22,139, 5,102,179,185, +162, 51,114, 43,148, 74,165, 32, 60, 0, 64, 91,165, 74,149,154, 1, 1, 1,184,118,237, 26, 80,214,179,175,115,247,238,221,197, + 5, 5, 5,228,213, 87, 95,221, 67, 8,121, 29,222, 71,199, 55,237,218,181, 43, 9, 0,228,114,249, 5, 0, 72, 79, 79,183, 20, + 23, 23,151,115, 10, 21, 10, 5,233,219,183,111, 44, 33, 4,187,118,237, 74,146, 72, 36, 4,158,123, 53, 26,214,173, 91,119, 38, + 56, 56,120,249,140, 25, 51,158, 75, 77, 77, 61,221,160, 65,131, 36,173, 86,155,171,215,235,245, 6,131,129,136, 68, 34, 73,104, +104,104,192,150, 45, 91, 46,239,223,191,191,179, 74,165, 90,190,110,221,186, 51,158,156, 55,165, 82,153,174,211,233, 18,133, 52, +117, 22, 89,217,217,217, 32,132,224,234,213,171, 80, 40, 20, 55,124, 85,235, 82,220, 61, 8, 31, 85,174,206,139,235, 54,127, 69, +150,179, 48,216,178,101,139,215, 49,180,252,229,116, 22, 69,239,188,243, 14,230,207,159,127,139,163, 53,117,234, 84, 0,192,248, +241,227,253,110,163, 37,184, 87,217,243,195, 16, 51,178,176, 92,216, 1,128, 17,194, 87,177,103, 30, 28,199, 97,242,228,201,183, + 52, 82,119,174,218,243,179,138,175, 92, 56,115,115,115,193,113, 28,194,194,194, 48,112,224, 64,116,237,218,213, 81, 5, 89, 81, +222,115,231,206,237,125,239,189,247, 26,166,164,164, 96,202,148, 41,133, 33, 33, 33, 65,175,189,246, 26, 87, 92, 92,204,120,115, +180,168,208,162,160,168, 4,161, 37, 60, 96,254,246, 58,244, 80, 88,118, 70,249,177, 54, 74,116, 58,221,192, 46, 93,186,172, 93, +185,114,165,188,122,245,234, 56,119,238, 28, 10, 11, 11, 97, 50,153, 32,145, 72, 16, 27, 27,139,226,226, 98,124,255,253,247,122, +157, 78, 55, 16, 64,137, 15,206, 15,154, 53,107,246,213,172, 89,179, 2, 26, 55,110,140,194,194, 66,104, 52, 26,135, 16, 98, 24, + 6, 42,149, 10,114,185, 28,135, 14, 29,194,230,205,155,245, 0, 62,240,193,233, 78,205,193,108, 54, 59, 4,151, 31, 66,203,153, + 83, 41,184, 58, 58,157, 14, 0, 44, 85,171, 86,141, 1,128,171, 87,175, 2, 64, 90,114,114,242,196,234,213,171, 51,203,150, 45, + 35,132,144,205, 30, 68,150,131,147, 97,152, 66, 66, 72, 17,128, 24,147,201, 36, 1,128,146,146, 18,115, 68, 68, 68,148, 76, 38, +227,229,114, 57, 31, 16, 16,192,103,102,102, 90,173, 86,171, 4, 0,218,180,105, 99, 2,144,237, 50, 71,161, 51, 39, 79, 8, 81, + 47, 90,180,104,226,160, 65,131, 90,182,106,213, 42,101,232,208,161,167, 94,125,245, 85, 54, 46, 46, 46,180,180,180,212,112,233, +210,165,162,207, 62,251,172,244,192,129, 3,157,197, 98,241,245, 69,139, 22, 77, 4,160,102, 24,134,119,199,105,181, 90,255,220, +182,109,219, 75,169,169,169, 92, 70, 70, 6,114,114,114, 28, 34, 43, 39, 39, 7,117,235,214,197,254,253,251,109,102,179,121, 91, + 5,238,103,101,129,114,150,125,132, 16,225, 89,247, 36,176,132,143, 41,127, 57,157, 69, 81,191,126,253,202,185, 88, 18,137, 4, +107,214,172,113, 91,110,184,121,174,202,197,221,121,140,175,247,222,123,175,156,104,251,240,195, 15, 61, 22,103,190,238,167,192, + 83,178, 56,174,124,175, 67, 15,207,185,183,112, 10,101,167, 88, 44,198,135, 31,126,232,183,163,133, 91,219,104,221,194, 41,196, +189, 93,187,118,208,233,116, 14, 33,235,201,209,242,117, 63,109, 54,219,200,249,243,231, 19,149, 74,245,152, 90,173,126,254,198, +141, 27, 75,116, 58,221,163, 37, 37, 37, 94, 29, 45,163,209, 40,163,207, 17,229,196,221, 25,159,235,225, 17, 90,246,151, 36,170, + 86,173, 90,110,238, 44,150,101,203, 45, 21,105,103, 96,199,150,139, 23, 47, 62,245,248,227,143,255, 56,114,228,200,160,198,141, + 27,139, 19, 19, 19,161,213,106,113,237,218, 53,156, 62,125,218,186,110,221, 58,181, 78,167,123, 30,128, 63,189,206,150,158, 57, +115,102,115,183,110,221, 38,180,104,209,226,127, 31,125,244,145,168,118,237,218, 40, 41, 41, 65,104,104, 40,162,162,162,112,254, +252,121,172, 95,191,222,150,159,159,255, 21,128, 73,112, 83,135,234,235,131,223,108, 54, 99,192,128, 1,224,121, 30,115,231,206, +133, 63, 19, 42, 59,193,108, 54,155, 9, 0,198,222,158, 75,103, 31, 93, 26,151, 46, 93, 2,128,235, 73, 73, 73, 65, 0,176,109, +219, 54, 6,101,227,107,249,243,133, 79, 8, 33, 14,103,171,110,221,186,215, 92, 11, 71,193,201, 18, 92, 48, 95,225,102, 24,198, + 64, 8,201,213,233,116,221,222,121,231,157, 9, 95,126,249,229,115, 95,126,249,229, 45,199,169, 84,170,229,179,103,207,158,244, +236,179,207,230, 50, 12,227,177, 29,153, 86,171, 29,255,226,139, 47, 62,123,242,228,201,160,128,128, 0,104,181, 90, 20, 20, 20, +192,108, 54, 35, 57, 57, 25,185,185,185, 88,186,116,105,169, 94,175,255,152, 62,142,255, 14,156,133,129, 39, 87,203, 15,145,229, +209,213,249,237,183,223,220,142, 81, 85, 81, 78, 87,177,225,239,216, 86,222, 62,138,132, 97,105,220, 13, 25, 81,193,114,237, 22, + 94,142,227,240,233,167,159, 58, 6,109,117,231,100, 85,196,209, 18, 56,195,194,194,202,108,114,133, 2, 60,207,163,103,207,158, +119,194,203, 3, 24,225, 52,226,251,180,209,163, 71, 79,172, 91,183,110,109, 0, 50,231,123, 80, 65, 23,159,130,130,194,151,208, +178,217,108,233,117,234,212, 41, 87,192,249,154,204,212, 98,177,164,251,121,221,205, 90,173, 54,121,246,236,217,111, 42,149,202, +206, 58,157,174,161,189,224, 56,169,213,106,183, 25,141,198,121,168,216, 36,208,121, 0,134, 31, 56,112, 96,110,183,110,221,166, +118,236,216,241,153, 81,163, 70, 49,132, 16, 44, 92,184,144, 92,185,114,101,181,221,197,186,114, 59, 55, 41, 44, 44,236,204,247, +223,127, 31,189,118,237, 90, 88, 44, 22,204,155, 55, 15, 65, 65, 65,103, 10, 11, 11,253,165,200,221,190,125,251, 15,173, 90,181, +122, 97,255,254,253, 75, 1,156,216,185,115,231,146,214,173, 91,191,184,127,255,254,159, 0,156,254,235,175,191,150,180,104,209, +226,197,195,135, 15,175, 2,112,188, 2,133,175,195,217,178, 90,221,215, 52,122,112,178,188,113,170, 9, 33,230, 33, 67,134,140, +122,246,217,103,191, 57,124,248,240,163,197,197,197, 13, 1, 32, 36, 36,228,100,243,230,205, 15,173, 92,185,242,188,221,201,242, +213, 88, 63, 79,171,213,246,109,216,176,225, 47, 83,166, 76, 81,166,164,164,112, 53,107,214, 68, 90, 90, 26, 78,157, 58,101,253, +238,187,239, 52,122,189,190, 55,128, 34,250, 56,254,123, 66,139, 16,130,144,144,144,114, 31, 81, 66,151,255,138, 86, 23, 58,191, +152,133,169,122, 92,121, 61,113,122, 27, 54, 65, 64, 96, 96,160, 99,112, 83,127,154, 44,240,188,247,241,216, 8, 33, 14, 78, 97, +241, 67,100,249,236, 33,104,159, 2,199,111, 78,127,134,119, 80, 42,149,176, 88, 44, 14, 94, 63,122,126, 86, 84, 45,254, 6,224, + 55,139,197,114, 9, 64, 13, 42,174, 40, 40,238,162,208, 42, 42, 42,106,118,151,175,173, 54, 26,141,147,140, 70,227, 36, 97,131, +193, 96,184, 83,206, 43, 0,158,221,190,125,251,172,237,219,183, 11,245, 8,147,225,123,190, 68,175, 56,119,238, 92,170, 88, 44, +254,122,249,242,229, 45, 8, 33, 8, 14, 14, 62,144,150,150,246, 90, 69, 56,108, 54,219,144,253,251,247, 15,131,189, 45,147,217, +108, 30,178,119,239,222, 55, 81, 54, 31, 19,108, 54,219,144,131, 7, 15, 58,214, 43,248,162, 36,132, 16, 35, 33,164,138,135, 67, +140, 21,116,224, 4,103,203,180,114,229, 74, 13,128,191,241,207, 56, 89, 22,251, 98,112,169, 46,244,134,191,180, 90,109,205, 15, + 63,252,112,154, 72, 36,234,164,213,106,227,148, 74,229, 77,171,213,250,167, 78,167,251, 0,101,115, 84, 81,252, 75, 48,153, 76, + 25,117,234,212,225,220,125, 64,121,123,145,123,251,176,178,217,108,233,181,106,213,242,249,113,230,134, 51,195,139,104,184,158, +156,156,204,250,203, 37,192,108, 54,231,122, 11,103,114,114, 50, 42,202,233, 43,238, 73, 73, 73,110,227,238, 67, 16,122,140,187, +213,106,189, 45, 78,111,247,211, 27,244,122,125, 81,100,100,164,198, 96, 48,136,141, 70,163,216,106,181,150,179, 31,229,114,121, +158, 94,175,167, 15, 15, 5,197,157, 8,173,251, 28, 71, 80, 54,189, 68,101,193,120,242,228,201, 23, 28,246, 84,110,238,237,242, +184, 42, 73,141,143,245,138, 8,163, 74,119,132,236, 66, 74, 87, 73,116,249, 26,141,230, 85, 97, 69,104, 3, 66,241,239,163,160, +160,224,177,202,230, 44, 44, 44,172,244, 15,181,252,252,252,150,119, 33,238,205, 30, 86, 78,111,200,204,204,124,204,135, 16,163, + 15, 14, 5,133,159, 96,233, 45,160,160,160,160,160,160,160,160,184, 59, 96, 80,214,115,192, 29, 42,210,155,160,243,109, 92,123, + 27,229,164,156,148,147,114, 82, 78,202, 73, 57, 31, 58, 78, 95,220, 15, 76,111,198,123,209,206,177, 51,229,164,156,148,147,114, + 82, 78,202, 73, 57, 41,231,195, 8, 66, 8,173, 58,164,160,160,160,160,160,160,160,184, 91,160, 66,139,130,130,130,130,130,130, +130,130, 10, 45, 10, 10,138,251, 20,181,171, 86,173,122,182,118,237,218, 25, 0, 6,223,229,107, 13,108,209,162, 69,129, 76, 38, +219, 2,160, 54,189,245, 20, 20, 20, 84,104, 81, 80, 80, 60,208, 34,171, 97,195,134,123,206,157, 59, 87,119,219,182,109, 85,226, +226,226, 62,185,155, 23,107,214,172,217,204,221,187,119,135,253,241,199, 31, 93, 98, 98, 98,118,221,166,216,170, 93,173, 90,181, +179,181,107,215, 78, 7, 48,176,146,131, 56,184,101,203,150,133, 82,169,116, 51, 21,130, 20, 15, 1, 26, 0,104, 72,133, 22, 5, + 5, 5,197, 93, 20, 89,251,246,237, 11, 55, 24, 12, 56,119,238, 28,242,242,242,142,223,205, 11, 94,184,112,161,104,223,190,125, +136,143,143,199, 79, 63,253, 20,153,148,148,180,187,130,130,166,118,195,134, 13,247,156, 61,123,182,238,182,109,219,226,162,162, +162, 62,171,204,240, 61,250,232,163, 83,119,239,222, 29,186,101,203,150,174,145,145,145,183, 43, 4, 41, 40,254,203,144, 1,120, +129, 97,152, 67, 13, 26, 52, 56,153,146,146,114,130, 97,152,253, 0,250,225,193, 29,187,211, 63,108,216,176, 97,231,134, 13, 27, +118,210, 60, 66, 65, 65, 81, 9, 72, 73, 73, 73,209,106,181, 90,146,151,151, 71, 62,255,252,115, 18, 22, 22,102, 6,240, 39,128, +117,110,150,247, 1,168,252,228, 86,217,143,119,199,243,103, 88, 88,152,249,243,207, 63, 39, 87,175, 94, 37,103,206,156, 33,181, +107,215,214,251, 41,104,106, 55,108,216, 48, 95, 8,243,166, 77,155, 8,199,113,155, 43,243,166,168, 84,170,211,187,118,237, 34, + 87,174, 92, 33, 91,182,108, 33,209,209,209,185, 84,108, 81, 60, 32, 72, 4, 48, 51, 48, 48,176,176, 87,175, 94,228,219,111,191, + 37,235,215,175, 39,191,252,242, 11,153, 51,103, 14,233,208,161, 3,145, 74,165, 25, 0,198, 0, 8,121, 88,180, 8, 33,164,108, + 86,251, 13, 27, 54, 16, 0,237, 1, 32, 53, 53,149,138, 45, 10, 10,138, 59,197, 62,157, 78,215, 82,167,211,161,180,180, 20, 85, +171, 86,133, 88, 44,118,123, 96,110,110, 46,246,238,221,139, 17, 35, 70,156,201,206,206,110, 11,239,243, 94,134, 54,105,210,100, +223, 95,127,253, 85, 59, 40, 40,200,177,145,231,121,152,205,102, 88, 44, 22,152,205,102, 24,141, 70, 24,141, 70, 72,165, 82,200, +229,114,132,133,133,157,130,247, 42, 12,135,251,166,215,235,113,236,216, 49, 12, 26, 52, 40,175,160,160,160, 45,128, 11,149,120, + 95,106, 71, 69, 69,237, 90,186,116,105,100,114,114, 50,110,220,184,129,151, 95,126, 57,255,250,245,235,109, 42,249, 58, 20, 20, +247, 18, 99,159,122,234,169,169,209,209,209,108,131, 6, 13, 16, 27, 27, 11,163,209, 8,189, 94, 15, 66, 8, 56,142, 3, 33, 4, + 37, 37, 37,216,181,107, 23,254,250,235, 47, 99, 81, 81,209,247, 0,230, 1,184,232, 36,178, 30, 56, 45, 82, 78,104,165,166,166, + 50, 52,175, 80, 80, 80, 84, 18, 78,150,148,148, 52, 48, 26,141,208,106,181,126,157,112,245,234, 85, 12, 30, 60,248, 76,118,118, +246,227,112, 63,169,188,170, 73,147, 38, 7,119,237,218, 85,219, 96, 48, 64,173,246, 61,239,188, 84, 42, 69, 64, 64, 0,194,195, +195,247, 3,104,229,233, 75,188, 65,131, 6, 71,246,239,223, 31,166,215,235,113,252,248,113, 12, 28, 56,208, 92, 88, 88,184, 7, +128,167,192, 23,162,108, 30,213,235,110,246, 37, 0,120,211,254,133,239, 14,202,200,200,200,214,203,150, 45,147, 84,175, 94, 29, + 58,157, 14,253,250,245, 43,188,112,225, 66,115, 0,215,104,214,161,184, 15,113,225,220,185,115,181,108, 54, 27,242,243,243, 97, + 52, 26,161,211,233, 28, 66, 75, 36, 18,129, 16, 2,171,213,234,248, 48, 58,122,244, 40,182,109,219, 70,174, 94,189,250,145,253, + 89,122, 32,181, 8, 21, 90, 20, 20, 20,119, 11,181,107,213,170,117,252,247,223,127, 15,144, 72, 36, 88,191,126, 61, 62,250,232, + 35, 75, 97, 97,225,110, 87,241, 18, 29, 29,157,178,100,201,146,164,228,228,100,156, 56,113, 2, 79, 63,253,244, 7, 0,166,185, +225,124, 95,173, 86, 79, 53,155,205, 56,126,252, 56, 94,124,241,197,107, 57, 57, 57,167, 93, 69, 76, 82, 82, 82,155,207, 62,251, + 76,220,180,105, 83,168,213,106, 60,243,204, 51,186,243,231,207,183, 0,112,218, 67, 88, 63, 43, 44, 44,124,199,102,179,161,180, +180, 20,241,241,241,144, 72, 36, 94, 35,167,215,235,145,152,152,184, 63, 47, 47,239, 22,241, 22, 30, 30,190,253,198,141, 27, 29, +228,114,185, 87, 14,179,217,140,244,244,116, 72,165, 82, 24,141, 70,212,168, 81,227,123, 0, 67,104,214,161,184, 31,133,214,223, +127,255, 93,235,231,159,127, 70,147, 38, 77, 80,175, 94, 61,104, 52, 26,135,232, 50,153, 76,176, 88, 44,183,156,164, 86,171,241, +246,219,111, 95,132,189,250,252, 65, 21, 90, 66,195,180,137, 66,157,104,106,106,106, 59,154,103, 40, 40, 40,238,180,224,189,120, +241, 98,227,206,157, 59,239, 94,189,122,117, 68,143, 30, 61, 80,163, 70, 13,241,147, 79, 62, 25,169,211,233, 58, 57, 31,152,147, +147, 19,250,226,139, 47, 30,185,121,243,102,146,125, 83,115, 15,156,205,131,130,130,112,245,234, 85, 65,100, 53,131, 75, 53,163, + 84, 42,221,252,247,223,127,139,165, 82, 41, 14, 31, 62,140,193,131, 7,231, 95,187,118,205, 87,181, 92,136,201,100,130, 72, 36, + 2, 0,164,167,167,251,140,220,141, 27, 55,192,243,188,209,221, 62,150,101,101, 71,143, 30, 69,149, 42, 85,188,114,176, 44,235, + 42,232,138,105,182,161,184, 79, 97, 49,153, 76,104,214,172, 25,174, 93,187,134,163, 71,143, 58, 4, 87,126,126, 62, 50, 51, 51, +203, 29,124,232,208, 33, 28, 59,118, 12,109,219,182,117,229,121, 32,181,136, 67, 57,110,216,176,161,157, 61,114, 59,105,158,161, +160,160,168, 36,212,174, 82,165,202,174,165, 75,151, 70,198,198,198,162, 67,135, 14, 55,179,179,179,171,185, 57,110, 29, 33,164, +247,213,171, 87, 81,189,122,245,245, 0,250,220,206, 49, 9, 9, 9,121,135, 15, 31,142, 56,115,230, 12, 6, 14, 28,152,103,111, +243,229,171,237, 83, 82,221,186,117, 15,111,217,178, 37,140,101, 89,156, 62,125,218,159,170,195, 52,148,181, 47,185,238,102, 95, + 2,128, 15, 1,132,121, 56, 87, 89,171, 86,173,214, 71,142, 28,145, 48, 12,131,180,180, 52,161,234,176,153,157,151,130,226,126, + 67,223, 42, 85,170,124, 55,108,216,176,224, 22, 45, 90, 32, 61, 61, 29, 25, 25, 25, 40, 42, 42, 66,227,198,141,145,146,146,130, + 43, 87,174, 96,243,230,205, 56,118,236, 24,100, 50, 25,226,227,227, 17,184,252,103,124,205,224, 12,128,148, 7, 85,139,220,139, +185, 14, 41, 40, 40, 40,106, 75, 36,146,205,113,113,113,185,112, 63, 46, 85,232, 51,207, 60,147,105,179,217,200,149, 43, 87, 8, +202,122, 15,194,131,208, 34, 87,174, 92, 33,209,209,209, 87, 1,132,186, 57,102,112, 76, 76,204, 77,133, 66,113, 10, 21, 28,214, +161,102,205,154,121,231,207,159, 39, 55,111,222, 36,127,252,241, 7, 9, 15, 15,191, 27, 61, 2,107,215,169, 83, 39,191,180,180, +148, 24, 12, 6,178,107,215, 46,146,144,144,144, 7,218,243,144,226,254, 71, 16,128,201,201,201,201,134, 89,179,102,145,205,155, + 55,147,197,139, 23,147,169, 83,167,146, 81,163, 70,145,150, 45, 91,146,150, 45, 91,146,126,253,250,145,119,222,121,135,116,239, +222,157, 4, 6, 6,150, 0,120,242, 65,190, 41, 84,104, 81, 80, 80,252, 27, 72, 0, 48,199, 46,168,214, 61,243,204, 51,153, 70, +163,145,100,100,100,144, 53,107,214, 16,148, 13,221,224, 14,239,103,103,103,147,236,236,108, 97,104,132,171,248,103, 88,135,111, +237,188,119, 36,130, 18, 19, 19,243,142, 28, 57, 66,210,210,210,200,166, 77,155,136, 93,176, 85, 26,228,114,249, 22,181, 90, 77, + 12, 6, 3,217,190,125, 59, 29,222,129,226, 65, 68, 20,128, 5,245,235,215,183,204,157, 59,151,172, 91,183,142,124,254,249,231, +164,111,223,190,100,204,152, 49,164,127,255,254, 36, 50, 50,210, 8, 96, 6,128,224, 7,253,102,220, 11,161, 69,103, 54,167,156, +148,147,114,186, 98,243,153, 51,103,136, 0,155,205, 70, 50, 50, 50,200,150, 45, 91, 72, 76, 76,204,105,148, 31, 79,203,153, 83, + 85,175, 94,189,115,231,207,159, 39, 55,110,220, 32,102,179,217,193,113,238,220, 57, 2, 96,103, 37,132,179,118, 92, 92, 92,238, +142, 29, 59,200,249,243,231, 73, 76, 76,204,205,202,140,123, 98, 98, 98,110, 94, 94, 30,217,190,125, 59,137,140,140,244, 37,178, +104, 94,162,156,247, 51,103, 34,128,101, 77,155, 54,181,205,159, 63,159,252,239,127,255, 35, 9, 9, 9, 54,251, 71, 81,220,195, +162, 58,157, 27,195, 83, 80, 80, 80,220, 43,200, 14, 28, 56, 0,153, 76,230,216,112,226,196, 9,231,113,180, 60,141,219,160, 62, +123,246,236,227, 61,122,244,216, 61,127,254,252,122,206,189,152,118,236,216, 1, 0,198, 74, 8,219,133,140,140,140,182,221,186, +117,155, 23, 30, 30,254, 72,118,118,246,132,202,140,120, 90, 90,218, 59, 13, 27, 54,156, 86, 90, 90,170,214,233,116,253, 64,199, +206,162,120,112,145, 6, 96,208,209,163, 71, 63, 57,122,244,232, 7, 0, 8,128, 41, 0,206, 62,108, 55,130, 10, 45, 10, 10,138, +123,141,193,175,190,250,170,107, 99,241,195, 0,190,240, 34,178, 4, 20, 93,187,118,173, 85,207,158, 61,135,161,124,239, 68,161, +113,122,101,224,130,201,100,234,234,218, 83,170,146,240, 83,118,118,246, 79, 52, 11, 80, 60, 68, 56, 13,160,255,195,124, 3,168, +208,162,160,160,184,215,184, 14,224,229, 59, 56, 95, 13,247,227,108, 81, 80, 80, 80,252,231, 64, 39,149,166,160,160,160,160,160, +160,160,160, 66,139,130,130,130,130,130,130,130,226,254, 2, 3,207, 61, 7,182, 85,128,231,118,122, 52,108,163,156,148,147,114, + 82, 78,202, 73, 57, 41,231, 67,199,233,139,123, 27, 30, 16,208,225, 29, 40, 39,229,164,156,148,147,114,222, 13, 78,198,190,176, +246, 69, 88,255, 47,199,157,249, 15,199,253, 97,225,124,224,240,111, 14,239, 32, 36, 4,143,178, 46,159, 20,255, 61, 56, 63, 32, +132,166, 19, 5, 5, 69, 5,203, 14,145,211,203,214,102, 95,240, 31, 44, 75,156, 69, 1,127,135,239,165,187, 17,247,135,153,243, +129,128, 55,161,245,136, 82,169,252, 72, 42,149, 38, 51, 12, 99,211,106,181, 39,141, 70,227, 34, 0,251,239,240,154,223, 70, 71, + 71, 15, 46, 40, 40,224, 89,150, 5,203,178, 96, 24, 6, 44,203, 66, 44, 22,235, 75, 74, 74, 84,183, 67, 26,217,160,239,187, 28, +195,140,180, 17,219,162,220, 83,235,167,250,218, 78,225,253,129,145, 72, 36, 79,133,133,133,133,228,229,229, 17,150, 45,107,202, + 39, 18,137,132,137,112,173, 37, 37, 37, 63,248, 75, 22, 26, 26,122, 40, 44, 44, 44, 68, 56,159, 97, 24, 20, 20, 20, 20,231,230, +230, 62, 10, 0, 1, 1, 1,123,149, 74,101, 56,199,113, 16,137, 68, 16,137, 68,208,233,116, 5, 5, 5, 5,143,211,164,184, 63, +177,106,213, 42, 81,183,184,151,107,112, 68,223,136,101, 73, 48,207, 51, 37, 86, 70,126, 98,115,198,183,151,253, 57,191, 95,191, +126, 54,122, 23,239, 29,164, 82,233,220,232,232,232, 87, 52, 26,141,142, 97, 24,194, 48, 12, 24,166,236, 59,203,245,215,102,179, +165, 23, 20, 20, 52,243,241,178, 21, 75,165,210,217, 49, 49, 49, 47,234,116, 58,157,157,207, 45, 47, 0, 88, 44,150,244,252,252, +252,102,126,149,245,145,145,139,228,114,249,243, 58,157, 78,203, 48, 12,239,226, 30, 56,191,204,175,228,231,231,183,241, 37, 12, +164, 82,233,188,232,232,232,151,236,113,119,132,243, 78,227, 30, 29, 29,253,162, 86,171,245,139,211, 75,220,111,225,188, 27,225, +252,143,114, 62,248, 66,171,113,227,198, 63, 31, 60,120,176,150, 88, 44, 6, 0, 24, 12,134,134, 11, 22, 44,120,225,189,247,222, +155, 1, 96,220,109, 94,111, 73,155, 54,109, 6,236,218,181,139, 93,183,110, 29,219,188,121,115, 48, 12, 3,155,205, 6,155,205, +134, 6, 13, 26,200,111, 55, 34,193, 74,197,216, 99, 91,191, 14,120,164,243,171, 35,115,129,169,190,182,123, 19,152, 0,198, 3, + 72,174, 96, 16,242,236,247,229,152, 7,177,177,143,101,217, 10,113,242, 60,127,181,168,168,168,149, 23, 1, 83,233,156,118,145, +245,116,155, 54,109,130,183,109,219,198,220,188,121,147,145,203,229,224,121, 30, 54,155, 13, 22,139, 5,245,235,215,175,144, 19, + 26, 18, 18,162, 26, 59,118,108,141, 39,158,120, 2,107,214,172,193, 11, 47,188,128,214,173, 91, 95,204,205,205, 5, 0, 40,149, +202,240, 51,103,206,212, 10, 11, 11,131, 78,167, 67, 73, 73, 9,186,116,233,130,130,130,130,251,250,225,122,172,113,252, 20,134, +101, 28, 99, 69, 17,171,173,240,224,137,204,241,119,202, 27, 22, 22,118, 76, 38,147, 69,251, 84,203, 78, 47, 50,131,193,144, 83, + 88, 88,216,196,199, 41,137, 0,122,137, 68,162,154, 28,199,213, 1,144,104,181, 90,163, 1, 64, 34,145,228,136, 68,162, 52,139, +197,114,222,100, 50, 93, 2,240, 27,188, 76,128,220, 45,238,229, 26,140, 85,247, 76,169,145,239,161,168, 62,163,182,238,202,216, + 11, 10,153,110, 83,183,184,151, 87,251, 43,182,254, 69,212, 6,176, 18,101, 19, 74,255, 15,101,227, 0,221, 9,226, 0,244, 70, +217,156,143, 73,102,179, 57, 31,192, 81,148,181, 67,185, 8, 32, 33, 50, 50,242, 39,158,231,141, 5, 5, 5, 47,195,205, 68,213, + 45,154, 86, 61,194,178,108,188,224, 9,240,196,150,126,224,104,122,165,188,160, 88,150,157,151,154,154,250,210,234,213,171, 21, + 71,143, 30, 85,212,171, 87,207,241, 65,196,243,252, 45,109, 76,146,146,146,124,185, 26, 28,203,178,115,159,121,230,153,231,150, + 45, 91,166,184,126,253,186,162, 74,149, 42, 14, 78,103,177, 37,160, 74,149, 42,254,230,253,111,187,118,237, 58,104,233,210,165, +226,245,235,215,203, 35, 34, 34, 16, 30, 30, 14,137, 68,114,203,177,143, 63,254, 56,239, 59,234,236,188, 62,125,250, 12, 90,177, + 98,133,226,224,193,131,138, 6, 13, 26, 64, 36, 18,221,113,220,251,246,237,251,220,207, 63,255,172, 56,121,242,164,162,102,205, +154, 16, 76, 5, 87, 62,150,101, 81,181,106, 85,191, 56,123,247,238,253,220,202,149, 43, 21,199,142, 29, 83,212,169, 83,199,113, + 63, 9, 33,183, 29,206,255, 56,231, 67,225,104, 73,205,102, 51,118,238,220, 9,150,101, 17, 22, 22,134,193,131, 7, 99,235,214, +173, 99,183,111,223,190,225, 54,156,173,111,237, 34, 75, 12, 0,191, 60,223, 23, 87,197,192,136, 92, 19, 36, 18, 9,174, 92,185, + 2,145, 72, 84, 97,107, 81, 38,147,189, 72, 8,249, 80,151,113, 88,166,215, 91, 96,200, 60,162,144,203,229,142, 23,128, 46,211, +190, 61,235,136, 66, 46,151, 95, 17,137, 68,147, 53, 26,205, 18, 79,124, 53,107,214,252,241,244,233,211,117,221, 61,184,222,160, +211,233, 80,173, 90,181,132,194,194,194,154,238,246,139,197,226,248,235,215,175, 71, 73,165, 82, 16, 66, 28, 15,177,235,175,240, +223,108, 54,163,126,253,250,102,111,215,244,198,105,181, 90, 17, 16, 16, 0,193,141, 50,153, 76,208,104, 52,190, 56, 25,137, 68, +242,148, 32,178, 0, 96,249,242,229,136,137,137, 65, 84, 84, 20,148, 74, 37,228,114,185,131,211, 95,136, 68, 34,116,235,214, 13, + 31,127,252, 49,102,204,152,129,209,163, 71,151, 43,104,197, 98, 49,194,194,194,240,199, 31,127, 64,165, 82, 33, 33, 33, 1,130, +192,191,175,109, 65,150, 9,219,127,228,134,195,161,237,222,177, 46,247, 88, 19,238, 75,251,171, 18, 44, 11,240,124,217,171,147, + 97, 64,172, 22,190,232,200,201,204, 9,126,220,207, 42,105,105,105, 81,254,222, 35,171,213,138, 42, 85,170,136,124, 28,214, 35, + 37, 37,229,151,161, 67,135, 74,106,214,172,201, 72, 36, 18,112, 28, 7,142,227, 4,129,158, 64, 8, 73,224,121,190,125, 78, 78, + 14, 89,176, 96,193, 39, 59,118,236,120, 18,192, 38,183, 5, 11,209, 55, 42, 53,242, 61,118, 31,199,163,207,116,126, 15,127,172, + 26,251,104,155,198, 60,130, 20,250,203, 0,254,203, 66,171,118, 74, 74,202,241,131, 7, 15, 6,152,205,102,180,104,209,226,192, +133, 11, 23,154,226,246, 70,112, 15, 5,240,217,184,113,227, 6, 13, 29, 58, 84, 20, 18, 18, 2,169, 84,138,210,210, 82, 92,190, +124,249,197, 31,126,248,129,124,245,213, 87, 95, 0, 8, 74, 75, 75,107,121,232,208, 33,116,232,208,225, 77, 0,111,223,170, 8, + 68,241,123, 15, 93,139, 18,214,123,119,107, 40,105,217,140,205, 41,115,113, 92,143, 38,224,109,124,250,161,191, 51,252, 17, 98, +159,244,237,219,119,224,234,213,171, 3, 1, 96,225,194,133,120,234,169,167, 16, 22, 22, 6,133, 66, 1,137, 68, 2,177, 88, 92, +238,215,199,203, 86, 4,224,147,254,253,251, 63,179,108,217,178, 32, 0, 88,182,108, 25,250,246,237,139,240,240,112, 4, 5, 5, + 65, 42,149, 66, 36, 18, 85,248,102,134,133,133,125,219,250,209, 71,135, 44, 93,186, 20, 0,240,193, 91,111,225,137,199, 30, 67, +160, 66, 14,133, 92, 10,225, 94, 72, 69, 98,116, 31, 49,210,167,190, 4, 48,235,169,167,158,122,118,197,138, 21, 65, 0,112,244, +232, 81,228,230,230, 34, 58, 58, 26,114,185, 28, 82,169,212, 17,103,134, 97, 32,151,203,253,138,251, 83, 79, 61,245,204,207, 63, +255, 28, 4, 0, 75,150, 44, 65,183,110,221, 28,113,151,201,100,144, 72, 36,229, 22, 87,209,233,142,243,201, 39,159,124,102,229, +202,149, 65, 0,240,195, 15, 63,160,115,231,206, 8, 13, 13,117,220, 79,129,171, 34,105,244, 31,231,124, 56,132,214,241,227,199, +159, 86, 42,149,211, 1, 68, 74,165,210,144,231,158,123,174,234,144, 33, 67,208,191,127,127,108,223,190,253,245, 10, 10, 45, 38, + 58, 58,122,240,174, 93,187, 28,111,104, 19,185, 69, 48, 85,248, 5,110,199,135, 71, 94,127, 61,102,198,101, 13, 14, 28, 58,143, + 0,176,204,161, 89,179, 34, 13,151, 46,193,102, 50, 97,210,149,210,178,237, 86,194,236,124,103, 68,204, 35,115,191,248, 16,192, + 18, 47, 46,128,204,104, 52,226,226,197,139, 21, 10,196,205,155, 55,193,243,188,209,155,187, 32,145, 72,112,234,212, 41,191,122, + 33, 36, 36, 36,120,123, 0,125,114,110,222,188, 25,163, 70,141,194,249,243,231, 33, 76, 85,226, 7, 39, 19, 22, 22, 22, 34,136, + 44, 65, 4,201,229,114,136,197, 98,134,227, 56, 70,168,218,179, 63, 92,126, 9, 99,150,101,241,227,143, 63, 98,230,204,153, 24, + 51,102, 12, 22, 45, 90,132, 70,141, 26,253,147, 9, 57, 14,106,181, 26,161,161,161, 8, 13, 13, 45, 39, 16,239,103,184, 38,243, +236, 57,243, 21,224, 73, 89, 35, 16,194, 3, 60, 64, 64,192, 19, 30, 57, 25,151,241,209,199,159,250,253,246, 17,139,197,184,116, +233,146, 35, 31, 8,206,176, 32,140,156, 93,131,196,196, 68,159,121, 73, 34,145, 76,252,245,215, 95,165, 63,254,248, 35, 86,172, + 88, 1,134, 97, 32,147,201,160, 84, 42, 17, 18, 18,130,240,240,112,199, 18, 31, 31,207,124,247,221,119,146, 70,141, 26, 77, 84, +171,213,155,220,167, 57, 9, 86, 84,159, 81,251,153,206,239, 1, 0,158,121,143,160,232,226,212, 71,216,226, 9,193,255,101,145, +213,176, 97,195, 61,251,246,237, 11,208,233,116,224,121, 30,155, 54,109, 82,116,238,220,121,247,181,107,215,218, 84, 84,108, 37, + 38, 38,174,223,183,111,223,227,145,145,145, 40, 41, 41,129, 90,173,134,197, 98,129, 72, 36, 66, 66, 66, 2, 62,249,228, 19,166, + 79,159, 62,195, 95,124,241, 69,131, 92, 46, 23,156,141, 68,247,121,169,124,102, 90,240,249,151, 33,132,148,229, 31,194,147,114, +191,133,185,105,120,235,157,143,252, 10, 99,213,170, 85,255,183,102,205,154, 64,103,103,201, 89, 4, 56,139, 44, 97,241, 33, 12, +216,106,213,170, 13,249,233,167,159, 28,156, 17, 17, 17,224, 56, 14, 98,177, 24, 28,199,129,101, 89,236,222,189, 27,211, 39,142, + 67,104,100, 21,204,255,124,161,207,112, 70, 70, 70, 46,234,214,173,219,243, 75,150,252, 83,116, 55,172, 94, 29, 61, 31,127, 12, + 81, 17, 42, 68,132, 6,149,221, 39,158,193,137,243,215,124,190,143, 0,176, 85,171, 86,125,121,213,170, 85,129,206, 31,132, 66, + 92,133,143,103,193,197, 55,153, 76,104,214,172,153, 95,113,119,230, 20,220, 54, 65,180, 9,247, 83,184,142,240,188,250, 8,231, + 16, 65, 8,219, 5,103, 57, 14,177, 88,140, 85,127, 44,245,232,102,223, 46,103, 69,211,221,149, 51, 45, 45, 13,211,166, 77,131, +240,209,230,220, 84, 40, 46, 46, 14,243,231,207,247, 89, 46,185, 60, 3,205, 1, 68, 58,109, 50, 1,144, 58,253,230, 49, 12,115, +216,205,113,194,118,177,189,198, 42, 18,101,237,198, 74, 1,132,184,225,243,196,147,111,127,231, 69,186, 28, 95,238, 58, 30,133, +214,134, 13, 27,132,167,184,125,106,106,234, 78,251,255, 98,153, 76,118, 83,161, 80,196, 0, 40,221,180,105, 19, 94,123,237, 53, +216,173,213,222,193,193,193,167,221,184, 58,199,141, 70,227,123, 0,114,236,155,132, 46,154,108, 97, 97, 33,191,117,235, 86,118, +217,147, 93, 97, 34, 64,227, 15,167,163, 91,106, 42, 54,199, 73, 33, 2,240,232,185,124, 40, 20, 10, 78,173, 86, 91,156,219,109, +185,105,187,181,205, 37, 67,137, 2, 56, 14, 45,246,108,196,168, 61, 27,241,168, 82,138,130,213, 43, 81,186,119, 23, 88,150, 65, + 91,101, 4, 70, 15,220,138, 86, 42, 25,164, 70, 45, 88,150,117,151,179, 29,156, 23, 47, 94,236,167, 82,169,166,187,220, 96,127, +112, 21,101,243, 56,193, 67, 56, 65, 8, 65,163, 70,141,192, 48,140,195, 45, 16, 22,225,161, 19,150, 99,199,220,214, 64,122,228, +180, 87,193, 65,169, 84,226,207, 63,255,116, 28,211,169, 83, 39, 24, 12, 6,132,133,133,249,197,153,151,151, 71, 50, 51, 51,153, +101,203,150, 65, 44, 22, 35, 60, 60, 28, 10,133,130, 89,186,116,233, 56,137, 68, 18,111, 48, 24,120,147,201, 4,169, 84, 58, 95, + 72, 31,142,227,180,106,181, 58,220, 19,167, 72, 36,194,208,161, 67,241,238,187,239, 98,209,162, 69,120,253,245,215,111,113,188, + 12, 6, 3, 34, 34, 34, 28, 98,203,205, 3,120, 55,186,251,222, 93, 78,158,224,244,177,205, 56,115,114, 27,120, 27, 15, 27, 79, + 64,136, 13,188, 21, 56,186,245, 64,173,172,171,153,113, 4,164,172,233, 45, 0, 89,137,198,218, 46, 92, 90, 7,192,186,157, 5, +166,185,190,194,201,113, 28, 12, 6, 3,126,253,245, 87,156, 59,119, 14,155, 54,109,130, 94,175, 71, 68, 68, 4, 66, 66, 66,240, +216, 99,143,225,197, 23, 95, 68, 98, 98,162,207,184, 19, 66,150,220,188,121,179,113,235,214,173,153,226,226, 98, 20, 23, 23, 67, +175,215,195,102,179,193,106,181,130,227, 56, 4, 4, 4, 64, 46,151, 35, 58, 58, 26, 6,131,129, 24,141,198, 37,158, 56,121,158, + 41,209, 93, 25,123,225,143, 85, 99, 31,125,230, 61,130,213, 51, 25,212,168, 38,211,253,121, 36,104,200,186, 61,163,187, 0, 32, + 60,113, 88, 11,196, 98,227,243,223, 29,247,217,240,123,158, 70,183,138,172,112,189, 94,143,210,210,210, 50, 91, 95, 42,197,234, +213,171, 35,122,245,234,181, 43, 51, 51,179,173, 23,177,117, 11,103, 80, 80, 80,130, 72, 36,194,169, 83,167,240,213, 87, 95,225, +207, 63,255, 68, 78, 78, 78, 81,149, 42, 85,130,219,183,111,207,190,245,214, 91,104,220,184, 49,190,255,254,251, 0, 95,156,132, + 16,164, 93,220,141,180, 75,123,192,243,101,174,117,217,226,254, 63,241, 51,238, 90,173,214,112,252,248,241,192,111,190,249, 6, + 81, 81, 81, 72, 74, 74,130, 66,161, 64, 64, 64, 64,185,151,172,243,139,215,215,179,169,215,235, 13,105,105,105,129, 63,255,252, + 51,194,195,195,145,152,152, 8,133, 66, 1,169, 84, 10,142,227,192, 48, 12,150, 45, 91,134,229, 31, 15, 68,218,249,147,232,219, +179,139,207,112, 42, 20,138,231,151, 44, 89, 82,206, 2,137, 14, 13, 5, 39,102, 33, 18, 51, 8,237,244, 36, 0,160,104,251, 90, +111,163, 67, 58,115, 50,165,165,165,134,131, 7, 15, 6, 30, 57,114, 4, 60,207, 35, 49, 49, 17, 58,157, 14, 42,149,202, 17,255, +173, 91,183,162, 79,159, 62,248,241,199, 31,209,178,101, 75,159,113,215,104, 52,134,147, 39, 79, 6,254,244,211, 79, 8, 11, 11, + 67,213,170, 85, 29,113, 23, 22,177, 88, 12,145, 72,132,228,228,100,148,148,148, 32, 48, 48,208,103, 26, 29, 61,122, 52,240,167, +159,126, 66,104,104, 40,226,227,227, 29,142,155, 32,142,102,126,249,113, 57,130, 0, 38,246,142, 57, 43,154,238,174,156,125,251, +246, 69,141, 26, 53,160, 82,169,160, 84, 42, 29,220,222, 56, 61,104, 17,135,222,102, 24,102,131,211, 51,145,202, 48,204, 6,231, + 95, 79,199,217,255,182, 29, 55,110, 92,179, 25, 51,102, 76,107,217,178,229,207,251,246,237, 91,238,137,207, 19,207,184,113,227, + 82,102,204,152, 49,205,249,120, 55,215,241,236,104,165,166,166, 50,246, 72, 50, 0,146,154, 54,109,122,120,251,246,237, 97, 65, + 65, 65,142,131,111,220,184,129,226,226, 98, 4, 5, 5,169,102,207,158,173,106,223,190, 61,162,163,163, 29, 95, 0, 23, 47, 94, +172, 95,187,118,109, 53, 0, 87,223,150,103, 89, 22,173, 90,181,194,105,123,109, 71,183,212, 84,196,199,199, 59, 26,121, 4, 4, + 4, 96,248,240,225,204,168, 81,163, 56,193,205, 32,132, 64,175,215, 35, 54, 54, 86,238,205,213, 1,128, 20,125, 62,214,182,111, + 11,150, 1,116,199, 14, 65, 34,101,192,138, 24, 52, 33, 5,248,189, 67, 91, 48, 0, 76,127,239,135, 31, 46,204, 49, 0, 93,238, +142,195, 65,112,249,242,101,191, 28, 45,123,188,152,219,229, 20, 28,141,125,251,246,193,102,179,249,203, 73, 88,150,133, 82,169, + 68, 76, 76, 12,228,114, 57, 20, 10, 5,243,243,207, 63,143, 79, 74, 74,138, 29, 53,106, 20,171, 86,171,217, 86,173, 90,225,169, +167,158,226,132, 42,206,148,148, 20,159,113,217,185,115, 39,190,250,234, 43,188,254,250,235,110, 29, 45,134, 97, 16, 25, 25, 9, +149, 74,133, 7, 5, 60, 0,179,213, 2,157, 70,239,168,210,181,217,108, 56,185,227,239, 90, 87,255,190,152,178,225,231, 31,197, + 0, 96,216,177,214,249,180,216,167,190, 92, 89,187, 93,168,248,224,206, 34,203, 65,111,121,158,227, 56, 12, 30, 60, 24, 51,102, +204,192,243,207, 63,143, 77,155, 54, 97,194,132, 9,120,229,149, 87,110,113,181,124,125, 57, 90, 44,150,175, 95,120,225,133,215, + 87,175, 94, 93,231,189,247,222, 99, 5, 71, 75,161, 80,128, 97, 24, 24, 12, 6, 24,141, 70,232,245,122,156, 63,127,158,127,245, +213, 87, 47,152, 76,166,175, 61, 86, 87, 50,242, 19, 10,153,110, 83,245,120,182,134,246,218,167, 65,173, 31, 75,212, 51,242,166, + 37, 79,214,238, 76,122, 12, 78, 12, 5, 33, 32, 60,192, 19,192,104,212, 98,248,240, 55, 69,255, 98, 82, 57, 68,150,193, 96,192, +241,227,199,209,161, 67, 7,220,188,121, 19,103,207,158, 69,173, 90,181,176,116,233,210,200,231,158,123,110, 87,110,110,110, 91, +127,157,173,147, 39, 79,142,123,228,145, 71,230,105, 52,154, 66,141, 70, 51, 15,192,114, 0,197,151, 47, 95,174,119,249,242,229, + 5,155, 55,111,110,243,209, 71, 31,137, 92,218,232,136, 60,217,163, 22,139, 21,122,189,209,171,192, 18,214, 9,225,253,138, 56, +195, 48,164, 78,157, 58,232,213,171, 23,196, 98, 49, 20, 10, 5, 2, 3, 3,203, 85,155,185, 10, 46,111,229, 7, 0,158, 97, 24, + 84,169, 82, 5, 61,122,244,128, 68, 34, 41,199, 41,228,195, 30, 61,122, 96,228,164, 15,241,245,200,142,248,234,133, 90,232, 60, + 37,199,107, 56,117, 58,157,230,175,191,254,146,191,251,250,235,120,164,102, 77, 68,168, 84,168, 22, 29, 9,185, 76, 10,137,115, +152, 24,191, 76,118, 2,128, 23,137, 68,104,208,160, 1,114,114,114,112,237,218, 53, 92,187,118, 13, 44,203,162,117,235,214, 14, + 23,230,210,165, 75,152, 52,105, 18,140, 70,163,223,113,175, 89,179, 38, 58,118,236, 8,169, 84, 10,133, 66, 81,174,202, 80,184, +167,165,165,165,168, 81,163, 6,214,173, 91,135,218,181,107,251,228,172, 91,183, 46,218,181,107, 87,238,126,202,229,114,135, 40, + 2,128,155, 7, 53,142,107,196,197,197, 85,136,115,203,161, 27,248,102,235, 95, 48,154,120,168,117,150,114, 39,196, 70,168,176, +231,167,247,252,138,187,192,185,120,241, 98, 20, 23, 23, 59,140, 3,225,163, 92, 48, 81,170, 86,173,138,133, 11,221, 59,153, 46, + 90,196,221, 59, 47,213,207,247,173,112,156,144,185,100, 51,102,204,152,230,122,190, 47, 62,231,253, 46,231,155, 92,196, 89, 78, +133,170, 14,101, 50,217,251,127,253,245, 87, 88, 73, 73, 9, 46, 93,186, 4,150,101, 29,117,234, 28,199,193,108, 54,227,202,149, + 43, 8, 11, 11, 67,110,110, 46,100, 50, 25, 68, 34, 17, 76, 38, 19, 0, 52,241,244, 2, 39,132, 96,100, 94, 89, 19,161, 63,170, + 72,144, 6,160,103, 94,217,131, 33, 52,136, 95,179,102, 13, 2, 3, 3, 17, 20, 20,228,248,245, 85,141,116,242,218,101,228,136, + 25,176,251,119,131, 97, 1,150, 1, 24, 17,192,178, 4, 44,195,128,221,191, 11, 12, 3, 40,195, 67, 43, 90, 0,251,106, 24,239, +181, 1,188, 39,247,201,157,139,229,250,127,199,142, 29,240,151,179, 70,141, 26, 8, 12, 12,116, 44,155, 55,111, 46,231,104,217, +108, 54,132,135,135,251,195, 73,202,220, 8, 30, 81, 81, 81, 16,139,197,204,210,165, 75,199, 37, 39, 39,199,190,243,206, 59,172, + 72, 36,194,177, 99,199,112,230,204, 25, 36, 38, 38,250,221,102,171,184,184, 56,107,220,184,113,182,113,227,202,250, 80,164,164, +164,160,184,184, 56, 87,216,175, 86,171, 11,186,118,237, 90,174,221, 70,126,126,254,253,221, 18,222,126, 31,173,102, 43,116, 6, + 3, 52,165, 58,135, 59,148,155,153, 19,242,222,168,183,197,179,134,191, 4, 0, 24, 53,247,115,148, 46,250,167, 32, 91, 59,106, + 64,212,147,159,173, 24, 11,160,143, 55,126,141, 70, 3,131,193,128,234,213,171, 99,223,190,125, 40, 45, 45, 69,247,238,221,193, + 48,140,163,135,104, 5, 96,202,200,200,120, 60, 53, 53,245,240,156, 57,115,170,215,171, 87,143,209,106,181,208,233,116,112,254, + 61,121,242, 36, 89,190,124,249, 85,157, 78,215,202,110,157,187,197,230,140,111, 47,119,139,123,121,245,159,199, 68,169, 81, 53, + 46,168, 50,138,170, 91, 11, 50,100, 90,181,254,188,193, 70,206,128,216, 0, 27,120, 16, 43, 15,155,189,218,235,223,130, 92, 46, + 95,176,103,207,158,112,131,193,128,163, 71,143, 98,208,160, 65,166,252,252,124, 41, 0, 60,255,252,243,166,101,203,150, 73,107, +212,168,129,165, 75,151, 70, 62,245,212, 83,171,180, 90,109, 3, 63,169,127,204,202,202,250,209,117, 99,120,120,248,252, 27, 55, +110,180,119,110,243, 99,181, 90, 29,193,113,251, 96,242,128,197, 98,129, 94,111, 68, 73, 73, 41, 76,102,139,189,204,228, 97,179, + 89,237,191, 60,172,246,114, 84, 42,225,130,154, 52,136,209, 16, 66,192, 50, 76,241,209, 83,217, 85,189,137,118,119, 85, 92,126, +186, 89,174,176, 9,189,204,194,195,195, 33, 22,139,241,227,143, 63,226,196,222,205,144,138, 8,108, 86, 11,172, 22, 51,108, 22, + 19,196, 34, 17,254, 60,118, 13, 93,234, 6,249, 37, 8, 35, 34, 34,208,179,101, 75,164,182,108, 89,214,189,141,227, 16, 40,147, + 65, 33, 9, 40,115,178, 0, 16, 27,235,239, 32, 2,188, 16,206,232,232,104, 28, 57,114, 4, 35, 71,142,196,204,153, 51, 33,151, +203, 29,189,159,207,157, 59,135,149, 43, 87,162, 75,151, 46, 21,142,187,224,224,141, 29, 59, 22,153,153,153,152, 59,119, 46,154, + 54,109, 10,177, 88,140,226,226, 98,180,106,213, 10, 57, 57, 57,126,113, 58, 87,239, 73,165,210,114,238,147, 32, 0, 43,154, 70, +206,156, 47,245,141,197,250,189,203,193,128,193,129,159,222, 46, 39, 10, 23,174,216, 93, 97,206, 9, 19, 38,148, 11,167, 63,110, +150,191,112,113,157,124, 30,199, 48,204, 81,193,108, 29, 59,118,236,251, 12,195,108, 24, 59,118,236,251,211,167, 79, 63,237, 15, +159,187,253, 12,195,108,180,139,176,158, 78,219,142, 86, 72,104, 41, 20,138, 71, 3, 3, 3,113,233,210, 37,116,239,222,221, 84, + 80, 80,112, 65, 44, 22,215,202,207,207,151,229,230,230, 66,167,211,105, 38, 79,158,124, 13,128,188, 69,139, 22, 53,254,252,243, + 79,220,188,121, 19,203,150, 45, 3,128,181,238,219,108,176,224,121,222,145, 41, 92, 63,219, 68, 34, 17,246,239,223,143,253,251, +203, 55,253,250,230,155,111,124,190, 48,158,250,245, 55, 28, 59,118, 12,206,195, 3, 8,255,157,183, 5, 4, 4, 0,222,123,120, +148,131,175,134,241,190, 26,192,187,131,191,109,191,220,245,204,241,132,140,140, 12,143,231,239,223,191,191,156,163,229,139, 83, + 36, 18,193,102,179, 65, 46,151, 51, 18,137,132,145, 72, 36,241,130,200, 18,137, 68,142, 7, 70, 38,147, 65, 38,147,149,251, 74, +245,132,204,204,204, 14,153,153,153, 30,247,231,229,229, 61,158,151,151,135, 7, 17,102,139, 5,122,157, 9,165, 26, 61, 38, 78, +255,190,108,227, 68, 28, 4,112,240,241,255,141,196,208,110, 93, 58, 86,180,154, 90,184,223, 81, 81, 81,216,185,115, 39, 24,134, +193,170, 85,171, 16, 28, 28,140,110,221,186, 65,165, 82, 97,236,216,177,232,215,175, 95, 69, 11,179,146,130,130,130,199,223,122, +235,173,195,159,126,250,105,181,170, 85,171,194,100, 50,193,108, 54,195,100, 50,225,242,229,203, 88,190,124,249, 77,157, 78,247, + 56,128, 18, 95,100,155, 51,190,189,252,203,174, 81,153,157,251, 63,165, 63,151,243, 7,178,179, 11, 96,181,102,128,183, 89, 97, +182,218,202, 28, 62,171, 21, 86,171, 13, 18,137, 72,245,233,212,183,183,242, 32, 96, 89,198, 4,224,137,123,149, 70, 33, 33, 33, + 41,121,121,121,184,120,241, 34, 94,124,241,197,236,130,130,130,179, 0, 58, 1, 64, 65, 65,193,158, 65,131, 6,213, 91,178,100, + 73, 76, 82, 82, 18, 2, 3, 3, 85, 90,173,214, 23,101, 32,128,161, 0,186,162,172, 29,136,128, 66, 0,147, 89,150,149, 29, 61, +122,244,150,158,118,187,118,237, 2,128,131,238,191,128,236,142,150,193,128,188,130, 34,188,242,191,241,255,124, 25,129,148, 19, + 23, 4, 4,111,140, 64, 0, 0,228,231, 92,198, 75,175,140,148,249,250, 32,112,247, 34,172, 64, 27,157,114, 31,106, 66, 30, 13, + 12, 12, 44,171,126, 91,183, 28, 27, 63,251, 31, 96, 51,131, 88,244,128, 89, 7,152, 53,224, 77, 58, 48, 18, 57, 96,209,251, 37, +180, 2, 3, 3, 17, 40,151, 35, 42, 36,164,108, 16, 72,145, 8, 98, 49, 7,222, 2, 48, 54,198, 33, 72,121,255, 6, 6,113,124, + 84,202,229,114,164,165,165, 97,232,208,161, 48,155,205,232,219,183, 47, 76, 38, 19, 12, 6, 3,244,122, 61,146,147,147,161,211, +233,252,226, 19,122, 43, 6, 6, 6, 66, 34,145,224,237,183,223, 70,179,102,205, 48,105,210, 36,140, 25, 51, 6,201,201,201,120, +227,141, 55,176,124,249,114,164,164,164,248,226, 37,206,105, 36,220, 79, 65,108, 57, 87,241, 1,168,112, 26,185,114, 50, 12, 91, + 78,176, 9,203,155, 47,116,170, 48,231,140, 25, 51,144,151,151,119,139,147, 37,252,143,139,139,195,151, 95,126,121,187, 53, 67, +130,123, 20,237,102, 95, 79, 87, 39,138, 16,210,220,222,118,202, 56,125,250,244,211,211,167, 79, 79,101, 24,102,195,244,233,211, + 83, 61, 57, 90,238,120,220,236,247,251,165,197,185,212,141,182,119,222, 41,220,232,176,176, 48, 81,181,106,213, 88,149, 74,133, +226,226, 98, 68, 70, 70,146,188,188,188,254, 10,133,226,227,159,127,254,185,134, 70,163,193,185,115,231, 48,127,254,252,131, 0, +230,121, 19, 90,155, 34,237,214,177,221,201,114, 94,239,213,171, 23,146,146,146,202,185, 89,114,185,220,107,230, 17,246, 9,142, +144, 72, 36, 66,237,218,181,229, 87,175, 94,213, 75, 36, 18,196,199,199,203,179,179,179,245, 18,137,164,194, 61, 93,124, 53,140, +247,213, 0,222,157,240,105,222,188,121, 57, 7,203,249,215,249,255,250,245,235,125, 86, 29, 10,156,245,234,213,115,220,175,160, +160, 32,225, 92, 0, 64,247,238,221,193,243, 60, 34, 34, 34,252,226, 20, 68,173,189, 1, 60, 12, 6, 3, 95, 90, 90,202, 30, 61, +122, 20, 82,169, 20, 65, 65, 65,142,182, 58, 1, 1, 1, 14, 55,147,194, 93,129,192,195,100,177, 64,175,215, 67,163,209, 0, 0, + 46,159, 90, 83, 94,136, 25,213,183,205, 47, 20,176,133,133,133,216,188,121, 51,254,248,227, 15, 52,107,214,204,173,168,174,128, +224,202, 43, 44, 44,108, 61,122,244,232, 3, 83,166, 76,169, 18, 22, 22, 6,179,217,140, 27, 55,110,224,187,239,190,203,212,233, +116,173, 43, 82,192,128, 0, 22,139, 21, 6,157, 17, 37,234, 82,124, 60,245, 7,143, 89, 15, 0, 10,115,207,163, 87,239,126,210, +123,153, 78,153,153,153,239,180,110,221,122,106,105,105,105,177, 78,167,235, 7, 96,150,243,247, 84, 65, 65, 65,155,222,189,123, +207, 9, 11, 11,107,154,155,155,251,190, 31,148, 99,211,210,210,222, 79, 72, 72, 40,183,209,104, 52, 34, 33, 33,161,118,110,110, +238,192,182,109,219,126, 8, 32,204,105,119, 16,128, 45, 0,190,244,148,151,132,170, 67,141, 70, 15, 85, 72, 44, 50,174,237,244, + 25, 16,137,200, 0,194,243, 94,203, 16,225, 3,216,211,226,163,103,220, 45, 65, 21,142, 21, 94,216, 79, 60,253, 2,158, 24, 58, + 3, 10, 49, 48,237,165,199,145, 28, 2, 64, 30, 6, 73,219,247,192,132,216,239,209,208,223,252, 34, 31,243,213, 87, 56,102, 47, +143,227, 35, 35, 49,186,127,127, 16, 11,176,239,204, 25,172,248,235, 47,244,239,208, 1,138,128, 0,191, 63, 88,120,158,135, 68, + 34,193,229,203,151,177,111,223, 62,212,173, 91, 23,151, 46, 93, 42, 55, 12, 5, 33,196,223,248, 59,226, 46,147,201, 32, 22,139, +145,157,157,141,212,212, 84, 72, 36, 18,252,240,195, 15,216,185,115, 39, 70,143, 30,141, 33, 67,134,160,125,251,246, 56,123,246, +172, 95,156,132,144, 91,122, 43,186, 86,231, 86, 52,141, 92, 57, 93,223,251,183,147,238, 2,231,148, 41, 83,220,118,168,240,135, +211,157, 22,113,147,118, 71,157,197,144,224, 60, 57, 11, 35,215,117, 0,161,194,182,177, 99,199,190,239,239,121,206,235,130, 35, + 86,145, 42, 76,135,208, 74, 77, 77, 45, 23,243,194,194,194, 3, 7, 14, 28,168,175, 84, 42,113,254,252,121,169, 74,165,170, 47, + 20,232, 44,203, 98,213,170, 85, 65, 61,122,244,216, 58,107,214,172,120,158,231,145,147,147,131,119,223,125, 87, 99,181, 90, 7, + 0,176,122,122,129,251,114,166,126,251,237,214,135,109,221,186,117,126, 85,129, 8, 66,138,227, 56,132,134,134,234,245,122, 61, + 20, 10, 5, 66, 67, 67,245, 58,157, 14, 74,165, 82,168, 43,102,241, 79, 79, 5, 95,238,147,175,134,241,174, 13,224,125,226,204, +153, 51,126, 29,103,175,106,245, 43,151,167,165,165,121, 44, 72,118,238,220, 9,222, 94,208,250,203,105,255,202, 35,130,240, 83, + 40, 20, 8, 11, 11,131, 76, 38,131, 92, 46, 47, 39,178,100, 50,153,207, 7,199,215,128,164, 1, 1, 1,135,148, 74,101,136,176, + 95, 44, 22,163,180,180,180,184,176,176,240,209,251,186,234, 16, 4, 86,179, 21,122,189, 1,154, 82,125,165,243,155, 76, 38,200, +100, 50, 44, 95,190, 28,143, 63,254, 56, 90,180,104,113,139,200,186, 77,123, 62,189,176,176,176,253,188,121,243, 14,206,158, 61, + 59, 84,163,209,224,251,239,191, 47,209,104, 52,237, 1,164, 87, 72,108,242, 4, 22,179, 25, 58,131, 17, 90, 77,217, 61,184,114, +122,205,127, 45,169,150,103,103,103, 47,247,178,255,138,213,106, 77, 21,198,125,243, 3,143, 37, 36, 36, 32, 59, 59,187,220,198, +235,215,175,195,102,179, 25, 81, 54, 78,214,203,206, 70, 50,254, 25, 61,219,211, 87,124,153, 59,170, 55, 66,163, 41,115, 65, 12, +218,252,202,201,167,118,177,225,169, 77,214,237,228, 33,134, 97, 28,141,190,135, 15, 31,142,147, 39, 78,160, 83, 21, 53,146, 99, +130, 64,212, 25,144,116,252, 8,127,231,201, 49,107,206,166, 10,115,175,116,106, 2, 49,107,229, 74,183,251,174,244,233, 83,161, +184, 95,184,112, 1,114,185, 28, 54,155,237,150,247, 77, 69,227,239, 44, 96,230,204,153,131,209,163, 71,227,135, 31,126,192,201, +147, 39,241,200, 35,143,160,115,231,206,200,205,205,197,137, 19, 39, 96, 52, 26,253, 14,167,115,187,185, 11, 87,207, 96,219,190, +223,113, 61,253, 26, 50,179,111,222,118,186, 59,115,186, 10,173, 95,182, 29,199,211, 93,154,220, 22,231,199, 31,127,140,220,220, +220,114, 78,150,115,185,228,201,209,114,213, 34, 46,200,119,105, 11, 37,172,155, 92, 68,143,235,186,235,241, 0,144, 11, 64,228, +227, 60,215,245,252,233,211,167,239, 16,156, 48, 59,175,200, 87,251,172,114,142,150, 11,102,244,233,211,167,247,252,249,243, 35, + 3, 2, 2, 28, 61,144,198,142, 29,139,209,163, 71,163,122,245,234,136,136,136,136, 11, 9, 9, 65, 65, 65, 1,102,206,156,137, +180,180,180,215,224,102,160, 61, 87,161,213,230,106, 41,164,210,127, 62, 88, 5,103, 11, 0,134, 12, 25,114,139,163, 37, 36,144, + 55, 88, 44, 22,132,135,135, 67,167,211, 65, 36, 18,161,111,223,190,162, 83,167, 78,217,186,117,235,134, 39,159,124, 82,116,226, +196, 9, 91,207,158, 61, 33, 18,137,208,177, 99, 71,245, 47,191,252, 50, 10,192,103,126,136,173, 74,107, 24, 47,100, 50,127,199, + 62,242, 71, 92,122,227,100, 24, 6, 58,157, 14, 28,199, 57, 26,202,251,195, 41, 84, 29, 58, 63,128, 44,203, 34, 36, 36,196, 81, +120, 8,142,150, 32,180,124,241,250, 26,144, 84,161, 80,168,206,159, 63, 95, 67,232,120,145,159,159,143,142, 29, 59, 94, 44, 44, + 44,188,191, 45, 45, 30, 48, 91,109,208,232, 13,208,232,117,149, 70, 43, 60, 15,139, 22, 45,194,217,179,103, 97, 48, 24,176, 96, +193, 2, 71,167, 2,103,145,117, 7,130,235,178, 92, 46,231,187,119,239,142, 3, 7, 14, 64, 38,147, 89,112, 27,227, 95,241,132, +135,217,106,133, 65,175,135,198,119,149,219,131, 2,135,170, 62,123,246, 44, 76, 38, 19, 38, 77,154,100, 59,124,248,240, 14,148, + 13,128, 42, 56,120, 3,219,181,107, 55, 89,169, 84,134,108,220,184,241, 77, 0, 63,120,123,121, 91,172,118,209, 94,137,247,209, +185, 70,192, 93,155,172,219, 25,102,197,249,197,202,243, 60, 94,123,245, 85,116,174,162,198,147, 77, 35,161,205,186, 8, 69,112, + 36,152,144, 68,204,154,179, 9,167,175,250,221, 20,147, 0, 64,247,118,125,208,168,238,173,195,131,181,238, 84,246, 77,182,231, +207, 67,200,201,207,172,112,220,181, 90,173, 71,231,170, 2,142,150,227,153, 19,238, 95,227,198,141, 81,171, 86, 45,236,216,177, + 3, 77,154, 52,193,165, 75,151,112,233,210, 37,164,165,165,225,228,201,147, 40, 42, 42,170,112, 26,253,186,101, 5,138, 74, 11, + 33,149, 72, 81, 88,156,143,235, 25,215, 16, 29, 30,115,199,233, 46,160, 78,207,143, 1, 0, 85, 34,131, 43, 36,180,156, 57, 63, +249,228,147, 91,196,251,157, 14,217,195, 48,204, 33,111,235, 21, 61,255, 94,194,147,208,186,150,151,151,215,162,127,255,254, 99, + 1, 52,183,111, 43, 1,176,114,235,214,173,125,162,162,162, 58,180,108,217,146,147, 74,165,216,183,111, 31,126,249,229,151, 31, + 0,172,240,118, 33,169, 84,170, 79, 76, 76,148, 11, 25, 81,120, 16, 85, 42,149,104,230,204,153,204, 55,223,124,227,209,229,242, +149, 64, 37, 37, 37,208,106,181, 8, 14, 14,134,217,108, 70,247,238,221,109,103,207,158,133, 68, 34, 65,239,222,189,109,103,206, +156,113, 36,244,226,197,139,227,245,122,125,171, 63,254,248,163, 43,128,182, 21,184, 87, 66,195,248, 64,248,217, 0,222,211, 87, +158, 63,240,183, 58,206, 19,231,200,145, 35,111,139, 83, 34,145, 88,133,145,223, 89,150,133,217,108, 70,147, 38, 77,144,155,155, +235,120,104,148, 74,165, 67,100,249, 35,180,124, 13, 72,202,113, 28, 76, 38, 19,218,182,109, 11,134, 97,240,249,231,159, 63, 24, +213,145, 60,207, 4, 6,134,163, 74,149,218,136,140, 50,128,231, 43,119, 86,153, 49, 99,198,148, 19, 83,238, 70, 94, 22,238,255, +237, 64,224,186,147,217,231, 9,224,168,242,210,106, 13,247, 93, 18, 70, 69, 69,181,200,205,205, 93,231,178,185, 16,192,100, 47, + 31,150,142,132,190,121,243, 38,186,117,235,134,223,127,255, 93,180,118,237,218, 78,235,215,175, 63,115,241,226,197,155, 77,154, + 52,169,250,250,235,175,203,218,182,109,139,252,252,124, 52,109,218,116, 98, 70, 70,134, 23,161,101,191,143, 6, 35,180,218,202, +119, 71,221,185, 89,119,242, 98, 20,242,228,132, 9, 31,162,115,108, 49,250, 62, 18,140, 37, 27,246, 98, 96, 99, 57, 96,146, 85, +152, 79, 8, 75, 88,149, 36, 36,166,180,184,101,191, 76, 85, 54,150,107, 98, 74, 11,176, 55, 47, 85, 56,238,206, 97,118, 21, 85, +183,227,232, 57,223,207, 87, 94,121, 5,239,189,247, 30,186,118,237,138, 75,151, 46, 97,215,174, 93,184,116,233, 18, 70,142, 28, +137,148,148, 20, 60,242,200, 35, 21,226, 92,191,109, 53,212,154, 18,176, 12,139,194,146, 2, 24,140,122,140,121, 99,194, 29,167, +187,227,229,191,109, 58, 0, 96,205,214, 99,183,205,249,193, 7, 31, 32, 59, 59,187,156,147,117, 39,237,178,238,119,120, 27, 45, +237, 26,128,215, 92, 55,154, 76,166,160, 73,147, 38,117,137,136,136, 0,195, 48,152, 51,103, 14,194,194,194, 30, 7,112,218,100, + 50,229,107,181,218,209, 78, 34,164, 51,236, 99,109,228,228,228,184,237,183,175,213,106,205, 93,186,116, 17,199,198,198,150,235, +109,168, 84, 42, 61,185, 59, 14, 78, 97,159,213,106,197,152, 49, 99, 48,109,218, 52, 84,171, 86, 13, 61,123,246, 68,106,106, 42, + 24,134, 65,247,238,221,209,179,231, 63, 85,185, 33, 33, 33,146,223,127,255,189, 29,203,178,103,156, 94, 32,229, 56,221, 65,104, + 24,111,177, 88,252,109, 0, 95,142, 83,200,108, 35, 71,142,196,180,105,211,240,254,251,222,155,122,124,245,213, 87,192,173,237, +169,238, 58,103, 97, 97, 97,185,194, 94,161, 80,124,254,228,147, 79,114, 55,111,222, 44, 39,174,156, 23, 55, 5, 81, 57, 78, 95, + 3,146,138, 68, 34, 68, 71, 71, 99,202,148, 41, 8, 15, 15, 71, 76, 76,140,187,129,252,124,166,209,109,224,174,114,218, 8,127, +244,211, 25, 31,182,254,126,217,122,177, 76, 10,236,223,181, 6,234,162,242,213, 73, 70,243, 63, 93,169,165, 77, 58,193,116,236, + 79,191,242,146, 32,166, 63,254,248, 99,124,252,241,199, 94, 3,180,104,209,162, 59,142,187,159, 98,235, 86, 78,158, 48, 10,101, + 40, 2,148, 85, 80, 63, 37, 20, 60,177,254,167,210,200, 3, 14, 31, 58,116,168,119,120,120, 56,210,211,211, 35,197, 98,113,239, +114,118,149, 94,143,196,196,196,218,121,121,121,173,124,113,142, 28, 57,210, 56,126,252,120,217,128, 1, 3,240,228,147, 79, 98, +192,128, 1, 50,137, 68, 82,147, 16, 2,179,217,140,244,244,116,252,249,231,159,200,203,203, 59,231, 45,156, 60, 33,140, 92, 17, +130, 0,101, 44,234, 55, 8, 1,207, 91, 43, 37,238,206,174,184,179,155, 85, 65,145,229, 54,127, 2,192,225, 63,215, 97,194,219, + 13,240,195,198,131,152,127, 8,104, 20,146,139,250,145,121,224,243,206,225,221,129,205, 48,235,167, 35, 0,128, 93, 59,125,166, + 17,241,150, 7, 13,122,243, 29,197,221,217,185,114,190,142, 31,109,180,110,225, 20, 62, 18, 75, 75, 75, 81, 92, 92,140, 37, 75, +150,224,165,151, 94, 66,110,110, 46,210,210,210,112,241,226, 69,252,252,243,207, 80, 40, 20,183,149, 70,163, 94,253, 0,227,103, +189, 3, 2,130, 58, 53,234, 99,236,208,143,209,188, 81,203, 59, 78,119, 87,248,225,102,121,228,156, 59,119,238,237,230,165,135, + 78,104,185, 69, 68, 68,196,128,118,237,218,193, 96, 48, 32, 50, 50, 18,105,105,105, 96, 89,182, 58, 80, 86,133, 23, 23, 23,183, + 50, 47, 47,175,186,191,124, 34,145, 8, 86,171,213,209,246, 71, 88, 0,160, 87,175, 94,248,237,183,223,124,126, 81,196,196,196, +160,106,213,170,120,235,173,183,110,233,229,224,220,211, 65, 46,151, 99,227,198,141,217,133,133,133,133,132,144, 10,117,115, 19, + 26,198,239,217,179,199,239, 6,240,206, 48,155,205, 55, 47, 94,188, 24,187,104,209, 34,145,151,151,159, 3,187,118,237,178,194, + 71, 85,205,221,224,116,247,101, 74, 8,241, 40,178,252, 25, 70,192,215,128,164, 28,199,225,194,133, 11,152, 48, 97, 2, 24,134, +193,154, 53,107, 30,136,135,235,212,249,130,111, 88,150, 13,237,245, 68,235,134, 96, 24,152, 77,183,214, 84, 7, 22,105, 28, 34, +235,201,207, 86, 96,237,168,254,254,136,158,203,187,119,239, 14, 91,180,104, 17,231, 79,186,239,222,189,219, 74, 8,169,112,181, +159,240,194, 49,155,205,208,235,111,207, 69, 33,132,236,155, 62,117,124,151,165, 63,110, 18, 51,140, 9,251,119,174, 65, 73,177, +251,230, 12, 82, 49,135,111,150,252, 98,149,136, 69, 55,255,229,164,251,162,111,223,190, 3, 22, 44, 88, 80,223,221, 78, 63, 58, +193,164, 25, 12, 6,100,100,100, 64,167,211,173, 30, 55,110,156,121,211,166, 77, 47, 63,245,212, 83,120,228,145, 71, 16, 27, 27, +139,172,172, 44, 92,190,124, 25, 75,150, 44, 33,123,247,238, 93, 13, 96,152,143,251,184,110,198,212,241, 47, 46,249,105,147,148, +101,204,216,191,107, 13, 74, 92, 68,251,173,238,180, 24,223,254,240,139, 89, 34, 17,159,247,229, 22, 57,187, 89,149,249, 98,236, + 61,104, 40,158,156, 55, 31,213,155,119,195,140,153,157,241,237,212,126,152,221, 93, 2,243,170,129,104,244,204, 82, 44,159,212, + 3, 0, 80,229, 91, 63,221, 18, 78,130, 27,110, 28,171,226,146, 0,187,184,169,152,107, 42,196,221,155,115, 85, 81, 71,139,101, + 89, 36, 37, 37,161,122,245,234,120,252,241,199,209,164, 73, 19,116,232,208, 1, 39, 78,156,192,137, 19, 39, 48,114,228, 72,111, + 34,203,103, 26,181,111,213, 5, 7,219,156,191,227,180,113, 77,247,202,128, 63,121,105,232,208,161, 0,240, 80,185, 91, 21, 22, + 90,106,181,250, 4,207,243, 13,131,131,131, 5, 71,202,177,239,250,245,235,224,121, 94, 87,209,132, 49,153, 76,194,224,152,229, +198,101, 18, 26,199,123,123,240, 9, 33,182,194,194, 66,180,107,215, 14,109,218,180,113, 84,159, 56, 47, 78,194, 4,107,215,174, + 5, 33,164,194,141,172,157, 26,198,107, 80,193, 6,240, 0,144,155,155,219,173,109,219,182, 91, 57,142,243,107, 22, 77,158,231, +211,114,114,114,158,184,215,156,238,210,135,231,121,143, 34,203,159,130,200,215,128,164, 28,199, 65,169, 84,226,215, 95,127, 69, + 68, 68,196, 3,245,128,157, 56,155,247,137,183,253,237,194,165, 59, 1, 68, 62,249,217,138, 27, 59, 11,204, 9, 79,126,182,226, +250,218, 81,253,171,121, 59, 39, 59, 59,187,107,255,254,253,127,247, 55,221,173, 86,235,181,236,236,236, 10, 15,151, 64, 8,193, +249,243,231,249, 87, 94,121, 37, 63, 47, 47,175,223,237,196,127,236,132,249,179,167, 77, 28, 30,222,189, 75,139,230, 96, 1,147, +231,198,191,132, 1, 8, 39, 22,221, 28,253,254,220, 87,251,245,235,247,111, 38,155, 58, 59, 59,251,241,167,159,126,122, 24,254, +105, 58, 81, 78, 72,193, 67,239,106, 59,230, 85,173, 90,181,129, 72, 36,146, 1,152, 0,224,250,222,189,123,191,216,187,119,111, + 87, 0,143,137, 68,162, 88,155,205,150, 97,255,232, 89, 1,224,111,223,249, 40,247,117, 16, 62,190,123,231,199,186,129, 97,136, +201,100,244,241,129, 4, 2, 66,136, 68, 34, 62,127,248, 68, 86, 35,111, 31, 82, 78, 51,112, 84,122,149,253,176, 97,195, 48,108, +216, 48, 71,126,250,252,243, 54, 88,125,106, 15,158,105,148, 14,227,215,173,193,168,170,249,253,193, 7, 0, 31,124,248, 74,165, +133,205, 57,238,206,142,150,187,231,160, 34,109,180, 68, 34, 17,242,243,243,113,225,194, 5,228,228,228, 64,167,211,225,236,217, +179, 48,155,205, 40, 42, 42, 66,131, 6, 13,110, 59,156,149,149, 70,255, 38,231,195, 88,125, 88, 97,161,101, 54,155, 63, 74, 74, + 74, 18, 7, 4, 4,212,183,217,108, 32,132,192,102,179, 17,187,168,169,112, 47, 60,177, 88,108,168, 85,171, 22,227,174,119,130, +240, 95,169, 84,234,189,184, 37,211, 19, 19, 19,199, 49, 12, 35,242,244, 21, 34,252,231,121,222,198,113,220,244,219,188, 87,119, +218, 48, 94,155,151,151,215,178,146,211,239,110,112,186,166,143,182,110,221,186,142, 25,237, 93,199, 68,177, 79,182,170,245, 33, +206,189, 14, 72,170,213,106,179,186,117,235,102,115,222,239, 60,160,233, 3, 13,134, 92,239, 49,224,229,132,157, 5,230, 4, 0, + 16,196, 22, 8,185,238,229, 44,125,118,118,118,187,187, 29,180,171, 87,175,154, 30,123,236,177, 31, 75, 75, 75,135, 2,184,237, +214,252,239,127,244,249,251,247, 97,202,168, 1, 76,187,205,115,175, 23, 20, 20,116,116,217,246,183, 32,168,132,113,237, 42, 44, +218,207,229, 87,250,216, 98, 86,171, 53,189,122,245,234, 21,114,110, 44, 22, 75,186,175,253,174, 99,132, 57,227, 52,130,241,254, + 1,160,172,243,119,129, 95,156, 6,131,161,176,101,203,150,226, 10,198, 45,215,223,184,199,198,198,162, 74,149, 42,142, 95, 1, +174,219,125,133,211,106,181,166,199,199,199, 35, 34, 34,194,227,136,239,174,109,178,252,225,172,236, 52,242,198, 89,165,202,210, + 74,231,188,221,112, 82,248,135,206,148,147,114, 82,206,251,150, 83, 68,239, 39,229,164,156,148,243, 30,114, 62,112, 32,132,128, +182, 82,163,160,160,240, 4, 27,189, 5, 20, 20, 20, 20,119, 6,198,139, 42,173, 72, 79,159,219, 81,182,219, 40, 39,229,164,156, +148,147,114, 82, 78,202,249,208,113,250,226,174,236,158,198,255, 26,238,100,120,156,187, 41,192, 40, 39,229,164,156,148,147,114, + 82, 78,202,249,240,113, 62,112,160, 85,135, 20, 20, 20, 20, 20, 20, 20, 20,119, 17, 84,104, 81, 80, 80, 80, 80, 80, 80, 80, 80, +161, 69, 65, 65, 65, 65, 65, 65, 65, 65,133, 22, 5, 5, 5, 5, 5, 5, 5, 5, 5, 21, 90, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20,247, 21, 8, 33,101, 83,240,108,216,176,193, 49,208, 67,106,106, 42, 67,111, 13, 5, 5, 5, 5, + 5, 5,197,189,196,131,170, 69, 56, 42,176, 40, 40, 40, 40, 40, 40, 40,254, 11,120, 16,181, 8,235, 78, 73, 82, 80, 80, 80, 80, + 80, 80, 80,220,107, 60,136, 90,132,125,144, 85, 36, 5, 5, 5, 5, 5, 5,197,253,131, 7,222,209,162,174, 22, 5, 5, 5, 5, + 5, 5,197,191,133,251, 88,139, 16,251,226,188, 78, 65, 65, 65, 65, 65, 65, 65, 65,113,135, 2,203,227, 47,157,235,144,130,130, +130,130,130,130,130,226,246,193,184, 89,191,167,110, 22,157,217,156,114, 82, 78,202, 73, 57, 41, 39,229,164,156, 15, 37, 28,227, +104, 81, 80, 80, 80, 80, 80, 80, 80, 80,220,153,174,114,250,239,112,186,168,208,162,160,160,160,160,160,160,160,184,115,145,197, +184, 91,167,109,180, 40, 40, 40, 40, 40, 40, 40, 40,238, 18,168,163, 69, 65, 65, 65, 65, 65, 65, 65,113,103,112,109, 4, 79,171, + 14, 41, 40, 40, 40, 40, 40, 40, 40, 42, 89,108,185,221,232,169,231,192,182, 10,144,223, 78,239,131,109,148,147,114, 82, 78,202, + 73, 57, 41, 39,229,124,232, 56,125,113,111,195,253,135,118, 0,118, 0,104,111,255, 5, 0,134,144,187, 63,210, 3,237,250, 74, + 57, 41, 39,229,164,156,148,147,114, 82,206, 7, 29,174, 3,150,150,173,208, 1, 75, 41,252, 0, 7,239, 85,204,190,246, 83, 80, + 80, 80, 80, 80, 60,108, 98,139, 56,191, 36,221,161, 38,128,247, 1, 4, 59,109, 59, 4, 96,186,203,113, 63, 1, 80, 56,173,107, + 1, 76, 2,112,201,103,104, 8,145,216,249,101,246,133, 7, 96, 0, 96, 4, 80,202, 48,140,133,166,217,191,142,150, 0, 82,237, +255, 55, 0,216, 95,193,253, 15, 20, 98, 99, 99,229,161,161,161, 93,143, 29, 59, 38, 61,123,246, 44,118,239,222, 77,190,249,230, + 27,115, 81, 81,209,150,172,172, 44, 61,205, 46, 15, 4,186, 1, 24,107,255, 63, 3,192,230, 59,228, 99, 20, 10,197, 72,165, 82, +217, 67, 38,147, 85,177, 90,173,140, 78,167,203,212,106,181, 91,173, 86,235,103,246,114,175,162,232, 19, 22, 22,246,114,157, 58, +117,106,166,165,165,101,100,102,102,254, 4, 96, 21,128,126, 85,170, 84, 25,152,152,152, 24,119,254,252,249, 75,133,133,133,223, + 2, 88,247, 47,134,147,130,226, 97, 2,227,205,141,112,135, 9,132,144,129,229, 24,152, 91, 57, 58,118,236,216,123,203,150, 45, + 10,158,231, 33, 44,114,185,220, 10, 96,176, 15,145, 21,190,111,223,190,132,161, 67,135, 62,153,153,153,217,172,180,180,244, 81, + 0, 80, 40, 20, 7,163,162,162, 14,207,155, 55,239,103, 66, 72, 58,195, 48,165, 21,140, 40, 39, 22,139, 95, 10, 13, 13,237, 97, +181, 90,155, 16, 66, 32, 22,139,143, 21, 21, 21,109,182, 88, 44,223, 2,184, 29,241, 38,229, 56,110,152, 76, 38,235,102,181, 90, + 27, 2, 0,199,113, 39,141, 70,227,102,171,213,250, 5, 0,211,109,112, 6, 72,165,210, 97, 42,149,170,139,201,100,106, 8, 0, + 82,169,244,164, 90,173,222,106, 50,153,190,176, 11,206,127, 27, 28,128, 84, 66,136, 24, 0, 68, 34, 81,159, 71, 31,125, 52,129, + 97, 24,158, 97, 24, 66, 8, 97, 14, 30, 60,216,216,102,179,177,246,252,145, 10,224, 48, 0,235,253,248,132, 68, 68, 68, 76,227, +121,190,138,215, 68, 11, 8,104,118,236,216,177, 58, 43, 87,174,180,125,253,245,215,197, 67,134, 12, 9, 28, 58,116, 40,247,249, +231,159,127,145,149,149,245,166,235,241,225,225,225,179, 89,150,141,240,231,250, 60,207,231, 23, 20, 20,188, 67,203,170,127, 29, + 99,191,220, 86,218,150, 16, 96, 88,151, 32,246, 78,133, 86, 92, 92,220,146, 23, 95,124,113, 64,195,134, 13, 57, 66, 8, 44, 22, + 11,140, 70, 99,157,253,251,247,183, 95,179,102, 77,179,210,210,210,126, 21,164,124,245,189,247,222,155, 50,121,242,228, 8,177, + 88,204, 88, 44,150, 26, 43, 87,174,108,242,250,235,175,191,181,104,209,162,170,207, 62,251,108,144,176,125,194,132, 9,205,103, +204,152,145, 12,224,179,127, 33,156, 20, 20, 15, 27,218,161,124, 27,173,137, 0, 62,246, 38,180,148,246,151,103, 14,202,156, 44, + 56,253, 58,176,125,251,246,245, 28,199, 9,142,214,163, 90,173, 54, 26,229, 93, 48,119, 34, 43,113,208,160, 65, 45, 87,175, 94, + 61,237,217,103,159,205, 86, 40, 20,181,158,122,234,169, 82,134, 97, 68, 43, 87,174,108, 92,189,122,117,121,175, 94,189, 6,117, +236,216,113, 20, 33,100, 55,195, 48,121,126, 70,178,126, 88, 88,216, 47,159,124,242, 73, 66,183,110,221, 36, 17, 17, 17, 32,132, + 32, 51, 51, 51,110,227,198,141,221, 39, 78,156, 56,170,176,176,176, 47,128, 51, 21,184,113,205,229,114,249,234,137, 19, 39,198, +118,239,222,157,139,137,137,129,193, 96,192,217,179,103, 59,111,222,188,185,237,162, 69,139,222,212,235,245,207,216, 5,134,191, +120, 52, 56, 56,120,205,247,239,189, 23,221,226,165,151,184,176,176, 48, 16, 66,144,151,151,215,121,207,210,165,237,223,248,228, +147, 55, 75, 74, 74,158,118,119,191,255, 77, 72,165, 82,118,217,178,101,143, 72,165, 82, 0,128,201,100, 66, 74, 74, 10,243,192, +124,138, 48, 76,124,102,102,102,176, 68, 34,113,187,223,102,179,161,109,219,182, 73, 18,137, 4,159,125,246,153, 37, 63, 63,191, +241,130, 5, 11,142, 45, 95,190, 60,226,139, 47,190,120, 6,192, 45, 66,139,101,217,136,244,244,116,183,156, 54,155, 13,102,179, + 25, 86,171, 21, 38,147, 9,245,234,213,163,197,212,127, 3, 9, 0,176,233,132, 1, 0,194,238,148, 76,169, 84,214,125,238,185, +231,184,188,188, 60,136,197, 98,152,205,102,100,103,103, 35, 37, 37, 69,244,227,143, 63,214,174, 40, 95,141, 26, 53,134,204,152, + 49, 35,114,211,166, 77,230,101,203,150,153,186,116,233, 34, 30, 50,100,136,170,109,219,182,245,226,227,227,217,239,190,251,206, +184,117,235, 86,203,160, 65,131,164,211,167, 79,143,220,184,113, 99,175, 51,103,206,124,118,175,195, 73, 65,241, 16, 98, 7,254, + 25,226, 65,248,245, 42,180,224, 36,174,250, 0,128, 88, 44,110, 28, 29, 29,189,196,106,181,198,216, 93,157,236,156,156,156,207, + 44, 22,203,113,251,177,235,120,158,239,237,203,201, 26, 52,104, 80,203,223,127,255,125,214,254,253,251, 75, 10, 10, 10, 98,214, +175, 95,111, 24, 53,106, 84, 26, 0, 92,189,122, 53,185, 87,175, 94,113,195,135, 15, 79,239,218,181,235,188, 14, 29, 58,140, 32, +132,108,101, 24, 70,235, 75,100,165,164,164,236,219,181,107, 87, 80, 72, 72, 72,185, 29,137,137,137, 24, 49, 98,132,164,119,239, +222,213, 59,117,234,180,247,242,229,203,109, 0,156,242, 71, 16,213,172, 89,115,219,246,237,219, 3, 67, 67, 67, 81, 92, 92,140, +236,236,108,232,116, 58,168, 84, 42, 60,251,236,179,146,118,173, 31,175, 58,124,228,155,219,210, 51, 50, 58,251, 41,182, 30,125, +188,126,253,109,203,167, 79, 15,180,220,184, 1,185, 92, 14,141, 70, 3, 0, 8, 10, 10, 66,179,164, 36,238,200,210,165,113, 3, +199,140,217,118,248,194,133,206,255,146,216,146,217,127,141, 0, 54,136, 68,162, 62, 82,169,148,237,211,167, 15,182,109,219,198, + 24, 12, 6,206,238,238, 88,251,244,233, 3,185, 92, 14,147,201,196,163,172,234,208,122, 63, 63, 37, 82,169, 20,151, 47, 95, 46, +183,173,180,180, 20,121,121,121, 40, 40, 40,128,209,104, 68,113,113, 49,120,158,103,228,114,121, 30,207,243, 96,217, 50, 67,207, + 19,167, 68, 34,193,133, 11, 23,202,109,179, 90,173,208,106,181, 48, 26,141, 48,155,205, 40, 45, 45,149, 7, 5, 5,213,140,136, +136, 72, 7,176,174,176,176,240,179,156,156,156,235,180,220,250, 87,112, 99,195,113, 67, 53,148, 57,213,215, 42,129,143, 7,128, +221,187,119, 35, 39, 39, 7,249,249,249,200,203,203, 67,124,124, 60, 8, 33, 21,174,142,187,124,249,242,151, 13, 26, 52, 96, 78, +159, 62,189, 25,192,231, 43, 87,174, 28, 92, 88, 88, 56,118,244,232,209, 97,159,126,250,105,225,152, 49, 99,102, 0,248, 97,229, +202,149,255,171, 91,183,110,143,115,231,206, 45,250, 55,194, 73, 65, 81,217, 32,132, 52, 7, 16,105, 95,205,183,151,187,225, 78, +235, 39, 24,134, 49, 57, 29,103, 2, 32,117,243, 43, 64, 88,207, 99, 24,230,176,211,121,121, 12,195, 28,190,221, 96,186,252,150, +125,116, 3,192,134, 13, 27,136,176,184, 59, 51, 42, 42,106,100,199,142, 29,103, 29, 61,122,180, 94, 86, 86, 86,104, 86, 86, 86, +232,209,163, 71,235,117,236,216,113, 86, 84, 84,212, 72,167, 27,225,122,234, 54,167,125,146,125,251,246, 37,252,242,203, 47, 51, +182,109,219, 86,210,184,113, 99,211,246,237,219,173, 93,187,118,205,181,191,160,173, 93,187,118,205,253,235,175,191,108, 45, 90, +180,144,255,254,251,239, 55,247,238,221, 59,123,245,234,213,209,132, 16,145, 59, 78, 59,196, 33, 33, 33,191,238,220,185,243, 22, +145,229,140,170, 85,171, 98,195,134, 13,170,144,144,144,117, 0, 36,158,194,105, 71, 64, 64, 64,192,154,191,254,250, 43, 48, 40, + 40, 8,185,185,185, 16,139,197,136,138,138, 66, 73, 73, 9,178,179,178,112,253,226, 69,176, 38, 19,230, 76,157, 28, 36,151,203, + 87,187, 36,160, 91,206,224,224,224, 53,203,167, 77, 11, 44,216,182, 13,127, 79,153, 2,179,217,236,168,114, 53,155,205,216, 59, +116, 40,242,254,252, 19,223, 77,152, 16, 24, 28, 28,188, 6, 64,128, 15,206,202,128, 51,231, 80, 0,133,246,101, 40,128,253, 41, + 41, 41, 71,207,158, 61,139, 54,109,218, 96,213,170, 85,141, 70,143, 30, 61,116,244,232,209, 67, 87,173, 90,213,168, 77,155, 54, + 56,123,246, 44, 82, 82, 82,142,162,124,251,172,187, 29,206,187,198,105,179,217,202, 45, 60,255,207, 59,166, 74,149, 42,185,191, +252,242, 11,158,125,246, 89, 86, 42,149,102,245,239,223, 95,182,103,207, 30, 98, 23,153,126,135,211, 96, 48, 64,175,215, 67,171, +213,226,234,213,171,242, 79, 62,249,164,245,199, 31,127, 92, 99,219,182,109,113,239,191,255,254, 27,145,145,145,199,162,163,163, + 19, 30,132,251,121, 31,114,102, 3, 48,163,172,189,233,245, 59,225,236,216,177, 99,131, 26, 53,106, 68,175, 60, 29,138, 34, 73, + 29,240,146, 16,240,146, 16,216,194,155,227,178,244, 9, 84,171, 86, 45, 58, 48, 48,176,101, 5,195,185,236,244,233,211,143,217, +191,148, 11, 0,204, 26, 51,102,204, 68,134, 97,118,143, 25, 51,102, 50,128, 89,246,237, 83,206,157, 59,215, 2,192,242,127, 41, +156, 52, 47, 81,206, 10,195,135, 22,137,100, 24,102, 3,195, 48, 27,198,141, 27,215, 1, 64,184,203,122, 43,231,227, 0, 72,221, +253, 10,139,211,246, 72, 66, 72, 79,167,243, 34,111, 51,248,140,155,229, 31,161, 5, 0,169,169,169, 76,106,106,170,176,227, 16, +195, 48,235, 1, 28, 18,139,197,141, 31,121,228,145, 62,127,252,241, 71, 80,100,228, 63,215,143,140,140,196,234,213,171,131,234, +215,175,223, 71, 44, 22, 55, 6,112, 72,165, 82,173,247,226,194,132, 12, 29, 58,244,201, 23, 94,120, 65,221,184,113, 99, 0, 40, + 62,115,230,140,162, 69,139, 22, 90,171,213,202, 88,173, 86,166, 69,139, 22,218, 51,103,206, 40, 44, 22, 75,105,243,230,205,149, +157, 58,117, 74,123,231,157,119, 6,185, 17, 28,206,120,110,230,204,153,241,161,161,161,222,148, 48, 74, 75, 75, 17, 29, 29,141, +161, 67,135,198,136,197,226,151,189,221, 45,142,227,134,205,156, 57, 51, 42, 36, 36, 4, 69, 69, 69,136,143,143,135,201,100,194, +133, 11, 23, 96,208,106, 96, 41, 85,195,162, 46, 70,222,149, 75, 8, 17,115, 24,212, 59, 53,154,227,184, 97, 62,220,146, 97,223, +142, 25, 19,109, 74, 75,195,213, 85,171, 96,179,222,106,254, 88,205,102,156, 92,188, 24,134,244,116,204,120,229,149,104,169, 84, + 58,236, 30, 59, 89,159, 18, 66,228,132, 16, 57,195, 48,243, 90,182,108,249,163, 92, 46, 31, 58,125,250,244,110, 91,182,108,233, +190,107,215,174,246, 86,171, 85,108,181, 90,197,187,119,239,110, 99, 48, 24, 56,153, 76, 6,142,227, 8, 30, 80,136,197, 98, 72, + 36, 18,200,229,114,180,110,221,250,202, 55,223,124, 99,137,143,143, 23,175, 89,179, 38,180, 74,149, 42,202,207, 63,255,188,184, +180,180,116,166,191,124,102,179, 25, 70,163, 17,122,189, 30, 6,131, 1,219,183,111, 79, 26, 62,124, 56,103, 48, 24,108,189,122, +245, 42,180, 88, 44,198, 49, 99,198,168,194,194,194, 70,209,111,216,127, 5, 86, 0, 26,187,208, 50,186, 60, 31, 13,157, 28, 95, +159, 40, 46, 46, 94,244,237,183,223,198,179,178, 16,236, 49,245,192,207,252, 68,108, 9,254, 28,185, 9,239, 34, 42,190, 6, 6, + 12, 24, 16, 69, 8,249,188, 18,194,188, 0, 64, 91, 0,243,110,231,228,123, 16,206, 4,165, 82,185, 42, 40, 40,104,143, 82,169, + 92, 5,123,245,236,157,160, 75, 13,116,238, 93,151, 77,239, 82, 29,164,119, 93, 54,189, 75, 13, 58,212,192,131, 2, 23, 45,226, +140, 60, 66, 72, 42, 33, 36,117,198,140, 25,211,156,222,239,194,186,220, 79,103, 44,149, 16,146, 90, 78, 33,149, 9,172, 59, 54, +221,220, 44,101,154,194, 89, 73, 58, 69,206,209,187, 48, 58, 58,122,201,146, 37, 75,130, 92, 25,179,178,178,160, 86,171, 49,126, +252,248,160, 23, 94,120,225,205,244,244,244, 23,125, 4, 66,154,157,157,221,100,224,192,129, 1,102,179,185,136,231,121, 86,173, + 86,115,193,193,193, 54,225,128,224,224, 96, 91, 73, 73,137, 88,171,213,138,108, 54,155,241,133, 23, 94,144,190,242,202, 43,205, + 0,136, 60,145, 70, 70, 70,118,233,209,163,135,212,211,126,139,197, 2,173, 86, 11,173, 86, 11,179,217,140,214,173, 91,203,190, +249,230,155,174,185,185,185, 11, 61, 42, 14,153,172, 75,151, 46, 93,196,133,133,133, 8, 14, 14,198,245,235,215,113,237,218, 53, + 24, 53, 26,152, 53,106,152, 53,165,176,150,170, 65,212, 37, 40,184,116, 30, 45,234,214,145,252, 36,147,117,211,106,181,179, 61, +113,170, 84,170, 46, 45, 6, 15,230,148, 74, 37,218, 15, 44,235,103,240,123,221,186, 32, 54, 27,120,155, 13, 54,171, 21,221, 46, + 92,128,197, 98, 1,203,178,104, 94, 88,200,169,150, 46,237,146,151,151, 55,235,223,200,236, 50,153,140, 91,182,108,217,115, 82, +169, 20,132, 16,198,100, 50, 97,203,150, 45, 15,221, 67, 47,149, 74, 17, 16, 16, 0,179,217,140,196,196, 68,253,192,129, 3,247, + 77,157, 58,181, 26,203,178, 74,137, 68,242, 71, 65, 65,193,180,172,172,172,171,254,242, 89, 44, 22,152, 76, 38,152, 76, 38,232, +245,122, 92,185,114, 37, 38, 41, 41,137, 25, 58,116,168, 77,167,211, 37,207,159, 63,255,242,150, 45, 91, 20, 51,103,206,124, 10, +192, 8, 90,236,222,219,228, 6, 16, 92, 45,156,211,138, 69,208, 0, 8,178,139,130,167, 24,134,105, 81,175, 94,189,208,179,103, +207, 22, 17, 66, 14, 0,248, 25, 64,150, 55, 50,158,231, 25,158,231,241,250,163,197, 24,218, 82, 4,139,165, 4, 37, 37, 37,184, +126,253, 58,206,156, 57,131,131, 7,207,220,238,179,249,114, 96, 96, 96,215,128,128,128, 68,171,213,202,106, 52,154,235, 58,157, +110, 27,207,243,139,224, 82,101,225, 15,238, 86, 56, 5, 40,149,202, 79,222,127,255,253,199,131,131,131,113,252,248,241,228, 21, + 43, 86,124,162,213,106,239,168,113,125,128,152,253,110,246,220,207,227,226,162, 66,112, 98,215,111,113,211,190, 90,249, 29,192, +199,211, 44,124,255,195, 69,139, 56,139,161,195,132,144,158, 12,195,108,112, 21, 74, 21,178,157,238,240,124, 31,142,150,235,196, +210,229,133,150, 7, 5, 9,171,213, 26,227,236,100, 17, 66,144,149,149,133,140,140, 12,228,229,229, 33, 52, 52, 20,102,179, 57, +198,159,242,161,180,180,244,209,240,240,112,157, 88, 44, 54,234,245,122, 40, 20, 10, 94, 44, 22, 19,251,117, 24,123,175, 69,155, +209,104,100, 56,142,179, 4, 5, 5, 5, 26,141,198, 58,240,210,150,140, 16,242,104,120,120,184,219,125, 70,163, 17, 26,141, 6, + 90,173, 22, 26,141, 6, 70,163, 17,209,209,209,176, 90,173, 77,188,126,210, 90,173, 13, 35, 35, 35,145,153,153, 9,185, 92,142, +244,244,116,152, 52,165, 48,151,150,194,170, 85,195, 86, 82, 2, 94,173, 6,175, 85,195, 98,210, 33,174, 86, 93, 8, 61, 18, 61, +193,100, 50, 53, 12, 15, 15,135, 86,251, 79,115, 51, 98, 23, 88, 86,171, 21, 86,123,227,104,161, 58, 49, 34, 34, 2, 66,143,196, +123, 4, 35,128,209, 44,203,206,147,201,100,220, 27,111,188,129,172,172,172,114,121,226,141, 55,222,112,180,201,106,219,182,237, +238,128,128, 0,107, 94, 94, 30,140, 70,163,248, 65,125,232, 25,134, 1,195, 48,101,105,100,181, 34, 34, 34, 66,155,159,159,127, +176,184,184,248,185,219,225,179, 88, 44, 66,143, 46,232,245,122, 16, 66,112,252,248,113, 4, 4, 4,136,109, 54,219,105,171,213, +170, 16,139,197, 96,237,141,191, 40,238, 25,218,215, 9,145,206,158,222, 34, 42,228,145, 94, 74,173, 66, 42,210,242,215, 31, 73, +252,254,211, 51, 43, 94, 24,244,114,208,164, 73,147, 18, 34, 34, 34, 2, 46, 95,190,108,152, 60,121,114,210,178,101,203, 24,148, + 85,211,121,196,141, 27, 55,214,190,255,254,251, 97, 61,122,244, 72,150,201,100, 76, 73, 73, 9,242,242,242,144,147,147,131,107, +215,174,145, 19, 39, 78, 92, 49, 26,141,171, 42, 18,200,216,216,216,111,158,123,238,185, 23,154, 54,109, 42, 22, 28, 82,173, 86, +219,120,231,206,157,189,127,255,253,247, 54, 90,173,182,194,249,242,230,205,155,171, 62,248,224, 3,229, 19, 79, 60, 81, 71, 38, +147,177,149, 17, 78,103,176, 44, 27, 29, 24, 24,136,109,219,182, 33, 36, 36, 4, 44,203, 70,223,105, 98, 25,204,124, 92,149,152, +112, 24,246,206, 70,157,200, 4, 24,204,124, 28,205,194, 15,142,163,229,225, 93,223, 92,112,164,124,136, 37,253,216,177, 99,223, +103, 24,102,195,216,177, 99,223,119,231,104,217,255,218,156,143,115, 58,222, 88,217, 98,171, 66, 3, 77,242, 60,143,140,140, 12, +100,102,102, 34, 35, 35, 3, 5, 5, 5, 96, 89, 22,132, 16,127,122,159, 17,134, 97,248,173, 91,183,134,238,219,183, 79,219,188, +121,243, 98,161,253,139,213,106,101, 44, 22, 11, 99,111, 23,195, 92,191,126, 93,178,103,207,158,144,115,231,206, 69,163,172,193, + 26,239,195, 10,188,101,155, 32,176,156, 23,131,193,128,128,128, 0,255, 84,135,253, 69,120,252,232,209, 50,145,165, 41,181, 87, + 25,150,192,166, 46, 1,209,150, 66,106,179, 64, 10, 2,198,160,243,251,254, 57, 67, 16, 89,102,187,208, 50,153, 76,176, 88, 44, +224,121, 30, 86,235,191,210,174,252,203, 70,141, 26, 53, 89,187,118,237,144,140,140,140, 91,118,246,237,219, 23, 35, 70,140,192, +240,225,195,207,245,236,217,243,196,111,191,253,134, 97,195,134,129,231,249, 71, 0,148, 0,248,253, 65,123,232,141, 70,163,195, +129, 50, 24, 12, 48,155,205,128,151,198,239,190,242,166,144,182, 86,171, 85,224,102,214,174,253, 5,187,119,239,102,207,156, 57, + 29,255,198, 27, 67,133, 6,247,180,196,189, 55,120, 66,202, 50, 95,143,108, 24, 22, 48,170, 81,184, 86,202, 49,154, 11, 95,191, +175,185, 86, 77,165,141,174,170, 48,197, 39,133, 84,153, 54,109,106,236,185,115,231,141,227,199,143, 63,219,191,127,255,168, 81, +163, 70,213, 91,179,102, 77, 27,131,193,240, 45,128, 98, 79,166, 75,239,222,189, 15, 68, 69, 69, 37,125,245,213, 87,185, 55,111, +222, 12,181, 88, 44, 74,179,217,204,107,181,218,107,122,189,126,155,217,108,222, 6,224,104, 69, 2, 27, 20, 20,212,104,240,224, +193,226,226,226, 98,112, 28, 7,179,217,140,220,220, 92, 60,254,248,227,162,245,235,215,215,191,157, 27, 80, 84, 84, 52,251,219, +111,191,221,177,124,249,242,174, 42,149,170,169, 76, 38,139, 1, 96, 43, 45, 45,205,209,106,181,127,223, 78, 56,203,149,115, 54, + 91,206,209,163, 71,171,171, 84, 42,220,184,113, 3, 54,155, 45,231, 78, 19, 45, 64,194,222, 60,185,107,125,213,186, 17, 73,216, +179,239, 0, 2, 36,236, 77, 58,212,215, 3, 15,161, 13, 21,156, 5,148, 27,129,180,111,250,244,233,242, 25, 51,102, 96,250,244, +233,167,221, 57, 90,130,224,154, 62,125,250,105,225, 56,167,227,119,221, 65, 24, 61, 59, 90,158, 20, 36, 80,214,187, 48, 47, 47, + 47, 52, 36, 36,196, 33,176, 50, 51, 51,145,153,153, 9,169, 84,138,235,215,175, 67, 42,149,102,249,243, 17, 34,151,203,143, 52, +110,220,184,246,213,171, 87, 37,147, 39, 79,174,122,244,232, 81,213,227,143, 63,222, 64, 46,151,219, 8, 33, 48, 24, 12,236,217, +179,103, 3,103,205,154, 21,247,232,163,143,154, 30,125,244,209, 99, 43, 87,174,212,195,203,248, 87, 12,195, 28,202,202,202, 74, + 78, 76, 76, 20, 68, 91, 57,113,229, 44,184,128,178, 42, 79,142,227,142,121, 11, 40,199,113, 39, 47, 92,184,208, 89, 17, 32,131, +169, 84, 13,179, 70, 13,107,105, 41,108,165, 37,176,149,148, 0, 90, 53,164, 86, 43,196, 54, 11,228, 1, 1,200, 72, 79, 7,199, +113, 39,189,113, 74,165,210,147, 57, 57, 57,157, 67, 66, 66, 28, 47, 81,139,213, 90,182,216,108, 48, 89,173, 14, 71, 75, 44, 22, +227,230,205,155,144, 74,165, 39,239,117, 78,102, 89,214, 38, 12,225,224, 33, 30,136,142,142,230, 91,180,104,129, 97,195,134,193, +102,179,217,147,129,105, 15, 96, 15,202,218,183,220,151,112, 39,110,133, 70,235,122,189, 30, 26,141, 6, 69, 69, 69,156, 92, 46, +175, 29, 23, 23,119,192,100, 50,173,178, 90,173,223, 93,187,118, 77,237,137,211, 46,204, 28,162,139,231,121, 16, 66, 96,179,217, + 96,177, 88, 32,145, 72,248,157, 59,119, 97,214,156, 79,176,228,187,101,164,119,239,222,204,250,245,235,193,243,124, 58, 45, 87, +239, 9, 62, 43,254,121,106, 0,172, 54,173,113,231,114,205,143, 23,213,218, 73, 63,206, 61, 98,146,138,212,205,218, 69, 55, 76, + 78,170, 45, 10, 9, 9,101, 23, 46,154, 87,240,211,178,213,151,111,220,184,161,254,226,139, 47, 90,214,174, 93, 59,248,239,191, +255,142,243, 36,180, 20, 10, 69,205,151, 95,126,121,112, 81, 81,145,100,201,146, 37, 43,179,178,178,142,160,108,104, 25,231, 30, +212, 61, 1,252,128,178, 42,203,104,123, 57,183, 7,192,100,111,223,107, 12,195,224,175,191,254,186,165,119, 32,127,103,234, 60, +164, 70,141, 26,207, 94,189,122,117,119, 78, 78,206,211,174, 59, 37, 18,201,164, 90,181,106,117, 59,125,250,244, 68, 0,155, 42, + 66,172,211,233,198,172, 94,189,250, 83,145, 72, 84,197,102,179,101,234,245,250, 49,119,236,104, 89,248, 87,166, 47, 92,177, 88, +111,178, 85,147, 75, 69, 55, 12, 22,254, 85,154,149, 31, 92, 55,203,142, 60, 39, 55, 42, 15,101,243, 8, 58,175,255,109,127, 25, +153, 8, 33,194,177,121, 78, 46,150,201,197, 5,115,183, 47,239, 14, 6, 75,119,215,227,144,241,230,104,141, 3,240, 40,128, 67, + 57, 57, 57,243, 94,120,225,133, 89, 63,253,244, 83,144, 90,173, 70, 78, 78, 14,114,115,115,193,113, 28, 84, 42, 21,190,252,242, + 75,125, 78, 78,206, 60,231,115,112,235, 8,242, 0, 96,136,136,136, 56,178,108,217,178,152,175,191,254,154,123,241,197, 23,175, +247,236,217,179,206,151, 95,126,121, 85, 34,145, 16,155,205,198, 24,141, 70,230,245,215, 95,175, 62,103,206,156, 52,145, 72,164, +120,246,217,103, 25,165, 82,121, 8, 94,134, 13,200,203,203,219,250,235,175,191, 62,249,206, 59,239,200, 76, 38,147, 91, 39, 75, +216, 22, 18, 18,130,189,123,247,154,138,138,138,182,248,112, 49,182,254,177,105, 99,219,231,251,247,151, 88, 74,213,176,148,170, + 97, 85,171, 97, 43, 45, 6,163, 81, 67,108,179, 66, 46,225, 17, 19, 31, 0,171, 62, 16, 27, 15,255,109, 49, 26,141, 94, 7, 54, + 84,171,213, 91,247, 44, 89,210,254,209,132, 4,110,239,200,145, 48, 91, 44,120,226,194, 5,135,184, 50,155,205, 88,215,176, 33, +108, 12,131, 71, 94,123, 13,151,172, 86,171, 90,173,222,250, 95,124, 24, 78,156, 56,145, 59,112,224,192,163, 60,207, 55,169,136, +187,243, 95,135,197, 98,185,197,141,178,217,108,101,174, 99,153,115, 32,221,184,113, 99,219,179,103,207, 74, 78,157, 58,133,221, +187,119, 63,242,211, 79, 63,141,171, 86,173, 90,195, 27, 55,110,100,251, 18,111,238, 6,253,133,189,253,225,202,229,171,240,191, +255,253,143,201,206,206,198,207, 63,255, 12, 95,131,167, 82, 84, 26,180,176,218,228,166,157,203, 53, 61, 55,221, 40,221,159,165, +159, 12, 96, 51, 12, 54,114,233, 24, 57,209,180,105,104, 4, 0, 24, 13,182,152,154, 53,107,182,227, 56, 78, 10, 0,129,129,129, + 77,195,195,195,191, 44, 40, 40,104,237, 46, 77, 83, 83, 83, 91, 68, 69, 69, 53,254,253,247,223,255,206,202,202, 58, 13,224,160, +235, 65,213,171, 87, 31,127,238,220,185,230, 98,177,152,241,145, 71, 0, 0,237,218,181,171, 45,147,201,194, 55, 93, 12,134, 90, + 82, 3, 68, 84, 2,112, 1,176,133, 52,194,117, 73, 61,196,199, 31, 8, 47, 42, 42,122,164,164,164,228,239, 10,222,131, 14, 79, + 62,249,228,119, 75,150, 44,137,111,215,174, 29, 57,118,236, 24, 11, 23,123,168,122,245,234, 93,247,239,223,223,228,213, 87, 95, +253,106,197,138, 21, 67, 81,190,167,173, 47, 92,183,143, 55, 88,105,216,122, 25,219, 0, 91,130,221, 51,163,185,248, 33, 64, 69, +134, 92,184,131,225, 25,238, 40,136, 30, 13, 12, 15,219, 31,181,143,137,245,168,197, 98, 57,126,226,196,137,117,207, 62,251,172, +166,160,160, 0,225,225,225, 72, 76, 76, 4,195, 48,248,242,203, 47,245,215,174, 93, 91, 99, 31, 75,235,209,204,204,204,222,118, +177,229, 14,165,243,231,207, 95,177,116,233,210,144,163, 71,143,138,172, 86,171,170, 78,157, 58,186,125,251,246, 5,138,197, 98, + 34,145, 72,248,163, 71,143, 42,170, 87,175,110, 96, 24, 70,246,231,159,127, 22, 28, 56,112,160,218,232,209,163,191, 69, 89,119, +107, 79, 88, 62,101,202,148,140,171, 87,175,194,104, 52, 66,173, 86,163,164,164,196,177, 20, 23, 23,163,164,164, 4, 98,177, 24, +217,217,217,248,229,151, 95,178,236,163,196,123,115, 54,190,248,252,203,133,121, 89, 55,174, 67,165,144,195,170, 46,134,173,164, + 0, 40, 45,129,212, 98,134, 82,108, 67,213, 26,114, 4, 40, 84,200, 81,107,176,100,223,225,108,251, 40,241, 30, 97, 50,153,190, + 24, 49,103, 78,142, 85, 34, 65, 66,191,126, 48,219,171, 10,157,133,150,141, 97, 80,173, 83, 39,176,193,193,152,182,102, 77,142, +125,148,248,123, 10,158,231, 69, 38,147,201, 91, 60,192,243,124,250,217,179,103, 87, 0,216,193, 48, 12, 97, 24,134,160,108,176, + 54,205,253,252, 32, 91, 44, 22, 76,152, 48, 1, 18,137, 4, 19, 38, 76,192, 71, 31,125,132, 89,179,102, 97,225,194,133,248,241, +199, 31,177,113,227,198,164, 61,123,246, 72,118,237,218, 69,166, 79,159,158, 95,189,122,117,209,107,175,189, 22, 34,151,203,223, +246,198, 57,102,204, 24, 4, 5, 5, 97,204,152, 49,248,228,147, 79,240,205, 55,223, 96,221,186,117,216,187,119, 47, 68, 34, 17, +159,158,126, 19, 6,131,129,204,159, 63, 63, 99,221,186,117,250,121,243,230,129,227, 56,134, 22,173,247, 4, 31,200, 7,126,120, + 54,100,241,249, 43,251,179,244, 31, 0,248, 67,248, 34, 85,169, 84,242,181,107,127,229, 0, 96,205,234, 95,196, 23, 46, 92, 8, +254,245,215, 95, 3,162,162,162,240,227,143, 63, 6,200,229,242, 40, 15,156,182,117,235,214, 25,165, 82,105,248, 43,175,188,210, +189,121,243,230,111,217, 63, 68, 59, 1,168,143,178,222,139, 93,174, 92,185,114, 38, 34, 34,226,226,150, 45, 91,180,254, 4,180, +180,180,244,219, 31,126,248, 33,177,208, 22,134, 77,218, 39,177,132,255, 20, 27, 67,190,195,245,132,143,160,168,210, 12,207, 61, +247, 92, 21,155,205,182,184,130,241,127,174,111,223,190, 63, 44, 89,178, 36,254,149, 87, 94,201, 62,118,236, 88, 14,128, 37, 0, +150, 57, 47,231,206,157,203,127,225,133, 23,178, 22, 47, 94, 28,251,236,179,207, 46, 4,240, 52,205, 58, 20, 20,229,191,133,224, +161,215,161,167,194,124,157,213,106,237,205,113,220,122,148, 31,176,244, 77,147,201, 20,203, 48, 12,145, 72, 36,217, 57, 57, 57, +243,156, 7, 44, 77, 79, 79,239, 29, 31, 31,239, 56, 7,101,179,123, 59,143,165,165,122,226,137, 39, 58,239,223,191,127,193,134, + 13, 27,114, 75, 75, 75, 3, 87,175, 94, 45,159, 49, 99,198,117,158,231,201,123,239,189,151,208,173, 91, 55,157,205,102,203,122, +237,181,215,170, 39, 37, 37,189,118,238,220,185,109, 12,195, 56, 11,173,114,156,118,212,175, 81,163,198,222, 53,107,214,168, 66, + 66, 66,144,155,155,139,194,194, 66,104,181, 90,216,108, 54,136,197, 98,228,229,229, 97,242,228,201,234,204,204, 76,119, 3,150, +186,227,124, 52, 49, 46,110,235,188,137, 19,130, 66, 56, 22, 5,231,207,194, 90, 84, 0,177,213,130,170,245,131, 33,145,202,113, +233, 66, 41,222, 94,254, 75,233,141,194, 98,119, 3,150,186,229,108, 86,179,230,182,175, 70,143, 14, 52,220,188,137,216,151, 94, +130, 78,167,131,217,108, 6,203,178,184, 50,111, 30, 36,145,145, 24,191,114,165,246,244,141, 27,157,112,235, 80, 25,238, 56,239, + 20,206,156, 67, 25,134,113, 52,134,239,219,183,111,185, 3,127,253,245, 87, 44, 92,184, 16, 70,163,209, 74, 8,121, 19,192,151, + 0, 2,237,187, 53,247, 48,156,149,206, 25, 22, 22, 54,239,247,223,127, 79,140,138,138, 98,156, 71,108,183,139, 79, 0,192,176, + 97,195, 58, 29, 56,112, 64,214,184,113, 99, 99,126,126,126,243,200,200,200,237,203,150, 45,139,120,246,217,103, 51,207,156, 57, + 19,231,202, 25, 30, 30, 62,107,205,154, 53, 53,106,212,168,193, 10,174,152,107,245,228,144, 33, 67, 58, 47, 91,182, 76,250,228, +147, 79, 26,181, 90,109,116, 80, 80,208,229, 53,107,214, 68,244,233,211, 39,251,204,153, 51,177,247,235,253,124, 16, 56,235,215, +175,127,233,244,233,211, 53,132,117,189, 94,143,188,188, 60,228,231,231, 35, 36, 36, 4, 93,186,116,185,146,150,150, 86,195, 3, +103,227,103,158,121,102,226,226,197,139, 59, 43,149, 74,201,174, 93,187,180,219,182,109, 51, 92,191,126,221,106,177, 88, 72,108, +108, 44,215,186,117,235,128, 30, 61,122, 40,101, 50, 25,251,225,135, 31,230, 79,157, 58, 53,130, 97,152,229, 0, 6,186,227,108, +220,184,241,193, 63,254,248,227, 81,134, 97, 32, 18,137, 96, 50,153, 81, 92, 92,140,140,140,116,156, 57,115, 6,251,247,239,199, +150, 45, 91,254,214,106,181,141,253,140,123, 56,128, 93, 70,163,177,142, 84, 42,245, 91,216,219,108, 54,112, 28,119, 30, 64, 87, + 0,233, 52, 47, 81, 78,138, 50,137, 3, 55,141,225, 9, 33, 94,123,243,193,238, 78,173,179,127,153, 31,114, 51,132,195, 56, 0, + 19,156, 92, 48, 95,118,158,154, 16,178,187,115,231,206,195, 58,117,234, 52,167,107,215,174, 89, 89, 89, 89,201,179,103,207,142, +183, 90,173,230, 51,103,206,176,151, 47, 95,190,126,228,200,145, 26,181,106,213,122,237,220,185,115, 59, 93, 68,150, 39,156,185, +124,249,242,227, 29, 58,116,248,229,181,215, 94,171,214,162, 69, 11,105, 72, 72, 8, 56,142,195,213,171, 87,241,247,223,127,155, + 86,174, 92,153, 94, 92, 92, 92,145, 41,120, 14,165,101,100,116,121,118,248,155,107, 94,235,219, 43,226,177, 58,181,165,177,177, +177,128, 94,143,243, 55,178,113,224,252,223,230,111,118, 31,200, 51, 26,141, 79,195,255, 41,120, 14, 29,185,116,169,115,199,209, +163,215, 76,122,254,249,104,100,101,113,177,177,177,144, 74,165,184,118,237, 26, 46,243,188,117,230,162, 69, 57,106,181,250,223, +152,130, 71, 6,224, 83,158,231, 57, 0,144,203,229, 24, 49, 98, 4,156,167,220, 89,184,112, 33,244,122, 61, 0,112, 12,195,124, + 10,224,187,251,221,197, 18, 80, 88, 88, 56,254,137, 39,158,152,206,113,156,199, 81,111, 67, 67, 67, 81, 90, 90, 10,171,213,106, +203,200,200, 56, 31, 26, 26, 10,177, 88, 12, 66,136,219,231,168,160,160, 96,252,211, 79, 63, 61,133,101, 89, 79,206, 7, 84, 42, +213,245,237,219,183,215,124,245,213, 87,217,239,191,255,254,234, 43,175,188, 34,219,190,125,187,141, 16,242, 11, 45,183,254, 99, +165,168, 83,199, 6,251, 71,156,183,161, 20,142,175, 94,189,122,206,145, 35, 71, 34,135, 13, 27,150,252,252,243,207,171, 58,116, +232, 16,232,124,128, 94,175,231,127,251,237, 55,237,194,133, 11, 75,118,239,222,157, 54,100,200,144, 22,240, 50,119,234,141, 27, + 55, 54, 78,155, 54, 45,184, 71,143, 30,181, 0, 56,218,103,229,229,229,225,250,245,235, 56,117,234,212,117,179,217,188,190, 2, + 81, 42, 0, 48,105,192,128, 1,159, 46, 93,186,180,202, 43,175,188,146,189,114,229,202, 83, 40, 27,176,216, 21, 33,125,251,246, +109,184,116,233,210,216, 87, 94,121, 37, 27,101,237,200,104, 59, 66, 10,138,127,208, 30,183,182,211,242,250, 1,243,131,201,100, + 34, 6,131,129,232,116, 58,162,209,104, 8,220,207, 2,191, 46, 51, 51,147,164,167,167,147, 27, 55,110,144,180,180, 52, 2,224, + 71, 23,197,235,174,192, 82,254,244,211, 79, 53,226,226,226, 38, 42, 20,138,205, 34,145, 72, 45, 18,137,212, 50,153,236,143,240, +240,240,143,102,206,156, 25, 71, 8,145,120, 81,209,158,192,137,197,226, 87,163,162,162,214,133,133,133,165,135,134,134,166, 71, + 69, 69,173, 19,139,197,255, 3, 32,246,161,204, 61, 33,128,227,184,119,149, 74,229, 86,153, 76,150, 43,147,201,114,149, 74,229, + 86,142,227,222,133,247,129, 84,189,114, 74,165,210,119, 35, 35, 35,183,170, 84,170, 92,149, 74,149, 27, 25, 25,185, 85, 42,149, +222, 9,231,157,124,149, 8, 66, 75, 71,236, 96, 24,198,242,200, 35,143,124,213,164, 73,147, 47,155, 52,105,242,101,163, 70,141, +190,102, 24,198, 34,236, 7,160,131,231,193, 27,239,102, 56,255, 53,206,148,148,148,101, 75,151, 46,229,199,143, 31,175,174, 85, +171, 86,225,248,241,227,213, 75,151, 46,229, 83, 82, 82,150,221, 46,103,116,116,116, 66, 74, 74, 74,225,226,197,139,173, 23, 46, + 92, 32,139, 23, 47,182,166,164,164, 20,186,140, 12,255, 64,222,207,255, 58,103,253,250,245, 47, 17, 39,152, 76, 38,146,151,151, + 71, 46, 92,184, 64,118,239,222, 77,226,227,227, 47,249,193, 25, 14,224,117, 0,191,197,196,196,156,107,217,178,229,141,199, 31, +127,252, 70, 66, 66,194, 85,177, 88,188, 31,101, 35,188,167,216,151, 79, 1,212,242,193,217, 50, 36, 36,100, 90,124,124,252,250, +154, 53,107,238, 77, 76, 76,220, 31, 22, 22,182, 33, 32, 32, 96, 6,254, 25, 25,187,162,113,239,240,228,147, 79, 94,215,104, 52, +182,166, 77,155,158,115,119, 82,221,186,117,247,104, 52, 26, 91,255,254,253,211, 1,164,210,188, 68, 57,239, 18,231, 3,253,129, +230,138,154,118,193,180,206,105, 25,231,230,184,113, 46,199,252, 96, 63,215,103, 66, 16, 66, 68,132, 16, 37, 33, 36,152, 16, 18, + 70, 8, 9, 33,132, 4, 18, 66,100,132, 16,150,102,194,127,133,115,168, 93, 64,233,236,255, 93,225,107,255, 3,125, 63,227,226, +226, 66,155, 55,111, 62,124,237,218,181,239, 94,185,114,229,221,181,107,215,190,219,188,121,243,225,113,113,113,161,119, 18,206, +232,232,232,132,122,245,234, 45,168, 91,183,110,122,189,122,245, 22,184,136, 44,154, 63,255, 37,206,164,164,164,223, 27, 54,108, +120,169, 81,163, 70,151, 27, 53,106,116,169,126,253,250,151,234,212,169,115,169,122,245,234,151,170, 86,173,122, 41, 34, 34,226, +247,219, 8,103, 24,128, 88,220, 58, 13,216,191, 29,247,246, 41, 41, 41, 7, 2, 2, 2,220,142, 13,198,113,220,164, 70,141, 26, +157, 68, 89, 79, 73,154,151, 40, 39, 21, 90,149, 32,180,104,134,121,120, 57,101,240, 62,205,136,175,253,244,126, 82, 78,202, 73, + 57, 41, 39,229,164,176, 11, 45, 58,250, 52,133, 43,140,240, 62, 50,174,175,253, 20, 20, 20, 20, 20, 20, 15,157,166,114, 89,218, + 9, 59, 24, 47,170,180, 34,189, 9,110, 71,217,110,163,156,148,147,114, 82, 78,202, 73, 57, 41,231, 67,199, 41, 96,142,135,237, +231, 93,214,191,190, 79,133, 23, 67,171, 14, 41, 39,229,164,156,148,147,114, 82, 78,202,249, 95,225,116,135,215,238, 83,145,213, + 14,240, 49,188, 3, 5, 5, 5, 5, 5, 5, 5, 5, 69,133,225,123, 82,233, 85,171, 86,137,132,255, 3, 6, 12, 24, 98,179,217, +134, 11,235, 34,145,232,243,159,127,254,249, 59,111, 87,232,215,175,159,205, 27,167, 59,248,186,142, 59,206,250,181, 84,111,132, + 7, 43,222, 44, 46,209,205,189,154,105,219,109, 48, 24,234, 9,251, 2, 2, 2,206,126,247,221,119, 23, 43, 59,156, 67,134, 12, +169,229,122,157,196,120,113,251,176,160,128, 17,133,197,154,217,167, 47,105,190,166,121,236, 95, 65, 4,128,212,160, 0, 73,239, +250, 33,146,150,167, 10, 12,251,180,102,219,111, 40,235, 13, 91,244, 32, 70, 56, 38, 38,166,142, 74,165, 26, 4,160,190, 78,167, +139, 82, 40, 20,185, 0,206,168,213,234,101,217,217,217,231,253,229,105,151,136,235, 0,170,217, 87,111,236, 76, 67,130, 63,251, +124,161,107,117, 24, 8, 32, 99, 24,152,183, 92,134, 99, 2,205,110, 53, 96,224,201,173,219,187,214,128,137, 16, 72, 24,192,184, +229, 10, 2, 30,160,164, 82, 1,232,130,178, 33, 28, 78, 0,216,130,178,158,187, 20, 20, 20, 15, 14, 92, 39,148,118,172,115, 30, +196, 68, 91, 9,199, 44, 32, 32, 33, 0, 9, 55, 26,141, 98,169, 84, 10,147,201, 4,133, 66,254,197,235,175, 12,153, 8, 22,197, + 22, 43, 70,124,247,221,119,183, 61,211,117, 69,174, 3,224, 47,215,243, 67, 85,242, 41, 59,126,123, 47,180,109,207,153, 51, 76, +215,242,199,148,150,150,178, 50,153, 12, 70,163, 17,193,193,193,143,191,241,218,107, 77, 89, 49, 49, 73, 36,202,125,115,230,204, +201,190,221,112,190,253,246,219, 49,102,179,161, 21,207,243, 82,147,201, 36,115,189, 78,176, 66, 57,115,199,111,239, 41,218,165, +206,152, 8, 80,161,245, 47, 64,154, 16,170,220, 57,119, 64,251,186, 45,235,215, 4,127,102, 23, 12, 38,115,239, 29,233,154,222, + 31,237,207,124, 39, 93, 99,110, 2, 47, 3, 65,222,135, 16, 37, 39, 39, 15,139,140,140,236,191,104,209, 34, 73,114,114, 50, 2, + 2, 2,160,215,235, 99,175, 92,185, 18,251,198, 27,111,180,147,203,229, 43,174, 94,189,250, 5,252,155, 8,174,218,142, 31, 62, + 4, 0, 60, 62,104,114, 53, 0,239, 58, 9, 1,199,190,246,131, 39, 87, 3, 48, 26,229, 39, 70,206, 2,176,222, 67,169, 35,221, +176,116, 22,122,191,240, 46, 7,224, 13, 71,224, 89,224,143, 31,231,161,251,128, 55,203,109,103, 8,184,223,150,206, 66,234, 11, +239,122,156,213,188, 91, 77,198,194,243,196,163, 19,207,178,140,117,243, 37,226,110,130,225, 28, 0,238,230, 35,237,134,178, 9, +157,221, 30,223,179,142, 40,199,108,177,185, 29,112, 86, 34, 22,229,110, 60,111,187,229,220, 23, 27,195, 98,177,149,149,173, 18, + 14,182,117, 87,131,119,124,240,193, 7, 92,106,106, 42,190,249,230,155,214, 95,127,253,245,107,165,165,165,127,218,239,219,101, +250,248, 82, 80, 60,208,130,203,189,208,226, 68,248,106,253,154,239,106,228,228,230,227,197, 87, 71, 97,249,242,229, 40, 42, 42, + 66,104,104, 40,164, 18,137,120,238,167, 31,198,168, 84,202,152, 23, 95, 27,243, 21,128, 58,183, 27,154, 10, 94,167,166,235,249, +140,125, 14, 68, 78,196,138,165, 82, 41,187, 98,197, 10, 20, 23, 23, 35, 36, 36, 4, 82,169,152,157, 51, 99,156, 92,165, 10,148, +191, 60,116,108,107, 0,171,110, 55,156, 38,147,166,245,218,229,223,169,242,242,242, 48,248,127, 99,224,122, 29,137, 68, 98, 19, + 94, 44, 52,143,253, 43,248, 96,209,136, 23,234, 54, 8, 2,204,167,247, 66, 44, 18, 65, 17, 28,138, 46,156, 8, 34, 6,245, 94, +220,156,246, 62,128,143, 30,148,200, 38, 39, 39, 15,235,215,175, 95,255, 41, 83,166, 72, 88,182,172,227,176, 86,171,133, 94,175, + 71, 92, 92, 28,118,236,216, 33, 25, 63,126,124,255, 95,127,253, 21, 87,175, 94,157, 95, 81,254,211,167, 79, 39, 86,171, 86,205, + 0, 0,189, 26, 6,185,238, 75, 16,246, 1, 64, 80, 80,144, 79,190,240, 16,165,241,244,233, 3,245,133,243,134,117,138,179,121, +216,110, 0,160,240,198,197,243,132,219,178,224, 13,143,251, 95,157,242,147,245,196,170,221,117,146,147,147,245,206,219, 3, 3, + 3, 61,157, 18,173,209,104,170,185,110, 20,142, 55, 91,108, 81,158,174,215,117,196, 66,183, 2,204, 98, 3,247,211, 79, 63, 1, + 0, 62,123,119,160,104,241,193,124,142,227,202,138,218, 79, 63,253, 20,147, 38, 77,146,110,222,188,185,199,210,165, 75,123,172, + 91,183,110,174, 39,161, 74, 65, 65,113, 95,138, 44,231, 95,207, 66,139,101,152, 32, 85, 80, 32,158,121,238,117,252,254,251, 31, +104,219,182,173, 99, 95, 82, 82, 18,250, 61,221, 7, 63,255, 48, 7, 0,130,238, 36, 68,119,122,157,162, 18,237, 71,221,251, 47, +152,124, 35, 91,179,127,195,134, 13,104,211,166, 77,185,243,159,123,246, 25,252,248,237,167,240, 50,202,188, 95, 96, 8, 43, 9, + 82, 41, 49,224,197,255,193,221,117, 94, 27,220,119, 67,183,126,243, 58,231, 20,104,231,208,124,118,239, 81, 35, 38,188,107,195, +186,117, 80,244,203, 23,248,187,216,128,223, 51, 13,120,185,203, 99, 72, 9,147,163,141,213,134, 24,165,184, 99,182,214,242, 64, + 8,173,152,152,152, 58,145,145,145,229, 68, 86,105,105, 41, 52, 26, 13,212,106, 53, 74, 75, 75,193,178, 44,198,140, 25, 35,217, +185,115,103,255,152,152,152,109,126, 84, 35,222,176, 59, 89,128, 72,172,153, 48, 97,130, 49, 42, 42,202,168, 80, 40, 8, 39,145, +149,182, 31, 60, 57, 8, 0, 88, 78, 82, 58,119,238, 92, 83, 92, 92,156,129,227, 56,233,155,111,190,233,215,240, 48, 70,163,145, + 56,115,154, 76, 70,199,246,153, 51,103,154,162,163,163,141, 10,133,130,152,205,254,155,142, 39,175, 21, 66, 38, 17, 65, 38, 17, + 33, 64, 42, 70, 80, 98,115,200,138, 78,193,106,181,226,147, 79, 62, 49,199,196,196,152, 20, 10, 5,145, 74,165,146,145, 35, 71, +250, 12,231,144, 33, 67, 72, 72, 72,136, 89,161, 80, 72, 38, 77,154,116,203,180, 25,219, 79,100, 64, 46, 21, 67, 33,227, 80, 51, + 41, 30, 50,162,247, 59,172, 34, 81,249,214, 8, 50,153, 12,173, 91,183, 70,253,250,245,177,110,221,186,246, 84,104, 81, 80, 60, + 16,240, 56,221, 14, 7, 0, 27, 54,108,104, 7, 96, 7, 0,164,166,166, 50,101,103, 16,140, 30,246, 52, 94, 30, 60, 0, 54, 27, +239, 24,221,148, 97, 25, 12,125,169, 7,120,222,159, 26, 9,223, 93, 60,111,227, 58,255, 76, 82,205,176, 34, 0,168,145, 16, 75, + 94,123,249,121,216,120,254,159,138, 18, 17,240,250,224,238,101,219, 42, 33,156, 34,216, 48,234,141,167,224,238, 58,117,106, 84, + 97,173,102, 3,152,242,147, 61,222,141,201, 54, 41,167, 27,212,175, 26, 91,221,162,215,195, 96,176, 96,201,249, 66,253,214, 12, +109, 20, 27,146,150, 55,239,153, 22, 1,162,188, 76, 36, 4, 73,107,102,107, 45, 15, 68,220, 85, 42,213,160, 69,139, 22,221, 34, +178,114,114,114, 88,141, 70, 3,179,217,204,151,150,150,194,102,179, 97,236,216,177,226,241,227,199, 15,202,206,206,158, 36,104, + 30,119,156,246,118, 87,163, 79,159, 62,157,240,193, 7, 31,152, 59,118,236,120, 35, 41, 41, 73, 43, 18,137, 16, 27, 27, 59,175, + 75,151, 46, 97, 83,166, 76, 49,247,232,209, 35, 77, 36, 18,161,102,205,154,218, 83,167, 78, 37, 0,144,251, 27,119,103,206,239, +182,127, 78, 0,128, 97, 24,116,233,210,229,122,205,154, 53,181, 34,145, 8, 23,127,155, 73,252,189,159, 98,142, 69,173,184, 96, +123, 33,194, 0,242, 64, 71, 75,188, 46, 93,186,164,215,169, 83, 71,195,178, 44, 78,158, 60, 25,143, 91,167,181,186,133, 83, 46, +151, 91,158,123,238,185, 27,231,207,159,119,119, 60, 56, 17,139, 22,117,236, 6, 86, 92, 19, 32,125,143,199,112,138, 69,176,142, + 31, 54,144, 11, 9, 0,100, 65, 17, 70,181, 90, 13,149, 74, 85,230,144,153,205, 56,126,252, 56, 90,182,108,217,110,213,170, 85, + 59,233,243, 78, 57, 41,231, 63,112,167, 69,238, 67, 55,139,113, 90, 47,215, 70,107,135,107,164,108, 54, 43,146,170, 69, 99,230, +135, 67, 96,179,241,176,217,108,176,218,127,109, 54, 27, 44,102,115,165,132,236, 78,174, 19,170,146, 79,249, 99,197,136,208,142, +125, 63,237, 52,253,131,193, 91,109, 54,128,231, 45,176, 88, 0, 27,111, 1,111,179,193, 98,169,156,166, 57, 22,158, 71, 66,124, + 12,166,127, 48, 24,174,215, 89,246,243,170, 94,219,215,143, 81,180, 77,157, 49,234,226,117,221, 39, 84,216,223, 91, 4, 72,100, + 28,225, 2, 96, 50, 89, 81,106,226, 77, 0,180, 6, 11,111, 38,202,136, 0, 0,224, 88,230, 65,234, 93, 91, 63, 57, 57,185,156, +200,154, 53,107, 86,196,151, 95,126, 25, 7, 0, 79, 63,253,116, 70,167, 78,157,242, 47, 92,184,128,216,216, 88, 38, 63, 63,191, + 39,128, 55,237,231,142, 6,240,165, 7, 94,109,181,106,213, 12,145,145,145, 70, 65, 16,177, 44, 11,142,227, 80,173, 90, 53, 67, + 84, 84,148,177,102,205,154, 90,137, 68, 2,150,101, 33, 8, 61,191, 62,243, 24, 6, 34,145, 8, 2,167,171,219, 35,112, 86, 4, + 98,142,189,181,120,115,226,100, 89,214,237,245, 60,230,161,128, 0, 2,192,227,241, 34,214,169,120,228,188,183, 16, 88,114, 28, + 98, 0, 59, 8, 33, 56,118,236, 24,174, 94,189, 10,137, 68,130,152,152, 24, 76,154, 52, 9, 70, 99,153,222,237,215,175, 95, 59, + 0, 39,233, 19, 76, 65,225,192,142,251, 80, 96,185,186, 90,222,219,104,109,216,176,161, 93,106,106,234, 78, 65, 0,149,137, 29, + 55,226,199, 98,133,197, 98, 6, 42, 97, 32, 46,111,215,177,217,120,175,215, 17,218,104,241, 60,225,220,138, 44,158,135,213, 98, +169,148,187,199,219, 44,224,121, 11,220, 93,135, 97, 88,155,189,192,151,208,231,228,222, 35,166, 90, 2,107,169,150,132,221, 86, + 3,226,194,101, 82,228,235,145, 92,187,174,232,184,206,130,189, 39,206, 34, 34, 80,245,192,164,139, 78,167,139, 10, 8, 8,128, + 86,171,117, 56, 89, 95,126,249,101,156,201,100, 98, 1,128,227,196,241,121,124, 92,128,141, 7,130, 85, 89, 40, 42, 42, 9, 39, +132, 48,118,193,243, 41,128,239,224,101,100,127,137, 68,226, 16, 40,206, 2, 72, 38,147,221,150,128, 17, 32,136, 51,137, 68,226, +118,187,107,245,154, 47, 72,156,133, 22, 72,153,171,229, 34,182, 68, 34, 17,132,182, 81,190, 32,149, 74, 29,113,119, 7, 78,228, +116, 61, 81,197,155, 98,154,205,102,104, 52, 26, 20, 23, 23, 35, 32,160,204, 48, 35,132,128, 97,152, 55, 1,188, 69,159, 98, 10, + 10,247, 90,228, 62, 22, 91,238,133, 22,202, 44, 59, 6, 0,172, 22,179, 91,241,179,234,183,189,184,145,173, 69, 76,196, 33, 16, + 47,117,146,238,208,191,127,255, 31, 98, 99, 99, 91, 8,235, 50,121, 96,248,107, 35, 62,134,213,106, 70,144,156,197,171,131,186, +151, 19, 89,101,142,150, 9,158,228, 92, 81,137,246,163,238,253,230, 79, 14, 86,133,239,119, 21, 63,211,151, 28,125,166, 72,109, +140,103,217,195, 40, 98, 98,109,253, 94,255,120,136, 83,225,126, 98,197,194, 9,239,248,237, 7, 50,172,248,153, 55,230,189, 70, +184,192,122, 10,182,116,215,123,131, 31, 91,235, 44,230,194,194,194, 54,116,125,102,110,231,156, 66,218, 70,235,223, 64, 80,112, + 8, 27,223,172, 61,154,189,185, 0,219,199,189, 71,128, 34,132,199,198,177, 29,134, 77, 69, 96,179, 94, 56,240,234, 32, 30, 40, +124, 32,226,170, 80, 40,114,117, 58, 93,172, 94,175,135, 90,173,134, 90,173, 46, 47, 8,196, 98,230,181,255, 13,143, 16, 75,164, +176,152, 77,248,125,217, 84,159,156,194, 16, 14,189, 26, 6, 65, 36,150,150,158, 73, 78,158,199,113, 28, 88,150,197,111, 95,188, +247,230, 47,179, 71, 4, 1,192,137, 13, 95,168, 7,140,249,124, 62,203,178, 48, 26,141,178,138,132,251,230,205,155,241, 70,163, +209, 96, 23,104,130,240,195,181,107,215,170, 26,141, 70,189,243,118,127, 32, 87, 4, 1, 33, 73,128, 34,234, 22,247, 44, 45, 45, +173,138,197, 98,209,113, 28, 7,147,201,228,151, 42, 98, 89, 86,114,242,228,201,120,158,231,221, 30, 95,191,122, 21, 32,166, 33, + 32, 13,246, 59,206,254,140, 8,109, 23, 91, 4, 21, 44, 75, 41, 40, 30,116,103,235, 62,124, 38, 24, 15,255, 29, 66,171,253,134, + 13, 27,136,243, 23,162,213, 98,177,139,172,127, 68,143,205,198, 35, 51,207,128, 11, 23, 46, 98,238,220,185,216,123,224,221,224, + 41, 83,166,200,198,143, 31,111,236,223,191,255,108,158,231, 27,177, 44,123, 2,255, 84, 85,148,119,133,120,190,234,209,163, 71, +147,133,117,139,197,130,160,160, 32, 4, 5, 5,161, 78,205,248, 91, 68,150,205,102,131,217, 75,213,161,208, 70,139, 33, 60,177, + 88,108,176,241,188, 67,252, 20,169,141,241,235,183, 29,171,225,116,120,109,225, 79,235,230,245, 60,139,193, 55, 38, 57,226,177, + 98,225,132,119,166,124,243,141,172,200, 22, 57,114,192, 51, 47,167,244, 27, 48, 8,207, 61,245, 68, 59,163,201,180, 78,196, 18, +222,226,184, 30, 88, 16,184,182,209,162,184, 71,184, 92,172,181,136,101,114, 4,198, 36,226,162,198, 38, 17,137, 68,135,174, 20, +235, 36,172,136, 3,203, 73,112,166,200, 96,121,128,162,123,230,242,229,203,177, 85,171, 86,133, 90,173,134,213,106,229,159,126, +250,233, 12,142, 19,199,115, 98, 49,147, 58, 96, 56,159,157,157,105, 97, 89, 17, 8,177,225,137,126,111, 48,178, 0,185,196,108, + 50, 89, 81, 86,117,232,206,205,114, 30,194, 33,168, 75,151, 46, 97, 66, 79,192, 95,102,143, 8,114,218,167,106,218,180,105,152, +115,175, 67, 63,221, 34,166,127,255,254,242,106,213,170, 49, 0,112,120,217, 7,130,123,198,244,234,213, 43,160, 90,181,178,118, +248,127,126, 49,194,111,206, 8, 5, 1, 74,174, 1, 37,105,183, 56, 89,189,122,245,146, 37, 39, 39, 87,232, 89,180, 55,128,247, + 56,118,151,146,179, 2,217,199,252,226,122,177, 49, 44,113,129,224,102, 63,193, 66, 26, 24,110,108,241,222,230,131, 84,108, 81, + 80,248, 5, 23, 45,114, 95,161,157, 93, 32,182,183,255, 58, 4, 23, 7, 0,118,139,142,113,210, 89,176, 88,205,183,136, 44,155, +205, 6, 49, 99,196,220,185,115,241,214, 91,111, 1,128,228,157,119,222, 89, 59,101,202,148, 39,121,158,111, 68, 8,105,195, 48, +140,183,175,198, 29,177,177,177, 57,132, 16, 49,203,178,109,190,248,226,139,176, 30, 61,122, 32, 40, 40, 8,132, 39,183,136, 44, +155,141,135,217,108,130, 39, 75, 43, 84, 37,159,242,199,170,145,161, 29,251,124,218,201,198,243, 91, 5,145,197,219,108, 0, 95, +118, 82, 65,110, 6,182,252,190, 14, 95, 45,252,170, 8, 12, 57, 7, 2,222, 46, 6,225, 65, 12, 54,218,115,248,108,155,214,205, +235, 97,202, 55,223,200, 78, 31,205, 90, 59,252,237,247, 83,250, 13, 24,132, 85, 63, 47, 3,107, 45, 62,230, 44,178,108, 22, 30, + 37, 69,249,189,254,162,109,180,254, 45,132,109,217,186,149, 25, 52,104, 16, 95, 90, 90, 10,137, 84,202, 91, 44, 22, 81,171, 86, +173,108,111,189,245, 22,155,157,157, 13,117,169,134, 3, 16,134, 7,192,214, 82,171,213,203,222,120,227,141,118,187,118,237,146, +176, 44, 11,181, 90,141, 14, 29, 58,228,231,241,113, 1,175,253,111,120, 68,102,102,134, 85, 37,231,140, 18,137, 24,185,185,185, +124,187, 30, 3,245, 3,134,188, 85,229,173, 15,166, 47,202,218,183,240, 75,127,174,225,220, 19,208,117,223,226,197,139, 77,113, +113,113, 6,153, 76, 38, 29, 60,120,176, 95,245,135, 38,147,137,204,156, 57,211,232,218,187,208,100, 50,145,185,115,231,154,226, +227,227,141,114,185,156, 88, 44,190,219,125,178, 44, 99,125,117,202, 79, 86,171,213, 90,206,197, 18, 68,150,133,103, 52, 11, 22, + 44, 48,199,199,199,155, 20, 10, 5,145,201,100, 18,127,194, 57,124,248,112, 18, 26, 26,106, 86, 42,149,146, 49, 99,198,220, 81, +175, 67,139, 13,220,148, 47, 28,195, 59,200,130,130,130, 80, 90, 90,234, 8,107,108,108, 44, 21, 91, 20, 20,110,112,139, 22,185, + 63, 93, 56,255,198,209,226, 1, 77, 78,110,126, 84, 68,116, 34,172, 86,171,125,177,192,106,177, 96,228,235, 3, 48,123,225, 2, + 0, 16,196, 86,151,119,222,121,103, 45, 0,159,133,217,138, 21, 43, 38,191,243,206, 59,170,156,156,156,205, 63,252,240, 67,216, +192,129, 3, 49,122,244,104,124,250,233,167, 16, 75, 3, 16, 22, 89,213,113, 29,225,186,249,121,133, 32, 32, 26, 15, 62,157,185, +172,144, 2, 23, 30,153, 0,139,205, 2,222, 98,129,197, 98, 1, 35, 42,139,218,150,223,215, 97,224, 75,195, 33,150,169, 66, 63, +159,251,137, 62,165, 89,236,147,227, 95,121,197,232,135, 9,200,158, 62,154,181,118,248, 91, 99,186, 8, 34,107,205,178,133,231, + 62, 27,219,103,185, 76,202, 57,174, 99,225,121,176,172,136,182,209,250,151, 68,150, 76, 38, 91,189,105,211,166, 75, 77,154, 52, + 97,180, 90, 45, 44, 22, 11,242,243,243,177,118,237,218, 51,132, 16,132,134,134, 98,211,166, 77,252,192,129, 3, 87, 27,141,198, +103,238,119,177,149,157,157,125, 94, 46,151,175,120,255,253,247, 7,140, 29, 59, 86,204,243, 60, 46, 92,184, 0, 48, 12, 17, 75, +164, 96, 89, 22, 98, 49,135,146, 18, 53,175, 8, 12,201, 50, 19,145, 66, 44,145,130, 21, 73,188,117, 19,190, 97, 31,140, 20, 44, + 39, 41, 21,122, 2, 74, 36, 18, 28, 88, 53, 75,221,126,240,100, 21, 0, 72,100,242,162,174, 93,187, 94,175, 87,175,158,246,200, +145, 35, 9,184,181,215,161,235,243,105,237, 59,120,140, 72, 33, 15,208,118,233,210,229,134,192,153,182,245,115,245,160,161, 31, + 48,140, 72,170, 77, 77, 77,189,158,146,146,162, 21,137, 68, 56,187,238, 19,117,223,193, 99, 2, 24, 47,131,172,110,190, 68, 94, + 61,177,106,119,157,169, 83,167, 90,122,244,232,113, 83,104, 47,150,150,150, 86,165,103,207,158,178, 57,115,230, 88,122,246,236, +153,222,160, 65, 3, 13,203,178, 56,122,244,104,188, 55,167, 74,128, 92, 46,183,188,252,242,203, 55, 78,157, 58,117,187,189, 14, +189,162,106,213,170,224,121, 30, 29, 58,116,128,193, 96,160,206, 22, 5,197,131, 9,215,113,180, 60,143, 12,111,177, 90,134,191, +254,230,196,207, 1, 38,208,169, 20,248,199, 88, 34, 96,222,125,119,148, 18,128, 92, 16, 91,111,191,253,182,207,105, 78,156, 68, + 86,179,129, 3, 7, 98,220,184,113,248,236,179,207,108,159,126,250,169,232,252,197,107,230,193, 67, 63, 42,118,185, 14, 8,136, +134,183,240,195,221,241, 21,149,104, 63,106,211,115,198,196,140, 28,221,158,193,111,140,119,148, 94, 54, 0,106, 38,214, 6, 0, + 95, 45, 92,168, 21,203, 84,202,126, 3, 6, 1, 64,151,207,231,126,178,118, 10,190,241, 45,182, 8, 83,119,248,219, 99, 66, 5, +145,245,197,156,169,167,130,153,156, 5, 35, 70,157,177, 56, 95, 7, 0,194,130,176,182, 77,207, 25,221,114, 11,181,243,104, 62, +187,119,144, 74,165,147,183,111,223,174,108,216,176, 33, 83, 80, 80, 0,155,173, 44, 69,204,102, 51, 74, 74, 74, 80, 90, 90, 10, +163,209,136,166, 77,155,178,243,231,207, 87,142, 24, 49, 98,178,201,100, 26,122,191,199,251,234,213,171, 95,172, 95,191, 30, 59, +119,238,236, 63,118,236, 88,113, 76, 76, 12, 19, 28,156,195, 88,204, 38, 0,132,228,229,229,241,138,192,144,172,136,232,248, 27, +153,217,185,117, 45,102, 19,120,155,217, 99,107,115,251,240, 14,239,158, 62,125, 58,113,214,172, 89, 38,231,158,128, 3,198,124, + 62,191,105,211,166, 97, 11, 22, 44, 48,165,166,166, 94, 23, 26,175,251,211, 24,126,203, 21,188,121,250,244,201,250,174,156,237, + 95,155,245,173,192,233,220, 27,177,215,168, 69,223,214,172, 89, 51, 44, 37, 37,229,186, 55,222,228,228,100,125,108,108,172,169, + 78,157, 58, 26,177, 88,252,127,246,206, 58, 60,138,171,141,226,103,102, 93,227, 78, 72, 8, 22,197, 37,184, 91,209, 22, 45, 78, + 41, 86,172, 80,138,180,120,161, 80,188, 88,129,150, 2,165,248, 71,139,107,113, 39, 9,193, 18, 36, 16,119,151,117,153,251,253, +145,108,154,132,200,110, 66, 75,105,231,247, 60,243,108, 50,114,246,142,238,153,247,222,251,222,252, 72,150, 94,175,172, 89,179, + 38,227,236,236,172,245,243,243,203,179,180,209,190, 88, 44, 38,166,168, 88,105, 88,210,235,144,199,129, 97,216,176, 97,133,153, +225,103,213,169,147, 56, 98,196, 8,215,153, 51,103, 98,231,206,157,184,121,243,230, 27,102,191,125,251,246,184,118,237,218, 18, +252,139, 18,235,178,176,252,199, 40, 63,143, 86, 73,118,237,218,251, 7,138,180,105, 42,141,101,203,150, 9, 11, 34, 89, 93, 63, +255,252,115,168, 84, 42,219, 82, 86,235,130,130, 92, 27,165,153,172, 85,171, 86,237, 39,132,184, 3,104, 99, 52, 50,119,127,252, +105, 87,199,178,190,111,208,160, 65,111,104, 18,138,230,208, 52,149, 39,224,145, 7, 63,236,216,249,107,177,245,243, 27,191,123, +131,194,195,205, 27, 86,169, 0,116, 45,105,182,240,231, 48, 35,133,154, 38, 38, 78,154, 88,104,178, 54,111, 88,117, 33,160,169, +199, 71,243, 63,253,166, 84,115,246,205,162, 9, 82,154,166, 90,149,104,163,245,134,230, 91,128,213,252,147,142,195,134, 13,107, + 16, 24, 24, 72, 23, 53, 89, 90,173,182, 48,113,167,169,177,120,124,124, 60,218,183,111, 79, 55,104,208,160,222,189,123,247, 58, +226,207,225,156,222,215,125, 55,190,126,253,122,163,139,139,203,197,133, 11, 23,142, 72, 75, 75,235,149,153,153,101,127,114,215, + 55,232, 49,104, 18,213,190,231, 80,133,150,112, 69,113,137,201, 62, 87, 78,239,179, 59,115,112, 11,116, 90,237, 4, 0,225,248, + 51,189, 67, 73, 77,165, 41,141,131,143,143,143,162,168, 81,241,240,240, 80,187,185,185,105, 2, 2, 2, 10,231,151,209,155,239, +141,125,183, 84,179,160,253,151,162,162,227,105, 50,109, 37,211, 70, 72, 36, 18,152,204,151, 37,229, 44,218,219,178,212, 7,101, +197,189, 14, 11, 53, 11,210, 59, 20,243,105,123,247,238,237,178,119,239,222,166, 0, 30, 32,127,172, 67, 61,144, 95,149, 88,164, +209,252,226,130,137,189,223, 89,205,255,170,230,251, 76,123,252,217, 54, 11,200,111,171,117,181, 76,163, 85, 17,166,134,239, 0, +232, 25, 51,102,100,170, 84, 42,219, 17, 35, 70,148,187, 77, 82, 82,210,206, 61,123,246, 20, 51, 89,253,251,247, 31,115,228,200, +145,139, 41, 41, 41,149,218, 43, 91, 43,241,178,171, 39,230,216,182,239,189,242,115, 0,171,203, 8,228, 49, 1, 77, 93, 63,218, +188, 97,213,111, 37,204,214, 47, 0,250,151,229, 74,187,125,208, 15,251,118,109, 54,181,237, 18, 63, 14,138, 63, 51, 36,100,105, +169,189, 21,109,100,194,165, 5,229,152,201,182,209,250,123,224,243,249, 29,230,206,157,203, 87, 40, 20,111,152,172,146, 70, 43, + 39, 39, 7, 15, 31, 62,196,232,209,163,133,161,161,161, 29,116, 58,221,229,127,195, 49, 72, 74, 74,122, 86,144,140,116,186, 41, +133,131, 80, 36,230, 15,253,228,115,247,194, 94,135, 7,183, 64,163, 86, 1, 0,215,156,244, 14, 92, 46,151, 31, 26, 26,234,105, +138, 90,233,116, 58,161,105,126, 80, 80,144,167, 41,183,150, 90,173, 54,187,215,225, 95,165,249,232,209, 35,119, 83,239, 72, 83, +239, 66, 46,151,203, 15, 14, 14,118, 55,105,106, 52, 26,179,122, 29, 10, 4, 2,126,104,104,168,187,209,104,124,107,189, 14,139, + 26, 99,228,143,179, 88,108,172,197,130,182,101, 20, 69, 81,132,173, 54,100, 97,121,239, 41,217, 83,178,252, 65,165, 43,194,212, +240,221,130, 77,184,213,171, 87,239,246,241,199, 31, 23, 51, 89, 3, 7, 14, 52, 30, 61,122,244,138,171,171,107, 50, 77,211,207, + 44, 45, 71, 97, 27, 45,188,241, 6, 9,154,166, 31,182,105,230, 7,154,166, 31,206,255,244, 83,205, 50,252, 84,204,108, 29,251, +237, 80,247,184,204,167,165, 91, 51, 0,246, 78,213, 48,108,204, 20, 12, 27, 51,197, 22, 64,107,160,236,222,138,229,149,131,229, +175,129,162, 40,129,155,155,219, 99,181, 90, 13,138,162,160,209,104, 10, 13, 86,110,110, 46,178,179,179, 11,255,215,233,116, 72, + 77, 77,133,135,135, 7, 40,138,250, 87,183,163,211,233,116,134,185, 75,214,236,225,112,249, 6,134,209, 81, 58,157,238, 19, 75, +238,243,185,115,231,210, 40,165,237,213,212,169, 83, 75,157,255,174, 52,191,250,234,171, 82,123, 9, 78,157, 58,181,220,222,131, +101,241,197, 23, 95,188,181, 94,135,230, 63,190, 88, 88, 88,254,101,148,218,117,175, 82, 70,139,166,233,135,165,244, 46,164, 0, + 16,154,166, 31,150,146,229,192, 16, 19, 19,179,196,198,198,102,130, 66,161, 56,219,191,127,255, 25, 3, 7, 14, 52, 2,249, 13, +228, 43,187, 71,153,217,138, 69, 29,250,124, 55, 51, 43, 79,179,169,228,178,146,145, 39,147,217,218,242,253,170,173,191, 29, 57, + 48, 48, 41, 33,110,107, 89,251, 86,150,161, 42,171,183, 98,118,142,106, 73,135, 62,223,125,158,153,163, 98,219,104,253, 77, 24, +141,198,243, 98,177,152, 50, 13,166, 92, 52,122,149,147,147, 3,165, 82,137,130, 33,105, 0, 0,121,121,121,176,182,182,134,209, +104, 36,255,178, 67,161, 1,240,101, 65,180, 10, 0,190,140,188,178,177,232,181,253,168,232,178,114,162, 89,137,230, 12, 16, 93, +218,118,229, 45,251, 11, 52,147,203, 25, 32,186, 60,146, 45,212, 75, 6, 0, 62,143,147, 82,214,224,209,124, 30, 39,165,156,118, +251, 22,190, 55, 80, 4,192, 18,246,206,102, 97,121,127,223,255,223,213, 23,119, 97, 53, 89, 77, 86,243,111,209, 20, 22, 76,230, + 46, 99,143, 39,171,201,106,178,154,255, 52,205,210, 24,255,158, 24, 45, 82,202, 4, 66, 8,254, 77, 99,192,177,176,252,151,209, + 84,114, 25, 11, 11, 11, 11, 75,213,121, 99, 48,233,162, 11,202,114,165,150,244, 38,168,140,179,189,200,106,178,154,172, 38,171, +201,106,178,154,172,230,127, 78,179, 34,237,162,219,143, 7,176,227, 61, 49, 91,111,152, 44, 66,254,250,214, 42,108, 88,149,213, +100, 53, 89, 77, 86,147,213,100, 53, 89,205,202,194, 86, 29,178,176,176,176,176,176,176,176,252,199,177, 44, 97, 41, 75, 41,120, +244,155, 15, 6, 95, 21, 28,206, 85,136, 61,182,248,223,182,139, 3, 7, 14,228, 88,178,126,100,164, 13, 29, 2,215,181, 86, 82, +126,159, 60,133,126, 45, 19,178,104, 83, 69, 23,162, 67,205,198, 35, 37, 34,201,103, 90,173,214, 75, 38,151,167,100,164,167,110, +203,136,121,180,165,200, 58, 86,119,239,222,117, 13, 12, 12, 76, 0,144, 91,228, 77,129,133,133,229,109, 98,227, 87, 29, 20,245, + 9, 64,254,236,118,201,144,167,200, 14,223, 85,108, 61,107,223, 49,160, 41,255, 34,115, 84, 32,248, 17, 89, 97,177, 21,252,224, +216, 68, 68, 68,120,214,174, 93, 59, 26, 64, 86,201,111, 47,101, 25,123,159,179,188,207,180, 71,241,132,165,133,247, 66,213,141, + 86,157,254, 94, 48,208,163, 64, 48, 28, 20, 66, 17,121,100, 64,165,116,106,125, 84, 13, 12,183, 57,128,198, 0,105, 44, 21,139, + 26,169,180,186, 20,134,144,145,120,117,232,129,197,122, 94, 3, 39,161,236,225, 44,150, 32,242,200, 15, 22,233, 49,228,235,251, +215,142, 10,109, 36, 20,106, 55,233, 63, 27,197, 51, 56, 87, 22, 1,128,182, 52, 77,251, 75, 36, 18, 87,165, 82,153,202, 48, 76, + 44,242,235,167, 51, 43,169, 73, 3, 24, 43,147, 74,123,120,202, 5,141, 99,210,178,227,115,245,198,235,200, 79,232,154,249,182, +174,168,124,147,229,178,227,243,161,129,163, 87, 77,235, 2,155, 14,223,205, 86, 2,229, 25, 45,202,221,187,213,177, 33, 31, 15, +234, 48,121,252,104, 89, 53, 71, 25, 18,211, 20,246, 63,236,220,187,102,239,222,125,189, 63, 29,210,181, 7, 0,124,243,205, 55, + 31, 86,175, 94,189, 6,135,195,137, 92,176, 96,193, 47,139, 22, 45, 34, 84,217, 35,149,187, 22, 92,195,166, 7,190, 20, 64, 0, +128,154, 0, 94, 3,120,130,226, 89,198, 43,195,123,161, 89,173, 90, 53, 55,134, 97, 62,117,118,118,238,149,156,156,124,138,166, +233,159,226,227,227, 19,222,229, 83,135, 16,178,157,162,168,241,132,144, 29, 22,124, 78,176,228, 59, 68, 34, 81,178, 90,173,118, + 42,248, 59, 69,173, 86, 59,255, 85,251,243,119,126,215,223,244,254, 61,238,252,141, 39, 61,138,206,234,214,198,191,148, 39, 10, +229,127,254,198,211,118,197,215, 11, 48,150,241, 12,164, 8, 33, 88,178,100, 9,181,116,233,210, 49,181,106,213,170, 67,211,244, +243,133, 11, 23, 22, 75,125, 83,114, 89,145,251,156, 53, 91, 44,239, 43,150, 13, 42, 93, 33,126, 3,165, 80,147,129, 0, 53,186, +125,179, 70,109, 38,140,236, 67, 17,142, 8, 67,199,205, 49, 88,172,229, 57, 90, 8,142,106, 89,125,127,239, 25,131,250,116,161, +155, 6,212,128,171,163, 53, 64,243,176,253,116,148,253,166, 85, 11,182, 2, 8,172, 68, 41, 23,189,186,189,223, 41, 49,203, 8, +138, 2, 40, 10,160, 41, 32, 79,205,160,219,135,163, 22, 1,248,193,194,167, 18,109, 35,161, 48, 99,191, 26, 0, 56,111,225,164, +212,112,116,116, 28, 51,125,250,116,105, 64, 64,128,141, 72, 36, 18,168,213,106,231,136,136, 8,199, 5, 11, 22, 4,168, 84,170, + 19, 0,238, 91,168,233, 81,219,221,237,208,166, 25, 99,155, 55,168,233, 9,158, 54, 15,140, 70, 81,253, 69,196,203,150, 19,183, + 30, 30,247, 52, 67,253, 49, 42, 49,100, 66, 90, 90, 26, 5, 0, 14, 14, 14,164,184,201,106, 49,122,253,204,110,152,177,238, 60, +148,106,237,175,229,105,216,213,104, 56,226,163,143,250,117, 88,254,245, 84, 89,124,186, 14,161,145, 42,216,201,248, 88,244,229, + 36,129, 70,163,111,185,245,151,189,227, 55,175,156,243,163,209,104,236, 4,160,169,209,104, 12, 2,240,203,146, 37, 75,202,122, +248, 46, 5,240, 85,193, 5,189,143,195,225, 92,232,216,177,163,215,167,159,126, 74, 53,105,210, 4,193,193,193, 53,247,239,223, +223,229,212,169, 83,145, 70,163,241, 17,128,231, 40, 24,246,196, 12,120, 0,188, 57, 28, 78,253,127,178,166,171,171,171, 88,171, +213,142,114,119,119, 31,223,170, 85,171,250,125,250,244,161,188,189,189,241,236,217,179, 38,103,206,156, 89,116,253,250,245, 71, +113,113,113, 59, 4, 2,193,158,196,196, 68,213,223,254, 59, 78, 81,227, 1,184, 21,248,228, 37,102,124, 38, 32, 63,151, 84,162, +185,223,161, 86,171,157, 76,141, 77, 41,138,114,250, 43,247,199,194,239, 10,163, 40,202,174, 96, 93,148,247, 73,211, 52, 12, 6, +131,194,104, 52,214,170, 64,211,187,224, 69,202,108,175, 11,160,188, 68,208, 98, 0,232,214,218, 63, 3, 20,158, 22, 70,180,222, +124,201,124, 90,104,192, 8,252,207,223,124,106, 87, 44, 10, 86,242, 45,118,201, 18,106,209,162, 69, 88,188,120,113, 31, 0,109, + 25,134,185,238,235,235,187,177,152, 36,195, 20, 46, 91,180,104,209,247,229,220,231, 44, 44,239, 11, 29, 96,201,160,210,101,190, +255,212, 26,208, 14, 70,140,246,180,119, 26, 56,237,211,193,226, 0,223,218, 80, 67,134,168, 52, 35, 78,159, 60, 3, 0, 7, 45, +139, 58, 13,110,202,229,170,247,172, 90,252,165, 79,219,230, 1,120, 28,175, 71, 80,188, 17,202, 72, 61, 56,180, 30, 70,134, 0, + 4,234,202,238,117, 92,166, 1, 55,158,107, 65, 83, 0,135, 6,104,154, 2,135,174,164, 24,163,125,241,205,174,144,128,180,100, + 6, 96,180, 47,170,120, 66,252,235,214,173, 59, 98,233,210,165, 54, 73, 73, 73,210,224,224, 96, 8,133, 66,216,218,218,114, 92, + 93, 93,221,214,173, 91,167,154, 54,109, 90, 47,157, 78, 23, 5, 32,205, 76, 77,223,158, 77,235,223,218,177,234, 27,107,253,221, + 51,200, 58,240, 63,112,104, 2,190, 84, 6, 47,177, 24,103, 62,170,109, 55,240,100,228,209,123,201, 10, 95, 0,241, 21,137,133, +135,135,115, 52, 26,205,199, 86, 86, 86, 45,120, 60,158,179,200,182, 6,147,192,109,154,158, 74,213,124,157,226,164,108, 55,179, +139,115,143,181,159,119,196,140,117,231,177, 97,255,157,221,141,145,180,176,188,188,217, 18,137,108,194,180,207, 62,149,197,165, +233,176,236,104, 26,118, 93,203,193,168,182,114,204,248,192, 26,195,134, 14,145, 30,254,223,145, 9, 0,126, 44,178,201, 51, 95, + 95, 95, 42, 60, 60,188,180,135,175, 45,128, 57, 90,173,150,230,243,249,148, 72, 36, 26,177,124,249,114,221,208,161, 67,227, 76, + 43,180,109,219, 22,109,219,182,165,114,115,115,107, 94,190,124,185,230,222,189,123, 13,183,111,223, 14, 3,112,172,236,136,133, + 56, 70,173, 86, 85, 23,137,197,202, 31,182,110, 93,219,174, 93, 59, 70, 40,252, 51,253, 84,101, 52, 1,192,218,218,250, 71, 39, + 39, 39,106,222,188,121, 9,111, 75,179, 70,141, 26,231,155, 55,111,222,177, 91,183,110,220,214,173, 91,195,205,205,173,112,153, +131,131, 3,218,182,109, 75,197,198,198, 54,184,126,253,250,214,243,231,207,111,124,240,224,193,229,168,168,168,110,127,115, 68, +107, 71,129,153, 72,180,112,253,247, 30,138,162,100,219,183,111,119, 50,141,201,168,215,235, 97, 52, 26, 11, 63, 77, 19,195, 48, + 48, 26,141, 88,190,124,185, 81,161, 80,152,115,140, 20, 69,222,154, 77, 19, 83,218,167, 64, 32,112, 48, 37,236,173,224,201,254, +212, 85,152,229, 39,149, 74, 61, 1,244,132, 99,157, 57,197, 87,200,127,127, 86, 40, 20,209,137, 26,155,167, 0,218,149,163,102, +179,116,233,210, 81,139, 23, 47,238, 87, 36, 74, 91,127,208,160, 65, 37,135,189,170, 95,240,169,160, 40,234, 10, 77,211, 39, 0, +236,194, 91,140,186,179,252,187, 32,132, 52, 3,224, 88,100,150, 22,249,181, 66, 40,248,157,164, 0,216,151,152, 95,116, 61,211, +103,106,193,124,199,130,237, 72, 17,221, 84,138,162,238, 87,178,136, 87, 81, 70, 59, 45, 46, 0,156, 60,121,146,244,238,221,155, + 50,125,150,110,138, 6,158, 30, 59,180,111,143, 94,157, 91,129, 22,217,226, 69, 10,112, 59,134,128, 75,235, 65,131,224,238,205, +203, 4, 92,102, 79,137,173,202,142,158,212, 24,240, 69,253, 0,223,239,126, 90, 53,157, 19,150,194,197,174,235, 74,232,212,121, + 72, 77,138, 65, 74, 66, 52, 18,227, 94, 35, 62,230,245, 35,128, 90,100,182,230, 27, 39, 6, 48, 50, 5,239,128, 12, 74,139,232, +153,175,169, 83,132,215,244, 14, 8,200, 20, 24, 1,157, 34,220,140,175, 47, 75,179, 94,157, 58,117,134,126,253,245,215,118, 79, +158, 60, 17, 43,149, 74,205,153, 51,103,158, 69, 69, 69, 89,185,186,186,102, 76,154, 52,169,142,155,155,155, 85,255,254,253, 5, + 7, 14, 28,248, 16,197,187,181,150,165, 25,208,183, 69,163,219, 59, 55,174,151,166, 31,222, 4,109,196, 67,156, 78, 84,224,102, +178,146,212,180, 22, 82, 83, 26, 56, 66, 38,228,226,155,214,110,178,158,191, 69,124,167,103,152, 97,229,105,222,186,117,203, 85, + 34,145,172, 27, 62,124,184,235,212,169, 83,133, 70,174, 13,247,200,237,116,235, 57, 91,111,187, 41, 53, 58,206,208,142, 53, 48, +115,120,125,204,220,112,201,100,178,198,123,121,101, 49, 33, 33,101,107,234,117, 58, 47,119, 39, 43,132, 70,169,176,235, 90, 14, +254,248,218, 13,157,151, 39,160,127, 99, 46,124, 61,100, 48,232,244,222,131, 6, 13,218, 83,240,214,126, 31,192,135,131, 6, 13, +242,225,112, 56,151, 0,252, 94,209, 57, 18,137, 74, 31, 61,197,214,214, 22,237,219,183,135,175,175, 47,183, 93,187,118,245, 75, + 24,152, 98,154, 58,157,214,149, 97, 8,228,114,185,216,222,222,222, 86, 46,151,167,151,246, 67,101,137, 38, 0,216,217,217, 13, +104,223,190, 61,119,255,254,253,105,145,145,145,119,135, 14, 29,250,218,202,202,170, 88,244, 87, 42,149,162, 78,157, 58, 88,176, + 96, 1,183, 71,143, 30, 21,106, 58, 59, 59,119,221,187,119, 47, 40,138, 42,252,209,126, 35, 88,236,233, 9, 23, 23, 23,244,236, +217,147, 59, 96,192,128,174, 81, 81, 81,149,186,143, 44,224, 98, 41, 17,173, 37, 37,206, 83,153,213,111,165,173,111,198,121, 79, + 49, 69,151, 10,244, 80,133,123,179,220,234, 78,145, 72, 84, 24,133, 42,229,187,222,208,164,105, 26,243,231,207, 7, 69, 81,224, +241,120,224,243,249,165,126,118,232,208,193,210,114,198, 82, 20, 69,243,249,252, 57, 92, 46,247, 83,141, 70,227, 46, 18,137, 18, +140, 70,227,110,141, 70,179, 28,128,158, 16, 98, 83,134,201, 42, 85, 83, 42,149,122,190,120,241,162,110, 89, 5,209,104, 52,168, + 95,191, 62,160, 65, 88,121,154, 17, 17, 17,158,181,106,213,242, 6, 96, 26,162,237, 26, 33,164, 93,145,255,139,114,141, 16,242, + 65,193,223,207, 95,189,122,229, 89,187,118,237,204,191,235,250,100, 53,255,121,154, 21,120, 17, 71,138,162, 78, 22,185, 87,123, +155,254,159, 59,119,238, 87, 43, 86,172,120, 66, 81,212,201,162,243,139,174, 87,244,179,224,121,115,146, 16,210,123,222,188,121, + 1, 43, 87,174,252,214,180,238, 95, 97, 18, 45,137,104, 89,165,170,165,184, 30, 99, 5, 46,199, 8, 46, 77,129,203, 1, 64, 40, + 68, 71, 69, 32, 55, 39,235, 6, 34,143, 70,154, 23,201, 26,216,186, 97,195,122,171,246,109,152, 77,255,124, 93,137, 44,133, 26, +225, 15,174,224,254,149,223,147,140, 6,227,239,160, 72, 16, 64, 7,227, 53,243, 12, 56, 82,185, 49, 46, 40,194,205, 55, 90, 5, +230,170,152,217,122,103, 52,240,241,241, 25,178, 96,193, 2,135,144,144, 16, 81,118,118,118,238,190,125,251, 18, 52, 26, 77, 20, +128,115,209,209,209, 62,223,127,255,189, 96,213,170, 85,245,234,213,171,231,122,232,208, 33,109, 41,195, 25,189,161,249,229,232, + 97,183, 63,157,246,185, 40,236,208, 22, 8,194,130, 49,255, 97,154,241,143, 68,229,215, 0, 54, 32, 54,175,117,170,218,112, 97, +125,251,234,116, 13, 57, 31,181,109, 4, 29,194, 51,212,229, 70,178, 36, 18,201,186,189,123,247,122, 54,107,214,140, 6,128,235, +207, 13,194, 57, 91,111,187,157, 91,209,154,106,237,111,143,148, 44, 13,166,111, 9,197,153,219, 41,103, 77, 38,171,162, 66,202, +229,242,212,184,148, 28,103,123,153, 8, 35,219,200,208,121,121, 2, 6, 54, 21, 66,200,167,240, 44, 50, 9,181,107,213,160, 66, +111, 28,107, 90, 96,178,154, 37, 38, 38, 2, 64, 83, 0,145,177,177,177,174,129,129,129,217, 69,228, 50, 1,124, 39, 16, 8,230, + 83, 20, 69,154, 53,107, 22, 90,175, 94,189, 60, 91, 91, 91,168, 84, 42,104, 52, 26,240,249,124,168, 84, 42, 68, 71, 71,227,238, +221,187,176,181,181,181,232, 68,229,229,229, 65, 46,151,131, 97,152, 42,107, 26,141, 70,106,219,182,109,210, 39, 79,158, 72,143, + 28, 57,226, 60, 99,198,140,116, 63, 63,191,160, 33, 67,134,188,116,114,114,210, 60,124,248, 16,183,110,221, 66,102,102, 38, 90, +180,104, 97,150,166, 86,171, 5,151,203,133, 74,165,130, 80, 40, 4,151,203,133,193, 96, 0,195, 48,133,230, 43, 47, 47, 15, 25, + 25, 25,224,243,249,208,106,181,239,226, 13,244,141, 8, 85,121,213,111,149,137,104, 21, 53,106,102,154,172,138, 34, 81,101, 86, +119,102,101,101,137,109,108,108,230, 0, 72,172,232,187, 40,138, 2,135,195, 1,159,207, 7, 69, 81,104,215,174, 29,198,142, 29, +139,198,141, 27, 35, 34, 34, 2, 7, 14, 28,192,253,251,247,193,227,241, 10,215, 55,187,126,162, 67, 7,142, 72, 36,186,213,183, +111,223,128,175,191,254, 90, 84,163, 70, 13,132,133,133,121,172, 92,185,114,206,197,139, 23,251, 41, 20,138,166,166,167, 93,249, + 81,250,130, 42,193,252,234,194,158, 26,141, 6, 97, 97, 97,150,108,243, 6,181,107,215,142,166,105,250, 37,195, 48,215, 1,212, + 39,132,180,163, 40,234, 12,242,219, 37, 22, 69, 65, 8,249,128,162,168, 28, 0,143,104,154,126,206, 48, 76, 52, 27,183, 97, 49, +227,185,210,187,228,255, 20, 69,157, 92,177, 98, 69,239,210,204, 85, 41,247,102,177,249, 43, 87,174,252,182,200,255, 85,137,168, +182, 71,241,198,240, 29, 10,162, 92,127, 26,173,147, 39, 79,150,239, 64, 24,244, 63,121,116,255,157,206, 58,120, 6, 52,105, 91, + 36, 58, 68, 16,124,247, 22, 0,178,219,172,162,184,246, 22,211, 28,238,238,109,223, 78,165,183, 95, 81, 34, 54, 33, 5,183, 78, +239, 70,106, 98,212, 46,128,204, 64,228,145,156, 42,159,137, 26,253,235, 57,217, 59,216,168,117, 4, 12, 1,240,134,217,122, 39, + 52,246,246,246, 30,112,251,246,109, 7,181, 90, 45,186,113,227,134,114,239,222,189, 73, 58,157,238, 10,128,155, 5,235,132,164, +166,166, 14, 42, 48, 38, 28, 46,151, 43,208,233,116,229,181, 93,104,252,229,167,163,110,124,183,109,167,232,229,227, 80,124,127, +228, 52,178,148, 74,227,149, 20,213,135, 0, 76,142,254, 82, 72,154, 42,158,128, 84,231,209, 20, 92,165, 60,151,240, 12,181, 8, + 40,189, 74, 86,163,209, 12, 29, 62,124,184,171,201,100, 1, 64, 90,174,158,171,212,232, 57,173,253,237,209,164,227, 32, 4, 95, + 62,140, 67,215,226, 81,203, 81,114,205, 75,154,101,214, 17, 77, 77, 73,220,182,126,211,246,245,223, 45,249, 82, 48,179,167, 53, + 6, 54,229, 65,196,167, 96, 37,225, 97,249,198, 31,245, 33,119,175, 61,116,117,117, 61, 9,224,195,196,196, 68,184,186,186,230, + 1,120,206,225,112, 34,141, 70, 99,105,141,186, 23, 2,112,222,179,103, 15,173,215,235,243, 34, 34, 34,224,226,226, 2,103,103, +103, 88, 91, 91, 35, 60, 60, 28,127,252,241, 7,158, 61,123, 6,134, 97,208,176, 97, 67,139, 78, 86,122,122, 58, 30, 62,124,136, +158, 61,123,205, 72, 77, 77,177,178,181,179, 87,220,184,126,109, 77,101, 52, 25,134,161, 0, 32, 32, 32, 0, 1, 1, 1,162,248, +248,120,247,147, 39, 79, 58, 45, 91,182, 44,198,211,211,115,159, 74,165, 42, 22, 57, 48,215,104,153,204,133,201, 4,138, 68, 34, +240,249,124,228,228,228, 32, 57, 57, 25,185,185,249,157, 54,109,108,108,222,137,209, 42, 35, 66,245,214,214,255,139,205,225, 27, +213,157, 54, 54, 54,195, 1,204, 49,115, 95, 96, 48, 24,192,231,243, 17, 24, 24,136, 77,155, 54,225,254,253,251,248,253,247,223, +225,225,225,129,209,163, 71,131,166,105, 60,121,242,196,210, 34, 50,183,111,223,158,243,225,135, 31, 6,236,217,179, 71, 20, 29, + 29,141,103,207,158,193,198,198, 6,155, 54,109, 18,142, 31, 63,190,246,229,203,151, 23, 34,191,243, 75,249, 20,233, 93,168, 16, +187, 14,174, 95,191,254, 27,171,184,184,184, 88,159, 59,119,206,169,208,128,149,236,145,248, 38, 89, 11, 23, 46, 92,239,235,235, +187,161,160,186,176, 45, 0, 41, 33,164,195,145, 35, 71, 40, 0, 24, 56,112, 32,161, 40,202,244,131,244,232,240,225,195, 29,195, +195,195,201,226,197,139,217, 54, 90, 44,101,121,145,241,166,123,178, 44, 3,101,137, 81, 43, 26,241, 50, 49,111,222,188,128, 21, + 43, 86,220,171,162,201, 42,250,198, 68, 76,102,171,240,199,180,204, 42,195,194,216, 23,237,234,226,100,111, 55,119,116,107, 48, + 12, 96, 48, 2, 6, 35,129, 66,169, 66,216,227,251, 74,136,168, 35,102, 21, 71, 40, 88,181,236,235,207,107,134,198,209, 72,200, +212,225,234,177,237, 36, 53, 49,106, 0, 34, 15,127,242,118, 76,214,224,250, 46,206, 78, 87,247,111,255,134,190,255, 90, 11, 35, +147,239,179, 24,134, 20,254,253, 14,112,113,116,116, 28,118,231,206, 29, 71,161, 80, 40,122,241,226, 5,115,248,240,225, 76,157, + 78,119,177,136,201, 2,128,214, 77,155, 54, 53,200,100, 50, 40, 20, 10,157, 78,167, 83,151, 99,178,220, 59, 52,110,112,237,187, +109, 59, 69,106,173, 22,217, 42, 13, 56,246, 78, 37, 77, 22, 0,180,234, 88,183, 90, 53, 74, 36, 7, 1, 16,149,163, 75, 40,203, +100, 1,128, 80, 40,236, 50,117,234,212, 98,227,226, 57,200,121, 6,137,144,103,188,249, 52,141, 9,190,124, 24,215,159,164, 49, + 34, 62,199,232, 72, 94,215, 52,247, 0,100,197, 61,221,246,251,241,147, 23,190, 88,176, 42, 79,169,200, 69, 45, 55, 49,242,114, +179,177,124,197,119,250,219,183,175, 95,153, 51, 99, 98,203,195,135, 15,175, 68,126, 99,112, 0,120,126,248,240,225, 81, 11, 22, + 44,248, 5,127,166,121, 40, 73,194,176, 97,195,226,252,253,253,179,125,125,125,179,211,211,211,241,244,233, 83,100,102,102,226, +251,239,191, 71, 88, 88, 24, 76, 17, 65,179,218,170,188,105,144,144,153,153, 33, 35,132, 32, 51, 35, 93,250,245,215, 95, 91, 87, + 70,211,104, 52, 22,187,183,170, 85,171,134, 73,147, 38,241,149, 74,165, 77, 76, 76,140, 85,209,101,230,106,106,181,218,194,140, +195,132, 16,104,181, 90,100,103,103, 67,171,213,226,229,203,151,133, 38,171,224,251,223, 89, 68,203,244,183, 72, 36, 74, 54, 93, +203,166, 42, 56,145, 72,148, 82,214,250, 85,161,200,119,145,130,191, 45, 53,135, 21,238,143,153,231, 29,124, 62, 31, 99,199,142, +197,189,123,247, 16, 17, 17, 1, 14,135, 3,133, 66, 1,165, 82,137,174, 93,187, 66, 32, 16, 88, 26,209, 34,124, 62,127,248, 87, + 95,125, 37,138,140,140, 68, 90, 90,154,169, 49, 61,140, 70, 35,102,204,152, 33, 22, 10,133,195, 45, 13,221, 39, 38, 38,118,127, +249,242,165,119,201, 41, 41, 41, 41,187,104,155,194,202,114,228,200, 17,106,224,192,129,100,224,192,129,196,100,184, 88, 88, 74, +163, 12, 47,178,163,172,136,214,219,136,138,153, 34, 91, 40,232, 32, 82, 9, 76, 38,171,125, 17,227, 69,153, 34, 92,230, 85, 29, +214, 26,220,200,217,222,238,242,158, 45, 75,101, 39, 31, 83,136,139,141, 66,106, 98, 52,154,182,236,128,176,199,161, 96,244,198, +163,120,121,164,226,150,156, 53, 6,214,245,245,245,251,172,125,203,122, 88,117, 50, 15, 47,130,207, 33, 43, 53,113, 51,162, 14, + 31,125, 43,103,200,115, 96, 3,103, 39,187,203,191,108, 89,106,115,230, 41,141,216,216, 40, 28,251,101, 61,209,235, 52, 89, 40, +222,147,203,226,183,102, 49,163, 21,228,101, 37, 67,155,107,132,136, 86,138, 44,172,164, 72, 2,112,125,253,250,245,157, 91,180, +104, 33, 24, 54,108, 88, 82,102,102,230, 49, 0,119,138,172,227, 95,183,110,221,158,155, 54,109,114,142,141,141,197,197,139, 23, +147,144,223,245,191, 44,226,174,133, 62,222,250,199, 47, 63,126, 41,174,233,131,239,191,250,194,112,228,254,211,190, 0,206, 20, + 89,199,183, 75,253,186, 39,151,205,154, 76, 51, 33,103,241, 48, 58, 25,175,179, 53,127,148, 37,152,150,150, 70, 41,149, 74, 79, + 27, 27,155,162, 23, 36, 92,165, 10,205,236,193,117, 19,186,206,185,225,166,214, 25, 33,228,209,100,122, 63,207,132,123,199,142, +216,167,169,211, 40, 83,111,196,138, 24, 55,164, 75,191, 45,123,127, 27,121,242,228,169,207,116, 26,117, 61, 31, 31,111, 18,116, +251,242,195, 57, 51, 38,246,168,228, 25,151,221,187,119,143,230,112, 56,197, 12,122,209, 8,145,165,145, 34, 75, 48, 87,179,164, +209, 50, 97, 48, 24,168,202,106,106, 52,154, 82,135,118, 40,173,173, 22,195, 48,127,201,254, 91, 18,161, 42, 90,101,104,106, 79, +167, 86,171,157, 10,218,108, 57,191,205,136, 86, 85,122, 34,150, 87,125,105, 73,249,104,154, 6,195, 48,224,243,249,104,216,176, + 33, 78,158, 60, 9, 59, 59, 59, 88, 89, 89,193,202,202, 10, 98,177, 24,246,246,246,133, 70,139,166,205,238,165, 67, 52, 26,141, +135,135,135, 7, 94,190,124, 9,145, 72, 84, 56, 9,133, 66, 4, 4, 4, 64,161, 80, 84,195,187,140,221,179,176,252,181,207,149, +147, 69,205, 18, 69, 81, 39,231,206,157,251, 85,101,245,230,206,157,251, 85,105, 17,174, 42, 26,174, 98,209, 45,110, 81, 7, 89, +170,147, 44, 48, 89,187, 54, 47,177,250,237, 1, 16, 23, 23,137, 11,135, 54,230,234,117,218, 76,134,209,123,190,126, 22, 10,208, +216,109, 86, 17,104,210,188, 95,207,142,212,133, 39, 90,228,100,165,226,121,208,185, 40,168, 4,243,222,154,201,114,118,184,188, +103,203, 18,155, 19,143, 41,196,198, 70,225,204,254,239,115,244, 58, 93, 23, 68, 30, 9,170,138,244,112, 62,191, 31,191,122, 76, +239, 79,219, 38,192, 72, 25, 49, 60, 44,252,131,148, 36,244, 75,188, 81,126,207,176,162,164,166,166, 30, 91,191,126, 61,181,122, +245,234,246,106,181,250,127, 0,138,134, 40,235,213,170, 85,235,227, 29, 59,118,216,197,198,198,242,110,220,184,161,184,124,249, + 50, 1,112,162,130,136,203,236,174,159, 76,226, 52,174, 81,109,106, 72, 84,124, 95, 0,103,139, 44, 14,232,221,196,255,230,206, + 21, 11,229,250,155, 71,144,151, 24,139,121, 55,227,114, 0,152,125,188,245,122, 61,178,179,179,161,207, 75, 55, 52,117, 85,100, + 47, 30,228,164, 73,206, 84,115,121,140,210,224,107,149,162,185,156,254,154, 35,145, 72, 44, 58,150, 91, 86,124,185, 23,192,222, + 65,131, 6,237,121,116,251, 84, 83, 87, 87,215, 83,190,190,190, 20, 0,148,209,195,176, 44,150, 2,152,209,170, 85, 43, 42, 48, + 48,240,238,134, 13, 27,206,151,103, 86, 42, 19,209,170, 8,115, 53, 25,134,161,203, 56,190, 84,101, 53,139, 70,180, 42, 50, 90, +239, 50,162, 85,154,105, 41,106, 18,139, 26,161,127, 66,175,195,242,204,148, 37,229, 51,181,147,227,243,249, 8, 13, 13, 69,245, +234,213,161,211,233, 32,151,203, 33,151,203, 33,147,201,144,155,155, 11, 30,143, 7, 11,247,153, 17,137, 68, 49, 79,159, 62,245, +118,116,116,132,209,104, 44,102,182, 94,188,120, 1,169, 84, 26,111,105, 68,203,213,213,245, 92, 65,175,195, 98,184,184,184, 88, +191,141,227, 90, 52,146, 53,112,224, 64,182,138,144,165,220,104, 86, 25, 81,173,212, 18,145, 40,109,145,255, 83,145,159,195,173, +119,193,223, 40,229,111,109, 41,243,210, 87,172, 88,113,185, 72,251,174,212, 42,238,130, 41,197, 67,177, 30, 46,220,138, 34, 89, + 78,118,182,151,127,250,126,177,213,161, 96, 32, 62, 54, 18, 87,143,110,202, 54, 24,117,157,192,144,196,219, 23,143, 30, 1, 5, + 37, 94, 31,185,106,222, 35, 2,141, 27,251,121,226,247, 39,122,164,198,189, 0, 33,204, 46,164,236, 85, 86,249,236,212,234,223, +208,201,206,225,242,174, 77,139,173,127, 11,165, 16, 23, 27,137, 11,135, 54,229, 24,244,202,206,136, 60, 26, 92, 89,217,177,128, + 45, 71, 42,218, 58,160, 67,227,193,158,181,220,193, 16, 61, 24, 62, 65,255,217, 14,220,231, 33,202,223,175,139,178, 15, 49,121, +204,103,241,119,204,107, 64,151,151,151,247, 59,128, 32, 20, 79,175,208,160, 78,157, 58,131,183,110,221,234, 24, 23, 23, 39, 10, + 9, 9, 81,109,223,190, 61,133, 97,152,223, 0,152, 83,149,250, 69, 72, 84,252, 79, 40,158, 47,167,193,151,159, 12,187, 61,108, +204,167,162,200,139,123, 97, 27, 25,134, 89, 55, 19,140,207, 51,181, 67, 11,162,107,165,226,224,224, 64,210,210,210,162,179,178, +178,188,165, 82, 41,210,211,211,145,145,145,129,236,236,108,104,114, 50, 12,246,198, 44, 5,101,200, 0,143,199, 67, 74,172, 30, + 70,163, 49,201,220,104, 22, 0,219,165, 75,151,142, 99, 24,198,148, 17,177, 88,239,194, 34,235,153,174, 7,239, 65,131, 6,237, + 41,210,235, 48,187,168, 22,242,211, 59, 80, 5,233, 29, 90,156, 61,123, 54,188, 71,143, 30,113,165,153, 21,161, 80,104,113, 67, +233,178,122, 49, 86, 70,179,172,136, 86,201,249,150,104,154,170, 47, 77,141,224, 75,206, 55,193,225,112,192, 48, 12,204,232, 84, +241,151,154,150,162,189, 3, 43, 99,114, 74,156,155,114, 19,135, 86,178, 39,226, 91,141,104,153,206, 5,159,207,199,241,227,199, + 49,102,204, 24, 24,141, 70, 72, 36, 18,200,100, 50, 72,165, 82, 28, 61,122, 20,166,244, 15,150,248, 87,189, 94,255,235,138, 21, + 43,190,218,182,109,155,152, 16, 2,129, 64, 80,104,180, 22, 47, 94,172,210,233,116,191,154,101,180, 76, 25,223, 25,242, 84, 42, + 53,148,219,235,176,180,109,202,104,175,101,179,116,233,210, 81, 12,195,244, 67,137, 20, 14, 37,214, 43,150,250,129, 77,239,192, + 98,198,243,228,254, 63,184,120, 38,131, 69, 21,137,100, 21, 26, 46,186, 60,243,226,104,107,115,249,199,239, 23, 91,237,187, 79, + 33,242,245,107, 92,249,223,198,124,147,245,234,208, 3, 68, 31, 73, 70,228,145, 54,120,125,164,187,217,111, 79, 20,213,216,205, +201, 6, 25, 10, 6, 57,105, 49, 0, 65,200,219, 48, 89,142,182,142,151,127,222,180,216,250,240, 3, 26,145,145,145,184,112,104, + 99,182,193,160,238, 84, 21,147, 53,156,207,239, 87,167,174,123,196,252,113,253, 6, 7,214,118,129,125, 76, 56, 78,140, 30,140, +111, 14,124, 4,185, 35, 7,205,123,202, 49,118,185,203, 96,215, 0,225, 75,215, 54,232,103,129,116, 81,147,213,216,203,203,107, +240,157, 59,119, 28,234,215,175, 47,122,246,236,153,122,251,246,237, 41, 42,149,234, 60,128, 80, 11, 52,139,154,172,198,115,199, +143,190,253,221,143,123, 68, 52, 95,128, 85,191,158,192,180,107,113,198, 83,209, 57,131, 80,188, 90,177, 84, 52, 26,205,197, 77, +155, 54,105,104,154, 70, 70, 70, 6,210,210,210,144,146,146, 82,248,153,149,149, 5, 14,135,131, 75,151, 46,105,115,114,114,238, +152, 91,192, 91,183,110,121,197,199,199,251, 38, 38, 38, 54, 45,152,158, 33,191,119,161,172,200,188,166,137,137,137,237, 1,220, + 55,205,143,139,139,171,113,247,238, 93,215,138,244,229,114, 57,248,124,126,177,136,150, 80, 40,132,179,179, 51, 12, 6, 3, 14, + 30, 60, 8, 0, 25,229,105,240,249,130, 68,154,166,192, 16, 70, 35, 18,137, 24, 87, 87,215, 82, 13,150, 37,154, 5,196,125,240, +193, 7,234,224,224,224, 82, 35, 90,149,209, 36,132, 40,187,117,235,134,132,132, 4,136, 68,162,194, 31,107,147,161,162,105, 26, + 66,161, 16, 73, 73, 73,152, 48, 97, 2, 8, 33,202,191,251,201, 83,180, 77, 83,129, 25,162, 0, 80, 5, 70,232,141,118, 90,230, +182,129, 50, 85, 13, 18, 66, 96, 50, 92, 37,150, 23,126,151, 57,217,219, 75,180,233, 26,159,149,149,245, 93,126,113,200,246, 18, +159, 59, 44,248, 81, 40, 52, 90, 97, 97, 97,216,179,103, 15,178,178,178, 32, 16, 8,144,153,153,137,157, 59,119,226,233,211,167, + 16, 8, 4, 48, 29, 11,115,253, 91, 96, 96,224,119,215,175, 95,127, 58,116,232, 80, 85,104,104, 40, 84, 42, 21, 66, 67, 67,209, +189,123,119,245,205,155, 55, 35, 84, 42,213, 82,152, 83,117,104,202,248, 94, 48,188,142, 70,163, 65, 72, 72, 72,169, 83, 89,219, +148, 36, 34, 34,194,211,104, 52,122, 19, 66,218, 18, 66,172, 80,144,194,161,224,255,162,211, 7, 5,203,172, 8, 33,109,141, 70, + 99,157,136,136, 8, 79,214, 78,176,188,167, 92, 45, 98,182, 72, 17,147,117,181,252,136, 22, 67,111,250,105,227, 18,171, 95,239, +209,136,141,142, 64,208,233,173,217, 70, 70,223,201,194,225,112,186,160, 72,174, 13,145, 88, 90,143,161,242,187, 51,231,164,197, + 2,132, 83, 25,163, 85, 76, 19, 12,189,105,231,198,197,214,251,131, 40, 36,196,190,194,205, 99, 91,178, 13, 6, 77,103,188, 62, + 18, 82, 25,205,225,124,254, 2, 30,135,154,223,173,117, 35,126,155, 70,117, 33, 77,137, 66, 82, 92, 2, 14,134,165,102, 68,100, +106, 62,189, 73,233, 16,253, 74,243, 83,207,113,118,118,182, 46, 60,244,158,104,111,119,231, 68,206,239, 20, 79,161, 35, 58,178, + 34,241,102,225,176, 20,197,203,249, 38, 46,114,185,124,104, 80, 80,144,149, 72, 36, 18, 7, 5, 5, 49,219,183,111, 79, 87,169, + 84,167, 1,220, 54,107,223,223,196,189, 89,221, 90, 87,191,221,242,163, 40, 79,161,132, 66,171,131,208,217,213,248,219,237,199, + 3, 80,118, 2,204, 98,154, 66,161,112,255,254,253,251,123,182,107,215,206,179, 94,189,122,116, 70, 70, 6,242,242,242, 10, 27, + 87, 59, 58, 58, 34, 44, 44,140,137,140,140, 76, 16, 10,133, 7,204, 45,103,171, 86,173, 34,105,154,126, 86, 80,141,246, 12, 37, +122, 23, 22, 89,213, 59, 49, 49,177,153,171,171,235, 85, 0,146, 34,189, 14,139,106,154,210, 59,124, 5,128,166, 40,234,126,104, +104,104, 94,143, 30, 61, 32, 22,139,161, 80, 40,224,225,225, 1,131,193,128,211,167, 79, 35, 56, 56, 88,193, 48,204,213, 82,204, +107,177,114,170,213, 42, 15, 0,180, 74,169,108, 56,106,212,168,246, 51,103,206, 44,214, 37,221,201,201, 9,118,118,118, 22,105, + 2, 64, 70, 70,134,223,217,179,103, 63, 15, 13, 13,253,162,103,207,158,214, 95,125,245,149,208,203,203, 11, 70,163,145,174,172, +102,102,102,166,117, 72, 72,200,154, 54,109,218, 76,238,209,163, 7,247,219,111,191,133,181,181, 53,140, 70, 35,196, 98, 49,114, +114,114,176,116,233, 82,220,184,113,195, 64, 8,217,146,157,157, 61,203,194,107, 9, 85,189, 55,203,138, 0,149,149,146,161,140, +245,255,242,114,150,104,211,133,130, 20, 14,115,202,200, 96, 15,115,175,121,147,209,226,112, 56,136,138,138,194,246,237,219,223, +200,163,101, 74,255, 80,134,118,105,251, 78,174, 92,185, 98,164, 40,170,101, 80, 80,208,156,145, 35, 71,126,170, 80, 40,220,165, + 82,105,130, 94,175,223,173, 82,169,150, 35,191, 61, 42,223,146,103,136, 66,161,136, 46,173,215, 97,201,117, 0,155,114, 53, 75, +164,119, 40,150,194,161,196, 54,197, 82, 63,148,146,222,225, 47, 63,239,172,230, 63, 82,243,125, 55, 91,101, 39, 44,125,131,198, +227,121, 60,149,190,254,245, 8,170, 42, 38,235,205,104,137, 90, 25,177,112,127, 76, 35,173, 70, 13, 69,118,242,115, 68, 29, 76, +169,210,110, 21,148,243, 90, 4,133,168,200, 87,184,119,114, 75,126, 57, 95, 31,169,116, 57, 41, 96,222, 15,103,142,240, 41,107, + 59, 60,252,124, 12, 18,178, 20, 56,243, 58,243, 16, 81,106, 62,251, 21,200,196, 13,128, 54,104,174,239,252, 58,105,107,219,254, +214,131, 29,170,241,176,238,203,221, 16,205,181,231, 55,239,220,206,146, 49, 16,147, 68, 34,209,245,239,191,255,190, 75,219,182, +109,133,131, 6, 13, 42,173,129,188,165,196,221,127,241,234,135, 83,219,214,126,105, 95,191, 5, 54, 47,152,109,220,127,251,113, +201, 94,136,229,226,235,235,107,188,117,235,214,204, 9, 19, 38,172,235,210,165,139, 91,223,190,125, 5, 30, 30, 30, 16, 10,133, +120,245,234, 21,174, 95,191,174,125,253,250,117,130, 82,169,156,217,160, 65, 3, 75,114,156,101, 46, 92,184,240,187,130,239,160, + 10,170, 11,155,162,160,119,161,105,165,130,164,165, 77, 1, 72, 22, 47, 94, 60, 18, 0,202,232,246,189, 16,192, 54, 0, 92, 66, + 72,210,222,189,123, 91, 30, 59,118,172,229,140, 25, 51,248, 61,123,246,196,157, 59,119,112,225,194, 5,157, 78,167,187, 93, 96, + 92,205, 29, 42,135, 1, 16, 98, 48, 24, 30,175, 90,181,170, 37,135,195, 89,104, 90,240,244,233, 83,236,218,181,171, 50,154, 6, + 0,107,146,147,147,127,216,187,119,239,194,139, 23, 47,126, 50,106,212, 40, 43,189, 94,143,176,176, 48,252,252,243,207,149,210, +204,206,206,254,220,193,193, 97,254,233,211,167,119,159, 63,127,254,195, 17, 35, 70,208,211,166, 77,195,166, 77,155,240,191,255, +253,143, 49, 26,141,199,120, 60,222,168,180,180, 52,197,187,120,234, 20, 84,195, 37, 88, 56,214, 97,133,186, 85,169, 26, 52,147, +196,170, 10,152,246,163, 67,135, 14,133, 81, 70, 83, 20,174,232, 58, 20, 69, 89, 92,117, 8,192,134, 16,194, 0,216,130,252,241, + 69,139,102,133,231,224,207,204,241,230, 42,250, 39,106,108,158, 66,131,176,242, 7,149,182, 1, 8,252, 43, 80,203, 90,184,112, +225,250, 69,139, 22,173, 47,153,194,161,232, 74, 37, 83, 63, 44, 89,178, 4,108,122, 7,150,127, 43,165, 27,173,144, 29,122,125, +205, 1, 95,125,255,237,236, 69, 6,189, 54,155, 64, 55, 16,175,142,134, 86,245,203, 8, 67,230, 94,218,183,120, 19, 8, 50,137, +209, 48,167,202,165,255,139,202, 73, 89,219, 33,119,233, 36,252,239, 73, 2, 73, 82,232, 63,250, 85,167, 43, 22, 13,202,111,147, +197, 12,185,172,206, 60,104,235,198,251,237,243, 78,246,212,169,140,145, 22,127, 79, 74, 74,202,241,245,235,215,211,107,215,174, +109,175, 84, 42, 75, 54,144,175, 44,179,251, 76,157,203,105, 94,199,115,234,189,151,209,253, 96, 70,117, 97, 73, 90,181,106,149, + 24, 30, 30, 62,236,252,249,243, 67,175, 93,187,214, 69,161, 80,120, 82, 20, 5,137, 68, 18,173,209,104, 46, 10,133,194,253, 22, +154, 44, 0,192,162, 69,139,200,146, 37, 75,168,240,240,112,194,225,112,254, 0, 16,201,225,112,162,138, 54,130, 47, 58,223,180, +205,226,197,139,205,249, 65,188,150,151,151, 23,188,116,233,210,118, 75,151, 46,109, 88, 16, 21,186,134, 63,219,124, 89,138, 30, +192, 53, 62, 95,144, 64, 81,148, 59, 95, 32, 84,220,186,117,235, 98, 21, 53,149, 58,157,110, 78,108,108,236,186,117,235,214, 45, +151, 74,165,205,158, 62,125,250, 71, 85, 52, 11, 76,212, 0, 59, 59, 59,183, 61,123,246, 28,222,185,115,103, 11, 46,151,123,135, +162,168, 65,217,217,217,239,116, 80,233,130, 1,162,151, 88, 48,214,161, 89,186,111, 59, 73,233, 95, 97,220,140, 70, 99,222,252, +249,243, 83, 74, 26,175,146,209, 43,211,255, 5,169, 92,204, 57,166,150,244,162,172,192,184, 80,121, 0,144, 63,118, 97,254,176, + 58,230, 14, 42, 13, 64, 85,209,125, 78,211,244, 49, 0,207,105,154,126, 89,178,163, 75,209,101, 75,150, 44,169,232, 62,103, 97, +121,175, 49,227,201,182,152, 6, 22, 87,182, 37,237,223, 24,174,124, 59,229, 28,198,231, 47,161,129, 47, 1, 80, 4, 88,247,171, + 78,247,117,121, 27,186,180,194,114, 66, 97, 70,193,193,252, 54,233, 38,150, 85, 98,223,171,193,140,241, 7, 45,212,244, 65,249, + 3,202,190,161, 57,112,224, 64, 78, 25, 63,230,197, 6,149, 46,139, 35, 71, 10,179,248,151, 85,206,162,215,155,252,238,221,187, +110,129,129,129,137, 40,222,232,191,180,249,196,194,125,231, 0, 48,190,229,227,249, 94,104,214,170, 85, 75,240,234,213, 43,237, + 63,235,222,100, 53,255,145,154, 54,126,213, 65, 97, 28,138,230, 14, 42, 55,162, 85,196,160, 17,242, 51,178,194, 98,203, 40,167, +233, 62,183,137,136,136,240,172, 93,187,118, 52,128,172, 18,229, 40,109, 25, 97,207,209,127, 94,179, 52,198,163,248, 80,116,239, + 21,165,245, 14,199, 95,112, 34, 88, 77, 86,147,213,100, 53, 89, 77, 86,147,213,100, 53, 43,107,180,222, 91, 8, 33,160,193,194, +194,194,194,194,194,194,194,242,151, 64,149,227, 74, 45, 9, 9, 86,198,217, 94,100, 53, 89, 77, 86,147,213,100, 53, 89, 77, 86, +243, 63,167, 89,145,118,209,237,223,215,170,195,241, 0,118,176, 85,135,172, 38,171,201,106,178,154,172, 38,171,201,106,254, 83, + 52,203, 50, 44,239, 45,132, 16, 51,199, 58,100, 97, 97, 97, 97, 97, 97,249, 71,208,165, 46, 92,185, 70,208,103, 95,153,213,137, +170, 66,122,212, 66, 53, 0,120, 91,122,255, 81, 92, 1,244, 42,242,255, 41, 20,244,140,103,141,214,251, 75, 29, 0, 95, 1,176, + 46, 50,239, 30,128, 21, 37,214,219, 7,160,232,128,132, 10,228,143, 19,248,210,146, 47,163,105,122, 69,187,118,237, 62,187,113, +227,198, 90,131,193,176,180, 18,229,245,116,117,117,253,142,162,168, 38, 0,120, 20, 69,189, 74, 78, 78, 94, 97, 48, 24,170,210, +107,165,166,139,139,203, 74, 0,141,104,154,230, 81, 20, 21,145,156,156,188,204, 96, 48, 92,169,130,166,220,217,217,185, 53, 33, +196, 5, 0,135,199,227,165,199,199,199,223, 69, 37,115, 43, 13, 92, 28,198,207, 81, 24,120, 0, 96, 37,229,234,143, 44,246,211, +153, 59,143,189,196, 89, 88,254,219,144,252,158,201,197,232, 94, 11,203,137, 1,179,140, 0,213,205, 11, 27,207, 69, 98, 86, 89, +219, 83,165,244,106, 46,169,217,189, 22,150, 27, 73,190, 70,183, 90, 88,115,238, 21,202,237,105,111,142,166,137, 29, 0, 61,222, +140, 81, 10, 40,243,122, 95,255,211,233,133,226, 85,156,133, 85,158,229, 26,173, 33,117,225,106,228,130,123, 36, 12,166,110,188, +114, 0, 13, 11,126,228, 95, 34, 63, 87, 81,110, 21, 11,247,190,104,254,211, 88, 72, 8, 25, 86,236, 98, 45, 37, 15, 81,167, 78, +157,250,158, 63,127, 94, 98, 26,239,142, 97, 24,136,197, 98, 3,128,209, 22,124,151,211,144, 33, 67,230,254,244,211, 79, 24, 60, +120,240,252,147, 39, 79,174, 7,144,103,238,198,182,182,182, 3,109,108,108, 54,253,248,227,143,142, 45, 90,180,164, 4, 2, 1, + 94,189,138,112,159, 48, 97, 66,189,240,240,240, 99, 41, 41, 41,159, 90,186,243,118,118,118,195,109,108,108,214,109,223,190,221, +161, 77,155, 54,160, 40, 10,193,193,193,238,159,127,254,121,195,152,152,152, 3,201,201,201,147, 45,213,180,183,183,175,107,109, +109,221,113,243,230,205,226,214,173, 91, 67, 36, 18, 33, 52, 52, 84, 54,113,226, 68,151,248,248,248,176,228,228,228,171,150,154, +172, 71,193, 39, 62, 52,232, 52,171, 0,128,203, 23,206,110,177,238,246,137, 71,151, 79,244,169,104,222,192,197, 97,191,179,102, +139,133,133,165, 40,195,221,224, 66, 8,190, 60,255,243, 2, 26, 0,186,125,242,205,180,225,110, 88,251,107, 66,217, 99,216, 90, +168, 55,107, 84, 53,108,218, 19,143,228,170,148,115, 7, 64,127,206,229, 78,107, 30, 24,232, 48,229,230,205, 8, 29,176,251, 63, +114,138, 74,173,230, 44,211,104, 13,240,195, 82, 67,126,196,132,234, 81, 27, 7, 46, 68,114,174,119,234,212,169,246,216,177, 99, +169,198,141, 27, 35, 56, 56,184,238,129, 3, 7,122,157, 58,117, 42,194,104, 52, 6, 3,120, 2,243,179, 90,243, 0, 4,112, 56, +156, 38,255,112,205,127, 50,210, 2,115,149,140, 63, 19,157,190,145,240,244,210,165, 75,199,185, 92,174, 41,162,213, 92,161, 80, + 56,151,136,130,153, 67, 13,189, 94,143,103,207,158,129,166,105, 30, 0, 47,188, 57,164, 70, 89,184, 75, 36,146,173,183,239, 5, +219, 83, 92, 49, 50,213, 0,212, 58, 8,100,206,248,105,215, 94,187,153,211, 39, 15,184,114,229,202,245,220,220,220, 95, 44, 40, +143,151, 84, 42, 93,255,240,225, 67,123,137, 68, 2,134, 97,144,155,155, 11, 23, 23, 23,252,248,227,143, 54, 51,103,206, 28,150, +147,147,115, 69,173, 86,255,207, 18,115,110,109,109,221,241,241,227,199, 98,211,128,210, 90,173, 22,238,238,238,216,183,111,159, +112,218,180,105,126, 89, 89, 89,113, 90,173,246,181,185,130, 57, 10, 3,207,160,211,172,218,179,101,113,117, 0, 24, 53,121,241, + 42, 65,174,213,105,115,230,229, 40, 12,167, 0,176, 70,139,229,239,166,137,131,131,195,145,180,180,180,171, 0, 62,197,219,137, + 52,212, 21,137, 68, 13, 24,134,113,161,105, 26, 28, 14, 39, 73,161, 80, 60, 4,240,162,178,130,246,181, 58,244,129, 80, 50, 6, +132,105, 72, 3,160,104, 58,212,168, 83,238, 74,127,113,229, 68,149, 52, 5,226, 79, 0,210,144, 6, 24,138,166, 31, 50, 6,229, +143,105,207,174,156,249,167,156,156, 59,217,240,174,229, 98,254,192,152,111, 67,239,227,154,112,165, 25,208,251,162,204,175, 86, +156, 10,244,156, 62,125,186,203,228,207, 62,163,198,140, 30, 93,231,234,141, 27, 84,123, 75, 70, 43,120, 63, 41,179,193,126,169, + 70,107,160, 31,108, 9, 48,231,192,166,175,104, 46,135, 67, 13,157,190, 98,216,206, 45,107,232,174,125, 6, 21, 86,159,180,109, +219, 22,109,219,182,165, 86,173, 90, 85,231,143, 63,254,168,179,111,223, 62,195,237,219,183, 31, 2, 56, 88,214,151,117,175, 5, + 21, 3,136,248, 60,174, 98,232,130, 95,182, 7, 6, 6, 66, 40, 20,162, 42,154, 0,208,181, 54,253,154,103, 87,243,225,208,169, + 11,163, 91,180,104, 69,222,134,230,123,196, 61,160,112, 80,107,219,234,213,171,183, 54, 24, 12, 34, 0,224,114,185,234,216,216, +216,169,200, 31, 27, 16, 0,142, 49, 12,211,215, 2,109, 26,192,162,190,125,251,206,159, 50,101, 10, 60, 60, 60, 48,109,218, 52, +232,245,250,224, 51,103,206, 44, 4,176, 18, 21,220, 60, 78, 78, 78, 11,183,110,221,106,199, 21, 72,209,120, 78, 36, 18,179, 12, + 0, 0,153, 16, 56, 62,137, 96,218,180,105, 86, 65, 65, 65,203, 44, 49, 90, 78, 78, 78, 75,127,252,241, 71, 59,137, 68, 2, 66, + 72,225, 88,140,121,121,121,200,203,203,195,228,201,147,173,194,194,194,190,179,196,104, 57, 59, 59,183,222,188,121,179, 88, 36, + 18, 33, 47, 47,143,175,211,233,168,220,220, 92, 40,149, 74,162,213,106,117, 83,167, 78, 21, 62,121,242,164, 67, 98, 98,226,107, +176,252, 83,224, 0,248,136,199,227,245,175, 93,187,118,211,151, 47, 95, 62, 48, 24, 12, 71, 1, 28,125, 11, 47, 83,157,221,220, +220,150, 39, 36, 36,108, 6,176,247,191,114, 64,157,157,157,143,222,186,117,171,250,214,173, 91, 71,175, 93,187,246, 52,128,255, + 85, 65,142,207,231,243, 7,180,111,223,190,250,168, 81,163, 4,206,206,206,208,104, 52,136,140,140,180, 58,116,232,144,103,104, +104,104, 92,193,136, 24,102,191, 80,216,215,109, 37, 3,215,234, 64,203, 86,173,219, 12, 30,240,145,220,217,222, 26, 42,173, 17, + 47,163, 19, 61,206,158, 62,222, 62,156, 47,190,165,211,101,127,156,254,226, 86,158,165,154, 29, 59,118,110,211,165,115,103,185, +181,141, 53,178, 21, 58,188,138,138,247,188,124,225, 68, 91, 46, 87,124,141,161,244, 35, 82, 30, 95, 80,190,203,115, 51, 13,224, + 42, 68,246, 13, 26,182,106, 28,212,109,236,178,166,132, 16,208, 4, 27, 75, 70,179,166, 1,220,141,249,195,126, 89,164, 7, 66, + 8, 69, 97, 77,209,104, 86,247, 90, 88, 78, 8,102,129, 6,213,189,130,106, 74, 19,221, 0,161,141,157, 93,224,196,241,227,169, +220,156, 28,132,134,134, 42, 75,154,172,245,213,192,191, 70,163,198,177,216,202,155,237,127,104, 52,171,212,170, 67,179,243,104, + 73, 36,146, 82,231, 91, 91, 91,163, 99,199,142, 88,177, 98, 5, 23, 64,147, 18,139,139, 15,178, 10, 8, 79,110,155, 7,107,169, +144,246,240,240,144, 91, 89, 89, 85, 89, 19, 0, 64, 24,175, 86, 30,228,131,251,191,124, 53,250,226,190,117, 1,138,220, 44, 94, +201, 85,100, 50, 25,188,189,189, 49,127,254,124,243, 52,171,206,223,170,233,226,226,226,211,182,109,219, 38,151,174, 94,181, 73, + 72, 72, 16, 38, 36, 36, 8,207, 95,186,100,211,178,101,203, 38, 46, 46, 46, 62,133,135,234,205,174,166,229,149,243,155, 45, 91, +182, 44, 60,118,236, 24,221,182,109, 91,216,218,218,162, 99,199,142, 56,125,250, 52,119,237,218,181,223, 2,152, 95, 81, 57,105, +154,110,211,182,109, 91, 10,132, 32, 41,219,128,187, 43,124, 16,186,198, 23,185,106,130,140,236, 28,168, 84,106, 72, 36, 18, 17, +242,171,123,205,221,247, 86, 45, 91,182,164, 0, 20,154,171,220,220,252, 41, 47, 79, 1,173, 86, 7,161, 80, 40, 7, 32, 50, 87, +147, 16,226,210,186,117,107, 0,128, 78,167, 43,124,195,203,202,202,162,178,179,179,161,213,106,193,227,241,248,168,184, 93, 99, +161,166,149,148,171,231,242,133,179, 71, 77, 94, 28, 59,106,242,226, 88, 46, 95, 56, 91, 43,207, 49,154, 51,207, 74,202,213,191, +227,235,211,145,166,233,159,107,213,170, 21, 70,211,244, 30, 0, 46, 85,212,108, 6,224, 91,177, 88,124,209,215,215, 55, 86, 34, +145, 92, 42, 48,234, 45, 43,169, 41,144, 72, 36,151,190,253,246,219,195, 15, 30, 60, 24,252,199, 31,127,120, 61,122,244,104,192, +170, 85,171, 14,200,100,178,235, 40,222, 46,209,226,123,211,203,203,107,231,221,187,119,155,181,106,213,234, 39, 0,194,183,116, +191,115, 0, 52,130, 89, 35,114,188,147,243,238,214,184,113,227,234, 34,145, 8, 93,186,116, 1,128, 14, 85,209,228,243,249, 3, +230,207,159, 95,107,193,130, 5,130,196,196, 68, 92,186,116, 9,247,238,221,131,193, 96,192,164, 73,147,132,163, 70,141,170, 41, +151,203, 7, 88, 84, 78,174,213,129,233,159,207,232,241,229,180,113,242,135, 49, 58,236,186, 24,131,223,111, 39, 34, 69, 41, 64, +159, 1,163,172,187,247, 27,210, 93, 32,180, 62, 96,169,230,220, 57,115,122,140,255,100,152,252,105, 34,131,227,119,146,112,231, + 89, 54, 12, 60, 27,244, 28,240,169,109,195,214, 61,122,113,193,219,253,174,207,209,143, 64,139,233,211,167, 59,206, 94,243,235, + 77,183,102, 31,109, 76,205, 68,219,162,198,167, 46, 96, 99, 39,149,126,244,172,125,251,113,226,252,241, 98,203,213, 44,166,215, +164,223,166,148, 76,180, 43,218, 62,171,157, 29,234, 20, 84, 43,114,206,255,188,128, 38, 20,166, 13,119, 43,246, 28, 40,181,156, + 87,128,193,211,103,204,224, 89,219,218, 98,203,150, 45,208, 40, 20,197,218,204,118,174,142, 30, 23, 37,220,184,154,190,238, 97, + 29, 61,169,235,255,194,247,149,241,101, 70,180, 78,158, 60, 73,122,247,238, 77, 1,192,145, 48,100, 14,240,195,119, 67,166,124, + 59,159,162, 41, 82, 35,160,213,211,106,181,252, 21,246,246,246, 80, 42,149,208,104, 52,224,243,249, 80,171,213,136,137,137,193, +157, 59,119, 96,107,107,107, 81, 73,114,114,114, 32,147,201, 32,147,201,222,138,230,188,209, 93,132,175, 98, 83,133,231,238, 92, +105,255,253,103,255,107, 81,171, 81,135, 71,157,135, 76,123,108,229,232,166,126,244,232, 17,110,221,186,133,204,204, 76, 4, 6, + 6,254, 91, 78,230,189,130, 54, 89,247, 0,216,214,174, 93,219,253,220,197,107,182,121,106,198, 42, 42, 89,207, 99, 24, 6, 18, +137,171,225,224,145,227,217,131, 7,244,161,146,146,146, 82, 0,220, 43, 48,183, 21,141,169, 40, 2,224, 51,112,224,192,185,159, +125,246, 25, 34, 34, 34, 48,110,220, 56,213,189,123,247,210, 91,181,106,101,255,227,143, 63,138,103,206,156,137,171, 87,175, 46, + 58,121,242,228,111, 0, 34, 1,148, 58, 86, 27, 33,132,207,231,243, 97, 40,176, 13, 58, 35, 83,232,239,115,114,114, 64, 84,153, +224,243,249, 28, 0,142, 48,179, 29, 29,195, 48,124, 30,143, 87,104,178, 98,146,115, 16,147,162, 68, 78,158, 22, 42,149, 1, 90, + 21, 1, 71, 98,207, 5,162,156, 1, 68,153, 27, 29, 17,137, 68, 48, 24, 12,200,205,205, 47,134, 41, 82,166,213,106,145,157,157, + 13, 14,135, 35, 3, 96, 5, 32,195, 28,193,130, 70,238,191, 23, 84, 3,226,254,175,125, 29, 94,158,154, 87,108,158,149,148,171, + 63, 50,211,143, 99,239,222,240, 70,163,193,187,125, 11,231,189,219,246, 89, 66, 71, 71,199,203,135, 15, 31,246,171, 83,167, 14, + 34, 35, 35,125, 7, 13, 26, 20,152,152,152,216, 8,150,143,201, 40,161,105,250,187, 81,163, 70,125, 54,116,232, 80,170,110,221, +186,224,114,185, 48, 24, 12,238, 17, 17, 17, 29, 15, 29, 58, 52,103,231,206,157, 63, 26,141,198, 47, 96,126,187, 63, 90, 32, 16, + 28,220,190,125,123,187,192,192, 64,236,217,179, 7,247,238,221, 99,154, 53,107, 70,143, 28, 57, 18,158,158,158,129, 35, 71,142, +252, 93,163,209,244,172,100,100,203,179,101,203,150,213, 57, 28, 14, 90,181,106,197,191,117,235, 86, 99, 0,183,170,120, 76,101, +238,238,238, 87, 59,116,232,208,232,226,197,139, 33, 73, 73, 73, 29, 44,216, 95, 0,232,231,230,230,182,202,218,218,218,214,130, +103,172, 50, 62, 62,126, 22,128, 35,102,110,210,162, 73,147, 38,136,142,142,134,143,143, 15,248,124,126, 75,157, 78, 55, 1, 64, + 15, 0, 95, 3, 8,179,160,188,117, 59,119,238, 92,189, 67,135, 14,212,145, 35, 71, 10,219,135,210, 52, 13,131,193, 0, 62,159, +143, 22, 45, 90,208,193,193,193,213,238,223,191, 95, 23,102, 84, 35,218,215,234,208,167, 85,155,246,109,218, 5, 54,160,215, 30, +121, 9, 35, 99, 4,135, 50,128, 75, 49, 96,244, 66, 8,249, 28,212, 13,104,202,121,246,228, 97,160, 86,163,235,147,254,226,226, + 9,115, 52,123,116,235,218,214,207,167, 46,253,253,239,175,144, 21, 31,102,140, 15,191,150, 70,115,104,248, 53,233,228, 80,215, +191, 17,167, 81, 96, 7, 94, 66,228,147,142,106,117,187, 46,153, 17,215, 46,190,139, 27,114, 9,192,113,175,230,240, 81,239,174, + 29,248,137, 9, 9,138, 67, 71, 78, 60, 86,234,113, 7, 0,174, 2, 84, 79,160, 65,253,230,205,219,255,184,114,165,189,171,171, + 43,111,196,208,161,134, 29, 33, 33, 33, 40,163,234,119, 9,192,113,112,113,233, 50,113,226, 68, 78, 98, 66, 2, 57,116,244,212, + 35,147, 30,242,223, 82,234, 55,112,247,237, 13,197, 51,139,170, 41,251, 0, 2,103, 23, 23,191, 9, 19, 38, 32, 41, 33, 1,123, +246,238,205, 83, 3,183, 77, 81,172,227, 28,108,246,175,229, 50,102,246,167,125,169,234,174, 14,152,184,104, 71,203,142,186,148, + 90, 72,252,243,252, 23,245, 34,239,177,201, 26, 95,170,209, 42,201,255,194,176, 80,206,135,215,161, 67,251,233,212, 92,157, 34, + 34, 34, 2, 14, 14, 14,112,117,117,133,181,181, 53,158, 62,125,138, 75,151, 46,225,249,243,231, 96, 24, 6, 13, 27, 54,180,168, + 52,105,105,105,120,248,240, 33,108,109,109,223,154,102,173,234,142,152, 82,221,145,159,156,158,195,191,120,239,121,224,142,121, + 3,252,105,223, 1, 59,139, 14, 18,171,213,106,241, 47,161,176,119, 97,245,234,213, 91,239,218,181,139,175, 49, 64, 94,119,194, +237,213, 10,181, 81, 10, 0, 82, 17, 71, 17,188,202,251,139,111,190,249, 70,241,201, 39,159,248,198,198,198,174, 48, 35,214,191, +188,115,231,206, 95, 18, 66,120,211,167, 79, 7, 0,140, 26, 53, 42,231,206,157, 59,117, 1,164, 92,186,116,201,109,236,216,177, + 47, 46, 95,190, 44,153, 49, 99, 6,199, 96, 48, 60,229,114,185,228,228,201,147, 75, 1, 44,126,227, 23,145,166,131, 66, 66, 66, +106,184,121,122,195,211,158, 70,219,249,207,243, 31,112, 18, 6,113, 81,175, 16,254,232, 30, 92, 92, 92,172, 93, 93, 93,195,226, +226,226,116,241,241,241,115, 20, 10,197,214, 10,202, 24, 26, 28, 28,236,234,233,233,137,188,188, 60,196,165, 42, 49,237,168, 4, + 57,170,252, 32, 6, 15, 42, 52,170,238, 45, 23,211,218,123, 41, 41, 41, 58,173, 86,187, 32, 59, 59,123, 87,121,154, 60, 30, 47, +253,209,163, 71, 50, 15, 15, 15,168,213,106,146,145,145, 65, 41, 20, 10,228,230,230, 82,167, 78,157,250, 48, 49, 49,177,153,151, +151, 23,229,238,238,190, 52, 49, 49, 81, 21, 31, 31, 63,206,156,170,201, 2,195,100,228,114,185,107,199,143, 31, 63,248,183,223, +126, 11, 58,178,216,175, 95,145,234, 18,235,128,128,128,115, 13, 26,248,187,237, 93, 83,127, 35,128,213,255,128,107,107,204, 87, + 95,125,229,103,103,103,135,137, 19, 39, 98,201,146, 37, 88,184,112, 97,157,137, 19, 39,142, 7,176,222, 2, 29,177,139,139,203, +253,239,191,255,222,183,117,235,214, 56,125,250, 52,246,239,223,143,215,175, 95, 27,188,188,188,184,129,129,129, 88,180,104, 17, +186,119,239, 62,110,234,212,169,237, 19, 18, 18, 26,155,105, 62, 62, 89,180,104, 81,191, 54,109,218, 96,244,232,209,154, 43, 87, +174, 12, 6,112,254,194,133, 11,157,174, 94,189,122,228,215, 95,127, 21,127,251,237,183, 93,102,206,156, 57, 17,192,166, 74,236, +255,135,237,218,229,143,161,220,166, 77, 27,172, 90,181,170,123, 21,141,150,192,222,222,254,212,158, 61,123, 26,121,123,123, 99, +196,136, 17,141, 7, 15, 30,124, 42, 51, 51,179, 43, 0,179, 30, 72,213,170, 85,251,238,216,177, 99,181,203,170, 89, 40, 13,141, + 70, 99,247,209, 71, 31,173,140,138,138,178,200,104,237,219,183, 15,179,102,205, 66,195,134, 13, 27,180,104,209, 98,219,132, 9, + 19, 48,112,224,192,206, 79,159, 62,117, 70,126,175,229, 10, 17,137, 68, 13, 62,254,248, 99,193,221,187,119, 1, 0, 1, 1, 1, +104,212,168, 17,162,163,163, 17, 20, 20, 4,141, 70, 3,103,103,103,244,239,223, 95, 20, 21, 21,213, 32, 45, 45,173, 66,163, 69, + 11, 37, 99,250,245,238, 41, 63,126, 39, 17, 70,198,128,166,181,173, 16,232,235,132,103,113, 57, 8, 14,139,131, 81,203,135,149, +157, 61, 90,182,239,102,151, 20,255,122, 76, 58, 80,113,123, 45,161,100, 76,255,126,189,100,199,111, 39, 32, 43, 33,156,188,188, +247,219, 37,189, 90, 49, 14, 0,130,254, 56,176,205,197, 94,220,181,110,147,166,156, 14, 93,251,218, 30,221,159, 52, 38,243,239, + 25,219,239, 13,174, 86,199,118, 79, 94,218,168,217,195,218, 18,158,173,251, 61,185, 94,191,217,180,172, 59,208,109,206, 87, 95, +181,248,116,252,120, 17,195, 48,248,245,151, 95,114, 30,134,132, 60, 27, 15, 48, 19,202,208,219, 12,120, 14,238,215, 79, 40,183, +178,194,231,211,166, 65,174,215, 95, 46, 60, 36, 64,231,207,191,252,178,245,228,201,147,197,219,150,126, 22,212,125,236,178, 38, + 12, 33,148,169,154,114, 95,249,161,184,102, 99,251,245,131,220,202, 10,211,167, 79, 7,165,211,157, 43, 52, 80, 92, 92,254,228, +195,182,129,195,250,180, 1, 5, 10,251, 79,222,192,203,232,212, 71,151, 19,241,234,125,117, 85, 37, 40,179,141, 86,185, 85,135, +185, 58, 36,119,238, 53, 32,177,110,221,186,185,117,234,212,201, 77, 79, 79,199,227,199,143,145,153,153,137, 77,155, 54, 33, 60, + 60, 28, 12,195, 84,218,192, 48, 12,131,183,173, 9, 0,206,246, 86, 24,209,179, 57, 87,163, 86,136, 82, 83, 83,139, 85, 31,253, +139,140, 86, 33, 6,131, 65,228,229,229, 5, 26,160,178,149,122, 89,210,190,118, 84,210,190,118, 84,182, 82, 47,211,106,181,180, + 76, 38,131, 70,163, 17,153, 33,197,251,224,131, 15,190,252,237,183,223,120,203,151, 47, 71,189,122,245,160,211,233,112,231,206, +157, 56, 0, 41, 5,235, 36, 92,187,118, 45,193,100,132, 87,172, 88,129,163, 71,143, 82, 93,186,116,153, 83,218,245,148,152,152, +248,221,132, 9, 19, 50,148,185, 25,216, 62, 68,133, 35, 35, 82,241,115,191,215, 24,106,127, 24, 25,201, 49,216,177, 99, 7, 46, + 92,184, 72,157, 63,127,129,127,229,202, 21,105,175, 94,189, 54, 86,171, 86,237,100,121,133, 76, 72, 72, 88, 62,121,242,228,172, +220,220, 92,228,230,230, 66,165, 82, 35, 67, 1, 60, 90,231,135, 71,235,252,160,102,196,216,178,121, 43,253,232,209, 35,135,215, +175, 95,187,245,233,211,103,157,171,171,235,206,242, 52,227,227,227,239, 78,153, 50, 69,157,147,147, 3,173, 86,171, 51, 26,141, + 90,149, 74,165, 63,112,224,192, 12,123,123,251,150,167, 79,159,230, 93,184,112,145,123,229,202, 85,254,165, 75,151,172, 59,118, +236,120,208,217,217,121,183, 57,145, 50, 14,135,179, 97,239,222,189, 99,182,108,217,226, 28, 24, 24,232, 95,162, 42,202,181,107, +215,174, 53,126,249,229,151,106,171, 86,173,154,131,252, 14, 40,239, 20, 7, 7,135,169,253,250,245,195,150, 45, 91,112,226,196, +137,153, 27, 55,110,196, 7, 31,124, 0, 55, 55,183, 41, 48,191,218, 11, 0, 86,175, 95,191,222,215,215,215, 23,163, 70,141,210, +142, 27, 55,238,139, 93,187,118,121, 93,191,126,157,191,123,247,238, 26, 19, 39, 78,156, 62,108,216, 48,117,205,154, 53,177,105, +211,166,218, 52, 77,111, 48,235,254,118,118,158, 49,116,232, 80,172, 89,179, 6, 87,174, 92, 25,128,252, 31, 84, 45,128, 51, 55, +111,222,236,243,237,183,223, 98,192,128, 1,112,119,119,159, 94,153,200,147,159,159,223,130, 30, 61,122,224,250,245,235,104,220, +184, 49, 90,182,108, 57, 19,128, 67, 37, 15, 39, 45,147,201, 14,238,218,181,171,109,141, 26, 53,176,108,217, 50,212,170, 85, 11, + 59,119,238,108, 43,149, 74, 15,194,204,230, 27,214,214,214, 50,137, 68,130, 57,115,230,144, 1, 3, 6,100, 84, 52,205,156, 57, +147, 8,133, 66,216,218,218, 90,155,107,138, 69, 34, 81,171,122,245,234,225,206,157, 59,184,112,225, 2,230,207,159,143, 25, 51, +102, 32, 53, 53, 21, 31,127,252,177, 4,192, 64, 11,246,219,201,209,209, 17, 57, 57,249,227,194,215,171, 87, 15, 15, 30, 60, 64, +106,106, 42,220,221,221,145,148,148, 4,123,123,123,120,123,123,131, 97, 24, 39,243, 36, 73, 61, 7, 59,107,164,100,106,192,133, + 1, 77,234, 58,224,242,227,116,196,164,106,225,100,111,131,164,148, 84, 84,179, 23,161,122,117, 15, 16,194,212, 51,203, 1,115, +232, 38, 66,145, 24, 25,185, 58,196,135, 93, 73,215, 25, 53, 19,178, 34,111,198,102, 69,222,140,213,105,212, 19,130,110, 92, 72, +175,225, 44, 70,245,234,213, 65, 17,166,249,187,184, 31, 7,121,160,186, 84,204, 29,117,225,231, 5,212,201, 31,231, 81,154,244, +152,102, 61,156,243, 35,203,142,128,215,160,143, 63,110,245,197, 23, 95,136,146,147,147,153, 97, 67,134,100, 44, 95,188,248,226, +217, 10, 94, 12,242,128, 58, 93,187,118, 5, 13,224,236,249,243,138, 36, 32, 14, 0,156,129,234,125, 63,250,168,221, 87,115,231, +138,211,210,211,153, 59, 17,121,199,195, 83, 72,127, 59, 35,188,204,105,159,101, 4,234,155,116,207,157, 59, 71, 84, 64, 16, 0, +116,168,142, 41,221, 90, 7, 4,142,236,215, 14,137, 41,153,152,190,252,103,108, 59,116,245,156,181,158,116,250, 23,253, 20,143, +175,148,209, 42,168,250,121, 99,158, 82,249,102,237, 65, 85, 13,204, 95,161, 89, 26,255, 70,163,101, 66,175,207,175, 37,209,234, + 25,104,245,140,233,173, 22, 42,149,202,108,137,115,231,206,237,153, 54,109, 26,214,173, 91,135, 23, 47, 94,128,207,231,163, 94, +189,122,174, 0,100,166,103,126,147, 38, 77,156,104,154,198,179,103,207,176,118,237, 90,124,242,201, 39,228,214,173, 91, 59, 81, +122,190,148, 7, 25, 25, 25,155, 39,140,251, 36, 43, 51, 57, 6,122, 85, 38, 82,226, 95, 65,163,200,194,178, 21,223, 65,169,231, + 34, 41, 91,135,164,108, 29,104,161, 29,182,253,184,139,227,231,231,215,131,195,225,244, 46,167,156,119,146,147,147,127,156, 52, +105, 82, 86, 82, 82, 82,225,254,105,245, 4, 90,125,241,235, 85, 34,145, 96,195,134, 13,214,117,235,214,237,199,229,114, 59,150, +163,153, 24, 27, 27, 27, 62,105,210, 36,109,114,114, 50,178,179,179,113,252,248,241, 62, 53,106,212,176, 93,185,122, 29,165,208, +113,145,148,165, 67, 82,150, 14, 2,153, 19, 14, 30,249,141,227,237,237, 61,140,203,229,182,172,200,100,253,250,235,175, 35,135, + 12, 25, 34, 95,189,122,117,198,177, 99,199,182, 0, 40,122, 66,158,109,216,176,225,208,193,131, 7,115,191,252,242, 75,187, 85, +171, 86,205,124,199,102,171,227,144, 33, 67,124, 24,134,193,225,195,135, 31, 1, 88,255,219,111,191,221,215,104, 52,248,248,227, +143,189, 10,170,145,204,161,217,176, 97,195, 62,107,219,182, 45, 62,255,252,115,221,197,139, 23,155, 0, 88,135,252,170, 92, 2, + 32, 26,192,198,171, 87,175, 54,156, 58,117,170,166,121,243,230, 24, 61,122,244, 39, 0,218, 86,160,219,106,232,208,161,190, 12, +195,224,192,129, 3, 15, 1,156, 46,177,252,210,145, 35, 71,238,104,181, 90, 12, 31, 62,188, 38, 0, 75, 30,228,124,161, 80,120, +248,155,111,190,177,137,143,143,199,200,145, 35, 53,207,158, 61,195,226,197,139,197,214,214,214,167,139,220, 3,102, 35, 20, 10, +119,252,240,195, 15,253,234,215,175,143, 73,147, 38,105,183,110,221, 58,237,179,207, 62,211, 54,105,210, 4, 91,182,108,233, 39, + 16, 8, 44, 26, 90, 36, 33, 33, 33, 43, 44, 44,204,190,162, 41, 46, 46,206,220,238,249, 18,153, 76,118, 59, 32, 32, 32,167, 94, +189,122, 77, 13, 6, 3,158, 62,125,250,106,207,158, 61, 76,189,122,245,176,121,243,102,172, 90,181, 10,189,123,247, 6,135,195, + 49,219,104,113, 56, 28,232,116, 58, 72, 36, 18,112,185, 92,188,122,245,202,148, 90, 6,124, 62, 31, 0, 32,149, 74, 33, 22,139, + 65,211,180, 89,189,209, 40, 10, 36, 71,169, 7,143, 71,131, 75, 51, 8,143,206,134, 78,207, 64,196,231,128,199,165, 0,194,192, + 70,202,131, 72,192, 1, 77, 81,140,153,154,200, 86,232, 32,224,211,224,241, 5, 20,109, 48,138, 11,127, 28,185, 70,177, 88, 44, +160, 28,172,132, 16,241,255, 65,195, 2, 83,249, 13,203,199, 0, 60,169,135,199,224, 53,107,215, 10,114,242,242, 48, 96,192,128, +140,168,251,247,247,170,128,251,237, 43,232,164, 68,115,185,117, 59,180,111,143,224,144, 16,228,102,102,190, 4,242, 27,199, 11, +220,220,134,108,216,176, 65,160, 82,171, 49,160,127,255,172, 23, 55,110,252, 26,155,135,147, 7,162,243,141, 88,133,231,157,207, +119, 49,233,102,103,102,102, 2,249, 41, 36,156, 29,101, 43, 39, 15,235,142, 92,165, 26,179,191,219,203,132,132, 39, 78,185, 30, +135, 94,191, 37, 32,251, 95,246, 51, 60,190,196, 4,192,140,132,165,166,232, 82, 69,102, 69,163,209,188,117, 3, 84, 85,205,210, + 76, 98, 85, 53,255,137,112,185, 92,245,243,231,207, 5, 86,246,110,140,189,156,151, 89,227,147, 27,214, 0, 96, 39,227,102,235, +140,122, 38, 33, 33, 1, 66,161, 80,109,102,117,195,184, 29, 59,118, 44, 3,224,207,229,114, 79,238,218,181,139,218,187,119,175, +237,208,161, 67, 35,194,194,194,226, 3, 2, 2, 60,119,237,218,101, 5, 0, 27, 55,110, 36, 7, 15, 30,236,142,252,148, 25,101, +230,113, 73, 78, 78, 94,156,158,158,126,107,242,228,201,155, 4, 2,129,173, 84, 42,181,191,126,253, 58,165,214, 17, 52,251, 42, +186,176, 39,162,149,152,198,181,121, 86, 24, 63,126, 60, 39, 44, 44,108, 69,124,124,252,201,114, 52,231,100,101,101, 93,127,241, +226,197, 58,107,247, 70,142, 82,207,175,172, 3,231, 61, 3, 0,120, 58,240, 64, 23, 60, 23,179,178,178,144,154,154,138,207, 62, +251,204, 54, 34, 34, 98, 78,124,124,252,229,114,162, 90, 87,211,210,210,226,158, 60,121,210,129,199,227, 9,164, 82,105,179,219, +183,111, 83,106, 45,131, 6,115,162,145,145,151, 95, 78, 59, 25, 23, 65,223, 56, 99,202,148, 41,220,151, 47, 95,126,151,152,152, +216,166,212,135, 25, 77,175, 42,106,178,102,207,158, 29, 10,160, 38,128, 98, 85,163, 70,163,145, 26, 62,124,248, 99, 0,245,190, +252,242, 75, 59, 66,200,204, 57,115,230,100, 0,216,254,119, 95, 75, 86, 86, 86, 43, 39, 76,152,128,131, 7, 15, 34, 51, 51,115, + 3, 0,228,228,228,172,223,183,111,223,129,113,227,198,225,151, 95,126, 89,153,154,154,122, 22, 21,119,213,254,224,227,143, 63, +198,153, 51,103,240,199, 31,127, 44, 0,240,180,140,245, 94, 92,191,126,125,206,177, 99,199,190, 31, 58,116, 40,126,254,249,231, + 30, 0,202,107, 32,219,181,123,247,238, 56,125,250, 52,210,211,211,183,148,182, 66, 86, 86,214,214,227,199,143,183,232,222,189, + 59, 86,172, 88,209, 21,192, 37, 51,118,221,215,218,218,122,215,247,223,127,223,172,126,253,250, 24, 54,108,152, 90,167,211,245, +248,242,203, 47, 79,236,223,191, 95,190,103,207,158,166,227,199,143,191, 91,144,243,237,142, 89,161, 44,154,254,118,237,218,181, + 99, 59,116,232,128,153, 51,103, 26,206,157, 59,215, 23,192,249,179,103,207, 70,204,158, 61,251,212,218,181,107, 57,107,214,172, + 25, 59,125,250,244, 84,134, 97,222,149,185,254,102,227,198,141, 45,186,117,235,134, 87,175, 94,225,206,157, 59,208,233,116,191, +220,190,125,251, 90,157, 58,117,190,209,106,181, 39,164, 82,233, 40,185, 92, 30,208,168, 81,163, 78, 65, 65, 65, 18,152,215, 78, + 47, 57, 50, 50,210,198,218,218, 26, 6,131, 1,143, 30, 61,130,135,135, 7,116, 58, 29, 94,191,126,141,250,245,235,131,207,231, + 35, 57, 57, 25, 69,162,229, 21,152, 34,250, 81, 68, 84, 66, 77, 59,185, 20, 48,138,240,224, 89, 28, 28, 29,108, 97,164,104, 36, + 37, 37,162,145,143, 59, 40,138, 66, 86,122, 18, 40,138,122,108,142,166,145, 48,193, 49, 9, 41,213,236,229, 66,212,111,209,205, +254,246,217,212,189, 86, 53, 91,143,231,114, 40,142, 64, 40,219, 62,118,244,104, 7,134, 33,200, 74, 79, 6,151,166,239,189,139, + 19,116, 56, 6,177,237,107,137, 30,116, 27,187,172, 17, 69, 64, 84, 58,236,249, 57, 25,153, 18,160,209,198,175,191,182,177,119, +112,192,176, 97,195,152,244,248,248,139, 74, 51, 19, 43,215,172, 83,199, 89, 38,151,227,230,205,155,224,228,183,177,197, 78,192, +119,213,236,217,246, 78, 46, 46,248,100,236, 88, 38, 57, 38,230,146, 10, 72,176,164,172, 53,107,213,226,153,116,233, 2,221, 68, + 14,166,125,217,183,173, 80, 42, 22,226,219,109,191, 33, 54, 77,113,224,118, 34,182,253, 75,227, 29, 59,202,141,104,149,213,248, + 44,191, 81,181,164, 92,179, 34, 18,137, 10,163, 41, 22,188,233,189,117,205,138,248, 43, 52,223, 33,243, 0, 28, 3, 48, 47, 54, + 54, 54,124,236,216,177, 58,131, 78,147,123,107, 89,205,185, 33, 43,106, 76,186,189,216,117,210,239,211,172,231, 42,179, 51,114, + 55,110,220,168,143,141,141, 13, 47,186, 77, 5,218, 49, 0, 78,239,222,189,123,235,225,195,135, 81,175, 94, 61, 60,125,250,212, + 73,161, 80, 52,126,252,248,177,157,175,175, 47,246,238,221,139,131, 7, 15,174, 3,112,161, 60,147,101,194, 96, 48, 92, 76, 74, + 74,242,142,142,142,174,109, 99, 99,163,183,177,177, 65,201,158,136, 57, 42, 6,233, 89,217,176,179,179,135,149,149,149,151, 25, +230,252,116, 82, 82, 82, 93,198,214,167, 93,221,180, 13,217,193,223, 86, 71,240,183,213,113,122,142, 27, 92,109, 4,200,204,204, + 68,106,106, 42, 82, 83, 83, 65, 81, 20,244,122,189,159, 25,154,175, 19, 19, 19,127,138,137,137, 57,230,236,236, 12,185, 92, 14, + 2, 32, 41, 75,143,208, 53,190, 8, 93,227,139,164, 44, 61,114,114,115, 81,163, 70, 13,200,229,242,178,170, 40,232,106,213,170, +245, 28, 50,100,136, 28, 0, 10, 12, 84,103, 66,200,164, 82,166,137, 6,131,161,181,105,221, 89,179,102,217, 1,232,254, 55, 95, + 79, 28, 0,147,199,141, 27,215, 84, 36, 18, 97,243,230,205,175, 1,252,106,122,214,111,221,186,245, 25, 0, 76,155, 54, 45, 0, +192, 76,148,145, 9,186, 48, 52,196,231, 55,241,243,243,195,237,219,183, 1,224,183, 10,190,251,200,173, 91,183, 80,167, 78, 29, +136, 68,162,102, 21,172,235, 85,189,122,117, 60,123,246, 12, 0, 30,148,177,206,131,103,207,158,229, 87,247, 80,148,151, 25,251, +222,175, 91,183,110,143, 46, 95,190,220,172, 85,171, 86, 24, 59,118,172,246,238,221,187, 61, 1, 92,123,240,224, 65,199,225,195, +135, 43,234,214,173,139,171, 87,175,250, 14, 31, 62,252, 22, 77,211,203,204,208,252,100,233,210,165,243, 62,252,240, 67, 44, 93, +186,148, 28, 58,116,104, 24,128,243, 5,203,206, 29, 56,112, 96,228,242,229,203, 73,255,254,253,177,100,201,146,121, 0, 38,149, + 39,166, 80, 40,178,141, 70, 35, 20, 10,133, 89, 33,121,115,215,119,112,112,248,160, 91,183,110,152, 63,127, 62,170, 85,171,134, + 19, 39, 78, 16, 0, 39, 1, 92,215,106,181,237, 0,172, 85, 40, 20,191,223,190,125, 27, 93,187,118,229,163,248, 16, 35,229,125, +255,163,125,251,246,105,172,173,173,225,233,233,137,154, 53,107, 34, 41, 41, 9, 81, 81, 81,168, 95,191, 62,154, 52,105, 2,131, +193,128,159,126,250, 73,157,155,155,107, 86, 78, 62,131, 86,177,231,194,169,163,217,246,114, 33,220,157,172, 81,163,154, 29,242, +178,210,144,154,148,128, 38,126, 30,104,223,164, 6,210,178,181, 56,119,242,104,102,110,174,114,143, 89, 33,124,141,114,215,197, +179, 39,178,109,229,124,120,251, 4, 96,248,216,105,141, 26, 53, 14,188,208,188,121,235,115,171, 87,126,219,160,115, 75, 63, 42, + 46, 77,141, 51, 39,127,203,204,206,201,217,245, 46, 30,244, 75, 0,142,218,186,238,181, 45,199,130,127,242,239, 49,238,167,240, + 56,108, 0, 0, 61,135,227,219,243,131, 15, 16, 23, 23,135,163,135, 15, 39, 42,129,135,230,234,137,197, 98, 26, 0,178,179,179, + 33, 44,104,119,103, 0,124,122,245,234,133,212,180, 52,236,251,245,215,212, 51, 64,136, 37,229,236, 3, 8, 36,226,252,128, 96, +118,118, 54, 40, 32, 7, 0, 40, 46,122, 54,175, 87, 7,169, 25, 57,184,124, 47, 60,175,134, 10,159,149,167,243, 30, 55,132,175, + 92, 27, 45, 0,105, 51,103,206,132, 80, 40,132,171,171,107,161, 57, 50,153, 21,129, 64, 0, 87, 87, 87, 24, 12, 6, 28, 56,112, + 0, 0,210,202,125,195, 3, 52,125, 39,173, 96, 52,122,162,228,241,120,111, 69,179,224,205, 81, 51, 96,246,207,204,217, 91,165, +119,138,169,140,230,123, 64,243,130,156, 88,205, 1,100, 70, 69, 69,197, 13, 30,208, 55, 59, 58,226, 73,146, 34, 43, 33, 49, 39, + 61, 54, 49,246,245,227,164,175,230,204,204,142,139,139,139, 69,126, 46,173,230, 9, 9, 9,166,109,204, 97,230,224,193,131,127, + 24, 55,110, 28, 9, 13, 13, 5, 0, 4, 7, 7, 99,244,232,209,100,228,200,145, 27, 0,204,173, 68,185, 21, 42,149,170, 88, 52, + 68,103,100, 10,171,252,114,114,114,144,144,144, 0,173, 86,107,182, 35,126,113,110,205,243,140,168, 32,125,128,167, 20, 1,158, + 82,248, 86,151,128, 50,228, 21,154,172,212,212, 84,211,155,179,218,130,114,230,104, 52,154, 98,229, 44, 90, 53,153,147,147,131, +164,164, 36, 24,141,198,178,126,200,152,248,248,248,115, 7, 15, 30,204, 5,128,213,171, 87,103, 80, 20,245, 7, 69, 81, 63,148, + 50,109,227,114,185, 55, 77,235,174, 89,179, 38, 3,111, 86,137,253,149,124, 88,191,126,253,204,121,243,230,109,158, 62,125, 58, +182,109,219,134,196,196,196,185,248, 51, 23, 15,147,150,150, 54,123,203,150, 45, 24, 51,102, 12, 22, 46, 92,184,166,113,227,198, + 57, 0,134,151, 37,232,232,232,232,206,229,114, 17, 18, 18,146, 3,224, 85, 5,223,159, 20, 18, 18,146, 76, 81, 20, 92, 93, 93, +107,149,183,162,157,157, 93,109,185, 92,142,248,248,120,160,224,141,185, 20,162, 18, 18, 18,136, 64, 32,128,155,155, 91,157,138, +118,222,214,214,118,246, 79, 63,253,196,125,242,228, 9, 58,119,238, 28,119,245,234,213,174, 0, 76, 93,210, 67,130,131,131,219, +118,236,216,241,249,133, 11, 23,240,221,119,223, 81, 13, 27, 54,156, 84,145,166,167,167,231,196, 79, 62,249, 4,155, 54,109,194, +246,237,219, 39, 1, 56, 92, 98,149,253, 91,182,108,153,182,125,251,118,140, 29, 59, 22, 94, 94, 94,195,203,211,139,142,142,158, +211,161, 67,135,224, 23, 47, 94,152, 53,226,129,153,235,119, 12, 12, 12,172,173, 82,169,176,107,215,174, 87,181,107,215,190,127, +248,240,225,153,120,243, 7,251,247,163, 71,143, 98,196,136, 17,104,216,176,225, 46, 0, 67,205,185, 45,195,194,194, 98, 47, 93, +186,196,240,249,124,120,122,122,162,119,239,222, 24, 54,108, 24, 26, 52,104, 0,157, 78,135,163, 71,143, 50,143, 31, 63,142,211, +106,181,102,229, 82, 74,127,113,229, 68,100,228,243,155, 33,119,175,233,185, 28, 26, 30,174,118,248,168, 75, 35,124, 58,176, 53, +154,248, 86, 67,116,138, 10,151, 46, 93,208, 71, 70,190,186,109, 78,143, 67,147,102,248,211,135,183,158,132,220, 48,240,184, 20, +124,125,234, 98,254, 87,179,109,151, 47,154, 99, 83,183,150, 7, 30,190,206,198,133,243,103,244, 9,113,177,151,223, 85,143,195, +171, 0, 95, 38,164,164, 28,154,134,145, 22, 42, 56, 5, 29,105,234,249,251,123, 59,187,184,224,212,169, 83,160, 45,232, 17,122, + 21,224,203,100,249,181,224,121,121,121, 48,233,213,246,241,241,241,240,244,196,233, 83,167,192, 97,152,176,246, 22, 38, 24,125, +150, 95, 13, 93,168, 75, 1,234,207,170, 67, 94,187,186,147,143,173,181, 20,119, 31,190,132, 70, 79,238,253,154,137,119,154,143, +236, 47,100, 60, 42, 89,117,184,122,219,182,109,205,127,250,233,167,174, 51,103,206,148,141, 26, 53, 10, 34,145, 8, 74,165, 18, +238,238,238, 48, 26,141, 56,123,246, 44,130,130,130,242, 24,134,185,128, 55,211, 6,116, 65,145, 94, 26,231, 94, 65,156,239,183, +148,205,143, 13, 26,244, 86, 52, 1, 64,246,146,177, 74,175,161,221,187,241,240,141,254,251,206,133, 80,159, 15,109, 79, 55,241, +169, 14, 0,112,118,118,134,149,149,149,197,154,111,129,191, 92,179,104,181,110, 82, 82,210,179,164,164,164,148,113,227,198,249, +154, 26,190, 11,133, 66,117, 65, 36, 43,179,180,109,204, 40,167, 14,192,103, 63,253,244,211,241,236,236,236,115, 95,126,249, 37, +150, 47, 95,142, 19, 39, 78,180, 5,112,179,146,251,110,204,204,204,204,186,119,239,158,115, 29,191,198,168,233,196, 67,187, 5, + 47, 64, 8,129,189,132, 32, 55, 43, 3, 15, 30,132, 32, 55, 55,247,174, 37,229,212,233,116, 89, 41, 41, 41, 14, 78, 78, 78,200, +200,200, 64, 90, 90, 90,161,201,202,204,204, 68, 70, 70, 6,161,168, 55,114,182,148,167,169, 72, 73, 73, 81,134,135,135, 11,156, +171,215, 65, 45, 39, 62, 2,191,122, 6, 16, 2, 15, 59, 26,185, 57, 89,184,125,251, 54,178,179,179,175,148,165,201, 48,204, 23, +195,135, 15,231, 0, 24,249,229,151, 95,218, 1,104, 56,123,246,236, 11, 40,209,179,144,203,229,174,223,187,119,111, 61, 83, 21, +227,156, 57,115,214, 1,248,233,239,186,150,236,237,237,191, 56,117,234,148, 92,167,211, 97,227,198,141, 88,183,110,221, 78,188, +153,168,242,212,230,205,155,183,208, 52, 61,121,202,148, 41,152, 48, 97,130,164,105,211,166, 51, 19, 19, 19,127, 45, 77, 51, 62, + 62,126,126,147, 38, 77, 22,166,164,164,124,107,150, 89,126,241, 98,124,147, 38, 77,230,167,164,164,172, 42,239, 28, 73,165, 82, +169,209,104, 68,100,100,100, 38, 80,102,251, 14,117,100,100,100,188,209,104,116,151, 72, 36,118, 21, 93,159,153,153,153,223, 54, +109,218,116,113,114,114,242,121, 0,203, 74, 49,228,161,137,137,137, 1,211,167, 79,159,186,114,229,202,254, 73, 73, 73, 7, 42, +210,140,142,142,254,182, 99,199,142, 11,158, 63,127,190, 27,101, 87, 1,111, 94,178,100,137,110,239,222,189,147, 34, 35, 35, 87, + 84,160,121, 50, 45, 45,237,164, 5,231,183,172,245, 11, 53, 57, 28,206,236,149, 43, 87,210,219,182,109, 3, 33,100,141,209,104, + 44,171,156, 15,127,255,253,247, 61,173, 91,183, 30,117,248,240, 97, 81, 64, 64,192, 4,141, 70,179,191,162,235, 83,169, 84, 30, + 61,124,248,112,255,135, 15, 31,186,143, 26, 53, 74,228,237,237, 13,157, 78,135,196,196, 68,108,219,182, 77,253,248,241,227,184, +172,172,172,163,150, 60, 67, 12,218,156,161,183, 46, 29,219, 31,245,226,113,203, 14, 61,250,217,106,117,238, 16,166,115,144,149, +158,132,179, 39,143,102, 70, 70,190,186,173, 84,102, 13,181, 68, 83,167,201,254,248,246,229,227, 7,226, 34,195, 91,180,235,216, +211, 86,173,245,132,144, 79, 35, 61, 57, 30,103, 79, 29,203,136,140,124,125, 93,173,215,140,126, 87,207,121,142, 23,150,113,146, +130,198, 77,236,211, 8, 98, 91,247, 7, 60, 96, 99,107, 64,236,224,236,204, 47,184,119, 32,203,111,243,104,150,102, 50, 32,168, + 83, 80, 75,165, 84, 42,193, 3,180, 99, 0,158,163,163,163, 24, 0,158, 63,127, 14, 73,126,173,134, 69,229,204, 3,164,146, 34, +186, 52,160, 76,231,162, 90,109, 43, 41, 5, 0,113, 73,233,208,234,203,253,221,120,223,217, 81,196,112,237,168,140, 0, 31, 64, + 23,153, 76,182,124,225,194,133,107,238,222,189,187,166,119,239,222,107,132, 66,225,242,130,131,205, 47,231, 68,252,109,154,205, +220, 96,215,177, 22,117,173, 91,109,138,153,216,214,214, 56, 58, 80,170,237,212,169,211,150, 42,150,179, 42, 55,203, 95,169,121, + 76,175,215, 19,228, 87,219, 29, 67,217, 85,130,243,138, 44, 79,138,137,137, 33, 5,127, 91, 82, 78,135, 33, 67,134, 48,185,185, +185,100,240,224,193, 4, 21, 15,225, 83,174,166, 80, 40,236,216,174, 93, 59,125,114,106, 6,121,246, 58,158,220, 9,126, 74,206, + 93,186, 69, 14, 28, 61, 69, 54,109,217, 78, 26, 52,104,160, 5,224,105,137, 38,151,203,237,212,177, 99,199,244,228,228,100, 18, + 30, 30, 78,174, 93,187, 70,142, 28, 57, 66,182,111,223, 78,126,248,225, 7, 82,189,122,245,100, 0,206,150,104,138,197,226,126, + 31,124,240,129, 62, 43, 71, 73, 34,227,211,201,163,240, 72,114,243,222, 35,114,246,210, 77,242,235,254,195,196,223,223, 95,109, +134, 38,135,195,225,108, 58,112,224, 64, 14, 33,132,244,235,215, 47, 14,197, 19,169,214,252,226,139, 47, 82, 8, 33,100,213,170, + 85,233, 40,189, 33,252, 95,125, 45,245,168, 86,173,218, 51, 62,159,127, 10,192,200, 10,182,251,152,203,229,158,112,113,113,185, + 15,224,163,119,112, 31,245,118,114,114,186, 3,160,162, 17, 14, 76,235,125,248, 47,185,223,255, 10,205, 78, 92, 46,247, 26, 80, +254, 32,194, 69,158,215,223,112, 56,156,211, 0, 58, 91, 88,206,186, 14, 14, 14,131,109,109,109, 63,183,181,181,253,220,201,201, +105,176, 64, 32,168, 91,149,125,183,175,219,165,143, 71,227,190,191, 87,111,216, 43,218,163, 81,239,104,175, 38,253,126,183,175, +219,165, 79, 85, 53, 61,155,244, 59,230,209,168,119,140, 71,163, 62, 81, 53,155,245,251,221,193,167,203, 7,239,242, 28,141,172, + 6,183,174, 53, 97, 32,215, 22, 16,114,109, 1,233, 82, 19, 76, 75, 27,248, 55, 7,228,221,187,116, 89, 75,140,198,181,253, 63, +252,112,109, 29,192,158, 0,156,146, 83,105,154,141, 1,171,194,109,251,245, 91, 91, 11,112,232, 10, 72,218,183,109,187,134, 24, +141,107,135,127,252,241, 90, 15,192,165, 52,189,178, 52, 9,192,169, 6,184, 21,213,117, 0,106, 15,244, 66,192,188, 62, 94,132, + 92, 91, 64,150, 12,242, 38, 77,156, 49,178, 2,205,178, 34, 69,239,109, 68,171,180,182,226, 21, 33, 45,120,184,174, 40,248,148, +190,133,139,240,173,107,182,112,133,119,151,218, 84,120, 79, 31,110, 6,242,187, 36, 75,255,133, 15,201,221, 90,173,150,168,213, +106,162, 84, 42, 73, 94, 94, 94, 73, 3, 85,104,200, 18, 18, 18, 72, 92, 92, 28,137,137,137, 33, 81, 81, 81, 4,127,182,189, 49, +187,156, 86, 86, 86, 63, 13, 26, 52,200,200,227,241, 54,189,141,125,183,179,179, 91, 17, 24, 24,168,251,254,251,239,201,239,191, +255, 78,126,252,241, 71, 50,101,202, 20, 82,175, 94, 61,141,141,141,205,208,202,104,186,184,184,204,247,241,241, 73,223,185,115, + 39,249,245,215, 95,201,134, 13, 27,200,215, 95,127,109,116,119,119, 79,146,203,229,221, 43,163,233,228,228,180,163, 77,155, 54, +186, 29, 59,118,144, 11, 23, 46,144,125,251,246,145, 47,190,248,130,248,250,250,106,164, 82,233, 0, 51, 53, 57, 92, 46,119,237, +196,137, 19,147,220,220,220, 78,149, 88, 38,241,247,247,191, 63,124,248,240, 4, 0,115,254, 69,215, 39,171,201,106,178,154,127, +129,209, 26,230,134,106, 4,224, 72,248,252,143,219,183,109,187,134, 15,124,108,169, 41, 18,113, 56, 3, 91, 7, 6,174,225, 3, + 67, 77,235,138, 56,156,129,237,219,182, 93,195,227,112, 70,148,165, 87,158, 38, 1, 56,124, 46,119, 78,235,150, 45,215,114,129, +175, 76,243, 58,213,164,194,190,232, 81,157,180,245,164, 94,142,112,130,228, 95,108,180, 74,165, 50, 70,171, 48,128,240, 23, 92, +132,239,139,230, 63,229,166,174, 83, 96,152,142, 89, 16,209, 58,134,252, 81,212,235, 84,178,156,226,183,188,239,245, 29, 28, 28, +206,212,169, 83, 39,181, 70,141, 26, 9,182,182,182,251, 1,184, 87, 81, 51,192,197,197,229, 23,103,103,231, 23,174,174,174, 15, + 29, 28, 28,214, 35, 63,235,124,165, 53,121, 60, 94,160,179,179,243, 21, 47, 47,175, 44, 79, 79,207,100, 7, 7,135, 3,165, 68, +178,204,209,116, 69,233, 15, 21,126,193, 50,246, 71,135,213,100, 53, 89,205, 98, 6,166, 91, 45,172,236, 90, 19,134,174, 53, 97, +236,230,133,245, 69, 13, 74,111, 64, 92, 89, 83, 52, 26, 16,150, 92,191, 34,189,138, 52, 9,192,105, 5,200, 74,110,211,211, 29, +254,102,106,190,239, 17, 45,211,115,190, 88, 68,139, 91, 73, 65,195, 95, 80,200,247, 69,243,159,194, 75,148,211, 24,185, 8, 43, +222,226,119,170,222,242, 62, 60, 74, 75, 75,251, 32, 45,237,173,246, 77,120,146,148,148, 52,242,109, 10,234,245,250,187,201,201, +201, 29,222,130, 84, 89, 93,175,117, 48,179, 91, 54, 11, 11,203,127, 7, 10, 48,226, 21,230,118,169,139,141, 92, 35,232,179,175, + 17, 95,162, 75,158,138,170,140,102, 62,198,221,165, 60,227,169,202,150,243, 79,242,222,208,136,195, 83,234,191,115,218, 18,145, +223, 70,203,252, 60, 90, 44, 44, 44, 44, 44, 44, 44,239,142,139, 47,216, 23,177,247,128, 83, 40, 30,125, 59, 85,196,136,150, 25, +250,180,164, 39, 69,101,194,167, 23, 89, 77, 86,147,213,100, 53, 89, 77, 86,147,213,252,207,105,154, 40,107,236,212,103, 37,254, +175, 84, 47,190,127, 2, 85,105,163,245, 87, 26, 48, 86,147,213,100, 53, 89, 77, 86,147,213,100, 53,255,123,154,239, 51,101,246, + 58,100,171, 14, 89, 88, 88, 88, 88, 88, 88, 88,170, 70,153, 81, 55,214,104,177,176,176,176,176,176,176,176, 84, 13, 87,228, 15, + 81,117, 10,127, 14, 85,181,131, 53, 90, 44, 44, 44, 44, 44, 44, 44, 44, 85,167, 23,254,236,109, 88, 44,186, 69,179,199,134,133, +133,133,133,133,133,133,165,202,140, 47,242,201,166,119, 96, 97, 97, 97, 97, 97, 97, 97,121, 75,152,215, 51,242,228,201,147,132, + 61, 86, 44, 44, 44, 44, 44, 44, 44,239,138,247,212,139,152,162, 88,197, 70,249, 96,123, 29,178,176,176,176,176,176,176,176, 84, +157, 29, 69, 12, 87,177,121,172,209, 98, 97, 97, 97, 97, 97, 97, 97,169, 26, 38,131,117, 10, 37,134, 84,163, 1,182,202,144,133, +133,133,133,133,133,229,221,242,158,123,145, 29, 5,211, 27,195, 37,153,122, 29,118, 40,216,193, 14,236,169,102, 97, 97, 97, 97, + 97, 97,121, 7,188,207, 94,196, 21,165,180,209, 98, 97, 97, 97, 97, 97, 97, 97, 97,169, 58,227, 75,124, 2,200,111, 12, 79,177, +199,134,133,133,133,133,133,133,133,229,173, 24,173,162,236,248, 59, 6,149,102, 97, 97, 97, 97, 97, 97, 97,249, 79, 66, 8,249, +203, 51,195,179, 35,155,179,154,172, 38,171,201,106,178,154,172, 38,171,249, 95, 96, 60, 74,100,133, 7,216,244, 14, 44, 44, 44, + 44, 44, 44, 44, 44,111,195,100,237, 40,237,127,118,172, 67, 22, 22, 22, 22, 22, 22, 22,150,191, 8, 54,162,197,194,194,194,194, +194,194,194, 82, 53,118,160,148,172,240,172,209, 98, 97, 97, 97, 97, 97, 97, 97,121,123,102,235, 13,216,170, 67, 22, 22, 22, 22, + 22, 22, 22,150,170, 49,190,172,255, 41,148,221,115,224,162, 5, 95, 80,153,222, 7, 23, 89, 77, 86,147,213,100, 53, 89, 77, 86, +147,213,252,207,105, 86,164,125, 17,239, 31,165, 54,134,255, 59,242,104,177, 93, 95, 89, 77, 86,147,213,100, 53, 89, 77, 86,147, +213,252,183, 99, 26,130,199, 52,185, 2,249,121,180,216, 54, 90, 44, 44,239, 57,228, 48, 56,200,244,241, 2, 33,110,224, 8, 18, +145,248,232, 21,181, 24, 76,149, 53,147,253, 61, 33,214, 59,195, 32, 74, 69,242,195,215, 85,213,100, 97, 97, 97,249, 23,147,136, + 50,218,104,177, 70,139,133,229,125, 39,213,215, 27, 92,172, 0, 13, 87, 16, 93, 4, 28,253, 87, 0, 79, 31, 87, 89,147,207, 44, +131,145,118, 7,209, 61,135,147,207, 74,224,217, 83,246, 96,179,176,176,176, 88,198,223,222, 24,158,199,227, 37, 3, 96, 68, 34, +209, 81,176,163, 92,179,252,181,184, 22, 92,103, 76,193,117,103, 9, 50, 46,151,187, 80, 34,145, 92, 22, 10,133, 41, 66,161, 48, + 69, 42,149, 94,230,114,185, 11, 1,200,254, 41, 59, 72,126,169, 39, 1,109,252, 64,171,103,170,157,125,148,229,164,212, 24,189, + 65, 27,122,146,157,117,101, 85,210,228, 82,221,212, 58,198,227,215,123, 74,103,133,214,224, 7,130, 42,105, 22,193,134,207,231, +159, 5,224,192, 94,158,255, 78,252,128,166, 77,185,220, 89,190, 64, 39,128, 29, 79,151,133,229,111, 55, 90,122,189,222, 41, 45, + 45,141,218,179,103, 79, 95,107,107,235, 8, 46,151, 59, 15, 0,255,191,114,192,101, 50,217, 45, 43, 43,171,100,107,107,235,100, + 43, 43,171,144,138,230,255, 75,241,118,116,116,140,182,179,179,123, 94,116,166, 99,131,143, 90,213,105, 61,114,145,189,127,191, +246, 85,212,231,115,185,220,121,214,214,214, 17,123,246,236,233, 27, 31, 31, 79,233,245,122, 39, 11,182,111,103,107,107, 27,118, +247,238,221, 5,105,105,105,237, 99,239,236,116, 76,186,187,221, 49,250,202,218, 14, 65,167, 55, 45,176,177,177,126, 10,160,221, + 63,226, 72,170, 25,103,208,156,142, 79, 18,149,146,196, 28,189,115,112,148, 82, 14,112, 58, 64, 91,133,151,152,108,198, 25, 32, +157, 66,227, 84,210, 91, 25,142,206,215, 95,105,172, 64,211, 29,161,166, 92,170,252,192,161,233, 73, 12,195,116,229,243,249,159, +179,143,223,127, 39, 2,154,110,125,171,111,223,101,115, 26, 52,152,234, 11,244, 41,195,108, 81, 0,166,249,250,250,158, 1,240, +241, 91,252,250,239,124,124,124,226, 1, 76,103,207, 4,203,223, 76, 99,211, 11, 62,138,180,209,178,200,104, 13,244, 66,235,161, + 53,113,117,176, 23,114,135,212, 68,222,136,154,184, 49,192, 11,157, 42, 83, 26,123,123,123,180,107,215,142, 19, 31, 31, 47,254, +226,139, 47, 22,137, 68,162, 72, 0,221, 43,163, 37, 22,139,131, 36, 18, 73, 44,151,203, 45, 86, 22,137, 68, 18, 36,149, 74, 99, +185, 92,110,231,162,243,229,114,249, 45, 43, 43,171,100,185, 92, 30, 82,134, 17, 10,178,178,178, 74,150,201,100, 65, 69,231,115, +185,220,206, 50,153, 44, 78, 46,151,151,156,223, 73, 46,151,199,150,156, 95, 22, 60, 30,207, 61, 54, 54,214, 41, 46, 46,206, 73, + 32, 16, 56, 23,157, 31, 19, 19,227, 20, 27, 27, 91,108,190, 37,112,185,220, 78, 82,169, 52, 86, 34,145, 4,149, 54,191,228, 62, +149, 69,145, 99,215,201,156,249,150,154,172,110,221,186,221, 72, 76, 76,244,176,177,177,177, 41,186,192,206,218,166,251, 47, 59, +183,204,236,215,179,219, 36, 71,191, 15,235, 87, 82,191,187, 72, 36,138,252,226,139, 47, 22,197,199,199,139, 91,182,108,201,161, +105,139,222, 39,186,244,235,215,239, 88,114,114,114,181,134, 13, 27,114, 12, 6, 3,158, 28, 95, 8,201,195,207, 33,138,220,134, +234,226, 84,110,196,133,149,238,221, 58, 52, 61,134,119,220, 24,148, 28,246,227,131, 98,218, 49,132, 56,134,197,171, 29,123,245, + 29,196,125, 16,171,114,212, 27,141,118, 0,167, 3,217,229, 41,172,148, 38, 87,223,150, 33,196,249,143, 40,158, 99,199,193, 83, + 57,151,162,184,142,122,163,209, 30, 52,218, 87, 70,179,232,229,207,225,112,102,174, 93,187,150, 6, 48, 5,128,224,191,244, 20, +110,238,134,106,157,106,115,238, 53,118, 69,235,183, 40, 27, 80,112,191,123,255, 83,246, 83,203, 48,207, 14,188,126,125,110, 68, +237,218,189,231, 52,104, 48,166, 20,179, 69, 1,152,179,114,229,202,145, 79,158, 60,113,172, 89,179,230,132,183,244,210,191, 97, +229,202,149,179,159, 60,121,226,230,229,229,181, 4,108,250,162,127, 21,132, 16, 1, 33,164, 35, 33,164, 23, 33,164, 51, 33,164, +121,193,223,205, 10,166, 94,132,144, 46, 37, 62,155, 21,108,107, 90, 30, 88,134, 70,175,146,219, 21,217,166,228,255,197,254, 46, +197,104,245, 66,126, 91,173, 94,197,118,224,228,201,147,164,232,103, 73,134,120, 97,241,212, 86,213,148, 97, 39,246,145,188,216, +215, 36, 51,252, 1,121,176,227, 91, 50,181,153,163,114, 88, 77,124,103,249,241, 34,228,230,205,155,228,201,147, 39, 36, 47, 47, +143,188,120,241,130, 4, 6, 6,170, 36, 18,201, 31, 0,188, 44, 17,147,203,229,201,127,252,241, 7,233,214,173, 91,182, 76, 38, + 91, 99,186,185,172,172,172,146,111,222,188, 73,186,117,235,150, 45,151,203, 55, 0,224, 0,192,128, 1, 3, 82, 8, 33,196,209, +209, 49,161, 52,189,126,253,250,101, 18, 66,136,181,181,181,169,170,137, 35,151,203, 55, 76,158, 60, 57,239,254,253,251,196,214, +214,214, 52,159,182,178,178, 90, 51,101,202,148,188,224,224,224,162,243,203,197,206,206, 46,214,104, 52,146, 19, 39, 78, 16, 39, + 39,167,194, 50,216,218,218,198, 26,141, 70,114,236,216,177, 50,203, 86, 94,160, 64, 38,147,173, 30, 49, 98, 68,110, 84, 84, 20, +177,183,183, 79, 46, 50,127,205,168, 81,163,114, 99, 98, 98,136,131,131,131, 89,101,180,183,183, 79,190,117,235, 22,233,223,191, +127, 78,209, 99,106,111,111,159,124,251,246,109,211,252,213,230, 60,200,220,220,220, 38, 56, 57, 57, 37, 56, 57, 57, 37,216,216, +216, 44,119,117,117, 77, 74, 77, 77, 37,132, 16, 82,171, 86,173,148,162,145, 44,167,128,190, 51,182, 29,190,125,247,218,227,244, +212, 6, 93, 39,173,182,110,208,207,218,130, 99,224, 37,145, 72,254,104,223,190,189, 42, 54, 54,150, 40, 20, 10,242,240,225, 67, +114,243,230, 77,242,242,229, 75, 2,192,156, 62,182,114,153, 76, 22,175,209,104, 24,141, 70,195,164,166,166, 26, 83, 82, 82,140, +225,107, 92, 9,249,153, 87, 56,101, 29,235, 67,146,174,173, 96,172,100,146, 56, 0,242,119,246,224,217,226,239, 78,182,251, 28, +120,186,208, 35,252,218,202, 30,122, 18,117,137,236, 27,227,168,191, 58,163, 90, 4,249,193,247,127,100,187, 95,245, 74,105,254, +224,183,239,225,215, 30,207, 54, 45,153,166,143,142,142, 38,179, 70,245, 48,156,159, 90,237, 21,217,230,123,184, 50,154, 69, 24, +250,209, 71, 31,229,197,196,196, 16,127,127,127, 5,135,195, 25,251, 95, 50, 89, 93,188, 5,241, 15,127,157,197,244, 9,144,164, +191, 37,179, 21,224,228,228,148,182,123,247,110, 34,151,203, 83,254, 65,102,139,242, 5,250,238,105,208,224, 24, 51,112,160,113, + 79,131, 6,199,124,129,190, 5, 6,139, 2, 48,119,213,170, 85,193,122,189, 62,120,215,174, 93,193,125,251,246, 13, 6, 48,171, +138,223,249,253,119,223,125, 71,244,122, 61,217,181,107, 23,233,219,183, 47, 1,176,209,220,141,101, 50, 89,157,250,245,235,239, +245,247,247,143,105,216,176,161,214,207,207, 79,237,237,237, 29, 21, 16, 16,176, 91, 40, 20,122,129,229,111,161, 60, 47, 66, 8, +105, 62,119,238,220,121, 0,200,220,185,115,231, 17, 66,122, 21,248,137, 94, 69,255, 46,249,105, 50, 79,166,255, 75,211, 48, 77, +165,105,150,246, 29, 37,190, 7,101, 68,178,198, 23,148,251,207,157, 59,121,242,100,251,147, 39, 79, 94, 45,185,115,131,106,162, +213,212, 86,213, 84,170,212, 68,242,248,219,207,201,229,142,238,228,102, 7, 23,242,124,230, 71, 36,241,215, 13,228,179, 70,182, +202,129, 53,209,209, 82,163, 21, 28, 28, 76,130,131,131, 73, 72, 72, 8,137,140,140, 36,217,217,217,228,224,193,131, 70,123,123, +123,149, 80, 40, 92, 9, 64,108,142,152,149,149, 85, 50, 33,132,104, 52, 26,178,124,249,114,117, 65,164,202,217,218,218, 58,153, + 16, 66,178,178,178,200,202,149, 43,213,214,214,214, 15, 1,184, 57, 56, 56,196,190,126,253,154, 56, 59, 59,151,106,102,108,109, +109,147,159, 61,123,102, 50, 78,213,108,109,109, 31, 31, 63,126, 92, 71, 8, 33,113,113,113,196,206,206, 46, 25,128,179,189,189, +253,131,147, 39, 79,234, 8, 33, 36, 33, 33,193, 52,223, 44,163,165, 82,169,200,249,243,231,139,149,193, 52,255,204,153, 51,197, + 12,152, 25, 56, 91, 91, 91, 7, 31, 60,120, 80,107, 52, 26,201,227,199,143, 77, 38,209,217,198,198, 38,228,240,225,195, 90,163, +209, 72,194,195,195,205, 54,131, 53,106,212, 72, 33,132, 16,131,193, 64,182,109,219,166, 49, 29, 83,211,124,173, 86, 75,182,110, +221,170,177,178,178, 10, 6, 80,110,244,205,193,193, 33, 65,171,213,146,172,172, 44, 18, 24, 24,152,119,243,230, 77,146,147,147, + 67, 8, 33,164, 70,141, 26, 41, 0,224,211,126,236, 55,119, 95,228,229,124, 50,123,203, 33,175,230,195,190, 61,119, 47, 62,238, +167,223,131,130, 29, 2,250,245, 48, 39,168, 41, 20, 10, 87,186,186,186,170,175, 95,191,110,212,233,116, 36, 38, 38,134,132,132, +132, 20, 94, 99,143, 30, 61, 50,203,104,113,185,220,133,119,239,222,213, 25,141, 70, 38, 45, 45,205,152,146,146, 98, 76, 73, 73, + 49,148, 52, 90,228,103, 30, 73, 59, 51,142,156,218, 49, 93,203,231,243, 23,190,155,104, 22, 56,100,187, 79, 63,178,221, 39,120, +247, 8,135,180,220,144,253,132, 92,152, 78, 94,125, 83,147, 44,236, 33,207,101,182,251, 4,147,237,190, 3,201,226,246, 92,139, + 52,119,248,245, 33,219,125,130,191, 27,228,153,254, 32,248, 62,185,122,245, 42,217,186, 97, 21,153,218,165,154,130,217,238, 19, + 76,126,240,235,111,137,102, 81,132, 66,225,139, 27, 55,110,144,107,215,174,145, 37, 75,150, 16,137, 68, 18,243, 54,162,122,228, + 7,111, 79,242,163,119,123,178,179,174, 43,185,210,254, 31,215,193,167,185, 27,170,117,245, 22,196,165, 61,248,157,144,140,151, + 36,105,141, 63,233,225,195,171,170,217, 10,112,114,114, 74,141,138,138, 34, 73, 73, 73,100,221,186,117,196,202,202,234, 31,109, +182,124,128,126, 0,230,173, 94,189,186,208,100,109,217,178, 37,248,209,163, 71,193, 30, 30, 30,167,171,240, 93, 27, 87,175, 94, + 93,104,178,182,108,217, 66, 30, 61,122, 68, 60, 61, 61, 99, 43,218,112,196,136, 17,146, 86,173, 90, 5, 15, 31, 62, 92,185,123, +247,110, 18, 21, 21, 69, 30, 62,124, 72, 86,175, 94, 77, 22, 45, 90, 68,126,254,249,103,210,191,127,127, 69, 96, 96,224,221,129, + 3, 7,138, 44,140, 40,112, 11,162, 48, 2, 66, 8,143, 16, 98, 50,154, 92, 0, 60,211,203, 63, 75,113,163, 85,150, 23, 41,203, + 76,149,101,176, 74, 46, 43,199,136,149,107,216,204,248,190, 66, 83, 85,198,117, 80, 44, 34,113,165,119,239,222,237,223,248,241, + 33, 88, 58,254,139,111, 68,145,187,215, 33,249,224,102,112,178,146,193,203, 77,135,230,198, 41,232,111, 28,199,200,150, 45,197, + 98,138, 90,102,233, 1, 21, 8, 4, 16, 8, 4,224,243,249, 80, 42,149, 72, 72, 72, 64,155, 54,109,232,144,144, 16,209,132, 9, + 19,166,139,197,226, 24, 0, 31, 86,120, 55, 83,249, 17,233, 91,183,110, 97,220,184,113,194,189,123,247, 54,116,116,116, 12, 53, + 26,141, 2, 0, 8, 15, 15,199,144, 33, 67,132,251,247,239,175,231,230,230, 22,162,211,233, 36, 66,161, 16, 28, 14,167, 76, 61, +129, 64, 0,189, 94, 47,172, 91,183,238,195,208,208,208,128,222,189,123,243,162,163,163,241,250,245,107,232,245,122,129,183,183, +247,163,144,144,144,134,189,122,245,226,197,198,198, 34, 58, 58,186,176, 28,230,148, 87,171,213, 66, 40, 20,162,104,149, 22, 69, + 81,208,104, 52, 16, 8, 4,102,107,113,185,220, 78,190,190,190,143, 66, 67, 67, 27,247,235,215,143,127,255,254,125,196,197,197, +193,104, 52, 10,252,252,252, 30,133,134,134, 54,234,219,183, 47,255,225,195,135, 72, 78, 78,134,185, 85,104,166,245, 66, 67, 67, + 49,124,248,112,193,217,179,103, 27,185,186,186, 62, 52, 24, 12, 2, 0,120,244,232, 17,134, 12, 25, 34, 56,119,238, 92,227,234, +213,171, 63,172,160, 42,145, 3, 0,122,189, 30, 19, 38, 76,144, 90, 89, 89, 33, 54, 54, 22, 12,195,192,104, 52, 2, 0,210, 51, +211, 31,133, 62,122, 28, 62,114,232,160,246, 42,157, 70,115,251, 94, 80, 88,173, 26,158,238, 20, 69,106, 84, 80,212, 15,165, 82, +105,204,154, 53,107,102, 68, 69, 69, 9,125,125,125,233, 87,175, 94, 33, 55, 55, 23,124, 62,191,240, 26, 51,119,191, 5, 2, 65, + 7,127,127,127,174, 90,173, 6,195, 48, 0, 64,104,154, 46,245,100,136,178,110,192,207,217,192, 19,139,197, 29,222,201, 19, 41, +199,223, 30, 12,186, 70,167,106,133, 66, 27,119,185,204,213, 27,136,185,134,154,142, 66,112,104,142,232,254,107,165, 20, 32, 93, +225,145,102,111,153, 38,211,245,117,138, 86,168,183,171, 39,115,115,247, 64,122,122, 58,170,215,242,133, 90,224, 40,184,245, 82, + 33, 3,101,161,230,159,180,173, 91,183,174, 75,157, 58,117,144,150,150,134,198,141, 27,195,214,214,214, 22, 64,215, 74,155,172, + 93,158, 66,228,160, 53, 64,175,129,145, 90, 2, 61,119, 5, 94,166, 54, 38,219, 27,243,254, 73, 38,203, 74, 38,184,179,255,192, +193,106,246, 30,126,192,169, 79,224,108, 35,196,206, 73,141,237, 28,173,133,199, 42,105,182, 2,156,157,157, 47,221,189,123,215, + 65, 36, 18, 33, 36, 36, 4,254,254,254, 88,183,110,157,163,173,173,237,181,127,136,217, 34,225,192,137,239, 30, 62,220,181, 55, + 34,226,228,136,218,181,123, 15,247,246, 94, 62,241,227,143,199, 78,155, 54, 13,171, 86,173,194,177, 99,199,208,186,117,107,140, + 31, 63, 94, 31, 19, 19,179,167,146,223,179,121,205,154, 53, 83,167, 79,159, 94, 82, 83, 23, 29, 29, 93,110,109,139,191,191,191, +251,139, 23, 47,226,103,206,156,217,120,239,222,189, 98,137, 68,130,172,172, 44,252,248,227,143,152, 55,111, 30, 40,138, 2, 33, + 4, 63,255,252,179,100,204,152, 49,205, 35, 34, 34,226, 61, 61, 61, 43,108,214, 65, 8,161, 8, 33, 34, 0,146,130, 73, 10, 64, +178,127,255,126,235,126,253,250, 89, 21,204, 19, 23, 76, 66,176,148,164, 84, 47, 82,228,183,242,100,137,227,221,187,228,188,146, +203, 8, 33,189,203,211,176,208, 64,151,246,125,167,202, 51, 91, 69,127,129, 58,148,234, 34,129, 6, 46, 94, 62,200,190,112, 24, + 98, 46, 5, 49,167, 96,226, 82,160, 95, 61, 66,117, 17, 15,122, 66, 2, 42,107,180, 76, 19,143,199,131, 82,169,132,209,104,196, +188,121,243,132,231,207,159,183,167,105,250,127, 21,233, 20, 53, 76,207,159, 63,135,159,159, 31,117,226,196, 9,231, 41, 83,166, +136, 77,223,147,157,157,141, 58,117,234, 80,103,206,156,113,250,250,235,175,101,229,153, 25,138,162,192,231,243, 49,125,250,116, +241,189,123,247,236,220,220,220,240,234,213, 43,100,100,100, 64, 38,147, 97,250,244,233,226,187,119,239, 58,186,185,185, 33, 42, + 42, 10,217,217,217,144,201,100, 22, 27, 45, 62,159, 95,108, 27,138,162,160,211,233, 44, 50, 6,214,214,214,251,130,131,131, 29, +173,173,173,241,240,225, 67, 24, 12, 6, 88, 91, 91, 99,234,212,169,226,224,224, 96, 71, 27, 27, 27,132,135,135,131, 16, 2, 43, + 43, 43,139,202, 8, 0, 12,195, 32, 60, 60, 28, 53,106,212,192,181,107,215,156, 38, 78,156, 40, 50,205,127,249,242, 37,220,221, +221,113,237,218, 53, 39,169, 84,186,175, 44, 45,134, 97,144,152,152,136, 39, 79,158,224,213,171, 87, 72, 77, 77, 69, 90, 90, 26, +114,115,115, 97, 48, 24, 0, 0,146,220,156, 83,251, 15,157, 8, 21,139,197, 18,127,239,186, 30,143, 30, 63, 77, 17,139,197, 18, + 79, 15, 15,111, 96, 49, 93,142, 33,252, 95,116,116,180,253,152, 49, 99,248, 73, 73, 73,200,204,204, 4,151,203,125,227,218, 18, + 8,204,107, 10,100, 48, 24,252, 68, 34, 17,165,211,233, 10, 35, 96, 2,129, 0, 51,246, 41,225,191, 16,197,166,143, 55,164,128, + 24,245,208,106,181,126,127,251, 47, 24, 64,129,210,214, 5, 69, 53,190,243, 74, 97,215,182,247, 80, 62, 94,159, 5, 24, 61, 64, +115,209,161,129, 59,247,216, 35,133, 51, 8, 26, 64, 3, 95, 66, 42,238,249, 69, 0, 10,208,213, 1,168,166,231, 95, 24,236, 91, +127, 52,137, 31, 31, 31, 15, 62,159, 15,161, 80,136,198,157, 6,112,247,135,234, 93, 64,161, 33,116,240, 49, 71,179, 88,216, 81, + 44, 94,176,104,209, 34,105, 81,205,177, 99,199, 74,173,173,173, 23, 85,218,100, 41, 36, 45, 97, 32,211,159,196, 43,107, 44, 63, +149,228, 23,145,162,242, 1, 33, 51, 1,125,163,183, 96,182, 58, 8,133,194,215, 0,218, 84,201,100,201, 5,183, 15, 28, 56, 88, +205,174,122,190,201,130, 65, 13,240,196,112,113,180,193,206, 25, 29,237, 28,109,196,150,154,173, 0,103,103,231, 63,238,220,185, +227, 32, 18,137, 16, 28, 28, 12, 62,159, 15,145, 72,132,250,245,235, 99,251,246,237,142,118,118,118,255, 40,179,181,242,225,195, +221, 43,158, 60,121, 62, 55, 32,192,247, 67,169,212,110,242,240,225,214, 95,127,253,245,201,227,199,143,239,234,213,171, 87,218, +189,123,247,214, 3, 56,108,105,196, 12,192,150,181,107,215, 78, 54, 25,183,175,191,254,250,231,227,199,143,175,232,213,171, 87, +226,189,123,247,102, 2,216, 82,158, 64, 94, 94,222,241,249,243,231, 91,127,244,209, 71,166,255,113,227,198, 13,236,217,179, 7, + 82,169,180,216,186,125,251,246,197,184,113,227,108,181, 90,109,185,191, 73, 78, 78, 78,157,239,220,185,227,143,252, 14, 94, 66, +147,209,122,252,248,177, 77, 78, 78,142,141, 76, 38,179,113,117,117,149,155,204,214, 71, 31,125,100,195,229,114,219,128, 5, 21, +121,145,162, 70,199,156,121,149, 93,223, 92,179, 85, 98, 86,153, 57,180,138, 25,173,222,189,123, 95, 69, 25, 61,169,116, 25,201, + 16,194, 8, 49,135,130,132, 83,196,108,129, 1, 55, 59, 5, 84, 37, 58,240,150,246, 99, 40, 16, 8,192,225,112,160,213,106,145, +158,158,110,145, 41,176,178,178,130, 76, 38,131, 74,165,130,193, 96,128, 72, 36, 50,153, 17, 88, 89, 89,129,199,227,129,199,227, + 65, 36, 18,189, 17, 77, 42, 25,205,225,243,249,144, 74,165, 72, 76, 76, 68,116,116, 52, 24,134,129, 76, 38,131, 84, 42,133, 64, + 32, 64, 66, 66, 2, 18, 18, 18, 64, 8,129, 84, 42,133, 84, 42,133, 37, 13,174,141, 70, 99,169, 63,254,122,189,222,162,136,150, +193, 96, 64, 88, 88, 24, 98, 98, 98, 32, 18,137, 10,247, 85, 40, 20,226,229,203,151, 72, 74, 74,130, 68, 34,129,149,149, 21,172, +173,173,205,214, 53,237,139, 92, 46,135, 88, 44, 70,102,102, 38,148, 74,101,225, 49,181,178,178,130, 84, 42, 69,118,118, 54, 82, + 82, 82,202,221,119,163,209,136,132,132, 4,164,166,166, 34, 54, 54, 22,105,105,105,133,102,171, 32,106, 84,181,192, 78, 78, 14, +210,211,211, 11, 35,145,101, 77,230,192, 48, 12,114,115,115,113,231,206, 29,138, 97, 24,100,101,101, 49,169, 73, 73,198,207, 18, + 4, 56,182,248, 7,114,240,236, 3,245,254,211,193,170,163,127, 60, 81,109, 57,250, 72, 37, 10, 92, 98,120, 39,143,161,173, 1, +214,208,243,186,165,229,233,133,169, 58,190,181,115, 64, 23,224,245, 25,128,230, 2, 34, 91,180,168, 87, 19,209,153, 70,233,179, +100,173, 8, 20,186, 99,139,183,173, 89,154, 70, 94,215,212, 92,189, 48, 74,231,104,229,215,160, 9,146,147,147, 33, 20, 10, 33, + 20, 10,209,180,117, 23,188, 78, 55, 74,158,198,171, 36, 32,232,102,150,230,159,212,146,201,100, 45,219,180,105, 67, 21,213,236, +217,179, 39, 40,138,170, 15,192,215,162,135,220,198, 90, 2,232, 36, 45,192, 37,211,159, 38, 42,221,142, 61, 86,123,247,249,112, +128,221,247, 23, 83,252,194,146, 52, 94, 32,250, 47, 64,116, 77,170, 96,182,218,203,229,242,147,155, 54,109,242, 18,137, 68,103, + 0,180,173,140,136, 76,204,217,182, 96,242,208,106,182, 38,147,165, 87, 2, 92, 49,192, 19, 3, 92, 49, 92,156, 28,176,108, 92, + 87, 59,137,136,119,212, 2,195,186,127,203,150, 45,142, 37, 77,150,105,106,220,184, 49, 22, 46, 92,232,104,103,103,183,239, 29, +255, 88,118,179,182,182,222,219,165, 75,151, 59, 9,114,249,184,196, 38, 77, 4,127, 88, 91,103,119,206,206,182,246,124,252, 88, +231, 3, 60, 2,176, 53, 46, 46,174,135, 5, 38,235, 99, 43, 43,171,224,206,157, 59,235,228,114,121,204,186,117,235, 62,155, 50, +101, 10, 86,173, 90,133,249,243,231,255, 8,224, 83, 0, 95,197,197,197,185, 85,100,178, 0, 32, 41, 41,105,216,156, 57,115,210, +210,210,210, 0, 0,245,235,215, 71, 86, 86, 22,102,205,154,133,207, 63,255, 28, 0,208,168, 81, 35, 16, 66,144,156,156,140, 53, +107,214, 36, 39, 37, 37,141,174,224,217, 30,123,248,240,225,230, 58,157,206, 29,249,213,131,194,172,172, 44,171,140,140, 12,185, + 78,167,147, 50, 12, 35,181,177,177,145, 1,144,140, 28, 57,146,251,244,233, 83, 63,131,193, 16,207,122,171, 63, 41,207,139, 84, + 6,138,162, 78, 85, 37,114, 85, 90, 68,172, 12,202,143,104,245,238,221,155, 42,250, 89, 44, 98, 68,225, 97, 76,208, 53,216, 5, + 52, 41, 22,205,146,112, 40,136,173,172,241, 58, 54, 26,124, 80, 79,222,150,209,202,204,204,196,103,159,125,166, 26, 54,108, 88, + 58,195, 48, 3,204, 53, 5,214,214,214,176,182,182,198,211,167, 79, 73,255,254,253,147,215,173, 91,167, 42,106,180,158, 63,127, + 78,186,117,235,150,178,104,209,162,188,242,140,150, 41,162,181,114,229, 74, 85,135, 14, 29, 82,159, 60,121, 66, 76,102, 74, 38, +147, 97,205,154, 53,170,142, 29, 59, 38,223,191,127,159,152,230, 89, 18,209,162,105,186,208,104, 21,221,134,166,105, 48, 12, 99, +145,209, 82, 40, 20,195,122,245,234,149, 28, 30, 30, 78, 76,251,105,109,109,141,117,235,214,169,186,118,237,154,252,228,201, 19, + 98,154,103,101,101,101,182, 25, 52,125,191, 92, 46,135,149,149, 21,158, 62,125, 74,186,117,235,150,188,113,227, 70,117,209,249, + 97, 97, 97,164,111,223,190,201,185,185,185,195,202, 51, 47,166,234, 60,131,193, 0,181, 90,141,180,180, 52,196,198,198, 22, 86, + 29,170,164, 86, 61,134, 14,238,211, 80,165, 82, 41,159, 62,127, 17, 83,191,158,191,147, 74,165, 82, 70,199,196, 60, 7, 22, 51, +229,104, 15, 8, 8, 8, 72,255,236,179,207, 84,153,153,153, 85, 54, 90, 2,129, 32,156,203,229,146,182,109,219, 18,173, 86, 75, + 98, 99, 99,245,105,153,153, 6,223,111,191, 37, 79,102,204,160,196, 65, 65, 66,153, 76, 70, 21,104,210,175, 94,189, 98,196, 98, +113,248,223,254, 36,162, 25, 23, 80,164,205,245, 23,121, 54, 93,251, 12, 17, 80, 73,247, 0, 93, 30, 32,180, 5,132,182,224, 74, +237,241, 65,219, 70,156,221,119,114, 92, 64,152, 86,224, 11,221, 43,212,228, 17,103,128,105,123,225,185,218,182,205,192,169,130, +140,140, 12,112, 56,156, 66, 83, 36,145, 74,209,249,195,145,244,207,247, 52, 46, 0,105, 13,138,227,110,193,189, 62,123,193,130, + 5,252,204,204, 76,208, 52,253,167,166, 68,130,137, 19, 39, 10,173,172,172,230,155,253,240, 59,236,199, 7, 79,216, 2, 32,159, + 63, 75, 82,187, 29,127,164,242,249, 98,229, 78,113, 64,163,230,152,208,193, 73,188,242, 84, 74, 64,104,172,170, 38, 96,156, 1, +131,182,105, 37,204, 86, 91,185, 92,126, 42, 40, 40, 72,210,179,103, 79,172, 89,179, 70, 42, 22,139,207, 84,230,193,175,200, 51, + 78, 89,186,241,151,228,135,235,187, 3, 58, 69,190,193, 42, 50,165,228, 49, 88,184,243, 82,182, 94, 79,134,154,171,169, 82,169, + 70,125,250,233,167,233, 71,143, 30,125,195,100,137, 68, 34, 68, 70, 70, 98,249,242,229, 25, 25, 25, 25,163,223,165,201,154, 50, +101,202,242,184,184, 56,159, 11, 23, 46,112, 83, 83, 83,157,214,254,244, 83,246,145,236,236,140, 21,143, 31, 63,251,170, 94,189, +186,115, 27, 52, 24, 93, 78,234,135, 82, 77,214,228,201,147,247,199,197,197, 53,190,120,241, 34, 47, 53, 53,213,125,242,228,201, + 88,189,122, 53,230,207,159,191, 29,192, 4,152,215,225,229,207, 0,130, 78,247, 44, 51, 51,179,119,247,238,221,179, 50, 51, 51, +209,160, 65, 3,244,233,211, 7, 46, 46, 46,112,115,115, 67,191,126,253,224,237,237,141,244,244,116, 12, 29, 58, 52, 35, 53, 53, +181, 59,128, 87,229,105,166,167,167, 71,236,219,183,239,249,212,169, 83, 27,199,197,197,249, 1,176,207,205,205,149,230,230,230, + 10,181, 90,173,216,214,214,214,182, 81,163, 70, 14,227,199,143,151, 61,120,240,192, 47, 46, 46, 46, 15, 64, 52,107,175, 10, 77, + 86,153, 94, 4, 64,106,129,225,209,150,248, 76,173, 96,153,185,219,150,250,183, 25,235,149, 52, 91, 69,167, 55,170, 14, 75,191, + 24,129,133,123, 14,239, 86, 11, 60,234,192,218,167, 33, 36, 34, 17,196, 2, 1,196,182,246,208, 48, 12,126,138, 76, 82, 42, 8, +153,111,233, 1, 45,249, 67, 72, 81, 20, 54,111,222,108,104,217,178,165,250,210,165, 75,155, 84, 42,149, 7,128,223, 45, 49, 5, + 27, 55,110, 84, 78,159, 62, 61, 52, 37, 37,165,161, 72, 36,210,154,230,111,218,180, 73, 57,114,228,200,199,113,113,113,141, 37, + 18,137,178,172,246, 89, 69,141,150, 80, 40,212,164,164,164, 52, 31, 59,118,108,248,214,173, 91, 21, 18,137, 4, 82,169, 20, 66, +161, 80,155,146,146,210,240,179,207, 62, 11, 93,189,122,181, 82, 44, 22, 67, 42,149, 90, 84, 45, 71, 8,121,195, 80, 21,157,111, + 46, 6,131,225, 82, 74, 74, 74,195,233,211,167, 63,248,254,251,239, 21, 38, 3, 84,180,140,107,215,174, 85,202,100, 50,139, 34, + 90,166,245,164, 82, 41, 54,108,216,160,156, 58,117,106,104, 74, 74, 74, 67,161, 80,168, 45, 50, 95, 49,101,202,148, 7, 41, 41, + 41, 13, 13, 6,195,165,114,222,240,140, 57, 57, 57,224,114,185,120,252,248,177,134,207,231,131,166,105,188,124,249,178,208,104, +217,217,217,249, 55,172, 95,207,247,151,253,135,175,138,249, 66, 97,203,230, 77,253, 94, 69, 69,199, 17, 66, 69, 85, 80,212,223, + 85, 42,149,199,165, 75,151, 54,181,108,217, 82,189,121,243,102, 67, 89,145, 45,115,208,104, 52, 87, 67, 66, 66,244, 34,145,136, + 74, 76, 76, 52,112, 56, 28, 24,141, 70,162,105,222, 92, 83,255,251,239,201,211,185,115, 41, 43,169,148,203,231,243, 33,145, 72, +168,179,103,207,106,149, 74,229,213,191,223,104, 65, 2, 10,226, 23, 41, 26,185,136, 54, 80,120,254,123,190,201, 18,217, 0, 34, + 91, 64,100,139,106,213,220,113, 47, 82, 41, 7, 13, 1,140,102,228, 16, 35, 68, 10, 10,146,199,201,144,243, 4, 98, 42, 41, 41, +169,208, 16,153, 38,175, 58,126, 8,137,206,147,129, 34, 66,112, 96, 73, 10,146,222,246,246,246,220,196,196,196, 55, 52,253,253, +253, 57,122,189,222,252,212, 46, 9, 70, 87,128,153,252, 60, 73,237,250, 91,168,194,103,198,138,159,197, 98, 99, 22, 16,180, 17, + 1,181,220, 48, 99, 96, 35,193,215,199, 83, 3,238, 71, 41,107,129, 67, 38,128,201,115,180,160,156,109,228,114,249,153,251,247, +239, 75,228,114, 57, 94,189,122,133,230,205,155, 99,199,142, 29, 18,137, 68,114, 26,128, 69,237,241,238, 38, 35, 58, 47,215,216, +114,246,225,152,164,135,137,134, 98, 38, 43, 85, 65,240,233,119,199,179, 50,115,212, 3,238,196,150,125,255,148,194,131,172,172, +172,110,243,231,207, 79, 79, 77, 77, 45,102,178,162,163,163, 77,134,160, 3,128, 39,239,234,199,210,218,218,122,248,138, 21, 43, +112,255,254,125,244,236,217, 19,215,174, 93, 67, 70, 70, 6, 14,156, 57,243, 98,223,139, 23, 95,153,218,108,149,145,250,161, 84, +172,172,172,190, 88,177, 98, 5,130,130,130, 10, 53,211,211,211,177, 98,197,138, 56, 0,147, 44, 53, 89, 38, 82, 82, 82,238, 61, +123,246,172,123,131, 6, 13,194, 54,109,218, 20,231,234,234,202,140, 31, 63, 30,159,126,250, 41, 28, 29, 29,141, 27, 54,108,136, +105,219,182,237,227,136,136,136, 46, 74,165,242,145, 57,239, 2,105,105,105,183,118,236,216,113,167, 83,167, 78,146, 81,163, 70, + 57, 30, 59,118,204, 94,169, 84,186, 9,133, 66, 39,173, 86, 43, 8, 11, 11,227, 28, 57,114,196,229,233,211,167,145,106,181,250, + 94,101,203,254, 95,131,162,168,251, 20, 69,157,162, 40,234, 98,137,207,251,229, 45,179, 96,219,178,254, 46,119,189, 18,197,220, + 81, 98, 50,159,225,181,176,120, 98, 61,185,242,214,136, 22, 36,105,124, 27,146, 60,196,143,220,104,111, 71,198,214,166, 20,163, + 42,153,222, 65,165, 82, 21, 78, 71,143, 30, 37, 46, 46, 46, 10,185, 92,110,113,122, 7, 23, 23,151,228,156,156, 28,210,172, 89, +179, 12, 71, 71,199,194, 84, 4,174,174,174,201, 10,133,130,180,104,209, 34,195,201,201,105, 3, 10, 26,101,187,187,187,199, 18, + 66,136,167,167,103, 66, 89,122, 6,131,129,184,184,184,152,122,232,241,236,236,236,126, 8, 12, 12,204, 72, 78, 78, 38,174,174, +174,133,169, 19, 28, 29, 29,215, 52,111,222,188,228,252,138,202, 27, 27, 23, 23, 71,226,226,226, 72,245,234,213, 19,138,206,143, +142,142, 38,209,209,209,196,221,221,221,226,244, 14,142,142,142,171, 75, 41, 75,165,202,232,225,225,145,172, 82,169, 72,171, 86, +173,138, 29, 83, 15, 15,143,100,181, 90,109,154,111, 86,122, 7,177, 88, 60, 65, 36, 18, 37,136, 68,162, 4,161, 80,184,188, 70, +141, 26, 41,135, 14, 29, 34, 27, 54,108, 48,117, 73,135,163,127,223,150,117, 90,141,254,202,209,191,223, 23, 85, 73,239, 32,151, +203,255,112,113,113, 81, 28, 61,122,180,216,245,165, 82,169,204, 78,239, 32, 22,139,227,242,242,242,152,228,228,100,253,205,155, + 55,149, 65, 65, 65,202,199,143, 31, 43, 35, 35, 35, 85,233, 41, 41,186,228,228,100, 85,118,118,182, 38, 52, 52, 84, 35,145,188, +155,244, 14,100,135,119, 29,242,131,239,241,136,165, 94, 79,167,183,147,168, 31, 45,107, 72,200,255, 62, 34,228,244,167,132, 92, +154, 77,238,109, 31, 79, 90,121, 9,141, 55,103, 85,127, 78,182,249,252,102, 78, 74, 6,178,163,126, 29,242,131,239,233, 23, 75, +188,158,142,106,235,166,254,105,235, 6,114,247,238, 93,242,248,241, 99,242,234,213, 43,114,250,247, 67,164, 85, 45, 73,190,230, + 15,190,199, 45, 76,243,208, 90, 40, 20,230,173, 91,183,142,220,185,115,167, 80,243,248,241,227, 68, 34,145, 40, 1,243,122, 45, + 19,128, 34, 63,248,127,104,216,234,115,253,235,174,178,220,244,147,179, 9,121,180,155,144, 29, 1,132,236, 10, 36,228, 80, 47, + 66, 78,140, 38,119, 54, 12, 36,173,189,248,122,178,205,231, 26,217,238,111,118, 99,123, 30,143,151,115,244,232, 81,146,144,144, + 64,174, 93,187, 70,130,130,130, 72,120,120, 56,137,137,137, 33,167, 78,157, 34, 60, 30, 79,141, 74, 12, 91, 22,232, 12,207, 46, +117,249,137,161, 43, 91, 19,114,108, 40, 73,221, 55,156,244,174, 39,207,104, 81,189, 74,249,232, 26,217,219,219,167,157, 58,117, +138, 68, 70, 70,146,171, 87,175, 18, 39, 39,167, 52, 0, 1,239,250, 7,177, 75,151, 46,119, 9, 33,193, 61,123,246, 12, 6,112, +182, 75,151, 46,193,175, 95,191, 14,110,222,188,249, 29,148,159,250,161, 76, 58,119,238,172, 35,132,144,158, 61,123, 18, 0, 9, + 93,186,116, 33,175, 95,191, 38,205,155, 55,215,190,165, 98,115, 0,140,230,241,120, 63,217,217,217, 93,182,181,181,189,196,225, +112,118, 0, 24,129,202,231,227,226, 0,112, 3,224, 15,160,105,193,228, 87, 48,143,237,113,248, 31,161, 48,189,131, 57, 12,244, + 66,235, 49,181,168,171,195,106, 34,119,104, 77,228,125, 82,155, 50, 39, 97,105,151,178,140, 22,195, 48,228,249,243,231,164, 99, +199,142, 10,169, 84, 26, 15,243, 19,150, 22,211,116,112,112, 8,114,114,114,122, 35,137,102,145,249,197, 18,150, 58, 57, 57,221, +114,117,117, 77,118,116,116, 12, 41, 77,211,193,193, 33,200,213,213, 53,217,193,193,161, 88,114, 79, 14,135,211,211,193,193, 33, +190,228,124, 46,151,219,201,201,201, 41,182,228,252, 50,246, 29, 46, 46, 46,177, 9, 9, 9, 36, 53, 53,149,120,120,120, 36,148, + 52, 96, 73, 73, 73,197, 12,152, 57,154, 21,149,165,156, 50,150,170,105,198, 49,173,204,121, 55,225, 93,173, 90,181,148,181,107, +215, 18,153, 76,150, 82,116,129, 79,187, 79, 22,220,125,145,151,243,233,156, 31, 14,149,146,176,212,220,228,160,221,165, 82,105, +124,199,142, 29, 21,207,159, 63, 39, 12,195, 16,134, 97,202, 50, 90,165,105,246,104,218,180,105,122, 90, 90,154, 49, 55, 55,215, + 16, 27, 27,171,121,253,250,181,106,217,178,101,186,212,212, 84,117, 94, 94,158,246,225,195,135, 26, 87, 87,215, 84, 0, 61, 44, + 61, 71,149,253,237, 42, 89,125, 70,182,251,181, 38,219,252, 78,133, 47,242, 12, 27, 29, 40,213, 4,175,237, 73,200,165,217,228, +206, 15,159,146,150, 94,130,124, 67,180,221,247, 12,249,217,187, 29,217, 88, 75, 96,150,230, 79,181,219,146,237,190,103,158, 46, +244, 12,251,168,137,163,118,255,238,237,228,229,203,151,228,248,145,125,164, 69,205, 2,147,181,205,239, 60,249,193,175,163, 57, +154,165,153,173,157, 59,119,146,151, 47, 95,146,223,126,251,205, 92,147,213,165, 52,163, 53,175,139, 44,235,211, 64,145,102,104, + 35,129,182, 95, 0, 95,215,173, 14,223,208,202,147,107,108,232, 74, 51,126,142, 32,221,124,196, 26,178,205,231, 26,217,230,215, +221,220,114, 10, 4,130, 24, 20,201,169, 83,114, 18, 10,133,169,229, 24,173, 46, 21,154, 45,111, 97,226, 31, 75, 59,145, 62, 13, +228,233,102,154,172,138,174,165, 70, 14, 14, 14,105,187,118,237, 34,206,206,206,169,102,154,172,191,252,250,180,182,182,222,155, +151,151, 23,124,238,220,185,224, 46, 93,186, 4,239,221,187, 55,248,198,141, 27,193, 18,137,100,175, 41, 56, 81,210,108,249,189, +249,252,239, 82, 34,162, 21,156,155,155, 75,206,157, 59, 71,186,116,233, 66,246,238,221, 75,110,220,184, 65, 36, 18, 73,112,101, +203,249, 87,236, 59,171,249,159,102,124, 41,147,101, 70,235, 45,158, 8,162, 86,171,201,172, 89,179,180, 34,145, 72,201,231,243, + 45, 29,130,231,189,190, 8, 29, 28, 28,110, 57, 59, 59, 39, 59, 59, 59, 23, 51,123, 69,231, 59, 56, 56,132,252,203,111, 64,111, + 62,159, 31,205,227,241,138, 15,193,227,223,183,101,237,214,163,230, 59, 7,244,253,160,138,229,228,243,249,252,121, 34,145, 72, + 57,107,214, 44,109, 94, 94,158, 37, 70, 11, 0,186, 74, 36,146,248, 61,123,246,168, 94,188,120,161,207,200,200, 48,220,189,123, + 87, 31, 20, 20,164, 93,188,120,113,174, 68, 34,137, 71,217,105, 9,254,150,227, 73, 54,214, 18,152,204,214,163,249,158,225,125, +234, 73,116, 59,102,118, 35, 45,107,148, 48, 89,101,103,114, 47, 93,179,192,108, 61,248,218, 35,188,163,183,204,176, 98,254, 12, +210,162,166,184,184,201,178, 64,179,164,217,146, 72, 36,185,139, 22, 45,178, 36,146, 85,220, 16,254,228,227, 65,182,251,238,205, + 55, 81, 21, 76, 63,248,252, 72, 54,251,120,252, 83,238,163, 64,103,120,118,246, 22, 62,177, 32,146,101, 78, 57, 27,217,218,218, +134, 89, 16,201,250, 59,246,189,219,196,137, 19,131, 95,191,126, 29,252,234,213,171,224, 27, 55,110, 4,127,248,225,135,193, 0, +186, 21, 89,167,208,108,233,250,247,215, 52,162,233, 25, 21,104,126, 60,113,226, 68,242,250,245,107,242,234,213, 43,114,227,198, + 13,242,225,135, 31, 18, 88, 54,124, 15,107,138, 88,163,245, 78, 34, 90,127,245,128,159, 93, 0, 92, 44, 58, 67, 36, 18, 37,171, +213,106, 71,153, 76,246,123, 94, 94,222, 84,228,119,139,172,146,230, 95, 81, 78, 86,243, 95,161,233, 42,147,201, 54,229,229,229, +125, 40, 18,137, 82,213,106,181,179, 5,154, 54, 66,161,112,134, 72, 36,234,168, 84, 42,189, 1, 64, 42,149, 62,215,104, 52,151, + 85, 42,213,122, 0, 89,239,122,223,201,198, 90, 2, 8, 4, 77, 65, 48, 55, 56, 70, 81,115,197,185, 12,207,153,157,108, 99, 90, +213,150, 70,130,199,124, 7, 74,115,143, 26, 19,173,177, 88, 83, 76, 53,135,145, 55,247, 94,148,178,198,119, 23,114, 61,191,232, + 40,139,105, 85, 75, 22, 3,130,239, 32, 84,222,182, 84,179,164,217,146, 74,165,123, 20, 10,197, 56, 0,151, 45,221,119,114,216, +143, 15,133,190, 26,244,156,122, 32,229, 12,225, 67,136, 18, 52,231, 49,146,144, 76, 45, 14,211,177,247,209,223,174,217, 77, 38, +147, 13,247,245,245,173,245,244,233,211, 87, 74,165,242, 87, 0,231, 75,172, 67,249, 2, 29, 37, 92,110, 67,149,193,112, 45, 12, + 8,170, 64,243, 99,153, 76,246,133,175,175,111,192,211,167, 79,159, 40,149,202,181, 0, 14,176,231,232, 95,165,249,175, 52, 90, +127,123, 22,101,211,143, 93, 94, 94, 30,123, 6, 88,254,106, 18,243,242,242,250, 23, 92,119,150,110,155,165,209,104, 22,106, 52, +154,133, 40,104, 63,146,153,153,249,143,106,180, 74, 77,123,165, 37, 27,107, 5, 65, 32, 88,217,196, 67, 60,245,232, 68,177, 18, +132,138, 3,143,217, 80,129,201,170, 72,243, 30,196,250,149,205, 61,197,159,255, 54, 65,172, 4, 65, 18, 8,214, 87, 96,178,204, +229,166, 66,161,168, 89,233,125, 30, 20,166, 3, 16, 73,128, 40, 44, 46,231, 69,113, 49, 8,197, 54, 50,126,151,156,207,203,203, + 59,127,239,222,189,114,127,131,194,129, 75, 48,152,221, 25,224, 64, 94, 94,222,129, 10, 52, 89, 88,254,113,112,217, 67,192,194, + 82,241, 75,201, 63,181, 96,212,180, 87, 90,114,216,239, 62,210, 56,179, 64,163, 38, 96,136,134,194,144, 68, 77,139,214, 86, 81, +243, 46,210,168,233,224,192, 27, 2, 67, 4,242,180, 73,212,164,104,237, 63,102,191, 1,130,197,172,145, 98, 97, 97,249,199, 48, + 30,197,123, 26, 22,254,207, 26, 45, 22,150,247,156,130, 40, 79, 92,193,244,143,213,100, 97, 97, 97,249, 15, 26, 46, 80, 40,187, + 65,155, 37,117,175,149,105, 20,119,145,213,172,148, 38, 7,128, 53, 0, 27,228, 15,227, 96,234, 38, 92, 81,154,141, 15, 0,232, +217,227,201,106,178,154,172, 38,171,201,106,190, 99,205,138,180,223,199,182, 95,165,101,134,223,241,174,122, 29,178,154,149,167, + 59,123, 60, 89, 77, 86,147,213,100, 53, 89,205,127,169,230,191, 14, 66, 72,165, 19,177,177,188, 27, 68,236, 33, 96, 97, 97, 97, + 97, 97,249,199,209,184,224,211, 21,249,209, 45, 87,211,130,119,218, 70, 75,108, 95,215, 21, 92,186, 1,197, 16, 95, 0, 32, 52, + 21, 14, 3,243, 80,149,254, 34,177,170,218, 50, 55,111, 59, 2,193, 97, 10,218, 65,121, 9,207, 51,170,170, 87,207,219,170,191, +179,131,124,120, 82,122,246,158, 39,207,242,142, 89,178,173,181,181,167,181,200,206,118,160, 70,167,175, 39,224,243, 99,116, 89, + 57, 59, 50, 51, 95,229, 86,162, 24,118,229, 45, 92,188,152, 80, 39, 19, 67, 40,190, 68, 71,219, 91,241,169, 60,228,145,188, 68, + 25,227,149, 21, 73,142, 28, 25, 68, 44, 61, 55, 20,141, 14, 82,185,188,137, 80, 36,105, 46,145,219,214,101, 8,144,145, 28, 31, +165,213, 27,110, 24,181,202, 96,194,224,202,219, 56, 87, 44, 44, 44, 44, 44, 44,255, 2,163, 21, 2,160, 23,242,219,104, 85,220, + 24,222,211,191,205,125,145, 72,236, 5, 0, 12, 33, 96, 8,160,200,201, 10, 78,122, 21,212, 29, 0, 28,106, 52, 62,199, 19, 89, + 53, 97, 72,254,114, 35, 3, 24,116,234,200,156,232,187,205,204, 41,145,212,209,251,163, 78, 93, 58,247,239,221,187,151, 79,253, +122,245,107, 3,192,163,199,143, 34, 78,158, 60,245,236,210, 69,234,168, 34,245,249,111, 85,217, 99, 2,209, 55, 77,155, 54,106, + 19, 20, 20,178, 20,192,228,170, 30, 65,123,123,217,212,243,255,155,213,174,115,255, 53, 82,192, 50,163, 37,178,179, 29,216,175, + 79,143, 70, 95, 78,155, 72,127, 58,235, 91,175,251, 55,175,172,146,185, 6,100, 17, 70,127, 94,145, 60,228,122,121, 3, 39,151, +244,143,101, 25,172, 95, 51,206,210, 27,118,181,180, 85,101, 68, 12, 33,140,113, 8, 69, 81,224, 8, 36, 71, 28,107,181, 57,100, +211, 97,102, 38, 0,179,123,140, 89,185,250,119,113,114,117, 63, 58,228,147, 25, 34,137,181, 51, 23, 28, 62, 0, 10, 9, 81, 97, +184,116, 96,133,237,231, 75,118, 54,190,249, 48,218,240,199,255,182,168, 41, 62,175,191, 50,241, 41,155, 75,133,133,133,133,133, +229,191,204,169, 2,115,117,170,228,130, 50,141,150, 72, 36,246,186,115,229,164,221,111, 55, 98, 1, 0, 93, 26,187,224,171,101, +155,186,237,221, 24,244, 12, 0, 90,118,234,237,189,116,222, 52,220,122,146, 2, 66, 8, 26,213,177,199, 7,253, 6,153,103, 60, +156,253,154, 13, 28, 56, 96,216,172, 89, 95,244,125,249,242,101,212,254,253,251,175, 3, 64,219,118,237,234,124,251,237,183,131, +215,216,218, 9, 15, 30,249, 95,188, 58, 57,236,126,101,246, 86,228, 86,171,154, 79,221,154,195, 15,254,188,137,238,208,125,192, +208, 40, 40, 86,168, 19, 94,197,155,179,173,131,131,195,116, 30,143,103, 13, 0, 12,243,167,255,209,233,136, 11, 0, 24,140,140, +220,214,205, 39,151,195, 23, 25,133, 66,254,211,220,188,188, 61, 57,241, 97, 63,149,167,169,209,235, 3, 62,159, 52,134,126,240, + 42, 29, 94, 1,109, 57, 27, 86,124, 13,198,168,183,157, 49,111,217,192,160,187, 7,161, 72,198, 85, 51,119,141, 87,114, 70,181, +106, 45, 56,223,172,144,117,165, 40,140,246,108,249,201,135, 75,119, 31,225, 53,173, 99, 5,141,158,193,153,224,244,150, 63,172, +255,102,245,205, 31,122,157, 0,176, 29,192, 31, 0, 42, 52,117,118,246,118,191, 78,159,191, 94,166,208,254,153,166,168,192,100, +225,199, 61,135, 17, 26,203,192,215,199,151,235, 50,125,149,108,251,178,241,187,149,249, 99,119,177,176,176,176,176,176,252, 87, + 73, 68,241,222,134, 59, 42, 52, 90, 0, 32, 19,115,241,236,117, 18, 0,192, 70, 12, 76,157, 48, 10,233,105,169,222, 90, 3,131, + 79, 70,141, 64, 72,120, 34,158, 69,166,130, 16, 2,111,119,137,217,165,225,128,105,250,201,216, 79,218,159, 59,127,254,222,130, +249, 11,126,161, 40,220, 6,128,237, 59,126,108,185,112,209,194,113, 35, 70,141,232,122,228,200,145, 39, 0, 42,101,180,184,148, +124,211,234,149,203, 5,113,105,106,245,244, 89,115,153, 47,102, 78,223, 0, 96,128, 89, 78,134,199,179,142,139,139,147,209,116, +241,230,107,223, 45,159,123,173,107,255, 53, 47,162, 98,178, 30,156, 59,126,188,153,191,191, 63,226,226,147, 90,175,250,126, 91, +195, 51,231,196, 99,114,115, 84,253,149,105, 97,165, 14,218, 44,228,241,158, 44, 89,245, 67, 35,198,166, 14,253,213,184,158, 8, +168,237,134,248,148, 44,180,235,222,151, 27,124,255,126, 55,192,108,163, 85, 50, 65,227, 64, 45,147,210,240,219, 61,119, 59,127, +216,202,173, 41, 77,115,144,167,210, 35, 53, 91, 3, 35, 3,180,245,179, 70,143,189,223,115, 51, 20,250,143,150,253, 47,246,163, +219, 27,123, 39,171,179, 19,166, 0, 56, 90,254,215, 16, 59,119, 39, 43, 60,139,205, 45,213,100, 41,212, 6, 0, 0,159, 99, 4, + 5, 98,207,222, 95, 44, 44, 44, 44, 44,255,113, 74,237,117, 8, 20,140, 74,126,242,228,201, 82,219,239, 24,141, 4,207, 34, 19, +241, 44, 50, 17,247,194, 83,161, 35, 60,108, 88,181, 4,107, 87, 44, 66,134,138,198,111,183, 98,241, 60, 50, 9,207, 35,147,144, +150, 89,106,166,247, 98, 85, 74,107, 86,136, 27,175, 95,111,181,186, 91, 59,105, 7, 59, 91, 91,219, 23, 79,126, 81, 44,156,153, +236,183,228,243, 88, 62, 79, 43,140,147,202,164,173, 14, 31, 62,228,239,236,232, 36,149,201,228,179, 37,213, 26,238,180,182,110, + 96, 93,158,102, 73,196, 78,190,125,251,246,234,209,201,197,197,153,153,184, 33, 56,188,158,159,175,190,110,157,186,173,197, 78, +117,251,150,179, 89,161, 38,195, 48,160,105, 26,201,201,201, 72, 72, 72,192,235,215,175,241,252,249,115,196,198, 70, 37, 51,132, +240,140, 96,104, 87, 87,119,112,185, 2,120,213,240,196, 15, 27, 86, 72,150, 45,254,170,185, 72, 42, 56, 86,194, 8, 21,106,170, + 51, 50,143,156, 62,123, 62,254,204,254, 31,140, 0,144,146,153,135, 75,247, 95, 34,228,105,172,165, 39,178,100, 10,135, 26,241, +209, 47,115, 12,145,167, 56, 75,191,254, 34,246,198,141,155, 81,217,185, 90,228, 42,117, 80,170,245,208,104,141,208, 27, 25,120, + 58,138,240,251,220,122, 56,126,249,161, 51, 69, 81,235, 43, 58,158, 26,141,222,216,198, 87,138,161, 29,171,195,215, 93,138,248, +103,183, 49,125,254,122, 4,189,214, 32, 51, 51, 11,122, 69, 26,152,188, 56,164, 69,134,192, 96, 52,146,138,206,251, 91,130,213, +100, 53, 89, 77, 86,147,213,252, 23,107,150,229, 69,222, 19,118,148, 50,161,208,104,149, 69, 68,108, 6,158,189, 78, 66, 19,223, +106,168, 93,195, 21,247,158,103,226,215, 75,177,216,121, 46, 26,151, 66, 83,193,112,229, 72,202, 1, 94, 68, 37,227, 69,116, 90, +133,249,179, 57, 66,222,144,207, 63,207,158, 85,223, 63,167,197,149, 51, 83, 81,205,241,133,255,156, 57, 89, 83, 57, 66,222, 16, +219,234,242,253,115,103,205, 24, 46,151, 72, 4, 90,141, 22,181,106,122,138,166, 77,153, 58,134,178, 21,238, 55,119, 47,229,213, +252,108,133, 98,241, 79,203, 22,207, 22,174,255,237, 69,140, 66, 11,197,209,219,201,175,190,152,187, 48,131,203, 19,253, 32,175, +230,103,107,174,150, 94,175,135, 70,163,129, 86,171,133, 78,167, 67,124,108, 88,223, 63,126,251,178,123,205,234,118,221,133, 34, + 17, 8,128, 28,149, 1,175, 19,149,232,216,185, 43,167, 73,227,198, 1, 50, 87,191,177,165,105,101,103, 71,103, 51,132, 35, 63, +249,251, 62,206,161, 11, 15,240,203,201,251, 56,118,249, 1,238, 93, 61, 99, 32,140,190,112,252, 47,153,107, 29,111,153,107,253, +104,153, 91,131,228,194,169, 90,189,160,114,143, 41,135, 38, 29, 59,119,185, 56, 97,242,180, 43,202,220,244,148,159, 54, 45,137, + 79, 77,136, 10, 19,242, 41,131, 68,200, 65,158,218,128,221,127, 36, 96,224,138, 80, 60,141,201, 3, 33,164,194, 1,188, 25, 96, +230,144,177, 95, 26,245, 58, 29,124, 60,100,216,183, 99, 37,250,118,108,136, 78,245,109,209,172,182, 20, 18,174, 6, 79,194,159, +225,192,190,221, 6,134,161,191, 96, 95,100, 88, 88, 88, 88, 88,216,136, 86,225,228, 90,116, 65,153, 85,135,106,181, 42,114,192, +144, 17,112,117,114,145,245,235, 48,154, 31, 28,145,133,212,196,104,188,124,254, 24, 74,181, 30,124,219,154,128,200, 5, 53,188, + 60,241,240,217, 49,221,198,213,167,242, 24,131, 38,178, 44,189,190,125, 93,221, 95,134, 83,244,234, 85, 30,119,158, 63,203,108, +178,111,254, 46, 12, 27, 38,115, 88,189,202,227, 78,212, 43, 41, 45, 17,145, 86, 99, 70, 13,165,104,138, 96,206,156, 89,232,215, +187, 7, 62, 25, 51,146,218,179,103,119,139, 44, 51,247,146, 1,111,243,188,175,151, 8,146,179, 12,218,123,207,243, 52, 18,169, + 88,124,243, 69,158, 34,192,203, 67,220,179,255,232,132, 83,135,127, 90, 15, 96,148, 57, 90, 38,131,165,215,235,161,211,233, 0, +192, 8, 0, 52,157,255,153,158,171, 69, 74,150, 6,201, 89, 26, 24,140, 12,250, 15, 25, 37,190, 31, 20, 58, 10, 64, 25,237,181, + 24, 70,111,208,227,232,133, 16,196,223, 63,194, 80, 52, 39,187, 72, 99,120,200, 92,235,120,187,184,120, 92,235,221,127,164,163, + 64,148, 95, 13,155,171,208, 96,207,182, 85,229,150,147,166, 40,194, 24, 13, 89, 6,189, 94, 81,171,102,173,120, 95,255,134,162, + 27, 87,206,245,189,121,241,104,158,161,214, 72,155,136,168, 68,112,120, 66,112,248, 34,104,116,230,189, 44, 36,191,188,179, 5, + 0, 53,246,179, 89, 27,102,124,249, 21,103,230,198,235,208,170,149,208,168, 20,200,201,206,132,152,171,199,147, 91,199, 13,196, +168,159,161, 72,124,176,133,189,191, 88, 88, 88, 88, 88,254,227,148, 28,126,167,112, 94,153, 70, 43,250,233,141,102, 0,224,221, +180, 91,186, 76,196,181,227,210, 20,146,227, 34,176,103,205,116, 48, 12, 65,207,113,171, 33,247,114,129,152,207,129, 38, 47, 61, + 47, 35,226,106,185,109,117, 40, 74,223,117,203,246,120,175,207, 38,213,178,218,183, 47,143, 7, 0,251,246,229,241, 38, 77,172, +110,181,117,123,164, 87, 96,155, 38, 32, 70, 35,122,247, 27,128, 33, 31, 15, 65, 84,146, 18,255,187, 22, 3,133, 74,107, 86,111, + 57,177,131,111, 67, 7,123,199, 30,159,143,238, 33,229,114, 40,170,174,167, 53, 39, 54, 85,111,224,112,120,198, 19,247,179, 19, +250,247,255,216,225,210,233, 67,157,140, 14,190, 13, 85,105,225,161, 21,233,105, 52, 26, 24,141, 70,104, 52, 26,232,245,122,216, + 57,212, 60,221,117,192,154,184,196,164,220, 83, 73,153,234, 64,133,222,128,228, 44, 13, 82,178, 52,200, 82,232,224, 34,183,133, + 65,175,173, 95,150, 30, 33,228,151, 15, 7,140, 24, 9,128,166,104,195,174,188,196,240,231,249, 75,254, 52, 89, 61,250, 13,115, +188, 22, 28,129,151, 65,103, 50, 9, 99,200,207,226, 78, 49,113,229, 31, 87, 16, 14, 5,134,207,165,244, 28,154,102,116,186, 60, +189,147,147,227,165,171,151,206,246, 81, 27, 94,129,195, 23, 22,174,171,210, 26,205,190, 98,146, 95,222,217, 12, 0,223,111,220, +176,182, 85,215, 97,252,171, 33,145, 80,233,129,150,141,189,241,251,193, 31, 53,132,232,191, 84, 36, 62,216,204,222, 91, 44, 44, + 44, 44, 44, 44,197, 12,214, 41,228, 55,142, 47, 30,209, 50,213,141,246,238,221,187,100,131,107,196, 39,103,192, 94,198,133,163, +155, 23,134, 79, 95,139, 95,214,207,132,209,168, 7, 33,128,193,104, 94,102, 2, 66,120, 23, 38, 79,242,242,173,225,197,113, 28, + 62, 76,162,250,117,159, 82, 60,124,152, 68, 85,175,190,125,246,228, 73, 94,145,185,106,143,214, 6,163, 17, 55,159,164,224,113, +100, 54, 30, 71,229, 64, 38, 54, 63,205, 23, 71,192,159,180,106,229, 10, 62,151, 67, 81, 79,162,243,242,226,210, 13,121, 28, 30, + 79, 39, 17, 11,136,150,112, 53, 81,105, 36,189,243,135, 99, 84, 39,246,126, 63, 22,192,148,178,116, 76, 61, 13, 77,145, 44,211, + 39, 33,132, 80, 0,195, 80, 70, 99, 92,154, 26,121, 58, 61,146, 51,255, 52, 90,148,161,236,154, 83,153,107, 29,111, 43,185,236, + 44,135,195, 17, 18, 2,232,117,134,193,112,173,211, 61, 47,241,229,243,162, 38,235,206,147, 4, 68, 60,184,152,108,212, 41, 71, + 40, 83,158,253, 97,238,190, 83, 20, 8,135, 3,134, 67, 83, 12, 69,129,225,209, 68, 11, 66,152,146, 37, 82, 90, 96,180, 76,102, + 75,192,227,204, 63,127, 96,189,211, 39,189,252,112,240, 90,190,231, 83,231,166,230, 40,226, 89,147,197,194,194,194,194,242,118, + 41,207,139,188, 71, 81,173, 55, 35, 90,229,237, 16, 33,192,139,232, 52,212,112,119,132,123,141,218,120, 30,246,240,207,101, 0, + 12, 70,243,170,163,142, 31, 79,140, 91,187,214,138,153, 57, 51,187,229,170, 85, 30,183, 39, 77,172,110, 93,175,190,125,246,236, +217, 49, 45,215,173,179,190,125,225, 14,207, 72, 10,242,117,153,114,115, 89, 54, 70, 16,221,188,161,127, 77,206,146,125, 47, 98, +254,120,148,155,194,231,243,245, 46,182, 34, 74, 46, 19,112, 56, 52, 79,160,209,211, 26,239,128,198,156, 19, 52,213,184, 60, 21, +147,209, 42, 89,117,152,158, 26,209,247,252,255,102,213,235,240,225,106,187,248, 84, 21,178,181,156,194,170, 67, 14, 77,225, 81, + 88, 52,192,225, 63, 46, 77,211, 74,110,119,110,255,175,191,120,172, 91,181, 28, 58,131, 17,147,103, 46,192,152, 81, 35,206,193, +181, 78,119, 15, 47,159,224,235, 39,118, 73,186, 79,252, 1,209,207,130,146, 12,154,156, 3,150,152,172, 66,179, 5, 16, 35, 97, +232,140,204, 28,153,198, 0, 17, 74,241,125, 26, 29, 83,169, 43, 39, 79,101,192,137,187, 73, 56,249,219, 1, 88,203,165,236,147, +128,133,133,133,133,229,173,243,158,154, 43,148, 48, 87, 64, 89, 17,173,242,240,116,119,198,221,199,145,168,239, 91, 19,214, 86, +114,132, 71,196,129, 67,243, 64, 83,128,222, 96,190, 25, 34, 58,253,193,117,235,172, 17, 29, 41,165,183,254, 16,233, 53,121,146, + 87,228,186,117,214,183,137, 78,127, 16,192, 8, 66,242,199, 5, 50, 37, 72, 53, 90,224, 11, 8,163,175,238,108, 39,225, 4,189, + 82,164,211, 52, 71, 99,111, 45, 98,236,173,133,180,189, 92,192,227,243, 56,140,129,208, 58,119, 39, 47, 53, 97,152,134,230,232, + 21,173, 58, 52, 26,141,160, 40,218, 88, 96,196,164,177,233, 42,100,171, 57, 72,206,210, 32, 51, 87,135,186,213,164,184,120,233, +136,210,168, 87,237, 43, 77,139,195,227, 91,215,246,114,199, 87,223,172,131, 74, 99,196,139,248, 60,240,133, 66, 23,103,151,128, +208, 17,159,205, 21, 78,219, 17,129,177,157,236, 49,243,122, 68,188, 50, 89, 52,215,146, 51,107, 52, 26,161, 82,107,249,201,105, +153,182, 57,185, 10, 43,177, 72,168,114,180,179, 78, 43,109, 93,181,133, 17, 45, 19, 18, 17, 23,125, 90,184, 64,173, 27, 10,149, +198,128, 91,127, 28,101,159, 8, 44, 44, 44, 44, 44, 44,127,178,163,172, 5,102, 25, 45,153, 68, 4,194, 17,225,122,112, 4,124, +252, 27, 96,247,241,123,168, 83,191, 5, 18,115, 13, 32,160, 43,236,109,104, 98,214, 60, 85, 8,128,144,190,125, 37,238, 31,125, + 84,173, 43, 33,188, 11, 63,108,207,137, 3,128,154,245,242,101, 24,134,128, 16,128, 48,249,134,203,108, 40,110,116,100, 98, 78, + 13, 47, 23, 41,158,198,233, 52, 82, 33,159,182,149, 10, 56,142,214, 2, 62,159,203,133,145, 80,154,196,196, 8, 13, 5, 68,153, + 35, 87,178,234, 80, 34,115, 61,221,249,195,213,169, 81, 49,217, 65,117, 51,148, 13,179,117, 2, 16, 2,212,173, 38,197,227, 59, +167,140,201,241, 47, 95,168,146,159,109, 43, 77,139, 97,192,209, 25, 24,132,190,202, 70,150, 66,143,172, 60, 29, 90,119,236,195, +111,221,165, 47,174, 63, 78, 3, 99,208, 99,213,143,167,114,141, 68, 63, 4, 8,211, 91,176,211,244,221,144, 39,238,169,153, 10, + 33,143,203,205,242,173,227,249, 90,192,231, 25,114,114,114, 4,197,215,226, 64, 42, 22, 32, 35, 79, 15, 0,122, 75,175,158,108, +133, 30,199,239, 36,225,196,209,253, 16,139,197, 32,236, 13,197,194,194,194,194,194, 82, 20, 87,228, 15,191,115,170,224,179,208, +124,153, 53,168,180,145, 33,112,176,183,131, 72,106,133,200,100, 29,114, 41, 39,100, 42, 9,140,198,252,136, 86, 57,129,167, 82, + 71,247, 62,126, 60, 49,238,216,177,180,157,199,143, 39, 22,105,232,253,103, 36,171,240,147, 33,102,107, 82,196,120,241,248,153, + 43,217,125, 3, 29,109,105, 14, 71,197,231,209, 26, 46,159,163,227,115,105, 61,159, 75,107,157,173,120,156, 43, 39, 14, 8, 8, +133, 43, 21,105,170,213,106,116,233,210, 5, 61,123,246, 68,191,126,253, 48,104,208, 32,120,123,251, 57,209, 28, 74, 75, 40,134, +113, 20,228,162,182, 35, 5,174, 58, 22,127, 28,248, 78,249,248,230,239,161, 70,141,186, 15,138, 91,206, 63, 53, 9, 97, 50,178, + 53, 80,235,140,200,204,211, 33, 83,161,131,193,177, 37,126,191,149, 0,149,214,136,232,224, 35,170,212,164,184,233,154,148,151, +145, 21,156,138, 57,197,255, 37,113,159,126, 50, 42, 85, 46,162, 95,182,109,213, 44,213,193,222,206, 64, 81,127, 70, 94, 41,138, +130,200,202, 9,182, 54,114, 68,134,156,193,249, 85,157, 85, 0,190, 54,231,120, 22,197, 74,194, 69,223, 64, 23,244,233, 63, 20, +245, 91,116, 55,199, 88,179, 35,218,179,154,172, 38,171,201,106,178,154,255, 37, 76, 99, 28,154, 62,205,203, 12,111, 50, 64,181, + 92,165,168, 83, 77, 10,181,206, 9,106,173, 17, 10,181, 17, 57, 74, 29,114,148,122, 68, 38, 41,241,248,120,213, 75,152, 31,197, +202,207,248, 73, 8, 0, 42,223,224,153, 27, 61, 17,232,180,223,172, 93,245,237,224, 3,141, 27,105,167,245,114,173,254, 48, 82, +155, 64, 81,180,138,230,112,245,118,114, 46, 47, 60,252, 97,234,237,107,167,219,137, 12,198,145,202,114,116, 12, 6, 67,118,181, +106,213, 0, 20, 31,130,199,175,182,184,223,205, 83,115,106,182,239,187,202,113,253,242, 89, 74,154,195,103, 40, 46,255,177, 81, +175,218,175, 74,126,246, 3,202,177, 31, 52, 95, 20,118,247,193,211, 22, 54,118,213,241, 50, 94, 1,133,218, 0,157,129,129,173, +140,143,184, 71,231,116,145,225, 65,135,242, 18, 30,238,174,196, 97,219,247, 60,236,177,123,143, 30,221, 7,180,104,209,146,179, +112,225, 2,248,248,248, 64,165, 82,129,166,105, 84,175, 81, 27,145,207, 31,224,206,169,111,140,202,244,168,109, 0,150, 2, 72, +181,244, 75,210,114,180, 56, 19,148,130, 83,191, 29, 4,135, 39, 96,111, 39, 22, 22, 22, 22, 22,150, 55, 25, 95,226,115,135, 89, + 70, 75,173, 86, 71,182,233,210, 7, 12, 67, 96, 36, 0, 99, 44,136, 60, 49,127, 70,159,140,122,117,100, 85, 75,199, 48,198,123, +155,119,236,236,217,184,121,123,142,191,135, 12, 57,233, 73,184,115,243,178, 1, 12,185,109,206,246,233,233, 47,242,196,206,117, + 6, 12, 30,248,209,225, 81,159, 76,204,106,215,177,163,212,201,201, 69, 19, 23, 31,167,252,121,239,175,250,115,167,143,181, 99, + 96,248, 56, 61,253,101, 94,121, 58,217,217,217,223,151, 54, 95, 40,144,181, 6, 80,147,195,165,180,170,212, 23, 22,181, 8, 79, +139,143,237,255,237, 55,139,163,134,141,155, 33,168, 85,173, 54, 82,178, 57,136,140, 75, 66,248,181, 99,154,248,231,247,127,203, +137, 11, 25,107,166, 84, 98, 41,243,226, 0,172,191,115,231,118, 64,143, 30, 61,186,119,234,212,137,140, 31, 63, 30,132, 0,127, +236,152, 68, 50, 34,239, 28, 65,126, 20,235, 85, 37,207, 75,244,181,219, 15,236, 6,181,107,202,181,151,143,197,206,131,167,245, + 32, 76, 52,123, 63,177,176,176,176,176,176, 20, 82,249, 54, 90,177, 97,249,249,180,254,106,114,147, 82, 70,236,222,253,203,178, + 95,246, 30,104,173,214,106,171, 17,240, 99,141, 6,237,213, 60, 35, 22,154,171,161, 74,126, 25,100,111, 95,183,222,207, 63,110, +254,250,231,157, 91,219,131, 49,250, 82, 64, 20,161,112, 69,164, 55,142,170,200,100,149,107,150,210,114,183,119, 29,176, 70,149, +158,158,247,139,165,219,170,210,159, 37,209, 28, 93,245,237, 27,190, 89, 77,211,156,110, 70, 35,195, 99,140,250,151, 70,157,250, + 59, 85,234,179,227, 48,187,149, 27, 50,202, 89,246, 4,192,147, 75,151, 46,181,189,116,233, 82,115, 0,223, 35,127, 12,197,160, +170,156, 23, 77,122,110,231, 47,103,125,249,199, 23,160, 60, 25,134,192, 96,100,162,249, 42,101,103,246,158, 98, 97, 97, 97, 97, + 97, 41,100, 60,222, 76, 90,106, 94, 68,235,239, 34, 51,243, 85, 46, 50, 49,173,170, 58,233,233, 47,242, 0,188,209,115, 79, 89, + 69,221,199, 47,114,254,135, 23, 57,255,171,236,246,138,148,215,169,192,235, 81, 85, 44,134, 57, 13,217,175, 23, 76,111,133,180, +180, 48, 5,210, 16,200,222, 67, 44, 44, 44, 44, 44, 44, 22, 27, 46,243, 26,195,179,176,176,176,176,176,176,176,176, 84,104,178, +138,126, 2,200,111,123, 94, 86,207, 1, 75, 70,230,174, 76,239,131,139,172,102,149, 53,121, 0, 4, 0,100, 0, 42,170,210,236, +142,130,241, 26,217,227,201,106,178,154,172, 38,171,201,106,190, 67,205,138,180, 47,226, 95,130,101,137,215, 43, 7,219,245,149, +213,100, 53, 89, 77, 86,147,213,100, 53, 89,205,127, 59,227, 75,153, 64, 8,249,231,180,209, 98, 97, 97, 97, 97, 97,249,187,176, +183,175, 43, 3, 10,219,245, 86,136,196,193,207, 25, 0,148,105, 97,201,236,209, 99, 41,133,162,227, 28,190,149, 54, 90, 60,154, + 43,248, 82, 34,183, 15,147, 90,219,199,255,199, 15, 46,229, 93, 67, 58,181,107, 59,175,223,125,106,138,251, 89,178,161,196,209, +123,151, 75,237,192, 24,169,147,247, 84,184, 54, 22, 87,165, 16, 82,167,154,142,178,234, 77,111,202,171, 5,124,240, 23,236,163, +208,223,223,191,165,191,191,127, 75, 0,194,183, 33, 40,113,242, 30,234, 94,167,197, 53,167, 90,141, 46, 75,157,235, 14,124,219, + 5,150,185,214,177,151, 85,111,242, 63,153, 91,131, 76,153,107,131, 28,153,123,147,171,114, 7,191, 90, 21,109, 87,189,239,183, +190, 75,246, 63,222, 95,189,239,183,190,165, 45,183,237,177, 81,190,232,192,139,229,246,125,190,147,177,207,149,202, 81,189,245, + 80, 27,215,246, 95,216, 91,186, 93, 53,239, 22, 79,106, 4,180, 77,113,171, 27,248,216,220,109,220,125, 90,134,120,250,183, 78, +118,247,110, 25,196, 30,121,243, 16, 57,214,108, 41,178,245, 56, 37,180,245, 56, 45,180,171,217,177,170,122,174,174,174, 98, 95, + 95,223, 30, 45, 90,180,152,208,185,115,231,207, 27, 53,106, 52,222,211,211,179, 27,222, 97,103, 44,137,147,247, 60, 13,143, 74, +211,240,168, 52,137,147,247,188,138,159,175, 62,203, 40,218,152, 64,209,198, 4,169,147,207,178,127,202,185, 18, 58,123,123, 74, +156,188,215,201, 93,252,239,137,157,234,246,177,116,123, 91, 91,219,110,142,142,142, 31,154, 38, 91, 91,219,110,236, 29, 80,105, + 10,163, 88, 37,254,174,212,133,206,225, 9, 37, 55,134,125, 50,185,222,202,197,115, 69, 27,118,254,142, 13,203,103, 61,213, 40, +178,252,255,137,123,238, 80,179,121, 16,135,230,184, 23,157,103,100,140,113,105,175,239, 53,125, 27,250, 62, 53,196, 99,191,158, + 61, 98,230,208,193, 93, 60,187,244,158, 78, 61,123,173, 58,102,190, 69, 67,195, 67,255,251,173,250,181, 43,151, 55,238,220,185, + 99,105,170,193,103, 29, 79,200,221,156, 19,251, 36,203,146, 50, 88, 57,214,170,201,149, 58, 92,107,211,111,178, 75,240,197, 95, +119, 27,181, 76, 87,101, 90,145,209,191, 43,143, 99,237,218,181,155,113, 56, 28,251,169, 83,167,242, 1, 96,253,250,245,117,140, + 70, 99,122, 68, 68,196,125, 84, 34,249,105,190,193,244, 25,241,253,234, 37,191,124,240, 65, 79, 36,164, 41,176,106,221,150, 14, +103, 79, 30, 26,164, 72,126,113,228,109,156, 19, 27, 27, 47, 43,240,229,143,166,207, 94,234,212,163, 67, 51, 78,158,218,128,179, +215, 30,180,253,117,203,210,123,128, 95,243,220,180,176, 50,115,138, 49,202,236,249,206, 50,210,131, 81,102, 3,192,208, 55,126, +236,101,250, 46,142, 98, 99, 15, 87, 33,247, 65, 58, 80,225,160,143, 54, 53, 90,159,227, 9,133,158, 52, 77,131,166, 0,154,166, +192,161,168,252,113, 66,117,170,232,248,240,235,221,255, 9,247,137,220,163,121, 18, 56, 92,123,154,250,179,124, 20, 93,240, 73, + 72, 78,210,139, 27,246,111,225,107,172,235,213,177, 9,104, 93, 71,241,243,213,215, 25, 82,110,187,207, 79, 81,132,222, 26,115, +125, 93,168, 89, 6, 64, 36,178, 61,113,226,132, 99,143, 30, 61,172,157, 2,250, 93, 53,103, 27, 1, 39,207,255,228,201,227,252, + 30, 61,186, 91,112,125,122,119, 5, 77,239,165, 0, 30,195,144,245, 28,134, 28,202, 75,127, 30, 1, 88, 54,250,148,216,201,103, + 44, 13, 98,246,115,134, 1, 21,164, 74,121,182,179,178, 7,151, 43,180,234,204,227,243, 63,175,233, 93,191,113,124,212,203, 32, + 69, 94,238, 58,131, 38,251,170,197, 66,122,195,151, 23,175, 7,127,192,229,241,168, 30,157, 3, 57, 26,224,114, 85, 78,186,179, +179,243,135,155, 54,109,170,213,178,101, 75, 0,128,193, 96,176, 58,124,248,176,203, 55,223,124, 35,125,254,252,121,101, 7, 78, +173,230,232,232,232, 33, 16, 8,170, 1,128, 86,171,141, 79, 77, 77,141, 1, 80,225,139,191,212,185,150, 3, 8,150, 94,191,118, +141, 11, 0,109,219,182, 91,230,209,102,138, 45,135, 47, 83,149,122, 56,180,185,210,172,136,203, 51,238,220,189, 77, 1, 64,139, +192,150,115, 37, 14,126,155,223,101,100, 75,228,228, 19, 72, 3, 51, 91,180,237,210,127,200,199, 35,232,128,186, 30,232,214,181, +211, 28, 21,112,194,162,107,134,203, 21,223,187,119,175, 54, 77,211, 28,131,193,160,110,209,162, 69, 76, 85,202,229,230,221,242, + 22, 5,186,186,206,160,253, 49,245, 85,208, 50,224,141,129, 99, 56,214,213, 27,127, 13, 14,119, 28,195, 48,177,185, 49, 65,173, +254,133, 17,173, 55,143,179,165, 74, 52, 87,240,249,208, 49,159,213,155,241,197, 87,162,233, 27, 46,225,212,150,185,105,255, 84, +147, 5, 0, 28,154,227,126,238,252, 57, 39,137,128, 3, 0,200, 83, 27,240, 65,143, 30, 21,255, 34,212,104,126,133,166, 40, 31, +211,128, 54, 70,131, 78,196,229, 9,212, 84,190, 65, 2, 5,192,193,173,198, 37,103,195, 13,201,208,193, 93, 60,247, 30,184, 16, + 23, 19,151,110,241, 67,141,226,240,209,162, 93, 55,116,233,218,221,250,222,221, 91, 75,119,108,251, 97,158, 65,167,255,129,209, + 51,235,212, 25, 47, 19, 42,124,152,187,212,109, 34,144, 57,156,237, 63,225, 27,123, 53,109,135,133,203,191,119,184,118,102,223, +213,248,216,134, 76,116,116,172,154, 80,212,211,204,140,196,207, 21, 73, 17,207,204, 61,100, 50,153,172,150, 76, 38,107,216,160, + 65, 3,209,172, 89,179,120, 29, 58,116,248,211,178,143, 31,207,191,114,229,138,235,154, 53,107,122, 62,124,248, 80,157,151,151, + 23,154,151,151,247, 10, 22, 52,180,119,113,113,156, 50,224,163, 62,232,212,127, 50,140, 12,133,241,159,205,192,185, 51, 71, 39, + 2,120, 43, 70, 75, 47,177,250,102,220,132, 89,142, 45,154, 53,226, 44,221,247, 12, 98, 1, 23,221,155,250, 80, 99,166,206,183, +217,185,113,233, 79, 72, 67,251,210, 34, 89,140, 50,123,126, 61, 7,237,199,125, 91,214,196,241,253,218,143,209,121, 54,104,137, +245,178,216,227, 95,133, 3, 64,173, 30, 83,229, 66, 99,234, 38, 55, 27,142,147,208,152,186,169, 86,143,169, 23, 95,157,221,148, + 91, 94, 89,120, 66,161,231,254,125,251,234,218,202,249,224,210, 20, 56, 28, 10, 92, 14, 13,181,214,136, 65,131, 63,126,107,151, +185,216,169,110, 79, 26, 24,147,255,131,141, 93,170,148, 23,167, 45, 57, 39, 20,135,111,127,242,248,111, 92, 39,107, 33, 56, 28, + 10, 28, 26,224,208, 20,162,146, 85, 24, 59,118,140,117, 85, 13,251, 7,173,157,154,125, 57,196,167,123,139,122,118, 13, 14,222, +166,172, 91,124, 48,196, 62, 77, 45, 25,125,224,216,229,143, 73,219, 25,119, 9, 97, 86,199,221,248,254,124,121, 34, 26,141, 38, +185,123,143, 15,172, 40,174, 84,114,241,247,221,237,184, 52, 5,189,145,192, 96, 36, 48, 22,140,141, 74, 21,188,193,208, 52, 5, +194, 16,140, 27, 55, 22,221,123,124,160,100, 12, 76,156,249, 15, 57,122,239,217,139, 55, 29, 53,122, 6,107, 54,237, 92,170,200, + 78, 93,250, 58,220, 62, 42, 47, 59,109,134, 42,229,133,217,227, 96,208, 32, 77, 99, 95, 61,158,176,239,228, 29,212,243,247,131, +145,201, 47,167,143,187, 20,251, 78,221,129,175,143,111,126,185, 25, 2,239,234, 50, 52,107,218, 12, 0, 42,101,180,184, 66,249, +194,246,189, 70, 44,233, 61,232, 19, 56, 57, 58,130, 38,250,222, 23, 79,237,235,189,107,235,234, 47, 13,234,156, 53, 22,137, 17, + 99,225,239, 2, 97,152, 42, 71,157,220,220,220, 28,155, 53,251, 51, 29,163,193, 96,128,151,151, 23,226,227,227,125, 42,243,158, +230,234,234,218,107,209,162, 69, 78, 61,123,246,228,185,184,184, 0, 0,146,146,146,170,157, 61,123,182,241,162, 69,139, 82, 18, + 19, 19, 79,161,156,140, 62, 70, 61,205,167,185,224,136, 68,146,252,125, 4, 69,207,154, 50,178,129,179,171,155,166,180,245, 83, + 83,147, 4,179, 39, 95,166,184, 92,126,193,250,160, 9, 97,168,114,162, 68, 93,120, 60, 94,169, 53, 20, 58,142, 85, 11,194,179, +254,148,230,208,249, 23,171, 65,159,154, 25, 19,226,103, 65, 36, 46,128, 39,224,255, 48, 96,200, 39,173, 6,246,239, 7, 87, 71, +107, 92,188,241, 16, 19,167,204,212, 27,116,250,117,149,122,120,112, 56,220,148,148,148, 40, 91, 91, 91,151,170,255,222, 82, 53, + 47,156, 59,227,116,241,143, 75,115,215,110,216, 56, 73,167, 53,232, 25, 66, 10,199, 49, 22,139,133,188,174,189, 7, 91, 57,213, +110, 33,218,184,232, 83,222,191, 48,162,181,227,173, 24, 45,129, 88, 62,120,193,236,169,162,111,126,189,131, 83, 91, 38,166, 41, +115,210, 28, 11,223, 20,172,108, 66, 20, 57, 89,141, 43, 83, 66,153,163,119, 75,138,195,157, 64,113, 56, 82,138,166, 4,140,145, +137, 53,104,181,203, 84,233, 47, 18,171,186,247, 12, 67,240,191, 91, 41,150, 25, 32,130, 58,123, 15,254,230,244,127,246,206, 58, + 60,138,227,255,227,239, 61,215,184, 39, 36, 1, 66, 66,176, 0,193,221, 61, 56,197,165, 56,133,210, 66,105,129, 66,177, 2,165, + 80,188,180, 64, 41, 80,164,184, 6,119, 43,154, 64, 32, 64, 18,136,251,197, 46,231,126,243,251, 35,210, 64,163,208,254,190,149, +121, 61,207, 61,201,222,237,189,111,118,119,118,247,189,159,249,204,140,155,189, 0, 58,163, 5,195, 70,140,198,158, 61,123,108, + 92,236,248,208, 25,204, 88,179,118,173, 82,149,112,198, 53, 33, 57, 47,181,107,223,217, 23, 99,227,101,207,146,210,117,135,170, + 90, 54,189,209, 2,133,198, 12,141,158,133,128,250,205,176,102, 93, 29, 97, 82, 98,220,236,221,187,118,204,124,254,156,189,199, +202,102, 45,213,165,191, 72, 46,245,164,115,111,208,195,214,193,233,215,129, 83, 86,216,199,200, 56, 32, 48,226,181,173, 16, 67, +199,205,180,245,115, 23, 65, 34,100,219,199, 37,166,122,204,249,252,243,219,177, 22,210, 92,145, 21, 27, 87, 81,121,170, 87,175, + 62, 40, 36, 36, 68,252,217,103,159,113,189,189,189,177,107,255, 97,223,118, 61, 62,232,155,150,158,233, 77, 8,129,155,171,107, +242,164, 15, 63, 56,125,246,236,217,196,228,228,100,238,234,213,171, 91, 28, 63,126,188, 94, 70, 70, 70,165,159, 76, 45,132, 64, +167,183,192, 82,120,131,204,202,215, 87,217,159,122,121,121, 9, 82, 83, 83,245, 37,162, 12,204,239,129, 66,166, 71,151, 14, 45, + 56,219,206,197, 67,165,179, 64, 34,228, 34, 62, 83,131,166,141,131,152,159, 44,230, 70,165, 9, 78, 24,218,103,161,155,148,244, +236,215,170, 38, 92, 29,196,216,249,253, 10,156,186, 27,215, 51, 83,197, 96, 51, 97, 79,241, 16,112,186, 73,172,233,155, 59, 54, +173,229,222,185,137, 47, 30, 54,173,229,126, 51, 44, 42, 90,244,193,218,143, 83, 85,220,203,121,231,103, 42, 75,191,240,176,224, +104,195,195,207, 23, 18, 33, 22,114, 32, 17,114, 32, 17, 20,252,101,177,152,247,123,170,245,168,235,205,182, 90, 38,176,217,156, + 9,195,135,126,224, 57,114,248, 7, 4,108, 22, 14, 31, 61,221,127,223,190,189,233, 38,163, 97,135,133,197,254,185,172,250,243, +198, 14,101, 1,174,118,124,124,190,227, 25,108, 69, 92,216,136,185,176, 21,115,209,185,161, 11,216,239, 62, 8,140,195,212,254, +126,189,167, 14,172,222, 41,208, 71, 26,240,228,117,254,243, 9,203, 31,109,184, 46,239,244,233,247,235,235, 57,169,228, 6,206, +162, 57,147, 56, 41,105,105,157, 14,159,190,209,217, 98, 24, 31,101, 54,170,191,204,138, 56, 92,106, 84, 56, 37,234,110,176, 87, +203, 33, 66,163,202,244,244, 73, 84, 74,173, 60,189, 0,145, 9, 10, 72,132, 28, 72,139,246,173,144, 3,137,144, 11,169,144,131, +180,148,120,228,170,217,183, 83,157, 88,157,112,227,174,185, 42, 5,215, 25, 45,120, 28,167, 66,245,192,198,240,240,240,132,161, +247,168,234,247,175, 30, 61,249,224,198,137,111, 52, 25, 47,191,172,172,206,254,208,123,152, 55,107, 74, 24, 3,132, 23,222,164, +131, 23,173,218,210,100,217,188,233,111,188, 55,103,233,166, 38,239, 30,201,178, 89,216,121,224, 71, 75,219,117, 27, 8,101,110, + 38,126,187,120, 8, 61, 66, 6, 99,212,248, 79, 96,111,239,188,102,221,242, 47,158,152,245,138,171,127,184,230,186,215,105, 27, +212,160,238, 62, 47, 79, 79,111,171,181, 96,150, 15, 66, 0,149, 50, 31, 95,124, 58, 9, 86, 66,208, 40,184,121,103, 97,187,110, +132, 20,206, 6,146,157,147,173,142,122,249,188,171, 78, 22,117,191,210,251, 82,167, 51,101,101,101,225,241,227,199,136,142,142, + 70,100,100, 36,114,114,114, 96,103,103,167, 82,171,213, 85, 10,222, 55,108,216,112,228,213,171, 87,133, 14, 14, 14,197,111, 26, + 12, 6,216,216,216, 96,228,200,145,220,238,221,187,123,245,233,211,103,236,179,103,207,246, 3, 80,148, 90,158,220, 87,105, 54, +110,129, 91, 59,116,236, 48, 13, 0, 68,182, 30,113,155,119,157,142, 44,247,129,214,206,211,183,117,235, 54,181, 64, 8, 24,144, +141,154,156,232,140,114,162, 68,146,123,247,238,249,177,217,108,206,239,247, 32, 43,126,216,121,176,206,165, 91, 79, 7,173, 90, +243,157,208, 86, 34, 64, 86,190, 1, 19, 71, 13,172,244, 61, 88,228, 22,216,187,117,235,246, 39,151, 45,253,138, 35,149, 72,112, +241,126, 44, 62,254,244,115, 93,122,194,179,239,136,149,187, 69,147, 21, 45,123,207, 91,229,159,210, 61, 46,160,154, 20, 54,253, +122, 8,167,142,233, 39, 52,152, 44,144,171, 77,208, 27, 45,176, 88, 9,242,213, 38, 60, 79, 82,194,217,182,234, 83,185, 17, 66, +154, 1,112, 1,144,197, 48,204,195,146,203, 69, 15,116, 69,222,248,173,229,236,194,251,131, 19, 0, 3, 10,122,234, 23, 87,159, +194,229,178,222, 47,250,254,115, 0,117, 11, 53, 45, 0, 30, 48, 12,147, 87,134,217,250, 67,148,139, 19, 26, 26, 74, 66, 66, 66, +138,175,248,111, 47,191,141,128,199,245,148,216,185,128,144, 23, 40, 57,129,177,171,187, 87,206,119,235, 54, 56,206,248,104, 74, +162, 66,158,235, 91,248,246,229,202,220, 44, 56, 12,123, 93,135, 54, 45,187, 79,251,232, 35, 4,250, 85,227, 89, 44, 22,242, 44, + 58,206,180,251,231,157,227,110,222,229,111, 80,164, 60, 91, 88, 34, 4, 89,165,110,159, 22,171, 37,229,237, 8,150,197,106,121, +251,233,246, 15,154, 12, 3,216, 75,249,216,122, 46, 30,132, 0, 12, 8,236, 36, 92, 28,184,158,130,184,176, 99,138,144, 70, 10, +245,200, 85, 75, 58,119,234, 61,243,234,243,215,186, 67, 50,153,238, 2,128,140,242, 52, 75,191,160, 91,161, 55, 90, 96, 50,155, +113,228,244,105,244,236,220, 2,173, 91,183, 64,251,118,173, 57,143,194, 34,198,127, 52,109,146, 55,126,239,221, 81,172, 41,116, +243,111, 38,181,115, 62, 52,104,218,106,155,167, 41,102,112,216, 64, 77,119, 17, 28,109,120, 48,152, 25, 36,100, 25, 11,207, 28, +123,124, 60,103,169,227,188,217,211,206, 42,178,248, 13,128, 23,198,242,182, 93,163,209,240, 71,143, 30,205, 53,153, 76,198,145, + 19, 63,233,158,145,145,213,255,135,141,223, 10, 92, 93,221,160,209,153, 17, 22,249,170,238,178,101, 75,107,158, 62,127,253,196, +146,207,167,158,236,217,179,167,221,193,131, 7,173, 21,237,207, 55,158, 16, 51,179,191,223,185,239,200,158,245,223,173, 68, 84, + 98, 30,126,222,182, 5,196, 98,222, 90,193,174, 42,169, 73, 70,143, 30, 45, 58,113,226, 68,181,148,148, 20,133, 70,163,201,122, + 35, 30,193, 98, 56,153,185, 26, 56,219,240,193,227,176,224,230, 32,132,171,157, 0, 92, 54,192, 98, 24, 75,105,154, 63, 31, 58, +179,220,170,201,199,169, 95, 13,195,119,126,191, 2,227,103, 44,192,179,108,254,121,150,216,110,249,244,225,131,230,185,136, 44, + 61, 61,237, 89,174,157,155, 84,135, 68,200,195,252,153,163,209, 60, 44,193, 53, 85,110, 93,144,165,101, 55, 94,122,190,120,178, +238,203,111, 6, 71, 10, 34, 88, 54, 98, 46,206,239, 91, 35, 83,231,103,229, 23, 53,201, 25,244,186,196, 74, 86,227,203,165, 60, +217,206,107, 28, 84,127,197,180,201, 19, 88,109, 90, 53, 39, 44, 22, 23,217, 74, 3, 67, 8,240,233,199, 83, 49,125,234, 36,247, +228, 52,217,162, 45, 91,182, 46,188,122,137,124,173,206,122,185,164, 60, 77, 22, 83, 16, 5,146, 10, 57,144,138, 10,140,139, 84, +200,129,206, 96, 1,195,128,109,239, 19,156,207, 20, 68,114,211,114, 19,203,124, 2,127, 67,211,209,167,254,149, 75,113, 54,117, +242, 14,229,221,141, 79,139, 92, 30, 22,145,249, 0, 64,174,119,123,251,177, 70, 51,129, 74,103, 70,124,166, 6,102, 35, 97,198, +247,242, 69,141, 33, 76,224,202,157,225,123,206, 69,192,182,196, 69,255, 13,205,212,123, 71,116, 78, 13, 6, 14, 91,191,105,219, +195,239, 86, 44, 96,103,231, 27, 96, 37, 4, 66, 62, 27, 34, 62,167,240,197,134, 86,157,143, 45, 63,254,148, 97, 6, 51, 8, 55, +110,152,171, 82, 63, 97, 37,163, 6,246,110,127,128, 1,248, 12,139,151,226,233, 91,221,183, 75,223,113,194, 46,253, 70,195, 98, + 54,204, 11,187, 69,174,105,100, 81, 87, 42,163,217,160, 94, 93, 48, 64,184, 90, 22, 61, 21, 0, 36,174,181,183,214, 9,172,211, +228,237,247,252,253, 3,155, 84,230,184, 23, 71, 74,133, 54, 51, 28, 28, 93, 22, 4,214,111,236,154,153,167,103,108,156,170, 33, + 62,230, 49,126,253,113,209, 94,171,206,176,244,202,153, 67, 43, 54,252,124,124,104,151,158, 3,177,243,135,111,231,231,164, 23, + 27,173,203, 37,162, 85,163,118,239,216,238,205,229, 11, 96, 50, 91, 97,178,144,130,191,102, 11,114,115,243, 96, 50, 91, 33, 20, +219,192,108,101, 96,178, 88, 97, 50, 91,161, 55,152, 37, 83, 71,247,249, 72, 7,220, 47,173,156, 94,117, 58, 92,224, 9, 4,190, + 4, 5,115,215, 18, 66, 16,159,161,101,121,120,120,236, 7, 0,129, 64, 0,129, 64, 0,171,213,138,176,168,172, 25,206,129,181, +167,161,208,224, 89,140,134, 68,121,194,157, 30,101,109,187,187,187,123,223,183, 77,150, 78,167,131, 74,165,194,173,187, 15,237, +118,236, 57,210, 51, 62, 49,197,207, 74,236,244, 54,174,126, 61,148,178,216,190,101,237, 79,101,102,212, 71,182, 45, 39,177, 62, +155, 62,214,127,211,238,208, 7,175, 46, 44, 47, 55, 79,171, 70,151,185,134,207,166, 12,110,186,106,227,207, 49,121,119,182,206, +170,232, 24,113, 56, 28,110, 86, 86, 86,241,249,189,249,167, 95,155,134, 71,165, 14,216,176,126,131, 48, 44, 86,137,167,241,105, + 24,219,213,167,224, 9,167, 18,199, 93,226,230,231, 92,179, 86,173,253, 91, 54,174,226,196,164,233,240,253,177, 7,184,122,114, +235,173, 12,217,253,158,200, 76,215,190,203, 53,228, 79, 48, 90,101,106, 94,139,200,134, 74,103,134,222, 96,134,201, 74,160,208, +152, 32,147, 27,160,208, 24,161,210,154, 49,182,155, 79,169,223,171,192,143,184, 48, 12, 19, 74, 8, 9, 33,132,116, 5,192, 47, + 90, 46,184,103, 51,161,133,134,236,141,229,121,243,230,125,249,205, 55,223, 68, 22,173, 91,244,126,209,186,229,189, 95,226,251, + 78,243,231,207,111,176,106,213,170,149,173, 90,181, 58,240,219,111,191,197, 1,200,171,108,243, 33,167,228,198,132,134,134, 86, +180,163,253,140, 38,163,192, 86,196, 69,205, 26, 62,248,240,203,157,206,191,172,154, 32, 19,242, 57,236,115,231,206, 57,230, 24, +164, 96,177,216,149,126, 68,145,186, 4,180,230,241,248,103,214,174, 93,139,225,125,219,137,146,178, 77,170,136, 36,109,166,218, + 0,179,171, 75,109,254,242,149,171,164,171, 86,175,153, 30,122,202, 42, 87,101, 62, 95, 83,122, 19, 95,211, 71,108,166, 68, 14, + 22,195,128, 88, 45, 41,121, 9, 15,155, 2,192,251,228, 98,169,116, 38,176, 11,115,107, 24, 6,208,232,204, 96,179, 25,153, 60, +234,208,243,145, 95, 47,239,188,247,192,165, 52,194,178, 87,170,213,241, 98, 20,204, 57, 88,101,116, 6, 11,244, 38, 11, 34,159, +132,161,125,203,122,104,221,180, 14, 52, 58, 11, 52,122, 51,106,212, 10, 4, 0,231, 82, 15, 28,155, 21, 71, 44, 38, 29, 33, 22, +155,144,102, 46,112,181,231,195,195, 65, 0, 1,159, 3,147, 25,208, 26,172,208, 25, 44, 72,144,105,161,212,138, 16,212,225,131, +154, 78, 30,143,244, 25, 9,162, 19,185, 73,143, 6,149,107, 78, 45, 22,236,222,127,196, 63, 45, 45,179,255,217, 19,251, 4, 89, + 10, 19, 34, 18,212,144,201,245, 0,219, 5,139, 87,126, 47,152, 59,107,242,128,221,191, 30, 77,236,210,174, 69, 98, 85,183, 89, +147, 21,181,247,208,225, 35, 91, 67, 66, 6,136, 34,239,159, 69,204,227, 43, 43,212,178, 42,229,103,177, 26, 53,106,100,158, 60, +121,178,114,229,202,149,222,167, 78,157,170,145,149,149,245, 24,128,201,222,222,190, 78,109,127,223, 39, 23,207,159,243,234, 51, +224, 3,110, 74,182, 22,118, 98, 30,124, 93,197,184,123,235,130,137,207,231,150,154,111, 82,216, 60, 56, 2, 93,190,192,169,187, +113, 61, 35,115,132,215, 39, 77, 24,155,120,241,102, 84,206,230, 61, 23,191,245,146,154, 30, 11,173, 89,155, 31, 53,173,229, 62, +239,227,209,248,102,211, 94,220, 8,139,146,169, 89, 30, 43,210,245,230, 75,101,135,210, 1, 14,155,129,141,136, 11,181, 34, 43, +255,117,248,249,218,127, 82,152,122,236,197, 19,123, 89,185, 74, 19,146,179,117, 76, 90,174, 18, 22, 43,129,189,152, 7,179,149, + 64,158,155,205,236,219,187, 7, 15, 31,222,101,129,205,154, 8, 96, 73,185, 59,148, 41,104, 42,148, 10,185, 5, 17, 33, 81,193, + 95,147,197,138, 64,255, 90,216,190,121,157,173,179,171, 27,218,182,175,124,110,180,141,147,111,163, 3,187, 54,227,250,111,225, + 29,111,108,248,190,153,212,211,101, 19,195, 88,190, 3,129, 78,111,180, 32, 95,158, 7,190, 33, 25,205,189,178,224, 40,182, 32, + 65,225,129,103, 25, 49,210,138, 46,248, 57,207,142, 63,102,200,128,133, 71, 78, 95,253,166, 71,183,142,120,150,160,128,136,207, +129,144,207,134,144,207, 6,151,177, 96,221,143, 91, 77,121,249,202,144,156,200,147,217,239, 80, 63, 47, 23, 62,253, 22,152, 59, +139,202,101,239,166,133,191, 76,250, 98,117,143,158, 3,199, 49,207, 30, 94,251, 82, 3, 92,169,220,131, 30,169,212,123, 86,107, +229,239,113, 66, 27,231,141, 51,231, 46,159,217, 61,228, 3,176,217, 28,152, 76, 38, 28, 61,184, 23,187,190, 95,252,210,160,202, + 25, 7,192,106,144,177, 39, 31,218,251,227, 7, 95, 44, 90,199, 52,104,212,188,197,181,244, 63, 78, 71,107,101, 51,219,198, 76, +152, 50,204,205,205,205,230,247,136, 22, 65,237,192,122,232,221,111, 48, 46,156, 60,142,231,145, 17,176,146, 2,195,100,181, 18, +200,243,114, 50,204, 38,195,238, 50, 91, 60,132, 66,223,157,187,246, 4,176, 88, 12,140, 38, 43, 12,102, 43,102,125,244,161, 97, +234,167, 95,182,237,221,189, 67, 36,159, 13, 69, 66, 82,186,253,221,240, 23, 65, 86,174,212,123,194,156,117, 60,157,222,130,124, +141, 9,103,127, 46,219,235, 8, 29,124, 90, 85,111,210,123,194,212,175,182, 11, 4,108,150,177,126,109,239,184, 14, 45,235, 39, +251,120, 58, 43,151,173,250,190,249,237,251,225,189,135,142,156, 32, 28, 91,167, 9,227,233, 36,178,249,112,228,192,134, 22,179, +113,140, 38, 55,185,204,241, 5,185, 98, 7,185, 79, 13,127,205,239, 17,163,218,199, 24,130,154,111, 56, 15, 6,113,218,204,232, + 65, 0,224,225,233,163,227, 10,108,149, 85,136,192, 16, 0,216,244,211,175, 77,159, 68,167, 77, 90,191,126,131, 56, 44, 86,137, +199,177,249, 16,240, 88, 48,154,172, 96, 42, 25,212,182, 18,246,148, 5,243,231,217,230,169, 45,184, 30,145,133,200, 71,215,136, + 65,165, 27, 41, 54,219, 14,130,171,205, 24, 0,181, 0,188,102, 24,178, 77,157,233,126, 18,184, 97,174,106,189,183, 90, 11,158, +151,109, 93,252,106, 90, 56,130,222, 92,190,164, 21,195,144,250, 12,129, 3, 64, 82,115, 11,239,169,149,117,106,234,204,104,172, + 94,185, 8, 27,119, 28, 71, 90,142, 14,118,150,100,156,252,121, 57, 62,251,102, 63,180,250,178,179, 26, 42,242, 35,165, 25,163, +183, 13, 87,209,255, 69,235,125,243,205, 55, 33,111, 29,155,144, 50,142,217, 31,214, 43,250,254,170, 85,171, 86,150,248, 92, 83, + 89,147, 85,108,180,138, 54,170, 2,179, 85,219,197,195,247,183,147, 39,142, 57,228,169,140, 16,242,216,240,169,225,143, 37,155, + 79,186,244,106,234,140,108,163, 29,126,221,254, 93,174, 78,163, 60, 88,169,139,133,107, 96, 11,145, 84,114,246,216,209,227,240, +243,113,229,237,187,149, 27, 31, 30,167, 45, 14,245, 42,178, 18,249, 53,108, 53,156, 65, 3, 7,138,175, 92,189,246,169, 10, 40, +213,104,177, 25,118,181,159,246, 28,117,181, 17,113,193, 48,128, 82,107,198,164, 49,131,223,255, 54, 70,172,236, 9,227,198,130, + 41, 52, 89,138,156, 12,124, 57,247, 35,157,196, 20,243, 60, 41, 33, 41,181,107,223,207,174, 40, 84,140,110,216,232,143, 30, 62, +143,254, 38, 79,163,121,183, 73,126,244, 6, 11,244, 70, 43, 98, 99, 95, 99,214,216,110,224,178, 89, 96,179,173, 5,201,210,230, +178, 43,163, 42, 45, 58, 23,238,188, 33,123,215,206,248,201,211,205,213, 73, 42, 17, 17,169, 88,192,212,175, 19,192,107,217,178, + 53,191, 70, 96, 67,222,173, 23, 90, 36,101,105, 17,151,150, 15,129, 91, 99,206,240,206,189,176,119,195,156,142,185, 73,143, 88, +248, 99,146,226, 27, 92,186,126,175,239,142, 31,215, 11, 50,229, 70,188, 76, 82, 33, 35, 79,135,244, 60, 61, 50,114,117,144,138, +184,104,223,111,178,224,204,201,109,125,187,180,107,177,233, 93,182, 59, 46, 46,254, 76, 66,106,250, 7, 13,131,155, 99,239, 47, +187,218,217,219,215,176,149,203,227, 21,149, 61, 58,203,151, 47,231,175, 90,181,138,179,121,243,102, 69,203,150, 45,221,231,207, +159,223, 67, 38,147, 61,168, 94,189,122,224,133, 99,187,175, 54,110,223,191, 25,172, 70,151,118, 29, 58,241, 4, 86, 14, 46,134, +134, 26, 15, 29,220,151,163,213, 42,167,150,107, 56,196,118,203, 51, 85, 12, 92,188,188, 34,165,124, 75, 55, 14, 75, 30,157,119, +126,230,158, 60,224,152, 95,207,143, 47, 95,123, 20, 21,221, 52, 44,193,245,106,216, 43, 89,174,198, 88, 59,246,252,103,229, 94, +120,217, 12, 3, 46,155, 5, 27, 17, 7,172,194,171,170,212,179,225, 43, 48,140, 75, 81,228,148, 1, 83,248, 23, 96, 24,164,229, + 37, 61,174, 68,206, 6, 67,172, 4,136, 74, 81, 67,165, 43, 8,205, 87,115, 22, 35, 43, 51, 5, 63,108,218,141,240, 71, 15,209, +189, 87, 63,108,249,105, 31, 38,141,249, 64, 87,209,211, 15,139, 85, 24,209, 42, 17,205,146,138, 56, 0, 24,200,213, 38, 28,189, +157,140, 90, 53, 89,149,190, 49, 0,128,141, 84,140,124,165, 22, 44,158, 13, 94,135,157, 21,159,187,118,127,254,194,175,215,127, +158,151, 30,145,244,234,233, 45, 4, 58,231,163,166,151, 17,145, 25,182,120,148, 83, 3,129,254,126, 96,241, 30, 86, 74, 59, 59, + 50,104,245, 73,214,209,144,166,141,235,181,242,117,181,135,214, 96, 41,140,106,177,177,107,231, 30, 36,196,167, 76,200,121,126, + 50,252,207,112,180,106, 89, 92,150,192,213,127,250,211,251, 87,226, 6,142,156, 14, 15, 47,159, 70,242,164,199,149, 78, 91,168, +204,123,150, 74, 26, 45,158,216,126,254,172, 5,223,206,236,222,103, 8,238,221,186,130,199,145,175,209,162, 69, 51,244, 26, 48, + 28, 74, 69,110,157,195,123, 54,116, 51,107,148, 23, 56, 2,243,204,230,173, 59, 51, 86,139, 5, 49, 47,159,189, 46, 77, 75,155, + 30,245,248,110,122,148,237, 27,205, 83,206,117, 26, 73,237, 28, 31,235,141, 22,164,166,166,224,206,111,215,131,181,233, 81,143, +171,178,191, 4, 60, 54, 46,134,203, 96, 52, 89, 97, 52, 91,209,190, 67, 55, 3,143,165,111,183, 98,253,206,150,233,105,233, 44, +137,173,179,213,209,171, 46,207, 67, 96,212, 63,137,205,231, 25, 77, 86,248,121, 74,202,213,116,241,244, 95, 57,103,206,172,186, +108,158, 8, 74,181,222,144,158,150,234,190,253,215,107,170, 23, 47,159,122, 85,115,181,179,253,118,195, 54,158, 66,199, 64,150, +175, 71,174, 82,193,140,156,242,133,231,142,239,191, 25, 85,158,209, 42, 37, 93,164,230,153,139,183,234, 56,216,240, 24,149,206, +108,205, 81, 24, 45, 35, 7,188, 95,167,203, 66,147, 53,121,253,186, 13,226,240, 88, 37,158,196,230, 67,200, 99,131,207, 99,193, + 96,178,162,146,167, 19,203,221,213,125,106,235,166, 65,184,240, 56, 27,108, 54, 11, 90,101,158,134,131,156,232,166, 29,187,139, +155, 52,111,137, 78, 29, 59,224, 85,116,148, 79,232,169,163, 93,238,222,185,145, 97, 54,214,158,161,206,138, 62, 94,165,192,130, + 70,195, 54,241,221, 63,244,240,170,222,102,208,240, 15,237,124,125,188, 24, 87,103, 39,152, 9, 7,147,199, 12,174,244,153, 95, + 96,204,129, 85, 95,207,135, 94,111,128,139, 61, 31,132, 0, 59, 55, 45,129,193, 96,128,167,147, 0,249,234,178,103,147,171,200, +143,148, 21,133,170, 82,238, 73, 9, 51, 86,222,251, 12,195,132,206,155, 55,239, 75, 0,100,222,188,121, 95, 22, 45,127,243,205, + 55, 90, 0,105, 21, 52, 29,110,127,195,104, 21,109, 92,217,103, 55, 47,208,217,201,227,238,197, 11,231,237, 78, 60,177,226,222, +241, 71,232,211,194, 3, 60, 14, 11, 98, 59, 79, 60,137,207,199,153, 99, 63,202, 79, 30,216,150,170,215,235,215, 84,220,214,236, +223, 84, 42,150, 92,248,101,239, 65,171,179,147, 19,235,135,139, 89,177, 57, 74,115,113,147, 86,244,253, 83,214, 71, 23,182,123, + 16, 48,231,133, 66,161,191,193, 96,112,168,232,192,238,188,152, 88,152,196,203,252, 25,215, 86, 48,108,182,101,239,190,189,112, +182,229, 67,111,178, 98,222,231,159,104,199,118,151,202, 71, 14, 29,222,185, 83,239,153, 87,185,146,128, 43,173,131, 3, 72,227, +198,141,229,108, 54,187, 82,169, 20,174,174,174, 75, 88, 44,214, 8, 62,159,111, 99, 48, 24,148, 6,171, 78,172,214, 25,160, 51, + 2, 26,141, 14, 92, 94,129, 89,228,178, 25,104,117, 6,104,180,134,242, 79,140,140,103,183, 1,212, 86,148,136, 41, 93,121,225, +199,223,127,248,228, 39, 67,134, 14, 91,232,213,104,128, 52, 62, 61, 31, 60,198,136,102,117, 61,112,237,252,113,146,146, 16, 61, +171, 34,147, 5, 0,178,172, 92,111, 23, 23, 55,132,199,169,144,154,163, 69, 70,161,201, 74,207,211, 67,169, 85,162,161,175, 39, +228,249,249,222,239,188,127,129,227, 23, 46, 92,248,160,119,255, 97,152,249,249,210,182, 63,255,248, 93,132,132,207, 29,175,206, +140,185, 94, 25,163,245,236,217,179,220,185,115,231,214,250,233,167,159, 88,163, 70,141,210, 6, 5, 5, 9, 71,143, 30,221,118, +207,158, 61, 66,177, 88,168,125,114,235,212,194,137, 31,207,235,191,125,227,242, 70,121,121,121,140,217,100, 58,103,204,203,155, +167,170,192,204, 37,159,250,242,229,226, 88,227,184,110,237, 92, 78, 57,138, 89,245, 5,196, 48, 28,117,151, 28,196,139, 37,198, +216,243,155,149,162, 15,214,126,156, 38,183, 46,208,177, 92, 87, 84,100,178, 0,128,197,102, 96, 48, 91, 96, 35,226,130,197, 98, + 21,153,120,143, 93, 7,207,137, 93,236,248,224,178, 89,224,176, 25, 40, 52, 38,100, 43,140,152,254, 97,255, 74, 63, 9,152, 45, + 4, 90,131, 25,154,194,167, 67,165, 34, 27,243, 63,159,141, 94,125, 7, 98,226,212,217,200,211, 2,143,226,148, 48,154, 76, 21, +158, 20, 44,134, 5,141,222,140,241,221,125,145,171, 50, 66,173, 53,195, 96,182, 66,204,231,128,203, 97, 65, 34,228,192, 86,204, + 5, 8,225, 21, 93, 76,184, 92,174,206,100, 50,237, 45,231,137, 30, 53,188,221,160, 53,177,208,124,216,119,232,218,170, 54, 34, +111, 31,229,220,184,247,180,230,167,159, 47,192, 39,147,250,226,200,203, 90,112,116,245,133, 84, 34,130,137,176, 0,144, 74, 38, +236, 45,177,178,140, 3, 71,108,253,105,103,212,178, 69,243,132,114, 53, 3, 1,143,141,171, 87, 46,227,238,253, 71, 27,179,159, +159,220,139, 63, 17, 46, 97,185,217,218,218, 66,200,103,195, 96,212, 27, 42,159,186, 64, 64,128, 96,137,107,237,173,133, 79,252, +193, 22, 43, 74,121,175, 98,163,197, 17,218,206,155,241,249,178,149,221,251, 12,193,197,208, 35, 56,124,228,160,165, 85,207, 9, +236,125,187,126, 68,219,174,253,208,182,251, 48,156, 59,190,103,182,218,202,212,155, 60,115,225,215,237, 59,247,198,197, 51, 71, +144,153,145,178,182,178,229,101,115,153,153,157,187,245,133,206, 96, 65,187, 46, 33, 56,127,250,248,199, 40,236,100, 81,249,155, +216, 91,215,103,176,204,179,103,205,228,202,228, 6,110,150,194,128,148, 44, 13,226, 51, 53, 56,121,224,103, 82,249,235,133,161, + 89,251,134,213,184,147, 87, 95, 77,246,174,230,161,231,234,181,162,232,215,177,117, 38,126, 56,150, 91,211,191, 14, 75,150,175, + 71, 86,190, 30,217,249,122,168,116,102,248, 87, 11, 96,153,204, 76,171,170, 30,103,103, 59, 62,119,203,233, 56,216, 74,184,104, + 93,231,221, 59,218, 90,173,214,223, 77,214,250, 2,147, 21, 17,151, 15, 1,143, 13, 1,143, 5, 1,143, 13,179,133, 84,234,193, + 69,228, 90,187,247,244, 25, 31,121, 26,204, 64, 78,190, 1, 28, 54, 3, 87,103, 7, 73,179, 70, 35,176,243,187,143, 1, 0,147, +230,254,128,137,227, 71,163,110,253, 32,200,243,242,220, 71, 12,233,189, 30,192,241,202,150,245,236,197,235, 62, 23,111,134,207, +157, 62,103,177,116,104,223, 78,236,199,177,249, 72,207,213,227,117,180,178, 74,145, 55, 0, 48, 91,172, 32, 32,216,125, 48, 20, + 34, 62, 7, 89,249, 70, 16, 66,176,124,243, 33,216,136,184, 72,207, 43,104,238, 47,143,114,253, 72, 57, 17,169, 42, 68, 27, 67, + 80,144,203,229, 82,217,136,214, 55,223,124, 19,249,205, 55,223,148, 26, 33, 43, 97,178,222,109, 82,105, 30, 79, 82,199,214,201, +249,222,197,243,103,109,142, 63,177,224,218,147, 28, 12,105, 87, 13,170,220, 36,172,249,124,104, 46, 3, 98, 96,177,217,114,189, + 86,115, 76,171, 85,175, 0, 96, 44,183,210,184,215, 14,150, 8,165,151,183,108,255,197,236,236,234,138,189,183,114, 83,242,212, +102,211,239,205, 86, 38,230,209,133,237, 53,205, 86, 83, 79, 93,230,171,135, 21, 61,137, 91, 9,120,223,252,120, 18, 0,129,213, +106, 5,177, 90,193, 21, 74, 37,206,126, 45, 51, 11, 47,116, 66, 14,139,209,149,188, 2, 16,171, 57, 37, 59,174,252, 48, 40, 3, +192, 78,204,197,193, 27,169, 0,144,201, 86,134,189, 24, 57,180,160,185, 80,103, 16, 42,234,215,170, 69,154, 53,107, 38, 23,137, + 42, 53,252, 21,219,205,205,237,193,194,133, 11,235, 76,156, 56, 81,192,231,243, 97, 54,155, 29,183,109,223,110,221,190, 98, 18, + 6,125,188, 5, 60,190, 0, 90,157, 17, 92, 46, 7,121,249, 42,200, 21, 26, 40, 53,166,170,215,160,216, 88, 67, 22,176,250,196, +113,254,192, 30,210,134,205,249, 44, 30,154, 4,122,224,218,133, 19,228,222,249,157,147,180,178,232, 95, 42, 89, 17,161,210,153, +144,150,163, 67,106,142, 14, 25,121, 58,100,228,234,145,145,167, 3,195, 48,208, 25,204,239,117,227, 82,203,162, 14,239,253,101, + 71, 63,189, 17,195,219,119, 31,136,217,139,183,248,238,221,186,234,114, 28, 97,181,169,100,162,173, 37, 50, 50, 50,225,195, 15, + 63,108,244,235,175,191,178, 27, 52,104,160,125,241,226,133,184,208, 68, 26,165, 82,177,232,231,239,191,185,208,188,121,243, 3, +169,209, 47,175, 22,182,167, 87,120, 97,247,237, 48, 78, 32, 50,134, 79,246,145,180,238,225,231, 46,134,143, 68,217,163,142,244, +201,154,156,206,159,172,204,186,186, 81,150,174, 55, 95,202,210,178, 27,167,170,184,149,202,193, 51,233,117,137,131,134, 12, 7, +155, 97,193,168,211, 36, 22, 85, 46, 87, 59, 62,150,236,123, 9,169,144, 11, 27, 17, 7, 82, 17, 23,109,235, 57,162, 10,215, 51, + 98,178, 88,161,209, 91,160,213,155,161, 51,152,225,236,237,128,159,246, 30, 70,146, 76,139,147, 15,179, 17,149,168, 68, 64, 53, + 9, 8,169,248, 50,105,181,152,212,125, 7,143,178, 97,179, 24,176, 89, 12,171, 94,157,218,200, 85, 25,193,227,176,192, 19,138, + 32, 17,112, 96, 43,226,130,199,227, 66, 38,147, 65,175,215,195,199,199, 71, 88,190, 21, 36,176,145,138, 16, 80,211, 19, 70,147, + 25,103,111, 62,199,138, 89,131,208,173,125, 83, 48, 92, 41, 94,234,131, 97,227,104, 3, 43,139, 5,163,217, 10,131,209, 2,128, +165, 43, 75,207,219,219,187,179, 68, 34,145,104, 52, 26,101, 82, 82,210,245,140,168,227, 73, 22,118,255,201,231, 47, 94,221, 27, +210,171, 27,194, 35, 34,113,228,248,169, 91,217, 78,249,115,138,190, 83,191,126,253,150,206,206,206,210,156,156, 28,197,179,103, +207, 30,188,235,115, 1, 97,177, 62,109,213,182, 35, 84,114, 25, 50,147,227, 43,253, 20, 93,215,215, 6, 95,125,179,165, 73, 96, +237,192, 38, 22, 82, 96,188,234,249,216,224,179,197,155,154,212, 10,168,221,164,168, 67, 72, 93,159,242,135,101,227,136,109,186, +143,153, 56,251,155,126, 67,198,225,234,197, 83, 88,183,226,243,189, 18, 59,151,186,142, 14,118,141, 27,180,236,142, 91,151, 79, + 65,104,227, 14, 7, 39,247,182,163,198,207,232, 58,100,212, 20,220,189,117, 25, 27, 87,125,185,199,162, 87,238,175, 76, 89, 37, +174, 53, 93, 26, 5, 55, 31,105,227,232, 6,121,190, 18, 54, 14,174,168,219,176,217,200,231, 79,244,115,213,178,184,172,119, 54, + 29,132, 64,111, 36,200, 83, 25,145,156,165, 69, 66, 70,129,209,178, 90,171,144, 19,100,177, 50, 82, 33,135,227,104,122,229,243, +244,242, 85,226,235,237,198,172,254,250,115,182, 17, 66,100,201, 11, 76, 86,150,194,128,172,124, 3, 84, 58, 19, 28, 37, 28, 88, + 45,214, 42, 63,117,231,169,140,176, 17,115, 97, 39,230, 85, 58,202, 88, 26, 63,238, 58, 24,248, 36, 58,109,192,186,117, 27,196, +143,227, 74,152, 44,110, 65, 52, 75,192, 99,195, 98,181, 2,149, 56,227,185, 28,238,204,254,189,187, 34, 57, 91, 91,208,107,153, +197, 32, 32,168, 57,156, 69, 86,116, 25, 54, 15, 0,208,183,119, 65,106, 91, 92,186, 26,167,239,101, 1,111, 38,118,151,127, 45, +214,106,217,219,247,157,249,244,240,161, 3,118, 58, 11, 7,219,206, 37, 64,163, 55, 67,200, 99, 67,192, 99, 67,196, 99,191,145, +143, 93,177,209, 42,200,185, 75,202, 54, 65,163,211, 65,161, 53,129, 0,120,240, 74, 5,173,193,140,124,181, 9, 45,235, 56,188, + 95, 32,132, 97,206, 16, 66,250,188,109,136,222, 54, 75, 37, 34, 82,165,105, 60, 44,169, 81,180,126, 89, 70,174,100,206, 22,128, + 42,245,224,226,188,237, 28, 75, 46,243, 36, 14,117,237,108,236,238,157, 63, 23, 42, 61,254,196,138,235, 17, 5, 38,203,164,205, +198,218,185, 35, 82, 20,242,236, 78, 0, 98, 43,251, 99, 98,231,186, 13,133,124,193,213,111, 55,108, 51,186,186,121, 89,143,221, +147,203,242, 53,150, 55,220,132, 69,175,103, 17, 43,225,233, 50, 95, 85,170, 13,129,197, 98,140,139, 63, 30, 8, 43, 33, 88,178, +225, 48, 86,206, 25, 6,169,104,148,152, 97, 24,177, 90,103,198,172,165, 59,176,246,171, 9, 54, 98, 1, 7, 12, 83,144, 19, 53, +102,248,192,202, 85, 64,157, 25,175,239,255,170, 82,198,133,190, 40,217, 92,216,162,109,175, 71, 45, 90,180,144, 59, 56, 56, 64, + 36, 18,253, 30,169, 40, 3, 55, 55,183,175, 22, 47, 94, 28, 56,117,234,212,226,193, 62, 57, 28, 14,166,127,244, 17,203, 98, 33, + 56,119,110, 39, 92,170, 7,227,212,165,123,232,217,185, 25, 84, 26, 29,114,229, 74, 88,193,126,231,138,168,148,103, 95,205, 72, +120,218,188, 77,167,190,184,126,225, 4,185,119,238,231, 73, 85, 25,163,199,193,209, 33, 57,236,233,235,186, 12,227, 88, 16,209, + 42, 52, 89, 6,147, 21,190,110, 98, 36, 39,188,134,189,157, 93,114,101,245, 68, 46,129,253, 25, 22,153,202,128,236, 84,103,198, + 28, 6, 64,212,233, 47, 70, 28,222,191, 61, 34,242,217,227, 21, 33, 35,103,114,186, 15,249,136,189,245,155, 25, 95, 2,168,236, +192,123,198,168,168,168,231, 19, 38, 76,104,125,247,238, 93, 11, 0, 13,195, 48, 38, 54,155, 45, 54, 24, 12,188, 78,157, 58,229, +191,124,249,242, 6, 74, 79, 90,124,131,182, 31, 30,118,102, 4,202, 94,124,171,113,132,175,141,178, 91,167,118,173,208,170,190, + 55,146,219,181, 2,128,153,137, 42,105,160,174,214,142,131, 38,179,232,236,214, 93,167, 87, 78, 26,214,117,214, 94,206,146,117, +233,161, 75,202, 77, 68, 77,126,113,163, 71,105, 54,158,195,102,193, 70,196,133, 84,196,129,141,136, 11, 27, 33, 23, 38, 51,169, +202,147, 35, 49,153,173, 5, 17, 45,131, 25, 42,173, 25, 87, 31,103, 34, 35,223, 0,185,210, 8,173,209, 2, 2, 82,240, 52, 90, +137,171,121,214,171, 59,246, 69,119, 82,123,159,224,252,237,155,191,179, 61,122, 59,165,184, 71,159,157,152, 15, 27,113, 65,111, +236,155, 55,111,194,201,169,226,167,125,171,213,138, 35,231, 31, 96,221,238,171, 56,191,243, 11, 8,121,108, 52,236,191, 20,227, + 6,180,128,149, 88,241, 58, 42, 50, 51,160, 94, 35, 55, 22, 75, 4, 22,195, 64,111,178, 2, 32,101,238, 79,131,193,224,148,148, +148,164,240,247,247,119,247,244,244, 28,194,102,179, 9,148,143,245, 39, 14,228,106,174,132,238, 23,171,181,122,139,216,156,191, +211, 63, 93,219, 7,254,254, 96, 24,134,216,218,218,242,174, 94,189,170, 10, 10, 10,114,121,199, 83,137, 37,114,173,189,113,226, +180, 79,135,212,242,243,195,225,253, 59, 65, 8,115,180,178, 95,222,119,250, 46,190,158,255,102, 15,195,207, 22,111,106,178,118, +233,204, 55,222,155, 54,127, 93,185,189, 14, 69, 2,233,156, 65, 35, 38,227,209,131,223,176,102,233,103, 7,244,170,220,113, 38, +179,233,131,220,244,184, 3, 53,235,181, 0, 49, 42,113,241,208,119, 24, 54,122,146,160,123,200, 16,220,189,117, 25, 43,191,156, +182, 79, 35,151,125,136, 74, 38, 57, 91, 9,119,106,167, 30, 3,184, 90,189, 17,155, 86, 47,194,148, 57, 43,208,178,115, 95,238, +179,199,247,166, 2, 88, 86,233,116, 8,163, 5,157,130,156, 11,204,179,201,138, 83,113,108, 78,105, 53,144,195,102, 88,141,253, +236,161, 53,152,161,168,224,161,146,195,227,102,200,243, 21,213,191, 95,249, 41, 91,173, 51, 35, 43,223, 0, 89,190, 30,217,242, +223, 13, 86,118,190, 30, 89,249, 6,112, 57, 12,162, 99, 19,193,226,114,170,156,159,151,167, 50,161,121,109,135,130,115,244, 29, + 91, 71, 76, 28,219, 22,231,111, 60, 25,180,110,221,122,225,147,120, 37, 34,226, 20,133,145, 44, 54, 4, 92, 22,248,133,255, 91, +172, 5,185,145,229, 97,235,226, 87,115,236,152, 81, 93,108,165, 34,164,197,200,192, 97, 23, 12, 17, 99,231,234, 13, 59,129, 14, + 51,166, 77,134,179,147, 61,146,178,245,216,120, 60, 26, 17,207, 95,193,170,173,218,102,111,218,118,160,231,196,233,159,217,179, +184,124,236,185, 16, 95, 80, 78,182, 5, 47,239,157,214,165,189,126,170, 86, 41,114, 8,136,165,146, 57,200, 12, 49, 91, 10,170, +219,202, 37,243,112, 96,247, 15,184, 16, 38, 43,174,129,183,143,174,197,167,243,151, 35, 91, 97, 64,105,245,178, 60, 63, 2, 32, +171, 68, 36,234, 15,203, 37,204, 81,105,203, 76,225,178,161, 12, 13,195, 91,230,202,240,214,251,134,183,244, 74, 27,251,111,123, +133, 77,135,127, 48, 69,246, 46, 13,196, 66,201,111,231,206,157,150,156,136, 32,197, 38,203,168,201, 38, 43,102,246, 77, 81,200, +179,186, 87,201,100,185, 4, 52, 16,136, 5, 55, 22, 46,223,168,119,243,170,110, 62,251, 88,145,163,212, 89,204,127,204, 65,144, + 88, 36,118, 46, 58, 14, 95,176,142,171, 53, 44,202,206,126,161,174, 40,242,100, 37, 4,161,247, 51, 64, 72,193, 35,210,161,155, +169, 40,124, 50,135,197, 90,208,172,114,233,177, 12,156,194, 60,148,202,134,191,127,220,246,131,162, 79, 80,190,122,228,202, 37, +197,205,133, 45, 27, 21, 68,178,108,109,109, 97,111,111, 15,169, 84,138,138,154, 14, 25,134, 25, 51,113,226,196, 63, 60,253,203, +100, 50,116,237,210, 9,155,127,248, 9,141,186,140,197,165, 59, 23, 96, 52, 89,209,176,158, 31,170,123, 58, 32, 57, 83,249, 78, + 39,186,196, 45,112,122,243, 78, 3,190,108,219,185, 47,174,158, 63, 70,238,157,223, 53,185,170, 3, 33,246,233,218,250,244,215, + 95, 47,169,185,112,197,247, 2, 27, 33, 7, 47, 84, 6,176, 24, 6,190,110, 98, 56, 73, 88,184,126, 98,143,110, 88,223,214,149, + 30, 28,207,219,219,107,239,218,205,219, 37,107, 87, 45,237,244, 40,140,185,170, 74,139,206, 5, 0, 77,102,212,234,151,192,243, +106,191, 93, 60,219,168,195, 64,184,121,250,117,139,203,124, 89,105,179, 1, 64, 19, 27, 27, 27,183,112,225,194,192, 85,171, 86, + 17, 54,155,109, 5, 32,216,176, 97,131, 38, 38, 38,230, 49, 10,186,230,162,162,155, 77,151,110,245,103, 73,249,150,150,142, 98, + 86,125, 63,119, 49, 90,213, 47,104, 21, 29,214,167, 45,188,125,124, 16,155,161,105,156,171,177,114, 85, 6,182,223,150,109, 17, + 15,107, 56,179, 39,153,181,134,231, 0, 78,190, 67,179,105,113,130,124, 81, 52,203, 70,196,133,181,160,174, 84,201,104,233,141, + 22,104,245, 22,104, 13,102,168, 13, 22,104, 12, 22, 88, 73,193, 57,193, 48, 12,140,102, 43, 42,245,216,252, 86,221,183,117,116, +134, 95, 13, 6,182,226,130,178,217, 22, 14,247,192, 0,112,114,114,130,171,171,107,165,162,162, 6, 99,193, 41,110, 48, 89,139, +155,245, 13, 70, 51, 8, 33,136,142,142,250, 34, 33, 46,174,191,127,128,127,251,122, 13, 27, 57,138, 5, 44, 0, 40,211,104,105, + 52, 26,139,141,141,141,171,163,163, 35, 43, 53, 53,181,216, 60,251, 55,238,100, 62,126,236, 40, 6, 13, 26,168,122,241,224, 73, +113, 23,119,173, 86,203,180,105,211,198,214,219,219,155,165,215,235, 21, 85, 61, 76, 18,151,218, 3, 28,156, 28, 87,140,249,112, + 74,237, 78, 93,123,226,218,149,139, 56,121,236,215, 95, 52, 89,209, 23, 43, 43, 18, 24, 88,231, 15,189, 14,107, 5,212,254, 67, +175,195,234, 53, 3,202, 53, 90,245, 26, 54,107, 65, 24, 14, 46,132, 30, 34, 58,150,113, 26, 0,171, 69,167, 60,116,240,199,175, +150,141,152, 58,191, 86,239,126, 35, 48,102,244, 56,112, 56,108, 92,191,116, 26,107,151,206, 62,163,202,151,141,173, 76,154, 64, + 65,232,173, 46,207, 75,228,253,137, 79,173, 6, 8,187,119, 11,175,163,159, 69, 62,121,120,183,190,127, 80, 75,184,120,250,126, +146,232,204, 94,133, 23, 47,140, 21,201, 24,116,186,196,113, 99, 71,163,100,175,195, 86,193,129, 78,204,219, 39, 0, 0,141, 82, +102,252,249,187, 89, 49, 69,189, 14,173, 70, 67, 98, 89,186,249,121, 89, 71,174,223,185, 63,167,127,159,158,172,108,133,161, 32, +130,149,111, 40,124,233,145, 93,244,191, 66,143, 0, 79, 41,162, 34,195,172,186,252,236,163, 85, 60, 47,117,227, 62,232,241,188, +168,238, 90,173, 4, 12,160,171,114,179, 20,215,118,242,234, 53,235,132, 79,226, 84,136,136, 87, 20, 52, 21,114,217, 5, 6,139, +203, 42, 54, 93, 5,189,217, 43,136, 14, 49,236,149,227,199, 14, 71,182,194, 8,171, 21,224,176, 89,133, 47, 30,146,148, 12,146, +149, 26,100,231,101, 33, 46, 33, 17,242,140,215, 96,177, 88,112,246,172, 93,233,145,164, 45,132,239,161, 49,144,160, 33,125,218, +115,142,253,150, 14,177,128, 3,189, 50, 19,231, 14,126,151,165, 87, 41, 86,104, 53,170, 99,149, 25,207,241,247, 20, 4, 38, 75, +161,210,185, 9,184,108, 28,222,253, 61, 62, 24, 55,237,141,171,239, 23, 11,190, 6, 88, 12,114,243,148, 96, 24, 38,171,106,215, + 37,230, 97,121,203,239, 24, 25,123,111,141, 82,204,214, 31, 31, 20,202,126, 26, 37,231, 46,158, 63, 45,185,157, 32,192,131,168, +244, 66,147,149,101, 93,254,113,159, 20,101,126,110, 15, 0,209, 85,123, 46,100,245, 24, 54,126, 78,164, 95,237,122,250,107,207, + 84,241,114,181,169,204, 60,135, 86, 67, 22, 70, 62, 58,179,185,119,190, 41,246, 35,137, 71, 61,139,213,108, 94,173,205,138, 94, + 90, 70,211, 33,127,233,198,195,197,205,134,115, 87,237, 41,248,223, 98,129,133, 88, 65,172,192,140,175,126,132,217,106,129,213, + 98,129,213, 66, 96,178, 16,113, 69,197,117,245,172,126, 44,239,229,161, 58, 35,151,253,177,185,208,222,222, 30, 78, 78, 78,112, +114,114,130,173,173,109,133, 70,139,203,229, 74, 57,156, 55,119,117, 98, 98, 34, 18, 18, 18, 96,107,107, 11, 98, 53,193, 96, 2, + 26,180,236,142,167,175,159,225,242,237,199, 32, 86, 11, 36,210,170,207,242, 34,113, 11,252,168, 89,199,254,223,119,238, 55, 1, +151,142,109, 35, 15,111,158,158,162,149, 69,239,168,116,132,222, 98, 97, 76, 38, 19,250,116,239,152, 24, 30,249,234,252,130, 57, + 83,123,182, 14,153, 34,104, 21,232, 5,157,193,130,148,132,215,184,126, 98,151,174,118, 77,143, 11, 93,218,181, 72, 52,153, 76, +176, 88, 44, 21,222,200,117, 6, 99, 54,155, 43,146, 12, 31, 62,146,251,240,193,131,163, 18,151,128,195, 22,134,245,132, 33,214, +134, 12, 33,131, 26, 54,172, 11,163,201, 10,141, 70,145, 87,213,109, 86, 42,149,113, 59,119,238,172, 57,118,236, 88,113,189,122, +245,184,175, 95,191,198,218,181,107,115,148, 74,101, 92,101, 53, 46,222,140,218,192, 97,242, 98,138, 34, 90, 73,109, 91, 97,120, + 72, 91, 28, 56,115, 27,215,111,221, 69,162, 74,250, 88,101,230,156, 72, 78, 76,211,215,119, 84, 28,237,215,170, 58,251,240,238, +188,163,145, 29,231, 13, 37, 68,112, 49,251,198, 18,117,229, 79,110, 64,169, 53,193, 86, 92, 48,222, 83, 81,100,139,205, 48,149, +118, 68, 12, 16,119,235,110, 88,131,166, 1,245, 16, 30,151, 15,153, 92, 15,173,222, 12,171,149,192, 10, 2, 39, 27, 62,132, 60, + 22,146, 18,226, 96, 37,198,248, 42,222, 42,178, 58,180,239,192, 1, 24, 48, 12,225,112, 57, 28, 16, 20,140,175, 40, 18,137, 84, +174,174,174,149,138,104, 25,205,102, 12,234,217, 2, 45,155, 53, 68,255, 41, 5, 99,102, 94,249,101, 30, 28,164, 92, 28,216,187, + 3,201, 55, 55,236,173,217,106,234,197,103, 79, 35, 7, 71,134,255, 54,178, 87, 19, 81, 99,119, 78, 26,175,172, 48,169, 90,173, + 62, 10,128,207,227,241,122,182,111,223,222,241,232,209,163,114,103,103,103, 43,159,199,203,234,215, 55,196,202,229,241,114,139, +214,189,115,231, 14,119,202,148, 41, 54,121,121,121, 73,153,153,153,119, 1,152,202,127, 16, 12,236, 10, 22,126, 5,195, 8,165, + 34,113, 98,141, 26,126,158,205, 90,182,176, 27, 48,232, 3, 8,248, 2, 92,186,120, 30,155,214,175, 58,164, 74,127, 49,190, 42, +123,242,207,234,117,152,146, 20, 31,167,209,234,131, 26, 52,237,200,220,186,120, 98,166, 17,206,235,217, 2,227,119, 93, 7, 77, +171, 21,151,166,194,166,111,190,128,131,157, 4,241,175, 95,106, 99, 94, 60,253,209,164, 83,124, 81,105,147, 5, 64,156, 99, 25, +220,106,116, 79, 7,189,209,130,155, 87,207,232,172,102,107,207,187, 55,206,190,174, 86,187,153,176, 65,179, 46, 14,217, 39,119, + 12,210, 0, 7, 42,210, 73,125,249,199, 8, 46, 49,200,227,175, 92,189,108,231,230, 91,159,205,128,129, 81,175, 67, 86,236, 67, +179, 38,243,165, 66,145,250,172, 82,189,112,115,146,241,213,252,197,223,126,212,172,105, 83, 9,129,240,141, 8, 86,145,193,202, + 86, 24,224,108,195,135, 86,145,133,152,135,231,117,154, 44,118,185,227,157,153, 13,106,113,182, 44,147,255,123, 58, 67,116,203, +242,214,207,150,101,242,205, 6,181,184,226, 91, 29, 27,182, 18, 62,158,198,167, 22, 39,190, 11,184, 5,185, 89,124, 46,187, 56, + 79,171,232, 90, 80, 1, 29,121, 66,123,164,230,232,192,128,192,106, 49,195,108, 50, 64,169, 80, 32, 53, 45, 3,153, 25,153, 80, + 42,229, 16, 75, 29,208,160,113,115,216, 72,132,120,114,253, 16, 8, 33,149, 26,215,208,196,112, 3,155,181,108, 39,120,150, 80, +144,139, 37,228, 18,156,254,117, 85,142, 74, 33,107,167, 74,143,137,169,234,181,216,108,177, 92,142,120, 30, 83,191,154, 71, 13, +230,241,235,124,236,253,105, 51, 12,133,145, 77,147,201,130,103, 73,106,164,231,106,144, 20,251,130, 88, 45,150,203,248,143,192, + 41, 59, 0, 8, 78,195, 6,117,209,125,212, 0,252,240,195,143,136,141, 75,176,174,152,217, 59, 73,165,148,247,170,130,201,234, +138,194,177, 54, 52,153, 81,171,181, 14,205, 82, 78,133,231,178,180, 6, 82,110,130,143,208,197, 23,237,198,175,189,160, 85,230, +242, 45,122, 13,231,244,222,241,191,150,166, 89,224,160, 97, 88,241,217, 48, 72, 69, 28, 48, 12,131,162,230,194, 45, 95, 79,134, + 88, 80,208,182,172,213,155, 49,106,214, 58,236, 93, 55, 27, 4,192,136, 15,110,107,202, 42, 39, 10,230, 46,156,225,129, 7,213, + 18, 19,100,169, 93,251,126,118, 69,103, 20,232, 67, 6,142,125,212,180,105, 83,185, 72, 36,130, 72, 36,130,173,173, 45, 28, 28, + 28, 96,111,111, 95,225,182,155, 76, 38,149,193, 96,112,226,243,249,176, 90,173,136,143,143, 71,124,124, 60,242,243,243,145,149, +149, 5,181, 74, 97,126,112,229, 48,167, 65,171,222,240,244, 11,130,111, 64, 35,112,217, 12, 56, 28, 22,174,159,250,169,172,114, +150,110,178, 58,244,219,210,165,255, 68, 92, 58,182,157, 60,188,121,122,170, 86, 22,253, 83,101,143, 81, 97,115,207,147, 65,131, + 6, 5, 77,153, 50,133,183,120,206,148, 11,103, 46, 94,143, 62, 28,186,189,111, 94,158,220,155, 16, 2,123, 59,187,228, 97,125, + 91,159,238,212,166, 89,226,149, 43, 87,172,191,254,250,171,158, 97,152,167,229,105, 22, 92,164,100,191, 92,185,124,117, 73,187, + 14, 29,177, 99,247,175, 29, 34,159,191,232,240,250,117, 12,188,125,253, 80,163,102, 0, 52,140, 3,174,222,184, 5,149, 92,246, + 75,101,202,249, 86, 84,139,201,203,203,251,109,216,176, 97,221,111,223,190,205, 26, 54,108,152, 38, 59, 59,251, 78,137, 40, 22, +169, 72,243,238,214,129, 89, 0,126,241,237, 48,238, 80,170, 81,254, 9,128, 85, 62,190, 62,184,126,235, 46,238,222,190,255, 99, +182,216,103,233,248, 81, 31, 78,174,222,143, 61,177, 95,171,234,108, 87, 7, 49,246,111, 95,203, 62,117, 55, 97, 93, 66,142,101, +199,170, 27, 75,190,174,204, 49, 42,190,113, 40,141,104, 83,215, 17, 38, 11,129,149, 20, 92,112,109,132,220,178, 46,188,127,208, +228, 24, 4,227,167, 78,153,242,186, 65,195,198,159,142,250,112, 42,175,177,159, 55, 30,188,146, 3, 12, 3, 71,119, 9,210,211, +211,113,243,200,118,115, 94,234,203, 31,217,108,235,178, 42,236, 79,228, 37, 62,246, 47,177, 56, 57, 59, 59, 27,215,175, 95, 71, +145,193,114,113,113, 41,203,104,189,161,153,147,153,118,231,235, 53,219,218, 76, 26, 51, 16, 33, 29,235,227,198,195,215, 48, 20, +142,215, 84,212,149, 60,238,238, 86,254, 39,195,252, 12, 31, 13,170,173,208,154,248, 9, 95,197,231,223, 68,193, 28,172,214, 50, +202,105,200,205,205, 61, 21, 21, 21,213,182, 81,163, 70,213,207,158, 61,155, 27,121,255,194,204,146,133,248,236,179,207,164, 63, +252,240,131,152, 16,114,199, 96, 48,196, 86,106,219, 89,216, 31,246,232,145,147,209,100,197,173,251, 79,234,118,105,211, 24, 86, + 2, 60,124,248, 16, 59,126,222,161,123, 26,241,248, 59,117,166,251,178,114,204, 75,169,251,211,242,126,189, 14,139, 53,211, 83, + 19,190,187,116,230,200,222,102, 29,250, 98,228,140,101,203,174,159,249,117, 73,147,118, 33,172,186,205,186, 35,236,238, 85, 92, + 62,123,254, 91,163, 42,119, 9, 42,206, 29, 41,181,156, 2,145,248,227,122, 77, 58, 32, 41, 49, 1,241, 49,207,126,209,229,190, + 74, 75,124,205,254, 37, 45, 37,113,106,205,250,109,112,251,194,129,153,229, 24,173,114,235,188,183,139,104,251,217,208, 83,195, + 83, 82,182,186,171,181, 58, 1, 33, 68, 39,224,115, 50,164, 44,229, 65, 69,165,203,249,194,152,149, 86,125,208, 7,163,166,158, +217,180,105, 61,215,205, 94,140,140, 60, 29, 20, 90, 35,148, 26, 35, 88, 12, 3,127, 79, 9, 52,202, 92,220, 56,178,198,100, 80, +229, 13, 3, 94, 27,203,210,148,184, 6, 46,207,123,117,117,198,103,211,174,129,111,231,237, 89,163,243,252,114,163,117,202,212, +199,125, 63,155,118, 58,144, 16,210, 69,226, 26,168, 84,203,162, 22,150,181,237, 12, 83,112,126,143,236,228, 13,163,185, 96,252, + 49,179, 21,176, 88,173,133, 81, 62,128, 20,183,231, 51, 21,108, 59, 99, 61,120,230, 14,210, 50,229,208, 26, 76,208, 27,204, 48, +154, 44, 96,177,217,176,119,176, 71, 64,141, 96,216,217,219, 34, 51, 35, 13,119,175,156, 66,116,196,141, 59, 12,193, 82,109, 86, +204,149,202, 28, 35,158,200, 62,208,195,211,157,149,174, 48, 64,196,103,227,241,141,179, 70,147, 65,255, 93, 37, 77,214, 31, 52, +229, 57,185,235, 62,157,243,249,136, 93, 59,119,187, 7,213,180, 69, 74,182, 22, 41, 89, 58, 40,117,166, 66, 35,102,133, 94,149, +141,136,171,187, 51, 44, 58,229, 58,252, 71, 40,211,104,153,141, 58,229,209,243, 15,156,230, 45, 89,195,126,245, 58,214,180,252, +147, 62, 41, 90,149,162,119,149, 35, 89, 37,216, 53,189,230,129,191, 98, 35,254,208, 92, 72,172,176, 18,130,211,247, 51,138,155, + 11,173,133,153,151,225,175,203,159, 70,176,228,220,133, 29,123,207,188, 20, 17,165,220,167,213,102,218,189,124,245, 93, 30, 0, +176,217,236,226, 87, 81,110,150, 78,167, 51, 84,208,132,178,231,167,159,126,154, 59,117,234, 84, 65,114,114, 50, 94,191,126, 13, +185, 92, 14,161, 80,136,243,231,207,155, 96, 53,127, 23,113,251,120,124, 84,216,197, 69,129, 77,187, 87, 11,106,213, 27, 98,177, + 4, 28, 82,249,100, 76,177,107,237,225, 77, 59,244,251,190,203,128, 73,184,124,252, 39,242,240,198,169,105,218,172,232,237, 85, +221,151,114,185, 60, 18, 64,204,119,223,125,215,120,199,142, 29, 53,231,204,153, 19,187,231,251, 37,155, 0, 32, 39, 39, 7, 0, + 16, 30, 30, 78,166, 77,155,166,215,233,116,113,121,121,121, 97,168,160, 3, 4, 0,104,179,196, 43,119,108, 89,213, 32, 57, 53, +125,160, 95,131,230,112,169,217, 28,238,254, 45,144,167, 52,226,193,171, 52,196,190,184,130, 23,183,142,156,213, 72,205, 75, 80, +197,241,141, 27, 53,106,228,205, 98,177,106,168, 84, 42,247,122,245,234, 53,146, 72, 36,225,141, 26, 53, 10,230,112, 56, 41,143, + 30, 61, 74,168,138, 86,226,141,221,122,223, 14,227, 54, 38, 42,109, 58,197,102,104,130, 19,149, 54,225, 26,129,221,236,172,171, + 27,245,187,216, 94,235,136, 49, 59,242,240,110,197,209,253,219,215,178, 71, 77,254,204,242, 44,223,225, 19,142,136,127,169,106, +225,106, 86,250, 71, 99,251,255, 62,188, 67, 97, 36,171,240,255, 74,133,233,243,243, 35,242, 1,204,141,120,206,253,254,217, 39, + 83,190,110,216,172,205,232,246,189,134,177,204, 60, 41, 46, 28,223, 74,226, 34,174, 30,230, 16,203, 2,109, 37,102, 3,168,176, + 57,200, 96,168,140,201,250, 99, 25,147, 37, 29, 15,255,250,243,184,163,199,143,125, 51,160, 95,127,167, 45, 95, 13,197,154,109, + 39, 32, 17, 9, 64,172, 86, 12,237,228, 61,100,209,196, 58,125,189,221,132, 94, 71,175,165,220,156,177,254,217, 92,141,198, 24, + 93,137, 72, 12,201,206,206,190, 37,149, 74,179,218,182,109,219, 82, 32, 16, 48,217,217,217, 28, 87, 87, 87,179,157,157,157, 33, + 37, 37, 69,163,215,235,143, 2,168,210,176,227, 70,147, 21,241,153, 58,156, 60,118, 20, 79,238, 95,193,139, 23, 81,202, 23,207, + 95,108,102, 56,100,189, 58, 51, 38, 23,168,242, 3, 62,172,165,246, 58, 36, 85,238,117,104,209, 43,247,239,249,113,121,103,141, + 78, 63,174, 81,235, 62,168, 94,183, 13,203,104,178,224,233,195,107,184,118,100,253, 26,163, 42,119,222,251, 28, 99,207,106, 53, + 3, 8,155,143,223,174,159, 1,177, 90,127, 4, 0, 98,181,254, 24,126,251,236,212, 22,189, 39,194,209,181,122, 35,121, 82, 56, +131,119, 24, 61,156,199, 97,169,207, 29,221,117, 60, 62, 62, 30, 47, 95,190,196,171, 87,175,144,155,155,139,253,251,227,171,116, +124, 52,121, 9,151,162,159,179,122, 12, 30, 58,242,244,144,225, 99,132, 53, 3,130, 88,129,213, 28,224, 36,229, 32,234, 85, 2, +162, 31, 69, 88,163, 30,156,213, 25, 21,178, 1,218,188,132, 50,141,159,216,185,174, 27, 96,153, 87, 52,119, 97,171, 86,109, 2, + 63, 95,241, 77, 75, 39, 23,215, 82,175,227, 57, 89, 50,254, 23, 51, 78, 5,222,189,247, 91,165,230, 58,180, 90, 44, 57,147,199, + 13,179,178, 11, 38, 10, 69,113,156,186,112,239, 21, 60, 76, 21,188, 79,172,230, 10, 35,248, 31, 14,108, 7,179,213, 10,181,214, + 8,133, 90,143,124,165, 14,233,178, 28, 60,137,136,192,141,211,167,240, 58,234, 73,156,201, 96,184,200, 98, 49, 71,180,153,209, + 55,170,214,210,196,169,233,228,232,136,184, 92, 21,132,124, 14, 18,162, 31,233,213,138,252,125,239, 90,143,180, 57, 49,233, 50, + 54,211,125,216,176,225,231, 59,247,232,103,215,172,117, 87,177,179,173, 61,120, 28,130,152,248, 52,132,221, 57,175,142,125,114, + 83, 97, 50,168,122,254, 25,179,190,252,205,169,184,215,161, 81,175,238, 59,162,127,135, 99,108, 54,135,111,181,154,245, 70,131, +126,240,251,152,172,191, 10, 66, 44, 41,227, 70, 12,124,227,217,192,108, 37,162, 17, 31, 92,208,150,124, 86, 48, 89,136,120,196, + 7,119, 52, 5, 23,144,178, 19,251, 60, 60, 28,251, 20,205, 93,152,152,152,243, 48, 55, 87,127, 13, 64,138, 78,167,123,231, 50, +102,102,102,126,189, 98,197,138, 16,141, 70, 83,167, 99,199,142, 2, 91, 91, 91,228,228,228,224,226,197,139,166,208,208,208,231, + 50,153,108, 17, 32, 51,107, 17,252, 75,132,238,248,216,168, 71, 23, 23,213,105,218,163, 90, 80,235,222,149,191,152, 9, 68,147, + 58,247,155,192, 92, 62,241, 19,121,112,253,196, 71,218,172,152,109,239,177, 91,141, 58,157,238,190, 78,167,123,182, 96,193,130, +102,110,110,110,110,139, 22, 45, 18, 42, 20, 10,238,150, 45, 91,116,217,217,217, 25, 10,133,226, 46,202,201,167,249, 35,225,166, +252, 84, 12, 58,119,244,167, 78,228,232, 79,221,236,157,189,186,219,185, 84,171, 37,207, 74,141,203,207, 74,187, 8,224,114,225, + 64,145, 85,162,113,227,198,126, 12,195, 12, 3,208, 64, 34,145,248, 75,165, 82, 1, 33,164, 14,195, 48,145, 86,171, 53,162, 94, +189,122,161,207,159, 63,175,210, 96,178,137, 55,118,235,189, 3,219,252,154,171,177,242, 12, 44,222,175,137, 55,118,235, 1, 64, +118,233,115, 13,128,147,207, 59,206, 29,116,234,110,194,166,200, 60,187,153, 89,215,191, 57, 85,213, 50,231,167, 60,241,255,179, +234,191, 46,253,121, 10,128,113, 17,143,176,246,105,248,221,197, 12, 1,215, 2,243,114,173,236,213,163, 63, 67,159,203,229,234, +188,188,188, 74,237, 93, 40, 16, 8,116,122,125,121, 1,148, 27,102, 85, 58,118, 0, 29,118, 31, 59,180,123,220,137, 83, 39,191, +105,223,101,128,147,176, 90, 53,212,112,101,176,123, 94,147,153, 87,194,179, 30,244,251,252,230, 15,177,105,186, 8, 84, 49, 31, + 70,165, 82, 69, 3,200, 83,169, 84,253, 9, 33,201, 12,195,120,231,229,229, 61, 54,153, 76, 79,171,108, 8,172, 24,217,170, 85, +243,253, 12,195,112,136,217,186,250, 46,151,253,171, 46,253, 69, 10,222,115, 90,146,160, 26,182,152,181,104, 99,147, 90,254,181, +155, 20,205,117, 88,191,186, 13,166,204, 93,219,164,122,205,128, 38,191,207,127, 88, 97,154, 0, 49,105,242,198, 31,251,121,245, +205,240,123,215,190,116,246,168, 94, 61, 35, 37,246, 69,242,171,199, 95, 91,116,138, 99,239,123,156,227, 95, 69,174,223,241,221, +220, 57,233,169,113, 59, 52, 89, 49,207, 0, 64,147, 21,243,236, 69, 24,190,202,206, 72,153,147, 35,139,253,238, 93,247,133, 90, +173, 78,219,183,111,159,125,155, 54,109, 88,110,110,110,200,202,202,194,181,107,215,172, 86,171, 53,181,202, 90,185,113,215,212, +185,140,227, 47,219,190, 95,205,147,216,244, 54,155,205,158,132, 0, 28, 14, 39,221,160, 81,156, 87,178, 36,159, 35, 47, 65, 87, +254, 61,195,202, 0, 96, 21,205, 93,104,181, 90,153,213,155,118, 39,112,133, 54,165, 14,134,104,210, 41,197, 86,171,181,210,115, + 29,202,147,194,106,253, 89,231, 55, 67,200,210, 70, 77, 91,126,105, 50, 25,117,133,231,135, 14,128,142, 16,228,176, 88,204, 13, +182,213,116, 65,241, 30, 15, 83, 12, 3, 91,194,112, 96, 35,226,128, 1, 3, 85,126, 46,169, 74, 78, 86,169,134, 88, 22, 29,169, +145,117,240, 61,103, 56, 52,246,234,165,179, 31, 88, 44,150, 26,133, 49,131,120,189, 86,125, 88,149,238,240, 11,240,200,140,127, + 63,103,138,204, 22,243, 23,255, 80,165,154, 81,254, 78,154,129, 53, 69,253,171,121,185,141,141, 79,144, 61,136, 77,214,252,130, + 55,167,213,121,159,114,178,221,220,220,190, 98, 24,102, 52,159,207,151, 26, 12, 6, 53, 33,100, 79,102,102,230,215,248,195,228, +191,193, 92,145,171,118, 44, 95, 40, 94,104,212,169,127,211,200,162, 71, 86,180,237, 98,151,218,221,133, 18,201, 92,157, 86,189, + 71,147, 25,189,251, 79,222,159,118, 2,129, 32, 88, 42,149,114,179,179,179,239, 3,200,255, 59, 29,247, 70,141, 26,249,176, 88, +172, 26, 86,171,213, 13,128, 29, 10,122,133,100,115, 56,156,212,194,136, 22,169,170,102,219, 15, 15, 59,119,233, 86,127,214,197, +155, 81, 27, 10,155, 21,139,241, 26,178, 78, 56,186,119,167,207,126, 57,118,178,180, 94,135,255,184, 58,255,255,167,217,129, 35, +245,200, 30,199,226,219, 45,239, 18,168,211,100,167,165, 78,187,245, 52,235, 62, 0,229,251,148,147,199,227,141, 50, 26,141, 34, + 30,143,167, 53, 26,141,251,254, 46,219, 46,114, 13,156,192, 2,169,244,204, 20, 86, 48,143,222,234,180,242,111,169, 75,236,160, +160,160,118, 60, 30,207,199, 98,177,136, 13, 6,131, 70,171,213,198, 39, 36, 36,252,134,178, 39, 62,255, 75,203, 41,113, 13, 88, +207,227, 9, 62, 1, 0,163, 81,191, 81, 45,139,153, 85,222, 23,203, 89,255, 31,125,140,156,107, 52,141,225,176,185, 46, 40, 28, +152,219,106, 54,103,101,198, 61, 12,248, 31,150,243, 95, 7, 33,228, 47,255,141,174, 84,147,106, 82, 77,170, 89, 10, 44,186, 63, +169,230,255, 82, 83,232, 81,215, 91,232, 81,183,210,131, 46,151,177, 62,221,159,148, 34, 38,151,242, 2, 33, 4, 28,186,111, 40, + 20,202,255, 0, 43,221, 5,148,255, 37,186,244, 23,201,127,229,250,148,255, 28,101,230, 68, 51,229,184,210,170,132, 4,223,197, +217, 94,166,154, 84,147,106, 82, 77,170, 73, 53,169,230,127, 78,179, 34,237,127, 98,147,228,228,183,150,207, 0, 72,167, 77,135, + 84,147,106, 82, 77,170, 73, 53,169, 38,213,252,187,104,254,155, 40,110, 58,100,209,125, 65,161, 80, 40, 20, 10,133,242,215, 64, +115,180, 40, 20, 10,133, 66,161, 80,222,143,210,154, 14,169,209,162, 80, 40, 20, 10,133, 66,249, 19, 40, 51, 25,158, 54, 29, 82, + 40, 20, 10,133, 66,161,188, 31, 69, 17, 45, 15,148, 24,222,129, 26, 45, 10,133, 66,161, 80, 40,148, 63,143,116,148, 22,221, 10, + 13, 13, 37,165,253, 79,161, 80, 40, 20, 10,133,242,255,193, 63,220,139,148,140,100, 77, 46, 92,126,179,215, 33, 53, 88, 20, 10, +133, 66,161, 80,254, 46,102,235, 31, 70, 81, 36,171,232, 85, 60,105,118,177,209, 10, 9, 9, 97,168,217,162, 80, 40, 20, 10,133, +242,191,226,223,232, 69, 88,111,111, 32, 61,204, 20, 10,133, 66,161, 80,254,151,102,235,223,180, 61,116,120, 7, 10,133, 66,161, + 80, 40,148,247,195, 3, 64,159, 18,203,103, 80,162,249,144, 66,161, 80, 40, 20, 10,133,242,238, 76, 46,109,153, 16, 66, 35, 90, + 20, 10,133, 66,161, 80, 40,127,129,217,162, 80, 40, 20, 10,133, 66,161,252, 85,252,127, 76, 42, 77,103, 54,167,154, 84,147,106, + 82, 77,170, 73, 53,169,230,191,157,162,113,180,128, 18,227,104, 1,116,100,120, 10,133, 66,161, 80, 40,148,247,165, 15, 10,198, +207,154, 92,248,183, 15, 53, 90, 20, 10,133, 66,161, 80, 40,127, 46,127,152,126,135, 26, 45, 10,133, 66,161, 80, 40,148, 63,215, + 96,109,167, 70,139, 66,161, 80, 40, 20, 10,229, 47,134, 26, 45, 10,133, 66,161, 80, 40,148,191, 8, 6,101,247, 28,184, 92, 5, +157,119,233,125,112,153,106, 82, 77,170, 73, 53,169, 38,213,164,154,255, 57,205,138,180, 47,227,159, 71,209,200,240,103,240,123, + 34,252,118, 66,254,250,105, 27,105,215, 87,170, 73, 53,169, 38,213,164,154, 84,147,106,254,219,153,252,214, 95, 0,255, 63,227, +104, 81, 40, 20, 10,133, 66,161,252,215,204, 86,177,225,162, 83,240, 80, 40, 20, 10,133, 66,161,188, 31,219,203,250,128, 70,180, + 40, 20, 10,133, 66,161, 80,222,143,201,101, 45, 83,163, 69,161, 80, 40, 20, 10,133,242,215, 24, 46,106,180, 40, 20, 10,133, 66, +161, 80,254, 68,147, 53,185,212, 79, 67, 67, 67, 9,221, 71, 20, 10,133, 66,161, 80,254, 87,252,219,188, 72,241,240, 14, 69, 27, + 70,205, 22,133, 66,161, 80, 40,148,255,165,201,250,135,122, 17, 15,252,222,219,112,114,225, 50, 8, 33,180,215, 33,133, 66,161, + 80, 40, 20,202,123,210, 7,111,246, 60,156, 92,180, 76,141, 22,133, 66,161, 80, 40, 20,202,251, 51,185,220, 79,105,179, 33,133, + 66,161, 80, 40,148,255, 37,255,198, 28, 45,134, 30, 86, 10,133, 66,161, 80, 40,148,247,162,180,104,214,255,203, 92,135, 20, 10, +133, 66,161, 80, 40,255, 73,195, 69,141, 22,133, 66,161, 80, 40, 20,202, 95, 96,178,138,140,214, 95, 61, 96, 41,157,217,156,106, + 82, 77,170, 73, 53,169, 38,213,164,154,255, 21,147, 85,114,136, 7, 0,180,215, 33,133, 66,161, 80, 40, 20,202,251, 66, 39,149, +166, 80, 40, 20, 10,133, 66,249,139,160,147, 74, 83, 40, 20, 10,133, 66,161,252, 63, 27, 46,106,180, 40, 20, 10,133, 66,161, 80, +254, 68,147,245,134,217,162, 57, 90, 20, 10,133, 66,161, 80, 40,239, 71,153, 57, 90, 12,202,238, 57,112,185, 10, 63,240, 46,189, + 15, 46, 83, 77,170, 73, 53,169, 38,213,164,154, 84,243, 63,167, 89,145,246,101,252,243,153,140,255,167, 1, 75,105,215, 87,170, + 73, 53,169, 38,213,164,154, 84,147,106,254,215,152, 12, 20,140,163, 69,155, 14, 41, 20, 10,133, 66,161, 80,254, 4, 99, 85, 26, +212,104, 81, 40, 20, 10,133, 66,161,188, 31,116, 28, 45, 10,133, 66,161, 80, 40,148,191, 8, 15, 20, 68,181,138,254, 6, 83,163, + 69,161, 80, 40, 20, 10,133,242,231,208, 7, 5, 81,173,162,191,212,104, 81, 40, 20, 10,133, 66,161,252,137,148, 58,142, 22, 3, + 0,161,161,161, 69,253, 15, 59,134,132,132,220,160,251,138, 66,161, 80, 40, 20,202,255, 39,255, 70, 47, 66, 8,249, 61,162, 21, + 18, 18,194, 0,184, 78, 15, 53,133, 66,161, 80, 40,148,255, 5,255, 70, 47,194,122,203, 73,118,164,135,153, 66,161, 80, 40, 20, +202,255,130,127,163, 23,225,188,229, 34, 41, 20, 10,133, 66,161, 80,254, 39,252,131,189,136, 7, 10, 18,225,207, 20,254, 5, 10, +135,124,160,227,104, 81, 40, 20, 10,133, 66,161,188, 31, 69,189, 13, 39,227,173, 49,181,104, 20,139, 66,161, 80, 40, 20, 10,229, +253, 40,109,100,248,255,151,185, 14, 41, 20, 10,133, 66,161, 80,254,147,208,185, 14, 41, 20, 10,133, 66,161, 80,254, 28, 74, 70, +181,182,255,127,253, 40,157,217,156,106, 82, 77,170, 73, 53,169, 38,213,164,154,255, 37,147, 85,188,252,198, 56, 90, 20, 10,133, + 66,161, 80, 40,148, 63, 23,218,116, 72,161, 80, 40, 20, 10,133,242,126, 20,245, 56, 44,185, 76,141, 22,133, 66,161, 80, 40, 20, +202,159,104,182,254, 0,109, 58,164, 80, 40, 20, 10,133, 66,121, 63, 38,151,245, 1, 53, 90, 20, 10,133, 66,161, 80, 40,127,145, +225, 98, 80,118,207,129,203, 85, 16,126,151,222, 7,151,169, 38,213,164,154, 84,147,106, 82, 77,170,249,159,211,172, 72,251, 50, +254,121,252,207, 6, 44,165, 93, 95,169, 38,213,164,154, 84,147,106, 82, 77,170,249,159,132, 14,239, 64,161, 80, 40, 20, 10,133, +242, 23, 82, 21,163,229,194,225,112,190, 20,137, 68, 63,136, 68,162,109, 28, 14,231, 59, 0, 14, 85,253, 65,137, 68, 50,211,221, +221,253,165,187,187,123,138,143,143,207, 89, 27, 27,241,167,126, 2,180, 7,192,253,147,182, 39, 16,192,167, 34,145,232,133, 80, + 40, 76, 0,176, 23,192,167, 0,156,223, 71,248,107, 79, 12,126,246, 73,255, 19, 95,123, 98,240, 91, 31,245,113,115,115,187, 5, +160,251,159,117, 80,134,139,209,117,136, 4, 73, 67, 36, 72, 26, 46,126,247,167, 6, 27, 27,155,209, 30, 30, 30,119,157,156,156, + 82, 61, 60, 60,238, 8,133,194, 33, 85,148,112,117,115,115, 91,227,237,237, 29,237,233,233,185, 1, 5,179,147,255,109,105, 39, + 64,187,150, 2,100,181,226, 67,217,134,143, 31, 90,241,209,173, 27, 32,126, 71,185,182, 0,142,216,218,218, 62,230,112, 56,161, + 0, 6, 21,214,175, 65, 28, 14, 39,212,214,214,246, 49,128, 35,133,235,189, 75, 61, 93, 3, 32, 21,192,202,194,229,143,189,189, +189,149, 13, 27, 54, 76,104,216,176,225, 46,127,127,255, 49,149, 21, 19,139,197,221,188,189,189,143,250,248,248, 36,180,106,213, + 42,215,203,203, 43,170, 90,181,106,187, 5, 2, 65, 71,122,137,163, 80, 40,148,191, 63,125, 1,124, 3, 96,115, 68, 68, 68, 24, + 33, 36,140, 16, 18, 22, 17, 17, 17, 6,224, 7, 0,171, 80,118, 8,241,141,247,157,156,156,150, 46, 95,190, 92,151,158,158, 78, +178,178,178, 72,116,116, 52, 89,191,112,174,181,135, 35,135,248,185, 56,104, 60, 60, 60, 94,251, 86,171,118,160,190,148, 53, 23, + 64,173,202,104,150,192, 65, 36, 18,221, 95,184,112,161,234,214,173, 91, 42,131,193,160,178, 90,173,170,180,180, 52,213,229,203, +151, 85,109,218,180, 81, 1,152, 5,128, 93, 5,205, 98,150,121,226, 6,249,249, 43,178,204, 19, 55, 74,190, 95,167, 78,157,231, + 86,171,149, 12, 30, 60, 88, 15,192,171, 42,154,111,227, 5, 8,235,219,194,126,136, 20,153,230,221, 95, 19,178,101, 14, 25, 34, + 65,210,187,104,186,186,186,158,156, 57,115,166, 34, 53, 53,149,232,245,122,146,148,148, 68,166, 76,153,146,239,234,234,186,175, +146,219,238, 20, 20, 20,148,121,247,238, 93,171, 92, 46, 39,215,175, 95,183, 54,104,208, 32,179,146,102,171,235, 91,101,217,238, +233,233,121,182, 42, 47, 87, 87,215, 29, 85, 61, 70, 45, 4, 72, 50,134, 93, 35,228,225, 69,114,106,112, 43,178,190,105, 53, 50, +200,145, 47,111,203,199,199, 29, 74, 31,202,164, 44,205, 15, 58,116,232,160,126,250,244,169, 37, 39, 39,135, 60,127,254,220, 58, +105,210, 36, 29,128,200, 73,147, 38,233,158, 63,127,110,205,201,201, 33, 79,159, 62,181,116,232,208, 65, 13, 96, 98, 21,202,201, + 2,176,115,201,146, 37,132, 16, 66,150, 47, 95, 78, 26, 54,108, 72, 58,119,238, 76, 84, 42, 21, 33,132, 36, 16, 66,118,153,205, +230,113,149,209,180,179,179, 27, 61,115,230, 76,149, 70,163, 33, 69, 88,173, 86, 34,151,203,201,230,205,155,213,238,238,238,103, +203,120,200,160, 77, 30, 84,147,106, 82,205,191,155,230, 63, 25, 15, 20,228,105, 21,189, 60,128,130,166,195,138, 24, 49,119,238, +220, 34, 83,117,174,109,219,182, 15,198,141, 27, 23, 54,110,220,184,176,182,109,219, 94, 7,112,225,209,163, 71, 97, 95,124,241, + 69, 24,128, 17, 21, 28, 8,135,214,173, 91,203, 51, 50, 50, 72, 64, 64, 0,169, 94,189, 58,201,200,200, 32,132, 16,242,240,131, + 38,228, 74, 93,144,228,155,231,200,197,227, 71,200, 36, 15, 14,105,231, 97,103,242,112,119,207,113,118,118, 94,129,130,164,253, +242, 14,238,192,186,117,235, 42, 35, 35, 35, 85, 49, 49, 49,170,165, 75,151,170, 58,119,238,172, 10, 10, 10, 82, 13, 26, 52, 72, +181,105,211, 38,149,209,104, 84,237,216,177, 67,101,107,107, 27, 89,138,217,122,103,163,197,225,112, 54, 70, 68, 68,144,215,175, + 95,147,194, 40, 69, 89,154,118,246,246,246, 61, 29, 28, 28,102,217,219,219,247, 4, 96, 7, 0, 1,128,180,145, 29,124, 62,110, +228, 87, 39,116, 68,215, 90,155,187, 54,107, 50,196,134, 37, 55,125, 63,135,144,193, 62,239,100,180,236,236,236, 70,127,250,233, +167, 74,189, 94, 79, 52, 26, 13, 81,169, 84, 68,163,209, 16,165, 82, 73, 70,140, 24,161, 16, 10,133, 3, 43,210,116,118,118,254, +250,230,205,155,230,140,140, 12,114,243,230, 77,114,246,236, 89,178,101,203, 22,171,171,171,235,186,170,158,128,238,238,238,151, + 46, 94,188, 24, 22, 30, 30, 30,118,255,254,253, 48,147,201, 20,102, 52, 26,195,140, 70, 99, 88,104,104,104,216,177, 99,199,194, + 14, 30, 60, 24,102, 48, 24,194, 12, 6, 67,152, 94,175, 15,171, 89,179,230,249,170, 30,163,230, 2, 36, 27,110,157, 34,100,221, +116,146,255,237, 52, 34,159,221,155,200,166,180, 39, 63, 52,171, 70,218,139,112,250,173,122, 84,166, 38,151,203,189,145,144,144, + 96,157, 63,127,190,161, 94,189,122,249,227,199,143,215,233,245,122, 66, 8, 33,122,189,158,140, 31, 63, 94, 87,175, 94,189,252, +249,243,231, 27,226,227,227,173, 28, 14,231,114, 21,202,185,170,200,100,221,184,113,131,148, 68,165, 82,145,206,157, 59, 39, 52, +108,216,112, 87,141, 26, 53, 70, 86,164, 41,149, 74,251,207,155, 55, 79, 69, 74,193,100, 50, 17,165, 82, 73,226,227,227,173,213, +171, 87, 79, 3,224, 68, 47,230, 84,147,106, 82, 77,106,180,254, 50,202,156,130,167,220,157,248,197, 23, 95,132, 17, 66,194, 22, + 44, 88, 16, 86, 24,217,226, 1,144, 22,190, 56, 0,134,207,155, 55, 47,140, 16, 18, 54,119,238,220,162,117,202, 58, 16,125, 15, + 31, 62,108,220,176, 97, 3,113,115,115, 35,238,238,238,100,227,198,141,196,106,181,146,140,208,125,228, 74, 93,144, 23, 95,142, + 37,132, 16, 18,189, 98, 6,185, 82, 23, 36,246,199,101,100,212,168, 81, 26,177, 88, 60,162,156,131,235,216,164, 73, 19,165, 86, +171, 85,237,222,189, 91, 37, 22,139, 31, 2,168,135,130,166, 72,166,176,172, 99,234,213,171,167,120,246,236,153,234,215, 95,127, + 85, 1, 88, 90,201, 10, 83, 11, 64, 39,137, 68, 50,104,158, 23, 55,134,252,252, 21,153,231,134,167, 0, 26, 0,112, 41, 92,199, +115,238,220,185,132, 16, 66,188,189,189,111,150,161,105, 23, 20, 20, 52, 55, 38, 38,102,177,201,100, 90, 28, 30, 30,190,184,118, +237,218,243,251,213,244,104,117, 98, 68,183,224,252,101,211,130,201,218,217, 65,223,245,106,222,245,192,176,142, 35, 62,172,225, +124,107,188,171, 80, 51,212,142,173,124,171,233,176, 82, 21,219,203,203,235,126, 82, 82, 82,177,185, 82, 42,149, 36, 53, 53,149, +196,197,197,145, 91,183,110, 17, 15, 15,143, 43, 21,105,186,187,187, 63, 79, 74, 74, 34, 63,174, 95, 79, 6, 55,168, 67,218,219, +219,144, 14, 14, 54,164,169, 84,168,174, 11, 52,173,170,209,122,252,248,113, 24,128, 48, 0, 97, 57, 57, 57, 97, 57, 57, 57, 97, +121,121,121,197,239, 1, 8,203,207,207, 15,203,207,207, 15, 51, 24, 12, 97,126,126,126, 85, 54, 90,109,132,104,211, 66,136,220, + 86, 2,104,251,122, 57,167, 77,171,233,108,185, 55,162, 21,201,155,222,153,108, 8,246, 34,109,249,248,184,146,154,125,249,124, +254,117, 0,115, 10, 77,249,216,158, 61,123,106, 8, 33,164,103,207,158, 26, 0, 99, 11,223,255,180,208,100,245,172,100, 57, 89, +254,254,254,234,162, 72, 22,128,223,252,253,253,213, 13, 27, 54, 36, 13, 27, 54, 36,222,222,222,202, 66,237, 74, 93,208,106,213, +170, 21,173,213,106,139, 13,160, 92, 46, 39,105,105,105, 36, 54, 54,150, 68, 70, 70,146,135, 15, 31,146,132,132, 4,114,232,208, + 33,139,189,189,253, 25,122, 49,167,154, 84,147,106, 82,163,245,151, 26,173,183, 95,111, 26,173,208,208,208,183,109,215,183,143, + 30, 61, 10,155, 55,111, 94, 24,202, 25,136, 11,192,228, 5, 11, 22, 20, 69,189,190, 41,231,230,191, 35, 58, 58,154,140, 29, 59, +150, 4, 6, 6,146,192,192, 64, 50,110,220, 56,146,159,159, 79, 84,175,158,145, 43,117, 65, 30, 14,109, 74, 8, 33, 68,249, 34, +156, 92,169, 11, 18, 54,170, 53,121,242,228, 9,169, 86,173,218,197,114,126,255,244,157, 59,119,178,246,237,219,151,129,130,124, + 44, 46,128,150, 0, 54,138, 68,162,157, 40,104, 46,172, 14,192, 33, 32, 32, 32, 87,163,209,168, 6, 15, 30,172, 2,224, 83,142, +102,135,192,192,192,215, 59,118,236, 32, 50,153,140,228,230,230,146,213,109,106, 19,242,243, 87,100,121,211,234,214, 31,127,252, + 81, 63,103,206, 28,181,163,163, 99, 40, 0,207,193,131, 7,155, 9, 33,164,125,251,246,153,165,137,217,219,219,247,140,137,137, + 89,172,211,233, 22,203,229,242,197,185,185,185,139, 79,157, 56,177,184, 71,131,218, 99,243,151, 77, 11, 62, 49,162, 91,112, 47, + 47,135, 65,235,186, 55,155,154, 58,127,226,224, 5,173,235,189,208,173,250,228,218, 7, 53,221,214,188,203,209,118,113,113, 73, +215,235,245, 4,192, 31, 94,175, 95,191, 38, 78, 78, 78, 73, 21,105, 56, 58, 58, 46,248,116,248, 48,203,192,234, 94,228,245,134, +133,196,116,233, 87, 98, 58,187,155,188,250,118, 54,233,231,238,172,104,201, 99,205,171,108,121,220,221,221, 47,221,191,127,255, + 13,163,149,151,151, 87,170,209, 82, 40, 20, 97, 6,131, 33,204,223,223,255,252,251,214,250,150,124,248,117, 16,177, 31,134,143, +109, 71,178,166,117, 38, 61,237,184, 9,239, 33, 55, 28,192,117, 0,163,170,248, 61, 22,128, 85, 69,134,234,219,111,191, 37,132, + 16,226,239,239,175,198,251,141, 99,103, 87,167, 78,157,184,137, 19, 39,154,235,214,173, 43,107,211,166,141,252,193,131, 7,228, +198,141, 27,228,236,217,179,228,200,145, 35,228,217,179,103, 36, 53, 53,149, 68, 71, 71,147, 62,125,250,200, 1,116,160,215, 66, + 10,133,242,119,166, 20, 47,242,143,166,184,215, 97,104,104, 40, 9, 9, 9, 97, 74,108,160, 29, 0, 97,211,166, 77,179, 86,173, + 90,181, 22, 5,195,202, 51, 65,108,124,208, 89,196,121,210, 89,196,121, 18,196,198, 7,133, 17,163,237, 43, 86,172,248,186, 97, +195,134,233, 0, 68, 0,220,203,248,177,118, 78, 78, 78, 72, 74, 74,130,157,157, 29,236,236,236,144,148,148, 4, 66, 8,204, 4, + 48, 17, 64,111, 52, 66,171,213, 66,103, 37,208, 90, 1,133, 74, 5,119,119,119, 24,141, 70,191, 50,182,161,209,208,161, 67,253, +130,130,130,178,190,248,226,139, 52, 20,228,202,236,156, 48, 97,194,165,223,126,251, 45, 72,165, 82,229, 70, 70, 70,234, 26, 52, +104,208, 19,128,123, 76, 76,204,232,205,155, 55, 99,236,216,177, 40,231,166,211,160, 79,159, 62,103,159, 61,123,230, 55,106,212, + 40, 92,191,126, 29,171, 87,175, 70,118,118, 54, 1, 0,189, 94, 79, 44, 22,139,177,117,235,214,198, 13, 27, 54, 52,111,223,190, +253,253,154, 53,107,178, 1, 32, 46, 46,238, 85,105,130, 12,195,212,246,245,245,133, 94,175, 71, 86, 86, 22,158, 61,123, 6, 27, + 59, 59, 68,164,101,187,117, 92,247, 99,206,151, 39, 46,113,135, 55, 15,114,156,213,173,141,126,229,197,235, 1,245, 60,221,220, + 12, 70,147,123,116,122,102,218,187, 28, 88, 30,143,151,148,157,157, 13,131,193, 0,173, 86, 11,133, 66,129,156,156, 28,100,103, +103, 35, 45, 45, 13, 60, 30,239,117, 69, 26,182,185,185, 55,227,238,220, 96, 14,109,253, 22,126,230, 92,112,142,110, 4,231,228, + 15,168,101,200,194,182,133, 83,108, 12, 78, 46, 75,108,109,108,242,236,237,237,183, 3,240,175, 72, 47, 56, 56, 24, 57, 57, 57, +200,201,201,129,147,147, 19, 28, 28, 28,224,224,224, 0,185, 92,142,252,252,124, 40, 20, 10, 4, 4, 4,160, 81,163, 70,216,179, +103,207,159, 82,193,239, 25, 16,107,134,101,218,165,168, 52,240, 36, 18,212,116,144,250, 54,147,194,177,156,175,116,230,114,185, +135, 29, 29, 29, 47, 2,152, 14, 64, 2, 96,186,163,163,227, 69, 46,151, 59, 0,192,114, 0,251,170, 88,140,149, 75,150, 44,153, + 27, 19, 19, 35,126,242,228, 9,190,248,226, 11, 44, 93,186, 20,175, 94,189,250, 30,128,181,112,157,143,156,156,156, 66, 89, 44, +214, 79, 0,122, 3,232,233,225,225,209,165, 2,221, 1,115,230,204,209, 53,105,210, 36,250,197,139, 23, 3,238,220,185,211,116, +246,236,217,249,137,137,137,136,142,142,134,135,135, 7,188,189,189,161, 82,169,144,151,151,135, 1, 3, 6,216,217,218,218,142, +160,151,113, 10,133,242,119, 54, 89,111,121,145,127, 90, 68,171,212,229, 82,159,168,197, 98,241,146,176,176,176, 86, 13, 27, 54, +228, 0, 56, 4, 0, 65,108, 12, 25,208,186,241,206, 19,219,191,109,120,108,195,194,134, 61, 26, 6,236, 12, 98,163,168, 23, 91, +104,211,166, 77, 29,194,194,194, 90, 11, 4,130,143,203, 50,118, 0,224,224,224, 0, 59, 59, 59,216,219,219,195,193,193, 1, 86, +171, 21, 42,141, 14,106, 11,160,212, 25,144,159,159, 15,101,225,178, 74,111,132, 90,173, 46,254,110, 41,116,156, 56,113, 98,214, +230,205,155,101,233,233,233,223, 2,104, 48,118,236,216,254,155, 54,109,194,213,171, 87,117,189, 3,107, 57,173,104,215,248,235, +122,233,175, 22, 7,114, 49, 9,192,205,155, 55,111,162,117,235,214, 96, 24,102, 88,105,130, 34,145,232,135, 3, 7, 14,136, 34, + 35, 35, 81,171, 86,173,200, 97,195,134,125,240,237,183,223,250, 73, 84,185,183, 1,192,156,147, 17, 57, 99,198,140,175, 86,172, + 88,145,149,149,149,101,212,104, 52,174,253,250,245, 67, 82, 82, 18, 82, 83, 83,127, 43,195,100, 70,135,135,135,147,252,252,124, +196,198,198, 34, 60, 60, 92,244,213, 87, 95, 53,183,176, 88,253, 83, 96,243,225,216, 54, 77,155,143,106,217, 24,251,238, 62,225, +221,138,138,179,111, 90,221,203,225,113,114,122, 13, 19,131,215,239,114,180,149, 74,229,198,175,191,254, 90,165, 82,169,144,146, +146,130,167, 79,159,226,197,139, 23, 72, 72, 72,192,234,213,171, 85,185,185,185,155, 42,210,240, 20,114, 62, 91, 51,123, 2,195, +121,254, 27,240,228, 6,160, 81, 2, 90, 21,244, 47,195,176,235,101, 6,182, 28, 61,206, 79, 76, 74,178, 63,120,240,224, 68, 31, + 31,159, 48, 0, 1, 21,185,122, 0, 96,177, 88,111,155, 80,176, 88, 44, 37,128, 12,137, 68,146,108, 99, 99,147,204, 98,177, 50, + 8, 33,234, 63,163,230,179,204, 48,130,205, 6,248, 34,176,184,229, 78,237,249,193,176, 97,195, 14, 36, 39, 39,247,136,141,141, +109,181,105,211,166,175,133, 66, 97,196,166, 77,155,190,142,141,141,109,149,156,156,220, 99,216,176, 97, 7, 0,140,169,202,239, +251,251,251,207, 88,188,120, 49, 86,175, 94,141, 70,141, 26, 33, 32, 32, 64,179,100,201,146,141, 0, 22, 2,248,216,223,223,255, +246,140, 25, 51,198,203,100, 50,247,148,148,148, 70,223,127,255,253,148,141, 27, 55, 54, 75, 75, 75, 19, 86, 32,221,182,123,247, +238, 56,119,238, 28, 0,164, 3,136,205,201,201, 49,167,165,165,161, 78,157, 58,104,222,188, 57, 84, 42, 21, 84, 42, 21,228,114, + 57,124,125,125, 97,181, 90, 91,209, 75, 57,133, 66,161,252,191, 26,174,210,141,150, 80, 40,116, 8, 14, 14, 70,205,154, 53, 29, + 80,216, 91,203,137,207,153, 63,107,226,112,177, 52,236, 60,152,240, 43, 24,214,174,190,216,137,207,153, 95,248, 21,142,175,175, +175, 32, 56, 56, 24, 18,137,196,171,140, 31,191,158,145,145,129,224,224, 96,216,219,219,195,206,206, 14,193,193,193, 48, 26,141, +200, 87, 42,161,182, 0, 26,147, 21,249,249,249,200,205,202,132,198, 2,152,109,156,144,144,144, 0, 54,155, 29, 87,134,166, 71, +173, 90,181,178, 34, 34, 34,178, 0,220, 4, 48,117,233,210,165,152, 55,111, 30, 22, 45, 90,116, 64,156, 30,223,253,192,185,147, + 78,251,151,124,228, 18,192,103,134, 3, 48, 38, 39, 39,195,222,222, 30, 18,137,164, 84, 99,208,190,125,251, 38, 18,137, 4,187, +119,239, 38, 41, 41, 41,109, 80,208,133, 63,142, 97, 10,204,158,136,133,124, 0, 27,195,194,194, 90,124,245,213, 87, 81, 93,187, +118,229,182,108,217, 18,203,151, 47, 7,128,208,210, 52,229,114,249,189, 49, 99,198, 24,174, 93,187,134,151, 47, 95, 74, 78,156, + 56, 49,100,249,242,229,245, 19, 19, 19, 5,167,207,158,239,181, 55, 89, 49,228,219,139,183,132, 43, 46, 92,191,231,108, 43,169, + 87,195,217, 17,225,137,169, 60, 11, 27, 15, 42, 58,162, 45,184,236,137, 29,133,156,240,118, 2, 86,122, 71, 33, 39,172, 25,151, + 61, 65,169, 84, 30, 60,117,234,212,133,217,179,103,171,100, 50, 25,108,108,108,144,147,147,131,149, 43, 87,170,194,195,195,143, + 26, 12,134,211, 21,233, 90,172,164,137,119,117, 31,224,117, 68,241,123, 70, 43,193, 3, 3, 15, 33, 83, 63, 65, 96,157, 58, 48, + 24, 12,104,208,160, 1,179,116,233, 82,137,157,157,221,231, 21,154, 30,214, 31,170,155,153, 97,152, 12, 66, 72,170, 74,165, 74, + 17,137, 68,137, 60, 30, 47, 49, 55, 55, 55,133, 16,146,249,103,248, 44,194,194,103,173, 27,248, 3, 2, 17, 18,115, 84,105, 15, + 85,200, 45,109, 69, 27, 27,155, 9, 91,182,108, 17,254,252,243,207,166, 25, 51,102,232,167, 76,153,194,213,106,181,174, 83,166, + 76,225,206,152, 49, 67,255,243,207, 63,155,182,108,217, 34,148, 74,165,131,222,165, 32, 38,147, 9, 17, 17, 17,223,190,122,245, + 74,130,130,225, 70, 62, 89,178,100,201,216,152,152, 24,225,230,205,155,113,228,200, 17, 28, 57,114, 4,253,251,247,199,204,153, + 51,177,120,241,226,242,228,196, 13, 27, 54, 12,118,114,114,194,141, 27, 55,210, 0, 36, 2,104, 34,149, 74,109,250,247,239,143, + 30, 61,122, 64,167,211,193,104, 52, 22, 27, 45, 54,155, 13,123,123,123, 39,122, 13,164, 80, 40,148,191,220,100,189, 97,182, 56, + 0, 80, 20,170, 11, 9, 9, 97,202,187, 49, 90,242,100,144,171, 53, 72,200,215, 32, 41,207,250,198,103, 86,171,181,220, 95, 79, + 75, 75, 59,125,247,238,221, 9,193,193,193,156,180,180,130, 22,177,224,224, 96,104, 52, 26,164, 61,185, 15,181, 21,144,212, 10, +130, 90,173, 70,222,139,199,144, 54,108, 5,167, 62,163,176,110,243,102,125, 78, 78,206,214,210, 52,249,124, 62,183, 90,181,106, + 89,113,113,113,102, 0,185,118,118,118,221,125,124,124,112,253,250,117, 0,216, 71,128, 53, 8,191, 6,220, 56, 6, 82, 16, 82, +145,250,250,250, 66, 38,147, 65,165, 82, 93, 47, 77,243,238,221,187, 49, 38,147,169, 65,191,126,253,152, 95,126,249,229,144, 66, +161, 88, 4,224,169,222, 10,246,147,228, 76,168, 45, 16, 2,232,230,224,224,240,233,226,197,139,187,204,152, 49, 3,167, 78,157, +194,197,139, 23,141, 40,200, 5,187, 91,138,108,126,108,108,236,182, 57,115,230,180,100,177, 88, 83, 47, 93,186,100, 14, 8, 8, + 80, 24,141, 70, 75,237,192, 64,214,162,165,203,120,211,167, 78,182,207,209,224,121,143,218, 30,173, 25, 6,120,158, 42, 75,124, +165, 66, 78,121,251,180, 61,159, 29, 58,160, 77,195,246, 19,134,245,149, 74,106,213,131,250,217,125,247,109,135,207,174, 19,133, +199,132,220,144,201,250,159, 58,117,106,200,245,235,215,167, 27, 12,134,154, 2,129,224,181, 92, 46,223,160, 82,169, 42, 52, 89, +108, 54,187,143,222,163,154,131, 60, 55, 23,194,194, 72,148,194,100, 69,182,222,140,151,246, 1, 24, 81,205,187,184, 25, 52, 35, + 35, 3,238,238,238,140,197, 98,233, 91,158,230,197,139, 23, 17, 18, 18, 82,100, 60,193, 48, 12, 24,134,201, 14, 12, 12,204, 20, + 8, 4, 57, 60, 30, 79,177,102,205, 26,157, 78,167, 3,135,195, 17, 90, 44, 22,246,251,212,246,230, 98,184, 10, 8,243,195,148, +126,157,186, 54,170, 87,135,220,124,248,132,201,211,232,118,149, 19, 5,252,222,223,223,159,147,155,155,123, 26,192, 75,147,201, +180,255,208,161, 67,194,209,163, 71,235, 14, 31, 62, 60, 18,128,223,218,181,107,135,168, 84,170,237, 85, 41,199,171, 87,175,190, + 95,177, 98,197,220, 5, 11, 22, 96,207,158, 61, 51, 94,189,122, 53,175, 48,210,213,127,241,226,197, 88,179,102, 13,246,236,217, + 99,125,249,242,229, 89,171,213,250,106,246,236,217, 13,221,220,220,178,211,211,211, 95,149, 35,219,180,103,207,158,250,219,183, +111,243,149, 74,229, 45, 0,159, 78,155, 54,109, 98,139, 22, 45, 20,195,134, 13,147,230,230,230,202,197, 98, 49,127,199,142, 29, + 14, 28, 14, 7,106,181, 26, 12,195, 64,169, 84, 26,232,117,144, 66,161,252, 93, 41,203,139,252, 67, 40,243,222,192, 41,109, 3, + 53, 26, 77,102, 82, 82, 82,157,212,212, 84, 51, 0, 51, 0,228, 24,204,223,172,216,113,236,231, 65, 45,253, 37,233, 38, 19, 78, + 60,140,212,228, 24,204, 69,201,239,230,212,212, 84,101, 98, 98,162,141, 86,171, 85,149,241, 91,191,253,240,195, 15,218,107,215, +174,217,196,198,198,194, 98,177,160, 73,147, 38,136,142,142, 70,222,203, 8, 72,234, 52,129,164, 67, 8, 34,195, 30, 34,252,226, +101,196,171, 12,230,168,133, 43,242, 85,106,245, 98,163,209,120,162, 52, 65, 46,151,155, 11,128, 16, 66, 44, 0,160, 80, 40,158, +170, 84,170,118,110,110,110,120,254,252,185, 68,109,193,204, 33,243,215,109, 34,132, 88,120, 5,189,185,102, 13, 27, 54, 12,143, + 30, 61, 2,128, 71,165,105, 42, 20,138, 25,147, 38, 77,186,182,123,247,110, 78,108,108,108,143,159,127,254,185, 71, 84, 84, 20, + 97,114,147, 44,183, 53, 92,248,141,157,217,236, 71,223,192,139, 33, 33, 33,240,240,240,192,142, 29, 59,176, 97,195, 6,211, 71, + 31,125, 20,179, 97,195,134,102, 50,153,108,127, 25,219,159, 47,151,203,207, 59, 57, 57, 77,175, 95,191,190, 82,173, 86, 35, 39, + 39, 7,105,105,105,112,116,114, 98,153,193,106,237, 98,111,191,255,116,134, 82,194, 57,127, 15,247, 83,210,203,141,102,181,228, +178,199, 12,106,223,184,253,199, 11,230, 75,113,251, 4,152, 73,139, 65,126,254, 26,159,140, 27, 98,163,211,239,239,160,126,146, + 48, 58, 76,161,216,171, 80, 40,142, 84,177,178,244,108,221,186,245,129, 21, 43, 86,136,190, 92,189, 2,107,235,120,193,156,147, +131, 44,189, 5,217,122, 51, 20,121, 47,241,252,121, 36,156,156,156, 17, 31, 31, 15,157, 78,135, 23, 47, 94, 16, 54,155,125,186, +162,136, 78, 17, 37,154, 11,229, 2,129, 32,135,203,229,102,114, 56,156,220,216,216, 88,181, 78,167, 3,139,197,146, 88, 44, 22, + 81, 37,202, 90,205,217,217,121, 54, 10, 6, 19, 61,165,204,206,222, 24,204,133, 61, 56,232,232,235,236,212,107,225,148,209,206, + 62,158,174,242,216,152,215,166,173, 23,238,100,235,244,101,119,214, 0, 16,154,155,155, 91, 28,145, 60,124,248,240, 39,135, 15, + 31,158, 8, 96, 39, 10,230,221,186, 44,151,203,127,124,135,147,111,225,209,163, 71,231, 46, 88,176, 0, 34,145,168,120,240, 84, +145, 72, 36, 4,128, 95,127,253, 21,207,159, 63,111,129,194,124, 45,171,213,122, 32, 61, 61,189, 34, 77,191,160,160,160,216, 99, +199,142,241, 1,120, 78,155, 54,173,213,166, 77,155, 48,110,220,184,172,200,200,200,150, 0,226, 0,248, 77,157, 58,245,193,158, + 61,123, 28,172, 86, 43,242,242,242, 96, 48, 24,226,232,165,156, 66,161, 80,179,245,151, 16, 12, 32, 28, 5,227,103,245, 1,112, + 6, 5,105, 29,101,226, 93,232,206, 46, 0,232, 87,116,127, 44, 35, 25, 30, 40,232,145,117, 30,192, 79, 0,220,202, 18,117,114, +114,250,124,236,216,177,166,148,148, 20,146,145,145, 65,142, 28, 57, 66,102, 77, 24,107,233, 86,203,211, 90,203,211, 77,237,226, +226, 18,237,225,236,184,171,177, 24,179, 0, 84,171,196,134,141,141,138,138,154, 60,118,236,216, 9,133,191, 59,225,192,129, 3, +170, 75,151, 46,169,216,108,118, 40, 10,134,118, 40, 50,148, 99,250,246,237,171,210,235,245,170,192,192,192, 92, 20, 36,238,151, +197,144,142, 29, 59,230,157, 59,119,142, 88, 44,150, 63,140, 81,148,149,149, 69, 46, 94,188, 72,218,180,105, 35, 7, 48,186, 75, +151, 46,215,239,220,185,115,189,109,219,182, 71, 43, 42,176,179,179,243,252, 39, 79,158, 60, 74, 72, 72, 8, 59,115,230, 76,216, +254,253,251,195,166, 78,157,250,180, 97,195,134,218,152,152, 24,171,217,108, 38, 79, 30, 63, 38,129,181,107,171, 1,248,150,165, +211, 89,196,121,160,216,241, 53,209, 45, 31, 71,116, 3,188, 9, 0,162, 92,247, 57,201,156,209,149, 68, 79,239, 69, 58, 9,217, +119,223,165,166, 56, 58, 58, 94,120,244,232, 17, 81, 42,149,228,217,179,103,100, 76, 72, 15,114,119, 98, 87,114,190,135, 63,217, +211,161, 6, 89,215,189, 33,233,209,161, 29,249,225,135, 31,200,177, 99,199,200,252,249,243,173,206,206,206, 74,148,147,163,229, +238,238,126,233,208,161, 67, 97, 0,194,216,108,118,152, 66,161, 8, 83, 42,149,167,147,147,147,183, 4, 6, 6,206,173, 95,191, +254,200, 58,117,234,116,238, 84,195,119,110, 23, 27, 65,116, 87, 91,225,235,218, 82,241, 58,252,113,220,171, 98,236, 0,223, 90, +126,126,202, 27, 55,110, 88,245,122, 61,185,117,235,150,181,110,237, 0,221,218,161, 61,143,198,239, 88,117, 84,119,238,151, 11, +154,147,219,239, 28,254, 48, 36,162,163,152,245, 75, 43, 73,241,112, 28,239,202,112, 0, 39,240,123,175,195,177, 0, 78,162,252, + 94,136, 44, 0, 59,151, 47, 95, 94,178,167, 33, 0,176, 26, 54,108, 24, 70, 8, 9,107,216,176, 97, 88, 85, 11, 34, 22,139,103, +159, 58,117,106,137,143,143,207,234, 97,195,134,237,144,203,229,103, 70,142, 28, 25,129,130,206, 32, 12, 10,102, 71,232, 91,173, + 90,181,172,240,240,112,114,253,250,117, 50,120,240, 96, 37,143,199, 27, 69, 47,227, 20, 10,133,242,151, 48,185,180,191, 21,141, +163,181, 34, 34, 34,162,104, 12,173,105,229,137,207,155, 55, 47,236,209,163, 71, 97, 40, 24, 37,190, 92, 56, 28,206,241,143, 62, +250,136,184,185,185,169, 92, 93, 93,143,115,217,236,137,222, 34, 4,227,221,186,186,183,219,187,119,111,255,239,191,255,190, 15, +128, 22, 0,184, 94, 94, 94,105, 25, 25, 25,170, 59,119,238,168,218,180,105,163,114,118,118,150, 5, 5, 5,169,214,174, 93,171, + 50,153, 76,170,217,179,103,171,240,199,241,190, 74, 67, 8, 96, 58,159,207, 63, 94,183,110,221,136,133,253, 58,155, 86,207,156, + 72,198,250,187,168, 0,124, 15,224, 35, 0,246, 0,184, 67,134, 12,185,242,226,197,139, 11, 65, 65, 65,219, 42,161,235, 89,191, +126,253,171, 7, 14, 28,120,116,236,216,177,176,207, 63,255,252,145,147,147, 83, 74, 76, 76,140, 85,167,211,145,188,188, 60, 34, +151,203,201,153, 51,103, 44,142,142,142,155,203,220,112, 1, 59,157, 92,220, 87,234, 16, 14,201, 11, 70,145, 54,124, 86,234,187, +212, 20,137, 68,146,155,147,147, 67, 50, 50, 50, 72,108,108, 44, 57,122,244, 40,233,217,186, 57, 57, 56,117, 16,217, 55,161, 63, + 89,211,179, 57,105, 97, 35, 84,187,219, 72, 31,217,216,216,200, 42,211,235,208,221,221,253,146, 94,175, 47, 30,190,161, 90,181, +106, 97,129,129,129,199,130,130,130,214,157, 58,117,234,147,245,235,215,247,239, 84,195,119,238,202, 30,173,181,154,203,135,137, +242,208,247,100, 94,147, 0, 93,161,153, 47, 21, 47, 39,199,189, 55,174, 95,183, 22,153, 95,179,217, 76, 78, 28, 63, 78,134,246, +234, 22,145,127,254,215,159,110, 45,158,113, 96,118,147,128, 19,109,132, 24, 94,158, 97, 43,126, 20,145,194,169,189, 45,107, 75, +111, 31,199,244,118,118,172,239, 91,218,188, 49,189,212,208,128,128,128, 88, 66, 72,122,157, 58,117, 98, 1,236,171, 83,167, 78, +201,229, 15,203,144, 45, 30,156,116,201,146, 37,164,240,252, 96, 1, 88,180, 98,197,138, 48, 66, 72,152,191,191,255,109, 0,104, + 36,129,115, 7, 59,214, 79,253,252,220,114, 58,216,177,126,106, 36, 41,125,202, 40, 95, 30,106,183,115, 17,223,234,239,239,161, +236,232,101,119,115,223,174,159, 87,247,238,221,123, 7,128,205, 0,190,118,114,114,186, 53,124,248,240,231,123,246,236,121,190, +118,237, 90, 99, 76, 76, 12, 25, 63,126,188, 90, 32, 16,124, 77,175,131, 20, 10,133,242,151, 81, 52, 50,188, 71, 85,140, 86,223, +185,115,231,134, 17, 66,138,198,210, 26, 93,202, 58,253, 22, 44, 88, 16, 70, 8, 41, 26, 29,254,237, 1,204, 74, 27,208,108,201, +150, 45, 91,136, 64, 32,248,233, 29, 55,166,164,166,251,128, 1, 3, 90, 42, 20,138,102,110,110,110,205, 10, 35, 87,222,206,206, +206,177,251,247,239, 87,105,181, 90, 21, 33, 68,101, 54,155, 85,143, 30, 61, 82,117,236,216, 81, 85,226,169,191,162,114,190,193, +151,238,184,253,112,225, 4,242,165, 59,110,191,245,209,168,157, 59,119,158,139,139,139, 59,109,107,107,251, 69, 37, 53,189, 93, + 92, 92, 22, 57, 58, 58, 94,112,118,118,254,210,209,209, 49,221,104, 52,146,188,188, 60, 18, 29, 29, 77,174, 95,191, 78,238,222, +189, 75, 28, 29, 29, 83,202, 42,103, 23, 17,231, 94,222,234,233,196,186,115, 5, 49,108,154, 79, 0, 16,249,250,121, 36,251,135, +165,228,225,164, 30,164,163,144,253,219, 59,236, 79,216,219,219,111, 63,126,252,184,245,213,171, 87, 36, 52, 52,148,156, 57,115, +134,204,156, 57,147,212,246,244,208,183,228,179, 50,219, 9, 56, 23,222,101,192, 82,189, 94, 31,166, 80, 40,194, 84, 42, 85, 88, +221,186,117,195,154, 55,111,126,172,101,203,150,235, 14, 31, 62,252,201,202,149, 43,251,119,177, 17, 68,107, 46, 31, 38,228,243, + 94,132, 76,111, 75, 94, 79,236, 72, 58,139, 56, 79,202,212,116,115, 75, 41, 26,173, 93,173, 86,147,155, 55,111,146,171, 87,175, + 18,119,103,103, 69,123, 17,123,114, 27, 1, 58,180,177,133,125,101,203,217,201,142,181,235,222, 15,223, 88,180,231,246,144, 95, +199,246, 50,119,180,103,109, 41,177,222, 65, 66, 72,250,224,193,131,227, 9, 33,233, 71,143, 30, 77, 38,132,164, 15, 26, 52, 40, +158, 16,146, 14,224, 64,105,154,111, 13, 78,186,179,208,100, 77, 95,178,100, 73, 24, 33, 36,108,201,146, 37, 97, 64,193, 32,170, + 29,236, 88,187,239,111, 91, 99,213,159,217, 77, 14,143,239, 99,233, 96,199,218, 93,106, 57,237, 57,167,195,119,174, 39,134, 11, +251,200,241,153, 35, 45,109,221,109,111, 4, 4, 4,172,249,228,147, 79,142,221,189,123,247,169,197, 98,121, 30, 27, 27,251,124, +243,230,205,207, 91,181,106,117,219,201,201, 41,130,207,231,127, 84,209, 49,250,147,160,154, 84,147,106, 82, 77, 74, 9, 8, 33, + 40,175,191,251,233,111,191,253, 86, 66, 8,153, 61,100,200, 16,172, 90,181,106,104,253,250,245,135,123,121,121,185, 0, 64, 90, + 90,154,230,217,179,103,138, 33, 67,134, 96,209,162, 69, 88,189,122,245, 58, 20,228,178,252,127,146,113,226,196,137,106, 51,102, +204,144,173, 92,185,210, 58,126,252,248, 58, 0,158,101,103,103,215, 30, 57,114,228,116, 14,135, 51,196,215,215, 55, 40, 61, 61, + 61, 75,171,213,238, 3,176, 13, 21,180,153,150,133,128, 5, 75,211,234, 30,184,192,130,165,196,219,189, 22, 45, 90, 52,108,208, +160, 65,198,245,235,215,155, 21, 10,197,169, 74,202, 37,103,101,101, 45, 43, 90,112,116,116,116,127,242,228,201, 71,174,174,174, +172,216,216, 88,232,245,122,188,122,245,202,138,130,166,169, 82, 81,153,201,198, 31,143, 94, 10,156, 61, 42,196, 86,243,242, 49, +120,108, 54, 76, 92, 62, 50,238, 93,192,206,155, 47, 21,106, 35, 54,189,203,118,202,229,242,239,102,206,156, 57,242,139, 47,190, + 16,250,250,250, 50,191,253,246, 27, 14, 29, 58,164,151,201,100, 61, 1,220,248,125,232,167,170, 97,181, 90,193,231,243, 1, 0, +243,230,205, 3,139,197,226,202,100, 50, 62,195, 48, 2,134, 97,196, 12,195,176, 77,113,207, 97, 85,228, 33, 51, 79,142,228, 76, +121,185,122, 22,171,245,208,253,251,247,103, 53,110,220,152,245,240,225, 67,100,101,101,225,213,171, 87,196, 66,200,129,155, 90, + 75, 65, 82,162,190,242,229, 19, 59, 58, 13,104,228, 32, 96,241,119, 45, 66,123, 3,139,189,213,138,193, 40, 24, 75, 11, 0,118, + 50, 12,195, 3,144, 83,183,110,221, 78, 47, 94,188, 16,213,173, 91, 87,251,242,229,203,115, 12,195,120, 1,216, 93,154,166, 72, + 36,202, 6,144,125,244,232, 81, 0,152,132,130,157,215,100,241,226,197,233, 55,111,222,196,146, 37, 75, 50, 1,108, 1, 0,169, +131, 83,191, 32, 59, 30,195,255,101, 9, 90,233,193,218,100, 37,165, 70, 93,165,174,110,157,235, 75, 88,224,254,252, 21,154,185, + 7,178,248,102, 99,131,165, 75,151,222, 84,169, 84,250,131, 7, 15, 26, 62,252,240, 67,118, 76, 76,204, 3, 0,183, 0, 28, 69, + 97,142, 37,133, 66,161, 80,254, 82,222, 30,214,161,194, 28,173,183, 93,235, 42, 0, 63, 70, 69, 69, 21, 79, 42, 29, 21, 21, 21, + 6, 96, 43, 10, 70,131,239, 91, 5,199,187,176, 48,162,181,237, 29, 55,230,109, 77, 97,112,112,176,232,197,139, 23, 60,148, 62, +225, 49,243, 14,154,127,160,180,185, 14, 3, 2, 2, 54,152, 76,166, 99, 91,183,110, 61,204,102,179, 71,190,135,219,247,245,247, +247,207,219,191,127,191, 53, 52, 52,148, 44, 92,184,208,226,225,225,145,135, 63,230,104,189,161,217,158,207, 62, 50,167,142,151, +226,209,232,182,228,245, 39,253,200,173, 81, 29,201,100, 47,169,162,189,144,125,232, 61,159, 74,252,237,236,236,118,138, 68, 34, +133,173,173,237, 37, 0,173,223,231, 24, 57, 57, 57,237,113,119,119,191, 84,242,229,230,230,118,204,197,197,229,123,103,103,231, +133,246,246,246, 83,252,132,252,245,159,212,246,212, 69, 12,168, 75, 46,183,113, 33,163,156,249,111, 55, 29,190, 93, 78, 15, 63, + 63,191,156,189,123,247, 90, 79,159, 62, 77,230,207,159,111,173, 94,189,186, 2,229,228,181,149, 27,209,178,103, 31, 58, 50,168, +165, 53,179,143, 23, 89, 85,199,198,218,201,129, 93, 86, 15,197, 81,133, 6,120,108, 69,154,181,106,213,218, 74, 8,217,181,124, +249,242, 93,248,125, 46,208,110, 75,151, 46, 93, 76, 8, 89,188,116,233,210,197, 0,122, 0, 64,123, 59,214,222,125,253,155, 90, +210,122,123,146,111,234, 72, 45,237,237, 88,123, 75,141,100, 58,114, 78,156,156,216,199,154, 62,177, 13, 89,228, 47,177,180,116, + 20, 92,225,243,249,159,160, 32,226,220, 28, 0,159, 62, 53, 83, 77,170, 73, 53,105, 68,235,239, 97,188, 42, 51,169,116, 73,220, + 29, 29, 29,119,214,172, 89,243,176,175,175,239, 97,169, 84,186, 14, 5, 73,243, 85, 61, 16,126, 43, 86,172, 80,216,217,217, 53, +250, 19, 15,174, 43, 0, 47,252,113,226,220, 63,173,194, 44,243,192,140,152, 47,134, 62, 89,230,129, 25, 37,222,110, 94,167, 78, +157,111, 80, 48,154,247,251, 86, 66, 95, 71, 71,199,205,142,142,142, 41,133,185, 89,190,149,209,108,202,102,143,236, 36,100,255, +214,154,207,202,232, 36,228,220,105,198,102,143,248,135,158,128,229,117,182, 40, 75,179,154,179,179,243,122, 71, 71,199, 52,103, +103,231,205, 85, 52, 89,111,104, 54, 18,193,163,179, 61,251, 68,107, 27, 70,221,217,142,125,180,169,184,236, 78, 29, 85,216,246, +224, 37, 75,150,140, 35,132,140,243,244,244, 28, 82,194,248, 7, 45, 90,180, 40,132, 16, 18, 82, 52, 2,124,115, 49, 92, 59,218, +179,247,183,177,101,228, 29,237,217,251,155,139,225, 90, 86, 57, 59,217,179, 15,181,177,101,228,237,109, 89,251,125, 4,168, 78, + 47,230, 84,147,106, 82, 77,106,180,254, 29, 70,139, 86, 24,170, 73, 53,169, 38,213,164,154, 84,147,106, 82,163, 85,186,177, 42, +249,242, 40, 50, 90, 28,186,111, 40, 20, 10,133, 66,161, 80,222,139, 50, 7, 44,101,202,113,165, 85, 73,108,127, 23,103,123,153, +106, 82, 77,170, 73, 53,169, 38,213,164,154,255, 57,205,138,180,255,191, 59,214,253,101,208,166, 67,170, 73, 53,169, 38,213,164, +154, 84,147,106,254, 93, 52,255,117, 16, 66,222,105,144, 80, 10,133, 66,161, 80, 40, 20,202,239, 4, 23,254, 45, 30,184,180, 40, +154, 85,106,142, 22,167,249,242, 76,179,217,236, 10, 0, 28, 14, 71,102,122,176,208,163, 60,117, 46,208,197, 92, 48,253, 14, 56, +192, 36, 51,112,169, 20,205, 75,102,179,217,161, 80, 51,207,244, 96, 97,143,114, 53,155, 47,191, 80,114,125,243,131,133,221,254, +224, 20, 1, 54,183,249,242,180,183,202,234, 89,217,189,194,224,141, 49,177,254,178,114,254, 83, 52,255,203,112, 91, 44,207, 52, +153, 10,234, 17,151,203,145, 25,239,151, 95,143,120, 45,150,167,149, 92,223,116,127,161, 91,121,154, 98,145, 32,167,150,151,203, +186,242, 52, 99,211,178,103,171, 53, 58,167,242, 52,171,122,110,122,123,120,116,177, 20,158,155,108, 96, 82, 74,122,250,165,191, + 89, 93,106, 10, 96, 33, 0,219, 18,239, 69, 0,248,148,214, 74, 10,133,242, 15, 51, 90,225, 40,152,231,112,123,161,217,218, 94, +166,209, 50,155,205,174, 97,199, 23, 67,173, 7,186,140, 89,238,234, 55, 96,219, 31, 38, 74, 54,235,242,248,242,200,131, 65,108, +147,194,193,133, 99,180, 77, 75, 75, 99, 0,128, 97,152,159, 0,248,148,162,233, 16,118,124, 49, 52, 6,160,253,240,165, 14, 62, +128,109, 22,143,247,153, 72, 34,233,164,213,106,235, 3,128, 72, 36,138,212,170,213,215, 92,140,198,181,111,175, 95,214,150,149, + 44,107,231,209,203, 93,235, 12,216, 54,211, 98,181,242, 83, 31,110,109,175,203,142,225,112,205,250, 45, 95, 2,231, 22,151, 98, +170,202,208,251,253,119, 63,152,239,196, 5, 58,243,133,194, 70,246, 14, 14,237,172,132,212,181, 90,173,140,197,108,126,174,200, +207,191,101, 53,155,159,152, 13,106,167,176, 83,223, 88,203, 43,231,219,219,242, 1,192, 57, 14, 12,145, 72,165,157,216, 92,110, +107, 0,176,152, 76,191,169, 85,170,107, 3,129, 35,149,217,246,202,238,159,119, 93,255,191,134,201,100,118,141,187,176, 24,122, + 19, 16, 60,248, 27,215,134, 35,127,217, 15, 0, 6,217, 19, 55, 85,204,169, 22, 0, 32,169, 21,114, 95,224, 30,156, 9, 0,156, +196,116,215,232,208, 5,208,155,128,186, 33, 75, 93, 43,210,252,112,209, 33,167, 47, 38, 15, 18, 0,192,197,163,223,215,190,122, +236,199, 94, 0,208,121,208,180,115,221, 7,207,136, 6,128,213,219,143, 57, 29,248,102,104,185,154,149, 59, 55,243,121,249, 49, +161,254, 6, 69,186,189,183,132,227, 30, 19, 19,195, 2, 0, 79, 79,207, 74,157,155,213, 0,187,116, 96, 58,139,205,110, 87,203, +223, 63, 24, 0,137,125,253, 58,220, 98, 54,223,246, 0,182,252,201,117,105, 38, 33,111, 14,206,202, 48, 12,173,144, 20, 10,229, +159,198,153, 66,115,117,230, 15, 15,179,101,125, 67,173, 7,110,188, 2, 58,180,108,136,201, 35,123, 75, 75,126,118,100,219, 82, +159,152,135, 39,235,252,252,203, 90, 86,195,134, 13, 17, 23, 23, 87,169, 82,104, 12,192,245, 24, 0,242, 23, 54,121, 18,201,235, +245,107,214,216,118,235,214,141,227,233,233, 9,134, 97,144,145,145,209,242,242,229,203, 77,103,205,154, 53, 21,242, 23,121, 26, + 3,148,215, 99, 42,214, 45, 42,107,253,218,213,177,112,198, 80, 59, 0,248,114,204,150,166, 15,163, 50, 29, 95,191,126,221,101, +238,220,185, 57,236,107,215,126,116, 6,118,101, 2,201,149, 41,231,158,211,247,133,118,233,191,250,141,154, 49,227,168,191,191, +191,212,215,215,151,177,177,177, 1,155,205, 70, 94, 94,158,207,179,103,207,122, 61,120,240, 64,125,249,198, 79,252, 71, 15,250, +197,202,132, 45,116,149,218,118,109,154,240,162,141, 77,228,232,129, 3,171, 13, 29, 58, 84, 88,171, 86, 45, 0,192,235,215,175, + 3,142, 28, 57, 50,252,232,209,163,139,160, 77, 51,107, 12,208, 85,180,237,197,154, 0,132, 64,107,123, 87,215, 81,108, 46,183, +190,217,108,246, 42,140, 54,164, 90, 76,166, 72,185, 76,182,239,237,245, 41,127, 68,111, 2, 94,164, 3, 93,219, 5, 99,244,160, +174, 18, 0,152, 59,108, 69,203,196,248, 87, 60,131,193,128,218,129,117,219,124,253,205,186, 11, 96,177,176,247,216,229,226,245, + 43,163, 25,241, 34, 14,139,191, 94,143,180,167, 71, 90, 90,242, 95,117, 82, 42,242,217, 0, 96,107,103, 55,232,200,193, 95,175, +121, 6, 13,185,247, 42,219, 88, 41,205,242,206,205,243, 7, 55,123,164, 60,187, 86,239,135,139, 59,185, 62, 62, 62,120,250,244, +105,213,206,205,252, 40, 27,171,135,199,243,181,159,127,238,222,190,125,123, 72,165, 82,112, 56, 28,152,205,230,174,183,111,223, +238,186,120,241,226,105,200,143, 82, 87,246,220,172, 4,107, 25,134,233,244,225,228,153, 30,189,251, 15,193,160,158,109,104, 69, +164, 80, 40,255, 52,138,162, 87, 37,123, 30,110, 47,215,104,113, 56, 28, 89,183,177, 43, 93,219,181,104,128,135, 79,162,243, 19, +146,210, 85, 69,159,229, 70, 30,169,221,191,141, 87,189,155, 55,111, 64,175,215,227,183,223,126,195,147, 39, 79, 16, 31, 31,143, + 41, 83,166,232, 11,155, 14, 75,211,204,107, 63,124,169, 3,242, 99,164, 1,252,168, 26,151, 95,190,100,235,116, 58,220,188,121, + 19,121,121,121,224,243,249,168, 86,173, 26,186,119,239,206,121,249,242,165, 99,151,110, 61,237,218,247, 28, 17, 7,187, 0, 21, +135,195,201, 43,107, 30, 17, 14,135, 35,235, 50,102,185,107,189,128,234,120,157,144,150,191,240,155,159, 85, 86, 43,225,196,198, + 39, 26,111,220,184,129,224,224, 96, 92,186,116,201, 41, 55, 55,247,171, 45, 91,182, 44,228,126,251,195, 70,147, 33,103, 14,202, +214,203,107, 63,124,169,131,147,236,176,239,213,243, 39,120,145,145,145,188,173, 91,183, 34, 39, 39, 7,124, 62, 31,246,246,246, +112,119,119, 71,237,218,181,153, 47,191,252, 82, 26, 18, 18,137,143, 39, 13,241, 53,250, 77,140, 42,171,156,197,219,174, 74, 20, + 59, 43, 46,214, 58,118,230, 12,171,109,219,182,111, 60,182,215,172, 89, 19, 61,122,244, 16,142, 26, 53,170,214,208,225, 35,173, +237,251,124,248, 26, 82, 95, 77,133,154,234,100,145,147,230,174,103,215,225,195, 79, 45, 93,186,212,222,221,221, 29, 18,137, 4, + 0,144,159,159, 95, 45, 33, 33,161,229,162, 69,139, 6,223,143, 56,200,105, 31,146,156, 6,137,183,182,188,253,249, 95,133,203, +229,200,138,162, 72, 54, 18, 81, 94,114, 74,166, 26, 0, 12, 6, 3, 12, 6, 3,244,122, 61, 62,154, 54,133, 61,105,112,115,127, +223,118, 51, 31,199,167,102,230,214,189,124,207,177,232,187,166, 10, 52, 57,154,120,185, 60,233,202,164,197,159,127,238,238,230, +246,123,139,224,222, 61,123,216,185,185,185, 93, 23, 47, 94, 92,143,136, 59,202,235,134, 44,181, 47, 79,179,188,115, 83, 30,125, +166,198,215, 51,122, 52,218,246, 77, 40, 44, 22, 11,238,222,189,139,155, 55,111, 98,221,186,117,228,220,185,115,249,182, 18,201, + 36,148,123,110, 70,217,180,245,200,240,251,246,219,163,140, 64, 32,192,201,147, 39,241,242,229, 75,176, 88, 44, 52,108,216, 16, +163, 71,143, 70,215,174, 93,221, 39, 79,158, 66,218,247, 28, 22, 11,187, 64,229,123,214, 37, 22,128,153,243, 23,127,235, 49,102, +226,116,172,254,250, 75,106,180, 40, 20,202, 63, 57,154, 85,230, 16, 15, 8, 13, 13, 37,133,175, 14, 0, 64, 0, 86,205, 1,219, + 14, 28,126,100, 61, 83,115,192,182, 3, 4, 96, 17,128,101, 11, 84,111,220,184,177, 73, 46,151,147, 7, 15, 30,144,143, 62,250, + 72,189,113,227,198,107,103,206,156, 57, 98, 54, 26,119,120,122,120,124, 71, 80,122,130, 61, 1, 88,190,128,157, 88, 44,206, 74, + 74, 74, 34,103,207,158, 37, 75,150, 44, 33,251,246,237, 35,231,206,157, 35,151, 47, 95, 38,231,206,157, 35, 7, 14, 28, 32, 17, + 17, 17, 36, 58, 58,154, 72, 36,146, 44, 95,192,174, 28, 77, 54, 1,216,181, 7,108,157,115,244,161,105,105,224,128,109,179, 8, +192,118, 0,234, 52,110,220,216,114,228,200, 17,178,119,239, 94,242,203, 47,191,144,136,136, 8,146,157,157, 77, 56, 2, 73, 86, +209,247,202, 42, 39, 1, 88, 94, 94, 94, 89,114,185,156,120,123,123, 19, 62,159, 79,220,220,220, 72,237,218,181, 73,203,150, 45, + 73,175, 94,189,200,200,145, 35,201, 87, 95,125, 69,228,114, 57, 17, 10,133,153, 69,223, 43, 75, 51, 24, 16, 73, 36,146,164,176, +176, 48, 82, 22, 90,173,150,100,103,103,147, 11, 23, 46, 16,137, 68,146, 20, 12,136,202,211, 20, 1, 77,130,130,130,178,178,179, +179,137,209,104, 36, 73, 73, 73,228,217,179,103,228,229,203,151, 36, 41, 41,137,104,181,218, 98,237,232,232,104,226,231,231,151, + 37, 2,154,148,165,249, 95,166,168, 78,188,253,242,113,115,235,229,238,238,174, 61,122,244, 40, 73, 77, 77, 37,187,119,239, 38, + 44, 96,197,219,235,149,167,201, 7,186,183,109,219,214,114,247,238, 93,242,248,241, 99, 50,111,222, 60,210,163, 71, 15,210,179, +103, 79,178,120,241, 98,146,146,146, 66, 82, 82, 82, 72,175, 94,189, 44,124,160,123, 69,245,179,180,115,211, 14,240, 9, 9, 9, +209, 26,141, 70, 18, 27, 27, 75,234,215,175,159,194, 6, 70, 73,128,122, 29, 0, 65, 69,245,211, 11,112,240,240,240, 72,191,123, +247, 46, 57,118,236, 24,241,245,245,205, 98, 3, 31,218, 2, 53,109,129,154,108,224,195,154, 53,107,102,221,189,123,151,228,228, +228, 16, 31, 31,159,116, 47,192,225, 61,234, 18, 11,192,206,249,139,191, 37, 81, 41,106, 50,127,241,183, 4, 64, 18, 41,200, 30, +189, 68,107, 36,133,242,223,227,109, 47,242,143,191,175, 16,242,102,175,195,144,144, 16, 6,192,245,242,190,164,101,179, 87,174, + 94,189,154,163,211,233,240,243,207, 63, 43, 63, 24, 60,248,112,135,118,237, 98,107,248,250,202, 25, 22,171,194,217,134,179, 4, +130, 79, 86,175, 94,109,111, 48, 24,240,232,209, 35, 52,109,218, 20,238,238,238,144, 74,165,144, 74,165,112,117,117, 69, 96, 96, + 32,100, 50, 25,108,108,108,240,197, 23, 95,216,101, 9, 4,159, 84,164,107,181, 18, 14, 0, 88,172, 86, 62, 15,152,236,215,172, +217,163, 69,139, 22,177,156,156,156,224,232,232, 8,169, 84,138,151, 47, 95,194, 96, 48, 64, 44, 18, 87,106,144, 86, 22,139,197, +146, 74,165,184,122,245, 42,102,206,156,137,214,173, 91,195,222,222, 30, 54, 54, 54,168, 95,191, 62,186,119,239,142, 73,147, 38, + 33, 54, 54, 22, 76, 37,146, 74,158,115, 56,211, 39, 77,154,228, 26, 28, 28, 92,234,231, 58,157, 14,114,185, 28, 89, 89, 89,168, + 86,173, 26,134, 12, 25,226,250,156,195,153, 94,150,158, 19,224, 94, 45, 32,224,212,131, 7, 15,156, 37, 18, 9,246,238,221,139, + 19, 39, 78,224,252,249,243, 56,123,246, 44, 66, 67, 67,113,242,228, 73,100,101,101, 1, 0, 2, 2, 2,112,232,208, 33,103,169, +171,107,168, 19,224, 78, 79,233,202,145,152,153,121,177,126, 70,134,243,168,145, 35,111,169, 84, 42,140, 26, 53, 10, 43, 87,173, +250,146, 11,204,170,204,247, 3, 1, 59, 71, 15,143, 93,223,126,251, 45, 43, 35, 35, 3, 3, 7, 14,204, 94,187,106,213,132,240, + 11, 23,106,133,157, 63, 95,107,229,210,165, 19, 58,116,232,144,157,146,146,130, 61,123,246,176,220,124,124,118, 5, 2,118, 85, + 45,167, 18,152,185, 97,195, 6,161, 78,167, 67,183,110,221, 98,173,145,145,129,102,224, 87, 21,240,242, 58, 96,172,232,251,233, +192,244, 47,190,248,194, 93, 32, 16,224,179,207, 62,203,214, 36, 38, 54, 48, 3,191,228, 3, 9,249, 64,130, 25,248, 69, 25, 23, +215, 96,204,152, 49,217, 2,129, 0,235,215,175,119, 79,255,125,210,237,202,210, 20,192, 41, 0, 55, 0,164,125, 56,121,230,135, +193,205, 91, 97,207,142, 45,248,102,233,220, 93, 0, 62, 96, 24,102, 31,128, 57,180,230, 81, 40,255, 77, 42,227, 69,254,166, 76, + 46,235, 3, 78, 73, 39, 9,160, 99,121, 42, 14, 78, 78, 77, 27, 52,104,128,155, 55,111, 34, 40, 40,232,129,189,189,189,153, 39, + 16,128,203,229,130, 88, 43,244, 89, 16, 73, 36, 93,186,118,237,202,185,119,239, 30,252,252,252, 32, 18,137,192,229,114,223,120, +241,120, 60,120,120,120, 64,161, 80,160, 75,151, 46,220, 77,155, 54,117,129, 94,255,117,133, 55,196,152,103,210,172,123,223,142, +252,105,247,174,154,237,219,183, 71,126,190, 2, 86,171, 21, 98,177, 24, 6,131, 1, 28, 14,167,160, 9,200, 68, 20,149,217, 99, + 22,139,197,194,102,179,225,231,231,135,149, 43, 87, 66,167,211,129,199,227, 1, 0, 20, 10, 5,228,114, 57,158, 61,123,134,132, +132, 4,144, 74,140, 72,102, 99,103,215,123,232,208,161,165, 78,248,171,215,235,145,159,159,143,252,252,124,200,229,114,232,116, + 58,180,106,213,138,127, 38, 52,180, 55,114,114,214,150,250, 29,161,112,240,158, 61,123, 92,249,124, 62,180, 90, 45,148, 74, 37, +146,147,147,145,152,152,168,147,201,100,102, 27, 27, 27,150,175,175, 47, 75, 32, 16, 8, 6, 12, 24,192, 40, 20, 10, 48, 12,131, +144,144, 16,167,253,123,247, 14,133,193,176,142,158,210,149,227, 34,160,111, 98, 48,244,109,209,188,249,213, 7, 15, 31, 6,127, +242,201, 39,136,136,136,248, 86,124,240,224, 13, 13,240,164,188,239,198, 2,211,191, 43, 97, 96, 72, 98, 98,144, 17,200, 42,177, + 74,130,111, 92,220,249, 49, 99,198, 60,141,136,136,112, 94,191,126,189,251, 7, 3, 7, 78, 7,176,162, 42,101,180,177,179,107, +230,225,225,129,115,231,206, 33, 41, 62,126,174, 25,208, 86, 41,188,196,102,183,109,223,190, 61, 78,158, 60,137,148,196,196,185, +230, 55,203, 88,240,160, 4,100,113, 98, 99,231,238,218,181,107,231,248,241,227,193,230,112,218,194, 92,165,134,195, 63, 36,190, +143,159,242, 9,118,109,223,180, 11,192, 68, 0, 86, 0, 15,104,141,163, 80,254,219, 81,173,138,188,200, 63,200,108,109, 7, 80, +181,136,150,171,171,171,151, 84, 42, 69, 90, 90, 26,234,214,169, 35, 19, 8, 4,224,115,185, 16,242,249,149, 42,129, 70,163, 9, +242,244,244, 68,126,126, 62,156,157,157,193,227,241,138, 95,124, 62,191,248,127, 27, 27, 27,176, 88, 44,248,248,248, 64,163,209, + 4, 85,168,155,249,204,245,224,166,105, 31,221,189,113,174,230,192,129,131,224,224,224, 8,111,239,106,112,117,117,133, 72, 36, +130,183,183, 55,106,213,170, 69,214,174, 93, 11,177,107,195, 74, 93,200, 75,154, 39, 14,135, 3,139,197,130,204,204, 76, 68, 69, + 69, 33, 34, 34, 2,119,239,222,197,227,199,143,161, 84, 42, 43, 53,242,171, 70,171,109,196,225,112, 74, 53, 89,114,185, 28,114, +185,188,216,104,101,101,101, 33, 33, 33, 1, 42,181,186,113, 57,166,119, 80,131, 6, 13,216, 0, 32, 18,137,208,184,113, 99,108, +219,182,205,124,250,196,137, 97,245,238,222,117,244,190,112,193,254,167,173, 91,135, 13, 25, 50,196,114,239,222, 61, 40, 20, 10, +188,120,241, 2, 46, 46, 46, 28,190, 80, 56,148,158,206, 85, 35, 12, 80, 59, 43,149, 61, 91,183,110, 29,151,159,159,143, 53,107, +214,176,184, 54, 54,219,151,150,209,196, 87, 12,155,221,166,125,251,246, 56,117,234, 20,210, 18, 19,231, 37,150, 98, 96, 18,129, +172,164,216,216,121,187,118,237, 66,247,238,221,193,112, 56, 85, 78, 84,106,217,178,101, 3,171,213,138,167, 79,159,194, 30,184, + 95,213,239,215,242,247, 15, 46,138,252, 74,128, 91,101,173, 39, 1,110,133,135,135, 67, 36, 18,161,110,189,122, 77,170,248, 51, +107, 25,134, 73, 31, 63,229, 19, 28, 59,127, 7, 0,176,107,251,166,204, 18, 38,139, 66,161,208,136,214, 63, 53,162, 85,100,172, + 74,190,240,134,209,170,164,249, 0, 0,112,185, 92,240, 5, 2,240,249,252, 2,131, 36, 16, 84, 90,131, 97, 24, 8,133,194, 98, + 99, 85,210, 96,149,252, 95, 44, 22, 87,122,232,250,188, 87,231,219, 77,156, 48,158, 47, 16, 8, 96, 48,232, 65, 8,129, 64, 32, +132,189,189, 61,252,252,252,160, 80, 40,208,186, 77, 7,125,178,156, 23,234, 84,119, 64,196,187,236, 61,179,217, 12,181, 90,141, +188,188, 60,228,230,230, 66,161, 80, 64,171,213, 86,186, 43,186,213,106,101, 39, 39, 39,227,215, 95,127, 69, 78, 78, 14,128,130, + 68,235, 34,115, 85,244, 55, 46, 46, 14,123,247,238, 69,124,124,124,149,142, 79,187,118,237, 16, 26, 26,202,238,216,165,203,142, + 75,190,190,105,151,124,125,211, 58,118,233,178,227,212,169, 83,108, 47, 47, 47, 36, 36, 36,224,209,163, 71,200,203,203, 3, 33, +132,246,159,127, 7, 94, 3,121,154,220,220,241, 95,126,249, 37,145, 74,165, 88,243,221,119,141, 86, 0, 35, 42,107, 96,236,202, + 49, 48,118,239,103, 96, 64, 8,129,213,106,133,197, 98,121,167,109, 99, 24,134,225,114,185, 85, 29, 90,161, 42, 43, 23, 39,190, +127,241,213, 74,156, 61,121,164,232,253, 24,106,178, 40, 20,202,191,128, 50, 19,225, 57, 37, 28,100,241,223,178,200,204,204, 76, + 85,171,213, 53,125,125,125,145,146,146,226,234,227,227,147,200,231,114,193,227,243,193,176, 42,246, 4, 98,177,248,105, 90, 90, + 90, 27, 47, 47, 47,152,205,230, 98, 83,245,118,211, 97, 81,148,230,241,227,199, 16,139,197, 79,161, 43,119,228, 4, 88, 12,121, +213,155, 52,105, 82, 28, 25,178,183,183,135,189,189, 29, 4, 2, 33, 22, 44, 88, 96, 93,191,118,237, 22,159,206, 75,243,199,205, +250,146,124,185, 98,199,159,186,103, 43,123, 99, 18,139,197, 79,189,189,189, 91,217,217,217,225,216,177, 99, 72, 72, 72, 64, 94, + 94, 30, 52, 26, 13,244,122, 61, 52, 26, 13, 12, 6, 3,132, 66, 33,234,213,171, 7, 91, 91, 91, 92,190,124,249, 41,244,250,210, +205,101, 78,206,177,167, 79,159,182,106,222,188,121,113, 68,165, 83,167, 78, 76,167, 78,157,156,139,163,104, 26, 13,178,179,179, +241,224,193, 3, 92,190,124, 25, 12,195, 32, 38, 38,198,162,215,106, 15,208,115,226,221,208, 1,191,177,119,237,218, 57,117,234, +212, 9,109,218,180,129, 5,232, 5, 96,239,255,208,192, 0, 0,238,222,189,251,204, 98,177,180,169, 93,187, 54,228, 64, 11, 0, + 39,171,100, 34, 95,189, 10, 55,155,205, 93, 26, 53,106,132, 99,135, 15,183, 3,144, 80,218,122,106,160, 93,112,112, 48,180, 90, + 45, 94, 60,127, 30, 86, 5,147,181, 99,254,226,111, 63, 28, 51,113, 58,246,236,216,130, 93,219, 55, 37,239,220,182,209, 27,149, +200, 31,163, 80, 40,255,169,104, 86,133, 94,228,111,202,228,178,204, 23,167, 42, 42,249,121,121, 97,225,225,225, 53,155, 52,105, +130, 29, 59,118, 52,111,221,170, 85, 42,143,207, 55,243,121, 60,176, 42,113, 35,209,170,213, 87,174, 92,185,210, 98,192,128, 1, +156,123,247,238,193,221,221,189,216,104, 21,253,229,112, 56, 32,132, 64, 44, 22,227,248,241,227, 70,173, 90,125,165,194,104,145, +197,106, 97, 21, 26, 61, 66, 8,228,114, 57,120, 60, 30,214,173, 91,143,205,107,215,142,180, 0, 71, 2, 36, 46,159, 3, 16,254, +207,110,208, 26,205,213,179,103,207, 54, 93,180,104, 17,183, 90,181,106,144,203,229,200,203,203, 67, 78, 78, 14, 20, 10, 5, 20, + 10, 5,242,242,242, 32,151,203, 33, 20, 10, 17, 17, 17, 97,210,105, 52, 87,203,210, 19,232,116, 71,199,142, 29,251, 69,120,120, +184, 7,135,195,129,201,100,130,213,106,133,213,106,133,209,104,196,171, 87,175, 16, 25, 25,137,151, 47, 95, 34, 55, 55, 23, 92, + 46, 23,108, 54, 27,143, 31, 63,206,147,152, 76,135, 13,244,156,126,103,184,192,177,219,183,111, 79, 24, 61,122, 52, 60,171, 85, +235,128,148,148, 74, 25,152, 19,229, 24,152,252,119, 51, 48,191, 27, 32,165,242, 97, 92, 92, 92,155,142, 29, 59,194,163, 90,181, +111,235,165,164, 92,122, 94,133, 60, 45,139,217,124,235,246,237,219, 93,198,140, 25,131, 29, 59,118,124,235, 18, 23,119, 62,235, +173,102, 78, 23,192,165, 70,173, 90,223,126,248,225,135,184,120,241, 34, 44,102,243,173,114, 36, 75,142,248, 94,253,195,201, 51, +189,223, 74,124,223,198, 48,204, 12, 0,107,104,141,162, 80, 40,255,230,136, 86,149,154, 14, 69, 22,203,252, 57,115,230,152, 88, + 44, 22, 6, 13, 26,100,115,242,212,169, 33,143,159, 60,241,147,201,100,246, 22,139,165, 66, 45, 23,189,126,227,156, 57,115,228, + 6,131, 1,129,129,129,200,205,205,133,197, 98, 1,135,195, 1,135,195, 1,195, 48, 96,177, 88,144, 74,165, 8, 15, 15,199,206, +157, 59, 21, 46,122,253,198, 10,111, 18, 22,203,211,189,123,247,130,205,102, 19,161, 80, 8,134, 97,192,225,112,176,126,253,122, +217,102,224, 24, 0,176, 89, 44, 3, 0,176, 88, 76,101,179,119, 43,108,183,228,243,249,176, 22,116, 2,168,112, 93, 7,189,126, +195,234,213,171,149, 47, 94,188,128, 90,173, 46,142,190,169, 84,170,226,228,122,185, 92, 14,134, 97,160, 86,171,113,234,212, 41, +165,131, 94,191,161, 44,189, 28, 32, 35, 37, 38,166, 95,243,230,205,115,226,226,226,144,159,159,143,167, 79,159,226,242,229,203, + 56,116,232, 16, 46, 94,188,136, 87,175, 94,193,108, 54,195,203,203, 11,132, 16,156, 56,113, 34,223,172, 84,246,202, 1, 50,232, + 57, 81, 54,213,221,221,187,184,185,186, 38,185, 56, 59,167, 84,119,119,239,242,246,231,118, 64,116,116,116, 52,204,102, 51,252, +252,252, 28,203,203,211, 34,102,243,237,219,183,111, 99,204,152, 49,240,174, 89,115,149, 47,224,242,246, 58,190,128,139,111,173, + 90,171,138, 12, 12, 49,155,111, 87,181,204, 54,192,166,207, 63,255, 92,203,227,241,112,240,224, 65, 63,147,191,255, 75, 14, 48, + 66, 10,212,233, 8,240, 42,250,190, 7,176,229,171,175,190,202, 96, 24, 6,251,246,237,115,182,171, 85,235, 25, 7, 24,107, 7, + 84,183, 3,170,115,128,177,118,181,106, 61, 59,120,240,160,179,217,108,198,172, 89,179, 50, 60,128, 45,229, 72,206, 36,132,244, + 37,132,180, 39,132,120,239,220,182, 17,103, 79, 30, 41, 50, 89, 19, 81,144,244, 62, 26,192, 51, 90,227, 40, 20,202,191,153, 82, +195, 80,156,230,203, 51, 1,226,218,161,101, 67, 60,124, 18,149,239,236, 96,123,161,232,179,220,200, 35,181, 59, 7,217, 54,252, +225,135, 31,192,229,114,145,156,156,140,231,207,159,195,214,214, 22, 35, 71,142,212,107,149,202,126, 37,230, 58,236, 10,224,114, +161,102,193,124,106,249, 49,210, 90,156,136,154,231,207,134,178,237,236,236,160, 82,169,192, 98,177, 32, 20, 10, 33, 22,139, 33, + 18,137,240,232,209, 35,244,233,219,223,146, 37,110,255,251,128,165,191,207,167, 86,172, 89, 52,214, 80, 11, 64, 28, 14,124,230, +234,233, 57,103,225,194,133,162, 30, 61,122,128,199,227,161, 90,245,128, 12,191,158,107, 54,177, 88,140, 57, 37, 71,177,160, 86, +117, 79,187,231, 49, 9, 0, 24,153,233,193, 66,207, 18,115, 29,254,161,156, 62,134, 27,126,199,127, 89,107,219,184,113, 65, 62, +186, 92, 46, 71,102,102, 38,100, 50, 25,228,114, 57,212,106, 53, 0, 32, 52, 52, 20,103,111,190, 84,104,171, 13,137, 45,171,156, +191,111,123,148,141,167,241,126,141,253,123,127, 97,187,184,184, 32, 51, 51, 19, 89, 89, 89,144,203,229,208,106,181,176, 88, 44, +200,205,205,197,207,187,126,177,228, 72,219,199, 23, 15, 8, 89,158,166, 58, 89,228,168,186,227, 21, 92,207,151, 76,152, 48,193, +198,214,214, 22, 86,171, 21,121,121,121, 72, 74, 74, 66, 92, 92, 28,110,222,188,169,150,201, 13, 80, 59,119, 75, 41, 30,176,180, + 20,205, 63,145,127,156,102,201,113,171, 60, 61, 60,210, 18, 19, 19, 93, 45, 22, 11,188,188,188,204,242,220,220, 85,124,224,162, + 13,144, 14,128,100, 3, 11, 55,108,218, 52,190,127,255,254,104,214,172, 89,114, 70,102,102,141,210,234, 18, 1,216,129,128,157, +166, 90,181,200, 7, 15, 30,184, 39, 37, 37, 97,204,152, 49,217,137,175, 95,207,179, 43,204,215,202, 7,218,249,214,170,181,234, +224,193,131,206, 53,107,214, 68, 80, 80, 80,134, 48, 41,169,126, 20,144, 95, 70,253, 44,243,220,148, 71,159,169, 49,109, 96,131, +102, 31,125,244, 17,204,102, 51,110,222,188,137,251,247,239, 35, 49, 49, 17,119,238,220,145,219, 74, 36,195, 74,204,117, 88,106, +253,236, 21,160,246,219,183,111, 47,195,227,241,176,107,215, 46,132,135,135, 3, 0,130,131,131,241,225,135, 31,194,108, 54, 99, +212,168,209,228, 76,148, 40,182,188,250, 9,160, 1,128,239, 80, 96,242,154, 17, 66,132, 12,195,164, 1,240, 70,213,114,178,104, +253,164,154, 84,243,191,163,249,175,162,220, 73,165, 75,206,167,182,252, 71,216,189, 57,205,199,164,180, 35,219,150,114,218,182, +107, 95,103,233,146,197,172,230,205,155,195,219,219, 27,193,193,193, 72, 74, 74, 18,216,219,219, 87, 52,159,154,170,125,207, 17, +113, 13, 27, 54,180,159, 55,111,158, 93,247,238,221,185,222,222,222, 32,132, 32, 60, 60, 28,199,142, 29, 51,238,216,177, 67,161, +113,235, 43, 15,187,246,171,170, 50,243,169,221, 7, 52, 0,150, 85, 75, 75,219, 62,125,218,180,197,141,155, 52,153,176,100,201, + 18,150, 84, 44,226,174, 92, 48, 81, 8, 0,203,191, 63,100,215,127,200, 72,108,240, 7, 58,140, 40,125, 30,185,146,229, 76, 74, +153,148,216,123, 96, 23,255,207,102,140,183, 12, 29, 58, 84, 98,107,107, 11,111,111,111, 56, 56, 56, 32, 54, 54, 22, 41, 41, 41, +228,244,233,211,170,187,143,163,185, 39, 46, 62, 76, 20,218,121, 84,102, 94, 66,101,251, 30, 31,196,247,238,221,219, 97,236,216, +177, 54, 77,155, 54,229, 10, 4, 2, 8, 4, 2,100,102,102,226,213,171, 87,198,211,167, 79,171, 52,174,189,242,194,174, 29, 84, + 86,114,174, 67,109,251,225, 75, 95,221,186,180,100, 86,228,211,167,163,173, 64, 35,163,209,232,101,177, 88, 24, 22,139,149,110, +181, 90,159, 26,149,202,157,250,224, 37,235,233, 92,135,149,195, 98,177,240, 44, 22, 11,228,114, 57, 46, 93,186,196,121,253,250, +245,194, 39, 79,158, 44, 76, 75, 75,131,201,100,194,224,193,131, 17, 28, 28,140,107,215,174, 33, 43, 51,243,116,121, 90, 81, 64, +190, 32, 37,229,195, 73,147, 38,157,219,187,119, 47,235,201,147, 39,206,187,118,237,250,185, 52, 3, 51,122,244,104,107,102, 82, +210,135,122, 32,191,156,250, 89,222,185,153,125,254,224,230, 39, 3, 6, 13,169,183,100,209, 66,110,235,214,173,225,236,236,140, +118,237,218,193,104, 52,218,215,173, 91,183,162,115, 83,217,190,231,176,216, 70,141, 26, 73,214,175, 95,239, 62,126,252,120,204, +152, 49, 3, 0,160,213,106,113,241,226, 69,204,154, 53, 43, 35,137,211, 66, 93, 81,253, 44,140, 84, 21, 25,176, 27, 0,218, 3, +136, 5, 77,124,167, 80, 40,255, 78,138, 38,149,246, 64,193,196,210,103, 80,240,112, 94,241, 92,135,183,238, 63, 67,201,105, 62, + 10,240,120,110,246, 25,251,122,202,156, 85, 65,108,147,194,129,203,232,108, 99,162,163,153,138,230, 60, 44,158, 79,205, 46, 64, +229, 20,119,160,249,202,229,203, 63,217,176, 97, 67,151,162, 33, 28,196, 98,241, 83,173, 90,125,197, 69,175,223,168,177, 11,184, + 82,213,185,249, 82,128, 76, 0,211, 28,194,194, 54,133,244, 31,188, 90,232,232,199,253,114,197, 14, 29,155,197, 50,188, 74,203, +194, 6,127, 64, 82,137, 14,146, 26, 3, 16, 41,247, 48,103, 58, 13,137,250,234,243,207, 63, 91,190,108, 89,115,169, 84,218,193, +104, 54, 7, 88,173, 86,192,106,141,209,168,213, 55,136,209,248, 64, 31,188,104,173,208,206,131, 84,122, 94, 66,251,186, 74,199, +248, 35,205,119,239,220, 57,243,240,225,195,127,216,118, 39,189,126,147,198,190,238,229,202,108,123,201,117,116,192,111,144,201, +126, 43, 47,116, 73,231, 58,172, 28, 28,171,117,178,131,131,195,158, 46, 93,186, 8,187,118,237,138, 62,125,250,160,117,235,214, +176, 90,173, 32,132, 64,169, 84,226,208,161, 67, 88,189,122,117, 76, 13, 96, 89, 69,122,122,224,138,224,236,217, 94,141, 26, 53, +218, 85,158,129, 41, 52, 89, 21,230, 36,150,127,110, 10, 98,204,118,253, 18,134, 79, 95,233,111, 80,164,219, 59,137,205,238,145, +207,158,178, 42,127,110, 6, 42, 45,225,135, 90, 12, 30, 56,112, 58,155,195,105, 87,216, 3,146,188,120,254, 60,172,104, 82,105, + 4,127,120,169,138,117,169,104,236, 58,154,248, 78,161, 80,254,237, 70,171, 15, 10,242,181,138,167,228, 41,115,174,195,162,168, + 15,135,195,145,197,158,152, 50,178, 60,117, 46,208,165, 48,146,133, 10,231, 58, 44,252, 63, 1, 80, 66,175,255,250,141,193, 72, + 75,244, 46,228,190,181,126, 85,134, 69,204, 3,162, 96,214,135, 64,246, 28, 56, 53,173, 64,175,249,242,185, 37,183,169,204,155, +236, 27,191,203,203,213, 1,183,160, 82,221,130, 74, 85,106,210, 46,151,195,203,173,168,156,111,111,123, 18,160,120,223,109,127, + 91,179, 66,243,240, 30,251,243,191, 70,106,118,246, 9, 0,210,106,161,161,110,231, 67, 67,135,126, 54,123,246, 96, 15, 79,207, + 90,206,206,206, 14, 54, 54, 54,172,123,247,238,197,153,117,186, 77,141,129,221,133,209,212, 10,209, 3, 87, 2,147,146,234,127, + 48,112,224,116,134,195,105, 91,210,192, 16,179,249,142, 31,176,165,188, 72,214,187,158,155,222, 2,143, 46,133,145, 44,176,129, + 73,149,169, 27, 41, 5,229, 88, 1,179,121, 5, 34, 34, 74,169,243, 85,174, 75,203, 25,134, 81,130, 38,190, 83, 40,148,127, 47, + 69,243, 29,158,249,255,254,225,174, 84,147,106,254,139, 52,217, 40,232, 69, 71,247, 39,213,164,154, 84,147,106, 82,202,165,104, +174, 67, 14,221, 21, 20, 74,165,177,224,247,102, 48, 10,133, 66,161, 80,138, 40,202,205, 42,201,118,160, 32,117,167, 44, 87, 90, +149,222, 4,239,226,108, 47, 83, 77,170, 73, 53,169, 38,213,164,154, 84,243, 63,167, 89,145,246, 63,177, 55, 99, 81, 78, 86,113, +110, 86,101,103,183,121, 95,104, 88,149,106, 82, 77,170, 73, 53,169, 38,213,164,154,255,118, 60, 10, 77, 86,241,171,168,233,144, + 69,247, 13,133, 66,161, 0, 75,150,128, 69, 8, 24, 66,150,176, 8, 57,204, 38,100, 8,155, 16,188,215, 84, 32, 67,134,148, 62, +152,237,199, 35, 29,108,232, 30,167, 80,254, 85,164,163,140, 73,165,105,142,214,255, 22, 31,119,119,247,109, 0,152,140,140,140, +201, 0,146,232, 46,249,251,225,232,232,216,197,108, 54, 67,161, 80, 92,249, 55,110, 95,189, 90, 24, 72, 88,168, 91,252, 6, 65, +210,139, 87,216, 83,218,186,117,253, 49, 6,204,239, 99,113, 49, 86,188,120,254, 26,199,171,240,115,172, 94, 93,189,183, 0,192, +185,203,201,211,241,215,140,171, 85,219,197,197,229, 2,135,195,225, 88, 44,150,105, 50,153, 44,180,108, 35, 52,132, 13, 0, 92, +114,109,190, 60,195,117,222,167, 83, 25,174, 70,191, 83,174,215,170,243,217, 92,118,188,128,235,126,123,202,120,214,185, 60, 85, +171,231,165,125,255,200,145, 35,101,206,226, 93,223, 31,189, 88,150,122,125,131, 27,196,197,126,183,177,249,134, 14,126,206,220, +184,228,199,210,111,183,230,111,227,219,251,246, 29, 51,148, 9,229,136,153,209, 59,119,230,168,232, 89, 86,121, 86, 2,142, 70, + 32,136, 43, 16,120, 91,204,102, 55, 6, 32,108, 14, 39,211,164,215, 39,243,128,136,249,128,252,223,174,201, 19, 8,170, 89,204, +102, 55, 0,248, 59,150,147,242, 38,101, 26, 45,169, 84,250,136,197, 98, 85, 43, 57, 25,110,209,124,130, 69,239,149,252,140, 97, + 24, 88, 44,150,148,188,188,188,166, 85,248,125, 91, 0, 67, 1, 20,117, 81,223, 15,224, 16,222, 61,225,216,150,199,227,205,145, + 72, 36,157,181, 90,109,125, 0, 16,137, 68,145,106,181,250,170,209,104,252,238, 29,117, 57, 0, 62,144, 74,165,157, 88, 44, 86, + 39, 66, 8, 67, 8,185,166, 82,169,174, 2, 56, 12,224, 93, 70, 74, 16,185,186,186,174,112,116,116, 28, 49,127,254,252, 28, 39, + 39,167,192, 89,179,102, 61,204,205,205,253, 53, 59, 59,123, 1,170, 48, 71,221, 95, 76, 45,119,119,247,253, 92, 46,151,157,156, +156,220, 9, 0,188,189,189,175, 25, 12, 6,139, 76, 38, 27, 9,224,117, 21,245, 36, 0, 90, 74,165,210,166, 82,169,180,189,197, + 98,169, 91, 56, 63,227, 11,149, 74,117,211,104, 52, 62, 2,112, 15,128,250,111,116,142,216,112, 56,156,189,133,117, 61, 0,128, +242,223,118, 17, 32, 44,212,125, 30,249, 50,176,216,120,213,175, 83,246,202, 12,124, 74, 89,183,210, 70,171,115, 7,143,190,253, +250,117, 99, 1,128,193,116,174,239,213, 27,233, 39,255,108,147, 53,104,208,160,223,246,238,221,235,160,215,235, 49,121,242,228, +253,151, 47, 95,222,162, 80, 40,230,151,123,225,144, 58,204, 90,179,254,162,152, 97, 88, 0,224,106,181, 90, 92, 83, 83, 95, 7, + 60,127,246, 91,207,200,200,187, 43,181, 47,175,222,179, 50,220, 41, 70,180,123, 89,153, 66,212,245, 67, 72,223,193, 3,251, 44, + 91,182, 4, 35,134,141,168, 30, 25,169, 19,121,217,198,242,115,181, 18,127, 39, 23,215,126,203,150, 31, 97,110,223, 58,209,111, +239,174,165, 87,199,143,119,234, 76,205, 86,165, 96,150,115, 56, 45,237,252,253,219, 15, 59,113, 2, 82,111,111, 14, 71, 32, 96, + 1,128, 89,175,247, 86, 37, 39,123, 28,236,215,175,197,146,232,232,235, 75,128,251, 84,243,127,162, 73,169,138,209, 98,177, 88, +213, 82, 83, 83, 93, 37, 18, 73,193,197,152, 16, 88, 44, 22, 88, 44,150,226,201,139, 9, 33,197,127,205,102, 51,234,212,169, 83, +169, 39, 90, 0,157, 1,140,235,216,177,227,144,239,190,251,142, 27, 20, 20, 84, 52,101, 72,187, 47,191,252,242,251,240,240,240, +163, 0,118,163, 96,240,198,202, 62,241,246,144, 72, 36,251,214,172, 89, 99,219,173, 91, 55,142,167,167, 39, 24,134, 65, 70, 70, + 70,203,203,151, 47, 55,157, 53,107,214, 52,181, 90, 61, 10,192,133, 42,236,159, 6, 54, 54, 54, 71, 6, 14, 28, 88,173, 67,135, + 14,194,122,245,234,193, 98,177,224,241,227,199,227, 31, 61,122, 52,252,232,209,163,139,149, 74,229, 16, 84,126,190, 54, 70, 42, +149,142,181,181,181, 93,177,104,209, 34,199, 81,163, 70,241,159, 61,123,150,231,231,231,199,220,190,125,219,229,208,161, 67,211, + 86,173, 90,245,129, 66,161, 88,160, 82,169,126, 65, 37,230, 80,180,177,177,121,196, 98,177,170, 85,198, 8, 3,168,138, 25,110, + 92,163, 70,141, 67,183,110,221,170,145,144,144, 96, 25, 48, 96,192, 30, 0,184,122,245,106,144,201,100, 98,186,119,239,126, 46, + 37, 37,101, 40,128,199,149,220,246,134,142,142,142, 39, 71,140, 24,225, 88,171, 86, 45,113,141, 26, 53, 24,137, 68, 2, 54,155, +141,252,252,124,207,103,207,158,117,189,127,255,190,246,242,229,203,185,122,189,190, 31,128,136, 42, 28,167,214,174,174,174,163, +185, 92,110, 3,179,217,236, 5, 0, 28, 14, 39,213,100, 50, 61,147,201,100,123, 1,252,246,174, 39,136,155,155,219,230, 21, 43, + 86, 56,203,100, 50,178,106,213,170,205, 74,165,114,236,191,245, 98,176,255,215,195,120,244,240, 62, 80, 48,109, 14, 83, 74,253, + 99, 0,240, 62,253,116, 54,154, 54,107,129,145, 35, 62,168, 80,179,119,151,106,107,184,124,158,147, 78,167,251, 45, 95,163, 63, + 44, 17, 11,135,142, 24, 30, 18, 3, 0,231,206, 95, 31,218,188,185,195, 53, 59,177,224, 3,161, 80,216,218,100, 48,230,156,189, +146,242,121, 85, 76,149,151,151,215, 5, 7, 7, 7,113,110,110,110, 70, 86, 86,214,143,125,251,246, 93,190,123,247,110,135,184, +184, 56, 36, 39, 39,227,147, 79, 62,145,166,164,164, 76,143,136,136,184,107, 48, 24,202,140,108, 41,149,185, 27,191,156,215,127, +145,157,157, 51, 91, 34,182,133,141,157, 35,252,106, 53, 66,203,214,125,209,171,207, 4,188,138, 9,111,185,123,215,178,240,212, +212,203,223, 72, 29,107, 46,151,203,107,148,121, 93,170, 87, 27, 29,250, 13, 44, 48, 89,139, 22, 45, 65,244,203,151,202,132,120, +214,199,103, 78,112,196,189,186,212, 17,152, 13, 25, 9,183,111,157,168,209,182,221, 0, 0,104,186,119,215,210,171, 31,143,116, +232,178,121,127,158,146,222,146,202,190,118, 46,227,114,199,246, 88,191,222, 53,120,218, 52,158, 42, 62,222, 24,187,117,171, 38, +243,230, 77, 11, 71, 32, 32,222, 61,123, 50, 46,157, 58, 9,167,189,120,193,187,179,106, 85,123,238,210,165,126, 11,140,198,125, + 84,243,255, 85,243,191, 78, 81, 18,124,201,222,135,219,203, 53, 90, 12,195, 64, 34,145,224,224,193,131,224,114,185,224,112, 56, +224,114,185,101,254,239,227,227, 83,153,130, 12,114,119,119,255,126,203,150, 45,110, 61,122,244,128, 80, 40, 44,254,128,205,102, +163, 91,183,110,232,218,181, 43, 55, 45, 45,109,248,193,131, 7,135,175, 92,185, 50, 83, 46,151,207, 64,225,196,208,229,208, 41, + 48, 48,240,216,197,139, 23, 69, 58,157, 14, 55,111,222, 68, 94, 94, 30,248,124, 62,170, 85,171,134,238,221,187,115, 94,190,124, +233,216,173, 91,183, 99,209,209,209, 33, 0,174, 85,162,172, 77, 93, 93, 93,111, 28, 62,124, 88,216,168, 81, 35,230,213,171, 87, + 8, 14, 14, 6, 0,228,231,231, 99,192,128, 1,194, 81,163, 70,213, 26, 62,124,248, 61,153, 76,214, 1,192,163, 10,244,154,184, +187,187,255, 50,112,224, 64,207,149, 43, 87,218,218,216,216, 32, 33, 33, 33,221,221,221, 61,160,104,127, 15, 31, 62,156,223,183, +111, 95,143,213,171, 87,111, 60,114,228,200,231, 50,153,108, 44,128,176,114, 93,107,161, 33, 22,139,197,200,204,204,196,254,253, +251, 49,125,250,116,176,217,108,200,100, 50, 28, 58,116, 8, 31,127,252,113,145,161,169,148, 25, 22,139,197, 93,253,253,253,127, +190,122,245,106, 53,123,123,123,120,122,122,178,190,250,234,171, 6,126,126,126,162,234,213,171,179,211,211,211,113,236,216, 49, +191,209,163, 71,159, 76, 74, 74, 26,175,215,235, 43,108, 82,115,115,115,219,121,230,204, 25,159,200,200, 72,108,221,186, 21,185, +185,185,224,243,249,176,183,183,135,187,187, 59, 2, 2, 2,152,121,243,230,137,251,246,237, 43,158, 49, 99,198, 78,131,193,208, +184, 18,199,168,145,171,171,235,182, 78,157, 58,249, 45, 93,186,212,222,221,221, 29, 69, 15, 6,249,249,249,213, 18, 18, 18, 90, + 46, 90,180,104,200,163, 71,143,226,100, 50,217, 20, 0, 79,170,120,226, 52,174, 87,175, 94,200,128, 1, 3,216,233,233,233,216, +187,119,111,136, 82,169,108, 92, 5,115,249,143,226,209,195,251,152,252,209, 39, 42, 79,111,111,222,197, 11, 63, 15, 58,114,188, +246, 67,123, 81,193,132,212,114, 45,140, 67, 6, 70, 55,235,222, 99, 2,175,119,159, 1,170,237, 63,108,148, 86,198,104,113,249, + 60,167,253,251,214, 37,221,186,253,168,193,165,203,247,123, 14,234,215,143,240,120,246,126, 0,240,249,172, 79,185,199, 78,157, +218,213,173,107,139,180,118,109,155, 38,141, 28, 53,219,167, 10,197,173, 93,187,118,237,235,225,225,225,110, 2,129, 0,185,185, +185, 78,219,183,111, 95,215,182,109, 91, 86,108,108, 44, 94,190,124,137,248,248,120,228,231,231,163, 91,183,110,210,176,176,176, + 31, 1,148,105,180,140,172,206, 43, 60,171,155, 54, 57,137, 36, 53,140, 22,133, 43, 49,165,215,187,116,230, 82,195, 3,123,181, +193,110, 30,117, 2,198,125,184, 24,203,150, 31,229,254,186,255,219, 69, 87, 46, 31, 0, 88, 53,202,158, 17,128,160,245,151, 11, +230, 67,161,212, 99,212,136, 73, 24, 61, 98,146, 19,129,193,131, 88,116, 18,131, 54,207,222,134,247, 34,116,203,142,117, 3, 1, + 84, 43, 97,182,174, 80,179, 85, 54,203, 56,156, 22, 33,223,127,239,210, 96,226, 68,193,147,165, 75,213,217, 55,111,106,253,123, +247,206, 11,158, 58, 85, 15, 0,202,248,120, 94,244,226,197, 98,151,246,237, 69,173,230,204,113,176, 24, 12,238,203,150, 45,107, +190,168, 96,242,242, 42,105,250, 12, 29,106, 89,180,107, 87,179,155,179,103,119,100, 76, 38,118,207, 86,173, 30,175,218,187, 55, +245,125, 52,255,204,114,166,221,184,161,207,245,243, 67,240,128, 1, 57, 62,174,174,250, 63,115,219,223,167,156,148, 98,138,114, +181, 38,151,124, 66, 69,104,104,104, 7, 0,215, 1, 44, 13, 9, 9, 89, 2, 0,118,118,118,153,114,185,220,245,216,177, 99, 21, +154, 44, 46,151, 11, 15, 15, 15, 4, 4, 4,200,100, 50,153, 91, 57, 5, 72,182, 90,173,213, 8, 33,197,209,151,178,208,235,245, +136,137,137, 65,195,134, 13, 83, 80, 48, 17,109,153, 65, 29,177, 88, 28,251,242,229, 75,231,231,207,159,227,209,163, 71,240,243, +243,131,131,131, 3,184, 92, 46, 76, 38, 19, 20, 10, 5, 2, 3, 3, 33, 16, 8,208,164, 73,147,108,181, 90,237, 87, 65, 19,144, + 64, 34,145,196,220,184,113,195, 59, 56, 56, 24, 15, 30, 60,128,183,183, 55,220,221,221, 1, 0,241,241,241,184,125,251, 54,122, +247,238,141,240,240,112, 12, 30, 60, 56, 89,173, 86, 7, 0,208,151, 37,232,232,232,152,126,245,234,213,148,160,160, 32,157, 90, +173,102,101,102,102,114,111,222,188,105, 86, 42,149,210,252,252,124,174, 92, 46,231, 42, 20, 10,142, 90,173,230,178, 88, 44,158, + 86,171,229, 94,185,114,133,109, 52, 26,203, 29, 32,179,232, 56,157, 58,117, 10, 65, 65, 65, 56,118,236, 24, 62,251,236, 51,220, +185,115, 7,222,222,222, 56,124,248, 48,230,204,153,131,168,168, 40, 56, 59, 59,163, 94,189,122, 21, 29, 35,212,170, 85,235,213, +211,167, 79,107,241,120,188,162,121, 29,139,230,203, 67, 86, 86, 22, 94,191,126,141,212,212, 84,248,251,251, 99,196,136, 17,175, + 83, 83, 83,253, 43,170,121, 94, 94, 94, 89,145,145,145,206, 13, 27, 54, 68,102,102, 38,236,237,237, 97,103,103, 7,123,123,251, +226,255,253,252,252, 48,123,246,108,184,187,187,203,116, 58,157, 91, 69, 38, 40, 40, 40,232,194,149, 43, 87,156,109,109,109,145, +145,145, 1,133, 66, 1, 14,135, 3,177, 88, 12,103,103,231, 98, 35, 31, 19, 19,131, 62,125,250,100,199,198,198,246,168,130, 73, + 98,185,185,185,189,140,136,136, 8, 32,132, 32, 41, 41, 9, 81, 81, 81,248,232,163,143, 98,116, 58, 93, 29,252,139,230,236, 43, +145,119,197, 27,251,225,100,222,192,254,173, 13, 47, 34, 67, 25,129, 53, 10,141, 27,216,230, 3,192,227,103, 10, 59, 61, 43, 16, +117,235,135,144,227, 39,127,227,255,178,123, 59, 23, 86,184,129, 65,212,139, 24,124, 93,150,118,247, 78, 30, 19, 63,253,116,124, +131,142,109, 59,176,148,106,181,235,143, 63,174,111, 18, 27,251,194, 21, 0,252,252,234,202,166, 77,155, 21,102, 35,145,200,174, +223,190, 97,221,176, 97,231,179,139,215,210,119, 84,162,200,126, 1, 1, 1,119, 79,157, 58,229,236,234,234, 10, 59, 59, 59,168, +213,106, 24,141, 70, 60,127,254, 92,119,240,224, 65,147,173,173,173, 77, 70, 70, 6,228,114, 57, 24,134,193,169, 83,167,146, 0, +248,190, 45, 84,148,163, 5, 0, 31,245,170,203,173,215, 57,192,129, 39, 48,139, 68,220,104, 15, 48, 22, 1, 67,164,110,231, 46, + 60,110,120,238,210,131,145, 3, 7,125,230,210,174,195, 64, 44, 90, 56,196,148,150,150, 20,108, 68,187,151,165,229,104,213,241, + 71,231, 1,131, 7,126,176,108,217, 18, 44, 89,180, 20,161,167, 78,228, 75, 37, 44,189,173, 61,215,174,125,203, 54,186,217,211, +251, 39,171, 84,105,222,203, 86, 31, 28,209,167,255,236,106,109,219, 13,192,237, 91, 39,176,119,215,210, 71,140,136,208,102,196, +183, 88, 2, 56,216,251,249, 77,153, 25, 19,195,123,178,100,137,202,156,150,150,215,116,214,172,236,210,214, 77,185,116, 73,194, +247,244,180,117,232,215,207,113,163,175, 47, 49,201,100,219, 74,203, 49, 42, 77,243,178, 84,106,127,224,220,185, 46,132,203,237, +240,197,220,185,162,144,144, 16, 40, 20, 10, 28, 61,122, 20,219,182,110,213,123,120,120, 60,245,124,246, 44,188,129, 66,177,176, +178,154, 77,103,205,202,182, 88, 44,204, 7,115,230,116,139,140,143,239,156, 33,147, 85, 7, 0, 15, 71,199,228,166,126,126,143, +118,134,134, 70,109,174, 81,195, 90,217,114,254,116,254,188,219,145,132,132,137,142,142,142,162, 76,153,140, 35,224,243,115, 90, +214,171,119,248,135, 5, 11,174,155, 35, 34,120,194,106,213,108,237, 66, 66,170,188,237, 77,103,205,202,206, 85, 42, 57, 51,151, + 47,111,147,152,153, 89, 93,165,215,251,203,149, 74,119,139,201,196,178, 21,139,115,106, 6, 6,202,180, 55,111,166,215,212,104, + 62,217, 1,200,254,170, 99, 93,154, 23,249, 7,241,246, 56, 90,103, 8, 33,111,204,117,120, 61, 36, 36,228, 15,189,107, 8, 33, +149,138,102,113,185,220, 55,154,169,202,129,199, 48, 12,194,194,194,224,228,228, 4,119,119,119, 8, 4,111, 78, 62,152,149,149, +133, 59,119,238,224,197,139, 23,104,212,168, 81, 81, 51, 70,217,142, 72, 32,248,116,245,234,213,246, 6,131, 1,143, 30, 61, 66, +211,166, 77, 33, 16, 8,192,227,241,222, 48,129, 50,153, 12,245,235,215,199, 23, 95,124, 97,183,114,229,202, 79,245,122,125,153, + 79,164, 28, 14,103,198,164, 73,147, 92,139, 34, 88,201,201,201,104,210,164, 73,241,231, 46, 46, 46,120,252,248, 49,154, 54,109, +138,106,213,170, 97,200,144, 33,174,123,247,238,157, 97, 54,155,191, 43, 75,147,207,231,179,130,130,130,154, 1,128, 68, 34, 1, +139,197,138,182,181,181,117,113,115,115,147,216,218,218,254, 97, 27,119,237,218, 37,103,177, 88,166, 10,221, 0,139,133,140,140, + 12, 52,104,208, 0,249,249,249, 0, 0,181, 90, 13,127,127,127, 40, 20,138, 98,211,234,233,233, 9,173,182,252,212,175,134, 13, + 27, 46,169, 83,167, 78,119,137, 68, 34,224,114,185,120,242,228, 9,130,131,131,113,240,224, 65,248,248,248, 64, 44, 22, 35, 38, + 38, 6, 65, 65, 65,184,113,227, 6, 92, 92, 92, 80,191,126,125,129,171,171,235,173,220,220,220,107,137,137,137, 75,202, 41, 39, + 75, 42,149,226,198,141, 27,216,185,115, 39,226,227,227,145,150,150, 6, 27, 27, 27, 52,110,220, 24,245,234,213, 67,235,214,173, + 17, 19, 19, 3,166,226,202,228, 30, 16, 16, 16,250,224,193, 3,103, 66, 8,246,238,221, 11,149, 74, 5,131,193, 0, 22,139, 5, +161, 80, 8, 7, 7, 7,116,238,220, 25, 46, 46, 46, 8, 8, 8,192,161, 67,135,156,123,245,234,117, 86, 38,147, 53, 6,144, 81, +209,126,117,112,112,248,100,241,226,197,222,174,174,174, 72, 72, 72, 64,126,126, 62,220,220,220,208,177, 99, 71,175,203,151, 47, +127, 98, 50,153,214,255, 91,110,100, 37, 18,223,153,139, 23,126, 30, 20, 80, 51, 47,168, 81,160,216,251, 88,168,155,247,193, 80, + 89,125, 0,104, 80,215, 45,114, 80,136, 56,249, 73,100,104,242,197, 11, 39, 30,189,136,198, 49, 84,162,105, 59, 95,163, 63,124, +233,242,253,158,193,141,154, 88, 87,127, 59,167,207,244,143, 38, 10, 92,221, 38, 32, 51,233, 4, 46, 95, 13,243,153,243,217, 36, +151,239,214,254,116,238,210,229,251,172,124,141,126, 97,229, 66, 89, 62,155,119,255,208,218, 89,153,125, 4,175, 94,242, 33,178, +105, 0, 63,191,218, 80, 40, 20, 16, 10,133,194, 17, 35, 70, 88,230,207,159,175,177,181,181, 21, 51, 12,131,107,215,174,201, 0, +244,168, 72, 87,231,234, 64, 44, 70,147,153,240,217, 86,194,216,104, 25, 75, 46,255,217,243, 56,116,239,218, 41,179,109,139, 6, + 43,231, 47, 91,251,101, 64,237, 96,151,241, 19,151,114,151, 47, 25,185, 21, 12,218,149,166,243,242, 21,174, 50,135,143,139, 0, +244, 89,246,245, 18,196,198,198, 56, 76, 30, 39, 95,202, 17,136, 60,235,248,182,177,217,186,243, 90, 79,127,255, 26,213,103,207, + 24,114,102,221,247,235,250,148,140,108,237,222,181,248, 36,128, 46,149,217,183,255, 33, 26,142, 14, 13,133, 42, 41,201,148,123, +235,150,174,203,247,223,103,123,247,232,177,222, 96, 52, 58, 23, 93, 42, 88, 12, 3,166, 40,117,194,106,101, 56, 95,124,193, 34, + 28, 14, 76, 14, 14,227,144,151, 87,187, 34,205,207,210,211, 7,141,156, 56,177,207,201,243,231, 81,163, 70,141,226,251,153,189, +189, 61,230,204,153,131, 89,179,102, 9, 30, 63,126,220,252,200,145, 35,205,191, 91,179,198, 13,192,160,202,148,243,226,189,123, + 14, 83,151, 45, 91,208,168,105, 83,159, 61,251,247, 11,106,213,170, 5, 0,120,253,250,117,192,183,171, 86,249, 54, 8, 10,202, + 92,249,233,167,187, 35,231,207,175, 15,224, 86,121,154, 25, 55,111, 26,142, 36, 36, 76,188,122,237,154,125,131, 6, 13, 0, 0, + 81, 81, 81,174, 27, 55,110,156, 84,127,200,144, 81,203,166, 77, 91, 24,162,211,201,109,179,178, 4, 33,155, 55,115, 14,124,240, + 65,133,154, 69,229, 4,128,142,227,199,127,218,174, 83,167,122,131, 38, 78,116,244,241,241, 97,164, 82, 41,140, 70, 35,210,210, +210, 28, 34, 35, 35,107,133, 42,149,138,227,247,238,237,133,197,210,237, 47, 60,214,165,122,145,127, 88, 36,235,143,158,162,240, +111,199,208,208, 80, 2,160, 99, 72, 72,200,141,162, 27,184,197, 98,169,148,201,226,112, 56, 96, 24,166,178,102, 11,132, 16,100, +103,103, 35, 59, 59,187,184,233, 72, 38,147,225,234,213,171,136,137,137, 1,151,203, 5,143,199,131,209, 88,241, 28,180, 18,137, +164,107,215,174, 93, 57,247,238,221,131,159,159, 31, 68, 34, 81,113,185,138, 94, 60, 30, 15, 30, 30, 30, 80, 40, 20,232,210,165, + 11,119,211,166, 77, 93,203, 51, 90,118,118,118,189,135, 14, 29,202, 47, 90, 86,169, 84, 96,179,217,197,166, 69,165, 82, 33, 55, + 55, 23,114,185, 28, 58,157, 14,173, 90,181,226,135,134,134,246,206,201,201,249,174, 50,219,175,209,104, 84, 50,153,204,190, 93, +187,118, 14,187,119,239,142,106,213,170, 85,224, 27, 53,237,250,117,157, 78,167,227,178, 88,172, 74,205,163,183,111,223,190,226, +125,159,154,154,138,173, 91,183, 22,127, 22, 19, 19,131, 77,155, 54, 21, 79, 5, 80,222, 49,170, 83,167, 78,175,189,123,247, 54, +221,179,103, 79, 30,155,205, 70, 84, 84, 20,246,239,223, 15, 66, 8, 92, 92, 92,160,209,104,144,153,153,137,107,215,174,193,108, + 54, 67, 42,149,194,203,203, 75, 56, 99,198,140,182, 75,151, 46,229,150,103,180, 44, 22,139,133,205,102,195,215,215, 23,139, 22, + 45,130, 78,167, 3,143, 87,224, 47, 21, 10, 5,228,114, 57,194,195,195,145,144,144, 0, 82,193, 40,111, 66,161,112,200,158, 61, +123, 92,249,124, 62,180, 90, 45,148, 74, 37,146,147,147,145,152,152,168,147,201,100,102, 27, 27, 27,150,175,175, 47, 75, 32, 16, + 8, 6, 12, 24,192, 20, 25,206,144,144, 16,167,189,123,247, 14, 51, 24, 12, 21,153, 36, 23,119,119,247, 47, 39, 77,154, 36, 44, + 89,103, 51, 50, 50, 48,104,208, 32,241,111,191,253, 54, 95,161, 80,236, 7,144,245, 47,187,161,145, 35,199,107, 63,124,116, 57, + 42,232, 88,168,155,119, 98,138,165,205,156,207,215,114, 0, 96,251,182,111,218, 28, 11, 77,189, 83,167, 70,102,242,145,227,181, + 31, 58, 56,188,168,200, 8,176, 58,119,240,232, 43, 17, 11,135, 14,234,215,143,252,248,227,250, 38,211, 63,154, 40,240,173, 61, +167, 32,194,201,117, 69, 23,243,215,140, 70,251, 90,248,227,143,235,155, 12,234, 55, 56, 60, 62, 62, 97, 91,231, 14,130, 67, 87, +111,164,159, 46, 47, 98,232,234, 36,244, 18, 11,212,240,242,171,135,192,186, 18, 60,126, 18,133,163,135,239,162,110,253,150,208, +235,245, 48,155,205,146,190,125,251,106, 14, 30, 60,168,139,142,142, 86,106,181,218, 14, 0,162, 43,218,248,148,148,231,214, 64, +247,150, 70,158, 72, 96, 86,230,243, 52,243, 22, 30,249,160, 73,139,238, 77, 29, 60,188,184, 46, 18,235,233, 94,221,154,239,223, +185, 99,209,172,133,139,247,163, 89,243,238,173, 94, 68,221,170, 7,224,105,169,230, 53, 22,161,172,163,199,205,177,175, 94,245, + 73, 76, 72, 72,169,237,230,110,120, 45, 39,166, 79,230,253,212,173, 93,135, 33, 13,107,213,109,207,127,241,252, 6,179,232,139, + 97,191, 46, 91,189,110, 68,145,217,186,114,233,215, 14,227,198,221,229,239,222, 93,118,116,252,191, 6, 79, 32,168, 38,245,245, +229,196,239,222,173,245,235,219, 55, 15, 0, 12, 70,163,115,124, 66,130,157, 88, 44, 6, 33, 4, 38,147,233,141, 28,226,162,188, +225, 6,129,129,110,149,209,140,255,234,171,134, 95,124,241, 5, 50, 50, 50, 96, 54,155,193,229,114,223,190,102, 67,173, 86, 99, +220,184,113,216,188,102, 77,203,202,104, 90, 44, 22,102,234,178,101, 11,230, 46, 88, 80,107,202,148, 41,172,146,215, 94, 71, 71, + 71, 28, 57,122,148,191,101,203,150,106, 95,110,222, 60,110,164, 64, 16, 11,189,190, 92,205,108,127,127, 56,102,102,138,138, 76, + 22, 0, 4, 6, 6, 98,235,214,173,130, 9, 19, 38,240,251,246,237,187,246,113,163, 70, 27,215,183,109,251,202,169,118,109, 91, +190, 64, 80,173, 34,205,162,253, 9, 0, 74,157,174,193,250,141, 27, 29,238,223,191,143,204,204, 76,100,100, 20, 60,143, 50, 12, +131,102,205,154, 49,163, 71,143,182,171,233,237,221, 28, 22,203, 95,121,184,255,224, 69,254, 65, 76, 46,229,189,223,115,180, 10, + 55,136, 41,220, 64,166,196,205,241, 13,195, 82,145,209,122, 23,228,114, 57,228,114, 57,118,236,216, 1, 30,143, 87,124,243, 5, + 0,131,193, 80, 25,211, 18,228,233,233,137,252,252,124,212,174, 93,251,141, 72, 22,143,199, 3,135,195, 1,143,199,131, 64, 32, +128, 94,175,135,143,143, 15, 52, 26, 77, 80,121,154, 90,173,182,177,163,163, 99,241, 13, 86, 95, 88, 89,245,122,125,113,121, 13, + 6, 3,242,242,242,160, 82,169,160, 84, 42,161, 86,171,131, 43,179,189, 86,171, 21,207,158, 61,123, 29, 24, 24,216,152,205,102, + 67, 42,149, 74,212,106,117,113,110, 81,110,110, 46,126,249,229, 23,245,152, 49, 99,156, 79,157, 58, 85,161,209, 98, 24, 6, 31, +127,252, 49, 4, 2, 1, 52, 26, 13,126,252,241, 71,204,156, 57, 19, 60, 30, 15, 74,165, 18, 91,183,110,197,236,217,179,193,225, +112, 96, 48, 24,176,113,227,198, 50,181,158, 63,127, 30,127,239,222,189,224, 38, 77,154, 56, 28, 63,126, 60,171, 91,183,110, 46, + 61,122,244,128, 72, 36,130, 86,171,133,201,100, 66,203,150, 45, 81,167, 78, 29,200,100, 50,156, 59,119, 46, 59, 32, 32,192,249, +254,253,251,214,140,140,140,196, 10,204, 53, 41, 17, 49,132,197, 98, 65,102,102, 38,228,114, 57,178,178,178,144,150,150,134,148, +148, 20,112, 56,156, 10, 71,211,117,114,114, 26,220,160, 65, 3, 54, 0,136, 68, 34, 52,110,220, 24, 11, 22, 44, 48,107,181,218, +161, 0,206, 21,174,214,235,167,159,126, 58,126,251,246,109,142,167,167, 39, 94,190,124, 9, 23, 23, 23,142, 80, 40,172,208,104, +185,187,187,239, 58,125,250,180, 99,145,185, 46,218,207, 26, 77,193,225, 24, 52,104,144,227,158, 61,123,118,153,205,230,222,255, +182,155,154,189, 8,188,198, 13,108,243, 15,134,202,234,207,249,124, 45,167, 78,131,130,135,215,201, 83,192,249,110,205,103,245, + 71,245,183, 61, 99, 47, 82,240, 42,210,233,213,213,123, 75,191,126,221, 88, 35,134,135,196,240,120,246,126,219,182, 47,117,117, +117,155, 80,194,134,217,194,201,217, 22,126,190,124,230,200,153, 23,174,243,230,127,173,223,183,103, 93,236,175, 7, 66,123,242, +185,151,186,159,187,156, 60,173, 44,237,232,215,242, 83, 26,189,176,174, 34, 39,130,113,116,107,131,198,141, 2,225,234,146,135, +159,118, 29, 68,141,154,205,160,215,235, 97,107,107, 43,182, 88, 44, 70, 54,155,189,175, 50, 38, 11, 0,174, 92,145, 91,235,215, +151, 27,216, 74,171,121,250,204,239, 6,118,235,213,175, 94,231,206, 93,173, 23, 47,253, 31,123, 87, 29, 31,197,241,190,159,221, + 61,205,197,229,226, 2, 4, 8, 4,130, 21,105,113,215, 80,164, 88, 11, 5, 74,209,210, 2,133, 34, 69, 75, 5, 41,180, 64,113, +104, 11, 20,119, 8, 30, 74,112, 13, 18, 15, 36, 16,191,184, 92,114,126, 43,191, 63, 34,223, 4, 34,119,129, 26,191,125, 62,159, +253,236,221,222,238,115, 51, 59,179, 59,207,188,243,206, 59, 23, 13, 29, 90, 25, 20,253,250,180,204, 56,127,105,211, 83, 69,218, +243,134, 77,155,117, 68,100,196,149,190, 28,135,112,130,168,220,250, 20,241, 12,231,181,108,228,149,131, 7, 39,177, 26,246,161, +197,119,223,135,245, 27, 48, 96,108, 64,231, 78,157,217, 75,193,127,234,197,200,142,178,233,216, 62,245,179, 79,251, 29,255,117, +239,250,222,231,207,253,222,160, 64,153, 24,196,139,172,151, 58,105, 52,237, 34,144, 72,200,172, 43, 87,232,102, 19, 38,232, 74, +159, 71,153, 76,134,147, 39, 79, 66, 44, 22,151,109, 34,145,168,236,179,139,139, 11,136,146,105,164,166,112, 2,128, 66,161, 64, +122,122, 58,108,109,109, 33,151,203,145,158,158,142, 91,183,110, 33, 54, 54, 22, 66,161, 16,125,251,246, 5, 89,133,111,243,203, +156,195,231,204,233,229,223,172,153,247,203, 34, 11, 0, 12, 6, 3,114,115,115, 49,104,208, 32,242,220,185,115,174,231,147,146, +222, 7,176,183, 58,206, 86, 3, 6,228,100, 28, 57, 82,233,127,191,243,206, 59,196,205,155, 55, 37,125,251,244,153, 53,251,251, +239, 55,253,178,103, 79, 50, 67,211,174,230,228,157, 36, 73,146, 32, 8,120,121,121, 33, 55, 55, 23, 69, 69,197, 35,216, 86, 86, + 86,176,183,183,135,209,104, 4,203,113,194,191,178,172,171,210, 34,255, 17,108, 47, 39,184,182,191, 98,209, 42,201, 20, 0,116, + 45,223,176,176, 44,107,146,200, 18, 10,133, 53,250, 92,153, 98,229,122, 25,166, 8,173,210,180, 74,165,210,178, 7,173,188,192, + 42, 77, 39, 73,146,160, 40,202,164,144,248, 44,203, 82,133,133,133, 56,122,244, 40,186,116,233, 82, 54, 44, 85, 80, 80,128,252, +252,124, 20, 20, 20, 64,171,213,226,197,139, 23,184,124,249, 50, 26, 52,104, 0,192,180,224,175,241,241,241, 15,234,214,173,219, +186,180, 17,239,214,173,155,231,174, 93,187,210,250,247,239,239,206,113, 28, 22, 45, 90,148,253,238,187,239, 58,149,111,228,107, + 2, 69, 81,184,117,235, 22, 26, 52,104, 0,142,227, 32, 18,137, 16, 19, 19, 3,103,103,103,176, 44, 11,129, 64,128,172,172, 44, + 88, 91, 87, 31, 35, 49, 60, 60,124,252, 39,159,124,146,102,107,107,219, 60, 39, 39, 71, 33,145, 72, 58, 93,187,118,205,203, 96, + 48,192,198,198, 6, 54, 54, 54, 56,123,246, 44,236,236,236, 48,115,230,204, 36,141, 70,115,203,210,210,210, 69,163,209, 60, 73, + 79, 79, 95,100, 78,121,211, 52, 13,149, 74,133,188,188, 60,228,230,230, 66,169, 84, 66,171,213,214,152,198,202,208,169, 83, 39, + 4, 5, 5, 81, 43, 86,172,248, 53, 62, 62, 30, 0,224,235,235,139,153, 51,103, 82, 30, 30, 30,120,241,226, 5, 30, 60,120, 0, +131,193, 0,142,227,170,125,120, 5, 2, 65,183,143, 63,254,184,163,183,183, 55, 97, 48, 24,192,178, 44,116, 58, 29, 74, 63, 39, + 37, 37,193,223,223,159,244,241,241,121, 47, 62, 62,190, 27, 76,155, 88,193, 3, 64, 70,210, 9,120, 8,157, 1,210, 6,156,230, + 4,114,178,107, 23,197, 37, 51, 51,243,251,185,139,111, 78,248,101,181,193, 37, 69, 1, 52, 10, 24,140,134, 77,122, 96,252, 24, + 26, 43,126, 60, 10,111,159, 70, 72, 76, 76, 68,183,110,221, 68,105,105,105,159, 20, 21, 21,205, 49,149,251,210,165, 59,204,197, +179,231,134, 13, 31, 57,182,117,207,158,253,233, 11, 23,206, 34,252,201,133,136, 79, 70,126,144,201,177, 69,132,131,157,197,195, +152,232,251, 13,155,183,236, 10, 61,205,116, 2,150,173, 6,150,113, 85, 63,239,208,159, 57,227, 70,158, 57,241,251,152, 15, 71, +143,107,209,163, 71,111,227,133, 75,167,241,224,246,165,199,107, 87, 79,188,186, 98,253,161,110,189,250,126,208, 84,238,114,235, +108,128,159,238, 83, 47, 71,219,184, 29,187,114,249,202, 82,217,179, 41,149,178, 40,121, 47,146, 4, 1,142,227, 42,136,172,151, +133, 22, 73,146, 53, 26, 0,202,115,150,111,139, 74, 59,212,219,182,109,131, 68, 34,129, 88, 44,134, 80, 40,172,209,253,162, 60, +103,196,139, 23,221,119,239,221, 43,169, 76,100,229,228,228, 32, 39, 39, 7, 69, 69, 69, 24, 53,106,148,232,155,251,247,223, 65, +137,235, 71, 85,156,222,110,110, 58, 75, 11,139,140,200,200, 72,247, 38, 77,154, 84, 72,175, 82,169,132,133,133, 5,246,238,219, + 39, 10, 28, 48, 96, 90,143,179,103,215,162,134,248, 87,149,229,157, 32, 8, 56, 59, 59,195,222,222, 30, 4, 65,128,166,105,164, +167,167, 35, 34, 34, 2,247,239,223, 7, 69, 16,244, 95, 89,198,149,105,145,255,160, 85,107,123,165, 67,135, 85,141,137,154, 35, +180, 40,138,170,181, 85,171, 42,152, 50,116, 40,147,201,194,210,210,210, 58,120,120,120,128,166,233, 50,161,245,242,208, 97,169, +245,227,209,163, 71,144,201,100, 97, 90,173,182, 90, 78,142,227,222,107,219,182, 45,142, 29, 59,134, 43, 87,174,224,249,243,231, + 80,171,213,208,233,116,208,104, 52,136,136,136, 0,203,178, 8, 8, 8,128,165,165, 37,100, 50, 89,152, 78, 87,125, 71, 84,165, + 82, 41,132, 66, 97, 35, 11, 11,139,178, 99,110,110,110,200,201,201, 97,141, 70, 35,118,239,222,173,116,117,117,181,180,176,176, + 48, 89,184, 18, 4,129,204,204, 76,120,122,122,150,249,104, 21, 22, 22,194,217,217,185, 84, 88, 64,167,211,193,218,218,186,198, +161, 67, 0,218,103,207,158,205, 46,247,189,205,240,225,195,247, 31, 60,120,176, 94,112,112, 48,238,222,189, 11,185, 92,142, 31, +126,248,225,121, 66, 66,194,135, 0,238,103,102,190, 89,191, 72, 83,234, 80, 78, 78,206,209,176,176,176,247,218,182,109, 91,246, +150,232,214,173, 27,209,173, 91, 55,167,242,166,254,172,172, 44,220,187,119, 15,193,193,193, 32, 8, 2, 79,159, 62,101, 52, 26, +205,254,234, 70, 41, 60, 60, 60,118, 45, 92,184,208,138,166,233,178,186,109, 97, 97, 1,169, 84, 10,145, 72, 4,138,162,144,144, +144,128, 65,131, 6,217,110,220,184,241,119,157, 78, 87, 31,128, 1,111, 9,242, 53, 48, 60, 10, 87,218, 6,248,187, 68,108,223, +182,162,195,164,201, 40, 29, 58,164, 3,252,157, 35, 30,133,103,216,182,118,174, 57,191,231,130,147, 63,211, 27,207, 13, 60,119, + 62,100,196, 87,179,102, 10,125,125,253, 51,131,255, 12,245,238, 65,127, 75, 56, 58,217, 32, 39, 91,137,132,164, 12,196, 39,234, + 57, 95, 95,255,204, 7,247,194, 36, 63,254,188,174,161, 74,173, 45, 29, 58,172,182,158, 94,191,245,124,240,218, 13,146,171, 99, + 63,105, 35,182,176,112, 71,110,118, 24,188,189,229, 24, 20,216, 28,191,237,185, 5, 91, 91, 7,184,184,184,128, 36, 73, 75, 83, +243,158,157,157, 77, 28, 61,112,125,194,199,227, 38,190,219,167,247, 0,250,252,133, 51,130, 43, 23, 79,221,250,125,251,215,199, + 57, 74, 37, 35,184, 66,139, 58,117, 93,159,196, 61,123,244, 97,247,158,163, 96, 33,178,110, 0, 52,174,180,194,150, 77, 48,224, +144,116,236,224, 50,233,199,227, 38,181,239,211,231,125,250,194,133, 19,184,112,118,207,157,165, 75,235,156,125,158,186, 79,116, +251,126,138,116,240,176,169,121, 65,231,162,244, 31, 12,172, 27,235,110,217, 82, 3, 60,231, 85, 85,249,142,164, 64,144, 65,235, +116, 94,158,125,250, 80,234,196, 68,161,149,139, 11, 13, 0, 70,163,177, 70,161,133, 42,134,160, 95,230, 52, 53, 45,106,181, 26, +108, 21,177, 19, 95,230, 76,207,204,172, 83,210, 9, 47,131,209,104, 44, 19, 89, 57, 57, 57,200,207,207,135,165,165, 37,178,116, + 58, 23, 83, 56,123,183,107,183,251,155,101,203,230, 28, 57,122, 84, 84, 94,100,149,110, 66,161, 16,171, 86,175, 22,125,241,213, + 87, 83,167, 9, 4, 51, 64,211, 38,223,207,210, 78, 59, 69, 81, 16, 8, 4, 72, 76, 76, 68, 82, 82, 18, 18, 19, 19,145,152,152, + 8, 11, 11, 11,112,127,241, 36,160,255,176,127, 86,169,200, 42,191, 47,179,114, 85, 27,222,193, 28,103,120, 83,133, 1, 99,198, +248,174, 41, 66, 75,165, 82, 5, 95,190,124,185,221,224,193,131, 5,119,238,220,129,171,171,107,153,208, 42,221,151, 14, 71,201, +100, 50, 28, 63,126,220,160, 82,169,130,107,120,152, 46,159, 61,123,182,245,146, 37, 75,132,227,199,143, 71,100,100, 36, 38, 79, +158,140,252,252,124, 40,149, 74,228,228,228, 64,173, 86,163, 93,187,118,144, 74,165,120,242,228,137, 81,173, 86, 95,174,193, 98, +199,101,102,102, 22,201,229,114,183,151,127, 27, 54,108,152,203,230,205,155,213,209,209,209,198, 14, 29, 58,216,152, 42, 56, 74, +113,224,192,129, 50, 75, 93,108,108, 44, 54,111,222, 92,230,147, 21, 26, 26,138, 53,107,214,148,197, 62, 51, 19,247,179,179,179, +105,163,209,136, 6, 13, 26,192,195,195, 3, 90,173, 22,235,214,173,163, 1,220,255,167,106,179, 86,171, 61, 50,118,236,216,121, + 15, 31, 62,116, 19, 8, 4,197, 38,237,146,252, 25, 12, 6, 60,123,246, 12, 17, 17, 17,136,142,142, 70,110,110,110, 89, 71,224, +209,163, 71,121, 70,163,241, 80, 85,188,114,185,124,209,111,191,253,230, 42,147,201, 42,212,231, 82,107,104,169,149, 52, 43, 43, + 11,118,118,118,232,209,163,135,243,229,203,151, 23,233,116,186, 37,111, 73,155, 70, 12, 27, 18,219,230,139,207, 6, 99,104,160, + 44,249, 88, 80,234,205, 53, 63,206, 46,113,134,119,142, 24, 26,232,145,252, 56,198, 14,195,134,156,104, 3, 32, 5,213, 59,108, +179,127, 94, 85,156,108,219,214,254,202,177, 83,167,126, 95, 48,119, 86,232,156,217, 19,229,106, 77,156,212,215, 71, 76, 0, 64, +124,162,158,123, 18,201,106,215,172,157, 21,186, 98,245, 70, 50, 35, 39,127,242,189,123, 85,135, 55, 40, 47, 94, 72, 18, 82,223, +198, 93,210, 26,250,117,172,123,231,214, 94, 88,201, 52,104,212,184, 13,250,244,126, 15, 87, 66, 30, 33, 61, 75, 11,133, 66, 1, +157, 78, 87,109,184,132,232, 39,199,199,112, 4,231, 77,112, 68, 18, 65,114,210, 49, 99, 63,237, 52, 96,192,251, 92, 80,208, 41, +250,196,241,189, 55, 14,253,177,225, 8, 41, 18, 10, 52,122, 91, 61, 65,104, 11, 64,134, 71, 22,169,138, 59, 52, 66,137,168,106, +243,107, 73, 96,215, 38, 77, 27,187,142, 25, 59,217,182,127,191, 65,220,217,179, 39,216, 67, 7,119, 95, 57,180,179,217, 94,150, + 84,138, 20,201,106, 73,129,210, 88,192, 17, 98,187, 34, 37,171,206,136,175,175,117, 31, 48,204, 0, 28,225,213, 85,249,118, 64, +167, 75, 41, 74, 78,118,115,232,210, 69,242,108,217, 50,153, 75,187,118, 90,162,196,135,184, 58,161, 69, 81, 20, 64,146,172, 41, +156,166,166, 69,163,209,128, 5,140,181,225,164,105,186,130,200, 42, 21, 90,165,207,139, 41,156,219,151, 46,189,227,221,167, 79, +110, 72, 72,136, 75,215,174, 93,137,194,194, 66, 20, 22, 22, 86, 16, 91,238,238,238, 68,147,128, 0,217,129, 43, 87,124, 77,189, +159,166,228,157, 36,201,191, 92,104,253,199,177,189, 74,235, 97,117, 87,149, 90,180, 76, 17, 90, 38, 90,180,140, 70,163, 17,206, +206,206,200,206,206,174,178,225, 39, 73, 18, 22, 22, 22,165, 99,196,213,206,188,211,233,116,235,230,204,153, 51,189, 95,191,126, + 78,141, 26, 53, 66, 86, 86, 22, 92, 92, 92, 32,149, 74,203,124,199, 74,249, 66, 67, 67,241,219,111,191, 41,117, 58,221,186, 26, + 56,127, 94,189,122,245,103, 67,135, 14,117,112,117,117,133,189,189, 61,158, 60,121, 2,123,123,123, 40,149, 74,196,196,196,192, +218,218,186,204,111,231,212,169, 83,133, 58,157,238,231, 26,196, 27,119,237,218, 53,131,181,181,245,147,172,172, 44, 42, 55, 55, + 87,144,151,151, 39, 80, 42,149,194,130,130, 2,225,249,243,231,157,108,109,109,213,127,254,249,103,150,183,183, 55,245,252,249, +115,202,104, 52,214,168, 94, 9,130,192,140, 25, 51, 32, 18,137,160,211,233,176,110,221, 58,204,153, 51,167,204, 39,107,245,234, +213, 88,184,112, 97,153,112,222,177, 99,135, 89, 53,135,227, 56, 24, 12, 6, 24,141, 70, 24,141, 70,147,196,239,235,192, 68,193, +158,254,244,233,211,192,182,109,219, 94, 60,124,248,176, 99, 73, 76, 50,100,100,100, 32, 35, 35, 3, 89, 89, 89, 40, 42, 42, 2, + 77,211,240,240,240, 64, 70, 70, 6, 78,156, 56, 81, 80, 88, 88,216, 7,213,204, 56,164, 40,106,108,167, 78,157, 4, 47,167,161, +180,151, 87, 42,222, 37, 18, 9,210,210,210,208,173, 91, 55,113, 72, 72,200, 88, 0,255,105,161, 85, 62,188, 67,239, 62, 19, 68, +254, 77,219,235, 31, 71, 4, 37, 55,174,155,145, 60,122,144,205, 25, 0,120, 20,158, 97,251, 56,198, 14,254, 77, 3,185,222,125, +236, 91,103,164,111,111, 6,192, 80,221,114, 61, 0, 96, 43,147, 12,239,213,179, 93,154,181,165, 37,185,102,237,142,115, 91,182, +252,252,206,145, 51,255, 11,239,176,102,109,113,120,135, 94, 61,219,177,209, 81,209,195, 1,236, 52, 85,188, 4, 6, 14,124,248, +219,174,223, 16, 29,241,167,251,188, 25,205,197,185, 25, 70, 88, 88,121,161,117, 75, 23,108,223, 21,134,199,143, 31,167,235,245, +250,110,213,214,111,130,243,142,136, 12,247,107,214,180,137,235,152,177,147,108, 2, 3, 7, 33, 40,232, 36,254,216,189,243,218, + 7,163,134,254,154,154,167,164,156,133, 50,145,140, 99,197,148,200, 86, 32,146, 88,100,234,245,197,115, 32,132, 66,169, 13, 48, +188,218,134,103,202,164,209,182,221,123, 14,194,153,179, 39,241,199,238,237, 87, 23, 55, 29,182,179,110, 43,127,162,221, 59, 63, + 78,173, 91,175,174,143,170, 40, 67, 73, 18, 98,131, 86,203, 90,255,184, 59,225,167,248,133, 99,227, 1,172, 5, 63,235,176, 60, +158,252,209,191,127,219, 47,226,226, 68,242,142, 29, 45,210,174, 92,145,149,172, 68, 82,173,208, 18, 8, 4,224,170, 30,234,170, +192, 73,236,217, 67, 2,168,118, 18,150, 72, 36,130, 90,173,134,177,106, 11,118, 5, 78,183, 11, 23,146,227,226,226, 26, 58, 56, + 56, 84, 16, 89,185,185,185,101,159,181, 90, 45,212,106, 53, 44, 44, 44, 34, 52,149,143,136, 84,224,204,184,118, 77,187,114,198, +140, 37, 31,142, 26,181, 33,248,242,101,169,163,163, 35, 10, 10, 10, 42, 8, 45,189, 94,143,238, 61,122,136, 86, 63,124, 56, 6, + 74,229, 82, 83,238,167, 75,183,110, 53,250, 3, 83, 20, 5,246, 47, 30, 58,124, 11, 48,169, 50,225, 69,214, 52,132, 99,234,172, +195, 42, 26,200,151, 87,247, 94,216,186,117,107,109,108,108, 44,188,189,189,203,196, 74,249,255,180,177,177,129,157,157, 29, 66, + 67, 67,241,253,247,223,107, 0, 44,172,129,179, 80,173, 86,143,236,213,171,151, 70, 32, 16,160,113,227,198,101,241,179, 88,150, +133, 88, 44,134,165,165, 37, 30, 62,124,136,129, 3, 7,170,213,106,245, 72,188, 26, 67,235,101,206, 2,181, 90,253, 81,239,222, +189,213,145,145,145,232,212,169, 19, 30, 63,126,140,162,162, 34, 20, 21, 21,225,197,139, 23,104,210,164, 9,212,106, 53, 54,111, +222,172, 81,171,213, 31, 1, 40,168,142,179,176,176,112,224,156, 57,115,168,253,251,247,215,245,240,240,104,218,166, 77,155, 70, + 61,122,244,168, 63,100,200, 16,159,254,253,251,187, 53,108,216, 80,219,167, 79, 31,121,191,126,253,228,106,181, 90,120,243,230, + 77,133,209,104,236, 87, 67, 58,203,196, 73,108,108,108,217, 80,161, 64, 32, 64,118,118,118, 89,228,254,210,151, 82, 21, 66,184, +103, 77, 98,187, 84, 96,149, 10, 46, 19,252,220, 42,227,172,241, 34,177, 88, 92,106,241,228, 76,224,124, 20, 21, 21,213,171, 75, +151, 46,143, 38, 76,152, 80,152,158,158, 14,107,107,107,248,250,250,194,207,207, 15, 78, 78, 78, 48, 24, 12, 56,126,252,184,234, +196,137, 19, 97, 5, 5, 5,221,240,106, 12,173,158, 47,221,199, 23,149,189,100, 75,173, 89,165, 66, 75, 42,149,194,195,195,163, +244,222,190, 48,231,126,214, 18,127, 45,103,137,128,233,209,189, 79,189,254, 3, 6,219, 30, 63,121, 75,188, 97,211,137,176,214, + 61,177,195,177,142,242,148, 99, 29,229,169,214, 61,177, 99,195,166, 19, 97,199, 79,222, 18,247, 31, 48,216,182, 71,247, 62,245, + 34, 35,162, 27,149, 95,247,176,178,116, 74,165,210,246,157, 58,182,206, 11,185,113,149, 93,177,122, 35,217,189,219, 7, 15,119, +254,122,252,248,206, 95,143, 31,239,222,237,131,135, 43, 86,111, 36, 67,110, 92,101, 59,117,108,157, 39,149, 74,219,155,146,247, + 41,147, 70,219, 14,232, 63, 8, 65, 65,199,233, 35, 7, 54,175, 62,120,244,105,151, 79,167, 95,203,136,141,125,204,101,166, 92, +128,144, 76, 68, 84, 84, 84, 65,137,200,138, 53,133,115,242,196,209,229, 69,214,117, 71,215, 78, 59,162,162,192, 92,186,116,218, +120,249,242, 67,205,245, 71,153, 5, 15, 34,179,115,211,178,114,159, 43,149, 57,122,150,101,192, 48, 12,245,205, 55,101, 14,187, +149,150, 81,135, 14, 93,241,103,240, 62,236,222,181,173,128,101,161, 29,126,228, 8, 51,124,248, 50,206,167, 78, 29,159,189, 7, +246, 17,129,239, 15,182,229, 0,118,224,208, 65,118,251, 15,238, 39,234, 53,168, 87,199,215,183, 44,164,205,127,175, 46,253, 5, +156,203,128, 60,101, 98,226,213,208,141, 27,117, 46, 35, 71, 58,136, 93, 92,108,192, 48, 68,233,251,189,170, 77, 32, 16,188,108, +129,169,146,211,195,201, 41,245,212,169, 83,240,243,243,131,135,135, 7,202,251,200,150, 6,228,118,116,116,196,209,163, 71,193, + 85, 12, 78, 93, 37,103,171,186,117, 67, 87,173, 92,169,103, 89, 22,121,121,121,175, 88,179,242,242,242,192,178, 44,206,158, 57, +163, 87, 22,175, 4, 98, 82,222,187, 81, 84,209,135,157, 59,175, 24, 48, 96,128, 33, 46, 46, 14, 44,203,162,188,101, 43, 51, 51, + 19, 86, 86, 86,208,234,116, 94, 0,100,166,112,102,158, 63,111,137, 26,222,235,149, 88,180,254,138,114,255,175,139,172,242, 11, + 74, 79, 50,201,162, 69,211, 52,188,188,188, 42, 44,233, 66,146,100,133,205,204, 25,135,123, 34, 35, 35, 47,244,233,211,103,201, +187,239,190, 59,101,201,146, 37, 84,163, 70,141, 80, 80, 80, 0,123,123,123, 56, 59, 59, 35, 38, 38, 6,167, 78,157, 98,178,179, +179,183, 2, 88, 14,211,166,208, 95,121,250,244,105, 96,243,230,205, 15,206,159, 63,223,182,119,239,222, 66, 47, 47, 47,112, 28, +135,135, 15, 31,226,216,177, 99,134,157, 59,119, 42, 75, 68,150,169,206,203, 23,211,210,210, 62,232,215,175,223,222,177, 99,199, + 90, 51, 12, 35,124,241,226, 5,116, 58, 29,140, 70, 35,146,146,146, 12, 65, 65, 65, 69,106,181,122, 52,128,139, 38,240,133,230, +231,231, 55,185,116,233,210,216,155, 55,111,126, 63, 97,194, 4,199, 30, 61,122,136,104,154,198,141, 27, 55,178, 90,181,106,229, +156,153,153,105, 56,122,244,104,142, 86,171, 93,200, 48,140, 73, 75,240, 16, 4, 1,165, 82, 9, 39, 39, 39,232,116, 58,176, 44, + 11,189, 94, 15, 43, 43,171,178,101,147, 56,142,131, 57,206,245, 47,213, 1,202, 96, 48, 96,212,168, 81, 96, 89, 22,235,214,173, + 3, 77,211,102,147,217,218,218, 62,120,244,232, 81, 96,203,150, 45,203,196, 75,105, 29,146, 72, 36,112,114,114,130,163,163, 35, +130,130,130, 32, 20, 10, 31,212,228,239, 86,130,199,217,217,217,173, 46, 93,186,212, 62, 44, 44,236, 99, 0, 45, 13, 6,131, 7, +195, 48, 4, 73,146, 10,142,227,158, 40,149,202, 95, 97,226, 18, 60,153,153,153,223,143, 27, 55,174,213,190,125,251,172, 4,130, +255, 61, 26, 2,129, 0, 18,137, 4,165,193, 49, 57,142,131, 94,175,199,162, 69,139,148, 42,149,234,251,183,229, 45,209,186, 77, + 59,108,223,188,222,234,242,159, 23,178,162,158,226, 88, 37, 33, 28, 82, 50,210,183, 55, 75, 75, 78,182,106,221,166,157, 73,156, + 70,189, 33,231,163,209, 95,122,151, 44,193,179,232,197,139,132,109,123,247,252, 20, 15, 0, 63,254,188,174, 97, 70, 78,254,228, +232,168,232,225,219,182, 29,104,111,212, 27,114, 76,225,252,159,120,217, 91, 0, 14, 90, 0,119, 31,134,101,212, 29, 56,242,252, +194, 6,245,108,222,207,204,209,164, 22, 21,169, 63, 7, 16,111,106,222, 59,118,232,130, 63, 47,238,199, 31,187,247, 42, 57,150, +210, 58, 57, 57,113, 0, 16, 21,229,196, 69, 69,229,115,255,243, 43,182, 83, 9,185,199,203,191,252,188,199,151, 5,202,220,159, +215,109,174,126, 40,165,121,139,119,209,188,197,187,152,254,249,215,182, 77,154, 54,246, 6,128, 35, 71,192, 52,109, 16,121,122, +201,226,101,239, 47, 95,190, 12,202, 66, 29,150, 47, 47, 94,174, 39, 38, 60,242, 76,124, 60,244,124,155, 85, 17, 75,104,250, 46, +190,252,178,161, 58, 55, 87,222,113,222, 60, 39,193, 87, 95,145,213, 57,195,151,127,126, 77,225,188,255,228,201,153,201,159,126, +154,186,116,201,146, 62, 91,183,109,179,104,214,172, 25,210,211,211,209,184,113, 99,120,120,120,224,210,165, 75, 56,122,232,144, + 42,191,176,112, 33,128, 45,166,112,238, 57,123, 54,166, 81,211,166,217,219,182,109,115, 31, 48, 96, 0,161, 82,169, 80, 80, 80, +128,130,130, 2,232,116, 58,148, 4,132,230, 98,159, 62,141, 50, 26,141, 91, 77,205, 59,147,149, 37, 93,222,174, 93,138,136,101, + 87,125, 48,116,232,156,229,223,126, 43,169, 87,175, 30,161,211,233,202,172, 90, 6,131, 1, 86, 86, 86, 6,189, 94,239, 8, 64, +109, 10,167,100,231, 78, 58, 43, 43, 11,114,185,188, 44, 92, 83,249,184,132,133,133,133,224, 56,142, 15,166, 91, 11, 84,169,144, +236,237,237, 31, 8, 4, 2,207,242,214,173,202,214,206, 43,127,204,104, 52,166,100,103,103,183,126, 73,241, 86,229, 15,229, 11, +224,135,238,221,187,127, 48,123,246,108, 34, 36, 36, 4, 39, 78,156,224,226,227,227,143,148, 88,177,226,171,233,233, 84,197,105, + 45,145, 72,102, 90, 90, 90,246, 44, 13,225, 32,147,201,194, 84, 42, 85,112,201,112, 97, 97, 45, 56,109, 36, 18,201, 12, 75, 75, +203, 94, 37,203,175,192,218,218,250,145, 74,165,186,164,211,233,214,163,234,133,170,171,227,180,176,181,181,253,222,201,201,233, +163,175,190,250,202,241,218,181,107,138, 63,255,252, 83,148,159,159,191, 79,175,215, 87,183,168,244, 43,156, 14, 14, 14, 15, 40, +138,242,252,139,202, 8,205,155, 55, 15, 26, 56,112,224,128,209,163, 71,195,104, 52, 98,203,150, 45,184,116,233,210,153,103,207, +158, 5,214,208, 27,125,153,211,201,211,211, 51,100,202,148, 41, 62,163, 70,141,146,217,219,219, 67, 32, 16, 64,165, 82,225,217, +179,103,120,248,240, 33,119,242,228,201,162,208,208,208, 20,181, 90,221, 21, 64,182, 25,247,243,117,122,205, 21, 56, 5, 2, 65, + 23, 47, 47,175, 3, 75,151, 46,181,238,213,171,151,133,163,163, 35, 40,138,130,209,104,132, 66,161, 64,120,120, 56, 46, 92,184, +160, 58,114,228,136, 42, 39, 39,103, 20,128,171,255, 68, 58,223, 36,167,127, 67, 44,126,105,161,232, 42,163,189,215,112,110,141, +233,236,222,197,109,208,240, 15,250,245, 5,128,195, 71,207,157, 55, 97, 81,233, 42,211, 89, 83, 90, 77,225,108,220,128, 92, 26, + 17, 25, 94, 33,160,101,211, 38, 1,177,254,205,134,126,103, 10, 81,185,200,240, 21,242, 94,110, 56,182,188, 77,183,194, 48,171, +191, 47, 2, 7, 13, 31, 50,224,235,133, 11,240,195,247, 43,112,242,240,241, 51, 81,241, 21,150, 9,250,207,213,165,191,152,147, +248, 78, 32,120, 87,230,230,214,121, 29,203, 46,120, 28, 30,110, 85,190,195, 86,106,121, 46,223,169,116,119,119,207, 84, 40, 20, + 46,166,112, 6,254,242,139, 65,109,105, 41, 89,176,106, 85,151, 34,173,182,203,242,229,203, 5,247,239,223,199,230,141, 27,105, +109, 74,202,222, 44, 96, 70, 21,163, 33, 85,114,250,204,152, 33,157,187,121,243,120,223, 6, 13,156, 63,254,248, 99,161, 80, 40, +132, 74,165, 66,114,114, 50, 46, 94,184,160,143,140,138,138, 84, 42,149,239, 3, 72, 51,149, 51,240,151, 95, 12,118,190,190,144, +201,229,220,229, 43, 87,108, 39,207,156, 57,165, 78,221,186,182,125,250,246, 21,218,216,216, 32, 47, 47, 15, 47, 94,188,192,241, +227,199, 51,139,138,138,220, 1, 48,166,112,238,189,121,179,249,217,171, 87,135,125,247,221,119,226,128,128, 0,216,218,218,162, +176,176, 16,225,225,225,184,122,245,170,110,235,214,173, 5, 5, 5, 5, 83, 24,134, 57,245, 23,150,251,219, 96,213, 42,197,246, +210,209,159,191,218,195,223,148,130,104, 13, 96,113,201,231,111, 81,243,154,129,111,211,203,199,219,193,193, 97,187, 86,171,229, + 52, 26,205,100, 0, 73,255,194,116, 10, 90,183,110,189, 57, 51, 51,179, 61,199,113,176,181,181,189, 21, 17, 17, 49, 13, 85,204, +188,169,129,147, 2,208,222,202,202,170,157,181,181,117, 23,157, 78,231, 95, 50,252, 22,165, 82,169,174, 26, 12,134,187, 37,214, + 39,230, 31,206, 59, 5,160,151,187,187,251,167, 44,203, 54, 32, 8,194,142, 97, 24, 24,141,198,124,150,101,159, 21, 20, 20,236, + 4,112,233, 95,144,206, 55,194,217,164, 62,134,112, 36,252,171, 18, 4, 21,132,214, 75, 2,130, 96, 17, 21, 25,135,227,102,164, +147,236,215,211,107, 19, 80, 60, 51, 17, 53, 59,215,254, 79,104,153, 32, 94,204, 22,153,245,169,113, 28,193, 85,224, 36, 56, 34, +169,113,243, 33,127,188,142,208, 50, 21, 77,252,208, 5, 28,218,179, 28,238, 70, 63,195,159,111,241,187,238,141,113,254, 0, 56, +108,180,183,191, 69, 10, 4,174, 0,200, 18,235, 11,203, 18, 4,195, 17, 4, 93,126,120,235,165,142,101,181,156, 6,160,153, 80, + 34,241, 98,104,218, 37, 29,176, 58,203, 48,239,104, 57,174,200, 19, 88,252, 8,136,169, 77, 58, 13, 64, 51, 74, 34,241, 62,203, +113,131,178, 44, 45,155,103,106, 52,114, 0,156,149,165,101,148, 82,165,218,173,213,106, 55,225,213,145,139, 26, 57, 69, 18,137, + 39, 67,211, 46, 0, 64, 10, 4,153, 7,117, 58,175, 20, 27,155,143,181, 58,157,143,149,149,149, 81,175,215, 43,181, 90,237,104, +154,166, 47,155,147,247,103, 52,221,228, 38, 73,118, 50, 88, 90, 58, 26, 8,194, 82, 79,211, 6,189,193,144,172,213,106,195, 0, +252, 4, 32,238, 47, 46,247,183, 10,166,132,147,122, 83, 15, 11,207,201,115,242,156, 60, 39,207,201,115,242,156,127, 61,167, 12, +128,119, 73,103,241,191,152,247,183,202,186, 85, 58,251, 95,192,223, 11, 30, 60,120,240,224,193,227,173,128, 26,149,248,100,241, +248,103, 65, 84,163, 74,205, 49, 9,214, 70,217, 6,243,156, 60, 39,207,201,115,242,156, 60, 39,207,249,255,142,179, 38,238,255, +226,144,228, 43,107, 29,114, 28,183,253,239,248, 99,222,252,203,115,242,156, 60, 39,207,201,115,242,156, 60,231,255, 59,148, 14, + 29,146,252,173,168, 18, 46, 37,219,155, 62,151,199,219, 93, 23, 94,134, 71,201,102,206,249,110,252, 45,231,193,131, 7,143,183, + 3,255,132,208, 50,181,209,122,157,198,237,117,133,207, 10,130, 64, 26, 65, 32, 13,192,138, 55,120,110, 77,112,119,114,114,250, +162, 73,147, 38,123, 93, 92, 92,166, 3,112, 54,243,250,134, 50,153,108,189,165,165,101,136,165,165,101,136, 76, 38, 91, 15,160, +225, 27, 42, 55, 2,192,100,137, 68,114,197,205,205, 45, 85, 44, 22, 95, 1, 48, 5,181,159,185,218, 8,197,113,210,190, 5,208, +220,156, 11,157,155, 14, 58, 36,111, 58,232,137,188,233,160,112,199,128,129, 13,229, 77, 7,133,203,155, 14,122,226,220,116,208, +161,191,160,190,190, 78,249,174, 32, 8, 36, 17, 4,146, 76,188,246, 39, 2, 72, 38, 8,164,188,129,186,196,131, 7, 15, 30, 60, +254,107,112,119,119,255,192,205,205, 45,216,205,205,237,146,187,187,251, 7, 38, 92,210,179,146,134,135, 33, 8, 48, 53, 52, 36, +213,157, 87,147,185,178,252,181,107, 76,204, 90,121, 78, 23,130, 0,195,149,128, 32,192, 58, 59, 59,111,112,115,115, 91,241,242, +230,236,236,188,129, 32,192,150, 59,151, 41, 39,240,204, 53,171,186,140, 25, 51,230,112, 94, 94, 94,144, 94,175, 15,122,250,244, +105, 80,215,174, 93, 15,190,100,221,168,146, 83, 42,149,126,216,182, 93,251,208,171, 55,238, 62,141,125,150,144, 22, 25,243, 60, +225,244,249,203,247, 3,154, 53,191, 39,149, 74, 63, 52,163,140, 8, 0,147, 5, 2,193, 21, 43, 43,171, 20,129, 64,112, 5,192, + 84,138,162, 78,173, 92,185, 50, 33, 34, 34, 34,227,230,205,155,249, 87,175, 94, 77,157, 48, 97,194, 51,130, 32, 78, 87, 34,216, +123, 86, 98,165,121,217,170,179, 36, 49, 49,241,188, 66,161,184, 96, 97, 97,241,189, 9,231,151,113,202,155, 14,122,146, 89, 96, +224, 50, 11, 12,156,188,233, 32,174,220,231, 39,102,222,243,154,202,232,149,186, 32,145, 72,188,107, 16,244, 61,171,186, 22,128, +107,201,111,173, 1,252, 82,178,149, 78, 61,119,149, 74, 36,111,170, 46,189,137,188,243,156, 60, 39,207,201,115,254,221,156,255, +101,180, 42,217,187,161,216, 95,203,173,182,179, 14, 63,123,250,244,169, 21, 0,248,249,249, 77, 3,112,212, 28, 33, 65, 16,152, +203,178, 28, 9, 0, 36, 73,204,235,214,173,123, 43, 11, 11,139, 10, 81,144, 53, 26,141,248,202,149, 63,123,176, 44, 71,148,156, + 55,151,227,176, 30, 64,134,169,255,161,215,235, 72,161, 80, 12,146, 36,190, 12, 8,104, 86, 39, 59, 59,251, 26, 73,146,123, 83, + 83, 83,243,204, 54,227, 16, 4,118,236,216,225,231,230,230,246, 74,180,102,133, 66, 33, 30, 52,232,125,179,248,198, 1, 18,157, + 68,210, 78, 68, 16,110, 12, 77,219, 1,128, 64, 32,200,187, 47, 22,183,254,225,187,239,100, 4, 65,176, 57, 57, 57,208,104, 52, +152, 53,107,150, 69,100,100,228,224,236,236,236, 77, 53,208,250, 53,111,209,106,214,133, 11,231,253,149,185,121,218, 29, 63,111, + 11,213, 8, 68,234,186, 77, 26,139, 54,111,223,109, 63,105,252,232,207,163,163, 35, 30,161,242,229, 72,202,131, 4,112,124,230, +204,153, 77, 3, 3, 3,197,133,133,133, 82,141, 70, 83,103,239,222,189,139, 90,183,110,109,213,178,101, 75,241,129, 3, 7,136, +130,130, 2,112, 28, 39,107,220,184, 49, 55, 98,196, 8,237,193,131, 7,167, 3,216, 80,141,240,157, 91,124, 47,201,117,141, 26, + 53, 90, 10, 0, 79,159, 62, 21,149,187,199, 66,127,127,127, 75, 0,136,137,137,249,134,227,216,153, 0,192,113, 88, 13, 96, 65, + 37,166,181,167, 77, 59, 14, 7, 8, 52,136,184,113, 88,218,180,211,112, 45, 56, 60, 35,128,167, 37, 29,130,229, 64,185,184, 80, + 21, 17,149,150,150, 86,171,181, 9, 7, 12, 8, 36, 8,130, 56, 18, 26, 26,122, 52, 51, 51,179, 46,203, 50, 19,171, 75,231, 75, +245,136,112,116,116, 28,151,157,157,189, 2,192,167, 81, 81, 81,173, 0,192,223,223, 95, 4,224,129,141,141, 77, 7,131, 94, 79, +240,239, 42, 30, 60,120,240,248,207, 10,173,135, 0, 6,224,127, 75,240,108, 7, 96,182,208, 18, 3,192,181,107,215, 0, 64, 82, +139,132, 16,229, 5,204,140, 25, 51,224,230,230,246,178,120, 65, 72,200,149,215,201,108,133,255,248,246,219,111,173,242,243,243, +123,254,250,235,175,157, 57,142, 91,147,150,150,118,167,134,235, 51, 56, 14,171, 73,146,152, 71, 16, 4, 36, 18,105,236,148, 41, + 83, 30,150,252, 86,231,244,233,211,178,129, 3, 7,170, 1, 36, 0,128, 68, 34,245,160, 40,210,175, 88,185, 98,117,117,130,112, + 24,224, 75,139,197,221, 39,255,242, 11,253,206,192,129, 2, 75,185,156, 0,128,132,232,104,199,213, 63,254,216, 33, 47, 62, 94, +172,113,116,204,201, 81,169, 52,177,177,177,144, 72, 36, 4, 69, 81,239,212,148, 97, 75, 75,203, 47,190,251, 97,149,165, 50, 55, + 95,163, 85, 22,234, 41,218,168,179,182,144, 49, 25,233,153, 57, 86, 22,150,234,121,139,151,137, 63,155, 56,246, 11,149, 74, 53, +173, 6,170,233, 95,126,249,165,127,219,182,109, 61, 14, 29, 58, 68, 20, 20, 20, 64, 32, 16, 88,181,108,217, 18,173, 91,183,102, +254,252,243, 79,162,110,221,186, 8, 8, 8,192,141, 27, 55,112,235,214, 45,162, 85,171, 86,178, 99,199,142,141, 49, 26,141, 27, +106, 18,215, 20, 69,206,106,220,184,113, 75, 75, 75, 75,189,159,159, 31, 38, 78,156, 8,142,227,208,179,103,207, 0, 43, 43,171, +163, 42,149, 74, 28, 19, 19,221,185, 38,145,157, 25,113,114, 68,169,101, 11, 64, 51,112,120,150, 21,113,178,121,185, 83,252, 99, + 98, 98,222,205,203,203, 43,115, 70, 44, 93,192,188,115,231,206,230,212,165, 12,142,195,234,129, 3, 3,231, 1, 4,209,179,103, +207,252,233,211,167,147,209,209,209, 31, 13, 25, 50, 56,224,233,211,103,168, 38,157,229,235, 17, 49,110,220,248, 12, 43, 43,171, +161, 71,142, 28,137, 81, 40, 20, 2,145,168, 76,103, 82,206,206,206,114, 63, 63,191,169, 14, 14, 14,153, 20, 73, 58,115,224,184, +154,234, 18, 15, 30, 60,120,240,248, 87,225, 76,137,184, 58,243,242, 15, 2, 0, 8, 10, 10, 42, 11, 95, 26, 24, 24, 88,101,175, +154,227,184,140,199,143, 31,123,169,213,106,112, 28,103, 74, 35, 80,126,138,102, 6, 65,144,155, 73,146,152, 70, 16, 4, 2, 2, +154, 61, 95,183,110, 93,101,107,122,233, 3, 2,154, 61,167, 40,178, 30,199,113, 32, 8,114, 11,199,177, 25, 85,112, 86,218, 48, +138,197,146,185, 0,224,234,234, 22,127,238,220, 57,253,176, 97,195,240,227,143, 63,138,230,207,159, 63, 71, 32, 16, 76, 79, 74, + 74, 74,175, 38,157, 0,176, 64, 46,119,150,237,216,177,195,111,202,148, 41, 15, 21, 10,197, 2, 0,112,115,115, 91, 1,160, 9, +128,132,114,199,176,117,235,193,212,137, 19, 39,198,102,102,102, 46,168,138,115, 40, 80,223,171,113,227,238,203,175, 93,227, 72, +157,142,200,190,126, 93,153,149,145, 97,140,203,202,146,237,122,240, 32,112,209,138, 21, 66, 47,111,111,132,156, 58,229,148,173, + 86,103, 21,232,116,218,140,140, 12,142,166,233, 91, 38,228,189,169,179,220, 89,182,237,167, 45,247,173,133, 20,235,236,233, 65, + 8, 29, 28, 4,164,204, 70, 76, 9, 72, 93,189, 58, 13,197, 0,154,214, 84, 70, 34,145,104, 76,239,222,189,101, 7, 15, 30, 36, + 2, 2, 2, 96,103,103,135,235,215,175,227,209,163, 71,200,203,203, 35,141, 70, 35,218,180,105,131, 85,171, 86,193,219,219, 27, +249,249,249, 72, 74, 74,114, 18,139,197,114,163,209, 88,213,253,172, 80,159,230,206,157, 11, 55, 55, 55,208, 52,141,220,220, 92, +208, 52, 13, 43, 43, 43, 0, 64, 74, 74, 10, 78,157, 58,105, 74, 93,170, 17, 28,199,225,189,247,222, 43, 36, 8, 34,234,101,139, +150, 57,156, 30, 30, 30, 7,178,178,178,251,117,239,222, 29,121,121,121,198,101,203,150,161,121,243,230,240,243,243, 51, 37,157, + 11, 68, 34,241,175, 62, 62, 62, 63,205,152, 49,195,205,193,193, 1, 58,157,110, 81,122,122, 58,166, 78,157, 10, 0,232,223,191, +127,115,161, 80,120,110,194,132, 9,168, 91,183,110,106,110,110,110, 82,104,104,232, 68,181, 90, 29, 94,219,188,155, 8,158,147, +231,228, 57,121,206,127, 21,167,169, 90,228, 95, 10, 69,169, 5,171, 4,219, 43, 8,173,192,192, 64, 34, 40, 40,136, 51, 33, 99, + 57,158,158,158, 94, 22, 22, 22, 0,144, 99,110, 42, 88,150,157,238,232,232,152,185, 96,193,130,142,126,126,126,250,233,211,167, +135, 39, 36, 36, 44, 44,127, 78,157, 58,117,190,223,184,113, 35, 98, 99, 99, 19, 86,172, 88,113, 35, 39, 39,199,220,117,204,230, +115, 28,214,149, 88,199,178, 79,157, 58,213,252,218,181,107,211,126,254,249,103,249,103,159,125, 38,250,226,139, 47, 70, 3,248, +177, 38, 18,138,162,212,149, 13, 23, 86, 6, 55, 55, 55, 61, 69, 81, 85, 6,137, 11, 4, 44,164, 98,113,183,229,215,174,113,250, +132, 4,245,111,107,215, 90,111,187,119,111,169,145,227, 92,156,157,157,209,169, 67,135, 34, 41, 69,101,103,166,167,179,206,245, +235, 83, 47,206,157,115,210,136,197,105, 7, 15, 30, 44,200,201,201, 57, 81,163, 9,143, 32,148, 44,199,233,173, 60,189,141,195, + 6,247, 10,184,127,247, 81,180,181,179, 19,217,170,101, 64,243,232,216,132, 80,176,172,129, 32, 8,101, 77, 60,182,182,182,126, + 57, 57, 57, 80, 42,149,144,203,229, 88,183,110, 29, 92, 93, 93,161, 86,171, 17, 17, 17,193,121,122,122, 18,215,174, 93,131,167, +167, 39,178,178,178,160,215,235, 81, 88, 88,152,169,211,233,170, 90,155, 49,131, 36,169,223, 73,146, 24, 79, 16, 4,234,213,243, + 77,220,180,105,147,158,101, 89,248,251,251, 99,200,144, 33, 56,118,236, 24, 34, 34, 34, 74, 45, 79,122, 31,159, 58,137, 36, 73, +248,148,104,165, 90, 91,117, 74,151,246, 73, 75, 75, 27, 90,203,135,134,116,119,119, 31,221,160, 65,131,105, 31,126,248,161, 81, + 44, 22, 67,165, 82,149,222, 11, 99,191,126,253,243, 7, 14, 12,180, 61,115,230, 76,181,233,212,235,245,241, 5, 5, 5,159,126, +249,229,151,123,183,110,221,106,191,112,225, 66,176, 44, 11,142,227, 64,211,116,217,162,223, 44,203,226,248,241,227,136,139,139, +251,254, 37,145,197,131, 7, 15, 30,255, 47, 96,134, 22,249, 55,194, 13,197,195,134,120, 89,108,253,237,145,225, 41,138,218,118, +241,226,197,150,157, 59,119, 22,244,232,209, 35,224,252,249,243, 1,169,169,169,225, 37,214,131,128, 30, 61,122, 4, 56, 59, 59, + 99,253,250,245,106,138,162,182,213,242,111,202, 26,189,244,244,244,135, 0,214, 28, 59,118,108,245,228,201,147,225,234,234,218, + 68,161, 80,252,173,121,182,145, 72, 90, 77, 88,183,142, 22, 26,141,228, 47,107,214,216,172,189,114,101,245,161,195,135, 5,239, +189,247, 30,193,113, 28,194,158, 60,177, 88,181, 97,131,108,212,224,193, 9, 49,241,241,244,201, 11, 23,140, 25,169,169,185,169, + 89, 89, 75, 0,228,214,196,111, 52, 26,111, 63,125,250,212,189, 83,151,247, 60,174,222, 11,127, 52,108,112,255,238, 66, 1, 73, + 60, 75, 72,121,224,230,234,100, 27,114, 37, 88, 99, 52, 26,111,215,196,163, 82,169, 94,208, 52,237,192,113,156, 60, 36, 36, 4, +114,185, 28,121,121,121, 48, 26,141,208,235,245,122,181, 90, 45,205,201,201,129, 86,171,133, 78,167,131,141,141, 13,194,194,194, + 50,104,154,254,179, 42, 78,134, 97, 38, 72, 36,146,111,133, 66,161, 88, 36, 18,165, 61,120,240, 0, 74,165,178,142,157,157,221, +143, 52, 77, 35, 45, 45, 13,215,174, 93,251,202,198,198, 38, 1, 0,164, 82, 41,196, 98,137,163, 78,167,163, 1,164,214,246,158, +191,206, 26, 83,174,174,174,222, 22, 22, 22,203,231,205,155,235,223,162, 69, 75,100,101,101,129,101, 89, 88, 90, 90, 66,173, 86, +195,198,198, 6,237,219,183,127,177,124,249,114, 5,199, 97, 82, 77, 98, 48, 51, 51, 51, 75, 32, 16, 76,159, 60,121,242,183,126, +126,126,245, 56,142, 67,195,134, 13,209,187,119,111,156, 59,119, 14,177,177,177, 80,169, 84,204,157, 59,119,246, 43, 20,138,211, +252,235,150, 7, 15, 30, 60,254,115,120,197, 55,171,130, 69,235,239, 68,102,102,102, 86,116,116,244,249,208,208,208,192, 17, 35, + 70, 32, 36, 36,100, 28,128, 47, 1, 64, 34,145,140, 27, 49, 98, 4, 66, 67, 67, 17, 29, 29,125, 62, 51, 51, 51,235, 77,252,167, + 88, 44,214,234,245,197,198, 41,169, 84, 42, 53,243,242, 58, 37, 67,134, 0, 80,167,154, 99, 85,155, 70, 4, 2,183,102,125,251, + 10,242, 30, 61, 82,238,184,123,247,219,189,123,247, 10, 58,118,236, 72, 24, 13, 6, 48, 44, 11, 95, 95, 95,162, 71,207,158,150, +191,239,221,235,192,168, 84,215,190,155, 55,239,250,246, 9, 19,138,158,150,248,129,213, 4,157, 78,183, 97,218,212, 79,123, 94, + 9,185,238,209,164,113,125,135,243, 23,175, 60,116,116,180,149,249, 53,104, 96,153,147,151,203, 44,156,255,149, 64,167,211,253, + 82, 19,143, 70,163, 57, 30, 28, 28, 60,216,203,203, 75, 30, 30, 30, 14,189, 94, 15,134, 97,208,163, 71, 15,112, 28, 39, 1,192, + 10, 4, 2, 68, 71, 71,195, 96, 48,100, 62,125,250, 52,237,217,179,103, 18, 0, 43,107, 72, 95,162, 78,167, 67, 84, 84,241,168, +157,167,167,103,175, 1, 3, 6,128,166,105,244,237,219, 23, 39, 79,158,236, 21, 21, 21,181,182,188,230,123,221, 50, 47,177,144, +249,187,187,187, 31, 43, 57,100,146, 19,188,135,135, 71,128,175,175,239,214,149, 43, 87,138, 60, 61, 61,193,113, 28,236,237,237, +160, 86,171,145,157,157,131, 38, 77,154,192,203,203, 11, 43, 87,174, 4,128,253,166, 90,220,210,210,210,158,165,165,165,141,200, +204,204, 20,229,231,231,183,238,213,171,215,250,158, 61,123,226,225,195,135,184,126,253,250, 40,137, 68,146,105, 48, 24,104, 87, + 87,215, 73, 4, 65,216, 24, 12,134,125, 57, 57, 57, 10,254,221,197,131, 7, 15, 30,255, 9,148,250,104,161,220,222, 60,139,150, +191,191,191,101, 66, 66,194,199,117,234,212, 17, 3,128,133,133, 69, 19, 95, 95,223, 57,241,241,241,133,230,166, 70,173, 86, 31, +218,187,119,111,239,159,126,250, 73,212,191,127,255,250,199,142, 29,107, 11, 0,253,251,247,175,111,109,109,141,189,123,247, 26, +212,106,245, 27,139,137,100, 52, 26, 59,183,105,211, 6,185,185,185, 72, 72, 72, 48,107, 88,230,244,233,211, 50, 20,251,101, 85, +123,172, 58,208,122,189,189,157,135, 7,153,122,229,138, 33, 87,169,116,235,220,165, 11, 97, 52, 24, 64,146, 36,114,114,114,144, +148,148, 4, 91, 59, 59, 34,250,233, 83,171,157,115,231,158,174,211,162,133,152,209,235, 29,205, 72,166, 42, 59, 51, 99,252,231, +211, 63, 59,190,111,223,126,121,190, 82, 25,103, 97, 33,211, 73, 36, 34,215, 25,159,127,206,228,230,230,142, 5, 80,100, 2,207, +202,125,251,246,245,237,219,183,239, 19,111,111,111,231,172,172, 44,215,252,252,124, 38, 55, 55,151, 66,177,175, 21, 1, 0, 87, +174, 92,129, 82,169,164, 25,134,185,134,226, 88, 88,122, 83, 19,234,227,227, 99,219,186,117,235,174,114,185, 28, 5, 5, 5,112, +116,116, 68,203,150, 45,187, 82, 20,245,107, 98, 98, 98,193,155,172,245,151, 46, 93,178,230, 56,238, 93,142,227,208,183,111, 95, +147,174, 97, 24,230,147, 1, 3, 6,136, 8,130,128, 70,163,134, 84,106, 1, 75, 75, 43, 88, 91,219,192,207,175, 17,210,210,210, +208,167, 79, 31,125, 92, 92,220,102,133, 66, 97,118, 29, 45, 40, 40, 24,212,190,125,251,217, 83,167, 78, 5, 77,211, 24, 52,104, + 16,146,147,147,215,190,120,241,226,160,187,187,251,232, 79, 62,249, 68,238,232,232,136,217,179,103, 91, 0,248,134,127,119,241, +224,193,131,199,127, 2, 47,251,104,189,106,209,170,110, 76,212,213,213,181, 19, 65, 16,139, 52, 26,141,184,116, 72,134, 32, 8, +177, 92, 46, 63,169,209,104, 86, 40, 20, 10,179,156,226,242,243,243,149,207,159, 63, 63,121,251,246,237,225, 67,135, 14,197,165, + 75,151,198, 2,192,208,161, 67,113,251,246,109, 60,127,254,252,100,126,126,190,242, 77,228,220,195,195,163, 95,151, 46, 93,134, +182,105,211, 6, 65, 65, 65, 96, 24,230,150, 57,215,151,159, 97,136, 74,102, 29,150, 30, 51,137,140,162, 64, 16, 4,104,154, 6, + 0,100,103,101, 33, 54, 38, 6,185,121,121,208,105,181, 80,169,213,140, 95,221,186,154, 2,189, 94, 72, 0,230,142,125, 37,134, +222,191,147,164, 86,169,156, 29,237, 29, 52, 50,153, 4,249,202, 2,209,131,251,119,138, 0,196,153,200,161,231, 56,174,203,185, +115,231,150, 80, 20, 53,194,202,202, 10,211,166, 77,163,186,118,237, 10,145, 72, 4,157, 78,135,252,252,124,236,221,187, 55,139, + 97,152,122, 37,215, 88,201,100,178,221, 20, 69,165, 20, 22, 22, 46,170,241, 15,244,250,254,129,129,129, 2,189, 94,143,239,190, +251, 14, 75,151, 46, 69,223,190,125, 5,247,239,223,239, 15, 96,223,155,170,241, 44,203,162, 87,175, 94,229,157,225,163, 76,185, + 78, 40, 20, 6, 52,104,208, 0, 89, 89, 89,200,202,202,130, 92, 46,135,187,187, 59, 92, 93, 93,177,118,237, 90,110,253,250,245, +231, 13, 6,195,230,236,236,236,140, 90,212,197, 73, 99,199,142,157, 52,124,248,112, 20, 21, 21,225,246,237,219,232,208,161, 3, + 86,175, 94,237,118,237,218,181, 47,219,180,105, 3,161, 80,136,144,144, 16,208, 52,157,204,191,183,120,240,224,241,255, 13,255, + 81,255,172,106, 81,173, 69,203,203,203,203,142, 97,152,175, 6, 12, 24,208,107,240,224,193,232,211,167, 79,133,223,247,237,219, +103,125,244,232,209, 21, 27, 54,108,232,107, 48, 24, 86,154, 51,212,199,178,236,241,125,251,246,245,127,239,189,247,100,221,186, +117,243, 5, 0,137, 68,162,223,183,111,159,154,101,217,227,181,200, 75,105,112,199, 12, 0,112,119,119,111, 46, 16, 8,134,246, +235,215,175,249,248,241,227, 17, 17, 17,129,189,123,247, 62,243,243,243,187,145,145, 97, 86, 27,153, 80,195,172,195, 21, 53, 89, +183, 40,177, 56, 39, 63, 61,221,206,202,219, 91,104,111,109,173, 8, 10, 10,242,234,217,179, 39,145,156,156,140,188,188, 60,104, +181, 90,220,191,127,159, 21, 0,137, 2,123,123, 34,241,246,109,130, 18,139,115, 80,113, 38, 95,141,240,114,179,111,184,120,254, +148, 58, 90,157,182,105, 65, 65, 1, 45, 16, 10,133,158,174,118,201, 49,113,102,141,196,233,100, 50, 89,107, 0, 2,150,101,213, + 14, 14, 14,178,139, 23, 47, 66, 44, 22,131, 32, 8, 52,107,214, 12, 82,169, 84,196,113, 92, 18, 0, 88, 91, 91,139,183,109,219, +102, 59,122,244,232,235, 53, 17,183,106,213, 74, 40,145, 72,222,247,243,243,195,237,219,183, 17, 30, 30,158,120,251,246,109,159, + 86,173, 90,193,219,219,251,125, 55, 55,183,195, 15, 31, 62, 52,190,137,138, 93, 60, 99,213,124,103,120,134, 97, 88,130, 32, 64, +146, 36, 88,150, 69, 86, 86, 22,234,213,171,135, 77,155, 54, 97,221,186,117,223, 41, 20,138, 83,181, 73,143,191,191,191,168, 94, +189,122, 99,135, 15, 31,142,248,248,120,172, 88,177, 34, 91,161, 80, 92,185,112,225,194, 7, 83,167, 78,165, 58,116,232,128,156, +156, 28,252,254,251,239,244,131, 7, 15,126, 75, 79, 79,223,195,191,114,121,240,224,193,227, 45, 22, 90, 94, 94, 94,195, 69, 34, +209,236,145, 35, 71, 82,141, 26, 53, 66, 70, 70, 6,108,108,108,140, 4, 65, 8, 1,192,206,206,206,104, 97, 97,129, 41, 83,166, +160, 69,139, 22,157,230,206,157,219, 65, 32, 16,108, 74, 75, 75,219,109,202, 31,103,102,102,170, 73,146, 60, 50,109,218,180,149, +143, 30, 61,172, 7, 0,247,238,221,123,158,150,150, 54, 63, 51, 51, 83,109,102, 62, 74,131, 98, 18, 18,137,244,110,195,134, 13, + 95,180,110,221,218,102,240,224,193,144,203,229, 8, 13, 13,197,170, 85,171,158,234,245,250, 37, 87,175, 94,165,255,238,155, 76, +235,116,233, 15, 78,156,176,238,250,209, 71, 54, 51, 6, 12, 88,243,217,180,105, 63, 45, 94,188, 88,208,168, 81, 35, 66,173, 86, +227,238,221,187,220,209,163, 71,141,191,127,251,237, 58, 88, 90, 10,111, 31, 61, 42,214,235,245,137,102, 90, 75,186,116,236,220, +169,209,154,159, 54, 64,171, 41,194,221, 91,103,144,151,151,133,109,219,143, 53,242,240,224,186,164,166,166, 94, 53,149,139, 32, + 8,191, 75,151, 46, 57,115, 28, 7,177, 88,140,229,203,151,195,221,221, 29, 54, 54, 54, 40, 44, 44,196,151, 95,126,105, 59,115, +230, 76, 91, 0,136,136,136, 40, 11,207, 80, 19,210,210,210,218, 79,153, 50,197,154,166,105,156, 63,127, 94, 79, 16,196,162,224, +224,224, 95,155, 53,107, 38,238,212,169,147,245,158, 61,123, 58, 0, 8,121, 83, 66,171,150,215, 61,187,120,241, 98,155, 17, 35, + 70,112, 66,161,144,200,207,207,135,157,157, 29, 54,109,218,164, 82, 40, 20,103,106, 93, 7,104, 90, 44,147,201,196, 28,199,225, +200,145, 35, 72, 76, 76,252, 36, 39, 39, 39,157, 97,152, 99, 95,125,245,213,156, 70,141, 26,213,141,137,137, 73, 44, 44, 44, 92, +157,153,153,249,130,127, 53,241,224,193,131,199,127, 10,165, 78,240,165,179, 15,207,160,120, 56,177,106,161,197, 48,204,148, 11, + 23, 46, 80, 44,203, 98,251,246,237,120,240,224, 1, 39,147,201, 22,201,100,178,141, 22, 22, 22,140, 70,163,153, 60,113,226,196, +209, 75,151, 46, 37, 59,117,234,132,219,183,111,147,245,234,213, 27, 11,160,188,208,234,137,106, 98,109, 20, 20, 20,220,207,200, + 72,175, 87, 46, 64,101, 61,137, 68,122,191,134,204,188,204,249,114, 80,204,118,203,151, 47, 87,185,185,185,233,195,195,195,177, +117,235, 86,246,193,131, 7, 87,196, 98,241, 54,133, 66,161, 51,145,243, 77,160,140, 83, 76,211,161,127,204,153,227,255,206,160, + 65,236,167,179,103, 23,137, 44, 44,190, 88,179, 97,195,220,252,194, 66,119, 16, 4,231,104,107,155,184,125,249,242, 21,125,223, +127,191, 40,226,234, 85,233,163, 75,151,132,114,163,241,177, 57,233, 76, 77, 77,189, 26, 18,114, 29,187,118,252, 4,131, 65, 7, + 69,106,177, 78,203,206, 41, 64, 13, 34,235, 21, 78,154,166, 11, 62,248,224, 3, 17, 0,139, 49, 99,198,136, 51, 51, 51, 81,191, +126,125, 0,128, 82,169,196,153, 51,103,208,184,113, 99, 0, 64, 88, 88, 88,217,231,154,210,105,105,105,249,126,135, 14, 29,144, +152,152,136,136,136,136,203, 10,133, 34, 7,192,229,228,228,228,254,109,218,180,193,241,227,199, 7, 86, 35,180,204, 42, 35, 19, +133,214, 43,156, 22, 22, 22,243,143, 29, 59,246,201,173, 91,183, 70,204,153, 51, 71,216,163, 71, 15, 0, 64, 97, 97,161, 26, 0, + 83, 27,206,242,105, 50, 26,141, 96, 89, 22, 14, 14, 14,170,156,156, 28,100,102,102,190,200,204,204,156, 22, 23, 23, 87, 43,206, + 55, 81, 63,121, 78,158,147,231,228, 57,255, 37,156,111, 3, 76,143, 12,207,113, 28,205,178, 44, 66, 66, 66,112,236,216, 49,198, + 96, 48, 76, 82, 40, 20, 97,229, 78,217, 16, 26, 26,122,233,131, 15, 62,216, 29, 19, 19, 67, 69, 70, 70,130,227, 56,198,156,212, +104,181, 90, 35, 65,188,122,236,117,115,185,107,215, 46,164,167,167, 27,146,147,147,131,105,154, 62,254,154,179, 23, 95,123,214, +225, 46, 64,247,161, 94, 31,188,180, 99,199, 94, 75, 46, 93,146,124,250,245,215,186,113,227,199,127,197,232,245, 70, 74, 36, 98, +197,150,150, 36, 35,145, 8, 35,174, 94,149,174,159, 58,213, 65,163,211,157,223,107,134,131,121,169, 69,171,107,215, 78, 24,247, +233, 44,104,202, 89,180,110,223,143,133,206, 0,179, 44, 90, 58,157,174,169, 66,161,128, 84, 42, 77, 2,224,250,241,199, 31,131, +101, 89,104, 52, 26, 20, 22, 22, 34, 45, 45,173, 96,252,248,241, 76,137,120, 18, 12, 29, 58,212,198, 20, 94, 95, 95, 95,119,161, + 80,136,243,231,207, 67, 40, 20,158, 1, 0,161, 80,120,230,210,165, 75,253, 71,141, 26, 5, 15, 15, 15,223,248,248,120, 2, 53, +248,167, 57, 55, 29,116,136, 3, 26,130, 64,131, 98, 19, 28, 26,200,155, 14,122, 66, 0, 79, 75,162,198, 71,181,106,213, 10, 48, +209, 47,171, 60, 74, 38,119,172, 51, 26,141,135,231,206,157, 59,173, 93,187,118,189,151, 46, 93, 74, 0,160,222,196, 19, 72,211, +244,107,133,158,224,193,131, 7, 15, 30,255,106,171,214, 43,168, 82,104, 17, 4,177,189, 75,151, 46,147, 0, 80, 4, 65,108, 77, + 75, 75, 11,123,249, 28,133, 66, 17,235,238,238,254, 99,221,186,117, 39, 3,224, 8,130,216,110,102,162, 50, 56, 14,171, 72,146, +152, 91, 44,238,106, 21,160,178,116,169,147,185, 0, 8,146,164,118, 63,124,248,240,235,164,164,164, 44, 19, 45, 16,213,226, 77, +204, 58, 4,128,253,192,139,145,137,137, 23,102, 7, 4,244,236, 59,117, 42,154,247,237,107,227,238,227,195,104, 12, 6, 54,236, +198, 13,226,214,145, 35,162, 71,151, 46, 9, 53, 58,221,249,227, 64,146,185,233, 76, 77, 77,189,250,231,149,171, 23,135, 13,237, +223,219,183,174,123,177,104,120,145,134,236,220,130,139,230,136,172,151, 68,239,160, 77,155, 54,157, 18,137, 68,130,242, 75,217, + 24, 12,134, 92,157, 78,215, 20, 0,242,242,242,220,183,111,223,126,128, 36,201,196,154,248, 34, 35, 35, 79, 46, 89,178,100,104, + 66, 66,194,197,228,228,228, 4, 0, 72, 74, 74, 74, 48, 26,141,187, 21, 10,197,208,196,196,196,163, 48, 97, 18, 0, 7, 52,140, +184,113,184, 25, 0, 52,237, 56, 28, 17, 55, 14, 75, 1, 52,107,218,113, 56, 0,160,182,107, 25,150, 71, 73,104,133, 69,183,111, +223,222,215,187,119,239,137,120,141,152, 94, 0,160,215,235,141, 26,141,134,102, 24, 70, 96, 48, 24, 56,189, 94,111,228,223, 73, + 60,120,240,224, 97, 58, 56,142,107, 3, 64, 94,242,181,212,128, 34,127,233,179, 30, 37,203, 5,150,190,126, 75,190,103, 17, 4, +113,191, 28, 71,217,113, 19,174, 5,128,108, 0, 79, 8,130,168,202, 8,178,189,170,239, 85, 10,173,180,180,180,163, 48, 97,209, +104, 83,207,171, 6, 11, 74,214,137, 3,106,191,182, 91, 25, 7,195, 48, 25, 73, 73, 73,175, 93,160, 36, 73,190, 24, 56,112,160, + 89,231,215,116,206, 65, 32,241,115,157,110, 79,208, 47,191,180, 60,191,117,171, 7, 67,211,142, 4,192, 81, 98,113,142, 94,175, + 79,144, 27,141,143,205,181,100, 85,176,198, 60, 79,237, 19,255, 60, 21, 13, 26, 52,224,158, 61,123, 86,108,235,121, 61, 60, 86, +169, 84, 94, 53, 85, 1,181, 90,221,201, 68, 49,184, 63, 53, 53,117,127, 37,130,253,128, 66,161, 56, 96,106,162,202, 22,149, 6, + 72,150, 96,135, 53,237, 56,252, 8, 0,182,116, 81,233, 55,137,244,244,244, 24,148,196,121,123, 29, 36, 38, 38,234, 8,130,248, + 99,213,170, 85, 99, 30, 61,122,116, 48, 45, 45, 77,199,191, 54,121,240,224,193,195, 60,145, 69, 16, 68, 80,201,247,192, 18,163, + 80,208,203,159, 75,207, 41, 61,175,252, 57,165, 28, 47, 31,175,238, 90, 0,152, 63,127,254,215, 43, 86,172,144, 1, 48,117, 49, +230, 90, 47, 42,253, 87, 33,227, 95,194, 81, 94, 20,236,248, 43, 50,250, 11,160, 7, 77,223, 1, 93,206, 39,223,248,102,141, 27, +207,158, 61, 35,222,230, 7,174,116, 81,233,114, 8,248, 47,164, 59, 33, 33, 97,147,183,183,247,182,180,180, 52, 26, 60,120,240, +224,193,195, 28,200, 43, 19, 70, 85,136,178,192,234,126,175,208,113,175,228,188,202,190, 19, 4, 17,180, 98,197,138, 64, 51,210, + 91,102,209, 34,249,178,227,193,227,239,195, 63, 49,235,149, 7, 15, 30, 60,120, 84,142,151,173, 88,165,226,235,229,239,243,231, +207,255, 26,213,143, 56,185,161,216,138,229, 86,242,189,204, 95,139, 64,241,204,129,202, 96,206,108,130,158,181,200, 95, 48,207, +201,115,242,156, 60, 39,207,201,115,242,156,255,239, 56,107,226, 14,174, 68, 16, 13,168,106,168,175,186, 97,196,151, 63,215,116, +109, 77,231, 18, 4, 81, 85,152,159,210,161,194,178, 61,199,113,219,241, 55,160, 39,207,201,115,242,156, 60, 39,207,201,115,242, +156, 60,231,235,128,227,184, 54, 28,199, 13, 64,241,132, 41,142,227,184, 1, 28,199,245,157, 63,127,254,130,210, 99,243,231,207, + 95,192,113, 92,143,210,243, 74,206, 41,187,166,244,216,203,251,151,143, 85,119,110, 53, 73,156,244,210,231, 73,165,147,200,254, + 45, 62, 90, 60,120,240,224,193,131, 7, 15, 30,149,162,116,198, 96, 57,107, 83, 22,128,176, 21, 43, 86,228,149,243,157,202, 2, +240, 24, 64,139,146,243,178, 74, 68, 90,121,223, 42,125,201,119,125, 37,231,232, 77, 57,183, 10,108,175,226, 51, 47,180,170, 66, + 11, 87,242, 91,111, 79,231,214, 37, 5, 0,142,101, 1, 0,108, 73, 12, 36,174, 52, 24, 18,203,130,227, 56,164,101,230,135,134, +101, 98,113,109,255,207,207, 29, 14,206, 82,233, 58,150,227, 58,150, 28,186, 90,144,163,155, 21,161, 68,190,169, 28,141, 93,224, + 47, 37,241, 21,203,161, 57, 0,144, 4,158,104, 89,252, 24,157, 97,126, 60,169,202,234,121, 83, 57, 38,137, 45,100, 35,109,237, +236, 27,228,229,101, 63, 53,104,117,135, 35,179,176, 13,230,175,203, 8, 95,123,188,203,114,248, 26, 0, 41, 36,177,246,105,174, +201, 51, 57,120,240,224,193,227,117,173, 35,175, 21, 23,143, 32, 8,166, 18, 78,226, 53, 57,249, 0,123, 38,136,173, 74, 14,223, +171,228,216,253,127, 83,186,205, 18, 90, 77,228,152, 10, 2,203, 0,112,224,240, 77,100, 22,182,152,117,189, 27,122, 74, 41,106, + 39, 0, 74,107, 96,102,115, 44,174, 85,122, 51, 73,116,150,138,168,181, 0, 88, 45,195, 76,136, 84,152,238, 47,214,212, 3,125, + 5, 44,249, 7,203,113, 66,134,229,118,131, 67,144,149, 8, 55,239,164, 66,107, 78, 90,189, 61,157, 91,159,184,167,232,125,101, +203, 12,180,107, 94, 31, 28, 67, 3,172, 17,178, 78, 95,225,242,207, 31,163,157,191, 55, 56,214, 8,176, 52,172,250,173, 65,191, + 0, 91, 46, 44,179,118,235, 96,251,185,195,193,199,201, 57,124,199,142,157,174,238,190, 77, 8,150, 54, 32,230,222,197,209, 51, +231, 46,233,222, 20, 5, 1,166,136,173,230,110,248,212,187, 78,163,175,102, 45,251,137,114,115,247,178,100,141, 58, 58,253, 69, + 84,171, 13,171,151, 28, 21,145,137,107,159, 40,176,211,212,186,220, 68,142,201, 2,137,120,184,133,212,178,129, 90, 93,248,140, + 49, 24, 15,147, 66, 65,223, 31,215,172,107,217,181, 87,127, 43,166, 48,157, 52,178,104,114,232,224, 1,159, 95, 54,109,238, 31, +174, 96,222, 7,192,154,147,103,150,195,220,216, 61,147,250, 11, 5, 20,225,255,201, 14, 10,160,107, 37,180,252,157,241, 33,193, +161,198,240, 18, 28,129,235, 81,153,216, 95,155,255,104,236,140, 95, 9, 14,126, 32,112,132,224,112, 32, 50, 11,153,252, 43,143, + 7,143,183, 11, 36, 73, 94, 97, 89,182,219, 27, 22, 6,239,114, 28,119,135,191,187,255,191, 97,158, 69,139,192,119, 17,113,201, +246, 96, 12,104,234,231,251, 45, 96,158,208,146, 82,212,238,251, 79, 51, 92, 65, 27,176,227,251,105, 7,245, 70,128, 54, 26,192, +208, 70, 48,180, 17, 52,109, 0, 99, 52,130, 51,234,176,228,183, 43,128,190, 16,173, 3, 26,238, 6, 24, 55, 83,255, 67,200,145, +127,132,222,184,232, 64,232, 11,176,127,203,138,207,147,179,138, 62, 15,126,146,150,221,196, 89,179, 32, 50, 19,191,155, 35, 8, +174,108,157,129,189,199,207,164,172,255, 85, 21,205,114, 28, 28,108, 44, 26,141, 14,140,240,218,115,242, 74,242,186,221,218,104, + 0,176,181, 20, 55, 26,251,228,169,247,235, 20,130,179, 84,186,110,219,230, 95, 92,221, 28, 45, 8,250,214, 74,208, 12, 3, 47, +159, 1,212,130,233,163,221,190,251,121,231,207, 80,234,198, 85,119,125, 35,103, 52,169, 83,215,127,246,238, 51,183,188, 85,202, + 76,253,197,125, 95,199, 65, 7,163,171,135,191,240,219, 21, 63, 81, 11,231,205,248, 82,207,164,220,141,201, 68,100, 77,239, 26, +127,103,156, 92,177,114, 77,243,238,253, 2,173,216,162, 44, 74,171, 42,242,219,241,219,206,101,141,155,183,149,117, 10,240, 20, +101, 30,158, 66,104, 10,115, 97, 32,165,146,238, 77,123,218,104,198,140, 50,238,216,181,119,122,100, 38, 54,152,147,103,166,220, +176, 53,203,214, 62,234, 58,193,161,211,163, 59, 87, 38, 51,105,247,193, 49, 70,128, 49,148,237,193, 24,193,177,197,251,118, 83, +126, 3, 80, 59,161, 69,114,232, 29,124,227,190, 91, 70,186,162,205,207,107,126, 88,192,221,191,127, 14, 12,254,136,202,197, 85, +115, 5, 38, 15, 30, 60,254,213, 22, 19,154,227, 56,193, 27,230,236,207,113,220,217,215,164,249, 10,192,167, 37,159,119, 2,248, +241, 13, 36,205, 19,128,107,201,231,116, 0, 41,124, 13,120, 45,148,197,205,122,249,187,185, 21, 74, 10,142, 5,142, 12, 6, 0, + 11,115, 83,193, 1, 82, 16, 20, 96, 84, 97, 80,191, 94,112,114,118, 5,140,106,192,160, 6,140, 26,192,168, 2,140, 26,100, 43, + 18, 1,131, 10,136, 63, 7,154,227, 36,102,103, 87, 87, 0,196, 30, 70,143, 86,222,144,219, 74, 49, 99, 80, 19,167,237,231, 99, +119,238,188, 24,211, 51, 50, 19, 35, 77, 74, 43,199,161, 93,179, 6, 88,191, 83, 21,125,250, 97, 86, 31, 0,232,223,194,241,124, +187, 38, 62, 94,235,118,107,163,207,134,229,245, 5,128,190, 77,109,206,181,109,228,230,205,162,246, 86, 95,150,227, 58,185,215, +105, 64, 48,143,182,129, 85,166, 64,169,212, 32,229,197, 30,216,123,188, 67, 50, 44,186,212,116,189, 5,133,249, 95, 44, 92, 37, + 84, 43, 51,244,172, 33,139,145, 83,121,148, 64,204, 18, 72,189,170, 43, 98,243,153, 89,147, 62,166,103, 47,254,126, 62,128,209, +213,241, 52,113,198,244,181,107,215, 53,235,208,186,177,115,250,209, 25, 68, 81, 94, 6,104, 74, 38, 25,244, 94, 7,216, 53,108, +194,102,132,172, 37,196,190, 61, 97,231,232,139,212, 91,251,144,112,231, 24,209,177,213, 80,201,239,251, 69, 99, 0, 67,165, 66, +171,129, 19, 58,246,233,220,246,160,175,183,187, 27,199,177, 96, 89, 14, 28,203,160, 72,107,196,130, 67,241, 96, 24, 6, 31,244, +233,216,195, 82, 76,112, 44,203,130,227, 88, 36,167,231,168,255,188, 27,221, 35, 62, 15,119, 77,177, 84,181,120,183, 91,199, 39, +161,119, 26, 27, 99, 79,163,245,232, 21,209, 4,112,163, 92,157,235,248,240,194,239,141,129,223,106,175,229, 8, 48, 9,231, 87, +194,187,243, 36,106,219,254,243,242,130,172,212,177, 71,247,108, 30,182,101,219,182,189,209,153,152,194,191, 95,120,240,120, 59, +192,113,220, 27, 23, 91,137,137,137,105,175, 35,182, 60, 60, 60, 58,167,166,166,174, 46,245, 86, 33, 8, 98,117,157, 58,117,150, +252,175,163, 90,161,175, 87,192, 48,204,232,212,212,212,107,213,113, 14, 24, 48,192,253,204,153, 51,117,203,113,214, 5, 80,183, +178,115,237,236,236,152,246,237,219, 39,156, 57,115, 38,141,175, 33,181, 18, 92,102, 11,173,232,164,195, 51, 90,233, 20, 69, 0, + 16,109,194,249, 21,134,252,180, 70,102,229,174,101, 31,175,108, 90,199, 1,133, 42, 61, 46, 62, 72, 0,195, 24,193,208,116,137, +101,139, 6, 67, 27,209,167,133, 19,218,107,167, 96, 67, 80, 12,104,134, 93, 81, 29,231,203, 48,112,236,135, 45,123,142, 56,196, +178,156, 88, 34, 36, 11,252,188, 28,157,103,127,208,130,156, 49,168, 41, 52, 6,122,196,190,144,184, 63,163, 50,177,195, 36, 78, +246,213,144, 71, 92,101,199, 24,186,198,188, 87, 99,141,106,215,179,107, 39, 27, 78, 87, 0, 99,118, 60, 10,213, 70,196,231, 24, +145,174,205,135,132, 80,152,196,201,114,104,238,233,225, 38,187,121,112,222, 11, 71, 74, 41,112,166,104,145,152,164,193,176, 28, +197,229, 71,234, 28, 26,247, 18,150,250,109, 85,151, 78, 11,153,245,199,157,123, 15,176, 77,218, 55,137,176,240,235, 3,231, 86, + 94,120,113,109, 23, 50, 31, 4, 33, 39, 45,129,176,209,230,195,197,177, 62,250,141, 30,137, 31, 71,182, 65,161,178, 16,148, 34, +206, 86, 44,148,216, 1,134, 74, 57, 57, 6,163,215,174,250,222, 77, 64,145,197,247,179,116, 99,140,208,232,116, 0, 67, 67, 42, + 96, 65,112,165,191, 25,193, 24, 13,178,230, 67,231, 77, 3,152,187, 53,229, 61, 42, 19,251,155,200,209, 9,172,177, 49,103,212, +128, 0,110, 68,102,253, 79,252,248, 59,227,195,119,250,140,239,196, 17,184, 94,155, 50, 10,112, 68, 96,235,186, 86,150,150,202, +104,164, 28,249, 28,113,144,114, 46, 29, 62,197,135,159, 76,151,109,223,190,125, 32,192, 77, 69, 69, 31,181,191, 98,145, 85,158, +147,231,252, 79,114,218,216,216,212,171, 83,167,206, 18,163,209,216, 89, 36, 18,185, 24, 12, 6,176, 44,155, 46, 22,139,175, 39, + 36, 36, 44, 87, 42,149,207,255,109,121,127,242,228,137, 57, 98,171, 70, 78,161, 80,136,152,152,152,103,102,136,173,224,151,174, +255,227,198,141, 27, 56,116,232, 16, 0, 32, 54, 54, 22, 13, 27, 54,180,172,236,194, 23, 47, 94, 88,118,237,218,245, 15, 0, 94, +213,113,134,133,133,213, 59,125,250, 52,142, 28, 57, 2, 0,136,137,137,129,159,159, 95,165,137,185,113,227, 6,245,209, 71, 31, +213, 3,144,246, 55,148,209,219, 32,178,202,239,255, 39,180,130,130,130,184,192,192, 64,226,229,207,149, 32,222,219, 94,220, 10, + 90, 6, 0,226,205, 77, 65, 84, 6, 86,173,223,115,161,239,229, 35,155, 58, 75, 69, 36,150,238,152,157,156,149, 91,248,174,128, + 40, 30,126,161, 57,144,246, 86,226,219, 43,198,182,240,206, 43,210,226,212,189,212,107,145,153,230,153, 72, 35, 21,184, 4,176, +118,197,223, 24,104, 53,153,126, 99,127,188,116,224,192,252,190,205,103, 13,106,142,147,183, 18,102, 1,116,141, 81,223, 57,150, + 5,199,210,101,206,239, 37, 93, 7,128,173,184, 40, 48, 11,174,248, 24,107,158, 69,171, 11, 32,200,115, 70, 63,107,153,120,227, +228,201, 19,109,140, 89, 79,145,171, 23, 33, 57, 79,139,116,141, 16, 69, 2,103,164, 70,135, 49, 36,129, 75, 53,154, 92, 8, 40, + 57, 90,107,103, 47,182, 34, 3,122, 77,243, 80,158,255, 58, 79, 76,208,148,205,144,239,236,178, 47,255,148, 64,171,178, 84, 4, +129, 26,195,207,219,218,218, 53,212,230, 36, 80, 5,121,217,176,115,109,138,190, 35, 2,241,205,128, 38, 40, 84,170,144,149,123, +155,107,224,102, 67, 36, 94,223,139,133,253,252,145,147,161,128,206, 8, 16, 42, 93,174, 86,175, 45,170,242, 62,146,216, 54,115, +206,220, 15,125,220,228,150,165,147, 10, 56,150, 65, 11,127, 95,244,234,220, 14,151,110,220,196,253,176, 88,176, 37,147, 10, 56, +150, 69, 74,102, 94,134,214,192,236, 50,235,134, 50, 52, 56,163,182, 82, 33,134, 90, 12, 25, 6, 56, 67,198, 0,139,219,212,179, +158, 48, 63,208,199,218, 82, 66, 64,107,100,160,213, 27, 81,120,115, 35, 28,235, 52,131, 76, 42, 37, 90, 65, 35,120, 8,240,235, + 22,242,224, 81, 14,195,134, 13,147,102,100,100,132,120,121,121, 53,233,213,171,151,172, 83,167, 78, 80,169, 84,184,120,241, 34, + 84, 42,149,143,151,151,151,207,197,139, 23,135, 38, 37, 37, 69,122,122,122,118, 61,114,228,136,201, 62,180, 37, 2,136, 42,123, + 5, 3, 52, 65, 16, 40, 57, 70,148, 28,171,245, 58,183, 98,177, 24,137,137,137,111,220,178,149,154,154,250,172, 54,150,173,162, +162, 34,145,135,135, 7,228,114, 57, 24,134,129, 74,165,194,137, 19, 39, 80, 80, 80, 0,150,101, 97, 97, 97,129,239,214,238, 64, +244,195, 16,220,189,123, 23, 5, 5, 5,162,154, 56, 83, 82, 82,136, 22, 45, 90, 64,167,211,129,166,105,104,181, 90, 4, 7, 7, +151,125, 23, 8, 4,152,251,237,207,136,125, 16,130, 71,143, 30, 33, 37, 37,229,111, 89,109,196, 12, 45,242,111, 68,149, 49,179, +254,246, 89,135, 12, 67, 47,216,190,251,192,237, 5, 83, 70, 98,250,168,158, 94,203, 55, 29,235, 25,149,141,221, 0,224,239,132, +177, 99,186, 53,240,182,147, 9,241,205,190, 7, 0,199, 45,120,221,255,139,200, 69,108, 19, 23,118,214,241,187,137, 33, 95,143, +108, 5, 95, 55,155,134,121,226, 92,113,124,188, 9,107, 10,178, 52,236,173, 36,141,250,183,112, 60, 15,150,133,157,181,164, 49, + 24, 26,118, 86,146, 70,125,155,218,156, 3, 0, 27,153,176,113,101,150,175,170,208,218, 75, 56, 73, 38, 17, 76,178,180,182,243, + 30, 55,176,151, 69,255,129, 67, 45,172,132, 52,114,238, 94,132, 82,232, 9,163,131, 15,116,198, 92,164, 60,143, 99, 46,223,137, + 74,205, 46,212,205,174, 49,153, 28,174,165, 62,143,145,215,107,222,203, 62, 59,104, 97,102,189,241,251,234,146, 96,201,194,189, + 67, 50, 44,157,219, 90,220,139,127, 94,196,114,149, 90,116, 42, 64, 89, 80,144, 96,100,224,166, 97, 4,214,113, 87,126,199,252, +126,205,144,151,155, 9,173,129, 70,129,134, 54,184,218, 73, 37,186,231,225,208, 25,104,232,141, 44,132,118, 30,184,120, 59, 44, +155, 53, 26,207, 85,197, 25,159,131, 71,241, 39, 30, 89,149, 63,230,235,132, 22,243,108, 44, 30,193,168, 65, 98, 74, 26,118,159, +185,221, 42, 62, 7,143, 94,167,156, 57,150, 46, 30,126, 46,103,201, 34, 56,116,170,141, 19,124, 99,103,180, 21, 73, 69,191,172, +158,245, 81,147,247,252, 28, 36,108,202,109, 16,172, 1,150,140, 0, 26, 49, 3, 91, 47, 95,176,250, 66, 78,173,213,230, 71, 0, +124,164,119, 30, 60,202,161, 81,163, 70,174,169,169,169, 17,115,230,204,113, 24, 50,100, 8,142, 31, 63, 14,165, 82,137, 93,187, +118, 97,221,186,117, 88,182,108, 25,140, 70, 35,182,111,223, 46, 59,122,244,104,219,205,155, 55,167,120,123,123, 55, 77, 74, 74, + 74,175, 65, 96, 17, 0, 36, 0,132, 37,109, 23, 1,128, 61,123,246, 44,250,247,239,143,179,103,207,178, 37,199, 24, 20,119,126, +106,181,158,168, 88, 44,134, 88, 44, 70, 65, 65,193, 27, 17, 91, 66,161, 16, 86, 86, 86, 16,139,197, 40, 44, 44, 52, 91,108,209, + 52, 77,165,164,164,160,160,160, 0,189, 6, 14,196,207, 43, 86,160, 91,183,110,232,213,171, 23, 56,142, 67,112,112, 48,122,118, + 8,192,200,247,187, 34, 42, 42, 10, 52, 77,155,148,222,244,244,116,100,100,100,160,239,192,129,216,177,121, 51,218,181,107,135, + 70,141, 26,129,166,105,132,132,132, 96, 88,159, 14,144, 14,238,137,216,216, 88,190, 82,155,110,205,122, 35, 62, 90,175,141,136, + 44,220, 97, 79, 94, 13, 26,213,167,109,224,192,142, 77,176,227,224,229,239, 33, 87, 30, 0, 0, 71,157,228,187,143,187,249, 34, + 50, 41, 15,151, 31,165, 5, 69,101,227,141,204,214, 96, 25, 56, 57,218,200, 0, 74, 12,141,129,165,109,226,107,118, 96,102, 57, + 14,178,206,243, 48,102, 96,164, 87,187, 38, 94, 94,165,179, 14,173,250,255,132,177, 97,207,188,219, 52,114,245, 6, 99, 4, 24, + 35,108, 70,238, 3,190,181,172, 49, 29, 29,234,138, 47,205,156, 49,163,125,191,193, 35, 44,196, 50, 91, 48,202,100, 24,211,195, +144,243,244, 26, 84,178,134, 72, 79,140,199,161, 11,119, 11,158,166,228, 40, 73, 18, 23, 51, 10,116, 95,197,231,161,168, 38, 94, +173, 17, 43,150, 44,156, 61,224,208,129,131,214, 18,223,142, 68,220,198,254, 5, 98, 1, 45,145,215,125,135, 84, 75,157,184, 31, +118, 29,180, 81,233,177,178, 38, 30,181, 74,121, 44,248,226,249,145, 13,234,117,180,126,113,255, 12, 52, 90, 29,116, 70,160,105, +219,174, 96, 24, 78, 76,144, 4,107, 67, 81, 68,102, 78, 30, 8, 35,147,113,253,241, 11,197,141,199,241,148,206, 26, 43,171,141, + 46,242,178,186, 39,168, 47, 6,118,109, 9, 24, 53,120,191,115, 51,252,188,247,242,231, 0, 51,254,245, 10,185,216,162,197, 1, + 29,155,200,177,149,227,208,241,193,137,117,141, 91, 15,158, 9,115, 44, 90, 77,157,208,207,191,158,251,239, 63,127, 55,207,193, +209,179, 33, 69,176, 70,112,174,205, 1,101, 10, 71,164,220,134,173, 71, 59, 48,238, 29,176,125,195,154, 34,150,229, 14, 0,224, +167,100,243,224, 81,254,125,164,213, 30, 91,181,106,149, 67, 96, 96, 96,169, 69, 6,183,111,223,198,206,157, 59, 97,105, 89,241, + 61,217,191,127,127,112, 28,231,176,116,233,210, 99, 0,222,171,138,179,125,251,246, 3, 31, 61,122,148,214,178,101,203,248, 18, +177, 37, 2, 64,134,135,135,147,201,201,201,132,189,189, 61,231,238,238,110, 76, 75, 75, 99, 1, 48,159,124,242, 9,117,248,240, +225, 6, 42,149,234,106,109,133,150, 88, 44,126, 35, 62, 91, 66,161, 16, 4, 65, 64, 44, 22, 67, 36, 18,129,227, 56,179,196, 22, +195, 48,130,179,103,207,226,193,131, 7, 88,214,178, 37,102,121,120,192,193,193, 1, 33, 33, 33,224, 56, 14,150,150,150,200,205, +205,197,129, 3, 7,208,189,123,119,208, 52, 45, 50,133,247,200,145, 35, 8, 13, 13,197,183,173, 91, 99,150,173, 45,172,172,172, + 16, 28, 92, 60, 26, 40,145, 72,144,152,152,136,224,224, 96,116,237,218,149,175,212,175, 9,147, 43, 79, 23, 64,144, 75,192,213, +160,215,128,163, 57,128,128,187,191, 63, 68, 81, 81, 21,157,115, 76, 1, 73, 98,225,134,221, 65, 3,126,154, 57,144,152, 52,168, +149,251,242,223,175, 76, 5,128, 9, 31,248,121,200, 36, 2,172, 63, 25,201,145, 36, 22,190,137, 12,250,251, 67, 68,228, 96,106, +175,118,141,144,150,175, 71, 92, 90,254,159, 81, 38, 14,245, 92,254,105, 12,246,156, 10, 73, 94,183, 71, 27,205,113, 28,236,172, + 36,141,198, 62,137,243,254,253,108,104,210,218, 67,218,104,142,229, 96, 39, 19, 54, 30, 31,213,161,198, 89,135,173,189,132,147, +190,156, 61,187,195,160,241,115,164,116,244, 97,232,227, 46,128, 53,104,160, 52,136,144, 79,185, 34, 37, 41, 9, 63,108, 15, 74, + 86,170,244, 35, 35,178,204, 19,152, 79,115, 80, 36, 32,148, 67,126,248,230,235, 75, 43,190, 91,106,165,137, 15, 41,162, 8, 90, + 67,213,233, 34,248,110,217, 79, 68,161, 78, 63, 34, 62, 15,133, 53,241,232,172,177,114,213,218, 13, 3, 38,142, 30, 26,237,215, +176,139, 35,147,246,220, 81,171, 84,102,238, 59, 31,234, 90,210, 83, 36, 0, 32, 46, 37, 7, 89, 5, 42,154,161,141, 87,173,133, + 88, 30,105,138,117,176, 4,245,156, 33, 15,236,216,244, 35,185,181, 8,154,162,124, 56, 91, 11,209,167, 93,253,143,140,247, 98, +231, 61,207, 52, 71,174,189, 44,180,140,224,140, 26,220, 89,217,189, 49,199, 24, 27,131, 49,194,240,228, 15,243, 45, 99, 4,102, + 77,239,108,101, 99,175,127, 65, 66,101, 9, 88, 56,129,176,241, 1,108,235, 18, 66,255, 17, 72,139,143,160, 63,255,104,116,206, +243,132,148, 95,157, 44,222,200,204, 31, 30, 60,222, 42, 36, 38, 38,126,188, 96,193,130, 27,237,218,181,115,113,114,114, 66,179, +102,205,112,234,212, 41,204,153, 51,167,236,156,150, 45, 91,130,227, 56,228,230,230, 98,213,170, 85,233,105,105,105, 31, 87,219, + 65,143,136,136,222,179,103, 79,231, 38, 77,154, 24, 68, 34, 81, 62, 0, 73,126,126,190, 52, 55, 55,151,208,106,181, 96, 89,150, +181,181,181,101,210,210,210,140, 35, 71,142,212,221,186,117,171,190, 74,165, 74,124, 29,139,150,151,151, 87,120, 78, 78, 78, 1, + 65, 16,175, 29,250,161, 84,100, 57, 57, 57,201,139,138,138, 88, 0,121,181, 9,253, 64,211, 52, 90,183,110,141, 11,215, 30,226, +236,229, 91, 80,166,197, 96,234,196,143,209,172, 89, 51, 92,184,112,161,214,101,214,162, 69, 11,156, 15,190,129, 27, 15, 30, 35, + 49,246, 9, 62,159, 58, 17, 77,155, 54,197,249,243,231,249, 10,109, 58,206,160,162,111,214,153,151,133, 86,215,160,160,160,210, +158,249, 43,242,181,177, 19, 90, 8,237,196,127, 44,237, 87,223, 95,216,107, 41, 8,161, 5, 14, 55, 60,223, 97,225, 15, 27,163, + 41,231,196,209,225,153, 53,207, 14,171,240,208,100, 34,130,187, 27,189,255,113, 84,227,143,222,111,231,133, 29,167,100,139, 1, + 96, 68,167,122,184,247, 52, 11,119, 99, 51,247, 71,102, 33,226,117,115, 29,224, 12, 25,147,141,253,171,190, 24,212,213,199,211, + 21, 59,143,223, 0, 65,224,152, 73, 13, 46,199,113,237,154,248, 96,221,158,151,103, 24,186,122,175, 61,164,141,190, 24, 81,216, + 15, 0,122, 53,150,157,107, 83,223,222,155, 43,239,184, 85, 9, 44,196,130,201,253,134,142,145,210,177,167,128,132, 96, 16,180, + 14, 26, 3, 11, 69,118, 33,212,182, 94, 8,185,253, 88, 83,160,213,207,140,204,170,157, 21, 47, 42, 27,241,162,251,143,147,138, + 84, 26, 55,153,188,190,150, 34, 89,182, 72,199,225, 94,100,130, 50, 50, 29, 49,166,112,196,199, 67,255,174, 7,221,105,235,238, + 67, 75,132, 34,241, 8,138, 0,225,108,103, 41,223,250,211,183,176,182,182, 2,171, 47, 2, 84, 89, 24,242,217, 15, 89,225,105, +198,122, 0,208,208, 17, 86,157,234, 9,119, 11, 72, 34,229, 74,156, 97, 81, 77,255, 65, 24, 49,101,116,159,150, 66, 86,175,194, + 23,171, 14, 98,219,188, 65, 24,211,195, 95,120,230,102,236, 20, 0,203,107, 91,214, 28, 67,131, 51,106,240,222,215,215,162, 9, +224, 6, 7,116,124,112,232,187,198,192, 67,147, 57, 90, 1, 66, 70, 64,248, 55,247,182, 20,177, 41, 55,193,166,220,228, 40,175, + 14, 32,188, 59, 19,132,107,107,238,151,213,203, 84, 59,118,236,188,200,146,248,198,132, 80, 25, 60,120,252,127, 69,124, 90, 90, + 90,223,254,253,251, 95,190,112,225,130, 67, 64, 64, 0, 0,224,193,131, 7,197,157,206,214,173,225,231,231,135,140,140, 12,140, + 26, 53, 42, 91,161, 80,244, 69, 13, 62,191,133,133,133,207,143, 28, 57,226,162, 82,169, 90, 46, 90,180, 40,211,199,199, 71,169, +213,106,137,252,252,124,150,166,105,216,219,219,139, 91,182,108,137,246,237,219, 23,221,190,125,187, 78,114,114,114, 33,128,132, +218, 36,126,208,160, 65,184,118,173,120,210,222,155,136,171, 37, 18,137, 16, 16, 16,224, 17, 31, 31,159, 90,210,182,152,253,142, + 47,223,188, 60,126,252, 24, 87, 31,166, 64,160,215, 64,156,149,134, 59,199,143, 96,224,228,105,160,233,218,123, 49, 60,126,252, + 24, 39,130,239,192, 82, 34, 64, 76, 76, 4,142, 28, 57,130,169, 83,167,190, 22,103, 45, 81,173, 22,249,151, 67,129, 42,252,180, + 4, 0, 16, 24, 24,120,181,212, 90, 81, 30,190,190, 16, 75,138,176,180, 87, 43,143,185, 35, 58,214,167,140,202, 52,176, 12, 11, + 74, 8, 56, 59,217,224,143, 63,246,215,219,127,240,224,237,205,155, 54,111, 96,105,122, 97,120, 38,212,102, 36,106,233, 79, 7, +111,140,248, 99,118, 87,193,212,126,141, 29, 0, 64, 36, 32,177,254, 84, 4, 13, 96,233,235,228,246, 93, 15, 72,139,140,152,228, +236,104,187,120,193,167, 3, 28,186,182,246,195,213,187,225,216,112,228,246, 53,113, 38,246,152, 92,185, 89, 35, 94,214, 79,149, +205, 58, 4, 91,179,223, 37,195,112,174, 34, 75,123, 24, 18,174, 0, 6, 45,180, 58, 3,146,115, 24, 36,231,106, 33,144,137,240, + 32, 54, 69,227,152,142,160,215,200, 54, 97, 41,147,186, 47,249,126,173,167, 86, 83, 68, 43,243,178,105,145,248,142, 80,102, 33, + 81,152,227,170,112, 39, 21,218,206,117,133,239, 0, 44, 37,150,114,234,175,191, 28,103,153, 26,121, 1, 13,200, 52, 16, 28, 7, + 11,255, 1,176,182,160, 68, 29,235, 8,147, 0,192,210, 82, 38, 94,245,205, 28,219,153,243,190,169,209, 7,204, 31, 16,249,249, +186,206, 12,240,177,199,181,208,104, 92, 11, 75,140,184,246, 32,166,105,183,102,238,240,243,180,155, 33,206,203, 95, 25, 5,243, + 45,164,197, 5, 67, 3, 70,109,217,172, 67,127,103,124,216,102,196,162,170,102, 27, 86,138,186, 0, 27,203,112, 32, 40, 10, 32, +200,226, 25,144,201, 55, 33,176,243,229,246, 31, 58,161,222,185,115,207,183, 81,217,188, 21,139, 7,143,154, 80, 80, 80,240, 36, + 42, 42,170, 79,243,230,205,119,125,241,197, 23,214,163, 71,143,118,159, 56,113, 34, 9, 0, 25, 25, 25,236,186,117,235,210,126, +249,229,151,130,236,236,236,241, 70,163, 49,204,148, 39, 92,161, 80,220,250,245,215, 95,179,174, 95,191,222,180,109,219,182,146, +119,222,121,135,181,183,183, 23, 72, 36, 18, 70,175,215,107, 99, 99, 99,153,248,248,120,183,252,252,252,103, 0,226, 80,139, 97, +253, 18,235,213,114,138,162,150,112, 28, 23,240, 38,124,180,100, 50,153, 59,128,103, 4, 65, 52, 48,119,216,240,149, 6, 91, 32, + 64, 94, 94, 30,212,233, 17,144,166, 60, 69,115, 75, 18, 77,236,173, 96, 99, 99,243, 90,162,168,160,160, 0, 80,165,226,198,141, +199, 0, 77,195,214,214, 22,182,182,182,127,187,208,170, 74,139,252, 71, 48,169,146, 99,213,251,104, 53,145, 99,170,133, 30,235, + 38, 15,168, 47,170,235,237, 9, 93,202, 3, 60, 78, 46,194,194,119,219, 70, 82, 18,107,237,228,143, 7,181, 30, 58,172, 14,186, +182,111, 67,212,117,179,157,177,242,167, 45,159, 53, 65,246,156,200, 76,172, 55, 37, 69,145, 89,120,206, 34,115,231,149, 39, 41, + 83, 60,101, 26,176, 44,135, 43, 97, 10,132, 37,228,237,140,206,194,115,115,114,215,196, 13, 61, 5, 32, 15,114, 28, 39,181,181, +180, 44,108,226,231,233,212,243,189, 22,100,223, 46,173, 33,162,128, 27,247, 30, 99,214, 79,199,238,176, 44, 55,192,228, 25, 98, + 44,251,138,128, 42,158, 97,104,172, 48,195,144,227, 56,174,120,214, 97,245,110, 95, 20, 69,164,171, 19,239,187, 10, 29, 27, 66, + 19,119, 5, 9,121, 44, 18, 51, 11,161, 20,184, 66,151,154, 10,112,108,210,213,215,112,172,118,114,114,114,174,215,196,175,254, +198,221, 71, 96, 80, 23,224,121,200, 46, 20,229, 41,240,221,214, 83,245, 61, 60, 28,187,164,166,166, 94, 53,227,101,227,119, 57, +104,191, 51, 56,128, 18, 74,112,102,243, 33,100, 59, 90,192, 73, 38, 2,171,201,194,228,153,163,109,251,245, 26,109, 11, 0,137, + 49,143,224, 35,211,152,196,107,112,196,208, 17,221, 26,217,193,168,193,238,243,143,180, 36,208,119,207,197,136,184,110,141,237, +164, 35, 58,250,216, 47, 79,203,255, 0, 57,181, 11, 42, 90,106,209, 42,179,240,213, 98,182,225, 17,128,105,204, 34,238,224,173, + 76,203, 97,189,222,145,137, 4, 4,193, 21,165,130,179,112,194,150,221,135,139,196, 70,108, 7, 15, 30, 60, 76,130, 70,163, 9, +213,104, 52,205,190,250,234,171, 15,191,254,250,235,206,150,150,150,245, 0, 64,165, 82, 61, 55, 26,141,215, 74,158, 79,115,102, + 7,114, 0,158,197,197,197, 61,143,139,139,115,217,187,119,175, 29, 0,105,201,111, 90, 0,249, 0, 50,240, 26, 51, 14, 75, 69, + 21, 65, 16, 75,222,212,125, 40, 21, 85, 4, 65, 52,168,205,245, 36, 73, 50, 4, 65,128, 32, 8, 72, 36, 18, 92,191,126, 29,195, + 7,244, 66,212,153,124, 4,216, 89,161,237,248,201, 56,120,233, 18, 40,138, 2, 65, 16,160, 40,202,172,118, 68, 32, 16,224,198, +141, 27, 24, 51,106, 24, 36, 2,192,214,214, 22, 95,125,245, 21, 78,158, 60, 9,129,128, 95,165,207, 12,108, 47, 39,184, 76,140, +163, 69, 96,249,165, 93, 63,136,192, 24,113,122,215, 26, 4,133, 23,233, 99,178,176,176, 81, 22,214, 29, 65, 33,155,245,211,158, + 41,151,110,132,255,248,201,200, 64, 89,247,110,189,208,189,107, 55, 65,211, 54, 93, 22, 3, 21,132, 86, 79, 84, 19,107,131, 97, +241,237,246,243,209,147, 15,134,196, 18, 48, 20, 98,100,239, 54, 28,195,226,219, 26, 50,243, 10,167,173,133,213,193, 27,183,111, +219,195, 80,132,132, 71,127, 74,235,212,171, 15, 48, 6, 60,123,246, 20,191,236, 62,206,134,220,139,249, 67, 79,227,139,248, 60, +168, 76,229, 44, 86, 86, 52,108, 45,197,141,250, 54,181, 57,199,130,131,157, 76,212,152, 99, 25,216,201,132,141,123, 53,150,157, +227, 56,142,179,182, 16, 54,230, 24, 99,141,156, 26, 61,189,109,247,111, 59,215, 78,152, 48,193, 50, 59, 37, 29,105,202,112, 20, +137, 61, 96,148,121, 33,238,209, 53,141, 90, 71,155,210,136, 87,121, 63,179,179,179, 51, 67,239,230,226,224,214, 21, 48,234,117, +200, 76, 41,214,170,105,217, 74,216, 56,121,220, 78, 77, 77, 53,153,211, 64,179, 5, 67, 71, 79, 18, 89, 88,195, 98,204,208, 64, +113, 92,142, 14,173,220,173,139, 95, 26, 69, 89,136, 10,190,129,174, 37, 62,166,241,201, 36,124, 90,184,155,148, 78,107,169,232, +139,126,239,120,224,121,146, 2,215, 35, 82,119, 63,207, 69, 26, 19,173,216, 29,151,150, 63,101,208,187,222,248,249,100,228,231, +128,113,191, 57,121,247,119,198,135, 28,135,142,197,206,240, 26,112, 64, 71,127,103,124,104,226, 76,195, 87, 56, 5, 34,124,180, +246, 92,226,162,195,247,179, 7,205,253,168,147, 77,251,246,253,197,160,245, 40,212,232,140, 81,249, 80,190, 78, 25,189, 6,120, + 78,158,243,191,202,201, 0,248,195,104, 52,254,145,159,159,255, 38, 57,211,240,106, 92,167,215,202,123,249, 97, 66,142,227, 4, + 37,214,172,154,156,225,171,229, 44, 63, 76,200,113,220,217, 18,107, 86, 77, 86,173, 10,156, 44,203,166,181,110,221,218, 97,224, +192,129, 96, 24, 6, 79,159, 62, 69, 98,114, 50,122, 78,249, 28,118,118,118,184,246,228, 9, 98, 98, 98,176,100,201, 18, 24,141, + 70,156, 56,113, 34,165, 38, 78,129, 64, 96,168, 95,191,190,104,240,224,193,160,105, 26,241,241,241, 72, 77, 77,197,172, 89,179, + 96,107,107,139,208,208,208, 50,206,236,236,108, 8, 4, 2, 67, 37,214,173,191,162, 46,253,215,241,138,200,170, 94,104, 1, 12, + 24, 35, 10, 46, 45,197,250,235, 48, 24,140,104, 28,153,133, 23,145,255,179, 72,109,161,238, 62, 57,253, 36, 60,250,121,232,205, +238, 98,100,134,193,220,158,196,211, 28, 40,172,165,133,133, 48, 20,218, 32,254, 28, 94,100, 20, 22, 61,205,129,194,236, 30, 3, +203, 16, 48,168, 1,197, 3,220,186,118, 21, 33,119, 30,227,126, 88, 52,115, 43, 52,246, 32,201,226,219,168, 28, 60,173, 69, 47, + 4, 86, 3,126,198,184,176,103,222,109,252, 92,188,193,208,224, 88, 35,108, 71,238,199,248,200,246,222,109,124,237,188,139, 45, + 89, 70,216,127,250, 39,176, 86, 90, 45,223,131,100,227,118,241,201, 11, 31, 20,230,231,188,219,163,203,123,150,182,254,253,144, +253, 44, 22, 79, 31,223,208,132,134,199,221,122,144,108,124, 45,107,137,135,135, 71,231, 30, 93, 26, 97,228,228, 5, 48,168, 11, + 16, 31,242, 27,138,114,211,113,253,182, 21,162,149,202,247, 0,152,108,209,186,157, 68, 55, 69, 82, 30, 58,212, 17, 38, 89, 67, +231,250,113,224, 64, 72, 8, 45, 88,157, 18,132, 58, 27,113,169,250,130, 15,182, 38, 51, 0, 32,147, 16, 2, 75,174,192,198, 36, +203,163,143, 99, 67, 25,101,196,158, 75, 17, 96,217,226,229,155, 88, 22, 91,246,252, 25, 55,229,219, 49,173,208,196,219,190,197, +163,212, 76, 2,102,152,252, 9, 14,157,238, 31,252,166,177,246,242, 98,128, 53,224,198, 12,135,198,157,214,231,118, 66, 45,151, +219, 9, 79, 67, 42,128, 41, 16,168,183,205, 88,127,126,113,235, 75,145, 29,103,127, 58,200, 6, 28,191, 0, 59, 15, 30, 60,254, +126, 20, 21, 21, 77, 30, 63,126,252, 54,161, 80, 40, 7, 64,176, 44, 11,150,101, 5, 63,254,248,163,144, 97, 24,146, 36, 73,134, +162, 40,250,236,217,179, 70,134, 97,178,180, 90,237,228,154, 56,105,154,142,155, 54,109, 90,253,154,102, 40, 30, 56,112,160, 84, +100,197,241, 37, 97,146,200, 42,191, 47,179,114, 85,221,120,112,248,166,195,152,165, 75, 1, 16,224,176, 44, 50, 11, 47, 94, 62, + 37, 44, 23,105, 77, 40,195,172,166,109,186, 44, 45,189,198,220,148,105, 25,102, 88,155,102,126, 7, 0, 64,199, 49, 99,106,147, + 59,165, 78, 51,162,101,155,247, 14,178, 28, 39,160, 57,110, 39,201,226,168,150, 70,148, 41, 51,237,170, 66, 90,102,126,104,191, + 0, 91, 14, 40, 30, 50, 44, 27, 46, 44, 9,227,192,113, 28, 87, 54, 92,184, 70,138,236, 2, 93,141,113,160,110,190,208,247,210, +211,247, 39, 93,188,249,104, 50,195,112,174, 20, 69,164,107,244,244,182,215, 21, 89, 0,144,154,154,122, 53,248, 82,234,197, 39, + 45, 92,122, 59,201, 74,172, 92,106, 32, 91,141,139,169, 89, 69, 87,107,195,153,167, 50, 14,250,122,221,201, 83, 98, 33, 37, 0, +199, 21, 7, 20,229, 56,104, 13, 76,238,237, 36,186, 41, 0, 52,115,128,251, 87, 39,232, 3, 20, 69, 36,214,196,119, 55, 70,241, +243,200,149,193,115, 34, 18,242,118, 38,228, 35, 28, 0, 18,242, 17,126,232,198,139,197,113,233,133,115,194, 19,243,214,192, 76, +191, 10,142,192,245, 54, 35,151,190,114,236,117,239,103,180, 2,143, 1, 12, 1, 82,122,141,156,253,203,108,130, 0,191,252, 4, + 15, 30,255,143, 80,106,213, 34, 73,114,249, 27,228, 60, 75, 16, 68,127, 0,207,204,184,236,110, 81, 81, 81,179, 55,156,189, 28, +154,166,115, 76, 57,241, 31,112,136,255,175,226, 31,115, 45,233,201,115,254,253,156, 13, 26, 52,224,204, 16, 44,252,253,228, 57, +121, 78,158,243,255, 21, 39,199,113,212,235,108, 85,112, 18,175,179,241,101,244,159,199,203,206,240,147, 74,141, 19,252,112,200, + 91,136,103,207,158, 17,252, 93,224,193,131, 7,143,202, 65, 16, 4,243, 23,112,242,193,139,121,148, 10,174, 10,214, 45,146,191, + 39, 60,120,240,224,193,131, 7, 15, 30,111, 68,100,149,223, 23,139,112, 84,109,254, 51,103, 54, 65,109, 76,136,193, 60, 39,207, +201,115,242,156, 60, 39,207,201,115,254,191,227,172,137,251,173,152,205, 88, 67, 28,243, 55, 6,222, 31,128,231,228, 57,121, 78, +158,147,231,228, 57,121,206,183, 29, 85,250,104,241, 67,135, 60,120,240,224,193,131, 7, 15, 30,127, 17,120,103,120, 30, 60,120, +240,224,193,131, 7,143,215, 67,141,139, 74,243,224,193,131, 7, 15, 30, 60,120,240,168, 29,170, 95, 84,154, 7, 15, 30, 60,120, +240,224,193,131, 71,173, 97,254,162,210, 60,120,240,224,193,131, 7, 15, 30, 60, 76,194,118,254, 22,240,224,193,131, 7, 15, 30, + 60,120,252, 61,168, 56,235, 48, 40, 40,136, 43,191,231,193,131, 7, 15, 30, 60,120,240,248, 59,241,182,106, 17,126,232,144, 7, + 15, 30, 60,120,240,224,193,227,245, 48,137, 23, 90, 60,120,240,224,193,131, 7, 15, 30,127, 13,170,244,209, 42, 13, 88,218,181, +196, 84,215,149,191, 87, 60,120,240,224,193,131, 7,143,127, 0,111,183, 22,225,253,179,120,240,224,193,131, 7, 15, 30,188, 22, +121, 51, 40,117,134,231,193,131, 7, 15, 30, 60,120,240,224,241,122,224,215, 58,228,193,131, 7, 15, 30, 60,120,240,248,155, 5, +215, 95, 46,180,248,149,205,121, 78,158,147,231,228, 57,121, 78,158,147,231,252,255, 36,178, 42,136, 45,126,214, 33, 15, 30, 60, +120,240,224,193,131,199,235,161,198, 89,135, 60,120,240,224,193,131, 7, 15, 30, 60,106,135, 73, 0, 2, 75, 62, 7,162,156, 85, +139,183,104,241,224,193,131, 7, 15, 30, 60,120,188, 30,182, 3,112, 43, 17, 88,103, 0, 40,120,161,197,131, 7, 15, 30, 60,120, +240,224,241,102, 80,222, 47,107, 64, 57,241,197, 11, 45, 30, 60,120,240,224,193,131, 7,143,215, 68,149, 62, 90, 4,170,158, 57, + 16,108,198, 31,212,102,246, 65, 48,207,201,115,242,156, 60, 39,207,201,115,242,156,255,239, 56,107,226, 14,198,127, 15,175,132, +117,224, 56,110,251,223,241,199,252,212, 87,158,147,231,228, 57,121, 78,158,147,231,228, 57,255,223,225, 47, 11, 88,218, 10,176, +224,111,239, 91, 9,151,146,141, 7, 15, 30, 60,120,240,224, 81, 61,254,154, 89,135,254,192,167,163, 3,228, 91,141,225, 89, 54, +225,128,186,186,115,229,114,249, 54,153, 76, 54, 90,173, 86,171, 8,130, 96,203, 43, 64, 0,229, 23, 7,138,207,202,202,234, 84, +211,127,139,197,226,117, 46, 46, 46,159, 22, 21, 21,169, 9,130,224, 8,130, 0, 65, 16, 0,240,202,158, 97,152,148,156,156,156, +214,255,113,169, 76, 57,185,184,220, 19, 82,148,135,185,151, 50, 44,251, 34, 51, 35,227, 61, 51, 46, 89, 65, 16,152, 91,252,183, + 88, 13, 96,193, 91,215,243, 0, 40, 83,206, 11, 0,172, 99,129,145, 12, 73,126, 46, 4, 54,233, 88,118, 43, 0, 16, 0, 83,219, +255,214,221, 69,125,130, 67, 11,130,128, 45,199,161,128, 35,240, 88,210, 14,113,255,208,173, 24, 42, 20, 10, 7,217,216,216, 88, +229,228,228, 92, 5,112, 0,192, 40, 71, 71,199, 46, 74,165,178,200,104, 52,158, 4,112,172, 54,196,157, 90, 96,158, 88, 36,252, + 68,107, 48,174,186,249, 24,191,117,105, 5, 71,154,197, 74,169, 72,208, 73,167,167, 87,223,120,130,157,102, 82, 18, 37, 91,233, + 59,195,236, 69,197, 14,155, 88,238, 0,112,194,222,222, 79, 34,183,185, 44, 20, 83, 47,242, 51,138, 70, 15,203,204, 76, 30,254, + 26,229,254,111,132,147,147,211, 56,146, 36,191,231, 56, 14, 12,195, 44,204,205,205,221,245,134,168, 23, 2,176, 43,249,156, 15, +224,251,215,228, 75, 4,224, 93,242, 57, 9,128, 15,223,174,215, 26, 91,142, 31, 63, 62,165, 91,183,110,248,249,231,159,177,101, +203,150,132,172,172,172,149, 0,118, 3,208,255, 3, 60, 60,170, 66, 19,160,255,143,125,218, 49,198,223,191,101,203, 29,238, 89, +197,195,252,235,199, 31,127,108,224, 56,142,139,137,137,225,244,122, 61,103, 52, 26, 57,154,166, 57,154,166, 57,163,209, 88,182, +121,120,120,164,190,116,249, 43,156, 36, 73,174,255,224,131, 15, 10, 57,142,227, 30, 60,120,192,105, 52, 26, 78,167,211,113,122, +189,158,211,106,181,156, 70,163,169,176,185,184,184,100, 84,199,105, 99, 99,243,192,222,222, 62,195,222,222, 62,195,193,193, 33, +195,193,193, 33,195,209,209,177,108,115,114,114, 42,219,228,114,121,134, 92, 46,207,112,112,112,120, 80, 83, 58, 75,208, 7,192, + 85, 19,182, 62,149, 92,219,179,188,208,114,115,115,203,224,106, 1, 79, 79,207,100, 19,210, 89, 10, 23,130, 0, 83,122, 45, 65, +128,149, 72, 36,222,229,127,199,171,150,174, 26, 77,202,238,238,238, 31,184,185,185, 5,187,185,185, 93,114,119,119,255,192,132, + 42, 86,129,211,218,218,250,129,147,147, 83,134,171,171,107,102,233,230,230,230, 86, 97,115,119,119, 47,219, 92, 92, 92, 50,236, +237,237,171, 44, 35, 14,160,170,218, 66, 0,129, 4,232, 46,160,168, 32, 23, 23, 23,101, 88, 88, 24,195,113, 28, 71,146,100,106, +233, 57,230,228,253,101,145,165,190,129,133,217, 87, 36,119,139, 94,172, 44,200,190, 34,185,171,190,129,133,186,187,168, 95, 91, + 78, 19, 81, 25,231,216,177, 99,199, 62,206,200,200, 72,205,207,207, 87,108,221,186, 53, 86, 42,149,222,216,186,117,107,108,126, +126,190, 34, 35, 35, 35,117,236,216,177,143, 1, 76, 51,131, 19, 0,240, 94, 11,188, 59, 97,168,155,250,241,137, 49,234,238,109, + 4,143, 58, 4, 32,176,215,123,162,212,141,243,253,213,215,118,116, 84,119,123,135, 12, 55,147,147, 16, 8, 4,237,189,189,189, + 63,145,203,229, 31,151,108, 99, 74, 55, 87, 87,215, 49,174,174,174, 99,236,237,237,135, 87,199,121, 24,160, 76,217,188,164,210, +246,195,235,121,171, 19,151, 47,227,194,102,126,206,125,226,235,165, 28,230,236, 92,231, 31, 40,163,191,148,211,217,217, 57,205, +104, 52,114, 6,131,129,115,116,116, 76,123,131,233, 92,195,113,220, 26,142,227,214, 0, 88,243, 6, 56,203,222,103,102, 8,236, +234, 56,165, 2,146,156, 45, 19,139, 47, 73, 4,130, 76,137, 64,144, 41, 19,139, 47, 9, 72,114, 14, 0,233,191,169,140,254, 2, + 78, 43,185, 92,254,124,221,186,117,156, 90,173,230,212,106, 53,183,110,221, 58, 78, 46,151, 63, 7, 96,101, 6,103,109,121,222, + 38, 11, 86,133,173,116,232,240,141, 88,180,252,129,214,221, 91, 52, 56, 58, 99,220, 72,176, 71,214, 17, 53,244,152,126,125,175, +117,235, 79,118,239,222, 13, 0, 24, 61,104, 16,122,183,109, 11,107, 43, 75,136,197,197,201, 33, 56, 2, 34,161, 8,131,103,125, +105,202,223,175, 30, 60,120,240, 71, 71,142, 28,177, 2,128, 45, 91,182, 96,232,208,161,112,112,112,128, 76, 38,131, 72, 36,130, + 80, 40,172,176,175, 9, 20, 69,121,166,166,166, 58, 75,165,210, 50, 43, 27,203,178, 21,182,242,171,114,211, 52,141,134, 13, 27, +154,122,187,230, 23, 20, 20,116, 86,169, 84,101, 28,149,109,245,234,213, 3,128, 11,166, 16,126,255,221,183, 96,105, 21, 4, 2, +128,166, 1,157,129, 4,203, 85, 42,110, 48,109,218,180,215, 90, 77,124,192,128, 64,130, 32,136, 35,161,161,161, 71, 51, 51, 51, +235,178, 44, 51,177,150,150,174,207,158, 62,125,106, 5, 0,126,126,126,211, 0, 28, 53, 39, 29, 2,129,192,243,201,147, 39,206, + 18,137,164, 74,203,101, 57, 11, 38, 12, 6, 3, 90,181,106, 69,155,243, 31, 46,128,119, 46, 73, 78,108,249,206, 59,147,150, 14, + 30, 44,189,119,239,158,148, 36, 73,208, 52,141, 31,127,252,145,230, 56,206,174, 9, 96, 19, 9, 40,171,161,249, 26,192,184,146, +198, 96, 39,128, 31, 43,168, 5, 14, 45, 52, 70, 73, 96,124,209,224,182,237,234,204, 67,100, 68, 88, 91, 95,171, 19,176, 22,232, +226,128,191,215,170,101, 99, 99, 51,232,231,159,127,150,239,220,185, 83, 25, 19, 19, 99,216,186,117,171,124,242,228,201,214, 6, +131, 1, 83,166, 76,201,106,212,168,145,232,231,159,127,150, 31, 59,118,172,187, 74,165,218,108, 86,121, 17,248,118,212,160,222, +208, 26, 73, 24,141,180,220, 77,110,253,199,140,177, 93,133, 28,167,199,158,147,161, 48,210,236,111,102, 90,178,222, 27, 54,108, +152,239,254,253,251, 5,209,209,209,130,198,141, 27,131,101, 89, 48, 12, 3,163,209, 8, 0, 96, 89, 22, 13, 26, 52,120,237,251, +242, 9,224,231,228,226,112,233,189,254,253, 44,220,164, 18, 56,228,101, 97,130, 72, 96,189, 75,166,219, 11,160,253, 91,101,217, +229, 56, 8, 4, 2, 36, 39, 39,195,217,217,217,130,101, 89, 5,128,101,121,121,121,219,241,246,162,173, 88, 32, 56,186,231,183, +245,174,237,218,183,167, 92,220,156, 17,251, 52, 9, 2,130,233,249,228,126,104,215, 79,166,206,158,161,167,233, 15, 0,220,123, +219, 50,238,218,126,218, 16,130,164,182, 16, 28,139,111, 54,158, 42, 92,177,122,157,108,202,196,177,212,172, 89,179,224,229,229, + 85,119,200,144, 33,171, 1, 76,173,145,167,221,180, 33,160,200, 45,224, 56, 44,253,229, 84,225, 15,171,215,201,166,214,130,231, + 63,142, 42,159,145,215, 22, 90,254,128,111, 83, 47,231,139, 43,230, 78, 21,114,231,126, 39,213, 57,153, 85,158, 43,151,203,183, +245,237,219,119,244,174, 93,255,179, 70,191, 23, 16,128, 33,221, 59,194,217,209, 22, 50, 75,113,113,115,196, 18,120, 28,243,194, + 36, 65,224,229,229, 53,229,232,209,163, 86,229,197,132, 72, 36, 42,219,202,139,172,210,173,180, 1,174, 14, 82,169, 20,193,193, +193, 16, 8, 4,160, 40, 10, 2,129,160,108, 43,255,157,162, 40,184,184,152,229,186,180,210,214,214,182,121, 97, 97,161, 77,126, +126, 62,188,189,189,149, 0,158,148,251,189,121, 86, 86,150,141, 57,132, 44,173,194,172, 9,254, 16,234,239, 64, 47,108, 11,141, +160, 3,110,221,143, 66,208,133,171, 72, 77, 75, 71,199,119, 91,226,227, 15,135,225,210,165, 75, 96, 24,179, 71, 58, 50, 56, 14, +171, 7, 14, 12,156, 7, 16, 68,207,158, 61,243,167, 79,159, 78, 70, 71, 71,127, 52,100,200,224,128,167, 79,159,149, 88, 21,137, +185, 28,135,245, 0, 50, 76,228, 21, 3,192,181,107,215, 0, 64, 82,155,186, 39,145, 72,112,251,246,109,148, 14, 19,147, 36, 9, +146, 36, 65, 81, 20, 78, 63,115,130, 74, 79, 66,157, 17,142,207, 3,189, 81,175, 94, 61,144,100,205, 46,137, 93, 1,233, 45, 96, + 8, 33, 20,206,114,115,119,175,219,197,215, 87, 22, 28, 28, 76, 1,128,143,143, 15,167, 80, 40,242, 79,158, 60, 89, 40, 0,182, +248,112,220,238,234, 68,150,151,151, 87,135,212,212,212,239, 75,239, 57, 65, 16,171,235,212,169,179,164,172,220, 88, 22,203,126, + 83, 9,103,204,152, 41,106,215,117, 17, 0,160,221,192,253, 80,198,175,240, 39,114,191,182,253,187,223, 18, 74,165,242, 96,131, + 6, 13,168,156,156,156, 91, 0, 18,141, 70,227,252, 63,254,248,195,121,194,132, 9,153,123,247,238, 93, 9,192,125,213,170, 85, + 93, 85, 42,213, 33,115,120, 59, 54, 71,255,119,154, 7,188,235,237,229,133,171,183,238, 65, 36, 22,218, 77, 27, 23, 8, 43, 43, + 1,214,236, 60,195, 38,166,228, 78,191,241, 4,187,205, 16, 89,109,135, 13, 27, 86,119,255,254,253, 98, 0,120,242,228, 9,210, +211,211, 33,151,203, 97, 97, 97, 1,161, 80, 8,138,162, 32, 20, 10,223,136,200,178,245,114,188,123,226,196, 73, 11, 7, 7, 59, +108,252,114, 6, 62,206,204,128,157,181, 21,140, 69,170,186,111, 89, 67,225,215,169, 83, 39, 41,195, 48, 80,169, 84, 8, 9, 9, +177,181,176,176,176,245,244,244, 92, 90, 93, 35, 82,201,187, 51, 67,171,213, 58,151,124,206,212,106,181, 46, 0,148, 18,137,164, +244, 61, 93, 84,178, 55,117, 56, 49, 17,175, 14, 19, 38, 17, 4, 81,254, 88,109,209,166,109,155,230,193,199,142,236,179, 42, 40, + 76,135,157,125, 38, 72, 20, 96,251,246, 77,176,176,176,193,210,165, 95, 11, 94,244,236,238,209,167,255, 7,193, 17, 81,177, 61, +223, 58,177,197, 17,219,123, 14, 28,237, 96, 33,179, 46,105, 75,140,216,181, 99, 6, 72,146,196,146, 37, 75,208,180,105,211, 73, + 17, 17, 17,139, 0,228, 86, 79,131,237,205, 58,143,112, 16, 75,139,139,152,101,140,216,122, 96, 78, 49,207,130,201, 24, 53,176, +222,164,175,134, 61, 63,223,212, 23,133, 37, 29,115,141,144, 68, 18,209, 14,101,130, 33, 40, 40,168, 75, 96, 96,224,213,170,190, +255, 7,224,134,255,197,207,170, 32,190, 4, 65, 65, 65, 92, 96, 96, 32, 81, 46,115, 21,190, 87,135, 22,128,147,189,173, 44,120, +203,178, 25, 86,130, 59,103, 40, 77,210, 51,164,105, 43, 52,228, 21,166,104,202,100,178,209,187,118,237,170, 96, 82,242,118,113, +134, 72, 36,132, 80, 68,192,174, 83,113,244,250,252,235, 65, 32,136, 42, 69, 86, 5, 78,149, 74,165,125,244,232,145,213,206,157, + 59,225,236,236,140,186,117,235, 66, 38,147, 65, 42,149, 86, 16, 87,229, 5, 87, 37, 66,171, 2,103,233,239, 2,129, 0, 36, 73, +226,210,165, 75,160,105, 26,195,134, 13,123, 69,100, 9, 4,130,170,132, 91, 85,211, 83, 47, 0,120,194,113, 92,231,146, 6,248, + 9,128, 46,229,126,239, 35,151,203,231, 3, 88,105, 42, 39, 69,113,160,180,183,192,122,174,131, 32,121, 6,244,194, 22,184,114, + 35, 20,187,182,253, 12, 0,168,219,184, 13,134, 15, 9, 44,179,198,153,152,206, 50,120,120,120, 28,200,202,202,238,215,189,123, +119,228,229,229, 25,151, 45, 91,134,230,205,155,195,207,207,207,164, 50,170,162,231,156,241,228,201, 19, 47,141, 70, 3,142,227, + 76, 17,103,175,112, 18, 4,129, 63,254,248, 3, 90,173,246,149,147,237,187,252,128, 57, 67,125, 48,254,243,221, 88, 29,115, 8, +155, 55,111,174, 54,239, 50,160,185,214,182,193,122, 49, 69, 55, 95,249,245,103,146,143, 63,254,152, 26, 63,126, 60,146,146,146, + 48, 97,194, 4,237,165, 75,151,244,233, 10,197, 73, 49,203,110, 52, 84, 20,198, 85,114, 74, 36,146, 61, 23, 46, 92,192,161, 67, +197,186, 36, 54, 54, 22, 13, 27, 54,180,172, 32,146,115, 15,163, 48,113, 35,238,158,142, 70,187,129,251,113,247,244,135, 96,242, +207, 8, 91, 55, 68,129, 57,247,179, 22,168,140,243, 80, 78, 78, 78,153,136,218,187,119,175,197,222,189,123, 7, 3, 56, 5,224, + 16, 0,228,230,230,254,100, 38, 39, 64, 96,252,136,161,131, 33, 16, 89, 35,250, 89, 10,186,188,215, 10, 46,206,206,120, 18, 21, +135,196,212,220, 12,130,192,184, 62,237,197, 43, 53, 26,253,162,235,143,241,107, 13,156,132,167,167,167,223,225,195,135, 69,229, + 44,208,101,207, 56, 69, 81,101,223, 75,133,119,109,234,103,169,200,178,246,180,186,251,237,166, 14,150,119,195,246,162,161, 79, +127,216,247, 15,196,175, 23, 47,226,105, 68,164, 86,175,166,123,252, 3,101,244, 87,113,250, 13, 29, 58,244,214,190,125,251,236, +146,147,147,113,237,218, 53,212,173, 91, 23,106,181,218,148, 14,111, 5, 78,173, 86,235, 92,122, 13, 65, 16,206,165,134,119,189, + 94, 95, 90, 24,165, 15,162, 93,185,243,236,170,225,244, 46,119, 94,169,184,242,121, 3,121, 23, 75, 69,162,195, 39,142, 29,176, +138,140,190,134,150, 45,222,133,149,109, 19,176, 76, 58,114,114,139,144,247, 44, 13,223,125,183, 26, 75,151, 45,196,169,227, 71, +172, 26,249,183, 56,170,167,233, 6, 0,180,111, 77,185, 19,220,164,224,211,123,183, 16, 28, 11, 77, 70,180, 68,168,122, 46, 27, +253,225, 7,212,200,145, 35,113,234,212, 41, 68, 68, 68,108,169, 70,100, 5,151,179,204, 79, 10,191,118,104, 11, 56, 14,154,204, +104,137, 72,243, 92, 54,246,163,225,212,199,163,122,227,206,159,235,209,187,229,243,112,119,103, 12,201, 43,145,216, 2, 10, 57, + 18, 41,110,114,119,113,167,156,216, 10, 1, 64,148, 19, 88, 33,248,159, 15,230,127, 1, 3, 74,132,213,164,151, 59, 38,130,218, + 8, 44, 0,104, 8, 88, 17, 98,209,221, 93, 75, 63,115,151, 37, 69, 8,116,225,183,145,166, 99,185,173, 9, 52,219, 10,176,120, + 8,104, 94,190, 70,173, 86,171,226,226,226, 44,198, 13, 25,130,246, 1, 1,112,115,116, 68, 3, 79, 79, 88, 72,196, 16,139,132, + 21,186,172, 38,143, 33, 16, 4,215,168, 81, 35, 12, 28, 56, 16, 66,161, 16, 50,153, 12, 86, 86, 86, 16,139,197,149, 90,179, 76, +237,229,114, 28, 7,138,162, 16, 30, 30,142,196,196, 68,216,217,217,225,230,205,155,232,209,163,199, 43, 86,173,242,226,204, 28, + 19,125, 37, 13,127,169, 16,187, 96, 14, 23,195, 16, 40,226, 90, 64,154, 48, 29,106,162, 21,116, 58, 26, 58,157, 14,191,222, 48, +224, 94,156, 10, 6,131, 30, 58,157,174,186,255,172, 10,164,187,187,251,232, 6, 13, 26, 76,251,240,195, 15,141, 98,177, 24, 42, +149, 10,106,181, 26, 17, 17, 17,198,126,253,250,231, 15, 28, 24,104,123,230,204, 25,174,100,232, 48,195, 12,238, 28, 15, 15, 15, +175,146,225,217,156,218,212,106,130, 32,202, 68,204,203, 24,247, 83, 36, 4, 84,113,153,108,217,178, 5, 12,195,128,227,184, 42, + 11, 73, 75, 16,151,151,253,176,214,118,213,186,223, 96,235,224,130,171, 87,175, 50,231,207,159, 47, 36,128,216,167, 17, 17, 63, +189, 15,156, 61, 12, 24,204, 73, 95, 94, 94,158, 69,221,186,117,225,233,233, 9,150,101, 97, 52, 26,203,172, 47, 57, 57, 57,208, +104, 52,112,176,204, 71,125, 71, 79,208,133, 33, 80,132,127, 3, 55,171,104,236,190,160, 55,190,227,135,199,255,130, 23,199,239, + 37,219,107,246,154,225,225,236,234, 5,146, 51, 34, 45, 51, 7,131, 7,244, 6, 37,178,194,139,228,108,180,104,226,235,246,209, +251, 29,220, 40,130,198,220,149,251,167, 1,236,175, 53,209, 21, 21, 21, 49,209,209,209,120,242,164, 88,239,218,216,216,192,210, +210,178,194, 51, 78,146,228,107, 89,180, 74, 69,214, 15, 91,122, 88,146, 66, 21,148, 76, 48,118,254, 17,138, 22,141, 2,177,245, +238,125, 45,147,145,219,115,141, 86, 27,123,224, 63,108,204,112,117,117,157,204,178,236, 82,142,227,242, 59,118,236,232,178,127, +255,126,251,212,212, 84,132,134,134, 98,201,146, 37, 89, 12,195,208, 28,199, 17, 28,199,125,243, 6,254,142, 45, 39,176,222, 36, +132, 50, 41, 62,119,178, 33, 6, 9, 72,155,186,180,178,232, 69,182,158, 59,169,166,217, 95, 0, 24,171,125,185,145,228,167, 71, + 14,110,113,119,146,179,232, 42,239, 14, 69,134, 1, 63,124, 57, 22, 57, 57,133,248,117,199, 10, 0, 98, 24,104, 10,157,187,126, + 0,103,103, 15, 76,154, 56,201,117,203,182,173,159,209, 44,187, 6,111, 9,210,111,109, 62, 14, 32, 88, 46,151, 71,124, 54,105, +146,188,110,221, 49,144, 74,165, 56,112,224, 0,246,111,220,200,172, 3,134, 75,128, 43, 83,128,227,213,242,220,253, 31,207,140, + 41, 83,228,254,254, 83, 32,145, 72,240,231,249,223,161, 77,255,163,112, 64,123, 24,212, 90, 12,168, 51,144,115, 72, 56, 77,228, + 10,133,120, 6, 0, 66, 41, 20, 0, 94, 30, 6,251,175, 9,172, 82,156,193,255,102, 26, 78,170, 96,209,170,245,187, 83, 40, 14, +219, 49,115,148,143, 11,116,132,254,198,105,164,234, 88,102,213, 83, 3,245,176,128,155, 19, 85,137,200, 42,169,216,172,183,183, + 55,186,183,110,141, 33,157, 58, 65, 32, 16, 64, 42, 22,193, 90,106, 1,142, 41,182,100,149, 14, 29, 86,211, 38,162, 50,235,147, +163,163, 35, 68, 34, 81,153,192, 50,195,154, 85, 41, 39,203,178, 16, 8, 4,120,242,228, 9, 58,118,236, 8, 47, 47, 47, 28, 58, +116, 8,125,250,244,121,101, 40,209, 92,145, 85, 42,180, 94, 26,198,235, 3,160,212,146,101,150,208,210,234, 9,100,235, 91,128, + 32, 2, 64,211, 0,195, 1, 58,173, 22, 28, 7,112, 28, 96, 52,232,161,213,106,203,254,211,148, 33, 89, 87, 87, 87,111, 11, 11, +139,229,243,230,205,245,111,209,162, 37,178,178,178,192,178, 44, 44, 45, 45,161, 86,171, 97, 99, 99,131,246,237,219,191, 88,190, +124,185,130,227, 48,201, 76,145,245,218, 40,189,231, 23, 47, 94,172, 48,108, 88,186,169, 20, 41, 24,255,197, 94,136, 5,197, 67, + 75,165, 62, 60,213,189,119,187,117,238,128, 91, 15, 99,233, 79,231,174,215, 9,115, 66, 87,186,178,236,174,148,215,200, 23,199, +113,200,206,206, 70, 70, 70, 6, 6, 13, 30,140,253,251,246, 33, 33, 33, 1, 77,154, 52, 65,183,110,221,224,236,236,140,132,132, + 4,220,187,174,131, 46, 47, 23,185,250, 80,200,172,219,225,196,213, 56,221,146, 45,134,184,127,240,133, 49, 8,192, 88, 27, 27, +155,122,106,181, 90, 65,211,244, 97, 0,135, 1, 12, 23, 8, 4,195,101, 50,153,155, 82,169,124,142,226,217, 68, 39,107, 34,179, +144, 74, 29, 37, 82, 27,176,180, 14, 2,129, 0, 94, 94,117,193, 49,122,228, 41, 53, 24, 55,114, 32, 30, 62,137,194,249, 43,119, +104,163,145,221, 96,202,109,165, 40,138,243,243,243, 67,102,102, 38,132, 66, 33, 44, 44, 44, 96,101,101,133, 5, 11, 22, 96,227, +198,141,101, 34,171,182, 66,235, 19,192,207,198,219,234,206,247,155,138, 69, 86,122,154, 2, 25, 41, 66,200, 29, 93,176, 97,227, + 58, 85, 94, 66,122,187,223,128,216,255,122, 35,203,178,236, 55,169,169,169,206, 2,129,192,149,166,105, 36, 39, 39,227,193,131, + 7,152, 62,125,122, 70, 78, 78, 78, 87,212, 50,143, 82,169, 52,179,212,146, 85, 50,116, 88,213,112, 98,126, 57, 75, 86,126, 53, +148, 85, 13, 19,250,214,245,180,190,180,227,231, 89,222,109,218,181, 39,101, 2,155,188,162,103,233, 29,111, 92,187,218,126,250, +207,191,126,150,152, 87,212, 27, 64,124, 85,164, 18,161,176,223,187, 29, 58, 8,192,101, 64, 32,238,136,213,171, 70, 34, 43, 91, +137,188,220, 66,136, 68,150,208, 27, 41, 48, 44,129,246, 29, 59,225,247,221, 7,209,116,226, 4, 74, 44, 20,246,162,245,250,183, + 70,104,149, 96,197, 47,191,252,226,221,168, 81, 35,236,218,181, 11, 87,246,236,193,199, 5, 5,184, 74,146,148, 81, 40,116, 58, +107, 52,110, 71, 13, 66,171, 60, 79,211,166, 77,241,219,111,191,225,143, 63,254, 72, 26,221, 35,243,232,172,209,112, 54, 24,208, + 55, 52, 6, 14,117, 6, 2,161, 49,112,120,167, 17, 26,208, 2, 60, 35,136,138,225,160,130,130,130,186,148,223,255,199,160, 64, + 21, 67,236, 2, 0, 93,131,130,130,184,242,251, 26, 95,156,242,134, 83, 86,244,174,231, 19, 80,223,155, 48, 30, 90,143,100, 21, +173, 95, 20, 99, 16, 63, 45,226,102, 69, 1,235,170,233, 65,112, 20, 69,193,218,194, 2,114, 59,187, 98, 51, 63, 73, 2, 44,192, + 26, 1,130, 41, 22, 0, 28, 75,128, 99,204,122, 97, 64, 44, 22, 87,234,248,110,174,111, 86,121,206,194,194, 66,188,120,241, 2, +147, 38, 77,130, 76, 38, 43, 86,238,233,233,240,241,241,129, 64, 32, 64,106,106, 42,254,252,243, 79,212,171, 87, 15, 18,137,196, + 44,181, 85,206,186,212, 28,197,179, 12,155, 43, 20, 10, 27, 55, 55, 55,152,109,209, 98, 57,168,117, 4,244,122, 6, 79,159, 62, + 69, 90, 90, 26, 94, 60,127,134, 54, 42, 37, 56, 80,224, 56,206, 44,139,150,135,135, 71,128,175,175,239,214,149, 43, 87,138, 60, + 61, 61,193,113, 28,236,237,237,160, 86,171,145,157,157,131, 38, 77,154,192,203,203, 11, 43, 87,174, 4,128,253,127,183,200,122, +169, 78,149, 9,173,242,130,235,139,247,189,145,155,107, 5,138, 34,203,132,115, 13, 62, 90, 34, 0,232,218,123,168,224,210,249, +179,150, 52,176, 60,157,162,150, 11,106, 46, 71, 35,195,178,178,170,126, 79, 78, 78,134, 80, 40,196,145,195,135,145,155,145,129, + 22, 45, 90,160,109,219,182,120,246,236, 25, 30, 62,124, 8, 71, 71, 71,200, 61,223,195,213,231, 6, 68,166,105, 96,107,107,139, +184, 20,242,159, 12, 25, 48,177,103,207,158, 75,126,250,233, 39,103, 87, 87, 87, 97, 86, 86, 86,163, 77,155, 54,181,216,180,105, +211,140,207, 62,251,204,229,179,207, 62,179,151,203,229,130,244,244,116,191, 47,191,252,242,157,224,224,224,122, 0,214, 86, 71, +104,105,105,237, 64,137, 44, 65, 16, 2,216,217,218, 67, 32,182, 4, 75, 11,192,176,128,141,173, 28,183, 30, 30,193,205,176,194, +201,153, 57, 56,108,146,125,172,164,220, 29, 29, 29, 95,177, 84, 79,159, 62, 29, 59,118,236, 40, 27, 70,172,173,200,250, 97, 83, + 15, 43,162, 68,100,165, 39, 11, 64,232,234,225,244,241,219,249,121, 9,233, 29,223, 6,145, 85,250,142,227, 56, 14,207,159, 63, +135, 90,173,198,245,235,215,241,205, 55,223,100,189, 44,178,156,157,157, 39,218,216,216, 44, 43, 42, 42, 90,157,158,158,190,190, +198,142, 95,177,136, 42,253, 92,186,175,116, 56,209,196,164,250, 84,102,201,242,114,147, 94,120,120,125,175,143, 45,247,152, 64, +226, 36,224,169, 50,194,250,174,115,231,254,109, 6,144,173, 54,127, 91,167,237,228, 5, 23,146,149,218, 70, 85, 89,182, 88,134, +105,101,105,101, 13, 32, 19,161, 15, 66,202, 68, 86, 78,110, 1,116, 6, 10, 58, 61, 1,173,129, 68,247,158,125,177,113,235, 31, + 72,205,204, 5,195, 48,205,222, 50,145,229, 16, 16, 16, 48,101,248,240,225, 88,190,124, 57,130,127,250, 73, 63,149, 32,148, 2, +128, 59,195, 48, 96, 57,142, 32, 77,115, 98,175,192,179,102,205,154,227, 0, 70,173,156,142,247,242,138, 48,206,125, 32,231, 80, +103, 96,241,137,195,230,113, 0,224,144, 21, 92,177,201, 12, 12, 12, 36, 74, 71,214,204, 29, 97,251,183, 67, 16, 24, 24,120, 53, + 40, 40, 8,229,247,213, 93, 96,237,210,168,255, 87,179,167,173,106,211,167, 19,161,152,221, 11,185, 74, 45,253,117,164, 65,156, +162,169, 94,100,149,199, 87,155, 54,225, 97,108,241,115,236,233,236,140,185, 31,125, 4,142, 6,110, 70, 68,226, 96,112, 48, 70, +246,236, 9, 75,169,212,100,203, 6,203,178,149, 90,177,202, 91,179,204,181, 58,229,231,231,227,240,225,195,104,219,182, 45,100, + 50, 25, 4, 2, 1,154, 55,111,142,168,168, 40,248,250,250,130, 32, 8,156, 56,113, 2, 67,134, 12, 65,124,124, 60,222,123,239, + 61,171,196,196, 68,179,133, 86,100,100,164, 13,199,113,157, 75,173, 31,181,133, 78,167, 67,116,116, 52, 6, 14, 28, 8,123,123, +123,120,120,236, 71,240,133,189,144, 5,124, 12,130,128, 89, 66,139, 97,152, 79, 6, 12, 24, 32, 34, 8, 2, 26,141, 26, 82,169, + 5, 44, 45,173, 96,109,109, 3, 63,191, 70, 72, 75, 75, 67,159, 62,125,244,113,113,113,155, 21, 10,197, 33,115,211,234,239,239, +111,153,144,144,240,113,157, 58,117,196, 0, 96, 97, 97,209,196,215,215,119, 78,124,124,124,161,185, 86,173, 82,129, 69, 16, 4, + 40,138, 42, 19, 90, 2,146,132,155,171,115,217,247, 18,255, 52,162, 26, 46,101,106,142, 78, 2, 0,222,222,222,216,184,237, 20, + 57, 96,192, 0,204,152, 49, 3, 70,163, 17,155, 55, 23, 79,178,251,240,195, 15, 97, 48, 24,112,244,104,241, 36, 73,129, 64, 80, +173,217,228,193,131, 7, 8, 13, 13,133,209,104, 68, 65, 65, 1,206,157, 59,135,171,215,174,225,192,137,203, 72,120,254, 12,205, + 27,249, 96,194,132, 79, 32, 20, 10,177,123,247,110,116,236,216,241, 31,125, 33, 8,133,194,209, 59,118,236,112,219,181,107, 87, +254,137, 19, 39, 84,239,190,251,174,100,221,186,117,206, 27, 55,110,148,235,245,122,204,156, 57, 51,243,206,157, 59,186,193,131, + 7, 91,110,223,190,221,173,126,253,250,189,104,154,174, 76,104, 89, 2, 24, 9, 96, 76, 94,161, 94,144, 95,168, 1, 75,235,241, + 60,225, 5, 10,138,244, 96, 25, 3,146, 82,210, 80,164,101,144,147, 91,136,230,173,122,255, 18, 18, 18,178,208, 96, 48,124, 13, + 32,168,166,116, 70, 68, 68,224,206,157, 59, 72, 72, 72,192,243,231,207, 43, 42,197,137, 19,241,199, 31,127,152,109,209,170, 92, +100, 81, 32,116,190, 8, 58,113, 55, 63,243,153,226,173, 17, 89, 37,239,160,165,110,110,110, 75,221,220,220,164, 23, 47, 94,180, +173, 83,167, 14,104,154,214,191,108,201,234,218,181,235,162, 29, 59,118,184,249,250,250, 78, 7,176,254,223,144,118,146,196,196, +213, 91,166, 56, 89,139,147,210,240,116,109, 73, 44, 65, 10, 80, 43,129,144,125, 16,116, 88,252, 98,250,224,121,246,243,119, 45, +159,200,130,173,114,134,108, 92,124, 50,182,108,217,136, 89, 51,199,225,247, 95, 87,131,101, 5,208, 25, 41,120,215,125, 23, 58, + 3, 11,130, 20,160, 69,171,214,184, 18,114, 29, 66, 18, 56,188,107,203, 91,166,179,144, 27, 30, 30,190,249,196,137, 19,159,207, +152, 49, 3, 44,203,138,151,109,217,162,201,202,202, 90, 1,243,226, 95,189,204, 51,100,203,150, 45,177,243, 55,102, 29,159, 53, + 26, 84,194,105, 34, 55, 52, 6, 14,195,230,113, 56,178,138,192, 59,141,144, 43,171,188,137,191,246,210,254,237, 16, 90,165, 74, +178,252,190, 50,180,106, 88,239, 91, 91, 7,251, 79, 72,107, 15,167,185, 51,166, 10,226,211,181, 56, 90,231,163,162, 63,247,108, +176, 76,167, 37,191,196, 65,187,206,156, 63, 62,248,231,159,101,159,127,220,191,191,210,223, 20,195,134,153,220, 51,171,202,138, +101,174, 37, 11, 0,100, 50,153, 93,175, 94,189,208,163, 71, 15,124,240,193, 7,101, 62, 89, 45, 91,182,196,129, 3, 7, 48,116, +232, 80, 60,122,244, 8,110,110,110,104,220,184, 49, 26, 55,110,140,179,103,207,154,251,146, 3,195, 48, 8, 8, 8, 40,157,117, +216, 60, 37, 37,197,166,182, 5,169,211,233,144,147,147, 3, 7, 7, 7,136,197, 98,180,107,215, 22,159,127,209, 14, 78,110,191, + 33,192,191, 17, 84, 42, 85,217,244,119, 19, 26,219,128, 6, 13, 26, 32, 43, 43, 11, 89, 89, 89,144,203,229,112,119,119,135,171, +171, 43,214,174, 93,203,173, 95,191,254,188,193, 96,216,156,157,157,109,182, 37,203,213,213,181, 19, 65, 16,139, 52, 26,141,184, + 92, 15, 87, 44,151,203, 79,106, 52,154, 21, 10,133,194,100, 71, 80,130, 32, 96, 48, 24, 64, 16, 4,206, 60,119,135, 74, 79, 64, +153, 18,138, 25,239,251, 84, 16, 94, 66,161,176,198,225, 82,142,227, 84,163, 70,141,114,246,242,242, 68,114, 92, 4,142, 28,225, +240,211, 79, 63,149,206,138, 68,108, 73,199,160,244,123,183,110,221, 80,183,110, 93,112,102,196,202, 96, 89, 22, 79,158, 60,193, +254,147, 87,225,230,227,143,164,167,209,120,120,246, 52,234,200, 29,208,180, 85,107, 24,141,198,215, 10,189,241, 38, 96, 52, 26, +119, 54,108,216,144,211,235,245, 87, 1,108, 12, 11, 11, 27,167, 80, 40,102,158, 58,117,202,125,248,240,225,105,167, 79,159, 94, + 7, 96, 87, 88, 88,216,148,239,190,251,174, 7, 77,211,149,206, 22,164, 40,234,247, 47,191,252,178,235,240,225,195, 9, 17,105, +212, 95,188,176, 91, 64,211, 70,226,171,175,119, 50, 33, 55,174,146, 52,109, 36, 62, 24,245, 37,123,246,207, 48,114,242, 23, 63, + 50, 45,223, 29,128,240,240,112,215,192,192,192,239,140, 70, 99,181, 66,171,212, 82, 85,149,133,146,162, 40,140, 27, 55, 14, 7, + 14,152,238, 65, 53, 1,240,181,241,177,186,243,195,166,158, 86,132,160,168,156,200,170,143,160, 19,119,243, 51,158,166,189, 85, + 34, 11, 0,114,114,114,182, 1,216,198,178,108,134,165,165, 37, 10, 11, 11, 43,171,127,210,176,176, 48,169, 88, 44, 70,239,222, +189, 29,130,131,131, 99, 73,146, 92,159,150,150, 86,165,226,168,108,152,176,178,225, 68,188,198,172, 67,123, 57, 2,219,117,106, +101, 29, 99,187,220, 90, 42,208, 62,170, 19, 43,181, 33, 0, 20,232, 92,158,223, 74, 28,169, 36, 50, 37, 45, 91,119,123, 7, 54, + 2,203,192,124,186,176, 82,161, 69, 82,212,195,130,188,252,126,202, 66, 61,110,220, 12,199,168,145, 13,160, 51, 16, 96, 89, 18, + 69, 42, 29, 64, 9, 65, 2,248,240,163,177,224, 8, 1,114, 51,210, 64, 81, 84, 24,104, 26,111, 25, 22, 76,153, 50,165,223,215, + 95,127, 93,111,238,220,185,152, 59,119,174,207,142, 29, 59,182,253,240,195, 15,115,179,178,178,154,161,134,224,227,213,240,212, + 57,125, 96,241,236,147,215,183, 22, 12,104,175,121,250, 78,163, 98,203,215, 59,141,144, 43, 20,226,153,128, 66, 14,199, 85,116, + 51, 10, 12, 12,236, 82,126,255, 31,195,203, 78,240,101,223, 77,242,209,106, 80,207,163,111,171,150, 1, 95, 44,252,122,161,117, +212,173, 16,204,255,118, 35,215,176,117,175,194,109,215, 31,234,139, 44,235,246, 43,202,126,118,211, 84,125, 1, 0,125,187, 15, + 69,243, 38,109, 95,249,177, 99,183,226, 96,237, 55,174, 60, 64, 70, 86,170,201,141,109,137, 56,168,212, 39,203,148, 41,253, 47, + 67,163,209,228,135,135,135, 59,167,164,164, 84,112,124,175, 91,183, 46, 8,130,192,221,187,119,113,231,206, 29,140, 26, 53, 10, + 2,129, 0, 66,161, 16, 87,175, 94, 53,203, 26, 83,206,186,244, 4,197,179, 14,251,120,122,122, 86, 53,219,176, 70, 46,141, 70, +131,130,130, 2, 92,184,112, 1, 13, 26, 52,192, 15, 63,252, 0,119, 55, 23, 44, 92, 56, 27, 44,203, 66,169, 84,130, 97, 24, 83, + 45, 90,108,169,181,136,101, 89,100,101,101,161, 94,189,122,216,180,105, 19,214,173, 91,247,157, 66,161, 56,101,110, 26,189,188, +188,236, 24,134,249,106,192,128, 1,189, 6, 15, 30,140, 62,125, 42,198, 99,221,183,111,159,245,209,163, 71, 87,108,216,176,161, +175,193, 96, 88,153,153,153,153,101, 10,239,111,191, 21,135, 95,146,189,187, 20,243,135,215,193,152,105,187,177,118,237, 49, 72, + 36,146, 10, 13,239,242,229,203,171, 21, 49, 44,199, 53, 20,101,223, 74,155, 61,111,141,243,138, 21,193, 8, 14,206, 4, 73,146, +112,115,115, 3, 73,146,120,241,226, 5, 72,146,132,143,143, 15, 72,146, 68,106,106,106,169, 79, 96, 30, 42,153,245, 88,121, 47, +156,132, 86,171, 69,114, 82, 2, 82,226, 98, 97,165, 76,135,220, 70,134,188,136, 39,104, 62, 97, 98, 89,252,167,127, 24,127,232, +245,250, 63,202,125, 95,115,250,244,105, 61, 65, 16, 31,160,216, 79,163,212,162,241, 29, 77,211,223, 85, 69,242,238,187,239,182, +252,250,235,175,133,165,225, 54,220,189,191,167, 13, 6, 3, 11, 0,141,154,119,174,160,246,159, 61,123,134,181,107,215, 66,165, + 82, 65, 36, 18,137, 76,185, 15, 44,203,150,205, 48,172, 76,132,153, 35,178, 0,192,209,199,243,151,187,161, 87,153,199,113, 91, + 53, 97, 49,231, 44, 20, 73, 36, 72,253,219, 43,178, 94,182,108,121,122,122, 46,101, 89,150,227, 56,110,113,185,159, 36,222,222, +222,215, 47, 94,188,232, 72,211, 52, 54,108,216, 96,151,158,158,110,215,185,115,231,249, 0,170, 20, 90,149, 13, 19, 86, 54,156, +136,114,179, 14, 37, 18,137,131, 94, 95,165,241,228,149, 89,135, 12, 3, 63, 27,107, 59,228, 33, 5, 58, 39, 99,203,124, 71, 58, +247,146, 98,226, 35,247,196, 86, 77, 44, 25, 99, 61, 82,169,135,135,204, 14, 44,199, 85, 57, 53, 90,103, 52,158,123, 20,250,176, +183,183, 87, 3,234, 84,208, 53, 12, 26, 50, 28, 58, 29, 9,173,145, 0, 65, 9, 65, 80, 34, 52,107,222, 10,141,155, 54, 7, 7, +224,193,189, 91,180,222,104,188,244, 54,149,189, 91,135,207, 71, 17, 4,214,131, 99,185, 74,226,104,213, 27, 50,100,200, 10, 0, + 95,212,196,227,252,238,231,163, 72,178,152,167,124, 28,173, 47, 63,159,130,136,123, 66,219,107,161,171, 68,125,222,197,153,172, + 96, 2, 50,233,255,102, 29, 10,201,215, 10,205,241, 95, 17, 92, 53, 11, 45, 47, 47, 47, 59, 27,137,244,183,207, 38,124, 98,157, +248,248, 54,210, 35,239,226,230,181,216,188,131, 71,143,229,170,114, 50, 39,152, 33,178,202,134,249, 28, 93,235,160,174,255,171, + 66, 75,106, 37, 7, 0,212,245,111, 11,202,210,214,220, 33,143, 87,172, 89,181, 17, 89,229, 95,216,149,197,208,154, 60,121, 50, +118,236,216,129, 14, 29, 58,160, 97,195,134,101, 47,123,115,173,102,149, 88,151,204,158,109, 88, 30,133,133,133,240,241,241,193, +246,237,219, 17, 22, 22, 6,107,107,107,140, 26, 53, 10,133,133,133,101, 2,203, 84,103,120,142,227,158, 93,188,120,177,205,136, + 17, 35, 56,161, 80, 72,228,231,231,195,206,206, 14,155, 54,109, 82, 41, 20,138, 51,181, 16, 89,195, 69, 34,209,236,145, 35, 71, + 82,141, 26, 53, 66, 70, 70, 6,108,108,108,140, 4, 65, 8, 1,192,206,206,206,104, 97, 97,129, 41, 83,166,160, 69,139, 22,157, +230,206,157,219, 65, 32, 16,108, 74, 75, 75,219, 93, 93, 93, 34, 8,162,172, 65,157,176, 62, 26,122,125,113, 3,189,121,243,102, +148,248,186,253,111,136, 32, 46, 14, 48, 97, 38,139,149,149, 21, 26, 54,108, 88,105,217,119,234,212, 9, 15, 30, 60, 40, 30,154, + 20, 8,224,236,236,140,155, 55,111,154, 52,147,170, 52, 16,100,120,120, 56,252,235, 58, 33, 44,248, 34,156,100, 66,180,112,119, +133,103,167, 46,136,141,141,253, 39,173, 89, 4,138,253, 48,122,150,212,193,157, 0, 38,151,251,190, 9,192, 47,230, 16,210, 52, +205,145, 36, 73, 36, 39, 39, 27,100, 50, 25,225,224,224, 32,144, 72, 36,208,233,116,101,130,235,217,179,103, 8, 10, 10, 66, 74, + 74, 10, 28, 28, 28, 72, 91, 91, 91, 24, 12,134, 60, 83,248,253,252,252,224,234,234, 90,193,241,125,194,132, 9,181, 18, 89,227, +128,128, 29,223,175,172, 35, 33, 41, 91,127,167,190,120, 30,253, 66, 75,234, 33,253,255, 32,178, 0, 32, 63, 63,127, 27,128,109, +165,223,157,156,156,198, 83, 20,181, 80,167,211,217, 94,189,122,213, 78, 46,151, 19,187,119,239, 54, 46, 94,188, 56,159,162,168, + 60,130, 32,126,254,231,197, 33, 34,179, 11,226,124,132,246,238,236, 99, 45,119,107,102,242,252,198,121,194, 6,114,162,105, 0, +134,100, 70,221, 24, 79,199,181,207, 80,164,147, 28,216,200,106,222,193, 59,231,127,189,252,171,216,232,135,222, 82, 27, 41, 38, + 79,249, 26,103,206, 95, 1, 65, 10,113,253,214, 93,232, 13, 12,178,115, 11, 48,242,195,209,240,116,115, 66,228,157, 11, 89, 52, +203,110,122,187, 68, 54,187,177,247,160,241,246, 18, 11, 89,201, 61, 97,240,199,175,179, 65,146,235,177,100,201, 18, 4, 4, 4, + 76, 11, 15, 15,255, 6, 53,196,209, 34, 8,118, 99,179, 46, 31,218,139, 36,197, 60, 28,203, 96,251,225,249, 37,113,180,102, 97, +211,182,163,205,154,214,125,190,172,186, 56, 90,111,145,200, 42,191,175, 94,104,249,248,248, 72, 44,133,152, 36,164, 4,115, 63, +251,104,176, 60, 51, 46, 2, 41, 81, 15,139,135, 23, 12, 26, 67,250,211, 40, 83, 66,161,247, 68,197,248, 29, 92,117, 67, 87, 90, +173, 73, 61,250, 10,156,165, 13,238,203,214, 44, 51, 69,214, 43,156,229,197, 86,249,184, 89, 94, 94, 94, 88,177, 98,133, 41,113, +180, 94,206,123, 41,250,160,216, 1,190,188, 51,124, 31, 19, 69, 86,165,156,114,185, 28, 57, 57,197, 17, 18,186,118,237,138,174, + 93,255, 55,159,193, 96, 48,148, 89,177,172,173,173, 43,179,104,189,194,105, 97, 97, 49,255,216,177, 99,159,220,186,117,107,196, +156, 57,115,132, 61,122,244, 40, 21,115,106,152,182,182, 91, 5, 78,134, 97,166, 92,184,112,129, 98, 89, 22,219,183,111,199,131, + 7, 15, 56,153, 76,182, 72, 38,147,109,180,176,176, 96, 52, 26,205,228,137, 19, 39,142, 94,182,108, 25,217,169, 83, 39,220,190, +125,155,172, 87,175,222, 88,160, 66, 16,203, 74,243,126,247,238, 93,144, 36, 9, 58, 55, 9,211,230, 31,132,165,133, 0,209,209, +209,200,205,205,125, 37,136,169, 41,247,179,188,165,164,116,235,212,169, 83,217, 48,100,187,118,237, 64, 81, 20, 30, 61,122, 84, +213, 48,108,121, 78,206,209,209,177,172,126,136, 68, 34, 92,185,114, 5,223,126,251, 45,188, 29,236,144, 23, 21, 6,215,174,221, +209,235,147,137, 24, 53,106, 20, 40,138,130,131,131, 67,153,229,215,132,186,244, 58, 40,207,249,137,191,191,255,216,200,200, 72, +207,102,205,154,185,133,135,135,119, 11, 8, 8,240, 9, 11, 11, 43,253, 46,129,105,190, 57,101,156,247,239,223, 63,178,113,227, +198, 41,227,198,141, 19,177, 44,203, 36, 38, 38, 26, 1, 16,174,174,174,212,253,251,247,217, 83,167, 78, 65,163,209,192,211,211, +147,244,240,240, 32, 46, 93,186,196, 70, 69, 69,221,229, 56,238,107, 83,242,206, 48, 76,133, 48, 14,165,159,247,237,219,103,246, +243, 94,167,177,223, 15, 61, 58, 55,242,202, 78,123, 4, 69,106, 28,152, 2,185, 33,232,196,105,157,153, 34,235,175, 46,163,191, +147,115,249,211,167, 79, 61,116, 58, 29,196, 98, 49, 54,111,222,108, 88,177, 98, 69,100,118,118,118, 71, 84, 62,163,188, 2,103, + 45,103, 29,230, 86,195,249,202,172,195,130, 28,156, 57,113,242,126, 27,171, 33, 59, 49, 45, 45,171,204,177,145, 35, 8,135, 99, + 46, 77, 58,202,218, 54, 75, 37,207, 46, 37, 11, 25,245,153,106,242,174,215,232,245,195,135, 12,253,240,242,129, 3,251,173, 22, + 47, 93,138,155,119,195,144,147, 95, 4,150,163,192, 18, 4, 22, 46, 92, 12, 87, 39, 7, 40,211,158,170,117, 6,195, 16, 84,140, +161,245,159, 47,119,130, 32,167, 95, 58,181,123, 61, 73,128, 85,101,196, 72,168,194, 56,217,152, 81, 67, 4,195,135, 15,199,177, + 99,199, 16, 30, 30,190,181, 26,145, 85,198,201,113,228,244,176,171, 7,215, 19, 0,171,201,138,145, 8,138,158,203,198,126, 52, + 68, 48,106,212, 40, 28, 15,186,133, 3,167,159,111, 57,112, 26,167,241,118,195,252,200,240,214, 2,132,119,108,226,235,209,169, + 85, 83,169,128,209, 32, 37, 42, 14,185, 42, 45, 46, 69, 36,230,147, 28, 89,235,216, 58,197, 47, 72, 17,146,146,158, 86,210,179, +146,150, 52,232, 90,179, 56, 73,146,172, 96,205,122, 29, 75, 86,249,116,186,184,184, 84, 88,206,165,124,195, 93,234, 3, 84,139, +208, 14,243,147,146,146,108,146,146,146,192,113, 28,238,222,189,107,211,174, 93,187,249,175, 99,205,154, 61,123,118,153,213,234, +229,125,101,199,106, 66,137, 83,250, 58,163,209,120,120,238,220,185,211,218,181,107,215,123,233,210,165, 4,204, 88,128,247, 37, +107, 14,205,178, 44, 66, 66, 66,112,236,216, 49,198, 96, 48, 76, 82, 40, 20, 97,229, 78,217, 16, 26, 26,122,105,232,208,161,187, + 99, 98, 98,168,200,200, 72,112, 92,205,243, 78, 53, 26, 13, 26, 54,108, 8,154,166,177,106,154, 23, 10, 11,155,129,166,105, 48, + 12, 3, 75, 75,203, 50, 43, 94,121,241, 92, 83, 61, 98, 24,230, 21,161,117,247,238, 93, 80, 20,133,142, 29, 59,226,225,195,135, +101, 22,173,154, 44, 80, 6,131, 33,201,197,197,197,101,249,242,229,101,233,202,202,202,194,197,139, 23,241,238,123,237,209,100, +210,100,164,165,165,225,231,159,127,134,187,187, 59,126,248,225, 7,228,230,230,130,166,233,191,219,156,222, 47, 50, 50,210,243, +163,143, 62,202, 12, 11, 11,243, 12, 10, 10,178, 11, 12, 12,180,252,240,195, 15, 51,195,194,194, 60, 9,130,104, 15, 51,157,160, + 89,150, 93,176,112,225,194,243, 63,252,240,195,252, 47,190,248,162,221,184,113,227,132, 66,161,144, 77, 77, 77,165,247,239,223, + 79, 52,108,216,144, 20,137, 68,196,133, 11, 23,216,123,247,238,221,161,105,122, 21,128,235,230, 88,156,203,139, 44,138,162, 76, + 21, 89, 21, 48,211, 89, 50,214,154,204,234,184,113,243, 10,178, 81, 93, 79,195,158,253, 23,147,175,223,126, 26, 79,233,232,153, +191, 85, 19, 26,224,109, 6, 69, 81,135,252,253,253,199, 79,159, 62,221,162, 79,159, 62,146,101,203,150, 21, 20, 22, 22, 86, 37, +178, 42,233, 48,255, 45,179, 14,127, 93, 48, 39,104,230,151,205,198,251,126,234, 90, 7,193,170, 76,228, 9, 40,210,198,142, 68, + 43, 31, 10,133,217,207,228,167, 47,239,122, 1,160,166,184,108,247, 67,159,132,247,108,218,172,229,209, 85, 63,172,114, 94, 52, +111,174,240,104,208, 57,112,180, 1,119,175, 94,133,149,136,225,162, 66,131, 51,116, 6,253, 96,188,133, 75,240, 40,110,254,114, + 0,192, 73, 7, 7,135,199,159,140, 27,215,208,223,255, 67,200,100, 50, 28, 57,114, 4,127,108,216,192,172, 3, 70, 72,128,135, + 83,106,136,167,151,121,167,140,231,209,196, 79, 62,241,107,213,234, 83,200,100, 50, 28, 62,124, 24,187,215,173, 51,153,231, 63, +142,210,200,240,103,240,191, 8,241, 53,248,104,145, 68,225,157,167,137, 69,119,159, 38, 22,129,229, 56,150,227,116, 36,137,100, +149,193,240,195,211,231,169,181, 18, 5,165, 67,135,223,125, 63,253,205,141,121,148, 19, 63,181,157,210, 93,137,200, 74, 41,191, + 70, 90,249, 70,186,170,207, 70,163, 49,197, 68,250,149,222,222,222,175, 28,171,189,233,151, 51, 75,100,153, 26, 71, 11, 0,114, +114,114, 20, 0, 22,221,190,125,123, 95,239,222,189, 39, 2, 72,173,101, 25,109,239,210,165,203, 36, 0, 20, 65, 16, 91,211,210, +210,194, 94,121,224, 21,138, 88,119,119,247, 31,235,214,173, 59,185,184, 99, 74,108,175,161, 33,127,222,172, 89, 51, 67,101,101, + 81,213,119,150,101,107, 44,163,252,252,124,180,109,219,246,149, 53, 45, 57,142, 67, 98, 98, 98,169,197,169,236,222, 87, 39,224, +138,138,138, 38,127,254,249,231,219,132, 66,161, 55, 0,162, 84,228, 50, 12, 67,253,242,203, 47, 82,134, 97, 40, 0, 4, 73,146, +180, 80, 40,212, 30, 59,118,140,166,105, 58, 73,167,211, 77,254,155, 95, 16,135,137,226,165, 24, 84,145,145,145,141, 74, 44, 89, + 41,225,225,225,143, 14, 28, 56, 32, 7,112,176,150,188,215,213,106,245,245, 21, 43, 86,116,218,188,121,243,130,201,147, 39,183, + 29, 53,106,148,160,107,215,174, 56,115,230, 12, 19, 18, 18,114, 87,163,209,172, 52, 71, 96,149,148,101,129,151,151, 87,153,224, +170,225, 89,174,214,145,215,209, 71,178,113,244, 84,119,233,246,149, 23,139,178,211,244,183,140, 69,250,175,119, 1,225,248,127, +140,140,140,140, 57, 0, 22,255,252,243,207,105, 45, 90,180,144,136, 68, 34,189,169, 34,235,111, 4,205,230, 23,245,255,169,215, +176,147, 93, 22,126, 94,183, 87,183,142, 50,175, 58,206, 30, 81,113, 25,120,118,251,140,234,241,233,239, 19, 56, 93,222, 32, 0, +166,120,174,223,211, 25, 12, 13,102,207,157, 61, 77, 44, 20,246,102, 24,166,121,143, 75, 39, 56,138,162,194,244, 70,227,165,146, +225, 66,237, 91, 92,228,223,253,248,227,143, 13,253,253,253,113,228,200, 17, 92,218,187, 23, 35,179,179,113,133,162, 40, 82, 36, +114, 60,109, 48,172,129,105, 2,233,187,181,107,215,250, 5, 4, 4,224,208,161, 67,184,176,123, 55, 70,212,142,167,170,182,174, + 13, 0,121,201,215,108, 0, 49, 0,222, 1, 96, 1, 64,135,226,165,157,156,202, 55, 97, 37,191,149,254,126,141, 32,136,191,210, + 17,182,230,200,240, 47, 35,252, 89,194, 59,111, 58, 21, 26,141, 38,183, 97,195,134,102,205,185, 54, 26,141,213,142,225,210, 52, +157,226,235,235,107,178,213,194, 20, 81,148,155,155,219,250, 47, 44,140,215,242,197,170,208,136,176,108,130,155,155, 27, 91,218, +232, 87, 38,194, 42, 59,198, 1, 47,204,249,159,244,244,244, 24, 0, 95,214, 54,157,105,105,105, 71, 97,194,162,209,166,158, 7, + 0,121,121,121,111,124, 49, 95,130,227, 82,151, 45, 91,102,150,192, 6,199, 85, 39, 62,195,138,138,138,218,153,242,223, 6,131, + 1,255, 32, 14,149,108,100,120,120,248, 68,130, 32,250,160,120, 72, 96, 43,222, 76, 52,239,235, 74,165,242,250,234,213,171, 59, +109,223,190,125, 38,199,113, 80, 42,149,235,204, 21, 88,101,189,231,204,204, 51,111, 42,227,185, 25,250, 63,247,111, 77,233,174, +201, 55,204,220, 81,164,223, 13, 30,101,198, 40,142,227,126, 31, 51,102,204,187, 0,118,189, 46, 89, 21,179, 14, 95, 23, 47,216, +188,130, 22, 87,102,127,251,201, 21, 59,235, 1, 96, 4,141,160, 39, 79, 67,159,115, 6,192,111, 48,205,205,161, 44,191, 52,203, +174,165,245,250,181,229, 26,151,255, 15,229,236, 16, 16, 16, 48,115,252,248,241, 88,188,120, 49, 46,172, 89, 99,152, 74, 16, 5, + 66,128, 59, 95,220,209, 36, 9, 96,158,169, 60, 99,199,142,197,226,197,139,113,118,213,170,218,242, 84, 7, 57, 65, 16, 65, 0, + 48,127,254,252,175, 87,172, 88, 97,191, 96,193,130,230, 43, 87,174,252,161,228,123, 68,233,239, 37,109, 93,224,130, 5, 11,154, +150,251,189, 16,192,253,191,248,126, 86, 26, 25,254,175, 70, 79,158,147,231,228, 57,121, 78,158,147,231,228, 57,121,206,215, 1, +199,113, 3,138,119, 85,239,171,250, 92,110,143,191, 57,205,197, 19,161,248,142, 27, 15, 30, 60,120,240,224,193,227,191,136,242, + 86,172,218,252,254, 6, 81,234,163, 85, 30,219,129,226,105,221, 85,169, 82,115,102, 61,212, 70,217, 6,243,156, 60, 39,207,201, +115,242,156, 60, 39,207,249,255,142,179, 38,238, 87,174,231, 56,110, 0, 65, 16, 65, 28,199, 5, 86,181, 47, 21, 86, 47,127, 46, +183,127, 99,110, 7,149,160,212, 55,171,204, 71,235,239, 10,217,195,155, 85,121, 78,158,147,231,228, 57,121, 78,158,147,231,124, + 45,148, 14, 1, 2,224,230,207,159,191,224, 95, 56,116,232, 86, 34,178,202,182, 26,135, 14, 57,238, 48,149,154, 10, 27,177, 88, + 38, 2, 0,189, 94,109,240,240,128,146, 32,134,255,147, 11,222,242,248,111,162,116,186,119,198, 27, 62,151, 7, 15, 30, 60,120, +252,255, 64, 86,169,165, 10, 64, 22, 0,162,228,187,190,100,159, 85, 34,200, 94,254, 92,225,247,191, 16, 10, 84,225,252, 46,168, + 74,100,101,103,203,156, 4,130, 60, 63,134,209, 54, 6, 0,129,128,140,206,206,182,143,229,184,195,217,181, 17, 91, 78,206,206, +161, 66,138,242, 48,229, 92, 35,195,164,102,103,100, 84, 12, 29, 79, 16,111,131,192, 51, 85, 68,188,142,216,248,203,133,138,147, +147,147,139,139,139,203,251, 54, 54, 54,239,229,231,231,223,203,202,202, 58, 94,205,186,135, 43, 8, 2,115,139,235, 21, 86, 3, + 88, 80, 13,181, 57,231,190,140,134, 50,153,108, 26, 65, 16, 1, 37, 15, 88,184, 90,173,222, 12,224,233,255,195, 23,146, 5,128, +193, 2,129, 96,172,147,147, 83,219,244,244,244,101, 0,106, 27,205, 91, 0, 96,182,157,157,221, 72, 59, 59, 59,223,220,220,220, +120,165, 82,121, 8,192, 90, 0, 53, 78,149, 94,246,133,219,123, 93,251,116, 93, 20,114, 33,228,187,101, 27, 20,183, 95,249,125, +182,155, 99,239, 94, 29, 22,135,156,190,181,252,235, 77,105,185,102,166,141, 44,217,128,226,217,145, 28, 94, 13,246,250,186, 16, + 2, 24, 8,160, 43,128, 16, 0,167, 77,201,119, 21,120, 23,192,215, 37,105, 94, 11,224,202,191,188, 30, 89,186,184,184,172, 2, + 48, 80, 32, 16, 68,166,166,166, 78, 2,144,242, 15,167, 73, 0,160, 13,128, 0, 20,135,225,184, 15,211, 66, 56,212, 8, 71, 71, +199, 64,129, 64, 48,173, 36,180,203,230,156,156,156,160,127,107,193,136,197,226,117,174,174,174,159,106, 52, 26, 53, 65, 16, 92, +249,120,143, 52, 77,167,100,103,103,183,126,219, 94,106, 4, 65,220,255,151, 39,113, 82, 37,199,170,142,163,149,154, 10, 27,129, + 32,207, 47, 51, 61,108,100,154,226,201, 8, 0,112,119,107,126,200,217,181,217,193,212, 84,177,193,181,209, 16, 43,161, 76,176, +153,162,132, 45,181,122,157,147, 80, 32,204, 54,208,198, 71,164,158,155,150, 30,115,188,210, 96,139, 66,138,242, 72,136,189,226, + 76, 27,114, 33,148,186, 67,104,225, 93,101,106,221,221,221,107,149, 75,123,123, 95,107,131, 68, 58, 83, 40,164,122,177, 28, 29, +192,177, 0, 73, 8,195,105,198,120, 89,164,211,253,148,151, 23, 95, 88,219, 59,216,200, 17,174, 28, 48, 10, 4,122,129,195, 37, + 2, 56, 16,147,131,116, 51, 40, 76, 21, 17,175, 35, 54,202, 95,251, 51,128, 57,111,186, 38,121,120,120,216, 7, 6, 6,174,251, +246,219,111, 45,172,172,172,136,164,164,164, 62,243,230,205,235,252,224,193,131, 47, 83, 83, 83,211, 94, 22,125, 4,129,185, 44, +203,145, 0, 64,146,196, 60,185,220, 89, 70, 81,212, 43,177,141, 24,134,145,101,101,101, 78,103, 89,142, 40, 57,119, 46,199, 97, +189, 41,130, 81, 42,149,126, 24,208,172,229,151,171,126, 92,107,229,226,236,108, 73, 51,172,225, 69, 98,130,108,209,252, 57,237, +226,158, 61, 93,175,213,106,247,215,230,185,166, 40,106,164, 68, 34, 9, 4,224, 95,114, 44, 74,167,211, 5, 49, 12,115,208,212, + 6,221,197,197,229, 26, 69, 81,117,204,249, 99,134, 97,146, 50, 50, 50, 58,214,178,136,134,123,123,123,255,214,165, 75, 23, 89, +219,182,109, 33, 22,139,177,120,241,226,217, 10,133,162, 38,161, 37, 0, 48, 91, 38,147,141,180,180,180,244, 45, 42, 42,138,211, +104, 52, 71,197, 98,113,207,245,235,215,123,117,232,208,193, 58, 35, 35,131,160, 40,202,229,236,217,179, 31,175, 91,183,174, 15, + 77,211, 61,106,106,228, 10,226,184, 69,146,129,254,157, 10,226,174, 44, 2,208,239,229,223,105,173,116, 44, 71,121, 5,106,184, +135,201, 37,226,195,100,145, 37, 20, 10,215,187,186,186,142,215, 22,199, 10,224, 94,110,112, 0, 64,175,215,231,229,231,231, 55, +170,205, 35, 15, 96,130,157,157,221,248,175,190,250,202,190, 95,191,126,216,187,119,239,103, 59,118,236,200, 83, 42,149,191,163, + 56, 16,102,140,153,156,115,211,211,211,251, 11,133, 66,194,203,203,139,210,104, 52,230, 8, 45, 63, 20, 47,194,124, 31,192,102, + 20,135, 46,232, 6, 20, 63,239, 0, 86,151, 10, 55,146, 36, 55, 55,106,212,232,253,168,168,168, 45, 0,190,171,237,179,238,234, +234,186,109,211,166, 77, 35, 6, 13, 26, 68,101,101,101,121,180,104,209, 98, 95,122,122,122,167, 55,240, 26,249, 68, 34,145,204, +106,222,188,121,147,152,152,152, 88,165, 82,185,182,228,126, 86,247, 76,121, 2,232,105,103,103,215, 99,225,194,133, 86,129,129, +129,216,190,125,123,255, 29, 59,118, 20, 21, 22, 22, 94, 70,177, 79,207,107,137, 64,129, 64, 48, 45, 37, 37,197,137,227, 56,184, +185,185, 77, 3,240,175, 20, 90, 36, 73,174, 31, 58,116,232,248,125,251,246,201, 18, 18, 18,100, 30, 30, 30,101,193,179, 9,130, +168,117,251,201,227,181,177,189,156,224,170, 57,142,150, 88, 44, 19, 49,140,182,113,154,226,201,136,206, 93,126,177, 5,128,107, + 87, 63, 31,225,236,218, 52, 92, 44,150,197, 74,108,164,199,134, 14,236,217,114, 88, 96, 23,194,211,205, 25, 41,138, 76,151, 95, + 15, 92,232, 27,116,225,202, 49, 20, 7, 16,171, 20,180, 33, 23, 22,134, 96,196,220,216, 0,167,174,105,216,120, 54, 5,183, 31, +191,128,186, 32, 27,117, 92, 45,240,227,204,222,112,181,151,213,174,235,229,220,176, 27, 45,144, 28,252,232,195, 49,182,239, 15, +246, 23,250,184,186,130,227, 36,136,141, 43,106,127,238,226,149, 54, 71, 15,239,159,102, 41,108, 56, 82,149,249,212,228,151, 91, + 43, 55, 88,168, 12, 24, 44,160,136,143, 59,180,110,210,227,195,254,157,200, 38,254, 13, 16, 25, 17,213,251,228,159,119,127, 36, +111, 69, 92,166, 25,110,143,165, 8, 39, 30, 42,170, 13,232,247,138,224,232,209,163,103, 39,137, 68, 82, 33,120,146, 78,167, 19, + 93,190, 28,252,110,109,196, 70,233,127,232,245, 58, 82, 40, 20,131, 36,137, 47, 3, 2,154,249,103,103,103, 95, 33, 8,226,183, +180, 52,243,172, 5,159, 3,226, 60,129,224, 29, 82, 34,113, 99,244,122, 71, 0, 32,196,226,188, 23, 36,217,108,225,215, 95, 91, + 81, 20,197,230,228,228, 64,173, 86, 19, 19, 39, 78,148,198,197,197, 13, 77, 77, 77,221, 80, 67,143, 4, 59,118,236,240,115,115, +115,123,101,245, 88,133, 66, 33, 30, 52,232,253,218, 20,189, 95,243, 22,173,102, 93,184,112,222, 95,153,155,167,221,241,243,182, + 80,163, 84,166,171,231,223, 72,184,121,251,110,219, 73,227, 71,127, 30, 29, 29,241, 8,230,173, 87,231,109, 97, 97,113,108,205, +154, 53, 1,221,186,117, 19, 58, 59, 59, 35, 35, 35, 3, 81, 81, 81, 1,127,254,249,231,224,221,187,119,207,214,104, 52, 67, 1, +147, 22, 68,109,120,121,207,111,206,150, 14,142, 96,140, 70,184, 55,111, 85,230, 32,249,236,207,139,160, 13, 6,176, 70, 35,252, + 3, 7,151, 88,147, 57,248,251,251,215, 54,234,174,123,211,166, 77,255,248,225,135, 31, 68, 58,157, 14,119,239,222,197,149, 43, + 87, 88,133, 66, 81, 83, 64, 92, 1, 65, 16, 23,151, 46, 93,234,217,177, 99, 71,235,236,236,108, 48, 12,227,116,226,196,137,105, + 45, 91,182,180,241,242,242, 18,239,217,179, 7, 69, 69, 69,160,105,218,193,215,215,215,225,195, 15, 63,212,239,217,179,103, 54, +128, 85, 85, 89,178,148,113,220, 34, 5,225,219,183,209, 59, 99,145, 78,156,239, 59,171, 47,206,217,212, 39,202, 44, 91,125,125, +125,173,149,169,178,121, 86, 54,205, 28,148,169,193,243,250,250,250,238, 56, 31,111, 82,103,136, 44,105,108, 62, 58,112,224,128, + 44, 42, 42, 74,230,239,239, 15,150,101,203, 34,240,151, 6,156,109,216,176, 97,109,238,227,202, 41, 83,166,204, 27, 49, 98, 4, +154, 55,111, 94, 22, 20,117,201,146, 37,152, 55,111,158,253,181,107,215,102,239,223,191,127,246,241,227,199, 87, 1,152,111,166, + 53,166, 20,230,150,241, 55,207,159, 63, 31,126,236,216,177,209,115,231,206,109, 8, 96, 58,128,197, 57, 57, 57, 93, 74,172, 49, +226, 18,161,245,201,236,217,179,167,206,159, 63, 31,253,251,247, 95,124,247,238,221,239,107,105,229,163,104,154,238, 63,104,208, + 32,202,104, 52,194,210,210, 18, 70,163,177,254,235, 26, 37, 0,108,154, 60,121,242,212, 41, 83,166,192,222,222, 30, 70,163,209, +239,192,129, 3, 59, 22, 47, 94,252, 30,128, 9, 85,164,117,236,212,169, 83, 63, 24, 51,102, 12, 90,183,110, 13,129,160,248, 54, +174, 89,179, 6,203,151, 47,183,186,120,241,226,224, 61,123,246, 12, 62,121,242,228, 81, 84, 92,182,203, 44,176, 44, 11,129, 64, +128,228,228,100, 56, 59, 59, 75, 88,150,189, 64, 16,196,246,220,220,220,227,255,162,198,124,245,240,225,195, 63,218,183,111,159, + 21, 0,252,248,227,143,152, 53,107, 22, 92, 92, 92, 96,101,101,197, 75,157,127,143, 69,107, 82,141, 22,173,154,160, 86,171, 91, + 45,248,226, 99,144,100,113,175,177, 65, 61,111,172,248,122, 18,113, 50,232, 66,171,106,109,240, 82,119,196,220,216, 0,137,215, + 76,232,140, 52,238, 60,126,142, 75, 63,246, 41,110, 45,251, 45,132,206,208,163,180,177,113, 16, 91, 88,172,214, 51,204, 77,184, +186,222, 69, 98, 98, 86, 77, 34, 75,238,234, 18,180,117,235, 42,139,128,250,141, 96,160,141, 72,205, 76, 5, 65, 72,224,233, 97, +141, 79,198,246, 19,118,233,226,238,244,205, 55,219,206,164,179, 24,162,206,126, 90, 99,192, 80, 63, 39,236,106, 21,208,112,196, +135, 3, 58, 74,154, 5, 52,133, 72, 98, 81,246,219, 59,173, 91,227,157,214,173,201,249, 69,133,189,238,221, 15,237,117,228,226, + 29,157,218,152,120, 40, 54, 27,227,106,120,201,148, 9,142, 25, 51,102,192,197,197,165,194, 9, 25, 25, 25,248,243,207,203,149, + 94, 99,198,139,172,236, 63,190,255,254,123,235,188,188,188,126, 59,119,238,236,206,178,236,247,233,233,233, 55, 76, 33, 25, 3, +212, 41,144, 72,122,140, 95,187,150,109,249,254,251,148,157,171, 43,201, 50, 12,145, 22, 31,239,248,243,134, 13, 93,115,159, 61, +179, 80, 57, 56,228,230,105, 52,234,216,216, 88, 72,165, 82, 66, 32, 16,180,169,132, 42,131,227,176,154, 36,137,121, 4, 65, 64, + 34,145,198, 78,153, 50,229, 97,201,111,117, 78,159, 62, 45, 27, 56,112,160, 26, 64, 2, 0, 72, 36, 82, 15,138, 34,253,138, 29, + 8,177,218, 20,129,105,105,105,249,197,119, 63,172,178, 84,230,230,107, 12, 42,149, 81,110, 99, 69, 16, 86,214,148,178,160,176, + 48, 85,145,165, 91,184,108, 57, 53,249,147, 49, 95,168, 84,170,105,166,138,172, 22, 45, 90,220, 59,118,236,152,179,163,163, 35, +242,243,243,145,147,147,131,123,247,238,129,101, 89, 12, 29, 58, 84,210,190, 93,219, 86, 95, 47, 92,116, 59, 57, 53,245, 61, 83, +196,150,165,131, 19,126,236,216,178,184,177, 78,200, 41, 43,159,237,195, 3,203,206, 89,158, 82, 80,106,157,123,157, 37,164,222, +235,209,163,135, 8, 0, 38, 76,152,160, 44, 44, 44, 92, 1, 96, 31,106,142,232, 63,123,209,162, 69, 30,245,234,213,243,217,183, +111, 31,138,138,138, 0,192,185, 94,189,122,240,243,243, 99, 66, 66, 66,224,231,231, 7,107,107,107, 92,187,118, 13,183,111,223, + 70,235,214,173,173, 69, 34,209, 8,131,193, 80,169,208,234,218,167,235, 34,201, 64,255, 78,141,222, 25, 11, 43, 27, 55,236,216, +127, 16, 49,161,187, 59,233, 12, 81,139, 68,204,213, 49, 26, 78, 50, 46, 43,201,106,126,157,214, 93, 28, 27, 52,125, 31, 62,239, + 60,116,210, 50,215,159, 47,234, 85,111,165, 64,170,221,189,108,173, 34,167, 42,145, 5,224,199,161, 67,135, 14, 63,112,224,128, + 29, 0,132,133,133, 33, 35, 35, 3,114,185, 28, 82,169, 20, 66,161,176,108,125,210, 90, 98,220,230,205,155,203, 68, 27, 77,211, +101,171, 0,200,100, 50,116,238,220, 25, 45, 91,182,196,241,227,199,199, 85, 33,180, 58,182,107,215,110,175,143,143,143, 87,249, +131, 42,149, 10,163, 70,141, 2, 0,116,233,210,165,135,133,133, 5, 87, 42, 8, 21, 10, 69,209,253,251,247,123, 1,184, 91,133, +178,212,164,166,166,226,171,175,190,194,139, 23, 47, 62,219,186,117,107, 34, 0,169, 88, 44, 46,235, 31, 3,240,107,218,180,233, +250, 89,179,102, 33, 46, 46, 14,145,145,145,247, 80,251,161, 84,198,210,210,242,153,209,104,108, 77,211, 52, 52, 26, 13,134, 12, + 25, 34, 61,122,244,104, 6, 69, 81,209,217,217,217,163, 81,236,147, 98, 42,164, 0,214, 78,153, 50,101,234,220,185,115,113,249, +242,101,156, 60,121, 18, 99,198,140,193,204,153, 51, 97,101,101, 53,126,230,204,153,183, 81,188,160,249,203,232,177,121,243,102, + 48, 12,243,202,179, 33,149, 74,209,177, 99, 71, 52,105,210, 4, 39, 79,158,236,241, 26, 66,203,167, 99,199,142, 98,150,101,161, + 82,169, 16, 18, 18, 98,101, 97, 97, 97,229,233,233, 57, 17,192,191, 70,104,249,248,248, 76, 57,112,224,128, 85,249,209, 31,137, + 68,130,114,245,128,199, 63,111,209,170,182,135, 85, 6,189, 94,109, 16, 8,200,104,119,183,230,135,174, 93,253,188,108,232, 16, + 32,163,245,122,181, 1, 0, 24,150,131, 82, 77,195, 66, 66, 34, 33,189, 16, 17,241,217,149, 81, 85,152,162, 41,180,240,134,164, +109, 2, 56,142,131,222,192, 64, 87,144,142, 21,103,212,136, 74,209, 66,175,202,131,222, 80,236,134,229,228,228, 36,184,112,225, +220,172,224,224, 63,167,254,254,251,239, 84,138,173,109,100, 33,208,170, 50, 78,123,123, 95,107, 86, 44, 62,180,101,235, 98, 11, +142,138, 71,108,146, 10, 13, 60,219,194,201,206, 11,233,217, 42,220,140, 60,139,232,167, 65,168,231,230,131,153, 95,244,149,126, +247,195,190,131, 34,186,174,119,126,254, 11,101, 85,233, 44,237, 69,109, 59, 31, 11, 58, 55, 30, 76, 78, 28,152,194,180, 87, 78, +176,146,123,227,157,110, 30,144,123,213,151,140,155,185,124, 44, 80, 65,104,149,231,204, 32, 8,114, 11, 73, 18, 83, 9,130, 64, +243,230, 45, 82,214,174, 93, 91, 89, 40,112, 67,243,230, 45, 82, 40,138,244, 44,126,177,147,155, 57,142,205,168, 33,157, 21, 68, +141, 88, 44,153, 91,108,246,119, 75, 62,115,230,140, 97,248,240,225, 88,179,102,141,120,222,188,121, 11, 41,138,154, 80,201,240, + 94, 5,206, 33,128,183, 93,253,250,189,191,191,121,147, 19, 26,141, 68,238,189,123,202,124,133,130, 78, 47, 44, 20, 31,142,142, +238,255,233,156, 57, 98, 47, 47, 47,220, 8, 10,114,204, 82,169,184,124,157, 78,147,159,159,207,209, 52,125,175, 10,206, 5,114, +185,179,108,199,142, 29,126, 83,166, 76,121,168, 80, 40, 22, 0,128,155,155,219, 10, 0, 77, 0, 36,148, 59,134,173, 91, 15,166, + 78,156, 56, 49, 54, 51, 51,115, 65,117,233, 44,135,166,206,114,103,217,254,109,123,158, 56, 88, 91,144,114, 79,119, 82,104,103, + 39,160,197, 22, 34, 22,208,212,243,170,111, 9,160,105, 21,215,190,204, 73, 88, 88, 88, 28, 59,117,234,148,179, 80, 40, 4,195, + 48,144,203,229,120,241,226, 5,242,243,243, 81, 88, 88,136,231,209, 81,168,235,229,133,111,230,207,115,155, 62,111,254, 49,181, + 90,221,250,165,198,236,213, 5,144,141,134, 87, 44,123,149,173, 98,240,242,176,151,137,229, 94, 30, 47,146,146,146, 96,101,101, +133,128,128, 0,171,155, 55,111, 94,175, 70,100,149, 95, 4,120, 68,135, 14, 29,172,247,237,219,135,214,173, 91,195,214,214, 22, + 33, 33, 33, 8, 11, 11,131,193, 96, 32,139,138,138, 96,101,101,133,149, 43, 87,194,219,219, 27,133,133,133, 72, 72, 72,112, 20, + 10,133, 78, 47, 69,180, 47,227, 12,185, 16,242, 93, 65,220,149, 69,233,196,249,190, 59,246, 31,196,196, 15, 71,194,149,139,191, +110, 91,159,248,174,247,192, 14, 75, 56,202, 43,208,210,186,185,125,195,128,129, 16,137,173, 48,125,238,114,196,134,159,182, 87, + 23, 62,249,140, 96,146,189,150,173, 61, 60,163,146,188, 19, 0, 72, 47, 47,175, 79, 15, 31, 62,108, 93,102,122,161,168,178, 53, + 15,203, 47, 2, 95,205,130,239, 53,222, 79,130, 32,240,226,197, 11, 56, 59, 59,195,202,202,170,108, 1,241,168,168, 40,220,185, +115, 7,165,171, 81, 84,193, 57, 58, 56, 56,216,203,210,210,178,194, 9, 28,199, 33, 59, 59, 27, 52, 77, 67, 38,147,129, 97, 24, + 24, 12, 6, 24,141, 70,104,181, 90,171, 38, 77,154, 76, 51, 26,141,119, 43,227,100, 89,246,203, 17, 35, 70,116,184,123,247,174, +239,134, 13, 27,160,215,235,127, 76, 79, 79,199, 7, 31,124, 0,150,101,209,163, 71,143,119, 57,142,139, 89,184,112, 33, 0, 96, +214,172, 89, 70,149, 74, 53,165, 54,121, 47, 65,147,119,222,121,199,247,242,229,203,232,212,169, 19,116, 58, 29,214,172, 89, 99, +179,117,235, 86,155, 61,123,246,200,231,206,157,251, 91, 86, 86, 86,159, 26, 56, 9, 0, 63,186,186,186, 78,237,218,181,171, 69, +201, 26,166,216,189,123, 55,190,249,230,155, 3, 0, 22,158, 59,119,110,233,201,147, 39,199,126,250,233,167,248,230,155,111,102, +230,231,231,239,172,138,243,249,243,231,144,203,229,176,177,177, 41,126, 89, 26, 12,120,244,232, 17, 46, 93,186,132,198,141, 27, +155,146,167,170,210,233, 51,116,232,208,223,246,239,223,111,157,156,156,140,107,215,174,161,110,221,186, 80,171,213,166,172, 13, + 27,252, 23, 52,216, 85,114,106, 52, 26,109, 82, 82,146,213,170, 85,171,224,230,230, 6, 31, 31, 31, 72,165, 82, 16, 4, 1,163, +209, 88, 93, 56,129, 26,211,217,165, 11, 4,217,169,246,131,108,237,236, 63,227, 56, 78, 80, 80,144,183,205,128,252, 35,241,241, +208,255,141,121,255, 47,163, 21,128,135,168,184,230,161,162, 76,104, 5, 5, 5,113,129,129,129, 68,233,222,195, 3,202,236,108, +251, 88,103,215,102, 7,157, 93,155,150,172,251, 69, 70, 83,148,125,172,139,139, 90, 9, 0, 6,154,195,173,232,124, 60,121,150, +142,176,103,233,176,148,152,102,124,209, 25,232, 98,143, 85,142,131,182,232,127,157, 86,131, 58, 15, 58, 67,177,187,135, 94,167, + 70, 65, 86, 36, 49,124, 72, 47,233,212,169,147,225,230,230, 33,175,138,207, 32,145,206,156, 62,171,191,157,131,157, 16, 65, 55, +207,227,221,198, 67, 32,149, 8,145, 83,160, 5, 8,224,105,252, 37,128,181, 70,120,108, 18,218, 53,149,161, 79,111,127,171,227, + 71, 98,230, 0, 88,108, 74,122,233,148,123, 16, 53,236, 7, 33, 99,132, 49, 59, 6,108,126, 34, 96,233, 10, 13, 97,133, 28, 69, + 34,162,175, 31, 53,169,207,200,178,236,103, 78, 78, 78,249, 11, 23, 46,236,218,160, 65, 3,195,180,105,211, 30, 39, 38, 38,126, +249, 82,111,229,167,205,155, 55,227,217,179,103,169,223,127,255,125, 72,118,118,246, 34, 51, 11,122, 62,199, 97, 93,201, 80, 92, +246,137, 19, 39,222,185,122,245,234,204,117,235,214,185,124,254,249,231,226,207, 63,255,252, 19, 0,223, 86, 55, 92,168,148, 72, +122,126,127,237, 26, 71,167,164,232,254,248,229, 23,241,166, 91,183, 22, 26, 88,214,221,201,217,153,104,223,174,157, 74, 70,146, +217, 57, 25, 25,180,220,215,151,122,113,233,146, 35,103, 97,145,118,238,220, 57,101, 81, 81, 81,149, 75,231, 80, 20,165,174,108, +184,176, 50,184,185,185,233, 43,243,225,170,166, 65, 84,178, 28,103,176,171, 87,143,235,221,227,189, 6,207, 98,226,227,165,118, +118, 84,195, 6,117, 27, 69, 68,191,184,199, 49,140,150, 32, 8,165, 73, 99, 37, 20, 53,114,221,186,117,205,108,108,108,192,178, + 44,108,109,109,145,149,149, 5,189, 94, 15,165, 82, 9,125, 97, 1,244, 5, 5, 8, 75,124,129, 14, 93,187,226,255,216,187,234, +240, 40,174,246,123,102,125, 55,187,113, 23, 8, 16, 8, 16, 8, 4,183, 64, 8, 78, 9, 20,247,162,133, 82,130, 67, 9, 80,138, + 20, 8, 45,238, 78,113,183, 18, 92,131, 4,143, 19, 72, 32, 46, 27,247,245, 29,249,253, 17,105, 8,145, 77,160,223,239,251,218, + 61,207,179,207,202,204,156,189,115,239,157,185,103,222,247,189,239, 29,209,175,143,203,177,203,127,142,162, 40,234,116,149,254, +188,150,173, 75, 45, 89,171,235,153,255,229, 11, 74,204, 45, 21, 93,191,181,118, 6, 79, 34, 65,239,249, 62, 95,114,161, 7, 94, +187,118,237,250,208,161, 67,191, 89,184,112, 33, 75, 42,149,222,140,141,141,237, 2,224,109, 85, 7, 73, 36,146,134,153,153,153, + 40, 44, 44,132,177,177, 49,182,110,221, 10,107,107,107,200,229,114,188,122,245,138,113,112,112, 32, 30, 62,124, 8, 7, 7, 7, +100,101,101, 65,163,209, 64,161, 80,164,170,213,234, 74,221,229,197,238,193,254,243,250,225,198,251, 55, 71,187,218, 19, 49,175, + 70, 46,240,248,240, 62,244, 93,194,237, 59, 79,127, 37,149,194,196,220,164,187,139, 27,180, 11,180,152,185,104, 21,118,110, 88, +129,247, 47, 30,101, 91,215,205,223, 37, 34, 84, 71,170, 42,175, 76, 38, 83,190,123,247,206, 48, 56, 56, 24, 4, 65,192,216,216, + 24, 6, 6, 6, 21,138,173, 90,128, 85,214, 2, 37,147,201,192,227,241, 96,110,110,142,131, 7, 15,150, 14,188,245,235,215,175, +138, 99, 95,239,222,189, 71,213,173, 91,215,176,236,143,237,218,181,195,244,233,211,177,103,207, 30, 4, 4, 4,124,178,158,102, +106,106,170, 84,171,213, 86,117,222,185,105,105,105,253,134, 12, 25,242,230,241,227,199, 70, 7, 15, 30, 4, 73,146, 21,190, 14, + 28, 56,128,231,207,159, 47, 7,240,174,150,253,168,233,176, 97,195, 30,157, 56,113,194, 36, 35, 35, 3, 37,125, 67, 38,147,129, +162, 40, 52,105,210,132, 32, 73,178,186,184, 55, 22,155,205,190,188, 99,199,142,129,223,127,255, 61, 56, 28, 14,212,106, 53,118, +236,216,129,197,139, 23,167, 21, 63,148,106, 0, 44, 59,114,228,200,132, 65,131, 6,193,205,205,205,229,193,131,202, 35, 59, 10, + 11, 11, 81, 88, 88, 8, 46,151, 11, 27, 27, 27,172, 89,179, 6,106,117,209,109,165,113,227,198,165,151, 49,128,125,141, 27, 55, + 30, 24, 25, 25,185, 17, 69,177,107,159,193,198,198,102, 8,195, 48,211, 40,138, 42,232,218,181,171,249,169, 83,167, 12,147,147, +147,241,230,205, 27, 44, 95,190, 60,135,166,105,138,166,105, 66,161, 80,196, 88, 89, 89,189, 17, 8, 4, 34,185, 92,158,157,149, +149,181, 14,192,205,255,175,145,156, 32, 8,130,203,229, 98,202,148, 41,224,112, 56, 16,137, 68, 80, 42,149,208,106,181,165, 98, + 30, 53,116, 75, 55,106, 36, 49,231,128,247,189,169, 97,179,185, 35,230,120, 89,218,218,217,195,196, 72,128,136,136,183, 93,238, +223,187,179,131,207,121,191,151, 86,107,247,190,143,203,251,219, 23,187, 47,175, 69,254, 71,133,214,103,107, 30,114, 42,110,204, + 17, 20,195,156,203, 76, 78,230,107,248,124,131,200, 18, 43,151,181,181, 60,159, 32, 70, 80,150,205,191, 5,169,209, 22,223, 40, +152,226,151,142, 66, 75, 75,225,195,251, 48, 60,190,253, 39, 44,228,201,200,140,105, 5,240, 90, 64,173,200,131, 82,173, 41, 22, + 37, 20,130,223,220, 67,126, 94, 54, 92,219,122, 1, 44,214,243,202,248,140,205, 9,175,206,109, 90,178, 63, 36,132,161, 93,227, +225,112,114,232,138,120,105, 62,114, 11, 85,200,201, 87,162,149,171, 15, 50,114, 20,200,151, 43,241,246,195, 49,216,219, 57,177, + 8, 78,116, 79, 93,133,150,234,237, 69,168,222, 93, 1,207,177, 11,248, 77, 6,129,237,232,142,132,144, 7, 8,190,177, 5, 73, +225, 79,192,208, 20,108, 27,183,215,245, 34,217,113,243,230,205,246, 93,186,116,225,244,234,213,203,237,250,245,235,110, 82,169, + 52,184, 88, 96,184,245,234,213,203,205,210,210, 18,219,182,109, 83, 16, 4,177,163,150,141, 93,106, 1, 75, 79, 79,127, 9, 96, +237,197,139, 23,119, 76,159, 62, 29, 86, 86, 86, 45, 82, 82, 82, 42, 61, 48,131,203,117,155,184,110, 29,195,101,179,153,211, 59, +119,242, 86,221,188,185,233,143, 35, 71,120, 61, 60, 61, 9,134, 97, 16, 20, 20,100,240,219,206,157, 6, 99,191,253, 54, 46, 62, + 61,157,244, 15, 8,208, 72,147,146, 10,210,101,178, 85, 82,169, 52,245,255,163,103,107,181,218,103, 49,177, 49,246,109, 59,180, +178, 12,140,136, 9,239,219,163,115,103, 22,139,197,122, 31, 29, 31, 96,105,105,100,112,231,246, 29,141, 86,171,125,166, 11,151, + 64, 32,240,234,209,163, 7, 39, 39, 39, 7,118,118,118,200,200,200, 64,114,114,114,145,197, 33, 47, 7,154,188, 60,104,243,115, + 65,201, 10, 17,243,234, 37, 90, 57, 53, 16,156, 19, 8,188,228,114,121,149, 66,171,228, 41,179,162,133,174, 75,126,227, 27, 26, +130, 47,145,128,168,185,219,240, 91, 19, 19,147,197,185,185,185,215, 1,172,209,104, 52,222,139, 23, 47,110,183,125,251,118,139, +181,107,215, 26, 77,155, 54,237, 92, 97, 97, 97, 43, 20, 45,170, 90,217, 0,246,145, 36, 73,115, 0,214,247,238,221,131,149,149, + 21,242,242,242, 74, 44, 45,106,185, 92, 46,204,202,202,130, 74,165,130, 90,173,134,145,145, 17, 94,191,126,157, 77,146,228,213, +234, 10,103,212,144, 88,163,210, 68,252,108,238, 34, 78,209,144,166, 30,233,217,116,206,202, 77,210,213, 0, 54,245,115,114, 58, +160,161, 31,197, 68,133, 93, 53,141,125,245, 48, 59, 37, 74,230,116,240,122, 76, 85, 49, 90, 12, 0,154, 32, 8,166,113,227,198, +200,200,200, 0,155,205,134,129,129, 1, 36, 18, 9,150, 44, 89,130, 29, 59,118,212, 70,104, 9,197, 98,241, 58, 22,139, 53,138, +197, 98, 89, 82, 20, 5, 31, 31, 31, 12, 28, 56, 16,124, 62, 31, 26,141,166,212,162, 89, 98,165,170,198,210, 17,244,252,249,115, +163,231,207, 63,185,109,121, 90, 88, 88,220, 87,169, 84,136,142,142,198,229,203,151,187, 3,240,175, 97, 91, 71, 7, 5, 5,245, +115,119,119, 63,218,166, 77,155,134, 12,195,160, 69,139, 22, 24, 61,122, 52,142, 29, 59,134,224,224, 96,228,229,229,209,119,238, +220,249, 3,192,198,154,142,225,197,245,219,100,216,176, 97, 79, 78,158, 60,105,154,149,149, 5,133, 66, 1,153, 76,134,115,231, +206,161, 75,151, 46,176,176,176,192,137, 19, 39, 72,134, 97,170,106,123, 22,139,197, 58,184,119,239,222,129, 83,167, 78,197,174, + 93,187,112,250,244,105, 12, 26, 52, 8,163, 70,141, 66, 70, 70,134,245,134, 13, 27, 38, 20,187, 9, 87,140, 30, 61, 26,133,133, +133,120,245,234, 85,132,142,215, 60,114,115,115,145,155,155, 11,145, 72, 84,246, 26, 35, 0, 28,219,178,101,203,152,185,115,231, +194,201,201,105, 69, 76, 76,204, 22, 84, 48, 75,148,166,233, 31,146,147,147, 77, 57, 28,142, 57, 73,146, 72, 76, 76,196,235,215, +175, 49,115,230,204,236,236,236,236,233, 0,226, 1, 44,155, 50,101,202,154,249,243,231,151,246,165,249,243,231,251, 93,191,126, +189,223,127,218,154,211,184,177, 73,115, 62, 91, 48, 39,167,128,109,158,147,147, 83,122,239, 80,171,213, 80,169, 84,159, 88,178, +120, 60,174,121,187, 86,117,175, 41,228, 5, 75,223, 70,229, 86,186, 64,186, 75, 67,227,150, 6, 98,227,185, 93,186,246, 24,215, +167,223, 96, 54,169,213,226,214,173,171, 56,116,104, 55, 60,221, 27,195,169, 81, 11,204,154, 61,199, 88,165, 38,125,238,220,185, +185,216,228,249,227,155, 5,249,185, 75,170,226,252,151,227, 90,177,184,186, 86,161,235,176, 34, 5, 89,156,194, 33,167,248,171, +133,169,169,233, 78,138,162, 60,141,140,140, 64,231, 70,226,237,235, 23,200,206,225, 66,165,160, 64, 51, 69, 98, 75, 39,225,162, + 82,227,209,173, 43,216,186,101, 19,178,178,178,224,222,173, 59, 10, 57,117, 80,183, 78, 93, 40, 21,242,226,139, 6,208,168,181, +176,180,118, 68, 96, 96,176, 54, 95, 38,171,244,134,196, 19,106, 92,234, 90, 55,134, 74,211, 9, 66, 62, 31,121, 5,106,228, 20, +139,172, 19,231, 71, 66, 37, 87,128, 84,107, 64,170,181,176,172, 59, 12, 77,173,123,128,166,174, 54,175, 81,245,209, 20, 52,177, +143,160,137,125, 4, 81,167,217,248,211,119, 76,185,129, 84,183,117,119, 51, 50, 50,210,195,195,195,175, 6, 5, 5, 13, 25, 57, +114, 36, 30, 60,120, 48, 13,192,140, 98,247,205,180,145, 35, 71, 34, 40, 40, 8,225,225,225, 87, 51, 50, 50,210,191, 70,203,243, +249,124,133, 74, 85, 52,198, 26, 24, 24, 8,171,217,215,190,221,208,161,172,188,192,192,252, 45, 79,159,174, 56,112,240, 32,175, + 87,207,158,132,150, 36, 65, 83, 20, 26, 57, 59, 19,125,250,244, 17, 31, 59,123,214,156,173,213, 62, 95,228,237,125,111,207,248, +241, 5, 47,101, 50, 93, 3,205,235, 21,187, 12, 1,160, 94, 21,191,233, 12,149, 74,181,253,135,239, 39,245,242,127,244,164, 78, +221, 58,246, 70,183,238,248, 7, 11, 68,124,150, 83,253,134,236,156,188,108,206,234, 21, 75, 69, 42,149, 74, 87,209,234, 98, 97, + 97,129,212,212, 84,124,248,240, 1, 42,149, 10, 90,173, 22,180, 92, 6,117, 78, 46,212,121,217, 32,148, 10, 8, 40, 10,202,204, + 52,212,115,106, 0,252, 53, 35,177, 90, 87, 84, 69, 66,171,228, 93,104,100, 4,158, 88, 2, 22,151,171,243,226,232, 0,218,180, +111,223,254,236,133, 11, 23,120,147, 39, 79,238,112,247,238,221,157, 0,226,147,147,147,123, 46, 95,190,252,229,206,157, 59, 5, +211,167, 79,111,178,113,227,198, 9, 0,246, 85, 70,162, 84, 42,207, 94,187,118,109,172,163,163,163,117,104,104, 40,148, 74, 37, +104,154, 70,255,254,253,129,162,216, 26, 0,192,251,247,239, 21, 74,165, 50, 61, 44, 44, 44, 63, 62, 62, 94, 3, 29,102, 9,174, +220, 46,125,150,159,250,104,168,181,141,253,115,161,168, 94,125,166, 48,112,200,188,225,246, 27,182,156, 79, 86,222,140,142, 46, +248,185,119,131,245,178,130,144,153, 38, 14,133,187,110,250,197,232, 18, 8, 95, 58,187,208,220,220, 28, 28, 14, 7, 92, 46, 23, + 60, 30, 15, 4, 65, 96,246,236,217,216,191,127,127,117,174,195, 79, 68,150,161,161, 97,248,170, 85,171, 28,166, 79,159,206, 19, + 10,133,200,201,201,193,137, 19, 39, 48,101,202, 20, 28, 58,116,168,194,248, 23, 29, 92, 74,229,173,165,115,199,143, 31, 15,181, + 90,141,209,163, 71,227,192,129, 3,115, 41,138,242,175,197, 37,253, 60, 56, 56,216, 57, 56, 56,216, 8,192,160, 81,163, 70, 29, + 25, 54,108, 24,252,253,253,113,245,234,213,238, 40,154,244,161, 0,224, 11,192,170,248,189,170,235, 83,108,109,109,189,155,166, +233, 65,150,150,150,193,141, 27, 55,118, 61,121,242,164, 73,122,122,122,201,228, 7,196,198,198,226,240,225,195,210,131, 7, 15, +230, 83, 20,101,206, 98,177,174,229,230,230, 46,169, 66,176, 29,220,178,101,203,164, 98,119, 32, 46, 92,184,192,108,218,180,137, + 88,190,124, 57,114,114,114,224,233,233,137,189,123,247,206, 41, 44, 44,116,219,180,105,211,247, 35, 70,140,192,234,213,171, 33, +147,201,182, 84,247,176, 82,133,248, 34, 0,116,222,178,101,139,227,220,185,115,113,225,194, 5,180,105,211, 70, 20, 19, 19,179, + 7,192,212,138,218,143, 97, 24,196,196,196, 64, 46,151,227,201,147, 39, 88,177, 98, 69, 78, 25,145, 53,103,198,140, 25,107,230, +204,153,131,117,235,214, 49,161,161,161,233,195,134, 13,179,222,191,127, 63,187, 81,163, 70,115,228,114,249,127, 76,104, 53,105, +100,182,190, 93,155,174,139,109,237, 27,225,196,201, 83,200,206,206, 46,173,147,146,122, 97, 24, 6, 5, 5, 5, 72, 77, 77,133, +177,145, 33, 54,108, 92,243,205,143,211, 38,213, 65, 81, 26,140,207, 77,150, 78,166, 27,135,141,154,188, 96,244,216, 73, 8, 13, +126,131, 99, 71,246, 33, 44, 52,168,148,143,212,106, 16, 25,241, 26,145, 17,175, 97,109,227,136, 62,189,186, 19, 99,198,140,233, + 63,126,236, 40, 75, 0,127, 91,234,136,255, 97,107, 22,240,121, 30,173,253,159, 8,173,106,204,117, 22,166,166,166,225,103,206, +156, 49,119,119,119,103,147, 36,137,155,183,110, 97,230,140,239, 48, 97,188, 15, 52, 48, 5,169,230,129,230, 9,117, 42,137, 66, + 33, 7, 3, 6, 50,153, 12, 1, 1, 1, 96,104, 18,199,246,111, 2,195,208,165, 66, 11, 96,160,214,104, 96, 95,183, 9,118, 31, + 88, 75,130,203,125, 9,109,197,169,107,242,179,216,148,150,100,144,156,158,128, 4,105, 24,140, 13,235,130,195,173,139,172, 92, + 57, 56, 44, 27,104,149,239, 65, 21, 31, 43,151, 37, 65,161,249,178,246,163, 42,176,158, 50, 53,184,233, 42, 20,138,227,199,143, + 31,255,102,243,230,205,252, 1, 3, 6, 52, 62,127,254,124,103, 0, 24, 48, 96, 64, 99, 35, 35, 35, 28, 63,126, 92,173, 80, 40, +142,127, 69,139, 79,143,246,237,219, 35, 39, 39, 7,177,177,177,193, 85,158,155, 90,109, 46,177,178, 98,167, 63,120,160,205,200, +201,169,211,163, 71, 15, 66, 75,146, 96, 17, 4,178,243,242, 16, 31, 23, 7, 19, 19, 19, 34,252,253,123,201,142, 89,179, 46, 53, +118,117,229,148,204, 72,212, 5, 87,175, 94, 53, 64, 81, 92, 86,149,191,213, 16,178,244,180,212, 73,222,222,222,151,142, 31, 63, + 97,156,150,158, 22, 41,224,243, 73,137, 68,104, 55,126,220,143,156,220,220,220,177, 0, 10,117, 37,203,201,201, 65, 76, 76, 12, + 68, 34, 17,120, 92, 46,104,133, 28,148,172, 16,202,236, 12,176, 53,106,240, 41, 10,102, 6, 2,212,177,182, 70, 93, 75, 11,157, + 56, 63,220,191, 93, 26,248, 94,214, 93,184,161,189, 11,248, 98, 9,248,134, 18,252,232,247,176,248,105,148, 7, 44,255, 85, 23, + 90, 11,123,123,251, 63, 79,158, 60,201,203,200,200, 64, 80, 80, 80, 48,128, 60, 0,134, 0,232,136,136,136,187, 97, 97, 97, 94, +197,179,238,170,155, 45,182,233,226,197,139,189,221,221,221,201,250,245,235,139,211,211,211,235,228,228,228,208, 82,169,244, 19, +147,208,237,219,183, 5, 5, 5, 5, 50,154,166, 47, 21,139,172,106,243, 23,205, 27,110, 47, 12, 8,196,108,143,190,245, 90, 24, + 89,180, 68, 54, 25,216,226,121,176,116,246,188,225,246,219,183,156, 79, 86,138, 8,213, 17,130, 74,172,195, 17, 42,117, 13, 98, +102,128,162, 88,169,128,128, 0,196,199,199, 35, 38, 38,230, 19, 65, 53,109,218, 52, 28, 59,118, 76, 39,139,150, 88, 44, 94,183, +114,229, 74,135,185,115,231,242,202,136, 34,120,123,123, 35, 47, 47, 15, 7, 14, 28,128,183,183,119,141, 7,254,114,104,208,163, + 71,143, 1,182,182,182,200,202,202,130,141,141, 13,220,221,221, 7,250,251,251,215, 7, 16, 91,203,126,255, 99,223,190,125,215, +172, 90,181, 10, 90,173, 22, 83,166, 76, 65, 84, 84,212,217,168,168,168,173,117,235,214,157,253,211, 79, 63, 89, 91, 91, 91, 99, +228,200,145, 98,146, 36,135, 86, 70, 98,102,102,230,187,111,223,190,177, 3, 6, 12, 96,105, 52,154,110,247,239,223, 71, 92, 92, + 28,212,106, 53, 72,146,196,199,143, 31,225,237,237, 45, 45,158,221,248, 81,135,114, 77, 94,182,108,217,164,217,179,103,227,183, +223,126,195,202,149, 43,255, 48, 54, 54,118,109,213,170, 85,235,149, 43, 87, 98,209,162, 69,112,116,116,132,185,185,121,211,229, +203,151,187,204,159, 63, 31,219,183,111,199,138, 21, 43,254, 0,112,184, 54, 21, 65,211, 52,177,126,253,122,183, 45, 91,182,216, +150,136, 44, 22,139,133, 51,103,206, 32, 48, 48,112, 96,116,116,116, 69,199,236,181,177,177,153,102,107,107,203,191,115,231,142, +196,209,209, 17, 36, 73,106,139, 69,214,142,186,117,235,206,252,248,241, 35, 6, 12, 24,128,232,232,232,227, 0, 38, 24, 27, 27, +203,230,207,159,111, 32, 18,137,140,229,114, 57,254, 83, 96,179,136,137,235, 86, 47,194,171,192,247,184,120,145,135, 87,175, 94, +193,218,218, 26, 2,129, 0, 12,195, 64,165, 82, 33, 35, 35, 3, 90,141, 10, 45,154, 55,192,209,131,235,145,158,158, 1,176,136, + 74, 67,110, 8, 22, 49,110,210,119, 67,240,248,201, 45,236,217,179, 15,133,133,178, 74, 30,190,133,104,212,216, 5,246,118, 86, + 72, 76, 74, 4,193,130,197,223,121,174,255,227,174,195,210, 91, 16,116, 73,239, 80, 22, 38, 38, 38, 91, 79,159, 62,109,238,233, +233,201,150,201,100,160,105, 26, 93,221,221, 49,123,238, 92, 92, 61,121, 18,206, 29, 70,131, 80, 75, 64, 26,232, 54,235, 65,169, +144,163, 89,235,206, 24, 49,114, 20, 18,226,227,209,215,107, 24,148, 74,121,233, 19, 70,137, 69, 75,173,214,192,194,170, 14,110, +223,190,205,198,148, 41,111,177,163, 98,163, 4,165,225,135, 68,126, 84,118,201, 85, 4, 34,224,213, 49,104, 84, 26,180,104,177, + 28, 26,218, 28, 86, 14,211,160,213, 94, 70,126,198,253, 34, 55,134,185, 39,146, 18, 18,192, 98,243,194,107, 91,131,180, 44,227, +139,110,186,121,121,121,121, 49, 49, 49,231, 3, 2, 2,198, 13, 29, 58, 20,183,111,223,254, 30, 0,134, 14, 29,138,128,128, 0, +196,196,196,156,207,203,203,203,251, 26,173,109,107,107, 59,168,123,247,238,163,219,181,107, 7, 63, 63, 63, 48, 12,243, 88,167, + 11,155,203,101, 88, 44, 22,104,154, 6, 1, 32, 43, 55, 23, 81, 81, 81,200,202,204,132, 86,171,133,172,176,144,118,105,220,184, +144,161,105,195,154,148,167,236, 12, 67, 84, 48,235,176,228,183, 90,156,106,252,203,231, 79, 19, 10, 10, 11, 45, 77, 77, 76, 11, +248,124, 62,149,147,155,155,247, 54, 60, 84,173,227,224, 80,130,136,176,176, 48,215,148,148, 20, 36, 36, 36,128,148, 21,128,173, + 82,131,165,146,163,103,231, 78, 16,129,129, 16, 52,184,180, 22, 92, 54, 23, 5, 69,179,243,170,117,119, 80,101, 30, 18, 74, 68, + 22, 65, 16, 69,238, 66,177, 24,124,137,225, 39, 22, 46, 93,250,147, 64, 32, 56,121,238,220, 57, 91,123,123,123,172, 94,189, 26, + 14, 14, 14, 77,237,236,236,228,198,198,198, 34,107,107,107, 52,107,214, 12,157, 59,119,198,141, 27, 55,160, 67, 29,144, 12,195, +244,121,252,248,241,130,167, 79,159,142, 16,139,197,196,172, 89,179, 56,253,251,247,135, 64, 32,128, 92, 46, 71, 78, 78, 14, 78, +157, 58,149, 73,211,116,201,164, 20,115, 3, 3,131,195, 4, 65,196,202,100,178,185,229, 9,143,110,110, 97,151,158, 77, 79, 97, + 10, 13,134,120,244,173,215,162, 71,223, 94,104,224,220, 3, 61,250, 38, 0,192,122, 51, 78,220,232,223,151,153, 92, 50, 49, 36, + 14,223,190,121,103,133,187, 71,143,101,139, 11, 31,172,249,109,127,110,181,241,116, 4, 65,128,166,233, 79,114, 7,149,223, 62, + 97,194, 4,156, 57,115,166,218,122,100,177, 88,163,166, 79,159,206, 43,103,121, 70,114,114, 50,188,188,188, 48,116,232,208, 79, +132,150,133,133, 5,108,108,108, 16, 23, 23, 7, 0, 89, 58,246,171,217,147, 39, 79, 38, 20, 10, 5,166, 78,157,138, 3, 7, 14, + 96,244,232,209,132,191,191,255,108, 0,115,107,218,217, 89, 44,214,134,159,126,250,105,129,183,183, 55,178,179,179,113,253,250, +117,244,239,223, 31,103,206,156,177,188,126,253,250, 58, 79, 79, 79,176,217,108,248,249,249,129, 36,201, 42,115,125,241,120,188, + 65, 3, 6, 12, 96, 37, 38, 38,130,199,227,161,109,219,182, 72, 74, 74,130, 92, 46, 71,114,114, 50,230,204,153,147,154,149,149, +213, 93,215,235,136,199,227,205,157, 61,123, 54, 78,159, 62, 13, 31, 31,159, 35, 0,166,230,229,229,141,120,250,244,233,233,111, +191,253, 22,201,201,201,184,116,233, 18, 86,172, 88, 65, 76,152, 48, 1,187,118,237,194,156, 57,115,254, 40,182, 58, 85,214,241, + 11,210,211,211,141, 27, 54,108,136,180,180, 52, 20, 22, 22,226,210,165, 75, 86, 55,110,220,168,111,111,111,111, 20, 19, 19, 67, +253,250,235,175,252,185,115,231, 98,235,214,173, 8, 10, 10,194,177, 99,199,208,163, 71, 15, 50, 58, 58,186, 66, 43, 89,113,202, +134, 75, 12,195,220, 17,139,197, 40, 40, 40, 40,185,238, 22,250,248,248,120,251,250, 22, 25,217, 83, 82, 82, 48,113,226,196,241, +247,238,221,163, 61, 61, 61, 13,120, 60, 30,148, 74,165,236, 63, 57,106,211, 20, 13,128, 70,253, 58, 18,220,186,122, 16,111,130, +163,241, 38, 56, 12,124, 65, 81, 16,188, 66, 33, 71,235, 22,141,208,161,109,123,164, 72,147,113,252,216, 65,152, 89,216, 87,121, + 31, 97, 24, 6, 60, 14, 5,151,198, 54, 56,121,108, 31,252,174,223,195,177,227,167, 74, 99,222, 56, 28, 46, 90,181,238,128,182, +109,221, 17, 29,243, 17, 7, 15,238,129,165, 85, 29,189,115,176,150, 40,117, 29,150,125, 47,167,252,123,184,187,187,179, 11, 11, + 11,161, 84, 42,145,154,154,138,184,184, 56,152,152,154, 32, 58, 37, 22,221, 13, 52, 72,165,243, 17, 17, 28, 78, 17,108,110, 80, +117,127, 56,192,163, 21,224,209, 10, 51, 39,143,174,226,145,149,129,216,200,162,200,117, 67,146, 31,176,125, 59, 89,153,208, 34, + 41,237,221, 91,119,238,183,159, 60, 97, 16,247,246,253, 3,208,170,105, 40,180,198,144, 41,213,144,105,184, 96, 25,247, 7, 50, +253,193,230, 8,208,209,173, 17, 46, 93,188,161, 97, 72,237, 61,157, 43,200,218, 21,100, 90, 88, 25,161,149, 94,206,239, 96,166, +179,235,176,116,224,165,168, 51, 39, 78,156, 24,220,169, 83, 39, 3, 79, 79,207,134,197, 3,167,230,196,137, 19,242,226,100,152, + 53,197, 39,217,224,109,108,108, 90,243,120,188,209,253,251,247,111, 61,105,210, 36,188,125,251, 22,199,143, 31,143,108,212,168, +209, 3,169,180,242, 25,217,108, 62, 63,171, 48, 61,221, 68, 82,191, 62,199,212,208, 48,229,198,245,235,142,189,122,247, 38, 18, + 18, 18,144,149,149, 5,165, 82,137,160,224, 96,134,203,102, 39, 17, 70, 70,172,247,129,129, 44, 54,159,159, 85,153,181,177, 2, +196, 85, 51,235,208,183,182,214,173, 58,182,166, 13, 87,248,252,208, 64,169, 82,186,230,231,231,147, 28, 46,151,235, 96, 99, 18, +255,254,163,238,247, 68,149, 74,229,119,247,238,221,193,189,122,245, 18, 68,134, 4,129,204,203,131, 58, 47, 7, 60,154,130, 89, +107, 55,176, 53, 42, 64,173,133,189, 11, 3,101,174, 1,252, 95,188,215,170, 84,170,106,147, 26,150, 8, 45, 86, 57, 97,192,151, + 72, 32, 48, 52,130, 64, 34, 41, 47, 24,170,123,146, 51,232,211,167, 79,207,142, 29, 59,130, 97, 24,236,223,191, 31, 26,141,134, +175,209,104,160, 86,171,161,209,104,144,159,159,143, 99,199,142, 97,247,238,221, 79, 1,252,161,195,233,147, 34,145,232, 91,130, + 32,172, 56, 28,142,220,210,210, 82,124,230,204,153,210,116, 19,173, 90,181,130,161,161, 33, 15,197, 73, 33,173,172,172,184,135, + 14, 29, 50, 25, 56,112,224,163, 10,221, 29, 45,154, 46,106, 64,154,122, 8, 69,245,234, 27, 89,180, 68, 3,231, 30, 0,128,222, + 94,147,209,160, 81, 93,228,103,134,212, 87, 42,226,134,240, 56, 57,166,225,219,147,223,138, 6,184, 78,146,165, 63,140, 66,197, +211,251, 43, 28, 40, 88, 44, 86,165,238, 88, 93, 68, 86,145,102, 97, 89,150,196,249, 0, 64, 86, 86, 22,164, 82, 41, 34, 34, 34, +208,164, 73, 19,100,103,103,195,222,222, 30,106,181, 26,237,218,181,131, 66,161,192,150, 45, 91,240,228,201,147,167, 0,230,232, +240, 31, 34,103,103,231,137,173, 91,183,198,245,235,215,241,234,213,171,228, 91,183,110,217,187,187,187,163,126,253,250,147, 98, + 99, 99,151, 22,187,250,116,133,216,221,221,125,150,183,183, 55,194,194,194,240,195, 15, 63,100, 37, 38, 38, 94, 58,123,246,236, +212, 21, 43, 86,176,250,246,237, 11,169, 84,138, 13, 27, 54, 80, 79,158, 60,217, 8, 96,117, 53,245,248, 46, 49, 49,209, 65,169, + 84, 34, 59, 59, 27, 36, 73, 66, 46,151,227,198,141, 27, 56,118,236, 88, 90,177,200,250,160,107,225,220,220,220,154,177, 88, 44, +156, 62,125, 26, 0,126, 70, 81,198,254, 75, 67,134, 12, 73,254,245,215, 95,237,151, 44, 89,130,239,191,255, 30, 26,141, 6,191, +253,246, 27,150, 44, 89,114,173, 88,100, 85,117, 19,221,108, 99, 99, 51,237,135, 31,126,104, 58,127,254,124, 4, 4, 4, 88,189, +126,253,186,109, 80, 80, 16,234,212,169,131,172,172, 44,142,185,185, 57,182,110,221,138,121,243,230, 93, 0,144,249,236,217,179, + 81, 49, 49, 49,190, 0, 54, 84, 35,218,247,218,219,219, 79, 99, 24,134,145,203,229,113, 62, 62, 62, 27,214,174, 93,139,121,243, +230, 33, 60, 60, 28,121,121,121, 48, 52, 52, 36,126,250,233,167,137, 63,255,252, 51,166, 76,153,194,200,100,178,221,255,233,129, +154, 97, 40,200,115,194, 64,169, 76,209,170, 69, 19,180,114,173,135, 91,247,223, 0, 0,122, 14,115,135, 92, 86,128, 35, 71,246, +227,195,135, 40,112,184, 92,152,152,217,232, 98, 9,132, 58,255, 29,114, 53, 82,244,242,108,139,254,125,187,227,143,163,103, 64, +106, 53,152, 58,121, 44,114,114,115,113,244,232, 65, 68,199,124, 4,135,203,133,185,197,223,159, 8,181, 42, 45,242, 63, 47,180, +116,112, 63,129,166,105, 36, 39, 39,227,245,235,215,136,141,141,133,129,129, 1, 20, 36, 69,239,185,251,132, 38, 8, 94, 18,205, + 48, 79, 25,178, 52, 75,241,231, 28, 20,149, 92, 38, 99,173,177,169,169, 41, 95,165, 82,128, 36,181,101, 70, 21, 2, 32, 0, 30, + 7,176,181,107,128,196,132, 68, 70,169, 84, 62,172,242, 9, 74,165,220,122,229,210, 57,239,206, 93,220, 45,250,247, 92,133, 75, +151,151, 35, 39, 63, 31, 74, 13, 23, 50,165, 6,114, 37, 96, 98,214, 24,237, 90,180, 68, 74, 74, 22, 66, 94,249, 23,114, 84,114, + 93, 2, 69,163,118, 44,155,236, 60,121,230, 34,136, 28,187, 64, 21,113, 9,116, 97, 90,169, 69, 75, 40, 49,133, 89, 93, 23,228, +202, 84, 56,119,239, 13, 80,131,165, 94,210,211,211,229,108, 54,251,132,183,183,247,111,111,222,188,118, 0,128, 55,111,222, 36, + 73,165,210,197,233,233,233, 53,181, 73,151,100,131, 39,132, 66,209,155, 70,141, 26,165,180,109,219,214,120,200,144, 33,176,176, +176, 64, 80, 80, 16,124,125,125,223,105, 52,154, 69,254,254,254, 85,186,122,212,106,117,242,155,203,151,141,186,127,247,157,201, +162,129, 3, 55,120,123,123,111, 93,189,122, 53,215,217,217,153,208,106, 52, 8, 13, 13,101, 78,158, 56,161,221,189,100,201, 22, +190, 88,204,121,121,229, 10,151, 84,169,146,255,191, 59,177,189,189,189,135,123,183,174, 46, 27, 55,111,135, 82, 81,136, 23, 1, +215,144,147,147,129,125,251, 47,186,216,219, 51, 30,201,201,201,254,186, 10,224,195,135, 15, 47,232,208,186,117,107,167, 58,117, + 16, 26, 31, 11, 62, 77,129, 71,146, 96,107, 84, 96,145, 74,212,113,101, 64,176, 12, 33, 77,205,199,218,211,231,195,116, 17,198, + 77,191, 25,132,213, 73,121, 32, 8, 2,155, 58,185,130,111, 40, 1, 79, 44,193,143,127,222, 47, 21, 6,126,171,151,128, 47,145, +160, 97, 7,157, 18,194,203, 31, 60,120,240, 58, 52, 52,180,157,171,171, 43, 22, 44, 88,128,184,184, 56,208, 52,141,180,180, 52, +165, 84, 42, 77,206,200,200,136, 67, 81,254,159, 3,213, 12, 98,101, 85,135,189,191,191,127,169,187,225,222,189,123,176,179,179, +131,177,177, 49,242,243,243, 49,125,250,116,147, 95,126,249, 5, 0,240,250,245,107,148, 21, 40,229, 17,250, 38, 98, 99,110, 1, +147,195, 20, 6, 14,201, 38, 3, 91,244,232,155,136,222, 94,147,112,199,239, 15,220,191,117, 23,102,156,184, 88,136, 11,110,100, +198,102,230, 39,201,156,247,186,180,153,202,150,202,110,237,157, 53, 40,146,109,107, 75,159, 91,178, 39, 63,183,170,178, 58, 59, + 59,195,218,218,186, 52, 70,139,195,225, 96,202,148, 41, 96, 24, 70, 87,145, 85, 60,214,208, 25, 74,165,210, 90, 40, 20, 34, 53, + 53, 21, 31, 63,126, 68,116,116,116,105,234, 0,154,166,181, 11, 23, 46,228,206,154, 53, 11,123,246,236,193,195,135, 15,159, 2, + 88, 5, 64,215,135,181,177, 35, 71,142, 52, 84,171,213, 56,117,234, 20, 9,192,235,220,185,115,175,219,181,107,199,233,215,175, +159,225,174, 93,187,198, 22,183,145,206, 66,203,200,200,136,167,209,104,176,107,215, 46, 36, 38, 38,122, 0,136,120,249,242,229, +222,145, 35, 71,238,118,117,117,109, 20, 22, 22, 22, 85, 88, 88,248, 35,128,144,234,200,210,210,210, 38,183,109,219,246, 28, 77, +211,142,189,122,245, 18,111,222,188,217,232,253,251,247,112,112,112, 0, 77,211,161,168,225, 18, 86, 81, 81, 81, 17, 82,169,212, +165,123,247,238,184,113,227,198,122,138,162,214, 1,248,109,198,140, 25,246,241,241,241,104,221,186, 53,204,204,204,240,254,253, +251, 2,169, 84,186, 27, 69, 75, 18, 85,103,194,141, 1,176,120,239,222,189, 45,247,238,221, 59,218,204,204,172, 99, 80, 80, 16, + 30, 63,126,140,141, 27, 55,226,151, 95,126, 65,215,174, 93,177, 96,193,130, 76, 0,163, 1,144, 49, 49, 49, 58,229,205, 43,177, +108, 1, 64,155, 54,109, 82,124,125,125, 49,117,234, 84,230,208,161, 67,219, 78,156, 56, 49,119,236,216,177,165, 99,224,196,137, + 19,153,227,199,143, 79, 68,209, 50, 76,255, 73,104, 53, 26, 53,140,204, 26,160, 48, 55, 1, 25,137, 1, 48, 48,180, 65,223, 30, +110,144, 43,212,184,122,229, 2, 66, 66,131,193, 98,177, 96,109, 83, 7, 38,166, 22,136,140,140, 2,170,158,109,172,213,104, 52, + 48, 52,173,135,194,188, 68,168,211,223, 64, 36,177,194,164,239,134, 64,174,208,224,226,165, 11, 8, 11, 11, 1,155,205,134,141, +109, 29, 24,155, 20,113, 18, 76,213, 51,152,245, 0, 80, 65, 62,173,106,133, 22,155,205,126,112,243,230,205,225, 29, 58,116,224, +124,248,240, 1, 31, 62, 20, 61,220,228,228,228,144, 4,168,243,233,161, 87,198, 84,113,120, 47, 20,207,206, 40,187,118,161,196, +208, 48,249,253,187, 8,235,156,236, 52, 4, 7, 62,193,135,200, 80,196, 70, 71, 64,163, 81,130,205, 98,129,197,102,161, 94,131, +230,120,242, 52, 64,173, 36,201,128,202, 56,139,202, 17, 93, 32,182,114, 30,181,102,245, 82,191,121,139, 86,138, 70, 12,223,131, +144,247,111, 81, 72,218,128, 97, 0, 27,115, 49, 90, 57,253,132,228,148, 12,156,254, 99,151,156,214,104,198,149,203,161,245, 25, + 39, 0, 88,103,162,217,238,253,127, 76, 57,112,236,228,202, 69,179,166, 91,127, 59,116, 28,248,217,111,161, 77,121,131, 6,237, +250,131, 16,152,224,250,237,251,240,127,253, 54,141,166,152,149,214, 89, 56, 20, 89, 13,103, 89,228,230,230, 62, 75, 77,149, 58, +148,201, 2,239, 32, 16, 8,171,155, 29, 87,158,243,147,140,243,108, 54,171,205,154, 53,107,180,214,214,214,154,176,176, 48,236, +217,179,135,126,243,230,205,109, 22,139,181, 67, 42,149, 42,171,227,180,212,106,131, 79,250,248, 52,107, 63,116, 40, 51,102,214, + 44, 57, 4,130,217, 27, 54,109,242,201,200,201,177, 99,104, 26,150,102,102, 73, 27,150, 44,241, 29, 62,114,100, 78,248,147, 39, +162,128,203,151, 69,124,146,124,163, 67, 57,191, 6, 42,229, 76, 78, 78,246,127,248,240, 49,142, 28,216, 12,141, 70, 5,105,114, + 60, 0, 32, 51, 43, 15,213,136,172,242,156,140, 92, 46, 31,250,243, 47,191, 60,255,121,222, 92,155,110, 61,123, 33, 33, 56, 8, +154,236, 12, 16, 90, 18, 92,130, 3, 89,186, 1,210,211, 10,177,248,248,217,244, 66,185,124,104, 5,131, 68,133,229, 44,177, 88, + 9,140, 12,193, 19, 75,192,151, 24,126, 98,197, 18, 26, 25,129, 47,150,128,195,231, 87, 20,192,253, 25,103, 97, 97,225,176,225, +195,135,135,188,124,249,210,116,234,212,169,232,220,185,115,160, 66,161,240, 4, 80, 80,219,250,164,105, 58,185, 91,183,110, 44, +130, 32, 36,227,198,141, 19,100,100,100,148,102, 86, 47, 44, 44,196,141, 27, 55,208,164, 73,209,172,254,240,240,112, 52,111,222, +188, 82,206,239, 23,135, 37, 3, 88, 61,111,184,253,134,231,193,210,217, 0,214, 55,104, 84, 7,247,111,221,197,227,251, 1, 62, + 29, 93,233,237,223,140,107,247,171,129,231,200, 69, 46,109,166,178, 37, 70,182, 56,122,241, 2, 59,226,205,193,181,114,121,104, + 67,236,185,180,176,178,114, 18, 4, 1,134, 97, 62, 75,229,192,102,179,113,226,196,137,154,158,251,217, 3, 7, 14,204,248,225, +135, 31,120, 82,169, 20,239,222,189,131, 76, 38,131, 80, 40,196,173, 91,183, 72, 0,187, 78,156, 56,113,235,196,137, 19,253, 80, + 52,155,232, 94, 77,250,167, 88, 44,246,238,219,183, 47,222,189,123,135, 87,175, 94, 93, 0, 16, 18, 24, 24,120,225,195,135, 15, +163,186,118,237,138, 63,254,248,195, 91,161, 80, 28,168, 9, 39, 77,211,101,115, 38,149,172,248, 16, 92, 88, 88,216, 49, 32, 32, +160,166,237, 46,205,202,202,234, 82, 44,172, 19,173,173,173,141,130,131,131, 81,183,110, 93,104, 52,154, 14, 53,237, 75,121,121, +121,155,119,236,216,113,104,242,228,201,248,245,215, 95,199,157, 61,123,118,220, 55,223,124,131, 1, 3, 6,224,240,225,195, 8, + 9, 9, 89, 15,221,150, 21,171,232,220, 67, 0,132, 88, 91, 91,207,172, 83,167, 14, 54,110,220,136,208,208, 80,223,213,171, 87, + 47, 9, 9, 9, 65,147, 38, 77, 4, 17, 17, 17,100,109,238, 33, 0, 96,100,100,100,164,213,106,113,249,242,229, 23, 0,230,141, + 27, 55,206,106,235,214,173,163, 37, 18, 9,178,179,179, 21, 97, 97, 97, 99, 1, 92,249, 79,223,235, 24,130, 88, 54,245,251,217, +123,191,159, 58, 86,216,182, 77, 43,200,243,147,160, 40, 76,131,188, 32, 21, 59, 14,220, 6, 65,176, 96,105,105, 11, 43, 27, 7, +196,199, 39,224,233,181,235,106,153, 92,177,149,175,165,215, 87,205, 57,171,136,179,117, 17,167, 92,150, 14, 69, 97,122, 41,167, +149,149, 93, 49,103, 60,158, 4, 92, 87, 42,100,178,205,106,134,248,253,111, 62,247,255,101,212,108,173,195,178,200,201,201,153, + 51,125,250,116,207,197,139, 23,155,147, 36,201, 54, 51, 51, 67,124,124, 60,121,254,252,249,236,194,194,194, 57,181, 41, 13,135, +203, 13,113,110,220,196,243,219,111,191, 37, 7, 13, 26,200, 27, 63,185, 31,199,210,202, 10,121,185, 89,136,124, 23,132,247,111, +223,192,185,137, 27, 86,172,222, 2,152,152, 84,187,144,100,241,178, 58, 94,171,126, 94,120,166,139, 71, 31,163, 38,205,221,120, +173, 26, 26, 67,163, 37,145,148,148,132, 43,151,131, 53, 97,175, 31,231,211,164,122,148, 60, 83,183, 37,120,252, 1, 18, 89,216, +231,106,165, 57,177,110,195,142, 5,187,246, 29, 89,180,120,246, 84,113, 87,247,222, 8,189,251, 7, 46,248,157,145, 41, 85,234, + 13, 60, 54, 54,133,101, 65, 30, 89,195, 58, 80, 42,149,154,242,227,169, 82,169,212,124,105, 75, 31, 62,124, 24,105,105,105,234, +184,184,184,155, 36, 73,158,173, 98,177,231,207,176, 3, 80, 15, 81,169,238,254,236,238,222,239,231, 91,183,132, 19,127,250, 73, + 61,110,252,248,133, 80,169, 52,224,243, 25,142, 88,204,130, 64,192, 13,127,242, 68,180,109,198, 12, 51, 66,173,190,115,164,138, +180, 1, 21,224,171,207, 58, 44,177,104,117,239,222, 21, 19,167,206,131,162,140, 69,235,217,171, 72,168, 52,208,217,162, 85,140, +132,184,196,196,142,179,151,253,124,113, 84,223,158, 46,174,142,245, 4,150,245,235, 65, 98, 99,131,172,140, 12, 60,121,245, 94, +187,250,204,197,176, 98,145,165, 83, 94, 25,154,166,139,130,220, 1,244,156,179, 24, 4,155, 13, 20,167,113, 40,153, 57, 84,191, + 93,103, 16, 28, 14, 40,134,134, 74,165,210, 37,232, 47,233,227,199,143,195,198,141, 27,119,207,207,207,143,213,183,111,223, 86, +151, 46, 93,162,191,164,239, 40, 20,138,142, 0, 32, 20, 10, 99, 77, 76, 76,236, 39, 79,158, 12,173, 86, 11,185, 92,142,188,188, + 60, 36, 37, 37,229, 78,158, 60, 89, 3, 0, 34,145,136, 63,124,248,112,163,234, 56,183,156, 79, 86,206, 27,110,191,221,140, 19, + 55, 58, 63, 51,164,190, 25, 39, 46,182,163, 43,189,125,203,249,100,165,145,157,108, 77,102,156,127,164, 84,118,107,239,209,139, + 23,216, 19,134, 12,163, 28, 36, 81, 62, 66, 43,230,124,117,188, 4, 65,124,150,156, 84, 71,145,245, 9, 10, 10, 10,150, 44, 95, +190,124, 64, 78, 78,142, 67,191,126,253,120, 46, 46, 46,120,254,252, 57,252,252,252,200,103,207,158, 37,202,100,178,165, 0,148, + 0,110,215,166, 78, 27, 55,110, 92,159,195,225,148,184,210,118, 22,255,188,243,210,165, 75,163,166, 78,157,138,122,245,234, 53, +139,136,136, 16,160, 6,215, 17,195, 48,165, 94,134,175, 9,130, 32,162,183,109,219,102,111, 99, 99, 67,220,184,113,131,100,179, +217,181,177,220, 28, 62,120,240, 96, 7,173, 86,251,253,180,105,211,224,225,225, 1,146, 36,113,252,248,113, 28, 60,120, 80, 87, +145, 85, 37, 34, 35, 35,223, 36, 38, 38,118, 91,184,112, 33, 54,110,220,184,100,225,194,133, 72, 76, 76, 68,100,100,100,208,151, +240,230,231,231, 43, 18, 18, 18, 12, 58,117,234,212, 54, 44, 44, 44,204,211,211,179,249,212,169, 83,177,126,253,122,230,225,195, +135,195, 1,220,248,255, 24,189,223,127,200, 62,198,165, 56,183, 86,175,217,252, 75, 67,167,250, 63, 76,153, 52,146,221,216,185, + 57,100,121, 73, 48,183,176,134, 67,157, 6,200, 72,207,196,205,155, 55,168,204,204,220,195, 20,139, 88,245,225, 67,118,202,151, +112,218, 59, 52, 64,122,122, 58,174, 95,191, 78,229,230,228,239,135,150,181, 58, 34, 62, 55, 13,122,232, 98,201,154,134, 42,178, +196, 87, 5, 11, 83, 83,211, 83, 70, 70, 70,105, 70, 70, 70,105,166,166,166,167, 0,157,102, 31,244, 42,115,119, 96,127,242, 26, + 62, 92, 8,161,176, 35, 56,156,249, 38,166,166, 55,140,141,141,179,186,119,239,174,222,187,119,175, 50, 34, 34,156, 78, 78, 78, +100,140,141,141,243, 74,247,175,136,179, 28, 76, 77,157, 12,197,182,205,127, 49,118,104,245, 68, 98,219,172, 64, 98,219,172,192, +216,193,237,169,216,182,217, 74, 83, 83, 39, 67,157,202, 89, 9, 26, 88,193,210,217, 2,187,154, 88, 18, 10,103, 11,236,106, 96, + 5, 75,157,207,189,106,183, 31, 69, 16,160, 80, 52, 13, 27,181,224, 44,225,160,217,108,246, 17, 7, 7, 7, 91,212, 44, 97,221, +103,156,227,129,122,227, 5,130,239,207,249,248, 76,140,125,248,112, 92,126, 76,204,152,188,232,232,145, 65,103,206,140,218, 57, +106,212,248, 49, 2,193,180,225,128,147,174,156,182,182,182,190,111,222,188,241,211,245, 85, 70,120,233, 92,159, 78, 13,236,111, +245,237,213,129,241,158, 62,148,241,158, 62,148,233,219,171, 3,227,212,192,254,214, 23,180, 17,193,102,179, 71, 27, 24, 24,156, + 18, 27, 24,132,138, 13, 12, 66, 13, 12, 12, 78,177,217,236,209,168, 58,134,234, 19, 78,115,115,243,215,214,214,214,105, 53,121, + 89, 88, 88, 4,214,160,156, 99,234,215,175,159,200, 98,177,182,212,240,154,174,138,211, 89, 36, 18, 69,139,197,226,164,178, 47, +145, 72, 84, 54, 49,148,185,129,129,193, 85,177, 88,188, 85, 23,206,223,151, 53,255,229,233,237,153, 33,191, 47,107,254, 75,249, +109,179, 6,155, 78,126,126,111, 85,214,172,193,166,147,117, 41,167,149,149,213, 67, 43, 43, 43,169,149,149,149,212,218,218,186, +202,151,133,133,197,107, 29, 56,133,134,134,134, 91, 13, 13, 13,211,196, 98, 49, 37,145, 72,210,196, 98,241, 22,148, 73,109, 81, +219,250,100,177, 88,235,155, 53,107,166,100,179,217,135,202,109,218,216,176, 97, 67, 37,135,195,217, 80, 67, 78,163,174, 93,187, + 82,193,193,193,140,135,135, 7, 3,192,244, 43,182,187,141,169,169,233, 13, 35, 35,163, 4, 67, 67,195, 29, 0,196,181,228, 36, + 0,140,182,183,183, 15,234,209,163,135,220,222,222, 62, 0,192,183, 95,177,156, 3, 6, 15, 30, 76, 39, 36, 36, 48, 12,195, 48, + 9, 9, 9,204,224,193,131,105, 20, 37,138,252,146,123,242,178, 25, 51,102, 48,207,158, 61, 99,158, 61,123,198, 4, 4, 4, 48, + 3, 6, 12,160, 1,124,247,133,247,121,124,173,115,119,105, 96,225,212,180,145,233,217,177,195,220,233,219, 87,182, 48, 43,150, +254,192,244,246,104,206, 52,105,104,122,209,217,217,220,249,107,112,254,178,116, 58,211,171, 91, 51,218,197,201,244,140, 75, 3, + 11,167,255,240,185,255,163,172, 90, 37, 15,210,127,119,192,217, 95,166,197, 79,197, 82,197,176,179,179, 67, 86, 86, 7, 33,135, +227, 46, 16, 8, 60, 89,108,246,131,236,140,140,185,197,143, 91,212,127,202, 84, 91,229,128,238, 4,126, 21, 75, 18,212,134,243, +147, 64,246, 90,114,214,132, 67, 39,206,202, 22,149,166, 85,170, 20,115,146,124,189, 3, 85,214,193, 39,156,246,246,246,223,211, + 52, 93, 95,215, 2,177, 88,172,216,228,228,228, 3,181,169,207, 70,141, 26, 49,197,238,109,226,107,182,251,223,209,151,254, 77, +156, 71, 55,183,176,107,210,162,233,162,208, 55, 17, 27,139,221,138,165, 88, 57,203,212,208,189, 71,247,229, 79,238, 63,252,117, +229,142,156,130,255,231,115,103, 65,199,152,182,175,192, 89,146, 36,180, 70,156, 92, 46,119,111,251,246,237,191,127,254,252,249, + 33,138,162,166,253, 75,251,231, 0, 54,155,189,176,113,227,198,173, 34, 35, 35,131, 40,138,218,136, 10, 18, 69,214,162,156, 75, +235,215,175,255, 35,143,199, 19, 20, 22, 22,230,164,164,164, 44, 7,112,246,191,173, 62, 93, 26,153,181,101,152,210,164,219,107, +223,125,204,126,249,213, 56, 25,154,162, 25,246,154,200,152,172,192,255,135,118,255,199,136,172, 98,161,181,255, 63,241,199,189, +244,156,122, 78, 61,167,158, 83,207,249,213, 57, 69,250,250,212,115,254, 3, 57,255, 81, 40,177,104,113,244, 85,161,135, 30,122, +232,241, 63, 7,133,190, 10,244,208,227,191, 14,101,173, 90,165,214, 44,162, 10, 85, 90, 19,147, 96,109,148,237, 93, 61,167,158, + 83,207,169,231,212,115,234, 57,245,156,255, 58,206,127,170,200, 42,235, 42,156,166,119, 29,234, 57,245,156,122, 78, 61,167,158, + 83,207,169,231,252,111,226,252, 95, 23, 90, 40, 39,180,244,174, 67, 61,254, 51,216, 62, 4,246, 0, 48,251, 18,146,255,142,253, +245,208, 67, 15, 61,244,208,227,255, 25,251, 81,137,235,240,191, 65,104,217, 1,232,136,162,133,111,223, 3,120, 12, 32,231, 11, +248, 44, 0,140, 36, 8, 98, 4, 0, 48, 12,115, 14, 69,179, 70, 50,117, 57, 88, 40, 20,166, 41,149, 74,171,226,207,233, 74,165, +178,236, 90, 6, 4, 62,159,205,198,148,121, 85,136,250,245,235,167,169, 84, 42, 43, 29,254, 62,143, 97,152, 16, 22,139, 21, 42, +145, 72,238, 71, 70, 70,250,213,228,196, 61, 61, 61, 39,178,217,236,181, 0, 64, 81,212,178, 7, 15, 30, 28,249, 27,219,173, 67, + 29, 59,155, 63, 52, 90, 13,153,150,145,189, 28,159, 39,242, 3, 0,236,242,130, 47, 65, 98, 81,241,231, 13, 51,253,170,206,163, + 83,211,253,171, 64, 91, 46,151,235,109,109,109,221, 63, 41, 41,233, 53,128,159,128,234,179, 26,215,169, 83,231, 59, 14,135, 51, +142,162, 40, 39, 54,155, 29, 77,146,228,137,196,196,196, 99,250,123,136, 30,122,232,161,135, 30, 58,136,173,207, 80, 35,161,213, +196, 28, 54, 12, 48, 26, 4,122,131,193, 29, 2, 56,253, 62, 11,169,186, 30,255, 77, 19,104,181,100,209,127,242, 88,160,110,124, +100,237,239,223,191,191,195,172, 89,179,208,185,115,103, 60,127,254,188,211,225,195,135, 39,159, 61,123, 54,132,166,233, 7, 0, +158, 3, 58,165, 82, 16,163, 40, 79,203,216,254,253,251,247, 90,187,118, 45,187,121,243,230, 80, 40, 20,120,248,240,161,251,134, + 13, 27,182, 62,125,250,244, 46,128,147,197,130,160,210, 5,240,148, 74,165, 85,201, 98,156, 4, 65, 88, 13, 31, 62,252,101, 89, +113, 85,188,190, 26,193, 48,204, 51,130, 32, 2, 40,138,122,126,254,252,249,196, 38, 64,135,233,245,121,231,231,198,106, 28,202, +115,170, 84, 42,171,203,191,175, 3, 71, 32,128,170, 32, 31,157, 38,253, 37,122,239,252,178, 8, 4, 77,130, 13, 38,199,115,205, +214, 16, 0,161, 41, 41, 41, 33, 30, 30, 30,177, 53,109, 97, 54,155,189,246,230,205,155,182, 12,195,160,111,223,190,107, 1,252, + 93, 66, 75,208,177,173,219,131,171, 23, 78, 9, 11,179,211,208,239,219, 81, 39,162, 18,211, 39, 2,184,240,137,104,234, 15,107, +130,192,162, 25,235, 78,178, 1, 96,247,210,177, 63,109,233,131,237,243,110, 35, 21,128,103,177,248, 1,128,223, 1, 60,216,213, + 31,214, 0, 22,207, 88,119,146, 0,128, 61, 75,199, 46,218,213, 31,219,102,222,168,113,218,138, 31, 39, 78,156,184,125,237,218, +181,108, 91, 91, 91, 36, 39, 39,247,107,214,172, 89,227,252,252,252,102,168, 34,136,184, 94,189,122,103,186,246, 24,216, 96,232, +136,209, 6,150, 22,166, 72,145,102, 26,157, 57,117,104, 58,251,217,195,254,113,113,113,163,244,247, 16, 61,244,208, 67, 15, 61, + 42, 65,237, 51,195,183,182,133, 72,166,193, 96, 14,155,248,174, 75,219,102, 61,199,124,211,149,213,204,165, 17,222,134, 71,244, +185,114,255,197, 6, 86, 64,248, 61,146, 98,142,137,121,184, 28, 40,173,122, 38,140,150, 4,231,246,229,147, 69, 35,225,228,177, +236,151, 47, 95, 54,106,211,166, 77,233,210, 48, 61,123,246, 68,207,158, 61,137,221,187,119,187,221,190,125,219,237,224,193,131, +154,123,247,238,253,129,170,243,163,120, 55,108,216,112,195,246,237,219, 5, 30, 30, 30, 16, 8, 4,165, 27, 36, 18, 9, 6, 14, + 28,136,129, 3, 7,178, 83, 82, 82,250, 94,189,122,181,239,239,191,255,174,142,143,143, 95,136,191,178, 52, 87,137,229,203,151, +183,173,224,231,155, 4, 65,124, 36, 73, 50,200,205,205, 45,177, 49,208,104,250, 55,157,239,252,216,197, 89, 60,119,201,225, 10, +121, 56,124, 62,142, 78, 44, 26,171,203, 10,173,216,251, 55, 32, 49, 50,204, 50, 48, 52, 12, 1, 16, 10, 32,132, 97,152,208,232, +232,232,136,166,128, 91, 71, 83,214, 31,135,114,232,150, 53, 16, 91, 72, 76, 76,132,177,177,177,200,195,195, 67, 74, 16,196,202, +135, 15, 31,126,237,128,188, 14, 43, 23,253,200,203,137, 11, 65,234,187,103,152, 63,194,221, 96,238,142, 63,127, 85,170,181, 23, +170, 58,136, 32, 88,172,223, 3,104, 31, 20, 45,198,187, 60, 43, 43,203, 3, 0,204,205,205,249, 0, 30,108,121,129,111,230,117, + 33,190, 36,183, 27,143,205,102,239, 58,124,248,240,212,239,190,251,174,104,233,136, 39, 79, 32,145, 72,176,122,245,234,122, 11, + 22, 44,240, 37, 73,114, 78,101,150,172,174, 61, 6, 54,216,182,241,215,102, 5,217,121,170,125,187,206,190,178,115,109,194,154, +225,189,192,112,155, 70,101, 67, 81,212,119,122,203,150, 30,122,232,161,135, 30, 53,177,102, 85, 43,180, 26, 91,224, 72,107, 87, +231,145, 99, 6,184, 11, 90,184, 54, 7, 79,240, 87,234,150, 54,109,219,162, 77,219,182, 44,159,194,130,222, 47, 95,189,233,125, +254,246,115,149, 92, 27,127, 54, 50, 19, 19,117, 45, 85,201,162,180,107,191,181,238, 33,203, 77, 23, 2,128,216,196, 74,185,244, +114,234,253, 46, 93,186,192,193,193,129,119,239,222,189, 41,213, 8,173,165,239,223,191, 23,176,217, 85,231, 67,181,179,179,195, +240,225,195,209,164, 73, 19,126,247,238,221,151, 86, 38,180,132, 66, 97, 58, 65, 16, 86, 0, 96,102,102, 70,173, 92,185, 50,136, + 41, 2, 0, 48, 12,195, 60, 99,177, 88,207,105,154,126,241,231,159,127, 38, 53, 3,172,250,181,105,242,248,199,241,195, 13,152, +243, 91, 43, 21, 9,202,252,252, 10,127, 55,144,136, 51, 68, 98,113,136,192, 64, 24,138,162,181,188, 66, 29, 28, 28, 34,154, 1, + 14,237,155,212,191,189,123,222, 88,195, 67,211,126,173,182, 46, 91,183,110,221,184,101,203,150, 66,138,162, 32,147,201,176,103, +207, 30, 99,145, 72,100,220,191,127,255, 21,101, 59,128, 11,208, 98,152, 29,123,218,170, 20,106,102, 45, 58,146, 73,215, 78,109, +227,134, 15,236,111,212,182, 99, 87, 68, 61, 56,142,236,236, 2,228,229, 22,130,166,233,207,242,250,204,188,129,180, 93, 94,216, +176,123,201,216,197, 4,139, 69,184, 13,249, 9,131,108,242,102,239,221,187, 55, 28, 0,151,207,231,151,237,135,118, 34,123,215, + 13,141,250,116,197,158,101,227,193,208, 52, 3, 96, 67, 13,172, 89, 86,134,134,134, 87,110,223,190,221,161, 93,187,118,120,254, +252, 57, 98, 98, 98,240,227,143, 63,170,103,206,156,201,155, 48, 97, 2, 49,127,254,252, 89,191,255,254,251,121, 0, 79, 63,187, + 16, 56,156,113,223, 14, 29,197, 47,204,205, 87,170, 85, 26,181,153,133, 9,173,146, 41,229,153, 57,249,202, 81, 99,191, 87,135, + 7,190, 24, 7,224, 51,161,245,133,245,169,135, 30,122,232,161,135, 14, 96, 24,166, 29, 0, 75, 0, 25, 4, 65,188, 42,251,189, +120,151,146,213, 90,202,127,207, 68,145, 87,202,188, 12, 93, 38,138,194,125, 44, 1, 80, 0, 94, 18, 4,145,243,133, 69,172,122, +233, 29, 63, 63, 63,166,236,123, 25,161,197, 48, 12,195,104,179, 62, 50,170,200, 27,140,252,213,129,207, 94,138,240, 11,140,244, +229, 89,230,197,201, 95,152,198, 22, 85,175,194,254, 77, 19,104,199,182, 4, 51,163, 29,152, 57,221, 77,148, 47, 95,190,188, 71, +211,180,159, 79, 87, 48,204,219,147, 12,243,246, 36, 51,175, 19,152,243,231,207,223,244,245,245,245, 59,118,236,152, 31,128,234, +226,148,210, 10, 94, 5, 48, 47,172,192, 84,134,247,239,223, 51,123,247,238,101,150, 44, 89,194, 28, 58,116,136, 65, 53, 25,212, +251,246,237,251, 48, 44, 44,140,153, 48, 97, 66, 16,170, 72, 12,232, 2,136,199,213,179,121,167, 58,179, 85,163,254,174, 5,147, +211, 77, 88,225,249,219,218,218,126, 82,158,245,206, 54,204,206,246,206,204,145,222,109, 82, 25,134,185,201, 48,204,122,134, 97, + 70, 49, 12,211, 4, 0, 90, 3, 70,223,218,154,127, 80,158,221,166, 80, 79,235, 88,237,186,119,173, 91,183,110,188,112,225,194, +108,181, 90,205,196,198,198, 50,251,246,237, 99,238,220,185,195, 92,190,124,153,113,119,119, 79, 41, 83, 94,235,201, 77, 28,211, +212, 7, 87,169,106,211,139,184,108,246,206, 87,119,206, 51, 31, 30,159, 99, 94,158,246,101, 78,252, 60,134,153,245,109, 7,141, +145, 72,160, 4,208,163,178,227,102,118, 65,163, 38,245, 44, 35,227,227,227, 25,141, 70,195, 76,154, 52,137,233,219,183, 47,211, +167, 79, 31,166, 87,175, 94, 76,207,158, 61,153, 30, 61,122, 48,247,239,223,103, 82, 82, 82,152, 94, 93,219,200,188, 92,208,182, + 6, 69,115,117,116,116, 76,141,141,141,101, 52, 26, 13,115,239,222, 61,230,248,241,227,204,189,123,247, 24, 31, 31, 31, 6,192, +145, 25, 51,102, 40,114,114,114,152,190,125,251, 38,161,130,172,241,142,142,142, 17, 97,145,137,137, 91,214, 29,184,127,116,231, +169,251, 23,207,223,185,127,229,214,203,107,151,111,189, 58,251, 34, 56,250,178,163,163, 99, 68, 5,237,255, 69,245,169,135, 30, +122,232,161, 71,245, 90,164, 88,104, 13, 40, 54,118, 12, 96, 24,166, 87,185,239, 3,138,133,211,103,223,125,124,124,150,148,253, + 94,178,143,143,143,207, 18, 0, 76,167, 78,157, 78, 49, 12,211,232, 43, 20,127, 90,249, 87,141,102, 29,146, 73, 47,193,115,238, + 15, 46,165,133, 54,243, 61,232,220,120, 64,108, 3, 5, 33, 65,150, 52, 30,239, 30, 95,168,122, 33,137, 98, 92,127, 15, 46,128, +123, 17, 17, 17,120,247,238, 29, 18, 19, 19, 97, 96, 96,240,217,126, 79,158, 60,129, 72, 36,130,173,173,173,110, 74, 87,253,233, + 56, 23,210,198, 17,146, 78, 30,200, 28,243, 3,238,221,187,135,244,244,116,240,120, 60,240,249,124,144, 36, 89, 45, 31,139, 85, +180,226,111,137, 21,171,162,125, 60, 0,142,192, 76,114,117,247,138, 57,245, 89,207,252,184,138,132, 15, 72, 81, 82,186, 89,242, + 36, 98, 24,136, 13,164, 34,145, 65, 8,138,221,133, 0, 66, 9,130,136,106, 13,112,197, 18,225,213, 63,214,204,183, 97, 7,222, + 19, 42, 62,132, 84,200,209,171, 87,175,233, 0, 86, 48, 12,147,219,178,101, 75,235,181,107,215,154, 38, 39, 39,227,237,219,183, + 56,123,246,108, 6, 89,116,162, 4,195, 48,171, 0,160, 35, 32, 52,177, 52,185,181,243,151, 57,134,120,112,134, 95,155, 94,100, +236, 50,240,218,176, 9, 51,102,110,159, 51, 16,178, 2, 5, 78,222, 9,196,205, 55, 31, 7, 1,120,130, 42,226,222,118, 61,197, + 7, 32,163,231,208,161, 67,131, 30, 61,122,100,113,240,224, 65,144, 36, 89,225,235,224,193,131,184,251,248,205,108, 0,175,117, + 44,150, 93,253,250,245,239,190,120,241,194,210,192,192, 0,119,238,220, 65,110,110,110,169, 37,107,226,196,137, 68,110,110,238, +232, 61,123,246, 12,139,139,139,219,248,248,241,227, 44, 20,173, 5,249, 73, 71, 96,179,217, 31, 73, 82,211,212,214,165, 17,103, +196,192,174, 93, 11,179, 66, 32, 49,111,137,103,193, 31,175,230,230,100, 41,216,108,246,199,178,251,127,141,250,212, 67, 15, 61, +244,208,163,102, 32, 8,194,143, 97, 24, 47,130, 32,252,202,255, 86,254,115,201,126,190,190,190,165,223, 75,142, 89,191,126,253, +186, 50,223,229, 95,169,120, 85, 6,195,119, 47, 86,144,221, 43,218, 73,245,246, 34, 84,239,174,128,231,216, 5,252, 38,131,192, +118,116, 71, 66,200, 3, 4,223,216,130,164,240, 39, 96,104, 10,182,141,219,235, 90, 16,101,211,166, 77,161, 84, 22,133,102,169, + 84, 42,240,196,166,202,249,211,198, 10, 1,128,230, 8, 85,101, 20,172, 78,132,134, 93, 60,209, 62,141,193, 75,235, 34, 67, 69, +251,180,162,227,214, 76,154, 4, 30,143, 7, 30,143, 7,162, 56,244, 71, 23,161, 69, 20,239, 76, 23,185,175, 42, 42, 4, 33, 23, +112, 79,158, 94,225,221, 94, 16, 23,202, 87,133, 61, 67,138,138,102,174,166, 81,215,116, 41,175,129,216, 32, 89,100, 96, 16, 42, +146,136, 75,133, 22, 65, 16, 31, 1,128,225,114,143, 29, 95,229,221, 82,156, 22, 45, 86,190,186, 7,169,146,214, 84, 66,179,234, +198,141, 27, 86, 28, 14,199,134,162, 40, 36, 36, 36, 32, 60, 60, 28,219,182,109, 75, 43, 40, 40,232, 30, 24, 24, 24, 89, 86, 59, + 82, 34,254,217, 99,171,231, 52,224,132,248, 11, 85, 31,195,106,220,123, 44, 92, 7,247, 29,212,221,237,218,244,241,203, 48,248, +155, 62,152,208,189, 25, 19,155,146,173, 4,112,167,216,244, 90, 29,146, 3, 3, 3,123,119,235,214,237, 68,171, 86,173, 92, 24, +134, 65,139, 22, 45, 48,122,244,104, 28, 59,118, 12,193,193,193,200,207,207,215,220,190,125,123, 43,128,195, 58, 22,203,192,212, +212,244,230,253,251,247, 45, 13, 12, 12,112,251,246,109, 40, 20, 10,216,218,218, 98,230,204,153,252,245,235,215, 31,205,207,207, + 31,225,235,235, 43,140,141,141,221,121,235,214,173,122, 40, 90,119,238,179, 78,160, 86,171,247,159, 60,118,100,251, 76,239, 89, +246,247,159,191,189,167, 42, 44, 48,118,116, 76,204,183, 52,149, 24,110,253,109, 85, 93,181, 90, 61,189,226,250,124, 88,171,250, +212, 67, 15, 61,244,208,227, 51, 84,169, 69,202,138,167,242, 98,171, 38, 34, 13,128,194,199,199,103, 41, 65, 16,126, 62, 62, 62, + 75,125,125,125, 21, 0, 82,254, 14,145, 85, 42,180,188,188,188,252,253,252,252,224,229,229,229, 95, 41, 5, 77, 65, 19,251, 8, +154,216, 71, 16,117,154,141, 63,125,199,148, 59,121,186,214,165, 27,184,250,206,125,149, 74,197, 57,114,228, 72,105,220, 22, 0, + 80, 20,245,213, 91,177, 38, 66,171, 88,232,125, 86,136,250, 2,137,255,254,121, 35, 58,154, 83,114,174,250,201, 85, 36,171,104, +114,227, 7,141,252, 85, 46,243,123,101,156,151,231, 78, 71,226,227,187, 48,144, 72, 18,167, 62, 10, 45,181, 98, 21,139,172, 24, + 0,168, 39, 48,188,183,119,206, 96,119, 27, 30,120,234,107,231,144,162,162, 85,123,227,180,135, 43,233,108, 96, 24, 6, 49, 49, + 49,144,203,229, 8, 8, 8,192,133, 11, 23, 50, 42, 16, 89,168, 47,144, 60, 60,244,211,184, 14, 70, 5,169, 60,245,171,187, 72, + 81,209, 58,185,186, 44, 90, 12,238,194, 99, 17,183, 9, 22, 91,212,179, 99, 99,204,253,126, 8,182, 28,250,147, 84, 91,117,245, +218,126,229,250,200, 66,149,102,169,142, 34,171,212,216, 24, 24, 24,216, 44, 48, 48, 80, 0,192,115,244,232,209,215,135, 13, 27, + 6,127,127,127, 92,189,122,213, 25,128,180,120,191,213, 40, 90, 40,251,119, 0,209,149, 25, 30,121, 60,222,233,187,119,239, 54, +183,179,179,195,221,187,119,161, 80, 40, 48, 99,198, 12,181,183,183, 55,111,226,196,137, 68, 94, 94, 94,169, 37, 43, 32, 32, 32, +171, 50,145, 5, 0,201,201,201, 55, 46,156, 61,222,185, 91,183,110, 67, 26, 56, 55, 49,138, 46,200, 79, 55, 48, 16,138, 30,251, + 63,224,189,122,241,116,103,114,114,242,203,138,235,243,158,206,245,169,135, 30,122,232,161, 71,229,208, 73,139,148,179, 76,213, + 4,101,142,227,250,250,250,134,251,250,250,126, 98,241,250, 66,148,159,117,120,173,100, 76,171, 85, 30, 45, 42, 47,225,243, 19, +160,233,154,156,236,103,191,153,154,154,146, 34,145,232, 19,161, 69,235,200,153,125,233, 20,162,127, 28, 91,106,201, 42,177,108, +161,223,196, 47, 18, 90, 52, 77, 7, 0,248,164, 16, 6, 86,141,199,108, 29,232,210,165, 89, 3,123,150,246,236, 54, 36,201, 73, +229,138,247, 26,229,187, 2,102, 80, 68, 5, 65,214,165,156,164, 22, 66,177, 40, 94, 36, 17,151, 23, 89,113, 0, 32,182,118, 30, +182,177,127,147,238,110, 77, 26,178,200, 51,155,145, 44,215, 22,250, 68,104, 52,209, 50,230, 98, 37,117,184,162, 79,159, 62, 43, +204,205,205,133,219,183,111, 55,118,116,116, 4, 73,146,234,242, 34,203,192,170,241,152,109,131, 93,187, 52,182, 49,101,105,207, +239, 64,162,130,146,111,139,214, 30,213, 69,100, 89, 24, 75,110,237, 93,247,163,200, 64,192,133, 82,169,196,250,221,231,113,251, +105,152, 87,102,216,229, 91, 0,110,125, 65,135,156,234,229,229,181,101,245,234,213,208,106,181,152, 50,101, 10, 62,126,252,120, +251,253,251,247,219,234,214,173,187,240,167,159,126,178,179,177,177,193,200,145, 35,121, 90,173,118, 98, 37, 28,191,157, 60,121, +210,203,205,205, 13,254,254,254,200,205,205,133,173,173, 45,188,189,189,249,190,190,190, 71,243,243,243, 71,172, 91,183, 78, 24, + 19, 19, 83,165, 37,235,147,126, 77, 81,107,246,109,249,113, 97,187,142,238,172, 15, 31, 34,201,132,246, 30,172, 7,119,175, 62, + 50, 55, 55, 63,154,144,144,240, 87,125, 14,105, 81,227,250,212, 67, 15, 61,244,208,227,235,128, 32,136,107,197,113, 87,159, 88, +185,202,139,176, 18,139, 85,217,239,229,247, 47,222,254, 53, 30,150,247, 87, 32,188, 62, 77,239,224,229,229,165,243,180,122, 90, +150,161,147,120, 42,143,111,154, 64,107, 47, 1,103,169, 7, 11, 60,177,169,114,224,234, 59,247, 43,219, 87, 44, 22,235,108,209, +162, 85,202,234, 26,165, 70, 66,171, 56, 70,235, 38,195, 48,159, 8, 45, 99,235,198, 30,139,127,154,179,213,125, 88, 63, 86,218, +247,157,144, 91,168, 82,253,244,150,164,147,228, 85,139,172,162, 81, 92, 27,107, 32,150,132, 10,197, 6,101, 69, 86, 2, 0, 8, +173, 26,182, 95, 52,119,230,238, 30, 99, 6, 18, 25, 51,220,145,147,171, 80, 45, 12, 39,137,100, 5, 51, 34, 2,120, 80, 17,221, +253,251,247,247, 1,216,231,225,225,145, 38, 22,139, 81, 88, 88,248, 89, 27,148,148,183,203,176,126,172,180,169, 29,144, 45,211, +168,126, 10, 39,145,162,160, 79, 87, 39,178, 44, 77, 12,111,237, 93,251,163, 65, 74, 82, 28,120, 60, 30, 36, 18, 9,238, 60, 9, + 69,102,248,149, 47, 17, 88, 96,177, 88, 43,125,124,124, 86,204,156, 57, 19, 89, 89, 89,184,122,245, 42,190,249,230, 27,156, 58, +117,202,241,250,245,235, 91, 60, 61, 61,193,102,179,225,231,231, 7,173, 86, 27, 85, 9,205,144,105,211,166, 45, 28, 54,108, 24, + 94,190,124, 9,169, 84,250,137, 37, 43, 55, 55,119,244,238,221,187,135,197,198,198, 86,107,201, 42,135,246,245, 27,182,230, 45, + 89,190, 9, 42,121, 58, 39, 35,249,185,255,189, 59,172,103,217,217,217, 6, 0,242,106, 91,159,122,232,161,135, 30,122,232,108, +213,170, 76,139,100, 20,139,168,140,138,190,151, 17, 88, 21,125, 39,202, 89,193,212,229,182, 7,255,157,231,164,147, 69,139, 99, +237, 10, 50, 45,172,140,208, 74,255,100,187,208,208, 76, 39,215,161,150, 4,103,239,225,210, 60, 90,194,172,172, 44,161,133,133, +133,178,172, 64, 48, 48, 48,128,157,157, 29,114,114,114,176,127,255,126,160,250,160,104,210,104,216,120,180, 31, 51, 5,175, 28, +248, 96,180,154, 82,203,214,222, 73,147, 62, 17, 91, 60, 30,175, 36, 54,172,186, 65,247, 69,177,165,233, 25, 0,166,181,115,131, + 95,133, 98,241, 36,161, 69, 29,139,185, 63, 78,229,198,166,171,112,223,125, 73,238,249,223, 22, 75, 18, 25,201,204, 4,228, 61, +173,134, 47,250,219, 61,199,203, 91,178,146, 90, 57, 55, 88, 38, 52, 16,126,207, 55,171,103,227, 51,255, 71,110,108,154,138,184, +223,254,167,252, 11,191,255,100, 16, 3,195,133, 73,200,125,160, 67,243,172,248,230,155,111, 86, 48, 12,195,208, 52,189, 28, 0, +202,150,119,190,247,247,220,232, 84, 37,238,185, 47,203,185,240,219, 98,195, 68, 84, 93, 94,139, 22,131,187, 88,155, 26,221,218, +187,110,166,129, 52, 57, 30, 2,129, 0,134,134,134, 72, 76,203, 3,151,195, 86,124, 97,127, 19,116,237,218,117,241,143, 63,254, +136,208,208, 80,204,152, 49, 67,154,144,144,112,241,204,153, 51, 51,126,249,229, 23, 78,223,190,125, 33,149, 74,177, 97,195, 6, +237,147, 39, 79,214, 1,216, 80, 97,127,228,112,166,254,250,235,175, 76, 74, 74, 10, 17, 19, 19, 3, 91, 91, 91,204,154, 53,139, +191,110,221,186,210,152,172,154, 88,178, 74,144,156,156,236,127,251,238, 51, 12,186,177, 21,164, 86,229,159,155,149,240,232, 93, +116,142,191, 25,159,191,192,190,117,139, 90,213,167, 30,122,232,161,135, 30, 95,197,138,245,170,170,239,255, 5,168,200,117,168, +147,208,138,218,177,108,178,243,228,153,139, 32,114,236, 2, 85,196, 37,208,133,105,165, 22, 45,161,196, 20,102,117, 93,144, 43, + 83,225,220,189, 55, 0, 16, 85,147, 82, 21, 20, 20,160, 77,155, 54,216, 53,177,113, 15,101, 65,150, 80, 4, 64, 37, 48, 82, 94, +230,119,189,127,253,250,117, 57, 77,211,167, 1, 92,175,134,102,101,243,230,205,119,110,218,180,137,239, 50,102, 50, 10,159, 63, + 46,111, 65,129, 72, 36,130, 64, 32, 64, 72, 72, 8,238,223,191,175, 6,176,178,154, 6,125, 65,146,100,240,153, 51,103,146, 26, + 53,176,239,215,166, 85,203,217, 75,151,248, 24,190,125,124, 27,203,215,237,164, 27,181,237,155,183,254,212,229,130, 60, 73,221, +158, 10,233,251, 32, 29, 78, 53,184,156,200, 74,105, 90,191, 78,143, 86,174,205, 23, 45, 95,190,204, 40,252,241, 29,252,242,251, + 94,198,217,173, 87,222,239, 23,174,228,103, 26,212,235,163, 76,127,247, 82,151, 58,244,247,247,223, 7, 96, 95,201,247,242,229, +245, 89,189,141,110,220,174, 95,206,250, 83, 23,100,249,134,117,123, 85, 85, 94, 75,151, 33,157, 29, 44, 77,111,237, 88,243,131, + 65,106,114, 2, 4, 2, 1, 36, 18, 9, 18,164,185, 88,177,245,172, 76, 67,211,253,190, 84,104, 25, 26, 26, 10, 52, 26, 13,118, +237,218,133,132,132,132, 78, 0, 18, 94,191,126,189,119,212,168, 81,219, 91,180,104,209, 52, 60, 60, 60,170,176,176,112, 38,128, +119,149,145,152,152,152,116,178,180,180, 36,158, 61,123,134, 31,126,248, 65, 61,107,214, 44,222,132, 9, 19,136,156,156,156,218, + 90,178, 0, 0,246,246,246, 30,189,123,118, 68,151,222, 51,252,213,202,220, 71,177,239,142,250,179,152,167,194,218,214,167, 30, +122,232,161,135, 30,255, 26,212, 46, 49,184, 7,192,105,108,142,233,205,237,121,169,199,126,155,197, 20, 68, 7, 48,138,151,251, +152,252, 75,223, 51,215, 54, 76, 96,174,239,152,203,204, 24,208,156,105,106, 69,164, 54, 54,199,116,143,207,133,219, 39,171,123, +127,211, 4,218,222, 13,193,244,110, 8,102, 64, 99,104, 1, 44,109,221,186,245,101,239,246,127,229,209,242,110, 15, 6,192, 15, + 0, 36,149, 20,171,162, 21,195,109, 1,236,111,211,166, 13,249,224,193, 3,230,253,136, 94, 76, 96, 83, 11,102,230,204,153,204, + 47,191,252,194,140, 29, 59,150,177,180,180, 36,139, 43,194,182, 58,206, 65,131, 6, 57, 0, 64,157, 58,117, 76,218,186, 52, 74, + 13,185,119,149,121,116,108, 59,115,200,123, 40,211,161,133, 75,166, 77,211,110,193, 34,219, 38,173,170,169,190, 82, 78, 27, 27, +155, 37, 12,195,244, 99, 24,198, 22, 0,156,157,205, 37,173,155, 54, 74, 9,190,123,149,121,124,124, 39,115,200,123, 40,211,177, +101,179, 44, 7, 23,207,119, 66,171,166,237,117,225,172, 8, 21,150,215,181,105,166,117,163,206, 65, 85,148,183,148,179, 65,251, +145, 87,146, 82,210,152, 23, 47, 94, 48,215,175, 95,103, 30, 63,126,204, 28, 59,115,133,169,219,110, 68,161, 69,139,193, 93,106, +208,117, 42, 43,167,241,128, 1, 3,152,168,168, 40,166,127,255,254, 12, 0,227, 90,114, 94,142,141,141,101,194,194,194,152,165, + 75,151, 50, 0,142,252,248,227,143,138,188,188, 60,166, 87,175, 94, 9,197, 2,139, 83,155,114, 58,213,183, 95, 63,100, 96,215, +149,222, 63, 12,243,248,210,250,252,138,208,115,234, 57,245,156,122,206,127, 3,231,255, 50,108,139,173, 90, 37,239,173,117,202, +163,229, 15,144,200,194, 62, 87, 43,205,137,117, 27,118, 44,216,181,239,200,162,197,179,167,138,187,186,247, 70,232,221, 63,112, +193,239,140, 76,169, 82,111,224,177,177, 41, 44, 11,242,200,106, 74, 81,156, 71,235, 19, 4, 6, 6, 26,152, 53,252, 43, 7,211, +135,162,220,172,123,107,120,130, 82, 0,211,222,188,121,179,201,211,211,115,237,247, 93,218, 15,245,238,220, 3, 90,173, 22,199, +142, 29, 67,124,124,252, 69, 0,203,116,181,184,133,134,134,102, 54,107,232, 56,135,203,230, 44,154, 57,118,136,101,198,199,183, + 72,138, 8, 4, 0,168, 84, 10,109,106,212, 35,183,154, 20, 78, 36, 18,189,176,180,180,124,111,105,105,153,211,184, 65,157,105, + 2,112,151,207, 24,253,173, 85, 86,236, 59, 36,134, 23,121, 70, 85, 74,185, 38, 41,234, 65,211,218,180,174,163,163,163, 64,204, +197,244, 10,203,171, 86,106,211, 62,188,107,165, 11,143, 92,165, 94,183,106,203,177, 62,107, 22, 77, 18, 24, 25, 25,225, 77,216, + 7, 44,223,124, 74,166, 80,107,251,101,134, 94,254, 42,238, 49,134, 97,160,213,106,117,158,232, 80, 9, 22,187,185,185, 53, 89, +187,118,173,243,196,137, 19,241,165,150,172,178,136,142, 77,246,177,175,227,212,236,195,251, 55,158,102, 34,222,137, 47,169, 79, + 61,244,208, 67, 15, 61,254, 53, 24, 80,108,204,153, 86,230, 61, 16, 58, 62,245, 35, 44, 29,114, 0,171, 27,176, 11,247, 46, 89, +187,101, 5,139,216, 58,137,102,152, 63, 72, 22, 86,197,100, 33,227, 11, 11, 39,231,114, 64,246, 25, 60,150, 3, 0, 92, 78,237, + 6,200, 98, 68, 1, 24,118,224,233,203,118, 7,158,190,252,185,248,183, 53, 0,106,228,203, 53,228, 32,204,189,153,147,125,215, +214,205,133,108, 74,129,164,136,143,200,150, 41,113, 39, 60, 62,151,197,176,254,168,105,161, 98, 98, 98, 30, 2,128,181,177, 65, + 68,215,102, 13,235,118,107,211,220,128, 75,168,145,244,246, 13,242, 20,106,220, 14,143,207, 3, 65,212, 58,160,250,107,149, 55, + 45,244,202,171, 63, 65,244, 34, 8,226,238, 82,239, 49,130, 21,155, 79,127, 85,145, 5, 64,158,156,156,156, 37,151,203,205, 83, + 82, 82,212,168,125,146,184, 15,249,249,249, 45,230,206,157,187,122,225,194,133,139,126,251,237, 55, 94,109, 98,178, 42, 67, 78, +114,252,165,110,205,191, 94,251,235,161,135, 30,122,232,241,175,192,180,114,239,208, 89,104,149, 10,134,116,100, 0,152,233,228, +196,204,143,142,134,250,107,149,172, 34, 75,215, 23,226, 21,128,129,181, 62,154, 69, 20, 60,143,138, 47,124, 17, 21, 95, 8,154, + 97,104,134, 81,177, 88, 72,148,105, 52,235,162, 98,146,107, 63,235,142, 32,168, 87, 31, 18, 20,175, 63, 38, 42, 25,154,102,104, +134, 81, 19, 4, 82,181, 90,122, 93,120, 76,252,149,255,134,242,102,134, 94,126,234, 71, 18, 93,159,190, 8,155, 47,147,105,118, +102, 70, 92, 14,248,138,237,162, 13, 13, 13, 29,215,169, 83,167,201, 20, 69,237, 5,160,253, 2, 46, 53, 73,146,139,215,175, 95, +127, 49, 52, 52,244,108, 64, 64,128,244,107,136,172,191,181,253,245,208, 67, 15, 61,244,248,167,162,118,139, 74, 87,134,175, 41, +178,254, 27, 17,246, 33,174,205,223,193, 27,254, 33,206,245,127,161,188,105, 17,151, 94,167, 1,163,255,166,234,189, 77, 81,212, +237,175, 41,170,111,222,188, 89, 31, 21, 44,171,243,223,214,254,122,232,161,135, 30,122,252, 99, 49,173, 50,241,197,209,215,141, + 30,255, 0, 48, 95, 75,100,233,161,135, 30,122,232,161, 71, 45, 80,169, 69,139, 64,229, 51, 7,238,214,224, 15,106, 51,251,224, +174,158, 83,207,169,231,212,115,234, 57,245,156,122,206,127, 29,231, 63, 17,182, 40, 10,136,191, 86,252, 14,134, 97,246,255, 39, +254, 88, 63,245, 85,207,169,231,212,115,234, 57,245,156,122, 78, 61,231, 63, 29,159, 5,194,151,164,119, 96,233,235, 70, 15, 61, +244,208, 67,143,191, 17,130,226, 87,109,183,235,161,199,255,162,216, 42, 21, 92,181,137,209,106, 84,252,254,225,111, 44,172,183, +173,173,237,180,150, 45, 91,186,240,120, 60, 86, 65, 65,193,170, 7, 15, 30,172, 44,191, 83,215,102,156,215,108, 22, 28,254,250, +133, 0, 8, 54,192, 98,129, 98,144,244, 56, 68,209, 86,223,238,255,213,112, 20, 25, 89,254, 73,176,216,124,138,212,128,210,106, + 80, 20,110, 85, 4,154, 38,227, 41,141,170,111,101, 7,219,184, 13,169, 75, 82,244,111, 0,179, 11, 96,253, 8,208,187, 9,112, +102, 48, 32,247, 16, 96,255, 0, 54,243, 59, 40,226, 39, 14,151,189, 68, 26,120, 62,241,159, 80, 97,231,206,157, 99,127,201,241, + 35, 70,140,168,112, 1, 81, 59, 59, 59, 63, 3, 3,131,134,149, 29, 39,147,201,164, 82,169,212,243, 31,222, 31,187, 1,216, 1, +160,121,185,223,223, 1,152, 3,224,222,151,254,129, 7,192,177, 6,166,243,128,159, 0, 64, 3,252,158, 6,236,243,255, 47,138, + 49,180,180,180,124,196,225,112,156,101, 50,153,172,160,160,192,201,208,208, 48, 90, 44, 22,139, 73,146,140,202,200,200,232, 86, + 67,186, 31,241,215, 82, 90,139, 0,236,174,225,118, 61,244,248, 95,193, 23,205, 58,108, 92,116,127,128, 7,128,110,237,218,181, +179,150,201,100,120,247,238, 93, 26,128, 71, 0,252,139, 95,145, 95,163,164, 44, 22,107,227,150, 45, 91, 22,204,154, 53,171,116, + 49,232,144,144, 16,184,185,125,158, 35,148,205,130,195,131,171,119,173, 94,133, 70,162, 93,175,225,197, 66,139, 5,200,164,240, +236,221,190,182, 69, 48, 52, 53, 53, 93, 69, 16,196, 8, 22,139, 85,237,160, 70,211, 52,197, 48,204,185,156,156,156, 21, 0, 10, +106,242, 71, 98, 3,129,150,164,168, 10,255,131,195,102, 83, 50,185,170,210,180, 23,102,102,102, 1, 44, 22,171, 65,217, 5,179, +129, 79, 23,208,174,108, 27, 73,146, 73,153,153,153,186,136, 80, 33,139,195,155, 67, 16,188,222, 96,209,141, 1, 2, 4, 88,145, + 52,165,190, 67,147,154,109, 0,148, 95, 34,178,108,235, 56, 61,158,183,108,189, 67, 88,196, 59, 44,245, 30,139,223,118, 28,193, +146, 57,147,177,109,255, 41,204,153, 54, 6,205,154, 53, 71, 85,203,138,211,224,173, 91, 54,123, 68, 47,223, 93,103,221,151,204, + 28, 33,240,221,117,174,235, 82,239, 81,252,117, 59,207,118, 93,234, 61, 82,224,187,243,172,251,146,217, 35, 68,235,118,159,167, + 1,140,175, 77, 33,199, 56,219,201, 8,146,172,240,105,155,225,112, 84,167,162, 82,196,255, 31, 87,244,196,137, 19, 91, 42, 20, +138, 55, 99,123,183, 94,223,170,177,125,114, 69,251,100,165, 38,219, 71,191, 15,244,225,242, 68,109,190,245, 57, 18, 82,165,201, + 65, 32,104,240,238,221, 59,103,154,166, 65, 81, 20, 72,146, 44,125, 87,171,213,232,214,173,219,215,154, 56, 51, 16,192,170,162, +139, 21,190, 0,206,126, 1,151,132,195,225,204,227,243,249, 30, 36, 73,186, 0, 0,151,203,141, 80,169, 84,254, 36, 73,110, 1, + 80, 88, 67,190,173,201,201,201,205, 36, 18, 9, 52, 26, 77,233, 2,244,108, 54,187,105,221,186,117,119, 41,149, 74,231, 47, 61, +121,107, 96,122,103,119,247,109, 19, 22, 44, 96, 43, 30, 61,194,182,195,135,183, 34, 63, 31, 0,118, 85,119, 44,159,207,191,197, + 98,177, 28,107,242,127, 52, 77,199,171,213,234,190, 53, 57,134,195,225, 56,167,164,164, 88,217,217,217,161,160,160, 0, 98,177, + 88, 92,242,189, 22,150,172, 13, 12,195,136,138,239,237,219, 58,118,236,216,137, 32, 8, 18, 0, 67,211, 52,235,197,139, 23, 99, +104,154,230, 20,223,159, 54, 0, 56, 12, 64,165, 31,179,245,248, 31,181,102,237,175,169,208,186, 14,192,163, 93,187,118,162,209, +163, 71,195,195,195, 3,206,206,206, 16, 10,133, 69, 55,241,172, 44,235,160,160,160,145,143, 30, 61, 26,121,245,234, 85,188,125, +251, 86, 1,224, 9,128, 10, 47,234,158, 94,238,179,132, 18,193,118, 0,200, 72,202,146, 38,197,164,111,151, 74,165, 27, 0,148, + 77, 17,238, 52,126,252,248,249,179,103,207,134,159,159, 31, 78,157, 58, 5,149, 74,133,130,130, 42,244,139, 60, 29, 57,247,215, + 3,226, 88, 32,193, 31, 48,176, 2,196,214,181,174, 41, 83, 83,211, 85,115,230,204,153,219,172, 89,179,210, 44,230, 90,173, 22, + 36, 73, 66,171,213, 34, 39, 39, 7,243,231,207, 47, 26,104, 25, 6, 52, 77,227,198,141, 27,179,166, 77,155,134,156,156,156,121, + 21,113,118,108, 83,231, 53,139, 96, 57,148,216,106, 24,138, 74,122, 30,148,212,150,164, 40,182, 82,169,169,112,165,114,161,144, + 87,165,200,227,114,185, 14,111,255,252,211,138,197,231,131,161, 40,128,166,193,208,116,113,117, 22,191,152,162,223, 24,138, 6, +163,165, 64,147, 52, 72,133, 10,237,127,252, 81,151,170,232,204,229,139, 78,141,251,126,129, 77,135,142, 29,185,245,234,216,129, +164,104,124,140, 77,178,121,243,250,121,151,115, 71,119,205, 80, 43, 10,198, 0,168, 85,158, 45,190,129,209,237,157,123, 14, 56, +188, 10, 10,195,189, 7,143,112,247,190, 63, 0,224,214,131,128, 18,193, 93,109, 83,129, 44,108, 49,103,202, 96,193,250,157,167, +185,115,166, 12, 97,255,182,243, 12,119,246,228,111,217,235,183,159,226,205,158,252, 45,123,253,142, 83,188,217, 83, 6,179,125, +183, 29,106, 9,192, 20, 64, 78,101,100,149,181, 17, 65,146,130, 19,209,105,108, 0,200,216,187, 23,218,244,116,216,173, 88, 1, + 0, 24,231,100,173,179,187,195,194,194,226, 53,151,203,117,168,110, 63,173, 86, 91,173, 8,158, 56,113,162,155, 66,161,120, 77, +146, 36,195,225,112,124,198, 14,233,115,185, 95, 87,183,172,178,251,132,132, 4,155,175, 91,247,231,224,179,111, 10,152,145,109, + 12,223,248,109,156,216,214,107,225,145,224, 42, 6,100,150, 74,165, 66, 84, 84, 20,202, 46,242, 94, 6, 84,109,159,157, 0,108, + 51, 55, 55,239,144,149,149, 53, 14,192,210,252,252,252,150,108, 54, 27,102,102,102, 75,213,106,245, 71, 99, 99,227,131,121,121, +121, 1,197, 86, 35, 93,151, 12,232,102,100,100,116,236,210,165, 75,166,173, 91,183,102,101,102,102,162,126,253,250,200,206,206, +110,255,232,209,163, 54, 83,166, 76,153, 82, 80, 80,240, 93,241,195,160,174,104, 98, 96, 96,192, 76,152, 48,129,160,168,191, 78, +247,208,161, 67,232,235, 74, 54,180, 52, 49,144, 43,213, 76,222,189, 40,227, 31,120, 60,222,147,248,248,248,188,154, 86, 6, 15, +248,105,194,130, 5,108, 73, 92, 28, 36,193,193, 24,151,159,207,249,173,200,186, 85,173,208, 98,177, 88,142,199, 78,253,225,204, +231,243, 65,146,100,169, 24, 44,185, 71,105,181, 90,104, 52, 26,104,181, 90, 80, 20, 5,173, 70, 11,223, 53,191,215,250, 94,104, + 96, 96, 96, 96,107,107,155,102, 96, 96, 96,240, 53, 70, 33,129, 64,192, 57,122,244,232, 24, 62,159, 15, 0, 80,171,213,112,117, +117, 37,244,227,179, 30,255, 48,177,245,153,149,171, 42,161,213, 63, 63, 63, 31, 20, 69,193,208,208, 16,108,246,167,227,190,185, +185, 57,122,247,238,141,110,221,186, 97,244,232,209,120,251,246,173,104,244,232,209,189, 43, 35, 27,187,192, 11,117,156,173,139, + 7, 19,218,246,233,181,160,245,135,126, 61,111,153,154,154,186,160,204,110, 83,166, 79,159, 78,100,101,101, 97,196,136, 17,143, + 84, 42,213, 32, 0,249,149,113, 82, 52,146, 60, 71,143, 3,205, 16,162, 45, 47, 14, 16,106,165,130, 97,177, 88,138, 18,215, 97, +109,106,137, 32,136, 17,118,118,118, 56,125,250, 52,212,234,207,211,133, 25, 25, 25, 33, 60, 60,252, 47,171, 26,155,141,142, 29, + 59,178, 9,130, 24, 1, 96, 94,197,156, 44,135,167,175,226,172, 74,190,123,245,110,206,235,216,134,149,150,146, 38, 99, 0, 16, +203,150, 45, 43, 21,110, 0,176,106,213, 42, 93,202, 9, 22,151,139, 12,127,255,191,110,196, 28, 22, 88, 60, 2, 4, 23, 96,113, +138,188,168, 96, 0,134, 2,104, 18,160,181,128,208,182,142, 46,213,208,222,190,174,179,223,186,205,187, 77, 84, 90, 6,167,175, +220, 67,108,108, 12,216, 44, 22,156, 26, 58,163, 79,247,174,220, 54,237, 58,213,249,125,229,130,171, 41, 9, 31,250, 3,120, 89, +227,138,166, 25, 97,195,186, 22, 56,120,232, 13, 44, 77, 37, 24, 49,248, 27,136,132, 2,252,182,227, 15,172, 89,226, 13,103, 39, + 71,236,219,186,182,210,195,141,141,141, 87,187, 56, 55,116,220,125,244, 26, 92,154, 54,101,239, 62,118, 13, 46,205,138,223,155, +187,176,119, 31,187,134,102,205,155,177,119, 31,187,134,150,205,155,212,123, 45,125,177, 58, 59, 59,219,187,242,250, 44,215, 70, +125,138,218,136, 91, 72,151, 14, 4,113, 51,102, 0, 64,169,208,170, 9,184, 92,174, 67, 74, 74,138, 85,117,251, 85,103, 53, 40, +182,100,189, 38, 73, 18,233,233,233, 68,110,110, 46, 99, 98, 98, 50,248,230,190,165,151,250,186,187,101, 3, 64,112,112,176,153, +175,239,186,193,103, 94,231, 67,241,124, 39,113,226, 79,127,122,220, 32,143,215, 87,214, 79,108,131,226, 37, 33,202, 67,165, 82, +197,182,106,213,138, 41,254,108, 47, 16, 8,120,229,250,155, 93,163, 70,141, 62,179, 90,235,224, 82,220,246,236,217, 51,239,102, +205,154,161,105,211,166, 1, 29, 58,116, 48, 18,139,197,184,121,243, 38, 92, 92, 92,154, 27, 25, 25,189, 56,119,238, 28,119,241, +226,197,110,135, 15, 31, 6,128, 89, 58, 84,103, 47, 79, 79,207,211,126,126,126, 66, 30,143, 7,133, 66,129,240,240,112, 24, 27, + 27,131,207,231,227,219,111,191,101,119,233,210,197,188,123,247,238, 23, 34, 35, 35,199,160, 6, 51,160,148, 74, 37,179,116,233, + 82, 24, 24, 24,192,192,192, 0, 98,177, 24, 98,177, 24, 18, 33,136,189,115,234,138,102,239,207, 21,205, 91,177,119,253,177,221, + 43, 31,212,169, 67,255,146,152,152,152, 91,211,190,160,120,244, 8,146,224, 96,160,204,181,171, 43,140,197,102,240,241,241,169, +206, 34, 5, 30,143,135,206,157, 59, 87,203,103,102,102,118,145,195,225,124,242,100, 74,146,164,208,199,199,135,138,140,140, 20, +179, 88, 44, 49, 77,211,240,241,241,161, 72,146, 20, 90, 89, 89, 5,208, 52,157,150,153,153, 57, 84,135,226,170, 0, 44, 98,177, + 88,219, 4, 2, 1,167, 94,189,122,241,203,151, 47,127, 86,108,205, 4,195, 48,172,122,245,234,181, 23,137, 68,142, 42,149,138, + 68,145,235, 80,111,205,210,163, 66, 48, 12,211,166,200, 40, 92, 10, 53, 0,126,241,231,172,162,209, 14, 22,229,126, 7,128,204, +226, 7, 69,235, 74,190,103, 1,120, 11,160, 9, 0,171,226,109,175, 8,130,200,174, 69, 49, 43,183,104,249,249,249,149, 62,194, +122,121,121,149, 14, 44,134,134,134,120,245,234, 21, 8,130,128,161,161, 33,140,140,140, 96,108,108,140,252,252,124,188,125,251, + 22,239,222,189, 67, 92, 92, 28, 8,130,128,147,147, 19, 74, 46,160, 50, 40,189,193,157,220,228, 7,161, 68, 0,130, 0, 90,247, +104,137,150,221, 92,209,238,101,244,156,215,119,137,253, 82,169, 52, 10, 0,199,213,213,117, 74,199,142, 29,177,121,243,102,168, + 84,170,205,149,136,172, 82,206,199,111,201,182, 0, 96,107,107,187,240,248,205,143, 6,227,251, 53,148, 75,165,210,141,181,168, +156, 79,110,196,153,153,153, 58,175,197, 71,211, 52,114,114,114,170,228, 44,111, 33,216,178,109,167, 73, 65, 94, 26,126,253,237, + 56,180, 90, 45, 22, 44, 88, 0,154,166, 75, 95,185,185,185, 58,149,147,161,168,207,109, 7,172, 34,239, 41,193, 1,234,142, 42, +210, 21, 9,167,119,130, 96, 0,130, 2,240,249,121,149, 31,132,132,108,158,232,204,202,223,182,155, 4,190, 75,194,149,123,129, +208,228, 39, 67, 26,124,169,200,228,216,121, 12,206,170,216,232,208,178, 33,230, 46,251,221,244,231,185,223,157, 81, 43, 10,154, +226, 83, 55,226,221,234, 47, 26, 10,191,174, 94,141,253,219, 55,227,247,205,219,145,159,151, 11, 46,215,162,248, 70, 79,129,162, +168,170,207,157, 97,250,249,204,153, 68,252,182,231, 34,218, 55,179,197,133,155, 47,225,222,202, 17,151,110,191, 70,183, 54,245, +113,229,110, 32,122,116,104,136,235,254, 97,152, 59,125, 12, 49,230,214,225,126, 53,105,163,173, 91,119,154, 20,228,167,193,111, +237, 81,164,239,218,133,120,111,111,180, 47,222,231, 37, 65,128,231,224, 0,240,170,111,163,242,136,136,136,128, 74,165,170,232, +105, 31, 46, 46, 46,213,182,187, 66,161,120, 67,146, 36,147,150,150, 70,164,165,165, 65, 44, 22, 19,225,225, 97, 84,243,230,174, + 67,152,119,231, 15, 0,128,175,239,186, 33,103,223,228, 67, 30,176, 29,138,103, 59,192,171, 31,194,218,191,106,186,102,218,138, +125,111,202, 92,163,159,148, 51, 53, 53,181,127,106,106, 42, 0,160, 65,131, 6,239, 34, 35, 35,155,148,184,154,139, 93,136, 60, +146, 36,157, 75,220,137, 36, 73, 66,165, 82,161, 87,175, 94,236,170,206,221,212,212,180,163,139,139, 11, 2, 3, 3,177,125,251, +118, 51, 79, 79, 79,124,248,240, 1, 4, 65, 96,221,186,117, 68,179,102,205,184,153,153,153,232,219,183, 47, 46, 94,188,216, 57, + 63, 63,191,186,250, 52, 20,139,197,135,175, 94,189, 42,100,177, 88, 40, 40, 40, 0, 77,211,232,210,165, 11, 88, 44, 22,194,194, +194,176,108,217, 50, 92,188,120, 17,151, 47, 95, 22,181,105,211,230,176, 92, 46,119,193,167,110,253,202,218,136, 81, 42,149,140, + 64, 32,128, 64, 32,128, 80, 40,132, 80, 40, 4,159,207, 71,161, 18,152,182, 37, 94,197, 22, 90,208,205, 91,185, 55,156, 52,123, + 29,107,227,242,201,247, 1, 92,209,181,207, 3, 69, 49, 89,219,254,248, 99,251,184,188, 60, 22, 0, 28, 36, 8, 90,195, 48,191, +235,114,189, 3, 64,161, 50, 15,142, 78, 14,184,112,230, 50,134,141, 26, 92,161,200,226,114,121,224,113,185, 48, 50, 19, 87,203, +201,227,241,172,223,189,123,103,206,229,114,193, 48, 12, 40,138,130, 70,163, 73,251,249,231,159, 45, 7, 12, 24, 96,120,227,198, + 13,214,128, 1, 3,104, 83, 83, 83,217,203,151, 47,211, 73,146, 52,239,218,181,107, 77,250,252,238,150, 45, 91,182,190,116,233, +210,100, 31, 31,159,215, 11, 23, 46,252,181,236,198, 13, 27, 54,172,190,126,253,186,227,144, 33, 67,142, 5, 7, 7,239,174,201, + 61,228, 75,239,243,122,206,255, 62,206,202,180, 72, 49,172, 9,130,240, 43,115,207,246, 42,249,238,227,227,179,212,215,215, 55, +156, 32, 8,191,178,191,151,236, 87,252,176,232, 87,209,247,226, 99,205,150, 44, 89,226,186,126,253,250,117,157, 58,117, 58, 29, + 16, 16, 16, 3,160,166, 66,171,234, 24,173,146, 19, 42,123,146,229, 6, 53,228,231,231, 35, 63, 63, 31,137,137,137,216,187,119, +111,241, 5,205, 5,135,195, 1,135,195, 41,141,103,168, 12,247,252,158,236, 0,176,163,117,235,214,220,208,103,231,110,252,180, +127,118,207,182,189, 90,179,223,220, 11, 29,142,162,245, 8,251, 79,152, 48,193, 2, 0,142, 30, 61,154, 9,224,198,255,147,106, + 62, 23, 21, 21, 53,215,214,214,182, 52, 70,165,172,251,144, 36, 73, 8,133, 66,148,196,178, 40,149, 74,236,221,187,151,100, 24, +230, 92, 21,156,136, 12,191,143,168,240, 7, 69,199,209, 52,104,234,175,227, 87,174, 92, 89, 58, 13, 20, 0,102, 20, 91, 78,170, + 21,121, 21,213, 57, 83,238,189,220,239, 12, 69, 85,227,158,224,205, 30,254,157,183, 45, 77,112,240,231,253, 32,112,185, 92,208, +101,172,153, 92,118,209,211,114,248,135, 20,216, 89, 55,199,160, 49,211,109, 46, 29,219, 57,155,212, 40,127,171,105, 93, 55,109, +217, 9,115,230,206,197,129,253,251,177,108,197,234, 82, 5, 64, 82, 20,200,106,203,201, 98,245,234,226, 10,178, 48, 5,108, 54, + 27, 61,218, 55, 4,155,205, 70,239, 78,141,193,102,179,209,183, 75, 83,112, 56, 28,244,115,111,134, 70,141, 26,129,195,225,176, +170,105,119, 68,134,223, 67, 84,248,195, 50,162,151, 1, 3, 64, 35,149,126,182,191, 86, 42, 5, 83,215,188,166,125, 11, 83,166, + 76,201, 77, 76, 76,212,148,223, 86,167, 78, 29,222,163, 71,143, 76, 42,113,219,149, 66, 36, 18,181,225,112, 56,111,178,179,179, +105, 3, 3, 3, 22, 77, 83,116,243,230,174,236,155,251,150, 94, 42,217,103,201,146,165,151, 70,182, 49, 26,114,252,156, 31,195, +171,231, 78, 16, 92, 1,249,253,138,125, 60, 46, 79,212, 6, 80,232,242,240,192, 82,169, 84,120,255,254, 61,170, 43, 15,195, 48, + 85,186,126,114,114,114, 38,184,184,184, 60,218,177, 99,135, 25, 65, 16,120,252,248, 49,216,108,118,233, 43, 58, 58, 26, 44, 22, + 11, 63,253,244,147, 38, 63, 63,127,106,117,101,227,112, 56,115, 47, 92,184, 96,204,231,243, 81, 80, 80, 80,122,221,176,217,108, +188,123,247, 14, 27, 55,110,196,132, 9, 19,144,144,144, 0, 59, 59, 59, 44, 88,176, 64,178,126,253,250,185, 26,141,102,181, 14, + 77, 20,162, 86,171,219, 26, 24, 24, 64, 40, 20,162, 68,112, 1,192,237,112,110,152, 66,161,104, 97,110, 46,183,177,244,247,251, +179,179,231, 32, 55,115, 75,219, 78, 82,169,244, 74, 77,250,192, 71, 96,127, 44, 69,253,220,255,210, 37,171,167,151, 46,209,207, +175, 94, 77, 18, 20, 20,236,211,185, 15,105, 89,136,143, 78, 66,155, 54,109,240,230,205, 27,180,105,211,166,172,104, 2,159,207, + 7,143,199, 3,143,199,131,133,169, 78, 33, 20, 12,139,197,194,211,167, 79, 65, 81, 20,212,106, 53,212,106, 53,154, 53,107,150, +253,224,193, 3, 9, 0, 68, 71, 71, 51,227,199,143,207,125,241,226, 5, 90,181,170,122, 61,117,107,107,235, 71,108, 54,187, 94, +217,223,178,178,178, 76,135, 14, 29,138,156,156,156,111,134, 14, 29,234, 94,124,253, 38,159, 63,127,126, 60, 0,240,249,124,176, + 88, 44, 10,122,252,235, 81,157, 22, 41, 43,148,202, 11, 46, 95, 95, 95,175,242,191,149, 21, 85, 21,125, 46,123,236,250,245,235, +215,149,225, 86,212,162,248,213,199,104,249,249,249, 49, 21, 40, 72,157, 81,157,208, 42, 65, 96, 96,160,214,206,206,238, 64, 84, + 80, 92,207,134, 45,157, 32, 18, 11,250, 0,216, 33, 16, 8,230,127,247,221,119,120,254,252, 57,194,194,194, 14,225, 11,103,225, +184,186,186,222, 18, 8, 4,142,149,184, 73,226,195,194,194,250, 86, 50, 48,172,184,122,245, 42,170, 10,134,191,127,255,126,217, + 65,169,108, 48,124,197, 29,131,102,160,213,104, 33,147, 43,254, 26,196,139,133,150, 76, 38,195,168, 81,163, 62,177,104,165,167, +167, 87,123,126, 4, 65, 96,227,149, 43,184,115,238, 28,190,113,115,195,197,151, 47,177,254,187,177,104,234,104, 15,134, 34,192, + 16, 64,194,169,157,200,202, 47,196,201,123, 79,145, 93, 32,199,184,174, 93,225,108,100, 81, 53, 47,151,215,187,125,199, 78,188, +187, 1,111,193,229,114,192, 2, 13, 70, 43,135,157, 75,119,176, 89, 44, 24, 91,215, 7,143,203, 5,151,203, 65,116, 98, 38, 92, + 92,219,241,253,248,194,222,181, 17, 90,117, 28,235,131,162, 40, 76,152, 48, 1,167, 79,159,134,185,141, 35,140,235,184, 98,205, +230,253,248,166, 87,215,106,207,191,228, 9,158,195,225,128,205,102,127,246, 94,242, 89, 23,235, 36, 67, 51,208,148,111, 35,154, + 1, 24, 6, 14,107,215,194, 97,237, 90,188, 44,254,207,102, 50, 25, 20, 10, 5,208,161,121,141, 68,150, 90,173, 70, 98, 98,162, + 38, 53, 53,213,186,130,237,105,106,181,186, 90, 97,115,228,200,145,144,137, 19, 39,182, 53, 51, 51,123, 29, 18, 28,172,109,233, +230,198,189,177,119,233,229, 18,183, 33, 0,184,185,185,101, 47, 93,186,244,242,248, 17, 94,131,119,251,140,166,126, 92,125,140, + 35, 16,137,218,122, 45, 60, 18,114,106,196,136,234,253, 61, 42, 85,108,203,150, 45, 25, 93,206, 75, 46,151,167, 86,177,121, 32, +128, 85,173, 91,183, 54,242,244,244,196,163, 71,143, 48,108,216, 48,149, 70,163,137, 2,128, 1, 3, 6, 52, 62,121,242, 36,255, +237,219,183,176,180,180,228,198,199,199, 31, 70, 53, 1,242,124, 62,191,123,187,118,237, 88, 42,149,234, 51,145,181,126,253,122, +140, 25, 51, 6,141, 27, 55, 6, 77,211, 40, 44, 44,132,167,167, 39,119,251,246,237,221,117, 20, 90,115,154, 54,109,186, 17, 69, +179, 14,203,222, 11, 35, 80,228,214, 66, 86, 86, 86,106,208,139,123,225, 93,123, 13,109, 91,175,145,171,109, 88,200,155, 42, 9, +173,172,172,150,176, 88,172,145, 52, 77,179,243,243,243, 19,131,212,234, 70,205, 28, 29,173,187, 12, 30,140, 60, 46,151,189,237, +222, 61, 86, 90, 65,129, 4,128, 78, 46, 72,165, 86, 6, 71,167,162, 80,191, 97,163, 6,227,205,155, 55, 24, 62,122, 8,120, 60, + 30, 56, 28,110,209,181,201, 43,178,104,153, 88, 24,233,212, 55,181, 90,109,233, 61,188, 36,206, 75,163,209,160, 36, 52,203,192, +192,160,116,155, 74,165, 2, 65, 16, 85,245, 13,231,179,171,151, 91,137,140,140, 65,105,181,104, 62,120,120,105,159,126,113,112, +183, 8, 52, 45,202,141,143,197,172,115, 87,185,208, 67,143, 74,172, 90, 85,105,145,178, 66,233, 75, 65, 16,132,159,143,143,207, + 82, 0,140,143,143,207,210,146,239,190,190,190, 10, 0,201,181, 20, 91,159, 89,185, 56, 95, 67,100,149,184, 23,170,130,167,167, +231, 44, 67, 67,195,237, 37,223, 19,159, 39, 35,241,121, 50, 92,154, 52,239,210,218,173,109,222,152, 49, 99, 96,110,110,142,133, + 11, 23, 50, 0, 14,213,244,255,163, 35,195, 37, 0, 24, 91, 91,219,133,197, 55,100,183,151, 47, 95, 90,190,122,245, 10,237,218, +181,251,203,116,175,209,192,221,221,189, 42,170,130,226,160,246,121, 95,207, 74, 70, 67,163,209, 64, 46, 87, 64,173,214,128,212, +210, 32, 73, 18,109,154, 27,226,216,126,159,162,223,200, 18,235, 89,145,213,204,193,198, 16,134, 18,174,150,197, 34, 20,175, 67, + 82, 43,188, 99,170,213,106,132,196,199, 35, 56, 46, 14, 0, 48,200,183,234,192,215, 99,247, 30,161, 89,179,102,213,149,182,161, +131,157, 13, 82,238,132, 20,221,188, 21,137,120,245,228, 44, 12, 13, 37, 0,128,230, 30,227,192,227, 21, 9, 45,153, 66, 3,139, + 38,117, 64, 48, 76,165,105, 1, 12, 76,109,110,113,120, 66, 71,134,162,193, 48, 52, 24,154, 2,195,208, 96,115,121, 6,179,102, + 76, 6, 77, 83,104,223,190, 61, 8, 54, 27,148, 86,133, 17, 3,123, 35, 39,175, 0,230, 38,186, 13, 18, 60, 30, 15, 30, 30, 30, +162,202,182,127,248,240, 65, 81, 86,152, 85,221, 70, 90,200,100, 10,168, 84, 42,104,212, 36, 52, 90, 18, 84, 3, 30,126,253,121, + 44, 72, 13, 9,249,232, 78,208,104, 73,208,115,135, 64,163,214, 34,193,128,197,106,233, 98,161,101,129, 80, 4, 69,100, 24, 85, + 39,180, 74,196, 65,101,168, 40, 38,176, 18,177, 21, 60,113,226,196, 54, 45,221,220,222,140,236,229,182, 41, 52, 44, 60, 37, 52, + 44,252,179,253, 28, 27,187,197,254,184,254,244, 2, 46, 79,212,198,107, 97,213,179, 14,203,162,172, 27,241, 11,177,180,160,160, +160,165, 68, 34, 65,100,100, 36,216,108, 54, 8,130,248, 0,160, 37, 0,216,218,218,126,228,112, 56, 78,108, 54, 27,187,118,237, + 34, 56, 28, 78,139, 78,157, 58, 45, 85, 42,149,103,171,120,160,115, 49, 52, 52,252,196,154,197,227,241,224,227,227,131,241,227, +199,151,138, 44, 30,143,135, 35, 71,142,160,109,219,182, 80,171,213, 46, 58,150,247, 21,128,174, 58, 88,252,136, 98,113, 94,173, + 24, 37, 73,114, 98,214,200,145,141,224,239,143, 46, 78, 78,205,218,180,105, 3,141,230, 47,131,166,147,147, 83,157,130,130,130, + 84,133, 66,113, 2, 69,169, 13,130,170, 20, 69, 74, 26,241,209, 69,225,167,111,222,188, 65,251,246,237, 75, 45, 88,101,173, 89, + 60, 30, 15, 34,190,164, 70, 66,139,166,139,238, 75, 5, 5, 5, 44,127,127,127,139,166, 77,155, 18, 0,208,180,105, 83, 34, 40, + 40,200,204,192,192, 32,179, 97,195,134,213, 62, 0,139,140,140,113,100,226, 40, 0,192, 47,189,250,149, 62, 24,221, 92,181, 20, + 92, 46, 23, 61, 23, 46,253,172,223,211, 52,205,134, 30,122,145,165,131, 22,249, 90, 34,171,188, 69,203,215,215, 55,220,215,215, +247, 51,235, 88, 13, 81,189, 69,171,172,233,174,166, 40,185, 88, 43,195,230,205,155,209,162, 69,139, 42, 7,162,237,219,183,227, +248,241,227,155, 1, 68,215,216,228,216,179,117,115,108,185, 20,238,212,184, 57, 1, 0,171,231, 14,100,201,100, 50, 60,125,250, + 20,198,198,198,248,240, 65,231,180, 95,134,198,198,198,171, 88, 44,214, 8,118,249, 25, 0, 21, 11, 76,138,166,233,115,121,121, +121,149,166,119, 96, 24, 64,163, 37, 33,147, 43,161, 86,171, 49,247,167,157,213, 22,194, 23, 32, 52,234, 2,142, 71,183, 78,162, +202, 44, 58,237, 91,116,199,204,239, 36,159, 13,222,108, 22,192, 98, 1,173,218, 23, 89, 92,130, 94,134,131,166, 1,138, 6, 44, +172, 76,113,232,212,166, 42, 69, 62, 73,209,197, 79,199, 20, 10, 85, 20, 92, 58,122, 33, 41,194,191,212,130,196,231, 21,185,140, +121, 92, 46,104,134, 40,202,250, 80,153, 16,226,139, 28,115,164,209,206,251,253, 66, 49,205,171, 5,206,223, 13,193,240, 94, 45, +241,224,197, 91,120,118,104,134,240,168, 56, 52,119,174,135, 93,135,207,129, 97, 80,176,103,203,154,212,191, 6, 52, 50, 94, 23, +139,214,243,231,207, 21,229,173, 88,101,223,153,234,199, 67, 48,204, 95, 22, 45,133, 82,133,133, 75,116, 74,231, 83,212, 70, 93, + 59,138,116,217,185, 42,139,149, 46, 66,172,188,101, 11,213,164,103,105, 0,160, 45,176,248,255,243,198, 73, 81, 20,174, 93,187, + 86,218, 30, 21,181, 99,217,182,211, 65,228, 32, 62, 62, 30,225,225,225,232,216,177, 35,242,242,242,192,101,177,176, 32, 52, 20, +205,190,251, 14,106, 30, 15, 52, 77,131,207,231, 99,250,244,233, 58,215,103, 13,239,206,197,193,220, 84,117,228,155, 58,117,234, +212, 40, 82, 38, 67,248,187,119,232,181,114, 37, 0,224,250,245,235,159,244,137,249,243,231,243,223,190,125, 59,229,245,235,215, + 83, 82, 82, 82, 54, 3, 88, 80,233,125,150, 81,149,198,104,141, 28, 59, 12,141,154, 54,192,241, 63, 78,149,110,159,191,104, 14, +184, 92, 30,184, 60, 46, 76,140, 77,116, 58, 27,173, 86, 91, 42, 90,229,114, 57,235,250,245,235, 14,189,123,247,230,205,153, 51, +135, 0,128,227,199,143,179,118,236,216, 33,190,115,231, 14,207,222,222, 94, 90,173,184,212,104, 62,107, 99,130, 32,192,229,114, +193,227,243, 0,154, 6, 65, 16,226, 13, 27, 54,172, 14, 15, 15,111,215,180,105, 83,168, 84,170,239, 80, 52, 81, 67,159, 71, 75, + 47,182,170,212, 34, 21,197, 90, 21, 91,165, 42, 67, 70,217,184,173,202,132, 90,217,152, 45,212,110, 82,134,110, 49, 90, 21,129, +205,102, 87,107,173, 98,177, 88,213,186, 14,231,207,159, 15, 67, 67,195,202, 6, 32, 38, 52, 52,244,173, 84, 42,221, 15, 96,103, +173, 26,231, 94, 96,248,170,121, 67, 10, 80,236, 91, 53, 49, 49,201,236,209,163, 71, 33, 0,205,217,179,159, 62, 32,171, 84,170, + 74, 7,112, 99, 99,227, 85, 7, 15, 30,156, 61,120,240, 96, 86,249, 20, 3,101,221,123, 37, 47,173, 86,139,179,103,207,206, 94, +188,120, 49,242,242,242,230, 85, 53,136,203,101, 10, 40,138, 3,161, 63,134,157,215,245,166, 94,233, 38,137,137, 45, 28, 26,180, +172,116, 48, 97,241,138, 98,136,172,235,254, 53,128, 25, 26, 10, 65, 85,193, 73, 16,172,232,184,132, 20,251, 58, 54,102,248,152, +152, 1,235,122, 45,144,147,252, 87, 61,112, 56,108,112,139, 93,135, 38, 70, 98,100,164,167,131,197, 98, 87, 41,140,215,156, 12, +196,139,176, 56, 92,184, 27, 4,141, 82,134, 45, 71,111, 66,163, 42,132, 70, 41,131, 70, 89,244,190,110,241,247, 32, 8,164,106, + 85,178,198, 53,105,119, 14,135,131, 14, 29, 58, 84, 42,116,146,147,147,117,180,104, 49,165, 22, 45,133,178,134,109,164,219,147, + 83,149, 22,171,146,237,181, 21, 6, 37, 41, 31, 68, 34, 81,219, 35, 71, 42, 79,227, 80, 17,108,108,108,110, 72, 36,146,250,186, +238, 95,131,228,165,235, 76, 76, 76, 86, 53,109,218,212,101,203,150, 45, 92, 54,155,141,158, 61,123, 54,182,177,177,137, 7,128, +230,205,155,219,149,220, 99,126,252,241, 71,230,249,243,231, 97, 69,207, 24,149,131,207,231,191, 51, 54, 54,110,235,233,233,137, +188,188, 60, 36, 38, 38, 66, 44, 22,163,217,166, 77, 8,253,241, 71,184,237,221, 11, 86,143, 30, 32, 8, 2,124, 62, 31,161,161, +161, 16,137, 68,239,148,202, 74, 83,190,117, 0,240, 59,128, 46,248,203, 93,200, 0,120,138,162,180, 11, 47, 42,184,223,177, 0, +128,162,233,234, 26,107,236,194,133, 11,145,203,229, 2, 3, 6,128, 23, 29, 13,141, 70,131,142, 29, 59,150, 90,217, 59,118,236, + 8, 14,135,131,150, 45, 91,194,206,206, 14,187,118,237, 26, 91,149,208, 82, 22,106, 16, 31,157,132, 78,157, 58,149, 90,174, 6, + 12, 24, 80,106,209,226,114,185,165,150, 45,130,170, 94,184, 18, 4,193,148,125, 72,166, 40,138,224,112, 56,156,121,243,230, 17, +195,134, 13, 99,212,106, 53,205,231,243, 89, 23, 46, 92, 32, 30, 60,120,192,145,201,100,213, 62,136,187, 14, 25,129, 95,122,247, + 47,186,246,235, 91,130,203,227,130,207,227, 97,225,187,164,210,118, 49, 58,114,154,191,126,253,250,225, 77,155, 54, 45,114,195, + 3, 28,125, 30, 45, 61,170, 49,244,100,148, 19, 73,234, 50,223, 51, 0, 16,197,223, 51,202, 8,170, 12,130, 32, 94, 49, 12,211, +174,220,190, 37,219,213,229,222, 75,182, 7,215,162,248, 37,107, 29,126, 38,190,170,122, 34,142,122,246,236,153,115,155, 54,109, +144,144,144,240,217, 76,184,146,129, 75, 44, 22, 67, 36, 18, 33, 32, 32, 0, 0,162, 42, 35,123,240,224,193, 14, 20,101, 93, 46, + 42,145,173,109, 39,207,145,221, 3,218,247,107,135,147,190,167,242,164, 82,105, 75,252,149, 67,135,176,179,179, 27,207,229,115, + 70, 57,185,214,245, 0, 77,255,126,239,234,211,149, 85,157,161, 83,227,230,133, 0, 20, 37,179, 14,107, 57,251, 16, 44, 22,107, +196,224,193,131, 89,111,223,190,197,168, 81,163,112,252,248,241, 74,247, 29, 63,126, 60, 78,159, 62,141,193,131, 7,179,150, 44, + 89, 82,105,122,135, 79,173, 37,234,175,214, 41, 35, 63, 4,227,216,233,131,149,198, 32, 89, 89, 21,197, 99,165,167,103,150,254, +214,174, 77,213,158, 17,154, 84,223, 9,124,253,178, 83,231,110, 61,121,137,105,185,160, 73, 21,148, 5,127, 29, 47,207, 77, 3, + 67, 42,193, 51, 48,131,141,133, 49,222, 60,187,173,214,168,149,119,170,226,156, 61,184, 57,126, 28,232, 2, 48, 52,134, 44, 56, + 4,191,157,179, 74,159,160,221,135,205,193,189,179,219,116,142,241, 43, 15, 46,151,139,208,208, 80, 69,101,214, 44, 54,155,173, + 75, 78,174, 98,171,163, 22,114,185, 2,114,133,242,107,222, 59, 44,173,173,173,247,152,154,154, 10, 43, 17, 82,150,150,150,150, +123,204,205,205,133,186,186, 14, 43, 19, 89,197,121,181, 94, 79,156, 56,177, 70, 98, 75, 32, 16,212,143,138,138, 42, 77, 86, 90, +213,187, 90,173,134,167,167,167,174,201, 75,175, 2,136,177,181,181,125,218,172, 89, 51,227,143, 31, 63,226,212,169, 83, 60, 46, +151, 91,183,228,254, 81, 80, 80, 0, 54,155,141,244,244,116, 45,128,201,168,198,117,166, 82,169,252,253,253,253, 91, 13, 28, 56, +144,253,238,221, 59,176,217,236,162,114,117,234, 4,183,189,123, 17, 54,111, 30, 60,226,226,160,212,104, 32, 20, 10,113,235,214, + 45,141, 92, 46,247,175,140, 79, 36, 18,237,143,141,141,109, 46, 20, 10,161,209,104, 64,211, 52, 88, 44, 22,193,225,112,220, 77, + 76, 76,182, 3,104, 87,174,177,172,220,218,121, 54,161, 72,146,146, 38,124,204,168,174, 2,178,178,178,112,245,234, 85,116,236, +216, 17, 30, 30, 30, 72, 78, 78, 70,116,116, 52,190,249,230,155,210,125,130,131,131, 17, 24, 24,136,134, 13, 27, 86,111,209, 99, +105,209,176, 73,125,240,120,188, 34, 11, 17,151, 87,252,224,195, 45,181,100,241,184, 60,112, 57, 92, 8, 69, 66,157, 45, 90, 4, + 65,128,197, 98,129, 32, 8,136, 68,162,146,135,108,218,193,193, 65,154,157,157,109, 11,128, 45, 18,137, 64, 81,148, 78, 15, 45, + 37, 99, 68,137,200,226,241,121,165,150, 45, 0,200,205,205, 85, 14, 30, 60,248,132, 74,165,154,132,218,173, 80,162,199,191, 12, + 4, 65,188,250,255, 56,182, 6, 24, 80, 44,172, 62, 11,138,175,170,131,127,211,185,115,231,189, 99,198,140,233,185,117,235, 86, + 72, 36, 18, 72,165,210,210, 1,145,207,231,163, 78,157, 58,200,206,206,198,190,125,251,144,148,148,116, 31,192,116, 93, 75, 36, +149, 74,159,127, 8,138,202,242, 28,222,217,188,121,231, 38, 38,137, 81, 73, 29,165, 82,105, 64,177,200, 58, 52,102,254, 55,147, + 60,135,182, 7,143,207, 69,226,135, 84,220,187,250,244, 63,210,152,108, 54,155, 77, 16, 4, 70,141, 26,165,211,254,163, 71,143, +134,191,191, 63,170,114, 51,210, 37, 22, 45,185, 18, 50,197,215,123, 88,155, 57,107, 60,102,206, 26, 95, 42, 38,116,113,189, 0, +128,157,221,153, 42,132,150,102,171,223,153,125,211, 90,183,239,228,216,182,121,125,188,120, 29,132,147,123,255, 50, 50, 28,222, +177, 26,191, 29,190,143, 58,214,166,208,168,100,184,113,254, 64,170, 70, 37,223, 90, 75,163, 92,145,184, 37, 8, 48, 12, 93,163, +115, 47, 17, 79, 92, 46, 23,174,174,174,149, 90,180,178,179,179, 21,213, 13, 12,165,109,164,214,162, 80,166,128, 66,254,213,132, +150,155,187,187,251,157,115,231,206,153, 91, 89, 89, 33, 37, 37,165,188,208,114,235,210,165,203,157,115,231,206,153, 91, 91, 91, + 35, 49, 49, 81,231,180, 34, 21,136, 44,100,100,100, 16, 57, 57, 57,180,169,169,105,141,196, 22,139,197,130, 74,165, 66, 68, 68, +132,174,127,171,243, 12, 49, 99, 99,227, 35,167, 79,159, 54,206,204,204, 4,155,205, 70, 68, 68,196, 39,179, 14, 75, 94,135, 14, + 29,226, 13, 25, 50,228, 96,110,110,110,149,211,218, 72,146,220, 60,126,252,248, 41,201,201,201,166, 86, 86, 86,144, 74,165,224, +243,249, 96, 24, 6,132,167, 39,186,198,196, 64, 67, 81, 16,137, 68,136,140,140,196,254,253,251,101,197,169, 98, 42, 52,144, 17, + 4,225,204,227,241, 48,110,220,184, 79, 54, 28, 61,122, 20,131,218,178,219, 90, 26,115, 10, 73, 8, 85,105,162,254, 55,216,108, + 54,225,214,161, 71,227, 14,221, 6,184,190, 15,123,241, 49, 35, 45,169,186,155,146, 86,173, 86,163,105,211,166,120,245,234, 21, +238,222,189,139, 30, 61,122,192,195,195, 3, 33, 33, 33,184,125,251, 54, 2, 3, 3, 65, 16, 4,204,205,205, 75,194, 47,170,140, +193, 80,203, 73,164,167,100,125,102,189, 42,255,157,199,227, 65,165,208,232,212, 70,239,222,189,195,171, 87,175, 74, 83,203,176, +217,108,242,187,239,190, 3,195, 48, 76,108,108, 44, 12, 13, 13,153,137, 19, 39, 82, 28, 14,135, 76, 78,214, 45, 62,184, 68, 84, +149,136, 44, 14,143,251,137, 64,163,105,186, 32, 36, 36,100, 26,128,144, 98, 75, 22,160,207,163,165,199,255, 54,174,225,243,133, +165,171,181,104,197, 0,232,117,234,212,169,177,151, 47, 95,222,188,125,251,118, 75, 47, 47, 47,228,228,228,192,209,209, 17,182, +182,182,240,243,243,195,245,235,215, 51, 41,138, 90, 0,160, 34,211, 79, 47, 84,145,179, 38,249,163,244,156,170,176,240,199, 54, + 30, 46,184,127,246,177,175,141,141,205,116, 54,155, 61,119,226,210,111, 39,117, 31,220, 14,145,129,177,120,126, 59, 20,105, 9, +153,213,114,150, 15,134, 55, 49, 49,153, 98, 96, 96,192, 7,160,169,224,169,184,252,172,195, 82, 78,138,162, 40,181, 90,141, 51, +103,206,232, 36,182, 78,157, 58, 5,165, 82, 9,234,115,255,106, 41, 39, 67, 51, 4,135, 43,128, 93,157,166,208,104,100,160,233, + 90, 79,168, 44,229, 44,121, 2,253,200,231,195, 42, 51, 19, 47, 94,188,208, 77,114, 15, 24, 80, 93, 27, 41,213,202,130,113,219, +214, 46,244,243,246,249,221,164, 71,231, 86,248,101,211, 81,104, 52,135,193, 98,179, 32, 18,240,208,166,125, 23,176,161,194,158, +245,139,114,229,249, 57,227,240,249, 82, 60,159,112, 50, 85,121, 88, 24,128,162,105,220,125,244, 82,231,115, 47, 29,237, 41, 10, + 28, 14, 7, 31, 62,124, 80, 84, 52,219,144,205, 46,114,115,150, 60,169, 87,197,201,208, 52,193,229, 9, 81,199,177, 25,212,170, +194,175,210, 70, 86, 86, 86,139, 46, 93,186,100, 94,146, 42, 33, 36, 36, 4, 4, 65, 68,252,101,113, 44,218,174, 80, 40, 16, 22, + 22,134,144,144, 16,160,104,134,155,206,215, 81,137, 37, 43, 35, 35,131,144, 74,165, 48, 48, 48, 96,133,132,132,168, 90,182,108, +249,186,154,235,187,148, 83,169, 84,198, 85, 22, 63,169, 84, 42,237,133, 66, 33,183,220, 32,106,215,168, 81,163,200, 10, 92,136, +159,149, 51, 47, 47,239,197,226,197,139,219,244,235,215, 15,139, 22, 45,202, 54, 53, 53, 53,220,179,103, 15,135,205,102, 19,222, +222,222, 84,122,122,122,225,129, 3, 7,140, 47, 95,190,140,220,220,220, 0, 29,206,189, 64,169, 84, 78,235,220,185,243,209,155, + 55,111, 26, 56, 59, 59, 35, 63, 63, 31, 12,195,224,200,145, 35,240,246,246,134, 80, 40, 68,100,100, 36, 6, 13, 26, 36,151,203, +229,211,240,121,236,100, 9, 39, 65, 16, 4, 67,211, 52,150, 47, 95, 94,154,156,180, 36, 89,169,161,136,192,254,249, 13,196,115, + 14,228,137,199,254,114,224, 59, 0,160, 72,146,122, 31,246,226,227,145,157,191, 60,224,241,120,143,170,105,163,101,115,230,204, +217, 51, 96,192, 0,145, 68, 34, 65,118,118, 54,158, 62,125,138,103,207,158,225,249,243,231, 80,171,213, 48, 55, 55,135,169,169, + 41,164, 82, 41,222,189,123,167, 0,176,172, 42, 78,190, 1, 23, 78,141, 75,102,254, 22, 89,176,184,101,102, 27,150,181,110,241, +184, 92,157,174,163,110,221,186,161, 67,135, 14, 37, 2,136,138,143,143,151,170, 84, 42,162,140,232, 79, 46, 17,228,117,235,214, + 37,143, 31, 63,206, 84,197,249,124,255, 46,220,252,117, 25,248, 60, 30, 22, 68, 36,150,138,174,163, 61, 90,131,203,231,193,101, +224,176,178,199,238, 70,145,187, 16,229, 68, 86, 85, 99,199, 23, 95,155,122,206,255, 90,206,255,101, 72, 81,139, 37,120, 74,112, + 82,169, 84,222,248,254,251,239,215,187,185,185,125,191,101,203, 22,130,199,227, 97,229,202,149, 76, 74, 74,202, 31,197, 79, 33, + 57,181, 41, 21,195, 48,127, 60,188, 24, 48, 99,130,207, 96, 98,254,214,137,238,175,239,133,189,107,209,217, 25, 45, 58, 59,227, +245,253,183,216,185,244,212,113, 74, 75, 45, 79, 77, 77, 77,168,134, 74,213,171, 75,147,242,193,240,230,254, 15,238,153,215,116, +214, 33, 77,211,231, 78,157, 58, 53,123,232,208,161,172,151, 47, 95,126, 22,147, 85,178,236, 14, 77,211,184,115,231, 14, 52, 26, + 13,254,248,227, 15,154,166,233,202,243,104,129,185,178,109,235,250, 9,127, 28,187,194,231,243, 8, 60,123,116, 1,121, 57, 85, +207,234,226,241,184, 56,116,228,162,134,199,227,190,175,104,187, 70,163, 73,188,119,239,158,117, 95,138,226,178, 88,172,138, 4, + 84,133, 56,119,238,156,150,166,233,248,106,118, 11, 72, 75, 74, 24,184,102,209,228, 83, 3, 70,126,111,221,185,179, 59,215,194, +202, 26, 4, 65, 32, 61, 45, 29,145, 97, 47,181, 55, 46, 28, 76,147,201,117, 91,130,103,242,198,135,165, 49, 89, 0,224,229,189, +189, 52, 62, 11, 0, 6, 78, 92, 12,207,142,205, 65,232, 98,122,250, 75,100,209, 36, 73, 66, 44, 22,131, 36,201, 10, 83, 60, 24, + 27, 27,139,148, 74,165,162, 56, 17, 99,149,166, 34, 6,248,234,109, 68, 81,148, 75, 78, 78, 14,100, 50, 25,158, 61,123,198,172, + 93,187, 54, 35, 35, 35,163, 52,104, 83,171,213,186,100,103,103,163,176,176, 16, 1, 1, 1,204,250,245,235, 51,178,178,178,150, +214,228, 26, 18,137, 68,109, 57, 28,206,235,156,156, 28,218,192,192,128,165,213,106,181, 45, 91,182, 20,136, 68, 34,157, 23, 84, +151, 74,165,253, 42,219,230,228,228, 20, 21, 21, 21,213,136,162,168,178,107, 32,242,148, 74,165,115,231,206,157,117,185,127,204, + 57,124,248, 48, 46, 94,188,216, 62, 63, 63,127,124,124,124,252, 81, 0,237, 57, 28, 14,130,130,130, 34,148, 74,229,152,161, 67, +135, 30,201,201,201,121,129,162, 37,120,116,193,205,200,200,200,113, 46, 46, 46,135, 87,173, 90, 37,241,240,240,224,216,217,217, +161, 93,187,118,136,140,140,196,181,107,215,180,187,119,239,150,201,229,242,201, 0,238, 84,221,236, 32, 72,146, 4,159,207, 47, +125, 9, 4, 2,240,120, 60, 20, 40, 24, 76,221, 20,173, 32, 33, 82,108, 94, 57,237, 26, 3, 16,169,137,209,153,233,169,137, 47, + 8,130,120, 36,149, 74,243, 42,169, 51,190, 82,169,108,197, 48, 12,155, 32,136,173, 26,141,102,226,172, 89,179,108,215,173, 91, +135, 38, 77,154, 32, 51, 51, 19, 98,177, 24,206,206,206,200,200,200,192,203,151, 47, 41,185, 92,190, 23,192,106, 20,199,143, 84, +134,220,204,124, 56,216,212,253,196,242,201, 48, 12, 24, 10,208,170, 40, 80, 26, 6,106, 66, 11, 46, 87, 11, 30,143,167,139,229, +137,161,105, 26, 57,182,182,160,195,194,240,252,249,115, 48, 12, 83,169, 85,173,105,211,166, 58,220,216,105,240, 5,252, 79,220, +133, 4, 65,128,199,231,131,203,231, 85, 52,115, 70,111,197,210,227, 31, 13, 93,125,227,185, 0,166, 7, 7, 7, 31,237,222,189, +187, 31,195, 48, 92, 20,249, 35, 31,127,201,159,167,166,166,190, 9,184,246,102,137,181,131,233,250,254,227,221,209,164,149, 35, + 40,146,194,211,235, 65,248, 99,221,229,211,201,137,201, 19,161,195,218,103, 52, 77, 63,232,210,182, 9, 11,101,114,117,219,217, +217,209,181,153,117,152,151,151,183, 98,193,130, 5, 88,180,104, 81,109,102, 29, 86,136,208,119, 25,211, 9, 48, 14, 3,251,119, +237, 11,130,197,168,213,170, 42,110,124, 40,205, 92,202,227,113,223,191, 10,145,182,172,104,191,140,140,140,190,147, 38, 77,186, +195,225,112,234,215,164,206,105,154,142, 79, 75, 75,235, 89,253,158,228, 83,149, 34,223,249,234,233,125,243,110, 94, 60,220,151, +166,169,134, 4, 0, 54,135,247, 81,171,209,220, 82, 41,242,183, 64,199, 69,165, 55, 76,239,132, 57,219,110, 99,215,162,129,152, +181,254, 44, 14, 46,159,138, 37,155, 78,225,247, 69,115,176,118,251, 9,252, 50,103, 28,134,143,157, 68, 51, 4,235,137,174,231, +193,102,179,111,238,219,183,111,194,212,169, 83, 75, 39, 45, 48, 12,243,201,141, 93,171,213, 42,104,154,198,222,189,123,105, 0, + 55,171,226,251,180,141, 8,166,170,120, 41, 93,219, 40, 63, 63,127,114,167, 78,157,142, 0, 16, 48, 12,243, 33, 39, 39,231, 7, +224,175,165,161, 10, 11, 11, 39,119,238,220,249, 8,195, 48, 2,130, 32, 62,219,174, 11,138, 83, 61,180, 53, 53, 53,125, 93,108, +201, 18,212, 38, 32,190,170,170,174,194,173,168,139, 11,145, 6, 48,171, 76,198,247,117,237,219,183, 47,187,168,116, 68, 78, 78, + 78,219, 90,148,235,142, 66,161,104,190,124,249,242,121, 66,161,208, 83, 46,151, 55, 6, 0,177, 88, 28,169, 82,169, 30, 40, 20, +138, 45,168, 62, 55,149,154,166,233, 72,146, 36, 93, 45, 45, 45,139,102,212, 22,139, 45, 0,248,243, 53,245, 26,160,218, 21, 25, +197, 79,234, 92,176,235,215,175,215, 51, 53, 53,237, 67, 16,196,112,134, 97,154, 22, 20, 20,168,150, 47, 95, 30,112,238,220,185, +188,250,245,235,247, 31, 48, 96, 0, 97,102,102,134, 87,175, 94, 49, 89, 89, 89, 23, 0, 44,133, 14, 51,173,105,154,142,223,176, + 97, 3,106,122,189, 87,181, 93,163,209,164, 94,191,126,221,162, 95,122, 58,135,166,105, 12, 28, 56,240, 19, 1, 87, 30,239,223, +191,135, 74,165,170, 50,153,163, 42, 47, 7, 61,230, 45, 6,138,103,127,150,160,200,146,197,128, 81,235,117,149, 30,255, 46,252, +221, 11,122,234,100, 90,180,181,181, 29, 37, 20, 11,102, 58, 54,182,109,153, 18,157,254,182, 32, 79,126, 92, 42,149,238,171,228, + 70,174, 19,103, 13, 19,150,234,205,191,127, 19,231, 95,121,180, 40, 48, 12, 5,134,102,192, 48, 52,104,154, 42, 90,240,154,161, +193, 80, 20, 65, 16,120,162, 86, 84,153, 25,188,124, 57, 77, 45, 44, 44, 86, 51, 12,211,143,205,102,179,202, 26,195,202,126, 46, +182,100,221,204,200,200,248,165, 2,203,235,255, 92,125,158, 59,119,174, 66,241,175,235,172,195, 17, 35, 70, 80, 53,188, 54, 31, +136,197, 98,219,138,182,201,100,178, 4,169, 84,218,231,191,164, 62,203,206, 24,172, 9,103,141,103, 29, 86,199,233,232,232, 40, +208,104, 52,173, 1, 56, 19, 4, 97, 2, 32, 91,163,209,220,202,204,204, 76, 3,208, 22,192,242,226, 99,126, 5,240,250,255,249, +122, 23, 89, 88, 88, 28,102,177, 88, 14,186, 28, 76,146,164, 58, 59, 59,123, 66,185, 7,130, 82, 78,115,115,243,215, 28, 14,199, + 65, 7,158,164,172,172,172,182,250,251,167,158,243, 31,132,242, 65,240,211, 24,134,217,255,159,248,227, 94,122, 78, 61,167,158, + 83,207,169,231,212,115,234, 57,245,156,255, 2,161,133,114, 66, 11, 12,195,232,167,213,234,161,135, 30,122,232,161,135, 30,122, +124, 33,174,149, 19, 91,215, 74, 62, 16, 85,168,210,154,152, 4,107,163,108,239,234, 57,245,156,122, 78, 61,167,158, 83,207,169, +231,252,215,113,254, 43,240,183,172, 76,241,149, 26, 72,207,169,231,212,115,234, 57,245,156,122, 78, 61,231,191,143,243,127, 25, +149,186, 14, 89,250,186,209, 67, 15, 61,244,208, 67, 15, 61,244,248,123,160,179,208, 18, 91, 55,117,177,112,108,121,196,212,161, + 69,136,169, 67,139, 16, 11,199,150, 71,196,214, 77, 93,254,165,245, 38, 2, 48,150,195,225,220,177,177,177,201, 71, 37, 75,239, +252, 3, 96, 4, 96, 56,138,242,251, 12, 1, 96,240, 53,201, 61, 0,206, 40, 96,230,119, 64,194,119, 64,194, 40, 96,166,199, 63, +112, 57,142,149,179,109, 59, 61,186, 49,246,198,202,217,182,157, 42,220,190,192,214,252,249,237, 17,219,214,205,180, 51,251, 74, +127,105,104,101,101,181,223,218,218, 58,206,202,202, 42,222,202,202,234, 48, 0, 99,253,237, 78, 15, 61,244,208,227,111, 67, 73, +140, 86,201,171, 52, 70,139, 3, 0,126,126,126, 30, 0, 30, 2,232,238,229,229,229, 95,254,104,211,186,174, 83, 27, 54,104,184, +104,205,202,165,132,141,149,133, 1, 73,209,154,216,184,196,102, 43,214,172, 63,159,194,231,108,206, 73, 8, 59, 88,139, 66, 17, +108, 54,123,148, 64, 32,240, 2, 80, 34,216, 34, 84, 42,149, 31, 69, 81,103,160,219, 52,109, 88, 91, 91, 63, 98,179,217,245,106, +242,199, 20, 69, 37,164,165,165,185,215,178, 50, 71,212,173, 91,247,176,135,135,135, 65,251,246,237,193,231,243,177,124,249,242, + 5, 82,169,116,139,174, 4,166,166, 78,134, 26,129,112, 46,135,207,239,205,104,213,174, 12, 24,128, 37, 8,163, 73,213, 61,158, + 74,181, 57, 39, 39,186, 64, 71,170,165, 0, 38, 22,215,213, 65, 0, 27,190,164,151, 76,104, 5,173,150, 42,234, 19, 60, 14,168, + 43, 49,198, 15,151, 45, 91,198,241,242,242,194,193,131, 7,221,247,239,223, 63,173,160,160,224, 30,128, 63, 1,124,252,210, 94, +105, 13, 76,239,236,238,190,109,194,130, 5,108,197,163, 71,216,118,248,240, 86, 20,229, 91,218, 85,211,190,196,227, 97,184,133, + 5,215,139, 97,208,154, 0, 8, 2, 8,202,200,162,175,107, 52,212, 25,232,144,139,173, 10,140,197,167,211,241, 79,214,148, 32, +239, 35,243,179, 96,160, 75,215,188,143, 15,126, 6,208,191,252,118, 82, 41,156,192,176,235,120, 41,152,192, 68, 0,155,190,176, + 90, 13, 44, 45, 45, 67,174, 92,185,226,208,190,125,123, 14, 0,188,126,253,250, 59, 47, 47,175, 30, 25, 25, 25,174, 0,242,255, +159,110, 66, 66, 14,139, 53,147,207,229,246,166, 40,170, 5, 0,176,217,236, 80,181, 86,123,135,164,233, 93,208, 49, 39,155, 30, +122,232,241,207, 69,117, 90,228,191, 28,149,102,134, 47, 57, 57,166,236,123, 89,136,173,154, 52,235,216,115,216,251,188, 2,185, + 50, 46, 46, 57,103,254,204,181,119,166,205,217,120,121,211, 1,191,235,254, 47, 34,158,187,180,239,243, 86,108,213,164, 89, 37, +212,149,249,112,235,138, 68,162, 55,187,119,239,214, 68, 70, 70, 50,185,185,185,204,251,247,239,153, 11, 23, 46, 48, 51,102,204, + 80,138, 68,162, 55, 0,234,234,194,105,109,109,157,246,254,254,109, 38, 41, 36,144,137,127,253,130,209,106,181,140, 70,163, 97, + 52, 26, 13,243,246,166, 31, 19,242,231, 69, 38,232,194, 25, 70,173, 86, 51,106,181,154, 81,169, 84, 76,131, 6, 13, 82,116, 44, +103,121,216, 53,111,222, 92,237,231,231,199,156, 63,127,158, 89,176, 96, 1,227,230,230, 70, 1,240,214,245,220,197, 86,206,158, +134,246, 45, 51,166,250,236,210, 92, 11,184,197,132,199, 4, 49,225, 49, 81,204,185,187, 17,204,196,133,219, 53,134,246,110, 25, + 98, 43,103,207,234,206,221,212,212,180, 35, 65, 16, 76, 9, 0, 48,245,234,213, 43, 44,251,170, 91,183,238, 39,175, 58,117,234, + 20,214,175, 95,255,163,185,185,121,235,138, 56,199,180, 0,195,188, 61,201, 48,111, 79, 50,203,186,129, 9, 15, 15,127,206, 48, +204,195,146,151, 66,161,120,120,233,210,165,135,223,126,251,237, 67, 0,131,170,168, 39,157,234,243, 59, 32,161,224,202, 21,134, +217,178,133, 97, 60, 60,152, 8,128,249, 14, 72,168, 33,103, 3, 27, 27,110,208,198, 13,211,212, 87,174,252,193,220,184,113,141, +185,126,221,143,185,124,233, 48,179,117,203, 76,141,181, 53, 55, 12, 64,163, 26,112,114, 0,172, 5,176, 25, 69,150,203,200,140, +140, 12, 38, 53, 53,149, 1, 16, 89,252,219,102, 75, 75,203, 77,168,216,250,214,171,172, 37,107, 94, 63,155, 27, 35,251,187, 51, + 5,121, 41,204,200,254,238,204,188,126, 54,159, 88,182,250, 57, 57, 25,206, 26,216, 34, 35,252,245,113,106,214,192, 22, 25,253, +156,156, 12,107, 89,159, 4,138,214, 9,221,125,255,254,125,146, 41, 3,173, 86,203, 28, 61,122,148, 50, 53, 53,253,163, 6,156, +141, 45, 45, 45,227,205,204,204, 34,203,254,104,217,114, 72,231,166, 93,191, 91, 97,222,236, 91,143, 26,148,179,189,144,199, 75, +186,115,118, 15,149,149, 16,202,168, 21,105, 76,222,135, 64, 38, 41,226, 57,115,116,223,102, 45,159,195, 73, 2,208,254, 75,250, + 82, 13,161,231,212,115,234, 57,255, 11, 57,171,210, 34,255,139,248, 44,189, 67,101, 39, 38, 16,240,125, 86, 44, 91, 76,228,102, +229, 42,148,249, 5,106,173, 82,169,100,241, 24,101,232,219,152,116, 22,135,157, 59,111,206,108, 67,159, 37,203,124,100,192, 56, + 29,255,187,174,155,155,219,203,139, 23, 47, 90,153,153,153, 33, 47, 47, 15, 89, 89, 89,120,249,242, 37, 24,134,193,208,161, 67, + 5, 29,218,181,107,253,243,242,229,207,146,146,147, 59,161,242,129,247, 47,241, 98,102,129, 13,238, 69,107,209,254, 18,151, 85, + 52,234, 16, 4,246,143,240, 42,221,103,117, 82, 94,209, 99,181, 80, 88,186, 32,113, 45,208,169,103,207,158, 60, 0,152, 50,101, + 74,126, 65, 65,129,111,177,133, 67,167,149, 86,197, 86,206,158, 22,182,118,126,123,246,110, 16,181,104,232, 12,141,150, 68,124, +106, 10, 56, 92, 19, 56, 56,240, 48,105, 92,111,110,183,206,102, 22,107,127,221,127, 45,149,198, 16,121,102,212,173,202,184, 76, + 76, 76,142,158, 57,115, 6,103,207,158, 5, 0, 68, 70, 70,194,217,217, 89, 92, 93, 25,194,194,194,156, 6, 13, 26,116, 58, 43, + 43,171, 81,117,251,150, 79,140, 47, 16, 8,224,238,238,142,102,205,154,225,202,149, 43,221,139, 45, 91, 95, 4,197,163, 71,144, + 4, 7, 3,254,181,122,120,105,208,166,141,227,243,235,215,142, 91, 92,187, 30,129, 77,155, 14,227,227,199, 34, 67,155,147,147, + 19,198,142, 25,193, 13, 13, 13,104, 62,124,248,216,128,199,143, 63,186, 23, 11,165,234,176,234,192,129, 3, 75,235,215,175,143, +225,195,135,143,104,222,188,185,141,145,145, 17,246,237,219, 7, 91, 91, 91, 39,181, 90,253,225,202,149, 43,118,169,169,169,152, + 61,123, 54,210,210,210, 22, 84, 70,212,189,111,247,159, 5, 3, 93,186, 54,105, 51, 1, 18, 35, 91, 28, 56,117, 6,239,223, 28, +237,170,210, 68,252,204,163,252,199, 43, 24,193,196,140, 4,137, 79,189,182, 30,230,141,154, 15,130, 99,155, 64, 11, 37,245, 56, +230,231,222, 13,214,115,132,202,163, 43, 55, 73,179, 62, 35, 29,126,142,237,154,255,206, 44,236, 14,178,128,149,116,137,192, 42, +181,214, 50, 24,212,173, 91,183,210,134,139,139,139,131, 74,165,130,139,139, 11, 75,173, 86,123,234, 88,175,141,251,244,233,243, +228,250,245,235,230,141, 27, 55,206,200,206,206, 46,221, 96, 99,110,210,215,255,226,214,217,107,183,157,104,122,140, 33,114, 51, + 34, 46,135, 86,195,213,190, 75,199, 54,119,111, 92, 60, 46, 33, 10, 19,193, 55,201, 4,232, 44, 68,159, 62, 4,194,192, 12,163, +102,204,231,120,246,236, 97,223,187,255,176,187,239,163, 62,246, 4,240, 74,255, 92,175,135, 30,255,106,171, 22,243, 79, 59,167, + 82,161,229,229,229, 69, 84,116,130, 52, 67,183,180,182, 50, 23,109,221,120,228, 21, 91,163, 86,139, 77,140,213, 92, 99, 35,154, + 48, 52,102,107,212,218, 66, 71, 39, 71, 62,205,208, 45, 43,225, 47, 63,197,147, 16,137, 68, 23,255,252,243, 79, 43, 46,151, 11, +154,166, 97,105,105,137,216,216, 88,228,230,230,162,160,160, 0, 31, 35, 34, 80,191,110, 29,172,244, 89,108, 59,123,177,207, 69, +185, 92,222, 22,159,186, 17, 63,155, 54, 74,105, 63, 93, 55,186,100, 9,150,207, 30,249,139,127,171, 96,155,174, 83, 81, 99, 19, + 18, 18, 32,145, 72,224,234,234, 42,121,250,244,233,227, 42, 68,214, 39,156,166,166, 78,134,180,128,127,118,247,158,229, 34,141, + 54, 12,111,163,179,209,164,126, 87, 88,155,215, 69, 74,182, 26,207, 95,254,137,176,144,147,104,104, 95, 23,222, 51,122, 8,215, +111, 56,127,134, 71,214,175,155,155, 27,155, 95, 17,103,126,126,190,164, 65,131, 6,168, 91,183,104,221, 51,138,162,240,246,237, + 91, 80, 20, 85,250,189,236,251,145, 11,247, 65,230,199, 99,194,119,223, 33, 43, 43, 75, 82, 17, 39,151, 13,114,254,180,177, 28, + 17, 23,224,139,205,212,133,133,133,165,211, 83, 53, 26, 13,130,130,130,208,169, 83, 39,143,115,231,206, 85,167,138,116,170, 79, + 13,240,251,182, 63,254,216, 62, 46, 47,143, 5, 0, 7, 9,130,214, 48,204,239,186,246, 37, 43, 43,238,133,155, 55,142, 89,176, + 89,239, 96,102,252, 27, 94,190,140,135, 70, 83, 84,222,172,172,116,204,154,153, 15, 30,215, 16, 87,174,156, 48,119,113,113,191, +144,154,170,113,197,167,110,196,138,202, 41,188,113,227, 6,102,205,154,133,183,111,223,218,177,217,108,188,120,241, 2, 34,145, + 8, 27, 55,110,100,187,184,184,216,137,197, 98,220,188,121, 19,105,105,105, 68, 85,229,124,120,235,225,154,188,143, 15,126, 78, + 37,110,246, 59,112,234, 12,190, 31, 51, 10, 54, 76,244, 99,227,134,196,154, 62, 3,187,252,194,176,235,120,137, 13, 91,154, 58, +187, 14, 4,143, 47,129,247, 79,171, 17, 25,118,213, 84, 94, 16, 50,147,160, 18,235,172,220,116,110,206,103,229, 60, 63,130,154, +114,242,105,155, 59,117, 95, 57, 6, 7, 77,123, 33, 13,220, 31,242,151,208,114,226, 16, 44,202,184,228, 73,234,195,135, 15,248, +248,241, 35, 56, 28, 14, 20, 10, 5, 72,146,172,176,156,118,118,118,211, 73,146,252,165,184,157,143, 8,133,194,201,199,143, 31, + 55, 47, 43,180, 45, 91, 14,233,108,110, 40,238,153,150,158,149, 19,240, 42,252,253,252,233,195,187, 63,122, 30,150,168,225,126, +155,144, 23,114, 37,175,146,250, 20,138,248,252, 11, 55, 47,157,144,104, 99,238, 67,236,210, 29, 92,137, 51, 40,109, 50,228, 57, + 50, 20,124,148, 66,181,103, 39, 90,205,156,135,171,151,207, 75,154,183,104,123, 78,165,213, 58, 3, 80,215,226,218,172, 9,244, +156,122, 78, 61,231,127, 39,103,165, 90,132, 97,152, 54, 0,172,139,191,102, 21,235, 2, 11, 0,153, 40, 90, 69,198,186,248,222, +193, 47,115, 88,249,239,101,247, 45,255,189,236,231,172,226,207, 86,197,239,175, 8,130,200,174,166,232,182, 40, 90,154,240, 90, +241, 59, 80,236, 74,172, 54,240,152, 32, 88,249, 20, 69, 11,120,150, 86,202, 41, 35,123,182,184,125,247,117,144,129,133, 17,167, +111,247,214, 30, 47, 67, 99,158, 17, 44, 66, 75, 16, 44,157,226, 62,216,108,246,168,173, 91,183,182, 48, 50, 50, 2, 77,211, 48, + 54, 54, 70, 70, 70, 6,212,106, 53,242,242,242,160, 42,200,135,166, 32, 31,193,137,113,232,226,209, 29,195,250,245,113, 57,113, +249,207, 81, 20, 69,157,174,138,215,174,101,235, 82, 75,214,234,122,230,127,153, 38, 18,115, 75, 69,215,111,173,157,193,147, 72, +208,123,190,207,151,244,129,192,107,215,174,221, 24, 58,116,104,255,133, 11, 23,178,164, 82,233,205,216,216,216, 46, 0,222, 86, + 43, 42, 4,194,185, 63,206,245, 50, 53,149, 48, 56,119,231, 79,116,107, 61, 6, 6,124, 54,178,242, 53, 32, 8, 32, 34,252, 34, + 8,194, 12, 33,145, 82,116,109,101,132, 62,125, 93, 36,151,207, 71, 44,196, 95,241, 65,159, 53, 77, 78, 78, 14,210,211,211,161, +213,106,161,213,106, 49,124,196, 8, 28, 59,122, 20, 50,153, 12, 10,133, 2,106,181, 26, 20, 69,129,197, 98,225,142,223, 57, 36, +198, 68,160,115,167, 78, 64, 37, 75, 47, 29, 13, 2, 23,192,243,247,239,223, 35, 34, 34, 2, 73, 73, 73, 16, 10,133,176,177,177, +193,234,213,171,161, 82, 21,173, 81, 54, 98,196, 8, 15, 0,161, 95,122, 65,125, 4,246,199, 82,212,207,253, 47, 93,178,122,122, +233, 18,253,252,234,213, 36, 65, 65,193, 62, 93,142,229,241, 48,124,195,239, 51,154,136,197, 98, 36, 37,108, 69,211,166, 60, 44, +152,103, 14,223,223, 50, 1, 0,179,103, 57,160, 93, 91, 11,228,231,158,135,133,213, 82,108,223, 62,167,225,196,137,155,191,147, +203,169, 35,213, 80,255,252,231,159,127, 14,115,118,118,182, 15, 12, 12, 36,248,124, 62, 68, 34, 17, 68, 34, 17,132, 66, 33,210, +211,211, 17, 27, 27,203,108,216,176, 33, 25,192,207, 85, 17,173,220, 46,125, 6,160,255,188,126,184,241,254,205,209,174,246,236, +152,224, 97,222,238,113, 33,207, 3, 11,110,223,121,250, 43,169, 20, 38,230, 38,221, 93,220,160, 93,160,197,204, 69,171,176,115, +195, 10,188,127,241, 40,219,186,110,254, 46, 17,161,170,176,156, 30, 30, 43, 57,182,214,102,228,244,137,195, 76,174, 90, 7, 76, +191,206, 33, 50, 82, 51,223,108, 68,108,160, 66,208,168,245,248,198, 78, 44,245,253,251,247, 69,221,186,117,131, 82,169, 44,181, + 76, 30, 63,126,156, 38, 73,242, 65,133,125, 83,163,249, 37, 57, 57,217, 86,161, 80,160, 95,191,126,179, 55,110,220, 40, 46, 89, +163,142,162,168, 79, 44, 89,107,182, 28,187, 53,247,151, 93, 15,110,157,254,205,110,141,207,228,238,227,188,215, 62, 64, 37,235, + 72,114, 88,172,153, 87, 47, 29,182, 17,154,106, 33, 50,235, 3,101,154, 2,239,247,127, 15,121,190, 18,237,214,172, 2,192,135, + 90,203,194,190,129,195,193, 53,183,195,138,169,147,237,150,237, 59, 48,131,166,233,173,250,231,122, 61,244,208,163, 28,172, 9, +130,240, 3, 0, 31, 31,159,165,190,190,190,225, 4, 65,248, 49, 12,227, 85,108, 64,241, 99, 24,198,171,100,159, 98,113,246,217, +247,146,125,203,127, 47,255,121,201,146, 37,205,215,175, 95,191,174, 83,167, 78,167, 3, 2, 2, 98, 0, 84, 39,180, 6, 20, 11, +171,242, 75,241, 20,205, 58,244,242,242, 34,202,190,127, 98,209,162,233, 71, 31, 98,226,228,125,122,117,112,240,243, 15,125, 53, +105,210,128,158,163, 6,118,235, 27,155,144, 21,209,208,209,198, 34, 60, 60,212,136,166,233, 71,186,212,146, 64, 32,240,234,209, +163, 7, 39, 39, 39, 7, 6, 6, 6,200,200,200, 64,114,114, 50, 52, 26, 13,148,121,185, 80,229,229, 66,153,155, 3, 77, 94, 14, + 62,190,126,137,150, 13,157, 4,197,193,242, 85,162,196,234, 82,222, 82, 85,214,178,197, 55, 52,132,192,208, 16, 68,205,221,134, +223,154,152,152, 60, 47, 25, 84, 53, 26,205,204,197,139, 23,103,210, 52,141,181,107,215, 26, 73, 36,146,115, 0, 4,213,145, 24, + 90,178,189, 58,181,114,101,189,139, 13,129,187,219, 4, 52,110,240, 13, 98,211, 20,200, 44,208, 32, 61, 87,131,118,221,118,160, +158,219, 42,212,105,229,139,136,248,108,216,217, 59,179,192, 17, 84,185,248,115, 98, 98,226, 39,223, 79,159, 58, 5,185, 92,142, +134, 13, 27, 98,204,152, 49, 88,188,120, 49,198,140, 25, 3, 59, 59, 59,140, 27, 57, 8, 43, 86,172, 64,106,106,106,117, 69, 85, + 53,110,220, 88,229,232,232,168,114,116,116, 84,105, 52, 26, 20, 22, 22, 34, 55, 55,183,124,125,207,169,105, 69, 90, 89, 89, 45, +177,177,177, 9,177,178,178, 10, 23, 8, 4,215,131, 8,226,157,210,209,209,186,203,224,193, 68,179,145, 35,217,241, 34, 17,225, + 15, 72,116,225,178, 48,227, 14,240,236,209,159,159,155,115,184,212, 72, 53,121,146, 37,158,248, 55,199,211,199,109, 49,107,102, + 67, 16, 44, 33, 8, 22, 31,114,217,125,116,104,223,137,103, 98, 66, 84,215,151,198, 2, 8,234,210,165,139,157,183,183, 55, 33, + 16, 8, 48,123,246,108,205,212,169, 83,163,198,140, 25, 19,117,239,222, 61,202,209,209, 17,117,234,212, 33,234,212,169, 99, 11, + 32,168,248,152, 42, 97,212,144, 88,163,210, 68, 60, 54,113, 22,199, 80,176,232, 92,168, 21, 12, 95,185, 73,154,181,102,119,204, +166,216,247,114,167,247, 47, 30,101, 69,133, 93,165, 99, 95, 61,204, 76,137, 42,112, 90,179, 59,102,211,210, 93, 41, 21, 94,212, +254,254,160, 47,250,249,107,228, 50, 57,103,240, 64, 79,249,244, 41,163, 26,155, 73,154, 31,135,125, 31,183,122,117, 29,198,173, + 88,183, 93, 51,117,198, 92,205,193, 67,135,153,130,130, 2,228,231,231, 99,251,246,237,228,213,171, 87,147, 41,138,154, 91,217, + 51, 16, 0,104,181, 90, 76,159, 62, 93,108,100,100,132,196,196,196, 82,139, 40, 0, 72, 51,178, 66,159,190, 10,123, 55,255,135, + 17, 30, 50,149, 74,117,235,225,235,136,102,206,142, 14, 4,193, 84, 58, 17,133,207,229,246,110,219,161, 3,155, 97,114, 65,112, +234,226,227,209, 13,200, 79,205, 70,126,122, 54,216, 92, 49, 72, 8,160,165,249, 48,105,217, 30,145,175, 2, 97,111,105,205, 17, +112,185,125,245,227,137, 30,122,252, 59, 81,149, 22, 41, 43,150,214,175, 95,191,174,170,237,101,222,213,229,190,151, 10,169,242, + 34,172,236,103, 0, 88,191,126,253, 58,134, 97,188, 2, 2, 2, 78, 1, 80,232,120, 10,211,202,188, 79,251, 68,104, 85,105,133, + 82,170,125, 23, 46,254, 25,166,198, 34,227,246,173,157,109,174,220,244,127,253, 40,224,117, 68,189, 58, 22,150,140, 86,109,250, +251,230,157, 14,132, 92,177, 94,199, 66,184, 88, 88, 88, 64,163,209,224,195,135, 15, 72, 74, 74,130, 70,163, 1, 41,147, 65,149, +155, 11,101, 78, 14, 40, 89, 1,120, 20, 5, 69, 70, 58,204, 13,132,192, 95, 51, 18,171,177,188, 17, 21, 10,173,146,119,161,145, + 17, 4,134, 70, 96,113,185, 21,186, 21, 43, 65,155,246,237,219,159, 13, 11, 11,235,208,171, 87,175, 95, 81, 52, 69, 62, 62, 57, + 57,185,231,242,229,203, 85,214,214,214,152, 62,125,122, 19, 0, 19,170, 21,153,124,181,139,163, 77, 19, 52,118,154,128,122,117, +122, 32, 87,166, 69, 70,190, 22,233,185, 26,236,219,209, 9, 23, 14,182,199,147, 11, 93, 17,118,171, 55,114,181, 54,144,216,125, + 11,134, 82, 55,175,138,243,206,157, 59, 88,189,122, 53,126,253,245, 87,172, 93,187, 22,191,254,250, 43,146,147,147,225,234,234, +138,132,132, 4,220,184,113, 3, 82,169, 20, 22, 22, 22,120,249,242, 37,182,108,217,130, 39, 79,158, 84,123,210,186,100,179, 45, +222,167, 70,190,116,146, 36, 39, 74, 7, 15,110,145,102,102,214,172,117,235,214,253,103,207,158,237,212,165, 75,151,210,237, 78, + 78, 78,117, 69, 34, 81, 42,138,102, 80,182,170,138,139, 6, 90, 91, 90,186, 66,173,122, 87,220,198, 92, 16,132, 16, 61,122, 71, +160, 75,215,215,208,104,121, 96, 17, 2,176, 88, 66,144,100, 22, 76, 77,237,192, 48,132,107, 53, 69, 92,158,145,145,225,124,247, +238, 93, 86,108,108, 44,132, 66, 33, 0,196,173, 92,185,114,231,166, 77,155,222,154,155,155, 83,126,126,126,184,124,249, 50,188, +188,188,216, 83,167, 78,117,174, 83,167,206,222,234,206,123,229,118,233,179,147,155,111,140,230,106, 77, 91, 9, 69,245,234, 67, + 38,249,246, 71, 15, 11, 49, 0,220,140,142, 46,176,170,155,191, 94, 86, 16,146, 96,226, 80,248,219,205,232,234,102,156,174,164, +223, 68,189,123,126,242,210,205,188,244,180, 28,110,235, 22,205, 21,190,171, 23,241,234,213,111,244,251,138,197, 63,216, 36,231, + 11,115,123,207,190,241,238,226,205,151,133,227, 39,125, 79, 78,153,230,173,188,113,243,206, 37,154,166, 91,160,146, 25,135, 52, + 77, 67, 42,149, 34, 60, 60, 28,209,209,209,200,200,200, 64,102,102, 38, 10, 10, 10, 74,221,141, 6, 5,249,215,118,254,113, 53, + 88, 44, 18, 25,116,104,225, 92,247, 69,224,219,116,177, 72,100,224, 92,191,110, 99, 96,101,133,247, 17,138,162, 90, 8, 13, 68, + 0, 8,228,134, 61, 66, 97, 78, 33, 10,115, 11, 81,144, 93, 8,149,134, 13,165,138, 5,133,154, 5, 71,143, 62, 40,148, 41, 81, +152,149, 7,154,162,220,244,195,141, 30,122,232, 81,197, 88,239,231,227,227,179, 84,199,125,117,118,111,150, 23, 94, 62, 62, 62, + 75, 9,130,240, 91,178,100, 73,115, 84, 62,161,170, 44,246, 87,240, 2,160, 67,122,135,172,172,168, 66, 67,194,101,232,188,159, +126,185,113,234,208, 14, 43,149, 74,158, 96,110, 42,161, 36, 6,124,139, 41,211,215,162,160, 48,103,136, 76,247,116, 4,200,201, +201, 65, 76, 76, 12, 68, 34, 17,120, 92, 46, 40,133, 2,148, 66, 6, 69, 78, 22, 88, 26, 21,120, 20, 5, 51, 3, 17, 28,237,108, + 80,207,218, 70, 39,206, 15,247,111,151, 6,190,151,117, 23,110,104,239, 2,190, 88, 2,190,161, 4, 63,250, 61, 4, 0,240,120, + 60, 96,249,175, 58, 25, 77,236,237,237,255, 60,121,242, 36, 47, 35, 35, 3, 65, 65, 65,193, 0,242, 0, 24, 2,160, 35, 34, 34, +238,134,133,133,121, 57, 59, 59, 3, 64,195,234,200,242, 51, 89,148,150,100,144,152, 26,135,216,164, 64,152, 25, 55, 0,215,160, + 49,210,115, 53, 16,136, 26, 64,171,250,203,251,168,204,143,135, 66,195,214,233,220,213,106, 53, 72,146, 4, 73,146, 80,171,213, +152, 54,109, 26,158, 6, 4,224,244,229,123,136,249, 24,137, 38,245,109,240,221,119,227,209,190,125,123, 4, 4, 4, 84,201, 53, +161, 21,180,246, 18,112, 54,247,103,129, 47, 49, 87,117, 92,124,235, 69,117, 98,139, 32, 8, 6,149,184, 34,203, 97, 83,167, 78, +157, 26, 69,202,100, 8,127,247, 14,189, 86,174, 4, 0, 92,191,126,253,147,115,153, 63,127, 62,255,237,219,183, 83, 94,191,126, + 61, 37, 37, 37,101, 51,128,138,131,205, 25,224,218,181,103,248,225,135,183,200,200,200, 0, 0,156, 57,245,151, 46,141,141,209, +160,223,128, 34,143,150,137,137, 9, 54,111,118,213,169, 62, 41,138,194,254,253,251, 75,221,133, 0,192,225,112,186,204,159, 63, +127,104, 69,251, 55,106,212,136, 87, 29,231,188,225,246,194, 39,193,204, 76,227, 70,245,154, 27, 89,180, 68,150, 54,208, 53, 48, + 89, 58,107,222,112,251,173, 91,206, 39, 43, 69,132,234, 8, 65, 37,214,225, 8,149, 71,117, 41, 99,244,205, 29,234, 44,199,137, + 71, 83, 51,242,151,121,127, 63,214,220,200,196, 74,118,112,167,175, 41,139,205, 98,254,124,173,201,109,238,100,110,242,109,199, +109,133, 63,204, 91, 30,168, 38, 19,189,145,248,103, 36,170, 72,113, 65, 81, 20, 82, 82, 82,144,145,145,129,132,132, 4,100,102, + 22,185, 95, 51, 51, 51, 65,211,244,151,220, 16,161, 72, 72, 64,252,165,131,168, 55,126, 60,218,253,186, 26, 20,205,129, 66, 78, + 97,115,231,158,200,201, 83, 64, 69, 19,176,107,211, 25,223, 95,127, 12, 22, 67, 1,251,118,233, 71, 18, 61,244,248,151, 66,151, +244, 14, 37,130,200,215,215,215,235,107,255,127, 89,177,229,235,235, 27,238,235,235, 91,147,255, 42,239, 50, 44,253, 94, 18,163, +245,176, 76, 0,218,103,131,102, 65,102, 68,244,219,183,156, 20,153, 66,102, 96,109,101,169, 50, 16, 10,232,188,252, 2,118, 96, +104,176, 70,150,250,241,125, 13,206, 35, 34, 44, 44,204, 53, 37, 37, 5, 9,241,241, 32, 21, 50,176, 84,106, 48, 74, 57,122,185, +119,134, 16,128,144, 69,128, 71,107,192, 97,243, 81, 80,152, 15, 0, 17,213, 14,142, 90,237,103,150, 45,130, 32,192, 55, 52, 4, + 95, 44, 6, 95, 98,248,137,133, 75, 23,139,141, 64, 32, 56,121,238,220, 57, 91,123,123,123,172, 94,189, 26, 14, 14, 14, 77,237, +236,236,228,198,198,198, 34,107,107,107, 52,107,214, 12,157, 59,119,198,141, 27, 55, 0, 29,114, 74,105, 73, 97,200,251, 56,116, +201,204, 14,192,227,135,123,160, 86,168,208,218, 99, 15, 52,156,122,176,108,190, 10,244,135,227,144,167, 94, 41,178, 30,216, 12, + 68, 82, 66, 28, 8, 54, 63, 92, 87,203, 83,201,231,224,224, 96,156,186,226, 15, 91, 71, 23, 36, 68,189,195,187, 7,119,241,212, +210, 28,142, 46,205, 74,221, 64,149,150,145, 2,103,205,174,162, 52, 81, 63,207, 28, 43,200,206,206, 22,152,153,153,169, 74,234, +206,214,214,246, 75,196,214,216,133, 11, 23, 34,151,203, 5, 6, 12, 0, 47, 58, 26, 26,141, 6, 29, 59,118, 68,187,118,237, 0, + 0, 29, 59,118, 4,135,195, 65,203,150, 45, 97,103,103,135, 93,187,118,141,173, 76,104,177, 8, 4,145,100, 86, 83, 39, 39,167, + 82,161,117,244, 88, 6, 2, 95,247, 6, 1, 62,182,239,252, 80,186,111,221,186,117,145, 42,141, 6, 65, 48, 97,213,148,241, 87, + 27, 27,155,229,182,182,182, 78,155, 54,109, 98, 11,133, 66,204,152, 49,163, 65, 97, 97, 97,189, 98, 83, 50,150, 44, 89, 2, 0, + 88,177, 98, 5, 86,174, 92, 9,149, 74, 37,175,140,236,232,230, 22,118,233,217,244, 20,166,208, 96,136,167, 69,189, 22, 61,250, +246, 66, 3,231, 30,232,209, 55, 1, 0,214,153,113,226, 70,254,190,204,228,146,137, 33,113,248,246,205, 59, 43,220, 61,122, 44, + 91, 92,248, 96,205,111,251,115,171,141,121,204,139, 63, 82,240,158, 63,106,203,142,189,199,182,252,178,100,142, 48, 33, 67,157, +147,156,195, 20, 74, 4, 28, 73, 67,107, 66, 50,235,167, 95, 99, 82, 82,162, 23, 32,241,102,181, 51, 45,105,154, 70,116,116,116, +105, 76,159, 82,169,132, 76, 38, 67, 98, 98, 98,105,159, 81,136,141,250,121, 79, 26,232, 38, 83, 40,228, 47, 66,163, 18,126,158, + 61,174,147, 76,161,144, 71,197, 38, 68, 2,219, 43, 84, 99, 44, 22, 43, 84, 94, 32,239, 37,207, 85, 34, 35,232, 61, 28,122, 58, + 66, 75, 18, 80,147, 20, 50,178, 10,160, 34, 1,138,197, 69,243,145,223,129, 34, 56,200, 76, 73, 6,139,205, 14,198,167, 65,251, +122,232,161,199,191, 7, 85,106,145, 18,139, 86,167, 78,157, 78,151,181, 58,149,124, 6,160, 66,213,161, 60, 25,101,197, 84,137, + 59,177,178,255, 41,199,171, 43, 62,139,209,170, 54,189, 67,201,127,214, 49,206,183,219,176, 98,156, 3, 77,146, 77,210, 51,211, + 72, 14, 71,192,173, 99,172,144,102, 39,232,254,239, 42,149,202,239,238,221,187,131,123,247,238, 45,136, 10, 13,134, 58, 47, 15, +234,188, 92,112,105, 18,102,162,182, 96,105, 84, 32,212,106,216, 55,165,161, 44, 16,193,255,105,152, 86,165, 82,249,233, 42,180, + 88,108,246,167,113, 89, 18, 9, 4,134, 70, 16, 72, 36,229, 93,139,213,137, 2,131, 62,125,250,244,236,216,177, 35, 24,134,193, +254,253,251,161,209,104,248, 26,141, 6,106,181, 26, 26,141, 6,249,249,249, 56,118,236, 24,118,239,222,253, 20,192, 31,213, 14, +102,164,250,238,173, 59,247,219, 79, 30,231,197,189,238,183, 25,164,154,130,130,112,128, 76,166, 69,161,218, 0,148,249,120, 32, +237, 26,216, 28, 33, 58,181,108,128, 43,231, 47,106, 64,170,238,233,168,194, 63,177, 10, 37, 38,196, 33,233, 99, 36, 36,249,169, +176, 52, 50,128, 60, 58, 18,173,191,155, 80, 43,235, 68,157, 58,117, 64,211, 52, 60, 61, 61, 75,131,171,107, 43,182,178,178,178, +112,245,234, 85,116,236,216, 17, 30, 30, 30, 72, 78, 78, 70,116,116, 52,190,249,230,155,210,125,130,131,131, 17, 24, 24,136,134, + 13,171, 54, 18,102,102,107,175, 39, 37, 6,141,248,246,219,111,121,207,159, 63, 7,195, 48,112,118, 54,130,145,161, 24, 4, 75, + 0, 23, 23, 43, 0, 69,207, 0,221,187,119, 71,126,126, 52,153,147,195, 92,175,230,116, 79, 2,184,172, 86,171, 63,116,235,214, +205,238,227,199,143,152, 55,111, 30,231,204,153, 51, 37,166,100,248,248,124, 58,153, 66,161,168,220,117,223,164, 69,211, 69, 13, + 72, 83, 15,161,168, 94,125, 35,139,150,104,224,220, 3, 0,208,219,107, 50, 26, 52,170,139,252,204,144,250, 74, 69,220, 16, 30, + 39,199, 52,100,123,242, 91,209, 0,215, 73,202,244,135, 81, 40,114,157, 86,219,236,138,168, 51,105, 9,220,241,103, 47,255,121, + 99,250, 55, 94,131,184, 90,138, 36, 93, 29,185, 38,231, 46, 93, 75, 79,142, 79,216,134,132,155, 97,127,217,255,170,180,226, 81, +249,249,249, 16,139,197, 8, 11, 11, 83, 13, 24, 48, 64,192, 98,177,240,225,195,135, 82,161,101,101, 97,214,172, 75, 59,215,166, +107,182, 28,187, 37, 22, 8, 4,125,187,183,117,121, 27, 21,159,196, 48, 68, 92,165,214, 86,173,246, 78,104, 80,176,167,165, 93, + 35,118,244,195,231, 48,239,250, 13, 84, 42, 22, 20,106, 26, 42, 18, 32,217, 60,216,182,234, 0,147,134, 46, 96, 0,188,122,254, + 84,171,210,106,111,233,199, 26, 61,244,248, 87, 91,181,152,170, 68, 82,241,231,108, 0,113,190,190,190,153,101,172, 77, 25, 0, +130, 1,184, 21,239,151, 81,238,184, 12,130, 32, 94, 49, 12,211,174, 12, 79, 70, 25,193, 85,246,179,186,220, 62,193, 53, 16, 89, +101,223, 63, 21, 90,149, 77,169, 4, 0, 11, 11, 11,171,214,173,219, 54, 60,112,232, 44, 24,134,193,251,192,141,200, 73,127,135, +229,235,158, 53,180,183,183,247, 72, 78, 78,246,215,165, 4, 20, 69,157, 57,124,248,240,130, 14,109, 90,183,174,239,224,128,224, +184, 88,240, 24, 10, 60,138, 2, 75,163, 2,135, 82,195,193,149, 2,139,144, 32, 37, 37, 15,235, 79,158, 13, 43,206, 18, 95, 37, +154,126, 51, 8,171,147,242, 64, 16, 4, 54,117,114, 5,223, 80, 2,158, 88,130, 31,255,188, 95, 42,174,252, 86, 47, 1, 95, 34, + 65,195, 14, 58, 37,132,151, 63,120,240,224,117,104,104,104, 59, 87, 87, 87, 44, 88,176, 0,113,113,113,160,105, 26,105,105,105, + 74,169, 84,154,156,145,145, 17, 7,224, 18,128, 3,208, 33,243, 56, 79,165,220,234,119,225,168,119, 39,119, 15,139,111,135,236, +198,229,243,243,145,155,151, 15, 57, 41,130, 76, 73, 66,166, 98,195,204,188, 5, 58,180,108,137,148,228,116,132, 63,191, 85,200, + 81,201, 55,214,164,131, 18, 4,129,192,192, 64, 56,217, 25, 34,242,177, 63, 44, 12,184,112,179,179,129, 93, 23,247,210,252, 82, + 85,129,203, 6, 57,118,236,216,210,204,240,125,250,244,137, 29, 63,126,188,237,252,249,243,113,232,208, 33, 60,125,250,244,179, + 0,109, 15, 15, 15, 60,122,244,104, 21,128, 21,213, 25,245,212,106, 53,154, 54,109,138, 87,175, 94,225,238,221,187,232,209,163, + 7, 60, 60, 60, 16, 18, 18,130,219,183,111, 35, 48, 48, 16, 4, 65,192,220,220, 28,218, 34,241,172,173,140, 76,163,193,185,223, +126, 63,188,116,203,150,221,205,199,141, 27,135, 11, 23, 78, 99,242,164, 38, 32, 88, 2, 16,132, 0,131, 6, 54,193,234, 95, 95, +161, 67,135,238,176,176,224, 98,203,230, 43, 49, 10, 5,117, 76,135,106, 92,115,251,246,109, 59,165, 82,137,220,220, 92, 70, 34, +145, 16, 89, 89, 69, 51, 90, 43,178,104,201,229,114, 97,101, 68,161,111, 34, 54,230, 22, 48, 57, 76, 97,224,144,108, 50,176, 69, +143,190,137,232,237, 53, 9,119,252,254,192,253, 91,119, 97,198,137,139,133,184,224, 70,102,108,102,190, 84,230,188,215,165,205, + 84,118,146,236,214,222, 89,131, 34,217,182,182,244,185, 37,123,242,115,171, 18, 90, 0,136,236,183,199,255,188,196, 96, 80,231, + 78, 29, 26,185,214,181,229,231,100,166, 51,231,175,220, 8,211,196, 94,184, 90, 70, 96, 49,213, 8,245,213, 62, 62, 62,191, 20, +127, 62,242,243,207, 63, 79, 93,191,126,189,101,106,106,106,105,140, 86,122,102,246,253,206, 3,102, 81, 89,185,121,234,195, 91, +126, 26, 46, 18, 10,248, 63,175, 63,252, 80,203,198,243,202,120, 73,154,222, 53,114,222,242, 57, 81,239, 3,237,235,137,248,184, +242,211, 10, 4,223,126, 0, 45,139,135, 31,238,190,128, 74, 67, 33, 55, 51, 11,247,166,204,132,196,218, 20,187, 31, 94, 72,163, +105,122,143,126,168,209, 67,143,127, 47, 42,211, 34, 4, 65, 84,148, 99, 47,173,130,223, 94, 85,117, 92, 37, 60, 95, 3,149,102, +133,215,105, 10, 94,102,102,102,250,163, 71, 47,240,208,111, 13,252,253,214, 32, 60, 48, 24, 41,201,106, 36,167, 41, 97,100,100, +244,172,138, 67,203,103,142,101,228,114,249,208,159,151,255,146, 42, 20, 25,160, 91,207,158,176,177,180,130, 1,143, 11, 54, 73, +131, 77,112, 81,152, 97,130,200, 16, 57, 22, 31, 62,158, 94, 40,151, 15,173, 96,144,232, 85,153,200, 32, 8, 2, 2, 35, 67,240, + 37,134, 16, 24, 26,125,226, 70, 20, 26, 25, 65,104,104, 4, 14,159, 95, 81, 48,252,103,156,133,133,133,195,134, 15, 31,158,147, +151,151,135,169, 83,167,194,223,223, 63,240,214,173, 91, 70, 33, 33, 33,162,140,140,140, 70, 0,250, 0,216, 87,133,200,250,132, + 51, 39, 39,186,128, 33, 85,163,124,127,153,171, 80,146,230, 24, 49,225, 12,196,172, 68,144, 20, 13, 6,128,157, 25, 31, 93,122, +253,138,116,117,103,156,217,187, 86, 78,107,148,227,202,229,208,250,132,147, 97, 24,198,218,218,250,179, 58,184,123,247, 46, 70, + 12, 31,134,190, 67, 6,195,178,190, 19,172,122,125,131,190, 83,127,192,222,189,123,193, 98,177, 96, 97, 97, 81,126,224, 45,229, + 60, 26, 4,238,169, 80, 16,167, 66, 65, 28, 9, 4, 7,192,119,199,143, 31,255,205,205,205,237,193,211,167, 79, 55, 2, 24, 85, +246,191,202, 96,101, 57,107, 86, 69,109,180,108,206,156, 57,138,168,168, 40,136,197, 98,144, 36,137,167, 79,159, 98,247,238,221, +216,180,105, 19, 2, 3, 3, 97,110,110,142,134, 13, 27, 66,165, 82,225,213,171, 87, 10, 0,203,170,224,164, 51, 50,200, 97,219, +183,175,207,242,242,234,138,195,135,119,194,198,166, 51,184, 28, 27,112,184,150, 16, 75,154,226,224,129,223,208,191,127,107,252, +121,229,108,118,102, 22, 57, 12, 0,169, 67, 95, 82,190,120,241, 2,123,247,238,197,240,225,195,147, 71,140, 24, 65,229,229,229, +149, 90,180, 74, 50,253,174, 44,142, 49, 83,169, 84,130,202, 56,191, 95, 28,150,252,211,218,240,213,105,169,201, 29,253, 31, 60, + 27,123,255,214, 93,196, 68,221,199,253, 91,119,241,248,126,128, 79, 90,106,114,199,214,237, 27,243,134, 78,245, 94,116,244,226, + 5,182,196,200, 22, 71, 47, 94, 96,143,153, 53,119,109,219,190, 61,150, 85,215,231,139,219,145, 41, 76, 79, 91,178,110,227,142, + 66, 82,163,100,109,216,182, 43, 69,145, 33, 93, 86,166, 95, 50,213,245, 79,133, 66,177, 79,169, 84,218, 41,149, 74, 59,149, 74, +181, 44, 46, 46,174,219,130, 5, 11, 50, 40,138, 42,181,150,102,188,253,243,217,187, 39, 71,214, 89, 89,152,138, 58,183,107,222, +100,243,190,243, 15, 19, 18,211, 78,148,201,161, 85, 81, 57,149,133, 10,229,176,193, 67,199,203,114,115, 84,232, 52,215, 7,180, + 80, 2, 21, 5,104, 25, 54, 72,130,131,208, 53,155, 33, 50, 51,196,201,216, 55,242, 60,173,102, 24, 62,205,161, 85,213,185,127, + 9,244,156,122, 78, 61,231,127, 39,231,255, 50,108,241,233, 90,135,182,159, 88,180,170,155, 82,105,111,111,223,237,219, 65,189, +208,221,235,103, 48, 12,131,119,111,126, 71, 78,198,123,216,219, 8, 16,157,144,223, 9,128,127, 13, 10,147, 16,151,152,216,113, +206,178,159, 47,142,232,211,211,197,181,126,125, 65,189,122,142, 16, 91, 89, 33, 51, 51, 3, 79,158,191,213,174, 61,117, 46,172, + 88,100,233,228,152,164,105,186, 40,200, 29, 64,207, 57,139, 65,176,217, 64,113, 26,135,146,129,177,126,187,206, 32, 56, 28, 80, + 12, 13,149, 74,165,203,108,185,164,143, 31, 63, 14, 27, 55,110,220, 61, 63, 63, 63, 86,223,190,125, 91, 93,186,116,233, 75,214, +204,131, 44, 61,234, 1, 0,175,181, 75,166,159,233,216, 99,176,145,115,243,182,188,182,245,216,208,104, 9,164, 36,199,195,239, +226, 75,205,219, 23,183,242, 25, 82, 57, 74,158, 25,245,160, 42, 46,141, 70,147,208,168, 81, 35,235,189,123,247,150, 6,195, 83, + 20,133,204,204, 76, 60,123,246, 12, 45,218,117,128,203,164, 41,200,200,200,192,246,237,219, 81,183,110, 93, 12, 28, 56, 16,217, +217,217, 32, 73, 82, 87,135, 47, 5,224, 86,241, 11,229, 68, 22, 81,188, 4, 80,149,110, 67, 39, 39, 39,190, 82,169,108,197, 48, + 12,155, 32,136,173,106,181,122,226,146, 37, 75,108,215,173, 91,135, 38, 77,154, 32, 51, 51, 19, 98,177, 24,206,206,206,200,200, +200,192,203,151, 47, 41,185, 92,190, 23, 69, 11, 89,103, 84, 83,190, 15, 47, 95,198,118,156, 61,251,199,139,191,173,159,238,172, + 84,117,231,155,153,185,131, 97, 72,100,100,196,161, 32,255,169,230,215,213,127,124, 76, 75,215, 14, 5, 16,165,227, 57,175,240, +246,246, 6, 0, 33,128,159,163,163,163,131, 92, 92, 92,156, 43,179,104,233,130, 45,231,147,149, 0, 78, 13,235,107, 55, 47, 63, + 51,196,217,140, 19, 23,219,209,149,222,190,229,124,178,210,200, 78,182, 38, 51,206, 63, 82, 42,187,181,247,232,197, 11,236, 9, + 67,134, 81, 14,146, 40, 31,161, 21,115, 94, 7,106,198,205,205,173, 14, 65,100, 55, 72,207,122,255,122,242,212,233, 35,141,121, +138,235,110, 14, 89, 13, 89,117, 91, 11, 3, 3, 3, 99, 81,195,153,161,197,136, 76, 78, 78,238,182,100,201,146, 91, 12,195,124, + 18,155,144,158,153,125,191,147,151, 55,147,155,155, 23,148, 17,241,167, 46,185,212, 94,190,124, 19,216,211,181, 69,235, 11,191, +173, 91,111,221,125,206, 2, 78,228,131,135, 0,165, 69,188,255, 67, 80, 2, 53,189, 57,224, 78, 90,158, 70, 51, 4,250,172,240, +122,232,241,175,183,102, 85,165, 69,254,203, 49, 0,149, 4,195,235,124, 50, 78, 13,236,111, 53,113,174,215,167,174,131, 37, 0, + 32, 58, 54, 5,209,177,201,183,163, 99,146,251, 86,163,120, 43,155, 94, 89,186,168, 52, 81,156,194,129,209,109, 81,233, 79, 56, +205,205,205, 95,115, 56, 28,135,154,212, 6, 69, 81, 41,153,153,153,173,117, 44,231,152,250,245,235,175,143,143,143,191, 72,211, +244,188, 26,170,253, 10, 57, 75, 22,149,102,113,248,189, 24, 82,221, 2, 0, 8, 14, 95,151, 69,165,203,114,182,144, 72, 36,251, +184, 92,110,221,146,118, 44,137,193,162, 40,138,173,209,104,132, 20, 69,177, 1, 16, 44, 22,139,228,114,185, 74,130, 32, 72,146, + 36, 19, 84, 42,213,116,252,149,112,180,170,115,175,118,160, 47, 22, 90,168,192,162,117, 23, 0,162,162,162, 26,155,154,154,142, + 34, 8, 98, 56,195, 48, 77, 11, 10, 10, 84,203,151, 47, 15, 60,119,238, 92,126,253,250,245,251, 13, 24, 48,128, 8, 9, 9, 65, + 88, 88, 24,147,149,149,117,190,216,138, 21, 93,195,190,196, 18, 8,216,163,205,204, 88, 3, 24, 6,110, 96, 64, 16, 44,132,230, +229,209,215,229,114,234, 68,177, 96,172,105,255, 44,193,216,122,245,234,253, 17, 27, 27,203,173,204,146, 90,217,185,151,199,239, +203,154,255,220,169,107,215, 97,207, 30, 63,190,244,211,218,240,213,101,183,205, 26,108, 58,121,204,204, 57,191,159,218,181,237, +167, 29,151,115, 14,235, 82,206, 86,173, 90, 57, 17, 4, 49, 10,128, 43,195, 48,141, 24,134, 16, 18, 4,147, 67, 16, 68, 56,128, + 16,181, 90,237,247,246,237,219,164, 47, 56,247,218, 60,225, 86,198, 89,186,168, 52, 40,170, 37, 5, 48, 58, 46, 42,253,159, 46, +167,158, 83,207,169,231,252,255,227,252, 95,198,180, 10, 6, 72,221, 50,195,151, 32, 58, 38,185,111,116, 76, 50, 26, 53,106,196, +124,248,240,161, 70, 34,173,178, 65,154,162,168,211,114,185,252,244,151,144,100,101,101,181,253,155, 43,239, 84,108,108,236,169, +175, 73, 88, 44,164, 86, 23,191,106,139,208,194,194,194, 14,186,238,172,209,104,254,142,186, 33,138,173, 89,171, 42,219,161, 79, +159, 62,241, 26,141,230, 46,128, 68,130, 32, 76, 0,100,107, 52,154, 91, 36, 73,166,125,248,240,161,237,230,205,155, 75, 50,223, +255, 10,224,117, 45,203, 65,171, 84,212,201,148, 20,234,228,223,112,142, 39,213,106,245,124,115,115,243,134, 74,165,146,175, 84, + 42,121,101, 39, 31,136, 68,162,140,170, 2,226,203,194,196,144, 56,194,227,228,152,155, 24, 18,229,133, 20,204,236,113, 65, 33, + 11,107, 98,102,143, 11,186, 22, 44, 40, 40, 40,218,205,205,237, 56,139,197,170,207, 48,140, 53,192, 24, 51, 12, 50, 24,134,201, +228,112, 56,201,111,223,190, 77,254, 47,186, 9, 41, 73,154,222, 72,170,213,127,197, 29,234,103, 23,234,161,135, 30,255, 28, 84, + 26,163,197,169, 41,211,135, 15, 31, 8,125,125,234, 81, 86,108, 85,181, 49, 62, 62, 94, 5, 32,160,248, 85, 30,175, 1, 12,252, +111, 63, 65,169, 84,218,186,178,109,186,138, 44,160, 40,102, 11, 8,155, 91,209,182,149, 59,114, 10,176,227,226,162,154,150, 45, + 56, 56, 56, 1, 58,186,216,245,208, 67, 15, 61,244,248,219, 48,173, 50,241,197,209,215,141, 30,122,232,161,135, 30,122,232,161, +199, 23, 97,127, 25,193,245,137,117,139, 64,229, 51, 7,106,226,123,173,205,236,131,187,122, 78, 61,167,158, 83,207,169,231,212, +115,234, 57,255,117,156,255, 84,124, 34,178,116, 73,142,254, 53,160,159,250,170,231,212,115,234, 57,245,156,122, 78, 61,167,158, +243,223, 32,178, 62,121,149,100, 61,208,187, 14,245,208, 67,143,127, 45,206,157, 59,167,211,162,162,163,127, 58,232, 37,145,152, + 46, 47,204,207, 91,127,122,227,228, 75, 37,191,143, 24, 49,130,210,215,162, 30,122,232,129,218, 4,195, 55,104,224,208,140, 69, +209, 93, 24,134,197,102, 88,140,150,200, 87,156,137,206,201,249, 36,237, 64,157, 58,117, 76,184, 44, 12, 36, 24, 70, 76, 16, 52, + 69,179, 89, 79, 99, 98,146,222,214,160, 96,124, 83, 83, 83,111, 30,143,215, 75,173, 86, 59,176, 88,172, 36,149, 74,117, 87, 46, +151,239,196,231,137, 11,255,223,208,184,113,227, 49, 15, 31, 62, 52,113,119,119, 87,137, 68, 34, 82,161, 80,112,110,222,188,249, +127,236, 93,119, 88, 20,215,219, 61, 51,179,189,194,210,171, 40, 40,138,162, 2,246, 94, 19,141, 93, 99,137,177, 23,212,152, 24, + 53,209,104,162,137,221,104, 76,172,137, 37,118,163,198, 26,123, 55, 98,111,216, 80,177, 75,239, 44,176,176,108,159,153,239, 15, +216,205,138,148, 93,196, 68,127, 31,231,121,134,101,118,103,207,222,153,185,115,239,185,239,125,239,251, 10, 62,250,232,163,236, +103,207,158,149,107, 69,162,151,151, 87,251,245,235,215,251,119,234,212, 9, 53,106,212, 80, 15, 24, 48,128,215,172, 89, 51,222, +168, 81,163, 94, 36, 37, 37,157,181,147,174, 14, 65, 16, 91, 9,130,160, 24,134, 25,130,127, 66, 55, 84, 52, 72,146, 36,199, 16, + 4,209,155,101,217, 0,130, 32,158,179, 44,187,159, 97,152,210, 2,183,150,134,143, 1,116, 33, 73, 50, 12, 0, 24,134,185, 5, +224, 40, 96,251,202,187,127,147, 83, 44, 22,135, 2, 64,126,126,254,237,138,226, 36, 8, 34, 20, 0, 88,150, 45, 47,231,112,145, + 72, 52, 26, 0, 52, 26,205,239,176, 33, 29, 84, 81,176,107,130,216,176,217,209, 0,128, 91, 63, 4, 1, 0,236,217, 39,198, 70, + 19,246,252, 86,113,124,246,112, 20,131, 46,131, 6, 13, 90,240,199, 31,127,252, 0,224,192,219,168,248, 30, 30,190,171,126, 94, +190,206,107,226,231, 35,127, 68, 65, 70,136,210, 31, 72,224, 3, 62, 69,245,208,211,244,133, 7,192,110, 0, 28, 39, 39,167,129, +124, 62,191,181, 94,175,247,228,112, 56,201,122,189,254,124, 78, 78,206, 14,148,146, 1,193,230,235,250, 16, 10, 67, 62, 60, 8, +230,159, 60,111, 44, 9, 29, 79,140, 20,162, 54,178,222,129,102,148, 4,240,101,225,185,110, 64,201,225, 60, 74,107,124, 38,122, +121,121,245, 86,169, 84,249, 20, 69,177, 40, 88,245, 92,240,167,224,115,130, 97,152, 52,165, 82, 57,164, 44, 46, 73, 21,212,226, + 75,136,173,180, 17, 26,147,142, 29,167,142, 71,180,212, 23,205, 89, 96, 8, 11, 84, 35, 41,210,149, 97,152,100, 0,103, 73, 19, + 14,229, 37,225,233, 59,218,185,251, 21, 94,215,170,133,251, 92, 0,238, 0,238, 2,152, 8, 32,175, 82,255,252,107, 40,234, 12, +127, 4, 64,178, 69,104, 89,133,187,111,219,173, 91,183, 8,127,127,159, 58,125,123,245, 89, 48,118,204, 56,130,162, 72, 68,221, +191,207,249,116,200,240, 15, 21, 10,133,183, 84,167,171, 13,130, 96,242,133,194, 40,149, 42, 39,113,247,142, 63,100, 65,181,106, +209, 52,205, 96,205,218,213, 31,237,249,107,223,183, 54,138,173,154, 30, 30, 30, 91,167, 77,155,230,209,163, 71, 15,202,195,195, + 3, 49, 49, 49,142, 59,119,238,172,181,114,229,202,254, 89, 89, 89, 67, 0, 60, 46,199,201,182,242,112, 34, 63,148,137,136, 14, +200,165,145,107,196,153, 20, 13, 78, 2,184, 80,222,171,151,159,159,255, 69,126,126,126,147, 70,141, 26,177, 27, 54,108, 32,134, + 13, 27,198, 18, 4, 65,104, 52,154,205, 0,202, 37,180, 36, 18,201,175,157, 58,117, 10, 12, 12, 12,124,254,236,217,179, 46,187, +118,237, 58, 58,116,232,208, 0,137, 68,242, 4, 64, 77, 59,233, 54,101,102,102,134,104, 52, 26,248,248,248,108, 0,208,224, 45, + 84, 34,130,162,168,253,222,222,222,236,226,197,139, 15,132,132,132,184, 43,149, 74,211,148, 41, 83, 58, 94,189,122,245, 35,154, +166,123,216, 33,182, 20, 4, 65,172,117,119,119,119,249,241,199, 31,159, 54,108,216,240,174, 64, 32,224, 63,121,242, 68, 60,121, +242,228, 73,143, 31, 63,238,207,178,236, 24,192,174, 14, 66, 65, 16,196, 90, 47, 47, 47,151, 5, 11, 22,196,132,133,133, 69,241, +120, 60,222,147, 39, 79, 36,223,124,243,205,196,232,232,232,114,113,146, 36,185,166, 73,147, 38,138, 31,126,248,225, 97,173, 90, +181, 46, 83, 20,197, 79, 72, 72, 32,103,205,154,245,249,169, 83,167,250, 49, 12, 51,182, 60,229,116,115,115, 83,204,154, 53,235, + 97,179,102,205,174,242,120, 60,222,163, 71,143,200,105,211,166,125,254,244,233, 83,155,203,233,228,228,212,142, 32,136,117, 41, + 41, 41, 28, 0,240,244,244,108, 44,151,203, 87, 90,231,180, 52,251, 8, 24,141,198, 92,173, 86, 59, 72,169, 84, 22, 27, 8,119, +216,244, 21,221, 1, 96,165,193,188, 95,240, 90,214, 62,176,230,144, 45, 39, 29,234, 81, 16, 23,239,103,245,136, 94, 0, 48,176, + 48, 85,248,207,106,128,195,225, 48,161, 30, 19,217,219, 41,118,133,140,233,217,190,125,251, 89,103,207,158, 93,221,182,109,219, +111,182,109,219,230, 22, 31, 31,191,232,194,133, 11,190,159,124,242,201,176, 51,103,206, 44,204,200,200,216, 83, 81,149,159,207, + 19, 8, 8,146,128, 72, 40,150,219,114, 60,151, 36,187, 93,238,217,115,244,239,143, 30,133,173,140,142,246, 87,123,122, 54,153, + 48, 97,130,123,159, 62,125, 72, 95, 95, 95, 60,125,250,212,121,219,182,109,181,127,255,253,247,222,217,217,217, 95, 2,136,125, + 19,145,165,206, 70, 61,157, 30, 97, 44, 11, 71,203, 3, 75, 32, 91, 96,192, 45,246, 33,238,189, 3, 98,235,251, 77,155, 54,253, +240,244,233, 83, 44, 92,184, 16, 0, 86,217,249,253,201, 61,123,246,236,186,111,223, 62,209,238,221,187, 69,141, 26, 53,130,135, +135, 7, 10, 7, 83,150,192,212,254,254,254,182, 93, 51, 6, 63, 47, 59, 58,162, 65,148,242, 24,126,237,147,178, 80,228, 3, 83, +243,158,129,189,187, 13, 11,131,131,171, 24, 66, 41, 7,217,153,170,186,143,110,197,119,250,123,215,211, 69, 79, 35,211,127, 84, +199,225,123,148, 28,147,239, 63,129,179,179,243,134, 23, 47, 94,180,147, 72, 36,175,188,255,252,249,243,208,192,192,192, 28, 0, + 95,217, 43,220, 92, 93, 93,183, 51, 12,163,203,204,204, 28, 9, 0, 50,153,236, 15,137, 68,162, 72, 78, 78,254,246,109, 13,100, +204, 40,170, 69,222,115,139,150,197, 95,171,184, 92,135, 4, 73, 51, 45,198,142, 25, 71, 12, 24,248, 73,202,211,231, 47, 24, 14, +151, 63,240,248,137, 19,226, 58,117,234,144,186, 85,171, 96, 74, 79,135,113,210,164,230,167, 79,159, 54,246, 27, 56, 88,195,165, +136, 77, 1,254,213,196,127,238,216,233,177,111,239,158, 22, 0,202, 18, 90,124, 15, 15,143,173,231,206,157,243,246,247,247, 71, +118,118, 54, 98, 98, 98,160, 86,171,209,191,127,127,110,139, 22, 45,188,251,246,237,187, 53, 39, 39,167,165, 29,150, 45,247, 26, + 62,156,195, 99,134,247,169,249,209,135, 45, 36,222,190,213,193,166,104, 17,255, 44,186,209,225,115, 87, 39,108,218,123,244,241, +211, 28,182, 27,138,207,141, 84, 42, 50, 50, 50,166,246,238,221,123,111,187,118,237, 92, 5, 2, 1,188,188,188,136, 30, 61,122, +164, 37, 37, 37,205, 46,183,106, 41, 76, 97, 67,146, 36,109,253, 90, 76,122, 32, 91,224,163, 80, 40,160, 80, 40, 0,192,251, 77, + 71,158,142,142,142,171,100, 50, 89, 95,149, 74,165, 33, 73,146, 37, 8,130,213,235,245, 34,133, 66,113,231, 97,244, 99, 47,157, + 78, 87, 99,201,178,223,151,183,111, 21, 34, 63,117,234, 20,250,244,233,195,158, 60,121,114,140,173,121,234, 8,130, 88,219,187, +119,239,252,153, 51,103,106,159, 62,143,241,126,248,248, 57, 33, 17,242, 25, 23, 23, 23,238,245,235,215, 57, 75,151, 46, 21,206, +154, 53,107, 45,203,178,125,237,184,158,107, 63,249,228, 19,195,215, 95,127,157,252,232,233, 11,183,123, 15,159,178, 82, 33,215, +228,226,226, 76, 93,189,122,149, 41, 15, 39, 73,146,107,166, 78,157,170, 26, 51,102, 76, 86,166, 50,199, 35, 75,149,199, 10,184, +148,209,195,195,131,115,224,192, 1,221,246,237,219,201,209,163, 71,175, 97, 24,166,159, 29,215,119, 77,143, 30, 61,114,167, 77, +155,150,253,228,249, 75,143,123, 15, 30, 67, 44,224, 26,221,221,221,168, 27, 55,110, 24,150, 44, 89, 66,206,155, 55,207,166,114, + 74, 36,146, 45,187,118,237,226, 28, 56, 80,208,246, 93,185,114,133, 12, 8, 8, 16, 91, 31,163,209,234, 64, 18, 64, 70, 70,134, +184, 89,179,102, 91, 0,188, 22,220, 55,108,118, 52,134, 77, 7,190,248,226,139,100,123, 43, 75,152,231,132, 50,143,161, 87, 7, +177, 75,243, 71,244,226,112, 56,204,232,209,163, 83,138,126,174,213,106, 9, 0, 61,176,200,118,177,213,165, 75,151,239,142, 28, + 57, 82,125,219,182,109,191,108,223,190, 93, 15, 0, 66,161,208,101,231,206,157, 11,251,247,239,143,254,253,251,207,220,179,103, + 79,133, 9, 45,154,165, 13, 0, 32, 16, 10, 4,209,209,209, 68, 80, 80, 80,169, 94,174, 6,134,185,249,251,163, 71, 13, 63, 11, + 10,106,164,100,152, 26,188,143, 62,202,155, 60,121,114,134, 74,165, 66, 76, 76, 12, 12, 6, 3,134, 13, 27, 70,181,109,219,214, +171,127,255,254, 43,114,115,115, 63, 6, 96,176,161, 78, 46,241,246,246, 14,207,201,201,201, 51, 91,117, 90, 14,161, 57,173, 67, + 77,130,250, 53,140,124, 30,101,226,117,159,196, 16, 39, 87, 17,234, 32,127, 92, 4, 0, 94, 62,210,237, 28, 12, 20, 11,185, 15, +252,105, 46,230,185,250,136,218,167,199,106,230,168,227, 74, 21, 75, 31, 75, 36,146, 94,106,181,122, 79, 97,231, 92,179, 91,183, +110,184,122,245, 42, 0,180, 40, 20, 90,237, 73,146,252,148, 97,152,245, 0, 74, 75,229, 54,161,103,207,158, 31,236,219,183, 79, + 6, 0,123,246,236,129,209,104, 68, 64, 64, 0,120, 60, 30,248,124, 62,184, 92,174, 37, 59,136,141,240,116,117,117,129,139, 3, + 23, 10, 39,201, 71,223,252,214,147, 83,165,142, 28,105,244,125, 40,217,108,152, 88, 29,120,206, 18,212,234,228,136,176, 15,219, +147,135,214, 68,125,123,232,215,135, 13,243, 73,116, 71, 44,116,239, 74,207, 78,146,164,224,238,221,187,240,242,242,122,229,125, +138,162, 0,160,117, 57, 40,103, 62,127,254,188, 89,100,100, 36,218,181,107, 55,179, 94,189,122,157, 35, 34, 34, 60, 50, 51, 51, +209,174, 93,187, 21, 9, 9, 9, 7,222,246, 57, 89,107,145,255, 21, 83, 23, 89, 68, 73,182, 45, 24, 5,147, 20, 69,145,120,241, + 60,198,216,174, 93,135,161,113,113,113,210, 38, 77,154,144, 92, 46, 23,234,179,103,161,189,113, 3, 82,169, 20,189,123,247,230, +158, 63,127, 94, 46,151,202, 71,189,124,241, 50,151,162, 72,176, 44, 89,166,207,131, 66,161,248,252,219,111,191,245, 8, 12, 12, +132,201,100,178, 68, 52, 55,153, 76,136,143,143,135, 84, 42,197,144, 33, 67,220,196, 98,241,231, 54,158, 71,213,154, 1,110,183, +206, 29, 93,219, 96,242,216, 46,146,154,226, 83,144,196,127, 9,233,158,207, 80, 59,233, 56,166,245,106, 34, 57,249,235,204,176, +234, 94, 78,183,172, 76,172, 54, 67,167,211, 93,140,138,138, 26, 21, 17, 17,193, 0,192,223,127,255,205, 62,124,248,112,204,155, +140, 66, 25,134, 65,118,118, 54, 24,134,161, 10,247,205,175,255,105,125,144,203,229,107, 58,119,238,252, 73,108,108,172,232,216, +177, 99,206,113,113,113, 46, 47, 95,190,116,173, 89,179, 38,103,225,194,133, 71,180, 58, 3,101,164, 89,189,137, 54,230, 38,223, +191,255, 60, 43, 53,245,214,198,141, 27, 53, 4, 65,244,182,241, 55, 62,246,244,244,116,158, 62,125, 58, 8,174,184,113,173,218, +245, 2, 41,174,200,129,228,242, 29, 52, 26, 45,253,226,197,139,248,233,211,167, 87, 11, 9, 9,241, 66,193,244,154, 77,156, 94, + 94, 94, 46, 95,127,253, 53, 56, 2, 89,104,253,144,176,234,124,129, 68, 70,113, 69,178, 38, 77,154,180,125,254,252,121,210,180, +105,211, 60, 27, 53,106,100, 23,103,163, 70,141, 20,163, 71,143, 54, 9, 69,178,102,254,254, 1,181,235, 7,215,238, 90,179,102, +205, 94, 28, 14,199,148,158,158, 30, 59,100,200, 16,207,238,221,187,187,219,195,233,230,230,166,152, 54,109,154,201,215, 47,160, + 83,167, 15, 62,108,202, 19,201, 28, 56,124,137, 99,126,190,150,126,244,232, 81,236,140, 25, 51, 60, 67, 67, 67,221,108,225,204, +207,207,231,186,184,184,160,110,221,186,168, 19, 16,128,156,156, 28,236,219,183, 15,155, 54,109,194,250,245,235,177, 99,199, 14, + 52,108,249, 33,100, 50, 25,146,146,146,160, 82,169,184,255,118,133,162, 87, 7,177, 43,245,225, 61,198,141, 27,151, 52,122,244, +232, 20,145, 72,196, 20,221,156,156,156,232, 65,131, 6,165, 14,249,102, 89, 15,243,212, 98, 25,150,172,187, 71,143, 30,125,182, +109,219, 54,212,169, 83, 7,157, 58,117,226, 3,192,231,159,127,206,239,223,191, 63,118,237,218,133, 61,123,246, 60, 8, 12, 12, +188, 4,160,167, 45,229, 28, 50,100, 72,203,126,253,250, 93,232,215,175,223,237, 1, 3, 6,172, 27, 51,102,204, 43, 61, 87,114, + 82,194, 77,189, 94,143,144,176, 70,226,185, 27,174, 13, 42,139,239, 33,176,109, 93,116,244,166, 31,239,223,143,157, 89,167,142, +163,223,203,151, 78,155,151, 44,113, 49, 39,233, 54, 26,141,136,143,143,135, 66,161,192,160, 65,131, 92, 4, 2,193, 16, 27,138, +185,180,103,207,158,195,227,226,226,164,191,255,254,187,231,237,219,183,189,146,147,147, 61,207,156, 62,225, 58,229,171,207,101, + 14, 82, 62, 63, 41,157, 37, 0,224,101, 18, 36,209, 47,208,146,101,225,104, 61,157, 88, 46,120, 66, 36,242,193,202,234, 45, 29, + 31,127,189, 43,116,192,180,195, 97, 46, 10, 79,193,244, 82,190, 81,127,241,226,197,187, 15, 29, 58, 52,176,101,203,150,123, 1, +136,138, 57, 70,216,176, 97,195,125,187,118,237, 26,222,170, 85,171,139, 0,234,150, 56,138,244,241,233,253,215, 95,127, 57,155, +247, 93, 92, 92, 32, 20, 10, 95, 19, 89, 60, 30, 15, 36, 73,218,125,122,243,119, 14,228, 56,213,214, 33, 42,235, 40,118, 45,190, +139,197, 31, 61, 98, 22, 52,127,169, 91, 53, 36, 26, 39,119,221, 69, 26,238,162,203,103,213, 49,112, 70, 72, 71, 49,141,121,239, + 82, 7,158,158,158,254,105,235,214,173,119,119,233,210, 69, 23, 25, 25,137,244,244,116,120,123, 91,198,218, 41,229,160,116, 18, +139,197,240,245,245, 69, 96, 96,224,192,243,231,207,123, 24,141, 70,188,124,249, 18,105,105,105,183,254,141,115,178,214, 34,239, + 25,138, 58,195, 31,121, 77,104, 21,230, 22, 58, 7, 0, 44, 65,168,239, 70, 69,113, 41, 62,127,240, 31,219,183, 11,120, 60, 30, + 98, 99, 99,241,224,193, 3,228,159, 57, 3,205,229,203, 72, 77, 77, 69, 94, 94, 30,220,221,221,177,118,195, 6,137,158,102, 71, + 60,122,252,152, 98, 73,214,218,223,160,216, 37,158, 2,129,160, 99,159, 62,125, 74, 20,100, 73, 73, 73,232,210,165, 11,151,162, +168,226, 86, 53, 20,229, 36,188, 92,137, 67,103,246,206,245,244,228, 63, 0,158, 78, 6,114,111, 1,172, 14, 48,233,129,196,123, +192,145,217,240,203,139, 38, 78,204, 29,234,225, 45,230, 28, 42, 70, 41,151,181, 20, 53, 32, 40, 40,104,253,224,193,131, 73, 0, +104,223,190, 61, 17, 20, 20,180, 14, 64, 64, 41,223, 57, 93, 70, 39,121, 53, 43, 43, 11,253,251,247,119,174, 94,189,250,233,254, +253,251, 59,155,223, 47, 47,167,217,154, 92,167, 78,157, 76,161, 80,184, 3,176,169,129,181,112, 58, 58, 58,174,234,210,165, 75, +223,237,219,183,243, 0,224,220,185,115, 56,116,232, 16,238,223,191,143, 39, 79,158, 48, 97, 97, 97,174,203,214,239, 94,179,106, +245,150,165,189, 90,132,120,181,109, 28, 86, 91,154,151,149,231,238,238,222,130,101,217, 0, 27,203,217,101,246,236,217, 15, 30, + 62,139,117, 32, 57, 92, 14,143,203, 17,200,229, 18,119,133, 76,226,227, 36, 22,122, 11, 72, 66,154,159,159,159,178, 99,199, 14, + 6, 64, 23, 91, 57,231,206,157,251,226,225,211, 88, 71,130,228,112,184, 28, 46, 79, 42, 21, 59,126,212,169, 93, 35, 0,224,129, +229,169, 84,170,212, 77,155, 54, 25,236,225,252,225,135, 31,162,148,217,121, 10, 14,151,203,229,112, 40,203,181,148,136, 68,174, + 98,129,128,175,211,233, 18,151, 47, 95,174,177,135,115,246,236,217, 15, 30, 61,139,115, 34, 9,130, 34, 8,146, 35,151, 73,156, +157, 29,196,174,174, 82,145,139,152, 67,241, 85, 42, 85,226,214,173, 91,109,226, 52, 24, 12,188,212,212, 84, 60,124,248, 16,190, +141, 26,225,212,169, 83,168, 82,165, 10,250,247,239,143, 79, 62,249, 4, 34,145, 8,237,155,213,195,244,233,211,241,236,217, 51, + 24, 12, 6, 65,113,156,102, 63,169,162,240,242,242,138, 44,171,242, 20,249,238, 43,229, 12,245, 0,187, 82, 31,222,195, 90, 96, +149,196,239,228,228, 68, 23,103,237, 42,202,217,165, 75,151,239,206,156, 57, 83,125,235,214,173, 61,134, 12, 25,114,113,235,214, +173,104,218,180, 41, 30, 62,124,136,106,213,170, 97,243,230,205,248,228,147, 79, 46,174, 88,177,162, 71,100,100,100,136,191,191, +255,183,101,113, 14, 24, 48, 96,124,104,104,232,217,148,148,148,102, 74,165,178,238,190,125,251, 70,244,238,221,251,197,192,129, + 3, 59, 88, 4,163,209,184,253,200,193,189,232,218,163, 15,106, 5,215, 93, 51,236,219,109,245,202,120, 54,217,251,192,186, 77, +201,201,233,219,181,218,252,254, 92,174, 88,124,237,154,211,158,213,171, 93,172,151,124, 39, 38, 38,162,123,247,238, 92, 30,143, +215,170,140,114, 46,238,213,171, 87,255,125,251,246, 41,204, 86,157,203,151, 47,227,222,189,123,136,137,137, 65,118,118, 54, 58, +140,201,195,184,133, 5,220,227, 22,178,248,240,115, 86, 82,206, 54,196, 2, 81, 21,120, 56,203, 57,151, 70, 44,175,245,121,248, +154, 58, 28,169, 19, 23,127,124,243, 4, 25, 47,117,123, 74,224, 36,154, 53,107,182,173, 95,191,126,132, 94,175,135, 94,175,215, + 3, 40, 54,170,175,183,183,183,176,126,253,250, 24, 51,102, 12, 41,151,203, 87,148, 84, 78,181, 90,173, 59,122,244, 40,134, 12, + 25,130, 47,191,252, 18, 53,106,212,128, 66,161, 0,151,203,197,150,109,127,186,124, 50, 98,108,205, 6, 45, 91,135,212,105,208, +180,126,174,142,106,196, 21, 41, 70,151, 96, 13, 41,246,220,243,220, 34, 17,245,242, 10, 86,246, 72, 96,174,111,206,207,155,242, +233, 79,209,143, 34, 82,239,127,219,111, 93, 20,123,165,121,198,182,137,113, 72, 53, 62, 68,171,254,126,240, 15, 85, 76,146,248, + 34,168,188,215,211, 70,216,197, 89,175, 94,189,150,215,175, 95, 23,180,110,221, 26,177,177,177,224,114, 45,227, 41,250, 77,202, + 57,123,246,108,129, 86,171,197,157, 59,119, 48,116,232,208, 68,131,193, 48,233, 77,202,105,143, 69,203,172, 69,222, 51,172, 43, +178, 37,151,100,209,154, 13, 0, 70, 6,135, 6, 15, 29,145,127,248,240, 97, 49,159,207, 71,108,108, 44,146,147,147,177,101,211, + 38,186,189,155, 91,110, 39,111,111,213,150, 77,155, 88,189, 94, 15,150,101, 17, 20, 20,132,190,125,251,138, 62,238, 63, 48,141, + 80,105,254,180, 97,154,199,211, 60,191, 62, 98,196,136,215, 62,159, 50,101, 10,228,114, 57, 8,130,240,176,225,228,250, 77,152, +221,203, 71,225,239,152,202,166,108, 81,130, 18, 2, 28, 25,192,145, 3, 66, 7, 64, 32, 3,248, 98,232, 34,207, 42, 73,182, 83, + 76,159, 86, 35,189, 1,216, 51,213, 3, 47, 47,175,153,103,207,158,117,141,140,140,100, 85, 42, 21,146,147,147,217, 5, 11, 22, +184,122,121,121,205, 44,239, 29, 73, 74, 74,154,219,181,107,215,212,161, 67,135, 58, 28, 63,126,220,119,232,208,161, 14, 93,187, +118, 77, 77, 74, 74,154,251, 38,119,154,199,227, 81,247,239,223,119,154, 55,111,222, 39, 0,110, 6, 7, 7,103,122,123,123,223, + 68,129,211,100,169,144,201,100, 22,145,101,182,174,113, 56, 28,112,185, 92,120,121,121,233,149, 74, 37,221,170, 65,128, 40,200, +129, 52,122, 9,120, 34, 39,145,208, 71, 38,119,104,146,153,153,121,151, 32,136,231, 54, 78,241,133, 54,110,220,152, 75,179, 92, +102,220,224,246, 94,159, 15,111,231,246,219,188,209, 85,150,207, 13,247, 94, 60,107, 84,208,220,169,131,218,145, 12,163,173, 86, +173,154,135,217,161,221, 6,243,121, 88,195,134, 13, 57, 12,184,120,248, 56, 38, 53, 54, 33, 49,247,131,182,205, 44,150,203, 58, +161, 97,157, 92, 93, 93, 91, 7, 5, 5, 53, 36, 8,194,166, 37,201, 34,145, 40,180, 86,173, 90, 28,146,226, 18,206, 10,153,175, + 76, 42,114,183, 76,161, 56, 58, 54,119,114,117,237, 71,178,108,142,167,167,167,155, 72, 36, 10,181,227,220, 57, 12,120,112,119, +115,114,112,117,113,148,118,106,215,162, 70,179,230,205,106,214,107,210,180, 89,112,131,134, 31, 19, 38,147, 42, 32, 32,192,205, +236, 36, 95,134,165, 85,184,125,251,118,204,155, 55, 15,245,253,252,224,237,237, 13, 55, 55, 55, 92,190,124, 25,215,175, 95,135, + 66,161, 64, 90, 90, 26,150, 44, 89,130,253,251,247,195, 96, 48,200,236,173, 79,182,136,173,210, 96, 50,153,200,162, 2,171, 36, +126,145, 72,196,152,157,228, 75,194,209,163, 71,183,153, 45, 89, 19, 39, 78,108,185,108,217,178,139,209,209,209,144, 74,165,184, +126,253, 58, 70,140, 24,113,113,197,138, 21, 45,199,142, 29,139, 77,155, 54,225,197,139, 23, 27, 74,227, 27, 48, 96,192,172, 81, +163, 70, 45,143,136,136, 32,221,221,221,161, 80, 40,208,171, 87, 47,108,216,176,129, 99, 50,153, 54,246,235,215,239,118,191,126, +253,110,211,241, 39,191,219,189,126,193,229,168,187,183, 49,126,194,215,124,189,201, 56,205,134,211,103, 53, 82,105,174,169,117, +107,229, 46,163, 49,127, 0,143, 39,118,184,125,219,233,208,198,141, 22,177, 53,125,250,116, 56, 56, 56, 0, 5, 14,204, 40,197, +170, 19,190,127,255,126, 75,123,232,236,236, 12, 62,159, 15, 30,143, 7, 46,151, 11,138,162,112,122,141, 4,171,167, 23,232,139, +213,211, 9,156, 92, 69,168,223,228,222,137,189, 81, 87,225,206,191,253,217,230,224,144,186, 29,156,113,121,103, 10, 22,116,141, + 76,184,190, 43,125,178, 54, 13, 63,151,240,181, 6, 83,166, 76,169,147,150,150,134, 27, 55,110,224,198,141, 27, 37, 89,128,180, + 7, 15, 30, 92,148,151,151, 7,127,127,127,244,236,217,179, 53,128, 70, 37, 60, 55,104,216,176, 33,186,119,239,142,118,237,218, +161,126,253,250,208, 27, 76,220,126,131,195,107,221,127,145,238,189, 96,201, 2,241,217,191,247,145, 23, 47, 70, 80,219,246,158, +116,104,214,238,195,229, 60,153,231, 85,136,156, 61,109, 57,207,124, 58, 19,161,158, 31, 97,221,153, 9,228,202,115, 67,165, 91, + 14,173, 12,144,201,100,196,173, 27,183,141, 91,126,221, 21, 87, 87,210, 51,237,234,206, 76,228, 19, 41,232, 48,220,159,100,128, +190,239, 74,207, 46, 20, 10,151, 69, 68, 68,120, 24, 12, 6, 68, 69, 69,225,203, 47,191,212,190, 33,165,197, 0,226,235,235,139, +115,231,206, 97,208,160, 65,218,212,212,212, 43,255,214, 57, 89,107,145,255, 21,112,172, 20,164, 5,241,241,241,217, 10,133,194, +187, 86,173, 90,164, 94,175, 47,152,146,216,179,135, 94,191,113,227, 17,173, 86, 59, 1, 0,111,213,111,191,173,241,246,241,105, + 55,120,200, 16,194,104, 52,162,107,215,174,252,195,135, 15, 59, 63, 79, 75,203,181,161,195,121,229,247,134, 13, 27,134,101,203, +150, 1, 0,190,248,226, 11,139,105,157,176,193, 97, 73,234,128, 46,157,186, 53,148,199, 75, 86,202, 13,205,141,121, 85,159,201, +174, 74,242, 68, 13, 65,242, 57, 16, 82, 96, 12, 70,211,147,180,222, 55,159, 61,169, 93, 71,164,204,172,214, 49,184, 13,214,159, +218,218, 37,159,214,238,178,185,193, 17,139, 27, 75,165, 82,220,188,121, 83,217,176, 97,195,108,150,101, 29,230,206,157,235, 34, + 22,139, 27,191,193,181,127,249,248,241,227,214, 45, 90,180,248,156, 36,201,142, 12,195,156, 78, 77, 77, 93, 5,224,165,141,223, + 31, 7,224, 7, 0,150,145,165, 94,175, 7, 73,146, 96, 89, 22, 3, 6, 12,192,244,233,211,235,220,187,119, 15,103,207,158,117, +234,216,177,227, 85, 0,217, 0, 70, 2, 40,214,106,166, 82,169, 52,215,175, 95, 23,157, 61,123, 22, 12,195,192,201,201, 9,114, +185, 28, 2,129, 0,189,122,245,146, 78,155, 54,173,195,137, 19, 39,210, 84, 85,171, 80,194,228, 68,181, 64, 42,149,193,195,187, +213,216,129,159, 70,179, 44,187,223,142,198,129, 47,226,152,180, 4,173, 35, 23,127,191,130, 20,243,120,132,144,199,129,128,201, +199,119,139,230, 19, 60,150,230,192,206,249,121, 30,143,199,147, 9,160,167,248,148, 81, 76,160, 66,162,196, 81, 20,197, 23,242, + 74,246,199,224,146, 36, 73,146, 36, 15,128,205, 73,251, 4, 2, 1, 79, 38, 96, 75,228, 20, 81, 4, 69, 16, 4, 31, 37,172, 68, + 11,245, 0,107,182, 34,241, 39, 60,215, 89,139,226, 86,173, 90,225,200,217,155,216,115,232, 52, 50, 98,239, 98,198, 55, 19,209, +168, 81, 35, 28, 62,124,184,212, 50,153,125,180, 74,178, 46,123,121,121, 69, 38, 37, 37, 53, 40,233,187,165, 77, 25,150, 96,165, +122,157,255,123, 7,132,205,142, 70, 25, 62, 90, 61, 91,181,106, 53,126,251,246,237,250,206,157, 59,243, 7, 12, 24,128,186,117, +235,182, 28, 62,124, 56, 0,160, 99,199,142, 88,182,108, 89,203,225,195,135,227,207, 63,255,196,190,125,251,116,109,219,182,253, +230,220,185,115,137, 40, 88,209,249, 26, 24,134,233,190,118,237,218,162,150, 66,152, 76, 38, 24,141, 70, 79,147,201,228, 89,216, + 22, 97,249,242, 21, 25, 39, 79, 28,198, 55,223,206,134,155,171, 71,168,141,117,136, 24,246,245,215, 25,155,151, 44,193,146, 63, +255,196,215,213,170,137,183, 62,120,128,147, 90, 45,118,157, 61,155, 81,248, 59,101,250,102,170,213,106,205,209,163, 71,229,187, +118,237,130,163,163, 35,106,212,168, 1, 39, 39, 39,112,185, 92,144,148, 8, 20, 79,129, 90,193,141, 1, 92, 7, 0, 84,243,130, + 58,200, 31, 23, 9, 2,217, 44,105,191, 79,145,160, 10,170,186,248, 8, 35,198,111,170,235, 40,119,227,225,248,170, 56,156, 88, + 25,191, 95,155,129, 95, 96,194, 35,148,236,243,213,208,223,223, 31,105,105,105, 56,122,244,168, 26, 40, 81,144,129, 97,152, 69, +191,253,246,219,148,111,191,253, 86, 16, 20, 20, 4, 0,161, 0,110, 20,119,172, 68, 34,129,183,183,183, 69, 88, 14, 24, 58, 54, + 96,204,228,177,162,222, 31,182, 3,135,227,130,108,181, 17,153,185, 70, 40, 92,164,248,102,114, 63,225,233,134,222,141,214,174, +248,227,160, 70,131, 70,192,235,237, 1, 65,224,198,181,187, 23,235, 9,131, 0,130, 4,226,201,191, 65,128, 64, 30, 97, 4, 65, + 81, 44, 77,211,136,139,139, 3,203,178, 24,212,123, 68,124,248,130,125,110, 45, 7,169,224, 91,203, 11, 4,139, 54,239,138, 16, +112,118,118, 14,205,204,204,196,203,151, 47, 49,116,232,208,196,140,140,140, 83,106,181,122, 68, 82, 82, 18, 0, 40,203, 65,105, + 17,243,161,161,161,104,220,184, 49,250,247,239, 47,204,207,207,239, 23, 16, 16,224,157,158,158,222,252,109,158, 79, 81, 45,242, + 63, 37,180,138,125,208,140,198, 90,186, 53,107,160, 62,125, 26,252,147, 39,177,203,203, 43, 79,171,213,126, 5, 32,190,240,193, +159,184,105,243,230, 75, 61,174, 92,145,235,163,163, 17,112,239, 30,184,142,142,161,246, 22, 96,227,198,141, 80,169, 84,200,201, +201, 1, 0,172, 92,185, 18, 42,149, 10, 38, 27, 19,206,114,120,104,233,225, 86, 13, 41,120, 2,134, 67, 74, 99,106,229, 55,149, +106,101, 73,222,113,238,234, 28,210, 27,209,177, 77, 36,154, 76,125, 83,130,210, 67,155,145, 15,239, 22, 53,192, 1,167,165, 61, +101, 52,207,251,115, 56, 28,229,227,199,143,187,215,172, 89,243, 16, 0,151,242,248, 3, 20,193,211,212,212,212, 9,229,249, 34, + 69, 81, 63,188,120,241,194,109,195,134, 13,159,207,157, 59,151,181, 22, 90,230,255, 57, 28, 14, 88,150,133,131,131, 3,184, 92, +174,251,229,203,151,221,155, 52,105,242, 43,195, 48,161, 37,156, 39, 91,183,110, 93,188,120,241, 2, 28, 14, 7, 14, 14, 14, 96, + 76, 6,204,158, 60, 22, 52, 37,224, 76,157, 58, 53,180, 79,159, 62, 81, 27, 54,108, 48,202,155,181,104,158,153,153,121,127,252, +160,193, 81, 7, 14, 28,208, 23,134,120, 40,123,136,207,178,183,159, 60,121, 66,249,120,185, 83,172, 41,159,145,240, 0,225,221, +229, 44, 95,234, 1, 33,135, 98,121, 4, 9,129, 80,228,240, 50, 33, 33,147, 97,152,135,182,112, 50, 12,115,235,197,139, 23, 34, +119, 55,103, 78,190, 70,159, 39,226,178,252,152, 91, 55,159, 87, 13,107, 24, 0, 0,218, 91,215,207, 9,106,213, 22,197,164,166, + 75,170, 85,171,102, 19,167, 70,163,185,157,152,152, 72,185,187,187,115, 98,227, 19, 14, 58, 74, 37,174,114, 71,199,166, 0, 96, +200,205,185, 78,234,116,233, 20,151,227,158,158,153,169,212,104, 52, 47,108, 61,247,103,207,158,113, 60, 61,221,168,227, 39,207, + 28,114, 23, 11,220,100,124,142, 92, 64, 16,132,152, 34, 84, 60, 19,147, 33, 20,139,221, 94, 38, 36, 40, 89,150, 45,209, 66,248, + 99,246,224,222, 5,247,107,246,159, 86,220,184,123,247, 46,142, 93,124, 8, 9,171, 7,161,205,193,201, 77,191, 99,208,212,111, +223,216,239,175, 44,177, 85, 46,107,214,218,218,145, 69,248,145, 92,134, 35,252,160, 65,131,102,111,219,182,205,226,128,242,240, +225, 67,180,111,223,222, 60,205,129, 78,157, 58,161, 73,147, 38,120,248,240, 33, 2, 3, 3,113,246,236, 89, 1, 69, 81,130,193, +131, 7, 47,248,227,143, 63,142,150,105,247, 95,183, 14, 35, 70,140, 40,206,177,250, 25, 0, 45,161, 8,202,155,254,227, 22, 23, +101,102, 6,210,210, 83,110,219,122, 29, 8,130,192,176,175,191,206, 88,171,215, 99,251,181,107, 24, 34,145,136, 55, 63,125,138, +174, 77,154,160, 94,251,246, 25,182,180,117,102,171,142, 86,171, 5,151,203,133, 92, 46,135,179,179, 51,120, 60, 30, 40,174, 23, + 56,252, 16,144, 60, 30,194, 90,133, 96,201, 87,146,252,161, 31, 97, 5, 65, 32, 91,192,199, 45,158,184, 68, 95, 29, 66, 82, 5, +189, 88, 22,170,252,120,252,109, 22, 36, 14,126,112,224,202,184, 39, 71,253, 26,228, 40,119,227,225,216,138, 88,156,252, 53, 97, +175, 54, 5, 51, 10,175, 5, 83,202, 64,162,158,163,163, 35,226,227,227, 17, 23, 23,247, 0,165, 59,248,231, 63,124,248,240,185, + 64, 32,168,227,234,234, 10, 0,254, 37, 13,204, 25,134,177,248, 97,109,221,190,219, 37,180,117,128,240,131,150,117,176,229,208, +124,124,214,111, 5,184, 20, 1,154, 54,224,151,101,221, 64,235,242,208,175, 71, 56,209,166, 99, 96,200,233, 67,250, 81, 70, 77, +214,239,175, 13, 4, 56,152,247,211, 39,151, 29, 5, 82,178, 30, 24,194,209,197,197, 77,194,227,241,224, 44,247,212,127, 59,102, + 82, 50,203,178,150,231,134, 75,241,140,100,174,147, 38, 51, 37, 79,228,200,213, 0, 44, 89,181,124,209,108, 42, 30, 9, 9, 9, + 19, 90,183,110,189, 32, 55, 55, 55, 75,173, 86, 15, 2, 0,127,127,127, 63,146, 36, 5, 0, 74,155, 29,241, 67,241, 97, 33,120, +247,238,221,131, 76, 38, 67, 98, 98,162,181,241, 5, 12,195,188, 51,139, 0,222, 81,132, 1,184, 5,192, 19, 64, 87, 88,133,119, + 32, 11, 77,117,109, 14, 31, 62,204, 30, 62,124,184,141,165,243, 98, 89,198,164, 84,130,213, 21, 92, 91, 46,151,203, 2,176, 94, +209, 36,118,116,116, 36,184, 62, 62, 32, 4, 5,174, 31,108, 5, 46,125, 53, 26,109, 11, 45,195,208,160, 64, 24,192, 90, 13, 90, +212, 66, 2,243, 93, 58, 96, 2,127, 38, 82,248,142,214, 61, 29, 96, 98, 65,131,161,236, 44, 14,171, 86,171, 97, 50,153, 20,213, +171, 87, 63, 98, 50,153, 20,133,157, 27,251, 95,221, 81,154,166,159, 83, 20,133,207, 63,255, 28,102,235,143, 94,175, 71, 74, 74, + 10,116, 58, 29,244,122, 61, 94,188,120,129,156,156, 28,232,245,122,220,191,127, 31,254,254,254,160, 40,202,179,148,198,156,101, + 89, 22,190,190,190,168, 90,181, 42, 40,130,197,250,197,179,240,221,151, 99,241,137, 63,131,141,171,126, 65,219,182,109,107, 87, +171, 86,173, 25,135,195,161, 61, 60, 60,120,251,246,237, 59, 72,211,116, 47,216,222,242, 28,157, 62,125,122,213,224,224, 96, 55, + 71,185,204, 40,224, 83,224, 27,213,172, 64,151,201,114,242, 51,224,235,235,103,130, 72, 28, 56,100,200, 16,186, 36, 43, 68,113, +156, 95,125,245,149,103, 80, 80,144,131,194, 81,166,230,115,169, 52, 30,216,140,156,187, 55,174, 2, 0,223,213, 77, 11,161,184, +206,208,161, 67, 77,246,112,206,156, 57,211,223,213,213,213,145, 4,155, 75, 27, 12,255,204,183,235,244,153, 4,151,171, 1,143, +223,240,139, 47,190, 32,236,225,156, 50,101, 74,181, 58,117,234, 56, 58,202, 37,121, 28, 46,149,204, 99,152,100, 33,152, 20,174, +222,144, 37,116,117,201,135, 88, 26, 54,100,200,144, 18, 57,205,214,172,105,211,166,197, 23, 17,222, 80, 42,149,208,166, 68,129, +151, 24,141, 16, 41, 23,141, 92, 21, 16, 8, 4,150,165,239, 37, 85,215,146,124,180,138, 19, 91,182,126,183,225,156, 82,166, 0, +215,214,142, 44, 26, 55, 43, 41, 41, 9,158,158,158,165, 62, 79,127,252,241,199,183,237,218,181, 75,235,212,169,147,254,200,145, + 35, 32, 8, 2,103,207,158, 69, 98, 98, 34, 58,117,234, 4,150,101,205,171,218,112,251,246,109,116,236,216, 81,223,186,117,235, +196,194,248, 90,101, 98,196,136, 17, 48, 26,141,200,203,203,131, 82,169,196,225,195,135, 17, 18, 18,194,138,197,226, 62,148,239, +135,243,251,141,250,182,121,221,250,161,248,117,197, 18, 61,159,195,253,209,158,231,149, 32, 8, 12,253,234,171,140,156,176, 48, +229, 86,181, 58,127,152, 92, 46,174, 30, 31,239,116,243,196, 9, 23,131,193, 96, 19,135,217,170,227,227,227, 99, 17, 89, 60, 30, + 15, 28,190, 43, 40, 73, 61,240,157, 59, 65,236,209, 7,127,223, 18,232, 28, 36,216, 47,147,226,184,196,177,228,208, 14, 98, 95, +204,111, 62,192,115, 95,139, 79, 60,207,136,171, 96, 67, 97,127, 64,178, 28, 98,223,240, 95,106, 86,119,173, 42,194,149,221, 41, + 56,249,107,194, 95,218, 20,204, 2,240,180,172,231,220, 96, 48,104,105,154, 6, 73,146,224,112, 56,214, 62,129,151,254,250,235, + 47,220,188,121, 19,176, 10,219,147,155,155, 75, 83, 20, 5,161, 80, 8, 0,210, 82,218, 59,112,185, 92,112,185, 92,156,187,122, +222,249,147,143,187, 17,151,239,156, 66,139,144,129,200,204, 51, 32, 53,199,128,236,124, 32,184,209, 12,212,237,184, 31,119, 95, +228, 34,180,126, 93,138,226, 75,134, 22,199,167,125,137,120,117, 28,250,102, 62, 96,106,232, 19, 68,199,174, 28,120,248,224,252, +158,187,247,119,254,118,232,105,243, 70,173,213,133,198, 4,228,229,229,177, 4, 65,176,147, 70,127,251,124,235,136, 44,122,197, +160,187, 12, 71, 39,124,246, 47, 54,245,126,174,174,174,151,157,157,157,207, 22,138, 35, 63,153, 76,118,201,211,211, 51, 26, 5, + 11, 61, 14, 36, 39, 39, 7,169,213,234, 22, 40, 88,156, 21,155,153,153,217,190,208,242, 20, 91,138, 37,108,131, 74,165,154, 72, +211,116,143,194,237, 35,154,166, 67,159, 60,121, 82, 39, 52, 52,244, 65, 64, 64,192,237,128,128,128, 99, 1, 1, 1, 7, 3, 2, + 2, 14,182,107,215,110,153, 57,220,195, 91,158, 54,124, 77,139,188,103, 66, 11,133, 34,107, 93,225, 43, 44, 66, 11,192,185,162, + 14,104, 38,129,224,190,105,252,120, 56, 30, 60, 8,238,147, 39, 24, 62,116,168, 92, 44, 22,175, 64, 65,140,166, 22, 82,169,244, +215, 89,179,102,201, 92, 22, 46,132,215,249,243,136, 57,124, 24, 70, 46,247, 70,121, 74,167,209,104,192,225,112, 44,150, 24,137, + 68, 2,154,166, 81,156,201,247,181, 7,208,132, 43,137,169,209,224,163, 42, 24,176,121,199, 85,173,175, 13,124, 62,195,237,176, +202, 63,240,169,154, 23, 56,199,181,169,219, 10,191,150,215,212, 4, 39,143,239, 40, 68, 92, 92, 60,104, 48,118,205, 55,107,181, +218, 28,181, 90,141,208,208, 80,231,155, 55,111, 86, 15, 9, 9,113, 42,124,255,250, 27,222,152,102, 94, 94, 94,187,189,189,189, + 95,122,121,121,237, 6,208,204,142,239,110,184,112,225, 2, 40,138,194,172, 89,179,144,155,155, 11,131,193,128,204,204, 76,196, +197,197, 65,175,215, 35, 33, 33, 1,143, 30, 61,130, 94,175, 71, 76, 76, 12,116,186,178, 7, 36, 12,195, 64, 46,151, 67,171,201, +195,234,249,223, 97,230,180,201,200,121, 22,137,132,164, 84, 56, 58, 72, 48, 97,194, 4, 74,161, 80, 48, 12,195, 84,165,105,186, + 35,195, 48,107,108,185, 79, 86,245,237,162,175,175,111,221,197,139, 23,215,249,110,254, 26,158,156,147,199, 10,100, 66,134, 47, + 19,176,252,218, 77, 49, 98,198, 10,222,242,165, 63, 63,190,114,229, 74, 34,108, 11,222, 73, 2,184, 24, 22, 22, 86, 51, 49, 49, + 49, 36, 40, 40,168,150,139, 95, 53,129,192,211, 59,155,231, 89, 69,197,234,180,215, 8,239, 42,173,214,172, 89, 19,117,233,210, +165, 36,123, 56, 37, 18, 73,237, 45, 91,182,212,117,119,119,175,203, 21,137,132,249, 57, 57,187, 76,249,234,221,148,163, 66, 72, +202, 29, 63,218,191,127,127,228,222,189,123, 83,236,225, 12, 12, 12, 12,154, 63,127,126,112,189,122,245,130, 61,252,171, 11, 68, +222,190,153, 66, 31,191, 76, 81,189, 16, 1,124,170,118,254,245,215, 95,111, 95,185,114,197, 38, 78,138,162, 76, 36, 73,130,203, +229, 66, 44, 22,227,248,241,227, 24, 63,106, 32,124,189,157, 81, 43, 40, 8, 29, 62,155,136,189,123,247, 90,124,120, 40,138, 42, +177, 71,223,188,112,194,161, 48, 79, 34, 18,107,107, 71, 98,109,237,200, 48, 79, 34,178, 68,177, 85,248,121,113,199,216,212, 26, +149, 48,221,104,131,216, 58,122,238,220,185, 69,195,134, 13,227,119,233,210, 5,215,174, 93,195,136, 17, 35, 46,238,219,183, 15, + 0,112,237,218, 53, 76,154, 52,233,226,153, 51,103, 48,118,236, 88,180,111,223,158,127,225,194,133, 95, 97, 67,236, 31,147,201, +132,141, 27, 55,194,100, 50, 65, 42,149,194,201,201, 9,221,186,117, 67, 84, 84,212,216, 77,155, 54, 69, 83, 92,238,167, 93,123, +124,140, 35, 7,247,225,209,253,168,177,155, 23, 12,182, 59, 40, 48, 73,146,232, 50,116,104, 70, 70,112,176,114,179, 74,149, 63, + 82,161, 16, 7,165,164, 56,253,189,123,183,139, 13, 66,141,160,105,218, 34,174,204,162,195,188,113,248,174,224, 72,234,130, 35, +107,132,187, 79,121, 70, 94, 19,220,226, 55,194,195,210,226,103,113,249,228,136, 62,223,249,163,207,119,254,232, 57,181,218,112, +113, 21,172,151, 84,193,184, 46, 95, 86,109, 23,208,200, 1,170, 52, 3, 14,255, 18, 19,171,205,196, 66, 0,143,108,121,206, 25, +134,121,144,152,152, 8, 62,159,143, 42, 85,170,212, 4, 96,246, 11,220, 48,122,244,232, 47,230,204,153, 51, 25,192,156,194,247, +164,237,218,181, 11,206,203,203,195,147, 39, 79, 0,224,102, 41,214, 96,203, 42, 67,165, 42, 70, 80,205,171, 30, 66,106,143,129, + 66, 81, 31,137, 74, 61,146,148,122,172, 95,221, 11,145, 23,230,225,230,201, 33,136, 77, 73,129,200,163, 55,104,147,174,174, 13, +131,122,175, 59,119,238, 16, 23, 46, 92, 32, 24,134,129,209,104,100,115, 85, 42,246,214,197,139,208, 68, 68, 16,114,185,156,104, +217,184,117,222,230,121, 71,174,239, 95,117,241,166, 33,223,238,129,250,155, 96,230,243,231,207,155,237,222,189,187, 29,128,153, +245,234,213,187, 18, 23, 23,215,252,252,249,243,181,124,124,124, 86,148,151,212, 28, 22, 34, 38, 38,230,149,173, 48, 44,132,190, + 80, 52,116, 41, 20,115, 61, 1, 76,194, 27,172,178,183, 3,231,222, 99,103,248, 35, 40,178,218,176,168,208,178, 14, 20,134, 0, +133, 66,102, 52, 26, 18, 78,157, 58,101, 32, 73, 18, 98,177, 24,195, 70,140, 32, 87,255,246, 91,171,129,205,154,157, 13,255,224, +131, 99,103,207,156, 9,107,210,164, 9, 88,150, 5, 73,146,248,243,207, 63, 53, 90,173, 38,211,215,215,215,209,150, 70,195,250, + 1, 82,169, 84, 22,161,149,147,147, 3,119,119,119,155,167, 14,213, 42,156, 62,115, 60, 50,139,165, 63,139,235,242,116,169,225, +199,148, 94, 77,178, 25,154,147, 67, 27,145,163, 97,145,171, 5,231, 26,233,212,100, 88, 96,111,195,139,142, 77, 30, 69, 68, 95, +206,212,210, 90,187, 86, 75,164,165,165,125,215,175, 95,191, 76, 79, 79, 79, 66, 46,151,195,219,219,155,236,217,179,103, 70,124, +124,252,156,242,222, 17,103,103,231, 79,218,181,107,119, 40, 49, 49,177,111, 68, 68, 68,213,243,231,207,247,109,215,174,221, 33, +103,103,231, 79,108,164,216,245,237,183,223,170,249,124, 62,154, 54,109,138,220,220, 92, 20,174,242, 41,117,179,101,138,148,199, +227, 97,237,226, 31, 48,115,218,100, 40,163,175,225,238,197, 83, 56,151, 66, 96,198,252,159,193,227,241,202, 21,235,171,134,171, +184, 94, 61, 47,217,195, 73, 35, 6, 36, 77,159, 54, 77,118,251,246,109,238, 23, 95, 78, 98, 99,146,149,224,119, 89, 66,161,205, +119,228, 29,181, 43,186,126,212, 1,179,102,126, 93,175, 48,104,103,169,168,237, 42,174, 87,215, 75,246,224,235,240,129,207,191, +252,242, 75,209,143, 63,254,168,109,214,172,153, 38, 53, 53, 85, 36, 81, 56, 5,113, 28, 28,235,198, 36,167, 72,155, 53,107,246, +226,179,207, 62,203,182,151,115,198,140, 25,226, 19, 39, 78,112,250,245,235,103,202,202,202,146,114, 69,162, 80, 66, 32,108,156, +158,149,229,208,183, 95,191,167,125,251,246,205, 47, 12, 88,106, 51,231,247,223,127, 47,126,244,232, 17,167, 89,179,102,198,148, +148, 20,153,196,217, 37,132,114,116,106,244, 50, 57, 85,222,184, 73,147,103, 95,124,241,133,186,180,114, 90,139, 20,153, 76,150, +216,162, 69, 11,252,242,203, 47, 88,190,124, 57, 58,119,238,140,168,251, 81,232,250,197,100,212, 25, 55, 9, 7, 47, 95, 69, 98, + 98, 34,230,206,157,139,144,144, 16,240,120,188, 71,197, 62,143, 99,163,137,219, 41, 32,110,167,128, 32,198, 70, 19,230,253, 18, + 45, 91,115,114, 96,125,124,113,199,221,252,190,120, 75, 87,152, 39, 17, 89,154, 31, 86, 89, 98,171,111,223,190,227,205, 33, 28, + 70,142, 28,121,113,197,138, 21, 45, 71,142, 44, 24,104, 55,109,218, 20,243,230,205,107, 57, 99,198,140,139,243,231,207, 71,135, + 14, 29, 16, 16, 16, 80,230,194, 23,154,166, 97, 50,153, 48,112,224, 64,152, 76, 38,164,167,167,227,241,227,199, 88,183,110, 29, + 88,150, 21, 2,128,167,151, 79, 67, 62,159,143, 59,183,110,228,207, 28,217,228, 15, 59, 44, 89,132,245, 32, 38, 47, 47, 15,125, +199,141,203, 72,168, 81, 67,185, 38, 35, 35,127,148, 66, 33,174, 22, 27,235, 36,211,235,189, 81,138, 95, 34, 65, 16, 96, 24,198, + 34,172,204,130,171,232, 86,216, 81,218, 4, 67, 62,115,244,252,182, 36, 0, 64,235,193, 94,232, 57,181,218,112,207, 64,241,202, + 86,131, 10,140,222,123,231, 61,103,115,147,232, 31, 97,196, 3, 59, 44,214,215,174, 93,187, 6, 71, 71, 71,244,235,215, 79, 64, +146,228, 66,243,120, 21, 5,177,179,150,154,185, 4, 2,193,146, 33, 67,134,144,217,217,217,184,123,247, 46, 0,156, 41,169, 93, + 98, 89,214,114,238,121, 74, 2, 52,195,199,165, 91,199,113,242,252, 30,188, 76, 76, 71,108,154, 22,224, 56, 64,171, 78,128, 65, +147, 8,125,246, 45,168,116, 98,155, 10,204,227,241,210,235,213,171,199, 54,106,212,136,101, 89, 22,207,158, 61, 51,197,196,198, +154,110, 44, 91,198,222, 27, 51,134,144, 61,126,204, 19,137, 68,132,191,191, 63,132, 66, 33, 35, 20, 10, 51,255,197,206,251,173, +132, 91,120, 11, 97, 33, 42,210,170,197,226,253, 68, 50, 94, 93,109,104, 9, 96, 90, 92,192, 82,176,114,209,128, 61,191,174,118, +232, 55,112,176, 58, 36, 36, 68,225,237,237, 13,130, 32,208,171,119,111,162, 93, 68,132,140,235,229, 5,231, 6, 13, 44,211, 17, +167, 79,157,194,241,227,199,213, 71,254,218,239, 61, 98,212,168,238, 0,182,148, 82, 24,142, 64, 32,176,252,110,114,114, 50, 4, + 2,129,197, 39, 66,165, 82,193,213,213, 21,201,201,201,182,102,190,222, 58,125,218,213,105,105, 77,190,243,111, 34,227, 18,199, +212, 41,160, 89, 22, 92,130, 6, 52, 44,140, 52,160, 51,178,104, 88,141,114, 58,169, 49, 41, 14, 95,219,247, 2,192, 86,123,174, +158, 78,167,251,251,246,237,219, 99, 24,134,217, 3,128,140,136,136, 96, 30, 60,120, 48, 30,182, 59,174,191,110,182, 23,139,167, +158, 61,123,214,105,234,212,169, 89,135, 15, 31,206,233,214,173,155,195,186,117,235,156,218,183,111, 63, 53, 51, 51,115,167, 45, +134,192,184,184,184, 45,241,241,241,227, 27, 53,106, 4,165, 82, 9,131,193,128,200,200, 72, 4, 6, 6,226,230,205,155,168, 89, +179, 38,110,220,184,129, 90,181,106,129,166,105,104,181, 90, 48, 12, 67,151,213,152, 43, 51,210,129,204, 56, 36, 93, 59,134,199, +247, 34,113, 54,137,192,170,157,135, 80,165,170,127,185,226,212,212,116, 19, 7,123,186, 58,159,252,113,246,247,110, 49,127,255, +137,125, 27, 87, 49,231,142, 29,171,195,151, 97, 76,155,129, 19, 63,214, 27,225, 7,128,223,188, 73, 35,116, 81, 60,162,197, 85, +145,114,246, 65,233, 1, 22,107,186,137,131,221, 93,156, 79,252,180,112,142,236,217,241,205,216,181,246, 23,118,239,182, 29, 33, + 90,160, 73,112,112,112, 23,146, 36, 29, 1,104, 11,253,188,108, 74,109, 83, 28,231,233, 67,135,194,180, 64,147, 3, 7, 14,116, + 17,139,197, 30, 0,140,249,249,249,207,223,132,243,204,225,195, 97,230,114, 18, 4,225, 6,192,192,178,236, 51,216,153,130,167, +127,255,254,243, 38, 77,154, 52,141,166,105, 87,171,209, 57,181,100,201, 18, 14,195, 48, 20,203,178, 6,146, 36, 13, 39, 78,156, +160, 77, 38, 83,146, 86,171, 29,247, 38,173,200,199, 31,127,140,171, 87,175,206, 70,193, 34, 12, 91,173,213,175,248,105, 21,166, +236, 41, 55,127, 68, 68,196,220, 79, 63,253,116,250,206,157, 59, 31,175, 88,177,162,199,216,177, 99,241,231,159,127,162, 70,141, + 26,184,115,231, 14,190,251,238, 59, 0,104, 57, 99,198,140,131, 27, 54,108, 8,136,137,137, 89, 98,131, 69, 3, 38,147, 9, 59, +118,236, 64,175, 94,189,224,234,234, 10, 47, 47, 47, 16, 4,241,247,168, 81,163,126, 3, 0,138,160,120, 0,160,211,234,116, 65, + 65,141,108,182,224,242,120, 60, 75, 91,151,146,146, 98, 89, 41,248,225,167,159,102,172,255,241, 71,252,161,209, 96,148, 66, 33, + 78,240,241,241, 60,248,236, 89,248,253,130,198,153, 45,205,170, 83,150,200,178,213,165, 65,147,140,111,255, 90,240,210, 3, 64, +231,214,131,189,208,122,176, 23, 26,245,116, 35, 72,138,192,189,147,153,136, 58,173,220,107, 84,225,111,216,151, 46,231,193,194, +133, 11, 15,182,105,211,166, 71,237,218,181, 49,122,244,232,207, 54,110,220,200, 51, 26,141, 95,226,159, 48, 15, 14, 36, 73,206, + 89,187,118,109,184,147,147, 19, 46, 92,184,128,243,231,207,255, 13, 32,174,164,118, 9,128, 37,102, 86, 21,223,154,218, 71, 49, +121,226,180,196, 75,184,120,225, 47,212, 8,153, 8,145, 71,119, 56, 5,205,135, 33,122, 57,244,153, 39,225,228,219, 13, 9, 49, +207, 64,113, 4, 81,101, 57,161,176, 44,123, 63, 33, 33, 33, 32, 32, 32,128,120,249,242,165, 9, 0, 75,211, 52,107,104,213,202, + 88,231,199, 31,185, 81,159,125, 70, 52,127,244,136, 98, 9,130,137,140,140, 4,128,135,255, 69, 47,110, 14,183, 16, 21, 21, 85, + 82,184, 5,187, 80,175, 94,189,150,231,207,159, 23,104,181, 90,156, 59,119, 14,141, 27, 91,214,118,253,167,209,239,173,181,200, +123,134,240, 98,222, 91,247,138, 69,235,149,138,205, 16,220, 90, 53,107,210, 60, 18,155,122,117,239,158,127,251,246,109,203,168, + 79,123,253, 58,212,199,143,131,166,105,176, 44,139,243, 17, 17, 24, 50,120,112, 30,151, 34,214, 87,171, 86,149, 37,216, 87, 98, +183,116, 44,102,244,208,175, 95,191,126,150,198, 39, 62, 62, 30, 18,137, 4,124, 62, 31, 12,195,192,100, 50,129,162, 40, 56, 56, + 56,192,100, 50, 21,103,130, 41,202,105,164,149,234,190, 27,186, 14, 74,246,202, 51,176, 99, 28,171,193,143, 39,178, 60,156, 30, +114, 2, 61, 66,184,112,225,164,177,103,150,124,144,196,232, 50,251,226,245, 21, 93,101, 45,249,175, 89,191,126,253,223,134, 12, + 25, 66, 2, 64,199,142, 29,201,250,245,235,175, 68,233,169,114, 74,229, 20, 10,133, 2, 0, 56,116,232,144,242,241,227,199,157, + 15, 29, 58,164,180,126,223, 70,206,117,139, 23, 47,134, 88, 44,134,201,100,130, 94,175,183,248,103, 89,191, 26, 12, 6,184,184, +184,224,200,145, 35,160,105,250, 72, 89,229,244,245,171, 10,194,181, 58,182, 28, 58,139,243, 25,188,242,136, 44, 11,103,117, 15, + 73, 45, 15, 23,231, 83, 63, 45,152,235,154,245, 52, 18, 9, 9, 9,236,137,227, 71,174,104,129,196,156, 92,204,204, 86,163,150, + 70, 15, 97,227, 0,196,157, 90,251, 13, 59,163, 53,140, 40,126,213,160,133,179,142,135,164,150,183,171,243,137,159,127, 90, 32, +203,126, 26,137,228,148, 20, 28, 61,114,232,182, 22, 48, 79, 55, 14,103, 24,166, 46,195, 48,117, 1, 12, 47, 69,188,216,197,153, +159,159, 95, 47, 63, 63,191, 94, 69,114,178, 44, 91,143,101, 89,155, 57,173,125,162,150, 46, 93, 26,157,156,156, 60, 36, 45, 45, +173,147,121,203,202,202,234,152,151,151,215, 54, 63, 63,191,149,102,105, 85,135,252,252,124,183,188,188, 60, 79,173, 86,219, 16, + 64,164, 29,117,222, 2,235,168,211,201,201,201,179,146,147,147,137,178,202, 73,141,139, 38,182,255,252,245, 95,107,215,174,245, +124, 67,254, 87,202,153,145,145,177,103,231,206,157,161,254,254,254, 1,195,135, 15,199,154, 53,107,176, 98,197, 10, 29, 0,108, +216,176, 65,103,101,201,242,141,137,137,105, 84,194,180, 97, 71, 43,107,201,214, 15, 63,252,144, 61,127,254, 60,122,245,234,101, + 9, 36,250,251,239,191,195,100, 50,169, 58,116,232,192, 0,128, 70,155,175, 98, 25, 22,122, 67,137,243,239,175, 93, 79, 62,159, +255,145,117,188, 64,115, 48,102, 62,159, 15,150,101, 81,171,101,203,140,236,144, 16,229,198,156,156,252, 89,245,234,201,195,131, +130,134,215, 6, 6, 23,199, 73, 16,196, 43, 86,157,162,155, 29,150, 44,235,114,166,105,146, 48,250,175, 5, 47,143,155, 45, 91, + 66, 41, 7,218, 92, 19,246,255,248, 50, 93,155,142,223, 75, 18, 63,165,157,187, 82,169,252,226,199, 31,127,212, 41, 20, 10,124, +252,241,199,152, 63,127,254,168,150, 45, 91,230,184,185,185, 93,173, 81,163,198,189, 1, 3, 6, 36, 71, 70, 70,126,209,174, 93, + 59, 60,121,242, 4, 63,255,252,115,118, 86, 86,214,160,210, 56, 9,130,176, 88,242,122,118,237,168, 92,189,242, 23,166, 67,155, +241, 16,139,228, 48,114,125,161,204, 51, 34, 75,205, 66, 47,104, 2, 62, 79,128, 78,205,130,113,245,196,230,124, 90,175,222, 82, + 86,157,207,203,203,219, 59,108,216, 48, 21,143,199,131, 94,175,103,185, 92, 46, 4, 5,126,199, 12,183,115,103, 67,243, 7, 15, + 76, 52,203, 50, 4, 65,224,171,175,190, 82,103,101,101,237, 44,207,115,100, 7,172, 57, 43, 42,220, 66,199, 34,253, 79, 69,132, +133,120, 27,231,254, 62, 99, 93, 49,219, 63, 22, 45,243,146, 74,243, 43, 65, 48, 52, 77, 51,168,230, 95, 77, 22,243, 50,110, 85, +255,254,253, 70,118,233,210, 85,220,181,107, 87, 97,112,116,193,104,244,208,161, 67,216,183,111, 95,254,201,147, 39, 85, 2, 46, +181,193,183,138,175, 59, 77, 51, 32, 8,166, 84, 53, 44,147,201,190,252,246,219,111, 69, 57, 57, 57, 88,177, 98, 5, 19, 26, 26, + 74, 74, 36, 18, 24, 12, 6,108,216,176,193, 24, 28, 28,204, 37, 73, 18, 57, 57, 57, 32, 73,242,145,141, 39,120, 55, 39, 46,177, +211,111,237,250,236,107,244,249, 8,231, 58,237,154, 43,218,250,122,195,216,128, 69, 82,252, 75, 60, 62,115, 50,235,254,137,101, +153,208,166,246, 65,217,233,129,138,235, 8,126, 56,121,242,164,219, 23, 95,124,193,106,181, 90, 34, 46, 46,142, 93,176, 96,129, +219,232,209,163,127, 72, 74, 74,250,164,156, 55,133,200,206,206, 6, 65, 16, 76, 97, 67, 98, 30,245,219, 51, 47, 23,181,101,203, +150, 3,189,123,247,238,217,161, 67, 7, 68, 71, 71, 91,166, 8,173,133,150,121,245,225,194,133, 11,179, 1, 76, 47,139,148,203, +229, 98,197,150, 61,200,206,202,128,187,187, 23,132, 34, 17,202,187,194,146, 79,146,179, 22,205,253,222, 45,227,225, 85, 34,234, +202, 89,102,247,221,212, 52, 19,205, 22, 31,241, 63, 55,137, 45, 84,255,165,143,102, 72,106,214,162, 5,115, 28,204,211,154, 59, +111, 37,171, 8,154,253,226,141, 30,145,247,133,243, 95,134,151,151, 23,146,147,147, 9, 47, 47, 47,182,208, 71,139, 45, 69,104, +189, 90,193, 11,166,203,136,210,166, 13,203,203,255,226,197,139, 5, 13, 26, 52,248,250,201,147, 39,187,235,212,169, 51, 22, 64, + 21,157, 78,151, 61, 99,198,140,159, 54,108,216, 48,210, 22, 75, 22, 0,252,249,231,159,203, 70,140, 24,113,188,123,247,238,223, + 48, 12, 83,223,170, 99,127,225,230,230,102,153,194, 77, 79, 77,153, 54,102,228,192,105,121,121, 89, 54,199,185,147, 74,165,225, + 51,102,204, 16,170,213,106,252,250,235,175, 76,112,112, 48,105, 30, 20,109,219,182,205, 84,179,102, 77, 78,191,241,227, 51,150, +166,164, 96,222,133, 11,234,105,117,235,134,110,124,252,184, 33, 24,102,107, 73, 86,157,226, 44, 89,102,183,139,114, 34,169, 80, +108,253, 14,160,115,243,254, 30, 56,176,248, 37,178, 98,244, 63,193,132,103,176, 33, 45, 80, 49, 72,216,187,119,111,167,212,212, +212, 3,223,127,255,189, 67,195,134, 13, 81,183,110, 93,174, 84, 42,109, 98, 14, 23,147,147,147,131,211,167, 79, 99,205,154, 53, +250,251,247,239,247, 46,109,186,138,166,233,180,154, 53,107,154,175, 3, 75, 16, 68,166, 74, 71, 56,236,170,221, 68, 58,124,204, +110,226,226,141,203, 72, 50, 48,208, 25, 25, 84,243, 15, 67,219,206, 75,113,240,216, 61, 58, 41,230,193, 3,163, 38,107,189, 13, +229,125,246,244,233,211,253,115,231,206,237,255,205, 55,223,136, 50, 50, 50,104,157, 78,199,236,217,179,135, 26, 62,124, 56,205, +114, 56, 12,143,195,193,151, 95,126,169,201,206,206,254, 11,248, 87, 19, 76,191,149,112, 11,111, 33, 44, 68,133, 89,179,172, 95, +255, 87, 80,236, 19,202, 80,228,165, 53,107, 87,127,244,231,142,157, 30, 20, 69,122, 60,123,254,252, 70,143, 62,125, 19, 79,157, + 58,229,196,115,112,104, 12,128,209,143, 29,123,197,160,211, 40, 15, 31, 56,224, 87,173, 90,213,144,194,164,210, 44, 67,145,151, + 74,251,193,188,188, 60,245,133, 11, 23,242,167, 79,159, 78,196,199,199,111,119,119,119, 31,112,236,216, 49,105,159, 62,125, 52, +209,209,209,123, 61, 60, 60,122,182,107,215, 78,246,245,215, 95,235,242,242,242,236, 73, 60,250,128, 77,207,170,125,253,251, 37, +159, 94, 95,188,250, 3,112,168, 22,208,113, 1,198,120, 9,134,220, 83, 0,182,195,142,120, 71,214,144, 72, 36, 33, 98,177, 24, +183,111,223,206,106,210,164,137, 94,171,213,242,230,207,159,239, 44,145, 72, 66,202,123,225, 89,150,101,179,178,178,192, 48, 12, + 7, 0, 81,248, 10,198,254,181,248,159,244,232,209,227,192,174, 93,187, 62,236,218,181, 43, 2, 2, 2, 96, 52, 26, 81,179,102, + 77,232,245,122, 4, 6, 6, 66,167,211, 97,246,236,217,200,201,201,153,140, 82,114,158, 17, 4, 1,147,201,100,113,182,245,246, +241, 43,136,211,243, 6, 97, 44, 36, 92, 50,224,209,225,141, 72,203,204, 96,118,221, 73, 77,205, 55,208,157,158,166,231,223, 47, +122, 92, 62, 13,117,187,225, 19, 18, 1, 64,199,148,158,113, 94,194, 71,192,227, 35,191, 35, 53, 45, 3,127,222, 74,206, 86, 27, +152,206,143,139,225,180,171,156,239, 9,103,216,236,104,244,157, 96,251,177,111, 2, 91, 5, 85, 73,184,157, 2,226,166,120, 35, +139,181, 27,139,141,145,245,134,252, 7,158, 60,121,114, 0, 0, 30, 60,120, 16, 63,112,224,192,105, 47, 95,190,156, 11,224,104, + 76, 76,204, 90,123,136, 54,110,220,248, 4,192,136,210,142,217,185,100,196,126, 0,251,237,225,205,205,205,213, 70, 70, 70,106, +191,254,250,107, 34, 62, 62,254,152,135,135,199,135,199,143, 31, 23,247,233,211, 71, 23, 21, 21,117,198,203,203,171,117,199,142, + 29,165, 71,175, 93, 75,204,127,246,236,240,225,151, 47,125,140, 12,115,184,180,231,179,130, 69,214, 43, 98,107,255,188,151,139, + 14, 44,122,217,145,209, 97,175, 62, 11, 87, 0, 36,188, 1,231,249, 75,151, 46,213, 25, 60,120,240,174,110,221,186, 53,175, 83, +167, 14,170, 84,169,130,199,143, 31, 35, 61, 61, 29,119,239,222,197,161, 67,135, 14,105,181,218, 50, 19,106, 43,149,202,215,211, + 19, 9,157,188, 54,255, 58,235,208,141,139,141,107,182,234, 58, 76, 84,215,139,129,222,192, 34, 62,246, 25,102,207, 92,159,159, + 28,251,228,129,193,100,232, 13, 27, 23,234,104, 52,154,117,203,151, 47,231, 30, 62,124,184,235,170, 85,171,100,126,126,126, 20, +143,199, 35, 1,176, 55,111,222,100, 39, 76,152,160,206,200,200, 56,162, 82,169,214,253,203,125,244,249,231,207,159,135, 81, 20, + 85,161,225, 22,222, 32, 44, 68, 37, 42, 18,254,254, 62,117,170,251,121,141, 13,168,226, 51,222,223,207,119,104,113, 78,238, 1, + 10,133,204,191,170,119,120, 64, 21,159,241,213,253,188,198,250,251,251,212,177,193,180, 24, 32,151,203,143,121,122,122,134, 2, +128,131,131, 67, 79, 71, 71,199,251, 14, 14, 14, 61, 11, 71,129, 61,165, 82,233,195,224,224,224,209,255,162,185,178, 84,206,154, + 53,107, 14,204,203,203,251,172,102,205,154, 3,205,251,207,158, 61,179,236,151,135,211,215,215,183,195,205,155, 55, 63, 89,178, +100,201,199, 53,106,212,232,185, 96,193,130,143,255,250,235,175, 79,124,124,124, 26,150,131, 83, 0,224, 15, 46,151,155,202,231, +243,211,184, 92,110,170,121,227,112, 56,169, 20, 69,165, 2, 88, 91,130,181,172,163,213, 40,231,162,187,187,123,140,187,187,123, +140,135,135, 71,140,135,135, 71,140,167,167,231,107,155,139,139,203, 69, 91,175,103,144,135,180,101,147, 42,178, 75,245, 60,165, + 23,107,187, 75,130, 42,226, 30, 5,121, 72, 91, 54,174,226,112,169,158,167,236,194,255, 55,206, 80, 15,176,236,154, 32,150, 93, + 19,196,134,122,128, 45,107,191, 34,205,254,158,158,158,172,167,167,231,172,183, 53,149, 80, 2,255,191,254,188, 87, 32,103,128, + 76, 38,219, 89,165, 74, 21,115, 91,215, 93, 46,151,255, 45,149, 74,187, 23,182,117,221, 37, 18, 73, 68,112,112,240,176,178, 56, +157,156,156,110,186,185,185,165, 20,110,201,238,238,238,201,238,238,238,201,110,110,110, 73,110,110,110, 73,174,174,174,137,230, +205,209,209,241,106, 57,207,221, 13, 64, 83, 0, 13, 1,200, 43,240,122,250, 3, 24, 83,216, 6,253, 8, 96, 52,128,250, 21,112, +143, 8,174,200,105,156,192,209,247, 18, 87,234,154,203,149,186,230, 10, 28,124, 46,149,146,130,199, 22,206, 90, 78, 78, 78,243, +229,114,249, 95, 50,153,236,130, 76, 38, 59,224,226,226,178, 0, 64,173,255,168, 46, 73, 1,108, 64, 65,124,166,163, 40,152, 10, + 63,128,130, 69, 5,126,239, 96,157,255,255,140,240, 98, 12, 42,248, 55,162, 64,117,172,228,172,228,172,228,172,228,172,228,172, +228,124, 15, 57,201,202,235, 89, 41,180,236, 20, 90,175,108,102,161,197,169,188, 54,149,168, 68, 37, 42, 81,137, 74,188, 6,166, +242, 18, 84,194, 78, 20, 59,181, 76,148,162, 74,237,137, 53, 85, 30,101,123,186,146,179,146,179,146,179,146,179,146,179,146,179, +146,243,255, 29,231,255, 11,252, 91,201, 99, 42,205,170,149,156,149,156,149,156,149,156,149,156,149,156,149,156,255,235,168,156, + 58,172, 68, 37, 42, 81,137, 74, 84,162, 18,149,120, 75, 88,103, 37,184, 94,153, 66,172, 20, 90,246,131, 4,240, 25,128,190, 0, +170,163, 32,155,253, 30, 0,191,161,124,115,250,114, 0,211, 0,180, 64,193,234,156, 23, 0, 46,160, 96,117, 78, 94,229,229, 46, + 30, 46, 46, 46,223,114,185, 92, 71,160, 32,181,137,249,213,250,127,154,166,179, 85, 42,213,130,183, 84, 4, 10, 54, 70, 80, 54, +151,213,186,108,214,175, 70,163,241,109,150,179, 18,239, 38,106, 58, 57, 57,253,161, 84, 42, 7,193, 42,201,114, 37, 42,241,191, + 0, 87, 87,215,177, 6,131, 97, 6,143,199,155,159,158,158,190,250,255,209,169,191, 38,178, 94, 17, 90,135, 15, 31,142, 0,128, +110,221,186,181, 1, 0, 71, 71,199,203, 36, 73,250,219,243, 11, 12,195,188,200,206,206, 46, 49,128,154,163,163,227,101,138,162, + 94,227, 52, 26,141, 50, 14,135,147, 91,220,119, 76, 38, 83,130, 74,165,106,248,142, 92, 68, 2,192, 97,133, 66,161,157, 59,119, +238,111,109,219,182,245, 77, 74, 74, 50, 77,157, 58,181,245,157, 59,119,186, 2,248,200, 78,177,213,140, 32,136,205,161,161,161, +251,135, 14, 29,186,171, 73,147, 38,252,204,204, 76,217,158, 61,123,188,183,108,217, 18,201, 48,204, 32,148,146,104,245,125, 4, +203,178, 37,230, 74, 44,237,179,162,224,114,185,142, 9, 9, 9, 50,243,247, 10,133, 21,140, 70, 35,140, 70, 35,212,106, 53, 66, + 66, 66, 42,188,252, 30, 30, 30, 97, 4, 65,172,146, 74,165, 13,243,242,242,110, 0, 24,159,156,156,124,199,158,178,154, 76, 38, +176, 44,107, 41,103,157, 58,117, 42, 91,102,251, 48,138,207,231,119, 14, 12, 12,108,172,211,233,178, 94,188,120,113,157,166,233, +239, 81,113, 57,218, 28, 0,124, 47, 16, 8,154, 84,175, 94,221,247,201,147, 39,241, 6,131,225, 26, 10,146, 33,231, 84,132,200, +106,211,166,205,197, 95,127,253,213,121,220,184,113, 23, 47, 92,184,208,178, 82,108, 85,226,191,130,175,175,175,163, 90,173, 94, + 15, 32,140,203,229,122, 8,133, 66,136, 68,162, 20,129, 64,112, 91, 36, 18,141,188,116,233, 82,182,189,156, 52, 77,127, 31, 19, + 19,227,209,180,105,211,197,110,110,110,179, 51, 50, 50,180, 6,131,225, 76, 86, 86,214,100, 0,170,210,190, 91, 84,139,188,103, + 34,203,250, 21,102,209,197, 41, 60, 49, 22, 64,219, 87, 20, 24,135,227, 19, 27, 27,235, 38, 20, 10,193, 48,140,165, 51, 43,186, +153,223,215,235,245,168, 91,183,174,161,140, 14,199, 55, 62, 62,222,141,207,231, 91,222,211,235,245,240,246,246,102, 18, 18, 18, +220, 10,211, 30, 88,160,211,233,224,227,227,243, 46,229, 60,250,204,201,201, 41, 39, 46, 46, 62, 68,171, 51,204, 25,253,197,244, +111, 7,245,253, 64,113,249,242,101,230,163,143, 62,210, 69, 68, 68,124,134,130,196,169, 54, 53,230, 4, 65,108,153, 58,117,234, +108,161, 88,238,124,246,242, 3,221,150, 61, 71, 18, 67,107, 86, 35, 38, 79,158, 76, 77,152, 48,225,124, 88, 88,216, 31, 12,195, + 52,128, 29,150, 45,133, 66,113, 92, 32, 16, 84, 45,188,126,113, 89, 89, 89, 31,190, 75, 53,177, 80, 72,113,240,122,240, 88, 14, + 65, 16,118, 7,148,205,204,204,132, 70,163,121,109,171, 83,167,206,219,112, 68,228,112,185,220, 3, 11, 23, 46,244, 78, 73, 78, +198, 47, 75,151, 54, 69,129, 37,179,169, 45, 95, 78, 75, 75,123,173,156, 65, 65, 65,168,132, 93,152, 54,123,246,236,133,159,126, +250, 41,104,154,134, 70,163,241,122,250,244,105,240,140, 25, 51,122, 63,123,246,172, 49,128,231,111, 58, 24, 15, 12, 12,140,158, + 56,113,162, 83,227,198,141, 81,152,165,194,235,194,133, 11, 77, 55,108,216, 48, 36, 46, 46, 46, 8, 64,250,155,252,128,147,147, +211, 31,191,255,254,187,179, 88, 44,198,193,131, 7,157, 59,116,232,112,225,214,173, 91,173,222, 64,108,145,206,206,206, 19, 0, +180,103, 24,134, 15,224, 90, 86, 86,214, 60,216, 31,213,221, 83, 42,149,238, 37, 73,178,154,213,179, 10,146, 36, 93, 8,130,200, + 48,191, 71, 16,132, 27,195, 48, 87,148, 74,101,243,202,234,248,126,195,217,217,121, 84,106,106,234,175, 2,129,128,167, 80, 40, + 32, 22,139,193,225,112,192,225,112,170, 8, 4,130, 42, 2,129,160, 75,187,118,237,198,255,253,247,223,165, 70,216,111, 22,234, + 62, 28, 36, 49,135, 34, 72, 10, 0, 72,174, 68,238,224,224,128, 57,115,230, 72,122,246,236, 41, 1,128,139, 23, 47, 14, 29, 54, +108, 88,135,132,132,132,186, 37,137,173,226,180,200,123,132, 18,131,217, 90, 39,149,142,120,229,201, 37, 73,240,249,124, 92,189, +122, 21,182, 4, 43, 55,167, 72, 40,181, 53, 40,140, 48,126,231,206, 63, 6, 0,115, 71,195,231,243,113,233,210,171, 65,229,155, + 53,107,102,179,133,163,162,208,183, 78, 65,144,199,221,159, 23,148,171,223,170,130,232,218,187, 63, 15, 66,235,159, 99,209,119, +194,172, 1,249, 90, 67, 35, 0,234,236,172,172,172, 27,251,246, 37,133,214,172,201,251,227,143, 63, 26,123,123,123,247,181, 67, +104, 77,107,208,160,193, 94, 74,228,224, 50,116,216,240,161, 35, 57,164, 97,200,152,175,231,199, 39,103,168,195,195,195,247, 29, + 60,120,112,232,162, 69,139, 30, 78,153, 50,101, 26,128,239,108, 45,191, 80, 40,172,250,232,209,163, 64,154,166, 81,167, 78,157, +119, 49,141, 65, 40, 10,130,239,125, 10, 96, 71,225,123, 3, 81, 16,185, 63, 12,192,109,123, 44, 91,102, 11, 86,113, 91, 69,195, +219,219, 59,104,240,224,193, 46,202,140, 12,252,178,116,169,249,237,134, 40, 99, 26,209,252,252,232,245,122,124,252,241,199,131, +105,154,230,152, 69,160, 78,167,211,231,228,228,104,241,143, 99,105, 58,128, 15,108, 40,142,191, 68, 34,249, 9, 64,152, 70,163, +241, 6, 0,137, 68,146,200, 48,204,126,181, 90,253, 29,254, 73,224,107,247, 0, 23, 64, 48, 74, 78, 5,197, 46, 92,184,240,201, +244,233,211,159,255, 7,156, 85,221,221,221, 23,244,235,215, 15, 71,142, 28,193,209,163, 71,141, 34,145,136, 51,108,216, 48, 98, +252,248,241,138,137, 19, 39,118, 1,176,252, 13,111,115,151,217,179,103, 59,213,174, 93, 27,123,246,236,193,221,187,119, 53,129, +129,129,162,182,109,219,130,195,225, 56,125,251,237,183, 31, 1,216,252, 38, 63,160, 84, 42,231,125,253,245,215, 91,118,236,216, + 33,123,241,226, 5, 86,173, 90,229, 50, 96,192,128,136,184,184,184, 54,118,136, 45, 1,128, 9, 0,218, 81, 20,213,106,216,176, + 97,166, 47,190,248,130, 75,146,164,113,233,210,165,174, 27, 54,108, 24,192,229,114,195, 50, 51, 51,109, 25,164,145, 0,230,140, + 28, 57,114,196,223,127,255,173,184,126,253, 58,223,217,217, 25, 52, 77, 91, 44,197, 12,195,184,153,235,172,201,100, 66, 80, 80, +144,143,213,247, 69,239,171,208, 32, 73,210,192, 48, 12, 23,128, 16,128,174,172,253,255, 37,145,229,228,228, 52, 78,169, 84,254, +230,225,225, 1,119,119,247,215,218, 92,157, 78, 7,161, 80,200,243,240,240,248,189,103,207,158,220, 3, 7, 14,148, 56, 5, 72, + 80,196,247, 7,119,206,245,118, 82,200, 0, 0,203,214,156,200, 7,128,191,254,250, 11, 73, 73, 73, 80, 40, 20,168, 91,183, 46, + 53,119,238, 92,207,201,147, 39,255,146,149,149, 53,178, 36,174,162, 90,228, 61,179,104,173, 43,110,191, 84, 31, 45,150,101, 45, +121,242,108,172,180, 69,223, 58, 93,132,143,208,235,245, 40,106,209, 50, 63,188, 92, 46,183,168,249, 17, 4, 65,176,165,113, 22, +131, 97, 18,137, 36, 68,173, 86,175,180, 99,116,107,225,220,253,121, 16,182, 8,166, 14, 52,103, 34,237,242,117,193,235, 22, 0, +151, 95,142, 92,245,107,155, 54,222, 19,102,174,152,165,201, 76,202,248,118,112,247,170,129, 30,206, 34, 73,118, 90,142, 83,173, + 90,157,138, 88,105,202, 42,103,235,161, 67,135,110, 61,121, 53,134, 16, 10,121, 60, 14, 69,113, 91,214,171,233,236,235, 64, 57, +200, 0,135,248,231, 79, 46, 15, 31, 62,188,222,148, 41, 83, 90,217,193,137,194, 14, 23,219,182,109, 3, 65, 16,164, 61,231, 94, +129, 40,122,223,205, 15,113, 40,128, 91,133,251,219,173, 58,149,237,133,239,221, 50,139,173, 98,172, 94,167,139,138, 23,243,244, +155,209,104,196,176, 97,195, 6,155, 76, 38,142, 85, 35, 81, 84,192, 20, 39, 98,108, 58,119, 79, 79,207,147, 0, 62, 32, 8, 2, +122,173, 86,255,211,207, 63, 91,127,124,179,136,200, 58, 93,210,179,100, 52, 26, 65,211, 52,231,214,173, 91, 92,171,186,206, 5, + 32, 1,224,194,178, 44, 72,146,188,103,195, 61, 10, 18,139,197,151, 15, 29, 58, 36,111,216,176, 33,193,231,243, 97, 50,153, 16, + 21, 21,229,187,104,209,162, 49,167, 79,159,254, 72,173, 86,215,193,235,201,211,109,185,239,193, 23, 46, 92, 80, 7, 4, 4, 20, + 43, 28, 85, 42, 21,167,102,205,154,109, 74, 16, 69,111,155, 51, 33, 53, 53,181,215, 7, 31,124, 48, 54, 37, 37, 37,218,100, 50, +125, 3,160,174,139,139,203,173, 62,125,250, 64, 36, 18,181,211,104, 52,203,223,164,206,187,185,185,245,108,222,188, 57, 86,173, + 90,133, 69,139, 22,117, 4,112, 6, 64, 7,149, 74,117,186, 71,143, 30,112,116,116,236,149,157,157,189,249, 13,158,163,154,173, + 91,183,254,125,206,156, 57,178, 35, 71,142, 32, 48, 48, 16,185,185,185,248,234,171,175,220,126,248,225,135,115,217,217,217,109, +173,158,139,146, 56,235, 8, 4,130,205, 59,118,236,144, 6, 4, 4, 4,240,120, 60, 50, 32, 32, 0, 74,165, 18, 90,173, 86, 48, +127,254,252,122, 34,145,232,206,242,229,203, 55, 3,232, 83, 70, 57, 73, 0,243,214,174, 93, 59, 54, 60, 60,220,113,240,224,193, +180, 94,175,199,174, 93,187, 64, 81, 20,184, 92, 46,196, 98,177, 37,121, 53,143,199, 67,173, 90,175, 5, 73, 63, 88,202,249,230, +160,192, 15,213, 17,246, 77,187,158, 46,133,207, 50,245,193,229,114, 33, 20, 10, 33, 20, 10, 33, 16, 8,240,232,209,163,153, 66, +161,112,105, 9,214,241,215, 56,137,127,212, 69, 8,128,235,101,237,227,117,215,144,183,222,126, 22, 3, 31,130, 32,150, 1,104, + 87,208,237,146, 17, 46, 46, 46, 95,166,166,166,198,218,202,233,233,233,233,156,153,153,185,220,211,211, 19,238,238,238,150,254, +219,219,219, 27, 70,163, 17,169,169,169, 96, 89, 22,217,217,217, 16,139,197,240,242,242, 90, 30, 30, 30,190,103,221,186,117,153, +197,114, 50, 88,212, 99,192,140,239, 41,138, 34, 1,128,226, 72,165, 19,167, 3, 85,171, 86, 69,203,150, 45,161,213,106,145,147, +147,131,224,224, 96, 14, 65, 16, 67, 9,130,144,179, 44,187, 26,192,217,255, 65, 67, 97,137,206,240,179,139,206,139,154,179,197, +243,120, 60,155,132, 86,225,241,101,153, 33, 72,163,209, 8, 30,143,247,138, 69,130, 32, 8,208, 52,253,202,251,102,161, 85, 30, +161, 62,126,252,120,230,247,223,127, 31,155,149,149,181, 6,229,156, 74, 24, 58,116,232,107,254, 30,147, 39, 79, 78, 72, 75, 75, + 99, 63,238, 20, 34,137, 62,150,148, 92, 93, 33, 21,185,202,100,213,132, 10, 39,199,204,204,204, 43,133,141,137,173,168,209,160, + 65, 3,209,150,125, 23, 18, 70, 79, 90, 56,183, 97,128,179,188,190,143,139,194,195, 65,196,151,146,132, 90,104, 50, 38, 56, 57, + 57, 5,218, 91,110,115,187, 32, 22,139, 65,146,228, 59, 97,209,178,154, 46,188,197,178, 44,148, 74, 37,142, 28, 57,130,174, 93, +187,222, 50,139, 16,149, 74,133,228,228,100,120,122,122,222, 42,180,124,148, 57,141,200, 48, 12, 12, 6, 3, 12, 6,131, 69,192, + 88,213, 33,139,128, 49, 31, 75, 81,212,189,114,158,194, 92,133, 66,209,186, 93,187,118,252,157,187,118,241, 89,150, 85,163, 32, +135, 90, 30,203,150,144, 32,187, 8, 76, 38,147,197,202,198,229,114, 17, 23, 23,103,233,184,204,185, 37,133, 66,161,109,166, 12, +129,224,235, 63,255,252, 83,222,184,113, 99, 34, 51, 51, 19, 12,195, 88, 26,201,223,126,251, 77,216,183,111, 95,239,200,200,200, +111,117, 58,221,236,242,220,174,146, 4, 17, 0,200,229,114, 19,108,139,152, 93, 38,167,201,100, 34, 90,180,104, 49, 37, 35, 35, +163,158, 70,163,153,111,203,101, 4,112, 48, 33, 33,193,186, 99,191, 19, 29, 29,173,233,223,191,191,168, 90,181,106, 77, 30, 60, +120,240, 70,117,181,102,205,154,205,184, 92, 46,174, 93,187,166, 3, 96, 30, 89, 71,220,189,123, 87,215,167, 79, 31,129,175,175, +111,179,236,108,155, 93, 86,106, 6, 5, 5,157,114,115,115, 19,153,219, 80, 87, 87, 87,238,186,117,235,100,137,137,137, 48, 24, + 12,152, 54,109, 26,186,117,235, 6, 23, 23, 23, 76,158, 60,217,125,241,226,197,127,228,229,229, 53, 40,205,104,205,231,243,183, + 62,125,250, 52,208,211,211, 83,116,245,234, 85,212,175, 95, 31, 25, 25, 25, 72, 73, 73, 65, 94, 94, 30, 82, 82, 82, 48,114,228, + 72,183, 95,126,249,197,203, 6, 75,150, 69,100,173, 91,183, 46,123,239,222,189,212,250,245,235,101, 92, 46,215, 34,180, 56, 28, +142, 69,104,153,115, 43,150, 99,166, 33,187, 80,180, 57,230,228,228,228,188,193, 45, 18, 0,224, 91,139, 44,129, 64, 0,129, 64, + 0,161, 80,248, 70,121, 89,223, 19,120, 19, 4,241,128,199,227, 9,196, 98, 49,143, 36, 73, 8, 4,130, 78, 78, 78, 78,247,235, +214,173, 91,247,212,169, 83, 49,182,144,104,181,218,173, 2,129,128,235,230,230, 6, 0, 8, 12, 12, 68,253,250,245,161, 86,171, +153,156,156, 28, 56, 58, 58,146,177,177,177,208,104, 52, 72, 78, 78,134,159,159, 31,151, 36,201,173, 40,240, 67,126, 13,151,111, +165,172, 1,176,198,188,239,226,226,146,106,109,233, 20, 10,133,240,246,246, 70, 98, 98, 34,100, 50, 25,245,195, 15, 63,244,217, +181,107, 87,239,203,151, 47, 15, 5,176,205,138,106,246,123,236,163,101, 22, 89,214,175,255, 8,173,110,221,186,205, 58,124,248, +112,155,226, 70,225, 92, 46,183,194,124, 93,204,130, 74, 46,151, 23,181, 90,129, 97,152,146, 44, 90,118,255,142, 80, 40, 20,141, + 27, 55, 46,119,245,234,213,118,139,173,126,171,162, 45, 86,172,215,134,145,117,234, 92,254,246,219,111,123,254,253,247,223,137, + 13, 3,170,113, 36, 73,177,121, 66,185,163, 35,124,170,116, 29,214,171,207, 93, 20,172, 62,180, 21, 79,115,115,115, 69,213,125, +196,122,146,212, 18, 85, 4, 28,153,167,132, 39,240, 80, 40,188,121,122, 93,154, 92,161,224,235,116,186,108,148,146, 4, 26, 0, +220,221,221, 79,136, 68, 34, 63,243,190, 66,161,112, 96, 89, 22, 98,177, 24,158,158,158, 82,138,162, 30, 91, 61, 92,177,169,169, +169,157,202, 42,152,163,163,227, 9,129, 64,224, 71,146, 36, 8,130, 0, 69, 81, 32, 73, 18, 36, 73, 90,254,167, 40, 10, 4, 65, + 32, 63, 63, 63, 54, 38, 38,166,147, 13,231,107, 2, 16, 70, 16,196,173, 35, 71,142,160, 73,147, 38, 56,118,236, 24, 58,119,238, +140,156,156, 28, 68, 69, 69,161,117,235,214, 0,240,169,173,247,220,218,249,221, 60, 40,120,244,232,145, 69,184, 88,111, 50,153, +236, 77, 76,236, 23,251,245,235,135,223,127,255,157, 45, 28, 76, 72, 8,130,168,239,224,224,240,232,225,195,135, 54,249,193,176, + 44, 11,131,225,159, 67,205,157, 87,161, 63,132, 93,201,129, 41,138,234,212,160, 65, 3, 34, 39, 39,199, 44, 32,193,225,112, 64, + 81, 20, 40,138,194,175,191,254, 42,106,220,184,241, 12,129, 64, 48,133,199,227,169,140, 70,227, 78,173, 86, 59, 31, 64,246,187, +212, 34,181,106,213,106, 82,124,124,124, 55, 63, 63,191, 67,111, 64,195, 26,141, 70, 61, 0, 17, 69, 81,220, 10,104,163,168,194, +186,165,181, 18,251,166,194,125, 1, 10,166,137,109,130,139,139,203, 31, 71,143, 30,245,241,243,243,131,209,104,132,201,100, 66, + 94, 94, 30, 34, 34, 34,160,211,233, 96, 50,153, 16, 24, 24,136,239,191,255, 94,251,229,151, 95, 10,215,174, 93,155,150,151,151, + 55,168, 12,218, 47,247,236,217, 35,241,244,244, 20,105, 52, 26, 60,127,254, 28, 13, 26, 52, 64,110,110, 46,212,106, 53,242,243, +243, 97, 48, 24,160, 82,169, 28,105,154,214,151,193, 53,211, 90,100,141, 25, 51,230, 30,159,207,111,240,197, 23, 95, 32, 33, 33, +193,242,204,143, 30, 61, 26,238,238,238,150,103,169,240,249,180,171, 97,230,112, 56, 16, 8, 4,224,241,120,217, 85,170, 84, 1, + 65, 16,194,216,216,216,242, 76,197,201, 1,168,184, 92, 46,223, 90, 96, 9, 4, 2, 92,187,118,237, 91, 62,159,191,212, 30, 95, + 79,182, 72,231, 86,214,254, 59, 48,104, 93,198,227,241, 4, 78, 78, 78, 60,171, 1, 39, 79, 42,149,194,205,205,109, 21,128, 46, + 54,158,119,168,147,147,147,165,125, 15, 9, 9, 65,124,124,252,254,156,156,156, 33,105,105,105, 32, 73,114, 43, 73,146,189,205, +131,212,172,172, 44,248,250,250,134,150,196,215, 60,204, 99, 44, 8,246, 21,139, 86,145, 1, 26,228,114, 57, 94,190,124, 9,181, + 90,205, 62,121,242,132, 24, 55,110, 28,161,215,235, 55, 69, 70, 70, 94, 65,193,106,251, 18,181,200,123, 2,251,125,180,204, 22, + 45, 91, 59, 0,130, 32,202, 28, 77, 24,141, 70,105,112,112,112,113, 14, 95, 68,113, 66,171,112, 58,169, 92, 21,157,203,229,202, +202, 43,182,138,226,208,222, 29,238,139,190,159,246,189,147, 87,181,234, 83,166,204,228,116,239,222,253,234,150, 45, 91,104,167, +218, 93, 58,156, 61,177,205,125,249, 87, 83,143, 29, 61,122, 20, 40,112,140,182, 21, 23, 15, 31, 62,236, 49,121,194,120,124,255, +245,151,199,229,129, 46,124, 41,225, 36, 17,234,212,233, 82,176, 26, 65,141,160,110,251, 14, 29, 74, 6, 16, 89, 26,137, 88, 44, +246,123,240,224, 65,160,245, 66, 2,189, 94, 15,177, 88,140,179,103,207,186,138, 68, 34, 87, 0,208,104, 52,168, 91,183,174,173, + 22, 19,191,199,143, 31, 7,202,100, 50,228,231,231, 67,167,211,193,104, 52,130, 97, 24, 16, 4, 1, 46,151, 11, 62,159, 15,137, + 68, 98,239,202,190,219, 0, 62,237,218,181,235,246, 99,199,142, 33, 56, 56, 24, 89, 89, 89,136,142,142, 54,139, 44,243,180,161, + 77, 48, 91,137,172,253,177, 56, 28, 14,254, 8, 8,192,232,164, 36,139,128, 89,230,224,128,239,153,242,101,211,168, 91,183, 46, +123,241,226, 69, 28, 63,126, 28, 61,122,244, 32, 14, 28, 56, 96,160,105,154,151,148,148,116, 47, 41, 41,201, 38, 14,134, 97, 44, +101, 53,183,219,214, 2,203, 94,161,101, 50,153,100,124, 62, 31, 90,173, 22,102,203,131,245,230,239,239, 15,165, 82,201, 81,169, + 84,156,164,164, 36,241,188,121,243,190, 56,119,238,156,103,110,110,238,192,255,178, 21, 90,189,122,181,223,232,209,163,227, 56, + 28, 14,219,185,115,231,193,177,177,177,189, 60, 61, 61,207,252,253,247,223, 63, 3,168,105, 47,159,139,139,203, 77, 14,135,227, +163, 82,169,120,187,119,239, 54,230,230,230,242, 92, 93, 93, 83,205,109,135,249, 90, 27,141, 70,155, 86, 46,187,184,184,220,204, +200,200,224,173, 92,185,210,152,153,153,201,115,119,119, 79, 53,243,100,103,103,243,118,239,222,109, 84,169, 84, 60, 7, 7,135, +155, 57, 57, 57,101,242,101,100,100, 12, 26, 58,116,232,133, 51,103,206,184, 80, 20,133,216,216, 88,100,102,102,194,209,209, 17, + 91,183,110,133,159,159, 31,246,236,217,163, 84, 42,149,163,126,250,233,167, 25,133, 34,171, 44, 31,173,214, 77,154, 52,241,203, +206,206,134,163,163, 35,212,106, 53,110,222,188,137, 58,117,234, 32, 41, 41, 9, 36, 73,194,209,209, 17,191,253,246, 91, 62, 65, + 16,202,210,136, 68, 34, 81,175,240,240,112, 71, 0, 8, 15, 15,119, 12, 15, 15, 47,182,131,107,214,172, 25, 86,173, 90, 85, 84, +104,217, 51, 48,176, 88,157,172,196,145,182,105,211,166, 56,119,238,220, 84, 59,197,145,222, 44,218,138, 90,179, 4, 2,129,221, +139,105, 24,134,225,161,192,165,129,176,101,255, 29, 64, 27,145, 72,196, 43,250,102,126,126, 62,207,211,211,179,149, 29,194,215, + 89, 36, 42, 48, 56,249,249,249, 33, 39, 39,135,214,235,245, 3,182,109,219,102, 4,128,176,176,176, 1, 52, 77,107, 77, 38, 19, +197,231,243,161, 86,171,225,230,230,230, 92,138,109,244,155,131, 59,231,121, 20,245,209,242,244,244, 68, 88, 88, 24,116, 58, 29, +146,147,147, 17, 17, 17, 97,164,105,122,251,234,213,171, 25, 87, 87,215, 17, 31,127,252, 49, 21, 25, 25,249, 57,128, 73, 37,105, +145,247,204,154,181,174, 68,161, 85,168, 32,207, 1,104, 91,244, 36,139,138,159,210,132, 86, 89, 83,135,124, 62, 63, 59, 46, 46, + 78, 98,221,169,152, 76, 38,120,121,121, 49, 44,203, 18,197, 9,173, 55, 49, 5,115,185, 92,217,244,233,211,179, 87,175, 94, 61, +232,229,203,151,179,108,249,206,238,207,131,176,165,136,200, 90,179,104,206,170,149,139,230, 57, 61, 59,190, 9,235, 87, 44,161, +105, 26,145,245,234,213,107,149,151,151,199,113,144, 24,145,145,141, 99,133, 34,203, 86, 81, 72, 2,216,120,253,250,245,200, 46, + 93,186, 92,218,248,231, 62,167,164,231,207,175, 8, 84, 25,201,242, 26,129, 28,158,183, 95,239, 92,173,150, 55, 96,192, 0, 87, + 0, 31,151,213,136,101,103,103, 35, 37, 37,165,168, 0,195,163, 71,143, 94, 59,214,166,194,145, 36,104,154,198,222,189,123, 33, + 22,139, 33,145, 72, 94,217,204, 34,171,156, 11, 21, 30, 3, 64,231,206,157,161, 84, 42, 33,149, 74,109, 46, 87, 81,241,194,178, + 44,244,122, 61,244,122, 61, 12, 6, 3, 13,128,203,225,112, 48, 50, 33,193, 98,229,177, 71,192, 20, 69,189,122,245,216,203,151, + 47,227,210,165, 75, 80,171,213, 88,185,114, 37, 60, 61, 61,219, 3,152,105, 47,151,149,147, 62,173, 82,169,184, 42,149,202, 98, + 29,228,114,185, 22,235,129,141,150, 60, 30,135,195,177,140, 70,205,155,181, 85,139,162, 40,184,187,187,195,195,195, 3,107,214, +172,225, 85,171, 86,173,219,127,217, 2, 45, 94,188,184,198,178,101,203, 54,108,217,178,229,216,160, 65,131,118, 69, 69, 69, 13, +119,112,112,184,119,246,236,217,121, 2,129,128, 41,231,243,237,147,148,148,228,102,253, 22,195, 48, 98,147,201,100, 17,182,249, +249,249, 54, 15, 48,184, 92,174,207,131, 7, 15,196, 0, 48,111,222, 60, 46, 0,177,217, 25,220,204,153,159,159,207,173, 83,167, +142,143,173,117,253,194,133, 11,173, 58,118,236,120,249,212,169, 83, 10, 63, 63, 63, 36, 38, 38, 34, 49, 49, 17, 53,106,212,192, +130, 5, 11,212, 42,149,170, 5,128,199,121,121,121, 7,108,228,244, 82, 40, 20,220,184,184, 56,152, 76, 38,132,134,134,226,183, +223,126,195,128, 1, 3, 80,183,110, 93,168, 84, 42, 60,120,240, 0,155, 55,111, 86,240,120,188, 82,219, 14,141, 70,115, 96,221, +186,117,190, 69, 45, 90,131, 7, 15,150,164,166,166, 90,234,228,156, 57,115, 94,153, 66,180,167, 77, 46,156,218, 42,113, 43, 15, + 76, 38,147, 92, 40, 20,170, 4, 2, 1,223,236,159, 21, 17, 17, 97,183, 53,171,200, 0,208,158,253,255, 12,102,209, 90, 76,223, + 10, 15, 15, 15,155,121, 4, 2, 1, 97,110, 27, 77, 38, 19,114,114,114,104, 79, 79, 79,203,244,254,173, 91,183,232,170, 85,171, +210, 20, 69, 81,124, 62, 31, 4, 65, 64, 44, 22,151,216,224,179, 52, 59,167,251,128,153,175,172, 58,156, 56, 29, 48, 24, 12,184, +117,235, 22, 12, 6, 3, 34, 34, 34,140, 63,253,244, 83, 82,118,118,246, 68, 0,156, 19, 39, 78, 12,157, 58,117, 42,229,230,230, +214, 49, 45, 45, 13,101,105,145,247, 72,108,189,102,229, 50,247, 66,231,186,117,235, 70, 20, 46,173, 36,204,194,201, 30,161, 85, +248,240,149,217,243, 18, 4,129,228,228,100,203,190,155,155,155,221,191,101, 43,156,157,157,213,205,154, 53,147,101,100,100, 28, + 88,188,120,113,185, 44, 89,107, 22,205, 89,181,112,238, 15, 78,202,135, 87,145,144,148, 12,101,154, 49,242,226,189,151,251, 1, +236, 7, 0,172,173,125,142, 24, 27,253,171,173,156, 65, 46,162, 16, 46,143,179,255,131, 46,221,124,251,135, 79, 34, 63,251,236, +179,150, 67,135, 14,205, 25, 52,104,208, 4,169, 84, 90,211, 96, 48,100,237, 59,114, 36,166,127,255,254,213,104,154, 30,138, 50, + 98,142,104, 52,154,216,182,109,219, 90, 95, 79,249,233,211,167,221, 99, 98, 98, 48,126,252,248,244,196,196,196,108,235, 99,109, + 41,163,193, 96,136, 13, 9, 9, 41,113,186,208, 60,165, 8, 0,185,185,185,177,118, 92,210,129, 40,116,124,207,204,204,196,163, + 71,143,192,225,112,208,180,105, 83, 92,188,120, 17, 45, 91,182,188,101,143, 85, 75,171,213,194,207,207, 15, 90,173, 22,106,181, + 58, 31,128, 96,107,181,106, 0,128,207, 51, 51,113,243,167,159,112,117,225, 66, 88,215,103, 91, 81,191,126,125,246,234,213,171, +184,119,239, 30,116, 58, 29, 70,141, 26, 5, 0, 68, 97,221,181, 39,100, 70, 0, 69, 81,157,187,116,233,226, 5, 0,106,181,154, +184,126,253, 58,132, 66,161,229, 89, 56,116,232, 16, 18, 19, 19, 65, 16, 4, 20, 10,133, 79, 86, 86, 86, 53, 0, 47, 75, 49,251, + 19, 47, 95,190,196,143, 63,254, 8,134, 97, 48,117,234, 84, 4, 6, 6, 90, 4, 86,108,108, 44,230,205,155, 7,154,166,241,195, + 15, 63,160, 70,141, 26, 48, 26,141, 66, 20, 31, 86,227, 95,193,228,201,147,159,237,223,191,255, 88,124,124,252, 71,139, 22, 45, +106, 67, 16, 4, 51,101,202,148, 31,229,114, 57,253, 38,188, 89, 57,185,120,244, 52,214, 34,132,138,110,174, 46, 78,118,243, 61, +121, 30,111,249, 62, 77, 91,243,209,112,118, 82,216, 91,196,124,163,209,168,238,221,187,183,227,222,189,123,137, 26, 53,106,224, +197,139, 23,102,203, 80, 62,236, 15,233,144,168, 84, 42, 3, 41,138,226, 61,125,250, 20, 85,171, 86, 69,147, 38, 77, 48,127,254, +124,100,100,100,192,100, 50,193,205,205,141, 49, 26,141,183, 12, 6,195,249, 50,184,230,140, 25, 51,134, 7, 96,108,161,101,171, +222,196,137, 19,153, 37, 75,150,224,214,173, 91, 22, 11,150,181, 51,188,189, 83,135,214, 86, 39,235, 45, 34, 34, 98, 42,159,207, +103, 1, 92,131,253,129,158,245, 69, 45, 90,229,177,102,189, 45,188,205,149,140,158,158,158, 17, 50,153,172, 91, 86, 86,214, 43, + 86,173, 22, 45, 90, 24,220,221,221, 47,216,202, 35,149, 74,179, 40,138,114, 6,128,196,196, 68, 72, 36, 18,222,243,231,207, 23, +162, 32,120, 54,170, 85,171,182, 80,169, 84,242,170, 21,182,167, 30, 30, 30,208,235,245, 37,186,177, 92,185,157,186, 9,192, 38, +243,190,147,147, 83,114, 78, 78,142,104,201,146, 37,121, 11, 23, 46,212,208, 52,173, 3,112, 54, 59, 59,219, 18, 71, 43, 37, 37, + 37,135,203,229, 58, 57, 58, 58,122,155,133, 86,113, 90,228, 61, 67,201, 22,173, 66, 37,201, 22, 21, 68, 4, 65,188,230,160, 94, +134,208, 42, 83,100,209, 52,253,138,149,193,236,240, 94,220,111, 21,118,234,229,154, 58, 44, 20, 89,194,125,251,246,109, 93,188, +120,241, 53, 91,191,103,237,163,181,246,231,185,139,204, 34,235,238,165, 83, 56, 16,157,147, 49,117,225,210,101,229,189, 3,181, + 93,196,245,221,221,157,207,253,180, 96,142,252,217,241,205,216,181,246, 23,246,238,141, 27,141,111,220,184, 49,100,252,248,241, + 85, 10, 43,150, 18,192, 29, 0,253, 97,195, 42,157,196,196,196, 78, 69, 58,225,199, 60, 30,207, 93, 44, 22, 35, 49, 49, 49,239, +201,147, 39,118, 79,201,100,100,100,116,122, 11, 21,144, 99, 22, 89, 25, 25, 25,120,240,224, 1,218,181,107, 7, 0,184,120,241, + 34, 90,180,104,129,200,200, 72, 52,104,208,224, 22,128, 70, 40, 35, 80,171,209,104,204,174, 93,187,182,197,186,149,147,147,195, + 0, 64,120,114, 50,214,121,122,130,195,225,224,234,194,133,248,206,104,196,124, 59, 5,124, 72, 72, 8,123,253,250,117,196,196, +196,192,100, 50,161,103,207,158, 40,231, 67, 95, 55, 40, 40,232,244,217,179,103, 93,165, 82, 41,212,106, 53,242,242,242, 48,108, +216, 48, 12, 24, 48, 0, 58,157, 14,187,119,239,198,193,131, 7, 33,147,201,160, 86,171,161, 86,171, 21, 93,187,118,189,252,248, +241,227,214, 0,158,150, 32,180,216, 78,157, 58,225,194,133, 11,160, 40, 10,141, 27, 55, 70,102,230, 63,139,129,220,221,221,139, +251,140,250, 47,133, 22,135,195, 97, 35, 34, 34, 22,181,105,211, 6,241,241,241, 31, 53,104,208, 96,229,240,225,195, 19,223,148, + 87,225, 32, 67, 72,157, 0,232,116, 58,232,116, 58,120,121,121, 33, 55, 55, 23,207,158, 61,131, 78,167,131,187,155,163,221,124, + 97,117,107, 88,248,220,220,220,160, 86,171,241,242,229, 75,232,245,122,184,184,216, 37,180,124, 59,117,234,244,247,246,237,219, +157, 55,111,222,172,111,219,182, 45,127,229,202,149,132, 92, 46,135, 85,199, 98, 47, 34, 46, 94,188,232,215,177, 99,199, 90, 15, + 31, 62, 68, 68, 68, 4,244,122, 61,194,194,194,240,228,201, 19, 52,107,214, 12,121,121,121,215,110,220,184,113,208, 22,195, 48, +128, 25, 99,198,140,129, 89,108, 93,184,112, 1,201,201,201,144,201,100,175, 9, 45,179,239, 99,225,170,113, 47, 91, 10,107, 22, + 68, 86,150,167,239, 28, 29, 29, 13, 0,150,149,211,250, 4, 0,136,143,143, 23,212,171, 87, 79, 39, 20, 10,249,133,162,109,233, +155,240, 85, 36, 42, 96, 37, 99,137,240,240,240,152,232,226,226,210,209,223,223, 31,169,169,169, 60, 62,159,143, 22, 45, 90, 24, + 26, 53,106,100,240,240,240,248,220, 86, 30,129, 64,240,144,199,227,181, 46, 24, 76,208,136,139,139, 3,203,178, 83,235,214,173, +251,101,110,110, 46, 50, 51, 51,249,114,185,220, 50,168,174, 85,171, 22,116, 58,221, 67, 59, 44,111,115,170, 86,173, 58,131,199, +227,205,207,200,200, 40, 46, 44, 4,223,209,209, 81,206,227,241, 96, 48, 24, 94, 17,155, 69,181,200,251, 46,178, 94, 17, 90, 86, + 42,242, 21,161, 99,143, 69,203, 22,171,129,217,193,222,122,223, 44,234,138,254, 86,121, 99,104, 57, 56, 56,232,204, 34,107,254, +252,249,215,202,195,177,103,251, 54, 79, 7, 38,223, 55,233,218, 81, 60,190, 23,137,253, 15,178, 51,166, 46, 92, 58,161,251,199, + 3, 83,139, 10, 51, 91, 16,232, 42,174,235,238,230,124,238,231,197, 11,229,202,135, 87,145,156,146,130,163,215,110, 68, 26,128, + 7, 0,166, 86,164,105, 25, 40,152, 58,164, 40,234,157,168,176,133,247,216,226, 12,159,156,156,108, 22, 89, 97, 0,208,178,101, +203, 91,133, 34,203,252, 94,153,177,180,178,179,179,139,166,172,233, 8,192,197,124,254, 28, 14, 7, 45,102,204,176, 91,100, 1, + 96, 35, 35, 35,161, 84, 42,205, 35,197,242,138, 44,120,120,120,124,125,246,236, 89,215,141, 27, 55,170,182,108,217,146,201, 48, + 12, 55, 36, 36,196,167, 97,195,134,196,214,173, 91, 1, 0,253,251,247,199,212,169, 83,113,255,254,125, 72, 36, 18,180,108,217, +146,158, 53,107,150,219,196,137, 19, 63, 79, 77, 77,157, 80,108,239,200, 48, 60,161, 80,120, 6, 64,251,135, 15, 31, 2,192,101, + 20,164,112, 50, 91, 17, 74,252,204,150,206, 55, 55, 55,151, 43,147,201,138, 13, 13,193, 43, 24, 13,217,107,129,176,112, 94,186, +116,233,199,159,127,254,121,255, 87, 95,125,245,244, 13, 57,139,181,104,117,235,214, 13, 26,157, 1, 9,169, 57,160,105, 19, 52, +134, 52,187,249,172, 45, 90,221,186,117, 67,190, 86,143,184,100, 37, 76, 38, 26,185, 26,155,251,114,241, 7, 31,124,112, 98,231, +206,157, 30, 87,174, 92, 1, 77,211,204,147, 39, 79, 94,246,238,221, 91, 62,101,202, 20,231, 55, 88,100,180, 98,224,192,129,125, + 47, 93,186,164,172, 85,171,150,211,181,107,215,144,150,150, 6,147,201,132,246,237,219,131,207,231,199, 45, 92,184,144, 7, 96, +133,173,247,166, 80,108, 25,110,220,184, 49,250,234,213,171, 78, 78, 78, 78,124, 38, 40, 8,201,167, 78, 97,239,222,189,175,125, + 97,237,218,181,128,141, 81,248,205, 22,167,235,215,175, 87,136,192,122,165,167,230,243,203, 61,253,248,190,226,250,245,235,137, +159,125,246, 89, 29,185, 92,190,172, 85,171, 86,237,156,157,157, 73,133, 66, 17,225,237,237,253,101, 72, 72,136,205,179, 11, 92, + 46,119,184, 68, 34,121,102, 50,153,168,188,188, 60,168,213,106, 0,128,201,100,226,147, 36,137,106,213,170, 89,250,146,198,141, + 27,195,195,195,131,142,142,142, 30,110, 43,127,122,122,250, 43,171, 16,139,193,152, 22, 45, 90,112,116, 58, 29, 98, 98, 98, 46, + 90,127, 80,156, 22,121, 79, 16, 94,170,248, 50,159,148,245,201,121,123,123,199, 27,141, 70,246, 1,192,222,185,115,135, 13, 15, + 15, 47,117,211,106,181,172,155,155, 91,114, 49,157, 31,172, 57,117, 58,221, 43,223,211,233,116,172,187,187, 59,173,209,104, 94, +227,212,104, 52,172,143,143, 79, 98,105,156,197, 96,216,237,219,183, 87,127,247,221,119, 77,236,184, 64, 22, 78,118, 77, 16,187, +121,243,230, 79, 88,150,109,211,170,142,223,189,126, 33,238,108,139, 64,183,164,131,123,182, 15, 96, 89,182, 77,209,205, 28,224, +180, 52,206, 32,119, 73,237, 14,193, 85,178,238, 30,223,193,158, 93,242, 5,251,115,207, 64,182,129,143, 44, 59,200, 69,100,111, +142,152, 50,179,165, 7, 7, 7, 63,102, 24,134,213,235,245,108,112,112,240,147,138,224, 44, 7, 74,227, 12, 69,129, 47,219,192, + 98,222, 11,125,131,114,222,101, 89,150, 85, 42,149,108, 94, 94, 30,171,211,233, 88,154,166, 89,107, 0,184,107, 3, 39,107, 48, + 24,216,172,172, 44, 22,182,251,220, 21,203,233,233,233,249,242,249,243,231,108,245,234,213,227, 11,205,241, 19,213,106, 53, 91, + 20,106,181,154,109,215,174, 29,251,228,201, 19,182,106,213,170,218, 39, 79,158,176,158,158,158,143,202, 40,167,191,175,175,239, + 25, 23, 23,151, 8, 0,129,118,124, 86,234,245,220,189,123,119, 0,203,178,163, 88,150, 13, 47, 97, 27,197,178,108,208,127,205, + 89,120,125, 83, 89,150,101,243,243,243, 89,165, 82,201, 38, 37, 37,177,249,249,249,108, 94, 94, 30,123,251,246,109,246,202,149, + 43,236,189,123,247, 88, 39, 39,167, 84, 91, 56,205,124,122,189,158, 85,169, 84,108, 90, 90, 26,171,209,104, 88,181, 90,205, 70, + 69, 69,177, 55,111,222,100, 31, 62,124, 88, 28,223,107,156,206,206,206,107, 83, 82, 82,242, 46, 95,190,156,191,102,205,154,124, + 15, 15,143,135, 0,252, 0,212, 84, 40, 20, 41, 95,124,241, 5, 43,149, 74, 99,203,249, 28,213,225,114,185,183, 23, 45, 90,116, +253,240,225,195,169, 7, 15, 30,212,111,216,176, 33, 97,252,248,241,231, 57, 28,206,109, 0,117,202,249, 28,185, 57, 58, 58, 94, +190,118,237,154, 41, 43, 43,139,205,206,206,102, 85, 42, 21,171, 86,171, 89,141, 70,195,234,245,122,214,104, 52,178,231,207,159, +103,221,221,221,173,167, 37,191, 41,101,144, 53,137,101,217,175, 89,150,229, 84,116, 91,103,197,221,170,162, 56, 43,162,173, 35, + 73,210, 80,216,118, 52, 45,216, 45,125,255,191, 42,103,135, 14, 29,126, 24, 48, 96, 0,219,185,115,103, 54, 44, 44,236,181,173, + 65,131, 6,236,184,113,227,216,195,135, 15,179, 63,253,244,211, 15, 21, 80, 78, 14, 10, 22,189, 44,232,208,161,131,241,194,133, + 11,108,255,254,253, 89, 0,157, 74,211, 34,239,179,224, 50, 47,166, 49,135,119, 32,172, 95, 1,192, 96, 48,196, 63,126,252,216, +179,150,201, 68, 1,192,175,191,254,250,154,149,194, 26, 23, 46, 92, 48, 17, 4,241,172,180, 95, 55, 24, 12,241,103,207,158,117, + 95,181,106, 21,215,202, 4, 12,147,201,196, 36, 37, 37,145, 43, 87,174,124,229,248,115,231,206,153, 76, 38, 83,156,157, 39,185, + 57, 52, 52,116,115, 69, 92,173,243,247, 99,190, 60,113,244, 47,151,166, 77, 90,101,203,157,156,138, 29,133,237,254, 60, 8,196, +216,210,173, 90, 4,135,156,191,104,193, 28, 71,243, 20,228,159,183, 82,178,181, 58,186, 93,116,134,230,110, 69,223,225,188,188, +188, 24,243, 74, 64,181, 90, 29,247, 14, 86,194,219, 40,136,113,101, 42,242, 94, 35,188,161,211, 41,195, 48,112,112,112,176, 88, + 67,203, 97, 17,101,139, 88,210,222,200, 71,128,101,217, 75, 81, 81, 81, 85,135, 13, 27, 38,219,178,101,203,115,154,166,185, 35, + 71,142, 52,120,120,120,240, 46, 94,188,104, 4, 64,180,105,211,134,147,146,146,194, 38, 38, 38, 42,123,244,232,145, 59,122,244, +104,231, 59,119,238,240, 25,134, 41, 43,104,225,139,248,248,248, 14,229,248,172, 84,244,235,215,239, 57,222, 60,141,205, 91,231, + 52, 67,153,173,194,243,152,196,194, 8,230, 12,232,216, 84,139, 95,149,209,104,130, 82,149,105,183, 69,235,217,203,196,194, 20, + 99, 52,104, 58,169,144,175,192, 33,158,205,202, 47,187, 55,225,112, 90,206,154, 53,171, 11, 73,146,228,213,171, 87,117,139, 23, + 47,142, 79, 79, 79,239, 9, 32, 14, 0,178,178,178,218,110,222,188,249, 15, 27, 66, 57,148,132, 7, 70,163,177,217, 55,223,124, + 51, 1, 64, 75, 0, 85, 10,185, 47, 22, 90,178,202, 27,193, 60, 45, 59, 59,251,195, 46, 93,186,156,162, 40,170,154,213,115,228, + 2, 32,195,252, 92,176, 44,235,150,154,154,250,145, 45,132, 4, 65, 44,125, 91, 13,201,219,228,126,195,118,232,189, 88,201,120, +230,204,153,217, 61,123,246,228,248,249,249,125,235,231,231, 71,102,101,101, 33, 47, 47, 15, 36, 73,194,195,195, 3,193,193,193, +240,240,240, 96, 30, 62,124,184, 96,218,180,105,101,198,228,171, 93,187,118,128,209,104,172, 78,146,100, 0,128, 0,150,101, 3, + 8,130, 8, 0,224, 4, 0,114,185, 92, 94,181,106, 85, 78,211,166, 77,209,164, 73, 19,156, 59,119, 14,123,246,236,217, 4,224, +132,181, 53,171,168, 22,121, 23,240, 32, 20,108,157,219, 32,238, 55, 64, 27,130,193, 57,150, 68,219,224, 72, 75,156,189,162, 34, +171,228,164,210,197,152,254, 58,181,111,223,222,242,192,217,208,169,196,148,245,240,165,167,167,119, 26, 62,124,248, 43,156, 52, + 77,235, 50, 51, 51, 63,107,222,188,249,111, 20, 69, 9,138, 84,216,216,180,180,180,127, 53, 87, 95,209, 56, 90,157,186,244,202, +120, 83, 78, 41,143,172,254,248,200,239, 72, 77,203,192,159,183, 82,178,114,245,116,219, 39, 25,249, 81,111,163,252,177,177,177, +157,223,101,169,111, 53,141, 88, 20, 55,237, 73,189, 83, 92,245,178, 33, 32,105, 89, 57,234,136,194,112, 34, 21,242,144,167,164, +164, 44,153, 49, 99,198,135, 11, 22, 44,112, 61,118,236,152,220,124,254,125,250,244, 73,139,138,138,106, 5, 64,160,213,106, 79, + 47, 88,176,192,117,206,156, 57,206, 0,156, 1,160,107,215,174,169,169,169,169,171, 80,137, 82, 97, 52, 26, 19,130,107,215,122, +101,228,104, 30, 0, 90,255,111, 50,153, 18,236,225, 43,142,199,122,159,166,233, 82,249, 40,138,250,170, 73,147, 38,212, 87, 95, +125,149,122,236,216, 49,115, 34, 93,107,133,246,184,140,160,164,182, 64, 7, 96,113,225, 86,145, 80, 43,149,202,102,118,126,135, +174,172,141,197, 14, 40,237,217,255, 79,112,224,192,129,153,253,251,247,223,236,228,228,180, 45, 32, 32,160,150,187,187,187, 92, + 36, 18, 65,167,211,229,234,245,250, 71,143, 31, 63, 30, 52,115,230,204, 23, 54, 89, 56, 54,111,166, 0,240, 24,134, 17,146, 36, + 41, 1, 32, 39, 8, 66, 97, 22, 90, 4, 65,192, 96, 48, 32, 38, 38, 6,223,125,247, 29,125,230,204,153,159, 0,252, 96, 71,223, +209, 8,128,171, 85, 59,238, 10, 64,143,130, 0,182,233, 4, 65,220,120,219,215,139, 96,112,174,206,109, 16, 15, 66, 81, 92, 63, + 81,122, 82,233,146, 30,184,244,244,244,102, 21,253, 16,151,196,153,158,158,238,247,174, 60, 33, 67,117,139,119, 96,237,226, 87, +242, 28,154, 69, 88,113,251,101, 33, 71, 99, 26,191,226,196,253, 37, 58, 19,203, 24, 76,204,136, 39,233,249, 15,254,191,182, 62, +165, 9,169, 55,204,107,249, 65, 69, 21,177, 2, 79, 55, 42, 58, 58,186,249,248,241,227,103,138,197,226,198, 0,144,159,159,127, + 53, 41, 41,105, 46, 10, 87, 21,150,245,121, 37, 74, 70, 70, 70, 70,195,119,145, 79,175,215,127,217,188,121,243,229, 52, 77,255, +108, 50,153, 46,254, 63,184, 21,218,202,218,248,254, 98,215,174, 93, 47, 0, 52, 3,128,190,125,251, 82, 0,176,103,207, 30,187, +197,243,176, 97,195,104,150,101, 13,133,245, 65,141,130,213,133, 89,230, 54, 85,173, 86,103, 37, 37, 37, 61,164,105,250, 33,128, + 63, 96,255,138, 91, 87,130, 32, 14,179, 44,219,173,176,191, 56,204,178,108, 55,235,247,222,182, 85,171,140, 67,202,118,134,175, 68, 1,246, 60, 0, 81,116, 42,176,172,253,178,240, 56, 85, 29, 1,160, 65,229,213,253,127,137,231, 73, 73, 73, 67,223,224,243, 74,188,127,136,211,235,245, 61,255, 31,157,111, 78,229, 45,255, 31,233,255,202, 33,176,204,120,248,240,225, 91,115, 17,248,175, 81,231,246,171, 3,240,162,251, 86, 8, 47, 78,120, 85, 10,173, 74, 84,162, 18,149,168,196,155, 32,187,242, 18, 84,226,127, 25, 102,223, 44,243,126, 9, 62, 90, 69,253,179, 44,251, 4, 74, 94, 57, 96, 79, 86,242,242,172,146, 56, 93,201, 89,201, 89,201, 89, 201, 89,201,249,159,115, 58, 2,168, 10, 96, 81, 25,199, 21, 93, 93,152, 10, 32, 3,128,177,242,122, 86,114,190,129,126,176, 9, - 44,203,118, 45,109,234,144, 32,136, 35,111, 75,104, 89,156,225, 67, 49, 43,248, 54,102,153,247,203, 18, 90, 44,203,174,255, 55, + 44,203,118, 45,109,234,144, 32,136, 35,111, 75,104, 89,156,225, 67, 49, 43,248, 54,102,153,247,203, 18, 90, 44,203,174,251, 55, 132, 96,199, 74,206, 74,206, 74,206, 74,206, 74,206, 74,206, 74,206, 74,206, 55, 20, 90,237,166, 77,155, 54, 29, 5,161, 49,216, 105,211,166, 77,103, 89,182,107,193, 71,108,215,183,249,219,247, 27,160,205,131, 80,176,230,237,126, 3,180, 41,225,208,112,171, 237,213,240, 14,149,168, 68, 37, 42, 81,137, 74, 84,162, 18,239, 48, 46, 47, 92,184, 48,127,225,194,133,102,199,247,116, 0, 68, 161,133, 43,253,109,254,112,225, 52,161, 45, 11,165, 74, 79,193,243, 31,192,139,228,240, 6,115,121,130,118, 96,153, 96, 0, 0, - 73,221,167,245,218,191, 77, 38,195,118, 0, 73,229, 37, 14, 2,106,215,112, 20, 29,212,209, 52, 47, 62, 87,223, 55,186, 32,205, + 73,221,167,245,218,191, 77, 38,195, 54, 0, 73,229, 37, 14, 2,106,215,112, 20, 29,212,209, 52, 47, 62, 87,223, 55,186, 32,205, 129,221,232, 11,180, 16,240,249, 39, 5,142,142,162,226, 62,215,101,103,107,116,122,253,135,123,128, 75,149,207, 64, 37, 42, 81, -137, 74, 84,226, 61,129, 68,161, 80,156, 33, 73,210,207,252,134,117,220,193,162, 49, 8,105,154, 78, 86, 42,149, 31,162, 96,170, +137, 74, 84,226, 61,129, 68,161, 80,156, 33, 73,210,207,252,134,245,170,239,162, 43,192,105,154, 78, 86, 42,149, 31,162, 96,170, 248,223,228,180,254,190, 30,229,236,203, 43, 26,182, 78, 29,194, 58,188,131, 85, 20,214, 50, 51,102,215,242,144,180,170, 21,224, -183, 35, 41, 37,245,150, 74,171, 31,249, 56, 41, 79,105,111, 33, 41,174, 96,180,204,193,113,254, 39,195,191,116, 14,172, 89,139, -240,245,245, 6, 88, 32, 46, 62,193,253,217,211, 39, 29,118,109, 93, 49, 89,149,163,252,206,168,211,253,102, 47,119,109, 64, 82, - 69, 42,184,248,219,180, 79, 29, 57, 48, 97,224,188, 29,199,137, 60,131,239,195,130,229,166,118,137, 44, 71,103,231, 19, 11, 79, +183, 61, 41, 37,245,150, 74,171, 31,249, 56, 41, 79,105,111, 33, 41,174, 96,180,204,193,113,254, 39,195,191,116, 14,172, 89,139, +240,245,245, 6, 88, 32, 46, 62,193,253,217,211, 39, 29,118,109, 89, 49, 89,149,163,252,206,168,211,253,110, 47,119,109, 64, 82, + 69, 42,184,248,251,180, 79, 29, 57, 48, 97,224,188,237,199,137, 60,131,239,195,130,229,166,118,137, 44, 71,103,231, 19, 11, 79, 159, 22, 41,234,215,127,229, 51,150,101, 11,242,235,221,189, 43,250,246,195, 15, 79,244, 85, 42, 59, 85,138,173,255, 73,120,200, 229,242,137, 92, 46,183,173,193, 96,240,227,243,249,241, 52, 77, 71,100,101,101, 45, 3,144, 88,121,121, 42, 81,137, 50, 81, 90, 126,205,255, 44,247, 38, 0, 72,165,210,155, 36, 73,250, 88,139, 0,115,206, 94,243,126,209, 87,134, 97, 94, 40,149,202,230,165, -208, 6, 56, 57, 57,253, 10,160, 81, 89, 1,147, 11, 99,179,221, 80, 42,149,159,161,228,213,122, 50,133, 66, 49,155, 32,136,126, +208, 6, 56, 57, 57,253, 6,160, 81, 89,225,106, 10, 99,179,221, 80, 42,149,159,161,228,213,122, 50,133, 66, 49,155, 32,136,126, 36, 73, 82,101,157, 19,195, 48, 52,203,178,187,179,178,178,126, 0,144, 91,210,113, 10,133,226,116,116,116,116, 35, 55, 55,183, 50,173, 52, 38,147, 9,113,113,113,174,141, 27, 55, 62,175, 84, 42,131,222, 38,167, 61, 90,228,191, 68, 41,171, 14, 75,172,232, - 0, 94,201, 47, 68,148,126, 35, 49,120,211,252,207,188,147, 99,159,122,143, 89,240, 71, 77,194,153,110,251, 40, 83,147, 98,235, - 15,242,132,210,131,205, 90,119,106, 55,110,194, 87,146,219, 81,143,112,242,220, 21,168,212, 58, 80, 36, 9, 71,153, 24, 53,107, - 86, 39,150,174,223,235,178,121,237,210,159,175, 94, 56,213, 85,171,206,233, 97,151, 76, 23,115,190,155,218,187,177,196,217,137, - 6, 24, 26, 95,119, 9,145,124,123,248,214,119,200, 55, 77,183, 91,100,157, 57, 35, 78, 75, 77,197, 28, 47, 47,112, 76, 38, 8, - 73, 18, 66,130,128,144, 36, 33, 17, 10,209,121,227, 70,204, 61,118, 76, 60,243,163,143, 42,197,214,255, 24,164, 82,233,112, 47, - 47,175,197, 27, 54,108,112,246,247,247,135, 68, 34,129, 82,169,116,121,252,248,113,232,164, 73,147,134, 38, 39, 39,207, 80,169, - 84,235, 42,175, 84, 37, 42, 81, 34, 66, 1,148,148,237,161,180,207, 74,132, 80, 40, 76,213,106,181,110,165, 29,195,231,243,211, -244,122,189,123, 89, 92, 36, 73,250, 36, 38, 38,186,137,197, 98,208, 52, 93,152, 13,128,177, 12,164,173,179,159, 20, 6,170, 69, - 80, 80,144,161, 52, 78,153, 76,182, 58, 45, 45,173,163, 57, 79,160,149,160, 42, 22,137,137,137, 29,235,212,169,179, 58, 55, 55, -247,195, 18,196,203,236, 9, 19, 38, 76,172, 91,183,174,217, 10, 84,152, 5,161,224, 53, 35, 35, 3,227,199,143,183,252, 6,195, - 48, 56,117,234,212,132,225,195,135, 35, 43, 43,107, 82, 41,231,238,231,230,230, 70, 20, 38, 20, 47, 17,179,102,205,194,172, 89, -179,176, 98,197, 10,130,203,229, 58,150,113, 61, 43,132,211, 86, 45,242, 95, 88,176,202,136, 12,127, 4,175,134,119, 56,242,154, -208,178, 21, 36,203, 28,157,183,108,195,200, 57,195, 90, 18,155, 38,117, 12, 28,187,226,244, 21,146,199,182,126,152,172,141,183, -193,146, 53,162, 81,243,142,109,199, 79,156, 42,249,227,175,179,120,252,240, 46,162, 47,238,124,229,152,134, 31, 14, 71, 74, 70, - 46,134,143,251, 90, 74, 80,156,182, 23, 78, 31, 24, 97,212,105, 54,217,104,205,114,247, 19,240,191,104,218, 56,152,155, 40,122, - 12, 15,133, 8, 45, 27,212,224,250,158,184,247,133, 26,166,229, 15, 11, 86,201,216, 37,178, 54,124,250, 41, 90, 25,141,112,163, - 40, 80, 4, 1, 10, 0, 73, 16,208,234,116,184, 49,120, 48, 26,111,219,134, 31, 14, 29, 18,207,238,222,221, 46,177, 37,145, 72, -110, 19, 4,161,200,203,203,235,138,130,196,210,239, 3,234, 72,165,210, 35, 44,203,102,169,213,234,208,119,168, 92,158, 40,152, -163, 47, 58, 58,230,161, 96, 69,149, 93,153,133, 5, 2,193,232,190,125,251, 46, 93,181,106,149, 56, 53, 53, 21, 73, 73, 73,160, -105, 26, 66,161, 16,129,129,129,196,233,211,167,157,167, 78,157,186,228,200,145, 35,130,220,220,220,229,246, 12,108,184, 92,238, -122, 39, 39,167,143,220,221,221, 37,105,105,105,249,217,217,217,167,116, 58,221,104,148, 63,109, 10,201,229,114, 7, 85,173, 90, -181,151,151,151,151,123, 98, 98, 98, 70, 66, 66,194, 65,157, 78,183, 25,229, 76,212,108,117, 77,235,163, 48, 90, 61,128,228,170, - 85,171,222,143,137,137, 73,171, 64,206,164,170, 85,171, 62, 40, 7,167, 4,192, 46, 0, 94,101, 28,151, 4,160, 63,236,180,102, - 87,162,226, 68, 86, 97, 74,171,162,130,170,180,207, 74,133, 78,167,115, 53, 24, 12,224,150,144, 44, 94,173, 86, 67, 38,147,185, -218, 90, 72,145, 72,132,157, 59,119,130,203,229,130,203,229, 34, 43, 43, 11, 62, 62, 62,150,125, 30,143,103,249,191, 74,149, 42, -101,242,209, 52,221,152,162, 40,228,229,229,129,166,105,203,150,157,157, 13,150,101, 33, 16, 8, 64,211, 5,233,156,172, 62,111, - 92, 18, 31, 65, 16,253,188,188,188,240,199, 31,127, 64,175,215,191,246,185, 92, 46, 71, 84,212, 63, 73, 70, 40,138, 66,147, 38, - 77, 72,130, 32,250, 1,152, 84, 10, 47, 11, 0,225,225,225,160, 40, 10, 20, 69,129, 36, 73,203,255,230,141,166,105,204,154, 53, - 11, 69, 82,147,253,107,156,239, 26,202,136, 12,159,140, 18,124,180,200,210, 72,107,185, 75, 62,155, 52,176, 99,254,119, 35,186, -176,211,135,124,192, 78, 29,216,134,253,168,117,189,191, 40, 14,135,184,246, 32, 14, 62, 14,192,230,241,141,252,124, 93, 36, 81, -193, 78,210,154,197, 80, 88, 47,241,244, 18, 75,228, 63,126,246,229,215,210, 35,231,239, 33, 46, 62,238, 53,145, 5, 0, 55, 79, -110, 70,114, 82, 34,110, 69, 39, 96,208,136,207,165,114,185,227,143, 69, 26,212, 18,151,141, 58,200,120, 63, 77,235,223, 82,152, -103, 76, 66,174, 2,160, 2,248,224,138,213,152,218,173,190, 64, 46,227,149,150,170,194,194, 41,224,243, 79, 46, 60,125,218, 34, -178, 90,232,116, 16,208, 52, 76, 52,109, 17, 89,122,147, 9, 26,189, 30,158,121,121,120, 54,124, 56, 88,163, 17, 51,246,239, 23, - 11,248,252,147,182,148, 19, 0,120, 60,158,231,193,131, 7,171,212,171, 87,239, 28,108, 15,102,122,250, 45,212, 29, 91, 57, 27, -132,132,132, 68,108,219,182,173, 10,143,199,243,172, 8, 78,161, 80,248,177, 68, 34, 73, 23, 10,133, 31,151,179,156, 36,128,121, - 35, 71,142,140,172, 94,189,250,217, 66, 97,101, 17, 53,213,171, 87, 63, 61,114,228,200,219, 0,102,149, 80,215,139,227,244,246, -242,242,154,191,106,213, 42,241,147, 39, 79,144,152,152, 8,163,209,136,129, 3, 7,130,166,105,104, 52, 26,232,245,122, 44, 90, -180, 72,226,236,236,252, 29, 10, 18, 5,219,114,238, 60, 7, 7,135, 39, 91,183,110,237,251,242,229, 75,233,217,179,103,137,168, -168, 40,201,146, 37, 75,122, 58, 59, 59, 63, 6, 32, 40,199,245, 36, 61, 61, 61, 55, 29, 56,112,224,179,168,168, 40,159,125,251, -246,113,175, 94,189,234,185,118,237,218, 81,158,158,158,219, 0, 80,229,188, 71,161, 98,177,184,195,148, 41, 83,152,203,151, 47, - 39, 94,190,124, 57,113,233,210,165,104,213,170, 85,139, 57,115,230,132,149,147,179,129, 76, 38,107, 63,101,202, 20,230,194,133, - 11, 73,215,174, 93, 75, 88,178,100, 9,217,190,125,251,150,243,231,207,175,111, 39,231,174,203,151, 47,183,137,143,143,247, 79, - 72, 72,168,150,144,144, 80, 53, 33, 33,161,106, 98, 98,162, 95,114,114,114,149,148,148, 20,223,180,180, 52,223,136,136,136,150, - 0,118,188, 99,207,209,255, 7, 78,142, 89, 72, 41,149, 74, 28, 57,114, 4,133,214,171, 80,107,145,165, 82,169,144,156,156,108, -254,140, 99, 75, 57,229,114,249,153, 13, 27, 54,176, 90,173, 22, 57, 57, 57, 72, 75, 75, 67,124,124, 60,158, 61,123,134,204,204, - 76, 60,122,244, 8, 98,177,248,140, 45,229, 36, 8, 2, 52, 77, 91,132,212,169, 83,167, 48,114,228, 72, 40,149, 74,203,123, 28, - 14,199,242,191,249, 59,101,113,154, 45, 79, 52, 77,227,218,181,107, 24, 51,102, 12,150, 46, 93,138, 29, 59,118,224,240,225,195, - 80, 42,149, 22,177,101, 50,153,202,228,204,200,200, 0,195,216, 54,102, 98, 89, 22, 57, 57, 57, 54,223,119,107, 1,196,225,112, - 94, 19, 69,230,205,158,186,244,134,156,239, 44,108,136, 12, 95,242, 8,219,252, 79,161,169,174,237, 43, 66,171,170,199,119,139, - 39,246, 19,129, 54,128, 53,106, 0, 67, 62, 96,200, 3,163,207, 7,193, 19, 1, 70, 13, 92, 5, 74,236, 26, 87, 75,254,205, 31, -207, 31,210,143,136,174,209, 25,185,199,139,237, 17, 56,188, 65,253,134, 77,112, 78, 72, 83, 33, 49, 53, 7, 20,249, 79,191, 23, -214,113, 24, 56, 20,137,235, 39, 10, 12, 87, 36, 69, 33, 71,173, 67,118,158, 1,125,135, 77,116,250,109,233,247,131, 76, 6,109, -169, 49, 94,234, 2,129,193, 82,105,239, 58,117,170,144, 15, 5,209, 8,251,232, 34,104, 6, 96, 47,116, 71,104,150, 27, 21,116, -146,223, 91,157,107,152, 31, 5, 60, 41,213,154,225,232, 40, 82,212,175,143, 57, 94, 94,104,109, 52,130,199,178,248, 32, 53, 21, -119, 39, 78,132,110,239, 94,144, 0,120, 31,127,140,118,203,150,225,188,151, 23, 60, 52, 26,100, 79,158, 12,215,227,199,193,147, -203, 69, 72,183,109,241, 3, 65, 16,104,219,182, 45, 78,159, 62,237,220,185,115,231, 19,247,238,221,235, 99, 50,153,206,151,231, - 38, 58, 56, 56,220,228,112, 56, 62,101, 29,103, 50,153, 18,114,114,114,236, 78, 51,194,225,112, 90, 55,105,210,100,255,190,125, -251, 20, 6,131,161, 66, 70, 33,124, 62,191,115,207,158, 61, 55,172, 89,179, 70, 62,106,212,168, 13,135, 15, 31,206,215,235,245, -199,237,177,228, 0,152,183,110,221,186,177,225,225,225,142,163, 70,141, 98,159, 61,123,102,109,189,114,109,213,170, 85,245, 13, - 27, 54,120, 52,106,212,104,194,152, 49, 99,120, 0,102,148,101,229,145, 74,165,227, 54,108,216,224,146,145,145,129,188,188, 60, - 75, 35,155,144,144, 0,145, 72, 4,146, 36, 65,146, 36,184, 92, 46,126,252,241, 71,231,113,227,198, 77, 84, 42,149, 19,109,176, -146,173,255,245,215, 95, 93, 63,252,240, 67,242,229,203,151, 32, 73, 18, 66,161, 16,159,126,250, 41,169,209,104, 20,115,230,204, -217,162, 86,171, 7,216,115, 13,185, 92,238,160,245,235,215,215,108,209,162, 5, 39, 58, 58, 26,205,154, 53,195,245,235,215,241, -241,199, 31,115,115,115,115,171, 77,157, 58,117,164, 78,167,179, 55,142,139,167, 88, 44,174,251,247,223,127,199,251,250,250, 90, - 26,150,106,213,170,209, 93,187,118, 85, 70, 71, 71,215,186,124,249,114,102,243,230,205,237, 73, 88,238, 45, 22,139,131,142, 30, - 61,154, 60,103,206,156, 14,235,214,173,235, 9, 0,141, 27, 55, 62, 56,119,238,220,179, 74,165, 50,248,252,249,243,202,214,173, - 91, 39,216,200,231,229,233,233, 73,143, 31, 63, 94, 90,218, 65, 27, 55,110,204, 70, 65,194,101,127, 0, 47, 80,137,127, 11, 38, - 0, 97, 4, 65,220, 58,114,228, 8,154, 52,105,130, 35, 71,142,160,107,215,174,183,172,197, 64, 84, 84, 20, 90,183,110,141, 66, -139,150, 77,190, 90, 57, 57, 57,211,102,205,154,117, 97,208,160, 65,226, 87, 26, 3,146,132,163,163, 35,186,116,233,162, 85,171, -213,211,108, 45, 40, 77,211,224,112, 56, 72, 72, 72,192,198,141, 27,177, 96,193, 2, 4, 6, 6,194,104, 52,190, 38,182, 10,219, - 61,155, 26, 63,147,201,132, 27, 55,110, 96,251,182,109,152,241,221,119,144,201,100, 0, 0,131,193, 0,101, 86, 22,132, 66,161, - 69,140,149, 33,156,118, 63,125,250,116,162,143,143,207, 43, 83,134,230,215,194, 54, 11, 12,195,192,100, 50, 65,171,213, 98,233, -210,165, 38,150,101,119,151,213,255,152, 69,209,196,137, 19,161,211,253, 99, 80,175, 95,232,147, 92,181,106, 85,132,132,132, 88, -246, 73,146,100,109,229,252,173,121, 93,104,172,142,174, 53,107, 9, 0,192,199,199, 7,181,106,213,130,167,167,103,137,156,197, -105,145,255, 26,118, 68,134, 47, 89,104,149,148, 41,251,225,203,148, 69,163,166, 46, 89, 34, 17, 82,220, 47,123,213, 67, 21, 71, - 30, 32,114, 2,175,245, 55, 32, 28, 11, 6,242,172,242, 5,112,242, 27,252,220, 91, 73,134,255,174,253,203, 64, 43, 92,159,103, -101,189,230,132,199,229, 9,219, 5,212,168, 73,196, 37, 43,193,225,112, 32,113,112, 65,243, 94,147, 64, 81, 36,164,142, 46, 32, -104,205, 63,138,152,164,192,161, 56, 80,230,106, 80,213,191, 6, 41, 16,138,218,169,203, 16, 90,114, 7,238,175, 83, 6, 52, 23, -102,154, 18, 32,170, 34, 4,109,238, 78,189,248, 32,157,115,241, 85,231, 64, 81,248,193,123,191, 34,199,216,222,150, 11, 67,153, - 76,112,163, 40, 24, 88, 22,119, 39, 78, 68,216,250,245,184,101, 22,134,235,215,227, 86,120, 56,156,184, 92, 8, 72, 18,172,209, -248,218,156,190, 45, 66, 11, 0,226,227,227,177,119,239, 94,167,126,253,250,237,143,138,138, 26,100,167,216, 48,115,185, 92,187, -118,205,205,223,223,191,196, 99, 94,188,120,129,134, 13, 27,218, 61, 61,197,231,243, 59,183,111,223,254,143,189,123,247, 58, 60, -120,240, 0,110,110,110,111, 44,180, 4, 2, 65,235,142, 29, 59,254,177,117,235, 86,121,122,122, 58,214,175, 95, 47,239,222,189, -251,142,200,200,200, 94, 58,157,206, 22,177,249,138,200, 90,191,126,125,246,198,141, 27,127,195,171, 83,132,201, 27, 55,110,220, -212,168, 81,163,207,194,195,195, 29, 1,140, 45,244, 29, 40, 85,108, 9, 4,130,182, 1, 1, 1,175,140,106, 5,130, 2, 99,147, - 68, 34,129,131,131, 3,120, 60, 30,116, 58, 29,194,194,194, 8, 62,159,223,210,150,115,150,201,100, 29,123,247,238, 77, 94,188, -120, 17, 41, 41, 41,112,116,116,132, 84, 42, 5, 77,211, 24, 53,106, 20,181,116,233,210,182,106,181,125, 51, 92,190,190,190, 61, - 59,116,232,192,185,127,255, 62, 94,190,124, 9,157, 78,135,199,143, 31, 67, 46,151, 99,200,144, 33,188,197,139, 23,119, 79, 76, - 76,180, 87,104,213, 13, 15, 15, 79,181, 22, 89,102, 72, 36, 18,162,102,205,154, 74,103,103,231, 6, 0,236, 17, 90,117, 63,255, -252,243,180,133, 11, 23,182, 62,125,250,180, 37,232,229,233,211,167,167, 2,192,242,229,203, 47,184,186,186, 54, 0, 96,171,208, - 2,203,178,204, 39,159,124, 18,203,231,243,193,229,114,193,231,243, 95,217,120, 60, 30, 72,146,148,153, 31,231,255, 97, 81,211, - 8,192, 47, 40, 72,174,251, 29,128,107,239, 72,185,110, 3, 8,235,218,181,171, 69,108, 29, 59,118, 12,157, 59,119, 70,118,118, - 54,238,223,191,111, 45,178,236, 73,176,124,219,104, 52,222,217,185,115,103,243,126,253,250, 17, 86,207, 23, 30, 60,120,128, 71, -143, 30,221,178,149,143, 36, 73, 48, 12, 3, 46,151,139, 37, 75,150,192, 96, 48,224,247,223,127,199,158, 61,123, 64,146, 36, 8, -130, 0, 65, 16,144,203,229, 88,177, 98,133, 93,237, 30, 77,211,216,178,101, 11,190,153, 58,213, 34,178, 10,103, 50,224,225,238, - 14,103, 23, 23, 60,127,254,188, 76,161,149,149,149,245,195,161, 67,135, 80,154, 51,252,161, 67,135, 44,255, 23,113,134, 47,187, -159,163, 40,232,116, 58,124,240,193, 63,169, 98, 63,255,252,115,203,255, 74,165, 18, 20, 69,153,175, 5, 97, 43,167,134, 5,122, - 9,255,121,175,203, 87, 95,189, 98,161, 43,137,179, 36, 45,242, 46, 90,183,138, 17, 91, 97,133,214, 89, 79, 0, 93, 81,224,163, -149, 12,148,225,163,245, 36, 77,189,138, 67, 36,135, 44, 28,255,225,176, 42,110, 14, 96,243, 82,193,107,255, 3,238,164,139,176, -100,233, 81, 0,192,215,159, 54, 68,253,142,243,160,223,252, 33, 38, 54,163,248,131, 19,116, 83, 0,204,124,189, 97,100,130,124, -188,189,112,231, 89, 20, 56, 20, 5,190,131, 11, 28,156,220,193,152,244,200, 73,123,137,115,251, 86, 3, 0,214,109,217, 13,146, - 36,193,225, 80,208,233,105, 4, 86,241, 2,195, 48, 65,165,149,179, 54,208,188,173,187, 75, 19, 95, 63, 71,226,190,226, 37,106, -186, 57, 23,153, 8, 17, 32, 48, 73, 74, 52,147,138, 26,103,229,168,154, 63, 4, 46,151, 41, 6, 72, 18, 36, 65, 64,204,227, 65, -183,119,111,129,215,230,250,130, 62,235, 86,120, 56,200,191,254,130, 76, 32, 0, 69, 16,224, 20,154,160,203, 3,149, 74, 5,130, - 32,176,125,251,118,197,144, 33, 67,118,220,191,127, 63, 92,171,213,238,181,135, 35, 59, 59,187,107,139, 22, 45,206,110,217,178, -197,213,195,195,227,181,207, 83, 82, 82, 48,108,216,176,244,236,236,108,187,130,186, 9,133,194,143,123,246,236,185, 97,243,230, -205,242,167, 79,159, 34, 47, 47, 15,174,174,174,111, 90, 71, 27, 52,109,218,116,255,222,189,123, 29, 82, 82, 82,144,147,147, 3, -157, 78,135,237,219,183, 59,118,233,210,101,111,116,116,116,103, 0,145,101,112,204,180, 22, 89, 99,198,140,185, 7,192, 13,192, -175, 69, 53,104,225,103,245,172,196, 86, 14,128,197,165,140, 68,253, 36, 18, 9,210,210,210, 48,108,216, 48, 60,121,242,143, 1, -212,203,203,203, 50,210,123,254,252, 57, 92, 93, 93, 65, 16,132,155, 45, 39,237,234,234, 42,213,235,245, 24, 57,114, 36,226,227, -227, 95,225, 76, 72, 72, 0, 65, 16, 98,123, 47,164,187,187,187,187, 70,163, 65,171, 86,173,160,213, 22,228,245,237,223,191, 63, -184, 92, 46,210,210,210,192,229,114, 93,202,113,127, 92,186,118,237, 90, 98,104, 21,185, 92,110, 80, 40, 20,181,237,228,116,238, -222,189,123,226,250,245,235, 95, 91,216,114,253,250,245, 30, 78, 78, 78,167,157,156,156,106,218,201,201, 88,139, 42, 30,143,247, -138,208,226,114,185, 32, 73,146,193,255, 62,126, 2, 96, 94, 5,183, 6, 64,200, 59, 84, 54,139,216, 58,118,236, 24,130,131,131, -145,149,149,133,232,232,232,242,138, 44,115,123,247,205,236,217,179, 79,246,233,211, 71, 98, 30,180,138, 68, 34, 76,158, 60, 89, -147,151,151,247,141, 93,149,136, 97,192,225,112, 44,131,100,161, 80,136,176,176, 48,139,200, 34, 8, 2,249,249,249,224,112, 56, -230, 21,137,132,141,101,132,167,135, 7,100, 50, 25,106, 4, 6,226,105, 97, 59, 98,254, 95, 32, 16,128, 32, 8,152, 76,101, 26, -242,114, 11,157,218, 39, 85,240,189, 97,205,162,168, 84,211,177,151, 23, 24,134, 49,139, 76,182, 34, 56, 93, 92, 92,144,151,151, -103, 43,231, 59,137, 18, 44, 90,102,161,213, 21, 5,190, 90,175,133,119,104, 3,224, 28, 94, 93, 82, 73,214,118,151,110, 92, 56, -174,195,176, 15,131, 93,160, 73,127, 9,161,204, 5,132, 99, 85, 44, 89,122, 20,247, 95,100, 2, 0,150,236,184,137, 63,230,116, - 1, 68, 78,168,229,144, 1, 15, 25,167,247,163,180,215,133, 22, 1,150, 96, 88, 22, 28,138, 44,156,187,165, 64, 81, 36,148,233, -201, 88,246,195,216, 66,145,181, 7, 71, 46, 68,195, 39, 32,248,159,121, 92,130, 0,216,210, 43,183,171, 3,111,253,184, 62, 77, - 69,169, 68, 50, 28,189,196, 16, 10,139,232, 71, 5, 15, 68, 85, 18,227,219,250,136,111, 28,210,174,127,152, 99, 40,179,163, 16, -146,100,129,243, 59, 65, 20,235,220, 67, 22,126, 70, 17, 68, 65,244, 87,198,190, 54,221, 44,228, 69, 34, 17, 12, 6, 3, 40,138, -194,202,149, 43, 29, 59,118,236,248,171,189, 66, 11,192,131,212,212,212, 46,163, 70,141, 58,182,123,247,110, 23, 23, 23,151, 87, - 70, 15,163, 70,141,202, 72, 77, 77,237, 2, 59,157,238,185, 92,238,175,107,214,172,145,199,196,196, 32, 63, 63, 31, 34,145,200, -210,248,148,183,126, 54,110,220,248,196,241,227,199, 21, 57, 57, 57, 48, 24, 12, 16,137, 68, 96, 89, 22, 20, 69,225,207, 63,255, -116,238,214,173,219,209,184,184,184,246,165,149, 85, 36, 18,245, 42, 20, 78, 8, 15, 15,119, 12, 15, 15,111, 3,148, 24,169,215, -130,240,240,112,199, 73,147, 38,117,215,104, 52,139, 75, 57,231,120,165, 82,233, 33, 18,137,176,111,223, 62, 72,165, 82,136,197, - 98,120,121,121, 65,169, 84, 66, 44, 22,131,101, 89, 24,141, 70,115, 99,145,105,203,137,167,167,167,231,153, 76, 38,135, 99,199, -142, 33, 51,243,159,175, 84,169, 82, 5,217,217,217, 96, 24, 38,223,222,139,153,148,148,148, 74, 16,132,239,157, 59,119, 16, 19, - 19,131,206,157, 59,227,175,191,254, 66,195,134, 5,179,195,122,189,190, 60, 65,252,104,138,162,216, 82,234, 45, 1, 64, 81,145, -156,133,157,151, 93,156, 12,195, 48,102,145,101,253,106, 45,190,202,248,205,255, 21, 56, 88,143, 19,222,213, 66,118,238,220, 25, - 74,165, 18, 82,169,180, 34,252,115,174,104, 52,154,199, 7, 14, 28,104,208,181,107, 87,240,249,124, 60,126,252, 24,145,145,145, -209, 0,174,216, 43,180,184, 92, 46,102,207,158,141,177, 99,199,194,221,221, 29,223,124,243, 13, 56, 28,142,101, 35, 8,194, 98, -225,178, 7,110,238,165, 47,124, 52, 59,196,151,101, 12,119,112,112,152, 77,146,100, 63,202,134, 11, 71,211, 52,205, 48,204,238, -156,156,156, 82,195, 59,152, 29,215,109,185, 23,214,215,160,140, 62,237,141, 57, 75,208, 34,255, 57,138,174, 54, 44,193,162,101, - 94,117,248, 90, 42, 32,243, 89,158, 43, 52,217,157,179, 22, 89, 63,142,109, 55,236,195, 96, 5, 14,158,185, 6,158, 33, 27,208, -231,150,114,135,141, 32,120, 18,184, 59,112,139,245, 21, 34, 72,234, 81, 66, 98, 18,156, 21,210, 66,145, 85,184,145, 36,234, 7, - 23, 12,102,143, 92,136,134,143,127, 48, 56, 20, 5, 14, 69, 65, 42, 18, 32, 53, 37, 25, 28, 14,249,168,164,159,173, 75,161, 79, -159,154,190, 85, 21,206, 92,100,184,234,225,233, 94,130, 97,160,129, 12, 62,158,124,116,114, 22,250,213,165,208,167, 84, 89,206, -178, 22,161,101, 48,153,192,251,248, 99,203,116,225,173,240,112,132,173, 95, 15,186,103, 79,168, 13,134, 87, 76,197,229, 21, 90, - 34,145, 8,185,185,185, 24, 52,104,144,210,104, 52,126, 86,206,186, 16,153,153,153,217,119,240,224,193,153,102, 1, 99, 48, 24, - 48,120,240,224,204,204,204,204,190, 54, 88,137, 94,131,209,104,252,172, 97,195,134,202,140,140, 12, 75, 57,203,211,224,152,225, -228,228,116,100,227,198,141, 78, 58,157, 14, 38,147,201,194, 41, 18,137, 64, 81, 20, 92, 93, 93,241,199, 31,127,184, 58, 57, 57, -149,154,179, 74,163,209, 28, 88,191,126,125, 54, 0,172, 95,191, 62,155, 32,136, 8,130, 32,214, 18, 4,177,166,200,182,150, 32, -136, 8,235, 99, 53, 26,205,254,210,184,245,122,125, 68,116,116, 52, 43, 22,139, 65, 81, 20, 12, 6, 3,132, 66,161,197, 36,174, - 82,169,160,209, 20, 76,115, 71, 70, 70,194,104, 52, 94,180,229,220,115,115,115,207,108,217,178,133,169, 82,165, 10,130,131,131, - 17, 22, 22,134,166, 77,155,194,207,207, 15,115,231,206,165,213,106,245,185,114, 8,173, 35,187,118,237, 50,250,250,250,162, 65, -131, 6, 16, 8, 4,168, 95,191, 62,188,188,188,176, 96,193, 2,125, 78, 78,206,177,114,220,166,184,168,168, 40,170, 20,145, 43, -135, 13,171,119,139, 32,254,198,141, 27, 84,211,166, 77, 15, 22,253,160,113,227,198, 7,165, 82,169,131,217,196,110,207,136,220, - 90, 92, 9, 4, 2,203,102,126,159,195,225,252,127,176,104, 77, 4,112, 15, 5,113,152,190,121,199,202,102,113,124,207,204,204, - 68,116,116, 52, 34, 35, 35,209,180,105, 83, 92,188,120, 17,248,199, 65,222,110,228,228,228,124, 51,103,206, 28,181,121, 37,223, -119,223,125,167,201,205,205,253,198,222, 54,152,101, 89,112,185, 92,212,170, 85, 11,147, 38, 77,194,209,163, 71,241,248,241, 99, - 24,141, 70,139, 16, 50,251,100,218, 99,209,226,241,120,112,119,119,135,209,104,180, 88,179, 0,224,233,147, 39,224,112, 56, 96, - 24, 6,122,189,190, 76,139,150,131,131,195,236, 13, 27, 54, 76,200,200,200,240, 76, 79, 79,119,179,222, 82, 83, 83,221,146,147, -147,221, 18, 19, 19,221,226,227,227,221, 98, 99, 99,221, 94,190,124,233,185,104,209,162, 9, 14, 14, 14,179,109, 41, 39, 69, 81, -168, 95,191, 62, 62,255,252,115,203,182,106,213, 42,203,118,238,220, 57,187,157,215, 41,138, 66,173, 89, 75,208, 37,157,181,108, - 71, 93, 9,203,118,255,235, 49,165,113, 22,213, 34,239, 4,204,171, 13,173, 19, 75, 23, 3,243,170, 67,115, 91,102,113,219, 40, -234, 12, 15, 0, 8,242, 16,207,251,113,116,235, 97, 31,212,118,192,129, 51, 55, 49,103,255,139, 71,129,195, 92,107, 85, 87,164, -131, 73,143,198,215,159, 54,196,146, 29, 55, 1, 20, 76, 29, 50,105,247,193,102, 61, 7, 43,243,197, 75,101, 70,177,211, 14, 38, -189,246,236,139,103, 79,218,213,170,219,136, 76,201,200,123,101,249,103, 88,219,190, 32, 8, 2,222,254,193,160, 56, 28, 80, 20, - 9, 14, 69,193, 81, 46, 68,244,157, 59,140, 78,163, 57, 91, 28,103, 27,128,195, 23,241, 87,125,218,169,190, 48,137,159, 6, 87, - 79, 9,120,220, 2,237,200,190,232, 91,164,135,224, 0,117,101, 24,158,232, 44, 58,155,170, 93,165, 80, 27, 14, 70,148, 48, 2, -100, 24, 6, 82,129, 0, 90,157, 14, 26,147, 9,109,151, 45,179, 76, 23,146, 4,129,219, 0,234, 45, 91,134,203,123,247, 66,206, -231, 3, 2,129,205,171, 66,138, 19, 90, 25, 25, 25, 24, 58,116,104,102,114,114,242,144,242,248,104,153,161,211,233,206,167,164, -164, 12,233,219,183,239,246,125,251,246, 57,245,237,219, 87,153,146,146, 50,196, 70,191,167,215,160,213,106,247,198,199,199,231, - 15, 29, 58,116,219,142, 29, 59,156, 93, 92, 92, 44, 35,145,114, 85, 86,130,200,232,208,161,131,192,150,227,202, 56,100, 78,161, -115,251,216, 66,203, 86,189, 49, 99,198, 92, 70,129,255,149, 53,102,173, 91,183,174,191,213, 20,227, 90, 0,203, 74, 35, 86,169, - 84,107, 38, 77,154, 52,226,252,249,243, 46, 66,161, 16, 4, 65,128,199,227,161, 70,141, 26,150, 85, 52, 92, 46, 23, 44,203,226, -171,175,190,202, 72, 75, 75, 91,110,227,189, 25, 51,103,206,156,214, 90,173, 86, 49,116,232, 80, 74, 40, 20, 34, 53, 53, 21, 75, -151, 46,165, 55,111,222,156,173, 86,171,135,149, 67, 8,111,249,254,251,239,219,230,229,229,249,143, 26, 53,138,151,147,147, 3, -141, 70,131, 41, 83,166,232, 55,109,218,148,160,209,104,236, 14,248,219,172, 89,179,103,177,177,177, 45,243,243,243,179,196, 98, -113, 81,107, 31, 33,145, 72, 26, 1,216,102, 15,103, 88, 88,216,243,184,184,184,166,243,230,205,139, 48, 26,141,220,235,215,175, -247, 52,139,172,149, 43, 87,158, 19, 10,133, 29, 80,194,178,232, 82,234, 8, 35, 16, 8, 94,177, 96, 21,253,159,195,225,252,127, -176,104,157, 67, 65,200,140,119, 13,175,136,172,251,247,239,163, 93,187,118, 0,128,139, 23, 47,162, 69,139, 22,184,120,241, 34, - 90,182,108,105,119, 44,173, 66,252,173, 82,169, 98,207,157, 59, 87,199,215,215, 23, 87,174, 92,121, 9,224,111,123, 11,105, 22, - 90, 28, 14, 7, 3, 7, 14, 68,199,142, 29, 81,165, 74,149, 87, 86, 27,154,255,183, 71,108,152, 76, 38,212,173, 91, 23, 58,189, - 30, 60, 30,207, 50, 53,201,225,112,224,234,230,134,103,207,158,217,100,209, 34, 73,178, 95,175, 94,189,200, 7, 15, 30, 96,192, -128, 1,216,190,125,123,137,199, 14, 30, 60, 24, 59,119,238, 68,175, 94,189,200,233,211,167,151, 26,222,193,236,132,110,203, 57, -153,251,233,178,218,253,138,226,180,214, 34,239, 26,172, 66, 59, 20,135,240, 98,222, 91,255,138,208,178, 10, 18, 6,127, 87,241, -240,142, 53, 56, 56,112,246, 38,230, 28,136,219, 66,179,236,190,125,183,178, 14,127,211, 2, 48,236,254, 20,245,251,110, 43,152, - 46, 4,192,164,221,135, 97,247, 96, 16, 98, 23, 92, 72,228, 34, 71, 99, 56, 82,124,197, 51,108,255,235,247,213,147,154,254,218, -210,213,211,205, 1,202, 28,141, 69,108,221, 58,183, 7, 0,208,103,204,124,112,168,130, 41, 69,185, 84, 8, 17,143,194,222,173, -203, 51, 12, 6,109,177,181, 43,151, 75,142,157,222,188,134, 3, 95, 98,132,202,131, 69,176,235, 63,153,114, 8,255, 61,175, 11, -174, 80, 5, 92,238,103,225,211,234, 82,249,242, 7,217, 99, 97,100, 86,189,214, 33,102,103,107,178,239,220, 17,117,222,176, 1, -215,135, 12,129, 55, 77, 35,194,203, 11, 78, 92, 46, 28, 4, 2,144, 4, 1,205,225,195,184,188,111, 31,220, 5, 2, 64, 38,131, -105,238, 92,232,162,163, 97,204,205,213,148, 99,100,134,254,253,251,103,100,100,100,244,213,235,245,231,223,180, 34,104, 52,154, -227,241,241,241, 99,155, 53,107,246,171,209,104,252, 76,163,209, 28,127, 19, 62,189, 94,127, 60, 37, 37,229,227,254,253,251,239, -217,191,127,191,139,163,163, 99,185,185, 50, 51, 51, 27, 86, 80,125,103, 0,204, 40,116,110, 31, 27, 30, 30,238,120,227,198,141, - 17, 27, 55,110,252,213,106, 52,225, 54,114,228,200,209, 69, 68, 86,153,171, 14, 1,196,165,165,165,205,157, 60,121,242,252,159, -127,254, 89,106,118,124,191,123,247, 46, 76, 38, 19,184, 92, 46,104,154,198,200,145, 35,243, 50, 51, 51,151,160,228,136,206,175, - 85, 45,149, 74, 85, 99,222,188,121, 27,151, 45, 91,214,145,162, 40, 9, 77,211,234,252,252,252, 8,173, 86, 59, 12,229,139,163, -197,164,167,167, 15,157, 57,115,230,208,165, 75,151,246, 34, 73,210,205,100, 50,101,228,230,230, 30,210,104, 52,155, 80,142,169, -164, 43, 87,174,164,127,250,233,167, 47,210,211,211,131,124,124,124,114,164, 82,169, 94,175,215, 83, 34,145, 72, 46,145, 72,194, - 0, 92, 33, 8,226,161, 61,156,183,110,221, 74, 25, 53,106, 84,140, 78,167,171,181,118,237,218, 11,114,185,252, 12, 65, 16, 4, -143,199, 83,136, 68,162,118, 0, 34, 8,130,120,106, 15, 39, 73,146,140,181,245,170,168,127, 22,159,207,255,255,226,163,245, 46, -194, 18,222, 33, 35, 35, 3, 15, 30, 60, 48,139,172, 48, 0,104,217,178,229, 45,179,216,138,140,140, 68,131, 6, 13,110, 1,224, -218, 91, 95, 85, 42,213,228, 65,131, 6, 29, 47, 28, 28, 79, 46,199,192,207, 34,180,204,130,170, 74,149, 42,150,125,235,205,202, - 71,203, 38,208, 52, 13, 30,143, 7, 14,135, 3, 79, 47, 47,203,111,177, 44,139,103,207,158, 65,169, 84,218, 36,180, 40,138,162, - 8,130,192,128, 1,182, 45, 72,254,228,147, 79, 16, 17, 17, 1,202, 70, 85, 72, 81, 20,170, 86,173, 90,230, 49,102, 93,106, 43, -167,143,143, 79,185, 57,173,181,200,187, 36,176,138,251,191, 56, 81, 85,210, 3,241, 26,158,167,105,230, 13,254,229,210,244,135, - 41,218,125,209,169,249,147, 0,176,187,239,139, 79,214,119,165, 62,252,176,102, 2,116,235, 91,130,144, 23, 4,111, 99,243,146, - 65, 72,220,145,192,120, 99,214,193, 71, 41, 38, 16, 37,249,191, 36,229,229,229,204,216,186, 97,229,207, 35,199,125, 37,189,255, - 60, 21, 57,121, 58, 80, 20,105,221,120,130,195,161, 32,151, 8,225,235,225,128, 29,191,253,146,155,171,202,158,137, 18,242, 30, - 86,145,241,198,116,104, 84, 93,192,243, 84,163, 86,189,254,160,132,255,136, 0, 54,165,132,217,193, 22, 39,241, 81,156, 90,248, - 87,156,122,204,237, 44,253,235, 66, 75,175,255,240,187, 78,157, 78,204, 57,122, 84,220,120,203, 22, 60, 31, 57, 18, 94, 26, 13, - 4,133, 83,137, 36, 65, 64,202,227, 65,202,227, 21,136,172,165, 75,161, 49,153,176,108,200,144,124,157, 94,223,201,158,135, 60, - 51, 51, 19, 61,123,246, 76, 79, 74, 74,234,130,114, 76,237,149, 4,181, 90,189, 23,192,222,138,226,211,233,116,231, 19, 18, 18, - 62,234,217,179,231,209,227,199,143,187,190, 35, 65,230,204, 98,203,112,227,198,141,209, 23, 46, 92,120,142, 87, 19,139,102, 95, -184,112,225,249,168, 81,163,136,141, 27, 55,110, 2,240, 61,108, 12,224,169, 86,171, 87,158, 58,117, 10,173, 91,183,254,126,225, -194,133,206, 13, 27, 54,132,155,155, 27,114,115,115, 17, 25, 25,137,137, 19, 39, 42, 85, 42,213,194,236,236,236,159,237, 44,179, - 65,167,211, 13,182, 94, 74, 93, 17,215, 65,167,211,109, 78, 78, 78,222, 92, 81,132,227,199,143,191,251,236,217,179, 76, 87, 87, -215, 38, 60, 30,175, 30, 10,252,128, 82, 0,108,178, 87, 16,153, 49,110,220,184, 59,207,158, 61,203,240,246,246,110, 90,200,233, -136,130, 52, 70, 27,202,193,153,116,243,230, 77,159, 70,141, 26,145, 92, 46,151,165, 40, 10, 92, 46,151,229,112, 56,108,161, 95, - 13, 11, 0,135, 14, 29, 18, 0, 80,162, 18,255, 54, 44,225, 29,146,147,147,173, 69,150,217,106, 21,214,178,101,203, 91,133, 34, -203,252, 89,121,252,203, 78, 51, 12,243, 70,249,122, 89,150,197,156, 57,115,176,110,221, 58,148, 21,209,188,112,117, 31, 81, 22, -159,217,162, 69,211, 52, 12, 6, 3,238,223,191,111,137,217,101,158, 46, 52,135,118, 48,153, 76,165,174, 86,167,105,154,214,235, -245,248,243,207, 63,109, 18, 91,127,252,241, 7,180, 90, 45,232, 50, 20,156,117, 40,134,144,144, 16, 40,149, 74,203, 98,159,176, -176,127, 66,229, 25, 12, 6,187,132,171,153,179, 86,173, 90,200,200,200,128,217, 95,216,119,200, 63,198, 30,147,250,127, 54,126, -112,137, 22, 45,155,123,204,250, 14, 14, 14, 58,190,113,127,143, 96, 65,219,126, 97, 14,240,247,144,129,203, 19, 34, 73,101,194, -233,135, 42,108, 56,151, 18,175, 49,210,221,158,164,231, 71,149,198, 35, 16,203,143, 55,108,222,177,197,144,209, 19, 37,121, 58, - 26, 49, 49,177, 72, 79, 75, 6, 73,144,240,244,246,129,159, 95, 85,136,248, 36,182,175,255, 89,125,235,242,153, 75,121,185, 89, -157, 75,226,234,234,192,187,188,244,227, 22, 77, 3, 2,100, 4, 76, 70,128, 54, 2, 38, 35,192, 20,190,154,223, 99, 94,173,115, - 15, 30,100,179,211,111, 43,175, 30,201, 49, 20,155,179,170, 47,208,194,209,201,233,196,172, 67,135,196,140,193,128,204,201,147, - 33, 54,153, 32, 44, 28,149, 20,156,136, 0,166,185,115, 11, 68,214,224,193,249, 57,217,217,118,165,224,113,113,113,185, 73, 16, -132, 75,122,122,250,123, 21, 25,222,213,213,245, 8,203,178, 25, 25, 25, 25, 13,223,161,114,185, 1,200, 6, 96, 40,102, 32,225, - 10,251,253,127,204,168,234,234,234, 58,157, 36,201,102, 44,203, 58,147, 36,153,197, 48,204,149,180,180,180, 69, 0,158, 85,246, -167,255, 25,204,145,225,171,149,113, 92, 26,128, 47, 81,224, 20, 28, 83,121,217,254,117, 84,120, 10,158,138,132,147,147,211,181, - 19, 39, 78, 52,244,247,247, 39,173, 29,222,205,177,242,204,211, 91, 28, 78,129,150, 59,127,254,188,105,192,128, 1, 87, 82, 83, - 83, 91,151,196, 41,147,201, 78,222,187,119,239,131,156,156,156,215, 4,149,117,164,120,243,190, 90,173,198,184,113,227, 78,149, -148,130,199,193,193, 97,233,207, 63,255, 60,161, 79,159, 62,164, 57, 28,133,245,102, 78, 23,100,222, 12, 6, 3,182,109,219,198, - 44, 95,190,124, 69, 78, 78, 78,137, 83,135,158,158,158,241, 73, 73, 73, 62,230, 80, 11,182, 4, 21,173, 90,181,106,114,108,108, -172,215,191,201,249, 30, 11,174,245,214,194,219, 94,211, 4, 81,203, 77,210,159, 5,250,145, 96,234,146, 4,193, 55,177,120, 12, - 22, 39,197,156,252, 95,111, 37,195,166,169, 51,174, 72, 52, 94, 38, 85,252,208,103,208,231,206, 85, 3, 2, 9,119, 79,111, 16, - 32,145,154,146,136,216, 23, 79,216,253,191,175,206, 84,171,148,179, 53, 26,245,234,210,120,106, 3, 1,213,228,188,221,124, 26, - 53, 97, 22, 64, 69,242, 83,189, 54,226, 0, 96,224,146,143, 98,114,141,253, 31,150, 50,237, 99, 22, 91, 51,246,239, 23,243,107, -214,124, 45, 80, 28,195, 48,208, 69, 71, 99,217,144, 33,118,139,172, 74, 84,162, 18, 21, 2,127,148, 29, 35,203,136,130,248, 92, -166,202,203,245,159,224,157, 77, 42, 13, 64,226,228,228,116,134,162, 40, 63,179, 69,198,218, 90, 95, 76, 66,233,152,212,212,212, - 14, 0, 74, 91, 33, 28, 32,147,201, 86,211, 52,221,216,150,164,210, 20, 69, 93,207,205,205, 29,143, 82,146, 74,191,141, 85,135, -206,206,206,207, 98, 99, 99, 3,204,171,168,173,251,202,226, 86,150, 63,125,250, 20,109,218,180,137, 77, 73, 73,169,250,111,114, -190,171, 40, 97,213, 97,120, 49,247,216, 62,139,214, 91,128, 23, 79, 32, 29,202, 23, 9,219, 51, 70, 83, 45, 16, 0,135,203,125, -164,215,106,206,234, 52,121, 91, 81,194,116,225,191,137,190, 64, 11, 1,159,127,146, 39,151,139,138, 19,109,198,220, 92,141, 78, -175,255,176, 82,100, 85,162, 18,149,168, 68, 37,222, 35,212,116,114,114, 58,193,229,114, 5,214, 98,178,232,255,102,152, 76, 38, -109,122,122,122,103, 0,143,255,101,206,247, 26,246, 4, 49,127, 5,118, 58,169,117,180,149,179,112,107,243,174,115,190,197,115, -103, 43,144,179, 77, 33,231,172,247,164,156,109,222, 85, 78,243,249,218,193,219,209,158,122, 84, 81,215,211,170,156,108, 69,151, -243,109,113, 86,212,115, 84, 76, 57,217,183,112,223,103,189, 39,229,108,243,174,113, 22,173, 63, 54,242,218,197,105, 99,157,178, -183,156,108, 69,151,243,109,113,190,233,115, 84, 74, 57,217, 55,173, 75, 37,220,251, 89,120, 15,241, 32, 20,236,131, 80,176,247, - 27, 20, 27,183,177, 56,139, 22, 88,150,133, 93,142,132,111,107, 37,128, 57,236,126, 33, 63,241,174,114, 90, 95,135,138, 76, 21, -240, 22,210, 14,156,171,104,206, 34,215,179,162, 48,171,112,133, 73, 4,108, 8, 56,106,207,185, 87,196,125, 47,114,174, 21,194, - 91, 14,145,101, 23,103, 69,213,251,183,205, 89, 81,207, 82, 81,206,138,168,247,197,221,247,183,120,143, 42,170,156, 21,242, 44, -189,141, 58, 95, 76,253,121, 99,222,162,156, 21,241, 44, 21,229,172,136,122,255,111,112, 86,196,179, 84, 28,103, 69,212,251,146, -238,253,251,106,161, 50, 79, 23, 22,134,120, 32,108, 16, 91,235, 1,128, 44,207, 69,123, 27,120, 27,137, 36, 43, 90, 16,189, 45, -177,105,135, 5,230, 63,231,172,224,123, 52,171,144,179, 34, 71, 55,109, 43,234, 30,189,141,250,110,205, 89, 81,252, 69,121, 42, -226, 62, 21,199,249,166,229, 45,161,156, 21,126,238,111, 90,239,255, 45,206, 10,190, 71, 21,242, 44, 21,225,108, 91,193,131,129, -182, 86,251,179, 42,146,179,162,158,165, 98,202,249,198,247,169, 56,206, 55, 45,111, 9,229,172,240,115,175,136, 62,228,109,241, -254,151, 22, 45,150, 44,177, 78,172, 47,178,253, 43, 66,227, 63,155,146,179,147,251,127,138,211,206,233,153,142,111,225,222,255, -167,229,172, 72,206,162,101,172,200,233,158,183, 89,206,138,228,180,163,172,255,115,156,239,219,125,127, 23,175,103, 73,124,111, - 50, 45, 85,146,117,244,109,148,179, 34, 57,109,228,254,159,224,124,131,123,255, 63,131,114, 77, 29,190, 77,152, 47,124, 5,143, - 76, 80,193, 22,152,183,118,222, 21, 92,206,182,111,195, 66,248, 22, 80,225,229, 44, 28, 41,255,240, 22,206,253,125,185,166,149, -207, 82,229,179,244,206, 61, 75, 69,234,100,219, 10,180, 20, 85,168,229,185, 40,103, 69,252,134, 53, 71, 69,213,209,183,125,238, - 21,249, 44,189,141,123,255,190,225,255, 6, 0,135, 16, 1, 36, 28,246,146,177, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130, + 0, 94,201, 47, 68,148,126, 35, 49,120,227,252,207,188,147, 99,159,122,143, 89,176,163, 38,225, 76,183,125,148,169, 73,177,245, + 7,121, 66,233,193,102,173, 59,181, 27, 55,225, 43,201,237,168, 71, 56,121,238, 10, 84,106, 29, 40,146,132,163, 76,140,154, 53, +171, 19, 75,215,237,117,217,180,102,233,207, 87, 47,156,234,170, 85,231,244,176, 75,166,139, 57,223, 77,237,221, 88,226,236, 68, + 3, 12,141,175,187,132, 72,190, 61,124,235, 59,228,155,166,219, 45,178,206,156, 17,167,165,166, 98,142,151, 23, 56, 38, 19,132, + 36, 9, 33, 65, 64, 72,146,144, 8,133,232,188, 97, 3,230, 30, 59, 38,158,249,209, 71,149, 98,235,127, 12, 82,169,116,184,151, +151,215,226,245,235,215, 59,251,251,251, 67, 34,145, 64,169, 84,186, 60,126,252, 56,116,210,164, 73, 67,147,147,147,103,168, 84, +170,181,149, 87,170, 18,149, 40, 17,161, 0,110,161, 48,127,169, 29,159,149, 8,161, 80,152,170,213,106,221, 74, 59,134,207,231, +167,233,245,122,247,178,184, 72,146,244, 73, 76, 76,116, 19,139,197,160,105,186, 48, 27, 0, 99, 25, 72, 91,103, 63, 41, 12, 84, +139,160,160, 32, 67,105,156, 50,153,236,215,180,180,180,142,230, 60,129, 86,130,170, 88, 36, 38, 38,118,172, 83,167,206,175,185, +185,185, 31,150, 32, 94,102, 79,152, 48, 97, 98,221,186,117,205, 86,160,194, 44, 8, 5,175, 25, 25, 25, 24, 63,126,188,229, 55, + 24,134,193,169, 83,167, 38, 12, 31, 62, 28, 89, 89, 89,147, 74, 57,119, 63, 55, 55, 55,162, 48,161,120,137,152, 53,107, 22,102, +205,154,133, 21, 43, 86, 16, 92, 46,215,177,140,235, 89, 33,156,182,106,145,255,194,130, 85, 70,100,248, 35,120, 53,188,195,145, +215,132,150,173, 32, 89,230,232,188,101,235, 71,206, 25,214,146,216, 56,169, 99,224,216, 21,167,175,144, 60,182,245,195,100,109, +188, 13,150,172, 17,141,154,119,108, 59,126,226, 84,201,142,191,206,226,241,195,187,136,190,184,243,149, 99, 26,126, 56, 28, 41, + 25,185, 24, 62,238,107, 41, 65,113,218, 94, 56,125, 96,132, 81,167,217,104,163, 53,203,221, 79,192,255,162,105,227, 96,110,162, +232, 49, 60, 20, 34,180,108, 80,131,235,123,226,222, 23,106,152,150, 63, 44, 88, 37, 99,151,200, 90,255,233,167,104,101, 52,194, +141,162, 64, 17, 4, 40, 0, 36, 65, 64,171,211,225,198,224,193,104,188,117, 43,126, 56,116, 72, 60,187,123,119,187,196,150, 68, + 34,185, 77, 16,132, 34, 47, 47,175, 43, 10, 18, 75,191, 15,168, 35,149, 74,143,176, 44,155,165, 86,171, 67,223,161,114,121,162, + 96,142,190,232,232,152,135,130, 21, 85,118,101, 22, 22, 8, 4,163,251,246,237,187,116,213,170, 85,226,212,212, 84, 36, 37, 37, +129,166,105, 8,133, 66, 4, 6, 6, 18,167, 79,159,118,158, 58,117,234,146, 35, 71,142, 8,114,115,115,151,219, 51,176,225,114, +185,235,156,156,156, 62,114,119,119,151,164,165,165,229,103,103,103,159,210,233,116,163, 81,254,180, 41, 36,151,203, 29, 84,181, +106,213, 94, 94, 94, 94,238,137,137,137, 25, 9, 9, 9, 7,117, 58,221, 38,148, 51, 81,179,213, 53,173,143,194,104,245, 0,146, +171, 86,173,122, 63, 38, 38, 38,173, 2, 57,147,170, 86,173,250,160, 28,156, 18, 0,187, 0,120,149,113, 92, 18,128,254,176,211, +154, 93,137,138, 19, 89,133,217, 30,138, 10,170,210, 62, 43, 21, 58,157,206,213, 96, 48,128, 91, 66,178,120,181, 90, 13,153, 76, +230,106,107, 33, 69, 34, 17,118,238,220, 9, 46,151, 11, 46,151,139,172,172, 44,248,248,248, 88,246,121, 60,158,229,255, 42, 85, +170,148,201, 71,211,116, 99,138,162,144,151,151, 7,154,166, 45, 91,118,118, 54, 88,150,133, 64, 32, 0, 77, 23,164,115,178,250, +188,113, 73,124, 4, 65,244,243,242,242,194,142, 29, 59,160,215,235, 95,251, 92, 46,151, 35, 42,234,159, 36, 35, 20, 69,161, 73, +147, 38, 36, 65, 16,253, 0, 76, 42,133,151, 5,128,240,240,112, 80, 20, 5,138,162, 64,146,164,229,127,243, 70,211, 52,102,205, +154, 5, 91,178,118,188, 13,206,119, 13,101, 68,134, 79, 70, 9, 62, 90,100,105,164,181,220, 37,159, 77, 26,216, 49,255,187, 17, + 93,216,233, 67, 62, 96,167, 14,108,195,126,212,186,222, 95, 20,135, 67, 92,123, 16, 7, 31, 7, 96,211,248, 70,126,190, 46,146, +168, 96, 39,105,205, 98, 40,172,151,120,122,137, 37,242, 31, 63,251,242,107,233,145,243,247, 16, 23, 31,247,154,200, 2,128,155, + 39, 55, 33, 57, 41, 17,183,162, 19, 48,104,196,231, 82,185,220,241,199, 34, 13,106,137,203, 70, 29,100,188,159,166,245,111, 41, +204, 51, 38, 33, 87, 1, 80, 1,124,112,197,106, 76,237, 86, 95, 32,151,241, 74, 75, 85, 97,225, 20,240,249, 39, 23,158, 62,109, + 17, 89, 45,116, 58, 8,104, 26, 38,154,182,136, 44,189,201, 4,141, 94, 15,207,188, 60, 60, 27, 62, 28,172,209,136, 25,251,247, +139, 5,124,254, 73, 91,202, 9, 0, 60, 30,207,243,224,193,131, 85,234,213,171,119, 14,182, 7, 51, 61,253, 22,234,142,173,156, + 13, 66, 66, 66, 34,182,110,221, 90,133,199,227,121, 86, 4,167, 80, 40,252, 88, 34,145,164, 11,133,194,143,203, 89, 78, 18,192, +188,145, 35, 71, 70, 86,175, 94,253,108,161,176,178,136,154,234,213,171,159, 30, 57,114,228,109, 0,179, 74,168,235,197,113,122, +123,121,121,205, 95,181,106,149,248,201,147, 39, 72, 76, 76,132,209,104,196,192,129, 3, 65,211, 52, 52, 26, 13,244,122, 61, 22, + 45, 90, 36,113,118,118,254, 14, 5,137,130,109, 57,119,158,131,131,195,147, 45, 91,182,244,125,249,242,165,244,236,217,179, 68, + 84, 84,148,100,201,146, 37, 61,157,157,157, 31, 3, 16,148,227,122,146,158,158,158, 27, 15, 28, 56,240, 89, 84, 84,148,207,190, +125,251,184, 87,175, 94,245, 92,179,102,205, 40, 79, 79,207,173, 0,168,114,222,163, 80,177, 88,220, 97,202,148, 41,204,229,203, +151, 19, 47, 95,190,156,184,116,233, 82,180,106,213,170,197,156, 57,115,194,202,201,217, 64, 38,147,181,159, 50,101, 10,115,225, +194,133,164,107,215,174, 37, 44, 89,178,132,108,223,190,125,203,249,243,231,215,183,147,115,215,229,203,151,219,196,199,199,251, + 39, 36, 36, 84, 75, 72, 72,168,154,144,144, 80, 53, 49, 49,209, 47, 57, 57,185, 74, 74, 74,138,111, 90, 90,154,111, 68, 68, 68, + 75, 0,219,223,177,231,232,255, 3, 39,199, 44,164,148, 74, 37,142, 28, 57,130, 66,235, 85,168,181,200, 82,169, 84, 72, 78, 78, + 54,127,198,177,165,156,114,185,252,204,250,245,235, 89,173, 86,139,156,156, 28,164,165,165, 33, 62, 62, 30,207,158, 61, 67,102, +102, 38, 30, 61,122, 4,177, 88,124,198,150,114, 18, 4, 1,154,166, 45, 66,234,212,169, 83, 24, 57,114, 36,148, 74,165,229, 61, + 14,135, 99,249,223,252,157,178, 56,205,150, 39,154,166,113,237,218, 53,140, 25, 51, 6, 75,151, 46,197,246,237,219,113,248,240, + 97, 40,149, 74,139,216, 50,153, 76,101,114,102,100,100,128, 97,108, 27, 51,177, 44,139,156,156, 28,155,239,187,181, 0,226,112, + 56,175,137, 34,243,102, 79, 93,122, 67,206,119, 22, 54, 68,134, 47,121,132,109,254,167,208, 84,215,246, 21,161, 85,213,227,187, +197, 19,251,137, 64, 27,192, 26, 53,128, 33, 31, 48,228,129,209,231,131,224,137, 0,163, 6,174, 2, 37,118,141,171, 37,255,102, +199,243,135,244, 35,162,107,116, 70,238,241, 98,123, 4, 14,111, 80,191, 97, 19,156, 19,210, 84, 72, 76,205, 1, 69,254,211,239, +133,117, 28, 6, 14, 69,226,250,137, 2,195, 21, 73, 81,200, 81,235,144,157,103, 64,223, 97, 19,157,126, 95,250,253, 32,147, 65, + 91,106,140,151,186, 64, 96,176, 84,218,187, 78,157, 42,228, 67, 65, 52,194, 62,186, 8,154, 1,216, 11,221, 17,154,229, 70, 5, +157,228,247, 86,231, 26,230, 71, 1, 79, 74,181,102, 56, 58,138, 20,245,235, 99,142,151, 23, 90, 27,141,224,177, 44, 62, 72, 77, +197,221,137, 19,161,219,187, 23, 36, 0,222,199, 31,163,221,178,101, 56,239,229, 5, 15,141, 6,217,147, 39,195,245,248,113,240, +228,114, 17,210,109, 91,252, 64, 16, 4,218,182,109,139,211,167, 79, 59,119,238,220,249,196,189,123,247,250,152, 76,166,243,229, +185,137, 14, 14, 14, 55, 57, 28,142, 79, 89,199,153, 76,166,132,156,156, 28,187,211,140,112, 56,156,214, 77,154, 52,217,191,111, +223, 62,133,193, 96,168,144, 81, 8,159,207,239,220,179,103,207,245,171, 87,175,150,143, 26, 53,106,253,225,195,135,243,245,122, +253,113,123, 44, 57, 0,230,173, 93,187,118,108,120,120,184,227,168, 81,163,216,103,207,158, 89, 91,175, 92, 91,181,106, 85,125, +253,250,245, 30,141, 26, 53,154, 48,102,204, 24, 30,128, 25,101, 89,121,164, 82,233,184,245,235,215,187,100,100,100, 32, 47, 47, +207,210,200, 38, 36, 36, 64, 36, 18,129, 36, 73,144, 36, 9, 46,151,139, 31,127,252,209,121,220,184,113, 19,149, 74,229, 68, 27, +172,100,235,126,251,237, 55,215, 15, 63,252,144,124,249,242, 37, 72,146,132, 80, 40,196,167,159,126, 74,106, 52, 26,197,156, 57, +115, 54,171,213,234, 1,246, 92, 67, 46,151, 59,104,221,186,117, 53, 91,180,104,193,137,142,142, 70,179,102,205,112,253,250,117, +124,252,241,199,220,220,220,220,106, 83,167, 78, 29,169,211,233,236,141,227,226, 41, 22,139,235,254,253,247,223,241,190,190,190, +150,134,165, 90,181,106,116,215,174, 93,149,209,209,209,181, 46, 95,190,156,217,188,121,115,123, 18,150,123,139,197,226,160,163, + 71,143, 38,207,153, 51,167,195,218,181,107,123, 2, 64,227,198,141, 15,206,157, 59,247,172, 82,169, 12, 62,127,254,188,178,117, +235,214, 9, 54,242,121,121,122,122,210,227,199,143,151,150,118,208,134, 13, 27,178, 81,144,112,217, 31,192, 11, 84,226,223,130, + 9, 64, 24, 65, 16,183,142, 28, 57,130, 38, 77,154,224,200,145, 35,232,218,181,235, 45,107, 49, 16, 21, 21,133,214,173, 91,163, +208,162,101,147,175, 86, 78, 78,206,180, 89,179,102, 93, 24, 52,104,144,248,149,198,128, 36,225,232,232,136, 46, 93,186,104,213, +106,245, 52, 91, 11, 74,211, 52, 56, 28, 14, 18, 18, 18,176, 97,195, 6, 44, 88,176, 0,129,129,129, 48, 26,141,175,137,173,194, +118,207,166,198,207,100, 50,225,198,141, 27,216,182,117, 43,102,124,247, 29,100, 50, 25, 0,192, 96, 48, 64,153,149, 5,161, 80, +104, 17, 99,101, 8,167,221, 79,159, 62,157,232,227,227,243,202,148,161,249,181,176,205, 2,195, 48, 48,153, 76,208,106,181, 88, +186,116,169,137,101,217,221,101,245, 63,102, 81, 52,113,226, 68,232,116,255, 24,212,235, 23,250, 36, 87,173, 90, 21, 33, 33, 33, +150,125,146, 36, 89, 91, 57,127,111, 94, 23, 26,171,163,107,205, 90, 2, 0,240,241,241, 65,173, 90,181,224,233,233, 89, 34,103, +113, 90,228,191,134, 29,145,225, 75, 22, 90, 37,101,202,126,248, 50,101,209,168,169, 75,150, 72,132, 20,247,203, 94,245, 80,197, +145, 7,136,156,192,107,253, 13, 8,199,130,129, 60,171,124, 1,156,252, 6, 63,247, 86,146,225,127,104,255, 50,208, 10,215,231, + 89, 89,175, 57,225,113,121,194,118, 1, 53,106, 18,113,201, 74,112, 56, 28, 72, 28, 92,208,188,215, 36, 80, 20, 9,169,163, 11, + 8, 90,243,143, 34, 38, 41,112, 40, 14,148,185, 26, 84,245,175, 65, 10,132,162,118,234, 50,132,150,220,129,251,219,148, 1,205, +133,153,166, 4,136,170, 8, 65,155,187, 83, 47, 62, 72,231, 92,124,213, 57, 80, 20,126,240,222,111,200, 49,182,183,229,194, 80, + 38, 19,220, 40, 10, 6,150,197,221,137, 19, 17,182,110, 29,110,153,133,225,186,117,184, 21, 30, 14, 39, 46, 23, 2,146, 4,107, + 52,190, 54,167,111,139,208, 2,128,248,248,120,236,221,187,215,169, 95,191,126,251,163,162,162, 6,217, 41, 54,204, 92, 46,215, +174, 93,115,243,247,247, 47,241,152, 23, 47, 94,160, 97,195,134,118, 79, 79,241,249,252,206,237,219,183,223,177,119,239, 94,135, + 7, 15, 30,192,205,205,237,141,133,150, 64, 32,104,221,177, 99,199, 29, 91,182,108,145,167,167,167, 99,221,186,117,242,238,221, +187,111,143,140,140,236,165,211,233,108, 17,155,175,136,172,117,235,214,101,111,216,176,225,119,188, 58, 69,152,188, 97,195,134, +141,141, 26, 53,250, 44, 60, 60,220, 17,192,216, 66,223,129, 82,197,150, 64, 32,104, 27, 16, 16,240,202,168, 86, 32, 40, 48, 54, + 73, 36, 18, 56, 56, 56,128,199,227, 65,167,211, 33, 44, 44,140,224,243,249, 45,109, 57,103,153, 76,214,177,119,239,222,228,197, +139, 23,145,146,146, 2, 71, 71, 71, 72,165, 82,208, 52,141, 81,163, 70, 81, 75,151, 46,109,171, 86,219, 55,195,229,235,235,219, +179, 67,135, 14,156,251,247,239,227,229,203,151,208,233,116,120,252,248, 49,228,114, 57,134, 12, 25,194, 91,188,120,113,247,196, +196, 68,123,133, 86,221,240,240,240, 84,107,145,101,134, 68, 34, 33,106,214,172,169,116,118,118,110, 0,192, 30,161, 85,247,243, +207, 63, 79, 91,184,112, 97,235,211,167, 79, 91,130, 94,158, 62,125,122, 42, 0, 44, 95,190,252,130,171,171,107, 3, 0,182, 10, + 45,176, 44,203,124,242,201, 39,177,124, 62, 31, 92, 46, 23,124, 62,255,149,141,199,227,129, 36, 73,153,249,113,254, 31, 22, 53, +141, 0,252,130,130,228,186,223, 1,184,246,142,148,235, 54,128,176,174, 93,187, 90,196,214,177, 99,199,208,185,115,103,100,103, +103,227,254,253,251,214, 34,203,158, 4,203,183,141, 70,227,157,157, 59,119, 54,239,215,175, 31, 97,245,124,225,193,131, 7,120, +244,232,209, 45, 91,249, 72,146, 4,195, 48,224,114,185, 88,178,100, 9, 12, 6, 3,254,248,227, 15,236,217,179, 7, 36, 73,130, + 32, 8, 16, 4, 1,185, 92,142, 21, 43, 86,216,213,238,209, 52,141,205,155, 55,227,155,169, 83, 45, 34,171,112, 38, 3, 30,238, +238,112,118,113,193,243,231,207,203, 20, 90, 89, 89, 89, 63, 28, 58,116, 8,165, 57,195, 31, 58,116,200,242,127, 17,103,248,178, +251, 57,138,130, 78,167,195, 7, 31,252,147, 42,246,243,207, 63,183,252,175, 84, 42, 65, 81,148,249, 90, 16,182,114,106, 88,160, +151,240,159,247,186,124,245,213, 43, 22,186,146, 56, 75,210, 34,239,162,117,171, 24,177, 21, 86,104,157,245, 4,208, 21, 5, 62, + 90,201, 64, 25, 62, 90, 79,210,212,171, 56, 68,114,200,194,241, 31, 14,171,226,230, 0, 54, 47, 21,188,246, 63,224, 78,186, 8, + 75,150, 30, 5, 0,124,253,105, 67,212,239, 56, 15,250, 77, 31, 98, 98, 51,138, 63, 56, 65, 55, 5,192,204,215, 27, 70, 38,200, +199,219, 11,119,158, 69,129, 67, 81,224, 59,184,192,193,201, 29,140, 73,143,156,180,151, 56,183,239, 87, 0,192,218,205,187, 65, +146, 36, 56, 28, 10, 58, 61,141,192, 42, 94, 96, 24, 38,168,180,114,214, 6,154,183,117,119,105,226,235,231, 72,220, 87,188, 68, + 77, 55,231, 34, 19, 33, 2, 4, 38, 73,137,102, 82, 81,227,172, 28, 85,243,135,192,229, 50,197, 0, 73,130, 36, 8,136,121, 60, +232,246,238, 45,240,218, 92, 87,208,103,221, 10, 15, 7,249,215, 95,144, 9, 4,160, 8, 2,156, 66, 19,116,121,160, 82,169, 64, + 16, 4,182,109,219,166, 24, 50,100,200,246,251,247,239,135,107,181,218,189,246,112,100,103,103,119,109,209,162,197,217,205,155, + 55,187,122,120,120,188,246,121, 74, 74, 10,134, 13, 27,150,158,157,157,109, 87, 80, 55,161, 80,248,113,207,158, 61,215,111,218, +180, 73,254,244,233, 83,228,229,229,193,213,213,245, 77,235,104,131,166, 77,155,238,223,187,119,175, 67, 74, 74, 10,114,114,114, +160,211,233,176,109,219, 54,199, 46, 93,186,236,141,142,142,238, 12, 32,178, 12,142,153,214, 34,107,204,152, 49,247, 0,184, 1, +248,173,168, 6, 45,252,172,158,149,216,202, 1,176,184,148,145,168,159, 68, 34, 65, 90, 90, 26,134, 13, 27,134, 39, 79,254, 49, +128,122,121,121, 89, 70,122,207,159, 63,135,171,171, 43, 8,130,112,179,229,164, 93, 93, 93,165,122,189, 30, 35, 71,142, 68,124, +124,252, 43,156, 9, 9, 9, 32, 8, 66,108,239,133,116,119,119,119,215,104, 52,104,213,170, 21,180,218,130,188,190,253,251,247, + 7,151,203, 69, 90, 90, 26,184, 92,174, 75, 57,238,143, 75,215,174, 93, 75, 12,173, 34,151,203, 13, 10,133,162,182,157,156,206, +221,187,119, 79, 92,183,110,221,107, 11, 91,174, 95,191,222,195,201,201,233,180,147,147, 83, 77, 59, 57, 25,107, 81,197,227,241, + 94, 17, 90, 92, 46, 23, 36, 73, 50,248,223,199, 79, 0,204,171,224, 86, 3, 8,121,135,202,102, 17, 91,199,142, 29, 67,112,112, + 48,178,178,178, 16, 29, 29, 93, 94,145,101,110,239,190,153, 61,123,246,201, 62,125,250, 72,204,131, 86,145, 72,132,201,147, 39, +107,242,242,242,190,177,171, 18, 49, 12, 56, 28,142,101,144, 44, 20, 10, 17, 22, 22,102, 17, 89, 4, 65, 32, 63, 63, 31, 28, 14, +199,188, 34,145,176,177,140,240,244,240,128, 76, 38, 67,141,192, 64, 60, 45,108, 71,204,255, 11, 4, 2, 16, 4, 1,147,169, 76, + 67, 94,110,161, 83,251,164, 10,190, 55,172, 89, 20,149,106, 58,246,242, 2,195, 48,102,145,201, 86, 4,167,139,139, 11,242,242, +242,108,229,124, 39, 81,130, 69,203, 44,180,186,162,192, 87,235,181,240, 14,109, 0,156,195,171, 75, 42,201,218,238,210, 13, 11, +199,117, 24,246, 97,176, 11, 52,233, 47, 33,148,185,128,112,172,138, 37, 75,143,226,254,139, 76, 0,192,146,237, 55,177, 99, 78, + 23, 64,228,132, 90, 14, 25,240,144,113,122, 63, 74,123, 93,104, 17, 96, 9,134,101,193,161,200,194,185, 91, 10, 20, 69, 66,153, +158,140,101, 63,140, 45, 20, 89,123,112,228, 66, 52,124, 2,130,255,153,199, 37, 8,128, 45,189,114,187, 58,240,214,141,235,211, + 84,148, 74, 36,195,209, 75, 12,161,176,136,126, 84,240, 64, 84, 37, 49,190,173,143,248,198, 33,237,186,135, 57,134, 50, 59, 10, + 33, 73, 22, 56,191, 19, 68,177,206, 61,100,225,103, 20, 65, 20, 68,127,101,236,107,211,205, 66, 94, 36, 18,193, 96, 48,128,162, + 40,172, 92,185,210,177, 99,199,142,191,217, 43,180, 0, 60, 72, 77, 77,237, 50,106,212,168, 99,187,119,239,118,113,113,113,121, +101,244, 48,106,212,168,140,212,212,212, 46,176,211,233,158,203,229,254,182,122,245,106,121, 76, 76, 12,242,243,243, 33, 18,137, + 44,141, 79,121,235,103,227,198,141, 79, 28, 63,126, 92,145,147,147, 3,131,193, 0,145, 72, 4,150,101, 65, 81, 20,254,252,243, + 79,231,110,221,186, 29,141,139,139,107, 95, 90, 89, 69, 34, 81,175, 66,225,132,240,240,112,199,240,240,240, 54, 64,137,145,122, + 45, 8, 15, 15,119,156, 52,105, 82,119,141, 70,179,184,148,115,142, 87, 42,149, 30, 34,145, 8,251,246,237,131, 84, 42,133, 88, + 44,134,151,151, 23,148, 74, 37,196, 98, 49, 88,150,133,209,104, 52, 55, 22,153,182,156,120,122,122,122,158,201,100,114, 56,118, +236, 24, 50, 51,255,249, 74,149, 42, 85,144,157,157, 13,134, 97,242,237,189,152, 73, 73, 73,169, 4, 65,248,222,185,115, 7, 49, + 49, 49,232,220,185, 51,254,250,235, 47, 52,108, 88, 48, 59,172,215,235,203, 19,196,143,166, 40,138, 45,165,222, 18, 0, 20, 21, +201, 89,216,121,217,197,201, 48, 12, 99, 22, 89,214,175,214,226,171,140,223,252, 95,129,131,245, 56,225, 93, 45,100,231,206,157, +161, 84, 42, 33,149, 74, 43,194, 63,231,138, 70,163,121,124,224,192,129, 6, 93,187,118, 5,159,207,199,227,199,143, 17, 25, 25, + 25, 13,224,138,189, 66,139,203,229, 98,246,236,217, 24, 59,118, 44,220,221,221,241,205, 55,223,128,195,225, 88, 54,130, 32, 44, + 22, 46,123,224,230, 94,250,194, 71,179, 67,124, 89,198,112, 7, 7,135,217, 36, 73,246,163,108,184,112, 52, 77,211, 12,195,236, +206,201,201, 41, 53,188,131,217,113,221,150,123, 97,125, 13,202,232,211,222,152,179, 4, 45,242,159,163,232,106,195, 18, 44, 90, +230, 85,135,175,165, 2, 50,159,229,185, 66,147,221, 57,107,145,245,227,216,118,195, 62, 12, 86,224,224,153,107,224, 25,178, 1, +125,110, 41,119,216, 8,130, 39,129,187, 3,183, 88, 95, 33,130,164, 30, 37, 36, 38,193, 89, 33, 45, 20, 89,133, 27, 73,162,126, +112,193, 96,246,200,133,104,248,248, 7,131, 67, 81,224, 80, 20,164, 34, 1, 82, 83,146,193,225,144,143, 74,250,217,186, 20,250, +244,169,233, 91, 85,225,204, 69,134,171, 30,158,238, 37, 24, 6, 26,200,224,227,201, 71, 39,103,161, 95, 93, 10,125, 74,149,229, + 44,107, 17, 90, 6,147, 9,188,143, 63,182, 76, 23,222, 10, 15, 71,216,186,117,160,123,246,132,218, 96,120,197, 84, 92, 94,161, + 37, 18,137,144,155,155,139, 65,131, 6, 41,141, 70,227,103,229,172, 11,145,153,153,153,125, 7, 15, 30,156,105, 22, 48, 6,131, + 1,131, 7, 15,206,204,204,204,236,107,131,149,232, 53, 24,141,198,207, 26, 54,108,168,204,200,200,176,148,179, 60, 13,142, 25, + 78, 78, 78, 71, 54,108,216,224,164,211,233, 96, 50,153, 44,156, 34,145, 8, 20, 69,193,213,213, 21, 59,118,236,112,117,114,114, + 42, 53,103,149, 70,163, 57,176,110,221,186,108, 0, 88,183,110, 93, 54, 65, 16, 17, 4, 65,172, 33, 8, 98,117,145,109, 13, 65, + 16, 17,214,199,106, 52,154,253,165,113,235,245,250,136,232,232,104, 86, 44, 22,131,162, 40, 24, 12, 6, 8,133, 66,139, 73, 92, +165, 82, 65,163, 41,152,230,142,140,140,132,209,104,188,104,203,185,231,230,230,158,217,188,121, 51, 83,165, 74, 21, 4, 7, 7, + 35, 44, 44, 12, 77,155, 54,133,159,159, 31,230,206,157, 75,171,213,234,115,229, 16, 90, 71,118,237,218,101,244,245,245, 69,131, + 6, 13, 32, 16, 8, 80,191,126,125,120,121,121, 97,193,130, 5,250,156,156,156, 99,229,184, 77,113, 81, 81, 81, 84, 41, 34, 87, + 14, 27, 86,239, 22, 65,252,141, 27, 55,168,166, 77,155, 30, 44,250, 65,227,198,141, 15, 74,165, 82, 7,179,137,221,158, 17,185, +181,184, 18, 8, 4,150,205,252, 62,135,195,249,255, 96,209,154, 8,224, 30, 10,226, 48,125,243,142,149,205,226,248,158,153,153, +137,232,232,104, 68, 70, 70,162,105,211,166,184,120,241, 34,240,143,131,188,221,200,201,201,249,102,206,156, 57,106,243, 74,190, +239,190,251, 78,147,155,155,251,141,189,109, 48,203,178,224,114,185,168, 85,171, 22, 38, 77,154,132,163, 71,143,226,241,227,199, + 48, 26,141, 22, 33,100,246,201,180,199,162,197,227,241,224,238,238, 14,163,209,104,177,102, 1,192,211, 39, 79,192,225,112,192, + 48, 12,244,122,125,153, 22, 45, 7, 7,135,217,235,215,175,159,144,145,145,225,153,158,158,238,102,189,165,166,166,186, 37, 39, + 39,187, 37, 38, 38,186,197,199,199,187,197,198,198,186,189,124,249,210,115,209,162, 69, 19, 28, 28, 28,102,219, 82, 78,138,162, + 80,191,126,125,124,254,249,231,150,109,213,170, 85,150,237,220,185,115,118, 59,175, 83, 20,133, 90,179,150,160, 75, 58,107,217, +142,186, 18,150,237,254,215, 99, 74,227, 44,170, 69,222, 9,152, 87, 27, 90, 39,150, 46, 6,230, 85,135,230,182,204,226,182, 81, +212, 25, 30, 0, 16,228, 33,158,247,227,232,214,195, 62,168,237,128, 3,103,110, 98,206,254, 23,143, 2,135,185,214,170,174, 72, + 7,147, 30,141,175, 63,109,136, 37,219,111, 2, 40,152, 58,100,210,238,131,205,122, 14, 86,230,139,151,202,140, 98,167, 29, 76, +122,237,217, 23,207,158,180,171, 85,183, 17,153,146,145,247,202,242,207,176,182,125, 65, 16, 4,188,253,131, 65,113, 56,160, 40, + 18, 28,138,130,163, 92,136,232, 59,119, 24,157, 70,115,182, 56,206, 54, 0,135, 47,226,175,250,180, 83,125, 97, 18, 63, 13,174, +158, 18,240,184, 5,218,145,125,209,183, 72, 15,193, 1,234,202, 48, 60,209, 89,116, 54, 85,187, 74,161, 54, 28,140, 40, 97, 4, +200, 48, 12,164, 2, 1,180, 58, 29, 52, 38, 19,218, 46, 91,102,153, 46, 36, 9, 2,183, 1,212, 91,182, 12,151,247,238,133,156, +207, 7, 4, 2,155, 87,133, 20, 39,180, 50, 50, 50, 48,116,232,208,204,228,228,228, 33,229,241,209, 50, 67,167,211,157, 79, 73, + 73, 25,210,183,111,223,109,251,246,237,115,234,219,183,175, 50, 37, 37,101,136,141,126, 79,175, 65,171,213,238,141,143,143,207, + 31, 58,116,232,214,237,219,183, 59,187,184,184, 88, 70, 34,229,170,172, 4,145,209,161, 67, 7,129, 45,199,149,113,200,156, 66, +231,246,177,133,150,173,122, 99,198,140,185,140, 2,255, 43,107,204, 90,187,118,109,127,171, 41,198, 53, 0,150,149, 70,172, 82, +169, 86, 79,154, 52,105,196,249,243,231, 93,132, 66, 33, 8,130, 0,143,199, 67,141, 26, 53, 44,171,104,184, 92, 46, 88,150,197, + 87, 95,125,149,145,150,150,182,220,198,123, 51,102,206,156, 57,173,181, 90,173, 98,232,208,161,148, 80, 40, 68,106,106, 42,150, + 46, 93, 74,111,218,180, 41, 91,173, 86, 15, 43,135, 16,222,252,253,247,223,183,205,203,203,243, 31, 53,106, 20, 47, 39, 39, 7, + 26,141, 6, 83,166, 76,209,111,220,184, 49, 65,163,209,216, 29,240,183, 89,179,102,207, 98, 99, 99, 91,230,231,231,103,137,197, +226,162,214, 62, 66, 34,145, 52, 2,176,213, 30,206,176,176,176,231,113,113,113, 77,231,205,155, 23, 97, 52, 26,185,215,175, 95, +239,105, 22, 89, 43, 87,174, 60, 39, 20, 10, 59,160,132,101,209,165,212, 17, 70, 32, 16,188, 98,193, 42,250, 63,135,195,249,255, + 96,209, 58,135,130,144, 25,239, 26, 94, 17, 89,247,239,223, 71,187,118,237, 0, 0, 23, 47, 94, 68,139, 22, 45,112,241,226, 69, +180,108,217,210,238, 88, 90,133,248, 91,165, 82,197,158, 59,119,174,142,175,175, 47,174, 92,185,242, 18,192,223,246, 22,210, 44, +180, 56, 28, 14, 6, 14, 28,136,142, 29, 59,162, 74,149, 42,175,172, 54, 52,255,111,143,216, 48,153, 76,168, 91,183, 46,116,122, + 61,120, 60,158,101,106,146,195,225,192,213,205, 13,207,158, 61,179,201,162, 69,146,100,191, 94,189,122,145, 15, 30, 60,192,128, + 1, 3,176,109,219,182, 18,143, 29, 60,120, 48,118,238,220,137, 94,189,122,145,211,167, 79, 47, 53,188,131,217, 9,221,150,115, + 50,247,211,101,181,251, 21,197,105,173, 69,222, 53, 88,133,118, 40, 14,225,197,188,183,238, 21,161,101, 21, 36, 12,254,174,226, +225, 29,107,112,112,224,236, 77,204, 57, 16,183,153,102,217,125,251,110,101, 29,254,166, 5, 96,216,253, 41,234,247,221, 90, 48, + 93, 8,128, 73,187, 15,195,238,193, 32,196, 46,184,144,200, 69,142,198,112,164,248,138,103,216,246,215, 31,191, 78,106,250, 91, + 75, 87, 79, 55, 7, 40,115, 52, 22,177,117,235,220, 30, 0, 64,159, 49,243,193,161, 10,166, 20,229, 82, 33, 68, 60, 10,123,183, + 44,207, 48, 24,180,197,214,174, 92, 46, 57,118,122,243, 26, 14,124,137, 17, 42, 15, 22,193,174,255,100,202, 33,252,247,188, 46, +184, 66, 21,112,185,159,133, 79,171, 75,229,203, 31,100,143,133,145, 89,245, 90,135,152,157,173,201,190,115, 71,212,121,253,122, + 92, 31, 50, 4,222, 52,141, 8, 47, 47, 56,113,185,112, 16, 8, 64, 18, 4, 52,135, 15,227,242,190,125,112, 23, 8, 0,153, 12, +166,185,115,161,139,142,134, 49, 55, 87, 83,142,145, 25,250,247,239,159,145,145,145,209, 87,175,215,159,127,211,138,160,209,104, +142,199,199,199,143,109,214,172,217,111, 70,163,241, 51,141, 70,115,252, 77,248,244,122,253,241,148,148,148,143,251,247,239,191, +103,255,254,253, 46,142,142,142,229,230,202,204,204,108, 88, 65,245,157, 1, 48,163,208,185,125,108,120,120,184,227,141, 27, 55, + 70,108,216,176,225, 55,171,209,132,219,200,145, 35, 71, 23, 17, 89,101,174, 58, 4, 16,151,150,150, 54,119,242,228,201,243,127, +254,249,103,169,217,241,253,238,221,187, 48,153, 76,224,114,185,160,105, 26, 35, 71,142,204,203,204,204, 92,130,146, 35, 58,191, + 86,181, 84, 42, 85,141,121,243,230,109, 88,182,108, 89, 71,138,162, 36, 52, 77,171,243,243,243, 35,180, 90,237, 48,148, 47,142, + 22,147,158,158, 62,116,230,204,153, 67,151, 46, 93,218,139, 36, 73, 55,147,201,148,145,155,155,123, 72,163,209,108, 68, 57,166, +146,174, 92,185,146,254,233,167,159,190, 72, 79, 79, 15,242,241,241,201,145, 74,165,122,189, 94, 79,137, 68, 34,185, 68, 34, 9, + 3,112,133, 32,136,135,246,112,222,186,117, 43,101,212,168, 81, 49, 58,157,174,214,154, 53,107, 46,200,229,242, 51, 4, 65, 16, + 60, 30, 79, 33, 18,137,218, 1,136, 32, 8,226,169, 61,156, 36, 73, 50,214,214,171,162,254, 89,124, 62,255,255,139,143,214,187, + 8, 75,120,135,140,140, 12, 60,120,240,192, 44,178,194, 0,160,101,203,150,183,204, 98, 43, 50, 50, 18, 13, 26, 52,184, 5,128, +107,111,125, 85,169, 84,147, 7, 13, 26,116,188,112,112, 60,185, 28, 3, 63,139,208, 50, 11,170, 42, 85,170, 88,246,173, 55, 43, + 31, 45,155, 64,211, 52,120, 60, 30, 56, 28, 14, 60,189,188, 44,191,197,178, 44,158, 61,123, 6,165, 82,105,147,208,162, 40,138, + 34, 8, 2, 3, 6,216,182, 32,249,147, 79, 62, 65, 68, 68, 4, 40, 27, 85, 33, 69, 81,168, 90,181,106,153,199,152,117,169,173, +156, 62, 62, 62,229,230,180,214, 34,239,146,192, 42,238,255,226, 68, 85, 73, 15,196,107,120,158,166,153, 55,248,151, 75,211, 31, +166,104,247, 69,167,230, 79, 2,192,238,190, 47, 62, 89,223,149,250,240,195,154, 9,208,173,107, 9, 66, 94, 16,188,141,205, 75, + 6, 33,113, 71, 2,227,141, 89, 7, 31,165,152, 64,148,228,255,146,148,151,151, 51, 99,203,250,149, 63,143, 28,247,149,244,254, +243, 84,228,228,233, 64, 81,164,117,227, 9, 14,135,130, 92, 34,132,175,135, 3,182,255,254, 75,110,174, 42,123, 38, 74,200,123, + 88, 69,198, 27,211,161, 81,117, 1,207, 83,141, 90,245,250,131, 18,254, 35, 2,216,148, 18,102, 7, 91,156,196, 71,113,106,225, + 95,113,234, 49,183,179,244,175, 11, 45,189,254,195,239, 58,117, 58, 49,231,232, 81,113,227,205,155,241,124,228, 72,120,105, 52, + 16, 20, 78, 37,146, 4, 1, 41,143, 7, 41,143, 87, 32,178,150, 46,133,198,100,194,178, 33, 67,242,117,122,125, 39,123, 30,242, +204,204, 76,244,236,217, 51, 61, 41, 41,169, 11,202, 49,181, 87, 18,212,106,245, 94, 0,123, 43,138, 79,167,211,157, 79, 72, 72, +248,168,103,207,158, 71,143, 31, 63,238,250,142, 4,153, 51,139, 45,195,141, 27, 55, 70, 95,184,112,225, 57, 94, 77, 44,154,125, +225,194,133,231,163, 70,141, 34, 54,108,216,176, 17,192,247,176, 49,128,167, 90,173, 94,121,234,212, 41,180,110,221,250,251,133, + 11, 23, 58, 55,108,216, 16,110,110,110,200,205,205, 69,100,100, 36, 38, 78,156,168, 84,169, 84, 11,179,179,179,127,182,179,204, + 6,157, 78, 55,216,122, 41,117, 69, 92, 7,157, 78,183, 41, 57, 57,121, 83, 69, 17,142, 31, 63,254,238,179,103,207, 50, 93, 93, + 93,155,240,120,188,122, 40,240, 3, 74, 1,176,209, 94, 65,100,198,184,113,227,238, 60,123,246, 44,195,219,219,187,105, 33,167, + 35, 10,210, 24,173, 47, 7,103,210,205,155, 55,125, 26, 53,106, 68,114,185, 92,150,162, 40,112,185, 92,150,195,225,176,133,126, + 53, 44, 0, 28, 58,116, 72, 0, 64,137, 74,252,219,176,132,119, 72, 78, 78,182, 22, 89,102,171, 85, 88,203,150, 45,111, 21,138, + 44,243,103,229,241, 47, 59,205, 48,204, 27,229,235,101, 89, 22,115,230,204,193,218,181,107, 81, 86, 68,243,194,213,125, 68, 89, +124,102,139, 22, 77,211, 48, 24, 12,184,127,255,190, 37,102,151,121,186,208, 28,218,193,100, 50,149,186, 90,157,166,105, 90,175, +215,227,207, 63,255,180, 73,108,237,216,177, 3, 90,173, 22,116, 25, 10,206, 58, 20, 67, 72, 72, 8,148, 74,165,101,177, 79, 88, +216, 63,161,242, 12, 6,131, 93,194,213,204, 89,171, 86, 45,100,100,100,192,236, 47,236, 59,228, 31, 99,143, 73,253, 63, 27, 63, +184, 68,139,150,205, 61,102,125, 7, 7, 7, 29,223,184,191, 71,176,160,109,191, 48, 7,248,123,200,192,229, 9,145,164, 50,225, +244, 67, 21,214,159, 75,137,215, 24,233,110, 79,210,243,163, 74,227, 17,136,229,199, 27, 54,239,216, 98,200,232,137,146, 60, 29, +141,152,152, 88,164,167, 37,131, 36, 72,120,122,251,192,207,175, 42, 68,124, 18,219,214,253,172,190,117,249,204,165,188,220,172, +206, 37,113,117,117,224, 93, 94,250,113,139,166, 1, 1, 50, 2, 38, 35, 64, 27, 1,147, 17, 96, 10, 95,205,239, 49,175,214,185, + 7, 15,178,217,233,183,149, 87,143,228, 24,138,205, 89,213, 23,104,225,232,228,116, 98,214,161, 67, 98,198, 96, 64,230,228,201, + 16,155, 76, 16, 22,142, 74, 10, 78, 68, 0,211,220,185, 5, 34,107,240,224,252,156,236,108,187, 82,240,184,184,184,220, 36, 8, +194, 37, 61, 61,253,189,138, 12,239,234,234,122,132,101,217,140,140,140,140,134,239, 80,185,220, 0,100, 3, 48, 20, 51,144,112, +133,253,254, 63,102, 84,117,117,117,157, 78,146,100, 51,150,101,157, 73,146,204, 98, 24,230, 74, 90, 90,218, 34, 0,207, 42,251, +211,255, 12,230,200,240,213,202, 56, 46, 13,192,151, 40,112, 10,142,169,188,108,255, 58, 42, 60, 5, 79, 69,194,201,201,233,218, +137, 19, 39, 26,250,251,251,147,214, 14,239,230, 88,121,230,233, 45, 14,167, 64,203,157, 63,127,222, 52, 96,192,128, 43,169,169, +169,173, 75,226,148,201,100, 39,239,221,187,247, 65, 78, 78,206,107,130,202, 58, 82,188,121, 95,173, 86, 99,220,184,113,167, 74, + 74,193,227,224,224,176,244,231,159,127,158,208,167, 79, 31,210, 28,142,194,122, 51,167, 11, 50,111, 6,131, 1, 91,183,110,101, +150, 47, 95,190, 34, 39, 39,167,196,169, 67, 79, 79,207,248,164,164, 36, 31,115,168, 5, 91,130,138, 86,173, 90, 53, 57, 54, 54, +214,235,223,228,124,143, 5,215, 58,107,225,109,175,105,130,168,229, 38,233,207, 2,253, 72, 48,117, 73,130,224,155, 88, 60, 6, +139,147, 98, 78,254,111,183,146, 97,211,212, 25, 87, 36, 26, 47,147, 42,126,232, 51,232,115,231,170, 1,129,132,187,167, 55, 8, +144, 72, 77, 73, 68,236,139, 39,236,254, 63,126,205, 84,171,148,179, 53, 26,245,175,165,241,212, 6, 2,170,201,121,187,249, 52, +106,194, 44,128,138,228,167,122,109,196, 1,192,192, 37, 31,197,228, 26,251, 63, 44,101,218,199, 44,182,102,236,223, 47,230,215, +172,249, 90,160, 56,134, 97,160,139,142,198,178, 33, 67,236, 22, 89,149,168, 68, 37, 42, 4,254, 40, 59, 70,150, 17, 5,241,185, + 76,149,151,235, 63,193, 59,155, 84, 26,128,196,201,201,233, 12, 69, 81,126,102,139,140,181,181,190,152,132,210, 49,169,169,169, + 29, 0,148,182, 66, 56, 64, 38,147,253, 74,211,116, 99, 91,146, 74, 83, 20,117, 61, 55, 55,119, 60, 74, 73, 42,253, 54, 86, 29, + 58, 59, 59, 63,139,141,141, 13, 48,175,162,182,238, 43,139, 91, 89,254,244,233, 83,180,105,211, 38, 54, 37, 37,165,234,191,201, +249,174,162,132, 85,135,225,197,220, 99,251, 44, 90,111, 1, 94, 60,129,116, 40, 95, 36,108,207, 24, 77,181, 64, 0, 28, 46,247, +145, 94,171, 57,171,211,228,109, 65, 9,211,133,255, 38,250, 2, 45, 4,124,254, 73,158, 92, 46, 42, 78,180, 25,115,115, 53, 58, +189,254,195, 74,145, 85,137, 74, 84,162, 18,149,120,143, 80,211,201,201,233, 4,151,203, 21, 88,139,201,162,255,155, 97, 50,153, +180,233,233,233,157, 1, 60,254,151, 57,223,107,216, 19,196,252, 21,216,233,164,214,209, 86,206,194,173,205,187,206,249, 22,207, +157,173, 64,206, 54,133,156,179,222,147,114,182,121, 87, 57,205,231,107, 7,111, 71,123,234, 81, 69, 93, 79,171,114,178, 21, 93, +206,183,197, 89, 81,207, 81, 49,229,100,223,194,125,159,245,158,148,179,205,187,198, 89,180,254,216,200,107, 23,167,141,117,202, +222,114,178, 21, 93,206,183,197,249,166,207, 81, 41,229,100,223,180, 46,149,112,239,103,225, 61,196,131, 80,176, 15, 66,193,222, +111, 80,108,220,198,226, 44, 90, 96, 89, 22,118, 57, 18,190,173,149, 0,230,176,251,133,252,196,187,202,105,125, 29, 42, 50, 85, +192, 91, 72, 59,112,174,162, 57,139, 92,207,138,194,172,194, 21, 38, 17,176, 33,224,168, 61,231, 94, 17,247,189,200,185, 86, 8, +111, 57, 68,150, 93,156, 21, 85,239,223, 54,103, 69, 61, 75, 69, 57, 43,162,222, 23,119,223,223,226, 61,170,168,114, 86,200,179, +244, 54,234,124, 49,245,231,141,121,139,114, 86,196,179, 84,148,179, 34,234,253,191,193, 89, 17,207, 82,113,156, 21, 81,239, 75, +186,247,239,171,133,202, 60, 93, 88, 24,226,129,176, 65,108,173, 3, 0,178, 60, 23,237,109,224,109, 36,146,172,104, 65,244,182, +196,166, 29, 22,152,255,156,179,130,239,209,172, 66,206,138, 28,221,180,173,168,123,244, 54,234,187, 53,103, 69,241, 23,229,169, +136,251, 84, 28,231,155,150,183,132,114, 86,248,185,191,105,189,255,183, 56, 43,248, 30, 85,200,179, 84,132,179,109, 5, 15, 6, +218, 90,237,207,170, 72,206,138,122,150,138, 41,231, 27,223,167,226, 56,223,180,188, 37,148,179,194,207,189, 34,250,144,183,197, +251, 95, 90,180, 88,178,196, 58,177,174,200,246,175, 8,141,255,108, 74,206, 78,238,255, 41, 78, 59,167,103, 58,190,133,123,255, +159,150,179, 34, 57,139,150,177, 34,167,123,222,102, 57, 43,146,211,142,178,254,207,113,190,111,247,253, 93,188,158, 37,241,189, +201,180, 84, 73,214,209,183, 81,206,138,228,180,145,251,127,130,243, 13,238,253,255, 12,202, 53,117,248, 54, 97,190,240, 21, 60, + 50, 65, 5, 91, 96,222,218,121, 87,112, 57,219,190, 13, 11,225, 91, 64,133,151,179,112,164,252,195, 91, 56,247,247,229,154, 86, + 62, 75,149,207,210, 59,247, 44, 21,169,147,109, 43,208, 82, 84,161,150,231,162,156, 21,241, 27,214, 28, 21, 85, 71,223,246,185, + 87,228,179,244, 54,238,253,251,134,255, 27, 0,133,106,237, 30,181,247, 74, 74, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130, 0}; diff --git a/source/blender/editors/include/ED_anim_api.h b/source/blender/editors/include/ED_anim_api.h index 23cb697b453..230a3e8a3dd 100644 --- a/source/blender/editors/include/ED_anim_api.h +++ b/source/blender/editors/include/ED_anim_api.h @@ -192,6 +192,7 @@ typedef enum eAnimFilter_Flags { ANIMFILTER_ANIMDATA = (1<<9), /* only return the underlying AnimData blocks (not the tracks, etc.) data comes from */ ANIMFILTER_NLATRACKS = (1<<10), /* only include NLA-tracks */ ANIMFILTER_SELEDIT = (1<<11), /* link editability with selected status */ + ANIMFILTER_NODUPLIS = (1<<12), /* duplicate entries for animation data attached to multi-user blocks must not occur */ /* all filters - the power inside the bracket must be the last power for left-shifts + 1 */ ANIMFILTER_ALLFILTERS = ((1<<12) - 1) diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index 110f69d7f02..c62963c5b3b 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -220,6 +220,7 @@ typedef struct uiLayout uiLayout; #define HISTOGRAM (47<<9) #define WAVEFORM (48<<9) #define VECTORSCOPE (49<<9) +#define PROGRESSBAR (50<<9) #define BUTTYPE (63<<9) @@ -247,8 +248,9 @@ void uiDrawMenuBox(float minx, float miny, float maxx, float maxy, short flag, s void uiDrawBoxShadow(unsigned char alpha, float minx, float miny, float maxx, float maxy); /* state for scrolldrawing */ -#define UI_SCROLL_PRESSED 1 -#define UI_SCROLL_ARROWS 2 +#define UI_SCROLL_PRESSED 1 +#define UI_SCROLL_ARROWS 2 +#define UI_SCROLL_NO_OUTLINE 4 void uiWidgetScrollDraw(struct uiWidgetColors *wcol, struct rcti *rect, struct rcti *slider, int state); /* Menu Callbacks */ diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index d639b881fe6..3f0cd3bee78 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -1633,7 +1633,7 @@ int ui_set_but_string(bContext *C, uiBut *but, const char *str) bUnit_ReplaceString(str_unit_convert, sizeof(str_unit_convert), but->drawstr, ui_get_but_scale_unit(but, 1.0), scene->unit.system, unit_type); } - if(BPY_button_eval(C, str_unit_convert, &value)) { + if(BPY_eval_button(C, str_unit_convert, &value)) { value = ui_get_but_val(but); /* use its original value */ if(str[0]) @@ -2376,7 +2376,7 @@ static uiBut *ui_def_but(uiBlock *block, int type, int retval, char *str, short } } - if((block->flag & UI_BLOCK_LOOP) || ELEM7(but->type, MENU, TEX, LABEL, IDPOIN, BLOCK, BUTM, SEARCH_MENU)) + if((block->flag & UI_BLOCK_LOOP) || ELEM8(but->type, MENU, TEX, LABEL, IDPOIN, BLOCK, BUTM, SEARCH_MENU, PROGRESSBAR)) but->flag |= (UI_TEXT_LEFT|UI_ICON_LEFT); else if(but->type==BUT_TOGDUAL) but->flag |= UI_ICON_LEFT; diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index 2c9d5a8e131..4e3ffad48ae 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -184,11 +184,16 @@ static void button_timers_tooltip_remove(bContext *C, uiBut *but); /* ******************** menu navigation helpers ************** */ +static int ui_but_editable(uiBut *but) +{ + return ELEM5(but->type, LABEL, SEPR, ROUNDBOX, LISTBOX, PROGRESSBAR); +} + static uiBut *ui_but_prev(uiBut *but) { while(but->prev) { but= but->prev; - if(!ELEM4(but->type, LABEL, SEPR, ROUNDBOX, LISTBOX)) return but; + if(!ui_but_editable(but)) return but; } return NULL; } @@ -197,7 +202,7 @@ static uiBut *ui_but_next(uiBut *but) { while(but->next) { but= but->next; - if(!ELEM4(but->type, LABEL, SEPR, ROUNDBOX, LISTBOX)) return but; + if(!ui_but_editable(but)) return but; } return NULL; } @@ -208,7 +213,7 @@ static uiBut *ui_but_first(uiBlock *block) but= block->buttons.first; while(but) { - if(!ELEM4(but->type, LABEL, SEPR, ROUNDBOX, LISTBOX)) return but; + if(!ui_but_editable(but)) return but; but= but->next; } return NULL; @@ -220,7 +225,7 @@ static uiBut *ui_but_last(uiBlock *block) but= block->buttons.last; while(but) { - if(!ELEM4(but->type, LABEL, SEPR, ROUNDBOX, LISTBOX)) return but; + if(!ui_but_editable(but)) return but; but= but->prev; } return NULL; @@ -1654,7 +1659,7 @@ static void ui_do_but_textedit(bContext *C, uiBlock *block, uiBut *but, uiHandle my= event->y; ui_window_to_block(data->region, block, &mx, &my); - if ((but->y1 <= my) && (my <= but->y2) && (but->x1 <= mx) && (mx <= but->x2)) { + if (ui_mouse_inside_button(data->region, but, mx, my)) { ui_textedit_set_cursor_pos(but, data, mx); but->selsta = but->selend = but->pos; data->selstartx= mx; @@ -1994,14 +1999,17 @@ static int ui_do_but_HOTKEYEVT(bContext *C, uiBut *but, uiHandleButtonData *data if(event->type == MOUSEMOVE) return WM_UI_HANDLER_CONTINUE; - if(event->type == ESCKEY) { - /* data->cancel doesnt work, this button opens immediate */ - if(but->flag & UI_BUT_IMMEDIATE) - ui_set_but_val(but, 0); - else - data->cancel= 1; - button_activate_state(C, but, BUTTON_STATE_EXIT); - return WM_UI_HANDLER_BREAK; + if(event->type == LEFTMOUSE && event->val==KM_PRESS) { + /* only cancel if click outside the button */ + if(ui_mouse_inside_button(but->active->region, but, event->x, event->y) == 0) { + /* data->cancel doesnt work, this button opens immediate */ + if(but->flag & UI_BUT_IMMEDIATE) + ui_set_but_val(but, 0); + else + data->cancel= 1; + button_activate_state(C, but, BUTTON_STATE_EXIT); + return WM_UI_HANDLER_BREAK; + } } /* always set */ @@ -2035,15 +2043,11 @@ static int ui_do_but_HOTKEYEVT(bContext *C, uiBut *but, uiHandleButtonData *data return WM_UI_HANDLER_CONTINUE; } - static int ui_do_but_KEYEVT(bContext *C, uiBut *but, uiHandleButtonData *data, wmEvent *event) { if(data->state == BUTTON_STATE_HIGHLIGHT) { if(ELEM3(event->type, LEFTMOUSE, PADENTER, RETKEY) && event->val==KM_PRESS) { - short event= (short)ui_get_but_val(but); - /* hardcoded prevention from editing or assigning ESC */ - if(event!=ESCKEY) - button_activate_state(C, but, BUTTON_STATE_WAIT_KEY_EVENT); + button_activate_state(C, but, BUTTON_STATE_WAIT_KEY_EVENT); return WM_UI_HANDLER_BREAK; } } @@ -2052,7 +2056,7 @@ static int ui_do_but_KEYEVT(bContext *C, uiBut *but, uiHandleButtonData *data, w return WM_UI_HANDLER_CONTINUE; if(event->val==KM_PRESS) { - if(event->type!=ESCKEY && WM_key_event_string(event->type)[0]) + if(WM_key_event_string(event->type)[0]) ui_set_but_val(but, event->type); else data->cancel= 1; @@ -4313,6 +4317,7 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, wmEvent *event) case ROW: case LISTROW: case BUT_IMAGE: + case PROGRESSBAR: retval= ui_do_but_EXIT(C, but, data, event); break; case HISTOGRAM: diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h index 77f18115c73..ecefcf93c28 100644 --- a/source/blender/editors/interface/interface_intern.h +++ b/source/blender/editors/interface/interface_intern.h @@ -87,7 +87,8 @@ typedef enum { UI_WTYPE_NORMAL, UI_WTYPE_BOX, UI_WTYPE_SCROLL, - UI_WTYPE_LISTITEM + UI_WTYPE_LISTITEM, + UI_WTYPE_PROGRESSBAR, } uiWidgetTypeEnum; diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c index 102b7e342b3..30f2ee7b923 100644 --- a/source/blender/editors/interface/interface_regions.c +++ b/source/blender/editors/interface/interface_regions.c @@ -1770,6 +1770,7 @@ static void uiBlockPicker(uiBlock *block, float *rgb, PointerRNA *ptr, PropertyR static float hsv[3]; static char hexcol[128]; float rgb_gamma[3]; + float min, max, step, precision; const char *propname = RNA_property_identifier(prop); width= PICKER_TOTAL_W; @@ -1785,6 +1786,7 @@ static void uiBlockPicker(uiBlock *block, float *rgb, PointerRNA *ptr, PropertyR linearrgb_to_srgb_v3_v3(rgb_gamma, rgb); } + RNA_property_float_ui_range(ptr, prop, &min, &max, &step, &precision); RNA_property_float_get_array(ptr, prop, rgb); rgb_to_hsv(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2); @@ -1833,7 +1835,7 @@ static void uiBlockPicker(uiBlock *block, float *rgb, PointerRNA *ptr, PropertyR uiButSetFunc(bt, do_hsv_rna_cb, bt, hsv); bt= uiDefButF(block, NUMSLI, 0, "S ", 0, -80, butwidth, UI_UNIT_Y, hsv+1, 0.0, 1.0, 10, 3, ""); uiButSetFunc(bt, do_hsv_rna_cb, bt, hsv); - bt= uiDefButF(block, NUMSLI, 0, "V ", 0, -100, butwidth, UI_UNIT_Y, hsv+2, 0.0, 1.0, 10, 3, ""); + bt= uiDefButF(block, NUMSLI, 0, "V ", 0, -100, butwidth, UI_UNIT_Y, hsv+2, 0.0, max, 10, 3, ""); uiButSetFunc(bt, do_hsv_rna_cb, bt, hsv); uiBlockEndAlign(block); diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c index 8cf6c2915c2..4183ff49e51 100644 --- a/source/blender/editors/interface/interface_templates.c +++ b/source/blender/editors/interface/interface_templates.c @@ -2423,24 +2423,40 @@ void uiTemplateRunningJobs(uiLayout *layout, bContext *C) wmWindowManager *wm= CTX_wm_manager(C); ScrArea *sa= CTX_wm_area(C); uiBlock *block; - + void *owner; + int handle_event; + block= uiLayoutGetBlock(layout); uiBlockSetCurLayout(block, layout); uiBlockSetHandleFunc(block, do_running_jobs, NULL); if(sa->spacetype==SPACE_NODE) { - if(WM_jobs_test(wm, sa)) - uiDefIconTextBut(block, BUT, B_STOPCAST, ICON_CANCEL, "Composite", 0,0,85,UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, "Stop composite"); + owner = sa; + handle_event= B_STOPCOMPO; + } else { + owner = scene; + handle_event= B_STOPRENDER; } - else { - if(WM_jobs_test(wm, scene)) - uiDefIconTextBut(block, BUT, B_STOPRENDER, ICON_CANCEL, "Render", 0,0,75,UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, "Stop rendering"); - if(WM_jobs_test(wm, screen)) - uiDefIconTextBut(block, BUT, B_STOPCAST, ICON_CANCEL, "Capture", 0,0,85,UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, "Stop screencast"); - if(screen->animtimer) - uiDefIconTextBut(block, BUT, B_STOPANIM, ICON_CANCEL, "Anim Player", 0,0,100,UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, "Stop animation playback"); + + if(WM_jobs_test(wm, owner)) { + uiLayout *abs; + + abs = uiLayoutAbsolute(layout, 0); + + uiDefIconBut(block, BUT, handle_event, ICON_PANEL_CLOSE, + 0, UI_UNIT_Y*0.1, UI_UNIT_X*0.8, UI_UNIT_Y*0.8, NULL, 0.0f, 0.0f, 0, 0, "Stop this job"); + uiDefBut(block, PROGRESSBAR, 0, WM_jobs_name(wm, owner), + UI_UNIT_X, 0, 100, UI_UNIT_Y, NULL, 0.0f, 0.0f, WM_jobs_progress(wm, owner), 0, "Progress"); + + uiLayoutRow(layout, 0); } + if(WM_jobs_test(wm, screen)) + uiDefIconTextBut(block, BUT, B_STOPCAST, ICON_CANCEL, "Capture", 0,0,85,UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, "Stop screencast"); + if(screen->animtimer) + uiDefIconTextBut(block, BUT, B_STOPANIM, ICON_CANCEL, "Anim Player", 0,0,100,UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, "Stop animation playback"); + + uiItemS(layout); } /************************* Reports for Last Operator Template **************************/ diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c index 558cdb798c2..c419c73c1e0 100644 --- a/source/blender/editors/interface/interface_widgets.c +++ b/source/blender/editors/interface/interface_widgets.c @@ -1276,6 +1276,19 @@ static struct uiWidgetColors wcol_scroll= { 5, -5 }; +static struct uiWidgetColors wcol_progress= { + {0, 0, 0, 255}, + {190, 190, 190, 255}, + {100, 100, 100, 180}, + {68, 68, 68, 255}, + + {0, 0, 0, 255}, + {255, 255, 255, 255}, + + 0, + 0, 0 +}; + static struct uiWidgetColors wcol_list_item= { {0, 0, 0, 255}, {0, 0, 0, 0}, @@ -1322,6 +1335,7 @@ void ui_widget_color_init(ThemeUI *tui) tui->wcol_box= wcol_box; tui->wcol_scroll= wcol_scroll; tui->wcol_list_item= wcol_list_item; + tui->wcol_progress= wcol_progress; tui->wcol_state= wcol_state; } @@ -1954,6 +1968,7 @@ void uiWidgetScrollDraw(uiWidgetColors *wcol, rcti *rect, rcti *slider, int stat uiWidgetBase wtb; float rad; int horizontal; + short outline=0; widget_init(&wtb); @@ -1995,6 +2010,10 @@ void uiWidgetScrollDraw(uiWidgetColors *wcol, rcti *rect, rcti *slider, int stat /* draw */ wtb.emboss= 0; /* only emboss once */ + /* exception for progress bar */ + if (state & UI_SCROLL_NO_OUTLINE) + SWAP(short, outline, wtb.outline); + round_box_edges(&wtb, 15, slider, rad); if(state & UI_SCROLL_ARROWS) { @@ -2013,6 +2032,9 @@ void uiWidgetScrollDraw(uiWidgetColors *wcol, rcti *rect, rcti *slider, int stat } } widgetbase_draw(&wtb, wcol); + + if (state & UI_SCROLL_NO_OUTLINE) + SWAP(short, outline, wtb.outline); } } @@ -2077,9 +2099,35 @@ static void widget_scroll(uiBut *but, uiWidgetColors *wcol, rcti *rect, int stat uiWidgetScrollDraw(wcol, rect, &rect1, state); } +static void widget_progressbar(uiBut *but, uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign) +{ + rcti rect_prog = *rect, rect_bar = *rect; + float value = but->a1; + float w, min; + + /* make the progress bar a proportion of the original height */ + /* hardcoded 4px high for now */ + rect_prog.ymax = rect_prog.ymin + 4; + rect_bar.ymax = rect_bar.ymin + 4; + + w = value * (rect_prog.xmax - rect_prog.xmin); + + /* ensure minimium size */ + min= rect_prog.ymax - rect_prog.ymin; + w = MAX2(w, min); + + rect_bar.xmax = rect_bar.xmin + w; + + uiWidgetScrollDraw(wcol, &rect_prog, &rect_bar, UI_SCROLL_NO_OUTLINE); + + /* raise text a bit */ + rect->ymin += 6; + rect->xmin -= 6; +} + static void widget_link(uiBut *but, uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign) { - + if(but->flag & UI_SELECT) { rcti rectlink; @@ -2094,7 +2142,6 @@ static void widget_link(uiBut *but, uiWidgetColors *wcol, rcti *rect, int state, } } - static void widget_numslider(uiBut *but, uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign) { uiWidgetBase wtb, wtb1; @@ -2541,6 +2588,11 @@ static uiWidgetType *widget_type(uiWidgetTypeEnum type) wt.wcol_theme= &btheme->tui.wcol_list_item; wt.draw= widget_list_itembut; break; + + case UI_WTYPE_PROGRESSBAR: + wt.wcol_theme= &btheme->tui.wcol_progress; + wt.custom= widget_progressbar; + break; } return &wt; @@ -2756,6 +2808,11 @@ void ui_draw_but(const bContext *C, ARegion *ar, uiStyle *style, uiBut *but, rct case BUT_CURVE: ui_draw_but_CURVE(ar, but, &tui->wcol_regular, rect); break; + + case PROGRESSBAR: + wt= widget_type(UI_WTYPE_PROGRESSBAR); + fstyle= &style->widgetlabel; + break; case SCROLL: wt= widget_type(UI_WTYPE_SCROLL); diff --git a/source/blender/editors/interface/resources.c b/source/blender/editors/interface/resources.c index 82b195fb94a..cf47feb312b 100644 --- a/source/blender/editors/interface/resources.c +++ b/source/blender/editors/interface/resources.c @@ -1463,6 +1463,28 @@ void init_userdef_do_versions(void) SETCOL(btheme->tv3d.lastsel_point, 0xff, 0xff, 0xff, 255); } } + if (G.main->versionfile <= 252 || (G.main->versionfile == 252 && G.main->subversionfile < 5)) { + bTheme *btheme; + + /* interface_widgets.c */ + struct uiWidgetColors wcol_progress= { + {0, 0, 0, 255}, + {190, 190, 190, 255}, + {100, 100, 100, 180}, + {68, 68, 68, 255}, + + {0, 0, 0, 255}, + {255, 255, 255, 255}, + + 0, + 5, -5 + }; + + for(btheme= U.themes.first; btheme; btheme= btheme->next) { + /* init progress bar theme */ + btheme->tui.wcol_progress= wcol_progress; + } + } /* GL Texture Garbage Collection (variable abused above!) */ if (U.textimeout == 0) { diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c index 5410ebf6906..9b0a5c9ff33 100644 --- a/source/blender/editors/object/object_add.c +++ b/source/blender/editors/object/object_add.c @@ -467,97 +467,6 @@ void OBJECT_OT_camera_add(wmOperatorType *ot) /* ***************** add primitives *************** */ -static EnumPropertyItem prop_curve_types[] = { - {CU_BEZIER|CU_PRIM_CURVE, "BEZIER_CURVE", ICON_CURVE_BEZCURVE, "Bezier Curve", ""}, - {CU_BEZIER|CU_PRIM_CIRCLE, "BEZIER_CIRCLE", ICON_CURVE_BEZCIRCLE, "Bezier Circle", ""}, - {CU_NURBS|CU_PRIM_CURVE, "NURBS_CURVE", ICON_CURVE_NCURVE, "NURBS Curve", ""}, - {CU_NURBS|CU_PRIM_CIRCLE, "NURBS_CIRCLE", ICON_CURVE_NCIRCLE, "NURBS Circle", ""}, - {CU_NURBS|CU_PRIM_PATH, "PATH", ICON_CURVE_PATH, "Path", ""}, - {0, NULL, 0, NULL, NULL} -}; - -static int object_add_curve_exec(bContext *C, wmOperator *op) -{ - Object *obedit= CTX_data_edit_object(C); - ListBase *editnurb; - Nurb *nu; - int newob= 0, type= RNA_enum_get(op->ptr, "type"); - int enter_editmode; - unsigned int layer; - float loc[3], rot[3]; - float mat[4][4]; - - object_add_generic_invoke_options(C, op); // XXX these props don't get set right when only exec() is called - ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer); - - if(obedit==NULL || obedit->type!=OB_CURVE) { - Curve *cu; - obedit= ED_object_add_type(C, OB_CURVE, loc, rot, TRUE, layer); - newob = 1; - - cu= (Curve*)obedit->data; - cu->flag |= CU_DEFORM_FILL; - if(type & CU_PRIM_PATH) - cu->flag |= CU_PATH|CU_3D; - } - else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA); - - ED_object_new_primitive_matrix(C, loc, rot, mat); - - nu= add_nurbs_primitive(C, mat, type, newob); - editnurb= curve_get_editcurve(obedit); - BLI_addtail(editnurb, nu); - - /* userdef */ - if (newob && !enter_editmode) { - ED_object_exit_editmode(C, EM_FREEDATA); - } - - WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, obedit); - - return OPERATOR_FINISHED; -} - -static int object_add_curve_invoke(bContext *C, wmOperator *op, wmEvent *event) -{ - Object *obedit= CTX_data_edit_object(C); - uiPopupMenu *pup; - uiLayout *layout; - - object_add_generic_invoke_options(C, op); - - pup= uiPupMenuBegin(C, op->type->name, 0); - layout= uiPupMenuLayout(pup); - if(!obedit || obedit->type == OB_CURVE) - uiItemsEnumO(layout, op->type->idname, "type"); - else - uiItemsEnumO(layout, "OBJECT_OT_surface_add", "type"); - uiPupMenuEnd(C, pup); - - return OPERATOR_CANCELLED; -} - -void OBJECT_OT_curve_add(wmOperatorType *ot) -{ - /* identifiers */ - ot->name= "Add Curve"; - ot->description = "Add a curve object to the scene"; - ot->idname= "OBJECT_OT_curve_add"; - - /* api callbacks */ - ot->invoke= object_add_curve_invoke; - ot->exec= object_add_curve_exec; - - ot->poll= ED_operator_scene_editable; - - /* flags */ - ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; - - RNA_def_enum(ot->srna, "type", prop_curve_types, 0, "Primitive", ""); - - ED_object_add_generic_props(ot, TRUE); -} - static EnumPropertyItem prop_surface_types[]= { {CU_PRIM_CURVE|CU_NURBS, "NURBS_CURVE", ICON_SURFACE_NCURVE, "NURBS Curve", ""}, {CU_PRIM_CIRCLE|CU_NURBS, "NURBS_CIRCLE", ICON_SURFACE_NCIRCLE, "NURBS Circle", ""}, diff --git a/source/blender/editors/object/object_bake.c b/source/blender/editors/object/object_bake.c index 9a9461da62e..9f9d41147b6 100644 --- a/source/blender/editors/object/object_bake.c +++ b/source/blender/editors/object/object_bake.c @@ -102,7 +102,8 @@ typedef struct BakeRender { short *stop; short *do_update; - + float *progress; + ListBase threads; /* backup */ @@ -185,19 +186,20 @@ static void *do_bake_render(void *bake_v) { BakeRender *bkr= bake_v; - bkr->tot= RE_bake_shade_all_selected(bkr->re, bkr->scene->r.bake_mode, bkr->actob, NULL); + bkr->tot= RE_bake_shade_all_selected(bkr->re, bkr->scene->r.bake_mode, bkr->actob, NULL, bkr->progress); bkr->ready= 1; return NULL; } -static void bake_startjob(void *bkv, short *stop, short *do_update) +static void bake_startjob(void *bkv, short *stop, short *do_update, float *progress) { BakeRender *bkr= bkv; Scene *scene= bkr->scene; bkr->stop= stop; bkr->do_update= do_update; + bkr->progress= progress; RE_test_break_cb(bkr->re, NULL, thread_break); G.afbreek= 0; /* blender_test_break uses this global */ @@ -205,7 +207,7 @@ static void bake_startjob(void *bkv, short *stop, short *do_update) RE_Database_Baking(bkr->re, scene, scene->lay, scene->r.bake_mode, bkr->actob); /* baking itself is threaded, cannot use test_break in threads. we also update optional imagewindow */ - bkr->tot= RE_bake_shade_all_selected(bkr->re, scene->r.bake_mode, bkr->actob, bkr->do_update); + bkr->tot= RE_bake_shade_all_selected(bkr->re, scene->r.bake_mode, bkr->actob, bkr->do_update, bkr->progress); } static void bake_update(void *bkv) @@ -260,7 +262,7 @@ static int objects_bake_render_invoke(bContext *C, wmOperator *op, wmEvent *_eve bkr->reports= op->reports; /* setup job */ - steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), scene, WM_JOB_EXCL_RENDER|WM_JOB_PRIORITY); + steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), scene, "Texture Bake", WM_JOB_EXCL_RENDER|WM_JOB_PRIORITY|WM_JOB_PROGRESS); WM_jobs_customdata(steve, bkr, bake_freejob); WM_jobs_timer(steve, 0.2, NC_IMAGE, 0); /* TODO - only draw bake image, can we enforce this */ WM_jobs_callbacks(steve, bake_startjob, NULL, bake_update, NULL); diff --git a/source/blender/editors/object/object_constraint.c b/source/blender/editors/object/object_constraint.c index 9163baf606f..034de3fb703 100644 --- a/source/blender/editors/object/object_constraint.c +++ b/source/blender/editors/object/object_constraint.c @@ -133,6 +133,7 @@ bConstraint *get_active_constraint (Object *ob) { return constraints_get_active(get_active_constraints(ob)); } + /* -------------- Constraint Management (Add New, Remove, Rename) -------------------- */ /* ------------- PyConstraints ------------------ */ @@ -322,6 +323,23 @@ static void test_constraints (Object *owner, bPoseChannel *pchan) /* targets have already been checked for this */ continue; } + else if (curcon->type == CONSTRAINT_TYPE_PIVOT) { + bPivotConstraint *data = curcon->data; + + /* target doesn't have to exist, but if it is non-null, it must exist! */ + if (data->tar && exist_object(data->tar)==0) { + data->tar = NULL; + curcon->flag |= CONSTRAINT_DISABLE; + } + else if (data->tar == owner) { + if (!get_named_bone(get_armature(owner), data->subtarget)) { + curcon->flag |= CONSTRAINT_DISABLE; + } + } + + /* targets have already been checked for this */ + continue; + } else if (curcon->type == CONSTRAINT_TYPE_ACTION) { bActionConstraint *data = curcon->data; @@ -418,15 +436,16 @@ static void test_constraints (Object *owner, bPoseChannel *pchan) void object_test_constraints (Object *owner) { - if(owner->constraints.first) + if (owner->constraints.first) test_constraints(owner, NULL); - + if (owner->type==OB_ARMATURE && owner->pose) { bPoseChannel *pchan; - - for (pchan= owner->pose->chanbase.first; pchan; pchan= pchan->next) - if(pchan->constraints.first) + + for (pchan= owner->pose->chanbase.first; pchan; pchan= pchan->next) { + if (pchan->constraints.first) test_constraints(owner, pchan); + } } } @@ -437,9 +456,9 @@ void object_test_constraints (Object *owner) #define EDIT_CONSTRAINT_OWNER_BONE 1 static EnumPropertyItem constraint_owner_items[] = { -{EDIT_CONSTRAINT_OWNER_OBJECT, "OBJECT", 0, "Object", "Edit a constraint on the active object"}, -{EDIT_CONSTRAINT_OWNER_BONE, "BONE", 0, "Bone", "Edit a constraint on the active bone"}, -{0, NULL, 0, NULL, NULL}}; + {EDIT_CONSTRAINT_OWNER_OBJECT, "OBJECT", 0, "Object", "Edit a constraint on the active object"}, + {EDIT_CONSTRAINT_OWNER_BONE, "BONE", 0, "Bone", "Edit a constraint on the active bone"}, + {0, NULL, 0, NULL, NULL}}; static int edit_constraint_poll_generic(bContext *C, StructRNA *rna_type) @@ -502,7 +521,8 @@ static bConstraint *edit_constraint_property_get(bContext *C, wmOperator *op, Ob if (owner == EDIT_CONSTRAINT_OWNER_OBJECT) { list = &ob->constraints; - } else if (owner == EDIT_CONSTRAINT_OWNER_BONE) { + } + else if (owner == EDIT_CONSTRAINT_OWNER_BONE) { bPoseChannel *pchan= get_active_posechannel(ob); if (pchan) list = &pchan->constraints; @@ -512,7 +532,7 @@ static bConstraint *edit_constraint_property_get(bContext *C, wmOperator *op, Ob con = constraints_findByName(list, constraint_name); - if (con && type != 0 && con->type != type) + if (con && (type != 0) && (con->type != type)) con = NULL; return con; @@ -947,19 +967,21 @@ void POSE_OT_constraints_clear(wmOperatorType *ot) static int object_constraints_clear_exec(bContext *C, wmOperator *op) { - Object *ob= ED_object_active_context(C); Scene *scene= CTX_data_scene(C); /* do freeing */ - // TODO: we should free constraints for all selected objects instead (to be more consistent with bones) - free_constraints(&ob->constraints); + CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) + { + free_constraints(&ob->constraints); + DAG_id_flush_update(&ob->id, OB_RECALC_OB); + } + CTX_DATA_END; /* force depsgraph to get recalculated since relationships removed */ DAG_scene_sort(scene); /* sort order of objects */ /* do updates */ - DAG_id_flush_update(&ob->id, OB_RECALC_OB); - WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT, ob); + WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT, NULL); return OPERATOR_FINISHED; } @@ -976,6 +998,84 @@ void OBJECT_OT_constraints_clear(wmOperatorType *ot) ot->poll= ED_operator_object_active_editable; } +/************************ copy all constraints operators *********************/ + +static int pose_constraint_copy_exec(bContext *C, wmOperator *op) +{ + bPoseChannel *pchan = CTX_data_active_pose_bone(C); + Scene *scene = CTX_data_scene(C); + + /* don't do anything if bone doesn't exist or doesn't have any constraints */ + if (ELEM(NULL, pchan, pchan->constraints.first)) { + BKE_report(op->reports, RPT_ERROR, "No active bone with constraints for copying"); + return OPERATOR_CANCELLED; + } + + /* copy all constraints from active posebone to all selected posebones */ + CTX_DATA_BEGIN(C, bPoseChannel*, chan, selected_pose_bones) + { + /* if we're not handling the object we're copying from, copy all constraints over */ + if (pchan != chan) + copy_constraints(&chan->constraints, &pchan->constraints, TRUE); + } + CTX_DATA_END; + + /* force depsgraph to get recalculated since new relationships added */ + DAG_scene_sort(scene); /* sort order of objects/bones */ + + return OPERATOR_FINISHED; +} + +void POSE_OT_constraints_copy(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Copy Constraints to Selected"; + ot->idname= "POSE_OT_constraints_copy"; + ot->description = "Copy constraints to other selected bones."; + + /* api callbacks */ + ot->exec= pose_constraint_copy_exec; + ot->poll= ED_operator_posemode; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +static int object_constraint_copy_exec(bContext *C, wmOperator *op) +{ + Object *obact = ED_object_active_context(C); + Scene *scene = CTX_data_scene(C); + + /* copy all constraints from active object to all selected objects */ + CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) + { + /* if we're not handling the object we're copying from, copy all constraints over */ + if (obact != ob) + copy_constraints(&ob->constraints, &obact->constraints, TRUE); + } + CTX_DATA_END; + + /* force depsgraph to get recalculated since new relationships added */ + DAG_scene_sort(scene); /* sort order of objects */ + + return OPERATOR_FINISHED; +} + +void OBJECT_OT_constraints_copy(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Copy Constraints to Selected"; + ot->idname= "OBJECT_OT_constraints_copy"; + ot->description = "Copy constraints to other selected objects."; + + /* api callbacks */ + ot->exec= object_constraint_copy_exec; + ot->poll= ED_operator_object_active_editable; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + /************************ add constraint operators *********************/ /* get the Object and/or PoseChannel to use as target */ @@ -1146,7 +1246,7 @@ static int constraint_add_exec(bContext *C, wmOperator *op, Object *ob, ListBase } /* create a new constraint of the type requried, and add it to the active/given constraints list */ - if(pchan) + if (pchan) con = add_pose_constraint(ob, pchan, NULL, type); else con = add_ob_constraint(ob, NULL, type); @@ -1254,28 +1354,6 @@ static int object_constraint_add_exec(bContext *C, wmOperator *op) return constraint_add_exec(C, op, ob, &ob->constraints, type, with_targets); } -/* dummy operator callback */ -static int object_constraint_copy_exec(bContext *C, wmOperator *op) -{ - Object *ob=ED_object_active_context(C); - - CTX_DATA_BEGIN(C, Object*, ob_iter, selected_editable_objects) { - if(ob != ob_iter) { - if (ob->data != ob_iter->data){ - copy_constraints(&ob_iter->constraints, &ob->constraints, TRUE); - } - - if(ob_iter->totcol==ob->totcol) { - ob_iter->actcol= ob->actcol; - WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob_iter); - } - } - } - CTX_DATA_END; - - return OPERATOR_FINISHED; -} - /* dummy operator callback */ static int pose_constraint_add_exec(bContext *C, wmOperator *op) { @@ -1337,21 +1415,6 @@ void OBJECT_OT_constraint_add_with_targets(wmOperatorType *ot) ot->prop= RNA_def_enum(ot->srna, "type", constraint_type_items, 0, "Type", ""); } -void OBJECT_OT_constraint_copy(wmOperatorType *ot) -{ - /* identifiers */ - ot->name= "Copy Constraints to Selected"; - ot->description = "Copy constraints to other selected objects."; - ot->idname= "OBJECT_OT_constraint_copy"; - - /* api callbacks */ - ot->exec= object_constraint_copy_exec; - ot->poll= ED_operator_object_active_editable; - - /* flags */ - ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; -} - void POSE_OT_constraint_add(wmOperatorType *ot) { /* identifiers */ diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c index 4685c12fedd..28b9fa241ca 100644 --- a/source/blender/editors/object/object_edit.c +++ b/source/blender/editors/object/object_edit.c @@ -30,6 +30,7 @@ #include #include #include +#include //for offsetof #include "MEM_guardedalloc.h" @@ -104,6 +105,7 @@ /* for menu/popup icons etc etc*/ +#include "UI_interface.h" #include "WM_api.h" #include "WM_types.h" @@ -1098,6 +1100,7 @@ void flip_subdivison(Scene *scene, View3D *v3d, int level) static void copymenu_properties(Scene *scene, View3D *v3d, Object *ob) { +//XXX no longer used - to be removed - replaced by game_properties_copy_exec bProperty *prop; Base *base; int nr, tot=0; @@ -1156,6 +1159,7 @@ static void copymenu_properties(Scene *scene, View3D *v3d, Object *ob) static void copymenu_logicbricks(Scene *scene, View3D *v3d, Object *ob) { +//XXX no longer used - to be removed - replaced by logicbricks_copy_exec Base *base; for(base= FIRSTBASE; base; base= base->next) { @@ -2169,13 +2173,11 @@ static int game_property_remove(bContext *C, wmOperator *op) { Object *ob= CTX_data_active_object(C); bProperty *prop; - int index; + int index= RNA_int_get(op->ptr, "index"); if(!ob) return OPERATOR_CANCELLED; - index = RNA_int_get(op->ptr, "index"); - prop= BLI_findlink(&ob->prop, index); if(prop) { @@ -2203,3 +2205,159 @@ void OBJECT_OT_game_property_remove(wmOperatorType *ot) RNA_def_int(ot->srna, "index", 0, 0, INT_MAX, "Index", "Property index to remove ", 0, INT_MAX); } + +#define COPY_PROPERTIES_REPLACE 1 +#define COPY_PROPERTIES_MERGE 2 +#define COPY_PROPERTIES_CLEAR 3 +#define COPY_PROPERTIES_COPY 4 + +static EnumPropertyItem game_properties_copy_operations[] ={ + {COPY_PROPERTIES_REPLACE, "REPLACE", 0, "Replace Properties", ""}, + {COPY_PROPERTIES_MERGE, "MERGE", 0, "Merge Properties", ""}, + {COPY_PROPERTIES_CLEAR, "CLEAR", 0, "Clear All", ""}, + {COPY_PROPERTIES_COPY, "COPY", 0, "Copy a Property", ""}, + {0, NULL, 0, NULL, NULL}}; + +static EnumPropertyItem gameprops_items[]= { + {0, NULL, 0, NULL, NULL}}; + +static EnumPropertyItem *gameprops_itemf(bContext *C, PointerRNA *ptr, int *free) +{ + Object *ob= ED_object_active_context(C); + EnumPropertyItem tmp = {0, "", 0, "", ""}; + EnumPropertyItem *item= NULL; + bProperty *prop; + int a, totitem= 0; + + if(!ob) + return gameprops_items; + + for(a=1, prop= ob->prop.first; prop; prop=prop->next, a++) { + tmp.value= a; + tmp.identifier= prop->name; + tmp.name= prop->name; + RNA_enum_item_add(&item, &totitem, &tmp); + } + + RNA_enum_item_end(&item, &totitem); + *free= 1; + + return item; +} + +static int game_property_copy_exec(bContext *C, wmOperator *op) +{ + Object *ob=ED_object_active_context(C); + bProperty *prop; + int type = RNA_enum_get(op->ptr, "operation"); + int propid= RNA_enum_get(op->ptr, "property"); + + if(propid > 0) { /* copy */ + prop = BLI_findlink(&ob->prop, propid-1); + + if(prop) { + CTX_DATA_BEGIN(C, Object*, ob_iter, selected_editable_objects) { + if (ob != ob_iter) { + if (ob->data != ob_iter->data) + set_ob_property(ob_iter, prop); + } + } CTX_DATA_END; + } + } + else if (ELEM3(type, COPY_PROPERTIES_REPLACE, COPY_PROPERTIES_MERGE, COPY_PROPERTIES_CLEAR)) { + CTX_DATA_BEGIN(C, Object*, ob_iter, selected_editable_objects) { + if (ob != ob_iter) { + if (ob->data != ob_iter->data){ + if (type == 2) {/* merge */ + for(prop = ob->prop.first; prop; prop= prop->next ) { + set_ob_property(ob_iter, prop); + } + } else /* replace or clear */ + copy_properties( &ob_iter->prop, &ob->prop ); + } + } + } + CTX_DATA_END; + } + + return OPERATOR_FINISHED; +} + +void OBJECT_OT_game_property_copy(wmOperatorType *ot) +{ + PropertyRNA *prop; + /* identifiers */ + ot->name= "Copy Game Property"; + ot->idname= "OBJECT_OT_game_property_copy"; + + /* api callbacks */ + ot->exec= game_property_copy_exec; + ot->poll= ED_operator_object_active_editable; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + RNA_def_enum(ot->srna, "operation", game_properties_copy_operations, 4, "Operation", ""); + prop=RNA_def_enum(ot->srna, "property", gameprops_items, 0, "Property", "Properties to copy"); + RNA_def_enum_funcs(prop, gameprops_itemf); + ot->prop=prop; +} + +/************************ Copy Logic Bricks ***********************/ + +static int logicbricks_copy_exec(bContext *C, wmOperator *op) +{ + Object *ob=ED_object_active_context(C); + + CTX_DATA_BEGIN(C, Object*, ob_iter, selected_editable_objects) { + if(ob != ob_iter) { + if (ob->data != ob_iter->data){ + /* first: free all logic */ + free_sensors(&ob_iter->sensors); + unlink_controllers(&ob_iter->controllers); + free_controllers(&ob_iter->controllers); + unlink_actuators(&ob_iter->actuators); + free_actuators(&ob_iter->actuators); + + /* now copy it, this also works without logicbricks! */ + clear_sca_new_poins_ob(ob); + copy_sensors(&ob_iter->sensors, &ob->sensors); + copy_controllers(&ob_iter->controllers, &ob->controllers); + copy_actuators(&ob_iter->actuators, &ob->actuators); + set_sca_new_poins_ob(ob_iter); + + /* some menu settings */ + ob_iter->scavisflag= ob->scavisflag; + ob_iter->scaflag= ob->scaflag; + + /* set the initial state */ + ob_iter->state= ob->state; + ob_iter->init_state= ob->init_state; + } + if(ob_iter->totcol==ob->totcol) { + ob_iter->actcol= ob->actcol; + WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob_iter); + } + } + } + CTX_DATA_END; + + WM_event_add_notifier(C, NC_LOGIC, NULL); + + return OPERATOR_FINISHED; +} + +void OBJECT_OT_logic_bricks_copy(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Copy Logic Bricks to Selected"; + ot->description = "Copy logic bricks to other selected objects."; + ot->idname= "OBJECT_OT_logic_bricks_copy"; + + /* api callbacks */ + ot->exec= logicbricks_copy_exec; + ot->poll= ED_operator_object_active_editable; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h index 7e1f2cbbfdc..5b446b3a828 100644 --- a/source/blender/editors/object/object_intern.h +++ b/source/blender/editors/object/object_intern.h @@ -85,6 +85,11 @@ void OBJECT_OT_shade_flat(struct wmOperatorType *ot); void OBJECT_OT_paths_calculate(struct wmOperatorType *ot); void OBJECT_OT_paths_clear(struct wmOperatorType *ot); +void OBJECT_OT_game_property_new(struct wmOperatorType *ot); +void OBJECT_OT_game_property_remove(struct wmOperatorType *ot); +void OBJECT_OT_game_property_copy(struct wmOperatorType *ot); +void OBJECT_OT_logic_bricks_copy(struct wmOperatorType *ot); + /* object_select.c */ void OBJECT_OT_select_all(struct wmOperatorType *ot); void OBJECT_OT_select_inverse(struct wmOperatorType *ot); @@ -100,7 +105,6 @@ void OBJECT_OT_select_same_group(struct wmOperatorType *ot); /* object_add.c */ void OBJECT_OT_add(struct wmOperatorType *ot); void OBJECT_OT_add_named(struct wmOperatorType *ot); -void OBJECT_OT_curve_add(struct wmOperatorType *ot); void OBJECT_OT_surface_add(struct wmOperatorType *ot); void OBJECT_OT_metaball_add(struct wmOperatorType *ot); void OBJECT_OT_text_add(struct wmOperatorType *ot); @@ -160,10 +164,12 @@ void OBJECT_OT_explode_refresh(struct wmOperatorType *ot); /* object_constraint.c */ void OBJECT_OT_constraint_add(struct wmOperatorType *ot); void OBJECT_OT_constraint_add_with_targets(struct wmOperatorType *ot); -void OBJECT_OT_constraint_copy(struct wmOperatorType *ot); void POSE_OT_constraint_add(struct wmOperatorType *ot); void POSE_OT_constraint_add_with_targets(struct wmOperatorType *ot); +void OBJECT_OT_constraints_copy(struct wmOperatorType *ot); +void POSE_OT_constraints_copy(struct wmOperatorType *ot); + void OBJECT_OT_constraints_clear(struct wmOperatorType *ot); void POSE_OT_constraints_clear(struct wmOperatorType *ot); @@ -201,9 +207,6 @@ void OBJECT_OT_vertex_group_set_active(struct wmOperatorType *ot); void OBJECT_OT_vertex_group_sort(struct wmOperatorType *ot); void OBJECT_OT_vertex_group_move(struct wmOperatorType *ot); -void OBJECT_OT_game_property_new(struct wmOperatorType *ot); -void OBJECT_OT_game_property_remove(struct wmOperatorType *ot); - /* object_shapekey.c */ void OBJECT_OT_shape_key_add(struct wmOperatorType *ot); void OBJECT_OT_shape_key_remove(struct wmOperatorType *ot); diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c index 4cfed57f9c7..3c5928d86c2 100644 --- a/source/blender/editors/object/object_modifier.c +++ b/source/blender/editors/object/object_modifier.c @@ -413,7 +413,7 @@ static int modifier_apply_obdata(ReportList *reports, Scene *scene, Object *ob, multires_force_update(ob); if (mmd && mti->type==eModifierTypeType_OnlyDeform) { - multiresModifier_reshapeFromDeformMod (mmd, ob, md); + multiresModifier_reshapeFromDeformMod (ob, md); } else { dm = mesh_create_derived_for_modifier(scene, ob, md); if (!dm) { @@ -972,7 +972,7 @@ static int multires_reshape_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } - if(!multiresModifier_reshape(mmd, ob, secondob)) { + if(!multiresModifier_reshape(ob, secondob)) { BKE_report(op->reports, RPT_ERROR, "Objects do not have the same number of vertices."); return OPERATOR_CANCELLED; } diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c index 759e13bffb0..602b94034bd 100644 --- a/source/blender/editors/object/object_ops.c +++ b/source/blender/editors/object/object_ops.c @@ -112,7 +112,6 @@ void ED_operatortypes_object(void) WM_operatortype_append(GROUP_OT_objects_remove_active); WM_operatortype_append(OBJECT_OT_delete); - WM_operatortype_append(OBJECT_OT_curve_add); WM_operatortype_append(OBJECT_OT_text_add); WM_operatortype_append(OBJECT_OT_surface_add); WM_operatortype_append(OBJECT_OT_armature_add); @@ -146,9 +145,10 @@ void ED_operatortypes_object(void) WM_operatortype_append(OBJECT_OT_constraint_add); WM_operatortype_append(OBJECT_OT_constraint_add_with_targets); - WM_operatortype_append(OBJECT_OT_constraint_copy); WM_operatortype_append(POSE_OT_constraint_add); WM_operatortype_append(POSE_OT_constraint_add_with_targets); + WM_operatortype_append(OBJECT_OT_constraints_copy); + WM_operatortype_append(POSE_OT_constraints_copy); WM_operatortype_append(OBJECT_OT_constraints_clear); WM_operatortype_append(POSE_OT_constraints_clear); WM_operatortype_append(POSE_OT_ik_add); @@ -183,6 +183,8 @@ void ED_operatortypes_object(void) WM_operatortype_append(OBJECT_OT_game_property_new); WM_operatortype_append(OBJECT_OT_game_property_remove); + WM_operatortype_append(OBJECT_OT_game_property_copy); + WM_operatortype_append(OBJECT_OT_logic_bricks_copy); WM_operatortype_append(OBJECT_OT_shape_key_add); WM_operatortype_append(OBJECT_OT_shape_key_remove); diff --git a/source/blender/editors/object/object_select.c b/source/blender/editors/object/object_select.c index f1a906f36dd..8e3d613e02e 100644 --- a/source/blender/editors/object/object_select.c +++ b/source/blender/editors/object/object_select.c @@ -999,7 +999,9 @@ static int object_select_name_exec(bContext *C, wmOperator *op) } CTX_DATA_BEGIN(C, Base*, base, selectable_bases) { + /* this is a bit dodjy, there should only be ONE object with this name, but library objects can mess this up */ if(strcmp(name, base->object->id.name+2)==0) { + ED_base_object_activate(C, base); ED_base_object_select(base, BA_SELECT); changed= 1; } diff --git a/source/blender/editors/physics/particle_edit.c b/source/blender/editors/physics/particle_edit.c index 6ec744ad027..541b0cf494f 100644 --- a/source/blender/editors/physics/particle_edit.c +++ b/source/blender/editors/physics/particle_edit.c @@ -160,7 +160,7 @@ void PE_free_ptcache_edit(PTCacheEdit *edit) edit->emitter_field= 0; } - psys_free_path_cache(NULL, edit); + psys_free_path_cache(edit->psys, edit); MEM_freeN(edit); } diff --git a/source/blender/editors/physics/physics_fluid.c b/source/blender/editors/physics/physics_fluid.c index 1647892fd13..3cf6ed24807 100644 --- a/source/blender/editors/physics/physics_fluid.c +++ b/source/blender/editors/physics/physics_fluid.c @@ -708,7 +708,7 @@ typedef struct FluidBakeJob { /* from wmJob */ void *owner; short *stop, *do_update; - + float *progress; int current_frame; elbeemSimulationSettings *settings; } FluidBakeJob; @@ -732,19 +732,21 @@ static int fluidbake_breakjob(void *customdata) } /* called by fluidbake, wmJob sends notifier */ -static void fluidbake_updatejob(void *customdata, char *str) +static void fluidbake_updatejob(void *customdata, float progress) { FluidBakeJob *fb= customdata; *(fb->do_update)= 1; + *(fb->progress)= progress; } -static void fluidbake_startjob(void *customdata, short *stop, short *do_update) +static void fluidbake_startjob(void *customdata, short *stop, short *do_update, float *progress) { FluidBakeJob *fb= customdata; fb->stop= stop; fb->do_update = do_update; + fb->progress = progress; G.afbreek= 0; /* XXX shared with render - replace with job 'stop' switch */ @@ -753,14 +755,24 @@ static void fluidbake_startjob(void *customdata, short *stop, short *do_update) *stop = 0; } +static void fluidbake_endjob(void *customdata) +{ + FluidBakeJob *fb= customdata; + + if (fb->settings) { + MEM_freeN(fb->settings); + fb->settings = NULL; + } +} + int runSimulationCallback(void *data, int status, int frame) { FluidBakeJob *fb = (FluidBakeJob *)data; - - //elbeemSimulationSettings *settings = fb->settings; + elbeemSimulationSettings *settings = fb->settings; //printf("elbeem blender cb s%d, f%d, domainid:%d \n", status,frame, settings->domainId ); // DEBUG - if (status == FLUIDSIM_CBSTATUS_NEWFRAME) - fluidbake_updatejob(fb, ""); + if (status == FLUIDSIM_CBSTATUS_NEWFRAME) { + fluidbake_updatejob(fb, frame / (float)settings->noOfFrames); + } if (fluidbake_breakjob(fb)) { return FLUIDSIM_CBRET_ABORT; @@ -799,9 +811,9 @@ int fluidsimBake(bContext *C, ReportList *reports, Object *fsDomain) wmJob *steve; FluidBakeJob *fb; - elbeemSimulationSettings fsset; + elbeemSimulationSettings *fsset= MEM_callocN(sizeof(elbeemSimulationSettings), "Fluid sim settings"); - steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), scene, 0); + steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), scene, "Fluid Sim", WM_JOB_PROGRESS); fb= MEM_callocN(sizeof(FluidBakeJob), "fluid bake job"); if(getenv(strEnvName)) { @@ -902,7 +914,7 @@ int fluidsimBake(bContext *C, ReportList *reports, Object *fsDomain) for(i=2; i<=allchannelSize; i++) { timeAtFrame[i] = timeAtFrame[i-1]+channelDomainTime[(i-1)*2+0]; } - } else { + fsset->} else { for(i=2; i<=allchannelSize; i++) { timeAtFrame[i] = timeAtFrame[i-1]+aniFrameTime; } } @@ -936,76 +948,77 @@ int fluidsimBake(bContext *C, ReportList *reports, Object *fsDomain) } /* ******** export domain to elbeem ******** */ - elbeemResetSettings(&fsset); - fsset.version = 1; + elbeemResetSettings(fsset); + fsset->version = 1; // setup global settings - copy_v3_v3(fsset.geoStart, domainSettings->bbStart); - copy_v3_v3(fsset.geoSize, domainSettings->bbSize); + copy_v3_v3(fsset->geoStart, domainSettings->bbStart); + copy_v3_v3(fsset->geoSize, domainSettings->bbSize); // simulate with 50^3 - fsset.resolutionxyz = (int)domainSettings->resolutionxyz; - fsset.previewresxyz = (int)domainSettings->previewresxyz; + fsset->resolutionxyz = (int)domainSettings->resolutionxyz; + fsset->previewresxyz = (int)domainSettings->previewresxyz; - fsset.realsize = get_fluid_size_m(scene, fsDomain, domainSettings); - fsset.viscosity = get_fluid_viscosity(domainSettings); - get_fluid_gravity(fsset.gravity, scene, domainSettings); + fsset->realsize = get_fluid_size_m(scene, fsDomain, domainSettings); + fsset->viscosity = get_fluid_viscosity(domainSettings); + get_fluid_gravity(fsset->gravity, scene, domainSettings); // simulate 5 frames, each 0.03 seconds, output to ./apitest_XXX.bobj.gz - fsset.animStart = domainSettings->animStart; - fsset.aniFrameTime = channels->aniFrameTime; - fsset.noOfFrames = noFrames; // is otherwise subtracted in parser + fsset->animStart = domainSettings->animStart; + fsset->aniFrameTime = channels->aniFrameTime; + fsset->noOfFrames = noFrames; // is otherwise subtracted in parser + strcpy(targetFile, targetDir); strcat(targetFile, suffixSurface); // defaults for compressibility and adaptive grids - fsset.gstar = domainSettings->gstar; - fsset.maxRefine = domainSettings->maxRefine; // check <-> gridlevels - fsset.generateParticles = domainSettings->generateParticles; - fsset.numTracerParticles = domainSettings->generateTracers; - fsset.surfaceSmoothing = domainSettings->surfaceSmoothing; - fsset.surfaceSubdivs = domainSettings->surfaceSubdivs; - fsset.farFieldSize = domainSettings->farFieldSize; - strcpy( fsset.outputPath, targetFile); + fsset->gstar = domainSettings->gstar; + fsset->maxRefine = domainSettings->maxRefine; // check <-> gridlevels + fsset->generateParticles = domainSettings->generateParticles; + fsset->numTracerParticles = domainSettings->generateTracers; + fsset->surfaceSmoothing = domainSettings->surfaceSmoothing; + fsset->surfaceSubdivs = domainSettings->surfaceSubdivs; + fsset->farFieldSize = domainSettings->farFieldSize; + strcpy( fsset->outputPath, targetFile); // domain channels - fsset.channelSizeFrameTime = - fsset.channelSizeViscosity = - fsset.channelSizeGravity = channels->length; - fsset.channelFrameTime = channels->DomainTime; - fsset.channelViscosity = channels->DomainViscosity; - fsset.channelGravity = channels->DomainGravity; + fsset->channelSizeFrameTime = + fsset->channelSizeViscosity = + fsset->channelSizeGravity = channels->length; + fsset->channelFrameTime = channels->DomainTime; + fsset->channelViscosity = channels->DomainViscosity; + fsset->channelGravity = channels->DomainGravity; - fsset.runsimCallback = &runSimulationCallback; - fsset.runsimUserData = fb; + fsset->runsimCallback = &runSimulationCallback; + fsset->runsimUserData = fb; - if (domainSettings->typeFlags & OB_FSBND_NOSLIP) fsset.domainobsType = FLUIDSIM_OBSTACLE_NOSLIP; - else if (domainSettings->typeFlags&OB_FSBND_PARTSLIP) fsset.domainobsType = FLUIDSIM_OBSTACLE_PARTSLIP; - else if (domainSettings->typeFlags&OB_FSBND_FREESLIP) fsset.domainobsType = FLUIDSIM_OBSTACLE_FREESLIP; - fsset.domainobsPartslip = domainSettings->partSlipValue; - fsset.generateVertexVectors = (domainSettings->domainNovecgen==0); + if (domainSettings->typeFlags & OB_FSBND_NOSLIP) fsset->domainobsType = FLUIDSIM_OBSTACLE_NOSLIP; + else if (domainSettings->typeFlags&OB_FSBND_PARTSLIP) fsset->domainobsType = FLUIDSIM_OBSTACLE_PARTSLIP; + else if (domainSettings->typeFlags&OB_FSBND_FREESLIP) fsset->domainobsType = FLUIDSIM_OBSTACLE_FREESLIP; + fsset->domainobsPartslip = domainSettings->partSlipValue; + fsset->generateVertexVectors = (domainSettings->domainNovecgen==0); // init blender domain transform matrix { int j; for(i=0; i<4; i++) { for(j=0; j<4; j++) { - fsset.surfaceTrafo[i*4+j] = invDomMat[j][i]; + fsset->surfaceTrafo[i*4+j] = invDomMat[j][i]; } } } /* ******** init solver with settings ******** */ elbeemInit(); - elbeemAddDomain(&fsset); + elbeemAddDomain(fsset); /* ******** export all fluid objects to elbeem ******** */ export_fluid_objects(fobjects, scene, channels->length); /* custom data for fluid bake job */ - fb->settings = &fsset; + fb->settings = fsset; /* setup job */ WM_jobs_customdata(steve, fb, fluidbake_free); WM_jobs_timer(steve, 0.1, NC_SCENE|ND_FRAME, NC_SCENE|ND_FRAME); - WM_jobs_callbacks(steve, fluidbake_startjob, NULL, NULL, NULL); + WM_jobs_callbacks(steve, fluidbake_startjob, NULL, NULL, fluidbake_endjob); WM_jobs_start(CTX_wm_manager(C), steve); diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c index c34b906356e..268acba1db7 100644 --- a/source/blender/editors/render/render_internal.c +++ b/source/blender/editors/render/render_internal.c @@ -441,6 +441,7 @@ typedef struct RenderJob { ImageUser iuser; short *stop; short *do_update; + float *progress; ReportList *reports; } RenderJob; @@ -479,7 +480,7 @@ static void make_renderinfo_string(RenderStats *rs, Scene *scene, char *str) spos+= sprintf(spos, "Fra:%d Ve:%d Fa:%d ", (scene->r.cfra), rs->totvert, rs->totface); if(rs->tothalo) spos+= sprintf(spos, "Ha:%d ", rs->tothalo); if(rs->totstrand) spos+= sprintf(spos, "St:%d ", rs->totstrand); - spos+= sprintf(spos, "La:%d Mem:%.2fM (%.2fM, combined peak %.2fM) ", rs->totlamp, megs_used_memory, mmap_used_memory, megs_peak_memory); + spos+= sprintf(spos, "La:%d Mem:%.2fM (%.2fM, peak %.2fM) ", rs->totlamp, megs_used_memory, mmap_used_memory, megs_peak_memory); if(rs->curfield) spos+= sprintf(spos, "Field %d ", rs->curfield); @@ -519,6 +520,14 @@ static void image_renderinfo_cb(void *rjv, RenderStats *rs) } +static void render_progress_update(void *rjv, float progress) +{ + RenderJob *rj= rjv; + + if (rj->progress) + *rj->progress = progress; +} + static void image_rect_update(void *rjv, RenderResult *rr, volatile rcti *renrect) { RenderJob *rj= rjv; @@ -540,13 +549,14 @@ static void image_rect_update(void *rjv, RenderResult *rr, volatile rcti *renrec BKE_image_release_ibuf(ima, lock); } -static void render_startjob(void *rjv, short *stop, short *do_update) +static void render_startjob(void *rjv, short *stop, short *do_update, float *progress) { RenderJob *rj= rjv; // Main *mainp= BKE_undo_get_main(&rj->scene); rj->stop= stop; rj->do_update= do_update; + rj->progress= progress; if(rj->anim) RE_BlenderAnim(rj->re, rj->scene, rj->lay, rj->scene->r.sfra, rj->scene->r.efra, rj->scene->r.frame_step, rj->reports); @@ -663,7 +673,7 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event) rj->reports= op->reports; /* setup job */ - steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), scene, WM_JOB_EXCL_RENDER|WM_JOB_PRIORITY); + steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), scene, "Render", WM_JOB_EXCL_RENDER|WM_JOB_PRIORITY|WM_JOB_PROGRESS); WM_jobs_customdata(steve, rj, render_freejob); WM_jobs_timer(steve, 0.2, NC_SCENE|ND_RENDER_RESULT, 0); WM_jobs_callbacks(steve, render_startjob, NULL, NULL, render_endjob); @@ -679,6 +689,7 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event) RE_test_break_cb(re, rj, render_breakjob); RE_display_draw_cb(re, rj, image_rect_update); RE_stats_draw_cb(re, rj, image_renderinfo_cb); + RE_progress_cb(re, rj, render_progress_update); rj->re= re; G.afbreek= 0; diff --git a/source/blender/editors/render/render_opengl.c b/source/blender/editors/render/render_opengl.c index ee5363a00f9..d9b22553c7a 100644 --- a/source/blender/editors/render/render_opengl.c +++ b/source/blender/editors/render/render_opengl.c @@ -38,6 +38,7 @@ #include "BLI_dlrbTree.h" #include "DNA_scene_types.h" +#include "DNA_object_types.h" #include "BKE_blender.h" #include "BKE_object.h" @@ -62,6 +63,7 @@ #include "RE_pipeline.h" #include "IMB_imbuf_types.h" +#include "IMB_imbuf.h" #include "RNA_access.h" #include "RNA_define.h" @@ -94,6 +96,17 @@ typedef struct OGLRender { wmTimer *timer; /* use to check if running modal or not (invoke'd or exec'd)*/ } OGLRender; +/* added because v3d is not always valid */ +static unsigned int screen_opengl_layers(OGLRender *oglrender) +{ + if(oglrender->v3d) { + return oglrender->scene->lay | oglrender->v3d->lay; + } + else { + return oglrender->scene->lay; + } +} + static void screen_opengl_render_apply(OGLRender *oglrender) { Scene *scene= oglrender->scene; @@ -106,32 +119,46 @@ static void screen_opengl_render_apply(OGLRender *oglrender) float winmat[4][4]; int sizex= oglrender->sizex; int sizey= oglrender->sizey; + int view_context = (v3d != NULL); - /* bind */ - GPU_offscreen_bind(oglrender->ofs); - - /* render 3d view */ - if(rv3d->persp==RV3D_CAMOB && v3d->camera) { - RE_GetCameraWindow(oglrender->re, v3d->camera, scene->r.cfra, winmat); - ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, winmat); - } - else - ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, NULL); - - /* read in pixels & stamp */ rr= RE_AcquireResultRead(oglrender->re); - glReadPixels(0, 0, sizex, sizey, GL_RGBA, GL_FLOAT, rr->rectf); + + if(view_context) { + GPU_offscreen_bind(oglrender->ofs); /* bind */ + + /* render 3d view */ + if(rv3d->persp==RV3D_CAMOB && v3d->camera) { + RE_GetCameraWindow(oglrender->re, v3d->camera, scene->r.cfra, winmat); + ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, winmat); + } + else { + ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, NULL); + } + + glReadPixels(0, 0, sizex, sizey, GL_RGBA, GL_FLOAT, rr->rectf); + + GPU_offscreen_unbind(oglrender->ofs); /* unbind */ + } + else { + ImBuf *ibuf_view= ED_view3d_draw_offscreen_imbuf_simple(scene, oglrender->sizex, oglrender->sizey, OB_SOLID); + IMB_float_from_rect(ibuf_view); + + memcpy(rr->rectf, ibuf_view->rect_float, sizeof(float) * 4 * oglrender->sizex * oglrender->sizey); + + IMB_freeImBuf(ibuf_view); + } + + /* rr->rectf is now filled with image data */ + if((scene->r.stamp & R_STAMP_ALL) && (scene->r.stamp & R_STAMP_DRAW)) BKE_stamp_buf(scene, NULL, rr->rectf, rr->rectx, rr->recty, 4); + RE_ReleaseResult(oglrender->re); /* update byte from float buffer */ ibuf= BKE_image_acquire_ibuf(oglrender->ima, &oglrender->iuser, &lock); if(ibuf) image_buffer_rect_update(NULL, rr, ibuf, NULL); BKE_image_release_ibuf(oglrender->ima, lock); - - /* unbind */ - GPU_offscreen_unbind(oglrender->ofs); } static int screen_opengl_render_init(bContext *C, wmOperator *op) @@ -142,14 +169,23 @@ static int screen_opengl_render_init(bContext *C, wmOperator *op) GPUOffScreen *ofs; OGLRender *oglrender; int sizex, sizey; + int view_context= RNA_boolean_get(op->ptr, "view_context"); /* ensure we have a 3d view */ - if(!ED_view3d_context_activate(C)) - return 0; + + if(!ED_view3d_context_activate(C)) { + RNA_boolean_set(op->ptr, "view_context", 0); + view_context = 0; + } /* only one render job at a time */ if(WM_jobs_test(CTX_wm_manager(C), scene)) return 0; + + if(!view_context && scene->camera==NULL) { + BKE_report(op->reports, RPT_ERROR, "Scene has no camera."); + return 0; + } /* stop all running jobs, currently previews frustrate Render */ WM_jobs_stop_all(CTX_wm_manager(C)); @@ -177,9 +213,11 @@ static int screen_opengl_render_init(bContext *C, wmOperator *op) oglrender->sizey= sizey; oglrender->scene= scene; - oglrender->v3d= CTX_wm_view3d(C); - oglrender->ar= CTX_wm_region(C); - oglrender->rv3d= CTX_wm_region_view3d(C); + if(view_context) { + oglrender->v3d= CTX_wm_view3d(C); + oglrender->ar= CTX_wm_region(C); + oglrender->rv3d= CTX_wm_region_view3d(C); + } /* create image and image user */ oglrender->ima= BKE_image_verify_viewer(IMA_TYPE_R_RESULT, "Render Result"); @@ -211,7 +249,7 @@ static void screen_opengl_render_end(bContext *C, OGLRender *oglrender) if(oglrender->timer) { /* exec will not have a timer */ scene->r.cfra= oglrender->cfrao; - scene_update_for_newframe(scene, scene->lay); + scene_update_for_newframe(scene, screen_opengl_layers(oglrender)); WM_event_remove_timer(CTX_wm_manager(C), CTX_wm_window(C), oglrender->timer); } @@ -263,27 +301,32 @@ static int screen_opengl_render_anim_step(bContext *C, wmOperator *op) ImBuf *ibuf; void *lock; char name[FILE_MAXDIR+FILE_MAXFILE]; - unsigned int lay; int ok= 0; + int view_context = (oglrender->v3d != NULL); /* go to next frame */ while(CFRAnfra) { - if(scene->lay & 0xFF000000) - lay= scene->lay & 0xFF000000; - else - lay= scene->lay; + unsigned int lay= screen_opengl_layers(oglrender); + + if(lay & 0xFF000000) + lay &= 0xFF000000; scene_update_for_newframe(scene, lay); CFRA++; } - scene_update_for_newframe(scene, scene->lay); + scene_update_for_newframe(scene, screen_opengl_layers(oglrender)); - if(oglrender->rv3d->persp==RV3D_CAMOB && oglrender->v3d->camera && oglrender->v3d->scenelock) { - /* since scene_update_for_newframe() is used rather - * then ED_update_for_newframe() the camera needs to be set */ - if(scene_camera_switch_update(scene)) - oglrender->v3d->camera= scene->camera; + if(view_context) { + if(oglrender->rv3d->persp==RV3D_CAMOB && oglrender->v3d->camera && oglrender->v3d->scenelock) { + /* since scene_update_for_newframe() is used rather + * then ED_update_for_newframe() the camera needs to be set */ + if(scene_camera_switch_update(scene)) + oglrender->v3d->camera= scene->camera; + } + } + else { + scene_camera_switch_update(scene); } /* render into offscreen buffer */ @@ -445,6 +488,7 @@ void RENDER_OT_opengl(wmOperatorType *ot) ot->poll= ED_operator_screenactive; RNA_def_boolean(ot->srna, "animation", 0, "Animation", ""); + RNA_def_boolean(ot->srna, "view_context", 1, "View Context", "Use the current 3D view for rendering, else use scene settings."); } /* function for getting an opengl buffer from a View3D, used by sequencer */ diff --git a/source/blender/editors/render/render_preview.c b/source/blender/editors/render/render_preview.c index 112b0ea6cd4..898a8f527c3 100644 --- a/source/blender/editors/render/render_preview.c +++ b/source/blender/editors/render/render_preview.c @@ -1090,7 +1090,7 @@ static void icon_preview_startjob(void *customdata, short *stop, short *do_updat /* use same function for icon & shader, so the job manager does not run two of them at the same time. */ -static void common_preview_startjob(void *customdata, short *stop, short *do_update) +static void common_preview_startjob(void *customdata, short *stop, short *do_update, float *progress) { ShaderPreview *sp= customdata; @@ -1107,7 +1107,7 @@ void ED_preview_icon_job(const bContext *C, void *owner, ID *id, unsigned int *r wmJob *steve; ShaderPreview *sp; - steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), owner, WM_JOB_EXCL_RENDER); + steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), owner, "Icon Preview", WM_JOB_EXCL_RENDER); sp= MEM_callocN(sizeof(ShaderPreview), "shader preview"); /* customdata for preview thread */ @@ -1132,7 +1132,7 @@ void ED_preview_shader_job(const bContext *C, void *owner, ID *id, ID *parent, M wmJob *steve; ShaderPreview *sp; - steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), owner, WM_JOB_EXCL_RENDER); + steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), owner, "Shader Preview", WM_JOB_EXCL_RENDER); sp= MEM_callocN(sizeof(ShaderPreview), "shader preview"); /* customdata for preview thread */ diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index 244997775fc..8b1c0045fd3 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -3040,7 +3040,8 @@ void ED_keymap_screen(wmKeyConfig *keyconf) RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_offset", WHEELDOWNMOUSE, KM_PRESS, KM_ALT, 0)->ptr, "delta", 1); RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_offset", WHEELUPMOUSE, KM_PRESS, KM_ALT, 0)->ptr, "delta", -1); - WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", DOWNARROWKEY, KM_PRESS, KM_SHIFT, 0); + RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", UPARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "end", 1); + RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", DOWNARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "end", 0); RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", RIGHTARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "end", 1); RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", LEFTARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "end", 0); diff --git a/source/blender/editors/screen/screendump.c b/source/blender/editors/screen/screendump.c index 32b60b658c7..394f8b4fbcd 100644 --- a/source/blender/editors/screen/screendump.c +++ b/source/blender/editors/screen/screendump.c @@ -215,7 +215,7 @@ static void screenshot_updatejob(void *sjv) /* only this runs inside thread */ -static void screenshot_startjob(void *sjv, short *stop, short *do_update) +static void screenshot_startjob(void *sjv, short *stop, short *do_update, float *progress) { ScreenshotJob *sj= sjv; RenderData rd= sj->scene->r; @@ -296,7 +296,7 @@ static void screenshot_startjob(void *sjv, short *stop, short *do_update) static int screencast_exec(bContext *C, wmOperator *op) { bScreen *screen= CTX_wm_screen(C); - wmJob *steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), screen, 0); + wmJob *steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), screen, "Screencast", 0); ScreenshotJob *sj= MEM_callocN(sizeof(ScreenshotJob), "screenshot job"); /* setup sj */ diff --git a/source/blender/editors/sound/sound_ops.c b/source/blender/editors/sound/sound_ops.c index 376db0d3d58..be4f6ff0570 100644 --- a/source/blender/editors/sound/sound_ops.c +++ b/source/blender/editors/sound/sound_ops.c @@ -30,10 +30,13 @@ #include #include +#include "MEM_guardedalloc.h" + #include "DNA_packedFile_types.h" #include "DNA_scene_types.h" #include "DNA_space_types.h" #include "DNA_sequence_types.h" +#include "DNA_userdef_types.h" #include "BKE_context.h" #include "BKE_global.h" @@ -61,17 +64,30 @@ /******************** open sound operator ********************/ +static void open_init(bContext *C, wmOperator *op) +{ + PropertyPointerRNA *pprop; + + op->customdata= pprop= MEM_callocN(sizeof(PropertyPointerRNA), "OpenPropertyPointerRNA"); + uiIDContextProperty(C, &pprop->ptr, &pprop->prop); +} + static int open_exec(bContext *C, wmOperator *op) { char path[FILE_MAX]; bSound *sound; + PropertyPointerRNA *pprop; + PointerRNA idptr; AUD_SoundInfo info; RNA_string_get(op->ptr, "path", path); - sound = sound_new_file(CTX_data_main(C), path); + if(!op->customdata) + open_init(C, op); + if (sound==NULL || sound->playback_handle == NULL) { + if(op->customdata) MEM_freeN(op->customdata); BKE_report(op->reports, RPT_ERROR, "Unsupported audio format"); return OPERATOR_CANCELLED; } @@ -80,6 +96,7 @@ static int open_exec(bContext *C, wmOperator *op) if (info.specs.channels == AUD_CHANNELS_INVALID) { sound_delete(C, sound); + if(op->customdata) MEM_freeN(op->customdata); BKE_report(op->reports, RPT_ERROR, "Unsupported audio format"); return OPERATOR_CANCELLED; } @@ -87,12 +104,34 @@ static int open_exec(bContext *C, wmOperator *op) if (RNA_boolean_get(op->ptr, "cache")) { sound_cache(sound, 0); } + + /* hook into UI */ + pprop= op->customdata; + + if(pprop->prop) { + /* when creating new ID blocks, use is already 1, but RNA + * pointer se also increases user, so this compensates it */ + sound->id.us--; + + RNA_id_pointer_create(&sound->id, &idptr); + RNA_property_pointer_set(&pprop->ptr, pprop->prop, idptr); + RNA_property_update(C, &pprop->ptr, pprop->prop); + } + MEM_freeN(op->customdata); return OPERATOR_FINISHED; } static int open_invoke(bContext *C, wmOperator *op, wmEvent *event) { + if(!RNA_property_is_set(op->ptr, "relative_path")) + RNA_boolean_set(op->ptr, "relative_path", U.flag & USER_RELPATHS); + + if(RNA_property_is_set(op->ptr, "path")) + return open_exec(C, op); + + open_init(C, op); + return WM_operator_filesel(C, op, event); } @@ -113,6 +152,7 @@ void SOUND_OT_open(wmOperatorType *ot) /* properties */ WM_operator_properties_filesel(ot, FOLDERFILE|SOUNDFILE|MOVIEFILE, FILE_SPECIAL, FILE_OPENFILE); RNA_def_boolean(ot->srna, "cache", FALSE, "Cache", "Cache the sound in memory."); + RNA_def_boolean(ot->srna, "relative_path", FALSE, "Relative Path", "Load image with relative path to current .blend file"); } /* ******************************************************* */ diff --git a/source/blender/editors/space_action/action_edit.c b/source/blender/editors/space_action/action_edit.c index a0616b5f37b..b6e3327bd12 100644 --- a/source/blender/editors/space_action/action_edit.c +++ b/source/blender/editors/space_action/action_edit.c @@ -133,7 +133,7 @@ static void get_keyframe_extents (bAnimContext *ac, float *min, float *max) int filter; /* get data to filter, from Action or Dopesheet */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* set large values to try to override */ @@ -284,7 +284,7 @@ static short copy_action_keys (bAnimContext *ac) free_anim_copybuf(); /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* copy keyframes */ @@ -303,7 +303,7 @@ static short paste_action_keys (bAnimContext *ac) int filter, ok=0; /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* paste keyframes */ @@ -421,7 +421,7 @@ static void insert_action_keys(bAnimContext *ac, short mode) short flag = 0; /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); if (mode == 2) filter |= ANIMFILTER_SEL; else if (mode == 3) filter |= ANIMFILTER_ACTGROUPED; @@ -508,9 +508,9 @@ static void duplicate_action_keys (bAnimContext *ac) /* filter data */ if (ac->datatype == ANIMCONT_GPENCIL) - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_NODUPLIS); else - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* loop through filtered data and delete selected keys */ @@ -586,9 +586,9 @@ static void delete_action_keys (bAnimContext *ac) /* filter data */ if (ac->datatype == ANIMCONT_GPENCIL) - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_NODUPLIS); else - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* loop through filtered data and delete selected keys */ @@ -659,7 +659,7 @@ static void clean_action_keys (bAnimContext *ac, float thresh) int filter; /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_SEL | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_SEL | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* loop through filtered data and clean curves */ @@ -727,7 +727,7 @@ static void sample_action_keys (bAnimContext *ac) int filter; /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* loop through filtered data and add keys between selected keyframes on every frame */ @@ -797,7 +797,7 @@ static void setexpo_action_keys(bAnimContext *ac, short mode) int filter; /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* loop through setting mode per F-Curve */ @@ -868,7 +868,7 @@ static void setipo_action_keys(bAnimContext *ac, short mode) KeyframeEditFunc set_cb= ANIM_editkeyframes_ipo(mode); /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* loop through setting BezTriple interpolation @@ -952,7 +952,7 @@ static void sethandles_action_keys(bAnimContext *ac, short mode) KeyframeEditFunc sel_cb= ANIM_editkeyframes_ok(BEZT_OK_SELECTED); /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* loop through setting flags for handles @@ -1036,7 +1036,7 @@ static void setkeytype_action_keys(bAnimContext *ac, short mode) KeyframeEditFunc set_cb= ANIM_editkeyframes_keytype(mode); /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* loop through setting BezTriple interpolation @@ -1118,7 +1118,7 @@ static int actkeys_framejump_exec(bContext *C, wmOperator *op) memset(&ked, 0, sizeof(KeyframeEditData)); /* loop over action data, averaging values */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); for (ale= anim_data.first; ale; ale= ale->next) { @@ -1186,7 +1186,7 @@ static void snap_action_keys(bAnimContext *ac, short mode) if (ac->datatype == ANIMCONT_GPENCIL) filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT); else - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* get beztriple editing callbacks */ @@ -1311,9 +1311,9 @@ static void mirror_action_keys(bAnimContext *ac, short mode) /* filter data */ if (ac->datatype == ANIMCONT_GPENCIL) - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_NODUPLIS); else - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* mirror keyframes */ diff --git a/source/blender/editors/space_action/action_select.c b/source/blender/editors/space_action/action_select.c index 29a87ec849b..33f918c0711 100644 --- a/source/blender/editors/space_action/action_select.c +++ b/source/blender/editors/space_action/action_select.c @@ -95,9 +95,9 @@ static void deselect_action_keys (bAnimContext *ac, short test, short sel) /* determine type-based settings */ if (ac->datatype == ANIMCONT_GPENCIL) - filter= (ANIMFILTER_VISIBLE); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_NODUPLIS); else - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); /* filter data */ ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); @@ -212,7 +212,7 @@ static void borderselect_action (bAnimContext *ac, rcti rect, short mode, short UI_view2d_region_to_view(v2d, rect.xmax, rect.ymax-2, &rectf.xmax, &rectf.ymax); /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CHANNELS); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CHANNELS | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* get filtering flag for dopesheet data (if applicable) */ @@ -389,7 +389,7 @@ static void markers_selectkeys_between (bAnimContext *ac) ked.f2= max; /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* select keys in-between */ @@ -572,7 +572,7 @@ static int actkeys_select_linked_exec (bContext *C, wmOperator *op) return OPERATOR_CANCELLED; /* loop through all of the keys and select additional keyframes based on these */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); for (ale= anim_data.first; ale; ale= ale->next) { @@ -627,7 +627,7 @@ static void select_moreless_action_keys (bAnimContext *ac, short mode) memset(&ked, 0, sizeof(KeyframeEditData)); /* loop through all of the keys and select additional keyframes based on these */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); for (ale= anim_data.first; ale; ale= ale->next) { @@ -800,9 +800,9 @@ static void actkeys_mselect_leftright (bAnimContext *ac, short leftright, short /* filter data */ if (ac->datatype == ANIMCONT_GPENCIL) - filter= (ANIMFILTER_VISIBLE); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_NODUPLIS); else - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* select keys on the side where most data occurs */ @@ -823,13 +823,14 @@ static void actkeys_mselect_leftright (bAnimContext *ac, short leftright, short /* Sync marker support */ if((select_mode==SELECT_ADD) && (ac->spacetype==SPACE_ACTION) && ELEM(leftright, ACTKEYS_LRSEL_LEFT, ACTKEYS_LRSEL_RIGHT)) { SpaceAction *saction= ac->sa->spacedata.first; + if (saction && saction->flag & SACTION_MARKERS_MOVE) { TimeMarker *marker; - + for (marker= scene->markers.first; marker; marker= marker->next) { - if( ((leftright == ACTKEYS_LRSEL_LEFT) && marker->frame < CFRA) || - ((leftright == ACTKEYS_LRSEL_RIGHT) && marker->frame >= CFRA) - ) { + if( ((leftright == ACTKEYS_LRSEL_LEFT) && (marker->frame < CFRA)) || + ((leftright == ACTKEYS_LRSEL_RIGHT) && (marker->frame >= CFRA)) ) + { marker->flag |= SELECT; } else { @@ -864,9 +865,9 @@ static void actkeys_mselect_column(bAnimContext *ac, short select_mode, float se * based on the keys found to be selected above */ if (ac->datatype == ANIMCONT_GPENCIL) - filter= (ANIMFILTER_VISIBLE); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_NODUPLIS); else - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); for (ale= anim_data.first; ale; ale= ale->next) { @@ -997,10 +998,8 @@ static void mouse_action_keys (bAnimContext *ac, int mval[2], short select_mode, gpl_to_keylist(ads, gpl, &anim_keys, NULL); } - // the call below is not strictly necessary, since we have adjacency info anyway - //BLI_dlrbTree_linkedlist_sync(&anim_keys); - /* loop through keyframes, finding one that was within the range clicked on */ + // TODO: replace this with API calls instead of inlining for (ak= anim_keys.root; ak; ak= akn) { if (IN_RANGE(ak->cfra, rectf.xmin, rectf.xmax)) { /* set the frame to use, and apply inverse-correction for NLA-mapping diff --git a/source/blender/editors/space_file/Makefile b/source/blender/editors/space_file/Makefile index 43b2f09ed2d..29548b51222 100644 --- a/source/blender/editors/space_file/Makefile +++ b/source/blender/editors/space_file/Makefile @@ -63,3 +63,7 @@ ifeq ($(WITH_OPENEXR), true) CPPFLAGS += -DWITH_OPENEXR endif +ifeq ($(WITH_TIFF), true) + CPPFLAGS += -DWITH_TIFF +endif + diff --git a/source/blender/editors/space_file/SConscript b/source/blender/editors/space_file/SConscript index b22a265dcbc..9de705e99d3 100644 --- a/source/blender/editors/space_file/SConscript +++ b/source/blender/editors/space_file/SConscript @@ -12,9 +12,13 @@ defs = [] if env['WITH_BF_OPENJPEG']: defs.append('WITH_OPENJPEG') + if env['WITH_BF_OPENEXR']: defs.append('WITH_OPENEXR') +if env['WITH_BF_TIFF']: + defs.append('WITH_TIFF') + if env['OURPLATFORM'] == 'linux2': cflags='-pthread' incs += ' ../../../extern/binreloc/include' diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c index ebe42219f01..5e4887827b6 100644 --- a/source/blender/editors/space_file/filelist.c +++ b/source/blender/editors/space_file/filelist.c @@ -1269,7 +1269,7 @@ static void thumbnail_joblist_free(ThumbnailJob *tj) BLI_freelistN(&tj->loadimages); } -static void thumbnails_startjob(void *tjv, short *stop, short *do_update) +static void thumbnails_startjob(void *tjv, short *stop, short *do_update, float *progress) { ThumbnailJob *tj= tjv; FileImage* limg = tj->loadimages.first; @@ -1280,6 +1280,8 @@ static void thumbnails_startjob(void *tjv, short *stop, short *do_update) while ( (*stop==0) && (limg) ) { if ( limg->flags & IMAGEFILE ) { limg->img = IMB_thumb_manage(limg->path, THB_NORMAL, THB_SOURCE_IMAGE); + } else if ( limg->flags & BLENDERFILE ) { + limg->img = IMB_thumb_manage(limg->path, THB_NORMAL, THB_SOURCE_BLEND); } else if ( limg->flags & MOVIEFILE ) { limg->img = IMB_thumb_manage(limg->path, THB_NORMAL, THB_SOURCE_MOVIE); if (!limg->img) { @@ -1334,7 +1336,7 @@ void thumbnails_start(struct FileList* filelist, const struct bContext* C) tj->filelist = filelist; for (idx = 0; idx < filelist->numfiles;idx++) { if (!filelist->filelist[idx].image) { - if ( (filelist->filelist[idx].flags & IMAGEFILE) || (filelist->filelist[idx].flags & MOVIEFILE) ) { + if ( (filelist->filelist[idx].flags & (IMAGEFILE|MOVIEFILE|BLENDERFILE)) ) { FileImage* limg = MEM_callocN(sizeof(struct FileImage), "loadimage"); BLI_strncpy(limg->path, filelist->filelist[idx].path, FILE_MAX); limg->index= idx; @@ -1347,7 +1349,7 @@ void thumbnails_start(struct FileList* filelist, const struct bContext* C) BKE_reports_init(&tj->reports, RPT_PRINT); /* setup job */ - steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), filelist, 0); + steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), filelist, "Thumbnails", 0); WM_jobs_customdata(steve, tj, thumbnails_free); WM_jobs_timer(steve, 0.5, NC_WINDOW, NC_WINDOW); WM_jobs_callbacks(steve, thumbnails_startjob, NULL, thumbnails_update, NULL); @@ -1364,4 +1366,4 @@ void thumbnails_stop(struct FileList* filelist, const struct bContext* C) int thumbnails_running(struct FileList* filelist, const struct bContext* C) { return WM_jobs_test(CTX_wm_manager(C), filelist); -} \ No newline at end of file +} diff --git a/source/blender/editors/space_file/writeimage.c b/source/blender/editors/space_file/writeimage.c index c9b30983b93..05efdc12596 100644 --- a/source/blender/editors/space_file/writeimage.c +++ b/source/blender/editors/space_file/writeimage.c @@ -143,10 +143,11 @@ void save_image_filesel_str(Scene *scene, char *str) case R_BMP: strcpy(str, "Save BMP"); break; +#ifdef WITH_TIFF case R_TIFF: - if (G.have_libtiff) - strcpy(str, "Save TIFF"); + strcpy(str, "Save TIFF"); break; +#endif #ifdef WITH_OPENEXR case R_OPENEXR: strcpy(str, "Save OpenEXR"); diff --git a/source/blender/editors/space_graph/graph_buttons.c b/source/blender/editors/space_graph/graph_buttons.c index 5751fb0300e..bf433923707 100644 --- a/source/blender/editors/space_graph/graph_buttons.c +++ b/source/blender/editors/space_graph/graph_buttons.c @@ -208,11 +208,88 @@ static void graph_panel_properties(const bContext *C, Panel *pa) uiLayoutSetEnabled(subrow, (fcu->color_mode==FCURVE_COLOR_CUSTOM)); uiItemR(subrow, &fcu_ptr, "color", 0, "", 0); - /* TODO: the following settings could be added here - * - Access details (ID-block + RNA-Path + Array Index) - * - ... - */ + MEM_freeN(ale); +} +/* ******************* active Keyframe ************** */ + +/* get 'active' keyframe for panel editing */ +static short get_active_fcurve_keyframe_edit(FCurve *fcu, BezTriple **bezt, BezTriple **prevbezt) +{ + BezTriple *b; + int i; + + /* zero the pointers */ + *bezt = *prevbezt = NULL; + + /* sanity checks */ + if ((fcu->bezt == NULL) || (fcu->totvert == 0)) + return 0; + + /* find first selected keyframe for now, and call it the active one + * - this is a reasonable assumption, given that whenever anyone + * wants to edit numerically, there is likely to only be 1 vert selected + */ + for (i=0, b=fcu->bezt; i < fcu->totvert; i++, b++) { + if (BEZSELECTED(b)) { + /* found + * - 'previous' is either the one before, of the keyframe itself (which is still fine) + * XXX: we can just make this null instead if needed + */ + *prevbezt = (i > 0) ? b-1 : b; + *bezt = b; + + return 1; + } + } + + /* not found */ + return 0; +} + +static void graph_panel_key_properties(const bContext *C, Panel *pa) +{ + bAnimListElem *ale; + FCurve *fcu; + BezTriple *bezt, *prevbezt; + + uiLayout *layout = pa->layout; + uiLayout *col; + uiBlock *block; + + if (!graph_panel_context(C, &ale, &fcu)) + return; + + block = uiLayoutGetBlock(layout); + uiBlockSetHandleFunc(block, do_graph_region_buttons, NULL); + + /* only show this info if there are keyframes to edit */ + if (get_active_fcurve_keyframe_edit(fcu, &bezt, &prevbezt)) { + PointerRNA bezt_ptr; + + /* RNA pointer to keyframe, to allow editing */ + RNA_pointer_create(ale->id, &RNA_Keyframe, bezt, &bezt_ptr); + + /* interpolation */ + col= uiLayoutColumn(layout, 0); + uiItemR(col, &bezt_ptr, "interpolation", 0, NULL, 0); + + /* numerical coordinate editing */ + col= uiLayoutColumn(layout, 1); + /* keyframe itself */ + uiItemR(col, &bezt_ptr, "co", 0, "Key", 0); + + /* previous handle - only if previous was Bezier interpolation */ + if ((prevbezt) && (prevbezt->ipo == BEZT_IPO_BEZ)) + uiItemR(col, &bezt_ptr, "handle1", 0, NULL, 0); + + /* next handle - only if current is Bezier interpolation */ + if (bezt->ipo == BEZT_IPO_BEZ) + uiItemR(col, &bezt_ptr, "handle2", 0, NULL, 0); + } + else + uiItemL(layout, "No active keyframe on F-Curve", 0); + MEM_freeN(ale); } @@ -631,6 +708,7 @@ void graph_buttons_register(ARegionType *art) strcpy(pt->idname, "GRAPH_PT_view"); strcpy(pt->label, "View Properties"); pt->draw= graph_panel_view; + pt->flag |= PNL_DEFAULT_CLOSED; BLI_addtail(&art->paneltypes, pt); pt= MEM_callocN(sizeof(PanelType), "spacetype graph panel properties"); @@ -639,6 +717,14 @@ void graph_buttons_register(ARegionType *art) pt->draw= graph_panel_properties; pt->poll= graph_panel_poll; BLI_addtail(&art->paneltypes, pt); + + pt= MEM_callocN(sizeof(PanelType), "spacetype graph panel properties"); + strcpy(pt->idname, "GRAPH_PT_key_properties"); + strcpy(pt->label, "Active Keyframe"); + pt->draw= graph_panel_key_properties; + pt->poll= graph_panel_poll; + BLI_addtail(&art->paneltypes, pt); + pt= MEM_callocN(sizeof(PanelType), "spacetype graph panel drivers"); strcpy(pt->idname, "GRAPH_PT_drivers"); diff --git a/source/blender/editors/space_graph/graph_edit.c b/source/blender/editors/space_graph/graph_edit.c index c762912b297..9322bae13c9 100644 --- a/source/blender/editors/space_graph/graph_edit.c +++ b/source/blender/editors/space_graph/graph_edit.c @@ -86,7 +86,7 @@ void get_graph_keyframe_extents (bAnimContext *ac, float *xmin, float *xmax, flo int filter; /* get data to filter, from Dopesheet */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* set large values to try to override */ @@ -258,7 +258,7 @@ static void create_ghost_curves (bAnimContext *ac, int start, int end) } /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_SEL | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_SEL | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* loop through filtered data and add keys between selected keyframes on every frame */ @@ -417,7 +417,7 @@ static void insert_graph_keys(bAnimContext *ac, short mode) short flag = 0; /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); if (mode == 2) filter |= ANIMFILTER_SEL; ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); @@ -456,8 +456,6 @@ static int graphkeys_insertkey_exec(bContext *C, wmOperator *op) /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - if (ac.datatype == ANIMCONT_GPENCIL) - return OPERATOR_CANCELLED; /* which channels to affect? */ mode= RNA_enum_get(op->ptr, "type"); @@ -599,7 +597,7 @@ static short copy_graph_keys (bAnimContext *ac) free_anim_copybuf(); /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* copy keyframes */ @@ -617,7 +615,7 @@ static short paste_graph_keys (bAnimContext *ac) int filter, ok=0; /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_SEL | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_SEL | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* paste keyframes */ @@ -713,7 +711,7 @@ static void duplicate_graph_keys (bAnimContext *ac) int filter; /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE| ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* loop through filtered data and delete selected keys */ @@ -785,7 +783,7 @@ static void delete_graph_keys (bAnimContext *ac) int filter; /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE| ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* loop through filtered data and delete selected keys */ @@ -852,7 +850,7 @@ static void clean_graph_keys (bAnimContext *ac, float thresh) int filter; /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE| ANIMFILTER_FOREDIT | ANIMFILTER_SEL | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_SEL | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* loop through filtered data and clean curves */ @@ -919,7 +917,7 @@ static void bake_graph_curves (bAnimContext *ac, int start, int end) int filter; /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_SEL | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_SEL | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* loop through filtered data and add keys between selected keyframes on every frame */ @@ -1066,7 +1064,7 @@ static int graphkeys_sound_bake_exec(bContext *C, wmOperator *op) end = CFRA + sbi.length - 1; /* filter anim channels */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_SEL | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_SEL | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); /* loop through all selected F-Curves, replacing its data with the sound samples */ @@ -1144,7 +1142,7 @@ static void sample_graph_keys (bAnimContext *ac) int filter; /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE| ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE| ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* loop through filtered data and add keys between selected keyframes on every frame */ @@ -1213,7 +1211,7 @@ static void setexpo_graph_keys(bAnimContext *ac, short mode) int filter; /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE| ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* loop through setting mode per F-Curve */ @@ -1282,7 +1280,7 @@ static void setipo_graph_keys(bAnimContext *ac, short mode) KeyframeEditFunc set_cb= ANIM_editkeyframes_ipo(mode); /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE| ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* loop through setting BezTriple interpolation @@ -1364,7 +1362,7 @@ static void sethandles_graph_keys(bAnimContext *ac, short mode) KeyframeEditFunc sel_cb= ANIM_editkeyframes_ok(BEZT_OK_SELECTED); /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* loop through setting flags for handles @@ -1475,7 +1473,7 @@ static int graphkeys_euler_filter_exec (bContext *C, wmOperator *op) */ /* step 1: extract only the rotation f-curves */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_FOREDIT); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_FOREDIT | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); for (ale= anim_data.first; ale; ale= ale->next) { @@ -1554,7 +1552,7 @@ static int graphkeys_framejump_exec(bContext *C, wmOperator *op) memset(&ked, 0, sizeof(KeyframeEditData)); /* loop over action data, averaging values */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); for (ale= anim_data.first; ale; ale= ale->next) { @@ -1632,7 +1630,7 @@ static void snap_graph_keys(bAnimContext *ac, short mode) KeyframeEditFunc edit_cb; /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* get beztriple editing callbacks */ @@ -1770,7 +1768,7 @@ static void mirror_graph_keys(bAnimContext *ac, short mode) } /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE| ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE| ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* mirror keyframes */ @@ -1854,7 +1852,7 @@ static int graphkeys_smooth_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE| ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE| ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); /* smooth keyframes */ @@ -1945,7 +1943,7 @@ static int graph_fmodifier_add_exec(bContext *C, wmOperator *op) type= RNA_enum_get(op->ptr, "type"); /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); if (RNA_boolean_get(op->ptr, "only_active")) filter |= ANIMFILTER_ACTIVE; else diff --git a/source/blender/editors/space_graph/graph_select.c b/source/blender/editors/space_graph/graph_select.c index 9c898cf1cd7..17b0a87b0a8 100644 --- a/source/blender/editors/space_graph/graph_select.c +++ b/source/blender/editors/space_graph/graph_select.c @@ -95,7 +95,7 @@ static void deselect_graph_keys (bAnimContext *ac, short test, short sel) KeyframeEditFunc test_cb, sel_cb; /* determine type-based settings */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); /* filter data */ ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); @@ -213,7 +213,7 @@ static void borderselect_graphkeys (bAnimContext *ac, rcti rect, short mode, sho UI_view2d_region_to_view(v2d, rect.xmax, rect.ymax, &rectf.xmax, &rectf.ymax); /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_CURVEVISIBLE); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* get beztriple editing/validation funcs */ @@ -402,7 +402,7 @@ static void markers_selectkeys_between (bAnimContext *ac) ked.f2= max; /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* select keys in-between */ @@ -442,7 +442,7 @@ static void columnselect_graph_keys (bAnimContext *ac, short mode) /* build list of columns */ switch (mode) { case GRAPHKEYS_COLUMNSEL_KEYS: /* list of selected keys */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); for (ale= anim_data.first; ale; ale= ale->next) @@ -474,7 +474,7 @@ static void columnselect_graph_keys (bAnimContext *ac, short mode) /* loop through all of the keys and select additional keyframes * based on the keys found to be selected above */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); for (ale= anim_data.first; ale; ale= ale->next) { @@ -561,7 +561,7 @@ static int graphkeys_select_linked_exec (bContext *C, wmOperator *op) return OPERATOR_CANCELLED; /* loop through all of the keys and select additional keyframes based on these */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); for (ale= anim_data.first; ale; ale= ale->next) { @@ -616,7 +616,7 @@ static void select_moreless_graph_keys (bAnimContext *ac, short mode) memset(&ked, 0, sizeof(KeyframeEditData)); /* loop through all of the keys and select additional keyframes based on these */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); for (ale= anim_data.first; ale; ale= ale->next) { @@ -780,7 +780,7 @@ static void nearest_fcurve_vert_store (ListBase *matches, View2D *v2d, FCurve *f * needed to access the relevant vertex coordinates in the 3x3 * 'vec' matrix */ - UI_view2d_to_region_no_clip(v2d, bezt->vec[hpoint+1][0], bezt->vec[hpoint+1][1], &screen_co[0], &screen_co[1]); + UI_view2d_view_to_region(v2d, bezt->vec[hpoint+1][0], bezt->vec[hpoint+1][1], &screen_co[0], &screen_co[1]); /* check if distance from mouse cursor to vert in screen space is within tolerance */ // XXX: inlined distance calculation, since we cannot do this on ints using the math lib... @@ -834,7 +834,7 @@ static void get_nearest_fcurve_verts_list (bAnimContext *ac, int mval[2], ListBa * - if the option to only show keyframes that belong to selected F-Curves is enabled, * include the 'only selected' flag... */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); if (sipo->flag & SIPO_SELCUVERTSONLY) // FIXME: this should really be check for by the filtering code... filter |= ANIMFILTER_SEL; ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); @@ -1055,7 +1055,7 @@ static void mouse_graph_keys (bAnimContext *ac, int mval[], short select_mode, s /* set active F-Curve (NOTE: sync the filter flags with findnearest_fcurve_vert) */ if (nvi->fcu->flag & FCURVE_SELECTED) { - int filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY); + int filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_set_active_channel(ac, ac->data, ac->datatype, filter, nvi->fcu, ANIMTYPE_FCURVE); } } @@ -1107,7 +1107,7 @@ static void graphkeys_mselect_leftright (bAnimContext *ac, short leftright, shor } /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* select keys on the side where most data occurs */ @@ -1180,7 +1180,7 @@ static void graphkeys_mselect_column (bAnimContext *ac, int mval[2], short selec /* loop through all of the keys and select additional keyframes * based on the keys found to be selected above */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); for (ale= anim_data.first; ale; ale= ale->next) { diff --git a/source/blender/editors/space_graph/space_graph.c b/source/blender/editors/space_graph/space_graph.c index 2c66cb51fba..e7cee30f374 100644 --- a/source/blender/editors/space_graph/space_graph.c +++ b/source/blender/editors/space_graph/space_graph.c @@ -521,7 +521,7 @@ static void graph_refresh(const bContext *C, ScrArea *sa) * - we don't include ANIMFILTER_CURVEVISIBLE filter, as that will result in a * mismatch between channel-colors and the drawn curves */ - filter= (ANIMFILTER_VISIBLE|ANIMFILTER_CURVESONLY); + filter= (ANIMFILTER_VISIBLE|ANIMFILTER_CURVESONLY|ANIMFILTER_NODUPLIS); items= ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); /* loop over F-Curves, assigning colors */ diff --git a/source/blender/editors/space_image/Makefile b/source/blender/editors/space_image/Makefile index af15b1d9724..4f532166bc7 100644 --- a/source/blender/editors/space_image/Makefile +++ b/source/blender/editors/space_image/Makefile @@ -57,3 +57,7 @@ ifeq ($(WITH_OPENEXR), true) CPPFLAGS += -DWITH_OPENEXR endif +ifeq ($(WHITH_TIFF), true) + CPPFLAGS += -DWITH_TIFF +endif + diff --git a/source/blender/editors/space_image/SConscript b/source/blender/editors/space_image/SConscript index dd43559645d..b38e1473a0c 100644 --- a/source/blender/editors/space_image/SConscript +++ b/source/blender/editors/space_image/SConscript @@ -13,6 +13,8 @@ if env['WITH_BF_LCMS']: defs.append('WITH_LCMS') if env['WITH_BF_OPENEXR']: defs.append('WITH_OPENEXR') +if env['WITH_BF_TIFF']: + defs.append('WITH_TIFF') if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'): incs += ' ' + env['BF_PTHREADS_INC'] diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c index 274d26c8760..64d24ed578a 100644 --- a/source/blender/editors/space_image/image_ops.c +++ b/source/blender/editors/space_image/image_ops.c @@ -637,8 +637,9 @@ static const EnumPropertyItem image_file_type_items[] = { {R_JP2, "JPEG_2000", 0, "Jpeg 2000", ""}, #endif {R_IRIS, "IRIS", 0, "Iris", ""}, - //if(G.have_libtiff) +#ifdef WITH_TIFF {R_TIFF, "TIFF", 0, "Tiff", ""}, +#endif {R_RADHDR, "RADIANCE_HDR", 0, "Radiance HDR", ""}, {R_CINEON, "CINEON", 0, "Cineon", ""}, {R_DPX, "DPX", 0, "DPX", ""}, diff --git a/source/blender/editors/space_info/space_info.c b/source/blender/editors/space_info/space_info.c index 5245c53fb01..4370d2cbc16 100644 --- a/source/blender/editors/space_info/space_info.c +++ b/source/blender/editors/space_info/space_info.c @@ -156,6 +156,10 @@ static void info_header_listener(ARegion *ar, wmNotifier *wmn) if(ELEM(wmn->data, ND_SCREENCAST, ND_ANIMPLAY)) ED_region_tag_redraw(ar); break; + case NC_WM: + if(wmn->data == ND_JOB) + ED_region_tag_redraw(ar); + break; case NC_SCENE: if(wmn->data==ND_RENDER_RESULT) ED_region_tag_redraw(ar); diff --git a/source/blender/editors/space_logic/logic_ops.c b/source/blender/editors/space_logic/logic_ops.c index 347b586f49c..632331459cb 100644 --- a/source/blender/editors/space_logic/logic_ops.c +++ b/source/blender/editors/space_logic/logic_ops.c @@ -533,48 +533,6 @@ void LOGIC_OT_actuator_add(wmOperatorType *ot) prop= RNA_def_string(ot->srna, "name", "", 32, "Name", "Name of the Actuator to add"); } -/* Copy Routines */ - -static int logicbricks_copy_exec(bContext *C, wmOperator *op) -{ - Object *ob=ED_object_active_context(C); - - CTX_DATA_BEGIN(C, Object*, ob_iter, selected_editable_objects) { - if(ob != ob_iter) { - if (ob->data != ob_iter->data){ - copy_sensors(&ob_iter->sensors, &ob->sensors); - copy_controllers(&ob_iter->controllers, &ob->controllers); - copy_actuators(&ob_iter->actuators, &ob->actuators); - } - - if(ob_iter->totcol==ob->totcol) { - ob_iter->actcol= ob->actcol; - WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob_iter); - } - } - } - CTX_DATA_END; - - WM_event_add_notifier(C, NC_LOGIC, NULL); - - return OPERATOR_FINISHED; -} - -void LOGIC_OT_bricks_copy(wmOperatorType *ot) -{ - /* identifiers */ - ot->name= "Copy Logic Bricks to Selected"; - ot->description = "Copy logic bricks to other selected objects."; - ot->idname= "LOGIC_OT_bricks_copy"; - - /* api callbacks */ - ot->exec= logicbricks_copy_exec; - ot->poll= ED_operator_object_active_editable; - - /* flags */ - ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; -} - void ED_operatortypes_logic(void) { WM_operatortype_append(LOGIC_OT_sensor_remove); @@ -583,5 +541,4 @@ void ED_operatortypes_logic(void) WM_operatortype_append(LOGIC_OT_controller_add); WM_operatortype_append(LOGIC_OT_actuator_remove); WM_operatortype_append(LOGIC_OT_actuator_add); - WM_operatortype_append(LOGIC_OT_bricks_copy); } diff --git a/source/blender/editors/space_logic/logic_window.c b/source/blender/editors/space_logic/logic_window.c index 70635e76055..68be229a1ed 100644 --- a/source/blender/editors/space_logic/logic_window.c +++ b/source/blender/editors/space_logic/logic_window.c @@ -3222,9 +3222,14 @@ static void draw_sensor_armature(uiLayout *layout, PointerRNA *ptr) bArmatureSensor *as = (bArmatureSensor *) sens->data; Object *ob = (Object *)ptr->id.data; PointerRNA pose_ptr, pchan_ptr; - PropertyRNA *bones_prop; + PropertyRNA *bones_prop= NULL; uiLayout *row; + if(ob->type != OB_ARMATURE){ + uiItemL(layout, "Sensor only available for armatures", 0); + return; + } + if (ob->pose) { RNA_pointer_create((ID *)ob, &RNA_Pose, ob->pose, &pose_ptr); bones_prop = RNA_struct_find_property(&pose_ptr, "bones"); @@ -3589,6 +3594,10 @@ static void draw_actuator_action(uiLayout *layout, PointerRNA *ptr) PointerRNA settings_ptr; uiLayout *row; + if(ob->type != OB_ARMATURE){ + uiItemL(layout, "Actuator only available for armatures", 0); + return; + } RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr); row= uiLayoutRow(layout, 0); @@ -3624,6 +3633,11 @@ static void draw_actuator_armature(uiLayout *layout, PointerRNA *ptr) Object *ob = (Object *)ptr->id.data; PointerRNA pose_ptr, pchan_ptr; PropertyRNA *bones_prop; + + if(ob->type != OB_ARMATURE){ + uiItemL(layout, "Actuator only available for armatures", 0); + return; + } if (ob->pose) { RNA_pointer_create((ID *)ob, &RNA_Pose, ob->pose, &pose_ptr); @@ -3783,6 +3797,7 @@ static void draw_actuator_constraint(uiLayout *layout, PointerRNA *ptr) static void draw_actuator_edit_object(uiLayout *layout, PointerRNA *ptr) { + Object *ob = (Object *)ptr->id.data; uiLayout *row, *split, *subsplit; uiItemR(layout, ptr, "mode", 0, NULL, 0); @@ -3806,6 +3821,10 @@ static void draw_actuator_edit_object(uiLayout *layout, PointerRNA *ptr) case ACT_EDOB_END_OBJECT: break; case ACT_EDOB_REPLACE_MESH: + if(ob->type != OB_MESH) { + uiItemL(layout, "Mode only available for mesh objects", 0); + break; + } split = uiLayoutSplit(layout, 0.6, 0); uiItemR(split, ptr, "mesh", 0, NULL, 0); row = uiLayoutRow(split, 0); @@ -3820,6 +3839,10 @@ static void draw_actuator_edit_object(uiLayout *layout, PointerRNA *ptr) uiItemR(subsplit, ptr, "enable_3d_tracking", UI_ITEM_R_TOGGLE, NULL, 0); break; case ACT_EDOB_DYNAMICS: + if(ob->type != OB_MESH) { + uiItemL(layout, "Mode only available for mesh objects", 0); + break; + } uiItemR(layout, ptr, "dynamic_operation", 0, NULL, 0); if (RNA_enum_get(ptr, "dynamic_operation") == ACT_EDOB_SET_MASS) uiItemR(layout, ptr, "mass", 0, NULL, 0); @@ -4145,6 +4168,11 @@ static void draw_actuator_shape_action(uiLayout *layout, PointerRNA *ptr) PointerRNA settings_ptr; uiLayout *row; + if(ob->type != OB_MESH){ + uiItemL(layout, "Actuator only available for mesh objects", 0); + return; + } + RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr); row= uiLayoutRow(layout, 0); @@ -4175,7 +4203,7 @@ static void draw_actuator_shape_action(uiLayout *layout, PointerRNA *ptr) static void draw_actuator_sound(uiLayout *layout, PointerRNA *ptr, bContext *C) { - uiLayout *row, *box; + uiLayout *row, *col; uiTemplateID(layout, C, ptr, "sound", NULL, "SOUND_OT_open", NULL); if (!RNA_pointer_get(ptr, "sound").data) @@ -4189,23 +4217,24 @@ static void draw_actuator_sound(uiLayout *layout, PointerRNA *ptr, bContext *C) uiItemR(row, ptr, "volume", 0, NULL, 0); uiItemR(row, ptr, "pitch", 0, NULL, 0); - uiItemR(layout, ptr, "enable_sound_3d", UI_ITEM_R_TOGGLE, NULL, 0); - box = uiLayoutBox(layout); - uiLayoutSetActive(box, RNA_boolean_get(ptr, "enable_sound_3d")==1); + uiItemR(layout, ptr, "enable_sound_3d", 0, NULL, 0); + + col = uiLayoutColumn(layout, 0); + uiLayoutSetActive(col, RNA_boolean_get(ptr, "enable_sound_3d")==1); - row = uiLayoutRow(box, 0); + row = uiLayoutRow(col, 0); uiItemR(row, ptr, "minimum_gain_3d", 0, NULL, 0); uiItemR(row, ptr, "maximum_gain_3d", 0, NULL, 0); - row = uiLayoutRow(box, 0); + row = uiLayoutRow(col, 0); uiItemR(row, ptr, "reference_distance_3d", 0, NULL, 0); uiItemR(row, ptr, "max_distance_3d", 0, NULL, 0); - row = uiLayoutRow(box, 0); + row = uiLayoutRow(col, 0); uiItemR(row, ptr, "rolloff_factor_3d", 0, NULL, 0); uiItemR(row, ptr, "cone_outer_gain_3d", 0, NULL, 0); - row = uiLayoutRow(box, 0); + row = uiLayoutRow(col, 0); uiItemR(row, ptr, "cone_outer_angle_3d", 0, NULL, 0); uiItemR(row, ptr, "cone_inner_angle_3d", 0, NULL, 0); } diff --git a/source/blender/editors/space_nla/nla_select.c b/source/blender/editors/space_nla/nla_select.c index b76d90bd0f9..1416e0afdc9 100644 --- a/source/blender/editors/space_nla/nla_select.c +++ b/source/blender/editors/space_nla/nla_select.c @@ -70,7 +70,7 @@ static short selmodes_to_flagmodes (short sel) break; case SELECT_INVERT: - return ACHANNEL_SETFLAG_TOGGLE; + return ACHANNEL_SETFLAG_INVERT; break; case SELECT_ADD: diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index 19f4f70bd0a..886aa990199 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -88,6 +88,7 @@ typedef struct CompoJob { bNodeTree *localtree; short *stop; short *do_update; + float *progress; } CompoJob; /* called by compo, only to check job 'stop' value */ @@ -133,9 +134,16 @@ static void compo_updatejob(void *cjv) ntreeLocalSync(cj->localtree, cj->ntree); } +static void compo_progressjob(void *cjv, float progress) +{ + CompoJob *cj= cjv; + + *(cj->progress) = progress; +} + /* only this runs inside thread */ -static void compo_startjob(void *cjv, short *stop, short *do_update) +static void compo_startjob(void *cjv, short *stop, short *do_update, float *progress) { CompoJob *cj= cjv; bNodeTree *ntree= cj->localtree; @@ -145,11 +153,14 @@ static void compo_startjob(void *cjv, short *stop, short *do_update) cj->stop= stop; cj->do_update= do_update; + cj->progress= progress; ntree->test_break= compo_breakjob; ntree->tbh= cj; ntree->stats_draw= compo_redrawjob; ntree->sdh= cj; + ntree->progress= compo_progressjob; + ntree->prh= cj; // XXX BIF_store_spare(); @@ -157,6 +168,7 @@ static void compo_startjob(void *cjv, short *stop, short *do_update) ntree->test_break= NULL; ntree->stats_draw= NULL; + ntree->progress= NULL; } @@ -166,7 +178,7 @@ void snode_composite_job(const bContext *C, ScrArea *sa) wmJob *steve; CompoJob *cj; - steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), sa, WM_JOB_EXCL_RENDER); + steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), sa, "Compositing", WM_JOB_EXCL_RENDER|WM_JOB_PROGRESS); cj= MEM_callocN(sizeof(CompoJob), "compo job"); /* customdata for preview thread */ diff --git a/source/blender/editors/space_sequencer/sequencer_add.c b/source/blender/editors/space_sequencer/sequencer_add.c index b8c233bfe3e..c1b30ab155a 100644 --- a/source/blender/editors/space_sequencer/sequencer_add.c +++ b/source/blender/editors/space_sequencer/sequencer_add.c @@ -182,6 +182,7 @@ static int sequencer_add_scene_strip_exec(bContext *C, wmOperator *op) seq->type= SEQ_SCENE; seq->scene= sce_seq; + seq->sfra= sce_seq->r.sfra; /* basic defaults */ seq->strip= strip= MEM_callocN(sizeof(Strip), "strip"); diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c index 164ca6c21b0..9deb0ba4a0a 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.c +++ b/source/blender/editors/space_sequencer/sequencer_edit.c @@ -1650,10 +1650,10 @@ static int sequencer_cut_invoke(bContext *C, wmOperator *op, wmEvent *event) Scene *scene = CTX_data_scene(C); ARegion *ar= CTX_wm_region(C); View2D *v2d= UI_view2d_fromcontext(C); - - int cut_side, cut_frame; - - cut_frame= CFRA; + + int cut_side= SEQ_SIDE_BOTH; + int cut_frame= CFRA; + if (ED_operator_sequencer_active(C) && v2d) cut_side= mouse_frame_side(v2d, event->x - ar->winrct.xmin, cut_frame); diff --git a/source/blender/editors/space_text/space_text.c b/source/blender/editors/space_text/space_text.c index 513f167efe9..3a23cd32629 100644 --- a/source/blender/editors/space_text/space_text.c +++ b/source/blender/editors/space_text/space_text.c @@ -466,7 +466,7 @@ void ED_spacetype_text(void) art= MEM_callocN(sizeof(ARegionType), "spacetype text region"); art->regionid = RGN_TYPE_UI; art->prefsizex= UI_COMPACT_PANEL_WIDTH; - art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D; + art->keymapflag= ED_KEYMAP_UI; art->init= text_properties_area_init; art->draw= text_properties_area_draw; diff --git a/source/blender/editors/space_view3d/drawanimviz.c b/source/blender/editors/space_view3d/drawanimviz.c index 0a8f19493fa..1bc51de4471 100644 --- a/source/blender/editors/space_view3d/drawanimviz.c +++ b/source/blender/editors/space_view3d/drawanimviz.c @@ -199,6 +199,21 @@ void draw_motion_path_instance(Scene *scene, View3D *v3d, ARegion *ar, glVertex3fv(mpv->co); glEnd(); + /* Draw big green dot where the current frame is */ + // NOTE: only do this when drawing keyframes for now... + if (avs->path_viewflag & MOTIONPATH_VIEW_KFRAS) { + UI_ThemeColor(TH_CFRAME); + glPointSize(6.0f); + + glBegin(GL_POINTS); + mpv = mpv_start + (CFRA - sfra); + glVertex3fv(mpv->co); + glEnd(); + + glPointSize(1.0f); + UI_ThemeColor(TH_TEXT_HI); + } + /* Draw frame numbers at each framestep value */ if (avs->path_viewflag & MOTIONPATH_VIEW_FNUMS) { for (i=0, mpv=mpv_start; i < len; i+=stepsize, mpv+=stepsize) { @@ -220,9 +235,9 @@ void draw_motion_path_instance(Scene *scene, View3D *v3d, ARegion *ar, } } } - + /* Keyframes - dots and numbers */ - if (avs->path_viewflag & MOTIONPATH_VIEW_KFNOS) { + if (avs->path_viewflag & MOTIONPATH_VIEW_KFRAS) { AnimData *adt= BKE_animdata_from_id(&ob->id); DLRBT_Tree keys; @@ -230,8 +245,10 @@ void draw_motion_path_instance(Scene *scene, View3D *v3d, ARegion *ar, BLI_dlrbTree_init(&keys); if (adt) { - /* for now, it is assumed that keyframes for bones are all grouped in a single group */ - if (pchan) { + /* it is assumed that keyframes for bones are all grouped in a single group + * unless an option is set to always use the whole action + */ + if ((pchan) && (avs->path_viewflag & MOTIONPATH_VIEW_KFACT)==0) { bActionGroup *agrp= action_groups_find_named(adt->action, pchan->name); if (agrp) { @@ -261,7 +278,7 @@ void draw_motion_path_instance(Scene *scene, View3D *v3d, ARegion *ar, glPointSize(1.0f); /* Draw frame numbers of keyframes */ - if (avs->path_viewflag & MOTIONPATH_VIEW_FNUMS) { + if (avs->path_viewflag & MOTIONPATH_VIEW_KFNOS) { for (i=0, mpv=mpv_start; i < len; i++, mpv++) { float mframe= (float)(sfra + i); diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index 70f20df507b..d3b70f4553a 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -30,10 +30,6 @@ #include "MEM_guardedalloc.h" - - - - #include "DNA_camera_types.h" #include "DNA_curve_types.h" #include "DNA_constraint_types.h" // for drawing constraint @@ -992,21 +988,23 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, /* Outer circle */ circrad = 3.0f*lampsize; - drawcircball(GL_LINE_LOOP, vec, circrad, imat); - } - else - circrad = 0.0f; - - setlinestyle(3); + setlinestyle(3); - /* draw dashed outer circle if shadow is on. remember some lamps can't have certain shadows! */ - if (la->type!=LA_HEMI) { - if ((la->mode & LA_SHAD_RAY) || - ((la->mode & LA_SHAD_BUF) && (la->type==LA_SPOT)) ) - { - drawcircball(GL_LINE_LOOP, vec, circrad + 3.0f*pixsize, imat); + drawcircball(GL_LINE_LOOP, vec, circrad, imat); + + /* draw dashed outer circle if shadow is on. remember some lamps can't have certain shadows! */ + if(la->type!=LA_HEMI) { + if( (la->mode & LA_SHAD_RAY) || + ((la->mode & LA_SHAD_BUF) && (la->type==LA_SPOT)) + ) { + drawcircball(GL_LINE_LOOP, vec, circrad + 3.0f*pixsize, imat); + } } } + else { + setlinestyle(3); + circrad = 0.0f; + } /* draw the pretty sun rays */ if(la->type==LA_SUN) { @@ -2488,7 +2486,8 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D if (ob==OBACT && paint_facesel_test(ob)) draw_wire = 0; if(dt==OB_BOUNDBOX) { - draw_bounding_volume(scene, ob); + if((v3d->flag2 & V3D_RENDER_OVERRIDE && v3d->drawtype >= OB_WIRE)==0) + draw_bounding_volume(scene, ob); } else if(hasHaloMat || (totface==0 && totedge==0)) { glPointSize(1.5); @@ -2526,7 +2525,8 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D else UI_ThemeColor(TH_WIRE); - dm->drawLooseEdges(dm); + if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) + dm->drawLooseEdges(dm); } } else if(dt==OB_SOLID) { @@ -2593,7 +2593,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D } else { UI_ThemeColor(TH_WIRE); } - if(!ob->sculpt) + if(!ob->sculpt && (v3d->flag2 & V3D_RENDER_OVERRIDE)==0) dm->drawLooseEdges(dm); } } @@ -2660,7 +2660,8 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D } else { UI_ThemeColor(TH_WIRE); } - dm->drawLooseEdges(dm); + if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) + dm->drawLooseEdges(dm); } } @@ -2714,8 +2715,9 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D glDepthMask(0); // disable write in zbuffer, selected edge wires show better } - dm->drawEdges(dm, (dt==OB_WIRE || totface==0), 0); - + if((v3d->flag2 & V3D_RENDER_OVERRIDE && v3d->drawtype >= OB_SOLID)==0) + dm->drawEdges(dm, (dt==OB_WIRE || totface==0), 0); + if (dt!=OB_WIRE && draw_wire==2) { glDepthMask(1); bglPolygonOffset(rv3d->dist, 0.0); @@ -3082,7 +3084,8 @@ static int drawCurveDerivedMesh(Scene *scene, View3D *v3d, RegionView3D *rv3d, B glDisable(GL_LIGHTING); GPU_end_object_materials(); } else { - drawCurveDMWired (ob); + if((v3d->flag2 & V3D_RENDER_OVERRIDE && v3d->drawtype >= OB_SOLID)==0) + drawCurveDMWired (ob); } return 0; @@ -3463,12 +3466,11 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv select=1; } + psys_update_children(&sim); + psys->flag|=PSYS_DRAWING; - if(part->type==PART_HAIR && !psys->childcache) - totchild=0; - else - totchild=psys->totchild*part->disp/100; + totchild=psys->totchild*part->disp/100; ma= give_current_material(ob,part->omat); @@ -3503,11 +3505,18 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv totpart=psys->totpart; - //if(part->flag&PART_GLOB_TIME) cfra=bsystem_time(scene, 0, (float)CFRA, 0.0f); - if(draw_as==PART_DRAW_PATH && psys->pathcache==NULL && psys->childcache==NULL) - draw_as=PART_DRAW_DOT; + if(draw_as==PART_DRAW_PATH) { + if(psys->pathcache==NULL && psys->childcache==NULL) + psys_update_path_cache(&sim, cfra); + + /* can't create pathcache for some reason*/ + if(psys->pathcache==NULL && psys->childcache==NULL) + draw_as=PART_DRAW_DOT; + else if(psys->childcache==NULL) + totchild = 0; + } /* 3. */ switch(draw_as){ @@ -3859,7 +3868,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv UI_ThemeColor(TH_WIRE); }*/ - if(totchild && (part->draw&PART_DRAW_PARENT)==0) + if(totchild && ((part->draw&PART_DRAW_PARENT)==0 || psys_in_edit_mode(scene, psys))) totpart=0; else if(psys->pathcache==NULL) totpart=0; @@ -5839,8 +5848,10 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag) set_inverted_drawing(0); } } - else if(dt==OB_BOUNDBOX) - draw_bounding_volume(scene, ob); + else if(dt==OB_BOUNDBOX) { + if((v3d->flag2 & V3D_RENDER_OVERRIDE && v3d->drawtype >= OB_WIRE)==0) + draw_bounding_volume(scene, ob); + } else if(boundbox_clip(rv3d, ob->obmat, ob->bb ? ob->bb : cu->bb)) empty_object= drawDispList(scene, v3d, rv3d, base, dt); @@ -5852,8 +5863,10 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag) if(cu->editnurb) { drawnurb(scene, v3d, rv3d, base, cu->editnurb->first, dt); } - else if(dt==OB_BOUNDBOX) - draw_bounding_volume(scene, ob); + else if(dt==OB_BOUNDBOX) { + if((v3d->flag2 & V3D_RENDER_OVERRIDE && v3d->drawtype >= OB_WIRE)==0) + draw_bounding_volume(scene, ob); + } else if(boundbox_clip(rv3d, ob->obmat, ob->bb ? ob->bb : cu->bb)) { empty_object= drawDispList(scene, v3d, rv3d, base, dt); @@ -5867,8 +5880,10 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag) if(mb->editelems) drawmball(scene, v3d, rv3d, base, dt); - else if(dt==OB_BOUNDBOX) - draw_bounding_volume(scene, ob); + else if(dt==OB_BOUNDBOX) { + if((v3d->flag2 & V3D_RENDER_OVERRIDE && v3d->drawtype >= OB_WIRE)==0) + draw_bounding_volume(scene, ob); + } else empty_object= drawmball(scene, v3d, rv3d, base, dt); break; @@ -5905,7 +5920,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag) } } - if((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) { + if((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) { if(ob->soft /*&& flag & OB_SBMOTION*/){ float mrt[3][3],msc[3][3],mtr[3][3]; @@ -6103,7 +6118,10 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag) if(dtx & OB_AXIS) { drawaxes(rv3d, rv3d->viewmatob, 1.0f, flag, OB_ARROWS); } - if(dtx & OB_BOUNDBOX) draw_bounding_volume(scene, ob); + if(dtx & OB_BOUNDBOX) { + if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) + draw_bounding_volume(scene, ob); + } if(dtx & OB_TEXSPACE) drawtexspace(ob); if(dtx & OB_DRAWNAME) { /* patch for several 3d cards (IBM mostly) that crash on glSelect with text drawing */ diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c index e78618f4627..78ae13d255e 100644 --- a/source/blender/editors/space_view3d/space_view3d.c +++ b/source/blender/editors/space_view3d/space_view3d.c @@ -610,6 +610,10 @@ static void view3d_main_area_listener(ARegion *ar, wmNotifier *wmn) * more context than just the region */ ED_region_tag_redraw(ar); break; + case NC_TEXTURE: + /* same as above */ + ED_region_tag_redraw(ar); + break; case NC_SPACE: if(wmn->data == ND_SPACE_VIEW3D) { if (wmn->subtype == NS_VIEW3D_GPU) { diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index 9f9733bc80c..53fd0125329 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -1965,7 +1965,10 @@ void ED_view3d_draw_offscreen(Scene *scene, View3D *v3d, ARegion *ar, int winx, /* set flags */ G.f |= G_RENDER_OGL; - GPU_free_images(); + + /* free images which can have changed on frame-change + * warning! can be slow so only free animated images - campbell */ + GPU_free_images_anim(); /* set background color, fallback on the view background color */ if(scene->world) { @@ -2030,7 +2033,8 @@ void ED_view3d_draw_offscreen(Scene *scene, View3D *v3d, ARegion *ar, int winx, /* draw grease-pencil stuff - needed to get paint-buffer shown too (since it's 2D) */ draw_gpencil_view3d_ext(scene, ar, 0); - GPU_free_images(); + /* freeing the images again here could be done after the operator runs, leaving for now */ + GPU_free_images_anim(); /* restore size */ ar->winx= bwinx; diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c index 3d039f07a65..5c2fe184d65 100644 --- a/source/blender/editors/space_view3d/view3d_edit.c +++ b/source/blender/editors/space_view3d/view3d_edit.c @@ -1157,8 +1157,8 @@ static int viewzoom_invoke(bContext *C, wmOperator *op, wmEvent *event) else { /* Set y move = x move as MOUSEZOOM uses only x axis to pass magnification value */ - vod->origy = vod->oldy = event->x; - viewzoom_apply(vod, event->x, event->prevx, USER_ZOOM_DOLLY); + vod->origy = vod->oldy = vod->origy + event->x - event->prevx; + viewzoom_apply(vod, event->prevx, event->prevy, USER_ZOOM_DOLLY); } request_depth_update(CTX_wm_region_view3d(C)); diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index 9e20d3cfec3..499631ff755 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -4499,7 +4499,7 @@ static void clear_trans_object_base_flags(TransInfo *t) if(base->flag & BA_WAS_SEL) base->flag |= SELECT; - base->flag &= ~(BA_WAS_SEL|BA_HAS_RECALC_OB|BA_HAS_RECALC_DATA|BA_DO_IPO|BA_TRANSFORM_CHILD|BA_TRANSFORM_PARENT); + base->flag &= ~(BA_WAS_SEL|BA_HAS_RECALC_OB|BA_HAS_RECALC_DATA|BA_TEMP_TAG|BA_TRANSFORM_CHILD|BA_TRANSFORM_PARENT); } } diff --git a/source/blender/gpu/GPU_draw.h b/source/blender/gpu/GPU_draw.h index e233a3f3d94..92bf43e9a5a 100644 --- a/source/blender/gpu/GPU_draw.h +++ b/source/blender/gpu/GPU_draw.h @@ -117,6 +117,7 @@ int GPU_update_image_time(struct Image *ima, double time); int GPU_verify_image(struct Image *ima, struct ImageUser *iuser, int tftile, int tfmode, int compare, int mipmap); void GPU_free_image(struct Image *ima); void GPU_free_images(void); +void GPU_free_images_anim(void); /* smoke drawing functions */ void GPU_free_smoke(struct SmokeModifierData *smd); diff --git a/source/blender/gpu/intern/gpu_draw.c b/source/blender/gpu/intern/gpu_draw.c index 6eb3e13c4e2..9a5a6704428 100644 --- a/source/blender/gpu/intern/gpu_draw.c +++ b/source/blender/gpu/intern/gpu_draw.c @@ -851,6 +851,17 @@ void GPU_free_images(void) GPU_free_image(ima); } +/* same as above but only free animated images */ +void GPU_free_images_anim(void) +{ + Image* ima; + + if(G.main) + for(ima=G.main->image.first; ima; ima=ima->id.next) + if(ELEM(ima->type, IMA_SRC_SEQUENCE, IMA_SRC_MOVIE)) + GPU_free_image(ima); +} + /* OpenGL Materials */ #define FIXEDMAT 8 diff --git a/source/blender/imbuf/CMakeLists.txt b/source/blender/imbuf/CMakeLists.txt index 5af39cea832..98cb3dcefd9 100644 --- a/source/blender/imbuf/CMakeLists.txt +++ b/source/blender/imbuf/CMakeLists.txt @@ -28,13 +28,16 @@ FILE(GLOB SRC intern/*.c) SET(INC - . ../makesdna ../../../intern/guardedalloc ../../../intern/memutil ../blenlib - ../avi ../blenkernel + . + ../makesdna + ../../../intern/guardedalloc + ../../../intern/memutil + ../blenlib + ../avi + ../blenkernel ${JPEG_INC} ${PNG_INC} - ${TIFF_INC} ${ZLIB_INC} - ${OPENJPEG_INC} ) IF(WIN32) @@ -45,7 +48,13 @@ IF(WITH_OPENEXR) ADD_DEFINITIONS(-DWITH_OPENEXR) ENDIF(WITH_OPENEXR) +IF(WITH_TIFF) + SET(INC ${INC} ${TIFF_INCLUDE_DIR}) + ADD_DEFINITIONS(-DWITH_TIFF) +ENDIF(WITH_TIFF) + IF(WITH_OPENJPEG) + SET(INC ${INC} ${OPENJPEG_INC}) ADD_DEFINITIONS(-DWITH_OPENJPEG) ENDIF(WITH_OPENJPEG) diff --git a/source/blender/imbuf/IMB_thumbs.h b/source/blender/imbuf/IMB_thumbs.h index c7e39b9e0d7..68aa3c64299 100644 --- a/source/blender/imbuf/IMB_thumbs.h +++ b/source/blender/imbuf/IMB_thumbs.h @@ -50,13 +50,14 @@ typedef enum ThumbSize { typedef enum ThumbSource { THB_SOURCE_IMAGE, - THB_SOURCE_MOVIE + THB_SOURCE_MOVIE, + THB_SOURCE_BLEND } ThumbSource; // IB_metadata /* create thumbnail for file and returns new imbuf for thumbnail */ -ImBuf* IMB_thumb_create(const char* path, ThumbSize size, ThumbSource source); +ImBuf* IMB_thumb_create(const char* path, ThumbSize size, ThumbSource source, ImBuf *ibuf); /* read thumbnail for file and returns new imbuf for thumbnail */ ImBuf* IMB_thumb_read(const char* path, ThumbSize size); @@ -70,6 +71,10 @@ ImBuf* IMB_thumb_manage(const char* path, ThumbSize size, ThumbSource source); /* create the necessary dirs to store the thumbnails */ void IMB_thumb_makedirs(); +/* special function for loading a thumbnail embedded into a blend file */ +ImBuf *IMB_loadblend_thumb(const char *path); +void IMB_overlayblend_thumb(int *thumb, int width, int height, float aspect); + #endif /* _IMB_THUMBS_H */ diff --git a/source/blender/imbuf/SConscript b/source/blender/imbuf/SConscript index b4f56df9ec0..439cdecdf5b 100644 --- a/source/blender/imbuf/SConscript +++ b/source/blender/imbuf/SConscript @@ -20,6 +20,9 @@ if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'): if env['WITH_BF_OPENEXR']: defs.append('WITH_OPENEXR') +if env['WITH_BF_TIFF']: + defs.append('WITH_TIFF') + if env['WITH_BF_DDS']: defs.append('WITH_DDS') diff --git a/source/blender/imbuf/intern/Makefile b/source/blender/imbuf/intern/Makefile index 0f2020c799a..5f8029ddf72 100644 --- a/source/blender/imbuf/intern/Makefile +++ b/source/blender/imbuf/intern/Makefile @@ -61,7 +61,6 @@ CFLAGS += $(LEVEL_1_C_WARNINGS) CPPFLAGS += -I$(NAN_JPEG)/include CPPFLAGS += -I$(NAN_PNG)/include CPPFLAGS += -I$(NAN_ZLIB)/include -CPPFLAGS += -I$(NAN_TIFF)/include CPPFLAGS += -I../../include CPPFLAGS += -I../../blenkernel CPPFLAGS += -I../../blenlib @@ -85,3 +84,8 @@ ifeq ($(WITH_FFMPEG), true) CPPFLAGS += -DWITH_FFMPEG CPPFLAGS += $(NAN_FFMPEGCFLAGS) endif + +ifeq ($(WITH_TIFF), true) + CPPFLAGS += -DWITH_TIFF + CPPFLAGS += -I$(NAN_TIFF)/include +endif diff --git a/source/blender/imbuf/intern/anim.c b/source/blender/imbuf/intern/anim.c index bc0f9225fbc..2cb63b7274c 100644 --- a/source/blender/imbuf/intern/anim.c +++ b/source/blender/imbuf/intern/anim.c @@ -62,6 +62,7 @@ BLI_countlist BLI_stringdec */ #include "DNA_userdef_types.h" #include "BKE_global.h" +#include "BKE_depsgraph.h" #include "imbuf.h" diff --git a/source/blender/imbuf/intern/dynlibtiff.c b/source/blender/imbuf/intern/dynlibtiff.c deleted file mode 100644 index eb1b5f8e10a..00000000000 --- a/source/blender/imbuf/intern/dynlibtiff.c +++ /dev/null @@ -1,280 +0,0 @@ -/** - * Dynamically loaded libtiff support. - * - * This file is automatically generated by the gen_dynlibtiff.py script. - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Contributor(s): Jonathan Merritt. - * - * ***** END GPL LICENSE BLOCK ***** - */ - -/** - * To use the dynamic libtiff support, you must initialize the library using: - * libtiff_init() - * This attempts to load libtiff dynamically at runtime. G.have_libtiff will - * be set to indicate whether or not libtiff is available. If libtiff is - * not available, Blender can proceed with no ill effects, provided that - * it does not attempt to use any of the libtiff_ functions. When you're - * finished, close the library with: - * libtiff_exit() - * These functions are both declared in IMB_imbuf.h - * - * The functions provided by dyn_libtiff.h are the same as those in the - * normal static / shared libtiff, except that they are prefixed by the - * string "libtiff_" to indicate that they belong to a dynamically-loaded - * version. - */ -#include "dynlibtiff.h" - -#include -#include -#include - -#include "BLI_blenlib.h" - -#include "imbuf.h" -#include "IMB_imbuf.h" - -#include "BKE_global.h" -#include "PIL_dynlib.h" - -/********************* - * LOCAL DEFINITIONS * - *********************/ -PILdynlib *libtiff = NULL; -void libtiff_loadlibtiff(void); -void* libtiff_findsymbol(char*); -int libtiff_load_symbols(void); - - -/************************** - * LIBRARY INITIALIZATION * - **************************/ - -void libtiff_loadlibtiff(void) -{ - char *filename; - libtiff = NULL; - - filename = getenv("BF_TIFF_LIB"); - if (filename) libtiff = PIL_dynlib_open(filename); - if (libtiff != NULL) return; - - /* Try to find libtiff in a couple of standard places */ -#ifdef __APPLE__ - /* OSX has version specific library */ - //standard install location - libtiff = PIL_dynlib_open("/usr/local/lib/libtiff.dylib"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("/usr/local/lib/libtiff.3.dylib"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("/usr/local/lib/libtiff.4.dylib"); - if (libtiff != NULL) return; - //inside the blender app package contents/resources - libtiff = PIL_dynlib_open("@executable_path/../resources/libtiff.dylib"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("@executable_path/../resources/libtiff.3.dylib"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("@executable_path/../resources/libtiff.4.dylib"); - if (libtiff != NULL) return; - //inside the blender app package contents/frameworks - libtiff = PIL_dynlib_open("@executable_path/../frameworks/libtiff.dylib"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("@executable_path/../frameworks/libtiff.3.dylib"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("@executable_path/../frameworks/libtiff.4.dylib"); - if (libtiff != NULL) return; - //along side the blender app package - libtiff = PIL_dynlib_open("@executable_path/../../../libtiff.dylib"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("@executable_path/../../../libtiff.3.dylib"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("@executable_path/../../../libtiff.4.dylib"); - if (libtiff != NULL) return; - //inside the blender app package contents/MacOS - libtiff = PIL_dynlib_open("@executable_path/libtiff.dylib"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("@executable_path/libtiff.3.dylib"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("@executable_path/libtiff.4.dylib"); - if (libtiff != NULL) return; -#else - libtiff = PIL_dynlib_open("libtiff.so"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("libtiff.so.3"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("libtiff.so.4"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("libtiff.dll"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("/usr/lib/libtiff.so"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("/usr/lib/libtiff.so.3"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("/usr/lib/libtiff.so.4"); - if (libtiff != NULL) return; -#ifdef __x86_64__ - libtiff = PIL_dynlib_open("/usr/lib64/libtiff.so"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("/usr/lib64/libtiff.so.3"); - if (libtiff != NULL) return; - libtiff = PIL_dynlib_open("/usr/lib64/libtiff.so.4"); - if (libtiff != NULL) return; -#endif - libtiff = PIL_dynlib_open("/usr/local/lib/libtiff.so"); - if (libtiff != NULL) return; - /* For solaris */ - libtiff = PIL_dynlib_open("/usr/openwin/lib/libtiff.so"); -#endif - -} - -void *libtiff_findsymbol(char *name) -{ - void *symbol = NULL; - assert(libtiff != NULL); - symbol = PIL_dynlib_find_symbol(libtiff, name); - if (symbol == NULL) { - char *err = PIL_dynlib_get_error_as_string(libtiff); - - if (err) printf("libtiff_findsymbol: error %s\n",err); - else printf("libtiff_findsymbol: error Unknown.\n"); - - libtiff = NULL; - G.have_libtiff = (0); - return NULL; - } - return symbol; -} - -void libtiff_init(void) -{ - if (libtiff != NULL) { - printf("libtiff_init: Attempted to load libtiff twice!\n"); - return; - } - libtiff_loadlibtiff(); - G.have_libtiff = ((libtiff != NULL) && (libtiff_load_symbols())); - - if (!G.have_libtiff && (G.f & G_DEBUG)) { - printf("Unable to load: libtiff.\n"); - printf("Try setting the BF_TIFF_LIB environment variable if you want this support.\n"); - printf("Example: setenv BF_TIFF_LIB /usr/lib/libtiff.so\n"); - } -} - -void libtiff_exit(void) -{ - if (libtiff != NULL) { - PIL_dynlib_close(libtiff); - libtiff = NULL; - } -} - - -int libtiff_load_symbols(void) -{ - /* Attempt to load TIFFClientOpen */ - libtiff_TIFFClientOpen = libtiff_findsymbol("TIFFClientOpen"); - if (libtiff_TIFFClientOpen == NULL) { - return (0); - } - /* Attempt to load TIFFClose */ - libtiff_TIFFClose = libtiff_findsymbol("TIFFClose"); - if (libtiff_TIFFClose == NULL) { - return (0); - } - /* Attempt to load TIFFGetField */ - libtiff_TIFFGetField = libtiff_findsymbol("TIFFGetField"); - if (libtiff_TIFFGetField == NULL) { - return (0); - } - /* Attempt to load TIFFOpen */ - libtiff_TIFFOpen = libtiff_findsymbol("TIFFOpen"); - if (libtiff_TIFFOpen == NULL) { - return (0); - } - /* Attempt to load TIFFReadRGBAImage */ - libtiff_TIFFReadRGBAImage = libtiff_findsymbol("TIFFReadRGBAImage"); - if (libtiff_TIFFReadRGBAImage == NULL) { - return (0); - } - /* Attempt to load TIFFSetField */ - libtiff_TIFFSetField = libtiff_findsymbol("TIFFSetField"); - if (libtiff_TIFFSetField == NULL) { - return (0); - } - /* Attempt to load TIFFWriteEncodedStrip */ - libtiff_TIFFWriteEncodedStrip = libtiff_findsymbol("TIFFWriteEncodedStrip"); - if (libtiff_TIFFWriteEncodedStrip == NULL) { - return (0); - } - /* Attempt to load _TIFFfree */ - libtiff__TIFFfree = libtiff_findsymbol("_TIFFfree"); - if (libtiff__TIFFfree == NULL) { - return (0); - } - /* Attempt to load _TIFFmalloc */ - libtiff__TIFFmalloc = libtiff_findsymbol("_TIFFmalloc"); - if (libtiff__TIFFmalloc == NULL) { - return (0); - } - /* Attempt to load TIFFSetDirectory */ - libtiff_TIFFSetDirectory = libtiff_findsymbol("TIFFSetDirectory"); - if (libtiff_TIFFSetDirectory == NULL) { - return (0); - } - /* Attempt to load TIFFNumberOfDirectories */ - libtiff_TIFFNumberOfDirectories = libtiff_findsymbol("TIFFNumberOfDirectories"); - if (libtiff_TIFFNumberOfDirectories == NULL) { - return (0); - } - /* Attempt to load TIFFIsTiled */ - libtiff_TIFFIsTiled = libtiff_findsymbol("TIFFIsTiled"); - if (libtiff_TIFFIsTiled == NULL) { - return (0); - } - /* Attempt to load TIFFReadRGBATile */ - libtiff_TIFFReadRGBATile = libtiff_findsymbol("TIFFReadRGBATile"); - if (libtiff_TIFFReadRGBATile == NULL) { - return (0); - } - return (1); -} - - -/******************* - * SYMBOL POINTERS * - *******************/ - -TIFF* (*libtiff_TIFFClientOpen)(const char*, const char*, thandle_t, TIFFReadWriteProc, TIFFReadWriteProc, TIFFSeekProc, TIFFCloseProc, TIFFSizeProc, TIFFMapFileProc, TIFFUnmapFileProc) = NULL; -void (*libtiff_TIFFClose)(TIFF*) = NULL; -int (*libtiff_TIFFGetField)(TIFF*, ttag_t, ...) = NULL; -TIFF* (*libtiff_TIFFOpen)(const char*, const char*) = NULL; -int (*libtiff_TIFFReadRGBAImage)(TIFF*, uint32, uint32, uint32*, int) = NULL; -int (*libtiff_TIFFSetField)(TIFF*, ttag_t, ...) = NULL; -tsize_t (*libtiff_TIFFWriteEncodedStrip)(TIFF*, tstrip_t, tdata_t, tsize_t) = NULL; -void (*libtiff__TIFFfree)(tdata_t) = NULL; -tdata_t (*libtiff__TIFFmalloc)(tsize_t) = NULL; -int (*libtiff_TIFFSetDirectory)(TIFF*, tdir_t) = NULL; -tdir_t (*libtiff_TIFFNumberOfDirectories)(TIFF*) = NULL; -int (*libtiff_TIFFIsTiled)(TIFF*) = NULL; -int (*libtiff_TIFFReadRGBATile)(TIFF*, uint32, uint32, uint32 * ) = NULL; - - diff --git a/source/blender/imbuf/intern/dynlibtiff.h b/source/blender/imbuf/intern/dynlibtiff.h deleted file mode 100644 index 5fafafbcf94..00000000000 --- a/source/blender/imbuf/intern/dynlibtiff.h +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Dynamically loaded libtiff support. - * - * This file is automatically generated by the gen_dynlibtiff.py script. - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Contributor(s): Jonathan Merritt. - * - * ***** END GPL LICENSE BLOCK ***** - */ - -/** - * To use the dynamic libtiff support, you must initialize the library using: - * libtiff_init() - * This attempts to load libtiff dynamically at runtime. G.have_libtiff will - * be set to indicate whether or not libtiff is available. If libtiff is - * not available, Blender can proceed with no ill effects, provided that - * it does not attempt to use any of the libtiff_ functions. When you're - * finished, close the library with: - * libtiff_exit() - * These functions are both declared in IMB_imbuf.h - * - * The functions provided by dyn_libtiff.h are the same as those in the - * normal static / shared libtiff, except that they are prefixed by the - * string "libtiff_" to indicate that they belong to a dynamically-loaded - * version. - */ -#ifndef DYN_LIBTIFF_H -#include "tiffio.h" -extern TIFF* (*libtiff_TIFFClientOpen)(const char*, const char*, thandle_t, TIFFReadWriteProc, TIFFReadWriteProc, TIFFSeekProc, TIFFCloseProc, TIFFSizeProc, TIFFMapFileProc, TIFFUnmapFileProc); -extern void (*libtiff_TIFFClose)(TIFF*); -extern int (*libtiff_TIFFGetField)(TIFF*, ttag_t, ...); -extern TIFF* (*libtiff_TIFFOpen)(const char*, const char*); -extern int (*libtiff_TIFFReadRGBAImage)(TIFF*, uint32, uint32, uint32*, int); -extern int (*libtiff_TIFFSetField)(TIFF*, ttag_t, ...); -extern tsize_t (*libtiff_TIFFWriteEncodedStrip)(TIFF*, tstrip_t, tdata_t, tsize_t); -extern void (*libtiff__TIFFfree)(tdata_t); -extern tdata_t (*libtiff__TIFFmalloc)(tsize_t); -extern int (*libtiff_TIFFSetDirectory)(TIFF*, tdir_t); -extern tdir_t (*libtiff_TIFFNumberOfDirectories)(TIFF*); -extern int (*libtiff_TIFFIsTiled)(TIFF*); -extern int (*libtiff_TIFFReadRGBATile)(TIFF*, uint32, uint32, uint32 * ); -#endif /* DYN_LIBTIFF_H */ - diff --git a/source/blender/imbuf/intern/filetype.c b/source/blender/imbuf/intern/filetype.c index 4a491ceba22..a0ff4476556 100644 --- a/source/blender/imbuf/intern/filetype.c +++ b/source/blender/imbuf/intern/filetype.c @@ -65,10 +65,10 @@ ImFileType IMB_FILE_TYPES[]= { {NULL, NULL, imb_is_a_targa, imb_ftype_default, imb_loadtarga, imb_savetarga, NULL, 0, TGA}, {NULL, NULL, imb_is_dpx, imb_ftype_default, imb_loaddpx, imb_save_dpx, NULL, IM_FTYPE_FLOAT, DPX}, {NULL, NULL, imb_is_cineon, imb_ftype_default, imb_loadcineon, imb_savecineon, NULL, IM_FTYPE_FLOAT, CINEON}, -#if defined(__APPLE__) && defined(IMBUF_COCOA) +#ifdef WITH_TIFF + {NULL, NULL, imb_is_a_tiff, imb_ftype_default, imb_loadtiff, imb_savetiff, imb_loadtiletiff, 0, TIF}, +#elif defined(__APPLE__) && defined(IMBUF_COCOA) {NULL, NULL, imb_is_a_cocoa, imb_ftype_cocoa, imb_imb_cocoaLoadImage, imb_savecocoa, NULL, 0, TIF}, -#else - {libtiff_init, libtiff_exit, imb_is_a_tiff, imb_ftype_default, imb_loadtiff, imb_savetiff, imb_loadtiletiff, 0, TIF}, #endif {NULL, NULL, imb_is_a_hdr, imb_ftype_default, imb_loadhdr, imb_savehdr, NULL, IM_FTYPE_FLOAT, RADHDR}, #ifdef WITH_OPENEXR diff --git a/source/blender/imbuf/intern/openexr/openexr_api.cpp b/source/blender/imbuf/intern/openexr/openexr_api.cpp index bc8cf8aa795..fd505115994 100644 --- a/source/blender/imbuf/intern/openexr/openexr_api.cpp +++ b/source/blender/imbuf/intern/openexr/openexr_api.cpp @@ -462,8 +462,8 @@ void IMB_exr_begin_write(void *handle, char *filename, int width, int height, in openexr_header_compression(&header, compress); // openexr_header_metadata(&header, ibuf); // no imbuf. cant write /* header.lineOrder() = DECREASING_Y; this crashes in windows for file read! */ - - header.insert ("BlenderMultiChannel", StringAttribute ("Blender V2.52.5")); + + header.insert ("BlenderMultiChannel", StringAttribute ("Blender V2.43 and newer")); data->ofile = new OutputFile(filename, header); } @@ -471,22 +471,9 @@ void IMB_exr_begin_write(void *handle, char *filename, int width, int height, in void IMB_exrtile_begin_write(void *handle, char *filename, int mipmap, int width, int height, int tilex, int tiley) { ExrHandle *data= (ExrHandle *)handle; - Header *header; + Header header (width, height); ExrChannel *echan; - /* open exr specify tiles must allign with top left frame coord but blender - render with tiles alligned to the bottom left. We work around this by saving - the whole area covered by the tyles (the data window) and defining a display - window that cover only the rendered area */ - - int ntx = ceil((float)width/tilex); - int nty = ceil((float)height/tiley); - Box2i dispw(V2i(0,0), V2i(width-1, height-1)); - Box2i dataw(V2i( width -(ntx*tilex) , height -(nty*tiley) ), V2i(ntx*tilex-1, height-1)); - V2f swc(0.0f, 0.0f); - header = new Header(dispw, dataw, 1.0, swc, 1, RANDOM_Y, RLE_COMPRESSION); - - data->tilex= tilex; data->tiley= tiley; data->width= width; @@ -494,17 +481,15 @@ void IMB_exrtile_begin_write(void *handle, char *filename, int mipmap, int width data->mipmap= mipmap; for(echan= (ExrChannel *)data->channels.first; echan; echan= echan->next) - header->channels().insert (echan->name, Channel (FLOAT)); + header.channels().insert (echan->name, Channel (FLOAT)); - header->setTileDescription (TileDescription (tilex, tiley, (mipmap)? MIPMAP_LEVELS: ONE_LEVEL)); - header->lineOrder() = RANDOM_Y; - header->compression() = RLE_COMPRESSION; + header.setTileDescription (TileDescription (tilex, tiley, (mipmap)? MIPMAP_LEVELS: ONE_LEVEL)); + header.lineOrder() = RANDOM_Y; + header.compression() = RLE_COMPRESSION; - header->insert ("BlenderMultiChannel", StringAttribute ("Blender V2.52.5")); - - data->tofile = new TiledOutputFile(filename, *header); - - delete header; + header.insert ("BlenderMultiChannel", StringAttribute ("Blender V2.43")); + + data->tofile = new TiledOutputFile(filename, header); } /* read from file */ @@ -515,7 +500,7 @@ int IMB_exr_begin_read(void *handle, char *filename, int *width, int *height) if(BLI_exists(filename) && BLI_filepathsize(filename)>32) { /* 32 is arbitrary, but zero length files crashes exr */ data->ifile = new InputFile(filename); if(data->ifile) { - Box2i dw = data->ifile->header().displayWindow(); + Box2i dw = data->ifile->header().dataWindow(); data->width= *width = dw.max.x - dw.min.x + 1; data->height= *height = dw.max.y - dw.min.y + 1; @@ -569,32 +554,19 @@ void IMB_exrtile_write_channels(void *handle, int partx, int party, int level) ExrHandle *data= (ExrHandle *)handle; FrameBuffer frameBuffer; ExrChannel *echan; - float *rect; - int xs, ys; - int x, y; for(echan= (ExrChannel *)data->channels.first; echan; echan= echan->next) { + float *rect= echan->rect - echan->xstride*partx - echan->ystride*party; - /* coordinates for relative tile coordinates, starting from top of tile, - striding left->right, top->bottom */ - rect= echan->rect + (data->tiley-1)*echan->ystride; - xs = echan->xstride*sizeof(float); - ys = -echan->ystride*sizeof(float); - frameBuffer.insert (echan->name, Slice (FLOAT, (char *)rect, - xs, ys, //xStride, yStride - 1, 1, 0.0, // xSampling, ySampling, fillValue - true, true) ); // xTileCoords, yTileCoords (use relative tile coords) + echan->xstride*sizeof(float), echan->ystride*sizeof(float))); } data->tofile->setFrameBuffer (frameBuffer); - x = partx/data->tilex; - /* flip tile grid vertically to conform to EXR coordinate system */ - y = ceil((float)data->height/data->tiley) - (party/data->tiley) - 1; - try { - data->tofile->writeTile (x, y, level); + // printf("write tile %d %d\n", partx/data->tilex, party/data->tiley); + data->tofile->writeTile (partx/data->tilex, party/data->tiley, level); } catch (const std::exception &exc) { std::cerr << "OpenEXR-writeTile: ERROR: " << exc.what() << std::endl; @@ -608,12 +580,9 @@ void IMB_exr_write_channels(void *handle) ExrChannel *echan; if(data->channels.first) { - for(echan= (ExrChannel *)data->channels.first; echan; echan= echan->next) { - float *rect = echan->rect + echan->xstride*(data->height-1)*data->width; - - frameBuffer.insert (echan->name, Slice (FLOAT, (char *)rect, - echan->xstride*sizeof(float), -echan->ystride*sizeof(float))); - } + for(echan= (ExrChannel *)data->channels.first; echan; echan= echan->next) + frameBuffer.insert (echan->name, Slice (FLOAT, (char *)echan->rect, + echan->xstride*sizeof(float), echan->ystride*sizeof(float))); data->ofile->setFrameBuffer (frameBuffer); try { @@ -633,21 +602,12 @@ void IMB_exr_read_channels(void *handle) ExrHandle *data= (ExrHandle *)handle; FrameBuffer frameBuffer; ExrChannel *echan; - - /* check if exr was save with previous version of blender which flipped images */ - const StringAttribute *ta = data->ifile->header().findTypedAttribute ("BlenderMultiChannel"); - short flip = (ta && strncmp(ta->value().c_str(), "Blender V2.43", 13)==0); /* 'Blender V2.43 and newer' is covered too */ - + for(echan= (ExrChannel *)data->channels.first; echan; echan= echan->next) { /* no datawindow correction needed */ - if(echan->rect) { - if(flip) - frameBuffer.insert (echan->name, Slice (FLOAT, (char *)echan->rect, + if(echan->rect) + frameBuffer.insert (echan->name, Slice (FLOAT, (char *)echan->rect, echan->xstride*sizeof(float), echan->ystride*sizeof(float))); - else - frameBuffer.insert (echan->name, Slice (FLOAT, (char *)(echan->rect + echan->xstride*(data->height-1)*data->width), - echan->xstride*sizeof(float), -echan->ystride*sizeof(float))); - } else printf("warning, channel with no rect set %s\n", echan->name); } diff --git a/source/blender/imbuf/intern/thumbs.c b/source/blender/imbuf/intern/thumbs.c index 45fbf49dbbd..1cdeb602f0f 100644 --- a/source/blender/imbuf/intern/thumbs.c +++ b/source/blender/imbuf/intern/thumbs.c @@ -241,9 +241,8 @@ void IMB_thumb_makedirs() } /* create thumbnail for file and returns new imbuf for thumbnail */ -ImBuf* IMB_thumb_create(const char* path, ThumbSize size, ThumbSource source) +ImBuf* IMB_thumb_create(const char* path, ThumbSize size, ThumbSource source, ImBuf *img) { - ImBuf *img = 0; char uri[URI_MAX]; char desc[URI_MAX+22]; char tpath[FILE_MAX]; @@ -285,8 +284,18 @@ ImBuf* IMB_thumb_create(const char* path, ThumbSize size, ThumbSource source) img = IMB_allocImBuf(0,0,32, IB_rect | IB_metadata, 0); if (!img) return 0; } else { - if (THB_SOURCE_IMAGE == source) { - img = IMB_loadiffname(path, IB_rect | IB_metadata); + if (THB_SOURCE_IMAGE == source || THB_SOURCE_BLEND == source) { + + /* only load if we didnt give an image */ + if(img==NULL) { + if(THB_SOURCE_BLEND == source) { + img = IMB_loadblend_thumb(path); + } + else { + img = IMB_loadiffname(path, IB_rect | IB_metadata); + } + } + if (img != NULL) { stat(path, &info); sprintf(mtime, "%ld", info.st_mtime); @@ -339,6 +348,8 @@ ImBuf* IMB_thumb_create(const char* path, ThumbSize size, ThumbSource source) #ifndef WIN32 chmod(temp, S_IRUSR | S_IWUSR); #endif + printf("Saving: %s\n", tpath); + BLI_rename(temp, tpath); } @@ -425,10 +436,10 @@ ImBuf* IMB_thumb_manage(const char* path, ThumbSize size, ThumbSource source) IMB_thumb_delete(path, THB_NORMAL); IMB_thumb_delete(path, THB_LARGE); IMB_thumb_delete(path, THB_FAIL); - img = IMB_thumb_create(path, size, source); + img = IMB_thumb_create(path, size, source, NULL); if(!img){ /* thumb creation failed, write fail thumb */ - img = IMB_thumb_create(path, THB_FAIL, source); + img = IMB_thumb_create(path, THB_FAIL, source, NULL); if (img) { /* we don't need failed thumb anymore */ IMB_freeImBuf(img); @@ -438,10 +449,10 @@ ImBuf* IMB_thumb_manage(const char* path, ThumbSize size, ThumbSource source) } } } else { - img = IMB_thumb_create(path, size, source); + img = IMB_thumb_create(path, size, source, NULL); if(!img){ /* thumb creation failed, write fail thumb */ - img = IMB_thumb_create(path, THB_FAIL, source); + img = IMB_thumb_create(path, THB_FAIL, source, NULL); if (img) { /* we don't need failed thumb anymore */ IMB_freeImBuf(img); diff --git a/source/blender/imbuf/intern/thumbs_blend.c b/source/blender/imbuf/intern/thumbs_blend.c new file mode 100644 index 00000000000..9df27f6f969 --- /dev/null +++ b/source/blender/imbuf/intern/thumbs_blend.c @@ -0,0 +1,185 @@ +/** + * $Id: + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): Campbell Barton. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include + +#include "zlib.h" + +#include "BKE_utildefines.h" +#include "BKE_global.h" + +#include "IMB_imbuf_types.h" +#include "IMB_imbuf.h" +#include "IMB_thumbs.h" + +#include "MEM_guardedalloc.h" + +/* extracts the thumbnail from between the 'REND' and the 'GLOB' + * chunks of the header, dont use typical blend loader because its too slow */ +ImBuf *IMB_loadblend_thumb(const char *path) +{ + char buf[8]; + int code= 0; + char endian, pointer_size; + char endian_switch; + int len, im_len, x, y; + int *rect= NULL; + + gzFile gzfile; + + ImBuf *img; + + /* not necessarily a gzip */ + gzfile = gzopen(path, "rb"); + + if (NULL == gzfile ) { + return NULL; + } + + /* read the blend file header */ + if(gzread(gzfile, buf, 8) != 8) goto thumb_error; + if(strncmp(buf, "BLENDER", 7)) goto thumb_error; + + if(buf[7]=='-') pointer_size= 8; + else if(buf[7]=='_') pointer_size= 4; + else goto thumb_error; + + /* read the next 4 bytes, only need the first char, ignore the version */ + /* endian and vertsion (ignored) */ + if(gzread(gzfile, buf, 4) != 4) goto thumb_error; + + if(buf[0]=='V') endian= B_ENDIAN; /* big: PPC */ + else if(buf[0]=='v') endian= L_ENDIAN; /* little: x86 */ + else goto thumb_error; + + while(gzread(gzfile, &code, sizeof(int)) == sizeof(int)) { + endian_switch = ((ENDIAN_ORDER != endian)) ? 1 : 0; + + if(gzread(gzfile, buf, sizeof(int)) != sizeof(int)) goto thumb_error; + len = *( (int *)((void *)buf) ); + if(endian_switch) SWITCH_INT(len); + + /* finally read the rest of the bhead struct, pointer and 2 ints */ + if(gzread(gzfile, buf, pointer_size) != pointer_size) goto thumb_error; + if(gzread(gzfile, buf, sizeof(int) * 2) != sizeof(int) * 2) goto thumb_error; + /* we dont actually care whats in the bhead */ + + if (code==REND) { + gzseek(gzfile, len, SEEK_CUR); /* skip to the next */ + } + else { + break; + } + } + + /* using 'TEST' since new names segfault when loading in old blenders */ + if(code != TEST) goto thumb_error; + + if(gzread(gzfile, &x, sizeof(int)) != sizeof(int)) goto thumb_error; + if(gzread(gzfile, &y, sizeof(int)) != sizeof(int)) goto thumb_error; + len -= sizeof(int) * 2; + + if(endian_switch) { SWITCH_INT(x); SWITCH_INT(y); } + + /* inconsistant image size, quit early */ + im_len = x * y * sizeof(int); + if(im_len != len) goto thumb_error; + + /* finally malloc and read the data */ + rect= MEM_mallocN(len, "imb_loadblend_thumb"); + + if(gzread(gzfile, rect, len) != len) goto thumb_error; + + /* read ok! */ + gzclose(gzfile); + + img = IMB_allocImBuf(x, y, 32, IB_rect | IB_metadata, 0); + + memcpy(img->rect, rect, im_len); + + MEM_freeN(rect); + + return img; + +thumb_error: + gzclose(gzfile); + if(rect) MEM_freeN(rect); + return NULL; +} + +/* add a fake passepartout overlay to a byte buffer, use for blend file thumbnails */ +#define MARGIN 2 + +void IMB_overlayblend_thumb(int *thumb, int width, int height, float aspect) +{ + unsigned char *px= (unsigned char *)thumb; + int margin_l = MARGIN; + int margin_b = MARGIN; + int margin_r = width - MARGIN; + int margin_t = height - MARGIN; + + if(aspect < 1.0f) { + margin_l= (int)((width - ((float)width * aspect)) / 2.0f); + margin_l += MARGIN; + CLAMP(margin_l, MARGIN, (width/2)); + margin_r = width - margin_l; + } + else if (aspect > 1.0f) { + margin_b= (int)((height - ((float)height / aspect)) / 2.0f); + margin_b += MARGIN; + CLAMP(margin_b, MARGIN, (height/2)); + margin_t = height - margin_b; + } + + { + int x, y; + int hline, vline; + int stride_x= (margin_r - margin_l) - 2; + + for(y=0; y < height; y++) { + for(x=0; x < width; x++, px+=4) { + if((x > margin_l && x < margin_r) && (y > margin_b && y < margin_t)) { + /* interior. skip */ + x += stride_x; + px += stride_x * 4; + } else if( (hline=(((x == margin_l || x == margin_r)) && y >= margin_b && y <= margin_t)) || + (vline=(((y == margin_b || y == margin_t)) && x >= margin_l && x <= margin_r)) + ) { + /* dashed line */ + if((hline && y % 2) || (vline && x % 2)) { + px[0]= px[1]= px[2]= 0; + px[3] = 255; + } + } + else { + /* outside, fill in alpha, like passepartout */ + px[0] *= 0.5f; + px[1] *= 0.5f; + px[2] *= 0.5f; + px[3] = (px[3] * 0.5f) + 96; + } + } + } + } +} diff --git a/source/blender/imbuf/intern/tiff.c b/source/blender/imbuf/intern/tiff.c index 3bc3f616da0..488340aec88 100644 --- a/source/blender/imbuf/intern/tiff.c +++ b/source/blender/imbuf/intern/tiff.c @@ -40,10 +40,12 @@ * used to compress images. */ +#ifdef WITH_TIFF + #include #include "imbuf.h" - + #include "BKE_global.h" #include "BKE_utildefines.h" @@ -57,7 +59,7 @@ #include "IMB_filetype.h" #include "IMB_filter.h" -#include "dynlibtiff.h" +#include "tiffio.h" @@ -267,7 +269,7 @@ static TIFF *imb_tiff_client_open(ImbTIFFMemFile *memFile, unsigned char *mem, i memFile->offset = 0; memFile->size = size; - return libtiff_TIFFClientOpen("(Blender TIFF Interface Layer)", + return TIFFClientOpen("(Blender TIFF Interface Layer)", "r", (thandle_t)(memFile), imb_tiff_ReadProc, imb_tiff_WriteProc, imb_tiff_SeekProc, imb_tiff_CloseProc, @@ -299,16 +301,77 @@ int imb_is_a_tiff(unsigned char *mem) (memcmp(lil_endian, mem, IMB_TIFF_NCB) == 0) ); } -static int imb_read_tiff_pixels(ImBuf *ibuf, TIFF *image, int premul) +static void scanline_contig_8bit(unsigned char *rect, unsigned char *cbuf, int scanline_w, int spp) +{ + int i; + for (i=0; i < scanline_w; i++) { + rect[i*4 + 0] = cbuf[i*spp + 0]; + rect[i*4 + 1] = cbuf[i*spp + 1]; + rect[i*4 + 2] = cbuf[i*spp + 2]; + rect[i*4 + 3] = (spp==4)?cbuf[i*spp + 3]:255; + } +} + +static void scanline_contig_16bit(float *rectf, unsigned short *sbuf, int scanline_w, int spp) +{ + int i; + for (i=0; i < scanline_w; i++) { + rectf[i*4 + 0] = sbuf[i*spp + 0] / 65535.0; + rectf[i*4 + 1] = sbuf[i*spp + 1] / 65535.0; + rectf[i*4 + 2] = sbuf[i*spp + 2] / 65535.0; + rectf[i*4 + 3] = (spp==4)?(sbuf[i*spp + 3] / 65535.0):1.0; + } +} + +static void scanline_contig_32bit(float *rectf, float *fbuf, int scanline_w, int spp) +{ + int i; + for (i=0; i < scanline_w; i++) { + rectf[i*4 + 0] = fbuf[i*spp + 0]; + rectf[i*4 + 1] = fbuf[i*spp + 1]; + rectf[i*4 + 2] = fbuf[i*spp + 2]; + rectf[i*4 + 3] = (spp==4)?fbuf[i*spp + 3]:1.0; + } +} + +static void scanline_separate_8bit(unsigned char *rect, unsigned char *cbuf, int scanline_w, int chan) +{ + int i; + for (i=0; i < scanline_w; i++) + rect[i*4 + chan] = cbuf[i]; +} + +static void scanline_separate_16bit(float *rectf, unsigned short *sbuf, int scanline_w, int chan) +{ + int i; + for (i=0; i < scanline_w; i++) + rectf[i*4 + chan] = sbuf[i] / 65535.0; +} + +static void scanline_separate_32bit(float *rectf, float *fbuf, int scanline_w, int chan) +{ + int i; + for (i=0; i < scanline_w; i++) + rectf[i*4 + chan] = fbuf[i]; +} + + +/* + * Use the libTIFF RGBAImage API to read a TIFF image. + * This function uses the "RGBA Image" support from libtiff, which enables + * it to load most commonly-encountered TIFF formats. libtiff handles format + * conversion, color depth conversion, etc. + */ +static int imb_read_tiff_pixels_rgba(ImBuf *ibuf, TIFF *image, int premul) { ImBuf *tmpibuf; int success; - + tmpibuf= IMB_allocImBuf(ibuf->x, ibuf->y, 32, IB_rect, 0); - success= libtiff_TIFFReadRGBAImage(image, ibuf->x, ibuf->y, tmpibuf->rect, 0); + success= TIFFReadRGBAImage(image, ibuf->x, ibuf->y, tmpibuf->rect, 0); if(ENDIAN_ORDER == B_ENDIAN) - IMB_convert_rgba_to_abgr(tmpibuf); + IMB_convert_rgba_to_abgr(tmpibuf); if(premul) { IMB_premultiply_alpha(tmpibuf); ibuf->flags |= IB_premul; @@ -325,12 +388,133 @@ static int imb_read_tiff_pixels(ImBuf *ibuf, TIFF *image, int premul) return success; } +/* + * Use the libTIFF scanline API to read a TIFF image. + * This method is most flexible and can handle multiple different bit depths + * and RGB channel orderings. + */ +static int imb_read_tiff_pixels(ImBuf *ibuf, TIFF *image, int premul) +{ + ImBuf *tmpibuf; + int success; + short bitspersample, spp, config; + size_t scanline; + int ib_flag=0, row, chan; + float *fbuf=NULL; + unsigned short *sbuf=NULL; + unsigned char *cbuf=NULL; + + TIFFGetField(image, TIFFTAG_BITSPERSAMPLE, &bitspersample); + TIFFGetField(image, TIFFTAG_SAMPLESPERPIXEL, &spp); /* number of 'channels' */ + TIFFGetField(image, TIFFTAG_PLANARCONFIG, &config); + scanline = TIFFScanlineSize(image); + + /* if file has an unsupported channel count, use libTIFF to + * convert to an 8 bit RGBA image */ + if (!ELEM(spp, 3, 4)) + return imb_read_tiff_pixels_rgba(ibuf, image, premul); + + + if (bitspersample == 32) { + ib_flag = IB_rectfloat; + fbuf = (float *)_TIFFmalloc(scanline); + } else if (bitspersample == 16) { + ib_flag = IB_rectfloat; + sbuf = (unsigned short *)_TIFFmalloc(scanline); + } else if (bitspersample == 8) { + ib_flag = IB_rect; + cbuf = (unsigned char *)_TIFFmalloc(scanline); + } + + tmpibuf= IMB_allocImBuf(ibuf->x, ibuf->y, ibuf->depth, ib_flag, 0); + + /* contiguous channels: RGBRGBRGB */ + if (config == PLANARCONFIG_CONTIG) { + for (row = 0; row < ibuf->y; row++) { + int ib_offset = ibuf->x*ibuf->y*4 - ibuf->x*4 * (row+1); + + if (bitspersample == 32) { + success = TIFFReadScanline(image, fbuf, row, 0); + scanline_contig_32bit(tmpibuf->rect_float+ib_offset, fbuf, ibuf->x, spp); + + } else if (bitspersample == 16) { + success = TIFFReadScanline(image, sbuf, row, 0); + scanline_contig_16bit(tmpibuf->rect_float+ib_offset, sbuf, ibuf->x, spp); + + } else if (bitspersample == 8) { + unsigned char *crect = (unsigned char*)tmpibuf->rect; + success = TIFFReadScanline(image, cbuf, row, 0); + scanline_contig_8bit(crect+ib_offset, cbuf, ibuf->x, spp); + } + } + /* separate channels: RRRGGGBBB */ + } else if (config == PLANARCONFIG_SEPARATE) { + + /* imbufs always have 4 channels of data, so we iterate over all of them + * but only fill in from the TIFF scanline where necessary. */ + for (chan = 0; chan < 4; chan++) { + for (row = 0; row < ibuf->y; row++) { + int ib_offset = ibuf->x*ibuf->y*4 - ibuf->x*4 * (row+1); + + if (bitspersample == 32) { + if (chan == 3 && spp == 3) /* fill alpha if only RGB TIFF */ + memset(fbuf, 1.0, sizeof(fbuf)); + else + success = TIFFReadScanline(image, fbuf, row, chan); + scanline_separate_32bit(tmpibuf->rect_float+ib_offset, fbuf, ibuf->x, chan); + + } else if (bitspersample == 16) { + if (chan == 3 && spp == 3) /* fill alpha if only RGB TIFF */ + memset(sbuf, 65535, sizeof(sbuf)); + else + success = TIFFReadScanline(image, sbuf, row, chan); + scanline_separate_16bit(tmpibuf->rect_float+ib_offset, sbuf, ibuf->x, chan); + + } else if (bitspersample == 8) { + unsigned char *crect = (unsigned char*)tmpibuf->rect; + if (chan == 3 && spp == 3) /* fill alpha if only RGB TIFF */ + memset(cbuf, 255, sizeof(cbuf)); + else + success = TIFFReadScanline(image, cbuf, row, chan); + scanline_separate_8bit(crect+ib_offset, cbuf, ibuf->x, chan); + } + } + } + } + + ibuf->profile = (bitspersample==32)?IB_PROFILE_LINEAR_RGB:IB_PROFILE_SRGB; + + if (bitspersample == 32) + _TIFFfree(fbuf); + else if (bitspersample == 16) + _TIFFfree(sbuf); + else if (bitspersample == 8) + _TIFFfree(cbuf); + + if(ENDIAN_ORDER == B_ENDIAN) + IMB_convert_rgba_to_abgr(tmpibuf); + if(premul) { + IMB_premultiply_alpha(tmpibuf); + ibuf->flags |= IB_premul; + } + + /* assign rect last */ + if (tmpibuf->rect_float) + ibuf->rect_float= tmpibuf->rect_float; + else + ibuf->rect= tmpibuf->rect; + ibuf->mall |= ib_flag; + ibuf->flags |= ib_flag; + + tmpibuf->mall &= ~ib_flag; + IMB_freeImBuf(tmpibuf); + + return success; +} + /** * Loads a TIFF file. * - * This function uses the "RGBA Image" support from libtiff, which enables - * it to load most commonly-encountered TIFF formats. libtiff handles format - * conversion, color depth conversion, etc. * * @param mem: Memory containing the TIFF file. * @param size: Size of the mem buffer. @@ -347,9 +531,8 @@ ImBuf *imb_loadtiff(unsigned char *mem, int size, int flags) uint32 width, height; char *format = NULL; int level; - - if(!G.have_libtiff) - return NULL; + short spp; + int ib_depth; /* check whether or not we have a TIFF file */ if(size < IMB_TIFF_NCB) { @@ -367,24 +550,27 @@ ImBuf *imb_loadtiff(unsigned char *mem, int size, int flags) } /* allocate the image buffer */ - libtiff_TIFFGetField(image, TIFFTAG_IMAGEWIDTH, &width); - libtiff_TIFFGetField(image, TIFFTAG_IMAGELENGTH, &height); - ibuf = IMB_allocImBuf(width, height, 32, 0, 0); + TIFFGetField(image, TIFFTAG_IMAGEWIDTH, &width); + TIFFGetField(image, TIFFTAG_IMAGELENGTH, &height); + TIFFGetField(image, TIFFTAG_SAMPLESPERPIXEL, &spp); + + ib_depth = (spp==3)?24:32; + + ibuf = IMB_allocImBuf(width, height, ib_depth, 0, 0); if(ibuf) { ibuf->ftype = TIF; - ibuf->profile = IB_PROFILE_SRGB; } else { fprintf(stderr, "imb_loadtiff: could not allocate memory for TIFF " \ "image.\n"); - libtiff_TIFFClose(image); + TIFFClose(image); return NULL; } /* if testing, we're done */ if(flags & IB_test) { - libtiff_TIFFClose(image); + TIFFClose(image); return ibuf; } @@ -392,14 +578,14 @@ ImBuf *imb_loadtiff(unsigned char *mem, int size, int flags) we don't read pixels but leave it to the cache to load tiles */ if(flags & IB_tilecache) { format= NULL; - libtiff_TIFFGetField(image, TIFFTAG_PIXAR_TEXTUREFORMAT, &format); + TIFFGetField(image, TIFFTAG_PIXAR_TEXTUREFORMAT, &format); - if(format && strcmp(format, "Plain Texture")==0 && libtiff_TIFFIsTiled(image)) { - int numlevel = libtiff_TIFFNumberOfDirectories(image); + if(format && strcmp(format, "Plain Texture")==0 && TIFFIsTiled(image)) { + int numlevel = TIFFNumberOfDirectories(image); /* create empty mipmap levels in advance */ for(level=0; level 0) { @@ -408,7 +594,6 @@ ImBuf *imb_loadtiff(unsigned char *mem, int size, int flags) hbuf= IMB_allocImBuf(width, height, 32, 0, 0); hbuf->miplevel= level; - hbuf->flags |= IB_tilecache; hbuf->ftype= ibuf->ftype; ibuf->mipmap[level-1] = hbuf; @@ -418,8 +603,10 @@ ImBuf *imb_loadtiff(unsigned char *mem, int size, int flags) else hbuf= ibuf; - libtiff_TIFFGetField(image, TIFFTAG_TILEWIDTH, &hbuf->tilex); - libtiff_TIFFGetField(image, TIFFTAG_TILELENGTH, &hbuf->tiley); + hbuf->flags |= IB_tilecache; + + TIFFGetField(image, TIFFTAG_TILEWIDTH, &hbuf->tilex); + TIFFGetField(image, TIFFTAG_TILELENGTH, &hbuf->tiley); hbuf->xtiles= ceil(hbuf->x/(float)hbuf->tilex); hbuf->ytiles= ceil(hbuf->y/(float)hbuf->tiley); @@ -434,12 +621,12 @@ ImBuf *imb_loadtiff(unsigned char *mem, int size, int flags) /* read pixels */ if(!(ibuf->flags & IB_tilecache) && !imb_read_tiff_pixels(ibuf, image, 0)) { fprintf(stderr, "imb_loadtiff: Failed to read tiff image.\n"); - libtiff_TIFFClose(image); + TIFFClose(image); return NULL; } /* close the client layer interface to the in-memory file */ - libtiff_TIFFClose(image); + TIFFClose(image); /* return successfully */ return ibuf; @@ -458,15 +645,15 @@ void imb_loadtiletiff(ImBuf *ibuf, unsigned char *mem, int size, int tx, int ty, return; } - if(libtiff_TIFFSetDirectory(image, ibuf->miplevel)) { + if(TIFFSetDirectory(image, ibuf->miplevel)) { /* allocate the image buffer */ - libtiff_TIFFGetField(image, TIFFTAG_IMAGEWIDTH, &width); - libtiff_TIFFGetField(image, TIFFTAG_IMAGELENGTH, &height); + TIFFGetField(image, TIFFTAG_IMAGEWIDTH, &width); + TIFFGetField(image, TIFFTAG_IMAGELENGTH, &height); if(width == ibuf->x && height == ibuf->y) { if(rect) { /* tiff pixels are bottom to top, tiles are top to bottom */ - if(libtiff_TIFFReadRGBATile(image, tx*ibuf->tilex, (ibuf->ytiles - 1 - ty)*ibuf->tiley, rect) == 1) { + if(TIFFReadRGBATile(image, tx*ibuf->tilex, (ibuf->ytiles - 1 - ty)*ibuf->tiley, rect) == 1) { if(ibuf->tiley > ibuf->y) memmove(rect, rect+ibuf->tilex*(ibuf->tiley - ibuf->y), sizeof(int)*ibuf->tilex*ibuf->y); @@ -484,7 +671,7 @@ void imb_loadtiletiff(ImBuf *ibuf, unsigned char *mem, int size, int tx, int ty, printf("imb_loadtiff: could not find mipmap level %d\n", ibuf->miplevel); /* close the client layer interface to the in-memory file */ - libtiff_TIFFClose(image); + TIFFClose(image); } /** @@ -515,10 +702,6 @@ int imb_savetiff(ImBuf *ibuf, char *name, int flags) int x, y, from_i, to_i, i; int extraSampleTypes[1] = { EXTRASAMPLE_ASSOCALPHA }; - if(!G.have_libtiff) { - fprintf(stderr, "imb_savetiff: no tiff library available.\n"); - return (0); - } /* check for a valid number of bytes per pixel. Like the PNG writer, * the TIFF writer supports 1, 3 or 4 bytes per pixel, corresponding @@ -546,7 +729,7 @@ int imb_savetiff(ImBuf *ibuf, char *name, int flags) } else { /* create image as a file */ - image = libtiff_TIFFOpen(name, "w"); + image = TIFFOpen(name, "w"); } if(image == NULL) { fprintf(stderr, @@ -557,16 +740,16 @@ int imb_savetiff(ImBuf *ibuf, char *name, int flags) /* allocate array for pixel data */ npixels = ibuf->x * ibuf->y; if(bitspersample == 16) - pixels16 = (unsigned short*)libtiff__TIFFmalloc(npixels * + pixels16 = (unsigned short*)_TIFFmalloc(npixels * samplesperpixel * sizeof(unsigned short)); else - pixels = (unsigned char*)libtiff__TIFFmalloc(npixels * + pixels = (unsigned char*)_TIFFmalloc(npixels * samplesperpixel * sizeof(unsigned char)); if(pixels == NULL && pixels16 == NULL) { fprintf(stderr, "imb_savetiff: could not allocate pixels array.\n"); - libtiff_TIFFClose(image); + TIFFClose(image); return (0); } @@ -581,24 +764,24 @@ int imb_savetiff(ImBuf *ibuf, char *name, int flags) } /* setup samples per pixel */ - libtiff_TIFFSetField(image, TIFFTAG_BITSPERSAMPLE, bitspersample); - libtiff_TIFFSetField(image, TIFFTAG_SAMPLESPERPIXEL, samplesperpixel); + TIFFSetField(image, TIFFTAG_BITSPERSAMPLE, bitspersample); + TIFFSetField(image, TIFFTAG_SAMPLESPERPIXEL, samplesperpixel); if(samplesperpixel == 4) { /* RGBA images */ - libtiff_TIFFSetField(image, TIFFTAG_EXTRASAMPLES, 1, + TIFFSetField(image, TIFFTAG_EXTRASAMPLES, 1, extraSampleTypes); - libtiff_TIFFSetField(image, TIFFTAG_PHOTOMETRIC, + TIFFSetField(image, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); } else if(samplesperpixel == 3) { /* RGB images */ - libtiff_TIFFSetField(image, TIFFTAG_PHOTOMETRIC, + TIFFSetField(image, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); } else if(samplesperpixel == 1) { /* greyscale images, 1 channel */ - libtiff_TIFFSetField(image, TIFFTAG_PHOTOMETRIC, + TIFFSetField(image, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK); } @@ -635,30 +818,31 @@ int imb_savetiff(ImBuf *ibuf, char *name, int flags) } /* write the actual TIFF file */ - libtiff_TIFFSetField(image, TIFFTAG_IMAGEWIDTH, ibuf->x); - libtiff_TIFFSetField(image, TIFFTAG_IMAGELENGTH, ibuf->y); - libtiff_TIFFSetField(image, TIFFTAG_ROWSPERSTRIP, ibuf->y); - libtiff_TIFFSetField(image, TIFFTAG_COMPRESSION, COMPRESSION_DEFLATE); - libtiff_TIFFSetField(image, TIFFTAG_FILLORDER, FILLORDER_MSB2LSB); - libtiff_TIFFSetField(image, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); - libtiff_TIFFSetField(image, TIFFTAG_XRESOLUTION, 150.0); - libtiff_TIFFSetField(image, TIFFTAG_YRESOLUTION, 150.0); - libtiff_TIFFSetField(image, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH); - if(libtiff_TIFFWriteEncodedStrip(image, 0, + TIFFSetField(image, TIFFTAG_IMAGEWIDTH, ibuf->x); + TIFFSetField(image, TIFFTAG_IMAGELENGTH, ibuf->y); + TIFFSetField(image, TIFFTAG_ROWSPERSTRIP, ibuf->y); + TIFFSetField(image, TIFFTAG_COMPRESSION, COMPRESSION_DEFLATE); + TIFFSetField(image, TIFFTAG_FILLORDER, FILLORDER_MSB2LSB); + TIFFSetField(image, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); + TIFFSetField(image, TIFFTAG_XRESOLUTION, 150.0); + TIFFSetField(image, TIFFTAG_YRESOLUTION, 150.0); + TIFFSetField(image, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH); + if(TIFFWriteEncodedStrip(image, 0, (bitspersample == 16)? (unsigned char*)pixels16: pixels, ibuf->x*ibuf->y*samplesperpixel*bitspersample/8) == -1) { fprintf(stderr, "imb_savetiff: Could not write encoded TIFF.\n"); - libtiff_TIFFClose(image); - if(pixels) libtiff__TIFFfree(pixels); - if(pixels16) libtiff__TIFFfree(pixels16); + TIFFClose(image); + if(pixels) _TIFFfree(pixels); + if(pixels16) _TIFFfree(pixels16); return (1); } /* close the TIFF file */ - libtiff_TIFFClose(image); - if(pixels) libtiff__TIFFfree(pixels); - if(pixels16) libtiff__TIFFfree(pixels16); + TIFFClose(image); + if(pixels) _TIFFfree(pixels); + if(pixels16) _TIFFfree(pixels16); return (1); } +#endif /* WITH_TIFF */ \ No newline at end of file diff --git a/source/blender/imbuf/intern/util.c b/source/blender/imbuf/intern/util.c index aff05b4eaff..e6f4e226caa 100644 --- a/source/blender/imbuf/intern/util.c +++ b/source/blender/imbuf/intern/util.c @@ -105,17 +105,19 @@ static int IMB_ispic_name(char *name) int IMB_ispic(char *filename) { if(U.uiflag & USER_FILTERFILEEXTS) { - if (G.have_libtiff && (BLI_testextensie(filename, ".tif") + if (BLI_testextensie(filename, ".tif") || BLI_testextensie(filename, ".tiff") - || BLI_testextensie(filename, ".tx"))) { + || BLI_testextensie(filename, ".tx")) { return IMB_ispic_name(filename); } if (G.have_quicktime){ if( BLI_testextensie(filename, ".jpg") || BLI_testextensie(filename, ".jpeg") +#ifdef WITH_TIFF || BLI_testextensie(filename, ".tif") || BLI_testextensie(filename, ".tiff") || BLI_testextensie(filename, ".tx") +#endif || BLI_testextensie(filename, ".hdr") || BLI_testextensie(filename, ".tga") || BLI_testextensie(filename, ".rgb") @@ -144,9 +146,14 @@ int IMB_ispic(char *filename) } else { return(FALSE); } - } else { /* no quicktime or libtiff */ + } else { /* no quicktime */ if( BLI_testextensie(filename, ".jpg") || BLI_testextensie(filename, ".jpeg") +#ifdef WITH_TIFF + || BLI_testextensie(filename, ".tif") + || BLI_testextensie(filename, ".tiff") + || BLI_testextensie(filename, ".tx") +#endif || BLI_testextensie(filename, ".hdr") || BLI_testextensie(filename, ".tga") || BLI_testextensie(filename, ".rgb") diff --git a/source/blender/makesdna/DNA_action_types.h b/source/blender/makesdna/DNA_action_types.h index 181ab6f0afa..210bb6a9af0 100644 --- a/source/blender/makesdna/DNA_action_types.h +++ b/source/blender/makesdna/DNA_action_types.h @@ -154,6 +154,8 @@ typedef enum eMotionPaths_ViewFlag { MOTIONPATH_VIEW_KFRAS = (1<<1), /* show keyframe/frame numbers */ MOTIONPATH_VIEW_KFNOS = (1<<2), + /* find keyframes in whole action (instead of just in matching group name) */ + MOTIONPATH_VIEW_KFACT = (1<<3), } eMotionPath_ViewFlag; /* bAnimVizSettings->path_bakeflag */ diff --git a/source/blender/makesdna/DNA_constraint_types.h b/source/blender/makesdna/DNA_constraint_types.h index 6c7bda171eb..f310e5e55e0 100644 --- a/source/blender/makesdna/DNA_constraint_types.h +++ b/source/blender/makesdna/DNA_constraint_types.h @@ -174,6 +174,7 @@ typedef struct bSplineIKConstraint { /* Single-target subobject constraints --------------------- */ + /* Track To Constraint */ typedef struct bTrackToConstraint { Object *tar; @@ -210,7 +211,7 @@ typedef struct bSizeLikeConstraint { /* Maintain Volume Constraint */ typedef struct bSameVolumeConstraint { - int flag; + int flag; float volume; } bSameVolumeConstraint; @@ -336,6 +337,24 @@ typedef struct bTransformConstraint { float to_max[3]; } bTransformConstraint; +/* Pivot Constraint */ +typedef struct bPivotConstraint { + /* Pivot Point: + * Either target object + offset, or just offset is used + */ + Object *tar; /* target object (optional) */ + char subtarget[32]; /* subtarget name (optional) */ + float offset[3]; /* offset from the target to use, regardless of whether it exists */ + + /* Rotation-driven activation: + * This option provides easier one-stop setups for footrolls + */ + short rotAxis; /* rotation axes to consider for this (ePivotConstraint_Axis) */ + + /* General flags */ + short flag; /* ePivotConstraint_Flag */ +} bPivotConstraint; + /* transform limiting constraints - zero target ---------------------------- */ /* Limit Location Constraint */ typedef struct bLocLimitConstraint { @@ -419,6 +438,7 @@ typedef enum eBConstraint_Types { CONSTRAINT_TYPE_SPLINEIK, /* Spline-IK - Align 'n' bones to a curve */ CONSTRAINT_TYPE_TRANSLIKE, /* Copy transform matrix */ CONSTRAINT_TYPE_SAMEVOL, /* Maintain volume during scaling */ + CONSTRAINT_TYPE_PIVOT, /* Pivot Constraint */ /* NOTE: no constraints are allowed to be added after this */ NUM_CONSTRAINT_TYPES @@ -469,11 +489,6 @@ typedef enum eConstraintChannel_Flags { /* -------------------------------------- */ -/** - * The flags for ROTLIKE, LOCLIKE and SIZELIKE should be kept identical - * (that is, same effect, different name). It simplifies the Python API access a lot. - */ - /* bRotateLikeConstraint.flag */ typedef enum eCopyRotation_Flags { ROTLIKE_X = (1<<0), @@ -688,6 +703,35 @@ typedef enum eChildOf_Flags { CHILDOF_SIZEZ = (1<<8), } eChildOf_Flags; +/* Pivot Constraint */ + /* Restrictions for Pivot Constraint axis to consider for enabling constraint */ +typedef enum ePivotConstraint_Axis { + /* do not consider this activity-clamping */ + PIVOTCON_AXIS_NONE = -1, + + /* consider -ve x-axis rotations */ + PIVOTCON_AXIS_X_NEG, + /* consider -ve y-axis rotations */ + PIVOTCON_AXIS_Y_NEG, + /* consider -ve z-axis rotations */ + PIVOTCON_AXIS_Z_NEG, + + /* consider +ve x-axis rotations */ + PIVOTCON_AXIS_X, + /* consider +ve y-axis rotations */ + PIVOTCON_AXIS_Y, + /* consider +ve z-axis rotations */ + PIVOTCON_AXIS_Z, +} ePivotConstraint_Axis; + + /* settings for Pivot Constraint in general */ +typedef enum ePivotConstraint_Flag { + /* offset is to be interpreted as being a fixed-point in space */ + PIVOTCON_FLAG_OFFSET_ABS = (1<<0), + /* rotation-based activation uses negative rotation to drive result */ + PIVOTCON_FLAG_ROTACT_NEG = (1<<1), +} ePivotConstraint_Flag; + /* Rigid-Body Constraint */ #define CONSTRAINT_DRAW_PIVOT 0x40 #define CONSTRAINT_DISABLE_LINKED_COLLISION 0x80 diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index c587b2106ff..9cbd304a86d 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -186,10 +186,10 @@ typedef struct bNodeTree { int pad2[2]; /* callbacks */ - void (*timecursor)(void *, int nr); + void (*progress)(void *, float progress); void (*stats_draw)(void *, char *str); int (*test_break)(void *); - void *tbh, *tch, *sdh; + void *tbh, *prh, *sdh; } bNodeTree; diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h index 6132cb2174b..f780552715c 100644 --- a/source/blender/makesdna/DNA_object_types.h +++ b/source/blender/makesdna/DNA_object_types.h @@ -412,14 +412,15 @@ extern Object workob; #define BA_HAS_RECALC_OB 4 #define BA_HAS_RECALC_DATA 8 - // XXX DEPRECEATED SETTING... -#define BA_DO_IPO 32 + /* NOTE: this was used as a proper setting in past, so nullify before using */ +#define BA_TEMP_TAG 32 #define BA_FROMSET 128 #define BA_TRANSFORM_CHILD 256 /* child of a transformed object */ #define BA_TRANSFORM_PARENT 8192 /* parent of a transformed object */ + /* an initial attempt as making selection more specific! */ #define BA_DESELECT 0 #define BA_SELECT 1 diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h index 091c05a8b98..72c067c9752 100644 --- a/source/blender/makesdna/DNA_userdef_types.h +++ b/source/blender/makesdna/DNA_userdef_types.h @@ -139,8 +139,8 @@ typedef struct ThemeUI { uiWidgetColors wcol_radio, wcol_option, wcol_toggle; uiWidgetColors wcol_num, wcol_numslider; uiWidgetColors wcol_menu, wcol_pulldown, wcol_menu_back, wcol_menu_item; - uiWidgetColors wcol_box, wcol_scroll, wcol_list_item; - + uiWidgetColors wcol_box, wcol_scroll, wcol_progress, wcol_list_item; + uiWidgetStateColors wcol_state; char iconfile[80]; // FILE_MAXFILE length diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h index f9802e558bb..3badc401514 100644 --- a/source/blender/makesrna/RNA_access.h +++ b/source/blender/makesrna/RNA_access.h @@ -356,6 +356,7 @@ extern StructRNA RNA_SPHFluidSettings; extern StructRNA RNA_ParticleSystem; extern StructRNA RNA_ParticleSystemModifier; extern StructRNA RNA_ParticleTarget; +extern StructRNA RNA_PivotConstraint; extern StructRNA RNA_PluginSequence; extern StructRNA RNA_PluginTexture; extern StructRNA RNA_PointCache; diff --git a/source/blender/makesrna/SConscript b/source/blender/makesrna/SConscript index 71cfc3c7da4..c4ee90dde16 100644 --- a/source/blender/makesrna/SConscript +++ b/source/blender/makesrna/SConscript @@ -15,6 +15,9 @@ defs = [] if env['WITH_BF_OPENEXR']: defs.append('WITH_OPENEXR') +if env['WITH_BF_TIFF']: + defs.append('WITH_TIFF') + if env['WITH_BF_OPENJPEG']: defs.append('WITH_OPENJPEG') diff --git a/source/blender/makesrna/intern/CMakeLists.txt b/source/blender/makesrna/intern/CMakeLists.txt index 0e25160cdff..e9fc5c10f9e 100644 --- a/source/blender/makesrna/intern/CMakeLists.txt +++ b/source/blender/makesrna/intern/CMakeLists.txt @@ -58,6 +58,10 @@ IF(WITH_OPENEXR) ADD_DEFINITIONS(-DWITH_OPENEXR) ENDIF(WITH_OPENEXR) +IF(WITH_TIFF) + ADD_DEFINITIONS(-DWITH_TIFF) +ENDIF(WITH_TIFF) + IF(WITH_OPENJPEG) ADD_DEFINITIONS(-DWITH_OPENJPEG) ENDIF(WITH_OPENJPEG) diff --git a/source/blender/makesrna/intern/Makefile b/source/blender/makesrna/intern/Makefile index c26593100f8..8aef06e762d 100644 --- a/source/blender/makesrna/intern/Makefile +++ b/source/blender/makesrna/intern/Makefile @@ -92,6 +92,10 @@ ifeq ($(WITH_OPENAL),true) CPPFLAGS += -DWITH_OPENAL endif +ifeq ($(WITH_TIFF),true) + CPPFLAGS += -DWITH_TIFF +endif + ifeq ($(OS),windows) # Windows needs these extra libs because of winstuff... It is not # _really_ needed, but it is the easiest fix for now. If you have diff --git a/source/blender/makesrna/intern/SConscript b/source/blender/makesrna/intern/SConscript index d22a654db02..6b50daa5486 100644 --- a/source/blender/makesrna/intern/SConscript +++ b/source/blender/makesrna/intern/SConscript @@ -38,6 +38,9 @@ incs += ' #/intern/audaspace/intern' if env['WITH_BF_OPENEXR']: defs.append('WITH_OPENEXR') +if env['WITH_BF_TIFF']: + defs.append('WITH_TIFF') + if env['WITH_BF_OPENJPEG']: defs.append('WITH_OPENJPEG') diff --git a/source/blender/makesrna/intern/rna_actuator.c b/source/blender/makesrna/intern/rna_actuator.c index 5a55888614f..36dfef696a5 100644 --- a/source/blender/makesrna/intern/rna_actuator.c +++ b/source/blender/makesrna/intern/rna_actuator.c @@ -57,14 +57,6 @@ EnumPropertyItem actuator_type_items[] ={ {ACT_STEERING, "STEERING", 0, "Steering", ""}, {0, NULL, 0, NULL, NULL}}; -EnumPropertyItem edit_object_type_items[] ={ - {ACT_EDOB_ADD_OBJECT, "ADDOBJECT", 0, "Add Object", ""}, - {ACT_EDOB_END_OBJECT, "ENDOBJECT", 0, "End Object", ""}, - {ACT_EDOB_REPLACE_MESH, "REPLACEMESH", 0, "Replace Mesh", ""}, - {ACT_EDOB_TRACK_TO, "TRACKTO", 0, "Track to", ""}, - {ACT_EDOB_DYNAMICS, "DYNAMICS", 0, "Dynamics", ""}, - {0, NULL, 0, NULL, NULL} }; - #ifdef RNA_RUNTIME #include "BKE_sca.h" @@ -349,28 +341,6 @@ static void rna_StateActuator_state_set(PointerRNA *ptr, const int *values) } } -static EnumPropertyItem *rna_EditObjectActuator_mode_itemf(bContext *C, PointerRNA *ptr, int *free) -{ - EnumPropertyItem *item= NULL; - Object *ob = (Object *)ptr->id.data; - - int totitem= 0; - if (ob->type!=OB_ARMATURE) - { - RNA_enum_items_add_value(&item, &totitem, edit_object_type_items, ACT_EDOB_REPLACE_MESH); - RNA_enum_items_add_value(&item, &totitem, edit_object_type_items, ACT_EDOB_DYNAMICS); - } - - RNA_enum_items_add_value(&item, &totitem, edit_object_type_items, ACT_EDOB_ADD_OBJECT); - RNA_enum_items_add_value(&item, &totitem, edit_object_type_items, ACT_EDOB_END_OBJECT); - RNA_enum_items_add_value(&item, &totitem, edit_object_type_items, ACT_EDOB_TRACK_TO); - - RNA_enum_item_end(&item, &totitem); - *free= 1; - - return item; -} - /* Always keep in alphabetical order */ EnumPropertyItem *rna_Actuator_type_itemf(bContext *C, PointerRNA *ptr, int *free) { @@ -456,6 +426,23 @@ static void rna_Actuator_Armature_update(Main *bmain, Scene *scene, PointerRNA * constraint[0] = 0; } +/* note: the following set functions exists only to avoid id refcounting */ +static void rna_Actuator_editobject_mesh_set(PointerRNA *ptr, PointerRNA value) +{ + bActuator *act = (bActuator *)ptr->data; + bEditObjectActuator *eoa = (bEditObjectActuator *) act->data; + + eoa->me = value.data; +} + +static void rna_Actuator_action_action_set(PointerRNA *ptr, PointerRNA value) +{ + bActuator *act = (bActuator *)ptr->data; + bActionActuator *aa = (bActionActuator *) act->data; + + aa->act = value.data; +} + #else void rna_def_actuator(BlenderRNA *brna) @@ -515,6 +502,8 @@ static void rna_def_action_actuator(BlenderRNA *brna) RNA_def_property_struct_type(prop, "Action"); RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Action", ""); + /* note: custom set function is ONLY to avoid rna setting a user for this. */ + RNA_def_property_pointer_funcs(prop, NULL, "rna_Actuator_action_action_set", NULL); RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "continue_last_frame", PROP_BOOLEAN, PROP_NONE); @@ -1213,14 +1202,21 @@ static void rna_def_edit_object_actuator(BlenderRNA *brna) {ACT_EDOB_SET_MASS, "SETMASS", 0, "Set Mass", ""}, {0, NULL, 0, NULL, NULL} }; + static EnumPropertyItem prop_type_items[] ={ + {ACT_EDOB_ADD_OBJECT, "ADDOBJECT", 0, "Add Object", ""}, + {ACT_EDOB_END_OBJECT, "ENDOBJECT", 0, "End Object", ""}, + {ACT_EDOB_REPLACE_MESH, "REPLACEMESH", 0, "Replace Mesh", ""}, + {ACT_EDOB_TRACK_TO, "TRACKTO", 0, "Track to", ""}, + {ACT_EDOB_DYNAMICS, "DYNAMICS", 0, "Dynamics", ""}, + {0, NULL, 0, NULL, NULL} }; + srna= RNA_def_struct(brna, "EditObjectActuator", "Actuator"); RNA_def_struct_ui_text(srna, "Edit Object Actuator", "Actuator used to edit objects"); RNA_def_struct_sdna_from(srna, "bEditObjectActuator", "data"); prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "type"); - RNA_def_property_enum_items(prop, edit_object_type_items); - RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_EditObjectActuator_mode_itemf"); + RNA_def_property_enum_items(prop, prop_type_items); RNA_def_property_ui_text(prop, "Edit Object", "The mode of the actuator"); RNA_def_property_update(prop, NC_LOGIC, NULL); @@ -1249,6 +1245,8 @@ static void rna_def_edit_object_actuator(BlenderRNA *brna) RNA_def_property_pointer_sdna(prop, NULL, "me"); RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Mesh", "Replace the existing, when left blank 'Phys' will remake the existing physics mesh"); + /* note: custom set function is ONLY to avoid rna setting a user for this. */ + RNA_def_property_pointer_funcs(prop, NULL, "rna_Actuator_editobject_mesh_set", NULL); RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "time", PROP_INT, PROP_NONE); @@ -1715,6 +1713,8 @@ static void rna_def_shape_action_actuator(BlenderRNA *brna) RNA_def_property_struct_type(prop, "Action"); RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Action", ""); + /* note: custom set function is ONLY to avoid rna setting a user for this. */ + RNA_def_property_pointer_funcs(prop, NULL, "rna_Actuator_action_action_set", NULL); RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "continue_last_frame", PROP_BOOLEAN, PROP_NONE); diff --git a/source/blender/makesrna/intern/rna_animation.c b/source/blender/makesrna/intern/rna_animation.c index d791bde3054..e0cf4f912b1 100644 --- a/source/blender/makesrna/intern/rna_animation.c +++ b/source/blender/makesrna/intern/rna_animation.c @@ -557,7 +557,7 @@ static void rna_def_keyingset_paths(BlenderRNA *brna, PropertyRNA *cprop) parm= RNA_def_string(func, "data_path", "", 256, "Data-Path", "RNA-Path to destination property."); // xxx hopefully this is long enough RNA_def_property_flag(parm, PROP_REQUIRED); /* index (defaults to -1 for entire array) */ - parm=RNA_def_int(func, "index", -1, 0, INT_MAX, "Index", "The index of the destination property (i.e. axis of Location/Rotation/etc.), or -1 for the entire array.", 0, INT_MAX); + parm=RNA_def_int(func, "index", -1, -1, INT_MAX, "Index", "The index of the destination property (i.e. axis of Location/Rotation/etc.), or -1 for the entire array.", 0, INT_MAX); /* grouping */ parm=RNA_def_enum(func, "grouping_method", keyingset_path_grouping_items, KSP_GROUP_KSNAME, "Grouping Method", "Method used to define which Group-name to use."); parm=RNA_def_string(func, "group_name", "", 64, "Group Name", "Name of Action Group to assign destination to (only if grouping mode is to use this name)."); diff --git a/source/blender/makesrna/intern/rna_animviz.c b/source/blender/makesrna/intern/rna_animviz.c index c5172c4e59c..985521fe2c6 100644 --- a/source/blender/makesrna/intern/rna_animviz.c +++ b/source/blender/makesrna/intern/rna_animviz.c @@ -158,7 +158,7 @@ static void rna_def_animviz_ghosts(BlenderRNA *brna) PropertyRNA *prop; static const EnumPropertyItem prop_type_items[] = { - {GHOST_TYPE_NONE, "NONE", 0, "No Ghosts", "Don not show any ghosts"}, + {GHOST_TYPE_NONE, "NONE", 0, "No Ghosts", "Do not show any ghosts"}, {GHOST_TYPE_ACFRA, "CURRENT_FRAME", 0, "Around Current Frame", "Show ghosts from around the current frame"}, {GHOST_TYPE_RANGE, "RANGE", 0, "In Range", "Show ghosts for the specified frame range"}, {GHOST_TYPE_KEYS, "KEYS", 0, "On Keyframes", "Show ghosts on keyframes"}, @@ -222,8 +222,8 @@ static void rna_def_animviz_paths(BlenderRNA *brna) PropertyRNA *prop; static const EnumPropertyItem prop_type_items[]= { - {MOTIONPATH_TYPE_RANGE, "RANGE", 0, "In Range", "Display Paths of poses within specified range"}, {MOTIONPATH_TYPE_ACFRA, "CURRENT_FRAME", 0, "Around Frame", "Display Paths of poses within a fixed number of frames around the current frame"}, + {MOTIONPATH_TYPE_RANGE, "RANGE", 0, "In Range", "Display Paths of poses within specified range"}, {0, NULL, 0, NULL, NULL}}; static const EnumPropertyItem prop_location_items[]= { {MOTIONPATH_BAKE_HEADS, "HEADS", 0, "Heads", "Calculate bone paths from heads"}, @@ -264,6 +264,11 @@ static void rna_def_animviz_paths(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Show Keyframe Numbers", "Show frame numbers of Keyframes on Motion Paths"); RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */ + prop= RNA_def_property(srna, "search_all_action_keyframes", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "path_viewflag", MOTIONPATH_VIEW_KFACT); + RNA_def_property_ui_text(prop, "All Action Keyframes", "For bone motion paths, search whole Action for keyframes instead of in group with matching name only (is slower)"); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); /* XXX since this is only for 3d-view drawing */ + prop= RNA_def_property(srna, "frame_step", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "path_step"); RNA_def_property_range(prop, 1, 100); diff --git a/source/blender/makesrna/intern/rna_constraint.c b/source/blender/makesrna/intern/rna_constraint.c index b4ae49ae2f4..b1c5cac1865 100644 --- a/source/blender/makesrna/intern/rna_constraint.c +++ b/source/blender/makesrna/intern/rna_constraint.c @@ -67,6 +67,7 @@ EnumPropertyItem constraint_type_items[] ={ {CONSTRAINT_TYPE_RIGIDBODYJOINT, "RIGID_BODY_JOINT", ICON_CONSTRAINT_DATA, "Rigid Body Joint", ""}, {CONSTRAINT_TYPE_PYTHON, "SCRIPT", ICON_CONSTRAINT_DATA, "Script", ""}, {CONSTRAINT_TYPE_SHRINKWRAP, "SHRINKWRAP", ICON_CONSTRAINT_DATA, "Shrinkwrap", ""}, + {CONSTRAINT_TYPE_PIVOT, "PIVOT", ICON_CONSTRAINT_DATA, "Pivot", ""}, {0, NULL, 0, NULL, NULL}}; EnumPropertyItem space_pchan_items[] = { @@ -157,6 +158,8 @@ static StructRNA *rna_ConstraintType_refine(struct PointerRNA *ptr) return &RNA_SplineIKConstraint; case CONSTRAINT_TYPE_TRANSLIKE: return &RNA_CopyTransformsConstraint; + case CONSTRAINT_TYPE_PIVOT: + return &RNA_PivotConstraint; default: return &RNA_UnknownType; } @@ -1839,6 +1842,62 @@ static void rna_def_constraint_spline_ik(BlenderRNA *brna) RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update"); } +static void rna_def_constraint_pivot(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + static EnumPropertyItem pivot_rotAxis_items[] = { + {PIVOTCON_AXIS_NONE, "ALWAYS_ACTIVE", 0, "Always", ""}, + {PIVOTCON_AXIS_X_NEG, "NX", 0, "-X Rot", ""}, + {PIVOTCON_AXIS_Y_NEG, "NY", 0, "-Y Rot", ""}, + {PIVOTCON_AXIS_Z_NEG, "NZ", 0, "-Z Rot", ""}, + {PIVOTCON_AXIS_X, "X", 0, "X Rot", ""}, + {PIVOTCON_AXIS_Y, "Y", 0, "Y Rot", ""}, + {PIVOTCON_AXIS_Z, "Z", 0, "Z Rot", ""}, + {0, NULL, 0, NULL, NULL}}; + + srna= RNA_def_struct(brna, "PivotConstraint", "Constraint"); + RNA_def_struct_ui_text(srna, "Pivot Constraint", "Rotate around a different point"); + + prop= RNA_def_property(srna, "head_tail", PROP_FLOAT, PROP_FACTOR); + RNA_def_property_float_sdna(prop, "bConstraint", "headtail"); + RNA_def_property_ui_text(prop, "Head/Tail", "Target along length of bone: Head=0, Tail=1"); + RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update"); + + RNA_def_struct_sdna_from(srna, "bPivotConstraint", "data"); + + /* target-defined pivot */ + prop= RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE); + RNA_def_property_pointer_sdna(prop, NULL, "tar"); + RNA_def_property_ui_text(prop, "Target", "Target Object, defining the position of the pivot when defined"); + RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_dependency_update"); + + prop= RNA_def_property(srna, "subtarget", PROP_STRING, PROP_NONE); + RNA_def_property_string_sdna(prop, NULL, "subtarget"); + RNA_def_property_ui_text(prop, "Sub-Target", ""); + RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_dependency_update"); + + /* pivot offset */ + prop= RNA_def_property(srna, "use_relative_position", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", PIVOTCON_FLAG_OFFSET_ABS); + RNA_def_property_ui_text(prop, "Use Relative Offset", "Offset will be an absolute point in space instead of relative to the target"); + RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update"); + + prop= RNA_def_property(srna, "offset", PROP_FLOAT, PROP_XYZ); + RNA_def_property_float_sdna(prop, NULL, "offset"); + RNA_def_property_ui_text(prop, "Offset", "Offset of pivot from target (when set), or from owner's location (when Fixed Position is off), or the absolute pivot point"); + RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update"); + + /* rotation-based activation */ + prop= RNA_def_property(srna, "enabled_rotation_range", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "rotAxis"); + RNA_def_property_enum_items(prop, pivot_rotAxis_items); + RNA_def_property_ui_text(prop, "Enabled Rotation Range", "Rotation range on which pivoting should occur"); + RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update"); +} + /* base struct for constraints */ void RNA_def_constraint(BlenderRNA *brna) { @@ -1943,6 +2002,7 @@ void RNA_def_constraint(BlenderRNA *brna) rna_def_constraint_shrinkwrap(brna); rna_def_constraint_damped_track(brna); rna_def_constraint_spline_ik(brna); + rna_def_constraint_pivot(brna); } #endif diff --git a/source/blender/makesrna/intern/rna_curve.c b/source/blender/makesrna/intern/rna_curve.c index b12fe3a018b..563fdbf8236 100644 --- a/source/blender/makesrna/intern/rna_curve.c +++ b/source/blender/makesrna/intern/rna_curve.c @@ -1256,13 +1256,13 @@ static void rna_def_curve_nurb(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Type", "The interpolation type for this curve element"); RNA_def_property_update(prop, 0, "rna_Curve_update_data"); - prop= RNA_def_property(srna, "point_count_u", PROP_INT, PROP_NONE); + prop= RNA_def_property(srna, "point_count_u", PROP_INT, PROP_UNSIGNED); RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* editing this needs knot recalc*/ RNA_def_property_int_sdna(prop, NULL, "pntsu"); RNA_def_property_ui_text(prop, "Points U", "Total number points for the curve or surface in the U direction"); RNA_def_property_update(prop, 0, "rna_Curve_update_data"); - prop= RNA_def_property(srna, "point_count_v", PROP_INT, PROP_NONE); + prop= RNA_def_property(srna, "point_count_v", PROP_INT, PROP_UNSIGNED); RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* editing this needs knot recalc*/ RNA_def_property_int_sdna(prop, NULL, "pntsv"); RNA_def_property_ui_text(prop, "Points V", "Total number points for the surface on the V direction"); diff --git a/source/blender/makesrna/intern/rna_fcurve.c b/source/blender/makesrna/intern/rna_fcurve.c index a8a73d15c9d..10b9a5ecc96 100644 --- a/source/blender/makesrna/intern/rna_fcurve.c +++ b/source/blender/makesrna/intern/rna_fcurve.c @@ -546,6 +546,11 @@ static void rna_FKeyframe_points_remove(FCurve *fcu, ReportList *reports, BezTri delete_fcurve_key(fcu, index, !do_fast); } +static void rna_fcurve_range(FCurve *fcu, float range[2]) +{ + calc_fcurve_range(fcu, range, range+1); +} + #else static void rna_def_fmodifier_generator(BlenderRNA *brna) @@ -852,7 +857,7 @@ static void rna_def_fmodifier_noise(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Phase", "A random seed for the noise effect"); RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); - prop= RNA_def_property(srna, "depth", PROP_INT, PROP_NONE); + prop= RNA_def_property(srna, "depth", PROP_INT, PROP_UNSIGNED); RNA_def_property_int_sdna(prop, NULL, "depth"); RNA_def_property_ui_text(prop, "Depth", "Amount of fine level detail present in the noise"); RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_EDIT, NULL); @@ -1157,7 +1162,7 @@ static void rna_def_fpoint(BlenderRNA *brna) RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_SELECT, NULL); /* Vector value */ - prop= RNA_def_property(srna, "point", PROP_FLOAT, PROP_XYZ); + prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_XYZ); RNA_def_property_float_sdna(prop, NULL, "vec"); RNA_def_property_array(prop, 2); RNA_def_property_ui_text(prop, "Point", "Point coordinates"); @@ -1321,7 +1326,9 @@ static void rna_def_fcurve(BlenderRNA *brna) { StructRNA *srna; PropertyRNA *prop; - + FunctionRNA *func; + PropertyRNA *parm; + static EnumPropertyItem prop_mode_extend_items[] = { {FCURVE_EXTRAPOLATE_CONSTANT, "CONSTANT", 0, "Constant", ""}, {FCURVE_EXTRAPOLATE_LINEAR, "LINEAR", 0, "Linear", ""}, @@ -1423,8 +1430,23 @@ static void rna_def_fcurve(BlenderRNA *brna) prop= RNA_def_property(srna, "modifiers", PROP_COLLECTION, PROP_NONE); RNA_def_property_struct_type(prop, "FModifier"); RNA_def_property_ui_text(prop, "Modifiers", "Modifiers affecting the shape of the F-Curve"); - rna_def_fcurve_modifiers(brna, prop); + + /* Functions */ + func= RNA_def_function(srna, "evaluate", "evaluate_fcurve"); /* calls the C/API direct */ + RNA_def_function_ui_description(func, "Evaluate fcurve."); + parm= RNA_def_float(func, "frame", 1.0f, -FLT_MAX, FLT_MAX, "Frame", "Evaluate fcurve at given frame", -FLT_MAX, FLT_MAX); + RNA_def_property_flag(parm, PROP_REQUIRED); + /* return value */ + parm= RNA_def_float(func, "position", 0, -FLT_MAX, FLT_MAX, "Position", "Fcurve position", -FLT_MAX, FLT_MAX); + RNA_def_function_return(func, parm); + + func= RNA_def_function(srna, "range", "rna_fcurve_range"); + RNA_def_function_ui_description(func, "Get the time extents for F-Curve."); + /* return value */ + parm= RNA_def_float_vector(func, "range", 2, NULL, -FLT_MAX, FLT_MAX, "Range", "Min/Max values", -FLT_MAX, FLT_MAX); + RNA_def_property_flag(parm, PROP_THICK_WRAP); + RNA_def_function_output(func, parm); } /* *********************** */ diff --git a/source/blender/makesrna/intern/rna_image.c b/source/blender/makesrna/intern/rna_image.c index 52f4b289368..c4137d5379b 100644 --- a/source/blender/makesrna/intern/rna_image.c +++ b/source/blender/makesrna/intern/rna_image.c @@ -441,7 +441,7 @@ static void rna_def_image(BlenderRNA *brna) RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Has data", "True if this image has data"); - prop= RNA_def_property(srna, "depth", PROP_INT, PROP_NONE); + prop= RNA_def_property(srna, "depth", PROP_INT, PROP_UNSIGNED); RNA_def_property_int_funcs(prop, "rna_Image_depth_get", NULL, NULL); RNA_def_property_ui_text(prop, "Depth", "Image bit depth"); RNA_def_property_clear_flag(prop, PROP_EDITABLE); diff --git a/source/blender/makesrna/intern/rna_internal.h b/source/blender/makesrna/intern/rna_internal.h index 005efdb9bc4..0dcfc773d19 100644 --- a/source/blender/makesrna/intern/rna_internal.h +++ b/source/blender/makesrna/intern/rna_internal.h @@ -227,6 +227,7 @@ void RNA_api_main(struct StructRNA *srna); void RNA_api_material(StructRNA *srna); void RNA_api_mesh(struct StructRNA *srna); void RNA_api_object(struct StructRNA *srna); +void RNA_api_object_base(struct StructRNA *srna); void RNA_api_pose_channel(struct StructRNA *srna); void RNA_api_scene(struct StructRNA *srna); void RNA_api_scene_render(struct StructRNA *srna); diff --git a/source/blender/makesrna/intern/rna_main_api.c b/source/blender/makesrna/intern/rna_main_api.c index d2acb49bae2..34eef0bb459 100644 --- a/source/blender/makesrna/intern/rna_main_api.c +++ b/source/blender/makesrna/intern/rna_main_api.c @@ -580,14 +580,14 @@ void RNA_def_main_materials(BlenderRNA *brna, PropertyRNA *cprop) void RNA_def_main_node_groups(BlenderRNA *brna, PropertyRNA *cprop) { StructRNA *srna; - FunctionRNA *func; - PropertyRNA *parm; +// FunctionRNA *func; +// PropertyRNA *parm; - static EnumPropertyItem node_nodetree_items[] = { +/* static EnumPropertyItem node_nodetree_items[] = { {0, "SHADER", 0, "Shader", ""}, {1, "COMPOSITE", 0, "Composite", ""}, {2, "TEXTURE", 0, "Texture", ""}, - {0, NULL, 0, NULL, NULL}}; + {0, NULL, 0, NULL, NULL}}; */ RNA_def_property_srna(cprop, "MainNodeTrees"); srna= RNA_def_struct(brna, "MainNodeTrees", NULL); diff --git a/source/blender/makesrna/intern/rna_material.c b/source/blender/makesrna/intern/rna_material.c index f360fa7012d..1c790898ef2 100644 --- a/source/blender/makesrna/intern/rna_material.c +++ b/source/blender/makesrna/intern/rna_material.c @@ -870,7 +870,7 @@ static void rna_def_material_raymirror(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Gloss Threshold", "Threshold for adaptive sampling. If a sample contributes less than this amount (as a percentage), sampling is stopped"); RNA_def_property_update(prop, 0, "rna_Material_update"); - prop= RNA_def_property(srna, "depth", PROP_INT, PROP_NONE); + prop= RNA_def_property(srna, "depth", PROP_INT, PROP_UNSIGNED); RNA_def_property_int_sdna(prop, NULL, "ray_depth"); RNA_def_property_range(prop, 0, 10); RNA_def_property_ui_text(prop, "Depth", "Maximum allowed number of light inter-reflections"); @@ -935,7 +935,7 @@ static void rna_def_material_raytra(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Gloss Threshold", "Threshold for adaptive sampling. If a sample contributes less than this amount (as a percentage), sampling is stopped"); RNA_def_property_update(prop, 0, "rna_Material_update"); - prop= RNA_def_property(srna, "depth", PROP_INT, PROP_NONE); + prop= RNA_def_property(srna, "depth", PROP_INT, PROP_UNSIGNED); RNA_def_property_int_sdna(prop, NULL, "ray_depth_tra"); RNA_def_property_range(prop, 0, 10); RNA_def_property_ui_text(prop, "Depth", "Maximum allowed number of light inter-refractions"); diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c index f0eaf34a35b..b5818c7ef6e 100644 --- a/source/blender/makesrna/intern/rna_object.c +++ b/source/blender/makesrna/intern/rna_object.c @@ -2057,7 +2057,7 @@ static void rna_def_dupli_object(BlenderRNA *brna) /* TODO: DupliObject has more properties that can be wrapped */ } -static void rna_def_base(BlenderRNA *brna) +static void rna_def_object_base(BlenderRNA *brna) { StructRNA *srna; PropertyRNA *prop; @@ -2088,13 +2088,15 @@ static void rna_def_base(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "flag", BA_WAS_SEL); RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "User Selected", "Object base user selection state, used to restore user selection after transformations"); + + RNA_api_object_base(srna); } void RNA_def_object(BlenderRNA *brna) { rna_def_object(brna); rna_def_object_game_settings(brna); - rna_def_base(brna); + rna_def_object_base(brna); rna_def_vertex_group(brna); rna_def_material_slot(brna); rna_def_dupli_object(brna); diff --git a/source/blender/makesrna/intern/rna_object_api.c b/source/blender/makesrna/intern/rna_object_api.c index 8efc0bb3e45..7b4cd3bed6a 100644 --- a/source/blender/makesrna/intern/rna_object_api.c +++ b/source/blender/makesrna/intern/rna_object_api.c @@ -65,6 +65,7 @@ #include "DNA_curve_types.h" #include "DNA_modifier_types.h" #include "DNA_constraint_types.h" +#include "DNA_view3d_types.h" #include "MEM_guardedalloc.h" @@ -405,6 +406,13 @@ void rna_Object_ray_cast(Object *ob, ReportList *reports, float ray_start[3], fl *index= -1; } +/* ObjectBase */ + +void rna_ObjectBase_layers_from_view(Base *base, View3D *v3d) +{ + base->lay= base->object->lay= v3d->lay; +} + #else void RNA_api_object(StructRNA *srna) @@ -521,5 +529,17 @@ void RNA_api_object(StructRNA *srna) RNA_def_function_return(func, parm); } + +void RNA_api_object_base(StructRNA *srna) +{ + FunctionRNA *func; + PropertyRNA *parm; + + func= RNA_def_function(srna, "layers_from_view", "rna_ObjectBase_layers_from_view"); + RNA_def_function_ui_description(func, "Sets the object layers from a 3D View (use when adding an object in local view)."); + parm= RNA_def_pointer(func, "view", "SpaceView3D", "", ""); + RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL); +} + #endif diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 43bffaac84b..a18c1021a8a 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -105,13 +105,15 @@ EnumPropertyItem image_type_items[] = { {R_RAWTGA, "TARGA_RAW", ICON_FILE_IMAGE, "Targa Raw", ""}, {0, "", 0, " ", NULL}, {R_CINEON, "CINEON", ICON_FILE_IMAGE, "Cineon", ""}, - {R_DPX, "DPX", ICON_FILE_IMAGE, "DPX", ""}, + {R_DPX, "DPX",ICON_FILE_IMAGE, "DPX", ""}, #ifdef WITH_OPENEXR {R_MULTILAYER, "MULTILAYER", ICON_FILE_IMAGE, "MultiLayer", ""}, {R_OPENEXR, "OPEN_EXR", ICON_FILE_IMAGE, "OpenEXR", ""}, #endif {R_RADHDR, "HDR", ICON_FILE_IMAGE, "Radiance HDR", ""}, - {R_TIFF, "TIFF", ICON_FILE_IMAGE, "TIFF", ""}, // XXX only with G.have_libtiff +#ifdef WITH_TIFF + {R_TIFF, "TIFF", ICON_FILE_IMAGE, "TIFF", ""}, +#endif {0, "", 0, "Movie", NULL}, #ifdef _WIN32 {R_AVICODEC, "AVICODEC", ICON_FILE_MOVIE, "AVI Codec", ""}, // XXX Missing codec menu @@ -1526,7 +1528,7 @@ static void rna_def_scene_game_data(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Resolution Y", "Number of vertical pixels in the screen"); RNA_def_property_update(prop, NC_SCENE, NULL); - prop= RNA_def_property(srna, "depth", PROP_INT, PROP_NONE); + prop= RNA_def_property(srna, "depth", PROP_INT, PROP_UNSIGNED); RNA_def_property_int_sdna(prop, NULL, "depth"); RNA_def_property_range(prop, 8, 32); RNA_def_property_ui_text(prop, "Bits", "Displays bit depth of full screen display"); @@ -2336,34 +2338,35 @@ static void rna_def_scene_render_data(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Fields Still", "Disable the time difference between fields"); RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); - prop= RNA_def_property(srna, "render_shadows", PROP_BOOLEAN, PROP_NONE); + /* rendering features */ + prop= RNA_def_property(srna, "use_shadows", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "mode", R_SHADOW); - RNA_def_property_ui_text(prop, "Render Shadows", "Calculate shadows while rendering"); + RNA_def_property_ui_text(prop, "Shadows", "Calculate shadows while rendering"); RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); - prop= RNA_def_property(srna, "render_envmaps", PROP_BOOLEAN, PROP_NONE); + prop= RNA_def_property(srna, "use_envmaps", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "mode", R_ENVMAP); - RNA_def_property_ui_text(prop, "Render Environment Maps", "Calculate environment maps while rendering"); + RNA_def_property_ui_text(prop, "Environment Maps", "Calculate environment maps while rendering"); RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); - prop= RNA_def_property(srna, "render_radiosity", PROP_BOOLEAN, PROP_NONE); + prop= RNA_def_property(srna, "use_radiosity", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "mode", R_RADIO); - RNA_def_property_ui_text(prop, "Render Radiosity", "Calculate radiosity in a pre-process before rendering"); + RNA_def_property_ui_text(prop, "Radiosity", "Calculate radiosity in a pre-process before rendering"); RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); - prop= RNA_def_property(srna, "render_sss", PROP_BOOLEAN, PROP_NONE); + prop= RNA_def_property(srna, "use_sss", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "mode", R_SSS); - RNA_def_property_ui_text(prop, "Render SSS", "Calculate sub-surface scattering in materials rendering"); + RNA_def_property_ui_text(prop, "Subsurface Scattering", "Calculate sub-surface scattering in materials rendering"); RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); - prop= RNA_def_property(srna, "render_raytracing", PROP_BOOLEAN, PROP_NONE); + prop= RNA_def_property(srna, "use_raytracing", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "mode", R_RAYTRACE); - RNA_def_property_ui_text(prop, "Render Raytracing", "Pre-calculate the raytrace accelerator and render raytracing effects"); + RNA_def_property_ui_text(prop, "Raytracing", "Pre-calculate the raytrace accelerator and render raytracing effects"); RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); - prop= RNA_def_property(srna, "render_textures", PROP_BOOLEAN, PROP_NONE); + prop= RNA_def_property(srna, "use_textures", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_negative_sdna(prop, NULL, "scemode", R_NO_TEX); - RNA_def_property_ui_text(prop, "Render Textures", "Use textures to affect material properties"); + RNA_def_property_ui_text(prop, "Textures", "Use textures to affect material properties"); RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); prop= RNA_def_property(srna, "edge", PROP_BOOLEAN, PROP_NONE); @@ -2725,7 +2728,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Use Simplify", "Enable simplification of scene for quicker preview renders"); RNA_def_property_update(prop, 0, "rna_Scene_simplify_update"); - prop= RNA_def_property(srna, "simplify_subdivision", PROP_INT, PROP_NONE); + prop= RNA_def_property(srna, "simplify_subdivision", PROP_INT, PROP_UNSIGNED); RNA_def_property_int_sdna(prop, NULL, "simplify_subsurf"); RNA_def_property_ui_range(prop, 0, 6, 1, 0); RNA_def_property_ui_text(prop, "Simplify Subdivision", "Global maximum subdivision level"); diff --git a/source/blender/makesrna/intern/rna_sensor.c b/source/blender/makesrna/intern/rna_sensor.c index ff0f6ab7b30..31fa8f018dc 100644 --- a/source/blender/makesrna/intern/rna_sensor.c +++ b/source/blender/makesrna/intern/rna_sensor.c @@ -128,11 +128,9 @@ EnumPropertyItem *rna_Sensor_type_itemf(bContext *C, PointerRNA *ptr, int *free) if (ob != NULL) { if (ob->type==OB_ARMATURE) { RNA_enum_items_add_value(&item, &totitem, sensor_type_items, SENS_ARMATURE); - } else if(ob->type==OB_MESH) { - RNA_enum_items_add_value(&item, &totitem, sensor_type_items, SENS_COLLISION); } } - + RNA_enum_items_add_value(&item, &totitem, sensor_type_items, SENS_COLLISION); RNA_enum_items_add_value(&item, &totitem, sensor_type_items, SENS_DELAY); RNA_enum_items_add_value(&item, &totitem, sensor_type_items, SENS_JOYSTICK); RNA_enum_items_add_value(&item, &totitem, sensor_type_items, SENS_KEYBOARD); @@ -143,12 +141,7 @@ EnumPropertyItem *rna_Sensor_type_itemf(bContext *C, PointerRNA *ptr, int *free) RNA_enum_items_add_value(&item, &totitem, sensor_type_items, SENS_RADAR); RNA_enum_items_add_value(&item, &totitem, sensor_type_items, SENS_RANDOM); RNA_enum_items_add_value(&item, &totitem, sensor_type_items, SENS_RAY); - - if (ob != NULL) { - if(ob->type==OB_MESH) { - RNA_enum_items_add_value(&item, &totitem, sensor_type_items, SENS_TOUCH); - } - } + RNA_enum_items_add_value(&item, &totitem, sensor_type_items, SENS_TOUCH); RNA_enum_item_end(&item, &totitem); *free= 1; @@ -159,27 +152,27 @@ EnumPropertyItem *rna_Sensor_type_itemf(bContext *C, PointerRNA *ptr, int *free) static void rna_Sensor_keyboard_key_set(struct PointerRNA *ptr, int value) { bSensor *sens= (bSensor *)ptr->data; - bKeyboardSensor *ks = sens->data; + bKeyboardSensor *ks = (bKeyboardSensor *)sens->data; - if (ISKEYBOARD(value) && !ISKEYMODIFIER(value)) + if (ISKEYBOARD(value)) ks->key = value; } static void rna_Sensor_keyboard_modifier_set(struct PointerRNA *ptr, int value) { bSensor *sens= (bSensor *)ptr->data; - bKeyboardSensor *ks = sens->data; + bKeyboardSensor *ks = (bKeyboardSensor *)sens->data; - if (ISKEYMODIFIER(value)) + if (ISKEYBOARD(value)) ks->qual = value; } static void rna_Sensor_keyboard_modifier2_set(struct PointerRNA *ptr, int value) { bSensor *sens= (bSensor *)ptr->data; - bKeyboardSensor *ks = sens->data; + bKeyboardSensor *ks = (bKeyboardSensor *)sens->data; - if (ISKEYMODIFIER(value)) + if (ISKEYBOARD(value)) ks->qual2 = value; } @@ -235,6 +228,14 @@ static void rna_Sensor_Armature_update(Main *bmain, Scene *scene, PointerRNA *pt constraint[0] = 0; } +/* note: the following set functions exists only to avoid id refcounting */ +static void rna_Sensor_touch_material_set(PointerRNA *ptr, PointerRNA value) +{ + bSensor *sens = (bSensor *)ptr->data; + bTouchSensor *ts = (bTouchSensor *) sens->data; + + ts->ma = value.data; +} #else static void rna_def_sensor(BlenderRNA *brna) @@ -372,6 +373,8 @@ static void rna_def_touch_sensor(BlenderRNA *brna) RNA_def_property_pointer_sdna(prop, NULL, "ma"); RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Material", "Only look for objects with this material"); + /* note: custom set function is ONLY to avoid rna setting a user for this. */ + RNA_def_property_pointer_funcs(prop, NULL, "rna_Sensor_touch_material_set", NULL); RNA_def_property_update(prop, NC_LOGIC, NULL); } diff --git a/source/blender/makesrna/intern/rna_sequencer.c b/source/blender/makesrna/intern/rna_sequencer.c index bbcc1f82826..f1f4a252c16 100644 --- a/source/blender/makesrna/intern/rna_sequencer.c +++ b/source/blender/makesrna/intern/rna_sequencer.c @@ -40,9 +40,20 @@ #include "MEM_guardedalloc.h" #include "WM_types.h" +#include "BLI_math.h" #ifdef RNA_RUNTIME +static float to_dB(float x) +{ + return logf(x * x + 1e-30f) * 4.34294480f; +} + +static float from_dB(float x) +{ + return expf(x * 0.11512925f); +} + /* build a temp referene to the parent */ static void meta_tmp_ref(Sequence *seq_par, Sequence *seq) { @@ -393,6 +404,20 @@ static int rna_Sequence_proxy_filepath_length(PointerRNA *ptr) return strlen(path)+1; } +static float rna_Sequence_attenuation_get(PointerRNA *ptr) +{ + Sequence *seq= (Sequence*)(ptr->data); + + return to_dB(seq->volume); +} + +static void rna_Sequence_attenuation_set(PointerRNA *ptr, float value) +{ + Sequence *seq= (Sequence*)(ptr->data); + + seq->volume = from_dB(value); +} + /*static void rna_SoundSequence_filename_set(PointerRNA *ptr, const char *value) { @@ -1045,10 +1070,17 @@ static void rna_def_sound(BlenderRNA *brna) prop= RNA_def_property(srna, "volume", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "volume"); - RNA_def_property_range(prop, 0.0f, 2.0f); + RNA_def_property_range(prop, 0.0f, 100.0f); RNA_def_property_ui_text(prop, "Volume", "Playback volume of the sound"); RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update"); + prop= RNA_def_property(srna, "attenuation", PROP_FLOAT, PROP_NONE); + RNA_def_property_range(prop, -100.0f, +40.0f); + RNA_def_property_ui_text(prop, "Attenuation/db", "Attenuation in dezibel"); + RNA_def_property_float_funcs(prop, "rna_Sequence_attenuation_get", "rna_Sequence_attenuation_set", NULL); + + RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update"); + prop= RNA_def_property(srna, "filepath", PROP_STRING, PROP_FILEPATH); RNA_def_property_ui_text(prop, "File", ""); RNA_def_property_string_funcs(prop, "rna_Sequence_filepath_get", "rna_Sequence_filepath_length", diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index 24636de71e5..47dccda58f2 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -338,6 +338,18 @@ static void rna_RegionView3D_quadview_update(Main *main, Scene *scene, PointerRN ED_view3d_quadview_update(sa, ar); } +static void rna_RegionView3D_view_location_get(PointerRNA *ptr, float *values) +{ + RegionView3D *rv3d= (RegionView3D *)(ptr->data); + negate_v3_v3(values, rv3d->ofs); +} + +static void rna_RegionView3D_view_location_set(PointerRNA *ptr, const float *values) +{ + RegionView3D *rv3d= (RegionView3D *)(ptr->data); + negate_v3_v3(rv3d->ofs, values); +} + /* Space Image Editor */ static PointerRNA rna_SpaceImageEditor_uvedit_get(PointerRNA *ptr) @@ -514,6 +526,11 @@ static void rna_SpaceProperties_pin_id_update(Main *bmain, Scene *scene, Pointer SpaceButs *sbuts= (SpaceButs*)(ptr->data); ID *id = sbuts->pinid; + if (id == NULL) { + sbuts->flag &= ~SB_PIN_CONTEXT; + return; + } + switch (GS(id->name)) { case ID_MA: WM_main_add_notifier(NC_MATERIAL|ND_SHADING, NULL); @@ -921,7 +938,13 @@ static void rna_def_space_view3d(BlenderRNA *brna) {V3D_CENTROID, "MEDIAN_POINT", ICON_ROTATECENTER, "Median Point", ""}, {V3D_ACTIVE, "ACTIVE_ELEMENT", ICON_ROTACTIVE, "Active Element", ""}, {0, NULL, 0, NULL, NULL}}; - + + static EnumPropertyItem rv3d_persp_items[] = { + {RV3D_PERSP, "PERSP", 0, "Perspective", ""}, + {RV3D_ORTHO, "ORTHO", 0, "Orthographic", ""}, + {RV3D_CAMOB, "CAMERA", 0, "Camera", ""}, + {0, NULL, 0, NULL, NULL}}; + srna= RNA_def_struct(brna, "SpaceView3D", "Space"); RNA_def_struct_sdna(srna, "View3D"); RNA_def_struct_ui_text(srna, "3D View Space", "3D View space data"); @@ -1168,6 +1191,34 @@ static void rna_def_space_view3d(BlenderRNA *brna) RNA_def_property_clear_flag(prop, PROP_EDITABLE); // XXX: for now, it's too risky for users to do this RNA_def_property_multi_array(prop, 2, matrix_dimsize); RNA_def_property_ui_text(prop, "View Matrix", "Current view matrix of the 3D region"); + + prop= RNA_def_property(srna, "view_perspective", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "persp"); + RNA_def_property_enum_items(prop, rv3d_persp_items); + RNA_def_property_ui_text(prop, "Perspective", "View Perspective"); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); + + prop= RNA_def_property(srna, "view_location", PROP_FLOAT, PROP_TRANSLATION); +#if 0 + RNA_def_property_float_sdna(prop, NULL, "ofs"); // cant use because its negated +#else + RNA_def_property_array(prop, 3); + RNA_def_property_float_funcs(prop, "rna_RegionView3D_view_location_get", "rna_RegionView3D_view_location_set", NULL); +#endif + RNA_def_property_ui_text(prop, "View Location", "View pivot location"); + RNA_def_property_ui_range(prop, -10000.0, 10000.0, 10, 4); + RNA_def_property_update(prop, NC_WINDOW, NULL); + + prop= RNA_def_property(srna, "view_rotation", PROP_FLOAT, PROP_QUATERNION); + RNA_def_property_float_sdna(prop, NULL, "viewquat"); + RNA_def_property_ui_text(prop, "View Rotation", "Rotation in quaternions (keep normalized)"); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); + + /* not sure we need rna access to these but adding anyway */ + prop= RNA_def_property(srna, "view_distance", PROP_FLOAT, PROP_UNSIGNED); + RNA_def_property_float_sdna(prop, NULL, "dist"); + RNA_def_property_ui_text(prop, "Distance", "Distance to the view location"); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL); } static void rna_def_space_buttons(BlenderRNA *brna) diff --git a/source/blender/makesrna/intern/rna_texture.c b/source/blender/makesrna/intern/rna_texture.c index b2d613f83bf..5e58403e41b 100644 --- a/source/blender/makesrna/intern/rna_texture.c +++ b/source/blender/makesrna/intern/rna_texture.c @@ -620,13 +620,13 @@ static void rna_def_environment_map(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Ignore Layers", "Hide objects on these layers when generating the Environment Map"); RNA_def_property_update(prop, 0, "rna_Texture_update"); - prop= RNA_def_property(srna, "resolution", PROP_INT, PROP_NONE); + prop= RNA_def_property(srna, "resolution", PROP_INT, PROP_UNSIGNED); RNA_def_property_int_sdna(prop, NULL, "cuberes"); RNA_def_property_range(prop, 50, 4096); RNA_def_property_ui_text(prop, "Resolution", "Pixel resolution of the rendered environment map"); RNA_def_property_update(prop, 0, "rna_Texture_update"); - prop= RNA_def_property(srna, "depth", PROP_INT, PROP_NONE); + prop= RNA_def_property(srna, "depth", PROP_INT, PROP_UNSIGNED); RNA_def_property_range(prop, 0, 5); RNA_def_property_ui_text(prop, "Depth", "Number of times a map will be rendered recursively (mirror effects.)"); RNA_def_property_update(prop, 0, "rna_Texture_update"); diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c index e19efd745d8..3a734dde0c3 100644 --- a/source/blender/makesrna/intern/rna_userdef.c +++ b/source/blender/makesrna/intern/rna_userdef.c @@ -524,6 +524,13 @@ static void rna_def_userdef_theme_ui(BlenderRNA *brna) RNA_def_property_struct_type(prop, "ThemeWidgetColors"); RNA_def_property_ui_text(prop, "Scroll Widget Colors", ""); RNA_def_property_update(prop, 0, "rna_userdef_update"); + + prop= RNA_def_property(srna, "wcol_progress", PROP_POINTER, PROP_NONE); + RNA_def_property_flag(prop, PROP_NEVER_NULL); + RNA_def_property_pointer_sdna(prop, NULL, "wcol_progress"); + RNA_def_property_struct_type(prop, "ThemeWidgetColors"); + RNA_def_property_ui_text(prop, "Progress Bar Widget Colors", ""); + RNA_def_property_update(prop, 0, "rna_userdef_update"); prop= RNA_def_property(srna, "wcol_list_item", PROP_POINTER, PROP_NONE); RNA_def_property_flag(prop, PROP_NEVER_NULL); diff --git a/source/blender/modifiers/intern/MOD_meshdeform.c b/source/blender/modifiers/intern/MOD_meshdeform.c index 4b53ac910d1..83fa544690b 100644 --- a/source/blender/modifiers/intern/MOD_meshdeform.c +++ b/source/blender/modifiers/intern/MOD_meshdeform.c @@ -208,8 +208,10 @@ static void meshdeformModifier_do( cagedm->needsFree= 1; } - if(!cagedm) + if(!cagedm) { + modifier_setError(md, "Can't get mesh from cage object."); return; + } /* compute matrices to go in and out of cage object space */ invert_m4_m4(imat, mmd->object->obmat); @@ -234,11 +236,21 @@ static void meshdeformModifier_do( totvert= numVerts; totcagevert= cagedm->getNumVerts(cagedm); - if(mmd->totvert!=totvert || mmd->totcagevert!=totcagevert || !mmd->bindcagecos) { + if(mmd->totvert != totvert) { + modifier_setError(md, "Verts changed from %d to %d.", mmd->totvert, totvert); cagedm->release(cagedm); return; } - + else if (mmd->totcagevert != totcagevert) { + modifier_setError(md, "Cage verts changed from %d to %d.", mmd->totcagevert, totcagevert); + cagedm->release(cagedm); + return; + } else if (mmd->bindcagecos == NULL) { + modifier_setError(md, "Bind data missing."); + cagedm->release(cagedm); + return; + } + /* setup deformation data */ cagemvert= cagedm->getVertArray(cagedm); influences= mmd->bindinfluences; diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_displace.c b/source/blender/nodes/intern/CMP_nodes/CMP_displace.c index 877f71bfbfb..6fe6dcd8440 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_displace.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_displace.c @@ -44,94 +44,83 @@ static bNodeSocketType cmp_node_displace_out[]= { { -1, 0, "" } }; -static float *vecbuf_get_pixel(CompBuf *vecbuf, float *veccol, int x, int y) -{ - /* the x-xrad stuff is a bit weird, but i seem to need it otherwise - * my returned pixels are offset weirdly */ - return compbuf_get_pixel(vecbuf, veccol, x-vecbuf->xrad, y-vecbuf->yrad, vecbuf->xrad, vecbuf->yrad); -} +/* minimum distance (in pixels) a pixel has to be displaced + * in order to take effect */ +#define DISPLACE_EPSILON 0.01 static void do_displace(CompBuf *stackbuf, CompBuf *cbuf, CompBuf *vecbuf, float *veccol, float *xscale, float *yscale) { ImBuf *ibuf; - float dx=0.0, dy=0.0; - float dspx, dspy; - float uv[2], col[4], colnext[4], colprev[4]; - float *vp, *vpnext, *vpprev; - float *out= stackbuf->rect, *vec=vecbuf->rect, *in= cbuf->rect; - int x, y, vx, vy, sx, sy; + int x, y; + float p_dx, p_dy; /* main displacement in pixel space */ + float d_dx, d_dy; + float dxt, dyt; + float u, v; + float vec[3], vecdx[3], vecdy[3]; + float col[3]; - /* ibuf needed for sampling */ ibuf= IMB_allocImBuf(cbuf->x, cbuf->y, 32, 0, 0); ibuf->rect_float= cbuf->rect; - vec = vecbuf->rect; - - sx= stackbuf->x; - sy= stackbuf->y; - - QUATCOPY(col, veccol); - QUATCOPY(colnext, veccol); - QUATCOPY(colprev, veccol); - - for(y=0; yy; y++) { + for(x=0; x < stackbuf->x; x++) { + /* calc pixel coordinates */ + qd_getPixel(vecbuf, x-vecbuf->xof, y-vecbuf->yof, vec); + p_dx = vec[0] * xscale[0]; + p_dy = vec[1] * yscale[0]; - vp = vecbuf_get_pixel(vecbuf, col, x, y); - - /* this happens in compbuf_get_pixel, need to make sure the following - * check takes them into account */ - vx= x-vecbuf->xof; - vy= y-vecbuf->yof; - - /* find the new displaced co-ords, also correcting for translate offset */ - dspx = vx - (*xscale * vp[0]); - dspy = vy - (*yscale * vp[1]); - - /* convert image space to 0.0-1.0 UV space for sampling, correcting for translate offset */ - uv[0] = dspx / (float)sx; - uv[1] = dspy / (float)sy; - - if(vx>0 && vx< vecbuf->x-1 && vy>0 && vy< vecbuf->y-1) { - /* adaptive sampling, X and Y channel. - * we call vecbuf_get_pixel for every pixel since the input - * might be a procedural, and then we can't use offsets */ - vpprev = vecbuf_get_pixel(vecbuf, colprev, x-1, y); - vpnext = vecbuf_get_pixel(vecbuf, colnext, x+1, y); - dx= 0.5f*(fabs(vp[0]-vpprev[0]) + fabs(vp[0]-vpnext[0])); - - vpprev = vecbuf_get_pixel(vecbuf, colprev, x, y-1); - vpnext = vecbuf_get_pixel(vecbuf, colnext, x, y+1); - dy= 0.5f*(fabs(vp[1]-vpnext[1]) + fabs(vp[1]-vpprev[1])); - - vpprev = vecbuf_get_pixel(vecbuf, colprev, x-1, y-1); - vpnext = vecbuf_get_pixel(vecbuf, colnext, x-1, y+1); - dx+= 0.25f*(fabs(vp[0]-vpprev[0]) + fabs(vp[0]-vpnext[0])); - dy+= 0.25f*(fabs(vp[1]-vpprev[1]) + fabs(vp[1]-vpnext[1])); - - vpprev = vecbuf_get_pixel(vecbuf, colprev, x+1, y-1); - vpnext = vecbuf_get_pixel(vecbuf, colnext, x+1, y+1); - dx+= 0.25f*(fabs(vp[0]-vpprev[0]) + fabs(vp[0]-vpnext[0])); - dy+= 0.25f*(fabs(vp[1]-vpprev[1]) + fabs(vp[1]-vpnext[1])); - - /* scaled down to prevent blurriness */ - /* 8: magic number, provides a good level of sharpness without getting too aliased */ - dx /= 8; - dy /= 8; + /* if no displacement, then just copy this pixel */ + if (p_dx < DISPLACE_EPSILON && p_dy < DISPLACE_EPSILON) { + qd_getPixel(cbuf, x-cbuf->xof, y-cbuf->yof, col); + qd_setPixel(stackbuf, x, y, col); + continue; } - - /* should use mipmap */ - if(dx > 0.006f) dx= 0.006f; - if(dy > 0.006f) dy= 0.006f; - if ((vp[0]> 0.0) && (dx < 0.004)) dx = 0.004; - if ((vp[1]> 0.0) && (dy < 0.004)) dy = 0.004; - - ibuf_sample(ibuf, uv[0], uv[1], dx, dy, out); + /* displaced pixel in uv coords, for image sampling */ + u = (x - cbuf->xof - p_dx + 0.5f) / (float)stackbuf->x; + v = (y - cbuf->yof - p_dy + 0.5f) / (float)stackbuf->y; + + + /* calc derivatives */ + qd_getPixel(vecbuf, x-vecbuf->xof+1, y-vecbuf->yof, vecdx); + qd_getPixel(vecbuf, x-vecbuf->xof, y-vecbuf->yof+1, vecdy); + d_dx = vecdx[0] * xscale[0]; + d_dy = vecdy[0] * yscale[0]; + + /* clamp derivatives to minimum displacement distance in UV space */ + dxt = MAX2(p_dx - d_dx, DISPLACE_EPSILON)/(float)stackbuf->x; + dyt = MAX2(p_dy - d_dy, DISPLACE_EPSILON)/(float)stackbuf->y; + + ibuf_sample(ibuf, u, v, dxt, dyt, col); + qd_setPixel(stackbuf, x, y, col); } } - - IMB_freeImBuf(ibuf); + IMB_freeImBuf(ibuf); + + +/* simple method for reference, linear interpolation */ +/* + int x, y; + float dx, dy; + float u, v; + float vec[3]; + float col[3]; + + for(y=0; y < stackbuf->y; y++) { + for(x=0; x < stackbuf->x; x++) { + qd_getPixel(vecbuf, x, y, vec); + + dx = vec[0] * (xscale[0]); + dy = vec[1] * (yscale[0]); + + u = (x - dx + 0.5f) / (float)stackbuf->x; + v = (y - dy + 0.5f) / (float)stackbuf->y; + + qd_getPixelLerp(cbuf, u*cbuf->x - 0.5f, v*cbuf->y - 0.5f, col); + qd_setPixel(stackbuf, x, y, col); + } + } +*/ } diff --git a/source/blender/python/BPY_extern.h b/source/blender/python/BPY_extern.h index 11208d54a73..40d544ac17e 100644 --- a/source/blender/python/BPY_extern.h +++ b/source/blender/python/BPY_extern.h @@ -119,9 +119,11 @@ extern "C" { // short eventValue, unsigned short space_event); // // void BPY_pydriver_update(void); - float BPY_pydriver_eval(struct ChannelDriver *driver); + float BPY_eval_driver(struct ChannelDriver *driver); // - int BPY_button_eval(struct bContext *C, char *expr, double *value); + int BPY_eval_button(struct bContext *C, const char *expr, double *value); + + int BPY_eval_string(struct bContext *C, const char *expr); /* format importer hook */ int BPY_call_importloader( char *name ); diff --git a/source/blender/python/doc/sphinx_doc_gen.py b/source/blender/python/doc/sphinx_doc_gen.py index aa42c2f8a4a..9044212ac4d 100644 --- a/source/blender/python/doc/sphinx_doc_gen.py +++ b/source/blender/python/doc/sphinx_doc_gen.py @@ -36,6 +36,7 @@ For PDF generation make ''' +# import rpdb2; rpdb2.start_embedded_debugger('test') import os import inspect @@ -133,7 +134,7 @@ def py_descr2sphinx(ident, fw, descr, module_name, type_name, identifier): if type(descr) == GetSetDescriptorType: fw(ident + ".. attribute:: %s\n\n" % identifier) - write_indented_lines(ident, fw, doc, False) + write_indented_lines(ident + " ", fw, doc, False) elif type(descr) == MethodDescriptorType: # GetSetDescriptorType, GetSetDescriptorType's are not documented yet write_indented_lines(ident, fw, doc, False) else: diff --git a/source/blender/python/generic/mathutils_vector.c b/source/blender/python/generic/mathutils_vector.c index af549762756..a9bcdacdb03 100644 --- a/source/blender/python/generic/mathutils_vector.c +++ b/source/blender/python/generic/mathutils_vector.c @@ -255,8 +255,11 @@ static PyObject *Vector_ToTuple(VectorObject *self, PyObject *args) { int ndigits= 0; - if(!PyArg_ParseTuple(args, "|i:to_tuple", &ndigits) || (ndigits > 22 || ndigits < 0)) { - PyErr_SetString(PyExc_TypeError, "vector.to_tuple(ndigits): ndigits must be between 0 and 21"); + if(!PyArg_ParseTuple(args, "|i:to_tuple", &ndigits)) + return NULL; + + if(ndigits > 22 || ndigits < 0) { + PyErr_SetString(PyExc_ValueError, "vector.to_tuple(ndigits): ndigits must be between 0 and 21"); return NULL; } @@ -288,10 +291,9 @@ static PyObject *Vector_ToTrackQuat(VectorObject *self, PyObject *args ) char *strack, *sup; short track = 2, up = 1; - if(!PyArg_ParseTuple( args, "|ss:to_track_quat", &strack, &sup)) { - PyErr_SetString( PyExc_TypeError, "expected optional two strings\n" ); + if(!PyArg_ParseTuple( args, "|ss:to_track_quat", &strack, &sup)) return NULL; - } + if (self->size != 3) { PyErr_SetString( PyExc_TypeError, "only for 3D vectors\n" ); return NULL; @@ -498,21 +500,28 @@ static PyObject *Vector_Dot(VectorObject *self, VectorObject *value ) return PyFloat_FromDouble(dot); } -static char Vector_Angle_doc[] = -".. function:: angle(other)\n" +static char Vector_angle_doc[] = +".. function:: angle(other, fallback)\n" "\n" " Return the angle between two vectors.\n" "\n" +" :arg other: another vector to compare the angle with\n" " :type other: :class:`Vector`\n" -" :return angle: angle in radians\n" +" :arg fallback: return this value when the angle cant be calculated (zero length vector)\n" +" :return angle: angle in radians or fallback when given\n" " :rtype: float\n" "\n" " .. note:: Zero length vectors raise an :exc:`AttributeError`.\n"; -static PyObject *Vector_Angle(VectorObject *self, VectorObject *value) +static PyObject *Vector_angle(VectorObject *self, PyObject *args) { + VectorObject *value; double dot = 0.0f, angleRads, test_v1 = 0.0f, test_v2 = 0.0f; int x, size; + PyObject *fallback= NULL; + if(!PyArg_ParseTuple(args, "O!|O:angle", &vector_Type, &value, &fallback)) + return NULL; + if (!VectorObject_Check(value)) { PyErr_SetString( PyExc_TypeError, "vec.angle(value): expected a vector argument" ); return NULL; @@ -534,8 +543,15 @@ static PyObject *Vector_Angle(VectorObject *self, VectorObject *value) test_v2 += value->vec[x] * value->vec[x]; } if (!test_v1 || !test_v2){ - PyErr_SetString(PyExc_AttributeError, "vector.angle(other): zero length vectors are not acceptable arguments\n"); - return NULL; + /* avoid exception */ + if(fallback) { + Py_INCREF(fallback); + return fallback; + } + else { + PyErr_SetString(PyExc_ValueError, "vector.angle(other): zero length vectors have no valid angle\n"); + return NULL; + } } //dot product @@ -649,10 +665,9 @@ static PyObject *Vector_Lerp(VectorObject *self, PyObject *args) float fac, ifac, vec[4]; int x; - if(!PyArg_ParseTuple(args, "O!f:lerp", &vector_Type, &vec2, &fac)) { - PyErr_SetString(PyExc_TypeError, "vector.lerp(): expects a vector of the same size and float"); + if(!PyArg_ParseTuple(args, "O!f:lerp", &vector_Type, &vec2, &fac)) return NULL; - } + if(self->size != vec2->size) { PyErr_SetString(PyExc_AttributeError, "vector.lerp(): expects (2) vector objects of the same size"); return NULL; @@ -2037,7 +2052,7 @@ static struct PyMethodDef Vector_methods[] = { {"reflect", ( PyCFunction ) Vector_Reflect, METH_O, Vector_Reflect_doc}, {"cross", ( PyCFunction ) Vector_Cross, METH_O, Vector_Cross_doc}, {"dot", ( PyCFunction ) Vector_Dot, METH_O, Vector_Dot_doc}, - {"angle", ( PyCFunction ) Vector_Angle, METH_O, Vector_Angle_doc}, + {"angle", ( PyCFunction ) Vector_angle, METH_VARARGS, Vector_angle_doc}, {"difference", ( PyCFunction ) Vector_Difference, METH_O, Vector_Difference_doc}, {"project", ( PyCFunction ) Vector_Project, METH_O, Vector_Project_doc}, {"lerp", ( PyCFunction ) Vector_Lerp, METH_VARARGS, Vector_Lerp_doc}, diff --git a/source/blender/python/intern/bpy_driver.c b/source/blender/python/intern/bpy_driver.c index afe6b63458f..8f49263b375 100644 --- a/source/blender/python/intern/bpy_driver.c +++ b/source/blender/python/intern/bpy_driver.c @@ -103,7 +103,7 @@ static int bpy_pydriver_create_dict(void) } /* Update function, it gets rid of pydrivers global dictionary, forcing - * BPY_pydriver_eval to recreate it. This function is used to force + * BPY_eval_driver to recreate it. This function is used to force * reloading the Blender text module "pydrivers.py", if available, so * updates in it reach pydriver evaluation. */ @@ -153,7 +153,7 @@ static float pydriver_error(ChannelDriver *driver) * bake operator which intern starts a thread which calls scene update which * does a driver update. to avoid a deadlock check PyThreadState_Get() if PyGILState_Ensure() is needed. */ -float BPY_pydriver_eval (ChannelDriver *driver) +float BPY_eval_driver (ChannelDriver *driver) { PyObject *driver_vars=NULL; PyObject *retval= NULL; @@ -246,11 +246,11 @@ float BPY_pydriver_eval (ChannelDriver *driver) /* this target failed - bad name */ if (targets_ok) { /* first one - print some extra info for easier identification */ - fprintf(stderr, "\nBPY_pydriver_eval() - Error while evaluating PyDriver:\n"); + fprintf(stderr, "\nBPY_eval_driver() - Error while evaluating PyDriver:\n"); targets_ok= 0; } - fprintf(stderr, "\tBPY_pydriver_eval() - couldn't add variable '%s' to namespace\n", dvar->name); + fprintf(stderr, "\tBPY_eval_driver() - couldn't add variable '%s' to namespace\n", dvar->name); // BPy_errors_to_report(NULL); // TODO - reports PyErr_Print(); PyErr_Clear(); @@ -290,7 +290,7 @@ float BPY_pydriver_eval (ChannelDriver *driver) return (float)result; } else { - fprintf(stderr, "\tBPY_pydriver_eval() - driver '%s' evaluates to '%f'\n", dvar->name, result); + fprintf(stderr, "\tBPY_eval_driver() - driver '%s' evaluates to '%f'\n", dvar->name, result); return 0.0f; } } diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c index 285dbb78874..2a3f83a066b 100644 --- a/source/blender/python/intern/bpy_interface.c +++ b/source/blender/python/intern/bpy_interface.c @@ -528,7 +528,7 @@ int BPY_run_python_script_space(const char *modulename, const char *func) #endif -int BPY_button_eval(bContext *C, char *expr, double *value) +int BPY_eval_button(bContext *C, const char *expr, double *value) { PyGILState_STATE gilstate; PyObject *dict, *mod, *retval; @@ -599,6 +599,40 @@ int BPY_button_eval(bContext *C, char *expr, double *value) return error_ret; } +int BPY_eval_string(bContext *C, const char *expr) +{ + PyGILState_STATE gilstate; + PyObject *dict, *retval; + int error_ret = 0; + + if (!expr) return -1; + + if(expr[0]=='\0') { + return error_ret; + } + + bpy_context_set(C, &gilstate); + + dict= CreateGlobalDictionary(C, NULL); + + retval = PyRun_String(expr, Py_eval_input, dict, dict); + + if (retval == NULL) { + error_ret= -1; + + BPy_errors_to_report(CTX_wm_reports(C)); + } + else { + Py_DECREF(retval); + } + + Py_DECREF(dict); + bpy_context_clear(C, &gilstate); + + return error_ret; +} + + void BPY_load_user_modules(bContext *C) { PyGILState_STATE gilstate; diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h index 0d8161c9a7a..b72ba8e0c40 100644 --- a/source/blender/render/extern/include/RE_pipeline.h +++ b/source/blender/render/extern/include/RE_pipeline.h @@ -230,7 +230,7 @@ void RE_display_init_cb (struct Render *re, void *handle, void (*f)(void *handle void RE_display_clear_cb(struct Render *re, void *handle, void (*f)(void *handle, RenderResult *rr)); void RE_display_draw_cb (struct Render *re, void *handle, void (*f)(void *handle, RenderResult *rr, volatile struct rcti *rect)); void RE_stats_draw_cb (struct Render *re, void *handle, void (*f)(void *handle, RenderStats *rs)); -void RE_timecursor_cb (struct Render *re, void *handle, void (*f)(void *handle, int)); +void RE_progress_cb (struct Render *re, void *handle, void (*f)(void *handle, float)); void RE_test_break_cb (struct Render *re, void *handle, int (*f)(void *handle)); void RE_error_cb (struct Render *re, void *handle, void (*f)(void *handle, char *str)); diff --git a/source/blender/render/extern/include/RE_shader_ext.h b/source/blender/render/extern/include/RE_shader_ext.h index 742eb851c50..6cab4a7ce03 100644 --- a/source/blender/render/extern/include/RE_shader_ext.h +++ b/source/blender/render/extern/include/RE_shader_ext.h @@ -199,7 +199,7 @@ struct Image; struct Object; void RE_shade_external(struct Render *re, struct ShadeInput *shi, struct ShadeResult *shr); -int RE_bake_shade_all_selected(struct Render *re, int type, struct Object *actob, short *do_update); +int RE_bake_shade_all_selected(struct Render *re, int type, struct Object *actob, short *do_update, float *progress); struct Image *RE_bake_shade_get_image(void); #endif /* RE_SHADER_EXT_H */ diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h index 127fbce20eb..1abc431fc6d 100644 --- a/source/blender/render/intern/include/render_types.h +++ b/source/blender/render/intern/include/render_types.h @@ -234,8 +234,8 @@ struct Render void (*stats_draw)(void *handle, RenderStats *ri); void *sdh; - void (*timecursor)(void *handle, int i); - void *tch; + void (*progress)(void *handle, float i); + void *prh; int (*test_break)(void *handle); void *tbh; diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index f6be316dcfd..86c6a325bcd 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -1532,8 +1532,6 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem /* 1. check that everything is ok & updated */ if(psys==NULL) return 0; - - totchild=psys->totchild; part=psys->part; pars=psys->particles; @@ -1554,6 +1552,8 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem if(part->phystype==PART_PHYS_KEYED) psys_count_keyed_targets(&sim); + psys_update_children(&sim); + totchild=psys->totchild; if(G.rendering == 0) { /* preview render */ totchild = (int)((float)totchild * (float)part->disp / 100.0f); @@ -1657,6 +1657,9 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem transpose_m3(nmat); /* 2.6 setup strand rendering */ + if(part->ren_as == PART_DRAW_PATH && psys->pathcache==NULL) + psys_update_path_cache(&sim, cfra); + if(part->ren_as == PART_DRAW_PATH && psys->pathcache){ path_nbr=(int)pow(2.0,(double) part->ren_step); diff --git a/source/blender/render/intern/source/imagetexture.c b/source/blender/render/intern/source/imagetexture.c index 21077c289c3..8d1caf2b8b9 100644 --- a/source/blender/render/intern/source/imagetexture.c +++ b/source/blender/render/intern/source/imagetexture.c @@ -586,49 +586,19 @@ static void boxsample(ImBuf *ibuf, float minx, float miny, float maxx, float max } } -void image_sample(Image *ima, float fx, float fy, float dx, float dy, float *result) -{ - TexResult texres; - ImBuf *ibuf= BKE_image_get_ibuf(ima, NULL); - - if(ibuf==NULL) { - result[0]= result[1]= result[2]= result[3]= 0.0f; - return; - } - - if( (R.flag & R_SEC_FIELD) && (ibuf->flags & IB_fields) ) - ibuf->rect+= (ibuf->x*ibuf->y); - - boxsample(ibuf, fx, fy, fx+dx, fy+dy, &texres, 0, 1, 0); - result[0]= texres.tr; - result[1]= texres.tg; - result[2]= texres.tb; - result[3]= texres.ta; - - if( (R.flag & R_SEC_FIELD) && (ibuf->flags & IB_fields) ) - ibuf->rect-= (ibuf->x*ibuf->y); -} - -void ibuf_sample(ImBuf *ibuf, float fx, float fy, float dx, float dy, float *result) -{ - TexResult texres; - - if(ibuf==NULL) { - return; - } - - memset(&texres, 0, sizeof(texres)); - boxsample(ibuf, fx, fy, fx+dx, fy+dy, &texres, 0, 1, 0); - result[0]= texres.tr; - result[1]= texres.tg; - result[2]= texres.tb; - result[3]= texres.ta; -} - - //----------------------------------------------------------------------------------------------------------------- // from here, some functions only used for the new filtering +// anisotropic filters, data struct used instead of long line of (possibly unused) func args +typedef struct afdata_t { + float dxt[2], dyt[2]; + int intpol, extflag; + // feline only + float majrad, minrad, theta; + int iProbes; + float dusc, dvsc; +} afdata_t; + // this only used here to make it easier to pass extend flags as single int enum {TXC_XMIR=1, TXC_YMIR, TXC_REPT, TXC_EXTD}; @@ -713,16 +683,6 @@ static int ibuf_get_color_clip_bilerp(float *col, ImBuf *ibuf, float u, float v, return ibuf_get_color_clip(col, ibuf, (int)u, (int)v, extflag); } -// anisotropic filters, data struct used instead of long line of (possibly unused) func args -typedef struct afdata_t { - float dxt[2], dyt[2]; - int intpol, extflag; - // feline only - float majrad, minrad, theta; - int iProbes; - float dusc, dvsc; -} afdata_t; - static void area_sample(TexResult* texr, ImBuf* ibuf, float fx, float fy, afdata_t* AFD) { int xs, ys, clip = 0; @@ -1775,3 +1735,53 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *DXT, f return retval; } + +void image_sample(Image *ima, float fx, float fy, float dx, float dy, float *result) +{ + TexResult texres; + ImBuf *ibuf= BKE_image_get_ibuf(ima, NULL); + + if(ibuf==NULL) { + result[0]= result[1]= result[2]= result[3]= 0.0f; + return; + } + + if( (R.flag & R_SEC_FIELD) && (ibuf->flags & IB_fields) ) + ibuf->rect+= (ibuf->x*ibuf->y); + + boxsample(ibuf, fx, fy, fx+dx, fy+dy, &texres, 0, 1, 0); + result[0]= texres.tr; + result[1]= texres.tg; + result[2]= texres.tb; + result[3]= texres.ta; + + if( (R.flag & R_SEC_FIELD) && (ibuf->flags & IB_fields) ) + ibuf->rect-= (ibuf->x*ibuf->y); +} + +void ibuf_sample(ImBuf *ibuf, float fx, float fy, float dx, float dy, float *result) +{ + TexResult texres; + afdata_t AFD; + + if(ibuf==NULL) { + return; + } + + AFD.dxt[0] = dx; AFD.dxt[1] = dx; + AFD.dyt[0] = dy; AFD.dyt[1] = dy; + //copy_v2_v2(AFD.dxt, dx); + //copy_v2_v2(AFD.dyt, dy); + + AFD.intpol = 1; + AFD.extflag = TXC_EXTD; + + memset(&texres, 0, sizeof(texres)); + ewa_eval(&texres, ibuf, fx, fy, &AFD); + + + result[0]= texres.tr; + result[1]= texres.tg; + result[2]= texres.tb; + result[3]= texres.ta; +} \ No newline at end of file diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index 0f4cfb636da..180f8a960db 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -131,7 +131,7 @@ static int thread_break(void *unused) static void result_nothing(void *unused, RenderResult *rr) {} static void result_rcti_nothing(void *unused, RenderResult *rr, volatile struct rcti *rect) {} static void stats_nothing(void *unused, RenderStats *rs) {} -static void int_nothing(void *unused, int val) {} +static void float_nothing(void *unused, float val) {} static void print_error(void *unused, char *str) {printf("ERROR: %s\n", str);} static int default_break(void *unused) {return G.afbreek == 1;} @@ -149,7 +149,7 @@ static void stats_background(void *unused, RenderStats *rs) mmap_used_memory= (mmap_in_use)/(1024.0*1024.0); megs_peak_memory = (peak_memory)/(1024.0*1024.0); - spos+= sprintf(spos, "Fra:%d Mem:%.2fM (%.2fM, combined peak %.2fM) ", rs->cfra, + spos+= sprintf(spos, "Fra:%d Mem:%.2fM (%.2fM, peak %.2fM) ", rs->cfra, megs_used_memory, mmap_used_memory, megs_peak_memory); if(rs->curfield) @@ -1162,7 +1162,7 @@ Render *RE_NewRender(const char *name) re->display_init= result_nothing; re->display_clear= result_nothing; re->display_draw= result_rcti_nothing; - re->timecursor= int_nothing; + re->progress= float_nothing; re->test_break= default_break; re->error= print_error; if(G.background) @@ -1170,7 +1170,7 @@ Render *RE_NewRender(const char *name) else re->stats_draw= stats_nothing; /* clear callback handles */ - re->dih= re->dch= re->ddh= re->sdh= re->tch= re->tbh= re->erh= NULL; + re->dih= re->dch= re->ddh= re->sdh= re->prh= re->tbh= re->erh= NULL; /* init some variables */ re->ycor= 1.0f; @@ -1374,10 +1374,10 @@ void RE_stats_draw_cb(Render *re, void *handle, void (*f)(void *handle, RenderSt re->stats_draw= f; re->sdh= handle; } -void RE_timecursor_cb(Render *re, void *handle, void (*f)(void *handle, int)) +void RE_progress_cb(Render *re, void *handle, void (*f)(void *handle, float)) { - re->timecursor= f; - re->tch= handle; + re->progress= f; + re->prh= handle; } void RE_test_break_cb(Render *re, void *handle, int (*f)(void *handle)) @@ -1694,6 +1694,7 @@ static void threaded_tile_processor(Render *re) free_render_result(&pa->fullresult, pa->result); pa->result= NULL; re->i.partsdone++; + re->progress(re->prh, re->i.partsdone / (float)re->i.totpart); hasdrawn= 1; } } @@ -2376,8 +2377,11 @@ static void do_render_composite_fields_blur_3d(Render *re) if(!re->test_break(re->tbh)) { ntree->stats_draw= render_composit_stats; ntree->test_break= re->test_break; + ntree->progress= re->progress; ntree->sdh= re->sdh; ntree->tbh= re->tbh; + ntree->prh= re->prh; + /* in case it was never initialized */ R.sdh= re->sdh; R.stats_draw= re->stats_draw; @@ -2393,7 +2397,8 @@ static void do_render_composite_fields_blur_3d(Render *re) ntree->stats_draw= NULL; ntree->test_break= NULL; - ntree->tbh= ntree->sdh= NULL; + ntree->progress= NULL; + ntree->tbh= ntree->sdh= ntree->prh= NULL; } } else if(re->r.scemode & R_FULL_SAMPLE) diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c index 047bbd7629f..8e1a959abef 100644 --- a/source/blender/render/intern/source/rendercore.c +++ b/source/blender/render/intern/source/rendercore.c @@ -2619,7 +2619,7 @@ static void *do_bake_thread(void *bs_v) /* using object selection tags, the faces with UV maps get baked */ /* render should have been setup */ /* returns 0 if nothing was handled */ -int RE_bake_shade_all_selected(Render *re, int type, Object *actob, short *do_update) +int RE_bake_shade_all_selected(Render *re, int type, Object *actob, short *do_update, float *progress) { BakeShade *handles; ListBase threads; @@ -2634,7 +2634,7 @@ int RE_bake_shade_all_selected(Render *re, int type, Object *actob, short *do_up get_next_bake_face(NULL); /* do we need a mask? */ - if (re->r.bake_filter && (re->r.bake_flag & R_BAKE_CLEAR)==0) + if (re->r.bake_filter) usemask = 1; /* baker uses this flag to detect if image was initialized */ @@ -2680,12 +2680,18 @@ int RE_bake_shade_all_selected(Render *re, int type, Object *actob, short *do_up /* wait for everything to be done */ a= 0; while(a!=re->r.threads) { - PIL_sleep_ms(50); - for(a=0; ar.threads; a++) + /* calculate progress */ + for(vdone=0, a=0; ar.threads; a++) + vdone+= handles[a].vdone; + if (progress) + *progress = (float)(vdone / (float)re->totvlak); + + for(a=0; ar.threads; a++) { if(handles[a].ready==0) break; + } } /* filter and refresh images */ @@ -2733,12 +2739,10 @@ int RE_bake_shade_all_selected(Render *re, int type, Object *actob, short *do_up } /* calculate return value */ - for(a=0; ar.threads; a++) { - vdone+= handles[a].vdone; - + for(a=0; ar.threads; a++) { zbuf_free_span(handles[a].zspan); MEM_freeN(handles[a].zspan); - } + } MEM_freeN(handles); diff --git a/source/blender/render/intern/source/texture.c b/source/blender/render/intern/source/texture.c index 8b33753c2b1..9b087900734 100644 --- a/source/blender/render/intern/source/texture.c +++ b/source/blender/render/intern/source/texture.c @@ -2676,7 +2676,8 @@ void do_sky_tex(float *rco, float *lo, float *dxyview, float *hor, float *zen, f switch(mtex->texco) { case TEXCO_ANGMAP: /* only works with texture being "real" */ - fact= (1.0/M_PI)*acos(lo[2])/(sqrt(lo[0]*lo[0] + lo[1]*lo[1])); + /* use saacos(), fixes bug [#22398], float precission caused lo[2] to be slightly less then -1.0 */ + fact= (1.0/M_PI)*saacos(lo[2])/(sqrt(lo[0]*lo[0] + lo[1]*lo[1])); tempvec[0]= lo[0]*fact; tempvec[1]= lo[1]*fact; tempvec[2]= 0.0; diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index 070b03dd195..40186f40e9d 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -299,15 +299,18 @@ int WM_framebuffer_to_index(unsigned int col); /* threaded Jobs Manager */ #define WM_JOB_PRIORITY 1 #define WM_JOB_EXCL_RENDER 2 +#define WM_JOB_PROGRESS 4 -struct wmJob *WM_jobs_get(struct wmWindowManager *wm, struct wmWindow *win, void *owner, int flag); +struct wmJob *WM_jobs_get(struct wmWindowManager *wm, struct wmWindow *win, void *owner, char *name, int flag); int WM_jobs_test(struct wmWindowManager *wm, void *owner); +float WM_jobs_progress(struct wmWindowManager *wm, void *owner); +char *WM_jobs_name(struct wmWindowManager *wm, void *owner); void WM_jobs_customdata(struct wmJob *, void *customdata, void (*free)(void *)); void WM_jobs_timer(struct wmJob *, double timestep, unsigned int note, unsigned int endnote); void WM_jobs_callbacks(struct wmJob *, - void (*startjob)(void *, short *, short *), + void (*startjob)(void *, short *, short *, float *), void (*initjob)(void *), void (*update)(void *), void (*endjob)(void *)); diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h index 1bede614732..2769f550f9a 100644 --- a/source/blender/windowmanager/WM_types.h +++ b/source/blender/windowmanager/WM_types.h @@ -158,6 +158,7 @@ typedef struct wmNotifier { #define ND_FILESAVE (2<<16) #define ND_DATACHANGED (3<<16) #define ND_HISTORY (4<<16) +#define ND_JOB (5<<16) /* NC_SCREEN screen */ #define ND_SCREENBROWSE (1<<16) diff --git a/source/blender/windowmanager/intern/wm.c b/source/blender/windowmanager/intern/wm.c index 39c5e69d982..452c37dbe77 100644 --- a/source/blender/windowmanager/intern/wm.c +++ b/source/blender/windowmanager/intern/wm.c @@ -30,8 +30,6 @@ #include "DNA_windowmanager_types.h" -#include "MEM_guardedalloc.h" - #include "GHOST_C-api.h" #include "BLI_blenlib.h" @@ -53,6 +51,8 @@ #include "wm_draw.h" #include "wm.h" +#include "MEM_guardedalloc.h" + #include "ED_screen.h" #include "BPY_extern.h" diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c index c981836a8ed..aa217517907 100644 --- a/source/blender/windowmanager/intern/wm_files.c +++ b/source/blender/windowmanager/intern/wm_files.c @@ -77,10 +77,15 @@ #include "RNA_access.h" +#include "IMB_imbuf.h" +#include "IMB_imbuf_types.h" +#include "IMB_thumbs.h" + #include "ED_datafiles.h" #include "ED_object.h" #include "ED_screen.h" #include "ED_sculpt.h" +#include "ED_view3d.h" #include "ED_util.h" #include "GHOST_C-api.h" @@ -486,12 +491,57 @@ static void do_history(char *name, ReportList *reports) BKE_report(reports, RPT_ERROR, "Unable to make version backup"); } +static ImBuf *blend_file_thumb(const char *path, Scene *scene, int **thumb_pt) +{ + /* will be scaled down, but gives some nice oversampling */ + ImBuf *ibuf; + int *thumb; + + *thumb_pt= NULL; + + if(G.background || scene->camera==NULL) + return NULL; + + /* gets scaled to BLEN_THUMB_SIZE */ + ibuf= ED_view3d_draw_offscreen_imbuf_simple(scene, BLEN_THUMB_SIZE * 2, BLEN_THUMB_SIZE * 2, OB_SOLID); + + if(ibuf) { + float aspect= (scene->r.xsch*scene->r.xasp) / (scene->r.ysch*scene->r.yasp); + + /* dirty oversampling */ + IMB_scaleImBuf(ibuf, BLEN_THUMB_SIZE, BLEN_THUMB_SIZE); + + /* first write into thumb buffer */ + thumb= MEM_mallocN(((2 + (BLEN_THUMB_SIZE * BLEN_THUMB_SIZE))) * sizeof(int), "write_file thumb"); + + thumb[0] = BLEN_THUMB_SIZE; + thumb[1] = BLEN_THUMB_SIZE; + + memcpy(thumb + 2, ibuf->rect, BLEN_THUMB_SIZE * BLEN_THUMB_SIZE * sizeof(int)); + + /* add pretty overlay */ + IMB_overlayblend_thumb(thumb + 2, BLEN_THUMB_SIZE, BLEN_THUMB_SIZE, aspect); + } + else { + /* '*thumb_pt' needs to stay NULL to prevent a bad thumbnail from being handled */ + thumb= NULL; + } + + /* must be freed by caller */ + *thumb_pt= thumb; + + return ibuf; +} + int WM_write_file(bContext *C, char *target, int fileflags, ReportList *reports) { Library *li; int len; char di[FILE_MAX]; - + + int *thumb= NULL; + ImBuf *ibuf_thumb= NULL; + len = strlen(target); if (len == 0) { @@ -532,7 +582,10 @@ int WM_write_file(bContext *C, char *target, int fileflags, ReportList *reports) do_history(di, reports); - if (BLO_write_file(CTX_data_main(C), di, fileflags, reports)) { + /* blend file thumbnail */ + ibuf_thumb= blend_file_thumb(di, CTX_data_scene(C), &thumb); + + if (BLO_write_file(CTX_data_main(C), di, fileflags, reports, thumb)) { strcpy(G.sce, di); G.relbase_valid = 1; strcpy(G.main->name, di); /* is guaranteed current file */ @@ -546,7 +599,18 @@ int WM_write_file(bContext *C, char *target, int fileflags, ReportList *reports) else G.fileflags &= ~G_FILE_AUTOPLAY; writeBlog(); - } else { + + /* run this function after because the file cant be written before the blend is */ + if (ibuf_thumb) { + ibuf_thumb= IMB_thumb_create(di, THB_NORMAL, THB_SOURCE_BLEND, ibuf_thumb); + IMB_freeImBuf(ibuf_thumb); + } + + if(thumb) MEM_freeN(thumb); + } + else { + if(ibuf_thumb) IMB_freeImBuf(ibuf_thumb); + if(thumb) MEM_freeN(thumb); return -1; } @@ -571,7 +635,7 @@ int WM_write_homefile(bContext *C, wmOperator *op) /* force save as regular blend file */ fileflags = G.fileflags & ~(G_FILE_COMPRESS | G_FILE_AUTOPLAY | G_FILE_LOCK | G_FILE_SIGN); - BLO_write_file(CTX_data_main(C), tstr, fileflags, op->reports); + BLO_write_file(CTX_data_main(C), tstr, fileflags, op->reports, NULL); G.save_over= 0; @@ -640,7 +704,7 @@ void wm_autosave_timer(const bContext *C, wmWindowManager *wm, wmTimer *wt) fileflags = G.fileflags & ~(G_FILE_COMPRESS|G_FILE_AUTOPLAY |G_FILE_LOCK|G_FILE_SIGN); /* no error reporting to console */ - BLO_write_file(CTX_data_main(C), filename, fileflags, NULL); + BLO_write_file(CTX_data_main(C), filename, fileflags, NULL, NULL); /* do timer after file write, just in case file write takes a long time */ wm->autosavetimer= WM_event_add_timer(wm, NULL, TIMERAUTOSAVE, U.savetime*60.0); diff --git a/source/blender/windowmanager/intern/wm_jobs.c b/source/blender/windowmanager/intern/wm_jobs.c index 30c0c9a7aec..a92a3d746ad 100644 --- a/source/blender/windowmanager/intern/wm_jobs.c +++ b/source/blender/windowmanager/intern/wm_jobs.c @@ -26,6 +26,8 @@ * ***** END GPL LICENSE BLOCK ***** */ +#include + #include "DNA_windowmanager_types.h" #include "MEM_guardedalloc.h" @@ -89,7 +91,7 @@ struct wmJob { /* to prevent cpu overhead, use this one which only gets called when job really starts, not in thread */ void (*initjob)(void *); /* this runs inside thread, and does full job */ - void (*startjob)(void *, short *stop, short *do_update); + void (*startjob)(void *, short *stop, short *do_update, float *progress); /* update gets called if thread defines so, and max once per timerstep */ /* it runs outside thread, blocking blender, no drawing! */ void (*update)(void *); @@ -109,6 +111,10 @@ struct wmJob { void *owner; int flag; short suspended, running, ready, do_update, stop; + float progress; + + /* for display in header, identification */ + char name[128]; /* once running, we store this separately */ void *run_customdata; @@ -119,18 +125,32 @@ struct wmJob { }; +/* finds: + * 1st priority: job with same owner and name + * 2nd priority: job with same owner + */ +static wmJob *wm_job_find(wmWindowManager *wm, void *owner, char *name) +{ + wmJob *steve, *found=NULL; + + for(steve= wm->jobs.first; steve; steve= steve->next) + if(steve->owner==owner) { + found= steve; + if (name && strcmp(steve->name, name)==0) + return steve; + } + + return found; +} + /* ******************* public API ***************** */ /* returns current or adds new job, but doesnt run it */ /* every owner only gets a single job, adding a new one will stop running stop and when stopped it starts the new one */ -wmJob *WM_jobs_get(wmWindowManager *wm, wmWindow *win, void *owner, int flag) +wmJob *WM_jobs_get(wmWindowManager *wm, wmWindow *win, void *owner, char *name, int flag) { - wmJob *steve; - - for(steve= wm->jobs.first; steve; steve= steve->next) - if(steve->owner==owner) - break; + wmJob *steve= wm_job_find(wm, owner, name); if(steve==NULL) { steve= MEM_callocN(sizeof(wmJob), "new job"); @@ -139,6 +159,7 @@ wmJob *WM_jobs_get(wmWindowManager *wm, wmWindow *win, void *owner, int flag) steve->win= win; steve->owner= owner; steve->flag= flag; + BLI_strncpy(steve->name, name, sizeof(steve->name)); } return steve; @@ -156,6 +177,26 @@ int WM_jobs_test(wmWindowManager *wm, void *owner) return 0; } +float WM_jobs_progress(wmWindowManager *wm, void *owner) +{ + wmJob *steve= wm_job_find(wm, owner, NULL); + + if (steve && steve->flag & WM_JOB_PROGRESS) + return steve->progress; + + return 0.0; +} + +char *WM_jobs_name(wmWindowManager *wm, void *owner) +{ + wmJob *steve= wm_job_find(wm, owner, NULL); + + if (steve) + return steve->name; + + return NULL; +} + void WM_jobs_customdata(wmJob *steve, void *customdata, void (*free)(void *)) { /* pending job? just free */ @@ -179,7 +220,7 @@ void WM_jobs_timer(wmJob *steve, double timestep, unsigned int note, unsigned in } void WM_jobs_callbacks(wmJob *steve, - void (*startjob)(void *, short *, short *), + void (*startjob)(void *, short *, short *, float *), void (*initjob)(void *), void (*update)(void *), void (*endjob)(void *)) @@ -194,7 +235,7 @@ static void *do_job_thread(void *job_v) { wmJob *steve= job_v; - steve->startjob(steve->run_customdata, &steve->stop, &steve->do_update); + steve->startjob(steve->run_customdata, &steve->stop, &steve->do_update, &steve->progress); steve->ready= 1; return NULL; @@ -248,6 +289,7 @@ void WM_jobs_start(wmWindowManager *wm, wmJob *steve) steve->stop= 0; steve->ready= 0; + steve->progress= 0.0; BLI_init_threads(&steve->threads, do_job_thread, 1); BLI_insert_thread(&steve->threads, steve); @@ -354,6 +396,9 @@ void wm_jobs_timer(const bContext *C, wmWindowManager *wm, wmTimer *wt) steve->update(steve->run_customdata); if(steve->note) WM_event_add_notifier(C, steve->note, NULL); + + if (steve->flag & WM_JOB_PROGRESS) + WM_event_add_notifier(C, NC_WM|ND_JOB, NULL); steve->do_update= 0; } @@ -375,6 +420,8 @@ void wm_jobs_timer(const bContext *C, wmWindowManager *wm, wmTimer *wt) if(steve->endnote) WM_event_add_notifier(C, steve->endnote, NULL); + WM_event_add_notifier(C, NC_WM|ND_JOB, NULL); + /* new job added for steve? */ if(steve->customdata) { WM_jobs_start(wm, steve); diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index de748d204ff..d4094c57a84 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -1202,11 +1202,11 @@ static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *arg_unuse split = uiLayoutSplit(layout, 0, 0); col = uiLayoutColumn(split, 0); uiItemL(col, "Links", 0); - uiItemO(col, NULL, ICON_URL, "HELP_OT_release_logs"); - uiItemO(col, NULL, ICON_URL, "HELP_OT_manual"); - uiItemO(col, NULL, ICON_URL, "HELP_OT_blender_website"); - uiItemO(col, NULL, ICON_URL, "HELP_OT_user_community"); - uiItemO(col, NULL, ICON_URL, "HELP_OT_python_api"); + uiItemStringO(col, "Release Log", ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/development/release-logs/blender-250/"); + uiItemStringO(col, "Manual", ICON_URL, "WM_OT_url_open", "url", "http://wiki.blender.org/index.php/Doc:Manual"); + uiItemStringO(col, "Blender Website", ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/"); + uiItemStringO(col, "User Community", ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/community/user-community/"); + uiItemStringO(col, "Python API Reference", ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/documentation/250PythonDoc/contents.html"); uiItemL(col, "", 0); col = uiLayoutColumn(split, 0); diff --git a/source/blender/windowmanager/wm_event_types.h b/source/blender/windowmanager/wm_event_types.h index 7b83e1d4179..a93214e9a54 100644 --- a/source/blender/windowmanager/wm_event_types.h +++ b/source/blender/windowmanager/wm_event_types.h @@ -226,7 +226,7 @@ #define ISTWEAK(event) (event >= EVT_TWEAK_L && event <= EVT_GESTURE) /* test whether event type is acceptable as hotkey, excluding modifiers */ -#define ISHOTKEY(event) ((ISKEYBOARD(event) || ISMOUSE(event)) && !(event>=LEFTCTRLKEY && event<=ESCKEY) && !(event>=UNKNOWNKEY && event<=GRLESSKEY)) +#define ISHOTKEY(event) ((ISKEYBOARD(event) || ISMOUSE(event)) && !(event>=LEFTCTRLKEY && event<=LEFTSHIFTKEY) && !(event>=UNKNOWNKEY && event<=GRLESSKEY)) /* **************** BLENDER GESTURE EVENTS ********************* */ diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt index 193217abc9d..4c0ab567290 100644 --- a/source/creator/CMakeLists.txt +++ b/source/creator/CMakeLists.txt @@ -61,6 +61,10 @@ IF(WITH_OPENEXR) ADD_DEFINITIONS(-DWITH_OPENEXR) ENDIF(WITH_OPENEXR) +IF(WITH_TIFF) + ADD_DEFINITIONS(-DWITH_TIFF) +ENDIF(WITH_TIFF) + IF(WITH_PYTHON) INCLUDE_DIRECTORIES(../blender/python) ELSE(WITH_PYTHON) @@ -250,8 +254,6 @@ IF(WITH_INSTALL) ENDIF(APPLE) IF(WIN32) - FILE(TO_NATIVE_PATH ${CMAKE_SOURCE_DIR} WIN_SOURCE_DIR) - ADD_CUSTOM_COMMAND(TARGET blender POST_BUILD MAIN_DEPENDENCY blender @@ -259,39 +261,36 @@ IF(WITH_INSTALL) COMMAND if not exist \"${TARGETDIR}\\.blender\\locale\" mkdir \"${TARGETDIR}\\.blender\\locale\" COMMAND if not exist \"${TARGETDIR}\\.blender\\scripts\" mkdir \"${TARGETDIR}\\.blender\\scripts\" COMMAND if not exist \"${TARGETDIR}\\plugins\" mkdir \"${TARGETDIR}\\plugins\" - COMMAND copy /Y \"${WIN_SOURCE_DIR}\\bin\\.blender\\.Blanguages\" \"${TARGETDIR}\\.blender\\\" - COMMAND copy /Y \"${WIN_SOURCE_DIR}\\bin\\.blender\\.bfont.ttf\" \"${TARGETDIR}\\.blender\\\" - COMMAND xcopy /E /Y \"${WIN_SOURCE_DIR}\\bin\\.blender\\locale\\*.*\" \"${TARGETDIR}\\.blender\\locale\" - COMMAND xcopy /E /Y \"${WIN_SOURCE_DIR}\\release\\scripts\\*.*\" \"${TARGETDIR}\\.blender\\scripts\" - COMMAND xcopy /E /Y \"${WIN_SOURCE_DIR}\\release\\plugins\\*.*\" \"${TARGETDIR}\\plugins\" - COMMAND copy /Y \"${WIN_SOURCE_DIR}\\release\\text\\*.*\" \"${TARGETDIR}\" + COMMAND copy /Y \"${CMAKE_SOURCE_DIR}\\bin\\.blender\\.Blanguages\" \"${TARGETDIR}\\.blender\\\" + COMMAND copy /Y \"${CMAKE_SOURCE_DIR}\\bin\\.blender\\.bfont.ttf\" \"${TARGETDIR}\\.blender\\\" + COMMAND xcopy /E /Y \"${CMAKE_SOURCE_DIR}\\bin\\.blender\\locale\\*.*\" \"${TARGETDIR}\\.blender\\locale\" + COMMAND xcopy /E /Y \"${CMAKE_SOURCE_DIR}\\release\\scripts\\*.*\" \"${TARGETDIR}\\.blender\\scripts\" + COMMAND xcopy /E /Y \"${CMAKE_SOURCE_DIR}\\release\\plugins\\*.*\" \"${TARGETDIR}\\plugins\" + COMMAND copy /Y \"${CMAKE_SOURCE_DIR}\\release\\text\\*.*\" \"${TARGETDIR}\" # TODO, copy python bundle - # COMMAND copy /Y \"${WIN_SOURCE_DIR}\\release\\windows\\extra\\python31.zip\" \"${TARGETDIR}\\\" + # COMMAND copy /Y \"${CMAKE_SOURCE_DIR}\\release\\windows\\extra\\python31.zip\" \"${TARGETDIR}\\\" ) - FILE(TO_NATIVE_PATH "${LIBDIR}" WIN_LIBDIR) - ADD_CUSTOM_COMMAND(TARGET blender POST_BUILD MAIN_DEPENDENCY blender - COMMAND copy /Y \"${WIN_LIBDIR}\\release\\python31.zip\" \"${TARGETDIR}\\\" - COMMAND copy /Y \"${WIN_LIBDIR}\\release\\python31.zip\" \"${TARGETDIR}\\python31_d.zip\" - COMMAND copy /Y \"${WIN_LIBDIR}\\gettext\\lib\\gnu_gettext.dll\" \"${TARGETDIR}\\\" - COMMAND copy /Y \"${WIN_LIBDIR}\\png\\lib\\libpng.dll\" \"${TARGETDIR}\\\" - COMMAND copy /Y \"${WIN_LIBDIR}\\sdl\\lib\\SDL.dll\" \"${TARGETDIR}\\\" - COMMAND copy /Y \"${WIN_LIBDIR}\\zlib\\lib\\zlib.dll\" \"${TARGETDIR}\\\" - COMMAND copy /Y \"${WIN_LIBDIR}\\tiff\\lib\\libtiff.dll\" \"${TARGETDIR}\\\" - COMMAND copy /Y \"${WIN_LIBDIR}\\python\\lib\\python31.dll\" \"${TARGETDIR}\\\" - COMMAND copy /Y \"${WIN_LIBDIR}\\python\\lib\\python31_d.dll\" \"${TARGETDIR}\\\" - COMMAND copy /Y \"${WIN_LIBDIR}\\pthreads\\lib\\pthreadVC2.dll\" \"${TARGETDIR}\\\" - COMMAND copy /Y \"${WIN_LIBDIR}\\samplerate\\lib\\libsamplerate-0.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\release\\python31.zip\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\release\\python31.zip\" \"${TARGETDIR}\\python31_d.zip\" + COMMAND copy /Y \"${LIBDIR}\\gettext\\lib\\gnu_gettext.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\png\\lib\\libpng.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\sdl\\lib\\SDL.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\zlib\\lib\\zlib.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\python\\lib\\python31.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\python\\lib\\python31_d.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\pthreads\\lib\\pthreadVC2.dll\" \"${TARGETDIR}\\\" + # COMMAND copy /Y \"${LIBDIR}\\samplerate\\lib\\libsamplerate-0.dll\" \"${TARGETDIR}\\\" ) IF(WITH_INTERNATIONAL) ADD_CUSTOM_COMMAND(TARGET blender POST_BUILD MAIN_DEPENDENCY blender - COMMAND copy /Y \"${WIN_LIBDIR}\\iconv\\lib\\iconv.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\iconv\\lib\\iconv.dll\" \"${TARGETDIR}\\\" ) ENDIF(WITH_INTERNATIONAL) @@ -299,16 +298,16 @@ IF(WITH_INSTALL) ADD_CUSTOM_COMMAND(TARGET blender POST_BUILD MAIN_DEPENDENCY blender - COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\avcodec-52.dll\" \"${TARGETDIR}\\\" - COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\avformat-52.dll\" \"${TARGETDIR}\\\" - COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\avdevice-52.dll\" \"${TARGETDIR}\\\" - COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\avutil-50.dll\" \"${TARGETDIR}\\\" - COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\libfaac-0.dll\" \"${TARGETDIR}\\\" - COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\libfaad-2.dll\" \"${TARGETDIR}\\\" - COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\libmp3lame-0.dll\" \"${TARGETDIR}\\\" - COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\libx264-67.dll\" \"${TARGETDIR}\\\" - COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\swscale-0.dll\" \"${TARGETDIR}\\\" - COMMAND copy /Y \"${WIN_LIBDIR}\\ffmpeg\\lib\\xvidcore.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\avcodec-52.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\avformat-52.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\avdevice-52.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\avutil-50.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\libfaac-0.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\libfaad-2.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\libmp3lame-0.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\libx264-67.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\swscale-0.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\xvidcore.dll\" \"${TARGETDIR}\\\" ) ENDIF(WITH_FFMPEG) @@ -316,7 +315,7 @@ IF(WITH_INSTALL) ADD_CUSTOM_COMMAND(TARGET blender POST_BUILD MAIN_DEPENDENCY blender - COMMAND copy /Y \"${WIN_LIBDIR}\\sndfile\\lib\\libsndfile-1.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\sndfile\\lib\\libsndfile-1.dll\" \"${TARGETDIR}\\\" ) ENDIF(WITH_SNDFILE) @@ -324,7 +323,7 @@ IF(WITH_INSTALL) ADD_CUSTOM_COMMAND(TARGET blender POST_BUILD MAIN_DEPENDENCY blender - COMMAND copy /Y \"${WIN_LIBDIR}\\jack\\lib\\libjack.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\jack\\lib\\libjack.dll\" \"${TARGETDIR}\\\" ) ENDIF(WITH_JACK) @@ -332,8 +331,8 @@ IF(WITH_INSTALL) ADD_CUSTOM_COMMAND(TARGET blender POST_BUILD MAIN_DEPENDENCY blender - COMMAND copy /Y \"${WIN_LIBDIR}\\openal\\lib\\OpenAL32.dll\" \"${TARGETDIR}\\\" - COMMAND copy /Y \"${WIN_LIBDIR}\\openal\\lib\\wrap_oal.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\openal\\lib\\OpenAL32.dll\" \"${TARGETDIR}\\\" + COMMAND copy /Y \"${LIBDIR}\\openal\\lib\\wrap_oal.dll\" \"${TARGETDIR}\\\" ) ENDIF(WITH_OPENAL) diff --git a/source/creator/Makefile b/source/creator/Makefile index 592cf913dfa..34ebc5fa305 100644 --- a/source/creator/Makefile +++ b/source/creator/Makefile @@ -69,4 +69,8 @@ ifeq ($(WITH_BINRELOC), true) CPPFLAGS += -I$(NANBLENDERHOME)/extern/binreloc/include -DWITH_BINRELOC endif +ifeq ($(WITH_TIFF), true) + CPPFLAGS += -DWITH_TIFF +endif + CPPFLAGS += -I$(OPENGL_HEADERS) diff --git a/source/creator/SConscript b/source/creator/SConscript index 6364f256cc5..815bd351f69 100644 --- a/source/creator/SConscript +++ b/source/creator/SConscript @@ -23,6 +23,9 @@ if env['WITH_BF_BINRELOC']: if env['WITH_BF_OPENEXR']: defs.append('WITH_OPENEXR') +if env['WITH_BF_TIFF']: + defs.append('WITH_TIFF') + if not env['WITH_BF_SDL']: defs.append('DISABLE_SDL') diff --git a/source/creator/creator.c b/source/creator/creator.c index 7544c3f8ff9..2c48aa9a885 100644 --- a/source/creator/creator.c +++ b/source/creator/creator.c @@ -32,6 +32,12 @@ #include #endif +#define OSX_SSE_FPE (defined(__APPLE__) && (defined(__i386__) || defined(__x86_64__))) + +#if OSX_SSE_FPE +#include +#endif + #include #include @@ -136,8 +142,8 @@ char blender_path[FILE_MAXDIR+FILE_MAXFILE] = BLENDERPATH; /* Initialise callbacks for the modules that need them */ static void setCallbacks(void); -/* on linux set breakpoints here when running in debug mode, useful to catch floating point errors */ -#if defined(__sgi) || defined(__linux__) +/* set breakpoints here when running in debug mode, useful to catch floating point errors */ +#if defined(__sgi) || defined(__linux__) || defined(_WIN32) || OSX_SSE_FPE static void fpe_handler(int sig) { // printf("SIGFPE trapped\n"); @@ -195,102 +201,108 @@ static int print_version(int argc, char **argv, void *data) static int print_help(int argc, char **argv, void *data) { - printf ("Blender %d.%02d (sub %d) Build\n", BLENDER_VERSION/100, BLENDER_VERSION%100, BLENDER_SUBVERSION); - printf ("Usage: blender [args ...] [file] [args ...]\n"); - printf ("\nRender options:\n"); - printf (" -b \tLoad in background (often used for background rendering)\n"); - printf (" -a render frames from start to end (inclusive), only works when used after -b\n"); - printf (" -S \tSet scene \n"); - printf (" -f \tRender frame and save it\n"); - printf (" -s \tSet start to frame (use before the -a argument)\n"); - printf (" -e \tSet end to frame (use before the -a argument)\n"); - printf (" -o \tSet the render path and file name.\n"); - printf (" Use // at the start of the path to\n"); - printf (" render relative to the blend file.\n"); - printf (" The # characters are replaced by the frame number, and used to define zero padding.\n"); - printf (" ani_##_test.png becomes ani_01_test.png\n"); - printf (" test-######.png becomes test-000001.png\n"); - printf (" When the filename has no #, The suffix #### is added to the filename\n"); - printf (" The frame number will be added at the end of the filename.\n"); - printf (" eg: blender -b foobar.blend -o //render_ -F PNG -x 1 -a\n"); - printf (" -E \tSpecify the render engine.\n"); - printf (" use -E help to list available engines.\n"); - printf ("\nFormat options:\n"); - printf (" -F \tSet the render format, Valid options are...\n"); - printf (" \tTGA IRIS JPEG MOVIE IRIZ RAWTGA\n"); - printf (" \tAVIRAW AVIJPEG PNG BMP FRAMESERVER\n"); - printf (" (formats that can be compiled into blender, not available on all systems)\n"); - printf (" \tHDR TIFF EXR MULTILAYER MPEG AVICODEC QUICKTIME CINEON DPX DDS\n"); - printf (" -x \tSet option to add the file extension to the end of the file.\n"); - printf (" -t \tUse amount of for rendering (background mode only).\n"); - printf (" [1-%d], 0 for systems processor count.\n", BLENDER_MAX_THREADS); - printf ("\nAnimation playback options:\n"); - printf (" -a \tPlayback , only operates this way when -b is not used.\n"); - printf (" -p \tOpen with lower left corner at , \n"); - printf (" -m\t\tRead from disk (Don't buffer)\n"); - printf (" -f \t\tSpecify FPS to start with\n"); - printf (" -j \tSet frame step to \n"); - - printf ("\nWindow options:\n"); - printf (" -w\t\tForce opening with borders (default)\n"); - printf (" -W\t\tForce opening without borders\n"); - printf (" -p \tOpen with lower left corner at , \n"); - printf (" \tand width and height , \n"); - printf ("\nGame Engine specific options:\n"); - printf (" -g fixedtime\t\tRun on 50 hertz without dropping frames\n"); - printf (" -g vertexarrays\tUse Vertex Arrays for rendering (usually faster)\n"); - printf (" -g nomipmap\t\tNo Texture Mipmapping\n"); - printf (" -g linearmipmap\tLinear Texture Mipmapping instead of Nearest (default)\n"); + bArgs *ba = (bArgs*)data; + + printf ("Blender %d.%02d (sub %d) Build\n", BLENDER_VERSION/100, BLENDER_VERSION%100, BLENDER_SUBVERSION); + printf ("Usage: blender [args ...] [file] [args ...]\n\n"); + + printf ("Render Options:\n"); + BLI_argsPrintArgDoc(ba, "-b"); + BLI_argsPrintArgDoc(ba, "--render-anim"); + BLI_argsPrintArgDoc(ba, "--scene"); + BLI_argsPrintArgDoc(ba, "--render-frame"); + BLI_argsPrintArgDoc(ba, "--frame-start"); + BLI_argsPrintArgDoc(ba, "--frame-end"); + BLI_argsPrintArgDoc(ba, "--frame-jump"); + BLI_argsPrintArgDoc(ba, "--render-output"); + BLI_argsPrintArgDoc(ba, "--engine"); + + printf("\n"); + printf ("Format Options:\n"); + BLI_argsPrintArgDoc(ba, "--render-format"); + BLI_argsPrintArgDoc(ba, "--use-extension"); + BLI_argsPrintArgDoc(ba, "--threads"); + + printf("\n"); + printf ("Animation Playback Options:\n"); + BLI_argsPrintArgDoc(ba, "-a"); + + printf("\n"); + printf ("Window Options:\n"); + BLI_argsPrintArgDoc(ba, "--window-border"); + BLI_argsPrintArgDoc(ba, "--window-borderless"); + BLI_argsPrintArgDoc(ba, "--window-geometry"); + + printf("\n"); + printf ("Game Engine specific options:\n"); + BLI_argsPrintArgDoc(ba, "-g"); + + printf("\n"); + printf ("Misc options:\n"); + BLI_argsPrintArgDoc(ba, "--debug"); + BLI_argsPrintArgDoc(ba, "--debug-fpe"); + + printf("\n"); + + BLI_argsPrintArgDoc(ba, "-nojoystick"); + BLI_argsPrintArgDoc(ba, "-noglsl"); + BLI_argsPrintArgDoc(ba, "-noaudio"); + BLI_argsPrintArgDoc(ba, "-setaudio"); + + printf("\n"); + + BLI_argsPrintArgDoc(ba, "--help"); + + printf("\n"); + + BLI_argsPrintArgDoc(ba, "--enable-autoexec"); + BLI_argsPrintArgDoc(ba, "--disable-autoexec"); + + printf("\n"); + + BLI_argsPrintArgDoc(ba, "--python"); + BLI_argsPrintArgDoc(ba, "--python-console"); - printf ("\nMisc options:\n"); - printf (" -d\t\tTurn debugging on\n"); - printf (" \t\t * prints every operator call and their arguments\n"); - printf (" \t\t * disables mouse grab (to interact with a debugger in some cases)\n"); - printf (" \t\t * keeps python sys.stdin rather then setting it to None\n"); - printf (" -nojoystick\tDisable joystick support\n"); - printf (" -noglsl\tDisable GLSL shading\n"); - printf (" -noaudio\tForce sound system to None\n"); - printf (" -setaudio\tForce sound system to a specific device\n"); - printf (" \tNULL SDL OPENAL JACK\n"); - printf (" -h\t\tPrint this help text\n"); - printf (" -y\t\tDisable automatic python script execution (pydrivers, pyconstraints, pynodes)\n"); - printf (" -Y\t\tEnable automatic python script execution\n"); - printf (" -P \tRun the given Python script (filename or Blender Text)\n"); #ifdef WIN32 - printf (" -R\t\tRegister .blend extension\n"); + BLI_argsPrintArgDoc(ba, "-R"); #endif - printf (" -v\t\tPrint Blender version and exit\n"); - printf (" --\t\tEnds option processing. Following arguments are \n"); - printf (" \t\t passed unchanged. Access via Python's sys.argv\n"); + BLI_argsPrintArgDoc(ba, "--version"); + + BLI_argsPrintArgDoc(ba, "--"); + + printf ("Other Options:\n"); + BLI_argsPrintOtherDoc(ba); + printf ("\nEnvironment Variables:\n"); printf (" $HOME\t\t\tStore files such as .blender/ .B.blend .Bfs .Blog here.\n"); - printf (" $BLENDERPATH\tSystem directory to use for data files and scripts.\n"); - printf (" \tFor this build of blender the default BLENDERPATH is...\n"); - printf (" \t\"%s\"\n", blender_path); - printf (" \tseting the $BLENDERPATH will override this\n"); + printf (" $BLENDERPATH System directory to use for data files and scripts.\n"); + printf (" For this build of blender the default BLENDERPATH is...\n"); + printf (" \"%s\"\n", blender_path); + printf (" setting the $BLENDERPATH will override this\n"); #ifdef WIN32 - printf (" $TEMP\t\tStore temporary files here.\n"); + printf (" $TEMP Store temporary files here.\n"); #else - printf (" $TMP or $TMPDIR\tStore temporary files here.\n"); - printf (" $BF_TIFF_LIB\t\tUse an alternative libtiff.so for loading tiff image files.\n"); + printf (" $TMP or $TMPDIR Store temporary files here.\n"); #endif #ifndef DISABLE_SDL - printf (" $SDL_AUDIODRIVER\tLibSDL audio driver - alsa, esd, alsa, dma.\n"); + printf (" $SDL_AUDIODRIVER LibSDL audio driver - alsa, esd, alsa, dma.\n"); #endif - printf (" $IMAGEEDITOR\t\tImage editor executable, launch with the IKey from the file selector.\n"); - printf (" $WINEDITOR\t\tText editor executable, launch with the EKey from the file selector.\n"); - printf (" $PYTHONHOME\t\tPath to the python directory, eg. /usr/lib/python.\n"); - printf ("\nNote: Arguments must be separated by white space. eg:\n"); + printf (" $IMAGEEDITOR Image editor executable, launch with the IKey from the file selector.\n"); + printf (" $WINEDITOR Text editor executable, launch with the EKey from the file selector.\n"); + printf (" $PYTHONHOME Path to the python directory, eg. /usr/lib/python.\n\n"); + + printf ("Note: Arguments must be separated by white space. eg:\n"); printf (" \"blender -ba test.blend\"\n"); printf (" ...will ignore the 'a'\n"); printf (" \"blender -b test.blend -f8\"\n"); - printf (" ...will ignore 8 because there is no space between the -f and the frame value\n"); + printf (" ...will ignore 8 because there is no space between the -f and the frame value\n\n"); + printf ("Note: Arguments are executed in the order they are given. eg:\n"); - printf (" \"blender -b test.blend -f 1 -o /tmp\"\n"); - printf (" ...may not render to /tmp because '-f 1' renders before the output path is set\n"); - printf (" \"blender -b -o /tmp test.blend -f 1\"\n"); - printf (" ...may not render to /tmp because loading the blend file overwrites the output path that was set\n"); - printf (" \"blender -b test.blend -o /tmp -f 1\" works as expected.\n\n"); + printf (" \"blender --background test.blend --render-frame 1 --render-output /tmp\"\n"); + printf (" ...will not render to /tmp because '--render-frame 1' renders before the output path is set\n"); + printf (" \"blender --background --render-output /tmp test.blend --render-frame 1\"\n"); + printf (" ...will not render to /tmp because loading the blend file overwrites the render output that was set\n"); + printf (" \"blender --background test.blend --render-output /tmp --render-frame 1\" works as expected.\n\n"); exit(0); @@ -351,15 +363,26 @@ static int debug_mode(int argc, char **argv, void *data) static int set_fpe(int argc, char **argv, void *data) { -#if defined(__sgi) || defined(__linux__) +#if defined(__sgi) || defined(__linux__) || defined(_WIN32) || OSX_SSE_FPE /* zealous but makes float issues a heck of a lot easier to find! * set breakpoints on fpe_handler */ signal(SIGFPE, fpe_handler); -#if defined(__linux__) && defined(__GNUC__) +# if defined(__linux__) && defined(__GNUC__) feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW ); +# endif /* defined(__linux__) && defined(__GNUC__) */ +# if OSX_SSE_FPE + /* OSX uses SSE for floating point by default, so here + * use SSE instructions to throw floating point exceptions */ + _MM_SET_EXCEPTION_MASK(_MM_MASK_MASK &~ + (_MM_MASK_OVERFLOW|_MM_MASK_INVALID|_MM_MASK_DIV_ZERO)); +# endif /* OSX_SSE_FPE */ +# if defined(_WIN32) && defined(_MSC_VER) + _controlfp_s(NULL, 0, _MCW_EM); /* enables all fp exceptions */ + _controlfp_s(NULL, _EM_DENORMAL | _EM_UNDERFLOW | _EM_INEXACT, _MCW_EM); /* hide the ones we don't care about */ +# endif /* _WIN32 && _MSC_VER */ #endif -#endif + return 0; } @@ -464,11 +487,11 @@ static int set_output(int argc, char **argv, void *data) Scene *scene= CTX_data_scene(C); BLI_strncpy(scene->r.pic, argv[1], FILE_MAXDIR); } else { - printf("\nError: no blend loaded. cannot use '-o'.\n"); + printf("\nError: no blend loaded. cannot use '-o / --render-output'.\n"); } return 1; } else { - printf("\nError: you must specify a path after '-o '.\n"); + printf("\nError: you must specify a path after '-o / --render-output'.\n"); return 0; } } @@ -492,7 +515,7 @@ static int set_engine(int argc, char **argv, void *data) { if (CTX_data_scene(C)==NULL) { - printf("\nError: no blend loaded. order the arguments so '-E ' is after a blend is loaded.\n"); + printf("\nError: no blend loaded. order the arguments so '-E / --engine ' is after a blend is loaded.\n"); } else { @@ -525,7 +548,7 @@ static int set_image_type(int argc, char **argv, void *data) if (argc >= 1){ char *imtype = argv[1]; if (CTX_data_scene(C)==NULL) { - printf("\nError: no blend loaded. order the arguments so '-F ' is after the blend is loaded.\n"); + printf("\nError: no blend loaded. order the arguments so '-F / --render-format' is after the blend is loaded.\n"); } else { Scene *scene= CTX_data_scene(C); if (!strcmp(imtype,"TGA")) scene->r.imtype = R_TARGA; @@ -543,7 +566,9 @@ static int set_image_type(int argc, char **argv, void *data) else if (!strcmp(imtype,"QUICKTIME")) scene->r.imtype = R_QUICKTIME; else if (!strcmp(imtype,"BMP")) scene->r.imtype = R_BMP; else if (!strcmp(imtype,"HDR")) scene->r.imtype = R_RADHDR; +#ifdef WITH_TIFF else if (!strcmp(imtype,"TIFF")) scene->r.imtype = R_TIFF; +#endif #ifdef WITH_OPENEXR else if (!strcmp(imtype,"EXR")) scene->r.imtype = R_OPENEXR; else if (!strcmp(imtype,"MULTILAYER")) scene->r.imtype = R_MULTILAYER; @@ -555,11 +580,11 @@ static int set_image_type(int argc, char **argv, void *data) #if WITH_OPENJPEG else if (!strcmp(imtype,"JP2")) scene->r.imtype = R_JP2; #endif - else printf("\nError: Format from '-F' not known or not compiled in this release.\n"); + else printf("\nError: Format from '-F / --render-format' not known or not compiled in this release.\n"); } return 1; } else { - printf("\nError: you must specify a format after '-F '.\n"); + printf("\nError: you must specify a format after '-F / --render-foramt'.\n"); return 0; } } @@ -574,7 +599,7 @@ static int set_threads(int argc, char **argv, void *data) } return 1; } else { - printf("\nError: you must specify a number of threads between 0 and 8 '-t '.\n"); + printf("\nError: you must specify a number of threads between 0 and 8 '-t / --threads'.\n"); return 0; } } @@ -590,7 +615,7 @@ static int set_extension(int argc, char **argv, void *data) } else if (argv[1][0] == '1') { scene->r.scemode |= R_EXTENSION; } else { - printf("\nError: Use '-x 1' or '-x 0' To set the extension option.\n"); + printf("\nError: Use '-x 1 / -x 0' To set the extension option or '--use-extension'\n"); } } else { printf("\nError: no blend loaded. order the arguments so '-o ' is after '-x '.\n"); @@ -673,11 +698,11 @@ static int render_frame(int argc, char **argv, void *data) RE_BlenderAnim(re, scene, scene->lay, frame, frame, scene->r.frame_step, &reports); return 1; } else { - printf("\nError: frame number must follow '-f'.\n"); + printf("\nError: frame number must follow '-f / --render-frame'.\n"); return 0; } } else { - printf("\nError: no blend loaded. cannot use '-f'.\n"); + printf("\nError: no blend loaded. cannot use '-f / --render-frame'.\n"); return 0; } } @@ -703,7 +728,7 @@ static int set_scene(int argc, char **argv, void *data) set_scene_name(argv[1]); return 1; } else { - printf("\nError: Scene name must follow '-S'.\n"); + printf("\nError: Scene name must follow '-S / --scene'.\n"); return 0; } } @@ -718,11 +743,11 @@ static int set_start_frame(int argc, char **argv, void *data) (scene->r.sfra) = CLAMPIS(frame, MINFRAME, MAXFRAME); return 1; } else { - printf("\nError: frame number must follow '-s'.\n"); + printf("\nError: frame number must follow '-s / --frame-start'.\n"); return 0; } } else { - printf("\nError: no blend loaded. cannot use '-s'.\n"); + printf("\nError: no blend loaded. cannot use '-s / --frame-start'.\n"); return 0; } } @@ -737,11 +762,11 @@ static int set_end_frame(int argc, char **argv, void *data) (scene->r.efra) = CLAMPIS(frame, MINFRAME, MAXFRAME); return 1; } else { - printf("\nError: frame number must follow '-e'.\n"); + printf("\nError: frame number must follow '-e / --frame-end'.\n"); return 0; } } else { - printf("\nError: no blend loaded. cannot use '-e'.\n"); + printf("\nError: no blend loaded. cannot use '-e / --frame-end'.\n"); return 0; } } @@ -756,49 +781,53 @@ static int set_skip_frame(int argc, char **argv, void *data) (scene->r.frame_step) = CLAMPIS(frame, 1, MAXFRAME); return 1; } else { - printf("\nError: number of frames to step must follow '-j'.\n"); + printf("\nError: number of frames to step must follow '-j / --frame-jump'.\n"); return 0; } } else { - printf("\nError: no blend loaded. cannot use '-j'.\n"); + printf("\nError: no blend loaded. cannot use '-j / --frame-jump'.\n"); return 0; } } +/* macro for ugly context setup/reset */ +#ifndef DISABLE_PYTHON +#define BPY_CTX_SETUP(_cmd) \ +{ \ + wmWindowManager *wm= CTX_wm_manager(C); \ + wmWindow *prevwin= CTX_wm_window(C); \ + Scene *prevscene= CTX_data_scene(C); \ + if(wm->windows.first) { \ + CTX_wm_window_set(C, wm->windows.first); \ + _cmd; \ + CTX_wm_window_set(C, prevwin); \ + } \ + else { \ + fprintf(stderr, "Python script \"%s\" running with missing context data.\n", argv[1]); \ + _cmd; \ + } \ + CTX_data_scene_set(C, prevscene); \ +} \ + +#endif /* DISABLE_PYTHON */ + static int run_python(int argc, char **argv, void *data) { #ifndef DISABLE_PYTHON bContext *C = data; - /* Make the path absolute because its needed for relative linked blends to be found */ - char filename[FILE_MAXDIR + FILE_MAXFILE]; - BLI_strncpy(filename, argv[1], sizeof(filename)); - BLI_path_cwd(filename); - /* workaround for scripts not getting a bpy.context.scene, causes internal errors elsewhere */ if (argc > 1) { - /* XXX, temp setting the WM is ugly, splash also does this :S */ - wmWindowManager *wm= CTX_wm_manager(C); - wmWindow *prevwin= CTX_wm_window(C); - Scene *prevscene= CTX_data_scene(C); + /* Make the path absolute because its needed for relative linked blends to be found */ + char filename[FILE_MAXDIR + FILE_MAXFILE]; + BLI_strncpy(filename, argv[1], sizeof(filename)); + BLI_path_cwd(filename); - if(wm->windows.first) { - CTX_wm_window_set(C, wm->windows.first); - - BPY_run_python_script(C, filename, NULL, NULL); // use reports? - - CTX_wm_window_set(C, prevwin); - } - else { - fprintf(stderr, "Python script \"%s\" running with missing context data.\n", argv[1]); - BPY_run_python_script(C, filename, NULL, NULL); // use reports? - } - - CTX_data_scene_set(C, prevscene); + BPY_CTX_SETUP( BPY_run_python_script(C, filename, NULL, NULL) ) return 1; } else { - printf("\nError: you must specify a Python script after '-P '.\n"); + printf("\nError: you must specify a Python script after '-P / --python'.\n"); return 0; } #else @@ -807,6 +836,21 @@ static int run_python(int argc, char **argv, void *data) #endif /* DISABLE_PYTHON */ } +static int run_python_console(int argc, char **argv, void *data) +{ +#ifndef DISABLE_PYTHON + bContext *C = data; + const char *expr= "__import__('code').interact()"; + + BPY_CTX_SETUP( BPY_eval_string(C, expr) ) + + return 0; +#else + printf("This blender was built without python support\n"); + return 0; +#endif /* DISABLE_PYTHON */ +} + static int load_file(int argc, char **argv, void *data) { bContext *C = data; @@ -851,56 +895,94 @@ static int load_file(int argc, char **argv, void *data) void setupArguments(bContext *C, bArgs *ba, SYS_SystemHandle *syshandle) { - //BLI_argsAdd(ba, arg, pass, BA_ArgCallback cb, C); + static char output_doc[] = "" + "\n\tSet the render path and file name." + "\n\tUse // at the start of the path to" + "\n\t\trender relative to the blend file." + "\n\tThe # characters are replaced by the frame number, and used to define zero padding." + "\n\t\tani_##_test.png becomes ani_01_test.png" + "\n\t\ttest-######.png becomes test-000001.png" + "\n\t\tWhen the filename does not contain #, The suffix #### is added to the filename" + "\n\tThe frame number will be added at the end of the filename." + "\n\t\teg: blender -b foobar.blend -o //render_ -F PNG -x 1 -a" + "\n\t\t//render_ becomes //render_####, writing frames as //render_0001.png//"; + + static char format_doc[] = "" + "\n\tSet the render format, Valid options are..." + "\n\t\tTGA IRIS JPEG MOVIE IRIZ RAWTGA" + "\n\t\tAVIRAW AVIJPEG PNG BMP FRAMESERVER" + "\n\t(formats that can be compiled into blender, not available on all systems)" + "\n\t\tHDR TIFF EXR MULTILAYER MPEG AVICODEC QUICKTIME CINEON DPX DDS"; + + static char playback_doc[] = " " + "\n\tPlayback , only operates this way when not running in background." + "\n\t\t-p \tOpen with lower left corner at , " + "\n\t\t-m\t\tRead from disk (Don't buffer)" + "\n\t\t-f \t\tSpecify FPS to start with" + "\n\t\t-j \tSet frame step to "; + + static char game_doc[] = "Game Engine specific options" + "\n\t-g fixedtime\t\tRun on 50 hertz without dropping frames" + "\n\t-g vertexarrays\tUse Vertex Arrays for rendering (usually faster)" + "\n\t-g nomipmap\t\tNo Texture Mipmapping" + "\n\t-g linearmipmap\tLinear Texture Mipmapping instead of Nearest (default)"; + + static char debug_doc[] = "\n\tTurn debugging on\n" + "\n\t* Prints every operator call and their arguments" + "\n\t* Disables mouse grab (to interact with a debugger in some cases)" + "\n\t* Keeps python sys.stdin rather then setting it to None"; + + //BLI_argsAdd(ba, pass, short_arg, long_arg, doc, cb, C); /* end argument processing after -- */ - BLI_argsAdd(ba, "--", -1, end_arguments, NULL); + BLI_argsAdd(ba, -1, "--", NULL, "\n\tEnds option processing, following arguments passed unchanged. Access via python's sys.argv", end_arguments, NULL); /* first pass: background mode, disable python and commands that exit after usage */ - BLI_argsAdd(ba, "--help", 1, print_help, NULL); - BLI_argsAdd(ba, "-h", 1, print_help, NULL); - BLI_argsAdd(ba, "/?", 1, print_help, NULL); + BLI_argsAdd(ba, 1, "-h", "--help", "\n\tPrint this help text and exit", print_help, ba); + /* Windows only */ + BLI_argsAdd(ba, 1, "/?", NULL, "\n\tPrint this help text and exit (windows only)", print_help, ba); - BLI_argsAdd(ba, "--version", 1, print_version, NULL); - BLI_argsAdd(ba, "-v", 1, print_version, NULL); + BLI_argsAdd(ba, 1, "-v", "--version", "\n\tPrint Blender version and exit", print_version, NULL); - BLI_argsAdd(ba, "-Y", 1, enable_python, NULL); - BLI_argsAdd(ba, "-y", 1, disable_python, NULL); + BLI_argsAdd(ba, 1, "-y", "--enable-autoexec", "\n\tEnable automatic python script execution (default)", enable_python, NULL); + BLI_argsAdd(ba, 1, "-Y", "--disable-autoexec", "\n\tDisable automatic python script execution (pydrivers, pyconstraints, pynodes)", disable_python, NULL); - BLI_argsAdd(ba, "-fpe", 1, set_fpe, NULL); + BLI_argsAdd(ba, 1, "-b", "--background", "\n\tLoad in background (often used for UI-less rendering)", background_mode, NULL); - BLI_argsAdd(ba, "-B", 1, background_mode, NULL); - BLI_argsAdd(ba, "-b", 1, background_mode, NULL); - BLI_argsAdd(ba, "-a", 1, playback_mode, NULL); + BLI_argsAdd(ba, 1, "-a", NULL, playback_doc, playback_mode, NULL); - BLI_argsAdd(ba, "-d", 1, debug_mode, ba); + BLI_argsAdd(ba, 1, "-d", "--debug", debug_doc, debug_mode, ba); + BLI_argsAdd(ba, 1, NULL, "--debug-fpe", "\n\tEnable floating point exceptions", set_fpe, NULL); /* second pass: custom window stuff */ - BLI_argsAdd(ba, "-p", 2, prefsize, NULL); - BLI_argsAdd(ba, "-w", 2, with_borders, NULL); - BLI_argsAdd(ba, "-W", 2, without_borders, NULL); - BLI_argsAdd(ba, "-R", 2, register_extension, ba); + BLI_argsAdd(ba, 2, "-p", "--window-geometry", " \n\tOpen with lower left corner at , and width and height as , ", prefsize, NULL); + BLI_argsAdd(ba, 2, "-w", "--window-border", "\n\tForce opening with borders (default)", with_borders, NULL); + BLI_argsAdd(ba, 2, "-W", "--window-borderless", "\n\tForce opening with without borders", without_borders, NULL); + BLI_argsAdd(ba, 2, "-R", NULL, "\n\tRegister .blend extension (windows only)", register_extension, ba); /* third pass: disabling things and forcing settings */ - BLI_argsAddCase(ba, "-nojoystick", 3, no_joystick, syshandle); - BLI_argsAddCase(ba, "-noglsl", 3, no_glsl, NULL); - BLI_argsAddCase(ba, "-noaudio", 3, no_audio, NULL); - BLI_argsAddCase(ba, "-setaudio", 3, set_audio, NULL); + BLI_argsAddCase(ba, 3, "-nojoystick", 1, NULL, 0, "\n\tDisable joystick support", no_joystick, syshandle); + BLI_argsAddCase(ba, 3, "-noglsl", 1, NULL, 0, "\n\tDisable GLSL shading", no_glsl, NULL); + BLI_argsAddCase(ba, 3, "-noaudio", 1, NULL, 0, "\n\tForce sound system to None", no_audio, NULL); + BLI_argsAddCase(ba, 3, "-setaudio", 1, NULL, 0, "\n\tForce sound system to a specific device\n\tNULL SDL OPENAL JACK", set_audio, NULL); /* fourth pass: processing arguments */ - BLI_argsAdd(ba, "-g", 4, set_ge_parameters, syshandle); - BLI_argsAdd(ba, "-f", 4, render_frame, C); - BLI_argsAdd(ba, "-a", 4, render_animation, C); - BLI_argsAdd(ba, "-S", 4, set_scene, NULL); - BLI_argsAdd(ba, "-s", 4, set_start_frame, C); - BLI_argsAdd(ba, "-e", 4, set_end_frame, C); - BLI_argsAdd(ba, "-j", 4, set_skip_frame, C); - BLI_argsAdd(ba, "-P", 4, run_python, C); - BLI_argsAdd(ba, "-o", 4, set_output, C); - BLI_argsAdd(ba, "-E", 4, set_engine, C); - BLI_argsAdd(ba, "-F", 4, set_image_type, C); - BLI_argsAdd(ba, "-t", 4, set_threads, NULL); - BLI_argsAdd(ba, "-x", 4, set_extension, C); + BLI_argsAdd(ba, 4, "-g", NULL, game_doc, set_ge_parameters, syshandle); + BLI_argsAdd(ba, 4, "-f", "--render-frame", "\n\tRender frame and save it", render_frame, C); + BLI_argsAdd(ba, 4, "-a", "--render-anim", "\n\tRender frames from start to end (inclusive)", render_animation, C); + BLI_argsAdd(ba, 4, "-S", "--scene", "\n\tSet the active scene for rendering", set_scene, NULL); + BLI_argsAdd(ba, 4, "-s", "--frame-start", "\n\tSet start to frame (use before the -a argument)", set_start_frame, C); + BLI_argsAdd(ba, 4, "-e", "--frame-end", "\n\tSet end to frame (use before the -a argument)", set_end_frame, C); + BLI_argsAdd(ba, 4, "-j", "--frame-jump", "\n\tSet number of frames to step forward after each rendered frame", set_skip_frame, C); + BLI_argsAdd(ba, 4, "-P", "--python", "\n\tRun the given Python script (filename or Blender Text)", run_python, C); + BLI_argsAdd(ba, 4, NULL, "--python-console", "\n\tRun blender with an interactive console", run_python_console, C); + + BLI_argsAdd(ba, 4, "-o", "--render-output", output_doc, set_output, C); + BLI_argsAdd(ba, 4, "-E", "--engine", "\n\tSpecify the render engine\n\tuse -E help to list available engines", set_engine, C); + + BLI_argsAdd(ba, 4, "-F", "--render-format", format_doc, set_image_type, C); + BLI_argsAdd(ba, 4, "-t", "--threads", "\n\tUse amount of for rendering in background\n\t[1-" QUOTE(BLENDER_MAX_THREADS) "], 0 for systems processor count.", set_threads, NULL); + BLI_argsAdd(ba, 4, "-x", "--use-extension", "\n\tSet option to add the file extension to the end of the file", set_extension, C); } diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp index 04bd1178e52..3fb8c2bd67e 100644 --- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp +++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp @@ -1738,7 +1738,7 @@ static KX_GameObject *gameobject_from_blenderobject( // only support relative shape key bool bHasShapeKey = mesh->key != NULL && mesh->key->type==KEY_RELATIVE; bool bHasDvert = mesh->dvert != NULL && ob->defbase.first; - bool bHasArmature = (ob->parent && ob->parent->type == OB_ARMATURE && ob->partype==PARSKEL && bHasDvert); + bool bHasArmature = (BL_ModifierDeformer::HasArmatureDeformer(ob) && ob->parent && ob->parent->type == OB_ARMATURE && bHasDvert); bool bHasModifier = BL_ModifierDeformer::HasCompatibleDeformer(ob); bool bHasSoftBody = (!ob->parent && (ob->gameflag & OB_SOFT_BODY)); @@ -2366,8 +2366,8 @@ void BL_ConvertBlenderObjects(struct Main* maggie, if (me->dvert){ BL_DeformableGameObject *obj = (BL_DeformableGameObject*)converter->FindGameObject(blenderobj); - - if (obj && blenderobj->parent && blenderobj->parent->type==OB_ARMATURE && blenderobj->partype==PARSKEL){ + + if (obj && BL_ModifierDeformer::HasArmatureDeformer(blenderobj) && blenderobj->parent && blenderobj->parent->type==OB_ARMATURE){ KX_GameObject *par = converter->FindGameObject(blenderobj->parent); if (par && obj->GetDeformer()) ((BL_SkinDeformer*)obj->GetDeformer())->SetArmature((BL_ArmatureObject*) par); diff --git a/source/gameengine/Converter/BL_ModifierDeformer.cpp b/source/gameengine/Converter/BL_ModifierDeformer.cpp index e28ea47b162..5ccf8de29b1 100644 --- a/source/gameengine/Converter/BL_ModifierDeformer.cpp +++ b/source/gameengine/Converter/BL_ModifierDeformer.cpp @@ -114,11 +114,27 @@ bool BL_ModifierDeformer::HasCompatibleDeformer(Object *ob) continue; if (!(md->mode & eModifierMode_Realtime)) continue; + /* armature modifier are handled by SkinDeformer, not ModifierDeformer */ + if (md->type == eModifierType_Armature ) + continue; return true; } return false; } +bool BL_ModifierDeformer::HasArmatureDeformer(Object *ob) +{ + if (!ob->modifiers.first) + return false; + + ModifierData* md; + for (md = (ModifierData*)ob->modifiers.first; md; md = (ModifierData*)md->next) { + if (md->type == eModifierType_Armature ) + return true; + } + return false; +} + bool BL_ModifierDeformer::Update(void) { bool bShapeUpdate = BL_ShapeDeformer::Update(); diff --git a/source/gameengine/Converter/BL_ModifierDeformer.h b/source/gameengine/Converter/BL_ModifierDeformer.h index 1122d5e8b32..adf537110f1 100644 --- a/source/gameengine/Converter/BL_ModifierDeformer.h +++ b/source/gameengine/Converter/BL_ModifierDeformer.h @@ -45,6 +45,7 @@ class BL_ModifierDeformer : public BL_ShapeDeformer { public: static bool HasCompatibleDeformer(Object *ob); + static bool HasArmatureDeformer(Object *ob); BL_ModifierDeformer(BL_DeformableGameObject *gameobj, diff --git a/source/gameengine/Ketsji/KX_Scene.cpp b/source/gameengine/Ketsji/KX_Scene.cpp index bfa372018cb..3af3c8a3096 100644 --- a/source/gameengine/Ketsji/KX_Scene.cpp +++ b/source/gameengine/Ketsji/KX_Scene.cpp @@ -1066,12 +1066,12 @@ void KX_Scene::ReplaceMesh(class CValue* obj,void* meshobj, bool use_gfx, bool u bool bHasShapeKey = blendmesh->key != NULL && blendmesh->key->type==KEY_RELATIVE; bool bHasDvert = blendmesh->dvert != NULL; bool bHasArmature = + BL_ModifierDeformer::HasArmatureDeformer(blendobj) && parentobj && // current parent is armature parentobj->GetGameObjectType() == SCA_IObject::OBJ_ARMATURE && oldblendobj && // needed for mesh deform blendobj->parent && // original object had armature (not sure this test is needed) - blendobj->parent->type == OB_ARMATURE && - blendobj->partype==PARSKEL && + blendobj->parent->type == OB_ARMATURE && blendmesh->dvert!=NULL; // mesh has vertex group bool bHasSoftBody = (!parentobj && (blendobj->gameflag & OB_SOFT_BODY)); diff --git a/source/gameengine/PyDoc/bge.events.rst b/source/gameengine/PyDoc/bge.events.rst index afdcf39f178..486844f97bf 100644 --- a/source/gameengine/PyDoc/bge.events.rst +++ b/source/gameengine/PyDoc/bge.events.rst @@ -1,6 +1,6 @@ -Game Engine bge.events module. -============================== +Game Engine bge.events module +============================= This module holds key constants for the SCA_KeyboardSensor. @@ -191,4 +191,4 @@ This module holds key constants for the SCA_KeyboardSensor. .. data:: WHEELUPMOUSE .. data:: WHEELDOWNMOUSE .. data:: MOUSEX -.. data:: MOUSEY: +.. data:: MOUSEY diff --git a/source/gameengine/PyDoc/bge.logic.rst b/source/gameengine/PyDoc/bge.logic.rst index 7fb2c3df67a..4f9b94a7340 100644 --- a/source/gameengine/PyDoc/bge.logic.rst +++ b/source/gameengine/PyDoc/bge.logic.rst @@ -1,6 +1,6 @@ -Game Engine bge.logic Module. -============================= +Game Engine bge.logic Module +============================ Module to access logic functions, imported automatically into the python controllers namespace. diff --git a/source/gameengine/PyDoc/bge.render.rst b/source/gameengine/PyDoc/bge.render.rst index d1a35019165..01e5a7cd387 100644 --- a/source/gameengine/PyDoc/bge.render.rst +++ b/source/gameengine/PyDoc/bge.render.rst @@ -1,6 +1,6 @@ -Game Engine bge.render Module. -============================== +Game Engine bge.render Module +============================= .. module:: bge.render diff --git a/source/gameengine/PyDoc/bge.types.rst b/source/gameengine/PyDoc/bge.types.rst index 6cfb3377cac..e0119c7c4a7 100644 --- a/source/gameengine/PyDoc/bge.types.rst +++ b/source/gameengine/PyDoc/bge.types.rst @@ -1,6 +1,6 @@ -Game Engine bge.types Module. -============================== +Game Engine bge.types Module +============================= .. module:: bge.types diff --git a/source/nan_definitions.mk b/source/nan_definitions.mk index 5bd3c7aaafa..37df7b05467 100644 --- a/source/nan_definitions.mk +++ b/source/nan_definitions.mk @@ -133,13 +133,13 @@ ifndef CONFIG_GUESS endif ifeq ($(WITH_JACK), true) - export NAN_JACK ?= /usr + export NAN_JACK ?= $(LCGDIR)/jack export NAN_JACKCFLAGS ?= -I$(NAN_JACK)/include/jack export NAN_JACKLIBS ?= $(NAN_JACK)/lib/libjack.a endif ifeq ($(WITH_SNDFILE),true) - export NAN_SNDFILE ?= /usr + export NAN_SNDFILE ?= $(LCGDIR)/sndfile export NAN_SNDFILECFLAGS ?= -I$(NAN_SNDFILE)/include export NAN_SNDFILELIBS ?= $(NAN_SNDFILE)/lib/libsndfile.a $(NAN_SNDFILE)/lib/libFLAC.a $(NAN_SNDFILE)/lib/libogg.a endif @@ -158,7 +158,8 @@ ifndef CONFIG_GUESS export BF_PCRE_LIBS ?= $(BF_PCRE)/lib/libpcre.a endif - + export WITH_TIFF ?= true + # Compare recreated .mo files with committed ones export BF_VERIFY_MO_FILES ?= true @@ -275,6 +276,7 @@ ifndef CONFIG_GUESS endif export BF_PCRE = $(LCGDIR)/opencollada + export BF_OPENCOLLADA_LIBS = $(BF_OPENCOLLADA)/lib/libOpenCOLLADASaxFrameworkLoader.a $(BF_OPENCOLLADA)/lib/libOpenCOLLADAFramework.a $(BF_OPENCOLLADA)/lib/libOpenCOLLADABaseUtils.a $(BF_OPENCOLLADA)/lib/libOpenCOLLADAStreamWriter.a $(BF_OPENCOLLADA)/lib/libMathMLSolver.a $(BF_OPENCOLLADA)/lib/libGeneratedSaxParser.a $(BF_OPENCOLLADA)/lib/libUTF.a $(BF_OPENCOLLADA)/lib/libftoa.a $(BF_OPENCOLLADA)/lib/libbuffer.a -lxml2 else ifeq ($(OS),freebsd) @@ -369,7 +371,7 @@ ifndef CONFIG_GUESS # enable l10n export INTERNATIONAL ?= true - # Different endianess will make it fail, rely on other plataforms for checks + # Different endianess will make it fail, rely on other platforms for checks export BF_VERIFY_MO_FILES = false else @@ -411,12 +413,6 @@ ifndef CONFIG_GUESS export BF_FFTW3_LIBS ?= $(shell pkg-config --libs fftw3 ) endif - ifeq ($(WITH_OPENJPEG), true) - export BF_OPENJPEG ?= /usr - export BF_OPENJPEG_INC ?= /usr/include - export BF_OPENJPEG_LIBS ?= -lopenjpeg - endif - # Uncomment the following line to use Mozilla inplace of netscape # Location of MOZILLA/Netscape header files... @@ -439,6 +435,11 @@ ifndef CONFIG_GUESS export WITH_FFMPEG ?= true endif + ifeq ($(CPU), powerpc) + # Different endianess will make it fail, rely on other platforms for checks + export BF_VERIFY_MO_FILES = false + endif + else ifeq ($(OS),openbsd) @@ -618,6 +619,9 @@ ifndef CONFIG_GUESS endif # freebsd endif # darwin + # default tiff libs + export NAN_TIFF_LIBS ?= $(NAN_TIFF)/lib/libtiff.a + endif # CONFIG_GUESS # Don't want to build the gameengine? diff --git a/source/nan_link.mk b/source/nan_link.mk index b88e835c54a..bbf4053b14c 100644 --- a/source/nan_link.mk +++ b/source/nan_link.mk @@ -108,7 +108,7 @@ ifeq ($(OS),linux) endif ifeq ($(CPU),$(findstring $(CPU), "i386 x86_64 ia64 parisc64 powerpc sparc64")) COMMENT = "MESA 3.1" - LLIBS = -L$(NAN_MESA)/lib -L/usr/X11R6/lib -lXmu -lXext -lX11 -lXi + LLIBS = -L$(NAN_MESA)/lib -L/usr/X11R6/lib -lXext -lX11 -lXi LLIBS += -lutil -lc -lm -ldl -lpthread LLIBS += -L$(NAN_PYTHON)/lib -Wl,-rpath -Wl,$(NAN_PYTHON)/lib -lpython$(NAN_PYTHON_VERSION) LOPTS = -export-dynamic @@ -191,4 +191,8 @@ ifeq ($(WITH_OPENCOLLADA),true) LLIBS += $(BF_OPENCOLLADA_LIBS) endif +ifeq ($(WITH_TIFF),true) + LLIBS += $(NAN_TIFF_LIBS) +endif + LLIBS += $(NAN_PYTHON_LIB) diff --git a/tools/Blender.py b/tools/Blender.py index 441d454b782..69f6850fa52 100644 --- a/tools/Blender.py +++ b/tools/Blender.py @@ -146,6 +146,8 @@ def setup_staticlibs(lenv): libincs += Split(lenv['BF_OPENEXR_LIBPATH']) if lenv['WITH_BF_STATICOPENEXR']: statlibs += Split(lenv['BF_OPENEXR_LIB_STATIC']) + if lenv['WITH_BF_TIFF']: + libincs += Split(lenv['BF_TIFF_LIBPATH']) if lenv['WITH_BF_FFTW3']: libincs += Split(lenv['BF_FFTW3_LIBPATH']) if lenv['WITH_BF_INTERNATIONAL']: @@ -208,6 +210,8 @@ def setup_syslibs(lenv): if lenv['WITH_BF_OPENEXR']: if not lenv['WITH_BF_STATICOPENEXR']: syslibs += Split(lenv['BF_OPENEXR_LIB']) + if lenv['WITH_BF_TIFF']: + syslibs += Split(lenv['BF_TIFF_LIB']) if lenv['WITH_BF_FFMPEG']: syslibs += Split(lenv['BF_FFMPEG_LIB']) if lenv['WITH_BF_OGG']: diff --git a/tools/btools.py b/tools/btools.py index 4cb86ecee62..e76ada3a985 100644 --- a/tools/btools.py +++ b/tools/btools.py @@ -42,7 +42,7 @@ def validate_arguments(args, bc): 'WITH_BF_OPENJPEG', 'BF_OPENJPEG', 'BF_OPENJPEG_INC', 'BF_OPENJPEG_LIB', 'BF_OPENJPEG_LIBPATH', 'WITH_BF_REDCODE', 'BF_REDCODE', 'BF_REDCODE_INC', 'BF_REDCODE_LIB', 'BF_REDCODE_LIBPATH', 'WITH_BF_PNG', 'BF_PNG', 'BF_PNG_INC', 'BF_PNG_LIB', 'BF_PNG_LIBPATH', - 'BF_TIFF', 'BF_TIFF_INC', 'BF_TIFF_LIB', 'BF_TIFF_LIBPATH', + 'WITH_BF_TIFF', 'BF_TIFF', 'BF_TIFF_INC', 'BF_TIFF_LIB', 'BF_TIFF_LIBPATH', 'WITH_BF_ZLIB', 'BF_ZLIB', 'BF_ZLIB_INC', 'BF_ZLIB_LIB', 'BF_ZLIB_LIBPATH', 'WITH_BF_INTERNATIONAL', 'BF_GETTEXT', 'BF_GETTEXT_INC', 'BF_GETTEXT_LIB', 'BF_GETTEXT_LIBPATH', @@ -160,7 +160,7 @@ def SetupSpawn( env ): env['SPAWN'] = buf.ourspawn -def read_opts(cfg, args): +def read_opts(env, cfg, args): localopts = Variables.Variables(cfg, args) localopts.AddVariables( ('LCGDIR', 'location of cvs lib dir'), @@ -261,6 +261,7 @@ def read_opts(cfg, args): ('BF_PNG_LIB', 'PNG library', ''), ('BF_PNG_LIBPATH', 'PNG library path', ''), + (BoolVariable('WITH_BF_TIFF', 'Use TIFF if true', True)), ('BF_TIFF', 'TIFF base path', ''), ('BF_TIFF_INC', 'TIFF include path', ''), ('BF_TIFF_LIB', 'TIFF library', ''), @@ -399,8 +400,8 @@ def read_opts(cfg, args): ('BF_BUILDDIR', 'Build dir', ''), ('BF_INSTALLDIR', 'Installation dir', ''), - ('CC', 'C compiler to use', ''), - ('CXX', 'C++ compiler to use', ''), + ('CC', 'C compiler to use', env['CC']), + ('CXX', 'C++ compiler to use', env['CXX']), (BoolVariable('BF_BUILDINFO', 'Buildtime in splash if true', True)), diff --git a/tools/crossmingw.py b/tools/crossmingw.py index ba6d4878593..f97fdf3c15e 100644 --- a/tools/crossmingw.py +++ b/tools/crossmingw.py @@ -50,6 +50,7 @@ prefixes = SCons.Util.Split(""" i486-mingw32msvc- i586-mingw32msvc- i686-mingw32msvc- + i686-pc-mingw32- """) def find(env): From 1be4a74f6c1ca7c1698e2f7eaed3d7c4a7071dac Mon Sep 17 00:00:00 2001 From: Nick Samarin Date: Mon, 31 May 2010 23:46:08 +0000 Subject: [PATCH 007/182] added item thumbs_blend.c into the project BL_imbuf (vc9) --- projectfiles_vc9/blender/imbuf/BL_imbuf.vcproj | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/projectfiles_vc9/blender/imbuf/BL_imbuf.vcproj b/projectfiles_vc9/blender/imbuf/BL_imbuf.vcproj index fdee6ca9228..05441f3d6a2 100644 --- a/projectfiles_vc9/blender/imbuf/BL_imbuf.vcproj +++ b/projectfiles_vc9/blender/imbuf/BL_imbuf.vcproj @@ -1,7 +1,7 @@ - - @@ -593,6 +589,10 @@ RelativePath="..\..\..\source\blender\imbuf\intern\thumbs.c" > + + @@ -747,10 +747,6 @@ Name="Header Files" Filter="h;hpp;hxx;hm;inl" > - - From 0932f365bfefb5ddabcc042abfa5f3d3a5c0246e Mon Sep 17 00:00:00 2001 From: Nick Samarin Date: Fri, 4 Jun 2010 23:29:49 +0000 Subject: [PATCH 008/182] added obstacle avoidance code; object movement is implemented via setting velocity --- .../gameengine/ketsji/KX_ketsji.vcproj | 8 + .../editors/space_logic/logic_window.c | 2 +- source/blender/makesdna/DNA_actuator_types.h | 2 +- source/blender/makesrna/intern/rna_actuator.c | 6 +- .../Converter/BL_BlenderDataConversion.cpp | 19 +- .../Converter/KX_ConvertActuators.cpp | 2 +- .../Ketsji/KX_ObstacleSimulation.cpp | 245 ++++++++++++++++++ .../gameengine/Ketsji/KX_ObstacleSimulation.h | 98 +++++++ source/gameengine/Ketsji/KX_Scene.cpp | 10 + source/gameengine/Ketsji/KX_Scene.h | 5 + .../gameengine/Ketsji/KX_SteeringActuator.cpp | 141 ++++++---- .../gameengine/Ketsji/KX_SteeringActuator.h | 15 +- 12 files changed, 488 insertions(+), 65 deletions(-) create mode 100644 source/gameengine/Ketsji/KX_ObstacleSimulation.cpp create mode 100644 source/gameengine/Ketsji/KX_ObstacleSimulation.h diff --git a/projectfiles_vc9/gameengine/ketsji/KX_ketsji.vcproj b/projectfiles_vc9/gameengine/ketsji/KX_ketsji.vcproj index a62c8902ad2..a4d33fd9d21 100644 --- a/projectfiles_vc9/gameengine/ketsji/KX_ketsji.vcproj +++ b/projectfiles_vc9/gameengine/ketsji/KX_ketsji.vcproj @@ -555,6 +555,10 @@ RelativePath="..\..\..\source\gameengine\Ketsji\KX_NavMeshObject.cpp" > + + @@ -864,6 +868,10 @@ RelativePath="..\..\..\source\gameengine\Ketsji\KX_NavMeshObject.h" > + + diff --git a/source/blender/editors/space_logic/logic_window.c b/source/blender/editors/space_logic/logic_window.c index 68be229a1ed..0c06ed74080 100644 --- a/source/blender/editors/space_logic/logic_window.c +++ b/source/blender/editors/space_logic/logic_window.c @@ -4272,7 +4272,7 @@ static void draw_actuator_steering(uiLayout *layout, PointerRNA *ptr) row = uiLayoutRow(layout, 0); uiItemR(row, ptr, "distance", 0, NULL, 0); - uiItemR(row, ptr, "movement", 0, NULL, 0); + uiItemR(row, ptr, "velocity", 0, NULL, 0); } diff --git a/source/blender/makesdna/DNA_actuator_types.h b/source/blender/makesdna/DNA_actuator_types.h index 7f2323b941e..d3c37f7c6e3 100644 --- a/source/blender/makesdna/DNA_actuator_types.h +++ b/source/blender/makesdna/DNA_actuator_types.h @@ -218,7 +218,7 @@ typedef struct bSteeringActuator { char pad[4]; int type; /* 0=seek, 1=flee, 2=path following */ float dist; - float movement; + float velocity; struct Object *target; struct Object *navmesh; } bSteeringActuator; diff --git a/source/blender/makesrna/intern/rna_actuator.c b/source/blender/makesrna/intern/rna_actuator.c index 36dfef696a5..5f4b9e4c472 100644 --- a/source/blender/makesrna/intern/rna_actuator.c +++ b/source/blender/makesrna/intern/rna_actuator.c @@ -1866,10 +1866,10 @@ static void rna_def_steering_actuator(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Behavior", ""); RNA_def_property_update(prop, NC_LOGIC, NULL); - prop= RNA_def_property(srna, "movement", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "movement"); + prop= RNA_def_property(srna, "velocity", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "velocity"); RNA_def_property_range(prop, 0.0, 1000.0); - RNA_def_property_ui_text(prop, "Move", "Movement value"); + RNA_def_property_ui_text(prop, "Velocity", "Velocity magnitude"); RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "distance", PROP_FLOAT, PROP_NONE); diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp index 3fb8c2bd67e..1b15982339b 100644 --- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp +++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp @@ -173,6 +173,7 @@ extern "C" { #include "BL_DeformableGameObject.h" #include "KX_NavMeshObject.h" +#include "KX_ObstacleSimulation.h" #ifdef __cplusplus extern "C" { @@ -2638,6 +2639,20 @@ void BL_ConvertBlenderObjects(struct Main* maggie, converter->RegisterWorldInfo(worldinfo); kxscene->SetWorldInfo(worldinfo); + //create object representations for obstacle simulation + KX_ObstacleSimulation* obssimulation = kxscene->GetObstacleSimulation(); + if (obssimulation) + { + for ( i=0;iGetCount();i++) + { + KX_GameObject* gameobj = static_cast(objectlist->GetValue(i)); + if (gameobj->IsDynamic()) + { + obssimulation->AddObstacleForObj(gameobj); + } + } + } + #define CONVERT_LOGIC #ifdef CONVERT_LOGIC // convert logic bricks, sensors, controllers and actuators @@ -2689,9 +2704,7 @@ void BL_ConvertBlenderObjects(struct Main* maggie, pathfinder->BuildNavMesh(); pathfinder->SetVisible(0, true); } - } - - + } // Calculate the scene btree - // too slow - commented out. diff --git a/source/gameengine/Converter/KX_ConvertActuators.cpp b/source/gameengine/Converter/KX_ConvertActuators.cpp index f7151dfd8c3..a58b60844fc 100644 --- a/source/gameengine/Converter/KX_ConvertActuators.cpp +++ b/source/gameengine/Converter/KX_ConvertActuators.cpp @@ -1059,7 +1059,7 @@ void BL_ConvertActuators(char* maggiename, KX_SteeringActuator *tmpstact = new KX_SteeringActuator(gameobj, mode, targetob, navmeshob, - stAct->movement, stAct->dist); + stAct->velocity, stAct->dist, scene->GetObstacleSimulation()); baseact = tmpstact; break; } diff --git a/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp b/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp new file mode 100644 index 00000000000..93dc25ec108 --- /dev/null +++ b/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp @@ -0,0 +1,245 @@ +/** +* Simulation for obstacle avoidance behavior +* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. The Blender +* Foundation also sells licenses for use in proprietary software under +* the Blender License. See http://www.blender.org/BL/ for information +* about this. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. +* All rights reserved. +* +* The Original Code is: all of this file. +* +* Contributor(s): none yet. +* +* ***** END GPL LICENSE BLOCK ***** +*/ + +#include "KX_ObstacleSimulation.h" +#include "KX_GameObject.h" +#include "DNA_object_types.h" +#include "math.h" +#define M_PI 3.14159265358979323846 + +int sweepCircleCircle(const MT_Vector3& pos0, const MT_Scalar r0, const MT_Vector2& v, + const MT_Vector3& pos1, const MT_Scalar r1, + float& tmin, float& tmax) +{ + static const float EPS = 0.0001f; + MT_Vector2 c0(pos0.x(), pos0.y()); + MT_Vector2 c1(pos1.x(), pos1.y()); + MT_Vector2 s = c1 - c0; + MT_Scalar r = r0+r1; + float c = s.length2() - r*r; + float a = v.length2(); + if (a < EPS) return 0; // not moving + + // Overlap, calc time to exit. + float b = MT_dot(v,s); + float d = b*b - a*c; + if (d < 0.0f) return 0; // no intersection. + tmin = (b - sqrtf(d)) / a; + tmax = (b + sqrtf(d)) / a; + return 1; +} + + +KX_ObstacleSimulation::KX_ObstacleSimulation() +{ + +} + +KX_ObstacleSimulation::~KX_ObstacleSimulation() +{ + for (size_t i=0; iGetBlenderObject(); + obstacle->m_rad = blenderobject->inertia; //.todo use radius of collision shape bound sphere + obstacle->m_gameObj = gameobj; + m_obstacles.push_back(obstacle); +} + +void KX_ObstacleSimulation::UpdateObstacles() +{ + for (size_t i=0; im_pos = obs->m_gameObj->NodeGetWorldPosition(); + obs->m_vel.x() = obs->m_gameObj->GetLinearVelocity().x(); + obs->m_vel.y() = obs->m_gameObj->GetLinearVelocity().y(); + } +} + +KX_Obstacle* KX_ObstacleSimulation::GetObstacle(KX_GameObject* gameobj) +{ + for (size_t i=0; im_gameObj == gameobj) + return m_obstacles[i]; + } + + return NULL; +} + +void KX_ObstacleSimulation::AdjustObstacleVelocity(KX_Obstacle* activeObst, MT_Vector3& velocity) +{ +} + +KX_ObstacleSimulationTOI::KX_ObstacleSimulationTOI(): + m_avoidSteps(32), + m_minToi(0.5f), + m_maxToi(1.2f), + m_angleWeight(4.0f), + m_toiWeight(1.0f), + m_collisionWeight(100.0f) +{ + +} + +KX_ObstacleSimulationTOI::~KX_ObstacleSimulationTOI() +{ + for (size_t i=0; in = m_avoidSteps; + tc->minToi = m_minToi; + tc->maxToi = m_maxToi; + + const int iforw = m_avoidSteps/2; + const float aoff = (float)iforw / (float)m_avoidSteps; + + for (int iter = 0; iter < m_avoidSteps; ++iter) + { + // Calculate sample velocity + const float ndir = ((float)iter/(float)m_avoidSteps) - aoff; + const float dir = odir+ndir*M_PI*2; + MT_Vector2 svel; + svel.x() = cosf(dir) * vmax; + svel.y() = sinf(dir) * vmax; + + // Find min time of impact and exit amongst all obstacles. + float tmin = m_maxToi; + float tmine = 0; + for (int i = 0; i < nobs; ++i) + { + if (i==obstidx) + continue; + KX_Obstacle* ob = m_obstacles[i]; + + float htmin,htmax; + + MT_Vector2 vab; + if (ob->m_vel.length2() < 0.01f*0.01f) + { + // Stationary, use VO + vab = svel; + } + else + { + // Moving, use RVO + vab = 2*svel - vel - ob->m_vel; + } + + if (!sweepCircleCircle(activeObst->m_pos, activeObst->m_rad, + vab, ob->m_pos, ob->m_rad, htmin, htmax)) + continue; + + if (htmin > 0.0f) + { + // The closest obstacle is somewhere ahead of us, keep track of nearest obstacle. + if (htmin < tmin) + tmin = htmin; + } + else if (htmax > 0.0f) + { + // The agent overlaps the obstacle, keep track of first safe exit. + if (htmax > tmine) + tmine = htmax; + } + } + + // Calculate sample penalties and final score. + const float apen = m_angleWeight * fabsf(ndir); + const float tpen = m_toiWeight * (1.0f/(0.0001f+tmin/m_maxToi)); + const float cpen = m_collisionWeight * (tmine/m_minToi)*(tmine/m_minToi); + const float score = apen + tpen + cpen; + + // Update best score. + if (score < bestScore) + { + bestDir = dir; + bestToi = tmin; + bestScore = score; + } + + tc->dir[iter] = dir; + tc->toi[iter] = tmin; + tc->toie[iter] = tmine; + } + + // Adjust speed when time of impact is less than min TOI. + if (bestToi < m_minToi) + vmax *= bestToi/m_minToi; + + // New steering velocity. + vel.x() = cosf(bestDir) * vmax; + vel.y() = sinf(bestDir) * vmax; + + velocity.x() = vel.x(); + velocity.y() = vel.y(); +} \ No newline at end of file diff --git a/source/gameengine/Ketsji/KX_ObstacleSimulation.h b/source/gameengine/Ketsji/KX_ObstacleSimulation.h new file mode 100644 index 00000000000..d1920e5e6f2 --- /dev/null +++ b/source/gameengine/Ketsji/KX_ObstacleSimulation.h @@ -0,0 +1,98 @@ +/** +* Simulation for obstacle avoidance behavior +* (based on Cane Project - http://code.google.com/p/cane by Mikko Mononen (c) 2009) +* +* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. The Blender +* Foundation also sells licenses for use in proprietary software under +* the Blender License. See http://www.blender.org/BL/ for information +* about this. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. +* All rights reserved. +* +* The Original Code is: all of this file. +* +* Contributor(s): none yet. +* +* ***** END GPL LICENSE BLOCK ***** +*/ + +#ifndef __KX_OBSTACLESIMULATION +#define __KX_OBSTACLESIMULATION + +#include +#include "MT_Point2.h" +#include "MT_Point3.h" + +class KX_GameObject; + +struct KX_Obstacle +{ + MT_Point3 m_pos; + MT_Scalar m_rad; + MT_Vector2 m_vel; + KX_GameObject* m_gameObj; +}; + +class KX_ObstacleSimulation +{ +protected: + std::vector m_obstacles; +public: + KX_ObstacleSimulation(); + virtual ~KX_ObstacleSimulation(); + + virtual void AddObstacleForObj(KX_GameObject* gameobj); + KX_Obstacle* GetObstacle(KX_GameObject* gameobj); + void UpdateObstacles(); + virtual void AdjustObstacleVelocity(KX_Obstacle* activeObst, MT_Vector3& velocity); + +}; /* end of class KX_ObstacleSimulation*/ + +static const int AVOID_MAX_STEPS = 128; +struct TOICircle +{ + TOICircle() : n(0), minToi(0), maxToi(1) {} + float toi[AVOID_MAX_STEPS]; // Time of impact (seconds) + float toie[AVOID_MAX_STEPS]; // Time of exit (seconds) + float dir[AVOID_MAX_STEPS]; // Direction (radians) + int n; // Number of samples + float minToi, maxToi; // Min/max TOI (seconds) +}; + +class KX_ObstacleSimulationTOI: public KX_ObstacleSimulation +{ +protected: + int m_avoidSteps; // Number of sample steps + float m_minToi; // Min TOI + float m_maxToi; // Max TOI + float m_angleWeight; // Sample selection angle weight + float m_toiWeight; // Sample selection TOI weight + float m_collisionWeight; // Sample selection collision weight + + std::vector m_toiCircles; // TOI circles (one per active agent) +public: + KX_ObstacleSimulationTOI(); + ~KX_ObstacleSimulationTOI(); + virtual void AddObstacleForObj(KX_GameObject* gameobj); + virtual void AdjustObstacleVelocity(KX_Obstacle* activeObst, MT_Vector3& velocity); +}; + +#endif diff --git a/source/gameengine/Ketsji/KX_Scene.cpp b/source/gameengine/Ketsji/KX_Scene.cpp index 3af3c8a3096..63a7dc1ba2c 100644 --- a/source/gameengine/Ketsji/KX_Scene.cpp +++ b/source/gameengine/Ketsji/KX_Scene.cpp @@ -85,6 +85,7 @@ #include "BL_DeformableGameObject.h" #include "KX_SoftBodyDeformer.h" +#include "KX_ObstacleSimulation.h" // to get USE_BULLET! #include "KX_ConvertPhysicsObject.h" @@ -210,6 +211,8 @@ KX_Scene::KX_Scene(class SCA_IInputDevice* keyboarddevice, m_bucketmanager=new RAS_BucketManager(); + m_obstacleSimulation = new KX_ObstacleSimulationTOI;//KX_ObstacleSimulation; + #ifndef DISABLE_PYTHON m_attr_dict = PyDict_New(); /* new ref */ m_draw_call_pre = NULL; @@ -221,6 +224,9 @@ KX_Scene::KX_Scene(class SCA_IInputDevice* keyboarddevice, KX_Scene::~KX_Scene() { + if (m_obstacleSimulation) + delete m_obstacleSimulation; + // The release of debug properties used to be in SCA_IScene::~SCA_IScene // It's still there but we remove all properties here otherwise some // reference might be hanging and causing late release of objects @@ -1460,6 +1466,10 @@ void KX_Scene::LogicBeginFrame(double curtime) // all object is the tempObjectList should have a clock } } + + //prepare obstacle simulation for new frame + m_obstacleSimulation->UpdateObstacles(); + m_logicmgr->BeginFrame(curtime, 1.0/KX_KetsjiEngine::GetTicRate()); } diff --git a/source/gameengine/Ketsji/KX_Scene.h b/source/gameengine/Ketsji/KX_Scene.h index bc608d9eb2a..6e75347fa30 100644 --- a/source/gameengine/Ketsji/KX_Scene.h +++ b/source/gameengine/Ketsji/KX_Scene.h @@ -83,6 +83,7 @@ class SCA_JoystickManager; class btCollisionShape; class KX_BlenderSceneConverter; struct KX_ClientObjectInfo; +class KX_ObstacleSimulation; /* for ID freeing */ #define IS_TAGGED(_id) ((_id) && (((ID *)_id)->flag & LIB_DOIT)) @@ -277,6 +278,8 @@ protected: RAS_2DFilterManager m_filtermanager; + KX_ObstacleSimulation* m_obstacleSimulation; + public: KX_Scene(class SCA_IInputDevice* keyboarddevice, class SCA_IInputDevice* mousedevice, @@ -541,6 +544,8 @@ public: void Update2DFilter(vector& propNames, void* gameObj, RAS_2DFilterManager::RAS_2DFILTER_MODE filtermode, int pass, STR_String& text); void Render2DFilters(RAS_ICanvas* canvas); + KX_ObstacleSimulation* GetObstacleSimulation() {return m_obstacleSimulation;}; + #ifndef DISABLE_PYTHON /* --------------------------------------------------------------------- */ /* Python interface ---------------------------------------------------- */ diff --git a/source/gameengine/Ketsji/KX_SteeringActuator.cpp b/source/gameengine/Ketsji/KX_SteeringActuator.cpp index 803ed510f45..45f3482ed5b 100644 --- a/source/gameengine/Ketsji/KX_SteeringActuator.cpp +++ b/source/gameengine/Ketsji/KX_SteeringActuator.cpp @@ -35,6 +35,7 @@ #include "KX_SteeringActuator.h" #include "KX_GameObject.h" #include "KX_NavMeshObject.h" +#include "KX_ObstacleSimulation.h" /* ------------------------------------------------------------------------- */ /* Native functions */ @@ -44,19 +45,27 @@ KX_SteeringActuator::KX_SteeringActuator(SCA_IObject *gameobj, int mode, KX_GameObject *target, KX_GameObject *navmesh, - MT_Scalar movement, - MT_Scalar distance) : + MT_Scalar velocity, + MT_Scalar distance, + KX_ObstacleSimulation* simulation) : SCA_IActuator(gameobj, KX_ACT_STEERING), m_mode(mode), m_target(target), - m_movement(movement), - m_distance(distance) + m_velocity(velocity), + m_distance(distance), + m_updateTime(0), + m_isActive(false), + m_simulation(simulation), + m_obstacle(NULL) { m_navmesh = static_cast(navmesh); if (m_navmesh) m_navmesh->RegisterActuator(this); if (m_target) m_target->RegisterActuator(this); + + if (m_simulation) + m_obstacle = m_simulation->GetObstacle((KX_GameObject*)gameobj); } KX_SteeringActuator::~KX_SteeringActuator() @@ -121,64 +130,92 @@ void KX_SteeringActuator::Relink(GEN_Map *obj_map) } } -bool KX_SteeringActuator::Update() +bool KX_SteeringActuator::Update(double curtime, bool frame) { - bool bNegativeEvent = IsNegativeEvent(); - RemoveAllEvents(); + if (frame) + { + double delta = curtime - m_updateTime; + m_updateTime = curtime; + + if (m_posevent && !m_isActive) + { + delta = 0; + m_updateTime = curtime; + m_isActive = true; + } + bool bNegativeEvent = IsNegativeEvent(); + if (bNegativeEvent) + m_isActive = false; - if (bNegativeEvent) - return false; // do nothing on negative events + RemoveAllEvents(); - KX_GameObject *obj = (KX_GameObject*) GetParent(); - const MT_Point3& mypos = obj->NodeGetWorldPosition(); - const MT_Point3& targpos = m_target->NodeGetWorldPosition(); - MT_Vector3 vectotarg = targpos - mypos; - MT_Vector3 steervec = MT_Vector3(0, 0, 0); - bool apply_steerforce = false; + if (bNegativeEvent || !delta) + return false; // do nothing on negative events - switch (m_mode) { - case KX_STEERING_SEEK: - if (vectotarg.length2()>m_distance*m_distance) - { - apply_steerforce = true; - steervec = vectotarg; - steervec.normalize(); - } - break; - case KX_STEERING_FLEE: - if (vectotarg.length2()m_distance*m_distance) - { - static const int MAX_PATH_LENGTH = 128; - static const MT_Vector3 PATH_COLOR(1,0,0); + KX_GameObject *obj = (KX_GameObject*) GetParent(); + const MT_Point3& mypos = obj->NodeGetWorldPosition(); + const MT_Point3& targpos = m_target->NodeGetWorldPosition(); + MT_Vector3 vectotarg = targpos - mypos; + MT_Vector3 steervec = MT_Vector3(0, 0, 0); + bool apply_steerforce = false; - float path[MAX_PATH_LENGTH*3]; - int pathlen = m_navmesh->FindPath(mypos, targpos, path, MAX_PATH_LENGTH); - if (pathlen > 1) + switch (m_mode) { + case KX_STEERING_SEEK: + if (vectotarg.length2()>m_distance*m_distance) { - //debug draw - m_navmesh->DrawPath(path, pathlen, PATH_COLOR); - apply_steerforce = true; - MT_Vector3 waypoint(&path[3]); - steervec = waypoint - mypos; - steervec.z() = 0; + steervec = vectotarg; steervec.normalize(); } - } - break; - } + break; + case KX_STEERING_FLEE: + if (vectotarg.length2()m_distance*m_distance) + { + static const int MAX_PATH_LENGTH = 128; + static const MT_Vector3 PATH_COLOR(1,0,0); - if (apply_steerforce) - { - MT_Vector3 vel = m_movement*steervec; - obj->ApplyMovement(vel, false); + float path[MAX_PATH_LENGTH*3]; + int pathlen = m_navmesh->FindPath(mypos, targpos, path, MAX_PATH_LENGTH); + if (pathlen > 1) + { + //debug draw + m_navmesh->DrawPath(path, pathlen, PATH_COLOR); + + apply_steerforce = true; + MT_Vector3 waypoint(&path[3]); + steervec = waypoint - mypos; + steervec.z() = 0; + steervec.normalize(); + } + } + break; + } + + if (apply_steerforce) + { + MT_Vector3 newvel = m_velocity*steervec; + + //adjust velocity to avoid obstacles + if (m_simulation && m_obstacle) + { + m_simulation->AdjustObstacleVelocity(m_obstacle, newvel); + } + + //temporary solution: set 2D steering velocity directly to obj + //correct way is to apply physical force + //MT_Vector3 movement = delta*m_velocity*steervec; + //obj->ApplyMovement(movement, false); + MT_Vector3 curvel = obj->GetLinearVelocity(); + newvel.z() = curvel.z(); + obj->setLinearVelocity(newvel, false); + } } return true; diff --git a/source/gameengine/Ketsji/KX_SteeringActuator.h b/source/gameengine/Ketsji/KX_SteeringActuator.h index fce2205ca6e..d1ba24279e1 100644 --- a/source/gameengine/Ketsji/KX_SteeringActuator.h +++ b/source/gameengine/Ketsji/KX_SteeringActuator.h @@ -41,6 +41,8 @@ class KX_GameObject; class KX_NavMeshObject; +struct KX_Obstacle; +class KX_ObstacleSimulation; class KX_SteeringActuator : public SCA_IActuator { @@ -49,10 +51,14 @@ class KX_SteeringActuator : public SCA_IActuator /** Target object */ KX_GameObject *m_target; KX_NavMeshObject *m_navmesh; - int m_mode; MT_Scalar m_distance; - MT_Scalar m_movement; + MT_Scalar m_velocity; + KX_ObstacleSimulation* m_simulation; + + KX_Obstacle* m_obstacle; + double m_updateTime; + bool m_isActive; public: enum KX_STEERINGACT_MODE { @@ -68,9 +74,10 @@ public: KX_GameObject *target, KX_GameObject *navmesh, MT_Scalar movement, - MT_Scalar distance); + MT_Scalar distance, + KX_ObstacleSimulation* simulation); virtual ~KX_SteeringActuator(); - virtual bool Update(); + virtual bool Update(double curtime, bool frame); virtual CValue* GetReplica(); virtual void ProcessReplica(); From 9d1b8bf0f801572fb1f25000883ce434aad3f964 Mon Sep 17 00:00:00 2001 From: Nick Samarin Date: Mon, 7 Jun 2010 23:09:50 +0000 Subject: [PATCH 009/182] Added segment obstacles, creation obstacles for walls of navigation mesh --- .../Converter/BL_BlenderDataConversion.cpp | 30 +-- source/gameengine/Ketsji/KX_NavMeshObject.cpp | 5 + source/gameengine/Ketsji/KX_NavMeshObject.h | 1 + .../Ketsji/KX_ObstacleSimulation.cpp | 189 ++++++++++++++++-- .../gameengine/Ketsji/KX_ObstacleSimulation.h | 32 ++- .../gameengine/Ketsji/KX_SteeringActuator.cpp | 3 +- 6 files changed, 220 insertions(+), 40 deletions(-) diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp index 1b15982339b..3383896cf98 100644 --- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp +++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp @@ -2639,6 +2639,7 @@ void BL_ConvertBlenderObjects(struct Main* maggie, converter->RegisterWorldInfo(worldinfo); kxscene->SetWorldInfo(worldinfo); + //create object representations for obstacle simulation KX_ObstacleSimulation* obssimulation = kxscene->GetObstacleSimulation(); if (obssimulation) @@ -2653,6 +2654,21 @@ void BL_ConvertBlenderObjects(struct Main* maggie, } } + //build navigation mesh + for ( i=0;iGetCount();i++) + { + KX_GameObject* gameobj = static_cast(objectlist->GetValue(i)); + struct Object* blenderobject = gameobj->GetBlenderObject(); + if (blenderobject->type==OB_MESH && (blenderobject->gameflag & OB_NAVMESH)) + { + KX_NavMeshObject* navmesh = static_cast(gameobj); + navmesh->BuildNavMesh(); + navmesh->SetVisible(0, true); + if (obssimulation) + obssimulation->AddObstaclesForNavMesh(navmesh); + } + } + #define CONVERT_LOGIC #ifdef CONVERT_LOGIC // convert logic bricks, sensors, controllers and actuators @@ -2693,19 +2709,7 @@ void BL_ConvertBlenderObjects(struct Main* maggie, logicbrick_conversionlist->Release(); - //build navigation mesh - for ( i=0;iGetCount();i++) - { - KX_GameObject* gameobj = static_cast(objectlist->GetValue(i)); - struct Object* blenderobject = gameobj->GetBlenderObject(); - if (blenderobject->type==OB_MESH && (blenderobject->gameflag & OB_NAVMESH)) - { - KX_NavMeshObject* pathfinder = static_cast(gameobj); - pathfinder->BuildNavMesh(); - pathfinder->SetVisible(0, true); - } - } - + // Calculate the scene btree - // too slow - commented out. //kxscene->SetNodeTree(tf.MakeTree()); diff --git a/source/gameengine/Ketsji/KX_NavMeshObject.cpp b/source/gameengine/Ketsji/KX_NavMeshObject.cpp index efcb3bdee6b..31c46865f4a 100644 --- a/source/gameengine/Ketsji/KX_NavMeshObject.cpp +++ b/source/gameengine/Ketsji/KX_NavMeshObject.cpp @@ -307,6 +307,11 @@ bool KX_NavMeshObject::BuildNavMesh() return true; } +dtStatNavMesh* KX_NavMeshObject::GetNavMesh() +{ + return m_navMesh; +} + void KX_NavMeshObject::DrawNavMesh() { if (!m_navMesh) diff --git a/source/gameengine/Ketsji/KX_NavMeshObject.h b/source/gameengine/Ketsji/KX_NavMeshObject.h index 02b29c25409..dff05d32183 100644 --- a/source/gameengine/Ketsji/KX_NavMeshObject.h +++ b/source/gameengine/Ketsji/KX_NavMeshObject.h @@ -55,6 +55,7 @@ public: bool BuildNavMesh(); + dtStatNavMesh* GetNavMesh(); int FindPath(const MT_Point3& from, const MT_Point3& to, float* path, int maxPathLen); float Raycast(const MT_Point3& from, const MT_Point3& to); void DrawNavMesh(); diff --git a/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp b/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp index 93dc25ec108..1d0b0b40750 100644 --- a/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp +++ b/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp @@ -33,7 +33,8 @@ */ #include "KX_ObstacleSimulation.h" -#include "KX_GameObject.h" +#include "KX_NavMeshObject.h" +#include "KX_PythonInit.h" #include "DNA_object_types.h" #include "math.h" #define M_PI 3.14159265358979323846 @@ -60,6 +61,85 @@ int sweepCircleCircle(const MT_Vector3& pos0, const MT_Scalar r0, const MT_Vecto return 1; } +inline float perp(const MT_Vector2& a, const MT_Vector2& b) { return a.x()*b.y() - a.y()*b.x(); } + + +int sweepCircleSegment(const MT_Vector3& pos0, const MT_Scalar r0, const MT_Vector2& v, + const MT_Vector3& pa, const MT_Vector3& pb, const MT_Scalar sr, + float& tmin, float &tmax) +{ + // equation parameters + MT_Vector2 c0(pos0.x(), pos0.y()); + MT_Vector2 sa(pa.x(), pa.y()); + MT_Vector2 sb(pb.x(), pb.y()); + MT_Vector2 L = sb-sa; + MT_Vector2 H = c0-sa; + MT_Scalar radius = r0+sr; + float l2 = L.length2(); + float r2 = radius * radius; + float dl = perp(v, L); + float hl = perp(H, L); + float a = dl * dl; + float b = 2.0f * hl * dl; + float c = hl * hl - (r2 * l2); + float d = (b*b) - (4.0f * a * c); + + // infinite line missed by infinite ray. + if (d < 0.0f) + return 0; + + d = sqrtf(d); + tmin = (-b - d) / (2.0f * a); + tmax = (-b + d) / (2.0f * a); + + // line missed by ray range. + /* if (tmax < 0.0f || tmin > 1.0f) + return 0;*/ + + // find what part of the ray was collided. + MT_Vector2 Pedge; + Pedge = c0+v*tmin; + H = Pedge - sa; + float e0 = MT_dot(H, L) / l2; + Pedge = c0 + v*tmax; + H = Pedge - sa; + float e1 = MT_dot(H, L) / l2; + + if (e0 < 0.0f || e1 < 0.0f) + { + float ctmin, ctmax; + if (sweepCircleCircle(pos0, r0, v, pa, sr, ctmin, ctmax)) + { + if (e0 < 0.0f && ctmin > tmin) + tmin = ctmin; + if (e1 < 0.0f && ctmax < tmax) + tmax = ctmax; + } + else + { + return 0; + } + } + + if (e0 > 1.0f || e1 > 1.0f) + { + float ctmin, ctmax; + if (sweepCircleCircle(pos0, r0, v, pb, sr, ctmin, ctmax)) + { + if (e0 > 1.0f && ctmin > tmin) + tmin = ctmin; + if (e1 > 1.0f && ctmax < tmax) + tmax = ctmax; + } + else + { + return 0; + } + } + + return 1; +} + KX_ObstacleSimulation::KX_ObstacleSimulation() { @@ -75,19 +155,60 @@ KX_ObstacleSimulation::~KX_ObstacleSimulation() } m_obstacles.clear(); } -void KX_ObstacleSimulation::AddObstacleForObj(KX_GameObject* gameobj) +KX_Obstacle* KX_ObstacleSimulation::CreateObstacle() { KX_Obstacle* obstacle = new KX_Obstacle(); + m_obstacles.push_back(obstacle); + return obstacle; +} + +void KX_ObstacleSimulation::AddObstacleForObj(KX_GameObject* gameobj) +{ + KX_Obstacle* obstacle = CreateObstacle(); struct Object* blenderobject = gameobj->GetBlenderObject(); + obstacle->m_type = KX_OBSTACLE_OBJ; + obstacle->m_shape = KX_OBSTACLE_CIRCLE; obstacle->m_rad = blenderobject->inertia; //.todo use radius of collision shape bound sphere obstacle->m_gameObj = gameobj; - m_obstacles.push_back(obstacle); + +} + +void KX_ObstacleSimulation::AddObstaclesForNavMesh(KX_NavMeshObject* navmeshobj) +{ + dtStatNavMesh* navmesh = navmeshobj->GetNavMesh(); + if (navmesh) + { + int npoly = navmesh->getPolyCount(); + for (int pi=0; pigetPoly(pi); + + for (int i = 0, j = (int)poly->nv-1; i < (int)poly->nv; j = i++) + { + if (poly->n[j]) continue; + const float* vj = navmesh->getVertex(poly->v[j]); + const float* vi = navmesh->getVertex(poly->v[i]); + + KX_Obstacle* obstacle = CreateObstacle(); + obstacle->m_type = KX_OBSTACLE_NAV_MESH; + obstacle->m_shape = KX_OBSTACLE_SEGMENT; + obstacle->m_gameObj = navmeshobj; + obstacle->m_pos = MT_Vector3(vj[0], vj[2], vj[1]); + obstacle->m_pos2 = MT_Vector3(vi[0], vi[2], vi[1]); + obstacle->m_rad = 0; + obstacle->m_vel = MT_Vector2(0,0); + } + } + } } void KX_ObstacleSimulation::UpdateObstacles() { for (size_t i=0; im_shape==KX_OBSTACLE_NAV_MESH || m_obstacles[i]->m_shape==KX_OBSTACLE_SEGMENT) + continue; + KX_Obstacle* obs = m_obstacles[i]; obs->m_pos = obs->m_gameObj->NodeGetWorldPosition(); obs->m_vel.x() = obs->m_gameObj->GetLinearVelocity().x(); @@ -106,10 +227,23 @@ KX_Obstacle* KX_ObstacleSimulation::GetObstacle(KX_GameObject* gameobj) return NULL; } -void KX_ObstacleSimulation::AdjustObstacleVelocity(KX_Obstacle* activeObst, MT_Vector3& velocity) +void KX_ObstacleSimulation::AdjustObstacleVelocity(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj, + MT_Vector3& velocity) { } +void KX_ObstacleSimulation::DrawObstacles() +{ + static const MT_Vector3 bluecolor(0,0,1); + for (size_t i=0; im_shape==KX_OBSTACLE_SEGMENT) + { + KX_RasterizerDrawDebugLine(m_obstacles[i]->m_pos, m_obstacles[i]->m_pos2, bluecolor); + } + } +} + KX_ObstacleSimulationTOI::KX_ObstacleSimulationTOI(): m_avoidSteps(32), m_minToi(0.5f), @@ -131,13 +265,14 @@ KX_ObstacleSimulationTOI::~KX_ObstacleSimulationTOI() m_toiCircles.clear(); } -void KX_ObstacleSimulationTOI::AddObstacleForObj(KX_GameObject* gameobj) +KX_Obstacle* KX_ObstacleSimulationTOI::CreateObstacle() { - KX_ObstacleSimulation::AddObstacleForObj(gameobj); + KX_Obstacle* obstacle = KX_ObstacleSimulation::CreateObstacle(); m_toiCircles.push_back(new TOICircle()); + return obstacle; } -void KX_ObstacleSimulationTOI::AdjustObstacleVelocity(KX_Obstacle* activeObst, MT_Vector3& velocity) +void KX_ObstacleSimulationTOI::AdjustObstacleVelocity(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj, MT_Vector3& velocity) { int nobs = m_obstacles.size(); int obstidx = std::find(m_obstacles.begin(), m_obstacles.end(), activeObst) - m_obstacles.begin(); @@ -177,27 +312,37 @@ void KX_ObstacleSimulationTOI::AdjustObstacleVelocity(KX_Obstacle* activeObst, M float tmine = 0; for (int i = 0; i < nobs; ++i) { - if (i==obstidx) - continue; KX_Obstacle* ob = m_obstacles[i]; + if ( (ob==activeObst) || + (ob->m_type==KX_OBSTACLE_NAV_MESH && ob->m_gameObj!=activeNavMeshObj) ) + continue; float htmin,htmax; - MT_Vector2 vab; - if (ob->m_vel.length2() < 0.01f*0.01f) + if (ob->m_type == KX_OBSTACLE_CIRCLE) { - // Stationary, use VO - vab = svel; - } - else - { - // Moving, use RVO - vab = 2*svel - vel - ob->m_vel; - } + MT_Vector2 vab; + if (ob->m_vel.length2() < 0.01f*0.01f) + { + // Stationary, use VO + vab = svel; + } + else + { + // Moving, use RVO + vab = 2*svel - vel - ob->m_vel; + } - if (!sweepCircleCircle(activeObst->m_pos, activeObst->m_rad, - vab, ob->m_pos, ob->m_rad, htmin, htmax)) - continue; + if (!sweepCircleCircle(activeObst->m_pos, activeObst->m_rad, + vab, ob->m_pos, ob->m_rad, htmin, htmax)) + continue; + } + else if (ob->m_type == KX_OBSTACLE_SEGMENT) + { + if (!sweepCircleSegment(activeObst->m_pos, activeObst->m_rad, svel, + ob->m_pos, ob->m_pos2, ob->m_rad, htmin, htmax)) + continue; + } if (htmin > 0.0f) { diff --git a/source/gameengine/Ketsji/KX_ObstacleSimulation.h b/source/gameengine/Ketsji/KX_ObstacleSimulation.h index d1920e5e6f2..9e5895a466c 100644 --- a/source/gameengine/Ketsji/KX_ObstacleSimulation.h +++ b/source/gameengine/Ketsji/KX_ObstacleSimulation.h @@ -42,12 +42,29 @@ #include "MT_Point3.h" class KX_GameObject; +class KX_NavMeshObject; + +enum KX_OBSTACLE_TYPE +{ + KX_OBSTACLE_OBJ, + KX_OBSTACLE_NAV_MESH, +}; + +enum KX_OBSTACLE_SHAPE +{ + KX_OBSTACLE_CIRCLE, + KX_OBSTACLE_SEGMENT, +}; struct KX_Obstacle { + KX_OBSTACLE_TYPE m_type; + KX_OBSTACLE_SHAPE m_shape; MT_Point3 m_pos; + MT_Point3 m_pos2; MT_Scalar m_rad; MT_Vector2 m_vel; + KX_GameObject* m_gameObj; }; @@ -55,14 +72,20 @@ class KX_ObstacleSimulation { protected: std::vector m_obstacles; + + virtual KX_Obstacle* CreateObstacle(); public: KX_ObstacleSimulation(); virtual ~KX_ObstacleSimulation(); - virtual void AddObstacleForObj(KX_GameObject* gameobj); + void DrawObstacles(); + + void AddObstacleForObj(KX_GameObject* gameobj); + void AddObstaclesForNavMesh(KX_NavMeshObject* navmesh); KX_Obstacle* GetObstacle(KX_GameObject* gameobj); void UpdateObstacles(); - virtual void AdjustObstacleVelocity(KX_Obstacle* activeObst, MT_Vector3& velocity); + virtual void AdjustObstacleVelocity(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj, + MT_Vector3& velocity); }; /* end of class KX_ObstacleSimulation*/ @@ -88,11 +111,12 @@ protected: float m_collisionWeight; // Sample selection collision weight std::vector m_toiCircles; // TOI circles (one per active agent) + virtual KX_Obstacle* CreateObstacle(); public: KX_ObstacleSimulationTOI(); ~KX_ObstacleSimulationTOI(); - virtual void AddObstacleForObj(KX_GameObject* gameobj); - virtual void AdjustObstacleVelocity(KX_Obstacle* activeObst, MT_Vector3& velocity); + virtual void AdjustObstacleVelocity(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj, + MT_Vector3& velocity); }; #endif diff --git a/source/gameengine/Ketsji/KX_SteeringActuator.cpp b/source/gameengine/Ketsji/KX_SteeringActuator.cpp index 45f3482ed5b..a8f8f35b1b8 100644 --- a/source/gameengine/Ketsji/KX_SteeringActuator.cpp +++ b/source/gameengine/Ketsji/KX_SteeringActuator.cpp @@ -175,6 +175,7 @@ bool KX_SteeringActuator::Update(double curtime, bool frame) steervec = -vectotarg; steervec.normalize(); } + break; case KX_STEERING_PATHFOLLOWING: if (m_navmesh && vectotarg.length2()>m_distance*m_distance) { @@ -205,7 +206,7 @@ bool KX_SteeringActuator::Update(double curtime, bool frame) //adjust velocity to avoid obstacles if (m_simulation && m_obstacle) { - m_simulation->AdjustObstacleVelocity(m_obstacle, newvel); + m_simulation->AdjustObstacleVelocity(m_obstacle, m_navmesh, newvel); } //temporary solution: set 2D steering velocity directly to obj From 0183d551089c727724db13a67537156f157ae262 Mon Sep 17 00:00:00 2001 From: Nick Samarin Date: Thu, 10 Jun 2010 00:19:06 +0000 Subject: [PATCH 010/182] Added parameters for obstacle avoidance simulation: for object - flag for creation representation in simulation(OB_HASOBSTACLE) and obstacle radius (obstacleRad), for scene - obstacle simulation type (obstacleSimulation); added ui for new parameters --- release/scripts/ui/properties_game.py | 38 ++++++++++++++++++- source/blender/blenkernel/intern/object.c | 1 + source/blender/blenkernel/intern/scene.c | 2 + source/blender/makesdna/DNA_object_types.h | 3 ++ source/blender/makesdna/DNA_scene_types.h | 7 +++- source/blender/makesrna/intern/rna_object.c | 9 +++++ source/blender/makesrna/intern/rna_scene.c | 12 ++++++ .../Converter/BL_BlenderDataConversion.cpp | 3 +- .../Ketsji/KX_ObstacleSimulation.cpp | 18 +++++++-- source/gameengine/Ketsji/KX_Scene.cpp | 25 +++++++++++- source/gameengine/Ketsji/KX_Scene.h | 1 + 11 files changed, 111 insertions(+), 8 deletions(-) diff --git a/release/scripts/ui/properties_game.py b/release/scripts/ui/properties_game.py index a5b443a461b..dcca9f19051 100644 --- a/release/scripts/ui/properties_game.py +++ b/release/scripts/ui/properties_game.py @@ -194,7 +194,31 @@ class PHYSICS_PT_game_collision_bounds(PhysicsButtonsPanel): if wide_ui: col = split.column() col.prop(game, "collision_compound", text="Compound") + +class PHYSICS_PT_game_obstacles(PhysicsButtonsPanel): + bl_label = "Create obstacle" + def poll(self, context): + game = context.object.game + rd = context.scene.render + return (game.physics_type in ('DYNAMIC', 'RIGID_BODY', 'SENSOR', 'SOFT_BODY', 'STATIC')) and (rd.engine == 'BLENDER_GAME') + + def draw_header(self, context): + game = context.active_object.game + + self.layout.prop(game, "create_obstacle", text="") + + def draw(self, context): + layout = self.layout + + game = context.active_object.game + wide_ui = context.region.width > narrowui + + layout.active = game.create_obstacle + + split = layout.split() + col = split.column() + col.prop(game, "obstacle_radius", text="Radius") class RenderButtonsPanel(bpy.types.Panel): bl_space_type = 'PROPERTIES' @@ -510,10 +534,21 @@ class WORLD_PT_game_physics(WorldButtonsPanel): col.label(text="Logic Steps:") col.prop(gs, "logic_step_max", text="Max") +class WORLD_PT_game_physics_obstacles(WorldButtonsPanel): + bl_label = "Obstacle simulation" + + def draw(self, context): + layout = self.layout + + gs = context.scene.game_data + wide_ui = context.region.width > narrowui + + layout.prop(gs, "obstacle_simulation", text = "Type") classes = [ PHYSICS_PT_game_physics, PHYSICS_PT_game_collision_bounds, + PHYSICS_PT_game_obstacles, RENDER_PT_game, RENDER_PT_game_player, @@ -525,7 +560,8 @@ classes = [ WORLD_PT_game_context_world, WORLD_PT_game_world, WORLD_PT_game_mist, - WORLD_PT_game_physics] + WORLD_PT_game_physics, + WORLD_PT_game_physics_obstacles] def register(): diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 576b3481d07..1ddf1f4d643 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -1028,6 +1028,7 @@ Object *add_only_object(int type, char *name) ob->margin = 0.0; /* ob->pad3 == Contact Processing Threshold */ ob->m_contactProcessingThreshold = 1.; + ob->obstacleRad = 1.; /* NT fluid sim defaults */ ob->fluidsimFlag = 0; diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index faabaf4f91f..4b012304e47 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -472,6 +472,8 @@ Scene *add_scene(char *name) sce->gm.flag = GAME_DISPLAY_LISTS; sce->gm.matmode = GAME_MAT_MULTITEX; + sce->gm.obstacleSimulation= OBSTSIMULATION_NONE; + sound_create_scene(sce); return sce; diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h index f780552715c..1d6cc6981fc 100644 --- a/source/blender/makesdna/DNA_object_types.h +++ b/source/blender/makesdna/DNA_object_types.h @@ -182,6 +182,8 @@ typedef struct Object { float max_vel; /* clamp the maximum velocity 0.0 is disabled */ float min_vel; /* clamp the maximum velocity 0.0 is disabled */ float m_contactProcessingThreshold; + float obstacleRad; + char pad0[4]; short rotmode; /* rotation mode - uses defines set out in DNA_action_types.h for PoseChannel rotations... */ @@ -465,6 +467,7 @@ extern Object workob; #define OB_OCCLUDER 0x40000 #define OB_SENSOR 0x80000 #define OB_NAVMESH 0x100000 +#define OB_HASOBSTACLE 0x200000 /* ob->gameflag2 */ #define OB_NEVER_DO_ACTIVITY_CULLING 1 diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index 8fe48f7d56a..de86e3281fb 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -451,10 +451,11 @@ typedef struct GameData { * bit 3: (gameengine): Activity culling is enabled. * bit 5: (gameengine) : enable Bullet DBVT tree for view frustrum culling */ - short mode, flag, matmode, pad[3]; + short mode, flag, matmode, pad[6]; short occlusionRes; /* resolution of occlusion Z buffer in pixel */ short physicsEngine; short ticrate, maxlogicstep, physubstep, maxphystep; + short obstacleSimulation; /* standalone player */ struct GameFraming framing; @@ -488,6 +489,10 @@ typedef struct GameData { #define WOPHY_ODE 4 #define WOPHY_BULLET 5 +/* obstacleSimulation */ +#define OBSTSIMULATION_NONE 0 +#define OBSTSIMULATION_TOI 1 + /* GameData.flag */ #define GAME_ENABLE_ALL_FRAMES (1 << 1) #define GAME_SHOW_DEBUG_PROPS (1 << 2) diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c index b5818c7ef6e..982139fab11 100644 --- a/source/blender/makesrna/intern/rna_object.c +++ b/source/blender/makesrna/intern/rna_object.c @@ -1269,6 +1269,15 @@ static void rna_def_object_game_settings(BlenderRNA *brna) RNA_def_property_pointer_sdna(prop, NULL, "bsoft"); RNA_def_property_ui_text(prop, "Soft Body Settings", "Settings for Bullet soft body simulation"); + prop= RNA_def_property(srna, "create_obstacle", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "gameflag", OB_HASOBSTACLE); + RNA_def_property_ui_text(prop, "Create obstacle", "Create representation for obstacle simulation"); + + prop= RNA_def_property(srna, "obstacle_radius", PROP_FLOAT, PROP_NONE|PROP_UNIT_LENGTH); + RNA_def_property_float_sdna(prop, NULL, "obstacleRad"); + RNA_def_property_range(prop, 0.0, 1000.0); + RNA_def_property_ui_text(prop, "Obstacle Radius", "Radius of object representation in obstacle simulation"); + /* state */ prop= RNA_def_property(srna, "state", PROP_BOOLEAN, PROP_LAYER_MEMBER); diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index a18c1021a8a..cde0e910723 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -1511,6 +1511,11 @@ static void rna_def_scene_game_data(BlenderRNA *brna) {GAME_MAT_GLSL, "GLSL", 0, "GLSL", "OpenGL shading language shaders"}, {0, NULL, 0, NULL, NULL}}; + static EnumPropertyItem obstacle_simulation_items[] = { + {OBSTSIMULATION_NONE, "NONE", 0, "None", ""}, + {OBSTSIMULATION_TOI, "TOI", 0, "TOI", ""}, + {0, NULL, 0, NULL, NULL}}; + srna= RNA_def_struct(brna, "SceneGameData", NULL); RNA_def_struct_sdna(srna, "GameData"); RNA_def_struct_nested(brna, srna, "Scene"); @@ -1748,6 +1753,13 @@ static void rna_def_scene_game_data(BlenderRNA *brna) RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", GAME_GLSL_NO_EXTRA_TEX); RNA_def_property_ui_text(prop, "GLSL Extra Textures", "Use extra textures like normal or specular maps for GLSL rendering"); RNA_def_property_update(prop, NC_SCENE|NA_EDITED, NULL); + + /* obstacle simulation */ + prop= RNA_def_property(srna, "obstacle_simulation", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "obstacleSimulation"); + RNA_def_property_enum_items(prop, obstacle_simulation_items); + RNA_def_property_ui_text(prop, "Obstacle simulation", "Simulation used for obstacle avoidance in the game engine"); + RNA_def_property_update(prop, NC_SCENE, NULL); } static void rna_def_scene_render_layer(BlenderRNA *brna) diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp index 3383896cf98..7c079e4ad20 100644 --- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp +++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp @@ -2647,7 +2647,8 @@ void BL_ConvertBlenderObjects(struct Main* maggie, for ( i=0;iGetCount();i++) { KX_GameObject* gameobj = static_cast(objectlist->GetValue(i)); - if (gameobj->IsDynamic()) + struct Object* blenderobject = gameobj->GetBlenderObject(); + if (blenderobject->gameflag & OB_HASOBSTACLE) { obssimulation->AddObstacleForObj(gameobj); } diff --git a/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp b/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp index 1d0b0b40750..bad38513167 100644 --- a/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp +++ b/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp @@ -36,8 +36,11 @@ #include "KX_NavMeshObject.h" #include "KX_PythonInit.h" #include "DNA_object_types.h" -#include "math.h" -#define M_PI 3.14159265358979323846 +#include + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif int sweepCircleCircle(const MT_Vector3& pos0, const MT_Scalar r0, const MT_Vector2& v, const MT_Vector3& pos1, const MT_Scalar r1, @@ -168,7 +171,7 @@ void KX_ObstacleSimulation::AddObstacleForObj(KX_GameObject* gameobj) struct Object* blenderobject = gameobj->GetBlenderObject(); obstacle->m_type = KX_OBSTACLE_OBJ; obstacle->m_shape = KX_OBSTACLE_CIRCLE; - obstacle->m_rad = blenderobject->inertia; //.todo use radius of collision shape bound sphere + obstacle->m_rad = blenderobject->obstacleRad; obstacle->m_gameObj = gameobj; } @@ -235,12 +238,21 @@ void KX_ObstacleSimulation::AdjustObstacleVelocity(KX_Obstacle* activeObst, KX_N void KX_ObstacleSimulation::DrawObstacles() { static const MT_Vector3 bluecolor(0,0,1); + static const MT_Vector3 normal(0.,0.,1.); + static const int SECTORS_NUM = 32; for (size_t i=0; im_shape==KX_OBSTACLE_SEGMENT) { KX_RasterizerDrawDebugLine(m_obstacles[i]->m_pos, m_obstacles[i]->m_pos2, bluecolor); } +/* + else if (m_obstacles[i]->m_shape==KX_OBSTACLE_CIRCLE) + { + KX_RasterizerDrawDebugCircle(m_obstacles[i]->m_pos, m_obstacles[i]->m_rad, bluecolor, + normal.normalized(), SECTORS_NUM); + }*/ + } } diff --git a/source/gameengine/Ketsji/KX_Scene.cpp b/source/gameengine/Ketsji/KX_Scene.cpp index 63a7dc1ba2c..825d9317185 100644 --- a/source/gameengine/Ketsji/KX_Scene.cpp +++ b/source/gameengine/Ketsji/KX_Scene.cpp @@ -211,7 +211,15 @@ KX_Scene::KX_Scene(class SCA_IInputDevice* keyboarddevice, m_bucketmanager=new RAS_BucketManager(); - m_obstacleSimulation = new KX_ObstacleSimulationTOI;//KX_ObstacleSimulation; + switch (scene->gm.obstacleSimulation) + { + case OBSTSIMULATION_TOI: + m_obstacleSimulation = new KX_ObstacleSimulationTOI; + break; + default: + m_obstacleSimulation = NULL; + } + #ifndef DISABLE_PYTHON m_attr_dict = PyDict_New(); /* new ref */ @@ -1468,7 +1476,8 @@ void KX_Scene::LogicBeginFrame(double curtime) } //prepare obstacle simulation for new frame - m_obstacleSimulation->UpdateObstacles(); + if (m_obstacleSimulation) + m_obstacleSimulation->UpdateObstacles(); m_logicmgr->BeginFrame(curtime, 1.0/KX_KetsjiEngine::GetTicRate()); } @@ -1899,9 +1908,11 @@ PyMethodDef KX_Scene::Methods[] = { KX_PYMETHODTABLE(KX_Scene, replace), KX_PYMETHODTABLE(KX_Scene, suspend), KX_PYMETHODTABLE(KX_Scene, resume), + KX_PYMETHODTABLE(KX_Scene, drawObstacleSimulation), /* dict style access */ KX_PYMETHODTABLE(KX_Scene, get), + {NULL,NULL} //Sentinel }; @@ -2225,6 +2236,16 @@ KX_PYMETHODDEF_DOC(KX_Scene, resume, Py_RETURN_NONE; } +KX_PYMETHODDEF_DOC(KX_Scene, drawObstacleSimulation, + "drawObstacleSimulation()\n" + "Draw debug visualization of obstacle simulation.\n") +{ + if (GetObstacleSimulation()) + GetObstacleSimulation()->DrawObstacles(); + + Py_RETURN_NONE; +} + /* Matches python dict.get(key, [default]) */ KX_PYMETHODDEF_DOC(KX_Scene, get, "") { diff --git a/source/gameengine/Ketsji/KX_Scene.h b/source/gameengine/Ketsji/KX_Scene.h index 6e75347fa30..9924262fc70 100644 --- a/source/gameengine/Ketsji/KX_Scene.h +++ b/source/gameengine/Ketsji/KX_Scene.h @@ -558,6 +558,7 @@ public: KX_PYMETHOD_DOC(KX_Scene, suspend); KX_PYMETHOD_DOC(KX_Scene, resume); KX_PYMETHOD_DOC(KX_Scene, get); + KX_PYMETHOD_DOC(KX_Scene, drawObstacleSimulation); /* attributes */ static PyObject* pyattr_get_name(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef); From 12b33ca099c57ec793c09b188f6fa1ab2c08beaa Mon Sep 17 00:00:00 2001 From: Nick Samarin Date: Thu, 10 Jun 2010 00:25:04 +0000 Subject: [PATCH 011/182] Added debug circle rendering (extended OglDebugLine to OglDebugShape, created new function KX_RasterizerDrawDebugCircle) --- source/gameengine/Ketsji/KX_KetsjiEngine.cpp | 4 +- .../Ketsji/KX_ObstacleSimulation.cpp | 4 +- source/gameengine/Ketsji/KX_PythonInit.cpp | 7 ++ source/gameengine/Ketsji/KX_PythonInit.h | 2 + .../gameengine/Rasterizer/RAS_IRasterizer.h | 4 +- .../RAS_OpenGLRasterizer.cpp | 86 +++++++++++++++++-- .../RAS_OpenGLRasterizer.h | 26 +++--- 7 files changed, 105 insertions(+), 28 deletions(-) diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp index 8697710b02d..2d9f4bbadf3 100644 --- a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp +++ b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp @@ -341,7 +341,7 @@ void KX_KetsjiEngine::RenderDome() m_rendertools->MotionBlur(m_rasterizer); scene->Render2DFilters(m_canvas); // no RunDrawingCallBacks - // no FlushDebugLines + // no FlushDebugShapes } m_dome->BindImages(i); } @@ -1336,7 +1336,7 @@ void KX_KetsjiEngine::PostRenderScene(KX_Scene* scene) #ifndef DISABLE_PYTHON scene->RunDrawingCallbacks(scene->GetPostDrawCB()); #endif - m_rasterizer->FlushDebugLines(); + m_rasterizer->FlushDebugShapes(); } void KX_KetsjiEngine::StopEngine() diff --git a/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp b/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp index bad38513167..3a2d27de911 100644 --- a/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp +++ b/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp @@ -246,13 +246,11 @@ void KX_ObstacleSimulation::DrawObstacles() { KX_RasterizerDrawDebugLine(m_obstacles[i]->m_pos, m_obstacles[i]->m_pos2, bluecolor); } -/* else if (m_obstacles[i]->m_shape==KX_OBSTACLE_CIRCLE) { KX_RasterizerDrawDebugCircle(m_obstacles[i]->m_pos, m_obstacles[i]->m_rad, bluecolor, normal.normalized(), SECTORS_NUM); - }*/ - + } } } diff --git a/source/gameengine/Ketsji/KX_PythonInit.cpp b/source/gameengine/Ketsji/KX_PythonInit.cpp index 0198555753e..4fbc63150ae 100644 --- a/source/gameengine/Ketsji/KX_PythonInit.cpp +++ b/source/gameengine/Ketsji/KX_PythonInit.cpp @@ -156,6 +156,13 @@ void KX_RasterizerDrawDebugLine(const MT_Vector3& from,const MT_Vector3& to,cons gp_Rasterizer->DrawDebugLine(from,to,color); } +void KX_RasterizerDrawDebugCircle(const MT_Vector3& center, const MT_Scalar radius, const MT_Vector3& color, + const MT_Vector3& normal, int nsector) +{ + if (gp_Rasterizer) + gp_Rasterizer->DrawDebugCircle(center, radius, color, normal, nsector); +} + #ifndef DISABLE_PYTHON static PyObject *gp_OrigPythonSysPath= NULL; diff --git a/source/gameengine/Ketsji/KX_PythonInit.h b/source/gameengine/Ketsji/KX_PythonInit.h index fb59a2f21eb..d46776eb9da 100644 --- a/source/gameengine/Ketsji/KX_PythonInit.h +++ b/source/gameengine/Ketsji/KX_PythonInit.h @@ -71,6 +71,8 @@ class KX_KetsjiEngine* KX_GetActiveEngine(); #include "MT_Vector3.h" void KX_RasterizerDrawDebugLine(const MT_Vector3& from,const MT_Vector3& to,const MT_Vector3& color); +void KX_RasterizerDrawDebugCircle(const MT_Vector3& center, const MT_Scalar radius, const MT_Vector3& color, + const MT_Vector3& normal, int nsector); #endif //__KX_PYTHON_INIT diff --git a/source/gameengine/Rasterizer/RAS_IRasterizer.h b/source/gameengine/Rasterizer/RAS_IRasterizer.h index 3ffbfcd5a8a..e9aacadece3 100644 --- a/source/gameengine/Rasterizer/RAS_IRasterizer.h +++ b/source/gameengine/Rasterizer/RAS_IRasterizer.h @@ -386,7 +386,9 @@ public: virtual void SetPolygonOffset(float mult, float add) = 0; virtual void DrawDebugLine(const MT_Vector3& from,const MT_Vector3& to,const MT_Vector3& color)=0; - virtual void FlushDebugLines()=0; + virtual void DrawDebugCircle(const MT_Vector3& center, const MT_Scalar radius, const MT_Vector3& color, + const MT_Vector3& normal, int nsector)=0; + virtual void FlushDebugShapes()=0; diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp index 122a738e4f3..bedddb748fe 100644 --- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp +++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp @@ -50,6 +50,10 @@ #include "BKE_DerivedMesh.h" +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + /** * 32x32 bit masks for vinterlace stereo mode */ @@ -343,9 +347,9 @@ void RAS_OpenGLRasterizer::ClearCachingInfo(void) m_materialCachingInfo = 0; } -void RAS_OpenGLRasterizer::FlushDebugLines() +void RAS_OpenGLRasterizer::FlushDebugShapes() { - if(!m_debugLines.size()) + if(!m_debugShapes.size()) return; // DrawDebugLines @@ -357,29 +361,93 @@ void RAS_OpenGLRasterizer::FlushDebugLines() if(light) glDisable(GL_LIGHTING); if(tex) glDisable(GL_TEXTURE_2D); + //draw lines glBegin(GL_LINES); - for (unsigned int i=0;iEndFrame(); diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h index 6bbf65f72a4..fe63a854275 100644 --- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h +++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h @@ -44,10 +44,15 @@ using namespace std; #define RAS_MAX_TEXCO 8 // match in BL_Material #define RAS_MAX_ATTRIB 16 // match in BL_BlenderShader -struct OglDebugLine +struct OglDebugShape { - MT_Vector3 m_from; - MT_Vector3 m_to; + enum SHAPE_TYPE{ + LINE, CIRCLE + }; + SHAPE_TYPE m_type; + MT_Vector3 m_pos; + MT_Vector3 m_param; + MT_Vector3 m_param2; MT_Vector3 m_color; }; @@ -249,18 +254,13 @@ public: virtual void SetPolygonOffset(float mult, float add); - virtual void FlushDebugLines(); + virtual void FlushDebugShapes(); + virtual void DrawDebugLine(const MT_Vector3& from,const MT_Vector3& to,const MT_Vector3& color); + virtual void DrawDebugCircle(const MT_Vector3& center, const MT_Scalar radius, const MT_Vector3& color, + const MT_Vector3& normal, int nsector); - virtual void DrawDebugLine(const MT_Vector3& from,const MT_Vector3& to,const MT_Vector3& color) - { - OglDebugLine line; - line.m_from = from; - line.m_to = to; - line.m_color = color; - m_debugLines.push_back(line); - } - std::vector m_debugLines; + std::vector m_debugShapes; virtual void SetTexCoordNum(int num); virtual void SetAttribNum(int num); From 147e8d01ebd7b04d81e2094669d8bc9b0f005f19 Mon Sep 17 00:00:00 2001 From: Nick Samarin Date: Fri, 11 Jun 2010 21:13:59 +0000 Subject: [PATCH 012/182] - added acceleration and turn speed parameters for obstacle simulation - added debug visualization for object velocities --- source/blender/blenkernel/intern/sca.c | 4 ++ .../editors/space_logic/logic_window.c | 3 + source/blender/makesdna/DNA_actuator_types.h | 2 + source/blender/makesrna/intern/rna_actuator.c | 12 ++++ .../Converter/KX_ConvertActuators.cpp | 5 +- .../Ketsji/KX_ObstacleSimulation.cpp | 70 ++++++++++++++++--- .../gameengine/Ketsji/KX_ObstacleSimulation.h | 4 +- .../gameengine/Ketsji/KX_SteeringActuator.cpp | 20 ++++-- .../gameengine/Ketsji/KX_SteeringActuator.h | 6 +- 9 files changed, 105 insertions(+), 21 deletions(-) diff --git a/source/blender/blenkernel/intern/sca.c b/source/blender/blenkernel/intern/sca.c index 80904c1b1e7..877669014bb 100644 --- a/source/blender/blenkernel/intern/sca.c +++ b/source/blender/blenkernel/intern/sca.c @@ -416,6 +416,7 @@ void init_actuator(bActuator *act) bObjectActuator *oa; bRandomActuator *ra; bSoundActuator *sa; + bSteeringActuator *sta; if(act->data) MEM_freeN(act->data); act->data= 0; @@ -491,6 +492,9 @@ void init_actuator(bActuator *act) break; case ACT_STEERING: act->data = MEM_callocN(sizeof( bSteeringActuator), "steering act"); + sta = act->data; + sta->acceleration = 3; + sta->turnspeed = 120; default: ; /* this is very severe... I cannot make any memory for this */ /* logic brick... */ diff --git a/source/blender/editors/space_logic/logic_window.c b/source/blender/editors/space_logic/logic_window.c index 0c06ed74080..208b9aeabc0 100644 --- a/source/blender/editors/space_logic/logic_window.c +++ b/source/blender/editors/space_logic/logic_window.c @@ -4273,6 +4273,9 @@ static void draw_actuator_steering(uiLayout *layout, PointerRNA *ptr) row = uiLayoutRow(layout, 0); uiItemR(row, ptr, "distance", 0, NULL, 0); uiItemR(row, ptr, "velocity", 0, NULL, 0); + row = uiLayoutRow(layout, 0); + uiItemR(row, ptr, "acceleration", 0, NULL, 0); + uiItemR(row, ptr, "turnspeed", 0, NULL, 0); } diff --git a/source/blender/makesdna/DNA_actuator_types.h b/source/blender/makesdna/DNA_actuator_types.h index d3c37f7c6e3..89709948f50 100644 --- a/source/blender/makesdna/DNA_actuator_types.h +++ b/source/blender/makesdna/DNA_actuator_types.h @@ -219,6 +219,8 @@ typedef struct bSteeringActuator { int type; /* 0=seek, 1=flee, 2=path following */ float dist; float velocity; + float acceleration; + float turnspeed; struct Object *target; struct Object *navmesh; } bSteeringActuator; diff --git a/source/blender/makesrna/intern/rna_actuator.c b/source/blender/makesrna/intern/rna_actuator.c index 5f4b9e4c472..df3b59b54bc 100644 --- a/source/blender/makesrna/intern/rna_actuator.c +++ b/source/blender/makesrna/intern/rna_actuator.c @@ -1872,6 +1872,18 @@ static void rna_def_steering_actuator(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Velocity", "Velocity magnitude"); RNA_def_property_update(prop, NC_LOGIC, NULL); + prop= RNA_def_property(srna, "acceleration", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "acceleration"); + RNA_def_property_range(prop, 0.0, 1000.0); + RNA_def_property_ui_text(prop, "Acceleration", "Max acceleration"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "turnspeed", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "turnspeed"); + RNA_def_property_range(prop, 0.0, 720.0); + RNA_def_property_ui_text(prop, "Turn speed", "Max turn speed"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + prop= RNA_def_property(srna, "distance", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "dist"); RNA_def_property_range(prop, 0.0, 1000.0); diff --git a/source/gameengine/Converter/KX_ConvertActuators.cpp b/source/gameengine/Converter/KX_ConvertActuators.cpp index a58b60844fc..0bcd74c9e8b 100644 --- a/source/gameengine/Converter/KX_ConvertActuators.cpp +++ b/source/gameengine/Converter/KX_ConvertActuators.cpp @@ -1058,8 +1058,9 @@ void BL_ConvertActuators(char* maggiename, } KX_SteeringActuator *tmpstact - = new KX_SteeringActuator(gameobj, mode, targetob, navmeshob, - stAct->velocity, stAct->dist, scene->GetObstacleSimulation()); + = new KX_SteeringActuator(gameobj, mode, targetob, navmeshob,stAct->dist, + stAct->velocity, stAct->acceleration, stAct->turnspeed, + scene->GetObstacleSimulation()); baseact = tmpstact; break; } diff --git a/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp b/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp index 3a2d27de911..038a1e07b1b 100644 --- a/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp +++ b/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp @@ -36,13 +36,12 @@ #include "KX_NavMeshObject.h" #include "KX_PythonInit.h" #include "DNA_object_types.h" -#include +#include "BLI_math.h" -#ifndef M_PI -#define M_PI 3.14159265358979323846 -#endif +inline float perp(const MT_Vector2& a, const MT_Vector2& b) { return a.x()*b.y() - a.y()*b.x(); } +inline float lerp(float a, float b, float t) { return a + (b-a)*t; } -int sweepCircleCircle(const MT_Vector3& pos0, const MT_Scalar r0, const MT_Vector2& v, +static int sweepCircleCircle(const MT_Vector3& pos0, const MT_Scalar r0, const MT_Vector2& v, const MT_Vector3& pos1, const MT_Scalar r1, float& tmin, float& tmax) { @@ -64,10 +63,7 @@ int sweepCircleCircle(const MT_Vector3& pos0, const MT_Scalar r0, const MT_Vecto return 1; } -inline float perp(const MT_Vector2& a, const MT_Vector2& b) { return a.x()*b.y() - a.y()*b.x(); } - - -int sweepCircleSegment(const MT_Vector3& pos0, const MT_Scalar r0, const MT_Vector2& v, +static int sweepCircleSegment(const MT_Vector3& pos0, const MT_Scalar r0, const MT_Vector2& v, const MT_Vector3& pa, const MT_Vector3& pb, const MT_Scalar sr, float& tmin, float &tmax) { @@ -143,6 +139,32 @@ int sweepCircleSegment(const MT_Vector3& pos0, const MT_Scalar r0, const MT_Vect return 1; } +static bool inBetweenAngle(float a, float amin, float amax, float& t) +{ + if (amax < amin) amax += (float)M_PI*2; + if (a < amin-(float)M_PI) a += (float)M_PI*2; + if (a > amin+(float)M_PI) a -= (float)M_PI*2; + if (a >= amin && a < amax) + { + t = (a-amin) / (amax-amin); + return true; + } + return false; +} + +static float interpolateToi(float a, const float* dir, const float* toi, const int ntoi) +{ + for (int i = 0; i < ntoi; ++i) + { + int next = (i+1) % ntoi; + float t; + if (inBetweenAngle(a, dir[i], dir[next], t)) + { + return lerp(toi[i], toi[next], t); + } + } + return 0; +} KX_ObstacleSimulation::KX_ObstacleSimulation() { @@ -231,7 +253,7 @@ KX_Obstacle* KX_ObstacleSimulation::GetObstacle(KX_GameObject* gameobj) } void KX_ObstacleSimulation::AdjustObstacleVelocity(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj, - MT_Vector3& velocity) + MT_Vector3& velocity, MT_Scalar maxDeltaSpeed,MT_Scalar maxDeltaAngle) { } @@ -282,7 +304,8 @@ KX_Obstacle* KX_ObstacleSimulationTOI::CreateObstacle() return obstacle; } -void KX_ObstacleSimulationTOI::AdjustObstacleVelocity(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj, MT_Vector3& velocity) +void KX_ObstacleSimulationTOI::AdjustObstacleVelocity(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj, + MT_Vector3& velocity, MT_Scalar maxDeltaSpeed, MT_Scalar maxDeltaAngle) { int nobs = m_obstacles.size(); int obstidx = std::find(m_obstacles.begin(), m_obstacles.end(), activeObst) - m_obstacles.begin(); @@ -387,10 +410,35 @@ void KX_ObstacleSimulationTOI::AdjustObstacleVelocity(KX_Obstacle* activeObst, K tc->toie[iter] = tmine; } + if (activeObst->m_vel.length() > 0.1) + { + // Constrain max turn rate. + float cura = atan2(activeObst->m_vel.y(),activeObst->m_vel.x()); + float da = bestDir - cura; + if (da < -M_PI) da += (float)M_PI*2; + if (da > M_PI) da -= (float)M_PI*2; + if (da < -maxDeltaAngle) + { + bestDir = cura - maxDeltaAngle; + bestToi = min(bestToi, interpolateToi(bestDir, tc->dir, tc->toi, tc->n)); + } + else if (da > maxDeltaAngle) + { + bestDir = cura + maxDeltaAngle; + bestToi = min(bestToi, interpolateToi(bestDir, tc->dir, tc->toi, tc->n)); + } + } + // Adjust speed when time of impact is less than min TOI. if (bestToi < m_minToi) vmax *= bestToi/m_minToi; + // Constrain velocity change. + const float curSpeed = (float) activeObst->m_vel.length(); + float deltaSpeed = vmax - curSpeed; + CLAMP(deltaSpeed, -maxDeltaSpeed, maxDeltaSpeed); + vmax = curSpeed + deltaSpeed; + // New steering velocity. vel.x() = cosf(bestDir) * vmax; vel.y() = sinf(bestDir) * vmax; diff --git a/source/gameengine/Ketsji/KX_ObstacleSimulation.h b/source/gameengine/Ketsji/KX_ObstacleSimulation.h index 9e5895a466c..52da1e938ac 100644 --- a/source/gameengine/Ketsji/KX_ObstacleSimulation.h +++ b/source/gameengine/Ketsji/KX_ObstacleSimulation.h @@ -85,7 +85,7 @@ public: KX_Obstacle* GetObstacle(KX_GameObject* gameobj); void UpdateObstacles(); virtual void AdjustObstacleVelocity(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj, - MT_Vector3& velocity); + MT_Vector3& velocity, MT_Scalar maxDeltaSpeed,MT_Scalar maxDeltaAngle); }; /* end of class KX_ObstacleSimulation*/ @@ -116,7 +116,7 @@ public: KX_ObstacleSimulationTOI(); ~KX_ObstacleSimulationTOI(); virtual void AdjustObstacleVelocity(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj, - MT_Vector3& velocity); + MT_Vector3& velocity, MT_Scalar maxDeltaSpeed,MT_Scalar maxDeltaAngle); }; #endif diff --git a/source/gameengine/Ketsji/KX_SteeringActuator.cpp b/source/gameengine/Ketsji/KX_SteeringActuator.cpp index a8f8f35b1b8..04f01b01751 100644 --- a/source/gameengine/Ketsji/KX_SteeringActuator.cpp +++ b/source/gameengine/Ketsji/KX_SteeringActuator.cpp @@ -32,10 +32,13 @@ * ***** END GPL LICENSE BLOCK ***** */ +#include "BLI_math.h" #include "KX_SteeringActuator.h" #include "KX_GameObject.h" #include "KX_NavMeshObject.h" #include "KX_ObstacleSimulation.h" +#include "KX_PythonInit.h" + /* ------------------------------------------------------------------------- */ /* Native functions */ @@ -45,14 +48,18 @@ KX_SteeringActuator::KX_SteeringActuator(SCA_IObject *gameobj, int mode, KX_GameObject *target, KX_GameObject *navmesh, - MT_Scalar velocity, MT_Scalar distance, + MT_Scalar velocity, + MT_Scalar acceleration, + MT_Scalar turnspeed, KX_ObstacleSimulation* simulation) : SCA_IActuator(gameobj, KX_ACT_STEERING), m_mode(mode), m_target(target), - m_velocity(velocity), m_distance(distance), + m_velocity(velocity), + m_acceleration(acceleration), + m_turnspeed(turnspeed), m_updateTime(0), m_isActive(false), m_simulation(simulation), @@ -157,7 +164,7 @@ bool KX_SteeringActuator::Update(double curtime, bool frame) const MT_Point3& targpos = m_target->NodeGetWorldPosition(); MT_Vector3 vectotarg = targpos - mypos; MT_Vector3 steervec = MT_Vector3(0, 0, 0); - bool apply_steerforce = false; + bool apply_steerforce = true; switch (m_mode) { case KX_STEERING_SEEK: @@ -204,9 +211,12 @@ bool KX_SteeringActuator::Update(double curtime, bool frame) MT_Vector3 newvel = m_velocity*steervec; //adjust velocity to avoid obstacles - if (m_simulation && m_obstacle) + if (m_simulation && m_obstacle && !newvel.fuzzyZero()) { - m_simulation->AdjustObstacleVelocity(m_obstacle, m_navmesh, newvel); + KX_RasterizerDrawDebugLine(mypos, mypos + newvel, MT_Vector3(1.,0.,0.)); + m_simulation->AdjustObstacleVelocity(m_obstacle, m_navmesh, newvel, + m_acceleration*delta, m_turnspeed/180.0f*M_PI*delta); + KX_RasterizerDrawDebugLine(mypos, mypos + newvel, MT_Vector3(0.,1.,0.)); } //temporary solution: set 2D steering velocity directly to obj diff --git a/source/gameengine/Ketsji/KX_SteeringActuator.h b/source/gameengine/Ketsji/KX_SteeringActuator.h index d1ba24279e1..b303a2a8037 100644 --- a/source/gameengine/Ketsji/KX_SteeringActuator.h +++ b/source/gameengine/Ketsji/KX_SteeringActuator.h @@ -54,6 +54,8 @@ class KX_SteeringActuator : public SCA_IActuator int m_mode; MT_Scalar m_distance; MT_Scalar m_velocity; + MT_Scalar m_acceleration; + MT_Scalar m_turnspeed; KX_ObstacleSimulation* m_simulation; KX_Obstacle* m_obstacle; @@ -73,8 +75,10 @@ public: int mode, KX_GameObject *target, KX_GameObject *navmesh, - MT_Scalar movement, MT_Scalar distance, + MT_Scalar velocity, + MT_Scalar acceleration, + MT_Scalar turnspeed, KX_ObstacleSimulation* simulation); virtual ~KX_SteeringActuator(); virtual bool Update(double curtime, bool frame); From 700c32e73833205830b062a13270e4a45668cad0 Mon Sep 17 00:00:00 2001 From: Nick Samarin Date: Wed, 16 Jun 2010 00:23:24 +0000 Subject: [PATCH 013/182] - registration obstacle in game object - creation obstacle on object replication (including navmesh object) - creation object transform for navigation mesh directly from blender object instead of using SGNode world transform (because SGNode doesn't exists yet when building navmesh on ProcessReplica) --- .../Converter/BL_BlenderDataConversion.cpp | 16 +++++++++++++--- source/gameengine/Ketsji/KX_GameObject.cpp | 18 ++++++++++++++++++ source/gameengine/Ketsji/KX_GameObject.h | 15 +++++++++++++++ source/gameengine/Ketsji/KX_NavMeshObject.cpp | 18 +++++++++++++++++- .../Ketsji/KX_ObstacleSimulation.cpp | 16 +++++++++++++++- .../gameengine/Ketsji/KX_ObstacleSimulation.h | 1 + .../gameengine/Ketsji/KX_SteeringActuator.cpp | 7 +++++-- 7 files changed, 84 insertions(+), 7 deletions(-) diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp index 7c079e4ad20..0ade452fae2 100644 --- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp +++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp @@ -2655,20 +2655,30 @@ void BL_ConvertBlenderObjects(struct Main* maggie, } } - //build navigation mesh - for ( i=0;iGetCount();i++) + //process navigation mesh objects + for ( i=0; iGetCount();i++) { KX_GameObject* gameobj = static_cast(objectlist->GetValue(i)); struct Object* blenderobject = gameobj->GetBlenderObject(); if (blenderobject->type==OB_MESH && (blenderobject->gameflag & OB_NAVMESH)) { KX_NavMeshObject* navmesh = static_cast(gameobj); - navmesh->BuildNavMesh(); navmesh->SetVisible(0, true); + navmesh->BuildNavMesh(); if (obssimulation) obssimulation->AddObstaclesForNavMesh(navmesh); } } + for ( i=0; iGetCount();i++) + { + KX_GameObject* gameobj = static_cast(inactivelist->GetValue(i)); + struct Object* blenderobject = gameobj->GetBlenderObject(); + if (blenderobject->type==OB_MESH && (blenderobject->gameflag & OB_NAVMESH)) + { + KX_NavMeshObject* navmesh = static_cast(gameobj); + navmesh->SetVisible(0, true); + } + } #define CONVERT_LOGIC #ifdef CONVERT_LOGIC diff --git a/source/gameengine/Ketsji/KX_GameObject.cpp b/source/gameengine/Ketsji/KX_GameObject.cpp index abc597a9eae..2d89782393d 100644 --- a/source/gameengine/Ketsji/KX_GameObject.cpp +++ b/source/gameengine/Ketsji/KX_GameObject.cpp @@ -67,6 +67,7 @@ typedef unsigned long uint_ptr; #include "SCA_ISensor.h" #include "SCA_IController.h" #include "NG_NetworkScene.h" //Needed for sendMessage() +#include "KX_ObstacleSimulation.h" #include "PyObjectPlus.h" /* python stuff */ @@ -101,6 +102,7 @@ KX_GameObject::KX_GameObject( m_pGraphicController(NULL), m_xray(false), m_pHitObject(NULL), + m_pObstacle(NULL), m_isDeformable(false) #ifndef DISABLE_PYTHON , m_attr_dict(NULL) @@ -148,6 +150,14 @@ KX_GameObject::~KX_GameObject() { delete m_pGraphicController; } + + if (m_pObstacle) + { + KX_Scene *scene = KX_GetActiveScene(); + KX_ObstacleSimulation* obstacleSimulation = scene->GetObstacleSimulation(); + obstacleSimulation->DestroyObstacle(m_pObstacle); + } + #ifndef DISABLE_PYTHON if (m_attr_dict) { PyDict_Clear(m_attr_dict); /* incase of circular refs or other weired cases */ @@ -348,6 +358,14 @@ void KX_GameObject::ProcessReplica() m_pClient_info->m_gameobject = this; m_state = 0; + KX_Scene* scene = KX_GetActiveScene(); + KX_ObstacleSimulation* obssimulation = scene->GetObstacleSimulation(); + struct Object* blenderobject = GetBlenderObject(); + if (obssimulation && (blenderobject->gameflag & OB_HASOBSTACLE)) + { + obssimulation->AddObstacleForObj(this); + } + #ifndef DISABLE_PYTHON if(m_attr_dict) m_attr_dict= PyDict_Copy(m_attr_dict); diff --git a/source/gameengine/Ketsji/KX_GameObject.h b/source/gameengine/Ketsji/KX_GameObject.h index 625ff2609df..116230adc48 100644 --- a/source/gameengine/Ketsji/KX_GameObject.h +++ b/source/gameengine/Ketsji/KX_GameObject.h @@ -59,6 +59,7 @@ class KX_IPhysicsController; class PHY_IGraphicController; class PHY_IPhysicsEnvironment; struct Object; +struct KX_Obstacle; #ifndef DISABLE_PYTHON /* utility conversion function */ @@ -107,6 +108,8 @@ protected: SG_Node* m_pSGNode; MT_CmMatrix4x4 m_OpenGL_4x4Matrix; + + KX_Obstacle* m_pObstacle; public: bool m_isDeformable; @@ -790,12 +793,24 @@ public: } m_bSuspendDynamics = false; } + + void RegisterObstacle(KX_Obstacle* obstacle) + { + m_pObstacle = obstacle; + } + void UnregisterObstacle() + { + m_pObstacle = NULL; + } + + KX_ClientObjectInfo* getClientInfo() { return m_pClient_info; } CListValue* GetChildren(); CListValue* GetChildrenRecursive(); + #ifndef DISABLE_PYTHON /** * @section Python interface functions. diff --git a/source/gameengine/Ketsji/KX_NavMeshObject.cpp b/source/gameengine/Ketsji/KX_NavMeshObject.cpp index 31c46865f4a..6c2301b6d8c 100644 --- a/source/gameengine/Ketsji/KX_NavMeshObject.cpp +++ b/source/gameengine/Ketsji/KX_NavMeshObject.cpp @@ -42,6 +42,7 @@ extern "C" { #include "Value.h" #include "Recast.h" #include "DetourStatNavMeshBuilder.h" +#include "KX_ObstacleSimulation.h" static const int MAX_PATH_LEN = 256; static const float polyPickExt[3] = {2, 4, 2}; @@ -91,7 +92,13 @@ CValue* KX_NavMeshObject::GetReplica() void KX_NavMeshObject::ProcessReplica() { KX_GameObject::ProcessReplica(); + BuildNavMesh(); + KX_Scene* scene = KX_GetActiveScene(); + KX_ObstacleSimulation* obssimulation = scene->GetObstacleSimulation(); + if (obssimulation) + obssimulation->AddObstaclesForNavMesh(this); + } bool KX_NavMeshObject::BuildVertIndArrays(RAS_MeshObject* meshobj, float *&vertices, int& nverts, @@ -171,7 +178,16 @@ bool KX_NavMeshObject::BuildNavMesh() return false; //prepare vertices and indices - MT_Transform worldTransform = GetSGNode()->GetWorldTransform(); + struct Object* blenderobject = GetBlenderObject(); + MT_Point3 posobj; + posobj.setValue(blenderobject->loc[0]+blenderobject->dloc[0], + blenderobject->loc[1]+blenderobject->dloc[1], + blenderobject->loc[2]+blenderobject->dloc[2]); + MT_Vector3 eulxyzobj(blenderobject->rot); + MT_Vector3 scaleobj(blenderobject->size); + MT_Matrix3x3 rotMatrix(eulxyzobj); + MT_Transform worldTransform(posobj, rotMatrix.scaled(scaleobj[0], scaleobj[1], scaleobj[2])); + MT_Point3 pos; for (int i=0; im_shape = KX_OBSTACLE_CIRCLE; obstacle->m_rad = blenderobject->obstacleRad; obstacle->m_gameObj = gameobj; - + gameobj->RegisterObstacle(obstacle); +} + +void KX_ObstacleSimulation::DestroyObstacle(KX_Obstacle* obstacle) +{ + for (size_t i=0; im_gameObj->UnregisterObstacle(); + m_obstacles[i] = m_obstacles.back(); + m_obstacles.pop_back(); + delete obstacle; + } + } } void KX_ObstacleSimulation::AddObstaclesForNavMesh(KX_NavMeshObject* navmeshobj) diff --git a/source/gameengine/Ketsji/KX_ObstacleSimulation.h b/source/gameengine/Ketsji/KX_ObstacleSimulation.h index 52da1e938ac..8463820b7c8 100644 --- a/source/gameengine/Ketsji/KX_ObstacleSimulation.h +++ b/source/gameengine/Ketsji/KX_ObstacleSimulation.h @@ -81,6 +81,7 @@ public: void DrawObstacles(); void AddObstacleForObj(KX_GameObject* gameobj); + void DestroyObstacle(KX_Obstacle* obstacle); void AddObstaclesForNavMesh(KX_NavMeshObject* navmesh); KX_Obstacle* GetObstacle(KX_GameObject* gameobj); void UpdateObstacles(); diff --git a/source/gameengine/Ketsji/KX_SteeringActuator.cpp b/source/gameengine/Ketsji/KX_SteeringActuator.cpp index 04f01b01751..786c52413c9 100644 --- a/source/gameengine/Ketsji/KX_SteeringActuator.cpp +++ b/source/gameengine/Ketsji/KX_SteeringActuator.cpp @@ -105,13 +105,13 @@ bool KX_SteeringActuator::UnlinkObject(SCA_IObject* clientobj) { if (clientobj == m_target) { - // this object is being deleted, we cannot continue to track it. + // this object is being deleted, we cannot continue to use it. m_target = NULL; return true; } else if (clientobj == m_navmesh) { - // this object is being deleted, we cannot continue to track it. + // this object is being deleted, we cannot continue to useit. m_navmesh = NULL; return true; } @@ -159,6 +159,9 @@ bool KX_SteeringActuator::Update(double curtime, bool frame) if (bNegativeEvent || !delta) return false; // do nothing on negative events + if (!m_target) + return false; + KX_GameObject *obj = (KX_GameObject*) GetParent(); const MT_Point3& mypos = obj->NodeGetWorldPosition(); const MT_Point3& targpos = m_target->NodeGetWorldPosition(); From c92d0dfdf6b6a03726612f426e1f0e506a899f42 Mon Sep 17 00:00:00 2001 From: Nick Samarin Date: Fri, 18 Jun 2010 23:48:52 +0000 Subject: [PATCH 014/182] Added: - obstacle culling for correct simulation in 3d - flag for steering actuator termination on reaching target - path recalculation period - advance by waypoints (for path following) --- release/scripts/ui/properties_game.py | 3 + source/blender/blenkernel/intern/scene.c | 1 + .../editors/space_logic/logic_window.c | 4 + source/blender/makesdna/DNA_actuator_types.h | 6 +- source/blender/makesdna/DNA_scene_types.h | 3 +- source/blender/makesrna/intern/rna_actuator.c | 11 ++ source/blender/makesrna/intern/rna_scene.c | 7 ++ .../Converter/KX_ConvertActuators.cpp | 6 +- source/gameengine/Ketsji/KX_NavMeshObject.cpp | 65 +++++++---- .../Ketsji/KX_ObstacleSimulation.cpp | 52 ++++++++- .../gameengine/Ketsji/KX_ObstacleSimulation.h | 7 +- source/gameengine/Ketsji/KX_Scene.cpp | 2 +- .../gameengine/Ketsji/KX_SteeringActuator.cpp | 104 +++++++++++++----- .../gameengine/Ketsji/KX_SteeringActuator.h | 9 ++ 14 files changed, 215 insertions(+), 65 deletions(-) diff --git a/release/scripts/ui/properties_game.py b/release/scripts/ui/properties_game.py index dcca9f19051..8cd7e67ba90 100644 --- a/release/scripts/ui/properties_game.py +++ b/release/scripts/ui/properties_game.py @@ -544,6 +544,9 @@ class WORLD_PT_game_physics_obstacles(WorldButtonsPanel): wide_ui = context.region.width > narrowui layout.prop(gs, "obstacle_simulation", text = "Type") + if gs.obstacle_simulation != 'None': + layout.prop(gs, "level_height", text="Level height") + classes = [ PHYSICS_PT_game_physics, diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index 4b012304e47..1fd30930933 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -473,6 +473,7 @@ Scene *add_scene(char *name) sce->gm.matmode = GAME_MAT_MULTITEX; sce->gm.obstacleSimulation= OBSTSIMULATION_NONE; + sce->gm.levelHeight = 2.f; sound_create_scene(sce); diff --git a/source/blender/editors/space_logic/logic_window.c b/source/blender/editors/space_logic/logic_window.c index 208b9aeabc0..c20c6b5144a 100644 --- a/source/blender/editors/space_logic/logic_window.c +++ b/source/blender/editors/space_logic/logic_window.c @@ -4276,6 +4276,10 @@ static void draw_actuator_steering(uiLayout *layout, PointerRNA *ptr) row = uiLayoutRow(layout, 0); uiItemR(row, ptr, "acceleration", 0, NULL, 0); uiItemR(row, ptr, "turnspeed", 0, NULL, 0); + row = uiLayoutRow(layout, 0); + uiItemR(row, ptr, "selfterminated", 0, NULL, 0); + if (RNA_enum_get(ptr, "mode")==ACT_STEERING_PATHFOLLOWING) + uiItemR(row, ptr, "updateperiod", 0, NULL, 0); } diff --git a/source/blender/makesdna/DNA_actuator_types.h b/source/blender/makesdna/DNA_actuator_types.h index 89709948f50..9d26632769b 100644 --- a/source/blender/makesdna/DNA_actuator_types.h +++ b/source/blender/makesdna/DNA_actuator_types.h @@ -215,12 +215,14 @@ typedef struct bArmatureActuator { } bArmatureActuator; typedef struct bSteeringActuator { - char pad[4]; + char pad[7]; + char flag; int type; /* 0=seek, 1=flee, 2=path following */ float dist; float velocity; float acceleration; float turnspeed; + int updateTime; struct Object *target; struct Object *navmesh; } bSteeringActuator; @@ -518,6 +520,8 @@ typedef struct FreeCamera { #define ACT_STEERING_SEEK 0 #define ACT_STEERING_FLEE 1 #define ACT_STEERING_PATHFOLLOWING 2 +/* steeringactuator->flag */ +#define ACT_STEERING_SELFTERMINATED 1 #endif diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index de86e3281fb..8f92c9f5b2f 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -451,11 +451,12 @@ typedef struct GameData { * bit 3: (gameengine): Activity culling is enabled. * bit 5: (gameengine) : enable Bullet DBVT tree for view frustrum culling */ - short mode, flag, matmode, pad[6]; + short mode, flag, matmode/*, pad[2]*/; short occlusionRes; /* resolution of occlusion Z buffer in pixel */ short physicsEngine; short ticrate, maxlogicstep, physubstep, maxphystep; short obstacleSimulation; + float levelHeight; /* standalone player */ struct GameFraming framing; diff --git a/source/blender/makesrna/intern/rna_actuator.c b/source/blender/makesrna/intern/rna_actuator.c index df3b59b54bc..ae6e561defa 100644 --- a/source/blender/makesrna/intern/rna_actuator.c +++ b/source/blender/makesrna/intern/rna_actuator.c @@ -1897,6 +1897,17 @@ static void rna_def_steering_actuator(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Target Object", "Set target object"); RNA_def_property_update(prop, NC_LOGIC, NULL); + prop= RNA_def_property(srna, "selfterminated", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_STEERING_SELFTERMINATED); + RNA_def_property_ui_text(prop, "Self terminated", "Terminate when target is reached"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "updateperiod", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "updateTime"); + RNA_def_property_ui_range(prop, -1, 100000, 1, 1); + RNA_def_property_ui_text(prop, "Update period", "Path update period"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + prop= RNA_def_property(srna, "navmesh", PROP_POINTER, PROP_NONE); RNA_def_property_struct_type(prop, "Object"); RNA_def_property_pointer_sdna(prop, NULL, "navmesh"); diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index cde0e910723..f91ac0517f9 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -1760,6 +1760,13 @@ static void rna_def_scene_game_data(BlenderRNA *brna) RNA_def_property_enum_items(prop, obstacle_simulation_items); RNA_def_property_ui_text(prop, "Obstacle simulation", "Simulation used for obstacle avoidance in the game engine"); RNA_def_property_update(prop, NC_SCENE, NULL); + + prop= RNA_def_property(srna, "level_height", PROP_FLOAT, PROP_ACCELERATION); + RNA_def_property_float_sdna(prop, NULL, "levelHeight"); + RNA_def_property_range(prop, 0.0f, 200.0f); + RNA_def_property_ui_text(prop, "Level height", "Max difference in heights of obstacles to enable their interaction"); + RNA_def_property_update(prop, NC_SCENE, NULL); + } static void rna_def_scene_render_layer(BlenderRNA *brna) diff --git a/source/gameengine/Converter/KX_ConvertActuators.cpp b/source/gameengine/Converter/KX_ConvertActuators.cpp index 0bcd74c9e8b..e5c39da1545 100644 --- a/source/gameengine/Converter/KX_ConvertActuators.cpp +++ b/source/gameengine/Converter/KX_ConvertActuators.cpp @@ -1057,10 +1057,12 @@ void BL_ConvertActuators(char* maggiename, break; } + bool selfTerminated = (stAct->flag & ACT_STEERING_SELFTERMINATED) !=0; KX_SteeringActuator *tmpstact = new KX_SteeringActuator(gameobj, mode, targetob, navmeshob,stAct->dist, - stAct->velocity, stAct->acceleration, stAct->turnspeed, - scene->GetObstacleSimulation()); + stAct->velocity, stAct->acceleration, stAct->turnspeed, + selfTerminated, stAct->updateTime, + scene->GetObstacleSimulation()); baseact = tmpstact; break; } diff --git a/source/gameengine/Ketsji/KX_NavMeshObject.cpp b/source/gameengine/Ketsji/KX_NavMeshObject.cpp index 6c2301b6d8c..2c423558768 100644 --- a/source/gameengine/Ketsji/KX_NavMeshObject.cpp +++ b/source/gameengine/Ketsji/KX_NavMeshObject.cpp @@ -333,32 +333,53 @@ void KX_NavMeshObject::DrawNavMesh() if (!m_navMesh) return; MT_Vector3 color(0.f, 0.f, 0.f); - - for (int i = 0; i < m_navMesh->getPolyDetailCount(); ++i) + + enum RenderMode {DETAILED_TRIS, WALLS}; + static const RenderMode renderMode = DETAILED_TRIS; + switch (renderMode) { - const dtStatPoly* p = m_navMesh->getPoly(i); - const dtStatPolyDetail* pd = m_navMesh->getPolyDetail(i); - - for (int j = 0; j < pd->ntris; ++j) + case WALLS : + for (int pi=0; pigetPolyCount(); pi++) { - const unsigned char* t = m_navMesh->getDetailTri(pd->tbase+j); - MT_Vector3 tri[3]; - for (int k = 0; k < 3; ++k) - { - const float* v; - if (t[k] < p->nv) - v = m_navMesh->getVertex(p->v[t[k]]); - else - v = m_navMesh->getDetailVertex(pd->vbase+(t[k]-p->nv)); - float pos[3]; - vcopy(pos, v); - flipAxes(pos); - tri[k].setValue(pos); - } + const dtStatPoly* poly = m_navMesh->getPoly(pi); - for (int k=0; k<3; k++) - KX_RasterizerDrawDebugLine(tri[k], tri[(k+1)%3], color); + for (int i = 0, j = (int)poly->nv-1; i < (int)poly->nv; j = i++) + { + if (poly->n[j]) continue; + const float* vj = m_navMesh->getVertex(poly->v[j]); + const float* vi = m_navMesh->getVertex(poly->v[i]); + KX_RasterizerDrawDebugLine(MT_Vector3(vj[0], vj[2], vj[1]), MT_Vector3(vi[0], vi[2], vi[1]), color); + } } + break; + case DETAILED_TRIS : + for (int i = 0; i < m_navMesh->getPolyDetailCount(); ++i) + { + const dtStatPoly* p = m_navMesh->getPoly(i); + const dtStatPolyDetail* pd = m_navMesh->getPolyDetail(i); + + for (int j = 0; j < pd->ntris; ++j) + { + const unsigned char* t = m_navMesh->getDetailTri(pd->tbase+j); + MT_Vector3 tri[3]; + for (int k = 0; k < 3; ++k) + { + const float* v; + if (t[k] < p->nv) + v = m_navMesh->getVertex(p->v[t[k]]); + else + v = m_navMesh->getDetailVertex(pd->vbase+(t[k]-p->nv)); + float pos[3]; + vcopy(pos, v); + flipAxes(pos); + tri[k].setValue(pos); + } + + for (int k=0; k<3; k++) + KX_RasterizerDrawDebugLine(tri[k], tri[(k+1)%3], color); + } + } + break; } } diff --git a/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp b/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp index 5994ebdc80c..f8b064c39f8 100644 --- a/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp +++ b/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp @@ -166,7 +166,8 @@ static float interpolateToi(float a, const float* dir, const float* toi, const i return 0; } -KX_ObstacleSimulation::KX_ObstacleSimulation() +KX_ObstacleSimulation::KX_ObstacleSimulation(MT_Scalar levelHeight) +: m_levelHeight(levelHeight) { } @@ -285,12 +286,51 @@ void KX_ObstacleSimulation::DrawObstacles() else if (m_obstacles[i]->m_shape==KX_OBSTACLE_CIRCLE) { KX_RasterizerDrawDebugCircle(m_obstacles[i]->m_pos, m_obstacles[i]->m_rad, bluecolor, - normal.normalized(), SECTORS_NUM); + normal, SECTORS_NUM); } } } -KX_ObstacleSimulationTOI::KX_ObstacleSimulationTOI(): +static MT_Point3 nearestPointToObstacle(MT_Point3& pos ,KX_Obstacle* obstacle) +{ + switch (obstacle->m_shape) + { + case KX_OBSTACLE_SEGMENT : + { + MT_Vector3 ab = obstacle->m_pos2 - obstacle->m_pos; + if (!ab.fuzzyZero()) + { + MT_Vector3 abdir = ab.normalized(); + MT_Vector3 v = pos - obstacle->m_pos; + MT_Scalar proj = abdir.dot(v); + CLAMP(proj, 0, ab.length()); + MT_Point3 res = obstacle->m_pos + abdir*proj; + return res; + } + } + case KX_OBSTACLE_CIRCLE : + default: + return obstacle->m_pos; + } +} + +bool KX_ObstacleSimulation::FilterObstacle(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj, KX_Obstacle* otherObst) +{ + //filter obstacles by type + if ( (otherObst == activeObst) || + (otherObst->m_type==KX_OBSTACLE_NAV_MESH && otherObst->m_gameObj!=activeNavMeshObj) ) + return false; + + //filter obstacles by position + MT_Point3 p = nearestPointToObstacle(activeObst->m_pos, otherObst); + if ( fabs(activeObst->m_pos.z() - p.z()) > m_levelHeight) + return false; + + return true; +} + +KX_ObstacleSimulationTOI::KX_ObstacleSimulationTOI(MT_Scalar levelHeight): + KX_ObstacleSimulation(levelHeight), m_avoidSteps(32), m_minToi(0.5f), m_maxToi(1.2f), @@ -360,10 +400,10 @@ void KX_ObstacleSimulationTOI::AdjustObstacleVelocity(KX_Obstacle* activeObst, K for (int i = 0; i < nobs; ++i) { KX_Obstacle* ob = m_obstacles[i]; - if ( (ob==activeObst) || - (ob->m_type==KX_OBSTACLE_NAV_MESH && ob->m_gameObj!=activeNavMeshObj) ) + bool res = FilterObstacle(activeObst, activeNavMeshObj, ob); + if (!res) continue; - + float htmin,htmax; if (ob->m_type == KX_OBSTACLE_CIRCLE) diff --git a/source/gameengine/Ketsji/KX_ObstacleSimulation.h b/source/gameengine/Ketsji/KX_ObstacleSimulation.h index 8463820b7c8..4b323035823 100644 --- a/source/gameengine/Ketsji/KX_ObstacleSimulation.h +++ b/source/gameengine/Ketsji/KX_ObstacleSimulation.h @@ -73,9 +73,12 @@ class KX_ObstacleSimulation protected: std::vector m_obstacles; + MT_Scalar m_levelHeight; + virtual KX_Obstacle* CreateObstacle(); + bool FilterObstacle(KX_Obstacle* activeObstacle, KX_NavMeshObject* activeNavMeshObj, KX_Obstacle* otherObstacle); public: - KX_ObstacleSimulation(); + KX_ObstacleSimulation(MT_Scalar levelHeight); virtual ~KX_ObstacleSimulation(); void DrawObstacles(); @@ -114,7 +117,7 @@ protected: std::vector m_toiCircles; // TOI circles (one per active agent) virtual KX_Obstacle* CreateObstacle(); public: - KX_ObstacleSimulationTOI(); + KX_ObstacleSimulationTOI(MT_Scalar levelHeight); ~KX_ObstacleSimulationTOI(); virtual void AdjustObstacleVelocity(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj, MT_Vector3& velocity, MT_Scalar maxDeltaSpeed,MT_Scalar maxDeltaAngle); diff --git a/source/gameengine/Ketsji/KX_Scene.cpp b/source/gameengine/Ketsji/KX_Scene.cpp index 825d9317185..c7398e8e3ee 100644 --- a/source/gameengine/Ketsji/KX_Scene.cpp +++ b/source/gameengine/Ketsji/KX_Scene.cpp @@ -214,7 +214,7 @@ KX_Scene::KX_Scene(class SCA_IInputDevice* keyboarddevice, switch (scene->gm.obstacleSimulation) { case OBSTSIMULATION_TOI: - m_obstacleSimulation = new KX_ObstacleSimulationTOI; + m_obstacleSimulation = new KX_ObstacleSimulationTOI((MT_Scalar)scene->gm.levelHeight); break; default: m_obstacleSimulation = NULL; diff --git a/source/gameengine/Ketsji/KX_SteeringActuator.cpp b/source/gameengine/Ketsji/KX_SteeringActuator.cpp index 786c52413c9..3bf8a745177 100644 --- a/source/gameengine/Ketsji/KX_SteeringActuator.cpp +++ b/source/gameengine/Ketsji/KX_SteeringActuator.cpp @@ -52,6 +52,8 @@ KX_SteeringActuator::KX_SteeringActuator(SCA_IObject *gameobj, MT_Scalar velocity, MT_Scalar acceleration, MT_Scalar turnspeed, + bool isSelfTerminated, + int pathUpdatePeriod, KX_ObstacleSimulation* simulation) : SCA_IActuator(gameobj, KX_ACT_STEERING), m_mode(mode), @@ -60,10 +62,14 @@ KX_SteeringActuator::KX_SteeringActuator(SCA_IObject *gameobj, m_velocity(velocity), m_acceleration(acceleration), m_turnspeed(turnspeed), + m_isSelfTerminated(isSelfTerminated), + m_pathUpdatePeriod(pathUpdatePeriod), m_updateTime(0), - m_isActive(false), - m_simulation(simulation), - m_obstacle(NULL) + m_isActive(false), + m_simulation(simulation), + m_obstacle(NULL), + m_pathLen(0), + m_wayPointIdx(-1) { m_navmesh = static_cast(navmesh); if (m_navmesh) @@ -147,6 +153,7 @@ bool KX_SteeringActuator::Update(double curtime, bool frame) if (m_posevent && !m_isActive) { delta = 0; + m_pathUpdateTime = -1; m_updateTime = curtime; m_isActive = true; } @@ -156,61 +163,89 @@ bool KX_SteeringActuator::Update(double curtime, bool frame) RemoveAllEvents(); - if (bNegativeEvent || !delta) - return false; // do nothing on negative events + if (!delta) + return true; - if (!m_target) - return false; + if (bNegativeEvent || !m_target) + return false; // do nothing on negative events KX_GameObject *obj = (KX_GameObject*) GetParent(); const MT_Point3& mypos = obj->NodeGetWorldPosition(); const MT_Point3& targpos = m_target->NodeGetWorldPosition(); MT_Vector3 vectotarg = targpos - mypos; MT_Vector3 steervec = MT_Vector3(0, 0, 0); - bool apply_steerforce = true; + bool apply_steerforce = false; + bool terminate = true; switch (m_mode) { case KX_STEERING_SEEK: if (vectotarg.length2()>m_distance*m_distance) { - apply_steerforce = true; + terminate = false; steervec = vectotarg; steervec.normalize(); + apply_steerforce = true; } break; case KX_STEERING_FLEE: if (vectotarg.length2()m_distance*m_distance) { - static const int MAX_PATH_LENGTH = 128; - static const MT_Vector3 PATH_COLOR(1,0,0); + terminate = false; - float path[MAX_PATH_LENGTH*3]; - int pathlen = m_navmesh->FindPath(mypos, targpos, path, MAX_PATH_LENGTH); - if (pathlen > 1) + static const MT_Scalar WAYPOINT_RADIUS(1.); + + if (m_pathUpdateTime<0 || (m_pathUpdatePeriod>=0 && + curtime - m_pathUpdateTime>((double)m_pathUpdatePeriod/1000))) { - //debug draw - m_navmesh->DrawPath(path, pathlen, PATH_COLOR); - - apply_steerforce = true; - MT_Vector3 waypoint(&path[3]); - steervec = waypoint - mypos; - steervec.z() = 0; - steervec.normalize(); + m_pathUpdateTime = curtime; + m_pathLen = m_navmesh->FindPath(mypos, targpos, m_path, MAX_PATH_LENGTH); + m_wayPointIdx = m_pathLen > 1 ? 1 : -1; } + + if (m_wayPointIdx>0) + { + MT_Vector3 waypoint(&m_path[3*m_wayPointIdx]); + if ((waypoint-mypos).length2()=m_pathLen) + { + m_wayPointIdx = -1; + terminate = true; + } + else + waypoint.setValue(&m_path[3*m_wayPointIdx]); + } + + steervec = waypoint - mypos; + apply_steerforce = true; + + //debug draw + static const MT_Vector3 PATH_COLOR(1,0,0); + m_navmesh->DrawPath(m_path, m_pathLen, PATH_COLOR); + + } + } break; } if (apply_steerforce) { + bool isdyna = obj->IsDynamic(); + if (isdyna) + steervec.z() = 0; + if (!steervec.fuzzyZero()) + steervec.normalize(); MT_Vector3 newvel = m_velocity*steervec; //adjust velocity to avoid obstacles @@ -222,14 +257,23 @@ bool KX_SteeringActuator::Update(double curtime, bool frame) KX_RasterizerDrawDebugLine(mypos, mypos + newvel, MT_Vector3(0.,1.,0.)); } - //temporary solution: set 2D steering velocity directly to obj - //correct way is to apply physical force - //MT_Vector3 movement = delta*m_velocity*steervec; - //obj->ApplyMovement(movement, false); - MT_Vector3 curvel = obj->GetLinearVelocity(); - newvel.z() = curvel.z(); - obj->setLinearVelocity(newvel, false); + if (isdyna) + { + //temporary solution: set 2D steering velocity directly to obj + //correct way is to apply physical force + MT_Vector3 curvel = obj->GetLinearVelocity(); + newvel.z() = curvel.z(); + obj->setLinearVelocity(newvel, false); + } + else + { + MT_Vector3 movement = delta*newvel; + obj->ApplyMovement(movement, false); + } } + + if (terminate && m_isSelfTerminated) + return false; } return true; diff --git a/source/gameengine/Ketsji/KX_SteeringActuator.h b/source/gameengine/Ketsji/KX_SteeringActuator.h index b303a2a8037..5ac5a9f37c4 100644 --- a/source/gameengine/Ketsji/KX_SteeringActuator.h +++ b/source/gameengine/Ketsji/KX_SteeringActuator.h @@ -43,6 +43,7 @@ class KX_GameObject; class KX_NavMeshObject; struct KX_Obstacle; class KX_ObstacleSimulation; +const int MAX_PATH_LENGTH = 128; class KX_SteeringActuator : public SCA_IActuator { @@ -61,6 +62,12 @@ class KX_SteeringActuator : public SCA_IActuator KX_Obstacle* m_obstacle; double m_updateTime; bool m_isActive; + bool m_isSelfTerminated; + float m_path[MAX_PATH_LENGTH*3]; + int m_pathLen; + int m_pathUpdatePeriod; + double m_pathUpdateTime; + int m_wayPointIdx; public: enum KX_STEERINGACT_MODE { @@ -79,6 +86,8 @@ public: MT_Scalar velocity, MT_Scalar acceleration, MT_Scalar turnspeed, + bool isSelfTerminated, + int pathUpdatePeriod, KX_ObstacleSimulation* simulation); virtual ~KX_SteeringActuator(); virtual bool Update(double curtime, bool frame); From e5b3909726348406172e3b713eb1d1404ba39387 Mon Sep 17 00:00:00 2001 From: Nick Samarin Date: Wed, 23 Jun 2010 22:51:26 +0000 Subject: [PATCH 015/182] don't add obstacles for navmesh walls in the path following mode --- source/gameengine/Ketsji/KX_SteeringActuator.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/gameengine/Ketsji/KX_SteeringActuator.cpp b/source/gameengine/Ketsji/KX_SteeringActuator.cpp index 3bf8a745177..b733fc79dee 100644 --- a/source/gameengine/Ketsji/KX_SteeringActuator.cpp +++ b/source/gameengine/Ketsji/KX_SteeringActuator.cpp @@ -201,7 +201,7 @@ bool KX_SteeringActuator::Update(double curtime, bool frame) { terminate = false; - static const MT_Scalar WAYPOINT_RADIUS(1.); + static const MT_Scalar WAYPOINT_RADIUS(0.25); if (m_pathUpdateTime<0 || (m_pathUpdatePeriod>=0 && curtime - m_pathUpdateTime>((double)m_pathUpdatePeriod/1000))) @@ -252,8 +252,8 @@ bool KX_SteeringActuator::Update(double curtime, bool frame) if (m_simulation && m_obstacle && !newvel.fuzzyZero()) { KX_RasterizerDrawDebugLine(mypos, mypos + newvel, MT_Vector3(1.,0.,0.)); - m_simulation->AdjustObstacleVelocity(m_obstacle, m_navmesh, newvel, - m_acceleration*delta, m_turnspeed/180.0f*M_PI*delta); + m_simulation->AdjustObstacleVelocity(m_obstacle, m_mode!=KX_STEERING_PATHFOLLOWING ? m_navmesh : NULL, + newvel, m_acceleration*delta, m_turnspeed/180.0f*M_PI*delta); KX_RasterizerDrawDebugLine(mypos, mypos + newvel, MT_Vector3(0.,1.,0.)); } From 543e64c601af9f2c7c49125f7f9590723750c09f Mon Sep 17 00:00:00 2001 From: Nick Samarin Date: Fri, 25 Jun 2010 13:03:57 +0000 Subject: [PATCH 016/182] - added new modifier to create navigation mesh (it's empty now) - added parameters for navmesh modifier --- .../blender/modifiers/modifiers.vcproj | 6 +- .../scripts/ui/properties_data_modifier.py | 61 ++++++ source/blender/makesdna/DNA_modifier_types.h | 21 ++ source/blender/makesrna/intern/rna_modifier.c | 82 ++++++++ source/blender/modifiers/MOD_modifiertypes.h | 1 + source/blender/modifiers/intern/MOD_navmesh.c | 198 ++++++++++++++++++ source/blender/modifiers/intern/MOD_util.c | 1 + 7 files changed, 369 insertions(+), 1 deletion(-) create mode 100644 source/blender/modifiers/intern/MOD_navmesh.c diff --git a/projectfiles_vc9/blender/modifiers/modifiers.vcproj b/projectfiles_vc9/blender/modifiers/modifiers.vcproj index 3b56775dcf7..f2c738a0c5d 100644 --- a/projectfiles_vc9/blender/modifiers/modifiers.vcproj +++ b/projectfiles_vc9/blender/modifiers/modifiers.vcproj @@ -1,7 +1,7 @@ + + diff --git a/release/scripts/ui/properties_data_modifier.py b/release/scripts/ui/properties_data_modifier.py index a6d6e098812..14254dccebc 100644 --- a/release/scripts/ui/properties_data_modifier.py +++ b/release/scripts/ui/properties_data_modifier.py @@ -460,6 +460,67 @@ class DATA_PT_modifiers(DataButtonsPanel): row.operator("object.multires_save_external", text="Save External...") row.label() + def NAVMESH(self, layout, ob, md, wide_ui): + layout.label(text="Rasterization:") + split = layout.split() + + col = split.column() + col.prop(md, "cellsize") + if wide_ui: + col = split.column() + col.prop(md, "cellheight") + + layout.separator() + + layout.label(text="Agent:") + split = layout.split() + col = split.column() + row = col.row() + row.prop(md, "agentheight") + row = col.row() + row.prop(md, "agentradius") + if wide_ui: + col = split.column() + row = col.row() + row.prop(md, "agentmaxslope") + row = col.row() + row.prop(md, "agentmaxclimb") + + layout.separator() + + layout.label(text="Region:") + split = layout.split() + col = split.column() + col.prop(md, "regionminsize") + if wide_ui: + col = split.column() + col.prop(md, "regionmergesize") + + layout.separator() + + layout.label(text="Polygonization:") + split = layout.split() + col = split.column() + row = col.row() + row.prop(md, "edgemaxlen") + row = col.row() + row.prop(md, "edgemaxerror") + if wide_ui: + col = split.column() + row = col.row() + row.prop(md, "vertsperpoly") + + layout.separator() + + layout.label(text="Detail Mesh:") + split = layout.split() + col = split.column() + col.prop(md, "detailsampledist") + if wide_ui: + col = split.column() + col.prop(md, "detailsamplemaxerror") + + def PARTICLE_INSTANCE(self, layout, ob, md, wide_ui): layout.prop(md, "object") layout.prop(md, "particle_system_number", text="Particle System") diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index 51f23ef210f..23d95c3f273 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -66,6 +66,7 @@ typedef enum ModifierType { eModifierType_ShapeKey, eModifierType_Solidify, eModifierType_Screw, + eModifierType_NavMesh, NUM_MODIFIER_TYPES } ModifierType; @@ -336,6 +337,7 @@ typedef struct DecimateModifierData { int faceCount; } DecimateModifierData; + /* Smooth modifier flags */ #define MOD_SMOOTH_X (1<<1) #define MOD_SMOOTH_Y (1<<2) @@ -722,4 +724,23 @@ typedef struct ScrewModifierData { // #define MOD_SCREW_OBJECT_ANGLE (1<<4) +typedef struct NavMeshModifierData { + ModifierData modifier; + char pad[4]; + float cellsize; + float cellheight; + float agentmaxslope; + float agentmaxclimb; + float agentheight; + float agentradius; + float edgemaxlen; + float edgemaxerror; + float regionminsize; + float regionmergesize; + int vertsperpoly; + float detailsampledist; + float detailsamplemaxerror; + +} NavMeshModifierData; + #endif diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index d2bf791fb67..b08432c4315 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -60,6 +60,7 @@ EnumPropertyItem modifier_type_items[] ={ {eModifierType_Solidify, "SOLIDIFY", ICON_MOD_SOLIDIFY, "Solidify", ""}, {eModifierType_Subsurf, "SUBSURF", ICON_MOD_SUBSURF, "Subdivision Surface", ""}, {eModifierType_UVProject, "UV_PROJECT", ICON_MOD_UVPROJECT, "UV Project", ""}, + {eModifierType_NavMesh, "NAVMESH", ICON_MOD_DECIM, "Navigation mesh", ""}, {0, "", 0, "Deform", ""}, {eModifierType_Armature, "ARMATURE", ICON_MOD_ARMATURE, "Armature", ""}, {eModifierType_Cast, "CAST", ICON_MOD_CAST, "Cast", ""}, @@ -168,6 +169,8 @@ static StructRNA* rna_Modifier_refine(struct PointerRNA *ptr) return &RNA_SolidifyModifier; case eModifierType_Screw: return &RNA_ScrewModifier; + case eModifierType_NavMesh: + return &RNA_NavMeshModifier; default: return &RNA_Modifier; } @@ -2190,6 +2193,84 @@ static void rna_def_modifier_screw(BlenderRNA *brna) RNA_def_property_update(prop, 0, "rna_Modifier_update");*/ } +static void rna_def_modifier_navmesh(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + srna= RNA_def_struct(brna, "NavMeshModifier", "Modifier"); + RNA_def_struct_ui_text(srna, "NavMesh Modifier", "NavMesh modifier"); + RNA_def_struct_sdna(srna, "NavMeshModifierData"); + RNA_def_struct_ui_icon(srna, ICON_MOD_DECIM); + + prop= RNA_def_property(srna, "cellsize", PROP_FLOAT, PROP_NONE); + RNA_def_property_ui_range(prop, 0.1, 1, 0.01, 2); + RNA_def_property_ui_text(prop, "Cell size", "Rasterized cell size"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "cellheight", PROP_FLOAT, PROP_NONE); + RNA_def_property_ui_range(prop, 0.1, 1, 0.01, 2); + RNA_def_property_ui_text(prop, "Cell height", "Rasterized cell height"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "agentheight", PROP_FLOAT, PROP_NONE); + RNA_def_property_ui_range(prop, 0.1, 5, 0.1, 2); + RNA_def_property_ui_text(prop, "Agent height", "Minimum height where the agent can still walk"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "agentradius", PROP_FLOAT, PROP_NONE); + RNA_def_property_ui_range(prop, 0.1, 5, 0.1, 2); + RNA_def_property_ui_text(prop, "Agent radius", "Radius of the agent"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "agentmaxclimb", PROP_FLOAT, PROP_NONE); + RNA_def_property_ui_range(prop, 0.1, 5, 0.1, 2); + RNA_def_property_ui_text(prop, "Max climb", "Maximum height between grid cells the agent can climb"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "agentmaxslope", PROP_FLOAT, PROP_ANGLE); + RNA_def_property_ui_range(prop, 0, 90, 1, 2); + RNA_def_property_ui_text(prop, "Max slope", "Maximum walkable slope angle in degrees"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + + prop= RNA_def_property(srna, "regionminsize", PROP_FLOAT, PROP_NONE); + RNA_def_property_ui_range(prop, 0, 150, 1, 2); + RNA_def_property_ui_text(prop, "Min region size", "Minimum regions size. Smaller regions will be deleted"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "regionmergesize", PROP_FLOAT, PROP_NONE); + RNA_def_property_ui_range(prop, 0, 150, 1, 2); + RNA_def_property_ui_text(prop, "Merged region size", "Minimum regions size. Smaller regions will be merged"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "edgemaxlen", PROP_FLOAT, PROP_NONE); + RNA_def_property_ui_range(prop, 0, 50, 1, 2); + RNA_def_property_ui_text(prop, "Max edge length", "Maximum contour edge length"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "edgemaxerror", PROP_FLOAT, PROP_NONE); + RNA_def_property_ui_range(prop, 0.1, 3.0, 0.1, 2); + RNA_def_property_ui_text(prop, "Max edge error", "Maximum distance error from contour to cells"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "vertsperpoly", PROP_INT, PROP_NONE); + RNA_def_property_ui_range(prop, 3, 12, 1, 0); + RNA_def_property_ui_text(prop, "Verts per poly", "Max number of vertices per polygon"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "detailsampledist", PROP_FLOAT, PROP_NONE); + RNA_def_property_ui_range(prop, 0.0, 16.0, 1, 2); + RNA_def_property_ui_text(prop, "Sample Distance", "Detail mesh sample spacing"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "detailsamplemaxerror", PROP_FLOAT, PROP_NONE); + RNA_def_property_ui_range(prop, 0.0, 16.0, 1, 2); + RNA_def_property_ui_text(prop, "Max Sample Error", "Detail mesh simplification max sample error"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + +} + void RNA_def_modifier(BlenderRNA *brna) { StructRNA *srna; @@ -2280,6 +2361,7 @@ void RNA_def_modifier(BlenderRNA *brna) rna_def_modifier_smoke(brna); rna_def_modifier_solidify(brna); rna_def_modifier_screw(brna); + rna_def_modifier_navmesh(brna); } #endif diff --git a/source/blender/modifiers/MOD_modifiertypes.h b/source/blender/modifiers/MOD_modifiertypes.h index bd10b4aa6fc..a55b5934f7d 100644 --- a/source/blender/modifiers/MOD_modifiertypes.h +++ b/source/blender/modifiers/MOD_modifiertypes.h @@ -67,6 +67,7 @@ extern ModifierTypeInfo modifierType_Smoke; extern ModifierTypeInfo modifierType_ShapeKey; extern ModifierTypeInfo modifierType_Solidify; extern ModifierTypeInfo modifierType_Screw; +extern ModifierTypeInfo modifierType_NavMesh; /* MOD_util.c */ void modifier_type_init(ModifierTypeInfo *types[], ModifierType type); diff --git a/source/blender/modifiers/intern/MOD_navmesh.c b/source/blender/modifiers/intern/MOD_navmesh.c new file mode 100644 index 00000000000..72fd1c40133 --- /dev/null +++ b/source/blender/modifiers/intern/MOD_navmesh.c @@ -0,0 +1,198 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2005 by the Blender Foundation. +* All rights reserved. +* +* Contributor(s): +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +#include "DNA_meshdata_types.h" +#include "BLI_math.h" +#include "BKE_cdderivedmesh.h" +#include "BKE_mesh.h" +#include "BKE_modifier.h" +#include "BKE_particle.h" + + +static void initData(ModifierData *md) +{ + NavMeshModifierData *nmmd = (NavMeshModifierData*) md; + + nmmd->cellsize = 0.3f; + nmmd->cellheight = 0.2f; + nmmd->agentmaxslope = 45.0f; + nmmd->agentmaxclimb = 0.9f; + nmmd->agentheight = 2.0f; + nmmd->agentradius = 0.6f; + nmmd->edgemaxlen = 12.0f; + nmmd->edgemaxerror = 1.3f; + nmmd->regionminsize = 50.f; + nmmd->regionmergesize = 20.f; + nmmd->vertsperpoly = 6; + nmmd->detailsampledist = 6.0f; + nmmd->detailsamplemaxerror = 1.0f; +} + +static void copyData(ModifierData *md, ModifierData *target) +{ + NavMeshModifierData *nmmd = (NavMeshModifierData*) md; + NavMeshModifierData *tnmmd = (NavMeshModifierData*) target; + +} + +static DerivedMesh *createNavMesh(NavMeshModifierData *mmd,DerivedMesh *dm) +{ + int i; + DerivedMesh *result; + int numVerts, numEdges, numFaces; + int maxVerts = dm->getNumVerts(dm); + int maxEdges = dm->getNumEdges(dm); + int maxFaces = dm->getNumFaces(dm); + + numVerts = numEdges = numFaces = 0; + + result = CDDM_from_template(dm, maxVerts * 2, maxEdges * 2, maxFaces * 2); + + for(i = 0; i < maxVerts; i++) { + MVert inMV; + MVert *mv = CDDM_get_vert(result, numVerts); + float co[3]; + + dm->getVert(dm, i, &inMV); + + copy_v3_v3(co, inMV.co); + DM_copy_vert_data(dm, result, i, numVerts, 1); + *mv = inMV; + numVerts++; + + + { + MVert *mv2 = CDDM_get_vert(result, numVerts); + DM_copy_vert_data(dm, result, i, numVerts, 1); + *mv2 = *mv; + co[2] +=.5f; + copy_v3_v3(mv2->co, co); + numVerts++; + } + + } + + for(i = 0; i < maxEdges; i++) { + MEdge inMED; + MEdge *med = CDDM_get_edge(result, numEdges); + + dm->getEdge(dm, i, &inMED); + + DM_copy_edge_data(dm, result, i, numEdges, 1); + *med = inMED; + numEdges++; + + med->v1 = inMED.v1*2; + med->v2 = inMED.v2*2; + //med->flag |= ME_EDGEDRAW | ME_EDGERENDER; + + { + MEdge *med2 = CDDM_get_edge(result, numEdges); + + DM_copy_edge_data(dm, result, i, numEdges, 1); + *med2 = *med; + numEdges++; + + med2->v1 += 1; + med2->v2 += 1; + } + } + + for(i = 0; i < maxFaces; i++) { + MFace inMF; + MFace *mf = CDDM_get_face(result, numFaces); + + dm->getFace(dm, i, &inMF); + + DM_copy_face_data(dm, result, i, numFaces, 1); + *mf = inMF; + numFaces++; + + mf->v1 = inMF.v1*2; + mf->v2 = inMF.v2*2; + mf->v3 = inMF.v3*2; + mf->v4 = inMF.v4*2; + + { + MFace *mf2 = CDDM_get_face(result, numFaces); + DM_copy_face_data(dm, result, i, numFaces, 1); + *mf2 = *mf; + + mf2->v1 += 1; + mf2->v2 += 1; + mf2->v3 += 1; + if(inMF.v4) mf2->v4 += 1; + + //test_index_face(mf2, &result->faceData, numFaces, inMF.v4?4:3); + numFaces++; + } + } + +/* + CDDM_lower_num_verts(result, numVerts); + CDDM_lower_num_edges(result, numEdges); + CDDM_lower_num_faces(result, numFaces);*/ + + return result; +} + + +static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *derivedData, + int useRenderParams, int isFinalCalc) +{ + DerivedMesh *result; + + NavMeshModifierData *nmmd = (NavMeshModifierData*) md; + + result = createNavMesh(nmmd, derivedData); + + return result; +} + + +ModifierTypeInfo modifierType_NavMesh = { + /* name */ "NavMesh", + /* structName */ "NavMeshModifierData", + /* structSize */ sizeof(NavMeshModifierData), + /* type */ eModifierTypeType_Constructive, + /* flags */ eModifierTypeFlag_AcceptsMesh, + /* copyData */ copyData, + /* deformVerts */ 0, + /* deformVertsEM */ 0, + /* deformMatricesEM */ 0, + /* applyModifier */ applyModifier, + /* applyModifierEM */ 0, + /* initData */ initData, + /* requiredDataMask */ 0, + /* freeData */ 0, + /* isDisabled */ 0, + /* updateDepgraph */ 0, + /* dependsOnTime */ 0, + /* foreachObjectLink */ 0, + /* foreachIDLink */ 0, +}; diff --git a/source/blender/modifiers/intern/MOD_util.c b/source/blender/modifiers/intern/MOD_util.c index 24b907dcfa8..0e9fe81ffdc 100644 --- a/source/blender/modifiers/intern/MOD_util.c +++ b/source/blender/modifiers/intern/MOD_util.c @@ -182,5 +182,6 @@ void modifier_type_init(ModifierTypeInfo *types[], ModifierType type) INIT_TYPE(ShapeKey); INIT_TYPE(Solidify); INIT_TYPE(Screw); + INIT_TYPE(NavMesh); #undef INIT_TYPE } From 4fb80f36e2a89ab9ea144cf56761d7a74b3c1638 Mon Sep 17 00:00:00 2001 From: Nick Samarin Date: Fri, 25 Jun 2010 21:08:23 +0000 Subject: [PATCH 017/182] added actual creation of navigation mesh for navmesh modifier --- .../blender/modifiers/modifiers.vcproj | 4 +- source/blender/modifiers/intern/MOD_navmesh.c | 198 --------- .../blender/modifiers/intern/MOD_navmesh.cpp | 392 ++++++++++++++++++ source/gameengine/Ketsji/KX_NavMeshObject.cpp | 2 - 4 files changed, 394 insertions(+), 202 deletions(-) delete mode 100644 source/blender/modifiers/intern/MOD_navmesh.c create mode 100644 source/blender/modifiers/intern/MOD_navmesh.cpp diff --git a/projectfiles_vc9/blender/modifiers/modifiers.vcproj b/projectfiles_vc9/blender/modifiers/modifiers.vcproj index f2c738a0c5d..8e93c61b481 100644 --- a/projectfiles_vc9/blender/modifiers/modifiers.vcproj +++ b/projectfiles_vc9/blender/modifiers/modifiers.vcproj @@ -182,7 +182,7 @@ cellsize = 0.3f; - nmmd->cellheight = 0.2f; - nmmd->agentmaxslope = 45.0f; - nmmd->agentmaxclimb = 0.9f; - nmmd->agentheight = 2.0f; - nmmd->agentradius = 0.6f; - nmmd->edgemaxlen = 12.0f; - nmmd->edgemaxerror = 1.3f; - nmmd->regionminsize = 50.f; - nmmd->regionmergesize = 20.f; - nmmd->vertsperpoly = 6; - nmmd->detailsampledist = 6.0f; - nmmd->detailsamplemaxerror = 1.0f; -} - -static void copyData(ModifierData *md, ModifierData *target) -{ - NavMeshModifierData *nmmd = (NavMeshModifierData*) md; - NavMeshModifierData *tnmmd = (NavMeshModifierData*) target; - -} - -static DerivedMesh *createNavMesh(NavMeshModifierData *mmd,DerivedMesh *dm) -{ - int i; - DerivedMesh *result; - int numVerts, numEdges, numFaces; - int maxVerts = dm->getNumVerts(dm); - int maxEdges = dm->getNumEdges(dm); - int maxFaces = dm->getNumFaces(dm); - - numVerts = numEdges = numFaces = 0; - - result = CDDM_from_template(dm, maxVerts * 2, maxEdges * 2, maxFaces * 2); - - for(i = 0; i < maxVerts; i++) { - MVert inMV; - MVert *mv = CDDM_get_vert(result, numVerts); - float co[3]; - - dm->getVert(dm, i, &inMV); - - copy_v3_v3(co, inMV.co); - DM_copy_vert_data(dm, result, i, numVerts, 1); - *mv = inMV; - numVerts++; - - - { - MVert *mv2 = CDDM_get_vert(result, numVerts); - DM_copy_vert_data(dm, result, i, numVerts, 1); - *mv2 = *mv; - co[2] +=.5f; - copy_v3_v3(mv2->co, co); - numVerts++; - } - - } - - for(i = 0; i < maxEdges; i++) { - MEdge inMED; - MEdge *med = CDDM_get_edge(result, numEdges); - - dm->getEdge(dm, i, &inMED); - - DM_copy_edge_data(dm, result, i, numEdges, 1); - *med = inMED; - numEdges++; - - med->v1 = inMED.v1*2; - med->v2 = inMED.v2*2; - //med->flag |= ME_EDGEDRAW | ME_EDGERENDER; - - { - MEdge *med2 = CDDM_get_edge(result, numEdges); - - DM_copy_edge_data(dm, result, i, numEdges, 1); - *med2 = *med; - numEdges++; - - med2->v1 += 1; - med2->v2 += 1; - } - } - - for(i = 0; i < maxFaces; i++) { - MFace inMF; - MFace *mf = CDDM_get_face(result, numFaces); - - dm->getFace(dm, i, &inMF); - - DM_copy_face_data(dm, result, i, numFaces, 1); - *mf = inMF; - numFaces++; - - mf->v1 = inMF.v1*2; - mf->v2 = inMF.v2*2; - mf->v3 = inMF.v3*2; - mf->v4 = inMF.v4*2; - - { - MFace *mf2 = CDDM_get_face(result, numFaces); - DM_copy_face_data(dm, result, i, numFaces, 1); - *mf2 = *mf; - - mf2->v1 += 1; - mf2->v2 += 1; - mf2->v3 += 1; - if(inMF.v4) mf2->v4 += 1; - - //test_index_face(mf2, &result->faceData, numFaces, inMF.v4?4:3); - numFaces++; - } - } - -/* - CDDM_lower_num_verts(result, numVerts); - CDDM_lower_num_edges(result, numEdges); - CDDM_lower_num_faces(result, numFaces);*/ - - return result; -} - - -static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *derivedData, - int useRenderParams, int isFinalCalc) -{ - DerivedMesh *result; - - NavMeshModifierData *nmmd = (NavMeshModifierData*) md; - - result = createNavMesh(nmmd, derivedData); - - return result; -} - - -ModifierTypeInfo modifierType_NavMesh = { - /* name */ "NavMesh", - /* structName */ "NavMeshModifierData", - /* structSize */ sizeof(NavMeshModifierData), - /* type */ eModifierTypeType_Constructive, - /* flags */ eModifierTypeFlag_AcceptsMesh, - /* copyData */ copyData, - /* deformVerts */ 0, - /* deformVertsEM */ 0, - /* deformMatricesEM */ 0, - /* applyModifier */ applyModifier, - /* applyModifierEM */ 0, - /* initData */ initData, - /* requiredDataMask */ 0, - /* freeData */ 0, - /* isDisabled */ 0, - /* updateDepgraph */ 0, - /* dependsOnTime */ 0, - /* foreachObjectLink */ 0, - /* foreachIDLink */ 0, -}; diff --git a/source/blender/modifiers/intern/MOD_navmesh.cpp b/source/blender/modifiers/intern/MOD_navmesh.cpp new file mode 100644 index 00000000000..c876987e590 --- /dev/null +++ b/source/blender/modifiers/intern/MOD_navmesh.cpp @@ -0,0 +1,392 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2005 by the Blender Foundation. +* All rights reserved. +* +* Contributor(s): +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ +#include +#include "Recast.h" + +extern "C"{ + +#include "DNA_meshdata_types.h" +#include "BLI_math.h" +#include "BKE_cdderivedmesh.h" +#include "BKE_mesh.h" +#include "BKE_modifier.h" +#include "BKE_particle.h" +#include "MEM_guardedalloc.h" + + + +static void initData(ModifierData *md) +{ + NavMeshModifierData *nmmd = (NavMeshModifierData*) md; + + nmmd->cellsize = 0.3f; + nmmd->cellheight = 0.2f; + nmmd->agentmaxslope = 45.0f; + nmmd->agentmaxclimb = 0.9f; + nmmd->agentheight = 2.0f; + nmmd->agentradius = 0.6f; + nmmd->edgemaxlen = 12.0f; + nmmd->edgemaxerror = 1.3f; + nmmd->regionminsize = 50.f; + nmmd->regionmergesize = 20.f; + nmmd->vertsperpoly = 6; + nmmd->detailsampledist = 6.0f; + nmmd->detailsamplemaxerror = 1.0f; +} + +static void copyData(ModifierData *md, ModifierData *target) +{ + NavMeshModifierData *nmmd = (NavMeshModifierData*) md; + NavMeshModifierData *tnmmd = (NavMeshModifierData*) target; + + //.todo - deep copy +} + +static DerivedMesh *buildNavMesh(NavMeshModifierData *mmd,DerivedMesh *dm) +{ + const int nverts = dm->getNumVerts(dm); + MVert *mvert = dm->getVertArray(dm); + const int nfaces = dm->getNumFaces(dm); + MFace *mface = dm->getFaceArray(dm); + float* verts; + int *tris, *tri; + float bmin[3], bmax[3]; + int i,j; + DerivedMesh* result = NULL; + rcHeightfield* solid; + unsigned char *triflags; + rcCompactHeightfield* chf; + rcContourSet *cset; + rcPolyMesh* pmesh; + rcPolyMeshDetail* dmesh; + int numVerts, numEdges, numFaces; + + //calculate count of tris + int ntris = nfaces; + for (i=0; iv4) + ntris+=1; + } + + //create verts + verts = (float*) MEM_mallocN(sizeof(float)*3*nverts, "verts"); + for (i=0; ico[0]; + verts[3*i+1] = v->co[2]; + verts[3*i+2] = v->co[1]; + } + //create tris + tris = (int*) MEM_mallocN(sizeof(int)*3*ntris, "faces"); + tri = tris; + for (i=0; iv1; tri[1]= mf->v3; tri[2]= mf->v2; + tri += 3; + if (mf->v4) + { + tri[0]= mf->v1; tri[1]= mf->v4; tri[2]= mf->v3; + tri += 3; + } + } + + rcCalcBounds(verts, nverts, bmin, bmax); + + // + // Step 1. Initialize build config. + // + rcConfig cfg; + memset(&cfg, 0, sizeof(cfg)); + cfg.cs = mmd->cellsize; + cfg.ch = mmd->cellheight; + cfg.walkableSlopeAngle = mmd->agentmaxslope; + cfg.walkableHeight = (int)ceilf(mmd->agentheight/ cfg.ch); + cfg.walkableClimb = (int)floorf(mmd->agentmaxclimb / cfg.ch); + cfg.walkableRadius = (int)ceilf(mmd->agentradius / cfg.cs); + cfg.maxEdgeLen = (int)(mmd->edgemaxlen/ mmd->cellsize); + cfg.maxSimplificationError = mmd->edgemaxerror; + cfg.minRegionSize = (int)rcSqr(mmd->regionminsize); + cfg.mergeRegionSize = (int)rcSqr(mmd->regionmergesize); + cfg.maxVertsPerPoly = mmd->vertsperpoly; + cfg.detailSampleDist = mmd->detailsampledist< 0.9f ? 0 : mmd->cellsize * mmd->detailsampledist; + cfg.detailSampleMaxError = mmd->cellheight * mmd->detailsamplemaxerror; + + // Set the area where the navigation will be build. + vcopy(cfg.bmin, bmin); + vcopy(cfg.bmax, bmax); + rcCalcGridSize(cfg.bmin, cfg.bmax, cfg.cs, &cfg.width, &cfg.height); + + // + // Step 2. Rasterize input polygon soup. + // + // Allocate voxel heightfield where we rasterize our input data to. + solid = new rcHeightfield; + if (!solid) + return NULL; + + if (!rcCreateHeightfield(*solid, cfg.width, cfg.height, cfg.bmin, cfg.bmax, cfg.cs, cfg.ch)) + return NULL; + + // Allocate array that can hold triangle flags. + triflags = (unsigned char*) MEM_mallocN(sizeof(unsigned char)*ntris, "triflags"); + if (!triflags) + return NULL; + // Find triangles which are walkable based on their slope and rasterize them. + memset(triflags, 0, ntris*sizeof(unsigned char)); + rcMarkWalkableTriangles(cfg.walkableSlopeAngle, verts, nverts, tris, ntris, triflags); + rcRasterizeTriangles(verts, nverts, tris, triflags, ntris, *solid); + MEM_freeN(triflags); + MEM_freeN(verts); + MEM_freeN(tris); + + // + // Step 3. Filter walkables surfaces. + // + rcFilterLedgeSpans(cfg.walkableHeight, cfg.walkableClimb, *solid); + rcFilterWalkableLowHeightSpans(cfg.walkableHeight, *solid); + + // + // Step 4. Partition walkable surface to simple regions. + // + + chf = new rcCompactHeightfield; + if (!chf) + return NULL; + if (!rcBuildCompactHeightfield(cfg.walkableHeight, cfg.walkableClimb, RC_WALKABLE, *solid, *chf)) + return NULL; + + delete solid; + + // Prepare for region partitioning, by calculating distance field along the walkable surface. + if (!rcBuildDistanceField(*chf)) + return NULL; + + // Partition the walkable surface into simple regions without holes. + if (!rcBuildRegions(*chf, cfg.walkableRadius, cfg.borderSize, cfg.minRegionSize, cfg.mergeRegionSize)) + return NULL; + + // + // Step 5. Trace and simplify region contours. + // + // Create contours. + cset = new rcContourSet; + if (!cset) + return NULL; + + if (!rcBuildContours(*chf, cfg.maxSimplificationError, cfg.maxEdgeLen, *cset)) + return NULL; + + // + // Step 6. Build polygons mesh from contours. + // + pmesh = new rcPolyMesh; + if (!pmesh) + return NULL; + if (!rcBuildPolyMesh(*cset, cfg.maxVertsPerPoly, *pmesh)) + return NULL; + + + // + // Step 7. Create detail mesh which allows to access approximate height on each polygon. + // + + dmesh = new rcPolyMeshDetail; + if (!dmesh) + return NULL; + + if (!rcBuildPolyMeshDetail(*pmesh, *chf, cfg.detailSampleDist, cfg.detailSampleMaxError, *dmesh)) + return NULL; + + delete chf; + delete cset; + + + // + // Create blender mesh from detail poly mesh + // + + numVerts = dmesh->nverts; + numFaces = dmesh->ntris; + numEdges = dmesh->ntris*3; + + result = CDDM_new(numVerts, numEdges, numFaces); + //copy verts + for(i = 0; i < numVerts; i++) { + MVert *mv = CDDM_get_vert(result, i); + copy_v3_v3(mv->co, &dmesh->verts[3*i]); + SWAP(float, mv->co[1], mv->co[2]); + } + + //create faces and edges + numFaces = numEdges = 0; + for (i=0; inmeshes; i++) + { + unsigned short vbase = dmesh->meshes[4*i+0]; + unsigned short vnum = dmesh->meshes[4*i+1]; + unsigned short tribase = dmesh->meshes[4*i+2]; + unsigned short trinum = dmesh->meshes[4*i+3]; + + for (j=0; jtris[4*(tribase+j)]; + MFace *mf = CDDM_get_face(result, numFaces); + MEdge *med; + mf->v1 = vbase + tri[0]; + mf->v2 = vbase + tri[1]; + mf->v3 = vbase + tri[2]; + numFaces++; + + { + int e1=0, e2=2; + for (;e1<3; e2=e1++) + { + med = CDDM_get_edge(result, numEdges); + med->v1 = vbase + tri[e2]; + med->v2 = vbase + tri[e1]; + numEdges++; + } + } + } + } + + + delete pmesh; + delete dmesh; + + return result; +} + +static DerivedMesh *testCreateNavMesh(NavMeshModifierData *mmd,DerivedMesh *dm) +{ + int i; + DerivedMesh *result; + int numVerts, numEdges, numFaces; + int maxVerts = dm->getNumVerts(dm); + int maxEdges = dm->getNumEdges(dm); + int maxFaces = dm->getNumFaces(dm); + +/* MVert *mv; + MEdge *med; + MFace *mf; + numVerts = numEdges = numFaces = 0; + + result = CDDM_new(3, 3, 1); + mv = CDDM_get_vert(result, 0); + mv->co[0] = -10; mv->co[1] = -10; mv->co[2] = 0; + mv = CDDM_get_vert(result, 1); + mv->co[0] = -10; mv->co[1] = 10; mv->co[2] = 0; + mv = CDDM_get_vert(result, 2); + mv->co[0] = 10; mv->co[1] = -10; mv->co[2] = 0; + + med = CDDM_get_edge(result, 0); + med->v1 = 0; med->v1 = 1; + med = CDDM_get_edge(result, 1); + med->v1 = 1; med->v1 = 2; + med = CDDM_get_edge(result, 2); + med->v1 = 2; med->v1 = 0; + + mf = CDDM_get_face(result, 0); + mf->v1 = 0; mf->v2 = 1; mf->v3 = 2; +*/ + + result = CDDM_new(maxVerts, maxEdges, maxFaces); + numVerts = numEdges = numFaces = 0; + for(i = 0; i < maxVerts; i++) { + MVert inMV; + MVert *mv = CDDM_get_vert(result, numVerts); + float co[3]; + dm->getVert(dm, i, &inMV); + copy_v3_v3(co, inMV.co); + SWAP(float, co[1], co[2]); + *mv = inMV; + mv->co[2] +=.5f; + numVerts++; + } + + for(i = 0; i < maxEdges; i++) { + MEdge inMED; + MEdge *med = CDDM_get_edge(result, numEdges); + dm->getEdge(dm, i, &inMED); + *med = inMED; + numEdges++; + } + + for(i = 0; i < maxFaces; i++) { + MFace inMF; + MFace *mf = CDDM_get_face(result, numFaces); + dm->getFace(dm, i, &inMF); + *mf = inMF; + numFaces++; + } + + return result; +} + + +static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *derivedData, + int useRenderParams, int isFinalCalc) +{ + DerivedMesh *result; + + NavMeshModifierData *nmmd = (NavMeshModifierData*) md; + + //for test + //result = testCreateNavMesh(nmmd, derivedData); + result = buildNavMesh(nmmd, derivedData); + + return result; +} + + +ModifierTypeInfo modifierType_NavMesh = { + /* name */ "NavMesh", + /* structName */ "NavMeshModifierData", + /* structSize */ sizeof(NavMeshModifierData), + /* type */ eModifierTypeType_Constructive, + /* flags */ eModifierTypeFlag_AcceptsMesh, + /* copyData */ copyData, + /* deformVerts */ 0, + /* deformVertsEM */ 0, + /* deformMatricesEM */ 0, + /* applyModifier */ applyModifier, + /* applyModifierEM */ 0, + /* initData */ initData, + /* requiredDataMask */ 0, + /* freeData */ 0, + /* isDisabled */ 0, + /* updateDepgraph */ 0, + /* dependsOnTime */ 0, + /* foreachObjectLink */ 0, + /* foreachIDLink */ 0, +}; + +}; \ No newline at end of file diff --git a/source/gameengine/Ketsji/KX_NavMeshObject.cpp b/source/gameengine/Ketsji/KX_NavMeshObject.cpp index 2c423558768..f4fea3f29f6 100644 --- a/source/gameengine/Ketsji/KX_NavMeshObject.cpp +++ b/source/gameengine/Ketsji/KX_NavMeshObject.cpp @@ -115,8 +115,6 @@ bool KX_NavMeshObject::BuildVertIndArrays(RAS_MeshObject* meshobj, float *&verti MFace *mface = dm->getFaceArray(dm); int numpolys = dm->getNumFaces(dm); int numverts = dm->getNumVerts(dm); - int* index = (int*)dm->getFaceDataArray(dm, CD_ORIGINDEX); - MTFace *tface = (MTFace *)dm->getFaceDataArray(dm, CD_MTFACE); nverts = numverts; if (nverts >= 0xffff) From 36e27b07658440117f7bb3dbfee3d5812b6e0e83 Mon Sep 17 00:00:00 2001 From: Nick Samarin Date: Fri, 9 Jul 2010 22:16:52 +0000 Subject: [PATCH 018/182] Added operator for generating navigation mesh for selected blender objects --- .../blender/editors/ED_editors.vcproj | 8 +- .../blender/modifiers/modifiers.vcproj | 2 +- release/scripts/ui/properties_scene.py | 73 +++ source/blender/blenkernel/BKE_context.h | 5 +- source/blender/blenkernel/intern/scene.c | 14 + source/blender/blenloader/intern/readfile.c | 36 ++ source/blender/editors/include/ED_object.h | 2 +- source/blender/editors/object/object_intern.h | 3 + .../blender/editors/object/object_navmesh.cpp | 424 ++++++++++++++++++ source/blender/editors/object/object_ops.c | 2 + source/blender/makesdna/DNA_scene_types.h | 20 +- source/blender/makesrna/intern/rna_scene.c | 88 ++++ .../blender/modifiers/intern/MOD_navmesh.cpp | 79 +++- 13 files changed, 743 insertions(+), 13 deletions(-) create mode 100644 source/blender/editors/object/object_navmesh.cpp diff --git a/projectfiles_vc9/blender/editors/ED_editors.vcproj b/projectfiles_vc9/blender/editors/ED_editors.vcproj index 819d0ca1042..be74ade6768 100644 --- a/projectfiles_vc9/blender/editors/ED_editors.vcproj +++ b/projectfiles_vc9/blender/editors/ED_editors.vcproj @@ -1,7 +1,7 @@ + + diff --git a/projectfiles_vc9/blender/modifiers/modifiers.vcproj b/projectfiles_vc9/blender/modifiers/modifiers.vcproj index 8e93c61b481..a61f0f3fc72 100644 --- a/projectfiles_vc9/blender/modifiers/modifiers.vcproj +++ b/projectfiles_vc9/blender/modifiers/modifiers.vcproj @@ -182,7 +182,7 @@ narrowui + + layout.operator("object.create_navmesh", text='Build navigation mesh') + + layout.label(text="Rasterization:") + split = layout.split() + + col = split.column() + col.prop(rd, "cellsize") + if wide_ui: + col = split.column() + col.prop(rd, "cellheight") + + layout.separator() + + layout.label(text="Agent:") + split = layout.split() + col = split.column() + row = col.row() + row.prop(rd, "agentheight") + row = col.row() + row.prop(rd, "agentradius") + if wide_ui: + col = split.column() + row = col.row() + row.prop(rd, "agentmaxslope") + row = col.row() + row.prop(rd, "agentmaxclimb") + + layout.separator() + + layout.label(text="Region:") + split = layout.split() + col = split.column() + col.prop(rd, "regionminsize") + if wide_ui: + col = split.column() + col.prop(rd, "regionmergesize") + + layout.separator() + + layout.label(text="Polygonization:") + split = layout.split() + col = split.column() + row = col.row() + row.prop(rd, "edgemaxlen") + row = col.row() + row.prop(rd, "edgemaxerror") + if wide_ui: + col = split.column() + row = col.row() + row.prop(rd, "vertsperpoly") + + layout.separator() + + layout.label(text="Detail Mesh:") + split = layout.split() + col = split.column() + col.prop(rd, "detailsampledist") + if wide_ui: + col = split.column() + col.prop(rd, "detailsamplemaxerror") + classes = [ SCENE_PT_scene, @@ -343,6 +415,7 @@ classes = [ SCENE_PT_keying_set_paths, SCENE_PT_physics, SCENE_PT_simplify, + SCENE_PT_navmesh, SCENE_PT_custom_props, diff --git a/source/blender/blenkernel/BKE_context.h b/source/blender/blenkernel/BKE_context.h index f6d41190c5a..c00ce3525d4 100644 --- a/source/blender/blenkernel/BKE_context.h +++ b/source/blender/blenkernel/BKE_context.h @@ -204,8 +204,9 @@ void CTX_data_list_add(bContextDataResult *result, void *data);*/ ListBase ctx_data_list; \ CollectionPointerLink *ctx_link; \ CTX_data_##member(C, &ctx_data_list); \ - for(ctx_link=ctx_data_list.first; ctx_link; ctx_link=ctx_link->next) { \ - Type instance= ctx_link->ptr.data; + for(ctx_link= (CollectionPointerLink*)ctx_data_list.first; ctx_link; \ + ctx_link=(CollectionPointerLink*)ctx_link->next) { \ + Type instance= (Type) ctx_link->ptr.data; #define CTX_DATA_END \ } \ diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index 1fd30930933..f4e6af9cf58 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -475,6 +475,20 @@ Scene *add_scene(char *name) sce->gm.obstacleSimulation= OBSTSIMULATION_NONE; sce->gm.levelHeight = 2.f; + sce->gm.recastData.cellsize = 0.3f; + sce->gm.recastData.cellheight = 0.2f; + sce->gm.recastData.agentmaxslope = M_PI/2; + sce->gm.recastData.agentmaxclimb = 0.9f; + sce->gm.recastData.agentheight = 2.0f; + sce->gm.recastData.agentradius = 0.6f; + sce->gm.recastData.edgemaxlen = 12.0f; + sce->gm.recastData.edgemaxerror = 1.3f; + sce->gm.recastData.regionminsize = 50.f; + sce->gm.recastData.regionmergesize = 20.f; + sce->gm.recastData.vertsperpoly = 6; + sce->gm.recastData.detailsampledist = 6.0f; + sce->gm.recastData.detailsamplemaxerror = 1.0f; + sound_create_scene(sce); return sce; diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 4423758ba7f..34baa0d4eb0 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -10912,6 +10912,42 @@ static void do_versions(FileData *fd, Library *lib, Main *main) } } } + + //set defaults for recast data + { + Scene *sce; + for(sce = main->scene.first; sce; sce = sce->id.next) + { + if(sce->unit.scale_length == 0.0f) + sce->unit.scale_length= 1.0f; + if(sce->gm.recastData.cellsize == 0.0f) + sce->gm.recastData.cellsize = 0.3f; + if(sce->gm.recastData.cellheight == 0.0f) + sce->gm.recastData.cellheight = 0.2f; + if(sce->gm.recastData.agentmaxslope == 0.0f) + sce->gm.recastData.agentmaxslope = M_PI/4; + if(sce->gm.recastData.agentmaxclimb == 0.0f) + sce->gm.recastData.agentmaxclimb = 0.9f; + if(sce->gm.recastData.agentheight == 0.0f) + sce->gm.recastData.agentheight = 2.0f; + if(sce->gm.recastData.agentradius == 0.0f) + sce->gm.recastData.agentradius = 0.6f; + if(sce->gm.recastData.edgemaxlen == 0.0f) + sce->gm.recastData.edgemaxlen = 12.0f; + if(sce->gm.recastData.edgemaxerror == 0.0f) + sce->gm.recastData.edgemaxerror = 1.3f; + if(sce->gm.recastData.regionminsize == 0.0f) + sce->gm.recastData.regionminsize = 50.f; + if(sce->gm.recastData.regionmergesize == 0.0f) + sce->gm.recastData.regionmergesize = 20.f; + if(sce->gm.recastData.vertsperpoly<3) + sce->gm.recastData.vertsperpoly = 6; + if(sce->gm.recastData.detailsampledist == 0.0f) + sce->gm.recastData.detailsampledist = 6.0f; + if(sce->gm.recastData.detailsamplemaxerror == 0.0f) + sce->gm.recastData.detailsamplemaxerror = 1.0f; + } + } } /* WATCH IT!!!: pointers from libdata have not been converted yet here! */ diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h index 4e0973fe77a..c71f8d6ff59 100644 --- a/source/blender/editors/include/ED_object.h +++ b/source/blender/editors/include/ED_object.h @@ -124,7 +124,7 @@ void ED_setflagsLatt(struct Object *obedit, int flag); enum { MODIFIER_APPLY_DATA=1, MODIFIER_APPLY_SHAPE, -} eModifier_Apply_Mode; +};//eModifier_Apply_Mode struct ModifierData *ED_object_modifier_add(struct ReportList *reports, struct Scene *scene, struct Object *ob, char *name, int type); int ED_object_modifier_remove(struct ReportList *reports, struct Scene *scene, struct Object *ob, struct ModifierData *md); diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h index 5b446b3a828..2a3bffd17d3 100644 --- a/source/blender/editors/object/object_intern.h +++ b/source/blender/editors/object/object_intern.h @@ -222,5 +222,8 @@ void OBJECT_OT_group_remove(struct wmOperatorType *ot); /* object_bake.c */ void OBJECT_OT_bake_image(wmOperatorType *ot); +/* object_navmesh.cpp */ +void OBJECT_OT_create_navmesh(struct wmOperatorType *ot); + #endif /* ED_OBJECT_INTERN_H */ diff --git a/source/blender/editors/object/object_navmesh.cpp b/source/blender/editors/object/object_navmesh.cpp new file mode 100644 index 00000000000..1e28164e30f --- /dev/null +++ b/source/blender/editors/object/object_navmesh.cpp @@ -0,0 +1,424 @@ +/** +* $Id:$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2004 by Blender Foundation +* All rights reserved. +* +* The Original Code is: all of this file. +* +* Contributor(s): none yet. +* +* ***** END GPL LICENSE BLOCK ***** +*/ +#include +#include "Recast.h" + +extern "C" +{ +#include "MEM_guardedalloc.h" + +#include "DNA_scene_types.h" +#include "DNA_object_types.h" +#include "DNA_meshdata_types.h" +#include "DNA_ID.h" + +#include "BKE_depsgraph.h" +#include "BKE_context.h" +#include "BKE_mesh.h" +#include "BKE_DerivedMesh.h" +#include "BKE_cdderivedmesh.h" +#include "BLI_editVert.h" +#include "BLI_listbase.h" +#include "ED_object.h" +#include "BLI_math_vector.h" + +#include "ED_mesh.h" + +/*mesh/mesh_intern.h */ +extern struct EditVert *addvertlist(EditMesh *em, float *vec, struct EditVert *example); +extern struct EditFace *addfacelist(EditMesh *em, struct EditVert *v1, struct EditVert *v2, struct EditVert *v3, struct EditVert *v4, struct EditFace *example, struct EditFace *exampleEdges); + +#include "WM_api.h" +#include "WM_types.h" + +static void createVertsTrisData(bContext *C, LinkNode* obs, int& nverts, float*& verts, int &ntris, int*& tris) +{ + MVert *mvert; + int nfaces = 0, *tri, i, curnverts, basenverts, curnfaces; + MFace *mface; + float co[3], wco[3]; + Object *ob; + LinkNode *oblink, *dmlink; + DerivedMesh *dm; + Scene* scene = CTX_data_scene(C); + LinkNode* dms = NULL; + + nverts = 0; + ntris = 0; + //calculate number of verts and tris + for (oblink = obs; oblink; oblink = oblink->next) + { + ob = (Object*) oblink->link; + DerivedMesh *dm = mesh_create_derived_no_virtual(scene, ob, NULL, CD_MASK_MESH); + BLI_linklist_append(&dms, (void*)dm); + + nverts += dm->getNumVerts(dm); + nfaces = dm->getNumFaces(dm); + ntris += nfaces; + + //resolve quad faces + mface = dm->getFaceArray(dm); + for (i=0; iv4) + ntris+=1; + } + } + + //create data + verts = (float*) MEM_mallocN(sizeof(float)*3*nverts, "verts"); + tris = (int*) MEM_mallocN(sizeof(int)*3*ntris, "faces"); + + basenverts = 0; + tri = tris; + for (oblink = obs, dmlink = dms; oblink && dmlink; + oblink = oblink->next, dmlink = dmlink->next) + { + ob = (Object*) oblink->link; + dm = (DerivedMesh*) dmlink->link; + + curnverts = dm->getNumVerts(dm); + mvert = dm->getVertArray(dm); + //copy verts + for (i=0; ico); + mul_v3_m4v3(wco, ob->obmat, co); + verts[3*(basenverts+i)+0] = wco[0]; + verts[3*(basenverts+i)+1] = wco[2]; + verts[3*(basenverts+i)+2] = wco[1]; + } + + //create tris + curnfaces = dm->getNumFaces(dm); + mface = dm->getFaceArray(dm); + for (i=0; iv1; tri[1]= basenverts + mf->v3; tri[2]= basenverts + mf->v2; + tri += 3; + if (mf->v4) + { + tri[0]= basenverts + mf->v1; tri[1]= basenverts + mf->v4; tri[2]= basenverts + mf->v3; + tri += 3; + } + } + basenverts += curnverts; + } + + //release derived mesh + for (dmlink = dms; dmlink; dmlink = dmlink->next) + { + dm = (DerivedMesh*) dmlink->link; + dm->release(dm); + } + BLI_linklist_free(dms, NULL); +} + +static bool buildNavMesh(const RecastData& recastParams, int nverts, float* verts, int ntris, int* tris, + rcPolyMesh*& pmesh, rcPolyMeshDetail*& dmesh) +{ + float bmin[3], bmax[3]; + rcHeightfield* solid; + unsigned char *triflags; + rcCompactHeightfield* chf; + rcContourSet *cset; + + rcCalcBounds(verts, nverts, bmin, bmax); + + // + // Step 1. Initialize build config. + // + rcConfig cfg; + memset(&cfg, 0, sizeof(cfg)); + { +/* + float cellsize = 0.3f; + float cellheight = 0.2f; + float agentmaxslope = M_PI/4; + float agentmaxclimb = 0.9f; + float agentheight = 2.0f; + float agentradius = 0.6f; + float edgemaxlen = 12.0f; + float edgemaxerror = 1.3f; + float regionminsize = 50.f; + float regionmergesize = 20.f; + int vertsperpoly = 6; + float detailsampledist = 6.0f; + float detailsamplemaxerror = 1.0f; + cfg.cs = cellsize; + cfg.ch = cellheight; + cfg.walkableSlopeAngle = agentmaxslope/M_PI*180.f; + cfg.walkableHeight = (int)ceilf(agentheight/ cfg.ch); + cfg.walkableClimb = (int)floorf(agentmaxclimb / cfg.ch); + cfg.walkableRadius = (int)ceilf(agentradius / cfg.cs); + cfg.maxEdgeLen = (int)(edgemaxlen/cellsize); + cfg.maxSimplificationError = edgemaxerror; + cfg.minRegionSize = (int)rcSqr(regionminsize); + cfg.mergeRegionSize = (int)rcSqr(regionmergesize); + cfg.maxVertsPerPoly = vertsperpoly; + cfg.detailSampleDist = detailsampledist< 0.9f ? 0 : cellsize * detailsampledist; + cfg.detailSampleMaxError = cellheight * detailsamplemaxerror; +*/ + cfg.cs = recastParams.cellsize; + cfg.ch = recastParams.cellheight; + cfg.walkableSlopeAngle = recastParams.agentmaxslope/((float)M_PI)*180.f; + cfg.walkableHeight = (int)ceilf(recastParams.agentheight/ cfg.ch); + cfg.walkableClimb = (int)floorf(recastParams.agentmaxclimb / cfg.ch); + cfg.walkableRadius = (int)ceilf(recastParams.agentradius / cfg.cs); + cfg.maxEdgeLen = (int)(recastParams.edgemaxlen/recastParams.cellsize); + cfg.maxSimplificationError = recastParams.edgemaxerror; + cfg.minRegionSize = (int)rcSqr(recastParams.regionminsize); + cfg.mergeRegionSize = (int)rcSqr(recastParams.regionmergesize); + cfg.maxVertsPerPoly = recastParams.vertsperpoly; + cfg.detailSampleDist = recastParams.detailsampledist< 0.9f ? 0 : + recastParams.cellsize * recastParams.detailsampledist; + cfg.detailSampleMaxError = recastParams.cellheight * recastParams.detailsamplemaxerror; + + } + + // Set the area where the navigation will be build. + vcopy(cfg.bmin, bmin); + vcopy(cfg.bmax, bmax); + rcCalcGridSize(cfg.bmin, cfg.bmax, cfg.cs, &cfg.width, &cfg.height); + + // + // Step 2. Rasterize input polygon soup. + // + // Allocate voxel heightfield where we rasterize our input data to. + solid = new rcHeightfield; + if (!solid) + return false; + + if (!rcCreateHeightfield(*solid, cfg.width, cfg.height, cfg.bmin, cfg.bmax, cfg.cs, cfg.ch)) + return false; + + // Allocate array that can hold triangle flags. + triflags = (unsigned char*) MEM_mallocN(sizeof(unsigned char)*ntris, "triflags"); + if (!triflags) + return false; + // Find triangles which are walkable based on their slope and rasterize them. + memset(triflags, 0, ntris*sizeof(unsigned char)); + rcMarkWalkableTriangles(cfg.walkableSlopeAngle, verts, nverts, tris, ntris, triflags); + rcRasterizeTriangles(verts, nverts, tris, triflags, ntris, *solid); + MEM_freeN(triflags); + MEM_freeN(verts); + MEM_freeN(tris); + + // + // Step 3. Filter walkables surfaces. + // + rcFilterLedgeSpans(cfg.walkableHeight, cfg.walkableClimb, *solid); + rcFilterWalkableLowHeightSpans(cfg.walkableHeight, *solid); + + // + // Step 4. Partition walkable surface to simple regions. + // + + chf = new rcCompactHeightfield; + if (!chf) + return false; + if (!rcBuildCompactHeightfield(cfg.walkableHeight, cfg.walkableClimb, RC_WALKABLE, *solid, *chf)) + return false; + + delete solid; + + // Prepare for region partitioning, by calculating distance field along the walkable surface. + if (!rcBuildDistanceField(*chf)) + return false; + + // Partition the walkable surface into simple regions without holes. + if (!rcBuildRegions(*chf, cfg.walkableRadius, cfg.borderSize, cfg.minRegionSize, cfg.mergeRegionSize)) + return false; + + // + // Step 5. Trace and simplify region contours. + // + // Create contours. + cset = new rcContourSet; + if (!cset) + return false; + + if (!rcBuildContours(*chf, cfg.maxSimplificationError, cfg.maxEdgeLen, *cset)) + return false; + + // + // Step 6. Build polygons mesh from contours. + // + pmesh = new rcPolyMesh; + if (!pmesh) + return false; + if (!rcBuildPolyMesh(*cset, cfg.maxVertsPerPoly, *pmesh)) + return false; + + + // + // Step 7. Create detail mesh which allows to access approximate height on each polygon. + // + + dmesh = new rcPolyMeshDetail; + if (!dmesh) + return false; + + if (!rcBuildPolyMeshDetail(*pmesh, *chf, cfg.detailSampleDist, cfg.detailSampleMaxError, *dmesh)) + return false; + + delete chf; + delete cset; + + return true; +} + +static Object* createRepresentation(bContext *C, rcPolyMesh*& pmesh, rcPolyMeshDetail*& dmesh) +{ + Object *obedit; + float co[3], rot[3]; + EditMesh *em; + int i,j, k, polyverts; + unsigned short* v; + int face[3]; + + zero_v3(co); + zero_v3(rot); + obedit = ED_object_add_type(C, OB_MESH, co, rot, FALSE, 1); + ED_object_enter_editmode(C, EM_DO_UNDO|EM_IGNORE_LAYER); + + em = BKE_mesh_get_editmesh(((Mesh *)obedit->data)); + + //create verts for polygon mesh + for(i = 0; i < pmesh->nverts; i++) { + v = &pmesh->verts[3*i]; + co[0] = pmesh->bmin[0] + v[0]*pmesh->cs; + co[1] = pmesh->bmin[1] + v[1]*pmesh->ch; + co[2] = pmesh->bmin[2] + v[2]*pmesh->cs; + SWAP(float, co[1], co[2]); + addvertlist(em, co, NULL); + } + polyverts = pmesh->nverts; + + //create custom data layer to save polygon idx + CustomData_add_layer_named(&em->fdata, CD_PROP_INT, CD_CALLOC, NULL, 0, "recastData"); + + //create verts and faces for detailed mesh + for (i=0; inmeshes; i++) + { + int uniquevbase = em->totvert; + unsigned short vbase = dmesh->meshes[4*i+0]; + unsigned short ndv = dmesh->meshes[4*i+1]; + unsigned short tribase = dmesh->meshes[4*i+2]; + unsigned short trinum = dmesh->meshes[4*i+3]; + const unsigned short* p = &pmesh->polys[i*pmesh->nvp*2]; + int nv = 0; + for (j = 0; j < pmesh->nvp; ++j) + { + if (p[j] == 0xffff) break; + nv++; + } + //create unique verts + for (j=nv; jverts[vbase + j]); + SWAP(float, co[1], co[2]); + addvertlist(em, co, NULL); + } + + EM_init_index_arrays(em, 1, 0, 0); + + //create faces + for (j=0; jtris[4*(tribase+j)]; + EditFace* newFace; + for (k=0; k<3; k++) + { + if (tri[k]fdata, newFace->data, CD_PROP_INT); + *polygonIdx = i; + } + + EM_free_index_arrays(); + } + + delete pmesh; pmesh = NULL; + delete dmesh; dmesh = NULL; + + BKE_mesh_end_editmesh((Mesh*)obedit->data, em); + + DAG_id_flush_update((ID*)obedit->data, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data); + + + ED_object_exit_editmode(C, EM_FREEDATA); + WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, obedit); + return obedit; +} + +static int create_navmesh_exec(bContext *C, wmOperator *op) +{ + Scene* scene = CTX_data_scene(C); + int nverts, ntris; + float* verts; + int* tris; + rcPolyMesh* pmesh; + rcPolyMeshDetail* dmesh; + LinkNode* obs = NULL; + CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) + { + BLI_linklist_append(&obs, (void*)base->object); + } + CTX_DATA_END; + createVertsTrisData(C, obs, nverts, verts, ntris, tris); + BLI_linklist_free(obs, NULL); + buildNavMesh(scene->gm.recastData, nverts, verts, ntris, tris, pmesh, dmesh); + createRepresentation(C, pmesh, dmesh); + + return OPERATOR_FINISHED; +} + +void OBJECT_OT_create_navmesh(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "NavMesh"; + ot->description= "Create navigation mesh for selected objects"; + ot->idname= "OBJECT_OT_create_navmesh"; + + /* api callbacks */ + ot->exec= create_navmesh_exec; +} +} diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c index 602b94034bd..8959cdf7970 100644 --- a/source/blender/editors/object/object_ops.c +++ b/source/blender/editors/object/object_ops.c @@ -209,6 +209,8 @@ void ED_operatortypes_object(void) WM_operatortype_append(OBJECT_OT_bake_image); WM_operatortype_append(OBJECT_OT_drop_named_material); + + WM_operatortype_append(OBJECT_OT_create_navmesh); } void ED_operatormacros_object(void) diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index 8f92c9f5b2f..042111ae7ac 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -438,6 +438,23 @@ typedef struct GameFraming { #define SCE_GAMEFRAMING_EXTEND 1 #define SCE_GAMEFRAMING_SCALE 2 +typedef struct RecastData +{ + float cellsize; + float cellheight; + float agentmaxslope; + float agentmaxclimb; + float agentheight; + float agentradius; + float edgemaxlen; + float edgemaxerror; + float regionminsize; + float regionmergesize; + int vertsperpoly; + float detailsampledist; + float detailsamplemaxerror; +} RecastData; + typedef struct GameData { /* physics (it was in world)*/ @@ -466,7 +483,8 @@ typedef struct GameData { /* stereo/dome mode */ struct GameDome dome; short stereoflag, stereomode, xsch, ysch; //xsch and ysch can be deleted !!! - float eyeseparation, pad1; + float eyeseparation; + RecastData recastData; } GameData; #define STEREO_NOSTEREO 1 diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index f91ac0517f9..b75fce9531a 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -33,6 +33,7 @@ #include "DNA_modifier_types.h" #include "DNA_scene_types.h" #include "DNA_userdef_types.h" +#include "BLI_math.h" /* Include for Bake Options */ #include "RE_pipeline.h" @@ -1462,6 +1463,83 @@ void rna_def_render_layer_common(StructRNA *srna, int scene) else RNA_def_property_clear_flag(prop, PROP_EDITABLE); } +static void rna_def_scene_game_recast_data(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + srna= RNA_def_struct(brna, "SceneGameRecastData", NULL); + RNA_def_struct_sdna(srna, "RecastData"); + RNA_def_struct_nested(brna, srna, "Scene"); + RNA_def_struct_ui_text(srna, "Recast Data", "Recast data for a Game datablock"); + + prop= RNA_def_property(srna, "cellsize", PROP_FLOAT, PROP_NONE); + RNA_def_property_ui_range(prop, 0.1, 1, 0.01, 2); + RNA_def_property_ui_text(prop, "Cell size", "Rasterized cell size"); + RNA_def_property_update(prop, NC_SCENE, NULL); + + prop= RNA_def_property(srna, "cellheight", PROP_FLOAT, PROP_NONE); + RNA_def_property_ui_range(prop, 0.1, 1, 0.01, 2); + RNA_def_property_ui_text(prop, "Cell height", "Rasterized cell height"); + RNA_def_property_update(prop, NC_SCENE, NULL); + + prop= RNA_def_property(srna, "agentheight", PROP_FLOAT, PROP_NONE); + RNA_def_property_ui_range(prop, 0.1, 5, 0.1, 2); + RNA_def_property_ui_text(prop, "Agent height", "Minimum height where the agent can still walk"); + RNA_def_property_update(prop, NC_SCENE, NULL); + + prop= RNA_def_property(srna, "agentradius", PROP_FLOAT, PROP_NONE); + RNA_def_property_ui_range(prop, 0.1, 5, 0.1, 2); + RNA_def_property_ui_text(prop, "Agent radius", "Radius of the agent"); + RNA_def_property_update(prop, NC_SCENE, NULL); + + prop= RNA_def_property(srna, "agentmaxclimb", PROP_FLOAT, PROP_NONE); + RNA_def_property_ui_range(prop, 0.1, 5, 0.1, 2); + RNA_def_property_ui_text(prop, "Max climb", "Maximum height between grid cells the agent can climb"); + RNA_def_property_update(prop, NC_SCENE, NULL); + + prop= RNA_def_property(srna, "agentmaxslope", PROP_FLOAT, PROP_ANGLE); + RNA_def_property_range(prop, 0, M_PI/2); + RNA_def_property_ui_text(prop, "Max slope", "Maximum walkable slope angle in degrees"); + RNA_def_property_update(prop, NC_SCENE, NULL); + + + prop= RNA_def_property(srna, "regionminsize", PROP_FLOAT, PROP_NONE); + RNA_def_property_ui_range(prop, 0, 150, 1, 2); + RNA_def_property_ui_text(prop, "Min region size", "Minimum regions size. Smaller regions will be deleted"); + RNA_def_property_update(prop, NC_SCENE, NULL); + + prop= RNA_def_property(srna, "regionmergesize", PROP_FLOAT, PROP_NONE); + RNA_def_property_ui_range(prop, 0, 150, 1, 2); + RNA_def_property_ui_text(prop, "Merged region size", "Minimum regions size. Smaller regions will be merged"); + RNA_def_property_update(prop, NC_SCENE, NULL); + + prop= RNA_def_property(srna, "edgemaxlen", PROP_FLOAT, PROP_NONE); + RNA_def_property_ui_range(prop, 0, 50, 1, 2); + RNA_def_property_ui_text(prop, "Max edge length", "Maximum contour edge length"); + RNA_def_property_update(prop, NC_SCENE, NULL); + + prop= RNA_def_property(srna, "edgemaxerror", PROP_FLOAT, PROP_NONE); + RNA_def_property_ui_range(prop, 0.1, 3.0, 0.1, 2); + RNA_def_property_ui_text(prop, "Max edge error", "Maximum distance error from contour to cells"); + RNA_def_property_update(prop, NC_SCENE, NULL); + + prop= RNA_def_property(srna, "vertsperpoly", PROP_INT, PROP_NONE); + RNA_def_property_ui_range(prop, 3, 12, 1, 0); + RNA_def_property_ui_text(prop, "Verts per poly", "Max number of vertices per polygon"); + RNA_def_property_update(prop, NC_SCENE, NULL); + + prop= RNA_def_property(srna, "detailsampledist", PROP_FLOAT, PROP_NONE); + RNA_def_property_ui_range(prop, 0.0, 16.0, 1, 2); + RNA_def_property_ui_text(prop, "Sample Distance", "Detail mesh sample spacing"); + RNA_def_property_update(prop, NC_SCENE, NULL); + + prop= RNA_def_property(srna, "detailsamplemaxerror", PROP_FLOAT, PROP_NONE); + RNA_def_property_ui_range(prop, 0.0, 16.0, 1, 2); + RNA_def_property_ui_text(prop, "Max Sample Error", "Detail mesh simplification max sample error"); + RNA_def_property_update(prop, NC_SCENE, NULL); +} + static void rna_def_scene_game_data(BlenderRNA *brna) { StructRNA *srna; @@ -1766,6 +1844,16 @@ static void rna_def_scene_game_data(BlenderRNA *brna) RNA_def_property_range(prop, 0.0f, 200.0f); RNA_def_property_ui_text(prop, "Level height", "Max difference in heights of obstacles to enable their interaction"); RNA_def_property_update(prop, NC_SCENE, NULL); + + /* Recast Settings */ + prop= RNA_def_property(srna, "recast_data", PROP_POINTER, PROP_NONE); + RNA_def_property_flag(prop, PROP_NEVER_NULL); + RNA_def_property_pointer_sdna(prop, NULL, "recastData"); + RNA_def_property_struct_type(prop, "SceneGameRecastData"); + RNA_def_property_ui_text(prop, "Recast Data", ""); + + /* Nestled Data */ + rna_def_scene_game_recast_data(brna); } diff --git a/source/blender/modifiers/intern/MOD_navmesh.cpp b/source/blender/modifiers/intern/MOD_navmesh.cpp index c876987e590..1bd08dcc9c0 100644 --- a/source/blender/modifiers/intern/MOD_navmesh.cpp +++ b/source/blender/modifiers/intern/MOD_navmesh.cpp @@ -37,7 +37,10 @@ extern "C"{ #include "BKE_modifier.h" #include "BKE_particle.h" #include "MEM_guardedalloc.h" - +#include "BIF_gl.h" +#include "gpu_buffers.h" +#include "GPU_draw.h" +#include "UI_resources.h" static void initData(ModifierData *md) @@ -285,6 +288,57 @@ static DerivedMesh *buildNavMesh(NavMeshModifierData *mmd,DerivedMesh *dm) return result; } +inline int bit(int a, int b) +{ + return (a & (1 << b)) >> b; +} +inline void intToCol(int i, float* col) +{ + int r = bit(i, 0) + bit(i, 3) * 2 + 1; + int g = bit(i, 1) + bit(i, 4) * 2 + 1; + int b = bit(i, 2) + bit(i, 5) * 2 + 1; + col[0] = 1 - r*63.0f/255.0f; + col[1] = 1 - g*63.0f/255.0f; + col[2] = 1 - b*63.0f/255.0f; +} + +static void navDM_drawFacesSolid(DerivedMesh *dm, + float (*partial_redraw_planes)[4], + int fast, int (*setMaterial)(int, void *attribs)) +{ + int a, glmode; + MVert *mvert = (MVert *)CustomData_get_layer(&dm->vertData, CD_MVERT); + MFace *mface = (MFace *)CustomData_get_layer(&dm->faceData, CD_MFACE); + int* polygonIdx = (int*)CustomData_get_layer(&dm->faceData, CD_PROP_INT); + float col[3]; + col[0] = 1.f; + col[1] = 0.f; + col[2] = 0.f; + if(GPU_buffer_legacy(dm) ) { + DEBUG_VBO( "Using legacy code. navDM_drawFacesSolid\n" ); + //glShadeModel(GL_SMOOTH); + glBegin(glmode = GL_QUADS); + for(a = 0; a < dm->numFaceData; a++, mface++, polygonIdx++) { + int new_glmode = mface->v4?GL_QUADS:GL_TRIANGLES; + intToCol(a, col); + //intToCol(*polygonIdx, col); + + if(new_glmode != glmode) { + glEnd(); + glBegin(glmode = new_glmode); + } + //glColor3fv(col); + glVertex3fv(mvert[mface->v1].co); + glVertex3fv(mvert[mface->v2].co); + glVertex3fv(mvert[mface->v3].co); + if(mface->v4) { + glVertex3fv(mvert[mface->v4].co); + } + } + glEnd(); + } +} + static DerivedMesh *testCreateNavMesh(NavMeshModifierData *mmd,DerivedMesh *dm) { int i; @@ -318,7 +372,16 @@ static DerivedMesh *testCreateNavMesh(NavMeshModifierData *mmd,DerivedMesh *dm) mf->v1 = 0; mf->v2 = 1; mf->v3 = 2; */ - result = CDDM_new(maxVerts, maxEdges, maxFaces); + int actualFaces = 0; + for(i = 0; i < maxFaces; i++) { + int* polygonIdx = (int*)CustomData_get(&dm->faceData, i, CD_PROP_INT); + if (*polygonIdx==1) + actualFaces++; + } + + + result = CDDM_new(maxVerts, maxEdges, maxFaces);//maxFaces actualFaces + result->drawFacesSolid = navDM_drawFacesSolid; numVerts = numEdges = numFaces = 0; for(i = 0; i < maxVerts; i++) { MVert inMV; @@ -326,12 +389,11 @@ static DerivedMesh *testCreateNavMesh(NavMeshModifierData *mmd,DerivedMesh *dm) float co[3]; dm->getVert(dm, i, &inMV); copy_v3_v3(co, inMV.co); - SWAP(float, co[1], co[2]); *mv = inMV; mv->co[2] +=.5f; numVerts++; } - + for(i = 0; i < maxEdges; i++) { MEdge inMED; MEdge *med = CDDM_get_edge(result, numEdges); @@ -341,6 +403,11 @@ static DerivedMesh *testCreateNavMesh(NavMeshModifierData *mmd,DerivedMesh *dm) } for(i = 0; i < maxFaces; i++) { + /* + int* polygonIdx = (int*)CustomData_get(&dm->faceData, i, CD_PROP_INT); + if (*polygonIdx!=2) + continue;*/ + MFace inMF; MFace *mf = CDDM_get_face(result, numFaces); dm->getFace(dm, i, &inMF); @@ -360,8 +427,8 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der NavMeshModifierData *nmmd = (NavMeshModifierData*) md; //for test - //result = testCreateNavMesh(nmmd, derivedData); - result = buildNavMesh(nmmd, derivedData); + result = testCreateNavMesh(nmmd, derivedData); + //result = buildNavMesh(nmmd, derivedData); return result; } From 852b84745c60c6b82ededbe00c4906ca8d2f5944 Mon Sep 17 00:00:00 2001 From: Nick Samarin Date: Fri, 9 Jul 2010 22:22:51 +0000 Subject: [PATCH 019/182] Work on conversion of the navigation mesh: we build navmesh directly from blender mesh using custom face data, when no custom data provided we use RAS_MeshObject interface --- source/gameengine/Ketsji/KX_GameObject.cpp | 8 +- source/gameengine/Ketsji/KX_GameObject.h | 10 +- source/gameengine/Ketsji/KX_NavMeshObject.cpp | 512 ++++++++++++++---- source/gameengine/Ketsji/KX_NavMeshObject.h | 9 +- .../Ketsji/KX_ObstacleSimulation.cpp | 79 ++- .../gameengine/Ketsji/KX_ObstacleSimulation.h | 6 +- 6 files changed, 476 insertions(+), 148 deletions(-) diff --git a/source/gameengine/Ketsji/KX_GameObject.cpp b/source/gameengine/Ketsji/KX_GameObject.cpp index 2d89782393d..e6a365c5729 100644 --- a/source/gameengine/Ketsji/KX_GameObject.cpp +++ b/source/gameengine/Ketsji/KX_GameObject.cpp @@ -102,7 +102,7 @@ KX_GameObject::KX_GameObject( m_pGraphicController(NULL), m_xray(false), m_pHitObject(NULL), - m_pObstacle(NULL), + m_pObstacleSimulation(NULL), m_isDeformable(false) #ifndef DISABLE_PYTHON , m_attr_dict(NULL) @@ -151,11 +151,9 @@ KX_GameObject::~KX_GameObject() delete m_pGraphicController; } - if (m_pObstacle) + if (m_pObstacleSimulation) { - KX_Scene *scene = KX_GetActiveScene(); - KX_ObstacleSimulation* obstacleSimulation = scene->GetObstacleSimulation(); - obstacleSimulation->DestroyObstacle(m_pObstacle); + m_pObstacleSimulation->DestroyObstacleForObj(this); } #ifndef DISABLE_PYTHON diff --git a/source/gameengine/Ketsji/KX_GameObject.h b/source/gameengine/Ketsji/KX_GameObject.h index 116230adc48..c0683ae0b4e 100644 --- a/source/gameengine/Ketsji/KX_GameObject.h +++ b/source/gameengine/Ketsji/KX_GameObject.h @@ -59,7 +59,7 @@ class KX_IPhysicsController; class PHY_IGraphicController; class PHY_IPhysicsEnvironment; struct Object; -struct KX_Obstacle; +class KX_ObstacleSimulation; #ifndef DISABLE_PYTHON /* utility conversion function */ @@ -109,7 +109,7 @@ protected: MT_CmMatrix4x4 m_OpenGL_4x4Matrix; - KX_Obstacle* m_pObstacle; + KX_ObstacleSimulation* m_pObstacleSimulation; public: bool m_isDeformable; @@ -794,14 +794,14 @@ public: m_bSuspendDynamics = false; } - void RegisterObstacle(KX_Obstacle* obstacle) + void RegisterObstacle(KX_ObstacleSimulation* obstacleSimulation) { - m_pObstacle = obstacle; + m_pObstacleSimulation = obstacleSimulation; } void UnregisterObstacle() { - m_pObstacle = NULL; + m_pObstacleSimulation = NULL; } diff --git a/source/gameengine/Ketsji/KX_NavMeshObject.cpp b/source/gameengine/Ketsji/KX_NavMeshObject.cpp index f4fea3f29f6..061d1876786 100644 --- a/source/gameengine/Ketsji/KX_NavMeshObject.cpp +++ b/source/gameengine/Ketsji/KX_NavMeshObject.cpp @@ -36,6 +36,7 @@ extern "C" { #include "BKE_customdata.h" #include "BKE_cdderivedmesh.h" #include "BKE_DerivedMesh.h" +#include "BLI_math_vector.h" } #include "KX_PythonInit.h" #include "KX_PyMath.h" @@ -102,66 +103,316 @@ void KX_NavMeshObject::ProcessReplica() } bool KX_NavMeshObject::BuildVertIndArrays(RAS_MeshObject* meshobj, float *&vertices, int& nverts, - unsigned short* &faces, int& npolys) + unsigned short* &polys, int& npolys, unsigned short *&dmeshes, + float *&dvertices, int &ndvertsuniq, unsigned short *&dtris, + int& ndtris, int &vertsPerPoly) { if (!meshobj) { return false; } - DerivedMesh* dm = CDDM_from_mesh(meshobj->GetMesh(), NULL); - - MVert *mvert = dm->getVertArray(dm); - MFace *mface = dm->getFaceArray(dm); - int numpolys = dm->getNumFaces(dm); - int numverts = dm->getNumVerts(dm); - - nverts = numverts; - if (nverts >= 0xffff) - return false; - //calculate count of tris - npolys = numpolys; - for (int p2=0; p2GetBlenderScene(), GetBlenderObject(), + NULL, CD_MASK_MESH); + int* recastData = (int*) dm->getFaceDataArray(dm, CD_PROP_INT); + if (recastData) { - MFace* mf = &mface[p2]; - if (mf->v4) - npolys+=1; - } + //create from blender mesh using recast data to build navigation + //polygon mesh from detailed triangle mesh + MVert *mvert = dm->getVertArray(dm); + MFace *mface = dm->getFaceArray(dm); + int numfaces = dm->getNumFaces(dm); + int numverts = dm->getNumVerts(dm); - //create verts - vertices = new float[nverts*3]; - for (int vi=0; vico[j]; - } - //create tris - faces = new unsigned short[npolys*3*2]; - memset(faces,0xff,sizeof(unsigned short)*3*2*npolys); - unsigned short *face = faces; - for (int p2=0; p2v1; - face[1]= mf->v2; - face[2]= mf->v3; - face += 6; - if (mf->v4) + if (numfaces==0) { - face[0]= mf->v1; - face[1]= mf->v3; - face[2]= mf->v4; - face += 6; + return true; + } + + //build detailed mesh adjacency + ndtris = numfaces; + dtris = new unsigned short[numfaces*3*2]; + memset(dtris, 0xffff, sizeof(unsigned short)*3*2*numfaces); + for (int i=0; iv1; + dtris[i*3*2+1] = mf->v2; + dtris[i*3*2+2] = mf->v3; + + } + buildMeshAdjacency(dtris, numfaces, numverts, 3); + + + //assumption: detailed mesh triangles are sorted by polygon idx + npolys = recastData[numfaces-1] + 1; + + dmeshes = new unsigned short[npolys*4]; + memset(dmeshes, 0, npolys*4*sizeof(unsigned short)); + unsigned short *dmesh = NULL; + int prevpolyidx = -1; + for (int i=0; i poly; + //search border + int btri = -1; + int bedge = -1; + + for (int j=0; j=vertsPerPoly) + { + printf("Error! Polygon size exceeds max verts count"); + return false; + } + + for (int i=0; imaxidx) + maxidx=idx; + } + } + + //create navigation mesh verts + nverts = maxidx+1; + vertices = new float[nverts*3]; + for (int vi=0; vico); + } + + //create unique detailed mesh verts + ndvertsuniq = numverts - nverts; + if (ndvertsuniq>0) + { + dvertices = new float[ndvertsuniq*3]; + for (int vi=0; vico); + } + } + + for (int polyIdx=0; polyIdxm_sharedvertex_map.size(); + if (nverts >= 0xffff) + return false; + //calculate count of tris + int nmeshpolys = meshobj->NumPolygons(); + npolys = nmeshpolys; + for (int p=0; pGetPolygon(p)->VertexCount(); + npolys+=vertcount-3; + } + //create verts + vertices = new float[nverts*3]; + float* vert = vertices; + for (int vi=0; vim_sharedvertex_map[vi].empty() ? meshobj->GetVertexLocation(vi) : NULL; + if (pos) + copy_v3_v3(vert, pos); + else + { + memset(vert, NULL, 3*sizeof(float)); //vertex isn't in any poly, set dummy zero coordinates + } + vert+=3; + } + + //create tris + polys = new unsigned short[npolys*3*2]; + memset(polys, 0xff, sizeof(unsigned short)*3*2*npolys); + unsigned short *poly = polys; + RAS_Polygon* raspoly; + for (int p=0; pGetPolygon(p); + for (int v=0; vVertexCount()-2; v++) + { + poly[0]= raspoly->GetVertex(0)->getOrigIndex(); + for (size_t i=1; i<3; i++) + { + poly[i]= raspoly->GetVertex(v+i)->getOrigIndex(); + } + poly += 6; + } + } + dmeshes = NULL; + dvertices = NULL; + ndvertsuniq = 0; + dtris = NULL; + ndtris = npolys; + } dm->release(dm); - dm = NULL; return true; } + bool KX_NavMeshObject::BuildNavMesh() { if (GetMeshCount()==0) @@ -169,42 +420,30 @@ bool KX_NavMeshObject::BuildNavMesh() RAS_MeshObject* meshobj = GetMesh(0); - float* vertices = NULL; - unsigned short* faces = NULL; - int nverts = 0, npolys = 0; - if (!BuildVertIndArrays(meshobj, vertices, nverts, faces, npolys)) + float *vertices = NULL, *dvertices = NULL; + unsigned short *polys = NULL, *dtris = NULL, *dmeshes = NULL; + int nverts = 0, npolys = 0, ndvertsuniq = 0, ndtris = 0; + int vertsPerPoly = 0; + if (!BuildVertIndArrays(meshobj, vertices, nverts, polys, npolys, + dmeshes, dvertices, ndvertsuniq, dtris, ndtris, vertsPerPoly ) + || vertsPerPoly<3) return false; - //prepare vertices and indices - struct Object* blenderobject = GetBlenderObject(); - MT_Point3 posobj; - posobj.setValue(blenderobject->loc[0]+blenderobject->dloc[0], - blenderobject->loc[1]+blenderobject->dloc[1], - blenderobject->loc[2]+blenderobject->dloc[2]); - MT_Vector3 eulxyzobj(blenderobject->rot); - MT_Vector3 scaleobj(blenderobject->size); - MT_Matrix3x3 rotMatrix(eulxyzobj); - MT_Transform worldTransform(posobj, rotMatrix.scaled(scaleobj[0], scaleobj[1], scaleobj[2])); - MT_Point3 pos; for (int i=0; ibmax[1] = bmax[1]; header->bmax[2] = bmax[2]; header->ndmeshes = npolys; - header->ndverts = uniqueDetailVerts; + header->ndverts = ndvertsuniq; header->ndtris = ndtris; // Store vertices @@ -275,49 +514,76 @@ bool KX_NavMeshObject::BuildNavMesh() //memcpy(navVerts, vertices, nverts*3*sizeof(float)); // Store polygons - const int nvp = 3; - const unsigned short* src = faces; + const unsigned short* src = polys; for (int i = 0; i < npolys; ++i) { dtStatPoly* p = &navPolys[i]; p->nv = 0; - for (int j = 0; j < nvp; ++j) + for (int j = 0; j < vertsPerPoly; ++j) { + if (src[j] == 0xffff) break; p->v[j] = src[j]; - p->n[j] = src[nvp+j]+1; + p->n[j] = src[vertsPerPoly+j]+1; p->nv++; } - src += nvp*2; + src += vertsPerPoly*2; } - header->nnodes = createBVTree(vertsi, nverts, faces, npolys, nvp, + header->nnodes = createBVTree(vertsi, nverts, polys, npolys, vertsPerPoly, cs, cs, npolys*2, navNodes); - //create fake detail meshes - unsigned short vbase = 0; - for (int i = 0; i < npolys; ++i) + + if (dmeshes==NULL) { - dtStatPolyDetail& dtl = navDMeshes[i]; - dtl.vbase = 0; - dtl.nverts = 0; - dtl.tbase = i; - dtl.ntris = 1; + //create fake detail meshes + for (int i = 0; i < npolys; ++i) + { + dtStatPolyDetail& dtl = navDMeshes[i]; + dtl.vbase = 0; + dtl.nverts = 0; + dtl.tbase = i; + dtl.ntris = 1; + } + // setup triangles. + unsigned char* tri = navDTris; + for(size_t i=0; iinit(data, dataSize, true); + m_navMesh->init(data, dataSize, true); delete [] vertices; - delete [] faces; - + delete [] polys; + if (dvertices) + { + delete [] dvertices; + } + return true; } @@ -332,10 +598,11 @@ void KX_NavMeshObject::DrawNavMesh() return; MT_Vector3 color(0.f, 0.f, 0.f); - enum RenderMode {DETAILED_TRIS, WALLS}; - static const RenderMode renderMode = DETAILED_TRIS; + enum RenderMode {POLYS ,DETAILED_TRIS, WALLS}; + static const RenderMode renderMode = DETAILED_TRIS;//POLYS; switch (renderMode) { + case POLYS : case WALLS : for (int pi=0; pigetPolyCount(); pi++) { @@ -343,10 +610,15 @@ void KX_NavMeshObject::DrawNavMesh() for (int i = 0, j = (int)poly->nv-1; i < (int)poly->nv; j = i++) { - if (poly->n[j]) continue; - const float* vj = m_navMesh->getVertex(poly->v[j]); - const float* vi = m_navMesh->getVertex(poly->v[i]); - KX_RasterizerDrawDebugLine(MT_Vector3(vj[0], vj[2], vj[1]), MT_Vector3(vi[0], vi[2], vi[1]), color); + if (poly->n[j] && renderMode==DETAILED_TRIS) + continue; + const float* vif = m_navMesh->getVertex(poly->v[i]); + const float* vjf = m_navMesh->getVertex(poly->v[j]); + MT_Point3 vi(vif[0], vif[2], vif[1]); + MT_Point3 vj(vjf[0], vjf[2], vjf[1]); + vi = TransformToWorldCoords(vi); + vj = TransformToWorldCoords(vj); + KX_RasterizerDrawDebugLine(vi, vj, color); } } break; @@ -359,7 +631,7 @@ void KX_NavMeshObject::DrawNavMesh() for (int j = 0; j < pd->ntris; ++j) { const unsigned char* t = m_navMesh->getDetailTri(pd->tbase+j); - MT_Vector3 tri[3]; + MT_Point3 tri[3]; for (int k = 0; k < 3; ++k) { const float* v; @@ -373,6 +645,9 @@ void KX_NavMeshObject::DrawNavMesh() tri[k].setValue(pos); } + for (int k=0; k<3; k++) + tri[k] = TransformToWorldCoords(tri[k]); + for (int k=0; k<3; k++) KX_RasterizerDrawDebugLine(tri[k], tri[(k+1)%3], color); } @@ -381,13 +656,37 @@ void KX_NavMeshObject::DrawNavMesh() } } +MT_Point3 KX_NavMeshObject::TransformToLocalCoords(const MT_Point3& wpos) +{ + MT_Matrix3x3 orientation = NodeGetWorldOrientation(); + const MT_Vector3& scaling = NodeGetWorldScaling(); + orientation.scale(scaling[0], scaling[1], scaling[2]); + MT_Transform worldtr(NodeGetWorldPosition(), orientation); + MT_Transform invworldtr; + invworldtr.invert(worldtr); + MT_Point3 lpos = invworldtr(wpos); + return lpos; +} + +MT_Point3 KX_NavMeshObject::TransformToWorldCoords(const MT_Point3& lpos) +{ + MT_Matrix3x3 orientation = NodeGetWorldOrientation(); + const MT_Vector3& scaling = NodeGetWorldScaling(); + orientation.scale(scaling[0], scaling[1], scaling[2]); + MT_Transform worldtr(NodeGetWorldPosition(), orientation); + MT_Point3 wpos = worldtr(lpos); + return wpos; +} + int KX_NavMeshObject::FindPath(const MT_Point3& from, const MT_Point3& to, float* path, int maxPathLen) { if (!m_navMesh) return 0; + MT_Point3 localfrom = TransformToLocalCoords(from); + MT_Point3 localto = TransformToLocalCoords(to); float spos[3], epos[3]; - from.getValue(spos); flipAxes(spos); - to.getValue(epos); flipAxes(epos); + localfrom.getValue(spos); flipAxes(spos); + localto.getValue(epos); flipAxes(epos); dtStatPolyRef sPolyRef = m_navMesh->findNearestPoly(spos, polyPickExt); dtStatPolyRef ePolyRef = m_navMesh->findNearestPoly(epos, polyPickExt); @@ -401,7 +700,12 @@ int KX_NavMeshObject::FindPath(const MT_Point3& from, const MT_Point3& to, float { pathLen = m_navMesh->findStraightPath(spos, epos, polys, npolys, path, maxPathLen); for (int i=0; ifindNearestPoly(spos, polyPickExt); float t=0; static dtStatPolyRef polys[MAX_PATH_LEN]; diff --git a/source/gameengine/Ketsji/KX_NavMeshObject.h b/source/gameengine/Ketsji/KX_NavMeshObject.h index dff05d32183..f06cd3b455d 100644 --- a/source/gameengine/Ketsji/KX_NavMeshObject.h +++ b/source/gameengine/Ketsji/KX_NavMeshObject.h @@ -44,8 +44,10 @@ protected: dtStatNavMesh* m_navMesh; bool BuildVertIndArrays(RAS_MeshObject* meshobj, float *&vertices, int& nverts, - unsigned short *&faces, int& npolys); - + unsigned short* &polys, int& npolys, unsigned short *&dmeshes, + float *&dvertices, int &ndvertsuniq, unsigned short* &dtris, + int& ndtris, int &vertsPerPoly); + public: KX_NavMeshObject(void* sgReplicationInfo, SG_Callbacks callbacks); ~KX_NavMeshObject(); @@ -61,7 +63,8 @@ public: void DrawNavMesh(); void DrawPath(const float *path, int pathLen, const MT_Vector3& color); - + MT_Point3 TransformToLocalCoords(const MT_Point3& wpos); + MT_Point3 TransformToWorldCoords(const MT_Point3& lpos); #ifndef DISABLE_PYTHON /* --------------------------------------------------------------------- */ /* Python interface ---------------------------------------------------- */ diff --git a/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp b/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp index f8b064c39f8..14487a2e75c 100644 --- a/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp +++ b/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp @@ -181,36 +181,22 @@ KX_ObstacleSimulation::~KX_ObstacleSimulation() } m_obstacles.clear(); } -KX_Obstacle* KX_ObstacleSimulation::CreateObstacle() +KX_Obstacle* KX_ObstacleSimulation::CreateObstacle(KX_GameObject* gameobj) { KX_Obstacle* obstacle = new KX_Obstacle(); + obstacle->m_gameObj = gameobj; + gameobj->RegisterObstacle(this); m_obstacles.push_back(obstacle); return obstacle; } void KX_ObstacleSimulation::AddObstacleForObj(KX_GameObject* gameobj) { - KX_Obstacle* obstacle = CreateObstacle(); + KX_Obstacle* obstacle = CreateObstacle(gameobj); struct Object* blenderobject = gameobj->GetBlenderObject(); obstacle->m_type = KX_OBSTACLE_OBJ; obstacle->m_shape = KX_OBSTACLE_CIRCLE; obstacle->m_rad = blenderobject->obstacleRad; - obstacle->m_gameObj = gameobj; - gameobj->RegisterObstacle(obstacle); -} - -void KX_ObstacleSimulation::DestroyObstacle(KX_Obstacle* obstacle) -{ - for (size_t i=0; im_gameObj->UnregisterObstacle(); - m_obstacles[i] = m_obstacles.back(); - m_obstacles.pop_back(); - delete obstacle; - } - } } void KX_ObstacleSimulation::AddObstaclesForNavMesh(KX_NavMeshObject* navmeshobj) @@ -229,12 +215,11 @@ void KX_ObstacleSimulation::AddObstaclesForNavMesh(KX_NavMeshObject* navmeshobj) const float* vj = navmesh->getVertex(poly->v[j]); const float* vi = navmesh->getVertex(poly->v[i]); - KX_Obstacle* obstacle = CreateObstacle(); + KX_Obstacle* obstacle = CreateObstacle(navmeshobj); obstacle->m_type = KX_OBSTACLE_NAV_MESH; obstacle->m_shape = KX_OBSTACLE_SEGMENT; - obstacle->m_gameObj = navmeshobj; - obstacle->m_pos = MT_Vector3(vj[0], vj[2], vj[1]); - obstacle->m_pos2 = MT_Vector3(vi[0], vi[2], vi[1]); + obstacle->m_pos = MT_Point3(vj[0], vj[2], vj[1]); + obstacle->m_pos2 = MT_Point3(vi[0], vi[2], vi[1]); obstacle->m_rad = 0; obstacle->m_vel = MT_Vector2(0,0); } @@ -242,11 +227,28 @@ void KX_ObstacleSimulation::AddObstaclesForNavMesh(KX_NavMeshObject* navmeshobj) } } +void KX_ObstacleSimulation::DestroyObstacleForObj(KX_GameObject* gameobj) +{ + for (size_t i=0; im_gameObj == gameobj) + { + KX_Obstacle* obstacle = m_obstacles[i]; + obstacle->m_gameObj->UnregisterObstacle(); + m_obstacles[i] = m_obstacles.back(); + m_obstacles.pop_back(); + delete obstacle; + } + else + i++; + } +} + void KX_ObstacleSimulation::UpdateObstacles() { for (size_t i=0; im_shape==KX_OBSTACLE_NAV_MESH || m_obstacles[i]->m_shape==KX_OBSTACLE_SEGMENT) + if (m_obstacles[i]->m_type==KX_OBSTACLE_NAV_MESH || m_obstacles[i]->m_shape==KX_OBSTACLE_SEGMENT) continue; KX_Obstacle* obs = m_obstacles[i]; @@ -281,7 +283,17 @@ void KX_ObstacleSimulation::DrawObstacles() { if (m_obstacles[i]->m_shape==KX_OBSTACLE_SEGMENT) { - KX_RasterizerDrawDebugLine(m_obstacles[i]->m_pos, m_obstacles[i]->m_pos2, bluecolor); + MT_Point3 p1 = m_obstacles[i]->m_pos; + MT_Point3 p2 = m_obstacles[i]->m_pos2; + //apply world transform + if (m_obstacles[i]->m_type == KX_OBSTACLE_NAV_MESH) + { + KX_NavMeshObject* navmeshobj = static_cast(m_obstacles[i]->m_gameObj); + p1 = navmeshobj->TransformToWorldCoords(p1); + p2 = navmeshobj->TransformToWorldCoords(p2); + } + + KX_RasterizerDrawDebugLine(p1, p2, bluecolor); } else if (m_obstacles[i]->m_shape==KX_OBSTACLE_CIRCLE) { @@ -351,9 +363,9 @@ KX_ObstacleSimulationTOI::~KX_ObstacleSimulationTOI() m_toiCircles.clear(); } -KX_Obstacle* KX_ObstacleSimulationTOI::CreateObstacle() +KX_Obstacle* KX_ObstacleSimulationTOI::CreateObstacle(KX_GameObject* gameobj) { - KX_Obstacle* obstacle = KX_ObstacleSimulation::CreateObstacle(); + KX_Obstacle* obstacle = KX_ObstacleSimulation::CreateObstacle(gameobj); m_toiCircles.push_back(new TOICircle()); return obstacle; } @@ -406,7 +418,7 @@ void KX_ObstacleSimulationTOI::AdjustObstacleVelocity(KX_Obstacle* activeObst, K float htmin,htmax; - if (ob->m_type == KX_OBSTACLE_CIRCLE) + if (ob->m_shape == KX_OBSTACLE_CIRCLE) { MT_Vector2 vab; if (ob->m_vel.length2() < 0.01f*0.01f) @@ -424,10 +436,19 @@ void KX_ObstacleSimulationTOI::AdjustObstacleVelocity(KX_Obstacle* activeObst, K vab, ob->m_pos, ob->m_rad, htmin, htmax)) continue; } - else if (ob->m_type == KX_OBSTACLE_SEGMENT) + else if (ob->m_shape == KX_OBSTACLE_SEGMENT) { + MT_Point3 p1 = ob->m_pos; + MT_Point3 p2 = ob->m_pos2; + //apply world transform + if (ob->m_type == KX_OBSTACLE_NAV_MESH) + { + KX_NavMeshObject* navmeshobj = static_cast(ob->m_gameObj); + p1 = navmeshobj->TransformToWorldCoords(p1); + p2 = navmeshobj->TransformToWorldCoords(p2); + } if (!sweepCircleSegment(activeObst->m_pos, activeObst->m_rad, svel, - ob->m_pos, ob->m_pos2, ob->m_rad, htmin, htmax)) + p1, p2, ob->m_rad, htmin, htmax)) continue; } diff --git a/source/gameengine/Ketsji/KX_ObstacleSimulation.h b/source/gameengine/Ketsji/KX_ObstacleSimulation.h index 4b323035823..c5b9a154c3b 100644 --- a/source/gameengine/Ketsji/KX_ObstacleSimulation.h +++ b/source/gameengine/Ketsji/KX_ObstacleSimulation.h @@ -75,7 +75,7 @@ protected: MT_Scalar m_levelHeight; - virtual KX_Obstacle* CreateObstacle(); + virtual KX_Obstacle* CreateObstacle(KX_GameObject* gameobj); bool FilterObstacle(KX_Obstacle* activeObstacle, KX_NavMeshObject* activeNavMeshObj, KX_Obstacle* otherObstacle); public: KX_ObstacleSimulation(MT_Scalar levelHeight); @@ -84,7 +84,7 @@ public: void DrawObstacles(); void AddObstacleForObj(KX_GameObject* gameobj); - void DestroyObstacle(KX_Obstacle* obstacle); + void DestroyObstacleForObj(KX_GameObject* gameobj); void AddObstaclesForNavMesh(KX_NavMeshObject* navmesh); KX_Obstacle* GetObstacle(KX_GameObject* gameobj); void UpdateObstacles(); @@ -115,7 +115,7 @@ protected: float m_collisionWeight; // Sample selection collision weight std::vector m_toiCircles; // TOI circles (one per active agent) - virtual KX_Obstacle* CreateObstacle(); + virtual KX_Obstacle* CreateObstacle(KX_GameObject* gameobj); public: KX_ObstacleSimulationTOI(MT_Scalar levelHeight); ~KX_ObstacleSimulationTOI(); From b17f90b22ce72e33769703bde7ed67bf5bce8709 Mon Sep 17 00:00:00 2001 From: Nick Samarin Date: Wed, 14 Jul 2010 13:20:13 +0000 Subject: [PATCH 020/182] - fixed bugs with unique vertices of detailed mesh in generation and conversion of navigation mesh - set default physic type and name for navigation mesh object --- .../blender/editors/ED_editors.vcproj | 2 +- .../blender/modifiers/modifiers.vcproj | 2 +- .../blender/editors/object/object_navmesh.cpp | 8 ++- source/gameengine/Ketsji/KX_NavMeshObject.cpp | 50 ++++++++++++++++--- 4 files changed, 52 insertions(+), 10 deletions(-) diff --git a/projectfiles_vc9/blender/editors/ED_editors.vcproj b/projectfiles_vc9/blender/editors/ED_editors.vcproj index be74ade6768..14aceb6d6e0 100644 --- a/projectfiles_vc9/blender/editors/ED_editors.vcproj +++ b/projectfiles_vc9/blender/editors/ED_editors.vcproj @@ -44,7 +44,7 @@ Name="VCCLCompilerTool" Optimization="2" InlineFunctionExpansion="1" - AdditionalIncludeDirectories="..\..\..\..\lib\windows\QTDevWin\CIncludes;..\..\..\..\lib\windows\sdl\include;..\..\..\..\lib\windows\python\include\python2.6;..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\ghost\include;..\..\..\..\build\msvc_9\intern\elbeem\include;..\..\..\..\build\msvc_9\intern\opennl\include;..\..\..\..\build\msvc_9\intern\bmfont\include;..\..\..\..\build\msvc_9\intern\blenkey\include;..\..\..\..\build\msvc_9\intern\decimation\include;..\..\..\..\build\msvc_9\intern\memutil\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\smoke\include;..\..\..\..\build\msvc_9\intern\soundsystem\include;..\..\..\source\blender;..\..\..\source\blender\img;..\..\..\source\blender\verify;..\..\..\source\blender\ftfont;..\..\..\source\blender\misc;..\..\..\source\blender\imbuf;..\..\..\source\blender\blenlib;..\..\..\source\blender\python;..\..\..\source\blender\editors\include;..\..\..\source\blender\editors\interface;..\..\..\source\blender\renderui;..\..\..\source\blender\blenloader;..\..\..\source\blender\quicktime;..\..\..\source\blender\blenkernel;..\..\..\source\blender\blenfont;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\nodes;..\..\..\source\blender\windowmanager;..\..\..\source\blender\blenpluginapi;..\..\..\source\blender\renderconverter;..\..\..\source\blender\readstreamglue;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\radiosity\extern\include;..\..\..\source\kernel\gen_system;..\..\..\source\gameengine\network;..\..\..\source\gameengine\soundsystem\snd_openal;..\..\..\..\build\msvc_9\extern\verse\include;..\..\..\..\lib\windows\pthreads\include;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\source\blender\gpu;..\..\..\intern\audaspace\intern;..\..\..\source\blender\ikplugin;..\..\..\..\lib\windows\openal\include;..\..\..\..\lib\windows\jack\include" + AdditionalIncludeDirectories="..\..\..\..\lib\windows\QTDevWin\CIncludes;..\..\..\..\lib\windows\sdl\include;..\..\..\..\lib\windows\python\include\python2.6;..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\ghost\include;..\..\..\..\build\msvc_9\intern\elbeem\include;..\..\..\..\build\msvc_9\intern\opennl\include;..\..\..\..\build\msvc_9\intern\bmfont\include;..\..\..\..\build\msvc_9\intern\blenkey\include;..\..\..\..\build\msvc_9\intern\decimation\include;..\..\..\..\build\msvc_9\intern\memutil\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\smoke\include;..\..\..\..\build\msvc_9\intern\soundsystem\include;..\..\..\source\blender;..\..\..\source\blender\img;..\..\..\source\blender\verify;..\..\..\source\blender\ftfont;..\..\..\source\blender\misc;..\..\..\source\blender\imbuf;..\..\..\source\blender\blenlib;..\..\..\source\blender\python;..\..\..\source\blender\editors\include;..\..\..\source\blender\editors\interface;..\..\..\source\blender\renderui;..\..\..\source\blender\blenloader;..\..\..\source\blender\quicktime;..\..\..\source\blender\blenkernel;..\..\..\source\blender\blenfont;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\nodes;..\..\..\source\blender\windowmanager;..\..\..\source\blender\blenpluginapi;..\..\..\source\blender\renderconverter;..\..\..\source\blender\readstreamglue;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\radiosity\extern\include;..\..\..\source\kernel\gen_system;..\..\..\source\gameengine\network;..\..\..\source\gameengine\soundsystem\snd_openal;..\..\..\..\build\msvc_9\extern\verse\include;..\..\..\..\lib\windows\pthreads\include;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\source\blender\gpu;..\..\..\intern\audaspace\intern;..\..\..\source\blender\ikplugin;..\..\..\..\lib\windows\openal\include;..\..\..\..\lib\windows\jack\include;..\..\..\..\build\msvc_9\extern\recastnavigation\Recast\Include" PreprocessorDefinitions="NDEBUG;WIN32;_LIB;_CONSOLE;GAMEBLENDER=1;WITH_QUICKTIME;INTERNATIONAL;WITH_FREETYPE2;WITH_INTERNATIONAL;WITH_OPENEXR;WITH_DDS;WITH_BULLET=1;WITH_FFMPEG;WITH_SDL;WITH_OPENAL;WITH_JACK" StringPooling="true" RuntimeLibrary="0" diff --git a/projectfiles_vc9/blender/modifiers/modifiers.vcproj b/projectfiles_vc9/blender/modifiers/modifiers.vcproj index a61f0f3fc72..f47c3ec00ca 100644 --- a/projectfiles_vc9/blender/modifiers/modifiers.vcproj +++ b/projectfiles_vc9/blender/modifiers/modifiers.vcproj @@ -253,7 +253,7 @@ verts[vbase + j]); + copy_v3_v3(co, &dmesh->verts[3*(vbase + j)]); SWAP(float, co[1], co[2]); addvertlist(em, co, NULL); } @@ -386,6 +387,11 @@ static Object* createRepresentation(bContext *C, rcPolyMesh*& pmesh, rcPolyMeshD ED_object_exit_editmode(C, EM_FREEDATA); WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, obedit); + + obedit->gameflag &= ~OB_COLLISION; + obedit->gameflag |= OB_NAVMESH; + obedit->body_type = OB_BODY_TYPE_NAVMESH; + rename_id((ID *)obedit, "Navmesh"); return obedit; } diff --git a/source/gameengine/Ketsji/KX_NavMeshObject.cpp b/source/gameengine/Ketsji/KX_NavMeshObject.cpp index 061d1876786..17e5cf9841f 100644 --- a/source/gameengine/Ketsji/KX_NavMeshObject.cpp +++ b/source/gameengine/Ketsji/KX_NavMeshObject.cpp @@ -70,6 +70,24 @@ inline void flipAxes(float* vec) std::swap(vec[1],vec[2]); } +static float distPointToSegmentSq(const float* point, const float* a, const float* b) +{ + float abx[3], dx[3]; + vsub(abx, b,a); + vsub(dx, point,a); + float d = abx[0]*abx[0]+abx[1]*abx[1]; + float t = abx[0]*dx[0]+abx[1]*dx[1]; + if (d > 0) + t /= d; + if (t < 0) + t = 0; + else if (t > 1) + t = 1; + dx[0] = a[0] + t*abx[0] - point[0]; + dx[1] = a[1] + t*abx[1] - point[1]; + return dx[0]*dx[0] + dx[1]*dx[1]; +} + KX_NavMeshObject::KX_NavMeshObject(void* sgReplicationInfo, SG_Callbacks callbacks) : KX_GameObject(sgReplicationInfo, callbacks) , m_navMesh(NULL) @@ -177,7 +195,7 @@ bool KX_NavMeshObject::BuildVertIndArrays(RAS_MeshObject* meshobj, float *&verti for (int polyidx=0; polyidx poly; + vector poly, tempPoly; //search border int btri = -1; int bedge = -1; @@ -239,8 +257,20 @@ bool KX_NavMeshObject::BuildVertIndArrays(RAS_MeshObject* meshobj, float *&verti } } - //.todo: process poly to remove degenerate vertices - if (poly.size()>=vertsPerPoly) + size_t nv = poly.size(); + for (size_t i=0; itolerance) + tempPoly.push_back(cur); + } + poly = tempPoly; + + if (poly.size()>vertsPerPoly) { printf("Error! Polygon size exceeds max verts count"); return false; @@ -254,7 +284,6 @@ bool KX_NavMeshObject::BuildVertIndArrays(RAS_MeshObject* meshobj, float *&verti //assumption: vertices in mesh are stored in following order: //navigation mesh vertices - unique detailed mesh vertex - unsigned short maxidx = 0; for (int polyidx=0; polyidx0) + dmesh[0] -= nverts; } } else @@ -434,6 +465,11 @@ bool KX_NavMeshObject::BuildNavMesh() { flipAxes(&vertices[i*3]); } + for (int i=0; i Date: Wed, 14 Jul 2010 20:09:04 +0000 Subject: [PATCH 021/182] - set default value for level height params - added flag OPTYPE_UNDO for navmesh operator to enable undo operation --- source/blender/blenloader/intern/readfile.c | 8 +++++--- source/blender/editors/object/object_navmesh.cpp | 3 +++ source/blender/modifiers/intern/MOD_navmesh.cpp | 3 ++- source/gameengine/Ketsji/KX_NavMeshObject.cpp | 2 +- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 41be9460747..1584d255caa 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -10958,13 +10958,15 @@ static void do_versions(FileData *fd, Library *lib, Main *main) tex->saturation= 1.0f; } - //set defaults for recast data + //set defaults for obstacle avoidance, recast data { Scene *sce; for(sce = main->scene.first; sce; sce = sce->id.next) { - if(sce->unit.scale_length == 0.0f) - sce->unit.scale_length= 1.0f; + + if (sce->gm.levelHeight == 0.f) + sce->gm.levelHeight = 2.f; + if(sce->gm.recastData.cellsize == 0.0f) sce->gm.recastData.cellsize = 0.3f; if(sce->gm.recastData.cellheight == 0.0f) diff --git a/source/blender/editors/object/object_navmesh.cpp b/source/blender/editors/object/object_navmesh.cpp index 14e0fc75498..c357581ee3d 100644 --- a/source/blender/editors/object/object_navmesh.cpp +++ b/source/blender/editors/object/object_navmesh.cpp @@ -426,5 +426,8 @@ void OBJECT_OT_create_navmesh(wmOperatorType *ot) /* api callbacks */ ot->exec= create_navmesh_exec; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } } diff --git a/source/blender/modifiers/intern/MOD_navmesh.cpp b/source/blender/modifiers/intern/MOD_navmesh.cpp index 1bd08dcc9c0..d8d6ac4e618 100644 --- a/source/blender/modifiers/intern/MOD_navmesh.cpp +++ b/source/blender/modifiers/intern/MOD_navmesh.cpp @@ -426,8 +426,9 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der NavMeshModifierData *nmmd = (NavMeshModifierData*) md; + //for test - result = testCreateNavMesh(nmmd, derivedData); + //result = testCreateNavMesh(nmmd, derivedData); //result = buildNavMesh(nmmd, derivedData); return result; diff --git a/source/gameengine/Ketsji/KX_NavMeshObject.cpp b/source/gameengine/Ketsji/KX_NavMeshObject.cpp index 17e5cf9841f..b4e2c753832 100644 --- a/source/gameengine/Ketsji/KX_NavMeshObject.cpp +++ b/source/gameengine/Ketsji/KX_NavMeshObject.cpp @@ -646,7 +646,7 @@ void KX_NavMeshObject::DrawNavMesh() for (int i = 0, j = (int)poly->nv-1; i < (int)poly->nv; j = i++) { - if (poly->n[j] && renderMode==DETAILED_TRIS) + if (poly->n[j] && renderMode==WALLS) continue; const float* vif = m_navMesh->getVertex(poly->v[i]); const float* vjf = m_navMesh->getVertex(poly->v[j]); From 0fbca1dc19afaa034377d5aeed10fa8c25e2a102 Mon Sep 17 00:00:00 2001 From: Nick Samarin Date: Thu, 15 Jul 2010 18:41:29 +0000 Subject: [PATCH 022/182] - added options to enable visualization for obstacle simulation and steering actuator - added python attributes for parameters of steering actuator --- release/scripts/ui/properties_game.py | 3 +- source/blender/blenlib/BLI_math_vector.h | 2 +- .../blenlib/intern/math_vector_inline.c | 2 +- .../editors/space_logic/logic_window.c | 4 ++ source/blender/makesdna/DNA_actuator_types.h | 1 + source/blender/makesdna/DNA_scene_types.h | 1 + source/blender/makesrna/intern/rna_actuator.c | 5 ++ source/blender/makesrna/intern/rna_scene.c | 4 ++ .../Converter/KX_ConvertActuators.cpp | 3 +- source/gameengine/Ketsji/KX_NavMeshObject.cpp | 48 ++++++++++--- source/gameengine/Ketsji/KX_NavMeshObject.h | 7 +- .../Ketsji/KX_ObstacleSimulation.cpp | 9 ++- .../gameengine/Ketsji/KX_ObstacleSimulation.h | 5 +- source/gameengine/Ketsji/KX_Scene.cpp | 5 +- .../gameengine/Ketsji/KX_SteeringActuator.cpp | 68 +++++++++++++++---- .../gameengine/Ketsji/KX_SteeringActuator.h | 23 ++++--- 16 files changed, 144 insertions(+), 46 deletions(-) diff --git a/release/scripts/ui/properties_game.py b/release/scripts/ui/properties_game.py index 964a8076534..e581d7f1e3c 100644 --- a/release/scripts/ui/properties_game.py +++ b/release/scripts/ui/properties_game.py @@ -557,7 +557,8 @@ class WORLD_PT_game_physics_obstacles(WorldButtonsPanel): layout.prop(gs, "obstacle_simulation", text = "Type") if gs.obstacle_simulation != 'None': - layout.prop(gs, "level_height", text="Level height") + layout.prop(gs, "level_height") + layout.prop(gs, "show_obstacle_simulation") classes = [ diff --git a/source/blender/blenlib/BLI_math_vector.h b/source/blender/blenlib/BLI_math_vector.h index 02d5fb27dc9..e27b71f9301 100644 --- a/source/blender/blenlib/BLI_math_vector.h +++ b/source/blender/blenlib/BLI_math_vector.h @@ -121,7 +121,7 @@ void mid_v3_v3v3(float r[3], float a[3], float b[3]); MINLINE int is_zero_v3(float a[3]); MINLINE int is_one_v3(float a[3]); -MINLINE int equals_v3v3(float a[3], float b[3]); +MINLINE int equals_v3v3(const float a[3],const float b[3]); MINLINE int compare_v3v3(float a[3], float b[3], float limit); MINLINE int compare_len_v3v3(float a[3], float b[3], float limit); diff --git a/source/blender/blenlib/intern/math_vector_inline.c b/source/blender/blenlib/intern/math_vector_inline.c index fa8d1a30269..aa72be4fcc2 100644 --- a/source/blender/blenlib/intern/math_vector_inline.c +++ b/source/blender/blenlib/intern/math_vector_inline.c @@ -404,7 +404,7 @@ MINLINE int is_one_v3(float *v) return (v[0] == 1 && v[1] == 1 && v[2] == 1); } -MINLINE int equals_v3v3(float *v1, float *v2) +MINLINE int equals_v3v3(const float *v1,const float *v2) { return ((v1[0]==v2[0]) && (v1[1]==v2[1]) && (v1[2]==v2[2])); } diff --git a/source/blender/editors/space_logic/logic_window.c b/source/blender/editors/space_logic/logic_window.c index 8a011184f0d..22921f41ae9 100644 --- a/source/blender/editors/space_logic/logic_window.c +++ b/source/blender/editors/space_logic/logic_window.c @@ -4324,7 +4324,11 @@ static void draw_actuator_steering(uiLayout *layout, PointerRNA *ptr) row = uiLayoutRow(layout, 0); uiItemR(row, ptr, "selfterminated", 0, NULL, 0); if (RNA_enum_get(ptr, "mode")==ACT_STEERING_PATHFOLLOWING) + { uiItemR(row, ptr, "updateperiod", 0, NULL, 0); + row = uiLayoutRow(layout, 0); + } + uiItemR(row, ptr, "enablevisualization", 0, NULL, 0); } diff --git a/source/blender/makesdna/DNA_actuator_types.h b/source/blender/makesdna/DNA_actuator_types.h index 9d26632769b..f3e8dc93cfd 100644 --- a/source/blender/makesdna/DNA_actuator_types.h +++ b/source/blender/makesdna/DNA_actuator_types.h @@ -522,6 +522,7 @@ typedef struct FreeCamera { #define ACT_STEERING_PATHFOLLOWING 2 /* steeringactuator->flag */ #define ACT_STEERING_SELFTERMINATED 1 +#define ACT_STEERING_ENABLEVISUALIZATION 2 #endif diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index 2fa08c663c1..72044513300 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -516,6 +516,7 @@ typedef struct GameData { #define GAME_GLSL_NO_EXTRA_TEX (1 << 11) #define GAME_IGNORE_DEPRECATION_WARNINGS (1 << 12) #define GAME_ENABLE_ANIMATION_RECORD (1 << 13) +#define GAME_SHOW_OBSTACLE_SIMULATION (1 << 14) /* GameData.matmode */ #define GAME_MAT_TEXFACE 0 diff --git a/source/blender/makesrna/intern/rna_actuator.c b/source/blender/makesrna/intern/rna_actuator.c index b78eb766151..fdd017873e7 100644 --- a/source/blender/makesrna/intern/rna_actuator.c +++ b/source/blender/makesrna/intern/rna_actuator.c @@ -1926,6 +1926,11 @@ static void rna_def_steering_actuator(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Self terminated", "Terminate when target is reached"); RNA_def_property_update(prop, NC_LOGIC, NULL); + prop= RNA_def_property(srna, "enablevisualization", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_STEERING_ENABLEVISUALIZATION); + RNA_def_property_ui_text(prop, "Visualize", "Enable debug visualization"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + prop= RNA_def_property(srna, "updateperiod", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "updateTime"); RNA_def_property_ui_range(prop, -1, 100000, 1, 1); diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 23b4596828c..3dc10530242 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -1862,6 +1862,10 @@ static void rna_def_scene_game_data(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Level height", "Max difference in heights of obstacles to enable their interaction"); RNA_def_property_update(prop, NC_SCENE, NULL); + prop= RNA_def_property(srna, "show_obstacle_simulation", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", GAME_SHOW_OBSTACLE_SIMULATION); + RNA_def_property_ui_text(prop, "Visualization", "Enable debug visualization for obstacle simulation"); + /* Recast Settings */ prop= RNA_def_property(srna, "recast_data", PROP_POINTER, PROP_NONE); RNA_def_property_flag(prop, PROP_NEVER_NULL); diff --git a/source/gameengine/Converter/KX_ConvertActuators.cpp b/source/gameengine/Converter/KX_ConvertActuators.cpp index e5c39da1545..2c6dab910d8 100644 --- a/source/gameengine/Converter/KX_ConvertActuators.cpp +++ b/source/gameengine/Converter/KX_ConvertActuators.cpp @@ -1058,11 +1058,12 @@ void BL_ConvertActuators(char* maggiename, } bool selfTerminated = (stAct->flag & ACT_STEERING_SELFTERMINATED) !=0; + bool enableVisualization = (stAct->flag & ACT_STEERING_ENABLEVISUALIZATION) !=0; KX_SteeringActuator *tmpstact = new KX_SteeringActuator(gameobj, mode, targetob, navmeshob,stAct->dist, stAct->velocity, stAct->acceleration, stAct->turnspeed, selfTerminated, stAct->updateTime, - scene->GetObstacleSimulation()); + scene->GetObstacleSimulation(), enableVisualization); baseact = tmpstact; break; } diff --git a/source/gameengine/Ketsji/KX_NavMeshObject.cpp b/source/gameengine/Ketsji/KX_NavMeshObject.cpp index b4e2c753832..63d84d0c028 100644 --- a/source/gameengine/Ketsji/KX_NavMeshObject.cpp +++ b/source/gameengine/Ketsji/KX_NavMeshObject.cpp @@ -446,6 +446,13 @@ bool KX_NavMeshObject::BuildVertIndArrays(RAS_MeshObject* meshobj, float *&verti bool KX_NavMeshObject::BuildNavMesh() { + if (m_navMesh) + { + delete m_navMesh; + m_navMesh = NULL; + } + + if (GetMeshCount()==0) return false; @@ -628,25 +635,23 @@ dtStatNavMesh* KX_NavMeshObject::GetNavMesh() return m_navMesh; } -void KX_NavMeshObject::DrawNavMesh() +void KX_NavMeshObject::DrawNavMesh(NavMeshRenderMode renderMode) { if (!m_navMesh) return; MT_Vector3 color(0.f, 0.f, 0.f); - enum RenderMode {POLYS ,DETAILED_TRIS, WALLS}; - static const RenderMode renderMode = DETAILED_TRIS;// DETAILED_TRIS POLYS switch (renderMode) { - case POLYS : - case WALLS : + case RM_POLYS : + case RM_WALLS : for (int pi=0; pigetPolyCount(); pi++) { const dtStatPoly* poly = m_navMesh->getPoly(pi); for (int i = 0, j = (int)poly->nv-1; i < (int)poly->nv; j = i++) { - if (poly->n[j] && renderMode==WALLS) + if (poly->n[j] && renderMode==RM_WALLS) continue; const float* vif = m_navMesh->getVertex(poly->v[i]); const float* vjf = m_navMesh->getVertex(poly->v[j]); @@ -658,7 +663,7 @@ void KX_NavMeshObject::DrawNavMesh() } } break; - case DETAILED_TRIS : + case RM_TRIS : for (int i = 0; i < m_navMesh->getPolyDetailCount(); ++i) { const dtStatPoly* p = m_navMesh->getPoly(i); @@ -800,7 +805,7 @@ PyTypeObject KX_NavMeshObject::Type = { Methods, 0, 0, - &CValue::Type, + &KX_GameObject::Type, 0,0,0,0,0,0, py_base_new }; @@ -814,6 +819,7 @@ PyMethodDef KX_NavMeshObject::Methods[] = { KX_PYMETHODTABLE(KX_NavMeshObject, findPath), KX_PYMETHODTABLE(KX_NavMeshObject, raycast), KX_PYMETHODTABLE(KX_NavMeshObject, draw), + KX_PYMETHODTABLE(KX_NavMeshObject, rebuild), {NULL,NULL} //Sentinel }; @@ -854,10 +860,30 @@ KX_PYMETHODDEF_DOC(KX_NavMeshObject, raycast, return PyFloat_FromDouble(hit); } -KX_PYMETHODDEF_DOC_NOARGS(KX_NavMeshObject, draw, - "draw(): navigation mesh debug drawing\n") +KX_PYMETHODDEF_DOC(KX_NavMeshObject, draw, + "draw(mode): navigation mesh debug drawing\n" + "mode: WALLS, POLYS, TRIS\n") { - DrawNavMesh(); + char* mode; + NavMeshRenderMode renderMode = RM_TRIS; + if (PyArg_ParseTuple(args,"s:rebuild",&mode)) + { + STR_String mode_str(mode); + if (mode_str.IsEqualNoCase("WALLS")) + renderMode = RM_WALLS; + else if (mode_str.IsEqualNoCase("POLYS")) + renderMode = RM_POLYS; + else if (mode_str.IsEqualNoCase("TRIS")) + renderMode = RM_TRIS; + } + DrawNavMesh(renderMode); + Py_RETURN_NONE; +} + +KX_PYMETHODDEF_DOC_NOARGS(KX_NavMeshObject, rebuild, + "rebuild(): rebuild navigation mesh\n") +{ + BuildNavMesh(); Py_RETURN_NONE; } diff --git a/source/gameengine/Ketsji/KX_NavMeshObject.h b/source/gameengine/Ketsji/KX_NavMeshObject.h index f06cd3b455d..d7b0fe033c2 100644 --- a/source/gameengine/Ketsji/KX_NavMeshObject.h +++ b/source/gameengine/Ketsji/KX_NavMeshObject.h @@ -60,7 +60,9 @@ public: dtStatNavMesh* GetNavMesh(); int FindPath(const MT_Point3& from, const MT_Point3& to, float* path, int maxPathLen); float Raycast(const MT_Point3& from, const MT_Point3& to); - void DrawNavMesh(); + + enum NavMeshRenderMode {RM_WALLS, RM_POLYS, RM_TRIS}; + void DrawNavMesh(NavMeshRenderMode mode); void DrawPath(const float *path, int pathLen, const MT_Vector3& color); MT_Point3 TransformToLocalCoords(const MT_Point3& wpos); @@ -72,7 +74,8 @@ public: KX_PYMETHOD_DOC(KX_NavMeshObject, findPath); KX_PYMETHOD_DOC(KX_NavMeshObject, raycast); - KX_PYMETHOD_DOC_NOARGS(KX_NavMeshObject, draw); + KX_PYMETHOD_DOC(KX_NavMeshObject, draw); + KX_PYMETHOD_DOC_NOARGS(KX_NavMeshObject, rebuild); #endif }; diff --git a/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp b/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp index 14487a2e75c..dcaadd23e3f 100644 --- a/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp +++ b/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp @@ -166,8 +166,9 @@ static float interpolateToi(float a, const float* dir, const float* toi, const i return 0; } -KX_ObstacleSimulation::KX_ObstacleSimulation(MT_Scalar levelHeight) +KX_ObstacleSimulation::KX_ObstacleSimulation(MT_Scalar levelHeight, bool enableVisualization) : m_levelHeight(levelHeight) +, m_enableVisualization(enableVisualization) { } @@ -276,6 +277,8 @@ void KX_ObstacleSimulation::AdjustObstacleVelocity(KX_Obstacle* activeObst, KX_N void KX_ObstacleSimulation::DrawObstacles() { + if (!m_enableVisualization) + return; static const MT_Vector3 bluecolor(0,0,1); static const MT_Vector3 normal(0.,0.,1.); static const int SECTORS_NUM = 32; @@ -341,8 +344,8 @@ bool KX_ObstacleSimulation::FilterObstacle(KX_Obstacle* activeObst, KX_NavMeshOb return true; } -KX_ObstacleSimulationTOI::KX_ObstacleSimulationTOI(MT_Scalar levelHeight): - KX_ObstacleSimulation(levelHeight), +KX_ObstacleSimulationTOI::KX_ObstacleSimulationTOI(MT_Scalar levelHeight, bool enableVisualization): + KX_ObstacleSimulation(levelHeight, enableVisualization), m_avoidSteps(32), m_minToi(0.5f), m_maxToi(1.2f), diff --git a/source/gameengine/Ketsji/KX_ObstacleSimulation.h b/source/gameengine/Ketsji/KX_ObstacleSimulation.h index c5b9a154c3b..b084f54d3b8 100644 --- a/source/gameengine/Ketsji/KX_ObstacleSimulation.h +++ b/source/gameengine/Ketsji/KX_ObstacleSimulation.h @@ -74,11 +74,12 @@ protected: std::vector m_obstacles; MT_Scalar m_levelHeight; + bool m_enableVisualization; virtual KX_Obstacle* CreateObstacle(KX_GameObject* gameobj); bool FilterObstacle(KX_Obstacle* activeObstacle, KX_NavMeshObject* activeNavMeshObj, KX_Obstacle* otherObstacle); public: - KX_ObstacleSimulation(MT_Scalar levelHeight); + KX_ObstacleSimulation(MT_Scalar levelHeight, bool enableVisualization); virtual ~KX_ObstacleSimulation(); void DrawObstacles(); @@ -117,7 +118,7 @@ protected: std::vector m_toiCircles; // TOI circles (one per active agent) virtual KX_Obstacle* CreateObstacle(KX_GameObject* gameobj); public: - KX_ObstacleSimulationTOI(MT_Scalar levelHeight); + KX_ObstacleSimulationTOI(MT_Scalar levelHeight, bool enableVisualization); ~KX_ObstacleSimulationTOI(); virtual void AdjustObstacleVelocity(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj, MT_Vector3& velocity, MT_Scalar maxDeltaSpeed,MT_Scalar maxDeltaAngle); diff --git a/source/gameengine/Ketsji/KX_Scene.cpp b/source/gameengine/Ketsji/KX_Scene.cpp index 950b1ea793d..5c002de6358 100644 --- a/source/gameengine/Ketsji/KX_Scene.cpp +++ b/source/gameengine/Ketsji/KX_Scene.cpp @@ -210,11 +210,12 @@ KX_Scene::KX_Scene(class SCA_IInputDevice* keyboarddevice, m_rootnode = NULL; m_bucketmanager=new RAS_BucketManager(); - + bool showObstacleSimulation = scene->gm.flag & GAME_SHOW_OBSTACLE_SIMULATION; switch (scene->gm.obstacleSimulation) { case OBSTSIMULATION_TOI: - m_obstacleSimulation = new KX_ObstacleSimulationTOI((MT_Scalar)scene->gm.levelHeight); + + m_obstacleSimulation = new KX_ObstacleSimulationTOI((MT_Scalar)scene->gm.levelHeight, showObstacleSimulation); break; default: m_obstacleSimulation = NULL; diff --git a/source/gameengine/Ketsji/KX_SteeringActuator.cpp b/source/gameengine/Ketsji/KX_SteeringActuator.cpp index b733fc79dee..2153227f0c6 100644 --- a/source/gameengine/Ketsji/KX_SteeringActuator.cpp +++ b/source/gameengine/Ketsji/KX_SteeringActuator.cpp @@ -48,13 +48,14 @@ KX_SteeringActuator::KX_SteeringActuator(SCA_IObject *gameobj, int mode, KX_GameObject *target, KX_GameObject *navmesh, - MT_Scalar distance, - MT_Scalar velocity, - MT_Scalar acceleration, - MT_Scalar turnspeed, + float distance, + float velocity, + float acceleration, + float turnspeed, bool isSelfTerminated, int pathUpdatePeriod, - KX_ObstacleSimulation* simulation) : + KX_ObstacleSimulation* simulation, + bool enableVisualization) : SCA_IActuator(gameobj, KX_ACT_STEERING), m_mode(mode), m_target(target), @@ -67,6 +68,7 @@ KX_SteeringActuator::KX_SteeringActuator(SCA_IObject *gameobj, m_updateTime(0), m_isActive(false), m_simulation(simulation), + m_enableVisualization(enableVisualization), m_obstacle(NULL), m_pathLen(0), m_wayPointIdx(-1) @@ -111,13 +113,11 @@ bool KX_SteeringActuator::UnlinkObject(SCA_IObject* clientobj) { if (clientobj == m_target) { - // this object is being deleted, we cannot continue to use it. m_target = NULL; return true; } else if (clientobj == m_navmesh) { - // this object is being deleted, we cannot continue to useit. m_navmesh = NULL; return true; } @@ -229,10 +229,13 @@ bool KX_SteeringActuator::Update(double curtime, bool frame) steervec = waypoint - mypos; apply_steerforce = true; - //debug draw - static const MT_Vector3 PATH_COLOR(1,0,0); - m_navmesh->DrawPath(m_path, m_pathLen, PATH_COLOR); - + + if (m_enableVisualization) + { + //debug draw + static const MT_Vector3 PATH_COLOR(1,0,0); + m_navmesh->DrawPath(m_path, m_pathLen, PATH_COLOR); + } } } @@ -251,10 +254,12 @@ bool KX_SteeringActuator::Update(double curtime, bool frame) //adjust velocity to avoid obstacles if (m_simulation && m_obstacle && !newvel.fuzzyZero()) { - KX_RasterizerDrawDebugLine(mypos, mypos + newvel, MT_Vector3(1.,0.,0.)); + if (m_enableVisualization) + KX_RasterizerDrawDebugLine(mypos, mypos + newvel, MT_Vector3(1.,0.,0.)); m_simulation->AdjustObstacleVelocity(m_obstacle, m_mode!=KX_STEERING_PATHFOLLOWING ? m_navmesh : NULL, newvel, m_acceleration*delta, m_turnspeed/180.0f*M_PI*delta); - KX_RasterizerDrawDebugLine(mypos, mypos + newvel, MT_Vector3(0.,1.,0.)); + if (m_enableVisualization) + KX_RasterizerDrawDebugLine(mypos, mypos + newvel, MT_Vector3(0.,1.,0.)); } if (isdyna) @@ -313,7 +318,16 @@ PyMethodDef KX_SteeringActuator::Methods[] = { }; PyAttributeDef KX_SteeringActuator::Attributes[] = { + KX_PYATTRIBUTE_INT_RW("bevaiour", KX_STEERING_NODEF+1, KX_STEERING_MAX-1, true, KX_SteeringActuator, m_mode), KX_PYATTRIBUTE_RW_FUNCTION("target", KX_SteeringActuator, pyattr_get_target, pyattr_set_target), + KX_PYATTRIBUTE_RW_FUNCTION("navmesh", KX_SteeringActuator, pyattr_get_navmesh, pyattr_set_navmesh), + KX_PYATTRIBUTE_FLOAT_RW("distance", 0.0f, 1000.0f, KX_SteeringActuator, m_distance), + KX_PYATTRIBUTE_FLOAT_RW("velocity", 0.0f, 1000.0f, KX_SteeringActuator, m_velocity), + KX_PYATTRIBUTE_FLOAT_RW("acceleration", 0.0f, 1000.0f, KX_SteeringActuator, m_acceleration), + KX_PYATTRIBUTE_FLOAT_RW("turnspeed", 0.0f, 720.0f, KX_SteeringActuator, m_turnspeed), + KX_PYATTRIBUTE_BOOL_RW("selfterminated", KX_SteeringActuator, m_isSelfTerminated), + KX_PYATTRIBUTE_BOOL_RW("enableVisualization", KX_SteeringActuator, m_enableVisualization), + KX_PYATTRIBUTE_INT_RW("pathUpdatePeriod", -1, 100000, true, KX_SteeringActuator, m_pathUpdatePeriod), { NULL } //Sentinel }; @@ -345,6 +359,34 @@ int KX_SteeringActuator::pyattr_set_target(void *self, const struct KX_PYATTRIBU return PY_SET_ATTR_SUCCESS; } +PyObject* KX_SteeringActuator::pyattr_get_navmesh(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef) +{ + KX_SteeringActuator* actuator = static_cast(self); + if (!actuator->m_navmesh) + Py_RETURN_NONE; + else + return actuator->m_navmesh->GetProxy(); +} + +int KX_SteeringActuator::pyattr_set_navmesh(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value) +{ + KX_SteeringActuator* actuator = static_cast(self); + KX_GameObject *gameobj; + + if (!ConvertPythonToGameObject(value, &gameobj, true, "actuator.object = value: KX_SteeringActuator")) + return PY_SET_ATTR_FAIL; // ConvertPythonToGameObject sets the error + + if (actuator->m_navmesh != NULL) + actuator->m_navmesh->UnregisterActuator(actuator); + + actuator->m_navmesh = dynamic_cast(gameobj); + + if (actuator->m_navmesh) + actuator->m_navmesh->RegisterActuator(actuator); + + return PY_SET_ATTR_SUCCESS; +} + #endif // DISABLE_PYTHON /* eof */ diff --git a/source/gameengine/Ketsji/KX_SteeringActuator.h b/source/gameengine/Ketsji/KX_SteeringActuator.h index 5ac5a9f37c4..b07d906dba3 100644 --- a/source/gameengine/Ketsji/KX_SteeringActuator.h +++ b/source/gameengine/Ketsji/KX_SteeringActuator.h @@ -53,16 +53,17 @@ class KX_SteeringActuator : public SCA_IActuator KX_GameObject *m_target; KX_NavMeshObject *m_navmesh; int m_mode; - MT_Scalar m_distance; - MT_Scalar m_velocity; - MT_Scalar m_acceleration; - MT_Scalar m_turnspeed; + float m_distance; + float m_velocity; + float m_acceleration; + float m_turnspeed; KX_ObstacleSimulation* m_simulation; KX_Obstacle* m_obstacle; double m_updateTime; bool m_isActive; bool m_isSelfTerminated; + bool m_enableVisualization; float m_path[MAX_PATH_LENGTH*3]; int m_pathLen; int m_pathUpdatePeriod; @@ -82,13 +83,14 @@ public: int mode, KX_GameObject *target, KX_GameObject *navmesh, - MT_Scalar distance, - MT_Scalar velocity, - MT_Scalar acceleration, - MT_Scalar turnspeed, + float distance, + float velocity, + float acceleration, + float turnspeed, bool isSelfTerminated, int pathUpdatePeriod, - KX_ObstacleSimulation* simulation); + KX_ObstacleSimulation* simulation, + bool enableVisualization); virtual ~KX_SteeringActuator(); virtual bool Update(double curtime, bool frame); @@ -106,6 +108,9 @@ public: /* These are used to get and set m_target */ static PyObject* pyattr_get_target(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef); static int pyattr_set_target(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value); + static PyObject* pyattr_get_navmesh(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef); + static int pyattr_set_navmesh(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value); + #endif // DISABLE_PYTHON From d24d0afea27a8df1785bd637e45d455f8ed85933 Mon Sep 17 00:00:00 2001 From: Nick Samarin Date: Sun, 18 Jul 2010 12:46:03 +0000 Subject: [PATCH 023/182] added 'COMPAT_ENGINES' attribute to the obstacle simulation panel --- release/scripts/ui/properties_game.py | 1 + 1 file changed, 1 insertion(+) diff --git a/release/scripts/ui/properties_game.py b/release/scripts/ui/properties_game.py index e581d7f1e3c..b4285180631 100644 --- a/release/scripts/ui/properties_game.py +++ b/release/scripts/ui/properties_game.py @@ -548,6 +548,7 @@ class WORLD_PT_game_physics(WorldButtonsPanel): class WORLD_PT_game_physics_obstacles(WorldButtonsPanel): bl_label = "Obstacle simulation" + COMPAT_ENGINES = {'BLENDER_GAME'} def draw(self, context): layout = self.layout From b4b9e01f8d1d72a92df03c954063cb02b24d580e Mon Sep 17 00:00:00 2001 From: Nick Samarin Date: Tue, 20 Jul 2010 14:09:05 +0000 Subject: [PATCH 024/182] - set defaults to steering actuator parameters - fixed order of triangle indexes for navigation mesh representation --- source/blender/blenkernel/intern/sca.c | 6 ++++-- source/blender/editors/object/object_navmesh.cpp | 4 ++-- source/blender/makesrna/intern/rna_scene.c | 6 +++--- source/gameengine/Ketsji/KX_NavMeshObject.cpp | 14 +++----------- 4 files changed, 12 insertions(+), 18 deletions(-) diff --git a/source/blender/blenkernel/intern/sca.c b/source/blender/blenkernel/intern/sca.c index e98d90ddc6e..257b34cb246 100644 --- a/source/blender/blenkernel/intern/sca.c +++ b/source/blender/blenkernel/intern/sca.c @@ -468,8 +468,10 @@ void init_actuator(bActuator *act) case ACT_STEERING: act->data = MEM_callocN(sizeof( bSteeringActuator), "steering act"); sta = act->data; - sta->acceleration = 3; - sta->turnspeed = 120; + sta->acceleration = 3.f; + sta->turnspeed = 120.f; + sta->dist = 1.f; + sta->velocity= 3.f; default: ; /* this is very severe... I cannot make any memory for this */ /* logic brick... */ diff --git a/source/blender/editors/object/object_navmesh.cpp b/source/blender/editors/object/object_navmesh.cpp index c357581ee3d..9b138365ac5 100644 --- a/source/blender/editors/object/object_navmesh.cpp +++ b/source/blender/editors/object/object_navmesh.cpp @@ -365,8 +365,8 @@ static Object* createRepresentation(bContext *C, rcPolyMesh*& pmesh, rcPolyMeshD else face[k] = uniquevbase+tri[k]-nv; //unique vertex } - newFace = addfacelist(em, EM_get_vert_for_index(face[0]), EM_get_vert_for_index(face[1]), - EM_get_vert_for_index(face[2]), NULL, NULL, NULL); + newFace = addfacelist(em, EM_get_vert_for_index(face[0]), EM_get_vert_for_index(face[2]), + EM_get_vert_for_index(face[1]), NULL, NULL, NULL); //set navigation polygon idx to the custom layer int* polygonIdx = (int*)CustomData_em_get(&em->fdata, newFace->data, CD_PROP_INT); diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 3dc10530242..33dff40ae50 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -1548,12 +1548,12 @@ static void rna_def_scene_game_recast_data(BlenderRNA *brna) prop= RNA_def_property(srna, "detailsampledist", PROP_FLOAT, PROP_NONE); RNA_def_property_ui_range(prop, 0.0, 16.0, 1, 2); - RNA_def_property_ui_text(prop, "Sample Distance", "Detail mesh sample spacing"); + RNA_def_property_ui_text(prop, "Sample distance", "Detail mesh sample spacing"); RNA_def_property_update(prop, NC_SCENE, NULL); prop= RNA_def_property(srna, "detailsamplemaxerror", PROP_FLOAT, PROP_NONE); RNA_def_property_ui_range(prop, 0.0, 16.0, 1, 2); - RNA_def_property_ui_text(prop, "Max Sample Error", "Detail mesh simplification max sample error"); + RNA_def_property_ui_text(prop, "Max sample error", "Detail mesh simplification max sample error"); RNA_def_property_update(prop, NC_SCENE, NULL); } @@ -1608,7 +1608,7 @@ static void rna_def_scene_game_data(BlenderRNA *brna) static EnumPropertyItem obstacle_simulation_items[] = { {OBSTSIMULATION_NONE, "NONE", 0, "None", ""}, - {OBSTSIMULATION_TOI, "TOI", 0, "TOI", ""}, + {OBSTSIMULATION_TOI, "RVO", 0, "RVO", ""}, {0, NULL, 0, NULL, NULL}}; srna= RNA_def_struct(brna, "SceneGameData", NULL); diff --git a/source/gameengine/Ketsji/KX_NavMeshObject.cpp b/source/gameengine/Ketsji/KX_NavMeshObject.cpp index 63d84d0c028..617d556785a 100644 --- a/source/gameengine/Ketsji/KX_NavMeshObject.cpp +++ b/source/gameengine/Ketsji/KX_NavMeshObject.cpp @@ -147,7 +147,7 @@ bool KX_NavMeshObject::BuildVertIndArrays(RAS_MeshObject* meshobj, float *&verti return true; } - //build detailed mesh adjacency + //build detailed mesh adjacency (with triangle reordering) ndtris = numfaces; dtris = new unsigned short[numfaces*3*2]; memset(dtris, 0xffff, sizeof(unsigned short)*3*2*numfaces); @@ -155,8 +155,8 @@ bool KX_NavMeshObject::BuildVertIndArrays(RAS_MeshObject* meshobj, float *&verti { MFace* mf = &mface[i]; dtris[i*3*2+0] = mf->v1; - dtris[i*3*2+1] = mf->v2; - dtris[i*3*2+2] = mf->v3; + dtris[i*3*2+1] = mf->v3; + dtris[i*3*2+2] = mf->v2; } buildMeshAdjacency(dtris, numfaces, numverts, 3); @@ -477,14 +477,6 @@ bool KX_NavMeshObject::BuildNavMesh() flipAxes(&dvertices[i*3]); } -/* - //reorder tris - for (int i=0; i Date: Wed, 21 Jul 2010 09:16:27 +0000 Subject: [PATCH 025/182] - added custom get function for navmesh property of steering actuator to accept only objects with NavMesh physics type - fixed the access to KX_SteeringActuator attributes from scripts - added enum members for KX_SteeringActuator and KX_NavMeshObject to GameLogic dictionary --- source/blender/makesrna/intern/rna_actuator.c | 13 +++++++++++++ source/gameengine/Ketsji/KX_NavMeshObject.cpp | 14 +++----------- source/gameengine/Ketsji/KX_NavMeshObject.h | 2 +- source/gameengine/Ketsji/KX_PythonInit.cpp | 13 +++++++++++++ source/gameengine/Ketsji/KX_PythonInitTypes.cpp | 2 ++ source/gameengine/Ketsji/KX_SteeringActuator.cpp | 10 ++++++++-- 6 files changed, 40 insertions(+), 14 deletions(-) diff --git a/source/blender/makesrna/intern/rna_actuator.c b/source/blender/makesrna/intern/rna_actuator.c index fdd017873e7..99d85ec557c 100644 --- a/source/blender/makesrna/intern/rna_actuator.c +++ b/source/blender/makesrna/intern/rna_actuator.c @@ -441,6 +441,18 @@ static void rna_Actuator_Armature_update(Main *bmain, Scene *scene, PointerRNA * constraint[0] = 0; } +static void rna_SteeringActuator_navmesh_set(PointerRNA *ptr, PointerRNA value) +{ + bActuator *act = (bActuator*)ptr->data; + bSteeringActuator *sa = (bSteeringActuator*) act->data; + + Object* obj = value.data; + if (obj && obj->body_type==OB_BODY_TYPE_NAVMESH) + sa->navmesh = obj; + else + sa->navmesh = NULL; +} + /* note: the following set functions exists only to avoid id refcounting */ static void rna_Actuator_editobject_mesh_set(PointerRNA *ptr, PointerRNA value) { @@ -1942,6 +1954,7 @@ static void rna_def_steering_actuator(BlenderRNA *brna) RNA_def_property_pointer_sdna(prop, NULL, "navmesh"); RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "NavMesh Object", "Navigation mesh"); + RNA_def_property_pointer_funcs(prop, NULL, "rna_SteeringActuator_navmesh_set", NULL); RNA_def_property_update(prop, NC_LOGIC, NULL); } diff --git a/source/gameengine/Ketsji/KX_NavMeshObject.cpp b/source/gameengine/Ketsji/KX_NavMeshObject.cpp index 617d556785a..19e045a2745 100644 --- a/source/gameengine/Ketsji/KX_NavMeshObject.cpp +++ b/source/gameengine/Ketsji/KX_NavMeshObject.cpp @@ -856,18 +856,10 @@ KX_PYMETHODDEF_DOC(KX_NavMeshObject, draw, "draw(mode): navigation mesh debug drawing\n" "mode: WALLS, POLYS, TRIS\n") { - char* mode; + int arg; NavMeshRenderMode renderMode = RM_TRIS; - if (PyArg_ParseTuple(args,"s:rebuild",&mode)) - { - STR_String mode_str(mode); - if (mode_str.IsEqualNoCase("WALLS")) - renderMode = RM_WALLS; - else if (mode_str.IsEqualNoCase("POLYS")) - renderMode = RM_POLYS; - else if (mode_str.IsEqualNoCase("TRIS")) - renderMode = RM_TRIS; - } + if (PyArg_ParseTuple(args,"i:rebuild",&arg) && arg>=0 && argm_navmesh != NULL) actuator->m_navmesh->UnregisterActuator(actuator); - actuator->m_navmesh = dynamic_cast(gameobj); + actuator->m_navmesh = static_cast(gameobj); if (actuator->m_navmesh) actuator->m_navmesh->RegisterActuator(actuator); From b7819807b33ded7c20956c52bcaf1ee93bf428f7 Mon Sep 17 00:00:00 2001 From: Nick Samarin Date: Wed, 21 Jul 2010 19:44:59 +0000 Subject: [PATCH 026/182] implemented navigation mesh visualization via modifier --- .../scripts/ui/properties_data_modifier.py | 60 +-- source/blender/blenkernel/BKE_DerivedMesh.h | 1 + .../blender/editors/object/object_navmesh.cpp | 5 + source/blender/makesdna/DNA_modifier_types.h | 16 +- source/blender/makesrna/intern/rna_modifier.c | 66 ---- .../blender/modifiers/intern/MOD_navmesh.cpp | 358 ++++-------------- 6 files changed, 74 insertions(+), 432 deletions(-) diff --git a/release/scripts/ui/properties_data_modifier.py b/release/scripts/ui/properties_data_modifier.py index a279e3233b1..a334e16d087 100644 --- a/release/scripts/ui/properties_data_modifier.py +++ b/release/scripts/ui/properties_data_modifier.py @@ -461,65 +461,7 @@ class DATA_PT_modifiers(DataButtonsPanel): row.label() def NAVMESH(self, layout, ob, md, wide_ui): - layout.label(text="Rasterization:") - split = layout.split() - - col = split.column() - col.prop(md, "cellsize") - if wide_ui: - col = split.column() - col.prop(md, "cellheight") - - layout.separator() - - layout.label(text="Agent:") - split = layout.split() - col = split.column() - row = col.row() - row.prop(md, "agentheight") - row = col.row() - row.prop(md, "agentradius") - if wide_ui: - col = split.column() - row = col.row() - row.prop(md, "agentmaxslope") - row = col.row() - row.prop(md, "agentmaxclimb") - - layout.separator() - - layout.label(text="Region:") - split = layout.split() - col = split.column() - col.prop(md, "regionminsize") - if wide_ui: - col = split.column() - col.prop(md, "regionmergesize") - - layout.separator() - - layout.label(text="Polygonization:") - split = layout.split() - col = split.column() - row = col.row() - row.prop(md, "edgemaxlen") - row = col.row() - row.prop(md, "edgemaxerror") - if wide_ui: - col = split.column() - row = col.row() - row.prop(md, "vertsperpoly") - - layout.separator() - - layout.label(text="Detail Mesh:") - split = layout.split() - col = split.column() - col.prop(md, "detailsampledist") - if wide_ui: - col = split.column() - col.prop(md, "detailsamplemaxerror") - + layout = self.layout def PARTICLE_INSTANCE(self, layout, ob, md, wide_ui): layout.prop(md, "object") diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h index 33852a1b923..00820823270 100644 --- a/source/blender/blenkernel/BKE_DerivedMesh.h +++ b/source/blender/blenkernel/BKE_DerivedMesh.h @@ -227,6 +227,7 @@ struct DerivedMesh { * * Also called for *final* editmode DerivedMeshes */ + void (*drawEdges)(DerivedMesh *dm, int drawLooseEdges, int drawAllEdges); /* Draw all loose edges (edges w/ no adjoining faces) */ diff --git a/source/blender/editors/object/object_navmesh.cpp b/source/blender/editors/object/object_navmesh.cpp index 9b138365ac5..a5ff74ae4fd 100644 --- a/source/blender/editors/object/object_navmesh.cpp +++ b/source/blender/editors/object/object_navmesh.cpp @@ -36,6 +36,7 @@ extern "C" #include "DNA_scene_types.h" #include "DNA_object_types.h" #include "DNA_meshdata_types.h" +#include "DNA_modifier_types.h" #include "DNA_ID.h" #include "BKE_library.h" @@ -306,6 +307,7 @@ static Object* createRepresentation(bContext *C, rcPolyMesh*& pmesh, rcPolyMeshD int i,j, k, polyverts; unsigned short* v; int face[3]; + Scene *scene= CTX_data_scene(C); zero_v3(co); zero_v3(rot); @@ -392,6 +394,9 @@ static Object* createRepresentation(bContext *C, rcPolyMesh*& pmesh, rcPolyMeshD obedit->gameflag |= OB_NAVMESH; obedit->body_type = OB_BODY_TYPE_NAVMESH; rename_id((ID *)obedit, "Navmesh"); + + ED_object_modifier_add(NULL, scene, obedit, NULL, eModifierType_NavMesh); + //ModifierData *md= modifiers_findByType(ob, eModifierType_NavMesh); return obedit; } diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index d30c8d252db..2dbd2c19e50 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -727,21 +727,7 @@ typedef struct ScrewModifierData { typedef struct NavMeshModifierData { ModifierData modifier; - char pad[4]; - float cellsize; - float cellheight; - float agentmaxslope; - float agentmaxclimb; - float agentheight; - float agentradius; - float edgemaxlen; - float edgemaxerror; - float regionminsize; - float regionmergesize; - int vertsperpoly; - float detailsampledist; - float detailsamplemaxerror; - + } NavMeshModifierData; #endif diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index bcdb4709d9a..ea72b1cdcfa 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -2219,72 +2219,6 @@ static void rna_def_modifier_navmesh(BlenderRNA *brna) RNA_def_struct_sdna(srna, "NavMeshModifierData"); RNA_def_struct_ui_icon(srna, ICON_MOD_DECIM); - prop= RNA_def_property(srna, "cellsize", PROP_FLOAT, PROP_NONE); - RNA_def_property_ui_range(prop, 0.1, 1, 0.01, 2); - RNA_def_property_ui_text(prop, "Cell size", "Rasterized cell size"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop= RNA_def_property(srna, "cellheight", PROP_FLOAT, PROP_NONE); - RNA_def_property_ui_range(prop, 0.1, 1, 0.01, 2); - RNA_def_property_ui_text(prop, "Cell height", "Rasterized cell height"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop= RNA_def_property(srna, "agentheight", PROP_FLOAT, PROP_NONE); - RNA_def_property_ui_range(prop, 0.1, 5, 0.1, 2); - RNA_def_property_ui_text(prop, "Agent height", "Minimum height where the agent can still walk"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop= RNA_def_property(srna, "agentradius", PROP_FLOAT, PROP_NONE); - RNA_def_property_ui_range(prop, 0.1, 5, 0.1, 2); - RNA_def_property_ui_text(prop, "Agent radius", "Radius of the agent"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop= RNA_def_property(srna, "agentmaxclimb", PROP_FLOAT, PROP_NONE); - RNA_def_property_ui_range(prop, 0.1, 5, 0.1, 2); - RNA_def_property_ui_text(prop, "Max climb", "Maximum height between grid cells the agent can climb"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop= RNA_def_property(srna, "agentmaxslope", PROP_FLOAT, PROP_ANGLE); - RNA_def_property_ui_range(prop, 0, 90, 1, 2); - RNA_def_property_ui_text(prop, "Max slope", "Maximum walkable slope angle in degrees"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - - prop= RNA_def_property(srna, "regionminsize", PROP_FLOAT, PROP_NONE); - RNA_def_property_ui_range(prop, 0, 150, 1, 2); - RNA_def_property_ui_text(prop, "Min region size", "Minimum regions size. Smaller regions will be deleted"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop= RNA_def_property(srna, "regionmergesize", PROP_FLOAT, PROP_NONE); - RNA_def_property_ui_range(prop, 0, 150, 1, 2); - RNA_def_property_ui_text(prop, "Merged region size", "Minimum regions size. Smaller regions will be merged"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop= RNA_def_property(srna, "edgemaxlen", PROP_FLOAT, PROP_NONE); - RNA_def_property_ui_range(prop, 0, 50, 1, 2); - RNA_def_property_ui_text(prop, "Max edge length", "Maximum contour edge length"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop= RNA_def_property(srna, "edgemaxerror", PROP_FLOAT, PROP_NONE); - RNA_def_property_ui_range(prop, 0.1, 3.0, 0.1, 2); - RNA_def_property_ui_text(prop, "Max edge error", "Maximum distance error from contour to cells"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop= RNA_def_property(srna, "vertsperpoly", PROP_INT, PROP_NONE); - RNA_def_property_ui_range(prop, 3, 12, 1, 0); - RNA_def_property_ui_text(prop, "Verts per poly", "Max number of vertices per polygon"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop= RNA_def_property(srna, "detailsampledist", PROP_FLOAT, PROP_NONE); - RNA_def_property_ui_range(prop, 0.0, 16.0, 1, 2); - RNA_def_property_ui_text(prop, "Sample Distance", "Detail mesh sample spacing"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop= RNA_def_property(srna, "detailsamplemaxerror", PROP_FLOAT, PROP_NONE); - RNA_def_property_ui_range(prop, 0.0, 16.0, 1, 2); - RNA_def_property_ui_text(prop, "Max Sample Error", "Detail mesh simplification max sample error"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - } void RNA_def_modifier(BlenderRNA *brna) diff --git a/source/blender/modifiers/intern/MOD_navmesh.cpp b/source/blender/modifiers/intern/MOD_navmesh.cpp index d8d6ac4e618..67f06bcf958 100644 --- a/source/blender/modifiers/intern/MOD_navmesh.cpp +++ b/source/blender/modifiers/intern/MOD_navmesh.cpp @@ -46,20 +46,6 @@ extern "C"{ static void initData(ModifierData *md) { NavMeshModifierData *nmmd = (NavMeshModifierData*) md; - - nmmd->cellsize = 0.3f; - nmmd->cellheight = 0.2f; - nmmd->agentmaxslope = 45.0f; - nmmd->agentmaxclimb = 0.9f; - nmmd->agentheight = 2.0f; - nmmd->agentradius = 0.6f; - nmmd->edgemaxlen = 12.0f; - nmmd->edgemaxerror = 1.3f; - nmmd->regionminsize = 50.f; - nmmd->regionmergesize = 20.f; - nmmd->vertsperpoly = 6; - nmmd->detailsampledist = 6.0f; - nmmd->detailsamplemaxerror = 1.0f; } static void copyData(ModifierData *md, ModifierData *target) @@ -70,228 +56,11 @@ static void copyData(ModifierData *md, ModifierData *target) //.todo - deep copy } -static DerivedMesh *buildNavMesh(NavMeshModifierData *mmd,DerivedMesh *dm) -{ - const int nverts = dm->getNumVerts(dm); - MVert *mvert = dm->getVertArray(dm); - const int nfaces = dm->getNumFaces(dm); - MFace *mface = dm->getFaceArray(dm); - float* verts; - int *tris, *tri; - float bmin[3], bmax[3]; - int i,j; - DerivedMesh* result = NULL; - rcHeightfield* solid; - unsigned char *triflags; - rcCompactHeightfield* chf; - rcContourSet *cset; - rcPolyMesh* pmesh; - rcPolyMeshDetail* dmesh; - int numVerts, numEdges, numFaces; - - //calculate count of tris - int ntris = nfaces; - for (i=0; iv4) - ntris+=1; - } - - //create verts - verts = (float*) MEM_mallocN(sizeof(float)*3*nverts, "verts"); - for (i=0; ico[0]; - verts[3*i+1] = v->co[2]; - verts[3*i+2] = v->co[1]; - } - //create tris - tris = (int*) MEM_mallocN(sizeof(int)*3*ntris, "faces"); - tri = tris; - for (i=0; iv1; tri[1]= mf->v3; tri[2]= mf->v2; - tri += 3; - if (mf->v4) - { - tri[0]= mf->v1; tri[1]= mf->v4; tri[2]= mf->v3; - tri += 3; - } - } - - rcCalcBounds(verts, nverts, bmin, bmax); - - // - // Step 1. Initialize build config. - // - rcConfig cfg; - memset(&cfg, 0, sizeof(cfg)); - cfg.cs = mmd->cellsize; - cfg.ch = mmd->cellheight; - cfg.walkableSlopeAngle = mmd->agentmaxslope; - cfg.walkableHeight = (int)ceilf(mmd->agentheight/ cfg.ch); - cfg.walkableClimb = (int)floorf(mmd->agentmaxclimb / cfg.ch); - cfg.walkableRadius = (int)ceilf(mmd->agentradius / cfg.cs); - cfg.maxEdgeLen = (int)(mmd->edgemaxlen/ mmd->cellsize); - cfg.maxSimplificationError = mmd->edgemaxerror; - cfg.minRegionSize = (int)rcSqr(mmd->regionminsize); - cfg.mergeRegionSize = (int)rcSqr(mmd->regionmergesize); - cfg.maxVertsPerPoly = mmd->vertsperpoly; - cfg.detailSampleDist = mmd->detailsampledist< 0.9f ? 0 : mmd->cellsize * mmd->detailsampledist; - cfg.detailSampleMaxError = mmd->cellheight * mmd->detailsamplemaxerror; - - // Set the area where the navigation will be build. - vcopy(cfg.bmin, bmin); - vcopy(cfg.bmax, bmax); - rcCalcGridSize(cfg.bmin, cfg.bmax, cfg.cs, &cfg.width, &cfg.height); - - // - // Step 2. Rasterize input polygon soup. - // - // Allocate voxel heightfield where we rasterize our input data to. - solid = new rcHeightfield; - if (!solid) - return NULL; - - if (!rcCreateHeightfield(*solid, cfg.width, cfg.height, cfg.bmin, cfg.bmax, cfg.cs, cfg.ch)) - return NULL; - - // Allocate array that can hold triangle flags. - triflags = (unsigned char*) MEM_mallocN(sizeof(unsigned char)*ntris, "triflags"); - if (!triflags) - return NULL; - // Find triangles which are walkable based on their slope and rasterize them. - memset(triflags, 0, ntris*sizeof(unsigned char)); - rcMarkWalkableTriangles(cfg.walkableSlopeAngle, verts, nverts, tris, ntris, triflags); - rcRasterizeTriangles(verts, nverts, tris, triflags, ntris, *solid); - MEM_freeN(triflags); - MEM_freeN(verts); - MEM_freeN(tris); - - // - // Step 3. Filter walkables surfaces. - // - rcFilterLedgeSpans(cfg.walkableHeight, cfg.walkableClimb, *solid); - rcFilterWalkableLowHeightSpans(cfg.walkableHeight, *solid); - - // - // Step 4. Partition walkable surface to simple regions. - // - - chf = new rcCompactHeightfield; - if (!chf) - return NULL; - if (!rcBuildCompactHeightfield(cfg.walkableHeight, cfg.walkableClimb, RC_WALKABLE, *solid, *chf)) - return NULL; - - delete solid; - - // Prepare for region partitioning, by calculating distance field along the walkable surface. - if (!rcBuildDistanceField(*chf)) - return NULL; - - // Partition the walkable surface into simple regions without holes. - if (!rcBuildRegions(*chf, cfg.walkableRadius, cfg.borderSize, cfg.minRegionSize, cfg.mergeRegionSize)) - return NULL; - - // - // Step 5. Trace and simplify region contours. - // - // Create contours. - cset = new rcContourSet; - if (!cset) - return NULL; - - if (!rcBuildContours(*chf, cfg.maxSimplificationError, cfg.maxEdgeLen, *cset)) - return NULL; - - // - // Step 6. Build polygons mesh from contours. - // - pmesh = new rcPolyMesh; - if (!pmesh) - return NULL; - if (!rcBuildPolyMesh(*cset, cfg.maxVertsPerPoly, *pmesh)) - return NULL; - - - // - // Step 7. Create detail mesh which allows to access approximate height on each polygon. - // - - dmesh = new rcPolyMeshDetail; - if (!dmesh) - return NULL; - - if (!rcBuildPolyMeshDetail(*pmesh, *chf, cfg.detailSampleDist, cfg.detailSampleMaxError, *dmesh)) - return NULL; - - delete chf; - delete cset; - - - // - // Create blender mesh from detail poly mesh - // - - numVerts = dmesh->nverts; - numFaces = dmesh->ntris; - numEdges = dmesh->ntris*3; - - result = CDDM_new(numVerts, numEdges, numFaces); - //copy verts - for(i = 0; i < numVerts; i++) { - MVert *mv = CDDM_get_vert(result, i); - copy_v3_v3(mv->co, &dmesh->verts[3*i]); - SWAP(float, mv->co[1], mv->co[2]); - } - - //create faces and edges - numFaces = numEdges = 0; - for (i=0; inmeshes; i++) - { - unsigned short vbase = dmesh->meshes[4*i+0]; - unsigned short vnum = dmesh->meshes[4*i+1]; - unsigned short tribase = dmesh->meshes[4*i+2]; - unsigned short trinum = dmesh->meshes[4*i+3]; - - for (j=0; jtris[4*(tribase+j)]; - MFace *mf = CDDM_get_face(result, numFaces); - MEdge *med; - mf->v1 = vbase + tri[0]; - mf->v2 = vbase + tri[1]; - mf->v3 = vbase + tri[2]; - numFaces++; - - { - int e1=0, e2=2; - for (;e1<3; e2=e1++) - { - med = CDDM_get_edge(result, numEdges); - med->v1 = vbase + tri[e2]; - med->v2 = vbase + tri[e1]; - numEdges++; - } - } - } - } - - - delete pmesh; - delete dmesh; - - return result; -} - inline int bit(int a, int b) { return (a & (1 << b)) >> b; } + inline void intToCol(int i, float* col) { int r = bit(i, 0) + bit(i, 3) * 2 + 1; @@ -301,33 +70,42 @@ inline void intToCol(int i, float* col) col[1] = 1 - g*63.0f/255.0f; col[2] = 1 - b*63.0f/255.0f; } +/* +static void (*drawFacesSolid_original)(DerivedMesh *dm, float (*partial_redraw_planes)[4], + int fast, int (*setMaterial)(int, void *attribs)) = NULL;*/ -static void navDM_drawFacesSolid(DerivedMesh *dm, - float (*partial_redraw_planes)[4], - int fast, int (*setMaterial)(int, void *attribs)) +static void drawNavMeshColored(DerivedMesh *dm) { int a, glmode; MVert *mvert = (MVert *)CustomData_get_layer(&dm->vertData, CD_MVERT); MFace *mface = (MFace *)CustomData_get_layer(&dm->faceData, CD_MFACE); int* polygonIdx = (int*)CustomData_get_layer(&dm->faceData, CD_PROP_INT); + if (!polygonIdx) + return; float col[3]; - col[0] = 1.f; - col[1] = 0.f; - col[2] = 0.f; + /* + //UI_ThemeColor(TH_WIRE); + glDisable(GL_LIGHTING); + glLineWidth(2.0); + dm->drawEdges(dm, 0, 1); + glLineWidth(1.0); + glEnable(GL_LIGHTING);*/ + + glDisable(GL_LIGHTING); if(GPU_buffer_legacy(dm) ) { - DEBUG_VBO( "Using legacy code. navDM_drawFacesSolid\n" ); + DEBUG_VBO( "Using legacy code. drawNavMeshColored\n" ); //glShadeModel(GL_SMOOTH); glBegin(glmode = GL_QUADS); - for(a = 0; a < dm->numFaceData; a++, mface++, polygonIdx++) { + for(a = 0; a < dm->numFaceData; a++, mface++) { int new_glmode = mface->v4?GL_QUADS:GL_TRIANGLES; - intToCol(a, col); - //intToCol(*polygonIdx, col); + int* polygonIdx = (int*)CustomData_get(&dm->faceData, a, CD_PROP_INT); + intToCol(*polygonIdx, col); if(new_glmode != glmode) { glEnd(); glBegin(glmode = new_glmode); } - //glColor3fv(col); + glColor3fv(col); glVertex3fv(mvert[mface->v1].co); glVertex3fv(mvert[mface->v2].co); glVertex3fv(mvert[mface->v3].co); @@ -337,9 +115,23 @@ static void navDM_drawFacesSolid(DerivedMesh *dm, } glEnd(); } + glEnable(GL_LIGHTING); } -static DerivedMesh *testCreateNavMesh(NavMeshModifierData *mmd,DerivedMesh *dm) +static void navDM_drawFacesTex(DerivedMesh *dm, int (*setDrawOptions)(MTFace *tface, MCol *mcol, int matnr)) +{ + drawNavMeshColored(dm); +} + +static void navDM_drawFacesSolid(DerivedMesh *dm, + float (*partial_redraw_planes)[4], + int fast, int (*setMaterial)(int, void *attribs)) +{ + //drawFacesSolid_original(dm, partial_redraw_planes, fast, setMaterial); + drawNavMeshColored(dm); +} + +static DerivedMesh *createNavMeshForVisualization(NavMeshModifierData *mmd,DerivedMesh *dm) { int i; DerivedMesh *result; @@ -348,40 +140,23 @@ static DerivedMesh *testCreateNavMesh(NavMeshModifierData *mmd,DerivedMesh *dm) int maxEdges = dm->getNumEdges(dm); int maxFaces = dm->getNumFaces(dm); -/* MVert *mv; - MEdge *med; - MFace *mf; - numVerts = numEdges = numFaces = 0; - - result = CDDM_new(3, 3, 1); - mv = CDDM_get_vert(result, 0); - mv->co[0] = -10; mv->co[1] = -10; mv->co[2] = 0; - mv = CDDM_get_vert(result, 1); - mv->co[0] = -10; mv->co[1] = 10; mv->co[2] = 0; - mv = CDDM_get_vert(result, 2); - mv->co[0] = 10; mv->co[1] = -10; mv->co[2] = 0; + result = CDDM_copy(dm); + CustomData_add_layer_named(&result->faceData, CD_PROP_INT, CD_DUPLICATE, + CustomData_get_layer(&dm->faceData, CD_PROP_INT), maxFaces, "recastData"); - med = CDDM_get_edge(result, 0); - med->v1 = 0; med->v1 = 1; - med = CDDM_get_edge(result, 1); - med->v1 = 1; med->v1 = 2; - med = CDDM_get_edge(result, 2); - med->v1 = 2; med->v1 = 0; + /*result = CDDM_new(maxVerts, maxEdges, maxFaces); + DM_copy_vert_data(dm, result, 0, 0, maxVerts); + DM_copy_edge_data(dm, result, 0, 0, maxEdges); + DM_copy_face_data(dm, result, 0, 0, maxFaces);*/ - mf = CDDM_get_face(result, 0); - mf->v1 = 0; mf->v2 = 1; mf->v3 = 2; -*/ - - int actualFaces = 0; - for(i = 0; i < maxFaces; i++) { - int* polygonIdx = (int*)CustomData_get(&dm->faceData, i, CD_PROP_INT); - if (*polygonIdx==1) - actualFaces++; - } - - - result = CDDM_new(maxVerts, maxEdges, maxFaces);//maxFaces actualFaces + + /* + if (!drawFacesSolid_original) + drawFacesSolid_original= result->drawFacesSolid;*/ + result->drawFacesTex = navDM_drawFacesTex; result->drawFacesSolid = navDM_drawFacesSolid; + +/* numVerts = numEdges = numFaces = 0; for(i = 0; i < maxVerts; i++) { MVert inMV; @@ -390,10 +165,9 @@ static DerivedMesh *testCreateNavMesh(NavMeshModifierData *mmd,DerivedMesh *dm) dm->getVert(dm, i, &inMV); copy_v3_v3(co, inMV.co); *mv = inMV; - mv->co[2] +=.5f; + //mv->co[2] +=.5f; numVerts++; } - for(i = 0; i < maxEdges; i++) { MEdge inMED; MEdge *med = CDDM_get_edge(result, numEdges); @@ -401,36 +175,35 @@ static DerivedMesh *testCreateNavMesh(NavMeshModifierData *mmd,DerivedMesh *dm) *med = inMED; numEdges++; } - for(i = 0; i < maxFaces; i++) { - /* - int* polygonIdx = (int*)CustomData_get(&dm->faceData, i, CD_PROP_INT); - if (*polygonIdx!=2) - continue;*/ - MFace inMF; MFace *mf = CDDM_get_face(result, numFaces); dm->getFace(dm, i, &inMF); *mf = inMF; numFaces++; - } + }*/ return result; } +/* +static int isDisabled(ModifierData *md, int useRenderParams) +{ + NavMeshModifierData *amd = (NavMeshModifierData*) md; + return false; +}*/ + + static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *derivedData, int useRenderParams, int isFinalCalc) { - DerivedMesh *result; - + DerivedMesh *result = NULL; NavMeshModifierData *nmmd = (NavMeshModifierData*) md; - - //for test - //result = testCreateNavMesh(nmmd, derivedData); - //result = buildNavMesh(nmmd, derivedData); - + if (ob->body_type==OB_BODY_TYPE_NAVMESH) + result = createNavMeshForVisualization(nmmd, derivedData); + return result; } @@ -440,7 +213,8 @@ ModifierTypeInfo modifierType_NavMesh = { /* structName */ "NavMeshModifierData", /* structSize */ sizeof(NavMeshModifierData), /* type */ eModifierTypeType_Constructive, - /* flags */ eModifierTypeFlag_AcceptsMesh, + /* flags */ (ModifierTypeFlag) (eModifierTypeFlag_AcceptsMesh + | eModifierTypeFlag_NoUserAdd), /* copyData */ copyData, /* deformVerts */ 0, /* deformVertsEM */ 0, From af1ca0cfc17f9663908f23cafb322aa6e2b10782 Mon Sep 17 00:00:00 2001 From: Nick Samarin Date: Tue, 27 Jul 2010 21:01:00 +0000 Subject: [PATCH 027/182] - added operators for manual assigning navigation polygon idx to mesh faces in edit mode - modified conversion process to take into account changes caused by mesh editing Note: conversion to dtStatNavMesh in KX_NavMeshObject hasn't worked correctly yet --- .../scripts/ui/properties_data_modifier.py | 7 +- source/blender/editors/object/object_intern.h | 2 + .../blender/editors/object/object_navmesh.cpp | 147 +++++- source/blender/editors/object/object_ops.c | 2 + .../blender/modifiers/intern/MOD_navmesh.cpp | 494 ++++++++++++++++-- source/gameengine/Ketsji/KX_NavMeshObject.cpp | 22 +- source/gameengine/Ketsji/KX_NavMeshObject.h | 2 +- 7 files changed, 611 insertions(+), 65 deletions(-) diff --git a/release/scripts/ui/properties_data_modifier.py b/release/scripts/ui/properties_data_modifier.py index b7b4c8dc64c..29034997754 100644 --- a/release/scripts/ui/properties_data_modifier.py +++ b/release/scripts/ui/properties_data_modifier.py @@ -462,7 +462,12 @@ class DATA_PT_modifiers(DataButtonsPanel): row.label() def NAVMESH(self, layout, ob, md, wide_ui): - layout = self.layout + split = layout.split() + if ob.mode == 'EDIT': + col = split.column() + col.operator("object.assign_navpolygon", text="Assign poly idx") + col = split.column() + col.operator("object.assign_new_navpolygon", text="Assign new poly idx") def PARTICLE_INSTANCE(self, layout, ob, md, wide_ui): layout.prop(md, "object") diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h index e30a6c555e3..7b2904eed9d 100644 --- a/source/blender/editors/object/object_intern.h +++ b/source/blender/editors/object/object_intern.h @@ -224,6 +224,8 @@ void OBJECT_OT_bake_image(wmOperatorType *ot); /* object_navmesh.cpp */ void OBJECT_OT_create_navmesh(struct wmOperatorType *ot); +void OBJECT_OT_assign_navpolygon(struct wmOperatorType *ot); +void OBJECT_OT_assign_new_navpolygon(struct wmOperatorType *ot); #endif /* ED_OBJECT_INTERN_H */ diff --git a/source/blender/editors/object/object_navmesh.cpp b/source/blender/editors/object/object_navmesh.cpp index a5ff74ae4fd..f7527e2d5d5 100644 --- a/source/blender/editors/object/object_navmesh.cpp +++ b/source/blender/editors/object/object_navmesh.cpp @@ -50,6 +50,8 @@ extern "C" #include "ED_object.h" #include "BLI_math_vector.h" +#include "RNA_access.h" + #include "ED_mesh.h" /*mesh/mesh_intern.h */ @@ -372,7 +374,7 @@ static Object* createRepresentation(bContext *C, rcPolyMesh*& pmesh, rcPolyMeshD //set navigation polygon idx to the custom layer int* polygonIdx = (int*)CustomData_em_get(&em->fdata, newFace->data, CD_PROP_INT); - *polygonIdx = i; + *polygonIdx = i+1; //add 1 to avoid zero idx } EM_free_index_arrays(); @@ -425,7 +427,7 @@ static int create_navmesh_exec(bContext *C, wmOperator *op) void OBJECT_OT_create_navmesh(wmOperatorType *ot) { /* identifiers */ - ot->name= "NavMesh"; + ot->name= "Create navigation mesh"; ot->description= "Create navigation mesh for selected objects"; ot->idname= "OBJECT_OT_create_navmesh"; @@ -435,4 +437,145 @@ void OBJECT_OT_create_navmesh(wmOperatorType *ot) /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } + +static int assign_navpolygon_poll(bContext *C) +{ + Object *ob= (Object *)CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + if (!ob || !ob->data) + return 0; + return (((Mesh*)ob->data)->edit_mesh != NULL); +} + +static int assign_navpolygon_exec(bContext *C, wmOperator *op) +{ + Object *obedit= CTX_data_edit_object(C); + EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data); + + //do work here + int targetPolyIdx = -1; + EditFace *ef, *efa; + efa = EM_get_actFace(em, 0); + if (efa) + { + if (CustomData_has_layer(&em->fdata, CD_PROP_INT)) + { + targetPolyIdx = *(int*)CustomData_em_get(&em->fdata, efa->data, CD_PROP_INT); + targetPolyIdx = targetPolyIdx>=0? targetPolyIdx : -targetPolyIdx; + if (targetPolyIdx>0) + { + //set target poly idx to other selected faces + ef = (EditFace*)em->faces.last; + while(ef) + { + if((ef->f & SELECT )&& ef!=efa) + { + int* recastDataBlock = (int*)CustomData_em_get(&em->fdata, ef->data, CD_PROP_INT); + *recastDataBlock = targetPolyIdx; + } + ef = ef->prev; + } + } + } + } + + DAG_id_flush_update((ID*)obedit->data, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data); + + BKE_mesh_end_editmesh((Mesh*)obedit->data, em); + return OPERATOR_FINISHED; +} + +void OBJECT_OT_assign_navpolygon(struct wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Assign polygon index "; + ot->description= "Assign polygon index to face by active face"; + ot->idname= "OBJECT_OT_assign_navpolygon"; + + /* api callbacks */ + ot->poll = assign_navpolygon_poll; + ot->exec= assign_navpolygon_exec; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +static int compare(const void * a, const void * b){ + return ( *(int*)a - *(int*)b ); +} +static int findFreeNavPolyIndex(EditMesh* em) +{ + //construct vector of indices + int numfaces = em->totface; + int* indices = new int[numfaces]; + EditFace* ef = (EditFace*)em->faces.last; + int idx = 0; + while(ef) + { + int polyIdx = *(int*)CustomData_em_get(&em->fdata, ef->data, CD_PROP_INT); + indices[idx] = polyIdx; + idx++; + ef = ef->prev; + } + qsort(indices, numfaces, sizeof(int), compare); + //search first free index + int freeIdx = 1; + int maxIdx = indices[numfaces-1]; + for (int i=0; ifreeIdx) + break; + } + delete indices; + return freeIdx; +} + +static int assign_new_navpolygon_exec(bContext *C, wmOperator *op) +{ + Object *obedit= CTX_data_edit_object(C); + EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data); + + EditFace *ef; + if (CustomData_has_layer(&em->fdata, CD_PROP_INT)) + { + int targetPolyIdx = findFreeNavPolyIndex(em); + if (targetPolyIdx>0) + { + //set target poly idx to selected faces + ef = (EditFace*)em->faces.last; + while(ef) + { + if(ef->f & SELECT ) + { + int* recastDataBlock = (int*)CustomData_em_get(&em->fdata, ef->data, CD_PROP_INT); + *recastDataBlock = targetPolyIdx; + } + ef = ef->prev; + } + } + } + + DAG_id_flush_update((ID*)obedit->data, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data); + + BKE_mesh_end_editmesh((Mesh*)obedit->data, em); + return OPERATOR_FINISHED; +} + +void OBJECT_OT_assign_new_navpolygon(struct wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Assign new polygon index "; + ot->description= "Assign new polygon index to face"; + ot->idname= "OBJECT_OT_assign_new_navpolygon"; + + /* api callbacks */ + ot->poll = assign_navpolygon_poll; + ot->exec= assign_new_navpolygon_exec; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} } diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c index 0a031b8af9c..784818658a6 100644 --- a/source/blender/editors/object/object_ops.c +++ b/source/blender/editors/object/object_ops.c @@ -211,6 +211,8 @@ void ED_operatortypes_object(void) WM_operatortype_append(OBJECT_OT_drop_named_material); WM_operatortype_append(OBJECT_OT_create_navmesh); + WM_operatortype_append(OBJECT_OT_assign_navpolygon); + WM_operatortype_append(OBJECT_OT_assign_new_navpolygon); } void ED_operatormacros_object(void) diff --git a/source/blender/modifiers/intern/MOD_navmesh.cpp b/source/blender/modifiers/intern/MOD_navmesh.cpp index 67f06bcf958..6bf2400b3f6 100644 --- a/source/blender/modifiers/intern/MOD_navmesh.cpp +++ b/source/blender/modifiers/intern/MOD_navmesh.cpp @@ -42,20 +42,11 @@ extern "C"{ #include "GPU_draw.h" #include "UI_resources.h" - -static void initData(ModifierData *md) +//service function +inline int abs(int a) { - NavMeshModifierData *nmmd = (NavMeshModifierData*) md; + return a>=0 ? a: -a; } - -static void copyData(ModifierData *md, ModifierData *target) -{ - NavMeshModifierData *nmmd = (NavMeshModifierData*) md; - NavMeshModifierData *tnmmd = (NavMeshModifierData*) target; - - //.todo - deep copy -} - inline int bit(int a, int b) { return (a & (1 << b)) >> b; @@ -70,6 +61,387 @@ inline void intToCol(int i, float* col) col[1] = 1 - g*63.0f/255.0f; col[2] = 1 - b*63.0f/255.0f; } + +inline float area2(const float* a, const float* b, const float* c) +{ + return (b[0] - a[0]) * (c[2] - a[2]) - (c[0] - a[0]) * (b[2] - a[2]); +} +inline bool left(const float* a, const float* b, const float* c) +{ + return area2(a, b, c) < 0; +} + +inline int polyNumVerts(const unsigned short* p, const int vertsPerPoly) +{ + int nv = 0; + for (int i=0; i 0) + t /= d; + if (t < 0) + t = 0; + else if (t > 1) + t = 1; + dx[0] = a[0] + t*abx[0] - point[0]; + dx[2] = a[2] + t*abx[2] - point[2]; + return dx[0]*dx[0] + dx[2]*dx[2]; +} + +static bool buildRawVertIndicesData(DerivedMesh* dm, int &nverts, float *&verts, + int &ntris, unsigned short *&tris, int *&trisToFacesMap, + int *&recastData) +{ + nverts = dm->getNumVerts(dm); + verts = new float[3*nverts]; + dm->getVertCos(dm, (float(*)[3])verts); + + //flip coordinates + for (int vi=0; vigetNumFaces(dm); + MFace *faces = dm->getFaceArray(dm); + ntris = nfaces; + for (int fi=0; fiv4) + ntris++; + } + + //copy and transform to triangles (reorder on the run) + trisToFacesMap = new int[ntris]; + tris = new unsigned short[3*ntris]; + unsigned short* tri = tris; + int triIdx = 0; + for (int fi=0; fiv1; + tri[3*triIdx+1] = face->v3; + tri[3*triIdx+2] = face->v2; + trisToFacesMap[triIdx++]=fi; + if (face->v4) + { + tri[3*triIdx+0] = face->v1; + tri[3*triIdx+1] = face->v4; + tri[3*triIdx+2] = face->v2; + trisToFacesMap[triIdx++]=fi; + } + } + + //carefully, recast data is just reference to data in derived mesh + recastData = (int*)CustomData_get_layer(&dm->faceData, CD_PROP_INT); + return true; +} + +static bool buildPolygonsByDetailedMeshes(const int vertsPerPoly, const int npolys, + unsigned short* polys, const unsigned short* dmeshes, + const float* verts, const unsigned short* dtris, + const int* dtrisToPolysMap) +{ + bool res = false; + int capacity = vertsPerPoly; + unsigned short* newPoly = new unsigned short[capacity]; + memset(newPoly, 0xff, sizeof(unsigned short)*capacity); + for (int polyidx=0; polyidxtolerance) + adjustedPoly[adjustedNv++] = cur; + } + memcpy(newPoly, adjustedPoly, adjustedNv*sizeof(unsigned short)); + delete adjustedPoly; + nv = adjustedNv; + + if (nv<=vertsPerPoly) + { + for (int i=0; irecastData[context->trisToFacesMap[*(int*)a]] - + context->recastData[context->trisToFacesMap[*(int*)b]] ); +} + +static bool buildNavMeshData(const int nverts, const float* verts, + const int ntris, const unsigned short *tris, + const int* recastData, const int* trisToFacesMap, + int &ndtris, unsigned short *&dtris, + int &npolys, unsigned short *&dmeshes, unsigned short *&polys, + int &vertsPerPoly, int *&dtrisToPolysMap, int *&dtrisToTrisMap) + +{ + if (!recastData) + { + printf("Converting navmesh: Error! Can't find recast custom data\n"); + return false; + } + + //sort the triangles by polygon idx + int* trisMapping = new int[ntris]; + for (int i=0; i0) + { + validTriStart = i; + break; + } + } + + if (validTriStart<0) + { + printf("Converting navmesh: Error! No valid polygons in mesh\n"); + delete trisMapping; + return false; + } + + ndtris = ntris-validTriStart; + //fill dtris to faces mapping + dtrisToTrisMap = new int[ndtris]; + memcpy(dtrisToTrisMap, &trisMapping[validTriStart], ndtris*sizeof(int)); + delete trisMapping; trisMapping=NULL; + + //create detailed mesh triangles - copy only valid triangles + //and reserve memory for adjacency info + dtris = new unsigned short[3*2*ndtris]; + memset(dtris, 0xffff, sizeof(unsigned short)*3*2*ndtris); + for (int i=0; ifaceData, CD_PROP_INT); if (!polygonIdx) return; + const float BLACK_COLOR[3] = {0.f, 0.f, 0.f}; float col[3]; /* //UI_ThemeColor(TH_WIRE); @@ -98,8 +471,11 @@ static void drawNavMeshColored(DerivedMesh *dm) glBegin(glmode = GL_QUADS); for(a = 0; a < dm->numFaceData; a++, mface++) { int new_glmode = mface->v4?GL_QUADS:GL_TRIANGLES; - int* polygonIdx = (int*)CustomData_get(&dm->faceData, a, CD_PROP_INT); - intToCol(*polygonIdx, col); + int polygonIdx = *(int*)CustomData_get(&dm->faceData, a, CD_PROP_INT); + if (polygonIdx<=0) + memcpy(col, BLACK_COLOR, 3*sizeof(float)); + else + intToCol(polygonIdx, col); if(new_glmode != glmode) { glEnd(); @@ -133,7 +509,6 @@ static void navDM_drawFacesSolid(DerivedMesh *dm, static DerivedMesh *createNavMeshForVisualization(NavMeshModifierData *mmd,DerivedMesh *dm) { - int i; DerivedMesh *result; int numVerts, numEdges, numFaces; int maxVerts = dm->getNumVerts(dm); @@ -141,47 +516,66 @@ static DerivedMesh *createNavMeshForVisualization(NavMeshModifierData *mmd,Deriv int maxFaces = dm->getNumFaces(dm); result = CDDM_copy(dm); + int *recastData = (int*)CustomData_get_layer(&dm->faceData, CD_PROP_INT); CustomData_add_layer_named(&result->faceData, CD_PROP_INT, CD_DUPLICATE, - CustomData_get_layer(&dm->faceData, CD_PROP_INT), maxFaces, "recastData"); - - /*result = CDDM_new(maxVerts, maxEdges, maxFaces); - DM_copy_vert_data(dm, result, 0, 0, maxVerts); - DM_copy_edge_data(dm, result, 0, 0, maxEdges); - DM_copy_face_data(dm, result, 0, 0, maxFaces);*/ - - - /* - if (!drawFacesSolid_original) - drawFacesSolid_original= result->drawFacesSolid;*/ + recastData, maxFaces, "recastData"); + recastData = (int*)CustomData_get_layer(&result->faceData, CD_PROP_INT); result->drawFacesTex = navDM_drawFacesTex; result->drawFacesSolid = navDM_drawFacesSolid; -/* - numVerts = numEdges = numFaces = 0; - for(i = 0; i < maxVerts; i++) { - MVert inMV; - MVert *mv = CDDM_get_vert(result, numVerts); - float co[3]; - dm->getVert(dm, i, &inMV); - copy_v3_v3(co, inMV.co); - *mv = inMV; - //mv->co[2] +=.5f; - numVerts++; + + //process mesh + int vertsPerPoly=0, nverts=0, ndtris=0, npolys=0; + float* verts=NULL; + unsigned short *dtris=NULL, *dmeshes=NULL, *polys=NULL; + int *dtrisToPolysMap=NULL, *dtrisToTrisMap=NULL, *trisToFacesMap=NULL; + + bool res = buildNavMeshDataByDerivedMesh(dm, vertsPerPoly, nverts, verts, ndtris, dtris, + npolys, dmeshes, polys, dtrisToPolysMap, dtrisToTrisMap, + trisToFacesMap); + if (res) + { + //invalidate concave polygon + for (size_t polyIdx=0; polyIdx<(size_t)npolys; polyIdx++) + { + unsigned short* poly = &polys[polyIdx*2*vertsPerPoly]; + if (!polyIsConvex(poly, vertsPerPoly, verts)) + { + //set negative polygon idx to all faces + unsigned short *dmesh = &dmeshes[4*polyIdx]; + unsigned short tbase = dmesh[2]; + unsigned short tnum = dmesh[3]; + for (unsigned short ti=0; ti0) + recastData[triidx] = -recastData[triidx]; + } + } + } + } - for(i = 0; i < maxEdges; i++) { - MEdge inMED; - MEdge *med = CDDM_get_edge(result, numEdges); - dm->getEdge(dm, i, &inMED); - *med = inMED; - numEdges++; + else + { + printf("Error during creation polygon infos\n"); } - for(i = 0; i < maxFaces; i++) { - MFace inMF; - MFace *mf = CDDM_get_face(result, numFaces); - dm->getFace(dm, i, &inMF); - *mf = inMF; - numFaces++; - }*/ + + //clean up + if (verts!=NULL) + delete verts; + if (dtris!=NULL) + delete dtris; + if (dmeshes!=NULL) + delete dmeshes; + if (polys!=NULL) + delete polys; + if (dtrisToPolysMap!=NULL) + delete dtrisToPolysMap; + if (dtrisToTrisMap!=NULL) + delete dtrisToTrisMap; + if (trisToFacesMap!=NULL) + delete trisToFacesMap; return result; } diff --git a/source/gameengine/Ketsji/KX_NavMeshObject.cpp b/source/gameengine/Ketsji/KX_NavMeshObject.cpp index 19e045a2745..3d4dcb928a6 100644 --- a/source/gameengine/Ketsji/KX_NavMeshObject.cpp +++ b/source/gameengine/Ketsji/KX_NavMeshObject.cpp @@ -120,16 +120,11 @@ void KX_NavMeshObject::ProcessReplica() } -bool KX_NavMeshObject::BuildVertIndArrays(RAS_MeshObject* meshobj, float *&vertices, int& nverts, +bool KX_NavMeshObject::BuildVertIndArrays(float *&vertices, int& nverts, unsigned short* &polys, int& npolys, unsigned short *&dmeshes, float *&dvertices, int &ndvertsuniq, unsigned short *&dtris, int& ndtris, int &vertsPerPoly) { - if (!meshobj) - { - return false; - } - DerivedMesh* dm = mesh_create_derived_no_virtual(KX_GetActiveScene()->GetBlenderScene(), GetBlenderObject(), NULL, CD_MASK_MESH); int* recastData = (int*) dm->getFaceDataArray(dm, CD_PROP_INT); @@ -163,7 +158,7 @@ bool KX_NavMeshObject::BuildVertIndArrays(RAS_MeshObject* meshobj, float *&verti //assumption: detailed mesh triangles are sorted by polygon idx - npolys = recastData[numfaces-1] + 1; + npolys = recastData[numfaces-1]/* + 1*/; //stored indices start from 1 dmeshes = new unsigned short[npolys*4]; memset(dmeshes, 0, npolys*4*sizeof(unsigned short)); @@ -177,6 +172,7 @@ bool KX_NavMeshObject::BuildVertIndArrays(RAS_MeshObject* meshobj, float *&verti if (curpolyidx!=prevpolyidx+1) { //error - wrong order of detailed mesh faces + printf("Converting navmesh: Error! Wrong order of detailed mesh faces\n"); return false; } dmesh = dmesh==NULL ? dmeshes : dmesh+4; @@ -386,6 +382,7 @@ bool KX_NavMeshObject::BuildVertIndArrays(RAS_MeshObject* meshobj, float *&verti else { //create from RAS_MeshObject (detailed mesh is fake) + RAS_MeshObject* meshobj = GetMesh(0); vertsPerPoly = 3; nverts = meshobj->m_sharedvertex_map.size(); if (nverts >= 0xffff) @@ -452,20 +449,23 @@ bool KX_NavMeshObject::BuildNavMesh() m_navMesh = NULL; } - if (GetMeshCount()==0) + { + printf("Can't find mesh for navmesh object: %s \n", m_name); return false; - - RAS_MeshObject* meshobj = GetMesh(0); + } float *vertices = NULL, *dvertices = NULL; unsigned short *polys = NULL, *dtris = NULL, *dmeshes = NULL; int nverts = 0, npolys = 0, ndvertsuniq = 0, ndtris = 0; int vertsPerPoly = 0; - if (!BuildVertIndArrays(meshobj, vertices, nverts, polys, npolys, + if (!BuildVertIndArrays(vertices, nverts, polys, npolys, dmeshes, dvertices, ndvertsuniq, dtris, ndtris, vertsPerPoly ) || vertsPerPoly<3) + { + printf("Can't build navigation mesh data for object:%s \n", m_name); return false; + } MT_Point3 pos; for (int i=0; i Date: Wed, 28 Jul 2010 19:43:05 +0000 Subject: [PATCH 028/182] - reworked conversion to dtStatNavMesh in KX_NavMeshObject to support navigation mesh editing --- .../BlenderNavMesh/NavMeshConversion.cpp | 406 ++++++++++++++++++ .../BlenderNavMesh/NavMeshConversion.h | 98 +++++ .../make/msvc_9_0/recastnavigation.vcproj | 22 +- projectfiles_vc9/blender/blender.sln | 6 + .../blender/modifiers/modifiers.vcproj | 4 +- .../gameengine/ketsji/KX_ketsji.vcproj | 4 +- .../blender/modifiers/intern/MOD_navmesh.cpp | 389 +---------------- source/gameengine/Ketsji/KX_NavMeshObject.cpp | 324 ++++---------- 8 files changed, 610 insertions(+), 643 deletions(-) create mode 100644 extern/recastnavigation/BlenderNavMesh/NavMeshConversion.cpp create mode 100644 extern/recastnavigation/BlenderNavMesh/NavMeshConversion.h diff --git a/extern/recastnavigation/BlenderNavMesh/NavMeshConversion.cpp b/extern/recastnavigation/BlenderNavMesh/NavMeshConversion.cpp new file mode 100644 index 00000000000..ed02a27cc43 --- /dev/null +++ b/extern/recastnavigation/BlenderNavMesh/NavMeshConversion.cpp @@ -0,0 +1,406 @@ +/** +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. +* All rights reserved. +* +* The Original Code is: all of this file. +* +* Contributor(s): none yet. +* +* ***** END GPL LICENSE BLOCK ***** +*/ + +#include "NavMeshConversion.h" +extern "C"{ +#include "BLI_math.h" +} + +int polyNumVerts(const unsigned short* p, const int vertsPerPoly) +{ + int nv = 0; + for (int i=0; i 0) + t /= d; + if (t < 0) + t = 0; + else if (t > 1) + t = 1; + dx[0] = a[0] + t*abx[0] - point[0]; + dx[2] = a[2] + t*abx[2] - point[2]; + return dx[0]*dx[0] + dx[2]*dx[2]; +} + +bool buildRawVertIndicesData(DerivedMesh* dm, int &nverts, float *&verts, + int &ntris, unsigned short *&tris, int *&trisToFacesMap, + int *&recastData) +{ + nverts = dm->getNumVerts(dm); + verts = new float[3*nverts]; + dm->getVertCos(dm, (float(*)[3])verts); + + //flip coordinates + for (int vi=0; vigetNumFaces(dm); + MFace *faces = dm->getFaceArray(dm); + ntris = nfaces; + for (int fi=0; fiv4) + ntris++; + } + + //copy and transform to triangles (reorder on the run) + trisToFacesMap = new int[ntris]; + tris = new unsigned short[3*ntris]; + unsigned short* tri = tris; + int triIdx = 0; + for (int fi=0; fiv1; + tri[3*triIdx+1] = face->v3; + tri[3*triIdx+2] = face->v2; + trisToFacesMap[triIdx++]=fi; + if (face->v4) + { + tri[3*triIdx+0] = face->v1; + tri[3*triIdx+1] = face->v4; + tri[3*triIdx+2] = face->v3; + trisToFacesMap[triIdx++]=fi; + } + } + + //carefully, recast data is just reference to data in derived mesh + recastData = (int*)CustomData_get_layer(&dm->faceData, CD_PROP_INT); + return true; +} + +bool buildPolygonsByDetailedMeshes(const int vertsPerPoly, const int npolys, + unsigned short* polys, const unsigned short* dmeshes, + const float* verts, const unsigned short* dtris, + const int* dtrisToPolysMap) +{ + bool res = false; + int capacity = vertsPerPoly; + unsigned short* newPoly = new unsigned short[capacity]; + memset(newPoly, 0xff, sizeof(unsigned short)*capacity); + for (int polyidx=0; polyidxtolerance) + adjustedPoly[adjustedNv++] = cur; + } + memcpy(newPoly, adjustedPoly, adjustedNv*sizeof(unsigned short)); + delete adjustedPoly; + nv = adjustedNv; + + if (nv<=vertsPerPoly) + { + for (int i=0; irecastData[context->trisToFacesMap[*(int*)a]] - + context->recastData[context->trisToFacesMap[*(int*)b]] ); +} + +bool buildNavMeshData(const int nverts, const float* verts, + const int ntris, const unsigned short *tris, + const int* recastData, const int* trisToFacesMap, + int &ndtris, unsigned short *&dtris, + int &npolys, unsigned short *&dmeshes, unsigned short *&polys, + int &vertsPerPoly, int *&dtrisToPolysMap, int *&dtrisToTrisMap) + +{ + if (!recastData) + { + printf("Converting navmesh: Error! Can't find recast custom data\n"); + return false; + } + + //sort the triangles by polygon idx + int* trisMapping = new int[ntris]; + for (int i=0; i0) + { + validTriStart = i; + break; + } + } + + if (validTriStart<0) + { + printf("Converting navmesh: Error! No valid polygons in mesh\n"); + delete trisMapping; + return false; + } + + ndtris = ntris-validTriStart; + //fill dtris to faces mapping + dtrisToTrisMap = new int[ndtris]; + memcpy(dtrisToTrisMap, &trisMapping[validTriStart], ndtris*sizeof(int)); + delete trisMapping; trisMapping=NULL; + + //create detailed mesh triangles - copy only valid triangles + //and reserve memory for adjacency info + dtris = new unsigned short[3*2*ndtris]; + memset(dtris, 0xffff, sizeof(unsigned short)*3*2*ndtris); + for (int i=0; i +#include "Recast.h" +extern "C"{ +#include "DNA_meshdata_types.h" +#include "BKE_cdderivedmesh.h" +} + +bool buildNavMeshDataByDerivedMesh(DerivedMesh *dm, int& vertsPerPoly, + int &nverts, float *&verts, + int &ndtris, unsigned short *&dtris, + int& npolys, unsigned short *&dmeshes, + unsigned short*& polys, int *&dtrisToPolysMap, + int *&dtrisToTrisMap, int *&trisToFacesMap); + +bool buildRawVertIndicesData(DerivedMesh* dm, int &nverts, float *&verts, + int &ntris, unsigned short *&tris, int *&trisToFacesMap, + int *&recastData); + +bool buildNavMeshData(const int nverts, const float* verts, + const int ntris, const unsigned short *tris, + const int* recastData, const int* trisToFacesMap, + int &ndtris, unsigned short *&dtris, + int &npolys, unsigned short *&dmeshes, unsigned short *&polys, + int &vertsPerPoly, int *&dtrisToPolysMap, int *&dtrisToTrisMap); + +bool buildPolygonsByDetailedMeshes(const int vertsPerPoly, const int npolys, + unsigned short* polys, const unsigned short* dmeshes, + const float* verts, const unsigned short* dtris, + const int* dtrisToPolysMap); + +int polyNumVerts(const unsigned short* p, const int vertsPerPoly); +bool polyIsConvex(const unsigned short* p, const int vertsPerPoly, const float* verts); +int polyFindVertex(const unsigned short* p, const int vertsPerPoly, unsigned short vertexIdx); +float distPointToSegmentSq(const float* point, const float* a, const float* b); + + +inline int abs2(int a) +{ + return a>=0 ? a: -a; +} + +inline int bit(int a, int b) +{ + return (a & (1 << b)) >> b; +} + +inline void intToCol(int i, float* col) +{ + int r = bit(i, 0) + bit(i, 3) * 2 + 1; + int g = bit(i, 1) + bit(i, 4) * 2 + 1; + int b = bit(i, 2) + bit(i, 5) * 2 + 1; + col[0] = 1 - r*63.0f/255.0f; + col[1] = 1 - g*63.0f/255.0f; + col[2] = 1 - b*63.0f/255.0f; +} + +inline float area2(const float* a, const float* b, const float* c) +{ + return (b[0] - a[0]) * (c[2] - a[2]) - (c[0] - a[0]) * (b[2] - a[2]); +} +inline bool left(const float* a, const float* b, const float* c) +{ + return area2(a, b, c) < 0; +} + +#endif //NAVMESH_CONVERSION_H \ No newline at end of file diff --git a/extern/recastnavigation/make/msvc_9_0/recastnavigation.vcproj b/extern/recastnavigation/make/msvc_9_0/recastnavigation.vcproj index c0f451176c6..5dfa123e471 100644 --- a/extern/recastnavigation/make/msvc_9_0/recastnavigation.vcproj +++ b/extern/recastnavigation/make/msvc_9_0/recastnavigation.vcproj @@ -41,7 +41,7 @@ @@ -269,6 +269,18 @@ + + + + + + diff --git a/projectfiles_vc9/blender/blender.sln b/projectfiles_vc9/blender/blender.sln index c9cc7fa20b4..5051332afc1 100644 --- a/projectfiles_vc9/blender/blender.sln +++ b/projectfiles_vc9/blender/blender.sln @@ -185,6 +185,9 @@ EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "KX_converter", "..\gameengine\converter\KX_converter.vcproj", "{F90BD995-FFA4-4B18-81E8-FA4322C939E8}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "KX_ketsji", "..\gameengine\ketsji\KX_ketsji.vcproj", "{E645CC32-4823-463E-82F0-46ADDE664018}" + ProjectSection(ProjectDependencies) = postProject + {FB55B14E-D38E-4D04-BA7B-748EBC97FDB6} = {FB55B14E-D38E-4D04-BA7B-748EBC97FDB6} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "KX_network", "..\gameengine\ketsji\network\KX_network.vcproj", "{6E24BF09-9653-4166-A871-F65CC9E98A9B}" EndProject @@ -340,6 +343,9 @@ EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BF_collada", "collada\BF_collada.vcproj", "{76D3102B-7DD2-8BA1-034A-8B19FE2897C2}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BL_modifiers", "modifiers\modifiers.vcproj", "{7CB0C521-91E0-40CE-A7C4-45FEA7ABE8BC}" + ProjectSection(ProjectDependencies) = postProject + {FB55B14E-D38E-4D04-BA7B-748EBC97FDB6} = {FB55B14E-D38E-4D04-BA7B-748EBC97FDB6} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "EXT_recastnavigation", "..\..\extern\recastnavigation\make\msvc_9_0\recastnavigation.vcproj", "{FB55B14E-D38E-4D04-BA7B-748EBC97FDB6}" EndProject diff --git a/projectfiles_vc9/blender/modifiers/modifiers.vcproj b/projectfiles_vc9/blender/modifiers/modifiers.vcproj index f47c3ec00ca..c994e838dc9 100644 --- a/projectfiles_vc9/blender/modifiers/modifiers.vcproj +++ b/projectfiles_vc9/blender/modifiers/modifiers.vcproj @@ -182,7 +182,7 @@ #include "Recast.h" +#include "NavMeshConversion.h" extern "C"{ @@ -36,399 +37,13 @@ extern "C"{ #include "BKE_mesh.h" #include "BKE_modifier.h" #include "BKE_particle.h" +#include "BKE_customdata.h" #include "MEM_guardedalloc.h" #include "BIF_gl.h" #include "gpu_buffers.h" #include "GPU_draw.h" #include "UI_resources.h" -//service function -inline int abs(int a) -{ - return a>=0 ? a: -a; -} -inline int bit(int a, int b) -{ - return (a & (1 << b)) >> b; -} - -inline void intToCol(int i, float* col) -{ - int r = bit(i, 0) + bit(i, 3) * 2 + 1; - int g = bit(i, 1) + bit(i, 4) * 2 + 1; - int b = bit(i, 2) + bit(i, 5) * 2 + 1; - col[0] = 1 - r*63.0f/255.0f; - col[1] = 1 - g*63.0f/255.0f; - col[2] = 1 - b*63.0f/255.0f; -} - -inline float area2(const float* a, const float* b, const float* c) -{ - return (b[0] - a[0]) * (c[2] - a[2]) - (c[0] - a[0]) * (b[2] - a[2]); -} -inline bool left(const float* a, const float* b, const float* c) -{ - return area2(a, b, c) < 0; -} - -inline int polyNumVerts(const unsigned short* p, const int vertsPerPoly) -{ - int nv = 0; - for (int i=0; i 0) - t /= d; - if (t < 0) - t = 0; - else if (t > 1) - t = 1; - dx[0] = a[0] + t*abx[0] - point[0]; - dx[2] = a[2] + t*abx[2] - point[2]; - return dx[0]*dx[0] + dx[2]*dx[2]; -} - -static bool buildRawVertIndicesData(DerivedMesh* dm, int &nverts, float *&verts, - int &ntris, unsigned short *&tris, int *&trisToFacesMap, - int *&recastData) -{ - nverts = dm->getNumVerts(dm); - verts = new float[3*nverts]; - dm->getVertCos(dm, (float(*)[3])verts); - - //flip coordinates - for (int vi=0; vigetNumFaces(dm); - MFace *faces = dm->getFaceArray(dm); - ntris = nfaces; - for (int fi=0; fiv4) - ntris++; - } - - //copy and transform to triangles (reorder on the run) - trisToFacesMap = new int[ntris]; - tris = new unsigned short[3*ntris]; - unsigned short* tri = tris; - int triIdx = 0; - for (int fi=0; fiv1; - tri[3*triIdx+1] = face->v3; - tri[3*triIdx+2] = face->v2; - trisToFacesMap[triIdx++]=fi; - if (face->v4) - { - tri[3*triIdx+0] = face->v1; - tri[3*triIdx+1] = face->v4; - tri[3*triIdx+2] = face->v2; - trisToFacesMap[triIdx++]=fi; - } - } - - //carefully, recast data is just reference to data in derived mesh - recastData = (int*)CustomData_get_layer(&dm->faceData, CD_PROP_INT); - return true; -} - -static bool buildPolygonsByDetailedMeshes(const int vertsPerPoly, const int npolys, - unsigned short* polys, const unsigned short* dmeshes, - const float* verts, const unsigned short* dtris, - const int* dtrisToPolysMap) -{ - bool res = false; - int capacity = vertsPerPoly; - unsigned short* newPoly = new unsigned short[capacity]; - memset(newPoly, 0xff, sizeof(unsigned short)*capacity); - for (int polyidx=0; polyidxtolerance) - adjustedPoly[adjustedNv++] = cur; - } - memcpy(newPoly, adjustedPoly, adjustedNv*sizeof(unsigned short)); - delete adjustedPoly; - nv = adjustedNv; - - if (nv<=vertsPerPoly) - { - for (int i=0; irecastData[context->trisToFacesMap[*(int*)a]] - - context->recastData[context->trisToFacesMap[*(int*)b]] ); -} - -static bool buildNavMeshData(const int nverts, const float* verts, - const int ntris, const unsigned short *tris, - const int* recastData, const int* trisToFacesMap, - int &ndtris, unsigned short *&dtris, - int &npolys, unsigned short *&dmeshes, unsigned short *&polys, - int &vertsPerPoly, int *&dtrisToPolysMap, int *&dtrisToTrisMap) - -{ - if (!recastData) - { - printf("Converting navmesh: Error! Can't find recast custom data\n"); - return false; - } - - //sort the triangles by polygon idx - int* trisMapping = new int[ntris]; - for (int i=0; i0) - { - validTriStart = i; - break; - } - } - - if (validTriStart<0) - { - printf("Converting navmesh: Error! No valid polygons in mesh\n"); - delete trisMapping; - return false; - } - - ndtris = ntris-validTriStart; - //fill dtris to faces mapping - dtrisToTrisMap = new int[ndtris]; - memcpy(dtrisToTrisMap, &trisMapping[validTriStart], ndtris*sizeof(int)); - delete trisMapping; trisMapping=NULL; - - //create detailed mesh triangles - copy only valid triangles - //and reserve memory for adjacency info - dtris = new unsigned short[3*2*ndtris]; - memset(dtris, 0xffff, sizeof(unsigned short)*3*2*ndtris); - for (int i=0; i 0) - t /= d; - if (t < 0) - t = 0; - else if (t > 1) - t = 1; - dx[0] = a[0] + t*abx[0] - point[0]; - dx[1] = a[1] + t*abx[1] - point[1]; - return dx[0]*dx[0] + dx[1]*dx[1]; -} - KX_NavMeshObject::KX_NavMeshObject(void* sgReplicationInfo, SG_Callbacks callbacks) : KX_GameObject(sgReplicationInfo, callbacks) , m_navMesh(NULL) @@ -130,253 +112,98 @@ bool KX_NavMeshObject::BuildVertIndArrays(float *&vertices, int& nverts, int* recastData = (int*) dm->getFaceDataArray(dm, CD_PROP_INT); if (recastData) { - //create from blender mesh using recast data to build navigation - //polygon mesh from detailed triangle mesh - MVert *mvert = dm->getVertArray(dm); - MFace *mface = dm->getFaceArray(dm); - int numfaces = dm->getNumFaces(dm); - int numverts = dm->getNumVerts(dm); + int *dtrisToPolysMap=NULL, *dtrisToTrisMap=NULL, *trisToFacesMap=NULL; + int nAllVerts = 0; + float *allVerts = NULL; + buildNavMeshDataByDerivedMesh(dm, vertsPerPoly, nAllVerts, allVerts, ndtris, dtris, + npolys, dmeshes, polys, dtrisToPolysMap, dtrisToTrisMap, trisToFacesMap); - if (numfaces==0) - { - return true; - } - - //build detailed mesh adjacency (with triangle reordering) - ndtris = numfaces; - dtris = new unsigned short[numfaces*3*2]; - memset(dtris, 0xffff, sizeof(unsigned short)*3*2*numfaces); - for (int i=0; iv1; - dtris[i*3*2+1] = mf->v3; - dtris[i*3*2+2] = mf->v2; - - } - buildMeshAdjacency(dtris, numfaces, numverts, 3); - - - //assumption: detailed mesh triangles are sorted by polygon idx - npolys = recastData[numfaces-1]/* + 1*/; //stored indices start from 1 - - dmeshes = new unsigned short[npolys*4]; - memset(dmeshes, 0, npolys*4*sizeof(unsigned short)); - unsigned short *dmesh = NULL; - int prevpolyidx = -1; - for (int i=0; i poly, tempPoly; - //search border - int btri = -1; - int bedge = -1; - - for (int j=0; jtolerance) - tempPoly.push_back(cur); - } - poly = tempPoly; - - if (poly.size()>vertsPerPoly) - { - printf("Error! Polygon size exceeds max verts count"); - return false; - } - - for (int i=0; imaxidx) - maxidx=idx; - } - } - - //create navigation mesh verts - nverts = maxidx+1; - vertices = new float[nverts*3]; - for (int vi=0; vico); - } - - //create unique detailed mesh verts - ndvertsuniq = numverts - nverts; - if (ndvertsuniq>0) - { - dvertices = new float[ndvertsuniq*3]; - for (int vi=0; vico); - } - } - - for (int polyIdx=0; polyIdx0) - dmesh[0] -= nverts; + dmesh[0] = vbase-nverts; //verts base + dmesh[1] = curIdx-vbase; //verts num + } + + vertices = new float[nverts*3]; + ndvertsuniq = curIdx - nverts; + if (ndvertsuniq>0) + { + dvertices = new float[ndvertsuniq*3]; + } + for (int vi=0; vi Date: Thu, 29 Jul 2010 14:06:48 +0000 Subject: [PATCH 029/182] - fixed bug in steering actuator: calculate 2d distance to target for seeking and fleeing - added possibility to add navmesh modifier manually in order to transform manually created mesh to navigation mesh (with navigation polygons data layer) - added possibility to use existed navigation mesh object for navmesh generation (so new object won't be created, but existed object will be updated) --- .../BlenderNavMesh/NavMeshConversion.cpp | 11 +++- .../blender/editors/object/object_navmesh.cpp | 66 +++++++++++++++---- source/blender/makesrna/intern/rna_modifier.c | 2 +- .../blender/modifiers/intern/MOD_navmesh.cpp | 41 ++++++++++-- .../gameengine/Ketsji/KX_SteeringActuator.cpp | 6 +- 5 files changed, 100 insertions(+), 26 deletions(-) diff --git a/extern/recastnavigation/BlenderNavMesh/NavMeshConversion.cpp b/extern/recastnavigation/BlenderNavMesh/NavMeshConversion.cpp index ed02a27cc43..ca11ed68c54 100644 --- a/extern/recastnavigation/BlenderNavMesh/NavMeshConversion.cpp +++ b/extern/recastnavigation/BlenderNavMesh/NavMeshConversion.cpp @@ -310,11 +310,18 @@ bool buildNavMeshData(const int nverts, const float* verts, { memcpy(dtris+3*2*i, tris+3*dtrisToTrisMap[i], sizeof(unsigned short)*3); } - //create new recast data corresponded to dtris + //create new recast data corresponded to dtris and renumber for continious indices + int prevPolyIdx=-1, curPolyIdx, newPolyIdx=0; dtrisToPolysMap = new int[ndtris]; for (int i=0; iobject; + scene_select_base(scene, base); + copy_v3_v3(obedit->loc, co); + copy_v3_v3(obedit->rot, rot); + } + ED_object_enter_editmode(C, EM_DO_UNDO|EM_IGNORE_LAYER); em = BKE_mesh_get_editmesh(((Mesh *)obedit->data)); + if (!createob) + { + //clear + if(em->verts.first) free_vertlist(em, &em->verts); + if(em->edges.first) free_edgelist(em, &em->edges); + if(em->faces.first) free_facelist(em, &em->faces); + if(em->selected.first) BLI_freelistN(&(em->selected)); + } + //create verts for polygon mesh for(i = 0; i < pmesh->nverts; i++) { v = &pmesh->verts[3*i]; @@ -392,13 +417,20 @@ static Object* createRepresentation(bContext *C, rcPolyMesh*& pmesh, rcPolyMeshD ED_object_exit_editmode(C, EM_FREEDATA); WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, obedit); - obedit->gameflag &= ~OB_COLLISION; - obedit->gameflag |= OB_NAVMESH; - obedit->body_type = OB_BODY_TYPE_NAVMESH; - rename_id((ID *)obedit, "Navmesh"); + if (createob) + { + obedit->gameflag &= ~OB_COLLISION; + obedit->gameflag |= OB_NAVMESH; + obedit->body_type = OB_BODY_TYPE_NAVMESH; + rename_id((ID *)obedit, "Navmesh"); + } + + ModifierData *md= modifiers_findByType(obedit, eModifierType_NavMesh); + if (!md) + { + ED_object_modifier_add(NULL, scene, obedit, NULL, eModifierType_NavMesh); + } - ED_object_modifier_add(NULL, scene, obedit, NULL, eModifierType_NavMesh); - //ModifierData *md= modifiers_findByType(ob, eModifierType_NavMesh); return obedit; } @@ -411,15 +443,22 @@ static int create_navmesh_exec(bContext *C, wmOperator *op) rcPolyMesh* pmesh; rcPolyMeshDetail* dmesh; LinkNode* obs = NULL; + Base* navmeshBase = NULL; CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) { - BLI_linklist_append(&obs, (void*)base->object); + if (base->object->body_type==OB_BODY_TYPE_NAVMESH) + { + if (!navmeshBase || base==CTX_data_active_base(C)) + navmeshBase = base; + } + else + BLI_linklist_append(&obs, (void*)base->object); } CTX_DATA_END; createVertsTrisData(C, obs, nverts, verts, ntris, tris); BLI_linklist_free(obs, NULL); buildNavMesh(scene->gm.recastData, nverts, verts, ntris, tris, pmesh, dmesh); - createRepresentation(C, pmesh, dmesh); + createRepresentation(C, pmesh, dmesh, navmeshBase); return OPERATOR_FINISHED; } @@ -520,7 +559,6 @@ static int findFreeNavPolyIndex(EditMesh* em) qsort(indices, numfaces, sizeof(int), compare); //search first free index int freeIdx = 1; - int maxIdx = indices[numfaces-1]; for (int i=0; igetNumVerts(dm); - int maxEdges = dm->getNumEdges(dm); int maxFaces = dm->getNumFaces(dm); result = CDDM_copy(dm); @@ -209,9 +206,39 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der { DerivedMesh *result = NULL; NavMeshModifierData *nmmd = (NavMeshModifierData*) md; + bool hasRecastData = CustomData_has_layer(&derivedData->faceData, CD_PROP_INT)>0; + if (ob->body_type!=OB_BODY_TYPE_NAVMESH || !hasRecastData ) + { + //convert to nav mesh object: + //1)set physics type + ob->gameflag &= ~OB_COLLISION; + ob->gameflag |= OB_NAVMESH; + ob->body_type = OB_BODY_TYPE_NAVMESH; + //2)add and init recast data layer + if (!hasRecastData) + { + int numFaces = derivedData->getNumFaces(derivedData); + CustomData_add_layer_named(&derivedData->faceData, CD_PROP_INT, CD_CALLOC, NULL, numFaces, "recastData"); + int* recastData = (int*)CustomData_get_layer(&derivedData->faceData, CD_PROP_INT); + for (int i=0; ibody_type==OB_BODY_TYPE_NAVMESH) - result = createNavMeshForVisualization(nmmd, derivedData); + Mesh* obmesh = (Mesh *)ob->data; + if (obmesh) + { + CustomData_add_layer_named(&obmesh->fdata, CD_PROP_INT, CD_CALLOC, NULL, numFaces, "recastData"); + int* recastData = (int*)CustomData_get_layer(&obmesh->fdata, CD_PROP_INT); + for (int i=0; iNodeGetWorldPosition(); const MT_Point3& targpos = m_target->NodeGetWorldPosition(); MT_Vector3 vectotarg = targpos - mypos; + MT_Vector3 vectotarg2d = vectotarg; + vectotarg2d.z() = 0; MT_Vector3 steervec = MT_Vector3(0, 0, 0); bool apply_steerforce = false; bool terminate = true; switch (m_mode) { case KX_STEERING_SEEK: - if (vectotarg.length2()>m_distance*m_distance) + if (vectotarg2d.length2()>m_distance*m_distance) { terminate = false; steervec = vectotarg; @@ -188,7 +190,7 @@ bool KX_SteeringActuator::Update(double curtime, bool frame) } break; case KX_STEERING_FLEE: - if (vectotarg.length2() Date: Fri, 30 Jul 2010 13:02:32 +0000 Subject: [PATCH 030/182] - moved navmesh conversion code to ED_Editors project (ED_navmesh_conversion.h and navmesh_conversion.cpp files) - added new custom data layer CD_Recast --- .../make/msvc_9_0/recastnavigation.vcproj | 12 - .../blender/editors/ED_editors.vcproj | 8 + .../blender/modifiers/modifiers.vcproj | 4 +- .../gameengine/ketsji/KX_ketsji.vcproj | 4 +- source/blender/blenkernel/intern/customdata.c | 11 +- .../editors/include/ED_navmesh_conversion.h | 96 ++++ .../blender/editors/object/object_navmesh.cpp | 16 +- .../editors/util/navmesh_conversion.cpp | 420 ++++++++++++++++++ .../blender/makesdna/DNA_customdata_types.h | 4 +- source/blender/makesdna/DNA_meshdata_types.h | 4 + .../blender/modifiers/intern/MOD_navmesh.cpp | 23 +- source/gameengine/Ketsji/KX_NavMeshObject.cpp | 7 +- 12 files changed, 566 insertions(+), 43 deletions(-) create mode 100644 source/blender/editors/include/ED_navmesh_conversion.h create mode 100644 source/blender/editors/util/navmesh_conversion.cpp diff --git a/extern/recastnavigation/make/msvc_9_0/recastnavigation.vcproj b/extern/recastnavigation/make/msvc_9_0/recastnavigation.vcproj index 5dfa123e471..bc3004da895 100644 --- a/extern/recastnavigation/make/msvc_9_0/recastnavigation.vcproj +++ b/extern/recastnavigation/make/msvc_9_0/recastnavigation.vcproj @@ -269,18 +269,6 @@ - - - - - - diff --git a/projectfiles_vc9/blender/editors/ED_editors.vcproj b/projectfiles_vc9/blender/editors/ED_editors.vcproj index 7755145e6c2..38e9e31d7e7 100644 --- a/projectfiles_vc9/blender/editors/ED_editors.vcproj +++ b/projectfiles_vc9/blender/editors/ED_editors.vcproj @@ -250,6 +250,10 @@ RelativePath="..\..\..\source\blender\editors\include\ED_mesh.h" > + + @@ -719,6 +723,10 @@ RelativePath="..\..\..\source\blender\editors\util\editmode_undo.c" > + + diff --git a/projectfiles_vc9/blender/modifiers/modifiers.vcproj b/projectfiles_vc9/blender/modifiers/modifiers.vcproj index c994e838dc9..f47c3ec00ca 100644 --- a/projectfiles_vc9/blender/modifiers/modifiers.vcproj +++ b/projectfiles_vc9/blender/modifiers/modifiers.vcproj @@ -182,7 +182,7 @@ > b; +} + +inline void intToCol(int i, float* col) +{ + int r = bit(i, 0) + bit(i, 3) * 2 + 1; + int g = bit(i, 1) + bit(i, 4) * 2 + 1; + int b = bit(i, 2) + bit(i, 5) * 2 + 1; + col[0] = 1 - r*63.0f/255.0f; + col[1] = 1 - g*63.0f/255.0f; + col[2] = 1 - b*63.0f/255.0f; +} + +inline float area2(const float* a, const float* b, const float* c) +{ + return (b[0] - a[0]) * (c[2] - a[2]) - (c[0] - a[0]) * (b[2] - a[2]); +} +inline bool left(const float* a, const float* b, const float* c) +{ + return area2(a, b, c) < 0; +} + +#ifdef __cplusplus +} +#endif +#endif //NAVMESH_CONVERSION_H \ No newline at end of file diff --git a/source/blender/editors/object/object_navmesh.cpp b/source/blender/editors/object/object_navmesh.cpp index b8728e35a54..dd947e02de6 100644 --- a/source/blender/editors/object/object_navmesh.cpp +++ b/source/blender/editors/object/object_navmesh.cpp @@ -355,7 +355,7 @@ static Object* createRepresentation(bContext *C, rcPolyMesh*& pmesh, rcPolyMeshD polyverts = pmesh->nverts; //create custom data layer to save polygon idx - CustomData_add_layer_named(&em->fdata, CD_PROP_INT, CD_CALLOC, NULL, 0, "recastData"); + CustomData_add_layer_named(&em->fdata, CD_RECAST, CD_CALLOC, NULL, 0, "recastData"); //create verts and faces for detailed mesh for (i=0; inmeshes; i++) @@ -398,7 +398,7 @@ static Object* createRepresentation(bContext *C, rcPolyMesh*& pmesh, rcPolyMeshD EM_get_vert_for_index(face[1]), NULL, NULL, NULL); //set navigation polygon idx to the custom layer - int* polygonIdx = (int*)CustomData_em_get(&em->fdata, newFace->data, CD_PROP_INT); + int* polygonIdx = (int*)CustomData_em_get(&em->fdata, newFace->data, CD_RECAST); *polygonIdx = i+1; //add 1 to avoid zero idx } @@ -496,9 +496,9 @@ static int assign_navpolygon_exec(bContext *C, wmOperator *op) efa = EM_get_actFace(em, 0); if (efa) { - if (CustomData_has_layer(&em->fdata, CD_PROP_INT)) + if (CustomData_has_layer(&em->fdata, CD_RECAST)) { - targetPolyIdx = *(int*)CustomData_em_get(&em->fdata, efa->data, CD_PROP_INT); + targetPolyIdx = *(int*)CustomData_em_get(&em->fdata, efa->data, CD_RECAST); targetPolyIdx = targetPolyIdx>=0? targetPolyIdx : -targetPolyIdx; if (targetPolyIdx>0) { @@ -508,7 +508,7 @@ static int assign_navpolygon_exec(bContext *C, wmOperator *op) { if((ef->f & SELECT )&& ef!=efa) { - int* recastDataBlock = (int*)CustomData_em_get(&em->fdata, ef->data, CD_PROP_INT); + int* recastDataBlock = (int*)CustomData_em_get(&em->fdata, ef->data, CD_RECAST); *recastDataBlock = targetPolyIdx; } ef = ef->prev; @@ -551,7 +551,7 @@ static int findFreeNavPolyIndex(EditMesh* em) int idx = 0; while(ef) { - int polyIdx = *(int*)CustomData_em_get(&em->fdata, ef->data, CD_PROP_INT); + int polyIdx = *(int*)CustomData_em_get(&em->fdata, ef->data, CD_RECAST); indices[idx] = polyIdx; idx++; ef = ef->prev; @@ -576,7 +576,7 @@ static int assign_new_navpolygon_exec(bContext *C, wmOperator *op) EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data); EditFace *ef; - if (CustomData_has_layer(&em->fdata, CD_PROP_INT)) + if (CustomData_has_layer(&em->fdata, CD_RECAST)) { int targetPolyIdx = findFreeNavPolyIndex(em); if (targetPolyIdx>0) @@ -587,7 +587,7 @@ static int assign_new_navpolygon_exec(bContext *C, wmOperator *op) { if(ef->f & SELECT ) { - int* recastDataBlock = (int*)CustomData_em_get(&em->fdata, ef->data, CD_PROP_INT); + int* recastDataBlock = (int*)CustomData_em_get(&em->fdata, ef->data, CD_RECAST); *recastDataBlock = targetPolyIdx; } ef = ef->prev; diff --git a/source/blender/editors/util/navmesh_conversion.cpp b/source/blender/editors/util/navmesh_conversion.cpp new file mode 100644 index 00000000000..a5f91198fef --- /dev/null +++ b/source/blender/editors/util/navmesh_conversion.cpp @@ -0,0 +1,420 @@ +/** +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. +* All rights reserved. +* +* The Original Code is: all of this file. +* +* Contributor(s): none yet. +* +* ***** END GPL LICENSE BLOCK ***** +*/ +#include +#include "Recast.h" + + +extern "C"{ +#include "ED_navmesh_conversion.h" + +#include "DNA_meshdata_types.h" +#include "BKE_cdderivedmesh.h" +#include "BLI_math.h" +} + +int polyNumVerts(const unsigned short* p, const int vertsPerPoly) +{ + int nv = 0; + for (int i=0; i 0) + t /= d; + if (t < 0) + t = 0; + else if (t > 1) + t = 1; + dx[0] = a[0] + t*abx[0] - point[0]; + dx[2] = a[2] + t*abx[2] - point[2]; + return dx[0]*dx[0] + dx[2]*dx[2]; +} + +bool buildRawVertIndicesData(DerivedMesh* dm, int &nverts, float *&verts, + int &ntris, unsigned short *&tris, int *&trisToFacesMap, + int *&recastData) +{ + nverts = dm->getNumVerts(dm); + if (nverts>=0xffff) + { + printf("Converting navmesh: Error! Too many vertices. Max number of vertices %d\n", 0xffff); + return false; + } + verts = new float[3*nverts]; + dm->getVertCos(dm, (float(*)[3])verts); + + //flip coordinates + for (int vi=0; vigetNumFaces(dm); + MFace *faces = dm->getFaceArray(dm); + ntris = nfaces; + for (int fi=0; fiv4) + ntris++; + } + + //copy and transform to triangles (reorder on the run) + trisToFacesMap = new int[ntris]; + tris = new unsigned short[3*ntris]; + unsigned short* tri = tris; + int triIdx = 0; + for (int fi=0; fiv1; + tri[3*triIdx+1] = (unsigned short) face->v3; + tri[3*triIdx+2] = (unsigned short) face->v2; + trisToFacesMap[triIdx++]=fi; + if (face->v4) + { + tri[3*triIdx+0] = (unsigned short) face->v1; + tri[3*triIdx+1] = (unsigned short) face->v4; + tri[3*triIdx+2] = (unsigned short) face->v3; + trisToFacesMap[triIdx++]=fi; + } + } + + //carefully, recast data is just reference to data in derived mesh + recastData = (int*)CustomData_get_layer(&dm->faceData, CD_RECAST); + return true; +} + +bool buildPolygonsByDetailedMeshes(const int vertsPerPoly, const int npolys, + unsigned short* polys, const unsigned short* dmeshes, + const float* verts, const unsigned short* dtris, + const int* dtrisToPolysMap) +{ + bool res = false; + int capacity = vertsPerPoly; + unsigned short* newPoly = new unsigned short[capacity]; + memset(newPoly, 0xff, sizeof(unsigned short)*capacity); + for (int polyidx=0; polyidxtolerance) + adjustedPoly[adjustedNv++] = cur; + } + memcpy(newPoly, adjustedPoly, adjustedNv*sizeof(unsigned short)); + delete adjustedPoly; + nv = adjustedNv; + + if (nv<=vertsPerPoly) + { + for (int i=0; irecastData[context->trisToFacesMap[*(int*)a]] - + context->recastData[context->trisToFacesMap[*(int*)b]] ); +} + +bool buildNavMeshData(const int nverts, const float* verts, + const int ntris, const unsigned short *tris, + const int* recastData, const int* trisToFacesMap, + int &ndtris, unsigned short *&dtris, + int &npolys, unsigned short *&dmeshes, unsigned short *&polys, + int &vertsPerPoly, int *&dtrisToPolysMap, int *&dtrisToTrisMap) + +{ + if (!recastData) + { + printf("Converting navmesh: Error! Can't find recast custom data\n"); + return false; + } + + //sort the triangles by polygon idx + int* trisMapping = new int[ntris]; + for (int i=0; i0) + { + validTriStart = i; + break; + } + } + + if (validTriStart<0) + { + printf("Converting navmesh: Error! No valid polygons in mesh\n"); + delete trisMapping; + return false; + } + + ndtris = ntris-validTriStart; + //fill dtris to faces mapping + dtrisToTrisMap = new int[ndtris]; + memcpy(dtrisToTrisMap, &trisMapping[validTriStart], ndtris*sizeof(int)); + delete trisMapping; trisMapping=NULL; + + //create detailed mesh triangles - copy only valid triangles + //and reserve memory for adjacency info + dtris = new unsigned short[3*2*ndtris]; + memset(dtris, 0xffff, sizeof(unsigned short)*3*2*ndtris); + for (int i=0; iflag (1=SELECT) */ #define ME_SPHERETEST 2 #define ME_VERT_TMP_TAG 4 diff --git a/source/blender/modifiers/intern/MOD_navmesh.cpp b/source/blender/modifiers/intern/MOD_navmesh.cpp index 851615769ab..fb322086bbc 100644 --- a/source/blender/modifiers/intern/MOD_navmesh.cpp +++ b/source/blender/modifiers/intern/MOD_navmesh.cpp @@ -27,9 +27,10 @@ */ #include #include "Recast.h" -#include "NavMeshConversion.h" extern "C"{ +#include "ED_navmesh_conversion.h" + #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "BLI_math.h" @@ -66,7 +67,7 @@ static void drawNavMeshColored(DerivedMesh *dm) int a, glmode; MVert *mvert = (MVert *)CustomData_get_layer(&dm->vertData, CD_MVERT); MFace *mface = (MFace *)CustomData_get_layer(&dm->faceData, CD_MFACE); - int* polygonIdx = (int*)CustomData_get_layer(&dm->faceData, CD_PROP_INT); + int* polygonIdx = (int*)CustomData_get_layer(&dm->faceData, CD_RECAST); if (!polygonIdx) return; const float BLACK_COLOR[3] = {0.f, 0.f, 0.f}; @@ -86,7 +87,7 @@ static void drawNavMeshColored(DerivedMesh *dm) glBegin(glmode = GL_QUADS); for(a = 0; a < dm->numFaceData; a++, mface++) { int new_glmode = mface->v4?GL_QUADS:GL_TRIANGLES; - int polygonIdx = *(int*)CustomData_get(&dm->faceData, a, CD_PROP_INT); + int polygonIdx = *(int*)CustomData_get(&dm->faceData, a, CD_RECAST); if (polygonIdx<=0) memcpy(col, BLACK_COLOR, 3*sizeof(float)); else @@ -128,10 +129,10 @@ static DerivedMesh *createNavMeshForVisualization(NavMeshModifierData *mmd,Deriv int maxFaces = dm->getNumFaces(dm); result = CDDM_copy(dm); - int *recastData = (int*)CustomData_get_layer(&dm->faceData, CD_PROP_INT); - CustomData_add_layer_named(&result->faceData, CD_PROP_INT, CD_DUPLICATE, + int *recastData = (int*)CustomData_get_layer(&dm->faceData, CD_RECAST); + CustomData_add_layer_named(&result->faceData, CD_RECAST, CD_DUPLICATE, recastData, maxFaces, "recastData"); - recastData = (int*)CustomData_get_layer(&result->faceData, CD_PROP_INT); + recastData = (int*)CustomData_get_layer(&result->faceData, CD_RECAST); result->drawFacesTex = navDM_drawFacesTex; result->drawFacesSolid = navDM_drawFacesSolid; @@ -206,7 +207,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der { DerivedMesh *result = NULL; NavMeshModifierData *nmmd = (NavMeshModifierData*) md; - bool hasRecastData = CustomData_has_layer(&derivedData->faceData, CD_PROP_INT)>0; + bool hasRecastData = CustomData_has_layer(&derivedData->faceData, CD_RECAST)>0; if (ob->body_type!=OB_BODY_TYPE_NAVMESH || !hasRecastData ) { //convert to nav mesh object: @@ -218,8 +219,8 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der if (!hasRecastData) { int numFaces = derivedData->getNumFaces(derivedData); - CustomData_add_layer_named(&derivedData->faceData, CD_PROP_INT, CD_CALLOC, NULL, numFaces, "recastData"); - int* recastData = (int*)CustomData_get_layer(&derivedData->faceData, CD_PROP_INT); + CustomData_add_layer_named(&derivedData->faceData, CD_RECAST, CD_CALLOC, NULL, numFaces, "recastData"); + int* recastData = (int*)CustomData_get_layer(&derivedData->faceData, CD_RECAST); for (int i=0; idata; if (obmesh) { - CustomData_add_layer_named(&obmesh->fdata, CD_PROP_INT, CD_CALLOC, NULL, numFaces, "recastData"); - int* recastData = (int*)CustomData_get_layer(&obmesh->fdata, CD_PROP_INT); + CustomData_add_layer_named(&obmesh->fdata, CD_RECAST, CD_CALLOC, NULL, numFaces, "recastData"); + int* recastData = (int*)CustomData_get_layer(&obmesh->fdata, CD_RECAST); for (int i=0; iGetBlenderScene(), GetBlenderObject(), NULL, CD_MASK_MESH); - int* recastData = (int*) dm->getFaceDataArray(dm, CD_PROP_INT); + int* recastData = (int*) dm->getFaceDataArray(dm, CD_RECAST); if (recastData) { int *dtrisToPolysMap=NULL, *dtrisToTrisMap=NULL, *trisToFacesMap=NULL; From a2372308d739879e99423851bc1e1dcd82cf19bf Mon Sep 17 00:00:00 2001 From: Nick Samarin Date: Wed, 4 Aug 2010 19:32:37 +0000 Subject: [PATCH 031/182] integrated adaptive sampling algorithm for obstacle avoidance --- .../BlenderNavMesh/NavMeshConversion.cpp | 413 ---------------- .../BlenderNavMesh/NavMeshConversion.h | 98 ---- .../gameengine/ketsji/KX_ketsji.vcproj | 2 +- .../Ketsji/KX_ObstacleSimulation.cpp | 447 +++++++++++++----- .../gameengine/Ketsji/KX_ObstacleSimulation.h | 31 +- .../gameengine/Ketsji/KX_SteeringActuator.cpp | 11 +- 6 files changed, 365 insertions(+), 637 deletions(-) delete mode 100644 extern/recastnavigation/BlenderNavMesh/NavMeshConversion.cpp delete mode 100644 extern/recastnavigation/BlenderNavMesh/NavMeshConversion.h diff --git a/extern/recastnavigation/BlenderNavMesh/NavMeshConversion.cpp b/extern/recastnavigation/BlenderNavMesh/NavMeshConversion.cpp deleted file mode 100644 index ca11ed68c54..00000000000 --- a/extern/recastnavigation/BlenderNavMesh/NavMeshConversion.cpp +++ /dev/null @@ -1,413 +0,0 @@ -/** -* $Id$ -* -* ***** BEGIN GPL LICENSE BLOCK ***** -* -* This program is free software; you can redistribute it and/or -* modify it under the terms of the GNU General Public License -* as published by the Free Software Foundation; either version 2 -* of the License, or (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program; if not, write to the Free Software Foundation, -* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -* -* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. -* All rights reserved. -* -* The Original Code is: all of this file. -* -* Contributor(s): none yet. -* -* ***** END GPL LICENSE BLOCK ***** -*/ - -#include "NavMeshConversion.h" -extern "C"{ -#include "BLI_math.h" -} - -int polyNumVerts(const unsigned short* p, const int vertsPerPoly) -{ - int nv = 0; - for (int i=0; i 0) - t /= d; - if (t < 0) - t = 0; - else if (t > 1) - t = 1; - dx[0] = a[0] + t*abx[0] - point[0]; - dx[2] = a[2] + t*abx[2] - point[2]; - return dx[0]*dx[0] + dx[2]*dx[2]; -} - -bool buildRawVertIndicesData(DerivedMesh* dm, int &nverts, float *&verts, - int &ntris, unsigned short *&tris, int *&trisToFacesMap, - int *&recastData) -{ - nverts = dm->getNumVerts(dm); - verts = new float[3*nverts]; - dm->getVertCos(dm, (float(*)[3])verts); - - //flip coordinates - for (int vi=0; vigetNumFaces(dm); - MFace *faces = dm->getFaceArray(dm); - ntris = nfaces; - for (int fi=0; fiv4) - ntris++; - } - - //copy and transform to triangles (reorder on the run) - trisToFacesMap = new int[ntris]; - tris = new unsigned short[3*ntris]; - unsigned short* tri = tris; - int triIdx = 0; - for (int fi=0; fiv1; - tri[3*triIdx+1] = face->v3; - tri[3*triIdx+2] = face->v2; - trisToFacesMap[triIdx++]=fi; - if (face->v4) - { - tri[3*triIdx+0] = face->v1; - tri[3*triIdx+1] = face->v4; - tri[3*triIdx+2] = face->v3; - trisToFacesMap[triIdx++]=fi; - } - } - - //carefully, recast data is just reference to data in derived mesh - recastData = (int*)CustomData_get_layer(&dm->faceData, CD_PROP_INT); - return true; -} - -bool buildPolygonsByDetailedMeshes(const int vertsPerPoly, const int npolys, - unsigned short* polys, const unsigned short* dmeshes, - const float* verts, const unsigned short* dtris, - const int* dtrisToPolysMap) -{ - bool res = false; - int capacity = vertsPerPoly; - unsigned short* newPoly = new unsigned short[capacity]; - memset(newPoly, 0xff, sizeof(unsigned short)*capacity); - for (int polyidx=0; polyidxtolerance) - adjustedPoly[adjustedNv++] = cur; - } - memcpy(newPoly, adjustedPoly, adjustedNv*sizeof(unsigned short)); - delete adjustedPoly; - nv = adjustedNv; - - if (nv<=vertsPerPoly) - { - for (int i=0; irecastData[context->trisToFacesMap[*(int*)a]] - - context->recastData[context->trisToFacesMap[*(int*)b]] ); -} - -bool buildNavMeshData(const int nverts, const float* verts, - const int ntris, const unsigned short *tris, - const int* recastData, const int* trisToFacesMap, - int &ndtris, unsigned short *&dtris, - int &npolys, unsigned short *&dmeshes, unsigned short *&polys, - int &vertsPerPoly, int *&dtrisToPolysMap, int *&dtrisToTrisMap) - -{ - if (!recastData) - { - printf("Converting navmesh: Error! Can't find recast custom data\n"); - return false; - } - - //sort the triangles by polygon idx - int* trisMapping = new int[ntris]; - for (int i=0; i0) - { - validTriStart = i; - break; - } - } - - if (validTriStart<0) - { - printf("Converting navmesh: Error! No valid polygons in mesh\n"); - delete trisMapping; - return false; - } - - ndtris = ntris-validTriStart; - //fill dtris to faces mapping - dtrisToTrisMap = new int[ndtris]; - memcpy(dtrisToTrisMap, &trisMapping[validTriStart], ndtris*sizeof(int)); - delete trisMapping; trisMapping=NULL; - - //create detailed mesh triangles - copy only valid triangles - //and reserve memory for adjacency info - dtris = new unsigned short[3*2*ndtris]; - memset(dtris, 0xffff, sizeof(unsigned short)*3*2*ndtris); - for (int i=0; i -#include "Recast.h" -extern "C"{ -#include "DNA_meshdata_types.h" -#include "BKE_cdderivedmesh.h" -} - -bool buildNavMeshDataByDerivedMesh(DerivedMesh *dm, int& vertsPerPoly, - int &nverts, float *&verts, - int &ndtris, unsigned short *&dtris, - int& npolys, unsigned short *&dmeshes, - unsigned short*& polys, int *&dtrisToPolysMap, - int *&dtrisToTrisMap, int *&trisToFacesMap); - -bool buildRawVertIndicesData(DerivedMesh* dm, int &nverts, float *&verts, - int &ntris, unsigned short *&tris, int *&trisToFacesMap, - int *&recastData); - -bool buildNavMeshData(const int nverts, const float* verts, - const int ntris, const unsigned short *tris, - const int* recastData, const int* trisToFacesMap, - int &ndtris, unsigned short *&dtris, - int &npolys, unsigned short *&dmeshes, unsigned short *&polys, - int &vertsPerPoly, int *&dtrisToPolysMap, int *&dtrisToTrisMap); - -bool buildPolygonsByDetailedMeshes(const int vertsPerPoly, const int npolys, - unsigned short* polys, const unsigned short* dmeshes, - const float* verts, const unsigned short* dtris, - const int* dtrisToPolysMap); - -int polyNumVerts(const unsigned short* p, const int vertsPerPoly); -bool polyIsConvex(const unsigned short* p, const int vertsPerPoly, const float* verts); -int polyFindVertex(const unsigned short* p, const int vertsPerPoly, unsigned short vertexIdx); -float distPointToSegmentSq(const float* point, const float* a, const float* b); - - -inline int abs2(int a) -{ - return a>=0 ? a: -a; -} - -inline int bit(int a, int b) -{ - return (a & (1 << b)) >> b; -} - -inline void intToCol(int i, float* col) -{ - int r = bit(i, 0) + bit(i, 3) * 2 + 1; - int g = bit(i, 1) + bit(i, 4) * 2 + 1; - int b = bit(i, 2) + bit(i, 5) * 2 + 1; - col[0] = 1 - r*63.0f/255.0f; - col[1] = 1 - g*63.0f/255.0f; - col[2] = 1 - b*63.0f/255.0f; -} - -inline float area2(const float* a, const float* b, const float* c) -{ - return (b[0] - a[0]) * (c[2] - a[2]) - (c[0] - a[0]) * (b[2] - a[2]); -} -inline bool left(const float* a, const float* b, const float* c) -{ - return area2(a, b, c) < 0; -} - -#endif //NAVMESH_CONVERSION_H \ No newline at end of file diff --git a/projectfiles_vc9/gameengine/ketsji/KX_ketsji.vcproj b/projectfiles_vc9/gameengine/ketsji/KX_ketsji.vcproj index 37401df6323..ab013aebc21 100644 --- a/projectfiles_vc9/gameengine/ketsji/KX_ketsji.vcproj +++ b/projectfiles_vc9/gameengine/ketsji/KX_ketsji.vcproj @@ -271,7 +271,7 @@ Name="VCCLCompilerTool" Optimization="2" InlineFunctionExpansion="1" - AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\string\include;..\..\..\..\build\msvc_9\intern\moto\include;..\..\..\..\build\msvc_9\intern\soundsystem\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\extern\bullet\include;..\..\..\..\build\msvc_9\extern\solid\include;..\..\..\..\build\msvc_9\extern\recastnavigation\Detour\Include;..\..\..\..\build\msvc_9\extern\recastnavigation\Recast\Include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\..\lib\windows\python\include\python3.1;..\..\..\..\lib\windows\sdl\include;..\..\..\source\blender\imbuf;..\..\..\source\blender\include;..\..\..\source\blender\blenlib;..\..\..\source\blender\python;..\..\..\source\blender\python\generic;..\..\..\source\blender\makesdna;..\..\..\source\blender\blenloader;..\..\..\source\blender\blenkernel;..\..\..\source\kernel\gen_system;..\..\..\source\gameengine\physics;..\..\..\source\gameengine\rasterizer;..\..\..\source\gameengine\network;..\..\..\source\gameengine\Converter;..\..\..\source\gameengine\gamelogic;..\..\..\source\gameengine\scenegraph;..\..\..\source\gameengine\expressions;..\..\..\source\gameengine\physics\sumo;..\..\..\source\gameengine\physics\dummy;..\..\..\source\gameengine\physics\BlOde;..\..\..\source\gameengine\ketsji\kxnetwork;..\..\..\source\gameengine\physics\common;..\..\..\source\gameengine\physics\sumo\include;..\..\..\source\gameengine\physics\common\dummy;..\..\..\source\gameengine\Rasterizer\RAS_OpenGLRasterizer;..\..\..\source\gameengine\physics\sumo\fuzzics\include;..\..\..\source\sumo\include;..\..\..\source\sumo\fuzzics\include;..\..\..\source\gameengine\physics\bullet;..\..\..\source\blender\python\api2_2x;..\..\..\source\blender\gpu;..\..\..\intern\audaspace\intern" + AdditionalIncludeDirectories="..\..\..\..\build\msvc_9\intern\string\include;..\..\..\..\build\msvc_9\intern\moto\include;..\..\..\..\build\msvc_9\intern\soundsystem\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\extern\bullet\include;..\..\..\..\build\msvc_9\extern\solid\include;..\..\..\..\build\msvc_9\extern\recastnavigation\Detour\Include;..\..\..\..\build\msvc_9\extern\recastnavigation\Recast\Include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\..\lib\windows\python\include\python3.1;..\..\..\..\lib\windows\sdl\include;..\..\..\source\blender\imbuf;..\..\..\source\blender\include;..\..\..\source\blender\blenlib;..\..\..\source\blender\python;..\..\..\source\blender\python\generic;..\..\..\source\blender\makesdna;..\..\..\source\blender\blenloader;..\..\..\source\blender\blenkernel;..\..\..\source\blender\editors\include;..\..\..\source\kernel\gen_system;..\..\..\source\gameengine\physics;..\..\..\source\gameengine\rasterizer;..\..\..\source\gameengine\network;..\..\..\source\gameengine\Converter;..\..\..\source\gameengine\gamelogic;..\..\..\source\gameengine\scenegraph;..\..\..\source\gameengine\expressions;..\..\..\source\gameengine\physics\sumo;..\..\..\source\gameengine\physics\dummy;..\..\..\source\gameengine\physics\BlOde;..\..\..\source\gameengine\ketsji\kxnetwork;..\..\..\source\gameengine\physics\common;..\..\..\source\gameengine\physics\sumo\include;..\..\..\source\gameengine\physics\common\dummy;..\..\..\source\gameengine\Rasterizer\RAS_OpenGLRasterizer;..\..\..\source\gameengine\physics\sumo\fuzzics\include;..\..\..\source\sumo\include;..\..\..\source\sumo\fuzzics\include;..\..\..\source\gameengine\physics\bullet;..\..\..\source\blender\python\api2_2x;..\..\..\source\blender\gpu;..\..\..\intern\audaspace\intern" PreprocessorDefinitions="NDEBUG;WIN32;_LIB;USE_SUMO_SOLID;WITH_GLEXT;GLEW_STATIC;WITH_FFMPEG" StringPooling="true" RuntimeLibrary="0" diff --git a/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp b/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp index dcaadd23e3f..4a1ea59e12c 100644 --- a/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp +++ b/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp @@ -38,8 +38,65 @@ #include "DNA_object_types.h" #include "BLI_math.h" -inline float perp(const MT_Vector2& a, const MT_Vector2& b) { return a.x()*b.y() - a.y()*b.x(); } -inline float lerp(float a, float b, float t) { return a + (b-a)*t; } +namespace +{ + inline float perp(const MT_Vector2& a, const MT_Vector2& b) { return a.x()*b.y() - a.y()*b.x(); } + + inline float sqr(float x) { return x*x; } + inline float lerp(float a, float b, float t) { return a + (b-a)*t; } + inline float clamp(float a, float mn, float mx) { return a < mn ? mn : (a > mx ? mx : a); } + + inline float vdistsqr(const float* a, const float* b) { return sqr(b[0]-a[0]) + sqr(b[1]-a[1]); } + inline float vdist(const float* a, const float* b) { return sqrtf(vdistsqr(a,b)); } + inline void vcpy(float* a, const float* b) { a[0]=b[0]; a[1]=b[1]; } + inline float vdot(const float* a, const float* b) { return a[0]*b[0] + a[1]*b[1]; } + inline float vperp(const float* a, const float* b) { return a[0]*b[1] - a[1]*b[0]; } + inline void vsub(float* v, const float* a, const float* b) { v[0] = a[0]-b[0]; v[1] = a[1]-b[1]; } + inline void vadd(float* v, const float* a, const float* b) { v[0] = a[0]+b[0]; v[1] = a[1]+b[1]; } + inline void vscale(float* v, const float* a, const float s) { v[0] = a[0]*s; v[1] = a[1]*s; } + inline void vset(float* v, float x, float y) { v[0]=x; v[1]=y; } + inline float vlensqr(const float* v) { return vdot(v,v); } + inline float vlen(const float* v) { return sqrtf(vlensqr(v)); } + inline void vlerp(float* v, const float* a, const float* b, float t) { v[0] = lerp(a[0], b[0], t); v[1] = lerp(a[1], b[1], t); } + inline void vmad(float* v, const float* a, const float* b, float s) { v[0] = a[0] + b[0]*s; v[1] = a[1] + b[1]*s; } + inline void vnorm(float* v) + { + float d = vlen(v); + if (d > 0.0001f) + { + d = 1.0f/d; + v[0] *= d; + v[1] *= d; + } + } +} +inline float triarea(const float* a, const float* b, const float* c) +{ + return (b[0]*a[1] - a[0]*b[1]) + (c[0]*b[1] - b[0]*c[1]) + (a[0]*c[1] - c[0]*a[1]); +} + +static void closestPtPtSeg(const float* pt, + const float* sp, const float* sq, + float& t) +{ + float dir[2],diff[3]; + vsub(dir,sq,sp); + vsub(diff,pt,sp); + t = vdot(diff,dir); + if (t <= 0.0f) { t = 0; return; } + float d = vdot(dir,dir); + if (t >= d) { t = 1; return; } + t /= d; +} + +static float distPtSegSqr(const float* pt, const float* sp, const float* sq) +{ + float t; + closestPtPtSeg(pt, sp,sq, t); + float np[2]; + vlerp(np, sp,sq, t); + return vdistsqr(pt,np); +} static int sweepCircleCircle(const MT_Vector3& pos0, const MT_Scalar r0, const MT_Vector2& v, const MT_Vector3& pos1, const MT_Scalar r1, @@ -152,20 +209,6 @@ static bool inBetweenAngle(float a, float amin, float amax, float& t) return false; } -static float interpolateToi(float a, const float* dir, const float* toi, const int ntoi) -{ - for (int i = 0; i < ntoi; ++i) - { - int next = (i+1) % ntoi; - float t; - if (inBetweenAngle(a, dir[i], dir[next], t)) - { - return lerp(toi[i], toi[next], t); - } - } - return 0; -} - KX_ObstacleSimulation::KX_ObstacleSimulation(MT_Scalar levelHeight, bool enableVisualization) : m_levelHeight(levelHeight) , m_enableVisualization(enableVisualization) @@ -186,6 +229,15 @@ KX_Obstacle* KX_ObstacleSimulation::CreateObstacle(KX_GameObject* gameobj) { KX_Obstacle* obstacle = new KX_Obstacle(); obstacle->m_gameObj = gameobj; + + vset(obstacle->vel, 0,0); + vset(obstacle->pvel, 0,0); + vset(obstacle->dvel, 0,0); + vset(obstacle->nvel, 0,0); + for (int i = 0; i < VEL_HIST_SIZE; ++i) + vset(&obstacle->hvel[i*2], 0,0); + obstacle->hhead = 0; + gameobj->RegisterObstacle(this); m_obstacles.push_back(obstacle); return obstacle; @@ -222,7 +274,6 @@ void KX_ObstacleSimulation::AddObstaclesForNavMesh(KX_NavMeshObject* navmeshobj) obstacle->m_pos = MT_Point3(vj[0], vj[2], vj[1]); obstacle->m_pos2 = MT_Point3(vi[0], vi[2], vi[1]); obstacle->m_rad = 0; - obstacle->m_vel = MT_Vector2(0,0); } } } @@ -254,8 +305,16 @@ void KX_ObstacleSimulation::UpdateObstacles() KX_Obstacle* obs = m_obstacles[i]; obs->m_pos = obs->m_gameObj->NodeGetWorldPosition(); - obs->m_vel.x() = obs->m_gameObj->GetLinearVelocity().x(); - obs->m_vel.y() = obs->m_gameObj->GetLinearVelocity().y(); + obs->vel[0] = obs->m_gameObj->GetLinearVelocity().x(); + obs->vel[1] = obs->m_gameObj->GetLinearVelocity().y(); + + // Update velocity history and calculate perceived (average) velocity. + vcpy(&obs->hvel[obs->hhead*2], obs->vel); + obs->hhead = (obs->hhead+1) % VEL_HIST_SIZE; + vset(obs->pvel,0,0); + for (int j = 0; j < VEL_HIST_SIZE; ++j) + vadd(obs->pvel, obs->pvel, &obs->hvel[j*2]); + vscale(obs->pvel, obs->pvel, 1.0f/VEL_HIST_SIZE); } } @@ -329,7 +388,8 @@ static MT_Point3 nearestPointToObstacle(MT_Point3& pos ,KX_Obstacle* obstacle) } } -bool KX_ObstacleSimulation::FilterObstacle(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj, KX_Obstacle* otherObst) +static bool filterObstacle(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj, KX_Obstacle* otherObst, + float levelHeight) { //filter obstacles by type if ( (otherObst == activeObst) || @@ -338,7 +398,7 @@ bool KX_ObstacleSimulation::FilterObstacle(KX_Obstacle* activeObst, KX_NavMeshOb //filter obstacles by position MT_Point3 p = nearestPointToObstacle(activeObst->m_pos, otherObst); - if ( fabs(activeObst->m_pos.z() - p.z()) > m_levelHeight) + if ( fabs(activeObst->m_pos.z() - p.z()) > levelHeight) return false; return true; @@ -373,71 +433,100 @@ KX_Obstacle* KX_ObstacleSimulationTOI::CreateObstacle(KX_GameObject* gameobj) return obstacle; } -void KX_ObstacleSimulationTOI::AdjustObstacleVelocity(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj, - MT_Vector3& velocity, MT_Scalar maxDeltaSpeed, MT_Scalar maxDeltaAngle) +static const float VEL_WEIGHT = 2.0f; +static const float CUR_VEL_WEIGHT = 0.75f; +static const float SIDE_WEIGHT = 0.75f; +static const float TOI_WEIGHT = 2.5f; + +static void processSamples(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj, + KX_Obstacles& obstacles, float levelHeight, const float vmax, + const float* spos, const float cs, const int nspos, + float* res) { - int nobs = m_obstacles.size(); - int obstidx = std::find(m_obstacles.begin(), m_obstacles.end(), activeObst) - m_obstacles.begin(); - if (obstidx == nobs) - return; - TOICircle* tc = m_toiCircles[obstidx]; + vset(res, 0,0); - MT_Vector2 vel(velocity.x(), velocity.y()); - float vmax = (float) velocity.length(); - float odir = (float) atan2(velocity.y(), velocity.x()); + const float ivmax = 1.0f / vmax; - MT_Vector2 ddir = vel; - ddir.normalize(); + // Max time of collision to be considered. + const float maxToi = 1.5f; - float bestScore = FLT_MAX; - float bestDir = odir; - float bestToi = 0; + float adir[2], adist; + vcpy(adir, activeObst->pvel); + if (vlen(adir) > 0.01f) + vnorm(adir); + else + vset(adir,0,0); + float activeObstPos[2]; + vset(activeObstPos, activeObst->m_pos.x(), activeObst->m_pos.y()); + adist = vdot(adir, activeObstPos); - tc->n = m_avoidSteps; - tc->minToi = m_minToi; - tc->maxToi = m_maxToi; + float minPenalty = FLT_MAX; - const int iforw = m_avoidSteps/2; - const float aoff = (float)iforw / (float)m_avoidSteps; - - for (int iter = 0; iter < m_avoidSteps; ++iter) + for (int n = 0; n < nspos; ++n) { - // Calculate sample velocity - const float ndir = ((float)iter/(float)m_avoidSteps) - aoff; - const float dir = odir+ndir*M_PI*2; - MT_Vector2 svel; - svel.x() = cosf(dir) * vmax; - svel.y() = sinf(dir) * vmax; + float vcand[2]; + vcpy(vcand, &spos[n*2]); // Find min time of impact and exit amongst all obstacles. - float tmin = m_maxToi; - float tmine = 0; - for (int i = 0; i < nobs; ++i) + float tmin = maxToi; + float side = 0; + int nside = 0; + + for (int i = 0; i < obstacles.size(); ++i) { - KX_Obstacle* ob = m_obstacles[i]; - bool res = FilterObstacle(activeObst, activeNavMeshObj, ob); + KX_Obstacle* ob = obstacles[i]; + bool res = filterObstacle(activeObst, activeNavMeshObj, ob, levelHeight); if (!res) continue; - - float htmin,htmax; + float htmin, htmax; - if (ob->m_shape == KX_OBSTACLE_CIRCLE) + if (ob->m_shape==KX_OBSTACLE_CIRCLE) { - MT_Vector2 vab; - if (ob->m_vel.length2() < 0.01f*0.01f) + float vab[2]; + + // Moving, use RVO + vscale(vab, vcand, 2); + vsub(vab, vab, activeObst->vel); + vsub(vab, vab, ob->vel); + + // Side + // NOTE: dp, and dv are constant over the whole calculation, + // they can be precomputed per object. + const float* pa = activeObstPos; + float pb[2]; + vset(pb, ob->m_pos.x(), ob->m_pos.y()); + + const float orig[2] = {0,0}; + float dp[2],dv[2],np[2]; + vsub(dp,pb,pa); + vnorm(dp); + vsub(dv,ob->dvel, activeObst->dvel); + + const float a = triarea(orig, dp,dv); + if (a < 0.01f) { - // Stationary, use VO - vab = svel; + np[0] = -dp[1]; + np[1] = dp[0]; } else { - // Moving, use RVO - vab = 2*svel - vel - ob->m_vel; + np[0] = dp[1]; + np[1] = -dp[0]; } - if (!sweepCircleCircle(activeObst->m_pos, activeObst->m_rad, - vab, ob->m_pos, ob->m_rad, htmin, htmax)) + side += clamp(min(vdot(dp,vab)*2,vdot(np,vab)*2), 0.0f, 1.0f); + nside++; + + if (!sweepCircleCircle(activeObst->m_pos, activeObst->m_rad, vab, ob->m_pos, ob->m_rad, + htmin, htmax)) continue; + + // Handle overlapping obstacles. + if (htmin < 0.0f && htmax > 0.0f) + { + // Avoid more when overlapped. + htmin = -htmin * 0.5f; + } } else if (ob->m_shape == KX_OBSTACLE_SEGMENT) { @@ -450,77 +539,193 @@ void KX_ObstacleSimulationTOI::AdjustObstacleVelocity(KX_Obstacle* activeObst, K p1 = navmeshobj->TransformToWorldCoords(p1); p2 = navmeshobj->TransformToWorldCoords(p2); } - if (!sweepCircleSegment(activeObst->m_pos, activeObst->m_rad, svel, - p1, p2, ob->m_rad, htmin, htmax)) - continue; + float p[2], q[2]; + vset(p, p1.x(), p1.y()); + vset(q, p2.x(), p2.y()); + + // NOTE: the segments are assumed to come from a navmesh which is shrunken by + // the agent radius, hence the use of really small radius. + // This can be handle more efficiently by using seg-seg test instead. + // If the whole segment is to be treated as obstacle, use agent->rad instead of 0.01f! + const float r = 0.01f; // agent->rad + if (distPtSegSqr(activeObstPos, p, q) < sqr(r+ob->m_rad)) + { + float sdir[2], snorm[2]; + vsub(sdir, q, p); + snorm[0] = sdir[1]; + snorm[1] = -sdir[0]; + // If the velocity is pointing towards the segment, no collision. + if (vdot(snorm, vcand) < 0.0f) + continue; + // Else immediate collision. + htmin = 0.0f; + htmax = 10.0f; + } + else + { + if (!sweepCircleSegment(activeObstPos, r, vcand, p, q, ob->m_rad, htmin, htmax)) + continue; + } + + // Avoid less when facing walls. + htmin *= 2.0f; } - if (htmin > 0.0f) + if (htmin >= 0.0f) { // The closest obstacle is somewhere ahead of us, keep track of nearest obstacle. if (htmin < tmin) tmin = htmin; } - else if (htmax > 0.0f) + } + + // Normalize side bias, to prevent it dominating too much. + if (nside) + side /= nside; + + const float vpen = VEL_WEIGHT * (vdist(vcand, activeObst->dvel) * ivmax); + const float vcpen = CUR_VEL_WEIGHT * (vdist(vcand, activeObst->vel) * ivmax); + const float spen = SIDE_WEIGHT * side; + const float tpen = TOI_WEIGHT * (1.0f/(0.1f+tmin/maxToi)); + + const float penalty = vpen + vcpen + spen + tpen; + + if (penalty < minPenalty) + { + minPenalty = penalty; + vcpy(res, vcand); + } + } +} + +static const int RVO_SAMPLE_RAD = 15; +static const int MAX_RVO_SAMPLES = (RVO_SAMPLE_RAD*2+1)*(RVO_SAMPLE_RAD*2+1) + 100; + +static void sampleRVO(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj, + KX_Obstacles& obstacles, const float levelHeight,const float bias) +{ + float spos[2*MAX_RVO_SAMPLES]; + int nspos = 0; + + const float cvx = activeObst->dvel[0]*bias; + const float cvy = activeObst->dvel[1]*bias; + float vmax = vlen(activeObst->dvel); + const float vrange = vmax*(1-bias); + const float cs = 1.0f / (float)RVO_SAMPLE_RAD*vrange; + + for (int y = -RVO_SAMPLE_RAD; y <= RVO_SAMPLE_RAD; ++y) + { + for (int x = -RVO_SAMPLE_RAD; x <= RVO_SAMPLE_RAD; ++x) + { + if (nspos < MAX_RVO_SAMPLES) { - // The agent overlaps the obstacle, keep track of first safe exit. - if (htmax > tmine) - tmine = htmax; + const float vx = cvx + (float)(x+0.5f)*cs; + const float vy = cvy + (float)(y+0.5f)*cs; + if (vx*vx+vy*vy > sqr(vmax+cs/2)) continue; + spos[nspos*2+0] = vx; + spos[nspos*2+1] = vy; + nspos++; + } + } + } + processSamples(activeObst, activeNavMeshObj, obstacles, levelHeight, vmax, spos, cs/2, + nspos, activeObst->nvel); +} + +static void sampleRVOAdaptive(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj, + KX_Obstacles& obstacles, const float levelHeight,const float bias) +{ + vset(activeObst->nvel, 0.f, 0.f); + float vmax = vlen(activeObst->dvel); + + float spos[2*MAX_RVO_SAMPLES]; + int nspos = 0; + + int rad; + float res[2]; + float cs; + + // First sample location. + rad = 4; + res[0] = activeObst->dvel[0]*bias; + res[1] = activeObst->dvel[1]*bias; + cs = vmax*(2-bias*2) / (float)(rad-1); + + for (int k = 0; k < 5; ++k) + { + const float half = (rad-1)*cs*0.5f; + + nspos = 0; + for (int y = 0; y < rad; ++y) + { + for (int x = 0; x < rad; ++x) + { + const float vx = res[0] + x*cs - half; + const float vy = res[1] + y*cs - half; + if (vx*vx+vy*vy > sqr(vmax+cs/2)) continue; + spos[nspos*2+0] = vx; + spos[nspos*2+1] = vy; + nspos++; } } - // Calculate sample penalties and final score. - const float apen = m_angleWeight * fabsf(ndir); - const float tpen = m_toiWeight * (1.0f/(0.0001f+tmin/m_maxToi)); - const float cpen = m_collisionWeight * (tmine/m_minToi)*(tmine/m_minToi); - const float score = apen + tpen + cpen; + processSamples(activeObst, activeNavMeshObj, obstacles, levelHeight, vmax, spos, cs/2, + nspos, res); - // Update best score. - if (score < bestScore) - { - bestDir = dir; - bestToi = tmin; - bestScore = score; - } - - tc->dir[iter] = dir; - tc->toi[iter] = tmin; - tc->toie[iter] = tmine; + cs *= 0.5f; } - if (activeObst->m_vel.length() > 0.1) - { - // Constrain max turn rate. - float cura = atan2(activeObst->m_vel.y(),activeObst->m_vel.x()); - float da = bestDir - cura; - if (da < -M_PI) da += (float)M_PI*2; - if (da > M_PI) da -= (float)M_PI*2; - if (da < -maxDeltaAngle) - { - bestDir = cura - maxDeltaAngle; - bestToi = min(bestToi, interpolateToi(bestDir, tc->dir, tc->toi, tc->n)); - } - else if (da > maxDeltaAngle) - { - bestDir = cura + maxDeltaAngle; - bestToi = min(bestToi, interpolateToi(bestDir, tc->dir, tc->toi, tc->n)); - } - } + vcpy(activeObst->nvel, res); +} - // Adjust speed when time of impact is less than min TOI. - if (bestToi < m_minToi) - vmax *= bestToi/m_minToi; - // Constrain velocity change. - const float curSpeed = (float) activeObst->m_vel.length(); - float deltaSpeed = vmax - curSpeed; - CLAMP(deltaSpeed, -maxDeltaSpeed, maxDeltaSpeed); - vmax = curSpeed + deltaSpeed; +void KX_ObstacleSimulationTOI::AdjustObstacleVelocity(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj, + MT_Vector3& velocity, MT_Scalar maxDeltaSpeed, MT_Scalar maxDeltaAngle) +{ + int nobs = m_obstacles.size(); + int obstidx = std::find(m_obstacles.begin(), m_obstacles.end(), activeObst) - m_obstacles.begin(); + if (obstidx == nobs) + return; + + vset(activeObst->dvel, velocity.x(), velocity.y()); - // New steering velocity. - vel.x() = cosf(bestDir) * vmax; - vel.y() = sinf(bestDir) * vmax; + //apply RVO + const float bias = 0.4f; + //sampleRVO(activeObst, activeNavMeshObj, m_obstacles, m_levelHeight, bias); + sampleRVOAdaptive(activeObst, activeNavMeshObj, m_obstacles, m_levelHeight, bias); - velocity.x() = vel.x(); - velocity.y() = vel.y(); -} \ No newline at end of file + // Fake dynamic constraint. + float dv[2]; + float vel[2]; + vsub(dv, activeObst->nvel, activeObst->vel); + float ds = vlen(dv); + if (ds > maxDeltaSpeed || ds<-maxDeltaSpeed) + vscale(dv, dv, fabs(maxDeltaSpeed/ds)); + vadd(vel, activeObst->vel, dv); + + velocity.x() = vel[0]; + velocity.y() = vel[1]; +/* printf("dvel: %f, nvel: %f, vel: %f\n", vlen(activeObst->dvel), vlen(activeObst->nvel), + vlen(vel));*/ + +} +/* +#include "GL/glew.h" +void KX_ObstacleSimulation::DebugDraw() +{ + glDisable(GL_LIGHTING); + glDisable(GL_TEXTURE_2D); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0.0, 100.0, 0.0, 100.0, -1.0, 1.0); + glBegin(GL_QUADS); + glColor4ub(255,0,0,255); + glVertex2f(0.f, 0.f); + glVertex2f(100.f, 25.f); + glVertex2f(100.f, 75.f); + glVertex2f(25.f, 75.f); + glEnd(); + +}*/ \ No newline at end of file diff --git a/source/gameengine/Ketsji/KX_ObstacleSimulation.h b/source/gameengine/Ketsji/KX_ObstacleSimulation.h index b084f54d3b8..559c4f8caf8 100644 --- a/source/gameengine/Ketsji/KX_ObstacleSimulation.h +++ b/source/gameengine/Ketsji/KX_ObstacleSimulation.h @@ -56,6 +56,7 @@ enum KX_OBSTACLE_SHAPE KX_OBSTACLE_SEGMENT, }; +#define VEL_HIST_SIZE 6 struct KX_Obstacle { KX_OBSTACLE_TYPE m_type; @@ -63,26 +64,50 @@ struct KX_Obstacle MT_Point3 m_pos; MT_Point3 m_pos2; MT_Scalar m_rad; - MT_Vector2 m_vel; + + float vel[2]; + float pvel[2]; + float dvel[2]; + float nvel[2]; + float hvel[VEL_HIST_SIZE*2]; + int hhead; + KX_GameObject* m_gameObj; }; +typedef std::vector KX_Obstacles; +/* +struct RVO +{ + inline RVO() : ns(0) {} + float spos[MAX_RVO_SAMPLES*2]; + float scs[MAX_RVO_SAMPLES]; + float spen[MAX_RVO_SAMPLES]; + + float svpen[MAX_RVO_SAMPLES]; + float svcpen[MAX_RVO_SAMPLES]; + float sspen[MAX_RVO_SAMPLES]; + float stpen[MAX_RVO_SAMPLES]; + + int ns; +}; +*/ class KX_ObstacleSimulation { protected: - std::vector m_obstacles; + KX_Obstacles m_obstacles; MT_Scalar m_levelHeight; bool m_enableVisualization; virtual KX_Obstacle* CreateObstacle(KX_GameObject* gameobj); - bool FilterObstacle(KX_Obstacle* activeObstacle, KX_NavMeshObject* activeNavMeshObj, KX_Obstacle* otherObstacle); public: KX_ObstacleSimulation(MT_Scalar levelHeight, bool enableVisualization); virtual ~KX_ObstacleSimulation(); void DrawObstacles(); + //void DebugDraw(); void AddObstacleForObj(KX_GameObject* gameobj); void DestroyObstacleForObj(KX_GameObject* gameobj); diff --git a/source/gameengine/Ketsji/KX_SteeringActuator.cpp b/source/gameengine/Ketsji/KX_SteeringActuator.cpp index f70826d16f9..e093ddb4072 100644 --- a/source/gameengine/Ketsji/KX_SteeringActuator.cpp +++ b/source/gameengine/Ketsji/KX_SteeringActuator.cpp @@ -254,7 +254,7 @@ bool KX_SteeringActuator::Update(double curtime, bool frame) MT_Vector3 newvel = m_velocity*steervec; //adjust velocity to avoid obstacles - if (m_simulation && m_obstacle && !newvel.fuzzyZero()) + if (m_simulation && m_obstacle /*&& !newvel.fuzzyZero()*/) { if (m_enableVisualization) KX_RasterizerDrawDebugLine(mypos, mypos + newvel, MT_Vector3(1.,0.,0.)); @@ -278,6 +278,15 @@ bool KX_SteeringActuator::Update(double curtime, bool frame) obj->ApplyMovement(movement, false); } } + else + { + if (m_simulation && m_obstacle) + { + m_obstacle->dvel[0] = 0.f; + m_obstacle->dvel[1] = 0.f; + } + + } if (terminate && m_isSelfTerminated) return false; From 5f78619a652ed23ce1c397b19da45ddb1b5434e4 Mon Sep 17 00:00:00 2001 From: Nick Samarin Date: Thu, 5 Aug 2010 07:27:28 +0000 Subject: [PATCH 032/182] added test for correctness of navigation polygon: check if all triangles are involved in polygon formation --- .../editors/util/navmesh_conversion.cpp | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/source/blender/editors/util/navmesh_conversion.cpp b/source/blender/editors/util/navmesh_conversion.cpp index a5f91198fef..1fd3d83c69d 100644 --- a/source/blender/editors/util/navmesh_conversion.cpp +++ b/source/blender/editors/util/navmesh_conversion.cpp @@ -156,9 +156,13 @@ bool buildPolygonsByDetailedMeshes(const int vertsPerPoly, const int npolys, //search border int btri = -1; int bedge = -1; - for (int j=0; j Date: Thu, 5 Aug 2010 11:08:52 +0000 Subject: [PATCH 033/182] fixed bug: destroy obstacle simulation after removing of all objects --- source/gameengine/Ketsji/KX_Scene.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/gameengine/Ketsji/KX_Scene.cpp b/source/gameengine/Ketsji/KX_Scene.cpp index 5c002de6358..05387ed5bfc 100644 --- a/source/gameengine/Ketsji/KX_Scene.cpp +++ b/source/gameengine/Ketsji/KX_Scene.cpp @@ -233,9 +233,6 @@ KX_Scene::KX_Scene(class SCA_IInputDevice* keyboarddevice, KX_Scene::~KX_Scene() { - if (m_obstacleSimulation) - delete m_obstacleSimulation; - // The release of debug properties used to be in SCA_IScene::~SCA_IScene // It's still there but we remove all properties here otherwise some // reference might be hanging and causing late release of objects @@ -247,6 +244,9 @@ KX_Scene::~KX_Scene() this->RemoveObject(parentobj); } + if (m_obstacleSimulation) + delete m_obstacleSimulation; + if(m_objectlist) m_objectlist->Release(); From e42f487aed81b3b0dbccb773855c9a6d66af01f8 Mon Sep 17 00:00:00 2001 From: Nick Samarin Date: Fri, 6 Aug 2010 16:11:17 +0000 Subject: [PATCH 034/182] fixed error in forming of navigation polygons: non-traversed polygons are allowed if and only if they haven't border edges --- .../editors/util/navmesh_conversion.cpp | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/source/blender/editors/util/navmesh_conversion.cpp b/source/blender/editors/util/navmesh_conversion.cpp index 1fd3d83c69d..6a8ee709c99 100644 --- a/source/blender/editors/util/navmesh_conversion.cpp +++ b/source/blender/editors/util/navmesh_conversion.cpp @@ -241,14 +241,26 @@ bool buildPolygonsByDetailedMeshes(const int vertsPerPoly, const int npolys, delete adjustedPoly; nv = adjustedNv; - bool allTraversed = true; + bool allBorderTraversed = true; for (size_t i=0; i<(size_t)dtrisNum; i++) { if (traversedTris[i]==0) - allTraversed = false; + { + //check whether it has border edges + int curpolytri = dtrisBase+i; + for (int k=0; k<3; k++) + { + unsigned short neighbortri = dtris[curpolytri*3*2+3+k]; + if ( neighbortri==0xffff || dtrisToPolysMap[neighbortri]!=polyidx+1) + { + allBorderTraversed = false; + break; + } + } + } } - if (nv<=vertsPerPoly && allTraversed) + if (nv<=vertsPerPoly && allBorderTraversed) { for (int i=0; i Date: Mon, 9 Aug 2010 10:20:53 +0000 Subject: [PATCH 035/182] fixed bugs (wrong number of triangle in buildMeshAdjacence, wrong face indexes in applyModifier) --- .../editors/util/navmesh_conversion.cpp | 2 +- .../blender/modifiers/intern/MOD_navmesh.cpp | 25 ++++++++----------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/source/blender/editors/util/navmesh_conversion.cpp b/source/blender/editors/util/navmesh_conversion.cpp index 6a8ee709c99..62e26e2cd55 100644 --- a/source/blender/editors/util/navmesh_conversion.cpp +++ b/source/blender/editors/util/navmesh_conversion.cpp @@ -357,7 +357,7 @@ bool buildNavMeshData(const int nverts, const float* verts, //build adjacency info for detailed mesh triangles - buildMeshAdjacency(dtris, ntris, nverts, 3); + buildMeshAdjacency(dtris, ndtris, nverts, 3); //create detailed mesh description for each navigation polygon npolys = dtrisToPolysMap[ndtris-1]; diff --git a/source/blender/modifiers/intern/MOD_navmesh.cpp b/source/blender/modifiers/intern/MOD_navmesh.cpp index fb322086bbc..e02ad8896a9 100644 --- a/source/blender/modifiers/intern/MOD_navmesh.cpp +++ b/source/blender/modifiers/intern/MOD_navmesh.cpp @@ -129,10 +129,13 @@ static DerivedMesh *createNavMeshForVisualization(NavMeshModifierData *mmd,Deriv int maxFaces = dm->getNumFaces(dm); result = CDDM_copy(dm); - int *recastData = (int*)CustomData_get_layer(&dm->faceData, CD_RECAST); - CustomData_add_layer_named(&result->faceData, CD_RECAST, CD_DUPLICATE, - recastData, maxFaces, "recastData"); - recastData = (int*)CustomData_get_layer(&result->faceData, CD_RECAST); + if (!CustomData_has_layer(&result->faceData, CD_RECAST)) + { + int *sourceRecastData = (int*)CustomData_get_layer(&dm->faceData, CD_RECAST); + CustomData_add_layer_named(&result->faceData, CD_RECAST, CD_DUPLICATE, + sourceRecastData, maxFaces, "recastData"); + } + int *recastData = (int*)CustomData_get_layer(&result->faceData, CD_RECAST); result->drawFacesTex = navDM_drawFacesTex; result->drawFacesSolid = navDM_drawFacesSolid; @@ -162,8 +165,8 @@ static DerivedMesh *createNavMeshForVisualization(NavMeshModifierData *mmd,Deriv { unsigned short triidx = dtrisToTrisMap[tbase+ti]; unsigned short faceidx = trisToFacesMap[triidx]; - if (recastData[triidx]>0) - recastData[triidx] = -recastData[triidx]; + if (recastData[faceidx]>0) + recastData[faceidx] = -recastData[faceidx]; } } } @@ -218,23 +221,17 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der //2)add and init recast data layer if (!hasRecastData) { - int numFaces = derivedData->getNumFaces(derivedData); - CustomData_add_layer_named(&derivedData->faceData, CD_RECAST, CD_CALLOC, NULL, numFaces, "recastData"); - int* recastData = (int*)CustomData_get_layer(&derivedData->faceData, CD_RECAST); - for (int i=0; idata; if (obmesh) { + int numFaces = obmesh->totface; CustomData_add_layer_named(&obmesh->fdata, CD_RECAST, CD_CALLOC, NULL, numFaces, "recastData"); int* recastData = (int*)CustomData_get_layer(&obmesh->fdata, CD_RECAST); for (int i=0; ifaceData, CD_RECAST, CD_REFERENCE, recastData, numFaces, "recastData"); } } } From 3a8f3dd3f5e843ef8abad41996ebe5f7041e3807 Mon Sep 17 00:00:00 2001 From: Nick Samarin Date: Tue, 10 Aug 2010 20:48:28 +0000 Subject: [PATCH 036/182] reworked obstacle simulation in order to have two realizations: with "cell" and "ray" sampling --- .../editors/util/navmesh_conversion.cpp | 2 +- source/blender/makesdna/DNA_scene_types.h | 3 +- source/blender/makesrna/intern/rna_scene.c | 3 +- .../Ketsji/KX_ObstacleSimulation.cpp | 432 ++++++++++++------ .../gameengine/Ketsji/KX_ObstacleSimulation.h | 65 ++- source/gameengine/Ketsji/KX_Scene.cpp | 16 +- 6 files changed, 328 insertions(+), 193 deletions(-) diff --git a/source/blender/editors/util/navmesh_conversion.cpp b/source/blender/editors/util/navmesh_conversion.cpp index 62e26e2cd55..873660baa13 100644 --- a/source/blender/editors/util/navmesh_conversion.cpp +++ b/source/blender/editors/util/navmesh_conversion.cpp @@ -341,7 +341,7 @@ bool buildNavMeshData(const int nverts, const float* verts, { memcpy(dtris+3*2*i, tris+3*dtrisToTrisMap[i], sizeof(unsigned short)*3); } - //create new recast data corresponded to dtris and renumber for continious indices + //create new recast data corresponded to dtris and renumber for continuous indices int prevPolyIdx=-1, curPolyIdx, newPolyIdx=0; dtrisToPolysMap = new int[ndtris]; for (int i=0; idvel, velocity.x(), velocity.y()); + + //apply RVO + sampleRVO(activeObst, activeNavMeshObj, maxDeltaAngle); + + // Fake dynamic constraint. + float dv[2]; + float vel[2]; + vsub(dv, activeObst->nvel, activeObst->vel); + float ds = vlen(dv); + if (ds > maxDeltaSpeed || ds<-maxDeltaSpeed) + vscale(dv, dv, fabs(maxDeltaSpeed/ds)); + vadd(vel, activeObst->vel, dv); + + velocity.x() = vel[0]; + velocity.y() = vel[1]; +} + +///////////*********TOI_rays**********///////////////// +static const int AVOID_MAX_STEPS = 128; +struct TOICircle +{ + TOICircle() : n(0), minToi(0), maxToi(1) {} + float toi[AVOID_MAX_STEPS]; // Time of impact (seconds) + float toie[AVOID_MAX_STEPS]; // Time of exit (seconds) + float dir[AVOID_MAX_STEPS]; // Direction (radians) + int n; // Number of samples + float minToi, maxToi; // Min/max TOI (seconds) +}; + +KX_ObstacleSimulationTOI_rays::KX_ObstacleSimulationTOI_rays(MT_Scalar levelHeight, bool enableVisualization): + KX_ObstacleSimulationTOI(levelHeight, enableVisualization) +{ + m_maxSamples = 32; + m_minToi = 0.5f; + m_maxToi = 1.2f; + m_velWeight = 4.0f; + m_toiWeight = 1.0f; + m_collisionWeight = 100.0f; +} + + +void KX_ObstacleSimulationTOI_rays::sampleRVO(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj, + const float maxDeltaAngle) +{ + MT_Vector2 vel(activeObst->dvel[0], activeObst->dvel[1]); + float vmax = (float) vel.length(); + float odir = (float) atan2(vel.y(), vel.x()); + + MT_Vector2 ddir = vel; + ddir.normalize(); + + float bestScore = FLT_MAX; + float bestDir = odir; + float bestToi = 0; + + TOICircle tc; + tc.n = m_maxSamples; + tc.minToi = m_minToi; + tc.maxToi = m_maxToi; + + const int iforw = m_maxSamples/2; + const float aoff = (float)iforw / (float)m_maxSamples; + + size_t nobs = m_obstacles.size(); + for (int iter = 0; iter < m_maxSamples; ++iter) { - TOICircle* toi = m_toiCircles[i]; - delete toi; + // Calculate sample velocity + const float ndir = ((float)iter/(float)m_maxSamples) - aoff; + const float dir = odir+ndir*M_PI*2; + MT_Vector2 svel; + svel.x() = cosf(dir) * vmax; + svel.y() = sinf(dir) * vmax; + + // Find min time of impact and exit amongst all obstacles. + float tmin = m_maxToi; + float tmine = 0; + for (int i = 0; i < nobs; ++i) + { + KX_Obstacle* ob = m_obstacles[i]; + bool res = filterObstacle(activeObst, activeNavMeshObj, ob, m_levelHeight); + if (!res) + continue; + + float htmin,htmax; + + if (ob->m_shape == KX_OBSTACLE_CIRCLE) + { + MT_Vector2 vab; + if (vlen(ob->vel) < 0.01f*0.01f) + { + // Stationary, use VO + vab = svel; + } + else + { + // Moving, use RVO + vab = 2*svel - vel - ob->vel; + } + + if (!sweepCircleCircle(activeObst->m_pos, activeObst->m_rad, + vab, ob->m_pos, ob->m_rad, htmin, htmax)) + continue; + } + else if (ob->m_shape == KX_OBSTACLE_SEGMENT) + { + MT_Point3 p1 = ob->m_pos; + MT_Point3 p2 = ob->m_pos2; + //apply world transform + if (ob->m_type == KX_OBSTACLE_NAV_MESH) + { + KX_NavMeshObject* navmeshobj = static_cast(ob->m_gameObj); + p1 = navmeshobj->TransformToWorldCoords(p1); + p2 = navmeshobj->TransformToWorldCoords(p2); + } + if (!sweepCircleSegment(activeObst->m_pos, activeObst->m_rad, svel, + p1, p2, ob->m_rad, htmin, htmax)) + continue; + } + + if (htmin > 0.0f) + { + // The closest obstacle is somewhere ahead of us, keep track of nearest obstacle. + if (htmin < tmin) + tmin = htmin; + } + else if (htmax > 0.0f) + { + // The agent overlaps the obstacle, keep track of first safe exit. + if (htmax > tmine) + tmine = htmax; + } + } + + // Calculate sample penalties and final score. + const float apen = m_velWeight * fabsf(ndir); + const float tpen = m_toiWeight * (1.0f/(0.0001f+tmin/m_maxToi)); + const float cpen = m_collisionWeight * (tmine/m_minToi)*(tmine/m_minToi); + const float score = apen + tpen + cpen; + + // Update best score. + if (score < bestScore) + { + bestDir = dir; + bestToi = tmin; + bestScore = score; + } + + tc.dir[iter] = dir; + tc.toi[iter] = tmin; + tc.toie[iter] = tmine; } - m_toiCircles.clear(); + + if (vlen(activeObst->vel) > 0.1) + { + // Constrain max turn rate. + float cura = atan2(activeObst->vel[1],activeObst->vel[0]); + float da = bestDir - cura; + if (da < -M_PI) da += (float)M_PI*2; + if (da > M_PI) da -= (float)M_PI*2; + if (da < -maxDeltaAngle) + { + bestDir = cura - maxDeltaAngle; + bestToi = min(bestToi, interpolateToi(bestDir, tc.dir, tc.toi, tc.n)); + } + else if (da > maxDeltaAngle) + { + bestDir = cura + maxDeltaAngle; + bestToi = min(bestToi, interpolateToi(bestDir, tc.dir, tc.toi, tc.n)); + } + } + + // Adjust speed when time of impact is less than min TOI. + if (bestToi < m_minToi) + vmax *= bestToi/m_minToi; + + // New steering velocity. + activeObst->nvel[0] = cosf(bestDir) * vmax; + activeObst->nvel[1] = sinf(bestDir) * vmax; } -KX_Obstacle* KX_ObstacleSimulationTOI::CreateObstacle(KX_GameObject* gameobj) -{ - KX_Obstacle* obstacle = KX_ObstacleSimulation::CreateObstacle(gameobj); - m_toiCircles.push_back(new TOICircle()); - return obstacle; -} - -static const float VEL_WEIGHT = 2.0f; -static const float CUR_VEL_WEIGHT = 0.75f; -static const float SIDE_WEIGHT = 0.75f; -static const float TOI_WEIGHT = 2.5f; +///////////********* TOI_cells**********///////////////// static void processSamples(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj, KX_Obstacles& obstacles, float levelHeight, const float vmax, - const float* spos, const float cs, const int nspos, - float* res) + const float* spos, const float cs, const int nspos, float* res, + float maxToi, float velWeight, float curVelWeight, float sideWeight, + float toiWeight) { vset(res, 0,0); const float ivmax = 1.0f / vmax; - // Max time of collision to be considered. - const float maxToi = 1.5f; - float adir[2], adist; vcpy(adir, activeObst->pvel); if (vlen(adir) > 0.01f) @@ -583,10 +766,10 @@ static void processSamples(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavM if (nside) side /= nside; - const float vpen = VEL_WEIGHT * (vdist(vcand, activeObst->dvel) * ivmax); - const float vcpen = CUR_VEL_WEIGHT * (vdist(vcand, activeObst->vel) * ivmax); - const float spen = SIDE_WEIGHT * side; - const float tpen = TOI_WEIGHT * (1.0f/(0.1f+tmin/maxToi)); + const float vpen = velWeight * (vdist(vcand, activeObst->dvel) * ivmax); + const float vcpen = curVelWeight * (vdist(vcand, activeObst->vel) * ivmax); + const float spen = sideWeight * side; + const float tpen = toiWeight * (1.0f/(0.1f+tmin/maxToi)); const float penalty = vpen + vcpen + spen + tpen; @@ -598,134 +781,89 @@ static void processSamples(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavM } } -static const int RVO_SAMPLE_RAD = 15; -static const int MAX_RVO_SAMPLES = (RVO_SAMPLE_RAD*2+1)*(RVO_SAMPLE_RAD*2+1) + 100; - -static void sampleRVO(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj, - KX_Obstacles& obstacles, const float levelHeight,const float bias) -{ - float spos[2*MAX_RVO_SAMPLES]; - int nspos = 0; - - const float cvx = activeObst->dvel[0]*bias; - const float cvy = activeObst->dvel[1]*bias; - float vmax = vlen(activeObst->dvel); - const float vrange = vmax*(1-bias); - const float cs = 1.0f / (float)RVO_SAMPLE_RAD*vrange; - - for (int y = -RVO_SAMPLE_RAD; y <= RVO_SAMPLE_RAD; ++y) - { - for (int x = -RVO_SAMPLE_RAD; x <= RVO_SAMPLE_RAD; ++x) - { - if (nspos < MAX_RVO_SAMPLES) - { - const float vx = cvx + (float)(x+0.5f)*cs; - const float vy = cvy + (float)(y+0.5f)*cs; - if (vx*vx+vy*vy > sqr(vmax+cs/2)) continue; - spos[nspos*2+0] = vx; - spos[nspos*2+1] = vy; - nspos++; - } - } - } - processSamples(activeObst, activeNavMeshObj, obstacles, levelHeight, vmax, spos, cs/2, - nspos, activeObst->nvel); -} - -static void sampleRVOAdaptive(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj, - KX_Obstacles& obstacles, const float levelHeight,const float bias) +void KX_ObstacleSimulationTOI_cells::sampleRVO(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj, + const float maxDeltaAngle) { vset(activeObst->nvel, 0.f, 0.f); float vmax = vlen(activeObst->dvel); - float spos[2*MAX_RVO_SAMPLES]; + float* spos = new float[2*m_maxSamples]; int nspos = 0; - int rad; - float res[2]; - float cs; - - // First sample location. - rad = 4; - res[0] = activeObst->dvel[0]*bias; - res[1] = activeObst->dvel[1]*bias; - cs = vmax*(2-bias*2) / (float)(rad-1); - - for (int k = 0; k < 5; ++k) + if (!m_adaptive) { - const float half = (rad-1)*cs*0.5f; + const float cvx = activeObst->dvel[0]*m_bias; + const float cvy = activeObst->dvel[1]*m_bias; + float vmax = vlen(activeObst->dvel); + const float vrange = vmax*(1-m_bias); + const float cs = 1.0f / (float)m_sampleRadius*vrange; - nspos = 0; - for (int y = 0; y < rad; ++y) + for (int y = -m_sampleRadius; y <= m_sampleRadius; ++y) { - for (int x = 0; x < rad; ++x) + for (int x = -m_sampleRadius; x <= m_sampleRadius; ++x) { - const float vx = res[0] + x*cs - half; - const float vy = res[1] + y*cs - half; - if (vx*vx+vy*vy > sqr(vmax+cs/2)) continue; - spos[nspos*2+0] = vx; - spos[nspos*2+1] = vy; - nspos++; + if (nspos < m_maxSamples) + { + const float vx = cvx + (float)(x+0.5f)*cs; + const float vy = cvy + (float)(y+0.5f)*cs; + if (vx*vx+vy*vy > sqr(vmax+cs/2)) continue; + spos[nspos*2+0] = vx; + spos[nspos*2+1] = vy; + nspos++; + } } } - - processSamples(activeObst, activeNavMeshObj, obstacles, levelHeight, vmax, spos, cs/2, - nspos, res); - - cs *= 0.5f; + processSamples(activeObst, activeNavMeshObj, m_obstacles, m_levelHeight, vmax, spos, cs/2, + nspos, activeObst->nvel, m_maxToi, m_velWeight, m_curVelWeight, m_collisionWeight, m_toiWeight); } + else + { + int rad; + float res[2]; + float cs; + // First sample location. + rad = 4; + res[0] = activeObst->dvel[0]*m_bias; + res[1] = activeObst->dvel[1]*m_bias; + cs = vmax*(2-m_bias*2) / (float)(rad-1); - vcpy(activeObst->nvel, res); + for (int k = 0; k < 5; ++k) + { + const float half = (rad-1)*cs*0.5f; + + nspos = 0; + for (int y = 0; y < rad; ++y) + { + for (int x = 0; x < rad; ++x) + { + const float vx = res[0] + x*cs - half; + const float vy = res[1] + y*cs - half; + if (vx*vx+vy*vy > sqr(vmax+cs/2)) continue; + spos[nspos*2+0] = vx; + spos[nspos*2+1] = vy; + nspos++; + } + } + + processSamples(activeObst, activeNavMeshObj, m_obstacles, m_levelHeight, vmax, spos, cs/2, + nspos, res, m_maxToi, m_velWeight, m_curVelWeight, m_collisionWeight, m_toiWeight); + + cs *= 0.5f; + } + vcpy(activeObst->nvel, res); + } } - -void KX_ObstacleSimulationTOI::AdjustObstacleVelocity(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj, - MT_Vector3& velocity, MT_Scalar maxDeltaSpeed, MT_Scalar maxDeltaAngle) +KX_ObstacleSimulationTOI_cells::KX_ObstacleSimulationTOI_cells(MT_Scalar levelHeight, bool enableVisualization) +: KX_ObstacleSimulationTOI(levelHeight, enableVisualization) +, m_bias(0.4f) +, m_adaptive(true) +, m_sampleRadius(15) { - int nobs = m_obstacles.size(); - int obstidx = std::find(m_obstacles.begin(), m_obstacles.end(), activeObst) - m_obstacles.begin(); - if (obstidx == nobs) - return; - - vset(activeObst->dvel, velocity.x(), velocity.y()); - - //apply RVO - const float bias = 0.4f; - //sampleRVO(activeObst, activeNavMeshObj, m_obstacles, m_levelHeight, bias); - sampleRVOAdaptive(activeObst, activeNavMeshObj, m_obstacles, m_levelHeight, bias); - - // Fake dynamic constraint. - float dv[2]; - float vel[2]; - vsub(dv, activeObst->nvel, activeObst->vel); - float ds = vlen(dv); - if (ds > maxDeltaSpeed || ds<-maxDeltaSpeed) - vscale(dv, dv, fabs(maxDeltaSpeed/ds)); - vadd(vel, activeObst->vel, dv); - - velocity.x() = vel[0]; - velocity.y() = vel[1]; -/* printf("dvel: %f, nvel: %f, vel: %f\n", vlen(activeObst->dvel), vlen(activeObst->nvel), - vlen(vel));*/ - -} -/* -#include "GL/glew.h" -void KX_ObstacleSimulation::DebugDraw() -{ - glDisable(GL_LIGHTING); - glDisable(GL_TEXTURE_2D); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho(0.0, 100.0, 0.0, 100.0, -1.0, 1.0); - glBegin(GL_QUADS); - glColor4ub(255,0,0,255); - glVertex2f(0.f, 0.f); - glVertex2f(100.f, 25.f); - glVertex2f(100.f, 75.f); - glVertex2f(25.f, 75.f); - glEnd(); - -}*/ \ No newline at end of file + m_maxSamples = (m_sampleRadius*2+1)*(m_sampleRadius*2+1) + 100; + m_maxToi = 1.5f; + m_velWeight = 2.0f; + m_curVelWeight = 0.75f; + m_toiWeight = 2.5f; + m_collisionWeight = 0.75f; //side_weight +} \ No newline at end of file diff --git a/source/gameengine/Ketsji/KX_ObstacleSimulation.h b/source/gameengine/Ketsji/KX_ObstacleSimulation.h index 559c4f8caf8..d926e8deb71 100644 --- a/source/gameengine/Ketsji/KX_ObstacleSimulation.h +++ b/source/gameengine/Ketsji/KX_ObstacleSimulation.h @@ -76,22 +76,6 @@ struct KX_Obstacle KX_GameObject* m_gameObj; }; typedef std::vector KX_Obstacles; -/* -struct RVO -{ - inline RVO() : ns(0) {} - float spos[MAX_RVO_SAMPLES*2]; - float scs[MAX_RVO_SAMPLES]; - float spen[MAX_RVO_SAMPLES]; - - float svpen[MAX_RVO_SAMPLES]; - float svcpen[MAX_RVO_SAMPLES]; - float sspen[MAX_RVO_SAMPLES]; - float stpen[MAX_RVO_SAMPLES]; - - int ns; -}; -*/ class KX_ObstacleSimulation { @@ -101,7 +85,7 @@ protected: MT_Scalar m_levelHeight; bool m_enableVisualization; - virtual KX_Obstacle* CreateObstacle(KX_GameObject* gameobj); + KX_Obstacle* CreateObstacle(KX_GameObject* gameobj); public: KX_ObstacleSimulation(MT_Scalar levelHeight, bool enableVisualization); virtual ~KX_ObstacleSimulation(); @@ -117,36 +101,45 @@ public: virtual void AdjustObstacleVelocity(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj, MT_Vector3& velocity, MT_Scalar maxDeltaSpeed,MT_Scalar maxDeltaAngle); -}; /* end of class KX_ObstacleSimulation*/ - -static const int AVOID_MAX_STEPS = 128; -struct TOICircle -{ - TOICircle() : n(0), minToi(0), maxToi(1) {} - float toi[AVOID_MAX_STEPS]; // Time of impact (seconds) - float toie[AVOID_MAX_STEPS]; // Time of exit (seconds) - float dir[AVOID_MAX_STEPS]; // Direction (radians) - int n; // Number of samples - float minToi, maxToi; // Min/max TOI (seconds) -}; - +}; class KX_ObstacleSimulationTOI: public KX_ObstacleSimulation { protected: - int m_avoidSteps; // Number of sample steps + int m_maxSamples; // Number of sample steps float m_minToi; // Min TOI float m_maxToi; // Max TOI - float m_angleWeight; // Sample selection angle weight + float m_velWeight; // Sample selection angle weight + float m_curVelWeight; // Sample selection current velocity weight float m_toiWeight; // Sample selection TOI weight float m_collisionWeight; // Sample selection collision weight - std::vector m_toiCircles; // TOI circles (one per active agent) - virtual KX_Obstacle* CreateObstacle(KX_GameObject* gameobj); + virtual void sampleRVO(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj, + const float maxDeltaAngle) = 0; public: KX_ObstacleSimulationTOI(MT_Scalar levelHeight, bool enableVisualization); - ~KX_ObstacleSimulationTOI(); virtual void AdjustObstacleVelocity(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj, - MT_Vector3& velocity, MT_Scalar maxDeltaSpeed,MT_Scalar maxDeltaAngle); + MT_Vector3& velocity, MT_Scalar maxDeltaSpeed,MT_Scalar maxDeltaAngle); +}; + +class KX_ObstacleSimulationTOI_rays: public KX_ObstacleSimulationTOI +{ +protected: + virtual void sampleRVO(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj, + const float maxDeltaAngle); +public: + KX_ObstacleSimulationTOI_rays(MT_Scalar levelHeight, bool enableVisualization); +}; + +class KX_ObstacleSimulationTOI_cells: public KX_ObstacleSimulationTOI +{ +protected: + float m_bias; + bool m_adaptive; + int m_sampleRadius; + virtual void sampleRVO(KX_Obstacle* activeObst, KX_NavMeshObject* activeNavMeshObj, + const float maxDeltaAngle); +public: + KX_ObstacleSimulationTOI_cells(MT_Scalar levelHeight, bool enableVisualization); }; #endif diff --git a/source/gameengine/Ketsji/KX_Scene.cpp b/source/gameengine/Ketsji/KX_Scene.cpp index 6b4c8ae2f42..cbd4b96f566 100644 --- a/source/gameengine/Ketsji/KX_Scene.cpp +++ b/source/gameengine/Ketsji/KX_Scene.cpp @@ -212,9 +212,11 @@ KX_Scene::KX_Scene(class SCA_IInputDevice* keyboarddevice, bool showObstacleSimulation = scene->gm.flag & GAME_SHOW_OBSTACLE_SIMULATION; switch (scene->gm.obstacleSimulation) { - case OBSTSIMULATION_TOI: - - m_obstacleSimulation = new KX_ObstacleSimulationTOI((MT_Scalar)scene->gm.levelHeight, showObstacleSimulation); + case OBSTSIMULATION_TOI_rays: + m_obstacleSimulation = new KX_ObstacleSimulationTOI_rays((MT_Scalar)scene->gm.levelHeight, showObstacleSimulation); + break; + case OBSTSIMULATION_TOI_cells: + m_obstacleSimulation = new KX_ObstacleSimulationTOI_cells((MT_Scalar)scene->gm.levelHeight, showObstacleSimulation); break; default: m_obstacleSimulation = NULL; @@ -1475,10 +1477,6 @@ void KX_Scene::LogicBeginFrame(double curtime) } } - //prepare obstacle simulation for new frame - if (m_obstacleSimulation) - m_obstacleSimulation->UpdateObstacles(); - m_logicmgr->BeginFrame(curtime, 1.0/KX_KetsjiEngine::GetTicRate()); } @@ -1506,6 +1504,10 @@ void KX_Scene::LogicEndFrame() obj->Release(); RemoveObject(obj); } + + //prepare obstacle simulation for new frame + if (m_obstacleSimulation) + m_obstacleSimulation->UpdateObstacles(); } From b822f0bb7a756ea48a035161db9576ec768098ee Mon Sep 17 00:00:00 2001 From: Nick Samarin Date: Sun, 15 Aug 2010 12:58:13 +0000 Subject: [PATCH 037/182] added option for automatic facing in steering actuator --- source/blender/blenkernel/intern/sca.c | 2 + .../editors/space_logic/logic_window.c | 6 + source/blender/makesdna/DNA_actuator_types.h | 4 +- source/blender/makesrna/intern/rna_actuator.c | 21 +++ .../Converter/KX_ConvertActuators.cpp | 3 +- .../gameengine/Ketsji/KX_SteeringActuator.cpp | 132 ++++++++++++++++-- .../gameengine/Ketsji/KX_SteeringActuator.h | 8 ++ 7 files changed, 163 insertions(+), 13 deletions(-) diff --git a/source/blender/blenkernel/intern/sca.c b/source/blender/blenkernel/intern/sca.c index 6ff15b31cc0..91c052bcbda 100644 --- a/source/blender/blenkernel/intern/sca.c +++ b/source/blender/blenkernel/intern/sca.c @@ -472,6 +472,8 @@ void init_actuator(bActuator *act) sta->turnspeed = 120.f; sta->dist = 1.f; sta->velocity= 3.f; + sta->flag = ACT_STEERING_AUTOMATICFACING; + sta->facingaxis = 1; default: ; /* this is very severe... I cannot make any memory for this */ /* logic brick... */ diff --git a/source/blender/editors/space_logic/logic_window.c b/source/blender/editors/space_logic/logic_window.c index 76e210e7549..929a29974de 100644 --- a/source/blender/editors/space_logic/logic_window.c +++ b/source/blender/editors/space_logic/logic_window.c @@ -4348,6 +4348,12 @@ static void draw_actuator_steering(uiLayout *layout, PointerRNA *ptr) uiItemR(row, ptr, "acceleration", 0, NULL, 0); uiItemR(row, ptr, "turnspeed", 0, NULL, 0); row = uiLayoutRow(layout, 0); + uiItemR(row, ptr, "facing", 0, NULL, 0); + if (RNA_boolean_get(ptr, "facing")) + { + uiItemR(row, ptr, "facingaxis", 0, NULL, 0); + } + row = uiLayoutRow(layout, 0); uiItemR(row, ptr, "selfterminated", 0, NULL, 0); if (RNA_enum_get(ptr, "mode")==ACT_STEERING_PATHFOLLOWING) { diff --git a/source/blender/makesdna/DNA_actuator_types.h b/source/blender/makesdna/DNA_actuator_types.h index 627335a7666..4caee19e399 100644 --- a/source/blender/makesdna/DNA_actuator_types.h +++ b/source/blender/makesdna/DNA_actuator_types.h @@ -224,8 +224,9 @@ typedef struct bArmatureActuator { } bArmatureActuator; typedef struct bSteeringActuator { - char pad[7]; + char pad[5]; char flag; + short facingaxis; int type; /* 0=seek, 1=flee, 2=path following */ float dist; float velocity; @@ -525,6 +526,7 @@ typedef struct bActuator { /* steeringactuator->flag */ #define ACT_STEERING_SELFTERMINATED 1 #define ACT_STEERING_ENABLEVISUALIZATION 2 +#define ACT_STEERING_AUTOMATICFACING 4 #endif diff --git a/source/blender/makesrna/intern/rna_actuator.c b/source/blender/makesrna/intern/rna_actuator.c index 4a5596f7a5e..16c640b8695 100644 --- a/source/blender/makesrna/intern/rna_actuator.c +++ b/source/blender/makesrna/intern/rna_actuator.c @@ -1892,6 +1892,15 @@ static void rna_def_steering_actuator(BlenderRNA *brna) {ACT_STEERING_PATHFOLLOWING, "PATHFOLLOWING", 0, "Path following", ""}, {0, NULL, 0, NULL, NULL}}; + static EnumPropertyItem facingaxis_items[] ={ + {1, "X", 0, "X", ""}, + {2, "Y", 0, "Y", ""}, + {3, "Z", 0, "Z", ""}, + {4, "-X", 0, "-X", ""}, + {5, "-Y", 0, "-Y", ""}, + {6, "-Z", 0, "-Z", ""}, + {0, NULL, 0, NULL, NULL}}; + srna= RNA_def_struct(brna, "SteeringActuator", "Actuator"); RNA_def_struct_ui_text(srna, "Steering Actuator", ""); RNA_def_struct_sdna_from(srna, "bSteeringActuator", "data"); @@ -1956,6 +1965,18 @@ static void rna_def_steering_actuator(BlenderRNA *brna) RNA_def_property_ui_text(prop, "NavMesh Object", "Navigation mesh"); RNA_def_property_pointer_funcs(prop, NULL, "rna_SteeringActuator_navmesh_set", NULL, NULL); RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "facing", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_STEERING_AUTOMATICFACING); + RNA_def_property_ui_text(prop, "Facing", "Enable automatic facing"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + + prop= RNA_def_property(srna, "facingaxis", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "facingaxis"); + RNA_def_property_enum_items(prop, facingaxis_items); + RNA_def_property_ui_text(prop, "Axis", "Axis for automatic facing"); + RNA_def_property_update(prop, NC_LOGIC, NULL); + } void RNA_def_actuator(BlenderRNA *brna) diff --git a/source/gameengine/Converter/KX_ConvertActuators.cpp b/source/gameengine/Converter/KX_ConvertActuators.cpp index 2c6dab910d8..727df53853c 100644 --- a/source/gameengine/Converter/KX_ConvertActuators.cpp +++ b/source/gameengine/Converter/KX_ConvertActuators.cpp @@ -1059,11 +1059,12 @@ void BL_ConvertActuators(char* maggiename, bool selfTerminated = (stAct->flag & ACT_STEERING_SELFTERMINATED) !=0; bool enableVisualization = (stAct->flag & ACT_STEERING_ENABLEVISUALIZATION) !=0; + short facingMode = (stAct->flag & ACT_STEERING_AUTOMATICFACING) ? stAct->facingaxis : 0; KX_SteeringActuator *tmpstact = new KX_SteeringActuator(gameobj, mode, targetob, navmeshob,stAct->dist, stAct->velocity, stAct->acceleration, stAct->turnspeed, selfTerminated, stAct->updateTime, - scene->GetObstacleSimulation(), enableVisualization); + scene->GetObstacleSimulation(), facingMode, enableVisualization); baseact = tmpstact; break; } diff --git a/source/gameengine/Ketsji/KX_SteeringActuator.cpp b/source/gameengine/Ketsji/KX_SteeringActuator.cpp index e093ddb4072..dfba4482ce9 100644 --- a/source/gameengine/Ketsji/KX_SteeringActuator.cpp +++ b/source/gameengine/Ketsji/KX_SteeringActuator.cpp @@ -38,6 +38,7 @@ #include "KX_NavMeshObject.h" #include "KX_ObstacleSimulation.h" #include "KX_PythonInit.h" +#include "KX_PyMath.h" /* ------------------------------------------------------------------------- */ @@ -55,6 +56,7 @@ KX_SteeringActuator::KX_SteeringActuator(SCA_IObject *gameobj, bool isSelfTerminated, int pathUpdatePeriod, KX_ObstacleSimulation* simulation, + short facingmode, bool enableVisualization) : SCA_IActuator(gameobj, KX_ACT_STEERING), m_mode(mode), @@ -69,9 +71,11 @@ KX_SteeringActuator::KX_SteeringActuator(SCA_IObject *gameobj, m_isActive(false), m_simulation(simulation), m_enableVisualization(enableVisualization), + m_facingMode(facingmode), m_obstacle(NULL), m_pathLen(0), - m_wayPointIdx(-1) + m_wayPointIdx(-1), + m_steerVec(MT_Vector3(0, 0, 0)) { m_navmesh = static_cast(navmesh); if (m_navmesh) @@ -81,6 +85,13 @@ KX_SteeringActuator::KX_SteeringActuator(SCA_IObject *gameobj, if (m_simulation) m_obstacle = m_simulation->GetObstacle((KX_GameObject*)gameobj); + KX_GameObject* parent = ((KX_GameObject*)gameobj)->GetParent(); + if (m_facingMode>0 && parent) + { + m_parentlocalmat = parent->GetSGNode()->GetLocalOrientation(); + } + else + m_parentlocalmat.setIdentity(); } KX_SteeringActuator::~KX_SteeringActuator() @@ -175,7 +186,7 @@ bool KX_SteeringActuator::Update(double curtime, bool frame) MT_Vector3 vectotarg = targpos - mypos; MT_Vector3 vectotarg2d = vectotarg; vectotarg2d.z() = 0; - MT_Vector3 steervec = MT_Vector3(0, 0, 0); + m_steerVec = MT_Vector3(0, 0, 0); bool apply_steerforce = false; bool terminate = true; @@ -184,8 +195,8 @@ bool KX_SteeringActuator::Update(double curtime, bool frame) if (vectotarg2d.length2()>m_distance*m_distance) { terminate = false; - steervec = vectotarg; - steervec.normalize(); + m_steerVec = vectotarg; + m_steerVec.normalize(); apply_steerforce = true; } break; @@ -193,8 +204,8 @@ bool KX_SteeringActuator::Update(double curtime, bool frame) if (vectotarg2d.length2()IsDynamic(); if (isdyna) - steervec.z() = 0; - if (!steervec.fuzzyZero()) - steervec.normalize(); - MT_Vector3 newvel = m_velocity*steervec; + m_steerVec.z() = 0; + if (!m_steerVec.fuzzyZero()) + m_steerVec.normalize(); + MT_Vector3 newvel = m_velocity*m_steerVec; //adjust velocity to avoid obstacles if (m_simulation && m_obstacle /*&& !newvel.fuzzyZero()*/) @@ -264,6 +275,7 @@ bool KX_SteeringActuator::Update(double curtime, bool frame) KX_RasterizerDrawDebugLine(mypos, mypos + newvel, MT_Vector3(0.,1.,0.)); } + HandleActorFace(newvel); if (isdyna) { //temporary solution: set 2D steering velocity directly to obj @@ -295,6 +307,96 @@ bool KX_SteeringActuator::Update(double curtime, bool frame) return true; } +const MT_Vector3& KX_SteeringActuator::GetSteeringVec() +{ + if (m_isActive) + return m_steerVec; + else + return MT_Vector3(0, 0, 0); +} + +void KX_SteeringActuator::HandleActorFace(MT_Vector3& velocity) +{ + if (m_facingMode==0) + return; + MT_Vector3 dir = velocity; + if (dir.fuzzyZero()) + return; + dir.normalize(); + MT_Vector3 up(0,0,1); + MT_Vector3 left; + MT_Matrix3x3 mat; + switch (m_facingMode) + { + case 1: // TRACK X + { + left = dir.safe_normalized(); + dir = -(left.cross(up)).safe_normalized(); + break; + }; + case 2: // TRACK Y + { + left = (dir.cross(up)).safe_normalized(); + break; + } + + case 3: // track Z + { + left = up.safe_normalized(); + up = dir.safe_normalized(); + dir = left; + left = (dir.cross(up)).safe_normalized(); + break; + } + + case 4: // TRACK -X + { + left = -dir.safe_normalized(); + dir = -(left.cross(up)).safe_normalized(); + break; + }; + case 5: // TRACK -Y + { + left = (-dir.cross(up)).safe_normalized(); + dir = -dir; + break; + } + case 6: // track -Z + { + left = up.safe_normalized(); + up = -dir.safe_normalized(); + dir = left; + left = (dir.cross(up)).safe_normalized(); + break; + } + } + mat.setValue ( + left[0], dir[0],up[0], + left[1], dir[1],up[1], + left[2], dir[2],up[2] + ); + + KX_GameObject* curobj = (KX_GameObject*) GetParent(); + + KX_GameObject* parentObject = curobj->GetParent(); + if(parentObject) + { + MT_Point3 localpos; + localpos = curobj->GetSGNode()->GetLocalPosition(); + MT_Matrix3x3 parentmatinv; + parentmatinv = parentObject->NodeGetWorldOrientation ().inverse (); + mat = parentmatinv * mat; + mat = m_parentlocalmat * mat; + curobj->NodeSetLocalOrientation(mat); + curobj->NodeSetLocalPosition(localpos); + } + else + { + curobj->NodeSetLocalOrientation(mat); + } + +} + #ifndef DISABLE_PYTHON /* ------------------------------------------------------------------------- */ @@ -338,6 +440,7 @@ PyAttributeDef KX_SteeringActuator::Attributes[] = { KX_PYATTRIBUTE_FLOAT_RW("turnspeed", 0.0f, 720.0f, KX_SteeringActuator, m_turnspeed), KX_PYATTRIBUTE_BOOL_RW("selfterminated", KX_SteeringActuator, m_isSelfTerminated), KX_PYATTRIBUTE_BOOL_RW("enableVisualization", KX_SteeringActuator, m_enableVisualization), + KX_PYATTRIBUTE_RO_FUNCTION("steeringVec", KX_SteeringActuator, pyattr_get_steeringVec), KX_PYATTRIBUTE_INT_RW("pathUpdatePeriod", -1, 100000, true, KX_SteeringActuator, m_pathUpdatePeriod), { NULL } //Sentinel }; @@ -404,6 +507,13 @@ int KX_SteeringActuator::pyattr_set_navmesh(void *self, const struct KX_PYATTRIB return PY_SET_ATTR_SUCCESS; } +PyObject* KX_SteeringActuator::pyattr_get_steeringVec(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef) +{ + KX_SteeringActuator* actuator = static_cast(self); + const MT_Vector3& steeringVec = actuator->GetSteeringVec(); + return PyObjectFrom(steeringVec); +} + #endif // DISABLE_PYTHON /* eof */ diff --git a/source/gameengine/Ketsji/KX_SteeringActuator.h b/source/gameengine/Ketsji/KX_SteeringActuator.h index b07d906dba3..78fb29f4124 100644 --- a/source/gameengine/Ketsji/KX_SteeringActuator.h +++ b/source/gameengine/Ketsji/KX_SteeringActuator.h @@ -38,6 +38,7 @@ #include "SCA_IActuator.h" #include "SCA_LogicManager.h" +#include "MT_Matrix3x3.h" class KX_GameObject; class KX_NavMeshObject; @@ -64,11 +65,15 @@ class KX_SteeringActuator : public SCA_IActuator bool m_isActive; bool m_isSelfTerminated; bool m_enableVisualization; + short m_facingMode; float m_path[MAX_PATH_LENGTH*3]; int m_pathLen; int m_pathUpdatePeriod; double m_pathUpdateTime; int m_wayPointIdx; + MT_Matrix3x3 m_parentlocalmat; + MT_Vector3 m_steerVec; + void HandleActorFace(MT_Vector3& velocity); public: enum KX_STEERINGACT_MODE { @@ -90,6 +95,7 @@ public: bool isSelfTerminated, int pathUpdatePeriod, KX_ObstacleSimulation* simulation, + short facingmode, bool enableVisualization); virtual ~KX_SteeringActuator(); virtual bool Update(double curtime, bool frame); @@ -98,6 +104,7 @@ public: virtual void ProcessReplica(); virtual void Relink(GEN_Map *obj_map); virtual bool UnlinkObject(SCA_IObject* clientobj); + const MT_Vector3& GetSteeringVec(); #ifndef DISABLE_PYTHON @@ -110,6 +117,7 @@ public: static int pyattr_set_target(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value); static PyObject* pyattr_get_navmesh(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef); static int pyattr_set_navmesh(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value); + static PyObject* pyattr_get_steeringVec(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef); #endif // DISABLE_PYTHON From e6412cd5c6f267c2fbefb4fe42e4f8e26f1bfcd4 Mon Sep 17 00:00:00 2001 From: Nick Samarin Date: Sun, 15 Aug 2010 13:14:52 +0000 Subject: [PATCH 038/182] added function to provide steering vector --- source/gameengine/Ketsji/KX_SteeringActuator.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/source/gameengine/Ketsji/KX_SteeringActuator.cpp b/source/gameengine/Ketsji/KX_SteeringActuator.cpp index dfba4482ce9..b91faf2646f 100644 --- a/source/gameengine/Ketsji/KX_SteeringActuator.cpp +++ b/source/gameengine/Ketsji/KX_SteeringActuator.cpp @@ -441,6 +441,7 @@ PyAttributeDef KX_SteeringActuator::Attributes[] = { KX_PYATTRIBUTE_BOOL_RW("selfterminated", KX_SteeringActuator, m_isSelfTerminated), KX_PYATTRIBUTE_BOOL_RW("enableVisualization", KX_SteeringActuator, m_enableVisualization), KX_PYATTRIBUTE_RO_FUNCTION("steeringVec", KX_SteeringActuator, pyattr_get_steeringVec), + KX_PYATTRIBUTE_SHORT_RW("facingMode", 0, 6, true, KX_SteeringActuator, m_facingMode), KX_PYATTRIBUTE_INT_RW("pathUpdatePeriod", -1, 100000, true, KX_SteeringActuator, m_pathUpdatePeriod), { NULL } //Sentinel }; From b5f4144d251989be378659858ed38aaf572ff4ec Mon Sep 17 00:00:00 2001 From: Nick Samarin Date: Sun, 15 Aug 2010 17:40:57 +0000 Subject: [PATCH 039/182] added option to set "up" vector of the actor orientation using navmesh normal (steering actuator) --- .../editors/space_logic/logic_window.c | 6 +- source/blender/makesdna/DNA_actuator_types.h | 1 + source/blender/makesrna/intern/rna_actuator.c | 6 +- .../Converter/KX_ConvertActuators.cpp | 3 +- .../gameengine/Ketsji/KX_SteeringActuator.cpp | 119 +++++++++++++++++- .../gameengine/Ketsji/KX_SteeringActuator.h | 2 + 6 files changed, 129 insertions(+), 8 deletions(-) diff --git a/source/blender/editors/space_logic/logic_window.c b/source/blender/editors/space_logic/logic_window.c index 929a29974de..6442dcfa66b 100644 --- a/source/blender/editors/space_logic/logic_window.c +++ b/source/blender/editors/space_logic/logic_window.c @@ -4351,7 +4351,11 @@ static void draw_actuator_steering(uiLayout *layout, PointerRNA *ptr) uiItemR(row, ptr, "facing", 0, NULL, 0); if (RNA_boolean_get(ptr, "facing")) { - uiItemR(row, ptr, "facingaxis", 0, NULL, 0); + uiItemR(row, ptr, "facingaxis", 0, NULL, 0); + } + if (RNA_pointer_get(ptr, "navmesh").data) + { + uiItemR(row, ptr, "normalup", 0, NULL, 0); } row = uiLayoutRow(layout, 0); uiItemR(row, ptr, "selfterminated", 0, NULL, 0); diff --git a/source/blender/makesdna/DNA_actuator_types.h b/source/blender/makesdna/DNA_actuator_types.h index 4caee19e399..147d621a4f2 100644 --- a/source/blender/makesdna/DNA_actuator_types.h +++ b/source/blender/makesdna/DNA_actuator_types.h @@ -527,6 +527,7 @@ typedef struct bActuator { #define ACT_STEERING_SELFTERMINATED 1 #define ACT_STEERING_ENABLEVISUALIZATION 2 #define ACT_STEERING_AUTOMATICFACING 4 +#define ACT_STEERING_NORMALUP 8 #endif diff --git a/source/blender/makesrna/intern/rna_actuator.c b/source/blender/makesrna/intern/rna_actuator.c index 16c640b8695..1f501a211f1 100644 --- a/source/blender/makesrna/intern/rna_actuator.c +++ b/source/blender/makesrna/intern/rna_actuator.c @@ -1976,7 +1976,11 @@ static void rna_def_steering_actuator(BlenderRNA *brna) RNA_def_property_enum_items(prop, facingaxis_items); RNA_def_property_ui_text(prop, "Axis", "Axis for automatic facing"); RNA_def_property_update(prop, NC_LOGIC, NULL); - + + prop= RNA_def_property(srna, "normalup", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_STEERING_NORMALUP); + RNA_def_property_ui_text(prop, "N", "Use normal of the navmesh to set \"UP\" vector"); + RNA_def_property_update(prop, NC_LOGIC, NULL); } void RNA_def_actuator(BlenderRNA *brna) diff --git a/source/gameengine/Converter/KX_ConvertActuators.cpp b/source/gameengine/Converter/KX_ConvertActuators.cpp index 727df53853c..0d70836e54c 100644 --- a/source/gameengine/Converter/KX_ConvertActuators.cpp +++ b/source/gameengine/Converter/KX_ConvertActuators.cpp @@ -1060,11 +1060,12 @@ void BL_ConvertActuators(char* maggiename, bool selfTerminated = (stAct->flag & ACT_STEERING_SELFTERMINATED) !=0; bool enableVisualization = (stAct->flag & ACT_STEERING_ENABLEVISUALIZATION) !=0; short facingMode = (stAct->flag & ACT_STEERING_AUTOMATICFACING) ? stAct->facingaxis : 0; + bool normalup = (stAct->flag & ACT_STEERING_NORMALUP) !=0; KX_SteeringActuator *tmpstact = new KX_SteeringActuator(gameobj, mode, targetob, navmeshob,stAct->dist, stAct->velocity, stAct->acceleration, stAct->turnspeed, selfTerminated, stAct->updateTime, - scene->GetObstacleSimulation(), facingMode, enableVisualization); + scene->GetObstacleSimulation(), facingMode, normalup, enableVisualization); baseact = tmpstact; break; } diff --git a/source/gameengine/Ketsji/KX_SteeringActuator.cpp b/source/gameengine/Ketsji/KX_SteeringActuator.cpp index b91faf2646f..31dcd00e61f 100644 --- a/source/gameengine/Ketsji/KX_SteeringActuator.cpp +++ b/source/gameengine/Ketsji/KX_SteeringActuator.cpp @@ -39,7 +39,7 @@ #include "KX_ObstacleSimulation.h" #include "KX_PythonInit.h" #include "KX_PyMath.h" - +#include "Recast.h" /* ------------------------------------------------------------------------- */ /* Native functions */ @@ -57,6 +57,7 @@ KX_SteeringActuator::KX_SteeringActuator(SCA_IObject *gameobj, int pathUpdatePeriod, KX_ObstacleSimulation* simulation, short facingmode, + bool normalup, bool enableVisualization) : SCA_IActuator(gameobj, KX_ACT_STEERING), m_mode(mode), @@ -72,6 +73,7 @@ KX_SteeringActuator::KX_SteeringActuator(SCA_IObject *gameobj, m_simulation(simulation), m_enableVisualization(enableVisualization), m_facingMode(facingmode), + m_normalUp(normalup), m_obstacle(NULL), m_pathLen(0), m_wayPointIdx(-1), @@ -309,23 +311,129 @@ bool KX_SteeringActuator::Update(double curtime, bool frame) const MT_Vector3& KX_SteeringActuator::GetSteeringVec() { + static MT_Vector3 ZERO_VECTOR(0, 0, 0); if (m_isActive) return m_steerVec; else - return MT_Vector3(0, 0, 0); + return ZERO_VECTOR; +} + +inline float vdot2(const float* a, const float* b) +{ + return a[0]*b[0] + a[2]*b[2]; +} +static bool barDistSqPointToTri(const float* p, const float* a, const float* b, const float* c) +{ + float v0[3], v1[3], v2[3]; + vsub(v0, c,a); + vsub(v1, b,a); + vsub(v2, p,a); + + const float dot00 = vdot2(v0, v0); + const float dot01 = vdot2(v0, v1); + const float dot02 = vdot2(v0, v2); + const float dot11 = vdot2(v1, v1); + const float dot12 = vdot2(v1, v2); + + // Compute barycentric coordinates + float invDenom = 1.0f / (dot00 * dot11 - dot01 * dot01); + float u = (dot11 * dot02 - dot01 * dot12) * invDenom; + float v = (dot00 * dot12 - dot01 * dot02) * invDenom; + + float ud = u<0.f ? -u : (u>1.f ? u-1.f : 0.f); + float vd = v<0.f ? -v : (v>1.f ? v-1.f : 0.f); + return ud*ud+vd*vd ; +} + +inline void flipAxes(float* vec) +{ + std::swap(vec[1],vec[2]); +} + +static bool getNavmeshNormal(dtStatNavMesh* navmesh, const MT_Vector3& pos, MT_Vector3& normal) +{ + static const float polyPickExt[3] = {2, 4, 2}; + float spos[3]; + pos.getValue(spos); + flipAxes(spos); + dtStatPolyRef sPolyRef = navmesh->findNearestPoly(spos, polyPickExt); + if (sPolyRef == 0) + return false; + const dtStatPoly* p = navmesh->getPoly(sPolyRef-1); + const dtStatPolyDetail* pd = navmesh->getPolyDetail(sPolyRef-1); + + float distMin = FLT_MAX; + int idxMin = -1; + for (int i = 0; i < pd->ntris; ++i) + { + const unsigned char* t = navmesh->getDetailTri(pd->tbase+i); + const float* v[3]; + for (int j = 0; j < 3; ++j) + { + if (t[j] < p->nv) + v[j] = navmesh->getVertex(p->v[t[j]]); + else + v[j] = navmesh->getDetailVertex(pd->vbase+(t[j]-p->nv)); + } + float dist = barDistSqPointToTri(spos, v[0], v[1], v[2]); + if (dist=0) + { + const unsigned char* t = navmesh->getDetailTri(pd->tbase+idxMin); + const float* v[3]; + for (int j = 0; j < 3; ++j) + { + if (t[j] < p->nv) + v[j] = navmesh->getVertex(p->v[t[j]]); + else + v[j] = navmesh->getDetailVertex(pd->vbase+(t[j]-p->nv)); + } + MT_Vector3 tri[3]; + for (size_t j=0; j<3; j++) + tri[j].setValue(v[j][0],v[j][2],v[j][1]); + MT_Vector3 a,b; + a = tri[1]-tri[0]; + b = tri[2]-tri[0]; + normal = b.cross(a).safe_normalized(); + return true; + } + + return false; } void KX_SteeringActuator::HandleActorFace(MT_Vector3& velocity) { - if (m_facingMode==0) + if (m_facingMode==0 && (!m_navmesh || !m_normalUp)) return; - MT_Vector3 dir = velocity; + KX_GameObject* curobj = (KX_GameObject*) GetParent(); + MT_Vector3 dir = m_facingMode==0 ? curobj->NodeGetLocalOrientation().getColumn(1) : velocity; if (dir.fuzzyZero()) return; dir.normalize(); MT_Vector3 up(0,0,1); MT_Vector3 left; MT_Matrix3x3 mat; + + if (m_navmesh && m_normalUp) + { + dtStatNavMesh* navmesh = m_navmesh->GetNavMesh(); + MT_Vector3 normal; + MT_Vector3 trpos = m_navmesh->TransformToLocalCoords(curobj->NodeGetWorldPosition()); + if (getNavmeshNormal(navmesh, trpos, normal)) + { + + left = (dir.cross(up)).safe_normalized(); + dir = (-left.cross(normal)).safe_normalized(); + up = normal; + } + } + switch (m_facingMode) { case 1: // TRACK X @@ -370,13 +478,14 @@ void KX_SteeringActuator::HandleActorFace(MT_Vector3& velocity) break; } } + mat.setValue ( left[0], dir[0],up[0], left[1], dir[1],up[1], left[2], dir[2],up[2] ); - KX_GameObject* curobj = (KX_GameObject*) GetParent(); + KX_GameObject* parentObject = curobj->GetParent(); if(parentObject) diff --git a/source/gameengine/Ketsji/KX_SteeringActuator.h b/source/gameengine/Ketsji/KX_SteeringActuator.h index 78fb29f4124..2b2dc9ae923 100644 --- a/source/gameengine/Ketsji/KX_SteeringActuator.h +++ b/source/gameengine/Ketsji/KX_SteeringActuator.h @@ -66,6 +66,7 @@ class KX_SteeringActuator : public SCA_IActuator bool m_isSelfTerminated; bool m_enableVisualization; short m_facingMode; + bool m_normalUp; float m_path[MAX_PATH_LENGTH*3]; int m_pathLen; int m_pathUpdatePeriod; @@ -96,6 +97,7 @@ public: int pathUpdatePeriod, KX_ObstacleSimulation* simulation, short facingmode, + bool normalup, bool enableVisualization); virtual ~KX_SteeringActuator(); virtual bool Update(double curtime, bool frame); From 2b4c0cd43b7cf5d92785f295052742746ce51c42 Mon Sep 17 00:00:00 2001 From: Benoit Bolsee Date: Tue, 31 Aug 2010 21:32:58 +0000 Subject: [PATCH 040/182] Recast: remove unused files --- .../Recast/Include/RecastDebugDraw.h | 59 -- .../Recast/Source/RecastDebugDraw.cpp | 799 ------------------ 2 files changed, 858 deletions(-) delete mode 100644 extern/recastnavigation/Recast/Include/RecastDebugDraw.h delete mode 100644 extern/recastnavigation/Recast/Source/RecastDebugDraw.cpp diff --git a/extern/recastnavigation/Recast/Include/RecastDebugDraw.h b/extern/recastnavigation/Recast/Include/RecastDebugDraw.h deleted file mode 100644 index 27ba0a1aa71..00000000000 --- a/extern/recastnavigation/Recast/Include/RecastDebugDraw.h +++ /dev/null @@ -1,59 +0,0 @@ -// -// Copyright (c) 2009 Mikko Mononen memon@inside.org -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. -// - -#ifndef RECAST_DEBUGDRAW_H -#define RECAST_DEBUGDRAW_H - -inline int bit(int a, int b) -{ - return (a & (1 << b)) >> b; -} - -inline void intToCol(int i, float* col) -{ - int r = bit(i, 0) + bit(i, 3) * 2 + 1; - int g = bit(i, 1) + bit(i, 4) * 2 + 1; - int b = bit(i, 2) + bit(i, 5) * 2 + 1; - col[0] = 1 - r*63.0f/255.0f; - col[1] = 1 - g*63.0f/255.0f; - col[2] = 1 - b*63.0f/255.0f; -} - -void rcDebugDrawHeightfieldSolid(const struct rcHeightfield& hf); -void rcDebugDrawHeightfieldWalkable(const struct rcHeightfield& hf); - -void rcDebugDrawMesh(const float* verts, int nverts, const int* tris, const float* normals, int ntris, const unsigned char* flags); -void rcDebugDrawMeshSlope(const float* verts, int nverts, const int* tris, const float* normals, int ntris, const float walkableSlopeAngle); - -void rcDebugDrawCompactHeightfieldSolid(const struct rcCompactHeightfield& chf); -void rcDebugDrawCompactHeightfieldRegions(const struct rcCompactHeightfield& chf); -void rcDebugDrawCompactHeightfieldDistance(const struct rcCompactHeightfield& chf); - -void rcDebugDrawRegionConnections(const struct rcContourSet& cset, const float alpha = 1.0f); -void rcDebugDrawRawContours(const struct rcContourSet& cset, const float alpha = 1.0f); -void rcDebugDrawContours(const struct rcContourSet& cset, const float alpha = 1.0f); -void rcDebugDrawPolyMesh(const struct rcPolyMesh& mesh); -void rcDebugDrawPolyMeshDetail(const struct rcPolyMeshDetail& dmesh); - -void rcDebugDrawCylinderWire(float minx, float miny, float minz, float maxx, float maxy, float maxz, const float* col); -void rcDebugDrawBoxWire(float minx, float miny, float minz, float maxx, float maxy, float maxz, const float* col); -void rcDebugDrawBox(float minx, float miny, float minz, float maxx, float maxy, float maxz, - const float* col1, const float* col2); -void rcDrawArc(const float* p0, const float* p1); - -#endif // RECAST_DEBUGDRAW_H diff --git a/extern/recastnavigation/Recast/Source/RecastDebugDraw.cpp b/extern/recastnavigation/Recast/Source/RecastDebugDraw.cpp deleted file mode 100644 index fecee4c6172..00000000000 --- a/extern/recastnavigation/Recast/Source/RecastDebugDraw.cpp +++ /dev/null @@ -1,799 +0,0 @@ -// -// Copyright (c) 2009 Mikko Mononen memon@inside.org -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. -// - -#define _USE_MATH_DEFINES -#include -#include "RecastDebugDraw.h" -#include "SDL.h" -#include "SDL_Opengl.h" -#include "MeshLoaderObj.h" -#include "Recast.h" - -void rcDebugDrawMesh(const float* verts, int nverts, - const int* tris, const float* normals, int ntris, - const unsigned char* flags) -{ - glBegin(GL_TRIANGLES); - for (int i = 0; i < ntris*3; i += 3) - { - float a = (2+normals[i+0]+normals[i+1])/4; - if (flags && !flags[i/3]) - glColor3f(a,a*0.3f,a*0.1f); - else - glColor3f(a,a,a); - glVertex3fv(&verts[tris[i]*3]); - glVertex3fv(&verts[tris[i+1]*3]); - glVertex3fv(&verts[tris[i+2]*3]); - } - glEnd(); -} - -void rcDebugDrawMeshSlope(const float* verts, int nverts, - const int* tris, const float* normals, int ntris, - const float walkableSlopeAngle) -{ - const float walkableThr = cosf(walkableSlopeAngle/180.0f*(float)M_PI); - - glBegin(GL_TRIANGLES); - for (int i = 0; i < ntris*3; i += 3) - { - const float* norm = &normals[i]; - float a = (2+norm[0]+norm[1])/4; - if (norm[1] > walkableThr) - glColor3f(a,a,a); - else - glColor3f(a,a*0.3f,a*0.1f); - glVertex3fv(&verts[tris[i]*3]); - glVertex3fv(&verts[tris[i+1]*3]); - glVertex3fv(&verts[tris[i+2]*3]); - } - glEnd(); -} - -void drawBoxWire(float minx, float miny, float minz, float maxx, float maxy, float maxz, const float* col) -{ - glColor4fv(col); - - // Top - glVertex3f(minx, miny, minz); - glVertex3f(maxx, miny, minz); - glVertex3f(maxx, miny, minz); - glVertex3f(maxx, miny, maxz); - glVertex3f(maxx, miny, maxz); - glVertex3f(minx, miny, maxz); - glVertex3f(minx, miny, maxz); - glVertex3f(minx, miny, minz); - - // bottom - glVertex3f(minx, maxy, minz); - glVertex3f(maxx, maxy, minz); - glVertex3f(maxx, maxy, minz); - glVertex3f(maxx, maxy, maxz); - glVertex3f(maxx, maxy, maxz); - glVertex3f(minx, maxy, maxz); - glVertex3f(minx, maxy, maxz); - glVertex3f(minx, maxy, minz); - - // Sides - glVertex3f(minx, miny, minz); - glVertex3f(minx, maxy, minz); - glVertex3f(maxx, miny, minz); - glVertex3f(maxx, maxy, minz); - glVertex3f(maxx, miny, maxz); - glVertex3f(maxx, maxy, maxz); - glVertex3f(minx, miny, maxz); - glVertex3f(minx, maxy, maxz); -} - -void drawBox(float minx, float miny, float minz, float maxx, float maxy, float maxz, - const float* col1, const float* col2) -{ - float verts[8*3] = - { - minx, miny, minz, - maxx, miny, minz, - maxx, miny, maxz, - minx, miny, maxz, - minx, maxy, minz, - maxx, maxy, minz, - maxx, maxy, maxz, - minx, maxy, maxz, - }; - static const float dim[6] = - { - 0.95f, 0.55f, 0.65f, 0.85f, 0.65f, 0.85f, - }; - static const unsigned char inds[6*5] = - { - 0, 7, 6, 5, 4, - 1, 0, 1, 2, 3, - 2, 1, 5, 6, 2, - 3, 3, 7, 4, 0, - 4, 2, 6, 7, 3, - 5, 0, 4, 5, 1, - }; - - const unsigned char* in = inds; - for (int i = 0; i < 6; ++i) - { - float d = dim[*in]; in++; - if (i == 0) - glColor4f(d*col2[0],d*col2[1],d*col2[2], col2[3]); - else - glColor4f(d*col1[0],d*col1[1],d*col1[2], col1[3]); - glVertex3fv(&verts[*in*3]); in++; - glVertex3fv(&verts[*in*3]); in++; - glVertex3fv(&verts[*in*3]); in++; - glVertex3fv(&verts[*in*3]); in++; - } -} - -void rcDebugDrawCylinderWire(float minx, float miny, float minz, float maxx, float maxy, float maxz, const float* col) -{ - static const int NUM_SEG = 16; - float dir[NUM_SEG*2]; - for (int i = 0; i < NUM_SEG; ++i) - { - const float a = (float)i/(float)NUM_SEG*(float)M_PI*2; - dir[i*2] = cosf(a); - dir[i*2+1] = sinf(a); - } - - const float cx = (maxx + minx)/2; - const float cz = (maxz + minz)/2; - const float rx = (maxx - minx)/2; - const float rz = (maxz - minz)/2; - - glColor4fv(col); - glBegin(GL_LINES); - for (int i = 0, j=NUM_SEG-1; i < NUM_SEG; j=i++) - { - glVertex3f(cx+dir[j*2+0]*rx, miny, cz+dir[j*2+1]*rz); - glVertex3f(cx+dir[i*2+0]*rx, miny, cz+dir[i*2+1]*rz); - glVertex3f(cx+dir[j*2+0]*rx, maxy, cz+dir[j*2+1]*rz); - glVertex3f(cx+dir[i*2+0]*rx, maxy, cz+dir[i*2+1]*rz); - } - for (int i = 0; i < NUM_SEG; i += NUM_SEG/4) - { - glVertex3f(cx+dir[i*2+0]*rx, miny, cz+dir[i*2+1]*rz); - glVertex3f(cx+dir[i*2+0]*rx, maxy, cz+dir[i*2+1]*rz); - } - glEnd(); -} - -void rcDebugDrawBoxWire(float minx, float miny, float minz, float maxx, float maxy, float maxz, const float* col) -{ - glBegin(GL_LINES); - drawBoxWire(minx, miny, minz, maxx, maxy, maxz, col); - glEnd(); -} - -void rcDebugDrawBox(float minx, float miny, float minz, float maxx, float maxy, float maxz, - const float* col1, const float* col2) -{ - glBegin(GL_QUADS); - drawBox(minx, miny, minz, maxx, maxy, maxz, col1, col2); - glEnd(); -} - - -void rcDebugDrawHeightfieldSolid(const rcHeightfield& hf) -{ - static const float col0[4] = { 1,1,1,1 }; - - const float* orig = hf.bmin; - const float cs = hf.cs; - const float ch = hf.ch; - - const int w = hf.width; - const int h = hf.height; - - glBegin(GL_QUADS); - - for (int y = 0; y < h; ++y) - { - for (int x = 0; x < w; ++x) - { - float fx = orig[0] + x*cs; - float fz = orig[2] + y*cs; - const rcSpan* s = hf.spans[x + y*w]; - while (s) - { - drawBox(fx, orig[1]+s->smin*ch, fz, fx+cs, orig[1] + s->smax*ch, fz+cs, col0, col0); - s = s->next; - } - } - } - glEnd(); -} - -void rcDebugDrawHeightfieldWalkable(const rcHeightfield& hf) -{ - static const float col0[4] = { 1,1,1,1 }; - static const float col1[4] = { 0.25f,0.44f,0.5f,1 }; - - const float* orig = hf.bmin; - const float cs = hf.cs; - const float ch = hf.ch; - - const int w = hf.width; - const int h = hf.height; - - glBegin(GL_QUADS); - - for (int y = 0; y < h; ++y) - { - for (int x = 0; x < w; ++x) - { - float fx = orig[0] + x*cs; - float fz = orig[2] + y*cs; - const rcSpan* s = hf.spans[x + y*w]; - while (s) - { - bool csel = (s->flags & 0x1) == 0; - drawBox(fx, orig[1]+s->smin*ch, fz, fx+cs, orig[1] + s->smax*ch, fz+cs, col0, csel ? col0 : col1); - s = s->next; - } - } - } - glEnd(); -} - -void rcDebugDrawCompactHeightfieldSolid(const rcCompactHeightfield& chf) -{ - const float cs = chf.cs; - const float ch = chf.ch; - - glColor3ub(64,112,128); - - glBegin(GL_QUADS); - for (int y = 0; y < chf.height; ++y) - { - for (int x = 0; x < chf.width; ++x) - { - const float fx = chf.bmin[0] + x*cs; - const float fz = chf.bmin[2] + y*cs; - const rcCompactCell& c = chf.cells[x+y*chf.width]; - - for (unsigned i = c.index, ni = c.index+c.count; i < ni; ++i) - { - const rcCompactSpan& s = chf.spans[i]; - const float fy = chf.bmin[1] + (s.y+1)*ch; - glVertex3f(fx, fy, fz); - glVertex3f(fx, fy, fz+cs); - glVertex3f(fx+cs, fy, fz+cs); - glVertex3f(fx+cs, fy, fz); - } - } - } - glEnd(); -} - -void rcDebugDrawCompactHeightfieldRegions(const rcCompactHeightfield& chf) -{ - const float cs = chf.cs; - const float ch = chf.ch; - - float col[4] = { 1,1,1,1 }; - - glBegin(GL_QUADS); - for (int y = 0; y < chf.height; ++y) - { - for (int x = 0; x < chf.width; ++x) - { - const float fx = chf.bmin[0] + x*cs; - const float fz = chf.bmin[2] + y*cs; - const rcCompactCell& c = chf.cells[x+y*chf.width]; - - for (unsigned i = c.index, ni = c.index+c.count; i < ni; ++i) - { - const rcCompactSpan& s = chf.spans[i]; - if (s.reg) - { - intToCol(s.reg, col); - glColor4fv(col); - } - else - { - glColor4ub(0,0,0,128); - } - const float fy = chf.bmin[1] + (s.y+1)*ch; - glVertex3f(fx, fy, fz); - glVertex3f(fx, fy, fz+cs); - glVertex3f(fx+cs, fy, fz+cs); - glVertex3f(fx+cs, fy, fz); - } - } - } - glEnd(); -} - - -void rcDebugDrawCompactHeightfieldDistance(const rcCompactHeightfield& chf) -{ - const float cs = chf.cs; - const float ch = chf.ch; - - float maxd = chf.maxDistance; - if (maxd < 1.0f) maxd = 1; - float dscale = 1.0f / maxd; - - glBegin(GL_QUADS); - for (int y = 0; y < chf.height; ++y) - { - for (int x = 0; x < chf.width; ++x) - { - const float fx = chf.bmin[0] + x*cs; - const float fz = chf.bmin[2] + y*cs; - const rcCompactCell& c = chf.cells[x+y*chf.width]; - - for (unsigned i = c.index, ni = c.index+c.count; i < ni; ++i) - { - const rcCompactSpan& s = chf.spans[i]; - const float fy = chf.bmin[1] + (s.y+1)*ch; - float cd = (float)s.dist * dscale; - glColor3f(cd, cd, cd); - glVertex3f(fx, fy, fz); - glVertex3f(fx, fy, fz+cs); - glVertex3f(fx+cs, fy, fz+cs); - glVertex3f(fx+cs, fy, fz); - } - } - } - glEnd(); -} - -static void getContourCenter(const rcContour* cont, const float* orig, float cs, float ch, float* center) -{ - center[0] = 0; - center[1] = 0; - center[2] = 0; - if (!cont->nverts) - return; - for (int i = 0; i < cont->nverts; ++i) - { - const int* v = &cont->verts[i*4]; - center[0] += (float)v[0]; - center[1] += (float)v[1]; - center[2] += (float)v[2]; - } - const float s = 1.0f / cont->nverts; - center[0] *= s * cs; - center[1] *= s * ch; - center[2] *= s * cs; - center[0] += orig[0]; - center[1] += orig[1] + 4*ch; - center[2] += orig[2]; -} - -static const rcContour* findContourFromSet(const rcContourSet& cset, unsigned short reg) -{ - for (int i = 0; i < cset.nconts; ++i) - { - if (cset.conts[i].reg == reg) - return &cset.conts[i]; - } - return 0; -} - -static void drawArc(const float* p0, const float* p1) -{ - static const int NPTS = 8; - float pts[NPTS*3]; - float dir[3]; - vsub(dir, p1, p0); - const float len = sqrtf(vdistSqr(p0, p1)); - for (int i = 0; i < NPTS; ++i) - { - float u = (float)i / (float)(NPTS-1); - float* p = &pts[i*3]; - p[0] = p0[0] + dir[0] * u; - p[1] = p0[1] + dir[1] * u + (len/4) * (1-rcSqr(u*2-1)); - p[2] = p0[2] + dir[2] * u; - } - for (int i = 0; i < NPTS-1; ++i) - { - glVertex3fv(&pts[i*3]); - glVertex3fv(&pts[(i+1)*3]); - } -} - -void rcDrawArc(const float* p0, const float* p1) -{ - glBegin(GL_LINES); - drawArc(p0, p1); - glEnd(); -} - -void rcDebugDrawRegionConnections(const rcContourSet& cset, const float alpha) -{ - const float* orig = cset.bmin; - const float cs = cset.cs; - const float ch = cset.ch; - - // Draw centers - float pos[3], pos2[3]; - - glColor4ub(0,0,0,196); - - glLineWidth(2.0f); - glBegin(GL_LINES); - for (int i = 0; i < cset.nconts; ++i) - { - const rcContour* cont = &cset.conts[i]; - getContourCenter(cont, orig, cs, ch, pos); - for (int j = 0; j < cont->nverts; ++j) - { - const int* v = &cont->verts[j*4]; - if (v[3] == 0 || (unsigned short)v[3] < cont->reg) continue; - const rcContour* cont2 = findContourFromSet(cset, (unsigned short)v[3]); - if (cont2) - { - getContourCenter(cont2, orig, cs, ch, pos2); - drawArc(pos, pos2); - } - } - } - glEnd(); - - float col[4] = { 1,1,1,alpha }; - - glPointSize(7.0f); - glBegin(GL_POINTS); - for (int i = 0; i < cset.nconts; ++i) - { - const rcContour* cont = &cset.conts[i]; - intToCol(cont->reg, col); - col[0] *= 0.5f; - col[1] *= 0.5f; - col[2] *= 0.5f; - glColor4fv(col); - getContourCenter(cont, orig, cs, ch, pos); - glVertex3fv(pos); - } - glEnd(); - - - glLineWidth(1.0f); - glPointSize(1.0f); -} - -void rcDebugDrawRawContours(const rcContourSet& cset, const float alpha) -{ - const float* orig = cset.bmin; - const float cs = cset.cs; - const float ch = cset.ch; - float col[4] = { 1,1,1,alpha }; - glLineWidth(2.0f); - glPointSize(2.0f); - for (int i = 0; i < cset.nconts; ++i) - { - const rcContour& c = cset.conts[i]; - intToCol(c.reg, col); - glColor4fv(col); - glBegin(GL_LINE_LOOP); - for (int j = 0; j < c.nrverts; ++j) - { - const int* v = &c.rverts[j*4]; - float fx = orig[0] + v[0]*cs; - float fy = orig[1] + (v[1]+1+(i&1))*ch; - float fz = orig[2] + v[2]*cs; - glVertex3f(fx,fy,fz); - } - glEnd(); - - col[0] *= 0.5f; - col[1] *= 0.5f; - col[2] *= 0.5f; - glColor4fv(col); - - glBegin(GL_POINTS); - for (int j = 0; j < c.nrverts; ++j) - { - const int* v = &c.rverts[j*4]; - - float off = 0; - if (v[3] & RC_BORDER_VERTEX) - { - glColor4ub(255,255,255,255); - off = ch*2; - } - else - { - glColor4fv(col); - } - - float fx = orig[0] + v[0]*cs; - float fy = orig[1] + (v[1]+1+(i&1))*ch + off; - float fz = orig[2] + v[2]*cs; - glVertex3f(fx,fy,fz); - } - glEnd(); - } - glLineWidth(1.0f); - glPointSize(1.0f); -} - -void rcDebugDrawContours(const rcContourSet& cset, const float alpha) -{ - const float* orig = cset.bmin; - const float cs = cset.cs; - const float ch = cset.ch; - float col[4] = { 1,1,1,1 }; - glLineWidth(2.5f); - glPointSize(3.0f); - for (int i = 0; i < cset.nconts; ++i) - { - const rcContour& c = cset.conts[i]; - intToCol(c.reg, col); - glColor4fv(col); - - glBegin(GL_LINE_LOOP); - for (int j = 0; j < c.nverts; ++j) - { - const int* v = &c.verts[j*4]; - float fx = orig[0] + v[0]*cs; - float fy = orig[1] + (v[1]+1+(i&1))*ch; - float fz = orig[2] + v[2]*cs; - glVertex3f(fx,fy,fz); - } - glEnd(); - - col[0] *= 0.5f; - col[1] *= 0.5f; - col[2] *= 0.5f; - glColor4fv(col); - glBegin(GL_POINTS); - for (int j = 0; j < c.nverts; ++j) - { - const int* v = &c.verts[j*4]; - float off = 0; - if (v[3] & RC_BORDER_VERTEX) - { - glColor4ub(255,255,255,255); - off = ch*2; - } - else - { - glColor4fv(col); - } - - float fx = orig[0] + v[0]*cs; - float fy = orig[1] + (v[1]+1+(i&1))*ch + off; - float fz = orig[2] + v[2]*cs; - glVertex3f(fx,fy,fz); - } - glEnd(); - } - glLineWidth(1.0f); - glPointSize(1.0f); -} - -void rcDebugDrawPolyMesh(const struct rcPolyMesh& mesh) -{ - const int nvp = mesh.nvp; - const float cs = mesh.cs; - const float ch = mesh.ch; - const float* orig = mesh.bmin; - float col[4] = {1,1,1,0.75f}; - glBegin(GL_TRIANGLES); - for (int i = 0; i < mesh.npolys; ++i) - { - const unsigned short* p = &mesh.polys[i*nvp*2]; - intToCol(i, col); - glColor4fv(col); - unsigned short vi[3]; - for (int j = 2; j < nvp; ++j) - { - if (p[j] == 0xffff) break; - vi[0] = p[0]; - vi[1] = p[j-1]; - vi[2] = p[j]; - for (int k = 0; k < 3; ++k) - { - const unsigned short* v = &mesh.verts[vi[k]*3]; - const float x = orig[0] + v[0]*cs; - const float y = orig[1] + (v[1]+1)*ch; - const float z = orig[2] + v[2]*cs; - glVertex3f(x, y, z); - } - } - } - glEnd(); - - // Draw tri boundaries - glColor4ub(0,48,64,32); - glLineWidth(1.5f); - glBegin(GL_LINES); - for (int i = 0; i < mesh.npolys; ++i) - { - const unsigned short* poly = &mesh.polys[i*nvp*2]; - for (int j = 0; j < nvp; ++j) - { - if (poly[j] == 0xffff) break; - if (poly[nvp+j] == 0xffff) continue; - int vi[2]; - vi[0] = poly[j]; - if (j+1 >= nvp || poly[j+1] == 0xffff) - vi[1] = poly[0]; - else - vi[1] = poly[j+1]; - for (int k = 0; k < 2; ++k) - { - const unsigned short* v = &mesh.verts[vi[k]*3]; - const float x = orig[0] + v[0]*cs; - const float y = orig[1] + (v[1]+1)*ch + 0.1f; - const float z = orig[2] + v[2]*cs; - glVertex3f(x, y, z); - } - } - } - glEnd(); - - // Draw boundaries - glLineWidth(2.5f); - glColor4ub(0,48,64,220); - glBegin(GL_LINES); - for (int i = 0; i < mesh.npolys; ++i) - { - const unsigned short* poly = &mesh.polys[i*nvp*2]; - for (int j = 0; j < nvp; ++j) - { - if (poly[j] == 0xffff) break; - if (poly[nvp+j] != 0xffff) continue; - int vi[2]; - vi[0] = poly[j]; - if (j+1 >= nvp || poly[j+1] == 0xffff) - vi[1] = poly[0]; - else - vi[1] = poly[j+1]; - for (int k = 0; k < 2; ++k) - { - const unsigned short* v = &mesh.verts[vi[k]*3]; - const float x = orig[0] + v[0]*cs; - const float y = orig[1] + (v[1]+1)*ch + 0.1f; - const float z = orig[2] + v[2]*cs; - glVertex3f(x, y, z); - } - } - } - glEnd(); - glLineWidth(1.0f); - - glPointSize(3.0f); - glColor4ub(0,0,0,220); - glBegin(GL_POINTS); - for (int i = 0; i < mesh.nverts; ++i) - { - const unsigned short* v = &mesh.verts[i*3]; - const float x = orig[0] + v[0]*cs; - const float y = orig[1] + (v[1]+1)*ch + 0.1f; - const float z = orig[2] + v[2]*cs; - glVertex3f(x, y, z); - } - glEnd(); - glPointSize(1.0f); -} - -void rcDebugDrawPolyMeshDetail(const struct rcPolyMeshDetail& dmesh) -{ - float col[4] = {1,1,1,0.75f}; - - glBegin(GL_TRIANGLES); - for (int i = 0; i < dmesh.nmeshes; ++i) - { - const unsigned short* m = &dmesh.meshes[i*4]; - const unsigned short bverts = m[0]; - const unsigned short btris = m[2]; - const unsigned short ntris = m[3]; - const float* verts = &dmesh.verts[bverts*3]; - const unsigned char* tris = &dmesh.tris[btris*4]; - - intToCol(i, col); - glColor4fv(col); - for (int j = 0; j < ntris; ++j) - { - glVertex3fv(&verts[tris[j*4+0]*3]); - glVertex3fv(&verts[tris[j*4+1]*3]); - glVertex3fv(&verts[tris[j*4+2]*3]); - } - } - glEnd(); - - // Internal edges. - glLineWidth(1.0f); - glColor4ub(0,0,0,64); - glBegin(GL_LINES); - for (int i = 0; i < dmesh.nmeshes; ++i) - { - const unsigned short* m = &dmesh.meshes[i*4]; - const unsigned short bverts = m[0]; - const unsigned short btris = m[2]; - const unsigned short ntris = m[3]; - const float* verts = &dmesh.verts[bverts*3]; - const unsigned char* tris = &dmesh.tris[btris*4]; - - for (int j = 0; j < ntris; ++j) - { - const unsigned char* t = &tris[j*4]; - for (int k = 0, kp = 2; k < 3; kp=k++) - { - unsigned char ef = (t[3] >> (kp*2)) & 0x3; - if (ef == 0) - { - // Internal edge - if (t[kp] < t[k]) - { - glVertex3fv(&verts[t[kp]*3]); - glVertex3fv(&verts[t[k]*3]); - } - } - } - } - } - glEnd(); - - // External edges. - glLineWidth(2.0f); - glColor4ub(0,0,0,64); - glBegin(GL_LINES); - for (int i = 0; i < dmesh.nmeshes; ++i) - { - const unsigned short* m = &dmesh.meshes[i*4]; - const unsigned short bverts = m[0]; - const unsigned short btris = m[2]; - const unsigned short ntris = m[3]; - const float* verts = &dmesh.verts[bverts*3]; - const unsigned char* tris = &dmesh.tris[btris*4]; - - for (int j = 0; j < ntris; ++j) - { - const unsigned char* t = &tris[j*4]; - for (int k = 0, kp = 2; k < 3; kp=k++) - { - unsigned char ef = (t[3] >> (kp*2)) & 0x3; - if (ef != 0) - { - // Ext edge - glVertex3fv(&verts[t[kp]*3]); - glVertex3fv(&verts[t[k]*3]); - } - } - } - } - glEnd(); - - glLineWidth(1.0f); - - glPointSize(3.0f); - glBegin(GL_POINTS); - for (int i = 0; i < dmesh.nmeshes; ++i) - { - const unsigned short* m = &dmesh.meshes[i*4]; - const unsigned short bverts = m[0]; - const unsigned short nverts = m[1]; - const float* verts = &dmesh.verts[bverts*3]; - for (int j = 0; j < nverts; ++j) - { - glColor4ub(0,0,0,64); - glVertex3fv(&verts[j*3]); - } - } - glEnd(); - glPointSize(1.0f); -} From b6b277cac0c46ca32b3ee42d090c22872aeaf2ad Mon Sep 17 00:00:00 2001 From: Benoit Bolsee Date: Tue, 31 Aug 2010 21:40:11 +0000 Subject: [PATCH 041/182] Detour: remove unused files --- .../Detour/Include/DetourDebugDraw.h | 32 -- .../Detour/Source/DetourDebugDraw.cpp | 496 ------------------ 2 files changed, 528 deletions(-) delete mode 100644 extern/recastnavigation/Detour/Include/DetourDebugDraw.h delete mode 100644 extern/recastnavigation/Detour/Source/DetourDebugDraw.cpp diff --git a/extern/recastnavigation/Detour/Include/DetourDebugDraw.h b/extern/recastnavigation/Detour/Include/DetourDebugDraw.h deleted file mode 100644 index 8e1cfe44fdb..00000000000 --- a/extern/recastnavigation/Detour/Include/DetourDebugDraw.h +++ /dev/null @@ -1,32 +0,0 @@ -// -// Copyright (c) 2009 Mikko Mononen memon@inside.org -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. -// - -#ifndef DETOURDEBUGDRAW_H -#define DETOURDEBUGDRAW_H - -#include "DetourStatNavMesh.h" -#include "DetourTileNavMesh.h" - -void dtDebugDrawStatNavMeshPoly(const dtStatNavMesh* mesh, dtStatPolyRef ref, const float* col); -void dtDebugDrawStatNavMeshBVTree(const dtStatNavMesh* mesh); -void dtDebugDrawStatNavMesh(const dtStatNavMesh* mesh, bool drawClosedList = false); - -void dtDebugDrawTiledNavMesh(const dtTiledNavMesh* mesh); -void dtDebugDrawTiledNavMeshPoly(const dtTiledNavMesh* mesh, dtTilePolyRef ref, const float* col); - -#endif // DETOURDEBUGDRAW_H \ No newline at end of file diff --git a/extern/recastnavigation/Detour/Source/DetourDebugDraw.cpp b/extern/recastnavigation/Detour/Source/DetourDebugDraw.cpp deleted file mode 100644 index 25f32f12481..00000000000 --- a/extern/recastnavigation/Detour/Source/DetourDebugDraw.cpp +++ /dev/null @@ -1,496 +0,0 @@ -// -// Copyright (c) 2009 Mikko Mononen memon@inside.org -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// 1. The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. If you use this software -// in a product, an acknowledgment in the product documentation would be -// appreciated but is not required. -// 2. Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// 3. This notice may not be removed or altered from any source distribution. -// - -#include "DetourDebugDraw.h" -#include "DetourStatNavMesh.h" -#include "SDL.h" -#include "SDL_Opengl.h" - -void dtDebugDrawStatNavMeshPoly(const dtStatNavMesh* mesh, dtStatPolyRef ref, const float* col) -{ - int idx = mesh->getPolyIndexByRef(ref); - if (idx == -1) return; - - glColor4f(col[0],col[1],col[2],0.25f); - - if (mesh->getPolyDetailCount()) - { - const dtStatPoly* p = mesh->getPoly(idx); - const dtStatPolyDetail* pd = mesh->getPolyDetail(idx); - glBegin(GL_TRIANGLES); - for (int j = 0; j < pd->ntris; ++j) - { - const unsigned char* t = mesh->getDetailTri(pd->tbase+j); - for (int k = 0; k < 3; ++k) - { - if (t[k] < p->nv) - glVertex3fv(mesh->getVertex(p->v[t[k]])); - else - glVertex3fv(mesh->getDetailVertex(pd->vbase+(t[k]-p->nv))); - } - } - glEnd(); - } - else - { - const dtStatPoly* p = mesh->getPoly(idx); - glBegin(GL_TRIANGLES); - unsigned short vi[3]; - for (int j = 2; j < (int)p->nv; ++j) - { - vi[0] = p->v[0]; - vi[1] = p->v[j-1]; - vi[2] = p->v[j]; - for (int k = 0; k < 3; ++k) - { - const float* v = mesh->getVertex(vi[k]); - glVertex3f(v[0], v[1]+0.2f, v[2]); - } - } - glEnd(); - } -} - -static void drawBoxWire(float minx, float miny, float minz, float maxx, float maxy, float maxz, const float* col) -{ - glColor4fv(col); - - // Top - glVertex3f(minx, miny, minz); - glVertex3f(maxx, miny, minz); - glVertex3f(maxx, miny, minz); - glVertex3f(maxx, miny, maxz); - glVertex3f(maxx, miny, maxz); - glVertex3f(minx, miny, maxz); - glVertex3f(minx, miny, maxz); - glVertex3f(minx, miny, minz); - - // bottom - glVertex3f(minx, maxy, minz); - glVertex3f(maxx, maxy, minz); - glVertex3f(maxx, maxy, minz); - glVertex3f(maxx, maxy, maxz); - glVertex3f(maxx, maxy, maxz); - glVertex3f(minx, maxy, maxz); - glVertex3f(minx, maxy, maxz); - glVertex3f(minx, maxy, minz); - - // Sides - glVertex3f(minx, miny, minz); - glVertex3f(minx, maxy, minz); - glVertex3f(maxx, miny, minz); - glVertex3f(maxx, maxy, minz); - glVertex3f(maxx, miny, maxz); - glVertex3f(maxx, maxy, maxz); - glVertex3f(minx, miny, maxz); - glVertex3f(minx, maxy, maxz); -} - -void dtDebugDrawStatNavMeshBVTree(const dtStatNavMesh* mesh) -{ - const float col[] = { 1,1,1,0.5f }; - const dtStatNavMeshHeader* hdr = mesh->getHeader(); - - const dtStatBVNode* nodes = mesh->getBvTreeNodes(); - int nnodes = mesh->getBvTreeNodeCount(); - - glBegin(GL_LINES); - - for (int i = 0; i < nnodes; ++i) - { - const dtStatBVNode* n = &nodes[i]; - if (n->i < 0) // Leaf indices are positive. - continue; - drawBoxWire(hdr->bmin[0] + n->bmin[0]*hdr->cs, - hdr->bmin[1] + n->bmin[1]*hdr->cs, - hdr->bmin[2] + n->bmin[2]*hdr->cs, - hdr->bmin[0] + n->bmax[0]*hdr->cs, - hdr->bmin[1] + n->bmax[1]*hdr->cs, - hdr->bmin[2] + n->bmax[2]*hdr->cs, col); - } - glEnd(); -} - - -static float distancePtLine2d(const float* pt, const float* p, const float* q) -{ - float pqx = q[0] - p[0]; - float pqz = q[2] - p[2]; - float dx = pt[0] - p[0]; - float dz = pt[2] - p[2]; - float d = pqx*pqx + pqz*pqz; - float t = pqx*dx + pqz*dz; - if (d != 0) t /= d; - dx = p[0] + t*pqx - pt[0]; - dz = p[2] + t*pqz - pt[2]; - return dx*dx + dz*dz; -} - -static void drawStatMeshPolyBoundaries(const dtStatNavMesh* mesh, bool inner) -{ - static const float thr = 0.01f*0.01f; - - glBegin(GL_LINES); - for (int i = 0; i < mesh->getPolyCount(); ++i) - { - const dtStatPoly* p = mesh->getPoly(i); - const dtStatPolyDetail* pd = mesh->getPolyDetail(i); - - for (int j = 0, nj = (int)p->nv; j < nj; ++j) - { - if (inner) - { - // Skip non-connected edges. - if (p->n[j] == 0) continue; - } - else - { - // Skip connected edges. - if (p->n[j] != 0) continue; - } - - const float* v0 = mesh->getVertex(p->v[j]); - const float* v1 = mesh->getVertex(p->v[(j+1) % nj]); - - // Draw detail mesh edges which align with the actual poly edge. - // This is really slow. - for (int k = 0; k < pd->ntris; ++k) - { - const unsigned char* t = mesh->getDetailTri(pd->tbase+k); - const float* tv[3]; - for (int m = 0; m < 3; ++m) - { - if (t[m] < p->nv) - tv[m] = mesh->getVertex(p->v[t[m]]); - else - tv[m] = mesh->getDetailVertex(pd->vbase+(t[m]-p->nv)); - } - for (int m = 0, n = 2; m < 3; n=m++) - { - if (((t[3] >> (n*2)) & 0x3) == 0) continue; // Skip inner edges. - if (distancePtLine2d(tv[n],v0,v1) < thr && - distancePtLine2d(tv[m],v0,v1) < thr) - { - glVertex3fv(tv[n]); - glVertex3fv(tv[m]); - } - } - } - } - } - glEnd(); -} - -void dtDebugDrawStatNavMesh(const dtStatNavMesh* mesh, bool drawClosedList) -{ - glBegin(GL_TRIANGLES); - for (int i = 0; i < mesh->getPolyDetailCount(); ++i) - { - const dtStatPoly* p = mesh->getPoly(i); - const dtStatPolyDetail* pd = mesh->getPolyDetail(i); - - if (drawClosedList && mesh->isInClosedList(i+1)) - glColor4ub(255,196,0,64); - else - glColor4ub(0,196,255,64); - - for (int j = 0; j < pd->ntris; ++j) - { - const unsigned char* t = mesh->getDetailTri(pd->tbase+j); - for (int k = 0; k < 3; ++k) - { - if (t[k] < p->nv) - glVertex3fv(mesh->getVertex(p->v[t[k]])); - else - glVertex3fv(mesh->getDetailVertex(pd->vbase+(t[k]-p->nv))); - } - } - } - glEnd(); - - // Draw inter poly boundaries - glColor4ub(0,48,64,32); - glLineWidth(1.5f); - drawStatMeshPolyBoundaries(mesh, true); - - // Draw outer poly boundaries - glLineWidth(2.5f); - glColor4ub(0,48,64,220); - drawStatMeshPolyBoundaries(mesh, false); - - glLineWidth(1.0f); - - glPointSize(3.0f); - glColor4ub(0,0,0,196); - glBegin(GL_POINTS); - for (int i = 0; i < mesh->getVertexCount(); ++i) - { - const float* v = mesh->getVertex(i); - glVertex3f(v[0], v[1], v[2]); - } - glEnd(); - glPointSize(1.0f); -} - - -static void drawTilePolyBoundaries(const dtTileHeader* header, bool inner) -{ - static const float thr = 0.01f*0.01f; - - glBegin(GL_LINES); - for (int i = 0; i < header->npolys; ++i) - { - const dtTilePoly* p = &header->polys[i]; - const dtTilePolyDetail* pd = &header->dmeshes[i]; - - for (int j = 0, nj = (int)p->nv; j < nj; ++j) - { - if (inner) - { - if (p->n[j] == 0) continue; - if (p->n[j] & 0x8000) - { - bool con = false; - for (int k = 0; k < p->nlinks; ++k) - { - if (header->links[p->links+k].e == j) - { - con = true; - break; - } - } - if (con) - glColor4ub(255,255,255,128); - else - glColor4ub(0,0,0,128); - } - else - glColor4ub(0,48,64,32); - } - else - { - if (p->n[j] != 0) continue; - } - - const float* v0 = &header->verts[p->v[j]*3]; - const float* v1 = &header->verts[p->v[(j+1)%nj]*3]; - - // Draw detail mesh edges which align with the actual poly edge. - // This is really slow. - for (int k = 0; k < pd->ntris; ++k) - { - const unsigned char* t = &header->dtris[(pd->tbase+k)*4]; - const float* tv[3]; - for (int m = 0; m < 3; ++m) - { - if (t[m] < p->nv) - tv[m] = &header->verts[p->v[t[m]]*3]; - else - tv[m] = &header->dverts[(pd->vbase+(t[m]-p->nv))*3]; - } - for (int m = 0, n = 2; m < 3; n=m++) - { - if (((t[3] >> (n*2)) & 0x3) == 0) continue; // Skip inner detail edges. - if (distancePtLine2d(tv[n],v0,v1) < thr && - distancePtLine2d(tv[m],v0,v1) < thr) - { - glVertex3fv(tv[n]); - glVertex3fv(tv[m]); - } - } - } - } - } - glEnd(); -} - -static void drawTile(const dtTileHeader* header) -{ - glBegin(GL_TRIANGLES); - for (int i = 0; i < header->npolys; ++i) - { - const dtTilePoly* p = &header->polys[i]; - const dtTilePolyDetail* pd = &header->dmeshes[i]; - - glColor4ub(0,196,255,64); - - for (int j = 0; j < pd->ntris; ++j) - { - const unsigned char* t = &header->dtris[(pd->tbase+j)*4]; - for (int k = 0; k < 3; ++k) - { - if (t[k] < p->nv) - glVertex3fv(&header->verts[p->v[t[k]]*3]); - else - glVertex3fv(&header->dverts[(pd->vbase+t[k]-p->nv)*3]); - } - } - } - glEnd(); - - // Draw inter poly boundaries - glColor4ub(0,48,64,32); - glLineWidth(1.5f); - - drawTilePolyBoundaries(header, true); - - // Draw outer poly boundaries - glLineWidth(2.5f); - glColor4ub(0,48,64,220); - - drawTilePolyBoundaries(header, false); - - glLineWidth(1.0f); - - glPointSize(3.0f); - glColor4ub(0,0,0,196); - glBegin(GL_POINTS); - for (int i = 0; i < header->nverts; ++i) - { - const float* v = &header->verts[i*3]; - glVertex3f(v[0], v[1], v[2]); - } - glEnd(); - glPointSize(1.0f); - - // Draw portals -/* glBegin(GL_LINES); - - for (int i = 0; i < header->nportals[0]; ++i) - { - const dtTilePortal* p = &header->portals[0][i]; - if (p->ncon) - glColor4ub(255,255,255,192); - else - glColor4ub(255,0,0,64); - glVertex3f(header->bmax[0]-0.1f, p->bmin[1], p->bmin[0]); - glVertex3f(header->bmax[0]-0.1f, p->bmax[1], p->bmin[0]); - - glVertex3f(header->bmax[0]-0.1f, p->bmax[1], p->bmin[0]); - glVertex3f(header->bmax[0]-0.1f, p->bmax[1], p->bmax[0]); - - glVertex3f(header->bmax[0]-0.1f, p->bmax[1], p->bmax[0]); - glVertex3f(header->bmax[0]-0.1f, p->bmin[1], p->bmax[0]); - - glVertex3f(header->bmax[0]-0.1f, p->bmin[1], p->bmax[0]); - glVertex3f(header->bmax[0]-0.1f, p->bmin[1], p->bmin[0]); - } - for (int i = 0; i < header->nportals[1]; ++i) - { - const dtTilePortal* p = &header->portals[1][i]; - if (p->ncon) - glColor4ub(255,255,255,192); - else - glColor4ub(255,0,0,64); - glVertex3f(p->bmin[0], p->bmin[1], header->bmax[2]-0.1f); - glVertex3f(p->bmin[0], p->bmax[1], header->bmax[2]-0.1f); - - glVertex3f(p->bmin[0], p->bmax[1], header->bmax[2]-0.1f); - glVertex3f(p->bmax[0], p->bmax[1], header->bmax[2]-0.1f); - - glVertex3f(p->bmax[0], p->bmax[1], header->bmax[2]-0.1f); - glVertex3f(p->bmax[0], p->bmin[1], header->bmax[2]-0.1f); - - glVertex3f(p->bmax[0], p->bmin[1], header->bmax[2]-0.1f); - glVertex3f(p->bmin[0], p->bmin[1], header->bmax[2]-0.1f); - } - for (int i = 0; i < header->nportals[2]; ++i) - { - const dtTilePortal* p = &header->portals[2][i]; - if (p->ncon) - glColor4ub(255,255,255,192); - else - glColor4ub(255,0,0,64); - glVertex3f(header->bmin[0]+0.1f, p->bmin[1], p->bmin[0]); - glVertex3f(header->bmin[0]+0.1f, p->bmax[1], p->bmin[0]); - - glVertex3f(header->bmin[0]+0.1f, p->bmax[1], p->bmin[0]); - glVertex3f(header->bmin[0]+0.1f, p->bmax[1], p->bmax[0]); - - glVertex3f(header->bmin[0]+0.1f, p->bmax[1], p->bmax[0]); - glVertex3f(header->bmin[0]+0.1f, p->bmin[1], p->bmax[0]); - - glVertex3f(header->bmin[0]+0.1f, p->bmin[1], p->bmax[0]); - glVertex3f(header->bmin[0]+0.1f, p->bmin[1], p->bmin[0]); - } - for (int i = 0; i < header->nportals[3]; ++i) - { - const dtTilePortal* p = &header->portals[3][i]; - if (p->ncon) - glColor4ub(255,255,255,192); - else - glColor4ub(255,0,0,64); - glVertex3f(p->bmin[0], p->bmin[1], header->bmin[2]+0.1f); - glVertex3f(p->bmin[0], p->bmax[1], header->bmin[2]+0.1f); - - glVertex3f(p->bmin[0], p->bmax[1], header->bmin[2]+0.1f); - glVertex3f(p->bmax[0], p->bmax[1], header->bmin[2]+0.1f); - - glVertex3f(p->bmax[0], p->bmax[1], header->bmin[2]+0.1f); - glVertex3f(p->bmax[0], p->bmin[1], header->bmin[2]+0.1f); - - glVertex3f(p->bmax[0], p->bmin[1], header->bmin[2]+0.1f); - glVertex3f(p->bmin[0], p->bmin[1], header->bmin[2]+0.1f); - } - glEnd();*/ -} - -void dtDebugDrawTiledNavMesh(const dtTiledNavMesh* mesh) -{ - if (!mesh) return; - - for (int i = 0; i < DT_MAX_TILES; ++i) - { - const dtTile* tile = mesh->getTile(i); - if (!tile->header) continue; - - drawTile(tile->header); - } -} - -void dtDebugDrawTiledNavMeshPoly(const dtTiledNavMesh* mesh, dtTilePolyRef ref, const float* col) -{ - unsigned int salt, it, ip; - dtDecodeTileId(ref, salt, it, ip); - if (it >= DT_MAX_TILES) return; - const dtTile* tile = mesh->getTile(it); - if (tile->salt != salt || tile->header == 0) return; - const dtTileHeader* header = tile->header; - - if (ip >= (unsigned int)header->npolys) return; - - glColor4f(col[0],col[1],col[2],0.25f); - - const dtTilePoly* p = &header->polys[ip]; - const dtTilePolyDetail* pd = &header->dmeshes[ip]; - - glBegin(GL_TRIANGLES); - for (int i = 0; i < pd->ntris; ++i) - { - const unsigned char* t = &header->dtris[(pd->tbase+i)*4]; - for (int j = 0; j < 3; ++j) - { - if (t[j] < p->nv) - glVertex3fv(&header->verts[p->v[t[j]]*3]); - else - glVertex3fv(&header->dverts[(pd->vbase+t[j]-p->nv)*3]); - } - } - glEnd(); -} - From 0bca249298679334f842e5a982ffbcdba13aefc1 Mon Sep 17 00:00:00 2001 From: Benoit Bolsee Date: Tue, 31 Aug 2010 22:08:01 +0000 Subject: [PATCH 042/182] Add CMake build system on Recast&Navigation branch --- extern/CMakeLists.txt | 1 + extern/recastnavigation/CMakeLists.txt | 32 +++++++++++++++++++ source/blender/editors/object/CMakeLists.txt | 3 +- .../blender/editors/object/object_navmesh.cpp | 2 +- source/blender/editors/util/CMakeLists.txt | 3 +- source/blender/modifiers/CMakeLists.txt | 5 ++- source/creator/CMakeLists.txt | 1 + source/gameengine/Converter/CMakeLists.txt | 1 + source/gameengine/Ketsji/CMakeLists.txt | 3 ++ 9 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 extern/recastnavigation/CMakeLists.txt diff --git a/extern/CMakeLists.txt b/extern/CMakeLists.txt index b15c8a31c73..79d615ba730 100644 --- a/extern/CMakeLists.txt +++ b/extern/CMakeLists.txt @@ -33,6 +33,7 @@ IF(CMAKE_SYSTEM_NAME MATCHES "Linux") ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux") ADD_SUBDIRECTORY(glew) +ADD_SUBDIRECTORY(recastnavigation) IF(WITH_IMAGE_OPENJPEG) ADD_SUBDIRECTORY(libopenjpeg) diff --git a/extern/recastnavigation/CMakeLists.txt b/extern/recastnavigation/CMakeLists.txt new file mode 100644 index 00000000000..d36de44a766 --- /dev/null +++ b/extern/recastnavigation/CMakeLists.txt @@ -0,0 +1,32 @@ +# $Id$ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# The Original Code is Copyright (C) 2006, Blender Foundation +# All rights reserved. +# +# The Original Code is: all of this file. +# +# Contributor(s): Daniel Genrich +# +# ***** END GPL LICENSE BLOCK ***** + +SET(INC Recast/Include Detour/Include) + +FILE(GLOB SRC Recast/Source/*.cpp Detour/Source/*.cpp) + +BLENDERLIB(extern_recastnavigation "${SRC}" "${INC}") +#, libtype='blender', priority = 0 ) diff --git a/source/blender/editors/object/CMakeLists.txt b/source/blender/editors/object/CMakeLists.txt index a41b9e89f83..56f144ce63c 100644 --- a/source/blender/editors/object/CMakeLists.txt +++ b/source/blender/editors/object/CMakeLists.txt @@ -19,7 +19,7 @@ # # ***** END GPL LICENSE BLOCK ***** -FILE(GLOB SRC *.c) +FILE(GLOB SRC *.c *.cpp) SET(INC ../include @@ -34,6 +34,7 @@ SET(INC ../../windowmanager ../../render/extern/include ../../../../intern/guardedalloc + ../../../../extern/recastnavigation/Recast/Include ) IF(NOT WITH_PYTHON) diff --git a/source/blender/editors/object/object_navmesh.cpp b/source/blender/editors/object/object_navmesh.cpp index 572edcff976..95738a05db4 100644 --- a/source/blender/editors/object/object_navmesh.cpp +++ b/source/blender/editors/object/object_navmesh.cpp @@ -1,5 +1,5 @@ /** -* $Id:$ +* $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/editors/util/CMakeLists.txt b/source/blender/editors/util/CMakeLists.txt index b4b2fd12cef..2c55b0773be 100644 --- a/source/blender/editors/util/CMakeLists.txt +++ b/source/blender/editors/util/CMakeLists.txt @@ -19,13 +19,14 @@ # # ***** END GPL LICENSE BLOCK ***** -FILE(GLOB SRC *.c) +FILE(GLOB SRC *.c *.cpp) SET(INC ../../blenkernel ../../blenlib ../include ../../../../intern/guardedalloc + ../../../../extern/recastnavigation/Recast/Include ../../makesdna ../../makesrna ../../windowmanager diff --git a/source/blender/modifiers/CMakeLists.txt b/source/blender/modifiers/CMakeLists.txt index b6dcc9c03f9..1c3c772de38 100644 --- a/source/blender/modifiers/CMakeLists.txt +++ b/source/blender/modifiers/CMakeLists.txt @@ -24,7 +24,7 @@ # # ***** END GPL LICENSE BLOCK ***** -FILE(GLOB SRC intern/*.c) +FILE(GLOB SRC intern/*.c intern/*.cpp) SET(INC . ./intern @@ -33,10 +33,13 @@ SET(INC ../blenkernel ../blenkernel/intern ../render/extern/include + ../editors/include + ../gpu ../../../intern/guardedalloc ../../../intern/decimation/extern ../../../intern/elbeem/extern ../../../intern/bsp/extern + ../../../extern/recastnavigation/Recast/Include ${ZLIB_INC} ) diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt index 4088369a05b..cec5793ae97 100644 --- a/source/creator/CMakeLists.txt +++ b/source/creator/CMakeLists.txt @@ -498,6 +498,7 @@ ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux") extern_binreloc extern_glew extern_libopenjpeg + extern_recastnavigation bf_videotex bf_rna bf_dna diff --git a/source/gameengine/Converter/CMakeLists.txt b/source/gameengine/Converter/CMakeLists.txt index 97c367dd1f1..135ed820c4f 100644 --- a/source/gameengine/Converter/CMakeLists.txt +++ b/source/gameengine/Converter/CMakeLists.txt @@ -61,6 +61,7 @@ SET(INC ../../../source/blender/gpu ../../../source/blender/ikplugin ../../../extern/bullet2/src + ../../../extern/recastnavigation/Detour/Include ) IF(WITH_PYTHON) diff --git a/source/gameengine/Ketsji/CMakeLists.txt b/source/gameengine/Ketsji/CMakeLists.txt index d8f6e3164ec..a4f9dffb360 100644 --- a/source/gameengine/Ketsji/CMakeLists.txt +++ b/source/gameengine/Ketsji/CMakeLists.txt @@ -59,6 +59,9 @@ SET(INC ../../../source/blender/gpu ../../../extern/bullet2/src ../../../extern/glew/include + ../../../extern/recastnavigation/Recast/Include + ../../../extern/recastnavigation/Detour/Include + ../../../source/blender/editors/include ) ADD_DEFINITIONS(-DGLEW_STATIC) From 22295fd1a25464aee254f82713e07f6b3bb537bf Mon Sep 17 00:00:00 2001 From: Benoit Bolsee Date: Wed, 1 Sep 2010 08:11:23 +0000 Subject: [PATCH 043/182] Recast: add missing ID_NEW() for new steering actuator in set_sca_new_poins_ob() as pointed out by Dalai. --- source/blender/blenkernel/intern/sca.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/source/blender/blenkernel/intern/sca.c b/source/blender/blenkernel/intern/sca.c index 91c052bcbda..0b80989880a 100644 --- a/source/blender/blenkernel/intern/sca.c +++ b/source/blender/blenkernel/intern/sca.c @@ -474,6 +474,7 @@ void init_actuator(bActuator *act) sta->velocity= 3.f; sta->flag = ACT_STEERING_AUTOMATICFACING; sta->facingaxis = 1; + break; default: ; /* this is very severe... I cannot make any memory for this */ /* logic brick... */ @@ -582,9 +583,27 @@ void set_sca_new_poins_ob(Object *ob) bObjectActuator *oa= act->data; ID_NEW(oa->reference); } - else if(act->type==ACT_SCENE) { - bSceneActuator *sca= act->data; - ID_NEW(sca->camera); + else if(act->type==ACT_MESSAGE) { + bMessageActuator *ma= act->data; + ID_NEW(ma->toObject); + } + else if(act->type==ACT_PARENT) { + bParentActuator *para = act->data; + ID_NEW(para->ob); + } + else if(act->type==ACT_ARMATURE) { + bArmatureActuator *aa = act->data; + ID_NEW(aa->target); + ID_NEW(aa->subtarget); + } + else if(act->type==ACT_PROPERTY) { + bPropertyActuator *pa= act->data; + ID_NEW(pa->ob); + } + else if(act->type==ACT_STEERING) { + bSteeringActuator *sta = act->data; + ID_NEW(sta->navmesh); + ID_NEW(sta->target); } } act= act->next; From a52f51df2768165e9868bc77c6307c1508b161e2 Mon Sep 17 00:00:00 2001 From: Benoit Bolsee Date: Wed, 1 Sep 2010 21:43:22 +0000 Subject: [PATCH 044/182] Recast: add SCons build system. --- extern/SConscript | 1 + extern/recastnavigation/SConscript | 11 +++++++++++ source/blender/editors/object/SConscript | 3 ++- source/blender/editors/util/SConscript | 3 ++- source/blender/modifiers/SConscript | 4 +++- source/gameengine/Converter/SConscript | 1 + source/gameengine/Ketsji/SConscript | 2 ++ 7 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 extern/recastnavigation/SConscript diff --git a/extern/SConscript b/extern/SConscript index e91fafbeaf7..6335c2fd7f0 100644 --- a/extern/SConscript +++ b/extern/SConscript @@ -3,6 +3,7 @@ Import('env') SConscript(['glew/SConscript']) +SConscript(['recastnavigation/SConscript']) if env['WITH_BF_BULLET']: SConscript(['bullet2/src/SConscript']) diff --git a/extern/recastnavigation/SConscript b/extern/recastnavigation/SConscript new file mode 100644 index 00000000000..be10c33c327 --- /dev/null +++ b/extern/recastnavigation/SConscript @@ -0,0 +1,11 @@ +#!/usr/bin/python + +Import('env') + +sources = env.Glob('Recast/Source/*.cpp') + env.Glob('Detour/Source/*.cpp') + +incs = 'Recast/Include Detour/Include' + +env.BlenderLib ( 'extern_recastnavigation', sources, Split(incs), [], + libtype=['extern','player'], + priority=[10,185]) diff --git a/source/blender/editors/object/SConscript b/source/blender/editors/object/SConscript index 0a94de255cb..f4a476474e4 100644 --- a/source/blender/editors/object/SConscript +++ b/source/blender/editors/object/SConscript @@ -1,12 +1,13 @@ #!/usr/bin/python Import ('env') -sources = env.Glob('*.c') +sources = env.Glob('*.c') + env.Glob('*.cpp') incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf' incs += ' ../../windowmanager #/intern/guardedalloc' incs += ' ../../makesrna ../../python ../../ikplugin' incs += ' ../../render/extern/include ../../gpu' # for object_bake.c +incs += ' #extern/recastnavigation/Recast/Include' defs = [] diff --git a/source/blender/editors/util/SConscript b/source/blender/editors/util/SConscript index 74ca2c89ba2..810874da865 100644 --- a/source/blender/editors/util/SConscript +++ b/source/blender/editors/util/SConscript @@ -1,10 +1,11 @@ #!/usr/bin/python Import ('env') -sources = env.Glob('*.c') +sources = env.Glob('*.c') + env.Glob('*.cpp') incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf' incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include' incs += ' ../../makesrna' +incs += ' #extern/recastnavigation/Recast/Include' env.BlenderLib ( 'bf_editors_util', sources, Split(incs), [], libtype=['core'], priority=[130] ) diff --git a/source/blender/modifiers/SConscript b/source/blender/modifiers/SConscript index dc1598fa6e9..4caf746fe6a 100644 --- a/source/blender/modifiers/SConscript +++ b/source/blender/modifiers/SConscript @@ -1,12 +1,14 @@ #!/usr/bin/python Import ('env') -sources = env.Glob('intern/*.c') +sources = env.Glob('intern/*.c') + env.Glob('intern/*.cpp') incs = '. ./intern' incs += ' #/intern/guardedalloc #/intern/decimation/extern #/intern/bsp/extern #/intern/elbeem/extern' incs += ' ../render/extern/include' incs += ' ../include ../blenlib ../makesdna ../blenkernel ../blenkernel/intern' +incs += ' ../editors/include ../gpu' +incs += ' #extern/recastnavigation/Recast/Include' incs += ' ' + env['BF_ZLIB_INC'] diff --git a/source/gameengine/Converter/SConscript b/source/gameengine/Converter/SConscript index 616c205732c..7c7a109a345 100644 --- a/source/gameengine/Converter/SConscript +++ b/source/gameengine/Converter/SConscript @@ -20,6 +20,7 @@ incs += ' #source/blender/misc #source/blender/blenloader #source/blender/gpu' incs += ' #source/blender/windowmanager' incs += ' #source/blender/makesrna' incs += ' #source/blender/ikplugin' +incs += ' #extern/recastnavigation/Detour/Include' incs += ' ' + env['BF_BULLET_INC'] diff --git a/source/gameengine/Ketsji/SConscript b/source/gameengine/Ketsji/SConscript index 58dc8a314bf..694175e8aca 100644 --- a/source/gameengine/Ketsji/SConscript +++ b/source/gameengine/Ketsji/SConscript @@ -19,6 +19,8 @@ incs += ' #source/gameengine/GameLogic #source/gameengine/Expressions #source/ga incs += ' #source/gameengine/SceneGraph #source/gameengine/Physics/common #source/gameengine/Physics/Bullet' incs += ' #source/gameengine/Physics/Dummy' incs += ' #source/blender/misc #source/blender/blenloader #extern/glew/include #source/blender/gpu' +incs += ' #extern/recastnavigation/Recast/Include #extern/recastnavigation/Detour/Include' +incs += ' #source/blender/editors/include' incs += ' ' + env['BF_BULLET_INC'] incs += ' ' + env['BF_OPENGL_INC'] From ee0f4e8d76f603a9f3a5f6b037ad4b98084cda42 Mon Sep 17 00:00:00 2001 From: Nick Samarin Date: Fri, 3 Sep 2010 19:56:22 +0000 Subject: [PATCH 045/182] - set valid default value for facingaxis parameter of steering actuator (for earlier versions) - disable instead hiding UI checkbox for facing_axis and normal_up parameters of steering actuator - fit rna names to the name convention for steering actuator and recast data structures --- release/scripts/ui/properties_scene.py | 26 ++++---- source/blender/blenloader/intern/readfile.c | 17 +++++ .../editors/space_logic/logic_window.c | 26 +++++--- source/blender/makesrna/intern/rna_actuator.c | 16 ++--- source/blender/makesrna/intern/rna_scene.c | 65 +++++++++++-------- 5 files changed, 94 insertions(+), 56 deletions(-) diff --git a/release/scripts/ui/properties_scene.py b/release/scripts/ui/properties_scene.py index 0601b8d3415..e61e7c6f62f 100644 --- a/release/scripts/ui/properties_scene.py +++ b/release/scripts/ui/properties_scene.py @@ -350,10 +350,10 @@ class SCENE_PT_navmesh(SceneButtonsPanel, bpy.types.Panel): split = layout.split() col = split.column() - col.prop(rd, "cellsize") + col.prop(rd, "cell_size") if wide_ui: col = split.column() - col.prop(rd, "cellheight") + col.prop(rd, "cell_height") layout.separator() @@ -361,25 +361,25 @@ class SCENE_PT_navmesh(SceneButtonsPanel, bpy.types.Panel): split = layout.split() col = split.column() row = col.row() - row.prop(rd, "agentheight") + row.prop(rd, "agent_height") row = col.row() - row.prop(rd, "agentradius") + row.prop(rd, "agent_radius") if wide_ui: col = split.column() row = col.row() - row.prop(rd, "agentmaxslope") + row.prop(rd, "max_slope") row = col.row() - row.prop(rd, "agentmaxclimb") + row.prop(rd, "max_climb") layout.separator() layout.label(text="Region:") split = layout.split() col = split.column() - col.prop(rd, "regionminsize") + col.prop(rd, "region_min_size") if wide_ui: col = split.column() - col.prop(rd, "regionmergesize") + col.prop(rd, "region_merge_size") layout.separator() @@ -387,23 +387,23 @@ class SCENE_PT_navmesh(SceneButtonsPanel, bpy.types.Panel): split = layout.split() col = split.column() row = col.row() - row.prop(rd, "edgemaxlen") + row.prop(rd, "edge_max_len") row = col.row() - row.prop(rd, "edgemaxerror") + row.prop(rd, "edge_max_error") if wide_ui: col = split.column() row = col.row() - row.prop(rd, "vertsperpoly") + row.prop(rd, "verts_per_poly") layout.separator() layout.label(text="Detail Mesh:") split = layout.split() col = split.column() - col.prop(rd, "detailsampledist") + col.prop(rd, "sample_dist") if wide_ui: col = split.column() - col.prop(rd, "detailsamplemaxerror") + col.prop(rd, "sample_max_error") def register(): diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index d137d57e2b8..81b5d7a5ef7 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -11157,6 +11157,23 @@ static void do_versions(FileData *fd, Library *lib, Main *main) } + // init facing axis property of steering actuators + { + Object *ob; + for(ob = main->object.first; ob; ob = ob->id.next) { + bActuator *act; + for(act= ob->actuators.first; act; act= act->next) { + if(act->type==ACT_STEERING) { + bSteeringActuator* stact = act->data; + if (stact->facingaxis==0) + { + stact->facingaxis=1; + } + } + } + } + } + /* WATCH IT!!!: pointers from libdata have not been converted yet here! */ /* WATCH IT 2!: Userdef struct init has to be in editors/interface/resources.c! */ diff --git a/source/blender/editors/space_logic/logic_window.c b/source/blender/editors/space_logic/logic_window.c index 6442dcfa66b..5421fb0f4f9 100644 --- a/source/blender/editors/space_logic/logic_window.c +++ b/source/blender/editors/space_logic/logic_window.c @@ -4336,6 +4336,7 @@ static void draw_actuator_visibility(uiLayout *layout, PointerRNA *ptr) static void draw_actuator_steering(uiLayout *layout, PointerRNA *ptr) { uiLayout *row; + uiLayout *col; uiItemR(layout, ptr, "mode", 0, NULL, 0); uiItemR(layout, ptr, "target", 0, NULL, 0); @@ -4346,25 +4347,32 @@ static void draw_actuator_steering(uiLayout *layout, PointerRNA *ptr) uiItemR(row, ptr, "velocity", 0, NULL, 0); row = uiLayoutRow(layout, 0); uiItemR(row, ptr, "acceleration", 0, NULL, 0); - uiItemR(row, ptr, "turnspeed", 0, NULL, 0); + uiItemR(row, ptr, "turn_speed", 0, NULL, 0); + row = uiLayoutRow(layout, 0); - uiItemR(row, ptr, "facing", 0, NULL, 0); - if (RNA_boolean_get(ptr, "facing")) + col = uiLayoutColumn(row, 0); + uiItemR(col, ptr, "facing", 0, NULL, 0); + col = uiLayoutColumn(row, 0); + uiItemR(col, ptr, "facing_axis", 0, NULL, 0); + if (!RNA_boolean_get(ptr, "facing")) { - uiItemR(row, ptr, "facingaxis", 0, NULL, 0); + uiLayoutSetActive(col, 0); } - if (RNA_pointer_get(ptr, "navmesh").data) + col = uiLayoutColumn(row, 0); + uiItemR(col, ptr, "normal_up", 0, NULL, 0); + if (!RNA_pointer_get(ptr, "navmesh").data) { - uiItemR(row, ptr, "normalup", 0, NULL, 0); + uiLayoutSetActive(col, 0); } + row = uiLayoutRow(layout, 0); - uiItemR(row, ptr, "selfterminated", 0, NULL, 0); + uiItemR(row, ptr, "self_terminated", 0, NULL, 0); if (RNA_enum_get(ptr, "mode")==ACT_STEERING_PATHFOLLOWING) { - uiItemR(row, ptr, "updateperiod", 0, NULL, 0); + uiItemR(row, ptr, "update_period", 0, NULL, 0); row = uiLayoutRow(layout, 0); } - uiItemR(row, ptr, "enablevisualization", 0, NULL, 0); + uiItemR(row, ptr, "show_visualization", 0, NULL, 0); } diff --git a/source/blender/makesrna/intern/rna_actuator.c b/source/blender/makesrna/intern/rna_actuator.c index 1f501a211f1..ac39581ca9a 100644 --- a/source/blender/makesrna/intern/rna_actuator.c +++ b/source/blender/makesrna/intern/rna_actuator.c @@ -1923,10 +1923,10 @@ static void rna_def_steering_actuator(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Acceleration", "Max acceleration"); RNA_def_property_update(prop, NC_LOGIC, NULL); - prop= RNA_def_property(srna, "turnspeed", PROP_FLOAT, PROP_NONE); + prop= RNA_def_property(srna, "turn_speed", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "turnspeed"); RNA_def_property_range(prop, 0.0, 720.0); - RNA_def_property_ui_text(prop, "Turn speed", "Max turn speed"); + RNA_def_property_ui_text(prop, "Turn Speed", "Max turn speed"); RNA_def_property_update(prop, NC_LOGIC, NULL); prop= RNA_def_property(srna, "distance", PROP_FLOAT, PROP_NONE); @@ -1942,17 +1942,17 @@ static void rna_def_steering_actuator(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Target Object", "Set target object"); RNA_def_property_update(prop, NC_LOGIC, NULL); - prop= RNA_def_property(srna, "selfterminated", PROP_BOOLEAN, PROP_NONE); + prop= RNA_def_property(srna, "self_terminated", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_STEERING_SELFTERMINATED); - RNA_def_property_ui_text(prop, "Self terminated", "Terminate when target is reached"); + RNA_def_property_ui_text(prop, "Self Terminated", "Terminate when target is reached"); RNA_def_property_update(prop, NC_LOGIC, NULL); - prop= RNA_def_property(srna, "enablevisualization", PROP_BOOLEAN, PROP_NONE); + prop= RNA_def_property(srna, "show_visualization", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_STEERING_ENABLEVISUALIZATION); RNA_def_property_ui_text(prop, "Visualize", "Enable debug visualization"); RNA_def_property_update(prop, NC_LOGIC, NULL); - prop= RNA_def_property(srna, "updateperiod", PROP_INT, PROP_NONE); + prop= RNA_def_property(srna, "update_period", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "updateTime"); RNA_def_property_ui_range(prop, -1, 100000, 1, 1); RNA_def_property_ui_text(prop, "Update period", "Path update period"); @@ -1971,13 +1971,13 @@ static void rna_def_steering_actuator(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Facing", "Enable automatic facing"); RNA_def_property_update(prop, NC_LOGIC, NULL); - prop= RNA_def_property(srna, "facingaxis", PROP_ENUM, PROP_NONE); + prop= RNA_def_property(srna, "facing_axis", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "facingaxis"); RNA_def_property_enum_items(prop, facingaxis_items); RNA_def_property_ui_text(prop, "Axis", "Axis for automatic facing"); RNA_def_property_update(prop, NC_LOGIC, NULL); - prop= RNA_def_property(srna, "normalup", PROP_BOOLEAN, PROP_NONE); + prop= RNA_def_property(srna, "normal_up", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_STEERING_NORMALUP); RNA_def_property_ui_text(prop, "N", "Use normal of the navmesh to set \"UP\" vector"); RNA_def_property_update(prop, NC_LOGIC, NULL); diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 28af92eb745..8b5b36f93d3 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -1519,70 +1519,83 @@ static void rna_def_scene_game_recast_data(BlenderRNA *brna) RNA_def_struct_nested(brna, srna, "Scene"); RNA_def_struct_ui_text(srna, "Recast Data", "Recast data for a Game datablock"); - prop= RNA_def_property(srna, "cellsize", PROP_FLOAT, PROP_NONE); + prop= RNA_def_property(srna, "cell_size", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "cellsize"); RNA_def_property_ui_range(prop, 0.1, 1, 0.01, 2); - RNA_def_property_ui_text(prop, "Cell size", "Rasterized cell size"); + RNA_def_property_ui_text(prop, "Cell Size", "Rasterized cell size"); RNA_def_property_update(prop, NC_SCENE, NULL); - prop= RNA_def_property(srna, "cellheight", PROP_FLOAT, PROP_NONE); + prop= RNA_def_property(srna, "cell_height", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "cellheight"); RNA_def_property_ui_range(prop, 0.1, 1, 0.01, 2); - RNA_def_property_ui_text(prop, "Cell height", "Rasterized cell height"); + RNA_def_property_ui_text(prop, "Cell Height", "Rasterized cell height"); RNA_def_property_update(prop, NC_SCENE, NULL); - prop= RNA_def_property(srna, "agentheight", PROP_FLOAT, PROP_NONE); + prop= RNA_def_property(srna, "agent_height", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "agentheight"); RNA_def_property_ui_range(prop, 0.1, 5, 0.1, 2); - RNA_def_property_ui_text(prop, "Agent height", "Minimum height where the agent can still walk"); + RNA_def_property_ui_text(prop, "Agent Height", "Minimum height where the agent can still walk"); RNA_def_property_update(prop, NC_SCENE, NULL); - prop= RNA_def_property(srna, "agentradius", PROP_FLOAT, PROP_NONE); + prop= RNA_def_property(srna, "agent_radius", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "agentradius"); RNA_def_property_ui_range(prop, 0.1, 5, 0.1, 2); - RNA_def_property_ui_text(prop, "Agent radius", "Radius of the agent"); + RNA_def_property_ui_text(prop, "Agent Radius", "Radius of the agent"); RNA_def_property_update(prop, NC_SCENE, NULL); - prop= RNA_def_property(srna, "agentmaxclimb", PROP_FLOAT, PROP_NONE); + prop= RNA_def_property(srna, "max_climb", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "agentmaxclimb"); RNA_def_property_ui_range(prop, 0.1, 5, 0.1, 2); - RNA_def_property_ui_text(prop, "Max climb", "Maximum height between grid cells the agent can climb"); + RNA_def_property_ui_text(prop, "Max Climb", "Maximum height between grid cells the agent can climb"); RNA_def_property_update(prop, NC_SCENE, NULL); - prop= RNA_def_property(srna, "agentmaxslope", PROP_FLOAT, PROP_ANGLE); + prop= RNA_def_property(srna, "max_slope", PROP_FLOAT, PROP_ANGLE); + RNA_def_property_float_sdna(prop, NULL, "agentmaxslope"); RNA_def_property_range(prop, 0, M_PI/2); - RNA_def_property_ui_text(prop, "Max slope", "Maximum walkable slope angle in degrees"); + RNA_def_property_ui_text(prop, "Max Slope", "Maximum walkable slope angle in degrees"); RNA_def_property_update(prop, NC_SCENE, NULL); - prop= RNA_def_property(srna, "regionminsize", PROP_FLOAT, PROP_NONE); + prop= RNA_def_property(srna, "region_min_size", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "regionminsize"); RNA_def_property_ui_range(prop, 0, 150, 1, 2); - RNA_def_property_ui_text(prop, "Min region size", "Minimum regions size. Smaller regions will be deleted"); + RNA_def_property_ui_text(prop, "Min Region Size", "Minimum regions size. Smaller regions will be deleted"); RNA_def_property_update(prop, NC_SCENE, NULL); - prop= RNA_def_property(srna, "regionmergesize", PROP_FLOAT, PROP_NONE); + prop= RNA_def_property(srna, "region_merge_size", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "regionmergesize"); RNA_def_property_ui_range(prop, 0, 150, 1, 2); - RNA_def_property_ui_text(prop, "Merged region size", "Minimum regions size. Smaller regions will be merged"); + RNA_def_property_ui_text(prop, "Merged Region Size", "Minimum regions size. Smaller regions will be merged"); RNA_def_property_update(prop, NC_SCENE, NULL); - prop= RNA_def_property(srna, "edgemaxlen", PROP_FLOAT, PROP_NONE); + prop= RNA_def_property(srna, "edge_max_len", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "edgemaxlen"); RNA_def_property_ui_range(prop, 0, 50, 1, 2); - RNA_def_property_ui_text(prop, "Max edge length", "Maximum contour edge length"); + RNA_def_property_ui_text(prop, "Max Edge Length", "Maximum contour edge length"); RNA_def_property_update(prop, NC_SCENE, NULL); - prop= RNA_def_property(srna, "edgemaxerror", PROP_FLOAT, PROP_NONE); + prop= RNA_def_property(srna, "edge_max_error", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "edgemaxerror"); RNA_def_property_ui_range(prop, 0.1, 3.0, 0.1, 2); - RNA_def_property_ui_text(prop, "Max edge error", "Maximum distance error from contour to cells"); + RNA_def_property_ui_text(prop, "Max Edge Error", "Maximum distance error from contour to cells"); RNA_def_property_update(prop, NC_SCENE, NULL); - prop= RNA_def_property(srna, "vertsperpoly", PROP_INT, PROP_NONE); + prop= RNA_def_property(srna, "verts_per_poly", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "vertsperpoly"); RNA_def_property_ui_range(prop, 3, 12, 1, 0); - RNA_def_property_ui_text(prop, "Verts per poly", "Max number of vertices per polygon"); + RNA_def_property_ui_text(prop, "Verts Per Poly", "Max number of vertices per polygon"); RNA_def_property_update(prop, NC_SCENE, NULL); - prop= RNA_def_property(srna, "detailsampledist", PROP_FLOAT, PROP_NONE); + prop= RNA_def_property(srna, "sample_dist", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "detailsampledist"); RNA_def_property_ui_range(prop, 0.0, 16.0, 1, 2); - RNA_def_property_ui_text(prop, "Sample distance", "Detail mesh sample spacing"); + RNA_def_property_ui_text(prop, "Sample Distance", "Detail mesh sample spacing"); RNA_def_property_update(prop, NC_SCENE, NULL); - prop= RNA_def_property(srna, "detailsamplemaxerror", PROP_FLOAT, PROP_NONE); + prop= RNA_def_property(srna, "sample_max_error", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "detailsamplemaxerror"); RNA_def_property_ui_range(prop, 0.0, 16.0, 1, 2); - RNA_def_property_ui_text(prop, "Max sample error", "Detail mesh simplification max sample error"); + RNA_def_property_ui_text(prop, "Max Sample Error", "Detail mesh simplification max sample error"); RNA_def_property_update(prop, NC_SCENE, NULL); } From 9de407f13f2e628f67dbcda252febebac6307293 Mon Sep 17 00:00:00 2001 From: Benoit Bolsee Date: Tue, 7 Jun 2011 20:34:23 +0000 Subject: [PATCH 046/182] sync addons and tests with trunks --- source/tests/CMakeLists.txt | 293 ++++++++++++++++++++++++++++ source/tests/batch_import.py | 202 ++++++++++++++++++++ source/tests/bl_load_addons.py | 78 ++++++++ source/tests/bl_load_py_modules.py | 145 ++++++++++++++ source/tests/bl_run_operators.py | 176 +++++++++++++++++ source/tests/bl_test.py | 197 +++++++++++++++++++ source/tests/pep8.py | 118 ++++++++++++ source/tests/rna_array.py | 297 +++++++++++++++++++++++++++++ source/tests/rna_info_dump.py | 131 +++++++++++++ 9 files changed, 1637 insertions(+) create mode 100644 source/tests/CMakeLists.txt create mode 100644 source/tests/batch_import.py create mode 100644 source/tests/bl_load_addons.py create mode 100644 source/tests/bl_load_py_modules.py create mode 100644 source/tests/bl_run_operators.py create mode 100644 source/tests/bl_test.py create mode 100644 source/tests/pep8.py create mode 100644 source/tests/rna_array.py create mode 100644 source/tests/rna_info_dump.py diff --git a/source/tests/CMakeLists.txt b/source/tests/CMakeLists.txt new file mode 100644 index 00000000000..7abac7b9739 --- /dev/null +++ b/source/tests/CMakeLists.txt @@ -0,0 +1,293 @@ +# -*- mode: cmake; indent-tabs-mode: t; -*- +# $Id: CMakeLists.txt 34198 2011-01-09 15:12:08Z campbellbarton $ +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# Contributor(s): Jacques Beaurain. +# +# ***** END GPL LICENSE BLOCK ***** + +# --env-system-scripts allows to run without the install target. + +# Use '--write-blend=/tmp/test.blend' to view output + + +set(TEST_SRC_DIR ${CMAKE_SOURCE_DIR}/../lib/tests) +set(TEST_OUT_DIR ${CMAKE_BINARY_DIR}/tests) + +# ugh, any better way to do this on testing only? +execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${TEST_OUT_DIR}) + +#~ if(NOT IS_DIRECTORY ${TEST_SRC_DIR}) +#~ message(FATAL_ERROR "CMake test directory not found!") +#~ endif() + +# all calls to blender use this +if(APPLE) + set(TEST_BLENDER_EXE ${EXECUTABLE_OUTPUT_PATH}/blender.app/Contents/MacOS/blender) +else() + set(TEST_BLENDER_EXE ${EXECUTABLE_OUTPUT_PATH}/blender) +endif() + +# for testing with valgrind prefix: valgrind --track-origins=yes --error-limit=no +set(TEST_BLENDER_EXE ${TEST_BLENDER_EXE} --background --factory-startup --env-system-scripts ${CMAKE_SOURCE_DIR}/release/scripts) + + +# ------------------------------------------------------------------------------ +# GENERAL PYTHON CORRECTNESS TESTS +add_test(script_load_addons ${TEST_BLENDER_EXE} + --python ${CMAKE_CURRENT_LIST_DIR}/bl_load_addons.py +) + +add_test(script_load_modules ${TEST_BLENDER_EXE} + --python ${CMAKE_CURRENT_LIST_DIR}/bl_load_py_modules.py +) + +# test running operators doesn't segfault under various conditions +add_test(script_run_operators ${TEST_BLENDER_EXE} + --python ${CMAKE_CURRENT_LIST_DIR}/bl_run_operators.py +) + +# ------------------------------------------------------------------------------ +# IO TESTS + +# OBJ Import tests +add_test(import_obj_cube ${TEST_BLENDER_EXE} + --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py -- + --run={'FINISHED'}&bpy.ops.import_scene.obj\(filepath='${TEST_SRC_DIR}/io_tests/obj/cube.obj'\) + --md5=39cce4bacac2d1b18fc470380279bc15 --md5_method=SCENE + --write-blend=${TEST_OUT_DIR}/import_obj_cube.blend +) + +add_test(import_obj_nurbs_cyclic ${TEST_BLENDER_EXE} + --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py -- + --run={'FINISHED'}&bpy.ops.import_scene.obj\(filepath='${TEST_SRC_DIR}/io_tests/obj/nurbs_cyclic.obj'\) + --md5=ad3c307e5883224a0492378cd32691ab --md5_method=SCENE + --write-blend=${TEST_OUT_DIR}/import_obj_nurbs_cyclic.blend +) + +add_test(import_obj_makehuman ${TEST_BLENDER_EXE} + --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py -- + --run={'FINISHED'}&bpy.ops.import_scene.obj\(filepath='${TEST_SRC_DIR}/io_tests/obj/makehuman.obj'\) + --md5=c9f78b185e58358daa4ecaecfa75464e --md5_method=SCENE + --write-blend=${TEST_OUT_DIR}/import_obj_makehuman.blend +) + +# OBJ Export tests +add_test(export_obj_cube ${TEST_BLENDER_EXE} + ${TEST_SRC_DIR}/io_tests/blend_geometry/all_quads.blend + --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py -- + --run={'FINISHED'}&bpy.ops.export_scene.obj\(filepath='${TEST_OUT_DIR}/export_obj_cube.obj',use_selection=False\) + --md5_source=${TEST_OUT_DIR}/export_obj_cube.obj + --md5_source=${TEST_OUT_DIR}/export_obj_cube.mtl + --md5=70bdc394c2726203ad26c085176e3484 --md5_method=FILE +) + +add_test(export_obj_nurbs ${TEST_BLENDER_EXE} + ${TEST_SRC_DIR}/io_tests/blend_geometry/nurbs.blend + --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py -- + --run={'FINISHED'}&bpy.ops.export_scene.obj\(filepath='${TEST_OUT_DIR}/export_obj_nurbs.obj',use_selection=False,use_nurbs=True\) + --md5_source=${TEST_OUT_DIR}/export_obj_nurbs.obj + --md5_source=${TEST_OUT_DIR}/export_obj_nurbs.mtl + --md5=a733ae4fa4a591ea9b0912da3af042de --md5_method=FILE +) + +add_test(export_obj_all_objects ${TEST_BLENDER_EXE} + ${TEST_SRC_DIR}/io_tests/blend_scene/all_objects.blend + --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py -- + --run={'FINISHED'}&bpy.ops.export_scene.obj\(filepath='${TEST_OUT_DIR}/export_obj_all_objects.obj',use_selection=False,use_nurbs=True\) + --md5_source=${TEST_OUT_DIR}/export_obj_all_objects.obj + --md5_source=${TEST_OUT_DIR}/export_obj_all_objects.mtl + --md5=d06bd49e6c084e4e3348fa397a88790c --md5_method=FILE +) + + + +# PLY Import tests +add_test(import_ply_cube ${TEST_BLENDER_EXE} + --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py -- + --run={'FINISHED'}&bpy.ops.import_mesh.ply\(filepath='${TEST_SRC_DIR}/io_tests/ply/cube_ascii.ply'\) + --md5=527134343c27fc0ea73115b85fbfd3ac --md5_method=SCENE + --write-blend=${TEST_OUT_DIR}/import_ply_cube.blend +) + +add_test(import_ply_bunny ${TEST_BLENDER_EXE} + --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py -- + --run={'FINISHED'}&bpy.ops.import_mesh.ply\(filepath='${TEST_SRC_DIR}/io_tests/ply/bunny2.ply'\) + --md5=6ea5b8533400a17accf928b8fd024eaa --md5_method=SCENE + --write-blend=${TEST_OUT_DIR}/import_ply_bunny.blend +) + +add_test(import_ply_small_holes ${TEST_BLENDER_EXE} + --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py -- + --run={'FINISHED'}&bpy.ops.import_mesh.ply\(filepath='${TEST_SRC_DIR}/io_tests/ply/many_small_holes.ply'\) + --md5=c3093e26ecae5b6d59fbbcf2a0d0b39f --md5_method=SCENE + --write-blend=${TEST_OUT_DIR}/import_ply_small_holes.blend +) + +# PLY Export tests (TODO) + + + +# STL Import tests +add_test(import_stl_cube ${TEST_BLENDER_EXE} + --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py -- + --run={'FINISHED'}&bpy.ops.import_mesh.stl\(filepath='${TEST_SRC_DIR}/io_tests/stl/cube.stl'\) + --md5=8ceb5bb7e1cb5f4342fa1669988c66b4 --md5_method=SCENE + --write-blend=${TEST_OUT_DIR}/import_stl_cube.blend +) + +add_test(import_stl_conrod ${TEST_BLENDER_EXE} + --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py -- + --run={'FINISHED'}&bpy.ops.import_mesh.stl\(filepath='${TEST_SRC_DIR}/io_tests/stl/conrod.stl'\) + --md5=690a4b8eb9002dcd8631c5a575ea7348 --md5_method=SCENE + --write-blend=${TEST_OUT_DIR}/import_stl_conrod.blend +) + +add_test(import_stl_knot_max_simplified ${TEST_BLENDER_EXE} + --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py -- + --run={'FINISHED'}&bpy.ops.import_mesh.stl\(filepath='${TEST_SRC_DIR}/io_tests/stl/knot_max_simplified.stl'\) + --md5=baf82803f45a84ec4ddbad9cef57dd3e --md5_method=SCENE + --write-blend=${TEST_OUT_DIR}/import_stl_knot_max_simplified.blend +) + +# STL Export tests (TODO) + + + +# X3D Import +add_test(import_x3d_cube ${TEST_BLENDER_EXE} + --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py -- + --run={'FINISHED'}&bpy.ops.import_scene.x3d\(filepath='${TEST_SRC_DIR}/io_tests/x3d/color_cube.x3d'\) + --md5=2ed64325dd3d62be6ce43c64219376ec --md5_method=SCENE + --write-blend=${TEST_OUT_DIR}/import_x3d_cube.blend +) + +add_test(import_x3d_teapot ${TEST_BLENDER_EXE} + --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py -- + --run={'FINISHED'}&bpy.ops.import_scene.x3d\(filepath='${TEST_SRC_DIR}/io_tests/x3d/teapot.x3d'\) + --md5=8b8b386900b8e3d2c036a38c625f4079 --md5_method=SCENE + --write-blend=${TEST_OUT_DIR}/import_x3d_teapot.blend +) + +add_test(import_x3d_suzanne_material ${TEST_BLENDER_EXE} + --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py -- + --run={'FINISHED'}&bpy.ops.import_scene.x3d\(filepath='${TEST_SRC_DIR}/io_tests/x3d/suzanne_material.x3d'\) + --md5=999129ba835f0ccb98c4bb299f6c2fef --md5_method=SCENE + --write-blend=${TEST_OUT_DIR}/import_x3d_suzanne_material.blend +) + +# X3D Export +add_test(export_x3d_cube ${TEST_BLENDER_EXE} + ${TEST_SRC_DIR}/io_tests/blend_geometry/all_quads.blend + --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py -- + --run={'FINISHED'}&bpy.ops.export_scene.x3d\(filepath='${TEST_OUT_DIR}/export_x3d_cube.x3d',use_selection=False\) + --md5_source=${TEST_OUT_DIR}/export_x3d_cube.x3d + --md5=30d2b056c004144cd4a0d172484a66f3 --md5_method=FILE +) + +add_test(export_x3d_nurbs ${TEST_BLENDER_EXE} + ${TEST_SRC_DIR}/io_tests/blend_geometry/nurbs.blend + --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py -- + --run={'FINISHED'}&bpy.ops.export_scene.x3d\(filepath='${TEST_OUT_DIR}/export_x3d_nurbs.x3d',use_selection=False\) + --md5_source=${TEST_OUT_DIR}/export_x3d_nurbs.x3d + --md5=7c15afe7b0cf007b842a925508b7d966 --md5_method=FILE +) + +add_test(export_x3d_all_objects ${TEST_BLENDER_EXE} + ${TEST_SRC_DIR}/io_tests/blend_scene/all_objects.blend + --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py -- + --run={'FINISHED'}&bpy.ops.export_scene.x3d\(filepath='${TEST_OUT_DIR}/export_x3d_all_objects.x3d',use_selection=False\) + --md5_source=${TEST_OUT_DIR}/export_x3d_all_objects.x3d + --md5=cef017805f684f27c311fdf4ba87462a --md5_method=FILE +) + + + +# 3DS Import +add_test(import_3ds_cube ${TEST_BLENDER_EXE} + --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py -- + --run={'FINISHED'}&bpy.ops.import_scene.autodesk_3ds\(filepath='${TEST_SRC_DIR}/io_tests/3ds/cube.3ds'\) + --md5=cb5a45c35a343c3f5beca2a918472951 --md5_method=SCENE + --write-blend=${TEST_OUT_DIR}/import_3ds_cube.blend +) + +add_test(import_3ds_hierarchy_lara ${TEST_BLENDER_EXE} + --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py -- + --run={'FINISHED'}&bpy.ops.import_scene.autodesk_3ds\(filepath='${TEST_SRC_DIR}/io_tests/3ds/hierarchy_lara.3ds'\) + --md5=766c873d9fdb5f190e43796cfbae63b6 --md5_method=SCENE + --write-blend=${TEST_OUT_DIR}/import_3ds_hierarchy_lara.blend +) + +add_test(import_3ds_hierarchy_greek_trireme ${TEST_BLENDER_EXE} + --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py -- + --run={'FINISHED'}&bpy.ops.import_scene.autodesk_3ds\(filepath='${TEST_SRC_DIR}/io_tests/3ds/hierarchy_greek_trireme.3ds'\) + --md5=b62ee30101e8999cb91ef4f8a8760056 --md5_method=SCENE + --write-blend=${TEST_OUT_DIR}/import_3ds_hierarchy_greek_trireme.blend +) + +# 3DS Export +add_test(export_3ds_cube ${TEST_BLENDER_EXE} + ${TEST_SRC_DIR}/io_tests/blend_geometry/all_quads.blend + --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py -- + --run={'FINISHED'}&bpy.ops.export_scene.autodesk_3ds\(filepath='${TEST_OUT_DIR}/export_3ds_cube.3ds',use_selection=False\) + --md5_source=${TEST_OUT_DIR}/export_3ds_cube.3ds + --md5=0df6cfb130052d01e31ef77d391d4cc0 --md5_method=FILE +) + +add_test(export_3ds_nurbs ${TEST_BLENDER_EXE} + ${TEST_SRC_DIR}/io_tests/blend_geometry/nurbs.blend + --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py -- + --run={'FINISHED'}&bpy.ops.export_scene.autodesk_3ds\(filepath='${TEST_OUT_DIR}/export_3ds_nurbs.3ds',use_selection=False\) + --md5_source=${TEST_OUT_DIR}/export_3ds_nurbs.3ds + --md5=ba1a6d43346fee3bcadc7e30e3c95935 --md5_method=FILE +) + +add_test(export_3ds_all_objects ${TEST_BLENDER_EXE} + ${TEST_SRC_DIR}/io_tests/blend_scene/all_objects.blend + --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py -- + --run={'FINISHED'}&bpy.ops.export_scene.autodesk_3ds\(filepath='${TEST_OUT_DIR}/export_3ds_all_objects.3ds',use_selection=False\) + --md5_source=${TEST_OUT_DIR}/export_3ds_all_objects.3ds + --md5=cdf8fa8475fda0b9ef565ac09339254b --md5_method=FILE +) + + + +# FBX Export +# 'use_metadata=False' for reliable md5's +add_test(export_fbx_cube ${TEST_BLENDER_EXE} + ${TEST_SRC_DIR}/io_tests/blend_geometry/all_quads.blend + --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py -- + --run={'FINISHED'}&bpy.ops.export_scene.fbx\(filepath='${TEST_OUT_DIR}/export_fbx_cube.fbx',use_selection=False,use_metadata=False\) + --md5_source=${TEST_OUT_DIR}/export_fbx_cube.fbx + --md5=642a5a1fa199d5b9bbf1643519ae974d --md5_method=FILE +) + +add_test(export_fbx_nurbs ${TEST_BLENDER_EXE} + ${TEST_SRC_DIR}/io_tests/blend_geometry/nurbs.blend + --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py -- + --run={'FINISHED'}&bpy.ops.export_scene.fbx\(filepath='${TEST_OUT_DIR}/export_fbx_nurbs.fbx',use_selection=False,use_metadata=False\) + --md5_source=${TEST_OUT_DIR}/export_fbx_nurbs.fbx + --md5=ec1e8965bdbc3bf70707d77f82c2cb9c --md5_method=FILE +) + +add_test(export_fbx_all_objects ${TEST_BLENDER_EXE} + ${TEST_SRC_DIR}/io_tests/blend_scene/all_objects.blend + --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py -- + --run={'FINISHED'}&bpy.ops.export_scene.fbx\(filepath='${TEST_OUT_DIR}/export_fbx_all_objects.fbx',use_selection=False,use_metadata=False\) + --md5_source=${TEST_OUT_DIR}/export_fbx_all_objects.fbx + --md5=af3b65665687ac92e4aba07b017d87fe --md5_method=FILE +) diff --git a/source/tests/batch_import.py b/source/tests/batch_import.py new file mode 100644 index 00000000000..5c228c014ca --- /dev/null +++ b/source/tests/batch_import.py @@ -0,0 +1,202 @@ +# ##### BEGIN GPL LICENSE BLOCK ##### +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# ##### END GPL LICENSE BLOCK ##### + +# + +""" +Example Usage: + +./blender.bin --background --python source/tests/batch_import.py -- \ + --operator="bpy.ops.import_scene.obj" \ + --path="/fe/obj" \ + --match="*.obj" \ + --start=0 --end=10 \ + --save_path=/tmp/test + +./blender.bin --background --python source/tests/batch_import.py -- \ + --operator="bpy.ops.import_scene.autodesk_3ds" \ + --path="/fe/" \ + --match="*.3ds" \ + --start=0 --end=1000 \ + --save_path=/tmp/test + +./blender.bin --background --addons io_curve_svg --python source/tests/batch_import.py -- \ + --operator="bpy.ops.import_curve.svg" \ + --path="/usr/" \ + --match="*.svg" \ + --start=0 --end=1000 \ + --save_path=/tmp/test + +""" + +import os +import sys + + +def clear_scene(): + import bpy + unique_obs = set() + for scene in bpy.data.scenes: + for obj in scene.objects[:]: + scene.objects.unlink(obj) + unique_obs.add(obj) + + # remove obdata, for now only worry about the startup scene + for bpy_data_iter in (bpy.data.objects, bpy.data.meshes, bpy.data.lamps, bpy.data.cameras): + for id_data in bpy_data_iter: + bpy_data_iter.remove(id_data) + + +def batch_import(operator="", + path="", + save_path="", + match="", + start=0, + end=sys.maxsize, + ): + import addon_utils + _reset_all = addon_utils.reset_all # XXX, hack + + import fnmatch + + path = os.path.normpath(path) + path = os.path.abspath(path) + + match_upper = match.upper() + pattern_match = lambda a: fnmatch.fnmatchcase(a.upper(), match_upper) + + def file_generator(path): + for dirpath, dirnames, filenames in os.walk(path): + + # skip '.svn' + if dirpath.startswith("."): + continue + + for filename in filenames: + if pattern_match(filename): + yield os.path.join(dirpath, filename) + + print("Collecting %r files in %s" % (match, path), end="") + + files = list(file_generator(path)) + files_len = len(files) + end = min(end, len(files)) + print(" found %d" % files_len, end="") + + files.sort() + files = files[start:end] + if len(files) != files_len: + print(" using a subset in (%d, %d), total %d" % (start, end, len(files)), end="") + + import bpy + op = eval(operator) + + tot_done = 0 + tot_fail = 0 + + for i, f in enumerate(files): + print(" %s(filepath=%r) # %d of %d" % (operator, f, i + start, len(files))) + + # hack so loading the new file doesnt undo our loaded addons + addon_utils.reset_all = lambda: None # XXX, hack + + bpy.ops.wm.read_factory_settings() + + addon_utils.reset_all = _reset_all # XXX, hack + clear_scene() + + result = op(filepath=f) + + if 'FINISHED' in result: + tot_done += 1 + else: + tot_fail += 1 + + if save_path: + fout = os.path.join(save_path, os.path.relpath(f, path)) + fout_blend = os.path.splitext(fout)[0] + ".blend" + + print("\tSaving: %r" % fout_blend) + + fout_dir = os.path.dirname(fout_blend) + if not os.path.exists(fout_dir): + os.makedirs(fout_dir) + + bpy.ops.wm.save_as_mainfile(filepath=fout_blend) + + print("finished, done:%d, fail:%d" % (tot_done, tot_fail)) + + +def main(): + import optparse + + # get the args passed to blender after "--", all of which are ignored by blender specifically + # so python may receive its own arguments + argv = sys.argv + + if "--" not in argv: + argv = [] # as if no args are passed + else: + argv = argv[argv.index("--") + 1:] # get all args after "--" + + # When --help or no args are given, print this help + usage_text = "Run blender in background mode with this script:" + usage_text += " blender --background --python " + __file__ + " -- [options]" + + parser = optparse.OptionParser(usage=usage_text) + + # Example background utility, add some text and renders or saves it (with options) + # Possible types are: string, int, long, choice, float and complex. + parser.add_option("-o", "--operator", dest="operator", help="This text will be used to render an image", type="string") + parser.add_option("-p", "--path", dest="path", help="Path to use for searching for files", type='string') + parser.add_option("-m", "--match", dest="match", help="Wildcard to match filename", type="string") + parser.add_option("-s", "--save_path", dest="save_path", help="Save the input file to a blend file in a new location", metavar='string') + parser.add_option("-S", "--start", dest="start", help="From collected files, start with this index", metavar='int') + parser.add_option("-E", "--end", dest="end", help="From collected files, end with this index", metavar='int') + + options, args = parser.parse_args(argv) # In this example we wont use the args + + if not argv: + parser.print_help() + return + + if not options.operator: + print("Error: --operator=\"some string\" argument not given, aborting.") + parser.print_help() + return + + if options.start is None: + options.start = 0 + + if options.end is None: + options.end = sys.maxsize + + # Run the example function + batch_import(operator=options.operator, + path=options.path, + save_path=options.save_path, + match=options.match, + start=int(options.start), + end=int(options.end), + ) + + print("batch job finished, exiting") + + +if __name__ == "__main__": + main() diff --git a/source/tests/bl_load_addons.py b/source/tests/bl_load_addons.py new file mode 100644 index 00000000000..5bd83abbcb6 --- /dev/null +++ b/source/tests/bl_load_addons.py @@ -0,0 +1,78 @@ +# ##### BEGIN GPL LICENSE BLOCK ##### +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# ##### END GPL LICENSE BLOCK ##### + +# + +# simple script to enable all addons, and disable + +import bpy +import addon_utils + +import sys +import imp + + +def reload_addons(do_reload=True, do_reverse=True): + modules = addon_utils.modules({}) + modules.sort(key=lambda mod: mod.__name__) + addons = bpy.context.user_preferences.addons + + # first disable all + for mod_name in list(addons.keys()): + addon_utils.disable(mod_name) + + assert(bool(addons) == False) + + # Run twice each time. + for i in (0, 1): + for mod in modules: + mod_name = mod.__name__ + print("\tenabling:", mod_name) + addon_utils.enable(mod_name) + assert(mod_name in addons) + + for mod in addon_utils.modules({}): + mod_name = mod.__name__ + print("\tdisabling:", mod_name) + addon_utils.disable(mod_name) + assert(not (mod_name in addons)) + + # now test reloading + if do_reload: + imp.reload(sys.modules[mod_name]) + + if do_reverse: + # incase order matters when it shouldnt + modules.reverse() + + +def main(): + reload_addons(do_reload=False, do_reverse=False) + reload_addons(do_reload=False, do_reverse=True) + reload_addons(do_reload=True, do_reverse=True) + + +if __name__ == "__main__": + + # So a python error exits(1) + try: + main() + except: + import traceback + traceback.print_exc() + sys.exit(1) diff --git a/source/tests/bl_load_py_modules.py b/source/tests/bl_load_py_modules.py new file mode 100644 index 00000000000..5a65578d8d3 --- /dev/null +++ b/source/tests/bl_load_py_modules.py @@ -0,0 +1,145 @@ +# ##### BEGIN GPL LICENSE BLOCK ##### +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# ##### END GPL LICENSE BLOCK ##### + +# + +# simple script to enable all addons, and disable + +import bpy +import addon_utils + +import sys +import os +import imp + + +def source_list(path, filename_check=None): + from os.path import join + for dirpath, dirnames, filenames in os.walk(path): + # skip '.svn' + if dirpath.startswith("."): + continue + + for filename in filenames: + filepath = join(dirpath, filename) + if filename_check is None or filename_check(filepath): + yield filepath + + +def load_addons(): + modules = addon_utils.modules({}) + modules.sort(key=lambda mod: mod.__name__) + addons = bpy.context.user_preferences.addons + + # first disable all + for mod_name in list(addons.keys()): + addon_utils.disable(mod_name) + + assert(bool(addons) == False) + + for mod in modules: + mod_name = mod.__name__ + addon_utils.enable(mod_name) + assert(mod_name in addons) + + +def load_modules(): + modules = [] + module_paths = [] + + # paths blender stores scripts in. + paths = bpy.utils.script_paths() + + # + # find all sys.path we added + for script_path in paths: + for mod_dir in sys.path: + if mod_dir.startswith(script_path): + module_paths.append(mod_dir) + + # + # collect modules from our paths. + for mod_dir in module_paths: + # print("mod_dir", mod_dir) + for mod, mod_full in bpy.path.module_names(mod_dir): + modules.append(__import__(mod)) + + # + # now submodules + for m in modules: + filepath = m.__file__ + if os.path.basename(filepath).startswith("__init__."): + mod_dir = os.path.dirname(filepath) + for submod, submod_full in bpy.path.module_names(mod_dir): + # fromlist is ignored, ugh. + mod_name_full = m.__name__ + "." + submod + __import__(mod_name_full) + mod_imp = sys.modules[mod_name_full] + + # check we load what we ask for. + assert(os.path.samefile(mod_imp.__file__, submod_full)) + + modules.append(mod_imp) + + # + # check which filepaths we didnt load + source_files = [] + for mod_dir in module_paths: + source_files.extend(source_list(mod_dir, filename_check=lambda f: f.endswith(".py"))) + + source_files = list(set(source_files)) + source_files.sort() + + # + # remove loaded files + loaded_files = list({m.__file__ for m in modules}) + loaded_files.sort() + + for f in loaded_files: + source_files.remove(f) + + # + # test we tested all files except for presets and templates + ignore_paths = [ + os.sep + "presets" + os.sep, + os.sep + "templates" + os.sep, + ] + + for f in source_files: + ok = False + for ignore in ignore_paths: + if ignore in f: + ok = True + if not ok: + raise Exception("Source file %r not loaded in test" % f) + + print("loaded %d modules" % len(loaded_files)) + + +def main(): + load_addons() + load_modules() + +if __name__ == "__main__": + # So a python error exits(1) + try: + main() + except: + import traceback + traceback.print_exc() + sys.exit(1) diff --git a/source/tests/bl_run_operators.py b/source/tests/bl_run_operators.py new file mode 100644 index 00000000000..668b4e69228 --- /dev/null +++ b/source/tests/bl_run_operators.py @@ -0,0 +1,176 @@ +# ##### BEGIN GPL LICENSE BLOCK ##### +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# ##### END GPL LICENSE BLOCK ##### + +# + +# semi-useful script, runs all operators in a number of different +# contexts, cheap way to find misc small bugs but is in no way a complete test. +# +# only error checked for here is a segfault. + +import bpy +import sys + +op_blacklist = ( + "script.reload", + "export*.*", + "import*.*", + "*.save_*", + "*.read_*", + "*.open_*", + "*.link_append", + "render.render", + "*.*_export", + "*.*_import", + "wm.url_open", + "wm.doc_view", + "wm.path_open", + "help.operator_cheat_sheet", + ) + + +def filter_op_list(operators): + from fnmatch import fnmatchcase + + def is_op_ok(op): + for op_match in op_blacklist: + if fnmatchcase(op, op_match): + print(" skipping: %s (%s)" % (op, op_match)) + return False + return True + + operators[:] = [op for op in operators if is_op_ok(op[0])] + + +def run_ops(operators, setup_func=None): + print("\ncontext:", setup_func.__name__) + # first invoke + for op_id, op in operators: + if op.poll(): + print(" operator:", op_id) + sys.stdout.flush() # incase of crash + + # disable will get blender in a bad state and crash easy! + bpy.ops.wm.read_factory_settings() + + setup_func() + + for mode in ('EXEC_DEFAULT', 'INVOKE_DEFAULT'): + try: + op(mode) + except: + #import traceback + #traceback.print_exc() + pass + + +# contexts +def ctx_clear_scene(): # copied from batch_import.py + unique_obs = set() + for scene in bpy.data.scenes: + for obj in scene.objects[:]: + scene.objects.unlink(obj) + unique_obs.add(obj) + + # remove obdata, for now only worry about the startup scene + for bpy_data_iter in (bpy.data.objects, bpy.data.meshes, bpy.data.lamps, bpy.data.cameras): + for id_data in bpy_data_iter: + bpy_data_iter.remove(id_data) + + +def ctx_editmode_mesh(): + bpy.ops.object.mode_set(mode='EDIT') + bpy.ops.object.vertex_group_add() + + +def ctx_editmode_curves(): + bpy.ops.curve.primitive_nurbs_circle_add() + bpy.ops.object.mode_set(mode='EDIT') + + +def ctx_editmode_surface(): + bpy.ops.surface.primitive_nurbs_surface_torus_add() + bpy.ops.object.mode_set(mode='EDIT') + + +def ctx_editmode_mball(): + bpy.ops.object.metaball_add() + bpy.ops.object.mode_set(mode='EDIT') + + +def ctx_editmode_text(): + bpy.ops.object.text_add() + bpy.ops.object.mode_set(mode='EDIT') + + +def ctx_editmode_armature(): + bpy.ops.object.armature_add() + bpy.ops.object.mode_set(mode='EDIT') + + +def ctx_editmode_lattice(): + bpy.ops.object.add(type='LATTICE') + bpy.ops.object.mode_set(mode='EDIT') + # bpy.ops.object.vertex_group_add() + + +def ctx_object_empty(): + bpy.ops.object.add(type='EMPTY') + + +def ctx_weightpaint(): + bpy.ops.object.mode_set(mode='WEIGHT_PAINT') + + +def main(): + # bpy.ops.wm.read_factory_settings() + import bpy + operators = [] + for mod_name in dir(bpy.ops): + mod = getattr(bpy.ops, mod_name) + for submod_name in dir(mod): + op = getattr(mod, submod_name) + operators.append(("%s.%s" % (mod_name, submod_name), op)) + + operators.sort(key=lambda op: op[0]) + + filter_op_list(operators) + + # for testing, mix the list up. + #operators.reverse() + + #import random + #random.shuffle(operators) + + # Run the operator tests in different contexts + run_ops(operators, setup_func=lambda: None) + run_ops(operators, setup_func=ctx_editmode_surface) + run_ops(operators, setup_func=ctx_object_empty) + run_ops(operators, setup_func=ctx_editmode_armature) + run_ops(operators, setup_func=ctx_editmode_mesh) + run_ops(operators, setup_func=ctx_clear_scene) + run_ops(operators, setup_func=ctx_editmode_curves) + run_ops(operators, setup_func=ctx_editmode_mball) + run_ops(operators, setup_func=ctx_editmode_text) + run_ops(operators, setup_func=ctx_weightpaint) + run_ops(operators, setup_func=ctx_editmode_lattice) + + print("finished") + +if __name__ == "__main__": + main() diff --git a/source/tests/bl_test.py b/source/tests/bl_test.py new file mode 100644 index 00000000000..cfe91356444 --- /dev/null +++ b/source/tests/bl_test.py @@ -0,0 +1,197 @@ +# ##### BEGIN GPL LICENSE BLOCK ##### +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# ##### END GPL LICENSE BLOCK ##### + +# + +import sys +import os + + +# may split this out into a new file +def replace_bpy_app_version(): + """ So MD5's are predictable from output which uses blenders versions. + """ + + import bpy + + app = bpy.app + app_fake = type(bpy)("bpy.app") + + for attr in dir(app): + if not attr.startswith("_"): + setattr(app_fake, attr, getattr(app, attr)) + + app_fake.version = 0, 0, 0 + app_fake.version_string = "0.00 (sub 0)" + bpy.app = app_fake + + +def clear_startup_blend(): + import bpy + + for scene in bpy.data.scenes: + for obj in scene.objects: + scene.objects.unlink(obj) + + +def blend_to_md5(): + import bpy + scene = bpy.context.scene + ROUND = 4 + + def matrix2str(matrix): + return "".join([str(round(axis, ROUND)) for vector in matrix for axis in vector]).encode('ASCII') + + def coords2str(seq, attr): + return "".join([str(round(axis, ROUND)) for vertex in seq for axis in getattr(vertex, attr)]).encode('ASCII') + + import hashlib + + md5 = hashlib.new("md5") + md5_update = md5.update + + for obj in scene.objects: + md5_update(matrix2str(obj.matrix_world)) + data = obj.data + + if type(data) == bpy.types.Mesh: + md5_update(coords2str(data.vertices, "co")) + elif type(data) == bpy.types.Curve: + for spline in data.splines: + md5_update(coords2str(spline.bezier_points, "co")) + md5_update(coords2str(spline.points, "co")) + + return md5.hexdigest() + + +def main(): + argv = sys.argv + print(" args:", " ".join(argv)) + argv = argv[argv.index("--") + 1:] + + def arg_extract(arg, optional=True, array=False): + arg += "=" + if array: + value = [] + else: + value = None + + i = 0 + while i < len(argv): + if argv[i].startswith(arg): + item = argv[i][len(arg):] + del argv[i] + i -= 1 + + if array: + value.append(item) + else: + value = item + break + + i += 1 + + if (not value) and (not optional): + print(" '%s' not set" % arg) + sys.exit(1) + + return value + + run = arg_extract("--run", optional=False) + md5 = arg_extract("--md5", optional=False) + md5_method = arg_extract("--md5_method", optional=False) # 'SCENE' / 'FILE' + + # only when md5_method is 'FILE' + md5_source = arg_extract("--md5_source", optional=True, array=True) + + # save blend file, for testing + write_blend = arg_extract("--write-blend", optional=True) + + # ensure files are written anew + for f in md5_source: + if os.path.exists(f): + os.remove(f) + + import bpy + + replace_bpy_app_version() + if not bpy.data.filepath: + clear_startup_blend() + + print(" Running: '%s'" % run) + print(" MD5: '%s'!" % md5) + + try: + result = eval(run) + except: + import traceback + traceback.print_exc() + sys.exit(1) + + if write_blend is not None: + print(" Writing Blend: %s" % write_blend) + bpy.ops.wm.save_mainfile(filepath=write_blend, check_existing=False) + + print(" Result: '%s'" % str(result)) + if not result: + print(" Running: %s -> False" % run) + sys.exit(1) + + if md5_method == 'SCENE': + md5_new = blend_to_md5() + elif md5_method == 'FILE': + if not md5_source: + print(" Missing --md5_source argument") + sys.exit(1) + + for f in md5_source: + if not os.path.exists(f): + print(" Missing --md5_source=%r argument does not point to a file") + sys.exit(1) + + import hashlib + + md5_instance = hashlib.new("md5") + md5_update = md5_instance.update + + for f in md5_source: + filehandle = open(f, "rb") + md5_update(filehandle.read()) + filehandle.close() + + md5_new = md5_instance.hexdigest() + + else: + print(" Invalid --md5_method=%s argument is not a valid source") + sys.exit(1) + + if md5 != md5_new: + print(" Running: %s\n MD5 Recieved: %s\n MD5 Expected: %s" % (run, md5_new, md5)) + sys.exit(1) + + print(" Success: %s" % run) + + +if __name__ == "__main__": + # So a python error exits(1) + try: + main() + except: + import traceback + traceback.print_exc() + sys.exit(1) diff --git a/source/tests/pep8.py b/source/tests/pep8.py new file mode 100644 index 00000000000..f7c416553b2 --- /dev/null +++ b/source/tests/pep8.py @@ -0,0 +1,118 @@ +# ##### BEGIN GPL LICENSE BLOCK ##### +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# ##### END GPL LICENSE BLOCK ##### + +# + +import os + +# depends on pep8, pyflakes, pylint +# for ubuntu +# +# sudo apt-get install pylint pyflakes +# +# sudo apt-get install python-setuptools python-pip +# sudo pip install pep8 +# +# in debian install pylint pyflakes pep8 with apt-get/aptitude/etc +# +# on *nix run +# python source/tests/pep8.py > test_pep8.log 2>&1 + +# how many lines to read into the file, pep8 comment +# should be directly after the licence header, ~20 in most cases +PEP8_SEEK_COMMENT = 40 +SKIP_PREFIX = "./tools", "./config", "./scons", "./extern" + + +def file_list_py(path): + for dirpath, dirnames, filenames in os.walk(path): + for filename in filenames: + if filename.endswith(".py") or filename.endswith(".cfg"): + yield os.path.join(dirpath, filename) + + +def is_pep8(path): + print(path) + if open(path, 'rb').read(3) == b'\xef\xbb\xbf': + print("\nfile contains BOM, remove first 3 bytes: %r\n" % path) + + # templates dont have a header but should be pep8 + for d in ("presets", "templates", "examples"): + if ("%s%s%s" % (os.sep, d, os.sep)) in path: + return 1 + + f = open(path, 'r', encoding="utf8") + for i in range(PEP8_SEEK_COMMENT): + line = f.readline() + if line.startswith("# "): + return 1 + elif line.startswith("# "): + return 2 + f.close() + return 0 + + +def main(): + files = [] + files_skip = [] + for f in file_list_py("."): + if [None for prefix in SKIP_PREFIX if f.startswith(prefix)]: + continue + + pep8_type = is_pep8(f) + + if pep8_type: + # so we can batch them for each tool. + files.append((os.path.abspath(f), pep8_type)) + else: + files_skip.append(f) + + print("\nSkipping...") + for f in files_skip: + print(" %s" % f) + + # strict imports + print("\n\n\n# running pep8...") + import re + import_check = re.compile(r"\s*from\s+[A-z\.]+\s+import \*\s*") + for f, pep8_type in files: + for i, l in enumerate(open(f, 'r', encoding='utf8')): + if import_check.match(l): + print("%s:%d:0: global import bad practice" % (f, i + 1)) + + print("\n\n\n# running pep8...") + for f, pep8_type in files: + if pep8_type == 1: + # E501:80 line length + os.system("pep8 --repeat --ignore=E501 '%s'" % (f)) + else: + os.system("pep8 --repeat '%s'" % (f)) + + # pyflakes + print("\n\n\n# running pyflakes...") + for f, pep8_type in files: + os.system("pyflakes '%s'" % f) + + print("\n\n\n# running pylint...") + for f, pep8_type in files: + # let pep8 complain about line length + os.system("pylint --reports=n --max-line-length=1000 '%s'" % f) + +if __name__ == "__main__": + main() diff --git a/source/tests/rna_array.py b/source/tests/rna_array.py new file mode 100644 index 00000000000..06b4735cc0d --- /dev/null +++ b/source/tests/rna_array.py @@ -0,0 +1,297 @@ +# ##### BEGIN GPL LICENSE BLOCK ##### +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# ##### END GPL LICENSE BLOCK ##### + +import unittest +import random + +test= bpy.data.test + +# farr - 1-dimensional array of float +# fdarr - dynamic 1-dimensional array of float +# fmarr - 3-dimensional ([3][4][5]) array of float +# fdmarr - dynamic 3-dimensional (ditto size) array of float + +# same as above for other types except that the first letter is "i" for int and "b" for bool + +class TestArray(unittest.TestCase): + # test that assignment works by: assign -> test value + # - rvalue = list of float + # - rvalue = list of numbers + # test.object + # bpy.data.test.farr[3], iarr[3], barr[...], fmarr, imarr, bmarr + + def setUp(self): + test.farr= (1.0, 2.0, 3.0) + test.iarr= (7, 8, 9) + test.barr= (False, True, False) + + # test access + # test slice access, negative indices + def test_access(self): + rvals= ([1.0, 2.0, 3.0], [7, 8, 9], [False, True, False]) + for arr, rval in zip((test.farr, test.iarr, test.barr), rvals): + self.assertEqual(prop_to_list(arr), rval) + self.assertEqual(arr[0:3], rval) + self.assertEqual(arr[1:2], rval[1:2]) + self.assertEqual(arr[-1], arr[2]) + self.assertEqual(arr[-2], arr[1]) + self.assertEqual(arr[-3], arr[0]) + + # fail when index out of bounds + def test_access_fail(self): + for arr in (test.farr, test.iarr, test.barr): + self.assertRaises(IndexError, lambda : arr[4]) + + # test assignment of a whole array + def test_assign_array(self): + # should accept int as float + test.farr= (1, 2, 3) + + # fail when: unexpected no. of items, invalid item type + def test_assign_array_fail(self): + def assign_empty_list(arr): + setattr(test, arr, ()) + + for arr in ("farr", "iarr", "barr"): + self.assertRaises(ValueError, assign_empty_list, arr) + + def assign_invalid_float(): + test.farr= (1.0, 2.0, "3.0") + + def assign_invalid_int(): + test.iarr= ("1", 2, 3) + + def assign_invalid_bool(): + test.barr= (True, 0.123, False) + + for func in [assign_invalid_float, assign_invalid_int, assign_invalid_bool]: + self.assertRaises(TypeError, func) + + # shouldn't accept float as int + def assign_float_as_int(): + test.iarr= (1, 2, 3.0) + self.assertRaises(TypeError, assign_float_as_int) + + # non-dynamic arrays cannot change size + def assign_different_size(arr, val): + setattr(test, arr, val) + for arr, val in zip(("iarr", "farr", "barr"), ((1, 2), (1.0, 2.0), (True, False))): + self.assertRaises(ValueError, assign_different_size, arr, val) + + # test assignment of specific items + def test_assign_item(self): + for arr, rand_func in zip((test.farr, test.iarr, test.barr), (rand_float, rand_int, rand_bool)): + for i in range(len(arr)): + val= rand_func() + arr[i]= val + + self.assertEqual(arr[i], val) + + # float prop should accept also int + for i in range(len(test.farr)): + val= rand_int() + test.farr[i]= val + self.assertEqual(test.farr[i], float(val)) + + # + + def test_assign_item_fail(self): + def assign_bad_index(arr): + arr[4] = 1.0 + + def assign_bad_type(arr): + arr[1]= "123" + + for arr in [test.farr, test.iarr, test.barr]: + self.assertRaises(IndexError, assign_bad_index, arr) + + # not testing bool because bool allows not only (True|False) + for arr in [test.farr, test.iarr]: + self.assertRaises(TypeError, assign_bad_type, arr) + + def test_dynamic_assign_array(self): + # test various lengths here + for arr, rand_func in zip(("fdarr", "idarr", "bdarr"), (rand_float, rand_int, rand_bool)): + for length in range(1, 64): + rval= make_random_array(length, rand_func) + setattr(test, arr, rval) + self.assertEqual(prop_to_list(getattr(test, arr)), rval) + + def test_dynamic_assign_array_fail(self): + # could also test too big length here + + def assign_empty_list(arr): + setattr(test, arr, ()) + + for arr in ("fdarr", "idarr", "bdarr"): + self.assertRaises(ValueError, assign_empty_list, arr) + + +class TestMArray(unittest.TestCase): + def setUp(self): + # reset dynamic array sizes + for arr, func in zip(("fdmarr", "idmarr", "bdmarr"), (rand_float, rand_int, rand_bool)): + setattr(test, arr, make_random_3d_array((3, 4, 5), func)) + + # test assignment + def test_assign_array(self): + for arr, func in zip(("fmarr", "imarr", "bmarr"), (rand_float, rand_int, rand_bool)): + # assignment of [3][4][5] + rval= make_random_3d_array((3, 4, 5), func) + setattr(test, arr, rval) + self.assertEqual(prop_to_list(getattr(test, arr)), rval) + + # test assignment of [2][4][5], [1][4][5] should work on dynamic arrays + + def test_assign_array_fail(self): + def assign_empty_array(): + test.fmarr= () + self.assertRaises(ValueError, assign_empty_array) + + def assign_invalid_size(arr, rval): + setattr(test, arr, rval) + + # assignment of 3,4,4 or 3,3,5 should raise ex + for arr, func in zip(("fmarr", "imarr", "bmarr"), (rand_float, rand_int, rand_bool)): + rval= make_random_3d_array((3, 4, 4), func) + self.assertRaises(ValueError, assign_invalid_size, arr, rval) + + rval= make_random_3d_array((3, 3, 5), func) + self.assertRaises(ValueError, assign_invalid_size, arr, rval) + + rval= make_random_3d_array((3, 3, 3), func) + self.assertRaises(ValueError, assign_invalid_size, arr, rval) + + def test_assign_item(self): + # arr[i] = x + for arr, func in zip(("fmarr", "imarr", "bmarr", "fdmarr", "idmarr", "bdmarr"), (rand_float, rand_int, rand_bool) * 2): + rval= make_random_2d_array((4, 5), func) + + for i in range(3): + getattr(test, arr)[i]= rval + self.assertEqual(prop_to_list(getattr(test, arr)[i]), rval) + + # arr[i][j] = x + for arr, func in zip(("fmarr", "imarr", "bmarr", "fdmarr", "idmarr", "bdmarr"), (rand_float, rand_int, rand_bool) * 2): + + arr= getattr(test, arr) + rval= make_random_array(5, func) + + for i in range(3): + for j in range(4): + arr[i][j]= rval + self.assertEqual(prop_to_list(arr[i][j]), rval) + + + def test_assign_item_fail(self): + def assign_wrong_size(arr, i, rval): + getattr(test, arr)[i]= rval + + # assign wrong size at level 2 + for arr, func in zip(("fmarr", "imarr", "bmarr"), (rand_float, rand_int, rand_bool)): + rval1= make_random_2d_array((3, 5), func) + rval2= make_random_2d_array((4, 3), func) + + for i in range(3): + self.assertRaises(ValueError, assign_wrong_size, arr, i, rval1) + self.assertRaises(ValueError, assign_wrong_size, arr, i, rval2) + + def test_dynamic_assign_array(self): + for arr, func in zip(("fdmarr", "idmarr", "bdmarr"), (rand_float, rand_int, rand_bool)): + # assignment of [3][4][5] + rval= make_random_3d_array((3, 4, 5), func) + setattr(test, arr, rval) + self.assertEqual(prop_to_list(getattr(test, arr)), rval) + + # [2][4][5] + rval= make_random_3d_array((2, 4, 5), func) + setattr(test, arr, rval) + self.assertEqual(prop_to_list(getattr(test, arr)), rval) + + # [1][4][5] + rval= make_random_3d_array((1, 4, 5), func) + setattr(test, arr, rval) + self.assertEqual(prop_to_list(getattr(test, arr)), rval) + + + # test access + def test_access(self): + pass + + # test slice access, negative indices + def test_access_fail(self): + pass + +random.seed() + +def rand_int(): + return random.randint(-1000, 1000) + +def rand_float(): + return float(rand_int()) + +def rand_bool(): + return bool(random.randint(0, 1)) + +def make_random_array(len, rand_func): + arr= [] + for i in range(len): + arr.append(rand_func()) + + return arr + +def make_random_2d_array(dimsize, rand_func): + marr= [] + for i in range(dimsize[0]): + marr.append([]) + + for j in range(dimsize[1]): + marr[-1].append(rand_func()) + + return marr + +def make_random_3d_array(dimsize, rand_func): + marr= [] + for i in range(dimsize[0]): + marr.append([]) + + for j in range(dimsize[1]): + marr[-1].append([]) + + for k in range(dimsize[2]): + marr[-1][-1].append(rand_func()) + + return marr + +def prop_to_list(prop): + ret= [] + + for x in prop: + if type(x) not in (bool, int, float): + ret.append(prop_to_list(x)) + else: + ret.append(x) + + return ret + +def suite(): + return unittest.TestSuite([unittest.TestLoader().loadTestsFromTestCase(TestArray), unittest.TestLoader().loadTestsFromTestCase(TestMArray)]) + +if __name__ == "__main__": + unittest.TextTestRunner(verbosity=2).run(suite()) + diff --git a/source/tests/rna_info_dump.py b/source/tests/rna_info_dump.py new file mode 100644 index 00000000000..62c1248d733 --- /dev/null +++ b/source/tests/rna_info_dump.py @@ -0,0 +1,131 @@ +# ##### BEGIN GPL LICENSE BLOCK ##### +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# ##### END GPL LICENSE BLOCK ##### + +# + +# Used for generating API diff's between releases +# ./blender.bin --background --python release/test/rna_info_dump.py + +import bpy + + +def api_dump(use_properties=True, use_functions=True): + + def prop_type(prop): + if prop.type == "pointer": + return prop.fixed_type.identifier + else: + return prop.type + + def func_to_str(struct_id_str, func_id, func): + + args = [] + for prop in func.args: + data_str = "%s %s" % (prop_type(prop), prop.identifier) + if prop.array_length: + data_str += "[%d]" % prop.array_length + if not prop.is_required: + data_str += "=%s" % prop.default_str + args.append(data_str) + + data_str = "%s.%s(%s)" % (struct_id_str, func_id, ", ".join(args)) + if func.return_values: + return_args = ", ".join(prop_type(arg) for arg in func.return_values) + if len(func.return_values) > 1: + data_str += " --> (%s)" % return_args + else: + data_str += " --> %s" % return_args + return data_str + + def prop_to_str(struct_id_str, prop_id, prop): + + prop_str = " <-- %s" % prop_type(prop) + if prop.array_length: + prop_str += "[%d]" % prop.array_length + + data_str = "%s.%s %s" % (struct_id_str, prop_id, prop_str) + return data_str + + def struct_full_id(v): + struct_id_str = v.identifier # "".join(sid for sid in struct_id if struct_id) + + for base in v.get_bases(): + struct_id_str = base.identifier + "|" + struct_id_str + + return struct_id_str + + def dump_funcs(): + data = [] + for struct_id, v in sorted(struct.items()): + struct_id_str = struct_full_id(v) + + funcs = [(func.identifier, func) for func in v.functions] + + for func_id, func in funcs: + data.append(func_to_str(struct_id_str, func_id, func)) + + for prop in v.properties: + if prop.collection_type: + funcs = [(prop.identifier + "." + func.identifier, func) for func in prop.collection_type.functions] + for func_id, func in funcs: + data.append(func_to_str(struct_id_str, func_id, func)) + data.sort() + data.append("# * functions *") + return data + + def dump_props(): + data = [] + for struct_id, v in sorted(struct.items()): + struct_id_str = struct_full_id(v) + + props = [(prop.identifier, prop) for prop in v.properties] + + for prop_id, prop in props: + data.append(prop_to_str(struct_id_str, prop_id, prop)) + + for prop in v.properties: + if prop.collection_type: + props = [(prop.identifier + "." + prop_sub.identifier, prop_sub) for prop_sub in prop.collection_type.properties] + for prop_sub_id, prop_sub in props: + data.append(prop_to_str(struct_id_str, prop_sub_id, prop_sub)) + data.sort() + data.insert(0, "# * properties *") + return data + + import rna_info + struct = rna_info.BuildRNAInfo()[0] + data = [] + + if use_functions: + data.extend(dump_funcs()) + + if use_properties: + data.extend(dump_props()) + + if bpy.app.background: + import sys + sys.stderr.write("\n".join(data)) + sys.stderr.write("\n\nEOF\n") + else: + text = bpy.data.texts.new(name="api.py") + text.from_string(data) + + print("END") + +if __name__ == "__main__": + api_dump() From 110f6d81ec27c8620ef693a743de18b6aaafeb44 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 25 Jul 2011 14:48:01 +0000 Subject: [PATCH 047/182] Branch for vertex group modifiers From 1e2e08085319712183aa8171c003c851f7707ce1 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Mon, 25 Jul 2011 15:27:01 +0000 Subject: [PATCH 048/182] =?UTF-8?q?Adding=20WeightVG=20modifiers=20code.?= =?UTF-8?q?=20Still=20some=20points=20to=20tweak,=20though.=20NOTE=C2=A0:?= =?UTF-8?q?=20Haven=E2=80=99t=20yet=20tested=20build=20with=20scons,=20wil?= =?UTF-8?q?l=20do=20asap=20(unless=20someone=20else=20does=20:)=20).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- release/datafiles/blenderbuttons | Bin 210335 -> 211021 bytes .../startup/bl_ui/properties_data_modifier.py | 129 + source/blender/blenloader/intern/readfile.c | 24 +- source/blender/blenloader/intern/writefile.c | 6 + .../editors/datafiles/blenderbuttons.c | 13170 ++++++++-------- source/blender/editors/include/UI_icons.h | 3 +- .../blender/editors/space_outliner/outliner.c | 4 + source/blender/makesdna/DNA_modifier_types.h | 167 +- source/blender/makesrna/RNA_access.h | 3 + source/blender/makesrna/intern/rna_modifier.c | 377 + source/blender/modifiers/CMakeLists.txt | 5 + source/blender/modifiers/MOD_modifiertypes.h | 3 + source/blender/modifiers/intern/MOD_util.c | 3 + .../modifiers/intern/MOD_weightvg_util.c | 246 + .../modifiers/intern/MOD_weightvg_util.h | 82 + .../modifiers/intern/MOD_weightvgedit.c | 343 + .../modifiers/intern/MOD_weightvgmix.c | 433 + .../modifiers/intern/MOD_weightvgproximity.c | 512 + 18 files changed, 8933 insertions(+), 6577 deletions(-) create mode 100644 source/blender/modifiers/intern/MOD_weightvg_util.c create mode 100644 source/blender/modifiers/intern/MOD_weightvg_util.h create mode 100644 source/blender/modifiers/intern/MOD_weightvgedit.c create mode 100644 source/blender/modifiers/intern/MOD_weightvgmix.c create mode 100644 source/blender/modifiers/intern/MOD_weightvgproximity.c diff --git a/release/datafiles/blenderbuttons b/release/datafiles/blenderbuttons index 9872e53585e5bb25ce843dbe0b029de7f7c4cd73..609a4d55ebc1997327ea99a710e06fe0c60a288b 100644 GIT binary patch delta 154775 zcmYhiWmFtZ*9AHd!6m`n-GaNj6Wk@ZyGujx5G*(Z2oNB+ySuwP1b274o%i|fx_1^o zn40dY?y6Hq_TH6wh&XbFSY84T_XY}$9_i!6=dP++c=s8AQ|;O4sbzt8UuJP~a*~B- zp+5%6v>)@cNf_E^VRVNxG)L0@kHRL@@T9+pD{0q-3T(80p;O!LXY3PNx;c%VM%QY} zNKR(^XN+AgQyoj6q&eTFopSGbe^k)t!ZY1=+1TTcYgG{b&v3G;FZstD1yhH z)YMd;#n=y_0DJ1WhOwevgF|QUE;B6LiNE-(_loNPuYJ9X#bM}tJj>I?rIEFQ`p&7l zb@zs&5HS`r3uEXTUP;w~5<;mdW_tSmsUd{e*w}S0X3{Gz;+UZ#?G9HS0;{XVcQ7!I z_m7+T{ZbBEH;Y14Xy5hAtU_7~h9JFII-(P$HI(ye07cirJb7~Q)^Z(1ebIgYi-cKr zihL*?hu!l0^S9iOrnbYt3 zK_TmKw%+jqQQ&Z1I;NnY$lV=HzqBD*L<+zac;B23D+0Tm`xYa&r{3cnnwFM!lt)D| zqDMJ3GxIcS!a_+`_j_k&XBuVE@855GdU}EYBfFu6$z(HAKfhK10RjEJg+~5GtG9dC zZHEw&Gw01;+0E$rikT8xS_?!-mX-9pz+$zfE<~~UX3^RX(%Ag+aM<>1v|ofU`gY*v zc!_tGjk)!_7q1A)=Uy>g_T=Q`l8lTD12f{C^;~Js!Aw!z`i)pZY^Lwcf){e=<>V2t zP<8%vIVS6Uwa3iF$$7i>g(v|_acd$vfbUCveM*k5TBXZ)?8ss9yeg( z)uKy4eli=3WlI7KVvQ%fUv)1Zseze-6gHK5K(mY_YxG;TR zFn4%+vfASP#m1)i6f~S}VPWBNP5SAurhaE7(iU5>PjWz?6e^Ag{sUmImpN09zG1AuiP7vP@C<4dvEbk$e z7vBtPIUbhl*A{e#9Bl2P{2@X?x{L;u9_N1(%*QhHxXp%>6G&q%q_0OY*_?=9m`7l= zJ8T_vD6KqrL(*r~W?oE~Qat-(NDg&0#}akvf&3l6q8S;b8JjvHB!Cl+vH03gUqa%2 z!OK#LmzP`yUrNcJKg7}eH`u~cDtBy!G#|s?qhNn(FJz#moKvYBNJ%c*+N)48nOl{r zw0owUY;ZPbg#hMko_wn@9f2@dmNnWRiHH=lv$Oj%_`Un{}zeCZSM zQskRNUV9|gmJJ!d%>b;}q4R>Rt%jkk{))J*rSv9gP0i#9D0#-DA-y`#Xq`l0aRmK* zFzw`j<8lEnPd*~BTCF~w9}Z4oU)?ih$$Wi$N)g_Em4Ya;Rjh9E5uW}^N}BV8psWQS zT6~wt;ePY000-GhfOEsZspXX*Rn&t|AAS6eytC$Hj>w^58OVenx>jZo@bU2xI=j01 z_RP#&V?;_^CM!`NjsLK9KSgDpEnBMhEou6$aC^u@$^Yx|&i90Xw6|7us_pUa*-x*} z^$$(HGu?1# z>NPOSaP1{c(?I?LlG3WK`_rA8EmX9Tzl-7P3tjk1tJUIWblJt5=7T9~sW^x((JwVy zJ(OQ7zac?P_;^BKw_7cefl}^@d=o)tqOsYJJlWgyl?Q2ulLs0L1YB^Z^=9_=Z^f&P z|4P2Q{PvlhT6{*R3`k!n`=HTl>LoJsVTE>NRw7c$k*2L@mK4sgg5cb23+!X?nRcvXx}u zN5boN1Q1{Dj!}`2kWi+`-Gl|E>JmoRSkrPU87Kk2_UuzHZhz z+B{WftZjTHFE+Sn7}zb}&Mu5rkBGz!7RgegjtBe=(DqR(9{r`3aeX6-O~vpKeR)`a zWOHv!8T@ahRO76aW?%T9-?q2A|-P{VL+5cNh@RFA$OE*FW`2Y2Z zF0;vo?V2MI@oxZh_*_$u9IJ1IQcvt^GiFxRV9UR&v_~zT*cZeMk^a;(ivhxjF%bWiu zU@-lYR@&iX=BVp`!v|k*3X^I7cQ-YIG3&tqyyE{Y0Qz7$t4^J88uI^juH8Ev@?t)I z)*oPye)o0fyTDz-zxn^asea`i$*Tr>o+Sg*H(u@b#x?%^@IU+e-x?I8e9bp&;Ko4t zH;K!;F)QoY zU=3?DuyD{QvK;}OVcYMgjbsCg92sWO%ZWNi&)-#$3!yb5)<=p_5fI8wYE!K2{NvM z;J|N*@5+uG8g%_+3RJDsXcN>6RP`+ipA2MTv`ZA+ot=>0i)Itx606gZFap1%uV zn8rHuXbz@LIOqkt=`}SsXH_p!+w6XLqpPP^md@{ea}1_`0V(FSe=bMul=EMK3M-{6 z#luxM$Ip82KCNfW$4Shh;h(J2HF#OtHO#P5%9lav0}bsuqLW!>(TGJEO>s=}zs+O- zlxgwn4)44AJ!4Wpp2& zc9U+F(obdD1Z{9}v!KY(OH^rVoErEV-MGPDX_JPk(BZ{bE=b^mNvi-mPtmh`pS9s( zIeB&ULi{{C?jGqY9Y6GT2j`!G4mp?I0xiR*;9mAsHYHK!q5$|uDGxB@>YxTC}e((3SA1GJS47&k1S!g`7TKkn%v*{l)R%>HczUV01L`YJVzpXoKt8 zoAk@m-T7mUc8OvVqaIMtk%pv!OdrB_gAt~}nO*bS-+eR5w6zQ7dOo^o87KY-8N=TQ zrab6RnJL~(P9OhZQ?jL!&aoS(KW~`NF_Tpy<=A2-MfYVLTdUWZv2%Ujq=!|}$_X;^ zdk)E}oBgqEr`>;{?2RD@WCPe|T&}|K38~)9INXVBbywnO1|Gan8Z~OChAZdXbARKf zua>SPbMmn4CCvH?H_F3a8Nsr!OA5_z@)y#E`g<~#U8ovAD`EjRKj4GY#g??w z_8>;~)V|c0FQof3MM=W62`}%7+i{pdzx518{Qk3zuAwcb`@z%*S#Y~3X7EXepb+VU zj&c^V4&6=`&G$nQmc*)tCtslDe6ueJRU}L%7bvu}`b&%cjh(6G>cjKaUQN89Hd&-Ee*UpKjIbZ7zaQ%=(c`& zxZ20Cw6yGAS<%xe^4SJce_9q6max#!P*GPGclWsr9@lSjKe;NJZv?Yem~WuEi*8$1t+ zw^4B6rAGqVBe4)T2OJLTLZW77lm*4bD|%1gXIJPi_QjaWS#?9wK3!KN(F|vOJyn>$u=97NnZ;5~0;g@r2(-YM{Iw;IU59=7k zElEzs{)mPq%BWi}q^zPMt)+!?f6{b%1eV0_W2LGQ{kuOf=PDNf6hWwQ17eBvT3?Ez zR6Pq-X&Fd@;u8~pfYmCF8m$_=zd9iyVG0cmP50DPl|Jj{!9ih*-?LYwaLNM&VZSXx>drhk4@(_;_#yjrj%pWOFfz?jMf{n>$Z)9Go zueOREN7}${CSV8pR%QrpWUHr#$5!%)nXAgo02>qr_q6Mv7zRcmPp{`K7Zv)Ma=i_h)x@w z!D+km+e1kNEZU&|JzuCYXK-suXP~FA{%66LmzTD#k(l@26yZ?>B}qBQ*una%$DJzm z9peHzUxp2Q)B?{+PWj(X1rfg#*&l+ihCx7lO0j7m&l=!l9eR` z0UndAGvwl;2fWF!ThdNJ{7^Cj~AK~Y&h_^5Q= z*9Wd{lfR|EP?5nmA5edfLG7dpn#PtVg!qj_1K*7Gf0MAz#B>xs>XS(ne+IgC+HY6v z3J)Yite&6yl9`R)uil)IcmO+3DBT4*8lsOY=Ie=89c9#C_r=JIsgT#h1$@arhTM-Y z5YVE-lYoDyu)pRGW8>li{hl8jL31bed%54;l_CFu2tiA2PE9EcyDCu0KU;Pl3$L|b zTNN)+H>g}X7J-CCNB3<3199RYICC^#s8)o486ggC)b?#BylFJ};BxJfY-9qSZv93V z8lT~0=BKMGm*2mCw_DY~2Y&s^Xi)EvHMBR8bDxruBBiLRn4Rl1ig2O4rh@{!4D*a zeaXc4m`Q~D0s3b`IqPZ1pw747U+qj(IA2;!D&w6tQqr4RFCA|Y-jQa8YSQ-xBVeIoVus8VX%y+{>E)b!s1pAh5J=S5>(}z!8!0*k zEY;w#GEiF#6!#GUJKISHy`aml0ABsBz$%y3e6-rk#KgvW=hmkdjQ-rtyQ3vVmePuf z_SH2M^z_4=%*@Q*tIeJ(pkXn_%H&crF!W#<_ymBXel@~I6*-&HFp$plIw;8Cv|H}K zxxKZo)PW%hA_)qEk}AT&f$Wb0>AY&2ebE}~Nz#Q_AE;dm<|3xO)Cmi#+WMv$iXI6` zOyrDl6>#?+TA3=DtJEIh*#78a!MWVP!%8eLHIZyE$2b&W5x!BlFs;VCG@>AHZjdN4 z+qk?RKfEqqI@SbjbPsfxZo3X#f^4}eOP?sn$%)z6;=xSf*Y43m6$QY)rlPJM0@n1b zp(sSN&DXO!7rn!XU7tWhNal4f-CAyNwgVG55ho{>ZxInBNkh!;C%OZmOPu-F3Oa$o z!9n7rp>z&y=z#S^SL~30o-dAr*ndhY2%PcQ2f;bNpn2nXx#+$UD8Vx+MTkN5AO zPMvU>g9Lx)=QjynPpf=wZsv=RkN5A}Tye953yuO@-&HQyWPPbfuF$0CBr_DrLM=NP zC$nL;(;_s8L-|tIX~PlvvZ?sVAIkUy60+|`*)Uo1noI-z8y`xOu6@Hu$=qP|Whfzo zcn=Xx1lH1P3kwRneUi}7>*=S3^XcOm!q=lC8`!tdVPd2%co(qtyA(xO*e(I@I-)FA zKf1*OQmcNu>Fy>q?3tcBI4Lr@Uik}@MaqjX94xmowXGvR`kTk`?n4YwSy0N|THcsh z$4HUOK#iA)Q_7O?wOG%&3)qzu$zj?^_%j70ExyyyCpgM;i{-Me?d0d@2Y8)#zJt3! zLQW3xEi_d37iJ#UgCO}dj)IltWpXHOPA#LQs_ zG2cxKL-K@NO@t3eF%CFV4K>44d+TQx*{W@@Yj~dZaCmweo;S5fZ2@8&svvX`l26Cb)XzL_#1H|a? z|6!ua`)2=lzm&cd@&8Ob&7#B>nL5jxSu1JbpL|OUc#l;12 zf=rewZI*HY{%pwth!{bIi+%m^Uo1FwHo;H4fsg|m$>N>cM5Qi#3S7VBBadE`716%RB zg0$5{h84*Rd}BU(KK^F(ygKyWvFz5yeVgOTvmRdkh@Cp6~2giBwIbi?F6|*9U)fgZLCxfp)XmCvPqKu z2#1vLr)83nHVe9>p~tJkx#)rtZmVhPPl!`+LSXsWP-7chF6A94xuZWaQ@2QDj)=>< z@u5x;7(r=CG>3;&jKWm7*as}&{!yYvF43uD6awfmiQbR5ag#d1xo<8p$)7uxFl(vv zx5q(z;M(KbWj6y*GVyjOF)nX;j5OU#4chee=1gYjR~lWr{`N%7*xA|fo?LV})yw2A z5`OsLNGX}+!C2?*zF|+RwlH4Fk^t!bq`jc5@d6bpFfabn@%5d@ zc0!?WgN$ zbk2^Bv2S7o&b!f?i!{nY7Hw*64oY5tY-XlOeC&{L8|kgW)-cUCY=jfItY(NRkJpJ| z9|GsU?@`wWySGuKQf#xtP^(D|$b~|N6L?LlWn^T|{zfq2<|(9WcUK;fMWsR~$h-sH zE!g>wa5O3_5U;lVV_W_4E)W|E`gr0L=k0njm-i}*Dv8f_)^^l5x{CVUYD^C zbgM`pAvK#J2xLshbE8fCb>QNRR6lm*!bjFjbRD!%Q&(3Y;P_iw#k>t?F7j* zq^=O8Dg6eg;OTgp1ewqg!;xD$ba;?l)NS!fKqL~-ZE`!-Ha@-pX^dFM&0b47TG~7g zGkvSnOB)Wn?-FF73kPCTQar2n$B9*h|xQb4do8$njahJ?shthD)omMlC9b70#k zPdhH|=g(m<6}$tU6uOOC+GG3x$^+ey$aH#>i%}>{0%E}FomlDm!1B4$Yw2={`CyCC zJPZlyJx9R+RR(0~HR)}Rb(^$v5J*+7J2i01$Es3xjl(HAwDOo=KuZ~X(lwwey`Ee1 zd$bjnmWJcPA2mo-rZF2yr2s3G2>jOjV-P)IIzWoiCf_fX+j5eDH@@8vAK0zrm zEzA@mz>j7M6?Wbrcw{*T$E>JLBrEKDR8(RVE;~GESMk#1Ke|R5&NU8>s@4o1BROv3 zKKSQW4jRsAU%1j^+H7|vcg3S!5I^Hw3z^TKYLcKFBRAzEvZ>)A`P;A=W*^+ zCL*zws$*uG9fDkc?2{H~KH|#G3STvNAHg-?5pqt3f_Do!7m0 zzQTB8dpj6J6pTQW2^Jn+3Y0aQ`85#xos>aeZ-N$!AU5o{F{Tk0ju!{2=yNhz8#*jck<1< zdyUsG$L+fZsU?d;w(_CZncv(0+BVhU2Kyan!Jj}EXd;Fy!G;&{%F#zKsa#$q1kpRW zh0gk-vLFV6lQle>uSm2BR2cWo;vl{kggpLa{znqejHUD5D*O5QVO40_l+qZ~*`>dP zQ)Pq=4GtbqCdgbPU5^#oR)fg}ji6xLF6$T{+UxypriM(ea=!@+804M7Ta&;X@O%=S zuB(sXZ&^}?3(UAh`fWoB-5PS{ZEB4{kFU2gn(lo*r6>rL6f+Ce9M)US(6;C@y3=N> zU2><$g@EMI-tKUU^S?nNq{vz3Xv=G8NC-ka^7Y<>)on$9Mr%4#}E)`fY#?wNcira%~!`^;L_05it1oN zF-r+w0C;Iu%~B!;%NcOOx_3s>K$PQ(3Zih`$6F-cSlYR|d%c3=S zA&H>i>oQnxOS+sa-!C@09##S%_^^<|YW{b@JTq9kq_#|}iZTayeQ^W}hA=RRPa?Qy zP}0=&umU+l^AJQF(sX9y5UzX_Mw6r}xDUN~%o(uL{q*sUi#CW;m ze`4=RWLWm8j#`*`!31_VI4?B0Go4>t6sl6AE9ASMU0h5iCMCte5PJLqi_SGU@%7{5 zk`fU1Yw^BioCSf&Dc-w>2eXeNVQp=If~XfqTBL`k=gjx<&8CJ1+dZ%dt57eZ05d#J z6{X?>bTvs>-Nkf+(85s&bzP{-Sr@z#TG^SOO%w{IW z#uTkVFbPB(NsyWhK2K#L z0)mq0h={5Dygb}*7ncm$C9|Le#;nn0|A#bf3-3Nb|IV))6Vd(vyi*w6bY3B=<|iX8 z5kHUQn9K}{t@*>P<-C-w4oK|t*4J4$6XUb!sNW{UX}mR5cp`o>K1}Ne-(O0;8~C*X zA>h7F?C$A_-P$s_m})&82(-;r15r+7u9TguGH`)Q^jlJYay#$j?F77m2~(w=c@q_> zO$h-JBKdM(!lzxGt}P7lP<^Vc3w05WP_zqICXrSm`Th>7ffV*QsWnJIf(>F6X<8@# ziOtyVhyHym_17pg(L6I z$TP=YCr3t(-8D4kj6p}p>c4N{C&0+)uMX*iT>a4(DH_@f6CFI3138-fMV7w&_t{@$ zh+P!xjPa#4aVKIXzGx+qlav1wU}y}QRN8Q5lwV=Wqo71vL`pd8d>qlKfIk9mOq0{3$8<;kOMVRB2KHWIlwkFDM`Z&%*<)1 zsfj_)&h3h%38sY%?}tB(-;cIm97H`1yl0dmwbclrtWz0ff*F&Du&XamAY zdGYb+U0@Yu0gn3Vz=g*dl=2KLEj2;frOcy0J7?;-rj7OIjklT@TbMlYzRYDDQLy$D zZBE|rrG**Piq0uT2kMO*-1Knh?6G?En~cCyK!)@@!Xx2{|D0J z1M^jZSIEU2T6m%WC7uWjZ?;zE!eXTR|N8I3GY zpZa!|=9c!GUxH(+J!xGbg~A~)vT`QI4(JQmJe?C>@WGvk(}M*n?%-y87l~aGMmeG$ zLw#F!8yZuQjvA90#YS0F}f2eb0!6 zBE1u^VZ*==>OI`suPy?az#%%H(dI+-A+K?)`CWaewx(i$5V0mTX2dlDCjF;F7asHP zm=MG`ncM}i%4H>|q|}axh_D3(Ni`CZl4)zcw=3`ks;QA7Qy-tm9^;B_>57?klCbXk zqK~O-Y%(~1URkR2nXm&t2U`3_tg2kk8QShTgq@Zq#mj!I2K>;GPee;~9Z6KBE%5;H zfuG?fD^{>=h&N3d$62E$E zOJ%(T!neQ;q$7VGQbSWxWB8hW7x@lbb+9~ zj*VUt6z!cAYfLYK=grivZKwNc5Ra_|>m&KuL*RN1`mW*RlIkrs{q}hywoUCHYati3 z)aaq@i+fO(vjJY#l0A2*0W~ikJ<%p}X)qv|A>OcKls~nI(vL-XG~Y9D}s}U55{GH-xk=)@HJ#*qDmV$8Na07VuZj1 z_%jeB)bj0YyEr4Tk7dWCAOMVCiK|!qM}PJ;$Jn)+*WwX-B;nG4!j7>|XmwF+&G&-r z+USG63a;@~MP3c&?4Z(OThOAu{nrMv?PzriN50B(nQE0*sxE{U!uTh(H_I&9LB*1T z5ZW;J@qgkMP-C&9H)|vF=y&v}wnp7G^4g6x^#R8{@xyDXE!7?X{gr)27Rzh-KfTPQ zVA*|H5C_4kLD=b1D%xM9Uz7u;_}}GVyOR+hf7;)P#K8VCzJ5$W+`O_-{h#vX1ak$V z3t2}pWb>C&HCL-Il92to+JVQXU>-t20ukbp;{%;%7Ij4rik4>)F(>qf-TNI$S8li- zhM7a`-#>x9{jB6f4b|G?LDv;O^I5fmC$%q}bJCO%H91Pe{pInA_KY;rr4|zG%edYk zWd-L5J%cCo1zu~T&>RuWHGI!U zZ=$B9@{qkeq`Jq$jeEZ%pG;S%@IvbG-S2y|L}TZop9hah=%wx|#G%l`1VQS;x@`~G zLpXioQIP9BzM?0vyGw+Lh|S}ei|8Q$5R7MY2n z_#wXI)dN~YD5lj|~NTK{ZdSyD_rt*F1zp3S1V`-^mY ziXd{svj-^}1a)Er;q}pB3)+Rxs{KF+o3%Y`M14x#Oq zYrZv6tQOs5Dw9eL)5&o^kNX?JsOEg{(+UsKykUAZu0UmilrLxnTNkavmkQZng}>FH zb7{2QUYKjOk()B9326f^I#qr~42Z+Ro{s5NT``oq6&)5K2>wL(z2Q~0a$N3^-<)GO zJKrC9HZ1VL?pl|A6;M?401gTLqHko9i|LX3(61NH24LtE?67@N+bJP!P!^NZ4Gm4c zyzUcJ7ofkg{8lKB**af~m&BqK^fvUYd51B{{=s2K-FIeL?;2QGsf9d1pWAu7v}E0x zEqt_KOHiU_X>Ugp3Ozufghz;lGc@uOFgYFT42x*T)ARR%P~i}#=y&}SWHp2i^pvEp zadKK#LxdPNHoRmAA?@PO!=8TczriDX9p=DP97~QuIB%%W(1wV>e)Y*ko(n;!?VB3o z<3HOQ6U_AX1}2u)J|QZ+Y0n!mxYBwW{kxktmMma1mcg$9VH>hI$L?vw7)pe#f{*NN zKv*@|9ZPF^-%f_ijU!+Hx_pXV2fK91t4#`f38b`o7G{Q=tG^R(U?uNcW z#w%%r!=*}Dcw!{7<>hth3@q_-;L_bgR7a0bF*FZ&$)f$f{6bS!KlyMLDrh3$<8_Q( zQbBLd;SbWtNRF2?)QPe%zayR+u7L&WdNl;c(hr^^@r9XB;=^$+)-iO2BY98lN z4ppu@aE)8lfZP)p>_G;#e^_p+GU#rx!>PH&w__9T!+0+d-Yk8B-Rp_a80YE>VA$4* z+H$VpG?bRw`}YUGAi=$syhHKKYX)A=2-C#I{5`pDed_*EKyg}Umb{yn@;wMuHk=YE z4B}smlexXRr7tBPy@kAq^@o9qego8CKdv5yRc#vchq|i(BCrcf^Dk^E#W#K=EOtq? zwB4)J9SvRi%;44tQ((>#$%g@qIRj+nsO1zxM(n8M32tc{6CnOl8D8Ft%Rlr|-Rv z=W{_h7jEKM95E?!Kyl6nNRv(5KNErzvi} zB?{ebmrTdL>BY-+t|xslnVbEVZqMl9nkqtzkt%OijdX?8#^*h%^1a9+KS!tF49*op zn%uze?&L6A(NAvp4_l7Ysip136DJnd<=tN-_)MkH#}}|r2bpLPCD5eDG%?r5yIqPd zi-ff~<`5yr41`bvobxe1iu%^Gy6RV&ToIDILj_ba)wQ&|aAfPhi9WhHw7qVVwsN}= zJ_2oF&V49Lu+}ZyuSv^IzA?*9Dvix*=EoyF`Nl3ekMTn!fuRyl4^Og8uUTc(gRf32 z-V5)zE$76bdnqv-vsf3)uj}yTw7uXoSY3#N*ti2Y5r)%%r(tWiqMomYg4}L4`XP>i zO@>lb8hqml?`g(@=+5UVtozjQhMaad9Z8~!^}j%b@~2vEdJiuVK<9!Xx}8j zSdMpHrdEcfV$IK!^gnIxNobh*$X~t3$oFZ;krJW@WO4ajI-3+kf_u`!!;#A9TX|$O zB*YgOY2&toA~djniOTcNj%QcB~F@*jbhCccghVf>05$`*52s? zr)Z3!=h5F3LtM(to@WI(D%i-PXT5j`pZtcU_@1ZHhHGtgypwq96X@?U8GH`;vudZ! z1d@KSN}GNh7!cDl_3+O$neL`?CUpny;rwx;EPxqo`l1>5h#qK&8)V&~P(OlpxSxq# zSjXz?$mo~9TR1;1Cz8w{7QfmshqP_gkDj-oE5}ZaaFFYY)y+NnTb5wJgFE7pDR)8I z)TLG-C4bnAmU_1%XXCm)1=TFc*s5EbF16P#kQnK8Q@wEUoNSeOyVlk!)-Ov9y-Q+( z)&Ph@2L8^si`q`6Ttkx0^>xd4X69b{((7&%lOw&75fiAH=mLVwdlFP&Y`X1yYglgo zK7=GB<3qS>WI@_4I{kt5V0}Ra5ICNxt8rmUVzwUpr z0)V?SkBf=A~<3oO9JBwta!;M8R`{|$oL+P!DFzI^dZ@Nj0 zHLg`n1Aug=Dgw> zN`-fj3p0AJftAdd3Cqf)%ihk1yQy+Xb+hdqHL;xpY;QGf+wsKI7y~O2%iMSR@EY^Q zI|@kqA4FPH&iX-c(E&T^*jmrdM`VT5T?9szLHb^n&dL zQec`^;6)&5D;2|UgU$fY{b2tX4k+F0>H_7iI^L@vmMXa+QR&M=`d%c&HJy8Nb7pm$ zTM0hhxrroUyFKC*74Ou|b~fbnyon8WTyF}2<)43dgD5C4BV_L%`ArdAq(c(5FLf>)#Jc;`1=ox zNpz%d%e8HyJDQ$h_3V^IY~x&aWRUH2pVX}D_VN!e%U*Z(YFQCslMoVzj5I@_hIUa| zVT}%FrA~t;3Ym381l%Xangk~J_<7LR#ML|njKzgLO=|%aN(2ylX4MCtuibn3Suji` z-Y@BeI)23J2j|KZyok@c^CkCNG7ump~ z(n(HuW2GL3TduBG)#|(YN?up?SG-NX7bD?5VKnu6Q!H#Hvz=8No-HSA-PS~8hj)(G zmb4gllJ0(wk!uIrvW684=abEK=hNT!B{x<8zaRr4hv7_^w#2C98mRrboJ*U$3%$|g z;xsb^Vz*AGZ?c2ilz82L`fgL`ZK_7`(>p=}%`YAH`t+1&OhzV^3RJT|ZS>nNv`!oL z4jW^m(izF2FQ!HmK2j~bId=!GO4vht1fgJ2^CG(3N3da?Run>}9l3FO7+&RAu!jzO zgiTNmxWm(0ce-2uyeBR4xF zMh$P~Yw2W?2hQauhSKcUQ%FvdZ+9bYTGXHNSS4re>beZs5UPVIO1Ci*WWqH~l$r|Q z4ll$lYCy}dguQlJ9|LR8w0ZKLFVnbR5U4c82-)hra+Hr_e00}#rXRj2R*^I@d7p{~8NZ+6F9RqVIa=Y`rWovMwH5HN8WA@!f^eoo(R zg!+bj=zKNp%DbS4z#eH*bXC3$f&`VY=thOQcRDsmY~7Tz zg}r@^eYNQkN_%?$Dm&rG(3McnXpOs{X$r4}Io`3Bq85*Q+cpqWpAUCsaTq!1mT(@` zum7u~q)hYo(j%AT_*o?gy0xUaS=Zw*zdlAfh{z0DN)j)bs(pjGtyHe0PC;sA7X%bei!q2Y?Es|VcitVSsa{)h6 z_tcK7k$1E|Gk9O0@0^K!l#KR9$ogMuDqrY%YOy*tJ?yA?d7x=_hx=xFRwv{}fCZZY z7kk7_755mRp3_k(ts`YujIMvfP-ditUPOD%T`*V&$195;l>y7JgQCvxx>upM(wJ&M zc)Y^HG4r$Q6aJgfp{hn2kEgr4`L9!-1(8sfjuiLsCP1yODR_!^CiYJoy@>_yz+GId z{aa-GI^E}iAMd=7HQHJDgnzDB&0CJ^ulY+H!AKGVt!_7eXI2^QN@C;n!ew%hF!2yH z8X#Ip(b~$JIc;;>-FCLUc1y7i45RK_{U4&QPF6yjJkFP3k�>3?ZRi!iOBkF{ut8 z%t-~y4xlscQ7l4BUAW7IMc}%$W4DhEx#ivM9a^Ks@tE-PlUjy07xaIn#EPrBG)q zVEL0E_h7_@!_L+zNBLGY*&!AN#Q}N7F_EXuWLJ|pAAgZc`+5gUWbaUXLVE72)nnak zj^Hs-d*_YE=g&V%nbSeFwBjKh7TmTk)LX#G^ZSBQ%${oWS?AGkIFav}-Qx7FK1S`e zW#|(NqjJ>+DpAc^e7eI+-$gOP7#DSdj-nQ(zvAdmZUO-(a7IK!5J^Ct;#-n-`!oaM zo&ximU$oy6mWMZg5V}5OFXg=PI$OpVGaPak)DoU|p)%$3eO^2(OhqVC=9$(To(0+- zqT#kO`1t?w;mzy+hp4fqu1V5eYO4v9w55G(e%jZm^Sj*OTyno=PaP3>`&F)K#7Eb> z?~5cm;^J=$_giFwwuiq}b*+mR_d?}2sPCo75MNMrj#*P#v?5b;JHN?y5o%dd(@y$s z9yNw!A9~`K=3eKq6BVyJ)OUgU@5Hgi5^1-Hb7Rqt>o*SdNqFDzJWt{M>H4Aw4uPZj ziVTQ=_zeEH2?lP)yzFmTWegt2b@zr(T8Zsu=2P$9KPyq0YS-B=DOgo3+8;s;n#i8y zb8;^dpe^M8J0*64X7=~ycW#t;^$U%R%nv%HuSq(EDys2+-Z(7v^8>yJuA3i+0HH7U zC?k4pEP}ZZsg#LME3V1d=dpwBC?!pgl8?cAGm~AFn@h*%O>Vw@RQQaU6uJSCpM3C! z&PvoVDI;dADi(^%m*@?T)jPF|{|q97L^SBGo^9$+2y(>lHR628XtFq0kpAVt_ep8R zi)E0)hYU_Or}h+Jz$cCMVO^te;fuTggapFvpO?xe`OB+SqVd1Oo?wN!D*o@_+PiIg zcEkVQ$+@Rf%hj>rVsj{=|IWW%5OuG#1mf2(l+{W9Cd|r!{9{Myc85ZqALy z%uo61gRFR$s=DDPpXW685`C&m`3H!!87+r`di?r^Vl!Rqb0PA>Vv$}MVhW`Na&wck zwlZ7_r4obv%I5D*s;8_rBRp{pY{MjU4auWptSgA|G4@&wN?*E@^njf$)}^g zwL4|BUwMY{EE=V7Ivw41T07~(Ak4B&(=NNNj}}>7!l|qJ_s@a%n(LM}(8JsGF{wWK zSySPZZY0NbjfQdc&2AHKQ--3_DV=TS<8Ix-INj)kt54vg?itEq(KXTmn*43Eao9|N zZ+EF*EU89YrkGtopibfL@i7A&92^cvTA%KMn&JnUxl%pzhsQ^hwlu-3+|*yelmaRi ze_4Z-<;OeoPRlxoSn$08M8x7Chfw-F!hda>J^| zOJwBl!2!=teW;NY~@&+f%y&Z@6p}i%X zxpmhTP2FZQ)RLV_`_jiz?8rQKO6Ky%(k?WEfbQgm;cN6Rzdi;4x6$XdE4n1-<<9pw zks)o3sr+5pPJ~Bhg1J78YaX(U>yl8$Fj?W+T~hNGzh}3im0{#5tl8A(|A(r#fU2Tv z*uM`TAzjiTpn!CDcO%{1A>B0~rIK>!MnI4{lypf*my~pOH%NWsd*9FV{J*t0tOe`L zoU>#0%-;LDepmBt@%(p(Ye>qVXAY-LECeEQy8*od(EvN3%YS=3dZS1SiPPs#5#!R` zR$inGRZ%7Gpbm`EV`J<(PTL;udf}tR+8S;y5GLm8d$fP-AcN@_T*^7;@@mig$$6$7 zz(hIJQ}ZeRk!fDm=J>fNGuraf3c|Ko7umW%l9&8j)-TG3Fe;dqF3`hn;+o#%)fp%; zUSR_V&+5<+p@%o6mrPv=Z4^vTvaKNc5;rK%#=>U@Q;e{bw3k zKGz^541~yi&DF_&$0*~TO8_YKmU-F>My-?oXJ zD44!2a+sl0ERyP9#J#cPOQRIw9lg&jrzy~?^i(g+{WL7#YHq{0G zxqyR!(&f#g#pYI#n-v5-35m`n>w!PTQ}&{HZ+8$N);0Xixw$V9#Gs=0R@v`_#ZDe` z)YOC^JIg>vWYB|kvm2tDWNY*K(?OP}kEZPW&tvy#=A-975X3{9{m0kz7Z?D1{ZF;E zK6%V4ZxFhQ|)YDE4v#$UrZ1&4f|mGZ%sHGlh87qCM`|WH7~PLaVx&>8IT2`C zy(VfZZmf6puS<)(P2}b6J3xK=?(;68kzx4^<9G^kvtud^di*KSZy5@ns&$q7ywS*SeaNXP6% zWD&%NPG*qF-B8H&Oeu~)ne>d{Fg94TTlShZWazi*7XMR|(>Q@;UZCq|CY20PSa!3k z?sBr0Ye1YUk-#WCqq}~B$NgXtPV|t3C=f*A!k27&R;ap`X02E*%f_LIKj$cZ|Nc4{EufX{-gy${^rJWK zL^!K^<&@||H@KJM!{`{OysJ`icKE&Qa5#Grl^3#TFzJpl=N;;5f4cOxo~hMwXvrca z;&UCR6HX`a5PyF+7ynBN9Z6E=n&OzBBcSo%e*Ez8h6$l2sl)trB|$~Z0DhgRZZg~| z3atuR+>!9ogc||N?4v^LqVLu{B?S^^^*|=sxek3moJcsD+2&xI*%PH#M!d;#yrw_?waI#<@Ji| z$;Amoaj11PXJOHQUR5-}Y`j!EQ88LKN0bnyx7Bm9e`aPT-)=&*$f8!4saU-b72M>8 zUoObnT3?@Vc)Y&_)s9#AKK}j)kY5uM58$)Xge~~rG|(MMr#28RqRq)@dAlP2iep{` zcyDGCbT1yC5(mp`IA%=R{h~){WPTH1wtD>ox0Ah4>SGhiv-jry^h!d#1X3$pA)8fo zQB&sHTeM51MzL~+Mj>(yt}A1%Ko7_s`!0W>O9l zg6#U#-@4*qHi6W7E&H@8PN@lnT2{V7&TsexmKon}a{EDX8HDWXEPd|#(c|cBbY;5r z8ec_?H%O(BUrs}{-N=6A?Wb*Wiamo9ye2=ra3hd(t~TE}Q3FMqk)e@L6u*2#K(x&8 z+jMu%MYQUG^6szgn)uX)A=!_1e;ziOGk#cxD>#HqcYKjq{CZ=i#Vl_wabPoF|1Rz7 zhTR#t*Me|wBKy?~{|Voj{iB_=x}v9z!V$H!0PIxkL;4@_>=R_AzKT>SCz%#_>H*e4 zr#;8)+P{P>eNuI|H+zJ%#1u`ntDn5t-rpp-6+Oy?%r!)idMlYeV=JO!6rR)O4ENHvSb?m{RHmY5O3mq&Y#=cj~eRg=&Vx2 zsiFwsO4lQY8Rq~$IdaSrYNJ$e13Gg$SJ|jzojwUZ9bb?f%-0z8SHAOL32@@^*=#>f z(e+-&F%BIg^fHWhR(9x^Vf)v#x2^hOv&OnY!$d*T_0-r0x!skdoC4ct+wP-E8iXdN zl`fvxYcn;^s9B-W@XywiuO87uAWz)x>U}-mFJr5FZGd|2BoEh(d@|xd89i zHtDmL3+7h7?a3YwEgoWe9l(Tq7;Bx-`+Q9ZavCI-15N`>)Hclsa(W(y zOfuK}&n8jgxX_>XC*o3WmxiH4tEUWouLI~m#g>O*HA+Fk!{R14_<#-klOR=B3&B4= z9h3hN6RZtjDEgvS@anmWYKIPlV63jMqgjl8PI5L9@;JCk${(!VRc)`;vGG1p9!g{9 zPlP*qAyPmZSQ8+*F6}Pjw_B5jHp3lsE|=WZqVgbW_`A*lD0b&?5w;Xd0iyD zrsfW-GGpN@f%h5dk9(%_QcXB$F_o+qgHje(I@8gOEJ zJ9y1O^B+&tNo!TwlJvjZ81j@+R3#Gy@sMYgY;D1hSuEl~eH|3w&{;}`=C z=kgh#CVzritR@Z@*|zvvLu7}MJ-xh-k*&+Lx^n<$gD~}!PYuJn_l$K@2E`7w10guU zELD)ziI98eQ_Csiyk7VyGA~5tx6GbsdjM*^;-8kCV@d=N%3z1+l3|v*fIBqppvDs9 z;=;DO*nE9X@-%g*gM)_H=0=BwefEr%#qFfkW4h&Grre@p3AXg_w5u)a#Bs( zTvMPj)C^)1jv|^9i$DcIfTwGO__NZ{@LW`ucq3^2_^^p4;CaA*xVCQl@HnLOpa%hV z3+)I@^4!@{%h(K<_th_%7%uki%9xIY$ZiMV{PTx(R-`#Xonk zp212(ydAjz!or^~o@2Ug70{NNe3%(=xzCa%U?()+WX0K84R84^2A!(oLiOuP{u{hj zs5)o+Y~|{jqnG(cg(lGp%Wj%rns>N_!Eco+33o5nmg>)+FwJ z7Sw#X6gy$&5|H-`kmuao5^ptVeU#LJ-EEG1Dl|E*K8smF36bg!)dad(15R@p`+6f{ zGA5W!kyZv?DEd~Yx>#C1WglK~1b;9K?{74pmF6LxqsWUSO)*AYcSL2+~(^#v&2B=H3ttnHm@nJz|T6E`CL{80|S z_T|W8^ry3zo8NjT8Xa)WYIMH;nJUZwqIWu{Eh8iAYQZ)Opwj1dyGvGng#S!rjfPy4 z^m~a}dt+mx({c6XXa0^(b~Xe4RAw@CnW%t)Vq?m^5QCni37Ga>jYL%gZpgbseF>Dc zU!G-gaidNU&|U`qtngvx;S9trA~>i>=l!TjkACiZ3V5*E0n4qet#>W<)faxkTqGD3 ziw*0wR=qzcT%Y$(@vT|9oRm!)Wf4yl6|8?7`EWB<)gyIv9w&obHct_7H#_^faLZ0> zS7`p`b|XYN8TP=?9eSpvxGvFqAez>H>fQ++qV>%D*#IR0 z>}9G3cIL@?c*(_s^lY7LyJ{M>8}pl=HkY4H)J|MkRH3Igk!#I2=?k0etQ)56=qNVI zBQfn0z%$4aEumsQZ>UbHK^I%FwliE@ujQ8X0U%_4nxOJ`TJpNArYZNO3etRf=%$Qw zZKr7+^}RU#-1p*8ZDo7$(s~Jp%3Os@F^CK6Rrl#{U32dJ=T!n1PJ3{wHaG!>-Pln# zYzC05&!J1U(g9yF?X&PN=dmjGw%ljpDOiPpbf}NF*te}o`<|;sWCV2$&OccKO^Rij zX*dKX!9zj_9p@eQ&H(;sHv8_wp+Dwp52tydyq3E%Et!J_U}a^r)xVt;qumo#?V6Q| zxsORFh+sZf9AU6P9y$rylFFYz(nu+N(!d>LXk=vMyFHSoAGX_8tqJTJ87-m4!v#oq zuGX&+K{_*%E=?_7bxRw*7}_=NOAx#K;SeXAxlzdVekUxx6lZqdJ1k(kh;2E=W#G~~ zL-RWOyq})QpdL?0f`$W4H>c1JX|ORtau<@*+ab;%7NU?w8F;KT?2Z4Gg51r6E+e0Z z=8fWL!B(-^CQ7E2gf8FvmP{t=nGt}z!F?MEjY1HvYkznk9)vzWBctPZ48W-tT@PqRmRBBER%L0{bZHewS) z$A(m&>!iInWuO#Nh*MA0TD1`saLb`O9u@RiTdO`Y5?oPhK~=}0#Kpk^e*pNOpR`B; zp6#ttf160kLBG)b^8mB`8SA4mlDMq>tp^_0>FY)R3(78`Cih)MW|tpr5foMXoUt`e z#B{DMCW7y-66_ZJu#n<8?9roU;#-tyxL-;Icoqs)Mks^=&v3{We6R+7y z`DJVpo4n569>5lK_Lh~EH4+e|(SOE`u%BzQ9Kz>+fI<-&8A8L;)$RJsw{dotpvKkz zqc8=od|~;#*QBZ5)-C)QrwExtCdb1dk8tyMEW*>=PpV4pZLY`ifhxHtl%noQZ=EZt zO&orHGf}(}z)ktY%*cDhA2cwN(QQuQP+~A4S{E4AB>y6CaVjeL>GuI}ZE)>}Nz87{ z(WGthb4GcO%}eU(Wogev2oK%2?ps7ej+B;9TJW`iOtd|PHA+d_h7eKr9tSltBsk7l zx>f9;m__zk1f-*B*gsw9gHl$5-zABjZ8XWX#TgYrHCq}#n-|h|{?3g1sRjPnMnr8x zObzP$qu1t>JFU`PnCE9HbMPjd< z``HRuBv;_$6Eiz)N?KLQU((<%19uqHPW3{;(Vu`I@j|l;N!dW3ZP$%z!}6SsO0@-agp^)6#0NtDi4muDUteT7m~c$}UNQ`mL3;|iLu z+2ni7XjOSqvdLm%ugALb@*4LSy)7+# zNv$?E{RywXfOUI512ciygU?gfph&sd2839FE>pLa*{*q39>*Ej8$PJ){1th)d2C$# zis{5-AkbXxDR7ynjuAOzCm#_J5}9MtAYpkpU~^6lPP67eqmfnoT^>m}l9A$h9&_D7 z^oNO4)}e&hed}DE(U_u3tixjU4|(@I;BqSW7Rvs>5;03BTx}zM+JK zw!m{@K4gdOY3VgnqC-}4xYCR~S zsCsuV9x#A|7LvA4FUw)s$)9CP3#?10UzI9@3fUuL#O2{?%oKI+7DH|tHcn^b;uif0 zf!Mm2oZ4@$&~J8D%h9SHWCNa2wtvDn!#$qQsxuw6(H4wJe!C^){ZnUId4Jjg+sU{& z_-=LFcB$pfl0QH+S(2%b>{YgFKVC9=){|^EtnX>gSNcLtl~S6ps8BJg0ia>-JS{wW zbFGhouTpW1LCdJFo^aZGIT+(%hjTsX4zzSjP)HnEb!s+5*fn1n#Yjw#dF}3%GyhVb z&~3~Y+}_hM*rDMers&>4Q?|yO3fL^P_q#y~_)8X;6UxKigAZkA=I-&I$W~0JQ>FZ) zb>iW6?=;LRk(4cN-3G^R|AN!}jA@x!l!a6;eVl>Ts9>)@-r>6;Sy;4;^J=vgK)e6p zdf92rDz87i)^Cbrwv~t*{47c84e?i&W?b%-=U(Qm!mUNM_Ue>2$2K9o7I_-m_P2ep zj=%CU%3Ny*c7EpxXG_ayqKgC-pT~$+6c{LRi?Y0xp?ITXDqgyoCcR`4c+XHz!RA<| zQTQn+x~Q3yDJ)K&6210rq@LIvFuh%CWFv|`aUlr7Hr;PRWFv_=@x-HP&)t~X07sJ7 z(s=_({%7xr84ukf%-(~Z%=6a}4$!*F8daCVZ15E!USDQr^=nGB_V`FrfHxY#;$nbP zSf=p0#|2zuhV0Q79d}A_CSa-3=7XIQ2aV+2BA>rg{Pe^0ChwqaE0`8QO}jsE7QA*n za&kIQr5Z?e{J!a%qP9dDK;aFyw$_7dirr54o7~6dHRWnrg{MFG{|v z-CQck?OSdi6P%P}EGi3$i8+x5k1Z7W*tkr!IC9Bx>$VkGY9{c!&a!J3ueuY79 zv2qQX;sn;Sv-5}Ln;Upp&}J{#VAGzLdezg()9z%5LreJl=L<_f%BZf_7Mw%T+kiaP zDPHHLp;$70b)EL0z<$t5HV1A1N>W4RJ+Lasb9h&w{0}_kM!#P2@}^X!4i_mmHo9|J zr8X9L2S?>(D&iWDKUY5DB^mPmPG8&F!(G)88qay4_I(H;f9@& z`AQIMYNisUXYe6Qjy%Uqh0<{hkH%wZdR(MU@J9O6Qozk|wMI_; zvMeP(pXL=cMKo>b_~RrZJUmx||MY!hWzTZoKwj$T0FQpa$Mwv(cHN72^~RytxB=M6 zm`62r2LO9^y~Dgr?d~tacTE^QyEK9#j4P=E(67S=3l$owVVOc7qAxa*u98#eOuu^W z%^`!D$#;U+KhyAJMZ{NMqTNxN!zM>fnRA9yY5RsaQ4<+x5|Z@0t!!N#k73=9e>#8H z8ofpQQE<#kd#iK8j)E>=XX&9-{@g+qtpsV(oD(?5c)LX!pX3}Y<18)~PEt18S<7_n z>*bC6oG0@`c)nq<_V=ZLT;^U^kW@9r1ARe|fmIccTooU#+ZWoSaA4mcC+u)_zq5`N z7(?(LpJ^>@=69;BmtR@AJsL9N)RUgXTpy)_bRuaTq!$A8d|VZ*H_ zz7)8&2DseY%;j=oTkhCz~_8Qd``gF~^AANj;Aj6MKyNqAm)tbhu!JekZ>l|iraB;1R^)mq$}k_Q1(=Rkpa z^Vjw@kPfz(&FgGj{v40?gETb`xHYuTn!)3mk*v}ktjZ%sk1JWkEBG?JH=1Y&dWPeQQ@=r9@hFf9Dum_ZWYBAgY=K zXRXq{rAJdOR>kx>-mpTS6G^Wk)pjjo!;CcR%1n(t9}EpH_-410A*8@gAXvPs!$LRp zVlM1U)F8MRi`bkkL50&HJ`gFvAeJFeK`$F9Go+2FANoQd6cJo7KYC>O-Et1W<@Dt9 zqC>-ZZa-Q45}C?M2bwu$IA*gVhfFaD?!q``>2rV1XBY3Yp-PmaB0OKEe<4PX|B{mv z4=EH5r)?;29vM%>VA^|($Pk@BR!gz{_Z#oC;={eQ$x7oW zrv|S_zE_w_F0SWJoNf!fMo2N4(cpX%tgIJUL|TB=}qN}=UdZ|8Mel!z#>AU z=$0;LWn?P0R1`OE+E;HpKd9CdGsiN@s>CN*;NyxcPu-WTb)6H+ zzXn*h?s`m4l;XwGY&i84l5hqBXt?}14L1W^v_W{skzvepOb)nAONr+E=$HR!~yl>5gz+AtGD?Bw;&hCJDIUca8_hQ!)t7bC zBIRAJBfs}YJ!{)bzhVz-Y)E~MT`s47yosqyls=0yA&OZlG%Vg2M)E~x_!k<^w>7S# zmSVMw2OuGOA&TDsGQj;l>Z!y%z}0}>``h8hipTlTu4&I_WHOe>S*2vXl<=gQNV?Lq zY618URo6NF3l7NgQfpDm<+nW>yPLh_ZD}cKuw6!B4%);eWE25ey4n1GhK5E7 zfCQz?j5U#tfmG?3CGjvBgKvL4J|%_?UC}H5%L0m!2cl#pGqE}XODS@Q80xQVbkRzG z4c(jkJ4OGv)St&ZJCaMIgCdW(!L4}5Y1Guz6mgWIZBsF%yk(GD^sZE2q3j`BE>sY- zp85m=a2e@E>`q_LMGLQte3&}^$Tx8UC}8eYkk8ji4K_W>+0WxbzP`4_5BalaaFxdV zOGDII@bs`d&&c{n}M9Ker&hn zsv{0_J|amLBH^*kOX1}YLf@YYKwmuTo+kO8&!Z!9*VVWqzh_vb_W1RZkqql08@LaU z%7H39Lr#0gbp-+vR=2dh9CFtA$b{TUOY2O!)5>dJ;+$bmI#c~@StcV}#U{teR?AmG zU`}%8^MPSzw4(D>! zZ5ksMQknjD{j--UF_nO>mf5Q)))U&M_bX|ObF8yAEkb;+pKtO&L4WV9~`o;=8tCSg`fzI{G1)=uUXq2 z#``n56NyNo#RFG0mlisN9W~|E7}#uzdFAx<+(wc!$0VekQvV~c>z?vb(Mrm7#>y_} zS@2o7+@!-iYij;lU0UZmi{~Uib%v5olSX4;J1=;zm%nl}W14VEk5F7%;@)0@YoUE{ z5udkd2MdO&6^kzAwKv~1CkddyjvOYXnl=sesq1Xm^c286I_;o|zM*Skg_L0qdlhjCa=NtcZR?%;M zQ=_azr-$#i7sHuJepBnk#>TpMd4Y^~F+HP5^sWFl&{;mC{{+Gdc78R|Oh45UV+h3k zY!n^owA{khEFxjJYkK)c@%B~ytWs$k5~(647G(j+NbtIF6+*L!|_J>Tf|Kzlo|i6*#&VZ~yv zPU8*{%fLB(&{%N|-=``fsXfMGUA8x};LM(T#{;poFgG{f9?l?a2)K3YTtDT5tbt?@ z+x#zIj=BIIE&r;vPvFeI)9S>U=&k0NyhkbW0f?r=Hm;J2d z-OcL*l^5PiQc)u}L>*OU*_22CZ6Bd@4LAt6)HxIy$_$!TOW0IO*wp5B*oIHrBFZ{m zKkH&+)8qR+xxaLiNrGN z2!2ebtEUvATmu;jsUV_N5Y)cafIuy+rHNP9#kXxyU_1uaPnC+O>kLcZy?aUeA1se!x31V-VQJYXATx=D&=f@JyPp^PIp0tSz>nwKdey8o8{Sn(nC z$08-6Q8Srr2jq{Nx8id$y1=I{hW=1pjLtR9x(W%nQR~WQ2ksMAq{GHC9v@Z%0YRq= zHp_2HD}2GD7HB3CuS$qtef!=wphe9i0_VFsZmLIc)W&_7EkCCqC8AIBO|)1?@NsqD zF8<>!TQR4L-!f{Uc)otgggxdwXU=-g80m^dC2p3cqzV?kYd5nzDChpfZUDe|@fDn65+3;Sr^X0Gq5w`#?4nse;!+arzM0X?SW{lw2` ziaP@M%!d9ezV)jIn}Uv_2IZBwm|+MakA5^vnJ+S@P)8I@>u~k-dM+=@0|373-A8>I zg4QLYor42(US8gY#>OAx<5f!eudz|^10Dw>1*oXtKuU~@hsU$kA-41oKjx-YvkRKc zrw0)fn{Y$5M=j$G;}A-o!?ELDmB8Nhh1Catu8sd_2~7I3O6h3#IcVyCljqgz6N5xX z<3)j23uu7XR%x0B;8(jRthc~1h6PS6`%lLk0z5L>thI7#vgUbI!982hLTV+_cPXPm zp!zZiiOZy%F>y7cQlaSTx ziZ~xwRc#)xsFtpJYHe=r3O3|37}YagVI(*Magu8CoM_gvm z8qiLA*xztQ*6+=|$HvdjqFu^437aWEaA)4w;lf+cIq&}Z!U##JoFb#-N0U{}%GxVg z!wU_gNoXYLu-_C@voZlhug=qSP)*nnotCk}Sm@g}lVKdGj*7HS@vNpg%+4mI%)$Ub zvJGjq+ARJ454jp|a6Gr8jY~I@1eVi!bYBh*3}HW{jbP7ysXex_vi`vI z6JBpNPJn`JlUgWR(Kq{sh2XbajTHP6a4uB-r70I(0Oj?FT>o?^9GuPf4s#xfa&@ZL z+~mZ&#BWQ_Uurbu8h2T{#4DbxoCRS^9Hh^T4WYni)Y&oy;X4oZB%q+E9Oz}2t69}e z6-Y}b)w9&;mTz}a$WE27XoNRXX2oS?%yj7z&2nXw`y}cH*OD>gT4ZC7*bB!!0Vwwg z2*E4JQ>8IZG|RoJqVJ@X9EIvV^hc#)1ddzXQp;HAGaV$sn_KHhq21Z3KY!VXoPzSn zXCF<8c~{2Ky-9xRQt?62D))u#HLiDwd zmsYw@*}Q~AU_BZcsPmf{G@n>d0t*%K*g0vx3P-mIFKDasyr0IsGq~&$=#mtuk`z{V zc2K~02|hu=l*VK08a)dxl0_+M9KKjdLqoE)wYB)194t_P10OTscGn3P)S4{3YEUl1 zFl7sYi-XGxT z`a5qq>2idL-S|Nc%2$!bM&HLUY(7E$*BFNrds4mA%6K5!yW?=SrniG_sOuNkyClsm zXTlK^!?C(RWXIXIqQIMVy2JeZ{1uaLBqf^VaLnuPqjW07p((c+!kYoFOL{CaQ2Tdw zMQzvBhR+ssT1SH!WA#>6*+o(4&AjCsX2V{l##&5fJX?j&~c*?fo=10#U5g|ZnJsBuVZ18h|zUJNB zm7$0;(2QOGxDa*+$Lgp8vXwi*O%*lEN-&>GfkU6w&f2EnvFaw$L|^qjSJcnDIEvBx ziy2cU?3*pU??FtCbPi^@^}UOja?%LXrzZiHCk97{O1IaE6RA+ByAU(*TrVyDv)h$T{?;-XQ3w7b$-e5 z@arPB-#Yb3j=*`AJhTR4wH=FZpi-rIC7<>4@N+759MDiK+rI0bT}Uf+9;B$OlB)jQ z$>Bc8>$p}uTKn5fOM9fp#J838t^_D>#WJ?r6NcTY+pVfoxfjULJb2q(pj0kodeZlX zZl>IT`NS=mN>~RgY2?}W>1WAi*ei^Y+F7BD$N(EDccWy8t%iKM+i1t@#!;4_``bxH zZ2sFjZD5zHe$qBeU^6IZv?v?pRhUPzKT-)A2hCPe?J>GVbGxj^MP$Eu1~AkKrya`} zeFnGT3y5g^Y~x&Lg90zPX|M$HiIMUVX=`3E#Ua}e+DsPzLQxrs?UPgOi9zedA@%y8nudof`o?$*I%IVXE~RxA!1Ix z!B3UTaoy5k5dnC=3k<^lF#Cfr<51ND)t`yJ(`3^Hfyo_agMa!6=XRj8Zu4{ z$5mkVAsRCFck`Z45#X-uHv#vpp;U4}ltmXAGCMm93HHA}`V4~lNiO^X9YKmE{QwaJ z4kA!^Fwaby401;0_f5);Iej$WAsq*A^=W0e-03lxXB&1v9gtP+UL+&ZZ{PpKAmKW( z(X0C;lYd&FQKW(ZCKtiPLy=-`0)o!K49E4s{3I8v<~;B!cfgy(B)9nW9f-l5#JsLG zFB(lGoFS<@z1POk(7p*dERp8G+wH;4HgA_+cCWDoN}Ct%)fi!ZwpRv+pM&>&U@Wk1lY6dU`O+2@0o7ua6qsvMAp<-8c62I$noJ z%48C89U#b00VJ2R9jGiW8YeiXOcbBJyBa>s7hTY5ZQV63+~CIK47Jt~nr3O#dYKI- zmm{?6HkE~EMA}qc`qXh~aP62=sX^?EvO3L_+i7H-u zNk%E7xjR?&v0tQo z8WSDC?-pt(;UMJ}Ug{}feOgZhE7p>JhqJ}xu1ko*q}!DswBMHKhKF_^_8!{-Oy_zq zu_x8#1E|SGZpw~&>fX;PSau;l<$c$B`I_$P_NL*ALBE-eit0{9C3Y1z*s|65>8I6D zU!QIZm@Tsel0vmXi&Hl^4F@%^GIDYs`1$y5T&=CQc*VX-N6NH^@5V*PHjthvm(wmX zPC8FbJPs%^W&Qqk?6Y-0KD=?YnNPWwsMg*B^q6t)Uj8xgYkeHoF$tWS92^|n&v0)0 z4D$MafU%VqdU|@hV4N3{LVuBOmjBj0K005Zt-Gw7tvjgyZFf?kcu}(bM#KC(=^GVf zgir-vkA;NCQ8&gcH4n1azj+1;m!P5zn=~h)&0KG&1o89FM1$@d459tBhO)*UGa`{Hm*r*bldBz2{=Uwf^7@-e4-RLW-h6|f7`Sfk zKt5f55Zqs*!&71SU1nW$MwE$DIXLxu<2vTkpNA=bUe>_fBaKEkKer)h0bp}YXmDB5 zP`KwY;-H1RO_3f#D-a=jx7$^7o8A!RelPTYePEP_t7JLGC zN6};9Ita>*`drD*ADV!}Q}~aPRZyz*OMBv8S1*`nY6_A5gVEwLIu#lzm)&XMtm7}j zB}zYtpG5p{_0S6n8EOr0`1y^rc;%Sm0|zP`TuiXe&<#MOywYfm#nZl4slTftkw3%%s>PS;FA z2;Fa)aLdzM;6AbQ1Hl`Zbw(BPf*`mGM6+Svo!;rxvwef1|C)HJW_`PzTts`JxC>a| zetIgJ&4!)ylXQK`O!mN>bf{6+_-gE5+=3|fz_SUuJ86_@p&%=FPl#;KN_$hz%vwsq;T0nLOLO7ngJ3$l&&6P?_dsSv4uTbMZuFzWs zCgE(&^W(|Ho5`z`o5?!=Uz@mXs&RCMALM&lAivqo-hi;QdqkHD?6;397j~)%j|0bm z#-n>;D&BD7n!+F+ZUCN*fA;@BGO@b$>7!8s)Oc3p`O4Gl)tm^e|2NsvWWDj!e76cD z>i(a%)ghPvKS_ny7#HHZvTIu--|G3kPC*=8z? z9_jk`p`r4wqM&E%?;G!d6Rc}$R+(zr7fuL1R9~bq{te!IdQo$Ul~13bb)n!tYnsR3+@_rSR}SANHtHbLl)sDe&KX$@x`;+!?g_CuhZzxAX-6e9(NF z<}aTA#$vYkrx5GGkpW+PYl9QE#=rbiy1W*gR?`eo2lZ8d*8fIvE-}NH+a>>32yWes z;{P0Q8b}j>11A;x_o_*kVGEe0}3yyIRos4&pIM^?$8{KQR9b zjWtdvQ?vG84>fq?JmE8)G|9=e9$oHdm$%TOwDX0c;)WGqa zZYwItvi#>v&d6E+Jqc?ka$T|ZxIfMR8Wp3}G|K)(tHys)P0ujjfC;TgkiWfi)hiOD z?3?8Ee)^|MpXi>nSw zByQ32aQ;&*_1itg(@zFmQ5B9V|HR7vt%l*JgnmD}j1ly|Zgk*pD-nvzl7pG0f2*K{ zT$%>cWZ~<7J1BX2`AqKrF3{eBgdp+%c54&M2BJhEx0L|?uw~1OAHM%>M=-p0n``iw zNE|=`%!d_v>@fZdMf=;-Pc{GRu)q^s{^pPE^LCI}Au3<^%j72D5f#F+`499G=m8gY?fFrG z>?cVkm*B*t2`P8JS>R2V{*Y{!N_?U8cf4>>2ZmR#u#*R^Dp1_>m;8U&>bEhh^^v>Li_|`l_QV23RIr;JV z?Y$`k0Tl*=3lI_gJwARa5*!-7><`_)K!&`5v@tI{b}uiRkmKXyQ{v;-GQWJeg5cj{ z$)TqM08f(OW`DHvY&BpNo0DTA6^{C%E~;k@v-VRy*dLw(|3Gw+Oapawb?K>IC1T@} z5D*ZcuFydS)!a}{3rE3}9s(A993qxjlhS-*|Z9UM}4+MZI$ZF!gdQVRjh83N95?xN}Q1iQ=KCeO_G;S z4+WvlCMPGWk`7*8Jihlg?7XgPQo_L}V6w>`rD)I)m@Eqg1FQ7^z71k3!9UOs|GUZb z$KT9K#bhQbF!R0uoB&GYk7G;72~k;Q06pf!7I9yp(1~KZiLZ9G`pj?Muk(S)(6ZAo z6BCeQA6OD5gLHV7`*&o1gxNhpPeYhhOLwfiP0epW`AL-0)Gp7vxdjSNYo#49rA}hL z*3O-{<1cFm!IgLoo$Q+Gd$64 zY_=&NnUGwhT-%kfPdNZru{NWRPs-kYGuJzzzK~(gCq8I=$cyDZTYi52m~=1OXaUHZdFjp5|HL`{N3T}=U2gS zi~;6;2eN?l^$T!d%&T`=L+;fsOt67mExAo{;5?ikif_v9N+yV1*$SD~PC< zD*{xq*1*)hI<0T&R#JNDsNr9hL2C+E0nv~(r&{UMD;Ad6Qc$SO0O8e7`{zD2{%0^% z^QYG-vMU(Jo);EB25bAnP|H^R`dKc0z$qMh2B(b*c-4AvDc4EN*!`Kp&J<77PgcX!wV{@h#~q>vd`lw+*>+C0bJBfqu_- z3k_BJMH6;lj$Fm(eoJr2WJoz`oVI6(TSts)m)%;iIR?%HX)`|2O4r||JiE(_YJae|VKy{zx{fFI^_6AOcvhTB3skR z`EEFEX=K)>B?3G=>L+SFNCon|7{D@FS1M6z-0D}LQsnOh0rMZ^ z?Clvq)dUsj8{HVm5(Gm>vk#Wrm-h}10ur?U$tbt4eN@lC+}pPTZ~Xm?l!4x0dcqi( z#SoUfIz$_IIi(}52D2&@x~~W06B583Cum297%mZ!+|OuY$+PqGk6W`eVB7a)Q7Ho` zRAI$A3p9lGp<%I((iB2IVhoza*y;mMqNiZ;AiekDToR^%NHRnW4dPI!zN`Ja35^lK z4yji2>JDnvl1Mfobq5U!EKwTvP95BI+LAx+I)j+zS-7L z8X_2=_yZCE2DI6NgOAtYoE1JDuyt^-K=ZdZ7{hXMQc`$D>F8`8PxEEBy1*~wYVfe#~63bP2Qt=El4BV`H`9(FA46YYS6Y1BP6x^8MC zmqN-ny!N zP6Vo)7jW;pu8>`3C425J6GIBct?1}z)Nm_60W=T zT=fIP6w`0O+6x2ixNx$>2?Iprj|hd~pOqb+Z#<@D&mpEW3{H?f)FU*H>j#mLjSSaw zRD3)RGc&W${rk7>-X#ts(#A1n@@q7IrJNm*!r0^Fr;y=aSt+Q*^b{#4`8{pi7IkY7 zwq;=wzl|oFZ56NH&&Zp|2H4;B0B}%-qrVOos2J+>=F4eXik87TpYHunJ3|fU32bm6Nn?}B2s(9V{O8Zr@Nppc;It$LLd#s9j6%89r8!4NF zfke{$p2&2f`Nk?TW@EC{A-2?!#OKoOlCmS(2T`W1kk8dr_Pk%ETRMBa$fViVXMZhW z74npQnGpDNLlSfL43yv9zl-E(K zYwnKy3uc=u_p^i*SB?3e_M5(u`G0UB)~>LT*eXoVRb@{9T!wYesiO zN7W?YP!8sw`SVHG?p~d)8?%gx{E6nkl&e`R`(kaRSCok$rIXGdK6-8Z%S{3_I_Ot}zE{%2-%t<`hcVPgbXj`{%jVo#v-VyYhdi%m1_> zSd8Rz`KYDhu_vyj_eFi<5E6;i;d2E9)8iP~Wi_nv@Q1KlSl99z>gr{sw+LQ}uaz$jGSQifzU`Q{-vJ zJd_HkDycM{{(*seF^$IaBvJ#&uf#yQ1!G<`knpZ~J$>mbH(27;&n7*6sX0RnA@ zT|D(>C3s&8FaM8)g#`f>fT4F$PZOQJ-Q5o`p=cc`drk@~6dNLG`etTkXi=INhmnw} zy^aa9>7$_h1Nh$!e4Xn_5aQ(>m7Lt^;P?G!gFlATY!fD`4J}GdTRW#4rXa+{UB3id z|BD2~gu$T*(72Qltp&UJNm#&=oIkBfa$i*&Y;3VZW!4Jk)oGd&d~5JNhXOk zhKjC<4CLTJV3LY8YB%cx1W#kc{8Gvf=tsKXwvd2~@0*fjeotV}6oD4&3KkX}>3j{H z$6Aw4dq(5VSFvvcS5OP^nL)}a5pGa9E(RPn1dz!JST_Sa$4S+yK#ACNww9Eu7Q`)Qyu<1@`XWv=Et-Zp^ErqT&x6g3|CmT?mGLFsFBMEBACLLj_P5ir z#k;}6_p3TvWGX~O_rc~>=S{%N%F1Hl;P?TDw+5u%XTK1h82(V3zv8yC?*TBf;U{KU1aR<2D5F} zN=kSWp(rVW?eqyME~Mr1cQ8a-b)2YwPESXNl9)OMiHQly!4oWD0qK}7C1)e0o|*?C3}4!ceHmeL1EJ4>r9qzoPaz_B}(!$YHgeTt@K} zl3{6SdEpG#ZKRKnkIv|5ET3szT^*#D%I?Qtt5Bn*B?=B$^M@LV2DiZwxsb=LLk87l zK|w(;t>-}YZu{`z&r^t;67yq#K$)J=Q5Z%)f%0R#G7>(r+R*73r4SR^*3yCr&jrW| zIlH9Gn5*2J94isiA2=)7slJFXfFS5-qJvb8-tQ8y%h9}17#*FR68N~dE0xeUCW*Kc zK-xLi!%XgxT3ste*rEGe2H(rB1vDOB`pdlt2?=FAJ*(0(vzZxr%<(PHnM>~kWqOF` zWEu#DqNmhHXENuhXiwkYo8x7ab3NET@i=vi?#bsL=%#ygkaCK+=E>W>yLg;nJ749p zgl<3a?XFRFe>nvB70x>!xy33Berhx2O=vE2d%O5AondQQH=T@Jj?8NBQIv;qddAbe zdsg=LT%XlgpYc!z5C8N$`uFVc2*S0KrmDN`Lnm(Sgx1TX^SEG{(OhH&TAoaSfRn5(D|2{=rJ z!<|Y^N9XcEoum)H{U#Wc==skD({0wvcjr)veVHm>006_R(3VIHjlwb#?s&4{}^H$)m>>;HxTz} zA1$}DW7mGj)}qA2da>Mt#%)w5<0M5BXh=)Hwh(z3|L}D!&6{DiWO1jx?@9@GzmS}qd$aMbI9 zh^J{P9P!X??SUk#7?u*&Ix=04sF<2Eq=oY0RVt1;CRc0)Y#NAipPZaDcXbiKM7Czg z;ARK4eOwu&UJ;t}j`j+V89|sBx2~>kmqUM6gj&8PM9~rfS6)<9X1?6GY{3~#b9P6I z)!d*a5?kl~o^I*)qJ*bE56cfux^u}HCd4tUHHq5J3yYRBP{`AWeJk$0m@?M8xUxA? zX*f2fmNzD#Xf}hIoKL6fIc8K`Wjccz*A{#4@2fjT0Z`Cm|F%338eXOK(h}r_t%G}Y;Qu6kYQM=VWy7phcp1?3=1`pIzo=@`gQ5-{>;8g z=gULPbhRGc2vwXDp30Bc;Hm!Ib>M1t<;og~AF)RFPvN9l|KH>~*U?UK8Y;Nd6cyXM zvmYmFM#sj=LRhps9HBa=+xMDLf-f@?YxBp(#*Qc(K)bYMqUR$R#Z|-Ld5LG z$|9%f4(7~$zWoB8=ycfa#5s8DDtB122_PyrbI@7?z%kjJ7ZZio&@KZN>l|m%q3}jt ztG-W7eZpl_r}W)@lM9*C$}lWMn4i!|Fr{$n<)VEXXz3pg+*2vuWKY*QA?^)#W;)NfBqLBW%d8j*f}-zkiQpp`c^}!`a?? z|HML=Z&pp*S?6J)Zs--g?VsPY28l4Z>50Cq-FQ&RXhpO%G$l}pYrra1 zb={mYfYj+bJNx^Zc7X3`sH&#vmYBc6MZym>s1H$#E>#o#`MTwydSdAgEm=W)zwWu) zko!5Hbzsn=H4xz7d^?6PY()sxd`aDCGY!%Z8K6;dYi-uS0G1FvKxZr00Q;1hqH8HvMtF!YC6yWo) z1yVEY>VKo(cq&sW;oY-rp72hoOaBy{RzT
Fr5kEFj{KLd}i=S0YyjrF-iEy38z%x7Q#=GPC6Q8@aQh`j;ct=p}WlV<{`GSa5pxcKck z9If#tL(|sC^}zD%aOc@i&z{&c=0|V1{hlKDlf#I8;6Nq(Vp$wjjq-l>{JE!1Q{dHZ z!kgl!-t8Ya7XVf;2b9N}F7klf=jP{2k{tl;@r|GF3TEFv-kl> zrzzk+8ojgA_{N%glBF}CMIwbiIrmZ^iz)jBj2Jf{!)?Kad*xl3&t@s5}o|ITHE${?C5K;LVs=wFzI#{&@^+0{usiAD^{A>!`zc zKly8ZJ_aWT2N(QB`DH~#ZLCm#GDCYg5BSDBz@_tm)Bb2`V#q7-+UGNwKXQE=kcyKhcC4QSjFy>n;b2QpEJOCDmLyr3TRvuQORw3dK9&QEkZdA+wv*_0l^Ro+BSn@&_&5gN}|v) zFp7bY$j{k*c2qC30ZG6#P{z~i)%(^u!TK^prH})slyvWTpEpGq`3z`olVQM}k*22G zl?KCmJeIoGJs`17ptSi879PJZ9e|HQz8&#*7hu!%vy+9oM0{@V=h?Qz@?A8g!i z&dVjMDjJ%8g-jN?%dVE%oWmk#SWJ`P`OoVJPj2oFHX$8{{dAq!96+aS-Q5piecdH; z=E&_(`TIV{&im{N#fOZsgdNI>0ROH2yYVl>DZ_qi>!KV1=pyiIf{gJ!&+R`!@<6)$ zhM0RU6|x1?jEY?n6bhIqT;M1$QKc%L|AYYsUO;4IWp4=y2@y8HM6LwAw_6l0EE`W6 zmvb@AvZDvAUCBpB_U#zW{c0~1z3KPN9rqUOq@|=lq93~tz{U5!{n>mm@7~d&f5V(1 zn>yC+`}E(AXPYWF=3ma(E3lqK&743xy7IXXAmzKL{ZG79r&~-cQ-cnix-X|o?;@Md z|Df@C40TlFgLQeDF9$QH7}o8s5JOsAo1V_#4T)#W2}+BfCDQf{CMGAtBI(4e!(p@K zX%z|pMnparDXv>Tw>!t%{K4x!OM3P$eIZ2zeI?TYQz@+su7vo`k5q4Vr|V%Y*h)%D zWB@K`pEi|E}p2n+6r@lv>~p%nfT6$|^RA5({L7-F1k^7@c`$ zy=K<+)h6iAd?mVvu5=OryDxEWVZ;7?NmRdpPD=z&MF!_8^t@LQbRHbk>5uRpMn(~; zl8~{O!de+DiMxztnu=MNs~w{W&Efa?s$(SG)6&8)H`(Ia4FVOyT$oY%$N341pYK0c z9!uYoV6LIU{1Oz@;!nY;n*^BSeO8h;73qD?>%LrXa)ssuw^(~(gS+ON0E%Yo=Z`8x zCq&0A1XI4fRZItgAMpEb%wMXC*fKmXMwORMO-zd0;S^lWcle-aCM3d}5Ochh;9l)? zqY9E!MQ-vWkX~eA6xFp*xH<{z>gd>&!ckgLQZhCu6TK(W<;GOB%5IYK*FxdTNoYd0 zFz$-sKyP5h2@qb049-#8)Rg$A;H?7!JiJ}zz(Yh!)^GE+-(!cXJ67&|3R8MbqGR%? z#P2Jk51T}LC&S;JB;0)~ywek2m(c&;DRM0z3GPW3!RwU&|Hlgar>rN}Kzs01y}PJ* z*+m+Z+?S>6r|oPN%LcVvI*l>1pZf=@715W6(Et6R^Hm}0Kj-y^i1tAxmYrrMe3Bny z{`){b?igLe^1+3_0G9G4Bt+&t?ORX%t<3Evr)GA!r&sM17D}7r!`DBv*44)&qmmLn z&yHz}{B*o#6gZQ#;8r@)>-rNKl7~ImKKgt;^W(xEp%$S>B_3M*nzBvl^p`vzvu@m= z>6RbIg@ZfDX48=aR`t$UO=#$E-yasG<_m-?n-7z^Y)WlD6nYemRfsG5UoGtEZ1l46 zNn#zvR2;~pYCjfA6c$KcTRXln_4Y9n4?8>a((emxqZJ%uepD${eGA&*`;FL33?lJr zzP9?}{nOd}k>fPww9MgEJ5y!s2l<%Cj}2_*gsnG`n~r0tjF=FN+&_Gd`%c@o*6l!HMoNVDaG zOnf48aF3+#x79s0tlIOc^w0AjR11;x;V+zKT|RbS3sW{L7Nq@Lsc?uwWqjgo-2_oQ z>gp33dFsOtF-#(!zclOaKKXD_nU*f)5aY#)GltvXzBVi%9^)&FixM6s)zj#!>O#@K z*g+a%ju+8T>|#F`pZ#F7V)xTLza@b0q)aG^m{i&BQ_`XI#rN#mZDywl(fsPn77Zzd z+!_^8BfHYy7K#gh!h`%)tkc9QAL=;F>U>*S>cc(Ah(<&0@9#%YCBF3&!jA7Y=6(6S zs`><-p0&`hg=+VB+^u1w{u?*v?fHX79oEovk=vJR$zJF}Q$P8lx!u;_WlniRr#bRT z>-x=(lzZyxE_x$VL`$C^TGsAglm)?P*?@t80lC3+b?k{p==6w*E(clNScPZls2>`J zHhkw#EV!V-GyprK2$x~aA!(ZtS=`E}n&<%@2MvSqGTY$6Yprk4j28wbX>Z z%bmV%yGfLViU7g3grVJ*jFnxV}mZwjjLP{Z2#3B+e z_ifvtGaQT-MCRorXrdYB+=uSvu0I<+ZO_WuekvE~Mk8oXGu_#VkJ?%pWRHZ}`6?7R zxH38wb?VrUrR@qAuQXtPm$$WL;u~EPfXy?TUp^a=md;?v6+`P;iHJr>Na>-~w4ogz z?6$nWdlrP+YB_W@=rdw=c_B=z>s7IGJ~*t$?cXSA7U#fnRTWH5p@F`|JYH2qj9wYJB8 zxeXP5VYExSlU+$>)w~;rZ-`;dGl9I#&im0lp%EHBk z71tgFLu;@IXxbDWJt|rjG%gx(*!rRVT1=gTBJW#)C<6zD;*i6NZsHJK=N21hwfWxg ziH01bNoI{QH_YH=0_53g;Wv3Zzz5t=oz;G<-L9r3|K60DlUO+7AoaQ`bM13`d6=aT zxEGNm7zzFf;1hkW>m+ZksC^*=Z0oaTfj;ZMgUFwV1?IQ+)m=(o^HK)wv@)-KC5xME z>Q1%XUGAN8FI)$TQ45;9>xBU=T0~Xv1=_xJ-7Ds(wVXzp0$m_2n&gW* zZkh@XiiMTcNl8(0^|Bn>e=y?5`xzWxq1XS>JR)$#i&25?^i z@THm8Qd8v;U)t*C?EbfEYkO7DQ#PMrQ%`+euNTFfw_C2C;^eB?vy`f6XNM#b!_;_z=O=;C*J)~`HwJq;HS>?$oqQH>C-&SfU)&6VRV=_0!XN|x;jEuVLzz=7Ah4} zCbBN6S~I@hvJiuU)z*k?7P`m~P!}+O%@agD5Z@Ee`waK^V3Rvp>?OfAwWv6z>63-j zHAOtsHLWXlWr@Nr;sQS9?n|MvT@p>P_k?pkja$Mm-DaLTQV z$)T{&C@myQ_t%ket+oZ{e<0}Lb(j*}1Cpp96`%?wBg4AxsjdxbwU7WYG)gW%ZF-`4 zOLOxmBjhah3O05OkkdrGR1o=&tvK+~upr{s~970c1z>{R3tIM!HMSm-%Yc-4#pm6eqP+ZRam^z`~lo+2tao=6%|Rqh-Kh~1alj!-ORq)(+Ch${ijcU@8jZPfXMm>RsOrEC`n#kg!d72 zWBdnD8o$ZQv#Gn<6>I{7XktIB|un218f-um?1G%(Z;0no|Ch`KWIOA zCaT>dMSV}>IgIL(0EmB$M<*J8scrcBmE#?NP{DXNOlQzBs8>?UBOc$KS=-z+(lj(w z2Hf!xKrJQl4d%Ccknh(UY;q7`)S{c4+kIFQj39gX(b94!^{SE}hHg9>XMDphlvVT7 z@V&?=C`dp*M1$RM`egSGmLCTDD}i@EIQVsl%c4EXR!om#n^bL#m!}#mD#1&x} z_^i_gNTFcTEKyoonvlyP9^6B(VS$np6B7%)+~)xL5)B0)gpkvpz}U7{rY4f8KI!jH zkGk8dCzu3>t^a+NuSC?@$eEs`gzr%cd^N`iqb{vyrmrX}6}cotB^RCIJ zJJi9vJ%Rd7Jtl!2UvE3g%NqH!*)r8fQ{`jIlqTV+Iy&+>7WLd~hWVMb^*Hp&6k8sm zw&N9#Kkn%Dt+%E#`njO&(c4nQU(UXmRyJ_*n6~$({nzpUbyJPZ^-6=<_od!X+nX|G zWo;KMD@s+(xnFLh?G{9~O!SqQL8nPfPL2uk%@C3|GTpP=4Hl&j!tqx);&Fn`;27!t zj$DZABL)U0rl#luiD%V>A;Pu!m8Ye|4>rNi|KcLy;EOg2tmcx z&W^PF8+5r0Vsw8LJYKjFoN;qru~50R;sLGk%e-lDkbHHxFhni`EuV3qqTAL`gIx$$AsFdxcB)8 zT>ayYRr>E^V;_7`XMizHfB*iaN>IuY;Dq#ZQ zNlmXuf&_7BcG$`G9!tu}1!CU2ZSKA4vaiF!##w*>wqV`*T<7!D?+BS5AmX_#Hd#&6 zR;YTr^A7*s9{|--TU%Om?BF>Z&o1}wpnbJbpncr(hY*BPj&RtSLj@B=$70h*eLZHh z8Prmi-6^t~UdPvur-zIG$zE-<%>3-_v^CR+0eR4_Ut*sAW^N5I0LolDYC>^1`0JS$)r7AyA za(fk(l@H+q1G2ec)-hK?pR4lN;j&nw!~-jEMp@ZF^@FJzOM##6UCHj7i$N5CMEh4& zVJ0Qfn3$Pizg5cjDS_#kJ=JX@Z=judnZuTHg3Dqu0Rx%=!O`34UHOsaH|Z z=UV}Ku)i^xcd^isu${j-S?c)xh5Wy{6tOuFg5e!(PDAo!1IR9n5j(riKmU&AmS-pK z{Xki>XF5BAP*F`$L7@ny`D2X_?1n@MXC3A?n!6qB>@)*D9F?3>Ct6E^7DF&^`S~-4 z1n7z20Ko}uu`bC_i{mmFgMdI$pJOtTnFmh~++Exc@=H!}{qgp40^6I+0{*$+)1LzFL9XMWBvIM1!?iNj-H~9 zRTB#SKj!#92BfoW9i3X6XgoC@Jk_Hox~I^9l63mllENpE(zvkg(et;AKG5&yoHRpp z18fM~AoR)a2YnX5?-PH>muso*9_?SK+Kl__l#Z zx#W~2Gc#OczvUh)KYlC=7p7so@8svz{!+^)kbubZ@?f=cGc-(bpZt2<+SJ+cI?#7C z{g9;qI}N5Q$T>OP#ksY6e00#j{^?s;j@9M3g*R{rFFMpcuOx^c(MDq|c!)H-zDV*z zyLAP2G*-ZD?U z>mc!-${Adt0Qmr%h9ypJZpup~qce_GpD6Kd(ETO1?um$0R|f=OfOWJy$IE@C=(obo z;kFqhw`BJWP~S(xGC-V43224Y^@2gPaGT_=hp0HfN6#iIp0(RA)!n*tlhaUMvtaxn zE@iY;JpKxL<5Onl>;ltbO1LFK#2^jtQ9)5LZO~d(R~I)~8CyIx5(ca^cXZ%^w(LpT z;1CzrwQJ3(PJBJk#eI%dAU~=&w<10EL;9yr2nwKM8FTa7ETK{$9(tgs=@w2$ zx`~bN80Wb)6^}bbBJ%mGwy{bEtGV4Td`oj%b(5EitpnqwyAYB_ zd~SC6xoYW@QVlR%WW*c99h&k7Wq$r9#3Ue4AqxtNB4`YhC%?P-G|xg{2myAuoam$9 z11o?)8Lo?353mfKogBbW0N9y>f)H4J3x-;vvY(`KaX-x~6tLptrNj@fl!_!m2e}DB zNC0q)Cc_^%WAG&7Lwb%87u4y61L1OCpH2PwvCU5qN>)JeKks}WQlvq$g%c!&79{2W z=Z`5I<6B4GP?~61DJT{Ww*2h3QU=kvosO;TSK6=^DOp*}a5+Z!`rY0h4X)S2Ll2N1 zf6B?hu@#_JVj_hBU|bZM>PZ8=X2-RSSWWPz&bHqptWS+Mmq)JY=tPk4SgsKB+}UI{ z_9c~6Sjd3(a|8Ic;N*inlqxfkpCI-lcf z3%a|E3;7(s(695p0o}Z&*n57)I>AKomudYXZ#Q4EhU%h>`6e?ik(nnIR{YObdVUyd zBgJ6b#D$ydu32k*ikLgs%ytZO0dInmDGw#pe94ftJBPt{br{?;^Y`x?zypDzF4E?J zFW~o~h>w00I5MJ5BjhM)l0Ud%wROvcM-(3)A2a6HZEx|LWU~G(rY3L^ml#M2p?GfK z(V}=L)y-<%sgo)}Ji(*Mg^pMieXY{0_JP9dH)Ntng4RoKTAfX!+@)5Z3tLtd4hbRm zjif&Pyh+3BMz^98W8dFPhou|@_5tW-8o|m-eB%a?ddf5Z7TN(g4mK*+k>hacBg8{k3G7V_^7Bpd*+$hor9&){{o4#Isi zn9t&9-D?_f&G^jz#`T7=mQFkASif8Ft64*%WFtpMOQ~^ALNqiIz7yq5lVbjuN@Qq; zwP?!HC*x?<08X~+ho(D11}1xP;y51#&ttrMq!^vr4fo)urEsz6{oV88Fsu<8CKxe5 z2p6QJ+8m``-@NtXZ^IPr;hwE_Y}>~-3fTv&sFYr@w{RR^m=9P7o4V>IViP4A8hCFl z%bUK5ts2eDwUga8;XLt5Jh~)1jY~({Iy!#rEOnb$SOkM=^m+UH-^BdRwENgZM;}Ug zQ+4IvwMCE*|M^o$tOSZXkYK?BM8s1G{UuRwHOf4EXg0DH9qjEt?SQ6;v}bE}>X6&y z@X^1<6fZ5VH2UtfXB`8OoPYCdLvg~xg4LN$ksEjlsTw)j3qu`-r=qO*s5^Nc-^S|X z3YsMb`gPp<_jaG?b&ORO?mmobUubJ@4}bz%pDRQ+9}5Ks_{?z56lQRkH0^XfT0^B3Fc< z4h*B9Q?|9Xu)xabeGU5*?3ncY{N&KfTPNsamk;`VUGd8-cRUX|9CsQD*L&t*8JC=r zVsFMn2|~6{NZfUDyBYMj$Nn^^&nWF$pQWxF(A)jMzUdv6kQg^yQ&A^_%3`MHa(xkw z9B!rEV`RjD<;VF5*|YYHt=GKT(+{ho8RU5Rx@A^qP;Kh_%E=|leER(MTxaROrq_F8 zx#DI=q9CDHEgifnkF6Or&{#Sxbi(s>nokuS&h`I0Lo-x*Hrd0a9~|B}=~#I9*Spxj>>ml+8J5qX*K$wVA{-2S z>m$XCi9hH3f6m?F<|c%30t>Lo!g2>J9yxXF&Ha{J6z14TBzot)s<8FvF#Ab1rN0{p z!U*70gH!B23|)9$rRFKQN?jAt%7oV9c4Wr-L z+wDGXwPFzp%-Cwr{C((h^KM?-2FcN*-`w=km6$F`F%4+16iJFykg&rJXB zwI`;EoC)1yY^%0ivYn=DU+_OdlvHCMr!yAqF=kRnf6t5vglUJ zeAmZh;dI;7B5!&?PbA6-x1+8NQZAy>9;f!x4%yv{p1 zd8`!oqM%u>&WAFhw6n95@L+W~5~N889<=}-Fem}NR#$FaQOG1=R!(XF!t&im3>&IH z{pebr_2MN;>?&@Kxa%uNV|~MnU7=9V)lGIA8?04=)!7g zP8CYM5U62g5yFt1rzAFcd6&U-!cy@=czJ21dnq70mu=q!cvmzEd)I6UX}oM6+Y#x` z!&m^ChC`tY<9rrWUPFR$t1zduS>4~E`hGV$cy^->Vns;^T;i%mI*yjHcJx7Iewy#e%zkMwJ&73zT zxO#zGrW5-=n&&^Zrwc)Z*QP?he!Pi#jHj(|N%&l-U%?J|fWsp7>PBFaISEO_?JEcy z`6Efm^+wwZzF!mX#X<3Mnh_Ns{7#`?T=xQ*<%m@{K>q}iCrgaBPfvbb&~b2Z9K#*U zLKd2L@ngT-t=XzcGH>N34zJ zqW7u$AM5h6ii)})rp4M=0VV}XOkp{CIG8+Wevb!Gz>{7s^v z>+XeLKySD(6?=Y4=Zec2{fMm7n1{xOsX6~Qv-X}|ryZFr2;I!duU~h!ZQAZcg=46c z%bc> z6w;&EDA4B@tiBM2+dlEij0WjZAnN;Tne?{|(QVzvJY`;qsoO!I#bD#+j>K|AZu%V~ zR^jm_+FyGreI_yd{-wH+(&LqR(WTDlaMp}@3>w70a^ZYN%~^K5UqUTz`U8c9T4v+I zt9RpDS~HqR`T(+uDrzb!>w-b+yD#_GGT?TrCdX|F^>UzL*l9_uG@wu+!$8@F%LQ~M z3Koi{NK}gmiJwm$mjv1zM35mbmG65o-OD1$*PoT}URyS?8MPr23S-xMdoogbNV=ROv!8p((punwP1ksuF_Pi3JG2Hi7$ZCl#yslG+)RP$ z$m*V#ho>k1N(6K_R_ZJLAza7lX%$}eL1^%9ii13-Cy-kK2 z39{Nz+Xg>04)|>@E6OO02zxa_FY)TV!ZQ?AYGDLGW&Ir;9YdH{Sh_HsFX03{rlwk2S}TBC55eIZ zUv1JHObDMZTdcw!DOI#|FE|Z8HW~{F$l+jEg;LtXyW1fJ2*Wz%!v_oSjSQHezPYV` zbcgnc-*Kh^8XcWEl&HP=xDV{oE@dQ1sJE%J^Knm&r;7p$*{fgX>7PIUI0s?h*-cRo z6^a`-bUqJSKSaH@X>wh$Ff-!|>a?f?K^6fDgv3+o>gu8~zs%E68+Dr~Q1(uigBz7S zK}ilwphb#b)Rj-Nr|{mMdz17=(xGCXyX5E|-^BFW`J1iSvmMYCe{Z`P!MY!^?=sP` z=*$60yOZzK*5%XuB<%lOxwwt`=D6MZO*y%vFbuPX@W|V@64$_Uwot27+#xi_+0pTv zIpCu#Y;3>5FnHm6xHW4-NGoif^6_J6M~4!JZrLNa(joGLYa>NDJFmYaQypwwRo>>G zv~63+a663ID*W>FM35JM1!$y$eZuEIk8p($6uj}-VftqiEgM$u?71VnshF>qKK!~j zmVupzhmxC=p9M^3agH{LcD?~WL3fR0H~o5gidR7P>k5RB_kptB7#{AW?<~D z1b(f8_MR0H&=GrBOfhfJFt9!$7w3Q$u3ZK3acYt8*|BJqejUnzRC+i-9Mq($>U!Me}p=**aFuZBu6+HpmuL9JlwFv;%161eyS?$Zi!J`x& z6LfcYPHxb(j}cQ)>{lr1{DV2of+{!0L3dYne*NN9g+XV>5_!T zt1MMhpn!JW-QA}VFdRJuzY=V?);J^I(V@Y?!Ou_~b^y#67!p#goWQ$aD<{{Am#;ZK z^ZsLg{<=RjWgcE*!}oyM4S^>=!<+zy}R9@FV3;=Sm8|MqOU+CL%m{^hBu^23>m zo%q7ZFTf_9jLsetC-|n{b3#ZO%KV!$oH~7pxjDuJ8)JLh!96{KNbpYKSIhm*#4!df zt;4re8q2n38E5R{=awt-8B`i|x}`RCX)y9V{kk7DN(!te0cesO6idGroD-p^!jh#( z>xFcgAJ|&wigIJ zAJ{Wcmyh8a_)vohXhQ+A38xhic$%;I5<&G0$y%A1M7zN5;&5b?p zGS$@8)S5oDFW3f2HLB$e+F}JXva++Af#*I}$I#Hw!LK8C^~J`-eejhtii*;t`t08T zX)Ojck>J!I0f(V1cnbio?*TVmZ~-ygPVWGWTxkXL{-3bsLc25qU^;k9gMeUcn4F{q z9LIZav6K2B*eeBSP+xEFn%Kxl!v78Vqo)YF75ymp!p+sS1Y>aB&_9?B)wm3tVVg%69t7PFp*wnabxj6xP8~w&W;rHilR8T+S=L> zNqB*m?uO63RyA9Mzely2H$(aCj%~Y^qbFZ*|6ycFxl6o0{xKHSFlUKd{9*QurrqhU zzoqU~612zu_>8s>Zf(nw)a8b~G`?A#km@U(VYf+FOQ}#kws^8x>H0|C(*y%mP>^r# zvc&cFE;;TqLHp@@_S3#IqYJC|PpDLpXIh}-e7V$>Tv}3G?61ucteY?A>3Kgz0x7uf zd+HGcCDn7dX8@3732g%SpBMG5Mp1ns0~56qTxMFiv1-ya`}eWZ2=}_=4G%KnQNwS$ zBTG%OAu)21M;+fS3wv?&X;q?=lV|nbrd%yQvhu9T*vu);kkBt>qHOfPg}fGW&yu-q zZq<3)w%90c=kr0`L-II*$ct*5_6o)#iPrG_ zYccPHp1casI9^-(^ET}I^#M(R)!*c|hNq@Fyno;tONwTQo*xOi zc7~HUX)}7=C>}gQ(rGF)17DD*BXF1ub#-lgIV-g+wj&Q6j96Iv=HcYuX#7bWMu-EZ4g2lPsHoL#LM|yH1ShWrn5f_UZo6fc2g7uV?xM8Kt!SC&{3donV^j9WKL}V3P zyYFLVWf#g=I1S1Oqs}S|T#7z*+Hv+TM16thN=i%SUi6amGLdSX=$U-ouF9VbTq@55= z*QU%TB_?SE?xG?fMz?`;lo+%wcdd(tQWz8RV@kf17(cVHNC(<|a6CUhe;bH{OHvv} z>*3(w6kWx~H~2KXTK^?1rhS38rnXiBg#w8OR={>2)Nf-T^tZCG*bfl^N54v!F%KJ+ zItCsV^hmuGc6#sMt6Mn2bO}dycLa#29EyCfY9`BOo209GJyhPYfe!s=adR4tSS$<`9mUw$>7LjI`!jY1ePE-2=cOTTk4NE&F z_V#bVcGWaCM)m*M>%pj7(!L<*T}PW2cwq?mz;)<7?vIX)&~tL)-??+AsJvVjgf_Gw z#<~t3THBLs(Kc(Lx~Fm6>o@0m(?_b4vm01Nn}+^+1b)RwmDxR`mS{DKI=U^+fb9Is zHT;lR}0x^FiBEa|~~IptDjYG=v0MSJA+ z0vU1R_wTK>1iRiZ)U5WnPkw!mY4S*Urs+o+r@nz6Okje*njNT@t+b0xWxv2C25qo@ zy{`e5v5IsJ6}5{gOJNTwSN|h~rJwh=$`7A?QF4rvgI}w?RqMy(HWgoYt^V4GnOWex zwA=bD_Nk{-ASKXTKSMc10FB4CQ>*cjygYB}S+rMTSV*G%*A2esiybDG+=enRc{MN95`+tIuD5`(!xJct z4bWr^{Y~slv_lJjt|Z1iUGH%I>mz^OnCsfI_u;Z?N@5~4Y6b#C=%@v49iOkRCs&^L zKOt->)b7P<$UhcBTr$#Mm^^>ZS7=br^?ba76GeabZm$K{L`ui5Tv0OQbKkH=BIN8p zq;~I2mxsBoH4{?Lf6Zk^?WWwF>re4HE~Ddf$%5Q=zB?puRKV{G2K^nNUMg`i)trvc z&r~S!FwVnzsz~{tKIOyQUTcdjH3_>w}TLNK1?;g1g0)Yr`eSiT(Fj}cxm_u(GWnn z3)`j#`~>@8B0L#pF8g7+-2)>Fobt}KzNj1XCJd&_W~!wDBjj8~19CHftrieD85unA zM4V>bUFYWH)PV0P4^?6(v=Z+}Kn~D7y;nvp2tg{r(CbshKHO}JW*l5PhgNn3Xwbb1 za8a#IRFMV}5lOAo%E6T^4Vy^>2HSj#|7Feqvmc-k!@P9`HtVIO6$T&`7}XQh8WKi7 z0u>YX`6~qTnpa?8V9_e6F5K-6=Df3i{=5Pb%<3MMqfqRzS{g`+;ur-4D1cO@4;(m& zn%y}<1D|EZtaB9$J9~iI7a0o+Ccv}#firTjw*Kwtj=;79Km3Qq?-Uuqh`20KS%i6eMPRqGinaIn z{9V%1Mr}1u6;_8ltf`tC6y@eyd(r-Iagm#f1UdEKH z#TlomD>N#woP80>#`&`4;{3#pw)IqEzd%GZH~lQ7y7se{+9MWX5;ZFgua| zs<|vJ!MF^s(M_*@V);b>7!$A0CMWHROem3*d`MJXqHT%1Tg-ap**X2M>!$A}ubld> zxOeZYl~%hir6gCuDot>o@>~jXsw^pW5g??aAANbA{!jZUh4d4_FNON)0S=NluU@T3 zy%3?r-ZzkSTy_D0=O>om_6VpqjzI!Q$;ZpfhTlHN1Pm)ZN?zuHI#x3Zbz=zENF}Q2 zil>+*@vqzJnR1_vcDK*3cJEVBZTwkh-z_qG8}WLrYBk$Var(q#lxuhS{_fGh?z9wY z!cL{e;?`UD8KPL%3tx46W#tFP?A$v6xF3=#t!&Ke(dMc}NhgewkdMyM+TXV_jkLa= zFD_6OyKp9`vQbe z+?E$#l-8dUq@f@i_)XEZ_C)+|2`HS%$jSX->PJx1v5x@ANVA@#zTK=lUb(L)^!y{! zB6#xVo9`&5B#6C41Pbk^S65a-&#(zz3)+tK9A|9SC7y@Myu*z7BHz_VKs%$W&yh#0 zgCZg$3k1GZ-l8jsl@4%)kDm(+hJD5>H+?D_Bp(*b^o>zjcJ5t)(I$7-#$8wSVWGbT zI*5#1j4G1kia(v07ZJeqPS%@C!=(4lv@{P=%i1JxkWwn4{hK%QSI~(EF>kMk(%dBF z7z)%>R8dv+4-LfyEfPLMbk6?lH5AO+py=%z{rM9cwk{~WB4Gd;1MwAfH261=_rUN% zsSjL@h+xZe9?I`k-@gxu8$TY57&PY{TpYF)$f&8I(a_My`T8|bIeXP!(ep-dW9>`i zfDROMu5&v_MU|D6{eNGS*U5tA4oHX)d!QjVVEdM{mEpW<7;ev%}ikH(+ zprj^G#)P?bP9`QM-YEF%mWT4GKXB+s-M|ZegHqOHrY?3}9g>Fjo&sErm$x(A;OJk} ztu?H`S$XCSGRa{oCj*z{z2k?2ciq;skzsIMpDU>jv?1ftojO>ml{^nSQ-m~@Ul9)B z2nUH#)pUKtZyYx2Buo|^+x}Ln#9q?M$I#@^e2rV?pJ57FGAqe_Y}=`SU$QOp5?syW z87C%aiF@Rf)+AC^s;ssxvqqAq&CkAz*niWel-QjgJ*|pxvJ}k`$`zCkC|?l?L~QcJ zmxuUqQs@>&j(6zFY^E`oVy;4s<@_;=6UOQdQAA^+mbx@}($dH+eD6rt9(4_K%f0ou zWxh3ov#4}>Los!OV&S#PWayI?hc=}v56dF;A2UcJ>hEJt&E*KM-rDKoP1sdur}i6L)_ zJ|bNggdv8%g087ACGb7wKga;$Dw^>jG($EGTxq$n817aAHmGe3U? z#sa_|oCV1XG&z1MEI$BY_J&LPmD>UfFJ2lB|#| zviBa@BiVb0?7g!0cY6Qd_y3MVN8a$fkNdvv>pIWhI_piE$|^(_y|3WVc?sI@=W!IG z>JXiRL||9}Fj)YPbKk0h#v~3(CuU}inmC1hvbMJV!fk)lz<&z4P=Dkyl7Fy(Y&ZLE ze%R7g{t;=j>3TnYf=q@`Z z$Rl}j+Sc|A1O_M!EZp?Ch(1FuAnDwtl0AA2B_M(iPFhfi2%vbdkj}QY%2BAgx1#+H zK^3hE0t@wr5D`HWp|=fLR*@nHe{44FX#NdBiFv8dzO>r2BJGbsZ6+*C1*nu385Sr< zV6|IX8VX3wfc8Sa>UbsVI!JEVjZ0MThde!2ue5FL)+wm#?Y*qSL0E|ib@BGb&&>sR z09Zi6nuCkg7ze`dpqMvPwJxDu@aS zlBQ5qCmTOqG&MEf8yL(&Hwt8vmP%=B%v)Ll+-LziV@(7>8gvTWwaEaN8gS`qZ+`;m zsd=y+b{pvF;dz?ju<)VobqV5XerKw)!8GB+wKHl@Du;*!4idM2CmowgYO2KdJQDLC zE|ERLH=|Xt_)~B~wnVBRbZB#T!poq=P+~GA2Ih>%6WHNCg zuIL9Fu`k^AQmmLGGU(pL>6P{Mo7=ASnbCIKn!s1CAy@9=ajR`~IW6biJe*EQs}gc_ z8ou+yH#BWFXnJAraNI?e{;RL2`hNJM z^bJx+Otc6+8X}cFACjP!B4bo~yUKxz0%syvmpNgNg;W>s$KMqX0xDx6PteQ0>DM!I zLKWi@a`=F)^&89wS?Z_Yjh8H0mDY_tpPXbAjLPP_d$*a1fnl!T6z<{g_m7%3#_oRl z^2tf}w?C1I7IODo@rfQ2HagsYC|%IR3BcC@Vgpc;fFYH)jtP4uFMHM(j*6bll9c+4 z#$O8(G4#a%bq3_92G&PpJgIo+_V&B{?)Ki^70Fj6kF(APv;+6(q00edVs5XYX=s?< z=pqmk{$5w{XBvEP91gecfaC_#(XRN^4-l8vFVA6{?5%zM+g{AO>G8fyA z^Q&{1YWGdXyH>lrPGmUnzkI`t`u!cFC!-!q?Ps04P+=*A6cWfKfu-U{ z7?u&v7W>3`Z)|({-#pGf4IgbLOQEp_h{3az@<^(8>aW^N5nwNPB$?L4b9;UGPv+we zMK@r3FmZ_#tV?iuYh55Sl42KH7unuTnYyp%H7RU^2*grJ#L=BpCS|GE88G(ap^SBoB4r&JBf!l*N<2@jRlxD<~ z+#}V__Bko+ptzynHP7B_eI_g0G^~lJQ=DW+m4o2%SqOta?EQ5Bbb@-*WH>hk_2=-y zxKk?G>H^Z^M5-X8p-ha{;eB5&dqT5LJ#=iB!aT^@0%m6L1|}pAv>`H~f5yr3{QO#4 zM9+4^BHyti*}}uhPfW6ZTpk1;KKugcL8v=U@Svdez3MTCW9rRW&5ot*t{B}1JgV`? zgWRoyyxM5Zb==J;A)Ybbiw~8YziJ)Iuezgit><^f)}{;f6{WTNcu5DHS2;{O`{OLs zZhYqz3dSnFNrVaxM@;lLe?0h=H(V7-R&?yFQBbL~PlIq#PbTI%OmEZTEpdtUJ_J0% zvdD!q*f1cFt1$U zVc)oCcPPI$UtOC$)lGEm3RY2A6zym7t&J3gWokS_Z^Boz$inbSUGAOlaaF0ZG3#8` zO@{kT{*4`z!h-B;6GQwF(?*hQF4Yprcez>be8}y4bUc%7@LA;5EL)x13-v+Q8{cHF zC>|Y6=3-zy-GG=Pi@~f&s7daaKQr7ua&d3bHJvWz<^cT`u2`veSWHnW`(Bd z^q)f0QSJ+Er18=st%^s<7YvoLgr45Kt`2}ue%RM=!ZvFx@6-*g8a*F%6q?jzFFv0( zw54BWEc=^LU^q%wY+7s>!XVSo-%kWja-hf|Oq7Rk<4#JeFqTaSx*r2VrHUJ3mJT3l z^Xu2IiHccDfYX)K=yJP&7y1y)H^q!$h*1u4mjx(E&laHOR z_d^spck!>S6}^~l^m7Si$jN-`N&5gCMjs{U;0TAvFA|`8()U^s)oLehD4<`n!~$tL zmL1Vp$O>2llut6DJpNNm9)X_K_dpSSxrG}52fL_56^09u3E)$c0wsKAW~SJyTcGKB z_3qte)R75v1b*NBiTzwe5LHO@$K2bI=WNTmxe2HZh_Ek@dN>PZF}8w8RP7oCaj6iV zH@7Iq#$5#Y*=yhYoH=bxrV7Fk>#NpD8(;3iz7eSJcf;ly2m4sxZTFOnbthDv40{y8 z?cV3pS_UmAPMt$xqNiKyMJGWQOjV7;Ce%LmA3rZO|42!dL*;iWZ4*)nuME8$M;@#G zb4n=RwXPBOZxM# zZ6fKd_AhLtqSvTubJP#Cl7@>kJI#h`)G5>z3nHXHvPsd;ZVi5kwJ3~`ZAZ_?LjGhn zR+jIy{|*tJa@-P|>n+QZwVL*K=!rloUC% zrqJRkP>2R-lYMN~0ki%zXu~g~95wQWYrREVdNR8+klxk3JX}zqCxnK20#7>)Yb-r8 z^Rc2LabZ!>O+v!UjuQ$Yn0|D|g5r|1Qc_a-qMEOTb^$xF+2ZOd#TcCQiBRnc?Z7)I zz0Gg^!yeGPz(!xZ9kPcy-hLW+q~}lvJPT!zR&F)O;cNZ}>&-Bi@ zYL_t@=liYvefs2Id{hF~h-8&pmWLbP>EAY8eiz=$_=5g3qo|}GYu}Z!csOzKqEn9& z+*DWd$F->TmN^L)yEhuXtjBQUV$6DWnf=}da_tbvS)L`y1=YW;LI zUekY{YOD+oI~~C@+UYiVj-V}CC%%h`aelacvMHCN;nb@5Co`PhFgksCio*FCrspxq zHz|JCi3uFYfA|FWAk=q@^)kN^N(SUR4$s+Y-4G=bK$S^8tQj3H*_3DsX@x{lK02 zxVgCjmIWJd188sAK$zLD6u_z$7ugLGGAnwi&mZG>%%U;m`WpaUhV46;!5{R=&%vr4 z4ynbse?Q~7_(NFT9q{w^yIq_eZ~#WN%mZf4o06}}f!>z^j8j;VIeZ=hF^!XZ%e_;L zVoLws!A4ijK}a?>HUJBR-c!HmHqbC7EUM6<2DWvt!QtiICS zGCIm1qigRLb_J#B`mlC)X9O@jrCw_(`BZ1O(0|V zi^CZQOozkVIOZLcNIH-|oU2x>De0>Y7iV9N3m*m5(6}wJAO6MAc+<6Ix2dVdX90<3 zF8d~V#O!L7wj-&XF?xVlU7D6I@iS=In_60C>n5u!Kee^pMY+MlyXa4}EdKp_3M7T? zU&aOj{s}>K@BuAfCdT8U+fh*&3^L}0C2O`a{)nw)p2ihAUlnfiwUH|}_l7>udl#;<-oQ-C8MbOXkX+=GG7m7(p6(5uj@WD`ri-rC$e4{`K{ z>cf?TJ(G@hK_Lt(@~W!j8ZWnb7VwEtf7@YY2gQK0B_uf59V&$)5MrHV_wx022%Tw8CyHM>ej^_wF^l*Z+PsQ zU0r#v&R$A=MaS9#{E&Ix20{ZsdBj5*01*Sj zk{{SaR`)lj^4??(hN0e_Ui@C{pTphw_;Lj?1J7BpJ&RG!g3T6cvzO>sAlVJn$&FYc zy~fnOz=eKQ4YTRB0gp0P{`pB=G`1&C8XkEH2A%yONfHQ|reSf8TOO(8nP^E>@xmYw zc4`QCMZ>1@nWOe&eTb{ymo$ChQn?<{T(-03*rrAFdK+tt&2y96`rGTy2WzW0MvPgJ zZo8}D;B9A4c|8jF`O;=h(bD=FL%`b{a(O+j8?az~{z6|ga(H&|wIGqU6!Y8gZ_}sA zv1SXMVeEg(t)#^KZp4Ej0VtHmaGAg}F$+;;3ttBYZsjPQprd?pVtc1t4XkcpyZ>qQ z61JcA>|e8=it8^`7fjP`^us}5kjQ0BE^KT76h8$NWgf%5)Q5BbVCrWq(D0{=2?+ZQ z92_r@kw9%}wK*yLuF9bo+AGFDspP09{ky%j`I8rTN;%}F12<4>i(&TuMX#bIJX(pW&xZ;==h&a1?CgmM}m zA3p$X9T~7?o>^&AuVEcZ1~gk&j~z=~h(^ZY)AqHrEOPs53lLyV%l30U4b9dfTd0vr z9>tV|k4J5XI`m$(oxs(Q<@XX&wyl)ndM@wYREh zAi}OfZDr#-MX>FnE#>PiejO{9^q>yAQjB_Cy?eI4YA;qcpGl@}KnCOGl zVXb*}y;hmM?~QdWEM7);>gV(t#sW%SvGDawMAGN9Yj&?_WVAvByP-?=6-iNZs0A1K zCi)>(omXx7B!BUi{xl!|i!WibbC-YZXD?$zO>OfUYsq7eBLC+#|9k1K3ze<% z=RNmS6>H-^sNT5PD3zzF8O&Swaj?M74>A9ImXBBS+zf?V8`ougUgC<2i4(}9K01Cf z%BgRG#JjlQ;9z6~{EpRE>WZQk?O}SvDv+pzmwzC9Rscnn@VfdYO8+@SC=O%@`ap6l zx;ww&QQIJ`(5JBd+wSb0{JosEyBa|~z4k(nrKfCgC8c zxZ<=yw7~|m6;lLaBI1dE?-$>_d~<)dUV0%gF@g_VJ4Nt6*oNnD)|BsVlE+niIfBF- zp{LQ$3_9Pb9Q?^MV^vk}Qo=-w&cPCQhZMngo9pXTZ!YGSmn-6F>jq?=58rg?igS|) z(<&RSp1RjPJhevA03<>i_fuXwsxpSTYCkzveQ|jO6v%P1`jnO7Q`5L^`)J3`oWb6N zF;5A)?J~M0dU8Qh_qTh9#WboW%WaTV_#pHd!^2uYR?u~_90T<{*`>8L(;igcQiTsZ}Y4d}%m8nr%4o!a0TW+w2wNeLonm!RVVp2rk_0I)AW3!Bvk z@vL|6>d6`zEn~41d#G1_KsI-m-_(y4TF(wy@G_BO(z*T&evuTY_MyBZ`r*-faq%1j zR~40v`W6bIbOP_(ljP*&=J4?F*IxBKkoB-XyR~I`0%8?^h;NYtDm+Vsz@-jcZ-2x?ZvLV>^|Nnlu+jFQsyDhe=zghJLGc2qvA5{B|0cOy2= z;!R9v`6sJxWa)DKtP|Nhmw=^g_Fge$8)XZ@bye``4i&|s9rw5Zya zsgZvVAx2%w^GK9fpXX-+yDJ?a%7$4&>Y7!wccvS{ZtWLb90E7E#=?v+)482)x16)K zyMeMHSB1a!n_fY53%v*fHaej{moDUZmt`U*&OqE90j0l-vPOx~g&hAosuGLPGodaI zyxy=ahPq3FAAdGsKTwn`b!|;Z2pjcV=DCg9+2C8(wxYr&EMDFc)ih2p=E08=xQJY+ zm|TH8Am_y$j=|tWyvUm^U%dw{ z#B$4D5H>A>r*}JDV`L1k0}{@sVoMb|3c+flu`e;-Ob>XT@PY3g?}^t~xcvOcMZ-D5jh-Ot|7i*I#0jcslq2q&dl%JTO$H|uHcCTd zQU$_!5iSt%P;0vGg&RUV1Zbe^)qtp#l$#?$kvKazv_Z{9&S%gStM)9#`XLHro-HVB zwBR?3WFVn_a|qYb07$0hK&vlT;@RK=^5>>6(+sP&^6yJ8V#{fkgtCN-!^jdK)DsE{>pmp%&J8u2y&*SVG98 zeM^WLqB@l{Nclojb86!5-4uE(eCp58#9ANyn_q$`f7tuXS{HRfo}TK0bgw3g*CM_w zD~kmH#}=TCz6sj1qqOFJhp2l$o^A!iA_+u3KEVGu0z{Lyx_9i%#`ZJt@BbXmr)pMX zNT%d@s{G8hnlOHnsi8&HWL{v`8tYzL1-iNp3x4Xm7nvPq{^ z4d8D=D~+JLKWT=8A?Wkx&#~XWeQP%^sjN8p#-^i^om2WH98?d*?XVF{9>S#(o^;uf z>lNIr;=En=cIfG$OHIvpWVyi?b_TPBoufc3{{XD_uL~S{E^ngEi!bMC+$NMf7uzk5 zLiN;Oq*jtpZthmPQWnG(Od~)?K`KrI%-{xlER=$# zQ2+ab!0bEd2tYROF={FW>CJ8LA90uR>OKr=xrl0^*M~K~zm8!IdJ!#sGAuxZ9JZTD zA#p^Ufr)8YIlcojtvlzpKk^K!W;83sMd!FejO_@?B$p5bPq$JD*gDKYf)Zo1&O=*7 zK)thsR{ArU%0pv?;(qY)#&o2Onsx!toL3F9iUPRF)+&YXuaWtpwHGGd%ly!9;j3-A z)N@A&jJyF(bO8`@OL@-JgUj~M-kXTo+#;O(%m_;5)oe%EML zc2-sv*83{g6FbO7WkTP=(d~MS=P-FNLvs-NE9f@A^1Z(|4-lK{=1$HPf_LBXnb6Ao z%jBkxdl4!3>MKioAvMHff?!&GGFu^lp9c2_Xp^lhtZalOFv7 zQBORu<03@Yec-|PajE|-Ry9+DsHQv!&4;8DSb-vtzubX_f*`U2ZWP@M33}^^?Q#k z9;dtx|B;ds2W-;kcs|664)}*u3%7I`Nh|Mka&)7h~BOxy4T*(%|WX7p%n0s;atT>p>x zC;U7^;X}*puIJN!wPsQLMa)HG_#Nc1T^#c+)R0&qccyu#f?sr(#|zj@N5sU03FSYz zDro0;yZU|aRrIjd-8gP)n4P`^Y?|)r>8TJjvsa5oaidco0=xue30fWW$MEaa>lCCz zatbk=PLU{Oqq|52$XGHmg7nvcBc{3yK}esH9=IG@Qu13fJmTiIlT+_J_+h7EhTOr~ z-`?g|cKyxB+wfebq!@!punwYr;7ge9nr0>CpcpuT z+nofSTu|J4OG`=R27LTj2iw*bNR{LOmtuxc3^+?V>98AmbqdzNKJYAebLPLc1Jl^0 zSbnkEkt7F!TIMGh1~VXSh#13NmJ#O~Hnwsw2=_rDxU_d%4OjI^?a=~7F9;tKV0f0+ zOB5Nu^&BT87Jm#3EP-!HBO&rH!#Z;+Sj_a_zj>R< z9KXG))bHk(Y=w3KD`M~&tzq_^NE|rXU0CWfD2%g~X z#fxt-F@T)kS^d#uq@qFP|;2 zHgw=q3yr{F^q2`LFtIH`igq_lgkcB60Jxb#5)x_|1qGd9fJ*n=Oe-)+C5ZN85FVCSx&AX>TI>SgMsIr66C}gy&)<3r5%8|y zp$dWYl^0}!A6NmsNkh9d&0FoQC<*}#|5Q@aXW!`SpW$KqCh+|H+J|EqM!h5&9Y3?_ z%KO1M~Ls@;w#~zg9!<7kOzI<0YJi9r}0Bxa>Dr zc(;F*2vxsWTwa(l4sO4j-eWAmYw<1%eXCCD24{OA#*28Nim%;^FN@2{S|}{4>S_2a zX+atXU>j5c5M-eCxZn0<#b#~Z`sjv8f~LHR%2C0f=z|z(DQRh(4n&_*DKi|h+KDvy9--WU1Q^A8X+*@4bj{tBXCZ| z6)Lk*KtmIt)b( zdQ9faUkrqI2$=AzTp%eI4MiLBv;+3MK2BVl^ecK9*EW=KQSdI+p`shPNiSs^^-vcJ z%ySSd;Vk;#!Irg^RZ)BhzY?NE^-HR({08sO-+*Rgp_rCY&d# za9S}|yraG$R`=lZjT1_b~t;!nyEofxRg{PS%PJjFo<-DwQ>3~X;W zcL`f@pvozSj5+wvNawwkK^~~*{a}3LB@A%cmr05Q`kom!8}GzT8%675d!j%u*7yL* z1#uWy0wd?J059LSf$hKe?h$00layFYxsAa+fqlgXilo=@mFeB({@H~tB(8n4KMfy* z6>jH81}pGZL;=ZPpR0U#i4Yu;;;_M_r)w~@==?cHbrb&e>z8&#N-8QDPg-x(-?cSa zs7#<8zY4p+dKrYHi2xGm_4xaUb~{a$0<&;X%lO4F3X5#nXO)B0sPn_wAiv8q62Ji7 zB1&%Yhu08)38!ipy)g>9oG)Ny_JC1vghWII#)Fx%MWa=_AhRDpPUzk+zUl33^rOP6 z`S)qIDm^`K%4Igt0>YVy#9_`2s7|e5gv>tdt#jQ8uB9X&J~U*3p0-op#+)^%;S`USSDUM{YqXb7aQlbX%bVbeW;T_;RW1?~~ZbJ1bxz<~{X z{M||9!Zi)1)C^xk!TK?2=Z%Npoi}EU@+^h`T=M*QPNdO6R3*6X%lfBi&d=QL? zpa|n5dW@$X4=#%!-I*r;Z25Z(@I=Bj`;14yv-I`Z{5DA$8uE#-ect+Ed*KKmz+g|& zRLmNb zcRl7x&?dXgbpt2adwAAcKz`*6PGAaL-_bmXcA5id_|jzK2hZfcu`&x$JTdj}#2yHv zj+r4>G(~f>84 z9FMgK-hlO|`^?*sS8zNNsDz^(&CXAmLuB{6hF6CPDcc>|7O zD=Ejbu$fsOY6i!j{6}DauKE^?Y*Cb2oMDj!Tx)BP7RXV^@gNS_V|wu^i3>6UiO_=O zq8>?Rzs}g|;Os_SPCWcVBl-mru4nhdPO5 zLV<|_lc4~JcEX>9!&RSzI#)b^FG1?$KQIv>!5GVP3N7dN4iS3yeYF9@a|aT<4>qQV z*BMo6Os&U|H-8AWhxMl~UoNKo_~EXnQpsNdQ=b{cPme~zBCO#V1s7}~Y%U2Y$i0;w zqFfD^8AZQwwElMeol!m46Djt;dfmXV1Z>1AG1|v?iUN6`YzC&&DI)e+}eHbDQL1hPe zJNQju-WC_9en(B3KmNYOhXURDEU;(vOmfk{@JzWw zo+-N0X}=I4ih3SjXnUqZuHB%z1RU?UcdVpuXTa`s)pWN#Ghn5e$^-;Omm2}E)7}cV z?P#GMChEMu9OM2cr=%XD|J&r74IUGb6RTp1o8CqsE0Y!F;z`Q`1=Y{J{(IqVxX`5J zfz*nZ0`;7rDMDXA6CjySE%YQJg!XLLH#BNw-;LI4e!WG*!Szix?FO1-XQu(8 ztv%hmL&_e1TlB+RkNXFaAc-fX=qY;9oSipS_9Ql!;8~?4_LuOiR2zlR^+#c?x2~fg zTu0>6_S-qTZJo27^5X}kN~P`c2$XT0M@L8eDCoT-pM=icNO{fA!^?YsGF8T`L#GPk z*j&X$eRpM|J^Ckd-@OYyL!l7W%1CW>1wW<3Lojguga-duAf7gr6!ooBzfbFdJeM2} z&|oG!F*3O?FKfrE;KF#JvtJaw6mU?(-0#`N<4|{(Ckdv~UsLTlk^1lx;IYo*$z0XkJ zqUBN&7@^-o`d(2juFC|+#F)@w&qRVoNlxb3voV;$F8i*m6@K3vokS{_;!TQ3P%h8) z=D~}1VX2Jj6I|SsdqKQ*>?p_?SW5o(jf@|q#;a?-4SXB%rwc|(JIVT?+N8uOG=2F2 zZh1SHxs+z|ryK%Lw=HU>jd{Xzz4DRAH8$4P2oG2>EtKxvy7eC=@WkeCZ}0XRaU%?hGfY}hMp z==7_VA}CvVa&XGztOQ#~mA{7|x+t19>B_udyOs6-Aj|OA;ss?I_eK#Of}NE9EA==! zS}OZubgW{ij}Wt0`CCGCM#J$Y!cWKdza+*b;gEpI+P<%)!gD={M7DsnU8;ap&;?Md z0Fy6}gl!0i$P?o}#k36Jv<2m}gX5OyXX6qi27@Q>PR=%GlAA9t=H&y}Lu;&rJ5<0E zjw+`hLWtgIwAg22)|sKyv--mo0*WhZ6c<)D7qI%inaPY}mva4!B2o?fo<+LJc`+0} zJxGj-&_n{ywYZo zPE*2;__u}Dm;{+#*nb{AI%Li%Kid95ZoK#%q5gI^qE*w{`ol7~*P@LcM(?M5)#8k< z<)BA@w?)}FLyr==gKzSv-BhEs{_;0?X-wsqRPKN&-h*dJ`0{t_m60NGQ*O({AgnJF zhl2AzRUWf6Vc3Xk@uNssMda?+<97;7QQUkjf>5ApdLMTi+xlX)f&t&YqH zank?P_W>!8*Tf}#P^C#0LEMM?6N7bTP4e(e_0H$c)-1%Nd#e$-=cjR~P3>goh{Y<0 zhI`Gi7T#-k!59wL@zvm1^Ut3zfQA`q?lL?!sV zC8~9k{ha{ct>_18O-iH|RSQ!*OI`;N2-0}4zg?vJlt}Sw+?eaxO3GDo_y2C zfzpb8qwm|?@HwtX>iQKIy2HU77kA^3p6mNf?U*=O(|488Yg00}OrD=7hcUS^C?lAj zb#9)`8(#_2%h`i~5hDff+7(}IEMYzEEz0)7;qt7L+Q0>sVr-ZAQ`)I3#aF(2pe3Mn z5~;!^Z3*nq;gBaWJ(~#>)+bDSievZ*Q!XU&9*$us=JV+M-83Bc3c_h^DtlCMSQT1UxkLT~G%p>t}cx5a?s74tKr@qaJWo!U-(N=P#HJMZ9z>*a6# z2(ABq^Na8Ou-`f3x>L_yX}j9A$rfE0Ipg;KOJBtdaFZEk??@%)t?OeDQ!}0t57Ua0 z-mG3Y#Z1(D9MGb(G}_Kv6%g=M7^yisZf{--q+k-CjU0IN&NR1fuFj)zYE0*G0V|6` zTP(dwgz&aE7Y)iG=Xi$)r77%_U4r#j@vH({3~d-a9(yltN{v$b`Sl32{U9`yij7S@ z`fCCg_W|wQk59{;ozQ+z=P#l4p@Ie6xe^tkaFlJuhGgVfS&Tkd$&u6Q(jdOJ2Y!BG zw|1ob$}RZA3(Ur&c0b-C)+oH6#~Pp!C#W^Sqdr!kcDE6w_5N+yo9f47hdFQ~1g*+k z_)xg`c0!|^zsD2A+jDAg+xK^j#yt|lc)WT^#Im>(X`Pwgxg^Z@;$kTaYW`|TvX96n zTq$YR|MmK@^H%#2`okxQTS-X9r;Nm@81C@si&oMAl&twDrY0hb9F?L{n}n?w@sd{; zZYs_SFh zHqtGOb}ll>+U~BcoR1sGOz+?9TqM@d^$TxRu<3k7CSXo zMfC)VfrA$_B`@Cpdg%S~iwwPcyWQBkDYZ0Y1M_sinoZihi@${M{LEmR_rj^|$(z@F z>vdg$v&cvlKaZRb|GSF@kH%UI)^-uQf^Yyb90&{MS69bt^Ybn30?V$86J&v|>gTQ~ z#$d}YC-Uf2CQ=d-4P)dJCnV@B!Yrfp70XhLp4{)nU0q$aK=Rl?shj&(^=Sa++aez& z)yW#i3Ar|A)YGCnXS#3Pq(U_+T#p9AzniJQ%HW*s=%no7x)z<3$)iw?c{QQpg2|C6NJu)TMoBy~x+|1*5TI}XKDG;jbUOv&~EYtNz3dE&j zO|7T=b2rC(9!3|c?lWe;s;0x*w|Or|9-N|*J`nc%b=bW}N@9=ina#Xcwl!K`WxH_g z_8T>K$*Bu_>E9%DovZQR=%-s@CTUN#1E-YU9DQx2O5LX+pZ{8BLUIR(603W|?RQNv zRc4HpJc~89wC)vEq(a#1W|(HfTaG=klu|;Mc?_lk`59bg^11g$vKmDzI2LFL2TM*v zRfdFEVb>DxKfQvBUAn+a$Ym5_fBR&b0_8fPI{HTOkh=-vtS&fCxetY29{c(q%{I}R ze`Ep`PcqH(zhw~vuf9oxfm~d_ykB1dSp%0@c(V>#;{!=x;LD)OBUa7XpPtHDgQx?eFC&F*_itSf ziH~=yy{)rqTD^l*xEwu#@M|0t04QRh1zjf>cqk}1ZVu%_Eo#f;(+;%t>p@h4zCep1 z7${Ka-2@m{OCQL)4rD(3?HGpqDe2166m8*3&4sifsGSQgiIKBzJlggt$v;$5^9+t4dU$QZu@J)RIQ=1U!x>{bMPkprj-bNdQwFNnZ2vO8yD0Le8A;od4S_x8lW+-GhJBmQQ5n;89&#@2pJZx)Q;~bFZn#^M2!l zm%okvhEcCm>9c<_pVeZzqlGXSk##aKBNx=>W`a-H!wDy}3I3p$yW;R$rh5S!@;o3Q zfCzx+#}KVB4-Qe72+|0&)@4r7;n7hEjCbxB0r>taD2wqyqgC4}Qap(MQFHtX#w~Gz zbP*{98k232G6<{&!^z8uLPcd|huXUlIhmQvAuy?1NC**vZ3z@|FlrPRMjiNS(}uNf z9YyCn{Tc2K5u8sT(>2?Q5P21lNGiG1o3RKymSU zM6WDF-!P<>o;)yWPgB$GY5%|so8Sjcb)m((RowR*ESi12Zf2y6prPtFzVYbEUquWm z5Q2n_%4_*+GfZc-bC2G87wb$4+6wbdCr4J&*NqqGR+P)ehU+!Pd*WUpb(ZP*ook*} z_rUT)ur0b={ip^Zm(ajA1B$QBCyu<(h1=Isbegq7;z4^?{U~yr{&e*BD_y<)$JbX@ z4HAhhViO1w&+45E=BmOguA8p+NhmOsF!&mop;av3Lv}A9vPeP4$pN1c z=L%=5*wR`6=iAMQM+}aI54%{oLkn*(jSdTw{QZ(kBhVHqMjot|SodZ2?N5V@kX;63 zujA1`^75iU1gocHZ3JJv{XdD9Aqu+_D+e0a97TE*8*aV3Qm?EfjiW`-Z}|@grJMVH zPfAzvQJtjIV%_%}kd{z&9S0{2h6DaR1_AgC$Z5grI8x&(2t&^UV6dYXgABkjl5X(y z$AgcD6{Zy6ceb~)6w>8mqX-dH!-@eZnma#ODK7_pLjcf&!4^Xy^3!5N(N_>t3?G3~ zI|@w^^7p)}tA)V=2t9lZTj{+|Go-g}i6!^aS`XZFp&;^tXyQAM9uWc?23*ODbe0is^|o-P1$OBM|G^cZ;-6@BoeW1VD~YHdbK$e^Lh0B`ZoSki z!Ftj-(fR7eR`Ua8vbKlql^C3jg~10G1aG8L4)?Ba?*IT}DEf~=_NVhyt#ojts3BpZ z3|~z#&S3}AWh`=BOw>{W@T?H#dZDgu2%>d2LD?H=#e9>D^F?*I4Ott8fiU?)n@) zXe~OAo_GxL{_Jmmk(;0C6JDkd%+o%tJS-a@ZEG(p zI%K?>ZThJ4sjJ<~t*P7G`4nR0Qa4xscgn%mw(GRL|&d+aZJv8~o3 zxjJMpR?J+6=jsi+6Z+)sznO|z??8@Y!useE0WLKg#}fS6a?%QxXHPwqVLODSOR*q-hXw)7NXKyNSXBvb>O;WF$EG`l*EW#$gu!=wO$J$?EV)n1riRP+Rh zr4O5vfuNy<$p;~9RiFZqhTtd>9Q+pN7caoN-!fVhq>piz@EYK7R{LuzxL{~98F+~u zL(z>Alb5P%*WqzbQFeEKY570`XgR^f5p-(&=R=#w$AII7iC0b8y%VlVr!Ly;s18cf zC6-9+{EesA+h?^~`|oMNk9d>Y&^uodf2I8kL$diufg;VR%a!wrU=Sm;1xB*EDkNR| zp@~NJ)Q1-?bPp{$HFU|_^DQHA1UsLu>)H)!mnT>bo$M?g+!ogL`1)-8>W){x7Auw^ z8=V5ORV^PJ>BmvlG;dvkUT?61pd!ERmdS z_^E1%w&~L?wQR3J!_8|!OEur~9QZzJrDwV$X)ocXz%$hj?S{rHyt)}&iB8tFPKu>esJ%g^46uO%b>c08;>oi^k{FNC2SDi z=DM40q;Pn+C?(%%79c8ucH1+}|M3TH5G@9(?O!m@vp}ofbBqfjg)!O-A;1J_g!T3b zzHZ{TU41rsrN84e z-XMPTk@E-rjgCK@pj)GQj3oEE&+>JRjYZ2nd-e$T_9F>rkTO+5yb*^nVeh}Kt&dPd z{l0^p^ecnrlU#(CmlvI=XaYvCV%z{e7$+nHNce1)+1<|0$gRVuwP(tMdVs--<+n*4 z(<31uaPR;A)^dK|wd$jz`%9)TPm-kqF9+sMyYs}qxi`+cI*^4(WxauAz8!aDvR~qX zfiA%ls*d9{v`1v8hI;(o*GnXAyj#7BJ=)skp%7ikO0Txwi)aO*xyGb}$spsc>60Ac z{5@|M5ftu*{8e6>v^%Vfb{6l+sfTQ{&ZzDf^cUEV8n_BNRtV~j_p;DpQ$EaWn0KtP zd%}@DdbEQ5#Go5dyvo&UK(heB9p-p*wI$gmtF4h6<%&1-37sByqtU;Y?YKtEehV|% zN3~l#D*kGC$yN4uwRv5=OQ}++iX5Lv!@s1>s2yl7kfy88eX1n?G*|Az78Da=RT0wa z@c#3!{PjW=3-qcaz=RVBJhsi`PW_gcVB^;3zo++Ua&$_f*O3o2Mu z;(?_$?2<%v#MIbTu7Ag|>eQ3DqtWOh7*C@eq5~?tv;Gq1{`)HJOc1|G;BA9*-ZGDa z14GX~M9^=S+(a@SVPc+V3BlcW$^#o>Z34f|udb;n8k8l#2`Fn1=T_V8Z%iSsjmLPRh$Sv3 zFC8&6k&kQ?^AO|#ppi8X(>9c%>febt9;Ms zW)*EjX!PRA9I^I(GY|;jbJkAgb0s%blV2 zR69xJhQ#da!vMcXb5Y}giUJmw3A5Cvg@ut)^}EFK`NsCom5f7@%= zXq|y)`H&UgGYRF%N{MzGAubN&tv#rFI9O^XSnL0cG)Wm9T`?pqY=@SaIa4}}QLYq$ zRE`K>tnH~_{NptgB)|60FpOIaGi~7~sKz=7ZiB!nq@p+T zcfjd$GR-c7@Pl6C^g0Pnsv+4W^|$ZF`>Dpf$IEFFf{+R`Rms<{pLco(9hZ_l$R`mf zF_9VgP!M0ZdlHzyC2>p|lA&zUK`xm(ecNxqY>|cm^Jn|uUq0%^#&GPQ_A!z;UxQRr z^(UmZDdHQ8jvD%A=JCTl!xP_4#!>&Ozp&A!y0h?Z>W&>qn_E&&jW6BQp*)E8V5ZbI zyvNxPyy%G3SPp2_>S^Z__H|q{9lAOj4vwKj-4fV) zb>n<%?1tC*FsqrbcC(vGyG0OAnG3uc?(D45)zO)eBx2{Osr6g4!^D@TyZ^$B&)wFU zlka!)-vOg<5A4eAy3HGN(Ec_jJ8y+%1@;Y&>(>26y7tVpzp6VdI>T;f|t{(n0u^Q~Iy zUHqr>90`BA*NwZY=F}uBWl{Rd?1#Bm9!pKr{e3Hd{W zGzkSlv0ChWU`~N5Oxol^6{7t}#G=0uAV(}tpjn-9CU2SvxBhM1R2V}mAtst9Eo5$5 z9sSe8U75gpl~y=yq3fZP%%pWuVFRfdnBtIe7q)UUI`uML zq#C2LR%?A$$+mm+@#leGwo+UrDyt=oDQJ84OY$F|n4k~KWG?$$I9GldlL)Y24IvAm z$D7=R$AK956cy!Y-39p}0pzwOv=@Pkj+1?|1MUWRipH6C9Sc;V7HZrOShTb2{hnc7 zidJ(5%j*wD!2x@QqUx`2&#D^EqCn8+#KcN;!pr6%o+fGh`1@PAXWc&GUgLXBO%lo6 zd$^IDT89n=QFl9}aIr(1^bLDE29d(8q>u#P^d6Qag@Kk`BcW?~sJF>O{jV9%vkh!` zg`6{*=KcHyaJ)-~KbEPTvkew}Y2 z^mv;6Kbj9M2Q4@jsH(yz?SJ`EWrKw2E?V-FcvX{+ZBpiPZRuFp(Vh#niebo={C2Ge zYi(U!Zeh_f4#IhF0!yoHIq!7u*uLV*%Iw+-H;yo8oO3)MPBK(de3kPknzH3?iD7R; zF6dgoGYRV9Ujc^>ws_~aKsaB%`xgx)r`}L?!%QJGzmKMPAWa)o-U8PEd|X*eA3 z-UorhL$fh1Wi_=~1VjUOqd_sBXr!w7!gjTrFXDW?O23eqR~3abepU3YOlmK&Eno;({ps}SyY)`ws43KjlAH)cow!v z#uwqPapj)H>{v=bx#g^gxsPc7kM(Bc13 z^&aq8_U|9}WrRwR$lfD+&+I~GR#_o3va)4_Q)I7@JqjUvXYVAN%*-Tv&#ZV3|KIQT zyq@QJ-Q#t;E6(dW&+qs69>?eN{&-%5oIH|QubkWoAd^)BNncHS)Q8uf(nbUFhDx_Tf5mSiWxmDuNESE52d|m82Nuy)X+R$2~rte@GN0T zyMn5D|FQR&f-RFS((q8ivCAiQiOP5W8ujc~hwbFs^ z(9qsAA!*Ruxe6BU8FqqTLKIHKe6s^Z!}IoQx4O$16r$N>)q6laVFg1smCQk9_%MwV z#=(+0QfT$|H;5fWRJ01z2;>qAe(XgvYq!T@M;1>;>Xe{RXjIqfhqli~WLx>7hTr{A zwH_{;_x(MaP-{*WM>$?rx+Q@c*j*1=MQjX;w8X0|yT6=@q~(yN&B{3n7Z~H4^~l$S z$Sd|X4h_vFVP8weRZ6-Z`a^hItUsQgxad8t_`|1WRG;(vU8bFT3U^)<&m=dO)$_^T z>a?OPugPY*j)Gf^DIlDE zBX>G;|AWjIe8o+sWN1<*qSfB+VLu3_<#?vJ`X>Y48c*;OdI757kt4yo)t2dF@n{JLkcDIf4q|JT{#!ZZ6JO*cS-hUk{m}ql5x6#orXhSmf z7!)`?{F0hrzIna*_HFMwao|@xx`EgkVzqITeq%opat^wv+O2ZoSYfp|KS%=A)4U2d zd+RwN{}mPKJ;|)jJ+UV-x#%hxOfhP57arfV_YEy>x?gwS{d1Le{R%kZ-|WJn_TO!O z|3B^M?O6HB&Y^^d!64_nd^MBv=w>bXGf@x)UMQ2QsHNgR|NN1~;#v~ooBe{bcA`$Osf`ICH_KfE0vHI(|#>!bPOV>Qc5KmO(G z&8qtGgRCo<|9$0!ui(YPDdayd?huYv&j0<#ku|gEDmMeeTZBuT_`hE~Vsn4m5H#S- zO!J?Y8sE3;a!UXGM!)*g;iqW7sw7I}zk2WLsp5aW{>$#y#v$GP3-nsL8&Es?+RaHUa|KHV_B4u3(9LB@{yEv)d&yN4^fA~lpkl@jLUUtD( zl&yRl6!+gZK&p2fy*cZ&seey$q6fb9{>F~d>4^8A&J!zQX{7I(JF$R z42A!`-;U=g>Ve+P9c}-Jl5uZYYTfe5D>H*Q2J;$y3H>Y$B7DpiBBXCm4E5f7bZ`hP zDL0?|tCFG91b|*6x$HyuHNAf zWfXtK1Q@dluS)9P$4^i{s?xb>bU67+ZX0FR<9P04hRgkyu~SvH*@L6wB{~Y-DF1YJ zf_s?J4HF-;z@17&?9J(q(V&0Hui8;j^21}m#em-NJe`jhDqv!A(zOThy}(@UK%>Zw zun$B~J@12LP53?9%JTp2ICYqpybxxO4PLpaM_GQ>g<->|9?hH-QcTJuNx$(iYT+iT z!{((|*0uauS%OvfSBmG`Z*p^Y{H)YAFJvevDCD9Tjw$>1jC5bwnwu{k3NeTi`=|`A z*`Q`e)V8jm`ZLD3(A=&bcvSv$1GmU8*n1EYc+ke-%&f1cH=%(NMJ=CWQN9VWz}eRu z%oMObS|BeP?l52zPDDMjV{v$Qj;Q#(^ zXz=R%^Xr!yF9=o${qILTfAPY#F7JRn1KTH5PFcL`_~qCSxo!wY_AkZ)Y`~6O!3&;8 zm}p;)sxZ+WvBrADol_M*tj)t^sjIE^296EE>hIrEDtoNWE%dLRpZ((aN6P-*5AG47o{@lbTNi=wPh!2$q>HErl1OwyYHHzBg{5Yg zGE-fd0XT=k_?REWh!3XI%yZN zCtP*S-&XjyIG&so9X~ezl(U1m=O;r!SwVLRq<5;o&V$2d` z_l8BBe!nvJc&ufYMRW>hynLU6<-I40L%EK@e<)OwK+}3hqD|jp}=ts)!UjLFQ~lfB5m~<#^?E8_v~tP$iJQj7!3e0^2>9 z@$p03fvRn`_(WR${p;t?GcuK#*n-O(D74LgyEh7-U9lhHy5D{{}bi$B~#{M~=NWm{gJ;m(7f%yKd3=A~Zn{V2me{l9Z&E zJU{L*66Wl+3#9S?OP@={{8hrTCOuSf3JO1pEDcNlsBVp0%0Rf`w;m1SS&&RY^(#kH zj8(Yr?OZ=Oh=JGvO}S_Wl7N;FA~uq=rI%#rT2WHAjJ!^$FxEWWFK9aI-#E5$)W|YGQcf_+9b3Ca zL6HI|L9ZQyfCAWKOhvIZXfG6s1fMx@;wOB>UPPeyhvDH|G_7D=3micLAp*B(7$axu`e zdiipifs3o36;SSQ!l^+~y+3JG(9=tbW$~rZ^szMgNAqLa=h5&rt6K4*>5%*16GP>d z73GYQvyUvsrBXy)Z?aoEDm}c`Z{q$zLYfcFcNw&ehY+~e2`MIc2z1hyE{=A94MxY~ zw^VvZDkQ3w09Eb0LV%LbcUo7-(g18aWqa>e1_fUR1+eeMs8XnXq)%52ZqAWT`>dIB zQ@(7KGdLCXQ{bZ{ErE)YgG=G`;N(*(GBQOppZIv<;>WDza7sygh(X@q=Kau&sk^N$ z(+f`PuI;BOG)T}wrPatu-lr+yo7WLee9+rIfzM40CAB8;I_lIpm^ww^gR$zS2Myb;oh6Jyuh*Zzh~>W?CMp4@SsU@$mHP zU)_El{N4P=XBr)y0iBu+!oPI1PP?(#X<7H;zJv{{_MlBR4?qjag9{VRW`^Jxz$Ex~lcD}|H zc?C=+c5;NS5@39>OGS@n*cs7&mad*DHxKuhFrJk80`K^bqtupH1iHqzoC?sA553es z^Swq7ILzfc?|#$&NN88ia4@_E(UbYjI7r4AK+C}J$wWqx+b=A~9*0^q^wZlZ|*Ya`@+=P%W`T${yiRIDGx}hy1 zmmg-n^Os)*=9QN>EpD3;Oe~8N*^{!_cx{PpsET9!LhIk#B7D+}hjL~=@WS)I&vU(5 z!$g231Ust+tIzAk@)65GFuMJD7p2W?JsC=^PFe|fmHIJ3IG>}qlD(7DWPDuQ%-*!? ztgMz+obg<%zr~MF$W?&1g|lW}+f31fsD@v_b!yqG=UH4APyus2fO$ZiK6dBJMm5PZ z-0jw7Rac|qObj47KggQo#7?p(SSyTGQ;x}Ul8Ex&AAC3rexIG)1tmy#(Q<-S-Jndv zUBA^~ZQm^1!9PhO*BKDPFJL81=K?$G8*l`pT6}fZ)|YaIkG)+JMev3OmpUZ$WA30HoW{;Ild`9?3`U?7Luj(C&6v1 z;^`>{D4DmHA7YjUsZ-liInB&L;X4=LSL*oPT=yu4jWg``?ZNC}N5NPNk2t-eaeeoO zH!tJAfBo&(5wTt#6xR4Q8||f$F*1!$ksKD*<7q0c&{{Ri+2QN&s(i0h3?QBHv zMzuO@k*o7hSz@qiK64}#GU8a8sIZKu4vO2UrXMq|eb7PdL{Rn=eMqW&=vv?l+<@hn?7z#1!I`pR(e zxf~Sy5YLwszB)_2arSTSxm~0O(4=A%X>NsfO_h;N2T0+2LRB#cNm8(&K!UZ7jt+S6 z-;?+99&*MnxvLQ({y{-F^=>=pm)#qfw}Os)SMPCtg$N&`%(F-B&uqT-C1kXhVeTHI zzW-)=Aj|Kk)h(4j@;iskV=9cp$FSH>E5C4ElFb(=Ka_@$rK$knH$Hg=0*FwM%F>tv z{9ynP6U_du+&1+BvqFqE1;?&w6O8gT@K1;WxdgcT1fCzMSK=V<^>>rHidaTBZ zZa_MhJq0$@;{;wnnS(}XK&rdo>O`GiXC2Dy>zI9M(6tRO#)&X!j0omYpSC)b!6> zPN5P?{^JYg`k@sJ;d`~lXVp7>-4=>H@M}mrQl&jXyx5LL{eE=TCPbp8Odj9oH?8jTSU7q9N1zvDEiG*o@~Ez zxErh-g`pwALo8aA#6P`Ok(5rk}r;gULIX>R_-0z7KoXlN=? zadB7?^G3F|Hz6dOjg1YgcALkbGk-4@xxwZHVkU)J?;T#`@^!pa{oL|uM=WxG-}%$0Pao}?ydm@m4}fh0 zC5Z6@$j>4Lxm{3bXj^Z$o<%utRBjzcjhQt?9ZCK_t4xVQyLzMjE8IW2y7D3*k&74C z3BOqyGu4CJ9%GwOnG1D_FSXLyrMF+z5V${+6XP1cDVY3lV6*D z%qbFx9}h`2b=c2BLfIV%^^sRm@t0>ne1TE}RwQnaR24j}D*9^rWXvKQ&9hL9!`8E^ zaln-EE=yE2jc@DBRmp;r%qnbEY2EsI#T>~fx`&B%1|F}8;yhn6#y!}L0PBC z%gcK&J!z6Trc)!7URPEnkVxRJd3=benKqrSI$yf$OV@6vr`oD}Ha}}AS&*EFwky(c~KbcTmbdbz6N$O@HkDe_1F;MHoK{^%*QSS3+eW^#xcd>~TqIrX4ZZ?tO zK2`G{WGx)}tWJLh-udxL#CoiI&OifCmHg(z2CA)Tcg#9HFCWoJqp^C4RUZB{e3_rl zYP7VpluG>EEGY`WBf6cku^`Bl-a$VG>y`5{;`%27R>mIou-En+Y z!EB_$=!!2Ut6sv-=hylzo4ZFf8ij3-CYEM+4!W7_V0~v!+C7s_iywV zdOZrf*f^g@9lt@Z2U57!y%(wjWi-TM%-dpi8ZtnR=$)OMd_4qc#CF($f4NhA`638_ z8F|%ysWv3w#w8IP%&F+jGffkw4UWpOB!xc$*2@2iMct>E5TUSDTdR8qsp>&=k#&6@IlOuR@R&FzIhjA(RStYa{Zvr>5ST+xECSl+| zkK?D;8Z+fEoNf1I=GE=o;m3JNnIh&PF3QF!vi*`D-{?vD4Eg6W zk5EOn8Dzt(clPe~ zbFppVzv*TP^P&x)7EXS7l&zJ2wY>l9lGUm<;m_YXUlMEl8GRm4)p(_UH8nF`l*-Tf zIC5)XS)qRNK)hhG;(BmyB5?k9o|>1fLwJZE_6@SPpy;68KizVqwLRdc@Mz zAJvc6&78H0^xX-Y2eM)Y1ravtO#RdCSCuD(oWk}@c&JyF>1O#o06Na7HtQX}^98x* zd|69FdgS{w?L!QuoRfye6bVb+ZYoNgg?-!aJtN#sbO+IxE(=Wg{LhM>Mb`27FO}A1 z(wlo8(Yj$(pKueLK6t?M$yz(1+f?qMpl}46P{@;eNoH2VEN~7)u<@v5fVDys-z`1F zpTuwJ`}s37z+wDA;vxD97j(THuuoq`jX@HcVS-HsbN~z8(vTeC6LkY{F=k|DUe+Yz z6BDhyFS+jbuLn$B(Boq&^Xjp8N32ZORVC2id>&!_ZfedgROOSEMdazVc8SynkN-gX zw{NzH8fz@JvVpdwq~spRy&}Oa%ZP^J<0}sUgYYvkFoX6Ff7U8(p~FEZl#M0fNMe}# zy{@y{_!%Kn57x4M9-ws%1!q~Es$9`4-(Rm>; zW|Ta?Cz$g%;kWinz|c?{JmH_9VdS7+Wt)0GXUG_$U2?%vJ#e@-*6#@iM^12&Z+zoc zc9-j>XvRm;m+d+`ze*#c$ZRXGUi#iS_QvGEE%Du3&l{m(J!1TpkUrIMotU#{WbMES z_4aXP8U#Il1xhb4g93pZ66+E&{|$5&222ktx`cEIaSDa*NBEoNNT@doFy$|kRRG-D z>d3g=(+Htt$&dR^!lB~`hsfj!4=s}nVPetR^Pfyegvn-R8BXE%eG;gk1D z@6aFDH2WjsA1C_}iJDpEN!>}}@cHH^!uJIaEyVtt|pz=MsEPZ68g8EYCrDgL*H_|%8nWfm&6B7=q&&Qzd^YBj>@4a%>a1CM_JP$$ID>w*u062~_oM=PH(Ytx<) zGP0`m3Jo(JvxaXXIFSDUcPZoo<-RCl9=P>grP_~W>vb%TA&B+67B$kAu7j0wbs0?M zN8^FQ&Osfp);<$sCE$@2!fM}wiZcw(PJTkP+E^V9VDLpdq-w$;=8~-UqzJETN|WL6 zrz8`wMuSp1bC}!?-LIvjx1%F)Y{i)vt>8Ky9zvb#rN6uKnuXvllzucGhQ<^XA&5>iD;9+ZQC_@`b5MF?H-@lWG z!Xk6!L^eZ$4YzLHnxh~j+%Ie~`aEnw^e~S#L`{RxAG!+0vl8>K)xxjT7uK`evKu0^ zBfcN^loAVSaYXLKrS1x^6!Pk#-bF=~k~W)1%xl1mAu2vzduHb@{IKx~3%KVLC{cJ4WcL&vM(MR-OYXe zof8nX8~(mRCX;QF&PmPo1G`DUep85EVP8a0kiD|JJoC^_!>f%68XRBpcu#DY$08(iAl>hHHTPC0(_ z!q7Ma;jRh2p1wmx(7Z5Qayl5;b(*}zp_#r126Hjv)q5UpZsR5Fr)J>$se>8-Pu$~u zZwD~%sk%Yq#C1FuNIe7WGbK$;&7rWtf5*sD>%P*i;B{_mHIA@^3c!9*LYy*(<_@P` z#b=G%Z9Dam!vFMs>?g8O#+JKBkX*0%Z9@_=G-0a*g96&u=cVHb|C$~2 zJ8{}}l@nNCPQBhRh2YjXMKw^@DNvp-3-K)|5q#R*5YR1_`!Y2>O>9rmu_q?kG_0)w z9E5II+bds?U`Zlp+kPsJj%B@L)x7DqN(;u@|4y~}_rqv6szB8M% zHna3&XOLPmvPgQ_Z}@)bKudvhKrl&R%7Qx*10-uTv*Ot+@w8W;S!q9wON4c+nQ#Y4)F?_^nv zM^z+6dEs$^fq~(%j}Q0mnsn$iRwI<1QO4CCEKJrHbM%QCfi)&3kw5D5bq7T$`Byfw{>*n{CRF?HC&Lg9Nn3D zLn#I@KU`cuur9j-zXt~po#~Vqu?2nX!njVdD@S(!Y%Muh6m(BT>H}X4_6vNvS$5&uiS7eO8nSujX}*R+4;oq zk?xH$nFB%@dSqWUyp}g9_+@;CGLyS~RII*VRc})Ha(BXVT^cVNDHCRYOYYE;^gBBJ z#yeQ4X|f*XHv@3VZ@Lm=%ghMJe6ycAsp>X$Le^^kQodvph#}s%eW%Vl>1MQk=%wZe zVi95>dAm`L$Q?5Co{m+|b3ZMuPzzkru@Mo@XO0}@FPQbLcF3IQzoQlRaE*f(L=my% z9B^mk*5J&`5{l2q;GME)m{8NvuG$*!`5G3gdQ+Gwv+fr$CpY;O7py?I;A%u;7-H_= ze`>|wEfaH)WNumht?#=|}J=l&cZnW#vcKcu%g;RQYt5MHxG} zCp0EP=7leBUpQqiE+CG_Vm11WeLX#4z)JyUHMx){^pj05ZzKT0l)(Z^|AtqAy?go) zf|1`bTxHs0Wa^#3bK)a|;T1$Ud2$5j@|>1KJHl-ho&*IxQz%zq_5;p5ZFN2yOBJZ2 z8~+@^kVqIg7i$FmmfOTn8a7snzSJ4nDjsB>+j&_H1{9*AbFc*q^>+iP% z$mgfmfG#nBkKx|w>FI0#z(C@r_}1!15ym8dN#291sP-4^=)ocpCeP~Kj8Rg;qN1Ac ze||$R6%D8((8T-E+Z!(Ix=BF{`ulHtXA~x1Qq6wyT2h2O+xl7F@n^3A(ZZN*H<-!Y zib`|F>-wrwB67{^dufc`ZI#gv269N&Vn#K^80ZUNWOT z%v|6hrMXtd@xZ)&w=jPXlN(QtdnuVzMU7@j&BoiN~_$}}wC`5dNf`U|H6AB1a((c|3d^Xh-hZ1&~ zpl3mHe*U9je#5oR28BD?bS8D@EK~$Leh!)XD@5zG`NVye3Z<2(Uhr;mch`alTC$j1}`vO>gbH5;|l?i}w zwWq#UuHz&CHFrikLj9M^VOHZR^kl+)zpRD zdfm0ln-aib@d*jv*MU2=y|Y6Lgh&T?^fo~?EkqKai}kCF<<`;-q)<~Fp#YGkNl->_|Jjb zXCCwee>=j+7Uq|PaQ_q6)mlXDZ8V1R%W9tf#k#waHN!kuBV^k{GHc!|5dg`O;BYE6 z=_Si_IbR@r5g_S*@gk@=Bl3>IpJ}%}7sp`_k`m)c<;vEi8;?yArQm@kLV1kdsJ*@*e4k7f97*88{F`!{DIX9##IStxI zF*N*krg$^m)edUpeJQ&V8jXCksSI7zA}qYPZQNXydK+(>j?f+6F?$j|kcMUKUxvKa zeHodr4PK{*EU5M3>`k*+MHlzZXhupw#AclPb?e)!g-{qPx~>ji1-S5YF8ykJXaL10 zJueCA;_ZMb^H=*P4xHK(QDZYowYEnx+CSs6UhECUIFI2T*NRNO!8r?ri#$eeK7)Mh zyC9pBZ+~9erxSBP+-m>xxS?@NaNDh;=ELabsEFF8diNj)tKb#Yq7SUq2(nuzY?wSk z?875IW@mM9;xY6>`2)kP;M#Kb$xq!iCeU}ByXQBjukMt-$ica5r(K{kHxD75z{s4N z+MFhdPK($hl#O~``cI+3n=y<}ezr)jvTF=%C(uT3PNWp&uJ*V`G~&X6#vC#Oa7@gP zA}BtT9-+iUXSy?y);?me^EV#H_lQrlRV$VB{0Uv!R{>Z7p1~C;r#*SO4q8Nv0(&d$EcA$Tl?TM!%g^85VcUet(k@ z92OKr@(^DJk5KTcO>1)JqL&D8hjw=txH2bxujYpIE%l+4kMJ+y9Ga&Hup#-|nQ z$9}@kC8$;0$SHuBOyBHEueKYt_Nq9yd0UeAe^OESuE?cyR3M}JDn3dQ+FCy^nzJ9o z)5SdTKvz>3qV1>tL~z@fG3t9e>f=!EzOC(d#vo~A3B&Hnc`6~^-$(9k-PbNPnrA}t zY!Q#q522poTt1cTSHo2@W$-+kfuggcEsJFs+M1*)^t|S1<#!`fB*UgLAZbR8-XP{ z3Ds*dv|Jvtxo^%9_%?^N&R^?B>nW0%cyIQs{UK+(DnLq`mN7%2El!RSJI6D8*Mr*6 zwDkDo=l38V{uF;y9%S5OaZi8yW)9dk#J zxY6LqZ}-G{R@Jq1Yo_qu+4Z}{97*L8EJI&i=tG%4+B-8uj>R;L65jHWK;1*DM*aH4 zGiiYK64k?^xAX+nchMF}?*y5%W~h?^e#*pz1Ys(v*4g?;{62B0Gxdak`8#2V(wrJ2 zG`*$yRa99OH_B+~>FNJ`(BmcuHVp@PTn8kb%Hm@_yEjYU#(fpU^&B%_Ldm4@tIp^0 zg&R})S^F|$6L8p)`gT=RZc;~o^5iB#=^G?b*gMXAZcWJFxDjXENuZtK9aL`mw!B*Uv6)FZ~G{}ggQtX^gn7FJ~$vL>?< zs80*0?JSA-Fv#4(wLUT^81eoPd%#~@`?{o2JjLCJ8OIqT(h0L|f$Q9kfe~j=rx(xUdfmMDGgo-XtpAHs{>D=RT}VSJwnsjfJgGK~*5)3pL@um}#Swd8r z{!k;|mVb%}g6V(tYnT7vi&kaokcZmdJ`Zvj3Qh&k#G6iQ=WX|vP-NaDO0K!iaf+xR6d#;#Y z@z~E~`JH*lLH3GtG#}&VKrs~^wVaFO`NQ#RyAy4*q;a#BoZm|8x)g7pG?)v6&SC=M zP~#NRK8;wlH(gLoWZyH-Jd$+2$H79NAQk;}>HIwWAD~hCZ)5H_X+&EN`l_NS+))v_ zo25alh2)fDqwdpndOV5_U+POVfs`CwE1Z)?!CXQnwd#G z<7e5QzsJwVCtBvXpm+fzkWc`hLifY>GxC}F0wRGkXCad~JAY&q%|{(i=HS?CsXt=z z)uGW1tZG3^t?1eHPU;se%Ll)3v5u}Bu!S(~L3Ufd?Wn<+TsYZ=UcFnXPW}iTJ3H=D z|A(dbie^u)I#~MB^l|ExG>da{5AceMQ?hs8gBgL1#!$8jPjxNB|6~J5A;={epo=Zz z?JYqPPzoW*Utn;PV7t_pI)uia&m0{~-rcWBFtascCqdBpb>(k%L*Q(|Dgk3u;otfO z4yW4-d>jR2lM74%eV+Z3uh&*`WMg{+;eZ$OP*%3{-`N>7>J+fff4?nhkAn@NG%RTEqkh z9$FITR5(Dozk*zW9V&`RJ9ta}0ZPf6#Eg2Rk>~q`ov?OwG-y{$W2^ z?1u5<{v14f>?ou55TXPSr2^~6$k>=xClz@lW9=Dxt1u5X$X;^ z;9PrXMV@k8>rWQbp=>krbCz*7b_zA zX02+^ux;!XxA@$2kS!@olM6X~rC!BG>zRxzNmUloeO>))ul7b$Z3Fve2J&#ZZhrk_ z@|cJ?k)VyotcwuD?6JBujEq;1vz^y9O+0h=wRWjzz5b?}L7-(nz{eZ99j07i?5iDi zixh3RD@w60%&;=V8X~OUhnMqpma<3f@8|wog><<0$A6Gu-8ZQQ=5cz3A)upEW`dwZ zTiuAqpm7yZAmF>|>+_g36u85UPxlQ9WA3VUo$jw>qT^$uG;({wGvsGmmDhD_!&>-- zgf7-6+q-+5_{v94e9`?{yL@Tb*>k5->g#39l3s1LLK+(ny#yOGbAo9>C)7;U?ti}D zdieS^@*0BTVb8|^*ezy<11y?86$Wcsy^B4muHq6rrG-4^-BW#NZ0N~%v_>6B85hdU z)YLk8LkS#1GMxn6-#(rM^;{4d@J~x?0MV|5T9+On{g>09EYx2Jy(2@YJEh^tLJ5!N zYGQ*{WF2a6u%TZE#3 z{mbTb4)o`A5SQS>Q?GGR}_yed$|cTt$j4+l1v^e?9y7S+mX zAGZp&OiyshxLK+ z06;DR$wM&Yj;92ztAEDlWoRwUF|WrwXXi!b`}+Ca?MvXnXu3ETy`=R5eA@`dy(J|j zB;qcs!)wf*ACL2$f0h_y=)`$#OhF1afZS!^vK-Eib~pvN^$Y=iO%O4!rl#ftGhQ9& zF6+XaB@!}wdGz4QT404j%9*E6=wlVtSB3G9PU-bxXN+SnOKpA?xw=|@k;@&CQ6&&X zS_of5H9LwqKEdtz#PBwgfev?Yx^oqpbIIl8DmX57=duOIHYC`wuk&=ly`Xz&7+s)kTDoFm7* zILsVr9?G_z-kddP=nBQfqT5^SowCV_R_N=Fp$LoEJlG+ACJ(!bJtMMhWN=`xHsh#_{4+{l*DI*FYLl0s*AO$A$2VvW(>V)Cp;h(XE zFIdP#SSc1>3vGECy|9#Hoib2}3ct}S-}9B?W6`|&7zN}sdY|So8JnBGx?Hm(=%R4g zyYHu~{W{)T`rg+k2e)mS?8Edgf!L7QK4iArqx%q2C_*nvU8jvzOgH{26Wph{s#5zg z2)VM}5K1SwUUyh~7~#V4+1g+&&sw`+?fF(w0VUD(SG72FG>kL?@Apl4|Ng}`yTyVw zz4dp)TckhcZldYppVZe|J>q*auVrwDdPQf8@z#fg1e|oW zASh3-LKgc;HG0$&-mBZ+Va-TLk?qItGS!PoN`blpz{zoX!XC2FtryE z3)TrQ8Fw;l6ES!eSBSBM+y_yxjg1Y2poZQKf;@`f@UAj<$*JF5s)qj32mub}hYcwl zX>)TXizKWM{efEf{-6+rD5?AD_=1){Ouxuwx~t#0+r}LVAgZ4WAT~WXT>ps?t5~@K zVipq6g^&bDgYHk1;69Q8Vw|feoof4ZIo8;|g1#E!33GcYk-gWLETgdV|0*z)~54xy}c=HTP^hJ_lU)6*@T zgu0$D%x!rB@mo84iKsQ`m!8|OKfY*jy11Ju;6vk?w#QwmV*zaEC_vC^$ZjDwZ+`FY zsR;T~YVF^bwul_BxRilmNwGaB>(`+`8Oz*^s+Ea;xs+zY$o#<6Z^*fxdoR<%nv$)x4} zO-jS2ji%OoI$nn|@!ejQakfCZ0$+Ui*2+elc?Ux$E40CRSIOSsq(v(K4HMrrTU5_}tRzMmCy2l{F9LPZ`pidZj02FpJb(~}JFy;m#|J=_4hjyw^>V6u z2cFDD)h7iOcK1v2?U_0Ez-ROl&O3M3Cn~#NZBEq$K*u;0_tz2<5^#Obt=^EFTAa?= zv26FxOhdpa28MPXX?AvO_>Ga82iPnh+Piubl`;$0Moc|(=!ZmGY>J#rq$#HLCm4lu<6?kQ1X`6Kw5H|a!pl3;|Lo{=D-J)BbGpt%W>zBHtN5G; zjTdfvh#4$nNu0oY-dn3u?G0qdnXi=}kJo(_b^UOz%oY~y7`?@jKgs#s zsxR7Qyz1qR3`4Q5FNLX9vk4k$pT8TzpW^m+GgSe^mJlKY-}=bYJMnownNjS%6auy& z`x<>6J-y%Hcxb0Ah9Rab*tq^~is!*k$i&!WGgfptjC}*98ajx(DECZ)l}r&%`b4R& zkM#8PW+9TP-u>*TbOk(S(nHRP#b8~$T!-^f_4($aR{StFdI()z-hNm8a&eNWoF$!u2CzFptL|7^Sl+3oCe`b z-|(p3OO`*NivsO^b93{htq&|57?1OOCqwe{t#{0Df4zey_eU^9Z7?U)9bSQURRI3| zZ0pL2GnfhLr2!L2hJj!XrVu)nRIp@h?SPa;Cz@-Lze3Cv`bE5oFU2b;Crv6k z`q@`CTZn5h?cJ_GbxY3-iN*7c&P^rjDCG0N3EdKH&UzO`I^&=F+482J1rh!~4~gAt zY+jnV6AIk7p57N7uu_=|_a$s}Ce$P2c%IR^bJRy&5*_@GbnMzM!9c~d>;8%c%!(B_ z?(>oLQ#Sn8qWDIoY4IH|%oT2|Pi0>bW#XaO&=1T^Gtp-Fv`G6fI$Jl0v2l>$I?SO7E&TjslqKAb92(S?&DKX z^vu@UQ6mtm>!mEOnuCFkF_PQadAy>rQVVr~>IF5&)67A!(9lRHi^=p@7d2D;w=W|5 zQgzwyu(1l#4opnENB;I1RKo6)eVsV6gM1u<8zOYr<$99@F2!U}`TlbFPV^u(`MQeX z%?gdHzYQA@nS4NT6T8*F;Y}>KpZ;Y3y{=ZqTE-Txin0+ip>N(v$($=p*Sf)MY>OI) z$Fc#o=22VNytDwp$e#+E`judrAJ?uZJn3F*mKflFd9`^Iy8qBcf<`&VE)3gv6V_-IB{E4IU4N zdorv4&W&;WekR`Y$epXubze?j)~Nyq6_COFdvz5?g199=ZMKg+A#s8IStA8JHiZ!b zys$kd>#&b9Lyklt!Dqw!`?O4g=@&bAt{zB>#1Bayo5*$MWDRt;I~eh+HJq4T$N6{3;qDq4*m3c6O*Q z+Ld@*?6Uz-b-#85{8cCm%1X8~pW zWlTw58X_JFgEEuh&+2eED47OJ+1pm*Rsq<317zr0;C`cXsb2(MlOKqpNXW_K>%TFh z8lhc5QEt?NKAf*@r=qVv_2_-6;(OzSM7pT&zHM_lKlsBxePV!C8yQruogn^8L!&`! z?gDkBjZTGyy2DdA-AB#Br2phR2Wb!~Dq2*z@w5K;x968E9d^z}S5PxUctpRLu71%Q zvpTKHi}&5T+Vx%^G;MwNza8}IZC^3JUhBNUQ=~e(^|M0GZ?dX*e!LW8+uljG0jrnC zb;gq~E99{8_1{t6y`@OIg{1}d;-Ec*0=W~CFWF6Tk6lUnPJlf=v8|r24x+O@WK~I( zote;8E$`4vvtsPk^R|}{1=c5OFu)*dzcxxq@Q7o$=n46?nu6^N zv|-j81us+a2?;YgV-&j^XdS|b!>uQ4@8@n}(m#0cXE7geZ@M|05pOk^unRT(v@DGb zUXzghJVa$S%v310cUYuHAPA<*89j+>QlO+@B+E$DYMiSOoQB2e=ze?H+i$;vG0SiG ze1_0^SScD4B^>|AV`5{2-t@PJoSfWA)n|7QlhyJ~GqVXXGutf< z^IR$S@mTPp%e6pU zw2zOj%&y>OY1F(}tWan`rxMS7QWxj9vQdXdD`xUQOML0X#=%zb#lIw?Z(!ii9-J8O z>beH|(S2oQTzJAD8lEJPkk#Sloz2_3g9^q6^v)N%|Beiai1$KI5UWvmF930GEW zA;M|l#;EA@J?nYIu$l&=C?bi0ilw zkM9F1DHM#5XDF|PO8h|yVwA9W7B8O=g0h^-h{U|4veG38cGz+#;FEK5a)>#+rQnnR z$MQ57#t({thN<&;>3L6Qr>@}}BhgwY?-cyo-dwtmf0mkHgEE>G@{mB++T79cqEUv< zvIcZgmh^H+STn4Lw6Th=T8AYXZ;moh&NHBP90GZSJ$xq6IQS;a$+=16lWR6YO^XR7 zJRI}gfYbt#M|w`$vc-NVdE3s8_evp0o#4)$I0+aiPlD93oSff+`x#TrzmB(BZCCUX`nZ{$zxA=b$IAOshaq|hZeAysB=}(i$y>qSA$aAHv;65n5R4$dbH7RW@ECLwDKboIf{*0DgtWUVB-SxNr8IVzkV7uWFrq3SEZqU^eMhZN}& z=}UU!HoJFO(vu$8NclLYmXM8#9$bH|L&kPk|!Mc`6@q~Qr+F~fCvWv1+rI&%-Rc_V47R8N}W`b49wkf|G6M*Q_khC1SX1@gIta=>6gBj1!Ae zH9t@HZ>9-D_2umOTOx0-oJ;mQ%QsPk;6?IJ+luBd$+so3-^jT5^fM35k>7Vn{w3?> zQ~3%YCvX83g;UAY#{!V)or8m+_6#OMEWUi*>f!6Cs7c~$^l8>Q}<&8 zB%%&B4TaMo9SSY?{=_}F2Nf{^43=81dm`wCEQi6(br_oHmT0DzF#Sb;`LaU_@FR;F zv%Wjf^xc4A^$A|X?iwk2Gv^@GL|V|)4b({+6=|?ti@w1-!`JZ5n-0O&w(f45s@mGx zSr9S#%gf7yJ()5~@gaCxyLATw|NZ(#1nKP;bk4@kPT4AW`8r6dOps+hQ*fNpFZmXn zH2knJHsMKM@&kyg zT0oyJgv@lnC)D}*JGBcDBMK=2F9Z8hRm6JT|EdYIEO7Cd|E0Jq6(MFQhAMOe-&c&` zfoBuTo>`8Hg~r%m6PV+U#&a#QAAa17?fs4?o*}|gweZ`Q@c7Sdi%iO{qynGBBERr? z2Qwb^s88>J|3=>2kJcU>tY1_~G{pW)DsfkpAMVb{Nl@d2!p$@f#F!8$cx2JMps9oo zj1cy~+xGCQUeX#UAq2qiI$MEOtr0Rs{XVn_>W*S!`n4E(8;~m^itX%nE-&1Sj7`Kc z`b1fyIKy>ynfwf7zZ)vF-wI%PGh~45dp{&FX}<(ITTaQ)S8ONlm+wN- z=Q3Zd`tbj-|n%+TJvWVxrU`j+f3n%Wr=0<9Ny+S-E3cwS&rPP{i!{0z>VEfYL3vl*1 zLGTaevH!T!Acq>kh&-f4xh5gg4cE`jnGTyfXS5$f=s2Xs6->r z8giH~`XHJaj-G27z;%2c9FdySNH9!_0mkd76(10BLT_9fUtj+-@C5zy17R|L4iM4ul{L2vcDgO?zUhvnFNmAf^dc6TU%Pp z0mLwE#=s%d2k8?QK7Ifs48Sq}tgW^6<0{hw+%a2!LOXSOLVAdFT&dFD*xcMKbFuf1 z5r(l4_|8*rZ*TWpYgj6EI7qSm|A~xQa%*8C(3Z8tChI&&--;RTGBZ*K)cCyELE2T~ z<|pxs29|F|MYA@&n9lfSu&6le;YWzd@jSHkhm*jj8k`K;TX?CxiN{5C|s)_c*3 za+{#=GcRcGn#Qv}dfFByvd{{$oxGMgIRbZxH!m59SxB+nPygM7X`NrC|6@btxxVCr z)_cqZQ4B;{A=ZRCV|4hoZ!s!+E8FEuA~O}-1xjw|TddMUnED9^Xk2IwOFO+q#%MZ~?#gmz;q~1ZMiaOWTFy7q z;$B-!rUi712LhU+=C%cidDB2_3*MfcRjMzXSGk7Q)yQ#6z8|wu)+8g7buBqQJ*k5G zJ0C*w{D71^2X$y4=%buJBx+rTSe2(4d}I{(=gK5tUoA6ST7zbPiLJ_r70qXQ<3*#I zpErcEgulwkj2R%t;LMygbJIT)L)=)w?i^a-e=r8Si^U+|ehg=KSsH-C zGMPSF`PXnfm~*@X8<1>-=fLbg^EYqiw^>4pXKj%JT$YxWjX-q`X_mW|yD~E~>yTpl zmx3BVz-c4?B=wmuZQSF@zM8)1s#5>zsCP7`a1ei6??*%Qy3H63S}RhyB&2m?pR_UP zM2y}sj9kgz^)iY1x=Jvev9Wkz>_o~&mODACp(~;0ZDOE#y9*qIphtxR{|*-yF&>hN zPXb7f;CPn$DyR2{?h|NUHzq4dK%C-&tzUAkZQvFvoYs|asACZjT(fIRVCnw&EQ0i0gX&ZR^pPMDzqU&$g_j+}*Y{vr zJm$E6zg;O!5lIgsP#!s0-LtU!L9rnBfK>BQ73BzkUCfZz2RaoDuM|bXqN_h27{nz+ zuFgxEp@6wI{e)=&P*ZLJ&T>_vXr$^uaxnx)?J4~8R6z2@g0q9KK(F2g1}125D zAoPv7c`!IxUmK=;LKr;-p}GnZ3KbK?1S`?zQ^F9OLot@NlXejI-E)hY7+7 zs8sxegKw5Oto8?sT>K+}0z~ZVt5xqShv#xZ{z}9P|4Swy<9a7hDuYvMF-4f4IMld# z_7;H<4y=5}+|?FL5=ca{PfLx47C%xr&_aTxI`w4Xn{pqrBZK|a#i{LWeF|E>(wnt~ zBEsc`nWO2*JA7Mc0+^VErKe|TX=-03FL%XW2F~6Cq&7<053IPMMx}LsN@u6lL0xm? zm&RhlCH`Ak?Dq5fm(k+6x8i~{EP?K1@J;2S|FzUuhD?nwW&XoNW zoW6bZIS>2%)KSJ>|70&Y z02O6>{@Rls2o+?1aGVMaJ`}nw&3GU>`KDRI+}YU)xtD=(?#6=+3MFFa^uRKf zlqHksklD^n{wWd3i{1}bg5O*SdKmxF3fz2u;n{pKair+G|A^M-JSkx}!KMAx?UYvQ ztYYQNpB_v25hfE8+_yi{b#~T3WK6zByZgcrIfkHWouwNM2K2Ks#W&<$!8H z*+BvovKQ!<=6X?Zo6X1`zP93gzoi43CPF~y-Lds)5V~~3tw7iBmjGiHSa3XE-nTh) zod3f9ArEGSa);Z~BISh<4rE#Y?C5}`4@TUex^AZtU4Z540fo9tswSMwP0h&W>6eVr zV+gSacYzX+Gzpso4sNpmX#ZaBTuWo6BqbaB`iO9w{nA42=S_iA3t+F~*JHQ}m~xTj zt5pNu2ru=Rk&!VKcByYl8JG}yy$3@Lf>e4YC1Z|B0YnE(AheE;kHdZdGrw(SMqkMD zoE#L@ZEHiw+`ckP_3JB?fRI8T7rmodGdFOMJohVw%H4p%g4BY%;vY2?Qb?Wz@?o5W(xVhx5x z`j+ZAOJr(65uOApHRBrKscm4WbR&9_@moJ~xoEtocSu<@*w^Ip(rJkFXK;^)a3~nSpF!qikdvR%B~~)*<&4&{VM#@!61( zB@Gdy?%v@Y-|*JekJ)vKhn;`z_+o{-;@q^pA%=MJ5=CoB8(T>Rv-`4Kul3u|yi7~) zsSgRlio0*2VRkx;dRMsCseO{7d>W7DM)Stc-mf*!{yJTV?smSL@Ag2i@l0wpYuB1! zqYnMySHcJ|@)wWO*foti*fn<}O;yH_YZd*UQzSo|mS|e@S&gO^m6fT2j&C039i32+ zZ53+d)#l{ng!~c6=S}=DFf}DNPCz5m+L`?z&9uEhYs< zQs0ko-uor6v!?n+Jkc}5H+dR$(Jn+H-3#oM=6^-$rKvrLVwFK4j7%2OiIGvNi7~&8 ziqk~$UtgSO`{Qg>9c=jj`k?=|yj9iggdf-G_Ax3|!eSeiW!ODyxSt7xS%q7n` zi+KjykCQafeW`_ui`PF*6e}XlK$E1RekN9$u{nT%j`kG%vqAxtN{34KnO)^1ny9B^ zM~nfv5)4o^NF{H!g;TX5JAVIWiOA!C8gze2j>k%)@Vm&JJE#CUvwyN5FSaG}I=~5h zV&z5~ElAMtu?o*(_HxtB*xCLz+O2I+Q$|0;(R)_sM?86Teh z6+FoXO0@3}vDHXU)H6M>(NP~lwOj+wgUzT4ot_7R8D7cCc7B6-(j17i_oF)&pMP&^ z=ag-ae<4XhC&ozpq77zK--q2SU{v}^%plnaN*qdJVjt+O#q-tPf3wj3)75q12ol{k zBs30TDacEgNtl?m9c)k2LCf9%J2DX^WfewM=B)?olj10TBuu`S_<-i6ct3Y$ARoV{QCEYnBOvDe4#WDaGHJ{d%f?r;Bf&9wE8De_StQ z{AIX%eyz`D(=P9f&N6ojr{slrYtieGsP>(x&VmSDYBXQP+am!;TA+^62s`i4ZymRL zJRZIto3xAltJasO^+5X+z+Pl>A>S}r(=QS2Z|;csg+OGQYKBolRp!i1gqhK-A~)4Rj@-oIWyMu*FjL2p+${&k_3%Qs`q}8| z$2np-HIR2)vl42i>4F7|VAB>B#P9aN?Ju$0C{lmry&IX2x zcg2m~NWIceAj48qwW>>-eMbgnYV)qQrDrGODRG z%Rzjp&1*$v)jDPRp`M`vIhQO@v9_&^#5vSjUn&jWZhYZLs+qzdB7!^t5D61--!?GC zvV(UP22{)Do}NgE{nLzAVbw(uMWW2eJN_9Q8X8Jyo+ZW0+@EuT(|?pU0^KFucHB z6i`iKAdwEK8mR`sFqj|YL4V;O4+9+k;q_ez1v()O4b3@{w+3i?d(cdI!i;(xTzUh+ zeSru3J6Iu>TMURf0@Mv%SCLasSeYkAL^~>LJ(~-1*GKHXJT~r^F3)|bENvfSU~Y`l zrsWtF^(7b}Gz)HS`v^xeuf*`u z+(JqO7htK8k&&6gXmH^A3oN9%5rX+oS5)V=8ZI|@-7AQ~!UTPqHH~Zx-VJnivRyM? zSn25KB#n&F?-DZ+fgEUZ?xJIk4Ff0Cl^OLcE4PbUTbO8^zx_6R@!MOSsOV1{<@-wt zlO%7j-Eg$l-!$~Uz{|g18G7pwIa20b*1i0Cw=m^nda7h2mz9cdNszBW$=E%hC~qp2 zc{%FYM%-8nTi(sm-8uY1ezh}OQBzUzsIsW&u5V8=RoUCYZ@X`tYgU`RU90TCmin#d z{!)0#j{@SRm&<#3>Lat|rUm%FEL#=lc;B$>ZVY)3=C0eGJy;7eEE&r}+ggAZ&O)-P?^ajl2?$iH}E0V=*v3dKBe;b#a7?jVkHcCG4`8r&;nF zz{u+_Y0z*|aOxw_W&#Updgis0-R7&*4k&pG1w@?UsqB}><%>;PWcw#-@0)8(&lQJ; zW_J9X(Wy1WTph~4IZ*MXrLxsAf9)c$=VE$gsA*bwcH`m5+_GVg)nJ|`iKZqEGE9J) zpEh#2(XfQh$kd39#eK5>GFzwYmeb0CzQ!{dpEX-gzNp&7&#JS%!6h|c`@>!(7`_-N zI7)BgIu09XY&4*3=IpMb1Ve^7$vb^fYq6$a>moh7!*{^Gez9%#^6KU1|KM`XOW_~= zYJ(?V3*>2pmD#h)PP#hi9V{R(n^Q)%ZY^Jlq&&e9>^48c{4DuQEcchWzW&Sr>>B1h zDIy|SLl)Urk>x!oR(x(nFoep56|E1YFO4yJNM1nlwd;$ieWlJ9(3}F(AP+^-E z_`mgi{4kd~K{f61+w-JL;AVy~mYcYPj#}@Pc2L=Q{i_1@ z+>^6>o-%*_GbFG1merMYZ?)=wUh#kaWYGTdAyz)u&jay5*YnL$ZghME=Qg$kvh5Q7 z0c0Sp>&os`STl?1%1-?=vmx|eB8=d-83-Xv`b+Gm4-j|nhfty*{665YXz)hobTmSx zVvgmL(BakeDR)ddSUmwe5#^OxUwwRks?p30Vk4q8%&tnL)Q2@r)ydOl^IkEEVcd~F4D z0)nc4>rqR2f%a2eR<`-+^XGHQhF7V3-&$dwck10d8wRuMgHbCdHo1Xp*iqdNjtGVS z^@7ipfp16$Gy-v zTUUPpoi#zjs@O9{8&n~GF$3k;u$Xj~B=F0uXS@Fcdp}pn?}I6+B!)%V_%e8C$y#7J z#LsrtR?xrR)JQ}s=ctV9To{uG2+_u#xUBH3KJ0UQe?Y8=i^mr<`lk7ZBEkS7q0+8R z;#Knv_>yXOfl+wqN9YU#8T6g^H`!mem9x|7)H}3FM?1<=n%&k4Zar_NPQgru{^o#`v`#w!;R>Ri$b^V zF4n;Oc;R<*zn~BDxAR;K&V)*IwV(lzY^5vZutP`>sOP+ zFHh{PFwe%CJpuEi&a4l-zIk0&l<>dPQPhxh)s&;;ZjiQi^<`86?dPSRE_5=X$vD zf=0kLbrA*~S}+n++1%c~qGFARoKuAhWDR`x*-AKp+vaaw0e|!n@Q86Kd4iIoqvu>; zG}xo(c_JD2;X@%gQquefVXhi7-$J`}; zxg``;SG%!FDp^9uew=@A!BL~yh)@0e5oyYlaC175%{hkK)v;z8vR~)>3Vn!Sk>^dL z8l?|m?^VH3_z42|aFnRdh5Hz%4>!a-F>kit>5!z$|Y=g)uC*I&iT_zj1EiyUo|?mMAD z03Z#IcV>Zbmu3KJHuczhr6B6>zaLVJ;zh}8fiwezpGp=Rf$$^T3u`eHHYHzb0hh$6 zN%X?iiLBZAvH8IL_7>g65Om4cuM?*C{e5uXc+K*_?h8xO4V;~~-+3%eN{nB6k2>j}j2e@MN|sRwqKSHgxT0EG*{QI zpfI>p1y0bcd_1Q&kbwFo^^l$?i+8-T^>nbPyDPQ>BDi7~7VfLalzk6~dz=x=YLqZ1 z)bg!pK!xbp!&a1IF*6Tim$m;atTZ$%hE0S9+V51BHP!abCf$(Yve>C^iNA7Ht-C4Tss-QFZm5Bpe6najS3 z2=K8)5OH0~G9AcU(yvFoVgupI&&|(^e|)GX51KM5#TV#~V0aV=W<5rrvv2%H&#C`L zl=DZ#-zSTex)#VGg0A3-B&CGqw{PEGB?xQlZ2Yb}m*gewFc}oN3?giM={st%w_}SR2LuKI(`fp0}eayRnO7Ik*coO(q zVE)(+bcf*jdXe43LuQ10XCm)Q4zkeT>}*r6KS7k+3k#$aw8^oh_5)F8_1jO7_E&o? z)kg(?Jx`X0CJMUiv4U&Y;5nL77f99rUTUREviqc3XxPa#aLsFFtO;01<@Kz9Z~X9K zrEY2D&!0zjh_3*XnZoB(=Y2BJ;jFsV$BLSKPOS6Ele5<%wLJ_qCI*4EL7(mSTSl&- zy6qFIJfl(&l@cccIYUQ55e$+y1~6rGe|i;q0fPrrSS+Ix6YE(HswqeIY1W_VHx?o~ zA92raZ(lp#0$-P$lF}z@Rpvw^&nK*2@^xPE;kz3GHIz;3H-)}i`CDndtAP$P366rx5uRc8?rS6q=^PMM7ACUD?Ld>PI5!c!|L}377^gy~K z&IEAdw7}-N#^a0(I<}rv9QoKgetBqK5nfT1Wha{+xywm2jgOnxO7E1k`d(7=84Q0G z-oNoI@nPF)^|OkDrDlDEf?{LM&kF@2G^2mif(~Xo!05{ZX%U#8b-07DpY({fKHlq8e}+bYp#icZi+G~=t`Ql^z#z{4qA z-EFFkQ{4EN`zs5Dov_?lHpk%}hI`bb6gm?&Qc@iDko2br#3Rlf;mYn@e|mPcROiJ= z6^smyK$E{PF0dA$j!0I^m4qN=_*DoEVku0Mw}6Dv$5fUvJi1e}eR|^fI1NSW55cUe zjj&o*-4XRhY&mJ({{Nd|UW3R`93JxI0rQ5+sVf&gT!Aa!hu-<*>RqbT{l#~-DZj4v` zD3{4hRC028ny2>PWw?vMI(UbvMcKSa^;Q(7=+@?Dtxr0O2smus0;KdKn)JyN3ALhL zN&#DaF91L=@u|rbIWRK(1uuyPcO&&D&1o-3g|Y_QxrfSadQYp5;$)bXe<6cOTK3Bk zV8rgZuay_l%S!61M?Tw0f=T^aAUz{f%_P;;j^+-N_}fUOj@OGH^#07(ROw?z(@vx5 zvB)N#vgD11sWHC+#;|rGsD9ian1~-LS&N#O7%s{ehC}&}@pNhgR8~nYlely%0)3&YyPAUFeQ6tgWoh6M79D7CP(fkeEd! zZDel6Awt?KPj++t$eKC55l^{&-p&h}jHI^eCJs94n|E(Z6^E(i1;2VQwHVVFWh`6F zvGkRflbHM-ISxjqU zoy!!WX^Q$C-k}xyJns4?$3qhc8>FP~XF=PUhGc+Y1En$=WA7{PK)dloNlB?1C{wl0 zU^>RTxv{|seAyoWOKIS@4Fk!L031}9V5s*25?X#_^HPqyS=N9u*r*$Hxn$XeX`zIyB-NXXGjHE+4EeXK%N4-|6Lc>qDq4) z{`)_k?%TzY8A#IRMo(lOJv_hA7Gk605O?;Voic#QyWqoI)2|eQ!P)&Q(1G1x5O^@D zIfIR4BlR7guGO2W1JJ`Xk}N|-MeV*Sv6jDmsST0XQxYwc@*i6rAG@a)`SKn98h&Sao-yGpQLj8QA&h&}fj388Y4;9Y zE_lI6f^jF6tqQgYI#k==fBy>0(G!A%!(9n^L-G)0{-5Ib%Fv24Ef)K+DDT@XSsCBy z7@u4y?`a)7k6nnIv8yD+_OCc!U?sgu(8ZZXV1I6QpKZQ4x@9Ee$9)2vL_i-0lc zyaPC8k&465fyt>dgH_C^WO!ivLEE9QH9rXe)IRKxRN8o8&=)4&PU`!N1;=V6~jSj~g zROMo9Wb-?-$Y#;Sm~`_2gZVzsPSP4X9`wF%p~BivW0*ad%PVwj`X&qi2>!k8|0T;5 zA#M4oN`&erdQ4cJg(iEv@DTk|-QY8u4tow8U1r%kO^<_rduZL%+jxIN;p3qZ(@(pc z>i(d&JY9uSG*7lAOYr6fVh1k{U+!~U6vxuth-qp6?UITVKge61uD_xb!!jT@xrK-= zeIGT#<2$N=eO#SSsyANM$$0bDgyqor8Amx;)=v+#pb=T+?u$eF>E01t}-)^DiD`74e zF+Fv?{Q&=)f!T3}`1;Zi>wm9MUGVL7Rmq7f3>M23#d~Q7p4)%gIbxRCyo;1?v)nE4 ziu!uXtu)M!?3+^cBfGCMIy*=t8e%)wP!%-V&Xih636E4Ocx=)9x4ZvF!q9sU6ORGR$)nPY`%dq}~)Bpzf z;a}P)j-e$_rjTa4WnOk!$Mj);^2DNTZ5}&3@P*p-cKi}Q0z#=c)3PUVh$P%n?9J=tPts|kq4 z@1imt=UpQ+w3;qdWol9HG&eQ<`I)f)6QLmif`j8@({MQDSHH<>dD@i8=MgS=Of=d& z?RHihyWPLDl-zU$I>ZtV`7C42CsOTgF%HS>hpk2SwCrRkU3TX%DuFr#3b{wS!tcWe zZTQ6uua}dmnc(7>Ig$_PuY17J><0+}YC~S)XZ88{`4`U40-8mJ7$~-eAe`NsoYd)u zuIiVVcS}x0^1)}Ca$Jf*$NZ5_gDpMnFVlnoUS30uC-n^{3IQHz>bWbmW%9K72rnrz zeBKhJl<`vQ?Z`8NWQ}60DV1mHKc}#&kEl3Kl4Dq7k>9O#_?-MqpONVX-|~M~`czy| zk+5FsqTZ0Rh4h!nLC)OGEY$c*IN51nSEb5!G#44nwI?v+p*%i4y~DsT%jFeUUwqev~a76Cx)Z$oZ@5_}nsRF!4z>la!K zBUiSqisz;o?x*V;spNdfiJ2BLQ%N3ow6mMLiOZQG>!yk=r`1`lR<-jx_PgA=)9K+@ zp%HP<;2`PSrZSwd;w3|&l>>}LTYz4dn1 z;8EwOpW^wha)#+s&V!swUrrPM(;guI_0A(Pp|^WH@UrHHDr;#7;TL=guLH+1;*>?I z_dg7js+k}8olBJza&X{K=$U`+^g^rZIePOLq2G}6`i5rE5h8%b<+S*3RQ5w8>$we@ z7i;)pqAlUp@YgTmBg1mxqgs!n?~2fCe{c93CmjRbSh79M$ zt1{PtGXbRo^}kB7hpMva=Ldm|7zX4`gz4!l?)_%*azyWLj$Bf0bm3N?4n}5GJ@p`} zlV(-j?g*=)JjPp>Bq1Z?`vDztOqo_b0isLYHpeXSbvbw$bs&MHwG0wV<$C|$r`qd! z*A1I^B=W)cPbyVH?k}Sbrh|6kBdss-r-I@myDo1YW=XzwNyZGjObR)Q05#q|yW{~B ztDlvmw34sNPe=aK@y+Xnt}X^YjHt8vcYNE+{XtabH53Y;!H{SrEj#vN0d!Tnx@ddUUa2>?j}D#^gtYJt_FI_oT9C^AWJNUh-qb4VFRAg} z)WXk^vrNcGj1d%?pmm~Pf7V3*_Y8X@K|e+>HS?n#?r4XyF9-7l74`;5`!@<6d;SU{ zGG->s*DT4ROX(@ln|k*uhliJ!cW7R3inbbM6eksFp0hoT5>L=@WqH*=Gc$_HUD5Cg zp@>%h6(tb$GIWVtOIuq6s8SrSa#RviQuKO${bE$3C&V&K^h}A0>dOytDA`qK&1XX3 ztL(lP{&$=`0}kRerl|mA`dW%<+)6m6yR{fgalOy;S)P zxztOnN_w);5ybC;KXf;bh4Au+KAzA~^JzbbyWfH51}vv=QL<3gpGHkqGyCY{ix*M@ z4t6FcSsZr;gIZ?0vsrB37Lu!bp<<{Zc`{W08k-&1AVLa=G!M(xgkM+Kg}!lKc#^k6 z8Jh2=pnr1SKI(CdyQDzp3y@TLdg&Z)MUq-KRiEYl<-SeFa@dUZ6f$icyFe)*=`eY_ zs>zb^?S9?$pM-NxIn3Na(|30aqn>}IEYs(ZpfKUrtn|et<<9X{MLN)^Mv-D1pXwP061E<>Yh7(h3W2vMJ$*l8!t2skeQW+e3*GArLs*TtbZqo#I-RxOMEtdtU)qDB0c?v{~@csU)Dm{^4;+DBfs4>DC3sQa5CoG(>{H7Z5V+cPRt+#QKSA9RBl4N-?jUzqRoLKE($BoXAL53?LH zk@Wea5i_1tb4nmZ7#5L(84v4<*-eyY&SR0ox+iQQxz<--#_HH=eebY__|U7NvyHx# zcoSZ9FY%bU=vQ~`r!f;on%2UrHMu(Ky?r*x%u(>`K+#+Tn`p^@n6 zan-)gA(*)IO+}^lL0qVWyDwv8+dQwFpxbZ)DON*2PXnhuSm!>;6|ow6%hu&J)UWS= z>mb96T7TXjn};=f^H<P4N$J%q?(0Re{x z92{S;^owMfab|1<3V;68%j+|H4O9OOj)xEHweu+xs*FS*T3W870pkN%ygryiqN$?d zN5-y|3bNrHkiaEp1OH48yexlg;U8wEHU6?{~g1F$Zg%*TCmYoR94=C-!#r?@;@lDENnrMUL#76KwQ^c zXJ;f!hht$^T*U_we~g37@S@s{;MN6-#Ek8f%@O2dT+6BctqtM84Ck8Ua-Dd!>lF|t z7f**t@b=SMtKYk7`^y&#UsT(Y_xAUfkt2fE<6uf1G&g4$M)TybTq~azUv&6`Tw>$; zQ#u9oX5u+H0#7C$R;HKHUyEBEkDpdb5dP8twgdHJJ9Nsf>e(hJucPAQkEK-SZ9$9t zivi1!&8zZYf-z~zC3aS)gpRKvl5Q}8?Kk^3BNW1yAKCgy_z}mKXWMcw?n%=k3Hr5v zPO1FTA!bZLG@?n{#NEEd*3gg0KqF_Tx7+7rqC!pL*^hW#{jNG+t7GnW!n(8q5(EE5 zQ*InT=HXWR`Xuk@eA})4o<);da?}}v4DLh&$^68}hDTr8Y>P{NjS|s8F7#Yr3bJ`k zl6!V@F*rGCgvYruJiJRrZ(HpPa^ff@uppAa^vrvI$6CGiV1Lm{#FlpReEeNGoj@d_ zzP#(r9&H}m{rd@Hww}ZHGrU!ef92}`!+X|xTMyy&#f%qIh_=Ao#^y&!(SBGC=8%k9 zn0&T4SiOPhzZGbE5f!EOyE)H<1!EB)3jFLL@oSvu`5Pm}scD(>vki8n$=ptFJa?4x zlML4vK~;*mL#tr2Wt3abPlWA%F4&Xg2G!iOQofw+{Y!{msZD@w+cz?@=P%H@H9_Zc zZ6XG!tS1!J1i<@s2AS1H;rs2^h-k_Ll(>$ADQ5PX~EGzc*vp*U-gH0Nuse-Ed+kq$FbxEVtS>Xy1i4iywN6Dk0z?* z_`EOE`@#_M0x^zi`{U_h5PeYek+ey3h?;{#X&nxTwzJ-90M&kHrSC2w5*-BsC^WRS zn_FA2IdQ-fb3WXl0A-;lAv)l4iuLS&_N=v%mHj4t$25L(BhyKQ~Kl765Wd`4#dpTQu)kG<|nck%%86o78mo8k)1BN zcQ{yCxm?(v1{f$JwX`gHO?3VB2Nble7Z))!4w|2tm1%VX{{gpoMFdbI=FFJP)%Spo z{c)4A^){LR?kqVRl~1qXm5Ng1rsqh-Kot1!Y1LdHdwEgM>-o+D4aH*Wg_h*+(bVFt z^YMwkHYoW!2hnt!A3cRnzDeCbYMihEHkKYGWv<$fUq6uSRJ-%7>>uJjdAHf;{a7&v z2aDq=O()yq&k8|wo{xhYoNNT%tunYe{QH&j;L*xZB}TVSsN}RwzU{0UYTcJdU&xUz z+cT}PeM?>N0~Di56pTeSSxpShNXy!cx0&2PFqFRb)=Py(qUY7CSL4GKiMhH#?#c4Yy7Tgbs}8W5u5rP(-r9+= zF^m&vSo!$Kw9BoEU|kTru5m{3p+^=vZEB?hiK`|({SGh{upr+97dF+_y#bj!Q5(Xb z+zw)V0dx~iTwjQEfJkE?+UtXLxq!jQiV95GvpP%&rcR-i!Fsy7KPs8k43FEuA|p!SEq*2H%N$T?dfEr~%v2 z_y{FoD$93$z?|h_1Y1_+ynE*{WJdtG7MXut3~>ISr?<@{OrC%FeTV@t>{T>%x+ygFDuK|fSY1BW(% z9r+NFjiec|?o=Ia^De8tC(Br$D5x9u>`Rxt1dkOOZ%g$Mzv3O)3hxhrDJ2pKuKi}9{5IT5MM@-xNk0l){-OxQwYGMixL z?ZDO{MNt?W`-@6iu13?5rr9fPTBqKy1-p}oMg@6s*2l#5d6k2YBzg-?e_IHe+j?w;9rf3(XfjXJid;5H2*V!h zA;b0FZ#G3QJ~+S?eLm1jA$RY^;r14Rt|W&5HU24PIci{Yqt^@{)F9-8e{bk;-1c=V z6^GrtanbI@-NlI5U+dCx=g3;JRpUm~)V;l_$9hShZj>j8ze!=2P2$UEd-5ddyIW^- zvoG@O(0T%M(#bWbWv&|rI`3Y*xcLUWoVjqjj!#bPIW~3Nzb}1;xWkmwZzTu6eURkwYW^OvBuur!y@3thPWZqA{@hV?!9(WL(A89`t<5hV=Qe^h=De`m*iqDkIn?4Ot zDWKp7W?Vt8lsDrG_p{BPv9iobHf+}LPp*Tia}*056&AvUTl1{#4un4D>DALJXURST za~sH4dW5`m2QL5bg8Ly_=3+!GmOP0ZP&g3=OMGL{LD(`yeS-RK;)wt#G;AbO@K(8N ze0^iIZILjE%J|srdUHc2do@#BKH09$evQ=rYO-=ftkONZz30P636pWl>tt7mo|ght z)iQ<|-Uztfz(Zg>fyd8>=>_rotw|KQ0kCF*$2Fs+9fqRpDD>>?;mJJaug1W;s<$X( z_Fzy~N5{rq;PX-$5{krfD&W76!sj3Y^}9;s+7bWqHTMi5N>Av;_=3{peBK}|bdXub z@us?jgoMW5X^WWer*$KBd|X_1*6b61j-=~$A87%@&Po`!--!IK7B5)n3{_QEUnQP0 zX6WT29tJTrc_Tc@u>G&~!C^4{xXZv`KyW$7Mhzzh_!ah+AW`^Vn23orrD9SBEW%Ic zo7T7k4olzuvJBDU>RmxxT<Ux4u@)hDu8IPckfu=aUJmKJ; zGXoC1wzda;;ejG*Zzuf;PLFt8uXu%>VXTcGxZhpARDFMqv7<0`?ITe$DqCol<#6h1 zBCoT?Mam}Y14z^Iw($(VqX}&mj8#-TJ?mZyx8WdpD8rQuOQ6F$2IU1bP(LGsBSQx; z9ab8uE8gs`QvPH>fGuB|5fDwX?}g)06$zieIqitMQ6W}T@p9D1V>hrZf_H0MDR%&1 zaSi3ImuZR%R02Y{4M)J?F5ZHT-e$Tk9IVN5?}x}>Tx;mdVR!sM4|EGKBd9@w*sPY5 zOY}88;lHi%vIo#nOfzW0PDT#KDKHU0gELx5$s4q-JHQ9;pO8rBZ371r;qN9i!#{9h zlop4@K#zYJb7O?W?T~IL)5Q|`)9<(q6HoBTlZSU+?A;A85a3E+I}4T?s7lVxetAT6 zSFwBkooAJ2GTVm^b`)g%f{%*%gV|M8-ody3Du|o`CT?{XA_i%r4oAV--v#yiTICVL z%)&`p`D%KBBVqgLEZDr_B~YXNYa6uS#q#0&XXQ+%UD>H=WsRnl>pvaz=+yMIack3% zGpvG*o2Deadsjbz0`Hp^Y~|MJ|J0umN;o(>9~&a9;J=%Z|yZ(L<(GHRjf zgJl7kiu!LFAk43TAIx2c&GCb92L&Y%!Ur-a@2x%Cw7+^97ltCKq{tH6YsRutiVMA- z;2BbLw&BOl_h|>-HO)AS;lUwnwU0vVFNpudAD_Eg%7#n%9(T(AGB!dW0-lr89=pz* zT0@3(w}yo_uj6~kt)b)Zf3y?ApCf5~2Kl1IP^-zUIP99Vw7_Qg~q?TEP(eNQM7wrT_6NjZ?XYmUN z2%!?Z1XhZ%wV_ExSn0Ps6|sCZ-~JU*bH`Ney&{WM^c5BwQo0+y{c8>G!o;ysp=>zO zxI2!6(e$wj(V4@oL27u9&9Dx_Z(4a-wSb(V%w9AQKT>3E+Ms#B@7HAZ&EW0N%gC`T z@zYOH&zJU(=eiAWaC-#v!pCiX)d#iMRSGrq_Y*^H4krjb)*OZx0s-Q7H*guKg#!kJ zf>O4XlZTCsjiIWnLyypC1oa*~$o)CU2IIw@9b4H%o)-$m$L>#|pA7`RQGmve6XU0z zBU}?xkBNpBCRr$kRvna)p(3Z>cy0cQy?ta`!-NS)24lpE!#pzxXrfu0SQJ44U(4} z(W>fwAy8sK4vF(~8cW8o2U=yB)vf7E#@1Lshm`=&UOYYtDB>D{7{re%ZCSc7S`b6W zmn`$oV*WXz;ZH$eR9swK1z5R2ud_4f-)>N!2jA7*dtt|xy@l&_dXu?}Q&t63AHK6R z8c4F#Qb83~6*xDJPbc!FNQh7fW2L(BHgB=nNcY{enx@i|D|gS{UHX7{fl7mxOZw>^ z0ZAh#q6-nx?KEod?E5UbAR}RI>QOj0FWz)2XN`Paruql;bJkCfQrgg(iB*;8DDQ}& z7MYsAPCWXtl6@?cCmf*{+7^F_QgK3m(*s#mCT?hfd0vzBW@3t^kZqyf3V`gaX9LEG z>1KcHk$RfyE#GU6!+!?qkMW0me3jYiBgyQ)pTnB*<(Z+fJl|K11hHRhtlFH!Uox4z zI2xL+x%?Cy~l1Q+P>zzFByAT=RCxt8L!5ZMku{b@*#_pGBE#|93@} z-|#9tG@xcc!l)h{0fO2O$aAPZnA8hiFY=rBGxo4le*O0T4`deaI1BAyxO*9h68aed z*7<;hgrpkoEzx{61*stkJbP+(?lG?4lK+RS_kia54gde&vV~-iL`$+a*&{L{WY6q9 zva?<`ky!|3hU^j9>w~N^GO{;??7jb&@BjBb=l4JV!{MZkc)#!Wec#u0J)e)~DvgbL zkvuPk)%q)4f}54&Cf~Mv-*G*o$x^3-CZ$Sc_d&y1EmY;5X1frAN_v)dd!66wufOh)wwjOxQ~>;LtM6LtR1XP)56nFPcJT;NCO2Y|TF zsWM=^4~t~DlZ&h9kEwE5{^N_rwseNYKrNPyatFg!qg$(ifX9>um=AeQ>P*;dHezFE zXV-MNy}b>xdXnhYxpW{=*y-u(bE84pR$oI-)GMvPx&fgF@OfUWAbm2d>QE3wLyP?|{vY zf%2|SJ|13@Rmsg;w+c0j0gIEbS>Yj^YA|-!a-l7r9_O3e!=xOm0O%iH&EDVMc>8$h zf3*a+MUnwn`c|Bt{`p4%iOKrc?{u}btt#$qh#^iajWiseSEn52Fm9(|qoqY-_8F}8 zw0q9ngy^b8N;=nsaOQ9Jl$^cJPhqPJQTTfNZ|S~`!th#FiI8nLHL_HOBk9lYx@ zIa>|rSeSzq&>b?wLKtcy|E$=0SOuJ@xWTIX?jy8HY;0^zqhn)ls1bTqxP~b;0j?|T znJX>dlk)rp>vq8CRH~RNfFU2i8N=AjycO{D{Toc>yuN9<9Gp$>_2B-|<}5 zqQQaJ+U(iixzekvDPgf)&CDgGq^>ZP6%{<*TP@fp&QM5SA@4Pcbf`4>hq@VUZxKqI0FS+p+Bg4Gj?O%BrdXurTNM*O1@*s2?1>(r_Fe8Vbv? zZg4ZSwXlCKvU6KqONZuG-SB;zzN6Q4-oGr==#Q@5E;n3UfJJy|i1!Z4KuFC7EXp&% z%Y|sM@9FE%b~foo$!4vF-7!c^7A~hl$jUr3+`57pe2}5yKeF> zzUf$KnVD&lkS_TA`H5AbQGa5rOhmZ+gZJT0k(RD-*X$Su`8&3Sg#~0Kk37(!g&wCb zFB4PuRpdBS9Sosld7-9|7DJq!o&6Rff3lEHa=AF@6Uizm@$EY(rrv?w?dv8KI(*X7 z(y(CQ>%KN4Mn9o}B60>a%ndeXW^REZ#oR%=k33etDga9=boJjYElEJtXr@i%bCUk2 zKr`Kv8fHmwcN+z|f|=`=51yD@0rd69-l7ajACE@-LBww2L7_zP5TUUTCcNwF@6jnu z7%JuRccej_6tCFf_f8E zg2>U)@e7r&kt2SHOoo(^{kG7m`jn4o+KtLMuDrLYB3>b2gk6#9aTK@(Xa2jEa+Z|T zR6^)_x&hGv;YsWnURwOXCt4k%HXOskmUc)k0Rz_Cbaa=G{f?|3T<3tTZ{d=!cVQ|x zJCaGK1hpsTeY6z>dPaxIaK%kSMDAbV7{QjIJi^F;qLf107E6eICrP+jN^#(ZM@ z-Dwi0eLfq{bau>Z0u*F(a6`;d*~pNJjE|MiihF)$^)uja(wx}%0l`YxCf`47>2*w` z>&_kWoq@-tLITPQiJcDJq~*Wfc(^}Gt+Fi-5oTc#=f*Fd^0nM)Skv`N#!BpgaUJ{n z{hxe`j`@=xc|}~M__RarczE9w7M_sEDn8Qf?i?FCPJwaOqtrth{w-JkDtYzU^wFq3@iNz%64?J-L9OqP?W) z!rB?GI`8A-r+DY4mzd&Lcfo&u4*5FeTL%Xr&lu2q%15gl=*;0Jh6_L)=*#2NiRxu2 zGm3W9nLMvKW!c*?b_6s{^#DLgoV<{&AM8pH4ba; z{D5JzyJuEm3fHoX1j>AY{(gvJx zg?Ca8-R)Yl)fMPxcR9r#>prhNI9$g_^}8`+lx1UBN2|UeIdn%mWIU?r%s$!fqGSB5 z>8)^m2eB}(z-QGwHs6CWi&)@@93i$4h=h^W*AY&}JPQ1@nS8H1*_-c}63md(^TjFl zoSWxLezd&{2xeLc7{ZAmvD`GH1mwDxFALPvqU2kuB*#`055UK6!YPS{V?Z}g99 zhvK(Bfj|?F1E8^Vf~UTbo1wsbj5fr`aeq}^nKXFD_cYRoGG|Ue=Oxm2R`J-W+X1^5 z2gCc?p?#Y8>%2K_eQ(hlUI(8(A9+vjo3DCeKU&lo7k8z_*~JY_f{2lY@rnF@QtRy`b=R55a#&k-S59X3P0CU9 zw#($_M=U5xKG!=Z7{`b|hqR}sR5|4*C2Y8zd{WYM2*akKp(z8rt_HR-4Jcj&o5AD(!d(j9kFD=Chc zK}qlzIyvxl$BVPq>rnqPli{`JqKc{6+=v7}5rWY95{7HDyT>ui+Q_q+n4BSr!pZ9S z-CY*(MT=ZAvSkY~sJGpqGx-|*H3Q@{(P}3w5n+@iWq!%~YW~v+bSw&m@s+FyFnAU`C@h43M5@Uq-2Lf&!{0gW*QNPUQD+_BX%t_d?^OZ9{?= zJ_}|jb0DRzZvsh^r>9(4?fBm15i^nsBa@?z#>UHc!*A@@`@CfdEOhiQ6CPBpC5@BY9lBqt@^r&H@>X2Eb>Ni{lHl_x98II*M7tD!9su1nij#95N z7ZzmP5jt($*f!tJXl8yUg>jOI8fgWb4Gx{c;hP9a5s%FPqIx2Cou#Kyz09Uk=RqsS zC;)}gXXEa8IV9d}p{8axv!?1YEq@N9heI@?a+cFfSR97UDcKoJOiZE#xVU2-<%Kcy zVeU~W0jtV4^dSGrPea$!YqxAIS&; z(om(83_mK&DH)t$!?*l*YX4V2TICqfQjWLuv^vcwv92)d5zWKxfO3S0SOP3(wZz2C z&BHnb;v4XPa*K+J zV%AQe{W0g*Ic}`AzBw#E@*q#`L|>$P?Xu?VZFqQo;#rE|nj;VZUGB~NOd)>LR@7($ zofvKS|Ija`cD^3GZTUWGyH_Y>!Y3jk5=<)XdTmw_AqrykBM#4GyGkfW{k`^5d!M%e z)po|-v}p|9(uVtTe7sA>pOkXpE|sL3E0tcgGCNDuy5y9S{PK_M|DaIMt-c)_2Gs`6 z(!3?T6qBg0@?3UO&z+;hWsVe(f`el`!dS6nbMa zzNsQs`FAwK;0uZ<8a>Vl)}w=VTnfz}Zr6(skG%OqPc^?^R2(q7pEj+q7Xk3Vy{5X_ z6awEZpwYaE`O>6#<9~jhiwJQ<{XEO9vL0Ja z8D=IYDejFT7fc5KGk5s}t0C=cVa?_#t>pO9QxRfmM}d#8Br`bh#R-fQGzx|XcogY^ ztp+RR=I5PKTIYBie$Wl_d{S3d?q3k$cD98r@!*OX3;rfadZMcmfugCm{A(PwKt69Jgc%3dqo=Qrjd1$qMoZ#h@;cNLEmmm!VO%W1r zw!hpZw!Vhtrnvl&X$a-=Mj6;@`haBZin2hfKPz~ieVyap=cmzWIX}|+RHhpv(+)PK z-sXEKOn@X|`K092}MMACIqX}VzCvQhk(*QQgWkS}Fe-G=1~!L8n2 z2}o0Y4QX>sZHFt<0BOR)%^XvcuV}VM5o6YK-~vV9LX`vkPCXRl+9cf~Cm(^S^$B{+ zIlH>#T{b!22eaE){XA2*Q3AJmUqotnsdsQpyfl8sceN~l(d`?#|9fpALtU3y`!vZN#&+WPrk6M7D90Mu0dJfIb93M$U zdo)<)lmNb43RT}fc-4==Ag)f(``0%msikj9RL8#9bp0E`)MYGSp#4m2u_^j}W2(28 zEeu*OSg28uh-(gA@Ysy}D~b*ceG219Rs%s$W99cPA050L`z*zh;u5C+>$Awr$Psqja z@eR+g;(k5x2g`YcZ>>M0wG}Kif&hugs;|G*-rnwUv~@=-p&f3XK~uGE>lH2_p($~8 z3K(!~Jq@WJ6*AV3&abp=>R~LlcE!0?hkOrN>C-;0wXVdEmHliOb0k7E2~Gr26pWx1 z84`Q$<&zP<)6j_*@H%|u;v9Wp)*<-nRAU;N=BCSk0(!nm59WA#bG<^9XofW`B&*l; z{^6#~W0Y^0i~(%>#5q)+?PVq%C=_hpPKMHQbLVn5YEWt>ov0i-;@dhm_IN}^`f}TP#V;XNFV^}poZxl)CM7LN`*xzp*XPyY#xF5n zNR{qcvqsD{c<%qA(36qDf^i*CaOEOp20Plk?YO}}D8`QHRnPY4DAHKT$-TMoD+pXq z*L}#}XRtfi-R`zJXVCB`a0H%D_P0-1NqQ&heD8gWrS%y*I+j*jyu{@IE_ql?&!ft?s4SagKnJwp`7O_MK zPEj&X>ksym@Vmch#kzl2S^|}Wt)MUG8N=5r6J;`QfzILE94j!7ftB;zcYVE)gg^bA znQ`}G7b6Vz3;P(N(WmPB9y+!Qi_@3=R#Q{^n>Yu(WvC$}pj~3AruLpw!&KE*6={wZ zJ3p96c(b&0AN7v`C&YM+PSGdf#dw;+U&zE<2_3Dnf&ja){ zi(qbxi}l&HiG?S=qD#?LQ(^nrFI=|grGYkZ9VBEMkQN1$9Y09r0B_=B5a?|Xzrld& zTT(&-&4}?+li`Jr>v2zt!Y=YgArOJJmKI5et;x53BSoWa)xWhC>2MPM@4g0_+w?_i zGliD%ausuIoMW%jo#@N(^sgcswqeP;N`leR*}1f}gU8lipQgTgE{eoZ)G=QW4D8Gk z-?u|oV@=zE@g)R)6GQO??FYe6#nUdJPU!1jahXw1+!c+L-Gluv5S!MT#O`VbBh-lV z#SCuGcBgwFn#OPPY;)p}r2NrzsP@vfMK?|7^H?oJu(tYdcUU)lJl@h} zmQx~zE7?5A`=P~fMf6E!lN0Omo8T;7cjZl`j2mft%XxnnjkkgV{s)Q+%~bzUIDZXqfz&$&$mlU}txbef={j^-E_tS)%#x-v z!5_W7aneJ>U;hqU3A13_BJE)$!if3kL5yJ(ee_;<@1JF)f1o$(bGqjSe*6o8(~pvW z{X$ep$;l-PhT+}#$7q>ADI&(id?l8Eh6zM9$i}q||7A37l9!Qn7U*P z^6n)e#hQe^jt{P4z5^O}V`p8F5%Z&?El#8u{jM+LHPnyPVN(4%0Z9$FTT#6cWoA7e zHGqftu~51H^z8=&VE>E_Oap@yk{xjU#ZhHi`0x(xqyPSs1mf{m5I6Opl@7&Zkm>Gh zpiy$UbFhgb^-UHey#>_+++L<_Gtu#eHJ%pnN)Ni(ynO78dWw;z+LHJ!0qzsW%DK za>#3H;Cc;^8JXO{slvmt&tEoyvpNZ61}u0HdO_kqTr%$}I93$8bQ)Hgmr9x@+;(?j z=_WNp5oFwJ{s%ArK(k<+UfkL0WL`t@T_M)C1N00g<@w{{zVw*9e%Jj&6h^gQ2~Z)gusv z(8tTe7y>;!Go6V&u(lpQzg$&$Dcgf;mk6z>K4>^_i6B$PHLpNzSmPUph6a%iqU~>4 zKd~hRhxI9MB=C|9S@o(*!;C0_67YTe*Do$Szy1$5nI9@?IX*>pv^|AAT|NZxv5JX% z`V&h#;RTzK)*hTt{S@-P5gm0?wwJ}~@K7FF7 zsjdAEy~Bq2s_VXwb{v#8E{_FA=z0$6uZpC;pzAjf+ZkK{ltSeBja%1fi=y2g-w) zRW5`YiSEO`T>-vj7?uFj{RThkd435e&YDJ>HE;Y`Xi?Q789_%3UXkOEtAoFws%bpt zLT_&WtYv+ED9HKQN!Cn+(~Bj8tG_7q(6w)1he^~+C7GE_(s;a$Fe4vQ?wm*)6NeRd zgh&y~&2qYMrESTkN_nv9D0#fWf}J_B=gzyXQnMcNsVlp!W%5OBhA0uh+jM?>;FL0k z+swazwhedjP_KW@=epm1Ae?eoQkD^KU3s#z$=S7DFOouxF){mu6fK%RU7^bURst(} zi(N?K>2HYy!)w|`xB|ksE<}<&I4@}sqOkW*%Pi*?|0CP+2>h}BhRXbm+b9fVZwgm( zP6FDJ%Hg50-z0gp_X`i)QDLxhd&+G`p#yaTT{+p~dfM;tVOP@M9 z+-$;Af3e8z?BsO9s{8HP`uuzVP-iPJIocV!NG-iZ^d~YSf0ObY{*5S?XZ_5@ir2&V z@9Z(Eghcj#ST(YS%L+Loi3vh^nop>9~Ap11z*apX?+noDio>w7X4?4?x>zd_7)2Nb#o z0Di5zs7_4OW?^|+x%9!Z$Eu4K7r1cYLyYqPr=H{>5qANr~GU01iQg- zIyNMmD&V4RLxO24O5ighvab{GUo6a}p=S0MW3Wmd3u!R)He@V^?*nOw&WR^#s zY9!x|LP49_V}F&b&6x8@__k#>aYZ?C_b=m^_tf6WAq~Nlsj*Afs{U6@uu*KeF>f9B zlY+naFLvW^H;Urxd%@zyxc>1E8sA>fqQL#&Z&vV(SP_V!P6v>i?wzLwyz$gFG)C-~ zn0|6fN{tCIF+|Jj>jbDGzsy$VH^ zmMMXtpypo^v=v)B=q9ES^f=@M)pyrkO2G|y?R~fWeNnFv*;<61(LK4 z2&JJ>pE-tk@G{NU$L`Na2GU;r)8s2kIn@@zO4p)Uqf2?mZ?o}%A%&k7=~H=wyDu8h zdoUZWcB&|6GM=5r+n)O3@Q;F-g1IkWOUw93jnm->j!>LbxrNCWE-`lOi5r2w`A5Ge z&C00t51yH(Df;^pQSd0<{Ea>|sos%HiVyzrqHe(Z*L@fL zN@AYYU{whd6IrqM3CtPh2u`&-VT%RD1*+>;bFbZULK{B!MFz)%dMScCAVb4Bt-EaE z8~Zz56M{iPe^9m~*U%9F3h6O#VdDi>Jhx)1d za+CLT*r}|Ntn60b&!5s7<_s>~@-fx~TJhJ;y@JFs#Geq)awDYGx6l^JxKOfu;{w)| zn~b`ko_T48>Hp-Ke>Q;U6CZ^~Dl-a`l94Tqe3m1DOm^a{K+ae0?wUY83*NRobBSfurt*}i1}V(QfE_tl0?wj?Fb(>ZMM`4;7DI2G3__IQW{v8 z`OV@GBZ}&&){PzQ?Q>g6x{kYh(i*GW!ga3++&|u$U71kY#Iojy$zMy*&;viJX^F!UZMhq2e|%J*-fwSl$&E zN1N;(_+alpRoHC&E5vvmH8SqZEqe0m&H5u10S}z zJ(Cj%R)ouX?59sfi1~ZswH9tMsu74-Qxo<`POfx0Xq$y0T5NJ^{59LW#K_qD$7**p z_cY(<(fjP&QapVvS#U3X02zoO@5vZJBNte(NCJ=chC{- z=<#}Qb=`?8tSbe_)iR}>1RSD!$}58UyQw7=dTNWMO+Ggp14`%|p5*3o7O?JOhG$~@ zPXM}KCLE^zpO0x@FvbwM#w{g=V=jMSNBvm&=Fw|INHmSrX*c`PV&^g{fUH*P)cwAg~Zvip&Xv zoaoqV$2Lpp6Z?;@A1AoliNw=?5iE6K9fN18n0TL z9-gt-&p}UoAerH)yvf!mmzPwcozQ8iY&UFOBI-l@yQ8at_u=~CspH>cv>|I^c>?rG z!v0rBj%%X?--^6ju6ejzMrjlcBL;j`yyhRaqctkEr0(aPc;Whi@-{3}$NC+q_$@!e z;XiU~dJq4P&dp{lcI2*JWs}Y7N0Q$-aq3>Dd;`{&@()k~a1nuwtL)(tuPA>rZQ*GB z=wJU?Xni{{C;-oV(DLHqB-aB>7$d;Far4anlaQC^PiW&; zWFVi@gF{pT4aq*lH^P|r%6X_)=SBcuMxjsInNJ zoNp~mw*wmNFh$_iU8Ro#0nf#(t_P3?&<9b97P4v-dj{E0dA1J3hAPtZ)vGeCpfi{* ztU@!Ox&S;Q@$qFaw14vI)$rSq6H?Y-$vf7a{evA{Ydwp$k92Pel|P}FKpHpGZSiqV zF*LJ~*2tdUFZ+JVhCcBvV{DL3&|GO~t=e_zUF+@CcZmK+F|f{7TLGbXd914QWLnjSFO7mFIrCFxG7+i!f%G^y zMMba-1Nys9Sot$M$Eoi!+c;tdoM5#!nS9O6G~WBbX(A7iYn+fvFbOK=1BmV#0j;eu zK&Ppj#Zf{8NK9ds?bR?$`;(_$o4X;ix*+!3Pfn!7Tr`5oXxE#k4E#3EH8Ye+0%arhoK%2zUQ(IkK54MwH{nk;=EKbWs9D&NM0O!ja9F`|dr6wJOG52v{fLcpX zGQE89aF*5=Z+`0q(W!9@CdV-dXvDx&Gq?On2yq`lr_?-cvNn>Y*bgg_%`>_0+d;e7cnR^BzM%JvNl;q|pQ4PI6M z4fA3M7c*B2Ka^$hDLws7$6+e_@S})x;pZ<}{M3HEK^AiRfN6p$F*-EoyQmN$Hx_*Z zgJR7JFf#U(YpIBQe^#V%ou>SF?7yIo4!`dgvvl_1*1GOa2hk*!%&D&uOjdgnAd}TJ z1~F+QLyt-ckfFV#nSWxh15B*eL(U&Qcl_RW;;EP@;gd+|wOr5>Tg1qsRpEBtM4M!5n9>qhYu(Ch5b@7+> z8!1cA{MZ7W3X@M1L$Ty%v#tQNN$V%ZfogC9|pCJQAtay zp1l^6t6O$dljQB<>f(ePnqhi()cG=c8DRIY|bZsm^puZn;Dlvq{ zi|2gXo8MVkNLCjlkhuzjDb!G#`$l|l9zR-8kv7kQrSi52&Mr3{|1SD4-JeyKtl&LvZa7~>9(X-`DC5^XO5*E}wP?ldM zT~UGrS6*H|eQ@QO>(MV1niZ^EBfB)(c8uXjQ_siv7+9sC=7 zZj=@h!j8XKE;N)M-_*duI23g)#(G|aJq;|$s4x_ZqJo0g{My>uR7|EB9>Pc4r-CLR z>=|>ar>#<7CBlDCq%&=-e8r>p(qyxCA+vgXBWdi@dR_Cc0zAeroNJk3teFho4a%Oh z8yG9RrRGf@<@IIwo-pdA`8MGDbe*x3w1nrTtI_F?Lu?j_?0=bEDfOGFGY)$0qat3L zpOU=#d^ViZp4uC;>n6N&Tz5rk|4lB7WOQiXImfo9Z69zx9{Is3@&)vObPoeMox8ey z_8oszzX?=)Y-Zto%bDgK!PybuQo=+1g`}9b1bKNY7vQ+*<;34jaFEncnqF!)c##wk z@L$Im`|}kNh4qW`u&4U<_2*HS)yDCPxl}WyhK4nGmcz33Ze%*CaTmz(LGTaB_^T>3vdJ6e*Xx2k($B^H3T*YjJf0Ao?PYV6B$WZirq6B5zd4Eh6RO^N_JZ#1d zw3F15zu?R@|4mdoVO6?*JtEYWZ(<;31Y*XmfUxN6nc(~Z4F35*15{4VY2s5}*X+qt zU{Wlv(Wi?1MT5fOLp0Mq|5AV4&~Cg<9-c}4w>Ya8TcKdM9In=e@CgO#c5BA)I1&u# zhx5qc1smVJz!%Wbom#u~mpO<$zsyn}17r@C?s;m0LG)n~_^lo=S7at<(>wYLa$so? zN2VSA8++$*viAsbl9E8-XF{e?sD-}yAg;rNfR`V6=*5Na-Rws%E6mLDx$k{~^`Rz? zjMV0H+D6NvF9XF#M;`eM3f79Q2t`4YO(T7&RH(nZ{iFb=#qsU~^-I2@G?yQxkGM7H zCM)cFLuPi}S6?UrlUp-@J_NO8Oqqk*O5`2zatAlSgK#!aH4h(wE>bu4P=hGJB zJ9$K^z%B!mQskZd<X8Tdp; zF|b0TKtxSP$Mdh0tdq0z`Q`j~A@C_6TPDOBIC&4qp89MT0?0&s=0<^9ep9Ah7@p0@ ze6r})m_^zH(3D1?;&1~v&|`8{^Lnj#kmMimZ7(5#N}J-?_mN-dJ_~k{vgM7>*;Y5s zFkOYgv}*xS5}t&fCA}KG-n`ml@OGH~UM4amGbc9Y5B=m|#BgVtOqIjEd7Dey^o29_ zt>0BI!Kxdzzr8*7H10EZD+eFSq?@A?R865j&2t;Up1w~vgxkf-(;$m)b`*@7uTY`+Q1gsM<3Xe!`RWhw;YsDFj|m$W;{W^5%k;v7f2mRbu>69Mva0dw*^p7Xm-|2e;>?gp zd-FExtwJb#tF}uHfLZ5jst#m0e>)_O$iA)+j;Beh!@V4|;qB;HIx-p#{|aMu0e^FT z{;!<%iW@#?EaOy2q|HK2c6Vp+gdkJfR3`Q>qR8P_Uw9&^p|?Dl;d0H zTtE&Pbzd%rku*F4x>GdUzO(;bQbOlERKLMdz)kC>TF(nP!xeuH8%0LYC) zHcvAf8hrl1nO*0yHbMX=ODq8uR}cv$WhWKCy`G+q&bS%+iZE`#r~(m2M9vBld&KS1 z+JPk(xA-K0{)8KUL7wOdODo4i%j9BKM;kjzoOEotIA4_b;NCry1?t>=`ux*JFfLP| zK=e(AuqXx4d!zXoeK>K7BFDj4Kua$yw58dT#olN8@bmWDnR!N3a~7R2xHsz`GDzPH zIn!|U4slcqybT+bXUz8Ay1KcMVnq|ym%~G41 z@*AL@qLsqzJ`^I4qd<}u1?z}8zIzQc;@Bz*SQrfx`wu?ntBw-yrM;e}B*u#(qI$x; zc!^%CLfrf|ymmwU=bW(hns;M)Rn?{;%!0c?oBw{(lkGD14B5m`9K4dK-CLU{<`sWY z95z~@p7kv2B|}f#%?EChx>%H5sNVY#6`59ow9RI!fu(UgZD&&0haqI^<6q`QFq^TO zU!V-p7&%wdng})pThp*&3?5bF2i0v30kYACjV&rQ@Pt5%(`w!{p#AR6?~P9-xuZ^1m6cNv0IoLy zCgf6EJGgz@o>;Nl(OGB+AI!t@XMYTVJF2S0_AS z?F_zL>NG)`9>q&5QHSi-X9+-(gp24f7K|gpgjSn#m*$?Pin@> zk`gpeiP!2wPM9djk07>t5-okn(2?XO3;9|Q+y%daO#7Xvs3;#ie#xNec867H?_Q)a z(Sa%hZA+pejW;ID092mUiag_ZY_dkCxZL#{o5({;Poh z5Ye36VPL?5A`rtb63Z7chd@#<(C6X7hQ(w#oKFTzNQE;gAOC7xl8G3m3>>W_a+~PL zET8);qH}5B-O8|<_+5mQsQ7YJ5(luGXVF)6t_^1`+G|F&ol%m+HpnLgZK^mwYrMpP zfukEJk}=;r$*k&yaPX5_U{_r``mQ`@Zf54{mt!RjCQ&UE+}}>6@5b_oi1=I>^2QF# z>9g*zS6Ql`*r+3kYccedE_HGw4@sm#2!4jWiOd=!bsrsb{u2bb$)AlEWGu_SW?Y=C zeFL_o8ukqu6`8Uy{bIJ>|5~wcjD_458zB_emyCdf#kxZn-w=Wvj**d3TvGCyDHj#Y zf1g!?UEHWYUBc`7_3INfAWyWK?<7nU@bvRK>>GcB-1XQ_y$W z_1T@l>%)I!^2y*1;|xJKiPP|M}u6QCkA^sS=?juY8*%Wp-=FmF3R7vlYp`*KdZA0Io1gX`!+T8gG+ zilN$nTZ{?gBO?huJBxDd{s=mDCroA?a;yYL{SKxkVVX1#eGBp@9p5KJy|$?(Z)bli zD>H|HM)6AXpVUsE9`uZVai4hovC|^X>0;MT<0ibsJ{J@el&)HIFXF{u0Nwl^K0f{= z`fS5&qi;kOhxKg^yYUJaDFPuispriSeZ=7lT<-8g*w+IRA`J-L=@=-{G>6x)-^ByP<2#hD6t{uEoQ2EEnx&40itby00^ueM zzA9xVH3#-uuU<#U%G>}`bWVz6tvh?tV`pc3~fbA?7@^)i64{L3;F~k0~W-=+Z%Paa~J4nS_8Jo+9GOYNyk9h{b6aGc$cC7k9X~@&b}W znp{)cjnTwAJeAq5VjZEQ2krQNNr+15E77krhZx9+^z`(75al5cFINTChwomp=CJM1 zJ{ZgMCVy70#X|h540km>o$U^YndbfcP!MC&$z~XG)`AXcj(eLkX|=xRwQt^xn(BG$ zd2>cc2N-n<`rL*EJ_LlB3D^ZBvIf*-cmS*j2D%WCL4l*L2q;NvB5MPkQ^O|%!`!+$ zy&s39kVUq7l*$f%ShUX@b1MtZDnq}&XF0*Xk?TL{)H%ym34$eGaRYB<64t#Xs@iD@ zZx?zfZ|JzLXIoKYVq&ISC97{69G=iM&^>$hj1K{rjTCsrF@bs)Dy^y-XXfo)A757| zFq$B_0h-M`=3fKVB%kYc4W1HFa7xW~=DthPchcL$mIA zxM634lUrF?38b4E>fDgxsal^CZJH=?3~AMy%I zz(c?&Wy{4?8hCSHKn0aFo9#>^EiCRJ)a?@3M||MRgO z{6JLK{QZ0n5e|O--{7bdc3!M%+8bbH9Wm$ojB^I>Xv|Rj?eX74_7Ga9U=iAc&Q>UT+#3X!UTA^Gk6V5sKkY{M*M39So)@~nK(5&TyZPmXI-HNKbx~WnGbB1>HNnN#P*OzY zxv{aN5k0hJm(6ImLt7A&f4oH`fpyic@;m_*zpjJ_Bg zc;Z zN$l8zrWTG|+W{~IN5F3Vt^ZRAdv0&?zm=7wodI1`^)*a*&qED zf~xl1X9A7t*4eQ$xJL(leSI~WY{hC{FF1IO9N7FZnaQg(N{<&##imA>X5AJee_ z`qm+!E5uX%R|CTrijwL3N$)UP?&8GR-My);^#QM_u%1cu_f zq@*{A?1um4sWa^z|#Z+vap6Tnwi5ntXlIV2VvgL6Lau`ihW>%QU>CWOE4`oz1{_De3P= z`Z>X!84aa`R-$~%7Y#ZApH%_R11i6qpACG`$xVHAQ5NrB6WUJ2r>6Rdv$4}YQ<0o& z@LKNhJ^fj3ZSD_|(|a3JDL{y(U1j{U>U(}dKuACkzgj2=#)a>ofC1a7UqHY$mn5x# zF6N$^hb5+4V`?&LeWIU<1F%Xf5e}mn>aWEsL%1m-W5&*Sr%jPEO7-(v1RtM30%#*- z)l257!8;S08qM(UmKOgR$fp9Rdn^wpr?%mX$7Wnf^FNZfDIYuCH~;a$AEr&>Oz{v4 z^l!|4)amaBxee9{_q}b~u^j2LfZ=dr*^b{Y3G%*eJQ%qd_O>aIzz0$Nds?TUV2*4f zDka5cqG@#Xym2*yd=@jBa-C{TPeNM==H{8tbrvzAPrl`*a)b>|Ow^sjL-ratc2_`6 z#(XEy?DH5WHiP;P4?!Tk*hK=<_|MR2DG~epF+{7vMQ714q-gWj3a@qrIl5o6%xG8) zXEp%%fczZMhO|8a<)lepvHp1P$VmItty|#-|Hj)HULt=DQrDk>|;`Fh+{tvFCw<51!Zlis}c$tFoe&P2J zty+@tF592jXH`LHwBH3$9Hx2L5YKcS7K$y|&6_OJL8uf1qvY+EQK8?JdA#!fLiNwb#(LybIR?~ zxf3hPB%RP(``!F2;BBF-i-($OoRC!?^LEbX@zjo+AFdxo5t9u1!3mO!A<>4c*0jNe z!PQ2-M|p4Y=BM@CD8lj!*Rdn4wFD(ctp>}F9lsv82FfNUfc$S__15@4N80J}>FHN1 zWshUQJKUTPDvt)0{Noc8o*OpVgJzIcL|FI?H=y4}p^Y+o8#jAMgeLa!J-1J1|h^?tp=bnE}!c<$NBstuS20v<@?&Lanco z9>?;G@I&&BG%oy6L=P0z?T8(n3U2;SDa|v%+Ii0AH?1za;zNEtf}5MT6SGXQvSCke z+%7n@6^vVau$tm}sLUq+2H%BhUGi6RI?~3sxtjXRg(-SX&R zP;3_)G=zhZw+B4un`ip2`T5cpy3NIz^vs~P)`Q2K7SJ5>O!3`258jw`R7|*U2(u>k zljhfJhcc1W!H|85iMpzVdu2toqLjTyR`%Z6zLHUdWMvD<%+4MeS=pOxk`dXPb9v7B zz0NtsQ-AbG_x=5RuIqYV??GzQP*m|aN5l8gCedSN8xHc&EfCU(Ko^4^WF&W44_L_X zbrFflHo#Y^jR6VB`oJ(AleH2WA0JPR*0OeV)`9XxDG8OTvBuEJl7POy9eIEIBRK6Y z!%gh~L9aVd4yUn{P=@S&Rt07-S((CDaSd?texLQ{ACY)q~M5 zPJJjFEi^TSb>VF*$=Cyzk9_N)%t1y9lzl=DSTZn*fC<1yr`bldB_MP5(D0bx zg6YY`r6E1)lE!oj=0|^F*BJ(Q#WE0`MMQi%coTi-onVe`~n-Fz1rY6%B5yY>-weG)DLY z4u%yOn1vs=86an_`v5n1z|@SOX0Oajx~5)#`{>d}ge>-<6l0Y_l8|iQMJZj;cr5e# zoJigLpdpoa_U70-T*ty?6D7VEIVC)0=+m3Txah@M2w`fT~Fqu9jvT~{l7C^klhA%>AA}p6qYNQ5I6-Ght=NOtgo4Z8 z>s%y!Y%;EWY11YcbNLBo`&uH!?D+Seb!PI6`Mh(5IS7;f$!&$e(HRXCWP zYS(qDFG|O4ps1^=sw$D0I)kTcqMx51A`jLIBT9-ty1K4_ni)VvZhn5O0%fDEpR#== z?(0I%zYmEhx#^tXD_KP~zO;3Ac1~5iAx6Iqe9z91tHiE~TQ`0?y14Ll^-l-2T0FJ9 zhBGU!*XGdrZMIaKAeip^!WFp%RTU@81m7HDCi%e#Febtj7$ILD;4yvc_X4TJi=h1> zu)X7kg*wVO(e#i{#3SJ;yyGth$_g-n~sl-6_G}%D#X8))?hR7$kyDv`+?WF%Ez$x<{Wb+^6r?DxZ01dJ$|_SFHmaj zFgjW!$jGYf>Q`3E{)SUe4l(3;AT@Z2wcfgKAl1Sw*?z^*cT|8NmG|QH+4(Ao?p}$R zttI&uk@&!xL%?N{^E}iI^#^H}swO~oM>w3*z~KoO7q=0x*SX)ngW#7Ps95$8e8L8P z!AO=u&BaIoC9j#BYxuA|svR%qaYwDX7yFKr^ZS_OEiGi`C9sP!%(^?r)79o1>%1sg zNbua+TGGrVP_@EtJ^fz_2en-no!}h$gFQ6>o{e)3jp^&(e;)%)Z+7%Mj&=RDm>`!n zPdJegp^tAGh1EX@$VNN9M-cKf%2Ar>i5zuP^arKoHrs7(-s0c05qob18(5YqMKG?g zPWXRCOzG!r&CG&e`~@*voy1?F^Uu(my<6IHPl0X*HLEh%k_1Vw;`wzr;X21JU6zoE zX;QDI*oCgyy)-S%GM($b=btIcLP#(V;w8KXhP#(vd~`~xW=AHyNYMmh&u022%|!04 z5GHV!mX(n^3f|QEIL5N9c={mO=ws({5c0xt$fVdq+fL?f<2zOi$`a+X^l@+R%*;%= z&9UNz5O`X=l#SkJziFSUv9KnyWXSm*(D~Ni#~r>gFjDd?&{U!G4hf zcE1kG;8zU-yPwEv2yh#;$U_6+f|fErQ)Z0;FJeEbPkvx~4}3uUD_1~MwFNU~Wo4yb z>x=Q>fp}hm=Ee@B122q$QKU?@g?`*BulcWA9=HNso=KyLe0pJ zR5kBT5O%ZM7H*=3ru)75BmXEWtXua2H8fQIxz~0UZ1PWiLPTd{W@Zh>HV$o(HF@6OeA8I9(S1oSd9LBL&oyLH&QNnjwd`|I*d! z@@`|Bw;p~A^9ayzGr$K1{#sDW1V=;=-yy@tDM}L4r4_OB)h#5iA1m_>`_Pr8abvrd z1oPE<`}z)+-JPyUHY6%0oaf#(0kGdf+&7Xw!*(z9q4_XeX!&H?prW+-dR>d&-hrc9 z(n1)eNxMasMW6KkjiZK%hO-6EC(_sonimukcG**RjWE`;DT$v1$p?g=kJlBe-$C2B z+1+>~&(hGvTZAhir`KEc^z#QW5CLA4K%(9-)4!3;hKq0n?0L}DoA!Yct5h$vH@^T`*S9~= z>o7EqaAuJHg6C5peq?$1{Ph^AD~-d58%-ad$h32JGz+(|E54cwpG3}E5#8iCn7sC#-nL(l-oD25fMJHnXVPu z28NVnkVD9$bTbH#*(xb6-b%+r_q8;dyC$Erjxcx0bu!8StWE`j=RDYt-w1L5_}qit zpuV=MqQcEtH|~eXtJkWWGsQ+<8z+Nt+GJAgVFkJc)o*v+q*x0sWf-&};jt%0G?Zl_ z=zGU^ba_#czNM~02S9nB-lBydtc5rAUQ4^&;==Ukx(U*T&q{IOx9Kv)>RZUcs#u1m zy;`$V2JMTrpTl{Y2q;|1Dxl}Bblar897lQi_{dNWo71A+XM3afx%8?7WTO~AL3-CO zcsp$TX^X+bn-H9O@Sq0pjr(r9$)))nsKSTnf_%@LgV;?l! zshX9Y(f_@f#OJaOO_g@+xQ9{i{M~Q!d7oSOj)f714F!MWA}uc!R@FBiY2{e_IdLY2 zPUm8hMmC=m=Y%W+C{*ALnhtEY4U~)TD`AL>61VL@KHTL+W6u#}B7#U|eXvCYG7-vM zE0n*|Db7e=8NGLWnp&)zQHs^})sV>Df$iwAb6xRAzqEpammkyLyMuu~dERG5rtc}Y z`Zra?Lkc9RuOW{Id^T7(Szpjj)xIsU9>s-)M7qyf_}!YgK2zqje|0~6NNRm54Vi1Cf*gs2keSCc;y?-MQye-@v!Z#Ph*9W_iTT~ zozP}W(8fdR>elaanaNX<3mg9+_zq-+Meutug@GA8a_HA6#-nX;ed$}jk~Ta05uUFY2nicb+&S57ps4rU3!$N; z%5Q9;)e&ddB@O+Lys9p4 zFttqUYf$&Ot2g{jb~kYzXEDD;Um8pGRU!ywtE&QhcHg)yRo?KY$gB1XO34?n;3Vxtvh))N#k zY(R@;PhVxog4+L@QL#rBY-jDA6%@oOgoC=?Cycr0V{=5qf_yCy=Kpg8Kf2(D1mkioLNv>#V6*hj!^t_BC%L`)o< zohKij=Oh-Ui@Y4sp`nOq)8&P9?UJ-K6pRm8e$V*#o)I*wjnpwj_{IL7AIT^cM9wJZ zRZAm3-o+Wqdf%mz#`-Lp0MWTe&^!yxTtYz0qwd!RzD6nX zNl%{WH~a>yz6o$DZ?V+hJ4aQ>!t7aGfbQXyCMj>ZJo48F)4wB|IJMjB60gHpF;_Uc<$^WZfl+ylwk;Qn4lhFKp;1xjtRM&SmnQs1gM?Fg2 zh@|M?H~-#pk7>9x<)n?!Tp_&_Pl7uqz`_rEW2)+QeorSSUjLW;%rAic{Jp6}7k3&i zhZ1yLSY%e%=RNE@JEl~Yhjo2|C@(@wQCOEQ!9JhVGC>U6uNHKpXP^sX>6>vp^C_)U z5?qGm>2K%XKRWPT)zQ6`g5rjKLNjeJh)S3fT;Nob^zW7Q*Nj}U&v(r@^XD_F5&(AA{pXP zY^an(v?6cd7=j@=J^=9uI1P5fy37{~MgDyrUl*C`2-7@Dn=n08B;m;?HNV5Hk0Bf@*lXqW%tpe>KwRtad3U>8%k_bu!)ui z4wkxswZF+V_m^T6krX@Od7%ziL7%%kik+4^Ra3pUWmADSf*3)QU;tQNRE9>L`D`yY zaTbFtC$K!aFrkn`Im3X{-+)e+ljVyiVfr&4TVZ2c6Yp+Q{*Z2^$ATN*))7AXt-qy5mI9i%f9`;_s3!cN7ZcOR@B=6KcexL7%9nH1)fVFn zNNf>8@*?b$S>5 ze-6~k+ZzZ-bA>AQI6_Bs?+eH)$xls{-z2Fy-rLYSh90U@JN5M3r@bd75CSusxhsAD zQptonmp{@QoIV^ls z@~(^@-GqiGM8?x-M1#Lf#$|teYu01Yeoaj*=^G>F@u5mE0YaKU+P<1lxzqNMH!Uh4FmMS#qvM^TqN3W|%~=bOUoQL_&jJ^ zG@<;FXhc~jlz057K(9uC6?j}Gm-Y-(kp4MS4i|0>>V6TM0G8_ETrO6qIehIwd8L^$!9ww_NB3n$==+^XocS1J_?VPHX{*1 zyOX=XfIH8T*HaUW7Mq{D^po{j^WltUOX{%px5F0#i>*{iTGvxKdVhRNXi>Cv?d|GH z{AM-G8VG6xSYQ`>A8k7V+m@^B+qe43OxY-NSk=fzym|8xY%v3%nLOPcRKx-&vSw@e zYtjckj8>SB*3Jl=%DEkx;0K^1q}eP?i!s@eT*hgOSbkk|pL7kKe~DJqsO3ff%~?y~ zVqp;yvl_~#2NuF-l@2f^*RPtnC+~A!mHRi8f{LTL4^whB(Y`(s#8tO)d!0>CxlX?M z4p;PMZXjYZT5lTCH!jR<3Vt6BrhlGP$?>|2s{{N}hnJ4A3@uEyH$@OZcN;*v17Xj% zct3(QH7qDF@HQV`*)HJ2(jp<{%{i~4!Ze<}ru(BaTm+Hum-0GEV4I8-8YrF|AAg{a z#D%972w6(N9ZjN_B>@r@o$Pi@%5`s@kI@rcWyGG3&N-40URY>GrlcqU#fta3n2sEW)Y@O_TJNfN*|y_F^``*f zvgv%Y5n_Ar;5hrsmt_VNAsN0j)PO7J_JEcc?-iS%HNt)g0h5ZK;~@-uo&wz&dc7QDGgRC^;IJ1}E!z(%6@1`vyFSaJ z>NH|t&(HBcWCAl2!|^cck}7@udSQcxeH{7Cf{t9(O|4|)&O2Q};Qumn>Ig2CBU6^tSH7CI7QTEAwyS*cgrvHo?<6hdF-AQ3I1YLi|8<@EMnZHHqBNhn;tHxE6c~ zPtA34+JcrGJ;mtW1-_xzGYH&#q+v(ovnXq3mh*IygRy4!s3w(dSc;s_(~}j&{AYr< zC$!SR$H$YJr_{;eP}%d9oHTM?O{MU<^N4G1SNCS1PzNGc2yd4loX~=oJFtWBj83%?!AO<#p(jyre{Y&cor5FBIyw`!svzb~v;)n=0wLure z-L`l6F}b$=+XB+Ac|_#M*jrQQ)k3HDFSPgDXi1~se7+>~qUFsUaM80`TUmLFO-MBh zgsJwPo*#hXT!V-?a4B4q%TA7qJMi_Sudh1WkPmI5{bloa`qMJ=t2j}@&modd^VID6 zm34fg_l^UfW~>s6-d_cEtgT*!9YS-RmUh~C;YZkqAVTUA2v)-L^8gD)UQldmD=74= z0LWH=>`?lM3J8ouw7&2ea=3EqDtXhJ2s{dk$GtxY|1wnxI3&#v^s!_C6_7#VS)J|-mW^Yik0*;!dlRJo%45}w~9+PkF1xl}Zc)zn=G-9)xseZM>VK3YfcEPV;pbKtS z#6jch-w!AJbJot<_)Z{H^WMvsFGJ6BKL=19UhFTQ-EpdZ%JAVKFrNDMTm^nE%hFtz9Qy1hP+Lxc&+Mid6AWOMsFTaN0 zPXKj__R+g#-vy1kIGtDr%TUCR{MH=Rwdh7~p5C7;Rvim0~fmS@iP2bbnl zRUJ8zl19zkCFvl1`^X6vicVO5Sr?zYWC;v$Iv048C681NWuxs`Ee?rmmoLD7XHI;t zS?~Xq`A|50__5E2&w&v*QiJ2CL*GpOztuw^`LQr2r8J_;)ze|LQvMv&l8_rwQfKi$ z(xFS8&<+wl_$C53LworDN{STjEF;4ITQ&55q)5oMZyML0+jHEe3XDbO=+M0J46pkA zVD2?T2pS8sXA>>!z07<_6NIrpb`XBJOA^oj&YKxF(RE=7xFY-Nxc8Qutj?X)4#aFZimeccP!H-pH;&n~wX{64hA)_q z#fIRNx)D!#096)Bt~w1yxT=#=34dHyfyfs%Rv;Kje96qz(##ai4uD-&M#h3T%W{7l z_@V^L%65o31zL3+TJHQNzO|dP3$#`jfJ?3eL+FHL>8Q8v#d4X)y>iy|$>(V3_ znOAtS!k()eqghWZX;fzlnxM8szIclD<5H6o<(U5t1dfI#b>OKSYCQd}b z#`ENMu&>e99`_1{6;yo{4*F#jXGzb&raQYzhiPO&u z3T&65yPBJDv6godgDi})7P}0xIwY8p8N!bN0FWPa12c#TD*HABOr_a>n3|c{&2PCQ zH$j*IX}to8gaV0E5L(6${1#DInPfe$a{4@id-AGYAVZSmnHFXTI_d*SJY3%|ApQ3; zDl7!jox2lnXUK%D!Xr7a9yOM$5PBL~RQ?T(`1Yr1*Y>yMHhOMi`uk{TYrYOov`fLBfk2$3eL;361&2$(6BfnxfbZO1;!PD|Kg5*ym5f>Z|o{hGFD#of-$5$em91FdaQ?#(4og)oheIXsQ6vBm+z&)BGFAj zK!QqK>6IWm1Qa$)hl9m@)Qw*}$=akDNX~Ad8cIrda8M8fo5Lrc3Tv#Hxn9hAY()n& zzQ^4;X&;doHcgq{#QR+P;*I0&KYo}=J2-Gdu5uVWxYDg#W|Z#ZcER#5(02)jnGa)yj0oM0J%fAni!77WAO8Kgu8w7kT; zUWPEtA`_t58Gn6VMPCO5z0sy7bXXY;sK^bLm2ad#E)`gjIplBqd~Z;*^Q2IYA!B%AmjS0BC8 zcZJ*pVd7a;f4a2ju9%C1K}Ge8(|iI~$YLo>o4i_Rw!EU+GB3HTeBCGT*cxF9m`F*LJ&5_GuW`J{Vr`=AzP zwi!sKdjZYk;a1zN8uUucv}aJ0Tj6R223Nj;q~!MvV)yW0FdkRh!maTEI@V@r@4=?~ z@OPqpK5{sR1m}T@B{^4wg5S||+r4%QR2F14)z#Gy=Q9Atu9u7auBBQ4=)IusFaZod zNoXiRv&4YLJ_#UQCLSr{$1uu!Qn3DUTx`Eqq{R*p!6zlH_}T=>^0OQ~@Xt)m{ahc& zeDIL}HTbPkSkL7>KL!Iv2$+Qr5rmc)=xjRe%R8eaps^2*I#ks=L{%D$dev@HZM*HK zJ`g0q+`8hIwrvzwYX&{Y9YEui4HSTl8wwO&SLpv>w$8cPKy&kEnnqq^d^{c`<|-+n z;7*0Ttt%;`oZvTL(EqX$vOFC#Z};DXEju2H{hQY5ut=J61|nlIQ!fe=KQJ`Ep|utV+FbrBfUM3p>8(NM#g+eO|x=deqnb3L`N%U>#Y*a|#;E7&2XNFr~z z-c_HeZ1v927rA&Tdngu{_1A33ndLTg9HK}BoSQ5YQ`37GHAipK&!0TAXTN?WpMk`@ ze&`oF0;soww0SyLLYd9DN)gkpOy^;tCg+}8Ik)AU1xq>qb%$1l+Y8o1EKqdqf?{kw472`-jP$9#AERH4sO$Ju8B%mgt7od&s}urN+7)a%!F zDsFBE5+UiA>s~C>)X(Dycx11`b3Y3(9Tqv+pT8yZ8*_7x-zO$?($*dpR%yyT9(Y& zS8dGzXu37O`~#!0fVBijqVRF(eU7tadKTCCitY`?O`>2XGJGKhSx6#u<%OAJV`*v0 z6%1%GeV!~j9qH3XJcfw_13|%4+y|Nha4)Nd)hG12Ccx^4hUI-qN;r&!Dh#q4(p9&% zy(-U`jd}gL{}Tqqt8*m7>47y5oO12=54;65 z7r`$8B{B!NR9<9OYeS&Rt?p52rfhhNrpt8@;E*P;>tJ6HrS?*QG^^^cV#b$O%LdE- zU2fTny8B_fyS1Xo`Ds10Te5p@u4bVFB+m|kgy&$>=d9L%rl?$hqGZql^pz`A!uT-^ zEKF4Y#z=&(1)H>CiHR$vq3v5%iG2 zZPis`TzYaP$vQ1=70fw*|7hF+%oxac_$ZOdM0Xnxk1k->q;x!?J2pP~SpXifd{3#3Ij>tcn>VtM73iBwb(%$Rur9{%@^Dm z1Awu3ZB_u>YRP1{m_`h;2-GLIv4F(zA@ht^S{c@6ckkZ40lv+Y8!bBnD0)2qCnBD^ z%$~b{UIFpwvJZjd^yKMNDFFUnm9R*Enf-HWM@41QNT&<6>hu(bBvVbTR>Z?(X{e^X6r)N+l6r{rV(ApTd_h>Y`FE;DljP=2_JOs%OBzPC%L@8`_MgF!s`gQi5x^p@ zAftEu4nDt`OJIxR8r8e(=CPdY_C6-Yv~UM{Cs5C%)p2T1n#56=0dx#z-SDrl8OX%L z^}lLnVlrgLs(>v4rxG~|M}G!st*{roXkOmQD=|}7=hD{fN#(=!*J@ta!UTE0NH7|c zB5Mpi9i1VKU!;PVn>o1Cc%4i`%VlC_Mhovp6bRELJ}eS_U@#~qR0$0Yy;OkpsBi6s z6L^wh>h`3o8~I_!%LPG6B5B?H8KR;?qJqh6Ru{%HQ z738Wvoc|0+Jg=DTVlUatkCvf6m;NXLpEagl}7~w8fE# zk$gfVHJP#UD9S8&Jul{(t577lcdmuD8o>gTgNA~HGE4^auE4$K8nd1&2xz-tA$V2zq6OAfzWHHlj(dVAXwL6!f{laC^c6EUp-C-<(oHb(+kr1;bE_= z{rKZW@js>C0}_IW^EsKJ-xG#;_0y8f%m50=z3#=DTVo@Mxse3lB1pz5Gx`OMfbwN_ zX?~s5$SubrKS%~|vci{#fb`n)f9sDRI;$1TPLI%l(FII~jJPS^1G&AjQV_gvY6NV? z47UyrE;g+T>tyaSFw_zn>Z|K4-Y7L|Rbwg3NAP*b8yiE2wUtlRn98gY9xU!0b;2I` z=}qD530a_8e_^B@n=NNC+)DOy$w^e~XpwXYsuJUL1A;{IHjMAQq_!!fD-qy~(64xT z^dhx}>D!APH?|u=l2Q=ob8K0z6aJ-zpo*lefWAvx`3d^r7A!~bU_E)d(`K-LvWWbu zaZ^rr*tyP5j4_Bw^T;SAro382K` z0MYC1BbAM!xA{7pYELly;Bk`pqy*YKNSO$k4>Z+=qXQpsS7D>Ti^I@UBX+8DA;d4| z4ea`gfTh$3mP2^S3P>;ryXgf5-MRgGAydv_z#QZ=nqVPP@cKFDsGX?80LXzI1o!*1 z|2mXeDU$^@HcEg{$OwAwTA10weLryY0TikOlb%@@d}9$1@Vqq&D@jXu4DUl*R-;9C zRm)1d;UQo%=ru=My%*>V*H0(H}i%?!cfgGa|&Po-kMZnyF+8oYw1+Z~G z^~COh8{7dktoQ>V(bFRsR%4*yg&xMDKOHNUQ!f_)ARkmF@Pc0}I0XSu(HSV}xNxt7 zGB)3!ffkxy3AisHsqHeY0X%R$cHC>NCW-3w5pG7tEJx|k5d>C-41iti^W31J(X+$v zj}aJuP_DkDOx?%FL5d$}^-7|#;>a8(hANxxTyB)h(&^jpj5=&9y4T3a7WpC|(%Q!M z&VOyD9F$ofPw{*ABJqfc&6z{eVbH|&hYXUhASb#ZaNLTQ8l&qfctF}{!gKrHy=#n7 zc#e*U<8Me2Wqh2Y)`Qh3vkvkfkx?E(!u$yhFF8fe~ z$D|n$TfRL!wgXJwU%#H8c)&U6y6DnAJU(89Be(=P%*0={iqkb>^TWC_MmbJauiTRE zylb+wD5Y$u@TS4z0_BH+@{_kUetRELZE%Y%4NJ`?jcXJ7ciP?`*7msj&Wz_;LA`30 zoU%N;n|ffD*lEIZeN)_X_d9I&6L|=DvG`kV_OI>T0MAXApNiw){fTi4cqyQkATu*J zXQSD4Wej7CV#$EFOxl`}MP~*zd(6!l6*kO91X{0@4s1b#9=I zq3H5WM`PaK=w=C_x(D_-S5ff4w*az1M~45`bq+*Yu&%(Cyb30EM6fBb!=Lr#H$&!O zb9smW6~(9+Oq9Q)!vHeCS;WJ`Q{=w&f}7wq6f|@&`tTdKAy1FJ&G+jSEaxsZUSZ&b zo12-{7s28g4O3F%Nxg4YMYLjmM!0di9LCw`%_rsH;%Aaw*T!ZIcL5_>Yvug`~ ztw^5zG%MYR(bV6XfZ$i4&|Wz`gRdyirG)pKc;$V860;73hSfMP6M?83E@5JJ?Gj9< zs+(Y}O-I-GLLiY;o^h~>sxlpRJgpf2vW82Bjes{23;#^|d-wY7zB{=Dxw)?P^{+0v zgC`6Ji09e;x*SCNN{iE_^8`lnkEMLRnh+2Xh41|PN2v#Tf}Y&rFNoqTRS^1mn0tUt z>pf}ZdK56u0J?7i|B`8*Xslit=!)V%*QT#(?L|dKhMCc?^_jY>b?rzO&89s0Y@ZP_Z*q198Dq@^Hk#4H~!A4s0(bbka zM63L`1yqPMc{BG?K7l~+LFai~xoY9?&?j{hJW#zg7`KL8k4rvF&WISvQa9kJc$?pF zE)w`UhxN$cG;efhpRjC?)Qx~(H|)&JvTS|ht?i-f;6(|dS2uA6lTXz0&-lR>ogy-n z9g32eNn^#t+?=?u5AVyCd#wb7z(at8t*2)-(xu7+b<$mwOd?#~1nMem&y2yX2IU9h zsNI!893Vdc=J|}?&o2A6Qr@_Y1|SY2c2nRoO^$lg*)1*Szzs_)P7d9mKr`OhO6FN% z*VPvNDkm&xp;7XKpnM^)(q5UYupIoo3k$ik&nhfXR{@jFQb-QLBSjb+4Y>{Bo)mQX za}~laz@ZU7Y9EJDx!&gBC=mA(R>$RddH8Qm5IGlN4v_+cSy^qj_eC0%{m!q-iYgW$ zDG`8Y`p6Fr<9&SmkrW(_5rsqnj+(Ev( zKAG~rEt#ShWyOv#p(M=AveF&~6JdW+YOe_SHtag*%=D}1 zL-A9nINf_YJJb{T+Pr|l?!e6oaSO()BL#^p%*=mm%{?&DCGjKL)(iwb8vgq?_ppe) zCJn%^O-nv15Lj=4O5H~ZB0a4s34+Kd*zNl-B{6{Z+;u{#YDBcknfhY2f_ z0Gm~$xt>W3sSXiqNm8Ff=;l|&Fo9=d`uGcR#ZH+BFJUyvw=&b=!inDGmb{p+6 zRD348kkr-o{v|IO&WD(7tS*g)lX>gHWlb`(p0v*ml|F`k_UpOVyG%l&pS5>)H5Yej zlFCW&_+cR%d>k02s=;K^qViZDpKWhqSyf* zN-}5|HDAE4ALVx$1p};zO4l`V1bk*8)4Ypar;OPUt`mDmYirQ8+_WhE7a%ov1NB-} zMFlmB-uca;MEhE9?Qgl|ync&H5H7|91*N6Fhuq&*~80+n>%4B`i9cYKvPFEx|0UUwA4m6oEG6C`$a|)VU8# zCBAdNyDKVscFtB~v5nz#;7$9|Rf5zi$NWsnb?E(pX@FC2g@ zCxV(0Ii(+=X58^BsX$YA!mE$j`&!aCF!gQnQvn23S3rp*R+;A zt;8Bekim#vR=}1&oQ>$(mq&G&SOeqje*5TX-0uEIs9J zWkMDlUY7@Y+EDeqKQQ!{S*m&&4AgnK!9#ivggS#sOI)zvsK75K`MEmyg}BX-8&s4y zTj3O}gY><)>ABYpz6CpZR|4c}n$V4y3EVKW|5f>2Mp|0k3+9LtsQpzjF1`+ne3S%B zzUJJNW6*NR6po5F<&3V4_x1IyuL`n#AA&~QUaQiy{E&@rrB=t+h1|^E}}o9 zoa?_U6<*n-#-a%Y?{6eDmaO}Q1amZ6x+dA8-?a^X#K&^J)?&B6-sv``ju`8d=t+r2 z+nzr9x^Yc)!EOa+B}>q8@l%D_0P(b1SkU^_s-SSj&$z#PPwUs72fLiNmRx!@Uj|)L z5n#s}QI1?gojdtQ@yE;AI6B_Dvh1_Lx&(Em9>xqO5+CS1ZOCMRBv-ZTW^r2spk#b zK;m28=$dx2LL1}VyT!1bGloZ+b-^oOaCFp7717sE*$4U8UC>gn7=D(;3Nl`JD6M7$)?>n=r#(z}5EyY;{c_33K^oaB~$=njXiRvR_=>XdtK` z2ccEWSIIE}Lz%q66|Fk`UaBye5gUP07-5VtFfeGo+!fC?GZc+59VdoZYoxNKza0KZ^__lZ>rjZV1gUltpRwXm!o14+^`Wh0Vgqn9a1-~kW;`J0NC{o z4<86I>+Y7gw7Sfq}*vt?|uD)KjZq421!=nAip9aD*AV%Pe<#Kc4FZ0 z{_5%n+E~*I*g@i_K5)%#gRx>0SmMcIKGksBzoEEw%N|>TfRfuUDlV?=vfb48T)Eo~ zE+jse2dP4foga(iRG637`3c8Y^-x$jPd%KfD9&+HpeB3DzaiTGO@_O|ucN)*-%8EOmAiHl!gnd9R5Yv~yvgt9(Pqs26yj2b*C&^~v8n9l(Q-*YB*_IKTej-Ja zwVucbM~Z?-9iQC=R;TXK%9m6k-D;Pd3#d<~-_Sbq3hQ;=M@J74`=vpm_%3u|XBin8 zK4^#NjS#O2!DTz6pU{Q@r81W;v$ef-C=}%4a4I+G63gZtvn80qOQ6be3((%(KmD(d zp)zfQ;K*+B$*A(D&%;-vhi*`!@{4GZjR1vDO1n;5_vId1=DSF&bRLm@hwECLTHNIi^Ek|Ds|@K~DHqx}oKf-!1`I;EL#L{Ku(SVbJbdA0IcrhwPqre=-qgK$QP zZ~C$P=e%480M_e%>AlUHhbltgrDN4j)*Lc5R+j!tELh;0#<+*P(#nd^Omc1cfJ7-d zsqK-yr;)7FL*d1jBAZ{U7k}{G1!>QI3gArUFN!OLQ9z-4-r3P{gg>Gl$ggKFF%0`G zy;K>ojQ&IY&1s~r!IaYMy8PhQ1+l)gFJQ-gwhazZUxK{E*$8cp1C_HR7!>Y12>hR)VvY)2s5w;ZsDnZ4aNrSY5%rVsXuMGy!8w~H z(~6~0pBlO?dG+zyGmG)$Ibmbv7FYI?WMQ_lRqBV-g8%=|HRdvGAK2%orm^#3pTOb~ zX)0OIE_t?|eSA6tXG+4!yy)A41_eR({0MV!b9hirGd5ou+JE2lzp{lUSQ|bC!ho5x zHy5S^qQ&t%aPKIhU@)MEJv!I-N(z(T)ep^yElYUVugV{xP)}CLjoHs$XUPkrEe^$2 z683!yjQjKcm63Zq)xy|Ni7nCdA6jVP-HFP&}X=%;N2`~cs&2XA7J!9=}Ht^J)lbrPy88IPk ztYpp9Eh7yil05M?oN-+=7CiAyhu*%7&D@SqO07{Q_f2{ms0&^*oax*ro{Wi#OU>rw zS5WNgXQgs#HC3x<_)Q8@dlYyd@_%4>NF(iM+p9n6(b_;Bx?~?H)n7w3@f$GoH8htz z7Q+&Lfl2j1sV(wc{etDWzkko}B9d1Zo_xr(@?;EcZGx%cOJ(KZ6;wj*#?Jn}SaL$b z1P2{mnhYDE{2&B7e?nmV>SZAd5!mZEsw{tEtK6O2%zEX4pVP^eVe3a4DN3H%niq4g z%^FT#EqV^vp3-_F5|_p9Dy~8!N#w zpb_UhUk{|9f>)0~CC5eQ$&>aFxUEhEtVakS?iR8dxnP9c0fVzF7{7dhn|7anaj1cU z{0ie)=nObB*Tpa5EjyrheEIJdLI?)L-)7xMkCjdp>^$rfgO~%wva!=8wHV;I~NV?W<+rO+eM1>N`q$*a?_MI!4Ii1j7!Q(%puHP!y6^<~i2 zH)P=YyAq+}kPKtmP7SrHveF_6I^?4e=#z$lS3nAr*B!vw37RFC$tNMg9PWT>}Z!Ll4TO+_5 z9vT`Ww_krRx?cV(d;GSda1&Jlt%RMs`(eQ)$DuNk_cB})sUlAzK{cS`=FHXKL@msv z^G~J}=P!-T^Cy0JtoZlYsi3_@*Zl@zpUB1HGgYT&ywrTr&h%Z?pVg%$)u+m>0D(J| zXC$puw;?YaT$zQrdeeqpn*N&a`H?x$Ki~saqu|^#lGk~)YA&1GJT zaTLJE!_zJS&8j10gqM_-8VMwB!Myz1i1N>#CoBL!$Nn6`HfpY#Qez44tcxfr_U^)x zE&`}j^}DbGL>_@js|lF18bdVtAPUziGS$Sv;a>ziBHnD!Yr4Ri_ZLW0v7ohfyfhgl zLaA}gD4Q2+iI|+99>rdv;50F)bhzyWgE!bx8KeSjyMDhEG&%*BAcS2{o}{`t5i;poN5Ivrf~Rf6#UN+hCGUI2_I4% zD@xOmv}Pj|Ss0vR(a(F9-<&k>zYhKDTyfpP;_@PJ^Qjb)+J ziJ9Ax_}5}1N=OhDh$uTj4$vBL|Q7q{4UTJ?ER!s zIpem=2^xhpAbHvV&qrA4Z^pWU$rgwR)n4POzn=GOJc18FF!ahYkli%s)2=~V1D5v} zprlBEK_?_Ckb_ucDOOAkX|dP_g1<$pXhh5XCRwA|Rwv|q7=S!v0k*|?U}aR5h8^ z0$VfPJlBq8dsOLcWrdI5*LE7Oo|x9u*7W_*5?leN$AZbB^D(Fz=5uVkkgQpggKt}b zT!U_qqGslWeWmzA2^P6Jx$+|H5iVB=j4}b#z{zTOQ{#Z4^sl+ka^ZW49%wr5WMFR-Kc`(I+`@th9abRcdB7 z;F|_Y9Yv2U&(Cv9teav+@%fcsRGK)-#AQ`CN-w-w;WMEi^P+)2`IX;E?%}|m zye>z9MF=b1KRI-2L2It~1INFFPshWl2~{GzMF{!QZu=tt&WKtfRlI4HwVqqK&N>mY z6jb7~ymaJ3OL}|B=&iI36{O@j;Xa_&Ygeo zD7g<2_yK8XqbSJ9A2{URBqux}14;8C6i9Z^2S&%lB(xkYVw%A{-9nU(bSV0ZCp*ur zTlX5FK45tef)?1p2}A+EQR>s2w3?SJmjK#(FO{zVt8H2M%ToK^jQ9R^u0i}xFI>Vvw&lXz|_qECMeFn#UB5JU&Hu3u0PRtn|cEIVR2 z`gfx|Kt7oTg`4QK!T)tbOkj-wap=dT03UEJly zyhIOK1fDOBeIV&dawSZ07%nH#+b}YsxVldQ5DFv*KFg~K0`|eWDs*7k8ZJtKG|eNJ zR9wOnU}Y4}3TGlD9Y9qpl`soSYTq#_nN&(&W+e4xZ3EG6aduQMZW&=b}3&-AhsvQKGOeYo|v{zNT*ukyiQ7;I8;F+VscaH}2N@ zcI9XkpI3qMos#0fDvenwyoLw)bgb&HaIpmA2|7Ln+gW4?+65a}>rwa4g+xTjqtL9a zRq1bBzC#AKLU_< zrdarJ?IH3&Ece0D6kG+OAT`r}wmQTFDeFh4rxUfD-fJK*4TCj~|H|^RLgB+U*p$H( z)dJ{=nUwT&No;w=D~vf3=u7rs7MC1l6|8c_xn;af!L#WNyyVS(yGZAP_G9eryGDYs0%j0s;aLDkt(G zD}|GfZ+gNPl(2BGfHxOFM*C%5r@IUy&U#6(tQ1P?o1Sj2z+`@cjj{DJP0hg@B&M)Z z`12a1Gfpr+CP!~!Wn0xA&tEym z79&jlTvDzGn^BfAjU{zWZj=dvBSyQWx&G+kK z@|?AL*w_Gd7ES1DiU1ELGLwpN+%I!7aV!a=`_5{(f7~C)nME{8~^NWmTqc->& z|3jL5fn$Y~l*UrVj6N|>XlzoKP`!HaIE$6rXN#?3f-@X7P;JHc?wD!%`A0R5@IG7U z2aG^OFafppL^JmX6bH0b@tH7H-Gy=J5s)593^IeMf=bz!!9Dzv$gEf6%>HFL0udW1 zKp#OVanM~Sje2b|$hn}E3+8K_-g`3%hs?CSt+dynvv zfGwp9FFMnIr@dW~PirI_toBuPzsbpg%8&@O1iZBOW6ILf;EvECS6+fO#pO1MPS6@R zFc==D5X=ltY+l(SswH7&oE zY*!Pd$wa$A5WEmfD03$7heX;e|F&t^_x*lq(zs6lOf?=?S=MorOZ64OYSJ{Gj+vvs zWE@rYc%0KE`N>KBN~3UVXSlI=VtoXRG$!q!UM`-3a1jlxpV zj}c!yX48BZQVB%wC7)xN|k8qVhQ=dV7ZnBv7|L}N$gvC`=S0kQVT;uW@^M2U z81AM5xd&u2au8Z8McUke|HK{s-ao+^^I(YWZUFCh176yQJWimzE(j z$aA1p;(S-W!_*}WwgkrM!cO7fLl07nJSd6@Nk}?C_SN;vTN3hrEI?-a4LoVbpu@BA z1}Q&w80ykoT}_P;7%OMJ61^Um-E?Nyp6QN7n_bT|YB9x1gTlBFl+*sji;>VUvAotO z%oe3;=DFdi>H$T}M$~5D)u^SxUs0|MoU?!SGa}wz#q4zF-c4z{%Y|hlayR_tbzGfr zd7UT7uSZ`A2Jzgf>^xFs+eh%4mjVIe2c8{LwnAZz4YnoBM?DHZ?27eD~e zpywQQ5l)XcbBi!e#!DGcf$51L=*bzSo{@qPhCs%bXKc26ecoMpT}!*bLleR$tll20 zHS4dpJNR$%($d9t)AN}Cpl1050p+iGqZzZAkrCazAFu@kFe<|bR)heq1AIUxac4dw za(+<5Z3hGdgsf>wa-kKWUEe*JemWfwu;cgm$w{M>tO@w`x(bhA^{ZNzo-?9TkM$1Y zF^}qrBMEQ8;M!wp>oXzUOK!9v#+S*M|+dB~bG_DrY`VNw+x%7p}F+8DTTmYf4ok z@fBZ{+(QqTQAy$q~ZNj7TX|MNbYFiE)dGSnKB?~*Z*H0wBdcVyWgte+RcOv-3)0M zRAoT{cz9jvSvfn%yQ&jIbmCz(<82Alejkvg&!GDqm;g^cS;`Xq$2SR&U$H6S4$T;L z@O?8_JrJu%uDA-av8GU=3m#Qom=})tMIl_>v8Zu9RRCAT1~bIAKf?vT2izTS=+ew& zfM30@%v< zRb)@_#(CdC1Abw>fpEfaT*gj_*L)vr@mxmFUJrq#XcZ)W6PnEgC9x7>8M%`Kd# zom>pGlA%YIJ}GAJQUArN;v`Ai{g9j43#Ah+i0pAums}jgt&_8`#6y$N#CU%IEjQ}y za}R`U&Cp^j!M^(t>ukZ9-AxhGu`mx(lpeVBzQI}KS$4%O$DD!zIxVQ41n6R+ls+g? z2M+xr6gATlIKhRXRe!x?5pryY2uVm>2TrmTti;Pc`oi&bX@a&3UTcY$7DcrSOs?9$ zhNKfKa^989`d)Jgc1dVzW&5C1n0PBG=-MM~M+sb_GL~GGjA!QuBZqqd@3z-j80U#1 zHJ)BGjj0O6LRAi#U|-c2E#yojW?R&qtp8`)*r#XWwDv#uJ~6qqS)@Jjj-V1#Cwu!v zPL^l1eIN^sSysz}ZyDWF>Dx)c8RbD#_5)3-lFEe-D?fTD30v>ko25x#kEO%+U}J*@ zY=MhBl!NeBJY!qrzf%fMauhT3o6jf2FGlrJMd*Y1?%C7Hg?u#QPl*SfVfA;Er*vbJFO_(fNcWh)bMc z0tzf4jB;H-<7SZeJ9;Rdny=Pm)*9$=)A4e|_%67l5OoMNf!e46#M>ps=8Syz!Fl4p zVcApHejwQ_Z>bAGlw0Gye2Majbwru(?Q00TFgogHczR|IfjYOq7yV|EMlA3Sl#qEA zqfALO4~}nK@7%#Heg&p1OJQwRjxEsC>3InZb{1#npf} zlC93#86uwZ1zv7RG`=2wpdSI4MS+)cMlTvS6yCMBraBEE3J&xWuL(ofo&5pG*uEr$ zpZmCUy(&kF`KqjmcGzRO9Y1L}rg5X5PhMObsJ@Kxq9%@fq=?Dm zM6(iVrq0iV|GYR`m5at;aFz?W3pj~k=q&QXW~6Y)6N0_Q(`!D#W(Lo|E{BIoUtd4E zCz7$kV1Mo4i;JOF&cCp~<1InOAMhVguTA=ecjO|hiG<(8d#Rd3jx1yERh*IPZv;+u zMu@qn)vw}yv|=*xr6bcgiYK(%D@|qE*pssGE2cU>cp$bOP_?U@YbSiwR6OXY@0U$a z=WM-ON6Xp>Mc#yxRh9+^5%xo7vWLu-nzj`dS7fwozWnUFiJ$M$z?1Y5AbiN)<{Iql zyB>p>Xm0A`Wog%wwaWVLUMGFw1s)7{paEZ*jG?-Hmh+m`OSH-kEUJDF0-#Q=M?zU=+6j~KP_cL1z#(aDmGgh3MW$@RO?9E=%2FM^Iz;4@a=gmDKM5i$!2;=OZop9uh^3l)-kBaM=4;*NGr zh0-||fY5$uc}7S2*CMOkUW!hH-(7`iV=j#4ZZw+l-`Ayv-UeLLjLIypke~per$rS% zo6ZcxJLyV1KOEM1_($WgXeDJ3r**6G=6OrLoQSJY881R-eG>jE39r<)wvm-1thZXY zJx{5A&yk#mURZy5$=Rqw3NB|S&@$pva(78Y=LwS49C7Y0N@x1?TnkGMyA%g>4C_qy`-n;fh`k2LrtYYM!=|FH2 zZAH%y8{*DtD)T_H&Aa|9W-;TJ2}7jRv_Hc+)Nn6*I3sc8AWA74gEh)Kna7XHxR`Zm zCOCC|M2=PNuYLd6NPsm(DqtTfii6OuTTc5X|FPqjFzyTSH1}95?$=w(*0%|hwUCv) zeT_+$w=PwaGvFdP+KFCqy|`dQ0T&LqQcYW}biKTX+~!l^J;TG>^a|u5FfSU`v-N{G zihSMy*sA$Y6mgnkq5eZ@CXsTSEi_%kUs*UmKhJr^@f~AlZ26i4!$&)SbiuN28MP() zw@8Pyu6IYvrJ)kl8p!EI95T=Aud1V?gEJR2Ur5;2>XDG`Nc$6uUniPTBzA<$*){IV zz-UI=x3$Qd>Q^fBOd5hon0?!OdRG6y0H7ImkT1Qx{p!2=YqXwvh})R}Tj=!{XeR!Z z)z!mF^yQxL5XcHdw(?;KGlgDU!lK(MV5k5h$?A{MN<(p021Mch7PPS%Q|-Fq%ypaL zu2Frq?J!K`g*nNlFLzRDe@O?-0tZ2C^T4zi&mkQBA}VSX>ga$WV;n z8gisBvF)EPj>SAZeIfQ#9T#5=8;kPT|9kI|6p|&gGjgaRS-W_@#o{p7N7^lHMa%A^ zOb~vB6_q^AK~aEhCsu3c&8Ko-Q+tZ^?rz#pndUHyv#!)T@2kBL$8=#UIdhL|W^YvY zI>Wkso>o}ti(vI2CuVrLwClMe6YKS1>?Jj$DM+mrZ?(%MRkr4>Qq2!(BJ?e7j*R21)c{yrVhh9M zCdcpxf}tF?s-W?1%@tv-6fpgXL%ljkmAF9KRc_bj4tbiyW9dja$jC~q-y6a*7*ZKl zlO&L?$gErS3G*%HS?)DIUVEiIKD$jO3=Qa35S7?iO||2JupboSQ5Rbzb}=-NVM*9Gn8-R zQ&Ntfi3HPLTb3!_Xh$7R)z(V+tDLQN_I2V!ad8Uw(If}op1{hT@+S)wk-eTVBj(GW zK1s~#r*L~V<aw3@#YS%GCC};1OTn z*}CwVm*yj?va505?^b+J`LZrrZ#?<iSD zk5t~zlEnQgib0$0Ct2Y|t^#XL9)cw%1dAo6ksIr?l)0&$4 ziz(5*y;>PUXBN$+kbj;p-dz@X+Q;mS$1q^IEttfWesC)U|M;*x#5@eqmzh#|6ZN3S)XaY`v>Z6!Ho2# zB&Jck_t3cIY8Uz{wk$+pWotUnnr?CKgrD2IFD7hwND1NG9kvc0;_BumRI0*L>V|ta z#crv32<+_atn`nJjCkD4n~D?>wn|fCDt)6Yu5a}s>d(h+N73~>?|GS=oTMmkzCcc( zQ}=^GKtqMt6(#qL;^5*YrU?Km#Uf@d)icPscxIV?J>e$1KU(cxOKI1#N;~>NOMb+7^ zt`s(gp4ZIjXueqsYdg?zaB9L?Y( z1jhJo)0$1kGAx z%~yVDXlQ6knUs;1ezfb4CbRuONogepbbV{jY<)awnmt~u6UdB>t*k~G@rQ$hLrCXp zd*jtA9yhkz)@U`)veFwtD1@j!P-!J{AHLk=a$5WH{5bZv#iNdmm-mUgYQDLu@Ni0x z>1e*i<2Lv2U$r)TRuf5oKR>-1jhMJN{|G|Pl#PuI7HKJ|8?H;#3eCaa8T_rbfT@Ln z)@nx%RlP=ucQn?;SH+~TE`(dG{9MX(W<06ipL5LF6ZzeD=AN5alr|nwiC7k9jF5ap zyG61XP=YCLvGZ~%Uu`OrGwW5y+`LKo*LKAPcr3Lz`?a1KkbG;Np^}3W6AKPjd@CzQ zazs)-3od09B@F5@2_mXxzy@Sw02wS0Nl8hc=1P^WLeB%Jz~%%7bS5n1wMCs$JqRgl z9R`kO&S?bjIn@%sY-Hpu22_XwO}sP?qfYb1QiCIHU*!8HMe-QBLK>^D6dyMjr<%*L zmx8Jdv&E}T>(ybj=0CdA(uoA4X|HyA)^3^Hv$EgLTXFaeS~Pi?)k~d402+&qQ&Ur4 zW>!bHrVIyvQfs-nal38BNFb(Ubmo7R{UOR?wASv+q3!*)Atp_1v{#ElA~KVz=|(ix z>5wyqLAy~60?U;{je!`1hR>3#kUtf3cjt^o9xP z{bLb9(Yi^m!;e=OQN7jEjqJb{@zqpUI>*z?%Qi$bTM`n*S+SY}?YrhvS9c2sL0|EI zG%Hal=0o{ah>unzz#x25ub1WC z-;XYYi3>NaNFIEC6vXw3yLdRP^QD z$Fc)R{W~9BmqPg}9^hBmyh~@mw_`}ux{v3$4-_rZP+7{&UQY27)ak<&!6YSQ71!*W z<{XTf05`_EZ8!=gky%qu7!=Tz<+r4LTeHmgJBQJyQ3U)-vBBW~2G}d4Q6YH7++lKW=(j*-v0$ zg)2?IM&r4s3teCsIk3~oW%KXy(o(|B$@1dEz{kvJ(6?g81YXmIGx$=!A50G%fgV-E zowBmB66WXck5XqfFWh>+Ls)4tLU6H@YFi0L>;{^63nNFi8ja(f$J4geMz>3oi_0;A zxc5BH(QqgLPIPoMMwM`uYrl|et01WwyX9=jl1izD*z7zNItoe?ll4Ni6{P$*tW3V> z3wz;Crd~C%C7dqw**5t^jz2uA8Z|Vr(=67P`=^0tk6RsT=-(=U%HXa%F`Hhy6j`P~ z3t3Aq8&W$i5^VYP>7q+K?$-2j5IVf^mk%n;--TiM%>x^{tqNH*+te@c_QqE zRKQI0NPDucFM9%;x*t%pKiDioL(?%QGfd6`s>$P*^O*{N^0uk z-7;47yw&da&&z8~q%#V0mb64i39?xVFFXJfB#g3|c;c-k9Gz=$T+Fw8>5LfjNRtmo zv+fz^GLDz`2oF4LEcOxir)jlB%C!>~6%*MCpRkYvFL3SXVqP#F5iou%=Gey6gq!(i z$(y<>vVHV)54TX1{kK|FGr1|R+#?nQDLmKW>946XVW(}-rKb5Q%5neu1hCVVZW5Iv zmi3=&3Y(|F=h#e}ef@U>;jC&@5@ors*gph*7cIy{;DBeqPe~2o`wO@euHY=Lp}<0VqQrz_5WU}LG?+bMbZiDFjAf0Of>92*FnxRwkk6Q z>TRTR#Q)zJWx^84>14$SgmD^?|6c4i0jS5F*Q!}!)>d>X@9Ox5z?GC?@xS+cfJ)qR zAsFlG|BhGT6TP8Hy3-p}dcyx3i9xl6$j7eV|9!gqk0PcV|G$Ud0epev0#+Jc!C;qP z|NTerLeK-#;w-G0e4&XC6TTDu3Rgr)E>^H&i!gTO4v+8ccXw& zEm?)bKpwNl1VMLqd*MNXbHBkt#0i3k2m!lOc?vJ?ImT7<)nL^zTx-49Ysr?P3FeYF zknC3}U)uP=DT^A7{0Xz~7BvqBO8c*he!P5qQ%g%rm=+)1o!$QE2ERnL9TRitE1+D9 z{rg^oxTED_t@UPAWhGwf$ZscuS6?t%%#Ee<+^Pr(b^Hpi(&Tj(7@Z+dezuBjZrgbQ$Vplno{zXLOgAFVBp-v z-rl~jr9*a;<>HY3a919WZ^LbD{6~6fp@1Sy{BJt7KWoR}$kkU{z3zE4l-fR$gB8Ue z`TVJS=i`NVTcB>y-s#n#-%vM*&6q-C=mM_JTW5#Uz;4W|zAr*(;6&jqo(-u)$nG^= z+-}l2Itqg^9-lScA^aIaTsbu5$RyTZc)I}C=UAF6qKkf_mvd#`{0QUaj;>!jX0xqN z_nt3L--=bvA;a*bFN}PF9yNZa<2O&2%U2 zhCw@{q|b^OqN7=BHNUA^u5)d*SbOZ~vM=$PVmy@4;(mQFqvGr9d+LX#dsXg-K~5Eb zN)`}K7Jy0-a8>m1*ji+aN=BJI`p{bBRa|##BWNhI{A_Wobo;vaQr2e{A!Mvs%3Sxp zy~7{j3vleD{Tp^8o%`AI%^dm>=|i}YA`$RIYvGA3*)cPJy`uK6|Neq}Yr0Tr>tLo> zw0thEyIXX!$;CEDi{TYc@E5BAO}y0Y5Mx_3xFSDk;s@hrI1|C1C;hWiXgD5oHn_~C zQ0)jl!Nl&LqA-L(*Qq+3N@da)W+n?TV@m-Jil|zp@-!|t!Wa)2wdw`6w6%+;+$?I` zw~ywlu9=ycYo-W$Mn>rUjny62+Mz&Wvb1PNvp&iR@)%gZi^TCHT(W>G z_vh=mRfwPt@O;gQNCp@dJ#{B70CU=^srd)5hf@VQ2U8`dJO`fW1R+Kv&6{gz#JpU4 zYaRX{4~Un#tS4;c1axzl1%kW1?pW@fLP)sT|E5w71JPTaRYA?;BQs15^g&#f)dmIz zk}@)=4X)?pU%q@H%gf8#TC{C5US3{~!2Dr^4@ssl0HeADB0y$Rl}x8z*{zIScrj_l z_E{K_nwpwyD1n~UoGnESQp(HA%Mu$G_aiY;wZ)`&X6Bm<2u@gRZXF&R5Yz#$-n3)^ zMkXehoSd9sgX7|ID~*6oT#YF#>Fn(6)F>i8WX2W?_RlK`!3S4h8@6oHPSh@)Gtuq& zcwC2*VEhHp($cE=a^+xe-%#&yYlAXWNy*Q@qR;yGw`?ld?Nlrt8-e%RIbbQ3t5c)f zsv6^GEuJ~RgG7k0f+MS>$3giwT(B&k%>*6pXMFryVMKEfB_M{tqPsslJN|g6%-7L= z)z&NTQEaBnEIJMJOftEE3Phevco0=*O!XL8J z7T2o_R&X%yAk7s9J)s0~HQvDULlUiOS@+%J)dd}c3bHnj7tULLCQ@?%4EL!nTl{QSg9 zzhz>MfTe~irDBy*28~jc22paT%rRR9c{-dfld3PDosaN5?k~2_Dh&IOrzR(()6!5= zN2t({ksBS(H+sqpd&A$F7#We$)0a|_L~hL)R0xvC{Bn-R>0)9^9RWv&W{CvrmqkWK zrpln(y5!XvfRv4b%RtJ?`VJg|h=@qJR;wq_uy}XADOOQYF~0xZt{S=Y!7-6hx3}7S zsvE@lPIfjo-&xiz_CV~w)sRVM5%b*Yk2wLCAksRUCI%hCk^1HzfF)e2LP0?RL)7PM ztPT;>w_lGRQr*}f$$U5?&6%;{cjSL?Z{mRRMip6Li<$X>97yi9Js5wfsHF4(0EgF{ zn@jmKF;RpPb4JTBk{I+eVj>(IDyC$aH7+y=VpL!8t&ya(9QpJR!_NUD|I>kYg>=L3 ziGuRCH7PN11>z?^B1%RHYsw?t@wQ$GR|-Kzub(m6xyZ#4W~70)3zfT?VBF7~d?Y)A6g3rlvQ`gMQ40ijONoomLTYM4$eCjai zE*Y%+^6HaU)2$8|o_Lb!Y7{-4cgt+OmY+p@`}5bf$vYBuo0{A#C?8YIYdc$-n(7>^Fn13)(wNe9~$v&@mQ*fkPj9c&VYu(c&vI9|HG9u zV@m)S@D0I2X>YYnz+^PdTv}d!b$0ml{yR8Zjyt32nyOPN2??`i*3xQfNxEQ&oqf8$ zY_eT#)uu`u`l_ht2SNixw$118ctKEPu)5y&c~2l{aO8A2TUz4d<3p9|gdvP49D?Q3 zZ1EKmeY(`3#0uzl!a99RDY1z0QA~7ikt}uD?)bdTS8JoOY#k6?5n;|{{_F6uwZC^* z<(PAP&0U*vyoZMgFHhh!NTyw|w_F1j)%A<&xCTu?MD*DXLFs|mC#+6ACLd$<=JQ^{ zf1$VW(zTf+WwOvZ2@?|&gMeU=h|8|s62vJh4^FA+0eUfT`jf!WY`*GwDQj$K5~Pn8 zB1%4-&ZFx5^5j+rLJ?%t)JS4tVj%98#N$$S1j23^r5ZKD78W!hFq@@Jlg^<5_7=5X zctO517EXhBU|I7XEL<`OBH%&0{SaV{T6roR&tU)#8o~CbRyrF$pjn z4-O6K*DXRpE-otj(^ucu)5Q&J=?lGoF7MVJiW@MxfB>(gYwvX^g3f}gtJ!WpW_l|A zOic{~p=U%`Kb|uBioX@V1)YH=K4qGC7M0=}DrhR4FlO6eDE%<|#f!ZZUW{4zupZ2Z z#I_Cye0UxO-tWixT;w_^!~D=_PrNlNh`djS_7m)5nX;?zFO*?KvfTX)U06McC4$es z8{5Rm%4^52n7X<;7^9*kDfjrV$T~)cIBc2rkZJwiPc+jXeTr+jz5y0(X)P@IpRcBn zBg8MAt7KIIn;DOcPG;ytQa{8rWYt}ScaR$K>m54d4$tcS5RFA$d%;Pji@zH#(_VdO ztSMtt|C0*ILS4yV_{(A&lA0ejtX_qEvb}vhG+$-Pm#at(nkgyf57Kz4i3UegtA*-; zsgaRmTjSb>W089d5qtRP+5#D#GpQ>g!Arvmx?mrobz+&+@4F zFr-Ac#$qOHruTS+bM?vL_2pT*FC0J4@#X3M9x}^G^=t0%mQkZx@^Z}|UF9_j%v%Ov z3kWv2bzaV3<>U&o3)=KJ(mAJ;;JP1yrLBI!(b|VX4nPC!Ul@#yjTxl!CVTq&B)(bK z5__Hr;euV2z$df8uxXCZk-6-*mys!@pTE3`%yLSdAmDL6LSh?_8`Q}4hov*}gm>_! zuYyDKo8)C0*=yHa9a5mf@gLjmGN}0V=g&B`(l3=_&`R~$2ta!wi4e; z-F06$Qb!6y5|(ZHt`Fy8GBVH#l{FkoFn_>u+OCM&*f4B4aDz8tBZ%l~oaxI}EF_H^ zP|(ss_3uzn`fX7|fE)-7mSp`yLxAPgU-bkrXJ?L!%gdOU7+*g>KZ2@n*z6YSdif=& zfq{YSG5tX}5}=!GZ*OyX+|YH|6G=%))jut1-2_@O-?UWudV1W&n(xXp_wu!Av6rnn z_Ix^iE_=@44dO?cYo{Xm`m65CMJaiNsw-@?C*m3sq>%REyG2;Ffr`C|DG=k=Az6a% z;3OG`jW)(u_eHTZ<6xYD@7L5mX^bRzj8_4$u_)^IHFP;duoOg-PyWtQd6lRC^6m62 z5uZC7UeG=&X?J1p(t@*r+O`)dsbl#zp2l$)D_lhCUG(C|z6;^<-4qxhD-^*JJ`KHE z_(J6(e=s7V{FKTIh5)E$ks*q`t9P?uN?zKU*(cYB*5r2{71j5geIQG3+y2oK@=At97<&D%N7gcM>s?Ec{MgM zskIn1f)cc`IWa76xzP{;BMsyiNa1{U@kl(5Dug39i5;e~%-9IPL#xR-LMDanOP%|*g`ss$d~~#+csO3n z?aiX?At9^A%-d41f5rzZ^fci5;G3fL@1KCw2k;rpiCBz6PQb^@{XCK!f&*rJW{sNL z^>f!Xu2JfoZ(qNj{{_RrcQ8=rK5(%Uya9_zYa)Kn`V%m>=6;q1UD^u1xJ@@t5#$y( z7iuhxxzJ^Smf)rd8dby21l~xCw78}AWNhl`{_J^<`LpKWb}M|P_Dt2qK{c;XJ?(bI<6gRT3Sm6IUjJsHsPS5 z@R{@=6>4;p6ck-53R+g^_h%vwPAk0PIPdAd(!|TeQ!!Fg{{S<=IdC5r(&y$+cKe!9 z;DXO@6Ph%@hpu+*(~TWn4+#IV>w|%5Jg>{3zl2|Z5TZP{R8*2|hS;=^AyLgeejIy? zi;e9&wmX+Z-XQF&|BhtW%WdW8P4tW2owwZ5VR`HItY$WtRL)$R1=zM7hEv$3vsH?5 zxu4D!-_!UhOd^mnuJ*InEC4-t&3f}V>aKMWCO?=KGZ; z*dxR@!%Z{Xe%p;@@VO+>6)K1R{D}p2bh!lu1$#d{%qvaCGFm{EgY|AV6TsQp-L+Kp zIv3l&&C3&$-rN9ep30T-Bgqh??bPh`+$vRUGC_3+36@t!0meP}R{DX6K1 z6e{K8Z13(y!A4Ifnds}Umx8TAekK}!*{`WyGRko#{zeTt^(tKA$Dx23nX2>hyZRx>&$1)ob^4PbF> z7h7g1Z%!eycB=h(iv8UN{aVZVJ6xVIv6cm-Mln@z8nn5e2xNM-^Arp7K6@=UItBHS0K5#WtW`}~44iD!{Kd5sv67TK z&CSg^@&eD_pG-5oRLByCK+qiwm305Us_VKQI7F*b!qjiX0_KbSqHRPn7rdf{{YZnl z#VC+fc1q`QImwgfzt7EHfXo1+n?>J>QNiR_7@~5$i-im~TcU0VR!gJX;7!Ufe{?I- zwitlbS|Z4iH!d9CY(_kF8V(H(l42lY;NqI%{19C`cdZ9WrHBa!M@N*yg$AYmIUbkH z=pU4^tu5|BRC&LRF*|cPVrE*zb0%KFX5;YT=GgM#YD)h2jaV%})M3SuSr2wjvS1km z($&uVndk||KN?gS9e3sV$>wx`^sls7&|rFO&>97O{;vTOp4`*5IEn*P^oO0~Z;Bb| zLY*s8aUYzZa?5xZW!ZSA-9YjFd8q&PeM8D`?3~ z(RN@U-PxHS09(H(e=$kj z={px|I-3WUyKPU#(A%Od%net52wD;A<@*V_q|DHcZm{28Fr;;w(WGvWXO zRPP}93!CXvWU{)WH(pLI?lxAD&m3{_xat0( zZx+dcSg8u5TH|->?3^4+HWU<;itqcAGLSJIFl`MC4e0IxqI-ICoS5Y4VpquT(p;w1=Qc$`|!mE|SL{JtC+c?8}B=`(<7Wq@h8;`1R>eo=YS4?# zm7`N-L&N9>*VMv#x_Y{D(A3mpG_aI>`)>KCf`daep<5%L5_3*+7Y|-UZ;CM(PP!Kt zn}qWex%ry?>+0&tN=m|)TvolrGBPsQMc&@s-R;rP&`4(TdxchOSdW~cfh9YB0LDMe zU^zNt+2-TQ%E}DiRREZ$3Egi`v~#ESL!zSON5+xB3($Ii35c_$5O^{H;iK5$VHuDk zKRjC4H#aw@q^FO#yTAW;+x-09Q1^?;65fZ$$HQ=Oiv79rRcqse)6;U+WSNurcQt z+P*b$MX2O1fSJdre4X|1o!deCnOf#K9v@9YOu3bBipc#!!`)_1wU7HrU!LA7U62F* zb+11f)yQ!d4a70!f1JYWq%!}C-wzv`jdt7xMq}#hxnh6*6!l(se7`>@r&HKKX4Dqf z#e0<~N%=5StQuEkIyP%|vf7r}zwH3CrdDnY&159+{@%4umDI!Qy*I*Hf2_bYrR3pB6%`YU+1oS2Bq5Op zCPDFokrCxvd37Jzwj32g_G{d6(z~b{vHR)Tae17X>!5*laYJ2o2bW zBlg(`Y}N;bs{mdpIqo+{>S_uK?FosAi>xdxAgeRbi_U-7o|2hqJ9&7W0E&64K*! zi?Gc~^B3=@a|sDq6;Uto!w5v<0oInhoxLScDl<7b>h&rx|yq*Ut2Ekz=HFJMU|8BSHY)xIfuiYdkV=_4ksCvE`Xw8u3X)? zmZ4>zM1WG#T({ATcz;U8xoN;bxT3?5@t|KlC-t8m6V&Cn*_Gxy)tQB z%<%0Y8kvR6nzLWxhL>G|W;aO01;`VwA9w%6mpB|6C~g! zAoDFGaz-v%D(^FhvJ@)Q+#Xy%a2Fim%#)7@P-H4!>SpcdDAUaCUqAc+1M#X6iyL>= zK6#Af&X>GNGI)P7LE0kUJ$s@=Ulj9;b5**(Y914Daml6dMd2ryz*1>kI$$|+_1?sQZ*hHJu zrS5<(f2hOtkX-rP)MWnC{MO#}!xxaMuX;>K8rkVFsdBTwMvnz6RFqP7$*SlN0c=u_`@UTxc#JK-wM{CSgq*aZf&#O} zBSY`IMr=W3D8+L*3IVKDD19@EO^<=EEjqvz2s%c11$D!~-fLFV;BS zoytedv0TC}IHcpy1!3CZ;-|QjUEbMPBt;-V{+hY{p9ZG6FGbe;_1&WP%-oROrS5r8 zwM6f-F(v&!K@;#_jf~<5@PStY_VrV4H6mCwgEv{6Xt6lymgE~45@DyW`}2KqhVa2_ z^r(0O)-2biEN(oAH!!Fl>X9&u< zm>S5VJ6`gN+>%_!zgim)(U0qmeE$vvhIelub{|d#OZ^cjY>5PVj|%(c?$dG!q znU2}qN=WE>qPK_9(+jz{Y^UW2&=GN2O-jM7rA@>(Hppc#*(lek>ZJ5|n5+l;;>tbO zYVE(%5$0N)Kwkd2N|?&kPzG4_>v<`CPXg+8id)Nivo)0v`{eZT;5{pzJjR@Ffn63? zZ)QlaM|h!ECwVo$x5sZ@c6pjPS5Qd?r5By<{=UzJ-pT8JnSNQm=l48tuix_HEz(DP zhq8$Z<$nu!p-WXcs3kVLJpOAUR?67d6yVvr*&INH2#UJcKArkIQPh@4v_e4uui(fx z?xzunb`KWBh-7=S9q-X)T>mm}u4B8eZVjOG)!ME5or9p7%yNU{?kR*xZ>=4T#QScY zf>wK(a@G4)B;kw8v#?{N%0f}PtzBR3RO_?Dd)u@A;NQQq4GO7wsE1;_z+Arr+SD6} z-4e-5pT&n2h@L5Tyk+s4Ln|OTC`FlVx$XX3TUm0b%l6y6cD_^B`{m0@Ual}~5c*oV z`U4f$?9S)Y2y`lm%tsvT&uMmN;{i_ZJiQ*zR&|SrMwwj6f1N75TU~r;`D2Q}KFom@ zY=Hb|b9eWQozD@@4bcO&ju1BUgQcbA*5sx=L*u~hDE-hP865uAT0$U^l`8-?7_oVm zLDl9#Z%0LBdrA90%BLsQfsW&dRZdRxYKS29yESnK21vUY{IHu1JTl6KKb8Dyxv;>xnB|rt~dmZu(T0|O|I6?ONN#pM-^&x5~L>R5^u@usx%-uNqhKEktj^YCXr=o)$KR<~Id3Vb8slm)--B+Wn^}Z>5Nyz~* zVJQaW&_m$;{&Ou&Uc9vNvcQX4i$S+wkKVr&+Fh)xN|#ZN;&r=?8Z%Blp!^B@+4=N^ z0aVf#E6{u^AM|RnnJ{ZKBbX`)lObgBeoFc(($dmWuWo6u!4nwt_p|ffU)|rwT&*$7 z7Hr&+Fj0N}a`_@4%nNeqG11XJ;o-{fB|@U%fWFJ~bALfnalKTCm0FeZO9#*E;fHS_ zw=>Mb>?yyqH%@`io@|HXqi^USTiA#8Po1(_%?ayAKT3E4L{dwtQ;lzaO1^m5GW2t~ zT_{_aH^6Pf)1p!l4&&f(B#8LrV|nPF20XX*x-+9*+AD3Fb1eRS6v0aRoXal!gw@|@ z55PO(dWG*9v4)08>lJ^3drgv0}MPJd0{jobJy>-J?)^e9fo|mmEU7dA*T=tq%yvhbGzT33{3AD ze0Xv;L-XW&*QMi8YJ{dsp0=?7Xw+O@2VVXz+;XVsu@Y*kg_=w>8FP!Zk3af;_32w{ zRvBjUQ5gD)+qaAJs2}^-ILb%dIno+u4;$pZ3XMYBga-!&2_q){^HxDU1|a<;rqX+T z-u84i*k4<^EH0I+hygJc=ZSSh#bdGJYLmD`u{MTm*DG z=MWh6R?8FZUb@M6)~(nt0cx+$u;6b#wWia=3|(t_HX*$de-tV{j{Q*suI|H#f=<$H zPoqoKMU_&yv}m|C!@7uVrQsptd{XljOIhBb5TdyQv@Kea!1lhXTIx)w9`M20N+;-C zq|w04RCQ@i2dbexycjs={A1at!qaz-Gfu+tAIE=Nn$nYh69iw3CQD^FD5CVcOX9FJ zjp+{Q>u@RN)^6^)i7*kk!lGr?P=%Zeu<)cez5Is@*fH*-Hge{Ywok4kZK>y|wmlB7 zRY;tn9!F|d*u)+(`xOQauk+KCaPkZvo-@*zhl5U%mX3?hXQJjZ>%7x$I`ulVw19Gdjf2J@S*X6r2q-F^u*Oy_F_6 zE|CP&!#uVEoVy6sMpp^rH16`}2{X<2K^1Rw+o);J0(Tb+U5>_4p!E9CTF&m(OJ_2z zrI3!i0CbFmp1(-w`hz)2(J7Yg=wJ5>m^6qE=s#W}?jNk5a35@c6sLyu4BE&0wQjn# zc;pGRM)TQav3X49O7KO#UM(xkQsfp_kiIx5xtmns(+zc6ae!Kcj**;W`7RQTDQ@$=FF8qym#LanIb`GH*~!zzv4beir0K$QqQ5{ z-NDCpMB&Uq$9^}e!yU@gWz3;dM(PQlCJD6vz2hY|tvRsPDBV4O*M}a(Iv>}L`^AFa zvic92E^}k5sQ{dh{A`)}jP0Fa_B&i9y=o}0CItP{y3AChiWbEf$9*Mt+yBUn9a1|& zMU6M_7AZ7loN^5NB1;$72-F+N>uKT6tgu7O9aYy4qjvp`tw~}3R7FO}2!@>P0=Svz zsOInbZ_{p)mhMK-{H+!Y9SrkFPx2V~Ns<(8E>3Mt)zcbNg6n@OcIPDsQ9F7jF}A8* zJzW?}i$U{uX~|908u@ zSP1L!hHFb>P|bE*69w~gBJH*tc})M#F^#dZ6m#a-yU-Di4DL_OJg<fA<1ITwmf5#9c+KX+7+Nf^RO-M}d6`=NtjeehU7X$% zcDdRa$NHPZS3WrA#kYgGjpR;>-(eO$cR6IVCUwY}+pyAN7)Ma8^E@v$tk0${+URF6S9yV4BSXXN-e`_|@K`c1 z5Te5FPzc$4aP2ZmN6wj#oN7DDl7|JWQE>OcuMQ+2_dSb-R0CE3W6vpb9R|@XoaSw& zMDVCrw2}=1RQbS4&L2|+}`da15$ zrf^dF5BVjszv`gpSV~O-MY|oph1_QlR7g@{_ z)AZFOuoo#7RF_cvtDT8@bAbg8G<`@RPoGfPkbbCQfyoepyWWGTAqfKc>6 znQ-!!HxR2)9lktljw6B8Fc=SKVX8Raal%mGKfTk!-7klS^!_5JhNFbudlc0Ufro<|#5%AiAUnqLE2VfIc*_ z_nkg0T%d)UXRk0`mny3lJC zELAoA+oQ0S{3`wGKayehD@mED+;eFzta(3_&KHhfV~0&MQew(uFKp2ETy$H5n^M#D zUqYH$P+ok)azzRr!f;B{{%OY6A>8s^Rw(5uL|jKxFbd z9NFB-Yc*DMYo59!oSjZh+|0w}5C39Gb99}B^R~9{{KiDw+%yC($3&mm6f8_hIN7od z>lUTGyu6^6_~GQuJmv$GV#;gYvw1h{_DSOqxO%?rLlm_y8L6KtXsUpU_=}z)>HfTw zXX&N2q_JtD0!Jg`taePK6;E!Y!)+k@BkDyi^L*!5!ofhvdAqr-!2o(<20i!qruZ?^P+ z>OW_{Tba|rU9a*7(upDQ&rsFdD0pGa0uzNe>u~D$ar~aI>C=4~=^t%&7m3~SJadh9 z$oVZYxoOusql}YrGo2M^@-wPsAS9W59#o#w;Io7LjT9&;LlXAU8vLZ9 z$O?=}YfL9g+n}Q#QQN8VMbNLl7{RPh?mdfwp%P2#&4_JIynTxUZ>d1)#ZvRWW}WwQ z$K0aJHK#gVD{MCEtPOXTX~o~KZ*opds+&Cenjtal$yy;q3 zvH4_SwD=988bu<&zXlSAEf7z?L2j%ZO$VLf!0j#_^}9hvly+D#)X&byDLee)ow%_Z_9yx=~0AO z(`qKdNH(L_7K;X2EG(^ZK`8erkC1<%0W1GaqG81P|26}Cl1(XDu!O{0j}abluMH0` zjqH2bgz`MRyk_hO zBqv|fL0$my|7~8nFSc_zEr7LHxaRn=L@|v5L4})hs=oSkt>BT-)ifzC-Ty8`H>P;0 zoR;lG{q?-l*l*#}4k`&=J!gHXl^-k5AfJEhh0Q9DcGjB|n9P&P1S8=r>%&5;<;$Og zoKL<2>v$jZ_4U0#j`IOJdg+Z&1BY3WZZJRab-{Vr`pOIjm1X?8s(&vI7EeA~lpY*w|Bznl^UBQ~i{F`Od{xHH z6hc`_UmoKu7@Of(hq=&jI(omm$M458CPO+U>Xm0H4cU}Or>z&gwmJuXwQnxOU{yq)uKl?OfGhK8|zWi81dE$e$sVr=*ZY955?Ix?|k5@(&- zP~u(^HWAsE>Z8|pb71NgR1yPdrN>XThPl!v(v$cxHVn(pmr;Tx;8y+Nw3v~{2$HKf2kz2$ zjU-@~%6XG%*BRs0?dkQm!~an%M?B*D#sew=8nG=83?g@=CosI*@AA+Ypy}gSB|lKz zA%7`IYAVK{Y8W0e$BbRn?2<~oT#0m3) zYB#7b+TI0r^I^;`g4;Ta(-9C?9{FgbAP^XM)Tj2>m-#Z!m`OETd$mFA4|U$@E;mc~ z@Q{bAlgGv-imNFP{P|c5e~(L_doOrVnUssY?>ep$KsX-%6+4Apd!eN`X>_^((8?Fp zx4C%itOT;ulbW&RDnefJtZOy33-p=0AH@L362NSasyo&An7W3NvCYMh!^_vW+QyXa zWXjD`+zons#={m$`VReF=J%77%@D0u_m0&WBPd8_-z|^BRfr114h-aqiia4Fy=b3P zI8~?Z9FMBrU6^pzCLTG!;GL3rbUWnCY-XoE@j2J?fZ{FGqRVqya)$cel}N;T*tqE$ zfGCPeQpgRQTzRB&+PHSv)L5@sEmXRR+Vo>Ls7IRrJmhor zrl^XzDg!-zmnhzjhW*#kA?$`a8!inaP?wjkSa`Gm{_ll-P|FqQkAVKtRXLVM{cv2j z>IurcxIc4n%;wG=G9F$(P;yO-uPiPCjyEFckzM0o82z^KhCTI(BZ(GRQQEbcH8>g` zo=r3VKdRmWtg5Da+&-X$fP{1lC@9_CN=Pb7cXxMgKvD#xyCjwFZV>72?(R;%@qOOs z{r$h|67+Dn4`u^VQeq`o_7soS5;0gW{xFfjWq@jrQ1sOa>1RL+E5nv%b%8CM?snB`Su=!o#pn`mQ^{ zzU@ft0O|72t0A)&OQ(cKuHYIxS2XSzl^6P9`a>5=Z@y?!&UqZZH`-m;TWw4rn}(EA zgCD;pzc+Kan`zL}VDD!`$13k-SHXf+K3zb}vjfLL_5L>$zCX|VzC~Y0|H&RboH_>= z?Ze)2R z^VZy5XmfA6&){;J&))ce|I+0u0 z4r@=Z>8pEurO#$!{vAR4)Al|kd&CkcclY;=i5$1~5U+Ut_!qPBpA-TD0#}YZrXY!< zakD>Zb3R|0sj0Y_3HF?hj&A8}do&dMG%hM3!4=-HZ%e=2<}nFbjb7=P*H;~Gwwy-% zoz+ci`t4H`u~?gpKzu?n`S)k8HpsdOtl!^iUVC^2GvF8%*-N)MC$ucv?cwK-e}5&} zs9p^ZMbzAQWax}8>8`3_5RQ?1X)$tNy1&Sgx$V>AP*-YHT5erGv9q&_1ZDUhi+8TQ zpM=~uqAzPt@r{Z#%B_A*8&sC~@vC>KP+}d|pSw;@*BeP6*STU}{b>uD*r?X4@Ozf) z+?;wH;j&yr%w4K0RU{X)dtQ*UwCARrPit`p@xG3BAGhkXag8EmRQ_c{Kw++*rY4&s zcGFPP$0gtv`;z-gLaq}HQ)FnMF|g57LyS4zl7Lf>-Dz)Xd2OB2uhpRQl1}+2M>kDF zR2p8E^Zu=>i>QL!C$k(~ZLv`!_Sy6i)eJVf_xWCI9?d_)xH(=Pm+v=Qq&yr^I3xA0 zL-foBf^KRnvYWH%f#peE2R>2w^}p7SgmuIl$_Wm`QVulQmEjZOcN60y54cuCn7rgm zA~tBnMD<*^f2dXNqzii9NDBSAv-i@`dG2*>3B@=G1YGq0?n8g!*U~k6yWMdaNG9ZZ zV$cJMc& zW=aR*HKfVC6wxmcq28c+tsa;YDjLtgY2F_BxT|^Ay(m2SY;W=>Z^L}n)J3}nN)w6uHh`ecFP7SFy{9xpQZ6ht-53aD(g#3L;4>ts>5i z%(Z<$x*raj>1>q3XCP`?4WV*eLjSGw1 zZUf(_C~WaClJ3KWMt5QGtqUX&-6IMs>baey8E{`e{xg-KANT|I-1b6R<4^DL7Asu^ zTSsgvE7)`Sj=L8U&6-CX@{CawcSi7n;4%Eh$Zia!?SyL!re$a0 zfghX6R$d>TV<*vb;+QcoCt8-2K9(v(!1y?RcwwsT|mH|^*11vx{IsU z7JspH+pEza{F{ou*}JsbT6p1$qWN5|Co_+jV!U>?$t8~j86JN?{m(Z^vGciJM{vI8 zpPo%wa6ZFLGMRojttwS6LY>ST`Mx2D?^`fbB2R2C?at#18R}ayOPnS1mHf(`wKMuYo3z%#Yg4WoE`1Gb$KY%_1$zWtj_fLAm4V6pQqMsy11V!*gN<;a_216E5sLOS)x zc$QZWR8_w`5Kns1oLpS^4CsixJ&USa^r}z4IUbD*>-(eEGn^{mUbi=2AIEU$(e(aJ z-@v`@Y|$e=rD7G|_-OdMyHP~Ur1LI2x$)CP=xXE%!57|}t?ilwvi&bq-y0+LdRlH@FpS%Qi)wo-u$&{x1+IpCPmmT4R)QxgBbXG+pk7F@|{52%~8ouM>yA?ho=CtfC z^Ck4_jVr{h6>N?C@W{P#u^lEFKqYxvtWYTx*QDR6c@rAYZ2C{-jVG57AhBM ztOMiFO!Cxg*z?n(d;OFpURkXLd>ov)jtCD3?=>!;tiAo^4Q-7V)!`mI)#}=ZC+}=8 zOWa4f_*6fewq9f3;uT+CAJuERp?6e;F7|i#dKgs<2;dhIReJ7j2sgcd91`Q-DZY28 zM0|3Js#98qDV?HYNT^~#Pp^b04n-+)8afp=_ul>6x-J+fLnwpwCwK-J*APrQUDHks~ zP1mgo4`xMI5YgMR@VZWJWemLAQlGj0WZdPkG-pS-d5Y2XxNw%tX}3E85;MFQ{W)P6 zyM5aIIf+sI)?TBvl3a*^DcpshOgrN}e|__$_4NFimCTJdNB(3G)w3~|Z_z$1nsl?~ z+~{ldeYpX~=ZPH9Y>5*g6JxtKIr@B?f2NRDe^2c+_H@F{Mij2qZ>sMGz0lIC-6rRWwnsCS=)%$}M)CIr4HI{%x z)jcMVUQeWXH@$M-nZ{uL$A0k=WQfas2E`lAPsr(z|-L#Vd@bkcCuzC)Dk5|9iIT&a1uNs8JPacUvu!U=evqmG^!I+g}& zzISFtV%P~k2PYDB&M$s4XjB*^cub!h3Ze1+!ZRx)_tLh*)*j{4*r*j$L3`9TGlCLn z&4u92wH=bpqSC^!qu$Q!J)naS*Sm)EYtNnAZu$EF-(_Q{U=*OfM_SAU}SU z0`G;6Hk~pG9tn&}E#GhGZ}Q!*=2?thN{6lGE)ago;i;T1xvzdCLP$7$FHbi8QX!8% zNM?dEcL>?0k=eQ%UNjRuT=C^WmMI zrJVnbu`Lm&g-Hs#X{1|s>=qEK}m9 zf2qcqEKV&&_P={}n}oxG5hfg$!0jYZYV44DHPUgcuh3T9u~xW<^`PlJXD8oBJF#f0 zHtKvKky+{h&C6+o1$7VG-QgJ%6&g!pWIy6(d_?nvTrEbF5V~~Oug1wC!}c?GpT|f`5#dIgMzj3+I=U zYeJUpT|X9J5JUdGY-Md7_saD{;311a%iNdwCze zV)MB|MJa;j!)FJc0lvNKt$L+POA9Gi>w&J}vWX3)FqMz!&Ld4JNdW_QM!2Ktx~F*f zY}%S(vFoftja*(Q%pjdNSBOgOapmXT4CUrlZu>K4GI0stmrm^+Wsm(4Tve4qOx=Gl zkm=dRST^tFbuKeAtE+$oe8KxA&(Uc4CW~1p-#yTT0{`dQn9Ss^Gr50>hwIW6VLoV# zr&1{hG!WzbZqPh!_0O5C$*b4e)_B1+B=+|+KEb4F6Oh{U;>Y{_GV;VfUZ+;Y&Jtnx z;Xg+GjxWD)HwxM5mmPaUg9Tsu~V*(1m_K< zL57dC*9wY+9|yo%>KN*i7Q*}EYuwI>OyBwvT|SG(e8LSrGc!73rD|Ks-FWi!0D>AZ zqZlow=O!hKDH>I_(x%9flN*MxEbJKVjn|0LEg1r%I-T2mc|l{--kxG+T`0{?Cw`9_ z3)+uC%o?~C0?k_qJ9!^Rjk@%%Bdwtlr(IoxHNqu5_b-`3Ol_Oe(B}mex8i`4JIQyy zwhY@9@0^b}V;MDPHnSVHKT4%Gp46@!G66D6xBZ_<9<#Dk!oro$v|SeC7bp2AUBgs? zb13XaK?oY3itzldcf;KpN5`;hjqvvt8YmajKOQ>fl^mg4QAG60k@30^aL_{Ts7{*w z@^wjh5Z;dBYX!gYWXA@PM@UkG+BH|fh_8lCYzeKh8TioM_}*RV5C|7m>#ewdUc6%w zS2?&U)o;N`pjXtwYf3)%5itsOk55caT&O(U+*Bm`#cXkgR89Vikzr_C%Q}KQvl}rp zK}=MXUyyY4sRtvH2BY~Qy(I&5uQz7UvC*!~Y_Qp5s($C$Ah5>zBtlwD=AO6mF@t&) zo)RiLu7+op#81)i4z!nV1w&oh`IW6t$v3vQ=BMCjFYRR$dsbViG4wF9uiE}Z zR7F5Ez$1u=vG&$zleqPYdP@`bFjg&HkGHF}S%ZxoCHErN82zc`90?x;-Djudn{#Zo zwY`YRtSvVgrd%#F>~#TU9m8L;LT3iEA{pky64Z;7%LoCZBg`5<>VJXz({@$pJv+QA9i$b zhDu&EVIIGr(KaqhvAH>gSW&gWV{34|Tv^{%HEsGl3N|so>_S&D4?5xc{POWpXADHup@|$1%{wm{nvPA1E z5R*ryBkmB(cCe=S#^(J~o5$6pBLku6s$S9dCGw-<=W2?_PW}r9bYIMDk9(^~CFP`u z(=Ly;=Bt-YDtUrYBAkZ;F|1PMNw`nmTp@h2Qi*pPT(&|D+bicWsd%g~$&==FK7V%5 z7`XIn{Imw2G#rm15n4`xYtK+xpPX*im*vWr^9-OVle1o^V{4zW2y!RE)sBo6WZPIc z?<3g6Pt4`tWsk0}S!7GJl$4imuM}eBm@xh|m;d|v*^?UN=A=jE{{GWF-#r7ZsNuS% ztd4gq8Q9oZd036*Cj`=qTI3Bl7v$fgfYdCGJ3~V=w`(MZ1c+sIv`)k4v0348bV9^I zz3Zh|e`Xg3JgsXzH^|MT@#$%KE@Aq%Nv-p1GXE&FiyJP^(hhjY}l-_K6g@50Mc_z)m4aLkf4(LeobzuBWXD?zKyH zJVW`Y4*YAK5a<4s=1i8Ww8PF6oV=bsZ6GP%)cQ?jud0&$zNwnn-ZBaTo&#@@*w$^6 zw(vOT=YZxzg={<6>i#wy-Lme8`)AUo)BRs0DpfYTH{3TSptb<@Y})Y8L1D`SROaFi>Z;segzN02R$i?pxa1n! z&ehMSM%xeFt`bHWB@W7KY_HJWs*gT$|er|b=Yfdj&4R9 z*E4WeXV0{|z1%uYP$c>Lqk0;LY3Bm}uLXcc4fp0@zzg{-Lmj2=N?6appPh%zbjsPI z#H>*SS#B1k968{%ndq|IhJ>H%*Y%=GH1Rdq=W2~I9T`>*R9k6;u$ztLed}H49gAt3 zopl!sY$pU2D=FaZW;%$n)IL8!WJ@0?wHw}>M9eEaE)L^>+U#3u zu7pxVcMmrxNqm?#CugJj-Wpl?Gcq;jAdr#b_jl zo$Cqouq7M9_ySJucUMa`+?~`5hjER$Sz3&uN3|qJHE5rBQSB6sJg%BD+59jk%&3Nv z3WjjU(Z_#k^j)v8HH%7o5e^u+m)_FM0Z5=?a1icVnTHGLPqO-HzTRj0>ozlCi^tdC?%C**&+X>-4k zQdx@;e$b)rC(kW7FfahZ8s>yh>aKc5Ow9DszWR%BF^-2{oOmzy=oU?mI|j;gJ&*Sz z!ASC)e-Cy+K4oq`ZqM&L$&@ryWiC{)FNl_let0F*%X&^Nn^s@qxv7OLWDA>CHKik! zWr`b=Ih-qG0vUWWj@zH1(Jl%*y;4B*zZLfeyjmjLA6QOd!H)$-Urh%rCC`egYVBM;qWOTI3)0w60vRG3gvOp z{BFA``BhSZaO%iovN)gW+@u24cC4wY6)IRuhbl3P?wrY3A-QjxFZ?3b8@ED4o2lW7 zRJ7(#Ja;|ws^kOlG*GoQ%|YYim#n9uLE(zZuTBtQO2nw}zWeU&&#_L@-zSP7w|+mr zU3#%hRo=2Nr;P_0-bAocD&PijUidUJ#l>Y}6@tQFaVE{WiVoyyd+ObDycj%W1IJ_m zervxp!EJ}DrlyFB#hNVd6T3gyOkku@x2Wu9_C!J!Rwox zpx$I>dp|Tq`E(SeLa8^cUkPtxAfbP}upm2^;CAAiy@@Mcj=-H#=-n5bJnS2Nf8ZUHImm;?mVQhvf7;>397|PE_@;xJ;nP(j(31s zg7WfNU{3SO&DGUhBA>HW$`fqrAi$RZ5Z+t)B(Cx#eEE*_a8BXpI3m`}fK8Dh{6i!| z3aN4cQaGl2MbVlCizVlwCz*OfHly(yEB##wIb$l1s8#X;=Z7@x+x*Y?lRQU>47(|1Y;sCX9+B>RHfAAGKzvGw z&e-lVoi6>lsir~GFTQz~Wlc{o`33*)mmU>`n_(!?#vOY48EiA@Txz<^s>_610StVX z5EX|+cxJUdR@8U#LMc{E1uvHF8Ty%~&k{VgJZLo}0UwLyEWvnydBlww^zvJ5q zr_G=WZizr@6cr6^53phkcvIw35)&b}*K`{;KSO7sk?kW?zT1Y;r_NNFwo6B)`L$#{ zgq@2&0KfonfaG1Zv{FHp(ayx~1S)di>AUsPBx!ofiPpIoZN1(*;pai?;w$K2bB6pSoPdva03S*yry!`21s|CC^=0XH zTx08{J{w|z8VD?yj(MUwt0l_c!ZTXXqjKAHox0v_-@7|@j%qY|jX;IbDnQE^IP#Ov0zM!eSQS;g=?`pPo_EMXRBzP1w4Z3nRBDKleNHn#OFjh)oTV zjLEXSbq!q^j5AtGJuF8^7p1CkVdCrBtVUq1u49yAX$dNPJ>+xg|?Ao4_x>rl@NxKv_12oxD9?|iA;j7 zpL#hgT;iwmka(}cs!y;M`9UE-7d-rN(-^0|#At^*M}Be9A#hL2y9~f^*n?+R!Gi3o z#Zw3_wyrnY@GKW=M*(C+6kzfI)=h{CH+yMy_4K^K6*~3Jl}R|UD3b@-P#8j2-umTO z$-I?MwG@e0r>2RwrfUh=c^{pij_b5~?xTLtjCZG?yB0a+Ou1PZNuXN$^&^c&$sml3 z%egui3u9%M^=rMrcSVCTu#u|hk>!#|f}xBbmm9Y8uEF<~jfB-7ZaSwwY!<`YgpE9O z>d)-PZ)hveJ>>Rl^1!a(+M|PT>0HkzEyKZ=eSqJD0RRb$H#g_IoG{)1U3v{hWi!@< z$AD|8An0{>#VU1BaRqO=xOmtdGJD_JqbHO%~e-Ub)Yd zV|g+vP$Xwv3{NQ+Y4`+6TvvL=8rm+MF%-;r!R1!>`>C{unfyT@;7dnPX`>XR=B-zP z8UqAL!XA?Z_zbtfKhI8;2lb5+iHSc^P*6_JFE7d4*6p5*U4E6gSlb;4yr&-D3FZ8u zSj+J0<07$$hz>yjHypo!Z9a1I7wIJi3Ku5k=!ahk3b9 z9`CAfZ+2n@qz$T18m#+nGwmhu8Y?DbLg+6kufK{=Q7;b^3LV}14qg&)TD~Fv6`$A0zy+??JO807ikLwzSNeR&!+2hB}aF%GkO9^<&r(Ra?2##jfFmU zv*BeLZZ_TJxpU>ft|pcbFpY?L{at4I%l$h`-!c|w(S7SOL+Rn4|dr(DG*2mi`(u`QP}a=i}#J1CA7;O zJKF56Y;R8PMF2bxZ&6->iuHpcPWOsv$EL8#S#@aTWhgzWaWT<&R|D72ka7**uQebl zym+mr(eP-Ql2vDB?A_6sjhGo!gk_G=MR~G}U2^k<^r9~9;w<@Sd9#S536pQ&#q?-* zxm%1ehx$}3SkA>Z;@GqQHe z=!M{gk2PNG#O!bOeRwx3GhFop=jo{QM$g%Z*Qm7H%l`Z7+PR!|WtoV4NcqtZm5Z() zAG-`CD7)FB3@6qjJ4bJGexTsa(;1XCm~mjf6N}qqR5L$&l4mC1Dj$=}IaN@6A@Xh7 zfKdxE^?k*cVlL09q+3bA01kfnSeL6@IH>VU#i11M7qg9$(hH-Q@=LoGx}CrklPmX8 zd1A%JH_FWKg%AlT$!`J{<+ill=#e)gsEM^bn5%6CE6-FKjByCh z)yj=R85tQ5$oAgYe^_YGk*>Z;>+!FO1@nh{q9%okpVrp6q!aZF@N~-JqOnCEn!?u2 zW#)*8y}mSP_DAtS!#}wM9@|uWziwX|L_g^qrUz@E1@~${z74Y`S`HCg{+%}@S_~yv z=mg)Vf{4e64mI#+Ka=L|z(H!>hftsLu~g2@@7rVqFi^;UbaCPIiq?#E*4j48-*ckC znpIr{S;WGkuWzlR<3Xg-cV-gRa*Gky7MA`gGkbK~LJpFXTL1u(Fg;|-p?4>Y^W zZ;)6_hJ^bwK_d23TOf0hN#e9je)Q-Ok9g(>#bJv`*Kx9?jpe4R#!H&XgRx2)##D^1 z;Wzcr_-nm(Qrsu#MW;P^?TM9U&8#~mX6I^#M1^h{{c4y2fo!_BK|cDaDBhKXW49Mp zH#f6bAEAx0y>aWu3&a9={ABoX17ux22x%!puk3$ukI1%=x#iO#e|zkuQET+*?Oe^5 ztEs%L+v?&;3>4EROn+#}b6xD>mWQeAU0JC=QyA{W54(7c>E{1xCF|?ug27UFyY5cE z$gh5pAT2ZcC}mpL1K;T*J!v(twOCI>qik3vQ4$U1e2>Gb?S%5b=B+bH$T&PUf4@Oi zu;ghnAAeLuDDu4n^)uEi zXZM8+NQjjJ_gLqX@#@$DE=s0&rAqNAiJgI9mr(t4W|Wv;OH?cNrO+(~0k6{zYW87Y zF&;b#;x&R9Gg@YzN^Qp+qxmfdmA-Ys2j6M8%J1*pETfZAggiAa+{=)w^;kn>VtqBw zJ{+=FvNj`mPkk9jR(RE-o%D)6=yYnVp-b>--BLxx6o5A^^C9jgu3iE(5cwHwgKl zRS^%IfqO3uze*A6;wxIFzc+QF|U&RYo%u#Zu&%z|LsiB&jORmj{RufE4~%*UwN7={yim-?%R?}Ytj zyUL=bV~KYD&$;_qRCICYy6+O7=@_^hxDU6SSOh0hi^EFSl|Vz3+zz<1;1c868!Dm zmuJCmSNHe#-@om(sMLEuh-WfQk8@8myV=M8XV;>p`+BO}o-S2OwY=Od|Ml_*jPFPi zi}(6#e6lY>JzNQWN7}N~3NM~RunghnTYuTGmmpmZ&&|!POw>nsxY(LJmI-qWAG!cE zvpax9;KRki$ucrF)<)8KT~A3chfA`D*dDb0%v7qk;(qfraXXt&9A7%1Wp-{*C zxcyNBK_cY{w(BZ!(wuDSmpf;_z9Gu;u`0KR%W$>Zb0`~V4Lc5vB|^c3L|Y+kT$=ZKhr|imzYt&@`Ga4h|CcQR=7p=pV2HcguUq z2!I6!;{YMxAlW!NGF(o9wa8z9kb&$kT0#$n0Ql~UmoG(rd;;n2!ucOmty2~U&4+&C z-P_%abSCI6m zmgM@K+rymy^**md$Haa;-&-M%F$zIJbRR{tbhUG}Ar`9|n`>Hjf1YOE$bq=;YBE6L zK;9nkbQe^TH`@n1CC&i|#KsE^oRH{T*ZVFX6j-y;HnWptT zNKrnOKY`rywC`*a`}le@t(VJc?$t{_4FIQlf=i!eHbX{P76P|4U3MKi+FqUp^=*OTVmwbteQOSr`PhV3M;kEMp@Z1 zKeU>kdI^;qyAg`#_n8Y0Ntaz4OqDL1nhM>Rog-pVbUc4{Qnm(>oNL9jZ+jRh8GIsT zcNmMt258QW+Zw3|MICP`>i{)l#6VrlHKxyUDdD|HP1W)22<_f3_NIxfhf89hmRRQ2 zV@C{G6aGHmG4-QSgp zVaRt6nCnF9U^HaEhgN^t!C_#452hq7CS`3Fr9SQJZR7p8l|MNGLh{+l%2{ph?^rs- zwVHlm(ht$C4Ddxtzz3U`q%||qd^GfZ`@6HTm!=;t%GUog^)7CITf?1VTHlpk2h(iT zZNMjIakU~cQQ`nqFllqYQ$^hqL(D1We|IMg7eauLs?GluZ#)8N&v9r zRo<0FP|)4Ije^YEE3Q`AdSw*Taa4sLX#6WK#xg&g_m^e)&Tcb$y@R=(T~KR1uctmW zQaag-4H|;PGD8Qu!+a+c>d&j>Zo~3@H2g~@HnTSJ^ud{XfSN_tjfy)o#;d1-qG~T+%S-cjOcvj0GwSB=NPsy)dYQsTu`kCeaPx1nk z@hVdBton_vTQ;l06CI_sHxC#e$mO*NW(xYZE)LOFRS@iwdG4s*eQhX7ld#amIeU7B zg+$U2?_@Z$lc&m?!ZYC`i3WItjkIx4FD?joEMGqhj-Q*;NClX?aiH;wj*ZP>BML== z`(!d>Tka1Mv*08!NIUM6HjlSHe7zY475Ri@s)hYwy-2hgtw`!Cd2bY!KLm1S-c*w& z;WTfg$%= z)!p89zh-cg^{#gw5AgrtOxW;iZyBCU!hL6nDKIKB^62VVpWpT5G0b8Z);lmtGtUgt9^~kB^W-_4(6cDH0kmQ&Fs{H zBFrP?l}J`h+x-g8jMT-g`X@-TmfANT_tjFV|1Ol45Cnsgm)qx2Gfo0DF2H6SQ`Ytz@9XO7 z+Dx);!pi?d`v9JiXaF3i3gCmhJzMgpw9X7Y4rsiNHqsD{osBe?@}TztqgIR=9_liKpm#z+_Szf4*Sh>>yO?t97t;Xl-EhXRnx(z*P$~zyNfo_$Z+O9z1s1f zn3X&SjsPNdMWQ30YZMHpSen(*%o=pH+qB#|z4mw`EG!(Hi3%8QttRwz-geVJyE~N9 z+b`bSR)q`L?QM-*Xd=1<(J6{@SR>9Fb0v5^6s;&VGZk6L{APap-S-~gwq@zP;X}no z(=bn>b>mwA57r$oWL?DnDO^Yd$Y%Hxs!Kpt3YGO1pVrntO$Z-33h0gW`(*zscd@`y zfi2G|YNZl=SJ|;`O_eU`Q=wLVciJv_?5wP}iUYzb`h5e~aw5iWK0C`-AC|4v7l{ zl*p%sLToCCuw0jY(OAQT_1!9((@wdUasehRdD-;6ybTk&x@K?ts~sUWKYEj?iuE|W zkm>gh5CMz;S%fUGU1OsxmhC539wftpmi(k0tb8INqOtdQC`1UVz9d>no-)yt3#84J zx&5WV?QWOXZ?nY2@jMl$1uyV)}>Kc&6hCC>-lcwtYY1 zK6zd8RKz-I{aC(}bEynxZ~ElHkYN`nD&8Cwd-04Tws-vwD8G_m(SM|`7XU=NhXg&B zsJBcIrlCWQ8`-;hJQ6~wmi0aH?~3qrw)(w%JD4lJHdFEtZ~3OUGTg}P`LLUj`7)IE zu1oXu50psiV%I!ZN&;o{erIe&)U*=68Oz7O;eyLse31h0qZ2)C5sUm7zH!=O;k?;y z@7dwfF$rd%a*j^xoU7?jPxHFkN`RkV1vc{I7)#EiF$31^GdE8KJG&F|SDwqK&Fm?x zhidr<@WWj&9Zup&Gy4@mhTRZDj|cJ;iPZ7LU&l2bOgOTA{c2F*m%WbJ%7X;+=r53;Jzl1CNmXVLb*L*CX ze&a^jEA=ETb4+kphOnrDlA?9ewrcbLZ=a)=zfGHZ!Lyycj}3d!257<(+P^ib(0@gM zf6V#Wv`E|-|5ND<&;Udxq!yz_Wg2IXY|NOECx$<*sUNYXsM}O%B0Hl(%jFf(9 zKl{g8`Ut%I%QU!~P53m!8Tzllu)#B~M;(rYYsIy~dt~Fk;zZGm2E0byG$C_^VR!5Q zJ1@p!`sO$PcM=>bNk8I9HQ?~gwyBT?6ooe(#mSR1|4*E_0m+r~@7rH(e&A=jdvZ68 z<#qa}3u82+_}{X5a4qku*|xJUjfZmnRRmU>S8YAx|F`La6_TEq{%b>A?|bfS!DmyT&`47UyLksa{oCTWxbd~0|y2A&#UO> zHiP?d?AVc*{(m~t;;1gBaVj`w*)0zEmu1*2hL>$Cm;(`ZO{gQl^$p6GG)nsAhm^{h%G z8i(4yO@^5Azc*oO!??&(I(FCpze|YTs2gsE+x$O4;|bntTQUYj*x$Z5?9>HHl{9kx zq2=N9{Gs`y#B@UceLPp59I@qP;`l$m;sO03RLk!)GHOq$zqZVtqz@x~M@ieJe>*H_n`_hz ztpEMz&Fj30KkDouMHX`ZZ*h2Jx0`O#0Gd2F1OmsL;EPC*0?6dwmTe&Hq(V_Czl$IFM4l*})`K2$a@to>*F2W1kruJgf^0l&FJ1{yj&j3V)XGvjssx!9^rQ z#9si#T!1#WVAWzl6QIesQ_6xKBCV1;d73l zu2p{!UM)VdN#C+BwomcGcuv|9`F%eexM9aLGBUcsSMy^8gvQOh_)oO^cmxD4CE%30 zfn)~i!9Ye1`tj+QI>X<^0svGRR5?jnSkS8qIOEN>r%0H&)NbG1-K_vYV?}OLG8?L}tOR>nyDVkI zTryDGYyh1BQB-%9uBuWLFf#HuA3({#L&ix2OM_oh5-Oq@)m&-0_twZPW;Rpwrfn$n8?=BX!`~bGp7&vJ0+U+~yb5T&WmzR9-wL#wwRU%R-OHk-5G_yA|BlNK z#ikEY$DbS1l#Y9sTRMV3CK_(i&yQew)d;K>Q$awZC0=1Ud-2Sh4RH2@<9Y0j9(!Z0 z8~CaJwSfRxs3f@Hl7ON7PDu%m!tdMco1|~hsiR1$7LQmP2KjUBdzY+~w2;ohNv^@s zQF|6Gji}PBK2nuxD@{j$+@)q@lq=V1g_i}hQx33Al_>HV(G+O@a#@o46M-?yEIB15 zQ<_=5*s{Wfe_;k-tpD<_zkJ8ZHmw7R{TB`ZKs`1-UP%MPhvgysCaz0Ak$4K3k3AtC zuH3jO>Q6+oUBOZFiWm94)KhF&0lanM&`CFq8MvZA1Tt*G{x)|Mt5QuC2sbjGg>*jZ z9R+(z8ZN-wWe(1#)@~hz$MxjJbcybx-TnQ>pWnICi;EAZf!QJm$lS%}8eG}h^h)0X zh%9pXGzk_S9-i&iPzDs#=zb{{a*ObxgxAHz&UfS@oRagBMo} zj@LxUnv9h^CujcK8EG4m;-Y=k@6>67&B@8heFF(>U7w1z1lDV8SJA{XBQQmShD}}o z6g}HmzOp=z@c_w31%+oIf*VkLp3?h8b^=(ix=(>kWTe&}+FTnN8qx-e0?smi*;<=vXXI;2N^lDmQux+#(d9kjDUM&;1NlBXO%jl8aGK z0DFSP4^vbRU!H1n*Y}0RP3%_yHK2)+l8BC|J&;Xg|FC=R)(<$*911_qIKACUxWrh+ zOg)PM{~useDQb$);tkibIMG7!5zIpCtrX40pWyg z$L%!!hGB{V-1v`2%sD21XvC=Vb3bpdfuYwlgi00mfQ*7N5)cp&IW+YC z8392a$Os0&pYO!Q5#LElJ|7+)UIVTEf`=zzZ?<}HV`si?FmZ>qQ7lqo^i;F*GNgEsH zC+O(ZfEV{tDm&67^=$;W>8+Y)qd`Z7ZiY4OniwTJ@+Q_E?r*acvZa;{?;ehU?cnua ze=UMLL@($a3!9L75ouY%g|CFLqy!QYJW}Lx2>}QcQFxt|o$oOcQkV67T?`;$f4jT$ zC~J_l6!m&Yq&HKGnXfR7vi+oy+!bJ@zr9)++7VoA zma}qqbu}ak6^CDnQTFiQ2R2qo2Kn~+`TKnN0F3gd1w_ItlYK8^%j<*J*PKq)>IWr- zwB;40;f$*?w~x=k+M_#=Kj41_+GLSnap`OYF)$ParKhKlTDy%`<9ruKdUAO&&$1t+ zXJ$My>YsLpXx9#>0nhx?cX1V_qGXZRbbG)DIyX36tzlXRCyv)~=Y?E6b1SILoloYp zoWTLWlMtXGO!x~>2VywyziNQL`cz_5RnJToF*F zEH5r5Hcr4{hQp{?_gC#l#l;l|^9Exdkc`ZMb<@*C4)ern>%|8nAcLxfeT$F3%6cIZ zplhc5LjgfN6DSejp${KE*x1>M7>F0icPS>FH1XTT3N^R}-R92E5XAX`fpKuLtIMG3 z>X(s`af4hA%46R#u#OlnL%ntGmiLKvZGD}Biwhr!j({2Zc-@qHb5r|WgHyuv<*IX@ zZa>oDlG;(2)mzypc%lB3J%f{@#KXO{Pr&b6M=1Q>)h!ev<`M^wa^QYhT3&_&*<&@e zwHaUmSt|P(Z43%9vWbFy81P^XtG2UUWTt3EnH?)alcnS7!5?ML7}1kX=&sj zuFDuU`RjCqdxTg6Ql!GuJGnvZ4T?0G07h2rZGOl8GxITp9}Zps#Fh_+8!~TC7-n1N zH@HG#OTMz}`k^=G8vz%{g-|7fU&zV_3tbR}IfeuUnJ_#H7NmWN^%w>gBS0U5S5{UA zO#-x+CJu-umfkZuz6wA5>P*!2+27=k3*K5iaY$y?_0_w-Ip+bpLyK@G%tn3j4A@7F!Z*}7Cf>dfh}XKK$Xo6 ztbo61zCEZXVwHV3gz5D6en|y)(In{UN??LeE|+`z|1tL6(OAcA+&3~p$j(S4WG8!X zB}5@BRI;;I)=ya>D`Zn7*?VP^z4zWx*?W)o@;vYJ*Za?Vj&mv}>ab2HreI)j4 zMA!qfJWi6AV-H}^Yt_@XfY`8^qA|B7(I93xX{v^cO8?V3ZwohuYg82=tot?iR zzhQltfybb^sVTg_|H-%S-x)YLyMM3b)vg;Ea?2YvI*bpl(+Vpu_Y?SUh|NtZDi;0i z{nfT@t7-L=*7q5mUCE-|(Y|%fkv#M{VTp;sz(@c9Mgh*27ASg20R|UYMiy*-7uAeb z8DTXkmg9+5phdQ!MWM(2(xQ3L*_a!VUVbAsmK+R{@&6zW7_TmiQ(T&rlis`D#lYu% zyxZC86cRb*V;xFdX{ zna!iqL%?I*Bj6K!YzUi0FO)4I=rR2<3vRBioHzso&G6gxmcG$-0VdDa$Hx*opQ_FT zB4x@b*tNKyGlYLADk_>d-)tnbFSVYTzQ@e$Z$Ri6`VIqo9*9p=7~ZXtA3q)>gMb*c z4GznLS7DpO$CC_FAZWR%f}j7>6}m>nYkHcDn;VDtk|+0+?e6TzfX17B%cngWkXVz4#l`u4dN~Y zxM>KkodKb!>-opM@UXX~`g-P~UfYoA4&Pgng>;w&ABMS1;Q30!=<6_uD|A+9B0lF0 z%p`JS!jD8By-7_yaRjSEWf@XUD}e;ns&wK&$qxOx8>P7M7V7pI=bD=E+Z$Vpv*j{} zhEK%zNGB_b{EzexTx&J%2FFYbbY@(f+J&<8;SUVW%>z?X7%m%!>l75uPqK!RazaN8 z8P}f2m80j)XL+&-5Q`4l5pDisa5*`Ygb6W_n~JELn*QjWoILGtl_OkuJf-|tP5mbQ z?_lY#t^D`ywSn>E2CUODpRm&lpKbU(h5XgBqoNMrfm6#i(()(SRTEfD@VzS)!Hnt>|*FMZ&b%69c zN?ubU2!Mo;(kvhHh&G?gAV&|vZ_twjU;J!!Rj@2Ted$-HAR>|++B4*hd~i$SGktY2 ze(arQ=h7R&&BCEc5fS$L(@3@3eP~#!5!k9!XkY!gA{Fl_>WljQ zP=2OGnCO!u;%pum80a+et8LM43`{JT5T)dbYFb)a!hl(9wr9tVC_yE!t`C)1lOIqS z+!-I>2!+(LFRCoLBfs9leQA`aGU5uS%V1vZxvL&i1SXmbl6mj_5hEL&BE}&KOG`(` z^Ck_=q;>s!%nu(w{sN;$yV@L{Qy$iM|KQ-D7_6-|$etCic0Ved?&x@=sjqKky1v$h zgZsQO_TryqPznztzWI7@aEh0Yz^9L-n1Rc}>F0XJgRSdtPE9^iGZDKM`)rS4Y$cJ@ zTJr@wA}FUv!au@K!msi?J9f{}ocP$XQ2j|UZHA3B&{Yl|D@~@YO=%=Kh4;lU@g3M! zKl*O>HQpdd|% zB@|eYgno@Ys7Zhlzq7V~LgcDp%k9BXd%uH!Ge~I~Va3tks~S(fi>vyRZDNBHK-1QC zOB)p+oVeb)wa{_|k_*jbLED!Mr~|NzUV*?``84$h4<8=AnEL5x04*&p%zo4f`}C>s zG$+kM7OGu->*Lg>&y?v2iG>-Rdz z*RtcNv@|t8C&$MAgI7o`h7v=On(fWxPEZ$EJ5W4+k*nfA5SkQCX0{jAy>Scy3#|}6 zq@=+bmGb%3)Y(=God&QY_Yq}fW#4*3NvMdowih2oGB(Tn9k|(`kLGgo1jjZyWlQJl z5Oa?HvrJW1?~aa+$0M?>#zjGBP`RU_jCjVL`bzf=Oi$m0u1Y!$4G-g)<&+f8JsVa{ zdybm|Rx}Vzi@NolNhMaP)DZHzMj-0GRZ&@)wiqInr6B3ohZX7Oo#cGg=&{@oB2n?y z02c?x%i9}ce|;)wqxM1{e(S2=@RyoYSq7mek4~UK{)cH{v2p}Y{S#Z1B1E*&Gc#jr z4iDptQBGNMu!kgcMc`>utS?A8StSlU)-9b6;#AU4e$ zrumoV{z)7W(qzH|v&dZVD!X^3eZeX zZ{B#1tM^^|3{e|FOSv1VkbPbDtyRI%)2K2f^l`+gG@Dh1L% zv)Df|t0ZVS%>N3AMeV0DY-kp%v!4CKz?xZx<>(1@A!|%bj5_9HzI*rPFzO&d2*?tj zZkLt3*Su7ra3T!1`~&nbp6dGbddyitSYWx3satoMk-Q0)BqypLRgN70OD9AKX@!l< zc&Q-V8a+odUVf(C3}i+@ITyI6s9#?hJcm_Le^lp&)!6i=GmC;ye$T||ENuO-Sv8HG zqc-tSC*u!ta&l@DgdHc|^dmH-bx4fcgTzI>jlR^Dwqw@Ir#%mXzI!l-umGT< zATdarT1`*(JT8VBGxPUvqg4Go=EpZBn5Mhp*$}kyq2_@RpFP#m1L_q0ldEc>4)mxG z?kmxZh!nDIcTUvr-&1u!FV@uFzWh>22|v7J@izo78!6V^va>cu>|TU13k_!79TU#K zc4IJ$`3N@FLkK|AE_mtN*W4^0BJ5uL>*dzsLQ7~1`iIv%u?0M_?3$d>$xsuGFRra2 zXOO0u!vwan-L-+iwJgu?Rncc%hk0>9S9G`jlt0tp#-0?NoLU6k5w|%nmEFoP$E%ZzrbWcmEufjG$3Yoa|5g8`k3A(s6tn=ApFt z6dkQ_3GTw`YMZr6Y%O@K5Yc#FKCH`IB)t2(d)lZv=_}}d%~~^M3bfp{Q~T6?tw9SM zvbVn_J53zE47wJRNx?~BwjEp{2v~>6=Dd>)Z?)dxyE$lRc z&Kca;eqDvd%p2}C)_Ex3m%nsu`#(rzfyc6$FxH_@hr$D!cnNLzD zFg!e5)*MQgYy$|U4_u0o@Hiv>4WzTZ6`dB?^$3HN!Fz7;<0Jk?FXdOh)vUalz&k$b z&HZtDGO=^8-Y@?p?~h1$X(P&LUDB{J6^iW<(3pUy+&;y^7J% z(Qh|}>}0<}1@A-TtDpA_mKO_v7db!nhYbwGX6hC1SxM-Kd1sR@?7PJ?tubLq3Q9_@6&4o$G=+nqzrCHctg0#@GBPp@(jGspAh4$04%V-;v1P4}FOT*3 zIMx~sxPy8%#MC+a7V3k;gx!RDEwOK;X`^r4}MQp z*c(B)_^l$<`#WBA_)J90&qI2&M|@Pu*-A`78Z4v*96H4x)?h4;EKK<+O@dOQ4@_4I zyZ0BXK^`hD)fz2>6FcKw6*m^Y%lASoBWhq;ypl(!@<|3GT!4(v^7QY#q^6Foy=w2| zeACrYz*|mcWvnH^cJ@4UhD!YpVff5luoX~yGs;5wYj}LUS-;s@&O*27#}76)r^dct8n@%{T(k^ zc>`Co3um-QUX8^r9eUS8`~C!8=HP>CN{*Hym$TvM>5U%36hnT?QSMUMl?#ap35X@y zEoSC)fDcUy>*^!{seAzepSo&u9otAi6>t(FTw3{(g`Q`w3oxS610@PLou#<#{I4T+ za<<;Ct}bZG$|TdC&|>9d?{&rwW8K8?BT%NX2}hGDN%n_t7fcPAl}Dv-CU)WAEqv#o zjfshA!Fo|pSV(+1H4#ZlOr*Wd$43T}r2yZMS65OV!tqVAy!iL~^~RkD^v-r-I`2j! z>6RsijdQux+E|vSpI^237e8f<@+`BNYX|_J%tB>Fg_`rmG)(Ys;Uf+(;`X9Od_2u* zAkMU0j}v8hw7qD^O=%e*+mOZ*sGt_1*N(a}XxzzV*l(_{ZS1G41ib z%}C`G&wQq9V4&zS3bGmS{zAw-_xARdxq7~ux<`;M5q+a(u;n57{R-^2C8mNEd>I0< zYmA?cc4AvD=5+(oD=LmWp$G?HXzVp=>b#w=u(VX1kvxd&*~RF@gu>|fIC5?X$HI6+ z!^;qnlb9D>-6~8azO)(OK0hXKh`1T8ohD)Vw`*qPoOT<+maB|8g3$2fER0srz7R2;FI*#joV1bj=~t19nBef>B!tJw57 zov*X9cPFB3{*@WWMJ#<2G7B2MNZ2$d`lYFsQH_f0|1;Z*L)6N91IERTt*W4nWY2o4tM= zbv7)}kwc$A8`Bx!aoAZoRsOL`+c9xcwPW(@d zsvF0KuMl`}#H3foK54I6>WrYhQo^-tDm!r|EiElh@8drI_b;WE^5F><>^~xDbk^H- z&ct=OWeDcZ1LymS;}h@Sev3dkl?)YyV(z%WXO^v-1?SskNREwF{&S3Q6rbOa4qE5t zW&XeC%HV}|+`S9m;PUo@R_oEG+sT>dY=4|bu~y>n67WzW zC@5%%ry7R{91Duxc^(JuiWs65?ba<)3Btr>*N(D;J3sxiu!q{l%+{Kg7xxIC5xUgk zqs6SMSlCZzWxbN=!S!{1`SNUJ`N(m*Q`{4AhTA}{) zhA44FVyR=Wjs1=GqA@5UNl~h#dw8f3DnX7{k1OB^seaRn2&lzbY*S)($^ zP|$dYKD!$=V%gDAR%K9A`dK5-Vy4Yv&0T(7+mxHC!usag{xb@uqEXkb+^D*vSt?l# z4tIp+V1aDd@(WDIu(o(%Ha76!0Ui*mH;~=qE81rNI8ya5Wb-t1TI4+~va^yl$`)UF zIpX4w2FiNGSUL%yxc@phN8vV=s7boWj8FIO?0j9kc+>lD*U5~+`)ePX=c}3$i~Cz6 zw^3iBL<^oVDmY=GzADsVB#m;>p|oyPIB}(FN~L1xT=5wnY7yf2TfSE~miiWU({F^Z zD^LEE_X_GbB+1QlHU^Um&2XUS`mjPRtuC`kW3%zybY7wMr)(W1HrES(fwv1EW#iyr z**ofh)oK6k2%o7a-9J5@4)y7HStCIzuXYW!dQ5nb=Ic{Moe-76@>8ZC4#o{Xd+Vm5 z3W@5@;Zpx67?TgsTpi84$4DfIHINzd8sVF0M)scDHls#o`f%X z+)ymb;$HG*$G8ZP_Iw&zS}8Ts%b<8!1qElVDwnPFuo{-T1Ja&i6`s@WKTFN0uVhht z2nfTdzkTPVvrmJ3r4n_Gz@xP3UbpP$Srk4%-31B6zSEw@x zoqE2dLj2^ht6DLU$V{jK$jS)-gq4Vm&8A)?(_Ly| zerhicQn|fYez&iU3b)bkx!O4Yy#3!dQE^3MFUntHBaUJ-3EDMFuW zpE6+@((K7BW#hTRU-;UbB(hL>1PkPyPrY-KV!ZOLu{#^jw2Z zV(xf*yE=q`U?yCLX7y^F4Mry>x|Ec$G1Jl6!3+@dI704++(O8?Xh28^)1RJXW`)q3 zcR*V48{T+X7ECdzEXVmF*h76>*_krkt_(nBD{ZcoiSLG58?Xr?Y-8W7Zk}uVHdDc=dUeMp= z;$ns}>=HU*ymv3$$k>=TN>QWf3<1z_etliv5WSdrm*IoXN&gAmGq)4^mjzmm+rJ-f z1F~tiIV;tG8m>0Tg<&7u`S61Mp!o=g;S~|^q9fqG4hKLrVs_T>Q(~fWVNp>VWU%Aw z85(+=6@4!-BPhqZa^(l$^bapvb5I}glf*Dy(b-3L+1q=}jMVkl*V7-snz&3F2d0sX z`<wRmJ^-d$?r4cjU**en6s|WeKnMpjsbQm0IC4w6wDVcoiQZUuKP-FmY0~)C_lO) zMb{`cU4npPH2OMZew~EGn}AkW5_SzEu@ob5eRnqjsK~+|Fmm(pHNo7#PCS{5rR%&<$nsKG`DkTXi>973KQopDuGFgV}phkgjMbCYmm*oK)z>ptg8T6`M$?zyR zWkD2R2%G)s)2GGeL%0wj@(Y2N7#0_Yn~A1!=PLW~<#e$z@SqHpKhM#W0j&7T7ZflJ zIQaO*j|>ZzMw(5oeMqdXVxSXuH@!`Y3o0f*=+PD+jN%a1=XEkNU)VSxUqGQ|7Z-g2 z^qTmvx|))Wc2DdZwcp3n(?>bm+m=kq2`-Pmsv7oxd#HufzGzhB&o8Gxal=^BBp|@% zx0-APlT+glwN%_PXcTX+&&!35;!%hW`}=kO1(nSU$XJDE^ef-lQEc{Fj6i9Uo#EWU z4AS!~YlxEDP%?At$lh9PGamgx6+z@k8N$hpj1|6q345BW<}f9n{dQ`}&BGGX2V9u_ zdv$rpc5(6W)9*@me{Z>rmcEG>JP7?ZaZL^z6^^n(wZbhh$6KrN+}3o1)1CTw2n|K| zl+=;3?#a(TeP6aVWMzt5FIdc#D;hI%8PRrggPQusf64&5VhjD%;qkF}aejWUy^AQg zw259-3*#|Kzo-QgzG!`>mJkSgD5SiQF5}vrIU7M68yhbrCYf5#vrzzQ|6&I(#kenEowW%@@P#EMg_K#(IW`PVo~DA7U^r&;S!&;x;$qUYv@`@F-&M1QpnGRK z&{H2&U|}79vLNn$9s~Tvm~Dj~NE})h?TlW(roVk#h9msJE-0Juq36be*p*-!p--RM zjJ~koLaxBDLPJBdbk>w2;Xl7Q;xA@-Lj)_683RN9p*N2J|G6|Ma!li>4mOozWfZEfM!&}tuemT)us!=0oX-+`0VAl|S;j#jC5U39x%$7H4lm zi$cS~R^98O`agEm>fVKgJO&C13g8)QXl}*=Tf}nXqFvTGKOY~acfA*k_GoW!cVAiT zLX4d)TPEKgSS48Vn-7`-n^xb{bOUft?tAy%1qI=Wii)-ZoOvtXV&Dt)TgR_$B@hE;XN1?LiMFc_4|{O*9BU9f$SOTxEbm?cZy+V4ZN8IzE8$- z3Hn4J$!J&!1>ai=K!bdfo||W51L-X#Rn9%_i}P|p22L9{DJUsT%aIFlBc2=jRW4|{ zy1L}iJ#>!<|1{H+tB$uWdRHQjE1xxitcHXB{^>d2#9!K(lnHgXKj%j!DVuyqniI=KlSAW_Cn|US`h5 ze8mbbp^a48){tW-Xh|CP=}Iy*zTKj-$d!p zwu`7~2^Envn0GGg7}!>=Mm!EH(~lzVEXrz^QQo+qH+h^lB9oz>^6lFd_?^PqjNq!e zrXOg3Ds;v6z@YRzy^2q8@LHa)SC+1L zUA;!ez2t~Pxl_wzD2el~&(x>h@bF8i8mSyoFt*z4r)jD*$J%o6+90oG!=!-?dHh`t zo(=Cg+K-{@NgB#hnjRy5z!D2U08ngvJT=^LYmm8hzub~vP>+*E{wz-N7LjOITid_& z-@mU^>l@t3oK66)ri8whgV^#Lusq3sfm@N zi6@>M3hTL{vlAcWf{(xU4YG3v1u`UwdyIo&R7Hb43Jd|N9>=={8HFiPQJ1nN=qY3! z9C%qGX{P%Aqa{FOrPKqZ?d%GrQlHSKwfypzx;FXxreOXB#Qr4qRl7M;deNgA&Lwau zQFTCxCf&gITZgskPx=>sRw-51NKr9CKW}3M)FQG8f_)^CuF8v%l8*sff`h9HWMyxB zTE{CHTo#I3LNG{K}{OcS=;dtPECaV zPSOircvMzoJKLU45WYOdLQd~(A4%4z_l zmx17%re|UKu(rC2pP?T3=@T*Vno>*=@bMMaEWqCG;&gC+3Oj0#4UHeVnD4b^JWc0> zGT$EXh~9q=AZme+OZ|zWA}$p7A-{gfl2TB3Lu_`N(LA7%ccc^7eLmkDpu^`UvV|9R z14u-_)FOK>Bg91DL0v+wOkJdBjMtG2s%XZB#T3bi> zLQl9V>*16V82_I3oW;dDZh$=h&GKAyUW~O#G3zwY>+0xE4D(e6R$f!=d|tQCd%rW`ARbt7yoybmSzAn=;AI*Y{nU z5wUnOVPFdMcKL56_}f%&p`&8({m4<2_?cg)EBCr}?JD#r*~rlbb%&p%9(fKR-<7vP z#VDDfuBkmkiYpgoU#-rHDW|5&8U?z9NL_Q@nUUsaSAM@{W+vPK2p@z!RM5<9fz=yY z@C67>ynNXJa()?EnS;$IjiZt*{ya0f!=DuG?QYBuTIFB!p8HNtv8DX{W0!y5uol49 zuW>&j20bLqB|j5 zXsR2{ow9lXbzNABSMi-|#E zZZR=o$@m9zlj59S;AkByh?lT-w`<8HqDj$g`X;6>^h3=Tk59!5Bl@trm8-TVv8|`; z4ONd<8OB&cnL?JXw*5n~1gy`Qx0qKDT&O>Ows!5{X|2^gfL$Btp0h?VNJ!8T2VCwV z&{U#`phTUqW@=aOewR@)v=fSyGRF#kmN0c?Tz&RECx>HuXGcv{6$LkLl;Y*>K0p6* zRb(^k>x17HKUr@XJx^$7Ct+)%Wv=~fWdyR~@5aW)ms{`d-OC;gc8(2Herd9qzWv6M zP8xOnRDu`YhZDA%p}LEIXT!jA^1_6h5)3%sqRA<&XVIgTkav2hZ$w&WXCbr$3Lh!o zh0ux^FE0KO$jRWk?)C3lOtg@Q1ai3fRq+0OlFKr+(`C>6ZCb77-QIz&##fC{&RK%U z70bY2M%2^TIE(R1@#k~xmC?u=(GiFBAH%ee>4jab9|~H+d1#VaTU+ZuX!6ZidafLv zmc?o^B2yK)?oa5i22U3XCrQ{4H0LI*E#`WB;^TMaJ}8o}P*6}D z9v#u&zaL@p;)R-lIG^t&umPQQ0ispoUU5|S4r2^vjNS6N#mPwkm(3zHT~SeEgb~g9 zC(32rP{7PoJK6?yqXg#ZHBN8ntNoeXY~+ z$2J{ZoZX6D>-?X`$twKlZ$KoI2!~aZA-7$y{K9};g?nu?ml1X1O8yI2_B7u0u(mD* z4@KZ$C^>FJBAB!6?d-k``~%%8B|M}#up_Xv_DJYbJR??Z@90kA2Pef2lr|rM&l?2= zx1oVDy7Bh!w&v5$PBW@6#Uba~Bctq9HkN-P!c#GH{jTH~JFg611AzW7)GpBXLiKH` zHZuyZ>}K>hT$FP_hW&!Bt>rx?9tuH$%ovW^22h6X@MtGS?d|oHea=)wbHebF@KWy$ z*|>zlO;UI=iZNJ;A0^8)b-X>RAg~s5@mn?%XPpiE;+%MF-raw#Mk%rLlX6DaCxe=A z%N=jEq8@imK6;VpR6KB8VnN|?advRVDkF$<<$XG9+IC=$d{K4hB#t~{s zr@46@hw`2=$xM4WWig z2>5H%?NR(Yh9asFKvs5D;KO%X-S@5 zUgKIbv#%t%|7-#|7dNS%pW{mCL8zxm$&;{d*@Xla))JBN?FZd?)GR0{>h z4|J``-=AeU7h@3Alzbn?yJpiQa=&P(B~`vFT`T+M5GH=#%0@Xx<#M5s$KO$hIiX!Q zi#BwUn4z$m@aJlwj=d`*^x`#s;xm71ia)2Y2>s{vBBrPIYOx!elNWpMPJpQSBk>_3 zAW*|$_vnAbOy8~izfUE-<-K3j(G3{>m*SDX!|G9#xnT08!7-g*V?1W)3SEk2>i>wG zOFrjx#CEvl%vrBX>tBS%V*DP0Ii9WfA0p|$Owb<*S^{f1%{_$BOCF0o?NYXhuu4nU z-MT_bPmeFH!hQ9s5%K%lNL)tl{3XNEWaVPsv>rhays-RE`TVWFICS{Jpggc?UJUi4 zs;X)X#q;m!b}crj2t46l=ZRfymniVy5aSNy?oC<7e&0!PS5W=w7WuaZot{I(LZe$mRs zWJIx`gZCtjDylHD&A4W%psDPSl1T!WnuGEWvkMRx>lC?^ZT}+j`?|O}wpOLYnl~{5-`pb4(Ny6H`x=;^Gic7#reY z(U`NyE3kd~*BkEA`>6VaS>XE4vwD%B#2KHw4@gX$5{3tQl}$671$f(i=wP=}0h^q` z#lw5{^}5jVdB-MH-wF`Hb|3y9AqpHKdIRPqSOKy;*Xy$6x38i(Tn~_?m1PL8tv58? z;+I$e4Yh4iRh1}Kod>G@;_JPa?a0f5hUtArF4Q(MuI$C#%P{vg#W`xzeDSH<3*213 z$T#`D%M%?hMmOg$C{bUA66u`w_Z0zHJr9ZZUHY!a%wI1k_P$&mC01aVVuCo2W zPGLRm^iWa_AC-Tf>Y5X%7`GK&oSZjz{u~Tv5$8<{JXsZ5{2MzOric{VDAeWOOZCgu zCV78#fr&h%)nz_gU~*Ue3!3%aoIDeLSU9InWz0c5vAOiMfUVr#z19^PR_6a}@dr%rra zoL?vvUwZ|JSWYi{MZn*o9~pS{@@4ZSU!;X_Mq{VU9gVYuKj0ne?6iEYsv0%~RYy6H z?QFKr&gr0&edBg|xK%;TZ+WQ26p;f)?b;MHAyN>ozM{nUvzPJV_GU1=FeKZNhUXt=@#?3EM(h0fitsyIv$ z0pPJ{G3iO#LpEpMu?h?S)JpBc$0nNjurk=y-EGAa-({6EvXY4MYI<4S_s^k+k@z8{ zS0$aWB#7Ibb9KwQh+iJ6AxPbw58McKADb zgM`^#kL!=ZS%N@O1wvy{qT^9ktYk0EG8>x6Eq?0;s@tGky!0t^hs6^5bc?%qZM=%E z{_aWCDi`(bOz?Yh>ged;f<|-);2=*3vKk!+SDVgvKrPtV@WACu{My8%Cp0v)Hhsw4 zqQtUov1#HNC*5@;E2~CQ+)hJtD@^Cm(!c$0DE;sg-yxB|%Q>+Lvjg0An2vSBHHu1} zm<{M`JmQE?9obYPV_;)pxxz(4viL9WMslJ^7cu_7KaB$xJN?!(!c)ZxJ>jTc`c=ul zLp@A7`x9@!$*M?vGOu;ceNmK7Fkaf#ZN07+GQYR7Jvdd_v28ugo9`kz&*Q@VdIE%} z>p>I=BGd@~VUdi?)U&8)y6-|4kA*JQemK0(t2y5MBkW5qr$&V9E9kUJ30oXmzfnu4 z9HjE+PyTNVsZB4p2m$sgqyriLp}Xf07QBJLkbXff&R5|XZ9%(34PffAdxrW?lr@RW z$UAWW(yv3M!=sipbjklHDk=i^h0Lw4egx}CA)w|tu$+lN1>J!H23&Q70FXNYl?1_h z>xoj1s865J0aZXrnwj0bOv+4#@URx>{x%*le$q$1T%NOl%xi>}&pdJgv|U|5rG|rJ zg^fI@nziQu{$B-%TJ1-H-ra{|nhT8n>Zk(8%;7TRz1A(FThO8?gwWK3G8YI~uu|BZ z9@@I^kC{Zh|1R|s{=@FU?(U@X-m-=XKsSQI!aOzS$1B6oJ~Dwz>jlVt85kHEJfJ8v z;kkc5-GVpHHGL44|Ks}bxwyE@L6-FX1=8qu6%1i8&U2{L zqK?np!o;Kud_v;u;7%cjDP~bzSb!3D!=8E$J{5G>xBZO7Z8WIIR6;i65Mab(2-2KR zaKr(vgxR{d?G#KDjj;U^b@dwCA-_xWTu(5XbDf&jGxO*+UPPeJ;1jZT429}dL7QIu zZUq?yR>bq%w(U zrJIBj#F8*`*uIfgLf1GP?nKJR>4TGhQRoK{d>h>hGxe-%kvRA!*x_H#5aK|&*GZPJUv@((qU0;u`iy#rX$fIZ- zs$!ijXySx1H5j?9Nz+$G3;e!dU<*&{6@C*)8@PwjaM;JpyPJh6Dh_>f+`G0OD5w6n#N3T%C0HR+1`BduZFJuy*&-k^UHgBil4y6 z;##4{$;!d;8ub39N=&c7$i(kmKMRoFK45P#i;IhnSgqMrD&gVbAgh%FxpmFqJRY#8 z*w91@+Rk5rII}>2)S+_y0uhRP&u_z|-fw_Y4|+GwsV_NZcSifeVy<%C!$sh3ewUuk z%%l{vxeOO%(%zmZ=n>xowK{Pr#sDr1riH;{6k=y*&pdZ>c5eA}=Mnf$?wFU1*N9*L z4I>h^z*EQ%-6hn+m z20vLaq@X7Hig>()pAFNirN?NA%1=P2 z8246s_vGTa>!u0+$9!zxZxn5Z-}%?ydC(Ypo*(TFSG(=LY>iT^O!gcf7U$dZrA3uj zmW6dDRtgTQvqb9EdNcw}car@4=jX~YG!3VN?QP^IcvsC{nV4W-LNif{kFK3B zR!8q80$*ze-qdeT?y>|*8yOifp~?;dSUrkShSOo>tDilp*@Z-_1FoK=VX$C?GBBL% zP|%eLAxCq+)KY8n*TyVJ-)mwo!dY$}LRzv<1H^;C?ChSmA9T@M%_M@=20+C#3gE^Q}Bd z@NH{LV5XOF)UNgpQ65!v$@CTwWck)u7ZKP6_2sH^vPe^(B^mh*>;f^!t4KRv}j54A-<&=Tb=`|+sbGqa~& z$?{Ke@uWs)C;t0{IHnF0BJBElTI|t99yMkIOn5n(LBLTs{Ov^(y-7$z z@Q3y~lv}--8f@&kNNJ}#cxRL0&d`~8pv^w~{*nRK(8&kIbT4@7GS{FZx#Xl^@Bzxi z#N-MV);MS(IeJ(2W`>%TB7q`OcFS|6!0eH zmz4NMM^l8*Nm$)CY7LvYL;O$#^>#1u*`r4ta`pA~oKPBE5+YCxz?SZ-bhb|a`}eP$ zaH7?O#G;gD*H+?B2iqCbJmWhxZ>ljludD5IwxlrTpuRZbo%~6~xT5_yN#XVLpDw~n zNYf+PFKACE(q6}rTwZ(o78BFuW()macm8z!9vkbC^jtENH3)Wme%!=9u~B+zcW$?f zA#WCI?AWNJohw3kKH4R(PZ<&^%c-QK+c;G%1XSOlyExL|bJY*VhepC4zRD8V0BRsc z6xL8nR%sEVpIu^-O{~0hY$l7$J>)=JnhI-wBVs1ier1ns*i!r7&}5I(ai{A3cvwKC z)K?Q_(SW<-DjmjmF zzulx$`cX=Y{VzL*1Q^41jsRv7JzoC8Ti3#1=5#L^@!UKL zB+EffW(M8gSW6g!u5o$mv_h8Lmk~ocXU#hCkX^NqFgZlPN8%C=5S5}HBDJf+xYaIQ*>H&l3ULFB~ z3saEjO}1Z<;bMZhD(Z4%8w)3=pE|3rPL4cy|0=+|K!=c#k$H@S?MFvN-DM;Wkb}01 zgYc$k%wUPdvkhn0@x2xBPIeh{Q(kLNbq4Ebru_v-a#p9SE6sJ`Xos;sXwo=1^p5(s zVGJQXz?8HAnW{G!@q|Z4`atTp7ZEzJ&XG}3^ibo%4+T)!{{iD=-aG;(Q!!~oMrO?M zDhJ3^40&R0?CoV#RWEI|f(f`DcO%+vMJa-n*dOLq5J@k)w*m`X_y4I&$Rtg;6eYkf zv{0<`#)F|vlbt*-fzN`x)-|~c*z#W4{f#w9#4$- zBnw3R8Fn}G^^JJr?|E$fgJ+2C{ISFv3klc5nDUXlfrH((CJ|4-55|77`#BA}GowAe ziZCC1-n63swZQyP@a_Cfo#JJfsEJXn&qc#;sWk@h{vek@O(cx7(nskJj~uS9UP&!0 ze4h>Vt_mWnE_V zz#O({WM!|7`Jfz|aM+6WqU>Gcf>6-pq*fl`P4x;wYE5+1__kgA$iII}=wrtPIn?rX(af57fXxh5#&eIFPyH`p3SB1l}ZgxU_BYS8M1-%`PgUJ z9~fL|)~J_&jDR6sgV5koqIm5(M@>jb2y_^7;J=+IFtQb-0f8oHZ#F@az)J-qr&6-B zJIgp#q7;X^+uJjj(X!r7XoD?C!=prp1KLk8X5T`hJHCRmld4}I(#`;VsNUY+w`zeV zkT}2x*#7piALZqgwdcoKcI}aO`Jv$5!{rD}*&H)Teh1Zeb~e7m*)9n=rydT0KSqUK z$W*2CD~Pndq=n5(Mj`YdM-QyIc^fme8zb`=Xn zlHIt`hK-6<@&oqy6_Ce~eWnTcvs%v!ZFR|iewh8=V1hC$F`M;Cq07<%R1$NGi+4ca z#P9n#G_>cS_H;YQt-3t7wi~OldO1eWHsvG)p%tk~XJK8M*?(dmB{eA0uU#qfkgQ;H z&GCJ2t6SnoY|*X5-3ZL<1M`WY=SJ^ zxDldiH{ZI6EL`2%nPAT6Ck>YTjbmflDg(t)J%5H3whwdIjoKUQLzi@u2hLDxg#`Z!R^-g4<$kc6Dd}(9(cCF7%%I{65k0WjIT9lQH z+t;V=-?(kBQM#N;z3}o?x&pxsQJ;t6ds%YG$3XT!QW%N`9&ab#S(DUKdYq0POcnoZ zU{o>U`}a*v9s8YZ!_)L{s$#~S+#@rgb`><>c7LzMZgu!UHpOoZPJ6E(@$%+`%&5!m zAu0+aPna;$3g#GG4qyq3kH`C}dN~>H{m6T3`={Lx@hC!YSNd+}XSAZDvW5bY_I5>3 zKJ7rAw`5=S$S?B0usse000MWbrY1&QEEy zy8LD?a=#a=#M;tdd%yQYiD@Fa-}4nrhyH*so`2Fb7*o?j9QeLN_nNL~mqg0>k-Fr8M;dc8?@JkB|7zmmRSOMlD8<&Pj`9o`S|T-pKojNHZ{h zaXWlabx7mu^LU>=|LJA1bI%<)vXK1f>h!gGvaPLlfI0N0n`?jMKefKTdxHTa z3bs4P0Ux8ki>AGd)oGa0aN=V=u{%hr_OF-j^L|HW@s7;0<3NO6A>?p7gy!_T!sL5( zuf^}yzTW}A4Qv))ZkIS(7zjmdHYLraHj9(Z4b3(5wHoeppxxvwD?3+hL-;-~tt)3l zN=?~^D-aoK?~8{Ishe)Oh{j`iH75km$nDWy!U8f7^6?)j`?y1`X=kkM!TN`_fPha+ zvY+Ks-vM&+<_*Vpl|(1zX2bSm#YZlVLcOVY^!jdUv%10}lUFP{MJza(~dIsjm z<=7RnpSS=J3WcL5@H4aBi6YSH!1OIpEr1#Tg*0-5&cz32F8sDTx>i)N7xDuPwz$3x zM6pW4`908ZQ3dX*?W&{`Wj^YobUI#KG%DS z69dAM0<5}1PRL78e_rIjUU~WC{Wt0{0Es~C`tB*qmBj8RV4a+un|pPcM7PyxvdfIh zK8#Kp!?8S;i+^sU9`J!9mK3Wi?%i?n<2w(2BZAClCgsmRmu>u|7gRaTd?&PbbNcD(oItAc<(S5J z_*aJSaw~hB@e%h~YPG@F-$aq*e8g1C?+$+^9NM&C0y~ug!|U{p>(%|Js&C(XN6Oa9 zt|Q$w+wF#i(k(Ar6lh7l#|e4PoN#Q>>m9j2svBw*aM>w;bE108&HOE0;+DfI)?40j zJ(^oo`M1YvJl_2~qBOZm#l48T+8E@=Z~wYwt0US)#6A6W`tt0;wUxK&OUgItItqmz zRzJ^8d~C~X7oemPBKYZw_#S)h!oua^K_+ocK+00cPv>s`#sh#?nx7uoLN zgNMKB+6OIM14{WD#_tj=^M2SGV=n&Ze)a>_*n>n!_?iZZ_kUQbp3I9}hR{zP3;cG| z-YR*+iG}vu@gna3%mzRo{}wdfOn`wy{3N@wn%d*^e({vvT0O2yUH}GxpKs0t%(_!d8DIk1yK+^dmRA$(e+F70FVI!<9GR23qU}G_578M%{>t34@^fyMn(C< zCl=q>*PyX4hxd<3<{Dh*ejt>E?O-TRR{`zk>BV4-+^zmeu)^0k!ud_tN6fDK`ztjO z*y&)S01Y+z=;&xhcDB_r4&0<_;Vejb`b`~9&b))mAU}q3?Kip}xn=%CS~3t$020sp zkX^9_FF}ndZ*270^GWl@euc$-uem|oFI23YlZndi=lu#41CJU!Ol3dpa#lypy-!aR z8le=!)pQv#c_W+xdWJ-;_Vb2-8r{O>&f<6YIy(=jY@hoH1mU7uIg9g=Veaew>1&g+ z&(%-J^R$(O*TO_KuiEygS8lt0#CmsChSH*;p9fxl{vihn zIao$={GYd0znOj%rH76ib(_gG`(ODACsAmKm#^G20a-eskFGY|VKn=HB_(`%XAN%P zL{L=5el0onprcNf94I_0LGI;Sx=LnrJNBEFH+~2<1y;2ca5-V)?o#?70tMEW6f`WF zbU%!73oLU&?|)trHTWCsHHNpoFrYGb;61ASQcHV%P2_dP{Lp*yzgN#rVgm&jW`{19 zNNiW3W_o##T>~EKI+T$IKim5X1*1Xyoa2)w`Yw)+=nHy&6Io-#!onf|nkq;hK75$* z<43uI6&w>tX2Qe&z5-3xzK()Nd)M5~xkK_E(UV|&nX(EDg(|5I`efsDsbChFYrrW% zC%f5B6NC)`s<_$`s1@%9@6|A;_RsAS$Ubv}To$n$)yq2{u0O(R!#z*%_Z@Ej+InqL z_SGZ&j0wk8o~+P z(#gT0B3Cu*C^9nAH#75&k9;~Q9MfljSrvYztxa%wUJ&5o`iMZ7h6vo*gRo$K;j^U& zfD9ICxKzVnG~+!q%6at*p@1Y6YvL}rI<1vD^ff3{v&dOwd|70EHE#LU%Gc>c!IBM` zH#HHW7pFx}UdcWHggB+LlGdVxx}>B8wEvgB1WwKtP?wd!YiQWh{^7AmqNvyQbe(US zTgKMHV6aP&6S}ep{1k*MgHSM`;*cl1-bY`YxBs^EsoE@^X$xv z!P*#1L9)gLe`3*ZkUfj{k;$ocHR+C9e840?|0I;YK5V=!&P{Z7#roCpTaq(|Gb8!v z+*blCmK{z)5>^ktLM>1!rDs&lYj-d=OqQf65_xuv9N{(hHnY>X|s!2b)^rv`lIQa8xqJ=5AK;+_}?!*|Sw!TZ>iD zcNho8Am}@j0!6II@iH^BcPcNxCFl%3E2cpowq_+`GnYTr z@~z<=8%Ls1cT3f(9!N6VJ~+s$DRmil5FQVzi7Jw>{Xly^%~Ez9BN{#6ULcmj<(_sv6uG(?m9cFVr}x14=DT1gBmOiYXdcytc(%RPZaF!@*k1b)KXTq+!qHI6 zW4@*1-uIo{Djmkno10@Yjl%cq-eG>(A)R}LjGdA8mS_!kiHj57us%oJtXDXvwb7JU z@bJ68d+kM*H+*K>oV`jHC*Ci4wp*1NCdO!H;bR`&KhbVFqGc(VPI^o|}8o2n~=L4l&Y;O|(Y8Q#?&hs*9 z{rDCnZEK*ouH!-osI^L!?~sGDTK_>TI;wSJMww1@6GhX#XTq+DNL5|*OR3Ibrkai! z_kR12(dmF=1~>rz`8_Pz+0F@0mJ;Ia9v*hD(JCg z)s&Sz(e-Yw$4VqZgb?L0n6f4ys>AuZusc%B#mI=ZM5IH~>v;;4 zg}Hv9ee_aNkqln`^v(YCurh#>Hpj~p3?F=r>f^BO<3vqS{*gfMGCCB|dasZ0m>?j;|5|}8I+*NV**gw9=THdBs6Hz&?xze* zM}(8R+8fSIB=|pnj<#M&zJ1U6!|M3dJ^4O^K_S77oZ5<;u9Lq!%Jdv(L%aW?O-FPO zyKoLGcei)7CltHw=AwOX$}9-j6`j4Qh);0~6`hMr-rjofrhO-MqC!A4xsU3(r6pk= zdTUwPx*yinraV>z7Iac4_69yTC=Nw^j9h3lF;*$M*tzRGh(Bt1cgo#sUQ6@U!qOUF ziOA=^qG7}3(Y5=P`^UfT&5$Jfpz>Wfmji9S*06gZO{5^C^3HAkaJ=B|U}Hkx)*bN9 z!xWhaGbVGwwXGVQc%iZKa5>&Z2-CKv)3Wn=_0E|k(bB@&aM*A6qlLbOj;N3$lU)-H zn2^AJ;}4m-a0Ft0^yvD@{(7(4@BlmJc8PGDU?_bjZct#xNTpkmE)*jq53hk46n^RR z#wt=0$8-Yt%_Q@e#-l?%Yp^f!3^|Doq%!GLB4xd&eKZsB36|h%CPn3SnZ__rKqzjB zIy*gzVBhXpsdWnA@}PC3u7CJ2^trl{5_*(zxn9MFSTG(mt!=!AmerAwiori)ZXpNZ zEE+EXCm596DV--G$C#djNKK&<$nIx?q#fudFaq%5U`V6juNJbhQrx%#bjP9~KfmN~ zfE|R2@?FmT6*KiQ&UOMIuW`G2^=is$l&()igi?i0o&tnB>n1I{%ha0t3|FM*{L0GF z`nYY)hCN8L7a-a4PG)ZIq)IcEAQj-zd1NYr`n2}oKV|fW#WM&~V zRT_atp>P;}nnssHco+TwV`8`pYCb`^cmb8o#YHT*C_z3CpD+VA=sIi#7X5vF&tRA1 zLXlhlOd#sBtPWFRBqkul!5Jy>JaR~f&94oZr`n}m@lPxe;At~i3FQp(%iyTV8aCrm zLW?`PXkBWUCs+$Th-D{3CJc&QXw0n_9UEUv9m*(#(BK2(An5!jR4P^LcY03cSi|+P zkTN0W-9;}n4(57h#|C#}gmA+meVLR1%62goEv+?d@6rJ7oztU)C*5&w?qJuRg(3$yJ13>3VS(VM z@hi9K?u!D548(XNHlTqRnLcHv~VCg+*r{R^mg{^q__= zl|Q3d6k|qngO;2?RE~qD54}VXi+5VaRb%ft#h5n(jfEw2J_r3iar^WAc>kuKv-mvG z;MLif?ol%4aYxgmqoXZ+?SAGQ(N>I*AoS(=ZET;O3iOeIzuEPQk44!i?Tgv<)5bJnXer9X#ebP2moJO2Be|9R@A3wGB(H_b@sRz-*e zIRX$DEi=4}3I(mc6Nl(H@V3+PC-14%6w}Wy>?hT;`Y%`?XlVO|NQ(jiCChdHAuRrmzToP@$s#bqa$JCmK(jDm9A#KDC;??K1~6w z#rEcwHx{P7)Q--KI6YQ$I9EQDl^tB#ecq-qKc)_)_janA z$7ni5kyB96tKErYg+SOR&fjgP|Gf{a$?enBh#YE%7o#YoG_PzYW;`=Rv;;Fq@|xM> zo+o9m*-?oV7vE5br^dmLME6bR$fxwGTJBWFOZ<=ILnG!+Z5_`edeb+@DGyFds3#|^ zqrIAE>WRkJ@%^6l@3xTV{@E+YI)#;-PM0W2*@@qKe9R zUKVJ)gX!(y(XC(b#Z4laN{D_()yOEU3rKHMHz6GZb92O8CAO0v!w33fuuhJT&)GDK zz$wT6vN}kCRW2E$&>G4qSEXLZl1Kz|6 zsynMF(-!`ee5woCk}j z*5_y!S$YD|nn7@|`7WJO;Amhl>jAWUC|F%7w#G_=fyL9)P^G7)ZkJCG8Z8D})G*4* zOzQAng$sw<+G7ccD0EQPBxLkHqyYQlBb1oDd>1x*$8T&@RFfv^dCdKs1u23U4C3V| z`%P2x#%Y;b`9GylZccQ*kzy%7UmP$a5X4YyXq3H?Md{Lq6CsN(>b5IJM-arb|Am!SALMR4%XO?J#mpHMGWA(dXM%=3zb8 z&})IJKojc={XiUo`Mc6>cY1AYT)C3*;ll-SJddeIBB$GrTUJ+Bmu+j1GiRKR!bAvF zp0cLZ?J897m?POD#y|^_j1lzMU(a&7a5{&~&iTueBkDE^CdAe5rCnc*s2pUb^fpc+ zmhbHX*T!tln(y>XC_@yzZ`MJnmKZp`!s9)#=@%u(3P& zetr!!St2@fNmhf zb7^;yfRJ!w0|H8*2BrCKUgec2V-h+#x|QYSp9pxWY`r@#cq+K z`M0f=m0D&u6GO&HcIxptqXY#6 zN;x6=`_YUzlG6J>i$G|-IP|aZ^8Xu_b}I_m@qMSgItyjp@Z&nGshSMhm{8k0JDsAC z9k{TPp4bdI#7vrC=aBG0#I`lzg4eivgyDTtM`!Zy<&6js*GcBfAKF(?u<+ud>e0w} z#sX}sM_(Pc-_4uPRL;D~VK0wCkBdV{SMYaTBg&MQl)UCFO({A$qHNIOh)6BBu`2o_ zBLNP9CSMIfBo`ib)neB z6mlHynrK2XSq+9iWpTHG{)@kG+93tv9iWb;%baBpqbRGW>^%J>3B+K5NhdW(;=WZ> zP{U1yX3WD4h3Z(P6aD5z`bCQfYdMy6vPBfZ_hm5FTNS8r$GVcSyzNm zoLEDSL(_WZ-@(CDs;b%tn)?PAFcY6tNEtYqZ>f)9#;Ln4cX1Ep*I-YABU|%`~>M z=-WXYV9d5Pv-z3-2!c^GVImI}pPfa0MU>g;tKmHydig@{&}Kp)y%RYth%*|!jJ=@} zveV1?+@1F#GV=apm{5I<$NHCaMRrwCA8BRvnq3{^nIU-_s;?1j*dq3K1viC>Q}I zN5Iit6rOFBLm>)E<0${SN~R0s4A^AJpY@60y)!Tnw55jXh$&E+RdjkSel>jxm>A?V zARI`m{hUE&OIVoWBY^s|jv!j>NHb@Dp={Fq?hdpI+iQX1jmjUbqY(H#{a#yteHfk4 z{s8Eaa*HYWKesJw4;IH?m$#gogf!oNj2!1Z@n70KiUs}Ts7LF^8@^zLk){`YBUD&i z{LdtQkI?}H`{D5F9?k}H5_lpah@+rF|90QqyLW%#P4|O%GA|xvQl6fk^$6?>c zBMj`UC#X1^K-F#!b!?zR>Vn+2L9jY7d9Xi(7DV8yG1dN%ISsS#!E z;)MXIiP3IU7`athbURxuZxX_A^r*1l$O$wlWH&d1dtftHyZmKa;TQAg1eu_vhg=M6 zNQPp7lahR-xD`;N<%^@9Jjjc-jPcnBfA z6ZtGYKHf`+gM-5c>>5wy5IHZjS}hdRH0XQ*KNL8~p{d17JN4xchUQ1`bGI3ko5lf- z*vCshS#Hxxj1nj-%rou}6q_D5Tvr!Yaj&phOMT7&zB)XJt(5$zde_Wf95i(I9|(-i zoHRe&=EQ=Rno?PI*vsU*Jb9-7KJqJy=}X2Y?rmg zq#v2zqwl@Z(&LS-DQ+_4p(cWGcMAzIG4EmE!SxH&#rk=`0D~K4d=o_ltls*%m3oe< z3Jf8$(8YHRm1RAj*JH)Ye0Oa!;}zUfPnw#Wp_AbQogf7WN2p=VD#CnwdpuK?rNa<|BdEEy^3 zZYyl*Cum}_vcH)D1%3(%ebfa00TiS`ENwSHGb&|ld=m^=V?6A;9h^0-_TA7a?UmzG zsQyR$?945djcw>ze3wgWPcnviiEqms(2_|R894Wl++0a#orJkkso*y&f3l*#l&TAj zeU$ThmwDPWtn0B?+Z8YBrn2_B%=kgM1{2BAZ;vylio!w%0dGw~SJf>TIW8fKJZvm1 z_pCvS#MM;`_~@rFk7`v66hMTqyViS zb*og|CLb1ngouUWy4djy)vOQ(F1=dcM~;gSaSW=Sl%GFcC*b~YfwPUA$4Y8+B_JdD z00Tiw)lXB(%Oe_c%G@*XWUZSbXQ){c2rw*CjGcsDGqPc#He!q$`+xrm81Yb(UOs=^ zETEiD&}8uFHFykV08^0!?B+EJbX-jLbSeWOgqjwRpCRE7pH5Cr!e~IS-U!Pi>~FX{ za=K<6J0Yf2-@a-D?47JL&FzX4V?dG!N*T!*Z0&3lH&!A4eT(!T7CPOZ)L=!+0vz0= z97ElA=Fte}gXO(RdYet@a&2FWc-7Ynf453dHsfvj`Wnv5plgbP7q1O)gD-+E_Yi20 zA`X&-y%~sdY4Fa(q^;ySweYtu{M`T_-}kh%Md4W1e02kGv0_jJV?q)-QV)K!`_Aj? zb&zFeh+6kl=Sa|}f)2#Y0&dSJ;TEV@YK2Wh9MafwR2yLTf{qv%rRpI3X#}|L*`I?J z6Us0^O@@~8J0AaA;ReaYTi{S2hK~f6o<@+rdtHuGsxYkFAj1oXsJHju-j^>?Tn>E0 z+eFA-w*`5QW-+)Tw9RAQ2=eke54^=Cy)4l>IfqW1^nQ2^ufaKzYsjJ`*QVnILjxDK z^X8xHyN7dO9RWlP^cbjXL5+pb0f-JC8B>fpo(^3=O~X9|u$U|@pN)1mrLHFlC|cl_ zsf5|nGq|SD-ERV(4Zi#BK!B?eXbYFi}T-QA;Jd6+FM{(Q&dsGgk~KG zOW?ke^kRBZnoOti>2{L=;bvl+DJfdD&BT-NjC+5g&DkJ~z|{f65LR zbl7A5zS7Vby}B9x-%Z0HnVguIONQkd2jrsRUGfSbj)WcQ7OpQbSX;C1fY(NJH>qGOsHO{nRq>ZFtLhJBEc&oAxL3-v`up>oF}*=TGZ!k6te*Yy2Z1&F6R#Jt z5=`MbtCLm8$ppk|FX58j0$Uh99RJjdOym-p3^bexw@ag}*T;4leEu7^0wiuMxO~u+#GfqTz-*aaa2(k%A@zHmj5pqvfObTKz{Kj_taA_XWdt#JM3qL=J9YMEFjCDdEn$Pt1nP#S z;n?NyRTQblM}hf>=dEczZ0Gm&pr2HpOlk%^l@z{=lY&qrQYP&Fj~GPjBj&K*prd^k zVNV|HnzM-)ax2_|iV&H#51MJ=Cj;V-_1>H8I2V-VDUG58!YH1w0)p2}~?S7ezISfXO6%;joj#=?F zODM3@LGE#Ku8rLmGgb?dbRU)0k8$87d_RgTv`4x_`$Y$AxjUVFQ(S<=%8&#%#YR3$ z9hL72@WGP5FO_=s(@uXRWoPGi2R_BXd!s@=k%@eLMJKrs1{~i#JA1Z2g$~B`BdiG- zo&1i{F$r<(|Crh=t=mk^%~!q-3`}h|40Y=vB{9kDRq6eAcr-_dHIUiwx1XI1C@BP? zS`$1r9~C@Ht!EAsx`Kj`DSn4}9H4a3P~gBZ8!3%cz{U<>g)q24(DlIk6Q_D7k{Xo` zp;U&)`x}>&=?7aWvyva7>tve9?B_P4U~ny5^nvi;7BILk;Mty{#N_0V5H!>TeOI#^ zsA+(Pf@5i3uUXQ|ADeK>D~C{28_J~yv&8>lf(U6Bg1#O`&|S#h#6HdR0i1iNqxC z5%ZZr7p+UmsHac?;nl@GiX8n0thsm5Q*R5xrPgK_w7=w-MM!m6@jd}D?9M%qLM! zNPDpXlgJbB4aA{p5h@o(DMcbOci+pi0{>}FjwT`zECB!>2S`%laS?9?;zmA*U6AhQ zd6xQM7<$1Y;Ew)%rS=*|L2Ag?JEj`hGdqD&2aT_OT~Qw5bSlI_)y?gc=~lV#O?>;t zR1!}SsJg>tLU*NBp>~4p-8)tafI`CJxv_;?LY?;427-7sbAE?7E(PLy9K7#~hb{Ydq$+7IO$|`^4KUO9xU$h? z4QiV6#zMY#W@fuB+-$#Gg>;fRs)2uf48Mz2fAPYu5Lf~f3NnrHo__k1t9*wQ{6d?4 zbP*`^B#-9uL=Ti$W0FiO|3ML%SXiKV1PZnBsv{q{zbbLJ(gh}pco5XS!6YK?$49YK z;6o)6TTB|JYE~pLU@Ql+vk*~)eFDN*U6hWK=o;Z|9l27D46S?l=Q~;lT5`mV3(~ZN zCmZ|}s5>ZaR-A7)nOmcx-jv-ghGU7yNP$^#)rw}_rwXT8@BO@up<40&*KR_X_d;+Jb#T+mX{k@cV-{@{-PDfh zuVv5UUqU)fNEKv23Tt)y&BW;B5#Z^uxVNWJlmoVnMYjMBHLf>n`G)MntQhp z|L!O8yS0H?JHUD8j7t%^!~81v5nCc(xPiIFiABMNu~-h3))S!q{4LD;2o9Rb)=Y4v ze6N_Ycal#2o;JQ`zS{p#Ua7nHHDcLvr4}-SrsSSJ{fM6La(~eoo>eXR)V97?oy_X& zF5dA?Jv6DatC`^nB1d*1G!Q+@bl%CQefF&{g!o9I)kR#quDP}rsqMsj=X>Sy+O#vn zuZ$s;<_IkOIdoo=H#aF;vG|4*BmDEnkHipv$g5uLsy$&py*<@%(UPrp`32KGLNS^J zt4(VCQ$VM`q09;6KblP-?oohZcbEBN5Fx; z-jl723OrN?7Ydbj59^v113{2}Z6P~Z=4vs`oyw`nUCfiZ39UP?y7SkQDqfiuQ}4!J z7f>GWAQ?l`e@Q=SqW%v9MennA3oFqmx=c7h*>OXt9-q7E0dhn}sa9qK=WI9Ch@&Oh zhrB5pYY&)O3B&HQPh!@R{>{Ia*SGnV_CMQS(oi_|``{7s@%UW z%uJ>hYLu$SS&HkcxUex)QF?W=ezFg%ZTfer1Ec;Pjia{ZRNc`!rmc!7BLZ%`Bths< z&654x4yM_M>svh6K^Js?LU;Q3k-);5+w#;d zNj?uI7t6fgRP#!A;**Pfv3vqtE;8B{ulM%h_tptjPKN5P?)!PLDs069VY|D7kH<>Y z{yt7rUOu+QY%~zZjCq4ZOW142L2v0}*_8Iq^{HV_q}Jy~r}F4Twg}D8y>ZrA^4wp! zjl3S?4nHYPa9L($9{hOB=a;-lVSN)>#KkleJ$mi6rJrIzyAtz&zKzkdd-GL%^`DX`iSlIk>otbPqC_lRNFIwg+iMzjPx{2AX{G;`7Poq-n6*e9{$>6KL zsgB`StK*9_<;p%({=*!G9)M87nugcF)xc25<@&*RbgDe-q$Z?PqZlW<{pYK7tg-ij z(@8`=rMMhyi8W^qI^{&S@0PydaVdL;ak~#MhDltB<#sz>3`^Z76ZVsPnE3;YcM4CO zz4uEFXeFW!49ChNHs4AGCsxb5R;j-_IsUQs{=J#Hqbv})mosQGK;OE^#$S?-_RRGKWY&x$o}5h^w84hPvZST z1;$EkyDLDqjrLbTlZ=JYF|Yj{h62(N+mV^Zuek-*OV*f~Q_H z@!9L2^q@M5ie|<$TQ|^_(QjYN>v|O3`fxdoc)BfC%3U9MQ^~doI=fxu^Am0=i#6Bl z48c?C71Cxsky=z)G5fP>JD3LkVk_4jIh5pT9wEDK7Ih~K99UdA4-@QcDxYv zqN-!Rli4DxU3_QZ(_ssCeTfIZQbI*2F}760ATv%XrSrGxgR{mY5z?De7cA~q^Lg(U zSGXDUe7SMvjE#AGRLG9*uV43o$3l)JYP}6xuHV(-cT)IO17Bk*EcTA1pR$IBdoTA} zPwybwg)J`!*9vC*a?{V~pDmvIW|-rSV%X&>#?rjrYdlD9(u0wAzCH|Ie029AL> z06fuW=_xQ%D?IQ2R}3&)QI36cbMrAm_sHSWuhP=y;$k*SY~LEqIb@@J0*N#Z9IQ_802Bd_%E;KqDgW!EAzd*Ap) zCxJ>YCWKJtQIgrM)1@(4h*{ep0pu2k3Q4y*4ttVo_JTW~d ztJX9wl4YnmO}x_>$+;LujxV0}d{>!toE3CLJN}eYX!>JY=_e(Y-;Ku_eK=S6qko)- z9pdgbbBBex*>gRgF54ea{Ej{Qt%6^Gf4NYx@WAPh|K|;^ZDXO`KFhxxTBXPb?2$)5 zr=D!&sT)PYhIlc-QijJKTB*C`%pfMRA)Aq{e&WtVg25;jGtfhmB zT=d#MHMhCY_a{ZttSNGmy_4E$=HljO^GrJ3o4zV9CHFB&*hk_TOW&}-oV?vxExwDx zGR{*@+*9zmZBTB#HJJ9{u&&GL#GU)%JMoFy3!3)FMOU8X4UuA4`6s&A+i%$Pk!_c# zkRx_`LA4`o_J@qTv=0S@2O=p)ZK}H@XKaJi1?~~VINbcrBDUNac`NuwY13M3!{QM> zrEq`Sa7Xf+muMY5%j6Vq6(1inAN_IDt`5gfvw=V4x~-@Z8Jqo&$hsnl2Q!N2;oZib z&>Ia;ZClN!&#GU=o3Mwj&CfI5&|@JSot6nBAlZO(wM(NLJeSgpmhg@H5idB4mpT%@|PRB!#!@2LoyPi zzaHgf^Y&fRFp|Odi_X`Iu7WP2(D)=b__>KfouyI=x~k0|hIkd94HWTW&`LMq7RB-% z%2~g7H3Sv)>Tl9gM~0-0EB0b1dNiKWRD2({cy-rAR%7Jssi)u&nbGZ^kDf^wxVzC} zH`ETwT*Hg;%}QZ0vUV2?cw&jofM<{bFA&O@5p$f zDqUt&f?`VKwS0IuTNZhS14 z7MuE0ED1FvuF^Hd_ePr`hy9}E#{`6HqF|?*QQ@C^i$>JdzQFoxn57KmBdof9|FD0U zMkQ||graN zi|pWa6y-`hdVnl1d6cP27ju3#-)vb;;RK zcED`PUTy1(IhVzruit+d9yf(BkcH;_Qa~^`C+?xPxt^;EiwfaITKf5S&&-))#{T;f>Hfn$8v(G=CtaF^>Mn4X~#u(@pc>Upspx^cn-a5@JDGp3U z*SeIPuP_LV{BEg5?#<30?Jg2h@#z=Jvb&(=+{MyxMvtj1>go8ElFh~7A+O!H7-{xe zh+aO*veR}+EqRC{51I@MQ}GQB*2gwjaH%E#oZpeYOY!1b-o3ED1TPi#=NOy?*ErOz zgIkh@H$2gA zk#sSIgCYk<;RF8K>cQDk)};Nx@<_Y_7mIpgf_LuQo6qjmH`R!m)%c7Q&h%^g>${*$ zrx`g;_Z+$zJ=j2Wi%dd1w6(RXq_E&P*9eKO)6;erjt?M}n!Td}Kon0=?-s3DS|BzK zf%=z%ePeg6F$xC-;RCUi5DyJBRmk4%E;GbzpnJaolH>4_`{o1bU|N;Lb9M?*vP2FD z81!X?(5TDSsY0vRMhdxpUw|8C+ar;?>b<}CCjT8=26_OZRaeLkBD5D88bJ_$pbtIs zNw=RF5y3b02nYWeQOdXNv|xM?tJ|**RP~C1UK$SXK+xgA1~*5&hhD$g%uPnDd~Lfx z^Mf861>-a&1(u@f&{@}`eeafrKEm+`1JPK~gfG{pT5J~%*c?%aUb9l&xkC_2m$u!= zO^Dr#3X=feFR(|iE93me3uP@kEyXj-sQAai>7pK21+S)4&o7&8ANMG68Zcz)Lg5U#UpZvM~{Cd*eqnL9%(97+!c5NpyeZqx&KI1>>J$hM6`eda=F^XY)5i1_uR_y9cBoWlWmWi_i3%%@)Fs< zi(3TL19B&~-_wxoWJgEfG>=)h3gX^RyI}7Agv?hvJ{hDaM~0Nm!u4dB-{=Z6eNJtA z(ZiBGj9C3L{!km6M`-`rx#-V=_!g>FNSxp0igpEYeSX`EdD9npqJnac=}Gfi3Zsv| z9yRzh)Zl@qv71w)a9$g*H$hi-_iwPOU_5``{C`>ke&}t2oQ9E)Y2dR4@dps0mry(M z72MC&gIC?9rT0OJ;15)%mK2lXLzIk@Qwc;%eF77&9+khny?ruVV2>aneitBAdPs7A zM`X|ob?HCB9bSwfE@ZbH;2ypJyAg@K@NhT0=5f!mpY0)*_t-?>AP##U7bDok*k-+j`J4v_H zNbVNt6-8+gbxdJCk$4Cc2_Zc z&YY|4G@>>bCUMtXc;fY!Nq^dev7H!6ck-jC$nS^_9gviXl@`pYa(@iMENYhXlz+BB zkA)}ilk}TQ^ZM<(7J7ELVyjJ-(m8DpM3p8)?&_#w{*{W(BOhE1sdmVFBI`-tFc710 z8m^Jl!TvZ@m=^fwe4#}J!gG_81Y?PC*9VEHnT^%yy-rgGpgBoCq*C-`?aXH}WZB+n z%|-Q0pojYX!Yjjfm6U0>Uh^pJ694!`*jm>1hGFkq$irU+NAa#gd=F$@=RG&AP-D?VW|vw#x7Vf1ef=YC%38&5;Ea~0ugPJz=Cj-N!4|B%3X@WAO|D~@b9MJ zcmVA!QDnueyO6)d@3BAmy()l2?K#V}8xJ1zLFi>o@#aL|qN(THa0k#Ac8eCc7!=Hn z7MO2D^C{;{J29n7rh;cKMg+GYCxrKXBHMW3ig7>wjgMlC|Ky23rd<YG3BmB>l`xJt)ypxiWf^YV|FFZUHW8$dw zrRVr#LU1+v$@RaV>I!IYlT0t`y%YA>AD)18*F8BJzMLg06B|itW#rcSfUhl)&h<)D zcS`r!UxXVdG1&-pm%lgA^~9}1OXF#bFtI+k6qhB4o}^4VztTLKF;K@CVkmzj^T~fg z`r_v!be(+#@(=+GHLsfIQ48@+i={m+@!0>U&5GSwj0&H&_IXDI+Y8=Ov`+N>s7cGK ze=oZH%~7X?OGt%xTSph7*Z7Hssr;+5`7^b5G%`Jv3mg`>cAq7ivlcyh+lAQv60AZD zk}JK*d6mAobP)Pl;4E70AMJY@)ys}+Ke#DX#<71h5T6|JD-doMHl+&o{v}pOA=%T?{dHi=J#<+A2+1#ery{ZtTiX5lx5kKjgKfzKpA}V^)XH-pTd1c6IsR zS-4>o6xKTsC&{dZudbmn*iN>vxOnBA3~+BEwOp4SXeA|kx;Djkc9|}&HLGoF4tf<+ zvvKvx29%Jx50iR$R6LG#r8ywQ<0^X<`}CQ`59I5%{*)>@){uDg)f`+~$~Cr*>WNc( zW+PAful`QW>xxDK3HDFN?a##x@_%U)hR)fGXa{ZoT&L?@aW!f0edr+WLOm~@uw*>6 zxOfzD`iHKf%vQR(znr|0%x+=POZH@c1ir|FMp)v*oX-6hQp^N|3({17g}Nz21hOl} zDG@0WwoJ;hIH~>W7cB`-w0Q$4&5v4B;*;f`U2(m4Zona+3dR`zA?tZH+lE}`o-Bu* z^?G?Sqq{qMQ4xE8{;UhK-n{vWXU1UeK&$o5lWo+^PqY8h9=GQ6`T1!R$j67`Dg|iO zj2r%Zh^lmbO{C*cqFCYXK|uAV#D|c;V*MD|OYp~-9QE4Qw;J~6Ev)m=DGiQroP1)^ z`RRR>Wbrd*&xcgjt{8eW4uQh19G#weVNnkE<%m7Sueow#TTMFs6f-!qG%=tgb|nQ4 z+-1PRDFS2(1|v{-ISCnLdHATyjS*;x)Y*%4wiI+Xl!AewVIqiv1U4pq4PznR*@wb} z-n6J68BKu=*Oa7)8>92qgg$?{18@EC{4R@3A%?g&BM#IOYFB$+_j5lG8(5*m7*S8^ zT*l>h-J}H-hd6Q4?e_2PZ_~`R%N;P8{ja|LjFp{}vja@qH2A8M%=M#0NJmtg?XG`) z5?nj$C>R}BM{Q@Zbmy%k8L~{DYG~v4I$PM+^WNF`MBP%ZWHv1~%hPk`VS3kJ&($jI z*SdCn9Hg@ZGh0jQ91bnU^Lk0I>IB|M>Tda%kmDBBpf*VR`)RykbHm3?Bx^k)vBW%J{iZYn>tWJ^>-xe?Bg$ zkF-h=dhmR{sNWT`HNR!iTI6r>a8STxEtkPLn;x_{Zqf#LpLUsEFxvZxZ~BaQL=W8I zFqFNivvTws95TO1qu%*xMb#(uGjSBOX5BKKuWPT{aDVyoQ*VsBe+M0xXXVK6YbMNC z7%~RjC1x`g8n1hAKYgN%ER(-x+cZ4p@p-Gpt(LOi|MJ%PzlkUtSBkvGg#ejf3C1_R zhNy17m+Qja9Pc8vl$U&Sg=#<6Vf{Rms(BZOeU%^&iwNUb(BMlrGofzp_ohR=Jxjp3%AZh$SiHo~T ze~Jqo)OIU%=tA!QaCF}s-2_bn1UDwA$KR6cKX%_+4T4Y+Y=8Z2sO(|6c~c(}Zeg8h z1|jRShuja42V(uj)xOI^i91@yWxMa&GRMr&*wxV;x;bhqI(pU!&8WVHE`=kK-+7hv ziR6U?1K&6=t&U&&{;pv_FsSA03(fYwyUE>U_5HfrLJw=E?Qea)HFe*P9jyxQ#bk5I zb4vS}X0JbZVJ3MKL64p~9NxJ@8fIxnc_nz#lIzZCkSSs*%Bql0;M#>+yK!<~pwQ3M zl7XiC+tVntQiiju*-zpBz24a|V{5Z=~?O?|4p;;sFxXVEh^QZf7qr-$w%sj-J;3($T8#JXdbLJ;kMux1rM>c(FU~>D@oqPWH<`e#qEKf-rqN=&AHI zZ@r$(9HpT%fttbc*4h<@y^<@OvbFaZ8MlX(UcBJa|F?|v!nhlL1yyHH%O9F@X*e^` zh+>iXlzRL9(a};OA$vy}M3dqUnm-^Q6*TYr?miguLdb4fEU4{0`Lp`l5h~8Fs24IT z|4tWV%mqT93Gs9R*8{q4-ANW9{I-zWXT{Aqf}FRHKK$@V(;xN8i9Mu4p*XrjGunC= z%m@8q%Mcsnbqi!5&Gti`u5b=2}?(Pi}flG zjOHz}I?%5wuk%O9Sv4|x?ij#N6nR5Jjk>tC;U$lc0#B{Q@7WC3J_$wOt6!O6}kIGLq-ZYFEDZ5i_q+b$s`F zPNNs<%%_q5aT>xG&&Vh%dV_JB;Tub))TjB`;fy0-c(>484eDF!L8TZ|x!BNQM0KnG z3qp9|e|6_V^}ICq<^*PEjn1W(zY^D9ia*geEs4$SJe|iaA>E=#`J2pu2}%31Zuen( z0)FQWTSgEV-*{WZ2#*){F~su`-?WdF>Pd}yk-;|M^^Zu1|NC&|xRteD(fT&!?{*?v z3a-U92?BB+OgV9-9>{G+8u6uEF*^#pdjI)`0B-%~`yTLIbSjTMd2S{^_P?h( zj35?hzz00=@-Yxh=GA0wN|hoi{JH$0X6844~rWLu`YJlZpe0qKww0YwlH35ok~-}{d5JLBj%10A~A zd#(R^V$R>h%pwf??-$#DX4|%vE|?D{8rS~!wb;nyy{g4l7j>c;f5TbWx8bk+-?#hn zUB7TnnXnF8S?u*t8=U%yh?AbMTK(Uf4*&U%But6^sJv>-m^R5zP_QELpKm0~<~&U$ z=)7I36N69>2Y*u&-?zBfj_7)~W`n*csFjHbu5`pVf8G~H#ijq;u=euuD)`Z=M;l!V zq>_`utgOc{kyW~N1>|zRT9a%8j6lnNf1*WlcNkH-si?>=LAYk|LrN#YJ0l@wcHvDV z8w2(r^NDULitC@kKPYO<2i?$o&2hNiF!U*jw@b43+M%J)jh~-@X-wf zcc5aS7cX6}J!832o-tp@+I2AW9$saqxJ-@*OM^v{u+*#x-2f#jVs7?ChDft5gnoQK zZQO4eW9$n7=0wi?MF^BXAO9ZJ-9WX&cR=O?6*g>>hq+zYAqx1EBU7Z53TNLVQYUGg1pWyA`G=Q;_EJ?tV z=wfANRnW`ZYkkP<{)6r?8l0zfHS?F@q!pO0bN6^bq9xK1e8$!hLerk`GJ&RDCQo&^ zdS`V)TC47^xt7+{ArNSuz>m)jjg74@x|B-OAev&$4%A}m;2Nuqfe6mLc}P>%ZG^b# zJY;ruR#R6}__4-&eUuf;Z$1T;yYNaq!FR?sye}*hBf~J4+Z{Q*oASz{u6wJFED)-2IQ@3V!*U zHvw;83JRW}?t$Q#?wJ|SH#If;*m`<%Vj9*|n9Qccc*&)mS&bRRByUOfmen3D_a1qC z!*y{f-RF-R%`66kSCTCksYi?9@Z8)SQ(MoOe)s+0cxuQx0(~Ff-o}l?N7QnDMI->b02JYEkJ>a@?C!QFUK;Kud#RN}m$ zlzb=8crU!#kwVLU*|U}Y1T)YCjD63yHdEqLQ~zlKYqv;JLJpW%XiH(-ev2>9hy?O) z@!)ddWKF~_9bF%S^n?`k#zo$2_Z=EA8`52BxsjBFgzrO+TlHj;jiMlfs=A7T5HtmJ zhw-?xEbG}zwhEZnYQKCkPsV2a<0S&>wvMDdN=08wVws5N3)O2!SIZJpSIM~ysJOzFl+owc4NBQ15{hutaxLNUyd&aKjQu}4?bFJI!K7x1L& zAl-f8POI}e_2|Z5G_;KiHyVmxWq0`#2{oiBUjK{CAUDT`zr+v3*ETAX^1uwCO(NaQfjR3p5~#1z}e!Cv$Jy?sh%=8O2)SPUhlVPOxctF_kK_h$?GYJA_2{IIeQhk732B3CDE&s4Yp7h_ z<6m&B>9_e%G7NS7FAhtYFhEU-Lb;GGTQ(N~T1!qUs zgYB(VIy_w5JQRqj-@**!AxOPH6}%oY6mBbFja^$_9_40X*-VXbR=m{}3c-jkbr4;9 zilBf;grWKJ$*lHs=2WOGyUeps-i_m#pHfWEw2T;lo_rIKU77uZgUy&raOEV`LDq9G zEIsp~gLc1zngZv5I}00|uvw_Rv0C#~we@2mB|JR+X1CkVLOxl1DWuWX9?`B__iX@}_YuvFvB;INIFLnC<_U5%~%iskHzK^A~?Ww_oL1A0A zmYqtXSe5l6Eq{DhDXNr3D>{)phXsOO!Gu$zFWooRhySb!o0c0bRZ(K*r!z;8FAXcN z&KeIGYj{D4Py;p{ELhwu|N4d7pno%2Uh}hlJg+`NL|W#Q!mu;OgBwHd2nQl~3PEYw z`mEY2rF^hngHQMX#}`X@xJ^SJ?Gb9EVenrIJdfB=17Q=n%v5pT$pjATvToxf}vHz+po< zniB?puPZ7lJRioUxso1p@*y-^>O8Z5XCf=rI@`ae5!dZWl(VeYV5;YOGDDcexcKFi z$QJfrXQ;F*4%jG&rD)|o)){)57~6&kV$G3Fd;Gr>JrUncmc5sM z9#GjX-uQTEIlQvlDIKoZ?edSje`EN|A9C3K)q%-t22yU9zU0XP+bIy#(%%C=q~%{; z=f^l=w;~u`yQeE^sgg1v;;HxNX4JDcbu5|)oYxM>A`ED6zr~||buq#ZSCxhdKN-otT}dB(qP-hb#ER!AfcV z=oO_GA40tRBlvu#n>aN;iY0!Tl{%2zd~otAO8kz$D}sjn={V&dX`0p!M~-{ml!tVn zqm0`9qJlf!IF6<@s4k)=CH1AM6IMTTaqHh`-{Q#fIeq}_OfEjYNn7=c^Nm}#P$b^o zT3$?E7K+Una06B~S2{FcahtbD;c^O&AMj3cr0<41IYklc?}303Y5!o!g0ez|Ju zeoKN>R#kOC!tW^fzO{06&4-d%?w(v{Jtv@Z>mg)MU{G%7_h+-euP%PWstyOp%dKrW zy+hMaHVy=VxK`X+b6*-t&Smi2Wb%MV$zPmS%*5m_@Vp>^$jamJ>!H)hpKI0dGI)&U zU6O44-11XXQvoS#YoXvXaYZaH1xZT0b6`hrRa_{~_hJDj!MtPtWnMt;-QY!H4jsFe zm%s2T-#dSV7dm5vobhI&o>4t|dGzbTHxm!TOYJYGkkH&9uzTSGTN1d5>7UJW5(9x7 za4!k%Q;gTRW5pt9{lO9rRlz;w4+NjeJ(|D3(iiYyGqmxX!r_;)#EU|j(fX{DH>R4H zn5(X4FqviP&`~GiollJh(2@>nzefn#Um2zA1Jah9k}@0%FZ8rLJ{}6;p@FkrnV3=y z@schx_L=#iG(sZUNZjrS5%-Z&v0LxoeEm{cr1MqFnui7tX9BX>S*blPfhT46L)G>$Bali&Yr z4oCA^!LC$W>Fye>E^n(_DE;zW!Oa6Fzl0HkhXM5Ly&Ons!S?sPOeqcH>QH1l4FaDQ z>?f|D3ArNZ3S&_+U6pakuPxuw>M$q-X^e*yGM|{ec!5`?t#4B)A8esf*yl)LmC^$` zpS_{~IDyoGg9m?wcaZ=t~ylv6oj}_}LxG*t3EF_J|su1q1uLsrE@&t?1 zCM73#z)1j>?4Ceea#;mU@c&Gbwh#A@t@QAdzm?aNttKc6p=I7muk`7h{kT;h_x=%z z`{J)`!fL$)T(J>63PKNX{NKE}0uFd`2(ecj8XVm6Bcp=OMDAXQ84*9F=44uu8e>en zT7a4P&>PW(?S%FB70KUc8tt%D74^(Xgk`QZJ8eD->U-XLaU|h}h$*3z?%j?L72kRP zb2=I`^SUlUFwsB|jR+myjLz|`w?o+vl#L&vQ=$tk_Znc0ddzFf(h?jPyEO9mSP|9y zY1(Psw;jns150Gcev|uZ=e)i?y-Yt1!NXHqF59QPk|m{zuqoSxhomw1Fn2qf@+i~! zC?dQ>78>@k-CU6qlsi>NxjDwTrIqmA;JwW(umuPv8e9x0=fp6&kv&fQ-(gkb?2QdJ zsp0>M2?{>)dsq)Q8loKtU+c_vm1Z_`*{9lMh`e!Rt1#WZJts{Gz#nNgd1&oOv=cf;QBB}8j^bNnwtEn!ntzCtN z0|HzYkqb(2m;|V^^7h%qhj8#pj52rTgB!gcDF2L7wE|SE>}cr`-9TrFPD=}0AI`{f zHKFoQUh-VX4Ngc+)$;`pb^@&aLI6|Ru`g_EX9wP{sOabr$#Alc&Q6R0B!L~n_YA4) z^V;Osu&M1QD_6Q$4=H84p-iY_lUB0%jseq`Lj-GN-REp34UM=!dHh-9i4#vH1yjY= z8C(Z&QBgd6Nvcy+WHniO2WI>JAPZaq$!Fz<4?!PWL^wpp=;1@9PLP z^Ti(U;#^(a+=%m#f&%{OdPmb5fE6kpgQqne_~fS0)rb}3<{p6{)RO(_)2BbtwGHC4 z8XEE_8ThcoMk=e`UuEaU>K!qD*xs-E`nh}Ll8wjtn_77aK2}jp{q4Vh|5k_>!wU%m z#$+NN-Q+kN($hnJ%zQdvM#i=?NITi|QgqXoT}nlat7Xd_g@;$+76+#KC2ftET{rH$ zx({+yDJ;#+>nZ`fAt5W<-)QsVG*n)_Z#Bj>U?@a#yI4yinhlR+Cb=o`&`W3k@LDq| zp73XHt2^J1CcVqNW7+v$X%q~-nXx3;iacL*%N9b z$Pa9*KlBUR=QsImXZ&+(*(%xQzTrO5af3N$hd(CnWiB}W$*&KMAy=ZMFix!#uJ-O< zvDRn$>m&&7<&$geBj&NAqD`oG`u~2rxti|uz0CVRR_p2{^lP!oKe*dOORD6NSckv$#AwP;0G<901>+#)9L(hA+ z!B)N7fwgpJ=|`tD1rBa^)b>{sj@UbtGfM*HADK00tP+Y;3ewUjC`4b9LVnn5eGZVC zTg}$8x8UdP0Kc@BQb#-@ciF z_g0RCoV-bUE9cgTIFYWWOtLNu3N%B{Iwxbzpw{IEnGXOjY-iPZKG}n({8ISpRcjSR zuP~+&r~rw$;h>KOsyPi%jUd$I28Ute8;oA$>3j{7)ol9>)82^J()1tUsE5bZ(Fem@ z;vR+2iO8u zCl}Ejc4yR6RM@A_Q=<=$Z5+aG4zFa;eRzx&F+nHFedj6}ak9>_)ojkXI|+w=QVH;q zP}oKGkElgo27}j@hJ)iK9D4V52z$djft@5DVWnYP&3sFj`V9r%fQ)y}OH)K%bC=iZ zHK6#=Aun`izJ+EXvR62$4jtwrdDJ;rnZi4i%lRwVKp&?~a!5s+AQkp>WHb zSjqb1D4vu$tAKqHj;G=XdXT%lPv=YGYKTzfqkQCZ8q1=V@4G6{_i-q70_0S3Cc5V( ziLNJ*$nnr(GVo7kJ}wrKd+4V|IK43}_XMib9uHuCiqX>VHuADQvmh-aVA63jz-NE? z)5qM-QYf(2#W{)Foc4@I!vCGCDD%;)L$7^8$rA%Mp63e3EB;8^h2e?E+W8q#YXOD8 z$c9i&e~xy(WHstBN8%jNhcIBA)(LKFqgkdB&;9Sg<6O}YO0 zWm#xLq0ntnFH$G_iXTUVy>Z}m>&ok~VSSZCx~N1CEVc7>jn5u{;;>1T^UUCclBw`r zP>>M8GwPL3_*9EN|Lpn-rMnQqMbbE7K%L!#5Q&b|sC)ja0+2m~`lqD-=56Am6>6!~ z?coAtDU+ZccHItRu5s3bo}X~(Zvk6r4PdeoDDsb;ol@X)EQ0gag_6fgc@Hk;N%ZME zR8&-_5JBZ`N}B(1)Q?c&>rT^t3$NrxAk?cKmTF_f`SI<39fnl z-LfVjBO`kXI>g3r-@eIGN=Xd8A>w7qA%1t$jtJXkt|(xQ?q_$xeO>1Y#jwFpR8)zp zm)o!IC}CQK*=CKYgvy*Df2X9=>*2&QD(=oT&I>~WQ_KAm*f^A`)Vd;Q5p*ibg;$yJ zrBR)tq}MXCqT^F=LUTTLaCvkl0pRd-8}u1JJ|}TwAP+1Cf6oHrVUj^EVGu5X7k)M| zky_bm>*KGF$CUIJV&f+;d2tMpC!1>FG{G6^*9$Nh?2b9^rCjZ6<3|3qZT~9Q7L>j z`~9iNYlF8jbw&>n@}f-{Nv-$Y-?Ki7>h$1jB6sR^({JPBF9Y04yL`0?B60xWpsh`M z8Sw}lR=<2}c=m&*el*ugK6yj6udve)+OYU=zEVxOGEF)-8ZAGkiNR>Q%B+u|zEQwr zdwvs|G*3@YW1Y$AU}7x-_7#Dfz@Oc`oaJ4T8(^^RQ>MIdZ@V6zc6u; z6NPz|9&x0-fn1p$_cQ*g^)X9GLDu zGetgQ^g8Cz;oQ4#lApwesyuYM;Mn>s@z-aI*!Ae0(O}#zz4X`A=hcQ0whb`cTM~#^ z_w?~e{*ViskwiG#pTi;wrjsvXV`84|PwKrGLRT&tEiO#1%=s=JcgGcM@V{IdW&N2d z!UWB9j&yWpX~;uH1W8lYryuC7$E|K74XswApVD~88TMTqV&{BUk7a`-pW_A^ZGUZ; z8ykBk>U#eh!O36hD`g39dLH{`iPJE1r|{Ul4h&EA!*cldombM5E6qE$e<5#`>FG7} zpY6^suX@)0_`9=+u=pyKj5*pK_9@4(ePKzJ`dOpoxBEN))5(|gwH3o(4uT?azWT`D z-omH&Iwj*27sQ^I-99GaV+{e-4>^7qo_F^mHdSF+2jj^OQ zd3d4WX7ia5ukQUDS0Rh84VT$@>Cm^=C+m|8S9y8BHr&0U@+?$ zEiDe`LwipTCOl8sfOAmr+_)MO0QH+N1^HAZV|e3aw-Ep^XoQN`Q}*l9?CR<|O&?`L zmpJ2UB)PzJM*MDLy?+~&W(m9oo|6`z(9FKF` zZ++=c#kyD&t$r&pW_pH%q$Woo4*5-Y5-jlrf!NOu^F90nX3peZe<|(m@y3#5-X`{L z&Ab_-AH>;qN&qEvEL0W5*(t)hS32yhzIY~;Y3t^8IiahSvZBB#V{$xn|0lO%f{Dp7;xAaX>m& zBRl^|_G1eRmB2TEdB~DO5+C(E0G;p`=7hXFa|!%1Egop8Eg&G#b`Z`(OyvA{JqG|p z@ktMf!cynT(ijJ-JK$i=7KrEsuY>~xdmC~j4g>Rq9O_-|I$aTy`Fh7rs0O9oevDs( zlalG@WSI~Fb7EKZM^n5TH!x&kjH_3;ttZ8jQb&U$kO)c0Shy!6AO0}YoQ{D(4*XTJ zsdwSlxDlG;0JU&`iphWtgd+aUYlDGI7{r~e0)Ei1ARV{*-N)tmHM>8g4{id=0ziwE zH8uCbPsw)migC?(dx4G~32vbY?#mdfM1%22`lgbVRo$8*wBCv2GUh%Dn5E-WSS0E0TPoV{Au4R zjD(XRmCx=A zr$HmneaI}nMHI=5z^B)#5~QPH)q4L27ys>o$jthQ*_?};^0JDYzotLke)E;PK=Sn- zpF+&1Op>VM(jP8Fz2#~@UHnh*NdL~g#`wqnom1Pl#ANx?APcHjZ3!D4tc*c5{*-$$ z)FriEuaLOm?1KtUcRw1YOreJ7lrp~e^h)RNbt((P>Sj2(y}DNv5}`)k3?KHlurqraIq9c=3XulDlQN8{2Bb6z(b2peq8Tr zGpa3FV?!_5OP%C80>iJ>#fxBpY+30fAo3D;aZoEzFLhK~%3)B_V|%+5gM_ZgRz z%XsRYRAeEjB!9m=SXG2%C15UhaN#51seya3nm6~bh;A~S>QZu23XM;^u%(9_e4Y}FS(ITetUx6m)KO9b)U=FuU{qnb%u7^jxx3qMyg0gbdaivM;7pPmmUPJsgP`8D|oGJLd zf!5T7>jp(8pijCO7#O%=JIe&GSf)x_9?G`BCg=lj15FYz>TPAa8cO?e znESP3H6n^4zCvz>2J-8Wn*5%y)$Bp!87dEN8y$>T(|m^BG zTw%0#q@x-xFD5g#JhdqA^U99Od{9Xt$VJPznqc5_wC4Mm@~x^4V`&~$pX7pq^?MZ) z!hZ%*5wq&Bp?6nNkU%4g+AlY1Yps9}brnTFQ5p8$b$i}Z7!?Yv93b*6SDY@#_mjf9 zAs*%Xup( zB&Ue)$2Eh=g;8bHVl>4ko+p@IpkXM6hZ|(fhlQ&f#6+o~OjAlE z3y%&IC@O}wZ?q?6KnRA{tFz4q`ARXt;v&G;oc%TLn2}THklx`?Uf-a+k4bVo1t}PR z4h|1{!DH`Wzk?X!^nGgg49$_Qnm&&+Y`flbC$|Fpw!cVj-SUNFeR;6lfK>lMdjF5c zNfcqX(gTz*`UrvV9Ta*4{aTAIc>}=75P-N!11}eJK$c?A1H!}T6!>s z6^=82)GLJ&E!p$|0TFcoeyk*U6D7*b(z5Mu-^*(mO1j`VmBAzzHi|#S;bdmEdOqm> z^T6vgoPyQxQ*dyw;}x+#PgG*tiJKu~I1%Wl92MGCIb-m^%-<7^gbjsiXR%~*Y=EE> ziTiybLOZRH;7_4P8|2Zn1j!UsNr(7nX!9qr!FDwHPZXwf1P=F6h(*IwzXi>&&jeezl800yBA60IS zIwcVGc+AX2GSCiZ znEG>J$c&SNOEX;#Gr#G3-b!0lNgJEv@!c!CjHJS*3gUKyJ(>3Epsh=Tf6if^J0Z%% zv~J<$b)uv(=v^O&&~Uxma1S6tS!mt0>wnL=3IsVO{44m%r&w=c9-N92KF2eR8btkh zXYG~i@BcIvF3bRwP0COzCfC=V9*bZo`IVr88iR}KDM}Ng(5>*#MlC?5WxK0qDQHg0gyg)N(EAd>ZsQ zUJk;y+nrG|!L+24zf-kK&iI7>S^Fpq8)G2e0{iXCw>HqI*0Gn`-^u4D(U_Em6o$_* z|C`}Oi6URy==u5i=fGW7X9Vd~$pHaZ@u{g7pF>vpi?1*?sR799w?qYMF=Nc$U3yd$ zJ-1r6L!27nfvi1Uf;spxtz#cXFok|d2Z@nomjE^LqcCx{gzBEBOy1Dly` z!Lh@s2cC1&Op#O8JSk_q$3|*|yyC3!m}tK_eb{A7CITzjyho<5f9>nrB#=;Xl|O!# zV7>}rdKk~O#r+|Q4A}q?N;5=QMoH7dU48D7r>c`anu8_}t=CgnExv-s&$9`e1C)G4SeRV3d){~Kmwe&S{(UPY+ zT6hgV_xlbbVJhA`g#>AO-Sw?4VO_Pjd%j4+M>JHrVq!WJMp=xAC(6{$)>aY$_s#pA z)_)v-x4-_|1x9QQoPs{$Dzt-Aj5eP^Zse&%Pk>KFg;2%mmhp949cNn+eAh$qWiz{q zX=QC(+%%R5aRh+A8tfp>Nr;H*?zB(wo>jmo^99VQSC`HhJ|W zdw{rS4ex;+%uU}V!3{CdyA2i&Hi1K(r zfhJ>A{-z8_Q*H_mcXoH16Zj&zqqH(kUjhCs2_i}*DiRVVcW38&3K?)Jh5uA~ty@zT zwp=V4nIKL}Qd635QoYx)^g$4@#6LqLJRTb2y~l=i;Gy!=1ua+rW4=?~gN@ zhBbPeQj6s{>>@`UmH3kvKi4_;oZK*n~+2iR)<0Gxe$FBSP8ckpR zWiG{-PdB)6WdcRQJt4bY^1?U4cjp*k%U$A>hJ-!LLSoP&nd1v*d^m(3IP#YMM^B`bSN zyh&r<=VQcq$3q#XKEz>$c%O}Z5#_cOtNVBea*={qe08-0^;iasKZEOZ*&*86;r!H7 zu}EDr@m3-u_R5yu)f@8|7#Qpi?%!{(F71R?j*0ih!hC;c=hJHMLwiC(LSGY7A!=&s zCWsN;g!n-b%J#i}S{=`-Q(=bXeMSESy67jTC!cHGf4|ib$>FI!h=`0dH;j3iAE0r& z32Dw9N!~d+vb{JcQsIAU=4ig(0s60Rfb?}j5X6B(E9G??{c z5(Hdwu{k~gwU4d8^-s2 zkD<;@fBTL*=Gi-53%~{6Ml6R?0wAFLg^#xOG(T_Ho(jPKr#`$e>Nn*@Hl`k#CKT@ge* zr1H+r`$}zw)$_uf_oT`=*?5>s*|0x;jOia38dg%xf4gob5llC-1q`%jk*20Z~W__x2!+w z2fysi@G%##TC8zTu1Z^2yJAYqs4D+z2Zc>x z3D$1x`elQqgJx*j4~^S>#ehy(iRSzJw*wHopJXdPW{ef1Cy4*7r2AA7w$4T4wcI#r zf;W8iIePV8v;=^wV-;F>GL4YY>$WhafOu!l$ZAfwh@WkYWTSjRnd}ZV(yAN|9FYiH zz3Wd+Jd{bifSfC&C<4;^hA?t|x(e#^WE|tY+kU zzVW6tQ4Rs`2$99p0?r?SYfB)af4DzTJ2JA!1SsoB^_)6aGtrS8T7}CZPm%Uvt>?hY z2N_n{-Ctl}k>ll>5w6&L8xHoN@N48SOgh;Vs;)@f5@NP!7IAjUSl4);$>6S{ zhX8;$_JGjVf^GWrn-*WCvPX`&7C*D_4;d*117QMY%i4aMe1aVh zJ+XbmhePMS1qv-*B5e&`@g#R}5b?>ORL_U946!kpoDV4|&laRI5sqERHI0wD_3zKe zC!$g%8tdP_{l@8>FBNxw|74jNNbXHW4i3K!@>Cy^qhODefNph#rhM@EboH9?7buRN z0p89+t1i>rYOBy8ZfCLa-|O_eJ4Fue3=({NJapW*oqZe2r9_-j;rEV_t$`GfThCO% zOkOZloVJqf24rTe4`a~nMAjNDrpJ66Mj=}o zJa0P&h72VWymc~qdwVZsp3qDYLj&KUAJE4tbnW*NP)&4UbB0%@Tjy6-$IGE#e|aat zwzxVg3q_0&6Kg|kDwMF%nVFFgNaGzX{q47^fax^p+eOmuJtjF7dQ#jkQNdNyfK@iOWTW^ZZPi zP*E`cpr#akIbF>IO?jR(RYLle*3fHP(2Zn5(Hvs_>n^#ugu?ue?rmV%g zLUCsgE33kwh6c|DT#pPXNl8q=ID^1spc}!>)uzLC9Qi3^7DI_P(75&5DnPo6#k1mU`NeM96!X1 z&y&1IPyYt*`gK~_NqhTG1D`6x9ih1!fhu_yX*M$Bk(lWbcv!TDdOZBQo;ckfOG)+C zIsMh|s;hpSx*}@hrt$09EJv&P8WsJ4nnvSapB8A`oBGD9hb~iROD!Bv=dueyf8D$v~oa9jp?E8w0^9#$J#?GAj*`4HH zNM+L>LpE)c_YU*3r=~mF&vvHCZNeB>$rQF)x{P;1rj^y%v^RsbQ7ku96Y^{q)61iRv(Z)Tp5)AlJE1%;>)i&&DttQ#(g3 zC~{7c&u?yC{W>utfNtpPvsl9w^Z-Ssl7%k|0|i4>(p{U#Am%c+H^Ez4ue=D>5wo zW9M4M0wJ|c4?~E=$;&7`a4kD0yCFMtkH|nzx5d zs993B)wmBG(?3xD@@y@42Ia$_fF={OW`8*VA1hGO!tgNYbQ`w<>7m88zIup(On6Z7$(2;DvhUNg{ZMUCpSr6zSt6m=O4Xz}r;`(azMp9>T zS&h)t!d!2+#hYk&D@qp01C6zD%?!vTdqI+$rAZ>9IX^!y`@$53^>uz8vlR@1|I3CE&(x+%0DLTUg7AO~k*0qFiVV#PL-uTDSt%95Y-MHwJ3G5h58;d|eU4!w zNGw3jpI-dvyXHqTZOaE9Cv=ECF*P*>T>$9!RkE9UOyQ6nA_(Uy^l35 zARyQ=9~V?#uVt`}xwtT7-c6k~K8vwSy?61~>@f3rG*UQnLc4yqT z&b7V8IFE*{t#4PaaI0F5xo}B`zdsTaBYELya0f|pCwpSfeo|b(I zQY~X4Wms_`$m4Wg>yUn?0TKV#B?d2iK#RG{jW1 z#7iuEJ|!?K(`c zeRU<}OGigpODlihHk8NjcfRD^fC|Epy~3z%;XWNgM^~+FT)PDp2sv_ca!}~0iQVej zCew5)!eWE2=%H^oRJgMuaNSJL&hjZKDOLRLvgK=9>rzOy;)|8ZoT&+_+5SFcaij6ugYuAT^-t~w|G*=^ z$;Z!cl#!U|PT7tbF1gwS*QHyN8}h4qq2BS`CTJvw5kJ@`pIsf?BuZ+fr#{rlDuP&Y?K`NEFF1?!gTP@^I&12%p_hNd@+rN~Bj!l60n?Cr&ZA}Kg5 zOx(u@5p@ND<08to#GcwvzjeDa2oG`jG0t)W0^$OmTskCRcxh6lSNgtg$1@nFNeU((I({a4suGZEt5E(f01Yjsv|uW+vXXUj*ZB4Py61Ag){A{s`KX2Z*E%;^+ik@Xk#doqgH53~GB$P42(d;` zeZ}I$;~#%9P2s#g#IIH)(+01SgC9BhZDAs|5ZW(r(d$^It#5G8eWOzNst(0RG1cbh zb|xlOQUzn4VD$Fu_x9J~%)G1hF;F%eLxLoPz2(hY*>J26=j{={+8(nJcfQkem)5CM zZql@4CfZv;QZYvg>nf{C{D1$JwtFqFxr`BFnrp2;_ZgQ}fr-?y;S;C&Q&qNVMMKi7 z@%m`0WoSi{AM^h@@KpaqlXb7Nt_zL)A{P4xm6D6awatTvoJ1a%(oJyg*n@*w)7Ext z0xp1TV1s^yMAv+bBn{!04_?7)7ry%V@>jQzt*z1*D*O5zTG^^Z2URac7Yjp8(`RwX zdp_aeaZaBf?WS}}ML2jJY{^*35X3141wvpLNR_Xkt$)_xuA428d-clyFp}EnNS|@c zJ;(Fw%H5}^LcKmqucvvczfvCBsa8Z`McPc1ubFxMbd#nZP8ulO`QppcH*8*JRP#j} zfn?x&y5xF#daEGf_c+|9gc}TeR?H1JHZoM>#|<=b*MGYRGCSW_`QRh6R6!J?aZ@6m zsaE!!EIGxG?v`JN#m{sK%EzfN;>~RG*rmNR*iu4CQiJulTAKbx0|0o|A;@)kD2coC z705bnqbN#)#f#K4;AuEJEr_`On3j-|dRn9oA#s0xPT?`9=wYCOBO|q#kQ(cSgv*bcQty?;>nX`yq2GK2}F`Z-0lh6 zEq9U%hsBS+Oay3ZY8qE*!xL`FK>%u37%6muda#&G@KoF^IVlP0D%bn)*|R6?4h8I4 zK_;6f>`9=OFW&(U@PYJ;oZhG}>kD75!g~{>TNVhhk&tlN43yb`@udVGvO9M+;fM8g z;}MuRN8(Y7Qb1u=57Jq8LiQ77)Nd?fz0(iX|I~~vEk8u&6pFzZIvNg~A;^d{&xnuL zs6Il_z}6xF`CmP-554Xpm`>#1QJ;{Q_#ua&!_5qihS<;`3`f`_pClUj+=VACE*!%! zPykZBajQD3-7!@E^5hSl=s|>smn{Fjr8qHOwu=NUYac$4pKRKdD4?2(!{HNl`}XZa zj3iydvr(RKP+omnbGig3Az*orj>Fg4hdE%K2@Le6YpriXHf=iZ%Oi&-Sio|V^Vtd* zaU@>!zDe+YIxzHW*2Q3ZY5W$GQo1C3E7q_Qx}h+3IUIoU!oelY}%kP*t|K1V0HX3b$E#PyDdlWzKWv-?_za!@^!nn<_we>Sgsbae;iQDuf zoLXoWvwe|RaD{qn2)#Azo$JQ!Y>j}X&$Ayt(gNALMiaU@d9cdvPqGgtABZr99r|Mu z(@an(Q_!`rsW5-b5_`%RdzXiYkVk@cX@oP&x>(%`jc1$;H_fKWba6SHetK(tB!Rjy z|MB3swG0`OQ%aa?*3~|k%cs3HduzR~X+uh7bl+(Dfj?(A6D*n~nLT_FHbLSAg_ZjQFT@`h^(#@-T|UUoKh z@gtK7$*wyYe0sD+6F}g6A{S$P>x$Fg?QzL zE&WoX&84!BN*K*_lBt;>BivBbaV1yBLi0O0RifPW0Lh5e-XRM}1q;7QGm$7y8%@K_ zjSo=!rOKHsLZ=NgRc7a!j`6~diB03a_3VUnN}DT$*N1NxB_Fo`$o!LC=LXD{{qZ8TG{|-Y;gmS~CoE%hUkGGtf@|nOmdAvFMhQ?V zT{cx=GJyA`yITU}E*f&Q(aNyi%dCF`n061)m)?i4U6Qw@tg9sK6w79WWD%Yj3$CfD zx*r~M+*vraHtT5)pi4vC?AmBl$!-^~zTv1N9*{2Dp|>DoPPs=!MivTpK0PC&4{ael zU?V`i)gr8m{@Qp9BJI*i*tFYO=t2QM@fO6Cm-Y`3Sx#&pJ$l*#jL1Lk4i3KBY=JPC z1n>Z6;F~w~DCuI8rc6jbZZUyo9P;8WL)8{qUm@Px;EWKmnJO1~F;i_0r?wj@;KqIF z`%H+UwRLq*sD(WoY~js7+pwg~M(N*#Rh0A6qvyjk#$V!>$?4ma^v4@d`|u6s@b{y&|4a$i$k7VOZR zU`YG=aH+g}8uAGSdqCo31C0Ptr67;@8tOLuy=E{5Sb=gfwQp_jLVX>V(Lbr)`b@PMJF+)Vjsjxs(Bb=B+V#k? zM#xy>uS0tDh>g0{LM@fgqv|^lLWlA%bm+(Jpy^RK@nNPCZ45a3hxddvUgP(k-J3xB z@a1n-Z^vuZZ{cWPq)(mTQ46xYx+0eO`{t#Hs&#cR`GF?P3gnaJF++1kCOR?piP_pG z)C!hnJFwp9V#ic07Gvc-iC`=fGW}MFj7rNW1|Iq@E3>ZUy&z?vVz1N1cs{3#4g1Px z{c&2;2CZsO3YH~XJS(KXY(Vhi)OwV7EUn5!fM z_3skC+GRlx&sY_OdZY^@=FhMzzCM@nl(`0t-teY_u?uX80ib*Z3|Zt(uxcJ?lV0vdEi%-Eb=UF2&JOEN&u^yI;^g?s zaW}Vp&2n9LyOwCl*Xn(l3^-TF9(!FATG`oRR`~1#ED{Z^kN8-|yAVzNFzNLdFu(>W zJqrIO-v(*QOB)*k#KXhG^YAYks@1(B_cef!Ok}v28A^#k&T&kbi}3)yS?VUM-9HJ@}Dcu5%O z56l~S4h{m~l+lObKu3MSLJ?fM?m-Jl*a?`I4=wl;KxU=ut)>y!3WtT#iitje$i7R3 z0k}>=jl2y`Fh0=389|9`B=<;UwLE;QrKM#`K*a-WTBfh6cR39jtUZ3V6I_P~)nO>G zv#^V6)hjYY1DwY9-8&p`=eiuDOhDgRtzWYEi6F)zu7Lv~#!&_=-f^B|8&2!q0heP* zW@e@_)R~|D{{DBN(u)SR_^M_{o-upa$jP83FR04D(|I0B$IgxRBJBRczaXY&HZsRD z+c{$DsR|kQ037BkADf1zvWJ#&6o(gzUYT#0hCV~XCUFy?L}ONp>3eNlJYhasgFaQU zC;n*B1GyzoLd#cCj_>c!E44cCVzM#m?gf-s8ii~%ILhzgl~{zg;$G!FnMdx|YIb-J zpODjWa%;%knh04v9S^OW;+iK5Xd&P6zG{eeiS@nu{BfUReAR7 zs{e$9E0JVwM)E+MM24DV#tZ)!V?>=-(IVOq$&P3Ohod0^0!2&zJx;n>Q@RJn-8lJq z{q5B3do+UVf83mFNL zBc!CHhpd?%gxuqO*%}!5;InQ)6}_FYz@c(mj^st0d!?m-CXeP%{?ae1>DC&`%Hkyx z))l4ouN_Z4&XV4MMA4U>J=j-@otDsqOBv1`2|K29~ z$F2_pVh+BgCVd%Y(pB^VWgO(o`@3$Bek}W?WGM?7IpB|~Tu)zYQ6`i( zBB_<%?XE&fWlQo->{QPGojVHQV)?85u+I~v&wWyQ&sy&H5ellSG$7)TV+;7x$C(*j z@bZF;+BCR8As2X}!At0}3{y6Fig>q7jE*`R0SVmU?ARGf&m+jK<6wry0pj`;TX{_rpc0l9@MNyyc94LDttK)CGe>}-Ou))`!crmzgX$d?WU zd3i^*veoE8>BA@s_bte*Z-V}DC}YvmE#V2!-CgBP;t0Sm-7Oyl1gXz_dqnoZQwt^ zYJ&(0kr6Z)q{!h9Y=v0vx6xfDC+EY|2(RKgT}-QZW{G(2?@ja3JWktL0(8{wtxdG* zJYs06zkySCvr*{_TZ_U_X5ux!@y=nBsdaJYtIRe`f8myr-tm|8KZZWvz=|0ZMi`<=M3~uW`}41*NHCZ~kkr)<9xbZ$ zLwUkPB{e3a{7Z(@^K?}o#`2f$nUz1UC1UI?Uu^jIh+O7t;eAl59(fg2f{kCefTtUCoU}f!dMVCZjv%4SG zU-`0baNX3O+EF-Pl}LPElrpZ)N(r&JD6cy7y2H?u8 zgZWlJZ5lWIRByMH4p@D9QsVG;AiZ5lsVwseBktgH6fJD39RlGzju)!q4R*;cs0!LY zxuy_;i?8}#`@1qfgI?I8^}-|Sf&!Svbq$`Y&KJ@GAH;?j#c9aj7+ z<47UuIg6A(p*!ZAn0dg8U%q?)h zMe3dndNeW45S|ja+RggjSw|$VVZ7yc40psGGAY2Os*LUK{WL3h&voEthCjNqciXvN zUAMKfv-8`;M7`Bp92CKCFXgcr7G94v91J91vPH=WwVrYL{GTxa%+Q{vha|v7foAlP z#R@7YwM;&m{Y8JG&~>1(cR-g)i>`?+J|9zF45$dV3X(f|Nm#yW*aUkxg9@whkE1|7 ziGWJ`k)wd2{%v%2_Fb8@!OOU&CyI)D7{mv_XGMoEof^;6Dh;@Q|Gpg{7}h8i^{|(w zrb@Q3ZwE5*+NCi2?|NZlTstf!Cns-^J${@PcQ+3j{+lsjVS`nG@Ij;0ZkmWFRbFk1 z)+#j>xWmkx2K0iWvN9=8PtO;yLl-4WXUyq-8;@gn1e6?Y7`dA|hK5RvK?Vi(GVkC7 z{^+1Zq`+UV7?|F-P@IHPI2Dh^~~{D@M4)Ha4u9XTDK^ z1{sspz$S0hoabI~7M_JS>xkBidlXYfLkE(#pPSpS{(B7n0N*Z?Z*wUWy}iK?uh#q{ z@5Mr~Fn`gAdKBDcGIyyRcn52SA^;5oUAKbt5nGU>%8I+*W;+hOAC)kN*OvRB`!^?9 z+~;?T1|5^Kjt@v~oa1cGNip2LO-L1TO#urXp9$T0owqHmBgOKLY=B0qmWj-xl%_G~ z-GDtd^y{2@R>F?0-coIievxI^is<_qSITl4@l$uL6OL>O6Nb#&y(lEt@svf(d+j+%G3R1C9^_a$&nzb-NhO$Z->`w0@?`L{gzl@=5Jt93k^?ccjfr7lDS1J| z(zzkROUvV5&x&5`ey(;}TG;+=bA~KkZ?t~j8kWH_p{bo=qgVV5Y0XjzpO6XtAX%t; z|97~_XBro8Jhjfd*WN$coJZdM3`E{ar#%W_xq<0%sxVyvW|y ztMW_zr)xLR6m9u%IIi+F`>_Xy<|*8bPI?$~C#okfYFIYX%ItkdkeTI`kK#B;!N4z4 zuIRAryH!_iYwFs*Car2*h?Gljk@-MLvUhsq6bx$SROst}Kq@Pq_zT6Jh*TC8pzBd$ zNZ@pY-0bM->*EZ`P$4XhVR-h9L`f$}+O!wFs9L{8 zyUJsokYe9dQ`OV6bJE%hWzj0}I%d5=762~dd! zc+MWPU^7L$hxT0KV5%Q>>270CBn4pHcRM@gHQ~MiLMwYH>(`p*;P=c4zW!%oK$g#h zTcC78hJ(=n<@@sY!E(-lL|o0y?XV3j6+$*a^zDtD{NXov`^ce6FoEoGR7k8^`1Wl` zPj|s5Ajr3^Hv_Xk&bDuYqmT*51F09VNDGioTUDN|h)hblScmmiDD1;-h@I^YgPBoZ z$jN5y)<7eIfQ|wmR{8NM2HM5{3PfTR(~&qU#g>0C~al&7<3pfItpcjWOEkc9QqlAV#s}TG?yt3`J_I zkqSk&PQ0PyPo|Ib4@qi?uzl$$i;5k5^6MXjM?Cv`IOSZfP%zOvsv6I>oS@S>S@Z50 zXOG{bIQ4D|t98xZSmc9D%6JrR?8b9m#nV%MgA=hEqdm@=AQdw?hncA^n#;iUaX8~J zFr7ey@(Tz!j&R?d#%Z<~m8R*=&eUTO(I^m7@qBvV?Pw4klF#vPr`2so@XB`Kw}rL2 zYgS`+*uCF#6&SS=G|ZZ6XrmMUEKYWe)LY0aNhQ5Dht zl4gMWh1ll}C3gIzrIPJbjmP$!e@6^w62JPuXc~X&)@eYnuh~nvD0jBN_Xb9-pBl4G zZ$JnAefca~HG9OMiBr|U~&ldZUjT6)cnf1u1ft?ev#T$OdK z`^@3CJd&(x(X=$g?(2g_6H0xu61Lr^Rmy&~{CIy`?i*I5zg@#xQES?0y~lHfgc{-? zZkl{%t~v2^-#MCmqpzM%6#qQ58zqX7_BgPf$y3t%5+bjM^XJd)zP|Rf>)TU%W?XG# z!R+;m-C(=H(?u=bf7By!FIL=vGB7+!lJk$CzadhboOU-$jn#|kEWIAm#1Ek?_yOJX z2AtV^80i$e6sJ{K$f(hpIy+gqU^8j~`1U0V(6iLp-!B6x_Hz(1&xfF{K5U2*rJ(LI zyXU%@iM&BpPz>EWF29JiyCtIFWA-Bmwt@#SPZ;}v4zR>yJ41QtVq$1WcLaZ>8i2jm ze6EQrD|U~-YUXX5Q51gqpS$O7{Xo}{d73Cl4#mvo+V$%llDwM?aT)S5HyZBX_&u4Z zcFK$ZVC?d`2=6jM##)`6Ho*Ip8luk1V42l2JWR?c3l)kKBHG_I(C4bwz20GB=jAP* z23=bb6g_e%=n@cKHdptWbep#h6B9EC1}Se4Zceqs%?rwA-b5&RV7{RMlvD)6=jH`% zz3XZ1465Rzv(;IE0b;E@|MGXFY}#kr0z~n4&r|=Xa_R)DQArmKLU3|T>FMec$}lEg zpR4atyr5EIUUu*7?!F}XIlm6~lN{h4>$tQ0@*B!aSZi2CHuA9B5cWR~QzIih!30)uFXf|KIZq$v=jG{7O-{bl zFasM^!oq+=V<3vD-oS6)x11Y}a;TxYd6O9j!>naOY;U|wlNBAk*W{Q6N~K)?_*otY@li>UtB zp1D?by8SiYX#o_=?Su!(e&@)9QlXYW#O9yLNEbUphpy4l?mZp*^D0NI*<2mc90#x9 z(vWqn@e3k@lg7c^w~fHaHz;U(+NOGR*>-ErG{0;62bh{ZKGTlAt;@dO;yA}F(ygvz z5vWf)Bd2<8F2LX?I3@r zj{*;Y9tdiDk)$k036@L2D+hzkF$+YO21d_-8#cP{N@YgEc#Mcbt;9QQvHMu`=M(NL?EMAop**fR(L>bC-Vu{59uE4mjla)aU#- z95N_smB>RrnkGq9c;P}R);&;fhJjvd_cd8QRoCFM2?Il#Lb|Gj&M6YDn#~@M^!PNz zr?}etP9+1D%?*!MHPot@Ua-cd3(-l=eMGvGv`cCj}?7H*9;CyFwqvu(ZR=y zkiD^#=(ICCs{DZ7-afq$F7zWb)IOn)n1qqV_Jz(eh6asHW=+R)zY1%<>G8h40t0RB zDS1?nPfi-uc#itI2SqTi5|TMQYQ`OVl~MK!a2g2i2}}OxJHj83wD$6~yvpIqHZkl& zgtLnkGL2!+r2irG_{&A2P?>hg3cmpUifx_Qt+nyOq#dAu4OTmu2?Hr-7>MLdfShm! zrDl1czFcvCs|xuzN<9-0?65ag<-kx1ta<=xs*sC@jxi)($5j}7w+VfowfQA~!*Bz0 zw+hA^%wQtPApOBjUqhFC`8k7mocAMQsVt>T4|hwfag#7uS!z8G~bcs)zws{1wCjL}q51sXAMI?lQ53dXj;zI1ISm z9L@r=bxphOqm9m7t^0Oa7!NMcY)PDZ0T5Av5 z4Q#s!f?Ne7)ZwO?VJ*7=-_H=BV2ileN%`dmH zC=Gqku+)6wWCHB|pp0X&BsCQlPdIJjcW>?JJ(rGXC)j4?E9j?nO|p6UrX4FnP*A+7 zIqL6+?&sgkWsCd@5?I%+GKantMb7J9zy?pAxd*SFc0xD6p$rn|#q@LF_aKw4pulV@Mi>R#5)$^T^+F zVAHf#vE=C)0TwWfveLlp;vOY1fB3VuuhPubft+2_Ay1cvA|`mAnPPABDRS_wI9A9wddnyxkt(WQDf47*VUqhl_e!$hTpsJ&=y=|bmA1bHEfo+V z{T)-q<{xL|HR+1e73RYg94$|^Cr*xni{`HTeaZPX^~=f5@t%r7u3Y$#?JetZ$>^Au z7^o|Vlg?5%8|{|M>JTOr>;&LG-c`rRj{@e5FjMJ2w=7VpP~JDf0LFVYZ2t_j!Uljs z)lHA{jRM8a!Ql+P{2|G~C=`^TrIafTfd<0w>kYGtHcA>0gkG3*z$8>dM1PSJ$gkmG*gEgR5fdS^yhYx>yaSz712# z^jBbN0c!vE4^^djf^pyHmZSpMb$uWn#XF82$8`!_p^FQ$hBnI@zTNsP0x znaE_@FQg)hOEpL7@-jd;9jCNeF-Kml({7RKHPki%jvL7%dt7Zvq`o*Yh~dBi0rW zA=GTlb3Y2su!tKAnjg;L=QlqJZZWV9nh1W?zT>o8`b=!db}Y*5#YG?WR56Emza_T2 zx2w|1~QvL*Lrb zF${{2k& zoWXWBX`*y;^vm4vT$Jcs?RS~D47(wo`q+%sK_10gbaAVuS4IA#LQB<&xO=-F)qmGp z%_24b>8l;Vlp--QQVO=spFr%w=e5*LKGo8~Q2(LcC1Q5nBqucQ+2~jD;@DmhE?a}- zc@g2KVq!m^CY`>(7jd=64#~d%^lGxqqXVx=~R>s zSD#3*LX|2^1XYe}7rEWT|EbeHIpt4^2i6QWHddYvzbfqCKe>*ViE!U0~1Nq4igZ+^%d5R-e271r=;|x30$SyXW=x2=NN~CF-Fl!82$j z(GIV82Nd6Ld{sp(&Lcr=r-N?oJFv25caviBL5qI~*;Z=z66m$Y@ljUhaebH1?<{O2 zIKWU}zux^Vz!NVc9$%Lm;Hf7>30{%@&G)-<|MVd;k8#lFXf+hnOGQ-2=lLy9p!PS> zn>=OTXO%4u4>r!|P@&3Qb(Qs@+k~B)0@f2n@34tzG-(AKF&Jf|YpLN^SDJwD=zmq8 zmfix!@uslHes4hk@=vHRojpBldnSqr55wTIoykVz;xCNk)*gp{Qz#!-(}`K&C@}3H zBC?iL0z9^zR02g-&$A!mKFXzVyLNPL`9&(vkUMs(hvtIg|K7hfU%GeVaT(ae7$k>B zW=R(YjtPy8$f|dj05p_yYNiI~A-%b;xIGVyFemHl{M8CMCH9Vq?AKnQje8M)b{770 z&6y~Szk-2dpTt}a8@qD`u+r0v^IG-?xr~yT#Hd@!}6^FUj)s-!SRb z4TwgxJJr(5JU;17-QiP+!ypVqhaahKYoVf#f>}gAvr;v%_TxP2GfomLZLbvBlH_?# zzJsyK8q^S%U7HbF?}=t$(z`5k6Av@}Q83g=lz8bR8uQpu1+fVe4id@b7nbsshkPKf z*5PLWM{rvSFq}c3EMaZU4yL}bTA+&r7Rjli)}O2gzrWyViZ#-(v9>i-n*sbqL&C$u z_h)LHb2)?l^?42Aj9BiaJVWbn{l1;J{_0>g*D$JVAWtcAz28rYd4l+ zmd~i7{&)2nB&%|$Y6yFAR^%`Yp%50>cWYe3AX$Nx)zJLB0UF)e7O__PBdaDKwA+xE z4(>VPPu`M65(2|`0y<|atWvB&Gy6&mNSMrpF3EBf=7Ueie+iMpM=#b!um{ui z^Nhlxa8S;#nVPYG6KxkQ`=m9v(5$k`IWPF{Yhs2FfM^uxO|Zd-wOp0kwvmefJszj< zkF&I%cISH>r=2Q|RsOHY)5n!#oOf>PJ;bMfXLv8f!{t?rpM_-c*-Fyasfu+UJw%uG zj=F^gAS`l;ArLZzC<4XiHL4EYm4g4z-^*e1`LOtNER98FzaMpt)lt~-VZsB5tFc%E zKQ!=O6;Dw%gbUFU3`Y6@DR~dCq3Tl&kPB7Ohhd`V!&chcoR|e&0e~?VdG0#==9?e8 z=zQnli%yZgV6)JJcT%a#OEG3eb4wNobeNQe;%x)+!JfZka|pW=I`$6^Lct*AqV?xq z)S>6-kMeNQd})WWS4VdZ^ihx1myH?^d%u127%br_Mz3ziO z*GG-qL`}4gXebT@=HN;K%cV~-G1&0m;qkE}JQoPKuuxW83^Szx1SKb;l~iVxXxq~K zr!=N)eWe+Atpu?{a}f?(eWRBgtVS?*K2`rB8UGxq6(+bGA@L9S=x`Rbx9f7B*6Ah% z7hMZgpFHai7uc zRi+waUIAp1LoPipM>Xe8S{p9pV7izt|E~6&Jf)^-IpOBcbbjhASBep^m*!QReN5T!MA8Js+(wLp%rk0KlTMzE#A{+DwK(oAb+f`$;}4Ha-8zVKZk&yqZ?ski9 z?kbb#5Lj_ja75m`ezxASWc`BU8^sX9b2QzkkoeS*w#>c0JPKY($?F(|bURi%&leF{X6o8VSpP!-al5U{)2 z(l5dS2_jgbNQb1F8rkMteJ)l}MG&r+bhybcpt1~8jXAANXQ&6iW_x}ZTjx&sW;A|Z znPA#|*-q3e{honlZ6-Z~=%Y~ikW&Sdbbd!*)vA|f$ismAlIr9ypZDnz>d#ck^Yi}e z7c8AW#{Z=Cx}WJLapPaTDuAP+u1h+311Q+h};hp8jtkEi1cT!mBU{_KuJ-l-w|~E`n)W4Re*sX&?Ax2GU=5O;&5Vay0Hy&lS!*Wq zYE^_yD!qRWf9gWh1->N(% zSUSvijJN)eOi=J*`JLPb$5P(7_Xw@UYV0o130I)SABIBx6}|6VV%(Nr)pFMJNsJ{= zV$cT9`h26<+5R7$8rbgfph~G6^=0McQjLv_R-)LR51~GSU9ApKah@Kmjk2X{8Wvj` znRy}CGrvn>yXdV8IaMu>M=$fg`5*9j&Sifd@k4oIl=Wy@n=4cUNBq$T|L@kk%=|X9 z^=@0uKjmZk<5^eM25%0!dbhMSm2#)c)kn3oa@{xToL77C*x^?GQ(_vLzDn!A&+#){ z9~Wy8sqI{OfKmVt%#$`i6MvR*{s}xnTsF}_^$YA~7}*T26v-Kc>Hq~qDFVy+cWG>1 zx>Gx0d6)MEu7$%76bk%P&kpw`de$h-tgTOb+uNDu+S{cUH44XG(M;r;9pP7yGuKO7 zS`T(+$=x0QT3#ZdWqb#%Uau6IRD|MY6=bqQiujpL6$@{jg<`N_2q)Gx4EWRK~|hZvU8tk<8a zT%ptc4*c>W?=Dz)!T0_xyDK3th>qlr!RFZR^l0OM5sVAc&*zf{D;#BVn35DFXua76 zN&1nWPl_!9c)gREa)~x60muLU`+%gMr~Kd0 z9+NH>l3(Pjd3woHMmJm{{r~@WRHh*_@BfMq{(AA>e=7cAZ4=v^<#9b4)+uS5M)pEZ z*RA}3He~)Rr2Sa%;X?&G;LRHo2DX6SL>FeI`tl^&k@BnScOuZ18%1xU{I1@k92k7! zL78rDm344oIdY$`{3yckUbUbqdZLDZ>Z-=$WEO6%OqJKqUzK?Eq?F4d)a97T2Uk8! zqRK;2Rulw|Vrah=?yV-JFhmzm^pfBBab5L-0Mi95fqsuCh(U;`Bk4OqK|!p4N2gfi ziOdmQfCh5coiF_X<_O$~Om|FD+TfTF-^m4MM21{>v^)JXgM{^`AQD3#b z&>s^_?NO<)mr?q#qwCjCkB?xG!ldbpA@Kp$a_WeSCE4Ru^EgqiuqR_Emb^ZqtB1lI z*~3vMH`$qdRRRXLf zEMmGQH_6qJ%Dbwiq(1+wq@pGBkBP1qOl{mEJ)mOq>M-ir{Hb{#;dY@B3^^L^NS2Mr z$YMwGA7b`psP9Pc|C{&dGj2-=6TYZlt}WQ5{ytl_tUDgnkmh#o(f2y zcKR@lzb{0ip55cykqeE9)$^cK&`yhon;@$OV4ea7$6mQ_AE2Y$2e{#wd`FIRMM|4P)0I)Ys8p(?Da7!+HD2oF{GwV^@KxR0UKR2dq(Y~yHn*71N5h38gUsR!AXCFK-)g?o(|_4N>PREG9<>BCCG?eEUDtkLoD%^ zE2RX7f$pV*>d(#fuoor^^n{GThzgQKzKxEO13~vOkwftWCwTjgT$)Dd)w`1eIa(Fv zhLJoIU$cw~t(Ha}&2geSl}OFL-ZA~t-Pt*Tn{55=?=cMY20V6i!e9ln2+~||B4lCD zlWOcNrK_&JLClDD_cm&tf_P%I>MJ`t``Gs+F+?JQNl`BCvsJnFC&sJ!8hG!e{2m8W zkUN+05P*?0RF7&9vIk1hYiZJ$b?}wzbK?X!y)O(v##V>ENPjKA<1Cn=nthl5S#=mm zrfOJ+X=$Rt*-<8ke-CEo$ znX*g|Yg9Yt4Eu)qNxRlEhx(*zJ6IuyOP(fV*--pyvz!>w8W+1;YuiBd{OvZ;5`7 z<$sAYj4TfV_>X$RN}rqc5hwgtqC%(174dyv^a0bC%?{tGP)$|GF78CGnmRg-CZ&^o z>eQK|mbqljP(H1*m09$|8D&c~*&B-`Pjpw2>GJfdjr%GpVH)v#X9B-;HE)aLgve?x zRJ^yrW*4B*k`3&ISN~Fe(#`am3tdlfJ`uH1R#LJ?M-kkCrl|$FI(|U-8ya#<*UtC0 zGc|Q#6cZCGo3Q$7*X?5qjtpoqTm}{9vo*YzjxL;>oFJaCxd3Z|S(^gmSQc~N&Z`QlN&+5kS5qzd;d z%?MR`9HXybFxQuGB(~om#2IAebrCz+z+Uf<%lZ!742Z2Kcu7dD>h>9#<`|jEFh?zFluWpU{NI_v-oyJ-e7{S_QB2xx+dDBU)R~}N&V#V&Sd}QMsI`1 zZzLgBp#SyULESPPPu%$M+sUaZdI5o>sGRm6bnNUOB#B!eqMYI@WGm_%xO&QMg&gha z#PZm*J{xF$zd{$yu9eDci~0*GC-KjeJ_*y9Y;PCRwCY}COhPrIKd}wDPR`ymgi1rF zX!{!)qeO~v1T!8)}L@%7q0iwj*noxO-B8lmjBj&UN%w8 z^nQYbPotRG^xOlS70nYG%BIPR1AIX&mtWS?9$3x3)Y|hgb6Q&3+JeLOUVN5mw|Q-l z)?A}qYKbxCB$Uq=b6#v=n!=af-VM3gKNYgE%H_tqAe<;Ql|HquE&)=?Xz)=Pz7QnuS8!)uJn#B!p{G*IC}j*5z`dZ$C@oLYfy>%E zZT)*G%-4n4W2RMPjkQ3J>itNK2z{HMzc7Vmf%TnhSNoF0Lcz3F91^~Tii?ZufNmGC zF;$L-GL2P9^arIUa*vZ!sdafLMU52#&+x%&1gdu(&<+y-;}-ym(v~?a`7wBmv4F#A z1kzi4z{?<>L4rO^oIb2c8^h@27T5L$1W;7>RCa94Rv?R(xf;FCtE;P*zSmPkju*BZ z4>Bar)mw3HFn)X&6vUnW#J7Jr4ZM7q{s;&P()@I+CXmh$OjIHxCx4uoo-X?&JQ5;f zfy$_zIs9H%PtT4U|Cy$)uJF`{#T+zGiSS>pk5WEO!|=BOf{581^#{!*?3c5kaq-cVIdd{Rd&QR^WQ%^U0f@E#u}A@zJLXhJCqa@0kFJ( zl&@jOBVMx0hddp0Mn@45g<_uciB-l4_ddT3<+f2`iN}o?f}`T=DQH{nv9Pf{uq-Wp zRJ2-4yRk(6R&(#WsCl_|Z;}`-e#?phC}mBfBGOmK%h5~PJ>=}s3b%QYI{M`WB05c< zWVAYO{ScwsB!OI_WsC6~`&XapFaBD>P>y>2NmNjuL0~_@r^S-c9phwi=gzz!`DJLzR4P0vf~U#Xg5q_O>-IzrZLW1C8uTZNBKi$KCF(uOBn0qqapzcB zSWqYkirSY2Vq>7-bEkZ~u)^Wh)3urR;DBLSP6f=ZMM@!8xV(!lM^;8g!=7l4k3bOU zfZ1G}7z1!yd5Am-d#FJ*XM`yA99*}P zverRK=6j~6olLS6p&i&s9sc=9TI*Lu(WI??$i-o%3B`_nDKX5$62uBQ;MqM8uxkSs zhzw}{6CCXAvl_tf6L#`WYtYI#6&%^XmQ?Q}t=PGQn%c-2CLTpzPNNg3i`f8ZSQoJz z$*R8;D~%_|Yw{AqK9xe+=&z zWP@~AkW;&ig@uX9)CS1X%`lNQpayhPUkXd-ZoXMdGD%Y+h>D8J%FC0owdJg^o7eY{ z+-X{JY+iEQ+r|&D7uXElLi3zYm%l#uQ>S>jVMf5iuu?+rArYq-O>o>E&U~DpbIt=4 zi0Lya5#V|eTYXe~`t)K398GD{ROh|2hF5_wqkO$5RW?5}D>?s~f7sun8@Yaq5Zk|H+P~$8p*a^~U#*M3K1%|PH+oFZ9mO)Cp>Qq+ zkt1!9p&ma>aoO}j>cS|wW_JPJgQ;(UwBDLu;^XCc=YV&`b`IC{AA+hsyAXh+2m9Ym z|Dhq(_U`T=6Uw-&`1p$n^Tmg5v-d$lEqbp1d|Kti=%=Rl`W!|x>6)l^gMa_e;Myy4 zPFO@=!C(mv!iyYX_8uzdv&g6@MFJe0s&laS6oL%xdC1PZMJRItO*Kk3{P157S2p<0 zuV!?&FFA^dx$kBriqk><5a;+jKYU}rS8N8r^gdWKUgrG(2^V+^l^@@~KZ3mKC{rGl zRN%dvzI=%p_T-J=H%wIHot^MVxtE|deOoK5uy!F7S62N4-D z4bG=k>mffoVy82oHj;HO3H3Gvlrfe(&`*U~((Ug8S`GN`XeaSV&=LFeFZ=f|w@fzY z5#vTP%0h+L)T-*1dDtQECrsR8A=JcIdX@8(_(uf+ZNR1dEJ-V#7l);~CkCT*GeR z_j+-Uy)2Sq6n80CsV>@F{rPia((=zp<)kt*b|UdQ(QM;&L{T_%W>VX zcF_YFUo4MddD0LG(_Ft%-G+m+#`%u)9aiJjLCd9CEFMMUwUO+HZhz?#keT`yPt%FKS4HV|p+HTOg=mvs7S>v8O1Rs*IwWva{pnFi0knq(ZJ;CFp3XwG`1$k2|u>72zUcIVII$R0kd&v04)%IkO)Y(=N z1(NE!dLYDn-}RGT2C)r3#y(r^uGdY`oZ)b6-fTtx*&e%pkTn_$w_BdTa=J1L?uQK; zw1suZ3z~pjEn3L*=>V&a5wgeW=uL1%PJ`OZ;8S?`Wq_l;i_1ReXPi&haWKwmT(^{R zM%TulXecP)U&^O}li>e?QcYbw1-Uq{1B27u2N8(*_w9oNgU~pwz`dlm*;x)&De(3! z{7CHS^1=$)9IMg$B%`{Bo`$8Tr*}P!@rb77UIIKuGl5i!wIAo^Z0n^zN@0d}9Bux4 zS)$BYiDej#r<$H0Q2A6bYyR^#!!|_Qe>m%4`FrGPUtJgH5n+&KJ}ERE=M1JC+Gh{y zIFY{KRF;vqrXW3BJ%GGKVvH9XQ-6i(9Ak4Q#t6$af}6sO_r`YOEsgG1P{)M~#U-Mgx+tgJTF#O2S<({Q%sP_ONtROmmeu0k-oa-6s*B|(j3 zHaRh2oju)GpBOkZ{TgS5cp_K+NhK0=m6QpTqgU}L*bUK6hh{GNpU78WHMzUFv1fVF z1lLCH^>F2u6KCd#s|&5;mTt4K;i3L2m2EeT*CR27Y4Ch! z$gNKg4O1UoC$*xP>(-q)`FYRUIu8xyOA^tvJWiZ%c?WZuFkieVuel7RLAZIn$}@~# z{(+$u7Q3YX%NzD?p1E2{o~VEn5-KWOzZSH7b>o?L%`CZ}TDs=yl>GXaA-m*}wfO}! z36Xp6W4HN+Qfss?W76f2H1zaQU)!FJoOIHZv{%Zf47VaRuz&BUB=czh(hM`P_bH9W zNb&s4TFU#lY^~GxHV-+exsSC-9G{K$_`;`8*jog+lYbxH6}WIv{b$wjx{|2tl;`(? zCyl`jucPlaoGO+1kVEETP0ko>FgaoX69BkvF(ic1iSbb&IY#=cbqk0BTbe=3c@-iz z?+Och7R#jzTAPSpH#9aL7XQAua|C_(H;`QHF$VW98^iK-Wi0XBC&a$Vr-Q(@QQ?086(nX<@lM_@!nRU&^N#*=F+x3tr$gps;< z`~Wm_EPEH{CN69~$~#AbaoN<=!&$1sI5@$rJtJ=QevAv_RUeLoX(*$!x{eLs;aqK< zdpU&PnCK9??O?)ut2**svA>_go)Yfy!OFW|yX+XpimRf-IfP79$ zY9wj$^zYZw$PXQKw_Btv+p!DwYNQ$1N;+t}_1Dew@1gL-^klpW2#LKsRW@ro_UKcmn6Vl3PHa zy0)=V49G(W*@(hO(XYXhPaJ8wU$ZrHwbi?cP4<3P;FFXe-`8;~mA&!1&72pLFwj^v zpI&z8>$*MYeu{utH-c6S<`7C@a_K^7r+=kGoCIzktyic0%G%4Hnx4K+M0qb67v+3t z--1>G2@ey#)02~4XAo4|PXlgMlMma(y$!n@!p3#x7xba-5Tt$Rv* zWm#6H*DLGh%uAas-)I|u0v9I6My7zy@9XN=rp63cY+9KlKHbm~IO5Q*7Fv8=fNz^G zl)}EHE@EGO>#wC=;C{um&Y&Ri@LOrEZhPk#GqT;^2IYw)vU7?p`d=%ru`1_SD(A!< zAmw;sS0s|fa|>+e6I_-ZtHH=CP$D%VCdMoywQY@@BRwb9#$>LuE6Yf|@wgkCpx zvF41;fo+S$tvJ8h+7kgQt98ELH1i*RrCR}8r4i^mM3*L7q0py-^}-)WJ}*V1yLWG( zbo0i}YGzUiv@J?GH;gF*#Od6O5Hqv!d?<%dJH(-xhq+DAcEYD4$vf!NpJ@p~N|YZR z9Wl<|!);@bLNc>PHAmWspgi%Cuj^OiX`%R)BV2wck@gE+LzxHMAJrs->}l}t5rX} z{OahN?#=6qdKtehez0pntBEPD#lQZS05O9cfi4GVR2iSCs^0THb-PR-Sh%#qZU;Z- z`;Nb!IKs{eYgmX!O`Zptd>p&KL9$PCI%$X>o@=Ejtf8V(d|tb$7vdpJnfTl2+ga@o zkrTpS%M{W6gV`zJjmPz=b;Nl}m<>@3Gl_rxE{xex$)(kp_x|1p^F4eeg+iLRDS0oh zx1QaT7xUW`F(u@rJ@4C~Y-|Tnk=yBE@zAF@u(Ijx>Qc`Yv;=$A6y==rZnMDP`1t8i z;2YDUOLarTyd(pIKv;Ewq$Fc5U*Xsp^nSd-)>q$t;{(~ivC03V>MWqLOv7&dks>W1 zT`DLI(jg#H0@B^m-7UgPh)NkSfV6;!v~-sUC@Edi-K8{gZvOS3wa!^E>M#x%@Ao`+ z?0xO*_G!5JVSMG{ygx9AGJ*5xH^f3@O&zQteQvYOXcBKb4)Xj1fe8niSePu?p*=^D z7V%XW(7`%k#_#*<8&|B0pw_ve|JWbU-kPksW4CQ2V`(KNt44xzhkTg-Cup5k^&kb{VB{+L2nWt`Ox1RUQChP zvm0@oC>CyRL^qmNWZ%@j;xwRs9G98=yyqeD_lC>wF3G`j72nq@KKfcv98ZF0?CioXPi`6rFsMrm+1+Yaa5R8&#|nFJwVGWT(VsFvd&v&BsZ9`ZDNx*SVW2^JR{ zTlw6CAFG%xBS0spD+h5oN9>-!M)MX9IxJm;Hja_=1qR?B zzPc}TM>EHkRqKn+Kd;b=K5ON6o3gtbKVOIxQJ{AJJg|IWtDd|-xOH5uWLxc1)ht-; zae3>|1!3mhJPl-S9QVR1{7w5XH{Wghhbq>81|=s1vNhE1O2kj~KkKiU$fx-}pog9b zA7L}d&dyfUqzi3~<~PvNX3x+%w~}H11j|(l3k!=>m?(l|V&;Qw7$6lk%%LcZO-`l( zMOTjs`vB(8kSBNVKsinc10n18oH0z0mY6^C^iWc4@C%rHO!*9w6tR~#xC8ARp^ns>!tCm|t$0T!fmt$*W= zYJX}=CQ7!HQ2*IPV0!uBM2(%bY+@CDmDN5wX%ZFquUh-BI#71wP%o1Y@{2P()Ewwzr2MHLdt^kNUzB%R?jVCI zqWvd6F*Ox{{i^lk`NX`>%#Kj0*Z>Ky+gViyOE;^aU6~sX5Zy0cf!+}vrA3-G-(E)e zSI{o$Gn@s0fUqPV2QmtR0^aB9=tcgsWR6x6qcq~Q!gDG0;in&j($sRR^o7s^xQLr8 zswtu4zyH>qh`~88T8ldF`GAiD`S+fv(~-c3eZ9x_t@LU`T<>T}%x^ImOZx|72n0r* zWE!dK3tlhgZX0aA>(Jf$4V}MrcHnQFb$VT6RgN8uZ$PU4WE>fClqSq+@6i|15VDT7 zq73Pv$cXciw;j?(6liK{YXjZRkKJ-=wXTD>4HD}9#?9-MnF92OmG$Z)4}0*1%676u znU(Iw-q6S;gWsy9xp^ii1&$lT&kS8Ovo)-!BGSRtcO}CwR=>9nJJP!HyGE~zvFO zpl1E^Q(+?}ZsPUz&6H6c-jy8OpWl(#VME7@PwEe4)HvJ+cR}!R zX7EI3s#FZWbrz~zfXz4kJ7sU>iJE(0@KiOhO2m4-*k2VF^ErA|5reF3;-0?oa|xoR zO$oWZllmOxtsEA%Bfv&GOWP&M$5?7&<|!cG+uQA_Uj7tx8|(R&AaX|s*=q@&+X+}4 zDYJ1&E6b;W(0O&U8v`-h_I-30HD3+Prb!+!6f}K)`x8CrN21}MJ$)39`NX3?M0l8H zZ~pv=u)GhGatQhrO)dIKMg*8e^Ei+LD}T4uVlxkJs*ko!B81ntw3n9vY%kl25dAVa z5QF@YN`@l&V|h85wzhUP8189EN$;?;vg-d%@dwGP53GHTy5O9JS-M94usuAeVdf=c zn^?mDgW!=q1NAz{mj);M`Hc|*nMTFz{S6rIiuAn|0r%E7xSk%t|9B6Qjd#$9JD1$| zpyJkwQxt%C9nxP1pLhGC^>um=R|!r|Cyj>>n~RE@{!NJ9z8wOyw{Wn_Uvh5 zokD{QwdbhW%suOC889X$#`(jYp@sue+?trSKLk{Ybl*Fp*(D@e(PgBZ<=oVzw&_9` zivaA6i{W(__SmWV@k@~Rl$iO&4kAYP_399BPEpU*p!s=o5b{E#kJR1RIrxg@k21yx zpEBDo$m3_!SCeo~HBhspb99AdqZKA$E0_EtHrVwwfT51ZfA`|eDF5^G4N_421|ZLt z(gG>%o|&1MsB2;v!D_#njUN+Z9;2iAq6cd7*>JGMV_gpNj0%|$K5d5w>hRA7GRpnN zN}t~T{C(49q9lmOeO(W_LuH*g>CC5-e$&v2`iGA6SGyhF3N-ege`?}9&Htg~kgAnO z*WYX7VWvruGZ5LAm96QZ0ptdpfq`pIlE_DpOR;QD%&5Iwpg-llQp?Yb`M!!bm zjOf+>SL39muYV#1YX@i4qj;-y*fU&^`d0A6)Nc6N)w$PGTJVnX_2^-8=!6#06r4fZ zqip)$gs#69(ixWf9kE!oyXC5B zo@i+?!;vDk(2xHM!G`Ns8%;1q7Q)HXV+cLWJz6?CHwa*>giJ=3pf(u2vp!b;@9%BcoSPjWBreC3UMCtG`6^pg^xEliX0tvMhNj zKyG5yGJ|)yjV0a_Lk=#W_DH60ef5+6m@779*+1CH&OT|Z5n>RzmpKaZndQp$ZRzUs~Co4%A}aVlKhHUi7hk|~3w z@iIc?@jr)$i=e9y=wut1& znr9MJ$GOqin9q_`fIo0lW8|#Fw^`4@%DQIl7ii%4k0`^9xW47d-X&qCRf*mI_jb~x zQl9j?@=1P0Gddo}*Q;-iJ%k5eJErEIJ)|_t?s<~pnSC|rEl+jwuba1^ zf8q)6&*eTCUXQl2qH^a`=EUYHtSkz|{<_^~#H=YMouBPcbX|ht&rb^PQILszi;jx= z4sPAw{!m0SbS>?7p;XX(|Jf8Hib7B2`lcJ2l0^{-dA|$MMo3ZQv)|`*a@wx=zG6{O z#>X9F)gOk!LHA{0H|y0P3&62nH0KKmw-u&C5Dx;a2Q~?~@|b^eeFME%gQ}=^MssB} z^;Pm8Gbg{pd)k^_pu_+s&)kcaPHG8VbsZWErS(P9%VHec&#Dy`vVg9K9%o#;yf+Jo{( zMQT=7OL0ACjy-K}R|+Ic=5ngb_Ixy4uDu{scwg}Xs%n{+9HXJQJsfLmYHmt2?9-g_-Vg3+L|zTsS8&Lx!@FbWiLl__ z(EY=?e(3_aEHfye^L6sa0V=zktl!(di;s^#^c~h#5Zht~gx)>?PX9t#C;4xa=r;Wm z9bToHASd$3^6Dpj?wx9BxfR8TQ%Q&#gAtwX zFai&QfbSJQIuA&4eW@uawft5dkM4bS>Ftt7Kpyr%>~(O=ZL27&HnsHWD8{y6`_IV&=<3!A^Nksz$!EzaS7WU%B zZ*d4S%m>LA8ylONhDHd`7@@L{q8B$9%kn?sQcB>g`^yXD{g-0Xx{Gc7R2$Dm3uMo< zbrh6~rHRKxxHORN&IEycD}V-HgnV}i+68FfKH6+6kz~PtT}%BHxUclt3l)tnPR0Cv z+b^mEQmbQ&84#92!f~vV+5OG_Qf7u7RqF1I$-#cVp1f2WT*@d7vK&($%Pufe^nsef z^?26|^$_|CsIHklcfR}Yzr}-Iu^n1Cy6tS%$J)d9!XDka(!~L_Y##O%7xr<5l2}WB zH@*h`!Fi2jwJ1#%88^73iDsUX`OcrMN!=M&Sk{x}n>#v7*+;t2) z#NBwd_PZotL`Itn^RNx2iG)OjHU)ik|9-5x>~=;(`^$XS(1J@`8Id4v7VoN_M#uX% zl1F~l4)Xeivq4jcB+~@l3#5X*+%re=&l--uPRNo5KIe87^%ta6Z+$ zI~H`&uKD14iQe-~z`hrO1OmUc88XyhS^$mYD@ckw7}6@=vkyaVs^f`Ub4Q5+lBG5y zgJ!S7E~~t9uD0Jx>1(~$c)+rXY!6HTgP{?G9;v_u;%e(|#0)oo4h?-vaEFX` z`f!2wezx)>MLAZ{@-+;hd)$i&_O55!tW3Zs zjj}a=k$cEVmpGJr#nb%%;_25 z3ESu8<^Ab$g~>87Qf|YP;{Y)g2D~!0G;a+eF*kF)qh>Aj31BsL(ti92&P^u$7yC{Z%yqvp6X4|6StHpF4lvqC|vn#sOc}9U96E0CrgT-m{YygevnGuS^cfUjtGA5 z^(#z~Z|`T=ZtDM=IV!#*PbArRM|mvqIKuYC^?FPthJC!M-{B?|xE=|)67aG$uBWPu zT8aR$%4XHGw%C5suj(<==@pq-1T zk(=T7*zt#Q9&-@WiX-QyBNG&mzi@r^T3Q8ztrI<&)$lvXghv+(M62iHMkx|*-$lP_ zR_RsfY+QSIfPG}`@$`R+v6C6QK}HHQ{YrLJ)kIH>fypfXM@oVGAJxMWVwiseM||u4 zl|)x=}4rV?PsYpqu%#*&>9I-7e|IzOfOa&Cn?Hb@si;B@o2c_f?bk?ZFiB4D@8+0MQOz#yWQ<7Bh}i*wfSp}6$03Ok*9p4 z55Ixsv^Sbw{In1O+0;9Y+&|BO%*Ksky{izW_U9xgU0zgJuk3Y$FK$5Hlc2bu&=^Hr zOtepT88D=TZ{JsrkVtj9Z)qF!H~da6-Y%QOYQ<+(=&9A!Z$NSlytluhdDY;5__4N@ z8f?cPkl`s)cS)@bPa09@|9b@C}&9|;FJt-H@+wP%rGGW%1ep+lH!+P z0f+x!=gEcMyddc>Eq=}0df?AM)f)z%2DfuzkF!5(36E-?zY=L$I=JsWRh8}uJbmB9 zGOB<7o_D8jyjXRKKtq+;RLC4T_kQ7!M7J4j8!NSXvr}$Ilfy#x$C>nV0z|LcN2RBm zMj|g>U_N3bhF~ITcxNKX`0@n@4v9@rXzrsp1gve_$k#YgEluAzB#A1bl z`ju+Z5BQFN>~}nbmmss3!%#o})We?!4R$+WeN7Y3{(ft5d7vvF@XKYOTR_+BDV+kB zLZJ8QF_+K#P;&E*TWUAi_B>bQ)wJ?{1^gXFVFGn>lkz_KgL|qR>Hm=6l^8n7fNwnA z*8g+ba@b-Dff^3Q$i`;x21YnuDPlK{F1Zn0mjC&VPE)DZWU@%Ca?g9A4-{IsQQ_hG zH1za=yI1xn)Q8&!tq$SC4oW-kyzoo^`D4gNniWaK09aG+S*z!cOM^BPcJWJa@;T*29ocjNL*Ew zVe$Jr;cs>tI)0KzhWj>8&>Hr>sh_*JR?p1BJ(*3BE8#nXg?zs@-@Y@&v%zOd{0Rq> zH7N5G_t}e=2U}a$HAe?zP(=QJ*Oy>q`Q#A`*%c>f2-Z4-5CQQn@MPZ#_Q5m||9Tq$ ztV?LKW?L>%-$oMj3O{QgRmf3n{l~fAWs2;yb>^YvmVYZLXn51vo~KRMn8c)cCjG4U zDHN78-Y$DK8A%XXwJhYP+0hXyLQbK|ns@W}`#Y!X*3X3-8?wA+CCVvD1}5^CJ}o&^ zsSQe=q@1247#A3E$y-@5S2~Voib3E7z4Bl>4K)T@kWPLZ&{df#E0Id@LkzQLLNIpR zgGM**wV(CKo5(L<&Y>upQr%iznTlc53nf*@d@w!hEdI<@uaXvX6tC~7K-x-*l`T@S zWlrH^D6xSY>TFi+)0EOfJPM(rcO5kLYpNVyXLqh!7=4n^kAP>?!4YZjQO2uqrZM3zgi)HN*tSjx*S(PbFu7Te;=F6 zu=2^)^72bapY=rX3^V;Cvqi6;68qTDr&aDOfLaxqXnG z={E3&?}ESm!-F-^dHeSJJ^R^UY_uDAe@E=5sHpemKz5fQEJ6;~hVv5wo8G>C3*8(S zO#VB2+a2#egyxdbc1YEJ^24xPRsdCsqTw7Ch-jNJ! z%>42-YBXE(Bk!{%it`btiGaH2bCOdBY_dzCHtGKEo99z`KX(x1)7kDqVxGqeH@ywz zXHxubVM|JE*kl0V4H6H6p4^pobGyIjUNb#q%Ut~6ptU%MLE*c3K7HzW{WjAlGWaoj zlc32~@J(e2dE2CIrcx3NMzu6gI&CZMFKopj_2szs5g2hvFEpgTiJ9Z%<-tdDQPP9A z;NPy2=?JpD#(+KgH-ojwD0}2JhWDY~C zc-sNUH`WAc%u1IfFUX&EZv^3@1W_LV(yRoJ?0d*#M9n&M>RH`aaPZ=A$18nz!i)CC z+o`3@{%xi^?jtut+u`E+w|Sk8EUa(zSBm;=!SQ$X-fz1L-u8v|o@8O)d4$*GfvWT? z!EMNc;(a77?FP8Vtjf>cFDt_Ys%d6!-}>sU@rtwFwS#Q@Hcm(wny%#?M;sy|mjoT- z=*4@gJhpAPsAjO`(WG?23mFqCR)*;&I+$@#tk2nEeW%Tp zc+xL(&(ME#Jso-N%_zd;zb>Iozq(*~={)A6eVJ0nA(hpIq=x_2wBw1H5BY4jxUzDU zod!0swl;z7QJBf|;2+q~zgAmbWIQ|WvlaK_tt~dVo;3F;_hU)P%ESM(Su(6~e7(2A z-}e3^jL8nBGvpKx$09#hHdA@_O7syKD<1hsm{8>^dL}1o8kd75q0obSy2(U6IjbC-h!T; z_V4To^y1J%pB=rx33|=cY{TLzg8n0)4UKWwa^=f#<7dYkm}tS#1ehe(F-HUm$hbVn zXfo8QC815p0zaZ&jXSeJrQ_Pp+FI_{vNF;-q^2eV^pC6KW%oeof9=D2O~rgtW{I9h z#q$Hn#}^ZCf3Xa&lI-1KnUr{B_kYC%&JNX>fdtFr5-hkXBVVp<-`VB8hleTu&ar4; z>*xfM1BG3A>FKA@ekdRz_jI}EUPhAEV~DO#J;d&M99s9xK{@G5cDgcIe0)4E0)Ixs zUS2B@5o+^embH4CQ>V-rS0v;?$*{;8#wA{ zK|ii4aq`It_DmZFtW*dTQRpZR(?(i24TC^gM#)=gV{xx9Q)5}WveRA*Ss6*i#;1Ex z8HmC2)Rquc;I(MoaI{5ows0u;y=bP_)M#4Fyg4QewA4sh*>B5k3)w^G6U~-m8iFLjcJqo8?bvhDnwdObQY@KW>JSEwTNemyqoW zp8mCtW9!Lp$?X2c3#GhId^}C|3zMSl#E(%VMc$UO+$9(u%YdiG*u6J3N?qcVuIjfMHNT`N-S)my@7JmHkSUQ1KbLMgCm28Fbr4)#g{~|5J zE{c_kii)n_&4H)v*6rKqFnPR6+nID}DwJG?rx`L;f{KgX-hZvu@;|iNZgm6H4c8^8 zxu5Ej2L@Jtt#}{A7>0x6ilxSfy*gUVz{bw!X=SykPnuK5(0m=HLb~WsWD?=)`|B(((_!t4TWXS{x7BIJH`?jN)_W?c$$Q?5Vh=bA2eJGPHZ9(! zvvzj%o)C(x#G0%ja@r4SOG`;$Z~zy_Is|OvDa3q-lH!j{7cx9vVo|&;^)Fv&tAX(b zZkY6$7v5uqzQCWQGVxLs+W8H~$8%Z#xYD+SsYab!bNeRM@)cMF@P|YncFeVAc@T}A zVFzKk?i>;n8ss-TU2}l4&!y15r2VnR)`|v7AB4AUe~0c;1<9ix*}shyI8BXWeC^NC zjkkGI<6HxuuSNP9Xy zVb}<%M6Utn7b%p3$*;@+xq_qT^u~3bc7vtN^j20OeFL+D{Ern0xC*7Z7^#`eqR-E9 zzi&#WXeBdGvz*TaUSl`a31Y;73oN9$o%(sWfP^^WC97IAufrA6JVD(k-mQpJ4DqGw z7Z5z;LxhX_4Z>F5$Hig2G=q?`FENVQe!Phsc+GAo$(E?@h36Ia9>4p=`C9$ug`33e zX;f$vU+qUIvUr+n<$He7@t9p5x-K3P`aWIv#o{DIUbTJO>9WyBOew}&x6mZg1RtM? z)Au4e4_^4zwwCF-1O&2L%({I{7Iw>&;5&zr9xq7FHt&N8{T#eAS7|K{XcG|iQw<#B zQB-^~$zOpBKD{zDLvk&u$^!IKNl5j5}|g0OyqdcQ!xGAfh!tf#7u z+-0Ji({J7TD?!)5XTOsQ0ec(9ZyC0^Zup^K~t$TSm z>5>L#6STnvFo09n(BR9eV3k$MP_ zYWF!3+8X`DcR%`W+K}ri=3i7^^Gxma(+@B^EASZ*hJ>}vOa^wO3$&Oh8N1F#%?|zg zLB4wVI!10HDSfva{)>w>Ol$|MYtJwv1*C>_0$1`OF97+FILj8_RFAoIj0BZSSw zD6yz_1=xaJoxF<$D&i8S`F(M0sif`7;+WSH@#uPjux8g-9u`aGt9@Dvm!2GDp;Q#e zRVPFWu?6+xtsv^&BtH~lw#|Nz-KP|_XEK^NZua^$Nhx}fewAkSIOauJna9E#T^El& z>0QDH*lx4;Ur$}1MgLF=XPXP)=!zi5+(JBP@9$+ky$-)dS(1GgGsI@A1KU9w%)dE< za{vP!t8{`f%2*H#eIPKcWptDR0aGOi(lpWa%)j5g6T8;#I8LHTLN$J^&iex8bCfpg zHr29J^U!?jZ8~y_?b0xem7_w>#mUtljrNgm!9ZiG#^V|&_dCF7c>rHP9t!x?o1F1h z;PTZOYX1O^mW*4;44h9o&)k*wJHLh0e?88xx@%J7dYyZqc(yYPQ98cp?D=x_AGk8M zPO@_P&dvKuvS?v)zbWGVAD`LCibE{{-Pi9!0;ZF19JSTwGAlNkiU-u$+^2jD58`;& zVxEmMJFK5-vBinOKRK|9f(#WU*!rJ>o7z-vu-t?*E<2_6@8a7j2jf(_@8WgWyvM2+ zepICV{)P-AT^Yk#BHG%D!yn#f-P27-$i4B;kBsuYz!3jOE0JF}j2@UY+%T7?+3b7% z@yjm_i(fpi;!8X(`M&H2&`!?J6-Xfj3m{0nMhLGLRAgQt$C3_Kp%U0+l9)FU->}j#I3a;T zE{ZZ3^sTF&qCjip55lY9=D)2kvqkbyZt5kxEYRZ=hZC*z38jdW1*m(t~ z6ZL!utt1Gjp*3NQ{potNZ46o-#8JNI(FiZ;lE3$nv-Q~Kcsl*rUF( z)Sq`JDMkrWouOuvEFEZx` z*yrB!jqmSAyeb{iTwc_u^FNaM*8EY$_)TD$V0+)tx)uoIDgO+9TmdPW23%yDkug7!=0N1)i;E(y_92vJE3bB zw4+L|K?maqI+(9e-dvFY!B=grq^S62C{K^7r#}91#=8T+CAtfD-Nxj=3HiPdfxBGr zNa_;FkLM9QIxT4Z4$sBmd@bW z!NJ#r?L+;5Ik`QBtsC_WWr2bKtC4wWH5(v`)Vq>sg5x8J{GM4kx2Eoc&TN znj30?M=MbE6o7QyV5=MlQ6UXnCa94&R<|tlD?glFj@4~fvlLbOTU*oKsIm&<;!-|RTF&dl57ZJWkpz9tS)*q-eZxSI-(IN zMfXZL$a>T3(0T=my)jwe27pZ zNVYV4!PoiA`-j_84(b~Hjj^LX@sBO}_Ty^sd^qXde?1rH;OMq&h=i|+l{b$Mjr+EI z(uZXZB@K?B)HvDCj`BA*tG*F}rD3d}sg{_7{Vq=XceTa14IX16KRFP)*1{U<9sDu=MVxoEs+bjrCdfcW$_BtSorgX?R!B-aRP_s4?h@O$9Xfs z(7aN=DX_r?cFXE@-cH(}9jS&_`4XsxIqt%f;>f&qjuSElo|!hD?uX}8wR0A*Y;tFk zA{N(+|9cx}{$^L{HL91a+^!CO$LJ5`W0*qGg3LaMq28d!@6;n_Vj`f3BSt|v_xnOG z1yc$W4b@euy+q4FhWiQwI&zb1cmq-mc-|Gp6)s4OG4rX^Wo1kcG zjHcgqEL032Yo54-uVOO?*SMCKm$zj^sE9cli&Ys1DVoEc{_8$ykNM>;`3tE@&A{^~8gTO+OTF<;`7 z<-7g%8zGDz(1T|)G!m1`eOA14T~b9Mw60}cpvhIsIK5|=w@VTY= z`4D7mOs@{8FvI#K=CV7`c?F}=v@=RMjTaYfG;Z~i``ulna=oh^9gE`9{<{qrq9{%l z792Z(me-lJVw?Z^D8(T~{KBAc8vmo>BP9;eno{FY+3K-w8o^R08*!C>bT?YD!$3RSGy8>VWg+!;|>L znEh6zC8kt?8|+^7z-klul7MC!U`_R~1dqJ?tW^f0-0gwdRz!-QT1kI@SJUp9Tj~~C@go*oejT}TJHJ?m&54xtGKwSz50AD)K zOEWp`Y{({3DTNP-+f9_OU7^bYPXDlqSatqaY+CPY<|eY_?#CiU>;N&nA}H8PQBRJI z6|f`@4$ww?d&;wD$Di~MbQ;;%-{|gKVP7+)24&>dc4 zi{tq=JitMsP&zvM2c$528(D)umTxeg!KD$f#{}0qneyid3{C%M&kVf#D9=m(tiHo0 zDtlw5-8Y2w$cHl7>tMUzPmRZsPL}ww@QCUcQ44zttAZRj<&4wAiM&;8ucR^WeX{ z@F=Ps`}atVZ2p*Oe!0;rOgryf(m@n0?f6$_ky0daM2hl-4@FC+`` zJU??P19Sz=w^M{bZIG4zc4ANUI6+B%%Ftd5Uk_~V{)GK;@s zc1`$c30ecx>|q9^d{Uk8vpNX#De{Bk=BMAk^@^_0jy}fuL2MhF zd+Shaox;r=>w&EFR(we@FY)b46ZaQ>MR@Zt0P&=g?j0K%=vc~u;X1)7G-;O>69$6)j;jaOQ;{z0bIgMvN(Q?wL)rfRX3PX@> zozFqMUj>L24>v#<=7|E)J}r3DD?Wn9YZaNQJBotea{zyamAUdW)GXfd`Rc0ex6#q6 z->=V}y{u{2UK@OAdU7h*Y5rm2HzD2r)lwJW6E|pR@ET0sN`+#pU&YmI!ROhB@|+vB z%ISNTqOPVU8b-N2LWW)j`221LSX3u}9cX-wI)7~Kb4sTeDSUY@?nZ^G#zK5GfBt-! z`_=7LPI$YKypLJ3klT8?*4|P?HuraPH=j7gieg*W!?oWveDF6wi0X-ap+ghH)MQC% zEgrP5Q448bW+c_?R>massk11z7U&yi)JdN^TOSs1jAc0U&931==x zqBVQ^u-87z|1kG>YFROhOhl^ZG|+`eI!MbE1PXJS568a5Vya~%oIpB%sKhYAjP%Ua z%PU|*R8}4JD-ZWSJ^+0U^RuzxLJR@l`f&cy39R{zc=`AMeNg-0{{6jQrp7rj28&4B zkZfZXlOaWKh(bi>U%Ytn4&W+YhaCJ>h%=zUK3+w#z~kWL$RyZm z(ox@=#X`cNq_cVeeOhChpi@#LSi+*@EZk%~vie`c@Bq9L__V^m6qrZ?oXo`Sk9|d^ zL=aEq(Cb;E5dktej4G5wKO2kHgieG%dlKD9Hxjs09iM-$a-B544YDf}7=Yov3DXmN zR0<;I^Cke0EvI`Rifb8uN0ta!Wg){ogZSEzkFwDlLxn5K z{f`V|mdEpksWqQGdGZZ}aSqrBHg;{Mt6$G;6Q!hJFDIW5h^YvXKmYjI&=Ftv4#at1Ofg&^EW zHi64Hg}rrcagiyR*D9hvt5)~yFgMhF|n{j^uGZ~ z@u8ToFe4))D$v9P9^N+4Z+?YDfdYspfa*i0l{_7`)T2ekuKIOR@vck*&3PT?-&SG$~EXRQ1 zh~N!8e+7nBDsIsJkAmnAX-gcuM|&^esA5Rx+X8cw*>#j}D!!X1zQI?HO+~JII@fV= z!nXC)^TVdf!u>-|pM>Lkzhgbt>^hOTfYHKM^y}BFP(4Rppk8Fx%m4an)`|g!Ose0Y zUGGAncc#eJ)*T%$yp`PSSpmB;F%ITVI0w8sW0=^D8~o}{-H=7E3f~U_Wd7t+9hrox zi6=cK4!VR?VMD2P;=>XXiGL ztsyqGPB0yVAaQnUYib9)VO-duXz-}YJ$rVV+LWcjT=Am`e@FBigP*GH%_VYCA{2+z zmu<=C$Yae1(?MHe-n%tMTo43&<+LYD5yAL7oc~x!Njfl4A|*Ao#JUx`r1v|a-{~e* zTa2Ru5~@+<3j|jnwV7qI%~|#7Xw={@=gGlHf)qL0y5^A<&`-YgW70Mn#wB zu}NQVuN*ulTMol{UI5gYK3v|=Ug9^5h0r8k2-s9<&Lph-FbGatE4X_6x5i3B@laRl z$g7NU@n`@c3=Zq z?{o!2&)FU_n6T#_!^jfCC?cp)($G-&qhI~DC$Sq#nnv!E3COvTO?lRkmK-1d61D-& zS?YJLF8JX*ZE5&J=?CmFFrUip42U2XqzyDM8KWB~*=|V}pQgj0Ink0O>Jv*3$WM{t zdaAoB=gGMJ9A1?7rKF^6p!Q9^LUPdxyFPsk7E5!G$BkC%@lfN7 zy`i0ct77b*`37lTml~`b&j09C`ZlN{Swmxb^Or5|v%&Jmo(nIZ&+H&gV*hn>fRy_M z;FW$EaaCDiEg20#oi%-RrzIAO0(h$p_Kd_dG?8#Pm(wM_?Z?Bdk>`H8H$GZW9TD*O z{)^#RbC=c{UQ7MdV)=r@g~yBhmB=M6RdK~x=PVO|a%v$_HR{)zC%lWIvgQ7Id3cZx z6`L|#K@SioN5}XCZ51#nUO`{6329$L1Dpl*0n}a}?Wheax4c)yEdNstB`-w3pytm_ z&&j6le>A?!TW~9TM0|!7m&nw#HKHiIyQc^1B)0Kf_0J%l-P_M$g#kZI9O6s1l6^l> zrG2#8S>MHv31B}Aa?#$&3Hw531Ly{W-}Qb->KJjGG0IOyzA>>>YZ$k$Pq^r56^2#Vu??Tz@PlSuyn@i9zD^aGnyE4DzQhRQXAC`z45_(~%C1%ru zb*T4Bc5VR)7Wn`KjfwdN!-Sds;bAX1ZR9-^wIUFNtcXWMR3#pGUM=tITkQnc_JNpd zahJjWt0h3RVq;gH|KNrhMJ`kUKS2gENzv>C*o-Hj`kQ3&OyZz`!dK5SvCsje(EQ4+ z!^7GM&?4H8H!H0=C{Y`o7-bl-xF$@Dy@Z+A^gW#UxG<&XQlMV_tjy69MgOb)??y|8 zN>dM=iPLz>4d+N}f`e4P8ieI1Pg0VA15*2eZi161{hE;D*t^!C_E?(|JGXEJzw}CH z1IL;_c(~3xtE*$3P!8UbA|`iI0NtPzWWUY5BU2vh`b4i0{;S6KdRuQ%;_v?ZQI_LI zVUOmR$Z$j1)O`psxKdIVE8h@$#~fz#I0!k74CRQXZdeqoHCGIXlG&9`0A(*8VaC@<}cWj4=$Kp8E! zZyc;m-UN4Ux5~cN9B^AEyWEvd`mcE7YS&;-Z||2Nwt}aw1p4|n{kFe>KMk8_@z!n_Ketr1Wx%X`$%pWO!K1~yw z43xh{=yiRv%>#43d{6eDe)8+nLISVE$WvG}1On2d+G~RxZgcH;tj8Y5yL0IW2M2Rt z)rAjLp#S<35j(LM4HWB$v*V|Dv+Kbk{d)E(Uvq6Eiqy*cJM#c;8zZR*N`2~q~e?fAd| z-MhH2waV!>6?h*OL!Hb;j1zBC?b;$+Jh}iK2&H6T{W1n?BmpA;wuF&?4}d&Ute~V+ zcjz;m`-%L-6fNgP2!|Xj&E7mg?s`D(AYty{8g2r_qVg5aRPVi(%c8m#RJUI>qf=K? z_ll5G_#F=={_0RJDK{_gz(4J0&(g3kdJSiUAdrN^xRwmX182GUpr~1JYs`0Yx=9~r z+gL^uvn&_uAH{nb&x}*J9dTkhf`ibrgecQ(;D$vkmTUYu^D5m&5$Wn2iG?t_1caY56^t(ATK5`_$KD z)gPc$IU@K;ObRhfH7E|1iH?h8tIWkBb!3U9WUsLiXJL%iJtiHIKDsP--+OMTc(t z!uN<5p-K4XxOdVr9n*_nf&}Zas%i%m_1X^;L-6rI><5YiWw>dnXJDm^3PJs5+iEZ` zp@g%n?OUnpF-!4#Qn~B?&&hEKJJ3YfFnAB}--$fly?DXXf~>uCjvnEd3Dhf;yEA+7 zFNo1~qy3`mFJ>c33jO+`2r=V3Rmz8IWDdNE#0(5X@mBp!9q(S;I3NBM;rGYQjlrnzUcq(-Go-P0KgsNxbA1&cM02kO81JB?# z3L=LXX6fpo45!hJBhn!IYw_es)F7N}jcE{AW~gDCc-c4S+FZ)v=;Q>Tl&KsNl{H3U&gbFrSx1qETC?^(TEa% zv%2E$lU&y}S;7AcE?b?BJdJ{FCPqf(tEl0ccOC662uW#XSh7ATYG`%&Cqv~lKUu$n zPxR-{SsDeV>_w+=NDJZykUF0&ea5jMo|EofoZPwYN2L5N%EpWblRk1}y`zIY*1WHR zi1XXcq0F75gvNSI{;j#@2-CP!@o#J5mW~dNBM{Usvgv<*!Ahd5UiPvm@74irEQKK`_i}g(n5gR2Upodn_Tpz|YO-0ytk08kR?f z^%PG7@mcyy|1qL&+}-a_t+Nk(s__!*``mv&EB}fTVZN0hz5lXs_)iI#mf(|xN+lXL zi06DH8nqc=YL99fupJw=S}B-Je8{VYsbUvS*EWsze9oC=fv6eUB-M% zBTDF6lfmQdjN|ao$wHeMkHmg}{e^8odu;6Y`$0u}mE{h3PsTBx zP6`SL1Vh`n@rta@>Rz)vNU~~v43SNUuk?(4&O3P`taGEpEG%ED{N(tBoE!~!4;P#O zw{D6xCSME%&SV<*!T*{ttzj&3jrlP<=9O2{N0}@b+_GAEp|x{g#>=BFl`t`CFvQW) zNM+u+-U*d+P6g?78TbUHk`WrP_feIXwOHeAbI6ad`$h>TNWzE!b90Np&+zxZR-cZd zVl032baN_FW+IOgMkWqcw72dAuO5W+W8{g{N8P(^WM+(xJXJ3fD3r=s`>kVX`^5JK>V&;&x2}9&Y`N8v?k-HBcl0!@**qeY~FW@5(>Cg_)$NZl^*F!SM zmYr6>4QXd*M;tB-abosyu7m)(uMtlS6|rtWL?N8t_ zmuVAjy9L9Hq5niN`B|vnf}o7X959tm-MKywy}rF+R(V_Pe^Y^CG3A&w*{?_I9m=Dk zqrt1K_mv{l5~&o_)CoVEygh$J-g^!XQ_%K?LdtT5-5f1@UjpJIE9o zQoEI`9YB5qAoF8tY6PSd!y8V|&Ha%)Sn@GT#NbN6jl^;GG#?@j4#UDlhu;A)R>i=m zJFDO3arE~uugX`u=5K2&SxG{&RIQj~KeT>8;SgUWw6(R>NgoQuXZssW#xK|@-k$IE zJbumIZbHU2KKQF#4-eh!CD^>P*V6FPn+!YQNIi*Iy*)5v*Vjz2<85p6zfs4+yB(E{ zc>=YpyM*$rFVWnTm4zqP52&MiFryg2-Am>lrojo|JocxDuhJwZQyLmXNWmNq2NQLN zC8rrfegwArYO!I(_NkP`ueC;1OWH}o&nF)LAnA`LiN5sjry8STDzvD48QjJ+xl` zXgjiZadb0WV`tB9W32!LSD0s$$m2dE zpQp0B_sBHE8EySl^3J}R@i=n`3B}80rvY?w3d-ikhkJW<>&wf|-}?I2OXA`t7KVm~ zvR3Q~k=?QdPn{)0rV1s7vT=&W3@uAEfy*x#36X<{84WL%OAw*I&jpQtd;2R%`e8@1 zua?%FkuNm*6CTR0l^CJvaT!S3nlT{weBK4DS*itN^Y#Lru~cAF7v1yjyIj-uL-BiG z7_+4OgQ$&KR_HXV>V~(+oN``d#+TQnR`M^T@@stNQ zxW}rboZJ-b!avC|fu&`hG0*4e2l(aFQFD16`z})uVQvKWi9TZAbo(n8mdd^Id>5oo z*o$A2;(u;Rs<-VyxCX(ID;BfQ&ov6giH(hY%D~8Y?ccwD;|{q7(Sw>b%l71Bp9(eJ z_}dqZJ07f!5fVb*1`4f0iJ7^(|A#5N(q`6%8T$9HU)td;%>=XR zRGpg&poW_R1?$N~f#%>`XE}x8@0Cav`{ERqLdxzS#4~JAvq;DJ2*|V)4k~2k4ALZk z%`=cJ9Pcht@fOmF%x)-mO;EmS{)Yux6t2UCbmshT#NPXU4#cgv^td)_&y3}NMZ8&v!Pf!H*Jo zvx5IDj5+}N(j7p6DsU+}E*?;aU6oZIp4|hs){>*3kn7e5kXwfXI;hGgHDc(p_U~Fa zji_%<1a0`V2qK>4j~>ks9KNt{6BMZ0i7~x?={%pi`5&tLyxs=(z&mPqQ$jjpw4LG! z2?mL298dz^pVeIY*~|yd6ClOJDW53CLRTW6dR)v0r-->_%q%7NOO2Hn=-tQ^4lgEN z8|$X%b$U#XgoTZmnV|XR#8$xlNqe7>@om>)I>@9%QQv&t-UDZFeH&fx6t+>FK` zj!VEzmnDqzHQut;j@d zO@pQ)uH3(p=TEs8p#+qNFS~_n^bGK&FP&Xo{PhqOecRRbXjz@{VNd`pX76=oT)cEP zk{h=}JM{Pw)Z8x&mnlv3)yvL-o##6PuiIS%GqGAHe;dHxC9*tyK1@;5fn`JZ{FO4?3&ofj~{nb)e&MS{F`7DMGVaLMozsN zrA5HL8$rl)Z)0=wROdyh1*{rY+K3<~`Gh-MT!d2fUcHamwdujwRjd5>^KVEz51RHc zzy0MNOOhfZxA#vjFzi$hIZ&TbRx3^^_}f$c^dEy_GLIDaO6YrR9NSGzeq!Gd;>_OZ zAzXSKb5F?GGE|$FX`BsrTAOoCC}izgjSQV44V+c5e_%4kIm-8HS}i#?mWixysfk9n z-gokonlw1YnKu1fD@f`^92HVU^__loTvyQ2ihm$1tosBnKmyZn=vdyR>Q!+`2_?Ld ztjxGt)(-%8=9L1ore*jSN5M^!m3&4RQ^jTPS+VMOTk4>94K%_oh4~GRv1BYNd3<@W z<&Pm4snm9g$Lr!`)$REAU7@gKRP*rMubr`VsIuCU1m6%LR8%;eai|-vregoFE{38W=Qrxre4d z#k)T(pTO4&@&;YGRMGQ2m`e;*z0!4acUQ03?KI^-&bD6mnxBtDuw+8hxQxOLW@GVDmJeIVe=tqZ0Ku`ya;kagcO$aJ z_K0h$f(T3G%e&5hz!By*vakpOV_;F~D7TJTUobXs36MwW(|@>`&pB!Y0D z6pB9+?bs_UKCINi;j6A}Tp8iBaEAW|QyjpY1VF0mZ^c`1F#WzYJM3J@ws9b5*NpFq zLeOt#GbxLkXSJ~dYUDe5tY0PZ;Z*gS>r9Cch8kRAJpBCp&{k|c_8>~9*z+Zf&mLVCuhI5<)x+3QU|#XgOylg?46t>K}N=| z_jyLhx%YtO&s{OMz!z4(;t^JIrr2xp@u-J*{?~`7wfG99dld7-%DQi1o1koqzWo@n zu3Uw9V&N#`cyClUENE_Uy{5(JyA8P=Gog~vpuS~G6>)cT0es{&ptrAJe9vYFM9igc z-@fU`QlT#{E>=TO&W9_`5U`@*mL(=9zXq4mY?JpbQAAYq3d{qz2m?wf(EbD(%aJ>; zXy3H+{pQ9nClF{sm|_3ub4#y2ajr&txr~FgSCZrf?(@@VJc~i6kjK@xupfOf8=w54X4x_{nu^29>i8P)LeZrG6W;V47?+tKofKEjgUiwt|NE+t~Ssn^7$4Z*GYv5k-U zk=+b(GZ*a%s3?RXp#xi76}ZXD)`{N*6rW3C+W3Ba8bshs7A(n$!iP$zSoGb#oS9ik zEs)d%(1yy{Pf23rT1UVpr*_WgbdxN)XGzP%MS;VhA-*1Hmlo$Wx@X*^(S3(&c{b$%K*Q^n^2DLsp6AqCF%@Nh{X- zQ+)hy(4t5I(ld?Y3q4w4lew(_TwB23_Tnb`gvZ`8rI@XfQc`Fw(U)JDUlUaCz$+?i z<50te;>pHg_m@-?xbvUvuY#-L?$0mCrS;!apeq;#5@+e@p2kY87hxyf{VgOa%ETEg z|D)cCr3ONeb_*5X>@%r#MYNmoyfxR>Yp_Sdz{c;+VKMQBA5F{8o6SYGUgagBG5qRG zR($dV9bCG>VVElL?XV@Ll=4+1*svvgKjuDXPV1+vwaRqWOR@>C$HL!{FHHGw0y@J+ zIs?Tg#Hk6AoDRSJQjEU&>Lpi0b7nyX$E7H&m&;dR0m^`?u$c&lY5WE5r&QJ)Jq0*P zuzlaZe_sgcXx_BM#F6TIbpc5>lpH#kpzqEc#sRwTMymRrdhtYiYbzSKbG_{`6H-wY ze4IalTF}DNr62f(m|#^yj$?dzY-mk*sQ-E1<+s$u_;Y$(piplFFFyZb<@?{P$hU6g z^l%+)2~)0)RGt0D!j0tk%-$154{}oBs}eKMgAFfu4HNe1aar>61UwjieZk`9;wN}X z#RNo86w1Gkm@DQNJ2P{xrjnA1%Vx^KPICvbjzWn_y>j^*yZsx zlVFu%RwM6#OQ+T3B}hs}CK=Lc^83I8j0 zSRYvT(~F9xB#R+UBXAlZataDtx}9_Z-90@Bngo%Y@^h1v1I?HETMGcQ6CA)OO&2(q z#J6wjH%Mv$&gx3XsZ|04jM0!6RtaDCI8HxCC!<+dXyUwkqUIdL7{Oq1E@F|b`ZapJ zqus{hbK}v-_b{fazwa;Idu${BaUqYMs+9YrTt*kUYrmODCSx=<>GDw`J*l?8=tqED zB?UM0!rEFd#ffFywPey}zd;T5>-M-lkrL}fIH@md-;qMd88gg)i~O5gSH(djm}@{snWX3miKWbcQ}+-Ud%Ql$Z17I#Z&M$s(3Y7 zau*#P-7;8`#DstnJkvwr`2@y=22@zd?g8JS8axJS$DUiOn z&|u#)2>BuGTB}6%XK!z;Kv&=MP)5jk?NgGC%?uSP^VY+)1cQQs5D}+b4>;!0L!)HM z@udt{w((%zs1D!(YrK#%D>Nb{?Z6}%1Za%`CM{|(dEIt(aQFkb7i%)8IUm7!#uNOU zuH3F{{by3`abIGn&m|d6zF-Ak3l;K3Jk=Gqg+Pt|r?NCeT!@1{9V&{KLGRxE27RY1 z*rObplnRvO^QV|=KN1$ch2L(EB9baLVr`~uwu4%Wa1+4%a)o4}*1kSG;QRomA3%$p z!^1%EcmXa!WMZN)+VYafJsk9BnWd9cgym2i=Ou&V;b6uigK|FP?(vSqu|(m6HO(=sAe@G#o^;=X>8~CK!2B&A;^y?g@&h}gDsf6ce zb+ae8x`QAWd-YeT-3UaI{a|OS5EB{cAepE3 zW8V@Y4KF!2kGj*b{4Js0f`n75!8O{2EWujO9y66e>eu%g@@pgV)PFdC%E_ruy_PM- z1zGB*0P5kOVE$7N_rc?`%F0a*KD-U4$QLQcr>BIMxB6q29seC4|Lq$byzK4j%1J#r z10q1@s`>)3!7V)jAw!zr?z_kUzRQo5!PLu6pe+qg{P@vmOfGPOsv6--{<^sP-6}zW zmkwrAVHvr6D4X7r*h;nseYGGKpjp5A{Pm0E>a#$J`KK@#B6I3`h3B4*~Kf>xzlbNjWNqYQ& zCI{oE)=QuSMs)vy>ANc+!~L@p&fp9zct7$*9od1ieuv5KHDHNIkUR7)@6EtnnJ4u; z1T?Du`;3lOExY>6%ruQU0iTO{U_J|@S)!-iMI}bKi9JU9z`o{Bflft`hFm;94#Ux5 zrt7cXuX!R%vu_z}N;@}xE+fd|#=cN^FRpJDa?8#jY?Vto>-$sS@a?0Go^U;uB|+U% zqDuY4j2qWRm~O8sae&P8US8h3ccE)IJJ9=oi+n%`G=SW_Z`GKpk*+SCez1j>mejrT zeiS$hvFKsfaOefgzpl7^S0R)7BgUp+KotS?m2 zh6~c6tKW`8ORC<@d)QnbX02c)Bx%t^d7$M6wAmh>qRs;Ii~h`@;?dItaa~tCP&Mz` zeh8k7&*%%mJC!}mhrGfj%YO8rIrgl%$E;VGHD>=ZgI=kG+pny)kg-o=Z_J4MEM~dl zSL$`TTD>NyRSLvp7__U}LN2cf2nmIMUq2Xu*0+J*?&sOXW$qeiovPnyn3*kIL;aqu z-M^25UfVT>L3*&)3ntqSKv`yvrBn`Y2&mCKlVH4!^e))%$(()|wv+?)?2XI2{E;Xk zmgpWn&<>vzK|?_cPC!@j7}dc3Gq{hs&B{`hK!RB+$jtoP2wb{TK7J%Jc=46s^cvtW(+R1A6*6F8#XEHrA@bW4l&>#uTzt zim-{~Mk+!f{Zffp4uQA>S0D`yK}zG2S}eHD_JgChv(@+idg$-p&zXWjHZ}ayOv1vR z=qPjdRBsqn_epB>XvRxX=H!~N`;ObOa1(Sr=HwiZh7?QV_+PCXKia+YVO(|Rj<{i~ z?;@O|^S}@bDF*giO>ON1DC`xatO!HW$E+8&wvY?OUiZH-dYpq{5sEmYmIq=t=!Bhh zE)7z9uTqYjeh*1_g3!EJDPCYKV<73ydkz?jrf?8VO{O;f)2cV0i~R3SYC;DDr{{vu zL?54k;O79h9EMt38Dn%$`2NWmwbT)psIc&9IWmvY(|X!!DqF8{7wF=UlrkrLc7~j> z_s3}GIgapoTS6cCI**0r*tsW)iMhh;QRz}UaDBF8Mu1eHp@ysaaxkTFzK^T4WkvWL+@VP$70Mj(DG&={-{%`7YirIs`6*ceE9 ze4-d^(2-}E_octTz4IP_|DoTVB&xvL*qE5HZ~p`?>W$&+*daWCJaupt3L9|1g&ZM! zfh21$(Prw@!EGvPYM~WC$CjT>+EFiwP%-S1N_`|leXN*7zQS}~?EG(Z4P-r;plZO# z?l?`tf0~Jj3F{MMmCOkJC4C`>UCYx*kA@wMK1ONCxzlU*xgCqi#-H_|kY}V_5Nzk)ZKw|C(yr zFh6=)Zx1ps(BwQX?)Wi+&=szOFfan}P=8`6Zv{oCkBsFyk*KBpu@XTZoq*%7hIgOv z$KDg)BY+1daJHI?`0&6wWkLCrRGgu|O}h$%ZIovs1%35Juob?a5|!7sEJ`@^%fVCQ zr3)jJE8EkTRYox`Ube6dPrzufZ@=Y{6S1S0CnuBdYN5MOh;V_w&!$DUOU zKp&f|wxa{~KrtwhD5_rnpoRcjQD6lSpdKOJlxF7U{ZP>TiUq_)#?-{51g`iXsKoVP z(0=(JiAgA-5sj}>NQMppHD9-Y%Z3(kj@m(ALj!=!P*C=tc_66BGFdVBrUpX(%o41J zvP6X6ZV!;^s|f{1Cw{xY=Tv}-a3J;Rh$NNrLN@?QI?5x^*b;?~nhqJbjFXJj+>s^$CGeO%N$ z1iOekI`V*>HPq#~Kw4~jQi=hKwB$I+*sc_Uqtw2tep zwTw+X)%@~riL}~*H+E3Pg2_Ve)=*Ypb!ekfQgjMiv1-n_FvaJPUSx_D5+~Pt)=S@s zLxeMP$ZO@nuAl9(WijYg*NamOZ;QCuH%dn{RTg6255dxdzWfHJ#K)Mt)8`$3_9Q9# z%I@HpJP(#Ie?D9(%-BJZ({O54m7O3p273q#IFbs%3cvKxR1@Bp=5FBz{9^D`yzb|# zkU4z58fPeTadIe((62jbzv?mKzFKl{3_Oi<8@EE4pa>vrgP{kTVph>G@`ckwdiu6( zaLU7s=<*-7>;Uz}V;{iOBY_FMl?G$e9iKfXS)Y5CaNOj92uOxJ93&C|eC|u%%=lfr zA}1#+yM6)Lci}Sf@?npt!{#t>?CtGqMnK`Gh!fDJRH@Ur@ifI94*b{9XtaZI;4UNu zR%6&>iR)&mxL?Vrpo&>fiHjC-+{v10_KvysyN=N-%j#5+wIzi zOSVY1BD754{MhSaBBY#Rjn*oMQ3E43H35nK(c&E|4eS?pG+m}cADFb|RU2ulOAlBc=ou#{$EJ8s%HmYYnIHBmJir0~aIsu6}o7(Q!Cv zTzc@JnnD(VM)-?;S&f!XxWWe_h8Jsh1dv`q;?xhXNO^nXrt|(RO9)>5+^D45%nX3D~eQVGd{j3!- zeS?~h=(V6di^Fj>-U{E}vg*9;tvhc@$@dr-(n+Xp1UuHw)|V|mIzsU1BXJm{FQVCX zXv(`GN~{f75MAS54Gy9n^=>Jm^6+=Y(sA}weXS`HTZ5%4Yw zr0{ir>Ae7hm1&s%>_L=B!pf4?M%gc9aedvhx2H$ia_cEr!To``kW6$`6if*onD>%_ z5%x`3B;fSww+|wls@2t1e&#{T{>9y@Cb!)-U5MTRjY~M_4({E%hXFpuAo6@}ZOsbj z>)PM-;^sOXqaIcYZP-5jQ_YB2rO&wsyq?Y{q3sJ~cpPtDcd{add`o1(kLqVcAsQ=&-Y9?bM%Hk%_IH5>9oZ0X4UKw-@qRREeG zgn+<`ks}!$_Q>nkFqHFCW6iqS#VMd7`r`ooqdjUyMydaT^3?LPlt#~lSbzo$Su7xi z!$)PBJt_N7#LBt}g&GV-w{?nIxaG7die!)o@jFD}w2y_hkLHl#ib-7EoBFn$9(L4! zR$ZN89Qp$q-?-7C0;cClG)Np*Nol#iXQhIF-BCkC+mE2wUs47JDJ8M>FP=wHXHci! zQ-5FUMfv$#Siwm4Ot+axkw&7wW0W|CZ+ZFt^>ihzA6}f%J+|7h0WTQ*;CfXeJ1CS~ z43U+UwJ}s~g&t7>hEZz_(r|6SSrWw{5oNY}$r6GtLB!0={5}+>>aXl1yu(mXjn}+c z>Lvzp;5~W#ZPht1q2v_ zn%Q>P?1>zaq_?gvXvR`RO1lXI&9#3YAWdT;ZsaFV)mR0&rIa^s@mY$)(U5SB0rb|8 z&?u#hXjNLrltAe^a^iKtz!_J-M}=R{N8K-i61@D6HV+bZ=9m~5oS+u==)fK-fsO@R z{Dm^vIq^T{{NGdGKM|dN&3Ge<8yC#s2c9H{zz3^?9dsKG6rk?{aD9~x3Fs7X86b=9 z0r&&=!(8~9&3K_S0I}PKXvpR<&<%shaRZc!G_L0NmP2W1S7a2GJiy9PjRxQ_U}eGc z*@@h~pP8lXSvbv!Z`a~ODq$CP(5#2foB^H*MULKVY{GBD~P0mh=#poN5SfjchPK- zFXoq)DoDhiF;qt}Otp(h_YVvN1_eD=()Q~2 z(|`8XXs*n%kyiqQlQ#^SeQw0abY9U&sUCaqL0Hx!Fk01ry72mx2efFIF-OBZx)tom zZ4{1QuKgopZYqY0i;FBlFXF80MH$Qgu|EFICofyTTJ=+^<05%LY%qyObxWsw{6A@4 z0sT6s+9t?sj&69}Rb`=Q`^Mn#$C4=ki`Q^(XL58dgNJS0^~JA7D;>LCuNrQ86%o;5;}fkYiaAY;_ECk(Uh(q_A^Ju`RwNSJp<_E96r3)EXw zdce;DUtg1Sy(|On_il}8nnQFRoiB*r;o+({O0bxuOOt*yc|!jf?YcCM)C;@B{&Cx? zZyRS9-CK3nS?Z0S?rxom>_Z!I*#DU~r(soi?j(E|r&Q|$;G>u!k{RMCILZ;A^+%Ue zM87XAEUW_8$}3;_RwLgj+rUl}fTn?r08BfuSO4;5qaJs@5-`RsQI`#>jLb}B1A}lV zC=9Ex1<0rk>9ovsRFh zcIqaLZjCS{IC&-rCX;)ZR#!K;o#J? zE!ek>SwFOcQ8Dnd+VSx5*{dpVS2a9J>{mdF^a$Xu(8u+;gWm%`D0_BcBZa;afdZ-; z>W^}rq7`>fPebKAwHtdq%X=(PT__5Hl{HFAxf`^B+S)haW-9@09-wwcAd15cc=F&B zil@sV)-vk7Vd_ypQ*j`(0D@ehj@7Gmyav+=NeKxwur!N^AVdI#)B*>K3{m>X7k{tv zJqb||iT4ja$ERBlHfJcouq>CQLhmNkWRU{FuiP@2#=s-c`kf)bGcBnrZxbti$KL%x zSf|NCdT-WS`<1inEk=WlhOXb0{Oou(-e0@U^ zk&^NvpN->TYqEgpZ?ZyATH2jU58KR80`F$N|FVHP7#%P7D-xv0?Ej}tV ztR3AR*tIJ;=o`atzmo;F)fmuibm^J|>IIu>L@pOHGoX2S!=m^ErPA5q0paO6?$*!8 zTuOa-=C43!+)r=tT}@+;Nil^6XFev7`azaTFl0(5pyLBxZ@)JpHxU z110J6TqY$o?oqOup|!ve1}LNu@CZXp`Q5fMb~r-eLk>nqzI_Y!+-zKfua_O9T1F+| zKAeJ=wg9=g{?I={F#u9@A^eu-UmOJm{_t8?CV)f2=C}lBoJ}>YfK|^T#G{^Cj=Biw zR5FJkPwefvL5Wl1zW>qy_;g*52PnWERQ(kYcB@~3ilZxA?(?3hj?T24o!$02qyTEO zLIo98IJW?!Nr`YnZFUNXuyQfhRaRd33!~2Ez?__%P&6ZWDtaiBMBbV(2-@_UfsJc# z(dVI}^1THr>?C3Lz5nd4B7XsYhJ4uwpuZV`%2KFO=Lem5tVY4(-wYP<#l>9wU`EU* zp9$E&6(bHFi~s8?mcYz&0Jcg|J_ zqcN$%7aR_oWt);!MjUjA0z2G?Z4h@ESH5#}GyywsLY6a*POs8hJ(FEKQS<97t=&Ie zJ|Q3Qy4jfDWppG(d7b}6Lt&#(x=vgeWlheAH}g{u784Xh^u?P_RuVC? zA^Z>6%)K)pCrs`!W1U0({yvvRptS@q1tIG9f*BL*<)DfD6`xuL@WD0E2GD`piLHNd zP*dpVx*WAUld200T-K8~E96e#OEG)cQ&=7Ve0p>^_;jBf&!1}Mw zWGuh15KbjbI85RCV@2V(RM~>Oyr2+YQ}mLC64WB5?uZKo+-AmHdNsaq{<*ui_CbA*@p0$lSuh6qX`vGC=kpK=FrBKE*D1@2O=C#&*O0Kr#YEZ<@aT ze(%@Iy)ph^6xML`(=)ZljAzBztxuhLwjucy<&%dIEhw?Llh;4`D=$-wX-=q)PfzL+ zI&jOU3O)a1#d(1&;yFxlu|V=1)X$@aHt|$wiH$6z3YN_4xu!6#+A0t5HZta4n^+^dHG7+5}M=%{bV7h3L!yS04?!O zyhQQl>GcTz+7?<3TYq?1kT>*+?IsMxNx?1TYfN06X1Vpj_S_s94NcM#dxRP*M-Fo@ z9cpiX|8C?9H)wbC-{#LxSx%KL!yVCTWA#cAxQmDpAN9JEsUT8$dA zxfrj7kji!HQ!F9O_w|_Ar}w>@L=;?Bk6q4cmc=%<M-l02y+0mO0`O8#s}w!7|0Vky6k{y4FFt>Fd_Sa&zT!v*>_j)c{D|KL@VgNWC*b1Yy$Da1ThwcLZ zPaodZ~h^mkeq)5pBPV6GWRY%^D!@UP%Hy#s?tMbOp?I3es`=&!~SCXn&2 z3}8D5Ro)F-O3KOM0~#0rjw(+I#tg2q&F@;^x1&UpKzU_r0>QM`;h@^t+w%~&obsY8 zD)`!-BwZ*^B&d}_0YmM0RH4m(2iH*_6BF5B3{no;cCRSo)n@xnE$M5m9qPo$Vf=`V#`I)-`)Ye?2UYCIc}gSp!JpE2|KU-RSbLP zUslG`B*#=vm=BVCC=Gb@N*X$^`oZqS-B_rQrrVzEz%btoGPjtb^AaWt^Q2N-BGu(B z1#`QtpLCIj#`0=lB>Fcl*2<5Logs!{Vd=}8o3BcO3!&N3x5e-J`J?_xBL{gu9_Ph} z!gUsbk6%7<>6IRCt{S>m)?{ zA>w~M>nlm$>WhXE&nO#<*`F$QSp+^7)i#^AIVe(;m_=?FX+3*}g-UulMxpSC?Md=P z(jPAfFr4V?D;OUlLK^aiKNe8n2(Q`!{4oV0HG&2R5v-<*D%S`d2jn7+KmMa;A$t4J zP@;_9%9{#HXrBnkW1cOMv5Jr2^LgZ)I_{PaihBM6E&`z-h<&L7OChIv{iiHfBZKF5 zq3)0C#VD_ z;6|7SxTCAO!Y-mM`hF=)kgW`}MVt>!BHLE@c;XGwOQ3PFjyuem;XmPBUHa$$<5{L;L(h$ffS6DVfnu`rwVk&^qouAb7?{T zA2Pwb84NRY4Gad_+*9jy1mU9D{?X_e=e_dT!m()O_(Ui!2@ON>9ZV*s*_08A8&ny#}i`gsOsc#1Z$<`(7bw{*K6B$`hhMkJ0P3C*3L z8zUzthrzcI9xm==NC+;Z@00`HJB`{Sqk?>$j6T#@lnL6>63r|D9#t@E{y<9 zaJjdx{G2n+(;063I0T%$RJ`DZ_X#RO!zt__f595wRP z%Ak^l?^y`%VA!*JSMNGVBg?MbRYsyh*KTTY8EGFHviCX8{umduCv>9B5uO%`VvrxN z%2XV)I$w=oO9tHh(hba(HlVnl0v7`8@GbD)Du?3TJc35B?Fv$-tG}B}qsHN(E$Ve_ z|3*cHL>TrtMN96#if%&*`>8fzqHqKau=-^%9tn6h%y$iC=zTDT5zF!%bTh-460>>R z&53f^vsZ_Q-DJtzbt7~v`H@&ZKXgYh0vOv;eDNa9Dq+B3_inZ8`uMAQMA&hCBkc52 zWOrW?&D(=et@rHA`gXvkd%@%P{A<|fDxsfZuwGhb>s{8@&y{Et zG}`H2&jp*>l$IxM=IJ?8lpa>{zU&cR!RFXwIS;Maa}N0B z2+}+QVV8}XK5l$h5PBooR|9NE$FiHK2XNsjK!#glYHG3DLI5Qnbk=p30Eiw_gl46u z1t4%664-TAdOUFW)lu(u{K_^VX#^`kC9M8vzliu7hf!JRrjPnd-WvgR-^@eDlRZzy zIlfYH%e{>$?!BABQEXYmzhIBWu3ct^FCDc6+5~(UBOtx-qHYu3!AAA=^#$3&rLKGb ziQs5}Q~A`aD=3%jFsM*z0Wrc;);-p?nENDIDuRx1(cfnYvHqhJ0WQI>4*blg(%{5h zO}fi~WAaM%A%lF+`Nz#6)zYY4n9intpc6|WB_`fQz`Nee-CYpSuoqF103rZ}K}>>> zm_X2v*2Tr?Ha}H#F-)(D`d{wzGDufp4JDXQjblnwV9jHrcs|QfKobIrEJ6@sgn9(=?U(&#GDUUqZ1OX;Zo2l7eJzp81+Hl#&__3kctq-fH&rZdA!0!bZY z8M#kA_6U>-96Jeo;^QT%T%QiEKIQg9i3 zOM;o_8x&nVxBcezJ45NW2{DZ%)loAles?(eoqdQY7@Qh#=^JlZuisyrQ>*)es|nrn z#E+O7&H+f?et$nJP>#RwAAzoh`poJO!qjFhY=^`8`0;ihDZj=o%W;zo4y0LKCvwXw zXg1v9hkD#>e0BwB34EX#JB6X+5xOr_;&{+~r?%DQm!z-Lj@|$_*G1_iUh1&R4WOA( z;^A$` zt@0nLVWk$s1hFACpiN(Xi%sh`-`Xzzrw5(zqPOJa<1siK6Jy3T@|`5(@A_(Yn#%AD_T~#yOuS(~7;VJ2wh`HO~`e zET@te>W!uUsz0qq$38^Qltx zxXDualV&@ou6fv6ue!pvsPwvuN(q8)r{p~)6xnIPfZyh&yK13HQY+LdZCg1u!1XQB zsgX(Cqtnf~o~+HRen}w`fo9AQ#2?c~ihs=}7z_1r^u|}M6E^uo7c^!|b_dV2r^qe3 z;ky{^JB|;(UjM8Ap5+NW|%s+g&RgXUCBr40>Uw|%`756>!z$?0!WjR~2!N+>%Z`E}m~*b2l8 zc9uf=a_x}*uBsy@)CKd5C6(hga#OEyC}N5pLC)4oPVssjE$9-x7-3o3jP|@ z3E7b_teOO3d^s)>km0TBC~D2|U2C*_tz^KDAZ_~Mi9B^=%>7TaYr>YJL$!9zY_$n4 zq|FRTK{^&Fsi>V@l1%-2i}#hgr|3;n4KDow|3#a!IpxlKp39feP%Zks2FjZ6!|;* zhPL#8(qD}=`6dNLl{E}sFRl=1NqXoEa9}#RRt4maKhRUq<&Uj#q$K@YZ!>8fEskrP zD&#(ODHrT(wt0Tc`}B3}pHLCOMZP+;7gC$2apSH<3NU5=1=H2Ee_IRtCyb!TskzG; z#n8SF_?tgyHK1tU!ZIo){O`7_SSeP%6!eMm2M!+Y?%wJuDm-mfifR67`Q*@X--AHD z;}|gL(GGGuSpo@b%3Pl6{Y3KaI=m-ihP8U(P<2gR26dXW0%vV5Meq$1+^dwM`y0fd zXn5!RbXTaJzvYW@$i^JbLO+WcHU*7<~jPPyMb z%roTgAM*ZwO7puNn(xql%-AQU)?5(Y{>{acuhCP(P*&A+NR5@ykCVZygo&WxqNIs( z`KavO*VO(_*OJoFiLzfToviAU=#m64u}Tm%0o95<|52#V17P7? zqYhia)5LlNQ>vc`Ou=gB=Z!$VDIK7aCt}4-W$=8lTK+Du3O_*#6J>i_n;&p=mx1CC zgpbwEZ@KiWpTK?k+PLKb3Kyonc0fCC?g&e|2Br{y!sb7rz>7!=1H2^TF)53t4nLT4 zh;ivxJ8R5-Kxva`!a^--%4c3^SPzS zwA?LO0h^1fSloh?g(P?fPDMa={rZ+O8X9Q8U*_-)ZG^?;ER3YFPN)L^NGX#+RRe2? z4&rv%`ykKO*EqlGjbqKv0!~rblz{;O3-#MgKppX#uLGAYo$1uX4`6}?ynQ4ZQ$h~2 zB#qX90%c-q3L%y-mXwY<9IWy;rn*`t5386w&5{(Uso&!pz8CVU=w?!gTO=9eE|ol- zO1wOa`}=!py}PI1T^um;7{ewBV+m0e-hJ-nZ98dmp435WzFcR{TL*`~ye}^PLwizG zi=sC4weH8(ENpLc(8uIKxPG!)d}o>8N3`Kg(>FWdr@CWAHH2?Usr@V=@Ta9@u12UZ z$b26r?k>E=Fu6LJdH-OdXd@^+eh;Nn0J}uNcfVCm@!_s;KH(1#uO$E=Ge7~D)adP` zC+Rz2+n@q{mZ6oIkTgoxqCX*K?;G!6QYkK5eXcunQiuW&Ue;NC8J#~JObaB!*5;Tg zG4?+O_#I~XK~uJ03yPa?1C4ugEsOmG8q$)ebx#O|Q(T{{w9P zE)*CHaIVpUmqzL}@uBx;4A8bUi$eL6Xk}%!aFwPAMqPKEpq40y|Ko~|q*0%Q*9CX} zT7XtPWf?eGCooUwGpu*v058BvF<8jikx4%QVGL{pWHc7?7yN)Ry;5Y*m_TzCWdopz zvqR*57yQ&W2KxJ70S-CA1Kw```vi-PjFOTPDIiqrM@2=g0E~%&+HeWvW!2hS@zZ>+ z#*SQ^QXTqR4VK{<-u@=apS!O}7W7n4Zcw6zf2Y48g}5Js!D`s&yNe>s*}n@2KDwKw z#B2|qPFh8pKWL<4b&8%D8>eqlcYSv1H7gr|Ie|GO_X2pYq@v;n!WsB^u+7cQYuxvl zfG}-k@m-n-6V@qS9sqSF(0(W(z`NNNpb0-O-{imHFwL%r-#!lt>UhAp#=q!?LIlDh zxF;(ylev^ijX3!yIo8rpguXFliZzFClH{`;j{d%VLF7(|Z4jIJpSyyoS^~s3o3@Cn zHvPxc`2Wizk#=-bWg2js5i6DqJ2N3?-W&Acdf9<*&rA}hpmy`i3nau(#==*{rtRI$ z{qu|Z!#Pz;RrAIN2101BGPAzN3Axxxyu{%l-q+)y!fRoA9PxTtLhaP>nClN;wz*YH zkw?)@QBnFiPJJRuia?2%yl(8F7NMcLr)MYJ8#CA>sO=a{Zl@nYNjLDGzBeFT7T&(I zbL_BV#zQQVta}D#B#=LM)9>nRg5l-A4xnxrW?TKUHQgJZnK{J`YQJvxTQnhiADGE~ zGarD@DFN$Dv;?{IF$A$^tTImOARRax9v1=OGO8ay&vhX0uzq;9=%5)w=9>j{WcPaz zyl4TC{s!z6nj%dQLJ@eqgnR8SC`G(H2a*s$5ft4cv*k#ctT#a4qrMXdfk4)qVYUVa zv=GSsA_@{wUSJa9<|>@+{M;)_$Q4(Z=#`9TVV8Hz}?0lcgb0c;~{>j)6xr7;~d95q8R<*yY(9V?Dju9S+bsVEY0! z;`TovqYW~Xh5QCcfEB`YKdmwtYQgl97vjsTy!nA+D<7PHBTg4B*R{DSxBFvf!HOc; z+XrtSBI{_X*NncmnG~X0Nzqdf1Ujm0p^&!~6@2*Ad^j4Rv8qivzy&=A5RgIsGmn&B(StkE@WUHHw;Cgq zyya~{+RKd(v=1Oxl)RdGbQSpsFAE8nvh@+S)t-5rLoJq&?Es+{8&|g=rvW}}Vib(F z{4yG7o}>?Pex)W-@Pu*3V=)nthUrh~o5hv=elVn$AIU8&>;U@=t61|RzR}A`$zkAw z8*`soDQ%k^NP`wc5`fFiRR-y@0mqAK!~4H)Z-wiWQKN`xX~T1oT;_Ly|5r)Z9Zu!@ z#t%;R%1S7QWJVDsd~HHe_TG&{X2y~AW{VI)HX)nrkxfQMc9F~^*^(K4_ql#u%2j`L zdEawC_w$*-<2@6jM%ltn93tM|lKameax|#2hP=4 zb2W2?HB*Gfg}aeK{Zi;#3oFBaV7<1QUqGU5>4UenR3PMpJ%NHi6$U-~n-QEcmO$3Q zK?sPQrJH~@5W(=&Heq1BQSuyyA2Il43I@DR_7`YC;NHHt4D7Xx=hyd^Gi%>!K1%{M z3A+xBU?rNcH3P^_Z%8YqHng$fn_pOX2*muqb-+H)Q4t4Rx2i}&y2GNP^dTF1tvOFx z$)FY~ z-*vBN&mug4jp~NXH^9JJyShlAN0_o5PpFN;;|clYTGH<%2E;R7Gjj`Y;}-ZdBlw^p zX!uLK8w@P?mR_;ZUvFRErb78bZLo=!Wp$TBJ~=Hojb+EnDq2+2{(N|LOH0c-DuvO=!f<@MrukSf`STKfZ}_~VFXL&8QGa+X3X83FwkDsxcT+LbRMLckCPh z6|VW;t(l2|WbS$!M6t%%D-rAWYSv<(1U(BXKPvKK_#8z+=E=*$lsWijcWTmpzG==k z5>H8Nu2vupj7RWunvfA-AivM>u$Q9EP~$&}2Ht;vJ_v6#8TZTUpIgcr%najJbTMrquXJ_qXr) zmOA2(C{=$h($Hs8%)4ua+mp!4(%%(Yuy~#9&^Mq7@1qGK$I#!ILGS``3t%HY(16*# z2bjMVoU40vZIJxm1-Uw>eelsB0{-w~t(lHaAT)))hOos1|9TMB>Vx;N`ERmgQ}lO8 zIDo`3aGcN>Gt}=bk1XLc`WwQ-!a&{yKd1Lkz92&Bpq*F+;V2swCWjz0icM)8ayd$f zND1GUy(6wNTUo_a>!9?;uG2+;42YMH4`1crv@)JfJO~*UM=BfeG)O5aLAfe7AmwUd zkui!D#h>gDP*&WTn2@6AfPz=;d^d{ya2wrVWMtu?g}EkdCL*1^y{ zdVGkeghC;(VzH&AjwI)99Rrhp@DD~P2~#z&3(IG~$EXbn?rSDLD#gPfQ$=4L>s$xk z+~vxs$zr;a6m$fZfIC6?6rirKg9T6)l$mIn`{`UDce?P9hPcRAl(Z zxXDWU@NeVp9lM6GnPW%?T?2xpBF6H4{62g@9whS?d~s!CA_f%{ePWTMI1wRX#+YsD zqBo~zh*B?iW#`*Z`YV2$)Byxs8Dt4MbQWY3z5WW(<8{X53`+8vMxk!(&6bRYUe2O? z^mD~orzu^RNuL)tJCS()nO|y}x~+4Up^fJ*W#;=}-I7xlj9)arv#0 zh`dUS?!X3Gv(SacrcwDU+93YS6X*VouiQT%&mANckU$5D79S|RD;v_yJcDVht@Y>w zUuP8fK6xOlKV$NjB}}+&KwyQPhL+QM7agW5ZDLnJYKzyBsc@Cwl#UQghZGqJ=YRXo z=5cCgAZP=izxao6+3-d7=SWUrmpD#|jlEvfR0+DYbH#0B;Ixy5-vNFSm;O#d)x}B$ z-c|9}^SHn>?UsJ#{Xnp|tj;vE!-R#LPhetUL!=G=2!*(hDkjDaUf=pNo0F4c1Y)u% zc%bFwG6=MpQ}D*A8C;1c*S}tok&*ER6Z-Q@31Zp~+ljE}4)!0c5OBWRx_`xr-rx>p zSI}fIzE^h{wO=1QGWo2o!=}vO%8ls7{V$r{Vw*CBx=Ylp!}bC{sndl;Bv6OLUbLQP zo^QVB_+2Hl(8;d5@#OEiz`l?JC1zXUbqyPbSxSOKyp%goo#GlET9WVJ8mf?aUzQ(< zt8bTCYA`GPECKNQ9&8mbtuF}(P(Zm%B5L3Re4P8i4O^Y8q}0@%aOZ28b6O>l zqjjf95FjNlLFTghIhr`EYr(F_!=(AQtz7I})0mO%u zAwRtt;GEB^n|x0l9&bN3M}!y?Or(jl+LqtJ76j69xm~~7j5=x3D(o)5$n`>KNH<_2 zOEreNckA!xyRHFXidvQp;j?z47 z3)NsSE15a$oD7P8@vhZtk@3jY($?+@9Qds-*=bUHbozCs3^Fg%y+EK2{u(H)@oP{; zv|);tp56^hNMm_;g8*#(*TBUOnJwiIPW0j;h!TA(K;=hXXX0@0u{8@DD>!{3;pp!F zY;g^^OvzjoE>P6MFzUd~_?-K-w4}e0ru%AD$-ap{tD_)T=4%viD+#Gz;Gaih#+bD~O-7{?ksUcNn7jO5uzM;v%zJEQYX7UY z%vJDxu|#FnL-(49q=8L!;z@&NKcggTf|cEVt1|Uejm0CKl!+*R%wUnOC@(b$gOb03 z=4Lcm^s}|3j~QRm^CMiYwakU@BdlhuV@d`sSLH17&{7U@?hj7i+|LS`MWr@eyFO#? z`mXkAKVuSs%p4+Ohe(4gNFE-RHLRI^H)p)FMweZ$vv35~oF2`bUVJ-dYYcbG7Lec-1#MQFh=?ya3B-6XKX_qTQ_IannN8TJ*bwD6_N*O11)9HBD|t z`Hrmjj$P-T#^#rg59iFqIC>A3M%*;F3YG{|a-B_=T%;}DmFBIjKj56*mwecYLXqXD zD$407-!k)3=0D;zJs|Fjr=oEURm(AhPXcxa885CCwP#5Zrlf0co9$X`GsXZOJIH>^ z-{olUk^u(Q&>)K(@=+!xUV9>XsQj`IuX};a-E`2ceU`S9Uio{t0O2W)J8R!?Sumir zOTWmBe&Wp<@@UA*`xOVyxwZeG59oPR)V-`a0Kh$K^TiEO-dHyW1P@ItA$SgQ2DpFa zkRioEkcya)yim?dCxt{zx82)1BwH5^c-Yx*F{P{Xy#Ey8a!W9FVCCsQLGXHL;pzC5{ zRajVd_Na&zM&bR5eIPPn1IChzQA+}JFM};YysN|c9RLhCuBkkU(E5B*p>^305LiFx>>gNdGzn*$-^I3;>9>uljk~y3l z*%mNqL9+pPOmteB1HGXz3L+z(>m+|wQ&p7%&_$cT$yBh^w(2kyLhIRTs3T`=I$Ayp zRoeL%KzPrtOILgA?Or~}ZiFH(cxeY=S3k8fWWuda0hi&VhSg+HI*az}L1I&lU;Tr- zA{AhR87VqJ3`!g#BIT`KcJ-r%0}v;y>~f=u$)>2KV9mw;Z9xh7R^I)Lu>$F-GPmO- zLzkJj=~`pTxN%e%=LOb#PT~v?=s1!>JgoPSQ%Et2W6zBAp)vN@`boKQ@bdY&0tKBV z)r>$S3{{;MInjF3JX?pbrEcc3eNQP|>?8?_9}<7Mm8Z!w?|Wi6_2kHXDpica((^y` zc)nr`2D7*YUj>TelU0KwqT}kxdY0E%Zr5q`^nUtu4M4DApiYIc9iwKZAS^mUt-72` zhq0TSkgzuemKOwSp*?2l=^hMlSKozdNZJ1eG3>JrU zs-g-lsWw2#|BJWWPOtC{UL&PWdgntLVu^0XDXAnhuoYa{{Bog zK2kfCE;jZ$o6(Q5CdOX3C_Ab0d7N+db9f|fl|-NMTx7xBs&zv#f?pd8OE{~Zxpu4Y zp1^Y4wBMU|9F>u31;|B3)ZxgzLdEgXd`AA9;T%B^uqT($qR-wpGCI^z3Z|i?l=@U& z1ho!(9>6)FWyxA}dSy9jOQ2hr_B=E5K7neCk74{@9@X+GtFn}t2-&Z zeP*UL6J?&Z9gjR%saABtUZ=%qn!Ju$m2oH|X*w>ro2%yyYWAjrs9d7K`ka?FA)hlY z*b(M+p6JlL6i2_@v5`)rem0 z9~`8<3ORnAG*R4@GiSiq$1x{yGUYZ zZ?8EPvfn1F!zRm0i|ijB0F(%VsM%HUi*(=aImmt+sT*=HQmL1~Qp(R&!kmlkk?@En z21T9VHDZu2V?Fo;ml3(#cKgNug>Q%qo~$<5|8PnC0CROTJ;7l-&2(!k;zY~ zUUKup1qv*7n;tB`(is1~Y{##G8_O~p?zz$GWxoA7+hsGh)3D;7c+U!5ZtTNPW3J`v z8jrP|rS1MJ;7MI=kI#{qKBkijQrRHB(a8Fh_4|{EZwRyTmkpDrTy_O`enI0wc-^fzj*+T;pl-+GEWMFMx}<`i2r_0zsz*l6sms1K?+%h`Kb0~dGn?x(B1 zX+h6&KQnVVO#U3aOYpjhrmXCGbK?9dt$Jg1J z{*yVQZJ$DuJS{Q2y!#k;n|)ZPA!_99#~8Qx7yB$o*QK*8QTA#BO6$!Gx#1(%FD1=> zml=1hkF9vb^8MELk=M(vJh>D$$Gy(d_8Z5leV^<1FFrCV5L&@%XOE<&Xgoc=EY3dv z{dBSAnHHT@ugA@(yR(ld?#BLClRR=Oo9{}XI;tjjL_+JNmMrbqrbqjp>Go(2Pl?bN zZ>+);mhbA*!o@o7T*;G=OCcXVVYOvGNUmsUHyq_sozh$#5e($i2v0}BFI6QC#S(c7 G|Nj9curfalloff) direct_link_curvemapping(fd, tmd->curfalloff); } + else if (md->type==eModifierType_WeightVGEdit) { + WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md; + + wmd->cmap_curve = newdataadr(fd, wmd->cmap_curve); + if(wmd->cmap_curve) + direct_link_curvemapping(fd, wmd->cmap_curve); + } } } @@ -11707,7 +11714,22 @@ static void do_versions(FileData *fd, Library *lib, Main *main) /* put compatibility code here until next subversion bump */ { - + Object *ob; + ModifierData *md; + + /* WeightVGEdit modifier: CurveMapping pointer… */ + for(ob = main->object.first; ob; ob = ob->id.next) { + for(md = ob->modifiers.first; md; md = md->next) { + if(md->type == eModifierType_WeightVGEdit) { + WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md; + if (wmd->cmap_curve == NULL) { + wmd->cmap_curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f); + curvemapping_initialize(wmd->cmap_curve); + } + } + } + } + } /* WATCH IT!!!: pointers from libdata have not been converted yet here! */ diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index bf86527b9d3..8658462c53e 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -1294,6 +1294,12 @@ static void write_modifiers(WriteData *wd, ListBase *modbase) write_curvemapping(wd, tmd->curfalloff); } } + else if (md->type==eModifierType_WeightVGEdit) { + WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md; + + if (wmd->cmap_curve) + write_curvemapping(wd, wmd->cmap_curve); + } } } diff --git a/source/blender/editors/datafiles/blenderbuttons.c b/source/blender/editors/datafiles/blenderbuttons.c index 7525015bca9..ee88f8f6f4a 100644 --- a/source/blender/editors/datafiles/blenderbuttons.c +++ b/source/blender/editors/datafiles/blenderbuttons.c @@ -3,6580 +3,6602 @@ */ /* DataToC output of file */ -int datatoc_blenderbuttons_size= 210335; +int datatoc_blenderbuttons_size= 211021; char datatoc_blenderbuttons[]= { -137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 2, 90, 0, 0, 2,128, 8, 6, 0, 0, 0, 68,254, -214,163, 0, 0, 10, 79,105, 67, 67, 80, 80,104,111,116,111,115,104,111,112, 32, 73, 67, 67, 32,112,114,111,102,105,108,101, 0, - 0,120,218,157, 83,103, 84, 83,233, 22, 61,247,222,244, 66, 75,136,128,148, 75,111, 82, 21, 8, 32, 82, 66,139,128, 20,145, 38, - 42, 33, 9, 16, 74,136, 33,161,217, 21, 81,193, 17, 69, 69, 4, 27,200,160,136, 3,142,142,128,140, 21, 81, 44, 12,138, 10,216, - 7,228, 33,162,142,131,163,136,138,202,251,225,123,163,107,214,188,247,230,205,254,181,215, 62,231,172,243,157,179,207, 7,192, - 8, 12,150, 72, 51, 81, 53,128, 12,169, 66, 30, 17,224,131,199,196,198,225,228, 46, 64,129, 10, 36,112, 0, 16, 8,179,100, 33, -115,253, 35, 1, 0,248,126, 60, 60, 43, 34,192, 7,190, 0, 1,120,211, 11, 8, 0,192, 77,155,192, 48, 28,135,255, 15,234, 66, -153, 92, 1,128,132, 1,192,116,145, 56, 75, 8,128, 20, 0, 64,122,142, 66,166, 0, 64, 70, 1,128,157,152, 38, 83, 0,160, 4, - 0, 96,203, 99, 98,227, 0, 80, 45, 0, 96, 39,127,230,211, 0,128,157,248,153,123, 1, 0, 91,148, 33, 21, 1,160,145, 0, 32, - 19,101,136, 68, 0,104, 59, 0,172,207, 86,138, 69, 0, 88, 48, 0, 20,102, 75,196, 57, 0,216, 45, 0, 48, 73, 87,102, 72, 0, -176,183, 0,192,206, 16, 11,178, 0, 8, 12, 0, 48, 81,136,133, 41, 0, 4,123, 0, 96,200, 35, 35,120, 0,132,153, 0, 20, 70, -242, 87, 60,241, 43,174, 16,231, 42, 0, 0,120,153,178, 60,185, 36, 57, 69,129, 91, 8, 45,113, 7, 87, 87, 46, 30, 40,206, 73, - 23, 43, 20, 54, 97, 2, 97,154, 64, 46,194,121,153, 25, 50,129, 52, 15,224,243,204, 0, 0,160,145, 21, 17,224,131,243,253,120, -206, 14,174,206,206, 54,142,182, 14, 95, 45,234,191, 6,255, 34, 98, 98,227,254,229,207,171,112, 64, 0, 0,225,116,126,209,254, - 44, 47,179, 26,128, 59, 6,128,109,254,162, 37,238, 4,104, 94, 11,160,117,247,139,102,178, 15, 64,181, 0,160,233,218, 87,243, -112,248,126, 60, 60, 69,161,144,185,217,217,229,228,228,216, 74,196, 66, 91, 97,202, 87,125,254,103,194, 95,192, 87,253,108,249, -126, 60,252,247,245,224,190,226, 36,129, 50, 93,129, 71, 4,248,224,194,204,244, 76,165, 28,207,146, 9,132, 98,220,230,143, 71, -252,183, 11,255,252, 29,211, 34,196, 73, 98,185, 88, 42, 20,227, 81, 18,113,142, 68,154,140,243, 50,165, 34,137, 66,146, 41,197, - 37,210,255,100,226,223, 44,251, 3, 62,223, 53, 0,176,106, 62, 1,123,145, 45,168, 93, 99, 3,246, 75, 39, 16, 88,116,192,226, -247, 0, 0,242,187,111,193,212, 40, 8, 3,128,104,131,225,207,119,255,239, 63,253, 71,160, 37, 0,128,102, 73,146,113, 0, 0, - 94, 68, 36, 46, 84,202,179, 63,199, 8, 0, 0, 68,160,129, 42,176, 65, 27,244,193, 24, 44,192, 6, 28,193, 5,220,193, 11,252, - 96, 54,132, 66, 36,196,194, 66, 16, 66, 10,100,128, 28,114, 96, 41,172,130, 66, 40,134,205,176, 29, 42, 96, 47,212, 64, 29, 52, -192, 81,104,134,147,112, 14, 46,194, 85,184, 14, 61,112, 15,250, 97, 8,158,193, 40,188,129, 9, 4, 65,200, 8, 19, 97, 33,218, -136, 1, 98,138, 88, 35,142, 8, 23,153,133,248, 33,193, 72, 4, 18,139, 36, 32,201,136, 20, 81, 34, 75,145, 53, 72, 49, 82,138, - 84, 32, 85, 72, 29,242, 61,114, 2, 57,135, 92, 70,186,145, 59,200, 0, 50,130,252,134,188, 71, 49,148,129,178, 81, 61,212, 12, -181, 67,185,168, 55, 26,132, 70,162, 11,208,100,116, 49,154,143, 22,160,155,208,114,180, 26, 61,140, 54,161,231,208,171,104, 15, -218,143, 62, 67,199, 48,192,232, 24, 7, 51,196,108, 48, 46,198,195, 66,177, 56, 44, 9,147, 99,203,177, 34,172, 12,171,198, 26, -176, 86,172, 3,187,137,245, 99,207,177,119, 4, 18,129, 69,192, 9, 54, 4,119, 66, 32, 97, 30, 65, 72, 88, 76, 88, 78,216, 72, -168, 32, 28, 36, 52, 17,218, 9, 55, 9, 3,132, 81,194, 39, 34,147,168, 75,180, 38,186, 17,249,196, 24, 98, 50, 49,135, 88, 72, - 44, 35,214, 18,143, 19, 47, 16,123,136, 67,196, 55, 36, 18,137, 67, 50, 39,185,144, 2, 73,177,164, 84,210, 18,210, 70,210,110, - 82, 35,233, 44,169,155, 52, 72, 26, 35,147,201,218,100,107,178, 7, 57,148, 44, 32, 43,200,133,228,157,228,195,228, 51,228, 27, -228, 33,242, 91, 10,157, 98, 64,113,164,248, 83,226, 40, 82,202,106, 74, 25,229, 16,229, 52,229, 6,101,152, 50, 65, 85,163,154, - 82,221,168,161, 84, 17, 53,143, 90, 66,173,161,182, 82,175, 81,135,168, 19, 52,117,154, 57,205,131, 22, 73, 75,165,173,162,149, -211, 26,104, 23,104,247,105,175,232,116,186, 17,221,149, 30, 78,151,208, 87,210,203,233, 71,232,151,232, 3,244,119, 12, 13,134, - 21,131,199,136,103, 40, 25,155, 24, 7, 24,103, 25,119, 24,175,152, 76,166, 25,211,139, 25,199, 84, 48, 55, 49,235,152,231,153, - 15,153,111, 85, 88, 42,182, 42,124, 21,145,202, 10,149, 74,149, 38,149, 27, 42, 47, 84,169,170,166,170,222,170, 11, 85,243, 85, -203, 84,143,169, 94, 83,125,174, 70, 85, 51, 83,227,169, 9,212,150,171, 85,170,157, 80,235, 83, 27, 83,103,169, 59,168,135,170, -103,168,111, 84, 63,164,126, 89,253,137, 6, 89,195, 76,195, 79, 67,164, 81,160,177, 95,227,188,198, 32, 11, 99, 25,179,120, 44, - 33,107, 13,171,134,117,129, 53,196, 38,177,205,217,124,118, 42,187,152,253, 29,187,139, 61,170,169,161, 57, 67, 51, 74, 51, 87, -179, 82,243,148,102, 63, 7,227,152,113,248,156,116, 78, 9,231, 40,167,151,243,126,138,222, 20,239, 41,226, 41, 27,166, 52, 76, -185, 49,101, 92,107,170,150,151,150, 88,171, 72,171, 81,171, 71,235,189, 54,174,237,167,157,166,189, 69,187, 89,251,129, 14, 65, -199, 74, 39, 92, 39, 71,103,143,206, 5,157,231, 83,217, 83,221,167, 10,167, 22, 77, 61, 58,245,174, 46,170,107,165, 27,161,187, - 68,119,191,110,167,238,152,158,190, 94,128,158, 76,111,167,222,121,189,231,250, 28,125, 47,253, 84,253,109,250,167,245, 71, 12, - 88, 6,179, 12, 36, 6,219, 12,206, 24, 60,197, 53,113,111, 60, 29, 47,199,219,241, 81, 67, 93,195, 64, 67,165, 97,149, 97,151, -225,132,145,185,209, 60,163,213, 70,141, 70, 15,140,105,198, 92,227, 36,227,109,198,109,198,163, 38, 6, 38, 33, 38, 75, 77,234, - 77,238,154, 82, 77,185,166, 41,166, 59, 76, 59, 76,199,205,204,205,162,205,214,153, 53,155, 61, 49,215, 50,231,155,231,155,215, -155,223,183, 96, 90,120, 90, 44,182,168,182,184,101, 73,178,228, 90,166, 89,238,182,188,110,133, 90, 57, 89,165, 88, 85, 90, 93, -179, 70,173,157,173, 37,214,187,173,187,167, 17,167,185, 78,147, 78,171,158,214,103,195,176,241,182,201,182,169,183, 25,176,229, -216, 6,219,174,182,109,182,125, 97,103, 98, 23,103,183,197,174,195,238,147,189,147,125,186,125,141,253, 61, 7, 13,135,217, 14, -171, 29, 90, 29,126,115,180,114, 20, 58, 86, 58,222,154,206,156,238, 63,125,197,244,150,233, 47,103, 88,207, 16,207,216, 51,227, -182, 19,203, 41,196,105,157, 83,155,211, 71,103, 23,103,185,115,131,243,136,139,137, 75,130,203, 46,151, 62, 46,155, 27,198,221, -200,189,228, 74,116,245,113, 93,225,122,210,245,157,155,179,155,194,237,168,219,175,238, 54,238,105,238,135,220,159,204, 52,159, - 41,158, 89, 51,115,208,195,200, 67,224, 81,229,209, 63, 11,159,149, 48,107,223,172,126, 79, 67, 79,129,103,181,231, 35, 47, 99, - 47,145, 87,173,215,176,183,165,119,170,247, 97,239, 23, 62,246, 62,114,159,227, 62,227, 60, 55,222, 50,222, 89, 95,204, 55,192, -183,200,183,203, 79,195,111,158, 95,133,223, 67,127, 35,255,100,255,122,255,209, 0,167,128, 37, 1,103, 3,137,129, 65,129, 91, - 2,251,248,122,124, 33,191,142, 63, 58,219,101,246,178,217,237, 65,140,160,185, 65, 21, 65,143,130,173,130,229,193,173, 33,104, -200,236,144,173, 33,247,231,152,206,145,206,105, 14,133, 80,126,232,214,208, 7, 97,230, 97,139,195,126, 12, 39,133,135,133, 87, -134, 63,142,112,136, 88, 26,209, 49,151, 53,119,209,220, 67,115,223, 68,250, 68,150, 68,222,155,103, 49, 79, 57,175, 45, 74, 53, - 42, 62,170, 46,106, 60,218, 55,186, 52,186, 63,198, 46,102, 89,204,213, 88,157, 88, 73,108, 75, 28, 57, 46, 42,174, 54,110,108, -190,223,252,237,243,135,226,157,226, 11,227,123, 23,152, 47,200, 93,112,121,161,206,194,244,133,167, 22,169, 46, 18, 44, 58,150, - 64, 76,136, 78, 56,148,240, 65, 16, 42,168, 22,140, 37,242, 19,119, 37,142, 10,121,194, 29,194,103, 34, 47,209, 54,209,136,216, - 67, 92, 42, 30, 78,242, 72, 42, 77,122,146,236,145,188, 53,121, 36,197, 51,165, 44,229,185,132, 39,169,144,188, 76, 13, 76,221, -155, 58,158, 22,154,118, 32,109, 50, 61, 58,189, 49,131,146,145,144,113, 66,170, 33, 77,147,182,103,234,103,230,102,118,203,172, -101,133,178,254,197,110,139,183, 47, 30,149, 7,201,107,179,144,172, 5, 89, 45, 10,182, 66,166,232, 84, 90, 40,215, 42, 7,178, -103,101, 87,102,191,205,137,202, 57,150,171,158, 43,205,237,204,179,202,219,144, 55,156,239,159,255,237, 18,194, 18,225,146,182, -165,134, 75, 87, 45, 29, 88,230,189,172,106, 57,178, 60,113,121,219, 10,227, 21, 5, 43,134, 86, 6,172, 60,184,138,182, 42,109, -213, 79,171,237, 87,151,174,126,189, 38,122, 77,107,129, 94,193,202,130,193,181, 1,107,235, 11, 85, 10,229,133,125,235,220,215, -237, 93, 79, 88, 47, 89,223,181, 97,250,134,157, 27, 62, 21,137,138,174, 20,219, 23,151, 21,127,216, 40,220,120,229, 27,135,111, -202,191,153,220,148,180,169,171,196,185,100,207,102,210,102,233,230,222, 45,158, 91, 14,150,170,151,230,151, 14,110, 13,217,218, -180, 13,223, 86,180,237,245,246, 69,219, 47,151,205, 40,219,187,131,182, 67,185,163,191, 60,184,188,101,167,201,206,205, 59, 63, - 84,164, 84,244, 84,250, 84, 54,238,210,221,181, 97,215,248,110,209,238, 27,123,188,246, 52,236,213,219, 91,188,247,253, 62,201, -190,219, 85, 1, 85, 77,213,102,213,101,251, 73,251,179,247, 63,174,137,170,233,248,150,251,109, 93,173, 78,109,113,237,199, 3, -210, 3,253, 7, 35, 14,182,215,185,212,213, 29,210, 61, 84, 82,143,214, 43,235, 71, 14,199, 31,190,254,157,239,119, 45, 13, 54, - 13, 85,141,156,198,226, 35,112, 68,121,228,233,247, 9,223,247, 30, 13, 58,218,118,140,123,172,225, 7,211, 31,118, 29,103, 29, - 47,106, 66,154,242,154, 70,155, 83,154,251, 91, 98, 91,186, 79,204, 62,209,214,234,222,122,252, 71,219, 31, 15,156, 52, 60, 89, -121, 74,243, 84,201,105,218,233,130,211,147,103,242,207,140,157,149,157,125,126, 46,249,220, 96,219,162,182,123,231, 99,206,223, -106, 15,111,239,186, 16,116,225,210, 69,255,139,231, 59,188, 59,206, 92,242,184,116,242,178,219,229, 19, 87,184, 87,154,175, 58, - 95,109,234,116,234, 60,254,147,211, 79,199,187,156,187,154,174,185, 92,107,185,238,122,189,181,123,102,247,233, 27,158, 55,206, -221,244,189,121,241, 22,255,214,213,158, 57, 61,221,189,243,122,111,247,197,247,245,223, 22,221,126,114, 39,253,206,203,187,217, -119, 39,238,173,188, 79,188, 95,244, 64,237, 65,217, 67,221,135,213, 63, 91,254,220,216,239,220,127,106,192,119,160,243,209,220, - 71,247, 6,133,131,207,254,145,245,143, 15, 67, 5,143,153,143,203,134, 13,134,235,158, 56, 62, 57, 57,226, 63,114,253,233,252, -167, 67,207,100,207, 38,158, 23,254,162,254,203,174, 23, 22, 47,126,248,213,235,215,206,209,152,209,161,151,242,151,147,191,109, -124,165,253,234,192,235, 25,175,219,198,194,198, 30,190,201,120, 51, 49, 94,244, 86,251,237,193,119,220,119, 29,239,163,223, 15, - 79,228,124, 32,127, 40,255,104,249,177,245, 83,208,167,251,147, 25,147,147,255, 4, 3,152,243,252, 99, 51, 45,219, 0, 0, 0, - 6, 98, 75, 71, 68, 0,255, 0,255, 0,255,160,189,167,147, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,215, 0, 0, 13,215, 1, - 66, 40,155,120, 0, 0, 0, 7,116, 73, 77, 69, 7,219, 2, 27, 16, 38, 47, 61,220,216,191, 0, 0, 32, 0, 73, 68, 65, 84,120, -218,236, 93,119,120, 20,213,226, 61, 51, 59,179,187,217,146, 77, 35, 61,144, 66, 9, 96, 0, 67, 81,130, 84, 65, 80,140,138, 10, - 86,132,167,207,103,197,134, 5, 84, 68, 68, 32, 54, 64,240, 39,242,208,167,128,160,128, 5, 4,164, 68, 74,232, 29,233, 9,144, - 4, 18, 66, 58,201, 38,219,203,220,223, 31,217, 89, 55,203,182, 64, 98,129,123,190,111,190,221,157,157, 57,115,239,157,123,239, -156, 57,183, 1, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,215, 52, 86,175, 94, 77,154,112,248,144, - 64, 57, 29,219,128,191, 59,103, 11,198,157, 52, 35,231, 0, 7,231,187,255,144,112, 14,248,187,114,138,241,109, 2,239,144,166, -228,163,230, 74, 79,151,112,146,230, 14,103, 75,113, 54, 87, 57,242, 16, 78,210, 2,247,253,221,127, 72, 56, 7,252,221, 56,221, -243, 79,128,188, 77,226, 12, 48, 79, 53, 53,156,164,185,195,217, 82,156, 87, 91,142,124,132,147, 92,109, 94,242,114,239,223,197, -117, 4,174, 5, 69, 86,192,200,204,204,100, 92,248,153,191, 43,167,107, 58,136,252,205, 25,214,102,196,150,230,230,116, 75,207, -230,194,187,153,153,153,204,234,213,171,183, 2, 24,208,156,113,111,142,251,238, 22,215,102,225,189, 2,145,213, 36,206,230,202, -247, 45,205,217, 92,101,201,157,179, 57,242,189,167,251,222,130,247,168,185,194,217, 44,101,169, 37,242,188,135,252,115,213,188, -238,156,205, 81,150,220, 57,155, 35,223,255, 25,156,205, 81,150, 60,113, 54, 71,190,247,118,239,175, 55,131,138,253,139, 5,129, -123, 1, 31,248,119, 22, 68, 45, 37, 54,155,224,192,252,229,156,205,124,143,222,117,112, 54,231,219,205,192,230,186, 71, 45,145, -223, 93, 57,155,139,223,157,167, 57,238,147, 39,206,171, 13,175,151,112, 54,123,220,175, 54,223,255, 89,156,205,124,143,154,165, - 44,185,113, 14,108,230,151,129,129, 46,191,223,109, 78,206,230, 42, 75, 30,194,121,213,247,201, 19,231,213,134,215, 75, 56,155, - 61,238,205,241, 12,105, 41,222,107, 26, 45,213,124,214,220,156, 77,228,190,166, 56,155,216, 60, 51,164, 5,238,253, 95, 26,206, -230,228,116, 15, 99,115, 54,247,180,100, 56,155,147,179, 9, 97,189,230, 56,255,105,247,253,239,152,158,222,248,174,166, 89,202, -155, 59,218, 18,225,108, 78,206, 0,185,175, 9,206,171,184,247,215, 28,184,191, 75, 64,196,132,111,230, 55, 19, 52,179, 3,211, -146,194,181, 57,195, 57,176, 37, 28,194, 22, 64,179,135,211,241,166, 60,185, 5,226,254, 79, 73, 83, 90,150,104, 89,250,219,149, - 37,183, 60, 57,176, 25,157,162,102,117,158,221, 57,155,227, 26,174, 28,205,149, 71, 91, 58,238,205, 89,150, 90,226,222, 83, 92, -133, 11, 65, 57, 41, 39,229,164,156,148,147,114, 82,206,235,150,243,154, 4, 75,147,128,130,130,130,130,130,130,130,130,130,130, -130,130,130,130,130,130,226, 31, 5,175,237,187,113,113,113,171,149, 74,101, 59,111,255,235,116,186,139, 23, 47, 94, 28, 68,147, -240,175, 3,189, 71, 20,255, 32,176,248,195, 65, 23, 0, 16,199, 70, 65, 65, 65,113, 77,195,107,103,120,185, 92,158,114,242,228, -201, 14,130, 32,192,110,183,195,102,179, 57, 63,205,102, 51,250,247,239,223,228,142,244,209,209,209, 57, 18,137, 36,169, 41,231, -216,237,246,243,101,101,101,125,125, 28,178, 19, 64, 10,195,252,161, 25,197,239,222, 62, 1,148, 88,173,214,238,190, 56, 25,134, - 73,113,231,243,194, 37,126,247,201, 25, 18, 18,178,159,227,184, 4, 79, 92,222,190, 11,130,144, 95, 81, 81,209,231,207,188, 71, -215, 51,162,163,163,115, 56,142,107,114,254, 44, 45, 45,245,154, 63, 99, 99, 99, 15,177, 44, 27,215, 4, 74,137, 32, 8,185, 23, - 47, 94,236,235, 67,136,236, 4,144,226,243, 13,202, 45, 63, 49, 12, 83,108,183,219,123,250, 43, 71,190,184, 60,228, 81,127,156, - 78,145,197,113, 92, 86, 84, 84,212, 51,122,189,222, 8,128, 72, 36, 18,226, 18, 54, 0,128,205,102,171,168,169,169,233, 66,115, - 34, 5, 5,197,117, 33,180, 4, 65, 96, 77, 38, 19,242,242,242, 64,136,199,250,222,126, 5,215,235,112,224,183,141, 81,193, 81, -209,176, 89, 44, 80,181,138,116,114,151,157, 56, 6,155,213, 2,155,217,140, 54,189,122,139, 97, 64,231,206,157, 37,126, 56, 19, - 62,248,224,131,168,224,224, 96, 24,141, 70, 24,141, 70,152, 76, 38, 24,141, 70,152,205,102,152,205,102, 88, 44, 22, 88, 44, 22, -216,108, 54,152, 76, 38,100,103,103,219,173, 86,171, 79,206,105,211,166, 69,105, 52, 26, 39,159,184,137,156, 34,175,213,106,133, -209,104,196,166, 77,155,124,114,114, 28,151, 80, 82, 82, 18, 37,149, 74, 65, 8,129, 32, 8, 32,132, 52,218,220,209,182,109, 91, -139,175, 64,182,208, 61,186,158,209, 97,218,210, 53, 81, 33, 10, 57,108,130,128,204,110,109,157,127,228,127,185, 28,196,102,135, - 96,179,161,253,243,163,157,251, 59,117,234,228, 51,127, 18, 66, 18,167, 45, 93, 19, 26, 40,103, 85, 85,149,161, 99,199,142, 37, -104,112,155,189, 9,173, 4,131,193, 16,229,224,191, 76, 16,177, 44,219,104, 91,191,126, 61, 50, 51, 51,253,197, 61,225,229,151, - 95,142,178, 90,173, 48,155,205, 48,153, 76,176, 90,173,176,217,108,206,205,110,183, 59, 55,179,217,140, 61,123,246, 4,234,100, -125,112,219,109,183, 61,190,102,205, 26,213,207, 63,255,172, 74, 74, 74,130, 84, 42,133, 68, 34,129, 68, 34, 1,203,178,224, 56, - 14, 55,223,124, 51, 67,179, 32, 5, 5,197,117, 35,180, 76, 38, 83, 65,122,122, 58,113,124,143,151,203,229, 82,183,183,220,184, -246,237,219,231,186,159,231,175,185, 42, 56, 42, 26, 19, 91,135, 3, 0,222, 57, 87,229,124, 64,124,216,231, 70,231, 49,239, 93, -168, 5, 0, 40, 20, 10, 48,174,175,209, 94,160, 82,169,112,219,109,183, 65, 38,147,161,103,207,158,224,121,222,227, 38,149, 74, -193,243,188,223, 68, 97, 24, 6,106,181, 26, 83,166, 76, 17, 69, 18, 84, 65,114,140,235,211, 19, 65, 32,248,239,177,211, 48, 11, - 4, 28,199, 57,183, 64, 56,165, 82, 41,142, 30, 61, 10,142,227, 32,145, 72,156,159,226,247, 85,171, 86, 97,228,200,145,224, 56, - 14, 10,133, 2,240, 51,115,176,235, 61, 50,155,205,177, 50,153,204, 2, 64, 20,103, 82,134, 97, 98,174,228, 30, 93,207, 8, 81, -200, 49,102,222, 79, 0,128,162, 89,207, 59,239,221,158,103,223,113, 30,147,248,159, 7,192, 48, 12,120,158, 7,203,178,205,198, - 89, 93, 93,109,120,232,161,135,182, 7, 7, 7,175,215,106,181,240, 35,224, 80, 84, 84, 4,142,227,188,230,119,150,101, 49,115, -230, 76,156, 57,115, 38,160,184, 27,141, 70, 44, 88,176, 0,118,187,189, 17,175,248,221,125, 95,128, 34,235,253,161, 67,135,142, - 94,179,102, 77, 24,195, 48,248,236,179,207, 32,149, 74, 49,124,248,112, 68, 68, 68, 96,195,134, 13,144, 74,165,120,253,245,215, -105,230,163,160,160,240, 85,231,241, 0,110, 4, 16,233, 48, 17,234, 0,132,186, 28, 82,225,248,140, 20,127, 51, 12,179,207, 3, - 79, 47,199, 49, 21, 12,195,236,115,249,109, 6, 32,243,176,191, 10,128,194,177,153,208,224,254,167,185, 92, 71, 60, 15,222,174, -203, 1, 13,235, 15, 1,216, 2, 96, 96,102,102,230, 86, 0, 40, 45, 45,189,163,180,180, 20, 0,144,146,146,114, 50, 55, 55,183, -163,168,121, 28,205, 83, 82,155,205,214, 65,108,170, 18,221,162, 33, 67,134,248,124,195,183, 89, 44,151, 9, 16, 79, 90,202, 83, -115,133, 55, 1, 99,177, 88,240,192, 3, 15, 0,128,215,135,142,235, 22,128,118,131,217,108, 6,199,113, 72,109, 29,137, 73,195, -210,113, 19,177, 66, 87,207,192, 86,171,195, 61,106, 43, 78,118,238,142,249,231, 43,112, 78, 91, 15,142,227, 2,226, 20, 4,193, -171,200,146, 72, 36,152, 55,111, 30, 30,122,232, 33, 72, 36,146,128,248, 92,239, 81,114,114,242,154,220,220,220, 8,134, 97, 76, -142,123, 36,183,217,108, 26,155,205, 22, 97,183,219, 35,154,114,143,174,103,216, 4,193, 99, 62,244,150,103, 3,185, 79,129,112, - 86, 87, 87, 27, 50, 51, 51,119,203,229,242,133,209,209,209, 37,197,197,197,126,133,150,187,248,113,127,169,248,228,147, 79, 48, -103,206, 28, 12, 26, 52, 40,160,112,154, 76, 38, 48, 12,131,249,243,231, 95,246,223,212,169, 83, 47,187,158, 31, 78, 6, 0, 27, - 23, 23,247,236,186,117,235, 52,226,177,173, 90,181, 2,207,243,232,210,165, 11,130,131,131,177,125,251,118,216,237,246,128,203, - 37, 5, 5,197,181, 11, 79, 90,196, 5,253, 39, 78,156,216, 51, 43, 43,107,122, 70, 70,198,119, 59,119,238, 92,202, 48,204,106, -151, 58, 49,211, 81,191,174, 22,127, 19, 66,122,185,138, 30,135, 88,139,100, 24,102,181,120,188,235,111,241,147, 16, 50, 4,128, - 76,252, 61,113,226,196,180,172,172,172,233, 19, 38, 76,120,115,198,140, 25,210,137, 19, 39,118,205,202,202,154, 46, 94,199, 83, - 56, 60, 57, 90, 62,215,158, 18,155,168, 78,157, 58,229,173,137,202,245, 1,224,179,182, 84,181,138,116, 58, 89,239, 37, 70, 56, -247, 79, 41,174,113, 62,192,230,246,104, 7,149, 74,133, 97,239,125, 20,144, 83,100, 54,155, 81, 94, 94,238,116, 25,252,109,129, -114, 42, 21, 65,200,126,185, 11,138,170,100,120,119, 87, 53,214, 28, 62, 3,158,231,113,123,231, 46,184, 67, 26,140,183, 19,101, -120,249,116, 33,172, 36,176, 62,189,132, 16,143, 2, 75,252, 46, 54,161, 4, 42,180,220,238, 81,145,209,104,172,202,203,203, 51, - 8, 13, 15,118, 5, 33, 36,140, 97,152, 58,135,203, 21, 27,232, 61,186,158,145,217,173,173,211,117,218, 19, 60,216,185,127,164, -238,168,243,158,140,159,247, 33, 0, 96, 80,247,155,253,150,135, 64, 56,171,170,170, 12,125, 7, 15,220,106, 55,152,191, 25, 61, -122,116,193,230,205,155, 21,129,132,213,147,208, 18, 93, 91, 81,100,113, 28, 7,179,217, 28, 80,220,205,102,179,215,242, 33,149, - 74,175,196,209,130, 78,167, 51,175, 92,185, 18,115,231,206, 69, 68, 68, 4,134, 14, 29,138,216,216, 88, 44, 95,190, 28,132, 16, - 60,255,252,243, 80, 40, 20,162,123, 77, 51, 32, 5,197,245, 13, 95, 90, 68,158,149,149, 53,221, 93,200,184,254,118, 21, 80,110, - 98,202, 85,172,165,249,121,254,175,118, 23, 79,226,117, 25,134, 89, 61, 99,198,140, 76, 63,225,168,240, 38,180,124, 78,137,111, - 50,153, 10,186,117,235, 22,144,154,208,235,245,165,254,196,134,167,183,122, 87,151, 64,173, 86, 67,165, 81,131, 13,176,222,181, - 90,173, 78,161,178,113,227, 70, 40, 20, 10, 12, 31, 62,252,170, 28, 45,139,197, 2,153,148, 7,219, 42, 26, 99,102,109, 70, 85, -157,193,249,128,217,146, 95,128,131,101,229,120, 57, 99, 48, 84,138,114,212,155,205, 1, 57,111,130, 32, 92, 38,178, 56,142,195, - 3, 15, 60,224,116, 19, 92,251,173,192, 71,211, 97, 68, 68,196,126,142,227, 18, 92,238, 81, 80, 74, 74, 10,240, 71,191, 30, 70, - 16,132,250,208,208,208, 31, 1,196, 17, 66, 18, 0, 4, 7,114,143, 40, 60,231, 79,247,253,130,155, 83,117, 37,156, 85, 85, 85, -134,204,204,204,221,118,131,249,155, 11, 23, 46,236, 6, 16,116,211, 77, 55, 53, 89,104,137, 2,139,231,121,204,156, 57, 19,115, -230,204,113,254, 31,168,208,178,217,108,141, 4,212,233,211,167, 27, 93,203, 93,216,249,105, 54, 37,104, 24, 93, 40,164,164,164, - 56,207,137,137,137, 65,104,104, 40, 4, 65,128, 32, 8, 8, 10, 10,130, 66,161,128, 84, 42,165,153,142,130,130,194,151, 22, 49, - 76,152, 48,225, 77,134, 97, 86, 59,156,165, 99, 62, 4,149, 39,237,209,203, 77,172, 85,120, 57, 46,211,147,216,114,253, 46, 98, -226,196,137,105,238,225,240,212, 92,233,172, 85,221,166,221,111, 4,215, 38,170,230,122,136,249,122,144,169, 67, 53, 80,168, 84, -144, 72, 88, 48, 12, 67,252,113, 89, 44, 22,103,197,255,204, 51,207,248,236,183, 18,104,127, 42,139,197, 2,150,147,224, 98, 76, - 50,236,236, 54,231,185,226,198,114, 60,206,197,116,132,228,212, 33,240, 1, 62,112,221, 29,173,231,159,127, 30, 11, 22, 44, 0, -203,178,206, 52,225, 56, 14,237,219,183, 71, 65, 65,129, 79, 46,142,227, 18,206,157, 59, 23,229,154,142,162,136, 37,132,192,110, -183,163,109,219,182,198,188,188,188, 23,105,209,189, 58,145,229,109,191,221, 46, 4,236,194,120, 58,174,170,170,202, 48,106,212, -168,173,181,181,181,223,220,112,195, 13,167,209,120, 10, 4,191,124, 28,199, 53, 18, 88,162,200,250,244,211, 79, 27,137, 34,171, -213, 26,208,139,128,213,106,189, 76,240,124,252,241,199,141, 62, 1,160, 79,159, 62, 1, 57,195, 0, 8,203,178, 68, 42,149,226, -182,219,110, 67,215,174, 93,241,243,207, 63, 67, 16, 4, 60,247,220,115, 80, 40, 20,152, 61,123, 54,108, 54, 27, 62,248,224, 3, -234,104, 81, 80, 80,248,210, 34,166, 25, 51,102, 28,155, 49, 99,134,211, 89,114,119,180,188, 60,119,239,116,136,170, 72, 81,164, - 1, 48,121, 18, 68,158, 92, 50,119, 1,230,186, 47, 43, 43,107,186,123, 56,220,155, 43, 27, 9,173, 63, 11,165,199,143,226,163, - 91,210, 1, 52,110, 46,156,119,115, 71,168,212, 42,168,130,213, 24,181,106, 27, 0, 56, 42,253, 9, 1, 57, 90,162,208,170,170, -170,242, 41,178,154,226,104,177, 50, 14, 43, 18, 46,129,200,120,112,102,107, 35,161, 37,225,120, 20, 69, 36,131,229,165,224,236, -182,128, 56, 9, 33,151, 53, 21,142, 29, 59, 22, 12,195, 56, 71,136,117,235,214,205,149,139,241,247,112,124, 45,188,161, 15,158, -123,115,236, 7,149, 70, 90, 98,175, 36,127,238,255, 18, 39,127,120, 22, 0,208, 87,167,115,222,139,105,221,254, 24, 59, 48,235, -232, 86,167,251,248, 30, 94,189, 34,206,170,170, 42,195, 77,157,210,118, 75,195, 67,190, 57,127,254,252,110, 0,236,131, 15, 62, - 24,218,173, 91,183,128,202,164, 56,184,194, 93,100,185, 58, 89,226,167,159, 17,182, 46,194,209, 30,144,128, 18,155, 17, 3,200, -243, 68,204,219, 26,141, 6,106,181,218, 57,226, 54, 40, 40, 8, 74,165,210,217,191, 51, 64,225, 70, 65, 65,113,253, 34, 76, 20, - 58, 14,177,212,200,105,114,244,173,202,116,253,237,201,241,114, 56, 80, 57,126,234,215, 53, 14,129,230, 17,162,179,230,118,206, -106,111, 34,141, 19, 21,164,235,103, 76, 76,204,175,106,181, 58, 57,208,216, 55,101, 20,155,221,106,185,204,217, 98, 24, 6,234, - 96, 53, 20,106, 21, 20,193,106,175,174,151, 47,161, 37, 58, 69,226, 67,103,225,194,133, 80,171,213,248,215,191,254,213,228, 62, - 90, 78,161, 37,101,177, 65,190, 9, 18, 25,215, 72,100,113, 28, 7, 9,207,163, 84, 29, 11,150,231,193,217, 2,115,201,106,107, -107,193,113, 28, 38, 77,154,228,124,131,119, 21, 89, 77,137,179, 47,176, 12, 35,186, 91,242,118,237,218,189,202, 48, 76, 34,128, - 36,157, 78, 39,191,120,241,226,173,180,188,250, 80, 6,118,235,101, 46,148, 55,247,245, 74, 57, 69, 39, 75, 26, 30,242, 77,199, -142, 29,157, 78,150, 82,169, 20, 71,155,250,191,199, 44,235, 81,100,185,143, 16,228, 56,174, 33, 47,251, 25, 29,233,234,104,205, -152, 49,195,201,235,234,100,137,104, 74, 57, 18,195,186,117,235, 86, 28, 60,120, 16,207, 60,243, 12, 20, 10, 5,230,204,153, 3, -155,205,134,169, 83,167, 66,161, 80, 64, 38,147,209,204, 71, 65, 65,221,172, 70, 90,196, 13, 21,110,253,160, 24, 55, 81, 83,225, - 73, 96,185, 54, 19,138,223, 25,134,177,122,224, 53,187, 53, 41,186,239, 23, 63,171,102,204,152,177, 89,116,178, 92,246, 55, 10, -135, 95, 71, 75, 46,151, 39,231,229,229, 57, 39,194,244,245,105, 54,155, 49,104,208,160,128,157, 49,113,212, 33,199, 73, 26, 9, - 11,101,176, 26, 74, 77, 48, 20,106,181,187,224, 96,252, 85,226,226, 27,177,171,208,154, 60,121, 50, 56,142,195,130, 5, 11, 0, - 0,175,190,250,106,192,125,180, 68, 78,216, 25, 20,147,179, 72,159, 53, 18,230,111,173, 40,219,241, 59, 56,142, 67, 84,239, 59, - 32,220, 52, 18,122,133, 26,156,221, 22,240,168,195,234,234,106, 20, 20, 20, 64, 34,145,224,149, 87, 94,105, 52,215,145,251, 72, -182,141, 27, 55,250,141,187, 39, 39,107,242,249,106, 39,143, 66,161, 96,127,255,253,247,100, 65, 16, 82, 12, 6, 67,187, 62,125, -250, 8,180, 40,251, 17, 69,130, 45, 32, 81, 21,104,254,116,231, 20,251,100,213,214,214,126,115,254,252,249, 61, 0,216,209,163, - 71,135, 42,149, 74,124,245,213, 87,122, 0,178,229,203,151, 43,252,137, 34, 49,223,248, 19, 89, 60,207, 55,228,229, 64,226, 78, - 26, 79, 89,226,175, 99,124, 32,121, 94, 12, 43,195, 48,176,219,237, 80, 40, 20,141,156,172,160,160, 32,200,229,114,154,241, 40, - 40, 40,252,213, 37,251, 2,174,199, 9,233,229, 34,170,246, 93, 9,111, 83,174,231, 15,156, 55,161, 97, 50,153,112,226,196,137, - 64,121, 2,158, 24,179,117,207,155,241,222,133, 90, 48, 12,131,255,246,185, 1, 42,141, 26, 74,149, 10,247,255,188,213, 89,113, - 31,157,254, 42,228, 42, 53,226,250, 13, 13,168, 34, 23,155, 14, 93,133, 86, 77, 77, 13,120,158,199,251,239,191, 15,150,101,241, -193, 7, 31, 32, 62, 62, 30, 23, 47, 94,196,242,229,203, 3,114,180, 36,118, 9, 98, 31,235, 4,229,216, 16,104, 30,235,143,176, -219, 38,227,130,153,195, 78,163, 18,253,141,199, 33,219,240, 41,204,130, 61,224, 17, 88, 54,155, 13, 91,183,110,117,239,240,238, -236, 83,101,179,217, 96,181, 90, 97,177, 88,240,193, 7, 31, 4, 50,194,243,178,251, 38,166,161, 99, 18, 84, 73,110,110,110, 36, - 33, 36, 28, 64, 8,128, 74, 90, 92,125, 35,182,247,243,136,236,249, 52, 0, 96,213,140, 39,156,251, 39, 29,253, 35,127,206,252, -182, 97, 1,128,142, 73, 67,155,196, 89, 85, 85,101,184,125, 80,159, 28,163,192,127,221,165, 75,151, 70, 78, 86, 80, 80, 16,227, -248, 29,144, 93,198,178, 44, 36, 18,201,101,205,133,222,196, 86, 32,125,180,108, 54,155,115, 34, 81, 95,253, 25,175,196,209,122, -226,137, 39, 16, 27, 27,235,116,178,222,123,239, 61, 40, 20, 10, 76,156, 56, 17, 86,171, 21,159,126,250, 41,205,124, 20, 20, 20, -127,186, 40,251, 51,224,177, 38, 53, 26,141,133, 93,187,118,133,151,255,226,131,130,130,120,183, 72,197,181,111,223, 62,215, 67, - 19,226, 16, 0,217,158, 42,117,134, 97, 16,172, 9, 70,144, 90, 5,165,155,139, 21, 20,172,129, 92,173, 6, 43,245, 88,153, 95, -198, 41,246, 45,113, 21, 90,226, 86, 91, 91, 11,158,231, 49,119,238, 92,104, 52, 26,152, 76, 38,191,156,226, 67, 71, 34,145, 64, - 95, 84,135,147,211,179, 33, 11,218,137,118, 67, 31, 66, 44,175,128,116,251,143, 48,216,173,254, 38, 44,189,140,179, 67,135, 14, -120,231,157,119, 46,155,214,193, 27,226,227,227,253,198,221,221,201,154,121, 67, 27, 72,101, 82,140, 63, 94, 4,147,201,196, 60, -244,208, 67, 2, 0, 3,128, 10,131,193,112, 62,144,244,108, 6,252,227, 57,125,141,138, 21, 33, 16,187, 39, 1,227,145, 83,116, -178,140, 2,255,117, 65, 65,129,232,100,133, 40,149, 74,124,241,197, 23,122, 0,236,212,169, 83,149,137,137,137,146, 64,242,146, - 68, 34,193,172, 89,179, 60,246,201,242, 36,186,154, 82,142, 92,207, 29, 48, 96,128,199, 9, 75,189,136,183,203, 56,197,176, 70, - 68, 68, 56,157, 44,187,221,238, 28,109, 40,206, 62,239,227,165,130,230, 79,202, 73, 57,175, 31,206,107, 18, 30,107,224,139, 23, - 47,222,238,237,132,182,109,219,230,229,229,229,181, 23,151,226,112, 84,156, 82,163,209,216,161, 79,159, 62,126,173, 29, 65, 16, - 32,151,203, 65, 8,193,173,239,100,129, 97, 1, 22,141, 31, 98, 81,183, 12,134, 68,194, 65,104, 88,234,195,239,168, 67,131,193, -208,232,225,224,105,171,175,175,135,201,100, 10,120, 54,111,163,209,216,104, 10, 6,134, 8, 56,247,219,178,203, 70, 31,138, 91, -160,253,118,130,130,130, 26, 53,253,248,113,172,152, 64, 28, 45,215,166, 71,169, 76, 10, 78,202,139,142, 86,221,233,211,167, 71, -209,108, 30, 56,196, 1, 11, 0,144,218,103, 56, 4,193, 14, 98,183, 55, 90, 38,169, 83,242,237, 16,136, 29, 22,171, 30, 38,147, -201,223,180, 39, 76,101,101,165, 97,212,168, 81, 91, 1,252,239,158,123,238,201, 69,195,236,194, 68,173, 86,203,121,158, 23, 0, - 84, 3, 32,151, 46, 93, 10,185,112,225,130, 96, 52, 26,219,248, 11,231,154, 53,107,112,226,196, 9,244,235,215,175,209,114, 80, -162, 43,234, 58,187,123, 32,249, 83,108, 46,247, 52, 35,188, 55, 33, 23, 40, 36, 18, 9, 66, 66, 66, 32,149, 74,241,254,251,239, - 67, 42,149, 66,169, 84, 2, 0, 62,253,244, 83,231,228,171, 20, 20, 20, 20,215,141,208,242, 87,111,250,104, 86,244,217,132,104, -179,217,138, 19, 19, 19,155,116, 49,187,221, 94,230, 71,184, 21, 47, 95,190, 92,234,234, 66,248,251, 36,132,148,249,121,216, 22, -175, 90,181, 74,234,201,221,240,182,192,180, 63, 78,187,221, 94,156,148,148,228,213, 49,241, 4,171,213,122,193,159,104,205,170, - 48, 52, 18, 9,227,143, 23,121, 93, 59,145,194,111, 94,243,145, 63,223,186,210,252,121, 58, 53, 53,245, 66,104,104,232,218,232, -232,232,170, 29, 59,118, 68,244,234,213, 43,194,245,152, 94,189,122,197,186,157,102,134,247,117, 14,193, 48, 76,241, 61,247,220, -227, 49,207,139,162,201, 67,254, 44,246,151,231,247,238,221, 43,117, 61,223, 27,191, 75, 57, 42, 14, 64,184,158, 75, 79, 79,103, - 93,121,188,229,125,171,213, 90, 65,115, 33, 5, 5,197,117, 47,180, 12, 6, 67, 81,215,174, 93,109, 94,254, 59,239,235,220,170, -170,170,158,205, 29, 1,171,213,218,231,159,192, 89, 89, 89,217,172,113,183,217,108,197,142, 9, 74,125, 30, 67,179,248, 95,119, -143, 0,160,188,188,252, 38, 0,208,233,116,240,183,172, 78, 19, 4, 97,179,231, 79,155,205,214,167, 37,210,180,186,186, 58,131, -230, 44, 10, 10, 10, 42,180,154, 0,186, 24,241,223, 3, 45, 33, 90, 41, 40, 40, 40, 40, 40, 40,154, 23, 44, 77, 2, 10, 10, 10, - 10, 10, 10, 10,138,150, 1,131,134,145, 3,158,208,148,209, 4, 67,174,224,218,217,148,147,114, 82, 78,202, 73, 57, 41, 39,229, -188,238, 56,253,113,211,209,140, 45, 44,192, 40, 39,229,164,156,148,147,114, 82, 78,202,121,253,113, 94,147,160, 77,135, 20, 20, - 20, 20, 20, 20, 20, 20, 45, 4,142, 38,193, 95, 6, 9,154, 48,163,190, 63, 16, 66,194, 0,120, 91, 48,206,204, 48,204,165, 43, -224,100, 0, 72, 29,155, 56,209,145, 21,128, 5,128,133, 97, 24,226,159,227, 93,182,164, 36, 44,141,216,249, 94,132, 97,120, 65, -192,225, 54,109, 90, 31, 98,152, 59,204, 0,160,138,238,212, 89,173, 82, 12, 49, 89,204,201,114, 94,118,162, 70, 87,191,209, 84, -158, 87, 72,179, 7, 5,197, 95,130,187, 0, 76, 65, 67,183,146, 25, 0,150,209, 36,161,160,104, 33,161,165, 86,171,247,179, 44, -155,224,111,126, 30, 17,142,181,204,138, 47, 93,186,212,179, 9,215, 30,165, 86,171, 7,241, 60,127, 11, 0, 88,173,214, 29,245, -245,245,155, 1, 44, 7, 96,187,194, 56,105, 0, 60, 0,224, 17,199,239, 37,142,202, 66,123,133,124, 93, 67, 66, 66,126,224,121, -158, 84, 86, 86,246, 6,128,136,136,136,221, 86,171,149,209,106,181,247, 3, 56,210, 68, 62,150,231,249,153,189,123,247,238,191, -109,219,182,255, 1,152,219, 76,247, 82,206,178,172, 71,129, 34, 8, 66,210, 21,136, 44, 41,128,144,185,115,231, 70, 44, 94,188, - 56,189,184,184,184, 11, 0, 36, 36, 36, 28, 29, 61,122,244,161,113,227,198, 85, 17, 66,106, 25,134,177,248,226, 41, 41, 9, 75, - 43, 47,205,127,166,172,252,196, 3, 0, 16, 19,219,101,153, 68,194, 74, 9, 57,176, 75,217,234,145, 86,237,219, 37, 61,253,221, - 87,115,165, 73,201,173,177,105,231,193, 27,199,189,248,102,218, 5,224, 19, 42,182,254, 60, 4, 7, 7,239,103, 89, 54,193, 87, - 25,247, 84,230,237,118,123,113,117,117,117, 79,111,156, 28,199, 37,248,170, 47, 60,237, 19, 4, 33,191,178,178,210,227, 84, 19, - 26,141,102, 23,199,113,201,129,114,137,159, 54,155,173,216,219, 40, 93,141, 70,179, 95, 34,145, 36,248,138,167,167,255, 4, 65, -200,175,168,168,240, 22,206,203,226,222, 28,225,188, 18, 78, 95,225, 20,235, 35, 0,159, 70, 68, 68,220, 92, 85, 85,245, 40,128, - 55,181, 90,109, 55,137, 68,130,240,240,240, 55,205,102,243,153,144,144,144, 47,107,107,107,119, 2,120, 17, 0, 93, 47,149,130, -162,185,160,209,104,202,234,235,235,137, 8, 65, 16,136,213,106, 37, 38,147,137, 24, 12, 6,162,211,233, 72,125,125, 61,209,106, -181,164,182,182,150, 84, 85, 85,145,200,200, 72,247,201, 27,189,181,225,118,209,104, 52,121, 89, 89, 89,166,130,130, 2, 98,177, - 88,136,197, 98, 33,133,133,133,228,163,143, 62, 50,105, 52,154, 60, 0, 93,188,156, 59,196, 75,101,113, 27,128,165,233,233,233, -230, 53,107,214, 16,163,209, 72,116, 58, 29, 89,182,108, 25,185,225,134, 27,204, 0,150, 58,142, 97, 3,228, 4,128,190, 49, 49, - 49,197,103,207,158,181,111,220,184,209, 18, 18, 18,146, 29, 18, 18,146, 93, 88, 88,104, 63,123,246,172,208,170, 85,171, 98, 0, -125,155, 16, 78, 0, 24, 57,126,252,248,178,194,194, 66, 50, 96,192,128,195, 46,251, 25,248, 95,231,110,136, 39, 39,139, 16, 18, - 67, 8,137, 69,195, 36,151,151,109,132,144, 88,199, 49, 97, 1,114,170,242,243,243, 91, 71, 71, 71,103, 49, 12, 99,118,231, 99, - 24,198, 28, 29, 29,157,149,159,159,223,154, 16,162,242,197, 89,124,126,222,147,107,215, 12,174,209, 93, 58, 69,116,151, 78,145, -255,125, 61, 80,251,212,184, 71,151,198,182,237,190, 32, 52, 33,109,238,137, 83,167,231, 19, 66,230,111,222,151, 55,127,242,231, -191,206,191,119,220,236, 47, 34, 18,211,159,106, 66,122, 94, 13, 40, 39,128,208,208,208, 82,157, 78, 71, 8, 33,196,110,183, 19, -139,197, 66, 76, 38, 19,209,235,245,164,190,190,158,212,213,213, 57,203,121,109,109,173,243,123, 84, 84,148,215,242, 30, 22, 22, - 86,102, 48, 24, 26,213, 29,102,179,217, 89,127,232,245,122,162,215,235,137, 78,167,115,110,245,245,245, 36, 46, 46,174,200, 71, - 56, 47,138,225, 20, 4,129,216,108, 54, 98,177, 88,156,188, 70,163,177,209,102, 50,153,136,201,100, 34,137,137,137, 1,135, 51, - 16, 78,163,209, 72, 18, 18, 18, 74,188,113,134,135,135,151, 25,141,198, 70,156,174,241,119,231, 21,127,199,196,196,148, 54,133, - 51,144,112,250, 74, 79, 7,230,230,230,230, 18,131,193, 64,226,227,227,171,238,191,255,126,171,221,110, 39,107,214,172, 33,233, -233,233,194,192,129, 3, 45,149,149,149,228, 95,255,250, 23,241,241, 82, 72,203, 17,229,164,184, 18, 71,139, 97, 24,168, 84, 42, -124,255,253,247, 94,151,227,112,253,222,166, 77,155, 64,175,217, 51, 57, 57,121,235,246,237,219, 21,177,177,127, 76,136,109, 54, -155, 17, 22, 22,134,231,158,123, 78,118,215, 93,119,181, 31, 58,116,232,238,115,231,206, 13, 0,176,223, 15,223,125,145,145,145, -159, 77,154, 52, 41,250,193, 7, 31, 68, 68, 68,163, 73,183, 49,106,212, 40,220,127,255,253,210,220,220,220,135, 22, 46, 92,248, -208,188,121,243, 74,235,235,235,199, 1,248,209, 23,169, 66,161,184, 39, 46, 46,238,139,237,219,183, 71, 69, 69, 69, 33, 37, 37, -133,125,253,245,215,219,119,232,208, 65,145,144,144,192, 94,188,120, 17, 63,255,252,115,252,195, 15, 63,188,162,172,172,236,105, -139,197,178, 50,128,184,203, 34, 34, 34,222,124,250,233,167, 91,105,181, 90,219,129, 3, 7,242,196,253, 50,153,108,106, 70, 70, - 70,175, 45, 91,182,124, 11,224,203, 43,113,178, 8, 33, 90,252,209,196, 39,194, 42,254, 31,136,179, 69, 8,145, 29, 62,124, 56, - 60, 35, 35,227, 71,147,201,212,253,153,103,158, 57, 63,125,250,116,133, 70,163,209, 0, 96,180, 90,237,165, 41, 83,166,152,103, -207,158,253, 70,231,206,157, 7,239,218,181,235, 62, 66,136,213, 33,200, 46,231, 99, 24,103,120,138, 46, 84, 96,235, 78, 65,246, -206,196, 87, 19, 62,156,150,124,110,223,241, 34,129, 83,104,240, 75,206, 49,148, 85,213,227,215, 93,199, 17, 19, 17,204, 72,229, -124, 90, 72,252, 13, 3,106, 47, 28,207,129,143, 25,210, 41,154, 7, 12,195, 64,169, 84,226,151, 95,126,185,108,233, 42, 79,203, - 90,113, 28,135,208,208, 80,191,171, 27, 4, 5, 5, 97,227,198,141, 30,215, 94,244,180,164, 79, 72, 72, 8,124,189,108, 48, 12, -131,160,160, 32,236,216,177, 3, 44,203,122, 92, 26,200,125,159, 74,165, 2,235, 99,173, 43,145, 51, 39, 39,199, 47,151,248,169, - 86,171,129,134,166,127,239,133, 82, 46,199,246,237,219,189,198,217,253,187,218,177,222,171, 63,206, 29, 59,118, 52, 90,250,203, -125, 73, 48,215,223, 42,149, 10,140, 31,210,176,176,176,222, 9, 9, 9,216,187,119, 47,150, 47, 95, 30,158,150,150,134,211,167, - 79,131, 97, 24, 76,159, 62,157,185,225,134, 27,248,210,210, 82,244,235,215, 15, 63,253,244, 83, 31,173, 86, 75, 11, 12,197, 95, - 2, 66, 8, 15,224, 70, 0,145,104,232,118, 83, 7, 32, 20, 13, 43,105,200, 0, 84, 1, 80, 56, 54, 19,128,122, 0,173, 28,167, - 87, 58,234, 22, 87,129, 80,225,186,248, 52, 33,164,151,131, 91, 92,161, 34,210,229, 88,241, 26,238,191,221, 63, 61,114,115, 0, -176,122,245,106,241, 97, 54, 48, 51, 51,115,171,107,228, 2, 17, 89,226, 58,101, 30,202,180,251, 16, 77,185, 74,165,250, 97,247, -238,221,138,200,200, 63,226, 96, 50,153, 80, 87, 87,135,250,250,122,212,213,213, 33, 56, 56, 24,203,151, 47, 87, 12, 30, 60,248, -135,186,186,186, 14,142, 68,243,198, 57,235,226,197,139,209, 54,155, 13, 50,153,231, 46, 74, 44,203,162, 83,167, 78,120,243,205, - 55, 49,108,216,176,152, 65,131, 6,205,114, 19, 90,151, 13, 37, 85, 42,149, 95, 28, 56,112, 32, 74,169, 84, 34, 47, 47, 15,197, -197,197, 24, 63,126,124,107, 65, 16, 80, 84, 84,132,211,167, 79,227,194,133, 11, 88,184,112, 97,212,136, 17, 35,190,240, 32,180, - 60, 13, 79,125,230,229,151, 95,238, 24, 22, 22,198,126,244,209, 71, 53, 58,157,238,255, 28,251,223,153, 51,103,206, 99,253,251, -247,143,250,247,191,255, 77,118,236,216,177,216,113,227,188,166,167,107,159, 44, 71, 51, 31, 28,153,239,164,219, 57,157, 92,254, - 7, 33, 36, 6,128,137, 97,152, 26, 15,156, 12,128,144,161, 67,135,190, 98, 50,153,186,111,223,190,253,204, 45,183,220,146, 8, -224,162,152,249, 66, 66, 66, 84,179,102,205,138,206,204,204,204,189,245,214, 91,187, 15, 29, 58,244,149,138,138,138,233,132,144, - 10,151, 62, 91, 78, 78, 65,192,225,152,216, 46,203,114,118,141,123, 96,203, 14,179,244,213, 23, 39,159,111,211, 58,169,246,112, - 94,181,253,120,126, 5,234, 12, 54,220,123,107,195, 2,230,189,187,180,193,103,223,111,199,115, 47,189,197,255,184,108,209,253, -103, 8, 84,245, 37,199,215,248, 72,207,171, 5,229,132,179,137, 9, 60,207,227,142, 59,238, 0,195, 48,151,173,229,201,243, 60, -118,237,218,133, 91,111,189, 21, 60,207,227,137, 39,158, 8,136,147,227, 56, 12, 29, 58,212,185,142,162, 43,159,187,104,240,162, - 9,178,221, 42, 91,112, 28, 7,150,101,189, 46,164,237,206,233,175, 94, 18,195,233,139,203,245, 63,127,225,116, 44,121, 20,176, -200, 10,148, 83, 12, 39,199,113,232,211,167, 15, 14, 29, 58,228, 83,116,121,209,151,141,226,126,233,210,165, 49, 29, 58,116,200, -153, 59,119,110, 56, 0, 84, 85, 85, 57, 23,188,151, 72, 36, 56,117,234, 20,204,102, 51,222,125,247, 93,139, 86,171,253, 55, 45, - 71,148,179, 37, 57,125,105, 17, 0,253, 39, 78,156,216, 51, 43, 43,107,122, 70, 70,198,119, 59,119,238, 92,202, 48,204,106, 66, - 72,166,248, 57,113,226,196,180,172,172,172,233, 19, 38, 76,120,115,198,140, 25,199, 24,134, 89, 13, 0,238,191, 29,117, 73,166, -155,136,139, 20,121, 28,101,174,209,177,158,126,187,127,122,226,110,228,104,101,102,102, 50,142, 72, 50,174,149, 90,160, 66, 43, -144,181,251, 56,142,123,126,250,244,233,209,190, 68, 86,125,125, 61, 74, 74, 74,144,152,152,136, 39,158,120, 34,122,238,220,185, -207,219,108,182,143,125,208, 74, 37, 18, 9,246,238,221,139,242,242,114,116,237,218, 21,201,201,201,141, 14, 56,123,246, 44,214, -174, 93,139,154,154, 26,244,232,209, 3,104,232,220,237, 17,221,186,117,123,183, 83,167, 78, 67, 89,150,181, 41, 20, 10, 28, 62, -124, 24,221,187,119,199,247,223,127,143, 54,109,218, 64,169, 84, 34, 55, 55, 23, 93,187,118,197,214,173, 91, 17, 25, 25,137,244, -244,116,155, 86,171,221, 86, 93, 93,189,249,220,185,115,239,122, 11,103,124,124,252,228,167,158,122, 74, 86, 82, 82, 34,124,243, -205, 55,219, 1,108, 7,240,252, 91,111,189,245,248,176, 97,195,162, 14, 30, 60, 88,187,111,223,190, 61, 94, 68, 86, 32, 78,150, -205,253,161,100,183,219, 77, 6,131,193,108, 50,153,172, 44,203, 22, 50, 12, 99,182,219,237, 29,188,153, 16, 99,199,142,109, 91, - 89, 89,249,220, 75, 47,189, 84,224, 16, 89,167,208,208, 1, 30, 0, 96,179,217, 76,245,245,245,218,140,140,140,196,135, 31,126, -248,204,210,165, 75,159, 27, 59,118,236,242,111,190,249,166, 30,128,193,157,176, 77,155,214,135, 36, 18, 86,170,171, 11,207, 95, -177,252,203,151,215,174,122,190,117, 81,209,133,246, 17,173, 34,117, 82,117,100,201,242, 37, 95,239, 7, 96, 46,169,208,226,200, -217, 82,240,188, 4, 39,138,106,209,255,246, 81,252,153,188,105,125, 1,172,161,239,114, 45,255,178, 40, 46, 66,189,101,203, 22, -159,142,214,174, 93,187,192,243, 60, 20, 10, 5,102,207,158,237,147, 84, 20, 6,162, 91,228, 79,204,136,139,163,251,114,159, 4, - 65,112, 46,244,238,190,253,223,255,253, 31, 94,122,233,165, 70,215,112,136, 13,198, 31,167,183,240, 37, 38, 37,161,188,172,172, -209,190, 64, 22,165,183,219,237,224,121, 30, 11, 22, 44, 64,102,102, 38, 86,175, 94,237,243,243,142, 59,238, 0,203,178, 36,144, -244,236,211,167, 15, 44, 22,139, 51,204,167, 78,157,242,200, 59,111,222, 60,127,193,188, 11,192,148,238,221,187,107, 6, 13, 26, -132,156,156, 28,220,127,255,253, 38,139,197,146, 7, 0,119,222,121,103,234,220,185,115,101, 7, 14, 28, 64, 68, 68, 4,127,254, -252,249,255,129,118,144,167,104, 97,120,210, 34,226, 51, 47, 43, 43,107,186,187,136,113,133,248, 63,195, 48,171,103,204,152,145, -233, 42,138, 92,127,139,174,147,155,136, 75,115,117,164, 92, 69,148, 55, 1,229,246,188,117, 61,190,194,163,208,114, 68,108,160, -171, 11, 36, 86,190,254, 68,150,143, 55,199, 70, 8, 9, 9, 25,126,239,189,247, 58, 69,142,209,104,116, 10, 44, 81,100,137,191, -115,115,115,209,179,103, 79,105, 72, 72,200,240,170,170,170,143, 3, 16,113,136,139,139, 67,101,101, 37,142, 30, 61,138,196,196, - 68, 88,173, 86,172, 95,191, 30,181,181,181,224,121, 30, 82,169, 20, 22,139,207,190,219,232,212,169,211, 29,139, 23, 47,238,185, -104,209,162, 75,226, 27,221,146, 37, 75, 64, 8, 65,100,100, 36,244,122, 61,202,202,202,176,121,243,102,216,108, 54,168,213,106, -164,164,164,200,238,185,231,158,190, 83,166, 76,225,125, 8,173, 62,247,223,127,127,136, 70,163,193,139, 47,190, 72, 44, 22,203, - 12,199,190,201,227,198,141,139, 40, 44, 44, 52, 63,249,228,147,123, 45, 22,203, 71,162,153,232, 42,112,188,220, 88,175, 78,150, -213,106, 21,211,180,160,190,190, 30,173, 90,181, 74,116,117,182,188,137,193, 29, 59,118,244, 1, 32,153, 58,117,106, 16,128, 50, -215, 48,152,205,102,212,215,215, 67,167,211, 89,107,107,107,203, 95,123,237, 53,219,210,165, 75, 37,142,115, 78,120, 18, 90, 12, -115,135, 89,163, 81,202, 8,145,188, 53,127,254,124,245,176, 97,195, 88,181, 90,141,186,186, 58,205,175,235,214,169, 7, 15,234, -155, 50, 61,235,195, 13,154,132,174,101, 59, 14,231,227, 66,105, 45,204, 86, 43, 82, 98, 67, 26,252, 48,138, 22,135, 99, 32,139, -211,209,114, 21, 21, 57, 57, 57,184,253,246,219,157,101, 93, 42,149, 54,114,190,252,113,114, 28,135,219,111,191,253, 50,135,103, -203,150, 45, 30,221, 39,127,112, 21, 69,238,226,200,147, 0, 99, 89,214,239, 2,235,162,155,231, 73,108,185,186,250,110,226,205, - 95, 51, 7, 56,142,195,184,113,227,192,243, 60, 94,127,253,117,112, 28,135,244,244,116,112, 28,135,140,140, 12,240, 60,143, 91, -111,189,181,201,113,223,189,123, 55,186,119,239,238, 12, 83,122,122, 58,122,245,234, 5,142,227,208,175, 95, 63,240, 60,143,161, - 67,135, 6,194,249,102, 93, 93, 93, 55,181, 90,141,220,220, 92, 72, 36, 18, 48, 12,115, 26, 64, 55, 0,136,141,141, 61,163, 6, -111,130,189, 0, 0, 32, 0, 73, 68, 65, 84,215,235,219, 26,141, 70, 60,245,212, 83,140,217,108,238,250,250,235,175,191,101, 52, - 26,169,208,162,104, 49,184,107, 17, 23, 24, 38, 76,152,240, 38,195, 48,171, 69,135,202,221,121,242,244,219, 67,221, 36, 58, 80, -251, 28,101,181,151,155,136,171, 96, 24,102, 31, 33,228, 78,111,231, 2, 48,187, 9,171, 70, 77,135,174,205,134,126, 29, 45,177, -242, 13, 84,104,249,131,209,104,188, 49, 42, 42,202,171,200,114,253, 52,155,205, 72, 78, 78,134,209,104,188,177,169, 15,141,216, -216, 88, 88, 44, 22,124,249,229,151,144, 74,165,144, 74,255,208, 23,102,179,111,179,232,248,241,227, 5,187,119,239,238,222,163, - 71,143,176,159,126,250,169, 98,192,128, 1,145,195,134, 13,131, 66,161,128,193, 96,128,213,106, 69,239,222,189,209,169, 83, 39, - 20, 23, 23,227,215, 95,127,173,236,208,161, 67,171, 61,123,246, 8,165,165,165,231,124, 80,223, 54,120,240, 96, 48, 12,131,117, -235,214, 85, 2,216, 39,151,203,215, 78,155, 54, 45,204,108, 54, 11,163, 71,143, 62, 95, 93, 93,253, 18, 0,139, 76, 38,155, 51, - 96,192,128,140,236,236,236,111, 5, 65,152,221,212,140,234,158,182, 58,157, 14, 65, 65, 65,129, 76, 37,193, 87, 87, 87,119, 1, - 0,149, 74, 21, 14,224,140, 51,135, 27, 12,141,196,176,217,108, 54,134,135,135,171, 0,192,113, 14,239,133, 51,210,102,195,138, -115,231,242,131, 93,251,207,133,134,134,226,145,135, 31,102,111,233,211, 71,214,237,198, 27,135,190,253,201,162,239,227, 34, 52, -230,148,184, 8, 88,237, 86,100,111, 88, 47, 16,193,186,129, 86, 59,127,142,208, 18,197,134,187,163,197,243, 60,182,110,221,122, -217, 62,169, 84,138,255,254,247,191, 1, 9, 3, 81, 84,121,107, 58,115,107,234, 98,252, 9, 24,158,231, 33,145, 72,176, 96,193, - 2, 8,130,128,151, 95,126,185, 81,115,162, 43,127, 64,118,158,139, 8,236, 52, 89, 0, 96, 70,241, 76,185,243,124,247,240, 58, -206, 9,200, 37,155, 59,119,110, 64,142,214,157,119,222,233, 87,184,186,182, 48,184,134,235,208,161, 67, 30,121,231,207,159,239, - 55, 61,237,118, 59,214,172, 89,227, 20,169, 34,222,126,251,237,167,100, 50, 89,244,182,109,219, 80, 90, 90, 10,157, 78,135,250, -250,122,244,238,221, 59,133,101,217,195,165,165,165,133, 39, 78,156,184,151,150, 30,138, 63,209,209, 50,205,152, 49,227,216,140, - 25, 51, 60, 58, 86,238,206,146, 47,231, 73, 20, 88, 14, 65, 20, 41,138, 55, 52,116,171,217,231,239, 92, 0, 50,247,166, 67,159, - 70,144,155,138,156,226,169,242, 13,164,249, 48, 64, 59,157, 99, 24, 6, 70,163,209,163,192,114, 21, 7, 22,139, 5,213,213,213, -176,219,237, 87, 60,215,151,167, 55, 89,127, 66,235,232,209,163,255,122,252,241,199, 75, 66, 66, 66,186, 85, 84, 84,148, 11,130, -112,235,174, 93,187, 34, 57,142,131, 70,163,129, 70,163,193,218,181,107,161, 84, 42, 49,110,220,184,114,187,221,158, 19, 28, 28, - 28, 97, 48, 24,126, 47, 45, 45,125,219,171,130,225,249,161,253,250,245,195,129, 3, 7,112,233,210,165,141, 0,210, 31,125,244, -209,219, 91,183,110,205, 76,155, 54,205,120,246,236,217,217, 0,202, 85, 42,213,226,197,139, 23, 15,234,209,163, 71,240,232,209, -163,177,117,235,214,249, 0,140,129,198, 89,167,211, 53, 18, 88, 90,173, 22,117,117,117, 80,169, 84,182, 0,211,140,199, 31, 35, - 12, 65, 8,113,222, 27,135,155, 37,222, 31,194,113,156, 56,170,209,155,200,130, 74,165,154,186,104,209, 34,133,251, 32, 5,187, -221,142,178,178, 50,104, 52, 26, 76,122,251,109,233,123,227,255,221, 93,162,142,222,197,178, 12,204, 22, 82, 67, 4,243,122, 93, -217,131,219,128,119,105,205,243, 39, 64, 20, 6,119,223,125,247,101,205,133, 82,169, 20, 27, 55,110,196,136, 17, 35,156, 47, 46, - 61,122,244,240,251,114, 37, 10,131,187,238,186,203,233, 12,173, 95,191,222, 99,179,159,232, 72, 5, 34, 8,197, 99, 95,120,225, - 5,112, 28,135,207, 62,251, 12,175,188,242, 10, 88,150,197,204,153, 51,193,178, 44,222,121,231,157,128, 69,166,171,128, 41,252, -176,225, 51,225, 21, 45,170,230, 69, 3, 0,130, 53, 26, 49, 66, 77,170,123, 56,142,115, 58, 89, 55,222,120, 35,120,158, 71, 70, - 70, 6, 56,142,115, 58, 89,195,135, 15,119, 77, 71, 18, 8, 39,199,113,200,203,203,115,134, 57, 35, 35,163,145,147,197,113, 28, -238,188,243,206, 64,130, 57, 61, 52, 52,116, 74,167, 78,157, 58,207,154, 53,139,151, 72, 36, 24, 60,120,112,106, 76, 76,204, 57, -155,205, 22, 49,117,234, 84,165,135,115, 20, 0,186,117,238,220, 89, 69, 75, 13, 69, 11, 58, 90, 83, 60,252, 21,230,218,231,170, - 9, 47,146,171, 93,143, 23, 57,220,197,145,195, 33,203,241,199,229,233, 92,127,224, 68, 5,233,203, 82, 15, 68,104, 57,108,103, -159, 23, 83, 42,149, 71,202,203,203, 51, 20, 10, 69, 35,145,229, 73,112, 73, 36, 18,148,150,150, 66,169, 84, 30, 49,153, 76,205, -118, 19,253, 53, 29, 2, 48,158, 62,125,122,188,203,239, 33,195,135, 15,255,102,227,198,141,177,217,217,217,216,179,103, 15, 34, - 35, 35, 49,119,238,220,139,101,101,101,255, 2,176,177,178,178,210,239,117,219,182,109,219, 69,173, 86, 99,199,142, 29, 0,176, - 21,192,191,159,123,238, 57,198,106,181, 98,222,188,121, 58, 0,235, 66, 67, 67,215, 44, 95,190,188,123,183,110,221,100,217,217, -217,218, 61,123,246,252, 22,160,200,178, 11,130,112,153,192,114, 77,211,224,224,224, 64, 28, 45,107, 72, 72,200, 81,173, 86, 59, -202, 96, 48,104,229,114,121,176, 86,171, 53,185, 10, 44,145,159,227, 56, 62, 47, 47,175, 4, 64, 74, 72, 72,200, 81,120,105,230, -228, 56,110,240,224,193,131, 57,247,123, 80, 86, 86,134,210,210, 82, 88, 44, 22,244,232,209,131,145, 48, 86,201,165,162, 35,110, -211, 58, 80,145,245, 39, 57, 90, 68, 44,235,226, 40, 65, 79, 35, 13,215,175, 95,239,252,205,178, 44,190,254,250,235,128, 68,209, -198,141, 27,125,118, 88,119,107, 58,244,107,141,139,199,127,254,249,231, 32,132, 56,157, 44,150,101, 49, 97,194, 4,200,229,114, - 76,155, 54, 13, 19, 38, 76, 0,199,113,126,155, 14, 93, 5, 76,210,235,122,215,151,163,134, 66,225,232, 15,197, 48,140,171,216, - 98, 2, 21,111,190,220,188, 64, 90, 2, 92, 57,197,243,130,130,130,188,118,132,119,227,244,117,129, 95, 0,228,199,198,198,238, -200,200,200, 8,217,191,127, 63,102,206,156, 41, 53,153, 76,109,178,179,179,157,215,245,148, 94, 58,157, 78, 65, 75, 14, 69, 75, -184, 89, 62,254,174,112,235, 95,197,184, 54,227,249,248,116, 63, 30, 46,251, 92,121, 43, 24,134,177,122,184, 94,133, 7,113,229, -126, 13,215, 99, 42,188, 58, 90,254, 42, 11,127,130, 43, 16, 71, 75,175,215,255,182,110,221,186, 94, 15, 63,252, 48,231,171,217, - 80,167,211, 33, 58, 58, 26,199,142, 29,179,233,245,250,223, 2,112,202,154, 83,104,185, 35,187,188,188, 92, 98,181, 90,209,190, -125,123,196,199,199,195,104, 52,162,166,166, 70, 2, 96, 99,128, 28, 82,149, 74, 37, 1,128,154,154, 26,160, 97,168,105,106,135, - 14, 29,112,224,192, 1, 84, 87, 87,255, 8, 96,216,148, 41, 83,122,244,238,221, 91,250,253,247,223,235,159,121,230,153, 31,173, - 86,107, 64, 74, 67, 16, 4,179,205,102, 75,102, 89,214, 82, 83, 83,115,193, 53, 61,163,163,163,195, 85, 42, 21, 83, 86, 86,102, - 13, 68,104,117,235,214,109,239,249,243,231, 49,117,234,212,138,233,211,167,119,168,171,171,187, 84, 91, 91,107,115, 21, 91, 70, -163,145,109,213,170,149,124,222,188,121, 10, 0,232,214,173,219, 94,111, 66, 75,167,211,181, 86, 42,255,120, 49, 54,153, 76, 40, - 45, 45, 69,105,105, 41,202,202,202, 80, 87, 87,135,148,148, 20,232,245,250, 68, 90,205,252,101, 66,171, 81,243,153,107,249,118, -125,144, 55,165,172,187, 10,152,187,239,190,219,217,183, 75,116,200,196,109,197,138, 21,238, 29,204, 3, 18, 90,159,127,254, 57, - 94,120,225, 5, 4, 5, 5, 97,214,172, 89,141,154, 14,221,197,129, 32, 8, 76, 32,113, 79,126,195,128,210, 57,225,224,121, 30, - 17,207,148, 53,106,162,243, 32, 56, 2, 10,231,244,233,211,155,165,233,208,149, 51, 49,177,161,168, 44, 88,176, 0,163, 70,141, -194,182,109,219,174,184,233, 48, 45, 45,109,201,234,213,171, 67,142, 31, 63, 14,173, 86,139,138,138, 10,152, 76, 38, 20, 23, 23, -123,109, 21,112,212,229, 65,180,228, 80,252,201,245,212,190, 63,147,183, 57,175,199,249,121,128, 7, 44,180, 2,113,180, 76, 38, -211,172, 23, 95,124,241,185, 33, 67,134,132, 7, 7, 7,163,164,164,228, 50,145, 85, 95, 95, 15,181, 90, 13,131,193,128, 85,171, - 86,105, 77, 38,211, 44,127,226,192,106,181, 34, 42, 42, 10,149,149,149, 16,188,244,159,102, 89, 22, 10,133, 2,245,245,245,128, -159, 78,230,158, 30, 24, 22,139, 5, 86,171, 21, 86,171, 21, 22,139,197,239, 91,178,187,153,167, 82,169, 68,225, 1, 0,186,184, -184,184,246, 65, 65, 65, 40, 40, 40, 0, 26, 70,246, 13,185,253,246,219,249,170,170, 42,242,228,147, 79,110, 39,132, 60, 5,223, -179,227,155,115,114,114,146, 1, 64,161, 80,228, 2, 64,113,113,177,181,166,166,166,145, 83,168, 84, 42,201,136, 17, 35, 98, 9, - 33,200,201,201, 73,150, 74,165, 4,222, 71, 53, 26, 87,174, 92,121, 60, 36, 36,100,105, 86, 86,214,195,153,153,153,199,186,116, -233,146,172,211,233,202, 13, 6,131,193,104, 52, 18,137, 68, 34, 13, 11, 11, 11,218,176, 97,195,153, 93,187,118, 13,209,104, 52, - 75, 87,174, 92,121,220,155,243,166, 82,169,138,245,122,125,146,120, 79, 93, 69, 86,105,105, 41, 8, 33,200,207,207,135, 82,169, - 60,239,175, 89,151,162,229, 32,190, 84,185, 59, 47,238,251, 2, 21, 89,174,194, 96,195,134, 13, 62,231,208, 10,148,211, 85, 20, -189,242,202, 43,152, 51,103,206,101,142,214,180,105,211, 0, 0,111,191,253,118,192,125,180, 68,247,170,116, 78, 56, 98, 94,168, -110, 20,118, 0, 96,196,240, 53,173,204,131,227, 56, 76,157, 58,245,178, 78,234,174, 77,123, 1, 54,241, 53, 10,103,121,121, 57, - 56,142, 67,120,120, 56, 30,121,228, 17, 12, 29, 58,212,217, 4,217, 84,222,147, 39, 79,238,120,227,141, 55,186,166,165,165,225, -253,247,223,175, 14, 13, 13, 13,254,207,127,254,195,213,212,212, 48,190, 28, 45, 42,180, 40, 40,154, 65,104,137, 5, 44,208, 81, -135, 94, 42,203, 33,104, 60,215, 70,173, 94,175,127,228,182,219,110,251,105,217,178,101,138,182,109,219,226,228,201,147,168,174, -174,134,217,108,134, 84, 42, 69,108,108, 44,106,106,106,240,245,215, 95, 27,244,122,253, 35, 0,106,253,112,190,213,179,103,207, - 47, 62,254,248,227,160,244,244,116, 84, 87, 87,163,190,190,222, 41,132, 24,134,129, 70,163,129, 66,161,192,222,189,123,177,126, -253,122, 3,128,183,252,112,122, 82,115,176, 88, 44, 78,193, 21,128,208,114,229, 84,137,174,142, 94,175, 7, 0,107,235,214,173, - 99, 0, 32, 63, 63, 31, 0, 10, 83, 82, 82,166,180,109,219,150, 89,188,120, 49, 33,132,172,247, 34,178,156,156, 12,195, 84, 19, - 66, 46, 1,136, 49,155,205, 82, 0,168,173,173,181,180,106,213, 42, 74, 46,151, 11, 10,133, 66, 8, 10, 10, 18, 74, 74, 74,108, - 54,155, 77, 10, 0,253,250,245, 51, 3, 40,117, 91,163,208,149, 83, 32,132,104,231,207,159, 63,101,244,232,209, 25,125,250,244, - 73,123,246,217,103,143, 62,249,228,147,108,124,124,124, 88, 93, 93,157,241,244,233,211,151, 62,249,228,147,186,221,187,119, 15, -225,121,254,220,252,249,243,167, 0,208, 50, 12, 35,120,226,180,217,108,191,101,103,103,255, 43, 51, 51,147,187,112,225, 2,202, -202,202,156, 34,171,172,172, 12,157, 58,117,194,174, 93,187,236, 22,139, 37,187, 9,233,217, 92,160,156, 13, 47, 33, 68, 44,235, -222, 4,150,248, 50, 21, 40,167,171, 40, 26, 53,106, 84, 35, 23, 75, 42,149,226,135, 31,126,240, 88,111,120, 40, 87,141,226,238, - 58,199,215, 27,111,188,209, 72,180, 77,154, 52,201,107,117,230, 47, 61, 69,158,218, 5,241,141, 71, 29,122, 41,231,190,194, 41, -214,157, 60,207, 99,210,164, 73, 1, 59, 90,184,188,143,214,101,156, 98,220, 7, 12, 24, 0,189, 94,239, 20,178,222, 28, 45,127, -233,105,183,219, 95,152, 51,103, 14,209,104, 52, 55,107,181,218, 71,207,159, 63,191, 80,175,215,223, 84, 91, 91,235,211,209, 50, -153, 76,114, 90,142, 40, 39, 90,102,126,174,235, 71,104, 57, 30,146,104,221,186,117,163,181,179, 88,150,109,180, 53,165,159,129, - 3, 27,242,242,242,238,187,229,150, 91,190,125,225,133, 23,130,211,211,211,249,164,164, 36,232,116, 58, 20, 20, 20,224,216,177, - 99,182,149, 43, 87,106,245,122,253,163, 0, 2, 25,117,182,232,248,241,227,235,135, 13, 27,246, 78,239,222,189,159,158, 60,121, -178, 36, 53, 53, 21,181,181,181, 8, 11, 11, 67, 84, 84, 20, 78,157, 58,133, 85,171, 86,217, 43, 43, 43,191, 0,240, 30, 60,180, -161,250,123,225,183, 88, 44,120,232,161,135, 32, 8, 2,102,207,158,141, 64, 22, 84,118,129,197, 98,177, 16, 0,140,163, 63,151, -222, 49,187, 52, 78,159, 62, 13, 0,231,146,147,147,131, 1, 32, 59, 59,155, 65,195,252, 90,129,188,225, 19, 66,136,211,217,234, -212,169, 83,129,123,229, 40, 58, 89,162, 11,230, 47,220, 12,195, 24, 9, 33,229,122,189,126,216, 43,175,188,242,206,231,159,127, -254,240,231,159,127,126,217,113, 26,141,102,233,204,153, 51,223,123,224,129, 7,202, 25,134,241,218,143, 76,167,211,189, 61,102, -204,152, 7,142, 28, 57, 18, 28, 20, 20, 4,157, 78,135,170,170, 42, 88, 44, 22,164,164,164,160,188,188, 28,139, 22, 45,170, 51, - 24, 12,239,210,226,248,215,192, 85, 24,120,115,181, 2, 16, 89, 94, 93,157, 95,126,249,197,227, 28, 85, 77,229,116, 23, 27,129, -206,109,229,235,165, 72,156,150,198,211,148, 17, 77,172,215, 46,227,229, 56, 14, 31,125,244,145,115,210, 86, 79, 78, 86, 83, 28, - 45,145, 51, 60, 60,188,193, 38, 87, 42, 33, 8, 2,238,188,243,206,171,225, 21, 0,140,115,153,241,125,250,107,175,189, 54,165, - 83,167, 78,169, 0,228,174,105,208, 68, 23,159,130,130,194,159,208,178,219,237,197, 29, 59,118,108, 84,193,249, 91,204,212,106, -181, 22, 7,120,221,245, 58,157, 46,101,230,204,153, 47,170, 84,170, 33,122,189,190,171,163,226, 56,162,211,233,178, 77, 38,211, -167,104,218, 34,208, 21, 0,158,223,189,123,247,236, 97,195,134, 77,187,245,214, 91, 71,142, 31, 63,158, 33,132, 96,222,188,121, -228,236,217,179, 43, 28, 46,214,217, 43, 73,164,240,240,240,227, 95,127,253,117,244, 79, 63,253, 4,171,213,138, 79, 63,253, 20, -193,193,193,199,171,171,171, 3,165, 40,223,180,105,211, 55,125,250,244,121,108,215,174, 93,139, 0,252,190,117,235,214,133,125, -251,246, 29,179,107,215,174, 37, 0,142,109,222,188,121, 97,239,222,189,199,236,219,183,111, 57,128, 67, 77,168,124,157,206,150, -205,230,185,165,209,139,147,229,139, 83, 75, 8,177, 60,254,248,227,227, 31,120,224,129, 47,247,237,219,119, 83, 77, 77, 77, 87, - 0, 8, 13, 13, 61,210,171, 87,175,189,203,150, 45, 59,229,112,178,252,117,214,175,208,233,116, 35,186,118,237,250,227,251,239, -191,175, 74, 75, 75,227,218,183,111,143,194,194, 66, 28, 61,122,212,246,191,255,253,175,222, 96, 48,220, 13,224, 18, 45,142,127, -157,208, 34,132, 32, 52, 52,180,209, 75,148, 56,228,191,169,205,133,174, 15,102,113,169, 30,119, 94,111,156,190,166, 77, 16,161, - 86,171,157,147,155, 6,210,101, 65, 16,124,207,199, 70, 8,113,114,138, 91, 0, 34,203,239, 8, 65,199, 18, 56, 1,115, 6, 50, -189,131, 74,165,130,213,106,117,242, 6, 48,242,179,169,106,241, 23, 0,191, 88,173,214,211, 0,218, 81,113, 69, 65,209,130, 66, -235,210,165, 75, 61, 91,248,218, 90,147,201,244,158,201,100,122, 79,220, 97, 52, 26,175,150,243, 44,128, 7, 54,109,218,244,241, -166, 77,155,196,118,132,169,240,191, 94,162, 79,156, 60,121, 50,147,231,249,255, 46, 93,186,180, 55, 33, 4, 33, 33, 33,187, 11, - 11, 11,255,211, 20, 14,187,221,254,248,174, 93,187,158,131,163, 47,147,197, 98,121,124,199,142, 29, 47,162, 97, 61, 38,216,237, -246,199,247,236,217,227,252,221,196, 7, 37, 33,132,152, 8, 33,113, 94, 14, 49, 53,209,129, 19,157, 45,243,178,101,203,234, 1, - 28,198, 31,243,100, 89, 29,155,209,173,185,208, 23, 54,235,116,186,246,147, 38, 77,154, 46,145, 72, 6,235,116,186,120,149, 74, - 85,100,179,217,126,211,235,245,111,161, 97,141, 42,138,191, 8,102,179,249, 66,199,142, 29, 57, 79, 47, 80,190, 30,228,190, 94, -172,236,118,123,113,135, 14, 29,252,190,156,121,224,188,224, 67, 52,156, 75, 73, 73, 97, 3,229, 18, 97,177, 88,202,125,133, 51, - 37, 37, 5, 77,229,244, 23,247,228,228,100,143,113,247, 35, 8,189,198,221,102,179, 93, 17,167,175,244,244, 5,131,193,112, 41, - 50, 50,178,222,104, 52,242, 38,147,137,183,217,108,141,236, 71,133, 66, 81, 97, 48, 24,104,225,161,160,184, 26,161,245, 15,199, -126, 52, 44, 47,209, 92, 48, 29, 57,114,228, 49,167, 61, 85, 94,126,165, 60,238, 74,178,222,207,239,166, 8,163,102,119,132, 28, - 66, 74,223, 76,116,149,245,245,245, 79,138, 63,196, 62, 32, 20,127, 61,170,170,170,110,110,110,206,234,234,234,102,127, 81,171, -172,172,204,104,129,184,247,188, 94, 57,125,161,164,164,228,102, 63, 66,140, 22, 28, 10,138, 0,193,210, 36,160,160,160,160,160, -160,160,160,104, 25, 48,104, 24, 57,224, 9, 77, 25, 77, 48,228, 10,174,157, 77, 57, 41, 39,229,164,156,148,147,114, 82,206,235, -142,211, 31, 55, 29,205,216,194, 2,140,114, 82, 78,202, 73, 57, 41, 39,229,164,156,215, 31,231, 53, 9,218,116, 72, 65, 65, 65, - 65, 65, 65, 65, 65,133, 22, 5, 5, 5, 5, 5, 5, 5, 5, 21, 90, 20, 20, 20, 20,174, 72,109,221,186,245,137,212,212,212, 11, - 0,198,182,240,181, 30,233,221,187,119,149, 92, 46,223, 0, 32,149, 38, 61, 5, 5, 5, 21, 90, 20, 20, 20,215,180,200,234,218, -181,235,246,147, 39, 79,118,202,206,206,142,139,143,143,255,176, 37, 47,214,179,103,207, 15,182,109,219, 22,190,110,221,186,219, - 98, 98, 98,114,174, 80,108,165,182,105,211,230, 68,106,106,106, 49,128, 71,154, 57,136, 99, 51, 50, 50,170,101, 50,217,122, 42, - 4, 41,174, 3,116, 1,208,149, 10, 45, 10, 10, 10,138, 22, 20, 89, 59,119,238,140, 48, 26,141, 56,121,242, 36, 42, 42, 42, 14, -181,228, 5,115,115,115, 47,237,220,185, 19, 9, 9, 9, 88,178,100, 73,100,114,114,242,182, 38, 10,154,212,174, 93,187,110, 63, -113,226, 68,167,236,236,236,248,168,168,168, 79,154, 51,124, 55,221,116,211,180,109,219,182,133,109,216,176, 97,104,100,100,228, -149, 10, 65, 10,138,191, 51,228, 0, 30, 99, 24,102,111,151, 46, 93,142,164,165,165,253,206, 48,204, 46, 0,163,112,237,206,221, - 25, 24, 86,175, 94,189,117,245,234,213, 91,105, 30,161,160,160,104, 6,164,165,165,165,233,116, 58, 29,169,168,168, 32,159,125, -246, 25, 9, 15, 15,183, 0,248, 13,192, 74, 15,219,155, 0, 52, 1,114,107, 28,199,123,226,249, 45, 60, 60,220,242,217,103,159, -145,252,252,124,114,252,248,113,146,154,154,106, 8, 80,208,164,118,237,218,181, 82, 12,243,218,181,107, 9,199,113,235,155, 51, - 81, 52, 26,205,177,156,156, 28,114,246,236, 89,178, 97,195, 6, 18, 29, 29, 93, 78,197, 22,197, 53,130, 36, 0, 31,168,213,234, -234,187,238,186,139,124,245,213, 87,100,213,170, 85,228,199, 31,127, 36,179,102,205, 34,131, 6, 13, 34, 50,153,236, 2,128,215, - 1,132, 94, 79, 90,132,113, 68,140, 0, 24, 8, 0,153,153,153, 84,108, 81, 80, 80, 92, 45,118,234,245,250, 12,189, 94,143,186, -186, 58,180,110,221, 26, 60,207,123, 60,176,188,188, 28, 59,118,236,192,184,113,227,142,151,150,150,246,135,239,117, 47,195,186, -119,239,190,115,243,230,205,169,193,193,193,206,157,130, 32,192, 98,177,192,106,181,194, 98,177,192,100, 50,193,100, 50, 65, 38, -147, 65,161, 80, 32, 60, 60,252, 40,124, 55, 97, 56,221, 55,131,193,128,131, 7, 15, 98,244,232,209, 21, 85, 85, 85,253, 1,228, - 54, 99,186,164, 70, 69, 69,229, 44, 90,180, 40, 50, 37, 37, 5,231,207,159,199, 19, 79, 60, 81,121,238,220,185,126,205,124, 29, - 10,138, 63, 19, 19,238,187,239,190,105,209,209,209,108,151, 46, 93, 16, 27, 27, 11,147,201, 4,131,193, 0, 66, 8, 56,142, 3, - 33, 4,181,181,181,200,201,201,193,230,205,155, 77,151, 46, 93,250, 26,192,167, 0,242, 92, 68,214, 53,169, 69,156, 66, 43, 51, - 51,147,161,121,133,130,130,162,153,112,164,182,182,182,139,201,100,130, 78,167, 11,232,132,252,252,124,140, 29, 59,246,120,105, -105,233, 45,240,188,168,188,166,123,247,238,123,114,114,114, 82,141, 70, 35,180, 90,255,235,206,203,100, 50, 4, 5, 5, 33, 34, - 34, 98, 23,128, 62,222,222,196,187,116,233,178,127,215,174, 93,225, 6,131, 1,135, 14, 29,194, 35,143, 60, 98,169,174,174,222, - 14,192, 91,224,171,209,176,142,234, 57, 15,255, 37, 2,120,209,241,134,239, 9,170,200,200,200,190,139, 23, 47,150,182,109,219, - 22,122,189, 30,163, 70,141,170,206,205,205,237, 5,160,128,102, 29,138,127, 32,114, 79,158, 60,217,193,110,183,163,178,178, 18, - 38,147, 9,122,189,222, 41,180, 36, 18, 9, 8, 33,176,217,108,206, 23,163, 3, 7, 14, 32, 59, 59,155,228,231,231, 79,118,148, -165,107, 86,139, 80,161, 69, 65, 65,209, 18, 72,237,208,161,195,161, 95,127,253, 53, 72, 42,149, 98,213,170, 85,152, 60,121,178, -181,186,186,122,155,187,120,137,142,142, 78, 91,184,112, 97,114, 74, 74, 10,126,255,253,119,220,127,255,253,111, 1,152,238,129, -243, 77,173, 86, 59,205, 98,177,224,208,161, 67, 24, 51,102, 76, 65, 89, 89,217, 49,119, 17,147,156,156,220,239,147, 79, 62,225, -123,244,232, 1,173, 86,139,145, 35, 71,234, 79,157, 58,213, 27,192, 49, 47, 97,253,164,186,186,250, 21,187,221,142,186,186, 58, - 36, 36, 36, 64, 42,149,250,140,156,193, 96, 64, 82, 82,210,174,138,138,138,203,196, 91, 68, 68,196,166,243,231,207, 15, 82, 40, - 20, 62, 57, 44, 22, 11,138,139,139, 33,147,201, 96, 50,153,208,174, 93,187,175, 1, 60, 78,179, 14,197, 63, 81,104, 29, 62,124, -184,195,119,223,125,135,238,221,187,163,115,231,206,168,175,175,119,138, 46,179,217, 12,171,213,122,217, 73, 90,173, 22, 47,191, -252,114, 30, 28,205,231,215,170, 22, 17, 59,166, 77, 17,219, 68, 51, 51, 51, 7,208, 60, 67, 65, 65,113,181, 21,111, 94, 94, 94, -250,144, 33, 67,182,173, 88,177,162,213,240,225,195,209,174, 93, 59,254,222,123,239,141,212,235,245,131, 93, 15, 44, 43, 43, 11, - 27, 51,102,204,254,162,162,162,100,199,174, 94, 94, 56,123, 5, 7, 7, 35, 63, 63, 95, 20, 89, 61,225,214,204, 40,147,201,214, - 31, 62,124,152,151,201,100,216,183,111, 31,198,142, 29, 91, 89, 80, 80,224,175, 89, 46,212,108, 54, 67, 34,145, 0, 0,138,139, -139,253, 70,238,252,249,243, 16, 4,193,228,233, 63,150,101,229, 7, 14, 28, 64, 92, 92,156, 79, 14,150,101,221, 5, 93, 13,205, - 54, 20,255, 80, 88,205,102, 51,122,246,236,137,130,130, 2, 28, 56,112,192, 41,184, 42, 43, 43, 81, 82, 82,210,232,224,189,123, -247,226,224,193,131,232,223,191,191, 59,207, 53,169, 69,156,202,113,245,234,213, 3, 28,145,219, 74,243, 12, 5, 5, 69, 51, 33, - 53, 46, 46, 46,103,209,162, 69,145,177,177,177, 24, 52,104, 80, 81,105,105,105, 27, 15,199,173, 36,132,220,157,159,159,143,182, -109,219,174, 2,112,207,149, 28,147,152,152, 88,177,111,223,190, 86,199,143, 31,199, 35,143, 60, 82,225,232,243,229,175,239, 83, -114,167, 78,157,246,109,216,176, 33,156,101, 89, 28, 59,118, 44,144,166,195, 66, 52,244, 47, 57,231,225,191, 68, 0,147, 0,132, -123, 57, 87,213,161, 67,135,190,251,247,239,151, 50, 12,131,194,194, 66,177,233,176,167,131,151,130,226,159,134, 17,113,113,113, -255,123,238,185,231, 66,122,247,238,141,226,226, 98, 92,184,112, 1,151, 46, 93, 66,122,122, 58,210,210,210,112,246,236, 89,172, - 95,191, 30, 7, 15, 30,132, 92, 46, 71, 66, 66, 2,212, 75,191,195,127, 25, 28, 7,144, 70,181, 8, 5, 5, 5,197, 85,136, 45, -169, 84,186, 62, 62, 62,190, 28,158,231,165, 10, 27, 57,114,100,137,221,110, 39,103,207,158, 37,104, 24, 61, 8, 47, 66,139,156, - 61,123,150, 68, 71, 71,231, 3, 8,243,112,204,216,152,152,152, 34,165, 82,121, 20, 77,156,214,161,125,251,246, 21,167, 78,157, - 34, 69, 69, 69,100,221,186,117, 36, 34, 34,162, 37, 70, 4,166,118,236,216,177,178,174,174,142, 24,141, 70,146,147,147, 67, 18, - 19, 19, 43, 64, 71, 30, 82,252,243, 17, 12, 96,106, 74, 74,138,241,227,143, 63, 38,235,215,175, 39, 11, 22, 44, 32,211,166, 77, - 35,227,199,143, 39, 25, 25, 25, 36, 35, 35,131,140, 26, 53,138,188,242,202, 43,228,246,219,111, 39,106,181,186, 22,192,189, 52, -233, 40, 40, 40, 40,154, 23,137, 0,102, 57, 4,213,202,145, 35, 71,150,152, 76, 38,114,225,194, 5,242,195, 15, 63, 16, 52, 76, -221,224, 9,111,150,150,150,146,210,210, 82,113,106,132,124,252, 49,173,195, 87, 14,222,171, 18, 65, 73, 73, 73, 21,251,247,239, - 39,133,133,133,100,237,218,181,196, 33,216,154, 13, 10,133, 98,131, 86,171, 37, 70,163,145,108,218,180,137, 78,239, 64,113, 45, - 34, 10,192,220, 27,110,184,193, 58,123,246,108,178,114,229, 74,242,217,103,159,145, 17, 35, 70,144,215, 95,127,157, 60,248,224, -131, 36, 50, 50,210, 4, 32, 11, 64, 8, 77,174,171, 7, 93,217,156,114, 82, 78,202,233,142,245,199,143, 31, 39, 34,236,118, 59, -185,112,225, 2,217,176, 97, 3,137,137,137, 57,134,198,243,105,185,114,106, 58,119,238,124,242,212,169, 83,228,252,249,243,196, - 98,177, 56, 57, 78,158, 60, 73, 0,108,109,134,112,166,198,199,199,151,111,217,178,133,156, 58,117,138,196,196,196, 20, 53,103, -220,147,146,146,202, 43, 42, 42,200,166, 77,155, 72,100,100,164, 63,145, 69,243, 18,229,252, 39,115, 38, 1, 88,220,163, 71, 15, -251,156, 57,115,200,211, 79, 63, 77, 18, 19, 19,237,142,151,162,248,235, 73, 8, 93,223,179,180, 82, 80, 80,252, 21,144,239,222, -189, 27,114,185,220,185,227,247,223,127,119,157, 71,203,219,188, 13,218, 19, 39, 78,220, 50,124,248,240,109,115,230,204,233,236, - 58,138,105,203,150, 45, 0, 96,106,134,176,229, 94,184,112,161,255,176, 97,195, 62,141,136,136,184,177,180,180,244,157,230,140, -120, 97, 97,225, 43, 93,187,118,157, 94, 87, 87,167,213,235,245,163, 64,231,206,162,184,118, 81, 8, 96,244,129, 3, 7, 62, 60, -112,224,192, 91, 0, 8,128,247, 1,156,184,222, 18,130, 10, 45, 10, 10,138, 63, 27, 99,159,124,242, 73,247,206,226,251, 0,252, -159, 15,145, 37,226, 82, 65, 65, 65,159, 59,239,188,243, 57, 52, 30,157, 40,118, 78,111, 14,228,154,205,230,161,238, 35,165,154, - 9, 75, 74, 75, 75,151,208, 44, 64,113, 29,225, 24,128, 7,175,231, 4,160, 66,139,130,130,226,207,198, 57, 0, 79, 92,197,249, - 90,120,158,103,139,130,130,130,226,111, 7,186,168, 52, 5, 5, 5, 5, 5, 5, 5, 5, 21, 90, 20, 20, 20, 20, 20, 20, 20, 20, -255, 44, 48,240, 62,114, 32,187, 9, 60, 87, 50,162, 33,155,114, 82, 78,202, 73, 57, 41, 39,229,164,156,215, 29,167, 63,238,108, - 80,180,168, 0,163,156,148,147,114, 82, 78,202,249,207,230,100, 28, 27,235,216,196,223,127,231,184, 51,127,227,184, 95, 47,156, -215, 36,254,170,206,240,226,141, 16,208, 48,228,147,226,239, 7,215, 2, 66,232,125,162,160,160,104, 98,221, 33,113,121,216,218, - 29, 27,254,134,117,137,171, 40, 16,174,242,185,212, 18,113,191,158, 57,175,121,161,117,163, 74,165,154, 44,147,201, 82, 24,134, -177,235,116,186, 35, 38,147,105, 62,128, 93, 87,121,205,175,162,163,163,199, 86, 85, 85, 9, 44,203,130,101, 89, 48, 12, 3,150, -101,193,243,188,161,182,182, 86,115, 37,164,145, 93, 70,188,202, 49,204, 11,118, 98,159, 95,126,116,213, 52,127,251, 41,124, 23, - 24,169, 84,122, 95,120,120,120,104, 69, 69, 5, 97,217,134,174,124, 18,137, 68, 92, 8,215, 86, 91, 91,251, 77,160,100, 97, 97, - 97,123,195,195,195, 67,197,243, 25,134, 65, 85, 85, 85, 77,121,121,249, 77, 0, 16, 20, 20,180, 67,165, 82, 69,112, 28, 7,137, - 68, 2,137, 68, 2,189, 94, 95, 85, 85, 85,117, 11,189, 21,255, 76, 44, 95,190, 92, 50, 44,254,137,118, 28, 49,116, 99, 89, 18, - 34, 8, 76,173,141, 81,252,190,254,194, 87,103, 2, 57,127,212,168, 81,118,154,138,127, 30,100, 50,217,236,232,232,232,127,215, -215,215,235, 25,134, 33, 12,195,128, 97, 26,222,179,220, 63,237,118,123,113, 85, 85, 85, 79, 63, 15, 91, 94, 38,147,205,140,137, -137, 25,163,215,235,245, 14, 62,143,188, 0, 96,181, 90,139, 43, 43, 43,123, 6, 84,215, 71, 70,206, 87, 40, 20,143,234,245,122, - 29,195, 48,130,235,127,132, 16,215,135,249,217,202,202,202,126,254,132,129, 76, 38,251, 52, 58, 58,250, 95,142,184, 59,195,121, -181,113,143,142,142, 30,163,211,233, 2,226,244, 17,247,203, 56, 91, 34,156,127, 83,206,107, 95,104,165,167,167,127,183,103,207, -158, 14, 60,207, 3, 0,140, 70, 99,215,185,115,231, 62,246,198, 27,111,100, 1,152,120,133,215, 91,216,175, 95,191,135,114,114, -114,216,149, 43, 87,178,189,122,245, 2,195, 48,176,219,237,176,219,237,232,210,165,139,226, 74, 35, 18,162, 82, 78, 56,184,241, -191, 65, 55, 14,121,242,133,114, 96,154,191,253,190, 4, 38,128,183, 1,164, 52, 49, 8, 21,142,116, 57,232, 69,108,236,100, 89, -182, 73,156,130, 32,228, 95,186,116,169,143, 15, 1,211,236,156, 14,145,117,127,191,126,253, 66,178,179,179,153,162,162, 34, 70, -161, 80, 64, 16, 4,216,237,118, 88,173, 86,220,112,195, 13, 77,114, 66, 67, 67, 67, 53, 19, 38, 76,104,119,199, 29,119,224,135, - 31,126,192, 99,143, 61,134,190,125,251,230,149,151,151, 3, 0, 84, 42, 85,196,241,227,199, 59,132,135,135, 67,175,215,163,182, -182, 22,183,221,118, 27,170,170,170,254,209,133,235,230,244,132,247, 25,150,113,206, 21, 69,108,246,234, 61,191,151,188,125,181, -188,225,225,225, 7,229,114,121,180, 95,181,236,242, 32, 51, 26,141,101,213,213,213,221,253,156,146, 4,224, 46,137, 68,210,158, -227,184,142, 0,146,108, 54, 91, 52, 0, 72,165,210, 50,137, 68, 82,104,181, 90, 79,153,205,230,211, 0,126,129,143, 5,144,135, -197, 63,209,142,177,233, 71,214,153,132,225,202,182, 89,169,250,179, 19,114,149,114,253,218, 97,241, 79,172, 8, 84,108,253,133, - 72, 5,176, 12, 13, 11, 74, 63,141,134,121,128,174, 6,241, 0,238, 70,195,154,143,201, 22,139,165, 18,192, 1, 52,244, 67,201, - 3,144, 24, 25, 25,185, 68, 16, 4, 83, 85, 85,213, 19,240,176, 80,117,239, 30,173,247,179, 44,155, 32,122, 2, 2,177, 23,239, - 62, 80,220, 44, 15, 40,150,101, 63,205,204,204,252,215,138, 21, 43,148, 7, 14, 28, 80,118,238,220,217,249, 66, 36, 8, 2, 26, -107, 23, 32, 57, 57,217,159,171,193,177, 44, 59,123,228,200,145, 15, 47, 94,188, 88,121,238,220, 57,101, 92, 92,156,147,211, 85, -108,137,136,139,139, 11, 52,239,127, 53,116,232,208,209,139, 22, 45,226, 87,173, 90,165,104,213,170, 21, 34, 34, 34, 32,149, 74, - 47, 59,246,150, 91,110, 17,252, 71,157,253,244,158,123,238, 25,253,253,247,223, 43,247,236,217,163,236,210,165, 11, 36, 18,201, - 85,199,125,196,136, 17, 15,127,247,221,119,202, 35, 71,142, 40,219,183,111, 15,209, 84,112,231, 99, 89, 22,173, 91,183, 14,136, -243,238,187,239,126,120,217,178,101,202,131, 7, 15, 42, 59,118,236,232, 76, 79, 66,200, 21,135,243,111,206,121, 93, 56, 90, 50, -139,197,130,173, 91,183,130,101, 89,132,135,135, 99,236,216,177,216,184,113,227,132, 77,155, 54,173,190, 2,103,235, 43,135,200, -226, 1,224,199, 71, 71, 32,159, 7,198,149,155, 33,149, 74,113,246,236, 89, 72, 36,146, 38, 91,139,114,185,124, 12, 33,100,146, -254,194, 62,185,193, 96,133,177,100,191, 82,161, 80, 56, 31, 0,250, 18,199,254,139,251,149, 10,133,226,172, 68, 34,153, 90, 95, - 95,191,208, 27, 95,251,246,237,191, 61,118,236, 88, 39, 79, 5,215, 23,244,122, 61,218,180,105,147, 88, 93, 93,221,222,211,255, - 60,207, 39,156, 59,119, 46, 74, 38,147,129, 16,226, 44,196,238,159,226,119,139,197,130, 27,110,184,193,226,235,154,190, 56,109, - 54, 27,130,130,130, 32,186, 81,102,179, 25,245,245,245,254, 56, 25,169, 84,122,159, 40,178, 0, 96,233,210,165,136,137,137, 65, - 84, 84, 20, 84, 42, 21, 20, 10,133,147, 51, 80, 72, 36, 18, 12, 27, 54, 12,239,190,251, 46,178,178,178,240,218,107,175, 53,170, -104,121,158, 71,120,120, 56,214,173, 91, 7,141, 70,131,196,196, 68,136, 2,255, 31,109, 11,178, 76,248,174,253,231,157, 14,237, -237,183,118,226,110,238,206,125,238,120, 84,130,101, 1, 65,104,120,116, 50, 12,136,205, 42, 92,218,127,164,228,157, 0,210, 51, -174,176,176, 48, 42,208, 52,178,217,108,136,139,139,147,248, 57,108,120, 90, 90,218,143,207, 62,251,172,180,125,251,246,140, 84, - 42, 5,199,113,224, 56, 78, 20,232,137,132,144, 68, 65, 16, 6,150,149,149,145,185,115,231,126,184,101,203,150,123, 1,172,245, - 88,177, 16, 67,183, 58,147, 48,124,219, 33,220, 52,114,200, 27, 88,183,124,194, 77,253,210, 5, 4, 43, 13,103, 0,252,157,133, - 86,106, 90, 90,218,161, 61,123,246, 4, 89, 44, 22,244,238,221,123,119,110,110,110, 15, 92,217, 12,238, 97, 0, 62,153, 56,113, -226,232,103,159,125, 86, 18, 26, 26, 10,153, 76,134,186,186, 58,156, 57,115,102,204, 55,223,124, 67,190,248,226,139,255, 3, 16, - 92, 88, 88,152,177,119,239, 94, 12, 26, 52,232, 69, 0, 47, 95,174, 8, 36, 9, 59,246, 22, 68,137,191,239, 30,214, 85,154,209, -147, 45,107,112,113,220,143, 38, 16,236, 66,241,222,195, 23, 2, 17, 98, 31,142, 24, 49,226,145, 21, 43, 86,168, 1, 96,222,188, -121,184,239,190,251, 16, 30, 30, 14,165, 82, 9,169, 84, 10,158,231, 27,125,250,121,216, 74, 0,124,248,224,131, 15,142, 92,188, -120,113, 48, 0, 44, 94,188, 24, 35, 70,140, 64, 68, 68, 4,130,131,131, 33,147,201, 32,145, 72,154,156,152,225,225,225, 95,245, -189,233,166,199, 23, 45, 90, 4, 0,120,235,165,151,112,199,205, 55, 67,173, 84, 64,169,144, 65, 76, 11,153,132,199,237,227, 94, -240,171, 47, 1,124,124,223,125,247, 61,240,253,247,223, 7, 3,192,129, 3, 7, 80, 94, 94,142,232,232,104, 40, 20, 10,200,100, - 50,103,156, 25,134,129, 66,161, 8, 40,238,247,221,119,223,200,239,190,251, 46, 24, 0, 22, 46, 92,136, 97,195,134, 57,227, 46, -151,203, 33,149, 74, 27,109,238,162,211, 19,231,189,247,222, 59,114,217,178,101,193, 0,240,205, 55,223, 96,200,144, 33, 8, 11, - 11,115,166,167,200,213,148,123,244, 55,231,188, 62,132,214,161, 67,135,238, 87,169, 84, 51, 0, 68,202,100,178,208,135, 31,126, -184,245,227,143, 63,142, 7, 31,124, 16,155, 54,109,122,170,137, 66,139,137,142,142, 30,155,147,147,227,124, 66,155,201,101,130, -169,201, 15,112, 7, 38,237,127,234,169,152,172, 51,245,216,189,247, 20,130,192, 50,123, 63,254, 56,210,120,250, 52,236,102, 51, -222, 59, 91,215,176,223, 70,152,173,175,140,139,185,113,246,255, 77, 2,176,208,135, 11, 32, 55,153, 76,200,203,203,107, 82, 32, -138,138,138, 32, 8,130,201,151,187, 32,149, 74,113,244,232,209,203, 84,189, 39, 36, 38, 38,250, 42,128,126, 57,215,175, 95,143, -241,227,199,227,212,169, 83, 16,151, 42, 9,128,147, 9, 15, 15, 15, 21, 69,150, 40,130, 20, 10, 5,120,158,103, 56,142, 99,196, -166, 61, 71,225, 10, 72, 24,179, 44,139,111,191,253, 22, 31,124,240, 1, 94,127,253,117,204,159, 63, 31,221,186,117,251, 35, 19, -114, 28,180, 90, 45,194,194,194, 16, 22, 22,214, 72, 32,254,147,225,126,155,103,206,154,163,132, 64, 26, 58,129, 16, 1, 16, 0, - 2, 2,129, 8, 40,187,112, 6,147,223,253, 40,224,167, 15,207,243, 56,125,250,180, 51, 31,136,206,176, 40,140, 92, 93,131,164, -164, 36,191,121, 73, 42,149, 78,249,249,231,159,101,223,126,251, 45,190,255,254,123, 48, 12, 3,185, 92, 14,149, 74,133,208,208, - 80, 68, 68, 68, 56,183,132,132, 4,230,127, 61,184,254,121, 0, 0, 32, 0, 73, 68, 65, 84,255,251,159,180, 91,183,110, 83,180, - 90,237, 90,207,247,156,132, 40,219,102,165,142, 28,242, 6, 0, 96,228, 27, 4,151,242,166,221,200,214,188,243,119, 94, 68, 54, -181,107,215,174,219,119,238,220, 25,164,215,235, 33, 8, 2,214,174, 93,171, 28, 50,100,200,182,130,130,130,126, 77, 21, 91, 73, - 73, 73,171,118,238,220,121, 75,100,100, 36,106,107,107,161,213,106, 97,181, 90, 33,145, 72,144,152,152,136, 15, 63,252,144,185, -231,158,123,158, 31, 51,102,140, 81,161, 80,136,206, 70,146,231,188,212, 56, 51,205,253,236,243, 80, 66, 26,242, 15, 17, 72,163, -207,234,242, 66,188,244,202,228,128,194,216,186,117,235,167,127,248,225, 7,181,171,179,228, 42, 2, 92, 69,150,184,249, 17, 6, -108,155, 54,109, 30, 95,178,100,137,147,179, 85,171, 86,224, 56, 14, 60,207,131,227, 56,176, 44,139,109,219,182, 97,198,148,137, - 8,139,140,195,156,207,230,249, 13,103,100,100,228,252, 97,195,134, 61,186,112,225, 31, 85,119,215,182,109,113,231, 45, 55, 35, -170,149, 6,173,194,130, 27,210, 73, 96,240,251,169, 2,191,207, 35, 0,108,235,214,173,159, 88,190,124,185,218,245,133, 80,140, -171,248,242, 44,186,248,102,179, 25, 61,123,246, 12, 40,238,174,156,162,219, 38,138, 54, 49, 61,197,235,136,229,213, 79, 56, 31, - 23,133,176, 67,112, 54,226,224,121, 30,203,215, 45,242,234,102, 95, 41,103, 83,239,187, 59,103, 97, 97, 33,166, 79,159, 14,241, -165,205,181,171, 80,124,124, 60,230,204,153,227,183, 94,114, 43, 3,189, 0, 68,186,236, 50, 3,144,185,124, 86, 48, 12,179,207, -195,113,226,126,222,209, 98, 21,137,134,126, 99,117, 0, 66, 61,240,121,227,169,116, 60,243, 34,221,142,111,116, 29,175, 66,107, -245,234,213, 98, 41, 30,152,153,153,185,213,241,189, 70, 46,151, 23, 41,149,202, 24, 0,117,107,215,174,197,127,254,243, 31, 56, -172,213,187, 67, 66, 66,142,121,112,117, 14,153, 76,166, 55, 0,148, 57,118,137, 67, 52,217,234,234,106, 97,227,198,141,236,226, -123,135,194, 76,128,244, 73, 51, 48, 44, 51, 19,235,227,101,144, 0,184,233,100, 37,148, 74, 37,167,213,106,173,174,253,182, 60, -244,221,202,118,203, 80,146, 32,142, 67,239,237,107, 48,126,251, 26,220,164,146,161,106,197, 50,212,237,200, 1,203, 50,232,175, -106,133,215, 30,217,136, 62, 26, 57,100, 38, 29, 88,150,245,148,179,157,156,121,121,121,163, 52, 26,205, 12,183, 4, 14, 4,249, -104, 88,199, 9, 94,194, 9, 66, 8,186,117,235, 6,134, 97,156,110,129,184,137,133, 78,220, 14, 30,244,216, 2,233,149,211,209, - 4, 7,149, 74,133,223,126,251,205,121,204,224,193,131, 97, 52, 26, 17, 30, 30, 30, 16,103, 69, 69, 5, 41, 41, 41, 97, 22, 47, - 94, 12,158,231, 17, 17, 17, 1,165, 82,201, 44, 90,180,104,162, 84, 42, 77, 48, 26,141,130,217,108,134, 76, 38,155, 35,222, 31, -142,227,116, 90,173, 54,194, 27,167, 68, 34,193,179,207, 62,139, 87, 95,125, 21,243,231,207,199, 83, 79, 61,117,153,227,101, 52, - 26,209,170, 85, 43,167,216,242, 80, 0, 91, 98,184,111,203,114, 10, 4,199, 14,174,199,241, 35,217, 16,236, 2,236, 2, 1, 33, -118, 8, 54,224,192,198,221, 29, 46,230,151,196, 19,144,134,174,183, 0,228,181,245,182, 1, 17,178,142, 0, 86,110,173, 50,207, -246, 23, 78,142,227, 96, 52, 26,241,243,207, 63,227,228,201,147, 88,187,118, 45, 12, 6, 3, 90,181,106,133,208,208, 80,220,124, -243,205, 24, 51,102, 12,146,146,146,252,198,157, 16,178,176,168,168, 40,189,111,223,190, 76, 77, 77, 13,106,106,106, 96, 48, 24, - 96,183,219, 97,179,217,192,113, 28,130,130,130,160, 80, 40, 16, 29, 29, 13,163,209, 72, 76, 38,211, 66,111,156,130,192,212,234, -207, 78,200, 93,183,124,194, 77, 35,223, 32, 88,241, 1,131,118,109,228,250,223,246, 7, 63,190,114,251,107,183, 1, 32, 2,113, - 90, 11,196,106, 23, 42, 95,157,248,201,243,127,250, 61,186, 92,100, 69, 24, 12, 6,212,213,213, 53,216,250, 50, 25, 86,172, 88, -209,234,174,187,238,202, 41, 41, 41,233,239, 67,108, 93,198, 25, 28, 28,156, 40,145, 72,112,244,232, 81,124,241,197, 23,248,237, -183,223, 80, 86, 86,118, 41, 46, 46, 46,100,224,192,129,236, 75, 47,189,132,244,244,116,124,253,245,215, 65,254, 56, 9, 33, 40, -204,219,134,194,211,219, 33, 8, 13,174,117,195,230,249, 59, 9, 48,238, 58,157,206,120,232,208, 33,245,151, 95,126,137,168,168, - 40, 36, 39, 39, 67,169, 84, 34, 40, 40,168,209, 67,214,245,193,235,175,108, 26, 12, 6, 99, 97, 97,161,250,187,239,190, 67, 68, - 68, 4,146,146,146,160, 84, 42, 33,147,201,192,113, 28, 24,134,193,226,197,139,177,244,221, 71, 80,120,234, 8, 70,220,121,155, -223,112, 42,149,202, 71, 23, 46, 92,216,200, 2,137, 14, 11, 3,199,179,144,240, 12,194, 6,223, 11, 0,184,180,233, 39, 95,179, - 67,186,114, 50,117,117,117,198, 61,123,246,168,247,239,223, 15, 65, 16,144,148,148, 4,189, 94, 15,141, 70,227,140,255,198,141, - 27,113,207, 61,247,224,219,111,191, 69, 70, 70,134,223,184,215,215,215, 27,143, 28, 57,162, 94,178,100, 9,194,195,195,209,186, -117,107,103,220,197,141,231,121, 72, 36, 18,164,164,164,160,182,182, 22,106,181,218,239, 61, 58,112,224,128,122,201,146, 37, 8, - 11, 11, 67, 66, 66,130,211,113, 19,197,209, 7,159,191,219,136, 32,136,137,189,106,206,166,222,119,119,206, 17, 35, 70,160, 93, -187,118,208,104, 52, 80,169, 84, 78,110, 95,156, 94,180,136, 83,111, 51, 12,179,218,165, 76,100, 50, 12,179,218,245,211,219,113, -142,175,253, 39, 78,156,216, 51, 43, 43,107,122, 70, 70,198,119, 59,119,238, 92,234,141,207, 27,207,196,137, 19,211,178,178,178, -166,187, 30,239,225, 58,222, 29,173,204,204, 76,198, 17, 73, 6, 64,114,143, 30, 61,246,109,218,180, 41, 60, 56, 56,216,121,240, -249,243,231, 81, 83, 83,131,224,224, 96,205,204,153, 51, 53, 3, 7, 14, 68,116,116,180,243, 13, 32, 47, 47,239,134,212,212, 84, - 45, 0,119,223, 86, 96, 89, 22,125,250,244,193, 49, 71,107,199,176,204, 76, 36, 36, 36, 56, 59,121, 4, 5, 5,225,249,231,159, -103,198,143, 31,207,137,110, 6, 33, 4, 6,131, 1,177,177,177, 10, 95,174, 14, 0,164, 25, 42,241,211,192,254, 96, 25, 64,127, -112, 47,164, 50, 6,172,132, 65,119, 82,133, 95, 7,245, 7, 3,192,124,120, 23, 2,112, 97, 14, 2,184,173,101, 28, 14,130, 51, -103,206, 4,228,104, 57,226,197, 92, 41,167,232,104,236,220,185, 19,118,187, 61, 80, 78,194,178, 44, 84, 42, 21, 98, 98, 98,160, - 80, 40,160, 84, 42,153,239,190,251,238,237,228,228,228,216,241,227,199,179, 90,173,150,237,211,167, 15,238,187,239, 62, 78,108, -226, 76, 75, 75,243, 27,151,173, 91,183,226,139, 47,190,192, 83, 79, 61,229,209,209, 98, 24, 6,145,145,145,208,104, 52,184, 86, - 32, 0,176,216,172,208,215, 27,156, 77,186,118,187, 29, 71,182, 28,238,144,127, 56, 47,109,245,119,223,242, 0, 96,220,242,147, -235,105,177,247,125,190, 44,117, 64, 24,191,103,235, 37,235, 30, 95,121,158,227, 56,140, 29, 59, 22, 89, 89, 89,120,244,209, 71, -177,118,237, 90,188,243,206, 59,248,247,191,255,125,153,171,229,239,205,209,106,181,254,247,177,199, 30,123,106,197,138, 21, 29, -223,120,227, 13, 86,116,180,148, 74, 37, 24,134,129,209,104,132,201,100,130,193, 96,192,169, 83,167,132, 39,159,124, 50,215,108, - 54,255,215,107,115, 37,163,248, 93, 41,215,175,109,155,192,182,211, 21,124, 20,220,247,230, 36, 3,163,232, 81,123,111,234, 16, - 50,124,108, 82, 24, 8, 1, 17, 0,129, 0, 38,147, 14,207, 63,255,162,228, 47,188, 85, 78,145,101, 52, 26,113,232,208, 33, 12, - 26, 52, 8, 69, 69, 69, 56,113,226, 4, 58,116,232,128, 69,139, 22, 69, 62,252,240,195, 57,229,229,229,253, 3,117,182,142, 28, - 57, 50,241,198, 27,111,252,180,190,190,190,186,190,190,254, 83, 0, 75, 1,212,156, 57,115,166,243,153, 51,103,230,174, 95,191, -190,223,228,201,147, 37,110,125,116, 36,222,236, 81,171,213, 6,131,193,228, 83, 96,137,191, 9, 17, 2,138, 56,195, 48,164, 99, -199,142,184,235,174,187,192,243, 60,148, 74, 37,212,106,117,163,102, 51,119,193,229,171,254, 0, 32, 48, 12,131,184,184, 56, 12, - 31, 62, 28, 82,169,180, 17,167,152, 15,135, 15, 31,142, 23,222,155,132,255,190,112, 43,190,120,172, 3,134,188, 95,230, 51,156, -122,189,190,126,243,230,205,138, 87,159,122, 10, 55,182,111,143, 86, 26, 13,218, 68, 71, 66, 33,151, 65,234, 26, 38, 38, 32,147, -157, 0, 16, 36, 18, 9,186,116,233,130,178,178, 50, 20, 20, 20,160,160,160, 0, 44,203,162,111,223,190, 78, 23,230,244,233,211, -120,239,189,247, 96, 50,153, 2,142,123,251,246,237,113,235,173,183, 66, 38,147, 65,169, 84, 54,106, 50, 20,211,180,174,174, 14, -237,218,181,195,202,149, 43,145,154,154,234,151,179, 83,167, 78, 24, 48, 96, 64,163,244, 84, 40, 20, 78, 81, 4, 0, 69,123,234, -157,215,136,143,143,111, 18,231,134,189,231,241,229,198,205, 48,153, 5,104,245,214, 70, 39,196,182,210, 96,251,146, 55, 2,138, -187,200,185, 96,193, 2,212,212,212, 56,141, 3,241,165, 92, 52, 81, 90,183,110,141,121,243, 60, 59,153,110, 90,196,211, 51, 47, - 51,192,231,173,120,156,152,185,228, 89, 89, 89,211,221,207,247,199,231,250,191,219,249,102, 55,113, 86,214,164,166, 67,185, 92, -254,230,230,205,155,195,107,107,107,113,250,244,105,176, 44,235,108, 83,231, 56, 14, 22,139, 5,103,207,158, 69,120,120, 56,202, -203,203, 33,151,203, 33,145, 72, 96, 54,155, 1,160,187,183, 7, 56, 33, 4, 47, 84, 52,116, 17, 90, 23, 39, 69, 33,128, 59, 43, - 26, 10,134,216, 33,254,135, 31,126,128, 90,173, 70,112,112,176,243,211, 95, 51,210,145,130, 51, 40,227, 25,176,187,182,129, 97, - 1,150, 1, 24, 9,192,178, 4, 44,195,128,221,149, 3,134, 1, 84, 17, 97, 77,173,128,253,117,140,247,217, 1,222,155,251,228, -201,197,114,255,190,101,203, 22, 4,202,217,174, 93, 59,168,213,106,231,182,126,253,250, 70,142,150,221,110, 71, 68, 68, 68, 32, -156,164,193,141, 16, 16, 21, 21, 5,158,231,153, 69,139, 22, 77, 76,249,127,246,174, 59, 60,138,106,125,191, 51,219,119,147,108, - 54, 61, 33, 33,148, 0, 82, 34, 77,225,194,165,151, 0, 66,104, 34, 69, 46, 4, 17, 81,138,168, 40, 17,129, 31, 42, 32,161, 73, -147, 42,200, 37, 32, 72,151, 46, 69,164,131, 5, 20, 36,129, 64, 8, 9,164,111,234,246, 50,237,247, 71,118,227,102,179, 73, 54, - 33,194, 5,231,125,158,121,118,167,189,115,206,156, 51,103,222,243,157,239,124,211,176, 97,200,244,233,211, 73,129, 64,128,235, -215,175, 35, 33, 33, 1,245,235,215,119,219,103,171,168,168, 40,235,147, 79, 62, 97, 62,249,164,100, 14, 69,100,100, 36,138,138, -138,114,237,251, 53, 26, 77,126,159, 62,125,202,248,109,228,229,229, 61,219,158,240,182,251, 72, 91,105, 24, 76, 38,232,180,134, - 82,235, 80,110,102,142,234,227, 15, 63, 16, 45,155,250, 6, 0,224,195,149,107,160,221,248, 87, 67,118,224,195, 81,129, 67,191, -220, 53, 19,192,224,202,248,117, 58, 29, 76, 38, 19, 34, 34, 34,112,249,242,101,104,181, 90,244,235,215, 15, 4, 65,148,206, 16, -173, 6, 44, 25, 25, 25,157,162,163,163,127, 93,177, 98, 69, 68,243,230,205, 9,189, 94, 15,131,193, 0,199,223,155, 55,111,114, - 59,119,238, 76, 49, 24, 12,255,182,153,206, 93,226, 68,198, 55,201,125, 67,223,220,251,227,117, 65,116, 96,163, 36,101, 70, 97, - 4,157,159, 33,213,107,140,119, 76, 12,151, 0,142, 1, 24,176,224,104, 22,140,109,216,235,105, 65, 46,151,127,117,241,226, 69, - 63,147,201,132,107,215,174, 97,204,152, 49,150,188,188, 60, 9, 0,252,231, 63,255,177,108,223,190, 93,210,168, 81, 35,108,219, -182, 45,224,213, 87, 95,221,163,215,235, 95,116,147,250,219,172,172,172,111,157, 55,250,249,249,173,126,248,240, 97,119, 71,159, - 31,154,166, 75,147,227,242,193,100, 1,138,162, 96, 52,154, 81, 92,172,133,197, 74,217,218, 76, 22, 12, 67,219,126, 89,208,182, -118, 84, 34, 22,122,181,125, 49, 88,199,113, 28, 72,130, 40,186,246,103,118,221,202, 68,187,171, 33, 46, 55,173, 89,206, 96,236, -179,204,252,252,252, 32, 18,137,240,237,183,223,226,198,165, 19,144, 8, 56, 48, 52, 5,154,178,130,161, 44, 16, 9, 4,248,241, -250, 3, 68, 53,243,114, 75, 16,250,251,251, 99, 64,199,142,136,238,216,177,100,122,155, 80, 8, 79,169, 20, 10,177,172,196,146, - 5,128, 99, 72,119,131, 8,176,246,116, 6, 5, 5,225,183,223,126,195,180,105,211,176,120,241, 98,200,229,242,210,217,207,183, -111,223,198,238,221,187, 17, 21, 21, 85,237,188,219, 45,120, 51,103,206, 68,102,102, 38, 86,174, 92,137,151, 94,122, 9, 34,145, - 8, 69, 69, 69,248,247,191,255,141,156,156, 28,183, 56, 29,135,247, 36, 18, 73, 25,235,147, 93, 0, 86,183,140, 28, 57,223, 24, - 18,130, 67,151,118,130, 0,129,171, 59, 62, 40, 35, 10,215,239,186, 80,109,206,185,115,231,150, 73,167, 59,214, 44,119,225,100, -117,170,242, 56,130, 32,174,217,141,173, 51,103,206,156, 69, 16,196,145,153, 51,103,206,138,139,139,187,229, 14,159,171,253, 4, - 65, 28,181,137,176, 1, 14,219,174, 85, 75,104, 41, 20,138,246,158,158,158,184,119,239, 30,250,245,235,103,201,207,207, 79, 18, -137, 68, 77,242,242,242,164,185,185,185, 48, 24, 12,186,249,243,231, 63, 0, 32,239,208,161, 67,163, 31,127,252, 17,143, 30, 61, -194,246,237,219, 1,224,128,107,159, 13, 18, 44,203,150, 86, 10,231,110,155, 64, 32,192,149, 43, 87,112,229, 74, 89,215,175,205, -155, 55, 87,249,194,120,245,251,195,184,126,253, 58, 28,195, 3,216,255, 59,110,147,201,100, 64,229, 51, 60,202,160, 42,199,248, -170, 28,224, 93,193, 93,223, 47, 87, 51,115, 42, 66, 70, 70, 70,133,231, 95,185,114,165,140, 69,171, 42, 78,129, 64, 0,134, 97, - 32,151,203, 9,177, 88, 76,136,197,226, 48,187,200, 18, 8, 4,165, 15,140, 84, 42,133, 84, 42, 45,211, 75,173, 8,153,153,153, - 61, 50, 51, 51, 43,220,175, 86,171, 59,169,213,106, 60,143,176, 82, 20,140, 6, 11,180, 58, 35, 62,143,251,111,201,198,207,241, - 51,128,159, 59,189, 51, 13,147,251, 70,245,172,238, 48,181,253,126, 7, 6, 6,226,220,185,115, 32, 8, 2,123,246,236,129,183, -183, 55,250,246,237, 11,165, 82,137,153, 51,103, 98,248,240,225,213,109,204,138,243,243,243, 59,189,255,254,251,191, 46, 93,186, - 52,188,110,221,186,176, 88, 44,176, 90,173,176, 88, 44, 72, 78, 78,198,206,157, 59, 31, 25, 12,134, 78, 0,138,171, 34, 59,145, -241, 77,242,254,243, 31,102,246, 30,249,170,241,118,206, 15,200,206,206, 7, 77,103,128,101,104, 88,105,166,196,194, 71,211,160, -105, 6, 98,177, 64,185,244,139, 15, 78,177,224, 64,146,132, 5,192, 43, 79,170,140, 84, 42, 85,164, 90,173,198,221,187,119, 17, - 19, 19,147,157,159,159,159, 8,160, 23, 0,228,231,231, 95, 28, 51,102, 76,243,248,248,248,224, 6, 13, 26,192,211,211, 83,169, -215,235,171,162,244, 4, 48, 25, 64, 31,148,248,129,216, 81, 0, 96, 62, 73,146,210,107,215,174,149,155,105,119,254,252,121, 0, -248,217,117, 15,200,102,209, 50,153,160,206, 47,196,132,119,230,252,213, 51, 2, 87, 70, 92,112,224, 48,233, 93,200, 0, 32, 47, - 39, 25,111, 76,152, 38,173,170, 67,224,234, 69, 88, 13, 31,157, 50, 29, 53,123, 29,245,244,244, 44, 25,126, 59,184, 19, 71,191, -124, 7, 96,172,224, 40, 35, 96, 53, 0, 86, 29, 88,139, 1,132, 88, 14, 80, 70,183,132,150,167,167, 39, 60,229,114, 4,170, 84, -224, 56, 14, 66,129, 0, 34,145, 16, 44, 5, 16, 12, 81, 42, 72, 89,247, 2,131,148,118, 42,229,114, 57, 82, 83, 83, 49,121,242, -100, 88,173, 86, 12, 25, 50, 4, 22,139, 5, 38,147, 9, 70,163, 17, 13, 27, 54,132,193, 96,112,139,207, 62, 91,209,211,211, 19, - 98,177, 24, 31,124,240, 1, 94,126,249,101,204,155, 55, 15,177,177,177,104,216,176, 33, 38, 77,154,132,157, 59,119, 34, 50, 50, -178, 42, 94,206,177,140,236,247,211, 46,182, 28,135,248, 0, 84,187,140,156, 57, 9,130, 44, 35,216,236,203,123, 99,123, 85,155, -115,209,162, 69, 80,171,213,229, 44, 89,246,255,161,161,161, 88,183,110, 93, 77, 71,134,236,214,163, 32, 23,251, 6, 56, 91,162, - 56,142,107,103,243,157, 50,199,197,197,221,138,139,139,139, 38, 8,226, 72, 92, 92, 92,116, 69, 22, 45, 87, 60, 46,246,187,253, -210, 18, 58,141,141,118,119,220,105,191,209,190,190,190,130,240,240,112, 82,169, 84,162,168,168, 8, 1, 1, 1,156, 90,173, 30, -169, 80, 40, 62,251,238,187,239, 26,233,116, 58,220,190,125, 27,171, 87,175,254, 25,192,170,202,132,214,177, 0,155,233,216,102, -201,114, 92, 31, 56,112, 32, 26, 52,104, 80,198,154, 37,151,203, 43,173, 60,246,125,118,139,144, 64, 32,192, 11, 47,188, 32, 79, - 73, 73, 49,138,197, 98,132,133,133,201,179,179,179,141, 98,177,184,218, 51, 93,170,114,140,175,202, 1,222,149,240,105,215,174, - 93, 25, 11,150,227,175,227,255, 67,135, 14, 85, 57,116,104,231,108,222,188,121,233,253,242,242,242,178,159, 11, 0,232,215,175, - 31, 88,150,133,191,191,191, 91,156,118, 81,107,115,128,135,201,100, 98,181, 90, 45,121,237,218, 53, 72, 36, 18,120,121,121,149, -250,234,200,100,178, 82,107, 38, 15, 87, 13, 2, 11, 11, 69,193,104, 52, 66,167,211, 1, 0,146,255,220, 87, 86,136,153, 53, 53, -230,183, 55,176, 5, 5, 5, 56,113,226, 4,126,248,225, 7,188,252,242,203, 46, 69,117, 53, 4,151,186,160,160,160,243,140, 25, - 51,174, 46, 88,176,160,142,175,175, 47,172, 86, 43, 30, 62,124,136, 45, 91,182,100, 26, 12,134,206,213,105, 96,192, 1, 20, 69, -195,100, 48,163, 88,163,197,103, 95,108,173,176,234, 1, 64, 65,238, 29, 12, 28, 52, 92,242, 36,203, 41, 51, 51,115,122,231,206, -157,191,208,106,181, 69, 6,131, 97, 56,128,101,142,253,169,252,252,252, 46,131, 6, 13, 90,225,235,235,251, 82,110,110,238, 44, - 55, 40,103,166,166,166,206,170, 87,175, 94,153,141,102,179, 25,245,234,213,123, 33, 55, 55,119,116,215,174, 93,255, 15,128,175, -195,110, 47, 0, 39, 1,172,171,168, 46,217,135, 14,117, 58, 35,148,170, 16,100, 60, 56, 87,101, 66,196, 2, 19, 56,150,173,180, - 13,177,119,128, 43, 90,170,152, 25, 87, 46,169,246, 99,237, 47,236, 87,134,141,197, 43,147, 23, 65, 33, 2, 22,190,209, 9, 13, - 85, 0,228,190, 16,119,253, 24,132,202,118,143, 38, 31,118,139, 60,118,195, 6, 92,183,181,199, 97, 1, 1,152, 49,114, 36, 56, - 10,184,156,144,128, 93, 63,253,132,145, 61,122, 64, 33,147,185,221, 97, 97, 89, 22, 98,177, 24,201,201,201,184,124,249, 50,154, - 53,107,134,123,247,238,149, 9, 67,193,113,156,187,249, 47,205,187, 84, 42,133, 72, 36, 66,118,118, 54,162,163,163, 33, 22,139, -177,117,235, 86,156, 59,119, 14, 51,102,204,192,248,241,227,209,189,123,119, 36, 38, 38,186,197,201,113, 92,185,217,138,206,195, -185,213, 45, 35,103, 78,231,247,126, 77,202,221,206,185, 96,193, 2,151, 19, 42,220,225,116,165, 69, 92,148,221, 53, 71, 49,100, -183, 60, 57, 10, 35,231,117, 0, 62,246,109, 51,103,206,156,229,238,121,142,235,118,139, 88,117,134, 48, 75,133, 86,116,116,116, -153,156, 23, 20, 20, 92,189,122,245,106, 11, 15, 15, 15,220,185,115, 71,162, 84, 42, 91,216, 27,116,146, 36,177,103,207, 30,175, -254,253,251,159, 90,182,108, 89, 24,203,178,200,201,201,193, 71, 31,125,164,163,105,122, 20, 0,186,162, 23,120, 85,150,169,195, -135,203, 63,108, 7, 15, 30,116,107, 8,196, 46,164,132, 66, 33,124,124,124,140, 70,163, 17, 10,133, 2, 62, 62, 62, 70,131,193, - 0, 15, 15, 15,251, 88, 49,137,191,102, 42, 84,101,125,170,202, 49,222,217, 1,190, 74, 36, 36, 36,184,117,156,109,168,213,173, - 90,158,154,154, 90, 97, 67,114,238,220, 57,176,182,134,214, 93, 78, 91, 47,143,179, 11, 63,133, 66, 1, 95, 95, 95, 72,165, 82, -200,229,242, 50, 34, 75, 42,149, 86,249,224, 84, 21,144, 84, 38,147,253,226,225,225,161,178,239, 23,137, 68,208,106,181, 69, 5, - 5, 5,237,159,233,161, 67,112,160,173, 52,140, 70, 19,116, 90, 99,173,243, 91, 44, 22, 72,165, 82,236,220,185, 19,157, 58,117, - 66,135, 14, 29,202,137,172, 26,154,231,211, 11, 10, 10,186,175, 90,181,234,231,229,203,151,251,232,116, 58,252,247,191,255, 45, -214,233,116,221, 1,164, 87, 75,108,178, 28, 40,171, 21, 6,147, 25,122, 93,201, 61,184,127,107,223,255, 90, 81,237,204,206,206, -222, 89,201,254,251, 52, 77, 71,219,227,190,185,129,127,213,171, 87, 15,217,217,217,101, 54,166,165,165,129, 97, 24, 51, 74,226, -100,189,233,104, 72,198, 95,209,179, 43,234,197,151, 88, 71,141,102,232,116, 37, 86, 16,147, 62,175,118,234,169, 77,108, 84,228, -147, 85,147, 58, 68, 16, 68,169,211,247,212,169, 83,113,243,198, 13,244,170,163, 65,195, 96, 47,112,154, 12,136,123,126,138, 63, -212,114, 44, 91,113,172,218,220,187, 29, 92, 32,150,237,222,237,114,223,253,193,131,171,149,247,164,164, 36,200,229,114, 48, 12, - 83,238,125, 83,221,252, 59, 10,152, 21, 43, 86, 96,198,140, 25,216,186,117, 43,110,222,188,137,214,173, 91,163,119,239,222,200, -205,205,197,141, 27, 55, 96, 54,155,221, 78,167,163,223, 92, 82, 74, 2, 78, 95, 62,142,180,244, 7,200,204,126, 84,227,114,119, -228,116, 22, 90,251, 79,255,142, 97, 81,109,107,196,249,217,103,159, 33, 55, 55,183,140, 37,203,177, 93,170,200,162,229,172, 69, -156,144,231,228, 11,101, 95,183, 56,137, 30,231,117,231,227, 1, 32, 23,128,160,138,243,156,215,243,226,226,226,206,218, 45, 97, - 54, 94, 65, 85,254, 89,101, 44, 90, 78, 88, 52,120,240,224, 65,171, 87,175, 14,144,201,100,165, 51,144,102,206,156,137, 25, 51, -102, 32, 34, 34, 2,254,254,254,161, 42,149, 10,249,249,249, 88,188,120, 49, 82, 83, 83, 39,194, 69,160, 61,103,161,213, 37, 69, - 11,137,228,175, 14,171,221,178, 5, 0,227,199,143, 47,103,209,178, 23, 80,101,160, 40, 10,126,126,126, 48, 24, 12, 16, 8, 4, - 24, 50,100,136,224,207, 63,255,100,250,246,237,139,161, 67,135, 10,110,220,184,193, 12, 24, 48, 0, 2,129, 0, 61,123,246,212, -236,223,191,255, 67, 0, 95,186, 33,182,106,205, 49,222, 94,201,220,141,125,228,142,184,172,140,147, 32, 8, 24, 12, 6, 8,133, -194, 82, 71,121,119, 56,237, 67,135,142, 15, 32, 73,146, 80,169, 84,165,141,135,221,162,101, 23, 90, 85,241, 86, 21,144, 84,161, - 80, 40,239,220,185,211,200, 62,241, 34, 47, 47, 15, 61,123,246,188, 91, 80, 80,240,108,155,180, 88,192, 74, 51,208, 25, 77,208, - 25, 13,181, 70,107,127, 30, 54,110,220,136,196,196, 68,152, 76, 38,124,245,213, 87,165,147, 10, 28, 69,214, 99, 8,174,100,185, - 92,206,246,235,215, 15, 87,175, 94,133, 84, 42,165, 80,131,248, 87, 44,199,194, 74,211, 48, 25,141,208, 85, 61,228,246,188,160, - 84, 85, 39, 38, 38,194, 98,177, 96,222,188,121,204,175,191,254,122, 22, 37, 1, 80,237, 22,188,209,221,186,117,155,239,225,225, -161, 58,122,244,232,123, 0,182, 86,246,242,166,104,155,104,175,197,251,232, 56, 34,224,202, 39,171, 38, 97, 86, 28, 95,172, 44, -203, 98,226, 91,111,161,119, 29, 13,134,190, 20, 0,125,214, 93, 40,188, 3, 64,168,234, 99,217,138, 99,184,149,226,182, 43, 38, - 7, 0,253,186, 13, 70,171,102,229,195,131,117,238, 85,210, 39,187,248,227, 47,200,201,203,172,118,222,245,122,125,133,150,171, -106, 88,180, 74,159, 57,251,253,107,211,166, 13,154, 52,105,130,179,103,207,162,109,219,182,184,119,239, 30,238,221,187,135,212, -212, 84,220,188,121, 19,133,133,133,213, 46,163,239, 79,238, 66,161,182, 0, 18,177, 4, 5, 69,121, 72,203,120,128, 32,191,224, -199, 46,119, 59,154, 14,248, 12, 0, 80, 39,192,187, 90, 66,203,145,115,201,146, 37,229,196,251,227,134,236, 33, 8,226,151,202, -214,171,123,254,147, 68, 69, 66,235,129, 90,173,238, 48,114,228,200,153, 0,218,217,182, 21, 3,216,125,234,212,169,193,129,129, -129, 61, 58,118,236, 40,148, 72, 36,184,124,249, 50,246,239,223,191, 21,192,174,202, 46, 36,145, 72,140,245,235,215,151,219, 43, -162,253, 65, 84, 42,149,130,197,139, 23, 19,155, 55,111,174,208,202, 85, 85, 1, 21, 23, 23, 67,175,215,195,219,219, 27, 86,171, - 21,253,250,245, 99, 18, 19, 19, 33, 22,139, 49,104,208, 32, 38, 33, 33,161,180,160, 55,109,218, 20,102, 52, 26,255,253,195, 15, - 63,244, 1,208,181, 26,247,202,238, 24,239, 9, 55, 29,224, 43,234,229,185, 3,119,135,227, 42,226,156, 54,109, 90,141, 56,197, - 98, 49,109,143,252, 78,146, 36,172, 86, 43,218,182,109,139,220,220,220,210,135,198,195,195,163, 84,100,185, 35,180,170, 10, 72, - 42, 20, 10, 97,177, 88,208,181,107, 87, 16, 4,129, 53,107,214, 60, 31,195,145, 44, 75,120,122,250,161, 78,157, 23, 16, 16,104, - 2,203,214,238, 87,101, 98, 99, 99,203,136, 41, 87,145,151,237,247,191, 38,176,115,185, 51, 75,182,178,183,163,125,200, 75,175, - 55, 61,115, 69, 24, 24, 24,216, 33, 55, 55,247,160,211,230, 2, 0,243, 43,233, 88,150, 22,244,163, 71,143,208,183,111, 95, 28, - 63,126, 92,112,224,192,129, 94,135, 14, 29, 74,184,123,247,238,163,182,109,219,214,125,251,237,183,165, 93,187,118, 69, 94, 94, - 30, 94,122,233,165,207, 51, 50, 50, 42, 17, 90,182,251,104, 50, 67,175,175,125,235,168, 43,107,214,227,188, 24,237,117,114,238, -220,255, 67,239,144, 34, 12,105,237,141,248, 35,151, 48,186,141, 28,176, 72,171,205,103, 79,139,111,157, 6,168, 31,217,161,220, -126,169,178, 36,150,107,253,200, 14, 32, 31,221,171,118,222, 29,211,236, 44,170,106, 98,209,115,188,159, 19, 38, 76,192,199, 31, -127,140, 62,125,250,224,222,189,123, 56,127,254, 60,238,221,187,135,105,211,166, 33, 50, 50, 18,173, 91,183,174, 22,231,161,211, -123,161,209, 21,131, 36, 72, 20, 20,231,195,100, 54, 34,118,210,220,199, 46,247,210,151,255,233, 56, 0,192,190, 83,215,107,204, - 57,123,246,108,100,103,103,151,177,100, 61,142, 95,214,179,142,202,162,165, 61, 0, 48,209,121,163,197, 98,241,154, 55,111, 94, -148,191,191, 63, 8,130,192,138, 21, 43,224,235,235,219, 9,192, 45,139,197,146,167,215,235,103, 56,136,144,222,176,197,218,200, -201,201,113, 57,111, 95,175,215, 91,163,162,162, 68, 33, 33, 33,101,102, 27,122,120,120, 84,100,221, 41,229,180,239,163,105, 26, -177,177,177, 88,184,112, 33,194,195,195, 49, 96,192, 0, 68, 71, 71,131, 32, 8,244,235,215, 15, 3, 6,252, 53,148,171, 82,169, -196,199,143, 31,239, 70,146,100,130,195, 11,164, 12,167, 43,216, 29,227, 41,138,114,215, 1,190, 12,167,189,178, 77,155, 54, 13, - 11, 23, 46,196,172, 89,149,187,122,108,216,176, 1, 40,239, 79,245,183,115, 22, 20, 20,148,105,236, 21, 10,197,154,161, 67,135, - 10, 31, 61,122, 84, 70, 92, 57, 46, 46, 26,162, 50,156, 85, 5, 36, 21, 8, 4, 8, 10, 10,194,130, 5, 11,224,231,231,135,224, -224, 96, 87,129,252,170, 44,163, 26,224,111,229,100, 56,246,218,210, 69,255,215,249,191,219, 15,137,164, 18,224,202,249,125,208, - 20,150, 29, 78, 50, 91,255,154, 74, 45,105,219, 11,150,235, 63,186, 85,151,236, 98,250,179,207, 62,195,103,159,125, 86,105,130, - 54,110,220,248,216,121,119, 83,108,149,231,100, 57, 66,225,225, 3,153, 71, 29,180,136,244, 1,203,209,255, 83,101, 84, 1,126, -253,229,151, 95, 6,249,249,249, 33, 61, 61, 61, 64, 36, 18, 13, 42, 99,174, 50, 26, 81,191,126,253, 23,212,106,245,191,171,226, -156, 54,109,154,121,206,156, 57,210, 81,163, 70, 97,232,208,161, 24, 53,106,148, 84, 44, 22, 55,230, 56, 14, 86,171, 21,233,233, -233,248,241,199, 31,161, 86,171,111, 87,150, 78,150,227, 8,185, 66, 5,153, 71, 8, 90,188,168, 2,203,210,181,146,119, 71,171, -184,163, 53,171,154, 34,203,101,253, 4,128, 95,127, 60,136,185, 31,188,136,173, 71,127,198,234, 95,128, 86,170, 92,180, 8, 80, -131, 85,223,198, 71,163, 95,198,178, 29,191, 1, 0,206,159,171,178,140,184,202,234,160,201,104,125,172,188, 59, 90,174, 28,175, -227,134,143, 86, 57, 78,123, 39, 81,171,213,162,168,168, 8,241,241,241,120,227,141, 55,144,155,155,139,212,212, 84,220,189,123, - 23,223,125,247, 29, 20, 10, 69,141,202,232,195,183,102, 99,206,178,233,224,192,161,105,163, 22,152, 57,249, 51,180,107,213,241, -177,203,221, 25,110, 88,179, 42,228, 92,185,114,101, 77,235,210, 63, 78,104,185,132,191,191,255,168,110,221,186,193,100, 50, 33, - 32, 32, 0,169,169,169, 32, 73, 50, 2, 40, 25,194, 11, 13, 13,221,173, 86,171, 35,220,229, 19, 8, 4,160,105,186,212,247,199, -190, 0,192,192,129, 3,113,248,240,225, 42,123, 20,193,193,193,168, 91,183, 46,222,127,255,253,114,179, 28, 28,103, 58,200,229, -114, 28, 61,122, 52,187,160,160,160,128,227,184,106, 77,115,179, 59,198, 95,188,120,209,109, 7,120, 71, 88,173,214, 71,119,239, -222, 13,217,184,113,163,160,146,151, 95, 41,206,159, 63, 79,163,138,161,154,191,131,211, 85,207,148,227,184, 10, 69,150, 59, 97, - 4,170, 10, 72, 42, 20, 10,145,148,148,132,185,115,231,130, 32, 8,236,219,183,239,185,120,184,254,188,147,191,153, 36, 73,159, -129,175,116,110, 9,130,128,213, 82,126,164,218,179, 80, 87, 42,178,134,126,185, 11, 7, 62, 28,233,142,232, 73,190,112,225,130, -239,198,141, 27,133,238,148,251,133, 11, 23,104,142,227,170, 61,236,103,127,225, 88,173, 86, 24,141, 53,179,162,112, 28,119, 57, -238,139, 57, 81,219,190, 61, 38, 34, 8, 11,174,156,219,135,226, 34,215,238, 12, 18,145, 16,155,227,247,211, 98,145,224,209, 83, - 46,186,181, 67,134, 12, 25,245,213, 87, 95,181,112,181,211,141, 73, 48,169, 38,147, 9, 25, 25, 25, 48, 24, 12,123, 63,249,228, - 19,235,177, 99,199,222,124,245,213, 87,209,186,117,107,132,132,132, 32, 43, 43, 11,201,201,201,136,143,143,231, 46, 93,186,180, - 23,192,148, 42,238,227,193, 69, 95,204,137,137,223,113, 76, 66, 18, 86, 92, 57,191, 15,197, 78,162,189,188,117, 90,132,111,182, -238,183,138,197,162, 59, 85, 89,139, 28,173, 89,181,249, 98, 28, 52,102, 50,134,174, 90,141,136,118,125,177,104,113,111,124,243, -197,112, 44,239, 39,134,117,207,104,180,122,109, 27,118,206,235, 15, 0,168,243,141,155,214, 18,161, 24, 15, 93, 88,172,138,138, -101, 54,113, 83, 61,171,169, 61,239,149, 89,174,170,107,209, 34, 73, 18, 13, 26, 52, 64, 68, 68, 4, 58,117,234,132,182,109,219, -162, 71,143, 30,184,113,227, 6,110,220,184,129,105,211,166, 85, 38,178,170, 44,163,238,255,142,194,207, 93,238, 60,118,217, 56, -151,123,109,192,157,186, 52,121,242,100, 0,248, 71, 89,183,170, 45,180, 52, 26,205, 13,150,101, 91,122,123,123,219, 45, 82,165, -251,210,210,210,192,178,172,161,186, 5, 99,177, 88,236,193, 49,203,196,101,178, 59,199, 87,246,224,115, 28,199, 20, 20, 20,160, - 91,183,110,232,210,165, 75,233,240,137,227,226, 32, 76,112,224,192, 1,112, 28, 87,109, 39,107, 7,199,120, 29,170,233, 0, 15, - 0,185,185,185,125,187,118,237,122, 74, 40, 20,186,245, 21, 77,150,101, 83,115,114,114, 94,121,210,156,174,202,135,101,217, 10, - 69,150, 59, 13, 81, 85, 1, 73,133, 66, 33, 60, 60, 60,240,253,247,223,195,223,223,255,185,122,192,110, 36,170,151, 84,182,191, -155,159,228, 28,128,128,161, 95,238,122,120, 46,223, 90,111,232,151,187,210, 14,124, 56, 50,188,178,115,178,179,179,251,140, 28, - 57,242,184,187,229, 78,211,244,131,236,236,236,106,135, 75,224, 56, 14,119,238,220, 97, 39, 76,152,144,167, 86,171,135,215, 36, -255, 51,231,174, 94,190,240,243,169,126,253,162, 58,180, 3, 9, 88, 42,118,254,229, 8,128, 19,138, 4,143,102,204, 90,249,214, -240,225,195,159,102,177,105,178,179,179, 59, 13, 27, 54,108, 10,254,114,157, 40, 35,164, 80,193,236,106, 27, 86,213,173, 91,247, - 69,129, 64, 32, 5, 48, 23, 64,218,165, 75,151,214, 94,186,116,169, 15,128,127, 9, 4,130, 16,134, 97, 50,108,157,158, 93, 0, -254,168,186, 30,229,190, 13,142, 13,235,215,251, 95,125, 65, 16,156,197, 98,174,162,131, 4, 14, 28,199,137,197,162, 59,191,222, -200,106, 85, 89, 71,202,225, 11, 28,181, 62,100, 63,101,202, 20, 76,153, 50,165,180, 62,173, 89,211, 5,123,255,188,136,215, 90, -165,195,252,117,103, 16,202,112,183, 59,124, 0, 48,251,255, 38,212, 90,218, 28,243,238,104,209,114,245, 28, 84,199, 71, 75, 32, - 16, 32, 47, 47, 15, 73, 73, 73,200,201,201,129,193, 96, 64, 98, 98, 34,172, 86, 43, 10, 11, 11,241,226,139, 47,214, 56,157,181, - 85, 70, 79,147,243,159, 56,124, 88,109,161,101,181, 90, 63,109,208,160,129, 72, 38,147,181, 96, 24, 6, 28,199,129, 97, 24,206, - 38,106,170, 61, 11, 79, 36, 18,153,154, 52,105, 66,184,154,157, 96,255,239,225,225, 97,172,196, 90, 18, 87,191,126,253, 79, 8, -130, 16, 84,212, 11,177,255,103, 89,150, 17, 10,133,113, 53,188, 87,143,235, 24,175, 87,171,213, 29,107,185,252,254, 14, 78,231, -242,209, 55,107,214,172,244,139,246,206, 49, 81,108, 31, 91,213, 87, 33,206, 43, 13, 72,170,215,235,179,250,246,237,203, 56,238, -119, 12,104,250, 92,131,224,210,250,143,122,179,222,185,124,107, 61, 0,176,139, 45,112, 92, 90, 37,103, 25,179,179,179,187,253, -221, 73, 75, 73, 73,177,252,235, 95,255,250, 86,171,213, 78, 6, 80, 99,111,254, 89,159,174,153,245, 12,150,140, 6,192,194, 26, -158,155,150,159,159,223,211,105,219, 31,118, 65,101,143,107, 87,109,209,126, 59,175,214, 99,139,209, 52,157, 30, 17, 17, 81, 45, -203, 13, 69, 81,233, 85,237,119,142, 17,230,136, 91,240,198,172,171, 64,201,228,239,124,183, 56, 77, 38, 83, 65,199,142, 29, 69, -213,204, 91,174,187,121, 15, 9, 9, 65,157, 58,117, 74,127,237,112,222, 94, 85, 58,105,154, 78, 15, 11, 11,131,191,191,127,133, - 17,223,157,125,178,220,225,172,237, 50,170,140,179, 78,157,109,181,206, 89,211,116,242,112, 15,189,121, 78,158,147,231,124,102, - 57, 5,252,253,228, 57,121, 78,158,243, 9,114, 62,151,224,189,212,120,240,224, 81, 17, 24,254, 22,240,224,193,131,199,227,129, -168, 68,149, 86,103,166, 79, 77,148,237,105,158,147,231,228, 57,121, 78,158,147,231,228, 57,255,113,156, 85,113,215,246, 76,227, -231, 26,188, 89,149,231,228, 57,121, 78,158,147,231,228, 57,121,206,127, 44,248,161, 67, 30, 60,120,240,224,193,131, 7, 15, 94, -104,241,224,193,131, 7, 15, 30, 60,120,240, 66,139, 7, 15, 30, 60,120,240,224,193,131, 7, 47,180,120,240,224,193,131, 7, 15, - 30, 60,120,161,197,131, 7, 15, 30, 60,120,240,224,193,131, 7, 15, 30, 60,120,240,224,193,131, 71, 9, 8, 0, 56,114,228, 72, -233, 7, 1,163,163,163, 9,254,182,240,224,193,131, 7, 15, 30, 60,158, 36,158,107, 45,226,152, 57, 30, 60,120,240,224,193,131, - 7, 15, 94,139,212, 14, 72, 94,108,241,224,193,131, 7, 15, 30, 60,120,177,197,103,140, 7, 15, 30, 60,120,240,224,193,139,172, -103, 10,101, 44, 90,188,224,226,193,131, 7, 15, 30, 60,120, 60, 77,177,245,140,106, 17,206,182, 56,174,243,224,193,131, 7, 15, - 30, 60,120,240,120, 76,129, 85,217, 47, 15, 30, 60,120,240,224,193,131, 7,143, 90, 18, 92,246,255, 79, 76,104,241, 95, 54,231, - 57,121, 78,158,147,231,228, 57,121, 78,158,243, 31, 11, 33,127, 11,120,240,224,193,131, 7, 15, 30, 60, 30, 27,142, 86, 44,130, - 23, 90, 60,120,240,224,193,131, 7, 15, 30,181, 39,178, 8, 87,235,252,183, 14,121,240,224,193,131, 7, 15, 30, 60,254, 38,240, - 22, 45, 30, 60,120,240,224,193,131, 7,143,199, 3, 1,126,232,144, 7, 15, 30, 60,120,240,224,193,227,111, 21, 91, 46, 55, 86, - 52,115,224,116, 53,200,107, 50,251,224, 52,207,201,115,242,156, 60, 39,207,201,115,242,156,255, 56,206,170,184, 79,227,217, 67, - 55, 0,103, 1,116,183,253, 86, 40,188,106, 27,252,212, 87,158,147,231,228, 57,121, 78,158,147,231,228, 57,159,119, 84, 24,168, -148,119,134,231, 81, 21,132,168,124,136,185,170,253, 60,120,240,224,193,131,199, 63, 77,108, 17,225, 72,218, 0, 0, 32, 0, 73, - 68, 65, 84,113,142, 47, 73, 87,104, 12, 96, 22, 0,111,135,109,191, 0,136,115, 58,110, 7, 0,133,195,186, 30,192, 60, 0,247, -170, 76, 13,199,137,109,252, 82,219,194, 2, 48, 1, 48, 3,208, 18, 4, 65,241,101,246,212,209, 17, 64,180,237,255, 17, 0, 87, -170,185,255,185, 66, 72, 72,136,220,199,199,167,207,245,235,215, 37,137,137,137,184,112,225, 2,183,121,243,102,107, 97, 97,225, -201,172,172, 44, 35, 95, 93,158, 11,244, 5, 48,211,246,127, 17,128, 19,143,201, 71, 40, 20,138,105, 30, 30, 30,253,165, 82,105, - 29,154,166, 9,131,193,144,169,215,235, 79,209, 52,253,165,173,221,171, 46, 6,251,250,250,190,217,180,105,211,198,169,169,169, - 25,153,153,153, 59, 0,236, 1, 48,188, 78,157, 58,163,235,215,175, 31,122,231,206,157,123, 5, 5, 5,223, 0, 56,248, 20,211, -201,131,199, 63, 9, 68,101,214, 8, 87,152,203,113,220,232, 50, 12, 68,121,142,158, 61,123, 14, 58,121,242,164,130,101, 89,216, - 23,185, 92, 78, 3, 24, 87,133,200,242,187,124,249,114,189,201,147, 39, 15,205,204,204,124, 89,171,213,182, 7, 0,133, 66,241, -115, 96, 96,224,175,171, 86,173,250,142,227,184,116,130, 32,180,213,204,168, 80, 36, 18,189,225,227,227,211,159,166,233,182, 28, -199, 65, 36, 18, 93, 47, 44, 44, 60, 65, 81,212, 55, 0,106, 34,222, 36, 66,161,112,138, 84, 42,237, 75,211,116, 75, 0, 16, 10, -133, 55,205,102,243, 9,154,166,215, 2,176,212,128, 83, 38,145, 72,166, 40,149,202, 40,139,197,210, 18, 0, 36, 18,201, 77,141, - 70,115,202, 98,177,172,181, 9,206,167, 13, 33,128,104,142,227, 68, 0, 32, 16, 8, 6,183,111,223,190, 30, 65, 16, 44, 65, 16, - 28,199,113,196,207, 63,255,220,134, 97, 24,210, 86, 63,162, 1,252, 10,128,126, 22,159, 16,127,127,255,133, 44,203,214,169,180, -208,100,178,151,175, 95,191,222,116,247,238,221,204,215, 95,127, 93, 52,126,252,120,207,201,147, 39, 11,215,172, 89,179, 54, 43, - 43,235, 61,231,227,253,252,252,150,147, 36,233,239,206,245, 89,150,205,203,207,207,159,254,180,242, 31, 19, 99, 42, 99,238,142, -143,151, 53, 2,144, 94,195,250,253,247,113,154, 98, 56, 0,136,151,197, 55,138, 49,197, 36,219,255, 63, 46,175, 3,102,174, 59, -173,237,202,113,192,148, 40, 47,242,113,133, 86,104,104,104,124, 76, 76,204,168,150, 45, 91, 10, 57,142, 3, 69, 81, 48,155,205, - 77,175, 92,185,210,125,223,190,125, 47,107,181,218,225,213,164,124,235,227,143, 63, 94, 48,127,254,124,127,145, 72, 68, 80, 20, -213,104,247,238,221,109,223,126,251,237,247, 55,110,220, 88,119,196,136, 17, 94,246,237,115,231,206,109,183,104,209,162,134, 0, -190,124, 10,233,228,193,227,159,134,110, 40,235,163,245, 57,128,207, 42, 19, 90, 30,182,151,103,142,205,146, 5,135,223, 82,156, - 57,115,230,144, 80, 40,180, 91,180,218,235,245,250, 32, 39, 43,152, 43,145, 85,127,204,152, 49, 29,247,238,221,187,112,196,136, - 17,217, 10,133,162,201,171,175,190,170, 37, 8, 66,176,123,247,238, 54, 17, 17, 17,242,129, 3, 7,142,233,217,179,231,135, 28, -199, 93, 32, 8, 66,237,102, 38, 91,248,250,250,238, 95,178,100, 73,189,190,125,251,138,253,253,253,193,113, 28, 50, 51, 51, 67, -143, 30, 61,218,239,243,207, 63,255,176,160,160, 96, 8,128,132,106,220,184,118,114,185,124,239,231,159,127, 30,210,175, 95, 63, - 97,112,112, 48, 76, 38, 19, 18, 19, 19,123,159, 56,113,162,235,198,141, 27,223, 51, 26,141,175,217, 4,134,187,104,239,237,237, -189,239,191, 31,127, 28,212,225,141, 55,132,190,190,190,224, 56, 14,106,181,186,247,197,109,219,186, 79, 90,178,228,189,226,226, -226, 97,174,238,247,211,132, 68, 34, 33,183,111,223,222, 90, 34,145, 0, 0, 44, 22, 11, 34, 35, 35,137,231,229, 9, 33, 8, 34, - 44, 51, 51,211, 91, 44, 22,187,220,207, 48, 12,186,118,237,218, 64, 44, 22,227,203, 47,191,164,242,242,242,218,124,245,213, 87, -215,119,238,220,233,191,118,237,218,215, 0,148, 19, 90, 36, 73,250,167,167,167,187,228,100, 24, 6, 86,171, 21, 52, 77,195, 98, -177,160,121,243,230, 79, 53,255,241,241,178, 48, 0,211, 99, 98, 76, 31,216, 54,125, 9,224, 67, 0, 41,168,225, 55,187,254, 6, - 78,199,250,182,220,225,255, 99,167,213, 1,245, 0,224,216, 13, 19, 0,248, 62,238,125,245,240,240,104,246,250,235,175, 11,213, -106, 53, 68, 34, 17,172, 86, 43,178,179,179, 17, 25, 25, 41,248,246,219,111, 95,168, 46, 95,163, 70,141,198, 47, 90,180, 40,224, -216,177, 99,214,237,219,183, 91,162,162,162, 68,227,199,143, 87,118,237,218,181,121, 88, 88, 24,185,101,203, 22,243,169, 83,167, -168, 49, 99,198, 72,226,226,226, 2,142, 30, 61, 58, 48, 33, 33,225,203, 39,157, 78, 30, 60,254,129, 56,139,191, 66, 60,216,127, - 43, 21, 90,112, 16, 87,131, 1, 64, 36, 18,181, 9, 10, 10,138,167,105, 58,216,102,213,201,206,201,201,249,146,162,168,223,109, -199, 30,100, 89,118, 80, 85,150,172, 49, 99,198,116, 60,126,252,248,178, 43, 87,174, 20,231,231,231, 7, 31, 58,116,200,244,225, -135, 31,166, 2, 64, 74, 74, 74,195,129, 3, 7,134, 78,157, 58, 53,189, 79,159, 62,171,122,244,232,241, 46,199,113,167, 8,130, -208, 87, 37,178, 34, 35, 35, 47,159, 63,127,222, 75,165, 82,149,217, 81,191,126,125,188,251,238,187,226, 65,131, 6, 69,244,234, -213,235, 82,114,114,114, 23, 0,127,186, 35,136, 26, 55,110,124,250,204,153, 51,158, 62, 62, 62, 40, 42, 42, 66,118,118, 54, 12, - 6, 3,148, 74, 37, 70,140, 24, 33,238,214,185, 83,221,169,211,222, 59,157,158,145,209,219, 77,177,213,190, 83,139, 22,167,119, -198,197,121, 82, 15, 31, 66, 46,151, 67,167,211, 1, 0,188,188,188,240,114,131, 6,194,223,182,109, 11, 29, 29, 27,123,250,215, -164,164,222, 79, 73,108, 73,109,191,102, 0, 71, 4, 2,193, 96,137, 68, 66, 14, 30, 60, 24,167, 79,159, 38, 76, 38,147,208,102, -221,161, 7, 15, 30, 12,185, 92, 14,139,197,194,162,100,232,144,126,150,159, 18,137, 68,130,228,228,228, 50,219,180, 90, 45,212, -106, 53,242,243,243, 97, 54,155, 81, 84, 84, 4,150,101, 9,185, 92,174,102, 89, 22, 36, 73, 58, 11,128, 50, 16,139,197, 72, 74, - 74, 42,179,141,166,105,232,245,122,152,205,102, 88,173, 86,104,181, 90,185,151,151, 87, 99,127,127,255,116, 0, 7, 11, 10, 10, -190,204,201,201, 73,123,194,217,207,179, 11,162,248,120,217,125, 0,146,255, 69, 78, 7, 75, 86,168,109,253,143, 90, 74,171, 29, - 15,143,252,110, 10,183, 89,199, 30,212, 2, 31, 11, 0, 23, 46, 92, 64, 78, 78, 14,242,242,242,160, 86,171, 17, 22, 22, 6,142, -227,170, 61, 28,151,156,156,188,238,197, 23, 95, 36,110,221,186,117, 2,192,154,221,187,119,143, 43, 40, 40,152, 57, 99,198, 12, -223,165, 75,151, 22,196,198,198, 46, 2,176,117,247,238,221,239, 52,107,214,172,255,237,219,183, 55, 62,141,116,242,224, 81,219, -224, 56,174, 29,128, 0,123,219, 98,107,119,253, 28,214,111, 16, 4, 97,113, 56,206, 98,107, 27,156,127,237,176,175,171, 9,130, -248,213,225, 60, 53, 65, 16,191,214, 52,153, 78,191, 37,157,110, 0, 56,114,228, 8,103, 95, 92,157, 25, 24, 24, 56,173,103,207, -158,203,174, 93,187,214, 60, 43, 43,203, 39, 43, 43,203,231,218,181,107,205,123,246,236,185, 44, 48, 48,112,154,195,141,112, 62, -245,180,195, 62,241,229,203,151,235,237,223,191,127,209,233,211,167,139,219,180,105, 99, 57,115,230, 12,221,167, 79,159, 92,219, - 11,154,238,211,167, 79,238, 79, 63,253,196,116,232,208, 65,126,252,248,241, 71,151, 46, 93, 90,190,119,239,222, 32,142,227, 4, -174, 56,109, 16,169, 84,170,239,207,157, 59, 87, 78,100, 57,162,110,221,186, 56,114,228,136, 82,165, 82, 29, 4, 32,174, 40,157, - 54,200,100, 50,217,190,159,126,250,201,211,203,203, 11,185,185,185, 16,137, 68, 8, 12, 12, 68,113,113, 49,178,179,178,144,118, -247, 46, 72,139, 5, 43,190,152,239, 37,151,203,247,186,104,236,203,113,122,123,123,239,219,185,112,161,103,254,233,211,248, 99, -193, 2, 88,173,214,210, 33, 87,171,213,138, 75,147, 39, 67,253,227,143,216, 50,119,174,167,183,183,247, 62, 0,178, 42, 56,107, - 3,142,156,147, 1, 20,216,150,201, 0,174, 68, 70, 70, 94, 75, 76, 76, 68,151, 46, 93,176,103,207,158, 86, 51,102,204,152, 60, - 99,198,140,201,123,246,236,105,213,165, 75, 23, 36, 38, 38, 34, 50, 50,242, 26,202,250,103,253,221,233,252,219, 56, 25,134, 41, -179,176,236, 95,239,152, 58,117,234,228,238,223,191, 31, 35, 70,140, 32, 37, 18, 73,214,200,145, 35,165, 23, 47, 94,228,108, 34, -211,237,116,154, 76, 38, 24,141, 70,232,245,122,164,164,164,200,151, 44, 89,210,249,179,207, 62,107,116,250,244,233,208, 89,179, -102, 77, 10, 8, 8,184, 30, 20, 20, 84,239, 9,231,221,234,244,127, 5,128,140,106, 90,136,254,110, 78,206,118, 62, 98, 76, 49, -173, 29, 26,216,234,242, 86,118, 63,179,109,105,213, 3, 72,123,156,186,212,179,103,207, 23, 27, 53,106, 20,180,251,150, 15, 10, -197, 77,193,138, 85, 96,197, 42, 48,126,237,144, 44,121, 5,225,225,225, 65,158,158,158, 29,171,153,206,237,183,110,221,250,151, -173,167,156, 15, 96, 89,108,108,236,231, 4, 65, 92,136,141,141,157, 15, 96,153,109,251,130,219,183,111,119, 0,176,243, 41,165, -243,153,120,222,121,206,255, 45,206, 42,180, 72, 0, 65, 16, 71, 8,130, 56,242,201, 39,159,244, 0,224,231,180,254,111,199,227, - 0, 72, 92,253,218, 23,135,237, 1, 28,199, 13,112, 56, 47,160,134,201, 39, 92, 44,127, 9, 45, 0,136,142,142, 38,162,163,163, -237, 59,126, 33, 8,226, 16,128, 95, 68, 34, 81,155,214,173, 91, 15,254,225,135, 31,188, 2, 2,254,186,126, 64, 64, 0,246,238, -221,235,213,162, 69,139,193, 34,145,168, 13,128, 95,148, 74,229,161, 74,172, 48,170,201,147, 39, 15, 29, 59,118,172,166, 77,155, - 54, 0, 80,148,144,144,160,232,208,161,131,158,166,105,130,166,105,162, 67,135, 14,250,132,132, 4, 5, 69, 81,218,118,237,218, -121,244,234,213, 43,117,250,244,233, 99, 92, 8, 14, 71,188,190,120,241,226, 48, 31, 31,159,202,148, 48,180, 90, 45,130,130,130, - 48,121,242,228, 96,145, 72,244,102,101,119, 75, 40, 20, 78, 89,188,120,113,160, 74,165, 66, 97, 97, 33,194,194,194, 96,177, 88, -144,148,148, 4,147, 94, 7, 74,171, 1,165, 41,130,250,254, 61,168, 68, 66,140, 25, 20, 29, 36, 20, 10,167, 84, 97, 45,153,242, - 77,108,108,144, 37, 53, 21, 41,123,246,128,161,203, 27,127,104,171, 21, 55, 55,109,130, 41, 61, 29,139, 38, 76, 8,146, 72, 36, - 83,158,176, 37,107, 41,199,113,114,142,227,228, 4, 65,172,234,216,177,227,183,114,185,124,114, 92, 92, 92,223,147, 39, 79,246, - 59,127,254,124,119,154,166, 69, 52, 77,139, 46, 92,184,208,197,100, 50, 9,165, 82, 41,132, 66, 33,135,231, 20, 34,145, 8, 98, -177, 24,114,185, 28,157, 59,119,190,191,121,243,102, 42, 44, 44, 76,180,111,223, 62,159, 58,117,234,120,172, 89,179,166, 72,171, -213, 46,118,151,207,106,181,194,108, 54,195,104, 52,194,100, 50,225,204,153, 51, 13,166, 78,157, 42, 52,153, 76,204,192,129, 3, - 11, 40,138, 50,199,198,198, 42,125,125,125, 63,124,146,249,140,137, 49,177, 54,203,211,109,155,104,121,128,199,244,121,250, 59, - 56, 1, 88,108, 62, 89,118,248,219,184, 45,181,116, 43,104, 0, 58,155,208, 50, 59, 61, 31, 45, 29, 44,190, 85,162,168,168,104, -227, 55,223,124, 19, 70, 74, 85,184,104,233,143,239,216,207,113,210,123, 13,114,235,125,132,192,176, 70, 24, 53,106, 84, 32,199, -113,107,106, 33,205, 95, 1,232, 10, 96, 85, 77, 78,126, 2,233,172,231,225,225,177,199,203,203,235,162,135,135,199, 30,216,134, -103, 31, 7, 81,141,208,123, 80, 51, 50, 61, 42, 2,220,160,102,100,122, 84, 35, 62,212,192,243, 2, 39, 45,226, 8, 53,199,113, -209, 28,199, 69, 47, 90,180,104,161,195,251,221,190, 46,119,211, 50, 22,205,113, 92,116, 25,133, 84, 34,176, 30,219,232,230, 98, - 41,209, 20,142, 74,210, 33,115,165,179, 11,131,130,130,226,227,227,227,189,156, 25,179,178,178,160,209,104, 48,103,206, 28,175, -177, 99,199,190,151,158,158, 30, 83, 69, 34, 36,217,217,217,109, 71,143, 30, 45,179, 90,173,133, 44,203,146, 26,141, 70,232,237, -237,205,216, 15,240,246,246,102,138,139,139, 69,122,189, 94,192, 48,140,121,236,216,177,146, 9, 19, 38,188, 12, 64, 80, 17,105, - 64, 64, 64, 84,255,254,253, 43, 28, 58,160, 40, 10,122,189, 30,122,189, 30, 86,171, 21,157, 59,119,150,110,222,188,185, 79,110, -110,238,250, 10, 21,135, 84, 26, 21, 21, 21, 37, 42, 40, 40,128,183,183, 55,210,210,210,240,224,193, 3,152,117, 58, 88,117, 26, - 88,117, 90,208, 90, 13, 56, 77, 49,242,239,221, 65,135,102, 77,197, 59,164,210,190,122,189,126,121, 69,156, 74,165, 50,170,195, -184,113, 66, 15, 15, 15,116, 31, 93, 50,207,224,120,179,102,224, 24, 6, 44,195,128,161,105,244, 77, 74, 2, 69, 81, 32, 73, 18, -237, 10, 10,132,202,109,219,162,212,106,245,178,167, 81,217,165, 82,169,112,251,246,237,175, 75, 36, 18,112, 28, 71, 88, 44, 22, -156, 60,121,242, 31,247,208, 75, 36, 18,200,100, 50, 88,173, 86,212,175, 95,223, 56,122,244,232,203, 95,124,241, 69, 56, 73,146, - 30, 98,177,248,135,252,252,252,133, 89, 89, 89, 41,238,242, 81, 20, 5,139,197, 2,139,197, 2,163,209,136,251,247,239, 7, 55, -104,208,128,152, 60,121, 50, 99, 48, 24, 26,174, 94,189, 58,249,228,201,147,138,197,139, 23,191, 10,224,221, 39,157,223,152, 24, - 83, 51, 0,205,226,227,101, 98,155,229,215,242, 63,198,201,161,196,241, 29,241,178,248, 68, 0,234, 90, 20, 89, 18, 0,222,225, -126, 66,189, 72, 0, 29, 0, 47,155, 40,120,149, 32,136, 14,205,155, 55,247, 73, 76, 76, 44,228, 56,238, 42,128,239, 0,100, 85, - 70,198,178, 44,193,178, 44,222,110, 95,132,201, 29, 5,160,168, 98, 20, 23, 23, 35, 45, 45, 13, 9, 9, 9,248,249,231,132,154, - 62,155,111,122,122,122,246,145,201,100,245,105,154, 38,117, 58, 93,154,193, 96, 56,205,178,236, 70,212,192, 71,237,239, 74,167, - 29, 30, 30, 30, 75,102,205,154,213,201,219,219, 27,191,255,254,123,195, 93,187,118, 45,209,235,245,143,229, 92, 47, 19,145, 91, -150,175, 92, 19, 26, 26,168,194,141,243,135, 67, 23,110,216,189, 5, 96,195,120,153,242,236,195, 73,139, 56,138,161, 95, 57,142, - 27, 64, 16,196, 17,103,161, 84, 45,179,211, 99,158, 95,133, 69,203,249,195,210,101,133, 86, 5, 10, 18, 52, 77, 7, 59, 90,178, - 56,142, 67, 86, 86, 22, 50, 50, 50,160, 86,171,225,227,227, 3,171,213, 26,236, 78,251,160,213,106,219,251,249,249, 25, 68, 34, -145,217,104, 52, 66,161, 80,176, 34,145,136,179, 93,135,176,205, 90,100,204,102, 51, 33, 20, 10, 41, 47, 47, 47, 79,179,217,220, - 20,149,248,146,113, 28,215,222,207,207,207,229, 62,179,217, 12,157, 78, 7,189, 94, 15,157, 78, 7,179,217,140,160,160, 32,208, - 52,221,182,210, 46, 45, 77,183, 12, 8, 8, 64,102,102, 38,228,114, 57,210,211,211, 97,209,105, 97,213,106, 65,235, 53, 96,138, -139,193,106, 52, 96,245, 26, 80, 22, 3, 66,155, 52,131,125, 70, 98,133,221,112,139,165,165,159,159, 31,244,250,191,220,205, 56, -155,192,162,105, 26,180,205, 57,218, 62,156,232,239,239, 15,251,140,196, 39, 4, 51,128, 25, 36, 73,174,146, 74,165,194, 73,147, - 38, 33, 43, 43,171, 76,157,152, 52,105, 82,169, 79, 86,215,174, 93, 47,200,100, 50, 90,173, 86,195,108, 54,139,158,215,135,158, - 32, 8, 16, 4, 81, 82, 70, 52, 13,127,127,127,125, 94, 94,222,207, 69, 69, 69,175,215,132,143,162, 40,251,140, 46, 24,141, 70, -112, 28,135,223,127,255, 29, 50,153, 76,196, 48,204, 45,154,166, 21, 34,145, 8,164,205,249,235, 73,193, 54, 35,240, 75, 0, 97, - 54, 11,209,155, 40,113, 56,207,112,209,144,184,117,235,220,228,172,190,112, 51,197,216, 45, 77, 25,168,217,112,164, 43,116,111, -170,146, 44,143,235, 16,168,106, 61,208, 67,175,144, 8,244,108, 90,235,250,255, 93,154,176,107,236,152, 55,189,230,205,155, 87, -207,223,223, 95,150,156,156,108,154, 63,127,126,131,237,219,183, 19, 40, 25,166,171, 16, 15, 31, 62, 60, 48,107,214, 44,223,254, -253,251, 55,148, 74,165, 68,113,113, 49,212,106, 53,114,114,114,240,224,193, 3,238,198,141, 27,247,205,102,243,158,234, 36, 50, - 36, 36,100,243,235,175,191, 62,246,165,151, 94, 18,217, 45,164,122,189,190,205,185,115,231, 6, 29, 63,126,188,139, 94,175,175, -118,189,124,244,232,209,158,217,179,103,123,188,242,202, 43, 77,165, 82, 41, 89, 27,233,116, 4, 73,146, 65,158,158,158, 56,125, -250, 52, 84, 42, 21, 72,146, 12,122,220,250,106,178,178,161,117,130,253, 96,186,180, 28, 77, 3,234,193,100,101, 67,121,137,242, -252, 88,180, 42,120,215,183,179, 91,164,170, 16, 75,198,153, 51,103,206, 34, 8,226,200,204,153, 51,103,185,178,104,217,254, 50, -142,199, 57, 28,111,174,109,177, 85,173, 64,147, 44,203, 34, 35, 35, 3,153,153,153,200,200,200, 64,126,126, 62, 72,146, 4,199, -113,238,204, 62,227, 8,130, 96, 79,157, 58,229,115,249,242,101,125,187,118,237,138,236,254, 47, 52, 77, 19, 20, 69, 17, 54,191, - 24, 34, 45, 45, 77,124,241,226, 69,213,237,219,183,131,108,189, 85,182, 10, 83, 96,185,109,118,129,229,184,152, 76, 38,200,100, - 50,247, 84,135,237, 69,248,251,181,107, 37, 34, 75,167,181, 13, 25, 22,131,209, 20,131,211,107, 33, 97, 40, 72,192,129, 48, 25, -220,190,127,142,176,139, 44,171, 77,104, 89, 44, 22, 80, 20, 5,150,101, 65,211, 79,197,175,124, 93,171, 86,173,218, 30, 56,112, - 96,124, 70, 70,249,119,225,144, 33, 67,240,238,187,239, 98,234,212,169,183, 7, 12, 24,112,227,240,225,195,152, 50,101, 10, 88, -150,109, 13,160, 24,192,241,231,237,161, 55,155,205,165, 22, 40,147,201, 4,171,213, 10, 84,227,179, 10,206,117,211, 94,182, 52, - 77,219,185,137, 3, 7,246,227,194,133, 11,100, 66,194,173,176, 73,147, 38,219, 29,238,159,116, 86,211, 81, 50,115, 79, 98,107, - 40, 44, 40,241,127,170, 40,164, 66, 4, 42, 31,178,227, 42,227,124, 28,180,218,208,106,196, 7, 31,124, 16,133,146, 25,206, 41, -143,105,209,122, 69, 66, 18, 95, 79,107,233, 43,251,176,149,159, 94, 34, 36,116, 73, 95,207,210, 61, 8, 87,234,131,234, 42, 44, - 97, 13, 84,117, 22, 46,252, 34,228,246,237, 59,230, 57,115,230, 36,142, 28, 57, 50,240,195, 15, 63,108,190,111,223,190, 46, 38, -147,233, 27, 0, 69, 21, 25, 93, 6, 13, 26,116, 53, 48, 48,176,193,134, 13, 27,114, 31, 61,122,228, 67, 81,148,135,213,106,101, -245,122,253, 3,163,209,120,218,106,181,158, 6,112,173, 58,137,245,242,242,106, 53,110,220, 56, 81, 81, 81, 17,132, 66, 33,172, - 86, 43,114,115,115,209,169, 83, 39,193,161, 67,135, 90,212,228, 6, 20, 22, 22, 46,255,230,155,111,206,238,220,185,179,143, 82, -169,124, 73, 42,149, 6, 3, 96,180, 90,109,142, 94,175,255,163, 38,233, 44,211,206, 49, 76,206,181,107,215, 34,148, 74, 37, 30, - 62,124, 8,134, 97,114, 30,183, 14,200,196,228,163,155,231, 15,213,109,230,223, 0, 23, 47, 95,133, 76, 76, 62,226, 67,125, 61, -247,176,251, 80,193, 81, 64,185, 16, 72,151,227,226,226,228,139, 22, 45, 66, 92, 92,220, 45, 87, 22, 45,187,224,138,139,139,187, -101, 63,206,225,248,243,143,145,198,138, 45, 90, 21, 41, 72,160,100,118,161, 90,173,246, 81,169, 84,165, 2, 43, 51, 51, 19,153, -153,153,144, 72, 36, 72, 75, 75,131, 68, 34,201,114,167, 19, 34,151,203,127,107,211,166,205, 11, 41, 41, 41,226,249,243,231,215, -189,118,237,154,178, 83,167, 78, 47,202,229,114,134,227, 56,152, 76, 38, 50, 49, 49,209,115,217,178,101,161,237,219,183,183,180, -111,223,254,250,238,221,187,141,168, 36,254, 21, 65, 16,191,100,101,101, 53,172, 95,191,190, 93,180,149, 17, 87,142,130, 11, 40, - 25,242, 20, 10,133,215, 43, 75,168, 80, 40,188,153,148,148,212, 91, 33,147,194,162,213,192,170,211,128,214,106,193,104,139,193, - 20, 23, 3,122, 13, 36, 52, 13, 17, 67, 65, 46,147, 33, 35, 61, 29, 66,161,240,102,101,156, 18,137,228,102, 78, 78, 78,111,149, - 74, 85,250, 18,165,104,186,100, 97, 24, 88,104,186,212,162, 37, 18,137,240,232,209, 35, 72, 36,146,155, 79,186, 38,147, 36,201, -216, 67, 56, 84,144, 15, 4, 5, 5,177, 29, 58,116,192,148, 41, 83,192, 48,140,173, 24,136,238, 0, 46,162,196,191,229,153,132, - 43,113,107,119, 90, 55, 26,141,208,233,116, 40, 44, 44, 20,202,229,242, 23, 66, 67, 67,175, 90, 44,150, 61, 52, 77,111,121,240, -224,129,166, 34, 78,155, 48, 43, 21, 93, 44,203,130,227, 56, 48, 12, 3,138,162, 32, 22,139,217,115,231,206, 99,217,138, 37,136, -223,178,157, 27, 52,104, 16,113,232,208, 33,176, 44,155,254,132,179,111,177,137,150,202, 26, 13,231,144, 10, 31,161,242,144, 10, - 21,113, 58,246,254, 28,183, 17, 46,142, 41,135, 15, 62,248,224, 4, 74,134, 12,243,108, 98,238,113, 56,191, 44,250,238, 11, 25, -104, 70,111, 62,183, 83,247,237, 93,141,126,222,183, 43,127,179, 72, 4,154,151,187, 5,181,108,216,224, 5,129, 74,229, 67,174, -223,184, 42,127,199,246,189,201, 15, 31, 62,212,172, 93,187,182,227, 11, 47,188,224,253,199, 31,127,132, 86, 36,180, 20, 10, 69, -227, 55,223,124,115, 92, 97, 97,161, 56, 62, 62,126,119, 86, 86,214,111, 40, 9, 45,227, 56,131,122, 0,128,173, 54, 33, 26,100, -107,231, 46, 2,152, 95, 89,127,141, 32, 8,252,244,211, 79,229,102, 7,178,143,167,206, 85,141, 26, 53, 26,145,146,146,114, 33, - 39, 39,103,152,243, 78,177, 88, 60,175, 73,147, 38,125,111,221,186,245, 57,128, 99,213, 33, 54, 24, 12,177,123,247,238, 93, 42, - 16, 8,234, 48, 12,147,105, 52, 26, 99, 31,219,162, 69,177, 19,226,214,239,218,100,180, 48,225,114,137,224,161,137, 98,223,226, -117,200,243,107,205,178, 65,237, 96,141, 82, 3, 32,156,214,255,176,189,140, 44, 28,199,217,143, 85, 59, 88,177, 44, 78, 86, 48, - 87,251,212,143, 17, 44,157,171,168,141,171,200,162,245, 9,128,246, 0,126,201,201,201, 89, 53,118,236,216,101, 59,118,236,240, -210,104, 52,200,201,201, 65,110,110, 46,132, 66, 33,148, 74, 37,214,173, 91,103,204,201,201, 89,229,120, 14,202, 71,144, 7, 0, -147,191,191,255,111,219,183,111, 15,254,250,235,175,133, 49, 49, 49,105, 3, 6, 12,104,186,110,221,186, 20,177, 88,204, 49, 12, - 67,152,205,102,226,237,183,223,142, 88,177, 98, 69,170, 64, 32, 80,140, 24, 49,130,240,240,240,248, 5,149,132, 13, 80,171,213, -167,190,255,254,251,161,211,167, 79,151, 90, 44, 22,151,150, 44,251, 54,149, 74,133, 75,151, 46, 89, 10, 11, 11, 79, 86, 97,197, - 56,245,195,177,163, 93,255, 51,114,164,152,210,106, 64,105, 53,160, 53, 26, 48,218, 34, 16, 58, 13, 68, 12, 13,185,152, 69,112, -152, 12,180,209, 19, 71,127,253,131, 50,155,205,149, 6, 54,212,104, 52,167, 46,198,199,119,111, 95,175,158,240,210,180,105,176, - 82, 20, 94, 73, 74, 42, 21, 87, 86,171, 21, 7, 91,182, 4, 67, 16,104, 61,113, 34,238,209, 52,173,209,104, 78,253, 47, 62, 12, - 55,110,220,200, 29, 61,122,244, 53,150,101,219,226, 9,125, 52,243, 73,128,162,168,114,214, 40,134, 97, 74,172,142, 37,150, 3, -201,209,163, 71,187, 38, 38, 38,138,255,252,243, 79, 92,184,112,161,245,142, 29, 59, 62, 9, 15, 15,111,249,240,225,195,236,170, -196,155,171,160,191,176,249, 31,238,222,185, 7,239,188,243, 14,145,157,157,141,239,190,251, 14, 85, 5, 79,253, 59, 16, 19, 99, - 98,227,227,101,117,225,228,247,228, 34,164,194,239,112, 51,164, 66, 69,156,166,152, 18, 43,153, 44,190, 36,216,168, 41,166,100, - 56, 80, 22, 95,165,165, 12, 49,166, 24,141,205, 33, 62,171, 22, 56,245,160, 25,185,229,220, 78,221,128, 99, 15,181, 87,178,140, -243, 1,156,128,137,225,238, 93,231,110,188,244,146,143, 63, 0,152, 77, 76,112,227,198,141,187, 9,133, 66, 9, 0,120,122,122, -190,228,231,231,183, 46, 63, 63,191,179,171, 50,141,142,142,238, 16, 24, 24,216,230,248,241,227,127,100,101,101,221, 2,240,179, -243, 65, 17, 17, 17,115,110,223,190,221, 78, 36, 18, 17, 85,212, 17, 0, 64,183,110,221, 94,144, 74,165,126,199,238,122, 67, 35, -110, 4, 78, 80, 12, 8,101, 96, 84,173,144, 38,110,142,176,176,171,126,133,133,133,173,139,139,139,255,168,102,209,247, 24, 58, -116,232,150,248,248,248,176,110,221,186,113,215,175, 95, 39,157, 71, 17, 34, 34, 34,250, 92,185,114,165,237, 91,111,189,181, 97, -215,174, 93,147, 81,118,166,109, 85, 72,179,197, 27,172, 53,156, 74,198,105,128,169,103,179,153,241, 10,229, 31,128,234,132, 92, -120,140,240, 12,143,149,196, 10, 13, 24, 21,108,111,111,139,137,213,158,162,168,223,111,220,184,113,112,196,136, 17,186,252,252, -124,248,249,249,161,126,253,250, 32, 8, 2,235,214,173, 51, 62,120,240, 96,159, 45,150, 86,251,204,204,204, 65, 54,177,229, 10, -218,213,171, 87,239,218,182,109,155,234,218,181,107, 2,154,166,149, 77,155, 54, 53, 92,190,124,217, 83, 36, 18,113, 98,177,152, -189,118,237,154, 34, 34, 34,194, 68, 16,132,244,199, 31,127,204,191,122,245,106,248,140, 25, 51,190, 65,217,105,226,206,216,185, - 96,193,130,140,148,148, 20,152,205,102,104, 52, 26, 20, 23, 23,151, 46, 69, 69, 69, 40, 46, 46,134, 72, 36, 66,118,118, 54,246, -239,223,159,101,139, 18, 95,153,101, 99,237,154,117,235,213, 89, 15,211,160, 84,200, 65,107,138,192, 20,231, 3,218, 98, 72, 40, - 43, 60, 68, 12,234, 54,146, 67,166, 80, 34, 71,163, 67,252,229, 95,179,109, 81,226, 43, 54, 23, 88, 44,107,223, 93,177, 34,135, - 22,139, 81,111,248,112, 88,109, 67,133,142, 66,139, 33, 8,132,247,234, 5,210,219, 27, 11,247,237,203,177, 69,137,127,162, 96, - 89, 86, 96,177, 88, 42,203, 7, 88,150, 77, 79, 76, 76,220, 5,224, 44, 65, 16, 28, 65, 16, 28, 74,130,181,233,158,229, 7,153, -162, 40,204,157, 59, 23, 98,177, 24,115,231,206,197,167,159,126,138,101,203,150, 97,253,250,245,248,246,219,111,113,244,232,209, - 6, 23, 47, 94, 20,159, 63,127,158,139,139,139,203,139,136,136, 16, 76,156, 56, 81, 37,151,203, 63,168,140, 51, 54, 54, 22, 94, - 94, 94,136,141,141,197,146, 37, 75,176,121,243,102, 28, 60,120, 16,151, 46, 93,130, 64, 32, 96,211,211, 31,193,100, 50,113,171, - 87,175,206, 56,120,240,160,113,213,170, 85, 16, 10,133,196, 83,106, 36, 62,176, 9, 42, 71, 75,144,115, 72,133,124, 0, 43, 81, -181,111, 84, 69,156,144,197,199,215,181,137,163,100, 7, 65,116, 24,192,116, 84, 62,189,218,206, 49, 25, 64,112, 45,112,206,150, -143,254,191, 68,213,166, 59,247,175,100, 25,103, 3,248,193,158, 39,165, 82, 41, 63,112,224,123, 33, 0,236,219,187, 95,148,148, -148,228,253,253,247,223,203, 2, 3, 3,241,237,183,223,202,228,114,121, 96, 5,156,204,193,131, 7,205, 18,137,196,111,194,132, - 9,253,218,181,107,247,190,173, 35,218, 11, 64, 11,148,204, 94,140,186,127,255,126,130,191,191,255,221,147, 39, 79,234,221, 41, - 32,173, 86,251,205,214,173, 91,235, 23, 48,190, 56,166, 31,138,120,118, 41,142,170,182, 32,173,222,167, 80,212,121, 25,175,191, -254,122, 29,134, 97, 54, 85,179,220, 95, 31, 50,100,200,214,248,248,248,176, 9, 19, 38,100, 95,191,126, 61, 7, 64, 60,128,237, -142,203,237,219,183,243,198,142, 29,155,181,105,211,166,144, 17, 35, 70,172, 7, 48,140,127,245,243,224, 81,182, 47,132,170,102, - 29,186,120,225,150,254,207,205,205, 93, 93, 88, 88,120,233,222,189,123,239, 89, 44,150, 16,130, 32, 56,177, 88,156,157,147,147, -179,202, 33, 96,169, 43,191,146,222,176,197,218, 32, 8,130,226, 56, 46,189, 71,143, 30, 31,244,234,213,235,171, 35, 71,142,152, -186,119,239,142,189,123,247,250,247,232,209,195,192,178, 44,119,236,216, 49,255,190,125,251, 26,206,158, 61,171,127,251,237,183, -155, 54,105,210,100, 98,108,108,172,154, 32, 8,214, 21,167,253, 93, 86, 84, 84, 52,164, 95,191,126,151,246,237,219,167, 84,169, - 84,160,105, 26, 6,131, 1, 6,131, 1, 28,199,193,219,219, 27,106,181, 26,243,231,207,215, 20, 23, 23, 15,118, 33,220,156, 57, - 77, 38,147,105,216,228,247,167,159, 90,245,249, 92,175,240, 6, 13,144,127,199, 4,218,100,128,136, 35, 81,247, 5,111,136, 37, -114,220, 75,210,226,163, 93, 7,180, 70,147,233, 53, 23,189,229,114,156,197,197,197,195, 98, 62,253,244,244,134, 25, 51, 60,219, - 4, 5, 65, 32, 16,192,108, 54,131, 97, 24,136, 68, 34, 68,198,196, 64, 28, 16,128, 57,187,118,233, 53, 26,205, 48,148,255, 20, -143, 51,103,109,192,145,115,242,141, 27, 55,198, 54,107,214, 12,147, 38, 77,194,144, 33, 67,202, 28,248,253,247,223, 99,253,250, -245, 48,155,205, 99, 1, 92, 7,176, 14, 37, 67, 29,112, 18, 89,127,119, 58,107,157,147, 97,152,194,164,164, 36,229,210,165, 75, - 9,171,213,138,207, 63,255, 28,118,193,105,175,215, 83,166, 76,169,227,229,229,133,207, 62,251,204,146,151,151,215,115,201,146, - 37,103,182,111,223,238,255,205, 55,223,188, 14, 32,214,153,147,101,217,220,155, 55,111,122,109,216,176,129,164,105, 26,203,151, - 47, 47, 55, 60, 57,126,252,120, 88,173, 20, 4, 2,161,197,100, 50,183,144,203,229,201,126,126,126,114,174,172,115,215,147,188, -159,161, 40, 9, 97,224,232,248,110,113,244,207, 66,197, 33, 21,170,195,169,150,197,199,119, 55,197,196,156,181, 9,162, 68,219, - 49,123,237, 38,253,106,112,218, 5, 97, 77, 56, 79,217,150, 42, 97, 50,153,160, 86,171,145,151,151, 7,149, 74, 5,129, 64, 64, - 84,148, 78,179,217,252,231, 71, 31,125,116, 99,211,166, 77,189,175, 92,185, 50,240,252,249,243, 61, 78,159, 62,109, 74, 75, 75, -163, 41,138,226, 66, 66, 66,132,157, 59,119,150,245,239,223,223, 67, 42,149,146,179,103,207,206,251,226,139, 47,252, 81,214,135, -205, 57,239, 2,130, 32,240, 97, 87, 45, 98,123, 8, 96,177, 88, 81, 84, 84,132,140,140,116, 36, 36, 36,224,202,149, 59,224, 56, -142,172, 70,185,251, 1,152,253,221,119,223,133, 74, 36, 18, 98,215,174, 93,117,118,237,218, 85,165, 37,117,199,142, 29,117,118, -239,222, 61,207, 54,122,145,254, 44, 62,239, 60,231,255, 44,231,179, 12,231,200,240,168, 82,104,217,218,249,246,176,125,148,148, -162,168, 95, 92,132,112,248, 4,192, 92, 7, 43, 88, 85,230, 60, 13,199,113, 23,122,247,238, 61,165, 87,175, 94, 43,250,244,233, -147,149,149,149,213,112,249,242,229, 97, 52, 77, 91, 19, 18, 18,200,228,228,228,180,223,126,251,173, 81,147, 38, 77, 38,222,190, -125,251, 28, 65, 16, 86, 55, 50,152,144,156,156,220,169, 71,143, 30,251, 39, 78,156, 24,222,161, 67, 7,137, 74,165,130, 80, 40, - 68, 74, 74, 10,254,248,227, 15,203,238,221,187,211,139,138,138,170,243, 9,158, 95, 82, 51, 50,162, 70, 76,125,111,223,196, 33, - 3,253,255,213,244, 5, 73, 72, 72, 8, 96, 52,226,206,195,108, 92,189,243,135,117,243,133,171,106,179,217, 60, 12,238,127,130, -231,151,223,238,221,235,221,115,198,140,125,243,254,243,159, 32,100,101, 9, 67, 66, 66, 32,145, 72,240,224,193, 3, 36,179, 44, -189,120,227,198, 28,155,200,122,210, 81,225,165, 0,150,178, 44, 43, 4, 0,185, 92,142,119,223,125, 23,142,159,220, 89,191,126, - 61,140, 70, 35, 0, 8, 9,130, 88, 10, 96,203,179,110,197,178,163,160,160, 96,206, 43,175,188, 18, 39, 20, 10, 43,140,122,235, -227,227, 3,173, 86, 11,154,166,153,140,140,140, 59, 62, 62, 62, 16,137, 68,224, 56,206,229,115,148,159,159, 63,103,216,176, 97, - 11, 72,146,172,200,242, 1,165, 82,153,118,230,204,153,198,111,189,245, 22,249,223,255,254, 55,101,194,132, 9,210, 51,103,206, - 48, 28,199,237,127,210,247,160, 75,151,157,192,134,152,215, 0,188, 6,148,115,120,207,176,109,171, 86, 72,133, 46, 93,118, 98, - 3,254,226,116, 28,198,179, 11, 34,155, 21,170,185, 44, 62,126, 5, 74,252, 44, 42,229,238,178,179, 11, 54,196,160, 86, 57,221, -129,163,246,213,235,245, 96, 24,166, 50,107,222,239,123,247,238, 93,241,219,111,191, 5, 76,153, 50,165,225,127,254,243, 31,101, -143, 30, 61, 60, 29, 15, 48, 26,141,236,225,195,135,245,235,215,175, 47,190,112,225, 66,234,248,241,227, 59, 84,150,206,135, 15, - 31, 30, 93,184,112,161,119,255,254,253,155, 0, 40,245,207, 82,171,213, 72, 75, 75,195,159,127,254,153,102,181, 90, 15, 85, 35, - 75,249, 0,230,141, 26, 53,106,233,182,109,219,234, 76,152, 48, 33,123,247,238,221,127,162, 36, 96,177, 51, 84, 67,134, 12,105, -185,109,219,182,144, 9, 19, 38,100,163,196,143, 44, 29, 60,120,240,176,163, 59,202,251,105, 85, 58, 50,177,213, 98,177,112, 38, -147,137, 51, 24, 12,156, 78,167,227,224,250, 43,240, 7, 51, 51, 51,185,244,244,116,238,225,195,135, 92,106,106, 42, 7,224, 91, - 39,197,235,170,193,242,216,177, 99, 71,163,208,208,208,207, 21, 10,197, 9,129, 64,160, 17, 8, 4, 26,169, 84,250,131,159,159, -223,167,139, 23, 47, 14,229, 56, 78, 92,137,138,174, 8, 66,145, 72,244, 86, 96, 96,224, 65, 95, 95,223,116, 31, 31,159,244,192, -192,192,131, 34,145,232, 29, 0,162, 42,148,121, 69,144, 9,133,194,143, 60, 60, 60, 78, 73,165,210, 92,169, 84,154,235,225,225, -113, 74, 40, 20,126,132,202, 3,169, 86,202, 41,145, 72, 62, 10, 8, 8, 56,165, 84, 42,115,149, 74,101,110, 64, 64,192, 41,137, - 68,242, 56,156,143,211, 43,177, 11, 45, 3,103, 3, 65, 16, 84,235,214,173, 55,180,109,219,118, 93,219,182,109,215,181,106,213, -234,107,155, 85,146,179, 89, 91, 12,168, 56,120,227,223,153,206,167,198, 25, 25, 25,185,125,219,182,109,236,156, 57,115, 52, 77, -154, 52, 41,152, 51,103,142,102,219,182,109,108,100,100,228,246,154,114, 6, 5, 5,213,139,140,140, 44,216,180,105, 19,157,148, -148,196,109,218,180,137,142,140,140, 44,112,138, 12,255, 36,242, 78, 0,136,176, 89,127, 14, 1,216,131, 18,231,247, 80, 0, 68, -140, 41,134,179,205, 62, 60, 1,160, 79, 5,101,239, 46,103,152, 41, 38,134,179,249, 84,157, 4,144,232,176,222, 13,101,253,191, -158, 4,167, 75,180,104,209,226, 30,231, 0,139,197,194,169,213,106, 46, 41, 41,137,187,112,225, 2, 23, 22, 22,118,207, 13, 78, - 63, 0,111, 3, 56, 28, 28, 28,124,187, 99,199,142, 15, 59,117,234,244,176, 94,189,122, 41, 34,145,232, 10, 74, 34,188, 71,218, -150,165, 0,154, 84,193,217, 81,165, 82, 45, 12, 11, 11, 59,212,184,113,227, 75,245,235,215,191,226,235,235,123, 68, 38,147, 45, -194, 95,145,177,171, 91,231,123, 12, 29, 58, 52, 77,167,211, 49, 47,189,244,210,109, 87, 39, 53,107,214,236,162, 78,167, 99, 70, -142, 28,153, 14, 32,250,159,240,188,243,156, 79,133,243, 31,133,198, 54,193,116,208, 97,249,196,197,113,159, 56, 29,179,213,118, -110,149, 5,193,113,156,128,227, 56, 15,142,227,188, 57,142,243,229, 56, 78,197,113,156, 39,199,113,210, 42,204,223,124,197,254, -251, 56, 39,219, 4,148,193,246,223, 25, 85,237,127,174,239,103,104,104,168, 79,187,118,237,166, 30, 56,112,224,163,251,247,239, -127,116,224,192,129,143,218,181,107, 55, 53, 52, 52,212,231,113,210, 25, 20, 20, 84,175,121,243,230, 95, 53,107,214, 44,189,121, -243,230, 95, 57,137,172, 39,153,119,137, 77,196, 52,179, 45, 13,109,219, 8,148,196,194, 90,107, 19, 54, 17, 21,244,212,170,195, -105,231, 59, 4,160,175,109, 57,100,219, 22,246, 20, 56,203,161, 65,131, 6,199, 91,182,108,121,175, 85,171, 86,201,173, 90,181, -186,215,162, 69,139,123, 77,155, 54,189, 23, 17, 17,113,175,110,221,186,247,252,253,253,143,215,160,140,124, 1,132,160,252,103, -192,158,118,157,239, 30, 25, 25,121, 85, 38,147,185,140, 13, 38, 20, 10,231,181,106,213,234, 38, 74,102, 74,242,237, 39,207,201, - 11,173,255, 33,240,149,240,217,227,148,162,242,207,140, 84,181,159,191,159,207, 54,167,203,111,117,217,132, 76, 67,155,192,145, -212, 2,167, 35,159,189, 78, 69, 56,136,166,167,193,201,215, 37,158,147,231,228,133, 86,173, 67,200,223, 2, 30, 78, 48, 63,230, -126, 30,207,197,104, 60,126, 0, 0, 32, 0, 73, 68, 65, 84, 54,170, 19, 19,235,113, 56, 93,241,221,127,202,156, 60,120,240,224, - 81, 91,109,103,119, 0,231,236,189,194,138, 84,105,117,102, 19,212, 68,217,158,230, 57,121, 78,158,147,231,228, 57,121, 78,158, -243, 31,199,105,199,138, 10,182,223,113, 90,255,250, 25, 21, 94, 79, 36, 76, 15,111, 86,229, 57,121, 78,158,147,231,228, 57,121, - 78,158,179,166,152,248,140,138,172,110,246, 21,126,232,144, 7, 15, 30, 60,120,240,224,193,163,246, 80,117, 28,173, 61,123,246, - 8,236,255, 71,141, 26, 53,158, 97,152,169,246,117,129, 64,176,230,187,239,190,219, 82,217, 21,134, 15, 31,206, 84,198,233, 10, - 85, 93,199, 21,103,139, 38,202, 73,126,222,138,247,138,138, 13, 43, 83, 50,153, 11, 38,147,169,185,125,159, 76, 38, 75,220,178, -101,203,221,218, 78,231,248,241,227,155, 56, 95,167,126,152,168,187,175,151,236,221,130, 34,221,242, 91,247,116, 95,243,117,236, -169,192, 31, 64,180,151, 76, 60,168,133, 74,220,241,207,124,211,101,189,149, 57,140,146,217,176,133,207, 99,134,131,131,131,155, - 42,149,202, 49, 0, 90, 24, 12,134, 64,133, 66,145, 11, 32, 65,163,209,108,207,206,206,190,227, 46, 79,183,250, 72, 3, 16,110, - 91,125,120, 46, 21,245,220,217, 87, 21,250, 68,192,196, 1, 82,130,128,245,100,242, 95,206,232,125, 27,193,196,114,229,183,247, -105, 4, 11,199, 65, 76, 0,230,147,247, 33,123,142,138, 74, 9, 32, 10, 37, 33, 28,110,160, 36,252,132,129,127,100,121,240,120, -174,224, 60, 84, 88,186, 46,172, 64, 76,116, 21, 11,137,175, 56,112, 42,128,243, 51,155,205, 34,137, 68, 2,139,197, 2,133, 66, -190,246,237, 9,227, 63, 7,137, 34,138,198,187, 91,182,108,169,241,151,174,171,115, 29, 0, 63, 57,159,239,163,148, 47, 56,123, -248, 99,159,174, 3, 22, 47,178, 60,200,139,213,106,181,164, 84, 42,133,217,108,134,183,183,119,167, 73, 19, 39,190, 68,138, 56, -139, 88,236,113,121,197,138, 21,217, 53, 77,231, 7, 31,124, 16,108,181,154,254,205,178,172,196, 98,177, 72,157,175,227,173,240, - 88,124,246,240,199,138,110,209,139, 62, 7,120,161,245, 20, 32,169,231,227,113,110,229,168,238,205, 58,182,104, 12, 54,225, 60, - 76, 22,235,160,179,233,186, 65,159, 94,201,156,158,174,179,182, 69, 45, 4,172,252, 31,130,160, 97,195,134, 83, 2, 2, 2, 70, -110,220,184, 81,220,176, 97, 67,200,100, 50, 24,141,198,144,251,247,239,135, 76,154, 52,169,155, 92, 46,223,149,146,146,178, 22, -238,125, 8, 46,252,236,214,255, 3, 0,116, 26, 51, 63, 28, 37, 31,139, 54, 56,239,235, 62,110,126, 56,128, 25, 40,251, 97,228, - 44,148,132, 80,112,213,234, 72,142,108, 91,134, 65, 99, 63, 18, 2,152, 84,154,120, 18,248,225,219, 85,232, 55,234,189, 50,219, - 9, 14,194,195,219,150, 33,122,236, 71, 21,126, 71,177,111, 99,130, 98, 89,174, 66, 75, 60, 73, 18,244,137,123,156,171, 15, 12, -231,160, 36, 6, 88, 57, 74,148,124,208,217,229,241, 3,154, 10,114,172, 20,227, 50,224,172, 88, 36,200, 61,122,135, 41,119,110, - 76, 27, 80, 20, 83,210,182,138,133, 96, 14,166,120,159,157, 61,123,182, 48, 58, 58, 26,155, 55,111,238,252,245,215, 95, 79,212, -106,181, 63,218,238, 91, 50,255,248,242,224,241, 92, 11, 46,215, 66, 75, 40,192,134, 67,251,182, 52,202,201,205, 67,204, 91, 31, - 98,231,206,157, 40, 44, 44,132,143,143, 15, 36, 98,177,104,229,210,255, 11, 86, 42, 61,130, 99, 38,198,110, 0,208,180,166,169, -169,230,117, 26, 59,159, 79,216, 62,165, 35, 20,144, 34,137, 68, 66,238,218,181, 11, 69, 69, 69, 80,169, 84,144, 72, 68,228,138, - 69,159,200,149, 74, 79,249,155,147,103,118, 70, 73,252,159, 26,193, 98,209,117, 62,176,115,139, 82,173, 86, 99,220, 59,177,112, -190,142, 88, 44,102,236, 47, 22,190,142, 61, 21,204,222,248,238,216,102, 47,122, 1,214, 91,151, 32, 18, 8,160,240,246, 65,148, - 80, 0, 1,129,230, 49, 39, 82,103, 1,248,244,121,201,108,195,134, 13,167, 12, 31, 62,124,228,130, 5, 11,196, 36, 89, 18,114, - 78,175,215,195,104, 52, 34, 52, 52, 20,103,207,158, 21,207,153, 51,103,228,247,223,127,143,148,148,148,213,213,229,191,117,235, - 86,253,240,240,112, 19, 0, 12,108,233,229,188,175,158,125, 31, 0,120,121,121, 85,201,231,167,242, 48,223,186,117,181,133,253, -188, 41,189, 66,153, 10,182,155, 0, 40, 42,227, 98, 89, 78,120,242,171, 73, 21,238,127,107,193, 14,250,198,158, 11, 77, 27, 54, -108,104,116,220,238,233,233, 89,209, 41, 65, 58,157, 46,220,121,163,253,120, 43,197, 4, 86,116,189, 62,239,174,119, 41,192, 40, - 6,194, 29, 59,118, 0, 0,190,252,104,180, 96,211,207,121, 66,161,176,164,169, 93,186,116, 41,230,205,155, 39, 57,113,226, 68, -255,109,219,182,245, 63,120,240,224,202,138,132, 42, 15, 30, 60,158, 73,145,229,248, 91,177,208, 34, 9,194, 75,233,229,137,215, - 94,127, 27,199,143,255,128,174, 93,187,150,238,107,208,160, 1,134, 15, 27,140,239,182,174, 0, 0,175,199, 73,209,227, 94,167, -176, 88,255,105,191,145, 95,205,127,152,173,187,114,228,200, 17,116,233,210,165,204,249,175,143,120, 13,223,126,179, 20,149, 68, -153,119, 11, 4, 71,138,189,148, 30, 24, 21,243, 14, 92, 93,103,226,184, 33, 71,250, 14, 95,213, 59, 39, 95,191,130,175,103, 79, - 30,141,130,253,250,180,108,214, 20,133,251,215,226,143, 34, 19,142,103,154,240,102,212,191, 16,233, 43, 71, 23,154, 65,176,135, -168,103,182,158,122, 46,132, 86,112,112,112,211,128,128,128, 50, 34, 75,171,213, 66,167,211, 65,163,209, 64,171,213,130, 36, 73, -196,198,198,138,207,157, 59, 55, 50, 56, 56,248,180, 27,195,136, 15,109,150, 44, 64, 32,210,205,157, 59,215, 28, 24, 24,104, 86, - 40, 20,156, 80, 44,213,118, 31, 55,223, 11, 0, 72,161, 88,187,114,229, 74, 75,104,104,168, 73, 40, 20, 74,222,123,239, 61,210, -157, 52,155,205,102,206,145,211, 98, 49,151,110, 95,188,120,177, 37, 40, 40,200,172, 80, 40, 56,171,213,125,163,227,205, 7, 5, -144,138, 5,144,138, 5,144, 73, 68,240,170,223, 14,210,194, 63, 65,211, 52,150, 44, 89, 98, 13, 14, 14,182, 40, 20, 10, 78, 34, -145,136,167, 77,155, 86,101, 58,199,143, 31,207,169, 84, 42,171, 66,161, 16,207,155, 55,175,220, 76,161, 51, 55, 50, 32,151,136, -160,144, 10,209,184, 65, 24,164,156,209,237,180, 10, 4,101,189, 17,164, 82, 41, 58,119,238,140, 22, 45, 90,224,224,193,131,221, -121,161,197,131,199,115,129, 10,103, 24, 10, 1,224,200,145, 35,221, 80,242, 65, 68, 68, 71, 71, 19, 37,103,112,152, 49,101, 24, -222, 28, 55, 10, 12,195,150,126,231,139, 32, 9, 76,126,163, 63, 88,214,157, 17,137,170,167,120,214,224, 58,165,156, 28, 65, 10, - 0,160, 81,189, 16,110,226,155,255, 1,195,178,127, 13,148, 8,128,183,199,245, 43,217, 86, 11,233, 20,128,193,135,147, 94,133, -171,235, 52,109, 84,135,164,173, 38, 16,101, 63,246,248,119,124,108,147,231,116,129, 22,117, 67, 34, 40,163, 17, 38, 19,133,248, - 59, 5,198, 83, 25,250, 64, 82,149,170, 94,245, 90, 7,153, 64,157,137,122, 94,146,198,217,122,234,185,200,187, 82,169, 28,179, -113,227,198,114, 34, 43, 39, 39,135,212,233,116,176, 90,173,172, 86,171, 5,195, 48,152, 57,115,166,104,206,156, 57, 99,178,179, -179,231,217, 53,143, 43, 78,155,223,213,140, 91,183,110,213,155, 61,123,182,181,103,207,158, 15, 27, 52,104,160, 23, 8, 4, 8, - 9, 9, 89, 21, 21, 21,229,187, 96,193, 2,107,255,254,253, 83, 5, 2, 1, 26, 55,110,172,255,243,207, 63,235, 1,144,187,155, -119, 71,206, 45,103,214,112, 0, 64, 16, 4,162,162,162,210, 26, 55,110,172, 23, 8, 4,184,123,120, 49,231,238,253, 20, 9, 73, - 52, 9,245,182, 53, 34, 4, 32,247, 44,245,196,139,138,138, 74,111,218,180,169,142, 36, 73,220,188,121, 51, 12,229, 63,107, 85, -142, 83, 46,151, 83,175,191,254,250,195, 59,119,238,184, 58, 30, 66, 1,137, 14, 77,109, 6,172,208,182, 64,250,197, 10,211, 41, - 18,128,158, 51,101,180, 80, 37, 3,164, 94,254,102,141, 70, 3,165, 82, 89, 98, 33,179, 90,241,251,239,191,163, 99,199,142,221, -246,236,217,115,142,127,222,121, 78,158,243, 47,184,210, 34,207,160, 53,203,241, 67,247,101,124,180,206, 58,103,138, 97,104, 52, - 8, 15,194,226,255, 27, 15,134, 97,193, 48, 12,104,219, 47,195, 48,160,172,214, 90, 73,217,227, 92,199, 71, 41, 95,240,195,174, -119,125,122, 14, 89,218, 43,110,246,184, 83, 12, 3,176, 44, 5,138, 2, 24,150, 2,203, 48,160,168,218,113,205,161, 88, 22,245, -194,130, 17, 55,123, 28,156,175,179,253,187, 61, 3,207, 28,138, 85,116,141, 94,244,225,221, 52,195, 18, 94,216, 63, 89,200,196, - 82, 33, 39,148,193, 98,161,161,181,176, 22, 0,122, 19,197, 90, 57, 15,127, 25, 0, 8, 73,226,121,154, 93,219,162, 97,195,134, -101, 68,214,178,101,203,252,215,173, 91, 23, 10, 0,195,134, 13,203,232,213,171, 87, 94, 82, 82, 18, 66, 66, 66,136,188,188,188, - 1, 0,222,179,157, 59, 3,192,186, 10,120,245,225,225,225,166,128,128, 0,179, 93, 16,145, 36, 9,161, 80,136,240,240,112, 83, - 96, 96,160,185,113,227,198,122,177, 88, 12,146, 36, 97, 23,122,110,117,243, 8, 2, 2,129, 0,118, 78,103,107,143,157,179, 58, - 16, 9,201,242,205,155, 3, 39, 73,146, 46,175, 87, 97, 29,146,201, 56, 0, 21, 30, 47, 32, 29,154, 71, 97,229, 30, 2,241,191, - 67, 4,224, 44,199,113,184,126,253, 58, 82, 82, 82, 32, 22,139, 17, 28, 28,140,121,243,230,193,108, 46,209,187,195,135, 15,239, - 6,224, 38,255, 4,243,224, 81,138,179,207,160,192,114,182,106, 85,238,163,117,228,200,145,110,209,209,209,231,236, 2,168, 68, -236,184, 16, 63, 20, 13,138,178, 2, 28, 87, 43, 66,171,162,235, 48, 12, 91,233,117,236, 62, 90, 44,203, 9, 93,138, 44,150, 5, - 77, 81,181,114,247, 88,134, 2,203, 82,112,117, 29,130, 32, 25, 91,131, 47,230,159,147, 39,143,224,240,122, 36, 21,222, 0, 23, -104, 19, 66,253,164, 18,228, 25,209,240,133,102,130,223, 13, 20, 46,221, 72,132,191,167,242,185, 41, 23,131,193, 16, 40,147,201, -160,215,235, 75, 45, 89,235,214,173, 11,181, 88, 44, 36, 0, 8,133,162, 48, 53, 27, 42, 99, 88,192, 91,153,133,194,194, 98, 63, -142,227, 8,155,224, 89, 10, 96, 11, 42,137,238, 47, 22,139, 75, 5,138,163, 0,146, 74,165, 53, 18, 48,118,216,197,153, 88, 44, -118,185,221,121,120,173, 42,136, 29,133, 22,184, 18,171,150,147,216, 18, 8, 4,176,251, 70, 85, 5,137, 68, 82,154,119, 87, 16, - 10, 28,174, 39,168,190, 43,166,213,106,133, 78,167, 67, 81, 81, 17,100,178, 18,131, 25,199,113, 32, 8,226, 61, 0,239,243, 79, - 49, 15, 30,174,181,200, 51, 44,182, 92, 11, 45,148,152,236, 8, 0,160, 41,171, 75,241,179,231,240, 37, 60,204,214, 35,216,255, - 23,112,213,140,122, 58,114,228,200,173, 33, 33, 33, 29,236,235, 82,185,167,223,196,119, 63, 3, 77, 91,225, 37, 39,241,214,152, -126,101, 68, 86,137, 69,203, 82,225, 55, 65, 10,139,245,159,246, 27,190,122,190,183,210,239,138,179,248,137,139,191,246, 90,161, -198, 28, 70,146,191,162,144, 8, 97,134,191,253,217,120,135,198,253,198,174,245,115,167,187,109, 15, 36, 72,209,107,147, 86, 77, -228,132,158,205, 21,164,246,252,199,227,254,117,192, 81,204,249,250,250, 30,233,243,218,202,222, 57, 5,188,143,214,211,128,151, -183,138, 12,123,185, 59, 94,126,239, 43,156,249,228, 99, 14, 40,132, 95, 72, 40,217, 99,202, 23,240,124,121, 32,174,190, 53,134, - 5, 10,158,139,188, 42, 20,138, 92,131,193, 16, 98, 52, 26,161,209,104,160,209,104,202, 10, 2,145,136,152,248,206, 84,127,145, - 88, 2,202,106,193,241,237, 95, 84,201,105, 15,225, 48,176,165, 23, 4, 34,137, 54,161, 97,195, 85, 66,161, 16, 36, 73,226,240, -218,143,223,219,191,252, 93, 47, 0,184,113,100,173,102, 84,236,154,213, 36, 73,194,108, 54, 75,171,147,238, 71,143, 30,133,153, -205,102,147, 77,160,217,133, 31, 30, 60,120, 80,215,108, 54, 27, 29,183,187, 3,185,194, 11, 80, 53, 0, 20,129,229,172,103,169, -169,169,117, 40,138, 50, 8,133, 66, 88, 44, 22,183, 84, 17, 73,146,226,155, 55,111,134,177, 44,235,242,248, 22, 17,117,128,224, -150,128,196,219,237, 60,115,110,116, 68,109, 98,235,137, 69,144,230,193,227, 89,177,108, 61,131,207, 4, 81,193,255, 82,161,213, -253,200,145, 35,156, 99, 15,145,166, 40,155,200,250, 75,244, 48, 12,139, 76,181, 9, 73, 73,119,177,114,229, 74, 92,186,250,145, -247,130, 5, 11,164,115,230,204, 49,143, 28, 57,114, 57,203,178,173, 72,146,188,129,191,134, 42,202, 90,133, 88,182,238,181,107, -215, 26,218,215, 41,138,130,151,151, 23,188,188,188,208,180,113, 88, 57,145,197, 48, 12,172,149, 12, 29,218,125,180, 8,142,229, - 40,138, 1,195,178,165,226,167, 80, 99, 14, 59,116,250,122, 35,135,195, 95,176,255,233,220,174,121,197, 98,112,210,188,210,124, -236, 90, 63,119,250,130,205,155,165,133, 76,192,180, 81,175,189, 25, 57,124,212, 24,188,254,234, 43,221,204, 22,203, 65, 1,201, -177, 84,233,245, 64,130,131,179,143, 22,143, 39,132,228, 34, 61, 37,146,202,225, 25, 92, 31,119,117,140, 88, 32, 16,252,114,191, -200, 32, 38, 5, 66,144, 66, 49, 18, 10, 77,212,115,148,221,132,228,228,228,144,186,117,235, 66,163,209,128,166,105,118,216,176, - 97, 25, 66,161, 40, 76, 40, 18, 17,209,163,166,178,217,217,153, 20, 73, 10,192,113, 12, 94, 25, 62,137,144,202,228, 98,171,197, - 66,163,100,232,208,149, 53,203, 49,132,131, 87, 84, 84,148,175,125, 38,224,254,229,239,122, 57,236, 83,190,244,210, 75,190,142, -179, 14,221,180, 22, 17, 35, 71,142,148,135,135,135, 19, 0,240,235,246,217,118,235, 25, 49,112,224, 64, 89,120,120,137, 31,254, -143,107,223,117,155,211, 95,193, 1,197, 15,128,226,212,114,150,172,129, 3, 7, 74, 27, 54,108, 88,173,103,209,230, 0, 95, 97, -236, 46, 15, 33, 13,100, 95,119,139, 43,166, 13,168, 80, 79, 8,151,191, 66, 66,226,233,103,238,240,241,137,159,121,177,197,131, -135, 91,112,210, 34,207, 20,186,217, 4, 98,119,219,111,169,224, 18, 2,128,205, 68, 71, 56,232, 44, 80,180,181,156,200, 98, 24, - 6, 34,194,140,149, 43, 87,226,253,247,223, 7, 0,241,244,233,211, 15, 44, 88,176, 96, 40,203,178,173, 56,142,235, 66, 16, 68, -101,189,198,179, 33, 33, 33, 57, 28,199,137, 72,146,236,178,118,237, 90,223,254,253,251,195,203,203, 11, 28,203,149, 19, 89, 12, -195,194,106,181, 84,248,153, 91, 31,165,124,193, 15,123,166,249,244, 28,188,180, 23,195,178,167,236, 34,139,101, 24,128, 45, 57, - 41, 63, 55, 3, 39,143, 31,196,134,245, 27, 10, 65,112,183,193,129,181,137, 65, 84, 32, 6, 91, 93,252, 53,177, 75,231,118,205, -177, 96,243,102,233,173,107, 89, 7,166,126, 48, 43,114,248,168, 49,216,243,221,118,144,116,209,117, 71,145,197, 80, 44,138, 11, -243, 6,254,196,251,104, 61, 45,248,158, 60,117,138, 24, 51,102, 12,171,213,106, 33,150, 72, 88,138,162, 4,255,254,247,191,153, -247,223,127,159,204,206,206,134, 70,171, 19, 2,240,197,115, 96,214,210,104, 52,219, 39, 77,154,212,237,252,249,243, 98,146, 36, -161,209,104,208,163, 71,143, 60, 53, 27, 42,155,248,206, 84,255,204,204, 12, 90, 41, 23,154,197, 98, 17,114,115,115,217,110,253, - 71, 27, 71,141,127,191,206,251,179,227, 54,102, 93, 94,191,206,157,107, 56,206, 4,116,222,183,105,211, 38, 75,104,104,168, 73, - 42,149, 74,198,141, 27,231,214,248,161,197, 98,225, 22, 47, 94,108,118,158, 93,104,177, 88,184,149, 43, 87, 90,194,194,194,204, -114,185,156,163,168,170,253, 62, 73,146,160,223, 90,176,131,166,105,186,140, 21,203, 46,178, 40,150,208,125,245,213, 87,214,176, -176, 48,139, 66,161,224,164, 82,169,216,157,116, 78,157, 58,149,243,241,241,177,122,120,120,136, 99, 99, 99, 31,107,214, 33,197, - 64,184, 96,109,105,120, 7,169,151,151, 23,180, 90,109,105, 90, 67, 66, 66,120,177,197,131,135, 11,148,211, 34,207,166, 21,206, -189, 56, 90, 44,160,203,201,205, 11,244, 15,170, 15,154,166,109, 11, 5,154,162, 48,237,237, 81, 88,190,254, 43, 0,176,139,173, -168,233,211,167, 31, 0, 80,101, 99,182,107,215,174,249,211,167, 79, 87,230,228,228,156,216,186,117,171,239,232,209,163, 49, 99, -198, 12, 44, 93,186, 20, 34,137, 12,190, 1,117, 75,175, 99,191,110,158,186, 0, 28, 56, 93, 5,118, 58,107, 73, 35, 5,161, 95, - 64, 61, 80, 12, 5,150,162, 64, 81, 20, 8, 65, 73,214, 78, 30, 63,136,209,111, 76,133, 72,170,244, 89,179,114,137, 49,242,229, -144,161,115, 38, 76, 48,187, 97, 4, 36,111, 93,203, 58, 48,245,253,216, 40,187,200,218,183,125,253,237, 47,103, 14,222, 41,149, - 8, 75,175, 67,177, 44, 72, 82,192,251,104, 61, 37,145, 37,149, 74,247, 30, 59,118,236, 94,219,182,109, 9,189, 94, 15,138,162, -144,151,151,135, 3, 7, 14, 36,112, 28, 7, 31, 31, 31, 28, 59,118,140, 29, 61,122,244, 94,179,217,252,218,179, 46,182,178,179, -179,239,200,229,242, 93,179,102,205, 26, 53,115,230, 76, 17,203,178, 72, 74, 74, 2, 8,130, 19,137, 37, 32, 73, 18, 34,145, 16, -197,197, 26, 86,225,169,202,178,114, 2,133, 72, 44, 1, 41, 16, 87, 54, 77,248,161, 45, 24, 41, 72,161, 88,107,159, 9, 40, 22, -139,113,117,207, 50, 77,247,113,243,149, 0, 32,150,202, 11,251,244,233,147,214,188,121,115,253,111,191,253, 86, 15,229,103, 29, - 58, 63,159,244,144,113,177, 2,133, 92,166,143,138,138,122,104,231, 76, 61,181, 70, 51,102,242,108,130, 16, 72,244,209,209,209, -105,145,145,145,122,129, 64,128,196,131, 75, 52, 67,198,197,202,136, 74,130,172,158,184,199,189,117, 99,207,133,166, 95,124,241, - 5,213,191,127,255, 71,118,127,177,212,212,212, 58, 3, 6, 12,144,174, 88,177,130, 26, 48, 96, 64,250,139,255,207,222,117,199, - 53,113,254,225,231, 46,155,189, 71, 16, 68, 69, 81, 20,112,139, 11,197, 58,107, 29,173,226,194,189, 71,157,173,179, 14,220, 74, -221,168,117,214, 90,220, 84,171,162,214, 81, 23, 42, 46, 16, 7, 67, 69, 1, 25, 97, 67,128,144,157,187,223, 31, 36, 52, 32, 35, - 65, 91,107,127,121, 62,159,124,146,220,189,247,220,123,251,185,239,251, 29, 94, 94,197, 36, 73, 34, 50, 50,210,185, 58, 75,149, - 6, 70, 70, 70,138, 9, 19, 38,188,123,254,252,121,109,163, 14,171,133,139,139, 11, 40,138, 66,183,110,221, 32,145, 72, 12,150, - 45, 3, 12,248,111,162, 98, 30,173,170, 51,195, 43,148,138,111,167,204, 94,185, 19, 32, 76,181,238, 2,127, 25,150,104, 16,223, -127,255,157, 9, 0, 35,141,216,154, 59,119,110,141,101, 78,180, 68, 86,155,128,128, 0, 44, 94,188, 24,155, 55,111, 86,253,248, -227,143,140,248, 87,137,242,177,211, 87, 20, 84, 88, 15,104,208,197,148,130,250,182, 50,190,124,161,104,133,239, 87, 27, 86,166, -101,150,220, 25, 59,109,105,217,221, 75, 5,160,144,224,171, 0, 96,207, 79, 63,137, 88, 92,115,147, 33,195, 71, 1, 64,207,157, -219,130,206,172,193,129,154,197, 22, 77,120,124, 59,119,129,149, 70,100,237,218,186,246,185, 5,145, 25, 60,243,187, 24,133,246, -122, 0,192,218, 12,103,124,191,218,208, 59, 43, 79,180,221,112,158,253,115,224,112, 56,171,175, 95,191,110,226,237,237, 77,228, -230,230, 66,165, 42, 61, 34,114,185, 28, 66,161, 16, 69, 69, 69,144, 74,165,104,221,186, 53,185, 99,199, 14,147,153, 51,103,174, -150,201,100,211, 63,247,237,126,251,246,237,174,115,231,206,225,214,173, 91,195, 22, 45, 90,196,114,116,116, 36, 44, 44, 50, 9, -133, 92, 6,128,166,179,179,179, 41, 99, 83, 75,129,173,131,243,187,244,140, 44, 15,133, 92, 6, 74, 37,175,210,219, 92,157,222, -225,251, 23, 47, 94,212,219,180,105,147, 76, 59, 18,112,248,130,157, 59, 90,183,110,109, 29, 28, 28, 44,235,215,175, 95,178,198, -121, 93, 23,103,248, 43,111, 48,251,197,139,103,205, 42,114,250, 77,222,116, 80,195,169, 29,141,216,255,187,189, 7, 27, 53,106, -100,237,233,233,153, 92, 29,111,131, 6, 13,196,124, 62, 95,214,164, 73,147, 98, 22,139, 85,106,201, 82, 40, 74, 26, 52,104, 64, - 57, 56, 56,200,154, 54,109, 90,172,175,211,190,145,145, 17,173,177,138, 85, 6,125,162, 14, 89, 12, 40, 3, 2, 2,202, 50,195, -127,223,168,145, 96,212,168, 81,252,121,243,230,225,224,193,131,184,123,247,238,123, 98,191,107,215,174,184,125,251,246, 74,252, -135, 18,235, 26, 96,192,255, 25,170,207,163, 85, 17,135, 14,133,252, 9, 45,159,166,202,176,102,205, 26,174,218,146,213,115,206, -156, 57, 16,139,197, 86,149, 52,235, 1,117,174,141,202, 68, 86, 80, 80,208, 49,154,166,157, 1,116, 86,169,168, 7,251, 15, 28, -234, 86,213,250,134, 12, 25,242, 30, 39, 77,144, 12,146, 36,138, 57, 44,250,201, 79,251, 14, 30, 41,215,190,212,249,189, 49, 8, - 60,221,185, 45, 72, 12,160,103, 69,177,133,191,202,140,148,113,106, 48,117,218,212, 50,145,181,115, 91,208, 85,207, 54,117,191, - 89, 58,113,117,165,226,108,245,138, 41, 38, 36, 73,116,172,224,163,245, 30,231, 71,128,129,243, 47,116, 11, 8, 8,104,238,227, -227, 67,106,139, 44,153, 76, 86,150,184, 83,227, 44,158,150,150,134,174, 93,187,146,205,155, 55,247,122,248,240, 97, 55,252, 85, -206,233,115,221,118,213,219,183,111,119, 56, 58, 58, 94, 91,190,124,249,168,156,156,156,175,242,243, 11,108,194, 14,173, 70,159, - 33,211,136,174,125, 71,136,100, 52,147,151, 42,200,108,114,243,226, 81,235, 75, 39,118, 65, 46,147, 77, 1, 16,135,191,210, 59, - 84,228, 44,209,164,113,104,210,164,137, 72, 91,168,212,173, 91, 87,226,228,228, 36,245,244,244, 44,155, 94, 69, 52,223,123,219, -174, 47,167,218,255, 75, 84,211,254,212,136,182,138,105, 35,140,141,141,161, 17, 95,250,244, 83, 59,218,178,210, 27,101,205, 81, -135,101,156,234,244, 14,229,116, 90, 72, 72, 72,143,144,144,144, 54, 0,158,160,180,214,161, 2, 40, 29, 74,212,114,154, 15, 84, -127, 12,215,187,129,243,255,149,243,115, 70, 87,252,229,155, 5,148,250,106,221,170, 82,104,213, 4,141,227, 59, 0,114,238,220, -185,249, 98,177,216,106,212,168, 81,213, 46,147,145,145,113,240,240,225,195,229, 68,214,160, 65,131,198,133,134,134, 94,203,202, -202,170,213, 86, 89,153, 27,173,185,117,126,161, 85,215,126, 27,230, 0,248,177, 10, 67, 30,229,217,134,255,205,206,109, 65,103, - 42,136,173, 95, 1, 12,170, 74,149,246,250,114, 32,142, 30,218,169,241,237, 50,122,254, 56,237,210,176,168, 85,149, 70, 43, 90, -154,114, 87,169,251, 49,207,224,163,245,207,128,205,102,251, 45, 90,180,136, 45, 18,137,222, 19, 89, 21,133, 86, 97, 97, 33,158, - 62,125,138,177, 99,199,114,163,163,163,253,228,114,249,141,255,194, 62,200,200,200,136, 87, 39, 35,157,173, 73,225,192,229, 25, -177, 71,140,159,227, 92, 22,117,120, 98, 23,164, 18, 49, 0, 48,117, 73,239,192,100, 50,217,209,209,209,174, 26,171,149, 92, 46, -231,106,166, 63,126,252,216, 85,147, 91, 75, 34,145,232, 28,117,248,119,113, 62,123,246,204, 89, 19, 29,169,137, 46,100, 50,153, -236,200,200, 72,103, 13,167, 84, 42,213, 41,234,144,195,225,176,163,163,163,157, 85, 42,213, 71,139, 58,212, 22,198, 40,173,179, - 88,174,214,162,218,183,140, 32, 8,130, 54, 12, 27, 26, 96,192,103,143,138,145,146,213, 23,149,174, 9, 26,199,119, 61, 22, 97, -186,184,184,244, 26, 62,124,120, 57,145,229,239,239,175, 58,125,250,244, 77, 62,159,159, 73,146,100,188,190,253, 40,243,209,194, -123,111,144, 32, 73,242,105,231,182, 77, 65,146,228,211,165, 19, 39, 74,215,224, 64, 57,177,117,246,204,201,222,169,249, 49,149, - 75, 51, 0, 54,246,117, 16, 48,238, 91, 4,140,251,214, 10, 64, 39,160,234,104,197,234,250, 97,192,223, 3,130, 32, 56, 78, 78, - 78,207, 37, 18, 9, 8,130,128, 84, 42, 45, 19, 88, 69, 69, 69, 16, 10,133,101,255,229,114, 57,178,179,179, 81,183,110, 93, 16, - 4,241,159,246,163,147,203,229,202, 69, 43, 55, 29,102, 48,217, 74,138,146, 19,114,185,124,188, 62,215,249,162, 69,139, 72, 84, -226,123, 53,115,230,204, 74,167,127, 42,206, 37, 75,150, 84, 26, 37, 56,115,230,204,106,163, 7,171,194,119,223,125,247,209,162, - 14,117,191,125, 25, 96,128, 1,255, 49, 84, 26,186, 87, 43,161, 69,146,228,211, 74,162, 11, 9, 0, 52, 73,146, 79, 43,201,114, -160,124,247,238,221, 74, 75, 75,203, 41, 34,145,232,143, 65,131, 6,205,245,247,247, 87, 1,165, 14,242,181,221,162,124,161,104, -133, 95,255,141,243, 10,138,165,193, 21,231, 85,180, 60,105,196,214,174,237, 65,187,207,132, 30,247,207, 72, 79,221, 93,213,182, - 85, 37,168,170,138, 86, 20, 22,138, 87,250,245,223, 56, 39,191, 80,108,240,209,250,135,160, 82,169,174, 24, 25, 25, 17,154, 98, -202,218,214,171,194,194, 66,148,148,148, 64, 93,146, 6, 0, 80, 92, 92, 12, 11, 11, 11,168, 84, 42,250, 63,182, 43,164, 0,230, -171,173, 85, 0, 48, 63,241,230, 14,237,115,251,153,246,188,106,172, 89, 2, 93, 10, 68, 87,182, 92,117,243,254, 6,206,204,106, - 10, 68, 87,135, 76, 61,249, 50, 1,128,205, 98,100, 85, 85, 60,154,205, 98,100, 85,227,183,175,231,123, 3, 65, 3, 88,105,184, -178, 13, 48,224,243,125,255,255, 84, 43,238, 97,224, 52,112, 26, 56,255, 17, 78,174,250,163,235, 60,195,254, 52,112, 26, 56, 13, -156,255, 54,206,202, 48,249, 51, 17, 90,116, 37, 31, 0,181,180,104, 25, 96,128, 1,255, 58, 72,107, 57,207, 0, 3, 12, 48,192, -128, 15,199,123,197,164,181,103, 84,165, 74,245,137, 38,168,141,178,189,102,224, 52,112, 26, 56, 13,156, 6, 78, 3,167,129,243, -255,142,179, 38,110,237,229, 39, 3,216,247,153,136,173, 79, 18,208, 98, 48,171, 26, 56, 13,156, 6, 78, 3,167,129,211,192,105, -224,172, 45, 12, 67,135, 6, 24, 96,128, 1, 6, 24, 96,128, 1,255,231,208, 47, 97,169, 1,149,160,238,192,165,160,176, 68,189, - 59,131,144,114, 54,240,191,182,137,254,254,254, 12,125,218, 39, 38, 90,146, 81,224,111, 54, 55, 97,247, 47, 22, 41, 54, 83, 81, - 43,130,107, 58, 17,109, 27,180, 26,109,204, 51,158, 46,147,201,234,155,154,153,101,229,229,102,239,201,123,247,108,151, 86, 27, -243, 7, 15, 30,240,125,124,124,210, 1, 20,105,189, 41, 24, 96,128, 1, 31, 19,150, 77, 93, 64, 16,227, 1,250,175,176, 75,138, -142,129, 48,238, 80,185,118, 22, 30,227, 64, 18,205,180,166,136, 65, 99, 63, 10, 98, 83,106,120,224, 88, 38, 36, 36,184, 54,108, -216, 48, 25, 64, 65,197,181, 87, 50,207,112,157, 27,240, 57,163, 43,202, 39, 44, 45,187, 22, 62, 92,104, 53, 26, 84, 31, 74,114, - 12,104,140, 4,129,104, 36,134, 14,174, 21,143,219, 55,117, 64, 49,219, 1,104, 5,208,173, 76,140,120, 45,197, 50,121, 22, 69, -211,163,241,230,228, 19,189,249,234,251, 79, 67,213,229, 44, 86, 34, 49,244, 39,189,248, 40,250,135, 71,183, 79,115, 45,141, 9, - 52,108, 61,104, 1,202,103,112,174, 45, 56, 0,124, 73,146,108,102,108,108,204, 47, 41, 41,201,166, 40, 42, 5,165,227,211,249, -181,228, 36, 1, 76, 48, 53, 49,233,227,106,198,105,245, 46, 71,152, 86,164, 80,133,163, 52,161,107,254,199, 58,163, 74, 69,150, -227,190, 57, 35,124,198, 6,205,234, 1, 75,191,141, 11, 74,128,234,132, 22,225,220,184,227,217, 97,195,135,248,205,152, 60,214, -180,142,157, 41, 4, 57, 34,155,159, 14,134,108, 10, 9, 57,218,111,226,176,158,125, 0, 96,245,234,213, 95,187,184,184,212, 99, - 48, 24,137,203,150, 45,251,117,197,138, 21, 52, 81,117,165,114,190,250, 28,214,220,240, 77, 0,120, 2,104, 0,224, 45,128, 23, - 40,159,101,188, 54,248, 44, 56,235,212,169,227, 68, 81,212, 68, 7, 7,135,175, 50, 51, 51, 47,144, 36,121, 32, 45, 45, 45,253, - 83,222,117,104,154,222, 75, 16,196,100,154,166,247,233,241, 61, 69,159,117,240,120,188, 76,137, 68, 98,175,254,157, 37,145, 72, - 28,254,174,237,249, 39,215,245, 15,189,127, 79,186,114,231, 69, 31,237, 73,189, 58, 55,171,228,142, 66, 52,187,114, 39,166, 75, -249,118,158,170, 42,238,129, 4, 77,211, 88,185,114, 37,177,106,213,170,113,110,110,110,141, 72,146,124,185,124,249,242,114,169, -111, 42,206,211,186,206, 13, 98,203,128,207, 21,250, 21,149,174, 17, 77,253, 77, 32,161,253, 1, 98,108,215,182, 45, 59, 79, 25, -221,159,160, 25, 60,140,152,180, 80,169, 55,151,235, 88, 46, 24,226, 53,222,205, 26,207, 29,210,191, 7,217,198,179, 30,248,118, - 22, 0,201,194,222,139, 73, 54,193, 65,203,118, 3,240,169, 69, 47, 87,188,137, 56,102, 47, 40, 80,129, 32, 0,130, 0, 72, 2, - 40,150, 80,232,245,245,152, 21, 0,126,210,243,174, 68, 90, 26, 19,152,123, 76, 2, 0,140,143,112, 80,234,217,217,217,141,155, - 61,123,182,137,167,167,167, 37,143,199,227, 72, 36, 18,135,132,132, 4,187,101,203,150,121,138,197,226,243, 0, 30,233,201, 89, -183,161,179,211,201,224,185, 19,218, 53,111,224, 10,150,172, 24,148, 84,228,242, 42,225,117,135,169,187, 79, 77,138,201,147, 12, - 71, 45, 74, 38,228,228,228, 16, 0, 96,107,107, 75,151, 23, 89,237,199,110,157,215, 11,115,183, 92, 65,137, 68,118,164, 58, 14, -235,122, 45, 70,125,243,205, 64,191,181, 63,204, 52, 77,203,149, 35, 58, 81, 12,107, 83, 54, 86,204,159,198,145, 74, 21, 29,118, -255, 26, 50,121,231,134,133,251, 85, 42,213, 23, 0,218,168, 84,170,199, 0,126, 93,185,114,101, 85, 55,223, 85, 0,150,168, 79, -232,163, 12, 6,227,106,183,110,221,234, 79,156, 56,145,104,221,186, 53, 34, 35, 35, 27, 28, 59,118,172,199,133, 11, 23, 18, 85, - 42,213, 51, 0, 47,161, 46,123,162, 3, 88, 0, 26, 51, 24, 12,239,127, 51, 39,159,207, 55,146,201,100, 99,156,157,157, 39,119, -236,216,209,187,127,255,254, 68,227,198,141, 17, 31, 31,223,250,210,165, 75, 43,194,195,195,159,165,166,166,238,227,112, 56,135, - 5, 2,129,248, 31,127,142, 19,196,100, 0, 78,106,157,188, 82,135,239,116,148,230,146, 18,232,186, 14,137, 68, 98,175, 41, 97, - 67, 16,132,253,223,185, 61,122,174, 43,150, 32, 8,107,117, 91, 84,247, 77,146, 36,148, 74,165, 72,165, 82,185,213,192,217, 88, -253, 34,165,179,214, 5, 80, 93, 34,104, 35, 0,232,213,169, 89, 30, 8,196,148, 89,180,222,127,201,140, 41, 19, 96, 52,154, 93, -185, 27, 99, 93,206, 10, 86,241, 45,118,229, 74, 98,197,138, 21, 8, 12, 12,236, 15,192,151,162,168,112, 15, 15,143, 29,229, 40, - 41,170,108,222,138, 21, 43,182, 87,115,157, 27, 96,192,231, 2, 63,232, 83, 84,186,202,247, 31,183,193, 93,160,194, 88, 87, 27, -123,255, 89, 19,135, 26,121,122, 52,132, 4,166, 72,202, 81,225, 98,216, 37, 0, 56,161,159,213,105,104, 27, 38, 83,114, 56, 40, -112,126, 19,223,118,158,120,158,166,192,227, 52, 21, 74, 18, 21, 96,144, 10,168, 40, 26,160, 33,169,237, 86,167,230, 43,113,231, -165, 12, 36, 1, 48, 72,128, 36, 9, 48,200, 90,146, 81,178, 87,171, 15, 69,121,230,100, 82, 0, 37,123,245,129, 7,164,153,187, -187,251,168, 85,171, 86, 89,102,100,100,152, 68, 70, 70,130,203,229,194,202,202,138,193,231,243,157,182,108,217, 34,158, 53,107, -214, 87,114,185, 60, 9, 64,142,142,156, 30,125,219,120,223,219, 23,180,218, 66,241,224, 18, 10,142,255, 6, 6, 73,131,109, 98, -138,250, 70, 70,184,244, 77, 67,107,255,176,196,211, 15, 51, 69, 30, 0,210,106, 34,139,139,139, 99, 72,165,210,225,230,230,230, -237, 89, 44,150, 3,207,170, 30,149,206,108,147,155, 77, 52,120,155,101, 95,210,101, 94, 15,135, 62,155,231,116,195,220, 45, 87, -176,237,216,253, 95, 90, 33, 99,121,117,121,179,141,141, 77,167,204,154, 62,209, 52, 53, 71,142, 53,167,115,112,232,118, 33,198, -248,154, 97,238,151, 22, 8, 24, 49,204,228,212,111,161, 83, 0,236,215, 90, 36,222,195,195,131,136,139,139,171,236,230,107, 5, - 96,161, 76, 38, 35,217,108, 54,193,227,241, 70,173, 93,187, 86, 62, 98,196,136, 84, 77, 3, 95, 95, 95,248,250,250, 18, 69, 69, - 69, 13,110,220,184,209, 32, 36, 36, 68, 25, 17, 17, 17, 11,224,108,213, 22, 11,163,119, 18,137,216,133,103,100, 84,242,211,238, -221,155,187,116,233, 66,113,185,127,165,159,170, 13, 39, 0, 88, 88, 88,236,183,183,183, 39, 22, 47, 94,156,254,177, 56,235,213, -171,119,165, 93,187,118,221,122,245,234,197,236,212,169, 19,156,156,156,202,230,217,218,218,194,215,215,151, 72, 73, 73,105, 30, - 30, 30,190,251,202,149, 43, 59,158, 60,121,114, 35, 41, 41,169,215, 63,108,209,218,167, 22, 19, 2, 61,219,127,246, 32, 8,194, -116,239,222,189,246,154,154,140, 10,133, 2, 42,149,170,236, 91,243,161, 40, 10, 42,149, 10,107,215,174, 85,137, 68, 34, 93,246, -145, 72,235,173, 89,243,161, 42,251,230,112, 56,182,154,132,189, 53,220,217, 99,248,220,130,166, 38, 38, 38,174, 0,250,194,174, -209,194,242, 13, 74,223,159, 69, 34, 81,178, 64,106, 25, 3,160, 75, 53,108,150,171, 86,173, 26, 19, 24, 24, 56, 80,203, 74,235, - 61,100,200,144,138,101,175,188,213,223, 34,130, 32,110,146, 36,121, 30,192, 33,124, 68,171,187, 1,255, 45,208, 52,221, 22,128, -157,214, 36, 25, 74, 71,133,160,126, 78, 18, 0,108, 42, 76,215,110,167,249,206, 86, 79,183, 83, 47, 71,107,241,102, 19, 4,241, -168,150, 93,188,133, 42,252,180,152, 0, 16, 22, 22, 70,247,235,215,143,208,124, 87, 46,138,252, 47, 78, 24, 49,160,207, 87,221, - 59,130,228, 89,225, 85, 22, 16,241,142, 6,147, 84,128, 4,141, 7,119,111,208, 96, 82,135, 43, 44, 85,181,245,164,222,224,239, -188, 61, 61, 54, 30, 8,154,205,136,205, 98,226, 80,120, 9,228,146, 98,100,103,188, 67, 86,122, 50, 4,169,111,145,246,238,237, - 51,128, 88,161, 51,231,123, 7, 6, 80, 81,234,119, 64, 10,168, 38,242,178,102, 78,185, 40,174, 65, 99, 79,207,124,142, 10,144, -139,226,116, 88,125, 85,156, 94,141, 26, 53, 26,241,195, 15, 63, 88,191,120,241,194,168,164,164, 68,122,233,210,165,248,164,164, - 36,115, 62,159,159, 55,109,218,180, 70, 78, 78, 78,230,131, 6, 13,226, 28, 63,126,252,107,148, 15,107,173,138,211,115, 64,251, -150, 17, 7,119,108, 53,201, 61, 21, 12, 89,194, 83, 92, 20,136,112, 55,179,132,110, 96,193, 37,190,109,110, 7, 83, 46, 19,171, - 59, 57,153,246, 61,147,176, 81, 65, 81, 1,213,113,222,187,119,143,111,108,108,188,101,228,200,145,252,153, 51,103,114, 85, 76, - 75,102,104, 68,174,197,194,221, 17, 78, 37, 82, 57, 99, 68,183,122,152, 55,210, 27,243,182, 93,215,136,172,201,245,235, 23, 80, - 81, 81, 85,115, 42,228,242,250,206,246,230,136, 78, 18,227,208,237, 66,252,249,131, 19,186,175, 77,199,160, 86, 76,120,212, 53, -133, 82,174,104, 60,100,200,144,195,234,183,246, 71, 0,190, 30, 50,100, 72, 19, 6,131,113, 29,192,239, 53, 29, 35, 30,175,242, -234, 41, 86, 86, 86,232,218,181, 43, 60, 60, 60,152, 93,186,116,241,174, 32, 96,202,113,202,229, 50, 62, 69,209, 48, 51, 51, 51, -178,177,177,177, 50, 51, 51,203,173,236, 65,165, 15, 39, 0, 88, 91, 91, 15,238,218,181, 43,243,216,177, 99, 57,137,137,137, 15, - 70,140, 24,241,214,220,220,188,156,245,215,196,196, 4,141, 26, 53,194,178,101,203,152,125,250,244,169,145,211,193,193,161,103, - 72, 72, 8, 8,130, 40,123,104,191,103, 44,118,117,133,163,163, 35,250,246,237,203, 28, 60,120,112,207,164,164,164, 90, 93, 71, -122,224, 90, 37, 22,173,149, 21,142, 83,149,195,111,149,181,215,225,184,103,105,172, 75,106, 62,124,192,181, 89,237,112, 39,143, -199, 43,179, 66, 85,178,174,247, 56, 73,146,196,210,165, 75, 65, 16, 4, 88, 44, 22,216,108,118,165,223,126,126,126,250,246, 51, -133, 32, 8,146,205,102, 47,100, 50,153, 19,165, 82,169, 51,143,199, 75, 87,169, 84,191, 72,165,210,181, 0, 20, 52, 77, 91, 86, - 33,178, 42,229, 52, 49, 49,113,125,245,234,149,123, 85, 29,145, 74,165,240,246,246, 6,164,136,173,142, 51, 33, 33,193,213,205, -205,173, 49, 0, 77,137,182,219, 52, 77,119,209,250,175,141,219, 52, 77,127,169,254,253,242,205,155, 55,174, 13, 27, 54,204,255, -167,206, 79, 3,231,191,143,179, 6, 45, 98, 71, 16, 68,152,113, 48, 25,151, 0, 0, 32, 0, 73, 68, 65, 84,214,181,218, 79,243, -127,209,162, 69, 75,214,175, 95,255,130, 32,136, 48,237,233,218,237,180,191,213,247,155, 48,154,166,251, 45, 94,188,216,115,195, -134, 13,235, 52,109,255, 14,145,168,143, 69,203, 60, 91, 98,130,240,119,230, 96, 50, 84, 96,146, 4,152, 12, 0, 52,129,228,164, - 4, 20, 21, 22,220, 65,226,233, 68,221, 44, 89,254,157, 90,180,240, 10, 58,186,109, 1,249,115,120, 9, 10, 68, 18,196, 61,185, -137, 71, 55,127,207, 80, 41, 85,191,131,160, 31, 3,100, 36,222, 82,241, 64,104,237,106, 92, 16, 52,179, 84,104,169,197, 85, 57, -177,245,201,208,188, 73,147, 38,195,150, 45, 91,102, 27, 21, 21,197, 19, 10,133, 69, 71,143, 30, 77,151, 74,165, 73, 0, 46, 39, - 39, 39, 55,217,190,125, 59, 39, 40, 40,200,203,203,203,139,127,242,228, 73, 89, 37,229,140,222,227,156, 63, 54, 32, 98,226,172, - 57,188,216,147,187,192,137,141,196,210,167, 57,170, 63, 5, 37, 63, 0,216,134,148,226, 78,217, 18,229,213,173, 93, 93,200,122, -102,108, 52,180,228,248,197,229, 73,170,181,100, 25, 27, 27,111, 9, 9, 9,113,109,219,182, 45, 9, 0,225, 47,149,220,133,187, - 35,156, 46,175,239, 68,116,106,102,131,172, 2, 41,102,239,138,198,165,136,172, 63, 52, 34,171,166, 78,154,153,153,101,167,102, - 21, 58,216,152,242, 48,186,179, 41,186,175, 77,135,127, 27, 46,184,108, 2,241,137, 25,104,232, 86,143,136,190,115,182,141, 90, -100,181, 21, 8, 4, 0,208, 6, 64, 98, 74, 74, 10,223,199,199, 71,168, 69,151, 15, 96, 35,135,195, 89, 74, 16, 4,221,182,109, -219,104, 47, 47,175, 98, 43, 43, 43,136,197, 98, 72,165, 82,176,217,108,136,197, 98, 36, 39, 39,227,193,131, 7,176,178,178,210, -235, 64, 21, 23, 23,195,204,204, 12, 20, 69,125, 48,167, 74,165, 34,246,236,217, 99,242,226,197, 11,147,208,208, 80,135,185,115, -231,230, 54,109,218,244,241,176, 97,195, 94,219,219,219, 75,159, 62,125,138,123,247,238, 33, 63, 63, 31,237,219,183,215,137, 83, - 38,147,129,201,100, 66, 44, 22,131,203,229,130,201,100, 66,169, 84,130,162,168, 50,241, 85, 92, 92,140,188,188, 60,176,217,108, -200,100,178, 79,241, 6,250,158,133,170,186,225,183,218, 88,180,180,133,154,142, 34,171, 38, 75, 84,149,195,157, 5, 5, 5, 70, -150,150,150, 11, 1, 8,106, 90, 23, 65, 16, 96, 48, 24, 96,179,217, 32, 8, 2, 93,186,116,193,132, 9, 19,208,170, 85, 43, 36, - 36, 36,224,248,241,227,120,244,232, 17, 88, 44, 86, 89,123,157,199, 39,252,252, 24, 60, 30,239,222,128, 1, 3, 60,127,248,225, - 7, 94,189,122,245, 16, 27, 27, 91,119,195,134, 13, 11,175, 93,187, 54, 80, 36, 18,181,209,220,237,170,183,210,171,135, 4, 75, -135, 11,251, 74,165, 82,196,198,198,234,179,204,123,104,216,176, 97, 50, 73,146,175, 41,138, 10, 7,224, 77,211,116, 23,130, 32, - 46,161,212, 47, 81, 27, 34,154,166,191, 36, 8,162, 16,192, 51,146, 36, 95, 82, 20,149,108,176,219, 24,160,195,125,165, 95,197, -255, 4, 65,132,173, 95,191,190, 95,101,226,170,146,107,179,220,244, 13, 27, 54,172,211,250,255, 33, 22,213,174, 40,239, 12,239, -167,182,114,253, 37,180,194,194,194,170, 87, 32, 20, 6,133,157, 62,118,191,187, 28,174,158,173,125,181,172, 67, 52, 34, 31,220, - 3, 64,255,162, 83, 87,248,253,140, 72, 6,243,151, 61,235,102,146,123,111,150, 32, 37, 61, 11,247, 46,254,130,108, 65,210, 33, -128,158,139,196,208,194, 15, 62, 18,245, 6,121,217,219,216, 90, 74,228, 52, 40, 26,192,123, 98,235,147,160, 85,227,198,141, 7, - 71, 68, 68,216, 74, 36, 18,222,157, 59,119, 74, 66, 66, 66, 50,228,114,249, 77, 0,119,213,109,162,178,179,179,135,168,133, 9, -131,201,100,114,228,114,121,117,190, 11,173,230, 79, 28,115,103,227,158,131,188,215,207,163,177, 61,244, 34, 10, 74, 74, 84, 55, -179,196, 95, 3,208, 40,250,235, 81, 57,226, 52, 26,180, 11,139, 36,192, 55, 97, 57,198,229, 73,120, 64,229, 67,178, 82,169,116, -196,200,145, 35,249, 26,145, 5, 0, 57, 69, 10,102,137, 84,193,232,212,204, 6,173,187, 13, 65,228,141, 83, 56,121, 59, 13,110, -118,198,183,235,155, 20,232,180, 71,179,179, 4,123,182, 6,239,221,186,113,229,124,206,188,190, 22,240,111,195, 2,143, 77,192, -220,152,133,181, 59,246, 43,162, 30,220,126,202,231,243,195, 0,124, 45, 16, 8,192,231,243,139, 1,188,100, 48, 24,137, 42,149, -170, 50,167,238,229, 0, 28, 14, 31, 62, 76, 42, 20,138,226,132,132, 4, 56, 58, 58,194,193,193, 1, 22, 22, 22,136,139,139,195, -159,127,254,137,248,248,120, 80, 20,133, 22, 45, 90,232,117,176,114,115,115,241,244,233, 83,244,237,251,213,220,236,236, 44,115, - 43,107, 27,209,157,240,219,155,106,195, 73, 81, 20, 1, 0,158,158,158,240,244,244,228,165,165,165, 57,135,133,133,217,175, 89, -179,230,157,171,171,235, 81,177, 88, 92,206,114,160,171,208,210,136, 11,141, 8,228,241,120, 96,179,217, 40, 44, 44, 68,102,102, - 38,138,138, 74,131, 54, 45, 45, 45, 63,137,208,170,194, 66,245,209,218,255,205,226,240,189,225, 78, 75, 75,203,145, 0, 22,234, -184, 45, 80, 42,149, 96,179,217,240,241,241, 65,112,112, 48, 30, 61,122,132,223,127,255, 29,117,235,214,197,216,177, 99, 65,146, - 36, 94,188,120,161,111, 23,169,136,136,136,133, 95,127,253,181,231,225,195,135,121,201,201,201,136,143,143,135,165,165, 37,130, -131,131,185,147, 39, 79,110,120,227,198,141,229, 40, 13,126,169, 30, 90,209,133, 34, 35,254, 80,111,111,239,247,154, 56, 58, 58, - 90, 92,190,124,217,190, 76,128, 85,140, 72,124, 31, 5,203,151, 47,223,234,225,225,177, 77, 61, 92,232, 11,192,132,166,105,191, -208,208, 80, 2, 0,252,253,253,105,130, 32, 52, 15,164,103,167, 78,157,234, 22, 23, 23, 71, 7, 6, 6, 26,124,180, 12,168, 74, -139, 76,214, 92,147, 85, 9, 40,125,132,154,182,197, 75,131,197,139, 23,123,174, 95,191,254,225, 7,138, 44,237, 55, 38, 90, 35, -182,202, 30,166, 85, 14, 25,150,217,190, 72,190,163,189,141,245,162,177,157, 64, 81,128, 82, 5, 40, 85, 52, 68, 37, 98,196, 62, -127, 84, 2, 30, 17,170, 83,119,184,156,160, 53, 63,204,105, 16,157, 74, 34, 61, 95,142, 91,103,247,210,217,130,164,193, 72, 60, - 53,254,227,136,172,161,222,142, 14,246,183,142,237, 93, 77, 62,122, 43,131,138, 42,213, 89, 20, 69,151,253,254, 4,112,180,179, -179, 11,184,127,255,190, 29,151,203,229,189,122,245,138, 58,117,234, 84,190, 92, 46,191,166, 37,178, 0,160, 83,155, 54,109,148, -166,166,166, 16,137, 68,114,185, 92, 46,169, 70,100, 57,251,181,106,126,123,227,158,131, 60,137, 76, 6,161, 88, 10,134,141,125, - 69,145, 5, 0, 29,187,185,215,169, 67,240,204, 64, 3, 72, 42,148,167, 87, 37,178, 0,128,203,229,246,152, 57,115,102,185,186, -120,182,102, 44,165, 49,151,165,186, 27,147, 67, 69,222, 56,133,240, 23, 57, 20,143,205, 80,217,209,111, 27,232,186, 3, 10, 82, - 99,246,252,126, 46,236,234,119,203,130,138, 75, 68, 69,112,115, 50, 66,113,145, 16,107,215,111, 84, 68, 68,132,223, 92, 56,119, -106,135, 83,167, 78,109, 64,169, 51, 56, 0,188, 60,117,234,212,152,101,203,150,253,138,191,210, 60, 84, 68,122, 64, 64, 64,106, -179,102,205,132, 30, 30, 30,194,220,220, 92,196,196,196, 32, 63, 63, 31,219,183,111, 71,108,108, 44, 52, 22, 65,157,124, 85,222, - 23, 72,200,207,207, 51,165,105, 26,249,121,185, 38, 63,252,240,131, 69,109, 56, 85, 42, 85,185,107,171, 78,157, 58,152, 54,109, - 26,187,164,164,196,242,221,187,119,230,218,243,116,229,148,201,100,208, 88,134,104,154,134, 76, 38,131, 80, 40,132, 76, 38,195, -235,215,175,203, 68,150,122,253,159,204,162,165,249,205,227,241, 50, 53,231,178,102, 8,142,199,227,101, 85,213,254, 67,160,181, - 46, 90,253, 91, 95,113, 88,227,246,232,120,220,193,102,179, 49, 97,194, 4, 60,124,248, 16, 9, 9, 9, 96, 48, 24, 16,137, 68, - 40, 41, 41, 65,207,158, 61,193,225,112,244,181,104,209,108, 54,123,228,146, 37, 75,120,137,137,137,200,201,201,209, 56,211, 67, -165, 82, 97,238,220,185, 70, 92, 46,119,164,190,166,123,129, 64,208,251,245,235,215,141, 43,126, 50, 50, 50,132,218, 62,133,181, - 69,104,104, 40,225,239,239, 79,251,251,251,211, 26,193,101,128, 1,149,161, 10, 45,178,175, 42,139,214,199,176,138,105, 44, 91, - 80, 7,136,212, 2, 26,145,213, 85, 75,120, 17, 26, 11,151,110, 67,135,110, 67, 91, 58,216, 88,223, 56,188,107,149,105,216,115, - 2,169, 41, 73,200, 22, 36,163, 77, 7, 63,196, 62,143, 6,165, 80,157,198,235,208,154, 61, 57,235,249,187,123,120, 52,157,222, -181,131, 23,130,194,138,241, 42,242, 50, 10,178, 5, 59,145,116,234,244, 71, 57, 66,174,254,205, 29,236,173,111,252,186,107,149, -229,165, 24, 18, 41, 41, 73, 56,251,235, 86, 90, 33,151, 22,160,124, 36,151,222,111,205, 70,148,140, 83, 92,144, 9, 89,145, 10, - 60,178,132,167,231, 32, 69, 6,128,240,173, 91,183,118,111,223,190, 61, 39, 32, 32, 32, 35, 63, 63,255, 44,128,251, 90,109,154, -185,187,187,247, 13, 14, 14,118, 72, 73, 73,193,181,107,215, 50, 80, 26,250, 95, 21, 82,111, 71, 63,223,253,231,175,251,231, 27, - 53,104,130,237, 75,190, 83,134, 62,138, 25, 0,224,146, 86, 27,143, 30,222,238, 97,107,190,159, 65, 82, 81,127,224,105,114, 38, -222, 10,165,127, 86, 69,152,147,147, 67,148,148,148,184, 90, 90, 90,106,159,144,224,155,136,164, 11,134,186,167,247, 92,120,199, - 73, 34, 87,129,203, 34,233,217, 3, 93,211, 31,158, 13,181,201,145,228, 16,154,104,196,154, 48,105, 88,143,129,187, 66,206,140, - 14, 11,187, 48, 93, 46,149,120, 53,105,210,152,126, 28,113,227,233,194,185, 83,251,212,242,136,155, 62,124,248,144,100, 48, 24, -229, 4,186,182,133, 72, 95, 75,145, 62,208,149,179,162,208,210, 64,169, 84, 18,181,229,148, 74,165,101, 66,171,226,195,189, 50, -193,248,119,108,191, 62, 22, 42,237, 33, 67,141, 63,157, 68, 34,177, 87,251,108, 57,124, 76,139,214,135, 68, 34, 86, 55,124,169, - 79,255, 72,146, 4, 69, 81, 96,179,217,104,209,162, 5,194,194,194, 96,109,109, 13,115,115,115,152,155,155,195,200,200, 8, 54, - 54, 54,101, 66,139, 36,117,142,210,161,165, 82,105,221,186,117,235,226,245,235,215,224,241,120,101, 31, 46,151, 11, 79, 79, 79, -136, 68,162, 58,248,148,182,123, 3, 12,248,123,239, 43, 97,218, 98,137, 32,136,176, 69,139, 22, 45,169, 45,223,162, 69,139,150, - 84,102,225,250, 64,193, 85,206,186,197,212, 86,144,149, 42, 73,181,200, 58,180,115,165,249,153, 39, 64,106,106, 34,174,158,220, - 81,164,144,203,242, 41, 74,225,250, 54, 62, 26, 32,241,139, 78, 93, 32,233,118, 3,251,118, 35,174,190,144,161,176, 32, 27, 47, - 31, 95, 78,130,152,179,248,163,137, 44, 7,219, 27,135,119,173,180, 60,255,156, 64, 74, 74, 18, 46, 29,219, 94,168,144,203,123, - 32, 49,244,241,135, 80,143,100,179, 7,178, 93,222,245,155,232,155, 14, 21,161,194,200,216,184, 47,179, 50, 48, 80,112,167,250, -200, 48,109,100,103,103,159,221,186,117, 43,241,227,143, 63,118,149, 72, 36,191, 1,208, 54, 81,122,185,185,185, 13,223,183,111, -159,117, 74, 74, 10,235,206,157, 59,162, 27, 55,110,208, 0,206,215, 96,113, 89,208,115,252, 52, 70,171,122,117,102, 70, 37,165, - 13, 0,240,135,214,108,207,126,173,155,221, 61,184,126,185,153,226,110, 40,138, 5, 41, 88,124, 55,181, 16,128,206,251, 91,161, - 80, 64, 40, 20, 66, 81,156,171,108,195, 23, 9, 3,135,216, 75, 51,243, 37, 76, 22, 85,162,244, 48,207,146,222,200,125,203, 48, - 54, 54,214,107, 95,238, 90, 63, 63, 4, 64,200,144, 33, 67, 14, 63,139,184,208,134,207,231, 95,240,240,240, 32, 0,160,138, 8, -195,170,176, 10,192,220,142, 29, 59, 18, 62, 62, 62, 15,182,109,219,118,165, 58,177, 82, 27,139, 86, 77,208,149,147,162, 40,178, -138,253, 75,212,150, 83,219,162, 85,147,208,250,148, 22,173,202, 68,139,182, 72,212, 22, 66,255,134,168,195,234,196,148, 62,253, -211,248,201,177,217,108, 68, 71, 71,195,197,197, 5,114,185, 28,102,102,102, 48, 51, 51,131,169,169, 41,138,138,138,192, 98,177, -160,231, 54, 83, 60, 30,239, 93, 76, 76, 76, 99, 59, 59, 59,168, 84,170,114, 98,235,213,171, 87, 48, 49, 49, 73,211,215,162,197, -231,243, 47,171,163, 14,203,193,209,209,209,226, 99,236, 87,109, 75,150,191,191,191, 97,136,208,128,106,173, 89, 85, 88,181,178, - 43, 88,162,100, 90,255,179, 81,154,195,173,159,250, 55, 42,249, 45,171,100, 90,238,250,245,235,111,104,249,119,101,127,224, 38, -104, 82, 60,148,139,112, 97,214,100,201,178,183,182,186,113, 96,123,160,249,201, 72, 32, 45, 37, 17,183, 78, 7, 11,149, 42,249, - 23,160,104, 65,196,181,211,161, 32, 80,130,183,161,183,116,187, 69,160, 85,171,166,174,248,253,133, 2,217,169,175, 64,211,212, - 33,100,133,148,124,240,209,113, 27,212,194,222,218,246,198,161,224, 64,139, 51,209, 4, 82, 83, 18,113,245,100,112,161, 82, 81, -210, 29,137,167, 35,107, 75, 59, 1,176, 98,152,240,118, 15,246,107, 53,212,213,205, 25, 20,173, 0,197,166, 49,104,129, 45,243, -101, 84,201,239,225, 60,225, 73,170,152,154,158,118, 95, 55, 7,186,226,226,226,223, 1, 60, 70,249,244, 10,205, 27, 53,106, 52, -116,247,238,221,118,169,169,169,188,168,168, 40,241,222,189,123,179, 40,138, 58, 3, 64,151,161,212,239,162,146,210, 14,160,124, -190,156,230,243,199, 7, 68, 4,140,155,200, 75,188, 22, 2,171,196, 88,124,127, 55, 93,245, 50, 95, 54, 66,109, 93,171, 20,182, -182,182,116, 78, 78, 78,114, 65, 65, 65, 99, 19, 19, 19,228,230,230, 34, 47, 47, 15, 66,161, 16,210,194, 60,165,141,170, 64, 68, - 40,243,192, 98,177,144,149,162,128, 74,165,202,208,213,154, 5,192,106,213,170, 85,147, 40,138,210,100, 68, 44, 23, 93,168,213, - 78,115, 62, 52, 30, 50,100,200, 97,173,168, 67,109,103,120, 77,122, 7, 66,157,222,161,253, 31,127,252, 17,215,167, 79,159,212, -202,196, 10,151,203,213,219, 81,186,170, 40,198,218,112, 86,101,209,170, 56, 93, 31, 78,205,240,165,198, 9,190,226,116, 13, 24, - 12, 6, 40,138,130, 14, 65, 21,127,171,104,209,142, 14,172,141,200,169,112,108,170, 77, 28, 90,203, 72,196,143,106,209,210, 28, - 11, 54,155,141,115,231,206, 97,220,184,113, 80,169, 84, 48, 54, 54,134,169,169, 41, 76, 76, 76,112,250,244,105,104,210, 63,232, -163, 95, 21, 10,197,145,245,235,215, 47,217,179,103,143, 17, 77,211,224,112, 56,101, 66, 43, 48, 48, 80, 44,151,203,143,232, 36, -180, 52, 25,223, 41, 58,198,196, 68, 89,109,212, 97,101,203, 84,225,175,101,185,106,213,170, 49, 20, 69, 13, 68,133, 20, 14, 21, -218,149, 75,253, 96, 72,239, 96,128, 14,247,147, 71,255,226,238,105, 4, 22,161,101,201, 42, 19, 92,100,117,226,197,206,202,242, -198,254,237,129,230, 71, 31, 17, 72,124,251, 22, 55,127,219, 81, 42,178,222,156,124,130,228,208, 76, 36,134,118,198,219,208,222, - 58,191, 61, 17, 68, 43, 39,123, 75,228,137, 40, 20,230,188, 3,104, 68,125, 12,145,101,103,101,119,227,231,224, 64,139, 83, 79, - 72, 36, 38, 38,226,234,201, 29, 66,165, 82,242,197,135,136,172,145,108,246,192, 70,238,206, 9, 75, 39, 13, 28,234,211,208, 17, - 54,239,226,112,126,236, 80,172, 62,254, 13,204,236, 24,104,215,215, 12, 19,214, 58, 14,229,123,114, 95,243, 59, 99,160, 30,212, -218, 34,171, 85,253,250,245,135,222,191,127,223,214,219,219,155, 23, 31, 31, 47,217,187,119,111,150, 88, 44,190, 2, 32, 90, 15, - 78,109,145,213,106,209,228,177, 17, 27,247, 31,230,145,108, 14,130,142,156,199,172,219,169,170, 11,201,133, 67, 80,126, 88,177, - 82, 72,165,210,107,193,193,193, 82,146, 36,145,151,151,135,156,156, 28,100,101,101,149,125, 23, 20, 20,128,193, 96,224,250,245, -235,178,194,194,194,251,186,118,240,222,189,123,245,211,210,210, 60, 4, 2, 65, 27,245, 39, 30,165,209,133,166, 90,211,218, 8, - 4,130,174, 0, 30,105,166,167,166,166,214,123,240,224, 1,191, 38,126, 51, 51, 51,176,217,236,114, 22, 45, 46,151, 11, 7, 7, - 7, 40,149, 74,156, 56,113, 2, 0,242,170,227, 96,179, 57, 2,146, 36, 64,209,148,148,199,227, 81,124, 62,191, 82,129,165, 15, -167, 26,169, 95,126,249,165, 36, 50, 50,178, 82,139, 86,109, 56,105,154, 46,233,213,171, 23,210,211,211,193,227,241,202, 30,214, - 26, 65, 69,146, 36,184, 92, 46, 50, 50, 50, 48,101,202, 20,208, 52, 93,242, 79,223,121,180,125,154,212, 98,136, 0, 64,168,133, -208,123,126, 90,186,250, 64,105,134, 6,105,154,134, 70,112, 85,152, 95,182, 46, 93,178,183, 87,240,233,154, 92, 80, 80,176,177, -180, 59,244,222, 10,223,251,244,120, 40,148, 9,173,216,216, 88, 28, 62,124, 24, 5, 5, 5,224,112, 56,200,207,207,199,193,131, - 7, 17, 19, 19, 3, 14,135, 3,205,190,208, 85,191,249,248,248,108, 12, 15, 15,143, 25, 49, 98,132, 56, 58, 58, 26, 98,177, 24, -209,209,209,232,221,187,183,228,238,221,187, 9, 98,177,120, 21,116, 25, 58,212,100,124, 87,151,215,145, 74,165,136,138,138,170, -244, 83,213, 50, 21,145,144,144,224,170, 82,169, 26,211, 52,237, 75,211,180, 57,212, 41, 28,212,255,181, 63, 95,170,231,153,211, - 52,237,171, 82,169, 26, 37, 36, 36,184, 26,228,132, 1,159, 41,110,105,137, 45, 90, 75,100,221,170,222,162, 69,145,193, 7,118, -172, 52, 63,242,144, 68, 74,114, 2, 30, 95,220, 45, 84, 81,138, 47,244, 44,135,211, 3, 90,185, 54,120, 70, 38, 94, 20, 81, 26, -206, 92,152,147, 2,208,140,218, 8,173,114,156,160,200,224,131, 59, 2, 45,142, 61, 38,144,158,242, 6,119,207,238, 18, 42,149, -210,238,120, 27, 26, 85, 27,206,145,108,246, 50, 22,131, 88,218,171, 83, 75,118,231,150,238, 48,201, 74, 66, 70,106, 58, 78,196, -102,231, 37,228, 75, 39,222, 37,228, 72,126, 35, 61,208,119,146,181,181,149, 35, 11,253,166,218, 88,223, 63, 95,248, 59,193, 18, -201,105, 57,189, 94,112,183,172, 44, 69,249,126,190, 15, 71, 51, 51,179, 17,143, 31, 63, 54,231,241,120, 70,143, 31, 63,166,246, -238,221,155, 43, 22,139, 47, 2,136,208,105,219,223,135,115, 91,119,183, 91,235,118,237,231, 21,139, 74, 32,146,201,193,117,224, -171,206, 68, 60, 31,140,170, 19, 96,150,227,228,114,185,199,142, 29, 59,214,183, 75,151, 46,174, 94, 94, 94,100, 94, 94, 30,138, -139,139,203,156,171,237,236,236, 16, 27, 27, 75, 37, 38, 38,166,115,185,220,227,186,246,179, 99,199,142,137, 36, 73,198,171,135, -209,226, 81, 33,186, 80,171,105, 99,129, 64,208,150,207,231,223, 2, 96,172, 21,117,168,205,169, 73,239,176, 4, 0, 73, 16,196, -163,232,232,232,226, 62,125,250,192,200,200, 8, 34,145, 8,117,235,214,133, 82,169,196,197,139, 23, 17, 25, 25, 41,162, 40,234, - 86, 37,226,181, 92, 63, 37, 18,113, 93, 0,164,184,164,164,197,152, 49, 99,186,206,155, 55,175, 92, 72,186,189,189, 61,172,173, -173,245,226, 4,128,188,188,188,166,127,252,241,199,156,232,232,232,239,250,246,237,107,177,100,201, 18,110,253,250,245,161, 82, -169,200,218,114,230,231,231, 91, 68, 69, 69,109,234,220,185,243,140, 62,125,250, 48,215,173, 91, 7, 11, 11, 11,168, 84, 42, 24, - 25, 25,161,176,176, 16,171, 86,173,194,157, 59,119,148, 52, 77,239, 18, 10,133,223,235,121, 46,225, 67,175,205,170, 44, 64, 85, -165,100,168,162,253,223,222,207, 10, 62, 93, 80,167,112, 88, 88, 69, 6,123,232,122,206,107,132, 22,131,193, 64, 82, 82, 18,246, -238,221,251, 94, 30, 45, 77,250,135, 42,184, 43,219,118,250,230,205,155, 42,130, 32, 58, 60,126,252,120,225,232,209,163, 39,138, - 68, 34,103, 19, 19,147,116,133, 66,241,139, 88, 44, 94,139, 82,127, 84,182, 62,247, 16,145, 72,148, 92, 89,212, 97,197, 54,128, -101,181,156, 21,210, 59,148, 75,225, 80, 97,153,114,169, 31, 42, 73,239,240,183, 31,119, 3,231,191,146,243,115, 23, 91, 85, 39, - 44,125, 15,173, 38,179, 88, 98,133,119,120, 2,241, 33, 34,235,125,107,137,164, 36, 97,249,177,119, 45,101, 82, 9, 68,194,204, -151, 72, 58,145,245, 65,155,165,238,231,237, 4, 2, 73,137,111,240, 48,108, 87,105, 63,223,134,214,186,159, 4,176,248,167, 75, -161,108,194,194, 26, 79,231,140, 67,122,129, 8,151,222,230,159,164, 75,164,211,143, 0,249,184, 3,144, 74,105,248,193, 31, 50, -118,251, 14,178, 24,106, 91,135,133, 45,243,127, 1,111,145, 13,187, 93,247, 46,250,212, 64,204,224,241,120,225,219,183,111,239, -225,235,235,203, 29, 50,100, 72,101, 14,242,250, 34,245,209,171, 55, 63, 93,216,179,121,190,141,119,123,236, 92,182, 64,117, 44, -226,121,197, 40,196,106,225,225,225,161,186,119,239,222,188, 41, 83,166,108,233,209,163,135,211,128, 1, 3, 56,117,235,214, 5, -151,203,197,155, 55,111, 16, 30, 30, 46,123,251,246,109,122, 73, 73,201,188,230,205,155,235,147,227, 44,127,249,242,229, 27,213, -235, 32,212,195,133,109,160,142, 46,212, 52, 82, 39, 45,109, 3,192, 56, 48, 48,112, 52, 0, 84, 17,246,189, 28,192, 30, 0, 76, -154,166, 51, 66, 66, 66, 58,156, 61,123,182,195,220,185,115,217,125,251,246,197,253,251,247,113,245,234, 85,185, 92, 46,143, 80, - 11, 87, 93, 75,229, 80, 0,162,148, 74,229,243,160,160,160, 14, 12, 6, 99,185,102, 70, 76, 76, 12, 14, 29, 58, 84, 27, 78, 37, -128, 77,153,153,153, 63,133,132,132, 44,191,118,237,218,248, 49, 99,198,152, 43, 20, 10,196,198,198,226,231,159,127,174, 21,167, - 80, 40,156, 99,107,107,187,244,226,197,139,191, 92,185,114,229,235, 81,163, 70,145,179,102,205, 66,112,112, 48,126,251,237, 55, - 74,165, 82,157,101,177, 88, 99,114,114,114, 68,159,226,174,163, 30,134, 75,215,179,214, 97,141,188, 31, 50, 52,168, 35, 4, 31, - 74,160,217, 14, 63, 63,191, 50, 43,163,198, 10,167,221,134, 32, 8,189,135, 14, 1, 88,210, 52, 77, 1,216,133,210,250,162,218, - 89,225, 25,248, 43,115,188,174,140,205, 4, 82,203, 24, 72, 17, 91,125, 81,105, 75,128, 70,179, 26,216, 10,150, 47, 95,190,117, -197,138, 21, 91, 43,166,112,208,110, 84, 49,245,195,202,149, 43, 97, 72,239, 96,192,127, 21,149, 11,173,168,125, 10, 69,131,193, - 75,182,175, 91,176, 66,169,144, 9,105,200,253,241,230,116,244,135,174,140,166,232, 69,215,143, 6, 6,131, 70, 62,173, 82, 46, -252,224,222,255, 77,253, 36, 44,172, 81,180,106, 26,126,123,145, 78,103,136, 20,223, 28,145,203,203, 89,131, 74,125,178,168, 97, - 55, 36,249, 39,172,156, 88,103,230,124, 97, 67, 92,200, 27,173,247,122,178,178,178,206,109,221,186,149,220,188,121,115,215,146, -146,146,138, 14,242,181,197,130,254, 51, 23, 49,218, 53,114,157,249,240,117,242, 64,232, 48, 92, 88, 17, 29, 59,118, 20,196,197, -197, 5, 92,185,114,101,196,237,219,183,123,136, 68, 34, 87,130, 32, 96,108,108,156, 44,149, 74,175,113,185,220, 99,122,138, 44, - 0,192,138, 21, 43,232,149, 43, 87, 18,113,113,113, 52,131,193,248, 19, 64, 34,131,193, 72,210,118,130,215,158,174, 89, 38, 48, - 48, 80,151, 7,226,237,226,226,226,200, 85,171, 86,117, 89,181,106, 85, 11,181, 85,232, 54,254,242,249,210, 23, 10, 0,183,217, -108, 78, 58, 65, 16,206,108, 14, 87,116,239,222,189,107, 31,200, 89, 34,151,203, 23,166,164,164,108,217,178,101,203, 90, 19, 19, -147,182, 49, 49, 49,127,126, 8,167, 90, 68, 13,182,182,182,118, 58,124,248,240,169,131, 7, 15,182,103, 50,153,247, 9,130, 24, - 34, 20, 10, 63,105, 81,105,117,129,232,149,122,212, 58,212,137,247, 99, 39, 41,253, 59,132,155, 74,165, 42, 94,186,116,105, 86, - 69,225, 85,209,122,165,249,175, 78,229,162,203, 62,213, 39,138,178, 6,225, 66, 20, 3, 64,105,237,194,210,178, 58,186, 22,149, - 6, 32,174,233, 58, 39, 73,242, 44,128,151, 36, 73,190,174, 24,232,162, 61,111,229,202,149, 53, 93,231, 6, 24,240, 89, 67,135, - 59, 91, 32, 9, 4,214,214,147,246, 31, 52, 87,126,156,126, 6,176,217, 43, 73, 96, 62, 0,130, 6,182, 28,145,203,127,168,110, - 65,199,142, 88, 75, 19,152,171,222,153,235, 50,238, 98, 77, 45,182,189, 14,116,168, 63,168, 39,103, 19, 84, 95, 80,246, 61, 78, -127,127,127, 70, 21, 15,243,114, 69,165,171, 66,104,104, 89, 22,255,170,250,169,125,190,153, 61,120,240,192,201,199,199, 71,128, -242, 78,255,149, 77,167,245,220,118, 6, 0,213, 71,222,159,159, 5,167,155,155, 27,231,205,155, 55,178,127,215,181,105,224,252, - 87,114, 90, 54,117, 1,129, 73,208,206, 29, 84,173, 69, 75, 75,160,209,244,207, 40,136, 77,169,162,159,154,235,220, 50, 33, 33, -193,181, 97,195,134,201, 0, 10, 42,244,163,178,121,180,225, 24,253,223,115, 86,134,201, 40, 95,138,206,128, 74, 14,132,129,211, -192,105,224, 52,112, 26, 56, 13,156, 6, 78, 3,103,109,133,214,103, 13, 18, 6, 24, 96,128, 1, 6, 24, 96,128, 1, 6,252, 45, - 32,170, 81,165,250,152, 4,107,163,108,175, 25, 56, 13,156, 6, 78, 3,167,129,211,192,105,224,252,191,227,172,137, 91,123,249, -207,117,232,240, 31,235,183,193,172,106,224, 52,112, 26, 56, 13,156, 6, 78, 3,167,129,243, 67, 4,203,103, 13, 38, 12, 48,192, - 0, 3, 12, 48,192,128,207, 6, 61,220,193,103,170, 64,254,241, 70,167, 32,170, 26,209,199, 13,117, 0,224, 99,241,253,159,130, - 15,224, 43,173,255, 23,160,142,140, 55, 8,173,207, 23,141, 0, 44, 1,160, 93,139,236, 33,128,245, 21,218, 29, 5,160, 93,144, - 80,132,210, 58,129,175,245, 89, 25, 73,146,235,187,116,233, 50,253,206,157, 59,155,149, 74,229,170, 90,244,215,149,207,231,111, - 36, 8,162, 53, 0, 22, 65, 16,111, 50, 51, 51,215, 43,149,202, 15,137, 90,105,224,232,232,184, 1, 64, 75,146, 36, 89, 4, 65, - 36,100,102,102,174, 81, 42,149, 55, 63,128,211,204,193,193,161, 19, 77,211,142, 0, 24, 44, 22, 43, 55, 45, 45,237, 1,106,153, - 91,201, 63, 48,150, 93, 40, 82,178, 0,192,220,132,169, 8, 13,108, 42,215,117,154,225, 20, 55,192,128,255,111,208,165,145,201, -229,208,219, 13,107,105, 37,190, 87, 1, 68,175,250,216,113, 57, 17,223, 87,181, 60, 81, 73, 84,115, 69,206,222,110, 88,171,162, - 75, 57,122,185, 97,211,229, 55,168, 54,210, 94, 23, 78, 13,246, 1,228,100, 29,170, 20, 16,186, 69, 95,255,219,241, 21,202, 15, - 21,150, 13, 29, 86, 43,180,134,185,131,175, 98,130, 25, 26, 11, 77, 24,175, 25,128, 22,234,135,252,107,148,230, 42, 42,250,192, -206,125, 46,156,255, 54, 44,167,105, 58,160,220,201, 90, 73, 30,162, 47,190,248, 98,192,149, 43, 87,140, 53,245,238, 40,138,130, -145,145,145, 18,192, 88, 61,214,101, 63,108,216,176, 69, 7, 14, 28,192,208,161, 67,151,134,133,133,109, 5, 80,172,235,194, 86, - 86, 86,254,150,150,150,193,251,247,239,183,107,223,190, 3,193,225,112,240,230, 77,130,243,148, 41, 83,188,226,226,226,206,102, -101,101, 77,212,119,227,173,173,173, 71, 90, 90, 90,110,217,187,119,175,109,231,206,157, 65, 16, 4, 34, 35, 35,157,231,204,153, -211,226,221,187,119,199, 51, 51, 51,103,232,203,105, 99, 99,227,110, 97, 97,209,109,231,206,157, 70,157, 58,117, 2,143,199, 67, -116,116,180,233,212,169, 83, 29,211,210,210, 98, 51, 51, 51,111,233, 43,178,158, 69,158,255, 90, 41,151, 6, 1, 0,147,205, 93, -208,126, 75,196,249,103, 55,206,247,175,105,154,127, 96,236,239, 6,177,101,128, 1, 6,104, 99,164, 19, 28,105, 26,243,175,252, -188,140, 4,128, 94,227, 87,207, 26,233,132,205, 71,210,171,174, 97,171, 39,223,247, 99,234, 32,248,112, 26, 50, 63,164,159,251, - 0,114, 14,147, 57,171,157,143,143,237,183,119,239, 38,200,129, 95,254, 79, 14, 81,165,195,156, 85, 10,173,193, 77,177, 74, 89, -106, 49, 33,250, 52,196,241,171,137,140,240, 47,190,248,162,225,132, 9, 19,136, 86,173, 90, 33, 50, 50,210,253,248,241,227, 95, - 93,184,112, 33, 65,165, 82, 69, 2,120, 1,221,179, 90,179, 0,120, 50, 24,140,214,255,114,206,127, 51, 76,212,226, 42, 19,127, - 37, 58,125, 47,225,233,245,235,215,207, 49,153, 76,141, 69,171,157, 72, 36,114,168, 96, 5,211, 5,245, 20, 10, 5,226,227,227, - 65,146, 36, 11, 64,125,188, 95, 82,163, 42, 56, 27, 27, 27,239,142,120, 24,105, 67, 48,141,144, 47, 1, 32,145,131, 99,234,128, - 3,135, 66,172,231,205,158, 49,248,230,205,155,225, 69, 69, 69,191,234,209,159,250, 38, 38, 38, 91,159, 62,125,106, 99,108,108, - 12,138,162, 80, 84, 84, 4, 71, 71, 71,236,223,191,223,114,222,188,121, 1,133,133,133, 55, 37, 18,201,111,250,136,115, 11, 11, -139,110,207,159, 63, 55,210, 20,148,150,201,100,112,118,118,198,209,163, 71,185,179,102,205,106, 90, 80, 80,144, 42,147,201,222, -234, 74, 88, 40, 82,178,148,114,105,208,225, 93,129, 46, 0, 48,102, 70, 96, 16,167,200,252,162, 46,211, 10, 69,202, 11, 0, 12, - 66,203,128,127, 26,173,109,109,109, 67,115,114,114,110, 1,152,136,143, 99,105,112,231,241,120,205, 41,138,114, 36, 73, 18, 12, - 6, 35, 67, 36, 18, 61, 5,240,170,182,132, 54,110,126,253,193, 53, 30, 7,154,106, 65, 2, 32, 72, 50, 90, 37, 47, 57,148,251, -234,230,249, 15,226,228, 24,141, 7,232, 22, 36, 64, 17, 36,249,148, 82,150,236,207,137,191,121,233,223,114,112,238, 11,209,216, -205, 81,247,194,152, 31,131,111,120, 3,240, 73, 10,228,209, 36,221,135, 21,103, 2,125,103,207,158,237, 56, 99,250,116, 98,220, -216,177,141,110,221,185, 67,116,213,167, 90,193,231,137, 42, 29,223, 43, 21, 90,254, 77, 97, 69, 3, 11,143, 7, 47, 33,153, 12, - 6, 49, 98,246,250,128,131,187, 54,145, 61,251, 15, 41, 27, 62,241,245,245,133,175,175, 47, 17, 20, 20,212,232,207, 63,255,108, -116,244,232, 81,101, 68, 68,196, 83, 0, 39,170, 90, 89,111, 55,136, 41,128,199,102, 49, 69, 35,150,253,186,215,199,199, 7, 92, - 46, 23, 31,194, 9, 0, 61, 27,146,111, 89,214, 13,158,142,152,185, 60,185,125,251,142,244,199,224,252,140,240, 16, 40, 43,106, -109,229,226,226,210, 73,169, 84,242, 0,128,201,100, 74, 82, 82, 82,102,162,180, 54, 32, 0,156,165, 40,106,128, 30,220, 36,128, - 21, 3, 6, 12, 88,250,237,183,223,162,110,221,186,152, 53,107, 22, 20, 10, 69,228,165, 75,151,150, 3,216,128, 26, 46, 30,123, -123,251,229,187,119,239,182,102,114, 76,208,106, 97, 34, 4, 5, 74, 0,128, 41, 23, 56, 55,141,198,172, 89,179,204, 31, 63,126, -188, 70, 31,161,101,111,111,191,106,255,254,253,214,198,198,198,160,105,186,172, 22, 99,113,113, 49,138,139,139, 49, 99,198, 12, -243,216,216,216,141,250, 8, 45, 7, 7,135, 78, 59,119,238, 52,226,241,120, 40, 46, 46,102,203,229,114,162,168,168, 8, 37, 37, - 37,180, 76, 38,147,207,156, 57,147,251,226,197, 11, 63,129, 64,240, 22, 6,252, 91,192, 0,240, 13,139,197, 26,212,176, 97,195, - 54,175, 95,191,126,162, 84, 42, 79, 3, 56,253, 17, 94,166,186, 59, 57, 57,173, 77, 79, 79,223, 9, 32,228,255,101,135, 58, 56, - 56,156,190,119,239,158,203,238,221,187,199,110,222,188,249, 34,128,223, 62,128,142,205,102,179, 7,119,237,218,213,101,204,152, - 49, 28, 7, 7, 7, 72,165, 82, 36, 38, 38,154,159, 60,121,210, 53, 58, 58, 58, 85, 93, 17, 67,231, 23, 10, 27,247,142,166, 96, -154, 31,239,208,177, 83,231,161,131,191, 49,115,176,177,128, 88,166,194,235,100, 65,221, 63, 46,158,235, 26,199, 54,186, 39,151, - 11,135,231,190,186, 87,172, 47,103,183,110,221, 59,247,232,222,221,204,194,210, 2, 66,145, 28,111,146,210, 92,111, 92, 61,239, -203,100, 26,221,166, 8,197,168,172,231, 87, 75, 62,229,177,153, 5, 48, 69, 60,155,230, 45, 58,182,122,220,107,194,154, 54, 52, - 77,131,164,177,163,162, 53,107, 22,192,220, 81, 90,246, 75, 47, 62,208, 52, 77, 16,216,164,109,205,234,237,134,181, 52,141,239, - 65,130,232, 93,195, 48,165, 6,189, 0,174,165,181,181,207,212,201,147,137,162,194, 66, 68, 71, 71,151, 84, 20, 89, 91,235,128, -125,155, 68,189,179, 41,181, 23,219,255, 82,107, 86,165, 67,135, 58,231,209, 50, 54, 54,174,116,186,133,133, 5,186,117,235,134, -245,235,215, 51, 1,180,174, 48,187,124,145, 85,128, 27,182,103, 49, 44, 76,184,100,221,186,117,205,204,205,205, 63,152, 19, 0, - 64, 83,245, 59,214,165,191,124,244,235,146,177,215,142,110,241, 20, 21, 21,176, 42, 54, 49, 53, 53, 69,227,198,141,177,116,233, - 82,221, 56, 63, 28,255, 40,167,163,163, 99, 19, 95, 95,223,214,215,111,221,178, 76, 79, 79,231,166,167,167,115,175, 92,191,110, -217,161, 67,135,214,142,142,142, 77,202,118, 21, 77,235,211,207,213,187,118,237, 90,126,246,236, 89,210,215,215, 23, 86, 86, 86, -232,214,173, 27, 46, 94,188,200,220,188,121,243, 58, 0, 75,107,234, 39, 73,146,157,125,125,125, 9,208, 52, 50,132, 74, 60, 88, -223, 4,209,155, 60, 80, 36,161,145, 39, 44,132, 88, 44,129,177,177, 49, 15,165,195,189,186,110,123,199, 14, 29, 58, 16, 0,202, -196, 85, 81, 81,233,167,184, 88, 4,153, 76, 14, 46,151,107, 6,128,167, 43, 39, 77,211,142,157, 58,117, 2, 0,200,229,242,178, - 55,188,130,130, 2, 66, 40, 20, 66, 38,147,129,197, 98,177, 81,179, 95, 99, 25,167,185, 9, 83,193,100,115, 23,140,153, 17,152, - 50,102, 70, 96, 10,147,205, 93, 32, 51, 43, 84,233, 50,205,220,132,169,248,196,231,167, 29, 73,146, 63,187,185,185,197,146, 36, -121, 24,128,227, 7,114,182, 5,176,206,200,200,232,154,135,135, 71,138,177,177,241,117,181, 80,239, 80, 75, 78,142,177,177,241, -245,117,235,214,157,122,242,228,201,208, 63,255,252,179,254,179,103,207, 6, 7, 5, 5, 29, 55, 53, 53, 13, 71,121,191, 68,189, -175,205,250,245,235, 31,124,240,224, 65,219,142, 29, 59, 30, 0,192,253, 72,215, 59, 3, 64, 75,232, 84,145,227,147, 28,119,167, - 86,173, 90,185,240,120, 60,244,232,209, 3, 0,252, 62,132,147,205,102, 15, 94,186,116,169,219,178,101,203, 56, 2,129, 0,215, -175, 95,199,195,135, 15,161, 84, 42, 49,109,218, 52,238,152, 49, 99, 26,152,153,153, 13,214,171,159, 76,243,227,179,231,204,237, - 51,127,214, 36,179,167,239,228, 56,116,237, 29,126,143, 16, 32,171,132,131,254,131,199, 88,244, 30, 56,172, 55,135,107,113, 92, - 95,206, 69, 11, 23,246,153, 60, 62,192, 44, 70, 64,225,220,253, 12,220,143, 23, 66,201,178, 68,223,193, 19,173, 90,116,234,243, - 21, 19,172, 95, 62,245, 49,218, 15,180,159, 61,123,182,221,130, 77, 71,238, 58,181,253,102, 71,118, 62,124,181,133,143, 59, 96, -105,109, 98,242, 77,124,215,174,147,140, 74,235,197, 86,203, 89,142,175,245,192,224,172,124,116,209,246,207,234, 98,141, 70,234, - 97, 69,198,149,159,151,145, 52,129, 89, 35,157,202,221, 7, 42,237,231, 77, 96,232,236,185,115, 89, 22, 86, 86,216,181,107, 23, -164, 34, 81, 57,159,217,238, 46,232,115,205,152,153,218,192,195, 57,182,155, 43, 17,254, 31,124, 95,153, 92,165, 69, 43, 44, 44, -140,238,215,175, 31, 1, 0,161,177,200, 31,220, 20, 27,135,125,187,110, 41, 65, 18,116, 61,207,142, 49,117,220,154,137,108,108, -108, 80, 82, 82, 2,169, 84, 10, 54,155, 13,137, 68,130,119,239,222,225,254,253,251,176,178,178,210,171, 39,133,133,133, 48, 53, - 53,133,169,169,233, 71,225, 92, 60,182, 7,247, 77, 74, 54,247,242,253,155, 93,183, 79,255,173,189, 91, 75,191,103,221,135,205, -122,110,110,231, 36,121,246,236, 25,238,221,187,135,252,252,124,248,248,248,252, 87, 14,230, 67,181, 79,214, 67, 0, 86, 13, 27, - 54,116,190,124,237,182, 85,177,132, 50, 79,202, 84,176, 40,138,130,177, 49, 95,121, 34,244,156,112,232,224,254, 68, 70, 70, 70, - 22,128,135,106,113, 91, 83, 77, 69, 30,128, 38,254,254,254,139,166, 79,159,142,132,132, 4, 76,154, 52, 73,252,240,225,195,220, -142, 29, 59,218,236,223,191,223,104,222,188,121,184,117,235,214,138,176,176,176, 51, 0, 18, 1, 84, 90,171,141,166,105, 54,155, -205,134, 82, 45, 27,228, 42,170, 76,223, 23, 22, 22,130, 22,231,131,205,102, 51, 0,216, 65, 71, 63, 58,138,162,216, 44, 22,171, - 76,100,189,203, 44,196,187,172, 18, 20, 22,203, 32, 22, 43, 33, 19,211, 96, 24,219, 48,129, 36, 7, 0, 73, 80,170, 87, 0, 0, - 0, 32, 0, 73, 68, 65, 84,186, 90, 71,120, 60, 30,148, 74, 37,138,138, 74,187,161,177,148,201,100, 50, 8,133, 66, 48, 24, 12, - 83, 0,230, 0,242,116, 33, 84, 59,185,255,174, 30, 6,196,163, 35, 3,108, 95, 95, 88, 92,110,154,185, 9, 83, 17, 58,175, 41, -195,198,185,197,157,150, 67,127,241, 40,155,246,105,253,179,184,118,118,118, 55, 78,157, 58,213,180, 81,163, 70, 72, 76, 76,244, - 24, 50,100,136,143, 64, 32,104, 9,253,107, 50, 26,147, 36,185,113,204,152, 49,211, 71,140, 24, 65,184,187,187,131,201,100, 66, -169, 84, 58, 39, 36, 36,116, 59,121,242,228,194,131, 7, 15,238, 87,169, 84,223, 65,119,191, 63,146,195,225,156,216,187,119,111, - 23, 31, 31, 31, 28, 62,124, 24, 15, 31, 62,164,218,182,109, 75,142, 30, 61, 26,174,174,174, 62,163, 71,143,254, 93, 42,149,246, -173,165,101,203,181, 67,135, 14, 46, 12, 6, 3, 29, 59,118,100,223,187,119,175, 21,128,123, 31,184, 79, 77,157,157,157,111,249, -249,249,181,188,118,237, 90, 84, 70, 70,134,159, 30,219, 11, 0, 3,157,156,156,130, 44, 44, 44,172,244,184,199,150,164,165,165, -125, 15, 32, 84,199, 69,218,183,110,221, 26,201,201,201,104,210,164, 9,216,108,118, 7,185, 92, 62, 5, 64, 31, 0, 63, 0,136, -213,163,191,238,221,187,119,119,241,243,243, 35, 66, 67, 67,203,252, 67, 73,146,132, 82,169, 4,155,205, 70,251,246,237,201,200, -200,200, 58,143, 30, 61,114,135, 14,195,136, 54,110,126,253, 59,118,238,218,185,139, 79,115,114,115,232,107,168, 40, 21, 24,132, - 18, 76,130, 2,165,224,130,203,102,192,221,179, 13, 35,254,197, 83, 31,153, 84,222, 63,247,213,181,243,186,112,246,233,213,211, -183,105, 19,119,114,251,239,111, 80,144, 22,171, 74,139,187,157, 67, 50, 72, 52,109,253,133,173,123,179,150,140,150, 62,126,172, -244,196, 23,221, 36,146, 46, 61,242, 19,110, 95,251, 20, 23,228, 74,128,225, 92,199,246,155,126, 61,253,216,130,244,116,209,201, -208,243,207, 75, 20,184, 15, 0,183, 0,162, 47,208,220,187, 93,187,174,251, 55,108,176,225,243,249,172, 81, 35, 70, 40,247, 69, - 69, 69,161,138,161,223,149, 0,195,214,209,177,199,212,169, 83, 25,130,244,116,250,228,233, 11,207, 52,124, 40,125, 75,241,110, -238,236,209, 15,162,120,189,134, 41,251, 3, 28, 7, 71,199,166, 83,166, 76, 65, 70,122, 58, 14,135,132, 20, 75,128, 8,141, 21, -235, 28, 3, 59,155,185, 57,142, 91, 48,113, 0,225,194,183,197,212, 21,251, 58,116,147,103,185, 65,240,215,241,215,214, 34,159, -177,200,154, 92,169,208,170,136,223, 98,177,220,140,141,250, 39, 79, 30, 35,179,139,228,162,132,132, 4,216,218,218,130,207,231, -195,194,194, 2, 49, 49, 49,184,126,253, 58, 94,190,124, 9,138,162,208,162, 69, 11,189,122,147,147,147,131,167, 79,159,194,202, -202,234,163,113,186,185,216,225, 91, 23, 59,118,102,110, 33,251,218,195,151, 62,251, 22, 15,110, 70,122, 12, 62,168, 93, 36, 86, - 38,147,225, 63,130,178,232, 66, 23, 23,151, 78,135, 14, 29, 98, 75,149, 48,115,159, 18,241,163, 72,162, 50, 1, 0, 19, 30, 67, - 20, 25,212,248,187,213,171, 87,139,198,143, 31,239,145,146,146,178, 94, 7, 91,255,218,238,221,187,207,167,105,154, 53,123,246, -108, 0,192,152, 49, 99, 10,239,223,191,239, 14, 32,235,250,245,235, 78, 19, 38, 76,120,117,227,198, 13,227,185,115,231, 50,148, - 74,101, 12,147,201,164,195,194,194, 86, 1, 8,124,239,137, 72,146,143,163,162,162,234, 57,185, 54,134,171, 13, 9,223,165, 47, - 75,111,112,198, 20, 82,147,222, 32,238,217, 67, 56, 58, 58, 90,240,249,252,216,212,212, 84,121, 90, 90,218, 66,145, 72,180,187, -134, 62, 70, 71, 70, 70,242, 93, 93, 93, 81, 92, 92,140,212,236, 18,204, 58,109,140, 66,113,169, 17,131, 5, 49, 90,186, 52, 54, - 51, 34,101, 15,179,178,178,228, 50,153,108,153, 80, 40, 60, 84, 29, 39,139,197,202,125,246,236,153,105,221,186,117, 33,145, 72, -232,188,188, 60, 66, 36, 18,161,168,168,136,184,112,225,194,215, 2,129,160,109,253,250,245, 9,103,103,231, 85, 2,129, 64,156, -150,150, 54, 73,151,161, 73,181, 96, 82, 49,153,204,205,147, 39, 79, 30,122,230,204,153,199,161,129, 77, 7,106, 13,151, 88,120, -122,122, 94,110,222,188,153, 83,200, 38,239, 29, 0,126,252, 23,156, 91,227,150, 44, 89,210,212,218,218, 26, 83,167, 78,197,202, -149, 43,177,124,249,242, 70, 83,167, 78,157, 12, 96,171, 30, 60, 70,142,142,142,143,182,111,223,238,209,169, 83, 39, 92,188,120, - 17,199,142, 29,195,219,183,111,149,245,235,215,103,250,248,248, 96,197,138, 21,232,221,187,247,164,153, 51,103,118, 77, 79, 79, -111,165,163,248, 24,191, 98,197,138,129,157, 59,119,198,216,177, 99,165, 55,111,222, 28, 10,224,202,213,171, 87,191,184,117,235, - 86,232,145, 35, 71,140,214,173, 91,215, 99,222,188,121, 83, 1, 4,215, 98,251,191,238,210,165,180,134,114,231,206,157, 17, 20, - 20,212,251, 3,133, 22,199,198,198,230,194,225,195,135, 91, 54,110,220, 24,163, 70,141,106, 53,116,232,208, 11,249,249,249, 61, - 1,232,116, 67,170, 83,167,206,198,179,103,207, 54,172,106,100,161, 50, 72,165, 82,235,111,190,249,102, 67, 82, 82,146, 94, 66, -235,232,209,163,248,254,251,239,209,162, 69,139,230,237,219,183,223, 51,101,202, 20,248,251,251,119,143,137,137,113, 64,105,212, -114,141,224,241,120,205,135, 15, 31,206,121,240,224, 1, 0,192,211,211, 19, 45, 91,182, 68,114,114, 50, 30, 63,126, 12,169, 84, - 10, 7, 7, 7, 12, 26, 52,136,151,148,148,212, 60, 39, 39,167, 70,161, 69,114,141,199, 13,236,215,215,236,220,125, 1, 84,148, - 18,109, 26,154,195,199,195, 30,241,169,133,136,140, 77,133, 74,198,134,185,181, 13, 58,116,237,101,157,145,246,118, 92, 46, 80, -179,191, 22,215,120,220,160,129, 95,153,158,139, 72, 71, 65,122, 28,253,250,225,153,235, 10,137,104, 18, 0, 60,254,243,248, 30, - 71, 27,163,158,238,173,219, 48,252,122, 14,176, 58,125, 44, 99, 92,254, 63, 83,219,239, 61,220,114,193, 94, 87, 86,206,152, 5, - 1,190, 52,203,202,249,161,153, 66,177, 83, 51,175, 55,208,107,225,146, 37,237, 39, 78,158,204,163, 40, 10, 71,126,253,181,240, -105, 84, 84,252,100,128,154, 82, 5,223, 78,192,117,232,192,129, 92, 51,115,115,204,153, 53, 11,102, 10,197,141,178, 93, 2,116, -159, 51,127,126,167, 25, 51,102, 24,237, 89, 53,253,113,239, 9,107, 90, 83, 52, 77,104,134, 41,143, 86,111,138,107, 59, 97,224, - 64,152,153,155, 99,246,236,217, 32,228,242,203,101, 2,138,137, 27,227,191,246,245, 9,232,223, 25, 4, 8, 28, 11,187,131,215, -201,217,207,110, 8,240,230,115, 85, 85, 21, 80,165,143, 86,181, 67,135, 69,114,100,118,255,106,176,192,221,221,189,168, 81,163, - 70, 69,185,185,185,120,254,252, 57,242,243,243, 17, 28, 28,140,184,184, 56, 80, 20, 85,107, 1, 67, 81, 20, 62, 54, 39, 0, 56, -216,152, 99, 84,223,118, 76,169, 68,196,203,206,206, 46, 55,124,244, 31, 18, 90,101, 80, 42,149,188,250,245,235,131, 4, 8, 97, -137,194, 52,227,104, 23, 34,227,104, 23, 66, 88,162, 48,149,201,100,164,169,169, 41,164, 82, 41, 79, 7, 42,214,151, 95,126, 57, -255,204,153, 51,172,181,107,215,194,203,203, 11,114,185, 28,247,239,223, 79, 5,144,165,110,147,126,251,246,237,116,141, 16, 94, -191,126, 61, 78,159, 62, 77,244,232,209, 99, 97,101,231,147, 64, 32,216, 56,101,202,148,188,146,162, 60,236, 29, 38, 70,232,168, -108,252, 60,240, 45, 70,216,156, 66, 94,230, 59,236,219,183, 15, 87,175, 94, 35,174, 92,185,202,190,121,243,166,201, 87, 95,125, -181,163, 78,157, 58, 97,213,117, 50, 61, 61,125,237,140, 25, 51, 10,138,138,138, 80, 84, 84, 4,177, 88,130, 60, 17,240,108, 75, - 83, 60,219,210, 20, 18,202, 8,187,118,238, 38,159, 61,123,102,251,246,237, 91,167,254,253,251,111,225,243,249, 7,171,227, 76, - 75, 75,123,240,237,183,223, 74, 10, 11, 11, 33,147,201,228, 42,149, 74, 38, 22,139, 21,199,143, 31,159,107, 99, 99,211,225,226, -197,139,172,171, 87,175, 49,111,222,188,197,190,126,253,186, 69,183,110,221, 78, 56, 56, 56,252,162,139,165,140,193, 96,108, 11, - 9, 9, 25,183,107,215, 46, 7, 31, 31,159,102, 21,134,162,248, 61,123,246,172,247,235,175,191,214, 9, 10, 10, 90,136,210, 0, -148, 79, 10, 91, 91,219,153, 3, 7, 14,196,174, 93,187,112,254,252,249,121, 59,118,236,192,151, 95,126, 9, 39, 39,167,111,161, -251,176, 23, 0,252,184,117,235, 86, 15, 15, 15, 15,140, 25, 51, 70, 54,105,210,164,239, 14, 29, 58, 84, 63, 60, 60,156,253,203, - 47,191,212,155, 58,117,234,236,128,128, 0, 73,131, 6, 13, 16, 28, 28,220,144, 36,201,109, 58, 93,223, 14, 14,115, 71,140, 24, -129, 77,155, 54,225,230,205,155,131, 81,250, 64,149, 1,184,116,247,238,221,254,235,214,173,195,224,193,131,225,236,236, 60,187, - 54,150,167,166, 77,155, 46,235,211,167, 15,194,195,195,209,170, 85, 43,116,232,208, 97, 30, 0,219, 90,238, 78,210,212,212,244, -196,161, 67,135,124,235,213,171,135, 53,107,214,192,205,205, 13, 7, 15, 30,244, 53, 49, 49, 57, 1, 29,221, 55, 44, 44, 44, 76, -141,141,141,177,112,225, 66,122,240,224,193,121, 53,125,230,205,155, 71,115,185, 92, 88, 89, 89,233, 26,248, 98,196,227,241, 58, -122,121,121,225,254,253,251,184,122,245, 42,150, 46, 93,138,185,115,231, 34, 59, 59, 27,195,135, 15, 55, 6,224,175,199,118,219, -219,217,217,161,176,176,180, 46,188,151,151, 23,158, 60,121,130,236,236,108, 56, 59, 59, 35, 35, 35, 3, 54, 54, 54,104,220,184, - 49, 40,138,178,215,141,146,246,178,181,182, 64, 86,190, 20, 76, 40,209,218,221, 22, 55,158,231,226, 93,182, 12,246, 54,150,200, -200,202, 70, 29, 27, 30, 92, 92,234,130,166, 41, 47,157, 20, 48,131,108,205,229, 25, 33,175, 72,142,180,216,155,185,114,149,116, - 74, 65,226,221,148,130,196,187, 41,114,169,100,202,227, 59, 87,115,235, 57, 24,193,197,197, 5, 4, 77,181,251, 20,215,227,144, -186,112, 49, 49, 98,142,185,250,243, 50, 34,108,255, 98, 66,154,251,174,109, 31,135, 82,203,178, 29, 80,127,200,240,225, 29,191, -251,238, 59, 94,102,102, 38, 21, 48,108, 88,222,218,192,192,107,127,212,240, 98, 80, 12, 52,234,217,179, 39, 72, 0,127, 92,185, - 34,202, 0, 82, 1,192, 1,112, 25,240,205, 55, 93,150, 44, 90,100,148,147,155, 75,221, 79, 40, 62, 23,151, 69, 15,178, 86,161, -190, 46,254, 89, 42,192, 91,195,123,249,242,101, 90, 12, 60, 6, 0, 63, 23,124,219,171,147,167,207,232,129, 93, 32,200,202,199, -236,181, 63, 99,207,201, 91,151, 45, 20,244, 23,255,161, 71,241,228, 90, 9, 45,245,208,207,123,211, 74, 74,222, 31, 61,248, 80, - 1,243,119,112, 86,134,255,162,208,210, 64,161, 40, 29, 37,145, 41, 40,200, 20,148,230,173, 22, 98,177, 88,103,138,203,151, 47, - 31,158, 53,107, 22,182,108,217,130, 87,175, 94,129,205,102,195,203,203,139, 15,192, 84,115,207,111,221,186,181, 61, 73,146,136, -143,143,199,230,205,155, 49,126,252,120,250,222,189,123, 7, 81,121,190,148, 39,121,121,121, 59,167, 76, 26, 95,144,159,249, 14, - 10,113, 62,178,210,222, 64, 42, 42,192,154,245, 27, 81,162, 96, 34, 67, 40, 71,134, 80, 14,146,107,141, 61,251, 15, 49,154, 54, -109,218,135,193, 96,244,171,166,159,247, 51, 51, 51,247, 79,155, 54,173, 32, 35, 35,163,108,251,100, 10, 26, 50, 69,249,243,213, -216,216, 24,219,182,109,179,112,119,119, 31,200,100, 50,187, 85,195, 41, 72, 73, 73,137,155, 54,109,154, 44, 51, 51, 19, 66,161, - 16,231,206,157,235, 95,175, 94, 61,171, 13, 63,110, 33, 68,114, 38, 50, 10,228,200, 40,144,131, 99,106,143, 19,161,103, 24,141, - 27, 55, 14, 96, 50,153, 29,106, 18, 89, 71,142, 28, 25, 61,108,216, 48,179, 31,127,252, 49,239,236,217,179,187, 0,104, 31,144, -248,109,219,182,157, 60,113,226, 68,209,252,249,243,173,131,130,130,230,125, 98,177,213,109,216,176, 97, 77, 40,138,194,169, 83, -167,158, 1,216,122,230,204,153, 71, 82,169, 20,195,135, 15,175,175, 30, 70,210, 5,109, 3, 2, 2,166,251,250,250, 98,206,156, - 57,242,107,215,174,181, 6,176, 5,165, 67,185, 52,128,100, 0, 59,110,221,186,213, 98,230,204,153,210,118,237,218, 97,236,216, -177,227, 1,248,214,192,219,113,196,136, 17, 30, 20, 69,225,248,241,227, 79, 1, 92,172, 48,255,122,104,104,232,125,153, 76,134, -145, 35, 71, 54, 0,160,207,141,156,205,229,114, 79,173, 94,189,218, 50, 45, 45, 13,163, 71,143,150,198,199,199, 35, 48, 48,208, -200,194,194,226,162,214, 53,160, 51,184, 92,238,190,159,126,250,105,160,183,183, 55,166, 77,155, 38,219,189,123,247,172,233,211, -167,203, 90,183,110,141, 93,187,118, 13,228,112, 56,122,149,232, 72, 79, 79, 47,136,141,141,181,169,233,147,154,154,170,107,120, -190,177,169,169,105,132,167,167,103,161,151,151, 87, 27,165, 82,137,152,152,152, 55,135, 15, 31,166,188,188,188,176,115,231, 78, - 4, 5, 5,161, 95,191,126, 96, 48, 24, 58, 11, 45, 6,131, 1,185, 92, 14, 99, 99, 99, 48,153, 76,188,121,243, 70,147, 90, 6, -108, 54, 27, 0, 96, 98, 98, 2, 35, 35, 35,144, 36,169, 83, 52, 26, 65,128, 46, 44, 81,128,197, 34,193, 36, 41,196, 37, 11, 33, - 87, 80,224,177, 25, 96, 49, 9,128,166, 96,105,194, 2,143,195, 0, 73, 16,148,142,156, 16,138,228,224,176, 73,176,216, 28,130, - 84,170,140,202, 30,142, 76,149,145,145, 17,135,176, 53,231,130,199,254, 23,149, 5, 38, 74, 29,203,199, 1, 44,147,186,117,135, -110,218,188,153, 83, 88, 92,140,193,131, 7,231, 37, 61,122, 20, 34, 6, 30,117,173, 33, 72,137,100, 50,221,253,186,118, 69,100, - 84, 20,138,242,243, 95, 3,165,206,241, 28, 39,167, 97,219,182,109,227,136, 37, 18, 12, 30, 52,168,224,213,157, 59, 71, 82,138, - 17,118, 60,185, 84,136,213,120,220,217,108, 71, 13,175, 48, 63, 63, 31, 40, 77, 33,225, 96,103,186, 97, 70, 64,111, 20,149, 72, -176, 96, 99, 8, 21, 21, 39,248, 54, 60, 21, 95,157, 73,135,240, 63,246, 24,158, 92,225, 3, 64,135,132,165, 26,235, 82, 77, 98, - 69, 42,149,126,116, 1,244,161,156,149,137,196, 15,229,252, 55,130,201,100, 74, 94,190,124,201, 49,183,113,162,108,204, 88,249, -245,198,223,177, 0, 0,107, 83,166, 80,174, 82, 80,233,233,233,224,114,185, 18, 29,135, 27, 38,237,219,183,111, 13,128,102, 76, - 38, 51,236,208,161, 67, 68, 72, 72,136,213,136, 17, 35, 18, 98, 99, 99,211, 60, 61, 61, 93, 15, 29, 58,100, 14, 0, 59,118,236, -160, 79,156, 56,209, 27,165, 41, 51,170,204,227,146,153,153, 25,152,155,155,123,111,198,140, 25,193, 28, 14,199,202,196,196,196, - 38, 60, 60,156,144,200,105,180, 93,146, 92, 22,137,104,110, 68,226,246, 98,115, 76,158, 60,153, 17, 27, 27,187, 62, 45, 45, 45, -172, 26,206,133, 5, 5, 5,225,175, 94,189,218, 98,225,220,210,206,196,117,137,133,207,226,120, 0,128,171, 45, 11,164,250,190, - 88, 80, 80,128,236,236,108, 76,159, 62,221, 42, 33, 33, 97, 97, 90, 90,218,141,106,172, 90,183,114,114,114, 82, 95,188,120,225, -199, 98,177, 56, 38, 38, 38,109, 35, 34, 34, 8,137,140, 66,243,133,201,200, 43, 46,237,167,181, 41, 19,143, 87, 59,224,219,111, -191,101,190,126,253,122,163, 64, 32,232, 92,233,205,140, 36,131,180, 69,214,130, 5, 11,162, 1, 52, 0, 80,110,104, 84,165, 82, - 17, 35, 71,142,124, 14,192,107,254,252,249,214, 52, 77,207, 91,184,112, 97, 30,128,189,255,244,185,100,110,110,190, 97,202,148, - 41, 56,113,226, 4,242,243,243,183, 1, 64, 97, 97,225,214,163, 71,143, 30,159, 52,105, 18,126,253,245,215, 13,217,217,217,127, -160,230, 80,237, 47,135, 15, 31,142, 75,151, 46,225,207, 63,255, 92, 6, 32,166,138,118,175,194,195,195, 23,158, 61,123,118,251, -136, 17, 35,240,243,207, 63,247, 1, 80,157,131,108,207,222,189,123,227,226,197,139,200,205,205,221, 85, 89,131,130,130,130,221, -231,206,157,107,223,187,119,111,172, 95,191,190, 39,128,235, 58,108,186,135,133,133,197,161,237,219,183,183,245,246,246, 70, 64, - 64,128, 68, 46,151,247,153, 63,127,254,249, 99,199,142,153, 29, 62,124,184,205,228,201,147, 31,168,115,190,221,215,201,148, 69, -146,235, 54,111,222, 60,193,207,207, 15,243,230,205, 83, 94,190,124,121, 0,128, 43,127,252,241, 71,194,130, 5, 11, 46,108,222, -188,153,177,105,211,166, 9,179,103,207,206,166, 40,234, 83,137,235,213, 59,118,236,104,223,171, 87, 47,188,121,243, 6,247,239, -223,135, 92, 46,255, 53, 34, 34,226,118,163, 70,141, 86,203,100,178,243, 38, 38, 38, 99,204,204,204, 60, 91,182,108,249,197,227, -199,143,141,161,155,159, 94,102, 98, 98,162,165,133,133, 5,148, 74, 37,158, 61,123,134,186,117,235, 66, 46,151,227,237,219,183, -240,246,246, 6,155,205, 70,102,102, 38,180,172,229, 53,136, 34,242, 89, 66, 82,122, 3,107, 51, 19, 64,197,195,147,248, 84,216, -217, 90, 65, 69,144,200,200, 16,160,101, 19,103, 16, 4,129,130,220, 12, 16, 4,241, 92, 23, 78, 21, 77, 69,190, 75,207,170, 99, - 99,198,133,119,251, 94, 54, 17,127,100,135,152, 55,232, 52,153,201, 32, 24, 28,174,233,222, 9, 99,199,218, 82, 20,141,130,220, - 76, 48, 73,242,225,167, 56, 64,167,222, 33,165,171, 27,239, 73,175, 9,107, 90, 18, 52,104,177, 28,135,127,206, 68,190, 49,208, -114,199, 15, 63, 88,218,216,218, 34, 32, 32,128,202, 77, 75,187, 86,162, 99, 98,229, 6,141, 26, 57,152,154,153,225,238,221,187, - 96,148,250,216,226, 32,224, 17,180, 96,129,141,189,163, 35,198, 79,152, 64,101,190,123,119, 93, 12,164,235,211,215, 6,110,110, - 44, 13, 47,169,230, 21, 48, 48,107,254, 0, 95,174,137, 17, 23,235,246,156, 65, 74,142,232,120,132, 0,123,254,163,246,142,125, -213, 90,180,170,114, 62, 43,117,170, 54,174, 86,172,240,120,188, 50,107,138, 30,111,122, 31,157,179, 38,252, 29,156,159, 16,139, - 1,156, 5,176, 56, 37, 37, 37,110,194,132, 9,114,165, 92, 90,116,111, 77,131, 69, 81,235,235, 77,139, 8,228, 79,251,125,150, -197,162, 18, 97, 94,209,142, 29, 59, 20, 41, 41, 41,113,218,203,212,192,253, 14,192,197, 95,126,249,101,247,169, 83,167,224,229, -229,133,152,152, 24,123,145, 72,212,234,249,243,231,214, 30, 30, 30, 8, 9, 9,193,137, 19, 39,182, 0,184, 90,157,200,210, 64, -169, 84, 94,203,200,200,104,156,156,156,220,208,210,210, 82, 97,105,105,137,138,145,136,133, 98, 10,185, 5, 66, 88, 91,219,192, -220,220,188,190, 14,226,252, 98, 70, 70,134, 59,101,213,164,139,123,206, 54, 97,228, 58, 23, 68,174,115,193,197,133, 78,224, 91, -114,144,159,159,143,236,236,108,100,103,103,131, 32, 8, 40, 20,138,166, 58,112,190, 21, 8, 4, 7,222,189,123,119,214,193,193, - 1,102,102,102,160, 1,100, 20, 40, 16,189,201, 3,209,155, 60,144, 81,160, 64, 97, 81, 17,234,213,171, 7, 51, 51,179,170,134, - 40,200, 58,117,234,244, 29, 54,108,152, 25, 0,168, 5, 84,119,154,166,167, 85,242,153,170, 84, 42, 59,105,218,126,255,253,247, -214, 0,122,255,195,231, 19, 3,192,140, 73,147, 38,181,225,241,120,216,185,115,231, 91, 0, 71, 52,247,250,221,187,119,199, 3, -192,172, 89,179, 60, 1,204, 67, 21,153,160,203, 76, 67,108,118,235,166, 77,155, 34, 34, 34, 2, 0,206,212,176,238,208,123,247, -238,161, 81,163, 70,224,241,120,109,107,104, 91,223,197,197, 5,241,241,241, 0,240,164,138, 54, 79,226,227,227, 75,135,123, 8, -162,190, 14,219, 62,176, 87,175, 94,207,110,220,184,209,182, 99,199,142,152, 48, 97,130,236,193,131, 7,125, 1,220,126,242,228, - 73,183,145, 35, 71,138,220,221,221,113,235,214, 45,143,145, 35, 71,222, 35, 73,114,141, 14,156,227, 87,173, 90,181,248,235,175, -191,198,170, 85,171,232,147, 39, 79, 6, 0,184,162,158,119,249,248,241,227,163,215,174, 93, 75, 15, 26, 52, 8, 43, 87,174, 92, - 12, 96, 90,117,100, 34,145, 72,168, 82,169, 32, 18,137,116, 50,201,235,218,222,214,214,246,203, 94,189,122, 97,233,210,165,168, - 83,167, 14,206,159, 63, 79, 3, 8, 3, 16, 46,147,201,186, 0,216, 44, 18,137,126,143,136,136, 64,207,158, 61,217, 40, 95, 98, -164,186,245, 63, 59,122,244,168,212,194,194, 2,174,174,174,104,208,160, 1, 50, 50, 50,144,148,148, 4,111,111,111,180,110,221, - 26, 74,165, 18, 7, 14, 28,144, 20, 21, 21,233,148,147, 79, 41, 19, 29,190,122,225,180,208,198,140, 11,103,123, 11,212,171, 99, -141,226,130, 28,100,103,164,163,117,211,186,232,218,186, 30,114,132, 50, 92, 14, 59,157, 95, 84, 84,114, 88, 39, 19,190,180,228, -208,181, 63,206, 11,173,204,216,104,220,196, 19, 35, 39,204,106,217,178,149,207,213,118,237, 58, 93,254,113,195,186,230,221, 59, - 52, 37, 82,115, 36,184, 20,118, 38, 95, 88, 88,120,232, 83,220,232, 87, 2, 12,137,133,251,237, 93,103, 35, 15, 52,235, 51,233, - 64, 92, 42,182, 1,128,130,193,240,232,251,229,151, 72, 77, 77,197,233, 83,167, 4, 37,192, 83, 93,249,140,140,140, 72, 0, 16, - 10,133,224,170,253,238,148, 64,147,175,190,250, 10,217, 57, 57, 56,122,228, 72,246, 37, 32, 74,159,126,246, 7, 56,198, 70,165, - 6, 65,161, 80, 8, 2, 40, 4, 0,130,137,190,237,188, 26, 33, 59,175, 16, 55, 30,198, 21,215, 19, 99,122,117, 60,159,177, 35, -124,237,124,180, 0,228,204,155, 55, 15, 92, 46, 23,124, 62,191, 76, 28,105,196, 10,135,195, 1,159,207,135, 82,169,196,241,227, -199, 1, 32,167,218, 55, 60, 64, 58, 96,218,122, 74,170,160, 75, 88, 44,214, 71,225, 84,191, 57, 74, 7, 47,248,153,250,227, 94, -229, 65, 49,181,225,252, 12,208, 78,157, 19,171, 29,128,252,164,164,164,212,161,131, 7, 8,147, 19, 94,100,136, 10,210, 5,133, -185, 41,130,148,183,207, 51,150, 44,156, 39, 76, 77, 77, 77, 65,105, 46,173,118,233,233,233,154,101,116,193,188,161, 67,135,254, - 52,105,210, 36, 58, 58, 58, 26, 0, 16, 25, 25,137,177, 99,199,210,163, 71,143,222, 6, 96, 81, 45,250, 45, 18,139,197,229,172, - 33,114, 21, 85, 54,228, 87, 88, 88,136,244,244,116,200,100, 50,157, 21,241,171,203,155, 94,230, 37, 61, 86,120,186,154,192,211, -213, 4, 30, 46,198, 32,148,197,101, 34, 43, 59, 59, 91,243,230, 44,209,163,159,133, 82,169,180, 92, 63,181,135, 38, 11, 11, 11, -145,145,145, 1,149, 74, 85,213,131,140, 74, 75, 75,187,124,226,196,137, 34, 0,248,241,199, 31,243, 8,130,248,147, 32,136,159, - 42,249,236, 97, 50,153,119, 53,109, 55,109,218,148,135,247,135,196,254, 78,124,237,237,237,157,191,120,241,226,157,179,103,207, -198,158, 61,123, 32, 16, 8, 22,225,175, 92, 60, 84, 78, 78,206,130, 93,187,118, 97,220,184,113, 88,190,124,249,166, 86,173, 90, - 21, 2, 24, 89, 21,161,157,157,157, 51,147,201, 68, 84, 84, 84, 33,128, 55, 53,172, 63, 35, 42, 42, 42,147, 32, 8,240,249,124, -183,234, 26, 90, 91, 91, 55, 52, 51, 51, 67, 90, 90, 26,160,126, 99,174, 4, 73,233,233,233, 52,135,195,129,147,147, 83,163,154, - 54,222,202,202,106,193,129, 3, 7,152, 47, 94,188, 64,247,238,221, 83,111,221,186,213, 19,128, 38, 36, 61, 42, 50, 50,210,183, - 91,183,110, 47,175, 94,189,138,141, 27, 55, 18, 45, 90,180,152, 86, 19,167,171,171,235,212,241,227,199, 35, 56, 56, 24,123,247, -238,157, 6,224, 84,133, 38,199,118,237,218, 53,107,239,222,189,152, 48, 97, 2,234,215,175, 63,178, 58,190,228,228,228,133,126, -126,126,145,175, 94,189,210,169,226,129,142,237,187,249,248,248, 52, 20,139,197, 56,116,232,208,155,134, 13, 27, 62, 58,117,234, -212, 60,188,255,192,254,253,244,233,211, 24, 53,106, 20, 90,180,104,113, 8,192, 8, 93, 46,203,216,216,216,148,235,215,175, 83, -108, 54, 27,174,174,174,232,215,175, 31, 2, 2, 2,208,188,121,115,200,229,114,156, 62,125,154,122,254,252,121,170, 76, 38,211, - 41,151, 82,238,171,155,231, 19, 19,255,199,222,121,135, 71, 81,181, 81,252,204,246,190,155,186, 73, 72, 72, 8, 45,149,142, 84, -233,161, 72, 23, 81, 68, 16, 43,162,130, 72,177,125, 34, 86, 4,105, 34,136, 20, 69, 65, 4, 20, 69, 90,164,136, 40,145, 78, 2, -132, 0, 33,129,244,186,233,101,179,125,103,238,247, 71,138, 33,164,236, 38, 40,150,251,123,158,121, 38,185,179,115,246,206,157, -118,246,189, 45,225,212,197,115, 81, 54, 1,159, 7,127, 31, 55, 60, 24,209, 13,207, 76,238,143, 30, 33,190, 72,203, 51,226,248, -241,159,109, 41, 41, 73,103, 28,233,113, 88,173, 25,127, 45,246,244,213,139, 39,237, 66, 1,131,144,224,142, 88,244,191, 87, 93, -151,188,253,154, 75,199,118,254,136, 77, 46,197,207, 71, 15,217,178, 51, 51,126,189, 87, 61, 14, 79, 0, 34,165,132, 81,240,121, - 60,176, 60, 73, 5,191,170, 35, 77,167,176,176, 32, 47,111,111, 68, 70, 70,130,231, 68,143,208, 19,128, 72,169,172,172, 5,215, -235,245,168,214,107, 31, 28, 28,236, 31, 16,128,159, 34, 35,193,231,184,235,131,156, 28, 96,244, 70,101, 53,116,141, 46, 3,152, - 94,104, 13, 85,251,214,218, 96, 87,141, 2,231, 98,111,194,108, 35,231,191, 41,198, 61, 29,143,236, 79,100, 38,154, 89,117,184, - 98,227,198,141,189,190,248,226,139,225,243,231,207, 87,206,152, 49, 3, 82,169, 20, 6,131, 1,126,126,126, 96, 89, 22,135, 15, - 31, 70,116,116,180,158,227,184,159,113,231,176, 1, 17,168,213, 75,227, 72, 18,100,149,126,203,208,107,223,195, 15,223, 21, 77, - 0, 80,222,228,212,133,109, 44,219,215,238, 62, 57,105,199,145,139,204,203, 83, 7,241,122, 4,183, 6, 0,120,121,121, 65,173, - 86, 59,173,121, 23,248,211, 53,107, 87,235,230,230,230,222,200,205,205,205,123,246,217,103, 67,170, 27,190, 75, 36, 18, 83, 85, - 36,171,184,190,125, 28,200,167, 21,192, 11, 95,124,241,197,254,210,210,210, 35,175,188,242, 10,150, 44, 89,130, 3, 7, 14, 12, - 0,112,170,153,199,206, 22, 23, 23,151,156, 63,127,222,171, 67,104,119,180,213, 10, 49,240,173, 68, 16, 66,224, 46, 39, 40, 47, - 41,194,165, 75, 23, 81, 94, 94,126,206,153,124, 90,173,214,146,188,188, 60, 15,173, 86,139,162,162, 34, 20, 20, 20,212,152,172, -226,226, 98, 20, 21, 21, 17,134,185, 99,204,150,198, 52, 43,242,242,242, 12,241,241,241, 98,175,214, 29,208, 78, 43, 66,239,255, -221, 0, 8,129,191, 27, 15,229,101, 37, 56,115,230, 12, 74, 75, 75,127,107, 72,147,227,184, 5,211,166, 77,227, 3,120,252,149, - 87, 94,113, 3,208,245,213, 87, 95,253, 25,117,122, 22, 10, 4,130,143,183,111,223,222,169,186,138,241,181,215, 94, 91, 13,224, -139,191,234, 90,114,119,119, 95, 16, 25, 25,169,178, 90,173, 88,187,118, 45, 86,175, 94,189, 5,119, 14, 84, 25,249,233,167,159, -174,231,241,120, 47,206,158, 61, 27,207, 61,247,156,188,103,207,158,243,115,114,114,190,169, 79, 51, 43, 43,107, 81,143, 30, 61, - 22,231,229,229,125,232,144, 89, 78, 76,156,217,163, 71,143, 69,121,121,121,203, 27, 59, 71, 10,133, 66,193,178, 44, 82, 82, 82, -138,129, 6,219,119,152, 82, 82, 82,178, 88,150,245,147,203,229,110, 77, 93,159,197,197,197, 31,246,236,217,243, 29,157, 78,119, - 20,192, 7,245, 24,242,203, 57, 57, 57,225,115,231,206,157,179,108,217,178, 73,185,185,185,187,154,210, 76, 75, 75,251,112,200, -144, 33,111, 37, 36, 36,108, 69,195, 85,192,159,190,251,238,187,214,237,219,183, 63,159,146,146,178,180, 9,205,131, 5, 5, 5, - 7,157, 56,191, 13,125,190, 70,147,207,231,191,186,108,217, 50,222,198,141, 27, 65, 8, 89,201,178,108, 67,249,140,221,187,119, -239,182,254,253,251,207,216,189,123,183, 52, 60, 60,252, 57,179,217,188,179,169,235,211, 96, 48,236,217,189,123,247,164,216,216, - 88,191, 25, 51,102, 72,131,130,130, 96,181, 90,145,147,147,131,141, 27, 55,154,226,226,226, 50, 75, 74, 74,246, 56,243, 12,177, - 91,202,166,158, 62,190,111,103,106, 98, 92,223,193,163, 38,184, 90,172,126,144, 20,242, 81, 82,152,139,195, 7,247, 20,167,164, - 36,157, 49, 24, 74,166, 58,163,105, 53,151, 62,122,230,215,253,187, 50, 83,226,251, 12, 28, 50,218,213,100, 9,128, 68,196, 67, -161, 46, 11,135, 35,247, 21,165,164, 36,255,110,178,153,159,184, 87,207,121,126, 32, 62,224,231, 70, 63, 59,107, 92, 55,200, 92, -253, 46, 9,129,181,253, 1,153,135,151,151,168,234,222,129,178,178,205,163, 67,154, 58, 64,220,161,170,150,202, 96, 48, 64, 8, - 88,158, 4,132,158,158,158, 50, 0, 72, 72, 72,128,188,178, 86,195,169,124,234, 1,133,188,150, 46, 15, 48, 20, 10,224,219, 94, -173, 96, 0, 32, 51,183, 16, 22, 91,163,239,141,127, 58,155,107, 25,174,205,205, 17, 16, 1,136, 80, 42,149, 75, 22, 47, 94,188, -242,220,185,115, 43,199,142, 29,187, 82, 34,145, 44,169, 42,108, 81, 35, 39,226, 47,211,188,175, 21,220,134,180, 99,162, 70,180, -103,184, 89, 3, 92,217, 39,122, 43, 44, 67,135, 14, 93,223,194,124,182,228,102,249, 51, 53,247,217,108, 54,130,202,106,187,125, -104,184, 74,240,141, 90,219,115,211,211,211, 73,213,223,206,228,211, 99,202,148, 41, 92,121,121, 57,121,228,145, 71, 8,154,158, -194,167, 81, 77,137, 68, 50,100,224,192,129, 54, 93,126, 17,185,145,156, 69,206,198, 92, 35, 71,142,159, 38,187,246, 68,146,117, -235, 55,145, 46, 93,186, 88, 0, 4, 56,163, 41, 16, 8,134, 14, 25, 50,164, 80,167,211,145,248,248,120, 18, 21, 21, 69,190,255, -254,123,178,105,211, 38,178, 97,195, 6,210,186,117,107, 29, 0, 47,103, 52,101, 50,217,132, 7, 30,120,192, 86, 82,102, 32, 41, - 89,133,228, 74,124, 10, 57,117,254, 10, 57,124,252, 20,249,102,231,110, 18, 22, 22,102,114, 64,147,207,231,243,215,237,218,181, -171,140, 16, 66, 38, 76,152,144,137,219, 7, 82,109,187, 96,193,130, 60, 66, 8, 89,190,124,121, 33,234,111, 8,255,103, 95, 75, -163,124,125,125,111,136, 68,162, 72, 0,143, 55,177,223,163, 2,129,224,128,183,183,247, 5, 0, 15,222,131,251,104,172, 86,171, - 61, 11,160,169, 25, 14,170, 63, 55,241, 95,114,191,255, 25,154, 67, 5, 2, 65, 20,208,248, 36,194,181,158,215,239,243,249,252, -159, 0, 12,115, 50,159, 29, 61, 60, 60, 30,113,117,117,125,217,213,213,245,101,173, 86,251,136, 88, 44,238,216,146, 99,119,239, - 24, 49,206,191,251,248,189,173,187,142, 73,243,239, 54, 54, 45,176,199,132,189,238, 29, 35,198,181, 84, 51,160,199,132,125,254, -221,198,166,251,119, 27,151,218,246,190, 9,123, 61,130, 35, 30,184,151,231,232,113, 95,180, 26,222, 22,118, 18,245, 22, 33, 81, -111,145,136,182,224,250,186, 32,172, 23,160, 26, 25, 17,177,138,176,236,170, 73, 19, 39,174,234, 0,184, 19,128, 95,119,169, 79, -179, 59,160,174,217,119,194,132, 85,237, 0,143,225,128,124,208,128, 1, 43, 9,203,174,154,246,232,163,171,252, 1,239,250,244, - 26,210, 36, 0,223, 23,104, 85, 91,215, 3,104, 63, 57, 16,225,111,140, 11, 36, 36,234, 45,242,238,195, 65,164,135, 23, 30,111, - 66,179,161, 72,209, 63, 58,162,229, 44,138,170,135,235,210,170,181,226, 46, 92,132,119, 93,179,143, 15,130, 34,218, 51,241,163, -131, 5, 69,168,236,146,172,248, 23, 62, 36,183, 90, 44, 22, 98, 50,153,136,193, 96, 32,122,189,190,174,129,170, 49,100,217,217, -217, 36, 51, 51,147,164,167,167,147,212,212, 84,130, 63,218,222, 56,156, 79,181, 90,253,197,195, 15, 63,204, 10,133,194,117,119, -227,216,221,220,220,150,246,238,221,219,250,201, 39,159,144,189,123,247,146,207, 63,255,156,204,158, 61,155,116,234,212,201,236, -226,226, 50,181, 57,154,222,222,222,139,130,131,131, 11,183,108,217, 66,190,249,230, 27,178,102,205, 26,242,230,155,111,178,126, -126,126,185, 42,149,106,100,115, 52,181, 90,237,230,251,239,191,223,186,121,243,102,242,243,207, 63,147, 29, 59,118,144, 5, 11, - 22,144,144,144, 16,179, 66,161,120,200, 65, 77,190, 64, 32, 88, 53,107,214,172,220, 86,173, 90, 69,214,217, 38, 15, 11, 11,187, - 48,109,218,180,108, 0,175,253,139,174, 79,170, 73, 53,169,230,159, 96,180, 30,107, 5, 95, 2,240,229, 34,209,163,131, 6, 12, - 88, 41, 2, 30,117,214, 20, 73,249,252,201,253,123,247, 94, 41, 2,166, 86,127, 86,202,231, 79, 30, 52, 96,192, 74, 33,159, 63, -189, 33,189,198, 52, 9,192, 23, 9, 4,175,245,239,219,119,149, 0,248, 95,117,218,208,182,204,245, 5,163, 90,147, 1, 1,204, -205,233, 90,200,255,197, 70,235,174, 35,248, 19, 46,194,127,138,230,223,229,166,238, 80,101,152,246, 57, 17,209,218,135,202, 89, -212, 59, 52, 51,159,178,187,124,236,157, 61, 60, 60, 14,117,232,208, 33,191, 77,155, 54,217,174,174,174, 59, 1,248,181, 80, 51, -220,219,219,251,107, 47, 47,175, 68, 31, 31,159, 88, 15, 15,143,143, 81, 57,234,124,179, 53,133, 66, 97,111, 47, 47,175,223, 2, - 3, 3, 75, 2, 2, 2,116, 30, 30, 30,187,234,137,100, 57,162,233,131,250, 31, 42,162,170,109,244,165, 67, 53,169, 38,213,188, -205,192,140,104,135,101,195,219,194, 62,188, 45,216, 17,129,248,184,182, 65, 25, 11,200,154,107,138,158, 0, 36,117, 63,223,148, - 94, 83,154, 4,224,247, 3,148,117,247, 25,237,135, 48, 7, 53,255,233, 17,173,234,231,188,115,195, 59, 52,128,253, 79,200,228, - 63, 69,243,239,194, 77, 52,210, 24,185, 22, 75,239,226,119, 26,239,242, 49, 92, 41, 40, 40,120,160,160,224,174,246, 77,184,154, -155,155,251,248,221, 20,180,217,108,231,116, 58,221,224,187, 32,213, 80,215,107, 43, 28,236,150, 77,161, 80,254, 59, 48, 0,139, - 36,188, 30,209, 17,107, 5, 44,120,135,147,145, 85,167, 75,158,145,105,142,102, 37,236,214,122,158,241, 76,115,243,249, 7,250, - 59, 52, 50,113,141,249,239,156,182, 28, 84,182,209,106,177,209,162, 80, 40, 20, 10,133,242, 23,112, 44,145,254, 16,251, 7, 16, -137,219,163,111,145,181,140,104,131,161, 79,103,122, 82, 52, 39,124,122,140,106, 82, 77,170, 73, 53,169, 38,213,164,154,255, 57, -205,106, 26,154, 59,245, 70,157,255,155,213,139,239,191, 2,173,103,167,154, 84,147,106, 82, 77,170, 73, 53,169,230,191,157,102, -143,163, 69,161, 80, 40, 20, 10,133, 66,105,156, 6,163,110,212,104, 81, 40, 20, 10,133, 66,161,180, 12, 31, 84, 78, 81, 21,137, - 63,166,170,218, 76,141, 22,133, 66,161, 80, 40, 20, 74,203, 25,131, 63,122, 27,222, 22,221,226,209,178,161, 80, 40, 20, 10,133, - 66,105, 49, 51,107,173,105, 27, 45, 10,133, 66,161, 80, 40,148,187,132, 99, 61, 35, 15, 30, 60, 72,104, 89, 81, 40, 20, 10,133, - 66,185, 87,252, 67,189, 72,117, 20,235,142, 89, 62,104, 68,139, 66,161, 80, 40, 20, 10,165,101,108,174,101,184,110, 75,163, 70, -139, 66,161, 80, 40, 20, 10,165,101, 84, 27,172, 72,212,153, 82,141, 7,208, 42, 67, 10,133, 66,161, 80, 40,247,150,127,184, 23, -217, 92,181,220, 49, 93, 82,117,175,195,193, 85, 7, 56,152,158,106, 10,133, 66,161, 80, 40,247,128,127,178, 23,241, 65, 3,109, -180, 40, 20, 10,133, 66,161, 80, 40, 45, 99,102,157,117, 13, 12, 45, 27, 10,133, 66,161, 80, 40,148,187, 98,180,106, 67, 39,195, -166, 80, 40, 20, 10,133, 66,249, 39, 67,103, 54,167,154, 84,147,106, 82, 77,170, 73, 53,169,230,127,129,153,168, 51, 42, 60, 64, -135,119,160, 80, 40, 20, 10,133, 66,185, 27, 38,107,115,125,255,211,185, 14, 41, 20, 10,133, 66,161, 80,254, 36,104, 68,139, 66, -161, 80, 40, 20, 10,165,101,108, 70, 61,163,194, 83,163, 69,161, 80, 40, 20, 10,133,114,247,204,214, 29,208,170, 67, 10,133, 66, -161, 80, 40,148,150, 49,179,161,255, 25, 52,220,115,224,152, 19, 95,208,156,222, 7,199,168, 38,213,164,154, 84,147,106, 82, 77, -170,249,159,211,108, 74,251, 24,254,121, 52,216, 24,254,207,134,118,125,165,154, 84,147,106, 82, 77,170, 73, 53,169,230,191,157, -234, 41,120,170,151,154,169,120,104, 27, 45, 10,229, 31, 14,217, 13, 62,138,131, 3, 65, 72, 43,240,197, 57,200,185,146,196,188, - 3,174,197,154,186,176, 0,200,108, 94,176, 75,243,161,139, 77,110,169, 38,133, 66,161,252,139,201, 65, 3, 17, 44,106,180, 40, -148,127, 58,249, 33, 65, 16, 96, 41,120,240, 1,177,222,130,103,216, 82,224, 90, 92,139, 53, 69,220, 7, 96,121,126, 32,214, 4, -104,131,151, 1, 55,174,209,112,241,142,135, 0, 0, 32, 0, 73, 68, 65, 84,194,166, 80, 40, 20,231,248,203, 27,195, 11,133, 66, - 29, 0, 78, 42,149,238, 1,157,229,154,242,231,226, 83,117,157,113, 85,215,157, 51, 40, 5, 2,193, 98,185, 92,254,171, 68, 34, -201,147, 72, 36,121, 10,133,226, 87,129, 64,176, 24,128,242,239,114,128,228,235, 78,114,240,216, 7, 44, 54,206,247,240,149, 18, -173,193,204, 6,129,103, 31, 77,182,116, 84,182, 72, 83,192,140, 48, 89, 57,255,111,206, 27,188, 42, 44,246, 80, 16,180, 72,179, - 22, 46, 34,145,232, 48, 0, 15,122,121,254, 59, 9, 5,122,246, 20, 8, 22,134, 0, 67, 65,231,211,165, 80,254,122,163,101,179, -217,180, 5, 5, 5,204,182,109,219,198,107, 52,154, 91, 2,129,224, 13, 0,162,255, 74,129, 43,149,202,211,106,181, 90,167,209, -104,116,106,181,250, 98, 83,233,255, 82,130, 60, 61, 61,211,220,220,220, 18,106, 39,122,118,121,176, 95,135,254,143,191,237, 30, - 54, 97, 80, 11,245, 69, 2,129,224, 13,141, 70,115,107,219,182,109,227,179,178,178, 24,155,205,166,117, 98,255,129,174,174,174, -215,207,157, 59,247, 86, 65, 65,193,160,140,179, 91, 60,115,207,109,242, 76,251,109,213,224,232,159,214,189,229,226,162,185, 6, - 96,224,223,162, 36, 77,156, 23,120,252, 33, 87,115, 12,242,156, 50,155, 87, 76,170, 65, 5,240, 7,195,210,130, 31, 49,165,156, - 23, 64,134, 94,206, 52, 42, 78, 23,121,122,253,158,100, 86,131,199, 27, 2, 19,227,221,226, 7, 14,143,247, 60,199,113,195, 69, - 34,209,203,244,241,251,239, 68,204,227,245, 63, 61,126,252, 7,175,117,233, 50, 39, 4, 24,215,128,217, 98, 0,188, 20, 18, 18, -114, 8,192,163,119,241,235, 63, 10, 14, 14,206, 2, 48,151,158, 9,202, 95, 76,247,234, 31,248,168,211, 70,203, 97,163, 53, 57, - 16,253,167,182,197,137, 71, 2, 81, 62,165, 45,244,211,219,226,228, 67,129, 24,218,156,220,184,187,187, 99,224,192,129,252,172, -172, 44,217,130, 5, 11,222,150, 74,165, 41, 0, 70, 54, 71, 75, 38,147, 69,203,229,242, 12,129, 64,112, 91, 94,228,114,121,180, - 66,161,200, 16, 8, 4,195,106,167,171, 84,170,211,106,181, 90,167, 82,169, 46, 54, 96,132,162,213,106,181, 78,169, 84, 70,215, - 78, 23, 8, 4,195,148, 74,101,166, 74,165,170,155, 62, 84,165, 82,101,212, 77,111, 8,161, 80,232,151,145,145,161,205,204,204, -212,138,197, 98,175,218,233,233,233,233,218,140,140,140,219,210,157, 65, 32, 16, 12, 85, 40, 20, 25,114,185, 60,186,190,244,186, -199,212, 16,181,202,110,168, 35,233,206,154,172, 17, 35, 70,156,204,201,201,241,119,113,113,113,169,189,193, 77,227, 50,242,235, - 45,235,231, 79, 24, 61,226,121,207,208,137,157,155,169, 63, 82, 42,149,166, 44, 88,176,224,237,172,172, 44, 89,223,190,125,249, - 60,158, 83,191, 39, 34, 38, 76,152,176, 79,167,211,249,118,237,218,149,111,183,219,113,117,255, 98,200, 99, 95,134, 52,101, 35, - 90,203,242, 5,183,126, 94,230, 55, 98,112,207,125,184,199,141, 65,201,238, 80, 17, 24,110, 32, 71,136,231,245, 44,147,231,152, -241, 15, 11, 46,101, 24, 61,109, 44,235, 6,240, 7,147,175, 2, 36,205,210, 20,216, 6,112,132,120,253,146, 42,244, 28,242,200, - 28,254,241, 84,129,167,141,101,221,193,195,160,230,104,214,190,252,249,124,254,252, 85,171, 86,241, 0,204, 6, 32,254, 47, 61, -133,123,181,130,239,208,246,252,243,221,125,208,255, 46,202,134, 87,221,239, 65,127,151,227,180,112,220,141, 93,201,201, 71,166, -183,111, 63,246,181, 46, 93,158,172,199,108, 49, 0, 94, 91,182,108,217,227, 87,175, 94,245,108,219,182,237,115,119,233, 71,255, -154,101,203,150,189,122,245,234,213, 86,129,129,129,239,130, 14, 95,244,175,130, 16, 34, 38,132, 12, 33,132,140, 33,132, 12, 35, -132,244,170,250,251,190,170,101, 12, 33, 36,162,206,250,190,170,125,171,183,247,110, 64, 99, 76,221,253,106,237, 83,247,255,219, -254,174,199,104,141, 65,101, 91,173, 49,183, 29,192,193,131, 7, 73,237,117, 93,166, 4,226,157, 57,253,124, 13,215, 15,236, 32, -250,140,100, 82, 28,127,137, 92,218,252, 33,153,115,159,167,225,177,182,248,200,249,242, 34,228,212,169, 83,228,234,213,171, 68, -175,215,147,196,196, 68,210,187,119,111,163, 92, 46,255, 5, 64,160, 51, 98, 42,149, 74,247,203, 47,191,144, 17, 35, 70,148, 42, -149,202,149,213, 55,151, 90,173,214,157, 58,117,138,140, 24, 49,162, 84,165, 82,173, 1,192, 7,128,135, 30,122, 40,143, 16, 66, - 60, 61, 61,179,235,211,155, 48, 97, 66, 49, 33,132,104, 52,154,234,170, 38,190, 74,165, 90,243,226,139, 47,234, 47, 92,184, 64, - 92, 93, 93,171,211,121,106,181,122,229,236,217,179,245, 49, 49, 49,181,211, 27,197,205,205, 45,131,101, 89,114,224,192, 1,162, -213,106,107,242,224,234,234,154,193,178, 44,217,183,111, 95,131,121,107, 44, 80,160, 84, 42, 87, 76,159, 62,189, 60, 53, 53,149, -184,187,187,235,106,165,175,156, 49, 99, 70,121,122,122, 58,241,240,240,112, 40,143,238,238,238,186,211,167, 79,147, 73,147, 38, -149,213, 46, 83,119,119,119,221,153, 51,103,170,211, 87, 56,242, 32,107,213,170,213,115, 90,173, 54, 91,171,213,102,187,184,184, - 44,241,241,241,201,205,207,207, 39,132, 16,210,174, 93,187,188,218,145, 44,109,248,248,121, 27,119,159, 57, 23, 21, 87,152,223, -101,248,243, 43, 52, 93, 38,104,156, 40,131, 64,185, 92,254,203,160, 65,131,140, 25, 25, 25,164,162,162,130,196,198,198,146, 83, -167, 78,145,155, 55,111, 18, 0,196,145,203, 73,169, 84,102,153,205,102,206,108, 54,115,249,249,249,108, 94, 94, 30, 27,191,210, -135,144, 47,133, 53, 75,201,190,113, 36, 55,106, 41,167, 86,202, 51, 1,168,238,217,131,103,125,152, 31,217, 20,188,235,218, 98, -255,248,168,101,163,108, 36,245, 56,217,241,164,167,237,196, 60,223, 91,100, 67,200, 15,100, 83,104,235,102,105,110, 8,221, 17, -251,166,255,141,117,239,190,100, 75, 75, 75, 35, 11,103,140,178, 31,157,227,155, 68, 54,134,236,110,142,102, 45,166, 62,248,224, -131,250,244,244,116, 18, 22, 22, 86,193,231,243,159,254, 47,153,172,136, 32,113, 86,236, 55, 11,185,113,225,242,194,187,100,182, -194,181, 90,109,193,214,173, 91,137, 74,165,202,251, 27,153, 45, 38, 4, 24,191,173, 75,151,125,220,228,201,236,182, 46, 93,246, -133, 0,227,171, 12, 22, 3,224,245,229,203,151,199,216,108,182,152,175,190,250, 42,102,252,248,241, 49, 0, 22,182,240, 59, 63, -249,232,163,143,136,205,102, 35, 95,125,245, 21, 25, 63,126, 60, 1,176,214,209,157,149, 74,101,135,206,157, 59,111, 15, 11, 11, - 75,239,218,181,171, 37, 52, 52,212, 20, 20, 20,148, 26, 30, 30,190, 85, 34,145, 4,130,242,151,208,152, 23, 33,132,244,122,253, -245,215,223, 0, 64, 94,127,253,245, 55, 8, 33, 99,170,252,196,152,218,127,215, 93, 87,155,167,234,255,235,211,168, 94,234,211, -172,239, 59,234,124, 15, 26,136,100,205,188,227,224, 14, 30, 60, 56,232,224,193,131, 39,234, 30,220,195,109,209,111, 78, 63, 95, -163, 49, 63,135,196,125,248, 50,249,117,136, 31, 57, 53,216,155, 36,204,127,144,228,124,179,134,188,208,205,213, 48,185, 45,134, - 56,107,180, 98, 98, 98, 72, 76, 76, 12,185,120,241, 34, 73, 73, 73, 33,165,165,165,228,219,111,191,101,221,221,221,141, 18,137, -100, 25, 0,153, 35, 98,106,181, 90, 71, 8, 33,102,179,153, 44, 89,178,196, 84, 21,169,242,210,104, 52, 58, 66, 8, 41, 41, 41, - 33,203,150, 45, 51,105, 52,154, 88, 0,173, 60, 60, 60, 50,146,147,147,137,151,151, 87,189,102,198,213,213, 85,119,227,198,141, -106,227,228,235,234,234, 26,183,127,255,126, 43, 33,132,100,102,102, 18, 55, 55, 55, 29, 0, 47,119,119,247, 75, 7, 15, 30,180, - 18, 66, 72,118,118,118,117,186, 67, 70,203,104, 52,146,163, 71,143,222,150,135,234,244, 67,135, 14,221,102,192, 28,192, 75,163, -209,196,124,251,237,183, 22,150,101, 73, 92, 92, 92,181, 73,244,114,113,113,185,184,123,247,110, 11,203,178, 36, 62, 62,222, 97, - 51,216,166, 77,155, 60, 66, 8,177,219,237,100,227,198,141,230,234, 50,173, 78,183, 88, 44,228,179,207, 62, 51,171,213,234, 24, - 0,141, 70,223, 60, 60, 60,178, 45, 22, 11, 41, 41, 41, 33,189,123,247,214,159, 58,117,138,148,149,149, 17, 66, 8,105,211,166, - 77, 30, 0, 4, 15,122,250,253,115,137,250,178,167, 94, 93,255, 93, 96,175,199, 62, 60,114, 62, 43,243,139,189,209, 49, 30,225, - 19, 70, 57, 18,212,148, 72, 36,203,124,124,124, 76,191,255,254, 59,107,181, 90, 73,122,122, 58,185,120,241, 98,205, 53,118,229, -202, 21,135,140,150, 64, 32, 88,124,238,220, 57, 43,203,178, 92, 65, 65, 1,155,151,151,199,230,229,229,217,235, 26, 45,242,165, -144, 20, 28,122,150, 68,110,158,107, 17,137, 68,139,239, 77, 52, 11,124,178, 41,120, 2,217, 20, 28,179,117,186, 71, 65,249,197, -157,132,252, 60,151, 36,189,223,150, 44, 30,165, 42,231, 54, 5,199,144, 77, 33,147,201, 59,131, 4, 78,105,110, 14, 29, 71, 54, - 5,199,124,244,112, 64,225,165,152, 11,228,196,137, 19,228,179, 53,203,201,156, 8,223, 10,110, 83,112, 12,217, 16, 58,201, 25, -205,218, 72, 36,146,196,147, 39, 79,146,168,168, 40,242,238,187,239, 18,185, 92,158,126, 55,162,122,100, 67, 80, 0,249, 60,104, - 16,217,210,209,135,252, 54,232,111,215,193,167, 87, 43,248, 14, 15, 18,103, 22, 92,218, 75, 72,209, 77,146,187, 50,140,140, 10, - 22,182,212,108,133,107,181,218,252,212,212, 84,146,155,155, 75, 86,175, 94, 77,212,106,245,223,218,108, 5, 3, 19, 0,188,177, - 98,197,138, 26,147,181,126,253,250,152, 43, 87,174,196,248,251,251,255,212,130,239, 90,187, 98,197,138, 26,147,181,126,253,122, -114,229,202, 21, 18, 16, 16,144,209,212,142,211,167, 79,151,247,235,215, 47,102,218,180,105,134,173, 91,183,146,212,212, 84, 18, - 27, 27, 75, 86,172, 88, 65,222,126,251,109,242,229,151, 95,146, 73,147, 38, 85,244,238,221,251,220,228,201,147,165, 78, 70, 20, - 4, 85, 81, 24, 49, 33, 68, 72, 8,169, 54,154, 2, 0,194,234, 31,255, 20,199,188, 72, 67,102,170, 33,131, 85,119, 91, 35, 70, -172, 81,195,230,192,247,221,105,170,234, 70, 66,106,253,253,219,216,177, 99, 7,221,241,242, 33,120,111,230,130,247,165, 41, 91, - 87, 67,247,237,167,224,151,232, 32, 44, 47,132,249,100, 36,108, 39,247,227,241,190,125,101, 50,134,249,192,217, 2, 21,139,197, - 16,139,197, 16,137, 68, 48, 24, 12,200,206,206,198,253,247,223,207,187,120,241,162,244,185,231,158,155, 43,147,201,210, 1, 76, -108,242,110,102, 42, 35,210,167, 79,159,198,179,207, 62, 43,217,190,125,123, 87, 79, 79,207,203, 44,203,138, 1, 32, 62, 62, 30, - 83,166, 76,145,236,220,185,179, 83,171, 86,173, 46, 90,173, 86,185, 68, 34, 1,159,207,111, 80, 79, 44, 22,195,102,179, 73, 58, -118,236, 24,123,249,242,229,240,177, 99,199, 10,211,210,210,144,156,156, 12,155,205, 38, 14, 10, 10,186,114,241,226,197,174, 99, -198,140, 17,102,100,100, 32, 45, 45,173, 38, 31,142,228,215, 98,177, 64, 34,145,160,118,149, 22,195, 48, 48,155,205, 16,139,197, - 14,107, 9, 4,130,161, 33, 33, 33, 87, 46, 95,190,220,125,194,132, 9,162, 11, 23, 46, 32, 51, 51, 19, 44,203,138, 67, 67, 67, -175, 92,190,124,185,219,248,241,227, 69,177,177,177,208,233,116,112,180, 10,173,250,115,151, 47, 95,198,180,105,211,196,135, 15, - 31,238,230,227,227, 19,107,183,219,197, 0,112,229,202, 21, 76,153, 50, 69,124,228,200,145,238,173, 91,183,142,109,162, 42,145, - 15, 0, 54,155, 13,207, 61,247,156, 66,173, 86, 35, 35, 35, 3, 28,199,129,101, 89, 0, 64, 97,113,225,149,203, 87,226,226, 31, -159,250,240, 32,163,213,108, 62,115, 62,250,122,187, 54, 1,126, 12, 67,218, 52,145,213,137, 10,133, 34,125,229,202,149,243, 82, - 83, 83, 37, 33, 33, 33,188,164,164, 36,148,151,151, 67, 36, 18,213, 92, 99,142, 30,183, 88, 44, 30, 28, 22, 22, 38, 48,153, 76, -224, 56, 14, 0, 8,143,199,171,247,100, 72, 75, 78, 34,212,203, 46,148,201,100,131,239,201, 19,169, 44,204, 29, 28,134,167,229, - 91, 36, 18, 23, 63,149,210, 39, 8, 72,143, 66, 91, 79, 9,248, 60,190,244, 66,178, 65, 1,144,225,240, 47,112,119, 78,147, 27, -158,156,103,145,216,220, 58, 41, 91,249,249,163,176,176, 16,173,219,133,192, 36,246, 20,159,190, 89,161, 4,227,164,230, 31, 12, -232,216,177,163,119,135, 14, 29, 80, 80, 80,128,238,221,187,195,213,213,213, 21,192,240,102,155,172,175, 2, 36, 40, 67,127,128, -183, 18, 44,243, 46,108,130,165,184,153,223,157,108,234, 46,252, 59,153, 44,181, 82,124,118,231,174,111,125,221,253, 67,129,200, -167,224,229, 34,193,150,231,187,187,121,106, 36,251,154,105,182,194,189,188,188,142,159, 59,119,206, 67, 42,149,226,226,197,139, - 8, 11, 11,195,234,213,171, 61, 93, 93, 93,163,254, 38,102,139,196, 3, 7, 62,138,141,253,106,251,173, 91, 7,167,183,111, 63, -118, 90, 80,208,146, 89,143, 62,250,244, 75, 47,189,132,229,203,151, 99,223,190,125,232,223,191, 63,102,206,156,105, 75, 79, 79, -223,214,204,239,249,116,229,202,149,115,230,206,157, 91, 87,211,154,150,150,214,104,109, 75, 88, 88,152, 95, 98, 98, 98,214,252, -249,243,187,111,223,190, 93, 38,151,203, 81, 82, 82,130,207, 63,255, 28,111,188,241, 6, 24,134, 1, 33, 4, 95,126,249,165,252, -201, 39,159,236,117,235,214,173,172,128,128,128, 38,155,117, 16, 66, 24, 66,136, 20,128,188,106, 81, 0,144,239,220,185, 83, 51, - 97,194, 4,117, 85,154,172,106,145,128, 82,151,122,189, 72,173,119,229,193, 58,229, 61,182,110, 90,221,109,132,144,177,141,105, - 56,105,160,235,251,190,200,198,204, 86,237, 55,208,224,122, 93, 36,208,197, 59, 48, 24,165, 63,239,134, 76,192, 64,198,175, 90, - 4, 12,120, 73, 87,208, 90, 42,132,141,144,240,230, 26,173,234, 69, 40, 20,194, 96, 48,128,101, 89,188,241,198, 27,146,163, 71, -143,186,243,120,188, 31,154,210,169,109,152, 18, 18, 18, 16, 26, 26,202, 28, 56,112,192,107,246,236,217,178,234,239, 41, 45, 45, - 69,135, 14, 29,152, 67,135, 14,105,223,124,243, 77,101, 99,102,134, 97, 24,136, 68, 34,204,157, 59, 87,118,254,252,121,183, 86, -173, 90, 33, 41, 41, 9, 69, 69, 69, 80, 42,149,152, 59,119,174,236,220,185,115,158,173, 90,181, 66,106,106, 42, 74, 75, 75,161, - 84, 42,157, 54, 90, 34,145,232,182,125, 24,134,129,213,106,117,202, 24,104, 52,154, 29, 49, 49, 49,158, 26,141, 6,177,177,177, -176,219,237,208,104, 52,152, 51,103,142, 44, 38, 38,198,211,197,197, 5,241,241,241, 32,132, 64,173, 86, 59,149, 71, 0,224, 56, - 14,241,241,241,104,211,166, 13,162,162,162,180,179,102,205,146, 86,167,223,188,121, 19,126,126,126,136,138,138,210, 42, 20,138, - 29, 13,105,113, 28,135,156,156, 28, 92,189,122, 21, 73, 73, 73,200,207,207, 71, 65, 65, 1,202,203,203, 97,183,219, 1, 0,242, -242,178,200,157,223, 29,184, 44,147,201,228, 97, 65, 29,253,175,196, 93,203,147,201,100,242, 0,127,255, 32,224, 29, 94, 35,134, -240,135,180,180, 52,247, 39,159,124, 82,148,155,155,139,226,226, 98, 8, 4,130, 59,174, 45,177,216,177,166, 64,118,187, 61, 84, - 42,149, 50, 86,171,181, 38, 2, 38, 22,139, 49,111,135, 1, 97,139,113,219,242,232,154, 60, 16,214, 6,139,197, 18,250,151,191, -193, 0, 6,140,165, 35, 24,166,251,217,164, 10,183, 1, 99,167,138,144,124, 24,224,108, 0, 79,128,193, 93,252, 4,251,174, 84, -120,129,160, 11,204, 8, 33,164,233,158, 95, 4, 96, 0,107, 7,128,233,121, 52,209,238,222,255,193,231, 69, 89, 89, 89, 16,137, - 68,144, 72, 36,232, 62,244, 33,193,206,203, 54,111, 48,232, 10, 43,130, 29,209,188, 45,236, 40,147,189,245,246,219,111, 43,106, -107, 62,253,244,211, 10,141, 70,243,118,179, 77, 86,133,188, 47,236,100,238,213, 44, 67,155, 37,145,185,161,183,242,140,193, 32, -100, 62, 96,235,118, 23,204,214, 96,137, 68,146, 12,224,254, 22,153, 44,149,248,204,174, 93,223,250,186,181,174, 52, 89,176,155, - 0,161, 12,222,158, 46,216, 50,111,136,155,167,139,204, 89,179, 21,238,229,229,245,203,217,179,103, 61,164, 82, 41, 98, 98, 98, - 32, 18,137, 32,149, 74,209,185,115,103,108,218,180,201,211,205,205,237,111,101,182,150,197,198,110, 93,122,245,106,194,235,225, -225, 33, 19, 21, 10,183, 23,167, 77,211,188,249,230,155, 7,247,239,223,255,213,152, 49, 99, 10,206,159, 63,255, 49,128,221,206, - 70,204, 0,172, 95,181,106,213,139,213,198,237,205, 55,223,252,114,255,254,253, 75,199,140, 25,147,115,254,252,249,249, 0,214, - 55, 38,160,215,235,247, 47, 90,180, 72,243,224,131, 15, 86,255,143,147, 39, 79, 98,219,182,109, 80, 40, 20,183,125,118,252,248, -241,120,246,217,103, 93, 45, 22, 75,163,239, 36,173, 86, 59,236,236,217,179, 97,168,236,224, 37,169, 54, 90,113,113,113, 46,101, -101,101, 46, 74,165,210,197,199,199, 71, 85,109,182, 30,124,240, 65, 23,129, 64,112, 63, 40,104,202,139,212, 54, 58,142,164, 53, -247,243,142,154,173, 58, 73, 13,142,161,117,155,209, 26, 59,118,236, 9, 52,208,147,202, 90,164,131, 4, 44,100,124, 6,114,126, - 45,179, 5, 14,130,210, 60, 48,205,232,192, 91,223,203, 80, 44, 22,131,207,231,195, 98,177,160,176,176,208, 41, 83,160, 86,171, -161, 84, 42, 97, 52, 26, 97,183,219, 33,149, 74,171,205, 8,212,106, 53,132, 66, 33,132, 66, 33,164, 82,233, 29,209,164,186,209, - 28,145, 72, 4,133, 66,129,156,156, 28,164,165,165,129,227, 56, 40,149, 74, 40, 20, 10,136,197, 98,100,103,103, 35, 59, 59, 27, -132, 16, 40, 20, 10, 40, 20, 10, 56,211,224,154,101,217,122, 95,254, 54,155,205,169,136,150,221,110,199,245,235,215,145,158,158, - 14,169, 84, 90,115,172, 18,137, 4, 55,111,222, 68,110,110, 46,228,114, 57,212,106, 53, 52, 26,141,195,186,213,199,162, 82,169, - 32,147,201, 80, 92, 92, 12,131,193, 80, 83,166,106,181, 26, 10,133, 2,165,165,165,200,203,203,107,244,216, 89,150, 69,118,118, - 54,242,243,243,145,145,145,129,130,130,130, 26,179, 85, 21, 53,106, 89, 96,167,172, 12,133,133,133, 53,145,200,134, 22, 71,224, - 56, 14,229,229,229, 56,123,246, 44,195,113, 28, 74, 74, 74,184,252,220, 92,246,133,108, 49,246,189,179,129,124,123,248,146,105, -231, 79, 49,198, 61,191, 92, 53,174,223,115,197, 40,237,253,174,253,158, 60,134, 62, 11,215,192, 38, 28, 81,160,183, 73,242,173, - 34,141, 87,120, 4,144,124, 8,224, 9, 0,169, 43,250,116,106,139,180, 98, 86,113, 67,103,145,130,193, 72,172, 15,114,117, 72, -147, 21, 14,207, 47,183, 73, 82,173,158,234,208, 46, 61,160,211,233, 32,145, 72, 32,145, 72,208,179,127, 4,146, 11, 89,249,181, - 44,163, 28, 4, 35, 28,210,252,131,118, 74,165,178,239,253,247,223,207,212,214, 28, 61,122, 52, 24,134,233, 12, 32,196,169,135, -220,218,118, 98, 88,229,125, 32, 32,115,175,229, 24, 90,237,139, 51, 5,141,155,248,144,219, 39,199,242, 66,175,231,154, 3, 65, -108, 11, 64,172, 61, 90, 96,182, 6,169, 84,170,131,235,214,173, 11,148, 74,165,135, 0, 12,104,142,136, 82,198,223,248,214,139, - 83,125, 93,171, 77,150,205, 0, 8,100,128, 80, 6, 8,100,240,214,122,224,131,103,135,187,201,165,194, 61, 78, 24,214,157,235, -215,175,247,172,107,178,170,151,238,221,187, 99,241,226,197,158,110,110,110, 59,238,241,203,114,132, 70,163,217, 30, 17, 17,113, - 54, 91,165,122, 54,167, 71, 15,241, 47, 26, 77,233,176,210, 82, 77, 64, 92,156, 53, 24,184, 2,224,179,204,204,204, 81, 78,152, -172, 71,213,106,117,204,176, 97,195,172, 42,149, 42,125,245,234,213, 47,204,158, 61, 27,203,151, 47,199,162, 69,139, 62, 7,240, - 12,128,255,101,102,102,182,106,202,100, 1, 64,110,110,238, 99,175,189,246, 90, 65, 65, 65, 1, 0,160,115,231,206, 40, 41, 41, -193,194,133, 11,241,242,203,149,157, 98,187,117,235, 6, 66, 8,116, 58, 29, 86,174, 92,169,203,205,205,125,162,137,103,123,198, -238,221,187,123, 89,173, 86, 63, 84, 86, 15, 74, 74, 74, 74,212, 69, 69, 69, 42,171,213,170,224, 56, 78,225,226,226,162, 4, 32, -127,252,241,199, 5,215,174, 93, 11,181,219,237, 89,212, 91,253, 65, 99, 94,164, 57, 48, 12, 19,217,146,200, 85,125, 17,177, 6, -104, 60,162, 53,118,236, 88,166,246,250,182,136, 17,131,216,244,232, 40,184,133,247,184, 45,154, 37,231, 51,144,169, 53, 72,206, - 72,131, 8,204,213,187,101,180,138,139,139,241,194, 11, 47, 24, 31,123,236,177, 66,142,227, 30,114,212, 20,104, 52, 26,104, 52, - 26, 92,187,118,141, 76,154, 52, 73,183,122,245,106, 99,109,163,149,144,144, 64, 70,140, 24,145,247,246,219,111,235, 27, 51, 90, -213, 17,173,101,203,150, 25, 7, 15, 30,156,127,245,234, 85, 82,109,166,148, 74, 37, 86,174, 92,105, 28, 50,100,136,238,194,133, - 11,164, 58,205,153,136, 22,143,199,171, 49, 90,181,247,225,241,120,224, 56,206, 41,163, 85, 81, 81,241,216,152, 49, 99,116,241, -241,241,164,250, 56, 53, 26, 13, 86,175, 94,109, 28, 62,124,184,238,234,213,171,164, 58, 77,173, 86, 59,108, 6,171,191, 95,165, - 82, 65,173, 86,227,218,181,107,100,196,136, 17,186,181,107,215,154,106,167, 95,191,126,157,140, 31, 63, 94, 87, 94, 94,254, 88, - 99,230,165,186, 58,207,110,183,195,100, 50,161,160,160, 0, 25, 25, 25, 53, 85,135, 70,133,122,212,212, 71,198,117, 53, 26,141, -134,107, 9,137,233,157, 59,133,105,141, 70,163, 33, 45, 61, 61, 1,120,135,107, 68,251,161,240,240,240,194, 23, 94,120,193, 88, - 92, 92,220, 98,163, 37, 22,139,227, 5, 2, 1, 25, 48, 96, 0,177, 88, 44, 36, 35, 35,195, 86, 80, 92,108, 15,249,240, 67,114, -117,222, 60, 70, 22, 29, 45, 81, 42,149, 76,149, 38, 47, 41, 41,137,147,201,100,241,127,249,147,136,199,121,131, 33,247,255,158, -168,119, 25, 62,110,138,152,201, 61, 15, 88,245,128,196, 21,144,184, 66,160,112,199, 3, 3,186,241,183,158, 45,243, 6,225,250, - 65, 36,241,107, 82, 83, 72,188, 0,110,192,207, 9, 38,215,251, 39,207, 17, 23, 21, 21,129,207,231,215,152, 34,185, 66,129, 97, - 19, 31,231,125,121,222,236, 13,144,254, 96,248,126, 78,220,235,175,190,245,214, 91,162,226,226, 98,240,120,188, 63, 52,229,114, -204,154, 53, 75,162, 86,171, 23, 57,252,240,219, 29, 42,130, 80,210, 7, 32, 47,223,200, 53,181,218,127,197, 24,188, 96,217, 22, - 89,120,183, 94,120,110,176, 86,182, 44, 50, 47,252,114,134,177, 45,192,206,131,221,210,179, 25,102,107,128, 74,165,138,140,142, -142,150,143, 30, 61, 26, 43, 87,174, 84,200,100,178, 67,205,121,240, 87,232,217,217,239,173,253, 90, 23,251,241, 72,192, 90, 81, -105,176,106, 45,121,122, 14,139,183, 28, 47,181,217,200, 84, 71, 53,141, 70,227,140,103,158,121,166,112,207,158, 61,119,152, 44, -169, 84,138,148,148, 20, 44, 89,178,164,168,168,168,232,137,123,105,178,102,207,158,189, 36, 51, 51, 51,248,231,159,127, 22,228, -231,231,107, 87,125,241, 69,233,247,165,165, 69, 75,227,226,110,252,175, 83,167,142,175,119,233,242, 68, 35, 67, 63,212,107,178, - 94,124,241,197,157,153,153,153,221,143, 29, 59, 38,204,207,207,247,123,241,197, 23,177, 98,197, 10, 44, 90,180,104, 19,128,231, -224, 88,135,151, 63, 2, 8, 86,235,141,226,226,226,177, 35, 71,142, 44, 41, 46, 46, 70,151, 46, 93, 48,110,220, 56,120,123,123, -163, 85,171, 86,152, 48, 97, 2,130,130,130, 80, 88, 88,136,169, 83,167, 22,229,231,231,143, 4,144,212,152,102, 97, 97,225,173, - 29, 59,118, 36,204,153, 51,167,123,102,102,102, 40, 0,247,242,242,114, 69,121,121,185,196, 98,177,200, 92, 93, 93, 93,187,117, -235,230, 49,115,230, 76,229,165, 75,151, 66, 51, 51, 51,245, 0,210,168,189,170, 49, 89, 13,122, 17, 0,249, 85,134,199, 82,103, -157,223,196, 54, 71,247,173,247,111, 7, 62, 87,215,108,213, 94,238,168, 58,172,255, 98, 4, 22,111,219,189,213, 36,246,239, 0, - 77,112, 87,200,165, 82,200,196, 98,200, 92,221, 97,230, 56,124,145,146,107,168, 32,100,145,179, 5, 90,247, 69,200, 48, 12, 62, -253,244, 83,123,223,190,125, 77,199,143, 31, 95,103, 52, 26,253, 1,236,117,198, 20,172, 93,187,214, 48,119,238,220,203,121,121, -121, 93,165, 82,169,165, 58,125,221,186,117,134,199, 31,127, 60, 46, 51, 51,179,187, 92, 46, 55, 52,212, 62,171,182,209,146, 72, - 36,230,188,188,188, 94, 79, 63,253,116,252,103,159,125, 86, 33,151,203,161, 80, 40, 32,145, 72, 44,121,121,121, 93, 95,120,225, -133,203, 43, 86,172, 48,200,100, 50, 40, 20, 10,167,170,229, 8, 33,119, 24,170,218,233,142, 98,183,219,143,231,229,229,117,157, - 59,119,238,165, 79, 62,249,164,162,218, 0,213,206,227,170, 85,171, 12, 74,165,210,169,136, 86,245,231, 20, 10, 5,214,172, 89, - 99,152, 51,103,206,229,188,188,188,174, 18,137,196, 82, 43,189, 98,246,236,217,151,242,242,242,186,218,237,246,227,141,252,194, - 99,203,202,202, 32, 16, 8, 16, 23, 23,103, 22,137, 68,224,241,120,184,121,243,102,141,209,114,115,115, 11,235,218,185, 83,200, -215, 59,119,159,144,137, 36,146,190,189,122,134, 38,165,166,101, 18,194,164, 54,145,213,189, 70,163,209,255,248,241,227,235,250, -246,237,107,250,244,211, 79,237, 13, 69,182, 28,193,108, 54,159,184,120,241,162, 77, 42,149, 50, 57, 57, 57,118, 62,159, 15,150, -101,137,185, 87, 47,115,231, 79, 62, 33,215, 94,127,157, 81, 43, 20, 2,145, 72, 4,185, 92,206, 28, 62,124,216, 98, 48, 24, 78, -252,245, 70, 11,114, 48,144, 37,230,153, 85, 82,158,157, 65,194,222, 74,147, 37,117, 1,164,174,128,212, 21,190,190,126, 56,159, - 98, 80,129, 7, 49, 88, 7,198, 16, 35, 68, 1, 6,242, 56, 29, 84, 66,177,140,201,205,205,173, 49, 68,213, 75, 96,135, 80, 92, - 76,211, 43,193, 16, 9,248,112,102, 8,146,177,238,238,238,130,156,156,156, 59, 52,195,194,194,248, 54,155,205,241,161, 93,178, - 89, 31,128,123, 49, 33,215,228,243,227,229,138,224,121, 75,191,148,201,216, 18, 32,122, 45,194,219,181,194,188,201,221,196,111, -238,207, 15,191,144,106,104, 7, 62,121, 14,156,222,211,137,124,222,175, 82,169, 14, 93,184,112, 65,174, 82,169,144,148,148,132, - 94,189,122, 97,243,230,205,114,185, 92,254, 19, 0,167,218,227,157,211, 33, 77, 95,206,246,125,117,119,122,110,108,142,253, 54, -147,149, 95, 65,240,204, 71,251, 75,138,203, 76, 15,157,205,104,248,254,169,135, 75, 37, 37, 37, 35, 22, 45, 90, 84,152,159,159, -127,155,201, 74, 75, 75,171, 54, 4,131, 1, 92,189, 87, 47, 75,141, 70, 51,109,233,210,165,184,112,225, 2, 70,143, 30,141,168, -168, 40, 20, 21, 21, 97,215,161, 67,137, 59, 18, 19,255, 87,221,102,171,129,161, 31,234, 69,173, 86, 47, 88,186,116, 41,162,163, -163,107, 52, 11, 11, 11,177,116,233,210, 76, 0,207, 59,107,178,170,201,203,203, 59,127,227,198,141,145, 93,186,116,185,190,110, -221,186, 76, 31, 31, 31,110,230,204,153,120,230,153,103,224,233,233,201,174, 89,179, 38,125,192,128, 1,113,183,110,221,138, 48, - 24, 12, 87, 28,249, 45, 80, 80, 80,112,122,243,230,205,103,135, 14, 29, 42,159, 49, 99,134,231,190,125,251,220, 13, 6, 67, 43, -137, 68,162,181, 88, 44,226,235,215,175,243,191,255,254,123,239,107,215,174,165,152, 76,166,243,205,205,251,127, 13,134, 97, 46, - 48, 12, 19,201, 48,204,177, 58,235, 11,141,109,115, 98,223,134,254,110,244,115,117,178,185,185,206,226, 56,211,218,225,157, 89, -157, 84,134,211,211,251,144,220,153,247, 19,221,148, 80,114,114,144, 27,121,186, 61, 83, 49,163,153,195, 59, 24,141,198,154,101, -207,158, 61,196,219,219,187, 66,165, 82, 57, 61,188,131,183,183,183,174,172,172,140,220,119,223,125, 69,158,158,158, 53, 67, 17, -248,248,248,232, 42, 42, 42, 72,159, 62,125,138,180, 90,109,205,240, 14,126,126,126, 25,132, 16, 18, 16, 16,144,221,144,158,221, -110, 39,222,222,222,213, 61,244,132,110,110,110, 27,122,247,238, 93,164,211,233,136,143,143, 79,205,208, 9,158,158,158, 43,123, -245,234, 85, 55,189,169,252,102,100,102,102,146,204,204, 76,210,186,117,235,236,218,233,105,105,105, 36, 45, 45,141,248,249,249, - 57, 61,188,131,167,167,231,138,122,242,210,172, 60,250,251,251,235,140, 70, 35,233,215,175,223,109,101,234,239,239,175, 51,153, - 76,213,233, 14, 13,239, 32,147,201,158,147, 74,165,217, 82,169, 52, 91, 34,145, 44,105,211,166, 77,222,119,223,125, 71,214,172, - 89, 83,221, 37, 29,158, 97,227,251,118,232,247,196,255, 60,195, 38, 44,104,201,240, 14, 42,149,234, 23,111,111,239,138, 61,123, -246,220,118,125, 25,141, 70,135,135,119,144,201,100,153,122,189,158,211,233,116,182, 83,167, 78, 25,162,163,163, 13,113,113,113, -134,148,148, 20, 99, 97, 94,158, 85,167,211, 25, 75, 75, 75,205,151, 47, 95, 54,203,229,247,102,120, 7,178, 57,168, 3,217, 16, -178,255,214,123,129,215,230, 14,148,155,174,124,208,149,144, 31, 30, 36,228,167,103, 8, 57,254, 42, 57,191,105, 38,233, 23, 40, - 97, 79, 45,108,157, 64, 54, 6,255,232,200,144, 12,100,115,231, 14,100, 67,200, 79,137,239, 6, 94,155, 49,160,149,233,139,207, -214,144,115,231,206,145,184,184, 56,146,148,148, 68,126,218,251, 29,233,215, 78, 94,169,185, 33,100,191,147,195, 60,244,151, 72, - 36,250,213,171, 87,147,179,103,207,214,104,238,223,191,159,200,229,114, 3,224, 88,175,101, 2, 48,100, 67,216, 68,251,103,193, -191,191, 57, 92, 89, 94,120,240, 85, 66,174,108, 37,100,115, 56, 33, 95,245, 38,228,187, 49,132, 28,120,130,156, 93, 51,153,244, - 15, 20,217,200,198,224, 40,178, 41,204,225,198,246, 66,161,176,108,207,158, 61, 36, 59, 59,155, 68, 69, 69,145,232,232,104, 18, - 31, 31, 79,210,211,211, 73,100,100, 36, 17, 10,133, 38, 52, 99,218,178,222, 94, 8,136,232, 40,202,185,188,172, 63, 33,251,166, -146,252, 29,211,200,216, 78,170,162, 62,173, 91, 52, 30, 93, 55,119,119,247,130,200,200, 72,146,146,146, 66, 78,156, 56, 65,180, - 90,109, 1,128,240,123,253, 66,140,136,136, 56, 71, 8,137, 25, 61,122,116, 12,128,195, 17, 17, 17, 49,201,201,201, 49,189,122, -245, 58,139,198,135,126,104,144, 97,195,134, 89, 9, 33,100,244,232,209, 4, 64,118, 68, 68, 4, 73, 78, 78, 38,189,122,245,178, -220,165,108,243, 1, 60, 33, 20, 10,191,112,115,115,251,213,213,213,245, 56,159,207,223, 12, 96, 58,154, 63, 30, 23, 31, 64, 43, - 0, 97, 0,122, 86, 45,161, 85,105,180,199, 33,229, 78, 38, 7,162,255,147,237,152, 19,143,181, 69,249,212,182,208, 63,213,158, -113,100,192,210,136,134,140, 22,199,113, 36, 33, 33,129, 12, 25, 50,164, 66,161, 80,100,193,241, 1, 75,111,211,244,240,240,136, -214,106,181,119, 12,162, 89, 43,253,182, 1, 75,181, 90,237,105, 31, 31, 31,157,167,167,231,197,250, 52, 61, 60, 60,162,125,124, -124,116, 30, 30, 30,183, 13,238,201,231,243, 71,123,120,120,100,213, 77, 23, 8, 4, 67,181, 90,109, 70,221,244, 6,142, 29,222, -222,222, 25,217,217,217, 36, 63, 63,159,248,251,251,103,215, 53, 96,185,185,185,183, 25, 48, 71, 52,155,202, 75, 35,121,172, 87, -211,129, 50,109,206,121,175, 38,200,215,215, 55,111,213,170, 85, 68,169, 84,230,213,222, 16, 60,240,169,183,206, 37,234,203,158, -121,109,195,119,245, 12, 88,234,232,224,160, 35, 21, 10, 69,214,144, 33, 67, 42, 18, 18, 18, 8,199,113,132,227,184,134,140, 86, -125,154,163,122,246,236, 89, 88, 80, 80,192,150,151,151,219, 51, 50, 50,204,201,201,201,198, 15, 62,248,192,154,159,159,111,210, -235,245,150,216,216, 88,179,143,143, 79, 62,128, 81,206,158,163,230,190,187,234, 86,159,145, 77,161,253,201,198,208,200,248,183, - 3,174, 63,209, 91, 97,142, 89, 53,154,144,227,175,146,179, 27,158, 33,125, 3,197,149,134,104, 83,200, 33,242,101,208, 64,178, -182,157,216, 33,205, 47,218, 15, 32,155, 66, 14, 93, 91, 28,112,253,193, 30,158,150,157, 91, 55,145,155, 55,111,146,253,223,239, - 32,125,218, 86,153,172,141,161, 71,201,134,208, 33,142,104,214,103,182,182,108,217, 66,110,222,188, 73,126,252,241, 71, 71, 77, - 86, 68,125, 70,235,141, 8,101,201, 51,189,165,230,169,221,196,150, 9,225, 34,235,136, 14, 34,123,191, 0, 1,219,213,135,199, -133,122,130,140, 8,150,153,201,198,224, 40,178, 49,116,164,163,249, 20,139,197,233,168, 53,166, 78,221, 69, 34,145,228, 55, 98, -180, 34,154, 52, 91, 65,146,156, 95,222, 27, 74,198,117, 81, 21, 58,104,178,154,186,150,186,121,120,120, 20,124,245,213, 87,196, -203,203, 43,223, 65,147,245,167, 95,159, 26,141,102,187, 94,175,143, 57,114,228, 72, 76, 68, 68, 68,204,246,237,219, 99, 78,158, - 60, 25, 35,151,203,183, 87, 7, 39,234,154,173,208, 59,159,255, 17,117, 34, 90, 49,229,229,229,228,200,145, 35, 36, 34, 34,130, -108,223,190,157,156, 60,121,146,200,229,242,152,230,230,243,207, 56,118,170,249,159,102, 38, 26,168, 58,252,211,127,220,212,103, -180, 76, 38, 19, 89,184,112,161, 69, 42,149, 26, 68, 34,145,179, 83,240,252,163, 47, 66, 15, 15,143,211, 94, 94, 94, 58, 47, 47, -175,219,204, 94,237,116, 15, 15,143,139,255,242, 27, 48, 72, 36, 18,165, 9,133,194,219,167,224, 9, 27,223,183,125,255, 25,139, -188,194,199, 63,208,194,124,138, 68, 34,209, 27, 82,169,212,176,112,225, 66,139, 94,175,119,198,104, 1,192,112,185, 92,158,181, -109,219, 54, 99, 98, 98,162,173,168,168,200,126,238,220, 57, 91,116,116,180,229,157,119,222, 41,151,203,229, 89,104,120, 88,130, -191,164, 60,201,218,118,226,106,179,117,101, 81, 64,252,184, 78,114,235,230,249, 35, 72,223, 54,117, 76, 86,195, 35,185,215,175, - 89,101,182, 46,189,233, 31, 63, 36, 72,105, 95,186,104, 30,233,211, 86,118,187,201,114, 66,179,174,217,146,203,229,229,111,191, -253,182, 51,145,172,219, 13,225, 23,193,254,100, 83,200,246, 74, 19,213,196,178, 33,248,115,242,105,176,255,223,229, 62,234,237, -133,128, 97, 65,146,171, 78, 68,178, 28,201,103, 55, 87, 87,215,235, 78, 68,178,254,138, 99, 31, 49,107,214,172,152,228,228,228, -152,164,164,164,152,147, 39, 79,198, 76,156, 56, 49, 6,192,136, 90,159,169, 49, 91,214, 73,147,204,221,120,188,121, 77,104, 62, - 58,107,214, 44,146,156,156, 76,146,146,146,200,201,147, 39,201,196,137, 19, 9,156,155,190,135,154, 34,106,180,238, 9,127,246, -132,159, 17, 0,142,213, 78,144, 74,165, 58,147,201,228,169, 84, 42,247,234,245,250, 57,168,236, 22,217, 34,205, 63, 35,159, 84, -243, 95,161,233,163, 84, 42,215,233,245,250,137, 82,169, 52,223,100, 50,121, 57,161,233, 34,145, 72,230, 73,165,210, 33, 6,131, - 33, 8, 0, 20, 10, 69,130,217,108,254,213,104, 52,126, 12,160,228, 94, 31, 59, 89,219, 78, 12,177,184, 39, 8, 94,143, 73,175, -104,187,244, 72, 81,192,252,161,174,233,253,218, 43, 82, 32,228, 62, 2, 99, 62,207, 60,153,102,118, 90, 83,198,244, 2, 43,124, -253,124,170,161,205, 71, 63,151, 7, 44, 24,162, 76,239,215, 78,153, 14,130,143, 32, 49,156,113, 86,179,174,217, 82, 40, 20,219, - 42, 42, 42,158, 5,240,171,179,199, 78,118,135,138, 80, 97,243,133,141,223, 9,164,145, 41,124, 8, 49,128,199,143, 67, 46,116, -204, 59,215,173,244, 62,250,203, 53, 71, 40,149,202,105, 33, 33, 33,237,174, 93,187,150,100, 48, 24,190, 1,112,180,238,251, 39, - 4, 24, 34, 23, 8,186, 26,237,246,168,235, 64,116, 19,154,143, 42,149,202, 5, 33, 33, 33,225,215,174, 93,187,106, 48, 24, 86, - 1,216, 69,207,209,191, 74,243, 95,201, 95, 62,138,114,245,203, 78,175,215,211,210,167,252,217,228,232,245,250, 73, 85,215,157, -179,251,150,152,205,230,197,102,179,121,113,245, 15,146,226,226,226,191, 85,163, 85,230,165, 36, 11, 89,219, 46, 26, 98,241,178, - 30,254,178, 57,123,102,201, 12, 32, 76, 38,132,220,154, 38, 76, 86, 83,154,231, 33,179, 45,235, 21, 32,123,249,199,231,100, 6, - 16,228,130,224,227, 38, 76,150,163,156,170,168,168,104,219,236, 99,126,248,186, 21, 64, 10, 1, 82,241, 78, 35, 63, 20,223, 1, - 97,104, 35,227,123,201, 81,189, 94,127,244,252,249,243,141,125,134,196, 3, 4,249, 91,179, 0, 0, 32, 0, 73, 68, 65, 84,199, - 97,119,184, 51,192, 46,189, 94,191,171, 9, 77, 10,133, 26, 45, 10,229, 31,200,223,246,133,205,188,148,100, 33,187, 67, 47,160, -128,191, 16, 60,180, 5,236,105,168,176,231, 50, 47,165, 89, 90,168,121, 14, 5,204, 92,240, 17, 4,177,253, 22,244,150, 92,230, -249, 52,203,223,230,184, 1,130,119,168,145,162, 80, 40,127, 27,102,226,246,158,134, 53,255, 83,163, 69,161,252,195,169,138,242, -100, 86, 45,127, 91, 77, 10,133, 66,249, 15, 26, 46, 48,104,184, 65,155, 51,117,175,205,105, 20,119,140,106, 54, 75,147, 15, 64, - 3,192, 5,149,211, 56, 84,119, 19,110,106,152,141, 7, 0,216,104,121, 82, 77,170, 73, 53,169, 38,213,188,199,154, 77,105,255, - 19,219,126,213,215,203,112,243, 95,241,197,180, 71,198,221,101, 36, 45, 79,170, 73, 53,169, 38,213,164,154,255, 82,205,127, 37, - 60, 90, 4,255, 40,164,180, 8, 40, 20, 10,133, 66,249,219,209,189,106,237,131,202,232,150, 79,245,134,123,218, 70, 75,230,222, -209, 7, 2, 94, 23,134, 35, 33, 0, 64,120, 76, 60,236, 92,172,177, 48, 49,167,165,218,202, 86, 65,110, 4,226,221, 12, 44, 15, -235,179, 19,138, 90,170,215, 41, 72, 61,201,203, 67, 53, 45,183,176,116,219,213, 27,250,125,206,236,171,209, 4,104,164,110,174, -147,205, 86, 91, 39,177, 72,148,110, 45, 41,219, 92, 92,156, 84,222,140,108,184, 53,182,241,157,119, 8,115, 48,231, 34, 35,146, - 91,121,238,106, 17,163,135,158,232,115,148, 92, 96, 73, 10,249,254,251,135,137,179,231,134,225, 97,176, 66,165,234, 33,145,202, -123,201, 85,174, 29, 57, 2, 20,233,178, 82, 45, 54,251, 73,214, 98,136, 33, 28,126,187, 27,231,138, 66,161, 80, 40,148,127,129, -209,186, 8, 96, 12, 42,171, 12,155,110, 12, 31, 16,118,255, 5,169, 84, 22, 8, 0, 28, 33,224, 8, 80, 81, 86, 18,147,155, 20, - 61, 18, 0, 60,218,116, 63, 34,148,170,123,112,164,114, 59,203, 1,118,171, 41,165, 44,237,220,125,142,228, 72,225, 25,244,224, -208,136, 97,147,198,142, 29, 19,220,185, 83,231,246, 0,112, 37,238,202,173,131, 7, 35,111, 28, 63,198,236,169,200, 79,248,177, - 37, 71, 76, 32,125,191,103,207,110,247, 71, 71, 95,124, 15,192,139, 45, 45, 65,119,119,229,156,163, 63, 44, 28, 56,108,210, 74, - 5,224,156,209,146,186,185, 78,158, 48,110, 84,183, 87, 94,154,197,123,102,225,135,129, 23, 78,253,182, 92,233, 19, 94, 66, 56, -219,209, 10,221,148,223, 27,155, 56,185,174,127,108,200, 96,125, 83,116,152,183,230,171,190,174,198,162, 91, 83, 8,199, 78, 97, - 24, 6,124,177,252,123,207,118,247,127,231, 50,120,126, 49, 0,135,123,140,169,125,194, 34,180, 62,126,123,166, 60, 53, 79, 42, -215,120, 9,192, 23, 1, 96,144,157,122, 29,199,119, 45,117,125,249,221, 45,221, 79,197,166,217,127,249, 97,189,137, 17, 9, 39, - 25,114,174,209,177, 84, 40, 20, 10,133,242, 95, 38,178,202, 92, 69,214,221,208,160,209,146, 74,101,129,103,127, 59,232,246,227, -201, 12, 0, 64, 68,119,111,252,239,131,117, 35,182,175,141,190, 1, 0,125,135,142, 13,122,239,141,151,112,250,106, 30, 8, 33, -232,214,193, 29, 15, 76,120,216, 49,227,225, 21,122,223,228,201, 15, 61,182,112,225,130,241, 55,111,222, 76,221,185,115,231,239, - 0, 48, 96,224,192, 14, 31,126,248,225, 35, 43, 93,221, 36,223,126,255, 67,150, 73,119,253, 66,115,142, 86,218,170,157,111,112, -199,182,211,190,253,114, 29,111,240,200,135,166,166,162, 98,169, 41, 59, 41,203,145,125, 61, 60, 60,230, 10,133, 66, 13, 0,112, -220, 31,254,199,106, 37,222, 0, 96,103, 57,149,107,171,224,114,190, 72,202, 74, 36,162,107,229,122,253,182,178,172,235, 95, 52, -166,105,182,217,194, 95,126,254, 73,222,165,164, 66, 4,134, 15,224,175, 89,250, 38, 56,214,230, 58,239,141, 15, 38, 71,159,251, - 22, 21, 58,156,112,240,208,132,117, 19,124,125,251,240,223, 95,170, 28,206, 48,120, 34,160,239, 83, 19,223,219,250,189,176,103, - 7, 53,204, 54, 14,135, 98, 10,251,110,248,248,253, 21,167, 54,140, 57, 0, 96, 19,128, 95, 0, 52,105,234,220,220,221,190,153, -187,232, 99,101,133,229,143, 97,138,170, 76, 22, 62,223,182, 27,151, 51, 56,132, 4,135, 8,188,231, 46, 87,110,250, 96,230, 86, - 67,229,220, 93, 20, 10,133, 66,161,252, 87,201,193,237,141,223, 55, 55,105,180, 0, 64, 41, 19,224, 70,114, 46, 0,192, 69, 6, -204,121,110, 6, 10, 11,242,131, 44,118, 14, 79,205,152,142,139,241, 57,184,145,146, 15, 66, 8,130,252,228, 14,231,134, 15,174, -231, 83, 79, 63, 53,232,200,209,163,231,223, 90,244,214,215, 12,131, 51, 0,176,105,243,231,125, 23,191,189,248,217,233, 51,166, - 15,255,254,251,239,175, 2,104,150,209, 18, 48,170,117, 43,150, 45, 17,103, 22,152, 76,115, 23,190,206, 45,152, 63,119, 13,128, -135, 28,114, 50, 66,161, 38, 51, 51, 83,201,227,221,222,124,237,163, 37,175, 71, 13,159,180, 50, 49, 53,189,228,210,145,253,251, -239, 11, 11, 11, 67,102, 86,110,255,229,159,108,236,122,232,136,236,201,242, 50,227, 36, 67,193,245,122, 39,109,150, 8,133, 87, -223, 93,190,161, 27,231,210,129,247,191,103, 71, 35,188,125, 43,100,229,149, 96,224,200,241,130,152, 11, 23, 70, 0, 14, 27,173, -186, 3, 52, 78,182,112,121, 93, 63,220,118,110,216,196,126,173,122,242,120,124,232,141, 54,228,151,154,193,114,192,128, 80, 13, - 70,109,255, 68, 80, 84, 97,123,240,131, 31, 50, 30, 60,179,118,172,206, 84,154, 61, 27,192,158,198,191,134,184,249,105,213,184, -145, 81, 94,175,201,170, 48,217, 1, 0, 34, 62, 11, 6,196,157,222, 95, 20, 10,133, 66,249,143,211, 96,175, 67, 30, 0, 28, 60, -120,176,222,246, 59, 44, 75,112, 35, 37, 7, 55, 82,114,112, 62, 62, 31, 86, 34,196,154,229,239, 98,213,210,183, 81,100,228,225, -199,211, 25, 72, 72,201, 69, 66, 74, 46, 10,138,235, 29,233,253,182, 42,165,149, 75,101,221, 63,254, 88,189, 98,196, 64,197, 96, - 55, 87, 87,215,196,171, 95, 87, 44,158,175, 11,125,247,229, 12,145,208, 34,201, 84, 40, 21,253,118,239,254, 46,204,203, 83,171, - 80, 42, 85,175,202,125,187,110,209,104,186,104, 26,211,172,139, 76, 27, 50,126,252,152, 81, 67,189,189,189,184, 89,107, 98,226, - 59,133,134,216, 58,118,232,216, 95,166,237, 56,190,145,221,106, 52, 57,142, 3,143,199,131, 78,167, 67,118,118, 54,146,147,147, -145,144,144,128,140,140, 84, 29, 71,136,144, 5,199,243,241,241,131, 64, 32, 70, 96,155, 0,108, 88,179, 84,254,193, 59,255,235, - 37, 85,136,247,213, 49, 66, 53,154,166,162,226,239,127, 58,124, 52,235,208,206, 13, 44, 0,228, 21,235,113,252,194, 77, 92,188, -150,225,236,137,172, 59,132, 67,155,172,180,155,101,246,148, 72,254,123,111, 46,200, 56,121,242, 84,106,105,185, 5,229, 6, 43, - 12, 38, 27,204, 22, 22, 54,150, 67,128,167, 20,123, 95,239,132,253,191,198,122, 49, 12,243,113, 83,229,105, 54,219,216,251, 67, - 20,152, 58,164, 53, 66,252, 20,200,186,113, 6,115, 23,125,140,232,100, 51,138,139, 75, 96,171, 40, 0,167,207, 68, 65,202, 69, -216, 89,150, 52,117,222,239, 18, 84,147,106, 82, 77,170, 73, 53,255,197,154, 13,121,145,127, 8,155,235, 89, 80, 99,180, 26,226, - 86, 70, 17,110, 36,231,162, 71,136, 47,218,183,241,193,249,132, 98,124,115, 60, 3, 91,142,164,225,248,229,124,112, 2, 21,114, -203,128,196, 84, 29, 18,211, 10,154, 28, 63,155, 47, 17, 78,121,249,229,210,133,157,195,202,250,252,118,104, 14,124, 61, 19,195, - 94,123,173,100, 14, 95, 34,156,226,218, 90,181,243,245,133,243,166,169,228,114,177,197,108, 65,187,182, 1,210,151,102,207,121, -146,113,149,236,116,244, 40, 85,190,161,174, 18,153,236,139, 15,222,121, 85,242,241,143,137,233, 21, 22, 84,236, 57,163, 75, 90, -240,250,226, 34,129, 80,186, 65,229, 27,234,234,168,150,205,102,131,217,108,134,197, 98,129,213,106, 69, 86,198,245,241,191,252, -248,202,200,182,173,221, 70, 74,164, 82, 16, 0,101, 70, 59,146,115, 12, 24, 50,108, 56,191, 71,247,238,225, 74,159,208,167,235, -211, 42, 45, 77, 43,229, 8, 95,117,112,239, 14,254,119, 63, 95,194,215, 7, 47, 96,223,175,151,112,254,196, 33, 59,225,108, 53, -243,127, 41,125, 58, 4, 41,125, 58,167, 41, 91,117,209,213, 44,190,157,162, 27, 45, 83, 62,143, 12, 25, 22,113,236,185, 23, 95, -250,205, 80, 94,152,247,197,186,119,179,242,179, 83,175, 75, 68,140, 93, 46,225, 67,111,178, 99,235, 47,217,152,188,244, 50,174, -165,235, 65, 8,105,114, 2,111, 14,152, 63,229,233, 87, 88,155,213,138, 96,127, 37,118,108, 94,134,241, 67,186, 98,104,103, 87, -220,215, 94, 1,185,192,140,171,241, 55,176,107,199, 86, 59,199,241, 22,208, 31, 50, 20, 10,133, 66,161, 17,173,154,197,167,246, -134, 6,171, 14, 77, 38, 99,202, 67, 83,166,195, 71,235,173,156, 48,248, 9, 81,204,173, 18,228,231,164,225,102, 66, 28, 12, 38, - 27, 68,174,109, 1,169, 55,218, 4, 6, 32,246,198, 62,235,218, 21,145,122,206,110, 78,105, 72,111,252,120, 31,191,155,241, 12, -111,197,114,255,179, 9, 55,138,123,236, 88,244, 21, 30,123, 76,233,177, 98,185,255,217,212, 36, 5, 79, 46, 37,253,158,156, 49, -149,225, 49, 4,175,189,182, 16, 19,198,142,194, 83, 79, 62,206,108,219,182,181, 79,137,131, 71,201, 65,248,233, 27,111,190, 43, -214,149,216, 45,231, 19,244,102,185, 66, 38, 59,149,168,175, 8, 15,244,151,141,158,244, 68,118,228,238, 47, 62, 6, 48,195, 17, -173,106,131,101,179,217, 96,181, 90, 1,128, 5, 0, 30,175,114, 93, 88,110, 65, 94,137, 25,186, 18, 51,236, 44,135, 73, 83,102, -200, 46, 68, 95,158, 1,160,129,246, 90, 28,103,179,219,176,231,231,139,200,186,240, 61,199,240,248,165,181, 26,195, 67,233,211, - 33,200,219,219, 63,106,236,164,199, 61,197,210,202,106,216,242, 10, 51,182,109, 92,222,104, 62,121, 12, 67, 56,214, 94, 98,183, -217, 42,218,181,109,151, 21, 18,214, 85,122,242,183, 35,227, 79, 29,219,163,183,183,123,220,229, 86,106, 14,248, 66, 9,248, 34, - 41,204, 86,199,126, 44,232,110,158, 93, 15,128,121,250,133,133,107,230,189,242, 63,254,252,181,191,195, 98, 50,192,108,172, 64, - 89,105, 49,100, 2, 27,174,158,222,111, 39,172,109, 94, 69,206,165,245,244,254,162, 80, 40, 20,202,127,156,186,211,239,212,164, - 53,104,180,210,174,157,188, 15, 0,130,122,142, 40, 84, 74, 5,110, 2, 30, 3, 93,230, 45,108, 91, 57, 23, 28, 71, 48,250,217, - 21, 80, 5,122, 67, 38,226,195,172, 47,212, 23,221, 58,209,104, 91, 29,134,177, 13, 95,191, 41, 43,240,133,231,219,169,119,236, -208, 11, 1, 96,199, 14,189,240,249, 89,173,213,159,109, 74, 9,236,125,127, 15, 16,150,197,216, 9, 15, 97,202,163, 83,144,154, -107,192, 15, 81,233,168, 48, 90, 28,234, 45, 39,243, 8,233,234,225,238, 57,234,229, 39, 70, 41, 4,124,134,233, 24,160,225,103, -228,219,236,124,190,144, 61,112,161, 52,123,210,164, 71, 61,142,255,244,221, 80,214, 35,164,171,177, 32,254,114, 83,122,102,179, - 25, 44,203,194,108, 54,195,102,179,193,205,163,237, 79,195, 31, 90,153,153,147, 91, 30,153, 91,108,234, 93, 97,179, 67, 87, 98, - 70, 94,137, 25, 37, 21, 86,120,171, 92, 97,183, 89, 58, 55,164, 71, 8,249,122,226, 67,211, 31, 7,192, 99,120,246,175,244, 57, -241, 9,149, 91,254, 48, 89,163, 38, 60,230, 25, 21,115, 11, 55,163, 15, 21, 19,206, 94, 57,138, 59,195,101, 54, 94,174, 32,124, - 6,156, 72,192,216,248, 60, 30,103,181,234,109, 90,173,231,241, 19,199, 15,143, 51,217,147,192, 23, 73,106, 62,107,180,176, 14, - 95, 49,186,155,103, 63, 5,128, 79,214,174, 89,213,111,248, 99,162, 19, 23, 83, 96,180, 1,125,187, 7, 97,239,183,159,155, 9, -177,189, 82,145,115,233, 83,122,111, 81, 40, 20, 10,133,114,155,193,138, 68,101,227,248,219, 35, 90,213,117,163, 99,199,142,173, -219,224, 26, 89,186, 34,184, 43, 5,240,108, 21,136,105,115, 87,225,235,143,231,131,101,109, 32, 4,176,179,142,141, 76, 64,136, -240,231, 23,159, 15, 12,105, 19,200,247,156,246,152,220,248,205, 14,131,108,218, 99,114, 99,167,206,238,165, 47, 62, 31,152, 82, -110,242,239,111,103, 89,156,186,154,135,184,148, 82,196,165,150, 65, 41,115,124,152, 47,190, 88,244,252,242,101, 75, 69, 2, 62, -195, 92, 77,211,235, 51, 11,237,122,190, 80,104,149,203,196,196, 66, 4,230,212, 2, 82, 56,108,226,147,198, 3,219, 63,121, 26, -192,236,134,116,170,123, 26, 86, 71,178,170,215,132, 16,194, 0, 28,199,176,108,102,129, 9,122,171, 13,186,226, 63,140, 22, 99, -111,184,230, 84,233,211, 33, 72,173, 82, 30,230,243,249, 18, 66, 0,155,213,254, 8,124, 58,140,212,231,220, 76,168,109,178,206, - 94,205,198,173, 75,199,116,172,213, 48,221,144,119,227, 23, 71,143,157, 97, 64,248,124,112,124, 30,195, 49, 12, 56, 33,143, 88, - 64, 8, 87, 55, 71, 6, 39,140, 86,181,217, 18, 11,249,139,142,238,250, 88,251,212,152, 80,124, 27, 85,233,249, 76,229,249,101, - 21, 89,212,100, 81, 40, 20, 10,229,238,210,152, 23,249, 7, 69,181,238,140,104, 53,118, 64,132, 0,137,105, 5,104,227,231, 9, -191, 54,237,145,112, 61,246,143,109, 0,236,172, 99,213, 81,251,247,231,100,174, 90,165,230,230,207, 47,237,187,124,185,255,153, -231,103,181,214,116,234,236, 94,250,234,171,233,125, 87,175,214,156,249,249,172,144, 37, 85,227,117, 85,143,205, 69,136, 51,237, -226,120,189,186,134,181,229,191,187, 35, 49,253,151, 43,229,121, 34,145,200,230,237, 42,101, 84, 74, 49,159,207, 19,138,205, 54, -158, 57, 40,188, 59,255, 0,143,233,222,152, 74,181,209,170, 91,117, 88,152,127,107,252,209, 31, 22,118, 26, 60,113,133, 91, 86, -190, 17,165, 22,126, 77,213, 33,159,199,224,202,245, 52,128, 47,138,171, 79, 83,173,114, 59,178,243,155,175,253, 87, 47, 95, 2, -171,157,197,139,243,223,194,147, 51,166, 31,129, 79,135,145,254,129,193, 49,191, 31,248, 74, 62,114,214, 6,164,221,136,206,181, -155,203,118, 57, 99,178,106,204, 22, 64, 88,194,241,138,138,203,148,102, 59,164,168,199,247,153,173, 92,179,174, 28,189,209,142, - 3,231,114,113,240,199, 93,208,168, 20,244, 73, 64,161, 80, 40,148,187,206, 63,212, 92,161,142,185, 2, 26,138,104, 53, 70,128, -159, 23,206,197,165,160,115, 72, 91,104,212, 42,196,223,202, 4,159, 39, 4,143, 1,108,118,199,205, 16,177,218,190, 93,189, 90, -131,180, 20, 5,239,179, 13, 41,129, 47, 62, 31,152,178,122,181,230, 12,177,218,190, 5, 48,157, 16,160,210,108, 85, 26, 46,214, - 9, 95, 64, 56, 91,107, 47, 55, 57, 63, 58,169,162,144,199,227,155,221, 53, 82,206, 93, 35,225,185,171,196, 66,145,144,207,217, - 9,207,234,167, 13, 52, 17,142,235,234,136, 94,237,170, 67,150,101,193, 48, 60,182,202,136, 41, 50, 10,141, 40, 53,241,161, 43, - 49,163,184,220,138,142,190, 10, 28, 59,254,189,129,181, 25,119,212,167,197, 23,138, 52,237, 3,253,240,191,247, 87,195,104,102, -145,152,165,135, 72, 34,241,246,242, 14,191, 60,253,133,215, 37, 47,109,190,133,167,135,186, 99,254,239,183,178, 12, 58,233,235, -206,156, 89,150,101, 97, 52, 89, 68,186,130, 98,215,178,242, 10,181, 76, 42, 49,122,186,105, 10,234,251,172,201,201,136, 86, 53, -114,169, 0,227,250,120,195,100,157, 10,163,217,142,211,191,236,161, 79, 4, 10,133, 66,161, 80,254,160,193, 9,164, 29, 50, 90, - 74,185, 20,132, 47,197,239, 49,183, 16, 28,214, 5, 91,247,159, 71,135,206,125,144, 83,110, 7, 1,175,201,222,134,213, 44,124, -195,120, 17,192,197,241,227,229,126, 15, 62,232, 59,156, 16,225,207, 27, 54,149,101, 2, 64,219, 78,149, 50, 28, 71, 64, 8, 64, -184, 74,195,229, 48,140, 32, 45, 37,167,172, 77,160,183, 2,215, 50,173,102,133, 68,196,115, 85,136,249,158, 26,177, 72, 36, 16, -128, 37,140, 57, 39,231,150,153, 1, 82, 29,145,171, 91,117, 40, 87,250,252, 52,108,226,138,252,212,244,210,232,142, 69,134,174, -165, 86, 49, 8, 1, 58,250, 42, 16,119, 54,146,213,101,221, 76, 52,234,110,108,172, 79,139,227,192,183,218, 57, 92, 78, 42, 69, - 73,133, 13, 37,122, 43,250, 15, 25, 39,234, 31, 49, 30,191,199, 21,128,179,219,176,252,243,200,114,150,216,166, 0,215,109, 78, - 28, 52,239,220,197,171,126,249,197, 21, 18,161, 64, 80, 18,210, 33, 32, 89, 44, 18,218,203,202,202,196,183,127,138, 15,133, 76, -140, 34,189, 13, 0,108,206, 94, 61,165, 21, 54,236, 63,155,139, 3,123,118, 66, 38,147,129,208, 27,138, 66,161, 80, 40,148,218, -248,160,114,250,157,200,170,117,141,249,114,104, 82,105,150, 35,240,112,119,131, 84,161, 70,138,206,138,114, 70,139, 98, 3, 1, -203, 86, 70,180, 26, 9, 60,213, 59,187,247,254,253, 57,153,251,246, 21,108,217,191, 63,167, 86, 67,239, 63, 34, 89, 53,107,142, - 56,172,201, 16,246,216,254, 67,191,149,142,239,237,233,202,227,243,141, 34, 33,207, 44, 16,241,173, 34, 1,207, 38, 18,240, 44, - 94,106, 33,255,183, 3,187,196,132,193,111, 77,105,154, 76, 38, 68, 68, 68, 96,244,232,209,152, 48, 97, 2, 30,126,248, 97, 4, - 5,133,106,121,124,198, 66, 24,142,243, 20,151,163,189, 39, 3,129, 41, 3,191,236,250,200, 16,119,106,239,101,214,108, 26,135, -219, 45,231, 31,154,132,112, 69,165,102,152,172, 44,138,245, 86, 20, 87, 88, 97,247,236,139,189,167,179, 97,180,176, 72,139,249, -222,152,159,155, 57,215,156,119, 51,165,137, 83,241,218,237,255,146,204,103,158,154,145,175,146,242,110, 14,232,119, 95,190,135, -187,155,157, 97,254,136,188, 50, 12, 3,169, 90, 11, 87, 23, 21, 82, 46, 30,194,209,229,195,140, 0,222,116,164, 60,107,163,150, - 11, 48,190,183, 55,198, 77,154,138,206,125, 70, 58, 98,172,233,140,246, 84,147,106, 82, 77,170, 73, 53,255, 75, 84,207,113, 88, -189,118,108,100,248,106, 3,212,206, 71,129, 14,190, 10,152,172, 90,152, 44, 44, 42, 76, 44,202, 12, 86,148, 25,108, 72,201, 53, - 32,110,127,203,115, 88, 25,197,170, 28,241,147, 16, 0, 76,165,193,115, 52,122, 34,182, 90,222, 95,181,252,195, 71,118,117,239, -102,121,105,140, 79,235,216, 20, 75, 54,195,240,140, 60,190,192,230,166, 18, 8,227,227, 99,243,207, 68,253, 52, 80,106,103, 31, - 55, 52,162, 99,183,219, 75,125,125,125, 1,220, 62, 5, 79,104,123,217,132, 83,145,175,181, 29, 52,126,185,231,199, 75, 22, 26, -120,124, 17,199, 8, 68,113,172,205,184,211,168,187,177, 1,141,216, 15,158, 72,122,253,220,165,107,125, 92,220, 90,227,102, 86, - 5, 42, 76,118, 88,237, 28, 92,149, 34,100, 94, 57, 98, 77,137,143,254, 78,159, 29,187,181, 25,197,182, 35,225,122,156,223,168, - 81, 35, 31,234,211,167, 47,127,241,226,183, 16, 28, 28, 12,163,209, 8, 30,143,135,214,109,218, 35, 37,225, 18,206, 70,190,207, - 26, 10, 83, 55, 2,120, 15, 64,190,179, 95, 82, 80,102,193,161,232, 60, 68,254,248, 45,248, 66, 49,189,157, 40, 20, 10,133, 66, -185,147,153,117,214,155, 29, 50, 90, 38,147, 41,229,254,136,113,224, 56, 2,150, 0, 28, 91, 21,121,226,254,136, 62,177, 54, 83, - 74, 75,115,199,113,236,249, 79, 55,111, 25,221,189,215, 32,126,152,191, 18,101,133,185, 56,123,234, 87, 59, 56,114,198,145,253, - 11, 11, 19,245, 50,175, 14, 15, 61, 50,249,193,221, 51,158,154, 85, 50,112,200, 16,133, 86,235,109,206,204,202, 52,124,185,253, - 27,219,145,159,246, 13,228, 96,127,180,176,240,166,190, 49,157,210,210,210, 79,234, 75,151,136,149,253, 1,180,229, 11, 24,139, - 49, 63,209,169, 22,225, 5, 89, 25,147, 62,124,255,157,212,199,158,157, 39,110,231,219, 30,121,165,124,164,100,230, 34, 62,106, -159, 57, 43,225,194,143,101,153, 23,159,118, 80, 42,167,158,180, 76, 0, 31,159, 61,123, 38,124,212,168, 81, 35,135, 14, 29, 74, -102,206,156, 9, 66,128, 95, 54, 63, 79,138, 82,206,126,143,202, 40, 86, 82, 51,207, 75, 90,212,153, 75,110, 15, 15,236, 41,112, - 87, 61,141, 45,223,254,100, 3,225,210,232,253, 68,161, 80, 40, 20, 74, 13,205,111,163,149,113,189,114, 60,173, 63,155,242,220, -188,233, 91,183,126,253,193,215,219,119,245, 55, 89, 44,190, 4,162, 12,214,110, 57,161,103,177,216, 81, 13,163,238,102,180,187, -123,199, 78, 95,126,254,233,155, 95,110,249,108, 16, 56, 54,132, 1, 82, 9,131,223,164, 54,118, 70, 83, 38,171, 81,179, 84, 80, -190,105,248, 67, 43,141,133,133,250,175,157,221,215, 88,120, 35,151,199,183,182,222,180,230,253, 21, 60, 30,127, 4,203,114, 66, -142,181,221,100,173,166,143,140,249, 55,246,195,225, 86,110, 40,106,100,219, 85, 0, 87,143, 31, 63, 62,224,248,241,227,189, 0, -124,130,202, 57, 20,163, 91,114, 94,204,133,229,195, 94, 89,248,202, 47, 11,192, 4,112, 28,129,157,229,210, 68, 70,195, 48,122, - 79, 81, 40, 20, 10,133, 82,195, 76,220, 57,104,169, 99, 17,173,191,138,226,226,164,114, 20,227,165,150,234, 20, 22, 38,234, 1, -220,209,115,207,208, 66,221,184,196,178, 31,144, 88,246, 67,115,247,175,200, 75,206, 7,146,103,180, 48, 27,142, 52,100,255,189, -106,185, 43, 20, 20, 92,175, 64, 1,122,211,123,136, 66,161, 80, 40, 20,167, 13,151, 99,141,225, 41, 20, 10,133, 66,161, 80, 40, - 77,154,172,218,107, 0,149,109,207, 27,234, 57,224,204,204,220,205,233,125,112,140,106,182, 88, 83, 8, 64, 12, 64, 9,160,169, - 42,205,145,168,154,175,145,150, 39,213,164,154, 84,147,106, 82,205,123,168,217,148,246, 49, 80,254, 84, 3, 70, 53,169, 38,213, -164,154, 84,147,106, 82,205,255,158,230, 63,153,153,245, 44, 0,254, 70,109,180, 40, 20, 10,133, 66,249,171,112,119,239,168, 4, -106,218,245, 54,137,220, 35,212, 11, 0, 12, 5,215,117,180,244, 40,245, 80,123,158,195,187,210, 70, 75,200, 19,136, 95,145,171, -220,175, 43, 52,238, 89,255,241,194,101,130,218, 40,230, 12, 31, 24,184, 55,184,173,108,130, 51, 59,202, 61,131,190,242,110,223, - 59, 93,161, 13,154, 3,159,238,178,150,100, 66,161,109,235,169,108,221,243,148,202, 55,252,129, 63,225, 24, 37, 97, 97, 97,125, -195,194,194,250, 2,144,220, 13, 65,185, 54,104,170, 95,135, 62, 81,218,118,221,126, 85,120,117,156,124,183, 51,172,244,233,224, -174,108,221,227, 7,101,171, 46,197, 74,159, 46,101, 74,191, 30, 39, 84, 30,161,237,154,218,175,245,248, 15, 67,222,221, 25,183, -179,245,248, 15, 67,234,219,238, 58,106,173,234,237, 93,137, 75,220,199,125,164,164,207,149,230,209,186,255, 84, 23,159, 65, 11, -220,157,221,207, 55,168,207,213, 54,225, 3,242, 90,117,236, 29,231,232, 62,126,193,125, 47, 6,132,245,215,249, 5,245,141,166, - 37,239, 24, 82,207,182,125,165,174,254,145, 18, 87,255,159, 36,110,109,135,180, 84,207,199,199, 71, 22, 18, 18, 50,170, 79,159, - 62,207, 13, 27, 54,236,229,110,221,186,205, 12, 8, 8, 24,113, 47,127,232,203,181, 65,111,152,133, 76,129, 89,200, 20,200,181, - 65,111, 52,253,124, 13,254,128,225,177,217, 12,143,205, 86,104,131, 63,248,187,156, 43,137, 87, 80,128, 92, 27,180, 90,229, 29, -118, 94,166,237, 56,206,217,253, 93, 93, 93, 71,120,122,122, 78,172, 94, 92, 93, 93, 71,208, 59,160,217,212,142, 98,181, 56,162, -197, 23, 74,228, 39, 31,123,234,197, 78,203,222,121, 93,186,102,203, 94,172, 89,178,240,154,185,162, 36,236,239,120,228, 30,109, -123, 69,243,121,124,191,218,105, 44,199,102, 22, 36,159,239,121, 55,244,131,219,200,158,126,243,213,233,243,167, 62, 18, 17, 16, - 49,118, 46,115, 35,217,184,207,113,139,134,174,223,253,240, 99,235,168,223,126, 93,187,101,203,230,247,242,237,193,171,133, 18, -193,167,101, 25, 87, 75,156,201,131,218,179, 93, 91,129,194, 35,234,254, 9, 47,122,199, 28,251,102, 43,107,225,134, 27, 10,106, -205,254,221,124, 60,219,183,111,127, 31,159,207,119,159, 51,103,142, 8, 0, 62,254,248,227, 14, 44,203, 22,222,186,117,235, 2, -154, 49,248,105,165,193, 12,158,254,201,138,119,191,126,224,129,209,200, 46,168,192,242,213,235, 7, 31, 62,248,221,195, 21,186, -196,239,239,198, 57,113,113, 9, 84, 67,164,186, 50,247,213,247,180,163, 6,223,199,215,155,236, 56, 28,117,105,192, 55,235,223, - 59, 15,132,246, 42, 47,184,222,224,152, 98,156,161,116,145,151,146,140,226, 12,165, 0, 48,245,142,151,189,210, 22,225, 41, 99, - 71,249, 72, 4,151, 10,129, 38, 39,125,116,105,211,255,136, 80, 34, 9,224,241,120,224, 49, 0,143,199,128,207, 48,149,243,132, - 90,141,105, 89,241,191,143,252, 59,220, 39, 42,255, 94,185,224, 11,220,121,204, 31,249, 99,120, 85,107, 66,202,114, 19, 79,186, -223,133,175,209,116,234,224, 18,222,191, 67,197,151, 39,146,139, 20,130,129, 47, 71, 50,132,247, 89,250,239,171, 47, 59,100, 0, -164, 82,215, 3, 7, 14,120,142, 26, 53, 74,163, 13,159,112,194,145,125,196,124,125,216,193,131,251, 69,163, 70,141,116,226,250, - 12, 26, 14, 30,111, 59, 3, 8, 57,142,124,204,231,200,119,250,194,132, 91,128,115,179, 79,201,180,193, 79,243, 64, 28,126,206, -112, 96,162,141,121, 55,182, 52,183,112, 5, 18,245, 48,161, 72,244,114,219,160,206,221,179, 82,111, 70, 87,232,203, 87,219,205, -165, 39,156, 22,178,217, 95, 57,246,123,204, 3, 2,161,144, 25, 53,172, 55,223, 12,252,218,146,147,238,229,229, 53,113,221,186, -117,237,250,246,237, 11, 0,176,219,237,234,221,187,119,123,191,255,254,251,138,132,132,132,230, 78,156,234,235,233,233,233, 47, - 22,139,125, 1,192, 98,177,100,229,231,231,167, 3,104,242,135,191,194,171,157, 7, 8,222,251, 61, 42, 74, 0, 0, 3, 6, 12, -252,192,255,254,217,174,124,145,210, 88,111,113, 88,202, 21, 37,183,126,157,119,246,220, 25, 6, 0,250,244,238,251,186,220, 35, -244,211,123, 25,217,146,106,131,123,243,128,249,125, 6, 68, 76,154,242,232,116, 94,120, 71,127,140, 24, 62,244, 53, 35,112,192, -169,107, 70, 32,144,157, 63,127,190, 61,143,199,227,219,237,118, 83,159, 62,125,210, 91,146,175, 86, 65,125, 79, 51,224,181,182, -218, 45,159,231, 39, 69,127, 0,220, 49,113, 12, 95,211,186,251,155,224, 11,158,229, 56, 46,163, 60, 61,186,223,191, 48,162,117, -103, 57, 59,171,196, 19,136, 95,158,250,228, 11,157,230, 45,248,159,116,238,154,227,136, 92,255,122,193,223,213,100, 1, 0,159, -199,247, 59,114,244,136, 86, 46,230, 3, 0,244, 38, 59, 30, 24, 53,170,233, 55, 66,155, 94,191,241, 24, 38,184,122, 66, 27,214, -110,149, 10,132, 98, 19, 83,105,144,192, 0,240,104,213,230,184,151,253,164,124,234, 35, 17, 1,219,119,253,156,153,158, 89,232, -244, 67,141,225,139,208,103,224, 8, 68, 12, 31,169, 57,127,238,244,123,155, 55,110,120,195,110,181,109,224,108,220,106, 83,209, -205,236, 38, 31,230,222, 29,123,136,149, 30,135, 39, 61,247,190,187,137,231,134,197, 75, 62,241,136, 58,180,227, 68, 86, 70, 87, - 46, 45, 45,195, 68, 24,230, 90,113, 81,206,203, 21,185,183,110, 56, 90,100, 74,165,178,157, 82,169,236,218,165, 75, 23,233,194, -133, 11,133,131, 7, 15,254,195,178,207,156, 41,250,237,183,223,124, 86,174, 92, 57, 58, 54, 54,214,164,215,235, 47,235,245,250, - 36, 56,209,208,222,219,219,115,246, 67, 15,142,195,208, 73, 47,130,229, 24,204,124, 97, 30,142, 28,218, 51, 11,192, 93, 49, 90, - 54,185,250,253,103,159, 91,232,217,231,190,110,252,247,118,220,128, 76, 44,192,200,158,193,204,147,115, 22,185,108, 89,251,222, - 23, 40,192,160,250, 34, 89,156,161,116, 81, 39, 15,203,163,227,251,182,197,254,157,150, 71, 49,236, 85,240,228,154, 15, 50,246, -255, 47, 30, 0,218,141,154,163,146,176,249,235, 90,185,240,181, 18, 54,127, 93,187, 81,115,142, 37, 29, 94, 87,222, 88, 94,132, - 18, 73,192,206, 29, 59, 58,186,170, 68, 16,240, 24,240,249, 12, 4,124, 30, 76, 22, 22, 15, 63,242,232, 93,187,204,101,218,142, -163,121,192,147,149, 47,108,124,101,204, 75,252,201,153,115,194,240, 69,238, 7,247,255, 40,208,106, 36,224,243, 25,240,121, 0, -159,199, 32, 85,103,196,211, 79, 63,169,105,169, 97,127,160,191,246,190, 87,166, 4,143,236,211,201,173,203,183,103, 24, 77,159, - 7,166,184, 23,152,228, 79,236,218,247,235,163,100,192,188,115,132,112, 43, 50, 79,126,114,180, 49, 17,179,217,172, 27, 57,234, - 1, 53, 35, 80,200,143,237,221, 58, 80,192, 99, 96, 99, 9,236, 44, 1, 91, 53, 55, 42, 83,245, 11,134,199, 99, 64, 56,130,103, -159,125, 26, 35, 71, 61, 96,224,236, 92,166,227, 15, 57,222,246,195,199, 78,121,154,109, 28, 86,174,219,242, 94, 69,105,254,123, -201,241,238,169,250,210,130,121,198,188, 68,135,231,193,224,129,244,204, 72,138,123,110,199,193,179,232, 20, 22, 10,150,171,204, -103,176,159, 2, 59, 34,207, 34, 36, 56,164, 50,223, 28,249, 63,123,103, 29, 29,197,245,183,241,103,214, 53,238, 9,193, 3,193, - 18,220,221,139,107,209, 66,113, 90, 74,141, 34, 45, 45, 80,180, 20,167, 64, 11,148, 82,160,184, 7, 11, 14,165,104,128,144, 0, - 73,136, 19,223,216,186,239,220,247,143, 77, 40, 18,217, 0,125,251,107,123, 63,231,236,217,204,100,247,217, 59,115,103,238, 60, -247,123, 13,181, 3,229,104,214,180, 25, 0,188,150,209,226,137,156,190,233,208,123,244,130, 62, 67,199,193,219,203, 11, 28, 98, -233,115,238,196,111,125,126,217,248,253, 23, 86,131,106, 69,133,196,136,237,217,115,129,176,236, 27, 71,157,252,253,253,189,154, - 53,251,115, 58, 70,171,213,138,106,213,170, 33, 61, 61, 61,248,117,234,105,126,126,126,189,231,205,155,231,221,171, 87, 47,190, -175,175, 47, 0, 32, 43, 43, 43,224,244,233,211,141,231,205,155,151,147,153,153,121, 2,101,204,232, 99,179,112, 4, 28, 30,184, - 98,177,212,126,140, 96, 56, 51,166,189, 23,234,227,231,111, 44,233,243, 10, 69,150,112,230,135, 23, 25, 30, 79, 80,244,121,112, - 8, 97,153, 50,162, 68, 93,249,124,126,137, 45, 20,102,174,115, 75,194,119,153,192,225,114,236, 23,171,213,162, 40, 72,189, 91, -183, 2,145,184,250,124,161, 96,211,224, 97,227, 90, 15, 25,212, 31,126, 94, 46, 56,247,123, 36,166, 76,251,204, 98, 53, 91, 86, -189, 86,225,193,229,242,114,114,114,146,221,220,220,124,223,252,121,203, 84, 63,123,230,148,247,185,243, 23,102,175, 92,179,110, -170,217,100,181,176,132, 60, 91,199, 88, 34, 17,241,187,245,121,215,217,187,102, 75,241,186,121, 19,248,255,194,136,214,230,183, - 98,180,132, 18,167,119,191,158,249,145,120,225,174, 27, 56,177, 97, 74,174, 78,149,235,245,172,166,224,236,122, 87,171, 42,108, -252, 58, 41,148,123,213,110,197,112,121,147, 25, 46, 87,198,112, 24, 33,107, 99,159, 90, 77,166, 69,250,188,184,204, 55, 61,122, -150, 37, 56,248, 71, 78,197, 12, 16, 65,208,206,189,135,189,125, 92, 69, 48,152,109, 24, 54, 98, 52,118,236,216,225,228,229, 34, -132,193,100,197,247, 43, 87,170, 53,201, 39,188,147,159, 22,164,119,237,251, 89,120, 66, 82, 78, 84,106,166, 97, 95, 69,211,102, - 52,219,160,210, 89,161, 51,114, 80,171,126, 51,124,191,170,142, 56, 53, 37,241,179,237,191,108,157,254,240, 33,119, 7,203,229, - 44, 48,100, 62,122, 90,226, 77,231,219,160,135,179,155,199,238,129,147, 23,187,198,229,240, 64, 96, 70,188,179, 24,239,142,157, -238, 92,195, 87, 2,153,152,235,154,152,146,238, 55,227,139, 47,126, 79,176,145,230, 42, 69, 66, 98,121,233,169, 90,181,234,160, - 62,125,250, 72, 63,255,252,115,126, 96, 96, 32,126,249,109,127,149,118, 61,134,246,205,200,204, 14, 36,132,192,199,219,251,233, -196,247,135, 30, 63,121,242,100,202,211,167, 79,249,203,151, 47,111,113,248,240,225,122, 89, 89, 89, 14,215, 76,109,132,192, 96, -180,193, 86,244,128, 84, 40,141, 21,246,167, 1, 1, 1,162,244,244,116,227,115, 81, 6,230,207, 64, 33,211,163, 75,135, 22,188, -159, 78, 37, 65, 99,176, 65, 38,230, 35, 41, 91,135,166,141, 66,152, 45, 54,107,195,146, 4,199,191,219,123,174,143,156,244,236, -215,170, 58,188,221,164,216,246,195, 98, 28,187,158,216, 51, 91,195, 96, 61,225, 78,246, 19,241,186,201,216,204,245, 29,155,214, -244,237,220,164, 10,110, 55,173,233,123, 37, 34, 38, 86, 50,116,229, 71,233, 26,254,185,130,211,211,213, 37, 23, 60, 28,184, 59, - 9,240,243,153, 20, 72,197, 60,200,196, 60,200, 68,246,119, 14,135,121,179, 90,173, 95,221, 64, 46,107, 27,207,229,242,198, 15, -127,119,168,255,200,225, 67, 9,184, 28,236, 63,120,188,255,174, 93, 59, 51, 45,102,211, 86, 27,135,251,115,105,215,207, 11, 39, -148, 3,120,187, 8,241,197,214, 40, 56, 75,248,112,146,242,225, 44,229,163,115,168, 23,184,175, 63, 9,140,219,148,254, 53,122, - 77, 25, 88,181, 83,112,101,121,173,251,241,202,135,227, 23,221, 89,115,169,176,211, 39, 63,172,174,231,161, 41, 52,241,190,153, - 49,145,151,150,145,209,105,255,241,203,157,109,166,113, 49, 86,179,246, 75, 69,228,254, 18,163,194,105, 49,215, 27, 7,180, 28, - 34, 54,107, 44, 15,238,199,164,213, 44, 48,138, 16,157,172,130, 76,204,131,188,248,220,138,121,144,137,249,144,139,121,200, 72, - 75, 66,190,150,251,123,186, 7,167, 19, 46, 95,183, 86, 36,225, 6,179, 13,247, 18, 53,168, 26,220, 8,126,126,254, 48,245, 26, - 85,245,230,133,131, 71,111, 93, 62,178, 84,151,245,248, 75, 71,117,126, 11,187,129,217,159, 78,142, 96,128,187, 69, 15,233,198, -223, 44,219,208,228,219,217, 31,190,176,111,198,130,117, 77, 94, 63,146,229, 52,183,243,192, 15, 22,180,235, 54, 16,234,252,108, -252, 17,190, 15, 61,250, 12,198,168,113, 31,195,213,213,243,251, 85,139,102,222,183, 26, 85, 23, 94, 41,115,125,235,180, 13,105, - 80,119, 87,128,191,127, 32,203,218, 87,249, 32, 4,208,168,149,152,249,201, 68,176,132,160, 97,227,230,157,197,237,186, 17, 82, -180, 26, 72,110, 94,174, 54,230,241,195,174,134,156,152,155, 14,159, 75,131,193,162, 80, 40,112,239,222, 61,196,198,198, 34, 58, - 58, 26,121,121,121,112,113,113,209,104,181,218, 10, 5,239, 67, 67, 67, 71, 94,184,112, 65,236,230,230,246,108,167,201,100,130, -147,147, 19, 70,142, 28,201,239,222,189,123, 64,239,222,189,199, 68, 69, 69,253, 6, 64, 85, 98,122,242,159,100, 56,249, 4,255, -216,161, 99,135,169, 0, 32,113,246, 75, 92,255,203,241,232, 50, 43,180, 46,254, 85, 90,183,110, 83, 19,132,128, 1, 89,171,203, -139,205, 42, 35, 74, 36,187,113,227, 70, 13, 46,151,203,251,243, 25,196, 98,227,182,189,117,206, 94,125, 48,104,217,247, 43,196, -206, 50, 17, 20, 74, 19, 38,140, 26,232,240, 51, 88,226, 19,220,171,117,235,246, 71,191, 93,240, 53, 79, 46,147, 33,252,102, 2, - 62,250,228, 11, 67,102,114,212, 10,194,242, 55,232, 20,177, 57,111,248,168, 36,120, 11,212,170, 36,135, 83,191, 30,226, 41,239, -245, 19,155, 44, 54, 20,106, 45, 48,154,109,176,177, 4, 74,173, 5, 15, 83,213,240,116,174,248, 82,110,132,144,102, 0,188, 0, - 40, 24,134,185,253,252,118,113,133,174,216, 27,191,180,157, 91,244,124,240, 0, 96,130,125,164,254,179,203,167,104,187,180,253, -197,223,127, 8,160,110,145,166, 13,192, 45,134, 97, 10, 74, 49, 91,175, 68,185,120, 97, 97, 97,164, 79,159, 62,207, 74,252,151, -183, 95, 70, 36,224,251,203, 92,188, 64,200, 35, 60,191,128,177,183,111, 64,222,138, 85,107,220,167,125, 48, 57, 69, 85,152, 95, -165,104,247, 57, 71, 30, 22, 60,134,187,170, 67,155,150,221,167,126,240, 1,130,107, 84, 18,216,108, 54, 18, 21,155,104,217,254, -243,182,177, 87,174, 11,215,168,210,162,230, 62, 23,130,172,208,176, 79, 27,107, 75,123, 57,130,101, 99,109, 47,215,110, 95,209, -100, 24,192, 85, 46,196,143,167,146, 64, 8,192,128,192, 69,198,199,158, 75,105, 72,140, 56,164,234,211, 80,165, 29,185,108,126, -231, 78,189,166, 95,120, 24,111,216,151,147, 99, 56, 3, 32,171, 44,205,146, 11,116, 22, 70,179, 13, 22,171, 21, 7,142, 31, 71, -207,206, 45,208,186,117, 11,180,111,215,154,119, 39, 34,114,220, 7, 83, 39, 6,226,207,209, 29,207, 52,197, 62, 65,205,228, 46, -158,251, 6, 77, 93,238,244, 32,205, 10, 30, 23,168,238, 43,129,187,147, 0, 38, 43,131,100,133,185,232,206,113,197, 71, 51,218, - 68,194,144, 0, 0, 32, 0, 73, 68, 65, 84, 22,184,207,254,108,234, 73,149, 66,216, 0,120,100, 46,235,216,117, 58,157,112,244, -232,209,124,139,197, 98, 30, 57,225,227,238, 89, 89,138,254, 27,215,126, 39,242,246,246,129,206, 96, 69, 68,244,147,186,223,126, -187,160,250,241,211,151,142,204,255, 98,202,209,158, 61,123,186,236,221,187,151, 45,239,124,190, 80, 67,204,206,253, 97,219,174, - 3, 59, 86,175, 88,130,152,148, 2,252,252,211, 6, 16,155,245,199,114, 78,213,243,154,100,244,232,209,146, 35, 71,142, 84, 74, - 75, 75, 83,233,116, 58,197, 11,241, 8, 14,195,203,206,215,193,211, 73, 8, 1,143, 3, 31, 55, 49,188, 93, 68,224,115, 1, 14, -195,216, 74,210,252,121,223,137, 69,172, 78,137, 99,187, 77,195,183,253,176, 24,227,166,125,133,168, 92,225,105,142,212,101,209, -135,195, 7,205,246,146,216,122,250,187,114,188, 59, 55,169, 10,153, 88,128, 57,211, 71,163,121, 68,178,119,122, 33,251,149, 66, -207,109,180,224,244,179,197,186,207,189, 24, 28,177, 71,176,156,164,124,156,222,245,125,142, 86,169, 80, 22, 55,201,153,140,134, - 20, 7, 47,227,115, 37,212,108,103, 55, 10,169,191,120,234,164,241,156, 54,173,154, 19, 14,135,143, 92,181,137, 33, 4,248,228, -163, 41,248,112,202, 68,223,167, 25, 57,223,108,216,240,227,220, 11,103,201, 66,173,226,241,252,178, 52, 57,140, 61, 10, 36, 23, -243, 32,151,216,141,139, 92,204,131,193,100, 3,195,128,235, 90,185,177,146,177, 71,114, 51,242, 83, 74,173,129,191,160,233, 94, -185,254,249,179,137, 78,117, 10,246, 21, 92, 79,202,136, 94, 20, 17,153,125, 11, 64,126, 96,123,215, 49,102, 43,129,198, 96, 69, - 82,182, 14, 86, 51, 97,198,189, 83, 5,213,134, 48,193, 75,182,221,221,113, 42, 18,206,207, 21,250, 47,104,166,223, 56, 96,240, -104, 48,112,216,234,117, 63,221, 94,177,248, 43,110,174,210, 4,150, 16,136,133, 92, 72,132,188,162, 23, 23,122,173, 18, 27, 54, -109,201,178,130, 25,132,203,151,173, 21,185, 62,193,146, 81, 3,123,181,223,195, 0, 66,134, 35, 72,243,175, 82,181, 74,151,190, - 99,197, 93,250,141,134,205,106,154, 29,113,149, 92,212,229,196,156,119, 68,179, 65,189,186, 96,128,187,218,156,216, 41, 0, 32, -243,174,253, 99,157,224, 58, 77, 94,222, 23, 20, 20,220,196,145,124,127, 22, 41, 21, 59, 77,115,115,247,250, 42,184,126, 35,239, -236, 2, 35,227,228, 81, 9, 73,113,247,176,123,211, 55, 59, 89,131,105,193,249, 19,251, 22,175,249,249,240,187, 93,122, 14,196, -182,141,223,205,201,203,124,102,180,206, 61, 23,173, 26,181,125,235,230, 64,190, 80, 4,139,149,133,197, 70,236,239, 86, 27,242, -243, 11, 96,177,178, 16, 75,157, 96,101, 25, 88,108, 44, 44, 86, 22, 70,147, 85, 54,101,116,239, 15, 12,192,205,146,210, 25, 80, -167,195, 25,129, 72, 84,133,192,190,118, 45, 33, 4, 73, 89,122,142,159,159,223,111, 0, 32, 18,137, 32, 18,137,192,178, 44, 34, - 98, 20,211, 60,131,107, 79, 69,145,193,179,153, 77, 41,133,201,215,122,148,118,236,190,190,190,125, 95, 54, 89, 6,131, 1, 26, -141, 6, 87,175,223,118,217,186,227, 64,207,164,148,180, 26, 44,113, 49, 58,121,215,232,161,206, 73,232, 91,218,249, 84,103,199, -124,224,220,114, 34,231,243, 15,199, 4,173,219, 30,118,235,201,153, 69,101,246,211,170,214,101,150,233,243,201,131,155, 46, 91, -251,115, 92,193,181, 31, 63, 45, 47,143,120, 60, 30, 95,161, 80, 60,187,191,215,111,217,221,244,110, 76,250,128, 53,171,215,136, - 35, 18,212,120,144,148,129, 49, 93, 43,219,107, 56, 14,228,187,204,167,134,103,245,154, 53,127,219,176,118, 25, 47, 46,195,128, - 31, 14,221,194,133,163, 63, 94,205,202,185,217, 19,217,153,250,215, 41, 67,222,130,209, 42, 85,243, 98,100, 46, 52, 6, 43,140, - 38, 43, 44, 44,129, 74,103, 65, 78,161, 9, 42,157, 25, 26,189, 21, 99,186, 85, 46,241,123,229,248, 17, 47,134, 97,194, 8, 33, -125, 8, 33, 93, 1, 8,139,183,237,207,108, 38,172,200,144,189,176, 61,123,246,236, 47,151, 46, 93, 26, 93,252,217,226,253,197, -159, 45,107,255,115,223,247,152, 51,103, 78,131,101,203,150, 45,105,213,170,213,158, 63,254,248, 35, 17, 64,129,163,205,135,188, -231, 15, 38, 44, 44,172,188, 19, 93,195,108, 49,139,156, 37,124, 84,175, 86, 25,239,127,185,205,243,215,101,227,115,196, 66, 30, -247,212,169, 83,238,121, 38, 57, 56, 28,174,195, 85, 20,185, 87,173,214, 2,129,240,196,202,149, 43, 49,188,111, 59, 73,106,174, - 69, 19,153,170,207,214,154, 96,245,246,170, 45, 92,180,100,153,124,217,242,239, 63, 12, 59,198, 22,106,178, 31,126, 95,114, 19, - 95,211, 59, 92,230,185, 62, 88, 12, 3,194,218,210, 10,146,111, 55, 5,128, 55,233,139,165, 49, 88,192, 45,234, 91,195, 48,128, -206, 96, 5,151,203,228, 20,198,236,123, 56,114,225,162,206, 59,247,156,205, 32, 28, 87,181, 86,155, 36,133,125,205,193, 10, 99, - 48,217, 96,180,216, 16,125, 63, 2,237, 91,214, 67,235,166,117,160, 51,216,160, 51, 90, 81,173,102, 48, 0,120,150,152,113, 92, - 78, 34,177, 89, 12,132,216,156,250, 52,243,130,183,171, 16,126,110, 34,136,132, 60, 88,172,128,222,196,194, 96,178, 33, 57, 71, - 15,181, 94,130,144, 14, 67,171,123,248,221, 49,102, 37, 75,142,228,167,222, 25, 84,166, 57,181,217,176,253,183, 3, 65, 25, 25, -217,253, 79, 30,217, 37, 82,168, 44,136, 76,214, 34,167,208, 8,112,189, 48,111,201, 15,162, 89,159, 78, 26,176,125,247,193,148, - 46,237, 90,164, 84,244,152,117,138,152,157,251,246, 31,248,177, 79,159, 1,146,232,155, 39, 17,119,239,252, 98,109, 78,133,250, -103,113, 26, 54,108,104,157, 52,105,146,122,201,146, 37,129,199,142, 29,171,166, 80, 40,238, 1,176,184,186,186,214,169, 29, 84, -229,126,248,233, 83, 1,189, 7, 12,229,167,229,234,225, 34, 21,160,138,183, 20,215,175,158,177, 8,133,252, 18,251,155, 20, 53, - 15,142, 64,151,153, 56,118, 61,177,103,116,158,248,210,196,241, 99, 82,194,175,196,228,173,223, 17,254, 93,128,220,114, 79,204, - 42,214,223,105, 90,211,119,246, 71,163,177,116,221, 78, 92,142,136,201,209,114,252, 22,103, 26,173,103, 75, 15,165, 3, 60, 46, - 3, 39, 9, 31, 90,149, 66, 25,127,247,116,237,183, 20,166, 30, 19,126,100, 39, 39, 95,109,193,211, 92, 3,147,145,175,134,141, - 37,112,149, 10, 96,101, 9, 10,243,115,153, 93, 59,119,224,246,237,235, 28,112, 57, 19, 0,204, 47,243,132, 50,246,166, 66,185, -152,111,143, 8, 73,236,239, 22, 27,139,224,160,154,216,188,126,149,179,167,183, 15,218,182,119,188,111,180,147, 71,149,134,123, -126, 89,143, 75,127,220,237,120,121,205, 15,205,228,254, 94,235, 24,198,182, 2, 4, 6,163,217, 6,101, 97, 1,132,166,167,104, - 30,160,128,187,212,134,100,149, 31,162,178,226,228,229, 21,248,121, 81,135,239, 49,100,192,220, 3,199, 47, 44,237,209,173, 35, -162,146, 85,144, 8,121, 16, 11,185, 16, 11,185,224, 51, 54,172,218,244,163,165, 64,169,238,147, 23,125, 52,247, 53,174,207,115, - 69,181, 95,187,185,179,105,188,118,174,155,251,235,196,153,203,123,244, 28, 56,150,137,186,125,241, 75, 29,112,222,177,138, 30, -113,104, 31,203, 58,254,140, 19, 59,121,174,157, 62,107,209,244,238,125,134,130,203,229,193, 98,177,224,224,222,157,248,229,135, -121,143, 77,154,188,177, 0, 88, 83, 14,119,210,190,157,155,134,206,252,102, 21,211,160, 97,243, 22, 23, 51, 95, 93,142,150,229, - 50, 63,189, 55,126,242, 48, 31, 31, 31,167, 63, 35, 90, 4,181,131,235,161, 87,191,193, 56,115,244, 48, 30, 70, 71,130, 37,118, -195,196,178, 4,133, 5,121, 89, 86,139,105,123,169, 45, 30, 98,113,149,109,191,236,168,197,225, 48, 48, 91, 88,152,172, 44, 62, -253,224,125,211,148, 79,190,108,219,171,123,135,104, 33, 23,170,228,212, 76,215,235,119, 31,133,176,124,121,224,248, 25,171, 4, - 6,163, 13, 74,157, 5, 39,127, 46,221,235,136,221, 42,183,170,218,164,215,248, 41, 95,111, 22,137,184, 28,115,253,218,129,137, - 29, 90,214,127, 90,217,223, 83,253,237,178, 31,154,255,126,243,110,175,119, 71,142, 23,143,169,211,132,241,247,144, 56,189, 63, -114, 96,168,205,106,126, 79,151,255,180,212,249, 5,249, 82,183,194,202,213,130,116,127, 70,140,106, 31, 98, 8,170,191,224, 60, - 24, 36,234,179, 99, 7, 1,128,159,127,101, 3, 95,228,172,174, 64, 4,134, 0,192,186, 45,187,155,222,143,205,152,184,122,245, - 26,105, 68,130, 26,247, 18,148, 16, 9, 56, 48, 91, 88, 48, 14, 6,181, 89,194,157,252,213,156,217,206, 5, 90, 27, 46, 69, 42, - 16,125,231, 34, 49,105, 12, 35,165, 86,231, 65,240,118,122, 15, 64, 77, 0,241, 12, 67,126,210,102,251, 30, 5, 46, 91, 43,122, -221,179,172,189,190,236,236, 85,163,186,141, 39,234,197, 23,202, 90, 49, 12,169,207, 16,184, 1, 36, 61,191,232,153,234,168, 83, -211,102,199, 98,249,146,111,176,118,235, 97,100,228, 25,224, 98,123,138,163, 63, 47,194,231, 75,127,131,222, 88,122,175,134,242, -252, 72, 73,198,232,101,195, 85,252,119,241,231,150, 46, 93,218,231,165,188,233, 83, 74,158,189,242,185,226,239, 47, 91,182,108, -201,115,255,215, 57,106,178,158, 25,173,226,131, 42,199,108,213,246,242,171,242,199,209, 35,135,220, 10, 52,102,136, 5, 92, 84, -174, 22,132,249,235,143,122,189,211,212, 19,185,102, 23,236,222,188, 34,223,160, 83,239,117,168,176,240, 14,110, 33,145,203, 78, - 30, 58,120, 24, 53, 42,123, 11,118, 93,205, 79,186,155,168,127, 22,234, 85, 41, 82,132,213,156,117,188, 65, 3, 7, 74,207, 95, -184,248,137, 6, 40,209,104,113, 25,110,165, 45, 59, 14,122, 59, 73,248, 96, 24, 64,173,183, 98,226,123,131,223,252, 49, 70, 88, -238,248,177, 99,192, 20,153, 44, 85, 94, 22,190,156,245,129, 65,102,137,123,152,154,156,154,222,181,239,231,231, 85, 26,198, 48, -108,244, 7,183, 31,198, 46, 45,208,233, 94,111,145, 31,163,201, 6,163,153, 69, 66, 66, 60, 62, 29,211, 13,124, 46, 7, 92, 46, -107,239, 44,109, 45,253, 98,212,100,196,230,195, 87, 48,100,231,202,105, 91,252,125,188, 61,228, 50, 9,145, 75, 69, 76,253, 58, -181, 4, 45, 91,182, 22, 86, 11, 14, 21, 92,125,164, 71,170, 66,143,196, 12, 37, 68, 62,141,120,195, 59,191,131,157,107,102,116, -204, 79,189,195,193,171,157, 20, 95,224,236,165, 27,125,183,110, 90, 45,202, 46, 52,227,113,170, 6, 89, 5, 6,100, 22, 24,145, -149,111,128, 92,194, 71,251,126,147, 68, 39,142,254,212,183, 75,187, 22,235, 94,231,184, 19, 19,147, 78, 36,167,103, 14, 13,109, -220, 28, 59,127,253,165,157,171,107, 53,231,194,194, 36,149,163,185,179,104,209, 34,225,178,101,203,120,235,215,175, 87,181,108, -217,210,119,206,156, 57, 61,114,114,114,110, 85,173, 90, 53,248,204,161,237, 23, 26,181,239,223, 12,172,217,171, 93,135, 78, 2, - 17,203, 67,120, 88,152,121,223,222, 93,121,122,189,122, 74,153,134, 67,234,178, 40, 91,195,192, 43, 32, 32, 90, 46,180,117,227, -113, 10, 99, 11, 78, 79,223, 81, 0, 28,170,209,243,163,115, 23,239,196,196, 54,141, 72,246,190, 16,241, 36, 39, 95,103,174,157, -112,250,243, 50, 11, 94, 46,195,128,207,229,192, 73,194, 3,167,168, 84,149,251,135, 62, 1,195,120, 21, 71, 78, 25, 48, 69,239, - 0,195, 32,163, 32,245,158, 3,125, 54, 24,194, 18, 32, 38, 77, 11,141,193, 30,154,175,228, 41,133, 34, 59, 13, 27,215,109,199, -221, 59,183,209,253,157,126,216,176,101, 23, 38,190, 55,212, 80, 94,237,135,195, 41,138,104, 61, 23,205,146, 75,120, 0, 24, 20, -106, 45, 56,248,251, 83,212,172,206,113,248,193, 0, 0, 78,114, 41,148,106, 61, 56, 2, 39,196, 71,156,148,158,186,120,115,206, -220,133,171,191, 40,200,140, 76,125,242,224, 42,130, 61,149,168, 30, 96, 70,116,150, 51,238,228, 85, 67,112, 80, 13,112, 4,183, - 29,210,206,141, 14, 89,126,148,115,176, 79,211, 70,245, 90, 85,241,118,133,222,100, 43,138,106,113,241,203,182, 29, 72, 78, 74, - 27,159,247,240,232,221,183,225,104,181, 57,137, 10,145,119,208,135, 15,110,158, 79, 28, 56,242, 67,248, 5, 84,110, 88,152,122, -207,225,110, 11,142,236,179, 57,104,180, 4, 82,215, 57,159,126,245,221,244,238,189,135,224,198,213,243,184, 23, 29,143, 22, 45, -154,225,157, 1,195,161, 86,229,215,217,191, 99, 77, 55,171, 78,125,134, 39,178, 78,111,222,186, 51,195,218,108,136,123, 28, 21, - 95,146,150, 62, 51,230,222,245,204, 24,231, 23,154,167, 60,235, 52,148,187,184,223, 51,154,109, 72, 79, 79,195,181, 63, 46, 53, -214,103,198,220,171,200,249, 18, 9,184, 8,191,155, 3,179,133,133,217,202,162,125,135,110, 38, 1,199,216,110,241,234,109, 45, - 51, 51, 50, 57, 50,103, 79,214, 61,160,174,192, 79,100, 54,222, 79, 80, 10,204, 22, 22, 53,252,101,101,106,122,249, 7, 45,153, - 49,227,211,186, 92,129, 4,106,173,209,148,153,145,238,187,121,247, 69,205,163,199, 15, 2, 42,121,187, 56,127,183,230, 39,129, -202,192, 32, 71,105, 68,190, 90,197,140,156, 60,211,127,235, 15, 75, 71,149,101,180, 74,232, 46, 82,253, 68,248,213, 58,110, 78, - 2, 70, 99,176,178,121, 42,179,109,228,128, 55, 27,116, 89,100,178, 38,173, 94,181, 70,122, 55, 65,141,251, 9, 74,136, 5, 92, - 8, 5, 28,152, 44, 44, 28,188,157, 56,190,222,190, 83, 90, 55, 13,193,153,123,185,224,114, 57,208,171, 11,116, 60,228,197, 54, -237,216, 93,218,164,121, 75,116,234,216, 1, 79, 98, 99, 42,135, 29, 59,216,229,250,181,203, 89, 86,115,237,105, 90, 69,236,225, - 10, 5, 22,116, 58,174, 69,232,251,190, 95, 64,213, 54,131,134,191,239, 82,165,114, 0,227,237,233, 1, 43,225, 97,210,123,131, - 29,190,243,237,198, 28, 88,182,112, 14,140, 70, 19,188, 92,133, 32, 4,216,182,110, 62, 76, 38, 19,252, 61, 68, 80,106, 75, 95, - 77,174, 60, 63, 82, 90, 20,170, 66,125, 79,158, 51, 99,101,237,103, 24, 38,108,246,236,217, 95, 2, 32,179,103,207,254,178,120, -123,233,210,165,122, 0, 25,229, 52, 29,110,126,193,104, 21, 31, 92,233,119,183, 32,216,211,195,239,122,248,153,211, 46, 71,238, -179,184,113,248, 14,122,183,240,131,128,199,129,212,197, 31,247,147,148, 56,113,104, 83,225,209, 61, 63,165, 27,141,198,239,203, -111,107, 14,106, 42,151,202,206,252,186,115, 47,235,233,225,193,217, 24,174, 72,200, 83, 91,159, 53,105,197,222, 60,198,222, 57, -179,217,143,128, 57, 45, 22,139,131, 76, 38,147, 91,121, 25,187, 45, 60,165,168, 19, 47,243, 54,202, 86, 48, 92,174,109,231,174, -157,240,116, 22,194,104, 97, 49,251,139,143,245, 99,186,203, 11, 71,190, 59,188,115,167, 94,211, 47,240,101,181,206,183,110, 92, -139, 52,106,212,168,144,203,229, 58,212,149,194,219,219,123, 62,135,195, 25, 33, 20, 10,157, 76, 38,147,218,196, 26,164, 90,131, - 9, 6, 51,160,211, 25,192, 23,216,205, 34,159,203, 64,111, 48, 65,167, 55,149,125, 99,100, 69,253, 14,160,182,234,185,152,210, -249, 71, 53,132,191,237, 63,250,241,144,119,135,205, 13,104, 56, 64,158,148,169,132,128, 49,163, 89, 93, 63, 92, 60,125,152,164, - 37,199,126, 90,158,201, 2,128, 28, 69,126,160,151,151, 15,238, 38,106,144,158,167, 71, 86,145,201,202, 44, 48, 66,173, 87, 35, -180,138, 63, 10,149,202,192,215, 62,191,192,225, 51,103,206, 12,237,213,127, 24,166,127,177,160,237,207,155, 86, 68,202,132,252, -113,218,236,184, 75,142, 24,173,168,168,168,252, 89,179,102,213,220,178,101, 11,103,212,168, 81,250,144,144, 16,241,232,209,163, -219,238,216,177, 67, 44,149,138,245,247,175, 30,155, 59,225,163,217,253, 55,175, 93,212,176,160,160,128,177, 90, 44,167,204, 5, - 5,179, 53,229,152,185,167,199,190,124, 60, 47,193, 60,182, 91, 59,175, 99,238, 82, 78,125, 17, 49, 13, 71,221,249,123,241,104, -190, 57,225,244,122,181,100,232,202,143, 50, 10,217,175, 12, 28,239,197,229,153, 44, 0,224,112, 25,152,172, 54, 56, 73,248,224, -112, 56,197, 38,222,239,151,189,167,164, 94, 46, 66,240,185, 28,240,184, 12, 84, 58, 11,114, 85,102,124,248,190,163, 51,132, 16, -214,106, 35,208,155,172,208, 21,213, 14,213,170, 92,204,249,226, 51,188,211,119, 32, 38, 76,249, 12, 5,122,224, 78,162, 26,102, -139,165,220,155,130,195,112,160, 51, 90, 49,174,123, 21,228,107,204,208,234,173, 48, 89, 89, 72,133, 60,240,121, 28,200,196, 60, - 56, 75,249, 0, 33,130,226,194,132,207,231, 27, 44, 22,203,206, 50,106,244,168, 22,232, 3,189,133,131,230,195, 86,160,107,171, -218,136,254,253, 32,239,242,141, 7,213, 63,249,226, 43,124, 60,177, 47, 14, 60,174, 9,119,239, 42,144,203, 36,176, 16, 14, 0, -226, 96,135,189,249, 44,199, 60,112,196,143, 91,182,197,124,251,205,108,113,161,150,129, 72,192,197,133,243,231,112,253,230,157, -181,185, 15,143,238,196, 91,132, 79, 56, 62,206,206,206, 16, 11,185, 48,153,141, 38,199,187, 46, 16, 16,160,177,204,187,246,143, - 69, 53,254,198, 54, 22, 37,236, 43,223,104,241,196,206,179,167,125,241,237,146,238,189,135, 32, 60,236, 0,246, 31,216,107,107, -213,115, 60,119,215, 47,155,208,182,107, 63,180,237, 62, 12,167, 14,239,248, 76,203, 50,245, 38, 77,159,187,176,125,231, 94, 8, - 63,113, 0,217, 89,105, 43, 29, 77, 47,151,207, 76,239,220,173, 47, 12, 38, 27,218,117,233,131,211,199, 15,127,132,162, 65, 22, -142, 63,196, 94, 42,159,193,177,126,246,233,116,126, 78,161,137,175, 80,153,144,166,208, 33, 41, 91,135,163,123,126, 38,142,151, - 23,166,102,237, 67, 43,241, 39, 45,191,240, 52,176,146,159,145,111,212, 75, 98,227, 19,234, 76,120,127, 12,191,122, 80, 29, 78, -142,210, 8,133,210,136, 92,165, 17, 26,131, 21, 65,149,106,113, 44, 86,166, 85, 69,243,217,211, 69,200,223,112, 60, 17,206, 50, - 62, 90,215,121,253,129,182, 44,203,254,105,178, 86,219, 77, 86,100,162, 18, 34, 1, 23, 34, 1, 7, 34, 1, 23, 86, 27,113,168, -226, 34,241,174,221,235,195,105, 31,248,155,172, 64,158,210, 4, 30,151,129,183,167,155,172, 89,195, 17,216,182,226, 35, 0,192, -196, 89, 27, 49, 97,220,104,212,173, 31,130,194,130, 2,223, 17, 67,122,173, 6,112,216,209,180,158, 12,191, 84, 57,252,202,221, - 89, 31,206,152, 39,127,183,111, 39,238,189, 4, 37, 50,243,141,136,143, 85, 87, 40,242, 6, 0, 86, 27, 11, 2,130,237,123,195, - 32, 17,242,160, 80,154, 65, 8,193,162,245,251,224, 36,225, 35,179,192,222,220, 95, 22,101,250,145, 50, 34, 82, 21,136, 54,246, -129,189, 47,151,151,163, 17,173,165, 75,151, 70, 47, 93,186,180,196, 8,217,115, 38,235,245, 22,149, 22, 8,100,117,156, 61, 60, -111,132,159, 62,233,116,248,190, 13, 23,239,231, 97, 72,187, 74,208,228,167,226,251, 47,222,205,103, 64, 76, 28, 46,183,208,168, -215, 29,210,235,181,139, 1,152,203,188,104,124,107, 55,150,137,229,231, 54,108,254,213,234,233,237,141,157, 87,243,211, 10,180, - 86,203,159,205, 86, 22,230,206,153,205,213,173,172,165,167, 33,251,201,237,242,106,226, 44,129, 96,233,166,163, 0, 8, 88,150, - 5, 97, 89,240,197,114,153,103,141,150,217, 69, 5,157,152,199, 97, 12,207,151, 0,132,181,166,229, 38,150, 29, 6,101, 0,184, - 72,249,216,123, 57, 29, 0,178,185,234,136, 71, 35,223,181, 55, 23, 26, 76, 98, 85,253,154, 53, 73,179,102,205, 10, 37, 18,135, -166,191,226,250,248,248,220,154, 59,119,110,157, 9, 19, 38,136,132, 66, 33,172, 86,171,251, 79,155, 55,179,155, 23, 79,196,160, -143, 54, 64, 32, 20, 65,111, 48,131,207,231,161, 64,169, 65,161, 74, 7,181,206, 82,241, 43, 40, 33,193,164, 0,150, 31, 57, 44, - 28,216, 67, 30,218, 92,200, 17,160, 73,176, 31, 46,158, 57, 66,110,156,222, 54, 81,159, 19,251,171,131, 23, 34, 52, 6, 11, 50, -242, 12, 72,207, 51, 32,171,192,128,172,124, 35,178, 10, 12, 96, 24, 6, 6,147,245,141, 30, 92,218,156,152,253, 59,127,221,218, -207,104,198,240,246,221, 7,226,179,121, 27,170,236,252,113,217,185, 68,194,105,227, 96, 71, 91, 91,116,116,116,242,251,239,191, -223,112,247,238,221,220, 6, 13, 26,232, 31, 61,122, 36, 45, 50,145,102,185, 92, 42,249,249,135,165,103,154, 55,111,190, 39, 61, -246,241,133,162,246,244,114, 11,246, 42, 29,198,138, 36,230,187,147, 42,203, 90,247,168,225, 43, 69,101,153,186, 71, 29,249,253, -239,243, 58,127,188, 68,113, 97,109, 78,166,209,122, 86,161,231, 54, 74,215,240, 29,234,131,103, 49, 26, 82, 6, 13, 25, 14, 46, -195,129,217,160, 75, 41,190,184,188, 93,132,152,191,235, 49,228, 98, 62,156, 36, 60,200, 37,124,180,173,231,142, 10,148,103,196, - 98, 99,161, 51,218,160, 55, 90, 97, 48, 89,225, 25,232,134, 45, 59,247, 35, 53, 71,143,163,183,115, 17,147,162, 70,173, 74, 50, - 16, 82,126, 49,201,218, 44,218,190,131, 71, 57,113, 57, 12,184, 28,134, 83,175, 78,109,228,107,204, 16,240, 56, 16,136, 37,144, -137,120,112,150,240, 33, 16,240,145,147,147, 3,163,209,136,202,149, 43,139,203,182,130, 4, 78,114, 9,106, 85,247,135,217, 98, -197,201, 43, 15,177,248,211, 65,232,214,190, 41, 24,190, 28,143,141,141,225,228,238, 4,150,195,129,217,202,194,100,182, 1,224, - 24, 74,211, 11, 12, 12,236, 44,147,201,100, 58,157, 78,157,154,154,122, 41, 43,230,112,170,141,219,127,210,233,240, 11, 59,251, -188,211, 13,119, 35,163,113,224,240,177,171,185, 30,202, 25,197,223,169, 95,191,126, 75, 79, 79, 79,121, 94, 94,158, 42, 42, 42, -234,214,235,214, 11, 8,135,243, 73,171,182, 29,161, 41,204, 65,246,211, 36,135,107,209,117,171, 56,225,235,165, 27,154, 4,215, - 14,110, 98, 35,118,227, 85,175,178, 19, 62,159,183,174, 73,205, 90,181,155, 20, 15, 8,169, 91,185,236,105,217,120, 82,167,238, -239, 77,248,108,105,191, 33, 99,113, 33,252, 24, 86, 45,254, 98,167,204,197,171,174,187,155, 75,163, 6, 45,187,227,234,185, 99, - 16, 59,249,194,205,195,183,237,168,113,211,186, 14, 25, 53, 25,215,175,158,195,218,101, 95,238,176, 25,213,191, 57,146, 86,153, -119,117,175,134,141,155,143,116,114,247, 65,161, 82, 13, 39, 55,111,212, 13,109, 54,242,225,125,227, 44,109, 78,162,226,181, 77, - 7, 33, 48,154, 9, 10, 52,102, 60, 85,232,145,156,101, 55, 90, 44, 91,129, 62, 65, 54,150,145,139,121, 60,119,203,147,202, 15, -206, 93, 32, 85, 2,125,152,229, 11,191,224,154, 33,134,162,208,110,178, 20, 42, 19, 20, 74, 19, 52, 6, 11,220,101, 60,176, 54, -182,194,181,238, 2,141, 25, 78, 82, 62, 92,164, 2,135,163,140, 37,177,233,151,189,193,247, 99, 51, 6,172, 90,181, 70,122, 47, -241, 57,147,197,183, 71,179, 68, 2, 46,108, 44, 11, 56,112,199,243,121,252,233,253,123,117,197,211, 92,189,125,212, 50,135, 65, -173,144,230,240,148,176,232, 50,108, 54, 0,160,111, 47,123,215,182,196, 76, 45,142,223, 80, 0, 47,118,236, 46,187, 44,214,235, -185,155,119,157,248,100,255,190, 61, 46, 6, 27, 15, 63,157, 74,134,206,104,133, 88,192,133, 72,192,133, 68,192,125,161, 63,118, -249, 70,203,222,231, 46, 53,215, 2,157,193, 0,149,222, 2, 2,224,214, 19, 13,244, 38, 43,148, 90, 11, 90,214,113,123,179, 64, - 8,195,156, 32,132,244,126,217, 16,189,108,150,158,139, 72,149,164,113,251,121,141,226,207,151,102,228,158,239,179, 5,160, 66, - 35,184,120, 47, 59,199,231,183, 5, 50,183,186, 46, 78, 46, 55, 78,159, 10,147, 31,190,207,226, 82,164,221,100, 89,244,185, 88, - 57,107, 68,154,170, 48,183, 19,128, 4, 71,127, 76,234, 89, 55, 84, 44, 20, 93,248,110,205, 79,102,111,159, 0,246,208,141,194, - 28,165,206,246,130,155,176, 25,141, 28,194, 18,129, 33,251,137, 67,109, 8, 28, 14, 99,158,247,209, 64,176,132, 96,254,154,253, - 88, 50, 99, 24,228,146, 81, 82,134, 97,164, 90,131, 21,159, 46,216,138,149, 95,143,119,146,138,120, 96, 24,123,159,168,247,134, - 15,116,236, 2, 52, 88, 17,127,115,183, 70,157, 24,246,232,249,230,194, 22,109,223,185,211,162, 69,139, 66, 55, 55, 55, 72, 36, -146, 63, 35, 21,165,224,227,227,243,245,188,121,243,130,167, 76,153,242,108,178, 79, 30,143,135, 15, 63,248,128, 99,179, 17,156, - 58,181, 13, 94, 85, 27,227,216,217, 27,232,217,185, 25, 52, 58, 3,242, 11,213, 96,193,125,237, 11, 81, 93,152,123, 33, 43,249, - 65,243, 54,157,250,226,210,153, 35,228,198,169,159, 39, 86,100,142, 30, 55,119,183,167, 17, 15,226,235, 50,140,187, 61,162, 85, -100,178, 76, 22, 22, 85,124,164,120,154, 28, 15, 87, 23,151,167,142,234, 73,188,130,251, 51, 28, 50,133, 1,217,166,205,142,219, - 15,128,104, 51, 31,141,216,255,219,230,200,232,168,123,139,251,140,156,206,235, 62,228, 3,238,143, 75,167,125, 9,192,209,137, -247,204, 49, 49, 49, 15,199,143, 31,223,250,250,245,235, 54, 0, 58,134, 97, 44, 92, 46, 87,106, 50,153, 4,157, 58,117, 82, 62, -126,252,248, 50, 74,238,180,248, 2,109,223,223,239,201,136,212,239, 8, 89,243,136, 42, 78,234,110,157,218,181, 66,171,250,129, -120,218,174, 21, 0, 76, 79,209,200,131, 13, 53,183,238,181, 88, 37, 39,127,252,229,248,146,137,195,186,126,186,147, 55,127, 85, -102,216,252, 50, 59,162, 62,125,116,185, 71, 73, 54,158,199,229,192, 73,194,135, 92,194,131,147,132, 15, 39, 49, 31, 22, 43,169, - 72,205,145, 88,172,172, 61,162,101,178, 66,163,183,226,194,189,108,100, 41, 77, 40, 84,155,161, 55,219, 64, 64,236,181, 81, 7, - 74,115,197,147,107,174,197, 79, 82,215,202,141,149,155,215,175,112, 62,248,123,218,179, 17,125, 46, 82, 33,156,164,246,209,216, - 87,174, 92,129,135, 71,249,181,125,150,101,113,224,244, 45,172,218,126, 1,167,183,205,132, 88,192, 69,104,255, 5, 24, 59,160, - 5, 88,194, 34, 62, 38, 58,187, 86,189,134, 62, 28,142, 4, 28,134,129,209,194, 2, 32,165,158, 79,147,201,228,145,154,154,170, - 10, 10, 10,242,245,247,247, 31,194,229,114, 9,212,247,140, 71,246,228,235,206,135,253, 38,213,234,141, 54,169, 85,185, 45, 40, - 83,223, 27, 65, 65, 96, 24,134, 56, 59, 59, 11, 46, 92,184,160, 9, 9, 9,241,122,205, 91,137, 35,241,174,189,118,194,212, 79, -134,212,172, 81, 3,251,127,219, 6, 66,152,131,142,126,121,215,241,235, 88, 56,231,197, 17,134,159,207, 91,215,100,229,130,233, - 47,236,155, 58,103, 85,153,163, 14, 37, 34,249,140, 65, 35, 38,225,206,173, 63,240,253,130,207,247, 24, 53,249, 99, 45, 86,203, -208,252,204,196, 61,213,235,181, 0, 49,171, 17,190,111, 5,134,141,158, 40,234,222,103, 8,174, 95, 61,135, 37, 95, 78,221,165, - 43,204,121, 31, 14,118,114,102, 9,127, 74,167, 30, 3,248,122,163, 25,235,150,127,131,201, 51, 22,163,101,231,190,252,168,123, - 55,166, 0,248,214,225,238, 16,102, 27, 58,133,120,218,205,179,133,197,177, 68, 46,175,164, 43,144,199,101, 56,141,106,184, 66, -111,178, 66, 85, 78,165,146, 39,224,103, 21, 42, 85, 85,127, 88,242, 9, 87,107,176, 66,161, 52, 33, 71,105, 68,110,225,159, 6, - 43, 87,105,132, 66,105, 2,159,199, 32, 54, 33, 5, 28, 62,175,194,253,243, 10, 52, 22, 52,175,237,102,191, 71, 95,179,117,196, -194,115,110,113,250,242,253, 65,171, 86,173, 22,223, 79, 82, 35, 50, 81, 85, 20,201,226, 66,196,231, 64, 88,244,183,141,181,247, -141, 44, 11,103,175, 26,213,199,188, 55,170,139,179, 92,130,140,184, 28,240,184,246, 41, 98, 92,188, 3,225, 34, 50, 96,218,212, - 73,240,244,112, 69,106,174, 17,107, 15,199, 34,242,225, 19,176,250,138, 29,246,186,159,246,244,156,240,225,231,174, 28,190, 16, - 59,206, 36,217,211,201,181,225,241,141,227,134,140,248, 7, 90,141, 42,143,128,216, 28,236,131,204, 16,171,205,126,185, 45,153, - 63, 27,123,182,111,196,153,136,156,103, 87,224,239, 7, 87,226,147, 57,139,144,171, 50,161,164,235,178, 44, 63, 2, 64,241, 92, - 36,234,149,237,231,204, 81, 73,219, 76,209,182,169, 20, 13,211, 75,230,202,244,210,126,211, 75,122, 37,205,253,183,185,220,166, -195, 87, 76,145,171, 87, 3,169, 88,246,199,169, 83,199,101, 71, 34,201, 51,147,101,214,229,146,197,211,251,166,169, 10, 21,221, - 43,100,178,188,106, 53, 16, 73, 69,151,231, 46, 90,107,244, 9,168,106, 61,121, 79,149,167, 54,216,172,175,246, 65,144,217,100, - 46, 94, 6,158, 80,180,138,175, 55,125,147,155,251, 72, 91, 94,228,137, 37, 4, 97, 55,179, 64,136,189,138,180,239, 74, 58,138, -106,230,176,177,246,102,149,179,247,114,192, 43,234,135,226,104,248,123,211, 79, 27, 85,189, 67,148,218,145, 75,230, 63,107, 46, -108,217,208, 30,201,114,118,118,134,171,171, 43,228,114, 57,202,107, 58,100, 24,230,189, 9, 19, 38,188, 82,251,207,201,201, 65, -215, 46,157,176,126,227, 22, 52,236, 50, 6,103,175,157,129,217,194, 34,180, 94, 13, 84,245,119,195,211,108,245,107,221,232, 50, -159,224, 15,155,119, 26,240,101,219,206,125,113,225,244, 33,114,227,244, 47,147, 42, 58, 17, 98,239,174,173,143, 47, 92, 56,191, -250,220,197, 63,136,156,196, 60, 60,210,152,192, 97, 24, 84,241,145,194, 67,198,193,165, 35, 59, 12,195,250,182,118,120,114,188, -192,192,128,157, 43,215,111,150,173, 92,182,160,211,157, 8,230,130, 38, 35, 54, 31, 0,116,217, 49,203, 31, 3, 15, 43,253, 17, -126,178, 97,135,129,240,241,175,209, 45, 49,251,177,195,102, 3,128, 46, 33, 33, 33,113,238,220,185,193,203,150, 45, 35, 92, 46, -151, 5, 32, 90,179,102,141, 46, 46, 46,238, 30,236, 67,115, 81,222,195,166, 75,183,250,159,202,133,182,150,238, 82, 78,253, 26, -190, 82,180,170,111,111, 21, 29,214,187, 45, 2, 43, 87, 70, 66,150,174, 81,190,142,229,107, 76,220, 26, 27,126,138,188, 93,205, -147, 59,209,170, 55, 61, 4,112,180,162,249,195,224,207, 14,242,197,209, 44, 39, 9, 31,172,253, 90,169,144,209, 50,154,109,208, - 27,109,208,155,172,208,154,108,208,153,108, 96,137,253,158, 96, 24, 6,102, 43, 11,135,170,205, 47, 93,251,206,238,158,168, 81, -141,129,179,212,158, 54,231,162,233, 30, 24, 0, 30, 30, 30,240,246,246,118, 40, 42,106, 50,219,111,113,147,133,125,214,172,111, - 50, 91, 65, 8, 65,108,108,204,204,228,196,196,254, 65,181,130,218,215, 11,109,232, 46, 21,113, 0,160, 84,163,165,211,233,108, - 78, 78, 78,222,238,238,238,156,244,244,244,103,230, 57,168, 81, 39,235,225, 67, 7, 49,104,208, 64,205,163, 91,247,159, 13,113, -215,235,245, 76,155, 54,109,156, 3, 3, 3, 57, 70,163, 81, 85,209,108,146,121,213, 30,224,230,225,190,248,189,247, 39,215,238, -212,181, 39, 46,158, 15,199,209, 67,187,127,213, 41, 98,195, 29, 21, 9, 14,174,243,202,168,195,154,181,106,191, 50,234,176,106, -245, 90,101, 26,173,122,161,205, 90, 16,134,135, 51, 97,251,136,129, 99,158, 10,128,181, 25,212,251,246,110,250,250,219, 17, 83, -230,212,236,213,111, 4,222, 27, 61, 22, 60, 30, 23,151,206, 30,199,202, 5,159,157,208, 40,115,198, 56,210, 77,192, 30,122,171, - 43, 8,144, 4,126, 92,185,102, 3, 68,220,184,138,248,216,168,232,251,183,175,215, 15, 10,105, 9, 47,255, 42, 31,167,120,114, -151,225,209, 35,115,121, 50, 38,131, 33,101,236,152,209,120,126,212, 97,171,198,193, 30,204,203, 55, 0, 0,157, 58,199,252,243, -138, 79,227,138, 71, 29,178,102, 83, 74,105,186,202, 2,197,129, 75,215,110,206,232,223,187, 39, 39, 87,101,178, 71,176,148,166, -162,151, 17,185,197,127,171,140,168,229, 47, 71, 76,116, 4,107, 80,230, 30,172,224,125,105, 24, 59,180,199,195,226,107,151,101, - 9, 24,192, 80,225,102, 41,190,243,164,229,223,175, 18,223, 79,212, 32, 50, 73,101,111, 42,228,115,237, 6,139,207,121,102,186, -236,163,217,203,137, 14, 49,220, 37,227,198, 12, 71,174,202, 12,150, 5,120, 92, 78,209, 75,128, 84, 53,131,167,106, 29,114, 11, - 20, 72, 76, 78, 65, 97, 86, 60, 56, 28, 14, 60,253,107, 59, 60,147,180,141, 8,253,116, 38, 18, 50,164,119,123,222,161, 63, 50, - 33, 21,241, 96, 84,103,227,212,222, 21, 10,163, 70,181, 88,175,211, 28,114,100, 62,199, 63,187, 32, 48, 10,149,198,224, 35,226, -115,177,127,251, 15, 24, 58,118,234, 11,165,239,204,175, 22, 2, 28, 6,249, 5,106, 48, 12,163,168, 88,185,196,220, 46,107,251, - 53, 35, 99,111,172, 81,130,217,122,181,162, 80,122,109,148,156, 10, 63,125, 92,246,123,178, 8,183, 98, 50,139, 76,150,130, 93, -244, 81,239, 52,181, 50,191, 7,128,216,138,213, 11, 57, 61,134,141,155, 17, 93,163,118, 61,227,197, 40, 77, 82,161,214, 82,106, - 63,135, 86, 67,230, 70,223, 57,177,190,151,210,146,240,129,204,175,158,141,181, 90,151,235, 21,177, 11, 74,105, 58, 20, 46, 88, -187,255, 89,179,225,172,101, 59,236,127,219,108,176, 17, 22,132, 5,166,125,189, 9, 86,214, 6,214,102, 3,107, 35,176,216,136, -180,188,228,122,251, 87, 61, 84,240,120, 95,157,145,223,190,218, 92,232,234,234, 10, 15, 15, 15,120,120,120,192,217,217,185, 92, -163,197,231,243,229, 60,222,139,167, 58, 37, 37, 5,201,201,201,112,118,118, 6, 97, 45, 48, 89,128, 6, 45,187,227, 65,124, 20, -206,253,126, 15,132,181, 65, 38,175,248, 42, 47, 50,159,224, 15,154,117,236,255, 67,231,126,227,113,246,208, 79,228,246,149,227, -147,245, 57,177, 91, 29,142,208,219,108,140,197, 98, 65,239,238, 29, 83,238, 70, 63, 57,253,213,140, 41, 61, 91,247,153, 44,106, - 21, 28, 0,131,201,134,180,228,120, 92, 58,242,139,161,118,117,191, 51, 93,218,181, 72,177, 88, 44,176,217,108,229, 62,200, 13, - 38,115, 46,151, 47,145, 13, 31, 62,146,127,251,214,173,131, 50,175, 90,251,109, 12,231, 62, 67,216, 80,134,144, 65,161,161,117, - 97,182,176,208,233, 84, 5, 21, 61,102,181, 90,157,184,109,219,182,234, 99,198,140,145,214,171, 87,143, 31, 31, 31,143,149, 43, - 87,230,169,213,234, 68, 71, 53,194,175,196,172,225, 49, 5,113,197, 17,173,212,182,173, 48,188, 79, 91,236, 57,241, 59, 46, 93, -189,142, 20,141,252,158,198,202, 59,242, 52, 37,195, 88,223, 93,117,176, 95,171,170,220,253,219, 11, 14, 70,119,156,253, 46, 33, -162,240,220,203,243,181,142,223,220,128, 90,111,129,179,212, 62,223, 83,113,100,139,203, 48, 14, 59, 34, 6, 72,188,122, 61,162, - 65,211, 90,245,112, 55, 81,137,156, 66, 35,244, 70, 43, 88,150,128, 5,129,135,147, 16, 98, 1, 7,169,201,137, 96,137, 57,169, -130,143, 10, 69,135,246, 29,120, 0, 3,134, 33, 60, 62,143, 7, 2,251,252,138, 18,137, 68,227,237,237,237, 80, 68,203,108,181, - 98, 80,207, 22,104,217, 44, 20,253, 39,219,231,204, 60,255,235,108,184,201,249,216,179,115, 43,158, 94, 89,179,179,122,171, 41, -225, 81, 15,162, 7, 71,223,253, 99,228, 59, 77, 36,141,124,121, 25,130,210,194,164, 90,173,246, 32, 0,161, 64, 32,232,217,190, -125,123,247,131, 7, 15, 22,122,122,122,178, 66,129, 64,209,175,111, 31,150, 47, 16,228, 23,127,246,218,181,107,252,201,147, 39, - 59, 21, 20, 20,164,102,103,103, 95, 7, 96, 41,187, 34, 24,220, 21, 28,236, 6,195,136,229, 18,105, 74,181,106, 53,252,155,181, -108,225, 50, 96,208, 80,136,132, 34,156, 13, 63,141,117,171,151,237,211,100, 62, 26, 87,145, 51,249,182, 70, 29,166,165, 38, 37, -234,244,198,144, 6, 77, 59, 50, 87,195,143, 76, 55,195,115, 53, 87,100, 94,209,117,208,212,154,137, 25, 26,172, 91, 58, 19,110, - 46, 50, 36,197, 63,214,199, 61,122,176,201, 98, 80,205,116,216,100, 1,144,230,217, 6,183, 26,221,211,205,104,182,225,202,133, - 19, 6,214,202,246,188,126,249,100,124,165,218,205,196, 13,154,117,113,203, 61,186,117,144, 14,216, 83,158, 78,250,227, 87, 35, -184,196, 84,152,116,254,194, 57, 23,159, 42,245,185, 12, 24,152,141, 6, 40, 18,110, 91,117,217,143, 85,170,244, 40,135, 70,225, -230, 61,197,215,115,230,125,247, 65,179,166, 77,101, 4,226, 23, 34, 88,197, 6, 43, 87,101,130,167,147, 16,122,149, 2,113,183, - 79, 27,116, 10,110,153,243,157, 89, 77, 90,105,110, 78,182,240,207,238, 12,177, 45,203,250,124,110, 78,182,208,106,210, 74,203, -127,212,113,225, 44, 19,226, 65, 82,250,179,142,239, 34,190,189,111,150,144,207,125,214, 79,171,184, 44, 40,135,142, 2,177, 43, -210,243, 12, 96, 64,192,218,172,176, 90, 76,221, 61,207,163, 0, 0, 32, 0, 73, 68, 65, 84, 80,171, 84, 72,207,200, 66,118, 86, - 54,212,234, 66, 72,229,110,104,208,168, 57,156,100, 98,220,191,180, 15,132, 16,135,230, 53,180, 48,252,224,102, 45,219,137,162, -146,237,125,177,196,124,130,227,187,151,229,105, 84, 57,237, 52,153,113,113, 21, 45,139,173, 54,219,185,200,135,113,245, 43,249, - 85, 99,238,197, 43,177,115,203,122,152,138, 34,155, 22,139, 13, 81,169, 90,100,230,235,144,154,240,136,176, 54,219, 57,252, 71, -224,149, 30, 0, 4, 47,180, 65, 93,116, 31, 53, 0, 27, 55,110, 66, 66, 98, 50,187,120,122,175, 84,141,186,240,157, 10,152,172, -174, 40,154,107, 67,151, 29,179, 92,239,214, 44,237,216,221,124,142,222, 68,202,236,224, 35,246,170,130,118,227, 86,158,209,171, -243,133, 54,163,142,119,124,231,184,221, 37,105,218, 29, 52, 76,139, 63, 31, 6,185,132, 7,134, 97, 80,220, 92,184, 97,225, 36, - 72, 69,246,182,101,189,209,138, 81,159,174,194,206, 85,159,129, 0, 24, 49,244,119, 93,105,233,132,125,237,194,105,126,184, 85, - 41, 37, 57, 39,189,107,223,207,207, 27,204, 34, 99,159,129, 99,238, 52,109,218,180, 80, 34,145, 64, 34,145,192,217,217, 25,110, -110,110,112,117,117, 45,247,216, 45, 22,139,198,100, 50,121, 8,133, 66,176, 44,139,164,164, 36, 36, 37, 37, 65,169, 84, 66,161, - 80, 64,171, 81, 89,111,157,223,207,107,208,170, 23,252,107,132,160, 74,173,134,224,115, 25,240,120, 28, 92, 58,182,165,180,116, -150,108,178, 58,244,219,208,165,255, 4,156, 61,180,153,220,190,114,124,138, 62, 39,118,139,163,121, 84,212,220,115,127,208,160, - 65, 33,147, 39, 79, 22,204,155, 49,249,204,137,240, 75,177,251,195, 54,247, 45, 40, 40, 12, 36,132,192,213,197,229,233,176,190, -173,143,119,106,211, 44,229,252,249,243,236,238,221,187,141, 12,195, 60, 40, 75,211, 94, 72,229,252,122,254,220,133,249,237, 58, -116,196,214,237,187, 59, 68, 63,124,212, 33, 62, 62, 14,129, 85,106,160, 90,245, 90,208, 49,110,184,112,249, 42, 52,133, 57,191, - 58,146,206,151,162, 90, 76, 65, 65,193, 31,195,134, 13,235,254,251,239,191,115,134, 13, 27,166,203,205,205,189,246, 92, 20,139, -148,167,121,253,199,129, 10, 0,191, 86,233, 48,118, 95,186,185,240, 99, 0,203, 42, 87,169,140, 75, 87,175,227,250,239, 55, 55, -229, 74, 43, 47, 24, 55,234,253, 73, 85,251,113, 39,244,107, 85,149,235,237, 38,197,111,155, 87,114,143, 93, 79, 94,149,156,103, -219,186,236,242,252,133,142,228,209,179, 7,135,218,140, 54,117,221, 97,177, 17,176,196, 94,224, 58,137,249,165, 21,188,175,104, -242, 76,162,113, 83, 38, 79,142,111, 16,218,232,147, 81,239, 79, 17, 52,170, 17,136, 91, 79, 10, 1,134,129,187,175, 12,153,153, -153,184,114, 96,179,181, 32,253,241, 38, 46,151,253,182, 2,231, 19, 5, 41,247,130,158,219,156,148,155,155,139, 75,151, 46,161, -216, 96,121,121,121,149,102,180, 94,208,204,203,206,184,182,240,251,159,218, 76,124,111, 32,250,116,172,143,203,183,227, 97, 42, -154,175,169,120, 40,121,226,245, 31,133, 31, 15,171, 97,250, 96, 80,109,149,222, 34, 76,254, 58, 73,121, 5,246, 53, 88,217, 82, -210,105,202,207,207, 63, 22, 19, 19,211,182, 97,195,134, 85, 79,158, 60,153, 31,125,243,204,244,231, 19,241,249,231,159,203, 55, -110,220, 40, 37,132, 92, 51,153, 76, 9, 14, 29, 59, 7,191, 69,220,185,227, 97,182,176,184,122,243,126,221, 46,109, 26,129, 37, -192,237,219,183,177,245,231,173,134, 7,145,247, 86,104,179,125,191, 45,195,188,148,120, 62,109,111, 54,234,240,153,102,102,122, -242,138,179, 39, 14,236,108,214,161, 47, 70, 78,251,246,219, 75, 39,118,207,111,210,174, 15,167,110,179,238,136,184,126, 1,231, - 78,158,254,206,172,201,159,143,242,251,142,148,152, 78,145, 68,250, 81,189, 38, 29,144,154,146,140,164,184,168, 95, 13,249, 79, - 50, 82,226,185,191,102,164,165, 76,169, 94,191, 13,126, 63,179,103,122, 25, 70,171,204,107, 62,208, 75,178,249,100,216,177,225, -105,105, 63,250,106,245, 6, 17, 33,196, 32, 18,242,178,228, 28,245, 94,149,195,233,124,100, 86,100, 84, 29, 52,116,212,148, 19, -235,214,173,230,251,184, 74,145, 85, 96,128, 74,111,134, 90,103, 6,135, 97, 16,228, 47,131, 78,157,143,203, 7,190,183,152, 52, - 5,195,128,120,115,105,154, 50,239,224, 69, 5, 79, 46, 76,251,124,234, 69, 8, 93, 2,253,171,117,158, 83,102,180, 78,157,126, -175,239,231, 83,143, 7, 19, 66,186,200,188,131,213,218,156,152,185,165, 29, 59,195,216,239,239,145,157, 2, 97,182,218,231, 31, -179,178,128,141,101,139,162,124, 0,121,214,158,207,148,115,236, 12,187,247,196, 53,100,100, 23, 66,111,178,192,104,178,194,108, -177,129,195,229,194,213,205, 21,181,170, 53,134,139,171, 51,178,179, 50,112,253,252, 49,196, 70, 94,190,198, 16, 44,208, 43,226, -206, 59,146, 71, 2,137,107,176,159,191, 47, 39, 83,101,130, 68,200,197,189,203, 39,205, 22,147,113,133,131, 38,235, 21,205,194, -188,252, 85,159,204,248, 98,196, 47,219,182,251,134, 84,119, 70, 90,174, 30,105, 10, 3,212, 6, 75,145, 17, 99, 97,212,228, 34, -242,194,246, 44,155, 65,189, 10,255, 17, 74, 53, 90, 86,179, 65,125,240,244, 45,143,217,243,191,231, 62,137, 79,176, 44,250,184, -119,154, 94,163,234, 85,225, 72,214,115,252,242, 97,245, 61,127,197, 65,188,210, 92, 72, 88,176,132,224,248,205,172,103,205,133, -108, 81,207,203,187,241,101, 47, 35,248,252,218,133, 29,123, 77, 63, 27, 25,163,222,165,215,103,187, 60,126,178,162, 0, 0,184, - 92,238,179, 87,113,223, 44,131,193, 96, 42,167, 9,101,199,150, 45, 91,102, 77,153, 50, 69,244,244,233, 83,196,199,199,163,176, -176, 16, 98,177, 24,167, 79,159,182,128,181,174,136,252,253,112, 82, 76, 68,248, 55,193, 77,187, 87, 10,105,213, 11, 82,169, 12, - 60,226,120,103, 76,169,119,237,225, 77, 59,244,251,161,203,128,137, 56,119,120, 11,185,125,249,216, 84,189, 34,118,115, 69,207, -101, 97, 97, 97, 52,128,184, 21, 43, 86, 52,218,186,117,107,245, 25, 51,102, 36,236,248, 97,254, 58, 0,200,203,203, 3, 0,220, -189,123,151, 76,157, 58,213,104, 48, 24, 18, 11, 10, 10, 34, 80,206, 0, 8, 0,208, 43,164, 75,182,110, 88,214,224,105,122,230, -192, 26, 13,154,195,171,122,115,248, 6,181, 64,129,218,140, 91, 79, 50,144,240,232, 60, 30, 93, 61,112, 82, 39,183,206, 71, 5, -231, 55,110,216,176, 97, 32,135,195,169,166,209,104,124,235,213,171,215, 80, 38,147,221,109,216,176, 97, 99, 30,143,151,118,231, -206,157,228,138,104,165, 92,222,110,172,210, 97,236,218, 20,181, 83,167,132, 44, 93,227, 20,181,211, 93,157,200,229, 51,197,133, -181,198, 95,184, 1,171,136, 57, 55,122,255,118,213,193,223, 54,175,228,142,154,244,185, 45, 74,233,246, 49, 79, 34, 60, 91,177, -112, 53, 39,243,131, 49,253,255,156,222,161, 40,146, 85,244,183, 67, 97,122,165, 50, 82, 9, 96, 86,228, 67,254, 15, 81, 31, 79, - 94, 24,218,172,205,232,246,239, 12,227, 88, 5,114,156, 57,252, 35, 73,140,188,176,159, 71,108, 95,233, 29, 88, 13,160,220,230, - 32,147,201, 17,147,245,106, 26,159,202, 58,238,223,253,243,216,131,135, 15, 45, 29,208,175,191,199,134,175,223,197,247, 63, 29, -129, 76, 34, 2, 97, 89,188,219, 41,112,200, 55, 19,234,244, 13,244, 17, 7, 28,188,152,118,101,218,234,168, 89, 58,157, 57,214, -129, 72, 12,201,205,205,189, 42,151,203, 21,109,219,182,109, 41, 18,137,152,220,220, 92,158,183,183,183,213,197,197,197,148,150, -150,166, 51, 26,141, 7, 1, 84,104,218,113,179,133, 69, 82,182, 1, 71, 15, 29,196,253,155,231,241,232, 81,140,250,209,195, 71, -235, 25, 30, 89,173,205,142,203, 7, 42, 92,193, 7, 91,226,168, 67, 82,225, 81,135, 54,163,250,183, 29,155, 22,117,214, 25,140, - 99, 27,182,238,141,170,117,219,112,204, 22, 27, 30,220,190,136,139, 7, 86,127,111,214,228,207,126,147, 60,246,175, 84,189, 22, -225, 10,241,199,165, 19, 32, 44,187, 9, 0, 8,203,110,186,251,251,201, 41, 45,122, 77,128,187,119,213,134,133,169,119, 25,188, -198,236,225, 2, 30, 71,123,234,224, 47,135,147,146,146,240,248,241, 99, 60,121,242, 4,249,249,249,248,237,183,164, 10,229,143, -174, 32,249,108,236, 67, 78,143,193,239,142, 60, 62,100,248,123,226,234,181, 66, 56,193,149,220,224, 33,231, 33,230, 73, 50, 98, -239, 68,178, 49,183, 78, 26,204,170,156, 1,250,130,228, 82,141,159,212,179,174, 15, 96,155, 93,188,118, 97,171, 86,109,130,191, - 88,188,180,165,135,151,119,137,229,120,158, 34, 71, 56,115,218,177,224,235, 55,254,112,104,173, 67,214,102,203,155, 52,118, 24, -203,181, 47, 20,138,103,113,234,162,179,103,175, 76,217,247, 19,214, 90,110, 4,255,253,129,237, 96,101, 89,104,245,102,168,180, - 70, 40,213, 6,100,230,228,225,126,100, 36, 46, 31, 63,134,248,152,251,137, 22,147, 41,156,195, 97, 14,232,179, 99, 47, 87,172, -165,137, 87,221,195,221, 29,137,249, 26,136,133, 60, 36,199,222, 49,106, 85,202, 93,175,123, 29,233,243,226, 50,115,184, 76,247, - 97,195,134,159,238,220,163,159, 75,179,214, 93,165,158,206,174, 16,240, 8,226,146, 50, 16,113,237,180, 54,225,254, 21,149,197, -164,233,249, 54, 86,125,249, 31,167,252, 81,135,102,163,182,239,136,254, 29, 14,113,185, 60, 33,203, 90,141,102,147,113,240,155, -152,172,191, 10, 66,108,105, 99, 71, 12,124,161,110, 96,101,137,100,196,208, 51,250,231,235, 10, 22, 27,145,142, 24,122, 77,103, - 47, 64, 74,239,216,231,231,231,222,187,120,237,194,148,148,188,219,249,249,198,139, 0,210, 12, 6,195,107,167, 49, 59, 59,123, -225,226,197,139,251,232,116,186, 58, 29, 59,118, 20, 57, 59, 59, 35, 47, 47, 15,225,225,225,150,176,176,176,135, 57, 57, 57,223, - 0, 57, 86, 61, 26,255, 26,105, 56, 60, 38,230, 78,248, 55,117,154,246,168, 20,210,186,151,227,133,153, 72, 50,177,115,191,241, -204,185, 35, 91,200,173, 75, 71, 62,208, 43,226,126,122,131,211,106, 54, 24, 12, 55, 13, 6, 67,212, 87, 95,125,213,204,199,199, -199,231,155,111,190, 17,171, 84, 42,254,134, 13, 27, 12,185,185,185, 89, 42,149,234, 58,202,232, 79,243, 42,119, 45,202,116, 12, - 58,117,112, 75, 39,114,112, 75, 55, 87,207,128,238, 46, 94,149,106, 22, 42,210, 19,149,138,140,112, 0,231,138, 38,138,172, 16, -141, 26, 53,170,193, 48,204, 48, 0, 13,100, 50, 89,144, 92, 46, 23, 17, 66,234, 48, 12, 19,205,178,108,100,189,122,245,194, 30, - 62,124, 88,161,201,100, 83, 46,111, 55, 6, 6,183,217,157,175, 99, 5, 38,142, 96,119,202,229,237, 70, 0,200, 57,251,133, 14, -192,209,135, 29,103, 13, 58,118, 61,121, 93,116,129,203,116,197,165,165,199, 42,154,102,101,218,253,160,183,117,253, 27, 50, 31, -166, 1, 24, 27,121, 7, 43, 31,220,189, 62,143, 33,224,219, 96, 93,164,207,121,114,231,109,232,243,249,124, 67, 64, 64, 64,137, -163, 11, 69, 34,145,193,104, 44, 43,128,114,217,170,201,196, 86,160,195,246, 67,251,182,143, 61,114,236,232,210,246, 93, 6,120, -136, 43, 85, 66, 53,111, 6,219,103, 55,153,126,254,174,226, 86,191, 47,174,108, 76,200, 48, 68,162,130,253, 97, 52, 26, 77, 44, -128, 2,141, 70,211,159, 16,242,148, 97,152,192,130,130,130,123, 22,139,229, 65,133, 13, 1,139,145,173, 90, 53,255,141, 97, 24, - 30,177,178,203,175,243,185,187, 13,153,143,210,240,134,203,146,132, 84,115,198,167,223,172,109, 82, 51,168,118,147,226,181, 14, -235, 87,117,194,228, 89, 43,155, 84,173, 94,171,201,159,235, 31,150,219, 77,128, 88,116, 5,227, 14,253,188,252,202,221, 27, 23, -191,244,244,171, 90, 53, 43, 45,225,209,211, 39,247, 22,218, 12,170, 67,111,154,207, 73, 79,162, 87,111, 93, 49,107, 70,102,122, -226, 86,157, 34, 46, 10, 0,116,138,184,168, 71, 17,248, 58, 55, 43,109, 70, 94, 78,194,138,215, 61, 23, 90,173, 54, 99,215,174, - 93,174,109,218,180,225,248,248,248, 64,161, 80,224,226,197,139, 44,203,178,233, 21,214,202, 79,188,168,205,103,220,127,253,233, -135,229, 2,153, 83, 47,171,213,234, 79, 8,192,227,241, 50, 77, 58,213,105, 53, 71,246, 5, 10,146, 13,101, 63, 51, 88, 6, 0, -167,120,237, 66,150,101,153,229,235,182, 39,243,197, 78, 37, 78,134,104, 49,168,165, 44,203, 58,188,214, 97, 97,106, 68,205,183, -117,127, 51,132, 44,104,216,180,229,151, 22,139,217, 80,116,127, 24, 0, 24, 8, 65, 30,135,195, 92,230,178,150, 51,170, 55,168, - 76, 49, 12,156, 9,195,131,147,132, 7, 6, 12, 52,202,124, 82,145, 62, 89, 37, 26,226,156,216,104, 93, 78,135, 42,167, 76,251, -198, 92, 56,123,114,168,205,102,171, 86, 20, 51, 72, 50,234,181,251, 53,153,110,191, 2,119,172,248,247,115,162,216,108, 49,127, -241, 15, 57,212,140,242,191,164, 25, 92, 93,210,191, 82,128,207,152,164,228,156, 91, 9, 79,117,191,226,197,101,117,222, 36,157, - 92, 31, 31,159,175, 25,134, 25, 45, 20, 10,229, 38,147, 73, 75, 8,217,145,157,157,189, 16,175, 44,254,219,152, 47,241,214,143, - 17,138,165,115,205, 6,237, 31,186,156,216,145,229, 29,187,212,171,118,119,177, 76, 54,203,160,215,238,208,101,199,110,127,203, -231,211, 69, 36, 18, 53,150,203,229,252,220,220,220,155, 0,148,255, 75,249,222,176, 97,195,202, 28, 14,167, 26,203,178, 62, 0, - 92, 96, 31, 21,146,203,227,241,210,139, 34, 90,164,162,154,109,223,223,239,217,165, 91,253, 79,195,175,196,172, 41,106, 86,124, - 70,192,144, 85,226,209,189, 58,125,254,235,161,163, 37,141, 58,252,199, 93,243,255,127,154, 29,120,114,191,220,177, 28,161,203, -162, 46,193, 6, 93,110, 70,250,212,171, 15, 20, 55, 1,168,223, 36,157, 2,129, 96,148,217,108,150, 8, 4, 2,189,217,108,222, -245,191,114,236, 18,239,224,241, 28, 16,135, 87,166, 96,193,220,121,105,208,202,191,229, 90,226,134,132,132,180, 19, 8, 4,149, -109, 54,155,212,100, 50,233,244,122,125, 82,114,114,242, 31, 40,125,225,243,191, 52,157, 50,239, 90,171, 5, 2,209,199, 0, 96, - 54, 27,215,106,115,226, 62, 45,235,139,101,124,254, 31,157, 71,158,213,154,198,241,184,124, 47, 20, 77,204,205, 90,173,138,236, -196,219,181,254,198,116, 82, 94, 51,115,169, 38,213,164,154, 84,243,101, 56,244,124, 82,205,191, 83, 83,236, 87, 55, 80,236, 87, -215,225, 73,151, 75,249, 60, 61,159,148, 98, 38,149,240, 2,224,192,132,165, 20, 10,133,242, 23,192,210, 83, 64,249, 59, 49,100, - 62,122,250, 87,126,158,242,159,163,212, 62,209, 76, 25,174,180, 34, 33,193,215,113,182,231,168, 38,213,164,154, 84,147,106, 82, - 77,170,249,159,211, 44, 79,251,159,216, 36, 57,233,165,237, 19, 0,254, 95, 58,252,211,176, 42,213,164,154, 84,147,106, 82, 77, -170, 73, 53,255,107, 60, 51, 94, 28,122, 46, 40, 20, 10,133, 66,161, 80,254, 26,104, 31, 45, 10,133, 66,161, 80, 40,148, 55,163, -164,166, 67,106,180, 40, 20, 10,133, 66,161, 80,222, 2,165,118,134,167, 77,135, 20, 10,133, 66,161, 80, 40,111, 70,113, 68,203, - 15, 47, 77,239, 64,141, 22,133, 66,161, 80, 40, 20,202,219, 33, 19, 37, 69,183,194,194,194, 72, 73,127, 83, 40, 20, 10,133, 66, -161,252,127,240, 15,247, 34,207, 71,178, 38, 21,109, 3,120, 46,162, 69, 13, 22,133, 66,161, 80, 40,148,255, 21,179,245, 15,163, - 56,146, 85,252,202,124,197,104,245,233,211,135,161,102,139, 66,161, 80, 40, 20,202,223,197,191,209,139,112, 94, 62, 64,154,205, - 20, 10,133, 66,161, 80,254, 78,179,245,111, 58, 30, 58,189, 3,133, 66,161, 80, 40, 20,202,155,225, 7,160,247,115,219,255,111, - 75,240, 80, 40, 20, 10,133, 66,161,252,219,153, 84,218, 54,141,104, 81, 40, 20, 10,133, 66,161,188,125,179, 69,161, 80, 40, 20, - 10,133, 66,249, 39, 67, 87, 54,167,154, 84,147,106, 82, 77,170, 73, 53,169,230,191,157,226,121,180,128,210,230,209,162, 80, 40, - 20, 10,133, 66,161,188, 22,189, 97,159, 63,107, 82,209,123,111,106,180, 40, 20, 10,133, 66,161, 80,222, 46,175, 44,191, 67,141, - 22,133, 66,161, 80, 40, 20,202,219, 53, 88,155,169,209,162, 80, 40, 20, 10,133, 66,249,139,161, 70,139, 66,161, 80, 40, 20, 10, -229, 47,130, 65,233, 35, 7,206, 85, 64,231,117, 70, 31,156,163,154, 84,147,106, 82, 77,170, 73, 53,169,230,127, 78,179, 60,237, -115,248,231, 81, 60, 51,252, 9,252,217, 17,126,243,255,199, 15,211,161,175, 84,147,106, 82, 77,170, 73, 53,169, 38,213,252,183, - 51,233,165,247,103,208,166, 67, 10,133, 66,161, 80, 40,148,183,107,182,232, 18, 60, 20, 10,133, 66,161, 80, 40,111,137, 82,155, - 9,105, 68,139, 66,161, 80, 40, 20, 10,229,205, 40,117, 81,105,106,180, 40, 20, 10,133, 66,161, 80,254, 26,195, 69,141, 22,133, - 66,161, 80, 40, 20,202, 91, 52, 89,147, 74,252,111, 88, 88, 24,161,231,136, 66,161, 80, 40, 20,202,223,197,191,214,139, 20, 31, - 24, 53, 91, 20, 10,133, 66,161, 80,168, 23,169, 48,126,248,115,180,225,164,162,109, 0,116,212, 33,133, 66,161, 80, 40, 20,202, -155,210, 27, 47,142, 60,156, 84,188, 77,141, 22,133, 66,161, 80, 40, 20,202,155, 51,169,204,255,210,102, 67, 10,133, 66,161, 80, - 40,127, 39,255, 70, 47,194,208,108,165, 80, 40, 20, 10,133, 66,121, 35, 74,138,102,109,166,167,133, 66,161, 80, 40, 20, 10,229, -175, 53, 92, 20, 10,133, 66,161, 80, 40,148,191,194,100,253,213, 19,150,210,149,205,169, 38,213,164,154, 84,147,106, 82, 77,170, -249, 95, 49, 89,207, 79,241, 0,128,142, 58,164, 80, 40, 20, 10,133, 66,121, 83,232,162,210, 20, 10,133, 66,161, 80, 40,127, 17, -116, 81,105, 10,133, 66,161, 80, 40,148,255,103,195, 69,141, 22,133, 66,161, 80, 40, 20,202, 91, 52, 89, 47,152, 45,218, 71,139, - 66,161, 80, 40, 20, 10,229,205, 40,181,143, 22,131,210, 71, 14,156,171,192, 15,188,206,232,131,115, 84,147,106, 82, 77,170, 73, - 53,169, 38,213,252,207,105,150,167,125, 14,255,124, 38,225,255,105,194, 82, 58,244,149,106, 82, 77,170, 73, 53,169, 38,213,164, -154,255, 53,232,244, 14, 20, 10,133, 66,161, 80, 40,111,219, 88,189, 12, 53, 90, 20, 10,133, 66,161, 80, 40,111, 6,157, 71,139, - 66,161, 80, 40, 20, 10,229, 47,194, 15,246,168, 86,241,123, 99,106,180, 40, 20, 10,133, 66,161, 80,222, 14,189, 97,143,106, 21, -191, 83,163, 69,161, 80, 40, 20, 10,133,242, 22, 41,113, 30, 45, 6, 0,194,194,194, 72,209,118,199, 62,125,250, 92,166,231,138, - 66,161, 80, 40, 20,202,255, 39,255, 86, 47,242, 44,162,213,167, 79, 31, 6,192, 37,154,213, 20, 10,133, 66,161, 80,254, 14,254, -141, 94,132,243,146,147,236, 72,179,153, 66,161, 80, 40, 20,202,223,193,191,209,139,240, 94,114,145, 20, 10,133, 66,161, 80, 40, -127, 11,255, 96, 47,226, 7,123, 71,248, 19, 69,239, 64,209,148, 15,116, 30, 45, 10,133, 66,161, 80, 40,148, 55,163,120,180,225, - 43, 75,239,208, 40, 22,133, 66,161, 80, 40, 20,202,155, 81,210,204,240,155,233,105,161, 80, 40, 20, 10,133, 66,249, 11,161, 17, - 45, 10,133, 66,161, 80, 40,148, 55,231,249,168,214,255, 91, 52,139,174,108, 78, 53,169, 38,213,164,154, 84,147,106, 82,205,255, -146,201,122, 97,155,206, 12, 79,161, 80, 40, 20, 10,133,242, 23, 65, 71, 29, 82, 40, 20, 10,133, 66,161,188, 25,197, 35, 14,159, -223,166, 70,139, 66,161, 80, 40, 20, 10,229, 45,154,173, 87,160, 77,135, 20, 10,133, 66,161, 80, 40,111,198,164,210,254, 65,141, - 22,133, 66,161, 80, 40, 20,202, 95,100,184, 24,148, 62,114,224, 92, 5,132, 95,103,244,193, 57,170, 73, 53,169, 38,213,164,154, - 84,147,106,254,231, 52,203,211, 62,135,127, 30,127,219,132,165,116,232, 43,213,164,154, 84,147,106, 82, 77,170, 73, 53,255,179, -208,166, 67, 10,133, 66,161, 80, 40,148,255, 1,163,229,197,227,241,190,148, 72, 36, 27, 37, 18,201, 79, 60, 30,111, 5, 0,183, -138,254,160, 76, 38,155,238,235,235,251,216,215,215, 55,173,114,229,202, 39,157,156,164,159,212, 16,161, 61, 0,254, 91, 58,158, - 96, 0,159, 72, 36,146, 71, 98,177, 56, 25,192, 78, 0,159, 0,240,124, 19,225,133,254, 24, 28,245,113,255, 35, 11,253, 49,248, -165,127,245,246,241,241,185, 10,160,251,219,202,148,225, 82,116, 29, 34, 67,234, 16, 25, 82,135, 75, 95,191,214,224,228,228, 52, -218,207,207,239,186,135,135, 71,186,159,159,223, 53,177, 88, 60,164,130, 18,222, 62, 62, 62,223, 7, 6, 6,198,250,251,251,175, -129,125,117,242,255, 89,218,137,208,174,165, 8,138, 86, 66,168,219, 8,177,177,149, 16,221,186, 1,210,215,148,107, 11,224,128, -179,179,243, 61, 30,143, 23, 6, 96, 80,209,245, 53,136,199,227,133, 57, 59, 59,223, 3,112,160,232,115,175,115,157,126, 15, 32, - 29,192,146,162,237,143, 2, 3, 3,213,161,161,161,201,161,161,161,191, 4, 5, 5,189,231,168,152, 84, 42,237, 22, 24, 24,120, -176,114,229,202,201,173, 90,181,202, 15, 8, 8,136,169, 84,169,210,118,145, 72,212,145, 22,113, 20, 10,133,242,191, 79, 95, 0, - 75, 1,172,143,140,140,140, 32,132, 68, 16, 66, 34, 34, 35, 35, 35, 0,108, 4,176, 12,165,135, 16, 95,216,239,225,225,177, 96, -209,162, 69,134,204,204, 76,162, 80, 40, 72,108,108, 44, 89, 61,119, 22,219,195,157, 71,106,120,185,233,252,252,252,226,171, 84, -170,180,167,190,156, 51, 11, 64, 77, 71, 52,159,195, 77, 34,145,220,156, 59,119,174,230,234,213,171, 26,147,201,164, 97, 89, 86, -147,145,145,161, 57,119,238,156,166, 77,155, 54, 26, 0,159, 2,224, 86, 64,243, 25,223,250,227, 50,249,249,107,242,173, 63, 46, - 63,191,191, 78,157, 58, 15, 89,150, 37,131, 7, 15, 54, 2, 8,168,136,230,203, 4, 0,226,250,206,112, 29, 34, 71,182,117,251, - 66, 66, 54,204, 32, 67,100, 72,125, 29, 77,111,111,239,163,211,167, 79, 87,165,167,167, 19,163,209, 72, 82, 83, 83,201,228,201, -147,149,222,222,222,187, 28, 60,118,143,144,144,144,236,235,215,175,179,133,133,133,228,210,165, 75,108,131, 6, 13,178, 29, 52, - 91, 93, 95, 74,203,102,127,127,255,147, 21,121,121,123,123,111,173,104, 30,181, 16, 33,213, 28,113,145,144,219,225,228,216,224, - 86,100,117,211, 74,100,144,187,176,176,173, 16, 31,117, 40,121, 42,147,210, 52,135,118,232,208, 65,251,224,193, 3, 91, 94, 94, - 30,121,248,240, 33, 59,113,226, 68, 3,128,232,137, 19, 39, 26, 30, 62,124,200,230,229,229,145, 7, 15, 30,216, 58,116,232,160, - 5, 48,161, 2,233,228, 0,216, 54,127,254,124, 66, 8, 33,139, 22, 45, 34,161,161,161,164,115,231,206, 68,163,209, 16, 66, 72, - 50, 33,228, 23,171,213, 58,214, 17, 77, 23, 23,151,209,211,167, 79,215,232,116, 58, 82, 12,203,178,164,176,176,144,172, 95,191, - 94,235,235,235,123,178,148, 74, 6,109,242,160,154, 84,147,106,254,175,105,254,147,241,131,189,159, 86,241,203,225,192,196,136, - 89,179,102, 21,155,170, 83,109,219,182,189, 53,118,236,216,136,177, 99,199, 70,180,109,219,246, 18,128, 51,119,238,220,137,152, - 57,115,102, 4,128, 17,229,100,132, 91,235,214,173, 11,179,178,178, 72,173, 90,181, 72,213,170, 85, 73, 86, 86, 22, 33,132,144, -219, 67,155,144,243,117, 65,158, 94, 57, 69,194, 15, 31, 32, 19,253,120,164,157,159,139,197,207,215, 55,207,211,211,115, 49, 94, - 92,147,177,164,204, 29, 88,183,110, 93,117,116,116,180, 38, 46, 46, 78,179, 96,193, 2, 77,231,206,157, 53, 33, 33, 33,154, 65, -131, 6,105,214,173, 91,167, 49,155,205,154,173, 91,183,106,156,157,157,163, 75, 48, 91,175,109,180,120, 60,222,218,200,200, 72, - 18, 31, 31, 79,138,162, 20,165,105,186,184,186,186,246,116,115,115,251,212,213,213,181, 39, 0, 23, 0,168, 5,200, 27,186,160, -242, 71, 13,107,212, 9, 27,209,181,230,250,174,205,154, 12,113,226, 20, 90,126,152, 65,200,224,202,175,101,180, 92, 92, 92, 70, -127,242,201, 39,106,163,209, 72,116, 58, 29,209,104, 52, 68,167,211, 17,181, 90, 77, 70,140, 24,161, 18,139,197, 3,203,211,244, -244,244, 92,120,229,202, 21,107, 86, 86, 22,185,114,229, 10, 57,121,242, 36,217,176, 97, 3,235,237,237,189,170,162, 55,160,175, -175,239,217,240,240,240,136,187,119,239, 70,220,188,121, 51,194, 98,177, 68,152,205,230, 8,179,217, 28, 17, 22, 22, 22,113,232, -208,161,136,189,123,247, 70,152, 76,166, 8,147,201, 20, 97, 52, 26, 35,170, 87,175,126,186,162,121,212, 92,132,167,166,171,199, - 8, 89,245, 33, 81,126, 55,149, 20,126,214,139,228, 76,110, 79, 54, 54,171, 68,218, 75,112, 28,175,174,237, 89,162, 38,159,207, -191,156,156,156,204,206,153, 51,199, 84,175, 94, 61,229,184,113,227, 12, 70,163,145, 16, 66,136,209,104, 36,227,198,141, 51,212, -171, 87, 79, 57,103,206, 28, 83, 82, 82, 18,203,227,241,206, 85, 32,157,203,138, 77,214,229,203,151,201,243,104, 52, 26,210,185, -115,231,228,208,208,208, 95,170, 85,171, 54,178, 60, 77,185, 92,222,127,246,236,217, 26, 82, 2, 22,139,133,168,213,106,146,148, -148,196, 86,173, 90, 53, 3,128, 7, 45,204,169, 38,213,164,154,212,104,253,101, 76, 42,103,187,228,147, 56,115,230,204, 8, 66, - 72,196, 87, 95,125, 21, 81, 20,217, 18, 0,144, 23,189,120, 0,134,207,158, 61, 59,130, 16, 18, 49,107,214,172,226,207,148,150, - 17,125,247,239,223,111, 94,179,102, 13,241,241,241, 33,190,190,190,100,237,218,181,132,101, 89,146, 21,182,139,156,175, 11,242, -232,203, 49,132, 16, 66, 98, 23, 79, 35,231,235,130, 36,108,250,150,140, 26, 53, 74, 39,149, 74, 71,148,145,185,238, 77,154, 52, - 81,235,245,122,205,246,237,219, 53, 82,169,244, 54,128,122,176, 55, 69, 50, 69,105,125,175, 94,189,122,170,168,168, 40,205,238, -221,187, 53, 0, 22, 56,120,193,212, 4,208, 73, 38,147, 13,154, 29,192,143, 35, 63,127, 77,102,251,224, 1,128, 6, 0,188,138, - 62,227, 63,107,214, 44, 66, 8, 33,129,129,129, 87, 74,209,116, 9, 9, 9,153, 21, 23, 23, 55,207, 98,177,204,187,123,247,238, -188,218,181,107,207,233, 87,221,175,213,145, 17,221, 26, 43,191,157,218,152,172,252, 44,100,197, 59,205,187,238, 25,214,113,196, -251,213, 60,175,142,243, 22,235,222,117,225,170, 95,106, 58,116,232,194, 14, 8, 8,184,153,154,154,250,204, 92,169,213,106,146, -158,158, 78, 18, 19, 19,201,213,171, 87,137,159,159,223,249,242, 52,125,125,125, 31,166,166,166,146, 77,171, 87,147,193, 13,234, -144,246,174, 78,164,131,155, 19,105, 42, 23,107,235, 2, 77, 43,106,180,238,221,187, 23, 1, 32, 2, 64, 68, 94, 94, 94, 68, 94, - 94, 94, 68, 65, 65,193,179,125, 0, 34,148, 74,101,132, 82,169,140, 48,153, 76, 17, 53,106,212,168,176,209,106, 35, 70,155, 22, - 98,228,183, 18, 65,223, 55,192, 51, 99,106,117, 79,219,141, 17,173, 72,193,135,157,201,154,198, 1,164,173, 16, 31, 57,168,217, - 87, 40, 20, 94, 2, 48,163,200,148,143,233,217,179,167,142, 16, 66,122,246,236,169, 3, 48,166,104,255, 39, 69, 38,171,167,131, -233,228, 4, 5, 5,105,139, 35, 89, 0,254, 8, 10, 10,210,134,134,134,146,208,208, 80, 18, 24, 24,168, 46,210,118,168, 64,171, - 89,179,102,172, 94,175,127,102, 0, 11, 11, 11, 73, 70, 70, 6, 73, 72, 72, 32,209,209,209,228,246,237,219, 36, 57, 57,153,236, -219,183,207,230,234,234,122,130, 22,230, 84,147,106, 82, 77,106,180,254, 82,163,245,242,235, 69,194,194,194,200, 75,187,190,187, -115,231, 78,196,236,217,179, 35,202,113,102,147,190,250,234,171,226,168,215,210, 50, 30,254, 91, 99, 99, 99,201,152, 49, 99, 72, -112,112, 48, 9, 14, 14, 38, 99,199,142, 37, 74,165,146,104,158, 68,145,243,117, 65,110,191,219,148, 16, 66,136,250,209, 93,114, -190, 46, 72,196,168,214,228,254,253,251,164, 82,165, 74,225,101,252,254,241,107,215,174, 41,118,237,218,149, 5,123,127, 44, 62, -128,150, 0,214, 74, 36,146,109,176, 55, 23, 86, 5,224, 86,171, 86,173,124,157, 78,167, 25, 60,120,176, 6, 64,229, 50, 52, 59, - 4, 7, 7,199,111,221,186,149,228,228,228,144,252,252,124,178,188, 77,109, 66,126,254,154, 44,106, 90,149,221,180,105,147,113, -198,140, 25, 90,119,119,247, 48, 0,254,131, 7, 15,182, 18, 66, 72,251,246,237,179, 75, 18,115,117,117,237, 25, 23, 23, 55,207, - 96, 48,204, 43, 44, 44,156,151,159,159, 63,239,216,145, 35,243,122, 52,168, 61, 70,249,237,212,198, 71, 70,116,107,252, 78,128, -219,160, 85,221,155, 77, 73,159, 51, 97,240, 87,173,235, 61, 50, 44,251,248,226,208,234, 62,223,191, 78,110,123,121,121,101, 26, -141, 70, 2,224,149, 87,124,124, 60,241,240,240, 72, 45, 79,195,221,221,253,171, 79,134, 15,179, 13,172, 26, 64,226,215,204, 37, -150,179,187,137,229,228,118,242,228,187,207, 72, 63, 95, 79, 85, 75, 1,103,182,163,233,241,245,245, 61,123,243,230,205, 23,140, - 86, 65, 65, 65,137, 70, 75,165, 82, 69,152, 76,166,136,160,160,160,211,111,122,213,183, 20,162, 70, 7, 9,247,246,221, 49,237, -136, 98,106,103,210,211,133,159,252, 6,114,195, 1, 92, 2, 48,170,130,223,227, 0, 88, 86,108,168,190,251,238, 59, 66, 8, 33, - 65, 65, 65, 90,188,217, 96, 20,151, 58,117,234, 36, 78,152, 48,193, 90,183,110,221,156, 54,109,218, 20,222,186,117,139, 92,190, -124,153,156, 60,121,146, 28, 56,112,128, 68, 69, 69,145,244,244,116, 18, 27, 27, 75,122,247,238, 93, 8,160, 3, 45, 11, 41, 20, -202,255, 50, 37,120,145,127, 60,156,226, 3,235,211,167, 15,243,220, 1,186, 0, 16, 55,109,218, 84,177,108,217,178,149,176,207, - 5,193,132,112, 49,180,179,132,119,191,179,132,119, 63,132,139,161, 69, 17,163,205,139, 23, 47, 94, 24, 26, 26,154, 9, 64, 2, -192,183,164, 31, 34,132,180,243,240,240, 64,106,106, 42, 92, 92, 92,224,226,226,130,212,212, 84, 16, 66, 96, 37,128,133, 0, 70, -179, 25,122,189, 30, 6,150, 64,207, 2, 42,141, 6,190,190,190, 48,155,205, 53, 74, 73,127,195,119,223,125,183, 70, 72, 72,136, - 98,230,204,153, 25,176,247,149,217, 54,126,252,248,179,127,252,241, 71,136, 70,163,201,143,142,142, 54, 52,104,208,160, 39, 0, -223,184,184,184,209,235,215,175,199,152, 49, 99, 80,198, 67,167, 65,239,222,189, 79, 70, 69, 69,213, 24, 53,106, 20, 46, 93,186, -132,229,203,151, 35, 55, 55,151, 0,128,209,104, 36, 54,155,205,220,186,117,107,243,154, 53,107,154,183,111,223,254,102,245,234, -213,185, 0,144,152,152,248,164, 36, 65,134, 97,106, 87,169, 82, 5, 70,163, 17, 10,133, 2, 81, 81, 81,112,114,113, 65,100, 70, -174, 79,199, 85,155,242,190, 60,114,150, 63,188,121,136,251,167,221,218, 24,151,132, 95,170, 85,207,223,199,199,100,182,248,198, -102,102,103,188, 78,166, 10, 4,130,212,220,220, 92,152, 76, 38,232,245,122,168, 84, 42,228,229,229, 33, 55, 55, 23, 25, 25, 25, - 16, 8, 4,241,229,105, 56,231,231, 95, 73,188,118,153,217,247,227,119,168, 97,205, 7,239,224, 90,240,142,110, 68, 77,147, 2, - 63,205,157,236,100,242,240,154,239,236,228, 84,224,234,234,186, 25, 64, 80,121,122,141, 27, 55, 70, 94, 94, 30,242,242,242,224, -225,225, 1, 55, 55, 55,184,185,185,161,176,176, 16, 74,165, 18, 42,149, 10,181,106,213, 66,195,134, 13,177, 99,199,142,183,114, -113,223, 48, 33,193, 10,219,212,179, 49, 25, 16,200,100,168,238, 38,175,210, 76, 14,247, 50,190,210,153,207,231,239,119,119,119, - 15, 7,240, 33, 0, 25,128, 15,221,221,221,195,249,124,254, 0, 0,139, 0,236,170, 96, 50,150,204,159, 63,127, 86, 92, 92,156, -244,254,253,251,152, 57,115, 38, 22, 44, 88,128, 39, 79,158,252, 0,128, 45,250,204, 7, 30, 30, 30, 97, 28, 14,103, 11,128, 94, - 0,122,250,249,249,117, 41, 71,119,192,140, 25, 51, 12, 77,154, 52,137,125,244,232,209,128,107,215,174, 53,253,236,179,207,148, - 41, 41, 41,136,141,141,133,159,159, 31, 2, 3, 3,161,209,104, 80, 80, 80,128, 1, 3, 6,184, 56, 59, 59,143,160,197, 56,133, - 66,249, 95, 54, 89, 47,121,145,127, 90, 68,171,196,237, 18,107,212, 82,169,116,126, 68, 68, 68,171,208,208, 80, 30,128,125, 0, - 16,194,197,144, 1,173, 27,109, 59,178,249,187,208, 67,107,230,134,246, 8,173,181, 45,132,139,226, 81,108, 97, 77,155, 54,117, -139,136,136,104, 45, 18,137, 62, 42, 37, 17, 4, 0,220,220,220,224,226,226, 2, 87, 87, 87,184,185,185,129,101, 89,104,116, 6, -104,109,128,218, 96,130, 82,169,132,186,104, 91, 99, 52, 67,171,213, 62,251,110, 9,116,156, 48, 97,130, 98,253,250,245, 57,153, -153,153,223, 1,104, 48,102,204,152,254,235,214,173,195,133, 11, 23, 12,189,130,107,122, 44,110,215,104, 97,189,204, 39,243,130, -249,152, 8,224,202,149, 43, 87,208,186,117,107, 48, 12, 51,172, 36, 65,137, 68,178,113,207,158, 61,146,232,232,104,212,172, 89, - 51,122,216,176, 97, 67,191,251,238,187, 26, 50, 77,254,239, 0, 96,205,203,138,158, 54,109,218,215,139, 23, 47, 86, 40, 20, 10, -179, 78,167,251, 63,246,190, 59, 44,138,171,125,251,158,237,203,238,210,219,210, 85,138, 96, 65,197,222,176,183,136,157,216, 53, -246, 88,162,209, 24, 99, 11,197,168,177, 68,141, 26, 19, 77,108, 17,141, 5, 81, 17, 99,195,222, 21, 80, 84, 4, 65,144, 38,101, -105,203, 22,182,176,229,124,127, 32, 4, 13,213,188,239,239,123,147,204,125, 93,123, 45,236,156,185,231,156,153,115,102,238,121, -206,115,158,199,110,248,240,225,200,204,204,196,155, 55,111,238,214, 34, 50, 95,198,197,197,145,210,210, 82,164,166,166, 34, 46, - 46,206,228,235,175,191,238,100, 96, 48, 70,100,195,116,218,212,238, 29, 58, 77,234,210, 14,135,239, 61,225,220, 74, 74,179,232, -208,196,201,242,113, 86,110, 83, 29,133, 87, 31,114,181,229,114,249,246,111,190,249, 70,161, 80, 40,144,157,157,141,167, 79,159, -226,197,139, 23, 72, 79, 79,199,166, 77,155, 20,197,197,197, 59,234,227,112,228,179,190,216,188,100, 6,197, 74,184, 11, 60,185, - 1,148,201, 1,149, 2,154,196, 88, 28, 72,204,195,174,147,167,184, 25,153,153, 22,199,142, 29,155,233,234,234, 26, 11,192,171, - 46, 62, 66, 42, 46, 33,131,193,120, 95,132,130,193, 96,200, 1,228, 9,133,194, 44, 83, 83,211, 44, 6,131,145, 71, 8, 81,254, - 71,222, 36,244, 40, 7,147, 9,112, 77,192, 96,215,153,218,243,227,113,227,198, 29,205,202,202, 26,148,154,154,218,117,199,142, - 29,223,240,249,252,248, 29, 59,118,124,147,154,154,218, 53, 43, 43,107,208,184,113,227,142, 2,152,210,152,227,123,122,122, 46, - 8, 14, 14,198,166, 77,155,208,182,109, 91,120,121,121,149,133,132,132,108, 7,176, 26,192,103,158,158,158,183, 23, 44, 88, 48, - 93, 34,145,136,179,179,179,219,254,240,195, 15,115,182,111,223,222, 49, 39, 39,135, 95, 15,117,143,129, 3, 7,226,252,249,243, - 0,144, 11, 32,181,168,168, 72,159,147,147, 3, 31, 31, 31,116,234,212, 9, 10,133, 2, 10,133, 2, 82,169, 20,110,110,110, 48, - 26,141, 93,233, 91, 57, 13, 26, 52,104,252,159, 10,174,154,133, 22,159,207,183,244,243,243, 67,179,102,205, 44,241,118,181,150, - 53,151,181, 98,241,204,241, 2, 81,236, 5, 80,113, 87, 48,174,103, 43,129, 53,151,181,226,237, 46, 44, 55, 55, 55,158,159,159, - 31,132, 66,161, 83, 45, 7,191,158,151,151, 7, 63, 63, 63, 88, 88, 88,192,220,220, 28,126,126,126, 40, 47, 47, 71,169, 92, 14, -165, 1, 40,211, 25, 81, 90, 90,138,226,130,124,148, 25, 0,189,169, 53,210,211,211,193,100, 50,211,106,225,116,240,240,240, 40, -136,143,143, 47, 0,112, 19,192,167,161,161,161, 88,190,124, 57,130,130,130,142, 10,114, 95, 15, 60,122,254,140,245,145,144,121, -182, 94, 92,106, 60,128,242,172,172, 44, 88, 88, 88, 64, 40, 20,214, 40, 12,252,253,253,219, 11,133, 66, 28, 60,120,144,100,103, -103,119, 71,197, 18,254, 52,138,170, 16,123, 38, 12,148, 2,216, 30, 27, 27,219,249,235,175,191, 78,234,223,191, 63,187, 75,151, - 46, 88,187,118, 45, 0, 68,213,196, 41,149, 74,239, 79,153, 50, 69,123,237,218, 53, 36, 38, 38, 10, 79,159, 62, 29,184,118,237, -218, 86, 25, 25, 25,188,179,191, 95, 24, 18,150, 37, 11,220,120,233, 22,127,221,197,235,247,109,204,132, 45,155,218, 88, 33, 46, -227, 13,199,192,196,195,250,174,104,103, 54,115,102,111, 62, 43,174, 39,143,145,219,155,207, 66,159, 74, 59, 0, 0, 32, 0, 73, - 68, 65, 84,138,237,200,102,206,144,203,229,199, 34, 35, 35, 47, 46, 89,178, 68, 33,145, 72, 96,106,106,138,162,162, 34,172, 95, -191, 94, 17, 23, 23,119, 82,171,213,158,173,143,215, 96, 36,237, 93,154,184, 2,175,226,171,126, 43, 55, 18, 60,212,114, 16,240, -233, 34,120,251,248, 64,171,213,162,117,235,214, 84,104,104,168,208,220,220,252,203,122, 69, 15,227, 79,221, 77, 79, 81, 84, 30, - 33,228,141, 66,161,200, 54, 49, 49,201,224,112, 56, 25,197,197,197,217,132,144,252,255,132,206, 34, 12,124,209,173,181, 39,192, - 51, 65, 70,145, 34,231,145, 2,197, 53, 21, 52, 53, 53,157,177,107,215, 46,254,190,125,251,116, 11, 22, 44,208,204,153, 51,135, -173, 82,169,236,230,204,153,195, 94,176, 96,129,102,223,190,125,186, 93,187,118,241, 69, 34,209,232, 15,169,136, 78,167, 67,124, -124,252,198,148,148, 20, 33, 42,194,141, 44, 10, 9, 9,153,154,156,156,204,223,185,115, 39,194,195,195, 17, 30, 30,142, 17, 35, - 70, 96,225,194,133, 8, 14, 14,174,139, 78,208,166, 77, 27, 63,107,107,107,220,184,113, 35, 7, 64, 6,128,246, 34,145,200,116, -196,136, 17, 24, 52,104, 16,212,106, 53,202,203,203,171,132, 22,147,201,132,133,133,133, 53,125, 15,164, 65,131, 6,141,255,186, -200,122, 71,108,177, 0,160,210, 84, 23, 16, 16, 64,213,245, 96, 52,148, 72, 32, 85,150, 33,189,180, 12,153, 37,198,119,182, 25, -141,198, 58,143,158,147,147,115,246,222,189,123, 51,252,252,252, 88, 57, 57, 21, 51, 98,126,126,126, 40, 43, 43, 67,206,147, 7, - 80, 26, 1,161,135, 47,148, 74, 37, 74, 94, 60,134,168, 77, 87, 88, 15,157,132,173, 59,119,106,138,138,138,118,215,196,201,229, -114,217,206,206,206, 5,105,105,105,122, 0,197,230,230,230, 3, 93, 93, 93,113,253,250,117, 0, 56, 76,128,205,136,187, 6,220, -136, 0,169, 48,169,136,220,220,220, 32,145, 72,160, 80, 40,174,215,196,121,239,222,189,100,157, 78,215,122,248,240,225,212,175, -191,254,122, 92, 38,147, 5, 1,120,170, 49,130,249, 36, 43, 31, 74, 3,248, 0, 6, 88, 90, 90,126, 30, 28, 28,220,111,193,130, - 5,136,140,140,196,165, 75,151,202, 81,225, 11,118,175, 6,218,210,212,212,212, 61, 75,151, 46,237,194, 96, 48, 62,189,124,249, -178,222,203,203, 75, 86, 94, 94,110,104,238,237,205, 8, 10, 93,195,153,255,233,108,139,162, 50, 36, 12,106,238,208,141,162,128, -132, 55,146,140, 20, 5,138,234, 58,167,254, 92,102,212,200,238,109,252,103,140, 27, 38, 18,122,180,132,242,217, 3,241,158, 19, -191,111, 53,137, 75, 14,184, 33,145,140,136,140,140, 12,188,126,253,250,124,173, 86,219,140,199,227,189,146, 74,165,223, 43, 20, -138,122, 69, 22,147,201, 28,170,113,112,182,148, 22, 23,131,255,214, 18, 37,211, 25, 81,168,209, 35,209,194, 11, 19,156, 93,170, -166, 65,243,242,242, 32, 22,139, 41,131,193, 48,172, 46,206, 75,151, 46, 33, 32, 32,160, 82,120,130,162, 40, 80, 20, 85,232,237, -237,157,207,227,241,138, 56, 28,142,108,243,230,205,106,181, 90, 13, 22,139,197, 55, 24, 12,204,191,210,219, 59, 9, 96,199, 35, -212,143,115,134,247,233,223,182,165, 15,185,249,232, 9, 85, 82,166, 62, 80,135, 21,240, 7, 79, 79, 79, 86,113,113,241, 89, 0, -137, 58,157,238,200,241,227,199,249,147, 39, 79, 86,159, 56,113, 98, 34, 0,247, 45, 91,182, 4, 42, 20,138, 70,165, 84, 72, 73, - 73,249, 97,221,186,117, 95,173, 90,181, 10,135, 14, 29, 90,144,146,146,178,252,173,165,107, 68,112,112, 48, 54,111,222,140, 67, -135, 14, 25, 19, 19, 19,127, 55, 26,141, 41, 75,150, 44,105, 99,111,111, 95,152,155,155,155, 82, 7,109,135,193,131, 7,107,110, -223,190,205,149,203,229,183, 0,124, 62,119,238,220,153,157, 59,119,150,141, 27, 55, 78, 84, 92, 92, 44, 21, 8, 4,220,189,123, -247, 90,178, 88, 44, 40,149, 74, 80, 20, 5,185, 92,174,165,239,131, 52,104,208,248, 95, 69,109, 90,228,111,130, 90,159, 13,172, -154, 26, 88, 86, 86,150,159,153,153,233,243,230,205, 27, 61, 0, 61, 0, 20,105,245,223,174,219, 27,177,111,116, 23, 79, 97,174, - 78,135,211,143,158,151, 21,105,245,149,206,239,250, 55,111,222,200, 51, 50, 50, 76, 85, 42,149,162,150, 99,221,253,241,199, 31, - 85,215,174, 93, 51, 77, 77, 77,133,193, 96, 64,251,246,237,241,242,229, 75,148, 36,198, 67,232,211, 30,194, 94, 1,120, 30,251, - 8,113,151,162,241, 90,161,213, 39,173, 94, 87,170, 80, 42,131,203,203,203, 79,215, 68,200,102,179,139, 1, 16, 66,136, 1, 0, -100, 50,217, 83,133, 66,209,211,222,222, 30, 9, 9, 9, 66,165, 1, 11, 3, 87,108,221, 65, 8, 49,112, 42, 86,115, 45, 30, 55, -110, 28, 98, 98, 98, 0, 32,166, 38, 78,153, 76,182, 96,214,172, 89,215, 14, 30, 60,200, 74, 77, 77, 29,180,111,223,190, 65, 73, - 73, 73,132, 42,206, 52,220, 46, 99,195,125,234,194,142, 63,185,121, 95, 10, 8, 8,128,131,131, 3,246,238,221,139,239,191,255, - 94, 55,111,222,188,228,239,191,255,190,163, 68, 34, 57, 82, 75,251, 75,165, 82,233, 5,107,107,235,249,173, 90,181,146, 43,149, - 74, 20, 21, 21, 33, 39, 39, 7, 86,214,214, 12, 61, 24,221,108, 45, 44,142,156,205,147, 11, 89, 23,238,227, 65,118,110,157,214, -172, 46,108,230,148,209,254,237,252, 63, 91,181, 66,132,219,167, 65,205, 10, 6,217,247, 13, 22,125, 18,104,170,214, 28,233,165, -124,146, 62, 57, 86, 38, 11,147,201,100,225,141,236, 44,131,187,117,235,118,116,221,186,117, 38, 43, 55,173,195, 22, 31, 39,232, -139,138, 80,160, 49,160, 80,163,135,172, 36, 17, 9, 9,207, 97,109,109,131,215,175, 95, 67,173, 86,227,197,139, 23,132,201,100, -158,173,207,162, 83,137,106,211,133, 82, 30,143, 87,196,102,179,243, 89, 44, 86,113,106,106,170, 82,173, 86,131,193, 96, 8, 13, - 6,131, 73, 3,234,234,108, 99, 99,179, 4, 21,193, 68, 35,229,133,133,219,253,216,176, 0, 11,189,221,108,172,135,172,158, 51, -217,198,213,209, 78,154,154,252, 74,183,251,226,157, 66,181,166,246,197, 26, 0,162,138,139,139,171, 44,146, 39, 78,156, 88,116, -226,196,137,153, 0,246,163, 34,239, 86,180, 84, 42,253,233, 3, 6,223,234,147, 39, 79,126,181,106,213, 42,152,152,152, 84, 5, - 79, 53, 49, 49,225, 3,192,111,191,253,134,132,132,132,206,120,235,175,101, 52, 26,143,230,230,230,214,199,233,238,235,235,155, - 26, 17, 17,193, 5,224, 56,119,238,220,174, 59,118,236,192, 39,159,124, 82,240,252,249,243, 46, 0,210, 0,184,127,250,233,167, - 15, 15, 29, 58,100,105, 52, 26, 81, 82, 82, 2,173, 86,155, 70,223,202,105,208,160, 65,139,173,255, 10,252, 0,196,161, 34,126, -214, 80, 0,231, 80,225,214, 81, 43, 92,222,170,179,139, 0,134, 87, 62, 31,107,113,134, 7, 42, 86,100, 93, 0,240, 11, 0,251, -218, 72,173,173,173,191,156, 58,117,170, 46, 59, 59,155,228,229,229,145,240,240,112,178,120,198, 84,195, 0, 15, 71,163,135,163, -189,210,214,214,246,165,131,141,213,129,118, 2, 44, 6,224,220,128,134, 77, 77, 74, 74,154, 61,117,234,212, 25,111,143, 59,227, -232,209,163,138,203,151, 47, 43,152, 76,102, 20, 42, 66, 59, 84, 10,202, 41,195,134, 13, 83,104, 52, 26,133,183,183,119, 49, 42, - 28,247,107, 67, 96,239,222,189, 75,206,159, 63, 79, 12, 6,195,159, 98, 20, 21, 20, 20,144, 75,151, 46,145,238,221,187, 75, 1, - 76,238,215,175,223,245, 59,119,238, 92,239,209,163,199,201,250, 42,108, 99, 99,179,226,201,147, 39, 49,233,233,233,177,231,206, -157,139, 61,114,228, 72,236,167,159,126,250,180, 77,155, 54,170,228,228,100,163, 94,175, 39, 79, 30, 63, 38,222,205,155, 43, 1, -184,213,198,211,215,132,245, 80,182,247, 27,162, 94,251, 9, 81,143,116, 33, 0,136,124,235,151, 36,127, 65,127,242,114,254, 16, -210,135,207,188,247, 33, 61,197,202,202,234, 98, 76, 76, 12,145,203,229,228,217,179,103,100, 74,192, 32,114,111,102,127,114, 97, -144, 39, 57,212,171, 41,217, 58,176, 13, 25,212,171, 39,249,241,199, 31, 73, 68, 68, 4, 89,177, 98,133,209,198,198, 70,142, 58, -124,180,196, 98,241,229,227,199,143,199, 2,136,101, 50,153,177, 50,153, 44, 86, 46,151,159,205,202,202,218,229,237,237,253, 85, -171, 86,173, 38,250,248,248,244,237,211,212,237,171,126,166,188,151,253,205,248,175,154,139, 4, 91,241,231,184, 87, 85, 48, 7, -220, 60,220,221,229, 55,110,220, 48,106, 52, 26,114,235,214, 45, 99,139,230, 94,234, 45, 99, 7,159,124,189,119,195, 73,245,249, - 95, 47,150,157,249,249,206,137,105, 1,241,189, 5,140, 95,187, 10,171,194,113,124, 40,198, 3, 56,141, 63, 86, 29, 78, 5,112, - 6,117,175, 66,100, 0,216,191,118,237,218,234, 43, 13, 1,128,209,166, 77,155, 88, 66, 72,108,155, 54,109, 98, 27, 91, 17,129, - 64,176, 36, 50, 50, 50,196,213,213,117,211,184,113,227,246, 74,165,210,115, 19, 39, 78,140, 71,197, 98, 16, 10, 21,217, 17,134, - 57, 59, 59, 23,196,197,197,145,235,215,175,147, 49, 99,198,200, 57, 28,206, 36,250, 54, 78,131, 6, 13, 26,255, 21,204,174,229, -187, 78,172,139,143,143,175,140,161, 53,183, 46,242,229,203,151,199,198,196,196,196,162, 34, 74,124,157, 96,177, 88,167,230,205, -155, 71,236,237,237, 21,118,118,118,167,216, 76,230, 76, 23, 19,248,225,195,150,186,247, 12, 11, 11, 27,241,195, 15, 63, 12, 5, -208, 25, 0,219,201,201, 41, 39, 47, 47, 79,113,231,206, 29, 69,247,238,221, 21, 54, 54, 54, 18, 95, 95, 95,197,150, 45, 91, 20, - 58,157, 78,177,100,201, 18, 5,254, 28,239,171, 38,240, 1,204,231,114,185,167, 90,180,104, 17,191,122,120, 95,221,166,133, 51, -201, 84, 79, 91, 5,128, 31, 0,204, 3, 96, 1,128, 29, 24, 24,120,229,197,139, 23, 23,125,125,125,247, 52,128,215,177, 85,171, - 86, 87,143, 30, 61, 26, 19, 17, 17, 17,251,229,151, 95,198, 88, 91, 91,103, 39, 39, 39, 27,213,106, 53, 41, 41, 41, 33, 82,169, -148,156, 59,119,206, 96,101,101,181,179,214,134,243,152,185,228,210,225, 26, 67, 56,100,173,154, 68,186,115, 25,111, 62,164,167, - 8,133,194,226,162,162, 34,146,151,151, 71, 82, 83, 83,201,201,147, 39,201,224,110,157,200,177, 79, 71,147,195, 51, 70,144,205, -131, 59,145,206,166,124,165,216, 84, 20, 99,106,106, 42,105,200,170, 67,177, 88,124, 89,163,209, 84,133,111,112,118,118,142,245, -246,246,142,240,245,245,221, 26, 25, 25,185,104,219,182,109, 35,250, 52,117,251,106,253,160,110,170,178,232, 19, 68,126,252, 7, -178,188,189,151,250,173,152,175, 17, 78,214, 86, 97, 55,174, 95, 55, 86,138, 95,189, 94, 79, 78,159, 58, 69,198, 14, 25, 16, 95, -122,225,183, 95,110, 5, 47, 56,186,164,189,215,233,238,124,140,175, 75,176, 85,189,138,136, 96,237,111,198,216,245,145,171, 85, -110, 79,115,198, 15, 93, 76,223, 73, 47, 53,214,203,203, 43,149, 16,146,235,227,227,147, 10,224,176,143,143, 79,245,255,167,213, - 66, 91, 21,156, 52, 36, 36,132,188, 29, 31, 12, 0, 65,235,214,173,139, 37,132,196,122,122,122,222, 6,128,182, 66,216,244, 50, -103,252, 50,220,221,190,168,151, 57,227,151,182,194,154, 83, 70,185,113,208,188,167,173,224,214, 8, 79, 7,121,111, 39,243,155, -135, 15,236,219,244,209, 71, 31,237, 5,176, 19,192, 55,214,214,214,183,198,143, 31,159,112,232,208,161,132, 45, 91,182,148, 39, - 39, 39,147,233,211,167, 43,121, 60,222, 55,244,125,144, 6, 13, 26, 52,254,107,168,140, 12,239,208, 24,161, 53,236,171,175,190, -138, 37,132, 84,198,210,154, 92, 67,153,225,171, 86,173,138, 37,132, 84, 70,135,127, 63,128, 89, 77, 1,205, 66,118,237,218, 69, -120, 60,222, 47, 31,216,152,234,156,226,145, 35, 71,118,145,201,100, 29,237,237,237, 59,190,181, 92,185,216,216,216,164, 30, 57, -114, 68,161, 82,169, 20,132, 16,133, 94,175, 87,196,196,196, 40,122,247,238,173,168,246,214, 95, 95, 61,223,193, 74, 49,110, 63, - 90, 61,131,172, 20,227,246,123,155, 38,237,223,191,255,124, 90, 90,218, 89, 51, 51,179,101, 13,228,116,177,181,181, 13,178,178, -178,186,104, 99, 99,179,210,202,202, 42,183,188,188,156,148,148,148,144,151, 47, 95,146,235,215,175,147,123,247,238, 17, 43, 43, -171,236,218,234,217,207,132,117,191,100,211,124, 98,220,191,142,104,119,172, 32, 0,136,116,219,114, 82,248, 99, 40,121, 52,107, - 16,233,205,103,222,253,128,243, 9, 11, 11,139,159, 79,157, 58,101, 76, 73, 73, 33, 81, 81, 81,228,220,185,115,100,225,194,133, -164,185,163,131,166, 11,151,145,223,147,199,186,248, 33, 1, 75, 53, 26, 77,172, 76, 38,139, 85, 40, 20,177, 45, 90,180,136,237, -212,169, 83, 68,151, 46, 93,182,158, 56,113, 98,209,250,245,235, 71,244, 51,229,189, 44,139, 62, 65,200,151, 67, 8,153,223,131, -188,154,217,155,244, 53, 97, 61,169,149,211,222, 62,187, 50, 90,187, 82,169, 36, 55,111,222, 36, 87,175, 94, 37, 98, 27, 27,153, -191, 9,115,118,119, 30,122,117, 55,131, 69, 67,235,217,199,156,113,224,254,143,223, 26, 84,231, 15,145,223,166, 14,209,247,182, - 96,236,170, 86,238, 24, 33, 36,119,204,152, 49,175, 9, 33,185, 39, 79,158,204, 34,132,228,142, 30, 61,250, 53, 33, 36, 23,192, -209,154, 56,223, 11, 78,186,255,173,200,154, 31, 18, 18, 18, 75, 8,137, 13, 9, 9,137, 5, 42,130,168,246, 50,103, 28,124,176, -103,179, 81,115,238, 32, 57, 49,125,168,161,151, 57,227, 96,141,245,180, 96,157,141,219,191,141,104, 47, 30, 38,167, 22, 78, 52, -244, 16,155,221,240,242,242,218,188,104,209,162,136,123,247,238, 61, 53, 24, 12, 9,169,169,169, 9, 59,119,238, 76,232,218,181, -235,109,107,107,235,120, 46,151, 59,175,190,107,244, 31, 2,205, 73,115,210,156, 52, 39,141,247, 13, 76,117,108, 59,187,113,227, - 70, 33, 33,100, 73, 96, 96, 32, 54,108,216, 48,182, 85,171, 86,227,157,156,156,108, 1, 32, 39, 39,167,236,217,179,103,178,192, -192, 64, 4, 5, 5, 97,211,166, 77, 91, 81,225,203,242,127,137,188,211,167, 79, 59, 47, 88,176, 64,178,126,253,122,227,244,233, -211,125, 0, 60, 43, 44, 44,108, 62,113,226,196,249, 44, 22, 43,208,205,205,205, 55, 55, 55,183, 64,165, 82, 29, 6,176, 7,245, -204,153,214, 6, 30, 3,134, 14, 77, 28,112,145, 1, 67,181,159,135, 4, 5, 5,141, 27, 61,122,116,249,182,109,219,244, 50,153, - 44,178,129,116, 89, 5, 5, 5,107, 42,255,177,178,178, 18, 63,121,242,100,158,157,157, 29, 35, 53, 53, 21, 26,141, 6, 41, 41, - 41, 70, 84, 76, 77,213, 8,133,158,108,255,233,228,101,239, 37,147, 2,204,202, 18, 31,131,195,100, 66,199,230, 34,239,254, 69, -236,191,153, 40, 83,150, 99,199,135,180, 83, 42,149,126,183,112,225,194,137,203,150, 45,227,187,185,185, 81,119,239,222,197,241, -227,199, 53, 18,137,100, 48,128, 27,127,132,126,106, 28,140, 70, 35,184, 92, 46, 0, 96,249,242,229, 96, 48, 24,108,137, 68,194, -165, 40,138, 71, 81,148,128,162, 40,166, 46, 45, 1, 70, 89, 9,242, 75,164,200,202,151,214,201,103, 48, 26,143, 63,120,240, 96, -113,187,118,237, 24,143, 30, 61, 66, 65, 65, 1, 82, 82, 82,136,129,144,163, 55, 85,134, 10,167, 68, 77,195,235, 39,176,178, 30, -217,214,146,199,224, 30, 8,130,191,150,193,220,109,196, 24, 84,196,210, 2,128,253, 20, 69,113, 0, 20,181,104,209,162,207,139, - 23, 47, 76, 90,180,104,161, 74, 76, 76, 60, 79, 81,148, 19,128,131, 53,113,154,152,152, 20, 2, 40, 60,121,242, 36, 0,204, 66, -197,201,107, 31, 28, 28,156,123,243,230, 77,132,132,132,228, 3,216, 5, 0, 34, 75,235,225,190,230, 28,138,251,107, 8,186,106, -192,216, 97, 36, 53, 90, 93, 69,118,246,125, 91, 9, 25, 96,239,251, 26, 29,197,222, 12,174,190,188,117,104,104,232, 77,133, 66, -161, 57,118,236,152,118,218,180,105,204,228,228,228,135, 0,110, 1, 56,137,183, 62,150, 52,104,208,160, 65,227,191,138,247, 45, - 88,245,250,104,189,175, 90, 55, 0,248, 41, 41, 41,169, 42,169,116, 82, 82, 82, 44,128,221,168,136, 6, 63,172, 17,138,119,245, - 91,139,214,158, 15,108,204,251,156,124, 63, 63, 63,147, 23, 47, 94,112, 80,115, 18, 71,234, 3, 56,255,132,154,114, 29,122,121, -121,125,175,211,233, 34,118,239,222,125,130,201,100, 78,252, 11,106,223,205,211,211,179,228,200,145, 35,198,168,168, 40,178,122, -245,106,131,131,131, 67, 9,254,236,163,245, 14,167, 63,151, 25,190,212,199, 73, 22, 51,185, 7,121,181,104, 56,185, 53,169, 55, -153,237, 36,146,249,243,153,199,255,226, 91,137,167,185,185,249,126, 19, 19, 19,153,153,153,217,101, 0,221,254,202, 53,178,182, -182, 62, 36, 22,139, 47, 87,255,216,219,219, 71,216,218,218,254, 96, 99, 99,179,218,194,194, 98,142, 59,159,187,109, 81,115, 71, -117,252,200, 22, 36,186,187, 45,153,100,195,125,127,234,240,253,122, 58,184,187,187, 23,133,133,133, 25,207,158, 61, 75, 86,172, - 88, 97,108,210,164,137, 12,117,248,181,213,105,209,178, 96, 30, 15, 31,221,197,152, 63,212,137,108,240, 49, 53,246,177,100,214, -182, 66,113,210, 91, 1, 60,181, 62, 78, 15, 15,143,221,132,144, 3,107,215,174, 61,128, 63,114,129, 14, 8, 13, 13, 13, 38,132, - 4,135,134,134, 6, 3, 24, 4, 0,254,230,140,176,195, 35, 58, 24,114, 62,114, 36,223,250,136, 12,254,230,140,176, 26, 45,153, - 86,172,211,103,102, 14, 53,230,206,236, 78,130, 60,133,134, 46, 86,188, 43, 92, 46,119, 17, 42, 44,206,157, 0,112,233,183,102, -154,147,230,164, 57,105,139,214,255,156,240,106, 16,196, 86, 86, 86,251,155, 53,107,118,194,205,205,237,132, 72, 36,218,138, 10, -167,249,198, 94, 8,247,117,235,214,201,204,205,205,219,254, 7, 47,174, 29, 0, 39,252, 57,113,238,127,172,195,172,113,192,130, -228,101, 99,159,172,113,192,130,106, 63,119,242,241,241,249, 22, 21,209,188,255,106, 39,116,179,178,178,218,105,101,101,149,253, -214, 55,203,173, 33,156, 29,152,204,137,125,248,204,187,221,184,140,188, 62,124,214,157,142, 76,230,132,191,233, 0,172,107,177, - 69,109,156,206, 54, 54, 54,219,172,172,172,114,108,108,108,118, 54, 82,100,189,195,217,214, 4, 14,125, 45,152,167,187,153, 82, -202,190,230,204,147, 29, 4,181, 47,234,104, 68,219,253, 66, 66, 66, 62, 33,132,124,226,232,232, 24, 88, 77,248,251, 6, 5, 5, - 5, 16, 66, 2, 42, 35,192,119, 18,192,174,183, 5,243, 72,119, 51, 74,218,219,130,121,164,147, 0,118,181,213,179,143, 5,243, -120,119, 51, 74,234,111,198, 56,226,202, 67, 19,250,102, 78,115,210,156, 52, 39, 45,180,254, 25, 66,139,238, 48, 52, 39,205, 73, -115,210,156, 52, 39,205, 73,115,210, 66,171,102, 97, 85,253, 83, 53,195,198,162,207, 13, 13, 26, 52,104,208,160, 65,131,198, 95, - 66,173, 1, 75,169, 58, 84,105, 99, 28,219, 63, 68,217, 70,211,156, 52, 39,205, 73,115,210,156, 52, 39,205,249,175,227,172,143, -251,255,122, 97,221,223, 26,180, 89,149,230,164, 57,105, 78,154,147,230,164, 57,105,206,127, 45, 24,244, 41,160, 65,131, 6, 13, - 26, 52,104,208,248, 75,240,123,251,253,126,224,210,154,125,180, 88,157,214,230,235,245,122, 59, 0, 96,177, 88, 18,221,195,213, - 14,117,177,179,129,126,250,138,244, 59, 96, 1,179,244,192,229, 26, 56, 47,235,245,122,203,183,156, 37,186,135,171, 7,213,201, -217,105,237,197,234,229,245, 15, 87, 15,120,191, 12, 1,152,236, 78,107,115,222,171,171, 99, 67,207, 10,133,119, 98, 98,253,215, -234,249,119,225,252, 55,131,221,121,109,190, 78, 87,209,143,216,108,150,164,252, 65,221,253,136,211,121,109, 78,245,242,186, 7, -171,237,235,226, 20,152,240,138, 60,156,108,183,214,197,153,154, 83,184, 68, 89,166,182,174,139,179,177, 99,211,197,193,161,159, -225,237,216,100, 2,179,178,115,115, 47,255,143,245,165, 14, 0, 86, 3, 48,171,246, 91, 60,128,207,233, 94, 73,131, 6,141,191, -153,208,138, 67, 69,158,195,159,223,138,173,159,107, 21, 90,122,189,222, 46,246, 84, 48,148, 26,160,223,148,181,118,238, 35,247, -252, 41, 81,178, 94, 93,194,149, 62, 63,230,203,212,201, 44,109, 89,229,102, 57, 57, 57, 20, 0, 80, 20,245, 11, 0,215, 26, 56, - 45, 99, 79, 5,163, 76, 11,248,143, 15,181,116, 5,204, 10, 56,156, 47, 76,132,194, 62, 42,149,170, 21, 0,152,152,152, 60, 87, - 41,149,215,108,203,203,183,188, 95,190,182,150, 85,175,107,223,201,107,237,124, 70,238, 89,104, 48, 26,185,111, 30,237,246, 87, - 23, 38,179,216,122,205,174,149,192,249,224, 26, 68, 85, 45,124,127, 28,247,227, 21,214,108,160, 47,151,207,111,107, 97,105,217, -211, 72, 72, 11,163,209, 72, 25,244,250, 4, 89,105,233, 45,163, 94,255, 68,175, 85, 90,199, 70,126,107,172,171,158,239,183,229, - 99,128,117, 10, 8, 20,138, 68,125,152,108,118, 55, 0, 48,232,116,119,149, 10,197,181, 81, 64,120, 67,218,222,208,243,243,161, -229,255,109,208,233,244,118,105, 23,131,161,209, 1,126, 99,190,181,107, 51,241,215, 35, 0,160,149, 60,177, 87, 36, 71,118, 6, - 0,161, 71,192, 3,158,216, 47, 31, 0, 88, 25,185,118, 47,163, 86, 65,163, 3, 90, 4,132,218,213,199, 57, 45,232,184,245,178, -217,163,121, 0,112,233,228, 15,205,175, 70,252, 52, 4, 0,250,142,158,123,126,224,152, 5, 47, 1, 96,211,207, 17,214, 71,191, - 29, 91, 39,103,195,198,102, 41,167, 52, 57,202, 83, 43,203,181,112, 17,178,196,201,201,201, 12, 0,112,116,116,108,208,216,116, - 6,204,115,129,249, 12, 38,179,167,135,167,167, 31, 0,146,250,234, 85,156, 65,175,191,237, 0,236,250, 15,247,165,133,132,188, - 27,156,149,162, 40,186, 67,210,160, 65,227,239,134,115,111,197,213,185, 63,189,204,214,182,135, 82, 3,220, 72, 1,122,117,105, -131,217, 19, 63, 18, 85,223, 22,190, 39,212, 53,249,209, 25,159,125,191,110, 97,180,105,211, 6,105,105,105, 13,170, 69,153, 22, -184,158, 12, 64,250,194,180, 68, 40,124,181,109,243,102,179, 1, 3, 6,176, 28, 29, 29, 65, 81, 20,242,242,242,186, 68, 71, 71, -119, 88,188,120,241,167,144,190, 40, 41,211, 66,126, 61,185,126,222,202,186,182,106,222, 4,171, 23,140, 53, 7,128,149, 83,118, -117,120,148,148,111,245,234,213,171,126, 95,125,245, 85, 17,243,218,181,159,108,128, 3,249, 64, 86, 67,234,121,232,236, 3,190, -121,238,111,238,147, 22, 44, 56,233,233,233, 41,114,115,115,163, 76, 77, 77,193,100, 50, 81, 82, 82,226,250,236,217,179, 33, 15, - 31, 62, 84, 70,223,248,133, 27,243,112,120,170,132,223, 89,221,160,182,171,114,248,151, 76, 77,159, 79, 30, 53,202,121,236,216, -177,124, 15, 15, 15, 0,192,171, 87,175,188,194,195,195,199,159, 60,121, 50, 8,170, 28,125,153, 22,234,250,218, 94,197, 9,128, - 15,116,179,176,179,155,196,100,179, 91,233,245,122,167,183,214,134, 55, 6,157,238,185, 84, 34, 57,252,126,121, 26,127,134, 70, - 7,188,200, 5,250,247,244,195,228,209,253,133, 0,240,213,184,117, 93, 50, 94,167,112,180, 90, 45,154,123,183,232,254,205,183, - 91, 47,130,193, 64, 88, 68,116, 85,249,134,112,198,191, 72, 67,240, 55,219,144,243, 52,188,139,161, 52,165,143, 92, 86,202, 4, - 0, 51,115,243,209,225,199,126,187,230,232, 27,120, 63,165,176,188, 65,156,117,141,205, 11,199,118, 58,100, 63,187,214,242,199, - 75,251,217,174,174,174,120,250,244,105,227,198,102,105,146,169,209,193, 33, 97,203,151, 95,138,253,253,253, 33, 18,137,192, 98, -177,160,215,235,251,223,190,125,187,127,112,112,240, 92,148, 38, 41, 27, 58, 54, 27,128, 45, 20, 69,245,153, 54,123,161,195, 71, - 35, 2, 49,122,112,119,186, 35,210,160, 65,227,239,134, 74,235, 85,245,149,135, 63,215, 41,180, 88, 44,150,100,192,212,245,118, - 61, 59,183,198,163, 39, 47, 75,211, 51,115, 21,149,219,138,159,135, 55, 31,209,221,169,229,205,155, 55,160,209,104,112,247,238, - 93, 60,121,242, 4,175, 95,191,198,156, 57,115, 52,111,167, 14,107,226, 44,241, 31, 31,106,137,210,100,145, 23, 55,169,105,116, - 98, 34, 83,173, 86,227,230,205,155, 40, 41, 41, 1,151,203,133,179,179, 51, 6, 14, 28,200, 74, 76, 76,180,234, 55, 96,176,185, -255,224, 9,105, 48,247, 82,176, 88,172,146,218,242,136,176, 88, 44, 73,191, 41,107,237, 90,122, 53,193,171,244,156,210,213,223, -238, 83, 24,141,132,149,250, 58,163,252,198,141, 27,240,243,243,195,229,203,151,173,139,139,139,191,222,181,107,215,106,246,198, - 31,183,235,180, 69, 75, 81, 59, 95,137,255,248, 80, 75,107,201, 9,183,171, 23, 78,115,158, 63,127,206,217,189,123, 55,138,138, -138,192,229,114, 97, 97, 97, 1,177, 88,140,230,205,155, 83, 43, 87,174, 20, 5, 4, 60,199,103,179, 2,221,202,221,103, 38,213, - 86,207,170,182, 43, 50, 4, 54,178, 75, 30, 17,231,206, 49,122,244,232,241,206,107,123,179,102,205, 48,104,208, 32,254,164, 73, -147, 60,198,142,159,104,244, 31, 58,237, 21, 68,110,101,245,114, 42,179, 76,172,203,238, 57,246, 31, 63, 62, 50, 52, 52,212, 66, - 44, 22, 67, 40, 20, 2, 0, 74, 75, 75,157,211,211,211,187, 4, 5, 5,141,121, 16,127,140,229, 31,144,149, 3,161,139,170,174, -243,249,111, 5,155,205,146, 84, 90,145, 76,133, 38, 37, 89,217,249, 74, 0,208,106,181,208,106,181,208,104, 52,152, 55,119, 14, -115,214,152, 78,158,110, 61, 23, 62,126,253, 38,191,184, 69,244,125,171,202,125,117,245,112,178,202, 94, 75,165,153, 87,102, 5, -127,249,165,216,222,254,143, 25,193,176, 67,135,152,197,197,197,253,131,131,131, 91, 18, 65,111,105,139,128, 80,139,186, 56,235, - 26,155,210,151,231,154,126,179, 96, 80,219, 61,223, 70,193, 96, 48,224,222,189,123,184,121,243, 38,182,110,221, 74,206,159, 63, - 95,106, 38, 20,206, 66,157, 99, 51,201,180,135, 67,158,251,198,141, 39, 41, 30,143,135, 51,103,206, 32, 49, 49, 17, 12, 6, 3, -109,218,180,193,228,201,147,209,191,127,127,241,236,217,115,136,255,224,113,169, 48,247,150,255,197,190,196, 0,176,112, 69,240, - 70,135, 41, 51,231, 99,211, 55, 43,105,161, 69,131, 6,141,191,179, 53,171,214, 16, 15,136,138,138, 34,111, 63,189, 0,128, 0, -140,102, 35,247, 28, 61, 17, 99, 60,215,108,228,158,163, 4, 96, 16,128, 97, 6, 52,105,215,174,157, 78, 42,149,146,135, 15, 31, -146,121,243,230, 41,183,111,223,126,237,220,185,115,225,250,242,242,189,142, 14, 14,223,145, 90, 28,236, 9,192,112, 3,204, 5, - 2, 65, 65,102,102, 38,249,253,247,223, 73, 72, 72, 8, 57,124,248, 48, 57,127,254, 60,137,142,142, 38,231,207,159, 39, 71,143, - 30, 37,241,241,241,228,229,203,151, 68, 40, 20, 22,184, 1,230,117,112, 50, 9,192,108, 62,114,247,210,147,143,116,161,222, 35, -247, 44, 38, 0,211, 18,240,105,215,174,157, 33, 60, 60,156,132,133,133,145, 95,127,253,149,196,199,199,147,194,194, 66,194,226, - 9, 11, 42,247,171,173,158, 4, 96, 56, 57, 57, 21, 72,165, 82,226,226,226, 66,184, 92, 46,177,183,183, 39,205,155, 55, 39, 93, -186,116, 33, 67,134, 12, 33, 19, 39, 78, 36, 95,127,253, 53,145, 74,165,132,207,231,231, 87,238, 87, 27,167, 31, 96, 34, 20, 10, - 51, 99, 99, 99, 73,109, 80,169, 84,164,176,176,144, 92,188,120,145, 8,133,194, 76, 63,192,164, 46, 78, 19,160,189,175,175,111, - 65, 97, 97, 33, 41, 47, 47, 39,153,153,153,228,217,179,103, 36, 49, 49,145,100,102,102, 18,149, 74, 85,197,253,242,229, 75,226, -238,238, 94, 96, 2,180, 39,244, 34,136, 90,251,210,251, 31, 87,123,251, 33, 98,177, 88,117,242,228, 73,242,230,205, 27,114,240, -224, 65,194, 0,214,189, 95,174, 46, 78, 46, 48,176, 71,143, 30,134,123,247,238,145,199,143, 31,147,229,203,151,147, 65,131, 6, -145,193,131, 7,147,224,224, 96,146,157,157, 77,178,179,179,201,144, 33, 67, 12, 92, 96, 96,125,253,179,166,177,105, 14,184, 6, - 4, 4,168,202,203,203, 73,106,106, 42,105,213,170, 85, 54, 19,152, 36, 4, 90,246, 2,120,245,245, 79, 39,192,210,193,193, 33, -247,222,189,123, 36, 34, 34,130,184,185,185, 21, 48,129,105,102, 64, 51, 51,160, 25, 19,152,214,172, 89,179,130,123,247,238,145, -162,162, 34,226,234,234,154,235, 4, 88,254,133,190,196, 0,176,127, 69,240, 70,146,148,173, 36, 43,130, 55, 18, 0,153,132, 16, -130, 26,124, 60,105,208,160,241,207,199,251, 90,228,159,130,170,155,100, 64, 64, 0, 5,224,122, 93,133, 85, 76,230,250, 77,155, - 54,177,212,106, 53,246,237,219, 39,255,120,204,152, 19,189,122,246, 76,109,234,230, 38,165, 24,140,122,179, 13, 23,240,120,139, - 54,109,218,100,161,213,106, 17, 19, 19,131, 14, 29, 58, 64, 44, 22, 67, 36, 18, 65, 36, 18,193,206,206, 14,222,222,222,144, 72, - 36, 48, 53, 53,197,178,101,203,204, 11,120,188, 69,245,241, 26,141,132, 5, 0, 6,163,145,203, 1,102,187,119,236, 24, 19, 20, - 20,196,176,182,182,134,149,149, 21, 68, 34, 17, 18, 19, 19,161,213,106, 33, 48, 17, 52, 40, 72, 43,131,193, 96,136, 68, 34, 92, -189,122, 21, 11, 23, 46, 68,183,110,221, 96, 97, 97, 1, 83, 83, 83,180,106,213, 10, 3, 7, 14,196,172, 89,179,144,154,154, 10, -170, 1, 78, 37, 9, 44,214,252, 89,179,102,217,249,249,249,213,184, 93,173, 86, 67, 42,149,162,160,160, 0,206,206,206, 8, 12, - 12,180, 75, 96,177,230,215,198,103, 13,136,157,189,188, 34, 31, 62,124,104, 35, 20, 10, 17, 22, 22,134,211,167, 79,227,194,133, - 11,248,253,247,223, 17, 21, 21,133, 51,103,206,160,160,160, 0, 0,224,229,229,133,227,199,143,219,136,236,236,162,172, 1, 49, - 61,164, 27,134,140,252,252, 75,173,242,242,108, 38, 77,156,120, 75,161, 80, 96,210,164, 73, 88,191, 97,195, 74, 54,176,184, 33, -251,123, 3,230, 86, 14, 14, 7, 54,110,220,200,200,203,203,195,168, 81,163, 10,183,108,216, 48, 35,238,226, 69,143,216, 11, 23, - 60,214,135,134,206,232,213,171, 87, 97,118,118, 54, 14, 29, 58,196,176,119,117, 61,224, 13,152, 55,182,158,114, 96,225,247,223, -127,207, 87,171,213, 24, 48, 96, 64,170,241,249,115,111, 61,240,155, 2, 72,188, 14,148,215,183,127, 46, 48,127,217,178,101, 98, - 30,143,135, 47,190,248,162,176, 44, 35,163,181, 30,248,181, 20, 72, 47, 5,210,245,192,175,242,180,180,214, 83,166, 76, 41,228, -241,120,216,182,109,155, 56,247,143,164,219, 13, 69, 7, 0,145, 0,110, 0,200,153, 54,123,225, 52,191, 78, 93,113,104,239, 46, -124, 27,250,213, 1, 0, 31, 83, 20,117, 24,192, 82,186,231,209,160,241,239, 68, 67,180,200,255, 40,106, 77,185,195,170,174, 36, - 1,244,174,139,197,210,218,186, 67,235,214,173,113,243,230, 77,248,250,250, 62,180,176,176,208,115,120, 60,176,217,108, 16, 99, -189, 58, 11, 38, 66, 97,191,254,253,251,179,238,223,191, 15,119,119,119,152,152,152,128,205,102,191,243,225,112, 56,112,112,112, -128, 76, 38, 67,191,126,253,216, 59,118,236,232, 7,141,230,155,122, 31,136,201,207, 68, 5,247, 55, 78,252,229,224,129,102,254, -254,254, 40, 45,149,193,104, 52, 66, 32, 16, 64,171,213,130,197, 98, 85, 76, 1,233,136,172, 33,103,204, 96, 48, 24,152, 76, 38, -220,221,221,177,126,253,122,168,213,106,112, 56, 28, 0,128, 76, 38,131, 84, 42,197,179,103,207,144,158,158,142,183,111,225,117, -194,212,220,252,163,177, 99,199,214,152,240, 87,163,209,160,180,180, 20,165,165,165,144, 74,165, 80,171,213,232,218,181, 43,247, - 92, 84,212, 71, 40, 42,218, 82,227, 62,124,254,152, 67,135, 14,217,113,185, 92,168, 84, 42,200,229,114,100,101,101, 33, 35, 35, - 67, 45,145, 72,244,166,166,166, 12, 55, 55, 55, 6,143,199,227,141, 28, 57,146,146,201,100,160, 40, 10, 1, 1, 1,214, 71,194, -194,198, 66,171,221, 74, 15,233,134,225, 18,160,105,175,213, 14,235,220,169,211,213,135,143, 30,249, 45, 90,180, 8,241,241,241, - 27, 5,199,142,221, 40, 3,158,212,181,111, 42, 48,255,187,106, 2,134,100,100,248,150, 3, 5,213,138,164,187,165,165, 93,152, - 50,101,202,211,248,248,120,155,109,219,182,137, 63, 30, 53,106, 62,128,117,141,169,163,169,185,121, 71, 7, 7, 7,156, 63,127, - 30,153,175, 95,127,165, 7, 84,141,122,227, 98, 50,123,248,251,251,227,204,153, 51,200,206,200,248, 74,255,110, 29, 43, 94,148, -128, 2, 86,106,234, 87, 7, 14, 28,216, 63,125,250,116, 48, 89,172, 30,208, 55,106,226,240, 79,142,239,211,231, 44,194,129,159, -119, 28, 0, 48, 19,128, 17,192, 67,186,199,209,160,241,239,182,106,213,167, 69,254, 70, 98,235,231, 70, 91,180,236,236,236,156, - 68, 34, 17,114,114,114,208,194,199, 71,194,227,241,192,101,179,193,231,114, 27, 84,131,178,178, 50, 95, 71, 71, 71,148,150,150, -194,198,198, 6, 28, 14,167,234,195,229,114,171,254, 54, 53, 53, 5,131,193,128,171,171, 43,202,202,202,124,235,229,205,127,102, -119,108,199,220,121,247,110,156,111, 54,106,212,104, 88, 90, 90,193,197,197, 25,118,118,118, 48, 49, 49,129,139,139, 11, 60, 60, - 60,200,150, 45, 91, 32,176,107,211,160, 27,121,117,241,196, 98,177, 96, 48, 24,144,159,159,143,164,164, 36,196,199,199,227,222, -189,123,120,252,248, 49,228,114, 57, 26,160,179, 80,166, 82,181,101,177, 88, 53,138, 44,169, 84, 10,169, 84, 90, 37,180, 10, 10, - 10,144,158,158, 14,133, 82,217,174, 14,209, 59,186,117,235,214, 76, 0, 48, 49, 49, 65,187,118,237,176,103,207, 30,253,217,211, -167,199,181,188,119,207,202,229,226, 69,139, 95,118,239, 30, 23, 24, 24,104,184,127,255, 62,100, 50, 25, 94,188,120, 1, 91, 91, - 91, 22,151,207, 31, 75, 15,231,198, 33, 22, 80,218,200,229,131,187,117,235,150, 86, 90, 90,138,205,155, 55, 51,216,166,166, 63, -135,214, 50,197, 87, 5, 38,179,187,191,191, 63, 34, 35, 35,145,147,145,177, 60,163, 6, 1,147, 1, 20,100,166,166, 46, 63,112, -224, 0, 6, 14, 28, 8,138,197,106,180,163, 82,151, 46, 93, 90, 27,141, 70, 60,125,250, 20, 22,192,131,198,238,239,225,233,233, - 87,105,249, 21, 2,183,106, 43, 39, 4,110,197,197,197,193,196,196, 4, 45, 90,182,108,223,200,195,108,161, 40, 42,119,250,156, - 69,136,184,112, 7, 0,112,224,231, 29,249,213, 68, 22, 13, 26, 52,104,139,214,223,213,162, 85, 41,172,170,127,240,142,208,106, -160,248, 0, 0,176,217,108,112,121, 60,112,185,220, 10,129,196,227, 53,152,131,162, 40,240,249,252, 42, 97, 85, 93, 96, 85,255, - 91, 32, 16, 52, 72,192, 0, 64, 73,202,133,158, 51,103, 76,231,242,120, 60,104,181, 26, 16, 66,192,227,241, 97, 97, 97, 1,119, -119,119,200,100, 50,116,235,222, 75,147, 37,229, 68, 89,183, 24, 25,255, 33,103, 79,175,215, 67,169, 84,162,164,164, 4,197,197, -197,144,201,100, 80,169, 84, 13, 94,138,110, 52, 26,153, 89, 89, 89,248,237,183,223, 80, 84, 84, 4,160,194,209,186, 82, 92, 85, -126,167,165,165, 33, 44, 44, 12,175, 95,191,110,212,245,233,217,179, 39,162,162,162,152,189,251,245,219,123,217,205, 45,231,178, -155, 91, 78,239,126,253,246, 70, 70, 70, 50,157,156,156,144,158,158,142,152,152, 24,148,148,148,128, 16, 66,175,159,255, 0,188, - 2, 74,202,138,139,167,175, 92,185,146,136, 68, 34,108,254,238,187,182,235,128, 9, 13, 21, 48,230,117, 8, 24,243,191, 38, 96, - 64, 8,129,209,104,132,193, 96,248,160,182, 81, 20, 69,177,217,236,198,134, 86,104, 76,225, 42,199,247,101, 95,175,199,239,103, -194, 43,127, 79,166, 69, 22, 13, 26, 52,254, 1,168,213, 17,158, 85, 77, 65, 86,125,215,134,252,252,252, 55, 74,165,178,153,155, -155, 27,178,179,179,237, 92, 93, 93, 51,184,108, 54, 56, 92, 46, 40, 70,253,154, 64, 32, 16, 60,205,201,201,233,238,228,228, 4, -189, 94, 95, 37,170,222,159, 58,172,180,210, 60,126,252, 24, 2,129,224, 41,212,117, 70, 78,128, 65, 91,210,164,125,251,246, 85, -150, 33, 11, 11, 11, 88, 88,152,131,199,227, 99,213,170, 85,198,109, 91,182,236,114,237, 27, 90,250,201,226,149,100,229,186,189, -255,209, 51,219,208, 7,147, 64, 32,120,234,226,226,210,213,220,220, 28, 17, 17, 17, 72, 79, 79, 71, 73, 73, 9,202,202,202,160, -209,104, 80, 86, 86, 6,173, 86, 11, 62,159,143,150, 45, 91,194,204,204, 12,209,209,209, 79,161,209,212, 44, 46,139,138, 34,158, - 62,125,218,181, 83,167, 78, 85, 22,149, 62,125,250, 80,125,250,244,177,169,178,162,149,149,161,176,176, 16, 15, 31, 62, 68,116, -116, 52, 40,148, 28,221,209, 0, 0, 32, 0, 73, 68, 65, 84,138, 66,114,114,178, 65,163, 82, 29,165,199,196,135, 65, 13,220,101, - 30, 56,176,255,211, 79, 63,157,209,189,123,119, 24,128, 33, 0,194,254, 63, 10, 24, 0,192,189,123,247,158, 25, 12,134,238,205, -155, 55,135, 20,232, 12,224, 76,163, 68,100, 74, 74,156, 94,175,239,215,182,109, 91, 68,156, 56,209, 19, 64,122, 77,229,148, 64, - 79, 63, 63, 63,168, 84, 42,188, 72, 72,136,109,132,200,218,187, 34,120,227,180, 41, 51,231,227,208,222, 93, 56,240,243,142,172, -253,123,182,187,160, 1,254, 99, 52,104,208,248, 87, 89,179,234,213, 34,255,163,152, 93,155,248, 98, 53,134,165,180,164, 36, 54, - 46, 46,174, 89,251,246,237,177,119,239,222, 78,221,186,118,125,195,225,114,245, 92, 14, 7,140, 6, 60, 72, 84, 74,229,149, 43, - 87,174,116, 30, 57,114, 36,235,254,253,251, 16,139,197, 85, 66,171,242,155,197, 98,129, 16, 2,129, 64,128, 83,167, 78,149,171, -148,202, 43,245, 90,139, 12, 70, 3,227,173,208, 35,132, 64, 42,149,130,195,225, 96,235,214,109,216,185,101,203, 68, 3, 16,238, - 37,180,253, 18, 0,255,255,219, 3,186,172,236,234,239,191,255,222, 33, 40, 40,136,237,236,236, 12,169, 84,138,146,146, 18, 20, - 21, 21, 65, 38,147, 65, 38,147,161,164,164, 4, 82,169, 20,124, 62, 31,241,241,241, 58,117, 89,217,213,218,248,120,106,245,201, -169, 83,167, 46,139,139,139,115, 96,177, 88,208,233,116, 48, 26,141, 48, 26,141, 40, 47, 47, 71, 74, 74, 10,158, 63,127,142,196, -196, 68, 20, 23, 23,131,205,102,131,201,100,226,241,227,199, 37, 66,157,238,132,150, 30,211, 31, 12, 54, 16,113,251,246,237, 25, -147, 39, 79,134,163,179,115, 47,100,103, 55, 72,192,156,174, 67,192,148,126,152,128,249, 67, 0,201,229,143,210,210,210,186,247, -238,221, 27, 14,206,206, 27, 91,102,103, 95, 78,104,132,159,150, 65,175,191,117,251,246,237,126, 83,166, 76,193,222,189,123, 55, -218,166,165, 93, 40,120,111,154,211, 22,176,109,234,225,177,113,218,180,105,184,116,233, 18, 12,122,253,173, 58, 40,171, 71,124, -111, 50,109,246, 66,151,247, 28,223,247, 80, 20,181, 0,192,102,186, 71,209,160, 65,227,159,108,209,106,212,212,161,137,193,176, - 98,233,210,165, 58, 6,131,129,209,163, 71,155,158,137,140, 12,124,252,228,137,187, 68, 34,177, 48, 24, 12,245,114,217,106, 52, -219,151, 46, 93, 42,213,106,181,240,246,246, 70,113,113, 49, 12, 6, 3, 88, 44, 22, 88, 44, 22, 40,138, 2,131,193,128, 72, 36, - 66, 92, 92, 28,246,239,223, 47,179,213,104,182,215,251,144, 48, 24,158,134,133,133,129,201,100, 18, 62,159, 15,138,162,192, 98, -177,176,109,219, 54,201, 78, 32, 2, 0,152, 12,134, 22, 0, 24, 12,170,161,222,187,245,206, 91,114,185, 92, 24, 43, 22, 1,212, - 91,214, 82,163,249,126,211,166, 77,242, 23, 47, 94, 64,169, 84, 86, 89,223, 20, 10, 69,149,115,189, 84, 42, 5, 69, 81, 80, 42, -149,136,140,140,148, 91,106, 52,223,215,198, 87, 4,228,101, 39, 39, 15,239,212,169, 83, 81, 90, 90, 26, 74, 75, 75,241,244,233, - 83, 68, 71, 71,227,248,241,227,184,116,233, 18, 82, 82, 82,160,215,235,225,228,228, 4, 66, 8, 78,159, 62, 93,170,151,203,135, - 20, 1,121,244,152,168, 29, 77,196,226,126,246,118,118,153,182, 54, 54,217, 77,196,226,126,239,111, 55, 7, 94,190,124,249, 18, -122,189, 30,238,238,238, 86,117,249,105, 17,189,254,246,237,219,183, 49,101,202, 20,184, 52,107,182,193, 13,176,125,191,140, 27, - 96,235,230,225,177,161, 82,192, 16,189,254,118, 99,235,108, 10,236,248,242,203, 47, 85, 28, 14, 7,199,142, 29,115,215,121,122, - 38,178,128, 9, 34,192,167, 55,192,169,111,127, 7, 96,215,215, 95,127,157, 71, 81, 20, 14, 31, 62,108, 99,238,225,241,140, 5, - 76, 53, 7,154,152, 3, 77, 88,192, 84,115, 15,143,103,199,142, 29,179,209,235,245, 88,188,120,113,158, 3,176,171, 14,202,133, -132,144, 97,132, 16,127, 66,136,203,254, 61,219,241,251,153,240, 74,145, 53, 19, 21, 78,239,147, 1, 60,163,123, 28, 13, 26, 52, -254,201,168,209, 12,197,234,180, 54, 31, 32,118,189,186,180,193,163, 39, 73,165, 54,150,102, 23, 43,183, 21, 63, 15,111,222,215, -215,172,205,143, 63,254, 8, 54,155,141,172,172, 44, 36, 36, 36,192,204,204, 12, 19, 39, 78,212,168,228,242,225,213,114, 29,246, - 7, 16,253,150,179, 34,159, 90,105,178,200,131, 21,223,236,194,239, 81, 76,115,115,115, 40, 20, 10, 48, 24, 12,240,249,124, 8, - 4, 2,152,152,152, 32, 38, 38, 6, 67,135,141, 48, 20, 8,252,255, 8, 88,250, 71, 62,181, 42,206,202, 88, 67,157, 1, 65, 28, -240,133,157,163,227,210,213,171, 87,155, 12, 26, 52, 8, 28, 14, 7,206, 77,188,242,220, 7,111,222,193, 96, 80,250,236, 34,217, - 42,143, 38,142,230, 9,201,233, 0, 40,137,238,225,106,199,106,185, 14,255, 84, 79, 87,237, 13,247, 83,191,110, 49,107,215,174, -194, 31, 93, 42,149, 34, 63, 63, 31, 18,137, 4, 82,169, 20, 74,165, 18, 0, 16, 21, 21,133,223,111, 38,202, 84,206,129,169,181, -213,243,143,182, 39,153, 58,150, 63,104,122, 36,236, 87,166,173,173, 45,242,243,243, 81, 80, 80, 0,169, 84, 10,149, 74, 5,131, -193,128,226,226, 98,236, 59,240,171,161, 72,228,255,186, 42, 32,100, 93,156,202, 44, 19, 43,197, 29, 39,191,150,110,100,198,140, - 25,166,102,102,102, 48, 26,141, 40, 41, 41, 65,102,102, 38,210,210,210,112,243,230, 77,165, 68,170,133,210,102, 64,118, 85,192, -210, 26, 56,255,131,248,219,113, 86,143, 91,229,232,224,144,147,145,145, 97,103, 48, 24,224,228,228,164,151, 22, 23,111,224, 2, -151, 76,129, 92, 0,164, 16, 88,253,253,142, 29,211, 71,140, 24,129,142, 29, 59,102,229,229,231, 55,173,169, 47, 17,128,233, 13, -152,151, 57, 59, 63,127,248,240,161, 56, 51, 51, 19, 83,166, 76, 41,204,120,245,106,121,165,191, 86, 41,208,211,205,195, 99,195, -177, 99,199,108,154, 53,107, 6, 95, 95,223, 60,126,102,102,171, 36,160,180,150,254, 89,235,216,148,190, 60,215,116,238,168,214, - 29,231,205,155, 7,189, 94,143,155, 55,111,226,193,131, 7,200,200,200,192,157, 59,119,164,102, 66,225,184,106,185, 14,107,236, -159, 67,188,148,238,135, 15,135, 81, 28, 14, 7, 7, 14, 28, 64, 92, 92, 28, 0,192,207,207, 15,211,166, 77,131, 94,175,199,164, - 73,147,201,185, 36,147,212,186,250, 39,128,214, 0,190, 67,133,200,235, 72, 8,225, 83, 20,149, 3,192, 5,141,243,201,162,251, - 39,205, 73,115,254,123, 56,255,145,168, 55,215,225,218,159, 96,254,110,154,143, 89, 57,225,123, 66, 89, 61,122,250,251,132,134, - 4, 51, 58,117,234, 4, 23, 23, 23,248,249,249, 33, 51, 51,147,103, 97, 97, 81, 95, 62, 53,133,255,224, 9,105,109,218,180,177, - 88,190,124,185,249,192,129, 3,217, 46, 46, 46, 32,132, 32, 46, 46, 14, 17, 17, 17,229,123,247,238,149,149,217, 15,147,198, 94, -251, 77,209,144,124,106, 15,128, 50, 0,107,156,115,114,126,158, 63,119,110,112,187,246,237,103,132,132,132, 48, 68, 2, 19,246, -250, 85, 51,249, 0,176,246,135,227,230, 35, 2, 39,226,123, 79,160,215,132,154,243,200, 85,175,103,102,246,172,140,143, 70,245, -243,252, 98,193,116,195,216,177, 99,133,102,102,102,112,113,113,129,165,165, 37, 82, 83, 83,145,157,157, 77,206,158, 61,171,184, -247,248, 37,251,244,165, 71, 25,124,115,135,134,228, 37,148,251, 15,250,248,245, 71, 31,125,100, 57,117,234, 84,211, 14, 29, 58, -176,121, 60, 30,120, 60, 30,242,243,243,145,146,146, 82,126,246,236, 89, 69,153,221,144,146,216,107,199,228, 13,204,117,168,242, - 31, 31,154,114,235,114,200,226,231, 79,159, 78, 54, 2,109,203,203,203,157, 12, 6, 3,197, 96, 48,114,141, 70,227,211,114,185, -124,191,198, 47,100, 27,157,235,176, 97, 48, 24, 12, 28,131,193, 0,169, 84,138,203,151, 47,179, 94,189,122,181,250,201,147, 39, -171,115,114,114,160,211,233, 48,102,204, 24,248,249,249,225,218,181,107, 40,200,207, 63, 91, 23, 87, 18, 80,202,203,206,158, 54, -107,214,172,243, 97, 97, 97,140, 39, 79,158,216, 28, 56,112, 96, 95, 77, 2,102,242,228,201,198,252,204,204,105, 26,160,180,142, -254, 89,215,216, 44,188,112,108,231,147,145,163, 3, 91,134, 4,173,102,119,235,214, 13, 54, 54, 54,232,217,179, 39,202,203,203, - 45, 90,180,104, 81,223,216,148,251, 15, 30,151,218,182,109, 91,225,182,109,219,196,211,167, 79,199,130, 5, 11, 0, 0, 42,149, - 10,151, 46, 93,194,226,197,139,243, 50, 89,157,149,245,245,207,183,150,170, 74, 1,118, 3,128, 63,128, 84,208,142,239, 52,104, -208,248,103,162, 50,169,180, 3, 42, 18, 75,159, 67,197,203,121,253,185, 14,111, 61,120,134,234,105, 62, 42,224,144,160,119,157, -250,106,206,210, 13,190, 76,157,204,146, 77,169,205,146, 95,190,164,234,203,121, 88,149, 79,205,220, 75, 97,157,118,180,211,250, -181,107, 23,125,255,253,247,253, 42, 67, 56, 8, 4,130,167, 42,165,242,138,173, 70,179,189,204,220,235, 74, 99,115,243,101, 3, -249, 0,230, 90,198,198,238, 8, 24, 49,102, 19,223,202,157,189,114,221, 94, 53,147,193,208,166,228, 20,224,123, 79, 64,216,128, - 5,146,101, 90,224,185,212, 65,159,111, 29,152,244,245,151, 95,126,177,118,205,154, 78, 34,145,168, 87,185, 94,239,101, 52, 26, - 1,163, 49,185, 76,169,188, 65,202,203, 31,106,252,130,182,240,205, 29, 72,131,243, 18, 90,180,144, 91,189, 14,239,116,112,255, -254,133, 39, 78,156,248, 83,219,173, 53,154, 29,101, 22, 45,162, 27,210,246,234,101,212,192, 93, 72, 36,119,235, 50, 93,210,185, - 14, 27,248,246, 97, 52,206,182,180,180, 60,212,175, 95, 63,126,255,254,253, 49,116,232, 80,116,235,214, 13, 70,163, 17,132, 16, -200,229,114, 28, 63,126, 28,155, 54,109, 74,110, 10,172,169,143, 79, 3, 92,225,253,254,251,144,182,109,219, 30,168, 75,192,188, - 21, 89,245,250, 36,214, 61, 54,121,201,122,243,225,233,227,231,175,247,212,202,114, 45,172, 5,122,241,243,103, 79, 25, 13, 31, -155,222,114, 67,220,241,206, 99, 70,141,154,207,100,177,122,190, 93, 1, 73, 94, 36, 36,196, 86, 38,149,134,223,180,203,141,236, - 75,149,177,235,104,199,119, 26, 52,104,252,211,133,214, 80, 84,248,107, 85,165,228,169, 53,215, 97,165,213,135,197, 98, 73, 82, - 79,207,153, 88, 23, 59, 27,232,247,214,146,133,122,115, 29,190,253, 59, 29,144, 67,163,249,230,157, 96,164,213, 86, 23,178,223, - 43,223,152,176,136, 37, 64, 18,244,154, 0, 72, 18,128,200,185, 21,124,157,214,126, 85,189, 77,181, 62,100,223, 57, 46,167, 88, - 13,220,130, 66,113, 11, 10, 69,141, 78,187,108, 22,167,184,190,122,190,223,246, 76, 64,246, 87,219,254, 62,103,189,226,225, 47, -156,207,127, 27,222, 20, 22,158, 6, 32,114,142,138,178,191, 16, 21, 53,246,139, 37, 75,198, 56, 56, 58,122,216,216,216, 88,154, -154,154, 50,238,223,191,159,166, 87,171,119,180, 3, 14,190,181,166,214, 11, 13,112,197, 59, 51,179,213,199,163, 70,205,167, 88, -172, 30,213, 5, 12,209,235,239,184, 3,187,234,178,100,125,232,216,116,225, 57,244,123,107,201, 2, 19,152,213,144,190,145, 93, - 81,143,117,208,235,215, 33, 62,190,134, 62,223,232,190,180,150,162, 40, 57,104,199,119, 26, 52,104,252,115, 81,153,239,240,220, -255,245,129,251,211,156, 52,231, 63,136,147,137,138, 85,116,244,249,164, 57,105, 78,154,147,230,164,209, 32,176,232, 83, 64,131, - 70,131, 97,192, 31,211, 96, 52,104,208,160, 65,131, 70, 37, 42,125,179,170,227,103,160,194,117,167, 54, 85,218,152,213, 4, 31, -162,108,163,105, 78,154,147,230,164, 57,105, 78,154,147,230,252,215,113,214,199,253,119, 92,205, 88,233,147, 85,229,155,245,127, - 5,218,172, 74,115,210,156, 52, 39,205, 73,115,210,156, 52,231, 63, 29, 14,111, 69, 86,245, 15,128, 70, 6, 44,165, 65,131, 6, -141,127, 42, 66, 66,192, 32, 4, 20, 33, 33, 12, 66, 78, 48, 9, 9,100, 18,130,191,148, 10, 36, 48,176,230, 96,182,159, 77,180, - 52,165,207, 56, 13, 26,255, 40,228,162,150,164,210,180,143,214,255, 95,184,138,197,226, 61, 0,168,188,188,188,217, 0, 50,233, - 83,242,191, 7, 43, 43,171,126,122,189, 30, 50,153,236,202, 63,177,125, 45, 61, 48,138, 48,208,162,234, 7,130,204, 23, 41, 56, - 84, 83,217, 22,158,152, 2,234,143, 88, 92,148, 17, 47, 18, 94,225, 84, 35, 14,199, 24,210,223,101, 23, 0,156,143,206,154,143, -255, 78, 92,173,230,182,182,182, 23, 89, 44, 22,203, 96, 48,204,149, 72, 36, 81,181, 11,161, 64, 38, 0,176,201,181, 21,210, 60, -187,229,159,127, 74,177,203, 52,251,165, 26,149,178,148,201,102,190,230,177,197,183,231, 76,103,156, 47, 81,116, 77,168,105,255, -240,240,240, 90,179,120,183,242,196, 16,134,161,229, 48,191,214,105,169,223,109,239,244,125, 47,119, 27,118, 90,214, 99,209,198, -221,165,123,184, 22,110,195,166,140,165,162, 88, 2,106,242,254,253, 69, 10,122,148, 53, 28,235, 1,171,114,192,151,205,227,185, - 24,244,122,123, 10, 32, 76, 22, 43, 95,167,209,100,113,128,248, 21,128,244,159,206,201,225,241,156, 13,122,189, 61, 0,252, 47, -214,147,198,187,168, 85,104,137, 68,162, 24, 6,131,225, 92, 61, 25,110,101, 62,193,202,223,170,111,163, 40, 10, 6,131, 33,187, -164,164,164, 67, 35,142,111, 6, 96, 44,128,202, 37,234, 71, 0, 28,199,135, 59, 28,155,113, 56,156,165, 66,161,176,175, 74,165, -106, 5, 0, 38, 38, 38,207,149, 74,229,213,242,242,242,239, 62,144,151, 5,224, 99,145, 72,212,135,193, 96,244, 33,132, 80,132, -144,107, 10,133,226, 42,128, 19, 0, 62, 36, 82,130,137,157,157,221, 58, 43, 43,171, 9, 43, 86,172, 40,178,182,182,246, 94,188, -120,241,163,226,226,226,223, 10, 11, 11, 87,161, 17, 57,234,254,203,240, 16,139,197, 71,216,108, 54, 51, 43, 43,171, 15, 0,184, -184,184, 92,211,106,181, 6,137, 68, 50, 17,192,171, 70,242, 9, 1,116, 17,137, 68, 29, 68, 34,145,191,193, 96,104,241, 54, 63, -227, 11,133, 66,113,179,188,188, 60, 6,192,125, 0,202,255,161, 49, 98,202, 98,177,194,222,246,117, 47, 0,242,127,218, 77,128, - 48,208, 34,225,121,162,119,149,240,106,229, 83,123, 97, 10,174, 53,148,109,176,208,234,219,203, 97,216,240,225, 3, 24, 0,160, -213,157, 31,118,245, 70,238,153,255,112,115,154,143, 30, 61,250,110, 88, 88,152,165, 70,163,193,236,217,179,143, 68, 71, 71,239, -146,201,100, 43,234,188,113,136, 44, 23,111,222,118, 73, 64, 81, 12, 0,176, 51, 26, 13,118,111,222,188,242, 74,120,118,119,240, -243,231,247,214,171, 18,175,222, 55, 82,236, 57,229,232,153,216,144, 74,180,112, 71,192,176, 49,163,134,174, 89, 19,130, 9,227, - 38, 52,121,254, 92,109,226,100,150,202, 45, 86, 9, 61,173,109,237,134,175, 89, 27, 78,221,190,117,122,120,216,129,208,171,211, -167, 91,247,165,197, 86,131, 64,173,101,177,186,152,123,122,250,143, 59,125, 26, 34, 23, 23, 22,139,199, 99, 0,128, 94,163,113, - 81,100,101, 57, 28, 27, 62,188,115,200,203,151,215, 67,128, 7, 52,231,255, 23, 78, 26,141, 17, 90, 12, 6,195,249,205,155, 55, -118, 66,161,176,226,102, 76, 8, 12, 6, 3, 12, 6, 67, 85,242, 98, 66, 72,213,183, 94,175,135,143,143, 79,131,222,104, 1,244, - 5,240, 73,239,222,189, 3,191,251,238, 59,182,175,175,111,101,202,144,158, 43, 87,174,252, 33, 46, 46,238, 36,128,131,168, 8, -222,216,208, 55,222, 65, 66,161,240,240,230,205,155,205, 6, 12, 24,192,114,116,116, 4, 69, 81,200,203,203,235, 18, 29, 29,221, - 97,241,226,197,115,149, 74,229, 36, 0, 23, 27,113,126, 90,155,154,154,134,143, 26, 53,202,185, 87,175, 94,252,150, 45, 91,194, - 96, 48,224,241,227,199,211, 99, 98, 98,198,159, 60,121, 50, 88, 46,151, 7,162,225,249,218, 40,145, 72, 52,213,204,204,108, 93, - 80, 80,144,213,164, 73,147,184,207,158, 61, 43,113,119,119,167,110,223,190,109,123,252,248,241,185, 27, 54,108,248, 88, 38,147, -173, 82, 40, 20,191,162, 1, 57, 20, 77, 77, 77, 99, 24, 12,134,115, 67,132, 48,128,198,136,225,118, 77,155, 54, 61,126,235,214, -173,166,233,233,233,134,145, 35, 71, 30, 2,128,171, 87,175,250,234,116, 58,106,224,192,129,231,179,179,179,199, 2,120,220,192, -182,183,177,178,178, 58, 51, 97,194, 4, 43, 15, 15, 15, 65,211,166, 77, 41,161, 80, 8, 38,147,137,210,210, 82,199,103,207,158, -245,127,240,224,129, 42, 58, 58,186, 88,163,209, 12, 7, 16,223,136,235,212,205,206,206,110, 50,155,205,110,173,215,235,157, 0, -128,197, 98,189,209,233,116,207, 36, 18, 73, 24,128,187, 31, 58, 64,236,237,237,119,174, 91,183,206, 70, 34,145,144, 13, 27, 54, -236,148,203,229, 83,255,169, 55,131, 35,191,157, 64,204,163, 7, 64, 69,218, 28,170,134,254, 71, 1,224,124,254,249, 18,116,232, -216, 25, 19, 39,124, 92, 47,231, 71,253,156, 55,179,185, 28,107,181, 90,125,183,180, 76,115, 66, 40,224,143,157, 48, 62, 32, 25, - 0,206, 95,184, 62,182, 83, 39,203,107,230, 2,222,199,124, 62,191,155, 78, 91, 94,244,251,149,236, 47, 27, 35,170,156,156,156, - 46, 90, 90, 90, 10,138,139,139,243, 10, 10, 10,126, 26, 54,108,216,218,131, 7, 15, 90,166,165,165, 33, 43, 43, 11,139, 22, 45, - 18,101,103,103,207,143,143,143,191,167,213,106,107,181,108,201,229,197,219, 87, 46, 31, 17,100,110,110,195, 20, 10,204, 96,106, -110, 5,119,143,182,232,210,109, 24,134, 12,157,129,148,228,184, 46, 7, 15,172,137,123,243, 38,250, 91,145, 85,179,181, 82,105, -211, 90,239, 75, 45,155,163,215,240, 81, 21, 34, 43, 40, 40, 4, 47, 19, 19,229,233,175, 25,159,157, 59,205, 18, 12,233,231,195, -211,107,243,210,111,223, 58,221,180, 71,207,145, 0,208, 33,236, 64,232,213,207, 38, 90,246,219,121,164, 68, 78, 63,146,106,191, -119,174, 97,179,167, 14,218,182,205,206,111,238, 92,142,226,245,235,242,212,221,187,203,242,111,222, 52,176,120, 60,226, 50,120, - 48,101,219,167, 15,127,238,139, 23,156, 59, 27, 54,248,179, 67, 67,221, 87,149,151, 31,166, 57,255, 79, 57,255,237,168,116,130, -175,190,250,240,231, 58,133, 22, 69, 81, 16, 10,133, 56,118,236, 24,216,108, 54, 88, 44, 22,216,108,118,173,127,187,186,186, 54, -164, 34,163,197, 98,241, 15,187,118,237,178, 31, 52,104, 16,248,124,126,213, 6, 38,147,137, 1, 3, 6,160,127,255,254,236,156, -156,156,241,199,142, 29, 27,191,126,253,250,124,169, 84,186, 0,111, 19, 67,215,129, 62,222,222,222, 17,151, 46, 93, 50, 81,171, -213,184,121,243, 38, 74, 74, 74,192,229,114,225,236,236,140,129, 3, 7,178, 18, 19, 19,173, 6, 12, 24, 16,241,242,229,203, 0, - 0,215, 26, 80,215, 14,118,118,118, 55, 78,156, 56,193,111,219,182, 45,149,146,146, 2, 63, 63, 63, 0, 64,105,105, 41, 70,142, - 28,201,159, 52,105,146,199,248,241,227,239, 75, 36,146, 94, 0, 98,234,225,107, 47, 22,139,127, 29, 53,106,148,227,250,245,235, -205, 76, 77, 77,145,158,158,158, 43, 22,139,189, 42,207,247,248,241,227,185,195,134, 13,115,216,180,105,211,246,240,240,240, 47, - 37, 18,201, 84, 0,177,117,170,214,183,130, 88, 32, 16, 32, 63, 63, 31, 71,142, 28,193,252,249,243,193,100, 50, 33,145, 72,112, -252,248,113,124,246,217,103,149,130,166, 65, 98, 88, 32, 16,244,247,244,244,220,119,245,234, 85,103, 11, 11, 11, 56, 58, 58, 50, -190,254,250,235,214,238,238,238, 38, 77,154, 52, 97,230,230,230, 34, 34, 34,194,125,242,228,201,103, 50, 51, 51,167,107, 52,154, -122,167,212,236,237,237,247,159, 59,119,206,245,249,243,231,216,189,123, 55,138,139,139,193,229,114, 97, 97, 97, 1,177, 88, 12, - 47, 47, 47,106,249,242,229,130, 97,195,134, 9, 22, 44, 88,176, 95,171,213,182,107,192, 53,106,107,103,103,183,167, 79,159, 62, -238,161,161,161, 22, 98,177, 24,149, 47, 6,165,165,165,206,233,233,233, 93,130,130,130, 2, 99, 98, 98,210, 36, 18,201, 28, 0, - 79, 26, 57,112,218,181,108,217, 50, 96,228,200,145,204,220,220, 92,132,133,133, 5,200,229,242,118,141, 16,151,127, 43,196, 60, -122,128,217,243, 22, 41, 28, 93, 92, 56,151, 46,238, 27, 29,126,170,249, 35, 11,147,138,132,212, 82, 21,202, 3, 71,189,236, 56, -112,208, 12,206, 71, 67, 71, 42,126,254,113,187,168, 33, 66,139,205,229, 88, 31, 57,188, 53,243,214,237,152,214,151,163, 31, 12, - 30, 61,124, 56,225,112, 44,220, 1,224,203,197,159,179, 35, 34, 35, 15, 12,232,223, 57,167,103,143, 14,153, 19, 39, 45,113,109, - 68,117,155, 55,111,222,252,122, 92, 92,156, 61,143,199, 67,113,113,177,245,207, 63,255,188,181, 71,143, 30,140,212,212, 84, 36, - 38, 38,226,245,235,215, 40, 45, 45,197,128, 1, 3, 68,177,177,177, 63, 1,168, 85,104,149, 51,250,174,115,108,162,219, 97,109, - 34,108, 90,110,144,217, 17, 93,110,203,203,231, 46,183, 57, 26,166,242,179,119,240,241,250,100, 90, 48,214,172, 61,201,254,237, -200,198,160, 43,209, 71, 1, 70,211,218, 51, 2, 16,116, 91,185,106, 5,100,114, 13, 38, 77,152,133,201, 19,102, 89, 19,104, 29, -136, 65, 45,212,170, 74, 44, 76, 57, 47,162,118,237,221, 58, 10,128,115, 53,177,117,133, 22, 91,181, 99, 13,139,213, 57,224,135, - 31,108, 91,207,156,201,123, 18, 26,170, 44,188,121, 83,229,249,209, 71, 37,126,159,126,170, 1, 0,249,235,215,156,151,193,193, - 2, 91,127,127,147,174, 75,151, 90, 26,180, 90,241,154, 53,107, 58, 5, 85, 36, 47,111, 20,167,235,216,177,134,160, 3, 7, 58, -222, 92,178,164, 55,165,211, 49, 7,119,237,250,120, 67, 88,216,155,191,194,249,159,172,103,206,141, 27,154, 98,119,119,248,141, - 28, 89,228,106,103,167,249, 79,182,253,175,212,147, 70, 21, 42,125,181,102, 87,127, 67, 69, 84, 84, 84, 47, 0,215, 1,132, 6, - 4, 4,132, 0,128,185,185,121,190, 84, 42,181,139,136,136,168, 87,100,177,217,108, 56, 56, 56,192,203,203, 75, 34,145, 72,236, -235,168, 64,150,209,104,116, 38,132, 84, 89, 95,106,131, 70,163, 65,114,114, 50,218,180,105,147,141,138, 68,180,181, 26,117, 4, - 2, 65,106, 98, 98,162, 77, 66, 66, 2, 98, 98, 98,224,238,238, 14, 75, 75, 75,176,217,108,232,116, 58,200,100, 50,120,123,123, -131,199,227,161,125,251,246,133, 74,165,210,189,158, 41, 32,158, 80, 40, 76,190,113,227,134,139,159,159, 31, 30, 62,124, 8, 23, - 23, 23,136,197, 98, 0,192,235,215,175,113,251,246,109,124,244,209, 71,136,139,139,195,152, 49, 99,178,148, 74,165, 23, 0, 77, -109,132, 86, 86, 86,185, 87,175, 94,205,246,245,245, 85, 43,149, 74, 70,126,126, 62,251,230,205,155,122,185, 92, 46, 42, 45, 45, -101, 75,165, 82,182, 76, 38, 99, 41,149, 74, 54,131,193,224,168, 84, 42,246,149, 43, 87,152,229,229,229,117, 6,200,172,188, 78, -145,145,145,240,245,245, 69, 68, 68, 4,190,248,226, 11,220,185,115, 7, 46, 46, 46, 56,113,226, 4,150, 46, 93,138,164,164, 36, -216,216,216,160,101,203,150,245, 93, 35,120,120,120,164, 60,125,250,212,131,195,225, 84,230,117,172,204,151,135,130,130, 2,188, -122,245, 10,111,222,188,129,167,167, 39, 38, 76,152,240,234,205,155, 55,158,245,245, 60, 39, 39,167,130,231,207,159,219,180,105, -211, 6,249,249,249,176,176,176,128,185,185, 57, 44, 44, 44,170,254,118,119,119,199,146, 37, 75, 32, 22,139, 37,106,181,218,190, - 62, 17,228,235,235,123,241,202,149, 43, 54,102,102,102,200,203,203,131, 76, 38, 3,139,197,130, 64, 32,128,141,141, 77,149,144, - 79, 78, 78,198,208,161, 67, 11, 83, 83, 83, 7, 53, 66, 36, 49,236,237,237, 19,227,227,227,189, 8, 33,200,204,204, 68, 82, 82, - 18,230,205,155,151,172, 86,171,125,240, 15,202,217, 87,205,239,138, 51,117,218,108,206,168, 17,221,180, 47,158, 71, 81, 60, 99, - 18,218,181, 54, 43, 5,128,199,207,100,230, 26,134, 55, 90,180, 10, 32,167,206,220,229,254,122,240,103, 54,140,176, 7,133,164, - 23,201,248,166, 54,238,129,125, 28,102,126,254,249,244,214,189,123,244, 98,200,149, 74,187,159,126,218,214, 62, 53,245,133, 29, - 0,184,187,183,144,204,157,187, 56,214, 84, 40,148, 92,191,125,195,248,253,247,251,159, 93,186,150,187,183, 1, 85,118,247,242, -242,186, 23, 25, 25,105, 99,103,103, 7,115,115,115, 40,149, 74,148,151,151, 35, 33, 33, 65,125,236,216, 49,157,153,153,153,105, - 94, 94, 30,164, 82, 41, 40,138, 66,100,100,100, 38, 0,183,247,137, 42,125,180, 0, 96,222,144, 22,236,150,125,189, 44, 57, 60, -189,137, 9,251,165, 3, 40, 3,143, 34, 34,251,243, 23, 31,183, 57,127,249,225,196, 81,163,191,176,237,217,107, 20,130, 86, 7, -234,114,114, 50,253,202,209, 51,177, 38, 31, 45, 31, 79,244, 29, 57,102,212,199,107,214,132, 32, 36, 40, 20, 81,145,167, 75, 69, - 66,134,198,204,130,109,238,223,165,187,122,201,252, 17, 89, 10, 69,142,203,154, 77,199, 38, 12, 29,177,196,185, 71,207,145,184, -125,235, 52,194, 14,132,198, 80, 38,132,158, 70,124, 15, 33,128,165,133,187,251,156,133,201,201,156, 39, 33, 33, 10,125, 78, 78, - 73,135,197,139, 11,107, 42,155,125,249,178,144,235,232,104,102, 57,124,184,213,118, 55, 55,162,147, 72,246,212,228, 99, 84, 19, -103,180, 72,100,113,244,252,249,126,132,205,238,181,236,171,175, 76, 2, 2, 2, 32,147,201,112,242,228, 73,236,217,189, 91,227, -224,224,240,212,241,217,179,184,214, 50,217,234,134,114,118, 88,188,184,208, 96, 48, 80, 31, 47, 93, 58,224,249,235,215,125,243, - 36,146, 38, 0,224, 96,101,149,213,193,221, 61,102,127, 84, 84,210,206,166, 77,141, 13,173,231, 47, 23, 46,216,135,167,167,207, -180,178,178, 50,201,151, 72, 88, 60, 46,183,168, 75,203,150, 39,126, 92,181,234,186, 62, 62,158,195,119,118, 54, 51, 15, 8,104, -116,219, 59, 44, 94, 92, 88, 44,151,179, 22,174, 93,219, 61, 35, 63,191,137, 66,163,241,148,202,229, 98,131, 78,199, 48, 19, 8, -138,154,121,123, 75, 84, 55,111,230, 54, 43, 43, 91,180, 23,144,252,183,174,117, 77, 90,228,111,132,247,227,104,253, 41,215,225, -245,128,128,128, 63,173,174, 33,132, 52,200,154,197,102,179,223,153,166,170, 3, 28,138,162, 16, 27, 27, 11,107,107,107,136,197, - 98,240,120,239, 38, 31, 44, 40, 40,192,157, 59,119,240,226,197, 11,180,109,219,182,114, 26,163,118, 69,196,227,125,190,105,211, - 38, 11,173, 86,139,152,152, 24,116,232,208, 1, 60, 30, 15, 28, 14,231, 29, 17, 40,145, 72,208,170, 85, 43, 44, 91,182,204,124, -253,250,245,159,107, 52,154, 90,223, 72, 89, 44,214,130, 89,179,102,217, 85, 90,176,178,178,178,208,190,125,251,170,237,182,182, -182,120,252,248, 49, 58,116,232, 0,103,103,103, 4, 6, 6,218,133,133,133, 45,208,235,245,223,213,198,201,229,114, 25,190,190, -190, 29, 1, 64, 40, 20,130,193, 96,188, 52, 51, 51,179,181,183,183, 23,154,153,153,253,169,141, 7, 14, 28,144, 50, 24, 12, 93, -189,106,128,193, 64, 94, 94, 30, 90,183,110,141,210,210,138, 12, 46, 74,165, 18,158,158,158,144,201,100, 85,162,213,209,209, 17, - 42, 85,221,174, 95,109,218,180, 9,241,241,241, 25, 40, 20, 10,121,108, 54, 27, 79,158, 60,129,159,159, 31,142, 29, 59, 6, 87, - 87, 87, 8, 4, 2, 36, 39, 39,195,215,215, 23, 55,110,220,128,173,173, 45, 90,181,106,197,179,179,179,187, 85, 92, 92,124, 45, - 35, 35, 35,164,142,122, 50, 68, 34, 17,110,220,184,129,253,251,247,227,245,235,215,200,201,201,129,169,169, 41,218,181,107,135, -150, 45, 91,162, 91,183,110, 72, 78, 78, 6, 85,127,103, 18,123,121,121, 69, 61,124,248,208,134, 16,130,176,176, 48, 40, 20, 10, -104,181, 90, 48, 24, 12,240,249,124, 88, 90, 90,162,111,223,190,176,181,181,133,151,151, 23,142, 31, 63,110, 51,100,200,144,223, - 37, 18, 73, 59, 0,121,245,157, 87, 75, 75,203, 69,193,193,193, 46,118,118,118, 72, 79, 79, 71,105,105, 41,236,237,237,209,187, -119,111,167,232,232,232, 69, 58,157,110,219, 63,229, 65, 86,205,241,157,186,116,113,223,104,175,102, 37,190,109,189, 5, 46, 17, - 81,246, 46,199,162, 36,173, 0,160,117, 11,251,231,163, 3, 4, 89, 79,158, 71,101, 93,186,120, 58,230,197, 75, 68,160, 1, 83, -219,165,101,154, 19,151,163, 31, 12,246,107,219,222,184,105,227,210,161,243,231,205,228,217,217,207, 64,126,230,105, 68, 95,141, -117, 93,250,197, 44,219,239,182,252,114,254,114,244, 3, 70,105,153,102,117,195, 76, 89,174, 59, 15,254,216,205, 70, 94, 24,142, -148, 68, 46, 76, 76, 91,195,221,189, 57,100, 50, 25,248,124, 62,127,194,132, 9,134, 21, 43, 86,148,153,153,153, 9, 40,138,194, -181,107,215, 36, 0, 6,213,199,171,182,179, 36,134,114,157,158,112,153, 70, 66,153,170, 40, 67, 49,247, 89, 66, 26, 6,246,239, -147,223,163,115,235,245, 43,214,108, 89,233,213,220,207,118,250,204, 80,246,218,144,137,187, 65,161,103, 77, 60,137, 41,184, 74, -157, 56,101, 2, 96,232,154,111, 66,144,154,154,108, 57,251, 19,105, 40,139,103,226,232,227,214,221,116,247,254,107,131, 61, 61, -155, 54, 89,178, 32,240,220,214, 31,182, 14,173,110,217, 58,120, 32,248, 12,128,126, 13, 57,183,255, 34,180,153, 28, 21, 5, 69, -102,166,174,248,214, 45,117,191, 31,126, 40,116, 25, 52,104,155,182,188,220,166,242, 86,193,160, 40, 80,149,174, 19, 70, 35,197, - 90,182,140, 65, 88, 44,232, 44, 45, 63, 65, 73, 73,243,250, 56,191,200,205, 29, 61,113,230,204,161,103, 46, 92, 64,211,166, 77, -171,158,103, 22, 22, 22, 88,186,116, 41, 22, 47, 94,204,123,252,248,113,167,240,240,240, 78,223,109,222,108, 15, 96,116, 67,234, -121,233,254,125,203, 79,215,172, 89,213,182, 67, 7,215, 67, 71,142,240, 60, 60, 60, 0, 0,175, 94,189,242,218,184, 97,131, 91, -107, 95,223,252,245,159,127,126,240,249,138, 21,173, 0,220,170,139, 51,239,230, 77,109,120,122,250,204,171,215,174, 89,180,110, -221, 26, 0,144,148,148,100,183,125,251,246, 89,173, 2, 3, 39,173,153, 59,119,117,128, 90, 45, 53, 43, 40,224, 5,236,220,201, - 58,250,241,199,245,114, 86,214, 19, 0,122, 79,159,254,121,207, 62,125, 90,142,158, 57,211,202,213,213,149, 18,137, 68, 40, 47, - 47, 71, 78, 78,142,229,243,231,207, 61,162,228,114,217,169,251,247,195, 96, 48, 12,248, 47, 94,235, 26,181,200,223,204,146,245, -103, 77,241,246,187,119, 84, 84, 20, 1,208, 59, 32, 32,224, 70,229, 3,220, 96, 48, 52, 72,100,177, 88, 44, 80, 20,213, 80,177, - 5, 66, 8, 10, 11, 11, 81, 88, 88, 88, 53,117, 36,145, 72,112,245,234, 85, 36, 39, 39,131,205,102,131,195,225,160,188,188,254, - 28,180, 66,161,176,127,255,254,253, 89,247,239,223,135,187,187, 59, 76, 76, 76,170,234, 85,249,225,112, 56,112,112,112,128, 76, - 38, 67,191,126,253,216, 59,118,236,232, 95,151,208, 50, 55, 55,255,104,236,216,177,220,202,255, 21, 10, 5,152, 76,102,149,104, - 81, 40, 20, 40, 46, 46,134, 84, 42,133, 90,173, 70,215,174, 93,185, 81, 81, 81, 31, 21, 21, 21,125,215,144,246,151,149,149, 41, - 36, 18,137, 69,207,158, 61, 45, 15, 30, 60,152,212,181,107, 87,239,119,122,218,245,235,106,181, 90,205,102, 48, 24, 13,202,163, -119,248,240,225,170,115,255,230,205, 27,236,222,189,187,106, 91,114,114, 50,118,236,216, 1, 66, 8, 8, 33,117, 94, 35, 31, 31, -159, 33, 97, 97, 97, 29, 14, 29, 58, 84,194,100, 50,145,148,148,132, 35, 71,142,128, 16, 2, 91, 91, 91,148,149,149, 33, 63, 63, - 31,215,174, 93,131, 94,175,135, 72, 36,130,147,147, 19,127,193,130, 5, 61, 66, 67, 67,217,117, 9, 45,131,193, 96, 96, 50,153, -112,115,115, 67, 80, 80, 16,212,106, 53, 56,156, 10,125, 41,147,201, 32,149, 74, 17, 23, 23,135,244,244,116, 16, 66,234,124,200, -240,249,252,192, 67,135, 14,217,113,185, 92,168, 84, 42,200,229,114,100,101,101, 33, 35, 35, 67, 45,145, 72,244,166,166,166, 12, - 55, 55, 55, 6,143,199,227,141, 28, 57,146,170, 20,156, 1, 1, 1,214, 97, 97, 97,227,180, 90,109,125, 34,201, 86, 44, 22,175, -156, 53,107, 22,191,122,159,205,203,203,195,232,209,163, 5,119,239,222, 93, 33,147,201,142, 0, 40,248,135, 61,208, 72,248,169, -230,143, 98,162,147,124, 35,162,236, 93, 50,178, 13,221,151,126,185,133, 5, 0, 63,239,249,182,123, 68,212,155, 59, 62, 77,243, -179,194, 79, 53,127,100,105,249,162, 62, 33,192,232,219,203, 97,152, 80,192, 31, 59,122,248,112,242,211, 79,219,218,207,159, 55, -147,231,214,124,105,133,133,147,109,135,126,250,111,168, 50,213, 43,254, 79, 63,109,107, 63,122,248,152,184,215,175,211,247,244, -237,197, 59,126,245, 70,238,217,186, 44,134,118,214,124, 39, 1, 79, 9, 39,247,150,240,110, 33,196,227, 39, 73, 56,121,226, 30, - 90,180,234, 2,141, 70, 3,189, 94, 47, 28, 54,108, 88,217,177, 99,199,212, 47, 95,190,148,171, 84,170, 94, 0, 94,214,215,248, -236,236, 4,163,183,184, 75, 57,199,132,167,151,151,114,202,150,175, 14,255,184,125,231,129, 29, 44, 29,156,216,182, 66,227,217, - 33, 3, 58, 29,217,191, 55,104,241,234,224, 35,232,216,105, 96,215, 23, 73,183, 90, 2,120, 90,163,120, 77, 69, 20,227,228, 41, -125,106, 74,202,208,140,244,244,236,230,246, 98,237, 43, 41,209, 45, 90,254,203,128,158,189, 2,219,120,180,240,231,190, 72,184, - 65, 5, 45, 27,247,219,154, 77, 91, 39, 84,138,173, 43,151,127,235,245,201, 39,247,184, 7, 15,214,110, 29,255,183,129,195,227, - 57,139,220,220, 88,175, 15, 30, 84,185, 15, 27, 86, 2, 0,218,242,114,155,215,233,233,230, 2,129, 0,132, 16,232,116,186,119, -124,136, 43,253,134, 91,123,123,219, 55,132,243,245,215, 95,183, 89,182,108, 25,242,242,242,160,215,235,193,102,179,223,191,103, - 67,169, 84,226,147, 79, 62,193,206,205,155,187, 52,132,211, 96, 48, 80,159,174, 89,179,234,171, 85,171, 60,230,204,153,195,168, -126,239,181,178,178, 66,248,201,147,220, 93,187,118, 57,175,220,185,243,147,137, 60, 94, 42, 52,154, 58, 57, 11, 61, 61, 97,149, -159,111, 82, 41,178, 0,192,219,219, 27,187,119,239,230,205,152, 49,131, 59,108,216,176, 45,143,219,182,221,190,173, 71,143, 20, -235,230,205,205,184, 60,158,115,125,156,149,231, 19, 0,228,106,117,235,109,219,183, 91, 62,120,240, 0,249,249,249,200,203,171, -120, 31,165, 40, 10, 29, 59,118,164, 38, 79,158,108,222,204,197,165, 19, 12,134,255,230,229,254,147, 22,249, 27, 97,118, 13,191, -253,225,163,245,182, 65,212,219, 6, 82,213, 30,142,239, 8,150,250,132,214,135, 64, 42,149, 66, 42,149, 98,239,222,189,224,112, - 56, 85, 15, 95, 0,208,106,181, 13, 17, 45,190,142,142,142, 40, 45, 45, 69,243,230,205,223,177,100,113, 56, 28,176, 88, 44,112, - 56, 28,240,120, 60,104, 52, 26,184,186,186,162,172,172,204,183, 46, 78,149, 74,213,206,202,202,170,234, 1,171,121,219, 89, 53, - 26, 77, 85,125,181, 90, 45, 74, 74, 74,160, 80, 40, 32,151,203,161, 84, 42,253, 26,210, 94,163,209,136,103,207,158,189,242,246, -246,110,199,100, 50, 33, 18,137,132, 74,165,178,202,183,168,184,184, 24,191,254,250,171,114,202,148, 41, 54,145,145,145,245, 10, - 45,138,162,240,217,103,159,129,199,227,161,172,172, 12, 63,253,244, 19, 22, 46, 92, 8, 14,135, 3,185, 92,142,221,187,119, 99, -201,146, 37, 96,177, 88,208,106,181,216,190,125,123,173, 92, 9, 9, 9,175,239,223,191,239,215,190,125,123,203, 83,167, 78, 21, - 12, 24, 48,192,118,208,160, 65, 48, 49, 49,129, 74,165,130, 78,167, 67,151, 46, 93,224,227,227, 3,137, 68,130,243,231,207, 23, -122,121,121,217, 60,120,240,192,152,151,151,151,241,255,216,187,238,240, 40,170,246,123,102,123, 73,175,164,144, 80, 34,164,211, - 12,160,244, 18, 90, 18, 12,162, 20, 69, 81, 81,154, 5, 20, 68, 16, 5, 68, 52,128,162,136,130, 82, 44, 96, 16,144,110,168, 1, - 19,144, 34, 66, 8, 37, 29, 2,169,187,201,110, 54,201,110,178,125,218,239, 15,146,124, 33, 38,217, 77,192,239,167,126,115,158, -103,159,157,157,189,115,230,222,185,119,102,206,125,239,123,223,107, 67, 92,179,141, 44,134,160,105, 26,229,229,229,168,174,174, -134, 90,173,134, 66,161, 64, 73, 73, 9, 4, 2, 1,108,232, 44,120,120,120, 60, 21, 25, 25,201, 7, 0,153, 76,134,222,189,123, - 99,233,210,165,148,209,104,156, 12,224, 88, 93,178,113, 91, 22,186,136,224, 0, 0, 32, 0, 73, 68, 65, 84,183,110, 61,112,238, -220, 57,129,159,159, 31,178,179,179,225,229,229, 37,144, 74,165, 54,133,150,143,143,207,247,191,252,242,139,123,189,184,174,191, -206, 6,195,189,234,152, 56,113,162,251,142, 29, 59,190,167, 40, 42,230,223,246, 82,115,149, 65,212, 59,210, 89,187, 59, 73, 21, -177,240,237,117,130,208,200,123,157,215,153,179, 32,248,244,147, 5, 17,211,226,157,143,184,202,116, 34, 91, 60,227,162, 3, 54, - 62,241,196, 40,222, 51, 83,227,242, 68, 34,215,160,205, 91, 62,240,246,238, 48,163,145, 12,115,134,135,167, 51,130, 58,137,137, -189, 71,178,188, 23, 47,249,208,156,184,227,179,252,159,118, 37,141, 21, 11,147, 71, 31, 59, 85, 60,167, 37,238,220,219,213,135, - 13,102,105,152, 78,115,157,112,239, 48, 16,189,123,133,192,219,171, 10, 91,191,223,141, 46, 93,251,194,108, 54,195,217,217, 89, - 78,211,180,149,207,231, 39,218, 35,178, 0,224,244,233,106, 38, 34,162,218,194,175, 97,168, 87,223,248,244,201, 81,227,158, 8, - 31, 49, 34,154, 57,153,124,210, 58,176,143, 85, 57,110, 76,239,242,227,201, 27,243,148,138, 59,221, 35,122, 12, 66,102, 70,202, - 88,150,197, 77,130,104,222,250,148,113, 11,199, 77, 76,102,202,238,221, 51, 25, 35,115, 85,182,234,163, 27,227, 98, 99,167, 71, - 14, 25, 60,132, 73, 62,245,171, 69,140,138, 44,231, 65, 3, 74, 95,125,121,220,129,111, 19,191, 24,125,252,216,247,221,180,186, -194, 36, 78,100, 53,233,164, 81, 84, 7,129, 68,194, 83,167,164, 80, 61,102,204, 48,215,223,143,114,185, 28,135, 14, 29,130, 88, - 44,110,248,136, 68,162,134,237, 14, 29, 58,128,168,155, 70,106, 15, 39, 0, 40,149, 74,148,149,149,193,197,197, 5, 94, 94, 94, - 40, 43, 43,195,133, 11, 23,144,155,155, 11,161, 80,136,177, 99,199,130,215,130,111,115, 83,206, 73, 11, 23,142, 10,235,209, 35, -176,169,200, 2, 0,171,213,138,202,202, 74,196,199,199,243,142, 29, 59,230,115,188,168,232, 9, 0,137,173,113,246,137,141,213, -148,239,221,219,236,185, 31,125,244, 81,226,252,249,243,146,177, 99,198,188,185,224,163,143, 54,126,185, 99, 71, 49, 77, 81, 62, -109, 41, 59,143,199,227, 17, 4,129,128,128, 0, 84, 86, 86,162,182,246,222, 8,182,163,163, 35,220,220,220, 64,146, 36, 24,150, - 21,254,149,117,221,146, 22,249,135, 96, 75, 35,193,181,229, 79, 22,173,186, 66, 1,192,176,198, 47, 22,134, 97,236, 18, 89, 66, -161,208,166,207,149, 61, 86,174,166,176, 71,104,213,231, 85, 42,149, 54,220,104,141, 5, 86,125, 62,121, 60, 30,248,124,190,205, -151,120,157, 24,226,215,212,212, 96,223,190,125, 24, 58,116,104,195,176,148, 86,171, 69,117,117, 53,180, 90, 45, 76, 38, 19,238, -222,189,139,211,167, 79,163, 91,183,110,128,157,193, 95,243,243,243,175,116,233,210, 37,170,254, 37, 62,124,248,240,142, 63,252, -240,131, 34, 38, 38,198,143,101, 89,188,247,222,123, 21,143, 61,246,152,103,227,151,188, 45,240,249,124, 92,184,112, 1,221,186, -117, 3,203,178, 16,137, 68,200,201,201,129,183,183, 55, 24,134,129, 64, 32,128, 90,173,134,147, 83,235, 49, 18,111,222,188,249, -226, 75, 47,189,164,112,113,113,233,169,209,104,148, 18,137,100,240,217,179,103, 3,172, 86, 43,156,157,157,225,236,236,140,163, - 71,143,194,213,213, 21,243,231,207, 47, 50, 26,141, 23, 28, 28, 28, 58, 24,141,198,235,101,101,101,239,181,165,190, 41,138,130, - 94,175, 71, 85, 85, 21, 42, 43, 43,161,211,233, 96, 50,153,108,230,177, 57, 12, 30, 60, 24, 73, 73, 73,252,132,132,132,111,243, -243,243, 1, 0, 65, 65, 65,152, 63,127, 62,223,223,223, 31,119,239,222,197,149, 43, 87, 96,181, 90,193,178,108,171, 55,175, 64, - 32, 24,254,252,243,207, 15, 10, 12, 12, 36,172, 86, 43, 24,134,129,217,108, 70,253,118, 81, 81, 17,194,194,194,120,157, 58,117, -122, 60, 63, 63,127, 56,236,155, 88,193, 1, 64,121,209, 65,248, 11,189, 1,158, 51, 88,227, 65,104, 42,218, 23,197, 69,165, 82, -125,180,232,253,243, 51,190, 92,107,237, 80,162, 4, 66, 34, 39,160,123,248, 72,188,248, 28,133,132, 79,246, 33,176, 83, 8, 10, - 11, 11, 49,124,248,112,145, 66,161,120,169,182,182,118,161,189,220,201,201,191,211, 39,143, 30,123,122,210,148,233, 81,209,209, - 49,212,137, 19, 71,113,243,250,137,140,151,166, 60,165, 98,153, 90,194,221, 85,118, 53, 39,251,114,247,158,189,135,193, 66,209, -131,129, 21,107,129, 21,108,203,247, 59, 44, 71,142,248,242,142, 28,252,254,185,103,166,189,208,107,228,200,209,228,137,228, 95, -112,229, 98,242,181,117,107, 95, 57,147,240,197,158,225,163,198, 62, 21,225,213,225,194,209,200, 96,243,203, 1, 30, 46,183,183, -254, 80,201, 53,150,230,238, 77,169,148, 65,221,115,145, 71, 16, 96, 89,246, 62,145,213, 84,104,241,120, 60,155, 6,128,198,156, -141,223, 69,245, 29,234,205,155, 55, 67, 34,145, 64, 44, 22, 67, 40, 20,218,116,191,104,204,153,113,247,238,136,237,137,137,146, -230, 68,150, 70,163,129, 70,163, 65,109,109, 45,166, 78,157, 42,250,224,242,229, 71, 81,231,250,209, 18,103,160,175,175,217, 65, - 38, 43,207,204,204,244, 11, 15, 15,191, 47,191, 58,157, 14, 50,153, 12,137, 59,119,138,226, 98, 99,231,142, 60,122,116, 29,108, -196,191,106,174,236, 4, 65,192,219,219, 27,110,110,110, 32, 8, 2, 20, 69,161,172,172, 12, 25, 25, 25,184,124,249, 50,248, 4, - 65,253,149,117,220,156, 22,249, 7, 90,181,182, 52, 59,116,216,210,152,104, 91,132, 22,159,207,111,183, 85,171, 37,216, 51,116, - 40,151,203,111, 40, 20,138,129,254,254,254,160, 40,170, 65,104, 53, 29, 58,172,183,126,164,167,167, 67, 46,151,223, 48,153, 76, -173,114,178, 44,251,120,191,126,253,176,127,255,126,164,164,164,224,206,157, 59, 48, 24, 12, 48,155,205, 48, 26,141,200,200,200, - 0,195, 48,136,140,140,132,131,131, 3,228,114,249, 13,179,185,245,142,168, 94,175, 87, 10,133,194, 16,153, 76,214,176,207,215, -215, 23, 26,141,134, 33, 73, 18,219,183,111,215,249,248,248, 56,200,100, 50,187,133, 43, 65, 16, 80,169, 84,232,216,177, 99,131, -143, 86, 77, 77, 13,188,189,189,235,133, 5,204,102, 51,156,156,156,108, 14, 29, 2, 48,221,186,117,107, 65,163,223,125, 39, 77, -154,244,211,238,221,187,187,158, 58,117, 10,151, 46, 93,130,151,151, 23, 62,254,248,227, 59, 5, 5, 5,207, 0,184,172, 82, 61, - 92,191, 72,123,218,144, 70,163,217,119,227,198,141,199,251,245,235,215,240,148, 24, 62,124, 56, 49,124,248,112,207,198,166,126, -181, 90,141, 63,254,248, 3,167, 78,157, 2, 65, 16,200,203,203,163,141, 70,227, 79,173,141, 82,248,251,251,255,176,116,233, 82, - 71,138,162, 26,218,182, 76, 38,131, 84, 42,133, 72, 36, 2,159,207, 71, 65, 65, 1,226,227,227, 93,190,250,234,171,239,205,102, -243, 35, 0,172,248,151,160,218, 8,107,250, 77,157, 75,100, 88,135,140, 45,155, 19, 6,206,156,133,250,161, 67, 42, 50,204, 59, - 35,253,102,185, 75,148,183,237,242, 30, 59, 85,252,170,133, 60, 54,254,216,241,212,201,111,191, 57, 95, 24, 20, 20,166, 58,245, -107, 90,224, 72,234, 67,194,195,211, 25,154, 10, 29, 10,138,202,145, 95,104, 97,131,130,194, 84, 87,254,184, 33,249,228,243,245, -221,245, 6, 83,253,208, 97,171,237,244,183, 11,119, 38,172,219, 32, 57, 51,253,165,190, 98,153,204, 15,149, 21, 55, 16, 24,232, -133,248,184,158,248,110,199, 5,184,184,184,163, 67,135, 14,224,241,120, 14,246,150,189,162,162,130,216,183,235,183, 25,207,191, -240,202, 99, 99, 70,199, 82,199, 79, 28, 17,164,156, 60,124,225,251, 45,239, 30, 96,249,122, 57,193,214,200, 58,119,241,185,126, -251, 86,250, 51, 35,162,167, 66, 38,114,234, 6,132, 54,219, 96, 27, 38, 24,176, 40,218,191,123,133,244,249, 23,102, 14, 24, 51, -230, 9,234,196,137,131, 56,113,116,199,239,203,151,119, 62,122,167,116,167,232,226,229, 18,233,132,167,231, 84, 37, 29,203,178, - 60, 53,190, 75,174,159, 67,111, 35,112,135, 83, 85,141, 59,146, 2, 65, 57,101, 54, 7,116, 28, 51,134,111, 40, 44, 20, 58,118, -232, 64, 1, 0, 73,146, 54,133, 22, 90, 24,130,110,202,105,111, 94, 12, 6, 3,152, 22, 98, 39, 54,229, 44, 83,169, 58,215,117, -194, 27, 64,146,100,131,200,210,104, 52,168,174,174,134,131,131, 3,212,102,115, 7,123, 56, 71,247,239,191,253,131, 21, 43, 22, -238,221,183, 79,212, 88,100,213,127,132, 66, 33,214,172, 93, 43,122,227,237,183,231,204, 21, 8,230,129,162,236,190,158,245,157, -118, 62,159, 15,129, 64,128,194,194, 66, 20, 21, 21,161,176,176, 16,133,133,133,144,201,100, 96,255,226, 73, 64,255, 96,255,172, -122,145,213,248,187,193,202,213,106,120,135,182, 56,195,219, 43, 12,232, 54,140,239,218, 35,180,244,122,253,169,211,167, 79,247, -159, 48, 97,130,224,247,223,127,135,143,143, 79,131,208,170,255,174, 31,142,146,203,229, 56,112,224,128, 85,175,215,159,178,113, - 51,157, 62,122,244,104,212,178,101,203,132, 47,190,248, 34, 50, 51, 51, 49,107,214, 44, 84, 87, 87, 67,167,211, 65,163,209,192, - 96, 48,160,127,255,254,144, 74,165,184,126,253, 58,105, 48, 24, 78,219,176,216,177, 42,149,170,214,203,203,203,183,233,127, 79, - 63,253,116,135, 77,155, 54, 25,178,179,179,201,129, 3, 7, 58,219, 43, 56,234,177,107,215,174, 6, 75, 93,110,110, 46, 54,109, -218,212,224,147,149,150,150,134, 79, 63,253,180, 33,246, 89, 27,113,185,162,162,130, 34, 73, 18,221,186,117,131,191,191, 63, 76, - 38, 19,214,175, 95, 79, 1,184,252,255,213,154, 77, 38,211,222,233,211,167,191,115,245,234, 85, 95,129, 64,112,207,164, 93, 87, - 62,171,213,138, 91,183,110, 33, 35, 35, 3,217,217,217,168,172,172,108,232, 8,164,167,167, 87,145, 36,185,167, 37, 94, 47, 47, -175,247,190,251,238, 59, 31,185, 92,126, 95,123,174,183,134,214, 91, 73,213,106, 53, 92, 93, 93, 49,114,228, 72,239,211,167, 79, -191,103, 54,155,151,253, 75,222,105,196,211, 79,230,246,125,227,213, 9,152, 24, 39, 47,222,159, 84,122,254,211, 79, 22,212, 57, -195,123,103, 76,140,243, 47,190,150,227,138,167,159, 60,216, 23, 64, 9, 90,119,216,102,126, 61,163, 60,212,175,159, 91,202,254, -195,135,191, 95,178,232,205,180,133, 11, 94,241, 50, 24,111, 75,131, 58,137, 9, 0,200, 47,180,176,215, 51, 25,211,167,235,222, - 76, 75, 88,251, 21,175, 92, 83, 61,235,143, 63, 90, 14,111,208, 88,188,240,120,144, 6,133, 14, 85,116, 15, 30,212,229,247, 11, -137,112,148, 27, 17, 18,218, 23, 99, 70, 63,142,148,212,116,148,169, 77, 80, 42,149, 48,155,205,173,134, 75,200,190,126,224, 57, -150, 96, 3, 9,150, 40, 34,120,172,244,185,233, 47, 15,142,141,125,130, 77, 74, 58, 76, 29, 60,144,120,110,207,143, 27,246,242, - 68, 66,129,209,226, 98, 33, 8,147, 22,188,155,153,181,250,123, 29, 26,161, 68,212,178,249,181, 46,176,107,120, 68,168,207,115, -211,103,185,196,140,139,103,143, 30, 61,200,236,217,189, 61,101,207,182, 30,137, 12, 79, 39, 82, 22, 27, 36, 90, 29,169,101, 9, -177,107,173,142, 49,148,231, 63, 98,242,139,125,218, 10,236,229,212, 85,227,247,128,217, 92, 82, 91, 92,236,235, 62,116,168,228, -214,138, 21,242, 14,253,251,155,136, 58, 31,226,214,132, 22,159,207, 7,120, 60,198, 30, 78,123,243, 98, 52, 26,193, 0,100,123, - 56, 41,138,186, 79,100,213, 11,173,250,251,197, 30,206, 45,203,151,255, 30, 56,102, 76,101,106,106,106,135, 97,195,134, 17, 53, - 53, 53,168,169,169,185, 79,108,249,249,249, 17,225,145,145,242, 93, 41, 41, 65,246, 94, 79,123,202,206,227,241,254,114,161,245, - 15, 71,139, 11, 73,183,186, 4, 79,189, 69,203, 30,161,101,167, 69,139, 36, 73, 18,222,222,222,168,168,168,104,241,197,207,227, -241, 32,147,201,234,199,136, 91,157,121,103, 54,155,215, 47, 92,184,240,181,113,227,198,121,134,132,132, 64,173, 86,163, 67,135, - 14,144, 74,165, 13,190, 99,245,124,105,105,105,248,238,187,239,116,102,179,121,189, 13,206,207,215,174, 93,251,234,196,137, 19, -221,125,124,124,224,230,230,134,235,215,175,195,205,205, 13, 58,157, 14, 57, 57, 57,112,114,114,106,240,219, 57,124,248,112,141, -217,108,254,220,134,120, 99,207,158, 61,107,117,114,114,186,174, 86,171,249,149,149,149,130,170,170, 42,129, 78,167, 19,106,181, - 90,225,241,227,199, 61, 93, 92, 92, 12,191,254,250,171, 58, 48, 48,144,127,231,206, 29, 62, 73,146, 54,213, 43, 65, 16,152, 55, -111, 30, 68, 34, 17,204,102, 51,214,175, 95,143,133, 11, 23, 54,248,100,173, 93,187, 22, 75,151, 46,109, 16,206, 91,183,110,109, - 83,203, 97, 89, 22, 86,171, 21, 36, 73,130, 36, 73,187,196,239,131,192, 78,193, 94,150,151,151, 23,215,175, 95,191,147, 63,255, -252,179, 71, 93, 76, 50,148,151,151,163,188,188, 28,106,181, 26,181,181,181,160, 40, 10,254,254,254, 40, 47, 47,199,193,131, 7, -181, 53, 53, 53, 99,208,202,140, 67, 62,159, 63,125,240,224,193,130,166,121,168,239,229,213,139,119,137, 68, 2,133, 66,129,225, -195,135,139, 83, 83, 83,167, 3,248, 71, 11,173,198,225, 29, 70,143,153, 33, 10,139, 24, 96,185,150,145, 84, 28,218,165,188,120, - 90,188,243, 17, 0, 72,191, 89,238,114, 45,199, 21, 97, 17,113,236,232, 49,110, 81,229,101, 91,122, 0,176,182,182, 92, 15, 0, -184,200, 37,147, 70, 69,247, 87, 56, 57, 56,240, 62, 93,183,245,216,215, 95,127,254,232,222, 35,255, 9,239,240,233,186,123,225, - 29, 70, 69,247,103,178,179,178, 39, 1,216,102,175,120,137,139, 27,127,245,187, 31,190, 67,118,198,175,126,239,204,235, 41,174, - 44, 39, 33,115, 12, 64, 84,239, 14,216,242,195, 13, 92,187,118,173,204, 98,177, 12,111,181,125, 19,108, 96, 70,230,205,224, 30, - 17,225, 62,207, 77,159,233, 28, 23, 23,143,164,164, 67,248,113,251,182,179, 79, 77,157,248,109,105,149,142,239, 45,148,139,228, - 44, 35,230,139, 92, 4, 34,137, 76,101,177,220,155, 3, 33, 20, 74,157,129, 73,173,190,120,102,207,156,230, 50, 34, 58, 30, 71, -142, 30,194,143,219,183,156,121, 63,226,233,109, 93,250,132, 17,253, 31,253,100, 78,151,174, 93, 58,233,107,203,117, 60, 66,108, - 53,153, 24,167, 79,182, 23,124,150,191,116,122, 62,128,117,224,102, 29, 54,198,245, 31, 99, 98,250,189,113,251,182,200,107,208, - 32,153, 34, 37, 69, 94,183, 18, 73,171, 66, 75, 32, 16,128,109,121,168,235, 62, 78, 98,199, 14, 30,128, 86, 39, 97,137, 68, 34, - 24, 12, 6,144, 45, 91,176,239,227,244, 61,113,162,248,246,237,219,221,221,221,221,239, 19, 89,149,149,149, 13,219, 38,147, 9, - 6,131, 1, 50,153, 44,195,216,252,136,200,125,156,229,103,207,154, 86,207,155,183,236,153,169, 83, 55,156, 58,125, 90,234,225, -225, 1,173, 86,123,159,208,178, 88, 44, 24, 49,114,164,104,237,213,171,207, 65,167, 91,110,207,245,236, 48,124,184, 77,127, 96, - 62,159, 15,230, 47, 30, 58,252, 23, 96,102,115,194,139,103,107, 8,199,222, 89,135, 45,188, 32,155,174,238,189, 52, 42, 42,202, -148,155,155,139,192,192,192, 6,177,210,248,156,206,206,206,112,117,117, 69, 90, 90, 26, 62,250,232, 35, 35,128,165, 54, 56,107, - 12, 6,195,148, 81,163, 70, 25, 5, 2, 1, 66, 67, 67, 27,226,103, 49, 12, 3,177, 88, 12, 7, 7, 7, 92,189,122, 21,227,199, -143, 55, 24, 12,134, 41,248,115, 12,173,166,156, 90,131,193,240,236,232,209,163, 13,153,153,153, 24, 60,120, 48,174, 93,187,134, -218,218, 90,212,214,214,226,238,221,187, 8, 15, 15,135,193, 96,192,166, 77,155,140, 6,131,225, 89, 0,218,214, 56,107,106,106, -198, 47, 92,184,144,255,211, 79, 63,117,241,247,247,143,232,219,183,111,200,200,145, 35, 31,121,242,201, 39, 59,197,196,196,248, -118,239,222,221, 52,102,204, 24,175,113,227,198,121, 25, 12, 6,225,249,243,231,149, 36, 73,142,179,145,207, 6,113,146,155,155, -219, 48, 84, 40, 16, 8, 80, 81, 81,209, 16,185,191,254,161,212,130, 16,142,182, 37,182,235, 5, 86,189,224,178,195,207,173, 57, - 78,155, 7,137,197,226,122,139, 39,107, 7,103,122, 86, 86,214,168,161, 67,135,166,207,152, 49,163,166,172,172, 12, 78, 78, 78, - 8, 10, 10, 66,112,112, 48, 60, 61, 61, 97,181, 90,113,224,192, 1,253,193,131, 7,111,104,181,218,225,248,115, 12,173,232, 38, -215,241,110,115, 15,217,122,107, 86,189,208,146, 74,165,240,247,247,175,191,182,119,219,114, 61,219,137,191,150,179, 78,192,140, - 28, 49,166,107, 76,236, 4,151, 3,135, 46,136, 55,108, 60,120, 35, 42, 26, 91, 61, 58,235, 14,123,116,214, 29,142,138,198,214, - 13, 27, 15,222, 56,112,232,130, 56, 38,118,130,203,200, 17, 99,186,102,102,100,135, 52, 94,247,176,185,124, 74,165,210, 1,131, - 7, 69, 85,165,158, 59,195, 36,172,253,138, 55, 98,248, 83, 87,183,125,123,224,192,182,111, 15, 28, 24, 49,252,169,171, 9,107, -191,226,165,158, 59,195, 12, 30, 20, 85, 37,149, 74, 7,216, 83,246,217, 51,167,185,196,198,196, 35, 41,233, 0,181,119,215,166, -181,187,247,229, 13,125,249,181,179,229,185,185,215, 88, 85,201, 9, 8,121,133,200,202,202,210,214,137,172, 92,123, 56,103,189, - 50,173,177,200,250,205,195,103,240,214,172, 44,208,201,201,191,144,167, 79, 95, 53,254,150,174,210, 94,201,172,168, 84,168, 43, -239,232,116, 26, 11,195,208,160,105,154,255,193, 7, 13, 14,187,205,214,209,192,129,195,240,235,169,157,216,254,195,102, 45,195, -192, 52,105,239, 94,122,210,164, 21,108,167,206,157, 59, 37,238,218, 73,196, 61, 49,193,133, 5,152,241, 19,227, 93,127,218,253, - 19,209,181, 91,215,206, 65, 65, 13, 33,109,254,121,109,233, 47,224, 92, 1, 84,233, 10, 11,207,164,125,245,149,185,195,148, 41, -238,226, 14, 29,156, 65,211, 68,253,243,189,165,143, 64, 32,104,106,129,105,145,211,223,211,179,244,240,225,195, 8, 14, 14,134, -191,191, 63, 26,251,200,214, 7,228,246,240,240,192,190,125,251,192,222, 31,156,186, 69,206, 62, 93,186,164,173, 89,189,218,194, - 48, 12,170,170,170,254,100,205,170,170,170, 2,195, 48, 56,122,228,136, 69,119,111, 37, 16,187,202, 62,156,207,175,125,102,200, -144,132,216,216, 88,235,237,219,183,193, 48, 12, 26, 91,182, 84, 42, 21, 28, 29, 29, 97, 50,155, 3, 0,200,237,225, 84, 29, 63, -238, 0, 27,207,245,102, 44, 90,127, 69,189,255,211, 69, 86,227, 5,165,103,218,101,209,162, 40, 10, 1, 1, 1,247, 45,233,194, -227,241,238,251,180,113,198,225,142,204,204,204, 19, 99,198,140, 89,246,216, 99,143,205, 94,182,108, 25, 63, 36, 36, 4, 90,173, - 22,110,110,110,240,246,246, 70, 78, 78, 14, 14, 31, 62, 76, 87, 84, 84,124, 3, 96, 37,236,155, 66,159,146,151,151, 23,215,179, -103,207,221,139, 23, 47,118, 25, 61,122,180, 48, 32, 32, 0, 44,203,226,234,213,171,216,191,127,191,117,219,182,109,186, 58,145, -101,175,243,242, 73,133, 66,241,212,184,113,227, 18,167, 79,159,238, 68,211,180,240,238,221,187, 48,155,205, 32, 73, 18, 69, 69, - 69,214,164,164,164, 90,131,193, 48, 13,192, 73, 59,248,210,170,171,171,195,147,147,147,167,159, 63,127,254,163, 25, 51,102,120, -140, 28, 57, 82, 68, 81, 20,206,157, 59,167,238,211,167,143,183, 74,165,178,238,219,183, 79, 99, 50,153,150,210, 52,109,215, 18, - 60, 4, 65, 64,167,211,193,211,211, 19,102,179, 25, 12,195,192, 98,177,192,209,209,177, 97,217, 36,150,101,209, 22,231,250, 38, -109,128,111,181, 90, 49,117,234, 84, 48, 12,131,245,235,215,131,162,168, 54,147,185,184,184, 92, 73, 79, 79,143,235,221,187,119, -131,120,169,111, 67, 18,137, 4,158,158,158,240,240,240, 64, 82, 82, 18,132, 66,225, 21, 91,254,110,117,184, 86, 81, 81,209, 39, - 57, 57,121,192,141, 27, 55,158, 7,208,219,106,181,250,211, 52, 77,240,120, 60, 37,203,178,215,117, 58,221,183,176,115, 9, 30, -149, 74,245,209, 11, 47,188,208,103,231,206,157,142, 2,193,127,110, 13,129, 64, 0,137, 68,130,250,224,152, 44,203,194, 98,177, -224,189,247,222,211,233,245,250,143,254, 45, 79,137,168,190,253,177,101,211, 23,142,167,127, 61,161,206,202,195,254,102, 66, 56, -148,148,151,109,233,161, 40, 46,118,140,234,219,223, 46, 78,210, 98,213, 60, 59,237,173,192,186, 37,120,222,187,123,183, 96,115, -226,142,207,242, 1,224,147,207,215,119, 47,215, 84,207,202,206,202,158,180,121,243,174, 1,164,197,170,177,135,243, 63,226, 37, - 81, 11, 22, 38, 0,151,174,222, 40,239, 50,126,202,241,165,221,186, 58, 63,161,210, 24, 75,107,107, 13,175, 3,200,183,183,236, -131, 6, 14,197,175, 39,127,194,143,219, 19,117, 44,195, 55,121,122,122,178, 0,144,149,229,201,102,101, 85,179,255,241, 43,118, -213, 11,217,107, 43,223,122,125,228, 91, 90, 93,229,231,235, 55,181, 62,148,210,179,215, 99,232,217,235, 49,188,246,250,187, 46, -225, 17,161,129, 0,176,119, 47,232,136,110,153,191, 44,123,127,197, 19, 43, 87,174,128,174,198,140,250,229,122,114,110,102, 30, -201,207,135,133,123,103,221,143,101, 20,117, 9,111,189,213,221, 80, 89,233, 53,232,157,119, 60, 5,111,191,205,107,205, 25,190, -241,253,107, 15,231,229,235,215,143,204,122,249,229,210,229,203,150,141,249,102,243,102, 89,143, 30, 61, 80, 86, 86,134,208,208, - 80,248,251,251, 35, 57, 57, 25,251,246,236,209, 87,215,212, 44, 5,240,181, 61,156, 59,142, 30,205, 9,137,136,168,216,188,121, -179, 95,108,108, 44,161,215,235,161,213,106,161,213,106, 97, 54,155, 81, 23, 16,154,205,205,203,203, 34, 73,242, 27,123,203, 78, -171,213,210,149,253,251,151,136, 24,102,205, 83, 19, 39, 46, 92,249,225,135,146,174, 93,187, 18,102,179,185,193,170,101,181, 90, -225,232,232,104,181, 88, 44, 30, 0, 12,246,112, 74,182,109,163,212,106, 53,188,188,188, 26,194, 53, 53,142, 75, 88, 83, 83, 3, -150,101,185, 96,186,237, 64,139, 10,201,205,205,237,138, 64, 32,232,216,216,186,213,220,218,121,141,247,145, 36, 89, 82, 81, 81, - 17,213, 68,241,182,228, 15, 21, 4,224,227, 17, 35, 70, 60,181, 96,193, 2, 34, 53, 53, 21, 7, 15, 30,100,243,243,243,247,214, - 89,177,242, 91,233,233,180,196,233, 36,145, 72,230, 59, 56, 56, 68,215,135,112,144,203,229, 55,244,122,253,169,186,225,194,154, -118,112, 58, 75, 36,146,121, 14, 14, 14,163,234,150, 95,129,147,147, 83,186, 94,175, 79, 54,155,205, 95,160,229,133,170, 91,227, -148,185,184,184,124,228,233,233,249,236,219,111,191,237,113,246,236, 89,229,175,191,254, 42,170,174,174,222,105,177, 88, 90, 91, - 84,250, 79,156,238,238,238, 87,248,124,126,199,191,168,142,208,179,103,207,164,241,227,199,199, 78,155, 54, 13, 36, 73,226,235, -175,191, 70,114,114,242,145, 91,183,110,197,217,232,141, 54,229,244,236,216,177, 99,234,236,217,179, 59, 77,157, 58, 85,238,230, -230, 6,129, 64, 0,189, 94,143, 91,183,110,225,234,213,171,236,161, 67,135,106,211,210,210, 74, 12, 6,195, 48, 0, 21,109,184, -158, 15,210,107,190,143, 83, 32, 16, 12, 13, 8, 8,216,181,124,249,114,167, 81,163, 70,201, 60, 60, 60,192,231,243, 65,146, 36, -148, 74, 37,110,222,188,137, 19, 39, 78,232,247,238,221,171,215,104, 52, 83, 1,156,249,255,200,231,195,228, 12,235,142,247,155, - 44, 20,221, 98,180,119, 27,105,109,230,115,196, 80,223,248, 73, 79,141, 27, 11, 0, 63,239, 59,118,220,142, 69,165, 91,204,167, -173,188,218,195, 25,218,141,183, 60, 35,243,230,125, 1, 45, 35,194, 35,115,195,122, 76, 92,101, 15, 81,163,200,240,247,149,189, -209,112,108, 99,155,238,125,195,172, 97, 65,136,139,159,244,100,236,187, 75,151,224,227,143, 18,112,232,231, 3, 71,178,242,239, - 91, 38,232, 31,215,150,254, 98, 78, 98,149, 64,240,152,220,215,119,200,122,134, 89,114,237,230, 77,199,198, 29,182,122,203,115, -227, 78,165,159,159,159, 74,169, 84,118,176,135, 51,238,203, 47,173, 6, 7, 7,201,146, 53,107,134,214,154, 76, 67, 87,174, 92, - 41,184,124,249, 50, 54,125,245, 21,101, 42, 41, 73, 84, 3,243, 90, 24, 13,105,145,179,211,188,121,210, 69,155, 54,189, 24,212, -173,155,247,243,207, 63, 47, 20, 10,133,208,235,245, 40, 46, 46,198,201, 19, 39, 44,153, 89, 89,153, 58,157,238, 9, 0, 10,123, - 57,227,190,252,210,234, 26, 20, 4,185,151, 23,123, 58, 37,197,101,214,252,249,179, 59,119,233,226, 50,102,236, 88,161,179,179, - 51,170,170,170,112,247,238, 93, 28, 56,112, 64, 85, 91, 91,235, 7,128,182,135, 51,241,252,249,158, 71,207,156,121,122,213,170, - 85,226,200,200, 72,184,184,184,160,166,166, 6, 55,111,222,196,153, 51,103,204,223,124,243,141, 86,171,213,206,166,105,250,240, - 95, 88,239,255, 6,171, 86, 61,182,216, 20, 90,255,197, 27, 48, 10,192,251,117,219, 31,194,246,154,129,255,166,135, 79,160,187, -187,251, 22,147,201,196, 26,141,198, 89, 0,138,254,134,249, 20, 68, 69, 69,109, 82,169, 84, 3, 88,150,133,139,139,203,133,140, -140,140,185,104, 97,230,141, 13, 78, 62,128, 1,142,142,142,253,157,156,156,134,154,205,230,176,186,225,183, 44,189, 94,127,198, -106,181, 94,170,179, 62,209,255,207,101,231, 3, 24,229,231,231,247, 50,195, 48,221, 8,130,112,165,105, 26, 36, 73, 86, 51, 12, -115, 75,171,213,110, 3,144,252, 55,200,231, 67,225, 12,127, 4, 79,178, 60,132,181, 36, 8,238, 19, 90, 77, 4, 4,193, 32, 43, -243, 54, 14,180, 33,159,188,113,209, 1, 27,129,123, 51, 19, 97,219,185,246, 63, 66,203, 14,241,210,102,145,249, 8,255, 5,150, - 96,239,227, 36, 88,162, 40,180,231,147, 63, 62,136,208,178, 23,225,193, 24, 10, 22, 3, 24, 22,151,178,111,225,215,127,241,179, -238,161,113,126, 12,184,127,229,230,118,129, 39, 16,248, 0,224,213, 89, 95, 24,134, 32,104,150, 32,168,198,195, 91, 77, 58,150, -173,114, 90,129, 30, 66,137, 36,128,166,168, 14,101,128,227, 81,154,126,212,196,178,181, 29,129,247,211,129,156,246,228,211, 10, -244,224, 75, 36,129, 71, 89, 54, 94,237,224,208, 83,101, 52,122, 1, 96, 29, 29, 28,178,116,122,253,118,147,201,180, 17,127, 30, -185,176,201, 41,146, 72, 58,210, 20,213, 1, 0,120, 2,129,106,183,217, 28, 80,226,236,252,188,201,108,238,228,232,232, 72, 90, - 44, 22,157,201,100,154, 70, 81,212,233,182,148,253, 22, 69,133,159,231,241, 6, 91, 29, 28, 60,172, 4,225, 96,161, 40,171,197, -106, 45, 54,153, 76, 55, 0,124, 6,224,246, 95, 92,239, 28,218,121,179,112,156, 28, 39,199,201,113,114,156, 28, 39,199,249,215, -115,202, 1, 4,214,117, 22,255,137,101,255, 55,193, 62, 31, 45, 14, 28, 56,112,224,192,129,195, 63, 6, 6, 52,227,147,197,225, -255, 23, 68, 43,170,180, 45, 38,193,246, 40,219, 83, 28, 39,199,201,113,114,156, 28, 39,199,201,113,254,207,113,218,226,254, 39, - 14, 73,182,184,214,225, 95, 13,206,252,203,113,114,156, 28, 39,199,201,113,114,156, 28,231,255, 44,120,220, 37,104, 17, 29,234, - 62, 15, 59, 45,135,127,119, 91,104, 10,255,186, 79, 91,210,251,114,151,156, 3, 7, 14, 28, 56,161,245, 87,191,180, 30,228,229, -246,160,194, 39,129, 32,160, 32, 8, 40, 0, 36, 60,196,180,182,224,231,233,233,249, 70,120,120,120, 98,135, 14, 29, 94, 3,224, -221,198,227,187,203,229,242, 47, 28, 28, 28, 82, 29, 28, 28, 82,229,114,249, 23, 0,186, 63,164,122, 35, 0,204,146, 72, 36, 41, -190,190,190,165, 98,177, 56, 5,192,108,180,127,230,106, 8,238,197, 73,251, 16, 64,207,182, 28,232, 29, 17,191,199, 43, 34,254, -186, 87, 68,252, 77,143,200,241,221,189, 34,226,111,122, 69,196, 95,247,142,136,223,243, 23,180,215, 7,169,223, 4,130, 64, 17, - 65,160,200,206, 99, 63, 35,128, 98,130, 64,201, 67,104, 75, 28, 56,112,224,192,225,159, 6, 63, 63,191,167,124,125,125, 79,249, -250,250, 38,251,249,249, 61,101,199, 33,209,205,188,120,104,130, 0,109,227, 69,210, 90, 58, 91,230,202,198,199,126,106,103,209, - 26,115,118, 32, 8,208,108, 29, 8, 2,140,183,183,247, 6, 95, 95,223,132,166, 31,111,111,239, 13, 4, 1,166, 81, 90,186,145, -192,107,171, 89,181,195,115,207, 61,247,115, 85, 85, 85,146,197, 98, 73,202,203,203, 75, 26, 54,108,216,238, 38,214,141, 22, 57, -165, 82,233, 51,253,250, 15, 72, 59,115,238, 82, 94,238,173, 2, 69,102,206,157,130, 95,142,159,190, 28,217,163,231, 31, 82,169, -244,153, 54,212, 17, 1, 96,150, 64, 32, 72,113,116,116, 44, 17, 8, 4, 41, 0,230,240,249,252,195,171, 87,175, 46,200,200,200, - 40, 63,127,254,124,245,153, 51,103, 74,103,204,152,113,139, 32,136, 95,154, 17,236,209,205, 88,105,154, 90,117,150, 21, 22, 22, - 30, 87, 42,149, 39,100, 50,217, 71,118,164,111,224,244,138,136,191,174,210, 90, 89,149,214,202,122, 69,196,179,141,182,175,183, -241,154,219,170,163, 63,181, 5,137, 68, 18,104, 67,208, 71,183,116, 44, 0,159,186,255,162, 0,124, 89,247,169,159,122,238, 35, -149, 72, 30, 86, 91,122, 24,101,231, 56, 57, 78,142,147,227,252,111,115,254,147,209,167,238,219, 23,247,252,181, 26,222,221,109, -157,117,248,106, 94, 94,158, 35, 0, 4, 7, 7,207, 5,176,175, 45, 66,130, 32,176,136, 97, 88, 30, 0,240,120,196, 59,195,135, -143,232, 35,147,201,238,139,130,108, 52, 26,197, 41, 41,191,142,100, 24,150,168, 75,183,136,101,241, 5,128,114,123,207, 97,177, -152,121, 66,161, 24, 60, 30,241, 86,100,100,143,206, 21, 21, 21,103,121, 60, 94, 98,105,105,105, 85,155,205, 56, 4,129,173, 91, -183, 6,251,250,250,254, 41, 90,179, 82,169, 20,199,199, 63,209, 38,190, 23, 0,137, 89, 34,233, 47, 34, 8, 95,154,162, 92, 1, - 64, 32, 16, 84, 93, 22,139,163, 62, 94,181, 74, 78, 16, 4,163,209,104, 96, 52, 26,241,230,155,111,202, 50, 51, 51, 39, 84, 84, - 84,108,180, 65, 27,220,179, 87,159, 55, 79,156, 56, 30,166,171,172, 50,109,253,124,115,154, 81, 32, 50,116, 9, 15, 21,109,218, -178,221,109,230,139,211, 94,207,206,206, 72, 71,243,203,145, 52, 6, 15,192,129,249,243,231, 71,196,197,197,137,107,106,106,164, - 70,163,177,115, 98, 98,226,123, 81, 81, 81,142,189,123,247, 22,239,218,181,139,208,106,181, 96, 89, 86, 30, 26, 26,202, 78,158, - 60,217,180,123,247,238,215, 0,108,104, 69,248, 46,186,119, 45,121,235, 67, 66, 66,150, 3, 64, 94, 94,158,168,209, 53, 22,134, -133,133, 57, 0, 64, 78, 78,206, 7, 44,203,204, 7, 0,150,197, 90, 0, 75,154, 49,173,229, 69, 12,154, 4, 16,232,150,113,238, -103,105,196,224, 73, 38,176,184, 69, 0,121,117, 29,130,149, 64,163,184, 80,247, 35, 75,161, 80,180,107,109,194,216,216, 56,130, - 32,136,189,105,105,105,251, 84, 42, 85, 23,134,161, 95,105, 45,159, 77,218, 17,225,225,225,241, 66, 69, 69, 69, 2,128,151,179, -178,178,250, 0, 64, 88, 88,152, 8,192, 21,103,103,231,129, 86,139,133,224,158, 85, 28, 56,112,224,240,143, 21, 90, 87, 1,196, -226, 63, 75,240,108,105,143,208, 18, 3,192,217,179,103, 1, 64,210,142,140, 16,141, 5,204,188,121,243,224,235,235,219, 84,188, - 32, 53, 53,229, 65, 10,123,223, 57, 62,252,240, 67,199,234,234,234,232,111,191,253,118, 8,203,178,159, 42, 20,138,223,109, 28, - 95,206,178, 88,203,227, 17,239, 16, 4, 1,137, 68,154, 59,123,246,236,171,117,255,117,254,229,151, 95,228,227,199,143, 55, 0, - 40, 0, 0,137, 68,234,207,231,243,130, 89,150,173,127,225,182, 40, 8,159, 6,130, 40,177,120,196,172, 47,191,164, 30, 29, 63, - 94,224,224,229, 69, 0, 64, 65,118,182,199,218, 79, 62, 25, 88,149,159, 47, 54,122,120,104, 52,122,189, 49, 55, 55, 23, 18,137, -132,224,243,249,143,218, 42,176,131,131,195, 27,171, 62, 94,227,160,171,172, 54,154,116, 53, 22, 62, 69,154,157,100,114,186,188, - 76,165,113,148, 57, 24,222,121,127,133,248,213, 87,166,191,161,215,235,231,218,160,122,237,173,183,222, 10,235,215,175,159,255, -158, 61,123, 8,173, 86, 11,129, 64,224,216,187,119,111, 68, 69, 69,209,191,254,250, 43,209,165, 75, 23, 68, 70, 70,226,220,185, -115,184,112,225, 2,209,167, 79, 31,249,254,253,251,159, 35, 73,114,131, 45,113,205,231,243,222, 12, 13, 13,237,237,224,224, 96, - 9, 14, 14,198, 43,175,188, 2,150,101, 17, 29, 29, 29,233,232,232,184, 79,175,215,139,115,114,178,135,216, 18,217,170,140, 67, -147,235, 45, 91, 0,122,128,197, 45,117,198,161,198,195,143, 97, 57, 57, 57,143, 85, 85, 85,225, 94,189,176, 13, 11,152, 15, 25, - 50,164, 45,109,169,156,101,177,118,252,248,184,119, 0,130,136,142,142,174,126,237,181,215,120,217,217,217,207, 62,249,228,132, -200,188,188, 91,104, 37,159,141,219, 17,241,194, 11, 47,150, 59, 58, 58, 78,220,187,119,111,142, 82,169, 20,136, 68, 13, 58,147, -239,237,237,237, 21, 28, 28, 60,199,221,221, 93,197,231,241,188, 89,176,172,173,182,196,129, 3, 7, 14, 28,254, 86, 56, 82, 39, -174,142, 52,253, 67, 0, 0, 73, 73, 73, 13,145,105,227,226,226, 90,236, 85,179, 44, 91,126,237,218,181, 0,131,193, 0,150,101, -237,121, 9, 52,158,162, 89, 78, 16,188, 77, 60, 30, 49,151, 32, 8, 68, 70,246,184,179,126,253,250,230,214,244,178, 68, 70,246, -184,195,231,243,186,178, 44, 11,130,224,125,205,178, 76,121, 11,156,205,190, 24,197, 98,201, 34, 0,240,241,241,205, 63,118,236, -152,229,233,167,159,198, 39,159,124, 34, 90,188,120,241, 66,129, 64,240, 90, 81, 81, 81, 89, 43,249, 4,128, 37, 94, 94,222,242, -173, 91,183, 6,207,158, 61,251,170, 82,169, 92, 2, 0,190,190,190, 9, 0,194, 1, 20, 52,218,135,111,190,217, 93,250,202, 43, -175,228,170, 84,170, 37, 45,113, 78, 4, 30, 9, 8, 13, 29,177,242,236, 89,150,103, 54, 19, 21,191,253,166, 83,151,151,147,183, -213,106,249, 15, 87,174,196,189,151,144, 32, 12, 8, 12, 68,234,225,195,158, 21, 6,131, 90,107, 54,155,202,203,203, 89,138,162, - 46,216, 81,246, 8,111, 47,111,249,230,207,190,190,236, 36,228, 51,222, 29,253, 9,161,187,187,128, 39,119, 22,243, 5, 60,115, -215,206,221,197, 0, 34,108,213,145, 72, 36,122,110,244,232,209,242,221,187,119, 19,145,145,145,112,117,117,197,111,191,253,134, -244,244,116, 84, 85, 85,241, 72,146, 68,223,190,125,177,102,205, 26, 4, 6, 6,162,186,186, 26, 69, 69, 69,158, 98,177,216,139, - 36,201,150,174,231,125,237,105,209,162, 69,240,245,245, 5, 69, 81,168,172,172, 4, 69, 81,112,116,116, 4, 0,148,148,148,224, -240,225, 67,246,180, 37,155, 96, 89, 22,143, 63,254,120, 13, 65, 16, 89, 77, 45, 90,109,225,244,247,247,223,165, 86, 87,140, 27, - 49, 98, 4,170,170,170,200, 21, 43, 86,160,103,207,158, 8, 14, 14,182, 39,159, 75, 68, 34,241,183,157, 58,117,250,108,222,188, -121,190,238,238,238, 48,155,205,239,149,149,149, 97,206,156, 57, 0,128,152,152,152,158, 66,161,240,216,140, 25, 51,208,165, 75, -151,210,202,202,202,162,180,180,180, 87, 12, 6,195,205,246,150,221, 78,112,156, 28, 39,199,201,113,254,173, 56,237,213, 34,127, - 83, 40,113,127, 56,135, 45,247, 9,173,184,184, 56, 34, 41, 41,137,181,163, 96,154,142, 29, 59, 6,200,100, 50, 0,208,180, 53, - 23, 12,195,188,230,225,225,161, 90,178,100,201,160,224,224, 96,203,107,175,189,118,179,160,160, 96,105,227, 52,157, 59,119,254, -232,171,175,190, 66,110,110,110, 65, 66, 66,194, 57,141, 70,211,214,117,204, 22,179, 44,214,215, 89,199, 42, 14, 31, 62,220,243, -236,217,179,115, 63,255,252,115,175, 87, 95,125, 85,244,198, 27,111, 76, 3,240,137, 45, 18, 62,159,111,104,110,184,176, 57,248, -250,250, 90,248,124,126,139, 65,226,226, 0,153, 84, 44, 30,190,242,236, 89,214, 82, 80, 96,248,110,221, 58,167,205,127,252,177, -156,100,217, 14,222,222,222, 24, 60,112, 96,173,148,207,175, 80,149,149, 49,222,143, 60,194,191,123,236,152,167, 81, 44, 86,236, -222,189, 91,171,209,104, 14,218, 52,225, 17,132,142, 97, 89,139, 99,199, 64,242,233, 9,163, 34, 47, 95, 74,207,118,242,246,228, -245,233, 29,217, 51, 59,183, 32, 13, 12, 99, 37, 8, 66,103,139,199,197,197, 37, 88,163,209, 64,167,211,193,203,203, 11,235,215, -175,135,143,143, 15, 12, 6, 3, 50, 50, 50,216,142, 29, 59, 18,103,207,158, 69,199,142, 29,161, 86,171, 97,144,143,144,232, 0, - 0, 32, 0, 73, 68, 65, 84,177, 88, 80, 83, 83,163, 50,155,205, 45,173,205, 88,206,227,241,191,231,241,136, 23, 9,130, 64,215, -174, 65,133, 27, 55,110,180, 48, 12,131,176,176, 48, 60,249,228,147,216,191,127, 63, 50, 50, 50,234, 45, 79,150, 78,157, 58, 23, -242,120, 68,167, 58,173,212,110,171, 78,253,210, 62, 10,133, 98, 98, 59,111, 26,158,159,159,223,180,110,221,186,205,125,230,153, -103, 72,177, 88, 12,189, 94, 95,127, 45,200,113,227, 98,170,199,143,143,115, 57,114,228, 72,171,249,180, 88, 44,249, 90,173,246, -229,183,222,122, 43,241,155,111,190,113, 91,186,116, 41, 24,134, 1,203,178,160, 40,170, 97,209,111,134, 97,112,224,192, 1,220, -190,125,251,163, 38, 34,139, 3, 7, 14, 28,254, 39,208, 6, 45,242,119,132, 47,238, 13, 27,162,169,216,250,175, 71,134,231,243, -249,155, 79,158, 60,217,123,200,144, 33,130,145, 35, 71, 70, 30, 63,126, 60,178,180,180,244,102,157,245, 32,114,228,200,145,145, -222,222,222,248,226,139, 47, 12,124, 62,127,115, 59, 79,211,240,210, 43, 43, 43,187, 10,224,211,253,251,247,175,157, 53,107, 22, -124,124,124,194,149, 74,229,127,181,204,206, 18, 73,159, 25,235,215, 83, 66,146,228,125,249,233,167,206,235, 82, 82,214,238,249, -249,103,193,227,143, 63, 78,176, 44,139, 27,215,175,203,214,108,216, 32,159, 58, 97, 66, 65, 78,126, 62,117,232,196, 9,178,188, -180,180,178, 84,173, 94, 6,160,210, 22, 63, 73,146, 23,243,242,242,252, 6, 15,125,220,255,204, 31, 55,211,159,158, 16, 51, 66, - 40,224, 17,183, 10, 74,174,248,250,120,186,164,166,156, 50,146, 36,121,209, 22,143, 94,175,191, 75, 81,148, 59,203,178, 94,169, -169,169,240,242,242, 66, 85, 85, 21, 72,146,132,197, 98,177, 24, 12, 6,169, 70,163,129,201,100,130,217,108,134,179,179, 51,110, -220,184, 81, 78, 81,212,175, 45,113,210, 52, 61, 67, 34,145,124, 40, 20, 10,197, 34,145, 72,113,229,202, 21,232,116,186,206,174, -174,174,159, 80, 20, 5,133, 66,129,179,103,207,190,237,236,236, 92, 0, 0, 82,169, 20, 98,177,196,195,108, 54, 83, 0, 74,219, -123,205, 89,150,109,119,125,249,248,248, 4,202,100,178,149,239,188,179, 40,172, 87,175,222, 80,171,213, 96, 24, 6, 14, 14, 14, - 48, 24, 12,112,118,118,198,128, 1, 3,238,174, 92,185, 82,201,178,152,105, 75, 12,170, 84, 42,181, 64, 32,120,109,214,172, 89, - 31, 6, 7, 7,119,101, 89, 22,221,187,119,199,232,209,163,113,236,216, 49,228,230,230, 66,175,215,211,191,255,254,251, 79, 74, -165,242, 23,238,113,203,129, 3, 7, 14,255, 56,252,201, 55,235, 62,139,214,127, 19, 42,149, 74,157,157,157,125, 60, 45, 45, 45, -110,242,228,201, 72, 77, 77,125, 1,192, 91, 0, 32,145, 72, 94,152, 60,121, 50,210,210,210,144,157,157,125, 92,165, 82,169, 31, -198, 57,197, 98,177,201, 98,185,103,156,146, 74,165,210, 54, 30,222,185,110,200, 16, 0, 58,183,178,175,101,211,136, 64,224,219, - 99,236, 88, 65, 85,122,186,110,235,165, 75, 31, 38, 38, 38, 10, 6, 13, 26, 68,144, 86, 43,104,134, 65, 80, 80, 16, 49, 50, 58, -218,225,251,196, 68,119, 90,175, 63,187,234,157,119,126,219, 50, 99, 70,109, 94,157, 31,152, 45,152,205,230, 13,115,231,188, 28, -157,146,250,155,127,120,232, 35,238,199, 79,166, 92,245,240,112,145, 7,119,235,230,160,169,170,164,151, 46,126, 91, 96, 54,155, -191,180,197, 99, 52, 26, 15,156, 58,117,106, 66, 64, 64,128,215,205,155, 55, 97,177, 88, 64,211, 52, 70,142, 28, 9,150,101, 37, - 0, 24,129, 64,128,236,236,108, 88,173, 86, 85, 94, 94,158,226,214,173, 91, 18, 0,171,109,228,175,208,108, 54, 35, 43,235,222, -168, 93,199,142, 29, 71,197,198,198,130,162, 40,140, 29, 59, 22,135, 14, 29, 26,149,149,149,181,174,177,230,123,208, 58,175,179, -144,133,249,249,249,237,175,219,101,151, 19,188,191,191,127,100, 80, 80,208, 55,171, 87,175, 22,117,236,216, 17, 44,203,194,205, -205, 21, 6,131, 1, 21, 21, 26,132,135,135, 35, 32, 32, 0,171, 87,175, 6,128,159,236,181,184, 41, 20,138, 91, 10,133, 98,178, - 74,165, 18, 85, 87, 87, 71,141, 26, 53,234,139,232,232,104, 92,189,122, 21,191,253,246,219, 84,137, 68,162,178, 90,173,148,143, -143,207, 76,130, 32,156,173, 86,235, 78,141, 70,163,228,158, 93, 28, 56,112,224,240,143, 64,189,143, 22, 26,125,183,205,162, 21, - 22, 22,230, 80, 80, 80,240,124,231,206,157,197, 0, 32,147,201,194,131,130,130, 22,230,231,231,215,180, 53, 55, 6,131, 97, 79, - 98, 98,226,232,207, 62,251, 76, 20, 19, 19,243,200,254,253,251,251, 1, 64, 76, 76,204, 35, 78, 78, 78, 72, 76, 76,180, 26, 12, -134,135, 22, 19,137, 36,201, 33,125,251,246, 69,101,101, 37, 10, 10, 10,218, 52, 44,243,203, 47,191,200,113,207, 47,171,213,125, -173,129,178, 88,220, 92,253,253,121,165, 41, 41,214, 74,157,206,119,200,208,161, 4,105,181,130,199,227, 65,163,209,160,168,168, - 8, 46,174,174, 68,118, 94,158,227,182, 69,139,126,233,220,171,151,152,182, 88, 60,218,144, 77,125,133,170,252,197,215, 95,123, -245,192,206,157, 63,121, 85,235,116,183,101, 50,185, 89, 34, 17,249,204,123,253,117,186,178,178,114, 58,128, 90, 59,120, 86,239, -220,185,115,236,216,177, 99,175, 7, 6, 6,122,171,213,106,159,234,234,106,186,178,178,146,143,123,190, 86, 4, 0,164,164,164, - 64,167,211, 81, 52, 77,159,197,189, 88, 88, 22,123, 51,218,169, 83, 39,151,168,168,168, 97, 94, 94, 94,208,106,181,240,240,240, - 64,239,222,189,135,241,249,252,111, 11, 11, 11,181, 15,179,213, 39, 39, 39, 59,177, 44,251, 24,203,178, 24, 59,118,172, 93,199, -208, 52,253, 82,108,108,172,136, 32, 8, 24,141, 6, 72,165, 50, 56, 56, 56,194,201,201, 25,193,193, 33, 80, 40, 20, 24, 51,102, -140,229,246,237,219,155,148, 74,101,155,219,168, 86,171,141, 31, 48, 96,192,130, 57,115,230,128,162, 40,196,199,199,163,184,184, -120,221,221,187,119,119,251,249,249, 77,123,233,165,151,188, 60, 60, 60,176, 96,193, 2, 25,128, 15,184,103, 23, 7, 14, 28, 56, -252, 35,208,212, 71,235,207, 22,173,214,198, 68,125,124,124, 6, 19, 4,241,158,209,104, 20,215, 15,201, 16, 4, 33,246,242,242, - 58,100, 52, 26, 19,148, 74,101,155,156,226,170,171,171,117,119,238,220, 57,116,241,226,197, 73, 19, 39, 78, 68,114,114,242,116, - 0,152, 56,113, 34, 46, 94,188,136, 59,119,238, 28,170,174,174,214, 61,140,146,251,251,251,143, 27, 58,116,232,196,190,125,251, - 34, 41, 41, 9, 52, 77, 95,104,203,241,141,103, 24,162,153, 89,135,245,251,236, 34,227,243, 65, 16, 4, 40,138, 2, 0, 84,168, -213,200,205,201, 65,101, 85, 21,204, 38, 19,244, 6, 3, 29,220,165,139, 81,107,177, 8, 9,160,173, 99, 95,133,105,151,127, 47, - 50,232,245,222, 30,110,238, 70,185, 92,130,106,157, 86,116,229,242,239,181, 0,110,219,201, 97, 97, 89,118,232,177, 99,199,150, -241,249,252,201,142,142,142,152, 59,119, 46,127,216,176, 97, 16,137, 68, 48,155,205,168,174,174, 70, 98, 98,162,154,166,233,174, -117,199, 56,202,229,242,237,124, 62,191,164,166,166,230, 61,155, 39,176, 88, 98,226,226,226, 4, 22,139, 5,171, 86,173,194,242, -229,203, 49,118,236, 88,193,229,203,151, 99, 0,236,124, 88, 45,158, 97, 24,140, 26, 53,170,177, 51,124,150, 61,199, 9,133,194, -200,110,221,186, 65,173, 86, 67,173, 86,195,203,203, 11,126,126,126,240,241,241,193,186,117,235,216, 47,190,248,226,184,213,106, -221, 84, 81, 81, 81,222,142,182, 56,115,250,244,233, 51, 39, 77,154,132,218,218, 90, 92,188,120, 17, 3, 7, 14,196,218,181,107, -125,207,158, 61,251, 86,223,190,125, 33, 20, 10,145,154,154, 10,138,162,138,185,231, 22, 7, 14, 28,254,215,240, 15,245,207,106, - 21,173, 90,180, 2, 2, 2, 92,105,154,126, 59, 54, 54,118,212,132, 9, 19, 48,102,204,152,251,254,223,185,115,167,211,190,125, -251, 18, 54,108,216, 48,214,106,181,174,110,203, 80, 31,195, 48, 7,118,238,220, 25,243,248,227,143,203,135, 15, 31, 30, 4, 0, - 18,137,196,178,115,231, 78, 3,195, 48, 7,218, 81,150,250,224,142,229, 0,224,231,231,215, 83, 32, 16, 76, 28, 55,110, 92,207, - 23, 95,124, 17, 25, 25, 25, 72, 76, 76,188, 21, 28, 28,124,174,188,188, 77,239,200, 2, 27,179, 14, 19,108, 89,183,248, 98,177, -166,186,172,204,213, 49, 48, 80,232,230,228,164, 76, 74, 74, 10,136,142,142, 38,138,139,139, 81, 85, 85, 5,147,201,132,203,151, - 47, 51, 2,160, 80,224,230, 70, 20, 94,188, 72,240,197, 98, 13,238,159,201,103, 19, 1,190,110,221,223, 95, 60,187,179,201,108, -138,208,106,181,148, 64, 40, 20,118,244,113, 45,206,185,221,166,145, 56,179, 92, 46,143, 2, 32, 96, 24,198,224,238,238, 46, 63, -121,242, 36,196, 98, 49, 8,130, 64,143, 30, 61, 32,149, 74, 69, 44,203, 22, 1,128,147,147,147,120,243,230,205, 46,211,166, 77, -251,205, 22,113,159, 62,125,132, 18,137,228,137,224,224, 96, 92,188,120, 17, 55,111,222, 44,188,120,241, 98,167, 62,125,250, 32, - 48, 48,240, 9, 95, 95,223,159,175, 94,189, 74, 62,140,134,125,111,198,106,219,157,225,105,154,102, 8,130, 0,143,199, 3,195, - 48, 80,171,213,232,218,181, 43, 54,110,220,136,245,235,215,175, 82, 42,149,135,219,147,159,176,176, 48, 81,215,174, 93,167, 79, -154, 52, 9,249,249,249, 72, 72, 72,168, 80, 42,149, 41, 39, 78,156,120,106,206,156, 57,252,129, 3, 7, 66,163,209,224,251,239, -191,167,174, 92,185,242, 93, 89, 89,217, 14,238,145,203,129, 3, 7, 14,255, 98,161, 21, 16, 16, 48, 73, 36, 18, 45,152, 50,101, - 10, 63, 36, 36, 4,229,229,229,112,118,118, 38, 9,130, 16, 2,128,171,171, 43, 41,147,201, 48,123,246,108,244,234,213,107,240, -162, 69,139, 6, 10, 4,130,141, 10,133, 98,187, 61, 39, 86,169, 84, 6, 30,143,183,119,238,220,185,171,211,211,175,118, 5,128, - 63,254,248,227,142, 66,161, 88,172, 82,169, 12,109, 44, 71,125, 80, 76, 66, 34,145, 94,234,222,189,251,221,168,168, 40,231, 9, - 19, 38,192,203,203, 11,105,105,105, 88,179,102, 77,158,197, 98, 89,118,230,204, 25,234,191,125,145, 41,179,185,236,202,193,131, - 78,195,158,125,214,121, 94,108,236,167,175,206,157,251,217,251,239,191, 47, 8, 9, 9, 33, 12, 6, 3, 46, 93,186,196,238,219, -183,143,252,254,195, 15,215,195,193, 65,120,113,223, 62,177,197, 98, 41,108,163,181,100,232,160, 33,131, 67, 62,253,108, 3, 76, -198, 90, 92,186,112, 4, 85, 85,106,108,222,178, 63,196,223,159, 29, 90, 90, 90,122,198, 94, 46,130, 32,130,147,147,147,189, 89, -150,133, 88, 44,198,202,149, 43,225,231,231, 7,103,103,103,212,212,212,224,173,183,222,114,153, 63,127,190, 11, 0,100,100,100, - 52,132,103,176, 5,133, 66, 49, 96,246,236,217, 78, 20, 69,225,248,241,227, 22,130, 32,222, 59,117,234,212,183, 61,122,244, 16, - 15, 30, 60,216,105,199,142, 29, 3, 1,164, 62, 44,161,213,206,227,110,157, 60,121,178,239,228,201,147, 89,161, 80, 72, 84, 87, - 87,195,213,213, 21, 27, 55,110,212, 43,149,202, 35,237,110, 3, 20, 37,150,203,229, 98,150,101,177,119,239, 94, 20, 22, 22,190, -164,209,104,202,104,154,222,255,246,219,111, 47, 12, 9, 9,233,146,147,147, 83, 88, 83, 83,179, 86,165, 82,221,229, 30, 77, 28, - 56,112,224,240,143, 66,189, 19,124,253,236,195, 35,184, 55,156,216,178,208,162,105,122,246,137, 19, 39,248, 12,195, 96,203,150, - 45,184,114,229, 10, 43,151,203,223,147,203,229, 95,201,100, 50,218,104, 52,206,122,229,149, 87,166, 45, 95,190,156, 55,120,240, - 96, 92,188,120,145,215,181,107,215,233, 0, 26, 11,173,104,180, 18,107, 67,171,213, 94, 46, 47, 47,235,218, 40, 64,101, 87,137, - 68,122,217, 70, 97,154,114, 54, 13,138,217,127,229,202,149,122, 95, 95, 95,203,205,155, 55,241,205, 55,223, 48, 87,174, 92, 73, - 17,139,197,155,149, 74,165,217, 78,206,135,129, 6, 78, 49, 69,165,253,184,112, 97,216,163,241,241,204,203, 11, 22,212,138,100, -178, 55, 62,221,176, 97, 81,117, 77,141, 31, 8,130,245,112,113, 41,220,178,114,101,194,216, 39,158,168,205, 56,115, 70,154,158, -156, 44,244, 34,201,107,109,201,103,105,105,233,153,212,212,223,240,195,214,207, 96,181,154,161, 44,189,167,211, 42, 52, 90,216, - 16, 89,127,226,164, 40, 74,251,212, 83, 79,137, 0,200,158,123,238, 57,177, 74,165,194, 35,143, 60, 2, 0,208,233,116, 56,114, -228, 8, 66, 67, 67, 1, 0, 55,110,220,104,216,182,149, 79, 7, 7,135, 39, 6, 14, 28,136,194,194, 66,100,100,100,156, 86, 42, -149, 26, 0,167,139,139,139, 99,250,246,237,139, 3, 7, 14,140,111, 69,104,181,169,142,236, 20, 90,127,226,148,201,100,139,247, -239,223,255,210,133, 11, 23, 38, 47, 92,184, 80, 56,114,228, 72, 0, 64, 77, 77,141, 1, 0,221, 30,206,198,121, 34, 73, 18, 12, -195,192,221,221, 93,175,209,104,160, 82,169,238,170, 84,170,185,183,111,223,110, 23,231,195,104,159, 28, 39,199,201,113,114,156, -127, 19,206,127, 3,236,143, 12,207,178, 44,197, 48, 12, 82, 83, 83,177,127,255,126,218,106,181,206, 84, 42,149, 55, 26, 37,217, -144,150,150,150,252,212, 83, 79,109,207,201,201,225,103,102,102,130,101, 89,186, 45,185, 49,153, 76, 36, 65,252,121,223,131,150, -242,135, 31,126, 64, 89, 89,153,181,184,184,248, 20, 69, 81, 7, 30,112,246,226, 3,207, 58,252, 1, 48, 63, 99,177,156, 90, 62, -104,208,168,101,201,201,146,151,223,125,215,252,194,139, 47,190, 77, 91, 44, 36, 95, 36, 98,196, 14, 14, 60, 90, 34, 17,102,156, - 57, 35,253, 98,206, 28,119,163,217,124, 60,177, 13, 14,230,245, 22,173, 97,195, 6,227,133,151,223,132,177,145, 69,235,226,229, - 92,152,173,104,147, 69,203,108, 54, 71, 40,149, 74, 72,165,210, 34, 0, 62,207, 63,255, 60, 24,134,129,209,104, 68, 77, 77, 13, - 20, 10,133,246,197, 23, 95,164,235,196,147, 96,226,196,137,206,246,240, 6, 5, 5,249, 9,133, 66, 28, 63,126, 28, 66,161,240, - 8, 0, 8,133,194, 35,201,201,201, 49, 83,167, 78,133,191,191,127, 80,126,126, 62, 1, 27,254,105,222, 17,241,123, 88,160, 59, - 8,116,187,103,130, 67, 55,175,136,248,235, 4,144, 87, 23, 53, 62,171, 79,159, 62,128,157,126, 89,141, 81, 55,185, 99, 61, 73, -146, 63, 47, 90,180,104,110,255,254,253, 71, 47, 95,190,156, 0,192,127, 24,119, 32, 69, 81, 15, 20,122,130, 3, 7, 14, 28, 56, -252,173,173, 90,127, 66,139, 66,139, 32,136, 45, 67,135, 14,157, 9,128, 79, 16,196, 55, 10,133,226, 70,211, 52, 74,165, 50,215, -207,207,239,147, 46, 93,186,204, 2,192, 18, 4,177,165,141,153, 42,103, 89,172,225,241,136, 69,247,196, 93,187, 2, 84,214, 47, -117,178, 8, 0,193,227,241,183, 95,189,122,245,221,162,162, 34,181,157, 22,136, 86,241, 48,102, 29, 2,192, 79,192,221, 41,133, -133, 39, 22, 68, 70, 70,143,157, 51, 7, 61,199,142,117,246,235,212,137, 54, 90,173,204,141,115,231,136, 11,123,247,138,210,147, -147,133, 70,179,249,248, 1,160,168,173,249, 44, 45, 45, 61,243,107,202,153,147, 79, 79,140, 25, 29,212,197,239,158,104,184,171, - 64, 69,165,246,100, 91, 68, 86, 19,209, 27,191,113,227,198,195, 34,145, 72,208,120, 41, 27,171,213, 90,105, 54,155, 35, 0,160, -170,170,202,111,203,150, 45,187,120, 60, 94,161, 45,190,204,204,204, 67,203,150, 45,155, 88, 80, 80,112,178,184,184,184, 0, 0, -138,138,138, 10, 72,146,220,174, 84, 42, 39, 22, 22, 22,238,131, 29,147, 0, 88,160,123,198,185,159,123, 0, 64,196,160, 73,200, - 56,247,179, 20, 64,143,136, 65,147, 0, 0,237, 93,203,176, 49,234, 66, 43,188,119,241,226,197,157,163, 71,143,126, 5, 15, 16, -211, 11, 0, 44, 22, 11,105, 52, 26, 41,154,166, 5, 86,171,149,181, 88, 44, 36,247, 76,226,192,129, 3, 7,251,193,178,108, 95, - 0, 94,117, 63,235, 13, 40, 94, 77,182, 45,168, 91, 46,176,254,241, 91,247, 91, 77, 16,196,229, 70, 28, 13,251,237, 56, 22, 0, - 42, 0, 92, 39, 8,162, 37, 35,200,150,150,126,183, 40,180, 20, 10,197, 62,216,177,104,180,189,233, 90,193,146,186,117,226,128, -246,175,237,214,192, 65,211,116,121, 81, 81,209, 3, 87, 40,143,199,187, 59,126,252,248, 54,165,183,149,102, 55, 80,248,186,217, -188, 35,233,203, 47,123, 31,255,230, 27,127,154,162, 60, 8,128,229,139,197, 26,139,197, 82,224, 69,146,215,218,106,201,186,207, - 26,115,167,116, 76,254,157, 82,116,235,214,141,189,117,235,214, 61, 91,207,131,225,154, 94,175, 15,176,213, 4, 12, 6,195, 96, - 59,197,224, 79,165,165,165, 63, 53, 35,216,119, 41,149,202, 93,246,102,170, 97, 81,105,128,199, 16,204,211, 17,131, 38,237, 5, -192,212, 47, 42,253, 48, 81, 86, 86,150,131,186, 56,111, 15,130,194,194, 66, 51, 65, 16, 63,174, 89,179,230,185,244,244,244,221, - 10,133,194,204, 61, 54, 57,112,224,192,161,109, 34,139, 32,136,164,186,223,113,117, 70,161,164,166,219,245,105,234,211, 53, 78, - 83,207,209,116,127,107,199, 2,192,226,197,139,223, 77, 72, 72,144, 3,176,119, 49,230,118, 47, 42,253, 87,161,252,111,194,209, - 88, 20,108,253, 43, 10,250, 37, 96, 1, 69,253, 14,170,145, 79, 62,249,112,141, 27,183,110,221, 34,254,205, 55, 92,253,162,210, -141, 16,249, 79,200,119, 65, 65,193,198,192,192,192,205, 10,133,130, 2, 7, 14, 28, 56,112,104, 11,188,154, 19, 70, 45,136,178, -184,214,254,191,175,227,222, 76,186,230,126, 19, 4,145,148,144,144, 16,215,134,252, 54, 88,180,120, 92,221,113,224,240,223,195, -255,199,172, 87, 14, 28, 56,112,224,208, 60,154, 90,177,234,197, 87,211,223,139, 23, 47,126, 23,173,143, 56,249,226,158, 21,203, -183,238,119,131,191, 22,129,123, 51, 7,154, 67, 91,102, 19, 68,183,163,124,167, 56, 78,142,147,227,228, 56, 57, 78,142,147,227, -252,159,227,180,197,125,170, 25, 65, 20,219,210, 80, 95,107,195,136, 77,183,109, 29,107, 43, 45, 65, 16, 45,133,249,169, 31, 42, -108,250,253,151, 35,154,227,228, 56, 57, 78,142,147,227,228, 56, 57, 78,142,243, 65,192,178,108, 95,150,101, 99,113,111,194, 20, -203,178,108, 44,203,178, 99, 23, 47, 94,188,164,126,223,226,197,139,151,176, 44, 59,178, 62, 93, 93,154,134, 99,234,247, 53,253, -110,186,175,181,180,173,100,113,102,147,237,134,223,127, 23, 31, 45, 14, 28, 56,112,224,192,129, 3,135,102, 81, 63, 99,176,145, -181, 73, 13,224, 70, 66, 66, 66, 85, 35,223, 41, 53,128,107, 0,122,213,165, 83,215,137,180,198,190, 85,150,186,223,150,102,210, - 88,236, 73,219, 2,182,180,176,205, 9,173,150,208,203,135,247, 97, 96, 71,239,168,186, 10, 0,203, 48, 0, 0,166, 46, 6, 18, - 91, 31, 12,137, 97,192,178, 44, 20,170,234,180, 27, 42,188,223,222,243, 5,251,193,221, 91, 42, 93,207,176,236,160,186, 93,103, -180, 26,243,155, 25, 58, 84,219,203, 17,218, 1, 97, 82, 30,222,102, 88,244, 4, 0, 30,129,235, 38, 6,159,100,151,183, 61,158, - 84,115,237, 60,194, 11, 51,197, 50,249, 20, 23, 87,183,110, 85, 85, 21,121, 86,147,249,231, 76, 53, 54,163,237,235, 50, 34,200, - 13,143, 49, 44,222, 5,192, 19,242,176, 46,175,210,238,153, 28, 28, 56,112,224,240,160,214,145, 7,138,139, 71, 16, 4,221, 12, - 39,241,128,156, 92,128, 61, 59,196, 86, 51,187,255,104,102,223,229,191, 83,190,219, 36,180,194,189, 48, 7, 4, 86, 0, 96,193, -226,131, 76, 53,190,110,211,241,190,136,150,242,249,219, 0,240, 77, 86,122, 1,203,224,108,179, 23,147,135, 33, 82, 17,127, 29, - 0,198, 68,211, 51, 50,149,246,251,139, 69,248, 99,172,128,225,253,200,176,172,144,102,216,237, 96,145,228, 40,194,249,223, 75, - 97,106, 75, 94, 3, 59,122, 71, 29,252, 67, 57, 58,229,235,121,232,223,243, 17,176, 52, 5, 48, 36,228,131,223,198,233,207,159, - 71,255,176, 64,176, 12, 9, 48, 20, 28,199,125,138,113,145, 46,236, 13, 85,251,214,193, 14,246,131,123, 39, 79,239,155, 91,183, -110,243,241, 11, 10, 39, 24,202,138,156, 63, 78, 78,155,191,104,217,136, 8,104, 35,237, 17, 91, 61,125,241,114, 96,231,144,183, -223, 92,241, 25,223,215, 47,192,129, 33,205, 84,217,221,172, 62, 27,214, 46,219, 39,226, 21,174,187,174,196, 54,123,219,114,184, - 23,102, 9, 36,226, 73, 50,169, 67, 55,131,161,230, 22,109, 37,127,230, 9, 5, 99, 63,249,116,125,239, 97,163, 98, 28,233,154, - 50, 30,201, 32,124,207,238, 93,157,190,220,184, 41,230,166,146,126, 2, 0,211,150, 50, 51, 44, 22,229,238,152, 25, 35, 20,240, -137,176,151,182,242, 1,170, 93, 66, 43,204, 27,207, 16, 44,108,134,151, 96, 9,252,150,165,194, 79,237, 57, 71,168, 55,190, 37, - 88, 4,131,192, 94,130,197,174, 76, 53, 84,220, 35,143, 3,135,127, 23,120, 60, 94, 10,195, 48,195, 31,178, 48,120,140,101,217, -223,185,171,251,191,141,182, 89,180, 8,172,202,184, 93,236, 6,218,138,136,224,160, 15,129,182, 9, 45, 41,159,191,253,114, 94, -185, 15, 40, 43,182,126, 52,119,183,133, 4, 40,210, 10,154, 34, 65, 83, 36, 40,202, 10,154, 36,193,146,102, 44,251, 46, 5,176, -212, 32, 42,178,251,118,128,246,181,247, 28, 66,150,247, 99,218,185,147,238,132, 69,139,159,190, 78,120,189, 88, 93,251,250,169, -235,138,138,112,111,227,146, 76, 21,190,111,139, 32, 72,249,102, 30, 18, 15, 28, 41,249,226, 91,125, 54,195,178,112,119,150,133, - 76,139,203, 8,216,113, 40,165,120,253,118, 83, 54, 0,184, 56,136, 67,166, 95,207, 11,124,144, 74,240,150, 74,215,111,222,244, -165,143,175,135,140,160, 46,172, 6, 69,211, 8,232, 20,203, 95,242,218, 52,223, 85,159,111,251, 28, 58,243, 11,173, 29, 31,226, -141,240,206, 93,194, 22,108, 63,114, 33, 80,175, 83, 89, 78,238,124,247, 54,204, 32,125,252,195,132, 31, 38,124,198, 95,250,206, -188,183, 44,116,201,165, 28, 21, 50,109, 61,107,194,188,113, 40, 97,245,167, 61, 71,140,139,115,100,106,213,124,147,190, 54,120, -235,119,219, 86,132,246,236, 39, 31, 28,217, 81,164,250,121, 54, 97,172,169,132,149, 39,149,140,136,136,118, 54, 62, 55,149,220, -250, 67,226,107,153, 42,108,104, 75,153,105,246, 63,109,143, 97,218, 31,117,157, 96, 49, 56,253,247,148, 89,180,226, 50, 88,154, - 4,104,107,195, 55,104, 18, 44,115,239,187,255,236,239, 0,180, 79,104,241, 88,140, 62,117,238,178,111,121,153,178,239,231,159, -126,188,132,189,124,249, 24,104,252,152, 85,137, 51,109, 21,152, 28, 56,112,248, 91, 91, 76, 40,150,101, 5, 15,153, 51,134,101, -217,163, 15, 72,243, 54,128,151,235,182,183, 1,248,228, 33,100,173, 35, 0,159,186,237, 50, 0, 37, 92, 11,120, 32, 52,117,126, -111,119, 28, 45, 41, 88, 6,216, 59, 1, 0,100,109,205, 5, 11, 72, 65,240, 1, 82,143,248,113,163,224,233,237, 3,144, 6,192, -106, 0, 72, 35, 64,234, 1,210,136, 10,101, 33, 96,213, 3,249,199, 64,177,172,164,205,197, 53,107,129,220,159, 49,178, 79, 32, -188, 92,164,152, 23, 31,238,185,229,120,238,182,109, 39,115,162, 51, 85,152, 98, 87, 94, 89, 22,253,123,116,195, 23,219,244,217, -191, 92, 85,143, 1,128,152, 94, 30,199,251,135,119, 10, 88,191,221,148,125,244, 70,213, 88, 0, 24, 27,225,124,172, 95,136,111, - 32,131,246, 91,125, 25,150, 29,236,215,185, 27, 65,167,111, 6,163, 43,129, 78,103, 68,201,221, 29,112,243,127,148, 71, 51, 24, -106,235,120, 25, 31,139,223, 88,186, 70,104,208,149, 91, 24,171,154,246,226, 87,241, 5, 98,134, 64,233, 25,115, 45, 83, 77,191, - 57,243,121,106,193,251, 31, 45, 6, 48,173, 53,158,112,111,188,182,110,221,250, 30, 3,163, 66,189,203,246,205, 35,106,171,202, - 65,241,229,146,248,199, 7,194,181,123, 56, 83,158,186,142, 16, 7, 69,195,213, 35, 8,165, 23,118,162,224,247,253,196,160, 62, - 19, 37,223,255, 36,122, 14,176, 54, 43,180,186,121, 98,208,152, 33,253,118, 7, 5,250,249,178, 44, 3,134, 97,193, 50, 52,106, - 77, 36,150,236,201, 7, 77,211,120,106,204,160,145, 14, 98,130,101, 24, 6, 44,203,160,184, 76, 99,248,245, 82,246,200,252, 42, - 92,178,199, 82,213,235,177,225,131,174,167,253, 30, 74,230,254,130,168,105, 9,217, 4,112,174, 81,155, 27,116,245,196,247,161, -192,119,237,215,114, 4,232,130,227,171, 17, 56,100, 38,127,243, 79,199,189,180,234,210,233,251,118,108,122,250,235,205,155, 19, -179, 85,152,205, 61, 95, 56,112,248,119,128,101,217,135, 46,182, 10, 11, 11, 21, 15, 34,182,252,253,253,135,148,150,150,174,173, -247, 86, 33, 8, 98,109,231,206,157,151,253,167,163,122, 95, 95, 79, 75,211,244,180,210,210,210,179,173,113,198,198,198,250, 29, - 57,114,164, 75, 35,206, 46, 0,186, 52,151,214,213,213,149, 30, 48, 96, 64,193,145, 35, 71, 20, 92, 11,105,151,224,106,179,208, -202, 46,250,121, 94, 31,179,178, 22, 0,178,237, 72,127,223,144,159,137,164, 87,255,176,226,249,213, 17,157,221, 81,163,183,224, -228,149, 2,208, 52, 9,154,162,234, 44, 91, 20,104,138,196,152, 94,158, 24, 96,154,141, 13, 73, 57,160,104, 38,161, 53,206,166, -176,178,204, 51,189,163, 39,239, 97, 24, 86, 44, 17,242,180,193, 1, 30,222, 11,158,234,197,155, 23, 31, 1,163,149,154,188, 51, -245,246,175, 89, 42,108,181,139,147,249,115,200, 35,182,185,125, 52,101,179,236,173, 88,163,250, 71, 15, 27,236,204,154,181, 32, - 43,242, 81, 99, 32,145,175, 33, 81,102,170,134,132, 80,218,197,201,176,232,217,209,223, 87,126,126,247, 59,119, 61,248, 58,129, - 55,159, 18,137,121, 20,104,134,229,179,213,153,102,247,208, 81,194,122,191,173,214,242, 41,147, 59, 61, 63,100,116,172, 75,209, -206,153,132, 44,120, 12,188,251, 4,224,238,217, 31,160,186,146, 4,141,162,128,112, 54, 85,163,131,199, 35, 24, 55,109, 10, 62, -153,210, 23, 53,186, 26,240,149,183, 93,196, 66,137, 43, 96,109,150,147,165, 49,109,221,154,143,124, 5,124,222,189,235, 89,255, -161, 73, 24,205,102,128,166, 32, 21, 48, 32,216,250,255, 72,208,164, 85,222,115,226, 59,115, 1,250,146,173,178,103,169,240, 83, -184, 23, 6,131, 33, 67, 89,210, 8, 2, 56,151,169,254,143,248, 9,243,198, 51,143,142,121,113, 48, 75,224,183,246,212, 81,164, - 7,226,162,186, 56, 58, 56,232,178, 81,178,247,117,220,134,148,237, 48,240,101, 60,243,210,107,242, 45, 91,182,140, 7,216, 57, -184,223, 71,237,175, 88,100,149,227,228, 56,255,145,156,206,206,206, 93, 59,119,238,188,140, 36,201, 33, 34,145,168,131,213,106, - 5,195, 48,101, 98,177,248,183,130,130,130,149, 58,157,238,206,223,173,236,215,175, 95,111,139,216,178,201, 41, 20, 10,145,147, -147,115,171, 13, 98,235, 84,147,227,127, 60,119,238, 28,246,236,217, 3, 0,200,205,205, 69,247,238,221, 29,154, 59,240,238,221, -187, 14,195,134, 13,251, 17, 64, 64,107,156, 55,110,220,232,250,203, 47,191, 96,239,222,189, 0,128,156,156, 28, 4, 7, 7, 55, -155,153,115,231,206,241,159,125,246,217,174, 0, 20,255,133, 58,250, 55,136,172,198,223,255, 17, 90, 73, 73, 73,108, 92, 92, 28, -209,116,187, 25,228, 7,186,137,251,192, 68, 3, 64,126, 91,115,144, 85,142, 53, 95,236, 56, 49,246,244,222,141, 67,164, 34, 30, -150,111, 93, 80,172,174,172,121, 76, 64,220, 27,126,161, 88,240,220, 28,197, 23, 19,166,247, 10,172,170, 53,225,240, 31,165,103, - 51, 85,109, 51,145,102, 42,145, 12, 48,174,247,126,209, 48, 25, 85,193,211, 63, 73,222,181,107,241,216,158,111,198,247,196,161, - 11, 5,111, 2,148,205,168,239, 44,195,128,101,168, 6,231,247,186,174, 3,192,220,191, 40, 48, 3,246,222, 62,166,109, 22,173, -161,128,160,202, 27,227,156,228,226,175,102,205,122,197,153, 84,231,161,210, 34, 66,113,149, 9,101, 70, 33,106, 5,222, 40,205, -190, 65,243, 8, 36,219, 52,185, 16,208,177,148,201,213, 77,236,200,139, 28, 53,215, 95,119,252,221, 42, 49, 65,241,157,159, 92, -229, 90,113,250,179, 2, 74,175,214, 19, 4,108,134,159,119,113,113,237,110,210, 20,240,181, 85, 21,112,245,137,192,216,201,113, -248, 32, 54, 28, 53, 58, 61,212,149, 23,217,110,190,206, 68,225,111,137, 88, 58, 46, 12,154,114, 37,204, 36, 64,232,205,149, 38, -139,169,182,197,235,200,195,230,249, 11, 23, 61,211,201,215,203,161,126, 82, 1,203,208,232, 21, 22,132, 81, 67,250, 35,249,220, -121, 92,190,145, 11,166,110, 82, 1,203, 48, 40, 81, 85,149,155,172,244, 15,109,186,160, 52, 5,150, 52, 53, 43,196,208,142, 33, -195, 72,111,200,105,224,253,190, 93,157,102, 44,142,235,228,228, 32, 33, 96, 34,105,152, 44, 36,106,206,127, 5,143,206, 61, 32, -151, 74,137, 62, 48, 10,174, 2,220,186,133, 28, 56, 52,194,211, 79, 63, 45, 45, 47, 47, 79, 13, 8, 8, 8, 31, 53,106,148,124, -240,224,193,208,235,245, 56,121,242, 36,244,122,125,167,128,128,128, 78, 39, 79,158,156, 88, 84, 84,148,217,177, 99,199, 97,123, -247,238,181,219,135,182, 78, 0,241, 27, 30,193, 0, 69, 16, 4,234,246, 17,117,251,218,189,206,173, 88, 44, 70, 97, 97,225, 67, -183,108,149,150,150,222,106,143,101,171,182,182, 86,228,239,239, 15, 47, 47, 47,208, 52, 13,189, 94,143,131, 7, 15, 66,171,213, -130, 97, 24,200,100, 50,172, 90,183, 21,217, 87, 83,113,233,210, 37,104,181, 90,145, 45,206,146,146, 18,162, 87,175, 94, 48,155, -205,160, 40, 10, 38,147, 9,167, 78,157,106,248, 45, 16, 8,176,232,195,207,145,123, 37, 21,233,233,233, 40, 41, 41,249,175,172, - 54,210, 6, 45,242,119, 68,139, 49,179,254,235,179, 14,105,154, 90,178,101,251,174,139, 75,102, 79,193,107, 83,163, 3, 86,110, -220, 31,157, 85,129,237, 0, 16,230,137,233,207, 13,239, 22,232, 42, 23,226,131,157, 87, 0,150, 93,242,160,231,203,168, 68,110, -120, 7,230,205, 3,151, 10, 83,223,157,210, 7, 65,190,206,221,171,196,149,226,252,124, 59,214, 20,100, 40,184, 57, 74, 66, 98, -122,121, 28, 7,195,192,213, 73, 18, 10,154,130,171,163, 36,100,108,132,243, 49, 0,112,150, 11, 67,155,179,124,181,132,168, 0, -225, 76,185, 68, 48,211,193,201, 53,240,133,241,163,100, 49,227, 39,202, 28,133, 20, 52,151, 78, 66, 39,236, 8,210,189, 19,204, -100, 37, 74,238,220,166, 79,255,158, 85, 90, 81, 99, 94, 96, 51,155, 44,206,150,222,201,241,234,218,115,148, 91, 69,210, 82, 85, -215, 23,119,118,225,129,225,213, 36, 62, 89,238,224,221, 79,246, 71,254,157, 90,134,109,214,162,115, 31,116, 90,109, 1, 73,195, -215, 72, 11,156,110,167,124,143,197,227,122,160,170, 82, 5,147,149,130,214, 72, 89,125, 92,165, 18,243,157,155, 48, 91, 41, 88, - 72, 6, 66, 87,127,156,188,120,163,130, 33,201, 99, 45,113,230,107,144,158,127, 48,221,177,241,190, 32, 79,244,122,199, 89,150, - 14,210,136,194, 18, 5,182, 31,185,216, 39, 95,131,244, 7,169,103,150,161,238, 13, 63, 55,178,100, 17, 44, 6,183,199, 9, 62, -212, 27,253, 68, 82,209,151,107,223,124, 54,252,241, 96,119, 9, 83,114, 17, 4, 99,133, 3, 45,128, 81, 76,195, 37, 32, 8,140, -165,134, 53,152, 76,213, 25, 0, 23,233,157, 3,135, 70, 8, 9, 9,241, 41, 45, 45,205, 88,184,112,161,251,147, 79, 62,137, 3, - 7, 14, 64,167,211,225,135, 31,126,192,250,245,235,177, 98,197, 10,144, 36,137, 45, 91,182,200,247,237,219,215,111,211,166, 77, - 37,129,129,129, 17, 69, 69, 69,101, 54, 4, 22, 1, 64, 2, 64, 88,247,238, 34, 0, 48, 71,143, 30, 69, 76, 76, 12,142, 30, 61, -202,212,237,163,113,175,243,211,174,245, 68,197, 98, 49,196, 98, 49,180, 90,237, 67, 17, 91, 66,161, 16,142,142,142, 16,139,197, -168,169,169,105,179,216,162, 40,138, 95, 82, 82, 2,173, 86,139, 81,227,199,227,243,132, 4, 12, 31, 62, 28,163, 70,141, 2,203, -178, 56,117,234, 20,162, 7, 70, 98,202, 19,195,144,149,149, 5,138,162,236,202,111, 89, 89, 25,202,203,203, 49,118,252,120,108, -221,180, 9,253,251,247, 71, 72, 72, 8, 40,138, 66,106,106, 42,158, 30, 51, 16,210, 9,209,200,205,205,229, 26,181,253,214,172, -135,226,163,245,192,200, 80,227,119,230,208,153,164,169, 99,250,197,141, 31, 20,142,173,187, 79,127, 4, 47,221, 46, 0,240, 48, - 75, 86, 61, 63, 60, 8,153, 69, 85, 56,157,174, 72,202,170,192, 67,153,173,193,208,240,244,112,150, 3,124, 49,140, 86,134,114, -206,183,237,192,204,176, 44,228, 67,222,193,115,227, 51, 3,250,135, 7, 4,212,207, 58,116,140,249, 12,211,111,220, 10,236, 27, -226, 19, 8,154, 4,104, 18,206, 83,118, 2, 31, 58,216,204,199,192, 46,226,228,249,243,230, 13, 24, 55, 97,178, 76, 44,119, 1, -173, 43, 6, 89,118, 3,154,188,179,208,203,187,163,172, 48, 31,123, 78, 92,210,230,149,104,116, 60, 30, 78,150,107,205,111,231, - 87,161,214, 22,175,137, 68,194,178,165, 11, 98,247,236,218,237, 36, 9, 26, 68,220,254, 42, 70, 43, 22, 80, 18,175, 46,143,242, - 12, 82, 79,246,227, 31,118, 59,235, 45, 88,109,139,199,160,215,237, 63,117,242,248,148,110, 93, 7, 57,221,189,124, 4, 70,147, - 25,102, 18,136,232, 55, 12, 52,205,138, 9, 30,193, 56,243,249,132, 74, 83, 5,130,164,203,127,187,118, 87,121,238, 90, 62,223, -236,132,213,173, 70, 23,105,170,238, 9,254, 27,227,135,245, 6, 72, 35,158, 24,210, 3,159, 39,158,126, 29,160, 95,124,176, 74, -190,103,209, 98,129, 65,225, 94,248,134,101, 49,232,202,193,245,161, 81, 19,230,163, 45, 22,173, 8, 79,140, 11,235,234,247,253, -231,171,222,113,247,232,216,157, 79, 48, 36, 88,159,158,128,174,132, 37, 74, 46,194,197,191, 63,104,191,129,216,178,225,211, 90, -134, 97,119, 1,224,166,100,115,224,208,248,121,100, 50,237, 95,179,102,141,123, 92, 92, 92,189, 69, 6, 23, 47, 94,196,182,109, -219,224,224,112,255,115, 50, 38, 38, 6, 44,203,186, 47, 95,190,124, 63,128,199, 91,226, 28, 48, 96,192,248,244,244,116, 69,239, -222,189,243,235,196,150, 8, 0,239,230,205,155,188,226,226, 98,194,205,205,141,245,243,243, 35, 21, 10, 5, 3,128,126,233,165, -151,248, 63,255,252,115, 55,189, 94,127,166,189, 66, 75, 44, 22, 63, 20,159, 45,161, 80, 8,130, 32, 32, 22,139, 33, 18,137,192, -178,108,155,196, 22, 77,211,130,163, 71,143,226,202,149, 43, 88,209,187, 55,222,244,247,135,187,187, 59, 82, 83, 83,193,178, 44, - 28, 28, 28, 80, 89, 89,137, 93,187,118, 97,196,136, 17,160, 40, 74,100, 15,239,222,189,123,145,150,150,134, 15,163,162,240,166, -139, 11, 28, 29, 29,113,234,212,189,209, 64,137, 68,130,194,194, 66,156, 58,117, 10,195,134, 13,227, 26,245, 3,194,238,198, 51, - 20, 16, 84, 18,240,177, 90,140, 96, 41, 22, 32,224, 23, 22, 6, 81, 86,214,253,206, 57,246,128,199,195,210, 13,219,147, 98, 63, -155, 63,158,152, 25,223,199,111,229,247, 41,115, 0, 96,198, 83,193,254,114,137, 0, 95, 28,202,100,121, 60, 44,125, 24, 5, 12, - 11,131,136,208, 96,206,168,254, 33, 80, 84, 91,112, 91, 81,253,107,150,157, 67, 61,167, 63,123, 14, 59, 14,167, 22,175,223, 97, -202,102, 89, 22,174,142,146,144,233,215,111, 7,126,127, 52,173,104,221, 30, 83, 54,203,176,112,149, 11, 67, 95,204, 26,104,115, -214, 97, 84,128,112,230, 91, 11, 22, 12,140,127,113,161,148,202,254, 25,150,219, 39,192, 88,141,208, 89, 69,168,230,251,160,164, -168, 8, 31,111, 73, 42,214,233, 45, 83, 50,212,109, 19,152,121, 26,212, 10, 8,221,147, 31,127,240,110,114,194,170,229,142,198, -252,212, 90, 62, 65, 25,249,157,135, 10, 86,173,248,140,168, 49, 91, 38,231, 87,161,198, 22,143,217, 9,171,215,172,219, 16,251, -202,180,137,217,193,221,135,122,208,138, 59, 30, 38,157, 78,181,243,120,154, 79, 93, 79,145, 0,128,219, 37, 26,168,181,122,138, -166,200, 51, 78, 66,172,204,180,199, 58, 88,135,174,222,240,138, 27, 20,241,172,151,147, 8,198,218,106,120, 59, 9, 49,166,255, - 35,207,146,127,228,190,115, 71,213, 22,185,214, 84,104,145, 96, 73, 35,126, 95, 61, 34,148,165,201, 80,208, 36,172,215,127,108, -187,101,140,192,155,175, 13,113,116,118,179,220,229, 65,239, 0,200, 60, 65, 56,119, 2, 92,186, 16,194,176,201, 80,228,103, 80, -175, 63, 59, 77,115,167,160,228, 91, 79,217, 67,153,249,195,129,195,191, 10,133,133,133,207, 47, 89,178,228, 92,255,254,253, 59, -120,122,122,162, 71,143, 30, 4, 75, 75,198, 0, 0, 32, 0, 73, 68, 65, 84, 56,124,248, 48, 22, 46, 92,216,144,166,119,239,222, - 96, 89, 22,149,149,149, 88,179,102, 77,153, 66,161,120,190,213, 14,122, 70, 70,246,142, 29, 59,134,132,135,135, 91, 69, 34, 81, - 53, 0, 73,117,117,181,180,178,178,146, 48,153, 76, 96, 24,134,113,113,113,161, 21, 10, 5, 57,101,202, 20,243,133, 11, 23, 30, -209,235,245,133, 15, 98,209, 10, 8, 8,184,169,209,104,180, 4, 65, 60,112,232,135,122,145,229,233,233,233, 85, 91, 91,203, 0, -168,106, 79,232, 7,138,162, 16, 21, 21,133, 19,103,175,226,232,233, 11,208, 41,114, 48,231,149,231,209,163, 71, 15,156, 56,113, -162,221,117,214,171, 87, 47, 28, 63,117, 14,231,174, 92, 67, 97,238,117,188, 62,231, 21, 68, 68, 68,224,248,241,227, 92,131,182, - 31, 71,112,191,111,214,145,166, 66,107, 88, 82, 82, 82,125,207,252, 79,242, 53,212, 19,189,132,174,226, 31,151,143,123, 36, 76, - 56,106, 57, 8,161, 12, 63,119, 63, 62,112,233,199, 95,101,243,189, 11,167,221, 84,217,158, 29,118,223, 77,163, 66, 6,123, 41, -251,167,107, 89,161,207, 62,209, 63, 0, 91, 15,203,223, 7,128,201,131,187,226,143, 60, 53, 46,229,170,126,202, 84, 35,227, 65, - 75, 29,233, 13, 57, 93,129,159,214,188, 17, 63,172, 83, 71, 31,108, 59,112, 14, 4,129,253,118,189,112, 89,150,237, 31,222, 9, -235,119, 52,157, 97,232, 19,184,110,143, 41,251,100, 70,205, 56, 0, 24, 21, 42, 63,214,247, 17,183, 64,182,177,227, 86, 51,144, -137, 5,179,198, 77,124, 78, 74,229, 30, 6, 10, 78,129,160,204, 48, 90, 25, 40, 43,106, 96,112, 9, 64,234,197,107, 70,173,201, - 50, 63, 83,221, 62, 43, 94, 86, 5,242, 69,151,175, 21,213,234,141,190,114,175, 71, 76,124, 30,195,212,154, 89,252,145, 89,160, -203, 44, 67,142, 61, 28,249,249,176, 60,230, 79, 13,254,102,251,158,101, 66,145,120, 50,159, 0,225,237,234,224,245,205,103, 31, -194,201,201, 17,140,165, 22,208,171,241,228,171, 31,171,111, 42,200,174, 0,208,221, 3,142,131,187, 10,183, 11,120, 68, 73,202, -109,235,123,182,206, 65,144,152, 61,109, 76,111, 33, 99,209,227,141, 53,187,177,249,157,120, 60, 55, 50, 76,120,228,124,238,108, - 0, 43,219, 91,215, 44, 77,129, 37,141,120,252,221,179,217, 4,112,142, 5, 6, 93,217,179, 42, 20,184,106, 55, 71, 31, 64, 72, - 11,136,176,158,129, 14, 34,166,228, 60,152,146,243, 44, 63, 96, 32,136,192, 33, 4,225, 19,197,126,185,118,133,126,235,214,109, - 39, 25, 30, 62,176, 35, 84, 6, 7, 14,255,171,200, 87, 40, 20, 99, 99, 98, 98, 78,159, 56,113,194, 61, 50, 50, 18, 0,112,229, -202,149,123,157,206,168, 40, 4, 7, 7,163,188,188, 28, 83,167, 78,173, 80, 42,149, 99, 97,195,231,183,166,166,230,206,222,189, -123, 59,232,245,250,222,239,189,247,158,170, 83,167, 78, 58,147,201, 68, 84, 87, 87, 51, 20, 69,193,205,205, 77,220,187,119,111, - 12, 24, 48,160,246,226,197,139,157,139,139,139,107, 0, 20,180, 39,243,241,241,241, 56,123,246,222,164,189,135, 17, 87, 75, 36, - 18, 33, 50, 50,210, 63, 63, 63,191,180,238,221,210,230,103,124,227,215,203,181,107,215,112,230,106, 9, 4, 22, 35,196,106, 5, -126, 63,176, 23,227,103,205, 5, 69,181,223,139,225,255,216, 59,239,240, 40,170, 54,138,159, 41,219,178,233,101,211, 11, 33,144, - 64, 32,244, 78, 16,144,166, 18, 62,138, 84, 65,154, 64, 64, 20, 16,165, 35, 69,165, 35, 69, 58,168,244,142,148,160, 2, 81,122, - 9,157,132, 36, 4, 2,132,180, 77,239,217, 62,229,251, 35,197, 4, 82,118, 19,108, 56,191,231,153,103,182,204,158,157,153,187, - 59,247,204,123,239,125,239,253,251,247,113, 60,244, 6,204,165, 52, 30, 61,122,136, 35, 71,142, 96,226,196,137,181,210,172, 33, - 85,122,145,127, 56, 74, 84,210, 79,139, 6,128,160,160,160,139, 37,209,138,178,248,248, 64, 34, 45,192,130, 30, 45,220,102, 12, - 14,172, 71, 25,242,146,193,177, 28, 40, 17,224,232, 96,133, 61,123,246,215,221,127,240,224,245, 77, 27, 55,173,231, 24,102,110, - 68, 26, 84, 38,236,212,130,111, 15, 94, 25,188,103,122, 23,122,226,187, 13,237, 0, 64, 76,147, 88,119,242, 33, 3, 96, 65,109, -142,182,157, 27,100, 5, 6,140,119,180,183,158, 63,251,163,222,118, 93, 90,249,225, 98, 88, 4,214, 31,185,126, 73,146,134,221, - 70,255,184, 57, 3, 94,246, 79, 21,141, 58, 4, 87,125,191, 75,150,229,157,197,230,182,208,199,157, 7,244, 26,104,180,122, 36, -100,178, 72,200,210,128,150,139,113, 59, 38, 81,109,159,130,144, 90, 28, 54, 97, 46,151,185,126,249,205,106,119,141,186,128,201, -203,206, 96,196,146, 27, 34,185,153, 84,105, 74, 87,133, 27, 73,208,188,229, 45,106, 9,112,148, 68,198,171,230,124, 54,202, 60, - 41,242, 12,234,147,201, 32,120, 30,102,254,189, 97,105, 70,137, 3,235,136,226, 1,192,220, 92, 46, 89,190,232,115,235,169, 51, - 23, 85,219, 7,204, 31, 16,251,249, 56, 79, 13,240,178,197,165, 59,209,184, 20,254,226,225,165,219,143, 26,119,109,226, 10, 63, -119,155, 41,146,236,156,101, 81, 48, 61, 66, 90, 84, 48, 12, 96,208,148,142, 58,244,119,196,176,214,131,231, 85, 54,218,176, 66, -188, 1, 46,134,229, 65, 80, 20, 64,144, 69, 35, 32, 19,174,130,182,241,225,247, 31, 58,174,218,177, 99,247, 87, 81, 25, 66, 20, - 75, 64,160, 58,114,115,115, 31, 68, 69, 69,245,106,218,180,233,206, 79, 63,253,212,114,248,240,225,174,227,198,141, 35, 1, 32, - 53, 53,149, 91,187,118,109,242,119,223,125,151,155,145,145, 49,218, 96, 48,132, 27,243, 15, 87, 42,149,215,190,255,254,251,244, -203,151, 47, 55,110,211,166,141,180,101,203,150,156,173,173, 45, 45,149, 74, 89,157, 78,167,137,137,137, 97,159, 62,125,234,146, -147,147,243, 4, 64, 44,106,208,172, 95, 28,189, 90, 76, 81,212,151, 60,207, 7,188,142, 62, 90,114,185,220, 21,192, 19,130, 32, -234,155,218,108,248, 74,133, 77,211,200,206,206,134, 42,229, 33,100,137,143,209,212,156, 68, 35, 91, 11, 88, 89, 89,213,202, 20, -229,230,230, 2,133, 73,184,114,229, 62,192, 48,176,182,182,134,181,181,245, 95,110,180, 42,243, 34,255, 18,198, 87,240, 90,213, -125,180, 26, 41, 48,209, 76,135,181, 19,122,215, 19,123,123,186, 67,155,120, 27,247, 19, 10, 48,183, 93,155, 72, 74,106,169,153, -240, 97,223, 86, 3, 6,214, 65,151, 14,173, 9,111, 23,235, 41,203,190,221,252,113, 35,100,124, 30,153,134,117,198,236, 81,100, - 58,158,113, 72,219,113,254, 65, 98,176,187, 92, 13,142,227,113, 62, 92,137,240,184,236, 29,209,233,120,102,202,209, 53,114, 65, -119, 26,228, 65,158,231,101,214,230,230,249,141,252,220, 29,186,183,111, 70,190,211,185, 21,196, 20,112,229,230,125, 76,251,246, -216, 13,142,227,123, 27, 61, 66,140,227, 94, 49, 80, 69, 35, 12, 13,229, 70, 24,242, 60,207, 23,141, 58,172,186,219, 23, 69, 17, - 41,170, 23,183,156, 69,246,190, 80,199,158, 71, 92, 54,135, 23,105,249,200,163,157,161, 77, 74, 2,120, 46,254, 98, 45, 58, 86, - 59, 56, 56, 56,214,109,228, 87,111,195,174, 35,208,171,114,241,236,194, 78, 20,100, 43,241,245,150,147,245,220,220,236, 59, 39, - 37, 37, 93, 52,225, 98,227,247, 91,200,126, 71,240, 0, 37,146,226,244,166, 67,200,176, 55,131,131, 92, 12, 78,157,142, 9, 83, -135, 91,191,219, 99,184, 53, 0,188,120,116, 15, 94,114,181, 81,186,122,123, 12, 24,220,181,129, 13, 12,106,236,250,245,158,134, - 4,222,217,125,246, 97,108,215,134, 54,178,193,129, 94,182,139,147,115,222, 71,102,205,146,138,150, 68,180, 74, 35,124, 53, 24, -109,120, 4, 96, 27,114,136, 61,120, 45,205,124, 96,143,150,114, 49, 77, 16,124, 65, 18,120, 51, 7,108,222,117,184, 64, 98,248, -107,102, 98, 23, 16,120, 19, 80,171,213,119,212,106,117,147, 47,190,248, 98,216,156, 57,115,222, 50, 55, 55,175, 11, 0,133,133, -133,207, 12, 6,195,165,226,255,167, 41,163, 3,121, 0, 79, 98, 99, 99,159,197,198,198, 58,237,221,187,215, 6,128,172,248, 61, - 13,128, 28, 0,169,168,197,136,195, 18, 83, 69, 16,196,151,175,235, 60,148,152, 42,130, 32,234,215,228,243, 36, 73,178, 4, 65, -128, 32, 8, 72,165, 82, 92,190,124, 25,131,122,247, 64,212,233, 28, 4,216, 88,160,205,232, 9, 56,120,238, 28, 40,138, 2, 65, - 16,160, 40,202,164,122,132,166,105, 92,185,114, 5, 35,134, 14,132,148, 6,172,173,173,241,197, 23, 95,224,196,137, 19,160,105, - 97,150, 62, 19,216, 86,198,112, 25,153, 71,139,192,226,115, 59,151,136,193, 26,112,106,231, 42,132, 68, 20,232, 30,165, 99,110, -131,116,172, 61,130,124, 46,253,219,221,193,231,174, 68,172, 28, 51, 36, 72,254,118,215, 30,120,187, 75, 87,186,113,235,206,243, -129,114, 70,171, 59,170,200,181,193,114,248,106,219,175,209, 19, 14, 94,136, 33,160,207,199,144,158,173,121,150,195, 87,213, 28, -204, 43,154,214,102, 22, 7,175, 92,191,110, 11,125, 1,226,238,253, 46,171, 83,183, 30,192,234,241,228,201, 99,124,183,235, 39, -238,194,205, 71,123,116, 12, 62,125,154,141, 66, 99, 53,139,156, 21, 3,107,115, 73,131,119, 26, 91,253,194,129,135,141, 92,220, -144,231, 88,216,200, 69, 13,123, 52,148,255,194,243, 60,111,105, 38,106,200,179,134,106, 53,213, 58,102,235,174, 31,118,172, 30, - 59,118,172,121, 70, 98, 10,146,243, 34, 80, 32,113,131, 65,238,129,216,123,151,212, 42, 45, 99, 76, 37, 94,233,249,204,200,200, - 72,187, 19,150,133,131, 91,150,194,160,211, 34, 45,177,200,171, 38,103,228,193,202,193,237,122, 82, 82,146,209,154,122,134,203, - 29, 48,124,188,216,204, 18,102, 35, 6, 4, 73, 98, 51,181,104,225,106, 89,116,209, 40, 72, 71, 84,232, 21,116, 41,238, 99,250, - 52,129,132, 87, 51, 87,163,246,211, 82, 38,254,244,221,150,110,120, 22,175,196,229,135, 73,187,158,101, 33,153,141, 86,238,138, - 77,206, 9,238,219,206, 19,107, 78, 68,126, 2, 24,246,155,114,236,254,142, 24,198,243, 8, 44,234, 12,175, 6, 15, 4,250, 59, - 98,152,145, 35, 13, 95,209,164,197,248, 96,245, 47, 47,230, 29,190,149,209,119,198, 7,157,172, 58,116,120, 79, 2, 70,135,124, -181,214, 16,149,131,188,218,148, 81, 45, 16, 52, 5,205,127,171, 38, 11, 96,143,193, 96,216,147,147,147,243, 58, 53,147,241,106, - 94,167, 90, 29,123,217,102, 66,158,231,233,226,104, 86,117,157,225,171,212, 44,219, 76,200,243,252,207,197,209,172,234,162, 90, -229, 52, 57,142, 75,110,213,170,149, 93,159, 62,125,192,178, 44, 30, 63,126,140, 23, 9, 9,232, 30,252, 9,108,108,108,112,233, -193, 3, 60,122,244, 8, 95,126,249, 37, 12, 6, 3,142, 31, 63,158, 88,157, 38, 77,211,250,122,245,234,137,251,245,235, 7,134, - 97,240,244,233, 83, 36, 37, 37, 97,218,180,105,176,182,182,198,157, 59,119, 74, 53, 51, 50, 50, 64,211,180,190,130,232,214,159, -241, 91,250,183,243,138,201,170,218,104, 1, 44, 88, 3,114,207, 45,192,186,203,208,235, 13,104, 24,153,142,231,145,127, 68,164, - 54, 83, 97, 15, 78, 61,136,136,126,118,231,234,219, 18,164,133,195,212, 59,137,199,153, 80, 90,202,242,243,161,207,183,194,211, - 95,240, 60, 53,191,224,113, 38,148, 38,223, 49,112, 44, 1,189, 10, 80,222,198,181, 75, 23,113,225,198,125,220, 10,143,102,175, -221,137, 57, 72,114,248, 42, 42, 19,143,107,112, 23, 2,139,222,107, 48, 42,252,137,103,107, 63, 39, 79,176, 12,120,206, 0,235, - 33,251, 49, 58,178,131,103,107, 31, 27,207,162, 72,150, 1,182, 31,253, 14,172,150, 85,169,119, 59,193,176, 77,114,226,204,251, -249, 57,153,237,186,117,110,111,110,237,255, 46, 50,158,196,224,241,253, 43,234, 59, 17,177,215,110, 39, 24,106, 21, 45,113,115, -115,123,171, 91,231, 6, 24, 50, 97, 54,244,170, 92, 60,189,240, 3, 10,178, 82,112,249,186, 5,162,243,242,218, 3, 48, 58,162, -117, 61,158,105,140,248,108,116,172, 35,138,183,132,214,249,195,160, 62,144, 18, 26,112,218, 60, 16,170, 12,196, 38,233,114,223, -223,146,192, 2,128, 92, 74,208,230,124,174,149, 81,145, 71, 47,123, 95, 57,101,192,238,115, 15,193,113, 69,211, 55,113, 28, 54, -239,254, 61, 54,248,171, 17, 45,208,200,211,182,217,189,164, 52, 2, 38,132,252, 9, 30,157,110, 29, 92,212, 80,243,219,124,128, -211,227,202, 20,187,134,157,214,101,117, 66, 13,167,219,137, 72, 70, 18,128, 96,208,170,173, 83,214,253, 58,191,213,185,200,192, -233, 31,245,181, 2, 47, 76,192, 46, 32, 32,240,215, 83, 80, 80, 48, 97,244,232,209, 91, 69, 34,145, 2, 0,193,113, 28, 56,142, -163, 87,174, 92, 41, 98, 89,150, 36, 73,146,165, 40,138,249,249,231,159, 13, 44,203,166,107, 52,154, 9,213,105, 50, 12, 19, 59, -105,210,164,122,213,141, 80, 60,112,224, 64,137,201,138, 21, 74,194, 40,147, 85,118, 93, 26,229,170,188,242,224,177,168,227,136, - 5, 11, 0, 16,224,177, 48, 50, 29,207, 95,222, 36, 60, 11,201,141, 40,253,180,198,173, 59, 47, 40,249,140,169,123,166, 97,217, -129,173,155,248, 29, 0, 0, 45,207,142,168,201,209,229,105,213,131,155,183,110,127,144,227,121,154,225,249, 29, 36,135,163, 26, - 6, 81,198,140,180,171,140,228,180,156, 59,239, 6, 88,243, 64, 81,147, 97,105,115, 97,113, 26, 7,158,231,249,210,230,194, 85, - 50,100,228,106,171,205, 3,117,245,185,174,135,142,185, 53,254,236,213,123, 19, 88,150,119,166, 40, 34, 69,173, 99,182,214,214, -100, 1, 64, 82, 82,210,197,208,115, 73,103, 31, 52,115,234,233, 32, 47,142,114,169,128, 12, 21,206, 38,165, 23, 92,172,137,102, -118,161,161,239,156,181, 39, 78, 74, 68, 20, 13,158, 47, 74, 40,202,243,208,232,217,172,235,241, 76, 99, 0,104, 98, 7,215, 47, -142, 51, 7, 40,138,120, 81,157, 94,216, 35,229,154, 33,203, 66, 63,127, 24,151,189, 35, 46, 7, 17, 0, 16,151,131,136, 67, 87, -158,207,143, 77,201,255, 60,226, 69,246, 42,152,216,175,130, 39,112,185,245,144, 5,175,188, 86,219,243, 25,173,196,125, 0,253, -129,196, 30, 67,166,127, 55,157, 32, 32, 76, 63, 33, 32,240, 31,162, 36,170, 69,146,228,226,215,168,249, 51, 65, 16,239, 1,120, - 98,194,199,194, 10, 10, 10,154,188,230,195,203,100, 24, 38,211,152, 13,255,134, 14,241,255, 86,254,182,174, 37,221, 5,205,191, - 94,179,126,253,250,188, 9,134, 69, 56,159,130,166,160, 41,104,254,167, 52,121,158,167,106,179, 84,162, 73,212,102, 17,202,232, - 95,207,248,202,158, 11,205, 33,111, 32, 79,158, 60, 33,132,179, 32, 32, 32, 32, 80, 49, 4, 65,176,127,130,166,144,188, 88,160, -196, 96,149,139,110,145,194, 57, 17, 16, 16, 16, 16, 16, 16, 16,120, 45, 38,171,236,186,200,132,163,242,240,159, 41,163, 9,106, - 18, 66, 12, 21, 52, 5, 77, 65, 83,208, 20, 52, 5, 77, 65,243, 63,167, 89,157,182, 48,154,241, 79, 54, 96,130,166,160, 41,104, - 10,154,130,166,160, 41,104,254,247, 52,255,205, 84,218, 71, 75,104, 58, 20, 16, 16, 16, 16, 16, 16, 16,248,147, 16, 58,195, 11, - 8, 8, 8, 8, 8, 8, 8,212,142,106, 39,149, 22, 16, 16, 16, 16, 16, 16, 16, 16,168, 25, 85, 79, 42, 45, 32, 32, 32, 32, 32, - 32, 32, 32, 80, 99, 76,159, 84, 90, 64, 64, 64, 64, 64, 64, 64, 64,192, 40,182, 9,167, 64, 64, 64, 64, 64, 64, 64, 64,224,175, -161,252,168,195,144,144, 16,190,236, 90, 64, 64, 64, 64, 64, 64, 64,224,175,228, 77,245, 34, 66,211,161,128,128,128,128,128,128, -128, 64,237, 24, 47, 24, 45, 1, 1, 1, 1, 1, 1, 1,129, 63,135, 74,251,104,149, 36, 44,237, 82, 28,170,235, 34,156, 43, 1, - 1, 1, 1, 1, 1,129,191,129, 55,219,139, 8,253,179, 4, 4, 4, 4, 4, 4, 4, 4, 47, 34, 32, 32, 32, 32, 32, 32, 32, 32, -240, 79, 66,152,235, 80, 64, 64, 64, 64, 64, 64, 64,224, 47, 54, 92,127,186,209, 18,102, 54, 23, 52, 5, 77, 65, 83,208, 20, 52, - 5, 77, 65,243,191,100,178,202,153, 45, 97,212,161,128,128,128,128,128,128,128, 64,237,168,118,212,161,128,128,128,128,128,128, -128,128, 64,205, 24, 15, 32,168,248,113, 16,202, 68,181,132,136,150,128,128,128,128,128,128,128, 64,237,216, 6,192,165,216, 96, -157, 6,160, 20,140,150,128,128,128,128,128,128,128,192,235,161,108,191,172,222,101,204,151, 96,180, 4, 4, 4, 4, 4, 4, 4, - 4,106, 73,165,125,180, 8, 84, 62,114, 32,212,132, 47,168,201,232,131, 80, 65, 83,208, 20, 52, 5, 77, 65, 83,208, 20, 52,255, -115,154,213,105,135,226,223,199,120, 83,204,215,235, 68, 24,250, 42,104, 10,154,130,166,160, 41,104, 10,154,130,230,127,150,215, - 62,234,176, 5, 96, 38,156,214, 55, 18,167,226, 69, 64, 64, 64, 64, 64, 64,160,106,254,156, 81,135,254,192, 71,195, 3, 20, 91, - 12, 17,233, 86, 17,128,170,170,109, 21, 10,197, 86,185, 92, 62, 92,165, 82, 21, 18, 4,193,149,188,206,243, 60, 0,148,157,235, -232,105,122,122,122,167,234,190, 91, 34,145,172,117,114,114,250,168,160,160, 64, 69, 16, 4, 79, 16, 4, 8,130, 0,128, 87,214, - 44,203, 38,102,102,102,182,250, 87, 23, 33,207, 83, 14, 78, 78, 55, 69, 20,229,102,234, 71, 89,142,123,158,150,154,218,222,132, -143, 44, 37, 8,204, 40,250, 90,172, 0, 48,251, 77,251, 71,240, 0,101,204,118, 1,128,101, 12, 48,132, 37,201, 79, 68,192, 70, - 45,199,109, 1, 0, 2, 96,107,250,221,218, 48,212, 35,120, 52, 35, 8, 88,243, 60,114,121, 2,247,165,109, 17,251, 55,157,138, - 1, 34,145,168,175,149,149,149, 69,102,102,230, 69, 0, 7, 0, 12,181,183,183,239,156,151,151, 87, 96, 48, 24, 78, 0, 56, 86, - 19,225, 78,205, 48, 83, 34, 22,141,209,232, 13,203,175,222,199, 15,157, 91,192,158,225,176, 76, 38,166, 59,105,117,204,138, 43, - 15,176,195, 68, 73,162,120, 41,185,102,152, 60, 71,218, 97, 35,203, 29, 0,142,219,218,250, 73, 21, 86,191,137, 36,212,243,156, -212,130,225, 3,211,210, 18, 6,213,162,220,255,137, 56, 56, 56,140, 34, 73,242, 27,158,231,193,178,236,220,172,172,172,157,175, - 73,122, 46, 0,155,226,199, 57, 0,190,169,165,222, 11, 0,158,197,143,227, 1,120, 9,245,122,141,217,252,211, 79, 63, 5,119, -237,218, 21,107,214,172,193,230,205,155,227,210,211,211,151, 1,216, 5, 64,247, 55,232, 8, 84, 70, 35,224,189,149,189,218,178, -134, 31,191,226,202,188,220,189,146, 63,243,247, 31,126,248,161,158,231,121,254,209,163, 71,188, 78,167,227, 13, 6, 3,207, 48, - 12,207, 48, 12,111, 48, 24, 74, 23, 55, 55,183,164,151, 62,254,138, 38, 73,146,235,222,127,255,253,124,158,231,249,219,183,111, -243,106,181,154,215,106,181,188, 78,167,227, 53, 26, 13,175, 86,171,203, 45, 78, 78, 78,169, 85,105, 90, 89, 89,221,182,181,181, - 77,181,181,181, 77,181,179,179, 75,181,179,179, 75,181,183,183, 47, 93, 28, 28, 28, 74, 23,133, 66,145,170, 80, 40, 82,237,236, -236,110, 87,183,159,197,244, 2,112,209,136,165, 87, 5,159,237, 94,214,104,185,184,184,164,242, 53,192,221,221, 61,193,136,253, - 44,193,137, 32,192,150,124,150, 32,192, 73,165, 82,207,178,239,227,213, 72, 87,181, 33,101, 87, 87,215,247, 93, 92, 92, 66, 93, - 92, 92,206,185,186,186,190,111,196, 79,172,156,166,165,165,229,109, 7, 7,135, 84,103,103,231,180,146,197,197,197,165,220,226, -234,234, 90,186, 56, 57, 57,165,218,218,218, 86, 90, 70, 60, 64, 85,182, 92, 0,104, 41,240, 54, 77, 81, 33, 78, 78, 78,121,225, -225,225, 44,207,243, 60, 73,146, 73, 37,219,152,114,236, 47,155, 44,213, 21,204,205, 56, 47, 13, 43,120,190, 44, 55,227,188, 52, - 76,117, 5,115,181, 97,168, 87, 83, 77, 35,169, 72,115,228,200,145, 35,239,167,166,166, 38,229,228,228, 40,183,108,217, 18, 35, -147,201,174,108,217,178, 37, 38, 39, 39, 71,153,154,154,154, 52,114,228,200,251, 0, 38,153,160, 9, 0,104,223, 12,237,198, 14, -112, 81,221, 63, 62, 66,245,118,107,250, 94,199, 0, 4,245,104, 47, 78,218, 48,203, 95,117,105,123,160,170,107, 75, 50,194, 68, - 77,130,166,233, 14,158,158,158, 99, 20, 10,197,135,197,203,136,146,197,217,217,121,132,179,179,243, 8, 91, 91,219, 65, 85,105, - 30, 6, 40, 99, 22, 15,153,172,195,160,186,158,170, 23,139, 23,242,225, 83, 63,225,199,248,120,228, 13,116,116,172,243, 55,148, -209,159,170,233,232,232,152,108, 48, 24,120,189, 94,207,219,219,219, 39,191,198,253, 92,197,243,252, 42,158,231, 87, 1, 88,245, - 26, 52, 75,175,103, 38, 24,236,170, 52,101, 52, 73, 78,151, 75, 36,231,164, 52,157, 38,165,233, 52,185, 68,114,142, 38,201,207, - 1,200,254, 73,101,244, 39,104, 90, 40, 20,138,103,107,215,174,229, 85, 42, 21,175, 82,169,248,181,107,215,242, 10,133,226, 25, - 0, 11, 19, 52,107,170,243, 38, 69,176, 94, 94, 94, 95, 68,203, 31,104,245,118,179,250, 71,167,140, 26, 2,238,200, 90,162,154, - 59,166,239,219,183,106, 53,102,215,174, 93, 0,128,225,125,251,162,103,155, 54,176,180, 48,135, 68, 82,180, 59, 4, 79, 64, 44, - 18,163,223,180,207,140,249,250, 21,253,250,245,251,224,200,145, 35, 22, 0,176,121,243,102, 12, 24, 48, 0,118,118,118,144,203, -229, 16,139,197, 16,137, 68,229,214,213, 65, 81,148,123, 82, 82,146,163, 76, 38, 43,141,178,113, 28, 87,110,225,121,190, 36,250, - 6,134, 97,224,235,235,107,236,233,154,149,155,155,251, 86, 97, 97, 97,169, 70, 69, 75,221,186,117, 1,224,140, 49,130,223,124, -253, 21, 56,166, 16, 52, 13, 48, 12,160,213,147,224,248, 10,205, 13, 38, 77,154, 84,186,223, 53,161,119,239, 32,130, 32,136, 35, -119,238,220, 57,154,150,150,230,205,113,236,184, 26, 70,186, 62,126,252,248,177, 5, 0,248,249,249, 77, 2,112,212,148,253,160, -105,218,253,193,131, 7,142, 82,169,180,210,200,101,153, 8, 38,244,122, 61, 90,180,104,193,152,242, 29, 78,128,103, 22, 73,142, -107,222,178,229,248, 5,253,250,201,110,222,188, 41, 35, 73, 18, 12,195, 96,229,202,149, 12,207,243, 54,141, 0,171, 72, 32,175, - 10,153, 57, 0, 70, 21, 87, 6, 59, 0,172, 44,231, 22,120, 52, 83, 27,164, 65, 79, 11,250,181,105, 91,103, 38, 34, 31,134,183, -241,177, 56, 14, 75, 90, 27, 11,252,181, 81, 45, 43, 43,171,190,107,214,172, 81,236,216,177, 35,239,209,163, 71,250, 45, 91,182, - 40, 38, 76,152, 96,169,215,235, 17, 28, 28,156,222,160, 65, 3,241,154, 53,107, 20,199,142, 29,123,187,176,176,112,147, 73,229, - 69,224,171,161,125,123, 66, 99, 32, 97, 48, 48, 10, 23,133,229,158, 41, 35,187,136,120, 94,135,221, 39,238,192,192,112, 63,152, - 24,201,106, 63,112,224, 64,159,253,251,247,211,209,209,209,116,195,134, 13,193,113, 28, 88,150,133,193, 96, 0, 0,112, 28,135, -250,245,235,215,250,188,140, 1,252, 28,156,236,206,181,127,239, 93, 51, 23,153, 20,118,217,233, 24, 43,166, 45,119,202,181,123, - 1,116,120,163, 34,187, 60, 15,154,166,145,144,144, 0, 71, 71, 71, 51,142,227,148, 0, 22,102,103,103,111,195,155, 75, 27, 9, - 77, 31,221,253,195, 58,231,182, 29, 58, 80, 78, 46,142,136,121, 28, 15,154, 96,187, 63,184,117,167,203,152,137,211,167,232, 24, -230,125, 0, 55,223,180, 3,119,238, 48,169, 63, 65, 82,155, 9,158,195,162, 13, 39,243,151,174, 88, 43, 15, 30, 55,146,154, 54, -109, 26, 60, 60, 60,188,251,247,239,191, 2,192,196,106,117,218, 78,234, 15,138,220, 12,158,199,130,239, 78,230, 47, 89,177, 86, - 62,177, 6, 58,255,114, 42,253,143,212,218,104,249, 3, 62,141, 61, 28,207, 46,157, 49, 81,196,255,242, 35,169,202, 76,171,116, - 91,133, 66,177,245,157,119,222, 25,190,115,231, 31,209,232,246, 1, 1,232,255,118, 32, 28,237,173, 33, 55,151, 20, 85, 71, 28, -129,251,143,158, 27,101, 8, 60, 60, 60,130,143, 30, 61,106, 81,214, 76,136,197,226,210,165,172,201, 42, 89, 74, 42,224,170,144, -201,100, 8, 13, 13, 5, 77,211,160, 40, 10, 52, 77,151, 46,101,159, 83, 20, 5, 39, 39,147,186, 46, 45,179,182,182,110,154,159, -159,111,149,147,147, 3, 79, 79,207, 60, 0, 15,202,188,223, 52, 61, 61,221,202, 20, 65,142, 41,196,180,177,254, 16,233,110, 64, - 39,106, 3, 53,221, 17,215,110, 69, 33,228,204, 69, 36, 37,167, 32,176, 93,115,124, 56,108, 32,206,157, 59, 7,150, 53,185,165, - 35,149,231,177,162, 79,159,160,153, 0, 65,116,239,222, 61,103,242,228,201,100,116,116,244, 7,253,251,247, 11,120,252,248, 73, -113, 84,145,152,193,243, 88, 7, 32,213, 72, 93, 9, 0, 92,186,116, 9, 0,164, 53,249,237, 73,165, 82, 92,191,126, 29, 37,205, -196, 36, 73,130, 36, 73, 80, 20,133, 83, 79, 28, 80,168, 35,161, 74,141,192, 39, 65,158,168, 91,183, 46, 72,178,250, 46,137, 93, - 0,217, 53,160, 63, 33, 18, 77,115,113,117,245,238,236,227, 35, 15, 13, 13,165, 0,192,203,203,139, 87, 42,149, 57, 39, 78,156, -200,167,129,205, 94, 60,191,171, 42,147,229,225,225,209, 49, 41, 41,233,155,146,115, 78, 16,196,138, 58,117,234,124, 89, 90,110, - 28,135,133, 63, 20,138,166, 76,153, 42,110,219,101, 30, 0,160,109,159,253,200,123,186,212,159,200,154, 99,253, 87, 95, 37,242, -242,242, 14,214,175, 95,159,202,204,204,188, 6,224,133,193, 96,152,181,103,207, 30,199,177, 99,199,166,237,221,187,119, 25, 0, -215,229,203,151,119, 41, 44, 44, 60,100,138,110, 96, 83,188,215,178,105, 64, 59, 79, 15, 15, 92,188,118, 19, 98,137,200,102,210, -168, 32, 88, 88,208, 88,181,227, 52,247, 34, 49,107,242,149, 7,216,101,130,201,106, 51,112,224, 64,239,253,251,247, 75, 0,224, -193,131, 7, 72, 73, 73,129, 66,161,128,153,153, 25, 68, 34, 17, 40,138,130, 72, 36,122, 45, 38,203,218,195, 62,236,248,241, 19, -102,118,118, 54,216,240,217, 20,124,152,150, 10, 27, 75, 11, 24, 10, 10,189,223,176,138,194,175, 83,167, 78, 50,150,101, 81, 88, - 88,136, 11, 23, 46, 88,155,153,153, 89,187,187,187, 47,128, 9,163,167,100, 50, 89,170, 70,163,113, 44,126,156,166,209,104,156, - 0,228, 73,165,210,146,235,116, 65,241,218,216,230,196, 23,120,181,153, 48,158, 32,136,178,175,213,148,214,109, 90, 55, 13, 61, -118,100,159, 69,110,126, 10,108,108,211, 64, 34, 23,219,182,109,132,153,153, 21, 22, 44,152, 67, 63,239,254,182, 91,175,247,222, - 15,125, 24, 21,211,253,141, 51, 91, 60,177,173,123,159,225,118,102,114,203,226,186,196,128,157,219,167,128, 36, 73,124,249,229, -151,104,220,184,241,248,135, 15, 31,206, 3,144, 85,181, 12,182, 53,121,107,176,157, 68, 86, 84,196, 28,107,192,150, 3,159, 23, -233,204,158,128,161,125,234,142,255, 98,224,179, 95, 27,251, 32,191,248,198, 92, 45, 34, 17, 79,180, 69,169, 97, 8, 9, 9,233, - 28, 20, 20,116,177,178,231,255, 2, 92,240, 71,254,172,114,230,139, 14, 9, 9,225,131,130,130,136, 50, 7, 87,238,121, 85, 52, - 3, 28,108,173,229,161,155, 23, 78,177,160,111,156,166,212,241, 79,144,172, 41, 87,145,151, 27,162, 41,151,203,135,239,220,185, -179, 92, 72,201,211,201, 17, 98,177, 8, 34, 49, 1,155, 78, 69,217,235,115, 46,135,128, 32, 42, 53, 89,229, 52, 11, 11, 11, 53, -247,238,221,179,216,177, 99, 7, 28, 29, 29,225,237,237, 13,185, 92, 14,153, 76, 86,206, 92,149, 53, 92, 21, 24,173,114,154, 37, -239,211, 52, 13,146, 36,113,238,220, 57, 48, 12,131,129, 3, 7,190, 98,178,104,154,174,204,184, 85, 54, 60,245, 12,128, 7, 60, -207,191, 85, 92, 1, 63, 0,208,185,204,251,189, 20, 10,197, 44, 0,203,140,213,164, 40, 30,148,230, 26, 56,247,181,160, 19,166, - 64, 39,106,134,243, 87,238, 96,231,214, 53, 0, 0,239,134,173, 49,168,127, 80,105, 52,206,200,253, 44,197,205,205,237, 64,122, -122,198,187,111,191,253, 54,178,179,179, 13, 11, 23, 46, 68,211,166, 77,225,231,231,103, 84, 25, 85,114,231,156,250,224,193, 3, - 15,181, 90, 13,158,231,141, 49,103,175,104, 18, 4,129, 61,123,246, 64,163,209,188,178,177,109,231, 37,248,124,128, 23, 70,127, -178, 11, 43, 30, 29,194,166, 77,155,170, 60,118, 57,208, 84, 99, 93,127,157,132, 98,154, 46,155,243,177,244,195, 15, 63,164, 70, -143, 30,141,248,248,120,140, 29, 59, 86,115,238,220, 57, 93,138, 82,121, 66,194,113, 27,244,229,141,113,165,154, 82,169,116,247, -153, 51,103,112,232, 80,145, 47,137,137,137,129,175,175,175,121, 57,147,156,117, 24,249, 47, 54, 32,236, 84, 52,218,246,217,143, -176, 83,195,192,230,156, 22,181,242, 69,174, 41,231,179, 6, 84,164,121, 40, 51, 51,179,212, 68,237,221,187,215,108,239,222,189, -253, 0,156, 4,112, 8, 0,178,178,178,190, 53, 81, 19, 32, 48,122,240,128,126,160,197,150,136,126,146,136,206,237, 91,192,201, -209, 17, 15,162, 98,241, 34, 41, 43,149, 32, 48,170, 87, 7,201, 50,181, 90, 55,239,242,125,124, 95,141, 38,225,238,238,238,119, -248,240, 97,113,153, 8,116,233,127,156,162,168,210,231, 37,198,187, 38,191,207, 18,147,101,233,110, 17,246,213,198,142,230, 97, -225,123,225,235,245, 30,108,223, 11,194,247,103,207,226,241,195, 72,141, 78,197,116,251, 27,202,232,207,210,244, 27, 48, 96,192, -181,125,251,246,217, 36, 36, 36,224,210,165, 75,240,246,246,134, 74,165, 50,230,134,183,156,166, 70,163,113, 44,249, 12, 65, 16, -142, 37,129,119,157, 78, 87, 82, 24, 37,127, 68,155, 50,219,217, 84,161,233, 89,102,187, 18,115,229,245, 26,142, 93, 34, 19,139, - 15, 31, 63,118,192, 34, 50,250, 18,154, 55,107, 7, 11,235, 70,224,216, 20,100,102, 21, 32,251, 73, 50,190,254,122, 5, 22, 44, -156,139,147, 63, 29,177,104,224,223,236,168,142, 97,234, 3,208,188, 49,229, 78,240,227, 67, 79,237,221, 76,240, 28,212,169,209, - 82, 81,225, 51,249,240, 97,239, 83, 67,134, 12,193,201,147, 39,241,240,225,195,205, 85,152,172,208, 50,145,249,241, 17,151, 14, -109, 6,207, 67,157, 22, 45, 21,171,159,201, 71,126, 48,136,250,112,104, 79,220,248,125, 29,122, 54,127, 22,225,234,136,254,217, -197, 22,155,166,144, 41,149,225, 42, 31,134, 27,101,204,214, 5, 0, 68, 25,131,117, 1,127,244,193,252, 55,208,187,216, 88,141, -127,249,198,132,174,137,193, 2, 0, 95,192,130,144,136,195,118, 46,248,216, 85, 30,255,144,214, 70, 92, 71,178,150,227,183,196, - 49, 92, 11,192,236, 46,160,126,249, 51, 42,149,170, 48, 54, 54,214,108, 84,255,254,232, 16, 16, 0, 23,123,123,212,119,119,135, -153, 84, 2,137, 88, 84,238,150,213,232, 54, 4,130,224, 27, 52,104,128, 62,125,250, 64, 36, 18, 65, 46,151,195,194,194, 2, 18, -137,164,194,104,150,177,119,185, 60,207,131,162, 40, 68, 68, 68,224,197,139, 23,176,177,177,193,213,171, 87,209,173, 91,183, 87, -162, 90,101,205,153, 41, 33,250, 10, 42,254, 18, 35,118,198, 20, 45,150, 37, 80,192, 55,131, 44,110, 50, 84, 68, 11,104,181, 12, -180, 90, 45,190,191,162,199,205,216, 66,232,245, 58,104,181,218,170,190,179, 50, 72, 87, 87,215,225,245,235,215,159, 52,108,216, - 48,131, 68, 34, 65, 97, 97, 33, 84, 42, 21, 30, 62,124,104,120,247,221,247,114,250,244, 9,178, 62,125,250, 52, 95,220,116,152, -106,130,118,166,155,155,155, 71,113,243,108,102, 77,126,213, 4, 65,148,154,152,151, 25,245,109, 36,104,170,168, 76, 54,111,222, - 12,150,101,193,243,124,165,133,164, 33,136,223, 22, 46, 89,109,189,124,237, 15,176,182,115,194,197,139, 23,217, 95,127,253, 53, -159, 0, 98, 30, 63,124,248,237,255,128,159, 15, 3,122, 83,246, 47, 59, 59,219,204,219,219, 27,238,238,238,224, 56, 14, 6,131, -161, 52,250,146,153,153, 9,181, 90, 13, 59,243, 28,212,179,119, 7,147,127, 1,202,136, 69,112,177,136,198,174, 51, 58, 67, 75, - 63,220,255, 7, 92, 56,126, 44, 94,106,121,215, 12, 55, 71,103, 15,144,188, 1,201,105,153,232,215,187, 39, 40,177, 5,158, 39, -100,160, 89, 35, 31,151, 15,254,215,209,133, 34, 24,204, 88,182,127, 18,192,125, 95,157, 92, 65, 65, 1, 27, 29, 29,141, 7, 15, -138,252,174,149,149, 21,204,205,205,203,253,199, 73,146,172, 85, 68,171,196,100, 45,217,220,205,156, 20, 21, 34,143, 13,197,142, - 61,119,208,172, 65, 16,182,132,221,210,176,169, 89,221, 87,105, 52, 49, 7,254,197,193, 12,103,103,231, 9, 28,199, 45,224,121, - 62, 39, 48, 48,208,105,255,254,253,182, 73, 73, 73,184,115,231, 14,190,252,242,203,116,150,101, 25,158,231, 9,158,231, 23,189, -134,175,227,202, 24,172,215,137, 72, 46,195, 39, 14, 86, 68, 95,154,180,242,102,242, 10,158,103,232,248, 19, 42,134,251, 14,128, -161,202,139, 27, 73,126,116,228,224,102, 87, 7, 5,135, 46,138,183,161, 76,213, 99,201,103, 35,145,153,153,143,239,183, 47, 5, - 32,129,158,161,240, 86,151,247,225,232,232,134,241,227,198, 59,111,222,186,229, 99,134,227, 86,225, 13, 33,229,218,166,159, 0, -132, 42, 20,138,135, 31,143, 31,175,240,246, 30, 1,153, 76,134, 3, 7, 14, 96,255,134, 13,236, 90, 96,144, 20, 56, 31, 12,252, - 84,165, 78,216, 31, 58, 83,130,131, 21,254,254,193,144, 74,165,248,253,215, 31,161, 73,217,147,223,187, 3,244, 42, 13,122,215, -233,195,219,197,157, 34,178, 68, 34, 60, 1, 0,145, 12, 74, 0, 47, 55,131,253,219, 12, 86, 9,167,241, 71,191,172,241,229, 34, - 90, 53,190,118,138, 36,225,219,167, 14,245,114,130,150,208, 93, 57,133, 36, 45,199, 46,127,172,167,238,230,242,159, 71, 85, 96, -178,138,127,216,156,167,167, 39,222,110,213, 10,253, 59,117, 2, 77,211,144, 73,196,176,148,153,129,103,139, 34, 89, 37, 77,135, - 85,212,137,168, 40,250,100,111,111, 15,177, 88, 92,106,176, 76,136,102, 85,168,201,113, 28,104,154,198,131, 7, 15, 16, 24, 24, - 8, 15, 15, 15, 28, 58,116, 8,189,122,245,122,165, 41,209, 84,147, 85, 98,180, 94,106,198,235, 5,160, 36,146,101,146,209,210, -232, 8,100,232,154,129, 32, 2,192, 48, 0,203, 3, 90,141, 6, 60, 15,240, 60, 96,208,235,160,209,104, 74,191,211,152, 38, 89, -103,103,103, 79, 51, 51,179,197, 51,103,206,240,111,214,172, 57,210,211,211,193,113, 28,204,205,205,161, 82,169, 96,101,101,133, - 14, 29, 58, 60, 95,188,120,177,146,231, 49,222, 68,147, 85,107, 74,206,249,217,179,103,203, 53, 27,150, 44,133,202, 68,140,254, -116, 47, 36,116, 81,211, 82, 73, 31,158,170,174,187, 93,223,234,136,107,119, 99,152,143,102,172,211,138, 50,239, 44,115,230,184, -157,137,181, 56, 46,158,231,145,145,145,129,212,212, 84,244,237,215, 15,251,247,237, 67, 92, 92, 28, 26, 53,106,132,174, 93,187, -194,209,209, 17,113,113,113,184,121, 89, 11,109,118, 22,178,116,119, 32,183,108,139,227, 23, 99,181, 95,110,214,199,254,141, 23, -140,190, 0, 70, 90, 89, 89,213, 85,169, 84, 74,134, 97, 14, 3, 56, 12, 96, 16, 77,211,131,228,114,185, 75, 94, 94,222, 51, 20, -141, 38, 58, 81,157,152,153, 76,102, 47,149, 89,129, 99,180,160,105, 26, 30, 30,222,224, 89, 29,178,243,212, 24, 53,164, 15,238, - 62,136,194,175,231,111, 48, 6, 3,183,222,152,211, 74, 81, 20,239,231,231,135,180,180, 52,136, 68, 34,152,153,153,193,194,194, - 2,179,103,207,198,134, 13, 27, 74, 77, 86, 77,141,214, 24,192,207,202,211,226,198, 55, 27,139, 76, 86, 74,178, 18,169,137, 34, - 40,236,157,176,126,195,218,194,236,184,148,182, 63, 0, 49,255,246, 74,150,227,184, 69, 73, 73, 73,142, 52, 77, 59, 51, 12,131, -132,132, 4,220,190,125, 27,147, 39, 79, 78,205,204,204,236,130, 26, 30,163, 76, 38, 75, 43,137,100, 21, 55, 29, 86,214,156,152, - 83, 38,146,149, 83,133,100,101,205,132, 62,222,238,150,231,182,175,153,230,217,186,109, 7, 82, 78, 91,101, 23, 60, 73, 9,188, -114,233, 98,135,201,107,190,255,248, 69,118, 65, 79, 0, 79, 43, 19,149,138, 68,239,182,235,216,145, 6,159, 10, 90, 18,136, 21, -203,135, 32, 61, 35, 15,217, 89,249, 16,139,205,161, 51, 80, 96, 57, 2, 29, 2, 59,225,199, 93, 7,209,120,220, 88, 74, 34, 18, -245, 96,116,186, 55,198,104, 21,179,244,187,239,190,243,108,208,160, 1,118,238,220,137,243,187,119,227,195,220, 92, 92, 36, 73, -202, 32, 18, 57,252,108, 48,108, 67, 53, 70,171,172, 78,227,198,141,241,195, 15, 63, 96,207,158, 61,241,195,187,165, 29,157, 54, - 28,142,122, 61,222,185,243, 8,118,117,250, 0,119, 30,193,174,101, 3,212,103,104, 60, 33,136,242,233,160, 66, 66, 66, 58,151, - 93,255,203, 80,162,146, 38,118, 26, 64,151,144,144, 16,190,236,186,218, 11,232, 44, 71,207, 0, 0, 32, 0, 73, 68, 65, 84,167, -194, 55,120,105,207,186, 94, 1,245, 60, 9,195,161,117, 72, 40,100,116,243, 30,233, 37,143, 11,248,105, 81,192,218, 42,238, 32, -120,138,162, 96,105,102, 6,133,141, 77, 81,152,159, 36, 1, 14,224, 12, 0,193, 22, 25, 0,158, 35,192,179, 38, 93, 48, 32,145, - 72, 42,236,248,110,106,223,172,178,154,249,249,249,120,254,252, 57,198,143, 31, 15,185, 92, 94,228,220, 83, 82,224,229,229, 5, -154,166,145,148,148,132,223,127,255, 29,117,235,214,133, 84, 42, 53,201,109,149,137, 46, 53, 69,209, 40,195,166, 74,165,210,202, -197,197, 5, 38, 71,180, 56, 30, 42, 45, 1,157,142,197,227,199,143,145,156,156,140,231,207,158,160,117, 97, 30,120, 80,224,121, -222,164,136,150,155,155, 91,128,143,143,207,150,101,203,150,137,221,221,221,193,243, 60,108,109,109,160, 82,169,144,145,145,137, - 70,141, 26,193,195,195, 3,203,150, 45, 3,128,253,127,181,201,122,233, 55, 85,106,180,202, 26,174, 79,255,231,137,172, 44, 11, - 80, 20, 89,106,156,171,233,163, 37, 6,128, 46, 61, 7,208,231,126,253,217,156, 1, 22,167, 80,212, 98,186,250,114, 52,176, 28, - 39,175,236,253,132,132, 4,136, 68, 34, 28, 57,124, 24, 89,169,169,104,214,172, 25,218,180,105,131, 39, 79,158,224,238,221,187, -176,183,183,135,194,189, 61, 46, 62,211, 35, 50, 89, 13,107,107,107,196, 38,146,127,103,202,128,113,221,187,119,255,242,219,111, -191,117,116,118,118, 22,165,167,167, 55,216,184,113, 99,179,141, 27, 55, 78,249,248,227,143,157, 62,254,248, 99, 91,133, 66, 65, -167,164,164,248,125,246,217,103, 45, 67, 67, 67,235, 2, 88, 93,149,160,185,185,165, 29, 37, 54, 7, 65,208,176,177,182, 5, 45, - 49, 7,199,208, 96, 57,192,202, 90,129,107,119,143,224,106,120,254,132,180, 76, 28, 54, 42, 62, 86, 92,238,246,246,246,175, 68, -170, 39, 79,158,140,237,219,183,151, 54, 35,214,212,100, 45,217,216,205,130, 40, 54, 89, 41, 9, 52, 8,109, 93,156,250,233,122, - 78,118, 92, 74,224,155, 96,178, 74,174,113, 60,207,227,217,179,103, 80,169, 84,184,124,249, 50, 22, 45, 90,148,254,178,201,114, -116,116, 28,103,101,101,181,176,160,160, 96, 69, 74, 74,202,186,106,111,252,138, 76, 84,201,227,146,117,133,205,137, 70,238,170, - 87, 69,145, 44, 15, 23,217,153,187,151,247,122, 89,243,247, 9,188, 24, 15, 60,206,123,104, 25,230,248,214,123,173,123,147, 45, - 54,125, 85,167,205,132,217,103, 18,242, 52, 13, 42,139,108,113, 44,219,194,220,194, 18, 64, 26,238,220,190, 80,106,178, 50,179, -114,161,213, 83,208,234, 8,104,244, 36,222,238,254, 14, 54,108,217,131,164,180, 44,176, 44,219,228, 13, 51, 89,118, 1, 1, 1, -193,131, 6, 13,194,226,197,139, 17,250,237,183,186,137, 4,145, 71, 3,252,105,150, 5,199,243, 4,105, 92, 39,246,114, 58,171, - 86,173,250, 9,192,208,101,147,209, 62,187, 0,163, 92,251,240,118,117,250, 20,109, 56,112, 38, 15, 0,118,233,161,229,171,204, -160,160, 32,162,164,101,205,212, 22,182,127, 58,116, 80, 80,208,197,144,144, 16,148, 93, 87,245, 1, 75,167, 6,239,125, 49,125, -210,242,214,189, 58, 17,202,233, 61,144,149,167, 97,230, 68,234, 37,137,234,170, 77, 86, 89,190,216,184, 17,119, 99,138,254,199, -238,142,142,152,241,193, 7,224, 25,224,234,195, 72, 28, 12, 13,197,144,238,221, 97, 46,147, 25, 29,217,224, 56,174,194, 40, 86, -217,104,150,169, 81,167,156,156, 28, 28, 62,124, 24,109,218,180,129, 92, 46, 7, 77,211,104,218,180, 41,162,162,162,224,227,227, - 3,130, 32,112,252,248,113,244,239,223, 31, 79,159, 62, 69,251,246,237, 45, 94,188,120, 97,178,209,138,140,140,180,226,121,254, -173,146,232, 71, 77,209,106,181,136,142,142, 70,159, 62,125, 96,107,107, 11, 55,183,253, 8, 61,179, 23,242,128, 15, 65, 16, 48, -201,104,177, 44, 59,166,119,239,222, 98,130, 32,160, 86,171, 32,147,153,193,220,220, 2,150,150, 86,240,243,107,128,228,228,100, -244,234,213, 75, 23, 27, 27,187, 73,169, 84, 30, 50,117, 95,253,253,253,205,227,226,226, 62,172, 83,167,142, 4, 0,204,204,204, - 26,249,248,248,124,254,244,233,211,124, 83,163, 90, 37, 6,139, 32, 8, 80, 20, 85,106,180,104,146,132,139,179, 99,233,243,226, -254,105, 68, 21, 90,121, 73,153, 90, 41, 0,120,122,122, 98,195,214,147,100,239,222,189, 49,101,202, 20, 24, 12, 6,108,218, 84, - 52,200,110,216,176, 97,208,235,245, 56,122,180,104,144, 36, 77,211, 85,134, 77,110,223,190,141, 59,119,238,192, 96, 48, 32, 55, - 55, 23,191,252,242, 11, 46, 94,186,132, 3,199,127, 67,220,179, 39,104,218,192, 11, 99,199,142,129, 72, 36,194,174, 93,187, 16, - 24, 24,248,183, 94, 16, 68, 34,209,240,237,219,183,187,236,220,185, 51,231,248,241,227,133,237,218,181,147,174, 93,187,214,113, -195,134, 13, 10,157, 78,135,169, 83,167,166,221,184,113, 67,219,175, 95, 63,243,109,219,182,185,212,171, 87,175, 7,195, 48, 21, - 25, 45,115, 0, 67, 0,140,200,206,215,209, 57,249,106,112,140, 14,207,226,158, 35,183, 64, 7,142,213, 35, 62, 49, 25, 5, 26, - 22,153, 89,249,104,218,162,231,119, 23, 46, 92,152,171,215,235,231, 0, 8,169,110, 63, 31, 62,124,136, 27, 55,110, 32, 46, 46, - 14,207,158, 61, 43,239, 20,199,141,195,158, 61,123, 76,142,104, 85,108,178, 40, 16, 90, 31,132, 28, 15,203, 73,123,162,124, 99, - 76, 86,241, 53,104,129,139,139,203, 2, 23, 23, 23,217,217,179,103,173,235,212,169, 3,134, 97,116, 47, 71,178,186,116,233, 50, -111,251,246,237, 46, 62, 62, 62,147, 1,172,251, 39,236, 59, 73, 98,220,138,205,193, 14,150,146,248,100, 60, 94, 93,156, 75,144, - 2, 84,121,192,133,125,160, 59,206,127, 62,185,223, 76,219, 89, 59, 23,143,227,192, 85, 58, 66, 54,246,105, 2, 54,111,222,128, -105, 83, 71,225,199,239, 87,128,227,104,104, 13, 20, 60,189,219, 65,171,231, 64,144, 52,154,181,104,133,243, 23, 46, 67, 68, 2, -135,119,110,126,195,124, 22,178, 34, 34, 34, 54, 29, 63,126,252,147, 41, 83,166,128,227, 56,201,194,205,155,213,233,233,233, 75, - 97, 90,254,171,151,117,250,111,222,188, 57,102,214,134,244,159,166, 13, 7, 21,119,138,200,186,243, 8,118, 3,103,242, 56,178, -156, 64,203, 6,200,146, 87, 92,197, 95,122,105,253,102, 24,173, 18, 39, 89,118, 93, 17, 45,124,235,126,101,109,103, 59,134,180, -116,115,152, 49,101, 34,253, 52, 69,131,163,117, 62, 40,248,125,247,122,243, 20, 70,250, 93, 44, 52,107, 77,249,226,131,191,255, - 94,250,120,229,254,253, 21,190,167, 28, 56,208,232, 59,179,202,162, 88,166, 70,178, 0, 64, 46,151,219,244,232,209, 3,221,186, -117,195,251,239,191, 95,218, 39,171,121,243,230, 56,112,224, 0, 6, 12, 24,128,123,247,238,193,197,197, 5, 13, 27, 54, 68,195, -134, 13,241,243,207, 63,155,122,145, 3,203,178, 8, 8, 8, 40, 25,117,216, 52, 49, 49,209,170,166, 5,169,213,106,145,153,153, - 9, 59, 59, 59, 72, 36, 18,180,109,219, 6,159,124,218, 22, 14, 46, 63, 32,192,191, 1, 10, 11, 11, 75,135,191, 27, 81,217, 6, -212,175, 95, 31,233,233,233, 72, 79, 79,135, 66,161,128,171,171, 43,156,157,157,177,122,245,106,126,221,186,117,191,234,245,250, - 77, 25, 25, 25, 38, 71,178,156,157,157, 59, 17, 4, 49, 79,173, 86, 75,202,220,225, 74, 20, 10,197, 9,181, 90,189, 84,169, 84, - 26,221, 17,148, 32, 8,232,245,122, 16, 4,129,211,207, 92, 81,168, 35,144,151,120, 7, 83,254,231, 85,206,120,137, 68,162,106, -155, 75,121,158, 47, 28, 58,116,168,163,135,135, 59, 18, 98, 31,226,200, 17, 30,223,126,251,109,201,168, 72,196, 20,223, 24,148, - 60,239,218,181, 43,188,189,189,193,155,144, 43,131,227, 56, 60,120,240, 0,251, 79, 92,132,139,151, 63,226, 31, 71,227,238,207, -167, 80, 71, 97,135,198, 45, 90,193, 96, 48,212, 42,245,198,235,192, 96, 48,236,240,245,245,229,117, 58,221, 69, 0, 27,194,195, -195, 71, 41,149,202,169, 39, 79,158,116, 29, 52,104, 80,242,169, 83,167,214, 2,216, 25, 30, 30, 30,252,245,215, 95,119, 99, 24, -166,194,209,130, 20, 69,253,248,217,103,159,117, 25, 52,104, 16, 33, 38, 13,186,179,103,118,209, 12, 99, 32,190,152,179,131,189, -112,229, 34,201, 48, 6,226,253,161,159,113, 63,255, 30, 78, 78,248,116, 37,219,188, 93,111, 68, 68, 68, 56, 7, 5, 5,125,109, - 48, 24,170, 52, 90, 37,145,170,202, 34,148, 20, 69, 97,212,168, 81, 56,112,192,248, 30, 84, 99, 1, 31, 43, 47,139, 27, 75, 54, -118,183, 32,232,130, 50, 38,171, 30, 66,142,135,229,164, 62, 78,126,163, 76, 22, 0,100,102,102,110, 5,176,149,227,184, 84,115, -115,115,228,231,231, 87,244,251,147,133,135,135,203, 36, 18, 9,122,246,236,105, 23, 26, 26, 26, 67,146,228,186,228,228,228, 74, - 29, 71, 69,205,132, 21, 53, 39,162, 22,163, 14,109, 21, 8,106,219,169,133,229, 35,235,197,150, 50, 90,115,175, 78,140,204,138, - 0,144,171,117,122,118,237,197,144, 60, 34, 77,218,188, 85,215,150,176,162,205,131,114,152,252, 10,141, 22, 73, 81,119,115,179, -115,222,205,203,215,225,202,213, 8, 12, 29, 82, 31, 90, 61, 1,142, 35, 81, 80,168, 5, 40, 17, 72, 0,195, 62, 24, 9,158,160, -145,149,154, 12,138,162,194,193, 48,120,195,152, 29, 28, 28,252,238,156, 57,115,234,206,152, 49, 3, 51,102,204,240,218,190,125, -251,214, 37, 75,150,204, 72, 79, 79,111,130,106,146,143, 87,161, 83,231,212,129,249,211, 79, 92,222,146,219,187,131,250,113,203, - 6, 69,145,175,150, 13,144, 37, 18,225, 9, 77, 33,147,231,203,119, 51, 10, 10, 10,234, 92,118,253, 47,227,229, 78,240,165,207, -141,234,163, 85,191,174,219, 59, 45,154, 7,124, 58,119,206, 92,203,168,107, 23, 48,235,171, 13,188,111,171, 30,249, 91, 47,223, -213, 21,152,123,191, 91,144,241,228,170,177,254, 2, 0,222,121,123, 0,154, 54,106,243,202,155,129, 93,139,146,181, 95, 57,127, - 27,169,233, 73, 70, 87,182,197,230,160,194, 62, 89,198, 12,233,127, 25,181, 90,157, 19, 17, 17,225,152,152,152, 88,174,227,187, -183,183, 55, 8,130, 64, 88, 88, 24,110,220,184,129,161, 67,135,130,166,105,136, 68, 34, 92,188,120,209,164,104, 76,153,232, 82, -201,168,195, 94,238,238,238,149,141, 54,172, 86, 75,173, 86, 35, 55, 55, 23,103,206,156, 65,253,250,245,177,100,201, 18,184,186, - 56, 97,238,220,233,224, 56, 14,121,121,121, 96, 89,214,216,136, 22, 87, 18, 45,226, 56, 14,233,233,233,168, 91,183, 46, 54,110, -220,136,181,107,215,126,173, 84, 42, 79,154,186,143, 30, 30, 30, 54, 44,203,126,209,187,119,239, 30,253,250,245, 67,175, 94,229, -243,177,238,219,183,207,242,232,209,163, 75,215,175, 95,255,142, 94,175, 95,150,150,150,150,110,140,238, 15, 63, 20,165, 95,146, -183, 91,128, 89,131,234, 96,196,164, 93, 88,189,250, 24,164, 82,105,185,138,119,241,226,197, 85,154, 24,142,231,125,197, 25,215, -146,167,207, 92,229,184,116,105, 40, 66, 67,211, 64,146, 36, 92, 92, 92, 64,146, 36,158, 63,127, 14,146, 36,225,229,229, 5,146, - 36,145,148,148, 84,210, 39, 48, 27, 21,140,122,172,248, 46,156,132, 70,163, 65, 66,124, 28, 18, 99, 99, 96,145,151, 2,133,149, - 28,217, 15, 31,160,233,216,113,165,249,159,254,102,246,232,116,186, 61,101,158,175, 58,117,234,148,142, 32,136,247, 81,212, 79, -163, 36,162,241, 53,195, 48, 95, 87, 38,210,174, 93,187,230,115,230,204, 17,149,164,219,112,245,252,134,209,235,245, 28, 0, 52, -104,250, 86, 57,183,255,228,201, 19,172, 94,189, 26,133,133,133, 16,139,197, 98, 99,206, 3,199,113,165, 35, 12, 43, 50, 97,166, -152, 44, 0,176,247,114,255, 46,236,206, 69,246,126,236, 22,117,248,163, 95,204,148,241, 36, 72,221,155,107,178, 94,142,108,185, -187,187, 47,224, 56,142,231,121,126,126,153,183,164,158,158,158,151,207,158, 61,107,207, 48, 12,214,175, 95,111,147,146,146, 98, -243,214, 91,111,205, 2, 80,169,209,170,168,153,176,162,230, 68,148, 25,117, 40,149, 74,237,116,186, 74,131, 39,175,140, 58,100, - 89,248, 89, 89,218, 32, 27,137,208, 58, 24,154,231,216, 51, 89,231,148,227,238,185,190,104,209,200,156, 53,212, 37,243,116,112, -147,219,128,227,249, 74,135, 70,107, 13,134, 95,238,221,185,219,211,211,163, 62,117, 50,228, 18,250,246, 31, 4,173,150,132,198, - 64,128,160, 68, 32, 40, 49,154, 52,109,129,134,141,155,130, 7,112,251,230, 53, 70,103, 48,156,123,147,202,222,165,227, 39, 67, - 9, 2,235,192,115,124, 5,121,180,234,246,239,223,127, 41,128, 79,171,211,113,108,247,201, 80,146, 44,210, 41,155, 71,235,179, - 79,130,241,240,166,200,250,210,157,229,226, 94,237,112, 58, 61,148,128, 92,246,199,168, 67, 17, 89,171,212, 28,255, 22,195, 85, -189,209,242,240,240,176,177,146,202,126,248,120,236, 24,203, 23,247,175, 35, 37, 50, 12, 87, 47,197,100, 31, 60,122, 44,171, 48, - 51,109,172, 9, 38,171,180,153,207,222,185, 14,188,253, 95, 53, 90, 50, 11, 5, 0,192,219,191, 13, 40,115,211,210, 8, 85, 20, -205,170,137,201, 42,123,193,174, 40,135,214,132, 9, 19,176,125,251,118,116,236,216, 17,190,190,190,165, 23,123, 83,163,102, 21, - 68,151, 76, 30,109, 88,150,252,252,124,120,121,121, 97,219,182,109, 8, 15, 15,135,165,165, 37,134, 14, 29,138,252,252,252, 82, -131,101,108,103,120,158,231,159,156, 61,123,182,245,224,193,131,121,145, 72, 68,228,228,228,192,198,198, 6, 27, 55,110, 44, 84, - 42,149,167,107, 96,178, 6,137,197,226,233, 67,134, 12,161, 26, 52,104,128,212,212, 84, 88, 89, 89, 25, 8,130, 16, 1,128,141, -141,141,193,204,204, 12,193,193,193,104,214,172, 89,167, 25, 51,102,116,164,105,122, 99,114,114,242,174,170,126, 75, 4, 65,148, - 86,168, 99,215, 69, 67,167, 43,170,160, 55,109,218,132,226,190,110,127, 52, 17,196,198, 2, 70,140,100,177,176,176,128,175,175, -111,133,101,223,169, 83, 39,220,190,125,187,168,105,146,166,225,232,232,136,171, 87,175, 26, 53,146,170, 36, 17,100, 68, 68, 4, -252,189, 29, 16, 30,122, 22, 14,114, 17,154,185, 58,195,189, 83,103,196,196,196,252,157,209, 44, 2, 69,253, 48,186, 23,255, 6, -119, 0,152, 80,230,249, 70, 0,223,153, 34,200, 48, 12, 79,146, 36,145,144,144,160,151,203,229,132,157,157, 29, 45,149, 74,161, -213,106, 75, 13,215,147, 39, 79, 16, 18, 18,130,196,196, 68,216,217,217,145,214,214,214,208,235,245,217,198,232,251,249,249,193, -217,217,185, 92,199,247,177, 99,199,214,200,100,141, 2, 2,182,127,179,172,142,148,164,172,253, 29,222,193,179,232,231, 26, 82, - 7,217,127,193,100, 1, 64, 78, 78,206, 86, 0, 91, 75,158, 59, 56, 56,140,166, 40,106,174, 86,171,181,190,120,241,162,141, 66, -161, 32,118,237,218,101,152, 63,127,126, 14, 69, 81,217, 4, 65,172,249,251,205, 33, 34, 51,114, 99,189, 68,182,174,220,125, 13, -127,109,106,194,172,134,217,162,250, 10,162,113, 0,250,167, 69, 93, 25,205,196,118, 72, 85,166,144, 60,184,200, 42,174,193, 59, -102,205, 89,252, 69, 76,244, 93, 79,153,149, 12, 19,130,231,224,244,175,231, 65,144, 34, 92,190, 22, 6,157,158, 69, 70, 86, 46, -134, 12, 27, 14,119, 23, 7, 68,222, 56,147,206,112,220,198, 55,203,100,115, 27,122,246, 29,109, 43, 53,147, 23,159, 19, 22,123, -190,159, 14,146, 92,135, 47,191,252, 18, 1, 1, 1,147, 34, 34, 34, 22,161,154, 60, 90, 4,193,109,104,210,121,152,173, 88, 90, -164,195,115, 44,182, 29,158, 85,156, 71,107, 26, 54,110, 61,218,164,177,247,179,133, 85,229,209,122,131, 76, 86,217,117,213, 70, -203,203,203, 75,106, 46,194,120, 17, 69,207,248,248,131,126,138,180,216,135, 72,140,186, 91,212,188,160, 87,235, 83, 30, 71, 25, -147, 10,189, 59,202,231,239,224,171,106,186,210,104,140,186,163, 47,167, 89, 82,225,190, 28,205, 50,209,100,189,162, 89,214,108, -149,205,155,229,225,225,129,165, 75,151, 26,147, 71,235,229, 99, 47,161, 23,138, 58,192,151,237, 12,223,203, 72,147, 85,161,166, - 66,161, 64,102,102, 81,134,132, 46, 93,186,160, 75,151, 63,198, 51,232,245,250,210, 40,150,165,165,101, 69, 17,173, 87, 52,205, -204,204,102, 29, 59,118,108,204,181,107,215, 6,127,254,249,231,162,110,221,186,149,152, 57, 21,140,155,219,173,156, 38,203,178, -193,103,206,156,161, 56,142,195,182,109,219,112,251,246,109, 94, 46,151,207,147,203,229, 27,204,204,204, 88,181, 90, 61, 97,220, -184,113,195, 23, 46, 92, 72,118,234,212, 9,215,175, 95, 39,235,214,173, 59, 18, 40,151,196,178,194, 99, 15, 11, 11, 3, 73,146, - 96,178,226, 49,105,214, 65,152,155,209,136,142,142, 70, 86, 86,214, 43, 73, 76,141, 57,159,101, 35, 37, 37, 75,167, 78,157, 74, -155, 33,219,182,109, 11,138,162,112,239,222,189,202,154, 97,203,106,242,246,246,246,165,191, 15,177, 88,140,243,231,207,227,171, -175,190,130,167,157, 13,178,163,194,225,220,229,109,244, 24, 51, 14, 67,135, 14, 5, 69, 81,176,179,179, 43,141,252, 26,241, 91, -170, 13,101, 53,199,248,251,251,143,140,140,140,116,111,210,164,137, 75, 68, 68, 68,215,128,128, 0,175,240,240,240,146,231, 82, - 24,215, 55,167, 84,243,214,173, 91, 71, 54,108,216, 16, 60,106,212, 40, 49,199,113,236,139, 23, 47, 12, 0, 8,103,103,103,234, -214,173, 91,220,201,147, 39,161, 86,171,225,238,238, 78,186,185,185, 17,231,206,157,227,162,162,162,194,120,158,159, 99,204,177, -179, 44, 91, 46,141, 67,201,227,125,251,246,153,252,127,175,211,208,111, 73,183,183, 26,120,100, 36,223,131, 50, 41, 22,108,174, - 66, 31,114,252,148,214, 68,147,245,103,151,209, 95,169,185,248,241,227,199,110, 90,173, 22, 18,137, 4,155, 54,109,210, 47, 93, -186, 52, 50, 35, 35, 35, 16, 21,143, 40, 47,167, 89,195, 81,135, 89, 85,104,190, 50,234, 48, 55, 19,167,143,159,184,213,218,162, -255, 14, 76, 74, 78, 47,237,216,200, 19,132,221, 49,167, 70,129,242, 54, 77,146,200,159, 23,144,249,172,234,116, 21,199,174, 83, -235,116,131,250, 15, 24,246,219,129, 3,251, 45,230, 47, 88,128,171, 97,225,200,204, 41, 0,199, 83,224, 8, 2,115,231,206,135, -179,131, 29,242,146, 31,171,180,122,125,127,148,207,161,245,175, 47,119,130, 32, 39,159, 59,185,107, 29, 73,128, 43, 76,125, 36, -165,242, 99,229, 35,134,246,167, 7, 13, 26,132, 99,199,142, 33, 34, 34, 98, 75, 21, 38,171, 84,147,231,201,201,225, 23, 15,174, - 35, 0, 78,157,254, 72, 74, 23, 60,147,143,252,160, 63, 61,116,232, 80,252, 20,114, 13, 7, 78, 61,219,124,224, 20, 78,225,205, -198,244,204,240,150, 52, 34, 2, 27,249,184,117,106,209, 88, 70,179,106, 36, 70,197, 34,171, 80,131,115, 15, 95,228,144, 60, 89, -227,220, 58, 69, 23, 72, 49,226,227, 31, 87,112,103, 37, 43,174,208, 53, 38,105,146, 36, 89, 46,154, 85,155, 72, 86,217,253,116, -114,114, 42, 55,157, 75,217,138,187,164, 15, 80, 13, 82, 59,204,138,143,143,183,138,143,143, 7,207,243, 8, 11, 11,179,106,219, -182,237,172,218, 68,179,166, 79,159, 94, 26,181,122,121, 93,209,107,213, 81,220, 41,125,173,193, 96, 56, 60, 99,198,140, 73,109, -219,182,237,185, 96,193, 2, 2, 38, 76,192,251, 82, 52,135,225, 56, 14, 23, 46, 92,192,177, 99,199, 88,189, 94, 63, 94,169, 84, -134,151,217,100,253,157, 59,119,206, 13, 24, 48, 96,215,163, 71,143,168,200,200, 72,240,124,245,227, 78,213,106, 53,124,125,125, -193, 48, 12,150, 79,242, 64,126,126, 19, 48, 12, 3,150,101, 97,110,110, 94, 26,197, 43,107,158,171,251, 29,177, 44,251,138,209, - 10, 11, 11, 3, 69, 81, 8, 12, 12,196,221,187,119, 75, 35, 90,213, 69,160,244,122,125,188,147,147,147,211,226,197,139, 75,247, - 43, 61, 61, 29,103,207,158, 69,187,246, 29,208,104,252, 4, 36, 39, 39, 99,205,154, 53,112,117,117,197,146, 37, 75,144,149,149, - 5,134, 97,254,234,112,250,187,145,145,145,238, 31,124,240, 65, 90,120,120,184,123, 72, 72,136, 77, 80, 80,144,249,176, 97,195, -210,194,195,195,221, 9,130,232, 0, 19, 59, 65,115, 28, 55,123,238,220,185,191, 46, 89,178,100,214,167,159,126,218,118,212,168, - 81, 34,145, 72,196, 37, 37, 37, 49,251,247,239, 39,124,125,125, 73,177, 88, 76,156, 57,115,134,187,121,243,230, 13,134, 97,150, - 3,184,108, 74,196,185,172,201,162, 40,202, 88,147, 85,142,169,142,210,145,150,100,122,224,134, 77, 75,201, 6,222,238,250,221, -251,207, 38, 92,190,254,248, 41,165,101,166,254, 80, 69,106,128, 55, 25,138,162, 14,249,251,251,143,158, 60,121,178, 89,175, 94, -189,164, 11, 23, 46,204,205,207,207,175,204,100, 85,112,195,252,151,140, 58,252,126,246,231, 33, 83, 63,107, 50,218,231, 35,231, - 58, 8, 45, 76, 67, 54, 77,145, 86, 54, 36, 90,120, 81,200,207,120,162, 56,245,219,206,231, 0,170,203,203,118,235,206,131,136, -238,141,155, 52, 63,186,124,201,114,199,121, 51,103,136,142,134,252, 2,158,209, 35,236,226, 69, 88,136, 89, 62,234, 78,104,170, - 86,175,235,135, 55,112, 10, 30,229,213,239, 14, 0, 56, 97,103,103,119,127,204,168, 81,190,254,254,195, 32,151,203,113,228,200, - 17,236, 89,191,158, 93, 11, 12,150, 2,119,131,171,201,167,151,118,163, 84,231,222,184, 49, 99,252, 90,180,248, 8,114,185, 28, -135, 15, 31,198,174,181,107,141,214,249,151, 83,146, 25,254, 52,254,200, 16, 95, 77, 31, 45,146,200,191,241,248, 69, 65,216,227, - 23, 5,224,120,158,227,121, 45, 73, 34,161, 80,175, 95,242,248, 89, 82,141, 76, 65, 73,211,225,215,223, 76,126,125,109, 30,101, -204, 79, 77,135,116, 87, 96,178, 18,203,206,145, 86,182,146,174,236,177,193, 96, 72, 52, 82,126,153,167,167,231, 43,175,213, 60, -244,203,155,100,178,140,205,163, 5, 0,153,153,153, 74, 0,243,174, 95,191,190,175,103,207,158,227, 0, 36,213,176,140,182,117, -238,220,121, 60, 0,138, 32,136, 45,201,201,201,225,175,252,225,149,202, 24, 87, 87,215,149,222,222,222, 19,138,110, 76,137,109, -213, 84,228,207,154, 52,105,162,175,168, 44, 42,123,206,113, 92,181,101,148,147,147,131, 54,109,218,188, 50,167, 37,207,243,120, -241,226, 69, 73,196,169,244,220, 87,101,224, 10, 10, 10, 38,124,242,201, 39, 91, 69, 34,145, 39, 0,162,196,228,178, 44, 75,125, -247,221,119, 50,150,101, 41, 0, 4, 73,146,140, 72, 36,210, 28, 59,118,140, 97, 24, 38, 94,171,213, 78,248,139, 47, 16,135,137, -162,169, 24, 10, 35, 35, 35, 27, 20, 71,178, 18, 35, 34, 34,238, 29, 56,112, 64, 1,224, 96, 13,117, 47,171, 84,170,203, 75,151, - 46,237,180,105,211,166,217, 19, 38, 76,104, 51,116,232, 80,186, 75,151, 46, 56,125,250, 52,123,225,194,133, 48,181, 90,189,204, - 20,131, 85, 92,150,185, 30, 30, 30,165,134,171,154,255,114,149, 29,121,237,189,164, 27,134, 79,116,149,109, 91,118,182, 32, 35, - 89,119,205, 80,160,155,179, 19,136,192,127,152,212,212,212,207, 1,204, 95,179,102, 77,114,179,102,205,164, 98,177, 88,103,172, -201,250, 11, 97,184,156,130,247,190,237, 49,240, 68,231,185,159,120,247,232, 26, 40,247,168,227,232, 22, 21,155,138, 39,215, 79, - 23,222, 63,245, 77, 28,175,205,238, 11,192,152,158,235, 55,181,122,125,253,233, 51,166, 79,146,136, 68, 61, 89,150,109,218,237, -220,113,158,162,168,112,157,193,112,174,184,185, 80,243, 6, 23,249,215, 43, 87,174,244,245,247,247,199,145, 35, 71,112,110,239, - 94, 12,201,200,192,121,138,162, 72,177,216,254,148, 94,191, 10,198, 25,164,175, 87,175, 94,237, 23, 16, 16,128, 67,135, 14,225, -204,174, 93, 24, 92, 51,157,202,234,186,214, 0, 20,197, 79, 51, 0, 60, 2,208, 18,128, 25, 0, 45,138,166,118,114, 40, 91,133, - 21,191, 87,242,254, 37,130, 32,254,204,142,176,213,103,134,127,153,136, 39,113, 45, 95,247, 94,168,213,234, 44, 95, 95, 95,147, -198, 92, 27, 12,134, 42,219,112, 25,134, 73,244,241,241, 49, 58,106, 97,140, 41,202,202,202,106,245, 39, 22, 70,173,250, 98,149, -171, 68, 56, 46,206,197,197,133, 43,169,244, 43, 50, 97, 21,189,198, 3,207, 77,249,158,148,148,148, 71, 0, 62,171,233,126, 38, - 39, 39, 31,133, 17,147, 70, 27,187, 29, 0,100,103,103,191,246,201,124, 9,158, 79, 90,184,112,161, 73, 6, 27, 60, 95,149,249, - 12, 47, 40, 40,104,107,204,119,235,245,122,252,141, 28, 42, 94,200,136,136,136,113, 4, 65,244, 66, 81,147,192, 22,188,158,108, -222,151,243,242,242, 46,175, 88,177,162,211,182,109,219,166,242, 60,143,188,188,188,181,166, 26,172,210,187,231,180,180,211,175, -235,192,179, 82,117,191,239,223,146,248,182, 58, 71, 63,117,123,129,110, 23, 4, 74,131, 81, 60,207,255, 56, 98,196,136,118, 0, -118,214, 86,172,146, 81,135,181,229, 57,151,157,219,236,252,244,175,198,156,183,177,236, 13,150,110, 0, 29,121, 10,186,204,211, - 0,126,128,113,221, 28, 74,143,151,225,184,213,140, 78,183,186, 76,229,242, 95, 40,103,187,128,128,128,169,163, 71,143,198,252, -249,243,113,102,213, 42,253, 68,130,200, 21, 1,252,175, 69, 55,154, 36, 1,204, 52, 86,103,228,200,145,152, 63,127, 62,126, 94, -190,188,166, 58, 85,161, 32, 8, 34, 4, 0,102,205,154, 53,103,233,210,165,182,179,103,207,110,186,108,217,178, 37,197,207, 31, -150,188, 95, 92,215, 5,205,158, 61,187,113,153,247,243, 1,220,250,147,207,103,133,153,225,255,108,186, 11,154,130,166,160, 41, -104, 10,154,130,166,160, 41,104,214, 6,158,231,123, 23,173, 42, 95, 87,246,184,204,250,111,129,134,128,128,128,128,128,128,128, -192,191,144,178, 81,172,154,188,255, 26, 41,233,163, 85,150,109, 64,209,176,238,202, 92,169, 41,163, 30,106,226,108, 67, 5, 77, - 65, 83,208, 20, 52, 5, 77, 65, 83,208,252,207,105, 86,167,253,202,231,121,158,239, 77, 16, 68, 8,207,243, 65,149,173, 75,140, -213,203,143,203,172, 95, 91,183,131, 10, 40,233,155,245, 74, 31,173, 63, 27, 33,172, 42,104, 10,154,130,166,160, 41,104, 10,154, -130,102,173, 40,105, 2, 4,192,207,154, 53,107,246, 63,176,233,208,165,216,100,149, 93, 0, 84,209,116,200,243,135,169,164, 36, - 88, 73, 36,114, 49, 0,232,116, 42,189,155, 27,242, 8, 98,208,223, 57,225,173,192,191,147,146,225,222,169,175,121, 91, 1, 1, - 1, 1,129,255, 6,233, 37,145, 42, 0,233, 0,136,226,231,186,226,117,122,177, 33,123,249,113,185,247,255, 68,148,168, 36,146, - 69, 87,102,178, 50, 50,228, 14, 52,157,237,199,178,154,134, 0, 64,211,100,116, 70,134,109, 12,207, 31,206,168,137,217,114,112, -116,188, 35,162, 40, 55, 99,182, 53,176,108, 82, 70,106,106,249,212,241, 4,241, 38, 24, 60, 99, 77, 68,109,204,198,159,110, 84, - 28, 28, 28,156,156,156,156,254,103,101,101,213, 62, 39, 39,231,102,122,122,250, 79, 85,204,123,184,148, 32, 48,163,232,119,133, - 21, 0,102, 87, 33,109,202,182, 47,227, 43,151,203, 39, 17, 4, 17, 80,252, 7,139, 80,169, 84,155, 0, 60,254, 15, 94,144,204, - 0,244,163,105,122,164,131,131, 67,155,148,148,148,133, 0,106,154,205,155, 6, 48,221,198,198,102,136,141,141,141, 79, 86, 86, -214,211,188,188,188, 67, 0, 86, 3,168,118,168,244,194, 79, 93,218,119,233,213,101,222,133, 51, 23,190, 94,184, 94,121,253,149, -247,167,187,216,247,236,209,113,254,133, 83,215, 22,207,217,152,156,101,226,190,145,197, 11, 80, 52, 58,146,199,171,201, 94,107, -139, 8, 64, 31, 0, 93, 0, 92, 0,112,202,152,227,174,132,118, 0,230, 20,239,243,106, 0,231,255,225,191, 35,115, 39, 39,167, -229, 0,250,208, 52, 29,153,148,148, 52, 30, 64,226,223,188, 79, 52,128,214, 0, 2, 80,148,134,227, 22,140, 75,225, 80, 45,246, -246,246, 65, 52, 77, 79, 42, 78,237,178, 41, 51, 51, 51,228,159, 90, 48, 18,137,100,173,179,179,243, 71,106,181, 90, 69, 16, 4, - 95, 54,223, 35,195, 48,137, 25, 25, 25,173,222,180,139, 26, 65, 16,183,254,225,187, 56,190,130,215, 42,207,163,149,148, 4, 43, -154,206,246, 75, 75, 9, 31,146,172,124, 48, 24, 0, 92, 93,154, 30,114,116,110,114, 48, 41, 73,162,119,110,208,223, 66, 36,167, - 55, 81,148,168,185, 70,167,117, 16,209,162, 12, 61, 99,184, 71,234,248, 73, 41,143,126,170, 48,217,162,136,162,220,226, 98,206, - 59, 50,250, 44,136,100,174, 16,153,121, 86,186,183,174,174,174, 53, 58, 74, 91, 91, 31, 75,189, 84, 54, 85, 36,162,122,112, 60, - 19,192,115, 0, 73,136, 34, 24,214,240,155, 88,171,253, 54, 59,251,105,126, 77,207, 96, 3,123, 56,243,192, 80, 16,232, 1, 30, -231, 8,224,192,163, 76,164,152, 32, 97,172,137,168,141,217, 40,251,217, 53, 0, 62,127,221,191, 36, 55, 55, 55,219,160,160,160, -181, 95,125,245,149,153,133,133, 5, 17, 31, 31,223,107,230,204,153,111,221,190,125,251,179,164,164,164,228,151, 77, 31, 65, 96, - 6,199,241, 36, 0,144, 36, 49, 83,161,112,148, 83, 20,245, 74,110, 35,150,101,229,233,233,105,147, 57,142, 39,138,183,157,193, -243, 88,103,140, 97,148,201,100,195, 2,154, 52,255,108,249,202,213, 22, 78,142,142,230, 12,203,233,159,191,136,147,207,155,245, -121,219,216, 39,143,215,105, 52,154,253, 53,249, 95, 83, 20, 53, 68, 42,149, 6, 1,240, 47,126, 45, 74,171,213,134,176, 44,123, -208,216, 10,221,201,201,233, 18, 69, 81,117, 76,249, 98,150,101,227, 83, 83, 83, 3,107, 88, 68,131, 60, 61, 61,127,232,220,185, -179,188, 77,155, 54,144, 72, 36,152, 63,127,254,116,165, 82, 89,157,209,162, 1, 76,151,203,229, 67,204,205,205,125, 10, 10, 10, - 98,213,106,245, 81,137, 68,210,125,221,186,117, 30, 29, 59,118,180, 76, 77, 77, 37, 40,138,114,250,249,231,159, 63, 92,187,118, -109, 47,134, 97,186, 85, 87,201,229,198,242,243,164,125,252, 59,229,198,158,159, 7,224,221,151,223,103, 52,178,145, 60,229, 17, -164,230,239, 38, 20,155, 15,163, 77,150, 72, 36, 90,231,236,236, 60, 90, 83,148, 43,128,127,185,194, 1, 0,157, 78,151,157,147, -147,211,160, 38,127,121, 0, 99,109,108,108, 70,127,241,197, 23,182,239,190,251, 46,246,238,221,251,241,246,237,219,179,243,242, -242,126, 68, 81, 34,204, 71, 38,106,206, 72, 73, 73,121, 79, 36, 18, 17, 30, 30, 30,148, 90,173, 54,197,104,249,161,104, 18,230, - 91, 0, 54,161, 40,117, 65, 87,160,232,255, 14, 96, 69,137,113, 35, 73,114, 83,131, 6, 13,254, 23, 21, 21,181, 25,192,215, 53, -253,175, 59, 59, 59,111,221,184,113,227,224,190,125,251, 82,233,233,233,110,205,154, 53,219,151,146,146,210,233, 53, 92, 70,198, - 72,165,210,105, 77,155, 54,109,244,232,209,163,152,188,188,188,213,197,231,179,170,255,148, 59,128,238, 54, 54, 54,221,230,206, -157,107, 17, 20, 20,132,109,219,182,189,183,125,251,246,130,252,252,252,223, 80,212,167,167, 86, 38,144,166,233, 73,137,137,137, - 14, 60,207,195,197,197,101, 18,128,127,164,209, 34, 73,114,221,128, 1, 3, 70,239,219,183, 79, 30, 23, 23, 39,119,115,115, 43, - 77,158, 77, 16, 68,141,235, 79,129, 90,179,173,140,225,170, 62,143,150, 68, 34, 23,179,172,166, 97,178,242,193,224,183, 58,127, -103, 13, 0,151, 46,126, 50,216,209,185,113,132, 68, 34,143,145, 90,201,142, 13,232,211,189,249,192,160,206,132,187,139, 35, 18, -149,105, 78,223, 31, 56,243, 78,200,153,243,199, 80,148, 64,172, 66, 24,125, 22,204,244,161,120,116,101, 61, 28,186, 36, 99,195, -207,137,184,126,255, 57, 84,185, 25,168,227,108,134,149, 83,123,194,217, 86, 94,179, 91, 47, 71,223,174, 12, 45, 61,248,193,176, - 17,214,255,235,231, 47,242,114,118, 6,207, 75, 17, 19, 91,208,225,151,179,231, 91, 31, 61,188,127,146,185,200,119, 72, 97,218, - 99,163, 47,110, 45, 92, 96, 86,168, 71, 63,154, 34, 62,236,216,170, 81,183, 97,239,117, 34, 27,249,215, 71,228,195,168,158, 39, -126, 15, 91, 73, 94,123,248, 27,195,242,187,205,197, 56,126, 87, 89,101, 66,191, 87, 12, 71,183,110,221, 59, 73,165,210,114,201, -147,180, 90,173,248,183,223, 66,219,213,196,108,148,124,135, 78,167, 37, 69, 34, 9, 72,146,248, 44, 32,160,137,127, 70, 70,198, -121,130, 32,126, 72, 78, 54, 45, 90,240, 9, 32,201,166,233,150,164, 84,234,194,234,116,246, 0, 64, 72, 36,217,207, 73,178,201, -220, 57,115, 44, 40,138,226, 50, 51, 51,161, 82,169,136,113,227,198,201, 98, 99, 99, 7, 36, 37, 37,173,175,230,142, 4,219,183, -111,247,115,113,113,121,101,246, 88,165, 82, 41,233,219,247,127, 53, 41,122,191,166,205, 90, 76, 59,115,230, 87,255,188,172,108, -205,246, 53, 91,239, 24,100,114,109, 93,255, 6,162, 77,219,118, 89,143, 31, 61,252,147,232,232,135,247, 96,218,124,117,158,102, -102,102,199, 86,173, 90, 21,208,181,107, 87,145,163,163, 35, 82, 83, 83, 17, 21, 21, 21,240,251,239,191,247,219,181,107,215,116, -181, 90, 61, 0, 48,106, 66, 84,223,223,118,255,224,104,110,103, 15,214, 96,128,107,211, 22,165,249,205,158,252,126, 22,140, 94, - 15,206, 96,128,127, 80,191,226,104, 50, 15,127,127,255,154,102,221,117,109,220,184,241,158, 37, 75,150,136,181, 90, 45,194,194, -194,112,254,252,121, 78,169, 84, 86,151, 16,151, 38, 8,226,236,130, 5, 11,220, 3, 3, 3, 45, 51, 50, 50,192,178,172,195,241, -227,199, 39, 53,111,222,220,202,195,195, 67,178,123,247,110, 20, 20, 20,128, 97, 24, 59, 31, 31, 31,187, 97,195,134,233,118,239, -222, 61, 29,192,242,202, 34, 89,121,177,252, 60, 37,225,243, 78,131,150, 35,145, 66,252,250,206,180,119,240,139, 85, 61,162, 52, -178,245,142,143,143,101, 94,146,124,166,133, 85, 19,187,188,164,208,153,239,248,248,108,255,245,169, 81, 55, 67,100,113,101,243, -193,129, 3, 7,228, 81, 81, 81,114,127,127,127,112, 28, 87,154,129,191, 36,225,172,175,175,111, 77,206,227,178,224,224,224,153, -131, 7, 15, 70,211,166, 77, 75,147,162,126,249,229,151,152, 57,115,166,237,165, 75,151,166,239,223,191,127,250, 79, 63,253,180, - 28,192, 44, 19,163, 49, 37,152, 90,198,139,158, 61,123, 54,232,216,177, 99,195,103,204,152,225, 11, 96, 50,128,249,153,153,153, -157,139,163, 49,146, 98,163, 53,102,250,244,233, 19,103,205,154,133,247,222,123,111,126, 88, 88,216, 55, 53,140,242, 81, 12,195, -188,215,183,111, 95,202, 96, 48,192,220,220, 28, 6,131,161, 94,109,131, 18, 0, 54, 78,152, 48, 97, 98,112,112, 48,108,109,109, - 97, 48, 24,252, 14, 28, 56,176,125,254,252,249,237, 1,140,173,100, 95, 71, 78,156, 56,241,253, 17, 35, 70,160, 85,171, 86,160, -233,162,211,184,106,213, 42, 44, 94,188,216,226,236,217,179,253,118,239,222,221,239,196,137, 19, 71, 81,126,218, 46,147,224, 56, - 14, 52, 77, 35, 33, 33, 1,142,142,142, 82,142,227,206, 16, 4,177, 45, 43, 43,235,167,127, 80,101,190, 98,208,160, 65, 31,236, -219,183,207, 2, 0, 86,174, 92,137,105,211,166,193,201,201, 9, 22, 22, 22,130,213,249,231, 68,180,198, 87, 27,209,170, 14,149, - 74,213, 98,246,167, 31,130, 36,139,238, 26,235,215,245,196,210, 57,227,137, 19, 33,103, 90, 84, 25,131,151,185,226,209,149,245, -144,122, 76,133,214,192,224,198,253,103, 56,183,178, 87, 81,109,249,238, 92,104,245,221, 74, 42, 27, 59,137,153,217, 10, 29,203, - 94,133,179,115, 24, 94,188, 72,175,206,100, 41,156,157, 66,182,108, 89,110, 22, 80,175, 1,244,140, 1, 73,105, 73, 32, 8, 41, -220,221, 44, 49,102,228,187,162,206,157, 93, 29, 22, 45,218,122, 58,133, 67,127, 85,198,227,106, 19,134,250, 57, 96,103,139, 0, -223,193,195,122, 7, 74,155, 4, 52,134, 88,106, 86,250, 94,203, 86,173,208,178, 85, 43,114, 86, 65,126,143,155,183,238,244, 56, -114,246,134, 86,101,120,113, 40, 38, 3,163,170,185,200,148, 26,142, 41, 83,166,192,201,201,169,220, 6,169,169,169,248,253,247, -223, 42,252,140, 9, 23,178,210,239,248,230,155,111, 44,179,179,179,223,221,177, 99,199,219, 28,199,125,147,146,146,114,197, 24, -145, 17, 64,157, 92,169,180,219,232,213,171,185,230,255,251, 31,101,227,236, 76,114, 44, 75, 36, 63,125,106,191,102,253,250, 46, - 89, 79,158,152, 21,218,217,101,101,171,213,170,152,152, 24,200,100, 50,130,166,233,214, 21, 72,165,242, 60, 86,144, 36, 49,147, - 32, 8, 72,165,178,152,224,224,224,187,197,239,213, 57,117,234,148,188, 79,159, 62, 42, 0,113, 0, 32,149,202,220, 40,138,222, - 54, 21,243, 0, 0, 32, 0, 73, 68, 65, 84,244, 43,202,196,142, 21,198, 24, 76,115,115,243, 79,191, 94,178,220, 60, 47, 43, 71, -173, 47, 44, 52, 40,172, 44, 8,194,194,146,202,203,205,207, 79, 82,166,107,231, 46, 92, 76, 77, 24, 51,226,211,194,194,194, 73, -198,154,172,102,205,154,221, 60,118,236,152,163,189,189, 61,114,114,114,144,153,153,137,155, 55,111,130,227, 56, 12, 24, 48, 64, -218,161,109,155, 22,115,230,206,187,158,144,148,212,222, 24,179,101,110,231,128,149,129,205,139, 42,235,184,204,210,242,217, 54, - 40,168,116,155,197,137,185, 37,209,185,218, 76, 33,213,190, 91,183,110, 98, 0, 24, 59,118,108, 94,126,126,254, 82, 0,251, 80, -125, 70,255,233,243,230,205,115,171, 91,183,174,215,190,125,251, 80, 80, 80, 0, 0,142,117,235,214,133,159,159, 31,123,225,194, - 5,248,249,249,193,210,210, 18,151, 46, 93,194,245,235,215,209,170, 85, 43, 75,177, 88, 60, 88,175,215, 87,104,180,186,244,234, - 50, 79,218,199,191, 83,131,150, 35, 97, 97,229,130,237,251, 15,226,209,157, 93,157,180,250,168,121, 98,246,226, 8, 53, 47, 29, -149, 30,111, 49,171, 78,171,206,246,245, 27,255, 15, 94, 45,239, 58,104,216,203,207,230,245,168,187,140,150,105,118, 45, 92,173, -204,172,204,100, 1, 88, 57, 96,192,128, 65, 7, 14, 28,176, 1,128,240,240,112,164,166,166, 66,161, 80, 64, 38,147, 65, 36, 18, -149,206, 79, 90, 67, 70,109,218,180,169,212,180, 49, 12, 83, 58, 11,128, 92, 46,199, 91,111,189,133,230,205,155,227,167,159,126, - 26, 85,137,209, 10,108,219,182,237, 94, 47, 47, 47,143,178, 47, 22, 22, 22, 98,232,208,161, 0,128,206,157, 59,119, 51, 51, 51, -227, 75, 12,161, 82,169, 44,184,117,235, 86, 15, 0, 97,149, 56, 75,117, 82, 82, 18,190,248,226, 11, 60,127,254,252,227, 45, 91, -182,188, 0, 32,147, 72, 36,165,247,199, 0,252, 26, 55,110,188,110,218,180,105,136,141,141, 69,100,100,228, 77,212,188, 41,149, - 53, 55, 55,127, 98, 48, 24, 90, 49, 12, 3,181, 90,141,254,253,251,203,142, 30, 61,154, 74, 81, 84,116, 70, 70,198,112, 20,245, - 73, 49, 22, 25,128,213,193,193,193, 19,103,204,152,129,223,126,251, 13, 39, 78,156,192,136, 17, 35, 48,117,234, 84, 88, 88, 88, -140,158, 58,117,234,117, 20, 77,104,254, 50,221, 54,109,218, 4,150,101, 95,249,111,200,100, 50, 4, 6, 6,162, 81,163, 70, 56, -113,226, 68,183, 90, 24, 45,175,192,192, 64, 9,199,113, 40, 44, 44,196,133, 11, 23, 44,204,204,204, 44,220,221,221,199, 1,248, -199, 24, 45, 47, 47,175,224, 3, 7, 14, 88,148,109,253,145, 74,165, 40,243, 59, 16,248,251, 35, 90, 85,222, 97,149,162,211,169, -244, 52, 77, 70,187,186, 52, 61,116,233,226, 39,165, 77,135, 0, 25,173,211,169,244, 0,192,114, 60,242, 84, 12,204,164, 36,226, - 82,242,241,240,105, 70, 69, 82,229,134,104,138,204, 60, 33,109, 19, 7,158,231,161,211,179,208,230,166, 96,233,105, 21,162, 18, - 53,208, 21,102, 67,167, 47,234,134,229,224,224, 64,159, 57,243,203,180,208,208,223, 39,254,248,227,143, 84,162,181,117,100, 62, -208,162, 34, 77, 91, 91, 31, 75, 78, 34, 57,180,121,203,124, 51,158,122,138,152,248, 66,212,119,111, 3, 7, 27, 15,164,100, 20, -226,106,228,207,136,126, 28,130,186, 46, 94,152,250,233, 59,178,175,151,236, 59, 40,102,188, 61,115,114,158,231, 85,182,159, 37, -119, 81, 91,127,141, 1,147,245, 20,108,102, 44,216,252,228, 87, 54,176, 80,120,162,101, 87, 55, 40, 60,234, 73, 71, 77, 93, 60, - 18, 40,103,180,202,106,166, 18, 4,185,153, 36,137,137, 4, 65,160,105,211,102,137,171, 87,175,174, 40, 21,184,190,105,211,102, -137, 20, 69,186, 23, 93,216,201, 77, 60,207,165, 86,179,159,229, 76,141, 68, 34,157, 81, 20,246,119, 73, 56,125,250,180,126,208, -160, 65, 88,181,106,149,100,230,204,153,115, 41,138, 26, 91, 65,243, 94, 57,205,254,128,167, 77,189,122, 61,191,185,122,149, 23, - 25, 12, 68,214,205,155,121, 57, 74, 37,147,146,159, 47, 57, 28, 29,253,222, 71,159,127, 46,241,240,240,192,149,144, 16,251,244, -194, 66, 62, 71,171, 85,231,228,228,240, 12,195,220,172, 68,115,182, 66,225, 40,223,190,125,187, 95,112,112,240, 93,165, 82, 57, - 27, 0, 92, 92, 92,150, 2,104, 4, 32,174,204,107,216,178,229, 96,210,184,113,227, 98,210,210,210,102, 87,181,159,101,104,236, -168,112,148,239,223,186,251,129,157,165, 25,169,112,119, 37, 69, 54, 54, 52, 35, 49, 19,115,128,186,174, 71, 61,115, 0,141, 43, -249,236,203,154,132,153,153,217,177,147, 39, 79, 58,138, 68, 34,176, 44, 11,133, 66,129,231,207,159, 35, 39, 39, 7,249,249,249, -120, 22, 29, 5,111, 15, 15, 44,154, 53,211,101,242,204, 89,199, 84, 42, 85,171,151, 42,179, 87, 39, 64, 54,232, 95,137,236, 85, - 52,139,193,203,205, 94, 70,150,123, 89,158,199,199,199,195,194,194, 2, 1, 1, 1, 22, 87,175, 94,189, 92,133,201, 42, 59, 9, -240,224,142, 29, 59, 90,238,219,183, 15,173, 90,181,130,181,181, 53, 46, 92,184,128,240,240,112,232,245,122,178,160,160, 0, 22, - 22, 22, 88,182,108, 25, 60, 61, 61,145,159,159,143,184,184, 56,123,145, 72,228,240, 82, 70,251, 82,205, 11,103, 46,124,157, 27, -123,126, 94, 10,241,235, 59,219,247, 31,196,184, 97, 67,224,204, 63,189,108, 93,143,248,186,103,159,142, 95,242,148, 71,144,185, -101, 83, 91,223,128, 62, 16, 75, 44, 48,121,198, 98,196, 68,156,178, 85,229, 63,248,152, 96, 19, 60, 22,174, 62, 60,165,130, 99, - 39, 0,144, 30, 30, 30, 31, 29, 62,124,216,178, 52,244, 66, 81,165,115, 30,150,157, 4,190,138, 9,223,171, 61,159, 4, 65,224, -249,243,231,112,116,116,132,133,133, 69,233, 4,226, 81, 81, 81,184,113,227, 6, 74,102,163,168, 68,115,120,104,104,168,135,185, -185,121,185, 13,120,158, 71, 70, 70, 6, 24,134,129, 92, 46, 7,203,178,208,235,245, 48, 24, 12,208,104, 52, 22,141, 26, 53,154, -100, 48, 24,194, 42,210,228, 56,238,179,193,131, 7,119, 12, 11, 11,243, 89,191,126, 61,116, 58,221,202,148,148, 20,188,255,254, -251,224, 56, 14,221,186,117,107,199,243,252,163,185,115,231, 2, 0,166, 77,155,102, 40, 44, 44, 12,174,201,177, 23,211,168,101, -203,150, 62,191,253,246, 27, 58,117,234, 4,173, 86,139, 85,171, 86, 89,109,217,178,197,106,247,238,221,138, 25, 51,102,252,144, -158,158,222,171, 26, 77, 2,192, 74,103,103,231,137, 93,186,116, 49, 43,158,195, 20,187,118,237,194,162, 69,139, 14, 0,152,251, -203, 47,191, 44, 56,113,226,196,200,143, 62,250, 8,139, 22, 45,154,154,147,147,179,163, 50,205,103,207,158, 65,161, 80,192,202, -202,170,232, 98,169,215,227,222,189,123, 56,119,238, 28, 26, 54,108,104,204, 49, 85,182,159, 94, 3, 6, 12,248, 97,255,254,253, -150, 9, 9, 9,184,116,233, 18,188,189,189,161, 82,169,140,153, 27, 54,244, 79,168,176, 43,213, 84,171,213,154,248,248,120,139, -229,203,151,195,197,197, 5, 94, 94, 94,144,201,100, 32, 8, 2, 6,131,161,170,233,213,170,221,207,206,157, 65,103, 36,217,246, -181,182,177,253,152,231,121, 58, 55, 55,123,171, 30, 57, 71,158, 62,133,238, 47, 60,246,127, 51, 45, 0,220, 69,249, 57, 15,149, -165, 70, 43, 36, 36,132, 15, 10, 10, 34, 74,214,110,110,200,203,200,176,141,113,116,110,114,208,209,185,113,241,188, 95,100, 52, - 69,217,198, 56, 57,169,242, 0, 64,207,240,184, 22,157,131, 7, 79, 82, 16,254, 36, 5,230, 82,227,130, 47, 90, 61, 83,212, 99, -149,231,161, 41,248,227,166, 85,175,202,134, 86, 95,212,221, 67,167, 85, 33, 55, 61,146, 24,212,191,135,108,226,196, 9,112,113, -113, 83, 84,166,167,151,202,166, 78,158,246,158,141,157,141, 8, 33, 87,127, 69,187,134,253, 33,147,138,144,153,171, 1, 8,224, -241,211,115, 0,103,137,136,152,120,180,109, 44, 71,175,158,254,255,103,239,186,195,162,184,218,239,153,237,176,187,244, 94, 44, - 88, 0,123,239, 40, 98, 67, 99,239, 88, 98,239,216, 27,106,140, 37, 42, 26, 77,236,189,196, 96,239,137,216, 80, 84, 44, 88,233, -136, 88, 0, 41, 11, 82,150,165,108,223,157,157,249,253, 65, 9, 42,101, 65,243,253,190,228,219,243, 60,243,192,236,206,156,125, -231,222, 59,115,207,188,247,222,247, 21, 94,190, 16,191, 4,192,106,125,236, 37,211,158,131,227,218, 15,108,157, 22,218,156,120, - 80,121,201,128,192, 30, 10, 66, 8,113, 70, 50, 94, 63,188,168,215, 59, 35, 69, 81,115,172,173,173,243, 86,173, 90,213,189, 97, -195,134,154,217,179,103, 71, 38, 39, 39, 47,250,236,109,229,215,125,251,246,225,221,187,119,162,141, 27, 55,222,207,201,201,249, -161,154, 21,237, 71,211,216, 81, 60, 20,151,115,229,202,149, 54, 33, 33, 33, 11,118,236,216, 97, 55,119,238, 92,238,220,185,115, - 39, 3,248,169,178,225,194, 2, 30,175,215,198, 7, 15,104, 50, 45, 77,117, 98,247,110,238,222,208,208, 85, 26,138,114,180,182, -181, 37, 58,119,232, 32,227, 51, 24, 57,226,204, 76,210,166,126,125,102,210,237,219, 86,180,177,113,250,141, 27, 55, 10,164, 82, -105,133,169,115,152, 76,166,188,188,225,194,242,224,224,224,160, 46,111, 14, 87, 37, 29, 98, 1, 69,211, 26,243,122,245,232, 62, - 61, 59, 53,124, 23,159,144, 96,100,110,206,116,109,232,226, 30,251, 58,233, 57,173,211, 41, 9,130, 40,208,107,172,132,201, 28, -189, 99,199,142,230,166,166,166,160, 40, 10,102,102,102,200,206,206,134, 90,173, 70, 65, 65, 1,212,133,249, 80,231,231, 35, 58, - 57, 9, 93,186,119,199,200,190,125, 26, 7, 92,249,115,180, 78,167, 59, 83,233,120, 94,139,214,165,158,172,245,117,173,254, 26, - 11, 74,205, 43, 21, 93, 91, 90,187,130, 35, 20,162,247, 34,191,175,185,209,195,175, 93,187,118,125,216,176, 97,223, 45, 89,178, -132,145,145,145,113, 51, 41, 41,169, 11,128, 87,149,157, 36, 20, 10, 27,228,228,228, 64, 42,149,194,204,204, 12, 59,118,236,128, -157,157, 29,228,114, 57, 94,188,120, 65, 59, 59, 59, 19,247,239,223,135,179,179, 51,196, 98, 49, 52, 26, 13, 20, 10,197, 71,181, - 90, 93,225,112,121,241,240, 96,191,133,125,113, 35, 62,236,247,174, 78, 68,226,139, 81,139, 61,223,197, 71,191, 78, 9,186,253, -248, 39, 82,105,148,154,151,118,103,121,189,118,225,214,115,150,174,195,158,173,107, 16,255,236, 65,174, 93,237,130,189,198,132, -234,120,101,246,202,100, 50,229,235,215,175, 77, 34, 35, 35, 65, 16, 4,204,204,204,192,231,243,203, 21, 91, 53, 0,163,172, 7, - 74, 38,147,129,195,225,192,202,202, 10, 71,142, 28, 41,237,120, 93, 92, 92, 42,227, 56,216,187,119,239,209,181,107,215, 54, 41, -251, 97,187,118,237, 48, 99,198, 12,236,223,191, 31,161,161,161,159,228,211,252,248,241, 99,134, 86,171,173,236,186,243, 50, 51, - 51,251, 14, 29, 58, 52,236,225,195,135,166, 71,142, 28, 1, 73,146,229,110,135, 15, 31,198,211,167, 79, 87, 3,120, 93,195,118, -212,104,248,240,225, 15, 78,158, 60,105,158,157,157,141,146,182, 33,147,201,160,211,233,224,238,238, 78,144, 36, 89,213,188, 55, - 6,147,201,188,178,123,247,238,129,211,166, 77, 3,139,197,130, 90,173,198,238,221,187,177,124,249,242,204,226,151, 82, 13,128, - 85,199,143, 31,159, 48,104,208, 32,180,108,217,178,241,189,123, 21,207,236,144, 74,165,144, 74,165, 96,179,217,176,183,183,199, -134, 13, 27,160, 86, 23, 61, 86,220,220,220, 74,111, 99, 0, 7,221,220,220, 6,190,121,243,102, 27,138,230,174,125, 1,123,123, -251,161, 52, 77, 79,215,233,116,133, 93,187,118,181, 58,125,250,180,137, 72, 36, 66, 88, 88, 24, 86,175, 94, 45,161, 40, 74, 71, - 81, 20,161, 80, 40, 18,109,109,109,195,120, 60,158,177, 92, 46,207, 21,139,197,155, 0,220,252,255,234,201, 9,130, 32,216,108, - 54,166, 76,153, 2, 22,139, 5, 99, 99, 99, 40,149, 74,104,181,218, 82, 49,143,106, 14, 75, 55,108, 40,180, 98,129, 51,205,194, -164,201,130,145,243, 7,216, 56, 56, 58,193,220,148,135,184,184, 87, 93,238, 6,223,222,205,101,197, 31,160,212,218, 3,241, 31, -242,255,246,100,247,159,107,145,127,168,208,250, 34,231, 33,171,252,202, 28,169,163,233,243, 57, 34, 17, 87,195,229,242,223,148, -120,185,236,236,228, 5, 4, 49, 82,103,211,116, 48, 72,141,182,248, 65, 65, 23,111,122, 10, 45,173, 14,239,226, 99,240, 48,232, - 79, 88,203, 69,200, 73,108, 5,112,154, 67,173,200,135, 82,173, 41, 22, 37, 58, 68,134, 5,163, 32, 63, 23,205,218, 14, 0, 24, -140,167, 21,241,153, 89, 17, 3, 58,183,105,193,124,151, 18,131,118,110, 35, 80,223,185, 43,146, 51, 10,144, 39, 85, 65, 82,160, - 68,171,102,126,200,150, 40, 80, 32, 87,226,213,187, 0, 56, 57,214,103, 16,172,132,158,250, 10, 45,213,171, 75, 80,189,254, 3, -156, 58, 93,192,117, 31, 4,102, 29, 15,164, 68,221, 67,228,141,237, 72,139,125, 4,154,210,193,193,173,189,190, 55,201,238,155, - 55,111,182,239,210,165, 11,171, 87,175, 94, 45,175, 95,191,222, 50, 35, 35, 35,178, 88, 96,180,236,213,171, 87, 75, 27, 27, 27, -236,220,185, 83, 65, 16,196,238, 26, 86,118,169, 7, 44, 43, 43,235, 57,128,141,151, 46, 93,218, 61, 99,198, 12,216,218,218, 54, - 79, 79, 79,175,240,196,108, 54,187,229,196, 77,155,104, 54,147, 73,159,217,179,135,179,238,230,205, 95,126, 59,126,156,211,195, -203,139,160,105, 26, 17, 17, 17,252, 45,123,246,240,199, 14, 30,252, 33, 57, 43,139, 12, 9, 13,213,100,164,165, 21,102,201,100, -235, 50, 50, 50, 62,254,127,180,108,173, 86,251, 36, 49, 41,209,169,109,135, 86, 54,225,113,137,177,222, 61, 58,119,102, 48, 24, -140,248,132,228, 80, 27, 27, 83,254,237,160,219, 26,173, 86,251, 68, 31, 46, 30,143, 55,160, 71,143, 30, 44,137, 68, 2, 71, 71, - 71,100,103,103, 67, 36, 18, 21,121, 28,242, 37,208,228,231, 67, 91,144, 7,157, 76,138,196, 23,207,209,170,126, 61,222,121, 30, -111,128, 92, 46,175, 84,104,149,188,101,150,151,232,186,228, 51,174,137, 9,184, 66, 33,136,234, 15, 27, 14, 54, 55, 55, 95,158, -151,151,119, 29,192, 6,141, 70,227,187,124,249,242,118,187,118,237,178,222,184,113,163,233,244,233,211,207, 75,165,210, 86, 40, - 74,170, 90, 81, 7,246,158, 36, 73, 43, 0,118,193,193,193,176,181,181, 69,126,126,126,137,167, 69, 45,151,203,141,196, 98, 49, - 84, 42, 21,212,106, 53, 76, 77, 77,241,242,229,203, 92,146, 36,175, 86,101,156,105, 3, 98,131, 74, 19,247,131, 85, 99, 65,186, -134,180,240,204,202,165, 36,107,127,201, 88, 15,224,151,190,245,235, 31,214, 80, 15, 18,223,198, 92,181, 72,122,113, 63, 55,253, -173,172,254,145,235,137,149,205,209,162, 1, 80, 4, 65,208,110,110,110,200,206,206, 6,147,201, 4,159,207,135, 80, 40,196,138, - 21, 43,176,123,247,238,154, 8, 45, 35,129, 64,176,137,193, 96,140,102, 48, 24, 54, 58,157, 14,126,126,126, 24, 56,112, 32,184, - 92, 46, 52, 26, 77,169, 71,179,196, 75, 85,133,167, 35,226,233,211,167,166, 79,159,126,242,216,242,178,182,182,190,171, 82,169, -144,144,144,128, 43, 87,174,116, 7, 16, 82,205,186, 78,136,136,136,232,235,225,225,241,123,155, 54,109, 26,208, 52,141,230,205, -155,195,199,199, 7, 1, 1, 1,136,140,140, 68,126,126, 62,117,251,246,237,223, 0,108,171,110, 31, 94, 92,190,238,195,135, 15, -127,116,234,212, 41, 11,177, 88, 12,133, 66, 1,153, 76,134,243,231,207,163, 75,151, 46,176,182,182,198,201,147, 39, 73,154,166, - 43,171,123, 6,131,193, 56,114,224,192,129,129, 83,167, 78,197,222,189,123,113,230,204, 25, 12, 26, 52, 8,163, 71,143, 70,118, -118,182,221,214,173, 91, 39, 20, 15, 19,174,241,241,241,129, 84, 42,197,139, 23, 47,226,244,188,231,145,151,151,135,188,188, 60, - 24, 27, 27,151,189,199, 8, 0, 1,219,183,111, 31,179, 96,193, 2,212,175, 95,127, 77, 98, 98,226,118,148,179, 74,148,162,168, -153, 34,145,200,130,197, 98, 89,145, 36,137,212,212, 84,188,124,249, 18,115,230,204,201,205,205,205,157, 1, 32, 25,192,170, 41, - 83,166,108, 88,180,104, 81,105, 91, 90,180,104, 81,224,245,235,215,251,254,167,189, 57,110,110,230, 77,185, 76,222,124, 73, 33, -211, 74, 34,145,148, 62, 59,212,106, 53, 84, 42,213, 39,158, 44, 14,135,109,213,174, 85,237,107, 10,121,225,202, 87,111,243, 42, - 76,144,222,184,129, 89, 11,190,192,108, 65,151,174, 61,198,245,233, 59,132, 73,106,181,184,117,235, 42,142, 30,221, 7, 47, 15, - 55,212,111,216, 28,115,231,205, 55, 83,169, 73,191,219,183,111, 46, 55,127,250,240,102, 97, 65,222,138,202, 56,255,199,113,173, - 88, 92, 93, 43,119,232,176, 60, 5, 89, 28,194, 65, 82,188,107,109, 97, 97,177, 71,167,211,121,153,154,154,130,202,123,131, 87, - 47,159, 33, 87,194,134, 74,161, 3, 69, 23,137, 45,189,132,139, 74,141, 7,183,254,192,142,237,191, 64, 44, 22,195,163, 91,119, - 72, 89,181, 80,187, 86,109, 40, 21,242,226,155, 6,208,168,181,176,177,171,131,240,240, 72,109,129, 76, 86,225, 3,137, 99,164, -105, 92,219,206, 13, 42, 77, 39, 24,113,185,200, 47, 84, 67, 82, 44,178, 78, 94, 24, 5,149, 92, 1, 82,173, 1,169,214,194,166, -246,112, 52,178,235, 1, 74,119,181,105,181,138,143,210, 65,147,244, 0,154,164, 7, 48,238, 52, 15,127,250,143,249,172, 35,213, - 47,239,110,118,118,118, 86,108,108,236,213,136,136,136,161,163, 70,141,194,189,123,247,166, 3,152, 85, 60,124, 51,125,212,168, - 81,136,136,136, 64,108,108,236,213,236,236,236,172,111, 81,243, 92, 46, 87,161, 82, 21,245,177,124, 62,223,168,138, 99,157,218, - 13, 27,198,200, 15, 15, 47,216,254,248,241,154,195, 71,142,112,122,245,236, 73,104, 73, 18,148, 78,135,134,174,174, 68,159, 62, -125, 4, 1,231,206, 89, 49,181,218,167, 75,125,125,131,247,143, 31, 95,248, 92, 38,211,119,162,121,221,226, 33, 67, 0,168, 91, -201,103,122, 67,165, 82,237,154, 57,109, 82,175,144, 7,143,106,213,174,229,100,122,235,118, 72, 36,207,152,203,168,239,210,128, - 41,201,207,101,173, 95,179,210, 88,165, 82,233, 43, 90, 27, 91, 91, 91,227,227,199,143,120,247,238, 29, 84, 42, 21,180, 90, 45, - 40,185, 12,106, 73, 30,212,249,185, 32,148, 10,240,116, 58, 40,115, 50, 81,183,126, 61,224,175, 21,137, 85, 14, 69,149, 39,180, - 74,254, 26,153,154,130, 35, 16,130,193,102,235,157, 28, 29, 64,155,246,237,219,159,187,120,241, 34,103,242,228,201, 29,238,220, -185,179, 7, 64,178, 72, 36,234,185,122,245,234,231,123,246,236,225,205,152, 49,195,125,219,182,109, 19, 0, 28,172,136, 68,169, - 84,158,187,118,237,218,216, 58,117,234,216, 69, 71, 71, 67,169, 84,130,162, 40,244,235,215, 15, 40,154, 91, 3, 0,136,143,143, - 87, 40,149,202,172,152,152,152,130,228,228,100, 13,244, 88, 37,184,118, 87,198,147,130,143, 15,134,217,217, 59, 61, 53, 50,174, -235, 66, 75,195,135, 46, 28,225,180,117,251, 5,145,242,102, 66, 66,225, 15,189,235,109,150, 21, 70,205, 49,119,150,238,189, 25, -152,168,207, 68,248,210,213,133, 86, 86, 86, 96,177, 88, 96,179,217,224,112, 56, 32, 8, 2,243,230,205,195,161, 67,135,170, 26, - 58,252, 68,100,153,152,152,196,174, 91,183,206,121,198,140, 25, 28, 35, 35, 35, 72, 36, 18,156, 60,121, 18, 83,166, 76,193,209, -163, 71,203,157,255,162,199,144,210,231,222,210, 5,227,199,143,135, 90,173,134,143,143, 15, 14, 31, 62,188, 64,167,211,133,212, -224,150,126, 26, 25, 25,233, 26, 25, 25,105, 10, 96,208,232,209,163,143, 15, 31, 62, 28, 33, 33, 33,184,122,245,106,119, 20, 45, -250, 80, 0,240, 7, 96, 91,252,183,178,251, 83, 96,103,103,183,143,162,168, 65, 54, 54, 54,145,110,110,110,205, 78,157, 58,101, -158,149,149, 85,178,248, 1, 73, 73, 73, 56,118,236, 88,198,145, 35, 71, 10,116, 58,157, 21,131,193,184,150,151,151,183,162, 18, -193,118,100,251,246,237,147,138,135, 3,113,241,226, 69,250,151, 95,126, 33, 86,175, 94, 13,137, 68, 2, 47, 47, 47, 28, 56,112, - 96,190, 84, 42,109,249,203, 47,191, 76, 27, 57,114, 36,214,175, 95, 15,153, 76,182,189,170,151,149, 74,196, 23, 1,160,243,246, -237,219,235, 44, 88,176, 0, 23, 47, 94, 68,155, 54,109,140, 19, 19, 19,247, 3,152, 90, 94,253,209, 52,141,196,196, 68,200,229, -114, 60,122,244, 8,107,214,172,145,148, 17, 89,243,103,205,154,181, 97,254,252,249,216,180,105, 19, 29, 29, 29,157, 53,124,248, -112,187, 67,135, 14, 49, 27, 54,108, 56, 95, 46,151,255,199,132,150,123, 67,203,205,237,218,116, 93,238,224,212, 16, 39, 79,157, - 70,110,110,110,105,153,148,148, 11, 77,211, 40, 44, 44,196,199,143, 31, 97,102,106,130,173,219, 54,124, 55,123,250,164, 90, 40, - 10,131,241,165,203,178,190,197,182,225,163, 39, 47,246, 25, 59, 9,209,145, 97, 8, 56,126, 16, 49,209, 17,165,124,164, 86,131, - 55,113, 47,241, 38,238, 37,236,236,235,160, 79,175,238,196,152, 49, 99,250,141, 31, 59,218, 6,192,223, 22, 58,226, 31,236,205, - 2,190,140,163,117,232, 19,161, 85,133,187,206,218,194,194, 34,246,236,217,179, 86, 30, 30, 30, 76,146, 36,113,243,214, 45,204, -153,245, 61, 38,140,247,131, 6, 22, 32,213, 28, 80, 28, 35,189, 44, 81, 40,228,160, 65, 67, 38,147, 33, 52, 52, 20, 52, 69, 34, -224,208, 47,160,105,170, 84,104, 1, 52,212, 26, 13,156,106,187, 99,223,225,141, 36,216,236,231,208,150, 31,186,166, 64,204,212, -105, 73, 26,162,172, 20,164,100,196,192,204,164, 54, 88,236,218, 16,231,201,193, 98,216, 67,171,140,135,174,248, 92,185, 44, 13, - 10,205,215,213,159,174, 28,239, 41, 93,141,135,174, 66,161, 56,113,226,196,137,239,126,253,245, 87,110,255,254,253,221, 46, 92, -184,208, 25, 0,250,247,239,239,102,106,106,138, 19, 39, 78,168, 21, 10,197,137,111,232,241,233,209,190,125,123, 72, 36, 18, 36, - 37, 37, 69, 86,122,109,106,181,149,208,214,150,153,117,239,158, 54, 91, 34,169,213,163, 71, 15, 66, 75,146, 96, 16, 4,114,243, -243,145,252,225, 3,204,205,205,137,216,248,120,225,238,185,115, 47,187, 53,107,198, 42, 89,145,168, 15,174, 94,189,202, 71,209, -188,172, 74, 63,171, 38,100, 89,153, 31, 39,249,250,250, 94, 62,113,226,164, 89,102, 86,230, 27, 30,151, 75, 10,133, 70,142,227, -199,205,102,229,229,229,141, 5, 32,213,151, 76, 34,145, 32, 49, 49, 17,198,198,198,224,176,217,160, 20,114,232,100, 82, 40,115, -179,193,212,168,193,213,233, 96,201,231,161,150,157, 29,106,219, 88,235,197,249,238,110, 80,233,196,247,178,195,133, 91,219, 55, - 6, 87, 32, 4,215, 68,136,217,129,247,139,223, 70, 57,192,234,159,244,161,181,118,114,114,250,243,212,169, 83,156,236,236,108, - 68, 68, 68, 68, 2,200, 7, 96, 2,128,138,139,139,187, 19, 19, 19, 51,160,120,213, 93, 85,171,197,126,185,116,233, 82,111, 15, - 15, 15,210,197,197, 69,144,149,149, 85, 75, 34,145, 80, 25, 25, 25,159,184,132,130,130,130,120,133,133,133, 50,138,162, 46, 23, -139,172, 42,227, 23, 45, 28,225,100, 20, 26,142,121,158,222,117,155,155, 90,183, 64, 46, 25,222,252,105,100,198,188,133, 35,156, -118,109,191, 32, 82, 26, 19,170,227,132, 46,181, 22,203, 72,169,239, 36,102, 26, 40,154, 43, 21, 26, 26,138,228,228,100, 36, 38, - 38,126, 34,168,166, 79,159,142,128,128, 0,189, 60, 90, 2,129, 96,211,218,181,107,157, 23, 44, 88,192, 41, 35,138,224,235,235, -139,252,252,124, 28, 62,124, 24,190,190,190,213,238,248, 63, 67,189, 30, 61,122,244,119,112,112,128, 88, 44,134,189,189, 61, 60, - 60, 60, 6,134,132,132,184, 0, 72,170, 97,187,159,237,237,237,189, 97,221,186,117,208,106,181,152, 50,101, 10,222,190,125,123, -238,237,219,183, 59,106,215,174, 61,111,217,178,101,118,118,118,118, 24, 53,106,148,128, 36,201, 97, 21,145, 88, 90, 90,250, 31, - 60,120,112,108,255,254,253, 25, 26,141,166,219,221,187,119,241,225,195, 7,168,213,106,144, 36,137,247,239,223,195,215,215, 55, -163,120,117,227,123, 61,236,154,188,106,213,170, 73,243,230,205,195,150, 45, 91,176,118,237,218,223,204,204,204,154,181,106,213, -170,245,218,181,107,177,116,233, 82,212,169, 83, 7, 86, 86, 86,141, 86,175, 94,221,120,209,162, 69,216,181,107, 23,214,172, 89, -243, 27,128, 99, 53, 41, 8,138,162,136,205,155, 55,183,220,190,125,187, 67,137,200, 98, 48, 24, 56,123,246, 44,194,195,195, 7, - 38, 36, 36,148,119,206, 1,123,123,251,233, 14, 14, 14,220,219,183,111, 11,235,212,169, 3,146, 36,181,197, 34,107,119,237,218, -181,231,188,127,255, 30,253,251,247, 71, 66, 66,194, 9, 0, 19,204,204,204,100,139, 22, 45,226, 27, 27, 27,155,201,229,242,255, - 84,231, 13, 38,131,152,184,105,253, 82,188, 8,143,199,165, 75, 28,188,120,241, 2,118,118,118,224,241,120,160,105, 26, 42,149, - 10,217,217,217,208,106, 84,104,222,180, 30,126, 63,178, 25, 89, 89,217, 0,131,168,112,202, 13,193, 32,198, 77,250,126, 40, 30, - 62,186,133,253,251, 15, 66, 42,149, 85,240,242,109,132,134,110,141,225,228,104,139,212,180, 84, 16, 12, 88,255,157,215,250, 15, - 31, 58, 44,125, 4, 65,159,240, 14,101, 97,110,110,190,227,204,153, 51, 86, 94, 94, 94, 76,153, 76, 6,138,162,208,213,195, 3, -243, 22, 44,192,213, 83,167,224,218,193, 7,132, 90, 8,146,175,223,170, 7,165, 66,142, 38,173, 59, 99,228,168,209, 72, 73, 78, -134,247,128,225, 80, 42,229,165,111, 24, 37, 30, 45,181, 90, 3,107,219, 90, 8, 10, 10, 98, 98,202,148, 87,216, 93,190, 83, 66, -167,225, 70,189,121,175,236,146,167, 8, 71,232,139, 0,104, 84, 26, 52,111,190, 26, 26,202, 10,182,206,211,161,213, 94, 65, 65, -246,221,162, 97, 12, 43, 47,164,165,164,128,193,228,196,214,180, 4, 41, 89,246, 87, 61,116,243,243,243,243, 19, 19, 19, 47,132, -134,134,142, 27, 54,108, 24,130,130,130,166, 1,192,176, 97,195, 16, 26, 26,138,196,196,196, 11,249,249,249,249,223,162,182, 29, - 28, 28, 6,117,239,222,221,167, 93,187,118, 8, 12, 12, 4, 77,211, 15,245,186,177,217,108,154,193, 96,128,162, 40, 16, 0,196, -121,121,120,251,246, 45,196, 57, 57,208,106,181,144, 73,165, 84, 99, 55, 55, 41, 77, 81, 38,213,177,167,236, 10, 67,148,179,234, -176,228,179, 26, 92,106,242,243,167,143, 83, 10,165, 82, 27, 11,115,139, 66, 46,151,171,147,228,229,229,191,138,141, 86,235,217, - 57,148, 32, 46, 38, 38,166, 89,122,122, 58, 82, 82, 82, 64,202, 10,193, 84,169,193, 80,201,209,179,115, 39, 24,131,134, 17, 40, -176, 41, 45,216, 76, 54, 10,139, 86,231, 85, 57,220,161, 43,243,146, 80, 34,178, 8,130, 40, 26, 46, 20, 8,192, 21,154,124,226, -225,210,167, 61,241,120,188, 83,231,207,159,119,112,114,114,194,250,245,235,225,236,236,220,200,209,209, 81,110,102,102,102,108, -103,103,135, 38, 77,154,160,115,231,206,184,113,227, 6,244, 40, 3,146,166,233, 62, 15, 31, 62, 92,252,248,241,227,145, 2,129, -128,152, 59,119, 46,171, 95,191,126,224,241,120,144,203,229,144, 72, 36, 56,125,250,116, 14, 69, 81, 37,139, 82,172,248,124,254, - 49,130, 32,146,100, 50,217,130,207, 9,127,255,181,185, 99, 86, 46, 53,133,150,242,135,122,122,215,109,222,195,187, 23,234,185, -246, 64, 15,239, 20, 0,216,108,201,250,224,243,243, 42,243,203,230, 38,196,177,160,155,183,215,120,120,246, 88,181, 92,122,111, -195,150, 67,121, 85,206,167, 35, 8, 2, 20, 69,125, 18, 59,232,243,239, 39, 76,152,128,179,103,207, 86, 89,142, 12, 6, 99,244, -140, 25, 51, 56,159,121,158, 33, 18,137, 48, 96,192, 0, 12, 27, 54,236, 19,161,101,109,109, 13,123,123,123,124,248,240, 1, 0, -196,122,182,171,121,147, 39, 79, 38, 20, 10, 5,166, 78,157,138,195,135, 15,195,199,199,135, 8, 9, 9,153, 7, 96, 65,117, 27, - 59,131,193,216,186,108,217,178,197,190,190,190,200,205,205,197,245,235,215,209,175, 95, 63,156, 61,123,214,230,250,245,235,155, -188,188,188,192,100, 50, 17, 24, 24, 8,146, 36, 43,141,245,197,225,112, 6,245,239,223,159,145,154,154, 10, 14,135,131,182,109, -219, 34, 45, 45, 13,114,185, 28, 34,145, 8,243,231,207,255, 40, 22,139,187,235,123, 31,113, 56,156, 5,243,230,205,195,153, 51, -103,224,231,231,119, 28,192,212,252,252,252,145,143, 31, 63, 62, 51,120,240, 96,136, 68, 34, 92,190,124, 25,107,214,172, 33, 38, - 76,152,128,189,123,247, 98,254,252,249,191, 21,123,157, 42,106,248,133, 89, 89, 89,102, 13, 26, 52, 64,102,102, 38,164, 82, 41, - 46, 95,190,108,123,227,198, 13, 23, 39, 39, 39,211,196,196, 68,221, 79, 63,253,196, 93,176, 96, 1,118,236,216,129,136,136, 8, - 4, 4, 4,160, 71,143, 30,100, 66, 66, 66,185, 94,178,226,144, 13,151,105,154,190, 45, 16, 8, 80, 88, 88, 88,114,223, 45,241, -243,243,243,245,247, 47,114,178,167,167,167, 99,226,196,137,227,131,131,131, 41, 47, 47, 47, 62,135,195,129, 82,169,148,253, 39, -123,109, 74, 71, 1,160,224, 82, 75,136, 91, 87,143, 32, 44, 50, 1, 97,145, 49,224,242,138, 38,193, 43, 20,114,180,110,222, 16, - 29,218,182, 71,122,134, 8, 39, 2,142,192,210,218,169,210,231, 8, 77,211,224,176,116,104,236,102,143, 83, 1, 7, 17,120, 61, - 24, 1, 39, 78,151,206,121, 99,177,216,104,213,186, 3,218,182,245, 64, 66,226,123, 28, 57,178, 31, 54,182,181, 12,131,131, 53, - 68,233,208, 97,217,191,159, 41,255, 30, 30, 30, 30, 76,169, 84, 10,165, 82,137,143, 31, 63,226,195,135, 15, 48,183, 48, 71, 66, -122, 18,186,243, 53,248, 72, 21, 32, 46, 50, 86, 71, 48,217, 17, 85,253, 96,127,207, 86,128,103, 43,204,153,236, 83,201, 43, 43, - 13,129,169,117,209,208, 13, 73,190,195,174, 93,100, 69, 66,139,212,105,239,220,186,125,183,253,228, 9,131,216, 65,119, 15, 67, -171,166,160,208,154, 65,166, 84, 67,166, 97,131, 97,214, 15,200, 9, 1,147,197, 67,199,150, 13,113,249,210, 13, 13, 77,106,131, -245, 46, 32,187,102, 32, 51, 99,202, 8,173,172,207,198, 29, 44,245, 30, 58, 44,237,120,117,186,179, 39, 79,158, 28,210,169, 83, - 39,190,151,151, 87,131,226,142, 83,115,242,228, 73,121,113, 48,204,234,226,147,104,240,246,246,246,173, 57, 28,142, 79,191,126, -253, 90, 79,154, 52, 9,175, 94,189,194,137, 19, 39,222, 52,108,216,240, 94, 70, 70,197, 43,178,153, 92,174, 88,154,149,101, 46, -116,113, 97, 89,152,152,164,223,184,126,189, 78,175,222,189,137,148,148, 20,136,197, 98, 40,149, 74, 68, 68, 70,210,108, 38, 51, -141, 48, 53,101,196,135,135, 51,152, 92,174,184, 34,111, 99, 57,248, 80,197,170, 67,255,154,122,183,106, 57, 88, 52, 88,227, 55, -179,158, 82,165,108, 86, 80, 80, 64,178,216,108,182,179,189,121,114,252,123,253,159,137, 42,149, 42,240,206,157, 59, 67,122,245, -234,197,123, 19, 21, 1, 50, 63, 31,234,124, 9, 56,148, 14,150,173, 91,130,169, 81, 1,106, 45,156, 26,211, 80,230,241, 17,242, - 44, 94,171, 82,169,170, 12,106, 88, 34,180, 24,159, 9, 3,174, 80, 8,158,137, 41,120, 66,225,231,130,161,170, 55, 57,126,159, - 62,125,122,118,236,216, 17, 52, 77,227,208,161, 67,208,104, 52, 92,141, 70, 3,181, 90, 13,141, 70,131,130,130, 2, 4, 4, 4, - 96,223,190,125,143, 1,252,166,199,229,147,198,198,198,131, 9,130,176,101,177, 88,114, 27, 27, 27,193,217,179,103, 75,195, 77, -180,106,213, 10, 38, 38, 38, 28, 20, 7,133,180,181,181,101, 31, 61,122,212,124,224,192,129, 15,202, 29,238,104,222,104,105, 61, -210,194,211,200,184,174,139,169,117, 11,212,115,237, 1, 0,232, 61, 96, 50,234, 53,172,141,130,156, 40, 23,165,226,195, 80, 14, - 75, 98, 17,187, 75,244,202,184,127,179, 73,178,172,251,111, 81,254,242,254,114, 59, 10, 6,131, 81,225,112,172, 62, 34,171, 72, -179, 48,108, 74,230,249, 0,128, 88, 44, 70, 70, 70, 6,226,226,226,224,238,238,142,220,220, 92, 56, 57, 57, 65,173, 86,163, 93, -187,118, 80, 40, 20,216,190,125, 59, 30, 61,122,244, 24,192,124, 61,126,195,216,213,213,117, 98,235,214,173,113,253,250,117,188, -120,241, 66,116,235,214, 45, 39, 15, 15, 15,184,184,184, 76, 74, 74, 74, 90, 89, 60,212,167, 47, 4, 30, 30, 30,115,125,125,125, - 17, 19, 19,131,153, 51,103,138, 83, 83, 83, 47,159, 59,119,110,234,154, 53,107, 24,222,222,222,200,200,200,192,214,173, 91,117, -143, 30, 61,218, 6, 96,125, 21,229,248, 58, 53, 53,213, 89,169, 84, 34, 55, 55, 23, 36, 73, 66, 46,151,227,198,141, 27, 8, 8, - 8,200, 44, 22, 89,239,244, 53,174,101,203,150, 77, 24, 12, 6,206,156, 57, 3, 0, 63,160, 40, 98,255,229,161, 67,135,138,126, -250,233, 39,167, 21, 43, 86, 96,218,180,105,208,104, 52,216,178,101, 11, 86,172, 88,113,173, 88,100, 85,246, 16,253,213,222,222, -126,250,204,153, 51, 27, 45, 90,180, 8,161,161,161,182, 47, 95,190,108, 27, 17, 17,129, 90,181,106, 65, 44, 22,179,172,172,172, -176, 99,199, 14, 44, 92,184,240, 34,128,156, 39, 79,158,140, 78, 76, 76,244, 7,176,181, 10,209,126,192,201,201,105, 58, 77,211, -180, 92, 46,255,224,231,231,183,117,227,198,141, 88,184,112, 33, 98, 99, 99,145,159,159, 15, 19, 19, 19, 98,217,178,101, 19,127, -248,225, 7, 76,153, 50,133,150,201,100,251,254,211, 29, 53, 77,235, 32,151,196, 64,167,178, 64,171,230,238,104,213,172, 46,110, -221, 13, 3, 0,244, 28,238, 1,185,172, 16,199,143, 31,194,187,119,111,193, 98,179, 97,110,105,175,143, 39, 16,234,130,215,200, -211,100,160,151, 87, 91,244,243,238,142,223,126, 63, 11, 82,171,193,212,201, 99, 33,201,203,195,239,191, 31, 65, 66,226,123,176, -216,108, 88, 89,255,253,129, 80, 43,211, 34,255,120,161,165,199,240, 19, 40,138,130, 72, 36,194,203,151, 47,145,148,148, 4, 62, -159, 15, 5,169,163,246,223,121, 68, 17, 4, 39,141,162,233,199, 52, 89, 26,165,248, 75, 14,157, 78, 84, 38, 98,173,153,133,133, - 5, 87,165, 82,128, 36,181,101,122, 21, 2, 32, 0, 14, 11,112,112,172,135,212,148, 84, 90,169, 84,222,175,244, 13, 74,165,220, -241,199,229,243,190,157,187,120, 88,247,235,185, 14,151,175,172,134,164,160, 0, 74, 13, 27, 50,165, 6,114, 37, 96,110,233,134, -118,205, 91, 32, 61, 93,140,168, 23, 33, 82,150, 74,174,207, 68,209,183,187, 87, 77,118,157, 60,103, 41,140,235,116,129, 42,238, - 50, 40,105,102,169, 71,203, 72,104, 1,203,218,141,145, 39, 83,225,124,112, 24, 80,141, 84, 47, 89, 89, 89,114, 38,147,121,210, -215,215,119, 75, 88,216, 75,103, 0, 8, 11, 11, 75,203,200,200, 88,158,149,149, 85, 93,159,116, 73, 52,120,194,200,200, 56,172, - 97,195,134,233,109,219,182, 53, 27, 58,116, 40,172,173,173, 17, 17, 17, 1,127,127,255,215, 26,141,102,105, 72, 72, 72,165, 67, - 61,106,181, 90, 20,118,229,138,105,247,239,191, 55, 95, 58,112,224, 86, 95, 95,223, 29,235,215,175,103,187,186,186, 18, 90,141, - 6,209,209,209,244,169,147, 39,181,251, 86,172,216,206, 21, 8, 88,207,255,248,131, 77,170, 84,162,255,239, 70,236,228,228,228, -233,209,173,107,227,109,191,238,130, 82, 33,197,179,208,107,144, 72,178,113,240,208,165,198, 78, 78,180,167, 72, 36, 10,209, 87, - 0, 31, 59,118,108,113,135,214,173, 91,215,175, 85, 11,209,201, 73,224, 82, 58,112, 72, 18, 76,141, 10, 12, 82,137, 90,205,104, - 16, 12, 19,100,124, 44,192,198, 51, 23, 98,244, 17,198,141,190, 27,132,245,105,249, 32, 8, 2,191,116,106, 6,174,137, 16, 28, -129, 16,179,255,188, 91, 42, 12, 2,215,175, 0, 87, 40, 68,131, 14,122, 5,132,151,223,187,119,239,101,116,116,116,187,102,205, -154, 97,241,226,197,248,240,225, 3, 40,138, 66,102,102,166, 50, 35, 35, 67,148,157,157,253, 1, 69,241,127, 14, 87,209,137,149, - 85, 29, 78, 33, 33, 33,165,195, 13,193,193,193,112,116,116,132,153,153, 25, 10, 10, 10, 48, 99,198, 12,243, 31,127,252, 17, 0, -240,242,229, 75,148, 21, 40,159, 35, 58, 44,110, 91, 94, 33, 45,161,165,225, 67,115,201,240,230, 61,188, 83,209,123,192, 36,220, - 14,252, 13,119,111,221,129, 37,235, 67, 18, 4,133, 55,114,146,114, 10,210,100,174, 7, 26,183,153,202,204,144,221, 58, 48,119, -208, 27,166,131, 3,117,126,197,254,130,188,202,108,117,117,117,133,157,157, 93,233, 28, 45, 22,139,133, 41, 83,166,128,166,105, -125, 69, 86,113, 95, 67,101, 43,149, 74, 59,196,253, 47,128, 0, 0, 32, 0, 73, 68, 65, 84, 35, 35, 35,124,252,248, 17,239,223, -191, 71, 66, 66, 66,105,232, 0,138,162,180, 75,150, 44, 97,207,157, 59, 23,251,247,239,199,253,251,247, 31, 3, 88, 7, 64,223, -151,181,177,163, 70,141, 50, 81,171,213, 56,125,250, 52, 9, 96,192,249,243,231, 95,182,107,215,142,213,183,111, 95,147,189,123, -247,142, 45,174, 35,189,133,150,169,169, 41, 71,163,209, 96,239,222,189, 72, 77, 77,245, 4, 16,247,252,249,243, 3,163, 70,141, -218,215,172, 89,179,134, 49, 49, 49,111,165, 82,233,108, 0, 81, 85,145,101,102,102, 78,110,219,182,237,121,138,162,234,244,234, -213, 75,240,235,175,191,154,198,199,199,195,217,217, 25, 20, 69, 69,163,154, 41,172,222,190,125, 27,151,145,145,209,184,123,247, -238,184,113,227,198,102,157, 78,183, 9,192,150, 89,179,102, 57, 37, 39, 39,163,117,235,214,176,180,180, 68,124,124,124, 97, 70, - 70,198, 62, 20,165, 36,170,202,133,155, 8, 96,249,129, 3, 7, 90, 28, 56,112,192,199,210,210,178, 99, 68, 68, 4, 30, 62,124, -136,109,219,182,225,199, 31,127, 68,215,174, 93,177,120,241,226, 28, 0, 62, 0,200,196,196, 68,189,226,230,149,120,182, 0,160, - 77,155, 54,233,254,254,254,152, 58,117, 42,125,244,232,209,157, 39, 79,158, 92, 48,118,236,216,210, 62,112,226,196,137,244,137, - 19, 39, 38,162, 40, 13,211,127, 18, 90,141, 70, 13, 83,203,122,144,230,165, 32, 59, 53, 20,124, 19,123,120,247,104, 9,185, 66, -141,171,127, 92, 68, 84,116, 36, 24, 12, 6,236,236,107,193,220,194, 26,111,222,188, 5, 42, 95,109,172,213,104, 52, 48,177,168, - 11,105,126, 42,212, 89, 97, 48, 22,218, 98,210,247, 67, 33, 87,104,112,233,242, 69,196,196, 68,129,201,100,194,222,161, 22,204, -204,139, 56, 9,186,242, 21,204, 6, 0, 40, 39,158, 86,149, 66,139,201,100,222,187,121,243,230,136, 14, 29, 58,176,222,189,123, -135,119,239,138, 94,110, 36, 18, 9, 73, 64,119, 33, 43,250,143, 49,149,156,222, 11,197,171, 51,202,230, 46, 20,154,152,136,226, - 95,199,217, 73,114, 51, 17, 25,254, 8,239,222, 68, 35, 41, 33, 14, 26,141, 18, 76, 6, 3, 12, 38, 3,117,235, 53,197,163,199, -161,106, 37, 73,134, 86,196, 89,100, 71, 66,161,192,214,117,244,134,245, 43, 3, 23, 46, 93,107, 60,114,196,126, 68,197,191,130, -148,180, 7, 77, 3,246, 86, 2,180,170,191, 12,162,244,108,156,249,109,175,156,210,104,198,125, 22, 67,235, 11, 78, 0,176,203, - 65,147,125,135,126,155,114, 56,224,212,218,165,115,103,216, 13, 30, 54, 14,220,220, 87,208,166,135,161, 94,187,126, 32,120,230, -184, 30,116, 23, 33, 47, 95,101, 82, 58,122,173,157, 24, 71,223, 84,193, 89, 22,121,121,121, 79, 62,126,204,112, 46, 19, 5,222, -153,199, 51,170,106,117,220,231,156,159, 68,156,103, 50, 25,109, 54,108,216,160,181,179,179,211,196,196,196, 96,255,254,253, 84, - 88, 88, 88, 16,131,193,216,157,145,145,161,172,138,211, 70,171,141, 60,229,231,215,164,253,176, 97,244,152,185,115,229,224,241, -230,109,253,229, 23,191,108,137,196,145,166, 40,216, 88, 90,166,109, 93,177,194,127,196,168, 81,146,216, 71,143,140, 67,175, 92, - 49,230,146,100,152, 30,118,126, 11, 84,200, 41, 18,137, 66,238,223,127,136,227,135,127,133, 70,163, 66,134, 40, 25, 0,144, 35, -206, 71, 21, 34,235,115, 78, 90, 46,151, 15,251,225,199, 31,159,254,176,112,129,125,183,158,189,144, 18, 25, 1, 77,110, 54, 8, - 45, 9, 54,193,130, 44,139,143,172, 76, 41,150,159, 56,151, 37,149,203,135,149,211, 73,148,107,103,137,199,138,103,106, 2,142, - 64, 8,174,208,228, 19, 47,150,145,169, 41,184, 2, 33, 88, 92,110,121, 19,184,191,224,148, 74,165,195, 71,140, 24, 17,245,252, -249,115,139,169, 83,167,162,115,231,206,225, 10,133,194, 11, 64, 97, 77,203,147,162, 40, 81,183,110,221, 24, 4, 65, 8,199,141, - 27,199,203,206,206, 46,141,172, 46,149, 74,113,227,198, 13,184,187, 23,173,234,143,141,141, 69,211,166, 77, 43,228,156,182, 60, - 70, 4, 96,253,194, 17, 78, 91,159, 70,102,204, 3,176,185, 94,195, 90,184,123,235, 14, 30,222, 13,245,235,216,140,218,245,221, -184,118, 63,241,189, 70, 45,109,220,102, 42, 83,104,234,128,223, 47, 93,100,198,133, 29,217, 40,151, 71, 55,192,254,203, 75, 42, -178,147, 32, 8,208, 52,253, 69, 40, 7, 38,147,137,147, 39, 79, 86,247,218,207, 29, 62,124,120,214,204,153, 51, 57, 25, 25, 25, -120,253,250, 53,100, 50, 25,140,140,140,112,235,214, 45, 18,192,222,147, 39, 79,222, 58,121,242,100, 95, 20,173, 38, 10,174, 78, -251, 20, 8, 4,190,222,222,222,120,253,250, 53, 94,188,120,113, 17, 64, 84,120,120,248,197,119,239,222,141,238,218,181, 43,126, -251,237, 55, 95,133, 66,113,184, 58,156, 20, 69,149,141,153, 84,146,241, 33, 82, 42,149,118, 12, 13, 13,173,110,189,103,136,197, -226, 46,197,194, 58,213,206,206,206, 52, 50, 50, 18,181,107,215,134, 70,163,233, 80,221,182,148,159,159,255,235,238,221,187,143, - 78,158, 60, 25, 63,253,244,211,184,115,231,206,141,251,238,187,239,208,191,127,127, 28, 59,118, 12, 81, 81, 81,155,161, 95, 90, -177,242,174, 61, 10, 64,148,157,157,221,156, 90,181,106, 97,219,182,109,136,142,142,246, 95,191,126,253,138,168,168, 40,184,187, -187,243,226,226,226,200,154, 60, 67, 0,192,212,212,212, 84,171,213,226,202,149, 43,207, 0, 44, 28, 55,110,156,237,142, 29, 59, -124,132, 66, 33,114,115,115, 21, 49, 49, 49, 99, 1,252,241,159,126,214,209, 4,177,106,234,180,121, 7,166, 77, 29,107,212,182, - 77, 43,200, 11,210,160,144,102, 66, 94,248, 17,187, 15, 7,129, 32, 24,176,177,113,128,173,189, 51,146,147, 83,240,248,218,117, -181, 76,174,216,193,213, 82,155, 43,231,156, 91,196,217,186,136, 83, 46,203,130, 66,154, 85,202,105,107,235, 88,204,153,140, 71, -161,215,149, 10,153,236, 87, 53, 77,252,252, 55, 95,251, 63, 25,213,203,117, 88, 22, 18,137,100,254,140, 25, 51,188,150, 47, 95, -110, 69,146, 36,211,210,210, 18,201,201,201,228,133, 11, 23,114,165, 82,233,252,154, 88,195, 98,179,163, 92,221,220,189, 6, 15, - 30, 76, 14, 26, 52,144, 51,126,114, 95,150,141,173, 45,242,243,196,120,243, 58, 2,241,175,194,224,234,222, 18,107,214,111, 7, -204,205,171, 76, 36, 89,156, 86,103,192,186, 31,150,156,237,226,217,199,212,189,105, 75, 78,171, 6,102,208,104, 73,164,165,165, -225,143, 43,145,154,152,151, 15, 11, 40, 82, 61, 90,158,163, 95, 10,158, 16,128,132, 24, 7,155,217,106, 78,110,218,186,123,241, -222,131,199,151, 46,159, 55, 85,208,213,163, 55,162,239,252,134,139,129,103,101, 74,149,122, 43,135,137, 95, 98,196,144,191,169, -102, 25, 40,149, 74,205,231,253,169, 82,169,212,124,109, 77, 31, 59,118, 12,153,153,153,234, 15, 31, 62,220, 36, 73,242, 92, 37, -201,158,191,192,110, 64, 61, 84,165,186,243,131,135, 71,223, 31,110,221, 50,154,184,108,153,122,220,248,241, 75,160, 82,105,192, -229,210, 44,129,128, 1, 30,143, 29,251,232,145,241,206, 89,179, 44, 9,181,250,246,241, 74,194, 6,148,131,111,190,234,176,196, -163,213,189,123, 87, 76,156,186, 16,138, 50, 30,173, 39, 47,222, 64,165,129,222, 30,173, 98,164,124, 72, 77,237, 56,111,213, 15, -151, 70,123,247,108,220,172, 78, 93,158,141, 75, 93, 8,237,237, 33,206,206,198,163, 23,241,218,245,103, 47,197, 20,139, 44,189, -226,202, 80, 20, 85, 52,201, 29, 64,207,249,203, 65, 48,153, 64,113, 24,135,146,149, 67, 46,237, 58,131, 96,177,160,163, 41,168, - 84, 42,125, 38,253,165,189,127,255,126,248,184,113,227,130, 3, 3, 3, 25,222,222,222,173, 46, 95,190, 76,125, 77,219, 81, 40, - 20, 29, 1,192,200,200, 40,201,220,220,220,105,242,228,201,208,106,181,144,203,229,200,207,207, 71, 90, 90, 90,222,228,201,147, - 53, 0, 96,108,108,204, 29, 49, 98,132,105, 85,156,219, 47,136,148, 11, 71, 56,237,178,100,125,240, 41,200,137,114,177,100,125, - 72,234,216,140,218,181,253,130, 72,105,234, 40,219,144,243, 33,228, 77,134,236,214,129,223, 47, 93,100, 78, 24, 58, 92,231, 44, -124,235,103,100, 75, 95,168,138,151, 32,136, 47,130,147,234, 41,178, 62, 65, 97, 97,225,138,213,171, 87,247,151, 72, 36,206,125, -251,246,229, 52,110,220, 24, 79,159, 62, 69, 96, 96, 32,249,228,201,147, 84,153, 76,182, 18,128, 18, 64, 80, 77,202,212,205,205, -205,133,197, 98,149, 12,165,237, 41,254,120,207,229,203,151, 71, 79,157, 58, 21,117,235,214,109, 18, 23, 23,199, 67, 53,238, 35, -154,166, 75, 71, 25,190, 37, 8,130, 72,216,185,115,167,147,189,189, 61,113,227,198, 13,146,201,100,214,196,115,115,236,200,145, - 35, 29,180, 90,237,180,233,211,167,195,211,211, 19, 36, 73,226,196,137, 19, 56,114,228,136,190, 34,171, 82,188,121,243, 38, 44, - 53, 53,181,219,146, 37, 75,176,109,219,182, 21, 75,150, 44, 65,106,106, 42,222,188,121, 19,241, 53,188, 5, 5, 5,138,148,148, - 20,126,167, 78,157,218,198,196,196,196,120,121,121, 53,157, 58,117, 42, 54,111,222, 76,223,191,127,127, 4,128, 27,255, 31,189, -119,252,187,220, 0,182,142,117,107,253,134, 95,127,108, 80,223,101,230,148, 73,163,152,110,174, 77, 33,203, 79,131,149,181, 29, -156,107,213, 67,118, 86, 14,110,222,188,161,203,201,201, 59,166, 99, 16,235,222,189,203, 77,255, 26, 78, 39,231,122,200,202,202, -194,245,235,215,117,121,146,130, 67,208, 50,214,199, 37,231,101,194, 0,125, 60, 89,211, 81, 73,148,248,202, 96,109, 97, 97,113, -218,212,212, 52,211,212,212, 52,211,194,194,226, 52,160,215,234,131, 94,101,158, 14,204, 79,182, 17, 35,140, 96,100,212, 17, 44, -214, 34,115, 11,139, 27,102,102,102,226,238,221,187,171, 15, 28, 56,160,140,139,139,165, 68,162, 84,218,204,204, 44,191,244,248, -242, 56, 63,131,133, 69,125, 19,129, 67,211, 31,205,156, 91, 61, 18, 58, 52, 41, 20, 58, 52, 41, 52,115,110,249, 88,224,208,100, -173,133, 69,125, 19,189,236,172, 0,245,108, 97,227,106,141,189,238, 54,132,194,213, 26,123,235,217,194, 70,239,107,175,124,216, - 79, 71, 16,208,161,104, 25, 54,106,192, 89,194, 65, 49,153,204,227,206,206,206, 14,168, 94,192,186, 47, 56,199, 3,117,199,243, -120,211,206,251,249, 77, 76,186,127,127, 92, 65, 98,226,152,252,132,132, 81, 17,103,207,142,222, 51,122,244,248, 49, 60,222,244, - 17, 64,125,125, 57, 29, 28, 28,252,195,194,194, 2,245,221,202, 8, 47,189,203,179,126, 61,167, 91,222,189, 58,208,190, 51,134, -209,190, 51,134,209,222,189, 58,208,245,235, 57,221,250,138, 58, 34,152, 76,166, 15,159,207, 63, 45,224,243,163, 5,124,126, 52, -159,207, 63,205,100, 50,125, 80,249, 28,170, 79, 56,173,172,172, 94,218,217,217,101, 86,103,179,182,182, 14,175,134,157, 99, 92, - 92, 92, 82, 25, 12,198,246,106,222,211,149,113,186, 26, 27, 27, 39, 8, 4,130,180,178,155,177,177,113,217,192, 80, 86,124, 62, -255,170, 64, 32,216,161, 15,231,207,171,154,254,248, 56,104, 78,212,207,171,154,254,248,249,119,115,135, 88, 76,126, 26,188, 78, - 60,119,136,197,100,125,236,180,181,181,189,111,107,107,155, 97,107,107,155, 97,103,103, 87,233,102,109,109,253, 82, 15, 78, 35, - 19, 19,147, 29, 38, 38, 38,153, 2,129, 64, 39, 20, 10, 51, 5, 2,193,118,148, 9,109, 81,211,242,100, 48, 24,155,155, 52,105, -162,100, 50,153, 71, 63,251,106, 91,131, 6, 13,148, 44, 22,107,107, 53, 57, 77,187,118,237,170,139,140,140,164, 61, 61, 61,105, - 0, 22,223,176,222,237, 45, 44, 44,110,152,154,154,166,152,152,152,236, 6, 32,168, 33, 39, 1,192,199,201,201, 41,162, 71,143, - 30,114, 39, 39,167, 80, 0,131,191,161,157,253,135, 12, 25, 66,165,164,164,208, 52, 77,211, 41, 41, 41,244,144, 33, 67, 40, 20, - 5,138,252,154,103,242,170, 89,179,102,209, 79,158, 60,161,159, 60,121, 66,135,134,134,210,253,251,247,167, 0,124,255,149,207, -121,124,171,107,111, 92,207,186,126,163,134, 22,231,198, 14,247,160,130,254,216, 78,175, 89, 57,147,238,237,217,148,118,111, 96, -113,201,213,213,202,245, 91,112,254,184,114, 6,221,171, 91, 19,170,113,125,139,179,141,235, 89,215,255, 15, 95,251,191,209,171, -133,191,123,194,217, 95,174,197, 79,197, 82,249,112,116,116,132, 88,220,193,136,197,242,224,241,120, 94, 12, 38,243, 94,110,118, -246,130,226,215, 45,221,127,202, 85, 91,105,135, 94, 31,220, 74, 82, 18,212,132,243,147,137,236, 53,228,172, 14,135, 94,156, 21, - 37,149,166, 84,170,116, 43,146,124,185, 27,149,150,193, 39,156, 78, 78, 78,211, 40,138,114,209,215, 32, 6,131,145, 36, 18,137, - 14,215,164, 60, 27, 54,108, 72, 23, 15,111, 19,223,178,222,255,142,182,244,191,196,249,251,175,205, 29,221,155, 55, 90, 26, 29, - 22,183,173,120, 88,177, 20,107,231, 90,152,120,244,232,190,250,209,221,251, 63,173,221, 45, 41,252,127,190,118, 6,244,156,211, -246, 13, 56, 75,130,132, 86,139,147,205,102, 31,104,223,190,253,180,167, 79,159, 30,213,233,116,211,255, 71,219,103,127, 38,147, -185,196,205,205,173,213,155, 55,111, 34,116, 58,221, 54,148, 19, 40,178, 6,118,174,116,113,113,153,205,225,112,120, 82,169, 84, -146,158,158,190, 26,192,185,255,182,242,108,220,208,178, 45, 77,151, 6,221,222,248,250,125,238,243,111,198, 73, 83, 58,138,102, -110,120,147, 40, 14,255,127,168,247,127,155,200, 58,244,159,248,225, 94, 6, 78, 3,167,129,211,192,105,224,252,230,156,198,134, -242, 52,112,254, 11, 57,255,149, 96, 25,138,192, 0, 3, 12, 48,224, 31, 7,133,161, 8, 12, 48,224,191, 14,101,189, 90,165,222, - 44,162, 18, 85, 90, 29,151, 96, 77,148,237, 29, 3,167,129,211,192,105,224, 52,112, 26, 56, 13,156,255,115,156,255, 86,145,117, -168,146,253,191, 13, 6,183,170,129,211,192,105,224, 52,112, 26, 56, 13,156, 6,206,255, 5,161, 85,238,190, 97,232,208,128,191, - 29,187,134,194, 9, 0,230, 93,134,232,239, 56,222, 0, 3, 12, 48,192, 0, 3,254,159,113, 8, 21, 12, 29,254, 55, 8, 45, 71, - 0, 29, 81,148,248, 54, 30,192, 67, 0,146,175,224,179, 6, 48,138, 32,136,145, 0, 64,211,244,121, 20,173, 26,201,209,231,100, - 35, 35,163, 76,165, 82,105, 91,252,127,150, 82,169, 44,155,203,128,192,151,171,217,232, 50, 91,185,112,113,113,201, 84,169, 84, -182,122,252,124, 62, 77,211, 81, 12, 6, 35, 90, 40, 20,222,125,243,230, 77, 96,117, 46,220,203,203,107, 34,147,201,220, 8, 0, - 58,157,110,213,189,123,247,142,255,141,245,214,161,150,163,253,111, 26,173,134,204,204,206, 93,141, 47, 3,249, 1, 0,246, 14, -128, 63, 65, 98,105,241,255, 91,231, 4, 86, 30, 71,167,186,199, 87,130,182,108, 54,219,215,206,206,174, 95, 90, 90,218, 75, 0, -203,128,170,163, 26,215,170, 85,235,123, 22,139, 53, 78,167,211,213,103, 50,153, 9, 36, 73,158, 76, 77, 77, 13, 48, 60, 67, 12, - 48,192, 0, 3, 12,208, 67,108,125,129,106, 9, 45,119, 43,216,211,128, 15, 8,244, 6,141,219, 4,112, 38, 94,140,143,250,158, -255,157, 59,180, 90,178,232, 55, 57, 12,232,110,188,103, 28,234,215,175,159,243,220,185,115,209,185,115,103, 60,125,250,180,211, -177, 99,199, 38,159, 59,119, 46,138,162,168,123, 0,158, 2,122,133, 82, 16,160, 40, 78,203,216,126,253,250,245,218,184,113, 35, -179,105,211,166, 80, 40, 20,184,127,255,190,199,214,173, 91,119, 60,126,252,248, 14,128, 83,197,130,160,194, 4,120, 74,165,210, -182, 36, 25, 39, 65, 16,182, 35, 70,140,120, 94, 86, 92, 21,231, 87, 35,104,154,126, 66, 16, 68,168, 78,167,123,122,225,194,133, - 84,119,160,195, 12, 23,206,133, 5, 73, 26,231,207, 57, 85, 42,149,237,149,159, 55,129,197,227, 65, 85, 88,128, 78,147,254, 18, -189,183,127, 92, 10,130, 34,193, 4, 45,241,218,176, 35, 10, 64,116,122,122,122,148,167,167,103, 82,117,107,152,201,100,110,188, -121,243,166, 3, 77,211,240,246,246,222, 8,224,239, 18, 90,188,142,109, 91,222,187,122,241,180,145, 52, 55, 19,125, 7,143, 62, -249, 54, 53,107, 34,128,139,159,136,166,126,176, 35, 8, 44,157,181,233, 20, 19, 0,246,173, 28,187,108,123, 31,236, 90, 24,132, -143, 0,188,138,197, 15, 0,252, 12,224,222,222,126,176, 3,176,124,214,166, 83, 4, 0,236, 95, 57,118,233,222,126,216, 57,231, - 70,181,195, 86,204,158, 56,113,226,174,141, 27, 55, 50, 29, 28, 28, 32, 18,137,250, 54,105,210,196,173,160,160,160, 9, 42,153, - 68, 92,183,110,221,179, 93,123, 12,172, 55,108,164, 15,223,198,218, 2,233, 25, 57,166,103, 79, 31,157,193,124,114,191,223,135, - 15, 31, 70, 27,158, 33, 6, 24, 96,128, 1, 6, 84,128,154, 71,134,111,237, 0, 99,153, 6, 67, 88, 76,226,251, 46,109,155,244, - 28,243, 93, 87, 70,147,198, 13,241, 42, 54,174,207, 31,119,159,109,101,132,198, 6,147, 58, 58, 64,192,193,149,240,140,202, 87, -194,104, 73,176,130,174,156, 42,234, 9, 39,143,101, 62,127,254,188, 97,155, 54,109, 74, 83,195,244,236,217, 19, 61,123,246, 36, -246,237,219,215, 50, 40, 40,168,229,145, 35, 71, 52,193,193,193,191,161,242,248, 40,190, 13, 26, 52,216,186,107,215, 46,158,167, -167, 39,120, 60, 94,233, 23, 66,161, 16, 3, 7, 14,196,192,129, 3,153,233,233,233,222, 87,175, 94,245,254,249,231,159,213,201, -201,201, 75,240, 87,148,230, 74,177,122,245,234,182,229,124,124,147, 32,136,247, 36, 73, 70,180,108,217, 50,213, 13,104, 56,227, -187,206,183,103,119,113, 21, 44, 88,113,172, 92, 30, 22,151,139,223, 39, 22,245,213,101,133, 86,210,221, 27, 16,154,154,136,249, - 38, 38, 81, 0,162, 1, 68,209, 52, 29,157,144,144, 16,215, 8,104,217,209,130,241,219, 81, 9,213,162, 26, 98, 11,169,169,169, - 48, 51, 51, 51,246,244,244,204, 32, 8, 98,237,253,251,247,191,245,132,188, 14,107,151,206,230, 72, 62, 68,225,227,235, 39, 88, - 52,210,131,191, 96,247,159, 63, 41,213,218,139,149,157, 68, 16, 12,198,207,161,148, 31,138,146,241,174, 22,139,197,158, 0, 96, -101,101,197, 5,112,111,251, 51,124,183,176, 11,241, 53,177,221, 56, 76, 38,115,239,177, 99,199,166,126,255,253,247, 69,169, 35, - 30, 61,130, 80, 40,196,250,245,235,235, 46, 94,188,216,159, 36,201,249, 21,121,178,186,246, 24, 88,111,231,182,159,154, 20,230, -230,171, 14,238, 61,247,194,177,153, 59, 99,150,239, 98,147,157, 26,149,189, 78,167,251,222,224,217, 50,192, 0, 3, 12, 48,160, - 58,222,172, 42,133,150,155, 53,142,183,110,230, 58,106, 76,127, 15, 94,243,102, 77,193,225,253, 21,186,165, 77,219,182,104,211, -182, 45,195, 79, 90,216,251,249,139,176,222, 23,130,158,170,228,218,228,115,111,114, 48, 81, 95,171, 74,146,210,110, 28,108,215, - 67,150,151,101, 4, 0, 2,115, 91,229,202, 43, 31,239,118,233,210, 5,206,206,206,156,224,224,224, 41, 85, 8,173,149,241,241, -241, 60, 38,179,242,120,168,142,142,142, 24, 49, 98, 4,220,221,221,185,221,187,119, 95, 89,145,208, 50, 50, 50,202, 34, 8,194, - 22, 0, 44, 45, 45,117,107,215,174,141,160,139, 0, 0, 52, 77,211, 79, 24, 12,198, 83,138,162,158,253,249,231,159,105, 77, 0, -219,190,109,220, 31,206, 30, 63,130, 79, 95,216, 81,161, 72, 80, 22, 20,148,251, 57, 95, 40,200, 54, 22, 8,162,120,124,163,104, - 20,229,242,138,118,118,118,142,107, 2, 56,183,119,119, 9,218,183,112,172,201,209,233, 63, 85, 89,150,173, 91,183,118,107,209, -162,133,145, 78,167,131, 76, 38,195,254,253,251,205,140,141,141,205,250,245,235,183,166,108, 3,104, 12, 52, 31,238,200,156,190, - 46, 93, 55,167, 6, 13,201,188,107,167,182, 31, 70, 12,236,103,218,182, 99, 87,188,189,119, 2,185,185,133,200,207,147,130,162, -168, 47,226,250,204,185,129,204,189, 3,176,117,223,138,177,203, 9, 6,131,104, 57,116, 25, 6,217,231,207, 59,112,224, 64, 44, - 0, 54,151,203, 45,219, 14, 29,141,157,154,109,109,216,167, 43,246,175, 26, 15,154,162,104, 0, 91,171,225,205,178, 53, 49, 49, -249, 35, 40, 40,168, 67,187,118,237,240,244,233, 83, 36, 38, 38, 98,246,236,217,234, 57,115,230,112, 38, 76,152, 64, 44, 90,180, -104,238,207, 63,255,124, 1,192,227, 47,110, 4, 22,107,220,224, 97,163,185,210,188, 2,165, 90,165, 81, 91, 90,155, 83, 42,153, - 82,158, 35, 41, 80,142, 30, 59, 77, 29, 27,254,108, 28,128, 47,132,214, 87,150,167, 1, 6, 24, 96,128, 1,122,128,166,233,118, - 0,108, 0,100, 19, 4,241,162,236,126,241, 33, 37,217, 90, 62,223,207, 65,209,168,148, 85, 25,186, 28, 20, 77,247,177, 1,160, - 3,240,156, 32, 8,201, 87,154, 88,249, 42,195,192,192, 64,186,236,223, 50, 66,139,166,105,154,214,138,223,211,170, 55, 55,104, -249,139,195, 95,108,138,216,139,116,198,243,115,244,179, 83, 63,210,110,214,149,103, 97,255,206, 29,218,177, 45, 64,207,106, 7, -122,126,119,115,229,243,231,207,131, 41,138, 10,244,235, 10,154,126,117,138,166, 95,157,162, 23,118, 2,125,225,194,133,155,254, -254,254,129, 1, 1, 1,129, 0,170,154,167,148, 89,248, 34,148,126,102, 11,186, 34,196,199,199,211, 7, 14, 28,160, 87,172, 88, - 65, 31, 61,122,148, 70, 21, 17,212,189,189,189,239,199,196,196,208, 19, 38, 76,136, 64, 37,129, 1, 27, 3,130,113,117,237, 95, -171,206,238,208,168,191,111, 78, 75,186, 25,149,123,253, 14, 14, 14,159,216,179,217,213,158,222,211,222,149, 62,222,187,205, 71, -154,166,111,210, 52,189,153,166,233,209, 52, 77,187, 3, 64,107,192,116,176,131,213, 59,229,185,157, 10,245,244,142, 85,230,189, -107,221,186,181,219,146, 37, 75,114,213,106, 53,157,148,148, 68, 31, 60,120,144,190,125,251, 54,125,229,202, 21,218,195,195, 35, -189,140,189,118,147,221,235,100,170,143,172, 83,213,164, 21,177,153,204, 61, 47,110, 95,160,223, 61, 60, 79, 63, 63,227, 79,159, -252, 97, 12, 61,119,112, 7,141,169, 49, 79, 9,160, 71, 69,231,205,233,130,134,238,117,109,222, 36, 39, 39,211, 26,141,134,158, - 52,105, 18,237,237,237, 77,247,233,211,135,238,213,171, 23,221,179,103, 79,186, 71,143, 30,244,221,187,119,233,244,244,116,186, - 87,215, 54,178, 1,141,209,182, 26,166, 53,171, 83,167,206,199,164,164, 36, 90,163,209,208,193,193,193,244,137, 19, 39,232,224, -224, 96,218,207,207,143, 6,112,124,214,172, 89, 10,137, 68, 66,123,123,123,167,161,156,168,241,117,234,212,137,139,121,147,154, -186,125,211,225,187,191,239, 57,125,247,210,133,219,119,255,184,245,252,218,149, 91, 47,206, 61,139, 76,184, 82,167, 78,157,184, -114,234,255,171,202,211, 0, 3, 12, 48,192,128,170,181, 72,177,208,234, 95,236,236,232, 79,211,116,175,207,246,251, 23, 11,167, - 47,246,253,252,252, 86,148,221, 47, 57,198,207,207,111, 5, 0,186, 83,167, 78,167,105,154,110,248, 13,204,159, 94,206, 86,181, - 71,171, 4,100,218,115,112, 92,251,129,173,211, 66,155, 19, 15, 42, 47, 25, 16,216, 67, 65, 8, 33,206, 72,198,235,135, 23, 43, - 79, 36, 81,140,235,241, 96, 3, 8,142,139,139,195,235,215,175,145,154,154, 10, 62,159,255,197,113,143, 30, 61,130,177,177, 49, - 28, 28, 28,244, 83,186,234, 79,251,185,168, 54,117, 32,236,228,137,156, 49, 51, 17, 28, 28,140,172,172, 44,112, 56, 28,112,185, - 92,144, 36, 89, 37, 31,131, 81,148,241,183,196,139, 85,222, 49,158, 0,139,103, 41,188,186,111,205,124, 23,198,147, 64,182, 34, -229, 29,210,149, 58,253, 60,121, 66, 1,248, 2,126,134,177, 49,191,116,184, 16, 64, 52, 65, 16,111, 91, 3,108,129,208,232,234, -111, 27, 22,217, 51,195,131,141, 20,239,162,202,229,232,213,171,215, 12, 0,107,104,154,206,107,209,162,133,221,198,141, 27, 45, - 68, 34, 17, 94,189,122,133,115,231,206,101,147, 69, 23, 74,208, 52,189, 14, 0, 58, 2, 70,230, 54,230,183,246,252, 56,223, 4, -247,206,114,107,210,138,204, 26, 15,188, 54,124,194,172, 57,187,230, 15,132,172, 80,129, 83,183,195,113, 51,236,253, 32, 0,143, - 80,201,188,183,189,143,241, 14,200,238, 57,108,216,176,136, 7, 15, 30, 88, 31, 57,114, 4, 36, 73,150,187, 29, 57,114, 4,119, - 30,134,205, 3,240, 82, 79,179, 28, 93, 92, 92,238, 60,123,246,204,134,207,231,227,246,237,219,200,203,203, 43,245,100, 77,156, - 56,145,200,203,203,243,217,191,127,255,240, 15, 31, 62,108,123,248,240,161, 24, 69,185, 32, 63,105, 8, 76, 38,243, 61, 73,106, - 26, 57, 52,110,200, 26, 57,176,107, 87,169, 56, 10, 66,171, 22,120, 18,249,254,106,158, 68,172, 96, 50,153,239,203, 30,255, 45, -202,211, 0, 3, 12, 48,192,128,234,129, 32,136, 64,154,166, 7, 16, 4, 17,248,249,103,159,255, 95,114,156,191,191,127,233,126, -201, 57,155, 55,111,222, 84,102, 95,254,141,204,171,116, 50,124,247, 98, 5,217,189,188,131, 84,175, 46, 65,245,250, 15,112,234, -116, 1,215,125, 16,152,117, 60,144, 18,117, 15,145, 55,182, 35, 45,246, 17,104, 74, 7, 7,183,246,250, 26,162,108,212,168, 17, -148,202,162,169, 89, 42,149, 10, 28,129,133,114,209,244,177, 70, 0, 64,177,140, 84,101, 20,172, 94,132, 38, 93,188,208, 62,147, -198,115,187, 34, 71, 69,251,204,162,243, 54, 76,154, 4, 14,135, 3, 14,135, 3,162,120,234,143, 62, 66,139, 40, 62,152, 42, 26, -190, 42,207, 8, 66,206, 99,159, 58,179,198,183, 61,239, 67, 52, 87, 21,243, 4,233, 42,138,190,154,169,187,166,143,189,124, 1, - 95,100,204,231, 71, 27, 11, 5,165, 66,139, 32,136,247, 0, 64,179,217, 1, 39,214,249,182, 16,100, 38, 8,148, 47,130,145,161, -164, 52, 21,208,172,187,113,227,134, 45,139,197,178,215,233,116, 72, 73, 73, 65,108,108, 44,118,238,220,153, 89, 88, 88,216, 61, - 60, 60,252, 77, 89,237,168, 51,230,158, 11, 88, 63,191, 30, 43, 42,196, 72,245, 62,166,218,173,199,186,217, 16,239, 65,221, 91, - 94,155, 49,126, 21,134,124,215, 7, 19,186, 55,161,147,210,115,149, 0,110, 23,187, 94,171,130, 40, 60, 60,188,119,183,110,221, - 78,182,106,213,170, 49, 77,211,104,222,188, 57,124,124,124, 16, 16, 16,128,200,200, 72, 20, 20, 20,104,130,130,130,118, 0, 56, -166,167, 89,124, 11, 11,139,155,119,239,222,181,225,243,249, 8, 10, 10,130, 66,161,128,131,131, 3,230,204,153,195,221,188,121, -243,239, 5, 5, 5, 35,253,253,253,141,146,146,146,246,220,186,117,171, 46,138,242,206,125,209, 8,212,106,245,161, 83, 1,199, -119,205,241,157,235,116,247,233,171, 96,149,180,208,172, 78,157,212, 2, 27, 11,161,201,142, 45,235,106,171,213,234, 25,229,151, -231,253, 26,149,167, 1, 6, 24, 96,128, 1, 95,160, 82, 45, 82, 86, 60,125, 46,182,170, 35,210, 0, 40,252,252,252, 86, 18, 4, - 17,232,231,231,183,210,223,223, 95, 1, 32,253,239, 16, 89,165, 66,107,192,128, 1, 33,129,129,129, 24, 48, 96, 64, 72,133, 20, -148, 14,154,164, 7,208, 36, 61,128,113,167,121,248,211,127,204,103, 23, 79,213,216,186,129,235,111,223, 85,169, 84,172,227,199, -143,151,206,219, 2, 0,157, 78,247,205,107,177, 58, 66,171, 88,232,125, 97,132, 11, 79, 24,114,104,225,200,142, 86, 58, 57, 91, -253,232, 42, 68, 42,138,220,246, 78, 35,127,145, 71,255, 92, 17,231,149, 5, 51,144,250,240, 14,248, 66, 97,234,212, 7,209,165, - 94,172, 98,145,149, 8, 0,117,121, 38,193, 7,230, 15,241,176,231,128,163,190,118, 30,233, 42, 74,117,224,131,246, 88, 5,141, - 13, 52, 77, 35, 49, 49, 17,114,185, 28,161,161,161,184,120,241, 98,118, 57, 34, 11, 46, 60,225,253,163,203,198,117, 48, 45,252, -200, 81,191,184,131,116, 21,165,215, 80,151,117,243, 33, 93, 56, 12, 34,136, 96, 48,141,123,118,116,195,130,105, 67,177,253,232, -159,164,218,182,235,128, 93,127, 92, 31, 37, 85,105, 86,234, 41,178, 74,157,141,225,225,225, 77,194,195,195,121, 0,188,124,124, -124,174, 15, 31, 62, 28, 33, 33, 33,184,122,245,170, 43,128,140,226,227,214,163, 40, 81,246,207, 0, 18, 42,114, 60,114, 56,156, - 51,119,238,220,105,234,232,232,136, 59,119,238, 64,161, 80, 96,214,172, 89,106, 95, 95, 95,206,196,137, 19,137,252,252,252, 82, - 79, 86,104,104,168,184, 34,145, 5, 0, 34,145,232,198,197,115, 39, 58,119,235,214,109,104, 61, 87,119,211,132,194,130, 44, 62, -223,200,248, 97,200, 61,206,139,103,143,247,136, 68,162,231,229,151,103,176,222,229,105,128, 1, 6, 24, 96, 64,197,208, 75,139, -124,230,153,170, 14,202,156,199,246,247,247,143,245,247,247,255,196,227,245,149,248,124,213,225,181,146, 62,173, 70,113,180,116, -249, 41, 95, 94, 0, 69, 85,231, 98,191,248,204,194,194,130, 52, 54, 54,254, 68,104, 81,122,114,230, 94, 62,141,132,217, 99, 75, - 61, 89, 37,158, 45,244,157,248, 85, 66,139,162,168, 80, 0,159, 24,193,183,117, 27,179, 99, 96,227, 46, 77,234, 57, 49,180,231, -118, 34, 77, 78, 42,215,196,107,148,175, 11,233, 65,113,229, 76,178, 46,229, 36,181, 48, 18, 24, 39, 27, 11, 5,159,139,172, 15, - 0, 32,176,115, 29,190,173,159,123,247,150,238, 13, 24,228,217, 95, 33,146,107,165,126,113, 26, 77,130,140,190, 84, 65, 25,174, -233,211,167,207, 26, 43, 43, 43,163, 93,187,118,153,213,169, 83, 7, 36, 73,170, 63, 23, 89,124, 91,183, 49, 59,135, 52,235,226, -102,111,193,208, 94,216,141, 84,133, 78,190, 51, 65,251,187, 62, 34,203,218, 76,120,235,192,166,217,198,124, 30, 27, 74,165, 18, -155,247, 93, 64,208,227,152, 1, 57, 49, 87,110, 1,184,245, 21, 13,114,234,128, 1, 3,182,175, 95,191, 30, 90,173, 22, 83,166, - 76,193,251,247,239,131,226,227,227,119,214,174, 93,123,201,178,101,203, 28,237,237,237, 49,106,212, 40,142, 86,171,157, 88, 1, -199,150, 83,167, 78, 13,104,217,178, 37, 66, 66, 66,144,151,151, 7, 7, 7, 7,248,250,250,114,253,253,253,127, 47, 40, 40, 24, -185,105,211, 38,163,196,196,196, 74, 61, 89,159,180,107,157,110,195,193,237,179,151,180,235,232,193,120,247,238, 13,153,210,222, -147,113,239,206,213, 7, 86, 86, 86,191,167,164,164,252, 85,158, 67,155, 87,187, 60, 13, 48,192, 0, 3, 12,248, 54, 32, 8,226, - 90,241,188,171, 79,188, 92,159,139,176, 18,143, 85,217,253,207,143, 47,254,254, 91,188, 44, 31, 42, 71,120,125, 26,222, 97,192, -128, 1,122, 47,171,167,100,217,122,137,167,207,241,157, 59,180, 78, 66,176, 86,122, 50,192, 17, 88, 40, 7,174,191,125,183,162, - 99, 5, 2,129,222, 30, 45, 74,165,172,170, 82,170, 37,180,138,231,104,221,164,105,250, 19,161,101,102,231,230,185,124,217,252, - 29, 30,195,251, 50, 50,167,117, 66,158, 84,165, 90,246,138,164,210,228,149,139,172,162, 94, 92,155,196, 23, 8,163,141, 4,252, -178, 34, 43, 5, 0,140,108, 27,180, 95,186, 96,206,190, 30, 99, 6, 18,217,179, 60, 32,201, 83,168,150,196,146,132, 72, 65,143, -140, 3,238,149, 71,119,247,238,221,131, 0, 14,122,122,122,102, 10, 4, 2, 72,165,210, 47,234,160,196,222, 46,195,251, 50, 50, -167,118, 64,174, 76,163, 90, 22, 75, 34, 93, 65,157,169, 74,100,217,152,155,220, 58,176,113, 54, 63, 61,237, 3, 56, 28, 14,132, - 66, 33,110, 63,138, 70, 78,236, 31, 95, 35,176,192, 96, 48,214,250,249,249,173,153, 51,103, 14,196, 98, 49,174, 94,189,138,239, -190,251, 14,167, 79,159,174,115,253,250,245,237, 94, 94, 94, 96, 50,153, 8, 12, 12,132, 86,171,125, 91, 1,205,208,233,211,167, - 47, 25, 62,124, 56,158, 63,127,142,140,140,140, 79, 60, 89,121,121,121, 62,251,246,237, 27,158,148,148, 84,165, 39,235, 51,180, -119,105,208,154,179, 98,245, 47, 80,201,179, 88,217,162,167, 33,193,183, 25, 79,114,115,115,249, 0,242,107, 90,158, 6, 24, 96, -128, 1, 6,232,237,213,170, 72,139,100, 23,139,168,236,242,246,203, 8,172,242,246,137,207,188, 96,234,207,190,143,252, 59,175, - 73, 47,143, 22,203,174, 25,200,204,152, 50, 66, 43,235,147,239,141, 76, 44,245, 26, 58,212,146, 96, 29, 56, 86, 26, 71,203, 72, - 44, 22, 27, 89, 91, 91, 43,203, 10, 4, 62,159, 15, 71, 71, 71, 72, 36, 18, 28, 58,116, 8,168,122, 82, 52,105, 58,124, 60,218, -143,153,130, 23,206, 92,208, 90, 77,169,103,235,192,164, 73,159,136, 45, 14,135, 83, 50, 55,172,170, 78,247, 89,177,167,233, 9, - 0,186,181,107,189,159,140, 4,130, 73, 70,214,181,172, 23,204,158,202, 78,202, 82,225,174,199,138,188, 11, 91,150, 11, 83,105, -225,156, 20,228, 63,174,130, 47, 97,240,254, 19,159,123,178,210, 90,185,214, 91,101,196, 55,154,198,181,172,107,239,183,104, 54, - 59, 41, 83, 69,220,109,191,172,224,226,207,203,248,137, 48, 89,146,134,188,123,122, 84,207,154,239,190,251,110, 13, 77,211, 52, - 69, 81,171, 1,160,172,189,139,124,167,177, 19, 62, 42, 17,236,177, 74,114,113,203,114,147, 84, 84,110,175,117,243, 33, 93,236, - 44, 76,111, 29,216, 52,135,159, 33, 74, 6,143,199,131,137,137, 9, 82, 51,243,193,102, 49, 21, 95,217,222,120, 93,187,118, 93, - 62,123,246,108, 68, 71, 71, 99,214,172, 89, 25, 41, 41, 41,151,206,158, 61, 59,235,199, 31,127,100,121,123,123, 35, 35, 35, 3, - 91,183,110,213, 62,122,244,104, 19,128,173,229,182, 71, 22,107,234, 79, 63,253, 68,167,167,167, 19,137,137,137,112,112,112,192, -220,185,115,185,155, 54,109, 42,157,147, 85, 29, 79, 86, 9, 68, 34, 81, 72,208,157, 39, 24,116, 99, 7, 72,173, 42, 36, 79,156, -242,224,117,130, 36,196,146,203, 93,236,212,186,121,141,202,211, 0, 3, 12, 48,192,128,111,226,197,122, 81,217,254,127, 1,202, - 27, 58,212, 75,104,189,221,189,106,178,235,228, 57, 75, 97, 92,167, 11, 84,113,151, 65, 73, 51, 75, 61, 90, 70, 66, 11, 88,214, -110,140, 60,153, 10,231,131,195, 0,224,109,117,172, 42, 44, 44, 68,155, 54,109,176,119,162, 91, 15,101,161,216,200, 24,128,138, -103,170,188,194,237,122,247,250,245,235,114,138,162,206, 0,184, 94, 5,205,218,166, 77,155,238,249,229,151, 95,184,141,199, 76, -134,244,233,195,207, 61, 40, 48, 54, 54, 6,143,199, 67, 84, 84, 20,238,222,189,171, 6,176,182,138, 10,125, 70,146,100,228,217, -179,103,211, 26,214,115,234,219,166, 85,139,121, 43, 87,248,153,188,122, 24,132,213,155,246, 80, 13,219,122,231,111, 62,125,165, - 48, 95, 88,187,167, 34, 35, 62, 66,143, 75,141,252, 76,100,165, 55,114,169,213,163, 85,179,166, 75, 87,175, 94,101, 26,251,240, - 54,126,252,249, 0,237,218,178, 87,254,207, 23,255, 40,200,225,215,237,163,204,122,253, 92,159, 50, 12, 9, 9, 57, 8,224, 96, -201,254,231,246,250,173,223, 73,185,181,235, 43,217,124,250,162,172,192,164,118,175,202,236,181,105, 60,180,179,179,141,197,173, -221, 27,102,242, 63,138, 82,192,227,241, 32, 20, 10,145,146,145,135, 53, 59,206,201, 52, 20,213,247,107,133,150,137,137, 9, 79, -163,209, 96,239,222,189, 72, 73, 73,233, 4, 32,229,229,203,151, 7, 70,143, 30,189,171,121,243,230,141, 98, 99, 99,223, 74,165, -210, 57, 0, 94, 87, 68, 98,110,110,222,201,198,198,134,120,242,228, 9,102,206,156,169,158, 59,119, 46,103,194,132, 9,132, 68, - 34,169,169, 39, 11, 0,224,228,228,228,217,187,103, 71,116,233, 61, 43, 68,173,204,123,144,244,250,247, 16, 6,253,216,168,166, -229,105,128, 1, 6, 24, 96,192,255, 12,106, 22, 24,220, 19, 96,185, 89, 97, 70, 83, 39,206,199,128, 45,115,233,194,132, 80, 90, -241,252, 32, 93,112,121, 26,125,109,235, 4,250,250,238, 5,244,172,254, 77,233, 70,182,196, 71, 55, 43,204,240,252, 82,184,125, -146,221,251, 59,119,104,123, 55, 0,221,187, 1,232,254,110,208, 2, 88,217,186,117,235, 43,190,237,255,138,163,229,219, 30, 52, -128,153, 0,132, 21,152, 85, 94,198,112, 7, 0,135,218,180,105, 67,222,187,119,143,142, 31,217,139, 14,111,100, 77,207,153, 51, -135,254,241,199, 31,233,177, 99,199,210, 54, 54, 54,100,113, 65, 56, 84,197, 57,104,208, 32,103, 0,168, 85,171,150,121,219,198, - 13, 63, 70, 5, 95,165, 31, 4,236,162,143,250, 14,163, 59, 52,111,156, 99,223,168, 91,164,177,131,123,171, 42,138,175,148,211, -222,222,126, 5, 77,211,125,105,154,118, 0, 0, 87, 87, 43, 97,235, 70, 13,211, 35,239, 92,165, 31,158,216, 67, 31,245, 29, 70, -119,108,209, 68,236,220,216,235,181,145,109,163,246,250,112,150,135,114,237,109,214, 40,199,104,243, 99,239, 0, 0, 32, 0, 73, - 68, 65, 84,174, 97,231,136, 74,236, 45,229,172,215,126,212, 31,105,233,153,244,179,103,207,232,235,215,175,211, 15, 31, 62,164, - 3,206,254, 65,215,110, 55, 82,106,221,124, 72,151,106, 52,157,138,236, 52,235,223,191, 63,253,246,237, 91,186, 95,191,126, 52, - 0,179, 26,114, 94, 73, 74, 74,162, 99, 98, 98,232,149, 43, 87,210, 0,142,207,158, 61, 91,145,159,159, 79,247,234,213, 43,165, - 88, 96,177,106, 98,103,125, 23,167,205, 67, 7,118, 93,235, 59,115,184,231,215,150,231, 55,132,129,211,192,105,224, 52,112,254, - 47,112,254,147,225, 80,236,213, 42,249,219, 90, 47,143, 86, 8, 64, 66,140,131,205,108, 53, 39, 55,109,221,189,120,239,193,227, - 75,151,207,155, 42,232,234,209, 27,209,119,126,195,197,192,179, 50,165, 74,189,149,195,196, 47, 49, 98,200,223, 84, 97, 69,113, - 28,173, 79, 16, 30, 30,206,183,108,240, 87, 12,166,119, 69,177, 89, 15, 84,243, 2, 51, 0, 76, 15, 11, 11,251,197,203,203,107, -227,180, 46,237,135,249,118,238, 1,173, 86,139,128,128, 0, 36, 39, 39, 95, 2,176, 74, 95,143, 91,116,116,116, 78,147, 6,117, -230,179,153,172,165,115,198, 14,181,201,126,255, 10,105,113,225, 0, 0,149, 74,161,253,248,246, 65,203,234, 24,103,108,108,252, -204,198,198, 38,222,198,198, 70,226, 86,175,214,116, 30,216,171,103,249, 12,182, 21, 39,189, 70,106,108,209,200,168, 74, 41,215, -164,189,189,215,168, 38,181, 91,167, 78, 29,158,128,141, 25,229,218,171, 86,106, 51,223,189,110,165, 15,143, 92,165,222,180,110, -123, 64,159, 13, 75, 39,241, 76, 77, 77, 17, 22,243, 14,171,127, 61, 45, 83,168,181,125,115,162,175,124,147,225, 49,154,166,161, -213,106,245, 94,232, 80, 1,150,183,108,217,210,125,227,198,141,174, 19, 39, 78,196,215,122,178,202, 34, 33, 73,228,231, 84,171, -126,147,119,241, 97, 94,150,198,156,147, 95, 83,158, 6, 24, 96,128, 1, 6,252,207,160,127,177, 51,103,122,153,191,225, 85, 10, -173, 18,196,100, 65, 14, 96,125, 61,166,244,192,138,141,219,215, 48,136, 29,147, 40,154,254,141,100, 96, 93,162, 24,217, 95,105, -156,156,205, 2,217,103,200, 88, 22, 0,176, 89, 53,235, 32,139,241, 22,192,240,195,143,159,183, 59,252,248,249, 15,197,159,109, - 0, 80,173,177, 92, 19, 22, 98, 60,154,212,119,234,218,186,169, 17, 83,167, 64, 90,220,123,228,202,148,184, 29,155,156,199,160, - 25,191, 85,215,168,196,196,196,251, 0, 96,103,198,143,235,218,164, 65,237,110,109,154,242,217,132, 26,105,175,194,144,175, 80, - 35, 40, 54, 57, 31, 4, 81,227, 9,213,223,202,222,204,232, 63, 94,252, 9,162, 23, 65, 16,119, 86,250,142,225,173,249,245,204, - 55, 21, 89, 0,228, 34,145, 72, 44,151,203,173,210,211,211,213,168,121,144,184,119, 5, 5, 5,205, 23, 44, 88,176,126,201,146, - 37, 75,183,108,217,194,169,201,156,172,138, 32, 17, 37, 95,238,214,244,219,213,191, 1, 6, 24, 96,128, 1,255, 19,152,254,217, - 95,232, 45,180, 74, 5, 67, 22,178, 1,204,169, 95,159, 94,148,144, 0,245,183,178,172, 60, 79,215, 87,226, 5,128,129, 53, 62, -155, 65, 20, 62,125,155, 44,125,246, 54, 89, 10,138,166, 41,154, 86, 49, 24, 72,149,105, 52,155,222, 38,138,106,190,234,142, 32, -116, 47,222,165, 40, 94,190, 79, 85,210, 20, 69, 83, 52,173, 38, 8,124,212,106,169, 77,177,137,201,127,252, 55,216,155, 19,125, -229,113, 32, 73,116,125,252, 44,102,145, 76,166,217,147, 19,119, 37,244, 27,214,139, 54, 58, 58,122, 92,167, 78,157, 38,235,116, -186, 3, 0,180, 95,193,165, 38, 73,114,249,230,205,155, 47, 69, 71, 71,159, 11, 13, 13,205,248, 22, 34,235,111,173,127, 3, 12, - 48,192, 0, 3,254,173,168, 89, 82,233,138,240, 45, 69,214,127, 35, 98,222,125,104,243,119,240,198,190,251,208,236,159, 96,111, -102,220,229,151,153,128,207,223, 84,188, 65, 58,157, 46,232, 91,138,234,155, 55,111,186,160,156,180, 58,255,109,245,111,128, 1, - 6, 24, 96,192,191, 22,211, 43, 18, 95, 44, 67,217, 24,240, 47, 0,253,173, 68,150, 1, 6, 24, 96,128, 1, 6,212, 0, 21,122, -180, 8, 84,188,114,224, 78, 53,126,160, 38,171, 15,238, 24, 56, 13,156, 6, 78, 3,167,129,211,192,105,224,252,159,227,252, 55, -194, 1, 69, 19,226,175, 21,255,173, 84,124,125, 75, 24,150,190, 26, 56, 13,156, 6, 78, 3,167,129,211,192,105,224,252,183,163, -220,137,240, 64,209,228, 97, 3, 12, 48,192, 0, 3, 12,248,187,192, 43,222,106,250,189, 1, 6,252, 19,197, 86,169,224,170,201, - 28,173,134,197,127,223,253,141,198,250, 58, 56, 56, 76,111,209,162, 69, 99, 14,135,195, 40, 44, 44, 92,119,239,222,189,181,159, - 31,212,181, 9,235, 37,147, 1,231,191, 62, 33, 0,130, 9, 48, 24,208,209, 72,123, 24,165,104,107,168,247,255,106,212, 49, 54, -181,249,147, 96, 48,185, 58, 82, 3,157, 86,131,162,233, 86, 69,160, 40, 50, 89,167, 81,121, 87,116,178,125,203,161,181, 73, 29, -181, 5,160,247, 2,140,217, 0,181,143, 0,107, 22, 13,114, 63, 1,230, 76, 48,233,159,161, 35,150,177,216,204, 21, 25,225, 23, - 82,255, 13, 5,118,254,252,121,230,215,156, 63,114,228,200,114, 19,136, 58, 58, 58, 6,242,249,252, 6, 21,157, 39,147,201, 50, - 50, 50, 50,188,254,229,237,177, 27,128,221, 0,154,126,246,249,107, 0,243, 1, 4,127,237, 15,120, 2, 44, 59, 96, 6, 7, 88, - 6, 0, 26,224,231, 76,224, 96,200,127,209, 28, 67, 27, 27,155, 7, 44, 22,203, 85, 38,147,201, 10, 11, 11,235,155,152,152, 36, - 8, 4, 2, 1, 73,146,111,179,179,179,187, 85,147,110, 54,254, 74,165,181, 20,192,190,106,126,111,128, 1,255, 20,124,213,170, - 67,183,162,231, 3, 60, 1,116,107,215,174,157,157, 76, 38,195,235,215,175, 51, 1, 60, 0, 16, 82,188,189,249, 22,150, 50, 24, -140,109,219,183,111, 95, 60,119,238,220,210,100,208, 81, 81, 81,104,217,242,203, 24,161, 76, 6,156,239, 93,189, 99,251, 34,250, - 13,218,245, 26, 81, 44,180, 24,128, 44, 3, 94,189,219,215,212, 4, 19, 11, 11,139,117, 4, 65,140,100, 48, 24, 85,118,106, 20, - 69,233,104,154, 62, 47,145, 72,214, 0, 40,172,206, 15, 9,248, 60, 45,169,211,149,251, 27, 44, 38, 83, 39,147,171, 42, 12,123, - 97,105,105, 25,202, 96, 48,234,149, 77,152, 13,124,154, 64,187,162,239, 72,146, 76,203,201,201,209, 71,132, 26, 49, 88,156,249, - 4,193,233, 13, 6,229, 6, 16, 32,192,120, 67,233,212,183, 41, 82,179, 19,128,242,107, 68,150, 67,173,250, 15, 23,174,218,236, - 28, 19,247, 26, 43,125,199, 98,203,238,227, 88, 49,127, 50,118, 30, 58,141,249,211,199,160, 73,147,166,168, 44,173, 56, 5,206, -166, 85,243, 70,246,242,223,123,206, 99,197,156,145, 60,255,189,231,187,174,244, 29,205,221,180,231, 92,215,149,190,163,120,254, -123,206,121,172,152, 55,210,120,211,190, 11, 20,128,241, 53, 49,114,140,171,163,140, 32,201,114,223,182,105, 22, 75,117,250,109, -186,224,255,227,142,158, 56,113, 98, 11,133, 66, 17, 54,182,119,235,205,173,220,156, 68,229, 29, 35,254, 40,114, 74,136, 15,247, - 99,115,140,219, 12,246, 59, 30, 85,169,203,129,199,171,247,250,245,107, 87,138,162,160,211,233, 64,146,100,233, 95,181, 90,141, -110,221,186,125,171,133, 51, 3, 1,172, 43,186, 89,225, 15,224,220, 87,112, 9, 89, 44,214, 66, 46,151,235, 73,146,100, 99, 0, - 96,179,217,113, 42,149, 42,132, 36,201,237, 0,164,213,228,219, 33, 18,137,154, 8,133, 66,104, 52,154,210, 4,244, 76, 38,179, - 81,237,218,181,247, 42,149, 74,215,175,189,120, 59, 96, 70,103, 15,143,157, 19, 22, 47,102, 42, 30, 60,192,206, 99,199,118,160, -160, 0, 0,246, 86,117, 46,151,203,189,197, 96, 48,234, 84,231,247, 40,138, 74, 86,171,213,222,213, 57,135,197, 98,185,166,167, -167,219, 58, 58, 58,162,176,176, 16, 2,129, 64, 80,178, 95, 3, 79,214, 86,154,166,141,139,159,237, 59, 59,118,236,216,137, 32, - 8, 18, 0, 77, 81, 20,227,217,179,103, 99, 40,138, 98, 21, 63,159,182, 2, 56, 6, 64,101,232,179, 13,248,135,122,179, 14, 85, - 87,104, 93, 7,224,217,174, 93, 59, 99, 31, 31, 31,120,122,122,194,213,213, 21, 70, 70, 70, 69, 15,113,177,216, 46, 34, 34, 98, -212,131, 7, 15, 70, 93,189,122, 21,175, 94,189, 82, 0,120, 4,160,220,155,186,231, 0,143,185, 70, 66,222, 46, 0,200, 78, 19, -103,164, 37,102,237,202,200,200,216, 10,160,108,136,240,250,227,199,143, 95, 52,111,222, 60, 4, 6, 6,226,244,233,211, 80,169, - 84, 40, 44,172, 68,191,200,179, 32,185,187, 25, 16, 36, 1, 41, 33, 0,223, 22, 16,216,213,184,164, 44, 44, 44,214,205,159, 63, -127, 65,147, 38, 77, 74,163,152,107,181, 90,144, 36, 9,173, 86, 11,137, 68,130, 69,139, 22, 21,117,180, 52, 13,138,162,112,227, -198,141,185,211,167, 79,135, 68, 34, 89, 88, 30,103,199, 54,181, 94, 50, 8,134,115,137,175,134,214,233,210,158, 70,164,181, 37, -117, 58,166, 82,169, 41, 55, 83,185,145, 17,167, 82,145,199,102,179,157, 95,253,249,167, 45,131,203, 5,173,211, 1, 20, 5,154, -162,138,139,179,120,163,139, 62,163,117, 20,104,173, 14, 20, 73,129, 84,168,208,126,246,108,125,138,162, 51,155,107,124,122,220, -180,197,246, 29, 58,118,100,215,173,229, 8, 82, 71,225,125, 82,154,125,216,203,167, 93,206,255,190,119,150, 90, 81, 56, 6, 64, -141,226,108,113,249,166, 65,123,246, 31,118,126, 17, 17,131,224,123, 15,112,231,110, 8, 0,224,214,189,208, 18,193, 93,101, 85, -129,148, 54,159, 63,101, 8,111,243,158, 51,236,249, 83,134, 50,183,236, 57,203,158, 55,121, 48,115,243,174,211,156,121,147, 7, - 51, 55,239, 62,205,153, 55,101, 8,211,127,231,209, 22, 0, 44, 0, 72, 42, 34,171,168,142, 8,146,228,157, 76,200,100, 2, 64, -246,129, 3,208,102,101,193,113,205, 26, 0,192,184,250,118,122, 15,119, 88, 91, 91,191,100,179,217,206, 85, 29,167,213,106,171, - 20,193, 19, 39, 78,108,169, 80, 40, 94,146, 36, 73,179, 88, 44,191,177, 67,251, 92,233,219,181,165,184,236, 49, 81, 81,145, 86, -155, 54,253, 57,228, 92, 88, 33, 61,170,141, 73, 88,224,182,137,109, 7, 44, 57, 30, 89, 73,135,204, 80,169, 84,120,251,246, 45, -202, 38,121, 47, 3, 93, 77,223,157, 0,236,180,178,178,234, 32, 22,139,199, 1, 88, 89, 80, 80,208,130,201,100,194,210,210,114, -165, 90,173,126,111,102,102,118, 36, 63, 63, 63,180,216,107,164,111,202,128,110,166,166,166, 1,151, 47, 95,182,104,221,186, 53, - 35, 39, 39, 7, 46, 46, 46,200,205,205,109,255,224,193,131, 54, 83,166, 76,153, 82, 88, 88,248,125,241,203,160,190,112,231,243, -249,244,132, 9, 19, 8,157,238,175,203, 61,122,244, 40,188,155,145, 13,108,204,249,114,165,154,206, 15,126,107, 54,147,195,225, - 60, 74, 78, 78,206,175,110, 97,112,128,101, 19, 22, 47,102, 10, 63,124,128, 48, 50, 18,227, 10, 10, 88, 91,138,188, 91, 85, 10, - 45, 6,131, 81, 39,224,244,111,174, 92, 46, 23, 36, 73,150,138,193,146,103,148, 86,171,133, 70,163,129, 86,171,133, 78,167,131, - 86,163,133,255,134,159,107,252, 44,228,243,249,124, 7, 7,135, 76, 62,159,207,255, 22,189, 16,143,199, 99,253,254,251,239, 99, -184, 92, 46, 0, 64,173, 86,163, 89,179,102,132,161,127, 54,224, 95, 38,182,190,240,114, 85, 38,180,250, 21, 20, 20, 64,167,211, -193,196,196, 4, 76,230,167,253,190,149,149, 21,122,247,238,141,110,221,186,193,199,199, 7,175, 94,189, 50,246,241,241,233, 93, - 17,217,216,197, 3, 80,203,213,174,184, 51,161, 28, 30, 95,139,216,124,244,167, 11, 54, 31, 63,126, 92, 92,230,176, 41, 51,102, -204, 32,196, 98, 49, 70,142, 28,249, 64,165, 82, 13, 2, 80, 80, 17,167,142, 66,154,151,207, 56, 80, 52, 97,188,253,217, 97, 66, -173, 84,208, 12, 6, 67, 81, 50,116, 88,147, 82, 34, 8, 98,164,163,163, 35,206,156,249, 63,246,190, 59, 46,138,107,125,255,153, -217,190, 44,189,131, 10, 42,136,130, 32,216, 16,108,216, 53, 17, 19,107,188,246, 36, 38,222, 36,150, 88, 18,177, 69, 99,131,196, - 26, 19,141,154,196, 88,174, 13,187,216, 98,197,196,174, 40, 82, 20, 20,105,194, 2, 75, 95,216, 54,187, 51,243,251, 3, 88, 1, -217,130,201,253,221,251,189,217,231,243,217,207,238,236,204,190,123,230,156,153, 57,207,121,222,247,188,231, 32, 52,154,215,211, -133,217,218,218, 34, 57, 57,249,149,170,198,225, 32, 44, 44,140, 67, 16,196, 56, 0,115,155,182, 73,182,188,113, 47,203,181,110, - 59,114,112, 32, 63,172, 43, 89,152, 95, 88,205, 2, 32,150, 44, 89,162, 39,110, 0,240,245,215, 95,155, 83, 78,144, 60, 30,100, -241,241,175, 30,196, 92, 18, 36,159, 0,193, 3, 72,110,141, 23, 21, 44,192,210, 0,163, 3, 24, 45, 32,242,104,101, 78, 53,132, -182,240,242,139, 91,187,113,155,189, 90,203,226,224,201,203,200,204,124, 1, 14, 73,194,199,215, 15, 67,250,245,225,117,237, 30, -222,234,219, 21,243, 79,231,231, 60,123, 11,192,221,102, 87, 52,195,138,124,189,156,241,243, 47, 15,224,226, 96,141,113, 35,223, -134, 88, 36,196, 55,223,255,138,213,139,102,194,207,199, 27, 59, 54,175, 49,248,115, 59, 59,187,149, 1,126,190,222,219,246,156, - 65,128,191, 63,103,219,222, 51, 8,232, 88,251, 30, 24,192,217,182,247, 12, 58, 6,118,228,108,219,123, 6,193,129, 29, 90,223, -151,222, 89, 89, 90, 90, 58,211,112,125, 54,106,163, 33, 53,109,196,171, 98,244, 29, 65,214, 39,159, 0,128,158,104, 53, 7, 60, - 30,175,101,126,126,190,171,169,227, 76,169, 6,181, 74,214,125,157, 78,135,162,162, 34,162,188,188,156,181,183,183, 31,121,126, -199,226,227, 67,123,135,148, 2,192,163, 71,143, 28,163,163,215,142, 60,116,191, 18,202,219, 63, 16,255, 58, 21,207, 76,122, 39, -226,254,201,152,105, 93, 81,187, 36, 68, 99,168,213,234,204,206,157, 59,179,181,159, 91, 8,133, 66,126,163,235,205,179, 93,187, -118,175,169,214,102,184, 20,191,187,117,235,214,204,142, 29, 59,194,223,223,255,102,143, 30, 61,108, 37, 18, 9,206,159, 63,143, -128,128,128, 64, 91, 91,219, 59,177,177,177,188,133, 11, 23,134,236,218,181, 11, 0,102,153, 81,157,131,250,247,239,127, 48, 46, - 46, 78,196,231,243,161, 84, 42,145,156,156, 12, 59, 59, 59, 8, 4, 2,188,251,238,187,156, 94,189,122, 57,245,235,215,239,104, - 90, 90,218, 4, 52, 99, 6,148, 74,165, 98, 23, 47, 94, 12, 43, 43, 43, 88, 89, 89, 65, 34,145, 64, 34,145,192, 90, 4, 98,251, - 28, 47,241,236,157,229,226,185,203,183,199,236,221,182,226,106,171, 86,204, 87,185,185,185,229,205,189, 22,148,215,175,195,250, -209, 35,160,222,189,107, 46,236, 36,142,136,138,138, 50,165, 72,129,207,231,163,103,207,158, 38,237, 57, 58, 58, 30,227,114,185, - 13, 70,166, 58,157, 78, 20, 21, 21, 69,167,165,165, 73, 72,146,148, 48, 12,131,168,168, 40, 90,167,211,137, 92, 93, 93,111, 50, - 12, 83, 88, 92, 92, 60,218,140,226,170, 1,124, 65,146,228,119, 66,161,144,219,186,117,235,236,101,203,150,221,170, 85, 51,193, -178, 44,217,186,117,235, 80,177, 88,236,173, 86,171,117,168,113, 29, 90,212, 44, 11,154, 4,203,178, 93,107, 68, 97, 61, 52, 0, - 4,181,159, 75,106,122, 59, 56, 55,250, 30, 0,138,107, 7,138,110, 6,182, 75, 0,164, 0,232, 0,192,181,118,223, 61,130, 32, - 74,223,160,152,134, 21,173,184,184, 56,253, 16, 54, 50, 50, 82,223,177,216,216,216,224,222,189,123, 32, 8, 2, 54, 54, 54,176, -181,181,133,157,157, 29, 42, 43, 43,145,146,146,130, 39, 79,158, 32, 43, 43, 11, 4, 65,192,199,199, 7,117, 55, 80, 61,232, 31, -112,251, 55,196, 65,100, 45, 4, 65, 0, 93, 6, 4, 35,184,111, 16,186,223,205,152,115,255, 18,177, 83, 42,149,166, 3,224, 6, - 5, 5,125, 24, 22, 22,134,141, 27, 55, 66,173, 86,111, 52, 64,178,244, 54,127, 79,209,117, 3, 0, 15, 15,143, 5,251,206, 63, -183,154, 60,204, 87, 33,149, 74,215,191, 65,229, 52,120, 16, 23, 23, 23,155,189, 22, 31,195, 48, 40, 43, 43, 51,106,179,177, 66, -176,233,187, 31,236,229, 21,133, 88,245,205, 62,104,181, 90,204,159, 63, 31, 12,195,232, 95,229,229,229,102,149,147,165,233,215, -181, 3,178,198,123, 74,112, 1,175,241, 53,188, 34,231,224, 15, 32, 88,128,160, 1,188,126, 94,141, 59, 33, 17,135, 47, 62,180, -226,155, 45,246, 9, 79, 94,226,228,229, 4, 80,149,121,144, 62, 58, 94, 35, 57,246,156,128,195,106, 14,122, 4,251,226,243, 37, -223, 58, 44,253,124,202, 33,141, 82,238,143,134,110,196, 75,166,111, 26, 26,171, 86,174,196,206, 45, 27,241,237,198, 45,168,172, - 40, 7,143,231, 92,251,160,167, 65,211,180,241,115,103,217, 97, 81,115,222, 39,190,249,241, 24, 66, 59,122,224,232,249,187,232, -221,217, 27,199,127,187,143,190, 93,219,224,228,165, 4, 12,232,225,139,179,241, 73,248,124,198, 4, 98,194,133, 93,195,154,211, - 70,155, 55,255, 96, 47,175, 44, 68,220,154, 61, 40,218,186, 21,217, 51,103, 34,180,246,152,187, 4, 1,126,203,150, 0,223,116, - 27, 53, 70,106,106, 42,212,106,117, 83,163,125, 4, 4, 4,152,108,119,165, 82,249, 64,167,211,177,133,133,133, 68, 97, 97, 33, - 36, 18, 9,145,156,156, 68, 7, 6, 6,141, 98,159, 28,249, 9, 0,162,163,215,142, 58,252,160, 18,138,155, 91,160,188,245, 61, -248,109, 18,201,157, 95,207,160, 62, 94,190,227, 65,189,123,180, 65, 57, 11, 10, 10,222, 42, 40, 40, 0, 0,180,109,219,246, 73, - 90, 90, 90,135, 58, 87,115,173, 11,145,175,211,233,252,234,220,137, 58,157, 14,106,181, 26,131, 6, 13,226, 24, 59,119, 7, 7, -135,176,128,128, 0, 36, 36, 36, 96,203,150, 45,142,253,251,247,199,179,103,207, 64, 16, 4,214,174, 93, 75,116,236,216,145, 87, - 92, 92,140,161, 67,135,226,216,177, 99, 61, 43, 43, 43, 77,213,167,141, 68, 34,217,117,250,244,105, 17, 73,146,144,203,229, 96, - 24, 6,189,122,245, 2, 73,146, 72, 74, 74,194,146, 37, 75,112,236,216, 49,156, 56,113, 66,220,181,107,215, 93, 10,133, 34, 0, - 13,221,250,134,218,136, 85,169, 84,172, 80, 40,132, 80, 40,132, 72, 36,130, 72, 36,130, 64, 32, 64,149, 10,248,120, 83,182,154, - 35,114,102, 2, 59,247,246,125,127,246, 90,114,253,178, 15,174, 0, 56,105,238, 53, 15,212,196,100,125,247,235,175, 91, 38, 85, - 84,144, 0,240, 51, 65, 48, 20,203,126,107,206,253, 14, 0, 85,170, 10,120,251,180,196,209, 67, 39, 48,102,252,200, 38, 73, 22, -143,199, 7,159,199,131,173,163,196,164, 77, 62,159,239,246,228,201, 19, 39, 30,143, 7,150,101, 65,211, 52, 40,138, 42, 92,186, -116,169,203,240,225,195,109,206,157, 59, 71, 14, 31, 62,156,113,112,112,168,190,123,247,110,145, 78,167,115,234,211,167, 79,115, -174,249,109,193,193,193, 93,142, 31, 63,254, 65, 84, 84,212,253, 5, 11, 22,172,170,191,115,221,186,117, 43,207,158, 61,235, 61, -106,212,168,189,143, 30, 61,218,214,156,103,200,159,125,206, 91,108,254,247,217, 52,196, 69,106,225, 70, 16, 68, 92,189,103,118, -100,221,118, 84, 84,212,226,232,232,232,100,130, 32,226,234,127, 95,119, 92,237, 96, 49,174,169,237,218,223, 58, 46, 90,180, 40, - 40, 38, 38,102,109,120,120,248,193,155, 55,111,190, 0,208, 92,162,101, 60, 70,171,238,132,234,159,100,163, 78, 13,149,149,149, -168,172,172, 68,110,110, 46,182,111,223, 94,123, 67,243,192,229,114,193,229,114,245,241, 12,134,112, 57,238,143,239, 1,124,223, -165, 75, 23,222,227, 91,177,231,190,220, 57,123, 96,183, 65, 93, 56, 15, 46, 63, 30,139,154,245, 8,223,154, 58,117,170, 51, 0, -236,217,179,167, 24,192,185,255, 16,107,142, 77, 79, 79,255,220,195,195, 67, 31,163, 82,223,125,168,211,233, 32, 18,137, 80, 23, -203,162, 82,169,176,125,251,118, 29,203,178,177, 70,108, 34, 45,249, 10,210,147,175,214,252,142, 97,192,208,175,126,191, 98,197, - 10,176, 44,171,239,236, 63,169, 85, 78, 76,146,188,166,234,156,109,244,222,232,123,150,166, 77,184, 39,248,179,199, 78,153,233, -193, 16, 92,156,186,242, 16, 60, 30, 15, 76, 61, 53,147,199,169, 25, 45, 39, 63,203,135,167, 91, 32,222,153, 48,195,253,248,222, - 31,102,235, 40,213, 55,205,173,107,255,224,112,204,249,252,115,252,180,115, 39,150, 44, 95,169,103, 0, 58,154,134,206,100, 57, - 73,114, 80,175, 32,232,170,242,193,225,112, 48, 32,212, 23, 28, 14, 7,131,195,219,131,195,225, 96,104, 47,127,112,185, 92, 12, -235,221, 17,237,218,181, 3,151,203, 37, 77,180, 59,210,146, 47, 35, 61,249, 90, 61,210,203,130, 5, 64, 73,165,175, 29,175,149, - 74,193,122, 57, 53,247,218,194,135, 31,126, 88,158,155,155, 75, 53,222,215,170, 85, 43,254,245,235,215,237, 13,184,237,244, 16, -139,197, 93,185, 92,238,131,210,210, 82,198,202,202,138,100, 24,154, 9, 12, 12,226,156,223,177,248,120,221, 49,139, 22, 45, 62, -254, 94, 87,219, 81,251, 98,227, 88,126,235,222, 4,193, 19,234, 62, 90,190,131,207,227,139,187, 2, 74,115, 6, 15,164, 90,173, -198,211,167, 79, 97,170, 60, 44,203, 26,117,253,148,149,149, 77, 13, 8, 8,184,254,253,247,223, 59, 18, 4,129,223,127,255, 29, - 28, 14, 71,255,202,200,200, 0, 73,146,248,242,203, 47,169,202,202,202,233,166,202,198,229,114, 63, 63,122,244,168,157, 64, 32, -128, 92, 46,215,223, 55, 28, 14, 7, 79,158, 60,193,250,245,235, 49,117,234, 84,228,228,228,192,211,211, 19,243,231,207,183,142, -137,137,249,156,162,168,149,102, 52, 81,162, 70,163,233,102,101,101, 5,145, 72,132, 58,194, 5, 0,191, 37,243,146,148, 74,101, - 39, 39, 39,133,187, 75,124,220,169,158,253,223, 9,113,114,241, 8,151, 74,165,205, 90, 58,235, 57,176, 51,147,166,151,190,117, -252,184,235,141,227,199,153,219,167, 79,191, 20,202,229, 59,204,190,134,180, 36,178, 51, 94,162,107,215,174,120,240,224, 1,186, -118,237, 90,159, 52, 65, 32, 16,128,207,231,131,207,231,195,217,193,172, 16, 10,150, 36, 73,220,184,113, 3, 52, 77, 67,163,209, - 64,163,209,160, 99,199,142,165, 87,175, 94,181, 6,128,140,140, 12,118,242,228,201,229,119,238,220, 65,231,206,198,215, 83,119, -115,115,187,206,225,112, 90,215,255,174,164,164,196, 97,244,232,209, 40, 43, 43,123,123,244,232,209,189,107,239,223,188, 35, 71, -142, 76, 6, 0,129, 64, 0,146, 36,105, 88,240,183,135, 41, 46, 82,159, 40, 53, 38, 92,209,209,209,145,141,191,171, 79,170,154, -250, 92,255,183, 49, 49, 49,107,235,217, 86,190, 65,241, 77,199,104,197,197,197,177, 77, 48, 72,179, 97,138,104,213, 33, 33, 33, - 65,235,233,233,249, 83,250,195,172,129,190,193, 62, 16, 75,132, 67, 0,124, 47, 20, 10,231, 77,153, 50, 5,183,111,223, 70, 82, - 82,210, 47,248,147,179,112,130,130,130, 46, 8,133, 66,111, 3,110,146,236,164,164,164,161, 6, 58,134,229,167, 79,159,134,177, - 96,248, 43, 87,174,212,239,148,234, 7,195, 55,125, 97, 48, 44,180,148, 22,213, 10,229,171, 78,188,150,104, 85, 87, 87, 99,252, -248,241, 13, 20,173,162,162, 34,147,231, 71, 16, 4,214,159, 60,137,139,177,177,120, 59, 36, 4,199,238,222, 69,204,148,137,240, -247,110, 1,150, 38,192, 18, 64,206,129, 31, 80, 82, 89,133,253,151,111,160, 84,174,192,164, 62,125,224,103,235,108,220, 46,143, - 63, 56, 52, 44,156,127,233,102, 10,120, 60, 46, 72, 48, 96,181, 10,120, 6,244, 3,135, 36, 97,231,214, 6,124, 30, 15, 60, 30, - 23, 25,185,197, 8, 8,234, 46,136, 19,136, 6,191, 9,209,106,229,221, 6, 52, 77, 99,234,212,169, 56,120,240, 32,156,220,189, - 97,215, 42, 8,171, 55,238,196,219,131,250,152, 60,255,186, 17, 60,151,203, 5,135,195,121,237,189,238,179, 57,234, 36,203,176, -160, 26,183, 17,195, 2, 44,139,150,107,214,160,229,154, 53,184, 91,251,159, 29,171,171,161, 84, 42,129, 30,129,205, 34, 89, 26, -141, 6,185,185,185, 84, 65, 65,129, 91, 19,251, 11, 53, 26,141, 73, 98,179,123,247,238,196,105,211,166,117,115,116,116,188,159, -248,232,145, 54, 56, 36,132,119,110,251,226, 19,117,110, 67, 0, 8, 9, 9, 41, 93,188,120,241,137,201,227, 34, 71,110,139,250, - 7,253,233,202,189, 92,161, 88,220, 45,114,193,238,196, 3,227,198,153,246,247,168,213,153,193,193,193,172, 57,231,165, 80, 40, - 10,140,236, 30, 1,224,235, 46, 93,186,216,246,239,223, 31,215,175, 95,199,152, 49, 99,212, 20, 69,165, 3,192,240,225,195,219, -239,223,191, 95,144,146,146, 2, 23, 23, 23, 94,118,118,246, 46,152, 8,144, 23, 8, 4,253,186,119,239, 78,170,213,234,215, 72, - 86, 76, 76, 12, 38, 76,152,128,246,237,219,131, 97, 24, 84, 85, 85,161,127,255,254,188, 45, 91,182,244, 51,147,104,205,241,247, -247, 95,143,154, 89,135,245,159,133,169,168,113,107,161,164,164,164,224,225,157,203,201,125, 6,141,238,214,186, 93,144, 71, 82, -226, 3,163, 6, 93, 93, 93, 23,145, 36,249, 30,195, 48,156,202,202,202,220,135, 26, 77,187,142,222,222,110,189, 70,142, 68, 5, -143,199,249,238,242,101,178, 80, 46,183, 6, 96,150, 11, 82,165,173,134,183, 79, 77,168,223,152,241, 35,241,224,193, 3,140,253, -199, 40,240,249,124,112,185,188,154,123,147, 95,163,104,217, 59,219,154,117,109,106,181, 90,253, 51,188, 46,206,139,162, 40,212, -133,102, 89, 89, 89,233,247,169,213,106, 16, 4, 97,236,218,240, 59,188,114,153,171,216,214, 14,180, 86,139,192,145, 99,245,215, -244,157,159,183,137,193, 48,226,242,236, 76,204,138, 61,205,131, 5, 22, 24, 80,181,140,113,145,250, 68,233,207,130, 32,136,184, -168,168,168,197, 0,216,168,168,168,197,117,219,209,209,209, 74, 0,121,111, 72,182, 94, 83,185,184,127, 5,201,170,115, 47, 24, - 67,255,254,253,103,217,216,216,108,169,219,206,189,157,135,220,219,121, 8,232, 16,216,171, 75, 72,183,138, 9, 19, 38,192,201, -201, 9, 11, 22, 44, 96, 1,252,210,220,255,207, 72, 75,182, 6,192,122,120,120, 44,168,125, 32,135,220,189,123,215,229,222,189, -123,232,222,189,251, 43,233,158,162,208,187,119,111, 99,166,228,181, 65,237,115,255, 58,149,140, 1, 69, 81, 80, 40,148,208,104, - 40,232,180, 12,116, 58, 29,186, 6,218, 96,239,206,168,154,239,116,117,234, 89,141,106,214,210,221, 6, 54,214, 60, 45, 73, 18, -202,251,137, 5, 77, 62, 49, 53, 26, 13, 18,179,179,241, 40, 43, 11, 0,240, 78,180,241,192,215,189,151,175,163, 99,199,142,166, - 74,235,219,210,211, 29,249, 23, 19,107, 30,222,202, 92,220,251,227, 48,108,108,172, 1, 0,129, 17,147,192,231,215, 16,173,106, - 37, 5,231, 14,173, 64,176,172,193,180, 0, 86, 14,238, 23,184,124,145, 55, 75, 51, 96, 89, 6, 44, 67,131,101, 25,112,120,124, -171, 89,159,124, 0,134,161, 17, 26, 26, 10,130,195, 1,173, 85, 99,220,136,193, 40,171,144,195,201,222,188, 78,130,207,231, 35, - 34, 34, 66,108,104,255,179,103,207,148,245,137,153,241, 54,210,162,186, 90, 9,181, 90, 13, 74,163, 3,165,213,129,110,203,199, -170,165, 19,161,163,116, 80,252, 35, 28,148, 86, 7,230,243, 81,160, 52, 90,228, 88,145,100,112,128,179,150, 4,161,124,152, 42, -179, 53, 69,180,234,200,129, 33, 52, 21, 19,104,128,108, 61,154, 54,109, 90,215,224,144,144, 7,239, 13, 10,217,240, 56, 41, 57, -255,113, 82,242,107,199,121,183, 15,201,252, 52,230,224,124, 30, 95,220, 53,114,129,241, 89,135,245, 81,223,141,248, 39,177, 88, - 46,151, 7, 91, 91, 91, 35, 45, 45, 13, 28, 14, 7, 4, 65, 60, 3, 16, 12, 0, 30, 30, 30,207,185, 92,174, 15,135,195,193,214, -173, 91, 9, 46,151,219, 41, 60, 60,124,177, 74,165, 58,108,100, 64, 23, 96, 99, 99,211, 64,205,226,243,249,136,138,138,194,228, -201,147,245, 36,139,207,231, 99,247,238,221,232,214,173, 27, 52, 26, 77,128,153,229,189, 7,160,143, 25,138, 31, 81, 75,206, 77, -146, 81,157, 78, 55,173,228,189,247,218, 33, 62, 30,189,124,124, 58,118,237,218, 21, 20,245, 74,208,244,241,241,105, 37,151,203, - 11,148, 74,229,191, 80,147,218,224,161, 81, 82,164, 98,144,157, 81, 19,126,250,224,193, 3,132,134,134,234, 21,172,250,106, 22, -159,207,135, 88, 96,221, 44,162,197, 48, 53,207, 37,185, 92, 78,198,199,199, 59,251,251,251, 19, 0,224,239,239, 79, 60,124,248, -208,209,202,202,170,216,215,215,215,228, 0, 88,108,107,135,221,211,198, 3, 0,190, 26, 52, 76, 63, 48, 58,255,245, 98,240,120, - 60, 12, 92,176,248,181,235,158, 97, 24, 14, 44,176,144, 44, 51,184,200, 95, 69,178, 26, 43, 90,209,209,209,201,209,209,209,175, -169, 99,205,132,105, 69,171,190,116,215, 92,212,221,172,134,176,113,227, 70,116,234,212,201,104, 71,180,101,203, 22,236,219,183, -111, 35,128,140,102, 75,142, 3,187, 4, 98,211,241,100,159,246,129, 4, 0,172,252,124, 4, 89, 93, 93,141, 27, 55,110,192,206, -206, 14,207,158,153,157,246,203,198,206,206,238,107,146, 36,199,113, 26,207, 0,104,154, 96,210, 12,195,196, 86, 84, 84, 24, 76, -239,192,178, 0,165,213,161, 90,161,130, 70,163,193,231, 95,254, 96,178, 16,209, 0, 65,105,228,220,136,190,225, 98, 67,138, 78, -104,167,126,248,108,138,245,107,157, 55,135, 4, 72, 18,232, 28, 90,163,184, 60,188,155, 12,134, 1,104, 6,112,118,117,192, 47, - 7, 54, 24, 37,249, 58,154,169, 29, 29,211,168, 82,211, 8, 8,139,196,203,212,120,189,130, 36,224,215,184,140,249, 60, 30, 24, -150,168,201,250, 96,136, 8, 9,196,222,101,210, 12,191,157,113,143,241,113,100, 39, 28,185,148,136,177,131,130,113,245, 78, 10, -250,247,232,136,228,244, 44, 4,250,181,198,214, 93,177, 96, 89,200,127,220,180,186,224, 85,135,166,203, 54, 71,209,186,125,251, -182,178,177,138, 85,255,157, 53,221, 31,130,101, 95, 41, 90, 74,149, 26, 11, 22,153,149,206,167,166,141,250,132,137,205, 57,216, -152, 98,101, 14, 17,107,172,108,193, 68,122,150,182, 0,186, 1, 11,255,147, 15, 78,154,166,113,230,204, 25,125,123, 52,213,142, -245,219,206, 12,146,131,236,236,108, 36, 39, 39, 35, 44, 44, 12, 21, 21, 21,224,145, 36,230, 63,126,140,142, 83,166, 64,195,231, -131, 97, 24, 8, 4, 2,204,152, 49,195,236,250,108,230,211,185, 54,152,155, 54,101,124, 67,120,120,120,187,180,234,106, 36, 63, -121,130, 65, 43, 86, 0, 0,206,158, 61,219,224,154,152, 55,111,158, 32, 37, 37,229,195,251,247,239,127,152,159,159,191, 17,192, -124,131,207, 89, 86,173,143,209,122,111,226, 24,180,243,111,139,125,191, 30,208,239,159,247,197, 28,240,120,124,240,248, 60,216, -219,217,155,117, 54, 90,173, 86, 79, 90, 21, 10, 5,121,246,236,217,150,131, 7, 15,230,207,153, 51,135, 0,128,125,251,246,145, -223,127,255,189,228,226,197,139,252, 22, 45, 90, 72, 77,146, 75,138,122,173,141, 9,130, 0,143,199, 3, 95,192, 7, 24, 6, 4, - 65, 72,214,173, 91,183, 50, 57, 57,185,187,191,191, 63,212,106,245, 20,212, 76,212,176,228,209,178,144, 45,163, 92,164,169, 88, -171, 90, 85,202, 16,100,245,227,182, 12, 17,181,250, 49, 91,120,179, 73, 25,230,197,104, 53, 5, 14,135, 99, 82,173, 34, 73,210, -164,235,112,222,188,121,176,177,177, 49,212, 1,177,143, 31, 63, 78,145, 74,165, 59, 1,252,240, 70,141,115, 57, 33,249,235,185, -163,228,168,245,173,218,219,219, 23, 15, 24, 48,160, 10, 0,117,248,112,195, 1,178, 90,173, 54,216,129,219,217,217,125,253,243, -207, 63,207, 30, 57,114, 36,217, 56,197, 64,125,247, 94,221, 75,171,213,226,240,225,195,179, 23, 46, 92,136,138,138,138,185,198, - 58,113, 69,181, 18,202,218, 64,232,231, 73, 71,204,125,168, 27,220,101,109,239,129,150,109,131, 13,118, 38, 36,191, 38,134,200, -205,235, 85, 7,102, 99, 35, 2,109,196, 38, 65,144, 25, 89, 57,249, 45, 90,185, 59,226,121,174, 12,110,173, 59,161, 44,239, 85, - 61,112,185, 28,240,106, 93,135,246,182, 18,200,138,138, 64,146, 28,163,196,120,245,254, 4,220, 73,202,194,209, 75, 15, 65,169, -170,177,105,207,121, 80,234, 42, 80,170,106, 80,170,154,247,181, 11, 63, 2, 65,160, 64,171,174,110,223,156,118,231,114,185,232, -209,163,135, 65,162,147,151,151,103,166,162,197,234, 21, 45,165,170,153,109,100,222,200,201,168, 98, 85,183,255, 77,137, 65, 93, -202, 7,177, 88,220,109,247,110,195,105, 28,154,130,187,187,251, 57,107,107,235, 54,230, 30,223,140,228,165,107,237,237,237,191, -246,247,247, 15,216,180,105, 19,143,195,225, 96,224,192,129,237,221,221,221,179, 1, 32, 48, 48,208,179,238, 25,243,233,167,159, -178,183,111,223, 78,170, 25, 99, 24,134, 64, 32,120, 98,103,103,215,173,127,255,254,168,168,168, 64,110,110, 46, 36, 18, 9, 58, -110,216,128,199,159,126,138,144,237,219, 65, 14, 24, 0,130, 32, 32, 16, 8,240,248,241, 99,136,197,226, 39, 42,149,193,148,111, - 61, 0,124, 11,160, 23, 94,185, 11, 89, 0, 55, 80,147,118,225, 78, 19,207, 59, 18, 0,104,134, 49,213, 88, 19, 23, 44, 88,128, -114, 30, 15, 24, 62, 28,252,140, 12, 80, 20,133,176,176, 48,189,202, 30, 22, 22, 6, 46,151,139,224,224, 96,120,122,122, 98,235, -214,173, 19,141, 17, 45, 85, 21,133,236,140,151, 8, 15, 15,215, 43, 87,195,135, 15,215, 43, 90, 60, 30, 79,175,108, 17,180,105, -226, 74, 16, 4, 91,127,144, 76,211, 52,193,229,114,185,115,231,206, 37,198,140, 25,195,106, 52, 26, 70, 32, 16,144, 71,143, 30, - 37,174, 94,189,202,173,174,174, 54, 57, 16, 15, 26, 53, 14, 95, 13,126,171,230,222,111,227, 2, 30,159, 7, 1,159,143, 5, 79, - 94,234,219,197,118,247, 65, 65, 76, 76,204, 88,127,127,255, 26, 55, 60,192,181,228,209,178,192,132,208, 35,107, 68,146, 52,245, -182,101, 0,136,218,109, 89, 61, 66, 37, 35, 8,226, 30,203,178,221, 27, 29, 91,183, 95,211,232,189,110,255,163, 55, 40,126,221, - 90,135,175,145, 47, 99, 35,226,244, 91,183,110,249,117,237,218, 21, 57, 57, 57,175,205,132,171,235,184, 36, 18, 9,196, 98, 49, -110,222,188, 9, 0,233,134,140, 93,189,122,245,123,212,100, 93,174, 41,145,135, 71,120,255,247,250,221, 12, 29,214, 29,251,163, - 15, 84, 72,165,210, 96,188,202,161, 67,120,122,122, 78,230, 9,184,227,125,130,188, 34,192, 48,223, 94, 62,125, 99,133,177, 51, -244,105, 31, 88, 5, 64, 89, 55,235,240, 13,103, 31,130, 36,201,113, 35, 71,142, 36, 83, 82, 82, 48,126,252,120,236,219,183,207, -224,177,147, 39, 79,198,193,131, 7, 49,114,228, 72,114,209,162, 69, 6,211, 59, 52, 84, 75, 52,127,217, 69,153,246,236, 17,246, - 30,252,217, 96, 12,146,171,107, 77, 60, 86, 81, 81,177,254,187,238, 93,141,123, 70, 24,157,230, 98,194,253,187,225, 61,251, 14, -228,231, 22,150,131,209,169,161,146,191,250,189,162,188, 16,172, 78, 5,190,149, 35,220,157,237,240,224,214,111, 26, 74,163,186, -104,204,230,236,145,129,248,116, 68, 0,192, 50, 24, 53,255, 23,196,253, 48, 75, 63,130,238, 61,102, 14, 46, 31,254,206,236, 24, -191,198,224,241,120,120,252,248,177,210,144,154,197,225,112,204,201,201, 85,171, 58,106,161, 80, 40,161, 80,170,254,202,103,135, -139,155,155,219,143, 14, 14, 14, 34, 3, 68,202,197,197,197,229, 71, 39, 39, 39,145,185,174, 67, 67, 36,171, 54,175,214,253,105, -211,166, 53,139,108, 9,133,194, 54,233,233,233,250,100,165,198,222, 53, 26, 13,250,247,239,111,110,242,210,211, 0, 94,120,120, -120,220,232,216,177,163,221,243,231,207,113,224,192, 1, 62,143,199,243,170,123,126,200,229,114,112, 56, 28, 20, 21, 21,105, 1, -124, 0, 19,174, 51,181, 90, 29, 31, 31, 31,223,121,196,136, 17,156, 39, 79,158,128,195,225,212,148, 43, 60, 28, 33,219,183, 35, -105,238, 92, 68,100,101, 65, 69, 81, 16,137, 68,184,112,225, 2,165, 80, 40,226, 13,217, 19,139,197, 59, 51, 51, 51, 3, 69, 34, - 17, 40,138, 2,195, 48, 32, 73,146,224,114,185,189,237,237,237,183, 0,232,222,168,177, 92, 67,186,247,239, 64,235,116,180, 52, -231,185,204, 84, 5,148,148,148,224,244,233,211, 8, 11, 11, 67, 68, 68, 4,242,242,242,144,145,145,129,183,223,126, 91,127,204, -163, 71,143,144,144,144, 0, 95, 95, 95,211,138, 30,169,133,111,135, 54,224,243,249, 53, 10, 17,143, 95, 59,240,225,233,149, 44, - 62,143, 15, 30,151, 7,145, 88,100,182,162, 69, 16, 4, 72,146, 4, 65, 16, 16,139,197,117,131,108,166,101,203,150,210,210,210, - 82, 15, 0, 13, 3, 10, 12, 0, 0, 32, 0, 73, 68, 65, 84, 28,177, 88, 12,154,166,205, 26,180,212,245, 17,117, 36,139, 47,224, -235,149, 45, 0, 40, 47, 47, 87,141, 28, 57,242, 95,106,181,250,125,188,217, 10, 37, 22,252,205, 64, 16,196,189,255,196,111,155, -129,225,181,196,234,181,160,120, 99, 23,248,219, 61,123,246,220, 62, 97,194,132,129,155, 55,111,134,181,181, 53,164, 82,169,190, - 67, 20, 8, 4,104,213,170, 21, 74, 75, 75,177, 99,199, 14,188,124,249,242, 10,128, 25,230,150, 72, 42,149,222,126,246, 48,189, -164,255,216,158, 78,129, 61, 59,216,231,166,191, 12,147, 74,165, 55,107, 73,214, 47, 19,230,189,253,126,255,209,161,224, 11,120, -200,125, 86,128,203,167,111,252,127,105, 76, 14,135,195, 33, 8, 2,227,199,143, 55,235,248,127,252,227, 31,136,143,143,135, 49, - 55, 35, 83,167,104, 41, 84,168, 86,254,117,131,181,207,102, 77,198,103,179, 38,235,201,132, 57,174, 23, 0,240,244, 60,100,132, -104, 81,155,227, 14,237,248,184, 75,104,184,119,183,192, 54,184,115,255, 33,246,111,127, 37, 50,236,250,126, 37,190,217,117, 5, -173,220, 28, 64,169,171,113,238,200, 79, 5,148, 90,177,249, 13, 69,185, 26,114, 75, 16, 96, 89,166, 89,231, 94, 71,158,120, 60, - 30,130,130,130, 12, 42, 90,165,165,165, 74, 83, 29,131,190,141, 52, 90, 84, 85, 43,161, 84,252,101, 68, 43,164,119,239,222, 23, - 99, 99, 99,157, 92, 93, 93,145,159,159,223,152,104,133,244,234,213,235, 98,108,108,172,147,155,155, 27,114,115,115,205, 78, 43, -210, 4,201,130, 76, 38, 35,202,202,202, 24, 7, 7,135,102,145, 45,146, 36,161, 86,171,145,154,154,106,238,223,154, 61, 67,204, -206,206,110,247,193,131, 7,237,138,139,139,193,225,112,144,154,154,218, 96,214, 97,221,235,151, 95,126,225,143, 26, 53,234,231, -242,242,114,163,211,218,116, 58,221,198,201,147, 39,127,152,151,151,231,224,234,234, 10,169, 84, 10,129, 64, 0,150,101, 65,244, -239,143, 62, 47, 94,128,162,105,136,197, 98,164,165,165, 97,231,206,157,213,181,169, 98,154, 20,200, 8,130,240,227,243,249,152, - 52,105, 82,131, 29,123,246,236,193, 59,221, 56,221, 92,236,184, 85, 58,136,212,133,226,183,206,113, 56, 28, 34,164,199,128,246, - 61,250, 14, 15,122,154,116,231,185,172,240,165,169,135,146, 86,163,209,192,223,223, 31,247,238,221,195,165, 75,151, 48, 96,192, - 0, 68, 68, 68, 32, 49, 49, 17,191,253,246, 27, 18, 18, 18, 64, 16, 4,156,156,156,234,194, 47,140,198, 96,104, 20, 58, 20,229, -151,188,166, 94, 53,222,230,243,249, 80, 43, 41,179,218,232,201,147, 39,184,119,239,158, 62,181, 12,135,195,209, 77,153, 50, 5, - 44,203,178,153,153,153,176,177,177, 97,167, 77,155, 70,115,185, 92, 93, 94,158,121,241,193,117,164,170,142,100,113,249,188, 6, - 4,141, 97, 24,121, 98, 98,226,199, 0, 18,107,149, 44,192,146, 71,203,130,255,219, 56,131,215, 23,150, 54,169,104,189, 0, 48, -232,192,129, 3, 19, 79,156, 56,177,113,203,150, 45, 46,145,145,145, 40, 43, 43,131,183,183, 55, 60, 60, 60, 16, 23, 23,135,179, -103,207, 22,211, 52, 61, 31, 64, 83,210,207, 32, 24,201, 89,147,247, 92, 26,171,174,170,250,180,107, 68, 0,174, 28,254, 61,218, -221,221,125, 6,135,195,249,124,218,226,119,223,239, 55,178, 59,210, 18, 50,113,251,183,199, 40,204, 41, 54,105,179,113, 48,188, -189,189,253,135, 86, 86, 86, 2, 0, 84, 19,163,226,198,179, 14,245, 54,105,154,166, 53, 26, 13, 14, 29, 58,100, 22,217, 58,112, -224, 0, 84, 42, 21,232,215,253,171,122,155, 44,195, 18, 92,158, 16,158,173,252, 65, 81,213, 96,152, 55,158, 80,169,183, 89, 55, - 2,125, 46, 16,192,181,184, 24,119,238,220, 49,143,114, 15, 31,110,170,141, 84, 26,149,124,210,119,107, 22,196,205,140,250,214, -126, 64,207,206,248,106,195, 30, 80,212, 46,144, 28, 18, 98, 33, 31, 93, 67,123,129, 3, 53,126,140,249,162, 92, 81, 89, 54, 9, -175, 47,197,211,192, 38,107,204,195,194, 2, 52,195,224,210,245,187,102,159,187,190,183,167,105,112,185, 92, 60,123,246, 76,217, -212,108, 67, 14,167,198,205, 89, 55, 82, 55,102,147,101, 24,130,199, 23,161,149,119, 71,104,212, 85,127, 73, 27,185,186,186,126, -113,252,248,113,167,186, 84, 9,137,137,137, 32, 8, 34,245,149,226, 88,179, 95,169, 84, 34, 41, 41, 9,137,137,137, 64,205, 12, - 55,179,239,163, 58, 37, 75, 38,147, 17, 82,169, 20, 86, 86, 86,100, 98, 98,162, 58, 56, 56,248,190,137,251, 91,111, 83,165, 82, -101, 25,138,159, 84,169, 84, 45, 68, 34, 17,175, 81, 39,234,217,174, 93,187,180, 38, 92,136,175,149,179,162,162,226,206,194,133, - 11,187, 14, 27, 54, 12, 95,124,241, 69,169,131,131,131,205,143, 63,254,200,229,112, 56,196,204,153, 51,233,162,162,162,170,159, -126,250,201,238,196,137, 19, 40, 47, 47,191,105,198,185,203, 85, 42,213,199, 61,123,246,220,115,254,252,121, 43, 63, 63, 63, 84, - 86, 86,130,101, 89,236,222,189, 27, 51,103,206,132, 72, 36, 66, 90, 90, 26,222,121,231, 29,133, 66,161,248, 24,175,199, 78,214, -217, 36, 8,130, 96, 25,134,193,178,101,203,244,201, 73,235,146,149,218,136, 9,236,156,215, 86, 50,231,167, 10,201,196,175,126, -154, 2, 0,180, 78, 71, 63, 77,186,243,124,247, 15, 95, 93,229,243,249,215, 77,180,209,146, 57,115,230,252, 56,124,248,112,177, -181,181, 53, 74, 75, 75,113,227,198, 13,220,186,117, 11,183,111,223,134, 70,163,129,147,147, 19, 28, 28, 28, 32,149, 74,241,228, -201, 19, 37,128, 37,198,108, 10,172,120,240,105, 95, 55,243,183, 70,193,226,213,155,109, 88, 95,221,226,243,120,102,221, 71,125, -251,246, 69,143, 30, 61,234, 8, 16,157,157,157, 45, 85,171,213, 68, 61,210,159, 87, 71,200,189,188,188,116,251,246,237, 99,141, -217,188,189,115, 43,206,175, 90, 2, 1,159,143,249,169,185,122,210,181,103, 64, 23,240, 4,124, 4,140, 24, 83,255,183,219, 80, -227, 46, 68, 35,146,101,172,239,248,211,247,166,197,230,127,173,205,255,203,144,226, 13,150,224,169,195,126,149, 74,117,238,163, -143, 62,138, 9, 9, 9,249,104,211,166, 77, 4,159,207,199,138, 21, 43,216,252,252,252, 95,107, 71, 33,101,111, 82, 42,150,101, -127,189,118,236,230, 39, 83,163, 70, 18,243, 54, 79,235,125,255,114,210,147, 78, 61,253,208,169,167, 31,238, 95, 73,193, 15,139, - 15,236,163,181,244,178,130,130,130, 28, 19,166,212,131,122,117,104, 28, 12,239, 20,127,245,178, 83,115,103, 29, 50, 12, 19,123, -224,192,129,217,163, 71,143, 38,239,222,189,251, 90, 76, 86,221,178, 59, 12,195,224,226,197,139,160, 40, 10,191,254,250, 43,195, - 48,140,225, 60, 90, 96, 79,126,183, 57,102,234,175,123, 79, 10, 4,124, 2,183,174, 31, 69, 69,153,241, 89, 93,124, 62, 15,191, -236, 62, 70,241,249,188,167, 77,237,167, 40, 42,247,242,229,203,110, 67,105,154, 71,146,100, 83, 4,170, 73,196,198,198,106, 25, -134,201, 54,113,216,205,194,151, 57, 35, 86,127,241,193,129,225,239,125,228,214,179,103,111,158,179,171, 27, 8,130, 64, 81, 97, - 17,210,146,238,106,207, 29,253,185,176, 90, 97,222, 18, 60, 31,172,191,166,143,201, 2,128,200,153, 91,244,241, 89, 0, 48, 98, -218, 66,244, 15, 11, 4, 97,142,244,244,138,100, 49, 58,157, 14, 18,137, 4, 58,157,174,201, 20, 15,118,118,118, 98,149, 74,165, -172, 77,196,104, 84, 42, 98,129,191,188,141,104,154, 14, 40, 43, 43, 67,117,117, 53,110,221,186,197,174, 89,179, 70, 38,147,201, -244, 65,155, 90,173, 54,160,180,180, 20, 85, 85, 85,184,121,243, 38, 27, 19, 19, 35, 43, 41, 41, 89,220,156,123, 72, 44, 22,119, -227,114,185,247,203,202,202, 24, 43, 43, 43, 82,171,213,106,131,131,131,133, 98,177,216,236, 5,213,165, 82,233, 48, 67,251,124, -124,124,210,211,211,211,219,209, 52, 93,127, 13, 68,190, 74,165,242,235,217,179,167, 57,207,143, 57,187,118,237,194,177, 99,199, - 66, 43, 43, 43, 39,103,103,103,239, 1, 16,202,229,114,241,240,225,195, 84,149, 74, 53, 97,244,232,209,187,203,202,202,238,160, -102, 9, 30,115,112, 62, 45, 45,109, 82, 64, 64,192,174,175,191,254,218, 58, 34, 34,130,235,233,233,137,238,221,187, 35, 45, 45, - 13,103,206,156,209,110,219,182,173, 90,161, 80,124, 0,224,162,241,102, 7,161,211,233, 32, 16, 8,244, 47,161, 80, 8, 62,159, - 15,185,146,197,244, 13, 25, 74, 29,196,202,141, 43, 62, 62,195, 2, 68, 65,110, 70,113, 81, 65,238, 29,130, 32,174, 75,165,210, - 10, 3,117, 38, 80,169, 84,157, 89,150,229, 16, 4,177,153,162,168,105,179,102,205,242, 88,187,118, 45, 58,116,232,128,226,226, - 98, 72, 36, 18,248,249,249, 65, 38,147,225,238,221,187,180, 66,161,216, 14, 96, 37,106,227, 71, 12,161,188,184, 18, 45,221,189, - 26, 40,159, 44,203,130,165, 1,173,154, 6, 77,177,208, 16, 90,240,120, 90,240,249,124,115,148, 39,150, 97, 24,148,121,120,128, - 73, 74,194,237,219,183,193,178,172, 65, 85,205,223,223,223,140, 7, 59, 3,129, 80,208,192, 93, 72, 16, 4,248, 2, 1,120, 2, -126, 83, 51,103, 44, 42,150, 5,255,211, 48,215, 55, 94, 14, 96,198,163, 71,143,246,244,235,215, 47,142,101, 89, 30,106,252,145, -191,255,153, 63, 47, 40, 40,120,112,243,204,131, 69,110, 45, 29, 98,222,154,220, 27, 29, 58,123,131,214,209,184,113,246, 33,126, - 93,123,226, 96, 94,110,222, 52,152,177,246, 25,195, 48, 87,123,117,235, 64,162, 94,174,110, 79, 79, 79,230, 77,102, 29, 86, 84, - 84, 44,159, 63,127, 62,190,248,226,139, 55,153,117,216, 36, 30, 63,145,205, 32,192,182, 28,241, 86,159,161, 32, 72, 86,163, 81, - 27,121,240, 65,159,185,148,207,231, 61,189,151, 40, 13,110,234, 56,153, 76, 54,244,253,247,223,191,200,229,114,219, 52,167,206, - 25,134,201, 46, 44, 44, 28,104,250, 72,221, 13,181,178,210,239,244,193, 29,115,207, 31,219, 53,148, 97,104, 95, 2, 0,135,203, -127,174,165,168, 11,106,101,229, 38,152,185,168,244,186, 25,225,152,243,221,111,216,250,197, 8,204,138, 57,140,159,151, 77,199, -162, 13, 7,240,237, 23,115,176,102,203,191,240,213,156, 73, 24, 59,241,125,134, 37,200, 63,204, 61, 15, 14,135,115,126,199,142, - 29, 83,167, 79,159,174,159,180,192,178,108,131, 7,187, 86,171, 85, 50, 12,131,237,219,183, 51, 0,206, 27,179,215,176,141, 8, -214, 88,188,148,185,109, 84, 89, 89,249, 65,120,120,248,110, 0, 66,150,101,159,149,149,149,253, 19,120,181, 52, 84, 85, 85,213, - 7, 61,123,246,220,205,178,172,144, 32,136,215,246,155,131,218, 84, 15,221, 28, 28, 28,238,215, 42, 89,194, 55, 9,136, 55, 86, -213, 70,220,138,230,184, 16, 25, 0,179,234,101,124, 95, 27, 26, 26, 90,127, 81,233,212,178,178,178,110,111, 80,174,139, 74,165, - 50,112,217,178,101,115, 69, 34, 81,127,133, 66,209, 30, 0, 36, 18, 73,154, 90,173,190,170, 84, 42, 55,193,116,110, 42, 13,195, - 48,105, 58,157, 46,200,197,197,165,102, 70,109, 45,217, 2,128, 83,247,233,251, 0,221,189, 70, 20,223,111,118,193,206,158, 61, -219,218,193,193, 97, 8, 65, 16, 99, 89,150,245,151,203,229,234,101,203,150,221,140,141,141,173,104,211,166,205, 91,195,135, 15, - 39, 28, 29, 29,113,239,222, 61,182,164,164,228, 40,128,197, 48, 99,166, 53,195, 48,217,235,214,173, 67,115,239,119, 99,251, 41, -138, 42, 56,123,246,172,243,176,162, 34, 46,195, 48, 24, 49, 98, 68, 3, 2,215, 24, 79,159, 62,133, 90,173, 54,154,204, 81, 93, - 81,134, 1,115, 23, 2,181,179, 63,235, 80,163,100,177, 96, 53, 22, 94,101,193,223, 11,255,238, 5, 61,205,146, 22, 61, 60, 60, -198,139, 36,194,207,188,219,123, 4,231,103, 20,165,200, 43, 20,251,164, 82,233, 14, 3, 15,114,179,108, 54, 51, 97,169, 69,254, -253, 55,217,124,149, 71,139, 6,203,210, 96, 25, 22, 44,203,128, 97,232,154, 5,175, 89, 6, 44, 77, 19, 4,129, 63, 52, 74,163, -153,193, 27,151,211,193,217,217,121, 37,203,178,195, 56, 28, 14, 89, 95, 12,171,255,185, 86,201, 58, 47,147,201,190,106, 66,121, -253, 63, 87,159,177,177,177, 77,146,127,115,103, 29,142, 27, 55,142,110,230,189,121, 85, 34,145,120, 52,181,175,186,186, 58, 71, - 42,149, 14,249, 47,169,207,250, 51, 6,155, 99,179,217,179, 14, 77,217,244,246,246, 22, 82, 20,213, 5,128, 31, 65, 16,246, 0, - 74, 41,138,186, 80, 92, 92, 92, 8,160, 27,128,101,181,191, 89, 5,224,254,127,248,126, 23, 59, 59, 59,239, 34, 73,178,165, 57, - 63,214,233,116,154,210,210,210,169,141, 6, 4,122,155, 78, 78, 78,247,185, 92,110, 75, 51,236,188, 44, 41, 41,233,102,121,126, - 90,108,254, 15,161,113, 16,188,193, 76,241,255, 14,162,101,177,105,177,105,177,105,177,105,177,105,177,105,177,105,177,249,191, - 78,180,154,220,182, 76,171,181,192, 2, 11, 44,176,192, 2, 11, 44,248,115, 56,211,136,108,157,169,251, 64, 24, 97,165,205,145, - 4,223,132,217, 94,178,216,180,216,180,216,180,216,180,216,180,216,180,216,252,219,217,180,224, 47,132, 69, 86,181,216,180,216, -180,216,180,216,180,216,180,216,180,216,252, 95,135, 65,215, 33,105,169, 27, 11, 44,176,192, 2, 11, 44,176,192,130,127, 15,204, - 38, 90, 18, 55,255, 0,103,239,224,221, 14, 45, 59, 37, 58,180,236,148,232,236, 29,188, 91,226,230, 31,240, 55,173, 55, 49,128, -137, 92, 46,247,162,187,187,123, 37, 12, 44,189,243, 63, 0, 91, 0, 99, 81,147,223,103, 20, 0,171,191,210,120, 4,192, 29, 15, -124, 54, 5,200,153, 2,228,140, 7, 62,139,248, 31,140, 27, 92, 49,219, 35,252,250,185,137,231, 86,204,246, 8,111,114,255,124, - 15,167,219,191,141,251,110,237,103,158,142,127,209, 95,218,184,186,186,238,116,115,115,203,114,117,117,205,118,117,117,221, 5, -192,206,242,184,179,192, 2, 11, 44,248,183,161, 46, 70,171,238,165,143,209,226, 2, 64, 92, 92, 92, 4,128,107, 0,250, 69, 70, - 70,198, 55,254,181,131, 87,208,116,223,182,190, 95,172, 94,177,152,112,119,117,182,210,209, 12,149,153,149,219,113,249,234,152, - 35,249, 2,238,198,178,156,164,159,223,160, 80, 4,135,195, 25, 47, 20, 10, 35, 1,212, 17,182, 84,181, 90, 29, 71,211,244, 33, -152, 55, 77, 27,110,110,110,215, 57, 28, 78,235,230,252, 49, 77,211, 57,133,133,133,189,223,176, 50,199,121,121,121,237,138,136, -136,176, 10, 13, 13,133, 64, 32,192,178,101,203,230, 75,165,210, 77,230, 26,112,112,240,177,161,132,162,207,185, 2,193, 96, 86, -171, 9, 98,193, 2,164, 48,137,209,169, 47,243,213,234,141,101,101, 25,114, 51, 77, 45, 6, 48,173,182,174,126, 6,176,238,207, - 92, 37, 83, 59, 67,171,165,107,174, 9, 62, 23,244,201, 23,118,215,150, 44, 89,194,141,140,140,196,207, 63,255,220,123,231,206, -157, 31,203,229,242,203, 0, 78, 1,120,254,103,175, 74, 55, 96, 70,207,222,189,191,155, 58,127, 62, 71,121,253, 58,190,219,181, -107, 51,106,242, 45,109,109,238,181,196,231, 99,172,179, 51, 47,146,101,209,133, 0, 8, 2,120, 40, 43, 97,206, 82, 20,125, 8, -102,228, 98, 51,130,137,104, 56, 29,127,127,115, 13, 84, 60,103,151, 10, 71, 4,244,169,120,126,117, 41,128,183, 26,239,215,169, - 68, 83, 89, 78,171, 72, 37,155,144, 11, 96,195,159,172, 86, 43, 23, 23,151,196,147, 39, 79,182, 12, 13, 13,229, 2,192,253,251, -247,167, 68, 70, 70, 14,144,201,100, 65, 0, 42,255, 67, 15, 33, 17,151, 36, 63, 19,240,120,131,105,154,238, 4, 0, 28, 14,231, -177, 70,171,189,168, 99,152,173, 48, 51, 39,155, 5, 22, 88,240,191, 11, 83, 92,228,191, 28, 6, 51,195,215,157, 28, 91,255,189, - 62, 36,174, 29, 58,134, 13, 28,243,180, 66,174, 80,101,101,229,149,205,251,108,205,197,143,231,172, 63,177,225,167,184,179,241, -119, 82,111, 7,132, 14, 73,145,184,118,232,104,192,180, 33, 31,174,151, 88, 44,126,176,109,219, 54, 42, 45, 45,141, 45, 47, 47, -103,159, 62,125,202, 30, 61,122,148,253,228,147, 79, 84, 98,177,248, 1, 0, 47,115,108,186,185,185, 21, 62,189,242, 27,251, 50, - 49,129,205,190,127,135,213,106,181, 44, 69, 81, 44, 69, 81,108,202,249, 56, 54,241,212, 49,246,225,209, 67,172, 70,163, 97, 53, - 26, 13,171, 86,171,217,182,109,219,230,155, 89,206,198,240, 12, 12, 12,212,196,197,197,177, 71,142, 28, 97,231,207,159,207,134, -132,132,208, 0,102,154,123,238, 18, 87,191,254, 54, 45,130,101,211,163,182, 82,103,110, 94, 96,147, 95, 60,100,147, 95,164,179, -177,151, 82,217,105, 11,182, 80, 54, 45, 66,100, 18, 87,191,254,166,206,221,193,193, 33,140, 32, 8,182, 14, 0,216,214,173, 91, - 87,213,127,121,121,121, 53,120,181,106,213,170,170, 77,155, 54,207,157,156,156,186, 52,101,115, 66, 39,176,108,202,126,150, 77, -217,207, 46,233, 11, 54, 57, 57,249, 54,203,178,215,234, 94, 74,165,242,218,241,227,199,175,189,251,238,187,215, 0,188, 99,164, -158,204,170,207, 41, 64,142,252,228, 73,150,221,180,137,101, 35, 34,216, 84,128,157, 2,228, 52,211,102, 91,119,119,222,195,245, -235, 62,214,156, 60,249, 43,123,238,220, 25,246,236,217, 56,246,196,241, 93,236,230, 77,159, 81,110,110,188, 36, 0,237,154, 97, -147, 11, 96, 13,128,141,168, 81, 46,211,100, 50, 25, 91, 80, 80,192, 2, 72,171,253,110,163,139,139,203, 6, 52,173,190, 13,170, -175,100,205, 29,230,126,238,189,183,122,179,242,138,124,246,189,183,122,179,115,135,185, 55, 80,182,134,249,248,216,204, 26,209, - 73,150,124,127, 31, 61,107, 68, 39,217, 48, 31, 31,155, 55,172, 79, 2, 53,235,132,110,187,114,229,138,142,173, 7,173, 86,203, -238,217,179,135,118,112,112,248,181, 25, 54,219,187,184,184,100, 59, 58, 58,166,213,255,210, 37,120, 84, 79,255, 62, 83,150, 59, -117,124, 55,162, 25,229, 12, 21,241,249, 47, 47, 30,254,145, 46,201,121,204,106,148,133,108,197,179, 4,246,101,234,109,118,207, -142,141, 90, 1,151,251, 18, 64,232,159,185,150,154, 9,139, 77,139, 77,139,205,255, 66,155,198,184,200,255,101,112, 27,159, 96, - 99, 8,133,130,168,229, 75, 22, 18,229, 37,229, 74, 85,165, 92,163, 85,169, 84, 36,159, 85, 61, 78,121, 81, 68,114, 57,229,115, -231,204,182,137, 90,180, 36,170, 26,152,100,230,127,122,133,132,132,220, 61,118,236,152,171,163,163, 35, 42, 42, 42, 80, 82, 82, -130,187,119,239,130,101, 89,140, 30, 61, 90,216,163,123,247, 46, 75,151, 45,187,245, 50, 47, 47, 28,134, 59,222, 87,228,197,209, - 25,235,122,215,172, 69,251, 85, 86, 73, 77,175, 67, 16,216, 57, 46, 82,127,204,202,151, 53,171,101,136, 68, 34,253,130,196,111, -128,240,129, 3, 7,242, 1,224,195, 15, 63,172,148,203,229,209,181, 10,135, 89, 43,173, 74, 92,253,250, 59,123,120,198,253,184, -125,157,184,147,175, 31, 40,173, 14,217, 5,249,224,242,236,209,178, 37, 31,239, 79, 26,204,235,219,211,209,121,205,170,157,103, - 10, 24,140, 82, 20,167, 95, 48,100,203,222,222,126,207,161, 67,135,112,248,240, 97, 0, 64, 90, 90, 26,252,252,252, 36,166,202, -144,148,148,228,243,206, 59,239, 28, 44, 41, 41,105,103,234,216,198,137,241,133, 66, 33,122,247,238,141,142, 29, 59,226,228,201, -147,253,106,149,173, 63, 5,229,245,235,176,126,244, 8,136,127,163,193, 75,219,174, 93,189,111,159, 61,179,207,249,204,217, 84, -108,216,176, 11,207,159,215, 8,109, 62, 62, 62,152, 56, 97, 28,239,241,227,155,129, 99,199, 78,188,249,251,239,207,123,215, 18, - 37, 83,248,250,167,159,126, 90,220,166, 77, 27,140, 29, 59,118, 92, 96, 96,160,187,173,173, 45,118,236,216, 1, 15, 15, 15, 31, -141, 70,243,236,228,201,147,158, 5, 5, 5,152, 61,123, 54, 10, 11, 11,231, 27, 50,212,111,104,191,165,194, 17, 1,125, 58,116, -157, 10,107, 91, 15,252,116,224, 16,158, 62,216,211, 71, 77,165, 46,229,211,241,147,149,172,112,154, 44,199, 58,170,117,183, 8, -167,118,129,239,192,187,107,130,179,138,254,253,197,210,193,109, 99,184, 34,213,158, 21, 27,164, 37,175, 25, 29, 27,203, 9,170, -124,226,152,116, 17, 37,192, 10,166,142, 96,233,213, 90, 22,239,244,237,219, 87,223,112, 89, 89, 89, 80,171,213, 8, 8, 8, 32, - 53, 26, 77,127, 51,235,181,253,144, 33, 67,254, 56,123,246,172, 83,251,246,237,101,165,165,165,250, 29,238, 78,246, 67,227,143, -109,158,189,230,187,127,249,239,101,137,114, 89,234,137,199, 38,108,133,246, 10,235,122,233,220,177,125,214, 68, 85, 46, 4,246, -197, 0, 83,130,140,131,191,128,176,114,196,248, 79,230,113,251, 15, 28,208, 98,240, 91, 99, 46, 61, 77,127, 62, 16,192, 61,203, -184,222, 2, 11,254,214,170, 22,251,191,118, 78,122,162, 21, 25, 25, 73, 52,117,130, 12,203, 4,187,185, 58,137, 55,175,223,125, -143, 67,105, 52, 18,123, 59, 13,207,206,150, 33,108,236, 56,148, 70, 91,229,237,227, 45, 96, 88, 38,216,128,253,198, 83, 60, 9, -177, 88,124,236,212,169, 83,174, 60, 30, 15, 12,195,192,197,197, 5,153,153,153, 40, 47, 47,135, 92, 46,199,243,212, 84,180,241, -106,133, 21, 81, 11, 61,102, 47,140, 58,166, 80, 40,186,161,161, 27,241,181,105,163,180,182,225,186,209,117, 75,176,188, 54,228, -175,253,174,137,125,230, 78, 69,205,204,201,201,129,181,181, 53,130,130,130,172,111,220,184,241,187, 17,146,213,192,166,131,131, -143, 13, 35, 20, 28,222,246,227, 50, 49,165, 77, 66, 74, 70, 41, 58,180,233, 3, 55, 39, 47,228,151,106,112,251,238, 41, 36, 37, -238,135,111, 11, 47,204,252,100,128, 40,102,221,145, 67,124, 93, 27,175,242,242,204,202,166,108, 86, 86, 86, 90,183,109,219, 22, - 94, 94, 53,235,158,209, 52,141,148,148, 20,208, 52,173,223,174,255,190,251,232, 21,232, 42,179, 49,117,202, 20,148,148,148, 88, - 55,101,147,199,129,110,222,199, 19,185, 98, 30, 32,144, 56,106,170,170,170,244,203,112, 80, 20,133,135, 15, 31, 34, 60, 60, 60, - 34, 54, 54,214, 20, 43, 50,171, 62, 41,224,219,239,126,253,117,203,164,138, 10, 18, 0,126, 38, 8,134, 98,217,111,205,189,150, - 92, 93,121, 71,207,159,219,235,204, 33,159,192,209,238, 27,220,189,155, 13,138,170, 41,111, 73, 73, 17,102,125, 86, 9, 62,207, - 6, 39, 79,254,203, 41, 32,160,247,209,130, 2, 42, 8, 13,221,136, 77,149, 83,116,238,220, 57,204,154, 53, 11, 41, 41, 41,158, - 28, 14, 7,119,238,220,129, 88, 44,198,250,245,235, 57, 1, 1, 1,158, 18,137, 4,231,207,159, 71, 97, 97, 33, 97,172,156,215, - 46, 92, 91, 93,241,252,234,210, 2,226,252,176,159, 14, 28,194, 71, 19,198,195,157,205,248,221,206,151, 88, 61,100, 68,175,175, - 88, 78,171, 72,137, 77,176,131, 95,208, 8,240, 5,214,152,249,229, 74,164, 37,157,118, 80,200, 19, 63, 35,232,220, 86, 43, 54, -196,206,121,173,156, 71,198,209, 31,238,191,209,245,162,215, 61,239, 71, 15, 63,190, 35, 77,216,153,248,138,104,249,112, 9,146, -182, 3,106,150, 79,121,246,236, 25,158, 63,127, 14, 46,151, 11,165, 82, 9,157, 78,215,100, 57, 61, 61, 61,103,232,116,186,175, -106,219,121,183, 72, 36,250, 96,223,190,125, 78,245,137,182, 75,240,168,158, 78, 54,146,129,133, 69, 37,101, 55,239, 37, 63,157, - 55, 99,108,191,235,183,147,114, 41,222,187, 57, 21,137, 39, 43, 12,212,167, 72, 44, 16, 28, 61,127,252, 95,214,218, 23, 87, 32, - 9,232, 7,158,181, 31,104,109, 30, 20,101,213,144, 63,151, 66,253,227, 15,232,252,217, 92,156, 62,113,196, 58,176, 83,183, 88, -181, 86,235, 7, 64,243, 6,247,102,115, 96,177,105,177,105,177,249,223,105,211, 32, 23, 97, 89,182, 43, 0,183,218,205,146, 90, - 94,224, 12,160, 24, 53,171,200,184,213, 62, 59, 4,245,126,214,120,187,254,177,141,183,235,127, 46,169,253,236, 90,251,126,143, - 32,136, 82, 19, 69,247, 64,205,210,132,103,106,223,129, 90, 87,162,201,192, 99,130, 32, 43,105,154, 17,242, 93, 92, 85, 31,190, - 55,176,211,111,151,238, 63,180,114,182,229, 14,237,215, 37,226,238,227, 23,183, 8,146,208, 18, 4,105, 86,220, 7,135,195, 25, -191,121,243,230, 78,182,182,182, 96, 24, 6,118,118,118,144,201,100,208,104, 52,168,168,168,128, 90, 94, 9, 74, 94,137, 71,185, - 89,232, 21,209, 15, 99,134, 13, 9,248,215,137, 83,227,105,154, 62,104,204,174,103,112, 23,189,146,181,178,181,211, 43,105, 34, -183, 92, 79,186,190,233,226, 7,190,181, 53, 6,207,139,250, 51,215, 64,194,153, 51,103,206,141, 30, 61,250,173, 5, 11, 22,144, - 82,169,244,124,102,102,102, 47, 0, 41, 38, 73,133, 80,244,249,167,159, 71, 58, 56, 88,179,136,189,120, 10,125,187, 76,128,149, -128,131,146, 74, 10, 4, 1,164, 38, 31, 3, 65, 56, 34, 49, 77,138, 62,157,109, 49,100,104,128,245,137, 35,169, 11,240, 42, 62, -232,181,166, 41, 43, 43, 67, 81, 81, 17,180, 90, 45,180, 90, 45,198,142, 27,135,189,123,246,160,186,186, 26, 74,165, 18, 26,141, - 6, 52, 77,131, 36, 73, 92,140,139, 69,238,139, 84,244, 12, 15, 7, 12, 44,189,180,231, 33,120, 0,110, 63,125,250, 20,169,169, -169,120,249,242, 37, 68, 34, 17,220,221,221,177,114,229, 74,168,213, 53,107,148,141, 27, 55, 46, 2,192,227, 63,123, 67, 61, 7, -118,102,210,244,210,183,142, 31,119,189,113,252, 56,115,251,244,233,151, 66,185,124,135, 57,191,229,243, 49,118,221,183,159,116, -144, 72, 36,120,153,179, 25,254,254,124,204,159,235,132,232,111,138, 1, 0,179,103,181, 68,247,110,206,168, 44, 63, 2,103,215, -197,216,178,101,142,239,180,105, 27,167, 40, 20,244,110, 19,166,151,158, 58,117,106,140,159,159, 95,139,132,132, 4, 66, 32, 16, - 64, 44, 22, 67, 44, 22, 67, 36, 18,161,168,168, 8,153,153,153,236,186,117,235,242, 0, 44, 53,102,104,197, 22,233, 45, 0,111, -205, 29,134,115, 79, 31,236,233,211,130,243,226,209,152,153,189,179, 18,111, 39,200,127,187,120, 99,149, 78, 37,202, 45,127,121, -105, 97,219,238, 9,206,159,125,241, 53,126, 88,183, 28, 79,239, 92, 47,117,243,170,220, 42, 38,212, 77,150, 51, 34, 98, 5,215, -195,205, 81, 55, 99,218, 24,251,211,110, 55,103,156,229, 18,178,130,226, 7,235,145,153,160, 20,182,235, 50,185,189, 15,169,185, -114,229,138,184,111,223,190, 80,169, 84,122,101,114,223,190,125,140, 78,167,187,218,228,181, 73, 81, 95,229,229,229,121, 40,149, - 74, 12, 27, 54,108,246,250,245,235, 37,117,107,212,209, 52,221, 64,201, 90,189,105,239,133,207,191,218,122,245,194,193,111, 60, - 87, 71,125,208,111,210,204, 53, 87, 97, 96, 29, 73, 46, 73,126,118,250,248, 46,119,145,131, 22, 98,199, 33, 80, 21, 42,241,116, -231, 71, 80, 84,170,208,125,245,215, 0, 4,208,104, 73,236, 24, 49, 22, 60, 39, 79, 44,159,254,129,231,146, 29, 63,125,194, 48, -204,102,203,184,222, 2, 11, 44,104, 4, 55,130, 32,226, 0, 32, 42, 42,106,113,116,116,116, 50, 65, 16,113, 44,203, 70,214, 10, - 40,113, 44,203, 70,214, 29, 83, 75,206, 94,219,174, 59,182,241,118,227,207,139, 22, 45, 10,140,137,137, 89, 27, 30, 30,126,240, -230,205,155, 47, 0,152, 34, 90,195,107,137,213,107, 75,239,144,117, 12,178,254,123, 3, 69,139, 97,174, 63,123,145,165, 24, 50, -168, 71,203,184,248,199,247,222,127,127,248,192,241, 35,250, 14,205,204, 41, 73,245,245,118,119, 78, 78,126,108,203, 48,204,117, -115,106, 73, 40, 20, 70, 14, 24, 48,128, 91, 86, 86, 6, 43, 43, 43,200,100, 50,228,229,229,129,162, 40,168, 42,202,161,174, 40, -135,170,188, 12, 84, 69, 25,158,223,191,139, 96, 95, 31, 97,109,176,188, 81,212,169, 46,141,149,170,250,202,150,192,198, 6, 66, - 27, 27, 16,205,119, 27,190,107,111,111,127,187,174, 83,165, 40,234,179,133, 11, 23, 22, 51, 12,131, 53,107,214,216, 90, 91, 91, -199, 2, 16,154, 50, 98,227,194,137, 12,239, 28, 68, 62,201, 76, 68,239,144,169,104,223,246,109,100, 22, 42, 81, 44,167, 80, 84, - 78,161,123,223,239,209, 58,228,107,180,234, 28,141,212,236, 82,120,182,240, 35,193, 21, 26, 93,252, 57, 55, 55,183,193,246,193, - 3, 7,160, 80, 40,224,235,235,139, 9, 19, 38, 96,225,194,133,152, 48, 97, 2, 60, 61, 61, 49,233,189,119,176,124,249,114, 20, - 20, 20,152, 42,170,186,125,251,246,106,111,111,111,181,183,183,183,154,162, 40, 84, 85, 85,161,188,188,188,113,125,207,105,110, - 69,186,186,186, 46,114,119,119, 79,116,117,117, 77, 22, 10,133,103, 31, 18,196, 19,149,183,183, 91,175,145, 35,137,142,239,189, -199,201, 22,139,137,120,192,218, 28, 91,206,142,188,225,253, 7,188, 37, 40, 47,219,165, 23,169, 62,120,223, 5,127,196, 7,226, -198,239,221, 48,235, 51, 95, 16,164, 8, 4, 41,128,162,250, 10,122,132,134,243,237,237, 9, 83,215,210, 68, 0, 15,123,245,234, -229, 57,115,230, 76, 66, 40, 20, 98,246,236,217,212,244,233,211,211, 39, 76,152,144,126,249,242,101,218,219,219, 27,173, 90,181, - 34, 90,181,106,229, 1,224, 97,237,111,140,194,214,151, 88,173,166, 82,127,183,247,147,188,160,225,220,179, 74, 43, 28,187, 98, -131,180,100,245,182, 23, 27, 50,159, 42,124,158,222,185, 94,146,158,116,154,201,188,119,173, 56, 63, 93,238,179,122,219,139, 13, -139,183,230, 55,121, 83,199,199,131, 57, 22, 23, 79, 41,170, 21,220,145, 35,250, 43,102,124, 56,190,189,163,117,224, 62,180, 24, - 18,210,218,171,229,164,229,107,183, 80,211, 63,249,156,250,249,151, 93,172, 92, 46, 71,101,101, 37,182,108,217,162, 59,125,250, -116, 30, 77,211,159, 27, 26, 3, 1,128, 86,171,197,140, 25, 51, 36,182,182,182,200,205,205,213, 43,162, 0, 32,149,149, 60,190, -113, 47,233,201,188,127,142,139,168, 86,171,213, 23,174,221, 79,237,232,231,221,146, 32, 88,131, 19, 81, 4, 60,222,224,110, 61, -122,112, 88,182, 28, 4,215, 11,207,247,172, 67,101, 65, 41, 42,139, 74,193,225, 73,160,131, 16, 90, 70, 0,251,224, 80,164,221, - 75, 64, 11, 23, 55,174,144,199, 27,106,233, 79, 44,176,224,239, 9, 99, 92,164, 62, 89,138,137,137, 89,107,108,127,189,119, 77, -163,109, 61,145,106, 76,194,234,127, 6,128,152,152,152,181, 44,203, 70,222,188,121,243, 0, 0,165,153,167,240,113,189,119,243, -243,104,113, 84,154,232, 5, 11,151,194,193, 78,108, 23,218,197,207,253,228,249,248,251,215,111,222, 79,109,221,202,217,133,213, -106, 28,190,221,248, 67, 75, 66,161,140, 49,179, 16, 1,206,206,206,160, 40, 10,207,158, 61,195,203,151, 47, 65, 81, 20,116,213, -213, 80,151,151, 67, 85, 86, 6,186, 90, 14, 62, 77, 67, 41, 43,130,147,149, 8,120, 53, 35,209,132,242, 70, 52, 73,180,234,222, - 69,182,182, 16,218,216,130,228,241,154,116, 43, 26, 64,215,208,208,208,195, 73, 73, 73, 61, 6, 13, 26,180, 10, 53, 83,228,179, -243,242,242, 6, 46, 91,182, 76,237,230,230,134, 25, 51,102,116, 0, 48,213, 36,201, 20,104, 2,188,221, 59,160,189,207, 84,180, -110, 53, 0,229,213, 90,200, 42,181, 40, 42,167,176,227,251,112, 28,253, 57, 20,127, 28,237,131,164, 11,131, 81,174,117,135,181, -231,187, 96,105, 77,160, 49,155, 23, 47, 94,196,202,149, 43,177,106,213, 42,172, 89,179, 6,171, 86,173, 66, 94, 94, 30,130,130, -130,144,147,147,131,115,231,206, 65, 42,149,194,217,217, 25,119,239,222,197,166, 77,155,240,199, 31,127,152, 60,233, 58,226,106, -198, 49,205,242,165,235,116,186,105,210,145, 35, 59, 21, 58, 58,118,236,210,165,203, 91,179,103,207,246,233,213,171,151,126,191, -143,143,143,151, 88, 44, 46, 64,205, 12,202,206,198,108, 49, 64, 23, 23,151, 32,104,212, 79,106,219,152, 7,130, 16, 97,192,224, - 84,244,234,115, 31,148,150, 15,146, 16,130, 36, 69,208,233, 74,224,224,224, 9,150, 37,130, 76, 20,113,153, 76, 38,243,187,116, -233, 18,153,153,153, 9,145, 72, 4, 0, 89, 43, 86,172,248, 97,195,134, 13, 41, 78, 78, 78,116, 92, 92, 28, 78,156, 56,129,200, -200, 72,206,244,233,211,253, 90,181,106,181,221,212,121,175,216, 34,189,181,127,227,185,127,240,180, 14,157, 69,226,214,109, 80, -109,253,238,167, 17,206, 18, 0, 56,159,145, 33,119,245,170,140,169,150, 39,230,216,183,172,250,230,124,134,169, 25,167, 43,152, - 7,233, 79,110,239, 63,126,190,162,168,176,140,215,165, 83,160, 50,122,229, 23,252,214,109,218,125,187,124,225, 63,221,243, 42, - 69,229,131,103,159,123,114,236,252,221,170,201,239,127,164,251,240,227,153,170,115,231, 47, 30,103, 24,166, 19, 12,204, 56,100, - 24, 6, 82,169, 20,201,201,201,200,200,200,128, 76, 38, 67,113,113, 49,228,114,185,222,221,104, 37,175, 60,243,195,175,167, 31, - 73,196, 98,171, 30,157,252,188,238, 36,164, 20, 73,196, 98, 43,191, 54, 94,237,129, 21, 77, 62, 71,104,154,238, 36,178, 18, 3, - 32, 80,158,116, 29, 85,101, 85,168, 42,175,130,188,180, 10,106,138, 3,149,154,132, 82, 67,194, 59, 98, 8,170,170, 85,168, 42, -169, 0, 67,211, 33,150,238,198, 2, 11, 44, 48,210,215,199, 69, 69, 69, 45, 54,243, 88,179,221,155,141,137, 87, 84, 84,212, 98, -130, 32,226, 22, 45, 90, 20, 8,195, 19,170,234, 99,103, 19, 47, 0,102,164,119, 40, 41, 73,175,178, 33, 2, 70,207,253,242,171, -115, 7,126,249,222, 85,173, 86,228, 56, 57, 88,211,214, 86, 2,231, 15,103,172,129,188,170,108, 84,181,249,233, 8, 80, 86, 86, -134, 23, 47, 94, 64, 44, 22,131,207,227,129, 86, 42, 65, 43,171,161, 44, 43, 1, 73,169,193,167,105, 56, 90,137,225,237,233,142, -214,110,238,102,217,124,118,229, 55,125,224,123,125,119,225,186,208, 0, 8, 36,214, 16,216, 88,227,211,184,107, 0, 0, 62,159, - 15, 44, 91,101,150,104,210,162, 69,139, 83,251,247,239,231,203,100, 50, 60,124,248,240, 17,128, 10, 0, 54, 0,152,212,212,212, - 75, 73, 73, 73,145,126,126,126, 0,224,107,202, 88,101, 49, 73,107,117, 44,114, 11,178,144,249, 50, 1,142,118,109,193,179,106, -143,162,114, 10, 66,113, 91,104,213,175,188,143,170,202,108, 40, 41,142, 89,231,174,209,104,160,211,233,160,211,233,160,209,104, -240,241,199, 31,227,198,205,155, 56,120,226, 50, 94, 60, 79, 67,135, 54,238,152, 50,101, 50, 66, 67, 67,113,243,230, 77,163,182, -166,118,134,182,133, 53,184, 27,223, 34, 33,176,118, 82,135, 45,188,112,199, 20,217, 34, 8,130,133, 1, 87,100, 35,108, 8, 15, - 15,111,151, 86, 93,141,228, 39, 79, 48,104,197, 10, 0,192,217,179,103, 27,156,203,188,121,243, 4, 41, 41, 41, 31,222,191,127, -255,195,252,252,252,141, 0,154, 14, 54,103,129, 51,103,110,225,159,255, 76,129, 76, 38, 3, 0, 28, 58,240,138,151,102,190,160, - 48,108,120,141, 71,203,222,222, 30, 27, 55, 6,153, 85,159, 52, 77, 99,231,206,157,122,119, 33, 0,112,185,220, 94,243,230,205, - 27,221,212,241,237,218,181,227,155,178, 57,119,108, 11,209, 31,143,216,207,236,218,181, 14,180,117, 14, 70,137, 54, 33, 40, 33, - 79, 58,107,238,216, 22,155, 55, 29,201, 83,137, 9,245,110,130,206,109,197, 21,169,246,152, 83,198,140,243,223,107, 74,188,167, -237, 41,144, 85, 46,153,249,209, 68, 39, 91,123,215,234,159,127,136,118, 32, 57, 36,123,234, 62, 85, 30,232,227,100,255,110,216, -119, 85,255,156,187, 44, 65,163,203,157,137,220, 83,105, 48,146,226,130,166,105,228,231,231, 67, 38,147, 33, 39, 39, 7,197,197, - 53,238,215,226,226, 98, 48, 12,243,103, 30,136, 80,230,228, 32,251,248,207,104, 61,121, 50,186,175, 90, 9,154,225, 66,169,160, -177,177,231, 64,148, 85, 40,161,102, 8,120,118,237,137,143,206,254, 14,146,165,129, 29, 91, 45, 61,137, 5, 22,252, 77, 97, 78, -122,135, 58, 66, 20, 29, 29, 29,249, 87,255,127,125,178, 21, 29, 29,157, 28, 29, 29,221,156,255,106,236, 50,212,111,215,197,104, - 93,171, 23,128,246, 90,167, 41, 47, 78,205, 72, 73,225,230, 87, 43,171,173,220, 92, 93,212, 86, 34, 33, 83, 81, 41,231, 36, 60, -126, 68, 85, 23, 60,127,218,140,243, 72, 77, 74, 74, 10,202,207,207, 71, 78,118, 54,116,202,106,144,106, 13, 88,149, 2,131,122, -247,132, 8,128,136, 36,192,103, 40,112, 57, 2,200,171, 42, 1, 32,213,100,231,168,213,190,166,108, 17, 4, 1,129,141, 13, 4, - 18, 9, 4,214, 54, 13, 20, 46,115, 20, 27,161, 80,184, 63, 54, 54,214,163, 69,139, 22, 88,185,114, 37, 90,182,108,233,239,233, -233,169,176,179,179, 19,187,185,185,161, 99,199,142,232,217,179, 39,206,157, 59, 7,152,145, 83, 74,171, 19, 37, 62,205, 66,175, -226,210,155,248,253,218,143,208, 40,213,232, 18,241, 35, 40,219, 62, 66,105, 0, 0, 32, 0, 73, 68, 65, 84,110,107,184, 4,126, - 13,230,217, 62, 40, 10, 78,214,168, 7,238, 35,240, 50, 39, 11, 4, 71,144,108,174,242, 84,247,249,209,163, 71, 56,112, 50, 30, - 30,222, 1,200, 73,127,130, 39, 87, 47,225,134,139, 19,188, 3, 58,234,221, 64, 6,203, 72,131,187,122,107, 77,154,168,165,159, - 77, 20,150,150,150, 10, 29, 29, 29,213,117,117,231,225,225,241,103,200,214,196, 5, 11, 22,160,156,199, 3,134, 15, 7, 63, 35, - 3, 20, 69, 33, 44, 44, 12,221,187,119, 7, 0,132,133,133,129,203,229, 34, 56, 56, 24,158,158,158,216,186,117,235, 68, 67, 68, -139, 36,240, 80,167, 43,241,247,241,241,209, 19,173, 61,123,101, 72,184, 63, 24, 4, 4,216,242,195, 51,253,177, 94, 94, 94, 40, -144,102,128, 32,216, 36, 19,101, 92,229,238,238,190,204,195,195,195,103,195,134, 13, 28,145, 72,132, 79, 62,249,164,109, 85, 85, - 85,235, 90, 41, 25,139, 22, 45, 2, 0, 44, 95,190, 28, 43, 86,172,128, 90,173, 86, 24, 50,182,103, 99, 39,207,162, 82,230, 67, -182,202,106, 84,127,231,214,157, 6, 12, 29,132,182,126, 3, 48, 96,104, 14, 0,172,117,228,102,189,247,237, 18,251,227,246, 54, -196,174,223,206, 95, 92,222, 59, 98,192,146,133, 85, 87, 87,127,179,179,220,100,204, 99, 69,246,110,249, 83,193,248, 77,223,111, -223,187,233,171, 69,115, 68, 57, 50, 77, 89, 94, 25, 91,101, 45,228, 90,251,186, 17,214,179,190, 92,245, 34, 63, 63, 99, 62,114, -207,155,156,105,201, 48, 12, 50, 50, 50,244, 49,125, 42,149, 10,213,213,213,200,205,205,213, 95, 51, 74,137,237,176,153,239,143, - 8,169, 86, 42, 21,119, 30,167,231, 44,157, 61, 41,188, 90,169, 84,164,103,230,164, 1, 91,154,100, 99, 36, 73, 62, 86,200, 21, -131, 20,229, 42,200, 30, 62, 69,203,129,222,208,234, 8,104,116, 52,100, 37,114,168,117, 0, 77,242, 16,248,222, 20,208, 4, 23, -197,249,121, 32, 57,156, 71,104, 24,180,111,129, 5, 22,252,125, 96,148,139,212, 41, 90,225,225,225, 7,235,171, 78,117,159, 1, -168, 97, 60,148, 71, 86,159, 76,213,185, 19, 13,253, 79, 35,187,230,226,181, 24, 45,147,233, 29,234,254,179,149, 93,165,231,186, -229,147, 90, 50, 58, 93,135,162,226, 66, 29,151, 43,228,181,178, 83, 74, 75,115,204,255,119,181, 90, 29,119,233,210,165,145,131, - 7, 15, 22,166, 63,126, 4, 77, 69, 5, 52, 21,229,224, 49, 58, 56,138,187,129,164,212, 32, 52, 26,180,240,103,160,146,139, 17, -127, 35, 73,171, 86,171,227,204, 37, 90, 36,135,211, 48, 46,203,218, 26, 66, 27, 91, 8,173,173, 27,187, 22, 77,145, 2,171, 33, - 67,134, 12, 12, 11, 11, 3,203,178,216,185,115, 39, 40,138, 18, 80, 20, 5,141, 70, 3,138,162, 80, 89, 89,137,189,123,247, 98, -219,182,109, 55, 0,252,106,178, 51,211,105, 46, 93,184,120, 37,244,131, 73,145,188,179,113, 27,161,211,208, 80, 18, 45, 81, 93, -173, 69,149,198, 10,180,211,100,160,240, 12, 56, 92, 17,194,131,219,226,228,145, 99, 20,116,234,203,102,178,240, 6,170, 80,110, - 78, 22, 94, 62, 79,131,117,101, 1, 92,108,173,160,200, 72, 67,151, 41, 83,223, 72,157,104,213,170, 21, 24,134, 65,255,254,253, -245,193,213,111, 74,182, 74, 74, 74,112,250,244,105,132,133,133, 33, 34, 34, 2,121,121,121,200,200,200,192,219,111,191,173, 63, -230,209,163, 71, 72, 72, 72,128,175,175,113,145,176,184, 84,123,246,101,238,195,113,239,190,251, 46,255,246,237,219, 96, 89, 22, -126,126,182,176,181,145,128, 32,133, 8, 8,112, 5, 80, 51, 6,232,215,175, 31, 42, 43, 51,116,101,101,236, 89, 19,167,187, 31, -192, 9,141, 70,243,172,111,223,190,158,207,159, 63,199,220,185,115,185,135, 14, 29,170,147,146, 17, 21,213,112, 50,133, 82,105, -216,117,223,161,147,255, 23,109,117, 14, 17, 34,113,235, 54,182,206,193,104,235, 55, 0, 0, 48, 56,242, 3,180,109,231,133,202, -226,196, 54, 42,101,214, 40, 62,183,204, 33,113, 75, 94,138,120,120,208,251,170,162,107,233,168,113,157,154,108,118,101,250,161, -194, 28,222,228,195, 39, 78,157,155,241,118,228, 59, 60, 45,173,211, 5,121,243,236, 99,143,159, 41,202,203,206,249, 14, 57,231, -147, 94,233,127, 70, 85, 60,186,178,178, 18, 18,137, 4, 73, 73, 73,234,225,195,135, 11, 73,146,196,179,103,207,244, 68,203,213, -217,177, 99,175,238, 65,254,171, 55,237,189, 32, 17, 10,133, 67,251,117, 11, 72, 73,207,126,201,178, 68,150, 65,181, 85,171,189, -248,248,225,163,254, 46,158,237, 56, 25,215,110,195,169,207,219, 80,171, 73, 40, 53, 12,212, 58, 64,199,225,195,163,115, 15,216, -251, 6,128, 5,112,239,246, 13,173, 90,171,189, 96,233,107, 44,176,224,111,173,106,177,198, 72, 82,237,231, 82, 0, 89,209,209, -209,197,245,212, 38, 25,128, 71, 0, 66,106,143,147, 53,250,157,140, 32,136,123, 44,203,118,175,103, 71, 86,143,112,213,255,172, -105,116,204,163,102,144,172,250,239, 13,137,150,161, 41,149, 0,224,236,236,236,218,165, 75, 55,223,159,126, 57, 12,150,101,241, - 52, 97, 61,202,138,158, 96,217,218, 91,190, 45, 90,180,136,200,203,203,139, 55,167, 4, 52, 77, 31,218,181,107,215,252, 30, 93, -187,116,105,211,178, 37, 30,101,101,130,207,210,224,211, 52, 72, 74, 13, 46,173, 65,203, 32, 26, 36, 97,141,252,252, 10,196,236, - 63,156, 84,155, 37,222, 40,252,223,126, 7, 43, 95, 86,128, 32, 8,108, 8, 15,130,192,198, 26,124,137, 53, 62, 61,117, 69, 79, -174,226, 86, 46,130,192,218, 26,190, 61,204, 74, 8,175,184,122,245,234,253,199,143, 31,119, 15, 10, 10,194,252,249,243,145,149, -149, 5,134, 97, 80, 88, 88,168,146, 74,165,121, 50,153, 44, 11,192,113, 0, 63,193,140,204,227,124,181,106,115,220,209, 61, 51, -195,123, 71, 56,191, 59,106, 27, 78, 28,153,135,242,138, 74, 40,116, 98, 84,171,116,168, 86,115,224,232,212, 9, 61,130,131,145, -159, 87,132,228,219, 23,170,184,106,197,250,230, 92,160, 4, 65, 32, 33, 33, 1, 62,158, 54, 72,251, 61, 30,206, 86, 60,132,120, -186,195,179, 87,111,125,126, 41, 99,224,113,160,155, 56,113,162, 62, 51,252,144, 33, 67, 50, 39, 79,158,236, 49,111,222, 60,252, -242,203, 47,184,113,227,198,107, 1,218, 17, 17, 17,184,126,253,250,215, 0,150,155, 18,245, 52, 26, 13,252,253,253,113,239,222, - 61, 92,186,116, 9, 3, 6, 12, 64, 68, 68, 4, 18, 19, 19,241,219,111,191, 33, 33, 33, 1, 4, 65,192,201,201, 9,218, 26,242, -172, 53,100,140,162, 16,251,205,183,187, 22,111,218,180, 45,112,210,164, 73, 56,122,244, 32, 62,120,191, 3, 8, 82, 8,130, 16, -226,157, 17, 29,176,114,213, 61,244,232,209, 15,206,206, 60,108,218,120,242,133, 82, 73,239, 53,163, 26, 87,255,246,219,111,158, - 42,149, 10,229,229,229,172,181,181, 53, 81, 82, 82, 51,163,181, 41, 69, 75,161, 80,136, 12, 25,122,252, 32,117,125,185,156, 45, - 99,171, 18, 70,149,234, 18, 58, 13, 24,154,139,193,145,239,227, 98,220,175,184,114,225, 18, 28,185, 89,153,144,200,207, 21,103, - 22, 87, 74,171,253,182, 7,116,157,206,121, 89,125, 97,251,172,119,210, 56, 30, 30, 76,236,162, 31, 43,203,141, 17, 45, 0, 68, -105,202,190, 83,199, 89,188,211, 51,188, 71,187, 32, 47, 15, 65, 89,113, 17,123,228,228,185, 36, 42,243,232,233,122, 4,139, 53, - 65,212, 87, 70, 69, 69,125, 85,251,121,247,210,165, 75,167,199,196,196,184, 20, 20, 20,232, 99,180,138,138, 75,175,244, 28, 62, -139, 46, 41,175,208,236,218,244,229, 88,177, 72, 40, 88, 26,179,235,154,150,131,219,134,236,234, 24,102,235,123,115,151,205, 73, -127,154,208,162,181, 88,128,147, 95, 46,199,163,223,174, 66, 75,242,241,207, 75,119,160,166,104,148, 23,151,224,242,135,159,193, -218,205, 1,219,174, 29, 45,100, 24,230, 71, 75, 87, 99,129, 5,127, 95, 24,226, 34, 4, 65, 52,149, 99,175,176,137,239,238, 25, -251,157, 1, 59,127, 5, 12,102,133, 55,107, 10, 94,113,113,113,209,245,235,119,112, 45,110, 53,226,227, 86, 35, 57,225, 17,242, -243, 52,200, 43, 84,193,214,214,246,150,145,159, 54,206, 28,203, 42, 20,138,209, 75,151,125, 85, 32, 18, 91,161,239,192,129,112, -119,113,133, 21,159, 7,142,142, 1,135,224,161, 74,102,143,180, 68, 5, 22,238,218, 87, 84,165, 80,140,110,162,147, 24,100,136, -100, 16, 4, 1,161,173, 13, 4,214, 54, 16,218,216, 54,112, 35,138,108,109, 33,178,177, 5, 87, 32,104, 42, 24,254, 53,155, 85, - 85, 85, 99,198,142, 29, 91, 86, 81, 81,129,233,211,167, 35, 62, 62, 62,225,194,133, 11,182,137,137,137, 98,153, 76,214, 14,192, - 16, 0, 59,140,144,172, 6, 54,203,202, 50,228,172, 78, 61, 62,250,171,207,149, 42,157, 19,198, 77, 61, 4, 9,153, 11, 29,205, -128, 5,224,233, 40, 64,175, 65,171, 80,164,233,137, 67,219,215, 40, 24, 74, 53,169, 81, 14,173, 6, 54, 89,150,101,221,220,220, - 94,171,131, 75,151, 46, 97,220,216, 49, 24, 58,106, 36, 92,218,248,192,117,208,219, 24, 58,253,159,216,190,125, 59, 72,146,132, -179,179,115,227,142, 87,111,115,207, 67,240, 14, 60, 6,113,224, 49,136,221, 9,224, 2,152,178,111,223,190,111, 66, 66, 66,174, -222,184,113, 99, 61,128,241,245,255,171, 30, 86, 52, 82,179,154,106,163, 37,115,230,204, 81,166,167,167, 67, 34,145, 64,167,211, -225,198,141, 27,216,182,109, 27, 54,108,216,128,132,132, 4, 56, 57, 57,193,215,215, 23,106,181, 26,247,238,221, 83, 2, 88, 98, -196, 38, 35,147,233,198,108,217, 18, 83, 18, 25,217, 7,187,118,253, 0,119,247,158,224,113,221,193,229,185, 64, 98,237,143,159, -127,250, 6,111,189,213, 5,167, 78, 30, 46, 45, 46,209,141, 1,160, 51,227, 90, 82,221,185,115, 7,219,183,111,199,216,177, 99, -243,198,141, 27, 71, 87, 84, 84,232, 21, 45,150,101,193,178, 44, 86,212,198,152,169,213,106,161, 33,155, 31, 45, 76,202,251,114, - 77,242,202,194,130,188,176,248,171,183, 38, 94,185,112, 9, 47,210,175,224,202,133, 75,248,253,202,205,168,194,130,188,176, 46, -161,237,249,163,167,207,252, 98,207,177,163, 28,107, 91, 15,236, 57,118,148, 51, 97,214,231,107,186, 13, 29,176,196,212, 53, 95, -219,142,108, 85, 81,225,162,181,235,191,175,210, 81, 42,114,221,119, 91,243,149, 50,233,146,122,215, 37,107,234,250, 84, 42,149, - 59, 84, 42,149,167, 74,165,242, 84,171,213, 75,178,178,178,250,206,159, 63, 95, 70,211,180, 94, 45,149,165,156,186,245,228,143, -221,107, 93,157, 29,196, 61,187, 7,118,216,184,227,200,181,156,220,194,127,213,203,161,213, 84, 57, 85, 85, 74,213,152,145,163, - 39, 87,151,151,169, 17,254,121, 20, 24,145, 53,212, 52,160,101, 57,208, 17, 92, 60, 94,189, 17, 98, 71, 27,236,207,124,160,168, -208, 82, 99,208, 48,135,150,177,115,255, 51,176,216,180,216,180,216,252,239,180,249,127, 25, 30,104,184,214,161, 71, 3, 69,203, -212,148,202, 22, 45, 90,244,125,247,157, 65,232, 23,185, 20, 44,203,226,201,131,111, 81, 38,123,138, 22,238, 66,100,228, 84,134, - 3,136,111, 70, 97,114,178,114,115,195,230, 44, 89,122,108,220,144,129, 1, 65,109,218, 8, 91,183,246,134,196,213, 21,197,197, - 50,252,113, 59, 69,187,230, 64,108, 82, 45,201, 50,203, 49,201, 48, 76, 77,144, 59,128,129,115, 22,130,224,112,128,218, 52, 14, -117, 29, 99,155,238, 61, 65,112,185,160, 89, 6,106,181,218,156,217,114, 47,159, 63,127, 62,102,210,164, 73,151,227,226,226,200, -161, 67,135,118, 62,126,252,248,159, 89, 51, 15,213, 69,233, 87, 1, 68,174, 89, 52,227, 80,216,128,145,182,126,129,221,248,221, - 90,115, 64,105, 9,228,231,101, 35,238,216, 93, 42,229,206,133, 74, 86,167, 26,175, 40, 78,191,106,204, 22, 69, 81, 57,237,218, -181,115,219,190,125,187, 62, 24,158,166,105, 20, 23, 23,227,214,173, 91,232,212,189, 7, 2,222,255, 16, 50,153, 12, 91,182,108, -129,151,151, 23, 70,140, 24,129,210,210, 82,232,116, 58,115, 29,190, 52,128, 11,181, 47, 52, 34, 89, 68,237, 18, 64, 70,221,134, - 62, 62, 62, 2,149, 74,213,153,101, 89, 14, 65, 16,155, 53, 26,205,180, 69,139, 22,121,172, 93,187, 22, 29, 58,116, 64,113,113, - 49, 36, 18, 9,252,252,252, 32,147,201,112,247,238, 93, 90,161, 80,108, 71,205, 66,214, 50, 19,229,123,118,247,110,102,216,236, -217,159, 30,251, 38,102,134,159, 74,221, 79,224,232,216, 27, 44,171,131, 76,150, 5,121,229, 13,106,213,202, 95,159, 23, 22,105, - 71, 3, 72, 55,243,156,151,207,156, 57, 19, 0, 68, 0,150,102,100,100, 60, 12, 8, 8,240, 51,164,104,153,131, 77, 71,242, 84, - 0, 14,140, 25,234, 57,183,178, 56,209,207,145,155,149, 25, 22,196,108,217,116, 36, 79,101,235, 89,189,186, 56, 43, 62, 77, 90, -125, 97,251,158, 99, 71, 57, 83, 71,141,161, 91, 90,167, 71,137, 92,217, 35,102,152,102, 67, 66, 66, 90, 17, 68,105,219,162,146, -167,247, 63,152, 62,227, 61, 59,190,242,108, 72,203, 18, 95,210,171,139, 40, 33, 33, 33, 19,205,156, 25, 90,139,180,188,188,188, -190,139, 22, 45,186,192,178,108,131,216,132,162,226,210, 43,225,145, 51,217,242,242,138,135,178,212, 83,230,228, 82,187,123,247, - 65,194,192,160, 78, 93,142,126,179, 54,198,173,223,156,249,220,180,171,215, 0, 90,139,236,248,107,160,133, 26,102,227,205,139, -133, 21, 20, 53, 10,150,172,240, 22, 88,240,183, 87,179,140,113,145,255,114, 12,135,129, 96,120,179, 79,198,167,109,139, 11, 29, -252, 90, 15,241,106,233, 2, 0,200,200,204, 71, 70,102,222,111, 25, 47,242,134,154, 96,188,134,166, 87,234, 23,149, 38,106, 83, - 56,176,230, 45, 42,221,192,166,147,147,211,125, 46,151,219,178, 57,181, 65,211,116,126,113,113,113, 23, 51,203, 57,161, 77,155, - 54, 49,217,217,217,199, 24,134,153,219, 76,182,223,164,205,186, 69,165, 73,174, 96, 16,171,211,116, 2, 0,130, 43, 48,103, 81, -233,250, 54, 59, 89, 91, 91,239,224,241,120, 94,117,237, 88, 23,131, 69,211, 52,135,162, 40, 17, 77,211, 28, 0, 4, 73,146, 58, - 30,143,167, 34, 8, 66,167,211,233,114,212,106,245, 12,188, 74, 56,106,236,220, 77,118,244,181, 68, 11, 77, 40, 90,151, 0, 32, - 61, 61,189,189,131,131,195,120,130, 32,198,178, 44,235, 47,151,203,213,203,150, 45, 75,136,141,141,173,108,211,166,205,176,225, -195,135, 19,137,137,137, 72, 74, 74, 98, 75, 74, 74,142,212,170, 88, 25,205,188,150, 72,161,144,243, 15, 71, 71,114, 56,203, 34, - 4, 44, 8,130,196,227,138, 10,230,172, 66, 65,255,171,150, 48, 54,247,250,172,195,196,214,173, 91,255,154,153,153,201, 51,164, -164, 26, 58,247,198,248,118, 73,224,210,240, 62,125,198,220,250,253,247,227, 95,174, 73, 94, 89,127,223,172,145, 14, 31, 76,248, -108,206,183, 7,182,126,247,229,247, 39,202,118,153, 83,206,206,157, 59,251, 16, 4, 49, 30, 64, 16,203,178,237, 88,150, 16, 17, - 4, 91, 70, 16, 68, 50,128, 68,141, 70, 19,151,146,146,242,242, 79,156,251,155,140,112, 13,217,212, 47, 42, 13,154, 14,166, 1, -214,204, 69,165,255,127,151,211, 98,211, 98,211, 98,243, 63,103,243,255, 50, 62,110,226, 59,243, 50,195,215, 33,227, 69,222,208, -140, 23,121,104,215,174, 29,251,236,217,179,102,145, 52, 67,157, 52, 77,211, 7, 21, 10,197,193, 63, 99,164,164,164,164,219,191, -185,242, 14,100,102,102, 30,248, 43, 13,214, 18,169,149,181,175, 55,197,227,170,170,170, 30,230, 30, 76, 81,212,191,163,110,136, - 90, 53,235,107, 67, 7, 12, 25, 50, 36,155,162,168, 75, 0,114, 9,130,176, 7, 80, 74, 81,212, 5,157, 78, 87,248,236,217,179, -110, 27, 55,110,172,203,124,191, 10,192,253, 55, 44, 7,163, 86,211,251,243,243,233,253,255,134,115,220,175,209,104,230, 57, 57, - 57,249,170, 84, 42,129, 74,165,226,215,159,124, 32, 22,139,101,198, 2,226,235,195,222,134,216,205,231,150, 57,217,219, 16,141, -137, 20, 28, 91,224,168,178, 58,169,131, 99, 11, 28, 53,183, 96, 15, 31, 62,204, 8, 9, 9,217, 71,146,100, 27,150,101,221, 0, -214,142,101, 33, 99, 89,182,152,251,255,216,187,238,184, 40,174,182,123,102,102,103,251, 46,176, 75, 93,138, 5, 20, 68, 64, 1, - 11,246,136,154, 24,123,137, 88,162, 98, 47, 49,106, 98,212,168, 81,163,177,198,215,196,158,216,123,111, 81,176,247, 94,177, 43, - 86,164, 55,169, 11,203,246,157,249,254,128, 37,168,148, 5, 77,222,228,253,246,252,126,227, 58,195,238,217,123,103,231,222,123, -238,115,159,251, 60, 28, 78,210,227,199,143,147,254, 65,157,144,198,200, 48,139,141, 58,221,159,126,135,214,221,133, 86, 88, 97, -197,255, 14,202,244,209,226, 84,150,233,197,139, 23,132,245,126, 90, 81, 82,108,149,247,199,184,184, 56, 45,128,171, 69,199,187, -184, 13,160,203, 63,189,130, 41, 41, 41,193,101,253,205, 82,145, 5, 20,250,108, 1, 15, 75,141,206, 62,107, 69,118, 30, 86, 28, -152, 84,217,178,221,187,119, 47, 30, 22, 46,177, 91, 97,133, 21, 86, 88,241,151,225,195, 45, 90, 86, 88, 97,133, 21, 86, 88, 97, -133, 21, 86,148,138,181, 37, 4,215, 91,214, 45, 2,101,239, 28,168,204,218,107, 85,118, 31,156,182,114, 90, 57,173,156, 86, 78, - 43,167,149,211,202,249,255,142,243,127, 21,239,137,172,191, 3,214,173,175, 86, 78, 43,167,149,211,202,105,229,180,114, 90, 57, -255, 63,136,172,119, 15, 0,214,165, 67, 43,172,176,226,255, 49,246,238,221,107, 81, 82,209,190,147,215,119,150, 72,100, 51,242, -149,185, 11,119, 45, 30,114,208,124, 61, 44, 44,204,100,189,139, 86, 88, 97, 5,170,226, 12,239,233,233,238, 71,154,152,230, 44, - 75, 82, 44,201, 26, 8,165,122,247,171,236,236,183,194, 14,120,120,120,216,209, 36,186, 16, 44, 43, 38, 8,198,196, 80,228,149, -152,152,196,199,149, 40, 24, 79, 38,147,125,205,229,114,219,233,116, 58,119,146, 36, 19,181, 90,237,233,130,130,130,149,120, 63, -112,225,127, 13, 62, 62, 62,253,206,159, 63,111,215,162, 69, 11,173, 80, 40, 52,170,213,106,206,241,227,199,249, 29, 58,116,200, -121,249,242,101,149,118, 36,186,186,186,182, 89,191,126,189,103,251,246,237, 81,187,118,109, 85,159, 62,125,184, 77,155, 54,229, - 14, 27, 54, 44, 38, 57, 57,249,108, 37,233,252, 8,130,216, 74, 16, 4,197, 48,204, 64,252, 25,186,225, 99,131, 36, 73,114, 36, - 65, 16, 61, 88,150,245, 34, 8,226, 21,203,178, 7, 25,134, 41, 47,112,107,121,248, 2, 64, 71,146, 36,131, 1,128, 97,152, 59, - 0,142, 2,150,239,188,251, 59, 57, 69, 34, 81, 16, 0, 20, 20, 20,220,253, 88,156, 4, 65, 4, 1, 0,203,178, 85,229, 28, 44, - 20, 10,135, 3,128, 90,173, 94, 7, 11,210, 65,189, 11,118,181, 47, 27, 60, 59, 26, 0,112,231, 71, 95, 0, 64,101,206,137, 81, -209, 68,101,190,171, 52,190,202,112,148,130,142,253,251,247,159,191,125,251,246, 31, 1, 28,250, 43, 30,124, 23, 23,143,149,191, - 44, 91,235,250,205,215, 67, 23,162, 48, 35, 68,249, 13, 18,248,148, 71, 81, 93,117, 38,211,165,199,192, 94, 0, 28,185, 92,222, -143,199,227,181,210,233,116, 10, 14,135,147,162,211,233, 46,230,230,230,238, 68, 57, 25, 16, 44,190,175, 79, 32,211, 23,192,133, - 96,254,204,243,198,146,208,114, 69, 72, 37,234, 34,251, 31,208,141,146, 0,198, 23,213,117, 3,202, 14,231, 81, 94,231,243,141, -171,171,107, 15,165, 82, 89, 64, 81, 20,139,194, 93,207,133,255, 20,254,157, 96, 24, 38, 61, 43, 43,107, 96, 69, 92,226,106,168, -195, 19, 19, 91, 77, 6,168,141, 90,118,180, 42, 1,209, 18, 15, 52, 99,129,129, 44, 80,147,164, 72, 71,134, 97, 82, 0,156, 37, -141,136,200, 79,198,139,127,232,224, 94,189,232,190,214, 40, 58,167, 1, 56, 3,184, 15,224, 27, 0,249, 86,253,243,183,225, 93, -103,248, 35, 0, 82,138,133, 86,137,112,247,173, 59,119,238,124,193,211,211,221,175, 87,247,158,243, 71,141, 28, 77, 80, 20,137, -135,143, 30,113,190, 28, 56,248, 51,153, 76,230, 38,209,106,235,130, 32,152, 2,129,224,161, 82,153,155,180,119,231,118,169,111, -157, 58, 38,147,137,193,234, 53,191,119,216,247,199,129,105, 22,138, 45, 31, 23, 23,151,173, 83,166, 76,113,233,218,181, 43,229, -226,226,130,216,216, 88,187, 93,187,118,213, 89,177, 98, 69,239,236,236,236,129, 0,158, 85,161,178, 45, 93,228,228,103, 82, 33, -209, 22,121, 38,228, 25,112, 38, 85,141,147, 0, 46, 85,245,238, 21, 20, 20,140, 45, 40, 40, 8,105,212,168, 17,187, 97,195, 6, - 98,208,160, 65, 44, 65, 16,132, 90,173,222, 12,160, 74, 66, 75, 44, 22,175,106,223,190,189,183,183,183,247,171,151, 47, 95,118, -220,179,103,207,209,240,240,112, 47,177, 88,252, 28,128, 79, 37,233, 54,101,102,102, 6,170,213,106,184,187,187,111, 0,208,224, - 47,120,136, 8,138,162, 14,186,185,185,177,139, 22, 45, 58, 20, 24, 24,232,156,149,149,101,156, 52,105, 82,187,235,215,175,119, - 48,153, 76, 93, 43, 33,182,100, 4, 65,172,113,118,118,118, 88,184,112,225,139,134, 13, 27,222,231,243,249,188,231,207,159,139, - 38, 76,152,240,237,179,103,207,122,179, 44, 59, 18,168,212, 0, 33, 35, 8, 98,141,171,171,171,195,252,249,243, 99,131,131,131, - 31,114,185, 92,238,243,231,207,197,223,127,255,253, 55,209,209,209, 85,226, 36, 73,114,117, 72, 72,136,236,199, 31,127,124, 82, -167, 78,157,171, 20, 69,241, 18, 19, 19,201, 89,179,102,125,125,234,212,169, 48,134, 97, 70, 85,165,156, 78, 78, 78,178, 89,179, -102, 61,105,218,180,233,117, 46,151,203,125,250,244, 41, 57,101,202,148,175, 95,188,120, 97,113, 57,229,114,121, 40, 65, 16,107, - 83, 83, 83, 57, 0,160, 80, 40, 26,219,216,216,172, 40,153,211,210, 28,138,194, 96, 48,228,105, 52,154,254, 89, 89, 89,165, 6, -194, 29, 52,117,121, 23, 0, 88,161, 55,159, 23,190, 86,116, 14,172,142,176,164,210, 65, 46,133,113,241,126, 81, 13,233, 14, 0, -253,138, 82,133,255,162, 2, 56, 28, 14, 19,228,242, 13,123, 55,181, 82, 33, 99,186,181,105,211,102,214,217,179,103,127,111,221, -186,245,247,219,182,109,115, 74, 72, 72,248,249,210,165, 75, 30,125,251,246, 29,116,230,204,153, 5, 25, 25, 25,251, 62,214,195, -207,227,242,249, 4, 73, 64, 40, 16,217, 88,242,126,154, 36, 59, 95,237,214,109,248,186,167, 79,131, 87, 68, 71,123,170, 20,138, -144,113,227,198, 57,247,236,217,147,244,240,240,192,139, 23, 47,236,183,109,219, 86,119,221,186,117, 61,114,114,114,198, 3,136, -251, 16,145,165,202, 65, 61,173, 14,193, 44, 11,187,226, 6, 75, 32,135,175,199, 29,246, 9, 30,252, 3,196,214,204, 77,155, 54, -253,248,226,197, 11, 44, 88,176, 0, 0, 86, 86,242,243, 19,186,117,235,214,233,192,129, 3,194,189,123,247, 10, 27, 53,106, 4, - 23, 23, 23, 20, 77,166,138, 3, 83,123,122,122, 90,118,207, 24,252,178,244,232,144, 6, 15,179,142, 97, 85,207,212, 5, 66,119, - 24,155,117,243,238,209,121, 80, 48,108, 29, 69, 16, 72, 56,200,201, 84, 6, 60,189,147,208,254,220,158, 23, 63,191,136,122,179, - 80, 21,143,153, 40, 59, 38,223,127, 5,246,246,246, 27, 98, 98, 98, 66,197, 98,241, 91,215, 95,189,122, 21,228,237,237,157, 11, -224,187,202, 10, 55, 71, 71,199, 29, 12,195,104, 51, 51, 51,135, 2,128, 84, 42,221, 46, 22,139,101, 41, 41, 41,211,254,170,137, -140, 25,239,106,145,127,185, 69,171,216, 95,171,180, 92,135, 4,105, 98,154,143, 26, 57,154,232,211,175,111,234,139, 87, 49, 12, -135,230,245, 59,126,226,132,200,207,207,143,212,174, 92, 9,227,155, 55, 48,124,251,109,179,211,167, 79, 27,194,250, 13, 80,211, - 20,177,201,203,179,166,104,247,206, 93, 46, 7,246,239,107, 14,160, 34,161,197,115,113,113,217,122,254,252,121, 55, 79, 79, 79, -228,228,228, 32, 54, 54, 22, 42,149, 10,189,123,247,166,155, 55,111,238,214,171, 87,175,173,185,185,185, 45, 42, 97,217,114,174, -237,206,137, 28, 57,184,167, 79,135,207,154,139,221, 60,106,129, 77,213, 32,225,101,116,163,200,243,215,199,109,218,127,244,217, -139, 92,182, 51, 74,207,141, 84, 46, 50, 50, 50, 38,247,232,209, 99,127,104,104,168, 35,159,207,135,171,171, 43,209,181,107,215, -244,228,228,228,217, 85, 86, 45, 69, 41,108, 72,146, 52,149,124, 45, 37, 61,144, 37,112,151,201,100,144,201,100, 0,224,246,161, - 51, 79, 59, 59,187,149, 82,169,180,151, 82,169, 84,147, 36,201, 18, 4,193,234,116, 58,161, 76, 38,187,247, 36,250,153,171, 86, -171,173,189,120,233,186,101,109, 90, 6,218,156, 58,117, 10, 61,123,246,100, 79,158, 60, 57,210,210, 60,117, 4, 65,172,233,209, -163, 71,193,140, 25, 51, 52, 47, 94,197,186, 61,121,246,138, 16, 11,120,140,131,131, 3,125,243,230, 77,206,146, 37, 75, 4,179, -102,205, 90,195,178,108,175, 74,220,207, 53,125,251,246,213, 79,156, 56, 49,229,233,139, 24,167, 7, 79, 94,176, 18, 1,109,116, -112,176,167,174, 95,191,206, 84,133,147, 36,201,213,147, 39, 79, 86,142, 28, 57, 50, 59, 51, 43,215, 37, 91,153,207,242,105,202, -224,226,226,194, 57,116,232,144,118,199,142, 29,228,240,225,195, 87, 51, 12, 19, 86,137,251,187,186,107,215,174,121, 83,166, 76, -201,121,254,234,181,203,131,199,207, 32,226,211, 6,103,103, 39,234,214,173, 91,250,197,139, 23,147,115,231,206,181,168,156, 98, -177,120,203,158, 61,123, 56,135, 14, 21,246,125,215,174, 93, 35,189,188,188, 68, 37,223,163,214,104, 65, 18, 64, 70, 70,134,168, -105,211,166, 91, 0,188, 23,220, 55,120,118, 52, 6, 77, 5,198,142, 29,155, 82,217,135, 37, 88, 49,174,194,247,152,126,247,101, -151, 20, 12,233,206,225,112,152,225,195,135,167,190,251,119,141, 70, 67, 0,232,138,159, 45, 23, 91, 29, 59,118,252,225,200,145, - 35,181,182,109,219,246,235,142, 29, 59,116, 0, 32, 16, 8, 28,118,237,218,181,160,119,239,222,232,221,187,247,140,125,251,246, -125, 52,161,101, 98, 77,122, 0,224, 11,248,252,232,232,104,194,215,215,183,220,136,251,122,134,185,189,238,233,211,134, 95,249, -250, 54,202, 98,152,218,220, 14, 29,242, 39, 76,152,144,161, 84, 42, 17, 27, 27, 11,189, 94,143, 65,131, 6, 81,173, 91,183,118, -237,221,187,247,242,188,188,188, 47, 0,232, 45,120, 38, 23,187,185,185,141,200,205,205,205, 55, 91,117, 90, 12, 52,113, 90, 5, - 25,249,245,107, 27,120, 92,202,200,237,242, 45, 67,156, 92, 73,168,124, 61,113, 25, 0,184, 5,120, 83,201,201, 64,169,176,113, -135,167,137,198, 92, 71,119, 97,155, 55,113,234,159, 84,241,229,138,165, 47,196, 98,113,119,149, 74,181,175,104,112,246,233,220, -185, 51,174, 95,191, 14, 0,205,139,132, 86, 27,146, 36,191,100, 24,102, 61,128,242, 82,185,141,235,214,173,219,167, 7, 14, 28, -144, 2,192,190,125,251, 96, 48, 24,224,229,229, 5, 46,151, 11, 30,143, 7,154,166,139,179,131, 88, 8,133,163,163, 3, 28,108, -105,200,228,226, 14,223,255,214,141, 83,205,207, 6,233,166, 71,200, 98,115, 96,100,181,224,218,139, 81,167,189, 29,130, 63,107, - 67, 70,172,126, 56, 45, 98,213,147,134, 5, 36,186, 32, 14,218,127,202,200, 78,146, 36,255,254,253,251,112,117,117,125,235, 58, - 69, 81, 0,208,170, 10,148, 51, 94,189,122,213, 52, 42, 42, 10,161,161,161, 51,234,213,171,247,249,133, 11, 23, 92, 50, 51, 51, - 17, 26, 26,186, 60, 49, 49,241,208, 95, 93,167,146, 90,228,127,197,212, 69,190,163, 36, 91, 23,206,130, 73,138,162, 72,196,188, -138, 53,132,134,182, 13,143,143,143,151,132,132,132,144, 52, 77, 67,117,246, 44, 52,183,110, 65, 34,145,160, 71,143, 30,244,197, -139, 23,109,108, 36, 54,195, 94,199,188,206,163, 40, 18, 44, 75, 86,232,243, 32,147,201,190,158, 54,109,154,139,183,183, 55,140, - 70, 99,113, 68,115,163,209,136,132,132, 4, 72, 36, 18, 12, 28, 56,208, 73, 36, 18,125,109, 97, 61,106,248,120, 57,221, 57,127, -116, 77,131, 9,163, 58,138,125, 68,167, 32, 78, 24, 15,201,190,175, 80, 55,249, 56,166,116, 15, 17,159, 92, 53, 35,184,150,171, -252, 78, 9, 19,171,197,208,106,181,151, 31, 62,124, 56,236,194,133, 11, 12, 0,156, 59,119,142,125,242,228,201,200, 15,153,133, - 50, 12,131,156,156, 28, 48, 12, 67, 21,157,155, 95,255,171,207,131,141,141,205,234,207, 63,255,188,111, 92, 92,156,240,216,177, - 99,246,241,241,241, 14,175, 95,191,118,244,241,241,225, 44, 88,176,224,136, 70,171,167, 12, 38, 86,103, 52, 25,242, 82, 30, 61, -122,149,157,150,118,103,227,198,141,106,130, 32,122, 88,248, 29, 95, 40, 20, 10,251,169, 83,167,130,160, 69,141,235,212,173,231, - 77,209, 66, 91,146,230,217,170,213, 26, 83, 76, 76, 76,194,212,169, 83,107, 6, 6, 6,186,162,112,121,205, 34, 78, 87, 87, 87, -135,137, 19, 39,130,195,151, 6,213, 15, 12,174,197,227,139,165, 20, 45,148,134,132,132,180,126,245,234, 85,242,148, 41, 83, 20, -141, 26, 53,170, 20,103,163, 70,141,100,195,135, 15, 55, 10,132,210,166,158,158, 94,117,235,251,215,237,228,227,227,211,157,195, -225, 24,223,188,121, 19, 55,112,224, 64, 69,151, 46, 93,156, 43,195,233,228,228, 36,155, 50,101,138,209,163,186, 87,251,246,159, -126,214,132, 43,148,218,114,120, 98,187,130, 2,141,233,233,211,167,113,211,167, 79, 87, 4, 5, 5, 57, 89,194, 89, 80, 80, 64, - 59, 56, 56, 32, 32, 32, 0,126, 94, 94,200,205,205,197,129, 3, 7,176,105,211, 38,172, 95,191, 30, 59,119,238, 68,195, 22,159, - 65, 42,149, 34, 57, 57, 25, 74,165,146,254,187, 31, 40,211,239,190,236, 10,221,136,174,163, 71,143, 78, 30, 62,124,120,170, 80, - 40,100,222, 61,228,114,185,169,127,255,254,105, 3,191, 95,218,213,188,180, 88,129, 37,235,254,209,163, 71, 95,110,219,182, 13, -126,126,126,104,223,190, 61, 15, 0,190,254,250,107, 94,239,222,189,177,103,207, 30,236,219,183,239,177,183,183,247, 21, 0,221, - 44, 41,231,192,129, 3, 91,132,133,133, 93, 10, 11, 11,187,219,167, 79,159,181, 35, 71,142,124,107,228, 74, 73, 78,188,173,211, -233, 16, 24,220, 72, 52,103,195,141,254, 21,241, 61, 1,182,173,141,142,222,180,240,209,163,184, 25,126,126,118,213, 95,191,150, -111, 94,188,216,193,156,164,219, 96, 48, 32, 33, 33, 1, 50,153, 12,253,251,247,119,224,243,249, 3, 45, 40,230,146,110,221,186, - 13,142,143,143,151,172, 91,183, 78,113,247,238, 93,215,148,148, 20,197,153,211, 39, 28, 39,125,247,181,212, 86,194,227, 37,191, - 97, 9, 0,120,157, 12,113,116, 12, 90,176, 44,236, 74, 46, 39, 86, 9, 10, 8,133,238, 88, 81,171,133,221,179,137,123,130,250, - 76,137, 12,118,144, 41,248, 83,203,249, 68,253, 69,139, 22,237,141,136,136,232,215,162, 69,139,253, 0,132,165,188, 71,208,176, - 97,195, 3,123,246,236, 25,220,178,101,203,203, 0, 2,202,156, 69,186,187,247,248,227,143, 63,236,205,231, 14, 14, 14, 16, 8, - 4,239,137, 44, 46,151, 11,146, 36, 43, 93,189,121,187,250,113,228,117,181,120,152,125, 20,123, 22,221,199,162, 14, 79,153,249, -205, 94,107, 87, 14,140,198,201, 61,247,145,142,251,232,248, 85, 45,244,155, 30,216, 78,100,194,220,127,210, 0,254,230,205,155, - 47, 91,181,106,181,183, 99,199,142,218,168,168, 40,188,121,243, 6,110,110,197,115,237,212, 42, 80,202, 69, 34, 17, 60, 60, 60, -224,237,237,221,239,226,197,139, 46, 6,131, 1,175, 95,191, 70,122,122,250,157,191,163, 78, 37,181,200,191, 12,239, 58,194, 31, -121, 79,104, 21,229, 22, 58, 15, 0, 44, 65,168,238, 63,124, 72, 83, 60,222,128,237, 59,118,240,185, 92, 46,226,226,226,240,248, -241, 99, 20,156, 57, 3,245,213,171, 72, 75, 75, 67,126,126, 62,156,157,157,177,102,195, 6,177,206,196, 14,121,250,236, 25,197, -146,108, 73,127,131, 82,183,120,242,249,252,118, 61,123,246, 44, 83,144, 37, 39, 39,163, 99,199,142, 52, 69, 81,165,237,106,120, -151,147,112,117, 36, 34,206,236,159,163, 80,240, 30, 3, 47, 38, 0,121,119, 0, 86, 11, 24,117, 64,210, 3,224,200,108, 84,207, -143, 38, 78,204, 9,119,113, 19,113, 34, 74, 81,202, 21,109, 69,245,242,245,245, 93, 63, 96,192, 0, 18, 0,218,180,105, 67,248, -250,250,174, 5,224, 85,206,103, 78, 87, 48, 72, 94,207,206,206, 70,239,222,189,237,107,213,170,117,186,119,239,222,246,230,235, - 85,229, 52, 91,147,253,252,252, 50, 5, 2,193, 78,192,162, 14,182,152,211,206,206,110,101,199,142, 29,123,237,216,177,131, 11, - 0,231,207,159, 71, 68, 68, 4, 30, 61,122,132,231,207,159, 51,193,193,193,142, 75,215,239, 93,189,242,247, 45, 75,186, 55, 15, -116,109,221, 56,184,174, 36, 63, 59,223,217,217,185, 57,203,178, 94, 22,150,179,227,236,217,179, 31, 63,121, 25,103, 75,114,104, - 14,151,230,240,109,108,196,206, 50,169,216, 93, 46, 18,184,241, 73, 66, 82, 80, 80,144,186,115,231, 78, 6, 64, 71, 75, 57,231, -204,153, 19,243,228, 69,156, 29, 65,114, 56, 52,135,230, 74, 36, 34,187, 14,237, 67, 27, 1, 0, 23, 44, 87,169, 84,166,109,218, -180, 73, 95, 25,206, 31,127,252,241, 97, 86, 78,190,140, 67,211, 52,135, 67, 21,223, 75,177, 80,232, 40,226,243,121, 90,173, 54, -105,217,178,101,234,202,112,206,158, 61,251,241,211,151,241,114,146, 32, 40,130, 32, 57, 54, 82,177,189,189,173,200,209, 81, 34, -116, 16,113, 40,158, 82,169, 76,218,186,117,171, 69,156,122,189,158,155,150,150,134, 39, 79,158,192,163, 81, 35,156, 58,117, 10, -213,170, 85, 67,239,222,189,209,183,111, 95, 8,133, 66,180,105, 90, 15, 83,167, 78,197,203,151, 47,161,215,235,249,165,113,154, -253,164,222,133,171,171,107, 84, 69, 15,207, 59,159,125,171,156, 65, 46, 96, 87,232, 70,116, 45, 41,176,202,226,151,203,229,166, -210,172, 93,239,114,118,236,216,241,135, 51,103,206,212,218,186,117,107,215,129, 3, 7, 94,222,186,117, 43,154, 52,105,130, 39, - 79,158,160,102,205,154,216,188,121, 51,250,246,237,123,121,249,242,229, 93,163,162,162, 2, 61, 61, 61,167, 85,196,217,167, 79, -159, 49, 65, 65, 65,103, 83, 83, 83,155,102,101,101, 5, 28, 56,112, 96, 72,143, 30, 61, 98,250,245,235,215,182, 88, 48, 26, 12, - 59,142, 28,222,143, 78, 93,123,162,142,127,192,234, 65,211,182,213,171,160,109,178,143,128,181,155, 82, 82,222,236,208,104, 10, -122,211,180, 72,116,227,134,124,223,239,191, 59,148,204, 44,144,148,148,132, 46, 93,186,208, 92, 46,183,101, 5,229, 92,212,189, -123,247,222, 7, 14, 28,144,153,173, 58, 87,175, 94,197,131, 7, 15, 16, 27, 27,139,156,156, 28,180, 29,153,143,209, 11, 10,185, - 71, 47, 96,241,217,215,172,184,138,125, 72, 49,132,213,224, 98,111,195,185, 50,100, 89,157,175, 71,172,246,227, 72,228, 52,182, -127,255, 28, 25,175,181,251,202,224, 36,154, 54,109,186, 45, 44, 44,140,208,233,116,208,233,116, 58, 0,165, 70,245,117,115,115, - 19,212,175, 95, 31, 35, 71,142, 36,109,108,108,150,151, 85, 78,149, 74,165, 61,122,244, 40, 6, 14, 28,136,241,227,199,163,118, -237,218,144,201,100,160,105, 26, 91,182,237,118,232, 59,100,148, 79,131, 22,173, 2,253, 26, 52,169,159,167,165, 26,209, 66,217, -240, 50,172, 33,165,214, 61,223, 41, 10, 15, 95, 95,195,138,174,137,204,205,205, 5,249,147,190,252, 79,244,211, 11,105,143,166, -133,173,125,200, 94,107,150,177,237,155,120,164, 25,158,160,101,239,234,240, 12,146,125, 43,246,128,111, 85,239,167,133,168, 20, -103,189,122,245, 90,220,188,121,147,223,170, 85, 43,196,197,197,129,166,139,231, 83,166, 15, 41,231,236,217,179,249, 26,141, 6, -247,238,221, 67,120,120,120,146, 94,175,255,246, 67,202, 89, 25,139,150, 89,139,252,203,176,246,157, 35,165, 44,139,214,108, 0, - 48, 48,136, 24, 16, 62,164, 32, 50, 50, 82,196,227,241, 16, 23, 23,135,148,148, 20,108,217,180,201,212,198,201, 41,175,189,155, -155,114,203,166, 77,172, 78,167, 3,203,178,240,245,245, 69,175, 94,189,132, 95,244,238,151, 78, 40,213,187, 45, 88,230, 81,152, -215,215,135, 12, 25,242,222,223, 39, 77,154, 4, 27, 27, 27, 16, 4,225, 98, 65,229,194,198,205,238,238, 46,243,180, 75, 99, 83, -183,100,129, 18, 0, 28, 41,192,177, 1, 4,182, 0, 95, 10,240, 68,208, 70,157,205, 34,217,246,177, 61, 91, 14,117, 3, 80,153, -165, 30,184,186,186,206, 56,123,246,172, 99, 84, 84, 20,171, 84, 42,145,146,146,194,206,159, 63,223,209,213,213,117, 70, 85,127, -145,228,228,228, 57,157, 58,117, 74, 11, 15, 15,183, 61,126,252,184, 71,120,120,184,109,167, 78,157,210,146, 7,149,255,129, 0, - 0, 32, 0, 73, 68, 65, 84,147,147,231,124,200, 47,205,229,114,169, 71,143, 30,201,231,206,157,219, 23,192,109,127,127,255, 76, - 55, 55,183,219, 40,116,154, 44, 23, 82,169,180, 88,100,153,173,107, 28, 14, 7, 52, 77,195,213,213, 85,151,149,149,101,106,217, -192, 75,232,107, 75, 26, 92,249, 92,161, 92, 40,112,151,218,216,134,100,102,102,222, 39, 8,226,149,133, 75,124, 65,141, 27, 55, -166, 77, 44,205,140, 30,208,198,245,235,193,161, 78,191,205, 29, 94,109,217,156, 17,110,139,102, 13,243,157, 51,185,127, 40,201, - 48,154,154, 53,107,186,152, 29,218, 45, 48,159, 7, 55,108,216,144,195,128,198,147,103,177,105,113,137, 73,121,159,182,110, 90, -108,185,244, 11, 10,110,239,232,232,216,202,215,215,183, 33, 65, 16, 22,109, 73, 22, 10,133, 65,117,234,212,225,144, 20, 77,216, -203,164, 30, 82,137,208,185,120, 9,197,206,174,153,220,209, 49,140,100,217, 92,133, 66,225, 36, 20, 10,131, 42, 81,119, 14, 3, - 46,156,157,228,182,142, 14,118,146,246,161,205,107, 55,109,214,212,167, 94, 72,147,166,254, 13, 26,126, 65, 24,141, 74, 47, 47, - 47, 39,179,147,124, 5,150, 86,193,142, 29, 59, 48,119,238, 92,212,175, 94, 29,110,110,110,112,114,114,194,213,171, 87,113,243, -230, 77,200,100, 50,164,167,167, 99,241,226,197, 56,120,240, 32,244,122,189,180,178,207,147, 37, 98,171, 60, 24,141, 70,242, 93, -129, 85, 22,191, 80, 40,100,204, 78,242,101,225,232,209,163,219,204,150,172,111,190,249,166,197,210,165, 75, 47, 71, 71, 71, 67, - 34,145,224,230,205,155, 24, 50,100,200,229,229,203,151,183, 24, 53,106, 20, 54,109,218,132,152,152,152, 13,229,241,245,233,211, -103,214,176, 97,195,150, 93,184,112,129,116,118,118,134, 76, 38, 67,247,238,221,177, 97,195, 6,142,209,104,220, 24, 22, 22,118, - 55, 44, 44,236,174, 41,225,228, 15,123,215,207,191,250,240,254, 93,140, 25, 55,145,167, 51, 26,166, 88, 80,125, 86, 45,145,228, - 25, 91,181,202,218, 99, 48, 20,244,225,114, 69,182,119,239,202, 35, 54,110, 44, 22, 91, 83,167, 78,133,173,173, 45, 80,232,192, -140,114,172, 58, 35, 14, 30, 60, 88,220, 31,218,219,219,131,199,227,129,203,229,130,166,105, 80, 20,133,211,171,197,248,125,106, -161,190,248,125, 42,129,147, 43, 9,213,135,252,118, 34, 55, 4,200,156,121,119,191,218,236, 31, 24,208,214, 30, 87,119,165, 98, -126,167,168,196,155,123,222, 76,208,164,227,151, 50, 62,214, 96,210,164, 73,126,233,233,233,184,117,235, 22,110,221,186, 85,150, - 5, 72,115,248,240,225,159,243,243,243,225,233,233,137,110,221,186,181, 2,208,168,140,118,131,134, 13, 27,162, 75,151, 46, 8, - 13, 13, 69,253,250,245,161,211, 27,233,176, 1, 35,234, 60,138,121,227, 54,127,241,124,209,217,115, 7,200,203,151, 47, 80,219, -246,159,180,109, 26,250,217, 50,174, 84,113, 29, 66,123,133, 37,245, 44, 48,101, 34, 72,209, 1,107,207,140, 35, 87,156, 15,151, -108,137, 88,225, 37,149, 74,137, 59,183,238, 26,182,172,218, 19, 31, 32,238,150,126,125, 87, 38, 10,136, 84,180, 29,236, 73, 50, - 64,175,127,202,200, 46, 16, 8,150, 94,184,112,193, 69,175,215,227,225,195,135, 24, 63,126,188,230, 3, 41,139, 13, 32, 30, 30, - 30, 56,127,254, 60,250,247,239,175, 73, 75, 75,187,246,119,213,169,164, 22,249, 95, 1,167,132,130, 44, 70, 66, 66, 66,142, 76, - 38,115,171, 83,167, 14,169,211,233, 10,151, 36,246,237, 51,173,223,184,241,136, 70,163, 25, 7,128,187,242,183,223, 86,187,185, -187,135, 14, 24, 56,144, 48, 24, 12,232,212,169, 19, 47, 50, 50,210,254, 85,122,122,158, 5, 3,206, 91,223, 55,104,208, 32, 44, - 93,186, 20, 0, 48,118,236,216, 98,211, 58, 97,129,195,146,196, 22, 29,219,119,110,104,147, 32, 94, 97,163,111,102,200,175,241, - 82,122, 93,156, 47,108, 8,146,199,129,128, 2,163, 55, 24,159,167,247,184,253,242,121, 93, 63, 97, 86,102,205,118,254,159, 96, -253,169,173, 29, 11, 76,154, 61, 22,119, 56, 34, 81, 99,137, 68,130,219,183,111,103, 53,108,216, 48,135,101, 89,219, 57,115,230, - 56,136, 68,162,198, 31,112,239, 95, 63,123,246,172, 85,243,230,205,191, 38, 73,178, 29,195, 48,167,211,210,210, 86, 2,120,109, -225,231, 71, 3,248, 17, 64,241,204, 82,167,211,129, 36, 73,176, 44,139, 62,125,250, 96,234,212,169,126, 15, 30, 60,192,217,179, -103,229,237,218,181,187, 14, 32, 7,192, 80, 0,165, 90,205,148, 74,165,250,230,205,155,194,179,103,207,130, 97, 24,200,229,114, -216,216,216,128,207,231,163,123,247,238,146, 41, 83,166,180, 61,113,226, 68,186,178, 70, 53, 74,144,146,164,226, 75, 36, 82,184, -184,181, 28,213,239,203,104,150,101, 15, 86,162,115,224, 9, 57, 70, 13, 97,210,146,139,102, 46, 39, 69, 92, 46, 33,224,114,192, -103, 10,240,195,207,243, 8, 46,107,226,160,146,235,243, 92, 46,151, 43,229, 67, 71,241, 40,131,136, 0,251, 49, 26, 7, 69, 81, - 60, 1,183,108,127, 12,154, 36, 73,146, 36,185, 0, 44, 78,218,199,231,243,185, 82, 62, 91, 38,167,144, 34, 40,130, 32,120, 40, - 99, 39, 90,144, 11, 88,179, 21,137, 55,238,149,182,164, 40,110,217,178, 37,142,156,189,141,125, 17,167,145, 17,119, 31,211,191, -255, 6,141, 26, 53, 66,100,100,100,185,101, 50,251,104,149,101, 93,118,117,117,141, 74, 78, 78,110, 80,214,103,203, 91, 50, 44, -195, 74,245, 62,255, 76, 91, 4,207,142, 70, 5, 62, 90,221, 90,182,108, 57,102,199,142, 29,186,207, 63,255,156,215,167, 79, 31, - 4, 4, 4,180, 24, 60,120, 48, 0,160, 93,187,118, 88,186,116,105,139,193,131, 7, 99,247,238,221, 56,112,224,128,182,117,235, -214,223,159, 63,127, 62, 9,133, 59, 58,223, 3,195, 48, 93,214,172, 89,243,174,165, 16, 70,163, 17, 6,131, 65, 97, 52, 26, 21, - 69,125, 17,150, 45, 91,158,113,242, 68, 36,190,159, 54, 27, 78,142, 46, 65, 22, 62, 67,196,160,137, 19, 51, 54, 47, 94,140,197, -187,119, 99, 98,205,154,162,173,143, 31,227,164, 70,131, 61,103,207,102, 20,125, 79,133,190,153, 42,149, 74,125,244,232, 81,155, - 61,123,246,192,206,206, 14,181,107,215,134, 92, 46, 7, 77,211, 32, 41, 33, 40,174, 12,117,252, 27, 3,184, 9, 0,168,233, 10, -149,175, 39, 46, 19, 4,114, 88,178,242, 62, 69,252,106,168,225,224, 46,184, 48,102, 83,128,157,141, 19, 23,199, 87,198,227,196, -138,132,131,154, 12,252, 10, 35,158,162,108,159,175,134,158,158,158, 72, 79, 79,199,209,163, 71, 85, 64,153,130, 12, 12,195,252, -252,219,111,191, 77,154, 54,109, 26,223,215,215, 23, 0,130, 0,220, 42,237,189, 98,177, 24,110,110,110,197,194,178, 79,248, 40, -175,145, 19, 70, 9,123,124, 22, 10, 14,199, 1, 57, 42, 3, 50,243, 12,144, 57, 72,240,253,132, 48,193,233,134,110,141,214, 44, -223,126, 88,173, 70, 35,224,253,254,128, 32,112,235,198,253,203,245, 4,190, 0, 65, 2, 9,228, 57, 16, 32,144, 79, 24, 64, 80, - 20,107, 50,153, 16, 31, 31, 15,150,101,209,191,199,144,132, 17,243, 15, 56,181,232,175,132, 71, 29, 87, 16, 44, 62,249,167, 8, - 1,123,123,251,160,204,204, 76,188,126,253, 26,225,225,225, 73, 25, 25, 25,167, 84, 42,213,144,228,228,100, 0,200,170, 2,101, -177,152, 15, 10, 10, 66,227,198,141,209,187,119,111, 65, 65, 65, 65,152,151,151,151,219,155, 55,111,154,253,149,245,121, 87,139, -252, 79, 9,173, 82, 27,154,193, 80, 71,187,122, 53, 84,167, 79,131,119,242, 36,246,184,186,230,107, 52,154,239, 0, 36, 20, 53, -252,111, 54,109,222,124,165,235,181,107, 54,186,232,104,120, 61,120, 0,218,206, 46,168,178, 5,216,184,113, 35,148, 74, 37,114, -115,115, 1, 0, 43, 86,172,128, 82,169,132,209,194,132,179, 28, 46, 90,184, 56,213, 68, 42,158,131,225,144,146,216, 58, 5, 77, - 36, 26,105,178, 91,188,179, 42,151,116, 67,116, 92,136, 88,157,169,107, 66, 80, 58,104, 50, 10,224,214,188, 54, 56,224,180,168, - 76, 25,205,235,254, 28, 14, 39,235,217,179,103, 93,124,124,124, 34, 0, 56, 84,197, 31,224, 29,188, 72, 75, 75, 27, 87,149, 15, - 82, 20,245, 99, 76, 76,140,211,134, 13, 27,190,158, 51,103, 14, 91, 82,104,153,255,207,225,112,192,178, 44,108,109,109, 65,211, -180,243,213,171, 87,157, 67, 66, 66, 86, 49, 12, 19, 84, 70, 61,217,128,128, 0,196,196,196,128,195,225,192,214,214, 22,140, 81, -143,217, 19, 70,193, 68,241, 57,147, 39, 79, 14,234,217,179,231,195, 13, 27, 54, 24,108,154, 54,111,150,153,153,249,104, 76,255, - 1, 15, 15, 29, 58,164, 43, 10,241, 80,241, 20,159,101,239, 62,127,254,156,114,119,117,166, 88, 99, 1, 35,230, 2,130,251,203, - 88,158,196, 5, 2, 14,197,114, 9, 18,124,129,208,246,117, 98, 98, 38,195, 48, 79, 44,225,100, 24,230, 78, 76, 76,140,208,217, -201,158, 83,160,214,229, 11,105,150, 23,123,231,246,171, 26,193, 13,189, 0, 64,115,231,230,121,126,157,186,194,216,180, 55,226, -154, 53,107, 90,196,169, 86,171,239, 38, 37, 37, 81,206,206,206,156,184,132,196,195,118, 18,177,163,141,157, 93, 19, 0,208,231, -229,222, 36,181,218, 55, 20,205,113,126,147,153,153,165, 86,171, 99, 44,173,251,203,151, 47, 57, 10,133, 19,117,252,228,153, 8, -103, 17,223, 73,202,227,216,240, 9,130, 16, 81,132,146,107,100, 50, 4, 34,145,211,235,196,196, 44,150,101,203,180, 16, 46,204, - 25,208,163,240,247,154,189,187, 4, 55,238,223,191,143, 99,151,159, 64,204,234, 64,104,114,113,114,211, 58,244,159, 60,237,131, -253,254, 42, 18, 91, 85,178,102,173,169, 27,245, 14, 63, 82, 42,112,132,239,223,191,255,236,109,219,182, 21, 59,160, 60,121,242, - 4,109,218,180, 49, 47,115,160,125,251,246, 8, 9, 9,193,147, 39, 79,224,237,237,141,179,103,207,242, 41,138,226, 15, 24, 48, - 96,254,246,237,219,143, 86,104,247, 95,187, 22, 67,134, 12, 41,205,177,250, 37, 0, 13, 33,243,205,159,186,112,139, 67, 86,102, - 6,210,223,164,222,181,244, 62, 16, 4,129, 65, 19, 39,102,172,209,233,176,227,198, 13, 12, 20,139, 69,155, 95,188, 64,167,144, - 16,212,107,211, 38,195,146,190,206,108,213,209,104, 52,160,105, 26, 54, 54, 54,176,183,183, 7,151,203, 5, 69,187,130,195, 11, - 4,201,229, 34,184,101, 32, 22,127, 39, 46, 8,239,128,229, 4,129, 28, 62, 15,119,184,162, 50,125,117, 8,113, 53,116,103, 89, - 40, 11, 18,112,206, 44, 72,108,171,195,150,150,210, 39,135,173,242,181,179,113,226,226,216,242, 56,156, 92,149,184, 95,147,138, -233, 69,247,130, 41,103, 34, 81,207,206,206, 14, 9, 9, 9,136,143,143,127,140,242, 29,252, 11,158, 60,121,242,138,207,231,251, - 57, 58, 58, 2,128,103, 89, 19,115,134, 97,138,253,176,182,238,216,235, 16,212,202, 75,240,105, 11, 63,108,137,152,135,175,194, -150,131,166, 8,152, 76,122,252,186,180, 51, 76,218,124,132,117, 29, 65,124,210,206, 59,240,116,132,110,152, 65,157,189,238,189, -137, 0, 7,115,255,211,247,170, 29, 95, 66,214, 3, 67,216, 57, 56, 56,137,185, 92, 46,236,109, 20,186,105, 35,191, 77, 97, 89, -182,184,221,208, 20,215, 64,230,201,213,153,169,249, 66, 59, 90, 13,176,100,141,170, 69,179,249,248, 72, 76, 76, 28,215,170, 85, -171,249,121,121,121,217, 42,149,170, 63, 0,120,122,122, 86, 39, 73,146, 15,160,188,213,145,234, 40, 61, 44, 4,247,193,131, 7, -144, 74,165, 72, 74, 74, 42,105,124, 1,195, 48,255,152, 77, 0,255, 80, 4, 3,184, 3, 64, 1,160, 19, 74,132,119, 32,139, 76, -117,159, 68, 70, 70,178,145,145,145,159, 20, 15, 94, 44,203, 24,179,178,192,106, 11,239, 45, 77,211, 44,128,146, 59,154, 68,118, -118,118, 4,237,238, 14,130, 95,232,250,193,126,196,173,175, 6,131,101,161,101, 24, 19, 40, 16,122,176, 37, 38, 45, 42, 1,129, -121, 14,109, 49,142, 55, 3,169, 60,187,146, 35, 29, 96,100, 97, 2, 67, 85,178, 56,172, 74,165,130,209,104,148,213,170, 85,235, -136,209,104,148, 21, 13,110,236,127,235, 23, 53,153, 76,175, 40,138,194,215, 95,127, 13,179,245, 71,167,211, 33, 53, 53, 21, 90, -173, 22, 58,157, 14, 49, 49, 49,200,205,205,133, 78,167,195,163, 71,143,224,233,233, 9,138,162, 20,229,116,230, 44,203,178,240, -240,240, 64,141, 26, 53, 64, 17, 44,214, 47,154,133, 31,198,143, 66, 95, 79, 6, 27, 87,254,138,214,173, 91,215,173, 89,179,102, - 83, 14,135, 99,114,113,113,225, 30, 56,112,224,176,201,100,234, 14,203,123,158,163, 83,167, 78,173,225,239,239,239,100,103, 35, - 53,240,121, 20,120, 6, 21,203,215,102,178,156,130, 12,120,120, 84, 55, 66, 40,242, 30, 56,112,160,169, 44, 43, 68,105,156,223, -125,247,157,194,215,215,215, 86,102, 39, 85,241,104, 42,157, 11, 54, 35,247,254,173,235, 0,192,115,116,210, 64, 32,242, 11, 15, - 15, 55, 86,134,115,198,140, 25,158,142,142,142,118, 36,216, 60,147, 94,255,231,122,187, 86,151, 73,208,180, 26, 92, 94,195,177, - 99,199, 18,149,225,156, 52,105, 82, 77, 63, 63, 63, 59, 59, 27,113, 62,135,166, 82,184, 12,147, 34, 0,147, 74,235,244,217, 2, - 71,135, 2,136, 36,193, 3, 7, 14, 44,147,211,108,205,154, 50,101, 74,194, 59,194, 27, 89, 89, 89,208,164, 62, 4, 55, 41, 26, -129, 18, 26,141, 28,101,224,243,249,197, 91,223,203,122, 92,203,242,209, 42, 77,108, 89,250,217,134, 63,149,179, 4,184,166,110, -212,187,113,179,146,147,147,161, 80, 40,202,109, 79,219,183,111,159, 22, 26, 26,154,222,190,125,123,221,145, 35, 71, 64, 16, 4, -206,158, 61,139,164,164, 36,180,111,223, 30, 44,203,154,119,181,225,238,221,187,104,215,174,157,174, 85,171, 86, 73, 69,241,181, - 42,196,144, 33, 67, 96, 48, 24,144,159,159,143,172,172, 44, 68, 70, 70, 34, 48, 48,144, 21,137, 68, 61, 41,143,207,230,133, 13, -155,214, 44,160,126, 16, 86, 45, 95,172,227,113,232,133,149,105,175, 4, 65, 32,252,187,239, 50,114,131,131,179,182,170, 84, 5, -131,108,108, 68,181, 18, 18,228,183, 79,156,112,208,235,245, 22,113,152,173, 58,238,238,238,197, 34,139,203,229,130,195,115, 4, - 37,174, 7,158,125,123,136, 92,122,226,220, 29,190,214, 86,140,131, 82, 9,142,139,237,202, 14,237, 32,242,192,188,102,125, 20, - 7,154,247, 85,156, 17, 85,195,134,162,241,128,100, 57,196,129,193,191,250,212,114,172, 33,196,181,189,169, 56,185, 42,241, 15, - 77, 42,102, 1,120, 81, 81, 59,215,235,245, 26,147,201, 4,146, 36,193,225,112, 74,250, 4, 94,249,227,143, 63,112,251,246,109, -160, 68,216,158,188,188, 60, 19, 69, 81, 16, 8, 4, 0, 32, 41,167,191, 3, 77,211,160,105, 26,231,175, 95,180,239,251, 69,103, -226,234,189, 83,104, 30,216, 15,153,249,122,164,229,234,145, 83, 0,248, 55,154,142,128,118, 7,113, 63, 38, 15, 65,245, 3, 40, -138, 39, 14, 47,141, 79,243, 26, 9,170,120,244,202,124,204,212,214, 37, 10,143, 93, 59,244,228,241,197,125,247, 31,237,250, 45, -226, 69,179, 70,173, 84, 69,198, 4,228,231,231,179, 4, 65,176,223, 14,159,246,106,235,144,108,211,242,254,247, 25,142, 86,240, -242,111,236,234,171, 59, 58, 58, 94,181,183,183, 63, 91, 36,142,170, 75,165,210, 43, 10,133, 34, 26,133, 27, 61, 14,165,164,164, -248,170, 84,170,230, 40,220,156, 21,151,153,153,217,166,200,242, 20, 87,142, 37,108,131, 82,169,252,198,100, 50,117, 45, 58, 58, -152, 76,166,160,231,207,159,251, 5, 5, 5, 61,246,242,242,186,235,229,229,117,204,203,203,235,176,151,151,215,225,208,208,208, -165,230,112, 15,127,241,178,225,123, 90,228, 95, 38,180, 80, 36,178,214, 22,189,162, 88,104, 1, 56,255,174, 3,154,145,207,127, -100, 28, 51, 6,118,135, 15,131,126,254, 28,131,195,195,109, 68, 34,209,114, 20,198,104,106, 46,145, 72, 86,205,154, 53, 75,234, -176, 96, 1, 92, 47, 94, 68,108,100, 36, 12, 52,125,171, 42,165, 83,171,213,224,112, 56,197,150, 24,177, 88, 12,147,201,132,210, - 76,190,239, 53, 64, 35,174, 37,165, 69,131,135, 26, 96,192,230, 31, 87,182,186,209,239,213,116,167, 72,165,167,247, 11, 21,215, -251, 39,199, 38, 78,203,171,183,184,161, 34, 56,249, 60, 59, 1,226,227, 19, 96, 2, 83,169,245,102,141, 70,147,171, 82,169, 16, - 20, 20,100,127,251,246,237, 90,129,129,129,242,162,235, 55, 63,240,135,105,234,234,234,186,215,205,205,237,181,171,171,235, 94, - 0, 77, 43,241,217, 13,151, 46, 93, 2, 69, 81,152, 53,107, 22,242,242,242,160,215,235,145,153,153,137,248,248,120,232,116, 58, - 36, 38, 38,226,233,211,167,208,233,116,136,141,141,133, 86, 91,241,132,132, 97, 24,216,216,216, 64,163,206,199,239,243,126,192, -140, 41, 19,144,251, 50, 10,137,201,105,176,179, 21, 99,220,184,113,148, 76, 38, 99, 24,134,169, 97, 50,153,218, 49, 12,179,218, -146,223,169,196,243,118,217,195,195, 35, 96,209,162, 69,126, 63,204, 91,205,181,225,228,179,124,169,128,225, 73,249, 44,175,110, - 19, 12,153,190,156,187,108,201, 47,207,174, 93,187,150, 4,203,130,119,146, 0, 46, 7, 7, 7,251, 36, 37, 37, 5,250,250,250, -214,113,168, 94,147,207, 87,184,229,112, 21,213,148,172, 86,115,131,112,171,214,114,245,234,213, 15,175, 92,185,146, 92, 25, 78, -177, 88, 92,119,203,150, 45, 1,206,206,206, 1,180, 80, 40, 40,200,205,221, 99, 44, 80,237,165,236,100, 2,210,198,174,195,193, -131, 7,163,246,239,223,159, 90, 25, 78,111,111,111,223,121,243,230,249,215,171, 87,207,223,197,179, 22, 95,232,230,145, 41,112, -175,158, 41,172, 23,200,135,123,141,207, 87,173, 90,117,247,218,181,107, 22,113, 82, 20,101, 36, 73, 18, 52, 77, 67, 36, 18,225, -248,241,227, 24, 51,172, 31, 60,220,236, 81,199,215, 23,109,191,250, 6,251,247,239, 47,246,225,161, 40,170,204, 17,125,243,130, -113, 17,193, 10, 34, 10,107,234, 70, 97, 77,221,168, 96, 5, 17, 85,166,216, 42,250,123,105,239,177,168, 55, 42, 99,185,209, 2, -177,117,244,252,249,243, 63, 15, 26, 52,136,215,177, 99, 71,220,184,113, 3, 67,134, 12,185,124,224,192, 1, 0,192,141, 27, 55, -240,237,183,223, 94, 62,115,230, 12, 70,141, 26,133, 54,109,218,240, 46, 93,186,180, 10, 22,196,254, 49, 26,141,216,184,113, 35, -140, 70, 35, 36, 18, 9,228,114, 57, 58,119,238,140,135, 15, 31,142,218,180,105, 83, 52, 69,211, 95,118,234,250, 5,142, 28, 62, -128,167,143, 30,142,218, 60,127, 64,165,131, 2,147, 36,137,142,225,225, 25, 25,254,254, 89,155,149,202,130,161, 50,153,200, 55, - 53, 85,126,110,239, 94, 7, 11,132, 26, 97, 50,153,138,197,149, 89,116,152, 15, 14,207, 17, 28,113, 0, 56,210, 70,184,255,130, -107,224,134,224, 14,175, 17,158,148, 23, 63,139,230,145, 67,122,254,224,137,158, 63,120,162,219,228,154,131, 69,213,176, 94, 92, - 13,163, 59,142,175, 17,234,213,200, 22,202,116, 61, 34,127,141,141,211,100, 98, 1,128,167,150,180,115,134, 97, 30, 39, 37, 37, -129,199,227,161, 90,181,106, 62, 0,204,126,129, 27,134, 15, 31, 62,246,167,159,126,154, 0,224,167,162,107,146,208,208, 80,255, -252,252,124, 60,127,254, 28, 0,110,151, 99, 13, 46,222,101,152,165,140,229,215,116,173,135,192,186, 35, 33,147,213, 71, 82,150, - 14,201, 89, 58,172,255,189, 59,162, 46,205,197,237,147, 3, 17,151,154, 10,161, 75, 15,152,140,218, 0, 11, 38,245,174,247,238, -221, 35, 46, 93,186, 68, 48, 12, 3,131,193,192,230, 41,149,236,157,203,151,161,190,112,129,176,177,177, 33, 90, 52,110,149,191, -121,238,145,155, 7, 87, 94,190,173, 47,168,244, 68,253, 67, 48,227,213,171, 87, 77,247,238,221, 27, 10, 96, 70,189,122,245,174, -197,199,199, 55,187,120,241, 98, 29,119,119,247,229, 85, 37, 53,135,133,136,141,141,125,235, 40, 10, 11,161, 43, 18, 13, 29,139, -196, 92, 55, 0,223,226, 3,118,217, 87, 2,231,255,197,206,240, 71,240,206,110,195,119,133, 86,201, 64, 97,240,146,201,164, 6, -131, 62,241,212,169, 83,122,146, 36, 33, 18,137, 48,104,200, 16,242,247,223,126,107,217,175,105,211,179, 35, 62,253,244,216,217, - 51,103,130, 67, 66, 66,192,178, 44, 72,146,196,238,221,187,213, 26,141, 58,211,195,195,195,206,146, 78,163,100, 3, 82, 42,149, -197, 66, 43, 55, 55, 23,206,206,206, 22, 47, 29,170,148, 56,125,230,120, 84, 54,107,250, 42,190,227,139, 37,250,133,169,221, 67, -114, 24, 19, 39,215,100, 64,174,154, 69,158, 6,156, 27,164, 60,100,144,119, 15,125, 76,187,144,167, 23,162,175,102,106, 76,154, - 74,237,150, 72, 79, 79,255, 33, 44, 44, 44, 83,161, 80, 16, 54, 54, 54,112,115,115, 35,187,117,235,150,145,144,144,240, 83, 85, -127, 17,123,123,251,190,161,161,161, 17, 73, 73, 73,189, 46, 92,184, 80,227,226,197,139,189, 66, 67, 67, 35,236,237,237,251, 90, - 72,177,103,218,180,105, 42, 30,143,135, 38, 77,154, 32, 47, 47, 15, 69,187,124,202, 61, 44, 89, 34,229,114,185, 88,179,232, 71, -204,152, 50, 1, 89,209, 55,112,255,242, 41,156, 79, 37, 48,125,222, 47,224,114,185, 85,138,245, 85,219, 81, 84,175,158,171,244, -201,183, 67,250, 36, 79,157, 50, 69,122,247,238, 93,122,236,248,111,217,216,148, 44,240, 58, 46,166,240,201, 15,228, 61,149, 35, - 58,117,104,139, 89, 51, 38,214, 43, 10,218, 89, 46,234, 58,138,234, 5,184, 74, 31, 79, 28,209,239,213,248,241,227,133, 11, 23, - 46,212, 52,109,218, 84,157,150,150, 38, 20,203,228,190, 28, 91,187,128,216,148, 84, 73,211,166, 77, 99,190,250,234,171,156,202, -114, 78,159, 62, 93,116,226,196, 9, 78, 88, 88,152, 49, 59, 59, 91, 66, 11,133, 65, 4, 95,208,248, 77,118,182,109,175,176,176, - 23,189,122,245, 42, 40, 10, 88,106, 49,231,204,153, 51, 69, 79,159, 62,229, 52,109,218,212,144,154,154, 42, 21,219, 59, 4, 82, -118,242, 70,175, 83,210,108, 26,135,132,188, 28, 59,118,172,170,188,114,150, 20, 41, 82,169, 52,169,121,243,230,248,245,215, 95, -177,108,217, 50,124,254,249,231,120,248,232, 33, 58,141,157, 0,191,209,223,226,240,213,235, 72, 74, 74,194,156, 57,115, 16, 24, - 24, 8, 46,151,251,180,212,246, 56, 42,154,184,155, 10,226,110, 42, 8, 98, 84, 52, 97, 62, 47,211,178,245, 83, 46, 74,190,191, -180,247,221,158, 89,186,165, 43, 88, 65, 68,149,231,135, 85,145,216,234,213,171,215, 24,115, 8,135,161, 67,135, 94, 94,190,124, -121,139,161, 67, 11, 39,218, 77,154, 52,193,220,185,115, 91, 76,159, 62,253,242,188,121,243,208,182,109, 91,120,121,121, 85,184, -241,197,100, 50,193,104, 52,162, 95,191,126, 48, 26,141,120,243,230, 13,158, 61,123,134,181,107,215,130,101, 89, 1, 0, 40, 92, -221, 27,242,120, 60,220,187,115,171, 96,198,208,144,237,149,176,100, 17, 37, 39, 49,249,249,249,232, 53,122,116, 70, 98,237,218, - 89,171, 51, 50, 10,134,201,100,162,154,113,113,114,169, 78,231,134,114,252, 18, 9,130, 0,195, 48,197,194,202, 44,184,222, 61, -138, 6, 74,139,160, 47, 96,142, 94,220,150, 12, 0,104, 53,192, 21,221, 38,215, 28,172,240, 22,173,104,217,191,208,232,189,127, -238, 43, 54, 47,217,180, 16, 6, 60,174,132,197,250,198,141, 27, 55, 96,103,103,135,176,176, 48, 62, 73,146, 11,204,243, 85, 20, -198,206, 90, 98,230,226,243,249,139, 7, 14, 28, 72,230,228,228,224,254,253,251, 0,112,166,172,126,137,101,217,226,186,231,103, - 17, 48, 49, 60, 92,185,115, 28, 39, 47,238,195,235,164, 55,136, 75,215, 0, 28, 91,104, 84,137,208,171,147,160,203,185, 3,165, - 86,100, 81,129,185, 92,238,155,122,245,234,177,141, 26, 53, 98, 89,150,197,203,151, 47,141,177,113,113,198, 91, 75,151,178, 15, - 70,142, 36,164,207,158,113,133, 66, 33,225,233,233, 9,129, 64,192, 8, 4,130,204,191,113,240,254, 75,194, 45,252, 5, 97, 33, - 62,166, 85,139,197,191, 19, 41,120,123,183, 97,113, 0,211,210, 2,150,130,181, 17,246,217,183,234,119,219,176,126, 3, 84,129, -129,129, 50, 55, 55, 55, 16, 4,129,238, 61,122, 16,161, 23, 46, 72,105, 87, 87,216, 55,104, 80,188, 28,113,250,212, 41, 28, 63, -126, 92,117,228,143,131,110, 67,134, 13,235, 2, 96, 75, 57,133,225,240,249,252,226,239, 77, 73, 73, 1,159,207, 47,246,137, 80, - 42,149,112,116,116, 68, 74, 74, 10, 44, 92,153,219, 58,117,202,245, 41,233, 33, 63,120,134, 72,105,226,152, 42, 21, 38,150, 5, - 77,152, 0, 53, 11,131, 9,208, 26, 88, 52,172, 73,201, 79,170,141,178,200, 27, 7, 98, 0,108,173,204,221,211,106,181,231,238, -222,189, 59,146, 97,152,125, 0,200, 11, 23, 46, 48,143, 31, 63, 30, 3,203, 29,215,223, 55,219,139, 68,147,207,158, 61, 43,159, - 60,121,114,118,100,100,100,110,231,206,157,109,215,174, 93, 43,111,211,166,205,228,204,204,204, 93,150, 24, 2,227,227,227,183, - 36, 36, 36,140,105,212,168, 17,178,178,178,160,215,235, 17, 21, 21, 5,111,111,111,220,190,125, 27, 62, 62, 62,184,117,235, 22, -234,212,169, 3,147,201, 4,141, 70, 3,134, 97, 76, 21,117,230, 89, 25,111,128,204,120, 36,223, 56,134,103, 15,162,112, 54,153, -192,202, 93, 17,168, 86,195,179, 74,113,106,124,156, 68,254, 10, 71,251,147, 11,103,207,116,138, 61,183, 27, 7, 54,174,100,206, - 31, 59,230,199,147, 98,228, 39,253,190,249, 66,103, 64,117, 0,188,102, 33,141,208, 81,246,212, 36,170,129,212,179,143,203, 15, -176,232,227, 36,242,119,118,176, 63,241,159, 5, 63, 73, 95, 30,223,140, 61,107,126,101,247,111,219, 25,168, 1, 66,252,253,253, - 59,146, 36,105, 7, 64, 83,228,231,101, 81,106,155,210, 56, 79, 71, 68, 4,107,128,144, 67,135, 14,117, 20,137, 68, 46, 0, 12, - 5, 5, 5,175, 62,132,243, 76,100,100,176,185,156, 4, 65, 56, 1,208,179, 44,251, 18,149, 76,193,211,187,119,239,185,223,126, -251,237, 20,147,201,228, 88, 98,118, 78, 45, 94,188,152,195, 48, 12,197,178,172,158, 36, 73,253,137, 19, 39, 76, 70,163, 49, 89, -163,209,140,254,144, 94,228,139, 47,190,192,245,235,215,103,163,112, 19,134,165,214,234,183,252,180,138, 82,246, 84,153,255,194, -133, 11,115,190,252,242,203,169,187,118,237,122,182,124,249,242,174,163, 70,141,194,238,221,187, 81,187,118,109,220,187,119, 15, - 63,252,240, 3, 0,180,152, 62,125,250,225, 13, 27, 54,120,197,198,198, 46,182,192,162, 1,163,209,136,157, 59,119,162,123,247, -238,112,116,116,132,171,171, 43, 8,130, 56, 55,108,216,176,223, 0,128, 34, 40, 46, 0,104, 53, 90,173,175,111, 35,139, 45,184, - 92, 46,183,184,175, 75, 77, 77, 45,222, 41,248,217,151, 95,102,172, 95,184, 16,219,213,106, 12,147,201, 68,137,238,238,138,195, - 47, 95,142,120, 84,216, 57,179,229, 89,117, 42, 18, 89,150,186, 52,168, 83, 48,237,143,249,175, 93, 0,124,222,106,128, 43, 90, - 13,112, 69,163,110, 78, 4, 73, 17,120,112, 50, 19, 15, 79,103,237, 55, 40,113, 14,149, 75,151,243,120,193,130, 5,135, 63,249, -228,147,174,117,235,214,197,240,225,195,191,218,184,113, 35,215, 96, 48,140,199,159, 97, 30,108, 73,146,252,105,205,154, 53, 35, -228,114, 57, 46, 93,186,132,139, 23, 47,158, 3, 16, 95, 86,191, 4,160, 56,102, 86, 53, 15, 31,205,211,216,124, 81,122,210, 21, - 92,190,244, 7,106, 7,126, 3,161, 75, 23,200,125,231, 65, 31,189, 12,186,204,147,144,123,116, 70, 98,236, 75, 80, 28,254,195, -138,156, 80, 88,150,125,148,152,152,232,229,229,229, 69,188,126,253,218, 8,128, 53,153, 76,172,190,101, 75,131,223,194,133,244, -195,175,190, 34,154, 61,125, 74,177, 4,193, 68, 69, 69, 1,192,147,255,198, 40,110, 14,183,240,240,225,195,178,194, 45, 84, 10, -245,234,213,107,113,241,226, 69,190, 70,163,193,249,243,231,209,184,113,241,222,174,255,106,244,251,146, 90,228, 95,134, 17,165, - 92, 91,251,150, 69,235,173, 7,155, 33,232, 58, 62, 62, 38, 46,137, 77,221,187,116, 41,184,123,247,110,241,172, 79,115,243, 38, - 84,199,143,195,100, 50,129,101, 89, 92,188,112, 1, 3, 7, 12,200,167, 41, 98,125,205,154, 53, 88,130,125, 43,118, 75,187, 82, -102, 15, 97, 97, 97, 97,197,157, 79, 66, 66, 2,196, 98, 49,120, 60, 30, 24,134,129,209,104, 4, 69, 81,176,181,181,133,209,104, - 44,205, 4,243, 46,167,193,148,165,234,181,161, 83,255, 20,215,124, 61, 59,210,174, 38,170,115,133,197,141,211,197,134, 64,215, - 64, 26, 14,156,116,246,204,226, 79,147, 25,109,102, 47,188,191,163,171,162, 45,255, 62,245,235,215,255,109,224,192,129, 36, 0, -180,107,215,142,172, 95,191,254, 10,148,159, 42,167, 92, 78,129, 64,192, 7,128,136,136,136,172,103,207,158,125, 30, 17, 17,145, - 85,242,186,133,156,107, 23, 45, 90, 4,145, 72, 4,163,209, 8,157, 78, 87,236,159, 85,242, 85,175,215,195,193,193, 1, 71,142, - 28,129,201,100, 58, 82, 81, 57, 61,170,215, 0,225, 88, 11, 91, 34,206,226, 98, 6,183, 42, 34,171,152,179,150,139,184,142,139, -131,253,169,255,204,159,227,152,253, 34, 10,137,137,137,236,137,227, 71,174,105,128,164,220, 60,204,200, 81,161,142, 90, 7, 65, - 99, 47,196,159, 90,243, 61, 59,189, 21, 12, 40,125,215, 96, 49,167,159,139,184,142,155,163,253,137, 95,254, 51, 95,154,243, 34, - 10, 41,169,169, 56,122, 36,226,174, 6, 48, 47, 55, 14,102, 24, 38,128, 97,152, 0, 0,131,203, 17, 47,149,226, 44, 40, 40,168, - 87, 80, 80, 80,239, 99,114,178, 44, 91,143,101, 89,139, 57, 75,250, 68, 45, 89,178, 36, 58, 37, 37,101, 96,122,122,122,123,243, -145,157,157,221, 46, 63, 63,191,117, 65, 65, 65, 75,245,146, 26,182, 5, 5, 5, 78,249,249,249, 10,141, 70,211, 16, 64, 84, 37, -158,249, 98,148,140, 58,157,146,146, 50, 43, 37, 37,133,168,168,156,212,232,104, 98,199, 47, 19,255, 88,179,102,141,226, 3,249, -223, 42,103, 70, 70,198,190, 93,187,118, 5,121,122,122,122, 13, 30, 60, 24,171, 87,175,198,242,229,203,181, 0,176, 97,195, 6, -109, 9, 75,150, 71,108,108,108,163, 50,150, 13,219,149,176,150,108,253,236,179,207,216,139, 23, 47,162,123,247,238,197,129, 68, -215,173, 91, 7,163,209,168,108,219,182, 45, 3, 0,106, 77,129,146,101, 88,232,244,101,174,191,191,119, 63,121, 60, 94,135,146, -241, 2,205,193,152,121, 60, 30, 88,150, 69,157, 22, 45, 50,114, 2, 3,179, 54,230,230, 22,204,170, 87,207,102,132,175,239,224, -186,192,128,210, 56, 9,130,120,203,170,243,238, 81, 9, 75, 86,201,114,166,171,147, 49,252,143,249,175,143,155, 45, 91, 2, 9, - 7,154, 60, 35, 14, 46,124,253, 70,243, 6,235,202, 18, 63,229,213, 61, 43, 43,107,236,194,133, 11,181, 50,153, 12, 95,124,241, - 5,230,205,155, 55,172, 69,139, 22,185, 78, 78, 78,215,107,215,174,253,160, 79,159, 62, 41, 81, 81, 81, 99, 67, 67, 67,241,252, -249,115,252,242,203, 47, 57,217,217,217,253,203,227, 36, 8,162,216,146,215,173, 83,187,172,223, 87,252,202,180,253,100, 12, 68, - 66, 27, 24,104, 15,100,229, 27,144,173, 98,161,227,135,128,199,229,163,125, 83,127, 92, 63,177,185,192,164, 83,109,169,232,153, -207,207,207,223, 63,104,208, 32, 37,151,203,133, 78,167, 99,105,154, 6,191,208,239,152,161, 63,255, 92,223,236,241, 99,163,137, -101, 25,130, 32,240,221,119,223,169,178,179,179,119, 85,165, 29, 85, 2, 37, 57, 63, 86,184,133,118,239,140, 63, 31, 35, 44,196, - 95, 81,247,127, 51,214,150,114,252,105,209, 50,111,169, 52,191, 18, 4, 99, 50,153, 24,212,244,172, 41,141,125, 29,191,178,119, -239,176,161, 29, 59,118, 18,117,234,212, 73,224, 31, 93, 56, 27,141,136,136,192,129, 3, 7, 10, 78,158, 60,169,228,211,212, 6, -143,106, 30,206, 38, 19, 3,130, 96,202, 85,195, 82,169,116,252,180,105,211,132,185,185,185, 88,190,124, 57, 19, 20, 20, 68,138, -197, 98,232,245,122,108,216,176,193,224,239,239, 79,147, 36,137,220,220, 92,144, 36,249,212,194, 10,222,207,141, 79,106,255, 91, -104,207, 3,141,190, 30, 98,239, 23,218, 76,214,218,195, 13,134, 6, 44,146, 19, 94,227,217,153,147,217,143, 78, 44,205,132, 38, -173, 39, 42, 78, 15, 84,218, 64,240,227,201,147, 39,157,198,142, 29,203,106, 52, 26, 34, 62, 62,158,157, 63,127,190,211,240,225, -195,127, 76, 78, 78,238, 91,197, 31,133,200,201,201, 1, 65, 16, 76, 81, 71, 98,158,245, 87,102, 93,238,225,150, 45, 91, 14,245, -232,209,163, 91,219,182,109, 17, 29, 29, 93,188, 68, 88, 82,104,153,119, 31, 46, 88,176, 32, 7,192,212,138, 72,105,154,198,242, - 45,251,144,147,157, 1,103,103, 87, 8,132, 66, 84,117,135, 37,143, 36,103,253, 60,103,166, 83,198,147,235,196,195,107,103,153, -189,247,211,210,141, 38,182,244,136,255,121,201,108,145,250, 47,127, 54, 67, 82,179,126,158,255,147,173,121, 89,115,215,157, 20, - 37, 97, 98,199,126, 80, 19,249,183,112,254,205,112,117,117, 69, 74, 74, 10,225,234,234,202, 22,249,104,177,229, 8,173,183, 31, -240,194,229, 50,162,188,101,195,170,242,199,196,196,204,111,208,160,193,196,231,207,159,239,245,243,243, 27, 5,160,154, 86,171, -205,153, 62,125,250,127, 54,108,216, 48,212, 18, 75, 22, 0,236,222,189,123,233,144, 33, 67,142,119,233,210,229,123,134, 97,234, -151, 24,216, 99,156,156,156,138,151,112,223,164,165, 78, 25, 57,180,223,148,252,252,108,139,227,220, 73, 36,146, 17,211,167, 79, - 23,168, 84, 42,172, 90,181,138,241,247,247, 39,205,147,162,109,219,182, 25,125,124,124, 56, 97, 99,198,100, 44, 73, 77,197,220, - 75,151, 84, 83, 2, 2,130, 54, 62,123,214, 16, 12,179,181, 44,171, 78,105,150, 44,179,219, 69, 21,145, 92, 36,182,214, 1,248, -188, 89,111, 23, 28, 90,244, 26,217,177,186,255,192,136,151,176, 32, 45, 80, 41, 72,220,191,127,127,251,180,180,180, 67, 51,103, -206,180,109,216,176, 33, 2, 2, 2,104,137, 68, 18, 98, 14, 23,147,155,155,139,211,167, 79, 99,245,234,213,186, 71,143, 30,245, - 40,111,185,202,100, 50,165,251,248,248,152,239, 3, 75, 16, 68,166, 82, 75,216,238,169, 27, 34, 25, 60,114, 47,113,249,214, 85, - 36,235, 25,104, 13, 12,106,122, 6,163,245,231, 75,112,248,216, 3, 83,114,236,227,199, 6,117,246,122, 11,202,251,242,197,139, - 23, 7,231,204,153,211,251,251,239,191, 23,102,100,100,152,180, 90, 45,179,111,223, 62,106,240,224,193, 38,150,195, 97,184, 28, - 14,198,143, 31,175,206,201,201,249, 3,248, 91, 19, 76,255, 37,225, 22,254,130,176, 16, 31,205,154, 85,242,245,127, 5,165,182, - 80,134, 34,175,172, 94,243,123,135,221, 59,119,185, 80, 20,233,242,242,213,171, 91, 93,123,246, 74, 58,117,234,148,156,107,107, -219, 24, 0,163, 27, 53,234,154, 94,171,206,138, 60,116,168,122,205,154, 53, 2,139,146, 74,179, 12, 69, 94, 41,239, 11,243,243, -243, 85,151, 46, 93, 42,152, 58,117, 42,145,144,144,176,195,217,217,185,207,177, 99,199, 36, 61,123,246, 84, 71, 71, 71,239,119, -113,113,233, 22, 26, 26, 42,157, 56,113,162, 54, 63, 63,191, 50,137, 71, 31,179,111,178,235,222,156,185,248,203,155,139,126,255, - 20, 28,170, 57,180, 52,192, 24,174, 64,159,119, 10,192, 14, 84, 34,222, 81, 73,136,197,226, 64,145, 72,132,187,119,239,102,135, -132,132,232, 52, 26, 13,119,222,188,121,246, 98,177, 56,176,170, 55,158,101, 89, 54, 59, 59, 27, 12,195,112, 0, 16, 69,175, 96, - 42,191, 23,191,111,215,174, 93, 15,237,217,179,231,179, 78,157, 58,193,203,203, 11, 6,131, 1, 62, 62, 62,208,233,116,240,246, -246,134, 86,171,197,236,217,179,145,155,155, 59, 1,229,228, 60, 35, 8, 2, 70,163,177,216,217,214,205,189,122, 97,156,158, 15, - 8, 99, 33,166, 73,175,167,145, 27,145,158,153,193,236,185,151,150, 86,160, 55,181,127,241,166,224,209,187,239, 43, 48, 65, 21, - 58,120, 92, 18, 0,104,153,242, 51,206,139,121,240,122,118,100, 29,210,210, 51,176,251, 78, 74,142, 74,207,124,254,172, 20,206, - 74,149,243, 95,194, 25, 60, 59, 26,189,198, 89,254,222, 15,129,165,130,170, 44,220, 77, 5,113, 91,180,145,197,154,141,165,198, -200,250, 64,254, 67,207,159, 63, 63, 4, 0,143, 31, 63, 78,232,215,175,223,148,215,175, 95,207, 1,112, 52, 54, 54,118, 77,101, -136, 54,110,220,248, 28,192,144,242,222,179,107,241,144,131, 0, 14, 86,134, 55, 47, 47, 79, 19, 21, 21,165,153, 56,113, 34,145, -144,144,112,204,197,197,229,179,227,199,143,139,122,246,236,169,125,248,240,225, 25, 87, 87,215, 86,237,218,181,147, 28,189,113, - 35,169,224,229,203,200,200,196,133,151,166, 0, 0, 32, 0, 73, 68, 65, 84,215,175,221, 13, 12, 19, 89, 94,251,252,200, 34,235, - 45,177,117,112,238,235,159, 15,253,252,186, 29,163,197,126, 93, 54,174, 1, 72,252, 0,206,139, 87,174, 92,241, 27, 48, 96,192, -158,206,157, 59, 55,243,243,243, 67,181,106,213,240,236,217, 51,188,121,243, 6,247,239,223, 71, 68, 68, 68,132, 70,163,169, 48, -161,118, 86, 86,214,251,233,137, 4,114,215,205,171,102, 69,220,186,220,216,167,101,167, 65,194, 0, 87, 6, 58, 61,139,132,184, -151,152, 61, 99,125, 65, 74,220,243,199,122,163,190, 7, 44,220,168,163, 86,171,215, 46, 91,182,140,142,140,140,236,180,114,229, - 74,105,245,234,213, 41, 46,151, 75, 2, 96,111,223,190,205,142, 27, 55, 78,149,145,145,113, 68,169, 84,174,253,155,199,232,139, -175, 94,189, 10,166, 40,234,163,134, 91,248,128,176, 16, 86,124, 76,120,122,186,251,213,170,238, 58,202,171,154,251, 24,207,234, - 30,225,165, 57,185,123,201,100, 82,207, 26,110, 35,188,170,185,143,169, 85,221,117,148,167,167,187,159, 5,166, 69, 47, 27, 27, -155, 99, 10,133, 34, 8, 0,108,109,109,187,217,217,217, 61,178,181,181,237, 86, 52, 11,236, 38,145, 72,158,248,251,251, 15,255, - 27,205,149,229,114,250,248,248,244,203,207,207,255,202,199,199,167,159,249,252,229,203,151,197,231, 85,225,244,240,240,104,123, -251,246,237,190,139, 23, 47,254,162,118,237,218,221,230,207,159,255,197, 31,127,252,209,215,221,221,189, 97, 21, 56,249, 0,182, -211, 52,157,198,227,241,210,105,154, 78, 51, 31, 28, 14, 39,141,162,168, 52, 0,107,202,176,150,181, 43, 49,203,185,236,236,236, - 28,235,236,236, 28,235,226,226, 18,235,226,226, 18,171, 80, 40,222, 59, 28, 28, 28, 46, 91,122, 63,125, 93, 36, 45, 66,170, 73, -175,212, 83, 72, 46,215,117, 22,251,126,140,223,200,215, 69,210,162,113, 53,219, 43,245, 20,210, 75,255,223, 56,131, 92,192,178, -171,125, 89,118,181, 47, 27,228, 2,182,162,243,143,105,246, 87, 40, 20,172, 66,161,152,245, 87, 45, 37,148,193,255,183,183,247, -143,200,233, 37,149, 74,119, 85,171, 86,205,220,215,117,177,177,177, 57, 39,145, 72,186, 20,245,117, 93,196, 98,241, 5,127,127, -255, 65, 21,113,202,229,242,219, 78, 78, 78,169, 69, 71,138,179,179,115,138,179,179,115,138,147,147, 83,178,147,147, 83,178,163, -163, 99,146,249,176,179,179,187, 94,197,186, 59, 1,104, 2,160, 33, 0,155,143,120, 63, 61, 1,140, 44,234,131, 22, 2, 24, 14, -160,254, 71,248,141, 8, 90, 40, 31,205,183,243,184, 66, 75, 28,243,104,137, 99, 30,223,214,253, 74, 57, 41,120, 44,225,172, 35, -151,203,231,217,216,216,252, 33,149, 74, 47, 73,165,210, 67, 14, 14, 14,243, 1,212,249, 47, 61, 75, 18, 0, 27, 80, 24,159,233, - 40, 10,151,194, 15,161,112, 83, 65,245,127,224, 51,255,255, 25, 35,254, 91, 95,220,206,202,105,229,180,114, 90, 57,173,156, 86, -206,127, 33, 39,105,189,159, 86,161, 85, 73,161,245,238, 1,160,156,200,240, 86, 88, 97,133, 21, 86, 88,241,255, 24,140,245, 22, - 88, 81, 73,148,186,180, 76,148,163, 74, 43, 19,107,170, 42,202,246,180,149,211,202,105,229,180,114, 90, 57,173,156, 86,206,255, -119,156, 86,124, 68, 88,205,170, 86, 78, 43,167,149,211,202,105,229,180,114, 90, 57,255,215, 97, 93, 58,180,194, 10, 43,172,176, -194, 10, 43,172,248,139,176,182,132,224,122,107, 9,209, 42,180, 42, 15, 18,192, 87, 0,122, 1,168,133,194,108,246,251, 0,252, -134,170,173,233,219, 0,152, 2,160, 57, 10,119,231,196, 0,184,132,194,221, 57,249,214,219, 93, 58, 28, 28, 28,166,209, 52,109, - 7, 20,166, 54, 49,191,150,252,191,201,100,202, 81, 42,149,243,255,162, 34, 80,176, 48,130,178,185,172, 37,203, 86,242,213, 96, - 48,252,149,229,180,226,159, 9, 31,185, 92,190, 61, 43, 43,171, 63, 74, 36, 89,182,194,138,255, 5, 56, 58, 58,142,210,235,245, -211,185, 92,238,188, 55,111,222,252,254,255,168,234,239,137,172,183,132, 86,100,100,228, 5, 0,232,220,185,243, 39, 0, 96,103, -103,119,149, 36, 73,207,202,124, 3,195, 48, 49, 57, 57, 57,101, 6, 80,179,179,179,187, 74, 81,212,123,156, 6,131, 65,202,225, -112,242, 74,251,140,209,104, 76, 84, 42,149, 13,255, 33, 55,145, 0, 16, 41,147,201, 52,115,230,204,249,173,117,235,214, 30,201, -201,201,198,201,147, 39,183,186,119,239, 94, 39, 0, 29, 42, 41,182,154, 18, 4,177, 57, 40, 40,232, 96,120,120,248,158,144,144, - 16, 94,102,102,166,116,223,190,125,110, 91,182,108,137, 98, 24,166, 63,202, 73,180,250,255, 25, 52, 77,219, 37, 38, 38, 74,129, -194,212, 36, 69,194, 10, 6,131, 1, 6,131, 1, 42,149, 10,129,129,129, 31,253,123, 93, 92, 92,130, 9,130, 88, 41,145, 72, 26, -230,231,231,223, 2, 48, 38, 37, 37,229, 94,101,202,106, 52, 26,193,178,108,113, 57,253,252,252,172, 63,104,229, 48,140,199,227, -125,238,237,237,221, 88,171,213,102,199,196,196,220, 52,153, 76, 51,241,241,114,180,217, 2,152,201,231,243, 67,106,213,170,229, -241,252,249,243, 4,189, 94,127, 3,133,201,144,115, 63,134,200,250,228,147, 79, 46,175, 90,181,202,126,244,232,209,151, 47, 93, -186,212,194, 42,182,172,248,111,193,195,195,195, 78,165, 82,173, 7, 16, 76,211,180,139, 64, 32,128, 80, 40, 76,229,243,249,119, -133, 66,225,208, 43, 87,174,228, 84,150,211,100, 50,205,140,141,141,117,105,210,164,201, 34, 39, 39,167,217, 25, 25, 25, 26,189, - 94,127, 38, 59, 59,123, 2, 0,101,121,159,125, 87,139,252,203, 68, 86,201, 87,152, 69, 23,167,168, 98, 44,128,214,111, 41, 48, - 14,199, 61, 46, 46,206, 73, 32, 16,128, 97,152,226,193,236,221,195,124, 93,167,211, 33, 32, 32, 64, 95,193,128,227,145,144,144, -224,196,227,241,138,175,233,116, 58,184,185,185, 49,137,137,137, 78, 69,105, 15,138,161,213,106,225,238,238,254, 79,202,121,244, -149, 92, 46,207,141,143, 79, 8,212,104,245, 63, 13, 31, 59,117, 90,255, 94,159,202,174, 94,189,202,116,232,208, 65,123,225,194, -133,175, 80,152, 56,213,162,206,156, 32,136, 45,147, 39, 79,158, 45, 16,217,216,159,189,250, 88,187,101,223,145,164, 32,159,154, -196,132, 9, 19,168,113,227,198, 93, 12, 14, 14,222,206, 48, 76, 3, 84,194,178, 37,147,201,142,243,249,252, 26, 69,247, 47, 62, - 59, 59,251,179,127,224, 3,201,193,251,193, 99, 75,187, 86, 33, 50, 51, 51,161, 86,171,223, 59,252,252,252, 44,205,149, 89,169, -114,211, 52,125,104,193,130, 5,110,169, 41, 41,248,117,201,146, 38, 40,180,100, 54,177,228,195,233,233,233,239,149,211,215,215, - 23, 86, 84, 10, 83,102,207,158,189,224,203, 47,191,132,201,100,130, 90,173,118,125,241,226,133,255,244,233,211,123,188,124,249, -178, 49,128, 87, 31, 58, 25,247,246,246,142,254,230,155,111,228,141, 27, 55, 70, 81,150, 10,215, 75,151, 46, 53,217,176, 97,195, -192,248,248,120, 95, 0,111, 62,228, 11,228,114,249,246,117,235,214,217,139, 68, 34, 28, 62,124,216,190,109,219,182,151,238,220, -185,211,242, 3,196, 22,105,111,111, 63, 14, 64, 27,134, 97,120, 0,110,100,103,103,207, 69,229,163,186, 43, 36, 18,201,126,146, - 36,107, 2,127, 70,163, 39, 73,210,129, 32,136, 12,243, 53,130, 32,156, 24,134,185,150,149,149,213,204,250, 56,254,187, 97,111, -111, 63, 44, 45, 45,109, 21,159,207,231,202,100, 50,136, 68, 34,112, 56, 28,112, 56,156,106,124, 62,191, 26,159,207,239, 24, 26, - 26, 58,230,220,185,115,229, 70,216,111, 26,228, 60, 24, 36,241, 19, 69,144, 20, 0,144,180,216,198,214,214, 22, 63,253,244,147, -184, 91,183,110, 98, 0,184,124,249,114,248,160, 65,131,218, 38, 38, 38, 6,148, 37,182, 74,211, 34,255, 34,172, 45,111,192, 67, -145,122,188,240, 86,203, 37, 73,240,120, 60, 92,191,126, 29,150, 4, 43, 55,167, 72, 40,183, 55, 40,138, 48,126,239,222,159, 6, - 0,243, 64,195,227,241,112,229,202,219, 65,229,155, 54,109, 90,220,216,255, 46,244,242, 43, 12,242,184,247,235,194,114,133,173, - 44,140,174,189,247,107, 95,180,250, 37, 14,189,198,205,234, 83,160,209, 55, 2,160,202,201,206,206,190,117,224, 64,114,144,143, - 15,119,251,246,237,141,221,220,220,122, 85, 66,104, 77,105,208,160,193,126, 74,104,235, 16, 62,104,112,248, 80, 14,169, 31, 56, -114,226,188,132,148, 12,213,136, 17, 35, 14, 28, 62,124, 56,252,231,159,127,126, 50,105,210,164, 41, 0,126,176,180,252, 2,129, -160,198,211,167, 79,189, 77, 38, 19,252,252,252,254,137,105, 12,130, 80, 24,124,239, 75, 0, 59,139,174,245, 67, 97,228,254, 96, - 0,119, 43, 67,102,182, 96,149,118,124,108,184,185,185,249, 14, 24, 48,192, 33, 43, 35, 3,191, 46, 89, 98,190,220, 16, 21, 44, - 35,154,219,143, 78,167,195, 23, 95,124, 49,192,100, 50,113,204, 34, 80,171,213,234,114,115,115, 53,248,211,177,244, 13,128, 79, - 45, 40,142,167, 88, 44,254, 15,128, 96,181, 90,237, 6, 0, 98,177, 56,137, 97,152,131, 42,149,234, 7,252,153,192,183,210, 19, - 92, 0,254, 40, 59, 21, 20,187, 96,193,130,231, 83,167, 78,125,245, 95,224,172,225,236,236, 60, 63, 44, 44, 12, 71,142, 28,193, -209,163, 71, 13, 66,161,144, 51,104,208, 32, 98,204,152, 49,178,111,190,249,166, 35,128,101, 31,248, 51,119,156, 61,123,182,188, -110,221,186,216,183,111, 31,238,223,191,175,246,246,246, 22,182,110,221, 26, 28, 14, 71, 62,109,218,180, 14, 0, 54,127,200, 23, -100,101,101,205,157, 56,113,226,150,157, 59,119, 74, 99, 98, 98,176,114,229, 74,135, 62,125,250, 92,136,143,143,255,164, 18, 98, -139, 15, 96, 28,128, 80,138,162, 90, 14, 26, 52,200, 56,118,236, 88,154, 36, 73,195,146, 37, 75, 28, 55,108,216,208,135,166,233, -224,204,204, 76, 75, 38,105, 36,128,159,134, 14, 29, 58,228,220,185,115,178,155, 55,111,242,236,237,237, 97, 50,153,138, 45,197, - 12,195, 56,153,159, 89,163,209, 8, 95, 95, 95,247, 18,159, 23,254, 91,133, 6, 73,146,122,134, 97,104, 0, 2, 0,218,138,206, -255,151, 68,150, 92, 46, 31,157,149,149,245,155,139,139, 11,156,157,157,223, 27,107,181, 90, 45, 4, 2, 1,215,197,197,101, 93, -183,110,221,232, 67,135, 14,149,185, 4, 72, 80,196,204,195,187,230,184,201,101, 82, 0,192,210,213, 39, 10, 0,224,143, 63,254, - 64,114,114, 50,100, 50, 25, 2, 2, 2,168, 57,115,230, 40, 38, 76,152,240,107,118,118,246,208,178,184,222,213, 34,255, 50,139, -214,218,210,206,203,245,209, 98, 89,182, 56, 79,158,133, 15,237,187,151, 78,191,195, 71,232,116, 58,188,107,209, 50, 55, 94,154, -166,223, 53, 63,130, 32, 8,182, 60,206, 82, 48, 72, 44, 22, 7,170, 84,170, 21,149,152,221, 22,115,238,253,218, 23, 91,248,147, -251,153, 51,145,118,156, 88,248,186, 5,192,213,215, 67, 87,174,250,228, 19,183,113, 51,150,207, 82,103, 38,103, 76, 27,208,165, -134,183,139,189, 80,156,147,158, 43,175, 83,167,253, 59, 22,153,138,202,217, 42, 60, 60,124,235,201,235,177,132, 64,192,229,114, - 40,138,110, 81,207,199,222,195,150,178,149, 2,182, 9,175,158, 95, 29, 60,120,112,189, 73,147, 38,181,172, 4, 39,138, 6, 92, -108,219,182, 13, 4, 65,144,149,169,251, 71,196,233,242, 68, 22,203,178, 32, 8, 98, 71,137, 65,101, 71,209,181, 59, 37,196, 22, -167,188,251,105,182,166,154, 69,213,160, 65,131, 6, 24,141, 70, 78,137, 78,226, 93, 1, 83,154,136,177,168,238, 10,133,226, 36, -128, 79, 9,130,128, 78,163,209,253,231,151, 95, 74,254,249,246, 59, 34,235,116, 89,109,201, 96, 48,192,100, 50,113,238,220,185, - 67,151,120,214,105, 0, 98, 0, 14, 44,203,130, 36,201, 7, 22,220, 79, 95,145, 72,116, 53, 34, 34,194,166, 97,195,134, 4,143, -199,131,209,104,196,195,135, 15, 61,126,254,249,231,145,167, 79,159,238,160, 82,169,252,240,126,242,116, 75,126, 35,255, 75,151, - 46,169,188,188,188, 74, 21,142, 74,165,146,227,227,227,243, 73, 25,162,232,175,230, 76, 76, 75, 75,235,254,233,167,159,142, 74, - 77, 77,141, 54, 26,141,223, 3, 8,112,112,112,184,211,179,103, 79, 8,133,194, 80,181, 90,189,236, 67,158,121, 39, 39,167,110, -205,154, 53,195,202,149, 43,241,243,207, 63,183, 3,112, 6, 64, 91,165, 82,121,186,107,215,174,176,179,179,235,158,147,147,179, -249, 3,218,145, 79,171, 86,173,214,253,244,211, 79,210, 35, 71,142,192,219,219, 27,121,121,121,248,238,187,239,156,126,252,241, -199,243, 57, 57, 57,173, 75,180,139,178, 56,253,248,124,254,230,157, 59,119, 74,188,188,188,188,184, 92, 46,233,229,229,133,172, -172, 44,104, 52, 26,254,188,121,243,234, 9,133,194,123,203,150, 45,219, 12,160,103, 5,229, 36, 1,204, 93,179,102,205,168, 17, - 35, 70,216, 13, 24, 48,192,164,211,233,176,103,207, 30, 80, 20, 5,154,166, 33, 18,137,138,147, 87,115,185, 92,212,169,243, 94, -144,244,195,229,212, 55, 23,133,126,168,118,168,220,178,235,233,114,248,138,151, 62,104,154,134, 64, 32,128, 64, 32, 0,159,207, -199,211,167, 79,103, 8, 4,130, 37, 4, 65, 24, 45,225, 36,254, 84, 23,129, 0,110, 86,116,142,247, 93, 67,254,206,254,211, 12, -119,130, 32,150, 2, 8, 45, 28,118,201, 11, 14, 14, 14,227,211,210,210,226, 44,229, 84, 40, 20,246,153,153,153,203, 20, 10, 5, -156,157,157,139,199,111, 55, 55, 55, 24, 12, 6,164,165,165,129,101, 89,228,228,228, 64, 36, 18,193,213,213,117,217,136, 17, 35, -246,173, 93,187, 54,179, 84, 78, 6, 63,119,237, 51,125, 38, 69, 81, 36, 0, 80, 28,137,228,155,169, 64,141, 26, 53,208,162, 69, - 11,104, 52, 26,228,230,230,194,223,223,159, 67, 16, 68, 56, 65, 16, 54, 44,203,254, 14,224,236,255,160,161,176, 76,103,248,217, -239,174,139,154,179,197,115,185, 92,139,132, 86,209,251, 43,178,160,144, 6,131, 1, 92, 46,247, 45,139, 4, 65, 16, 48,153, 76, -111, 93, 55, 11,173,170, 8,245, 49, 99,198, 48,235,214,173, 27,149,157,157,189, 26, 85, 92, 74, 8, 15, 15,127,207,223, 99,194, -132, 9,137,233,233,233,236, 23,237, 3,197,209,199,146, 83,106,201, 36, 66, 71,169,180,166, 64, 38,183,203,204,204,188, 86,212, -153, 88,138,218, 13, 26, 52, 16,110, 57,112, 41,113,248,183, 11,230, 52,244,178,183,169,239,238, 32,115,177, 21,242, 36, 36,161, - 18, 24, 13,137,114,185,220,187,178,229, 54,247, 11, 34,145, 8, 36, 73,254,147, 44, 90, 28,179,200,202,202,202,194,145, 35, 71, -208,169, 83,167, 59,102, 17,162, 84, 42,145,146,146, 2,133, 66,113,167,200,242, 81,225, 50, 34,195, 48,208,235,245,208,235,245, -197, 2,166,196, 51, 84, 44, 96,204,239,165, 40,234, 65, 21,203, 62, 71, 38,147,181, 10, 13, 13,229,237,218,179,135,199,178,172, - 10,133, 57,212,242, 89,182,140, 4,217,239,192,104, 52, 22, 91,217,104,154, 70,124,124,124,241,192,101,206, 45, 41, 16, 8, 44, - 51,101,240,249, 19,119,239,222,109,211,184,113, 99, 34, 51, 51, 19, 12,195, 20,119,146,191,253,246,155,160, 87,175, 94,110, 81, - 81, 81,211,180, 90,237,236, 42,212,149, 40, 75, 16, 1,128,141,141,141, 17,150, 69,204,174,144,211,104, 52, 18,205,155, 55,159, -148,145,145, 81, 79,173, 86,207,179,228, 54, 2, 56,156,152,152, 88,114, 96,191, 23, 29, 29,173,238,221,187,183,176,102,205,154, - 33,143, 31, 63,254,160,135,212,199,199,167, 41, 77,211,184,113,227,134, 22,128,121,102,125,225,254,253,251,218,158, 61,123,242, - 61, 60, 60,154,230,228, 88,236,178,226,227,235,235,123,202,201,201, 73,104,238, 67, 29, 29, 29,233,181,107,215, 74,147,146,146, -160,215,235, 49,101,202, 20,116,238,220, 25, 14, 14, 14,152, 48, 97,130,243,162, 69,139,182,231,231,231, 55, 40,207,104,205,227, -241,182,190,120,241,194, 91,161, 80, 8,175, 95,191,142,250,245,235, 35, 35, 35, 3,169,169,169,200,207,207, 71,106,106, 42,134, - 14, 29,234,244,235,175,191,186, 90, 96,201, 42, 22, 89,107,215,174,205,217,191,127, 63,181,126,253,122, 41, 77,211,197, 66,139, -195,225, 20, 11, 45,115,110,197, 42,172, 52,228, 20,137, 54,187,220,220,220, 15,241,115,227, 3,224,149, 20, 89,124, 62, 31,124, - 62, 31, 2,129,224,131,242,178,254, 75,224, 70, 16,196, 99, 46,151,203, 23,137, 68, 92,146, 36,193,231,243,219,203,229,242, 71, - 1, 1, 1, 1,167, 78,157,138,181,132, 68,163,209,108,229,243,249,180,147,147, 19, 0,192,219,219, 27,245,235,215,135, 74,165, - 98,114,115,115, 97,103,103, 71,198,197,197, 65,173, 86, 35, 37, 37, 5,213,171, 87,167, 73,146,220,138, 66, 63,228,247,112,245, - 78,234,106, 0,171,205,231, 14, 14, 14,105, 37, 45,157, 2,129, 0,110,110,110, 72, 74, 74,130, 84, 42,165,126,252,241,199,158, -123,246,236,233,113,245,234,213,112, 0,219, 74, 80,205,254, 23,251,104,153, 69, 86,201,215, 63,133, 86,231,206,157,103, 69, 70, - 70,126, 82,218, 44,156,166,233,143,230,235, 98, 22, 84, 54, 54, 54,239, 90,173,192, 48, 76, 89, 22,173, 74,127,143, 64, 32, 16, -142, 30, 61, 58,239,247,223,127,175,180,216, 10, 91, 25, 93,108,197,122,111, 26,233,231,119,117,218,180,105,221,206,157, 59,151, -212,208,171, 38, 71,156, 28,151, 47,176,177,179,131,123,181, 78,131,186,247,188,143,194,221,135,150,226, 69, 94, 94,158,176,150, -187, 72, 71,146, 26,162, 26,159, 35, 85,136,185,124, 23,153,204,141,171,211,166,219,200,100, 60,173, 86,155,131,114,146, 64, 3, -128,179,179,243, 9,161, 80, 88,221,124, 46,147,201,108, 89,150,133, 72, 36,130, 66,161,144, 80, 20,245,172, 68,227,138, 75, 75, - 75,107, 95, 81,193,236,236,236, 78,240,249,252,234, 36, 73,130, 32, 8, 80, 20, 5,146, 36, 65,146,100,241,255, 41,138, 2, 65, - 16, 40, 40, 40,136,139,141,141,109,111, 65,125,141, 0,130, 9,130,184,115,228,200, 17,132,132,132,224,216,177, 99,248,252,243, -207,145,155,155,139,135, 15, 31,162, 85,171, 86, 64,225,146,162, 69, 40,233,252,110,158, 20, 60,125,250,180, 88,184,148, 60,164, - 82,233,135,152,216, 47,135,133,133, 97,221,186,117,108,209,100, 66, 76, 16, 68,125, 91, 91,219,167, 79,158, 60,177,200, 15,134, -101, 89,232,245,127,190,213, 60,120, 21,249, 67, 84, 42, 57, 48, 69, 81,237, 27, 52,104, 64,228,230,230,154, 5, 36, 56, 28, 14, - 40,138, 2, 69, 81, 88,181,106,149,176,113,227,198,211,249,124,254, 36, 46,151,171, 52, 24, 12,187, 52, 26,205, 60, 0, 57,255, -164, 30,169,101,203,150,223, 38, 36, 36,116,174, 94,189,122,196, 7,208,176, 6,131, 65, 7, 64, 72, 81, 20,253, 17,250, 40,170, -232,217,210,148, 16,251,198,162,115, 62, 10,151,137, 45,130,131,131,195,246,163, 71,143,186, 87,175, 94, 29, 6,131, 1, 70,163, - 17,249,249,249,184,112,225, 2,180, 90, 45,140, 70, 35,188,189,189, 49,115,230, 76,205,248,241,227, 5,107,214,172, 73,207,207, -207,239, 95, 1,237,248,125,251,246,137, 21, 10,133, 80,173, 86,227,213,171, 87,104,208,160, 1,242,242,242,160, 82,169, 80, 80, - 80, 0,189, 94, 15,165, 82,105,103, 50,153,116, 21,112,205, 40, 41,178, 70,142, 28,249,128,199,227, 53, 24, 59,118, 44, 18, 19, - 19,139,219,252,240,225,195,225,236,236, 92,220,150,138,250,228, 74,117,204, 28, 14, 7,124, 62, 31, 92, 46, 55,167, 90,181,106, - 32, 8, 66, 16, 23, 23, 87,149,165, 56, 27, 0, 74,154,166,121, 37, 5, 22,159,207,199,141, 27, 55,166,241,120,188,178,172, 89, -101,181, 75,182, 50,231,255,109, 16, 4,177,148,203,229,242,229,114, 57,183,196,132,147, 43,145, 72,224,228,228,180, 18, 64, 71, - 11,235, 29, 36,151,203,139,251,247,192,192, 64, 36, 36, 36, 28,204,205,205, 29,152,158,158, 14,146, 36,183,146, 36,217,195, 60, - 73,205,206,206,134,135,135, 71, 80, 89,124,205,130, 93, 70,129, 96,223,178,104,189, 51, 65,131,141,141, 13, 94,191,126, 13,149, - 74,197, 62,127,254,156, 24, 61,122, 52,161,211,233, 54, 69, 69, 69, 93, 67,225,110,251, 50,181,200,191, 4,149,247,209, 50, 91, -180, 44, 29, 0, 8,130,168,112, 54, 97, 48, 24, 36,254,254,254,165, 57,124, 17,165, 9,173,162,229,164, 42, 61,232, 52, 77, 75, -171, 42,182,222, 69,196,254,157,206, 63,207,156, 50, 83,238, 90,179,214,164, 73, 51, 56, 93,186,116,185,190,101,203, 22,147,188, -110,199,182,103, 79,108,115, 94,246,221,228, 99, 71,143, 30, 5, 10, 29,163, 45,197,229,200,200, 72,151, 9,227,198, 96,230,196, -241,199,109,188, 29,120, 18, 66, 46, 22,104, 85,111, 36, 96,213,252,218,190,157, 15, 68, 68,164, 0,136, 42,143, 68, 36, 18, 85, -127,252,248,177,119,201,141, 4,186,255,107,239,186,195,163,168,214,247, 59, 51,219, 75, 54,189, 18, 72, 0,129, 0,161,133,222, -171,128,128, 98,161, 92,165, 94, 48,136,120,189,160, 87,208, 31,122,197, 72, 17,132, 11, 10, 82,114, 65, 41, 98,161, 73, 19,144, - 98, 66, 34, 61, 1, 9, 73, 8, 69, 72,111,155,205,214,108,182,204,236,252,254,200,238,186, 9, 41,187, 97, 67,241,238,251, 60, -243,100,103,103,246,205,153, 51,167,188,231, 59,223,249,142,209, 8,177, 88,140, 51,103,206, 4,138, 68,162, 64, 0,208,235,245, -232,212,169,147,179, 22,147,136,172,172,172,182, 94, 94, 94,168,168,168,128,193, 96,128,217,108,134,197, 98, 1, 65, 16,224,114, -185,224,243,249,144, 72, 36,174,174,236,187, 10,224,181,177, 99,199,238, 62,118,236, 24,162,163,163, 81, 94, 94,142,204,204, 76, -155,200,114,201, 71,203,102, 37,114,244,199,226,112, 56,248,182,117,107,188, 94, 80, 96, 23, 48,235,188,189,241,111, 75,227,118, -211,232,212,169, 19,155,156,156,140,227,199,143,227,133, 23, 94, 32, 14, 30, 60,104, 98, 24,134, 87, 80, 80,112,189,160,160,192, - 41, 14,139,197, 98, 79,171,173,221,118, 20, 88,174, 10, 45,154,166,189,248,124, 62, 42, 43, 43, 97,179, 60, 56, 30,173, 90,181, -130, 66,161,224,168,213,106, 78, 65, 65,129,120,233,210,165,255, 72, 72, 72, 8,213,104, 52,175, 62,206, 86,104,211,166, 77, 17, -175,191,254,122, 14,135,195, 97, 71,143, 30, 61, 53, 59, 59,251,197,208,208,208,211,191,254,250,235, 26, 0,237, 92,229, 11, 8, - 8,184,194,225,112,194,213,106, 53,111,207,158, 61,102,141, 70,195, 11, 12, 12, 44,182,181, 29,182,188, 54,155,205, 78,173, 92, - 14, 8, 8,184, 34,151,203,121,235,215,175, 55,151,149,149,241,130,131,131,139,109, 60, 74,165,146,183,103,207, 30,179, 90,173, -230,121,123,123, 95, 81,169, 84, 13,242,201,229,242, 41,211,167, 79, 79, 58,125,250,116, 0, 69, 81,200,206,206, 70, 89, 89, 25, -124,124,124,176,115,231, 78, 68, 68, 68, 96,239,222,189, 10,133, 66, 49,251,243,207, 63,255,208, 42,178, 26,242,209, 26,212,187, -119,239, 8,165, 82, 9, 31, 31, 31,232,116, 58, 92,185,114, 5, 29, 59,118, 68, 65, 65, 1, 72,146,132,143,143, 15, 54,110,220, - 88, 65, 16,132,162, 62, 34,145, 72,244, 98,108,108,172, 15, 0,196,198,198,250,196,198,198,214,218,193,245,237,219, 23, 27, 54, -108,168, 41,180, 92, 25, 24,216,173, 78, 14,226,168,178, 79,159, 62, 72, 72, 72, 88,232,162, 56, 50,218, 68, 91, 77,107,150, 64, - 32,112,121, 49,141,197, 98,225,161,202,165,129,112,230,252, 9,192, 96,145, 72,196,171,249,101, 69, 69, 5, 47, 52, 52,116,160, - 11,194,215, 95, 36,170, 50, 56, 69, 68, 68, 64,165, 82, 49, 70,163,113,242,174, 93,187,204, 0, 16, 19, 19, 51,153, 97,152, 74, -154,166, 41, 62,159, 15,157, 78,135,160,160, 32,255,122,108,163,139, 14,125,191, 52,164,166,143, 86,104,104, 40, 98, 98, 98, 96, - 48, 24, 80, 88, 88,136,196,196, 68, 51,195, 48,187, 55,109,218,100, 9, 12, 12,252,251, 43,175,188, 66,165,164,164,188, 5, 96, - 65, 93, 90,228, 41,179,102,197,215, 41,180,172, 10, 50, 1,192,144,154, 15, 89, 83,252,212, 39,180, 26,154, 58,228,243,249,202, -156,156, 28,137, 99,167, 66,211, 52,194,194,194, 44, 44,203, 18,181, 9,173,135, 49, 5,115,185, 92,175, 15, 62,248, 64,185,105, -211,166, 41,247,238,221, 91,226,204,111,246,188,213, 30, 59,106,136,172,205, 43,227, 54,172, 95,185,212,239,206,241,111,176,245, -203,213, 12,195, 32,165,115,231,206, 3,181, 90, 45,199, 91, 98,134, 92,137, 99, 86,145,229,172, 40, 36, 1,124,125,233,210,165, -148, 49, 99,198,252,246,245, 15,251,253, 10,238,222, 61, 47, 80,203, 11,101,109,218,114,120,205, 34, 94,210, 84, 86,242, 38, 79, -158, 28, 8,224,149,134, 26, 49,165, 82,137,162,162,162,154, 2, 12, 55,111,222,124,224, 94,167, 18, 71,146, 96, 24, 6,251,246, -237,131, 88, 44,134, 68, 34,169,118,216, 68, 86, 35, 23, 42,100, 1,192,232,209,163,161, 80, 40, 32,149, 74,157, 78, 87, 77,241, -194,178, 44,140, 70, 35,140, 70, 35, 76, 38, 19, 3,128,203,225,112, 48, 43, 47,207,110,229,113, 69,192,212, 68,231,206,157,217, -115,231,206,225,183,223,126,131, 78,167,195,250,245,235, 17, 26, 26, 58, 12,192, 71,174,114, 57, 56,233, 51,106,181,154,171, 86, -171,237,214, 65, 46,151,107,183, 30, 56,105,201,227,113, 56, 28,251,104,212,118, 56, 90,181, 40,138, 66,112,112, 48, 66, 66, 66, -176,121,243,102, 94,203,150, 45,199, 61,206, 22,104,213,170, 85,109,214,173, 91,183,109,199,142, 29,199,166, 76,153,242, 99, 90, - 90,218, 76,111,111,239,235,103,206,156, 89, 42, 16, 8, 44,141,172,223,225, 5, 5, 5, 65,142, 95, 89, 44, 22, 49, 77,211,118, - 97, 91, 81, 81,225,244, 0,131,203,229,134,167,167,167,139, 1, 96,233,210,165, 92, 0, 98,155, 51,184,141,179,162,162,130,219, -177, 99,199,112,103,203,122, 82, 82,210,192, 17, 35, 70,156, 59,121,242,164,111, 68, 68, 4,242,243,243,145,159,159,143, 54,109, -218, 96,249,242,229, 58,181, 90,221, 31, 64,150, 86,171, 61,232, 36,103,152,175,175, 47, 55, 39, 39, 7, 52, 77,163, 91,183,110, -216,184,113, 35, 38, 79,158,140, 78,157, 58, 65,173, 86, 35, 61, 61, 29,219,183,111,247,229,241,120,245,182, 29,122,189,254, 96, -124,124,124,243,154, 22,173,169, 83,167, 74,138,139,139,237,101, 50, 46, 46,174,218, 20,162, 43,109,178,117,106,171,206,163, 49, -160,105, 90, 38, 20, 10,213, 2,129,128,111,243,207, 74, 76, 76,116,217,154, 85, 99, 0,232,202,249, 99,131, 77,180,214,210,183, - 34, 36, 36,196,105, 30,129, 64, 64,216,218, 70,154,166,161, 82,169,152,208,208, 80,251,244,126,106,106, 42, 19, 25, 25,201, 80, - 20, 69,241,249,124, 16, 4, 1,177, 88, 92,103,131,207, 50,108,220,243,147, 63,170,182,234,112,254, 7,128,201,100, 66,106,106, - 42, 76, 38, 19, 18, 19, 19,205,159,127,254,121,129, 82,169,156, 15,128,115,226,196,137,233, 11, 23, 46,164,130,130,130, 70,148, -148,148,160, 33, 45,242, 20,137,173, 7,172, 92,182, 94, 40, 97,220,184,113,132,117,105, 37, 97, 19, 78,174, 8, 45,107,229,107, -176,231, 37, 8, 2,133,133,133,246,243,160,160, 32,151,255,151,179,240,247,247,215,245,237,219,215, 75, 46,151, 31, 92,181,106, - 85,163, 44, 89,155, 87,198,109, 88,241,233,199,126,138,140, 11,200, 43, 40,132,162,196,156,146,124,253,222, 1, 0, 7, 0, 0, - 91, 58, 36, 16,111,100,126,229, 44,103,251, 0, 81, 87, 46,143,115,224,217, 49,227,154, 79,138, 93, 64,190,249,230,155, 3,166, - 79,159,174,154, 50,101,202,219, 82,169,180,157,201,100, 42,223,127,244,232,253, 73,147, 38,181,100, 24,102, 58, 26,136, 57,162, -215,235,179,135, 12, 25,226,152,159,178, 83,167, 78, 5,223,191,127, 31,243,230,205, 43,205,207,207, 87, 58,222,235, 76, 26, 77, - 38, 83,118,215,174, 93,235,156, 46,180, 77, 41, 2,128, 70,163,201,118, 33, 75, 95,133,213,241,189,172,172, 12, 55,111,222, 4, -135,195, 65,159, 62,125,144,156,156,140, 1, 3, 6,164,186, 98,213,170,172,172, 68, 68, 68, 4, 42, 43, 43,161,211,233, 42, 0, - 8,118,182,108, 9, 0,120,171,172, 12, 87, 62,255, 28, 23, 86,172,128, 99,121,118, 22, 93,186,116, 97, 47, 92,184,128,235,215, -175,195, 96, 48, 96,246,236,217, 0, 64, 88,203,174, 43, 33, 51, 90, 83, 20, 53,122,204,152, 49, 97, 0,160,211,233,136, 75,151, - 46, 65, 40, 20,218,235,194,225,195,135,145,159,159, 15,130, 32,224,235,235, 27, 94, 94, 94,222, 18,192,189,122,204,254,196,189, -123,247,240,217,103,159,193, 98,177, 96,225,194,133,104,219,182,173, 93, 96,101,103,103, 99,233,210,165, 96, 24, 6, 31,127,252, - 49,218,180,105, 3,179,217, 44, 68, 35, 67,104,184, 3,239,188,243,206,157, 3, 7, 14, 28,203,205,205,125,110,229,202,149,131, - 9,130,176,188,247,222,123,159,201,100, 50,230, 97,120,203, 85, 26,220,188,157,109, 23, 66, 53,143,192, 0, 63,151,249,110,221, -205,181,255,158, 97, 28,249, 24,248,251,249,186,154,196, 10,179,217,172,123,233,165,151,124,246,237,219, 71,180,105,211, 6,127, -252,241,135,205, 50, 84, 1,215, 67, 58,228, 43, 20,138,182, 20, 69,241,110,223,190,141,200,200, 72,244,238,221, 27,203,150, 45, -131, 92, 46, 7, 77,211, 8, 10, 10,178,152,205,230, 84,147,201,116,182, 1,174,184, 57,115,230,240, 0,188, 97,181,108,117,158, - 63,127,190,101,245,234,213, 72, 77, 77,181, 91,176, 28,157,225, 93,157, 58,116,180, 58, 57, 30,137,137,137, 11,249,124, 62, 11, -224, 34, 92, 15,244,108,172,105,209,106,140, 53,171,169,208,148, 43, 25, 67, 67, 67, 19,189,188,188,198,149,151,151, 87,179,106, -245,239,223,223, 20, 28, 28,156,228, 44,143, 84, 42, 45,167, 40,202, 31, 0,242,243,243, 33,145, 72,120,119,239,222, 93,129,170, -224,217,104,217,178,229, 10,133, 66,193,107,105,109, 79, 67, 66, 66, 96, 52, 26,235,116, 99, 57,127,181,248, 27, 0,223,216,206, -253,252,252, 10, 85, 42,149,104,245,234,213,218, 21, 43, 86,232, 25,134, 49, 0, 56,163, 84, 42,237,113,180,138,138,138, 84, 92, - 46,215,207,199,199,167,153, 77,104,213,166, 69,158, 50,212,109,209,178, 42, 73,182,166, 32, 34, 8,226, 1, 7,245, 6,132, 86, -131, 34,139, 97,152,106, 86, 6,155,195,123,109,255,203,218,169, 55,106,234,208, 42,178,132,251,247,239,223,185,106,213,170,139, -206,254,206,209, 71,107,203,154, 79, 87,218, 68,214,239,191,157,196,193, 76,149,124,225,138,181,235, 26,251, 6, 58, 4,136,187, - 4, 7,251, 39,124,190, 60, 78,118,231,248,118,252,184,229, 63,236,239,151, 47,247,186,124,249,242,180,121,243,230,181,176, 22, - 44, 5,128,107, 0, 38,193,137, 85, 58,249,249,249,163,106,116,194, 89, 60, 30, 47, 88, 44, 22, 35, 63, 63, 95,123,235,214, 45, -151,167,100,228,114,249,168, 38, 40,128, 28,155,200,146,203,229, 72, 79, 79,199,208,161, 67, 1, 0,201,201,201,232,223,191, 63, - 82, 82, 82,208,189,123,247, 84, 0, 61,209, 64,160, 86,179,217,172,236,208,161,131,221,186,165, 82,169, 44, 0, 16, 91, 88,136, -248,208, 80,112, 56, 28, 92, 88,177, 2,139,205,102, 44,115, 81,192,119,237,218,149,189,116,233, 18,238,223,191, 15,154,166, 49, -126,252,120, 52,178,210,119,106,223,190,253,169, 51,103,206, 4, 74,165, 82,232,116, 58,104,181, 90,204,152, 49, 3,147, 39, 79, -134,193, 96,192,158, 61,123,112,232,208, 33,120,121,121, 65,167,211, 65,167,211,249,142, 29, 59,246, 92, 86, 86,214, 32, 0,183, -235, 16, 90,236,168, 81,163,144,148,148, 4,138,162,208,171, 87, 47,148,149,253,185, 24, 40, 56, 56,184,182,107,212,227, 20, 90, - 28, 14,135, 77, 76, 76, 92, 57,120,240, 96,228,230,230, 62,215,189,123,247,245, 51,103,206,204,127, 88, 94, 95,111, 47,116,237, -216, 26, 6,131, 1, 6,131, 1, 97, 97, 97,208,104, 52,184,115,231, 14, 12, 6, 3,130,131,124, 92,230,139,233,212,198,206, 23, - 20, 20, 4,157, 78,135,123,247,238,193,104, 52, 34, 32,192, 37,161,213,124,212,168, 81,191,238,222,189,219,127,251,246,237,198, - 33, 67,134,240,215,175, 95, 79,200,100, 50, 56,116, 44,174, 34, 49, 57, 57, 57, 98,196,136, 17, 81, 25, 25, 25, 72, 76, 76,132, -209,104, 68, 76, 76, 12,110,221,186,133,190,125,251, 66,171,213, 94,188,124,249,242, 33,103, 12,195, 0, 62,156, 51,103, 14,108, - 98, 43, 41, 41, 9,133,133,133,240,242,242,122, 64,104,217,124, 31,173,171,198,195,156, 73,172, 77, 16, 57, 88,158, 22,251,248, -248,152, 0,172,107,164,245, 9, 0,144,155,155, 43,232,220,185,179, 65, 40, 20,242,173,162,109,237,195,240,185, 19,110, 88,201, - 88, 39, 66, 66, 66,230, 7, 4, 4,140,104,213,170, 21,138,139,139,121,124, 62, 31,253,251,247, 55,245,236,217,211, 20, 18, 18, -242,150,179, 60, 2,129, 32,131,199,227, 13,170, 26, 76, 48,200,201,201, 1,203,178, 11, 59,117,234,244, 79,141, 70,131,178,178, - 50,190, 76, 38,179, 15,170,163,162,162, 96, 48, 24, 50, 92,176,188,197, 69, 70, 70,126,200,227,241,150,201,229,242,218,194, 66, -240,125,124,124,100, 60, 30, 15, 38,147,169,154,216,172,169, 69,158,118,145, 85, 77,104, 57,168,200,106, 66,199, 21,139,150, 51, - 86, 3,155,131,189,227,185, 77,212,213,252, 95,141,141,161,229,237,237,109,176,137,172,101,203,150, 93,108, 12,199,222,221,187, - 66,189, 45, 21,205, 11, 46,254,140,172,235, 41, 56,144,174,148, 47, 92,177,246,237,231, 95,121,181,184,166, 48,115, 6,109, 3, -197,157,130,131,252, 19,214,172, 90, 33, 83,100, 92, 64, 97, 81, 17,126,190,120, 57,197, 4,164, 3, 88,232, 78,211, 50, 80, 53, -117, 72, 81,212,147, 84, 96,237,206,240,133,133,133, 54,145, 21, 3, 0, 3, 6, 12, 72,181,138, 44, 56,107,209, 82, 42,149, 53, -183,172, 25, 1, 32,192,246,252, 28, 14, 7,253, 63,252,208,101,145, 5,128, 77, 73, 73,129, 66,161,176,141, 20, 27, 43,178, 16, - 18, 18,242,175, 51,103,206, 4,126,253,245,215,234, 29, 59,118,148, 89, 44, 22,110,215,174, 93,195,123,244,232, 65,236,220,185, - 19, 0, 48,105,210, 36, 44, 92,184, 16, 55,110,220,128, 68, 34,193,128, 1, 3,152, 37, 75,150, 4,205,159, 63,255,173,226,226, -226,183,107,237, 29, 45, 22,158, 80, 40, 60, 13, 96, 88, 70, 70, 6, 0,156, 67,213, 22, 78, 54, 43, 66,157,215,156,233,124, 53, - 26, 13,215,203,203,171,214,208, 16,188,170,209,144,171, 22, 8, 59,231,111,191,253,246,217,154, 53,107, 14,188,251,238,187,183, - 31,146,179, 86,139,214,184,113,227,160, 55,152,144, 87,172, 2,195,208,208,155, 74, 92,230,115,180,104,141, 27, 55, 14, 21,149, - 70,228, 20, 42, 64,211, 12, 52,122,167,251,114,241,179,207, 62,123,226,251,239,191, 15, 57,127,254, 60, 24,134,177,220,186,117, -235,222, 75, 47,189, 36,123,239,189,247,252, 31, 98,145,209,151,175,190,250,234,132,223,126,251, 77, 17, 21, 21,229,119,241,226, - 69,148,148,148,128,166,105, 12, 27, 54, 12,124, 62, 63,103,197,138, 21, 60, 0, 95, 58,251,110,172, 98,203,116,249,242,229,215, - 47, 92,184,224,231,231,231,199,183,180,111,143,194,147, 39,177,111,223,190, 7,126,176,101,203, 22,192,201, 40,252, 54,139,211, -165, 75,151,220, 34,176,170,245,212,124,126,163,167, 31,159, 86, 92,186,116, 41,255,205, 55,223,236, 40,147,201,214, 13, 28, 56, -112,168,191,191, 63,233,235,235,155,216,172, 89,179,127,118,237,218,213,233,217, 5, 46,151, 59, 83, 34,145,220,161,105,154,210, -106,181,208,233,116, 85,141, 52, 77,243, 73,146, 68,203,150, 45,237,125, 73,175, 94,189, 16, 18, 18,194,100,102,102,206,116,150, -191,180,180,180,218, 42,196, 90, 48,167,127,255,254, 28,131,193,128,251,247,239, 39, 59, 94,168, 77,139, 60, 37,136,173, 87,124, -217, 30,202,241,225,154, 53,107,150,107, 54,155,217,116,128,189,118,237, 26, 27, 27, 27, 91,239, 81, 89, 89,201, 6, 5, 5, 21, -214,210,249,193,145,211, 96, 48, 84,251,157,193, 96, 96,131,131,131, 25,189, 94,255, 0,167, 94,175,103,195,195,195,243,235,227, -172, 5, 51,174, 94,189,186,105,241,226,197,189, 93,200, 32, 59, 39,187,185, 61,187,125,251,246,191,177, 44, 59,120, 96,199,136, -235, 19,187, 6,179,253,219, 6, 21, 28,218,187,123, 50,203,178,131,107, 30,182, 0,167,245,113,182, 15,150,116, 24, 30,221,162, -252,247,227,223,177,103, 86,255,131, 93, 51,190, 45,219, 61,220, 75,217, 62, 64,228,234, 30, 49, 13,238,150, 30, 29, 29,157,101, -177, 88, 88,163,209,200, 70, 71, 71,223,114, 7,103, 35, 80, 31,103, 55, 84,249,178,189, 90,203,119,221, 30, 34,157,191,179, 44, -203, 42, 20, 10, 86,171,213,178, 6,131,129,101, 24,134,117, 4,128,223,157, 92,118,192,127, 0, 0, 32, 0, 73, 68, 65, 84,224, -100, 77, 38, 19, 91, 94, 94,206,194,121,159,187, 90, 57, 67, 67, 67,239,221,189,123,151,125,230,153,103,114,173,230,248,249, 58, -157,142,173, 9,157, 78,199, 14, 29, 58,148,189,117,235, 22, 27, 25, 25, 89,121,235,214, 45, 54, 52, 52,244,102, 3,233,108,213, -188,121,243,211, 1, 1, 1,137, 0,218,186,112,173,222,252,220,179,103, 79,107,150,101,103,179, 44, 27, 91,199, 49,155,101,217, -246,143,155,211,154,191,197, 44,203,178, 21, 21, 21,172, 66,161, 96, 11, 10, 10,216,138,138, 10, 86,171,213,178, 87,175, 94,101, -207,159, 63,207, 94,191,126,157,245,243,243, 43,118,134,211,198,103, 52, 26, 89,181, 90,205,150,148,148,176,122,189,158,213,233, -116,108, 90, 90, 26,123,229,202, 21, 54, 35, 35,163, 54,190, 7, 56,253,253,253,183, 20, 21, 21,105,207,157, 59, 87,177,121,243, -230,138,144,144,144, 12, 0, 17, 0,218,249,250,250, 22,253,227, 31,255, 96,165, 82,105,118, 35,235, 81, 71, 46,151,123,117,229, -202,149,151,142, 28, 57, 82,124,232,208, 33,227,182,109,219,242,230,205,155,119,150,195,225, 92, 5,208,177,145,245, 40,200,199, -199,231,220,197,139, 23,233,242,242,114, 86,169, 84,178,106,181,154,213,233,116,172, 94,175,103,141, 70, 35,107, 54,155,217,179, -103,207,178,193,193,193,142,211,146,139,234, 25, 88, 47, 96, 89,246, 95, 44,203,114,220,221,214, 57,112, 15,116, 23,167, 59,218, - 58,146, 36, 77,214,182,163, 79,213,105,253,231,143, 43,157,195,135, 15,255,120,242,228,201,236,232,209,163,217,152,152,152, 7, -142,238,221,187,179,115,231,206,101,143, 28, 57,194,126,254,249,231, 31,187, 33,157, 28, 84, 45,122, 89, 62,124,248,112,115, 82, - 82, 18, 59,105,210, 36, 22,192,168,250,180,200, 95, 65,112,217,194, 59, 16,142,127, 1,192,100, 50,229,102,101,101,133, 70,209, - 52, 5, 0, 95,125,245,213, 3,150, 41, 71, 36, 37, 37,209, 4, 65,220,169,239,191,155, 76,166,220, 51,103,206, 4,111,216,176, -129,235, 96, 2, 6, 77,211,150,130,130, 2,114,253,250,245,213,238, 79, 72, 72,160,105,154,206,113,241, 33,183,119,235,214,109, -187, 59,114,235,236,141,251,255, 60,241,243, 79, 1,125,122, 15, 84,202,252,252,106, 29,133,237,121,171, 61,136, 55,234,183,106, - 17, 28,114,217,202,229,113, 62,182, 41,200, 31, 82,139,148,149, 6,102,104,166, 92,255,187,187,223,176, 86,171,189,111, 91, 9, -168,211,233,114,158,192, 66,120, 21, 85, 49,174,232, 26,223,245,196, 67, 58,157, 90, 44, 22,120,123,123,219,173,161,141,176,136, -178, 54, 11,171,237,213, 61, 76,122, 88,150,253, 45, 45, 45, 45,114,198,140, 25, 94, 59,118,236,184,203, 48, 12,119,214,172, 89, -166,144,144, 16, 94,114,114,178, 25, 0, 49,120,240, 96, 78, 81, 81, 17,155,159,159,175,120,225,133, 23, 52,175,191,254,186,255, -181,107,215,248, 22,139,165,161,160,133,127,228,230,230, 14,111,196,181,122, 49,113,226,196,187,120,248,109,108,154,156,211, 6, -133, 82,141,187,247,243,173, 17,204, 45, 96,178,139,237,126, 85,102, 51, 13,133,186,204,101,139,214,157,123,249,214, 45,198, 24, - 48, 76,129,149,175,202, 33,158, 45,175,104,184, 55,225,112, 6, 44, 89,178,100, 12, 73,146,228,133, 11, 23, 12,171, 86,173,202, - 45, 45, 45, 29, 15, 32, 7, 0,202,203,203,135,108,223,190,253, 91, 39, 66, 57,212,133,116,179,217,220,119,209,162, 69,111, 3, - 24, 0,160,133,149, 59,217,106,201,106,108, 4,243, 18,165, 82, 57,114,204,152, 49, 39, 41,138,106,233, 80,143, 2, 0,200,109, -245,130,101,217,160,226,226,226,231,156, 33, 36, 8, 98,109, 83, 53, 36, 77,201,253,144,237,208, 83,177,146,241,244,233,211,159, -140, 31, 63,158, 19, 17, 17,241,127, 17, 17, 17,100,121,121, 57,180, 90, 45, 72,146, 68, 72, 72, 8,162,163,163, 17, 18, 18, 98, -201,200,200, 88,254,254,251,239, 55, 24,147,175, 67,135, 14,173,205,102,243, 51, 36, 73,182, 6,208,154,101,217,214, 4, 65,180, - 6,224, 7, 0, 50,153, 76, 22, 25, 25,201,233,211,167, 15,122,247,238,141,132,132, 4,236,221,187,247, 27, 0, 39, 28,173, 89, - 53,181,200,147,128,244,110, 96, 59, 94, 5,113,163, 59, 6, 19, 22, 36,176, 36,134, 68,167,216,227,236,213, 20, 89,117,111, 42, - 93,139,233,111,212,176, 97,195,236, 21,206,137, 78,229,126, 67,149,175,180,180,116,212,204,153, 51,171,113, 50, 12, 99, 40, 43, - 43,123,179, 95,191,126, 27, 41,138, 18,212, 40,176,217, 37, 37, 37,143,116,175,190,154,113,180, 70,141,121, 81,254,176,156, 82, - 30,249, 76,214,209,255,162,184, 68,142, 31, 82,139,202, 53, 70,102,200, 45,121, 69, 90, 83,164, 63, 59, 59,123,244, 83,160,248, -107, 19,173, 15,187,121,118,169, 19, 1, 73, 27,218,163,142,176,134, 19,113, 75, 37, 47, 42, 42, 90,253,225,135, 31,142, 92,190, -124,121,224,177, 99,199,100,182, 1,202,203, 47,191, 92,146,150,150, 54, 16,128,160,178,178,242,212,242,229,203, 3,227,226,226, -252, 1,248, 3,192,216,177, 99,139,139,139,139, 55,192,131,122, 97, 54,155,243,162, 59, 68,217, 7,126,142, 33, 29, 28, 63,211, - 52,157,231, 10, 95,109, 60,142,231, 12,195,212,203, 71, 81,212,187,189,123,247,166,222,125,247,221,226, 99,199,142,217, 54,210, -117, 84,104, 89, 13, 4, 37,117, 6, 6, 0,171,172,135, 59,161, 83, 40, 20,125, 93,252, 13,227, 41,141,181, 14, 40, 93, 57,127, - 44, 56,120,240,224, 71,147, 38, 77,218,238,231,231,183,171,117,235,214, 81,193,193,193, 50,145, 72, 4,131,193,160, 49, 26,141, - 55,179,178,178,166,124,244,209, 71,127, 56,101,225,216,190,157, 2,192,179, 88, 44, 66,146, 36, 37, 0,100, 4, 65,248,218,132, - 22, 65, 16, 48,153, 76,184,127,255, 62, 22, 47, 94,204,156, 62,125,250,115, 0, 31,187, 48,112,237, 9, 32,208,161, 29, 15, 4, - 96, 68, 85, 0,219, 82,130, 32, 46, 55,117,126, 17, 22, 36,116,188, 10, 34,189, 27,106,235, 39,234,223, 84,186,174, 10, 87, 90, - 90,218,215,221,149,184, 46,206,210,210,210,136, 39,165,134, 76, 55,172,250, 14, 91, 86, 85,219,231,208, 38,194,106, 59,111, 8, - 42, 61, 61,239,203, 19, 55, 86, 27,104,214, 98,162, 45,127,191, 85, 90,145,238,105,135,220,142,103,221, 85,151,220,152,166,180, -204,204,204,126,243,230,205,251, 72, 44, 22,247, 2,128,138,138,138, 11, 5, 5, 5,159,194,186,170,176,161,235, 30,212, 13,185, - 92,222,227, 73,228, 51, 26,141,255,236,215,175,223, 23, 12,195,172,161,105, 58,249,127,224, 85, 84,122, 74,227,211,139, 31,127, -252,241, 15, 0,125, 1, 96,194,132, 9, 20, 0,236,221,187,215,101,241, 60, 99,198, 12,134,101, 89,147,181, 60,232, 80,181,186, -176,220,214,166,234,116,186,242,130,130,130, 12,134, 97, 50, 0,124, 11,215, 87,220, 6, 18, 4,113,132,101,217,113, 86,225,118, -132,101,217,113,142,223, 53,181, 85,171,129, 91, 26,118,134,247,160, 10,123,211, 65,212,156, 10,108,232,188, 33,100, 21,235, 18, - 1,116,247,228,238,255, 36,238, 22, 20, 20, 76,127,136,235, 30, 60,125,200, 49, 26,141,227,255,135,158, 87,229,121,229,127,145, -254,175, 17, 2,203,134,140,140,140, 38,115, 17,120,220,232,120,181,250, 0,188,230,185, 3, 98,107, 19, 94, 30,161,229,129, 7, - 30,120,224,193,195, 64,233,201, 2, 15,254,202,176,249,102,217,206,235,240,209,170,233,159,101, 63, 39, 80,247,202, 1, 87,118, - 37,111,204, 42,137, 83, 30, 78, 15,167,135,211,195,233,225,124,236,156, 62, 0, 34, 1,172,108,224,190,154,171, 11,139, 1,200, - 1,152, 61,249,233,225,124, 8,253,224, 20, 88,150, 29, 91,223,212, 33, 65, 16, 71,155, 74,104,217,157,225,187, 97, 73,244, 85, - 44,177,157, 59, 43,180,154, 26, 35, 60,156, 30, 78, 15,167,135,211,195,233,225,244,112,122, 56, 31, 82,104, 13,125,255,253,247, - 63, 64, 85,104, 12,246,253,247,223,255,128,101,217,177, 85,151,216,177, 77,249,191,111,116,199,224,244,110, 96,109,199,141,238, - 24, 92,199,173,177, 14,135, 29,158,169, 67, 15, 60,240,192, 3, 15, 60,240,224, 73,199,185, 21, 43, 86, 84,172, 88,177,194,230, -248, 94, 10,128,176, 90,184, 74,155,242, 31, 91,167, 9,157, 89, 40, 85,255, 22, 60,143, 1, 97, 36,135, 55,149,203, 19, 12, 5, -107,137, 6, 0,144,212, 13,198, 88,249, 43, 77,155,118, 1, 40,104, 44,113,123,160, 67, 27, 31,209, 33, 3,195,240,114, 53,198, - 9,153, 85,219, 28,184,140, 9, 64,127, 1,159,255,139,192,199, 71, 84,219,117,131, 82,169, 55, 24,141, 35,247, 2,191,121,234, -128, 7, 30,120,224,129, 7, 79, 9, 36,190,190,190,167, 73,146,140,176,125,225, 24,119,176,102, 12, 66,134, 97, 10, 21, 10,197, - 72, 84, 77, 21, 63, 74, 78,199,223, 27,209,200,190,220,221,112,117,234,144, 3, 84,139,194,250, 72,118,204,166,184,130,215,189, -188,125,150,253,109,230, 63,253,219,182,139, 34,154, 55,111, 6,176, 64, 78,110, 94,240,157,219,183,134,255,184,227,203,119,212, - 42,197, 98,179,193,240, 95, 87,185, 59, 0,146, 22, 82, 65,242,127,223,127,205,135, 3, 26,175, 46,221,125,156,208,154,154,103, - 84, 45, 55,117, 73,100,249,248,251,159, 88,113,234,148,200,183, 75,151,106,215, 88,150,173,218, 95,239,247,223, 69,255, 55,114, -228,137, 9, 10,197, 40,143,216,250, 75, 34, 68, 38,147,205,231,114,185, 67, 76, 38, 83, 4,159,207,207,101, 24, 38,177,188,188, -124, 29,128,124, 79,246,252,181, 17, 21, 34, 25, 24,213, 58, 98,119, 65, 81,113,170,186,210, 56, 43,171, 64,171,240,228,138,203, -168,111,127,205,199,182,247, 38, 0, 72,165,210, 43, 36, 73,134, 59,138, 0,219,158,189,182,243,154,127, 45, 22,203, 31, 10,133, -162, 95, 61,180,173,253,252,252, 54, 2,232,217, 80,192,100,107,108,182,203, 10,133,226, 77,212,189, 90,207,203,215,215,247, 19, -130, 32, 38,146, 36, 73, 53,244, 76, 22,139,133, 97, 89,118, 79,121,121,249,199, 0, 52,117,221,231,235,235,123, 42, 51, 51,179, -103, 80, 80, 80,131, 86, 26,154,166,145,147,147, 19,216,171, 87,175,179, 10,133,162,125, 83,114, 62,106, 45,210, 88,212,179,234, -176,206,130, 14,160,218,254, 66, 77, 26,145,149, 39,148, 30,234, 59,104,212,208,185,111,191, 43,185,154,118, 19,191, 36,156,135, - 90,103, 0, 69,146,240,241, 18,163, 93,187,103,136,181,241,251, 2,190,217,188,118,205,133,164,147, 99, 43,117,170, 23, 92,146, -233, 98,206,226,133, 47,245,146,248,251, 49,128,133,193,191,198,116,149,252,223,145,212,197,168,160, 63,112, 89,100,157, 62, 45, - 46, 41, 46, 70, 92, 88, 24, 56, 52, 13, 33, 73, 66, 72, 16, 16,146, 36, 36, 66, 33, 70,111,219,134, 79,143, 29, 19,127,244,220, -115, 30,177,245, 23,131, 84, 42,157, 25, 22, 22,182,106,235,214,173,254,173, 90,181,130, 68, 34,129, 66,161, 8,200,202,202,234, -182, 96,193,130,233,133,133,133, 31,170,213,234, 45,158,156,250,235,194, 98,193,212,175,151,189,217,172, 48,251,118,179, 57,203, -191,107, 71,248, 51, 67,110,150,233,139, 60, 57,227, 52,186, 1, 72, 69,237,251,151,214,119,173, 78, 8,133,194,226,202,202,202, -160,250,238,225,243,249, 37, 70,163, 49,184, 33, 46,146, 36,195,243,243,243,131,196, 98, 49, 24,134,177,238, 6, 96,177, 15,164, - 29,119, 63,177, 6,170, 69,251,246,237, 77,245,113,122,121,121,125, 85, 82, 82, 50,194,182, 79,160,131,160,170, 21,249,249,249, - 35, 58,118,236,248,149, 70,163, 25, 89,135,120,249,228,237,183,223,158,223,169, 83, 39,155, 21,200,186, 11, 66,213, 95,185, 92, -142,121,243,230,217,255,135,197, 98,193,201,147, 39,223,158, 57,115, 38,202,203,203, 23,212,243,236, 17, 65, 65, 65,132,117, 67, -241, 58,177,100,201, 18, 44, 89,178, 4, 95,126,249, 37,193,229,114,125, 26,200, 79,183,112, 62, 42, 45,210, 24, 11, 86, 3,145, -225,143,162,186,111,214,209, 7,132,214,163, 0,197, 21,252,189,103,191, 17, 67,230,205, 95, 40,249,238,167, 51,200,202,248, 29, -153,201,223, 87,187,167,199,200,153, 40,146,107, 48,115,238,191,164, 4,197, 25,146,116,234,224,223,205, 6,253,215, 78, 90,179, -130, 35, 4,252,127,244,233, 21,205,205, 23,101, 33,196, 87,132, 1,221,219,112,155,159,184,254, 15, 29,232, 47, 50,170, 86,201, -184, 36,178,182,190,246, 26, 6,154,205, 8,162, 40, 80, 4, 1, 10, 0, 73, 16,168, 52, 24,112,121,234, 84,244,218,185, 19, 31, - 31, 62, 44,254,228,249,231, 93, 18, 91, 18,137,228, 42, 65, 16,190, 90,173,118, 44,170, 54,150,126, 26,208, 81, 42,149, 30,101, - 89,182, 92,167,211,117,123,130,210, 21,138,170, 57,250,154,163, 99, 30,170, 86, 84,185,180,179,176, 64, 32,120,125,194,132, 9, -107, 55,108,216, 32, 46, 46, 46, 70, 65, 65, 1, 24,134,129, 80, 40, 68,219,182,109,137, 83,167, 78,249, 47, 92,184,112,245,209, -163, 71, 5, 26,141,230, 11, 87, 6, 54, 92, 46, 55,222,207,207,239,185,224,224, 96, 73, 73, 73, 73,133, 82,169, 60,105, 48, 24, - 94, 71,227,183, 77, 33,185, 92,238,148,200,200,200, 23,195,194,194,130,243,243,243,229,121,121,121,135, 12, 6,195, 55,104,228, - 70,205, 14,121,218, 5,214,104,245, 0, 10, 35, 35, 35,111,220,191,127,191,196,141,156, 5,145,145,145,233,141,224,148, 0,248, - 17, 64, 88, 3,247, 21, 0,152, 4, 23,173,217,246,140,101, 45, 63, 47, 93,183,117, 86,220,140, 1,196,215, 11, 70,180,125,227, -203, 83,231, 73, 30, 59, 40,163,176, 50,215,163,161,156, 19, 89,214, 45,173,106, 10,170,250,174,213, 11,131,193, 16,104, 50,153, -192,173, 99,179,120,157, 78, 7, 47, 47,175, 64,103, 19, 41, 18,137,240,253,247,223,131,203,229,130,203,229,162,188,188, 28,225, -225,225,246,115, 30,143,103,255,220,162, 69,139, 6,249, 24,134,233, 69, 81, 20,180, 90, 45, 24,134,177, 31, 74,165, 18, 44,203, - 66, 32, 16,128, 97,170,182,115,114,184,222,171, 46, 62,130, 32, 38,134,133,133,225,187,239,190,131,209,104,124,224,186, 76, 38, - 67, 90,218,159,155,140, 80, 20,133,222,189,123,147, 4, 65, 76, 4,176,160, 30, 94, 22, 0, 98, 99, 99, 65, 81, 20, 40,138, 2, - 73,146,246,207,182,131, 97, 24, 44, 89,178, 4, 53,182, 38,123,100,156, 79, 26, 26,136, 12, 95,136, 58,124,180,200, 38, 78,151, -227, 18,207, 48,177, 68,246,217,155,255,252,151,244,232,217,235,200,201,205,121, 64,100, 1,192,149, 95,190, 65, 97, 65, 62, 82, - 51,243, 48,229,239,111, 73,101, 50,159,207,106, 52,168,117, 46, 27,245,246,226,125,254,254,164, 1, 66,173,185, 0, 26, 95,128, -106,205, 7, 87,172,195,194,113, 93, 4, 50, 47,222, 42,103,210, 41,224,243,127, 89,113,234,148, 93,100,245, 55, 24, 32, 96, 24, -208, 12, 99, 23, 89, 70,154,134,222,104, 68,168, 86,139, 59, 51,103,130, 53,155,241,225,129, 3, 98, 1,159,255,139, 51,233, 4, - 0, 30,143, 23,122,232,208,161, 22,157, 59,119, 78,128,243,193, 76, 79, 53,241, 59,170, 15,221,187,118,237,154,184,115,231,206, - 22, 60, 30, 47,212, 29,156, 66,161,240, 21,137, 68, 82, 42, 20, 10, 95,105,100, 58, 73, 0, 75,103,205,154,149,242,204, 51,207, -156,177, 10, 43,187,168,121,230,153,103, 78,205,154, 53,235, 42,128, 37,117,148,245,218, 56,155,133,133,133, 45,219,176, 97,131, -248,214,173, 91,200,207,207,135,217,108,198,171,175,190, 10,134, 97,160,215,235, 97, 52, 26,177,114,229, 74,137,191,191,255, 98, - 84,109, 20,236,204,179,243,188,189,189,111,237,216,177, 99,194,189,123,247,164,103,206,156, 33,210,210,210, 36,171, 87,175, 30, -239,239,239,159, 5, 64,208,136,252, 36, 67, 67, 67,191, 62,120,240,224,155,105,105,105,225,251,247,239,231, 94,184,112, 33,116, -243,230,205,179, 67, 67, 67,119, 2,160, 26,249,142,186,137,197,226,225,239,189,247,158,229,220,185,115,249,231,206,157,203, 95, -187,118, 45, 6, 14, 28,216, 63, 46, 46, 46,166,145,156,221,189,188,188,134,189,247,222,123,150,164,164,164,130,139, 23, 47,230, -173, 94,189,154, 28, 54,108,216,128,101,203,150,117,113,145,243,199,115,231,206, 13,206,205,205,109,149,151,151,215, 50, 47, 47, - 47, 50, 47, 47, 47, 50, 63, 63, 63,162,176,176,176, 69, 81, 81, 81,243,146,146,146,230,137,137,137, 3, 0,236,118,134, 51, 42, - 88,242,230,130, 87, 71, 84, 44,254,251, 24,246,131,105,207,178, 11, 95, 29,204, 62, 55,168,243, 79, 20,135, 67, 92, 76,207, 65, -184, 55,240,205,188,158, 17,205, 3, 36,105,209,126,210,118, 79, 88,221,124,210, 56, 57, 54, 33,165, 80, 40,112,244,232, 81, 88, -173, 87,221, 28, 69,150, 90,173, 70, 97, 97,161,237, 26,199,153,116,202,100,178,211, 91,183,110,101, 43, 43, 43,161, 82,169, 80, - 82, 82,130,220,220, 92,220,185,115, 7,101,101,101,184,121,243, 38,196, 98,241,105,103,210, 73, 16, 4, 24,134,177, 11,169,147, - 39, 79, 98,214,172, 89, 80, 40, 20,246,239, 56, 28,142,253,179,237, 55, 13,113,218, 44, 79, 12,195,224,226,197,139,152, 51,103, - 14,214,174, 93,139,221,187,119,227,200,145, 35, 80, 40, 20,118,177, 69,211,116,131,156,114,185, 28, 22,139,115, 99, 38,150,101, -161, 82,169,156,126,239,142, 2,136,195,225, 60, 32,138,108,135, 43,101,233, 33, 57,159, 88, 56, 17, 25,190,238, 17,182,237,131, -213, 84, 55,164,169, 18, 73,114,120, 83, 38,206,120,219, 63,175, 68,141,252, 98, 21, 40,242,207,126, 47,102,196, 12,112, 40, 18, -151, 78, 84, 25,174, 72,138,130, 74,103,128, 82,107,194,132, 25,243,253,254,187,246,223, 83,104, 83,101,189, 49, 94, 58, 1,109, -163,165,210,151, 58,118,108, 65,102, 8, 50, 17,243, 92, 50, 24, 11,192, 38, 61,143,110,229, 65, 84,251, 95,248, 47,233, 52,166, -101,105,192,173,122,173, 25, 62, 62, 34,223, 46, 93, 16, 23, 22,134, 65,102, 51,120, 44,139,103,139,139,241,251,252,249, 48,236, -219, 7, 18, 0,239,149, 87, 48,116,221, 58,156, 13, 11, 67,136, 94, 15,229, 59,239, 32,240,248,113,240,100, 50, 17, 74,157, 91, -252, 64, 16, 4,134, 12, 25,130, 83,167, 78,249,143, 30, 61,250,196,245,235,215, 95,166,105,250,108, 99,242,214,219,219,251, 10, -135,195, 9,111,232, 62,154,166,243, 84, 42,149,203,219,140,112, 56,156, 65,189,123,247, 62,176,127,255,126, 95,147,201,228,150, - 81, 8,159,207, 31, 61,126,252,248,173,155, 54,109,146,205,158, 61,123,235,145, 35, 71, 42,140, 70,227,113, 87,138, 20,128,165, - 91,182,108,121, 35, 54, 54,214,103,246,236,217,236,157, 59,119, 28,173, 87,129, 3, 7, 14,124,102,235,214,173, 33, 61,123,246, -124,123,206,156, 57, 60, 0, 31, 54,100,229,145, 74,165,115,183,110,221, 26, 32,151,203,161,213,106,237,141,108, 94, 94, 30, 68, - 34, 17, 72,146, 4, 73,146,224,114,185,248,236,179,207,252,231,206,157, 59, 95,161, 80,204,119,194, 74, 22,191,113,227,198,192, -145, 35, 71,146,247,238,221, 3, 73,146, 16, 10,133,120,237,181,215, 72,189, 94,239, 27, 23, 23,183, 93,167,211, 77,118, 37, 15, -185, 92,238,148,248,248,248,118,253,251,247,231,100,102,102,162,111,223,190,184,116,233, 18, 94,121,229, 21,174, 70,163,105,185, -112,225,194, 89, 6,131,193,213, 56, 46,161, 98,177,184,211,175,191,254,154,219,188,121,115,123,195,210,178,101, 75,102,236,216, -177,138,204,204,204,168,115,231,206,149,245,235,215,207,149, 13,203,155,137,197,226,246, 63,255,252,115, 97, 92, 92,220,240, 45, - 91,182,140, 7,128, 94,189,122, 29,250,244,211, 79,207, 40, 20,138,232,179,103,207, 42, 6, 13, 26,148,231, 36, 95, 88,104,104, - 40, 51,111,222, 60,105,125, 55,109,219,182, 77,137,170, 13,151, 91, 1,168,119,191,182,168,200,144,197,171,230, 79, 20,129, 49, -129, 53,235, 1, 83, 5, 96,210,194, 98,172, 0,193, 19, 1,102, 61, 2, 5, 10,252, 56, 55, 74,182,232,187,187, 25,204, 77, 98, -108,166, 92,115, 28, 30,212,218,212, 0,136, 33, 8, 34,245,232,209,163,232,221,187, 55,142, 30, 61,138,177, 99,199,166, 58,138, -129,180,180, 52, 12, 26, 52, 8, 86,139,150, 83,190, 90, 42,149,234,253, 37, 75,150, 36, 77,153, 50, 69, 92,173, 49, 32, 73,248, -248,248, 96,204,152, 49,149, 58,157,238,125,103, 19,202, 48, 12, 56, 28, 14,242,242,242,176,109,219, 54, 44, 95,190, 28,109,219, -182,133,217,108,126, 64,108, 89,219, 61,167, 26, 63,154,166,113,249,242,101,236,218,185, 19, 31, 46, 94, 12, 47, 47, 47, 0,128, -201,100,130,162,188, 28, 66,161,208, 46,198, 26, 16, 78,123,110,223,190, 61, 63, 60, 60,188,218,148,161,237,175,181,205,130,197, - 98, 1, 77,211,168,172,172,196,218,181,107,105,150,101,247, 52,212,255,216, 68,209,252,249,243, 97, 48,252,105, 80,239, 98,245, - 73,142,140,140, 68,215,174, 93,237,231, 36, 73,178,206,114,254,183, 95, 39,232, 29,238,142, 90,178, 26, 0, 16, 30, 30,142,168, -168, 40,132,134,134,214,201,217,212, 90,164, 49,112, 33, 50,124,221, 66,235, 81,236,148,205,229, 9,135,182,110,211,142,200, 41, - 84,128,195,225, 64,226, 29,128,126, 47, 46, 0, 69,145,144,250, 4,128, 96,244,127, 42, 98,146, 2,135,226, 64,161,209, 35,178, - 85, 27, 82, 32, 20, 13,213, 53, 32,180,100,222,220,141,239, 77,238, 39, 44,163,243, 32,106, 33, 4, 99,235, 78,195,248, 32,253, - 53,120,119,116, 91, 81,236,161,235, 27,161, 50, 15,115, 38,189, 20, 77, 35,136,162, 96, 98, 89,252, 62,127, 62, 98,226,227,145, -106, 19,134,241,241, 72,141,141,133, 31,151, 11, 1, 73,130, 53,155, 31,152,211,119, 70,104, 1, 64,110,110, 46,246,237,219,231, - 55,113,226,196, 3,105,105,105, 83, 92, 20, 27, 54,174,128,139, 23, 47, 6,181,106,213,170,206,123,254,248,227, 15,244,232,209, -195,229,233, 41, 62,159, 63,122,216,176, 97,223,237,219,183,207, 59, 61, 61, 29, 65, 65, 65, 15, 45,180, 4, 2,193,160, 17, 35, - 70,124,183, 99,199, 14, 89,105,105, 41,226,227,227,101,207, 63,255,252,238,148,148,148, 23, 13, 6,131, 51, 98,179,154,200,138, -143,143, 87,110,219,182,237,191,168, 62, 69, 88,184,109,219,182,175,123,246,236,249,102,108,108,172, 15,128, 55,172,190, 3,245, -138, 45,129, 64, 48,164,117,235,214,213, 70,181, 2, 65,149,177, 73, 34,145,192,219,219, 27, 60, 30, 15, 6,131, 1, 49, 49, 49, - 4,159,207, 31,224,204, 51,123,121,121,141,120,233,165,151,200,228,228,100, 20, 21, 21,193,199,199, 7, 82,169, 20, 12,195, 96, -246,236,217,212,218,181,107,135,232,116,174,205,112, 53,111,222,124,252,240,225,195, 57, 55,110,220,192,189,123,247, 96, 48, 24, -144,149,149, 5,153, 76,134,105,211,166,241, 86,173, 90,245,124,126,126,190,171, 66,171, 83,108,108,108,177,163,200,178, 65, 34, -145, 16,237,218,181, 83,248,251,251,119, 7,224,138,208,234,244,214, 91,111,149,172, 88,177, 98,208,169, 83,167,236, 65, 47, 79, -157, 58,181, 16, 0,190,248,226,139,164,192,192,192,238, 0,156, 21, 90, 96, 89,214,242,183,191,253, 45,155,207,231,131,203,229, -130,207,231, 87, 59,120, 60, 30, 72,146,244,178, 85,231,134,248, 50,238, 21,173,156,189,112,245,106,137,144,226,254,243,197,206, -104,225,195, 3, 68,126,224, 13, 90, 4,194,167,202,104,201, 42,254, 0,126, 89,132, 53, 47, 41,200,216,111, 43,127, 50, 49,190, -129,119,203,203, 53,143,185, 15,232, 9,224, 63,168,218, 92,119, 49,128,139, 79, 72,223,116, 21, 64,204,216,177, 99,237, 98,235, -216,177, 99, 24, 61,122, 52,148, 74, 37,110,220,184,225, 40,178, 92,217, 96,249,170,217,108,190,246,253,247,223,247,155, 56,113, - 34,225, 80,191,144,158,158,142,155, 55,111,166, 58,203, 71,146, 36, 44, 22, 11,184, 92, 46, 86,175, 94, 13,147,201,132,111,191, -253, 22,123,247,238, 5, 73,146, 32, 8, 2, 4, 65, 64, 38,147,225,203, 47,191,116,169,221, 99, 24, 6,219,183,111,199,162,133, - 11,237, 34,203, 58,147,129,144,224, 96,248, 7, 4,224,238,221,187, 13, 10,173,242,242,242,143, 15, 31, 62,140,250,156,225, 15, - 31, 62,108,255, 92,195, 25,190,225,126,142,162, 96, 48, 24,240,236,179,127,110, 21,251,214, 91,111,217, 63, 43, 20, 10, 80, 20, -101,203, 11,194, 89, 78, 61, 11,188, 40,252,243,187, 49,239,190, 91,205, 66, 87, 23,231,163,208, 34,238,178,110,213, 34,182, 98, -172,214,217, 80, 0, 99, 81,229,163, 85, 8, 60, 66, 31, 45,150,181,180, 15,111, 22,134,107,119,210,192,161, 40,240,189, 3,224, -237, 23, 12, 11,109,132,170,228, 30, 18,246,127, 5, 0,216,178,125, 15, 72,146, 4,135, 67,193, 96,100,208,182, 69, 24, 44, 22, - 75,251,250,184, 59, 0,253,134, 4, 7,244,110, 30,225, 67,220,240,189,135,118, 65,254, 53, 38, 66, 4,104, 91, 32, 37,250, 74, - 69,189,202, 85,234,126, 25,192,185, 6,197, 0, 73,130, 36, 8,136,121, 60, 24,246,237,171,242,218,140,175,234,179, 82, 99, 99, - 65,254,244, 19,188, 4, 2, 80, 4, 1,142,213, 4,221, 24,168,213,106, 16, 4,129, 93,187,118,249, 78,155, 54,109,247,141, 27, - 55, 98, 43, 43, 43,247,185,194,161, 84, 42,199,246,239,223,255,204,246,237,219, 3, 67, 66, 66, 30,184, 94, 84, 84,132, 25, 51, -102,148, 42,149, 74,151,130,186, 9,133,194, 87,198,143, 31,191,245,155,111,190,145,221,190,125, 27, 90,173, 22,129,129,129, 15, - 91, 20,186,247,233,211,231,192,190,125,251,188,139,138,138,160, 82,169, 96, 48, 24,176,107,215, 46,159, 49, 99,198,236,203,204, -204, 28, 13, 32,165, 1,142,143, 28, 69,214,156, 57,115,174, 3, 8, 2,176,177,166, 6,181, 94,235,236, 32,182, 84, 0, 86,213, - 51, 18,141,144, 72, 36, 40, 41, 41,193,140, 25, 51,112,235,214,159, 6,208,176,176, 48,251, 72,239,238,221,187, 8, 12, 12, 4, - 65, 16, 65,206, 60,116, 96, 96,160,212,104, 52, 98,214,172, 89,200,205,205,173,198,153,151,151, 7,130, 32,196,174,102,100,112, -112,112,176, 94,175,199,192,129, 3, 81, 89, 89,181,175,239,164, 73,147,192,229,114, 81, 82, 82, 2, 46,151, 27,208,136,247, 19, - 48,118,236,216, 58, 67,171,200,100, 50,147,175,175,111, 7, 23, 57,253,159,127,254,249,252,248,248,248, 7, 22,182, 92,186,116, -233, 5, 63, 63,191, 83,126,126,126,237, 92,228,180, 56,138, 42, 30,143, 87, 77,104,113,185, 92,144, 36,233,180,143,218,173, 18, -221, 6, 14, 81,216,117,197,188,145, 51, 90, 4,121,131,213, 22,131, 55,236, 99, 92, 43, 21, 97,245,218,159, 1, 0,255,122,173, - 7,186,140, 88, 10,227, 55, 35, 49,191, 47,197,159,154,103,120, 15,192, 71,143,185,205,255, 28,128,109, 21,220, 38, 0, 93,159, -160,254,200, 46,182,142, 29, 59,134,232,232,104,148,151,151, 35, 51, 51,179,177, 34,203,214,222, 45,250,228,147, 79,126,121,249, -229,151, 37,182, 65,171, 72, 36,194, 59,239,188,163,215,106,181,139, 92, 42, 68, 22, 11, 56, 28,142,125,144, 44, 20, 10, 17, 19, - 19, 99, 23, 89, 4, 65,160,162,162, 2, 28, 14,199,182, 34,145,112, 50,141, 8, 13, 9,129,151,151, 23,218,180,109,139,219,214, -118,196,246, 89, 32, 16,128, 32, 8,208,116,131,134, 60,141,213,169,125,129,187,187,100,155, 40,170,215,116, 28, 22, 6,139,197, - 98, 19,153,172, 59, 56, 3, 2, 2,160,213,106,157,229,124, 34, 81,135, 69,203, 38,180,198,162,202, 87,235,129,240, 14,131, 1, - 36,160, 9,151, 84, 18, 96, 9, 11,203,130, 67,145,214,185, 91, 10, 20, 69, 66, 81, 90,136,117, 31,191, 97, 21, 89,123,113, 52, - 41, 19,225,173,163,255,156,199, 37, 8,128,173,191,112, 7,122,243,226,231,190,220, 71, 84, 76, 20,194, 39, 76, 12,161,176,134, -126,244,229,129,136, 36, 49,111, 72,184,248,242,225,202,248, 12,149,169,193,142, 66, 72,146, 85,206,239, 4, 81,171,115, 15,105, -189, 70, 17, 4, 88,150, 5,107,113,205,239,216, 38,228, 69, 34, 17, 76, 38, 19, 40,138,194,250,245,235,125, 70,140, 24,177,209, - 85,161, 5, 32,189,184,184,120,204,236,217,179,143,237,217,179, 39, 32, 32, 32,160,218,232, 97,246,236,217,242,226,226,226, 49, -112,209,233,158,203,229,110,220,180,105,147,236,254,253,251,168,168,168,128, 72, 36,178, 55, 62,141, 45,159,189,122,245, 58,113, -252,248,113, 95,149, 74, 5,147,201, 4,145, 72, 4,150,101, 65, 81, 20,126,248,225, 7,255,113,227,198,253,156,147,147, 51,172, -190,180,138, 68,162, 23,173,194, 9,177,177,177, 62,177,177,177,131,129, 58, 35,245,218, 17, 27, 27,235,179, 96,193,130,231,245, -122,253,170,122,158, 57, 87,161, 80,132,136, 68, 34,236,223,191, 31, 82,169, 20, 98,177, 24, 97, 97, 97, 80, 40, 20, 16,139,197, - 96, 89, 22,102,179,217,214, 88,148, 57,243,224,165,165,165, 90,154,166,189,143, 29, 59,134,178,178, 63,127,210,162, 69, 11, 40, -149, 74, 88, 44,150, 10, 87, 51,179,160,160,160,152, 32,136,230,215,174, 93,195,253,251,247, 49,122,244,104,252,244,211, 79,232, -209,163,106,118,216,104, 52, 54, 38,136, 31, 67, 81, 20, 91, 79,185, 37, 0,248,186,147,211,218,121,185,196,105,177, 88, 44, 54, -145,229,248,215, 81,124, 53,240, 63,171, 85,231, 14,193,210,109, 43,230, 14,159, 49, 50, 58, 0,250,210,123, 16,122, 5,128,240, -137,196,234,181, 63,227,198, 31, 85,239,107,245,238, 43,248, 46,110, 12, 32,242, 67,148,183, 28, 33, 94,156,151,110,150, 60,118, -161,229,237, 56, 78,120, 82, 59,166,209,163, 71, 67,161, 80, 64, 42,149,186,195, 63,231,188, 94,175,207, 58,120,240, 96,247,177, - 99,199,130,207,231, 35, 43, 43, 11, 41, 41, 41,153, 0,206,187, 42,180,184, 92, 46, 62,249,228, 19,188,241,198, 27, 8, 14, 14, -198,162, 69,139,192,225,112,236, 7, 65, 16,118, 11,151, 43, 8, 10,174,127,225,163,205, 33,190, 33, 99,184,183,183,247, 39, 36, - 73, 78,164,156,200, 56,134, 97, 24,139,197,178, 71,165, 82,213, 27,222,193,230,184,238,204,187,112,204,131, 6,250,180,135,230, -124, 20, 90,164, 49,168,185,218,176, 14,139,150,109,213,225, 3, 91, 1,217,158, 50,193,106,178, 75,104,170,132, 18, 36,117, 51, - 47,191, 0,254,190, 82,171,200,178, 30, 36,137, 46,209, 85,131,217,163, 73,153, 8,111, 21, 13, 14, 69,129, 67, 81,144,138, 4, - 40, 46, 42, 4,135, 67,222,172,139,183, 19,133,151, 95,110,215, 60,210,215,159, 11,121,160, 17,161,193,117, 24, 6,186,123, 33, - 60,148,143, 81,254,194,136, 78, 20, 94,174,223,250,198,218,133,150,137,166,193,123,229, 21,251,116, 97,106,108, 44, 98,226,227, -193,140, 31, 15,157,201, 84,205, 84,220, 88,161, 37, 18,137,160,209,104, 48,101,202, 20,133,217,108,126,179,145, 89,156, 82, 86, - 86, 54, 97,234,212,169,101, 54, 1, 99, 50,153, 48,117,234,212,178,178,178,178, 9, 78, 88,137, 30,128,217,108,126,179, 71,143, - 30, 10,185, 92,110, 79,103, 99, 26, 28, 27,252,252,252,142,110,219,182,205,207, 96, 48,128,166,105, 59,167, 72, 36, 2, 69, 81, - 8, 12, 12,196,119,223,125, 23,232,231,231, 87,239,158, 85,122,189,254, 96,124,124,188, 18, 0,226,227,227,149, 4, 65, 36, 18, - 4,177,153, 32,136, 77, 53,142,205, 4, 65, 36, 58,222,171,215,235, 15,212,199,109, 52, 26, 19, 51, 51, 51, 89,177, 88, 12,138, -162, 96, 50,153, 32, 20, 10,237, 38,113,181, 90, 13,189,190,106,154, 59, 37, 37, 5,102,179, 57,217,153,103,215,104, 52,167,183, -111,223,110,105,209,162, 5,162,163,163, 17, 19, 19,131, 62,125,250, 32, 34, 34, 2,159,126,250, 41,163,211,233, 92,174,123, 5, - 5, 5, 71,127,252,241, 71,115,243,230,205,209,189,123,119, 8, 4, 2,116,233,210, 5, 97, 97, 97, 88,190,124,185, 81,165, 82, - 29,107,196,107,202, 73, 75, 75,163,234, 17,185, 50, 56,177,122,183, 6,114, 47, 95,190, 76,245,233,211,231, 80,205, 11,189,122, -245, 58, 36,149, 74,189,109, 38,118, 87, 70,228,142,226, 74, 32, 16,216, 15,219,247, 28, 14,199,153,209, 15,217, 33, 88,186,237, -179, 55,134,206, 24, 25,237,139, 67,167, 47,130,103, 82, 2,198,122,102, 4, 25, 51, 8,158, 4,193,222,220,240, 39,160, 15,152, - 15,224, 58,170,226, 48, 45,194,147, 5,187,227,123, 89, 89, 25, 50, 51, 51,145,146,146,130, 62,125,250, 32, 57, 57, 25,248,211, - 65,222,101,168, 84,170, 69,113,113,113, 58,219, 74,190,197,139, 23,235, 53, 26,205, 34, 87,219, 96,150,101,193,229,114, 17, 21, - 21,133, 5, 11, 22,224,231,159,127, 70, 86, 86, 22,204,102,179, 93, 8,217,124, 50, 93,177,104,241,120, 60, 4, 7, 7,195,108, - 54,219,173, 89, 0,112,251,214, 45,112, 56, 28, 88, 44, 22, 24,141,198, 6, 45, 90,222,222,222,159,108,221,186,245,109,185, 92, - 30, 90, 90, 90, 26,228,120, 20, 23, 23, 7, 21, 22, 22, 6,229,231,231, 7,229,230,230, 6,101,103,103, 7,221,187,119, 47,116, -229,202,149,111,123,123,123,127,226, 76, 58, 41,138, 66,151, 46, 93,240,214, 91,111,217,143, 13, 27, 54,216,143,132,132, 4,151, -157,215, 41,138, 66,212,146,213, 24, 83,202,218,143,159, 3, 9,251,113,227, 95,115,234,227,108,114, 45,210, 40,253, 98, 93,109, -232,184,177,116, 45,176,173, 58,180,181,101,118,183,141,154,206,240, 77, 6,218, 88,121,230,143, 59,183,134, 70,117,234, 73, 22, -201,181,213,150,127,198, 12,153, 0,130, 32,208,172, 85, 52, 40, 14, 7, 20, 69,130, 67, 81,240,145, 9,145,121,237,154,197,160, -215,159,169,141,115, 48,192,225,139,248, 27, 94, 27,213, 69, 88,192, 47, 65, 96,168, 4, 60,110,149,118,100,255,152, 80,163,135, -224, 0,157,188, 48, 51,223, 95,116,166,184,114,131,175,206,116, 40,177,142, 17,160,197, 98,129, 84, 32, 64,165,193, 0, 61, 77, - 99,200,186,117,246,233, 66,146, 32,112, 21, 64,231,117,235,112,110,223, 62,200,248,124, 64, 32,112,122, 85, 72,109, 66, 75, 46, -151, 99,250,244,233,101,133,133,133,211, 26,227,163,101,131,193, 96, 56, 91, 84, 84, 52,109,194,132, 9,187,246,239,223,239, 55, - 97,194, 4, 69, 81, 81,209, 52, 39,253,158, 30, 64,101,101,229,190,220,220,220,138,233,211,167,239,220,189,123,183,127, 64, 64, -128,125, 36,210,168,194, 74, 16,242,225,195,135, 11,156,185,175,129, 91,226,172,206,237,111, 88, 45, 91,157,231,204,153,115, 14, - 85,254, 87,142, 88,178,101,203,150, 73, 14, 83,140,155, 1,172,171,143, 88,173, 86,111, 90,176, 96,193,223,207,158, 61, 27, 32, - 20, 10, 65, 16, 4,120, 60, 30,218,180,105, 99, 95, 69,195,229,114,193,178, 44,222,125,247, 93,121, 73, 73,201, 23, 78,190,155, - 57,113,113,113,131, 42, 43, 43,125,167, 79,159, 78, 9,133, 66, 20, 23, 23, 99,237,218,181,204, 55,223,124,163,212,233,116, 51, - 26, 33,132,183,255,251,223,255, 30,162,213,106, 91,205,158, 61,155,167, 82,169,160,215,235,241,222,123,239, 25,191,254,250,235, - 60,189, 94,239,114,192,223,190,125,251,222,201,206,206, 30, 80, 81, 81, 81, 46, 22,139,107, 90,251, 8,137, 68,210, 19,192, 78, - 87, 56, 99, 98, 98,238,230,228,228,244, 89,186,116,105,162,217,108,230, 94,186,116,201,238, 12,191,126,253,250, 4,161, 80, 56, - 28, 46,110,190, 74, 16,132, 69, 32, 16, 84,179, 96,213,252,204,225,112, 26,108,211,218,135,136,151,126,246,250,160, 25,207,118, -240,198,193,211, 87, 16,119,224,143,155,109,103, 4, 70, 61,227, 91, 10, 75,105, 38,254,245, 90, 15,172,222,125, 5, 64,213,212, -161,165,228, 6,216,242,187, 96,189,154,227,158, 66, 94,240, 4,244, 1, 9,168, 10,153,241,164,161,154,200,186,113,227, 6,134, - 14, 29, 10, 0, 72, 78, 78, 70,255,254,253,145,156,156,140, 1, 3, 6,184, 28, 75,203,138, 95,213,106,117,118, 66, 66, 66,199, -230,205,155,227,252,249,243,247, 0,252,234,106, 34,109, 66,139,195,225,224,213, 87, 95,197,136, 17, 35,208,162, 69,139,106,171, - 13,109,159, 93, 17, 27, 52, 77,163, 83,167, 78, 48, 24,141,224,241,120,246,169, 73, 14,135,131,192,160, 32,220,185,115,199, 41, -139, 22, 73,146, 19, 95,124,241, 69, 50, 61, 61, 29,147, 39, 79,198,174, 93,187,234,188,119,234,212,169,248,254,251,239,241,226, -139, 47,146, 31,124,240, 65,189,225, 29,108, 78,232,206, 60,147,173,159,110,168,221,119, 23,103, 83,107,145,135,129, 67,104,135, - 90, 39, 77,106,249, 46,190,154,208,114, 8, 18,214, 52, 66,139, 54,237,250,233,219,175, 22,244,217, 56, 32, 48, 52,200, 27, 10, -149,222, 46,182, 82, 19,246, 2, 0, 94,158,179, 12, 28,170,106, 74, 81, 38, 21, 66,196,163,176,111,199, 23,114,147,169,178,214, -210,165,225,146,111,124,208,175,141, 55, 95, 98,134, 58,132, 69,116,224,159, 59,229, 16,173,246, 62, 40,184,186,249, 34,224,248, - 59,101,193, 0, 0, 9,165, 73, 68, 65, 84, 70, 57, 94,123, 70, 42,251, 34, 93,249, 6,204,150, 13, 15,116,136, 74,165, 94,121, -237,154,104,244,214,173,184, 52,109, 26,154, 49, 12, 18,195,194,224,199,229,194, 91, 32, 0, 73, 16,208, 31, 57,130,115,251,247, - 35, 88, 32, 0,188,188, 64,127,250, 41, 12,153,153, 48,107, 52,250, 70,140,204, 48,105,210, 36,185, 92, 46,159, 96, 52, 26,207, - 62,108, 62,235,245,250,227,185,185,185,111,244,237,219,119,163,217,108,126, 83,175,215, 63,212,202, 40,163,209,120,188,168,168, -232,149, 73,147, 38,237, 61,112,224, 64,128,143,143, 79,163,185,202,202,202,122,184,169, 56, 89, 0,124,104,117,110,127, 35, 54, - 54,214,231,242,229,203,127,223,182,109,219, 70,135,209, 68,208,172, 89,179, 94,175, 33,178, 26, 92,117, 8, 32,167,164,164,228, -211,119,222,121,103,217,154, 53,107,164, 54,199,247,223,127,255, 29, 52, 77,131,203,229,130, 97, 24,204,154, 53, 75, 91, 86, 86, -182, 26,117, 71,116,126,160,104,169,213,234, 54, 75,151, 46,221,182,110,221,186, 17, 20, 69, 73, 24,134,209, 85, 84, 84, 36, 86, - 86, 86,206, 64,227,226,104, 89, 74, 75, 75,167,127,244,209, 71,211,215,174, 93,251, 34, 73,146, 65, 52, 77,203, 53, 26,205, 97, -189, 94,255, 53, 26, 49,149,116,254,252,249,210,215, 94,123,237,143,210,210,210,246,225,225,225, 42,169, 84,106, 52, 26,141,148, - 72, 36,146, 73, 36,146, 24, 0,231, 9,130,200,112,133, 51, 53, 53,181,104,246,236,217,247, 13, 6, 67,212,230,205,155,147,100, - 50,217,105,130, 32, 8, 30,143,231, 43, 18,137,134, 2, 72, 36, 8,226,182, 43,156, 36, 73, 90, 28,173, 87, 53,253,179,248,124, -190, 83, 62, 90,173, 2,197, 51, 71,180,225,224,224,153, 43,136, 59,152,179,157, 97,217,253,251, 83,203,143, 44,234, 15,152,246, -188,134, 46, 19,118, 86, 77, 23, 2,176,148,220,128,105,207, 84, 16,226, 0, 36,229,115,161,210,155,142,194,131,218, 96, 15,239, - 32,151,203,145,158,158,110, 19, 89, 49, 0, 48, 96,192,128, 84,155,216, 74, 73, 73, 65,247,238,221, 83, 1,112, 93, 45,175,106, -181,250,157, 41, 83,166, 28,183, 14,142,223,105,196,192,207, 46,180,108,130,170, 69,139, 22,246,115,199,195,193, 71,203, 41, 48, - 12, 3, 30,143, 7, 14,135,131,208,176, 48,251,255, 98, 89, 22,119,238,220,129, 66,161,112, 74,104, 81, 20, 69, 17, 4,129,201, -147,157, 91,144,252,183,191,253, 13,137,137,137,160,156, 84,133, 20, 69, 33, 50, 50,178,193,123,108,186,212, 89,206,240,240,240, - 70,115, 54,181, 22,105,172,192,170,237,115,109,162,170,174, 10,241,168, 80,160,213,170, 62,220,177,117,253,154, 89,115,223,149, -222,184, 91, 12,149,214, 0,138, 34, 29, 27, 79,112, 56, 20,100, 18, 33,154,135,120, 99,247,127,255,163,209,168,149, 31,161,142, -125, 15, 91,120,241,230, 12,239,249,140,128, 23,170, 67, 84,231, 73,160,132,127,138, 0,182,168,142,217,193,254,191,224,185, 28, -157,240,167, 28,221,156,171,229,198, 7,133,150,209, 56,114,241,168, 81, 39,226,126,254, 89,220,107,251,118,220,157, 53, 11, 97, -122, 61, 4,214,169, 68,146, 32, 32,229,241, 32,229,241,170, 68,214,218,181,208,211, 52,214, 77,155, 86, 97, 48, 26, 71,185, 82, -201,203,202,202, 48,126,252,248,210,130,130,130, 49,104,196,212, 94, 93,208,233,116,251, 0,236,115, 23,159,193, 96, 56,155,151, -151,247,220,248,241,227,127, 62,126,252,120,224, 19, 18,100,206, 38,182, 76,151, 47, 95,126, 61, 41, 41,233, 46,170,111, 44,170, - 76, 74, 74,186, 59,123,246,108, 98,219,182,109, 95, 3,248, 55,156, 12,224,169,211,233,214,159, 60,121, 18,131, 6, 13,250,247, -138, 21, 43,252,123,244,232,129,160,160, 32,104, 52, 26,164,164,164, 96,254,252,249, 10,181, 90,189, 66,169, 84,174,113, 49,205, - 38,131,193, 48,213,113, 41,181, 59,242,193, 96, 48,124, 83, 88, 88,248,141,187, 8,231,205,155,247,251,157, 59,119,202, 2, 3, - 3,123,243,120,188,206,168,242, 3, 42, 2,240,181,171,130,200,134,185,115,231, 94,187,115,231,142,188, 89,179,102,125,172,156, - 62,168,218,198,104,107, 35, 56, 11,174, 92,185, 18,222,179,103, 79,146,203,229,178, 20, 69,129,203,229,178, 28, 14,135,181,250, -213,176, 0,112,248,240, 97, 1,128,122,183,205,185, 91,162, 95, 58,245, 63,191,125,144, 81, 84,185, 63,179,184, 98, 1, 0,118, -207, 13,241, 47, 93, 2,169,145, 35,219,229,193, 16, 63, 0,132,172, 42, 80, 37,171, 45, 4, 33, 9, 70,158,165, 25,150, 28,186, - 89, 68,131, 88,229,209, 84,181,143,171, 97, 13,239, 80, 88, 88,232, 40,178,108, 86,171,152, 1, 3, 6,164, 90, 69,150,237, 90, - 99,252,203, 78, 89, 44,150,135,234,195, 88,150, 69, 92, 92, 28,182,108,217,130,134, 34,154, 91, 87,247, 17, 13,241,217, 44, 90, - 12,195,192,100, 50,225,198,141, 27,246,152, 93,182,233, 66, 91,104, 7,154,166,235, 93,173,206, 48, 12, 99, 52, 26,241,195, 15, - 63, 56, 37,182,190,251,238, 59, 84, 86, 86,130,105, 64,193, 57,134, 98,232,218,181, 43, 20, 10,133,125,177, 79, 76,204,159,161, -242, 76, 38,147, 75,194,213,198, 25, 21, 21, 5,185, 92, 14,155,191,112,243,105,127, 26,123,104,157,238,175, 90,238,235,180,104, - 61,242, 30, 83, 32,150, 29,239,209,111, 68,255,105,175,207,151,104, 13, 12,238,223,207, 70,105, 73, 33, 72,130, 68,104,179,112, - 68, 68, 68, 66,196, 39,177, 43,126,141, 46,245,220,233,223,180,154,242,209,117,113,141,245,230,157, 91,251, 74,255, 62,173, 91, -123, 17,160,205, 0, 99, 6,104, 51, 96,177,254,181,125,103,169, 94,230,210,211,149,236, 7, 87, 21, 23,142,170, 76,181,238, 89, - 53, 1,232,239,227,231,119, 98,201,225,195, 98,139,201,132,178,119,222,129,152,166, 33,180,142, 74,170, 30, 68, 0,250,211, 79, -171, 68,214,212,169, 21, 42,165,210,165, 45,120, 2, 2, 2,174, 16, 4, 17, 80, 90, 90,250, 84, 69,134, 15, 12, 12, 60,202,178, -172, 92, 46,151,247,120,130,210, 21, 4, 64, 9,192, 84,203, 64, 34, 16,174,251,255,216, 16, 25, 24, 24,248, 1, 73,146,125, 89, -150,245, 39, 73,178,220, 98,177,156, 47, 41, 41, 89, 9,224,142,167, 63,125,108,176, 69,134,111,217,192,125, 37, 0,254,137, 42, -167,224,251,206,146,119,241,246,246, 54,240,205, 7, 94,136, 22, 12,153, 24,227,141, 86, 33, 94,224,242,132, 40, 80,211, 56,149, -161,198,214,132,162, 92,189,153, 25,119,171,180, 34,205,243, 42,234,133,219,183,224,113, 39,252,252,252, 46,158, 56,113,162, 71, -171, 86,173, 72, 71,135,119, 91,172, 60,219,244, 22,135, 83,165,229,206,158, 61, 75, 79,158, 60,249,124,113,113,241,160,186, 56, -189,188,188,126,185,126,253,250,179, 42,149,234, 1, 65,229, 24, 41,222,118,174,211,233, 48,119,238,220,147,117,109,193,227,237, -237,189,118,205,154, 53,111,191,252,242,203,164, 45, 28,133,227, 97,219, 46,200,118,152, 76, 38,236,220,185,211,242,197, 23, 95, -124,169, 82,169,234,156, 58, 12, 13, 13,205, 45, 40, 40, 8,183,133, 90,112, 38,168,104,100,100,100, 97,118,118,118,216,163,228, -124,138, 5, 87, 53,235,214, 99, 49, 77,112, 69,162,121, 94, 82,223,143, 95,158,242,150,127,100,235,182, 68,112,104, 51, 16, 32, - 81, 92,148,143,236, 63,110,177, 7,190,253,170, 76,167, 86,124,162,215,235,190,170,143,167, 3,208,186,165,140,183,135,207,160, - 29,108, 2,168,198,254, 84, 15,140, 56, 0,152,184,228,205,251, 26,243,164,140,122,166,125,108, 98,235,195, 3, 7,196,252,118, -237, 30, 8, 20,103,177, 88, 96,200,204,196,186,105,211, 92, 22, 89, 30,120,224,129, 91,208, 10, 13,199,200, 50,163, 42, 62,151, -171, 22, 19, 34, 42, 72, 50,137, 5, 38,146,176,116, 34, 9,130, 79,179,200, 2,139, 95,196,156,138,141,169,133,208,123,178,223, - 41, 60,177,155, 74, 3,144,248,249,249,157,166, 40, 42,194,102,145,113,180,214,215,178,161,244,253,226,226,226,225, 0,234, 91, - 33,220,218,203,203,235, 43,134, 97,122, 57,179,169, 52, 69, 81,151, 52, 26,205, 60,212,179,169,116, 83,172, 58,244,247,247,191, -147,157,157,221,218,182,138,218,177,175,172,109,101,249,237,219,183, 49,120,240,224,236,162,162,162,200, 71,201,249,164,162,142, - 85,135, 79,142, 69,203, 1, 97, 60,129,116, 58, 95, 36, 28,102, 49,211, 81, 32, 0, 14,151,123,211, 88,169, 63, 99,208,107,119, -160,142,233,194, 71,137, 9, 64,127, 1,159,255, 11, 79, 38, 19,213, 38,218,204, 26,141,222, 96, 52,142,244,136, 44, 15, 60,240, -192, 3, 15,158, 34,180,243,243,243, 59,193,229,114, 5,142, 98,178,230,103, 27,104,154,174, 44, 45, 45, 29, 13, 32,235, 17,115, -254,111,194, 69, 39,181, 17,206,114, 90,143,193, 79, 58,103, 19, 62, 59,235, 70,206,193, 86,206, 37, 79, 73, 58, 7, 63,169,156, -182,231,117,129,119,132, 43,229,200, 93,249,233,144, 78,214,221,233,108, 42, 78,119,213,163, 90,210,201, 54,193,123, 95,242,148, -164,115,240,147,198, 89,179,252, 56,201,235, 18,167,147,101,202,213,116,178,238, 78,103, 83,113, 62,108, 61,170, 39,157,236,195, -150,165, 58,222,253, 18, 60,133, 72,239, 6, 54,189, 27,216, 27,221,107,141,219, 24, 91,215,239, 92,114, 36,108,170,149, 0,182, -176,251, 86,126,226, 73,229,116,204, 7,119,110, 21,208, 4,219, 14, 36,184,155,179, 70,126,186, 11, 75,172, 43, 76, 18,225, 68, -192, 81, 87,158,221, 29,239,189,198,179,186,133,183, 17, 34,203, 37, 78,119,149,251,166,230,116, 87, 93,170,201,233,142,114, 95, -219,123,111,194,119,228,174,116,186,165, 46, 53, 69,153,175,165,252, 60, 52,111, 77, 78,119,212,165,154,156,238, 40,247,143,130, -211, 29,117,169, 54, 78,119,148,251,186,222,253,211,106,104,178, 77, 23, 90, 67, 60, 16, 78,136,173,120, 0, 32, 27,147,105, 77, -104, 41, 27,226,110, 78,119,167,185, 41,196,166, 11, 22,152,199,206,233,230,119,180,196,202,233,206,209,205, 16,119,189,163,166, - 40,239,142,156,238,226,175,201,227,142,247, 84, 27,231,195,166,183,142,116,186,253,217, 31,182,220, 63, 42, 78, 55,191, 35,183, -212,165, 26,156, 67,220, 60, 24, 24,226,112,190,196,157,156,238,170, 75,181,164,243,161,223, 83,109,156, 15,155,222, 58,210,233, -246,103,119, 71, 31,210, 84,188,143,211,162,197,146,117,150,137,248, 26,199, 35, 17, 26,143,109, 74,206, 69,238,191, 20,167,139, -211, 51, 35,154,224,221, 63,214,116,186,147,179,102, 26,221, 57,221,211,148,233,116, 39,167, 11,105,253,203,113, 62,109,239,253, - 73,204,207,186,248, 30,102, 90,170, 46,235,104, 83,164,211,157,156, 78,114,255, 37, 56, 31,226,221,255,229,192,121, 82, 18, 98, -203,120, 55,143, 76,224,102, 11, 76,147, 61,183,155,211, 57,164, 41, 44,132, 77, 0,183,167,211, 58, 82,254,184, 9,158,253,105, -201, 83, 79, 93,242,212,165, 39,174, 46,213, 40,147, 67,220,104, 41,114,171,229,185, 38,167, 59,254,135, 35,135,187,202,104, 83, - 63,187, 59,235, 82, 83,188,251,167, 13,255, 15, 47,211, 45,132, 34, 78,139,159, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130, +137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, + 72, 68, 82, 0, 0, 2, 90, 0, 0, 2,128, 8, 6, 0, 0, 0, 68,254,214,163, 0, 0, 10, 79,105, 67, 67, 80, 80,104,111,116, +111,115,104,111,112, 32, 73, 67, 67, 32,112,114,111,102,105,108,101, 0, 0,120,218,157, 83,103, 84, 83,233, 22, 61,247,222,244, + 66, 75,136,128,148, 75,111, 82, 21, 8, 32, 82, 66,139,128, 20,145, 38, 42, 33, 9, 16, 74,136, 33,161,217, 21, 81,193, 17, 69, + 69, 4, 27,200,160,136, 3,142,142,128,140, 21, 81, 44, 12,138, 10,216, 7,228, 33,162,142,131,163,136,138,202,251,225,123,163, +107,214,188,247,230,205,254,181,215, 62,231,172,243,157,179,207, 7,192, 8, 12,150, 72, 51, 81, 53,128, 12,169, 66, 30, 17,224, +131,199,196,198,225,228, 46, 64,129, 10, 36,112, 0, 16, 8,179,100, 33,115,253, 35, 1, 0,248,126, 60, 60, 43, 34,192, 7,190, + 0, 1,120,211, 11, 8, 0,192, 77,155,192, 48, 28,135,255, 15,234, 66,153, 92, 1,128,132, 1,192,116,145, 56, 75, 8,128, 20, + 0, 64,122,142, 66,166, 0, 64, 70, 1,128,157,152, 38, 83, 0,160, 4, 0, 96,203, 99, 98,227, 0, 80, 45, 0, 96, 39,127,230, +211, 0,128,157,248,153,123, 1, 0, 91,148, 33, 21, 1,160,145, 0, 32, 19,101,136, 68, 0,104, 59, 0,172,207, 86,138, 69, 0, + 88, 48, 0, 20,102, 75,196, 57, 0,216, 45, 0, 48, 73, 87,102, 72, 0,176,183, 0,192,206, 16, 11,178, 0, 8, 12, 0, 48, 81, +136,133, 41, 0, 4,123, 0, 96,200, 35, 35,120, 0,132,153, 0, 20, 70,242, 87, 60,241, 43,174, 16,231, 42, 0, 0,120,153,178, + 60,185, 36, 57, 69,129, 91, 8, 45,113, 7, 87, 87, 46, 30, 40,206, 73, 23, 43, 20, 54, 97, 2, 97,154, 64, 46,194,121,153, 25, + 50,129, 52, 15,224,243,204, 0, 0,160,145, 21, 17,224,131,243,253,120,206, 14,174,206,206, 54,142,182, 14, 95, 45,234,191, 6, +255, 34, 98, 98,227,254,229,207,171,112, 64, 0, 0,225,116,126,209,254, 44, 47,179, 26,128, 59, 6,128,109,254,162, 37,238, 4, +104, 94, 11,160,117,247,139,102,178, 15, 64,181, 0,160,233,218, 87,243,112,248,126, 60, 60, 69,161,144,185,217,217,229,228,228, +216, 74,196, 66, 91, 97,202, 87,125,254,103,194, 95,192, 87,253,108,249,126, 60,252,247,245,224,190,226, 36,129, 50, 93,129, 71, + 4,248,224,194,204,244, 76,165, 28,207,146, 9,132, 98,220,230,143, 71,252,183, 11,255,252, 29,211, 34,196, 73, 98,185, 88, 42, + 20,227, 81, 18,113,142, 68,154,140,243, 50,165, 34,137, 66,146, 41,197, 37,210,255,100,226,223, 44,251, 3, 62,223, 53, 0,176, +106, 62, 1,123,145, 45,168, 93, 99, 3,246, 75, 39, 16, 88,116,192,226,247, 0, 0,242,187,111,193,212, 40, 8, 3,128,104,131, +225,207,119,255,239, 63,253, 71,160, 37, 0,128,102, 73,146,113, 0, 0, 94, 68, 36, 46, 84,202,179, 63,199, 8, 0, 0, 68,160, +129, 42,176, 65, 27,244,193, 24, 44,192, 6, 28,193, 5,220,193, 11,252, 96, 54,132, 66, 36,196,194, 66, 16, 66, 10,100,128, 28, +114, 96, 41,172,130, 66, 40,134,205,176, 29, 42, 96, 47,212, 64, 29, 52,192, 81,104,134,147,112, 14, 46,194, 85,184, 14, 61,112, + 15,250, 97, 8,158,193, 40,188,129, 9, 4, 65,200, 8, 19, 97, 33,218,136, 1, 98,138, 88, 35,142, 8, 23,153,133,248, 33,193, + 72, 4, 18,139, 36, 32,201,136, 20, 81, 34, 75,145, 53, 72, 49, 82,138, 84, 32, 85, 72, 29,242, 61,114, 2, 57,135, 92, 70,186, +145, 59,200, 0, 50,130,252,134,188, 71, 49,148,129,178, 81, 61,212, 12,181, 67,185,168, 55, 26,132, 70,162, 11,208,100,116, 49, +154,143, 22,160,155,208,114,180, 26, 61,140, 54,161,231,208,171,104, 15,218,143, 62, 67,199, 48,192,232, 24, 7, 51,196,108, 48, + 46,198,195, 66,177, 56, 44, 9,147, 99,203,177, 34,172, 12,171,198, 26,176, 86,172, 3,187,137,245, 99,207,177,119, 4, 18,129, + 69,192, 9, 54, 4,119, 66, 32, 97, 30, 65, 72, 88, 76, 88, 78,216, 72,168, 32, 28, 36, 52, 17,218, 9, 55, 9, 3,132, 81,194, + 39, 34,147,168, 75,180, 38,186, 17,249,196, 24, 98, 50, 49,135, 88, 72, 44, 35,214, 18,143, 19, 47, 16,123,136, 67,196, 55, 36, + 18,137, 67, 50, 39,185,144, 2, 73,177,164, 84,210, 18,210, 70,210,110, 82, 35,233, 44,169,155, 52, 72, 26, 35,147,201,218,100, +107,178, 7, 57,148, 44, 32, 43,200,133,228,157,228,195,228, 51,228, 27,228, 33,242, 91, 10,157, 98, 64,113,164,248, 83,226, 40, + 82,202,106, 74, 25,229, 16,229, 52,229, 6,101,152, 50, 65, 85,163,154, 82,221,168,161, 84, 17, 53,143, 90, 66,173,161,182, 82, +175, 81,135,168, 19, 52,117,154, 57,205,131, 22, 73, 75,165,173,162,149,211, 26,104, 23,104,247,105,175,232,116,186, 17,221,149, + 30, 78,151,208, 87,210,203,233, 71,232,151,232, 3,244,119, 12, 13,134, 21,131,199,136,103, 40, 25,155, 24, 7, 24,103, 25,119, + 24,175,152, 76,166, 25,211,139, 25,199, 84, 48, 55, 49,235,152,231,153, 15,153,111, 85, 88, 42,182, 42,124, 21,145,202, 10,149, + 74,149, 38,149, 27, 42, 47, 84,169,170,166,170,222,170, 11, 85,243, 85,203, 84,143,169, 94, 83,125,174, 70, 85, 51, 83,227,169, + 9,212,150,171, 85,170,157, 80,235, 83, 27, 83,103,169, 59,168,135,170,103,168,111, 84, 63,164,126, 89,253,137, 6, 89,195, 76, +195, 79, 67,164, 81,160,177, 95,227,188,198, 32, 11, 99, 25,179,120, 44, 33,107, 13,171,134,117,129, 53,196, 38,177,205,217,124, +118, 42,187,152,253, 29,187,139, 61,170,169,161, 57, 67, 51, 74, 51, 87,179, 82,243,148,102, 63, 7,227,152,113,248,156,116, 78, + 9,231, 40,167,151,243,126,138,222, 20,239, 41,226, 41, 27,166, 52, 76,185, 49,101, 92,107,170,150,151,150, 88,171, 72,171, 81, +171, 71,235,189, 54,174,237,167,157,166,189, 69,187, 89,251,129, 14, 65,199, 74, 39, 92, 39, 71,103,143,206, 5,157,231, 83,217, + 83,221,167, 10,167, 22, 77, 61, 58,245,174, 46,170,107,165, 27,161,187, 68,119,191,110,167,238,152,158,190, 94,128,158, 76,111, +167,222,121,189,231,250, 28,125, 47,253, 84,253,109,250,167,245, 71, 12, 88, 6,179, 12, 36, 6,219, 12,206, 24, 60,197, 53,113, +111, 60, 29, 47,199,219,241, 81, 67, 93,195, 64, 67,165, 97,149, 97,151,225,132,145,185,209, 60,163,213, 70,141, 70, 15,140,105, +198, 92,227, 36,227,109,198,109,198,163, 38, 6, 38, 33, 38, 75, 77,234, 77,238,154, 82, 77,185,166, 41,166, 59, 76, 59, 76,199, +205,204,205,162,205,214,153, 53,155, 61, 49,215, 50,231,155,231,155,215,155,223,183, 96, 90,120, 90, 44,182,168,182,184,101, 73, +178,228, 90,166, 89,238,182,188,110,133, 90, 57, 89,165, 88, 85, 90, 93,179, 70,173,157,173, 37,214,187,173,187,167, 17,167,185, + 78,147, 78,171,158,214,103,195,176,241,182,201,182,169,183, 25,176,229,216, 6,219,174,182,109,182,125, 97,103, 98, 23,103,183, +197,174,195,238,147,189,147,125,186,125,141,253, 61, 7, 13,135,217, 14,171, 29, 90, 29,126,115,180,114, 20, 58, 86, 58,222,154, +206,156,238, 63,125,197,244,150,233, 47,103, 88,207, 16,207,216, 51,227,182, 19,203, 41,196,105,157, 83,155,211, 71,103, 23,103, +185,115,131,243,136,139,137, 75,130,203, 46,151, 62, 46,155, 27,198,221,200,189,228, 74,116,245,113, 93,225,122,210,245,157,155, +179,155,194,237,168,219,175,238, 54,238,105,238,135,220,159,204, 52,159, 41,158, 89, 51,115,208,195,200, 67,224, 81,229,209, 63, + 11,159,149, 48,107,223,172,126, 79, 67, 79,129,103,181,231, 35, 47, 99, 47,145, 87,173,215,176,183,165,119,170,247, 97,239, 23, + 62,246, 62,114,159,227, 62,227, 60, 55,222, 50,222, 89, 95,204, 55,192,183,200,183,203, 79,195,111,158, 95,133,223, 67,127, 35, +255,100,255,122,255,209, 0,167,128, 37, 1,103, 3,137,129, 65,129, 91, 2,251,248,122,124, 33,191,142, 63, 58,219,101,246,178, +217,237, 65,140,160,185, 65, 21, 65,143,130,173,130,229,193,173, 33,104,200,236,144,173, 33,247,231,152,206,145,206,105, 14,133, + 80,126,232,214,208, 7, 97,230, 97,139,195,126, 12, 39,133,135,133, 87,134, 63,142,112,136, 88, 26,209, 49,151, 53,119,209,220, + 67,115,223, 68,250, 68,150, 68,222,155,103, 49, 79, 57,175, 45, 74, 53, 42, 62,170, 46,106, 60,218, 55,186, 52,186, 63,198, 46, +102, 89,204,213, 88,157, 88, 73,108, 75, 28, 57, 46, 42,174, 54,110,108,190,223,252,237,243,135,226,157,226, 11,227,123, 23,152, + 47,200, 93,112,121,161,206,194,244,133,167, 22,169, 46, 18, 44, 58,150, 64, 76,136, 78, 56,148,240, 65, 16, 42,168, 22,140, 37, +242, 19,119, 37,142, 10,121,194, 29,194,103, 34, 47,209, 54,209,136,216, 67, 92, 42, 30, 78,242, 72, 42, 77,122,146,236,145,188, + 53,121, 36,197, 51,165, 44,229,185,132, 39,169,144,188, 76, 13, 76,221,155, 58,158, 22,154,118, 32,109, 50, 61, 58,189, 49,131, +146,145,144,113, 66,170, 33, 77,147,182,103,234,103,230,102,118,203,172,101,133,178,254,197,110,139,183, 47, 30,149, 7,201,107, +179,144,172, 5, 89, 45, 10,182, 66,166,232, 84, 90, 40,215, 42, 7,178,103,101, 87,102,191,205,137,202, 57,150,171,158, 43,205, +237,204,179,202,219,144, 55,156,239,159,255,237, 18,194, 18,225,146,182,165,134, 75, 87, 45, 29, 88,230,189,172,106, 57,178, 60, +113,121,219, 10,227, 21, 5, 43,134, 86, 6,172, 60,184,138,182, 42,109,213, 79,171,237, 87,151,174,126,189, 38,122, 77,107,129, + 94,193,202,130,193,181, 1,107,235, 11, 85, 10,229,133,125,235,220,215,237, 93, 79, 88, 47, 89,223,181, 97,250,134,157, 27, 62, + 21,137,138,174, 20,219, 23,151, 21,127,216, 40,220,120,229, 27,135,111,202,191,153,220,148,180,169,171,196,185,100,207,102,210, +102,233,230,222, 45,158, 91, 14,150,170,151,230,151, 14,110, 13,217,218,180, 13,223, 86,180,237,245,246, 69,219, 47,151,205, 40, +219,187,131,182, 67,185,163,191, 60,184,188,101,167,201,206,205, 59, 63, 84,164, 84,244, 84,250, 84, 54,238,210,221,181, 97,215, +248,110,209,238, 27,123,188,246, 52,236,213,219, 91,188,247,253, 62,201,190,219, 85, 1, 85, 77,213,102,213,101,251, 73,251,179, +247, 63,174,137,170,233,248,150,251,109, 93,173, 78,109,113,237,199, 3,210, 3,253, 7, 35, 14,182,215,185,212,213, 29,210, 61, + 84, 82,143,214, 43,235, 71, 14,199, 31,190,254,157,239,119, 45, 13, 54, 13, 85,141,156,198,226, 35,112, 68,121,228,233,247, 9, +223,247, 30, 13, 58,218,118,140,123,172,225, 7,211, 31,118, 29,103, 29, 47,106, 66,154,242,154, 70,155, 83,154,251, 91, 98, 91, +186, 79,204, 62,209,214,234,222,122,252, 71,219, 31, 15,156, 52, 60, 89,121, 74,243, 84,201,105,218,233,130,211,147,103,242,207, +140,157,149,157,125,126, 46,249,220, 96,219,162,182,123,231, 99,206,223,106, 15,111,239,186, 16,116,225,210, 69,255,139,231, 59, +188, 59,206, 92,242,184,116,242,178,219,229, 19, 87,184, 87,154,175, 58, 95,109,234,116,234, 60,254,147,211, 79,199,187,156,187, +154,174,185, 92,107,185,238,122,189,181,123,102,247,233, 27,158, 55,206,221,244,189,121,241, 22,255,214,213,158, 57, 61,221,189, +243,122,111,247,197,247,245,223, 22,221,126,114, 39,253,206,203,187,217,119, 39,238,173,188, 79,188, 95,244, 64,237, 65,217, 67, +221,135,213, 63, 91,254,220,216,239,220,127,106,192,119,160,243,209,220, 71,247, 6,133,131,207,254,145,245,143, 15, 67, 5,143, +153,143,203,134, 13,134,235,158, 56, 62, 57, 57,226, 63,114,253,233,252,167, 67,207,100,207, 38,158, 23,254,162,254,203,174, 23, + 22, 47,126,248,213,235,215,206,209,152,209,161,151,242,151,147,191,109,124,165,253,234,192,235, 25,175,219,198,194,198, 30,190, +201,120, 51, 49, 94,244, 86,251,237,193,119,220,119, 29,239,163,223, 15, 79,228,124, 32,127, 40,255,104,249,177,245, 83,208,167, +251,147, 25,147,147,255, 4, 3,152,243,252, 99, 51, 45,219, 0, 0, 0, 6, 98, 75, 71, 68, 0,255, 0,255, 0,255,160,189,167, +147, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,215, 0, 0, 13,215, 1, 66, 40,155,120, 0, 0, 0, 7,116, 73, 77, 69, 7,219, + 3, 1, 19, 44, 13, 18,209, 81,195, 0, 0, 32, 0, 73, 68, 65, 84,120,218,236, 93,119,120, 20,213,226, 61, 51, 59,179,187,217, +146, 77, 35, 61,144, 66, 9, 96, 0, 67, 81,130, 84, 65, 80,140,138, 10, 86,132,167,207,103,197,134, 5, 84, 68, 68, 32, 54, 64, +240, 39,242,208,167,128,160,128, 5, 4,164, 68, 74,232, 29,233, 9,144, 4, 18, 66, 58,201, 38,219,203,220,223, 31,217, 89, 55, +203,182, 64, 98,129,123,190,111,190,221,157,157, 57,115,239,157,123,239,156, 57,183, 1, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20,215, 52, 86,175, 94, 77,154,112,248,144, 64, 57, 29,219,128,191, 59,103, 11,198,157, 52, 35,231, + 0, 7,231,187,255,144,112, 14,248,187,114,138,241,109, 2,239,144,166,228,163,230, 74, 79,151,112,146,230, 14,103, 75,113, 54, + 87, 57,242, 16, 78,210, 2,247,253,221,127, 72, 56, 7,252,221, 56,221,243, 79,128,188, 77,226, 12, 48, 79, 53, 53,156,164,185, +195,217, 82,156, 87, 91,142,124,132,147, 92,109, 94,242,114,239,223,197,117, 4,174, 5, 69, 86,192,200,204,204,100, 92,248,153, +191, 43,167,107, 58,136,252,205, 25,214,102,196,150,230,230,116, 75,207,230,194,187,153,153,153,204,234,213,171,183, 2, 24,208, +156,113,111,142,251,238, 22,215,102,225,189, 2,145,213, 36,206,230,202,247, 45,205,217, 92,101,201,157,179, 57,242,189,167,251, +222,130,247,168,185,194,217, 44,101,169, 37,242,188,135,252,115,213,188,238,156,205, 81,150,220, 57,155, 35,223,255, 25,156,205, + 81,150, 60,113, 54, 71,190,247,118,239,175, 55,131,138,253,139, 5,129,123, 1, 31,248,119, 22, 68, 45, 37, 54,155,224,192,252, +229,156,205,124,143,222,117,112, 54,231,219,205,192,230,186, 71, 45,145,223, 93, 57,155,139,223,157,167, 57,238,147, 39,206,171, + 13,175,151,112, 54,123,220,175, 54,223,255, 89,156,205,124,143,154,165, 44,185,113, 14,108,230,151,129,129, 46,191,223,109, 78, +206,230, 42, 75, 30,194,121,213,247,201, 19,231,213,134,215, 75, 56,155, 61,238,205,241, 12,105, 41,222,107, 26, 45,213,124,214, +220,156, 77,228,190,166, 56,155,216, 60, 51,164, 5,238,253, 95, 26,206,230,228,116, 15, 99,115, 54,247,180,100, 56,155,147,179, + 9, 97,189,230, 56,255,105,247,253,239,152,158,222,248,174,166, 89,202,155, 59,218, 18,225,108, 78,206, 0,185,175, 9,206,171, +184,247,215, 28,184,191, 75, 64,196,132,111,230, 55, 19, 52,179, 3,211,146,194,181, 57,195, 57,176, 37, 28,194, 22, 64,179,135, +211,241,166, 60,185, 5,226,254, 79, 73, 83, 90,150,104, 89,250,219,149, 37,183, 60, 57,176, 25,157,162,102,117,158,221, 57,155, +227, 26,174, 28,205,149, 71, 91, 58,238,205, 89,150, 90,226,222, 83, 92,133, 11, 65, 57, 41, 39,229,164,156,148,147,114, 82,206, +235,150,243,154, 4, 75,147,128,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,226, 31, 5,175,237,187,113,113, +113,171,149, 74,101, 59,111,255,235,116,186,139, 23, 47, 94, 28, 68,147,240,175, 3,189, 71, 20,255, 32,176,248,195, 65, 23, 0, + 16,199, 70, 65, 65, 65,113, 77,195,107,103,120,185, 92,158,114,242,228,201, 14,130, 32,192,110,183,195,102,179, 57, 63,205,102, + 51,250,247,239,223,228,142,244,209,209,209, 57, 18,137, 36,169, 41,231,216,237,246,243,101,101,101,125,125, 28,178, 19, 64, 10, +195,252,161, 25,197,239,222, 62, 1,148, 88,173,214,238,190, 56, 25,134, 73,113,231,243,194, 37,126,247,201, 25, 18, 18,178,159, +227,184, 4, 79, 92,222,190, 11,130,144, 95, 81, 81,209,231,207,188, 71,215, 51,162,163,163,115, 56,142,107,114,254, 44, 45, 45, +245,154, 63, 99, 99, 99, 15,177, 44, 27,215, 4, 74,137, 32, 8,185, 23, 47, 94,236,235, 67,136,236, 4,144,226,243, 13,202, 45, + 63, 49, 12, 83,108,183,219,123,250, 43, 71,190,184, 60,228, 81,127,156, 78,145,197,113, 92, 86, 84, 84,212, 51,122,189,222, 8, +128, 72, 36, 18,226, 18, 54, 0,128,205,102,171,168,169,169,233, 66,115, 34, 5, 5,197,117, 33,180, 4, 65, 96, 77, 38, 19,242, +242,242, 64,136,199,250,222,126, 5,215,235,112,224,183,141, 81,193, 81,209,176, 89, 44, 80,181,138,116,114,151,157, 56, 6,155, +213, 2,155,217,140, 54,189,122,139, 97, 64,231,206,157, 37,126, 56, 19, 62,248,224,131,168,224,224, 96, 24,141, 70, 24,141, 70, +152, 76, 38, 24,141, 70,152,205,102,152,205,102, 88, 44, 22, 88, 44, 22,216,108, 54,152, 76, 38,100,103,103,219,173, 86,171, 79, +206,105,211,166, 69,105, 52, 26, 39,159,184,137,156, 34,175,213,106,133,209,104,196,166, 77,155,124,114,114, 28,151, 80, 82, 82, + 18, 37,149, 74, 65, 8,129, 32, 8, 32,132, 52,218,220,209,182,109, 91,139,175, 64,182,208, 61,186,158,209, 97,218,210, 53, 81, + 33, 10, 57,108,130,128,204,110,109,157,127,228,127,185, 28,196,102,135, 96,179,161,253,243,163,157,251, 59,117,234,228, 51,127, + 18, 66, 18,167, 45, 93, 19, 26, 40,103, 85, 85,149,161, 99,199,142, 37,104,112,155,189, 9,173, 4,131,193, 16,229,224,191, 76, + 16,177, 44,219,104, 91,191,126, 61, 50, 51, 51,253,197, 61,225,229,151, 95,142,178, 90,173, 48,155,205, 48,153, 76,176, 90,173, +176,217,108,206,205,110,183, 59, 55,179,217,140, 61,123,246, 4,234,100,125,112,219,109,183, 61,190,102,205, 26,213,207, 63,255, +172, 74, 74, 74,130, 84, 42,133, 68, 34,129, 68, 34, 1,203,178,224, 56, 14, 55,223,124, 51, 67,179, 32, 5, 5,197,117, 35,180, + 76, 38, 83, 65,122,122, 58,113,124,143,151,203,229, 82,183,183,220,184,246,237,219,231,186,159,231,175,185, 42, 56, 42, 26, 19, + 91,135, 3, 0,222, 57, 87,229,124, 64,124,216,231, 70,231, 49,239, 93,168, 5, 0, 40, 20, 10, 48,174,175,209, 94,160, 82,169, +112,219,109,183, 65, 38,147,161,103,207,158,224,121,222,227, 38,149, 74,193,243,188,223, 68, 97, 24, 6,106,181, 26, 83,166, 76, + 17, 69, 18, 84, 65,114,140,235,211, 19, 65, 32,248,239,177,211, 48, 11, 4, 28,199, 57,183, 64, 56,165, 82, 41,142, 30, 61, 10, +142,227, 32,145, 72,156,159,226,247, 85,171, 86, 97,228,200,145,224, 56, 14, 10,133, 2,240, 51,115,176,235, 61, 50,155,205,177, + 50,153,204, 2, 64, 20,103, 82,134, 97, 98,174,228, 30, 93,207, 8, 81,200, 49,102,222, 79, 0,128,162, 89,207, 59,239,221,158, +103,223,113, 30,147,248,159, 7,192, 48, 12,120,158, 7,203,178,205,198, 89, 93, 93,109,120,232,161,135,182, 7, 7, 7,175,215, +106,181,240, 35,224, 80, 84, 84, 4,142,227,188,230,119,150,101, 49,115,230, 76,156, 57,115, 38,160,184, 27,141, 70, 44, 88,176, + 0,118,187,189, 17,175,248,221,125, 95,128, 34,235,253,161, 67,135,142, 94,179,102, 77, 24,195, 48,248,236,179,207, 32,149, 74, + 49,124,248,112, 68, 68, 68, 96,195,134, 13,144, 74,165,120,253,245,215,105,230,163,160,160,240, 85,231,241, 0,110, 4, 16,233, + 48, 17,234, 0,132,186, 28, 82,225,248,140, 20,127, 51, 12,179,207, 3, 79, 47,199, 49, 21, 12,195,236,115,249,109, 6, 32,243, +176,191, 10,128,194,177,153,208,224,254,167,185, 92, 71, 60, 15,222,174,203, 1, 13,235, 15, 1,216, 2, 96, 96,102,102,230, 86, + 0, 40, 45, 45,189,163,180,180, 20, 0,144,146,146,114, 50, 55, 55,183,163,168,121, 28,205, 83, 82,155,205,214, 65,108,170, 18, +221,162, 33, 67,134,248,124,195,183, 89, 44,151, 9, 16, 79, 90,202, 83,115,133, 55, 1, 99,177, 88,240,192, 3, 15, 0,128,215, +135,142,235, 22,128,118,131,217,108, 6,199,113, 72,109, 29,137, 73,195,210,113, 19,177, 66, 87,207,192, 86,171,195, 61,106, 43, + 78,118,238,142,249,231, 43,112, 78, 91, 15,142,227, 2,226, 20, 4,193,171,200,146, 72, 36,152, 55,111, 30, 30,122,232, 33, 72, + 36,146,128,248, 92,239, 81,114,114,242,154,220,220,220, 8,134, 97, 76,142,123, 36,183,217,108, 26,155,205, 22, 97,183,219, 35, +154,114,143,174,103,216, 4,193, 99, 62,244,150,103, 3,185, 79,129,112, 86, 87, 87, 27, 50, 51, 51,119,203,229,242,133,209,209, +209, 37,197,197,197,126,133,150,187,248,113,127,169,248,228,147, 79, 48,103,206, 28, 12, 26, 52, 40,160,112,154, 76, 38, 48, 12, +131,249,243,231, 95,246,223,212,169, 83, 47,187,158, 31, 78, 6, 0, 27, 23, 23,247,236,186,117,235, 52,226,177,173, 90,181, 2, +207,243,232,210,165, 11,130,131,131,177,125,251,118,216,237,246,128,203, 37, 5, 5,197,181, 11, 79, 90,196, 5,253, 39, 78,156, +216, 51, 43, 43,107,122, 70, 70,198,119, 59,119,238, 92,202, 48,204,106,151, 58, 49,211, 81,191,174, 22,127, 19, 66,122,185,138, + 30,135, 88,139,100, 24,102,181,120,188,235,111,241,147, 16, 50, 4,128, 76,252, 61,113,226,196,180,172,172,172,233, 19, 38, 76, +120,115,198,140, 25,210,137, 19, 39,118,205,202,202,154, 46, 94,199, 83, 56, 60, 57, 90, 62,215,158, 18,155,168, 78,157, 58,229, +173,137,202,245, 1,224,179,182, 84,181,138,116, 58, 89,239, 37, 70, 56,247, 79, 41,174,113, 62,192,230,246,104, 7,149, 74,133, + 97,239,125, 20,144, 83,100, 54,155, 81, 94, 94,238,116, 25,252,109,129,114, 42, 21, 65,200,126,185, 11,138,170,100,120,119, 87, + 53,214, 28, 62, 3,158,231,113,123,231, 46,184, 67, 26,140,183, 19,101,120,249,116, 33,172, 36,176, 62,189,132, 16,143, 2, 75, +252, 46, 54,161, 4, 42,180,220,238, 81,145,209,104,172,202,203,203, 51, 8, 13, 15,118, 5, 33, 36,140, 97,152, 58,135,203, 21, + 27,232, 61,186,158,145,217,173,173,211,117,218, 19, 60,216,185,127,164,238,168,243,158,140,159,247, 33, 0, 96, 80,247,155,253, +150,135, 64, 56,171,170,170, 12,125, 7, 15,220,106, 55,152,191, 25, 61,122,116,193,230,205,155, 21,129,132,213,147,208, 18, 93, + 91, 81,100,113, 28, 7,179,217, 28, 80,220,205,102,179,215,242, 33,149, 74,175,196,209,130, 78,167, 51,175, 92,185, 18,115,231, +206, 69, 68, 68, 4,134, 14, 29,138,216,216, 88, 44, 95,190, 28,132, 16, 60,255,252,243, 80, 40, 20,162,123, 77, 51, 32, 5,197, +245, 13, 95, 90, 68,158,149,149, 53,221, 93,200,184,254,118, 21, 80,110, 98,202, 85,172,165,249,121,254,175,118, 23, 79,226,117, + 25,134, 89, 61, 99,198,140, 76, 63,225,168,240, 38,180,124, 78,137,111, 50,153, 10,186,117,235, 22,144,154,208,235,245,165,254, +196,134,167,183,122, 87,151, 64,173, 86, 67,165, 81,131, 13,176,222,181, 90,173, 78,161,178,113,227, 70, 40, 20, 10, 12, 31, 62, +252,170, 28, 45,139,197, 2,153,148, 7,219, 42, 26, 99,102,109, 70, 85,157,193,249,128,217,146, 95,128,131,101,229,120, 57, 99, + 48, 84,138,114,212,155,205, 1, 57,111,130, 32, 92, 38,178, 56,142,195, 3, 15, 60,224,116, 19, 92,251,173,192, 71,211, 97, 68, + 68,196,126,142,227, 18, 92,238, 81, 80, 74, 74, 10,240, 71,191, 30, 70, 16,132,250,208,208,208, 31, 1,196, 17, 66, 18, 0, 4, + 7,114,143, 40, 60,231, 79,247,253,130,155, 83,117, 37,156, 85, 85, 85,134,204,204,204,221,118,131,249,155, 11, 23, 46,236, 6, + 16,116,211, 77, 55, 53, 89,104,137, 2,139,231,121,204,156, 57, 19,115,230,204,113,254, 31,168,208,178,217,108,141, 4,212,233, +211,167, 27, 93,203, 93,216,249,105, 54, 37,104, 24, 93, 40,164,164,164, 56,207,137,137,137, 65,104,104, 40, 4, 65,128, 32, 8, + 8, 10, 10,130, 66,161,128, 84, 42,165,153,142,130,130,194,151, 22, 49, 76,152, 48,225, 77,134, 97, 86, 59,156,165, 99, 62, 4, +149, 39,237,209,203, 77,172, 85,120, 57, 46,211,147,216,114,253, 46, 98,226,196,137,105,238,225,240,212, 92,233,172, 85,221,166, +221,111, 4,215, 38,170,230,122,136,249,122,144,169, 67, 53, 80,168, 84,144, 72, 88, 48, 12, 67,252,113, 89, 44, 22,103,197,255, +204, 51,207,248,236,183, 18,104,127, 42,139,197, 2,150,147,224, 98, 76, 50,236,236, 54,231,185,226,198,114, 60,206,197,116,132, +228,212, 33,240, 1, 62,112,221, 29,173,231,159,127, 30, 11, 22, 44, 0,203,178,206, 52,225, 56, 14,237,219,183, 71, 65, 65,129, + 79, 46,142,227, 18,206,157, 59, 23,229,154,142,162,136, 37,132,192,110,183,163,109,219,182,198,188,188,188, 23,105,209,189, 58, +145,229,109,191,221, 46, 4,236,194,120, 58,174,170,170,202, 48,106,212,168,173,181,181,181,223,220,112,195, 13,167,209,120, 10, + 4,191,124, 28,199, 53, 18, 88,162,200,250,244,211, 79, 27,137, 34,171,213, 26,208,139,128,213,106,189, 76,240,124,252,241,199, +141, 62, 1,160, 79,159, 62, 1, 57,195, 0, 8,203,178, 68, 42,149,226,182,219,110, 67,215,174, 93,241,243,207, 63, 67, 16, 4, + 60,247,220,115, 80, 40, 20,152, 61,123, 54,108, 54, 27, 62,248,224, 3,234,104, 81, 80, 80,248,210, 34,166, 25, 51,102, 28,155, + 49, 99,134,211, 89,114,119,180,188, 60,119,239,116,136,170, 72, 81,164, 1, 48,121, 18, 68,158, 92, 50,119, 1,230,186, 47, 43, + 43,107,186,123, 56,220,155, 43, 27, 9,173, 63, 11,165,199,143,226,163, 91,210, 1, 52,110, 46,156,119,115, 71,168,212, 42,168, +130,213, 24,181,106, 27, 0, 56, 42,253, 9, 1, 57, 90,162,208,170,170,170,242, 41,178,154,226,104,177, 50, 14, 43, 18, 46,129, +200,120,112,102,107, 35,161, 37,225,120, 20, 69, 36,131,229,165,224,236,182,128, 56, 9, 33,151, 53, 21,142, 29, 59, 22, 12,195, + 56, 71,136,117,235,214,205,149,139,241,247,112,124, 45,188,161, 15,158,123,115,236, 7,149, 70, 90, 98,175, 36,127,238,255, 18, + 39,127,120, 22, 0,208, 87,167,115,222,139,105,221,254, 24, 59, 48,235,232, 86,167,251,248, 30, 94,189, 34,206,170,170, 42,195, + 77,157,210,118, 75,195, 67,190, 57,127,254,252,110, 0,236,131, 15, 62, 24,218,173, 91,183,128,202,164, 56,184,194, 93,100,185, + 58, 89,226,167,159, 17,182, 46,194,209, 30,144,128, 18,155, 17, 3,200,243, 68,204,219, 26,141, 6,106,181,218, 57,226, 54, 40, + 40, 8, 74,165,210,217,191, 51, 64,225, 70, 65, 65,113,253, 34, 76, 20, 58, 14,177,212,200,105,114,244,173,202,116,253,237,201, +241,114, 56, 80, 57,126,234,215, 53, 14,129,230, 17,162,179,230,118,206,106,111, 34,141, 19, 21,164,235,103, 76, 76,204,175,106, +181, 58, 57,208,216, 55,101, 20,155,221,106,185,204,217, 98, 24, 6,234, 96, 53, 20,106, 21, 20,193,106,175,174,151, 47,161, 37, + 58, 69,226, 67,103,225,194,133, 80,171,213,248,215,191,254,213,228, 62, 90, 78,161, 37,101,177, 65,190, 9, 18, 25,215, 72,100, +113, 28, 7, 9,207,163, 84, 29, 11,150,231,193,217, 2,115,201,106,107,107,193,113, 28, 38, 77,154,228,124,131,119, 21, 89, 77, +137,179, 47,176, 12, 35,186, 91,242,118,237,218,189,202, 48, 76, 34,128, 36,157, 78, 39,191,120,241,226,173,180,188,250, 80, 6, +118,235,101, 46,148, 55,247,245, 74, 57, 69, 39, 75, 26, 30,242, 77,199,142, 29,157, 78,150, 82,169, 20, 71,155,250,191,199, 44, +235, 81,100,185,143, 16,228, 56,174, 33, 47,251, 25, 29,233,234,104,205,152, 49,195,201,235,234,100,137,104, 74, 57, 18,195,186, +117,235, 86, 28, 60,120, 16,207, 60,243, 12, 20, 10, 5,230,204,153, 3,155,205,134,169, 83,167, 66,161, 80, 64, 38,147,209,204, + 71, 65, 65,221,172, 70, 90,196, 13, 21,110,253,160, 24, 55, 81, 83,225, 73, 96,185, 54, 19,138,223, 25,134,177,122,224, 53,187, + 53, 41,186,239, 23, 63,171,102,204,152,177, 89,116,178, 92,246, 55, 10,135, 95, 71, 75, 46,151, 39,231,229,229, 57, 39,194,244, +245,105, 54,155, 49,104,208,160,128,157, 49,113,212, 33,199, 73, 26, 9, 11,101,176, 26, 74, 77, 48, 20,106,181,187,224, 96,252, + 85,226,226, 27,177,171,208,154, 60,121, 50, 56,142,195,130, 5, 11, 0, 0,175,190,250,106,192,125,180, 68, 78,216, 25, 20,147, +179, 72,159, 53, 18,230,111,173, 40,219,241, 59, 56,142, 67, 84,239, 59, 32,220, 52, 18,122,133, 26,156,221, 22,240,168,195,234, +234,106, 20, 20, 20, 64, 34,145,224,149, 87, 94,105, 52,215,145,251, 72,182,141, 27, 55,250,141,187, 39, 39,107,242,249,106, 39, +143, 66,161, 96,127,255,253,247,100, 65, 16, 82, 12, 6, 67,187, 62,125,250, 8,180, 40,251, 17, 69,130, 45, 32, 81, 21,104,254, +116,231, 20,251,100,213,214,214,126,115,254,252,249, 61, 0,216,209,163, 71,135, 42,149, 74,124,245,213, 87,122, 0,178,229,203, +151, 43,252,137, 34, 49,223,248, 19, 89, 60,207, 55,228,229, 64,226, 78, 26, 79, 89,226,175, 99,124, 32,121, 94, 12, 43,195, 48, +176,219,237, 80, 40, 20,141,156,172,160,160, 32,200,229,114,154,241, 40, 40, 40,252,213, 37,251, 2,174,199, 9,233,229, 34,170, +246, 93, 9,111, 83,174,231, 15,156, 55,161, 97, 50,153,112,226,196,137, 64,121, 2,158, 24,179,117,207,155,241,222,133, 90, 48, + 12,131,255,246,185, 1, 42,141, 26, 74,149, 10,247,255,188,213, 89,113, 31,157,254, 42,228, 42, 53,226,250, 13, 13,168, 34, 23, +155, 14, 93,133, 86, 77, 77, 13,120,158,199,251,239,191, 15,150,101,241,193, 7, 31, 32, 62, 62, 30, 23, 47, 94,196,242,229,203, + 3,114,180, 36,118, 9, 98, 31,235, 4,229,216, 16,104, 30,235,143,176,219, 38,227,130,153,195, 78,163, 18,253,141,199, 33,219, +240, 41,204,130, 61,224, 17, 88, 54,155, 13, 91,183,110,117,239,240,238,236, 83,101,179,217, 96,181, 90, 97,177, 88,240,193, 7, + 31, 4, 50,194,243,178,251, 38,166,161, 99, 18, 84, 73,110,110,110, 36, 33, 36, 28, 64, 8,128, 74, 90, 92,125, 35,182,247,243, +136,236,249, 52, 0, 96,213,140, 39,156,251, 39, 29,253, 35,127,206,252,182, 97, 1,128,142, 73, 67,155,196, 89, 85, 85,101,184, +125, 80,159, 28,163,192,127,221,165, 75,151, 70, 78, 86, 80, 80, 16,227,248, 29,144, 93,198,178, 44, 36, 18,201,101,205,133,222, +196, 86, 32,125,180,108, 54,155,115, 34, 81, 95,253, 25,175,196,209,122,226,137, 39, 16, 27, 27,235,116,178,222,123,239, 61, 40, + 20, 10, 76,156, 56, 17, 86,171, 21,159,126,250, 41,205,124, 20, 20, 20,127,186, 40,251, 51,224,177, 38, 53, 26,141,133, 93,187, +118,133,151,255,226,131,130,130,120,183, 72,197,181,111,223, 62,215, 67, 19,226, 16, 0,217,158, 42,117,134, 97, 16,172, 9, 70, +144, 90, 5,165,155,139, 21, 20,172,129, 92,173, 6, 43,245, 88,153, 95,198, 41,246, 45,113, 21, 90,226, 86, 91, 91, 11,158,231, + 49,119,238, 92,104, 52, 26,152, 76, 38,191,156,226, 67, 71, 34,145, 64, 95, 84,135,147,211,179, 33, 11,218,137,118, 67, 31, 66, + 44,175,128,116,251,143, 48,216,173,254, 38, 44,189,140,179, 67,135, 14,120,231,157,119, 46,155,214,193, 27,226,227,227,253,198, +221,221,201,154,121, 67, 27, 72,101, 82,140, 63, 94, 4,147,201,196, 60,244,208, 67, 2, 0, 3,128, 10,131,193,112, 62,144,244, +108, 6,252,227, 57,125,141,138, 21, 33, 16,187, 39, 1,227,145, 83,116,178,140, 2,255,117, 65, 65,129,232,100,133, 40,149, 74, +124,241,197, 23,122, 0,236,212,169, 83,149,137,137,137,146, 64,242,146, 68, 34,193,172, 89,179, 60,246,201,242, 36,186,154, 82, +142, 92,207, 29, 48, 96,128,199, 9, 75,189,136,183,203, 56,197,176, 70, 68, 68, 56,157, 44,187,221,238, 28,109, 40,206, 62,239, +227,165,130,230, 79,202, 73, 57,175, 31,206,107, 18, 30,107,224,139, 23, 47,222,238,237,132,182,109,219,230,229,229,229,181, 23, +151,226,112, 84,156, 82,163,209,216,161, 79,159, 62,126,173, 29, 65, 16, 32,151,203, 65, 8,193,173,239,100,129, 97, 1, 22,141, + 31, 98, 81,183, 12,134, 68,194, 65,104, 88,234,195,239,168, 67,131,193,208,232,225,224,105,171,175,175,135,201,100, 10,120, 54, +111,163,209,216,104, 10, 6,134, 8, 56,247,219,178,203, 70, 31,138, 91,160,253,118,130,130,130, 26, 53,253,248,113,172,152, 64, + 28, 45,215,166, 71,169, 76, 10, 78,202,139,142, 86,221,233,211,167, 71,209,108, 30, 56,196, 1, 11, 0,144,218,103, 56, 4,193, + 14, 98,183, 55, 90, 38,169, 83,242,237, 16,136, 29, 22,171, 30, 38,147,201,223,180, 39, 76,101,101,165, 97,212,168, 81, 91, 1, +252,239,158,123,238,201, 69,195,236,194, 68,173, 86,203,121,158, 23, 0, 84, 3, 32,151, 46, 93, 10,185,112,225,130, 96, 52, 26, +219,248, 11,231,154, 53,107,112,226,196, 9,244,235,215,175,209,114, 80,162, 43,234, 58,187,123, 32,249, 83,108, 46,247, 52, 35, +188, 55, 33, 23, 40, 36, 18, 9, 66, 66, 66, 32,149, 74,241,254,251,239, 67, 42,149, 66,169, 84, 2, 0, 62,253,244, 83,231,228, +171, 20, 20, 20, 20,215,141,208,242, 87,111,250,104, 86,244,217,132,104,179,217,138, 19, 19, 19,155,116, 49,187,221, 94,230, 71, +184, 21, 47, 95,190, 92,234,234, 66,248,251, 36,132,148,249,121,216, 22,175, 90,181, 74,234,201,221,240,182,192,180, 63, 78,187, +221, 94,156,148,148,228,213, 49,241, 4,171,213,122,193,159,104,205,170, 48, 52, 18, 9,227,143, 23,121, 93, 59,145,194,111, 94, +243,145, 63,223,186,210,252,121, 58, 53, 53,245, 66,104,104,232,218,232,232,232,170, 29, 59,118, 68,244,234,213, 43,194,245,152, + 94,189,122,197,186,157,102,134,247,117, 14,193, 48, 76,241, 61,247,220,227, 49,207,139,162,201, 67,254, 44,246,151,231,247,238, +221, 43,117, 61,223, 27,191, 75, 57, 42, 14, 64,184,158, 75, 79, 79,103, 93,121,188,229,125,171,213, 90, 65,115, 33, 5, 5,197, +117, 47,180, 12, 6, 67, 81,215,174, 93,109, 94,254, 59,239,235,220,170,170,170,158,205, 29, 1,171,213,218,231,159,192, 89, 89, + 89,217,172,113,183,217,108,197,142, 9, 74,125, 30, 67,179,248, 95,119,143, 0,160,188,188,252, 38, 0,208,233,116,240,183,172, + 78, 19, 4, 97,179,231, 79,155,205,214,167, 37,210,180,186,186, 58,131,230, 44, 10, 10, 10, 42,180,154, 0,186, 24,241,223, 3, + 45, 33, 90, 41, 40, 40, 40, 40, 40, 40,154, 23, 44, 77, 2, 10, 10, 10, 10, 10, 10, 10,138,150, 1,131,134,145, 3,158,208,148, +209, 4, 67,174,224,218,217,148,147,114, 82, 78,202, 73, 57, 41, 39,229,188,238, 56,253,113,211,209,140, 45, 44,192, 40, 39,229, +164,156,148,147,114, 82, 78,202,121,253,113, 94,147,160, 77,135, 20, 20, 20, 20, 20, 20, 20, 20, 45, 4,142, 38,193, 95, 6, 9, +154, 48,163,190, 63, 16, 66,194, 0,120, 91, 48,206,204, 48,204,165, 43,224,100, 0, 72, 29,155, 56,209,145, 21,128, 5,128,133, + 97, 24,226,159,227, 93,182,164, 36, 44,141,216,249, 94,132, 97,120, 65,192,225, 54,109, 90, 31, 98,152, 59,204, 0,160,138,238, +212, 89,173, 82, 12, 49, 89,204,201,114, 94,118,162, 70, 87,191,209, 84,158, 87, 72,179, 7, 5,197, 95,130,187, 0, 76, 65, 67, +183,146, 25, 0,150,209, 36,161,160,104, 33,161,165, 86,171,247,179, 44,155,224,111,126, 30, 17,142,181,204,138, 47, 93,186,212, +179, 9,215, 30,165, 86,171, 7,241, 60,127, 11, 0, 88,173,214, 29,245,245,245,155, 1, 44, 7, 96,187,194, 56,105, 0, 60, 0, +224, 17,199,239, 37,142,202, 66,123,133,124, 93, 67, 66, 66,126,224,121,158, 84, 86, 86,246, 6,128,136,136,136,221, 86,171,149, +209,106,181,247, 3, 56,210, 68, 62,150,231,249,153,189,123,247,238,191,109,219,182,255, 1,152,219, 76,247, 82,206,178,172, 71, +129, 34, 8, 66,210, 21,136, 44, 41,128,144,185,115,231, 70, 44, 94,188, 56,189,184,184,184, 11, 0, 36, 36, 36, 28, 29, 61,122, +244,161,113,227,198, 85, 17, 66,106, 25,134,177,248,226, 41, 41, 9, 75, 43, 47,205,127,166,172,252,196, 3, 0, 16, 19,219,101, +153, 68,194, 74, 9, 57,176, 75,217,234,145, 86,237,219, 37, 61,253,221, 87,115,165, 73,201,173,177,105,231,193, 27,199,189,248, +102,218, 5,224, 19, 42,182,254, 60, 4, 7, 7,239,103, 89, 54,193, 87, 25,247, 84,230,237,118,123,113,117,117,117, 79,111,156, + 28,199, 37,248,170, 47, 60,237, 19, 4, 33,191,178,178,210,227, 84, 19, 26,141,102, 23,199,113,201,129,114,137,159, 54,155,173, +216,219, 40, 93,141, 70,179, 95, 34,145, 36,248,138,167,167,255, 4, 65,200,175,168,168,240, 22,206,203,226,222, 28,225,188, 18, + 78, 95,225, 20,235, 35, 0,159, 70, 68, 68,220, 92, 85, 85,245, 40,128, 55,181, 90,109, 55,137, 68,130,240,240,240, 55,205,102, +243,153,144,144,144, 47,107,107,107,119, 2,120, 17, 0, 93, 47,149,130,162,185,160,209,104,202,234,235,235,137, 8, 65, 16,136, +213,106, 37, 38,147,137, 24, 12, 6,162,211,233, 72,125,125, 61,209,106,181,164,182,182,150, 84, 85, 85,145,200,200, 72,247,201, + 27,189,181,225,118,209,104, 52,121, 89, 89, 89,166,130,130, 2, 98,177, 88,136,197, 98, 33,133,133,133,228,163,143, 62, 50,105, + 52,154, 60, 0, 93,188,156, 59,196, 75,101,113, 27,128,165,233,233,233,230, 53,107,214, 16,163,209, 72,116, 58, 29, 89,182,108, + 25,185,225,134, 27,204, 0,150, 58,142, 97, 3,228, 4,128,190, 49, 49, 49,197,103,207,158,181,111,220,184,209, 18, 18, 18,146, + 29, 18, 18,146, 93, 88, 88,104, 63,123,246,172,208,170, 85,171, 98, 0,125,155, 16, 78, 0, 24, 57,126,252,248,178,194,194, 66, + 50, 96,192,128,195, 46,251, 25,248, 95,231,110,136, 39, 39,139, 16, 18, 67, 8,137, 69,195, 36,151,151,109,132,144, 88,199, 49, + 97, 1,114,170,242,243,243, 91, 71, 71, 71,103, 49, 12, 99,118,231, 99, 24,198, 28, 29, 29,157,149,159,159,223,154, 16,162,242, +197, 89,124,126,222,147,107,215, 12,174,209, 93, 58, 69,116,151, 78,145,255,125, 61, 80,251,212,184, 71,151,198,182,237,190, 32, + 52, 33,109,238,137, 83,167,231, 19, 66,230,111,222,151, 55,127,242,231,191,206,191,119,220,236, 47, 34, 18,211,159,106, 66,122, + 94, 13, 40, 39,128,208,208,208, 82,157, 78, 71, 8, 33,196,110,183, 19,139,197, 66, 76, 38, 19,209,235,245,164,190,190,158,212, +213,213, 57,203,121,109,109,173,243,123, 84, 84,148,215,242, 30, 22, 22, 86,102, 48, 24, 26,213, 29,102,179,217, 89,127,232,245, +122,162,215,235,137, 78,167,115,110,245,245,245, 36, 46, 46,174,200, 71, 56, 47,138,225, 20, 4,129,216,108, 54, 98,177, 88,156, +188, 70,163,177,209,102, 50,153,136,201,100, 34,137,137,137, 1,135, 51, 16, 78,163,209, 72, 18, 18, 18, 74,188,113,134,135,135, +151, 25,141,198, 70,156,174,241,119,231, 21,127,199,196,196,148, 54,133, 51,144,112,250, 74, 79, 7,230,230,230,230, 18,131,193, + 64,226,227,227,171,238,191,255,126,171,221,110, 39,107,214,172, 33,233,233,233,194,192,129, 3, 45,149,149,149,228, 95,255,250, + 23,241,241, 82, 72,203, 17,229,164,184, 18, 71,139, 97, 24,168, 84, 42,124,255,253,247, 94,151,227,112,253,222,166, 77,155, 64, +175,217, 51, 57, 57,121,235,246,237,219, 21,177,177,127, 76,136,109, 54,155, 17, 22, 22,134,231,158,123, 78,118,215, 93,119,181, + 31, 58,116,232,238,115,231,206, 13, 0,176,223, 15,223,125,145,145,145,159, 77,154, 52, 41,250,193, 7, 31, 68, 68, 68,163, 73, +183, 49,106,212, 40,220,127,255,253,210,220,220,220,135, 22, 46, 92,248,208,188,121,243, 74,235,235,235,199, 1,248,209, 23,169, + 66,161,184, 39, 46, 46,238,139,237,219,183, 71, 69, 69, 69, 33, 37, 37,133,125,253,245,215,219,119,232,208, 65,145,144,144,192, + 94,188,120, 17, 63,255,252,115,252,195, 15, 63,188,162,172,172,236,105,139,197,178, 50,128,184,203, 34, 34, 34,222,124,250,233, +167, 91,105,181, 90,219,129, 3, 7,242,196,253, 50,153,108,106, 70, 70, 70,175, 45, 91,182,124, 11,224,203, 43,113,178, 8, 33, + 90,252,209,196, 39,194, 42,254, 31,136,179, 69, 8,145, 29, 62,124, 56, 60, 35, 35,227, 71,147,201,212,253,153,103,158, 57, 63, +125,250,116,133, 70,163,209, 0, 96,180, 90,237,165, 41, 83,166,152,103,207,158,253, 70,231,206,157, 7,239,218,181,235, 62, 66, +136,213, 33,200, 46,231, 99, 24,103,120,138, 46, 84, 96,235, 78, 65,246,206,196, 87, 19, 62,156,150,124,110,223,241, 34,129, 83, +104,240, 75,206, 49,148, 85,213,227,215, 93,199, 17, 19, 17,204, 72,229,124, 90, 72,252, 13, 3,106, 47, 28,207,129,143, 25,210, + 41,154, 7, 12,195, 64,169, 84,226,151, 95,126,185,108,233, 42, 79,203, 90,113, 28,135,208,208, 80,191,171, 27, 4, 5, 5, 97, +227,198,141, 30,215, 94,244,180,164, 79, 72, 72, 8,124,189,108, 48, 12,131,160,160, 32,236,216,177, 3, 44,203,122, 92, 26,200, +125,159, 74,165, 2,235, 99,173, 43,145, 51, 39, 39,199, 47,151,248,169, 86,171,129,134,166,127,239,133, 82, 46,199,246,237,219, +189,198,217,253,187,218,177,222,171, 63,206, 29, 59,118, 52, 90,250,203,125, 73, 48,215,223, 42,149, 10,140, 31,210,176,176,176, +222, 9, 9, 9,216,187,119, 47,150, 47, 95, 30,158,150,150,134,211,167, 79,131, 97, 24, 76,159, 62,157,185,225,134, 27,248,210, +210, 82,244,235,215, 15, 63,253,244, 83, 31,173, 86, 75, 11, 12,197, 95, 2, 66, 8, 15,224, 70, 0,145,104,232,118, 83, 7, 32, + 20, 13, 43,105,200, 0, 84, 1, 80, 56, 54, 19,128,122, 0,173, 28,167, 87, 58,234, 22, 87,129, 80,225,186,248, 52, 33,164,151, +131, 91, 92,161, 34,210,229, 88,241, 26,238,191,221, 63, 61,114,115, 0,176,122,245,106,241, 97, 54, 48, 51, 51,115,171,107,228, + 2, 17, 89,226, 58,101, 30,202,180,251, 16, 77,185, 74,165,250, 97,247,238,221,138,200,200, 63,226, 96, 50,153, 80, 87, 87,135, +250,250,122,212,213,213, 33, 56, 56, 24,203,151, 47, 87, 12, 30, 60,248,135,186,186,186, 14,142, 68,243,198, 57,235,226,197,139, +209, 54,155, 13, 50,153,231, 46, 74, 44,203,162, 83,167, 78,120,243,205, 55, 49,108,216,176,152, 65,131, 6,205,114, 19, 90,151, + 13, 37, 85, 42,149, 95, 28, 56,112, 32, 74,169, 84, 34, 47, 47, 15,197,197,197, 24, 63,126,124,107, 65, 16, 80, 84, 84,132,211, +167, 79,227,194,133, 11, 88,184,112, 97,212,136, 17, 35,190,240, 32,180, 60, 13, 79,125,230,229,151, 95,238, 24, 22, 22,198,126, +244,209, 71, 53, 58,157,238,255, 28,251,223,153, 51,103,206, 99,253,251,247,143,250,247,191,255, 77,118,236,216,177,216,113,227, +188,166,167,107,159, 44, 71, 51, 31, 28,153,239,164,219, 57,157, 92,254, 7, 33, 36, 6,128,137, 97,152, 26, 15,156, 12,128,144, +161, 67,135,190, 98, 50,153,186,111,223,190,253,204, 45,183,220,146, 8,224,162,152,249, 66, 66, 66, 84,179,102,205,138,206,204, +204,204,189,245,214, 91,187, 15, 29, 58,244,149,138,138,138,233,132,144, 10,151, 62, 91, 78, 78, 65,192,225,152,216, 46,203,114, +118,141,123, 96,203, 14,179,244,213, 23, 39,159,111,211, 58,169,246,112, 94,181,253,120,126, 5,234, 12, 54,220,123,107,195, 2, +230,189,187,180,193,103,223,111,199,115, 47,189,197,255,184,108,209,253,103, 8, 84,245, 37,199,215,248, 72,207,171, 5,229,132, +179,137, 9, 60,207,227,142, 59,238, 0,195, 48,151,173,229,201,243, 60,118,237,218,133, 91,111,189, 21, 60,207,227,137, 39,158, + 8,136,147,227, 56, 12, 29, 58,212,185,142,162, 43,159,187,104,240,162, 9,178,221, 42, 91,112, 28, 7,150,101,189, 46,164,237, +206,233,175, 94, 18,195,233,139,203,245, 63,127,225,116, 44,121, 20,176,200, 10,148, 83, 12, 39,199,113,232,211,167, 15, 14, 29, + 58,228, 83,116,121,209,151,141,226,126,233,210,165, 49, 29, 58,116,200,153, 59,119,110, 56, 0, 84, 85, 85, 57, 23,188,151, 72, + 36, 56,117,234, 20,204,102, 51,222,125,247, 93,139, 86,171,253, 55, 45, 71,148,179, 37, 57,125,105, 17, 0,253, 39, 78,156,216, + 51, 43, 43,107,122, 70, 70,198,119, 59,119,238, 92,202, 48,204,106, 66, 72,166,248, 57,113,226,196,180,172,172,172,233, 19, 38, + 76,120,115,198,140, 25,199, 24,134, 89, 13, 0,238,191, 29,117, 73,166,155,136,139, 20,121, 28,101,174,209,177,158,126,187,127, +122,226,110,228,104,101,102,102, 50,142, 72, 50,174,149, 90,160, 66, 43,144,181,251, 56,142,123,126,250,244,233,209,190, 68, 86, +125,125, 61, 74, 74, 74,144,152,152,136, 39,158,120, 34,122,238,220,185,207,219,108,182,143,125,208, 74, 37, 18, 9,246,238,221, +139,242,242,114,116,237,218, 21,201,201,201,141, 14, 56,123,246, 44,214,174, 93,139,154,154, 26,244,232,209, 3,104,232,220,237, + 17,221,186,117,123,183, 83,167, 78, 67, 89,150,181, 41, 20, 10, 28, 62,124, 24,221,187,119,199,247,223,127,143, 54,109,218, 64, +169, 84, 34, 55, 55, 23, 93,187,118,197,214,173, 91, 17, 25, 25,137,244,244,116,155, 86,171,221, 86, 93, 93,189,249,220,185,115, +239,122, 11,103,124,124,252,228,167,158,122, 74, 86, 82, 82, 34,124,243,205, 55,219, 1,108, 7,240,252, 91,111,189,245,248,176, + 97,195,162, 14, 30, 60, 88,187,111,223,190, 61, 94, 68, 86, 32, 78,150,205,253,161,100,183,219, 77, 6,131,193,108, 50,153,172, + 44,203, 22, 50, 12, 99,182,219,237, 29,188,153, 16, 99,199,142,109, 91, 89, 89,249,220, 75, 47,189, 84,224, 16, 89,167,208,208, + 1, 30, 0, 96,179,217, 76,245,245,245,218,140,140,140,196,135, 31,126,248,204,210,165, 75,159, 27, 59,118,236,242,111,190,249, +166, 30,128,193,157,176, 77,155,214,135, 36, 18, 86,170,171, 11,207, 95,177,252,203,151,215,174,122,190,117, 81,209,133,246, 17, +173, 34,117, 82,117,100,201,242, 37, 95,239, 7, 96, 46,169,208,226,200,217, 82,240,188, 4, 39,138,106,209,255,246, 81,252,153, +188,105,125, 1,172,161,239,114, 45,255,178, 40, 46, 66,189,101,203, 22,159,142,214,174, 93,187,192,243, 60, 20, 10, 5,102,207, +158,237,147, 84, 20, 6,162, 91,228, 79,204,136,139,163,251,114,159, 4, 65,112, 46,244,238,190,253,223,255,253, 31, 94,122,233, +165, 70,215,112,136, 13,198, 31,167,183,240, 37, 38, 37,161,188,172,172,209,190, 64, 22,165,183,219,237,224,121, 30, 11, 22, 44, + 64,102,102, 38, 86,175, 94,237,243,243,142, 59,238, 0,203,178, 36,144,244,236,211,167, 15, 44, 22,139, 51,204,167, 78,157,242, +200, 59,111,222, 60,127,193,188, 11,192,148,238,221,187,107, 6, 13, 26,132,156,156, 28,220,127,255,253, 38,139,197,146, 7, 0, +119,222,121,103,234,220,185,115,101, 7, 14, 28, 64, 68, 68, 4,127,254,252,249,255,129,118,144,167,104, 97,120,210, 34,226, 51, + 47, 43, 43,107,186,187,136,113,133,248, 63,195, 48,171,103,204,152,145,233, 42,138, 92,127,139,174,147,155,136, 75,115,117,164, + 92, 69,148, 55, 1,229,246,188,117, 61,190,194,163,208,114, 68,108,160,171, 11, 36, 86,190,254, 68,150,143, 55,199, 70, 8, 9, + 9, 25,126,239,189,247, 58, 69,142,209,104,116, 10, 44, 81,100,137,191,115,115,115,209,179,103, 79,105, 72, 72,200,240,170,170, +170,143, 3, 16,113,136,139,139, 67,101,101, 37,142, 30, 61,138,196,196, 68, 88,173, 86,172, 95,191, 30,181,181,181,224,121, 30, + 82,169, 20, 22,139,207,190,219,232,212,169,211, 29,139, 23, 47,238,185,104,209,162, 75,226, 27,221,146, 37, 75, 64, 8, 65,100, +100, 36,244,122, 61,202,202,202,176,121,243,102,216,108, 54,168,213,106,164,164,164,200,238,185,231,158,190, 83,166, 76,225,125, + 8,173, 62,247,223,127,127,136, 70,163,193,139, 47,190, 72, 44, 22,203, 12,199,190,201,227,198,141,139, 40, 44, 44, 52, 63,249, +228,147,123, 45, 22,203, 71,162,153,232, 42,112,188,220, 88,175, 78,150,213,106, 21,211,180,160,190,190, 30,173, 90,181, 74,116, +117,182,188,137,193, 29, 59,118,244, 1, 32,153, 58,117,106, 16,128, 50,215, 48,152,205,102,212,215,215, 67,167,211, 89,107,107, +107,203, 95,123,237, 53,219,210,165, 75, 37,142,115, 78,120, 18, 90, 12,115,135, 89,163, 81,202, 8,145,188, 53,127,254,124,245, +176, 97,195, 88,181, 90,141,186,186, 58,205,175,235,214,169, 7, 15,234,155, 50, 61,235,195, 13,154,132,174,101, 59, 14,231,227, + 66,105, 45,204, 86, 43, 82, 98, 67, 26,252, 48,138, 22,135, 99, 32,139,211,209,114, 21, 21, 57, 57, 57,184,253,246,219,157,101, + 93, 42,149, 54,114,190,252,113,114, 28,135,219,111,191,253, 50,135,103,203,150, 45, 30,221, 39,127,112, 21, 69,238,226,200,147, + 0, 99, 89,214,239, 2,235,162,155,231, 73,108,185,186,250,110,226,205, 95, 51, 7, 56,142,195,184,113,227,192,243, 60, 94,127, +253,117,112, 28,135,244,244,116,112, 28,135,140,140, 12,240, 60,143, 91,111,189,181,201,113,223,189,123, 55,186,119,239,238, 12, + 83,122,122, 58,122,245,234, 5,142,227,208,175, 95, 63,240, 60,143,161, 67,135, 6,194,249,102, 93, 93, 93, 55,181, 90,141,220, +220, 92, 72, 36, 18, 48, 12,115, 26, 64, 55, 0,136,141,141, 61,163, 6,111,130,189, 0, 0, 32, 0, 73, 68, 65, 84,215,235,219, + 26,141, 70, 60,245,212, 83,140,217,108,238,250,250,235,175,191,101, 52, 26,169,208,162,104, 49,184,107, 17, 23, 24, 38, 76,152, +240, 38,195, 48,171, 69,135,202,221,121,242,244,219, 67,221, 36, 58, 80,251, 28,101,181,151,155,136,171, 96, 24,102, 31, 33,228, + 78,111,231, 2, 48,187, 9,171, 70, 77,135,174,205,134,126, 29, 45,177,242, 13, 84,104,249,131,209,104,188, 49, 42, 42,202,171, +200,114,253, 52,155,205, 72, 78, 78,134,209,104,188,177,169, 15,141,216,216, 88, 88, 44, 22,124,249,229,151,144, 74,165,144, 74, +255,208, 23,102,179,111,179,232,248,241,227, 5,187,119,239,238,222,163, 71,143,176,159,126,250,169, 98,192,128, 1,145,195,134, + 13,131, 66,161,128,193, 96,128,213,106, 69,239,222,189,209,169, 83, 39, 20, 23, 23,227,215, 95,127,173,236,208,161, 67,171, 61, +123,246, 8,165,165,165,231,124, 80,223, 54,120,240, 96, 48, 12,131,117,235,214, 85, 2,216, 39,151,203,215, 78,155, 54, 45,204, +108, 54, 11,163, 71,143, 62, 95, 93, 93,253, 18, 0,139, 76, 38,155, 51, 96,192,128,140,236,236,236,111, 5, 65,152,221,212,140, +234,158,182, 58,157, 14, 65, 65, 65,129, 76, 37,193, 87, 87, 87,119, 1, 0,149, 74, 21, 14,224,140, 51,135, 27, 12,141,196,176, +217,108, 54,134,135,135,171, 0,192,113, 14,239,133, 51,210,102,195,138,115,231,242,131, 93,251,207,133,134,134,226,145,135, 31, +102,111,233,211, 71,214,237,198, 27,135,190,253,201,162,239,227, 34, 52,230,148,184, 8, 88,237, 86,100,111, 88, 47, 16,193,186, +129, 86, 59,127,142,208, 18,197,134,187,163,197,243, 60,182,110,221,122,217, 62,169, 84,138,255,254,247,191, 1, 9, 3, 81, 84, +121,107, 58,115,107,234, 98,252, 9, 24,158,231, 33,145, 72,176, 96,193, 2, 8,130,128,151, 95,126,185, 81,115,162, 43,127, 64, +118,158,139, 8,236, 52, 89, 0, 96, 70,241, 76,185,243,124,247,240, 58,206, 9,200, 37,155, 59,119,110, 64,142,214,157,119,222, +233, 87,184,186,182, 48,184,134,235,208,161, 67, 30,121,231,207,159,239, 55, 61,237,118, 59,214,172, 89,227, 20,169, 34,222,126, +251,237,167,100, 50, 89,244,182,109,219, 80, 90, 90, 10,157, 78,135,250,250,122,244,238,221, 59,133,101,217,195,165,165,165,133, + 39, 78,156,184,151,150, 30,138, 63,209,209, 50,205,152, 49,227,216,140, 25, 51, 60, 58, 86,238,206,146, 47,231, 73, 20, 88, 14, + 65, 20, 41,138, 55, 52,116,171,217,231,239, 92, 0, 50,247,166, 67,159, 70,144,155,138,156,226,169,242, 13,164,249, 48, 64, 59, +157, 99, 24, 6, 70,163,209,163,192,114, 21, 7, 22,139, 5,213,213,213,176,219,237, 87, 60,215,151,167, 55, 89,127, 66,235,232, +209,163,255,122,252,241,199, 75, 66, 66, 66,186, 85, 84, 84,148, 11,130,112,235,174, 93,187, 34, 57,142,131, 70,163,129, 70,163, +193,218,181,107,161, 84, 42, 49,110,220,184,114,187,221,158, 19, 28, 28, 28, 97, 48, 24,126, 47, 45, 45,125,219,171,130,225,249, +161,253,250,245,195,129, 3, 7,112,233,210,165,141, 0,210, 31,125,244,209,219, 91,183,110,205, 76,155, 54,205,120,246,236,217, +217, 0,202, 85, 42,213,226,197,139, 23, 15,234,209,163, 71,240,232,209,163,177,117,235,214,249, 0,140,129,198, 89,167,211, 53, + 18, 88, 90,173, 22,117,117,117, 80,169, 84,182, 0,211,140,199, 31, 35, 12, 65, 8,113,222, 27,135,155, 37,222, 31,194,113,156, + 56,170,209,155,200,130, 74,165,154,186,104,209, 34,133,251, 32, 5,187,221,142,178,178, 50,104, 52, 26, 76,122,251,109,233,123, +227,255,221, 93,162,142,222,197,178, 12,204, 22, 82, 67, 4,243,122, 93,217,131,219,128,119,105,205,243, 39, 64, 20, 6,119,223, +125,247,101,205,133, 82,169, 20, 27, 55,110,196,136, 17, 35,156, 47, 46, 61,122,244,240,251,114, 37, 10,131,187,238,186,203,233, + 12,173, 95,191,222, 99,179,159,232, 72, 5, 34, 8,197, 99, 95,120,225, 5,112, 28,135,207, 62,251, 12,175,188,242, 10, 88,150, +197,204,153, 51,193,178, 44,222,121,231,157,128, 69,166,171,128, 41,252,176,225, 51,225, 21, 45,170,230, 69, 3, 0,130, 53, 26, + 49, 66, 77,170,123, 56,142,115, 58, 89, 55,222,120, 35,120,158, 71, 70, 70, 6, 56,142,115, 58, 89,195,135, 15,119, 77, 71, 18, + 8, 39,199,113,200,203,203,115,134, 57, 35, 35,163,145,147,197,113, 28,238,188,243,206, 64,130, 57, 61, 52, 52,116, 74,167, 78, +157, 58,207,154, 53,139,151, 72, 36, 24, 60,120,112,106, 76, 76,204, 57,155,205, 22, 49,117,234, 84,165,135,115, 20, 0,186,117, +238,220, 89, 69, 75, 13, 69, 11, 58, 90, 83, 60,252, 21,230,218,231,170, 9, 47,146,171, 93,143, 23, 57,220,197,145,195, 33,203, +241,199,229,233, 92,127,224, 68, 5,233,203, 82, 15, 68,104, 57,108,103,159, 23, 83, 42,149, 71,202,203,203, 51, 20, 10, 69, 35, +145,229, 73,112, 73, 36, 18,148,150,150, 66,169, 84, 30, 49,153, 76,205,118, 19,253, 53, 29, 2, 48,158, 62,125,122,188,203,239, + 33,195,135, 15,255,102,227,198,141,177,217,217,217,216,179,103, 15, 34, 35, 35, 49,119,238,220,139,101,101,101,255, 2,176,177, +178,178,210,239,117,219,182,109,219, 69,173, 86, 99,199,142, 29, 0,176, 21,192,191,159,123,238, 57,198,106,181, 98,222,188,121, + 58, 0,235, 66, 67, 67,215, 44, 95,190,188,123,183,110,221,100,217,217,217,218, 61,123,246,252, 22,160,200,178, 11,130,112,153, +192,114, 77,211,224,224,224, 64, 28, 45,107, 72, 72,200, 81,173, 86, 59,202, 96, 48,104,229,114,121,176, 86,171, 53,185, 10, 44, +145,159,227, 56, 62, 47, 47,175, 4, 64, 74, 72, 72,200, 81,120,105,230,228, 56,110,240,224,193,131, 57,247,123, 80, 86, 86,134, +210,210, 82, 88, 44, 22,244,232,209,131,145, 48, 86,201,165,162, 35,110,211, 58, 80,145,245, 39, 57, 90, 68, 44,235,226, 40, 65, + 79, 35, 13,215,175, 95,239,252,205,178, 44,190,254,250,235,128, 68,209,198,141, 27,125,118, 88,119,107, 58,244,107,141,139,199, +127,254,249,231, 32,132, 56,157, 44,150,101, 49, 97,194, 4,200,229,114, 76,155, 54, 13, 19, 38, 76, 0,199,113,126,155, 14, 93, + 5, 76,210,235,122,215,151,163,134, 66,225,232, 15,197, 48,140,171,216, 98, 2, 21,111,190,220,188, 64, 90, 2, 92, 57,197,243, +130,130,130,188,118,132,119,227,244,117,129, 95, 0,228,199,198,198,238,200,200,200, 8,217,191,127, 63,102,206,156, 41, 53,153, + 76,109,178,179,179,157,215,245,148, 94, 58,157, 78, 65, 75, 14, 69, 75,184, 89, 62,254,174,112,235, 95,197,184, 54,227,249,248, +116, 63, 30, 46,251, 92,121, 43, 24,134,177,122,184, 94,133, 7,113,229,126, 13,215, 99, 42,188, 58, 90,254, 42, 11,127,130, 43, + 16, 71, 75,175,215,255,182,110,221,186, 94, 15, 63,252, 48,231,171,217, 80,167,211, 33, 58, 58, 26,199,142, 29,179,233,245,250, +223, 2,112,202,154, 83,104,185, 35,187,188,188, 92, 98,181, 90,209,190,125,123,196,199,199,195,104, 52,162,166,166, 70, 2, 96, + 99,128, 28, 82,149, 74, 37, 1,128,154,154, 26,160, 97,168,105,106,135, 14, 29,112,224,192, 1, 84, 87, 87,255, 8, 96,216,148, + 41, 83,122,244,238,221, 91,250,253,247,223,235,159,121,230,153, 31,173, 86,107, 64, 74, 67, 16, 4,179,205,102, 75,102, 89,214, + 82, 83, 83,115,193, 53, 61,163,163,163,195, 85, 42, 21, 83, 86, 86,102, 13, 68,104,117,235,214,109,239,249,243,231, 49,117,234, +212,138,233,211,167,119,168,171,171,187, 84, 91, 91,107,115, 21, 91, 70,163,145,109,213,170,149,124,222,188,121, 10, 0,232,214, +173,219, 94,111, 66, 75,167,211,181, 86, 42,255,120, 49, 54,153, 76, 40, 45, 45, 69,105,105, 41,202,202,202, 80, 87, 87,135,148, +148, 20,232,245,250, 68, 90,205,252,101, 66,171, 81,243,153,107,249,118,125,144, 55,165,172,187, 10,152,187,239,190,219,217,183, + 75,116,200,196,109,197,138, 21,238, 29,204, 3, 18, 90,159,127,254, 57, 94,120,225, 5, 4, 5, 5, 97,214,172, 89,141,154, 14, +221,197,129, 32, 8, 76, 32,113, 79,126,195,128,210, 57,225,224,121, 30, 17,207,148, 53,106,162,243, 32, 56, 2, 10,231,244,233, +211,155,165,233,208,149, 51, 49,177,161,168, 44, 88,176, 0,163, 70,141,194,182,109,219,174,184,233, 48, 45, 45,109,201,234,213, +171, 67,142, 31, 63, 14,173, 86,139,138,138, 10,152, 76, 38, 20, 23, 23,123,109, 21,112,212,229, 65,180,228, 80,252,201,245,212, +190, 63,147,183, 57,175,199,249,121,128, 7, 44,180, 2,113,180, 76, 38,211,172, 23, 95,124,241,185, 33, 67,134,132, 7, 7, 7, +163,164,164,228, 50,145, 85, 95, 95, 15,181, 90, 13,131,193,128, 85,171, 86,105, 77, 38,211, 44,127,226,192,106,181, 34, 42, 42, + 10,149,149,149, 16,188,244,159,102, 89, 22, 10,133, 2,245,245,245,128,159, 78,230,158, 30, 24, 22,139, 5, 86,171, 21, 86,171, + 21, 22,139,197,239, 91,178,187,153,167, 82,169, 68,225, 1, 0,186,184,184,184,246, 65, 65, 65, 40, 40, 40, 0, 26, 70,246, 13, +185,253,246,219,249,170,170, 42,242,228,147, 79,110, 39,132, 60, 5,223,179,227,155,115,114,114,146, 1, 64,161, 80,228, 2, 64, +113,113,177,181,166,166,166,145, 83,168, 84, 42,201,136, 17, 35, 98, 9, 33,200,201,201, 73,150, 74,165, 4,222, 71, 53, 26, 87, +174, 92,121, 60, 36, 36,100,105, 86, 86,214,195,153,153,153,199,186,116,233,146,172,211,233,202, 13, 6,131,193,104, 52, 18,137, + 68, 34, 13, 11, 11, 11,218,176, 97,195,153, 93,187,118, 13,209,104, 52, 75, 87,174, 92,121,220,155,243,166, 82,169,138,245,122, +125,146,120, 79, 93, 69, 86,105,105, 41, 8, 33,200,207,207,135, 82,169, 60,239,175, 89,151,162,229, 32,190, 84,185, 59, 47,238, +251, 2, 21, 89,174,194, 96,195,134, 13, 62,231,208, 10,148,211, 85, 20,189,242,202, 43,152, 51,103,206,101,142,214,180,105,211, + 0, 0,111,191,253,118,192,125,180, 68,247,170,116, 78, 56, 98, 94,168,110, 20,118, 0, 96,196,240, 53,173,204,131,227, 56, 76, +157, 58,245,178, 78,234,174, 77,123, 1, 54,241, 53, 10,103,121,121, 57, 56,142, 67,120,120, 56, 30,121,228, 17, 12, 29, 58,212, +217, 4,217, 84,222,147, 39, 79,238,120,227,141, 55,186,166,165,165,225,253,247,223,175, 14, 13, 13, 13,254,207,127,254,195,213, +212,212, 48,190, 28, 45, 42,180, 40, 40,154, 65,104,137, 5, 44,208, 81,135, 94, 42,203, 33,104, 60,215, 70,173, 94,175,127,228, +182,219,110,251,105,217,178,101,138,182,109,219,226,228,201,147,168,174,174,134,217,108,134, 84, 42, 69,108,108, 44,106,106,106, +240,245,215, 95, 27,244,122,253, 35, 0,106,253,112,190,213,179,103,207, 47, 62,254,248,227,160,244,244,116, 84, 87, 87,163,190, +190,222, 41,132, 24,134,129, 70,163,129, 66,161,192,222,189,123,177,126,253,122, 3,128,183,252,112,122, 82,115,176, 88, 44, 78, +193, 21,128,208,114,229, 84,137,174,142, 94,175, 7, 0,107,235,214,173, 99, 0, 32, 63, 63, 31, 0, 10, 83, 82, 82,166,180,109, +219,150, 89,188,120, 49, 33,132,172,247, 34,178,156,156, 12,195, 84, 19, 66, 46, 1,136, 49,155,205, 82, 0,168,173,173,181,180, +106,213, 42, 74, 46,151, 11, 10,133, 66, 8, 10, 10, 18, 74, 74, 74,108, 54,155, 77, 10, 0,253,250,245, 51, 3, 40,117, 91,163, +208,149, 83, 32,132,104,231,207,159, 63,101,244,232,209, 25,125,250,244, 73,123,246,217,103,143, 62,249,228,147,108,124,124,124, + 88, 93, 93,157,241,244,233,211,151, 62,249,228,147,186,221,187,119, 15,225,121,254,220,252,249,243,167, 0,208, 50, 12, 35,120, +226,180,217,108,191,101,103,103,255, 43, 51, 51,147,187,112,225, 2,202,202,202,156, 34,171,172,172, 12,157, 58,117,194,174, 93, +187,236, 22,139, 37,187, 9,233,217, 92,160,156, 13, 47, 33, 68, 44,235,222, 4,150,248, 50, 21, 40,167,171, 40, 26, 53,106, 84, + 35, 23, 75, 42,149,226,135, 31,126,240, 88,111,120, 40, 87,141,226,238, 58,199,215, 27,111,188,209, 72,180, 77,154, 52,201,107, +117,230, 47, 61, 69,158,218, 5,241,141, 71, 29,122, 41,231,190,194, 41,214,157, 60,207, 99,210,164, 73, 1, 59, 90,184,188,143, +214,101,156, 98,220, 7, 12, 24, 0,189, 94,239, 20,178,222, 28, 45,127,233,105,183,219, 95,152, 51,103, 14,209,104, 52, 55,107, +181,218, 71,207,159, 63,191, 80,175,215,223, 84, 91, 91,235,211,209, 50,153, 76,114, 90,142, 40, 39, 90,102,126,174,235, 71,104, + 57, 30,146,104,221,186,117,163,181,179, 88,150,109,180, 53,165,159,129, 3, 27,242,242,242,238,187,229,150, 91,190,125,225,133, + 23,130,211,211,211,249,164,164, 36,232,116, 58, 20, 20, 20,224,216,177, 99,182,149, 43, 87,106,245,122,253,163, 0, 2, 25,117, +182,232,248,241,227,235,135, 13, 27,246, 78,239,222,189,159,158, 60,121,178, 36, 53, 53, 21,181,181,181, 8, 11, 11, 67, 84, 84, + 20, 78,157, 58,133, 85,171, 86,217, 43, 43, 43,191, 0,240, 30, 60,180,161,250,123,225,183, 88, 44,120,232,161,135, 32, 8, 2, +102,207,158,141, 64, 22, 84,118,129,197, 98,177, 16, 0,140,163, 63,151,222, 49,187, 52, 78,159, 62, 13, 0,231,146,147,147,131, + 1, 32, 59, 59,155, 65,195,252, 90,129,188,225, 19, 66,136,211,217,234,212,169, 83,129,123,229, 40, 58, 89,162, 11,230, 47,220, + 12,195, 24, 9, 33,229,122,189,126,216, 43,175,188,242,206,231,159,127,254,240,231,159,127,126,217,113, 26,141,102,233,204,153, + 51,223,123,224,129, 7,202, 25,134,241,218,143, 76,167,211,189, 61,102,204,152, 7,142, 28, 57, 18, 28, 20, 20, 4,157, 78,135, +170,170, 42, 88, 44, 22,164,164,164,160,188,188, 28,139, 22, 45,170, 51, 24, 12,239,210,226,248,215,192, 85, 24,120,115,181, 2, + 16, 89, 94, 93,157, 95,126,249,197,227, 28, 85, 77,229,116, 23, 27,129,206,109,229,235,165, 72,156,150,198,211,148, 17, 77,172, +215, 46,227,229, 56, 14, 31,125,244,145,115,210, 86, 79, 78, 86, 83, 28, 45,145, 51, 60, 60,188,193, 38, 87, 42, 33, 8, 2,238, +188,243,206,171,225, 21, 0,140,115,153,241,125,250,107,175,189, 54,165, 83,167, 78,169, 0,228,174,105,208, 68, 23,159,130,130, +194,159,208,178,219,237,197, 29, 59,118,108, 84,193,249, 91,204,212,106,181, 22, 7,120,221,245, 58,157, 46,101,230,204,153, 47, +170, 84,170, 33,122,189,190,171,163,226, 56,162,211,233,178, 77, 38,211,167,104,218, 34,208, 21, 0,158,223,189,123,247,236, 97, +195,134, 77,187,245,214, 91, 71,142, 31, 63,158, 33,132, 96,222,188,121,228,236,217,179, 43, 28, 46,214,217, 43, 73,164,240,240, +240,227, 95,127,253,117,244, 79, 63,253, 4,171,213,138, 79, 63,253, 20,193,193,193,199,171,171,171, 3,165, 40,223,180,105,211, + 55,125,250,244,121,108,215,174, 93,139, 0,252,190,117,235,214,133,125,251,246, 29,179,107,215,174, 37, 0,142,109,222,188,121, + 97,239,222,189,199,236,219,183,111, 57,128, 67, 77,168,124,157,206,150,205,230,185,165,209,139,147,229,139, 83, 75, 8,177, 60, +254,248,227,227, 31,120,224,129, 47,247,237,219,119, 83, 77, 77, 77, 87, 0, 8, 13, 13, 61,210,171, 87,175,189,203,150, 45, 59, +229,112,178,252,117,214,175,208,233,116, 35,186,118,237,250,227,251,239,191,175, 74, 75, 75,227,218,183,111,143,194,194, 66, 28, + 61,122,212,246,191,255,253,175,222, 96, 48,220, 13,224, 18, 45,142,127,157,208, 34,132, 32, 52, 52,180,209, 75,148, 56,228,191, +169,205,133,174, 15,102,113,169, 30,119, 94,111,156,190,166, 77, 16,161, 86,171,157,147,155, 6,210,101, 65, 16,124,207,199, 70, + 8,113,114,138, 91, 0, 34,203,239, 8, 65,199, 18, 56, 1,115, 6, 50,189,131, 74,165,130,213,106,117,242, 6, 48,242,179,169, +106,241, 23, 0,191, 88,173,214,211, 0,218, 81,113, 69, 65,209,130, 66,235,210,165, 75, 61, 91,248,218, 90,147,201,244,158,201, +100,122, 79,220, 97, 52, 26,175,150,243, 44,128, 7, 54,109,218,244,241,166, 77,155,196,118,132,169,240,191, 94,162, 79,156, 60, +121, 50,147,231,249,255, 46, 93,186,180, 55, 33, 4, 33, 33, 33,187, 11, 11, 11,255,211, 20, 14,187,221,254,248,174, 93,187,158, +131,163, 47,147,197, 98,121,124,199,142, 29, 47,162, 97, 61, 38,216,237,246,199,247,236,217,227,252,221,196, 7, 37, 33,132,152, + 8, 33,113, 94, 14, 49, 53,209,129, 19,157, 45,243,178,101,203,234, 1, 28,198, 31,243,100, 89, 29,155,209,173,185,208, 23, 54, +235,116,186,246,147, 38, 77,154, 46,145, 72, 6,235,116,186,120,149, 74, 85,100,179,217,126,211,235,245,111,161, 97,141, 42,138, +191, 8,102,179,249, 66,199,142, 29, 57, 79, 47, 80,190, 30,228,190, 94,172,236,118,123,113,135, 14, 29,252,190,156,121,224,188, +224, 67, 52,156, 75, 73, 73, 97, 3,229, 18, 97,177, 88,202,125,133, 51, 37, 37, 5, 77,229,244, 23,247,228,228,100,143,113,247, + 35, 8,189,198,221,102,179, 93, 17,167,175,244,244, 5,131,193,112, 41, 50, 50,178,222,104, 52,242, 38,147,137,183,217,108,141, +236, 71,133, 66, 81, 97, 48, 24,104,225,161,160,184, 26,161,245, 15,199,126, 52, 44, 47,209, 92, 48, 29, 57,114,228, 49,167, 61, + 85, 94,126,165, 60,238, 74,178,222,207,239,166, 8,163,102,119,132, 28, 66, 74,223, 76,116,149,245,245,245, 79,138, 63,196, 62, + 32, 20,127, 61,170,170,170,110,110,110,206,234,234,234,102,127, 81,171,172,172,204,104,129,184,247,188, 94, 57,125,161,164,164, +228,102, 63, 66,140, 22, 28, 10,138, 0,193,210, 36,160,160,160,160,160,160,160,160,104, 25, 48,104, 24, 57,224, 9, 77, 25, 77, + 48,228, 10,174,157, 77, 57, 41, 39,229,164,156,148,147,114, 82,206,235,142,211, 31, 55, 29,205,216,194, 2,140,114, 82, 78,202, + 73, 57, 41, 39,229,164,156,215, 31,231, 53, 9,218,116, 72, 65, 65, 65, 65, 65, 65, 65, 65,133, 22, 5, 5, 5, 5, 5, 5, 5, + 5, 21, 90, 20, 20, 20, 20,174, 72,109,221,186,245,137,212,212,212, 11, 0,198,182,240,181, 30,233,221,187,119,149, 92, 46,223, + 0, 32,149, 38, 61, 5, 5, 5, 21, 90, 20, 20, 20,215,180,200,234,218,181,235,246,147, 39, 79,118,202,206,206,142,139,143,143, +255,176, 37, 47,214,179,103,207, 15,182,109,219, 22,190,110,221,186,219, 98, 98, 98,114,174, 80,108,165,182,105,211,230, 68,106, +106,106, 49,128, 71,154, 57,136, 99, 51, 50, 50,170,101, 50,217,122, 42, 4, 41,174, 3,116, 1,208,149, 10, 45, 10, 10, 10,138, + 22, 20, 89, 59,119,238,140, 48, 26,141, 56,121,242, 36, 42, 42, 42, 14,181,228, 5,115,115,115, 47,237,220,185, 19, 9, 9, 9, + 88,178,100, 73,100,114,114,242,182, 38, 10,154,212,174, 93,187,110, 63,113,226, 68,167,236,236,236,248,168,168,168, 79,154, 51, +124, 55,221,116,211,180,109,219,182,133,109,216,176, 97,104,100,100,228,149, 10, 65, 10,138,191, 51,228, 0, 30, 99, 24,102,111, +151, 46, 93,142,164,165,165,253,206, 48,204, 46, 0,163,112,237,206,221, 25, 24, 86,175, 94,189,117,245,234,213, 91,105, 30,161, +160,160,104, 6,164,165,165,165,233,116, 58, 29,169,168,168, 32,159,125,246, 25, 9, 15, 15,183, 0,248, 13,192, 74, 15,219,155, + 0, 52, 1,114,107, 28,199,123,226,249, 45, 60, 60,220,242,217,103,159,145,252,252,124,114,252,248,113,146,154,154,106, 8, 80, +208,164,118,237,218,181, 82, 12,243,218,181,107, 9,199,113,235,155, 51, 81, 52, 26,205,177,156,156, 28,114,246,236, 89,178, 97, +195, 6, 18, 29, 29, 93, 78,197, 22,197, 53,130, 36, 0, 31,168,213,234,234,187,238,186,139,124,245,213, 87,100,213,170, 85,228, +199, 31,127, 36,179,102,205, 34,131, 6, 13, 34, 50,153,236, 2,128,215, 1,132, 94, 79, 90,132,113, 68,140, 0, 24, 8, 0,153, +153,153, 84,108, 81, 80, 80, 92, 45,118,234,245,250, 12,189, 94,143,186,186, 58,180,110,221, 26, 60,207,123, 60,176,188,188, 28, + 59,118,236,192,184,113,227,142,151,150,150,246,135,239,117, 47,195,186,119,239,190,115,243,230,205,169,193,193,193,206,157,130, + 32,192, 98,177,192,106,181,194, 98,177,192,100, 50,193,100, 50, 65, 38,147, 65,161, 80, 32, 60, 60,252, 40,124, 55, 97, 56,221, + 55,131,193,128,131, 7, 15, 98,244,232,209, 21, 85, 85, 85,253, 1,228, 54, 99,186,164, 70, 69, 69,229, 44, 90,180, 40, 50, 37, + 37, 5,231,207,159,199, 19, 79, 60, 81,121,238,220,185,126,205,124, 29, 10,138, 63, 19, 19,238,187,239,190,105,209,209,209,108, +151, 46, 93, 16, 27, 27, 11,147,201, 4,131,193, 0, 66, 8, 56,142, 3, 33, 4,181,181,181,200,201,201,193,230,205,155, 77,151, + 46, 93,250, 26,192,167, 0,242, 92, 68,214, 53,169, 69,156, 66, 43, 51, 51,147,161,121,133,130,130,162,153,112,164,182,182,182, +139,201,100,130, 78,167, 11,232,132,252,252,124,140, 29, 59,246,120,105,105,233, 45,240,188,168,188,166,123,247,238,123,114,114, +114, 82,141, 70, 35,180, 90,255,235,206,203,100, 50, 4, 5, 5, 33, 34, 34, 98, 23,128, 62,222,222,196,187,116,233,178,127,215, +174, 93,225, 6,131, 1,135, 14, 29,194, 35,143, 60, 98,169,174,174,222, 14,192, 91,224,171,209,176,142,234, 57, 15,255, 37, 2, +120,209,241,134,239, 9,170,200,200,200,190,139, 23, 47,150,182,109,219, 22,122,189, 30,163, 70,141,170,206,205,205,237, 5,160, +128,102, 29,138,127, 32,114, 79,158, 60,217,193,110,183,163,178,178, 18, 38,147, 9,122,189,222, 41,180, 36, 18, 9, 8, 33,176, +217,108,206, 23,163, 3, 7, 14, 32, 59, 59,155,228,231,231, 79,118,148,165,107, 86,139, 80,161, 69, 65, 65,209, 18, 72,237,208, +161,195,161, 95,127,253, 53, 72, 42,149, 98,213,170, 85,152, 60,121,178,181,186,186,122,155,187,120,137,142,142, 78, 91,184,112, + 97,114, 74, 74, 10,126,255,253,119,220,127,255,253,111, 1,152,238,129,243, 77,173, 86, 59,205, 98,177,224,208,161, 67, 24, 51, +102, 76, 65, 89, 89,217, 49,119, 17,147,156,156,220,239,147, 79, 62,225,123,244,232, 1,173, 86,139,145, 35, 71,234, 79,157, 58, +213, 27,192, 49, 47, 97,253,164,186,186,250, 21,187,221,142,186,186, 58, 36, 36, 36, 64, 42,149,250,140,156,193, 96, 64, 82, 82, +210,174,138,138,138,203,196, 91, 68, 68,196,166,243,231,207, 15, 82, 40, 20, 62, 57, 44, 22, 11,138,139,139, 33,147,201, 96, 50, +153,208,174, 93,187,175, 1, 60, 78,179, 14,197, 63, 81,104, 29, 62,124,184,195,119,223,125,135,238,221,187,163,115,231,206,168, +175,175,119,138, 46,179,217, 12,171,213,122,217, 73, 90,173, 22, 47,191,252,114, 30, 28,205,231,215,170, 22, 17, 59,166, 77, 17, +219, 68, 51, 51, 51, 7,208, 60, 67, 65, 65,113,181, 21,111, 94, 94, 94,250,144, 33, 67,182,173, 88,177,162,213,240,225,195,209, +174, 93, 59,254,222,123,239,141,212,235,245,131, 93, 15, 44, 43, 43, 11, 27, 51,102,204,254,162,162,162,100,199,174, 94, 94, 56, +123, 5, 7, 7, 35, 63, 63, 95, 20, 89, 61,225,214,204, 40,147,201,214, 31, 62,124,152,151,201,100,216,183,111, 31,198,142, 29, + 91, 89, 80, 80,224,175, 89, 46,212,108, 54, 67, 34,145, 0, 0,138,139,139,253, 70,238,252,249,243, 16, 4,193,228,233, 63,150, +101,229, 7, 14, 28, 64, 92, 92,156, 79, 14,150,101,221, 5, 93, 13,205, 54, 20,255, 80, 88,205,102, 51,122,246,236,137,130,130, + 2, 28, 56,112,192, 41,184, 42, 43, 43, 81, 82, 82,210,232,224,189,123,247,226,224,193,131,232,223,191,191, 59,207, 53,169, 69, +156,202,113,245,234,213, 3, 28,145,219, 74,243, 12, 5, 5, 69, 51, 33, 53, 46, 46, 46,103,209,162, 69,145,177,177,177, 24, 52, +104, 80, 81,105,105,105, 27, 15,199,173, 36,132,220,157,159,159,143,182,109,219,174, 2,112,207,149, 28,147,152,152, 88,177,111, +223,190, 86,199,143, 31,199, 35,143, 60, 82,225,232,243,229,175,239, 83,114,167, 78,157,246,109,216,176, 33,156,101, 89, 28, 59, +118, 44,144,166,195, 66, 52,244, 47, 57,231,225,191, 68, 0,147, 0,132,123, 57, 87,213,161, 67,135,190,251,247,239,151, 50, 12, +131,194,194, 66,177,233,176,167,131,151,130,226,159,134, 17,113,113,113,255,123,238,185,231, 66,122,247,238,141,226,226, 98, 92, +184,112, 1,151, 46, 93, 66,122,122, 58,210,210,210,112,246,236, 89,172, 95,191, 30, 7, 15, 30,132, 92, 46, 71, 66, 66, 2,212, + 75,191,195,127, 25, 28, 7,144, 70,181, 8, 5, 5, 5,197, 85,136, 45,169, 84,186, 62, 62, 62,190, 28,158,231,165, 10, 27, 57, +114,100,137,221,110, 39,103,207,158, 37,104, 24, 61, 8, 47, 66,139,156, 61,123,150, 68, 71, 71,231, 3, 8,243,112,204,216,152, +152,152, 34,165, 82,121, 20, 77,156,214,161,125,251,246, 21,167, 78,157, 34, 69, 69, 69,100,221,186,117, 36, 34, 34,162, 37, 70, + 4,166,118,236,216,177,178,174,174,142, 24,141, 70,146,147,147, 67, 18, 19, 19, 43, 64, 71, 30, 82,252,243, 17, 12, 96,106, 74, + 74,138,241,227,143, 63, 38,235,215,175, 39, 11, 22, 44, 32,211,166, 77, 35,227,199,143, 39, 25, 25, 25, 36, 35, 35,131,140, 26, + 53,138,188,242,202, 43,228,246,219,111, 39,106,181,186, 22,192,189, 52,233, 40, 40, 40, 40,154, 23,137, 0,102, 57, 4,213,202, +145, 35, 71,150,152, 76, 38,114,225,194, 5,242,195, 15, 63, 16, 52, 76,221,224, 9,111,150,150,150,146,210,210, 82,113,106,132, +124,252, 49,173,195, 87, 14,222,171, 18, 65, 73, 73, 73, 21,251,247,239, 39,133,133,133,100,237,218,181,196, 33,216,154, 13, 10, +133, 98,131, 86,171, 37, 70,163,145,108,218,180,137, 78,239, 64,113, 45, 34, 10,192,220, 27,110,184,193, 58,123,246,108,178,114, +229, 74,242,217,103,159,145, 17, 35, 70,144,215, 95,127,157, 60,248,224,131, 36, 50, 50,210, 4, 32, 11, 64, 8, 77,174,171, 7, + 93,217,156,114, 82, 78,202,233,142,245,199,143, 31, 39, 34,236,118, 59,185,112,225, 2,217,176, 97, 3,137,137,137, 57,134,198, +243,105,185,114,106, 58,119,238,124,242,212,169, 83,228,252,249,243,196, 98,177, 56, 57, 78,158, 60, 73, 0,108,109,134,112,166, +198,199,199,151,111,217,178,133,156, 58,117,138,196,196,196, 20, 53,103,220,147,146,146,202, 43, 42, 42,200,166, 77,155, 72,100, +100,164, 63,145, 69,243, 18,229,252, 39,115, 38, 1, 88,220,163, 71, 15,251,156, 57,115,200,211, 79, 63, 77, 18, 19, 19,237,142, +151,162,248,235, 73, 8, 93,223,179,180, 82, 80, 80,252, 21,144,239,222,189, 27,114,185,220,185,227,247,223,127,119,157, 71,203, +219,188, 13,218, 19, 39, 78,220, 50,124,248,240,109,115,230,204,233,236, 58,138,105,203,150, 45, 0, 96,106,134,176,229, 94,184, +112,161,255,176, 97,195, 62,141,136,136,184,177,180,180,244,157,230,140,120, 97, 97,225, 43, 93,187,118,157, 94, 87, 87,167,213, +235,245,163, 64,231,206,162,184,118, 81, 8, 96,244,129, 3, 7, 62, 60,112,224,192, 91, 0, 8,128,247, 1,156,184,222, 18,130, + 10, 45, 10, 10,138, 63, 27, 99,159,124,242, 73,247,206,226,251, 0,252,159, 15,145, 37,226, 82, 65, 65, 65,159, 59,239,188,243, + 57, 52, 30,157, 40,118, 78,111, 14,228,154,205,230,161,238, 35,165,154, 9, 75, 74, 75, 75,151,208, 44, 64,113, 29,225, 24,128, + 7,175,231, 4,160, 66,139,130,130,226,207,198, 57, 0, 79, 92,197,249, 90,120,158,103,139,130,130,130,226,111, 7,186,168, 52, + 5, 5, 5, 5, 5, 5, 5, 5, 21, 90, 20, 20, 20, 20, 20, 20, 20, 20,255, 44, 48,240, 62,114, 32,187, 9, 60, 87, 50,162, 33, +155,114, 82, 78,202, 73, 57, 41, 39,229,164,156,215, 29,167, 63,238,108, 80,180,168, 0,163,156,148,147,114, 82, 78,202,249,207, +230,100, 28, 27,235,216,196,223,127,231,184, 51,127,227,184, 95, 47,156,215, 36,254,170,206,240,226,141, 16,208, 48,228,147,226, +239, 7,215, 2, 66,232,125,162,160,160,104, 98,221, 33,113,121,216,218, 29, 27,254,134,117,137,171, 40, 16,174,242,185,212, 18, +113,191,158, 57,175,121,161,117,163, 74,165,154, 44,147,201, 82, 24,134,177,235,116,186, 35, 38,147,105, 62,128, 93, 87,121,205, +175,162,163,163,199, 86, 85, 85, 9, 44,203,130,101, 89, 48, 12, 3,150,101,193,243,188,161,182,182, 86,115, 37,164,145, 93, 70, +188,202, 49,204, 11,118, 98,159, 95,126,116,213, 52,127,251, 41,124, 23, 24,169, 84,122, 95,120,120,120,104, 69, 69, 5, 97,217, +134,174,124, 18,137, 68, 92, 8,215, 86, 91, 91,251, 77,160,100, 97, 97, 97,123,195,195,195, 67,197,243, 25,134, 65, 85, 85, 85, + 77,121,121,249, 77, 0, 16, 20, 20,180, 67,165, 82, 69,112, 28, 7,137, 68, 2,137, 68, 2,189, 94, 95, 85, 85, 85,117, 11,189, + 21,255, 76, 44, 95,190, 92, 50, 44,254,137,118, 28, 49,116, 99, 89, 18, 34, 8, 76,173,141, 81,252,190,254,194, 87,103, 2, 57, +127,212,168, 81,118,154,138,127, 30,100, 50,217,236,232,232,232,127,215,215,215,235, 25,134, 33, 12,195,128, 97, 26,222,179,220, + 63,237,118,123,113, 85, 85, 85, 79, 63, 15, 91, 94, 38,147,205,140,137,137, 25,163,215,235,245, 14, 62,143,188, 0, 96,181, 90, +139, 43, 43, 43,123, 6, 84,215, 71, 70,206, 87, 40, 20,143,234,245,122, 29,195, 48,130,235,127,132, 16,215,135,249,217,202,202, +202,126,254,132,129, 76, 38,251, 52, 58, 58,250, 95,142,184, 59,195,121,181,113,143,142,142, 30,163,211,233, 2,226,244, 17,247, +203, 56, 91, 34,156,127, 83,206,107, 95,104,165,167,167,127,183,103,207,158, 14, 60,207, 3, 0,140, 70, 99,215,185,115,231, 62, +246,198, 27,111,100, 1,152,120,133,215, 91,216,175, 95,191,135,114,114,114,216,149, 43, 87,178,189,122,245, 2,195, 48,176,219, +237,176,219,237,232,210,165,139,226, 74, 35, 18,162, 82, 78, 56,184,241,191, 65, 55, 14,121,242,133,114, 96,154,191,253,190, 4, + 38,128,183, 1,164, 52, 49, 8, 21,142,116, 57,232, 69,108,236,100, 89,182, 73,156,130, 32,228, 95,186,116,169,143, 15, 1,211, +236,156, 14,145,117,127,191,126,253, 66,178,179,179,153,162,162, 34, 70,161, 80, 64, 16, 4,216,237,118, 88,173, 86,220,112,195, + 13, 77,114, 66, 67, 67, 67, 53, 19, 38, 76,104,119,199, 29,119,224,135, 31,126,192, 99,143, 61,134,190,125,251,230,149,151,151, + 3, 0, 84, 42, 85,196,241,227,199, 59,132,135,135, 67,175,215,163,182,182, 22,183,221,118, 27,170,170,170,254,209,133,235,230, +244,132,247, 25,150,113,206, 21, 69,108,246,234, 61,191,151,188,125,181,188,225,225,225, 7,229,114,121,180, 95,181,236,242, 32, + 51, 26,141,101,213,213,213,221,253,156,146, 4,224, 46,137, 68,210,158,227,184,142, 0,146,108, 54, 91, 52, 0, 72,165,210, 50, +137, 68, 82,104,181, 90, 79,153,205,230,211, 0,126,129,143, 5,144,135,197, 63,209,142,177,233, 71,214,153,132,225,202,182, 89, +169,250,179, 19,114,149,114,253,218, 97,241, 79,172, 8, 84,108,253,133, 72, 5,176, 12, 13, 11, 74, 63,141,134,121,128,174, 6, +241, 0,238, 70,195,154,143,201, 22,139,165, 18,192, 1, 52,244, 67,201, 3,144, 24, 25, 25,185, 68, 16, 4, 83, 85, 85,213, 19, +240,176, 80,117,239, 30,173,247,179, 44,155, 32,122, 2, 2,177, 23,239, 62, 80,220, 44, 15, 40,150,101, 63,205,204,204,252,215, +138, 21, 43,148, 7, 14, 28, 80,118,238,220,217,249, 66, 36, 8, 2, 26,107, 23, 32, 57, 57,217,159,171,193,177, 44, 59,123,228, +200,145, 15, 47, 94,188, 88,121,238,220, 57,101, 92, 92,156,147,211, 85,108,137,136,139,139, 11, 52,239,127, 53,116,232,208,209, +139, 22, 45,226, 87,173, 90,165,104,213,170, 21, 34, 34, 34, 32,149, 74, 47, 59,246,150, 91,110, 17,252, 71,157,253,244,158,123, +238, 25,253,253,247,223, 43,247,236,217,163,236,210,165, 11, 36, 18,201, 85,199,125,196,136, 17, 15,127,247,221,119,202, 35, 71, +142, 40,219,183,111, 15,209, 84,112,231, 99, 89, 22,173, 91,183, 14,136,243,238,187,239,126,120,217,178,101,202,131, 7, 15, 42, + 59,118,236,232, 76, 79, 66,200, 21,135,243,111,206,121, 93, 56, 90, 50,139,197,130,173, 91,183,130,101, 89,132,135,135, 99,236, +216,177,216,184,113,227,132, 77,155, 54,173,190, 2,103,235, 43,135,200,226, 1,224,199, 71, 71, 32,159, 7,198,149,155, 33,149, + 74,113,246,236, 89, 72, 36,146, 38, 91,139,114,185,124, 12, 33,100,146,254,194, 62,185,193, 96,133,177,100,191, 82,161, 80, 56, + 31, 0,250, 18,199,254,139,251,149, 10,133,226,172, 68, 34,153, 90, 95, 95,191,208, 27, 95,251,246,237,191, 61,118,236, 88, 39, + 79, 5,215, 23,244,122, 61,218,180,105,147, 88, 93, 93,221,222,211,255, 60,207, 39,156, 59,119, 46, 74, 38,147,129, 16,226, 44, +196,238,159,226,119,139,197,130, 27,110,184,193,226,235,154,190, 56,109, 54, 27,130,130,130, 32,186, 81,102,179, 25,245,245,245, +254, 56, 25,169, 84,122,159, 40,178, 0, 96,233,210,165,136,137,137, 65, 84, 84, 20, 84, 42, 21, 20, 10,133,147, 51, 80, 72, 36, + 18, 12, 27, 54, 12,239,190,251, 46,178,178,178,240,218,107,175, 53,170,104,121,158, 71,120,120, 56,214,173, 91, 7,141, 70,131, +196,196, 68,136, 2,255, 31,109, 11,178, 76,248,174,253,231,157, 14,237,237,183,118,226,110,238,206,125,238,120, 84,130,101, 1, + 65,104,120,116, 50, 12,136,205, 42, 92,218,127,164,228,157, 0,210, 51,174,176,176, 48, 42,208, 52,178,217,108,136,139,139,147, +248, 57,108,120, 90, 90,218,143,207, 62,251,172,180,125,251,246,140, 84, 42, 5,199,113,224, 56, 78, 20,232,137,132,144, 68, 65, + 16, 6,150,149,149,145,185,115,231,126,184,101,203,150,123, 1,172,245, 88,177, 16, 67,183, 58,147, 48,124,219, 33,220, 52,114, +200, 27, 88,183,124,194, 77,253,210, 5, 4, 43, 13,103, 0,252,157,133, 86,106, 90, 90,218,161, 61,123,246, 4, 89, 44, 22,244, +238,221,123,119,110,110,110, 15, 92,217, 12,238, 97, 0, 62,153, 56,113,226,232,103,159,125, 86, 18, 26, 26, 10,153, 76,134,186, +186, 58,156, 57,115,102,204, 55,223,124, 67,190,248,226,139,255, 3, 16, 92, 88, 88,152,177,119,239, 94, 12, 26, 52,232, 69, 0, + 47, 95,174, 8, 36, 9, 59,246, 22, 68,137,191,239, 30,214, 85,154,209,147, 45,107,112,113,220,143, 38, 16,236, 66,241,222,195, + 23, 2, 17, 98, 31,142, 24, 49,226,145, 21, 43, 86,168, 1, 96,222,188,121,184,239,190,251, 16, 30, 30, 14,165, 82, 9,169, 84, + 10,158,231, 27,125,250,121,216, 74, 0,124,248,224,131, 15,142, 92,188,120,113, 48, 0, 44, 94,188, 24, 35, 70,140, 64, 68, 68, + 4,130,131,131, 33,147,201, 32,145, 72,154,156,152,225,225,225, 95,245,189,233,166,199, 23, 45, 90, 4, 0,120,235,165,151,112, +199,205, 55, 67,173, 84, 64,169,144, 65, 76, 11,153,132,199,237,227, 94,240,171, 47, 1,124,124,223,125,247, 61,240,253,247,223, + 7, 3,192,129, 3, 7, 80, 94, 94,142,232,232,104, 40, 20, 10,200,100, 50,103,156, 25,134,129, 66,161, 8, 40,238,247,221,119, +223,200,239,190,251, 46, 24, 0, 22, 46, 92,136, 97,195,134, 57,227, 46,151,203, 33,149, 74, 27,109,238,162,211, 19,231,189,247, +222, 59,114,217,178,101,193, 0,240,205, 55,223, 96,200,144, 33, 8, 11, 11,115,166,167,200,213,148,123,244, 55,231,188, 62,132, +214,161, 67,135,238, 87,169, 84, 51, 0, 68,202,100,178,208,135, 31,126,184,245,227,143, 63,142, 7, 31,124, 16,155, 54,109,122, +170,137, 66,139,137,142,142, 30,155,147,147,227,124, 66,155,201,101,130,169,201, 15,112, 7, 38,237,127,234,169,152,172, 51,245, +216,189,247, 20,130,192, 50,123, 63,254, 56,210,120,250, 52,236,102, 51,222, 59, 91,215,176,223, 70,152,173,175,140,139,185,113, +246,255, 77, 2,176,208,135, 11, 32, 55,153, 76,200,203,203,107, 82, 32,138,138,138, 32, 8,130,201,151,187, 32,149, 74,113,244, +232,209,203, 84,189, 39, 36, 38, 38,250, 42,128,126, 57,215,175, 95,143,241,227,199,227,212,169, 83, 16,151, 42, 9,128,147, 9, + 15, 15, 15, 21, 69,150, 40,130, 20, 10, 5,120,158,103, 56,142, 99,196,166, 61, 71,225, 10, 72, 24,179, 44,139,111,191,253, 22, + 31,124,240, 1, 94,127,253,117,204,159, 63, 31,221,186,117,251, 35, 19,114, 28,180, 90, 45,194,194,194, 16, 22, 22,214, 72, 32, +254,147,225,126,155,103,206,154,163,132, 64, 26, 58,129, 16, 1, 16, 0, 2, 2,129, 8, 40,187,112, 6,147,223,253, 40,224,167, + 15,207,243, 56,125,250,180, 51, 31,136,206,176, 40,140, 92, 93,131,164,164, 36,191,121, 73, 42,149, 78,249,249,231,159,101,223, +126,251, 45,190,255,254,123, 48, 12, 3,185, 92, 14,149, 74,133,208,208, 80, 68, 68, 68, 56,183,132,132, 4,230,127, 61,184,254, +121, 0, 0, 32, 0, 73, 68, 65, 84,255,251,159,180, 91,183,110, 83,180, 90,237, 90,207,247,156,132, 40,219,102,165,142, 28,242, + 6, 0, 96,228, 27, 4,151,242,166,221,200,214,188,243,119, 94, 68, 54,181,107,215,174,219,119,238,220, 25,164,215,235, 33, 8, + 2,214,174, 93,171, 28, 50,100,200,182,130,130,130,126, 77, 21, 91, 73, 73, 73,171,118,238,220,121, 75,100,100, 36,106,107,107, +161,213,106, 97,181, 90, 33,145, 72,144,152,152,136, 15, 63,252,144,185,231,158,123,158, 31, 51,102,140, 81,161, 80,136,206, 70, +146,231,188,212, 56, 51,205,253,236,243, 80, 66, 26,242, 15, 17, 72,163,207,234,242, 66,188,244,202,228,128,194,216,186,117,235, +167,127,248,225, 7,181,171,179,228, 42, 2, 92, 69,150,184,249, 17, 6,108,155, 54,109, 30, 95,178,100,137,147,179, 85,171, 86, +224, 56, 14, 60,207,131,227, 56,176, 44,139,109,219,182, 97,198,148,137, 8,139,140,195,156,207,230,249, 13,103,100,100,228,252, + 97,195,134, 61,186,112,225, 31, 85,119,215,182,109,113,231, 45, 55, 35,170,149, 6,173,194,130, 27,210, 73, 96,240,251,169, 2, +191,207, 35, 0,108,235,214,173,159, 88,190,124,185,218,245,133, 80,140,171,248,242, 44,186,248,102,179, 25, 61,123,246, 12, 40, +238,174,156,162,219, 38,138, 54, 49, 61,197,235,136,229,213, 79, 56, 31, 23,133,176, 67,112, 54,226,224,121, 30,203,215, 45,242, +234,102, 95, 41,103, 83,239,187, 59,103, 97, 97, 33,166, 79,159, 14,241,165,205,181,171, 80,124,124, 60,230,204,153,227,183, 94, +114, 43, 3,189, 0, 68,186,236, 50, 3,144,185,124, 86, 48, 12,179,207,195,113,226,126,222,209, 98, 21,137,134,126, 99,117, 0, + 66, 61,240,121,227,169,116, 60,243, 34,221,142,111,116, 29,175, 66,107,245,234,213, 98, 41, 30,152,153,153,185,213,241,189, 70, + 46,151, 23, 41,149,202, 24, 0,117,107,215,174,197,127,254,243, 31, 56,172,213,187, 67, 66, 66,142,121,112,117, 14,153, 76,166, + 55, 0,148, 57,118,137, 67, 52,217,234,234,106, 97,227,198,141,236,226,123,135,194, 76,128,244, 73, 51, 48, 44, 51, 19,235,227, +101,144, 0,184,233,100, 37,148, 74, 37,167,213,106,173,174,253,182, 60,244,221,202,118,203, 80,146, 32,142, 67,239,237,107, 48, +126,251, 26,220,164,146,161,106,197, 50,212,237,200, 1,203, 50,232,175,106,133,215, 30,217,136, 62, 26, 57,100, 38, 29, 88,150, +245,148,179,157,156,121,121,121,163, 52, 26,205, 12,183, 4, 14, 4,249,104, 88,199, 9, 94,194, 9, 66, 8,186,117,235, 6,134, + 97,156,110,129,184,137,133, 78,220, 14, 30,244,216, 2,233,149,211,209, 4, 7,149, 74,133,223,126,251,205,121,204,224,193,131, + 97, 52, 26, 17, 30, 30, 30, 16,103, 69, 69, 5, 41, 41, 41, 97, 22, 47, 94, 12,158,231, 17, 17, 17, 1,165, 82,201, 44, 90,180, +104,162, 84, 42, 77, 48, 26,141,130,217,108,134, 76, 38,155, 35,222, 31,142,227,116, 90,173, 54,194, 27,167, 68, 34,193,179,207, + 62,139, 87, 95,125, 21,243,231,207,199, 83, 79, 61,117,153,227,101, 52, 26,209,170, 85, 43,167,216,242, 80, 0, 91, 98,184,111, +203,114, 10, 4,199, 14,174,199,241, 35,217, 16,236, 2,236, 2, 1, 33,118, 8, 54,224,192,198,221, 29, 46,230,151,196, 19,144, +134,174,183, 0,228,181,245,182, 1, 17,178,142, 0, 86,110,173, 50,207,246, 23, 78,142,227, 96, 52, 26,241,243,207, 63,227,228, +201,147, 88,187,118, 45, 12, 6, 3, 90,181,106,133,208,208, 80,220,124,243,205, 24, 51,102, 12,146,146,146,252,198,157, 16,178, +176,168,168, 40,189,111,223,190, 76, 77, 77, 13,106,106,106, 96, 48, 24, 96,183,219, 97,179,217,192,113, 28,130,130,130,160, 80, + 40, 16, 29, 29, 13,163,209, 72, 76, 38,211, 66,111,156,130,192,212,234,207, 78,200, 93,183,124,194, 77, 35,223, 32, 88,241, 1, +131,118,109,228,250,223,246, 7, 63,190,114,251,107,183, 1, 32, 2,113, 90, 11,196,106, 23, 42, 95,157,248,201,243,127,250, 61, +186, 92,100, 69, 24, 12, 6,212,213,213, 53,216,250, 50, 25, 86,172, 88,209,234,174,187,238,202, 41, 41, 41,233,239, 67,108, 93, +198, 25, 28, 28,156, 40,145, 72,112,244,232, 81,124,241,197, 23,248,237,183,223, 80, 86, 86,118, 41, 46, 46, 46,100,224,192,129, +236, 75, 47,189,132,244,244,116,124,253,245,215, 65,254, 56, 9, 33, 40,204,219,134,194,211,219, 33, 8, 13,174,117,195,230,249, + 59, 9, 48,238, 58,157,206,120,232,208, 33,245,151, 95,126,137,168,168, 40, 36, 39, 39, 67,169, 84, 34, 40, 40,168,209, 67,214, +245,193,235,175,108, 26, 12, 6, 99, 97, 97,161,250,187,239,190, 67, 68, 68, 4,146,146,146,160, 84, 42, 33,147,201,192,113, 28, + 24,134,193,226,197,139,177,244,221, 71, 80,120,234, 8, 70,220,121,155,223,112, 42,149,202, 71, 23, 46, 92,216,200, 2,137, 14, + 11, 3,199,179,144,240, 12,194, 6,223, 11, 0,184,180,233, 39, 95,179, 67,186,114, 50,117,117,117,198, 61,123,246,168,247,239, +223, 15, 65, 16,144,148,148, 4,189, 94, 15,141, 70,227,140,255,198,141, 27,113,207, 61,247,224,219,111,191, 69, 70, 70,134,223, +184,215,215,215, 27,143, 28, 57,162, 94,178,100, 9,194,195,195,209,186,117,107,103,220,197,141,231,121, 72, 36, 18,164,164,164, +160,182,182, 22,106,181,218,239, 61, 58,112,224,128,122,201,146, 37, 8, 11, 11, 67, 66, 66,130,211,113, 19,197,209, 7,159,191, +219,136, 32,136,137,189,106,206,166,222,119,119,206, 17, 35, 70,160, 93,187,118,208,104, 52, 80,169, 84, 78,110, 95,156, 94,180, +136, 83,111, 51, 12,179,218,165, 76,100, 50, 12,179,218,245,211,219,113,142,175,253, 39, 78,156,216, 51, 43, 43,107,122, 70, 70, +198,119, 59,119,238, 92,234,141,207, 27,207,196,137, 19,211,178,178,178,166,187, 30,239,225, 58,222, 29,173,204,204, 76,198, 17, + 73, 6, 64,114,143, 30, 61,246,109,218,180, 41, 60, 56, 56,216,121,240,249,243,231, 81, 83, 83,131,224,224, 96,205,204,153, 51, + 53, 3, 7, 14, 68,116,116,180,243, 13, 32, 47, 47,239,134,212,212, 84, 45, 0,119,223, 86, 96, 89, 22,125,250,244,193, 49, 71, +107,199,176,204, 76, 36, 36, 36, 56, 59,121, 4, 5, 5,225,249,231,159,103,198,143, 31,207,137,110, 6, 33, 4, 6,131, 1,177, +177,177, 10, 95,174, 14, 0,164, 25, 42,241,211,192,254, 96, 25, 64,127,112, 47,164, 50, 6,172,132, 65,119, 82,133, 95, 7,245, + 7, 3,192,124,120, 23, 2,112, 97, 14, 2,184,173,101, 28, 14,130, 51,103,206, 4,228,104, 57,226,197, 92, 41,167,232,104,236, +220,185, 19,118,187, 61, 80, 78,194,178, 44, 84, 42, 21, 98, 98, 98,160, 80, 40,160, 84, 42,153,239,190,251,238,237,228,228,228, +216,241,227,199,179, 90,173,150,237,211,167, 15,238,187,239, 62, 78,108,226, 76, 75, 75,243, 27,151,173, 91,183,226,139, 47,190, +192, 83, 79, 61,229,209,209, 98, 24, 6,145,145,145,208,104, 52,184, 86, 32, 0,176,216,172,208,215, 27,156, 77,186,118,187, 29, + 71,182, 28,238,144,127, 56, 47,109,245,119,223,242, 0, 96,220,242,147,235,105,177,247,125,190, 44,117, 64, 24,191,103,235, 37, +235, 30, 95,121,158,227, 56,140, 29, 59, 22, 89, 89, 89,120,244,209, 71,177,118,237, 90,188,243,206, 59,248,247,191,255,125,153, +171,229,239,205,209,106,181,254,247,177,199, 30,123,106,197,138, 21, 29,223,120,227, 13, 86,116,180,148, 74, 37, 24,134,129,209, +104,132,201,100,130,193, 96,192,169, 83,167,132, 39,159,124, 50,215,108, 54,255,215,107,115, 37,163,248, 93, 41,215,175,109,155, +192,182,211, 21,124, 20,220,247,230, 36, 3,163,232, 81,123,111,234, 16, 50,124,108, 82, 24, 8, 1, 17, 0,129, 0, 38,147, 14, +207, 63,255,162,228, 47,188, 85, 78,145,101, 52, 26,113,232,208, 33, 12, 26, 52, 8, 69, 69, 69, 56,113,226, 4, 58,116,232,128, + 69,139, 22, 69, 62,252,240,195, 57,229,229,229,253, 3,117,182,142, 28, 57, 50,241,198, 27,111,252,180,190,190,190,186,190,190, +254, 83, 0, 75, 1,212,156, 57,115,166,243,153, 51,103,230,174, 95,191,190,223,228,201,147, 37,110,125,116, 36,222,236, 81,171, +213, 6,131,193,228, 83, 96,137,191, 9, 17, 2,138, 56,195, 48,164, 99,199,142,184,235,174,187,192,243, 60,148, 74, 37,212,106, +117,163,102, 51,119,193,229,171,254, 0, 32, 48, 12,131,184,184, 56, 12, 31, 62, 28, 82,169,180, 17,167,152, 15,135, 15, 31,142, + 23,222,155,132,255,190,112, 43,190,120,172, 3,134,188, 95,230, 51,156,122,189,190,126,243,230,205,138, 87,159,122, 10, 55,182, +111,143, 86, 26, 13,218, 68, 71, 66, 33,151, 65,234, 26, 38, 38, 32,147,157, 0, 16, 36, 18, 9,186,116,233,130,178,178, 50, 20, + 20, 20,160,160,160, 0, 44,203,162,111,223,190, 78, 23,230,244,233,211,120,239,189,247, 96, 50,153, 2,142,123,251,246,237,113, +235,173,183, 66, 38,147, 65,169, 84, 54,106, 50, 20,211,180,174,174, 14,237,218,181,195,202,149, 43,145,154,154,234,151,179, 83, +167, 78, 24, 48, 96, 64,163,244, 84, 40, 20, 78, 81, 4, 0, 69,123,234,157,215,136,143,143,111, 18,231,134,189,231,241,229,198, +205, 48,153, 5,104,245,214, 70, 39,196,182,210, 96,251,146, 55, 2,138,187,200,185, 96,193, 2,212,212,212, 56,141, 3,241,165, + 92, 52, 81, 90,183,110,141,121,243, 60, 59,153,110, 90,196,211, 51, 47, 51,192,231,173,120,156,152,185,228, 89, 89, 89,211,221, +207,247,199,231,250,191,219,249,102, 55,113, 86,214,164,166, 67,185, 92,254,230,230,205,155,195,107,107,107,113,250,244,105,176, + 44,235,108, 83,231, 56, 14, 22,139, 5,103,207,158, 69,120,120, 56,202,203,203, 33,151,203, 33,145, 72, 96, 54,155, 1,160,187, +183, 7, 56, 33, 4, 47, 84, 52,116, 17, 90, 23, 39, 69, 33,128, 59, 43, 26, 10,134,216, 33,254,135, 31,126,128, 90,173, 70,112, +112,176,243,211, 95, 51,210,145,130, 51, 40,227, 25,176,187,182,129, 97, 1,150, 1, 24, 9,192,178, 4, 44,195,128,221,149, 3, +134, 1, 84, 17, 97, 77,173,128,253,117,140,247,217, 1,222,155,251,228,201,197,114,255,190,101,203, 22, 4,202,217,174, 93, 59, +168,213,106,231,182,126,253,250, 70,142,150,221,110, 71, 68, 68, 68, 32,156,164,193,141, 16, 16, 21, 21, 5,158,231,153, 69,139, + 22, 77, 76,249,127,246,174, 59, 60,138,106,125,191, 51,219,119,147,108, 54, 61, 33, 33,148, 0, 82, 34, 77,225,194,165,151, 0, + 66,104, 34, 69, 46, 4, 17, 81,138,168, 40, 17,129, 31, 42, 32,161, 73,147, 42,200, 37, 32, 72,151, 46, 69,164,131, 5, 20, 36, +129, 64, 8, 9,164,111,234,246, 50,237,247, 71,118,227,102,179, 73, 54, 33,194, 5,231,125,158,121,118,167,189,115,206,156, 51, +103,222,243,157,239,124,211,176, 97,200,244,233,211, 73,129, 64,128,235,215,175, 35, 33, 33, 1,245,235,215,119,219,103,171,168, +168, 40,235,147, 79, 62, 97, 62,249,164,100, 14, 69,100,100, 36,138,138,138,114,237,251, 53, 26, 77,126,159, 62,125,202,248,109, +228,229,229, 61,219,158,240,182,251, 72, 91,105, 24, 76, 38,232,180,134, 82,235, 80,110,102,142,234,227, 15, 63, 16, 45,155,250, + 6, 0,224,195,149,107,160,221,248, 87, 67,118,224,195, 81,129, 67,191,220, 53, 19,192,224,202,248,117, 58, 29, 76, 38, 19, 34, + 34, 34,112,249,242,101,104,181, 90,244,235,215, 15, 4, 65,148,206, 16,173, 6, 44, 25, 25, 25,157,162,163,163,127, 93,177, 98, + 69, 68,243,230,205, 9,189, 94, 15,131,193, 0,199,223,155, 55,111,114, 59,119,238, 76, 49, 24, 12,255,182,153,206, 93,226, 68, +198, 55,201,125, 67,223,220,251,227,117, 65,116, 96,163, 36,101, 70, 97, 4,157,159, 33,213,107,140,119, 76, 12,151, 0,142, 1, + 24,176,224,104, 22,140,109,216,235,105, 65, 46,151,127,117,241,226, 69, 63,147,201,132,107,215,174, 97,204,152, 49,150,188,188, + 60, 9, 0,252,231, 63,255,177,108,223,190, 93,210,168, 81, 35,108,219,182, 45,224,213, 87, 95,221,163,215,235, 95,116,147,250, +219,172,172,172,111,157, 55,250,249,249,173,126,248,240, 97,119, 71,159, 31,154,166, 75,147,227,242,193,100, 1,138,162, 96, 52, +154, 81, 92,172,133,197, 74,217,218, 76, 22, 12, 67,219,126, 89,208,182,118, 84, 34, 22,122,181,125, 49, 88,199,113, 28, 72,130, + 40,186,246,103,118,221,202, 68,187,171, 33, 46, 55,173, 89,206, 96,236,179,204,252,252,252, 32, 18,137,240,237,183,223,226,198, +165, 19,144, 8, 56, 48, 52, 5,154,178,130,161, 44, 16, 9, 4,248,241,250, 3, 68, 53,243,114, 75, 16,250,251,251, 99, 64,199, +142,136,238,216,177,100,122,155, 80, 8, 79,169, 20, 10,177,172,196,146, 5,128, 99, 72,119,131, 8,176,246,116, 6, 5, 5,225, +183,223,126,195,180,105,211,176,120,241, 98,200,229,242,210,217,207,183,111,223,198,238,221,187, 17, 21, 21, 85,237,188,219, 45, +120, 51,103,206, 68,102,102, 38, 86,174, 92,137,151, 94,122, 9, 34,145, 8, 69, 69, 69,248,247,191,255,141,156,156, 28,183, 56, + 29,135,247, 36, 18, 73, 25,235,147, 93, 0, 86,183,140, 28, 57,223, 24, 18,130, 67,151,118,130, 0,129,171, 59, 62, 40, 35, 10, +215,239,186, 80,109,206,185,115,231,150, 73,167, 59,214, 44,119,225,100,117,170,242, 56,130, 32,174,217,141,173, 51,103,206,156, + 69, 16,196,145,153, 51,103,206,138,139,139,187,229, 14,159,171,253, 4, 65, 28,181,137,176, 1, 14,219,174, 85, 75,104, 41, 20, +138,246,158,158,158,184,119,239, 30,250,245,235,103,201,207,207, 79, 18,137, 68, 77,242,242,242,164,185,185,185, 48, 24, 12,186, +249,243,231, 63, 0, 32,239,208,161, 67,163, 31,127,252, 17,143, 30, 61,194,246,237,219, 1,224,128,107,159, 13, 18, 44,203,150, + 86, 10,231,110,155, 64, 32,192,149, 43, 87,112,229, 74, 89,215,175,205,155, 55, 87,249,194,120,245,251,195,184,126,253, 58, 28, +195, 3,216,255, 59,110,147,201,100, 64,229, 51, 60,202,160, 42,199,248,170, 28,224, 93,193, 93,223, 47, 87, 51,115, 42, 66, 70, + 70, 70,133,231, 95,185,114,165,140, 69,171, 42, 78,129, 64, 0,134, 97, 32,151,203, 9,177, 88, 76,136,197,226, 48,187,200, 18, + 8, 4,165, 15,140, 84, 42,133, 84, 42, 45,211, 75,173, 8,153,153,153, 61, 50, 51, 51, 43,220,175, 86,171, 59,169,213,106, 60, +143,176, 82, 20,140, 6, 11,180, 58, 35, 62,143,251,111,201,198,207,241, 51,128,159, 59,189, 51, 13,147,251, 70,245,172,238, 48, +181,253,126, 7, 6, 6,226,220,185,115, 32, 8, 2,123,246,236,129,183,183, 55,250,246,237, 11,165, 82,137,153, 51,103, 98,248, +240,225,213,109,204,138,243,243,243, 59,189,255,254,251,191, 46, 93,186, 52,188,110,221,186,176, 88, 44,176, 90,173,176, 88, 44, + 72, 78, 78,198,206,157, 59, 31, 25, 12,134, 78, 0,138,171, 34, 59,145,241, 77,242,254,243, 31,102,246, 30,249,170,241,118,206, + 15,200,206,206, 7, 77,103,128,101,104, 88,105,166,196,194, 71,211,160,105, 6, 98,177, 64,185,244,139, 15, 78,177,224, 64,146, +132, 5,192, 43, 79,170,140, 84, 42, 85,164, 90,173,198,221,187,119, 17, 19, 19,147,157,159,159,159, 8,160, 23, 0,228,231,231, + 95, 28, 51,102, 76,243,248,248,248,224, 6, 13, 26,192,211,211, 83,169,215,235,171,162,244, 4, 48, 25, 64, 31,148,248,129,216, + 81, 0, 96, 62, 73,146,210,107,215,174,149,155,105,119,254,252,121, 0,248,217,117, 15,200,102,209, 50,153,160,206, 47,196,132, +119,230,252,213, 51, 2, 87, 70, 92,112,224, 48,233, 93,200, 0, 32, 47, 39, 25,111, 76,152, 38,173,170, 67,224,234, 69, 88, 13, + 31,157, 50, 29, 53,123, 29,245,244,244, 44, 25,126, 59,184, 19, 71,191,124, 7, 96,172,224, 40, 35, 96, 53, 0, 86, 29, 88,139, + 1,132, 88, 14, 80, 70,183,132,150,167,167, 39, 60,229,114, 4,170, 84,224, 56, 14, 66,129, 0, 34,145, 16, 44, 5, 16, 12, 81, + 42, 72, 89,247, 2,131,148,118, 42,229,114, 57, 82, 83, 83, 49,121,242,100, 88,173, 86, 12, 25, 50, 4, 22,139, 5, 38,147, 9, + 70,163, 17, 13, 27, 54,132,193, 96,112,139,207, 62, 91,209,211,211, 19, 98,177, 24, 31,124,240, 1, 94,126,249,101,204,155, 55, + 15,177,177,177,104,216,176, 33, 38, 77,154,132,157, 59,119, 34, 50, 50,178, 42, 94,206,177,140,236,247,211, 46,182, 28,135,248, + 0, 84,187,140,156, 57, 9,130, 44, 35,216,236,203,123, 99,123, 85,155,115,209,162, 69, 80,171,213,229, 44, 89,246,255,161,161, +161, 88,183,110, 93, 77, 71,134,236,214,163, 32, 23,251, 6, 56, 91,162, 56,142,107,103,243,157, 50,199,197,197,221,138,139,139, +139, 38, 8,226, 72, 92, 92, 92,116, 69, 22, 45, 87, 60, 46,246,187,253,210, 18, 58,141,141,118,119,220,105,191,209,190,190,190, +130,240,240,112, 82,169, 84,162,168,168, 8, 1, 1, 1,156, 90,173, 30,169, 80, 40, 62,251,238,187,239, 26,233,116, 58,220,190, +125, 27,171, 87,175,254, 25,192,170,202,132,214,177, 0,155,233,216,102,201,114, 92, 31, 56,112, 32, 26, 52,104, 80,198,154, 37, +151,203, 43,173, 60,246,125,118,139,144, 64, 32,192, 11, 47,188, 32, 79, 73, 73, 49,138,197, 98,132,133,133,201,179,179,179,141, + 98,177,184,218, 51, 93,170,114,140,175,202, 1,222,149,240,105,215,174, 93, 25, 11,150,227,175,227,255, 67,135, 14, 85, 57,116, +104,231,108,222,188,121,233,253,242,242,242,178,159, 11, 0,232,215,175, 31, 88,150,133,191,191,191, 91,156,118, 81,107,115,128, +135,201,100, 98,181, 90, 45,121,237,218, 53, 72, 36, 18,120,121,121,149,250,234,200,100,178, 82,107, 38, 15, 87, 13, 2, 11, 11, + 69,193,104, 52, 66,167,211, 1, 0,146,255,220, 87, 86,136,153, 53, 53,230,183, 55,176, 5, 5, 5, 56,113,226, 4,126,248,225, + 7,188,252,242,203, 46, 69,117, 53, 4,151,186,160,160,160,243,140, 25, 51,174, 46, 88,176,160,142,175,175, 47,172, 86, 43, 30, + 62,124,136, 45, 91,182,100, 26, 12,134,206,213,105, 96,192, 1, 20, 69,195,100, 48,163, 88,163,197,103, 95,108,173,176,234, 1, + 64, 65,238, 29, 12, 28, 52, 92,242, 36,203, 41, 51, 51,115,122,231,206,157,191,208,106,181, 69, 6,131, 97, 56,128,101,142,253, +169,252,252,252, 46,131, 6, 13, 90,225,235,235,251, 82,110,110,238, 44, 55, 40,103,166,166,166,206,170, 87,175, 94,153,141,102, +179, 25,245,234,213,123, 33, 55, 55,119,116,215,174, 93,255, 15,128,175,195,110, 47, 0, 39, 1,172,171,168, 46,217,135, 14,117, + 58, 35,148,170, 16,100, 60, 56, 87,101, 66,196, 2, 19, 56,150,173,180, 13,177,119,128, 43, 90,170,152, 25, 87, 46,169,246, 99, +237, 47,236, 87,134,141,197, 43,147, 23, 65, 33, 2, 22,190,209, 9, 13, 85, 0,228,190, 16,119,253, 24,132,202,118,143, 38, 31, +118,139, 60,118,195, 6, 92,183,181,199, 97, 1, 1,152, 49,114, 36, 56, 10,184,156,144,128, 93, 63,253,132,145, 61,122, 64, 33, +147,185,221, 97, 97, 89, 22, 98,177, 24,201,201,201,184,124,249, 50,154, 53,107,134,123,247,238,149, 9, 67,193,113,156,187,249, + 47,205,187, 84, 42,133, 72, 36, 66,118,118, 54,162,163,163, 33, 22,139,177,117,235, 86,156, 59,119, 14, 51,102,204,192,248,241, +227,209,189,123,119, 36, 38, 38,186,197,201,113, 92,185,217,138,206,195,185,213, 45, 35,103, 78,231,247,126, 77,202,221,206,185, + 96,193, 2,151, 19, 42,220,225,116,165, 69, 92,148,221, 53, 71, 49,100,183, 60, 57, 10, 35,231,117, 0, 62,246,109, 51,103,206, +156,229,238,121,142,235,118,139, 88,117,134, 48, 75,133, 86,116,116,116,153,156, 23, 20, 20, 92,189,122,245,106, 11, 15, 15, 15, +220,185,115, 71,162, 84, 42, 91,216, 27,116,146, 36,177,103,207, 30,175,254,253,251,159, 90,182,108, 89, 24,203,178,200,201,201, +193, 71, 31,125,164,163,105,122, 20, 0,186,162, 23,120, 85,150,169,195,135,203, 63,108, 7, 15, 30,116,107, 8,196, 46,164,132, + 66, 33,124,124,124,140, 70,163, 17, 10,133, 2, 62, 62, 62, 70,131,193, 0, 15, 15, 15,251, 88, 49,137,191,102, 42, 84,101,125, +170,202, 49,222,217, 1,190, 74, 36, 36, 36,184,117,156,109,168,213,173, 90,158,154,154, 90, 97, 67,114,238,220, 57,176,182,134, +214, 93, 78, 91, 47,143,179, 11, 63,133, 66, 1, 95, 95, 95, 72,165, 82,200,229,242, 50, 34, 75, 42,149, 86,249,224, 84, 21,144, + 84, 38,147,253,226,225,225,161,178,239, 23,137, 68,208,106,181, 69, 5, 5, 5,237,159,233,161, 67,112,160,173, 52,140, 70, 19, +116, 90, 99,173,243, 91, 44, 22, 72,165, 82,236,220,185, 19,157, 58,117, 66,135, 14, 29,202,137,172, 26,154,231,211, 11, 10, 10, +186,175, 90,181,234,231,229,203,151,251,232,116, 58,252,247,191,255, 45,214,233,116,221, 1,164, 87, 75,108,178, 28, 40,171, 21, + 6,147, 25,122, 93,201, 61,184,127,107,223,255, 90, 81,237,204,206,206,222, 89,201,254,251, 52, 77, 71,219,227,190,185,129,127, +213,171, 87, 15,217,217,217,101, 54,166,165,165,129, 97, 24, 51, 74,226,100,189,233,104, 72,198, 95,209,179, 43,234,197,151, 88, + 71,141,102,232,116, 37, 86, 16,147, 62,175,118,234,169, 77,108, 84,228,147, 85,147, 58, 68, 16, 68,169,211,247,212,169, 83,113, +243,198, 13,244,170,163, 65,195, 96, 47,112,154, 12,136,123,126,138, 63,212,114, 44, 91,113,172,218,220,187, 29, 92, 32,150,237, +222,237,114,223,253,193,131,171,149,247,164,164, 36,200,229,114, 48, 12, 83,238,125, 83,221,252, 59, 10,152, 21, 43, 86, 96,198, +140, 25,216,186,117, 43,110,222,188,137,214,173, 91,163,119,239,222,200,205,205,197,141, 27, 55, 96, 54,155,221, 78,167,163,223, + 92, 82, 74, 2, 78, 95, 62,142,180,244, 7,200,204,126, 84,227,114,119,228,116, 22, 90,251, 79,255,142, 97, 81,109,107,196,249, +217,103,159, 33, 55, 55,183,140, 37,203,177, 93,170,200,162,229,172, 69,156,144,231,228, 11,101, 95,183, 56,137, 30,231,117,231, +227, 1, 32, 23,128,160,138,243,156,215,243,226,226,226,206,218, 45, 97, 54, 94, 65, 85,254, 89,101, 44, 90, 78, 88, 52,120,240, +224, 65,171, 87,175, 14,144,201,100,165, 51,144,102,206,156,137, 25, 51,102, 32, 34, 34, 2,254,254,254,161, 42,149, 10,249,249, +249, 88,188,120, 49, 82, 83, 83, 39,194, 69,160, 61,103,161,213, 37, 69, 11,137,228,175, 14,171,221,178, 5, 0,227,199,143, 47, +103,209,178, 23, 80,101,160, 40, 10,126,126,126, 48, 24, 12, 16, 8, 4, 24, 50,100,136,224,207, 63,255,100,250,246,237,139,161, + 67,135, 10,110,220,184,193, 12, 24, 48, 0, 2,129, 0, 61,123,246,212,236,223,191,255, 67, 0, 95,186, 33,182,106,205, 49,222, + 94,201,220,141,125,228,142,184,172,140,147, 32, 8, 24, 12, 6, 8,133,194, 82, 71,121,119, 56,237, 67,135,142, 15, 32, 73,146, + 80,169, 84,165,141,135,221,162,101, 23, 90, 85,241, 86, 21,144, 84,161, 80, 40,239,220,185,211,200, 62,241, 34, 47, 47, 15, 61, +123,246,188, 91, 80, 80,240,108,155,180, 88,192, 74, 51,208, 25, 77,208, 25, 13,181, 70,107,127, 30, 54,110,220,136,196,196, 68, +152, 76, 38,124,245,213, 87,165,147, 10, 28, 69,214, 99, 8,174,100,185, 92,206,246,235,215, 15, 87,175, 94,133, 84, 42,165, 80, +131,248, 87, 44,199,194, 74,211, 48, 25,141,208, 85, 61,228,246,188,160, 84, 85, 39, 38, 38,194, 98,177, 96,222,188,121,204,175, +191,254,122, 22, 37, 1, 80,237, 22,188,209,221,186,117,155,239,225,225,161, 58,122,244,232,123, 0,182, 86,246,242,166,104,155, +104,175,197,251,232, 56, 34,224,202, 39,171, 38, 97, 86, 28, 95,172, 44,203, 98,226, 91,111,161,119, 29, 13,134,190, 20, 0,125, +214, 93, 40,188, 3, 64,168,234, 99,217,138, 99,184,149,226,182, 43, 38, 7, 0,253,186, 13, 70,171,102,229,195,131,117,238, 85, +210, 39,187,248,227, 47,200,201,203,172,118,222,245,122,125,133,150,171,106, 88,180, 74,159, 57,251,253,107,211,166, 13,154, 52, +105,130,179,103,207,162,109,219,182,184,119,239, 30,238,221,187,135,212,212, 84,220,188,121, 19,133,133,133,213, 46,163,239, 79, +238, 66,161,182, 0, 18,177, 4, 5, 69,121, 72,203,120,128, 32,191,224,199, 46,119, 59,154, 14,248, 12, 0, 80, 39,192,187, 90, + 66,203,145,115,201,146, 37,229,196,251,227,134,236, 33, 8,226,151,202,214,171,123,254,147, 68, 69, 66,235,129, 90,173,238, 48, +114,228,200,153, 0,218,217,182, 21, 3,216,125,234,212,169,193,129,129,129, 61, 58,118,236, 40,148, 72, 36,184,124,249, 50,246, +239,223,191, 21,192,174,202, 46, 36,145, 72,140,245,235,215,151,219, 43,162,253, 65, 84, 42,149,130,197,139, 23, 19,155, 55,111, +174,208,202, 85, 85, 1, 21, 23, 23, 67,175,215,195,219,219, 27, 86,171, 21,253,250,245, 99, 18, 19, 19, 33, 22,139, 49,104,208, + 32, 38, 33, 33,161,180,160, 55,109,218, 20,102, 52, 26,255,253,195, 15, 63,244, 1,208,181, 26,247,202,238, 24,239, 9, 55, 29, +224, 43,234,229,185, 3,119,135,227, 42,226,156, 54,109, 90,141, 56,197, 98, 49,109,143,252, 78,146, 36,172, 86, 43,218,182,109, +139,220,220,220,210,135,198,195,195,163, 84,100,185, 35,180,170, 10, 72, 42, 20, 10, 97,177, 88,208,181,107, 87, 16, 4,129, 53, +107,214, 60, 31,195,145, 44, 75,120,122,250,161, 78,157, 23, 16, 16,104, 2,203,214,238, 87,101, 98, 99, 99,203,136, 41, 87,145, +151,237,247,191, 38,176,115,185, 51, 75,182,178,183,163,125,200, 75,175, 55, 61,115, 69, 24, 24, 24,216, 33, 55, 55,247,160,211, +230, 2, 0,243, 43,233, 88,150, 22,244,163, 71,143,208,183,111, 95, 28, 63,126, 92,112,224,192,129, 94,135, 14, 29, 74,184,123, +247,238,163,182,109,219,214,125,251,237,183,165, 93,187,118, 69, 94, 94, 30, 94,122,233,165,207, 51, 50, 50, 42, 17, 90,182,251, +104, 50, 67,175,175,125,235,168, 43,107,214,227,188, 24,237,117,114,238,220,255, 67,239,144, 34, 12,105,237,141,248, 35,151, 48, +186,141, 28,176, 72,171,205,103, 79,139,111,157, 6,168, 31,217,161,220,126,169,178, 36,150,107,253,200, 14, 32, 31,221,171,118, +222, 29,211,236, 44,170,106, 98,209,115,188,159, 19, 38, 76,192,199, 31,127,140, 62,125,250,224,222,189,123, 56,127,254, 60,238, +221,187,135,105,211,166, 33, 50, 50, 18,173, 91,183,174, 22,231,161,211,123,161,209, 21,131, 36, 72, 20, 20,231,195,100, 54, 34, +118,210,220,199, 46,247,210,151,255,233, 56, 0,192,190, 83,215,107,204, 57,123,246,108,100,103,103,151,177,100, 61,142, 95,214, +179,142,202,162,165, 61, 0, 48,209,121,163,197, 98,241,154, 55,111, 94,148,191,191, 63, 8,130,192,138, 21, 43,224,235,235,219, + 9,192, 45,139,197,146,167,215,235,103, 56,136,144,222,176,197,218,200,201,201,113, 57,111, 95,175,215, 91,163,162,162, 68, 33, + 33, 33,101,102, 27,122,120,120, 84,100,221, 41,229,180,239,163,105, 26,177,177,177, 88,184,112, 33,194,195,195, 49, 96,192, 0, + 68, 71, 71,131, 32, 8,244,235,215, 15, 3, 6,252, 53,148,171, 82,169,196,199,143, 31,239, 70,146,100,130,195, 11,164, 12,167, + 43,216, 29,227, 41,138,114,215, 1,190, 12,167,189,178, 77,155, 54, 13, 11, 23, 46,196,172, 89,149,187,122,108,216,176, 1, 40, +239, 79,245,183,115, 22, 20, 20,148,105,236, 21, 10,197,154,161, 67,135, 10, 31, 61,122, 84, 70, 92, 57, 46, 46, 26,162, 50,156, + 85, 5, 36, 21, 8, 4, 8, 10, 10,194,130, 5, 11,224,231,231,135,224,224, 96, 87,129,252,170, 44,163, 26,224,111,229,100, 56, +246,218,210, 69,255,215,249,191,219, 15,137,164, 18,224,202,249,125,208, 20,150, 29, 78, 50, 91,255,154, 74, 45,105,219, 11,150, +235, 63,186, 85,151,236, 98,250,179,207, 62,195,103,159,125, 86,105,130, 54,110,220,248,216,121,119, 83,108,149,231,100, 57, 66, +225,225, 3,153, 71, 29,180,136,244, 1,203,209,255, 83,101, 84, 1,126,253,229,151, 95, 6,249,249,249, 33, 61, 61, 61, 64, 36, + 18, 13, 42, 99,174, 50, 26, 81,191,126,253, 23,212,106,245,191,171,226,156, 54,109,154,121,206,156, 57,210, 81,163, 70, 97,232, +208,161, 24, 53,106,148, 84, 44, 22, 55,230, 56, 14, 86,171, 21,233,233,233,248,241,199, 31,161, 86,171,111, 87,150, 78,150,227, + 8,185, 66, 5,153, 71, 8, 90,188,168, 2,203,210,181,146,119, 71,171,184,163, 53,171,154, 34,203,101,253, 4,128, 95,127, 60, +136,185, 31,188,136,173, 71,127,198,234, 95,128, 86,170, 92,180, 8, 80,131, 85,223,198, 71,163, 95,198,178, 29,191, 1, 0,206, +159,171,178,140,184,202,234,160,201,104,125,172,188, 59, 90,174, 28,175,227,134,143, 86, 57, 78,123, 39, 81,171,213,162,168,168, + 8,241,241,241,120,227,141, 55,144,155,155,139,212,212, 84,220,189,123, 23,223,125,247, 29, 20, 10, 69,141,202,232,195,183,102, + 99,206,178,233,224,192,161,105,163, 22,152, 57,249, 51,180,107,213,241,177,203,221, 25,110, 88,179, 42,228, 92,185,114,101, 77, +235,210, 63, 78,104,185,132,191,191,255,168,110,221,186,193,100, 50, 33, 32, 32, 0,169,169,169, 32, 73, 50, 2, 40, 25,194, 11, + 13, 13,221,173, 86,171, 35,220,229, 19, 8, 4,160,105,186,212,247,199,190, 0,192,192,129, 3,113,248,240,225, 42,123, 20,193, +193,193,168, 91,183, 46,222,127,255,253,114,179, 28, 28,103, 58,200,229,114, 28, 61,122, 52,187,160,160,160,128,227,184,106, 77, +115,179, 59,198, 95,188,120,209,109, 7,120, 71, 88,173,214, 71,119,239,222, 13,217,184,113,163,160,146,151, 95, 41,206,159, 63, + 79,163,138,161,154,191,131,211, 85,207,148,227,184, 10, 69,150, 59, 97, 4,170, 10, 72, 42, 20, 10,145,148,148,132,185,115,231, +130, 32, 8,236,219,183,239,185,120,184,254,188,147,191,153, 36, 73,159,129,175,116,110, 9,130,128,213, 82,126,164,218,179, 80, + 87, 42,178,134,126,185, 11, 7, 62, 28,233,142,232, 73,190,112,225,130,239,198,141, 27,133,238,148,251,133, 11, 23,104,142,227, +170, 61,236,103,127,225, 88,173, 86, 24,141, 53,179,162,112, 28,119, 57,238,139, 57, 81,219,190, 61, 38, 34, 8, 11,174,156,219, +135,226, 34,215,238, 12, 18,145, 16,155,227,247,211, 98,145,224,209, 83, 46,186,181, 67,134, 12, 25,245,213, 87, 95,181,112,181, +211,141, 73, 48,169, 38,147, 9, 25, 25, 25, 48, 24, 12,123, 63,249,228, 19,235,177, 99,199,222,124,245,213, 87,209,186,117,107, +132,132,132, 32, 43, 43, 11,201,201,201,136,143,143,231, 46, 93,186,180, 23,192,148, 42,238,227,193, 69, 95,204,137,137,223,113, + 76, 66, 18, 86, 92, 57,191, 15,197, 78,162,189,188,117, 90,132,111,182,238,183,138,197,162, 59, 85, 89,139, 28,173, 89,181,249, + 98, 28, 52,102, 50,134,174, 90,141,136,118,125,177,104,113,111,124,243,197,112, 44,239, 39,134,117,207,104,180,122,109, 27,118, +206,235, 15, 0,168,243,141,155,214, 18,161, 24, 15, 93, 88,172,138,138,101, 54,113, 83, 61,171,169, 61,239,149, 89,174,170,107, +209, 34, 73, 18, 13, 26, 52, 64, 68, 68, 4, 58,117,234,132,182,109,219,162, 71,143, 30,184,113,227, 6,110,220,184,129,105,211, +166, 85, 38,178,170, 44,163,238,255,142,194,207, 93,238, 60,118,217, 56,151,123,109,192,157,186, 52,121,242,100, 0,248, 71, 89, +183,170, 45,180, 52, 26,205, 13,150,101, 91,122,123,123,219, 45, 82,165,251,210,210,210,192,178,172,161,186, 5, 99,177, 88,236, +193, 49,203,196,101,178, 59,199, 87,246,224,115, 28,199, 20, 20, 20,160, 91,183,110,232,210,165, 75,233,240,137,227,226, 32, 76, +112,224,192, 1,112, 28, 87,109, 39,107, 7,199,120, 29,170,233, 0, 15, 0,185,185,185,125,187,118,237,122, 74, 40, 20,186,245, + 21, 77,150,101, 83,115,114,114, 94,121,210,156,174,202,135,101,217, 10, 69,150, 59, 13, 81, 85, 1, 73,133, 66, 33, 60, 60, 60, +240,253,247,223,195,223,223,255,185,122,192,110, 36,170,151, 84,182,191,155,159,228, 28,128,128,161, 95,238,122,120, 46,223, 90, +111,232,151,187,210, 14,124, 56, 50,188,178,115,178,179,179,251,140, 28, 57,242,184,187,229, 78,211,244,131,236,236,236,106,135, + 75,224, 56, 14,119,238,220, 97, 39, 76,152,144,167, 86,171,135,215, 36,255, 51,231,174, 94,190,240,243,169,126,253,162, 58,180, + 3, 9, 88, 42,118,254,229, 8,128, 19,138, 4,143,102,204, 90,249,214,240,225,195,159,102,177,105,178,179,179, 59, 13, 27, 54, +108, 10,254,114,157, 40, 35,164, 80,193,236,106, 27, 86,213,173, 91,247, 69,129, 64, 32, 5, 48, 23, 64,218,165, 75,151,214, 94, +186,116,169, 15,128,127, 9, 4,130, 16,134, 97, 50,108,157,158, 93, 0,254,168,186, 30,229,190, 13,142, 13,235,215,251, 95,125, + 65, 16,156,197, 98,174,162,131, 4, 14, 28,199,137,197,162, 59,191,222,200,106, 85, 89, 71,202,225, 11, 28,181, 62,100, 63,101, +202, 20, 76,153, 50,165,180, 62,173, 89,211, 5,123,255,188,136,215, 90,165,195,252,117,103, 16,202,112,183, 59,124, 0, 48,251, +255, 38,212, 90,218, 28,243,238,104,209,114,245, 28, 84,199, 71, 75, 32, 16, 32, 47, 47, 15, 73, 73, 73,200,201,201,129,193, 96, + 64, 98, 98, 34,172, 86, 43, 10, 11, 11,241,226,139, 47,214, 56,157,181, 85, 70, 79,147,243,159, 56,124, 88,109,161,101,181, 90, + 63,109,208,160,129, 72, 38,147,181, 96, 24, 6, 28,199,129, 97, 24,206, 38,106,170, 61, 11, 79, 36, 18,153,154, 52,105, 66,184, +154,157, 96,255,239,225,225, 97,172,196, 90, 18, 87,191,126,253, 79, 8,130, 16, 84,212, 11,177,255,103, 89,150, 17, 10,133,113, + 53,188, 87,143,235, 24,175, 87,171,213, 29,107,185,252,254, 14, 78,231,242,209, 55,107,214,172,244,139,246,206, 49, 81,108, 31, + 91,213, 87, 33,206, 43, 13, 72,170,215,235,179,250,246,237,203, 56,238,119, 12,104,250, 92,131,224,210,250,143,122,179,222,185, +124,107, 61, 0,176,139, 45,112, 92, 90, 37,103, 25,179,179,179,187,253,221, 73, 75, 73, 73,177,252,235, 95,255,250, 86,171,213, + 78, 6, 80, 99,111,254, 89,159,174,153,245, 12,150,140, 6,192,194, 26,158,155,150,159,159,223,211,105,219, 31,118, 65,101,143, +107, 87,109,209,126, 59,175,214, 99,139,209, 52,157, 30, 17, 17, 81, 45,203, 13, 69, 81,233, 85,237,119,142, 17,230,136, 91,240, +198,172,171, 64,201,228,239,124,183, 56, 77, 38, 83, 65,199,142, 29, 69,213,204, 91,174,187,121, 15, 9, 9, 65,157, 58,117, 74, +127,237,112,222, 94, 85, 58,105,154, 78, 15, 11, 11,131,191,191,127,133, 17,223,157,125,178,220,225,172,237, 50,170,140,179, 78, +157,109,181,206, 89,211,116,242,112, 15,189,121, 78,158,147,231,124,102, 57, 5,252,253,228, 57,121, 78,158,243, 9,114, 62,151, +224,189,212,120,240,224, 81, 17, 24,254, 22,240,224,193,131,199,227,129,168, 68,149, 86,103,166, 79, 77,148,237,105,158,147,231, +228, 57,121, 78,158,147,231,228, 57,255,113,156, 85,113,215,246, 76,227,231, 26,188, 89,149,231,228, 57,121, 78,158,147,231,228, + 57,121,206,127, 44,248,161, 67, 30, 60,120,240,224,193,131, 7, 15, 94,104,241,224,193,131, 7, 15, 30, 60,120,240, 66,139, 7, + 15, 30, 60,120,240,224,193,131, 7, 47,180,120,240,224,193,131, 7, 15, 30, 60,120,161,197,131, 7, 15, 30, 60,120,240,224,193, +131, 7, 15, 30, 60,120,240,224,193,131, 71, 9, 8, 0, 56,114,228, 72,233, 7, 1,163,163,163, 9,254,182,240,224,193,131, 7, + 15, 30, 60,158, 36,158,107, 45,226,152, 57, 30, 60,120,240,224,193,131, 7, 15, 94,139,212, 14, 72, 94,108,241,224,193,131, 7, + 15, 30, 60,120,177,197,103,140, 7, 15, 30, 60,120,240,224,193,139,172,103, 10,101, 44, 90,188,224,226,193,131, 7, 15, 30, 60, +120, 60, 77,177,245,140,106, 17,206,182, 56,174,243,224,193,131, 7, 15, 30, 60,120,240,120, 76,129, 85,217, 47, 15, 30, 60,120, +240,224,193,131, 7,143, 90, 18, 92,246,255, 79, 76,104,241, 95, 54,231, 57,121, 78,158,147,231,228, 57,121, 78,158,243, 31, 11, + 33,127, 11,120,240,224,193,131, 7, 15, 30, 60, 30, 27,142, 86, 44,130, 23, 90, 60,120,240,224,193,131, 7, 15, 30,181, 39,178, + 8, 87,235,252,183, 14,121,240,224,193,131, 7, 15, 30, 60,254, 38,240, 22, 45, 30, 60,120,240,224,193,131, 7,143,199, 3, 1, +126,232,144, 7, 15, 30, 60,120,240,224,193,227,111, 21, 91, 46, 55, 86, 52,115,224,116, 53,200,107, 50,251,224, 52,207,201,115, +242,156, 60, 39,207,201,115,242,156,255, 56,206,170,184, 79,227,217, 67, 55, 0,103, 1,116,183,253, 86, 40,188,106, 27,252,212, + 87,158,147,231,228, 57,121, 78,158,147,231,228, 57,159,119, 84, 24,168,148,119,134,231, 81, 21,132,168,124,136,185,170,253, 60, +120,240,224,193,131,199, 63, 77,108, 17,225, 72,218, 0, 0, 32, 0, 73, 68, 65, 84,113,142, 47, 73, 87,104, 12, 96, 22, 0,111, +135,109,191, 0,136,115, 58,110, 7, 0,133,195,186, 30,192, 60, 0,247,170, 76, 13,199,137,109,252, 82,219,194, 2, 48, 1, 48, + 3,208, 18, 4, 65,241,101,246,212,209, 17, 64,180,237,255, 17, 0, 87,170,185,255,185, 66, 72, 72,136,220,199,199,167,207,245, +235,215, 37,137,137,137,184,112,225, 2,183,121,243,102,107, 97, 97,225,201,172,172, 44, 35, 95, 93,158, 11,244, 5, 48,211,246, +127, 17,128, 19,143,201, 71, 40, 20,138,105, 30, 30, 30,253,165, 82,105, 29,154,166, 9,131,193,144,169,215,235, 79,209, 52,253, +165,173,221,171, 46, 6,251,250,250,190,217,180,105,211,198,169,169,169, 25,153,153,153, 59, 0,236, 1, 48,188, 78,157, 58,163, +235,215,175, 31,122,231,206,157,123, 5, 5, 5,223, 0, 56,248, 20,211,201,131,199, 63, 9, 68,101,214, 8, 87,152,203,113,220, +232, 50, 12, 68,121,142,158, 61,123, 14, 58,121,242,164,130,101, 89,216, 23,185, 92, 78, 3, 24, 87,133,200,242,187,124,249,114, +189,201,147, 39, 15,205,204,204,124, 89,171,213,182, 7, 0,133, 66,241,115, 96, 96,224,175,171, 86,173,250,142,227,184,116,130, + 32,180,213,204,168, 80, 36, 18,189,225,227,227,211,159,166,233,182, 28,199, 65, 36, 18, 93, 47, 44, 44, 60, 65, 81,212, 55, 0, +106, 34,222, 36, 66,161,112,138, 84, 42,237, 75,211,116, 75, 0, 16, 10,133, 55,205,102,243, 9,154,166,215, 2,176,212,128, 83, + 38,145, 72,166, 40,149,202, 40,139,197,210, 18, 0, 36, 18,201, 77,141, 70,115,202, 98,177,172,181, 9,206,167, 13, 33,128,104, +142,227, 68, 0, 32, 16, 8, 6,183,111,223,190, 30, 65, 16, 44, 65, 16, 28,199,113,196,207, 63,255,220,134, 97, 24,210, 86, 63, +162, 1,252, 10,128,126, 22,159, 16,127,127,255,133, 44,203,214,169,180,208,100,178,151,175, 95,191,222,116,247,238,221,204,215, + 95,127, 93, 52,126,252,120,207,201,147, 39, 11,215,172, 89,179, 54, 43, 43,235, 61,231,227,253,252,252,150,147, 36,233,239,206, +245, 89,150,205,203,207,207,159,254,180,242, 31, 19, 99, 42, 99,238,142,143,151, 53, 2,144, 94,195,250,253,247,113,154, 98, 56, + 0,136,151,197, 55,138, 49,197, 36,219,255, 63, 46,175, 3,102,174, 59,173,237,202,113,192,148, 40, 47,242,113,133, 86,104,104, +104,124, 76, 76,204,168,150, 45, 91, 10, 57,142, 3, 69, 81, 48,155,205, 77,175, 92,185,210,125,223,190,125, 47,107,181,218,225, +213,164,124,235,227,143, 63, 94, 48,127,254,124,127,145, 72, 68, 80, 20,213,104,247,238,221,109,223,126,251,237,247, 55,110,220, + 88,119,196,136, 17, 94,246,237,115,231,206,109,183,104,209,162,134, 0,190,124, 10,233,228,193,227,159,134,110, 40,235,163,245, + 57,128,207, 42, 19, 90, 30,182,151,103,142,205,146, 5,135,223, 82,156, 57,115,230,144, 80, 40,180, 91,180,218,235,245,250, 32, + 39, 43,152, 43,145, 85,127,204,152, 49, 29,247,238,221,187,112,196,136, 17,217, 10,133,162,201,171,175,190,170, 37, 8, 66,176, +123,247,238, 54, 17, 17, 17,242,129, 3, 7,142,233,217,179,231,135, 28,199, 93, 32, 8, 66,237,102, 38, 91,248,250,250,238, 95, +178,100, 73,189,190,125,251,138,253,253,253,193,113, 28, 50, 51, 51, 67,143, 30, 61,218,239,243,207, 63,255,176,160,160, 96, 8, +128,132,106,220,184,118,114,185,124,239,231,159,127, 30,210,175, 95, 63, 97,112,112, 48, 76, 38, 19, 18, 19, 19,123,159, 56,113, +162,235,198,141, 27,223, 51, 26,141,175,217, 4,134,187,104,239,237,237,189,239,191, 31,127, 28,212,225,141, 55,132,190,190,190, +224, 56, 14,106,181,186,247,197,109,219,186, 79, 90,178,228,189,226,226,226, 97,174,238,247,211,132, 68, 34, 33,183,111,223,222, + 90, 34,145, 0, 0, 44, 22, 11, 34, 35, 35,137,231,229, 9, 33, 8, 34, 44, 51, 51,211, 91, 44, 22,187,220,207, 48, 12,186,118, +237,218, 64, 44, 22,227,203, 47,191,164,242,242,242,218,124,245,213, 87,215,119,238,220,233,191,118,237,218,215, 0,148, 19, 90, + 36, 73,250,167,167,167,187,228,100, 24, 6, 86,171, 21, 52, 77,195, 98,177,160,121,243,230, 79, 53,255,241,241,178, 48, 0,211, + 99, 98, 76, 31,216, 54,125, 9,224, 67, 0, 41,168,225, 55,187,254, 6, 78,199,250,182,220,225,255, 99,167,213, 1,245, 0,224, +216, 13, 19, 0,248, 62,238,125,245,240,240,104,246,250,235,175, 11,213,106, 53, 68, 34, 17,172, 86, 43,178,179,179, 17, 25, 25, + 41,248,246,219,111, 95,168, 46, 95,163, 70,141,198, 47, 90,180, 40,224,216,177, 99,214,237,219,183, 91,162,162,162, 68,227,199, +143, 87,118,237,218,181,121, 88, 88, 24,185,101,203, 22,243,169, 83,167,168, 49, 99,198, 72,226,226,226, 2,142, 30, 61, 58, 48, + 33, 33,225,203, 39,157, 78, 30, 60,254,129, 56,139,191, 66, 60,216,127, 43, 21, 90,112, 16, 87,131, 1, 64, 36, 18,181, 9, 10, + 10,138,167,105, 58,216,102,213,201,206,201,201,249,146,162,168,223,109,199, 30,100, 89,118, 80, 85,150,172, 49, 99,198,116, 60, +126,252,248,178, 43, 87,174, 20,231,231,231, 7, 31, 58,116,200,244,225,135, 31,166, 2, 64, 74, 74, 74,195,129, 3, 7,134, 78, +157, 58, 53,189, 79,159, 62,171,122,244,232,241, 46,199,113,167, 8,130,208, 87, 37,178, 34, 35, 35, 47,159, 63,127,222, 75,165, + 82,149,217, 81,191,126,125,188,251,238,187,226, 65,131, 6, 69,244,234,213,235, 82,114,114,114, 23, 0,127,186, 35,136, 26, 55, +110,124,250,204,153, 51,158, 62, 62, 62, 40, 42, 42, 66,118,118, 54, 12, 6, 3,148, 74, 37, 70,140, 24, 33,238,214,185, 83,221, +169,211,222, 59,157,158,145,209,219, 77,177,213,190, 83,139, 22,167,119,198,197,121, 82, 15, 31, 66, 46,151, 67,167,211, 1, 0, +188,188,188,240,114,131, 6,194,223,182,109, 11, 29, 29, 27,123,250,215,164,164,222, 79, 73,108, 73,109,191,102, 0, 71, 4, 2, +193, 96,137, 68, 66, 14, 30, 60, 24,167, 79,159, 38, 76, 38,147,208,102,221,161, 7, 15, 30, 12,185, 92, 14,139,197,194,162,100, +232,144,126,150,159, 18,137, 68,130,228,228,228, 50,219,180, 90, 45,212,106, 53,242,243,243, 97, 54,155, 81, 84, 84, 4,150,101, + 9,185, 92,174,102, 89, 22, 36, 73, 58, 11,128, 50, 16,139,197, 72, 74, 74, 42,179,141,166,105,232,245,122,152,205,102, 88,173, + 86,104,181, 90,185,151,151, 87, 99,127,127,255,116, 0, 7, 11, 10, 10,190,204,201,201, 73,123,194,217,207,179, 11,162,248,120, +217,125, 0,146,255, 69, 78, 7, 75, 86,168,109,253,143, 90, 74,171, 29, 15,143,252,110, 10,183, 89,199, 30,212, 2, 31, 11, 0, + 23, 46, 92, 64, 78, 78, 14,242,242,242,160, 86,171, 17, 22, 22, 6,142,227,170, 61, 28,151,156,156,188,238,197, 23, 95, 36,110, +221,186,117, 2,192,154,221,187,119,143, 43, 40, 40,152, 57, 99,198, 12,223,165, 75,151, 22,196,198,198, 46, 2,176,117,247,238, +221,239, 52,107,214,172,255,237,219,183, 55, 62,141,116,242,224, 81,219,224, 56,174, 29,128, 0,123,219, 98,107,119,253, 28,214, +111, 16, 4, 97,113, 56,206, 98,107, 27,156,127,237,176,175,171, 9,130,248,213,225, 60, 53, 65, 16,191,214, 52,153, 78,191, 37, +157,110, 0, 56,114,228, 8,103, 95, 92,157, 25, 24, 24, 56,173,103,207,158,203,174, 93,187,214, 60, 43, 43,203, 39, 43, 43,203, +231,218,181,107,205,123,246,236,185, 44, 48, 48,112,154,195,141,112, 62,245,180,195, 62,241,229,203,151,235,237,223,191,127,209, +233,211,167,139,219,180,105, 99, 57,115,230, 12,221,167, 79,159, 92,219, 11,154,238,211,167, 79,238, 79, 63,253,196,116,232,208, + 65,126,252,248,241, 71,151, 46, 93, 90,190,119,239,222, 32,142,227, 4,174, 56,109, 16,169, 84,170,239,207,157, 59, 87, 78,100, + 57,162,110,221,186, 56,114,228,136, 82,165, 82, 29, 4, 32,174, 40,157, 54,200,100, 50,217,190,159,126,250,201,211,203,203, 11, +185,185,185, 16,137, 68, 8, 12, 12, 68,113,113, 49,178,179,178,144,118,247, 46, 72,139, 5, 43,190,152,239, 37,151,203,247,186, +104,236,203,113,122,123,123,239,219,185,112,161,103,254,233,211,248, 99,193, 2, 88,173,214,210, 33, 87,171,213,138, 75,147, 39, + 67,253,227,143,216, 50,119,174,167,183,183,247, 62, 0,178, 42, 56,107, 3,142,156,147, 1, 20,216,150,201, 0,174, 68, 70, 70, + 94, 75, 76, 76, 68,151, 46, 93,176,103,207,158, 86, 51,102,204,152, 60, 99,198,140,201,123,246,236,105,213,165, 75, 23, 36, 38, + 38, 34, 50, 50,242, 26,202,250,103,253,221,233,252,219, 56, 25,134, 41,179,176,236, 95,239,152, 58,117,234,228,238,223,191, 31, + 35, 70,140, 32, 37, 18, 73,214,200,145, 35,165, 23, 47, 94,228,108, 34,211,237,116,154, 76, 38, 24,141, 70,232,245,122,164,164, +164,200,151, 44, 89,210,249,179,207, 62,107,116,250,244,233,208, 89,179,102, 77, 10, 8, 8,184, 30, 20, 20, 84,239, 9,231,221, +234,244,127, 5,128,140,106, 90,136,254,110, 78,206,118, 62, 98, 76, 49,173, 29, 26,216,234,242, 86,118, 63,179,109,105,213, 3, + 72,123,156,186,212,179,103,207, 23, 27, 53,106, 20,180,251,150, 15, 10,197, 77,193,138, 85, 96,197, 42, 48,126,237,144, 44,121, + 5,225,225,225, 65,158,158,158, 29,171,153,206,237,183,110,221,250,151,173,167,156, 15, 96, 89,108,108,236,231, 4, 65, 92,136, +141,141,157, 15, 96,153,109,251,130,219,183,111,119, 0,176,243, 41,165,243,153,120,222,121,206,255, 45,206, 42,180, 72, 0, 65, + 16, 71, 8,130, 56,242,201, 39,159,244, 0,224,231,180,254,111,199,227, 0, 72, 92,253,218, 23,135,237, 1, 28,199, 13,112, 56, + 47,160,134,201, 39, 92, 44,127, 9, 45, 0,136,142,142, 38,162,163,163,237, 59,126, 33, 8,226, 16,128, 95, 68, 34, 81,155,214, +173, 91, 15,254,225,135, 31,188, 2, 2,254,186,126, 64, 64, 0,246,238,221,235,213,162, 69,139,193, 34,145,168, 13,128, 95,148, + 74,229,161, 74,172, 48,170,201,147, 39, 15, 29, 59,118,172,166, 77,155, 54, 0, 80,148,144,144,160,232,208,161,131,158,166,105, +130,166,105,162, 67,135, 14,250,132,132, 4, 5, 69, 81,218,118,237,218,121,244,234,213, 43,117,250,244,233, 99, 92, 8, 14, 71, +188,190,120,241,226, 48, 31, 31,159,202,148, 48,180, 90, 45,130,130,130, 48,121,242,228, 96,145, 72,244,102,101,119, 75, 40, 20, + 78, 89,188,120,113,160, 74,165, 66, 97, 97, 33,194,194,194, 96,177, 88,144,148,148, 4,147, 94, 7, 74,171, 1,165, 41,130,250, +254, 61,168, 68, 66,140, 25, 20, 29, 36, 20, 10,167, 84, 97, 45,153,242, 77,108,108,144, 37, 53, 21, 41,123,246,128,161,203, 27, +127,104,171, 21, 55, 55,109,130, 41, 61, 29,139, 38, 76, 8,146, 72, 36, 83,158,176, 37,107, 41,199,113,114,142,227,228, 4, 65, +172,234,216,177,227,183,114,185,124,114, 92, 92, 92,223,147, 39, 79,246, 59,127,254,124,119,154,166, 69, 52, 77,139, 46, 92,184, +208,197,100, 50, 9,165, 82, 41,132, 66, 33,135,231, 20, 34,145, 8, 98,177, 24,114,185, 28,157, 59,119,190,191,121,243,102, 42, + 44, 44, 76,180,111,223, 62,159, 58,117,234,120,172, 89,179,166, 72,171,213, 46,118,151,207,106,181,194,108, 54,195,104, 52,194, +100, 50,225,204,153, 51, 13,166, 78,157, 42, 52,153, 76,204,192,129, 3, 11, 40,138, 50,199,198,198, 42,125,125,125, 63,124,146, +249,140,137, 49,177, 54,203,211,109,155,104,121,128,199,244,121,250, 59, 56, 1, 88,108, 62, 89,118,248,219,184, 45,181,116, 43, +104, 0, 58,155,208, 50, 59, 61, 31, 45, 29, 44,190, 85,162,168,168,104,227, 55,223,124, 19, 70, 74, 85,184,104,233,143,239,216, +207,113,210,123, 13,114,235,125,132,192,176, 70, 24, 53,106, 84, 32,199,113,107,106, 33,205, 95, 1,232, 10, 96, 85, 77, 78,126, + 2,233,172,231,225,225,177,199,203,203,235,162,135,135,199, 30,216,134,103, 31, 7, 81,141,208,123, 80, 51, 50, 61, 42, 2,220, +160,102,100,122, 84, 35, 62,212,192,243, 2, 39, 45,226, 8, 53,199,113,209, 28,199, 69, 47, 90,180,104,161,195,251,221,190, 46, +119,211, 50, 22,205,113, 92,116, 25,133, 84, 34,176, 30,219,232,230, 98, 41,209, 20,142, 74,210, 33,115,165,179, 11,131,130,130, +226,227,227,227,189,156, 25,179,178,178,160,209,104, 48,103,206, 28,175,177, 99,199,190,151,158,158, 30, 83, 69, 34, 36,217,217, +217,109, 71,143, 30, 45,179, 90,173,133, 44,203,146, 26,141, 70,232,237,237,205,216, 15,240,246,246,102,138,139,139, 69,122,189, + 94,192, 48,140,121,236,216,177,146, 9, 19, 38,188, 12, 64, 80, 17,105, 64, 64, 64, 84,255,254,253, 43, 28, 58,160, 40, 10,122, +189, 30,122,189, 30, 86,171, 21,157, 59,119,150,110,222,188,185, 79,110,110,238,250, 10, 21,135, 84, 26, 21, 21, 21, 37, 42, 40, + 40,128,183,183, 55,210,210,210,240,224,193, 3,152,117, 58, 88,117, 26, 88,117, 90,208, 90, 13, 56, 77, 49,242,239,221, 65,135, +102, 77,197, 59,164,210,190,122,189,126,121, 69,156, 74,165, 50,170,195,184,113, 66, 15, 15, 15,116, 31, 93, 50,207,224,120,179, +102,224, 24, 6, 44,195,128,161,105,244, 77, 74, 2, 69, 81, 32, 73, 18,237, 10, 10,132,202,109,219,162,212,106,245,178,167, 81, +217,165, 82,169,112,251,246,237,175, 75, 36, 18,112, 28, 71, 88, 44, 22,156, 60,121,242, 31,247,208, 75, 36, 18,200,100, 50, 88, +173, 86,212,175, 95,223, 56,122,244,232,203, 95,124,241, 69, 56, 73,146, 30, 98,177,248,135,252,252,252,133, 89, 89, 89, 41,238, +242, 81, 20, 5,139,197, 2,139,197, 2,163,209,136,251,247,239, 7, 55,104,208,128,152, 60,121, 50, 99, 48, 24, 26,174, 94,189, + 58,249,228,201,147,138,197,139, 23,191, 10,224,221, 39,157,223,152, 24, 83, 51, 0,205,226,227,101, 98,155,229,215,242, 63,198, +201,161,196,241, 29,241,178,248, 68, 0,234, 90, 20, 89, 18, 0,222,225,126, 66,189, 72, 0, 29, 0, 47,155, 40,120,149, 32,136, + 14,205,155, 55,247, 73, 76, 76, 44,228, 56,238, 42,128,239, 0,100, 85, 70,198,178, 44,193,178, 44,222,110, 95,132,201, 29, 5, +160,168, 98, 20, 23, 23, 35, 45, 45, 13, 9, 9, 9,248,249,231,132,154, 62,155,111,122,122,122,246,145,201,100,245,105,154, 38, +117, 58, 93,154,193, 96, 56,205,178,236, 70,212,192, 71,237,239, 74,167, 29, 30, 30, 30, 75,102,205,154,213,201,219,219, 27,191, +255,254,123,195, 93,187,118, 45,209,235,245,143,229, 92, 47, 19,145, 91,150,175, 92, 19, 26, 26,168,194,141,243,135, 67, 23,110, +216,189, 5, 96,195,120,153,242,236,195, 73,139, 56,138,161, 95, 57,142, 27, 64, 16,196, 17,103,161, 84, 45,179,211, 99,158, 95, +133, 69,203,249,195,210,101,133, 86, 5, 10, 18, 52, 77, 7, 59, 90,178, 56,142, 67, 86, 86, 22, 50, 50, 50,160, 86,171,225,227, +227, 3,171,213, 26,236, 78,251,160,213,106,219,251,249,249, 25, 68, 34,145,217,104, 52, 66,161, 80,176, 34,145,136,179, 93,135, +176,205, 90,100,204,102, 51, 33, 20, 10, 41, 47, 47, 47, 79,179,217,220, 20,149,248,146,113, 28,215,222,207,207,207,229, 62,179, +217, 12,157, 78, 7,189, 94, 15,157, 78, 7,179,217,140,160,160, 32,208, 52,221,182,210, 46, 45, 77,183, 12, 8, 8, 64,102,102, + 38,228,114, 57,210,211,211, 97,209,105, 97,213,106, 65,235, 53, 96,138,139,193,106, 52, 96,245, 26, 80, 22, 3, 66,155, 52,131, +125, 70, 98,133,221,112,139,165,165,159,159, 31,244,250,191,220,205, 56,155,192,162,105, 26,180,205, 57,218, 62,156,232,239,239, + 15,251,140,196, 39, 4, 51,128, 25, 36, 73,174,146, 74,165,194, 73,147, 38, 33, 43, 43,171, 76,157,152, 52,105, 82,169, 79, 86, +215,174, 93, 47,200,100, 50, 90,173, 86,195,108, 54,139,158,215,135,158, 32, 8, 16, 4, 81, 82, 70, 52, 13,127,127,127,125, 94, + 94,222,207, 69, 69, 69,175,215,132,143,162, 40,251,140, 46, 24,141, 70,112, 28,135,223,127,255, 29, 50,153, 76,196, 48,204, 45, +154,166, 21, 34,145, 8,164,205,249,235, 73,193, 54, 35,240, 75, 0, 97, 54, 11,209,155, 40,113, 56,207,112,209,144,184,117,235, +220,228,172,190,112, 51,197,216, 45, 77, 25,168,217,112,164, 43,116,111,170,146, 44,143,235, 16,168,106, 61,208, 67,175,144, 8, +244,108, 90,235,250,255, 93,154,176,107,236,152, 55,189,230,205,155, 87,207,223,223, 95,150,156,156,108,154, 63,127,126,131,237, +219,183, 19, 40, 25,166,171, 16, 15, 31, 62, 60, 48,107,214, 44,223,254,253,251, 55,148, 74,165, 68,113,113, 49,212,106, 53,114, +114,114,240,224,193, 3,238,198,141, 27,247,205,102,243,158,234, 36, 50, 36, 36,100,243,235,175,191, 62,246,165,151, 94, 18,217, + 45,164,122,189,190,205,185,115,231, 6, 29, 63,126,188,139, 94,175,175,118,189,124,244,232,209,158,217,179,103,123,188,242,202, + 43, 77,165, 82, 41, 89, 27,233,116, 4, 73,146, 65,158,158,158, 56,125,250, 52, 84, 42, 21, 72,146, 12,122,220,250,106,178,178, +161,117,130,253, 96,186,180, 28, 77, 3,234,193,100,101, 67,121,137,242,252, 88,180, 42,120,215,183,179, 91,164,170, 16, 75,198, +153, 51,103,206, 34, 8,226,200,204,153, 51,103,185,178,104,217,254, 50,142,199, 57, 28,111,174,109,177, 85,173, 64,147, 44,203, + 34, 35, 35, 3,153,153,153,200,200,200, 64,126,126, 62, 72,146, 4,199,113,238,204, 62,227, 8,130, 96, 79,157, 58,229,115,249, +242,101,125,187,118,237,138,236,254, 47, 52, 77, 19, 20, 69, 17, 54,191, 24, 34, 45, 45, 77,124,241,226, 69,213,237,219,183,131, +108,189, 85,182, 10, 83, 96,185,109,118,129,229,184,152, 76, 38,200,100, 50,247, 84,135,237, 69,248,251,181,107, 37, 34, 75,167, +181, 13, 25, 22,131,209, 20,131,211,107, 33, 97, 40, 72,192,129, 48, 25,220,190,127,142,176,139, 44,171, 77,104, 89, 44, 22, 80, + 20, 5,150,101, 65,211, 79,197,175,124, 93,171, 86,173,218, 30, 56,112, 96,124, 70, 70,249,119,225,144, 33, 67,240,238,187,239, + 98,234,212,169,183, 7, 12, 24,112,227,240,225,195,152, 50,101, 10, 88,150,109, 13,160, 24,192,241,231,237,161, 55,155,205,165, + 22, 40,147,201, 4,171,213, 10, 84,227,179, 10,206,117,211, 94,182, 52, 77,219,185,137, 3, 7,246,227,194,133, 11,100, 66,194, +173,176, 73,147, 38,219, 29,238,159,116, 86,211, 81, 50,115, 79, 98,107, 40, 44, 40,241,127,170, 40,164, 66, 4, 42, 31,178,227, + 42,227,124, 28,180,218,208,106,196, 7, 31,124, 16,133,146, 25,206, 41,143,105,209,122, 69, 66, 18, 95, 79,107,233, 43,251,176, +149,159, 94, 34, 36,116, 73, 95,207,210, 61, 8, 87,234,131,234, 42, 44, 97, 13, 84,117, 22, 46,252, 34,228,246,237, 59,230, 57, +115,230, 36,142, 28, 57, 50,240,195, 15, 63,108,190,111,223,190, 46, 38,147,233, 27, 0, 69, 21, 25, 93, 6, 13, 26,116, 53, 48, + 48,176,193,134, 13, 27,114, 31, 61,122,228, 67, 81,148,135,213,106,101,245,122,253, 3,163,209,120,218,106,181,158, 6,112,173, + 58,137,245,242,242,106, 53,110,220, 56, 81, 81, 81, 17,132, 66, 33,172, 86, 43,114,115,115,209,169, 83, 39,193,161, 67,135, 90, +212,228, 6, 20, 22, 22, 46,255,230,155,111,206,238,220,185,179,143, 82,169,124, 73, 42,149, 6, 3, 96,180, 90,109,142, 94,175, +255,163, 38,233, 44,211,206, 49, 76,206,181,107,215, 34,148, 74, 37, 30, 62,124, 8,134, 97,114, 30,183, 14,200,196,228,163,155, +231, 15,213,109,230,223, 0, 23, 47, 95,133, 76, 76, 62,226, 67,125, 61,247,176,251, 80,193, 81, 64,185, 16, 72,151,227,226,226, +228,139, 22, 45, 66, 92, 92,220, 45, 87, 22, 45,187,224,138,139,139,187,101, 63,206,225,248,243,143,145,198,138, 45, 90, 21, 41, + 72,160,100,118,161, 90,173,246, 81,169, 84,165, 2, 43, 51, 51, 19,153,153,153,144, 72, 36, 72, 75, 75,131, 68, 34,201,114,167, + 19, 34,151,203,127,107,211,166,205, 11, 41, 41, 41,226,249,243,231,215,189,118,237,154,178, 83,167, 78, 47,202,229,114,134,227, + 56,152, 76, 38, 50, 49, 49,209,115,217,178,101,161,237,219,183,183,180,111,223,254,250,238,221,187,141,168, 36,254, 21, 65, 16, +191,100,101,101, 53,172, 95,191,190, 93,180,149, 17, 87,142,130, 11, 40, 25,242, 20, 10,133,215, 43, 75,168, 80, 40,188,153,148, +148,212, 91, 33,147,194,162,213,192,170,211,128,214,106,193,104,139,193, 20, 23, 3,122, 13, 36, 52, 13, 17, 67, 65, 46,147, 33, + 35, 61, 29, 66,161,240,102,101,156, 18,137,228,102, 78, 78, 78,111,149, 74, 85,250, 18,165,104,186,100, 97, 24, 88,104,186,212, +162, 37, 18,137,240,232,209, 35, 72, 36,146,155, 79,186, 38,147, 36,201,216, 67, 56, 84,144, 15, 4, 5, 5,177, 29, 58,116,192, +148, 41, 83,192, 48,140,173, 24,136,238, 0, 46,162,196,191,229,153,132, 43,113,107,119, 90, 55, 26,141,208,233,116, 40, 44, 44, + 20,202,229,242, 23, 66, 67, 67,175, 90, 44,150, 61, 52, 77,111,121,240,224,129,166, 34, 78,155, 48, 43, 21, 93, 44,203,130,227, + 56, 48, 12, 3,138,162, 32, 22,139,217,115,231,206, 99,217,138, 37,136,223,178,157, 27, 52,104, 16,113,232,208, 33,176, 44,155, +254,132,179,111,177,137,150,202, 26, 13,231,144, 10, 31,161,242,144, 10, 21,113, 58,246,254, 28,183, 17, 46,142, 41,135, 15, 62, +248,224, 4, 74,134, 12,243,108, 98,238,113, 56,191, 44,250,238, 11, 25,104, 70,111, 62,183, 83,247,237, 93,141,126,222,183, 43, +127,179, 72, 4,154,151,187, 5,181,108,216,224, 5,129, 74,229, 67,174,223,184, 42,127,199,246,189,201, 15, 31, 62,212,172, 93, +187,182,227, 11, 47,188,224,253,199, 31,127,132, 86, 36,180, 20, 10, 69,227, 55,223,124,115, 92, 97, 97,161, 56, 62, 62,126,119, + 86, 86,214,111, 40, 9, 45,227, 56,131,122, 0,128,173, 54, 33, 26,100,107,231, 46, 2,152, 95, 89,127,141, 32, 8,252,244,211, + 79,229,102, 7,178,143,167,206, 85,141, 26, 53, 26,145,146,146,114, 33, 39, 39,103,152,243, 78,177, 88, 60,175, 73,147, 38,125, +111,221,186,245, 57,128, 99,213, 33, 54, 24, 12,177,123,247,238, 93, 42, 16, 8,234, 48, 12,147,105, 52, 26, 99, 31,219,162, 69, +177, 19,226,214,239,218,100,180, 48,225,114,137,224,161,137, 98,223,226,117,200,243,107,205,178, 65,237, 96,141, 82, 3, 32,156, +214,255,176,189,140, 44, 28,199,217,143, 85, 59, 88,177, 44, 78, 86, 48, 87,251,212,143, 17, 44,157,171,168,141,171,200,162,245, + 9,128,246, 0,126,201,201,201, 89, 53,118,236,216,101, 59,118,236,240,210,104, 52,200,201,201, 65,110,110, 46,132, 66, 33,148, + 74, 37,214,173, 91,103,204,201,201, 89,229,120, 14,202, 71,144, 7, 0,147,191,191,255,111,219,183,111, 15,254,250,235,175,133, + 49, 49, 49,105, 3, 6, 12,104,186,110,221,186, 20,177, 88,204, 49, 12, 67,152,205,102,226,237,183,223,142, 88,177, 98, 69,170, + 64, 32, 80,140, 24, 49,130,240,240,240,248, 5,149,132, 13, 80,171,213,167,190,255,254,251,161,211,167, 79,151, 90, 44, 22,151, +150, 44,251, 54,149, 74,133, 75,151, 46, 89, 10, 11, 11, 79, 86, 97,197, 56,245,195,177,163, 93,255, 51,114,164,152,210,106, 64, +105, 53,160, 53, 26, 48,218, 34, 16, 58, 13, 68, 12, 13,185,152, 69,112,152, 12,180,209, 19, 71,127,253,131, 50,155,205,149, 6, + 54,212,104, 52,167, 46,198,199,119,111, 95,175,158,240,210,180,105,176, 82, 20, 94, 73, 74, 42, 21, 87, 86,171, 21, 7, 91,182, + 4, 67, 16,104, 61,113, 34,238,209, 52,173,209,104, 78,253, 47, 62, 12, 55,110,220,200, 29, 61,122,244, 53,150,101,219,226, 9, +125, 52,243, 73,128,162,168,114,214, 40,134, 97, 74,172,142, 37,150, 3,201,209,163, 71,187, 38, 38, 38,138,255,252,243, 79, 92, +184,112,161,245,142, 29, 59, 62, 9, 15, 15,111,249,240,225,195,236,170,196,155,171,160,191,176,249, 31,238,222,185, 7,239,188, +243, 14,145,157,157,141,239,190,251, 14, 85, 5, 79,253, 59, 16, 19, 99, 98,227,227,101,117,225,228,247,228, 34,164,194,239,112, + 51,164, 66, 69,156,166,152, 18, 43,153, 44,190, 36,216,168, 41,166,100, 56, 80, 22, 95,165,165, 12, 49,166, 24,141,205, 33, 62, +171, 22, 56,245,160, 25,185,229,220, 78,221,128, 99, 15,181, 87,178,140,243, 1,156,128,137,225,238, 93,231,110,188,244,146,143, + 63, 0,152, 77, 76,112,227,198,141,187, 9,133, 66, 9, 0,120,122,122,190,228,231,231,183, 46, 63, 63,191,179,171, 50,141,142, +142,238, 16, 24, 24,216,230,248,241,227,127,100,101,101,221, 2,240,179,243, 65, 17, 17, 17,115,110,223,190,221, 78, 36, 18, 17, + 85,212, 17, 0, 64,183,110,221, 94,144, 74,165,126,199,238,122, 67, 35,110, 4, 78, 80, 12, 8,101, 96, 84,173,144, 38,110,142, +176,176,171,126,133,133,133,173,139,139,139,255,168,102,209,247, 24, 58,116,232,150,248,248,248,176,110,221,186,113,215,175, 95, + 39,157, 71, 17, 34, 34, 34,250, 92,185,114,165,237, 91,111,189,181, 97,215,174, 93,147, 81,118,166,109, 85, 72,179,197, 27,172, + 53,156, 74,198,105,128,169,103,179,153,241, 10,229, 31,128,234,132, 92,120,140,240, 12,143,149,196, 10, 13, 24, 21,108,111,111, +139,137,213,158,162,168,223,111,220,184,113,112,196,136, 17,186,252,252,124,248,249,249,161,126,253,250, 32, 8, 2,235,214,173, + 51, 62,120,240, 96,159, 45,150, 86,251,204,204,204, 65, 54,177,229, 10,218,213,171, 87,239,218,182,109,155,234,218,181,107, 2, +154,166,149, 77,155, 54, 53, 92,190,124,217, 83, 36, 18,113, 98,177,152,189,118,237,154, 34, 34, 34,194, 68, 16,132,244,199, 31, +127,204,191,122,245,106,248,140, 25, 51,190, 65,217,105,226,206,216,185, 96,193,130,140,148,148, 20,152,205,102,104, 52, 26, 20, + 23, 23,151, 46, 69, 69, 69, 40, 46, 46,134, 72, 36, 66,118,118, 54,246,239,223,159,101,139, 18, 95,153,101, 99,237,154,117,235, +213, 89, 15,211,160, 84,200, 65,107,138,192, 20,231, 3,218, 98, 72, 40, 43, 60, 68, 12,234, 54,146, 67,166, 80, 34, 71,163, 67, +252,229, 95,179,109, 81,226, 43, 54, 23, 88, 44,107,223, 93,177, 34,135, 22,139, 81,111,248,112, 88,109, 67,133,142, 66,139, 33, + 8,132,247,234, 5,210,219, 27, 11,247,237,203,177, 69,137,127,162, 96, 89, 86, 96,177, 88, 42,203, 7, 88,150, 77, 79, 76, 76, +220, 5,224, 44, 65, 16, 28, 65, 16, 28, 74,130,181,233,158,229, 7,153,162, 40,204,157, 59, 23, 98,177, 24,115,231,206,197,167, +159,126,138,101,203,150, 97,253,250,245,248,246,219,111,113,244,232,209, 6, 23, 47, 94, 20,159, 63,127,158,139,139,139,203,139, +136,136, 16, 76,156, 56, 81, 37,151,203, 63,168,140, 51, 54, 54, 22, 94, 94, 94,136,141,141,197,146, 37, 75,176,121,243,102, 28, + 60,120, 16,151, 46, 93,130, 64, 32, 96,211,211, 31,193,100, 50,113,171, 87,175,206, 56,120,240,160,113,213,170, 85, 16, 10,133, +196, 83,106, 36, 62,176, 9, 42, 71, 75,144,115, 72,133,124, 0, 43, 81,181,111, 84, 69,156,144,197,199,215,181,137,163,100, 7, + 65,116, 24,192,116, 84, 62,189,218,206, 49, 25, 64,112, 45,112,206,150,143,254,191, 68,213,166, 59,247,175,100, 25,103, 3,248, +193,158, 39,165, 82, 41, 63,112,224,123, 33, 0,236,219,187, 95,148,148,148,228,253,253,247,223,203, 2, 3, 3,241,237,183,223, +202,228,114,121, 96, 5,156,204,193,131, 7,205, 18,137,196,111,194,132, 9,253,218,181,107,247,190,173, 35,218, 11, 64, 11,148, +204, 94,140,186,127,255,126,130,191,191,255,221,147, 39, 79,234,221, 41, 32,173, 86,251,205,214,173, 91,235, 23, 48,190, 56,166, + 31,138,120,118, 41,142,170,182, 32,173,222,167, 80,212,121, 25,175,191,254,122, 29,134, 97, 54, 85,179,220, 95, 31, 50,100,200, +214,248,248,248,176, 9, 19, 38,100, 95,191,126, 61, 7, 64, 60,128,237,142,203,237,219,183,243,198,142, 29,155,181,105,211,166, +144, 17, 35, 70,172, 7, 48,140,127,245,243,224, 81,182, 47,132,170,102, 29,186,120,225,150,254,207,205,205, 93, 93, 88, 88,120, +233,222,189,123,239, 89, 44,150, 16,130, 32, 56,177, 88,156,157,147,147,179,202, 33, 96,169, 43,191,146,222,176,197,218, 32, 8, +130,226, 56, 46,189, 71,143, 30, 31,244,234,213,235,171, 35, 71,142,152,186,119,239,142,189,123,247,250,247,232,209,195,192,178, + 44,119,236,216, 49,255,190,125,251, 26,206,158, 61,171,127,251,237,183,155, 54,105,210,100, 98,108,108,172,154, 32, 8,214, 21, +167,253, 93, 86, 84, 84, 52,164, 95,191,126,151,246,237,219,167, 84,169, 84,160,105, 26, 6,131, 1, 6,131, 1, 28,199,193,219, +219, 27,106,181, 26,243,231,207,215, 20, 23, 23, 15,118, 33,220,156, 57, 77, 38,147,105,216,228,247,167,159, 90,245,249, 92,175, +240, 6, 13,144,127,199, 4,218,100,128,136, 35, 81,247, 5,111,136, 37,114,220, 75,210,226,163, 93, 7,180, 70,147,233, 53, 23, +189,229,114,156,197,197,197,195, 98, 62,253,244,244,134, 25, 51, 60,219, 4, 5, 65, 32, 16,192,108, 54,131, 97, 24,136, 68, 34, + 68,198,196, 64, 28, 16,128, 57,187,118,233, 53, 26,205, 48,148,255, 20,143, 51,103,109,192,145,115,242,141, 27, 55,198, 54,107, +214, 12,147, 38, 77,194,144, 33, 67,202, 28,248,253,247,223, 99,253,250,245, 48,155,205, 99, 1, 92, 7,176, 14, 37, 67, 29,112, + 18, 89,127,119, 58,107,157,147, 97,152,194,164,164, 36,229,210,165, 75, 9,171,213,138,207, 63,255, 28,118,193,105,175,215, 83, +166, 76,169,227,229,229,133,207, 62,251,204,146,151,151,215,115,201,146, 37,103,182,111,223,238,255,205, 55,223,188, 14, 32,214, +153,147,101,217,220,155, 55,111,122,109,216,176,129,164,105, 26,203,151, 47, 47, 55, 60, 57,126,252,120, 88,173, 20, 4, 2,161, +197,100, 50,183,144,203,229,201,126,126,126,114,174,172,115,215,147,188,159,161, 40, 9, 97,224,232,248,110,113,244,207, 66,197, + 33, 21,170,195,169,150,197,199,119, 55,197,196,156,181, 9,162, 68,219, 49,123,237, 38,253,106,112,218, 5, 97, 77, 56, 79,217, +150, 42, 97, 50,153,160, 86,171,145,151,151, 7,149, 74, 5,129, 64, 64, 84,148, 78,179,217,252,231, 71, 31,125,116, 99,211,166, + 77,189,175, 92,185, 50,240,252,249,243, 61, 78,159, 62,109, 74, 75, 75,163, 41,138,226, 66, 66, 66,132,157, 59,119,150,245,239, +223,223, 67, 42,149,146,179,103,207,206,251,226,139, 47,252, 81,214,135,205, 57,239, 2,130, 32,240, 97, 87, 45, 98,123, 8, 96, +177, 88, 81, 84, 84,132,140,140,116, 36, 36, 36,224,202,149, 59,224, 56,142,172, 70,185,251, 1,152,253,221,119,223,133, 74, 36, + 18, 98,215,174, 93,117,118,237,218, 85,165, 37,117,199,142, 29,117,118,239,222, 61,207, 54,122,145,254, 44, 62,239, 60,231,255, + 44,231,179, 12,231,200,240,168, 82,104,217,218,249,246,176,125,148,148,162,168, 95, 92,132,112,248, 4,192, 92, 7, 43, 88, 85, +230, 60, 13,199,113, 23,122,247,238, 61,165, 87,175, 94, 43,250,244,233,147,149,149,149,213,112,249,242,229, 97, 52, 77, 91, 19, + 18, 18,200,228,228,228,180,223,126,251,173, 81,147, 38, 77, 38,222,190,125,251, 28, 65, 16, 86, 55, 50,152,144,156,156,220,169, + 71,143, 30,251, 39, 78,156, 24,222,161, 67, 7,137, 74,165,130, 80, 40, 68, 74, 74, 10,254,248,227, 15,203,238,221,187,211,139, +138,138,170,243, 9,158, 95, 82, 51, 50,162, 70, 76,125,111,223,196, 33, 3,253,255,213,244, 5, 73, 72, 72, 8, 96, 52,226,206, +195,108, 92,189,243,135,117,243,133,171,106,179,217, 60, 12,238,127,130,231,151,223,238,221,235,221,115,198,140,125,243,254,243, +159, 32,100,101, 9, 67, 66, 66, 32,145, 72,240,224,193, 3, 36,179, 44,189,120,227,198, 28,155,200,122,210, 81,225,165, 0,150, +178, 44, 43, 4, 0,185, 92,142,119,223,125, 23,142,159,220, 89,191,126, 61,140, 70, 35, 0, 8, 9,130, 88, 10, 96,203,179,110, +197,178,163,160,160, 96,206, 43,175,188, 18, 39, 20, 10, 43,140,122,235,227,227, 3,173, 86, 11,154,166,153,140,140,140, 59, 62, + 62, 62, 16,137, 68,224, 56,206,229,115,148,159,159, 63,103,216,176, 97, 11, 72,146,172,200,242, 1,165, 82,153,118,230,204,153, +198,111,189,245, 22,249,223,255,254, 55,101,194,132, 9,210, 51,103,206, 48, 28,199,237,127,210,247,160, 75,151,157,192,134,152, +215, 0,188, 6,148,115,120,207,176,109,171, 86, 72,133, 46, 93,118, 98, 3,254,226,116, 28,198,179, 11, 34,155, 21,170,185, 44, + 62,126, 5, 74,252, 44, 42,229,238,178,179, 11, 54,196,160, 86, 57,221,129,163,246,213,235,245, 96, 24,166, 50,107,222,239,123, +247,238, 93,241,219,111,191, 5, 76,153, 50,165,225,127,254,243, 31,101,143, 30, 61, 60, 29, 15, 48, 26,141,236,225,195,135,245, +235,215,175, 47,190,112,225, 66,234,248,241,227, 59, 84,150,206,135, 15, 31, 30, 93,184,112,161,119,255,254,253,155, 0, 40,245, +207, 82,171,213, 72, 75, 75,195,159,127,254,153,102,181, 90, 15, 85, 35, 75,249, 0,230,141, 26, 53,106,233,182,109,219,234, 76, +152, 48, 33,123,247,238,221,127,162, 36, 96,177, 51, 84, 67,134, 12,105,185,109,219,182,144, 9, 19, 38,100,163,196,143, 44, 29, + 60,120,240,176,163, 59,202,251,105, 85, 58, 50,177,213, 98,177,112, 38,147,137, 51, 24, 12,156, 78,167,227,224,250, 43,240, 7, + 51, 51, 51,185,244,244,116,238,225,195,135, 92,106,106, 42, 7,224, 91, 39,197,235,170,193,242,216,177, 99, 71,163,208,208,208, +207, 21, 10,197, 9,129, 64,160, 17, 8, 4, 26,169, 84,250,131,159,159,223,167,139, 23, 47, 14,229, 56, 78, 92,137,138,174, 8, + 66,145, 72,244, 86, 96, 96,224, 65, 95, 95,223,116, 31, 31,159,244,192,192,192,131, 34,145,232, 29, 0,162, 42,148,121, 69,144, + 9,133,194,143, 60, 60, 60, 78, 73,165,210, 92,169, 84,154,235,225,225,113, 74, 40, 20,126,132,202, 3,169, 86,202, 41,145, 72, + 62, 10, 8, 8, 56,165, 84, 42,115,149, 74,101,110, 64, 64,192, 41,137, 68,242, 56,156,143,211, 43,177, 11, 45, 3,103, 3, 65, + 16, 84,235,214,173, 55,180,109,219,118, 93,219,182,109,215,181,106,213,234,107,155, 85,146,179, 89, 91, 12,168, 56,120,227,223, +153,206,167,198, 25, 25, 25,185,125,219,182,109,236,156, 57,115, 52, 77,154, 52, 41,152, 51,103,142,102,219,182,109,108,100,100, +228,246,154,114, 6, 5, 5,213,139,140,140, 44,216,180,105, 19,157,148,148,196,109,218,180,137,142,140,140, 44,112,138, 12,255, + 36,242, 78, 0,136,176, 89,127, 14, 1,216,131, 18,231,247, 80, 0, 68,140, 41,134,179,205, 62, 60, 1,160, 79, 5,101,239, 46, +103,152, 41, 38,134,179,249, 84,157, 4,144,232,176,222, 13,101,253,191,158, 4,167, 75,180,104,209,226, 30,231, 0,139,197,194, +169,213,106, 46, 41, 41,137,187,112,225, 2, 23, 22, 22,118,207, 13, 78, 63, 0,111, 3, 56, 28, 28, 28,124,187, 99,199,142, 15, + 59,117,234,244,176, 94,189,122, 41, 34,145,232, 10, 74, 34,188, 71,218,150,165, 0,154, 84,193,217, 81,165, 82, 45, 12, 11, 11, + 59,212,184,113,227, 75,245,235,215,191,226,235,235,123, 68, 38,147, 45,194, 95,145,177,171, 91,231,123, 12, 29, 58, 52, 77,167, +211, 49, 47,189,244,210,109, 87, 39, 53,107,214,236,162, 78,167, 99, 70,142, 28,153, 14, 32,250,159,240,188,243,156, 79,133,243, + 31,133,198, 54,193,116,208, 97,249,196,197,113,159, 56, 29,179,213,118,110,149, 5,193,113,156,128,227, 56, 15,142,227,188, 57, +142,243,229, 56, 78,197,113,156, 39,199,113,210, 42,204,223,124,197,254,251, 56, 39,219, 4,148,193,246,223, 25, 85,237,127,174, +239,103,104,104,168, 79,187,118,237,166, 30, 56,112,224,163,251,247,239,127,116,224,192,129,143,218,181,107, 55, 53, 52, 52,212, +231,113,210, 25, 20, 20, 84,175,121,243,230, 95, 53,107,214, 44,189,121,243,230, 95, 57,137,172, 39,153,119,137, 77,196, 52,179, + 45, 13,109,219, 8,148,196,194, 90,107, 19, 54, 17, 21,244,212,170,195,105,231, 59, 4,160,175,109, 57,100,219, 22,246, 20, 56, +203,161, 65,131, 6,199, 91,182,108,121,175, 85,171, 86,201,173, 90,181,186,215,162, 69,139,123, 77,155, 54,189, 23, 17, 17,113, +175,110,221,186,247,252,253,253,143,215,160,140,124, 1,132,160,252,103,192,158,118,157,239, 30, 25, 25,121, 85, 38,147,185,140, + 13, 38, 20, 10,231,181,106,213,234, 38, 74,102, 74,242,237, 39,207,201, 11,173,255, 33,240,149,240,217,227,148,162,242,207,140, + 84,181,159,191,159,207, 54,167,203,111,117,217,132, 76, 67,155,192,145,212, 2,167, 35,159,189, 78, 69, 56,136,166,167,193,201, +215, 37,158,147,231,228,133, 86,173, 67,200,223, 2, 30, 78, 48, 63,230,126, 30,207,197,104, 60,126, 0, 0, 32, 0, 73, 68, 65, + 84, 54,170, 19, 19,235,113, 56, 93,241,221,127,202,156, 60,120,240,224, 81, 91,109,103,119, 0,231,236,189,194,138, 84,105,117, +102, 19,212, 68,217,158,230, 57,121, 78,158,147,231,228, 57,121, 78,158,243, 31,199,105,199,138, 10,182,223,113, 90,255,250, 25, + 21, 94, 79, 36, 76, 15,111, 86,229, 57,121, 78,158,147,231,228, 57,121, 78,158,179,166,152,248,140,138,172,110,246, 21,126,232, +144, 7, 15, 30, 60,120,240,224,193,163,246, 80,117, 28,173, 61,123,246, 8,236,255, 71,141, 26, 53,158, 97,152,169,246,117,129, + 64,176,230,187,239,190,219, 82,217, 21,134, 15, 31,206, 84,198,233, 10, 85, 93,199, 21,103,139, 38,202, 73,126,222,138,247,138, +138, 13, 43, 83, 50,153, 11, 38,147,169,185,125,159, 76, 38, 75,220,178,101,203,221,218, 78,231,248,241,227,155, 56, 95,167,126, +152,168,187,175,151,236,221,130, 34,221,242, 91,247,116, 95,243,117,236,169,192, 31, 64,180,151, 76, 60,168,133, 74,220,241,207, +124,211,101,189,149, 57,140,146,217,176,133,207, 99,134,131,131,131,155, 42,149,202, 49, 0, 90, 24, 12,134, 64,133, 66,145, 11, + 32, 65,163,209,108,207,206,206,190,227, 46, 79,183,250, 72, 3, 16,110, 91,125,120, 46, 21,245,220,217, 87, 21,250, 68,192,196, + 1, 82,130,128,245,100,242, 95,206,232,125, 27,193,196,114,229,183,247,105, 4, 11,199, 65, 76, 0,230,147,247, 33,123,142,138, + 74, 9, 32, 10, 37, 33, 28,110,160, 36,252,132,129,127,100,121,240,120,174,224, 60, 84, 88,186, 46,172, 64, 76,116, 21, 11,137, +175, 56,112, 42,128,243, 51,155,205, 34,137, 68, 2,139,197, 2,133, 66,190,246,237, 9,227, 63, 7,137, 34,138,198,187, 91,182, +108,169,241,151,174,171,115, 29, 0, 63, 57,159,239,163,148, 47, 56,123,248, 99,159,174, 3, 22, 47,178, 60,200,139,213,106,181, +164, 84, 42,133,217,108,134,183,183,119,167, 73, 19, 39,190, 68,138, 56,139, 88,236,113,121,197,138, 21,217, 53, 77,231, 7, 31, +124, 16,108,181,154,254,205,178,172,196, 98,177, 72,157,175,227,173,240, 88,124,246,240,199,138,110,209,139, 62, 7,120,161,245, + 20, 32,169,231,227,113,110,229,168,238,205, 58,182,104, 12, 54,225, 60, 76, 22,235,160,179,233,186, 65,159, 94,201,156,158,174, +179,182, 69, 45, 4,172,252, 31,130,160, 97,195,134, 83, 2, 2, 2, 70,110,220,184, 81,220,176, 97, 67,200,100, 50, 24,141,198, +144,251,247,239,135, 76,154, 52,169,155, 92, 46,223,149,146,146,178, 22,238,125, 8, 46,252,236,214,255, 3, 0,116, 26, 51, 63, + 28, 37, 31,139, 54, 56,239,235, 62,110,126, 56,128, 25, 40,251, 97,228, 44,148,132, 80,112,213,234, 72,142,108, 91,134, 65, 99, + 63, 18, 2,152, 84,154,120, 18,248,225,219, 85,232, 55,234,189, 50,219, 9, 14,194,195,219,150, 33,122,236, 71, 21,126, 71,177, +111, 99,130, 98, 89,174, 66, 75, 60, 73, 18,244,137,123,156,171, 15, 12,231,160, 36, 6, 88, 57, 74,148,124,208,217,229,241, 3, +154, 10,114,172, 20,227, 50,224,172, 88, 36,200, 61,122,135, 41,119,110, 76, 27, 80, 20, 83,210,182,138,133, 96, 14,166,120,159, +157, 61,123,182, 48, 58, 58, 26,155, 55,111,238,252,245,215, 95, 79,212,106,181, 63,218,238, 91, 50,255,248,242,224,241, 92, 11, + 46,215, 66, 75, 40,192,134, 67,251,182, 52,202,201,205, 67,204, 91, 31, 98,231,206,157, 40, 44, 44,132,143,143, 15, 36, 98,177, +104,229,210,255, 11, 86, 42, 61,130, 99, 38,198,110, 0,208,180,166,169,169,230,117, 26, 59,159, 79,216, 62,165, 35, 20,144, 34, +137, 68, 66,238,218,181, 11, 69, 69, 69, 80,169, 84,144, 72, 68,228,138, 69,159,200,149, 74, 79,249,155,147,103,118, 70, 73,252, +159, 26,193, 98,209,117, 62,176,115,139, 82,173, 86, 99,220, 59,177,112,190,142, 88, 44,102,236, 47, 22,190,142, 61, 21,204,222, +248,238,216,102, 47,122, 1,214, 91,151, 32, 18, 8,160,240,246, 65,148, 80, 0, 1,129,230, 49, 39, 82,103, 1,248,244,121,201, +108,195,134, 13,167, 12, 31, 62,124,228,130, 5, 11,196, 36, 89, 18,114, 78,175,215,195,104, 52, 34, 52, 52, 20,103,207,158, 21, +207,153, 51,103,228,247,223,127,143,148,148,148,213,213,229,191,117,235, 86,253,240,240,112, 19, 0, 12,108,233,229,188,175,158, +125, 31, 0,120,121,121, 85,201,231,167,242, 48,223,186,117,181,133,253,188, 41,189, 66,153, 10,182,155, 0, 40, 42,227, 98, 89, + 78,120,242,171, 73, 21,238,127,107,193, 14,250,198,158, 11, 77, 27, 54,108,104,116,220,238,233,233, 89,209, 41, 65, 58,157, 46, +220,121,163,253,120, 43,197, 4, 86,116,189, 62,239,174,119, 41,192, 40, 6,194, 29, 59,118, 0, 0,190,252,104,180, 96,211,207, +121, 66,161,176,164,169, 93,186,116, 41,230,205,155, 39, 57,113,226, 68,255,109,219,182,245, 63,120,240,224,202,138,132, 42, 15, + 30, 60,158, 73,145,229,248, 91,177,208, 34, 9,194, 75,233,229,137,215, 94,127, 27,199,143,255,128,174, 93,187,150,238,107,208, +160, 1,134, 15, 27,140,239,182,174, 0, 0,175,199, 73,209,227, 94,167,176, 88,255,105,191,145, 95,205,127,152,173,187,114,228, +200, 17,116,233,210,165,204,249,175,143,120, 13,223,126,179, 20,149, 68,153,119, 11, 4, 71,138,189,148, 30, 24, 21,243, 14, 92, + 93,103,226,184, 33, 71,250, 14, 95,213, 59, 39, 95,191,130,175,103, 79, 30,141,130,253,250,180,108,214, 20,133,251,215,226,143, + 34, 19,142,103,154,240,102,212,191, 16,233, 43, 71, 23,154, 65,176,135,168,103,182,158,122, 46,132, 86,112,112,112,211,128,128, +128, 50, 34, 75,171,213, 66,167,211, 65,163,209, 64,171,213,130, 36, 73,196,198,198,138,207,157, 59, 55, 50, 56, 56,248,180, 27, +195,136, 15,109,150, 44, 64, 32,210,205,157, 59,215, 28, 24, 24,104, 86, 40, 20,156, 80, 44,213,118, 31, 55,223, 11, 0, 72,161, + 88,187,114,229, 74, 75,104,104,168, 73, 40, 20, 74,222,123,239, 61,210,157, 52,155,205,102,206,145,211, 98, 49,151,110, 95,188, +120,177, 37, 40, 40,200,172, 80, 40, 56,171,213,125,163,227,205, 7, 5,144,138, 5,144,138, 5,144, 73, 68,240,170,223, 14,210, +194, 63, 65,211, 52,150, 44, 89, 98, 13, 14, 14,182, 40, 20, 10, 78, 34,145,136,167, 77,155, 86,101, 58,199,143, 31,207,169, 84, + 42,171, 66,161, 16,207,155, 55,175,220, 76,161, 51, 55, 50, 32,151,136,160,144, 10,209,184, 65, 24,164,156,209,237,180, 10, 4, +101,189, 17,164, 82, 41, 58,119,238,140, 22, 45, 90,224,224,193,131,221,121,161,197,131,199,115,129, 10,103, 24, 10, 1,224,200, +145, 35,221, 80,242, 65, 68, 68, 71, 71, 19, 37,103,112,152, 49,101, 24,222, 28, 55, 10, 12,195,150,126,231,139, 32, 9, 76,126, +163, 63, 88,214,157, 17,137,170,167,120,214,224, 58,165,156, 28, 65, 10, 0,160, 81,189, 16,110,226,155,255, 1,195,178,127, 13, +148, 8,128,183,199,245, 43,217, 86, 11,233, 20,128,193,135,147, 94,133,171,235, 52,109, 84,135,164,173, 38, 16,101, 63,246,248, +119,124,108,147,231,116,129, 22,117, 67, 34, 40,163, 17, 38, 19,133,248, 59, 5,198, 83, 25,250, 64, 82,149,170, 94,245, 90, 7, +153, 64,157,137,122, 94,146,198,217,122,234,185,200,187, 82,169, 28,179,113,227,198,114, 34, 43, 39, 39,135,212,233,116,176, 90, +173,172, 86,171, 5,195, 48,152, 57,115,166,104,206,156, 57, 99,178,179,179,231,217, 53,143, 43, 78,155,223,213,140, 91,183,110, +213,155, 61,123,182,181,103,207,158, 15, 27, 52,104,160, 23, 8, 4, 8, 9, 9, 89, 21, 21, 21,229,187, 96,193, 2,107,255,254, +253, 83, 5, 2, 1, 26, 55,110,172,255,243,207, 63,235, 1,144,187,155,119, 71,206, 45,103,214,112, 0, 64, 16, 4,162,162,162, +210, 26, 55,110,172, 23, 8, 4,184,123,120, 49,231,238,253, 20, 9, 73, 52, 9,245,182, 53, 34, 4, 32,247, 44,245,196,139,138, +138, 74,111,218,180,169,142, 36, 73,220,188,121, 51, 12,229, 63,107, 85,142, 83, 46,151, 83,175,191,254,250,195, 59,119,238,184, + 58, 30, 66, 1,137, 14, 77,109, 6,172,208,182, 64,250,197, 10,211, 41, 18,128,158, 51,101,180, 80, 37, 3,164, 94,254,102,141, + 70, 3,165, 82, 89, 98, 33,179, 90,241,251,239,191,163, 99,199,142,221,246,236,217,115,142,127,222,121, 78,158,243, 47,184,210, + 34,207,160, 53,203,241, 67,247,101,124,180,206, 58,103,138, 97,104, 52, 8, 15,194,226,255, 27, 15,134, 97,193, 48, 12,104,219, + 47,195, 48,160,172,214, 90, 73,217,227, 92,199, 71, 41, 95,240,195,174,119,125,122, 14, 89,218, 43,110,246,184, 83, 12, 3,176, + 44, 5,138, 2, 24,150, 2,203, 48,160,168,218,113,205,161, 88, 22,245,194,130, 17, 55,123, 28,156,175,179,253,187, 61, 3,207, + 28,138, 85,116,141, 94,244,225,221, 52,195, 18, 94,216, 63, 89,200,196, 82, 33, 39,148,193, 98,161,161,181,176, 22, 0,122, 19, +197, 90, 57, 15,127, 25, 0, 8, 73,226,121,154, 93,219,162, 97,195,134,101, 68,214,178,101,203,252,215,173, 91, 23, 10, 0,195, +134, 13,203,232,213,171, 87, 94, 82, 82, 18, 66, 66, 66,136,188,188,188, 1, 0,222,179,157, 59, 3,192,186, 10,120,245,225,225, +225,166,128,128, 0,179, 93, 16,145, 36, 9,161, 80,136,240,240,112, 83, 96, 96,160,185,113,227,198,122,177, 88, 12,146, 36, 97, + 23,122,110,117,243, 8, 2, 2,129, 0,118, 78,103,107,143,157,179, 58, 16, 9,201,242,205,155, 3, 39, 73,146, 46,175, 87, 97, + 29,146,201, 56, 0, 21, 30, 47, 32, 29,154, 71, 97,229, 30, 2,241,191, 67, 4,224, 44,199,113,184,126,253, 58, 82, 82, 82, 32, + 22,139, 17, 28, 28,140,121,243,230,193,108, 46,209,187,195,135, 15,239, 6,224, 38,255, 4,243,224, 81,138,179,207,160,192,114, +182,106, 85,238,163,117,228,200,145,110,209,209,209,231,236, 2,168, 68,236,184, 16, 63, 20, 13,138,178, 2, 28, 87, 43, 66,171, +162,235, 48, 12, 91,233,117,236, 62, 90, 44,203, 9, 93,138, 44,150, 5, 77, 81,181,114,247, 88,134, 2,203, 82,112,117, 29,130, + 32, 25, 91,131, 47,230,159,147, 39,143,224,240,122, 36, 21,222, 0, 23,104, 19, 66,253,164, 18,228, 25,209,240,133,102,130,223, + 13, 20, 46,221, 72,132,191,167,242,185, 41, 23,131,193, 16, 40,147,201,160,215,235, 75, 45, 89,235,214,173, 11,181, 88, 44, 36, + 0, 8,133,162, 48, 53, 27, 42, 99, 88,192, 91,153,133,194,194, 98, 63,142,227, 8,155,224, 89, 10, 96, 11, 42,137,238, 47, 22, +139, 75, 5,138,163, 0,146, 74,165, 53, 18, 48,118,216,197,153, 88, 44,118,185,221,121,120,173, 42,136, 29,133, 22,184, 18,171, +150,147,216, 18, 8, 4,176,251, 70, 85, 5,137, 68, 82,154,119, 87, 16, 10, 28,174, 39,168,190, 43,166,213,106,133, 78,167, 67, + 81, 81, 17,100,178, 18,131, 25,199,113, 32, 8,226, 61, 0,239,243, 79, 49, 15, 30,174,181,200, 51, 44,182, 92, 11, 45,148,152, +236, 8, 0,160, 41,171, 75,241,179,231,240, 37, 60,204,214, 35,216,255, 23,112,213,140,122, 58,114,228,200,173, 33, 33, 33, 29, +236,235, 82,185,167,223,196,119, 63, 3, 77, 91,225, 37, 39,241,214,152,126,101, 68, 86,137, 69,203, 82,225, 55, 65, 10,139,245, +159,246, 27,190,122,190,183,210,239,138,179,248,137,139,191,246, 90,161,198, 28, 70,146,191,162,144, 8, 97,134,191,253,217,120, +135,198,253,198,174,245,115,167,187,109, 15, 36, 72,209,107,147, 86, 77,228,132,158,205, 21,164,246,252,199,227,254,117,192, 81, +204,249,250,250, 30,233,243,218,202,222, 57, 5,188,143,214,211,128,151,183,138, 12,123,185, 59, 94,126,239, 43,156,249,228, 99, + 14, 40,132, 95, 72, 40,217, 99,202, 23,240,124,121, 32,174,190, 53,134, 5, 10,158,139,188, 42, 20,138, 92,131,193, 16, 98, 52, + 26,161,209,104,160,209,104,202, 10, 2,145,136,152,248,206, 84,127,145, 88, 2,202,106,193,241,237, 95, 84,201,105, 15,225, 48, +176,165, 23, 4, 34,137, 54,161, 97,195, 85, 66,161, 16, 36, 73,226,240,218,143,223,219,191,252, 93, 47, 0,184,113,100,173,102, + 84,236,154,213, 36, 73,194,108, 54, 75,171,147,238, 71,143, 30,133,153,205,102,147, 77,160,217,133, 31, 30, 60,120, 80,215,108, + 54, 27, 29,183,187, 3,185,194, 11, 80, 53, 0, 20,129,229,172,103,169,169,169,117, 40,138, 50, 8,133, 66, 88, 44, 22,183, 84, + 17, 73,146,226,155, 55,111,134,177, 44,235,242,248, 22, 17,117,128,224,150,128,196,219,237, 60,115,110,116, 68,109, 98,235,137, + 69,144,230,193,227, 89,177,108, 61,131,207, 4, 81,193,255, 82,161,213,253,200,145, 35,156, 99, 15,145,166, 40,155,200,250, 75, +244, 48, 12,139, 76,181, 9, 73, 73,119,177,114,229, 74, 92,186,250,145,247,130, 5, 11,164,115,230,204, 49,143, 28, 57,114, 57, +203,178,173, 72,146,188,129,191,134, 42,202, 90,133, 88,182,238,181,107,215, 26,218,215, 41,138,130,151,151, 23,188,188,188,208, +180,113, 88, 57,145,197, 48, 12,172,149, 12, 29,218,125,180, 8,142,229, 40,138, 1,195,178,165,226,167, 80, 99, 14, 59,116,250, +122, 35,135,195, 95,176,255,233,220,174,121,197, 98,112,210,188,210,124,236, 90, 63,119,250,130,205,155,165,133, 76,192,180, 81, +175,189, 25, 57,124,212, 24,188,254,234, 43,221,204, 22,203, 65, 1,201,177, 84,233,245, 64,130,131,179,143, 22,143, 39,132,228, + 34, 61, 37,146,202,225, 25, 92, 31,119,117,140, 88, 32, 16,252,114,191,200, 32, 38, 5, 66,144, 66, 49, 18, 10, 77,212,115,148, +221,132,228,228,228,144,186,117,235, 66,163,209,128,166,105,118,216,176, 97, 25, 66,161, 40, 76, 40, 18, 17,209,163,166,178,217, +217,153, 20, 73, 10,192,113, 12, 94, 25, 62,137,144,202,228, 98,171,197, 66,163,100,232,208,149, 53,203, 49,132,131, 87, 84, 84, +148,175,125, 38,224,254,229,239,122, 57,236, 83,190,244,210, 75,190,142,179, 14,221,180, 22, 17, 35, 71,142,148,135,135,135, 19, + 0,240,235,246,217,118,235, 25, 49,112,224, 64, 89,120,120,137, 31,254,143,107,223,117,155,211, 95,193, 1,197, 15,128,226,212, +114,150,172,129, 3, 7, 74, 27, 54,108, 88,173,103,209,230, 0, 95, 97,236, 46, 15, 33, 13,100, 95,119,139, 43,166, 13,168, 80, + 79, 8,151,191, 66, 66,226,233,103,238,240,241,137,159,121,177,197,131,135, 91,112,210, 34,207, 20,186,217, 4, 98,119,219,111, +169,224, 18, 2,128,205, 68, 71, 56,232, 44, 80,180,181,156,200, 98, 24, 6, 34,194,140,149, 43, 87,226,253,247,223, 7, 0,241, +244,233,211, 15, 44, 88,176, 96, 40,203,178,173, 56,142,235, 66, 16, 68,101,189,198,179, 33, 33, 33, 57, 28,199,137, 72,146,236, +178,118,237, 90,223,254,253,251,195,203,203, 11, 28,203,149, 19, 89, 12,195,194,106,181, 84,248,153, 91, 31,165,124,193, 15,123, +166,249,244, 28,188,180, 23,195,178,167,236, 34,139,101, 24,128, 45, 57, 41, 63, 55, 3, 39,143, 31,196,134,245, 27, 10, 65,112, +183,193,129,181,137, 65, 84, 32, 6, 91, 93,252, 53,177, 75,231,118,205,177, 96,243,102,233,173,107, 89, 7,166,126, 48, 43,114, +248,168, 49,216,243,221,118,144,116,209,117, 71,145,197, 80, 44,138, 11,243, 6,254,196,251,104, 61, 45,248,158, 60,117,138, 24, + 51,102, 12,171,213,106, 33,150, 72, 88,138,162, 4,255,254,247,191,153,247,223,127,159,204,206,206,134, 70,171, 19, 2,240,197, +115, 96,214,210,104, 52,219, 39, 77,154,212,237,252,249,243, 98,146, 36,161,209,104,208,163, 71,143, 60, 53, 27, 42,155,248,206, + 84,255,204,204, 12, 90, 41, 23,154,197, 98, 17,114,115,115,217,110,253, 71, 27, 71,141,127,191,206,251,179,227, 54,102, 93, 94, +191,206,157,107, 56,206, 4,116,222,183,105,211, 38, 75,104,104,168, 73, 42,149, 74,198,141, 27,231,214,248,161,197, 98,225, 22, + 47, 94,108,118,158, 93,104,177, 88,184,149, 43, 87, 90,194,194,194,204,114,185,156,163,168,170,253, 62, 73,146,160,223, 90,176, +131,166,105,186,140, 21,203, 46,178, 40,150,208,125,245,213, 87,214,176,176, 48,139, 66,161,224,164, 82,169,216,157,116, 78,157, + 58,149,243,241,241,177,122,120,120,136, 99, 99, 99, 31,107,214, 33,197, 64,184, 96,109,105,120, 7,169,151,151, 23,180, 90,109, +105, 90, 67, 66, 66,120,177,197,131,135, 11,148,211, 34,207,166, 21,206,189, 56, 90, 44,160,203,201,205, 11,244, 15,170, 15,154, +166,109, 11, 5,154,162, 48,237,237, 81, 88,190,254, 43, 0,176,139,173,168,233,211,167, 31, 0, 80,101, 99,182,107,215,174,249, +211,167, 79, 87,230,228,228,156,216,186,117,171,239,232,209,163, 49, 99,198, 12, 44, 93,186, 20, 34,137, 12,190, 1,117, 75,175, + 99,191,110,158,186, 0, 28, 56, 93, 5,118, 58,107, 73, 35, 5,161, 95, 64, 61, 80, 12, 5,150,162, 64, 81, 20, 8, 65, 73,214, + 78, 30, 63,136,209,111, 76,133, 72,170,244, 89,179,114,137, 49,242,229,144,161,115, 38, 76, 48,187, 97, 4, 36,111, 93,203, 58, + 48,245,253,216, 40,187,200,218,183,125,253,237, 47,103, 14,222, 41,149, 8, 75,175, 67,177, 44, 72, 82,192,251,104, 61, 37,145, + 37,149, 74,247, 30, 59,118,236, 94,219,182,109, 9,189, 94, 15,138,162,144,151,151,135, 3, 7, 14, 36,112, 28, 7, 31, 31, 31, + 28, 59,118,140, 29, 61,122,244, 94,179,217,252,218,179, 46,182,178,179,179,239,200,229,242, 93,179,102,205, 26, 53,115,230, 76, + 17,203,178, 72, 74, 74, 2, 8,130, 19,137, 37, 32, 73, 18, 34,145, 16,197,197, 26, 86,225,169,202,178,114, 2,133, 72, 44, 1, + 41, 16, 87, 54, 77,248,161, 45, 24, 41, 72,161, 88,107,159, 9, 40, 22,139,113,117,207, 50, 77,247,113,243,149, 0, 32,150,202, + 11,251,244,233,147,214,188,121,115,253,111,191,253, 86, 15,229,103, 29, 58, 63,159,244,144,113,177, 2,133, 92,166,143,138,138, +122,104,231, 76, 61,181, 70, 51,102,242,108,130, 16, 72,244,209,209,209,105,145,145,145,122,129, 64,128,196,131, 75, 52, 67,198, +197,202,136, 74,130,172,158,184,199,189,117, 99,207,133,166, 95,124,241, 5,213,191,127,255, 71,118,127,177,212,212,212, 58, 3, + 6, 12,144,174, 88,177,130, 26, 48, 96, 64,250,139,255,207,222,117,199, 53,113,254,225,231, 46,155,189, 71, 16, 68, 69, 81, 20, +112,139, 11,197, 58,107, 29,173,226,194,189, 71,157,173,179, 14,220, 74,221,168,117,214, 90,220, 84,171,162,214, 81, 23, 42, 46, + 16, 7, 67, 69, 1, 25, 97, 67,128,144,157,187,223, 31, 36, 52, 32, 35, 65, 91,107,127,121, 62,159,124,146,220,189,247,220,123, +251,185,239,251, 29, 94, 94,197, 36, 73, 34, 50, 50,210,185, 58, 75,149, 6, 70, 70, 70,138, 9, 19, 38,188,123,254,252,121,109, +163, 14,171,133,139,139, 11, 40,138, 66,183,110,221, 32,145, 72, 12,150, 45, 3, 12,248,111,162, 98, 30,173,170, 51,195, 43,148, +138,111,167,204, 94,185, 19, 32, 76,181,238, 2,127, 25,150,104, 16,223,127,255,157, 9, 0, 35,141,216,154, 59,119,110,141,101, + 78,180, 68, 86,155,128,128, 0, 44, 94,188, 24,155, 55,111, 86,253,248,227,143,140,248, 87,137,242,177,211, 87, 20, 84, 88, 15, +104,208,197,148,130,250,182, 50,190,124,161,104,133,239, 87, 27, 86,166,101,150,220, 25, 59,109,105,217,221, 75, 5,160,144,224, +171, 0, 96,207, 79, 63,137, 88, 92,115,147, 33,195, 71, 1, 64,207,157,219,130,206,172,193,129,154,197, 22, 77,120,124, 59,119, +129,149, 70,100,237,218,186,246,185, 5,145, 25, 60,243,187, 24,133,246,122, 0,192,218, 12,103,124,191,218,208, 59, 43, 79,180, +221,112,158,253,115,224,112, 56,171,175, 95,191,110,226,237,237, 77,228,230,230, 66,165, 42, 61, 34,114,185, 28, 66,161, 16, 69, + 69, 69,144, 74,165,104,221,186, 53,185, 99,199, 14,147,153, 51,103,174,150,201,100,211, 63,247,237,126,251,246,237,174,115,231, +206,225,214,173, 91,195, 22, 45, 90,196,114,116,116, 36, 44, 44, 50, 9,133, 92, 6,128,166,179,179,179, 41, 99, 83, 75,129,173, +131,243,187,244,140, 44, 15,133, 92, 6, 74, 37,175,210,219, 92,157,222,225,251, 23, 47, 94,212,219,180,105,147, 76, 59, 18,112, +248,130,157, 59, 90,183,110,109, 29, 28, 28, 44,235,215,175, 95,178,198,121, 93, 23,103,248, 43,111, 48,251,197,139,103,205, 42, +114,250, 77,222,116, 80,195,169, 29,141,216,255,187,189, 7, 27, 53,106,100,237,233,233,153, 92, 29,111,131, 6, 13,196,124, 62, + 95,214,164, 73,147, 98, 22,139, 85,106,201, 82, 40, 74, 26, 52,104, 64, 57, 56, 56,200,154, 54,109, 90,172,175,211,190,145,145, + 17,173,177,138, 85, 6,125,162, 14, 89, 12, 40, 3, 2, 2,202, 50,195,127,223,168,145, 96,212,168, 81,252,121,243,230,225,224, +193,131,184,123,247,238,123, 98,191,107,215,174,184,125,251,246, 74,252,135, 18,235, 26, 96,192,255, 25,170,207,163, 85, 17,135, + 14,133,252, 9, 45,159,166,202,176,102,205, 26,174,218,146,213,115,206,156, 57, 16,139,197, 86,149, 52,235, 1,117,174,141,202, + 68, 86, 80, 80,208, 49,154,166,157, 1,116, 86,169,168, 7,251, 15, 28,234, 86,213,250,134, 12, 25,242, 30, 39, 77,144, 12,146, + 36,138, 57, 44,250,201, 79,251, 14, 30, 41,215,190,212,249,189, 49, 8, 60,221,185, 45, 72, 12,160,103, 69,177,133,191,202,140, +148,113,106, 48,117,218,212, 50,145,181,115, 91,208, 85,207, 54,117,191, 89, 58,113,117,165,226,108,245,138, 41, 38, 36, 73,116, +172,224,163,245, 30,231, 71,128,129,243, 47,116, 11, 8, 8,104,238,227,227, 67,106,139, 44,153, 76, 86,150,184, 83,227, 44,158, +150,150,134,174, 93,187,146,205,155, 55,247,122,248,240, 97, 55,252, 85,206,233,115,221,118,213,219,183,111,119, 56, 58, 58, 94, + 91,190,124,249,168,156,156,156,175,242,243, 11,108,194, 14,173, 70,159, 33,211,136,174,125, 71,136,100, 52,147,151, 42,200,108, +114,243,226, 81,235, 75, 39,118, 65, 46,147, 77, 1, 16,135,191,210, 59, 84,228, 44,209,164,113,104,210,164,137, 72, 91,168,212, +173, 91, 87,226,228,228, 36,245,244,244, 44,155, 94, 69, 52,223,123,219,174, 47,167,218,255, 75, 84,211,254,212,136,182,138,105, + 35,140,141,141,161, 17, 95,250,244, 83, 59,218,178,210, 27,101,205, 81,135,101,156,234,244, 14,229,116, 90, 72, 72, 72,143,144, +144,144, 54, 0,158,160,180,214,161, 2, 40, 29, 74,212,114,154, 15, 84,127, 12,215,187,129,243,255,149,243,115, 70, 87,252,229, +155, 5,148,250,106,221,170, 82,104,213, 4,141,227, 59, 0,114,238,220,185,249, 98,177,216,106,212,168, 81,213, 46,147,145,145, +113,240,240,225,195,229, 68,214,160, 65,131,198,133,134,134, 94,203,202,202,170,213, 86, 89,153, 27,173,185,117,126,161, 85,215, +126, 27,230, 0,248,177, 10, 67, 30,229,217,134,255,205,206,109, 65,103, 42,136,173, 95, 1, 12,170, 74,149,246,250,114, 32,142, + 30,218,169,241,237, 50,122,254, 56,237,210,176,168, 85,149, 70, 43, 90,154,114, 87,169,251, 49,207,224,163,245,207,128,205,102, +251, 45, 90,180,136, 45, 18,137,222, 19, 89, 21,133, 86, 97, 97, 33,158, 62,125,138,177, 99,199,114,163,163,163,253,228,114,249, +141,255,194, 62,200,200,200,136, 87, 39, 35,157,173, 73,225,192,229, 25,177, 71,140,159,227, 92, 22,117,120, 98, 23,164, 18, 49, + 0, 48,117, 73,239,192,100, 50,217,209,209,209,174, 26,171,149, 92, 46,231,106,166, 63,126,252,216, 85,147, 91, 75, 34,145,232, + 28,117,248,119,113, 62,123,246,204, 89, 19, 29,169,137, 46,100, 50,153,236,200,200, 72,103, 13,167, 84, 42,213, 41,234,144,195, +225,176,163,163,163,157, 85, 42,213, 71,139, 58,212, 22,198, 40,173,179, 88,174,214,162,218,183,140, 32, 8,130, 54, 12, 27, 26, + 96,192,103,143,138,145,146,213, 23,149,174, 9, 26,199,119, 61, 22, 97,186,184,184,244, 26, 62,124,120, 57,145,229,239,239,175, + 58,125,250,244, 77, 62,159,159, 73,146,100,188,190,253, 40,243,209,194,123,111,144, 32, 73,242,105,231,182, 77, 65,146,228,211, +165, 19, 39, 74,215,224, 64, 57,177,117,246,204,201,222,169,249, 49,149, 75, 51, 0, 54,246,117, 16, 48,238, 91, 4,140,251,214, + 10, 64, 39,160,234,104,197,234,250, 97,192,223, 3,130, 32, 56, 78, 78, 78,207, 37, 18, 9, 8,130,128, 84, 42, 45, 19, 88, 69, + 69, 69, 16, 10,133,101,255,229,114, 57,178,179,179, 81,183,110, 93, 16, 4,241,159,246,163,147,203,229,202, 69, 43, 55, 29,102, + 48,217, 74,138,146, 19,114,185,124,188, 62,215,249,162, 69,139, 72, 84,226,123, 53,115,230,204, 74,167,127, 42,206, 37, 75,150, + 84, 26, 37, 56,115,230,204,106,163, 7,171,194,119,223,125,247,209,162, 14,117,191,125, 25, 96,128, 1,255, 49, 84, 26,186, 87, + 43,161, 69,146,228,211, 74,162, 11, 9, 0, 52, 73,146, 79, 43,201,114,160,124,247,238,221, 74, 75, 75,203, 41, 34,145,232,143, + 65,131, 6,205,245,247,247, 87, 1,165, 14,242,181,221,162,124,161,104,133, 95,255,141,243, 10,138,165,193, 21,231, 85,180, 60, +105,196,214,174,237, 65,187,207,132, 30,247,207, 72, 79,221, 93,213,182, 85, 37,168,170,138, 86, 20, 22,138, 87,250,245,223, 56, + 39,191, 80,108,240,209,250,135,160, 82,169,174, 24, 25, 25, 17,154, 98,202,218,214,171,194,194, 66,148,148,148, 64, 93,146, 6, + 0, 80, 92, 92, 12, 11, 11, 11,168, 84, 42,250, 63,182, 43,164, 0,230,171,173, 85, 0, 48, 63,241,230, 14,237,115,251,153,246, +188,106,172, 89, 2, 93, 10, 68, 87,182, 92,117,243,254, 6,206,204,106, 10, 68, 87,135, 76, 61,249, 50, 1,128,205, 98,100, 85, + 85, 60,154,205, 98,100, 85,227,183,175,231,123, 3, 65, 3, 88,105,184,178, 13, 48,224,243,125,255,255, 84, 43,238, 97,224, 52, +112, 26, 56,255, 17, 78,174,250,163,235, 60,195,254, 52,112, 26, 56, 13,156,255, 54,206,202, 48,249, 51, 17, 90,116, 37, 31, 0, +181,180,104, 25, 96,128, 1,255, 58, 72,107, 57,207, 0, 3, 12, 48,192,128, 15,199,123,197,164,181,103, 84,165, 74,245,137, 38, +168,141,178,189,102,224, 52,112, 26, 56, 13,156, 6, 78, 3,167,129,243,255,142,179, 38,110,237,229, 39, 3,216,247,153,136,173, + 79, 18,208, 98, 48,171, 26, 56, 13,156, 6, 78, 3,167,129,211,192,105,224,172, 45, 12, 67,135, 6, 24, 96,128, 1, 6, 24, 96, +128, 1,255,231,208, 47, 97,169, 1,149,160,238,192,165,160,176, 68,189, 59,131,144,114, 54,240,191,182,137,254,254,254, 12,125, +218, 39, 38, 90,146, 81,224,111, 54, 55, 97,247, 47, 22, 41, 54, 83, 81, 43,130,107, 58, 17,109, 27,180, 26,109,204, 51,158, 46, +147,201,234,155,154,153,101,229,229,102,239,201,123,247,108,151, 86, 27,243, 7, 15, 30,240,125,124,124,210, 1, 20,105,189, 41, + 24, 96,128, 1, 31, 19,150, 77, 93, 64, 16,227, 1,250,175,176, 75,138,142,129, 48,238, 80,185,118, 22, 30,227, 64, 18,205,180, +166,136, 65, 99, 63, 10, 98, 83,106,120,224, 88, 38, 36, 36,184, 54,108,216, 48, 25, 64, 65,197,181, 87, 50,207,112,157, 27,240, + 57,163, 43,202, 39, 44, 45,187, 22, 62, 92,104, 53, 26, 84, 31, 74,114, 12,104,140, 4,129,104, 36,134, 14,174, 21,143,219, 55, +117, 64, 49,219, 1,104, 5,208,173, 76,140,120, 45,197, 50,121, 22, 69,211,163,241,230,228, 19,189,249,234,251, 79, 67,213,229, + 44, 86, 34, 49,244, 39,189,248, 40,250,135, 71,183, 79,115, 45,141, 9, 52,108, 61,104, 1,202,103,112,174, 45, 56, 0,124, 73, +146,108,102,108,108,204, 47, 41, 41,201,166, 40, 42, 5,165,227,211,249,181,228, 36, 1, 76, 48, 53, 49,233,227,106,198,105,245, + 46, 71,152, 86,164, 80,133,163, 52,161,107,254,199, 58,163, 74, 69,150,227,190, 57, 35,124,198, 6,205,234, 1, 75,191,141, 11, + 74,128,234,132, 22,225,220,184,227,217, 97,195,135,248,205,152, 60,214,180,142,157, 41, 4, 57, 34,155,159, 14,134,108, 10, 9, + 57,218,111,226,176,158,125, 0, 96,245,234,213, 95,187,184,184,212, 99, 48, 24,137,203,150, 45,251,117,197,138, 21, 52, 81,117, +165,114,190,250, 28,214,220,240, 77, 0,120, 2,104, 0,224, 45,128, 23, 40,159,101,188, 54,248, 44, 56,235,212,169,227, 68, 81, +212, 68, 7, 7,135,175, 50, 51, 51, 47,144, 36,121, 32, 45, 45, 45,253, 83,222,117,104,154,222, 75, 16,196,100,154,166,247,233, +241, 61, 69,159,117,240,120,188, 76,137, 68, 98,175,254,157, 37,145, 72, 28,254,174,237,249, 39,215,245, 15,189,127, 79,186,114, +231, 69, 31,237, 73,189, 58, 55,171,228,142, 66, 52,187,114, 39,166, 75,249,118,158,170, 42,238,129, 4, 77,211, 88,185,114, 37, +177,106,213,170,113,110,110,110,141, 72,146,124,185,124,249,242,114,169,111, 42,206,211,186,206, 13, 98,203,128,207, 21,250, 21, +149,174, 17, 77,253, 77, 32,161,253, 1, 98,108,215,182, 45, 59, 79, 25,221,159,160, 25, 60,140,152,180, 80,169, 55,151,235, 88, + 46, 24,226, 53,222,205, 26,207, 29,210,191, 7,217,198,179, 30,248,118, 22, 0,201,194,222,139, 73, 54,193, 65,203,118, 3,240, +169, 69, 47, 87,188,137, 56,102, 47, 40, 80,129, 32, 0,130, 0, 72, 2, 40,150, 80,232,245,245,152, 21, 0,126,210,243,174, 68, + 90, 26, 19,152,123, 76, 2, 0,140,143,112, 80,234,217,217,217,141,155, 61,123,182,137,167,167,167, 37,143,199,227, 72, 36, 18, +135,132,132, 4,187,101,203,150,121,138,197,226,243, 0, 30,233,201, 89,183,161,179,211,201,224,185, 19,218, 53,111,224, 10,150, +172, 24,148, 84,228,242, 42,225,117,135,169,187, 79, 77,138,201,147, 12, 71, 45, 74, 38,228,228,228, 16, 0, 96,107,107, 75,151, + 23, 89,237,199,110,157,215, 11,115,183, 92, 65,137, 68,118,164, 58, 14,235,122, 45, 70,125,243,205, 64,191,181, 63,204, 52, 77, +203,149, 35, 58, 81, 12,107, 83, 54, 86,204,159,198,145, 74, 21, 29,118,255, 26, 50,121,231,134,133,251, 85, 42,213, 23, 0,218, +168, 84,170,199, 0,126, 93,185,114,101, 85, 55,223, 85, 0,150,168, 79,232,163, 12, 6,227,106,183,110,221,234, 79,156, 56,145, +104,221,186, 53, 34, 35, 35, 27, 28, 59,118,172,199,133, 11, 23, 18, 85, 42,213, 51, 0, 47,161, 46,123,162, 3, 88, 0, 26, 51, + 24, 12,239,127, 51, 39,159,207, 55,146,201,100, 99,156,157,157, 39,119,236,216,209,187,127,255,254, 68,227,198,141, 17, 31, 31, +223,250,210,165, 75, 43,194,195,195,159,165,166,166,238,227,112, 56,135, 5, 2,129,248, 31,127,142, 19,196,100, 0, 78,106,157, +188, 82,135,239,116,148,230,146, 18,232,186, 14,137, 68, 98,175, 41, 97, 67, 16,132,253,223,185, 61,122,174, 43,150, 32, 8,107, +117, 91, 84,247, 77,146, 36,148, 74,165, 72,165, 82,185,213,192,217, 88,253, 34,165,179,214, 5, 80, 93, 34,104, 35, 0,232,213, +169, 89, 30, 8,196,148, 89,180,222,127,201,140, 41, 19, 96, 52,154, 93,185, 27, 99, 93,206, 10, 86,241, 45,118,229, 74, 98,197, +138, 21, 8, 12, 12,236, 15,192,151,162,168,112, 15, 15,143, 29,229, 40, 41,170,108,222,138, 21, 43,182, 87,115,157, 27, 96,192, +231, 2, 63,232, 83, 84,186,202,247, 31,183,193, 93,160,194, 88, 87, 27,123,255, 89, 19,135, 26,121,122, 52,132, 4,166, 72,202, + 81,225, 98,216, 37, 0, 56,161,159,213,105,104, 27, 38, 83,114, 56, 40,112,126, 19,223,118,158,120,158,166,192,227, 52, 21, 74, + 18, 21, 96,144, 10,168, 40, 26,160, 33,169,237, 86,167,230, 43,113,231,165, 12, 36, 1, 48, 72,128, 36, 9, 48,200, 90,146, 81, +178, 87,171, 15, 69,121,230,100, 82, 0, 37,123,245,129, 7,164,153,187,187,251,168, 85,171, 86, 89,102,100,100,152, 68, 70, 70, +130,203,229,194,202,202,138,193,231,243,157,182,108,217, 34,158, 53,107,214, 87,114,185, 60, 9, 64,142,142,156, 30,125,219,120, +223,219, 23,180,218, 66,241,224, 18, 10,142,255, 6, 6, 73,131,109, 98,138,250, 70, 70,184,244, 77, 67,107,255,176,196,211, 15, + 51, 69, 30, 0,210,106, 34,139,139,139, 99, 72,165,210,225,230,230,230,237, 89, 44,150, 3,207,170, 30,149,206,108,147,155, 77, + 52,120,155,101, 95,210,101, 94, 15,135, 62,155,231,116,195,220, 45, 87,176,237,216,253, 95, 90, 33, 99,121,117,121,179,141,141, + 77,167,204,154, 62,209, 52, 53, 71,142, 53,167,115,112,232,118, 33,198,248,154, 97,238,151, 22, 8, 24, 49,204,228,212,111,161, + 83, 0,236,215, 90, 36,222,195,195,131,136,139,139,171,236,230,107, 5, 96,161, 76, 38, 35,217,108, 54,193,227,241, 70,173, 93, +187, 86, 62, 98,196,136, 84, 77, 3, 95, 95, 95,248,250,250, 18, 69, 69, 69, 13,110,220,184,209, 32, 36, 36, 68, 25, 17, 17, 17, + 11,224,108,213, 22, 11,163,119, 18,137,216,133,103,100, 84,242,211,238,221,155,187,116,233, 66,113,185,127,165,159,170, 13, 39, + 0, 88, 88, 88,236,183,183,183, 39, 22, 47, 94,156,254,177, 56,235,213,171,119,165, 93,187,118,221,122,245,234,197,236,212,169, + 19,156,156,156,202,230,217,218,218,194,215,215,151, 72, 73, 73,105, 30, 30, 30,190,251,202,149, 43, 59,158, 60,121,114, 35, 41, + 41,169,215, 63,108,209,218,167, 22, 19, 2, 61,219,127,246, 32, 8,194,116,239,222,189,246,154,154,140, 10,133, 2, 42,149,170, +236, 91,243,161, 40, 10, 42,149, 10,107,215,174, 85,137, 68, 34, 93,246,145, 72,235,173, 89,243,161, 42,251,230,112, 56,182,154, +132,189, 53,220,217, 99,248,220,130,166, 38, 38, 38,174, 0,250,194,174,209,194,242, 13, 74,223,159, 69, 34, 81,178, 64,106, 25, + 3,160, 75, 53,108,150,171, 86,173, 26, 19, 24, 24, 56, 80,203, 74,235, 61,100,200,144,138,101,175,188,213,223, 34,130, 32,110, +146, 36,121, 30,192, 33,124, 68,171,187, 1,255, 45,208, 52,221, 22,128,157,214, 36, 25, 74, 71,133,160,126, 78, 18, 0,108, 42, + 76,215,110,167,249,206, 86, 79,183, 83, 47, 71,107,241,102, 19, 4,241,168,150, 93,188,133, 42,252,180,152, 0, 16, 22, 22, 70, +247,235,215,143,208,124, 87, 46,138,252, 47, 78, 24, 49,160,207, 87,221, 59,130,228, 89,225, 85, 22, 16,241,142, 6,147, 84,128, + 4,141, 7,119,111,208, 96, 82,135, 43, 44, 85,181,245,164,222,224,239,188, 61, 61, 54, 30, 8,154,205,136,205, 98,226, 80,120, + 9,228,146, 98,100,103,188, 67, 86,122, 50, 4,169,111,145,246,238,237, 51,128, 88,161, 51,231,123, 7, 6, 80, 81,234,119, 64, + 10,168, 38,242,178,102, 78,185, 40,174, 65, 99, 79,207,124,142, 10,144,139,226,116, 88,125, 85,156, 94,141, 26, 53, 26,241,195, + 15, 63, 88,191,120,241,194,168,164,164, 68,122,233,210,165,248,164,164, 36,115, 62,159,159, 55,109,218,180, 70, 78, 78, 78,230, +131, 6, 13,226, 28, 63,126,252,107,148, 15,107,173,138,211,115, 64,251,150, 17, 7,119,108, 53,201, 61, 21, 12, 89,194, 83, 92, + 20,136,112, 55,179,132,110, 96,193, 37,190,109,110, 7, 83, 46, 19,171, 59, 57,153,246, 61,147,176, 81, 65, 81, 1,213,113,222, +187,119,143,111,108,108,188,101,228,200,145,252,153, 51,103,114, 85, 76, 75,102,104, 68,174,197,194,221, 17, 78, 37, 82, 57, 99, + 68,183,122,152, 55,210, 27,243,182, 93,215,136,172,201,245,235, 23, 80, 81, 81, 85,115, 42,228,242,250,206,246,230,136, 78, 18, +227,208,237, 66,252,249,131, 19,186,175, 77,199,160, 86, 76,120,212, 53,133, 82,174,104, 60,100,200,144,195,234,183,246, 71, 0, +190, 30, 50,100, 72, 19, 6,131,113, 29,192,239, 53, 29, 35, 30,175,242,234, 41, 86, 86, 86,232,218,181, 43, 60, 60, 60,152, 93, +186,116,241,174, 32, 96,202,113,202,229, 50, 62, 69,209, 48, 51, 51, 51,178,177,177,177, 50, 51, 51,203,173,236, 65,165, 15, 39, + 0, 88, 91, 91, 15,238,218,181, 43,243,216,177, 99, 57,137,137,137, 15, 70,140, 24,241,214,220,220,188,156,245,215,196,196, 4, +141, 26, 53,194,178,101,203,152,125,250,244,169,145,211,193,193,161,103, 72, 72, 8, 8,130, 40,123,104,191,103, 44,118,117,133, +163,163, 35,250,246,237,203, 28, 60,120,112,207,164,164,164, 90, 93, 71,122,224, 90, 37, 22,173,149, 21,142, 83,149,195,111,149, +181,215,225,184,103,105,172, 75,106, 62,124,192,181, 89,237,112, 39,143,199, 43,179, 66, 85,178,174,247, 56, 73,146,196,210,165, + 75, 65, 16, 4, 88, 44, 22,216,108,118,165,223,126,126,126,250,246, 51,133, 32, 8,146,205,102, 47,100, 50,153, 19,165, 82,169, + 51,143,199, 75, 87,169, 84,191, 72,165,210,181, 0, 20, 52, 77, 91, 86, 33,178, 42,229, 52, 49, 49,113,125,245,234,149,123, 85, + 29,145, 74,165,240,246,246, 6,164,136,173,142, 51, 33, 33,193,213,205,205,173, 49, 0, 77,137,182,219, 52, 77,119,209,250,175, +141,219, 52, 77,127,169,254,253,242,205,155, 55,174, 13, 27, 54,204,255,167,206, 79, 3,231,191,143,179, 6, 45, 98, 71, 16, 68, +152,113, 48, 25,151, 0, 0, 32, 0, 73, 68, 65, 84,214,181,218, 79,243,127,209,162, 69, 75,214,175, 95,255,130, 32,136, 48,237, +233,218,237,180,191,213,247,155, 48,154,166,251, 45, 94,188,216,115,195,134, 13,235, 52,109,255, 14,145,168,143, 69,203, 60, 91, + 98,130,240,119,230, 96, 50, 84, 96,146, 4,152, 12, 0, 52,129,228,164, 4, 20, 21, 22,220, 65,226,233, 68,221, 44, 89,254,157, + 90,180,240, 10, 58,186,109, 1,249,115,120, 9, 10, 68, 18,196, 61,185,137, 71, 55,127,207, 80, 41, 85,191,131,160, 31, 3,100, + 36,222, 82,241, 64,104,237,106, 92, 16, 52,179, 84,104,169,197, 85, 57,177,245,201,208,188, 73,147, 38,195,150, 45, 91,102, 27, + 21, 21,197, 19, 10,133, 69, 71,143, 30, 77,151, 74,165, 73, 0, 46, 39, 39, 39, 55,217,190,125, 59, 39, 40, 40,200,203,203,203, +139,127,242,228, 73, 89, 37,229,140,222,227,156, 63, 54, 32, 98,226,172, 57,188,216,147,187,192,137,141,196,210,167, 57,170, 63, + 5, 37, 63, 0,216,134,148,226, 78,217, 18,229,213,173, 93, 93,200,122,102,108, 52,180,228,248,197,229, 73,170,181,100, 25, 27, + 27,111, 9, 9, 9,113,109,219,182, 45, 9, 0,225, 47,149,220,133,187, 35,156, 46,175,239, 68,116,106,102,131,172, 2, 41,102, +239,138,198,165,136,172, 63, 52, 34,171,166, 78,154,153,153,101,167,102, 21, 58,216,152,242, 48,186,179, 41,186,175, 77,135,127, + 27, 46,184,108, 2,241,137, 25,104,232, 86,143,136,190,115,182,141, 90,100,181, 21, 8, 4, 0,208, 6, 64, 98, 74, 74, 10,223, +199,199, 71,168, 69,151, 15, 96, 35,135,195, 89, 74, 16, 4,221,182,109,219,104, 47, 47,175, 98, 43, 43, 43,136,197, 98, 72,165, + 82,176,217,108,136,197, 98, 36, 39, 39,227,193,131, 7,176,178,178,210,235, 64, 21, 23, 23,195,204,204, 12, 20, 69,125, 48,167, + 74,165, 34,246,236,217, 99,242,226,197, 11,147,208,208, 80,135,185,115,231,230, 54,109,218,244,241,176, 97,195, 94,219,219,219, + 75,159, 62,125,138,123,247,238, 33, 63, 63, 31,237,219,183,215,137, 83, 38,147,129,201,100, 66, 44, 22,131,203,229,130,201,100, + 66,169, 84,130,162,168, 50,241, 85, 92, 92,140,188,188, 60,176,217,108,200,100,178, 79,241, 6,250,158,133,170,186,225,183,218, + 88,180,180,133,154,142, 34,171, 38, 75, 84,149,195,157, 5, 5, 5, 70,150,150,150, 11, 1, 8,106, 90, 23, 65, 16, 96, 48, 24, + 96,179,217, 32, 8, 2, 93,186,116,193,132, 9, 19,208,170, 85, 43, 36, 36, 36,224,248,241,227,120,244,232, 17, 88, 44, 86, 89, +123,157,199, 39,252,252, 24, 60, 30,239,222,128, 1, 3, 60,127,248,225, 7, 94,189,122,245, 16, 27, 27, 91,119,195,134, 13, 11, +175, 93,187, 54, 80, 36, 18,181,209,220,237,170,183,210,171,135, 4, 75,135, 11,251, 74,165, 82,196,198,198,234,179,204,123,104, +216,176, 97, 50, 73,146,175, 41,138, 10, 7,224, 77,211,116, 23,130, 32, 46,161,212, 47, 81, 27, 34,154,166,191, 36, 8,162, 16, +192, 51,146, 36, 95, 82, 20,149,108,176,219, 24,160,195,125,165, 95,197,255, 4, 65,132,173, 95,191,190, 95,101,226,170,146,107, +179,220,244, 13, 27, 54,172,211,250,255, 33, 22,213,174, 40,239, 12,239,167,182,114,253, 37,180,194,194,194,170, 87, 32, 20, 6, +133,157, 62,118,191,187, 28,174,158,173,125,181,172, 67, 52, 34, 31,220, 3, 64,255,162, 83, 87,248,253,140, 72, 6,243,151, 61, +235,102,146,123,111,150, 32, 37, 61, 11,247, 46,254,130,108, 65,210, 33,128,158,139,196,208,194, 15, 62, 18,245, 6,121,217,219, +216, 90, 74,228, 52, 40, 26,192,123, 98,235,147,160, 85,227,198,141, 7, 71, 68, 68,216, 74, 36, 18,222,157, 59,119, 74, 66, 66, + 66, 50,228,114,249, 77, 0,119,213,109,162,178,179,179,135,168,133, 9,131,201,100,114,228,114,121,117,190, 11,173,230, 79, 28, +115,103,227,158,131,188,215,207,163,177, 61,244, 34, 10, 74, 74, 84, 55,179,196, 95, 3,208, 40,250,235, 81, 57,226, 52, 26,180, + 11,139, 36,192, 55, 97, 57,198,229, 73,120, 64,229, 67,178, 82,169,116,196,200,145, 35,249, 26,145, 5, 0, 57, 69, 10,102,137, + 84,193,232,212,204, 6,173,187, 13, 65,228,141, 83, 56,121, 59, 13,110,118,198,183,235,155, 20,232,180, 71,179,179, 4,123,182, + 6,239,221,186,113,229,124,206,188,190, 22,240,111,195, 2,143, 77,192,220,152,133,181, 59,246, 43,162, 30,220,126,202,231,243, +195, 0,124, 45, 16, 8,192,231,243,139, 1,188,100, 48, 24,137, 42,149,170, 50,167,238,229, 0, 28, 14, 31, 62, 76, 42, 20,138, +226,132,132, 4, 56, 58, 58,194,193,193, 1, 22, 22, 22,136,139,139,195,159,127,254,137,248,248,120, 80, 20,133, 22, 45, 90,232, +117,176,114,115,115,241,244,233, 83,244,237,251,213,220,236,236, 44,115, 43,107, 27,209,157,240,219,155,106,195, 73, 81, 20, 1, + 0,158,158,158,240,244,244,228,165,165,165, 57,135,133,133,217,175, 89,179,230,157,171,171,235, 81,177, 88, 92,206,114,160,171, +208,210,136, 11,141, 8,228,241,120, 96,179,217, 40, 44, 44, 68,102,102, 38,138,138, 74,131, 54, 45, 45, 45, 63,137,208,170,194, + 66,245,209,218,255,205,226,240,189,225, 78, 75, 75,203,145, 0, 22,234,184, 45, 80, 42,149, 96,179,217,240,241,241, 65,112,112, + 48, 30, 61,122,132,223,127,255, 29,117,235,214,197,216,177, 99, 65,146, 36, 94,188,120,161,111, 23,169,136,136,136,133, 95,127, +253,181,231,225,195,135,121,201,201,201,136,143,143,135,165,165, 37,130,131,131,185,147, 39, 79,110,120,227,198,141,229, 40, 13, +126,169, 30, 90,209,133, 34, 35,254, 80,111,111,239,247,154, 56, 58, 58, 90, 92,190,124,217,190, 76,128, 85,140, 72,124, 31, 5, +203,151, 47,223,234,225,225,177, 77, 61, 92,232, 11,192,132,166,105,191,208,208, 80, 2, 0,252,253,253,105,130, 32, 52, 15,164, +103,167, 78,157,234, 22, 23, 23, 71, 7, 6, 6, 26,124,180, 12,168, 74,139, 76,214, 92,147, 85, 9, 40,125,132,154,182,197, 75, +131,197,139, 23,123,174, 95,191,254,225, 7,138, 44,237, 55, 38, 90, 35,182,202, 30,166, 85, 14, 25,150,217,190, 72,190,163,189, +141,245,162,177,157, 64, 81,128, 82, 5, 40, 85, 52, 68, 37, 98,196, 62,127, 84, 2, 30, 17,170, 83,119,184,156,160, 53, 63,204, +105, 16,157, 74, 34, 61, 95,142, 91,103,247,210,217,130,164,193, 72, 60, 53,254,227,136,172,161,222,142, 14,246,183,142,237, 93, + 77, 62,122, 43,131,138, 42,213, 89, 20, 69,151,253,254, 4,112,180,179,179, 11,184,127,255,190, 29,151,203,229,189,122,245,138, + 58,117,234, 84,190, 92, 46,191,166, 37,178, 0,160, 83,155, 54,109,148,166,166,166, 16,137, 68,114,185, 92, 46,169, 70,100, 57, +251,181,106,126,123,227,158,131, 60,137, 76, 6,161, 88, 10,134,141,125, 69,145, 5, 0, 29,187,185,215,169, 67,240,204, 64, 3, + 72, 42,148,167, 87, 37,178, 0,128,203,229,246,152, 57,115,102,185,186,120,182,102, 44,165, 49,151,165,186, 27,147, 67, 69,222, + 56,133,240, 23, 57, 20,143,205, 80,217,209,111, 27,232,186, 3, 10, 82, 99,246,252,126, 46,236,234,119,203,130,138, 75, 68, 69, +112,115, 50, 66,113,145, 16,107,215,111, 84, 68, 68,132,223, 92, 56,119,106,135, 83,167, 78,109, 64,169, 51, 56, 0,188, 60,117, +234,212,152,101,203,150,253,138,191,210, 60, 84, 68,122, 64, 64, 64,106,179,102,205,132, 30, 30, 30,194,220,220, 92,196,196,196, + 32, 63, 63, 31,219,183,111, 71,108,108, 44, 52, 22, 65,157,124, 85,222, 23, 72,200,207,207, 51,165,105, 26,249,121,185, 38, 63, +252,240,131, 69,109, 56, 85, 42, 85,185,107,171, 78,157, 58,152, 54,109, 26,187,164,164,196,242,221,187,119,230,218,243,116,229, +148,201,100,208, 88,134,104,154,134, 76, 38,131, 80, 40,132, 76, 38,195,235,215,175,203, 68,150,122,253,159,204,162,165,249,205, +227,241, 50, 53,231,178,102, 8,142,199,227,101, 85,213,254, 67,160,181, 46, 90,253, 91, 95,113, 88,227,246,232,120,220,193,102, +179, 49, 97,194, 4, 60,124,248, 16, 9, 9, 9, 96, 48, 24, 16,137, 68, 40, 41, 41, 65,207,158, 61,193,225,112,244,181,104,209, +108, 54,123,228,146, 37, 75,120,137,137,137,200,201,201,209, 56,211, 67,165, 82, 97,238,220,185, 70, 92, 46,119,164,190,166,123, +129, 64,208,251,245,235,215,141, 43,126, 50, 50, 50,132,218, 62,133,181, 69,104,104, 40,225,239,239, 79,251,251,251,211, 26,193, +101,128, 1,149,161, 10, 45,178,175, 42,139,214,199,176,138,105, 44, 91, 80, 7,136,212, 2, 26,145,213, 85, 75,120, 17, 26, 11, +151,110, 67,135,110, 67, 91, 58,216, 88,223, 56,188,107,149,105,216,115, 2,169, 41, 73,200, 22, 36,163, 77, 7, 63,196, 62,143, + 6,165, 80,157,198,235,208,154, 61, 57,235,249,187,123,120, 52,157,222,181,131, 23,130,194,138,241, 42,242, 50, 10,178, 5, 59, +145,116,234,244, 71, 57, 66,174,254,205, 29,236,173,111,252,186,107,149,229,165, 24, 18, 41, 41, 73, 56,251,235, 86, 90, 33,151, + 22,160,124, 36,151,222,111,205, 70,148,140, 83, 92,144, 9, 89,145, 10, 60,178,132,167,231, 32, 69, 6,128,240,173, 91,183,118, +111,223,190, 61, 39, 32, 32, 32, 35, 63, 63,255, 44,128,251, 90,109,154,185,187,187,247, 13, 14, 14,118, 72, 73, 73,193,181,107, +215, 50, 80, 26,250, 95, 21, 82,111, 71, 63,223,253,231,175,251,231, 27, 53,104,130,237, 75,190, 83,134, 62,138, 25, 0,224,146, + 86, 27,143, 30,222,238, 97,107,190,159, 65, 82, 81,127,224,105,114, 38,222, 10,165,127, 86, 69,152,147,147, 67,148,148,148,184, + 90, 90, 90,106,159,144,224,155,136,164, 11,134,186,167,247, 92,120,199, 73, 34, 87,129,203, 34,233,217, 3, 93,211, 31,158, 13, +181,201,145,228, 16,154,104,196,154, 48,105, 88,143,129,187, 66,206,140, 14, 11,187, 48, 93, 46,149,120, 53,105,210,152,126, 28, +113,227,233,194,185, 83,251,212,242,136,155, 62,124,248,144,100, 48, 24,229, 4,186,182,133, 72, 95, 75,145, 62,208,149,179,162, +208,210, 64,169, 84, 18,181,229,148, 74,165,101, 66,171,226,195,189, 50,193,248,119,108,191, 62, 22, 42,237, 33, 67,141, 63,157, + 68, 34,177, 87,251,108, 57,124, 76,139,214,135, 68, 34, 86, 55,124,169, 79,255, 72,146, 4, 69, 81, 96,179,217,104,209,162, 5, +194,194,194, 96,109,109, 13,115,115,115,152,155,155,195,200,200, 8, 54, 54, 54,101, 66,139, 36,117,142,210,161,165, 82,105,221, +186,117,235,226,245,235,215,224,241,120,101, 31, 46,151, 11, 79, 79, 79,136, 68,162, 58,248,148,182,123, 3, 12,248,123,239, 43, + 97,218, 98,137, 32,136,176, 69,139, 22, 45,169, 45,223,162, 69,139,150, 84,102,225,250, 64,193, 85,206,186,197,212, 86,144,149, + 42, 73,181,200, 58,180,115,165,249,153, 39, 64,106,106, 34,174,158,220, 81,164,144,203,242, 41, 74,225,250, 54, 62, 26, 32,241, +139, 78, 93, 32,233,118, 3,251,118, 35,174,190,144,161,176, 32, 27, 47, 31, 95, 78,130,152,179,248,163,137, 44, 7,219, 27,135, +119,173,180, 60,255,156, 64, 74, 74, 18, 46, 29,219, 94,168,144,203,123, 32, 49,244,241,135, 80,143,100,179, 7,178, 93,222,245, +155,232,155, 14, 21,161,194,200,216,184, 47,179, 50, 48, 80,112,167,250,200, 48,109,100,103,103,159,221,186,117, 43,241,227,143, + 63,118,149, 72, 36,191, 1,208, 54, 81,122,185,185,185, 13,223,183,111,159,117, 74, 74, 10,235,206,157, 59,162, 27, 55,110,208, + 0,206,215, 96,113, 89,208,115,252, 52, 70,171,122,117,102, 70, 37,165, 13, 0,240,135,214,108,207,126,173,155,221, 61,184,126, +185,153,226,110, 40,138, 5, 41, 88,124, 55,181, 16,128,206,251, 91,161, 80, 64, 40, 20, 66, 81,156,171,108,195, 23, 9, 3,135, +216, 75, 51,243, 37, 76, 22, 85,162,244, 48,207,146,222,200,125,203, 48, 54, 54,214,107, 95,238, 90, 63, 63, 4, 64,200,144, 33, + 67, 14, 63,139,184,208,134,207,231, 95,240,240,240, 32, 0,160,138, 8,195,170,176, 10,192,220,142, 29, 59, 18, 62, 62, 62, 15, +182,109,219,118,165, 58,177, 82, 27,139, 86, 77,208,149,147,162, 40,178,138,253, 75,212,150, 83,219,162, 85,147,208,250,148, 22, +173,202, 68,139,182, 72,212, 22, 66,255,134,168,195,234,196,148, 62,253,211,248,201,177,217,108, 68, 71, 71,195,197,197, 5,114, +185, 28,102,102,102, 48, 51, 51,131,169,169, 41,138,138,138,192, 98,177,160,231, 54, 83, 60, 30,239, 93, 76, 76, 76, 99, 59, 59, + 59,168, 84,170,114, 98,235,213,171, 87, 48, 49, 49, 73,211,215,162,197,231,243, 47,171,163, 14,203,193,209,209,209,226, 99,236, + 87,109, 75,150,191,191,191, 97,136,208,128,106,173, 89, 85, 88,181,178, 43, 88,162,100, 90,255,179, 81,154,195,173,159,250, 55, + 42,249, 45,171,100, 90,238,250,245,235,111,104,249,119,101,127,224, 38,104, 82, 60,148,139,112, 97,214,100,201,178,183,182,186, +113, 96,123,160,249,201, 72, 32, 45, 37, 17,183, 78, 7, 11,149, 42,249, 23,160,104, 65,196,181,211,161, 32, 80,130,183,161,183, +116,187, 69,160, 85,171,166,174,248,253,133, 2,217,169,175, 64,211,212, 33,100,133,148,124,240,209,113, 27,212,194,222,218,246, +198,161,224, 64,139, 51,209, 4, 82, 83, 18,113,245,100,112,161, 82, 81,210, 29,137,167, 35,107, 75, 59, 1,176, 98,152,240,118, + 15,246,107, 53,212,213,205, 25, 20,173, 0,197,166, 49,104,129, 45,243,101, 84,201,239,225, 60,225, 73,170,152,154,158,118, 95, + 55, 7,186,226,226,226,223, 1, 60, 70,249,244, 10,205, 27, 53,106, 52,116,247,238,221,118,169,169,169,188,168,168, 40,241,222, +189,123,179, 40,138, 58, 3, 64,151,161,212,239,162,146,210, 14,160,124,190,156,230,243,199, 7, 68, 4,140,155,200, 75,188, 22, + 2,171,196, 88,124,127, 55, 93,245, 50, 95, 54, 66,109, 93,171, 20,182,182,182,116, 78, 78, 78,114, 65, 65, 65, 99, 19, 19, 19, +228,230,230, 34, 47, 47, 15, 66,161, 16,210,194, 60,165,141,170, 64, 68, 40,243,192, 98,177,144,149,162,128, 74,165,202,208,213, +154, 5,192,106,213,170, 85,147, 40,138,210,100, 68, 44, 23, 93,168,213, 78,115, 62, 52, 30, 50,100,200, 97,173,168, 67,109,103, +120, 77,122, 7, 66,157,222,161,253, 31,127,252, 17,215,167, 79,159,212,202,196, 10,151,203,213,219, 81,186,170, 40,198,218,112, + 86,101,209,170, 56, 93, 31, 78,205,240,165,198, 9,190,226,116, 13, 24, 12, 6, 40,138,130, 14, 65, 21,127,171,104,209,142, 14, +172,141,200,169,112,108,170, 77, 28, 90,203, 72,196,143,106,209,210, 28, 11, 54,155,141,115,231,206, 97,220,184,113, 80,169, 84, + 48, 54, 54,134,169,169, 41, 76, 76, 76,112,250,244,105,104,210, 63,232,163, 95, 21, 10,197,145,245,235,215, 47,217,179,103,143, + 17, 77,211,224,112, 56,101, 66, 43, 48, 48, 80, 44,151,203,143,232, 36,180, 52, 25,223, 41, 58,198,196, 68, 89,109,212, 97,101, +203, 84,225,175,101,185,106,213,170, 49, 20, 69, 13, 68,133, 20, 14, 21,218,149, 75,253, 96, 72,239, 96,128, 14,247,147, 71,255, +226,238,105, 4, 22,161,101,201, 42, 19, 92,100,117,226,197,206,202,242,198,254,237,129,230, 71, 31, 17, 72,124,251, 22, 55,127, +219, 81, 42,178,222,156,124,130,228,208, 76, 36,134,118,198,219,208,222, 58,191, 61, 17, 68, 43, 39,123, 75,228,137, 40, 20,230, +188, 3,104, 68,125, 12,145,101,103,101,119,227,231,224, 64,139, 83, 79, 72, 36, 38, 38,226,234,201, 29, 66,165, 82,242,197,135, +136,172,145,108,246,192, 70,238,206, 9, 75, 39, 13, 28,234,211,208, 17, 54,239,226,112,126,236, 80,172, 62,254, 13,204,236, 24, +104,215,215, 12, 19,214, 58, 14,229,123,114, 95,243, 59, 99,160, 30,212,218, 34,171, 85,253,250,245,135,222,191,127,223,214,219, +219,155, 23, 31, 31, 47,217,187,119,111,150, 88, 44,190, 2, 32, 90, 15, 78,109,145,213,106,209,228,177, 17, 27,247, 31,230,145, +108, 14,130,142,156,199,172,219,169,170, 11,201,133, 67, 80,126, 88,177, 82, 72,165,210,107,193,193,193, 82,146, 36,145,151,151, +135,156,156, 28,100,101,101,149,125, 23, 20, 20,128,193, 96,224,250,245,235,178,194,194,194,251,186,118,240,222,189,123,245,211, +210,210, 60, 4, 2, 65, 27,245, 39, 30,165,209,133,166, 90,211,218, 8, 4,130,174, 0, 30,105,166,167,166,166,214,123,240,224, + 1,191, 38,126, 51, 51, 51,176,217,236,114, 22, 45, 46,151, 11, 7, 7, 7, 40,149, 74,156, 56,113, 2, 0,242,170,227, 96,179, + 57, 2,146, 36, 64,209,148,148,199,227, 81,124, 62,191, 82,129,165, 15,167, 26,169, 95,126,249,165, 36, 50, 50,178, 82,139, 86, +109, 56,105,154, 46,233,213,171, 23,210,211,211,193,227,241,202, 30,214, 26, 65, 69,146, 36,184, 92, 46, 50, 50, 50, 48,101,202, + 20,208, 52, 93,242, 79,223,121,180,125,154,212, 98,136, 0, 64,168,133,208,123,126, 90,186,250, 64,105,134, 6,105,154,134, 70, +112, 85,152, 95,182, 46, 93,178,183, 87,240,233,154, 92, 80, 80,176,177,180, 59,244,222, 10,223,251,244,120, 40,148, 9,173,216, +216, 88, 28, 62,124, 24, 5, 5, 5,224,112, 56,200,207,207,199,193,131, 7, 17, 19, 19, 3, 14,135, 3,205,190,208, 85,191,249, +248,248,108, 12, 15, 15,143, 25, 49, 98,132, 56, 58, 58, 26, 98,177, 24,209,209,209,232,221,187,183,228,238,221,187, 9, 98,177, +120, 21,116, 25, 58,212,100,124, 87,151,215,145, 74,165,136,138,138,170,244, 83,213, 50, 21,145,144,144,224,170, 82,169, 26,211, + 52,237, 75,211,180, 57,212, 41, 28,212,255,181, 63, 95,170,231,153,211, 52,237,171, 82,169, 26, 37, 36, 36,184, 26,228,132, 1, +159, 41,110,105,137, 45, 90, 75,100,221,170,222,162, 69,145,193, 7,118,172, 52, 63,242,144, 68, 74,114, 2, 30, 95,220, 45, 84, + 81,138, 47,244, 44,135,211, 3, 90,185, 54,120, 70, 38, 94, 20, 81, 26,206, 92,152,147, 2,208,140,218, 8,173,114,156,160,200, +224,131, 59, 2, 45,142, 61, 38,144,158,242, 6,119,207,238, 18, 42,149,210,238,120, 27, 26, 85, 27,206,145,108,246, 50, 22,131, + 88,218,171, 83, 75,118,231,150,238, 48,201, 74, 66, 70,106, 58, 78,196,102,231, 37,228, 75, 39,222, 37,228, 72,126, 35, 61,208, +119,146,181,181,149, 35, 11,253,166,218, 88,223, 63, 95,248, 59,193, 18,201,105, 57,189, 94,112,183,172, 44, 69,249,126,190, 15, + 71, 51, 51,179, 17,143, 31, 63, 54,231,241,120, 70,143, 31, 63,166,246,238,221,155, 43, 22,139, 47, 2,136,208,105,219,223,135, +115, 91,119,183, 91,235,118,237,231, 21,139, 74, 32,146,201,193,117,224,171,206, 68, 60, 31,140,170, 19, 96,150,227,228,114,185, +199,142, 29, 59,214,183, 75,151, 46,174, 94, 94, 94,100, 94, 94, 30,138,139,139,203,156,171,237,236,236, 16, 27, 27, 75, 37, 38, + 38,166,115,185,220,227,186,246,179, 99,199,142,137, 36, 73,198,171,135,209,226, 81, 33,186, 80,171,105, 99,129, 64,208,150,207, +231,223, 2, 96,172, 21,117,168,205,169, 73,239,176, 4, 0, 73, 16,196,163,232,232,232,226, 62,125,250,192,200,200, 8, 34,145, + 8,117,235,214,133, 82,169,196,197,139, 23, 17, 25, 25, 41,162, 40,234, 86, 37,226,181, 92, 63, 37, 18,113, 93, 0,164,184,164, +164,197,152, 49, 99,186,206,155, 55,175, 92, 72,186,189,189, 61,172,173,173,245,226, 4,128,188,188,188,166,127,252,241,199,156, +232,232,232,239,250,246,237,107,177,100,201, 18,110,253,250,245,161, 82,169,200,218,114,230,231,231, 91, 68, 69, 69,109,234,220, +185,243,140, 62,125,250, 48,215,173, 91, 7, 11, 11, 11,168, 84, 42, 24, 25, 25,161,176,176, 16,171, 86,173,194,157, 59,119,148, + 52, 77,239, 18, 10,133,223,235,121, 46,225, 67,175,205,170, 44, 64, 85,165,100,168,162,253,223,222,207, 10, 62, 93, 80,167,112, + 88, 88, 69, 6,123,232,122,206,107,132, 22,131,193, 64, 82, 82, 18,246,238,221,251, 94, 30, 45, 77,250,135, 42,184, 43,219,118, +250,230,205,155, 42,130, 32, 58, 60,126,252,120,225,232,209,163, 39,138, 68, 34,103, 19, 19,147,116,133, 66,241,139, 88, 44, 94, +139, 82,127, 84,182, 62,247, 16,145, 72,148, 92, 89,212, 97,197, 54,128,101,181,156, 21,210, 59,148, 75,225, 80, 97,153,114,169, + 31, 42, 73,239,240,183, 31,119, 3,231,191,146,243,115, 23, 91, 85, 39, 44,125, 15,173, 38,179, 88, 98,133,119,120, 2,241, 33, + 34,235,125,107,137,164, 36, 97,249,177,119, 45,101, 82, 9, 68,194,204,151, 72, 58,145,245, 65,155,165,238,231,237, 4, 2, 73, +137,111,240, 48,108, 87,105, 63,223,134,214,186,159, 4,176,248,167, 75,161,108,194,194, 26, 79,231,140, 67,122,129, 8,151,222, +230,159,164, 75,164,211,143, 0,249,184, 3,144, 74,105,248,193, 31, 50,118,251, 14,178, 24,106, 91,135,133, 45,243,127, 1,111, +145, 13,187, 93,247, 46,250,212, 64,204,224,241,120,225,219,183,111,239,225,235,235,203, 29, 50,100, 72,101, 14,242,250, 34,245, +209,171, 55, 63, 93,216,179,121,190,141,119,123,236, 92,182, 64,117, 44,226,121,197, 40,196,106,225,225,225,161,186,119,239,222, +188, 41, 83,166,108,233,209,163,135,211,128, 1, 3, 56,117,235,214, 5,151,203,197,155, 55,111, 16, 30, 30, 46,123,251,246,109, +122, 73, 73,201,188,230,205,155,235,147,227, 44,127,249,242,229, 27,213,235, 32,212,195,133,109,160,142, 46,212, 52, 82, 39, 45, +109, 3,192, 56, 48, 48,112, 52, 0, 84, 17,246,189, 28,192, 30, 0, 76,154,166, 51, 66, 66, 66, 58,156, 61,123,182,195,220,185, +115,217,125,251,246,197,253,251,247,113,245,234, 85,185, 92, 46,143, 80, 11, 87, 93, 75,229, 80, 0,162,148, 74,229,243,160,160, +160, 14, 12, 6, 99,185,102, 70, 76, 76, 12, 14, 29, 58, 84, 27, 78, 37,128, 77,153,153,153, 63,133,132,132, 44,191,118,237,218, +248, 49, 99,198,152, 43, 20, 10,196,198,198,226,231,159,127,174, 21,167, 80, 40,156, 99,107,107,187,244,226,197,139,191, 92,185, +114,229,235, 81,163, 70,145,179,102,205, 66,112,112, 48,126,251,237, 55, 74,165, 82,157,101,177, 88, 99,114,114,114, 68,159,226, +174,163, 30,134, 75,215,179,214, 97,141,188, 31, 50, 52,168, 35, 4, 31, 74,160,217, 14, 63, 63,191, 50, 43,163,198, 10,167,221, +134, 32, 8,189,135, 14, 1, 88,210, 52, 77, 1,216,133,210,250,162,218, 89,225, 25,248, 43,115,188,174,140,205, 4, 82,203, 24, + 72, 17, 91,125, 81,105, 75,128, 70,179, 26,216, 10,150, 47, 95,190,117,197,138, 21, 91, 43,166,112,208,110, 84, 49,245,195,202, +149, 43, 97, 72,239, 96,192,127, 21,149, 11,173,168,125, 10, 69,131,193, 75,182,175, 91,176, 66,169,144, 9,105,200,253,241,230, +116,244,135,174,140,166,232, 69,215,143, 6, 6,131, 70, 62,173, 82, 46,252,224,222,255, 77,253, 36, 44,172, 81,180,106, 26,126, +123,145, 78,103,136, 20,223, 28,145,203,203, 89,131, 74,125,178,168, 97, 55, 36,249, 39,172,156, 88,103,230,124, 97, 67, 92,200, + 27,173,247,122,178,178,178,206,109,221,186,149,220,188,121,115,215,146,146,146,138, 14,242,181,197,130,254, 51, 23, 49,218, 53, +114,157,249,240,117,242, 64,232, 48, 92, 88, 17, 29, 59,118, 20,196,197,197, 5, 92,185,114,101,196,237,219,183,123,136, 68, 34, + 87,130, 32, 96,108,108,156, 44,149, 74,175,113,185,220, 99,122,138, 44, 0,192,138, 21, 43,232,149, 43, 87, 18,113,113,113, 52, +131,193,248, 19, 64, 34,131,193, 72,210,118,130,215,158,174, 89, 38, 48, 48, 80,151, 7,226,237,226,226,226,200, 85,171, 86,117, + 89,181,106, 85, 11,181, 85,232, 54,254,242,249,210, 23, 10, 0,183,217,108, 78, 58, 65, 16,206,108, 14, 87,116,239,222,189,107, + 31,200, 89, 34,151,203, 23,166,164,164,108,217,178,101,203, 90, 19, 19,147,182, 49, 49, 49,127,126, 8,167, 90, 68, 13,182,182, +182,118, 58,124,248,240,169,131, 7, 15,182,103, 50,153,247, 9,130, 24, 34, 20, 10, 63,105, 81,105,117,129,232,149,122,212, 58, +212,137,247, 99, 39, 41,253, 59,132,155, 74,165, 42, 94,186,116,105, 86, 69,225, 85,209,122,165,249,175, 78,229,162,203, 62,213, + 39,138,178, 6,225, 66, 20, 3, 64,105,237,194,210,178, 58,186, 22,149, 6, 32,174,233, 58, 39, 73,242, 44,128,151, 36, 73,190, +174, 24,232,162, 61,111,229,202,149, 53, 93,231, 6, 24,240, 89, 67,135, 59, 91, 32, 9, 4,214,214,147,246, 31, 52, 87,126,156, +126, 6,176,217, 43, 73, 96, 62, 0,130, 6,182, 28,145,203,127,168,110, 65,199,142, 88, 75, 19,152,171,222,153,235, 50,238, 98, + 77, 45,182,189, 14,116,168, 63,168, 39,103, 19, 84, 95, 80,246, 61, 78,127,127,127, 70, 21, 15,243,114, 69,165,171, 66,104,104, + 89, 22,255,170,250,169,125,190,153, 61,120,240,192,201,199,199, 71,128,242, 78,255,149, 77,167,245,220,118, 6, 0,213, 71,222, +159,159, 5,167,155,155, 27,231,205,155, 55,178,127,215,181,105,224,252, 87,114, 90, 54,117, 1,129, 73,208,206, 29, 84,173, 69, + 75, 75,160,209,244,207, 40,136, 77,169,162,159,154,235,220, 50, 33, 33,193,181, 97,195,134,201, 0, 10, 42,244,163,178,121,180, +225, 24,253,223,115, 86,134,201, 40, 95,138,206,128, 74, 14,132,129,211,192,105,224, 52,112, 26, 56, 13,156, 6, 78, 3,103,109, +133,214,103, 13, 18, 6, 24, 96,128, 1, 6, 24, 96,128, 1, 6,252, 45, 32,170, 81,165,250,152, 4,107,163,108,175, 25, 56, 13, +156, 6, 78, 3,167,129,211,192,105,224,252,191,227,172,137, 91,123,249,207,117,232,240, 31,235,183,193,172,106,224, 52,112, 26, + 56, 13,156, 6, 78, 3,167,129,243, 67, 4,203,103, 13, 38, 12, 48,192, 0, 3, 12, 48,192,128,207, 6, 61,220,193,103,170, 64, +254,241, 70,167, 32,170, 26,209,199, 13,117, 0,224, 99,241,253,159,130, 15,224, 43,173,255, 23,160,142,140, 55, 8,173,207, 23, +141, 0, 44, 1,160, 93,139,236, 33,128,245, 21,218, 29, 5,160, 93,144, 80,132,210, 58,129,175,245, 89, 25, 73,146,235,187,116, +233, 50,253,206,157, 59,155,149, 74,229,170, 90,244,215,149,207,231,111, 36, 8,162, 53, 0, 22, 65, 16,111, 50, 51, 51,215, 43, +149,202, 15,137, 90,105,224,232,232,184, 1, 64, 75,146, 36, 89, 4, 65, 36,100,102,102,174, 81, 42,149, 55, 63,128,211,204,193, +193,161, 19, 77,211,142, 0, 24, 44, 22, 43, 55, 45, 45,237, 1,106,153, 91,201, 63, 48,150, 93, 40, 82,178, 0,192,220,132,169, + 8, 13,108, 42,215,117,154,225, 20, 55,192,128,255,111,208,165,145,201,229,208,219, 13,107,105, 37,190, 87, 1, 68,175,250,216, +113, 57, 17,223, 87,181, 60, 81, 73, 84,115, 69,206,222,110, 88,171,162, 75, 57,122,185, 97,211,229, 55,168, 54,210, 94, 23, 78, + 13,246, 1,228,100, 29,170, 20, 16,186, 69, 95,255,219,241, 21,202, 15, 21,150, 13, 29, 86, 43,180,134,185,131,175, 98,130, 25, + 26, 11, 77, 24,175, 25,128, 22,234,135,252,107,148,230, 42, 42,250,192,206,125, 46,156,255, 54, 44,167,105, 58,160,220,201, 90, + 73, 30,162, 47,190,248, 98,192,149, 43, 87,140, 53,245,238, 40,138,130,145,145,145, 18,192, 88, 61,214,101, 63,108,216,176, 69, + 7, 14, 28,192,208,161, 67,151,134,133,133,109, 5, 80,172,235,194, 86, 86, 86,254,150,150,150,193,251,247,239,183,107,223,190, + 3,193,225,112,240,230, 77,130,243,148, 41, 83,188,226,226,226,206,102,101,101, 77,212,119,227,173,173,173, 71, 90, 90, 90,110, +217,187,119,175,109,231,206,157, 65, 16, 4, 34, 35, 35,157,231,204,153,211,226,221,187,119,199, 51, 51, 51,103,232,203,105, 99, + 99,227,110, 97, 97,209,109,231,206,157, 70,157, 58,117, 2,143,199, 67,116,116,180,233,212,169, 83, 29,211,210,210, 98, 51, 51, + 51,111,233, 43,178,158, 69,158,255, 90, 41,151, 6, 1, 0,147,205, 93,208,126, 75,196,249,103, 55,206,247,175,105,154,127, 96, +236,239, 6,177,101,128, 1, 6,104, 99,164, 19, 28,105, 26,243,175,252,188,140, 4,128, 94,227, 87,207, 26,233,132,205, 71,210, +171,174, 97,171, 39,223,247, 99,234, 32,248,112, 26, 50, 63,164,159,251, 0,114, 14,147, 57,171,157,143,143,237,183,119,239, 38, +200,129, 95,254, 79, 14, 81,165,195,156, 85, 10,173,193, 77,177, 74, 89,106, 49, 33,250, 52,196,241,171,137,140,240, 47,190,248, +162,225,132, 9, 19,136, 86,173, 90, 33, 50, 50,210,253,248,241,227, 95, 93,184,112, 33, 65,165, 82, 69, 2,120, 1,221,179, 90, +179, 0,120, 50, 24,140,214,255,114,206,127, 51, 76,212,226, 42, 19,127, 37, 58,125, 47,225,233,245,235,215,207, 49,153, 76,141, + 69,171,157, 72, 36,114,168, 96, 5,211, 5,245, 20, 10, 5,226,227,227, 65,146, 36, 11, 64,125,188, 95, 82,163, 42, 56, 27, 27, + 27,239,142,120, 24,105, 67, 48,141,144, 47, 1, 32,145,131, 99,234,128, 3,135, 66,172,231,205,158, 49,248,230,205,155,225, 69, + 69, 69,191,234,209,159,250, 38, 38, 38, 91,159, 62,125,106, 99,108,108, 12,138,162, 80, 84, 84, 4, 71, 71, 71,236,223,191,223, +114,222,188,121, 1,133,133,133, 55, 37, 18,201,111,250,136,115, 11, 11,139,110,207,159, 63, 55,210, 20,148,150,201,100,112,118, +118,198,209,163, 71,185,179,102,205,106, 90, 80, 80,144, 42,147,201,222,234, 74, 88, 40, 82,178,148,114,105,208,225, 93,129, 46, + 0, 48,102, 70, 96, 16,167,200,252,162, 46,211, 10, 69,202, 11, 0, 12, 66,203,128,127, 26,173,109,109,109, 67,115,114,114,110, + 1,152,136,143, 99,105,112,231,241,120,205, 41,138,114, 36, 73, 18, 12, 6, 35, 67, 36, 18, 61, 5,240,170,182,132, 54,110,126, +253,193, 53, 30, 7,154,106, 65, 2, 32, 72, 50, 90, 37, 47, 57,148,251,234,230,249, 15,226,228, 24,141, 7,232, 22, 36, 64, 17, + 36,249,148, 82,150,236,207,137,191,121,233,223,114,112,238, 11,209,216,205, 81,247,194,152, 31,131,111,120, 3,240, 73, 10,228, +209, 36,221,135, 21,103, 2,125,103,207,158,237, 56, 99,250,116, 98,220,216,177,141,110,221,185, 67,116,213,167, 90,193,231,137, + 42, 29,223, 43, 21, 90,254, 77, 97, 69, 3, 11,143, 7, 47, 33,153, 12, 6, 49, 98,246,250,128,131,187, 54,145, 61,251, 15, 41, + 27, 62,241,245,245,133,175,175, 47, 17, 20, 20,212,232,207, 63,255,108,116,244,232, 81,101, 68, 68,196, 83, 0, 39,170, 90, 89, +111, 55,136, 41,128,199,102, 49, 69, 35,150,253,186,215,199,199, 7, 92, 46, 23, 31,194, 9, 0, 61, 27,146,111, 89,214, 13,158, +142,152,185, 60,185,125,251,142,244,199,224,252,140,240, 16, 40, 43,106,109,229,226,226,210, 73,169, 84,242, 0,128,201,100, 74, + 82, 82, 82,102,162,180, 54, 32, 0,156,165, 40,106,128, 30,220, 36,128, 21, 3, 6, 12, 88,250,237,183,223,162,110,221,186,152, + 53,107, 22, 20, 10, 69,228,165, 75,151,150, 3,216,128, 26, 46, 30,123,123,251,229,187,119,239,182,102,114, 76,208,106, 97, 34, + 4, 5, 74, 0,128, 41, 23, 56, 55,141,198,172, 89,179,204, 31, 63,126,188, 70, 31,161,101,111,111,191,106,255,254,253,214,198, +198,198,160,105,186,172, 22, 99,113,113, 49,138,139,139, 49, 99,198, 12,243,216,216,216,141,250, 8, 45, 7, 7,135, 78, 59,119, +238, 52,226,241,120, 40, 46, 46,102,203,229,114,162,168,168, 8, 37, 37, 37,180, 76, 38,147,207,156, 57,147,251,226,197, 11, 63, +129, 64,240, 22, 6,252, 91,192, 0,240, 13,139,197, 26,212,176, 97,195, 54,175, 95,191,126,162, 84, 42, 79, 3, 56,253, 17, 94, +166,186, 59, 57, 57,173, 77, 79, 79,223, 9, 32,228,255,101,135, 58, 56, 56,156,190,119,239,158,203,238,221,187,199,110,222,188, +249, 34,128,223, 62,128,142,205,102,179, 7,119,237,218,213,101,204,152, 49, 28, 7, 7, 7, 72,165, 82, 36, 38, 38,154,159, 60, +121,210, 53, 58, 58, 58, 85, 93, 17, 67,231, 23, 10, 27,247,142,166, 96,154, 31,239,208,177, 83,231,161,131,191, 49,115,176,177, +128, 88,166,194,235,100, 65,221, 63, 46,158,235, 26,199, 54,186, 39,151, 11,135,231,190,186, 87,172, 47,103,183,110,221, 59,247, +232,222,221,204,194,210, 2, 66,145, 28,111,146,210, 92,111, 92, 61,239,203,100, 26,221,166, 8,197,168,172,231, 87, 75, 62,229, +177,153, 5, 48, 69, 60,155,230, 45, 58,182,122,220,107,194,154, 54, 52, 77,131,164,177,163,162, 53,107, 22,192,220, 81, 90,246, + 75, 47, 62,208, 52, 77, 16,216,164,109,205,234,237,134,181, 52,141,239, 65,130,232, 93,195, 48,165, 6,189, 0,174,165,181,181, +207,212,201,147,137,162,194, 66, 68, 71, 71,151, 84, 20, 89, 91,235,128,125,155, 68,189,179, 41,181, 23,219,255, 82,107, 86,165, + 67,135, 58,231,209, 50, 54, 54,174,116,186,133,133, 5,186,117,235,134,245,235,215, 51, 1,180,174, 48,187,124,145, 85,128, 27, +182,103, 49, 44, 76,184,100,221,186,117,205,204,205,205, 63,152, 19, 0, 64, 83,245, 59,214,165,191,124,244,235,146,177,215,142, +110,241, 20, 21, 21,176, 42, 54, 49, 53, 53, 69,227,198,141,177,116,233, 82,221, 56, 63, 28,255, 40,167,163,163, 99, 19, 95, 95, +223,214,215,111,221,178, 76, 79, 79,231,166,167,167,115,175, 92,191,110,217,161, 67,135,214,142,142,142, 77,202,118, 21, 77,235, +211,207,213,187,118,237, 90,126,246,236, 89,210,215,215, 23, 86, 86, 86,232,214,173, 27, 46, 94,188,200,220,188,121,243, 58, 0, + 75,107,234, 39, 73,146,157,125,125,125, 9,208, 52, 50,132, 74, 60, 88,223, 4,209,155, 60, 80, 36,161,145, 39, 44,132, 88, 44, +129,177,177, 49, 15,165,195,189,186,110,123,199, 14, 29, 58, 16, 0,202,196, 85, 81, 81,233,167,184, 88, 4,153, 76, 14, 46,151, +107, 6,128,167, 43, 39, 77,211,142,157, 58,117, 2, 0,200,229,242,178, 55,188,130,130, 2, 66, 40, 20, 66, 38,147,129,197, 98, +177, 81,179, 95, 99, 25,167,185, 9, 83,193,100,115, 23,140,153, 17,152, 50,102, 70, 96, 10,147,205, 93, 32, 51, 43, 84,233, 50, +205,220,132,169,248,196,231,167, 29, 73,146, 63,187,185,185,197,146, 36,121, 24,128,227, 7,114,182, 5,176,206,200,200,232,154, +135,135, 71,138,177,177,241,117,181, 80,239, 80, 75, 78,142,177,177,241,245,117,235,214,157,122,242,228,201,208, 63,255,252,179, +254,179,103,207, 6, 7, 5, 5, 29, 55, 53, 53, 13, 71,121,191, 68,189,175,205,250,245,235, 31,124,240,224, 65,219,142, 29, 59, + 30, 0,192,253, 72,215, 59, 3, 64, 75,232, 84,145,227,147, 28,119,167, 86,173, 90,185,240,120, 60,244,232,209, 3, 0,252, 62, +132,147,205,102, 15, 94,186,116,169,219,178,101,203, 56, 2,129, 0,215,175, 95,199,195,135, 15,161, 84, 42, 49,109,218, 52,238, +152, 49, 99, 26,152,153,153, 13,214,171,159, 76,243,227,179,231,204,237, 51,127,214, 36,179,167,239,228, 56,116,237, 29,126,143, + 16, 32,171,132,131,254,131,199, 88,244, 30, 56,172, 55,135,107,113, 92, 95,206, 69, 11, 23,246,153, 60, 62,192, 44, 70, 64,225, +220,253, 12,220,143, 23, 66,201,178, 68,223,193, 19,173, 90,116,234,243, 21, 19,172, 95, 62,245, 49,218, 15,180,159, 61,123,182, +221,130, 77, 71,238, 58,181,253,102, 71,118, 62,124,181,133,143, 59, 96,105,109, 98,242, 77,124,215,174,147,140, 74,235,197, 86, +203, 89,142,175,245,192,224,172,124,116,209,246,207,234, 98,141, 70,234, 97, 69,198,149,159,151,145, 52,129, 89, 35,157,202,221, + 7, 42,237,231, 77, 96,232,236,185,115, 89, 22, 86, 86,216,181,107, 23,164, 34, 81, 57,159,217,238, 46,232,115,205,152,153,218, +192,195, 57,182,155, 43, 17,254, 31,124, 95,153, 92,165, 69, 43, 44, 44,140,238,215,175, 31, 1, 0,161,177,200, 31,220, 20, 27, +135,125,187,110, 41, 65, 18,116, 61,207,142, 49,117,220,154,137,108,108,108, 80, 82, 82, 2,169, 84, 10, 54,155, 13,137, 68,130, +119,239,222,225,254,253,251,176,178,178,210,171, 39,133,133,133, 48, 53, 53,133,169,169,233, 71,225, 92, 60,182, 7,247, 77, 74, + 54,247,242,253,155, 93,183, 79,255,173,189, 91, 75,191,103,221,135,205,122,110,110,231, 36,121,246,236, 25,238,221,187,135,252, +252,124,248,248,248,252, 87, 14,230, 67,181, 79,214, 67, 0, 86, 13, 27, 54,116,190,124,237,182, 85,177,132, 50, 79,202, 84,176, + 40,138,130,177, 49, 95,121, 34,244,156,112,232,224,254, 68, 70, 70, 70, 22,128,135,106,113, 91, 83, 77, 69, 30,128, 38,254,254, +254,139,166, 79,159,142,132,132, 4, 76,154, 52, 73,252,240,225,195,220,142, 29, 59,218,236,223,191,223,104,222,188,121,184,117, +235,214,138,176,176,176, 51, 0, 18, 1, 84, 90,171,141,166,105, 54,155,205,134, 82, 45, 27,228, 42,170, 76,223, 23, 22, 22,130, + 22,231,131,205,102, 51, 0,216, 65, 71, 63, 58,138,162,216, 44, 22,171, 76,100,189,203, 44,196,187,172, 18, 20, 22,203, 32, 22, + 43, 33, 19,211, 96, 24,219, 48,129, 36, 7, 0, 73, 80,170, 87, 0, 0, 0, 32, 0, 73, 68, 65, 84,186, 90, 71,120, 60, 30,148, + 74, 37,138,138, 74,187,161,177,148,201,100, 50, 8,133, 66, 48, 24, 12, 83, 0,230, 0,242,116, 33, 84, 59,185,255,174, 30, 6, +196,163, 35, 3,108, 95, 95, 88, 92,110,154,185, 9, 83, 17, 58,175, 41,195,198,185,197,157,150, 67,127,241, 40,155,246,105,253, +179,184,118,118,118, 55, 78,157, 58,213,180, 81,163, 70, 72, 76, 76,244, 24, 50,100,136,143, 64, 32,104, 9,253,107, 50, 26,147, + 36,185,113,204,152, 49,211, 71,140, 24, 65,184,187,187,131,201,100, 66,169, 84, 58, 39, 36, 36,116, 59,121,242,228,194,131, 7, + 15,238, 87,169, 84,223, 65,119,191, 63,146,195,225,156,216,187,119,111, 23, 31, 31, 31, 28, 62,124, 24, 15, 31, 62,164,218,182, +109, 75,142, 30, 61, 26,174,174,174, 62,163, 71,143,254, 93, 42,149,246,173,165,101,203,181, 67,135, 14, 46, 12, 6, 3, 29, 59, +118,100,223,187,119,175, 21,128,123, 31,184, 79, 77,157,157,157,111,249,249,249,181,188,118,237, 90, 84, 70, 70,134,159, 30,219, + 11, 0, 3,157,156,156,130, 44, 44, 44,172,244,184,199,150,164,165,165,125, 15, 32, 84,199, 69,218,183,110,221, 26,201,201,201, +104,210,164, 9,216,108,118, 7,185, 92, 62, 5, 64, 31, 0, 63, 0,136,213,163,191,238,221,187,119,119,241,243,243, 35, 66, 67, + 67,203,252, 67, 73,146,132, 82,169, 4,155,205, 70,251,246,237,201,200,200,200, 58,143, 30, 61,114,135, 14,195,136, 54,110,126, +253, 59,118,238,218,185,139, 79,115,114,115,232,107,168, 40, 21, 24,132, 18, 76,130, 2,165,224,130,203,102,192,221,179, 13, 35, +254,197, 83, 31,153, 84,222, 63,247,213,181,243,186,112,246,233,213,211,183,105, 19,119,114,251,239,111, 80,144, 22,171, 74,139, +187,157, 67, 50, 72, 52,109,253,133,173,123,179,150,140,150, 62,126,172,244,196, 23,221, 36,146, 46, 61,242, 19,110, 95,251, 20, + 23,228, 74,128,225, 92,199,246,155,126, 61,253,216,130,244,116,209,201,208,243,207, 75, 20,184, 15, 0,183, 0,162, 47,208,220, +187, 93,187,174,251, 55,108,176,225,243,249,172, 81, 35, 70, 40,247, 69, 69, 69,161,138,161,223,149, 0,195,214,209,177,199,212, +169, 83, 25,130,244,116,250,228,233, 11,207, 52,124, 40,125, 75,241,110,238,236,209, 15,162,120,189,134, 41,251, 3, 28, 7, 71, +199,166, 83,166, 76, 65, 70,122, 58, 14,135,132, 20, 75,128, 8,141, 21,235, 28, 3, 59,155,185, 57,142, 91, 48,113, 0,225,194, +183,197,212, 21,251, 58,116,147,103,185, 65,240,215,241,215,214, 34,159,177,200,154, 92,169,208,170,136,223, 98,177,220,140,141, +250, 39, 79, 30, 35,179,139,228,162,132,132, 4,216,218,218,130,207,231,195,194,194, 2, 49, 49, 49,184,126,253, 58, 94,190,124, + 9,138,162,208,162, 69, 11,189,122,147,147,147,131,167, 79,159,194,202,202,234,163,113,186,185,216,225, 91, 23, 59,118,102,110, + 33,251,218,195,151, 62,251, 22, 15,110, 70,122, 12, 62,168, 93, 36, 86, 38,147,225, 63,130,178,232, 66, 23, 23,151, 78,135, 14, + 29, 98, 75,149, 48,115,159, 18,241,163, 72,162, 50, 1, 0, 19, 30, 67, 20, 25,212,248,187,213,171, 87,139,198,143, 31,239,145, +146,146,178, 94, 7, 91,255,218,238,221,187,207,167,105,154, 53,123,246,108, 0,192,152, 49, 99, 10,239,223,191,239, 14, 32,235, +250,245,235, 78, 19, 38, 76,120,117,227,198, 13,227,185,115,231, 50,148, 74,101, 12,147,201,164,195,194,194, 86, 1, 8,124,239, +137, 72,146,143,163,162,162,234, 57,185, 54,134,171, 13, 9,223,165, 47, 75,111,112,198, 20, 82,147,222, 32,238,217, 67, 56, 58, + 58, 90,240,249,252,216,212,212, 84,121, 90, 90,218, 66,145, 72,180,187,134, 62, 70, 71, 70, 70,242, 93, 93, 93, 81, 92, 92,140, +212,236, 18,204, 58,109,140, 66,113,169, 17,131, 5, 49, 90,186, 52, 54, 51, 34,101, 15,179,178,178,228, 50,153,108,153, 80, 40, + 60, 84, 29, 39,139,197,202,125,246,236,153,105,221,186,117, 33,145, 72,232,188,188, 60, 66, 36, 18,161,168,168,136,184,112,225, +194,215, 2,129,160,109,253,250,245, 9,103,103,231, 85, 2,129, 64,156,150,150, 54, 73,151,161, 73,181, 96, 82, 49,153,204,205, +147, 39, 79, 30,122,230,204,153,199,161,129, 77, 7,106, 13,151, 88,120,122,122, 94,110,222,188,153, 83,200, 38,239, 29, 0,126, +252, 23,156, 91,227,150, 44, 89,210,212,218,218, 26, 83,167, 78,197,202,149, 43,177,124,249,242, 70, 83,167, 78,157, 12, 96,171, + 30, 60, 70,142,142,142,143,182,111,223,238,209,169, 83, 39, 92,188,120, 17,199,142, 29,195,219,183,111,149,245,235,215,103,250, +248,248, 96,197,138, 21,232,221,187,247,164,153, 51,103,118, 77, 79, 79,111,165,163,248, 24,191, 98,197,138,129,157, 59,119,198, +216,177, 99,165, 55,111,222, 28, 10,224,202,213,171, 87,191,184,117,235, 86,232,145, 35, 71,140,214,173, 91,215, 99,222,188,121, + 83, 1, 4,215, 98,251,191,238,210,165,180,134,114,231,206,157, 17, 20, 20,212,251, 3,133, 22,199,198,198,230,194,225,195,135, + 91, 54,110,220, 24,163, 70,141,106, 53,116,232,208, 11,249,249,249, 61, 1,232,116, 67,170, 83,167,206,198,179,103,207, 54,172, +106,100,161, 50, 72,165, 82,235,111,190,249,102, 67, 82, 82,146, 94, 66,235,232,209,163,248,254,251,239,209,162, 69,139,230,237, +219,183,223, 51,101,202, 20,248,251,251,119,143,137,137,113, 64,105,212,114,141,224,241,120,205,135, 15, 31,206,121,240,224, 1, + 0,192,211,211, 19, 45, 91,182, 68,114,114, 50, 30, 63,126, 12,169, 84, 10, 7, 7, 7, 12, 26, 52,136,151,148,148,212, 60, 39, + 39,167, 70,161, 69,114,141,199, 13,236,215,215,236,220,125, 1, 84,148, 18,109, 26,154,195,199,195, 30,241,169,133,136,140, 77, +133, 74,198,134,185,181, 13, 58,116,237,101,157,145,246,118, 92, 46, 80,179,191, 22,215,120,220,160,129, 95,153,158,139, 72, 71, + 65,122, 28,253,250,225,153,235, 10,137,104, 18, 0, 60,254,243,248, 30, 71, 27,163,158,238,173,219, 48,252,122, 14,176, 58,125, + 44, 99, 92,254, 63, 83,219,239, 61,220,114,193, 94, 87, 86,206,152, 5, 1,190, 52,203,202,249,161,153, 66,177, 83, 51,175, 55, +208,107,225,146, 37,237, 39, 78,158,204,163, 40, 10, 71,126,253,181,240,105, 84, 84,252,100,128,154, 82, 5,223, 78,192,117,232, +192,129, 92, 51,115,115,204,153, 53, 11,102, 10,197,141,178, 93, 2,116,159, 51,127,126,167, 25, 51,102, 24,237, 89, 53,253,113, +239, 9,107, 90, 83, 52, 77,104,134, 41,143, 86,111,138,107, 59, 97,224, 64,152,153,155, 99,246,236,217, 32,228,242,203,101, 2, +138,137, 27,227,191,246,245, 9,232,223, 25, 4, 8, 28, 11,187,131,215,201,217,207,110, 8,240,230,115, 85, 85, 21, 80,165,143, + 86,181, 67,135, 69,114,100,118,255,106,176,192,221,221,189,168, 81,163, 70, 69,185,185,185,120,254,252, 57,242,243,243, 17, 28, + 28,140,184,184, 56, 80, 20, 85,107, 1, 67, 81, 20, 62, 54, 39, 0, 56,216,152, 99, 84,223,118, 76,169, 68,196,203,206,206, 46, + 55,124,244, 31, 18, 90,101, 80, 42,149,188,250,245,235,131, 4, 8, 97,137,194, 52,227,104, 23, 34,227,104, 23, 66, 88,162, 48, +149,201,100,164,169,169, 41,164, 82, 41, 79, 7, 42,214,151, 95,126, 57,255,204,153, 51,172,181,107,215,194,203,203, 11,114,185, + 28,247,239,223, 79, 5,144,165,110,147,126,251,246,237,116,141, 16, 94,191,126, 61, 78,159, 62, 77,244,232,209, 99, 97,101,231, +147, 64, 32,216, 56,101,202,148,188,146,162, 60,236, 29, 38, 70,232,168,108,252, 60,240, 45, 70,216,156, 66, 94,230, 59,236,219, +183, 15, 87,175, 94, 35,174, 92,185,202,190,121,243,166,201, 87, 95,125,181,163, 78,157, 58, 97,213,117, 50, 61, 61,125,237,140, + 25, 51, 10,138,138,138, 80, 84, 84, 4,177, 88,130, 60, 17,240,108, 75, 83, 60,219,210, 20, 18,202, 8,187,118,238, 38,159, 61, +123,102,251,246,237, 91,167,254,253,251,111,225,243,249, 7,171,227, 76, 75, 75,123,240,237,183,223, 74, 10, 11, 11, 33,147,201, +228, 42,149, 74, 38, 22,139, 21,199,143, 31,159,107, 99, 99,211,225,226,197,139,172,171, 87,175, 49,111,222,188,197,190,126,253, +186, 69,183,110,221, 78, 56, 56, 56,252,162,139,165,140,193, 96,108, 11, 9, 9, 25,183,107,215, 46, 7, 31, 31,159,102, 21,134, +162,248, 61,123,246,172,247,235,175,191,214, 9, 10, 10, 90,136,210, 0,148, 79, 10, 91, 91,219,153, 3, 7, 14,196,174, 93,187, +112,254,252,249,121, 59,118,236,192,151, 95,126, 9, 39, 39,167,111,161,251,176, 23, 0,252,184,117,235, 86, 15, 15, 15, 15,140, + 25, 51, 70, 54,105,210,164,239, 14, 29, 58, 84, 63, 60, 60,156,253,203, 47,191,212,155, 58,117,234,236,128,128, 0, 73,131, 6, + 13, 16, 28, 28,220,144, 36,201,109, 58, 93,223, 14, 14,115, 71,140, 24,129, 77,155, 54,225,230,205,155,131, 81,250, 64,149, 1, +184,116,247,238,221,254,235,214,173,195,224,193,131,225,236,236, 60,187, 54,150,167,166, 77,155, 46,235,211,167, 15,194,195,195, +209,170, 85, 43,116,232,208, 97, 30, 0,219, 90,238, 78,210,212,212,244,196,161, 67,135,124,235,213,171,135, 53,107,214,192,205, +205, 13, 7, 15, 30,244, 53, 49, 49, 57, 1, 29,221, 55, 44, 44, 44, 76,141,141,141,177,112,225, 66,122,240,224,193,121, 53,125, +230,205,155, 71,115,185, 92, 88, 89, 89,233, 26,248, 98,196,227,241, 58,122,121,121,225,254,253,251,184,122,245, 42,150, 46, 93, +138,185,115,231, 34, 59, 59, 27,195,135, 15, 55, 6,224,175,199,118,219,219,217,217,161,176,176,180, 46,188,151,151, 23,158, 60, +121,130,236,236,108, 56, 59, 59, 35, 35, 35, 3, 54, 54, 54,104,220,184, 49, 40,138,178,215,141,146,246,178,181,182, 64, 86,190, + 20, 76, 40,209,218,221, 22, 55,158,231,226, 93,182, 12,246, 54,150,200,200,202, 70, 29, 27, 30, 92, 92,234,130,166, 41, 47,157, + 20, 48,131,108,205,229, 25, 33,175, 72,142,180,216,155,185,114,149,116, 74, 65,226,221,148,130,196,187, 41,114,169,100,202,227, + 59, 87,115,235, 57, 24,193,197,197, 5, 4, 77,181,251, 20,215,227,144,186,112, 49, 49, 98,142,185,250,243, 50, 34,108,255, 98, + 66,154,251,174,109, 31,135, 82,203,178, 29, 80,127,200,240,225, 29,191,251,238, 59, 94,102,102, 38, 21, 48,108, 88,222,218,192, +192,107,127,212,240, 98, 80, 12, 52,234,217,179, 39, 72, 0,127, 92,185, 34,202, 0, 82, 1,192, 1,112, 25,240,205, 55, 93,150, + 44, 90,100,148,147,155, 75,221, 79, 40, 62, 23,151, 69, 15,178, 86,161,190, 46,254, 89, 42,192, 91,195,123,249,242,101, 90, 12, + 60, 6, 0, 63, 23,124,219,171,147,167,207,232,129, 93, 32,200,202,199,236,181, 63, 99,207,201, 91,151, 45, 20,244, 23,255,161, + 71,241,228, 90, 9, 45,245,208,207,123,211, 74, 74,222, 31, 61,248, 80, 1,243,119,112, 86,134,255,162,208,210, 64,161, 40, 29, + 37,145, 41, 40,200, 20,148,230,173, 22, 98,177, 88,103,138,203,151, 47, 31,158, 53,107, 22,182,108,217,130, 87,175, 94,129,205, +102,195,203,203,139, 15,192, 84,115,207,111,221,186,181, 61, 73,146,136,143,143,199,230,205,155, 49,126,252,120,250,222,189,123, + 7, 81,121,190,148, 39,121,121,121, 59,167, 76, 26, 95,144,159,249, 14, 10,113, 62,178,210,222, 64, 42, 42,192,154,245, 27, 81, +162, 96, 34, 67, 40, 71,134, 80, 14,146,107,141, 61,251, 15, 49,154, 54,109,218,135,193, 96,244,171,166,159,247, 51, 51, 51,247, + 79,155, 54,173, 32, 35, 35,163,108,251,100, 10, 26, 50, 69,249,243,213,216,216, 24,219,182,109,179,112,119,119, 31,200,100, 50, +187, 85,195, 41, 72, 73, 73,137,155, 54,109,154, 44, 51, 51, 19, 66,161, 16,231,206,157,235, 95,175, 94, 61,171, 13, 63,110, 33, + 68,114, 38, 50, 10,228,200, 40,144,131, 99,106,143, 19,161,103, 24,141, 27, 55, 14, 96, 50,153, 29,106, 18, 89, 71,142, 28, 25, + 61,108,216, 48,179, 31,127,252, 49,239,236,217,179,187, 0,104, 31,144,248,109,219,182,157, 60,113,226, 68,209,252,249,243,173, +131,130,130,230,125, 98,177,213,109,216,176, 97, 77, 40,138,194,169, 83,167,158, 1,216,122,230,204,153, 71, 82,169, 20,195,135, + 15,175,175, 30, 70,210, 5,109, 3, 2, 2,166,251,250,250, 98,206,156, 57,242,107,215,174,181, 6,176, 5,165, 67,185, 52,128, +100, 0, 59,110,221,186,213, 98,230,204,153,210,118,237,218, 97,236,216,177,227, 1,248,214,192,219,113,196,136, 17, 30, 20, 69, +225,248,241,227, 79, 1, 92,172, 48,255,122,104,104,232,125,153, 76,134,145, 35, 71, 54, 0,160,207,141,156,205,229,114, 79,173, + 94,189,218, 50, 45, 45, 13,163, 71,143,150,198,199,199, 35, 48, 48,208,200,194,194,226,162,214, 53,160, 51,184, 92,238,190,159, +126,250,105,160,183,183, 55,166, 77,155, 38,219,189,123,247,172,233,211,167,203, 90,183,110,141, 93,187,118, 13,228,112, 56,122, +149,232, 72, 79, 79, 47,136,141,141,181,169,233,147,154,154,170,107,120,190,177,169,169,105,132,167,167,103,161,151,151, 87, 27, +165, 82,137,152,152,152, 55,135, 15, 31,166,188,188,188,176,115,231, 78, 4, 5, 5,161, 95,191,126, 96, 48, 24, 58, 11, 45, 6, +131, 1,185, 92, 14, 99, 99, 99, 48,153, 76,188,121,243, 70,147, 90, 6,108, 54, 27, 0, 96, 98, 98, 2, 35, 35, 35,144, 36,169, + 83, 52, 26, 65,128, 46, 44, 81,128,197, 34,193, 36, 41,196, 37, 11, 33, 87, 80,224,177, 25, 96, 49, 9,128,166, 96,105,194, 2, +143,195, 0, 73, 16,148,142,156, 16,138,228,224,176, 73,176,216, 28,130, 84,170,140,202, 30,142, 76,149,145,145, 17,135,176, 53, +231,130,199,254, 23,149, 5, 38, 74, 29,203,199, 1, 44,147,186,117,135,110,218,188,153, 83, 88, 92,140,193,131, 7,231, 37, 61, +122, 20, 34, 6, 30,117,173, 33, 72,137,100, 50,221,253,186,118, 69,100, 84, 20,138,242,243, 95, 3,165,206,241, 28, 39,167, 97, +219,182,109,227,136, 37, 18, 12, 30, 52,168,224,213,157, 59, 71, 82,138, 17,118, 60,185, 84,136,213,120,220,217,108, 71, 13,175, + 48, 63, 63, 31, 40, 77, 33,225, 96,103,186, 97, 70, 64,111, 20,149, 72,176, 96, 99, 8, 21, 21, 39,248, 54, 60, 21, 95,157, 73, +135,240, 63,246, 24,158, 92,225, 3, 64,135,132,165, 26,235, 82, 77, 98, 69, 42,149,126,116, 1,244,161,156,149,137,196, 15,229, +252, 55,130,201,100, 74, 94,190,124,201, 49,183,113,162,108,204, 88,249,245,198,223,177, 0, 0,107, 83,166, 80,174, 82, 80,233, +233,233,224,114,185, 18, 29,135, 27, 38,237,219,183,111, 13,128,102, 76, 38, 51,236,208,161, 67, 68, 72, 72,136,213,136, 17, 35, + 18, 98, 99, 99,211, 60, 61, 61, 93, 15, 29, 58,100, 14, 0, 59,118,236,160, 79,156, 56,209, 27,165, 41, 51,170,204,227,146,153, +153, 25,152,155,155,123,111,198,140, 25,193, 28, 14,199,202,196,196,196, 38, 60, 60,156,144,200,105,180, 93,146, 92, 22,137,104, +110, 68,226,246, 98,115, 76,158, 60,153, 17, 27, 27,187, 62, 45, 45, 45,172, 26,206,133, 5, 5, 5,225,175, 94,189,218, 98,225, +220,210,206,196,117,137,133,207,226,120, 0,128,171, 45, 11,164,250,190, 88, 80, 80,128,236,236,108, 76,159, 62,221, 42, 33, 33, + 97, 97, 90, 90,218,141,106,172, 90,183,114,114,114, 82, 95,188,120,225,199, 98,177, 56, 38, 38, 38,109, 35, 34, 34, 8,137,140, + 66,243,133,201,200, 43, 46,237,167,181, 41, 19,143, 87, 59,224,219,111,191,101,190,126,253,122,163, 64, 32,232, 92,233,205,140, + 36,131,180, 69,214,130, 5, 11,162, 1, 52, 0, 80,110,104, 84,165, 82, 17, 35, 71,142,124, 14,192,107,254,252,249,214, 52, 77, +207, 91,184,112, 97, 30,128,189,255,244,185,100,110,110,190, 97,202,148, 41, 56,113,226, 4,242,243,243,183, 1, 64, 97, 97,225, +214,163, 71,143, 30,159, 52,105, 18,126,253,245,215, 13,217,217,217,127,160,230, 80,237, 47,135, 15, 31,142, 75,151, 46,225,207, + 63,255, 92, 6, 32,166,138,118,175,194,195,195, 23,158, 61,123,118,251,136, 17, 35,240,243,207, 63,247, 1, 80,157,131,108,207, +222,189,123,227,226,197,139,200,205,205,221, 85, 89,131,130,130,130,221,231,206,157,107,223,187,119,111,172, 95,191,190, 39,128, +235, 58,108,186,135,133,133,197,161,237,219,183,183,245,246,246, 70, 64, 64,128, 68, 46,151,247,153, 63,127,254,249, 99,199,142, +153, 29, 62,124,184,205,228,201,147, 31,168,115,190,221,215,201,148, 69,146,235, 54,111,222, 60,193,207,207, 15,243,230,205, 83, + 94,190,124,121, 0,128, 43,127,252,241, 71,194,130, 5, 11, 46,108,222,188,153,177,105,211,166, 9,179,103,207,206,166, 40,234, + 83,137,235,213, 59,118,236,104,223,171, 87, 47,188,121,243, 6,247,239,223,135, 92, 46,255, 53, 34, 34,226,118,163, 70,141, 86, +203,100,178,243, 38, 38, 38, 99,204,204,204, 60, 91,182,108,249,197,227,199,143,141,161,155,159, 94,102, 98, 98,162,165,133,133, + 5,148, 74, 37,158, 61,123,134,186,117,235, 66, 46,151,227,237,219,183,240,246,246, 6,155,205, 70,102,102, 38,180,172,229, 53, +136, 34,242, 89, 66, 82,122, 3,107, 51, 19, 64,197,195,147,248, 84,216,217, 90, 65, 69,144,200,200, 16,160,101, 19,103, 16, 4, +129,130,220, 12, 16, 4,241, 92, 23, 78, 21, 77, 69,190, 75,207,170, 99, 99,198,133,119,251, 94, 54, 17,127,100,135,152, 55,232, + 52,153,201, 32, 24, 28,174,233,222, 9, 99,199,218, 82, 20,141,130,220, 76, 48, 73,242,225,167, 56, 64,167,222, 33,165,171, 27, +239, 73,175, 9,107, 90, 18, 52,104,177, 28,135,127,206, 68,190, 49,208,114,199, 15, 63, 88,218,216,218, 34, 32, 32,128,202, 77, + 75,187, 86,162, 99, 98,229, 6,141, 26, 57,152,154,153,225,238,221,187, 96,148,250,216,226, 32,224, 17,180, 96,129,141,189,163, + 35,198, 79,152, 64,101,190,123,119, 93, 12,164,235,211,215, 6,110,110, 44, 13, 47,169,230, 21, 48, 48,107,254, 0, 95,174,137, + 17, 23,235,246,156, 65, 74,142,232,120,132, 0,123,254,163,246,142,125,213, 90,180,170,114, 62, 43,117,170, 54,174, 86,172,240, +120,188, 50,107,138, 30,111,122, 31,157,179, 38,252, 29,156,159, 16,139, 1,156, 5,176, 56, 37, 37, 37,110,194,132, 9,114,165, + 92, 90,116,111, 77,131, 69, 81,235,235, 77,139, 8,228, 79,251,125,150,197,162, 18, 97, 94,209,142, 29, 59, 20, 41, 41, 41,113, +218,203,212,192,253, 14,192,197, 95,126,249,101,247,169, 83,167,224,229,229,133,152,152, 24,123,145, 72,212,234,249,243,231,214, + 30, 30, 30, 8, 9, 9,193,137, 19, 39,182, 0,184, 90,157,200,210, 64,169, 84, 94,203,200,200,104,156,156,156,220,208,210,210, + 82, 97,105,105,137,138,145,136,133, 98, 10,185, 5, 66, 88, 91,219,192,220,220,188,190, 14,226,252, 98, 70, 70,134, 59,101,213, +164,139,123,206, 54, 97,228, 58, 23, 68,174,115,193,197,133, 78,224, 91,114,144,159,159,143,236,236,108,100,103,103,131, 32, 8, + 40, 20,138,166, 58,112,190, 21, 8, 4, 7,222,189,123,119,214,193,193, 1,102,102,102,160, 1,100, 20, 40, 16,189,201, 3,209, +155, 60,144, 81,160, 64, 97, 81, 17,234,213,171, 7, 51, 51,179,170,134, 40,200, 58,117,234,244, 29, 54,108,152, 25, 0,168, 5, + 84,119,154,166,167, 85,242,153,170, 84, 42, 59,105,218,126,255,253,247,214, 0,122,255,195,231, 19, 3,192,140, 73,147, 38,181, +225,241,120,216,185,115,231, 91, 0, 71, 52,247,250,221,187,119,199, 3,192,172, 89,179, 60, 1,204, 67, 21,153,160,203, 76, 67, +108,118,235,166, 77,155, 34, 34, 34, 2, 0,206,212,176,238,208,123,247,238,161, 81,163, 70,224,241,120,109,107,104, 91,223,197, +197, 5,241,241,241, 0,240,164,138, 54, 79,226,227,227, 75,135,123, 8,162,190, 14,219, 62,176, 87,175, 94,207,110,220,184,209, +182, 99,199,142,152, 48, 97,130,236,193,131, 7,125, 1,220,126,242,228, 73,183,145, 35, 71,138,220,221,221,113,235,214, 45,143, +145, 35, 71,222, 35, 73,114,141, 14,156,227, 87,173, 90,181,248,235,175,191,198,170, 85,171,232,147, 39, 79, 6, 0,184,162,158, +119,249,248,241,227,163,215,174, 93, 75, 15, 26, 52, 8, 43, 87,174, 92, 12, 96, 90,117,100, 34,145, 72,168, 82,169, 32, 18,137, +116, 50,201,235,218,222,214,214,246,203, 94,189,122, 97,233,210,165,168, 83,167, 14,206,159, 63, 79, 3, 8, 3, 16, 46,147,201, +186, 0,216, 44, 18,137,126,143,136,136, 64,207,158, 61,217, 40, 95, 98,164,186,245, 63, 59,122,244,168,212,194,194, 2,174,174, +174,104,208,160, 1, 50, 50, 50,144,148,148, 4,111,111,111,180,110,221, 26, 74,165, 18, 7, 14, 28,144, 20, 21, 21,233,148,147, + 79, 41, 19, 29,190,122,225,180,208,198,140, 11,103,123, 11,212,171, 99,141,226,130, 28,100,103,164,163,117,211,186,232,218,186, + 30,114,132, 50, 92, 14, 59,157, 95, 84, 84,114, 88, 39, 19,190,180,228,208,181, 63,206, 11,173,204,216,104,220,196, 19, 35, 39, +204,106,217,178,149,207,213,118,237, 58, 93,254,113,195,186,230,221, 59, 52, 37, 82,115, 36,184, 20,118, 38, 95, 88, 88,120,232, + 83,220,232, 87, 2, 12,137,133,251,237, 93,103, 35, 15, 52,235, 51,233, 64, 92, 42,182, 1,128,130,193,240,232,251,229,151, 72, + 77, 77,197,233, 83,167, 4, 37,192, 83, 93,249,140,140,140, 72, 0, 16, 10,133,224,170,253,238,148, 64,147,175,190,250, 10,217, + 57, 57, 56,122,228, 72,246, 37, 32, 74,159,126,246, 7, 56,198, 70,165, 6, 65,161, 80, 8, 2, 40, 4, 0,130,137,190,237,188, + 26, 33, 59,175, 16, 55, 30,198, 21,215, 19, 99,122,117, 60,159,177, 35,124,237,124,180, 0,228,204,155, 55, 15, 92, 46, 23,124, + 62,191, 76, 28,105,196, 10,135,195, 1,159,207,135, 82,169,196,241,227,199, 1, 32,167,218, 55, 60, 64, 58, 96,218,122, 74,170, +160, 75, 88, 44,214, 71,225, 84,191, 57, 74, 7, 47,248,153,250,227, 94,229, 65, 49,181,225,252, 12,208, 78,157, 19,171, 29,128, +252,164,164,164,212,161,131, 7, 8,147, 19, 94,100,136, 10,210, 5,133,185, 41,130,148,183,207, 51,150, 44,156, 39, 76, 77, 77, + 77, 65,105, 46,173,118,233,233,233,154,101,116,193,188,161, 67,135,254, 52,105,210, 36, 58, 58, 58, 26, 0, 16, 25, 25,137,177, + 99,199,210,163, 71,143,222, 6, 96, 81, 45,250, 45, 18,139,197,229,172, 33,114, 21, 85, 54,228, 87, 88, 88,136,244,244,116,200, +100, 50,157, 21,241,171,203,155, 94,230, 37, 61, 86,120,186,154,192,211,213, 4, 30, 46,198, 32,148,197,101, 34, 43, 59, 59, 91, +243,230, 44,209,163,159,133, 82,169,180, 92, 63,181,135, 38, 11, 11, 11,145,145,145, 1,149, 74, 85,213,131,140, 74, 75, 75,187, +124,226,196,137, 34, 0,248,241,199, 31,243, 8,130,248,147, 32,136,159, 42,249,236, 97, 50,153,119, 53,109, 55,109,218,148,135, +247,135,196,254, 78,124,237,237,237,157,191,120,241,226,157,179,103,207,198,158, 61,123, 32, 16, 8, 22,225,175, 92, 60, 84, 78, + 78,206,130, 93,187,118, 97,220,184,113, 88,190,124,249,166, 86,173, 90, 21, 2, 24, 89, 21,161,157,157,157, 51,147,201, 68, 84, + 84, 84, 33,128, 55, 53,172, 63, 35, 42, 42, 42,147, 32, 8,240,249,124,183,234, 26, 90, 91, 91, 55, 52, 51, 51, 67, 90, 90, 26, +160,126, 99,174, 4, 73,233,233,233, 52,135,195,129,147,147, 83,163,154, 54,222,202,202,106,193,129, 3, 7,152, 47, 94,188, 64, +247,238,221, 83,111,221,186,213, 19,128, 38, 36, 61, 42, 50, 50,210,183, 91,183,110, 47,175, 94,189,138,141, 27, 55, 18, 45, 90, +180,152, 86, 19,167,171,171,235,212,241,227,199, 35, 56, 56, 24,123,247,238,157, 6,224, 84,133, 38,199,118,237,218, 53,107,239, +222,189,152, 48, 97, 2,234,215,175, 63,178, 58,190,228,228,228,133,126,126,126,145,175, 94,189,210,169,226,129,142,237,187,249, +248,248, 52, 20,139,197, 56,116,232,208,155,134, 13, 27, 62, 58,117,234,212, 60,188,255,192,254,253,244,233,211, 24, 53,106, 20, + 90,180,104,113, 8,192, 8, 93, 46,203,216,216,216,148,235,215,175, 83,108, 54, 27,174,174,174,232,215,175, 31, 2, 2, 2,208, +188,121,115,200,229,114,156, 62,125,154,122,254,252,121,170, 76, 38,211, 41,151, 82,238,171,155,231, 19, 19,255,199,222,121,135, + 55, 85,253, 97,252,189,217, 59,233, 74,218,210,210,210, 50, 58,217,200,144, 13,101,200, 22, 81,100,136, 19, 81, 65, 20,112,240, + 19,113, 34,200, 18, 65,100, 40, 10, 34,160, 32,178, 42,224, 64,169,108, 90,160, 20, 40,109,233,158,233, 30,105,118,114,207,239, +143,182, 88, 74, 71,210,162,128,158,207,243,220, 39,237, 73,238,155,115,247,155,239, 57,231,123, 18, 78, 94, 56, 27,101,229,113, + 57,240,243,118,195,195, 17, 93,241,236,164,190,232, 30,226,131,244,124, 3,142, 29,251,197,154,154,154,124,218,145, 17,135, 53, +154,241, 87, 99, 79, 93,185,112,194,198,231, 49, 8, 9,238,128, 69,255,123,221,117,201, 59,111,184,116,104,235,135,216,148, 50, +252,242,243, 97,107, 78, 86,230,239,119,107,196,225,113, 64, 32, 23, 49, 50, 46,135, 3, 59, 71, 84,201,173, 30, 72,211, 49, 44, + 44,200,211,203, 11,145,145,145,224, 56, 49, 34,244, 56, 32,144,203,171, 90,193,117, 58, 29,106,244,218, 5, 7, 7,251,249,251, +227,167,200, 72,112, 89,246,218, 64, 39, 19,140, 94,175,106,134,190,169,203, 0,198, 23, 91, 67,209,174,181, 38,216, 85, 37,195, +217,216, 36,152,172,228,220,183, 37,184,171,249,200,254, 70,102,162,153, 77,135, 43, 54,110,220,216,243,203, 47,191, 28, 54,111, +222, 60,249,140, 25, 51, 32, 22,139,161,215,235,225,235,235, 11,187,221,142, 35, 71,142, 32, 58, 58, 90,199,178,236, 47,184, 61, +109, 64, 4,106,141,210, 56,154, 12, 73,149,223,210,247,220,255,232,163,119, 68, 19, 0,228, 73,172,178,168,141,121,251,218,221, + 39, 38,238, 56,122,129,121,101,202, 64, 78,247,224,214, 0, 0, 79, 79, 79, 40,149, 74,167, 53,239, 0,127,187,102,237,102,221, +188,188,188,235,121,121,121,249,207, 61,247, 92, 72, 77,199,119,145, 72,100,172,142,100,149,212,183,142, 3,245,180, 0,120,241, +203, 47,191, 60, 80, 86, 86,118,244,181,215, 94,195,146, 37, 75,112,240,224,193,254, 0, 78, 54,115,219,237, 37, 37, 37,165,231, +206,157,243,108, 31,218, 13,129, 26, 62, 6,188,157, 8, 66, 8,220,165, 4, 21,165,197,184,120,241, 2, 42, 42, 42,206, 58, 83, + 79,139,197, 82,154,159,159,239,161,209,104, 80, 92, 92,140,194,194,194,155, 38,171,164,164, 4,197,197,197,132, 97,110,203,217, +210,152,102,101,126,126,190, 62, 62, 62, 94,232,217,186, 61,218,106, 4,232,245,191,235, 0, 33,240,115,227,160,162,188, 20,167, + 79,159, 70, 89, 89,217, 31, 13,105,178, 44, 59,127,218,180,105, 92, 0, 79,188,246,218,107,110, 0,186,188,254,250,235,191,160, +206,200, 66, 30,143,247,201,246,237,219, 59,214, 52, 49,190,241,198, 27,171, 1,124,249, 79,157, 75,238,238,238,243, 35, 35, 35, + 21, 22,139, 5,107,215,174,197,234,213,171,183,224,246, 68,149,145,159,125,246,217,122, 14,135,243,210,236,217,179,241,252,243, +207, 75,123,244,232, 49, 47, 55, 55,247,219,250, 52,179,179,179, 23,117,239,222,125,113,126,126,254, 71, 14,153,229,196,196,153, +221,187,119, 95,148,159,159,191,188,177, 99, 36,147,201,100,118,187, 29,169,169,169, 37, 64,131,253, 59,140,169,169,169,217,118, +187,221, 87, 42,149,186, 53,117,126,150,148,148,124,212,163, 71,143,119,181, 90,237,207, 0, 62,172,199,144, 95,202,205,205, 13, +159, 59,119,238,156,101,203,150, 77,204,203,203,219,213,148,102,122,122,250, 71,131, 7, 15,126, 59, 33, 33, 97, 43, 26,110, 2, +254,236,189,247,222,179,108,223,190,253,133,212,212,212,165, 77,104, 30, 42, 44, 44, 60,228,196,241,109,232,243, 55, 53,185, 92, +238,235,203,150, 45,227,108,220,184, 17,132,144,149,118,187,189,161,122,198,238,219,183,111, 91,223,190,125,103,236,222,189, 91, + 28, 30, 30,254,188,201,100,218,217,212,249,169,215,235,247,238,222,189,123, 98,108,108,172,239,140, 25, 51,196, 65, 65, 65,176, + 88, 44,200,205,205,197,198,141, 27,141,113,113,113, 89,165,165,165,123,157,185,135,216,204,229, 83, 78, 29,219,191, 51, 45, 49, +174,207,160,145,227, 93,205, 22, 95,136,138,184, 40, 45,202,195,145, 67,123, 75, 82, 83,147, 79,235,245,165, 83,156,209,180,152, +202, 30, 63,253,251,129, 93, 89,169,241,189, 7, 12, 30,229,106, 52,251, 67, 36,224,160, 72,155,141, 35,145,251,139, 83, 83, 83, +254, 52, 90, 77, 79,222,173,251, 60, 55, 0, 31,114,243,162,159,155, 53,182, 43, 36,174,190, 23,249,192,218,190,128,196,195,211, + 83, 80,125,237, 64, 94,213,231,209, 33, 77, 45, 32,108, 95,221, 74,165,215,235,193, 7,204, 79, 1,124,181, 90, 45, 1,128,132, +132, 4, 72,171, 90, 53,156,170,167, 14,144, 73,107,233,114, 0,125, 17, 15, 62,237,148, 50, 6, 0,178,242,138, 96,182, 54,250, +220,184,223,217, 92,203,112,109,110,142,128, 0, 64,132, 92, 46, 95,178,120,241,226,149,103,207,158, 93, 57,102,204,152,149, 34, +145,104, 73,245,206, 22, 52,114, 32,254, 49,205, 7, 90,193,109,112, 91, 38,106,120, 59,134,157,213,223,213,254,100, 47,153,121, +200,144, 33,235, 91, 88,207,150, 92, 44,127,167,230,126,171,213, 74, 80,213,108,183, 31, 13, 55, 9, 46,172,245,126, 94, 70, 70, + 6,169,254,219,153,122,122, 76,158, 60,153,173,168,168, 32,143, 61,246, 24, 65,211, 83,248, 52,170, 41, 18,137, 6, 15, 24, 48, +192,170, 45, 40, 38,215, 83,178,201,153,152,171,228,232,177, 83,100,215,222, 72,178,110,253, 38,210,185,115,103, 51, 0,127,103, + 52,121, 60,222,144,193,131, 7, 23,105,181, 90, 18, 31, 31, 79,162,162,162,200,158, 61,123,200,166, 77,155,200,134, 13, 27, 72, +235,214,173,181, 0, 60,157,209,148, 72, 36,227, 31,122,232, 33,107,105,185,158,164,102, 23,145,203,241,169,228,228,185,203,228, +200,177,147,228,219,157,187, 73, 88, 88,152,209, 1, 77, 46,151,203, 93,183,107,215,174,114, 66, 8, 25, 63,126,124, 22,110, 77, +164, 26, 56,127,254,252,124, 66, 8, 89,190,124,121, 17,234,239, 8,255,119,159, 75, 35,125,124,124,174, 11, 4,130, 72, 0, 79, + 52,177,222,227, 60, 30,239,160,151,151,215,121, 0, 15,223,133,235,104,140, 70,163, 57, 3,160,169, 25, 14,106, 62, 55,225, 95, +114,189,255, 29,154, 67,120, 60, 94, 20,208,248, 36,194,181,238,215, 31,112,185,220,159, 0, 12,117,178,158, 29, 60, 60, 60, 30, +115,117,117,125,197,213,213,245, 21,141, 70,243,152, 80, 40,236,208,146,109,119,239, 16, 49,214,175,219,184,125,173,187,140, 78, +247,235, 58, 38, 61,160,251,248,125,238, 29, 34,198,182, 84,211,191,251,248,253,126, 93,199,100,248,117, 29,155, 22,248,192,248, +125, 30,193, 17, 15,221,205, 99,244,132, 15, 90, 13, 11,132,141, 68,189, 77, 72,212,219, 36, 34, 16,108, 31, 23,132,245, 4, 20, + 35, 34, 34, 86, 17,187,125,213,196, 9, 19, 86,181, 7,220, 9,192,173,187,212,167,217, 13, 80,222, 92,119,252,248, 85,109, 1, +143, 97,128,116, 96,255,254, 43,137,221,190,106,218,227,143,175,242, 3,188,234,211,107, 72,147, 0, 92, 31,160, 85,109, 93, 15, +160,221,164, 0,132, 47, 28, 27, 64, 72,212,219,228,189, 71,131, 72,119, 79, 60,209,132,102, 67,145,162,251, 58,162,229, 44,178, +234,155,235,210,234, 87,217, 29, 56, 9,239,184,102,111,111, 4, 69,180, 99,226, 71, 5,243,138, 81, 53, 36, 89,246, 47,188, 73, +110, 53,155,205,196,104, 52, 18,189, 94, 79,116, 58, 93, 93, 3,117,211,144,229,228,228,144,172,172, 44,146,145,145, 65,210,210, +210, 8,254,234,123,227,112, 61,149, 74,229,151,143, 62,250,168,157,207,231,175,187, 19,219,238,230,230,182,180, 87,175, 94,150, + 79, 63,253,148,236,219,183,143,124,241,197, 23,100,246,236,217,164, 99,199,142, 38, 23, 23,151, 41,205,209,244,242,242, 90, 20, + 28, 28, 92,180,101,203, 22,242,237,183,223,146, 53,107,214,144,183,222,122,203,238,235,235,155,167, 80, 40, 70, 52, 71, 83,163, +209,108,238,215,175,159,101,243,230,205,228,151, 95,126, 33, 59,118,236, 32,243,231,207, 39, 33, 33, 33, 38,153, 76,246,136,131, +154, 92, 30,143,183,106,214,172, 89,121,173, 90,181,138,172,243,158, 52, 44, 44,236,252,180,105,211,114, 0,188,241, 47, 58, 63, +169, 38,213,164,154,127,131,209,154,218, 10, 62, 4,224, 74, 5,130,199, 7,246,239,191, 82, 0, 60,238,172, 41, 18,115,185,147, +250,246,234,181, 82, 0, 76,169,249,172,152,203,157, 52,176,127,255,149,124, 46,119,122, 67,122,141,105, 18,128, 43,224,241,222, +232,219,167,207, 42, 30,240,191,154,178, 33,129,204,181,249, 35, 91,147,254,254, 76,210,116, 13,164,255, 98,163,117,199,225,253, + 13, 39,225,253,162,121,175, 92,212,237,171, 13,211,126, 39, 34, 90,251, 81, 53,139,122,251,102,214, 83,114,135,183,189,147,135, +135,199,225,246,237,219, 23,180,105,211, 38,199,213,213,117, 39, 0,223, 22,106,134,123,121,121,125,227,233,233,153,232,237,237, + 29,235,225,225,241, 9,170,178,206, 55, 91,147,207,231,247,242,244,244,252, 35, 32, 32,160,212,223,223, 95,235,225,225,177,171, +158, 72,150, 35,154,222,168,255,166, 34,168,126,143, 62,116,168, 38,213,164,154,183, 24,152,225,109,177,108, 88, 32,108,195, 2, + 97, 31, 30,128, 79,106, 27,148, 49,128,164,185,166,232, 73, 64, 84,247,243, 77,233, 53,165, 73, 0,238,131,128,188,238, 58,163, +124, 17,230,160,230,253, 30,209,170,185,207, 59,151,222,161, 1,108,127, 67, 37,239, 23,205,123,133, 36, 52,210, 25,185, 22, 75, +239,224,119, 26,238,240, 54, 92, 46, 44, 44,124,168,176,240,142,142, 77,184,146,151,151,247,196,157, 20,180, 90,173,103,181, 90, +237,160, 59, 32,213,208,208,107, 11, 28, 28,150, 77,161, 80,254, 59, 48,128, 29,201,120, 51,162, 3,214,242,236,224, 28, 73, 65, +118,157, 33,121, 6,166, 57,154, 85,216,183,214,115,143,103,154, 91,207,191,208,221,166,145,133,171,204,127,231,176,229,162,170, +143, 86,139,141, 22,133, 66,161, 80, 40,148,127,128, 95, 19,233, 15,177,251,128, 72,220, 26,125,139,172,101, 68, 27, 12,125, 58, + 51,146,162, 57,225,211, 95,169, 38,213,164,154, 84,147,106, 82, 77,170,249,159,211,172,161,161,185, 83,175,215,249,191, 89,163, +248,254, 43,208,118,118,170, 73, 53,169, 38,213,164,154, 84,147,106,254,219,105,118, 30, 45, 10,133, 66,161, 80, 40, 20, 74,227, + 52, 24,117,163, 70,139, 66,161, 80, 40, 20, 10,165,101,120,163,106,138,170, 72,252, 53, 85,213,102,106,180, 40, 20, 10,133, 66, +161, 80, 90,206,104,252, 53,218,240,150,232, 22,135,238, 27, 10,133, 66,161, 80, 40,148, 22, 51,179,214, 43,237,163, 69,161, 80, + 40, 20, 10,133,114,135,112,108,100,228,161, 67,135, 8,221, 87, 20, 10,133, 66,161, 80,238, 22,247,169, 23,169,137, 98,221, 54, +203, 7,141,104, 81, 40, 20, 10,133, 66,161,180,140,205,181, 12,215, 45,101,212,104, 81, 40, 20, 10,133, 66,161,180,140, 26,131, + 21,137, 58, 83,170,113, 0,218,100, 72,161, 80, 40, 20, 10,229,238,114,159,123,145,205,213,203,109,211, 37,213,140, 58, 28, 84, +189,129,131,232,161,166, 80, 40, 20, 10,133,114, 23,184,159,189,136, 55, 26,232,163, 69,161, 80, 40, 20, 10,133, 66,105, 25, 51, +235,188,222,132,161,251,134, 66,161, 80, 40, 20, 10,229,142, 24,173,218,208,201,176, 41, 20, 10,133, 66,161, 80,238,103,232,204, +230, 84,147,106, 82, 77,170, 73, 53,169, 38,213,252, 47, 48, 19,117,178,194, 3, 52,189, 3,133, 66,161, 80, 40, 20,202,157, 48, + 89,155,235,251,159,206,117, 72,161, 80, 40, 20, 10,133,242, 55, 65, 35, 90, 20, 10,133, 66,161, 80, 40, 45, 99, 51,234,201, 10, + 79,141, 22,133, 66,161, 80, 40, 20,202,157, 51, 91,183, 65,155, 14, 41, 20, 10,133, 66,161, 80, 90,198,204,134,254,103,208,240, +200,129, 95,157,248,130,230,140, 62,248,149,106, 82, 77,170, 73, 53,169, 38,213,164,154,255, 57,205,166,180,127,197,253, 71,131, +157,225,255,110,232,208, 87,170, 73, 53,169, 38,213,164,154, 84,147,106,254,219,169,153,130,167,102,185, 57, 21, 15,237,163, 69, +161,220,231,144,221,224,162, 36, 56, 0,132,180, 2, 87,152,139,220,203,201,204,187, 96, 91,172,169, 13,243,135,196,234, 9,155, +184, 0,218,216,148,150,106, 82, 40, 20,202,191,152, 92, 52, 16,193,162, 70,139, 66,185,223, 41, 8, 9, 2, 15, 75,193,129, 55, +136,229, 6,212, 97, 75,129,171,113, 45,214, 20,176, 31,194,206,241, 5,177, 36, 64, 19,188, 12,184,141, 68, 38, 31, 0, 0, 32, + 0, 73, 68, 65, 84,126,149,238,108, 10,133, 66,113,142,127,188, 51, 60,159,207,215, 2, 96,197, 98,241, 94,208, 89,174, 41,127, + 47,222,213,231, 25, 91,125,222, 57,131,156,199,227, 45,150, 74,165,191,139, 68,162,124,145, 72,148, 47,147,201,126,231,241,120, +139, 1,200,239,149, 13, 36,223,116,148,130, 99,127,200,108,101,125,142, 92, 46,213,232, 77,246, 32,112,108,163,200,150, 14,242, + 22,105,242,152,225, 70, 11,235,247,237, 57,189,103,165,217, 22, 10,130, 22,105,214,194, 69, 32, 16, 28, 1,224, 65, 79,207,127, + 39,161, 64,143, 30, 60,222,130, 16, 96, 8,232,124,186, 20,202, 63,111,180,172, 86,171,166,176,176,144,217,182,109,219, 56,149, + 74,117,131,199,227, 45, 4, 32,248,175,236,112,185, 92,126, 74,169, 84,106, 85, 42,149, 86,169, 84, 94,104,170,252, 95, 74,144, + 90,173, 78,119,115,115, 75,168, 93,168,238,252,240,131,237,251, 62,241,142,123,216,248,129, 45,212, 23,240,120,188,133, 42,149, +234,198,182,109,219,198,101,103,103, 51, 86,171, 85,227,196,250, 3, 92, 93, 93,175,157, 61,123,246,237,194,194,194,129,153,103, +182,168,243,206,110, 82,167,255,177,106, 80,244, 79,235,222,118,113, 81, 93, 5, 48,224,158,216,147, 70,214, 19, 28,238,224, 43, +185,122,105,110,185,213, 51, 38, 77,175, 0,184,131, 96,110,193,143,152, 50,214, 19, 32, 67, 46,101, 25,100,167,138,213,158,127, + 38,155,148,224,112, 6,195,200,120,181,248,134,195,225,188,192,178,236, 48,129, 64,240, 10,189,253,254, 59, 17,114, 56,125, 79, +141, 27,247,225, 27,157, 59,207, 9, 1,198, 54, 96,182, 24, 0, 47,135,132,132, 28, 6,240,248, 29,252,250,143,131,131,131,179, + 1,204,165, 71,130,242, 15,211,173,230, 7, 62,234,244,209,114,216,104, 77, 10, 64,223, 41,129, 56,254, 88, 0, 42, 38, 7, 66, + 55, 61, 16, 39, 30, 9,192,144,230,212,198,221,221, 29, 3, 6, 12,224,102,103,103, 75,230,207,159,255,142, 88, 44, 78, 5, 48, +162, 57, 90, 18,137, 36, 90, 42,149,102,242,120,188, 91,234, 34,149, 74,163,101, 50, 89, 38,143,199, 27, 90,187, 92,161, 80,156, + 82, 42,149, 90,133, 66,113,161, 1, 35, 20,173, 84, 42,181,114,185, 60,186,118, 57,143,199, 27, 42,151,203,179, 20, 10, 69,221, +242, 33, 10,133, 34,179,110,121, 67,240,249,124,223,204,204, 76, 77, 86, 86,150, 70, 40, 20,122,214, 46,207,200,200,208,100,102, +102,222, 82,238, 12, 60, 30,111,136, 76, 38,203,148, 74,165,209,245,149,215,221,166,134,168,181,239,134, 56, 82,238,172,201, 26, + 62,124,248,137,220,220, 92, 63, 23, 23, 23,151,218,111,184,169, 92, 70,124,179,101,253,188,241,163,134,191,160, 14,157,208,169, +153,250, 35,196, 98,113,234,252,249,243,223,201,206,206,150,244,233,211,135,203,225, 56,245,123, 34, 98,252,248,241,251,181, 90, +173, 79,151, 46, 93,184, 54,155, 13, 87, 14, 44,134, 52,246, 21,136, 83, 55,162,181,164,128,119,227,151,101,190,195, 7,245,216, +143,187,220, 25,148,236, 14, 21,128, 97, 7,176,132,168,175,101, 27,213,163,199, 61,202,187,152,105, 80, 91,237,118, 55,128, 59, +136,124,237, 47,106,150, 38,207,218,159, 37,196,243,183, 52,190,122,240, 99,115,184,199,210,120,106,171,221,238, 14, 14, 6, 54, + 71,179,246,233,207,229,114,231,173, 90,181,138, 3, 96, 54, 0,225,127,233, 46,220,179, 21,124,134,180,227,158,235,230,141,190, +119, 80, 54,188,250,122, 15,186, 87,182,211,204,178,215,119,165,164, 28,157,222,174,221,152, 55, 58,119,126,170, 30,179,197, 0, +120, 99,217,178,101, 79, 92,185,114, 69, 29, 24, 24,248,252, 29,250,209,191,102,217,178,101,175, 95,185,114,165, 85, 64, 64,192, +123,160,233,139,254, 85, 16, 66,132,132,144,193,132,144,209,132,144,161,132,144,158,213,127, 63, 80,189,140, 38,132, 68,212,121, +125,160,122,221,154,247,123, 53,160, 49,186,238,122,181,214,169,251,255, 45,127,215, 99,180, 70,163,170,175,214,232, 91, 54,224, +208,161, 67,164,246,107, 93, 38, 7,224,221, 57, 15,250,232,175, 29,220, 65,116,153, 41,164, 36,254, 34,185,184,249, 35, 50,231, + 1,181,126,106, 32, 62,118,126,127, 17,114,242,228, 73,114,229,202, 21,162,211,233, 72, 98, 98, 34,233,213,171,151, 65, 42,149, +254, 6, 32,192, 25, 49,133, 66,161,253,237,183,223,200,240,225,195,203,228,114,249,202,154,139, 75,169, 84,106, 79,158, 60, 73, +134, 15, 31, 94,166, 80, 40,214, 0,224, 2,192, 35,143, 60,146, 79, 8, 33,106,181, 58,167, 62,189,241,227,199,151, 16, 66,136, + 74,165,170,105,106,226, 42, 20,138, 53, 47,189,244,146,238,252,249,243,196,213,213,181,166,156,163, 84, 42, 87,206,158, 61, 91, + 23, 19, 19, 83,187,188, 81,220,220,220, 50,237,118, 59, 57,120,240, 32,209,104, 52, 55,235,224,234,234,154,105,183,219,201,254, +253,251, 27,172, 91, 99,129, 2,185, 92,190, 98,250,244,233, 21,105,105,105,196,221,221, 93, 91,171,124,229,140, 25, 51, 42, 50, + 50, 50,136,135,135,135, 67,117,116,119,119,215,158, 58,117,138, 76,156, 56,177,188,246, 62,117,119,119,215,158, 62,125,186,166, +124,133, 35, 55,178, 86,173, 90, 61,175,209,104,114, 52, 26, 77,142,139,139,203, 18,111,111,239,188,130,130, 2, 66, 8, 33,109, +219,182,205,175, 29,201,210,132,143,123,117,227,238,211,103,163,226,138, 10, 58, 15,123, 97,133,170,243,120,149, 19,251, 32, 64, + 42,149,254, 54,112,224, 64, 67,102,102, 38,169,172,172, 36,177,177,177,228,228,201,147, 36, 41, 41,137, 0, 32,142,156, 78,114, +185, 60,219,100, 50,177, 38,147,137, 45, 40, 40,176,231,231,231,219,227, 87,122, 19,242, 21,255,230, 82,186,127, 44,201,139, 90, +202, 42,229,210, 44, 0,138,187,118,227, 89, 31,230, 75, 54, 5,239,186,186,216, 47, 62,106,217, 72, 43, 73, 59, 70,118, 60,165, +182, 30,127,213,231, 6,217, 16,242, 3,217, 20,218,186, 89,154, 27, 66,119,196,190,229,119,125,221,123, 47, 91,211,211,211,201, +130, 25, 35,109, 63,207,241, 73, 38, 27, 67,118, 55, 71,179, 22, 83, 30,126,248, 97, 93, 70, 70, 6, 9, 11, 11,171,228,114,185, +207,252,151, 76, 86, 68,144, 48, 59,246,219, 5,236,216,112,105,209, 29, 50, 91,225, 26,141,166,112,235,214,173, 68,161, 80,228, +223, 67,102,139, 9, 1,198,109,235,220,121, 63, 59,105,146,125, 91,231,206,251, 67,128,113,213, 6,139, 1,240,230,242,229,203, + 99,172, 86,107,204,215, 95,127, 29, 51,110,220,184, 24, 0, 11, 90,248,157,159,126,252,241,199,196,106,181,146,175,191,254,154, +140, 27, 55,142, 0, 88,235,232,202,114,185,188,125,167, 78,157,182,135,133,133,101,116,233,210,197, 28, 26, 26,106, 12, 10, 10, + 74, 11, 15, 15,223, 42, 18,137, 2, 64,249, 71,104,204,139, 16, 66,122,190,249,230,155, 11, 1,144, 55,223,124,115, 33, 33,100, +116,181,159, 24, 93,251,239,186,175, 53,230,169,230,255,250, 52,106,150,250, 52,235,251,142, 58,223,131, 6, 34, 89, 51,111,219, +184, 67,135, 14, 13, 60,116,232,208,241,186, 27,247,104, 32, 30,156,243,160,143,193, 80,144, 75,226, 62,122,133,252, 62,216,151, +156, 28,228, 69, 18,230, 61, 76,114,191, 93, 67, 94,236,234,170,159, 20,136,193,206, 26,173,152,152, 24, 18, 19, 19, 67, 46, 92, +184, 64, 82, 83, 83, 73, 89, 89, 25,249,238,187,239,236,238,238,238, 6,145, 72,180, 12,128,196, 17, 49,165, 82,169, 37,132, 16, +147,201, 68,150, 44, 89, 98,172,142, 84,121,170, 84, 42, 45, 33,132,148,150,150,146,101,203,150, 25, 85, 42, 85, 44,128, 86, 30, + 30, 30,153, 41, 41, 41,196,211,211,179, 94, 51,227,234,234,170,189,126,253,122,141,113,242,113,117,117,141, 59,112,224,128,133, + 16, 66,178,178,178,136,155,155,155, 22,128,167,187,187,251,197, 67,135, 14, 89, 8, 33, 36, 39, 39,167,166,220, 33,163,101, 48, + 24,200,207, 63,255,124, 75, 29,106,202, 15, 31, 62,124,139, 1,115, 0, 79,149, 74, 21,243,221,119,223,153,237,118, 59,137,139, +139,171, 49,137,158, 46, 46, 46, 23,118,239,222,109,182,219,237, 36, 62, 62,222, 97, 51,216,166, 77,155,124, 66, 8,177,217,108, +100,227,198,141,166,154,125, 90, 83,110, 54,155,201,231,159,127,110, 82, 42,149, 49, 0, 26,141,190,121,120,120,228,152,205,102, + 82, 90, 90, 74,122,245,234,165, 59,121,242, 36, 41, 47, 47, 39,132, 16,210,166, 77,155,124, 0, 8, 30,248,204, 7,103, 19,117, +229, 79,191,190,254,251,128,158, 83, 63, 58,122, 46, 59,235,203,125,209, 49, 30,225,227, 71, 58, 18,212, 20,137, 68,203,188,189, +189,141,127,254,249,167,221, 98,177,144,140,140, 12,114,225,194,133,155,231,216,229,203,151, 29, 50, 90, 60, 30,111,241,217,179, +103, 45,118,187,157, 45, 44, 44,180,231,231,231,219,243,243,243,109,117,141, 22,249,138, 79, 10, 15, 63, 71, 34, 55,207, 53, 11, + 4,130,197,119, 39,154, 5, 46,217, 20, 60,158,108, 10,142,217, 58,221,163,176,226,194, 78, 66,126,153, 75,146, 63, 8, 36,139, + 71, 42, 42,216, 77,193, 49,100, 83,200, 36,242,238, 64,158, 83,154,155, 67,199,146, 77,193, 49, 31, 63,234, 95,116, 49,230, 60, + 57,126,252, 56,249,124,205,114, 50, 39,194,167,146,221, 20, 28, 67, 54,132, 78,116, 70,179, 54, 34,145, 40,241,196,137, 19, 36, + 42, 42,138,188,247,222,123, 68, 42,149,102,220,137,168, 30,217, 16,228, 79,190, 8, 26, 72,182,116,240, 38,127, 12,188,231, 6, +248,244,108, 5,159, 97, 65,194,172,194,139,251, 8, 41, 78, 34,121, 43,195,200,200, 96,126, 75,205, 86,184, 70,163, 41, 72, 75, + 75, 35,121,121,121,100,245,234,213, 68,169, 84,222,211,102, 43, 24, 24, 15, 96,225,138, 21, 43,110,154,172,245,235,215,199, 92, +190,124, 57,198,207,207,239,167, 22,124,215,218, 21, 43, 86,220, 52, 89,235,215,175, 39,151, 47, 95, 38,254,254,254,153, 77,173, + 56,125,250,116,233,131, 15, 62, 24, 51,109,218, 52,253,214,173, 91, 73, 90, 90, 26,137,141,141, 37, 43, 86,172, 32,239,188,243, + 14,249,234,171,175,200,196,137, 19, 43,123,245,234,117,118,210,164, 73, 98, 39, 35, 10,188,234, 40,140,144, 16,194, 39,132,212, + 24, 77, 30, 0,126,205,143,127,138, 99, 94,164, 33, 51,213,144,193,170,251, 94, 35, 70,172, 81,195,230,192,247,221,110,170,234, + 70, 66,106,253,253,199,152, 49, 99, 6,222,246,240, 33,120,127,230,252, 15,196,169, 91, 87, 67,251,221,103,224,150,106,193,175, + 40,130,233, 68, 36,172, 39, 14,224,137, 62,125, 36, 18,134,249,208,217, 29, 42, 20, 10, 33, 20, 10, 33, 16, 8,160,215,235,145, +147,147,131,126,253,250,113, 46, 92,184, 32,126,254,249,231,231, 74, 36,146, 12, 0, 19,154,188,154,153,170,136,244,169, 83,167, +240,220,115,207,137,182,111,223,222, 69,173, 86, 95,178,219,237, 66, 0,136,143,143,199,228,201,147, 69, 59,119,238,236,216,170, + 85,171, 11, 22,139, 69, 42, 18,137,192,229,114, 27,212, 19, 10,133,176, 90,173,162, 14, 29, 58,196, 94,186,116, 41,124,204,152, + 49,252,244,244,116,164,164,164,192,106,181, 10,131,130,130, 46, 95,184,112,161,203,232,209,163,249,153,153,153, 72, 79, 79,191, + 89, 15, 71,234,107, 54,155, 33, 18,137, 80,187, 73,139, 97, 24,152, 76, 38, 8,133, 66,135,181,120, 60,222,144,144,144,144,203, +151, 46, 93,234, 54,126,252,120,193,249,243,231,145,149,149, 5,187,221, 46, 12, 13, 13,189,124,233,210,165,174,227,198,141, 19, +196,198,198, 66,171,213,194,209, 38,180,154,207, 93,186,116, 9,211,166, 77, 19, 30, 57,114,164,171,183,183,119,172,205,102, 19, + 2,192,229,203,151, 49,121,242,100,225,209,163, 71,187,181,110,221, 58,182,137,166, 68, 46, 0, 88,173, 86, 60,255,252,243, 50, +165, 82,137,204,204, 76,176, 44, 11,187,221, 14, 0, 40, 42, 41,186,124,233,114, 92,252, 19, 83, 30, 29,104,176,152, 76,167,207, + 69, 95,107,219,198,223,151, 97, 72,155, 38,170, 58, 65, 38,147,101,172, 92,185,242,213,180,180, 52, 81, 72, 72, 8, 39, 57, 57, + 25, 21, 21, 21, 16, 8, 4, 55,207, 49, 71,183, 91, 40, 20, 14, 10, 11, 11,227, 25,141, 70,176, 44, 11, 0,132,195,225,212,123, + 48,196,165, 39, 16,234,105,227, 75, 36,146, 65,119,229,142, 84, 30,230, 14, 22,195,210, 11,204, 34,145,139,175, 66,238, 29, 4, +100, 68, 33, 80, 45, 2,151,195, 21,159, 79,209,203, 0, 50, 12,126,133,238,206,105,178,195, 82,242,205, 34,171, 91, 71,121, 43, + 95, 63, 20, 21, 21,161,117,219, 16, 24,133,106,225,169,164, 74, 57, 24, 39, 53,255,162,127,135, 14, 29,188,218,183,111,143,194, +194, 66,116,235,214, 13,174,174,174,174, 0,134, 53,219,100,125,237, 47, 66, 57,250, 2,156,149,176, 51,239,193,202, 91,138,164, +130,110,100, 83, 55,254,189,100,178,148,114,225,153,157,187,190,243,113,247, 11, 5, 34,159,134,167,139, 8, 91, 94,232,230,166, + 86,137,246, 55,211,108,133,123,122,122, 30, 59,123,246,172,135, 88, 44,198,133, 11, 23, 16, 22, 22,134,213,171, 87,171, 93, 93, + 93,163,238, 17,179, 69,226,129,131, 31,199,198,126,189,253,198,141, 67,211,219,181, 27, 51, 45, 40,104,201,172,199, 31,127,230, +229,151, 95,198,242,229,203,177,127,255,126,244,237,219, 23, 51,103,206,180,102,100,100,108,107,230,247,124,182,114,229,202, 57, +115,231,206,173,171,105, 73, 79, 79,111,180,181, 37, 44, 44,204, 55, 49, 49, 49,123,222,188,121,221,182,111,223, 46,145, 74,165, + 40, 45, 45,197, 23, 95,124,129,133, 11, 23,130, 97, 24, 16, 66,240,213, 87, 95, 73,159,122,234,169,158, 55,110,220,200,246,247, +247,111,178, 91, 7, 33,132, 33,132,136, 1, 72,171, 23, 25, 0,233,206,157, 59, 85,227,199,143, 87, 86,151, 73,170, 23, 17, 40, +117,169,215,139,212,122, 86, 30,170,179,191,199,212, 45,171,251, 30, 33,100, 76, 99, 26, 78, 26,232,250,190, 47,178, 49,179, 85, +251, 9, 52,168, 94, 23, 9,116,246, 10, 8, 70,217, 47,187, 33,225, 49,144,112,171, 23, 30, 3, 78,242,101,180, 22,243, 97, 37, + 36,188,185, 70,171,102,225,243,249,208,235,245,176,219,237, 88,184,112,161,232,231,159,127,118,231,112, 56, 63, 52,165, 83,219, + 48, 37, 36, 36, 32, 52, 52,148, 57,120,240,160,231,236,217,179, 37, 53,223, 83, 86, 86,134,246,237,219, 51,135, 15, 31,214,188, +245,214, 91,242,198,204, 12,195, 48, 16, 8, 4,152, 59,119,174,228,220,185,115,110,173, 90,181, 66,114,114, 50,138,139,139, 33, +151,203, 49,119,238, 92,201,217,179,103,213,173, 90,181, 66, 90, 90, 26,202,202,202, 32,151,203,157, 54, 90, 2,129,224,150,117, + 24,134,129,197, 98,113,202, 24,168, 84,170, 29, 49, 49, 49,106,149, 74,133,216,216, 88,216,108, 54,168, 84, 42,204,153, 51, 71, + 18, 19, 19,163,118,113,113, 65,124,124, 60, 8, 33, 80, 42,149, 78,213, 17, 0, 88,150, 69,124,124, 60,218,180,105,131,168,168, + 40,205,172, 89,179,196, 53,229, 73, 73, 73,240,245,245, 69, 84, 84,148, 70, 38,147,237,104, 72,139,101, 89,228,230,230,226,202, +149, 43, 72, 78, 78, 70, 65, 65, 1, 10, 11, 11, 81, 81, 81, 1,155,205, 6, 0,144, 86,148, 71,238,252,254,224, 37,137, 68, 34, + 13, 11,234,224,119, 57,238,106,190, 68, 34,145,250,251,249, 5, 1,239,114, 26, 49,132, 63,164,167,167,187, 63,245,212, 83,130, +188,188, 60,148,148,148,128,199,227,221,118,110, 9,133,142,117, 5,178,217,108,161, 98,177,152,177, 88, 44, 55, 35, 96, 66,161, + 16,175,238,208, 35,108, 49,110, 89, 30, 95,147, 15, 98,183,194,108, 54,135,254,227, 79, 48,128, 1, 99,238, 0,134,233,118, 38, +185,210,173,255,152, 41, 2,164, 28, 1, 88, 43,192,225, 97, 80,103, 95,222,254,203,149,158, 32,232, 12, 19, 66, 8,105,122,228, + 23, 1, 24,192,210, 30, 96,122,252,156,104,115,239,251,240, 11,130,236,236,108, 8, 4, 2,136, 68, 34,116, 27,242, 8,111,231, + 37,171, 23, 24,116,129, 5,193,142,104,222, 18,118,148, 72,222,126,231,157,119,100,181, 53,159,121,230, 25,153, 74,165,122,167, +217, 38,171, 82,218, 7, 54, 50,247, 74,182,190,205,146,200,188,208, 27,249,134, 96, 16, 50, 15,176,118,189, 3,102,107,144, 72, + 36, 74, 1,208,175, 69, 38, 75, 33, 60,189,107,215,119, 62,110,173,171, 76, 22,108, 70,128, 47,129,151,218, 5, 91, 94, 29,236, +166,118,145, 56,107,182,194, 61, 61, 61,127, 59,115,230,140,135, 88, 44, 70, 76, 76, 12, 4, 2, 1,196, 98, 49, 58,117,234,132, + 77,155, 54,169,221,220,220,238, 41,179,181, 44, 54,118,235,210, 43, 87, 18,222, 12, 15, 15,153, 32,147,185,189, 52,109,154,234, +173,183,222, 58,116,224,192,129,175, 71,143, 30, 93,120,238,220,185, 79, 0,236,118, 54, 98, 6, 96,253,170, 85,171, 94,170, 49, +110,111,189,245,214, 87, 7, 14, 28, 88, 58,122,244,232,220,115,231,206,205, 3,176,190, 49, 1,157, 78,119, 96,209,162, 69,170, +135, 31,126,184,230,127,156, 56,113, 2,219,182,109,131, 76, 38,187,229,179,227,198,141,195,115,207, 61,231,106, 54,155, 27,125, + 38,105, 52,154,161,103,206,156, 9, 67,213, 0, 47, 81,141,209,138,139,139,115, 41, 47, 47,119,145,203,229, 46,222,222,222,138, + 26,179,245,240,195, 15,187,240,120,188,126,160,160, 41, 47, 82,219,232, 56, 82,214,220,207, 59,106,182,234, 20, 53,152, 67,235, + 22,163, 53,102,204,152,227,104, 96, 36,149,165, 88, 11, 17,236,144,112, 25, 72,185,181,204, 22, 88,240,202,242,193, 52, 99, 0, +111,125, 15, 67,161, 80, 8, 46,151, 11,179,217,140,162,162, 34,167, 76,129, 82,169,132, 92, 46,135,193, 96,128,205,102,131, 88, + 44,174, 49, 35, 80, 42,149,224,243,249,224,243,249, 16,139,197,183, 69,147,234, 70,115, 4, 2, 1,100, 50, 25,114,115,115,145, +158,158, 14,150,101, 33,151,203, 33,147,201, 32, 20, 10,145,147,147,131,156,156, 28, 16, 66, 32,147,201, 32,147,201,224, 76,135, +107,187,221, 94,239,195,223,106,181, 58, 21,209,178,217,108,184,118,237, 26, 50, 50, 50, 32, 22,139,111,110,171, 72, 36, 66, 82, + 82, 18,242,242,242, 32,149, 74,161, 84, 42,161, 82,169, 28,214,173,217, 22,133, 66, 1,137, 68,130,146,146, 18,232,245,250,155, +251, 84,169, 84, 66, 38,147,161,172,172, 12,249,249,249,141,110,187,221,110, 71, 78, 78, 14, 10, 10, 10,144,153,153,137,194,194, +194,155,102,171, 58,106,212,178,192, 78,121, 57,138,138,138,110, 70, 34, 27, 90, 28,129,101, 89, 84, 84, 84,224,204,153, 51, 12, +203,178, 40, 45, 45,101, 11,242,242,236, 47,230, 8,177,255,221, 13,228,187, 35, 23,141, 59,127,138, 49,236,253,237,138, 97,253, +222,203, 6,113,175,247,108,119,229, 54,244,121,184, 10, 86,254,240, 66,157, 85, 84, 96, 17,168, 60,195, 35,128,148,195, 0,135, + 7,136, 93,209,187, 99, 32,210, 75,236,178,235, 90,179, 24, 12, 70, 96,125,144,171, 67,154,118,254,176,130, 10,171, 40,205,162, + 86,134,118,238, 14,173, 86, 11,145, 72, 4,145, 72,132, 30,125, 35,144, 82,100,151, 94,205, 54, 72, 65, 48,220, 33,205,191,104, + 43,151,203,251,244,235,215,143,169,173, 57,106,212, 40, 48, 12,211, 9, 64,136, 83, 55,185,181,109,133,176, 72,123,131, 71,230, + 94,205,213,183,218, 31,103, 12, 26, 59,225, 17,183, 79,127,205, 15,189,150,103, 10, 0,177,206, 7,177,116,111,129,217, 26,168, + 80, 40, 14,173, 91,183, 46, 64, 44, 22, 31, 6,208,191, 57, 34,114, 9,119,227,219, 47, 77,241,113,173, 49, 89, 86, 61,192,147, + 0,124, 9,192,147,192, 75,227,129, 15,159, 27,230, 38, 21,243,247, 58, 97, 88,119,174, 95,191, 94, 93,215,100,213, 44,221,186, +117,195,226,197,139,213,110,110,110, 59,238,242,195,114,184, 74,165,218, 30, 17, 17,113, 38, 71,161,120, 46,183,123,119,225,111, + 42, 85,217,208,178, 50,149,127, 92,156, 37, 24,184, 12,224,243,172,172,172,145, 78,152,172,199,149, 74,101,204,208,161, 67, 45, + 10,133, 34, 99,245,234,213, 47,206,158, 61, 27,203,151, 47,199,162, 69,139,190, 0,240, 44,128,255,101,101,101,181,106,202,100, + 1, 64, 94, 94,222,212, 55,222,120,163,176,176,176, 16, 0,208,169, 83, 39,148,150,150, 98,193,130, 5,120,229,149,170, 65,177, + 93,187,118, 5, 33, 4, 90,173, 22, 43, 87,174,212,230,229,229, 61,217,196,189, 61,115,247,238,221, 61, 45, 22,139, 47,170,154, + 7, 69,165,165,165,202,226,226, 98,133,197, 98,145,177, 44, 43,115,113,113,145, 3,144, 62,241,196, 19,188,171, 87,175,134,218, +108,182,108,234,173,254,162, 49, 47,210, 28, 24,134,137,108, 73,228,170,190,136, 88, 3, 52, 30,209, 26, 51,102, 12, 83,251,245, +150,136, 17,131,216,140,232, 40,184,133,119,191, 37,154, 37,229, 50,144, 40, 85, 72,201, 76,135, 0,204,149, 59,101,180, 74, 74, + 74,240,226,139, 47, 26,166, 78,157, 90,196,178,236, 35,142,154, 2,149, 74, 5,149, 74,133,171, 87,175,146,137, 19, 39,106, 87, +175, 94,109,168,109,180, 18, 18, 18,200,240,225,195,243,223,121,231, 29, 93, 99, 70,171, 38,162,181,108,217, 50,195,160, 65,131, + 10,174, 92,185, 66,106,204,148, 92, 46,199,202,149, 43, 13,131, 7, 15,214,158, 63,127,158,212,148, 57, 19,209,226,112, 56, 55, +141, 86,237,117, 56, 28, 14, 88,150,117,202,104, 85, 86, 86, 78, 29, 61,122,180, 54, 62, 62,158,212,108,167, 74,165,194,234,213, +171, 13,195,134, 13,211, 94,185,114,133,212,148, 41,149, 74,135,205, 96,205,247, 43, 20, 10, 40,149, 74, 92,189,122,149, 12, 31, + 62, 92,187,118,237, 90, 99,237,242,107,215,174,145,113,227,198,105, 43, 42, 42,166, 54,102, 94,106,154,243,108, 54, 27,140, 70, + 35, 10, 11, 11,145,153,153,121,179,233,208, 32, 83,142,156,242,216,216, 46, 6,131, 65,127, 53, 33, 49,163, 83,199, 48,141,193, + 96,208,167,103,100, 36, 0,239,178,141,104, 63, 18, 30, 30, 94,244,226,139, 47, 26, 74, 74, 74, 90,108,180,132, 66, 97, 60,143, +199, 35,253,251,247, 39,102,179,153,100,102,102, 90, 11, 75, 74,108, 33, 31,125, 68,174,188,250, 42, 35,137,142, 22,201,229,114, +166, 90,147,147,156,156,204, 74, 36,146,248,127,252, 78,196, 97,189,192,144,126,127, 38,234, 92,134,141,157, 44,100,242,206, 1, + 22, 29, 32,114, 5, 68,174,224,201,220,241, 80,255,174,220,173,103,202,189, 64,216, 7, 33, 16,249, 54,169,201, 39,158, 0,219, +255,151, 4,163,107,191, 73,115,132,197,197,197,224,114,185, 55, 77,145, 84, 38,195,208, 9, 79,112,190, 58,103,242, 2, 72, 95, + 48, 92, 95, 39,174,245,215,223,126,251,109, 65, 73, 73, 9, 56, 28,206, 95,154, 82, 41,102,205,154, 37, 82, 42,149,139, 28,190, +249,237, 14, 21,128, 47,234, 13,144, 87,174,231, 25, 91, 29,184,108, 8,158,191,108,139, 36,188,107, 79, 60, 63, 72, 35, 89, 22, +153, 31,126, 41,211, 16, 8,216, 95,133,205,220,163, 25,102,171,191, 66,161,136,140,142,142,150,142, 26, 53, 10, 43, 87,174,148, + 73, 36,146,195,205,185,241, 87,234,236,179,223, 95,251,141, 54,246,147, 17,128,165,178,202, 96,213, 90,242,117, 44, 22,111, 57, + 86,102,181,146, 41,142,106, 26, 12,134, 25,207, 62,251,108,209,222,189,123,111, 51, 89, 98,177, 24,169,169,169, 88,178,100, 73, +113,113,113,241,147,119,211,100,205,158, 61,123, 73, 86, 86, 86,240, 47,191,252,194, 43, 40, 40,208,172,250,242,203,178, 61,101, +101,197, 75,227,226,174,255,175, 99,199, 14,111,118,238,252,100, 35,169, 31,234, 53, 89, 47,189,244,210,206,172,172,172,110,191, +254,250, 43,191,160,160,192,247,165,151, 94,194,138, 21, 43,176,104,209,162, 77, 0,158,135, 99, 3, 94,254, 10, 32, 88, 44,215, + 75, 74, 74,198,140, 24, 49,162,180,164,164, 4,157, 59,119,198,216,177, 99,225,229,229,133, 86,173, 90, 97,252,248,241, 8, 10, + 10, 66, 81, 81, 17,166, 76,153, 82, 92, 80, 80, 48, 2, 64,114, 99,154, 69, 69, 69, 55,118,236,216,145, 48,103,206,156,110, 89, + 89, 89,161, 0,220, 43, 42, 42,100, 21, 21, 21, 34,179,217, 44,113,117,117,117,237,218,181,171,199,204,153, 51,229, 23, 47, 94, + 12,205,202,202,210, 1, 72,167,246,234,166,201,106,208,139, 0, 40,168, 54, 60,230, 58,175, 5, 77,188,231,232,186,245,254,237, +192,231,234,154,173,218,203,109, 77,135,245,159,140,192,226,109,187,183, 26,133,126,237,161, 10,238, 2,169, 88, 12,137, 80, 8, +137,171, 59, 76, 44,139, 47, 83,243,244,149,132, 44,114,118,135,214,125, 16, 50, 12,131,207, 62,251,204,214,167, 79, 31,227,177, + 99,199,214, 25, 12, 6, 63, 0,251,156, 49, 5,107,215,174,213,207,157, 59,247, 82,126,126,126, 23,177, 88,108,174, 41, 95,183, +110,157,254,137, 39,158,136,203,202,202,234, 38,149, 74,245, 13,245,207,170,109,180, 68, 34,145, 41, 63, 63,191,231, 51,207, 60, + 19,255,249,231,159, 87, 74,165, 82,200,100, 50,136, 68, 34,115,126,126,126,151, 23, 95,124,241,210,138, 21, 43,244, 18,137, 4, + 50,153,204,169,102, 57, 66,200,109,134,170,118,185,163,216,108,182, 99,249,249,249, 93,230,206,157,123,241,211, 79, 63,173,172, + 49, 64,181,235,184,106,213, 42,189, 92, 46,119, 42,162, 85,243, 57,153, 76,134, 53,107,214,232,231,204,153,115, 41, 63, 63,191, +139, 72, 36, 50,215, 42,175,156, 61,123,246,197,252,252,252, 46, 54,155,237, 88, 35,191,240,236,229,229,229,224,241,120,136,139, +139, 51, 9, 4, 2,112, 56, 28, 36, 37, 37,221, 52, 90,110,110,110, 97, 93, 58,117, 12,249,102,231,238,227, 18,129, 72,212,167, +103,143,208,228,180,244, 44, 66,152,180, 38,170,186,207, 96, 48,248, 29, 59,118,108, 93,159, 62,125,140,159,125,246,153,173,161, +200,150, 35,152, 76,166,227, 23, 46, 92,176,138,197, 98, 38, 55, 55,215,198,229,114, 97,183,219,137,169,103, 79, 83,167, 79, 63, + 37, 87,223,124,147, 81,202,100, 60,129, 64, 0,169, 84,202, 28, 57,114,196,172,215,235,143,255,243, 70, 11, 82, 48,144, 36,230, +155, 20, 98,142,141, 65,194,190, 42,147, 37,118, 1,196,174,128,216, 21, 62, 62,190, 56,151,170, 87,128, 3, 33,236, 14,228, 16, + 35, 68, 6, 6,210, 56, 45, 20,124,161,132,201,203,203,187,105,136,106,150,128,246,161,184,144,174,147,131, 33, 34,112,225, 76, + 10,146, 49,238,238,238,188,220,220,220,219, 52,195,194,194,184, 86,171,213,241,212, 46, 57,118,111,128,125, 41, 33,207,232,253, +227,165,202,224, 87,151,126, 37,145,216, 75,129,232,181, 8,111,219, 10,175, 78,234, 42,124,235, 64, 65,248,249, 52,125, 91,112, +201,243, 96,117,106, 39,234,217, 79,161, 80, 28, 62,127,254,188, 84,161, 80, 32, 57, 57, 25, 61,123,246,196,230,205,155,165, 82, +169,244, 39, 0, 78,245,199, 59,171, 69,186,174,194,222,231,245,221, 25,121,177,185,182, 91, 76, 86, 65, 37,193,179, 31, 31, 40, + 45, 41, 55, 62,114, 38,179,225,235,167, 30, 46,150,150,150, 14, 95,180,104, 81, 81, 65, 65,193, 45, 38, 43, 61, 61,189,198, 16, + 12, 2,112,229,110, 61, 44, 85, 42,213,180,165, 75,151,226,252,249,243, 24, 53,106, 20,162,162,162, 80, 92, 92,140, 93,135, 15, + 39,238, 72, 76,252, 95, 77,159,173, 6, 82, 63,212,139, 82,169,156,191,116,233, 82, 68, 71, 71,223,212, 44, 42, 42,194,210,165, + 75,179, 0,188,224,172,201,170, 33, 63, 63,255,220,245,235,215, 71,116,238,220,249,218,186,117,235,178,188,189,189,217,153, 51, +103,226,217,103,159,133, 90,173,182,175, 89,179, 38,163,127,255,254,113, 55,110,220,136,208,235,245,151, 29,249, 45, 80, 88, 88, +120,106,243,230,205,103,134, 12, 25, 34,157, 49, 99,134,122,255,254,253,238,122,189,190,149, 72, 36,210,152,205,102,225,181,107, +215,184,123,246,236,241,186,122,245,106,170,209,104, 60,215,220,186,255,215, 96, 24,230, 60,195, 48,145, 12,195,252, 90,231,245, +124, 99,239, 57,177,110, 67,127, 55,250,185, 58,213,220, 92,103,113,156,105,109,241,238,172,142, 10,253,169,233,189, 73,222,204, +126, 68, 59, 57,148,156, 24,232, 70,158,105,199, 84,206,104,102,122, 7,131,193,112,115,217,187,119, 47,241,242,242,170, 84, 40, + 20, 78,167,119,240,242,242,210,150,151,151,147, 7, 30,120,160, 88,173, 86,223, 76, 69,224,237,237,173,173,172,172, 36,189,123, +247, 46,214,104, 52, 55,211, 59,248,250,250,102, 18, 66,136,191,191,127, 78, 67,122, 54,155,141,120,121,121,213,140,208,227,187, +185,185,109,232,213,171, 87,177, 86,171, 37,222,222,222, 55, 83, 39,168,213,234,149, 61,123,246,172, 91,222, 84,125, 51,179,178, +178, 72, 86, 86, 22,105,221,186,117, 78,237,242,244,244,116,146,158,158, 78,124,125,125,157, 78,239,160, 86,171, 87,212, 83,151, +102,213,209,207,207, 79,107, 48, 24,200,131, 15, 62,120,203, 62,245,243,243,211, 26,141,198,154,114,135,210, 59, 72, 36,146,231, +197, 98,113,142, 88, 44,206, 17,137, 68, 75,218,180,105,147,255,253,247,223,147, 53,107,214,212, 12, 73,135, 58,108, 92,159,246, + 15, 62,249, 63,117,216,248,249, 45, 73,239,160, 80, 40,126,243,242,242,170,220,187,119,239, 45,231,151,193, 96,112, 56,189,131, + 68, 34,201,210,233,116,172, 86,171,181,158, 60,121, 82, 31, 29, 29,173,143,139,139,211,167,166,166, 26,138,242,243, 45, 90,173, +214, 80, 86, 86,102,186,116,233,146, 73, 42,189, 59,233, 29,200,230,160,246,100, 67,200,129, 27,239, 7, 92,157, 59, 64,106,188, +252, 97, 23, 66,126,120,152,144,159,158, 37,228,216,235,228,220,166,153,228,193, 0,145,253,228,130,214, 9,100, 99,240,143,142, +164,100, 32,155, 59,181, 39, 27, 66,126, 74,124, 47,224,234,140,254,173,140, 95,126,190,134,156, 61,123,150,196,197,197,145,228, +228,100,242,211,190,239,201,131,109,165, 85,154, 27, 66, 14, 56,153,230,161,175, 72, 36,210,173, 94,189,154,156, 57,115,230,166, +230,129, 3, 7,136, 84, 42,213, 3,142,141, 90, 38, 0, 67, 54,132, 77,176,125, 30,252,231, 91,195,228, 21, 69,135, 94, 39,228, +242, 86, 66, 54,135, 19,242,117, 47, 66,190, 31, 77,200,193, 39,201,153, 53,147, 72,223, 0,129,149,108, 12,142, 34,155,194, 28, +238,108,207,231,243,203,247,238,221, 75,114,114,114, 72, 84, 84, 20,137,142,142, 38,241,241,241, 36, 35, 35,131, 68, 70, 70, 18, + 62,159,111, 68, 51,166, 45,235,229, 9,255,136, 14,130,220, 75,203,250, 18,178,127, 10, 41,216, 49,141,140,233,168, 40,238,221, +186, 69,249,232,186,186,187,187, 23, 70, 70, 70,146,212,212, 84,114,252,248,113,162,209,104, 10, 1,132,223,237, 7, 98, 68, 68, +196, 89, 66, 72,204,168, 81,163, 98, 0, 28,137,136,136,136, 73, 73, 73,137,233,217,179,231, 25, 52,158,250,161, 65,134, 14, 29, +106, 33,132,144, 81,163, 70, 17, 0, 57, 17, 17, 17, 36, 37, 37,133,244,236,217,211,124,135,170,205, 5,240, 36,159,207,255,210, +205,205,237,119, 87, 87,215, 99, 92, 46,119, 51,128,233,104,126, 62, 46, 46,128, 86, 0,194, 0,244,168, 94, 66,171,203,232,136, + 67,202,237, 76, 10, 64,223,167,218, 50,199,167, 6,162, 98, 74, 32,116, 79,183, 99, 28, 73, 88, 26,209,144,209, 98, 89,150, 36, + 36, 36,144,193,131, 7, 87,202,100,178,108, 56,158,176,244, 22, 77, 15, 15,143,104,141, 70,115, 91, 18,205, 90,229,183, 36, 44, +213,104, 52,167,188,189,189,181,106,181,250, 66,125,154, 30, 30, 30,209,222,222,222, 90, 15, 15,143, 91,146,123,114,185,220, 81, + 30, 30, 30,217,117,203,121, 60,222, 16,141, 70,147, 89,183,188,129,109,135,151,151, 87,102, 78, 78, 14, 41, 40, 40, 32,126,126, +126, 57,117, 13, 88, 94, 94,222, 45, 6,204, 17,205,166,234,210, 72, 29,235,213,116, 96,159, 54,231,184,215, 16,228,227,227,147, +191,106,213, 42, 34,151,203,243,107,191, 17, 60,224,233,183,207, 38,234,202,159,125, 99,195,247,245, 36, 44,117, 52, 57,232, 8, +153, 76,150, 61,120,240,224,202,132,132, 4,194,178, 44, 97, 89,182, 33,163, 85,159,230,200, 30, 61,122, 20, 21, 22, 22,218, 43, + 42, 42,108,153,153,153,166,148,148, 20,195,135, 31,126,104, 41, 40, 40, 48,234,116, 58,115,108,108,172,201,219,219,187, 0,192, + 72,103,143, 81,115,159, 93,117,155,207,200,166,208,190,100, 99,104,100,252, 59,254,215,158,236, 37, 51,197,172, 26, 69,200,177, +215,201,153, 13,207,146, 62, 1,194, 42, 67,180, 41,228, 48,249, 42,104, 0, 89,219, 86,232,144,230,151,237,250,147, 77, 33,135, +175, 46,246,191,246,112,119,181,121,231,214, 77, 36, 41, 41,137, 28,216,179,131,244, 14,172, 54, 89, 27, 67,127, 38, 27, 66, 7, + 59,162, 89,159,217,218,178,101, 11, 73, 74, 74, 34, 63,254,248,163,163, 38, 43,162, 62,163,181, 48, 66, 94,250,108, 47,177,105, + 74, 87,161,121,124,184,192, 50,188,189,192,246,160, 63,207,222,197,155,195,134,170, 65,134, 7, 75, 76,100, 99,112, 20,217, 24, + 58,194,209,122, 10,133,194, 12,212,202,169, 83,119, 17,137, 68, 5,141, 24,173,136, 38,205, 86,144, 40,247,183,247,135,144,177, +157, 21, 69, 14,154,172,166,206,165,174, 30, 30, 30,133, 95,127,253, 53,241,244,244, 44,112,208,100,253,237,231,167, 74,165,218, +174,211,233, 98,142, 30, 61, 26, 19, 17, 17, 17,179,125,251,246,152, 19, 39, 78,196, 72,165,210,237, 53,193,137,186,102, 43,244, +246,251,127, 68,157,136, 86, 76, 69, 69, 5, 57,122,244, 40,137,136,136, 32,219,183,111, 39, 39, 78,156, 32, 82,169, 52,166,185, +245,252, 59,182,157,106,254,167,153,137, 6,154, 14,255,246, 31, 55,245, 25, 45,163,209, 72, 22, 44, 88, 96, 22,139,197,122,129, + 64,224,236, 20, 60,247,245, 73,232,225,225,113,202,211,211, 83,235,233,233,121,139,217,171, 93,238,225,225,113,225, 95,126, 1, + 6, 9, 4,130,116, 62,159,127,235, 20, 60, 97,227,250,180,235, 59, 99,145,103,248,184,135, 90, 88, 79,129, 64, 32, 88, 40, 22, +139,245, 11, 22, 44, 48,235,116, 58,103,140, 22, 0, 12,147, 74,165,217,219,182,109, 51, 36, 38, 38, 90,139,139,139,109,103,207, +158,181, 70, 71, 71,155,223,125,247,221, 10,169, 84,154,141,134,211, 18,252, 35,251,147,172,109, 43,172, 49, 91,151, 23,249,199, +143,237, 40,181,108,158, 55,156,244,105, 83,199,100, 53,156,201,189,126,205,106,179,117,241, 45,191,248,193, 65,114,219,210, 69, +175,146,222,129,146, 91, 77,150, 19,154,117,205,150, 84, 42,173,120,231,157,119,156,137,100,221,106, 8,191, 12,246, 35,155, 66, +182, 87,153,168, 38,150, 13,193, 95,144,207,130,253,238,149,235,168,151, 39,252,135, 6,137,174, 56, 17,201,114,164,158, 93, 93, + 93, 93,175, 57, 17,201,250, 39,182,125,248,172, 89,179, 98, 82, 82, 82, 98,146,147,147, 99, 78,156, 56, 17, 51, 97,194,132, 24, + 0,195,107,125,230,166,217,178, 76,156,104,234,202,225,188,218,132,230,227,179,102,205, 34, 41, 41, 41, 36, 57, 57,153,156, 56, +113,130, 76,152, 48,129,192,185,233,123,168, 41,162, 70,235,174,240,119, 79,248, 25, 1,224,215,218, 5, 98,177, 88,107, 52, 26, +213,114,185,124,159, 78,167,155,131,170, 97,145, 45,210,252, 59,234, 73, 53,255, 21,154,222,114,185,124,157, 78,167,155, 32, 22, +139, 11,140, 70,163,167, 19,154, 46, 34,145,232, 85,177, 88, 60, 88,175,215, 7, 1,128, 76, 38, 75, 48,153, 76,191, 27, 12,134, + 79, 0,148,222,237,109, 39,107,219, 10, 33, 20,246, 0,193,155, 49, 25,149,129, 75,143, 22,251,207, 27,226,154,241, 96, 59, 89, + 42,248,236,199, 96, 76,231,152,167,210, 77, 78,107, 74,152,158,176,243,223, 60,151,166,111,243,241, 47, 21,254,243, 7,203, 51, + 30,108, 43,207, 0,193,199, 16,233, 79, 59,171, 89,215,108,201,100,178,109,149,149,149,207, 1,248,221,217,109, 39,187, 67, 5, +168,180,250,192,202,237, 8,210,200, 20, 62,132,232,193,225,198, 33, 15, 90,230,221,107, 22,122, 29,253,227,154,195,229,114,249, +180,144,144,144,182, 87,175, 94, 77,214,235,245,223, 2,248,185,238,243, 39, 4, 24, 44,229,241,186, 24,108,182,168,107, 64,116, + 19,154,143,203,229,242,249, 33, 33, 33,225, 87,175, 94,189,162,215,235, 87, 1,216, 69,143,209,191, 74,243, 95,201, 63,158, 69, +185,230, 97,167,211,233,232,222,167,252,221,228,234,116,186,137,213,231,157,179,235,150,154, 76,166,197, 38,147,105,113,205, 15, +146,146,146,146,123,170,211, 42,243,114,178,153,172,109, 27, 13,161,112, 89,119, 63,201,156,189,179, 36,122, 16, 38, 11,124,118, + 77, 19, 38,171, 41,205,115,144, 88,151,245,244,151,188,242,227,243, 18, 61, 8,242, 64,240, 73, 19, 38,203, 81, 78, 86, 86, 86, + 6, 54,123,155, 31,189,102, 1,144, 74,128, 52,188,219,200, 15,197,119, 65, 24,218,201,248,110,242,179, 78,167,251,249,220,185, +115,141,125,134,196,103, 89, 53, 32, 0, 0, 32, 0, 73, 68, 65, 84, 3,199, 96,115,120, 48,192, 46,157, 78,183,171, 9, 77, 10, +133, 26, 45, 10,229, 62,228,158,125, 96, 51, 47, 39,155,201,238,208,243, 40,228, 46, 0, 7,129,128, 45, 29,149,182, 60,230,229, +116,115, 11, 53,207,162,144,153, 11, 46,130, 32,180,221,128,206,156,199,188,144,110,190,103,182, 27, 32,120,151, 26, 41, 10,133, +114,207, 48, 19,183,142, 52,188,249, 63, 53, 90, 20,202,125, 78,117,148, 39,171,122,185,103, 53, 41, 20, 10,229, 63,104,184,192, +160,225, 14,109,206,180,189, 54,167, 83,220,175, 84,179, 89,154, 92, 0, 42, 0, 46,168,154,198,161,102,152,112, 83,105, 54, 30, + 2, 96,165,251,147,106, 82, 77,170, 73, 53,169,230, 93,214,108, 74,251,126,236,251, 85,223, 40,195,205,255,196, 23,211, 17, 25, +119,150, 17,255,154,109, 39,232, 2,130, 53,213, 75, 23,122,220,169, 38,213,164,154, 84,243, 63,175,249,175,132, 54, 29,222, 95, +136,239,219,154, 19,226, 13,160, 38,201,101, 28,140, 76, 8,196,152, 11, 0,168,192, 5, 66,144, 8,160, 99,245,251,153, 12,227, +244,104, 84, 10,133, 66,161, 80,238, 22,221, 0, 92, 0,224, 13, 96, 52,128, 72, 84,103, 85,184,171, 70, 75,226,222,193, 27, 60, + 78,103,134, 37, 33, 0, 64, 56, 76, 60,108,108,172,161, 40,177,197, 15, 89,121,171, 32, 55, 2,225,110, 6,230, 71,117, 57, 9, +197, 45,213,235, 24,164,156,232,233,161,152,150, 87, 84,182,237,202,117,221,126,103,214, 85,169,252, 85, 98, 55,215, 73, 38,139, +181,163, 80, 32,200,176,148,150,111, 46, 41, 73,174,104, 70, 53,220, 26,123,243,221,119, 9,115, 40,247, 2, 35,144, 90, 56,238, + 74, 1,163,131,142,232,114,229,108, 64,105, 42,217,179,231, 81,226,236,177, 97, 56, 24, 36, 83, 40,186,139,196,210,158, 82,133, +107, 7,150, 0,197,218,236, 52,179,213,118,194,110,214,199, 16, 22,127, 56,113,172,158, 0,176, 20, 0, 48,100,200,175,232, 8, + 37, 62,169,169, 56, 94, 24,114, 25, 79, 28, 59,134,154,228,178, 11, 1, 44,163,215, 45,133, 66,161, 80,238, 51,163, 53, 26, 85, + 77,134, 77,119,134,247, 15,235,119, 94, 44,150, 4, 0, 0, 75, 8, 88, 2, 84,150,151,198,228, 37, 71,143, 0, 0,143, 54,221, +142,242,197,202,238, 44,169,122,223,206, 2, 54,139, 49,181, 60,253,236, 3,142,212, 72,166, 14,122,120, 72,196,208,137, 99,198, +140, 14,238,212,177, 83, 59, 0,184, 28,119,249,198,161, 67,145,215,143,253,202,236,173, 44, 72,248,177, 69, 1, 20,136, 63,232, +209,163,107,191,232,232, 11,239, 3,120,169,165,123,208,221, 93, 62,231,231, 31, 22, 12, 24, 58,113,165, 12,112,206,104,137,221, + 92, 39,141, 31, 59,178,235,107, 47,207,226, 60,187,224,163,128,243, 39,255, 88, 46,247, 14, 47, 37,172,245,231, 74,237,228, 63, + 27,155, 56,185,174,127,108,200, 96,125, 91,124,132,179,230,235, 62,174,134,226, 27,147, 9,107,159,204, 48, 12,184, 66,233, 30, +117,219,126,223,187, 12,154, 87, 2,192,225, 17, 99, 74,239,176, 8,141,183,239,222,201, 79,191, 42,150,170, 60,121,224, 10, 0, + 48,200, 73,187,134, 99,187,150,186,190,242,222,150,110, 39, 99,211,109,191,253,176,222,200, 8,248, 19,245,185, 87,155,110, 79, + 79, 79,119,129,191,127,213,223, 95,124,241, 54, 2, 2, 47,163,170,175, 25,176, 26,101,223,228,160, 35, 80,101,180,210,210,224, + 74,175, 89, 10,133, 66,161,220, 71, 68, 86,155,171,200,186,111, 52,104,180,196, 98, 73,192,153, 63, 14,185,253,120, 34, 19, 0, + 16,209,205, 11,255,251,112,221,240,237,107,163,175, 3, 64,159, 33, 99,130,222, 95,248, 50, 78, 93,201, 7, 33, 4, 93,219,187, +227,161,241,143, 58,102, 60, 60, 67, 31,152, 52,233,145,169, 11, 22,204, 31,151,148,148,148,182,115,231,206, 63, 1,160,255,128, + 1,237, 63,250,232,163,199, 86,186,186,137,190,219,243, 67,182, 81,123,237,124,115,182, 86,220,170,173, 79,112,135,192,105,223, +125,181,142, 51,104,196, 35, 83,210, 80,185,212,152,147,156,237,200,186, 30, 30, 30,115,249,124,190, 10, 0, 88,246, 47,255, 99, +177, 16, 47, 0,176,217, 89,133,107,171,224, 10,174, 64,108, 23,137, 4, 87, 43,116,186,109,229,217,215,190,108, 76,211,100,181, +134,191,242,194, 83,156,139,201, 69, 8, 8,239,207, 93,179,244, 45,176,118,171,235,171, 11, 63,156, 20,125,246, 59, 84,106,113, +220,193, 77,227,215, 45,240,241,233,205,253, 96,169,124, 24,195,224, 73,255, 62, 79, 79,120,127,235, 30,126,143,246, 74,152,172, + 44, 14,199, 20,245,217,240,201, 7, 43, 78,110, 24,125, 16,192, 38, 0,191, 1,104,210,212,185,185,187,125, 59,119,209, 39,242, + 74,243, 95,105,138,170, 77, 22,190,216,182, 27,151, 50, 89,132, 4,135,240,188,230, 46,151,111,250,112,230, 86,125,213,220, 93, +245,217,221,182, 0,250, 2,241,110,120,254,189,161,248,102,217, 18,104, 52,149, 80, 40, 50,192,192, 19, 64,135,234, 15, 38, 10, + 11,145, 9, 96, 97,126, 62,100,239,207,194,136,139,192, 27, 93,128,124, 0, 39, 25, 32,153, 94,195, 20, 10,133, 66,185,135,201, +197,173,157,223, 55, 55,105,180, 0, 64, 46,225,225,122, 74, 30, 0,192, 69, 2,204,121,126, 6,138, 10, 11,130,204, 54, 22, 79, +207,152,142, 11,241,185,184,158, 90, 0, 66, 8,130,124,165, 14,215,134, 11,182,199,211,207, 60, 61,240,232,207, 63,159,123,123, +209,219,223, 48, 12, 78, 3,192,166,205, 95,244, 89,252,206,226,231,166,207,152, 62,108,207,158, 61, 87, 0, 52,203,104,241, 24, +197,186, 21,203,150, 8,179, 10,141,198,185, 11,222,100,231,207,155,187, 6,192, 35, 14, 57, 25, 62, 95,149,149,149, 37,231,112, +110,157, 71,244,227, 37,111, 70, 13,155,184, 50, 49, 45,163,244,226,209, 3, 7, 30, 8, 11, 11, 67, 86,118, 94,223,229,159,110, +236,114,248,168,228,169,138,114,195, 68,125,225,181,122, 39,109, 22,241,249, 87,222, 91,190,161, 43,235,210,158,243,191,231, 70, + 33,188, 93, 43,100,231,151, 98,192,136,113,188,152,243,231,135, 3, 14, 27,173,186, 9, 26, 39,153,217,252, 46, 31,109, 59, 59, +116,194,131,173,122,112, 56, 92,232, 12, 86, 20,148,153, 96,103,129,254,161, 42,140,220,254, 41,175,184,210,250,240,135, 63,100, + 62,124,122,237, 24,173,177, 44,103, 54,128,189,141,127, 13,113,243,213, 40,113, 61,179,162, 94,147, 85,105,180, 1, 0, 4, 92, + 59, 24, 16,247, 70,132,250, 2,248, 26, 8, 1,126,153, 61, 21,158,158, 59, 61, 61, 61, 39,105, 60,189, 98,130,166, 62,197,248, + 4,132, 42,116, 6, 11,174, 94,185, 92, 17,214, 61,142, 84, 20,231,191,106,172, 44,217,115, 13,136, 11, 1,190,175,214,120, 10, +212,104, 81, 40, 20, 10,229,222,166,193, 81,135, 60, 0, 56,116,232, 16, 25, 51,102,204,109, 89,150,237,118,130,235,169, 85, 93, +112,184, 92, 46, 70,247,107,143, 53,203,223,131,193,108,195,165,148, 50,252,120, 42, 19,230,202, 82, 16, 66, 80, 24,174,169,239, +139,111,105, 82, 90,185, 84,210,141, 43,226, 79, 62,121, 86,214,198,205,213,213, 53,241,202, 55,149,139,231,105, 67,121,196, 18, +243,225,199,237, 83, 4,110,188, 7,119,239,254, 62,108,236,152, 49, 66,185, 92,241, 58,225,117,241,229, 87,146,249,101,101,177, +101, 13,105,214, 69,162, 9, 25, 55,110,244,200, 33, 94, 94,158,236,212,143,206,198,175,155,221,205,175, 67,251, 14,125,175, 91, + 13,227, 12,249,137, 7, 26, 88,237,166, 38,203,178,224,112, 56,208,106,181,176,219,237, 48,153, 76,176, 90,173,200,204, 76,211, +178,132,248,218,193,114,188,189,125,193,227, 9, 17,208,198, 31, 27,214, 44,149,110,255,238, 64,207, 55,222,254, 96,191,190, 16, +189,241, 87,114,203,155,154,198,226,146, 61, 63, 29,249, 89, 77,112,172,213,255,158, 27,197,205, 47,209,225,216,249, 36, 92,184, +154,233,236,129,172,155,194,161, 77,118,122, 82,249,202,149, 43,185,239, 31, 78,202, 28,242,208, 35,118,255,118,157,219,152,236, + 4, 0, 3,145,128, 7, 1,143, 3,127,181, 24,251,222,236,136,179,227, 99, 61,135,119, 83,127, 66, 8,217,219,216,254, 52,153, +172,246,126, 33, 50,110,151,182, 42,196,222, 40,193,185,195,167, 49,119,209, 39,136, 78, 49,161, 66,167, 7, 99, 55,129, 75, 76, + 40, 76, 79,134,205,110, 39, 77, 29,247, 42,186,149, 0,128, 72, 36, 90,248,227,193, 35,173, 76,172, 24,121,165, 38,104, 75, 76, +104,223,123,162, 44, 61,187, 0, 95,191,247,216, 66, 0,123, 66,128, 10,199, 52, 91, 12,213,164,154, 84,147,106, 82,205,123, 68, +179, 33, 47,114,159,208, 96, 42, 7, 78, 99,107,221,200, 44,198,245,148, 60,116, 15,241, 65,187, 54,222, 56,151, 80,130,111,143, +101, 98,203,209,116, 28,187, 84, 0,150,167, 64, 94, 57,144,152,166, 69, 98,122, 97,147,249,179,185, 34,254,228, 87, 94, 41, 91, +208, 41,172,188,247, 31,135,231,192, 71,157, 24,246,198, 27,165,115,184, 34,254,100,215,214,138,157,111, 46,120,117,154, 66, 42, + 21,154, 77,102,180, 13,244, 23,191, 60,123,206, 83,140,171,104,167,163, 91,169,240, 9,117, 21, 73, 36, 95,126,248,238,235,162, + 79,126, 76,204,168, 52,163,114,239,105,109,242,252, 55, 23, 23,243,248,226, 13, 10,159, 80,135,251,254, 88,173, 86,152, 76, 38, +152,205,102, 88, 44, 22,100,103, 94, 27,247,219,143,175,141, 8,108,237, 54, 66, 36, 22,131, 0, 40, 55,216,144,146,171,199,224, +161,195,184,221,187,117, 11,151,123,135, 62, 83,159, 86, 89, 89,122, 25, 75,184,138, 67,251,118,112,191,255,229, 34,190, 57,116, + 30,251,127,191,136,115,199, 15,219, 8,107,189, 57,255,151,220,187,125,144,220,187, 83,186,188, 85,103,237,205,197,167, 99,116, +163,251,148,203, 33,131,135, 70,252,250,252, 75, 47,255,161,175, 40,202,255,114,221,123,217, 5, 57,105,215, 68, 2,198, 38, 21, +113,161, 51,218,176,245,183, 28, 76, 90,122, 9, 87, 51,116, 32,132, 52, 57,129, 55, 11,204,155,252,204,107,118,171,197,130, 96, + 63, 57,118,108, 94,134,113,131,187, 96, 72, 39, 87, 60,208, 78, 6, 41,207,132, 43,241,215,177,107,199, 86, 27,203,114,230, 55, +113, 33,142,172, 94, 98, 0, 64,167,211,189,246,198,235,243, 11,204, 54, 22, 22, 43, 11, 75,245,235,111,187, 62, 46,176, 27,245, +175, 85,175, 23, 83,107, 61, 58,151, 22,133, 66,161, 80,238,135,136, 86,205,226, 93,251,141, 6,155, 14,141, 70, 67,234, 35,147, +167,195, 91,227, 37, 31, 63,232, 73, 65,204,141, 82, 20,228,166, 35, 41, 33, 14,122,163, 21, 2,215, 64, 64,236,133, 54, 1,254, +136,189,190,223,178,118, 69,164,142,181,153, 82, 27,210, 27, 55,206,219, 55, 41,158,225,172, 88,238,119, 38,225,122, 73,247, 29, +139,190,198,212,169,114,143, 21,203,253,206,164, 37,203, 56, 82, 49,121,240,169, 25, 83, 24, 14, 67,240,198, 27, 11, 48,126,204, + 72, 60,253,212, 19,204,182,109, 91,123,151, 58,184,149, 44,248,159, 45,124,235, 61,161,182,212,102, 62,151,160, 51, 73,101, 18, +201,201, 68, 93,101,120,128,159,100,212,196, 39,115, 34,119,127,249, 9,128, 25,142,104,213, 24, 44,171,213, 10,139,197, 2, 0, +118, 0,224,112,170, 94,139, 42,204,200, 47, 53, 65, 91,106,130,205,206, 98,226,228, 25,146,243,209,151,102, 0,104,160,191, 22, +203, 90,109, 86,236,253,229, 2,178,207,239, 97, 25, 14,183,172, 86,103,120,200,189,219, 7,121,121,249, 69,141,153,248,132, 90, + 40,174,106,134,173,168, 52, 97,219,198,229,141,214,147,195, 48,132,181,219, 74,109, 86,107,101,219,192,182,217, 33, 97, 93,196, + 39,254, 56, 58,238,228,175,123,117,182,182, 79,184,220, 72,203, 5,151, 47, 2, 87, 32,134,201,226,216,192, 67,109,210,153,245, + 0,152,103, 94, 92,176,230,213,215,254,199,157,183,246, 79,152,141,122,152, 12,149, 40, 47, 43,129,132,103,197,149, 83, 7,108, +196,110,125,181, 50,247,226,250,134,149,152, 28, 0, 57,181, 75,138,139,139,143,157,250, 51,234,224,217, 83,127, 62,237,213,182, + 59,199,108,101,145, 20,119,150,205, 78,140, 62,104, 50,149, 31, 3, 0, 6, 40, 2,112,148, 94,183, 20, 10,133, 66,185, 15, 35, + 90, 51,107,151, 53,104,180,210,175,158,120, 0, 0,130,122, 12, 47,146,139,121,110, 60, 14, 3,109,214, 13,108, 91, 57, 23, 44, + 75, 48,234,185, 21, 80, 4,120, 65, 34,224,194,164, 43,210, 21,223, 56,222, 88, 95, 29, 48,140,117,216,250, 77,217, 1, 47,190, +208, 86,185, 99,135,142, 15, 0, 59,118,232,248, 47,204,106,173,252,124, 83,106, 64,175,126,221, 65,236,118,140, 25,255, 8, 38, + 63, 62, 25,105,121,122,252, 16,149,129, 74,131,217,161,209,114, 18,143,144, 46, 30,238,234,145,175, 60, 57, 82,198,227, 50, 76, + 7,127, 21, 55,179,192,106,227,114,249,246,131,231,203,114, 38, 78,124,220,227,216, 79,223, 15,177,123,132,116, 49, 20,198, 95, +106, 74,207,100, 50,221,210,116,232,230, 17,248,211,176, 71, 86,102,229,230, 85, 68,230,149, 24,123, 85, 90,109,208,150,154,144, + 95,106, 66,105,165, 5, 94, 10, 87,216,172,230, 78, 13,233, 17, 66,190,153,240,200,244, 39, 0,112, 24,142,237,107, 93,110,124, + 66,213, 59,127,153,172,145,227,167,170,163, 98,110, 32, 41,250,112, 9, 97,109, 85, 89,220, 25, 54,171,241,253, 10,194,101,192, + 10,120,140,149,203,225,176, 22,139,206,170,209,168,143, 29, 63,118,100,172,209,150, 12,174, 64,116,243,179, 6,179,221,225, 51, + 70,155,116,230, 51, 0,248,116,237,154, 85, 15, 14,155, 42, 56,126, 33, 21, 6, 43,208,167, 91, 16,246,125,247,133,137, 16,235, +107,149,185, 23, 63,115,226, 36,116,105,221,186,245, 92,190, 80, 56, 68, 34, 85,180, 86,123,251,113, 44, 54, 59, 44, 86, 59,100, +238, 62, 28,145,220,109, 24,203, 17,156,176, 89,204,199, 44,149, 5,159, 2, 40,165,215, 45,133, 66,161, 80,238,179,168, 22, 80, + 43,135,214, 45, 70,235,208,161, 67, 4, 0,234,107, 31,205,214, 22,195, 93,206,131,186, 85, 0,166,205, 93,133,111, 62,153, 7, +187,221, 10, 66, 0,155,221,177,204, 4,132,240,127,121,233,133,128,144, 54, 1, 92,245,180,169, 82,195,183, 59,244,146,105, 83, +165,134,142,157,220,203, 94,122, 33, 32,181,194,232,215,215,102,183,227,228,149,124,196,165,150, 33, 46,173, 28,114,137,227,105, +190,184, 66,193, 11,203,151, 45, 21,240,184, 12,115, 37, 93,167,203, 42,178,233,184,124,190, 69, 42, 17, 18, 51,225,153,210, 10, + 73,209,208, 9, 79, 25, 14,110,255,244, 25, 0,179, 27,140,138, 85,143, 52,172,137,100,213,188, 18, 66, 8, 3,176, 44, 99,183, +103, 21, 26,161,179, 88,161, 45,249,203,104, 49,182,134, 91, 78,229,222,237,131,148, 10,249, 17, 46,151, 43, 34, 4,176, 90,108, +143,193,187,253, 8, 93,110, 82, 66,109,147,117,230, 74, 14,110, 92,252, 85,107,183,232,167,235,243,175,255,230,232,182, 51, 12, + 8,151, 11,150,203, 97, 88,134, 1,203,231, 16, 51, 8, 97,235,214, 72,239,132,209,170, 49, 91, 66, 62,119,209,207,187, 62,209, + 60, 61, 58, 20,223, 69, 85,121, 62, 99, 69, 65,121,101,182, 83, 38, 11,238,238,238, 51, 94,127,253,245,119,198, 61, 50, 21,101, + 70, 6,218,146,170,104,160,217,202, 66, 32,243,192,176,151,190,106,157, 91, 80,222, 58,233,220,193,190,133, 23,119,148, 89,141, +101,107,232, 53, 75,161, 80, 40,255, 45, 26,243, 34,247, 81, 84,235,246,136, 86, 99, 27, 68, 8,144,152, 94,136, 54,190,106,248, +182,105,135,132,107,177,127,189, 7,192,102,119,172, 57,234,192,129,220,172, 85,171,148,236,188,121,101,125,150, 47,247, 59,253, +194,172,214,170,142,157,220,203, 94,127, 61,163,207,234,213,170,211,191,156,225,219, 73,117,190,174,154,220, 92,132, 56,147, 99, +147,211,179, 75, 88, 32,247,189, 29,137, 25,191, 93,174,200, 23, 8, 4, 86, 47, 87, 49,163,144, 11,185, 92, 14, 95,104,178,114, + 76, 65,225,221,184, 7, 57, 76,183,198, 84,106,140, 86,221,166,195,162,130, 27,227,126,254, 97, 65,199, 65, 19, 86,184,101, 23, + 24, 80,102,230,222,108, 58,228,114, 24, 92,190,150, 14,112, 5,113,245,105, 42, 21,110, 71,119,126,251,141,223,234,229, 75, 96, +177,217,241,210,188,183,241,212,140,233, 71,225,221,126,132, 95, 64,112,204,159, 7,191,150,142,152,181, 1,233,215,163,243,108, +166,242, 93,206,152,172,155,102, 11, 32,118,194,114,138, 75,202,229, 38, 27,196,168,199,247,153, 44,108,179,206, 28,157,193,134, +131,103,243,112,232,199, 93, 80, 41,100,205,210, 80,169, 84,161, 3, 6, 12, 4,195, 19,194,108, 53,193,108, 99, 97,174,213, 71, +203, 98,101, 97, 37,124, 72,189, 59,163,248,234,190, 80, 24,203,232, 29,135, 66,161, 80,254, 67,220,199, 29,225,107,155,171,134, + 35, 90,141,225,239,235,137,179,113,169,232, 20, 18, 8,149, 82,129,248, 27, 89,224,114,248,224, 48,128,213,230,184, 25, 34, 22, +235,119,171, 87,171,144,158, 42,227,124,190, 33, 53,224,165, 23, 2, 82, 87,175, 86,157, 38, 22,235,119, 0,166, 19, 2, 84,153, +173, 42,195,101,119,194, 23, 16,214,218,218,211, 77,202,141, 78,174, 44,226,112,184, 38,119,149,152,117, 87,137, 56,238, 10, 33, + 95,192,231,178, 54,194,177,248,106, 2,140,132,101, 29,153, 87,239,150,166, 67,187,221, 14,134,225,216,171,141,152, 44,179,200, +128, 50, 35, 23,218, 82, 19, 74, 42, 44,232,224, 35,195,175,199,246,232,237, 86,195,142,250,180,184,124,129,170, 93,128, 47,254, +247,193,106, 24, 76,118, 36,102,235, 32, 16,137,188, 60,189,194, 47, 77,127,241, 77,209,203,155,111,224,153, 33,238,152,247,231, +141,108,189, 86,252,166, 51, 71,214,110,183,195, 96, 52, 11,180,133, 37,174,229, 21,149, 74,137, 88,100, 80,187,169, 10,235,251, +172,209,201,136, 86, 13, 82, 49, 15, 99,123,123,193,104,153, 2,131,201,134, 83,191,237,109,142, 76,160,103, 43, 95,232,204,181, +204, 85,181,217,170,109,186,248,114, 53, 0, 38,144,222,114, 40, 20, 10,133,114, 31,209,224,168, 67,135,140,150, 92, 42, 6,225, +138,241,103,204, 13, 4,135,117,198,214, 3,231,208,190, 83,111,228, 86,216, 64,192,105,114,180, 97, 13, 11, 22, 26, 46, 0,184, + 48,110,156,212,247,225,135,125,134, 17,194,255,101,195,166,242, 44, 0, 8,236, 88, 37,195,178, 4,132, 0,132,173, 50, 92,142, +135,116,120,233,169,185,229,109, 2,188,100,184,154,101, 49,201, 68, 2,142,171, 76,200, 85,171,132, 2, 1,143, 7, 59, 97, 76, +185,185, 55, 76, 12,144,230,136, 92,221,166, 67,169,220,251,167,161, 19, 86, 20,164,101,148, 69,119, 40,214,119, 41,179, 8, 65, + 8,208,193, 71,134,184, 51,145,118,109,118, 82,162, 65,123,125, 99,125, 90, 44, 11,174,197,198,226, 82,114, 25, 74, 43,173, 40, +213, 89,208,119,240, 88, 65,223,136,113,248, 51,174, 16,172,205,138,229, 95, 68, 86,216,137,117, 50,112,205,234,196, 70,115,206, + 94,184,226, 91, 80, 82, 41,226,243,120,165, 33,237,253, 83,132, 2,190,173,188,188, 92,120,235,167,184,144, 73,132, 40,214, 89, + 1,192,234,236,217, 83, 86,105,197,129, 51,121, 56,184,119, 39, 36, 18, 9, 72, 51,206, 64,129, 64,224,194, 23,136, 97,169,172, +106, 46,172, 89, 44,117, 22, 14, 79, 4,112,120, 46,244,154,165, 80, 40, 20,202,125, 68,237, 57, 14, 71,215, 54, 95, 28,135,162, + 38, 44,129,135,187, 27,196, 50, 37, 82,181, 22, 84, 48, 26,148,232, 9,236,246,170,136, 86, 35,129,167,122,103,247, 62,112, 32, + 55,107,255,254,194, 45, 7, 14,228,214,234,232,253, 87, 36,235,230, 43, 75, 28,214,100,136,253,215, 3,135,255, 40, 27,215, 75, +237,202,225,114, 13, 2, 62,199,196, 19,112, 45, 2, 30,199, 42,224,113,204,158, 74, 62,247,143,131,187,132,132,193, 31, 77,105, + 26,141, 70, 68, 68, 68, 96,212,168, 81, 24, 63,126, 60, 30,125,244, 81, 4, 5,133,106, 56, 92,198, 76, 24,150, 85, 11, 43,208, + 78,205,128,103,204,196,111,187, 62,214,199,157,220,119,201,110, 50,142,197,173,150,243, 47, 77, 66,216,226, 50, 19,140, 22, 59, + 74,116, 22,148, 84, 90, 96, 83,247,193,190, 83, 57, 48,152,237, 72,143,217, 99, 40,200,203,154,107,202, 79, 74,109,226, 80,188, +113,235,191, 36,235,217,167,103, 20, 40,196,156,164,254, 15, 62, 80,224,225,238,102, 99,152,191, 34,175, 12,195, 64,172,212,192, +213, 69,129,212, 11,135,241,243,242,161, 6, 0,111, 57,178, 63,107,163,148,242, 48,174,151, 23,198, 78,156,130, 78,189, 71, 56, + 98,172,111,211,148, 74,165,146,154,232, 85,237,180, 14,230, 90, 81, 45,123,245,241,230,240, 68, 18, 71,143,123, 11,161,154, 84, +147,106, 82, 77,170,121,239,104,222,207,212,204,113, 88,243,234, 88,102,248, 26, 3,212,214, 91,134,246, 62, 50, 24, 45, 26, 24, +205,118, 84, 26,237, 40,215, 91, 80,174,183, 34, 53, 79,143,184, 3, 45,175, 97, 85, 20,171, 42,245, 57,169,202,183, 9, 59, 75, + 28,142,158, 8, 45,230, 15, 86, 45,255,232,177, 93,221,186,154, 95, 30,237,221, 58, 54,213,156,195, 48, 28, 3,135,203,179,186, + 41,120,252,248,248,216,130,211, 81, 63, 13, 16,219,236, 79,232, 27,209,177,217,108,101, 62, 62, 62,213,145,168,191, 44,100,104, + 59,201,248,147,145,111, 4, 14, 28,183, 92,253,201,146, 5,122, 14, 87,192, 50, 60, 65,156,221,106,216,105,208, 94,223,128, 70, +236, 7, 71, 32,190,118,246,226,213,222, 46,110,173,145,148, 93,137, 74,163, 13, 22, 27, 11, 87,185, 0, 89,151,143, 90, 82,227, +163,191,215,229,196,110,109,198,110,219,145,112, 45,206,119,228,200, 17,143,244,238,221,135,187,120,241,219, 8, 14, 14,134,193, + 96, 0,135,195, 65,235, 54,237,144,154,112, 17,103, 34, 63,176,235,139,210, 54, 2,120, 31, 64,129,179, 95, 82, 88,110,198,225, +232,124, 68,254,248, 29,184,124, 97,115, 14, 47, 71, 34,145,136,235, 51, 87,181, 77,215,205, 15,243,133,226,234, 31, 1, 44,189, +118, 41, 20, 10,133,114,159, 48,179,206,235,102,135,140,150,209,104, 76,237, 23, 49, 22, 44, 75, 96, 39, 0,107,175,142, 60,177, +127, 69,159,236, 86, 99,106, 75,107,199,178,246,115,159,109,222, 50,170, 91,207,129,220, 48, 63, 57,202,139,242,112,230,228,239, + 54,176,228,180, 35,235, 23, 21, 37,234, 36,158,237, 31,121,108,210,195,187,103, 60, 61,171,116,192,224,193, 50,141,198,203,148, +149,157,165,255,106,251,183,214,163, 63,237, 31,192,194,246,120, 81, 81,146,174, 49,157,178,178,178, 79,235, 43, 23, 9,229,125, + 1, 4,114,121,140,217, 80,144,232, 84,143,240,194,236,204,137, 31,125,240,110,218,212,231, 94, 21,182,245,105,135,252, 50, 46, + 82,179,242, 16, 31,181,223,148,157,112,254,199,242,172, 11,207, 56, 40,149, 91, 79, 89, 22,128, 79,206,156, 57, 29, 62,114,228, +200, 17, 67,134, 12, 33, 51,103,206, 4, 33,192,111,155, 95, 32,197,169,103,246,160, 42,138,149,220,204,227,146, 30,117,250,162, +219,163, 3,122,240,220, 21,207, 96,203,119, 63, 89, 65,216,116, 39,101, 60,125,253,218,240,170,154, 11,171, 82, 58,212, 93,204, +214,191,250,143, 9,228,158, 60, 61,226, 60, 27,216, 94, 10,133, 66,161, 80,238, 53,154,223, 71, 43,243, 90, 85, 62,173,191,155, +138,188,252,233, 91,183,126,243,225, 55,219,119,245, 53,154,205, 62, 4,130, 76,187,205,124, 92,103,199, 98, 71, 53, 12,218,164, +104,119,247, 14, 29,191,250,226,179,183,190,218,242,249, 64,176,246, 16, 6, 72, 35, 12,254, 16, 91,237, 51,154, 50, 89,141,154, +165,194,138, 77,195, 30, 89,105, 40, 42,210,125,227,236,186,134,162,235,121, 28,174,165,245,166, 53, 31,172,224,112,184,195,237, +118,150,207,218,173, 73,118,139,241, 99, 67,193,245, 3,112,184,151, 27,138, 27,121,239, 10,128, 43,199,142, 29,235,127,236,216, +177,158, 0, 62, 69,213, 28,138,209, 45, 57, 46,166,162,138,161,175, 45,120,237,183,249, 96,252, 89,150,192,102,103,211, 5, 6, +253, 80, 39,101, 90,183,109,219, 78,106,177,218,111,235, 0, 95,187, 35,252, 77,163,165,242,149, 2,104, 77,141, 22,133, 66,161, + 80,238, 19,102,226,246,164,165,142, 69,180,254, 41, 74, 74,146, 43, 80,130,151, 91,170, 83, 84,148,168, 3,112,219,200, 61,125, + 11,117,227, 18,203,127, 64, 98,249, 15,205, 93,191, 50, 63,165, 0, 72,153,209,194,106, 56,210,145,253,207,234,229,142, 80, 88, +120,173, 18,133,232,213,210,195,178,227,219,237,241,187,118,125,199, 39, 28, 46,159, 37, 92,129,141, 48,124, 27,203,240,173, 86, + 22, 38,139,213,106,177,217,172,176,219, 44, 96,237, 86,194, 90,172,168,202, 14, 79,161, 80, 40, 20,202,253,108,184,238, 29,163, + 69,249, 87,147,124, 35, 41,161, 55,221, 13, 20, 10,133, 66,249,151,155,172,218,175, 0,170,250,158, 55, 52,114,192,153,201,124, +155, 51,250,224, 87,170,217, 98, 77, 62, 0, 33, 0, 57,128,166,154, 52, 71,160,122,190, 70,186, 63,169, 38,213,164,154, 84,147, +106,222, 69,205,166,180,127, 5,229,111, 53, 96, 84,147,106, 82, 77,170, 73, 53,169, 38,213,252,239,105,222,207,204,172,103, 1, + 64,155, 14, 41, 20, 10,133,242, 31,196,221,189,131, 28,184,217,175,183, 73,164, 30,161,158, 0,160, 47,188,166,165,123,143, 82, + 15,181,231, 57,188,165,143, 22,167,153,130,124, 14, 79,248,154, 84,225,126, 77,166,114,207,254,143,239, 92, 38,168,141,108,206, +176, 1, 1,251,130, 3, 37,227,157, 89, 81,170, 14,250,218,171, 93,175, 12,153, 38,104, 14,188,187, 73, 90, 82, 9,153, 38, 80, + 45,111,221,227,164,194, 39,252,161,191, 97, 27, 69, 97, 97, 97,125,194,194,194,250, 0, 16,221, 9, 65,169, 38,104,138,111,251, +222, 81,154,182, 93,127,151,121,118,152,116,167, 43, 44,247,110,239, 46,111,221,253, 7,121,171,206, 37,114,239,206,229,114,223, +238,199, 21, 30,161,109,155, 90,175,245,184,143, 66,222,219, 25,183,179,245,184,143, 66,234,123,223,117,228, 90,197, 59,187, 18, +151,184,143,253, 88, 78,239, 43,205,163,117,223, 41, 46,222, 3,231,187, 59,187,158, 79, 80,239, 43,109,194,251,231,183,234,208, + 43,206,209,117,124,131,251, 92,240, 15,235,171,245, 13,234, 19, 77,247,188, 99,136,213,129,125,196,174,126,145, 34, 87,191,159, + 68,110,129,131, 91,170,231,237,237, 45, 9, 9, 9, 25,217,187,119,239,231,135, 14, 29,250, 74,215,174, 93,103,250,251,251, 15, +191,155, 63,244,165,154,160,133, 38, 62, 83,104,226, 51,133, 82, 77,208,194,166,239,175,193, 31, 50, 28,123, 14,195,177,231,200, + 52,193, 31,222, 43,199, 74,228, 25,228, 47,213, 4,173, 86,120,133,157,147,104, 58,140,117,118,125, 87, 87,215,225,106,181,122, + 66,205,226,234,234, 58,156, 94, 1,205,166,118, 20,171,197, 17, 45, 46, 95, 36, 61, 49,245,233,151, 58, 46,123,247, 77,241,154, + 45,251,176,102,201,130,171,166,202,210,176,123,113,203, 61, 2,123, 70,115, 57, 92,223,218,101,118,214,158, 85,152,114,174,199, +157,208, 15,110, 35,121,230,173,215,167,207,155,242, 88,132,127,196,152,185,204,245, 20,195,126,199, 45, 26,186,124,255,195,143, +173,163,254,248,125,237,150, 45,155,223, 47,176, 5,175,230,139,120,159,149,103, 94, 41,117,166, 14, 74,117,219, 64,158,204, 35, +170,223,248,151,188, 98,126,253,118,171,221,204, 14,211, 23,214,154,253,187,249,168,219,181,107,247, 0,151,203,117,159, 51,103, +142, 0, 0, 62,249,228,147,246,118,187,189,232,198,141, 27,231,209,140,228,167, 85, 6, 51,120,250,167, 43,222,251,230,161,135, + 70, 33,167,176, 18,203, 87,175, 31,116,228,208,247,143, 86,106, 19,247,220,137, 99,226,226, 18,160,132, 64,113,121,238,235,239, +107, 70, 14,122,128,171, 51,218,112, 36,234, 98,255,111,215,191,127, 14, 8,237, 89, 81,120,173,193,156, 98,172,190,108,145,167, +156,140,100,245,101, 0, 48,229,182,135,189,220, 26,161,150,216, 71,122,139,120, 23,139,128, 38, 39,125,116,105,211,247, 40, 95, + 36,242,231,112, 56,224, 48, 0,135,195,128,203, 48, 85,243,132, 90, 12,233,217,241,127,142,184, 23,174, 19,133, 95,207, 60,112, +121,238, 28,230,175,250, 49,156,234, 87, 66,202,243, 18, 79,184,223,129,175, 81,117,108,239, 18,222,183,125,229, 87,199, 83,138, +101,188, 1,175, 68, 50,132,243,121,198,159,171, 47, 57,100, 0,196, 98,215,131, 7, 15,170, 71,142, 28,169,210,132,143, 63,238, +200, 58, 66,174, 46,236,208,161, 3,130,145, 35, 71, 56,113,126, 6, 13, 3,135,179,157, 1,248, 44, 75, 62,225,178,228,123, 93, + 81,194, 13,192,185,217,167, 36,154,224,103, 56, 32, 14,223,103, 88, 48,209,134,252,235, 91,154,187,115,121, 34,229, 80,190, 64, +240, 74, 96, 80,167,110,217,105, 73,209,149,186,138,213, 54, 83,217,113,167,133,172,182,215,126,253, 51,230, 33, 30,159,207,140, + 28,218,139,107, 2,126,111,201, 65,247,244,244,156,176,110,221,186,182,125,250,244, 1, 0,216,108, 54,229,238,221,187,189, 62, +248,224, 3, 89, 66, 66,194,222,102,202,250,168,213,106, 63,161, 80,232, 3, 0,102,179, 57,187,160,160, 32, 3, 64,147, 63,252, +101,158,109, 61, 64,240,254,159, 81, 81, 60, 0,232,223,127,192,135,126,253,102,187,114, 5,114, 67,189,187,227,255,236,157,117, +120, 84, 71,219,198,239,115,214, 45,238, 9,193, 3, 65,131,187,123,209,226, 90,220, 42, 20, 90,138,180,180,120,161, 45, 78, 41, + 45, 80,160,184, 91,176,224,208,226, 1, 2, 1,146, 16,247,100,163,187,155,245,221, 51,223, 31,155, 80, 36,178, 1,250,245,109, + 59,191,235,218,107,115, 54,155, 59,115,108,206, 61,207, 60, 51, 99, 84,203,243,162, 47,205,184,121,235, 6, 3, 0, 45,154,183, +156, 35,115,175,253,227,223, 25,217,146,120, 6, 54,103,129,207, 90,180,237, 50, 96,232,176, 81,108,221, 26, 21,209,173,107,167, +217, 58,224, 68,185,174, 25, 62, 95,122,251,246,237,234, 44,203,242, 44, 22,139,190, 69,139, 22,137,111, 83, 46,223,154, 45,175, + 51, 96,253, 77, 22,227,102,101,204,221, 37,120,125,210,105,158,147,127,163,175,192,227, 79,228, 56, 46, 73,157,120,183,213,191, + 48,162,245,250,113, 46,175, 18,203, 23, 77, 31, 62,246,195,122, 51, 62,255, 82,242,233,154,139, 56,185, 97, 78,214,255,170,201, + 2, 0, 30,203,171,112, 54,228,172,167, 76,196, 3, 0,104,244, 22,188,215,163, 71,217, 79,132,202,205, 46,179, 12, 19, 88,180, +160,141,213, 98,146,240, 5, 34, 61, 99, 51, 72, 96, 0,184,251, 86,190,232,101,249, 93, 54,124, 72,151, 74, 59,247,158, 75, 78, + 76,206, 46,119,165,198,240,132,104,209,174, 27,186,116,237,238,116,251,214,245, 69,155,126,222, 56,215, 98, 50,111,228,204,220, + 42,125,206,179,212, 50, 43,115,239, 26,141, 69, 10,247, 51, 3, 38, 47,118,211,179,174,248,102,233, 90,247,171,167,119, 95, 73, + 73,106,192, 37, 36, 36,233, 9,195, 60,206,205, 73,155, 94,144, 30, 29, 97,239, 33, 83, 40, 20,213, 20, 10, 69,131,160,160, 32, +201,204,153, 51, 5, 29, 58,116,248,211,178, 79,154, 36,188,124,249,178,207,138, 21, 43,122,134,133,133,233, 53, 26,205, 3,141, + 70, 19,131,114, 36,218,123,123,123,124, 60,176,127, 31,116, 26,240, 17,172, 28,131, 73, 31,206,192,217,211,135,167, 0,120, 39, + 70,203, 44,115, 92, 60,113,242, 76,143, 22, 77, 27,242, 22,237,142,128, 84,196, 71,247, 38,129,204,216, 79,230, 57,255,186,110, +209, 22,100,161,125,113,145, 44, 78,155, 63,175,158,187,113, 88,223,150, 85,113,124,143,113, 24, 58,207, 2, 43,115, 90,146,116, +252,203,167, 0, 80,173,199, 39, 14, 98,171,114,189,175, 51,207, 83,108, 85,174,175,214,227,147,243, 49,103,214,171, 75, 43,139, + 64, 44,174,180,103,247,238, 26, 46, 14, 66,240, 89, 6, 60, 30, 3, 62,143,133,222,104,197,224, 33,195,222,217,101, 46,245,172, +209,147, 5,198,218, 30,216,216,166,203,140, 58, 85,158,115,194,240,132,110,193,199,143,240, 61,157,196,224,241, 24,240, 88,128, +199, 50,136,207,208, 97,252,248,177, 78,111,107,216,223,107,237,217,244,139,161,129,221, 91,212,115, 13,218,119,131,113,106,241, +222, 80,183, 44,189,108,204,222, 99,151,134,145,182, 51,110, 17,194,253,144,252,251,218,144,210, 68, 12, 6, 67, 70,247, 30,239, + 57, 50,124,185,236,252,209,237,237,248, 44, 3,179,149,192, 98, 37,176, 22,174,141,202, 20,182, 96, 88,150, 1,225, 8, 38, 78, + 28,143,238, 61,222,211,114, 22, 46,217,254, 74,142,221,121,230,252, 31, 30, 6, 51,135, 21,235,127, 93, 84,144,175, 92, 20,251, +212, 45, 94,147,159, 53, 67,151, 25,101,247, 58, 24, 44, 72,147,164,152, 71,147,119, 7,223, 68,189, 58,181, 97,229,108,229, 12, +172, 32,199,238,147, 55, 81, 43,176,150,173,220, 28, 65, 77,127, 5,154, 54,105, 10, 0,111,100,180,248, 98,135,111,218,247, 26, +181,176,247,224,113,240,244,240, 0, 75,204,189,207,159,220,221,123,219, 79, 63,124, 97,209,171, 86,148, 75,140, 88,159, 63, 23, + 8,199,189,117,212,201,215,215,215,163,105,211, 63,167, 99,180, 88, 44,168, 82,165, 10, 82, 82, 82, 2,223,164,157,230,227,227, +211,107,254,252,249,158, 61,123,246, 20,120,123,123, 3, 0,210,211,211,253,206,156, 57,211,104,254,252,249,153,105,105,105, 39, + 81,202,140, 62, 86, 51, 43,100,249,224, 73, 36, 50,219, 62,130, 97,103,126,252, 65,144,151,143,175,161,184,239, 43,149,233,162, + 89, 31, 93, 98,248,124, 97,225,247,193, 18,194, 49,165, 68,137,186, 8, 4,130, 98,123, 40, 76, 60,199, 22, 68,224, 52,129,229, +177,182,139,213, 98, 86,230, 38,222,171, 93,142, 72, 92, 93,129, 72,184,113,224,208,113,173, 6, 13,232, 7, 31, 15, 39,156,255, + 61, 12, 83, 62,254,204,108, 49,153, 87,189, 81,229,193,227,241, 51, 51, 51,227, 93, 92, 92,188,223,254,121,203, 84, 61,119,246, +180,231,249, 11, 23,231,172, 92,179,110,170,201,104, 49,115,132, 60, 95,199, 88, 42, 21, 11,186,246, 30,226,232, 89,189,133,100, +221,252, 9,130,127, 97, 68,107,211, 59, 49, 90, 34,169,195,144,175,103,125, 34, 89,188,235, 38, 78,110,152,146,165, 85,101,121, + 60,111, 41, 56, 58,223, 43, 80,229, 53,122,147, 18, 42, 60,106,182,100,120,252,201, 12,143, 39,103, 88, 70,196, 89,185, 36,139, +209,184, 68,151, 29,245,214,147, 86,114, 28,193,161,235,153,229, 51, 64, 4, 1, 59,247, 29,241,244,114, 22, 67,111,178, 98,232, +240, 81,216,177, 99,135,131,135,147, 8,122,163, 5, 63,172, 92,169,214,196,159,244,140, 79,202, 77,233,210,231,179,144,152,184, +204, 71,137,105,250,253,229, 45,155,193,100,133, 74,107,129,214,192,162, 70,221,166,248, 97, 85, 45, 73, 98, 66,236,103,219,183, +109,153,246,248, 49,111, 7,199, 99, 23,234,211,158, 36, 21,123,211,121,215,235,238,232,226,182,167,255,228,165,206, 81,153,124, + 16,152, 16,237, 40,193,144, 49,211, 28,171,121, 75, 33,151,240,156, 99, 19, 82,124,102,126,241,197,239, 49, 86,210, 76,165,140, +137, 45,171, 60,149, 43, 87, 30,208,187,119,111,217,231,159,127, 46,240,247,247,199,182,221, 7, 42,181,237, 62,184, 79,106, 90, +134, 63, 33, 4, 94,158,158, 73, 19,199, 14, 62,113,234,212,169,132,164,164, 36,193,247,223,127,223,252,200,145, 35,117,210,211, +211,237,110,153, 90, 9,129,222, 96,133,181,240, 1,169,204, 55,148,219,159,250,249,249,137, 83, 82, 82, 12, 47, 68, 25,152, 63, + 3,133, 76,247,206,237,155,243,127, 57, 29, 7,141,222, 10,185, 68,128,184, 12, 45,154, 52,172,207,108,182, 90, 26, 20, 39, 56, +126, 72,175,121, 94, 10,210,163,111,203,170,240,116,145, 97,235,143, 75,113,252, 70,108,143, 12, 13,131,245,132, 55,217, 71,204, +239, 42,231,210,214,119,104, 82,221,187, 83,227, 74,184,211,164,186,247,213,208,136, 72,233,224,149,159,164,104, 4,231,115,207, + 76, 83, 23, 95,241,176,112,117, 16,226,215,179, 9,144, 73,248,144, 75,248,144,139,109,239, 44,203,188, 93,171,214,167,182, 63, +143,179,142,231,241,248,227,135, 13, 25,236, 59, 98,216, 96, 2, 30,139, 3,135, 78,244,219,181,107,103,154,217,100,220, 98,101, +121,191,150,116,253,188,116, 64, 89,192,211, 73,132, 47,182, 60,130,163, 84, 0, 7,153, 0,142, 50, 1, 58, 5,121,128,199,190, +113, 17, 93,166,244,171,214,115, 74,255,202, 29, 3, 43, 42,106, 60,136,206,127, 60,126,201,221, 53,151,243, 58, 78,255,113,117, + 29, 55, 77,158,145,255,205,204,137,252,228,212,212,142, 7, 78, 92,233,100, 53,142,139,176,152, 10,190, 84,134, 29, 40, 54, 42, +156, 28,113,163,145, 95,139, 65, 18,147,198,252,240, 65, 68,114,245, 92,131, 24,225,241, 42,200, 37,124, 40,138,142,173,132, 15, +185, 68, 0,133,132,143,212,228, 56,228, 20,240,126, 79,113, 99, 59,250,120,192,212, 0, 0, 32, 0, 73, 68, 65, 84,226,202, 13, + 75,121, 10,174, 55, 89,113, 63, 86,131,202,129, 13,225,227,227, 11, 99,207,145,149,111, 93, 60,116,236,246,149,163,203,180,233, + 79,191,180, 87,103,119,240, 77,204,153, 49, 57,148, 1,238, 21, 62,164, 27,125,179,124, 67,227, 69,115, 62,122,233,179,153, 11, +215, 53,126,243, 72,150,195,188, 78,253, 63, 92,216,182,107,127,168,115, 50,112, 61,100, 63,186,247, 30,136,145,227, 62,133,179, +179,251, 15,171,150,204,122, 96, 49,168, 46,190, 86,231,122,215,106, 83,191, 94,237, 93,126,190,190,254, 28,103, 91,229,131, 16, + 64,163,206,199,172,233, 19,193, 17,130, 6,141,154,117,146,180,237, 74, 72,225,106, 32, 89,217, 89, 5, 17, 79, 31,119,209,103, + 70,220,178,251, 88,234,245,102,165, 82,137,251,247,239, 35, 50, 50, 18,225,225,225,200,206,206,134,147,147,147,166,160,160,160, + 92,193,251,160,160,160, 17, 23, 47, 94,148,184,184,184, 60,255,208,104, 52,194,193,193, 1, 35, 70,140, 16,116,235,214,205,175, + 87,175, 94,163, 31, 61,122,180, 27,128,170,216,242,228, 60, 75,117,240, 10,252,185,125,135,246, 83, 1, 64,234,232, 19,187,126, +219,137,240, 82, 27,180, 78,190,149, 90,181,106, 93, 29,132,128, 1, 89,171,205,142, 76, 47, 37, 74, 36,191,121,243,102, 53, 30, +143,199,255,243, 25,196,225,167,173,251,106,157,187,246,112,192,242, 31, 86, 72, 28,229, 98, 40,243,141,152, 48,178,191,221,207, + 96,169, 87, 96,207, 86,173,218, 29, 91,180,240,107,190, 66, 46, 71,200,173, 24,124, 50,253, 11,125, 90,252,163, 21,132, 19,108, +208, 42, 35, 51,223,242, 81, 73,240, 14,168, 81, 65, 1,135,190,221, 37, 83, 62,232, 43, 49,154,173,200, 43, 48,195, 96,178,194, +202, 17,228, 23,152,241, 56, 81, 13,119,199,242, 47,229, 70, 8,105, 10,192, 3,128,146, 97,152, 59, 47,110, 23, 53,232,138,188, +241, 43,219, 89,133,207, 7, 55, 0, 70,216, 70,234, 63,191,124, 10,183, 75,250,188,232,239, 31, 3,168, 93,168,105, 5,112,155, + 97,152,220, 18,204,214,107, 81, 46,126,112,112, 48,233,221,187,247,243, 26,255,213,237, 87, 17, 11, 5,190,114, 39, 15, 16,242, + 4, 47, 46, 96,236,233,237,151,189, 98,213, 26,215,143, 63,156,156,160,202,203,169, 84,248,241,121,123, 30, 22,124,134,183,170, +125,235, 22,221,166,126,248, 33, 2,171, 85, 16, 90,173, 86,242, 40, 50,214,188,253,215,173, 99,174,222, 16,173, 81, 37, 63,154, +247, 66, 8,178, 92,195, 62,173,156, 53,249,213, 8,150,149,179,190,218,186,125, 77,147, 97, 0,103,133, 8, 63,159,142, 3, 33, + 0, 3, 2, 39,185, 0,123, 47, 39, 35, 54,244,176,170,119, 3, 85,193,136,229, 11, 58,117,236, 57,237,226,227,104,253,254,204, + 76,253, 89, 0,233,165,105, 22, 95,161,115, 48,152,172, 48, 91, 44, 56,120,226, 4,122,116,106,142, 86,173,154,163, 93,219, 86, +252,187,161, 97,227, 62,156, 58,209, 31,127,142,238,120,174, 41,241, 10,104,170,112,114,223, 63, 96,234,247, 14, 15,147, 45,224, +243,128,170,222, 82,184, 58, 8, 97,180, 48,136, 87,154, 10,239, 28,103,124, 50,115,161,235,156,207,166,158, 82, 41, 69,245,128, + 39,166,210,246, 93,171,213,138, 70,141, 26, 37, 48,155,205,166, 17, 19, 62,237,150,158,174,236,247,211,218,239,196,158,158, 94, +208,234, 45, 8, 13,127, 86,123,209,162,133, 85, 79,156,185,124,116,193, 23, 83,142,245,232,209,195,105,223,190,125, 92, 89,199, +243,165, 22, 98, 70,214,143, 91,119, 29,220,177,122,197,183,136, 72,200,197,175,191,108, 0,177, 90,126, 46,227, 80,189,168, 73, + 70,141, 26, 37, 61,122,244,104,133,228,228,100,149, 86,171, 85,190, 20,143, 96, 25,126, 70,142, 22,238, 14, 34, 8,249, 44,188, + 92, 36,240,116, 18, 67,192, 3, 88,134,177, 22,167,249,235,254,147, 75, 56,109, 62,142,239, 49, 14,219,250,227, 82,140,251,248, + 43, 60,202, 18,157, 97,101, 78, 75, 62, 26, 54, 96,142,135,212,218,195,215,153,245,236,212,184, 50,228, 18, 33,230, 78, 27,133, +102,161,241,158, 41,121,220, 87, 74, 29,175,225,194, 51,207, 23,235, 62,255,114,112,196, 22,193,114,144, 9,112,102,215, 15,153, + 5,249,202,252,162, 46, 57,163, 65,159, 96,231,101,124,190,152,150,237,156,134,245,235, 46,157, 58,105, 60,219,186,101, 51,194, +178, 2,100,169,141, 12, 33,192,244, 79,166,224,163, 41, 19,189,147, 82, 51,191,217,176,225,231,121, 23,207,145,197, 5,202,167, + 11, 74,211,100, 25, 91, 20, 72, 33,225, 67, 33,181, 25, 23,133,132, 15,189,209, 10,134, 1,207,185, 98,163,124,198, 22,201, 77, +205, 73, 40,177, 5,254,146,166,107,197,186, 23,206,197, 58,212,202,221,159,123, 35, 46, 53,124, 73,104, 88,198,109, 0, 57,254, +237,156, 71,155, 44, 4, 26,189, 5,113, 25, 90, 88, 76,132, 25,247, 94, 37, 84, 25,196, 4,126,187,245,222,142,211, 97,112,124, +161,210,127, 73, 51,229,230, 65,189, 91,189,254, 67, 87,175,251,229,206,138,165, 95,241,178,242,141,224, 8,129, 68,196,131, 84, +196, 47,124,241,160, 43,200,199,134,141,155,211, 45, 96, 6,224,202, 21, 75,121,174, 79,112,100,100,255,158,237,246, 50,128,136, + 97,133,201,190,149, 42, 87,234,220,103,140,164,115,223, 81,176, 90,140,115, 66,175,145, 75,218,204,136, 11,246,104,214,171, 83, + 27, 12,112,175, 32, 51,114, 10, 0,200, 61,107,254, 92, 43,176, 86,227, 87, 63, 11, 8, 8,108,108,207,121,127, 30, 41,149, 56, +124,236,226,234,241, 85, 96,221,134,158, 25,185, 6,198,193,173, 2,226,162,238, 99,207,198,111,118,114,122,227,194, 11, 39,247, + 47, 93,243,235,145, 33,157,123,244,199,214,159,190,155,155,157,246,220,104,157,127, 33, 90, 53,114,251,150, 77,254, 2,145, 24, +102, 11, 7,179,149,216,222, 45, 86,228,228,228,194,108,225, 32,145, 57,192,194, 49, 48, 91, 57,152, 45, 28, 12, 70,139,124,202, +168, 94, 31,234,129, 91,197,149,211,175, 86,251,179, 66,177,184, 18,129,109,237, 90, 66, 8,226,210,117,172,143,143,207,110, 0, + 16,139,197, 16,139,197,224, 56, 14,161, 17,202,143,221, 3,107, 78, 69,161,193,179,154,140, 9,121,241,127,116, 47,105,223,189, +189,189,251,188,106,178,244,122, 61, 52, 26, 13,174,221,184,227,180,101,199,193, 30,113, 9,201,213, 56,226,100,112,240,172,214, + 93,157, 25,211,167,164,227,169,206,136,248,208,177,197, 68,246,243,143, 70, 7,172,219, 30,124,251,217,217, 37,165,230,105, 85, +233, 60,219,248,249,228,129, 77,150,175,253, 53, 42,247,143,159,103,148,117,142,248,124,190, 64,169, 84, 62,191,191,215,111,222, +211,228, 94, 68,202,251,107, 86,175,145,132,198,168,241, 48, 46, 21,163,187, 84,180,181,112,236, 56,239,114,175,106,238, 85,171, + 87,223,189, 97,237,114,126, 84,170, 30, 63, 30,190,141,139,199,126,190,150,158,121,171, 7, 50,210,116,111, 82,135,188, 3,163, + 85,162,230,165,176, 44,104,244, 22, 24,140, 22,152, 57, 2,149,214,140,204, 60, 35, 84, 90, 19, 52, 58, 11, 70,119,173, 88,236, +223,149,225, 71, 60, 24,134, 9, 38,132,244, 38,132,116, 1, 32, 42,218,182, 61,179,153,224, 66, 67,246,210,246,156, 57,115,190, + 92,182,108, 89,120,209,119,139, 62, 47,250,110,105,159,191,240,247,110,115,231,206,173,183,124,249,242,111, 91,182,108,185,247, +250,245,235,177, 0,114,237,237, 62,228,191,184, 51,193,193,193,101, 29,232,106, 38,179, 73,236, 40, 21,160,106,149,138, 24,251, +229, 86,247,223,150,143,207,148,136,248,188,211,167, 79,187,102, 27, 21, 96, 89,158,221, 77, 20,133, 71,141, 86, 66,161,232,228, +202,149, 43, 49,172, 79, 91,105, 98,150, 89, 19,150,168,203, 40, 48,194,226,233, 81, 83,180,228,219,229,138,229,223,255,240, 81, +240,113, 46, 79,147,241,248,135,226,187,248,154,220,229, 49, 47,228, 96, 49, 12, 8,103, 77,206,141,191,211, 4, 0,222, 38, 23, + 75,163, 55,131, 87,152, 91,195, 48,128, 86,111, 1,143,199,100,230, 69,236,127, 60, 98,241,146, 78, 59,247,158, 75, 37,172,179, +186,160, 32, 78, 6,219,154,131,229, 70,111,180,194, 96,182, 34,252, 65, 40,218,181,168,131, 86, 77,106, 65,171,183, 66,107,176, +160, 74,245, 64, 0,112, 47,246,196,241,216, 88, 98, 53,235, 9,177, 58,244,110,234, 1, 79,103, 17,124, 92,196, 16,139,248, 48, + 91, 0,157,145,131,222,104, 69,124,166, 14,106,157, 20,245,219, 15,174,234,230,115,215,144, 30, 47, 61,154,147,120,119, 64,169, +230,212,106,197,246,221, 7, 3, 82, 83, 51,250,157, 58,186, 75,172, 84,153, 17, 22, 95,128,204, 60, 3,192,243,192,252,111,127, + 20,207,158, 49,233,253,237,123, 14, 37,116,110,219, 60,161,188,251,172, 85, 70,236,220,127,224,224,207,189,123,191, 47, 13,191, +117, 10, 81,247, 47, 44, 45,200, 44, 87,126, 22,219,160, 65, 3,203,164, 73,147,212,223,126,251,173,255,241,227,199,171, 40,149, +202,251, 0,204,206,206,206,181,106, 6, 84,122, 16,114,230,180, 95,175,247, 7, 11,146,179,116,112,146, 9, 81,201, 83,134, 27, +215,206,154, 69, 34, 65,177,249, 38,133,221,131,195,209,121, 22,142,223,136,237, 17,158, 45,185, 60,113,252,232,132,144,171, 17, +217,235,119,132,124,231,167, 48,223,151,112,202,245,119,155, 84,247,158,243,201, 40, 44, 91,183, 19, 87, 66, 35, 50, 11, 88,159, +165,105, 6,203,185,146, 67,233, 0,159,199,192, 65, 42, 64,129, 74,153, 31,125,239, 76,205,119, 20,166, 30, 29,114,116, 39,155, +163, 54, 35, 41, 75,207,164,230,168, 97,229, 8,156,101, 66, 88, 56,130,188,156, 44,102,215,206, 29,184,115,231, 6, 11, 30, 59, + 1,192,130, 82, 15, 40, 99,235, 42, 84, 72, 4,182,136,144,212,246,110,182,114, 8, 12,168,142, 77,235, 87, 57,186,123,122,161, + 77, 59,251,115,163, 29,220, 42, 53,216,187,109, 61, 46, 95,191,215,225,202,154, 31,155, 42,124, 61,214, 49,140,117, 5, 8,244, + 6,147, 21,249,121,185, 16, 25,147,208,204, 79, 9, 87,153, 21,241, 42, 31, 60, 74,143, 82,148, 85,225,103, 63, 58,114,159, 33, +239,207, 59,120,226,226,178,238, 93, 59,224, 81,188, 10, 82, 17, 31, 18, 17, 15, 18, 17, 15, 2,198,138, 85, 27,127, 54,231,230, +171,123,103,135, 31,203,122,131,235,243,124, 97,235,215,102,238,172, 26,143,157,235,230,253, 54,113,214,247,221,123,244, 31,195, + 60,186,115,233, 75, 45,112,193,190,134, 30,177,235, 51,142,179,255, 25, 39,113,112, 95, 59,109,246,146,105,221,122, 15, 6,143, +199,135,217,108,198,161,125, 59,177,237,199,249, 79,141,154,236, 49, 0, 56, 99, 38,111,210,254,157, 27, 7,207,250,102, 21, 83, +175, 65,179,230,151,210, 94, 95,142,150,227, 49,191,124, 48,126,242, 80, 47, 47, 47,135, 63, 35, 90, 4, 53, 3,235,160,103,223, +129, 56,123,236, 8, 30,135,135,129, 35, 54,195,196,113, 4,121,185,217,233, 22,179,113,123,137, 61, 30, 18, 73,165,173,219,118, +212, 96, 89,230,249, 2,242, 51, 62, 28,107,156, 50,253,203, 54, 61,187,181, 15, 23,241,160,138, 79, 76,115,190,113,239, 73,125, + 78,160,240, 31, 63,115,149, 80,111,176, 34, 95,107,198,169, 95, 75,246, 58, 18,151,138, 45, 43, 55,238, 57,126,202,215,155,196, + 98, 30,107,170, 91,211, 63,182,125,139,186, 73, 21,125,221,213,139,150,255,216,236,247, 91,247,122, 14, 25, 49, 94, 50,186, 86, + 99,198,215, 77,234, 48,118, 68,255, 32,171,197,244,129, 54, 39,169,196,249, 5, 5, 50,151,188,138, 85, 2,180,127, 70,140,106, + 30,102, 8,170,190,228, 60, 24,196,234, 50, 34, 7, 0,128,143,111, 69,189, 64,236,168, 46, 71, 4,134, 0,192,186,205,123,154, + 60,136, 76,157,184,122,245, 26, 89,104,140, 26,247, 99,242, 33, 22,178, 48,153, 57, 48,118, 6,181, 57,194,155,252,213,220, 57, +142,185, 5, 86, 92, 14, 83, 34,252,238, 37, 98,212,232, 71,200, 44,142, 3,224,233,240, 1,128,234, 0,162, 25,134,252, 82,144, +225,125, 12,184, 98, 41,239,117,207,113,182,246,178,163, 71,181,170, 86,190,184,167, 64, 36,111,201, 48,164, 46, 67,224, 2,144, +148,156,194,103,170,189, 78,173, 32, 35, 18,223,127,251, 13,214,110, 57,130,212,108, 61,156,172, 73, 56,246,235, 18,124,190,108, + 55,116,134,146,179, 26,202,242, 35,197, 25,163, 87, 13, 87,209,207, 69,223, 91,182,108, 89,239, 87,206, 77,239, 18,206,217,107, +223, 43,250,251,229,203,151,127,251,194,239,181,246,154,172,231, 70,171,104,167,202, 48, 91, 53, 61,124, 42, 93, 63,118,244,176, + 75,174,198, 4,137,144,135,138, 85, 2,176, 96,253, 49,143,247,154,184, 35,203,228,132, 61,155, 86,228,232,181,234,125,118, 85, + 22,158,129,205,165, 10,249,169,195,135,142,160, 90, 69, 79,225,174,107, 57,113,247, 98,117,207, 67,189, 42,101,130,168,138,163, +150, 63,160,127,127,217,133,139,151,166,107,128, 98,141, 22,143,225, 85,216,188,227,144,167,131, 84, 0,134, 1,212, 58, 11, 38, +126, 48,240,237, 31, 99,132,227,141, 31, 51, 26, 76,161,201, 82,101,167,227,203,217, 31,234,229,230,168,199,137,241,137, 41, 93, +250,124,126, 65,165, 97,244, 67, 71,125,120,231,113,228,178, 92,173,246,205, 22,249, 49, 24,173, 48,152, 56,196,196, 68, 99,198, +232,174, 16,240, 88,240,120,156, 45, 89,218, 82,242,197,168, 73,141,204,129,183,112,208,206,149, 31,111,246,245,242,116, 83,200, +165, 68, 33, 19, 51,117,107,213, 16,182,104,209, 74, 84, 37, 48, 72,120,237,137, 14,137, 74, 29, 98, 83,243, 33,246,106,200, 31, +214,233, 61,236, 92, 51,179, 67, 78,226, 93, 22,175, 39, 41,190,196,185,203, 55,251,108,217,184, 90,156,145,103,194,211, 68, 13, +210,115,245, 72,203, 53, 32, 61, 71, 15,133, 84,128,118,125, 39,137, 79, 30,251,165, 79,231,182,205,215,189,201,126,199,198,198, +157,140, 79, 73, 27, 28,212,168, 25,118,254,182,173,173,179,115, 21,199,188,188, 56,149,189,103,103,201,146, 37,162,229,203,151, +243,215,175, 95,175,106,209,162,133,247,220,185,115,187,103,102,102,222,174, 92,185,114,224,217,195,219, 47, 54,108,215,175, 41, + 56,147, 71,219,246, 29,133, 98,142,143,144,224, 96,211,254,125,187,178,117, 58,245,148, 82, 13,135,204,105, 73,134,134,129,135, +159, 95,184, 66,100,237,202,103,243, 34,115,207, 76,219,145, 11, 28,174,214,227,147,243,151,238, 70, 68, 54, 9,141,247,188, 24, +250, 44, 51, 71,107,170, 25,115,230,243, 82, 43, 94, 30,195, 64,192, 99,225, 32,229,131, 45,172, 85, 21,190, 65,207,192, 48, 30, + 69,145, 83, 6, 76,225, 59,192, 48, 72,205, 77,188,111, 71,206, 6, 67, 56, 2, 68, 36, 23, 64,163,183,133,230, 43,184,203,160, +204, 72,198, 79,235,182,227,222,221, 59,232,246, 94, 95,108,216,188, 11, 19, 63, 24,172, 47,171,245,195,178,133, 17,173, 23,162, + 89, 10, 41, 31, 0,131,188, 2, 51, 14,253,158,132,234, 85, 89,187, 31, 12, 0,224,160,144, 33, 95,173, 3, 43,116, 64,116,232, + 41,217,233, 75,183,230,206, 91,188,250,139,220,180,176,196,103, 15,175, 33,208, 61, 31, 85,253, 76, 8, 79,119,196,221,236, 42, + 8, 12,168, 6, 86,120,199, 46,237,172,240,250,223, 31, 99, 15,245,110,210,176, 78,203, 74,158,206,208, 25,173,133, 81, 45, 30, +182,109,221,129,248,184,228,241,217,143,143,221,123, 23,142,182, 32, 51, 86, 41,246, 12,248,232,225,173, 11,177,253, 71,124, 4, + 31,191,138, 13,242, 18,239,219,157,182, 96,207,103, 86, 59,141,150, 80,230, 60,119,198, 87,223, 77,235,214,107, 16,110, 94,187, +128,251,225,209,104,222,188, 41,222,123,127, 24,212,170,156, 90, 7,118,172,233,106,209,170,207,242,197,150,105,205, 90,117, 98, + 56,171, 21, 81, 79, 31, 69, 23,167,165, 75,139,184,127, 35, 45,194,241,165,238, 41,247, 90, 13, 20, 78,174,247, 13, 38, 43, 82, + 82,146,241,199,245,203,141,116,105, 17,247,203,115,188,196, 66, 30, 66,238,101,194, 84,184,134,105,187,246, 93,141, 66,214,208, +118,233,234,173, 45,210, 82,211, 88,185,163, 59,231,234, 87, 91,232, 35, 54, 25, 30,196,228, 11, 77,102, 14,213,124,229,165,106, +122,248, 6,124, 59,115,230,140,218, 60,161, 20,234, 2,131, 49, 45, 53,197,123,211,158, 75,154, 39, 79, 31,250, 85,240,116,114, +252,110,205, 47, 66,149,158, 65,102,190, 1, 57,106, 21, 51, 98,242, 44,223, 45, 63, 46, 27, 89,154,209, 42, 38, 93,164,234,201, +144,107,181, 92, 28,132,140, 70,111,225,178, 85, 38,235,136,247,223,110,208,101,161,201,154,180,122,213, 26,217,189, 24, 53, 30, +196,228, 67, 34,228, 65, 36,100, 97, 52,115,176,243,118, 98,189, 61,189,167,180,106, 82, 31,103,239,103,129,199, 99,161, 83,231, +106,249,200,142,108,210,161,155,172,113,179, 22,232,216,161, 61,158, 69, 70, 84, 12, 62,126,168,243,141, 63,174,164, 91, 76, 53, + 63, 46, 80, 70, 30, 41, 87, 96, 65,171,229,153, 69,222, 99,125,252, 42,183, 30, 48,108,172, 83,165,138,126,140,167,187, 27, 44, +132,143, 73, 31, 12,180,251,206,183, 25,115, 96,249,226,185, 48, 24,140,240,112, 22,129, 16, 96,235,186, 5, 48, 26,141,240,117, + 19, 35,191,160,228,213,228,202,242, 35, 37, 69,161,202,149,123,242,130, 25, 43,237,115,134, 97,130,231,204,153,243, 37, 0, 50, +103,206,156, 47,139,182,151, 45, 91,166, 3,144, 90, 70,215,225,166,151,140, 86,209,206,149,124,119, 11, 3,221,221,124,110,132, +156, 61,227,116,244, 1,135,155, 71,238,162, 87,115, 31, 8,249, 44,100, 78,190,120, 16,151,143,147,135, 55,230, 29,219,251, 75, +138,193, 96,248,161,236,190,230,128, 38, 10,153,252,236,111, 59,247,113,238,110,110,236, 79, 33,202,152,108,181,229,121,151, 86, +228,173,227,220,221,179,155,124, 8,152, 51, 18,137, 36,192,104, 52,186,148,117, 98,183,134, 36, 20, 38,241, 50,239,162,110, 5, +195,227, 89,119,238,218, 9,119, 71, 17, 12,102, 14,115,190,248, 84, 55,186,155, 34,111,196,144, 97,157, 58,246,156,118, 81, 32, +175,113,161, 85,163, 26,164, 97,195,134,121, 60, 30,207,174, 84, 10, 79, 79,207, 5, 44,203, 14, 23,137, 68, 14, 70,163, 81,109, +228,244,178, 2,189, 17,122, 19,160,213,234, 33, 16,218,204,162,128,199, 64,167, 55, 66,171, 51,150,126, 99,164, 63,250, 29, 64, + 77,213, 11, 49,165, 11, 79,170,137,118, 31, 56,246,233,160, 33, 67,231,249, 53,120, 95, 17,151,150, 15, 33, 99, 66,211,218, 62, +184,116,230, 8, 73,142,143,156, 81,150,201, 2,128, 76,101,142,191,135,135, 23,238,197,106,144,146,173, 67,122,161,201, 74,203, + 53, 64,173, 83, 35,168,146, 47,242,242,243,253,223,248,248, 2, 71,206,158, 61, 59,184,103,191,161,152,246,197,194, 54,191,110, + 92, 17, 38, 23, 9,198, 21,100, 68, 93,182,199,104, 61,122,244, 40,103,246,236,217,213, 55,111,222,204,142, 28, 57, 82, 87,191, +126,125,201,168, 81,163,218,236,216,177, 67, 34,147, 73,116, 15,174, 29,159, 55,225,147, 57,253, 54,173, 93,210, 32, 55, 55,151, +177,152,205,167, 77,185,185,115, 52,101,152,185,164,227, 95, 62,157, 31, 99, 26,211,181,173,199,113, 87, 25, 91, 87, 76,140,195, + 80,123,193, 62, 60, 89, 96,138, 57,179, 94, 45, 29,188,242,147,212, 60,238, 43, 61,235,185,180, 44,147, 5, 0, 44,143,129,209, + 98,133,131, 84, 0,150,101,139, 76,188,207,182,125,167,101, 30, 78, 34, 8,120, 44,248, 60, 6, 42,173, 25, 89, 42, 19, 62, 26, +107,239, 12, 33,132,179, 88, 9,116, 70, 11,180,133,173, 67,181, 42, 11,115,191,248, 12,239,245,233,143, 9, 83, 62, 67,174, 14, +184, 27,171,134,201,108, 46,243,166, 96, 25, 22, 90,131, 5,227,186, 85, 66,142,198,132, 2,157, 5, 70, 11, 7,153,136, 15, 1, +159,133, 92,194,135,163, 76, 0, 16, 34, 44,170, 76, 4, 2,129,222,108, 54,239, 44,165, 69,143, 42,254, 94,208,153, 89, 52, 27, +186, 2, 93, 90,214, 68,248,239,135,248, 87,110, 62,172, 58,253,139,175,240,233,196, 62, 56,248,180, 58, 92, 61, 43, 65, 33,151, +194, 76, 88, 0,196,206,132,189, 5, 28,107,234, 63,252,231,205, 91, 35, 22,125, 51, 71,146, 87,192, 64, 44,228,225,226,133,243, +184,113,235,238,218,172,199,199,118,226, 29, 34, 32,172,151,163,163, 35, 36, 34, 30,140, 38,131,209,254,212, 5, 2, 2, 52,146, +123,214,252,185,176,197,223,200,202,161,152,207,202, 54, 90,124,137,227,156,143,191, 88,244,109,183, 94,131, 16, 18,124, 16, 7, + 14,238,179,182,236, 49,158,183,107,219, 70,180,233,210, 23,109,186, 13,197,233, 35, 59, 62, 43,224,152, 58,147,166,205, 91,220, +174, 83, 79,132,156, 60,136,140,244,228,149,246,150,151, 39, 96,166,117,234,218, 7,122,163, 21,109, 59,247,198,153, 19, 71, 62, + 65,225, 32, 11,251, 31, 98,175,212,207, 96, 45,159,205,152, 38,200,204, 51, 10,148, 42, 35,146,149, 90,196,101,104,113,108,239, +175,196,254,250,194,216,180, 93, 80, 5,193,164,239, 47, 38,249, 87,240, 49, 8, 12, 58,105,100,116, 76,173, 9, 99, 71, 11,170, + 6,212, 98, 51,243, 13, 80,230, 27,144,149,111,128, 70,111, 65, 64,133, 26,172,217,194,180, 44,239,121,118,119, 18, 9, 54,156, +136,133,163, 92,128, 86,181,222,124,160, 45,199,113,127,154,172,213, 54,147, 21, 22,155, 15,177,144, 7,177,144,133, 88,200,131, +197, 74,236,106,184, 72, 61,107,246,252,232,227, 15,125,141, 22, 32, 59,223, 8, 62,143,129,167,187,139,188,105,131,225,216,186, +226, 19, 0,192,196,217, 63, 97,194,184, 81,168, 93,183, 62,242,114,115,189,135, 15,234,185, 26,192, 17,123,203,122, 42,228,114, +197,144,171,247,102,127, 52,115,190, 98, 72,159,142,188,251, 49,249, 72,203, 49, 32, 58, 82, 93,174,200, 27, 0, 88,172, 28, 8, + 8,182,239, 11,134, 84,196,135, 50,223, 4, 66, 8,150,172,223, 15, 7,169, 0,105,185,182,238,254,210, 40,213,143,148, 18,145, + 42, 71,180,177, 55,108,185, 92, 30,246, 70,180,150, 45, 91, 22,190,108,217,178, 98, 35,100, 47,152,172, 55, 91, 84, 90, 40,148, +215,114,116,115,191, 25,114,230,148,195,145, 7, 86, 92,122,144,141, 65,109, 43, 64,147,147,136, 31,190, 24,146,195,128, 24, 89, + 30, 47,207,160,211, 30,214,233, 10,150, 2, 48,149,122,209,120,215,108, 36,151, 40,206,111,216,244,155,197,221,211, 19, 59,175, +229, 36,231, 22, 88,204,127,118, 91,153,153,187,103, 55, 85,181,112,230, 30,250,140,103,119,202,106,137,115, 4,194,101, 27,143, + 1, 32,224, 56, 14,132,227, 32,144, 40,228,238,213, 90,100, 20, 86,116, 18, 62,203,232, 95,172, 1, 8,103, 73,206,138, 45, 61, + 12,202, 0,112,146, 9,176,239, 74, 10, 0,100,240,212,161, 79, 70, 12,177,117, 23,234,141, 18, 85,221,234,213, 73,211,166, 77, +243,164, 82,187,166,191,226,121,121,121,221,158, 55,111, 94,173, 9, 19, 38,136, 69, 34, 17, 44, 22,139,235, 47,155, 54,113,155, +150, 78,196,128, 79, 54, 64, 40, 18, 67,167, 55, 65, 32,224, 35, 55, 95,131, 60,149, 22,106,173,185,252, 87, 80, 76,140, 81, 9, +124,127,244,136,168,127,119, 69, 80, 51, 17, 43, 68,227, 64, 31, 92, 58,123,148,220, 60,179,117,162, 46, 51,242, 55, 59, 47, 68, +104,244,102,164,102,235,145,146,173, 71,122,174, 30,233, 57, 6,164,231,234,193, 48, 12,244, 70,203, 91, 61,184, 10, 50, 35, 14, +236,252,109, 75, 95,131, 9,195,218,117,235,143,207,230,111,168,180,243,231,229,231, 99, 9,219,218,206, 68, 91,107,120,120,120, +252,216,177, 99, 27,236,217,179,135, 87,175, 94, 61,221,147, 39, 79,100,133, 38,210,164, 80,200,164,191,254,184,236,108,179,102, +205,246,166, 68, 62,189, 88,216,159, 94,102,197, 94,169,253, 24,177,212,116,111, 82, 69,121,171,238,213,188,101,168, 40, 87,119, +175,165,120,240, 67,118,167, 79,191, 85, 94, 92,155,153,102,176,156, 83,234,120, 13, 83, 52, 2,187,114,240,204, 6,125,194,128, + 65,195,192, 99, 88,152,244,218,132,162,139,203,211, 73,132, 5,187,158, 66, 33, 17,192, 65,202,135, 66, 42, 64,155, 58,174, 40, + 71,125, 70,204, 86, 14, 90,131, 21, 58,131, 5,122,163, 5,238,254, 46,216,188,243, 0, 18, 51,117, 56,118, 39, 11, 17, 9,106, +212,168, 32, 7, 33,101, 87,147,156,213, 92,208,103,224, 72, 7, 30,203,128,199, 50,108,157, 90, 53,145,163, 49, 65,200,103, 33, +148, 72, 33, 23,243,225, 40, 21, 64, 40, 20, 32, 51, 51, 19, 6,131, 1, 21, 43, 86,148,148,110, 5, 9, 28, 20, 82,212,168,234, + 11,147,217,130, 83, 87, 31, 99,233,140, 1,232,218,174, 9, 24,129, 2, 79, 13,141,224,224,234, 0,142,101, 97,178,112, 48,154, +172, 0, 88,125, 73,122,254,254,254,157,228,114,185, 92,171,213,170, 19, 19, 19, 47,167, 71, 28, 73,180,242,250, 77, 58, 19,114, +113,103,239,247,186,226, 94, 88, 56, 14, 30, 57,126, 45,203, 45,127,102,209,223,212,173, 91,183,133,187,187,187, 34, 59, 59, 91, +245,232,209,163,219,111,218, 46, 32, 44, 59,189,101,155, 14,208,228,101, 34, 35, 41,206,238, 86,116,237, 74, 14,248,122,217,134, +198,129, 53, 3, 27, 91,137,205,120,213,169,232,128,207,231,175,107, 92,189, 70,205,198, 69, 3, 66,106, 87, 44,125, 90, 54,190, +204,161,219, 7, 19, 62, 91,214,119,208, 24, 92, 12, 57,142, 85, 75,191,216, 41,119,242,168,237,234,226,212,176, 94,139,110,184, +118,254, 56, 36, 14,222,112,113,243,110, 51,114,220,199, 93, 6,141,156,140, 27,215,206, 99,237,242, 47,119, 88, 13,234,221,246, +148, 85,238, 89,213,163, 65,163,102, 35, 28, 92,189,144,151,175,134,131,139, 39,106, 7, 53, 29,241,248,129, 97,118, 65,102,172, +242,141, 77, 7, 33, 48,152, 8,114, 53, 38, 36, 41,117,136, 79,183, 25, 45,142, 43, 71, 78,144,149, 99, 20, 18, 62,223,213,252, +172,226,195,243, 23, 73, 37,127, 47,230,251,197, 95,240, 76,144, 64,153,103, 51, 89, 74,149, 17,202,124, 35, 52,122, 51, 92,229, +124,112, 86,174,220,173,238, 92,141, 9, 14, 50, 1,156,100, 66,187,163,140,197,177,113,219,190,192, 7,145,169,239,175, 90,181, + 70,118, 63,246, 5,147, 37,176, 69,179,196, 66, 30,172, 28, 7,216,113,199, 11,248,130,105,253,122,118, 65, 82,150,206, 54,106, +153,101, 80,163,126, 51,184, 75, 57,116, 30, 58, 7, 0,208,167,167, 45,181, 45, 54,173, 0, 39,110, 42,129,151, 19,187, 75,175, +139,117, 58,222,166, 93, 39,167, 31,216,191,215, 73,111,229,227,151,211,241,208, 26, 44,144, 8,121, 16, 11,121,144, 10,121, 47, +229, 99,151,109,180,108, 57,119,137, 89,102,104,245,122,168,116,102, 16, 0,183,159,105,160, 51, 90,144, 95, 96, 70,139, 90, 46, +111, 23, 8, 97,152,147,132,144, 94,175, 26,162, 87,205,210, 11, 17,169,226, 52,238,188,168, 81,244,253,146,140,220,139, 57, 91, + 0,202, 53,130,139,255,170,115,124,113, 91, 40,119,169,237,228,224,116,243,204,233, 96,197,145, 7, 28, 46,135,217, 76,150, 89, +151,133,149,179,135, 39,171,242,178, 58, 2,136,177,247,159,201,220,107, 7, 73, 68,226,139,223,173,249,197,228,233,229,199, 29, +190,153,151,153,175,181,190,228, 38,172, 6, 3, 75, 56, 34,212,103, 60,179,171, 15,129,101, 25,211,252, 79,250,131, 35, 4, 11, +214, 28,192,183, 51,135, 66, 33, 29, 41, 99, 24, 70, 86,160,183, 96,198,194, 45, 88,249,245,120, 7,153,152, 15,134,177,229, 68, +125, 48,172,191,125, 23,160,222,130,232, 91,123, 52,234,216,224, 39, 47,118, 23, 54,111,243,222,221,230,205,155,231,185,184,184, + 64, 42,149,254, 25,169, 40, 1, 47, 47,175,175,231,207,159, 31, 56,101,202,148,231,147,125,242,249,124,124,244,225,135,172,213, + 74,112,250,244, 86,120, 84,110,132,227,231,110,162, 71,167,166,208,104,245,200,201, 83,131, 3,239,141, 47, 68,117, 94,214,197, +244,248,135,205, 90,119,236,131,203,103,143,146,155,167,127,157, 88,158, 57,122, 92, 92, 93,146, 66, 31, 70,215,102, 24, 87, 91, + 68,171,208,100, 25,205, 28, 42,121,201,144, 20, 31, 13,103, 39,167, 36,123,245,164, 30,129,253, 24,150, 76, 97, 64,182, 22,100, + 68, 29, 0, 64, 10,210,158, 12, 63,176,123, 83, 88,248,163,251, 75,123,143,152,198,239, 54,232, 67,222,207,203, 62,254, 18,128, +189, 19,239,153, 34, 34, 34, 30,143, 31, 63,190,213,141, 27, 55,172, 0,180, 12,195,152,121, 60,158,204,104, 52, 10, 59,118,236, +152,255,244,233,211, 43, 40, 62,105,241, 37,218,140, 61,224,206,136,213,239,137, 56,211,240, 74, 14,234,174, 29,219,182, 68,203, +186,254, 72,106,219, 18, 0,166, 37,104, 20,129,250,234, 91,246,153, 45,210, 83, 63,111, 59,241,237,196,161, 93,102,236,228, 47, + 88,149, 22,188,160,212, 68,212,164, 39, 87,186, 23,103,227,249, 60, 22, 14, 82, 1, 20, 82, 62, 28,164, 2, 56, 72, 4, 48, 91, + 72,121, 90,142,196,108,225,108, 17, 45,163, 5, 26,157, 5, 23,239,103, 32, 61,223,136, 60,181, 9, 58,147, 21, 4,196,214, 26, +181,163, 54, 87, 62,251,195,185,232, 73,234, 92,177, 81,254,166,245, 43, 28, 15,253,158,252,124, 68,159,147, 76, 4, 7,153,109, + 52,246,213,171, 87,225,230, 86,118,107,159,227, 56, 28, 60,115, 27,171,182, 95,196,153,173,179, 32, 17,242, 16,212,111, 33,198, +188,223, 28, 28,225, 16, 29, 17,158, 81,163, 78, 3, 47,150,149,130,101, 24, 24,204, 28, 0, 82,226,241, 52, 26,141,110,137,137, +137,170,128,128, 0,111, 95, 95,223, 65, 60, 30,143, 64,125,223,112,116,111,142,246, 66,240,110, 89,129,206, 96,149, 89,242,183, + 6,164,233,122, 33, 32, 0, 12,195, 16, 71, 71, 71,225,197,139, 23, 53,245,235,215,247,120,195, 91,137,149,122,214, 92, 59, 97, +234,244, 65,213,171, 85,195,129,221, 91, 65, 8,115,200,222, 63,222,117,226, 6, 22,207,125,121,132,225,231,243,215, 53, 94,185, +112,218, 75,159, 77,157,187,170,212, 81,135, 82,177, 98,230,128,225,147,112,247,246,117,252,176,240,243,189, 6, 77,206, 24,179, +197, 60, 56, 39, 45,118,111,213, 58,205, 65, 76,106,132,236, 95,129,161,163, 38,138,187,245, 30,132, 27,215,206,227,219, 47,167, +238,210,230,101,142,133,157, 73,206, 28, 17, 76,233,216,253,125,129,206, 96,194,186,239,191,193,228,153, 75,209,162, 83, 31,193, +163,251, 55,167, 0, 88,100,119, 58,132,201,138,142,245,221,109,230,217,204,225,120, 44,143, 95,220, 21,200,231, 49,108,195,106, +206,208, 25, 45, 80,149,209,168,228, 11, 5,233,121,249,170,202, 63,126, 59,157, 87,160,183, 64,153,111, 68,102,190, 1, 89,121, +127, 26,172,172,124, 3,148,249, 70, 8,248, 12, 34, 99, 18,192, 10,248,229,206,207,203,213,152,209,172,166,139,237, 30,125,195, +222, 17, 51,223,177,249,153, 43, 15, 6,172, 90,181, 90,242, 32, 78,141,176, 88, 85, 97, 36,139, 7,177,128,133,168,240,103, 43, +103,203,141, 44, 13, 71,143,106, 85, 71,127, 48,178,179,163, 66,138,212,168, 76,240,121,182, 41, 98,156, 60,253,225, 36,214,227, +227,169,147,224,238,230,140,196, 44, 3,214, 30,137, 68,216,227,103,224,116,229,219,237,117,191,236,237, 49,225,163,207,157, 89, +129, 8, 59,206,198,217,202,201,179,226,233,205, 19,250,212,232,135, 5, 26, 85, 54, 1,177,218,153,131,204, 16,139,213,118,185, +125,187, 96, 14,246,110,255, 9,103, 67, 51,159, 95,129,191, 31, 90,137,233,115,151, 32, 75,101, 68,113,215,101,105,126, 4,128, +242,133, 72,212,107,219, 47,152,163,226,182,153,194,109, 99, 9, 26,198, 87,204,149,241,149,207,141,175,232, 21, 55,247,223,166, + 50,187, 14, 95, 51, 69,206, 30,245,100, 18,249,245,211,167, 79,200,143,134,145,231, 38,203,164,205, 34, 75,167,245, 73, 86,229, + 41,187,149,203,100,121,212,168, 39,150,137,175,204, 91,178,214,224,229, 87,217,114,234,190, 42, 91,173,183, 90, 94,207, 65,144, + 91,229, 78, 30,122,190, 72,188, 74,160, 51,126,147,149,245,164,160,172,200, 19, 71, 8,130,111,165,131, 16, 91, 19,105,255,213, + 20, 20,182,204, 97,229,108,221, 42,231,238,103,130, 95,152,135, 98,111,248,123,227, 47, 63,169,122,213,207, 47, 24,241,237,130, +231,221,133, 45, 26,216, 34, 89,142,142,142,112,118,118,134, 66,161, 64, 89, 93,135, 12,195,124, 48, 97,194,132,215, 90,255,153, +153,153,232,210,185, 35,214,255,180, 25, 13, 58,143,198,185, 63,206,194,100,230, 16, 84,167, 26, 42,251,186, 32, 41, 67,253, 70, + 55,186,220, 43,240,163,102, 29,223,255,178, 77,167, 62,184,120,230, 48,185,121,102,219,164,242, 78,132,216,171, 75,171, 19,139, + 23, 47,168, 58,111,233,143, 98, 7, 9, 31, 79, 52, 70,176, 12,131, 74, 94, 50,184,201, 89, 92, 62,186, 67, 63,180, 79, 43,187, + 39,199,243,247,247,219,185,114,253, 38,249,202,229, 11, 59,222, 13,101, 46,106, 82, 35,115, 0, 64,155, 17,241,253, 83,224,113, +133,235, 33,167, 26,180,239, 15, 47,223,106, 93, 99, 51,158,218,109, 54, 0,104, 99, 98, 98, 98,231,205,155, 23,184,124,249,114, +194,227,241, 56, 0,226, 53,107,214,104,163,162,162,238,195, 54, 52, 23,101, 61,108, 58,119,173, 59, 67, 33,178,182,112,149,177, +117,171,121,203,208,178,174,173, 87,116,104,175, 54,240,175, 88, 17, 49,233,218,134, 57, 90, 78,160, 49,242,170,109,248, 37,236, + 78, 21,119,222, 68,139,206,248, 24,192,177,242,158, 31, 6,127, 38,200, 23, 69,179, 28,164, 2,112,182,107,165, 92, 70,203, 96, +178, 66,103,176, 66,103,180,160,192,104,133,214,104, 5, 71,108,247, 4,195, 48, 48, 89, 56,216,213,108,126,229,218,119,116,117, + 71,181, 42, 12, 28,101,182,178, 57, 22, 78,247,192, 0,112,115,115,131,167,167,167, 93, 81, 81,163,201,118,139, 27,205,220,243, +110,125,163,201, 2, 66, 8, 34, 35, 35,102,197,199,198,246, 11,168, 17,208,174, 78, 80, 3, 87,153,152, 5,128, 18,141,150, 86, +171,181, 58, 56, 56,120,186,186,186,178, 41, 41, 41,207,205,115, 64,195,142,150, 35,135, 15, 97,192,128,254,154, 39,183, 31, 60, + 31,226,174,211,233,152,214,173, 91, 59,250,251,251,179, 6,131, 65, 85,222,211, 36,247,168,249,190,139,155,235,210, 15,198, 78, +174,217,177, 75, 15, 92,186, 16,130, 99,135,247,252,166, 85, 70,134,216, 43, 18, 24, 88,235,181, 81,135,213,107,212,124,109,212, + 97,229,170, 53, 74, 53, 90,117,130,154, 54, 39, 12, 31,103,131,247, 19, 61,107,154, 10,128,179,234,213,251,247,109,252,122,209, +240, 41,115,171,247,236, 59, 28, 31,140, 26, 3, 62,159,135,203,231, 78, 96,229,194,207, 78,106,242, 51, 71,219,147, 38, 96, 11, +189,213, 22,250, 73,253, 63,173, 88,189, 30, 66,111, 94, 67,116,228,163,240, 7,119,110,212, 13,168,223, 2, 30,190,149, 62, 77, +112,231, 45,199,147, 39,166,178,100,140,122,125,194,152,209,163,240,226,168,195,150,141, 2,221,152, 87,111, 0, 0, 90,117,166, +233,215, 21, 51,162,138, 70, 29,114, 38, 99, 66, 73,186,249,185,202,131,151,255,184, 53,179, 95,175, 30,108,150,202,104,139, 96, +229, 27, 11, 95, 6,100, 21,253,172, 50,160,134,175, 2, 17,225,161,156, 62, 63,235, 80, 57,239, 75,253,152,193,221, 31, 23, 93, +187, 28, 71,192, 0,250,114,119, 75, 9, 28, 39,125,255,195, 42,201,131, 88, 13,194,226, 84,182,174, 66, 1,207,102,176, 4,236, +115,211,101, 27,205, 94, 70,116,136,225,125, 59,110,244, 48,100,169, 76,224, 56,128,207, 99, 11, 95, 66, 36,170, 25, 36,169,181, +200,202, 85, 34, 54, 62, 1,121,233,209, 96, 89, 22,238,190, 53,237,158, 73,218, 74, 68, 62, 90, 35,169, 63,168, 87, 59,254,225, +235,105,144,137,249, 48,168, 51,112,122,223, 10,165, 65,163, 90,170,211,106, 14,219, 51,159,227,159, 41, 8,140, 82,165,209,123, +137, 5, 60, 28,216,254, 35, 6,143,153,250, 82,237, 59,235,171,197, 0,203, 32, 39, 87, 13,134, 97,148,229,171,151,152, 59,165, +109,191, 97,100,236,173, 53,138, 49, 91,175, 55, 20, 74,110,141,146,211, 33,103, 78,200,127,143, 23,227,118, 68, 90,161,201, 82, +114, 75, 62,233,149,172,206,207,233, 14, 32,178,124,237, 66,182,251,208,113, 51,195,171,213,172, 99,184,244, 72, 19,151, 87, 96, + 46, 49,207,161,229,160,121,225,119, 79,174,239,153,111,142,249, 80,238, 83,199,202, 89, 44,223,235,148,145, 11, 75,232, 58, 20, + 45, 92,123,224,121,183,225,236,229, 59,108, 63, 91,173,176, 18, 14,132, 3, 62,254,122, 35, 44,156, 21,156,213, 10,206, 74, 96, +182, 18, 89, 89,197,245,244,173,124, 56,247,233,254, 90, 35, 22,189,222, 93,232,236,236, 12, 55, 55, 55,184,185,185,193,209,209, +177, 76,163, 37, 16, 8, 20,124,254,203,135, 58, 33, 33, 1,241,241,241,112,116,116, 4,225,204, 48,154,129,122, 45,186,225, 97, +244, 35,156,255,253, 62, 8,103,133, 92, 81,254, 85, 94,228, 94,129, 31, 54,237,208,239,199, 78,125,199,227,220,225,253,123, 52, +228, 0, 0, 32, 0, 73, 68, 65, 84, 95,200,157,171, 39, 38,235, 50, 35,183,216, 29,161,183, 90, 25,179,217,140, 94,221, 58, 36, +220, 11,127,118,230,171,153, 83,122,180,234, 61, 89,220, 50,208, 15,122,163, 21,201,241,209,184,124,116,155,190,102, 85,159,179, +157,219, 54, 79, 48,155,205,176, 90,173,101, 62,200,245, 70, 83, 22, 79, 32,149, 15, 27, 54, 66,112,231,246,237, 67,114,143, 26, + 7,172, 12,251,128, 33, 92, 16, 67,200,128,160,160,218, 48,153, 57,104,181,170,220,242,238,179, 90,173,142,221,186,117,107,213, +209,163, 71,203,234,212,169, 35,136,142,142,198,202,149, 43,179,213,106,117,172,189, 26, 33, 87, 35,214,240,153,220,168,162,136, + 86, 98,155,150, 24,214,187, 13,246,158,252, 29,151,175,221, 64,130, 70,113, 95, 99,225, 31, 77, 74, 72, 53,212,117, 85, 29,234, +219,178, 50,239,192,246,220, 67,225, 29,230, 12, 33, 68, 28,146,117,101, 65,129,253, 55, 55,160,214,153,225, 40,179,205,247, 84, + 20,217,226, 49,140,221,142,136, 1, 98,175,221, 8,173,215,164, 70, 29,220,139,205, 71,102,158, 1, 58,131, 5, 28, 71,192,129, +192,205, 65, 4,137,144, 69, 98,124, 44, 56, 98,138, 43,231,163, 66,217,190, 93,123, 62,192,128, 97, 8, 95,192,231,131,192, 54, +191,162, 84, 42,213,120,122,122,218, 21,209, 50, 89, 44, 24,208,163, 57, 90, 52, 13, 66,191,201,182, 57, 51, 47,252, 54, 7, 46, + 10, 1,246,238,220,130,164,171,107,118, 86,109, 57, 37,228,209,195,240,129,225,247,174,143,120,175,177,180,161, 55, 63, 85, 88, + 82,152,180,160,160,224, 16, 0,145, 80, 40,236,209,174, 93, 59,215, 67,135, 14,229,185,187,187,115, 34,161, 80,217,183, 79,111, + 78, 32, 20,230, 20,125,247,143, 63,254, 16, 76,158, 60,217, 33, 55, 55, 55, 49, 35, 35,227, 6, 0,115,233, 13,193,192, 46, 96, +177, 7, 12, 35, 81, 72,101, 9, 85,170, 84,243,109,218,162,185,211,251, 3, 6, 67, 44, 18,227, 92,200, 25,172, 91,189,124,191, + 38,237,201,184,242, 28,201,119, 53,234, 48, 57, 49, 46, 86,171, 51,212,175,215,164, 3,115, 45,228,232, 52, 19,220, 87,243,196, +166, 21, 93, 6, 76,173, 30,155,170,193,186,101,179,224,226, 36, 71, 92,244, 83, 93,212,147,135, 27,205,122,213, 44,187, 77, 22, + 0, 89,182,117, 96,203, 81, 61, 92, 12, 38, 43,174, 94, 60,169,231, 44, 92,143, 27, 87, 78, 69, 87,168,217, 84, 82,175,105,103, +151,172, 99, 91, 6,104,129,189,101,233,164, 60,125, 61,130, 75,140,121,113, 23, 46,158,119,242,170, 84,151,199,128,129,201,160, +135, 50,230,142, 69,155,241, 84,165, 74,121,100,215, 40,220,236, 36,124, 61,119,254,119, 31, 54,109,210, 68, 78, 32,121, 41,130, + 85,100,176,178, 84, 70,184, 59,136,160, 83, 41, 17,117,231,140, 94,171,228,149, 58,223,153,197, 88, 32,203,202,204, 16,253,153, +206, 16,217,162,180,239,103,101,102,136, 44,198, 2, 89,217,143, 58, 30, 28,229, 34, 60,140, 75,121,158,248, 46, 22,216,114,179, + 68, 2,222,243, 60,173,162,186,160, 12, 58, 8, 37,206, 72,201,214,131, 1, 1,103,181,192, 98, 54, 66,173, 82, 33, 37, 53, 29, + 25,233, 25, 80,171,243, 32, 83,184,160, 94,195,102,112,144, 75,240,224,242,126, 16, 66,236,154,215,208,204, 8, 2,155,182,104, + 43,126, 20,111,203,197,146, 8, 8, 78,236, 89,158,173, 81,101,182,213,164, 69, 69,149,183, 46,182, 88,173,231,195, 30, 71,213, +173,224, 83,133,185, 31,157,143,157,155,215,195, 88, 24,217, 52,155,173,120,148, 88,128,180, 28, 45, 18, 99,158, 16,206,106, 61, +143,255, 8,252,146, 3,128,224, 7,213,171,141,110, 35,223,199, 79, 63,109, 68, 76,108, 60,183,116, 90,207, 68,141, 58,239,189, +114,152,172, 46, 40,156,107, 67,155, 17,241,189,206,165,105,242,241,123, 57,172,206, 72, 74, 77,240,145,120, 84, 66,219,113, 43, +207,234,212, 57, 34,171, 65,203, 63,177,115,220,158,226, 52,109, 14, 26,198,165,159, 15,133, 66,202, 7,195, 48, 40,234, 46,220, +176,120, 18,100, 98, 91,223,178,206, 96,193,200, 25,171,176,115,213,103, 32, 0,134, 15,254, 93, 91, 82, 57, 97, 91,187,240, 99, + 31,220,174,144, 16,159,153,210,165,207,231, 23,244, 38,177,161,119,255,209,119,155, 52,105,146, 39,149, 74, 33,149, 74,225,232, +232, 8, 23, 23, 23, 56, 59, 59,151,185,239,102,179, 89, 99, 52, 26,221, 68, 34, 17, 56,142, 67, 92, 92, 28,226,226,226,144,159, +159, 15,165, 82,137, 2,141,202,114,251,194, 1,126,189,150, 61,225, 91,173, 62, 42,213,104, 0, 1,143, 1,159,207,226,242,241, +205, 37,149,179,120,147,213,190,239,134,206,253, 38,224,220,225, 77,228,206,213, 19, 83,116,153,145,155,237, 61, 71,133,221, 61, + 15, 6, 12, 24, 80,127,242,228,201,194,249, 51, 39,159, 61, 25,114, 57,242, 64,240,166, 62,185,185,121,254,132, 16, 56, 59, 57, + 37, 13,237,211,234, 68,199,214, 77, 19, 46, 92,184,192,237,217,179,199,192, 48,204,195,210, 52,109,149, 84,230,111, 23,206, 95, + 92,208,182,125, 7,108,217,190,167,125,248,227, 39,237,163,163,163,224, 95,169, 26,170, 84,173, 1, 45,227,130,139, 87,174, 65, +147,151,249,155, 61,229,124, 37,170,197,228,230,230, 94, 31, 58,116,104,183,223,127,255,157, 29, 58,116,168, 54, 43, 43,235,143, + 23,162, 88,164, 44,205, 27, 63,247, 87, 2,248,173, 82,251, 49,251, 83, 76,121,159, 2, 88, 94,177, 82, 69, 92,190,118, 3, 55, +126,191,181, 49, 75, 86,113,225,184,145, 99, 39, 85,238,203,155,208,183,101,101,158,167,139, 12,187, 55,173,228, 29,191, 17,191, + 42, 62,219,186,101,249,149, 5,139,237, 57, 71,207, 31, 28,106, 19, 90,215,118,133,217, 74,192, 17, 91,133,235, 32, 17,148, 84, +241,190,166,201, 55,138,199, 77,153, 60, 57,186, 94, 80,195,233, 35,199, 78, 17, 54,172,230,143,219,207,242, 0,134,129,171,183, + 28,105,105,105,184,122,112,147, 37, 55,229,233, 70, 30,143, 91, 84,142,227,137,220,132,251, 1, 47,108, 78,202,202,202,194,229, +203,151, 81,100,176, 60, 60, 60, 74, 50, 90, 47,105,102,103,164,254,177,248,135, 95, 90, 79,252,160, 63,122,119,168,139, 43,119, +162, 97, 44,156,175,169,104, 40,121,236,141,159, 69,159, 14,173,102,252,112, 64, 77,149,206, 44,138,255, 58, 46,255, 42,108,107, +176,114, 37,148,211,152,147,147,115, 60, 34, 34,162, 77,131, 6, 13, 42,159, 58,117, 42, 39,252,214,217,105, 47, 22,226,243,207, + 63, 87,252,244,211, 79, 50, 66,200, 31, 70,163, 49,198,174,125,103,177, 59,244,238, 93, 55,147,153,195,181, 91, 15,106,119,110, +221, 16, 28, 1,238,220,185,131, 45,191,110,209, 63, 12,187,191,162, 32,195,123, 81, 41,230,165,216,227,105,125,187, 81,135,207, + 53,211, 82,226, 87,156, 59,121,112,103,211,246,125, 48,226,227, 69,139, 46,159,220,179,160,113,219,222,108,237,166,221, 16,122, +227, 34,206,159, 58,243,157, 73,147,179, 0,101,231,142, 20, 91, 78,177, 84,246, 73,157,198,237,145,152, 16,143,184,168, 71,191, +233,115,158,165, 38, 68,243,126, 75, 77, 78,152, 82,181,110,107,252,126,118,239,180, 82,140, 86,169,215,188,191,135,116,211,169, +224,227,195,146,147,127,246, 46,208,233,197,132, 16,189, 88,196, 79, 87,176,234,125, 42,187,203,249,196,164, 76,173, 60, 96,240, +200, 41, 39,215,173, 91, 45,240,114,150, 33, 61, 87, 15,149,206, 4,181,214, 4,150, 97, 16,224, 43,135, 86,157,131, 43, 7,127, + 48, 27, 53,185, 67,129,104, 83, 73,154,114,207,192, 37,185,207, 46,126,252,249,212, 75, 16, 57,249,251, 86,233, 52,183,212,104, +157, 58,229,126,159,207,167,158, 8, 36,132,116,150,123, 6,170, 11, 50, 35,230,149,180,239, 12, 99,187,191, 71,116,244,135,201, + 98,155,127,204,194, 1, 86,142, 43,140,242, 1,228,121,127, 62, 83,198,190, 51,220,190,147,127, 32, 53, 35, 15, 58,163, 25, 6, +163, 5, 38,179, 21, 44,143, 7,103, 23,103,212,168,210, 8, 78,206,142,200, 72, 79,197,141, 11,199, 17, 25,118,229, 15,134, 96, +161, 78, 25,117,193,158,115, 36,148, 58, 7,250,248,122,179,105, 42, 35,164, 34, 30,238, 95, 57,101, 50, 27, 13, 43,236, 52, 89, +175,105,230,101,231,172,154, 62,243,139,225,219,182,110,247,174, 95,213, 17,201, 89, 58, 36, 43,245, 80,235,205,133, 70,140,131, + 65,147,133,176,139,219,211,173,122,245, 42,252, 71, 40,209,104, 89, 76,122,245,161, 51,183,221,230, 44,248,129,247, 44, 58,198, +188,228,211, 94,201, 58,141,170,103,185, 35, 89, 47,176,237,163,170,123,255,138,157,120,173,187,144,112,224, 8,193,137, 91,233, +207,187, 11,185,194,204,203,123,209,165, 47, 35,248,226,218,133, 29,122, 78, 59, 23, 22,161,222,165,211,101, 56, 61,125,182, 34, + 23, 0,120, 60,222,243, 87, 81,110,150, 94,175, 55,150,209,133,178, 99,243,230,205,179,167, 76,153, 34, 78, 74, 74, 66,116,116, + 52,242,242,242, 32,145, 72,112,230,204, 25, 51, 56,203,138,176,223,143,196, 69,132,134,124, 19,216,164, 91,133,250, 45,123, 66, + 38,147,131, 79,236, 79,198,148,121,214, 28,214,164,125,223, 31, 59,191, 63, 17,231,143,108, 38,119,174, 28,159,170, 83, 70,110, + 42,239,177,204,203,203, 11, 7, 16,181, 98,197,138,134, 91,182,108,169, 58,115,230,204,152, 29, 63, 46, 88, 7, 0,217,217,217, + 0,128,123,247,238,145,169, 83,167, 26,244,122,125,108,110,110,110, 40,202, 24, 0, 1, 0, 58,165,236,219, 45, 27,150,215, 75, + 74, 73,235, 95,173, 94, 51,120, 84,109, 6,239,128,230,200, 85,155,112,251, 89, 42, 98,158, 92,192,147,107, 7, 79,105, 21,150, + 5, 40,231,252,198, 13, 26, 52,240,103, 89,182,138, 70,163,241,174, 83,167, 78, 3,185, 92,126,175, 65,131, 6,141,248,124,126, +242,221,187,119,227,203,163,149,112,101,187,161, 82,251, 49,107, 19,212, 14, 29, 99,210,181,141, 18,212, 14,247,180, 98,167,207, +148, 23,215, 26,182,241,252, 86, 17, 83, 86,248,129,237,170, 67,187, 55,173,228,141,156,244,185,245, 81,190,203,167,124,169,232, + 92,249,194,213,108,218,135,163,251,253, 57,189, 67, 97, 36,171,240,103,187,194,244,249,249, 97,249, 0,102,135, 61, 22,252,248, +232,211,201,139,131,154,182, 30,213,238,189,161,172, 69,168,192,217, 35, 63,147,216,176,139, 7,248,196,250,149,206,142,213, 0, +202,236, 14, 50, 26,237, 49, 89,175,151, 49, 73,222,225,192,158, 95,199, 28, 58,114,120,217,251,125,251,185,109,248,122, 8,126, +248,229, 40,228, 82, 49, 8,199, 97, 72, 71,255, 65,223, 76,168,213,199,223, 75,226,119,232, 82,242,213,143, 87, 63,154,173,213, +154, 34,237,136,196,144,172,172,172,107, 10,133, 66,217,166, 77,155, 22, 98,177,152,201,202,202,226,123,122,122, 90,156,156,156, +140,201,201,201, 90,131,193,112, 8, 64,185,166, 29, 55,153, 57,196,101,232,113,236,240, 33, 60,184,117, 1, 79,158, 68,168,159, + 60,126,178,158,225,147,213, 5, 25, 81, 57, 64,185, 27,248,224,138, 29,117, 72,202, 61,234,208,106, 80,239,222,177,113, 73, 39, +173,222, 48,166, 65,171, 94,168, 92,187, 53,107, 50, 91,241,240,206, 37, 92, 58,184,250, 7,147, 38,103,206,219,156, 99,223, 10, + 85,107, 16,158, 8,215, 47,159, 4,225,184,141, 0, 64, 56,110,227,189,223, 79, 77,105,222,115, 2, 92, 61, 43, 55,200, 75,188, +199,224, 13,102, 15, 23,242,217,130,211,135,182, 29,137,139,139,195,211,167, 79,241,236,217, 51,228,228,228, 96,247,238,184,114, +157, 31,109,110,252,185,200,199,108,247,129, 67, 70,156, 24, 52,236, 3, 73,213, 26,245,217,192, 10, 46,112, 83,240, 17,241, 44, + 30,145,119,195,184,136,219,167,244, 38, 85,230,251,186,220,248, 18,141,159,204,189,182, 23, 96,157, 83,180,118, 97,203,150,173, + 3,191, 88,186,172,133,155,135,103,177,245,120,182, 50, 83, 52,235,227,227,129, 55,110, 94,183,107,173, 67,206,106,205,158, 52, +102, 40,199,179, 45, 20,138,231,113,234,194,163,103,107, 76,217, 62, 39,156,165,204, 8,254,216,254,109, 97,225, 56, 20,232, 76, + 80, 21, 24,144,175,214, 35, 45, 51, 27, 15,194,194,112,229,196,113, 68, 71, 60,136, 53, 27,141, 33, 44,203, 28,212,101, 68, 94, + 41, 95, 79, 19,191,170,155,171, 43, 98,115, 52,144,136,248,136,143,188,107, 40, 80,229,239,122,211,235, 72,151, 29,149,150,201, + 99,186, 13, 29, 58,236, 76,167,238,125,157,154,182,234, 34,115,119,116,134,144, 79, 16, 21,151,138,208, 63,206, 20,196, 60,184, +170, 50, 27, 53, 61,222,197,170, 47,255,227,148, 61,234,208,100, 40,232, 51,188, 95,251,195, 60, 30, 95,196,113, 22,131,201,104, + 24,248, 54, 38,235,175,130, 16,107,242,152,225,253, 95,106, 27, 88, 56, 34, 29, 62,248,172,238,197,182,130,217, 74,100,195, 7, +255,161,181, 85, 32, 37, 39,246,249,248,184,246, 42, 90,187, 48, 33, 33,251, 78, 78,142,225, 18,128,100,189, 94,255,198,101,204, +200,200, 88,188,116,233,210,222, 90,173,182, 86,135, 14, 29,196,142,142,142,200,206,206, 70, 72, 72,136, 57, 56, 56,248,113,102, +102,230, 55, 64,166, 69,135, 70,191,133,233,143,140,142,184, 27,242, 77,173, 38,221, 43,212,111,213,211,254,202, 76, 44,157,216, +169,239,120,230,252,209,205,228,246,229,163, 31,234,148, 81,191,188,197, 97, 53,233,245,250, 91,122,189,254,209, 87, 95,125,213, +212,203,203,203,235,155,111,190,145,168, 84, 42,193,134, 13, 27,244, 89, 89, 89,233, 42,149,234, 6, 74,201,167,121,157,123,230, +252, 20, 12, 56,125,104,115, 71,114,104,115, 87,103,119,191,110, 78, 30, 21,170,231, 41, 83, 98,243,149,169, 33, 0,206, 23, 78, + 20, 89, 46, 26, 54,108, 88,141, 97,152,161, 0,234,201,229,242, 0,133, 66, 33, 38,132,212, 98, 24, 38,156,227,184,176, 58,117, +234, 4, 63,126,252,184, 92,147,201, 38, 92,217,110,240, 15,108,189, 39, 71,203, 9,141,172,112, 79,194,149,237, 6, 0,200, 60, +247,133, 22,192,177,199, 29,102, 15, 56,126, 35,126, 93,120,174,211, 52,229,229,101,199,203, 91,230,252,228, 7, 1,239,234,250, +215,167, 61, 78, 6, 48, 38,236, 46, 86, 62,188,119, 99, 62, 67, 32,176,194,178, 68,151,249,236,238,187,208, 23, 8, 4,122, 63, + 63,191, 98, 71, 23,138,197, 98,189,193, 80, 90, 0,229,138, 69,147,134, 45, 64,251,237,135,247,111, 31,115,244,248,177,101,237, + 58,191,239, 38,169, 80, 1, 85, 60, 25,108,159,211,120,218,133,123,202,219,125,191,184,250, 83, 76,170, 62, 12,229,204,135,209, +104, 52,145, 0,114, 53, 26, 77, 63, 66, 72, 18,195, 48,254,185,185,185,247,205,102,243,195,114, 27, 2, 14, 35, 90,182,108,182, +155, 97, 24, 62,177,112,223,223, 16,240,246,232,211,158, 36,227, 45,151, 37,169, 95,197, 17, 51,190, 89,219,184,122, 64,205,198, + 69,107, 29,214,173,236,128,201,179, 87, 54,174, 92,181, 70,227, 63,215, 63, 44, 51, 77,128,152,181,185,227, 14,255,250,253,213, +123, 55, 47,125,233,238, 83,185,114,122,114,204,147,164,103,247, 23, 91,245,170,195,111,123,158,227,158,133,175,222,178, 98,246, +204,180,148,216, 45, 90,101,212, 35, 0,208, 42,163, 30, 61, 9,197,215, 89,233,201, 51,179, 51, 99, 86,188,233,177, 40, 40, 40, + 72,221,181,107,151,115,235,214,173, 89, 47, 47, 47, 40,149, 74, 92,186,116,137,227, 56, 46,165,220, 90, 57,177,151, 10,114, 24, +215,223,126,249,241,123,161,220,161,167,197, 98,241, 37, 4,224,243,249,105, 70,173,234,140,154,149,127,129,220,120,125,233,207, + 12,142, 1,192, 22,173, 93,200,113, 28,243,253,186,237,241, 2,137, 67,177,147, 33,154,245,106, 25,199,113,118,175,117,152,151, + 24, 90,253, 93,221,223, 12, 33, 11, 27, 52,105,241,165,217,108,210, 23,222, 31,122, 0,122, 66,144,205,178,204, 21, 30,103, 62, +171,122,139,198, 20,195,192,145, 48,124, 56, 72,249, 96,192, 64,147,159, 67,202,147,147, 85,172, 33,206,140, 12,215,102,182,175, +116,218,184,127,244,197,115,167, 6, 91,173,214, 42,133, 49,131, 56,131,174,224,128, 38,205,229, 55,224,174, 5,255,126, 78, 22, +153, 45,230, 47,254, 71,118,117,163,252, 47,105, 6, 86,149,246,171,224,231, 53, 58, 46, 62,243,118, 76,146,246, 55,188,188,172, +206,219,148,147,231,229,229,245, 53,195, 48,163, 68, 34,145,194,104, 52, 22, 16, 66,118,100,100,100, 44,198,107,139,255, 54, 18, + 72, 61,117,163, 69, 18,217, 60,147,190,224,186, 54, 51,114, 68, 89,251, 46,243,168,217, 77, 34,151,207,214,235, 10,118,104, 51, + 34,183,191,227,227,233, 36, 22,139, 27, 41, 20, 10, 65, 86, 86,214, 45, 0,249,255, 75,231,189, 65,131, 6, 21, 89,150,173,194, +113,156, 23, 0, 39,216, 70,133,100,241,249,252,148,194,136, 22, 41,175,102,155,177, 7,220, 59,119,173, 59, 35,228,106,196,154, +194,110,197,231,248, 13, 90, 37, 25,213,179,227,231,191, 29, 62, 86,220,168,195,127,220, 53,255,255,167,217,158,175,240,201, 26, +195,138,156,150,116, 14,212,107,179, 82, 83,166, 94,123,168,188, 5, 64,253, 54,229, 20, 10,133, 35, 77, 38,147, 84, 40, 20,234, + 76, 38,211,174,255,149,125,151,122, 6,142,103, 65,236, 94,153,130, 3,115,247,149, 65, 43,255,150,107,137, 87,191,126,253,182, + 66,161,176,162,213,106,149, 25,141, 70,173, 78,167,139,139,143,143,191,142,146, 23, 62,255, 75,203, 41,247,172,177, 90, 40, 20, +127, 10, 0, 38,147, 97,109, 65,102,212,140,210,254,176,148,239,255,163,207,145,123,149, 38, 81,124,158,192, 3,133, 19,115,115, + 22,139, 50, 35,246, 78,141,191,177,156,148, 55, 60,185, 84,147,106, 82, 77,170,249, 42, 44, 61,158, 84,243,239,212,148,248,212, +246,151,248,212,182,123,210,229, 18,190, 79,143, 39,165,136, 73,197,188, 0,216, 49, 97, 41,133, 66,161,252, 5,112,244, 16, 80, +254, 78,244,105, 79,146,254,202,239, 83,254,115,148,152, 19,205,148,226, 74,203, 19, 18,124, 19,103,123,158,106, 82, 77,170, 73, + 53,169, 38,213,164,154,255, 57,205,178,180,255,137, 93,146,147, 94,217, 62, 9,224,255, 37,225,159,134, 85,169, 38,213,164,154, + 84,147,106, 82, 77,170,249, 95,227,185,241, 98,233,177,160, 80, 40, 20, 10,133, 66,249,107,160, 57, 90, 20, 10,133, 66,161, 80, + 40,111, 71,113, 93,135,212,104, 81, 40, 20, 10,133, 66,161,188, 3, 74, 76,134,167, 93,135, 20, 10,133, 66,161, 80, 40,111, 71, + 81, 68,203, 7,175, 76,239, 64,141, 22,133, 66,161, 80, 40, 20,202,187, 33, 13,197, 69,183,130,131,131, 73,113, 63, 83, 40, 20, + 10,133, 66,161,252,127,240, 15,247, 34, 47, 70,178, 38, 21,110, 3,120, 33,162, 69, 13, 22,133, 66,161, 80, 40,148,255, 21,179, +245, 15,163, 40,146, 85,244, 74,123,205,104,245,238,221,155,161,102,139, 66,161, 80, 40, 20,202,223,197,191,209,139,176,175,238, + 32, 61,205, 20, 10,133, 66,161, 80,254, 78,179,245,111,218, 31, 58,189, 3,133, 66,161, 80, 40, 20,202,219,225, 3,160,215, 11, +219,255,111, 75,240, 80, 40, 20, 10,133, 66,161,252,219,153, 84,210, 54,141,104, 81, 40, 20, 10,133, 66,161,188,123,179, 69,161, + 80, 40, 20, 10,133, 66,249, 39, 67, 87, 54,167,154, 84,147,106, 82, 77,170, 73, 53,169,230,191,157,162,121,180,128,146,230,209, +162, 80, 40, 20, 10,133, 66,161,188, 17,189, 96,155, 63,107, 82,225,123, 47,106,180, 40, 20, 10,133, 66,161, 80,222, 45,175, 45, +191, 67,141, 22,133, 66,161, 80, 40, 20,202,187, 53, 88,155,168,209,162, 80, 40, 20, 10,133, 66,249,139,161, 70,139, 66,161, 80, + 40, 20, 10,229, 47,130, 65,201, 35, 7,206,151, 67,231, 77, 70, 31,156,167,154, 84,147,106, 82, 77,170, 73, 53,169,230,127, 78, +179, 44,237,243,248,231, 81, 52, 51,252, 73,252,153, 8,191,233,255,227, 31,211,161,175, 84,147,106, 82, 77,170, 73, 53,169, 38, +213,252,183, 51,233,149,247,231,208,174, 67, 10,133, 66,161, 80, 40,148,119,107,182,232, 18, 60, 20, 10,133, 66,161, 80, 40,239, +136, 18,187, 9,105, 68,139, 66,161, 80, 40, 20, 10,229,237, 40,113, 81,105,106,180, 40, 20, 10,133, 66,161, 80,254, 26,195, 69, +141, 22,133, 66,161, 80, 40, 20,202, 59, 52, 89,147,138,253,109,112,112, 48,161,199,136, 66,161, 80, 40, 20,202,223,197,191,214, +139, 20,237, 24, 53, 91, 20, 10,133, 66,161, 80,168, 23, 41, 55, 62,248,115,180,225,164,194,109, 0,116,212, 33,133, 66,161, 80, + 40, 20,202,219,210, 11, 47,143, 60,156, 84,180, 77,141, 22,133, 66,161, 80, 40, 20,202,219, 51,169,212,223,210,110, 67, 10,133, + 66,161, 80, 40,127, 39,255, 70, 47,194,208,211, 74,161, 80, 40, 20, 10,133,242, 86, 20, 23,205,218, 68, 15, 11,133, 66,161, 80, + 40, 20,202, 95,107,184, 40, 20, 10,133, 66,161, 80, 40,127,133,201,250,171, 39, 44,165, 43,155, 83, 77,170, 73, 53,169, 38,213, +164,154, 84,243,191, 98,178, 94,156,226, 1, 0, 29,117, 72,161, 80, 40, 20, 10,133,242,182,208, 69,165, 41, 20, 10,133, 66,161, + 80,254, 34,232,162,210, 20, 10,133, 66,161, 80, 40,255,207,134,139, 26, 45, 10,133, 66,161, 80, 40,148,119,104,178, 94, 50, 91, + 52, 71,139, 66,161, 80, 40, 20, 10,229,237, 40, 49, 71,139, 65,201, 35, 7,206,151,227, 31,188,201,232,131,243, 84,147,106, 82, + 77,170, 73, 53,169, 38,213,252,207,105,150,165,125, 30,255,124, 38,225,255,105,194, 82, 58,244,149,106, 82, 77,170, 73, 53,169, + 38,213,164,154,255, 53,232,244, 14, 20, 10,133, 66,161, 80, 40,239,218, 88,189, 10, 53, 90, 20, 10,133, 66,161, 80, 40,111, 7, +157, 71,139, 66,161, 80, 40, 20, 10,229, 47,194, 7,182,168, 86,209,123, 35,106,180, 40, 20, 10,133, 66,161, 80,222, 13,189, 96, +139,106, 21,189, 83,163, 69,161, 80, 40, 20, 10,133,242, 14, 41,118, 30, 45, 6, 0,130,131,131, 73,225,118,135,222,189,123, 95, +161,199,138, 66,161, 80, 40, 20,202,255, 39,255, 86, 47,242, 60,162,213,187,119,111, 6,192,101,122,170, 41, 20, 10,133, 66,161, +252, 29,252, 27,189, 8,251,138,147,236, 64, 79, 51,133, 66,161, 80, 40,148,191,131,127,163, 23,225,191,226, 34, 41, 20, 10,133, + 66,161, 80,254, 22,254,193, 94,196, 7,182, 68,248,147,133,239, 64,225,148, 15,116, 30, 45, 10,133, 66,161, 80, 40,148,183,163, +104,180,225,107, 75,239,208, 40, 22,133, 66,161, 80, 40, 20,202,219, 81,220,204,240,155,232, 97,161, 80, 40, 20, 10,133, 66,249, + 11,161, 17, 45, 10,133, 66,161, 80, 40,148,183,231,197,168,214,255, 91, 52,139,174,108, 78, 53,169, 38,213,164,154, 84,147,106, + 82,205,255,146,201,122,105,155,206, 12, 79,161, 80, 40, 20, 10,133,242, 23, 65, 71, 29, 82, 40, 20, 10,133, 66,161,188, 29, 69, + 35, 14, 95,220,166, 70,139, 66,161, 80, 40, 20, 10,229, 29,154,173,215,160, 93,135, 20, 10,133, 66,161, 80, 40,111,199,164,146, +126, 65,141, 22,133, 66,161, 80, 40, 20,202, 95,100,184, 24,148, 60,114,224,124, 57,132,223,100,244,193,121,170, 73, 53,169, 38, +213,164,154, 84,147,106,254,231, 52,203,210, 62,143,127, 30,127,219,132,165,116,232, 43,213,164,154, 84,147,106, 82, 77,170, 73, + 53,255,179,208,174, 67, 10,133, 66,161, 80, 40,148,255, 1,163,229,193,231,243,191,148, 74,165, 63, 73,165,210, 95,248,124,254, + 10, 0, 46,229,253,135,114,185,124,154,183,183,247, 83,111,111,239,228,138, 21, 43,158,114,112,144, 77,175, 38, 70, 59, 0,130, +119,180, 63,129, 0,166, 75,165,210, 39, 18,137, 36, 30,192, 78, 0,211, 1,184,191,141,240, 98, 95, 12,124,244,105,191,163,139, +125, 49,240,149, 95,245,242,242,242,186, 6,160,219,187, 58, 41,195,100,232, 50, 72,142,196, 65,114, 36, 14,147,189,121,171,193, +193,193, 97,148,143,143,207, 13, 55, 55,183, 20, 31, 31,159, 63, 36, 18,201,160,114, 74,120,122,121,121,253,224,239,239, 31,233, +235,235,187, 6,182,213,201,255,103,105, 43, 70,219, 22, 98, 40, 91,138,160,110, 45,194, 79, 45, 69,232,218, 21,144,189,161, 92, + 27, 0, 7, 29, 29, 29,239,243,249,252, 96, 0, 3, 10,175,175, 1,124, 62, 63,216,209,209,241, 62,128,131,133,223,123,147,235, +244, 7, 0, 41, 0,190, 45,220,254,196,223,223, 95, 29, 20, 20, 20, 31, 20, 20,180, 45, 32, 32,224, 3,123,197,100, 50, 89, 87, +127,127,255, 67, 21, 43, 86,140,111,217,178,101,142,159,159, 95, 68,133, 10, 21,182,139,197,226, 14,180,138,163, 80, 40,148,255, +125,250, 0, 88, 6, 96,125, 88, 88, 88, 40, 33, 36,148, 16, 18, 26, 22, 22, 22, 10,224, 39, 0,203, 81,114, 8,241,165,207,221, +220,220, 22, 46, 89,178, 68,159,150,150, 70,148, 74, 37,137,140,140, 36,171,231,205,230,186,187,242, 73, 53, 15, 23,173,143,143, + 79,116,165, 10, 21,246,214, 85,176,179, 1, 84,183, 71,243, 5, 92,164, 82,233,173,121,243,230,105,174, 93,187,166, 49, 26,141, + 26,142,227, 52,169,169,169,154,243,231,207,107, 90,183,110,173, 1, 48, 3, 0,175, 28,154,207, 89,228,139, 43,228,215,175,201, + 34, 95, 92,121,241,243, 90,181,106, 61,230, 56,142, 12, 28, 56,208, 0,192,175, 60,154,175,226, 7, 72,234, 58,194,121,144, 2, + 25,150,237,139, 9,217, 48,147, 12,146, 35,241, 77, 52, 61, 61, 61,143, 77,155, 54, 77,149,146,146, 66, 12, 6, 3, 73, 76, 76, + 36,147, 39, 79,206,247,244,244,220,101,231,190,187,213,175, 95, 63,227,198,141, 27, 92, 94, 94, 30,185,124,249, 50, 87,175, 94, +189, 12, 59,205, 86,151, 87,202,178,201,215,215,247, 84,121, 94,158,158,158, 91,202,123,142,154,139,145,104, 10,189, 68,200,157, + 16,114,124, 96, 75,178,186, 73, 5, 50,192, 85,148,215, 70,132, 79,218, 23, 63,149, 73, 73,154,131,219,183,111, 95,240,240,225, + 67,107,118,118, 54,121,252,248, 49, 55,113,226, 68, 61,128,240,137, 19, 39,234, 31, 63,126,204,101,103,103,147,135, 15, 31, 90, +219,183,111, 95, 0, 96, 66, 57,202,201, 2,216,186, 96,193, 2, 66, 8, 33, 75,150, 44, 33, 65, 65, 65,164, 83,167, 78, 68,163, +209, 16, 66, 72, 60, 33,100,155,197, 98, 25, 99,143,166,147,147,211,168,105,211,166,105,180, 90, 45, 41,130,227, 56,146,151,151, + 71,214,175, 95, 95,224,237,237,125,170,132, 70, 6,237,242,160,154, 84,147,106,254,175,105,254,147,241,129, 45, 79,171,232,101, +119, 96, 98,248,236,217,179,139, 76,213,233, 54,109,218,220, 30, 51,102, 76,232,152, 49, 99, 66,219,180,105,115, 25,192,217,187, +119,239,134,206,154, 53, 43, 20,192,240, 50, 78,132, 75,171, 86,173,242,210,211,211, 73,141, 26, 53, 72,229,202,149, 73,122,122, + 58, 33,132,144, 59,131, 27,147, 11,181, 65,146,174,158, 38, 33, 71, 14,146,137, 62,124,210,214,199,201,236,227,237,157,237,238, +238,190, 20, 47,175,201, 88,220,201,237, 95,187,118,109,117,120,120,184, 38, 42, 42, 74,179,112,225, 66, 77,167, 78,157, 52,245, +235,215,215, 12, 24, 48, 64,179,110,221, 58,141,201,100,210,108,217,178, 69,227,232,232, 24, 94,140,217,122, 99,163,197,231,243, +215,134,133,133,145,232,232,104, 82, 24,165, 40, 73,211,201,217,217,185,135,139,139,203, 12,103,103,231, 30, 0,156, 0,160, 6, +160,104,224,132,138,159, 52,168, 86, 43,120,120,151,234,235,187, 52,109, 60,200,129,205, 51,255, 56,147,144,129, 21,223,200,104, + 57, 57, 57,141,154, 62,125,186,218, 96, 48, 16,173, 86, 75, 52, 26, 13,209,106,181, 68,173, 86,147,225,195,135,171, 36, 18, 73, +255,178, 52,221,221,221, 23, 95,189,122,213,146,158,158, 78,174, 94,189, 74, 78,157, 58, 69, 54,108,216,192,121,122,122,174, 42, +239, 13,232,237,237,125, 46, 36, 36, 36,244,222,189,123,161,183,110,221, 10, 53,155,205,161, 38,147, 41,212,100, 50,133, 6, 7, + 7,135, 30, 62,124, 56,116,223,190,125,161, 70,163, 49,212,104, 52,134, 26, 12,134,208,170, 85,171,158, 41,239, 57,106, 38, 70, +146,241,218,113, 66, 86,125, 68,242,191,155, 74,242, 62,235, 73, 50, 39,183, 35, 63, 53,173, 64,218, 73,113, 2,175,175,237, 89, +172,166, 64, 32,184, 18, 31, 31,207,205,157, 59,215, 88,167, 78,157,252,113,227,198,233, 13, 6, 3, 33,132, 16,131,193, 64,198, +141, 27,167,175, 83,167, 78,254,220,185,115,141,113,113,113, 28,159,207, 63, 95,142,114, 46, 47, 50, 89, 87,174, 92, 33, 47,162, +209,104, 72,167, 78,157,226,131,130,130,182, 85,169, 82,101, 68, 89,154, 10,133,162,223,156, 57,115, 52,164, 24,204,102, 51, 81, +171,213, 36, 46, 46,142,171, 92,185,114, 42, 0, 55, 90,153, 83, 77,170, 73, 53,169,209,250,203,152, 84,198,118,241, 7,113,214, +172, 89,161,132,144,208,175,190,250, 42,180, 48,178, 37, 4,160, 40,124,241, 1, 12,155, 51,103, 78, 40, 33, 36,116,246,236,217, + 69,223, 41,233, 68,244, 57,112,224,128,105,205,154, 53,196,203,203,139,120,123,123,147,181,107,215, 18,142,227, 72,122,240, 46, +114,161, 54,200,147, 47, 71, 19, 66, 8,137, 92,250, 49,185, 80, 27, 36,102,227, 34, 50,114,228, 72,173, 76, 38, 27, 94,202,201, +117,109,220,184,177, 90,167,211,105,182,111,223,174,145,201,100,119, 0,212,129,173, 43,146, 41, 44,235, 7,117,234,212, 81, 61, +122,244, 72,179,103,207, 30, 13,128,133,118, 94, 48,213, 1,116,148,203,229, 3,230,248, 9,162,200,175, 95,147, 57, 94,120, 8, +160, 30, 0,143,194,239,248,206,158, 61,155, 16, 66,136,191,191,255,213, 18, 52,157,234,215,175, 63, 59, 42, 42,106,190,217,108, +158,127,239,222,189,249, 53,107,214,156,219,183,170, 79,203,163,195,187, 54,202, 95, 52,181, 17, 89,249, 89,253, 21,239, 53,235, +178,119,104,135,225, 99,171,184, 95, 27,231, 41,209, 14,113,226,169, 95,233, 58,180,235,194,246,243,243,187,149,152,152,248,220, + 92,169,213,106,146,146,146, 66, 98, 99, 99,201,181,107,215,136,143,143,207,133,178, 52,189,189,189, 31, 39, 38, 38,146,141,171, + 87,147,129,245,106,145,118,206, 14,164,189,139, 3,105,162,144, 20,212, 6,154,148,215,104,221,191,127, 63, 20, 64, 40,128,208, +236,236,236,208,236,236,236,208,220,220,220,231,159, 1, 8,205,207,207, 15,205,207,207, 15, 53, 26,141,161,213,170, 85, 43,183, +209,106, 45, 65,235,230, 18,228,180, 20, 67,215,199,207, 61,117,106, 85,119,235,205,225, 45, 73,238, 71,157,200,154, 70,126,164, +141, 8,159,216,169,217, 71, 36, 18, 93, 6, 48,179,208,148,143,238,209,163,135,150, 16, 66,122,244,232,161, 5, 48,186,240,243, +233,133, 38,171,135,157,229,100, 3, 2, 2, 10,138, 34, 89, 0,174, 7, 4, 4, 20, 4, 5, 5,145,160,160, 32,226,239,239,175, + 46,212,182,171, 66,171, 94,189,122,164, 78,167,123,110, 0,243,242,242, 72,106,106, 42,137,137,137, 33,225,225,225,228,206,157, + 59, 36, 62, 62,158,236,223,191,223,234,236,236,124,146, 86,230, 84,147,106, 82, 77,106,180,254, 82,163,245,234,235,101,130,131, +131,201, 43, 31,125,119,247,238,221,208, 57,115,230,132,150,225,204, 38,125,245,213, 87, 69, 81,175,101,165, 60,252,183, 68, 70, + 70,146,209,163, 71,147,192,192, 64, 18, 24, 24, 72,198,140, 25, 67,242,243,243,137,230,217, 35,114,161, 54,200,157, 33, 77, 8, + 33,132,168,159,220, 35, 23,106,131,132,142,108, 69, 30, 60,120, 64, 42, 84,168, 16, 82,202,255, 63,241,199, 31,127, 40,119,237, +218,149, 14, 91, 62,150, 0, 64, 11, 0,107,165, 82,233, 86,216,186, 11, 43, 3,112,169, 81,163, 70,142, 86,171,213, 12, 28, 56, + 80, 3,160, 98, 41,154,237, 3, 3, 3,163,183,108,217, 66, 50, 51, 51, 73, 78, 78, 14,249,190,117, 77, 66,126,253,154, 44,105, + 82,153,219,184,113,163, 97,230,204,153, 5,174,174,174,193, 0,124, 7, 14, 28,104, 33,132,144,118,237,218,101, 20, 39,230,236, +236,220, 35, 42, 42,106,190, 94,175,159,159,151,151, 55, 63, 39, 39,103,254,241,163, 71,231,119,175, 87,115,116,254,162,169,141, +142, 14,239,218,232, 61, 63,151, 1,171,186, 53,157,146, 50,119,194,192,175, 90,213,121,162, 95,254,233,165,193, 85,189,126,120, +147,179,237,225,225,145,102, 48, 24, 8,128,215, 94,209,209,209,196,205,205, 45,177, 44, 13, 87, 87,215,175,166, 15, 27,106,237, + 95,217,143, 68,175,153, 71,204,231,246, 16,243,169,237,228,217,119,159,145,190,222,238,170, 22, 66,118,142,189,229,241,246,246, + 62,119,235,214,173,151,140, 86,110,110,110,177, 70, 75,165, 82,133, 26,141,198,208,128,128,128, 51,111,123,213,183, 16,161, 90, +123, 41,239,206,189,209,109,137,114,106, 39,210,195, 73, 16,255, 22,114,195, 0, 92, 6, 48,178,156,127,199, 2, 88, 94,100,168, +190,251,238, 59, 66, 8, 33, 1, 1, 1, 5,120,187,193, 40, 78,181,106,213,138,157, 48, 97,130,165,118,237,218,153,173, 91,183, +206,187,125,251, 54,185,114,229, 10, 57,117,234, 20, 57,120,240, 32,121,244,232, 17, 73, 73, 73, 33,145,145,145,164, 87,175, 94, +121, 0,218,211,186,144, 66,161,252, 47, 83,140, 23,249,199,195, 22,237, 88,239,222,189,153, 23,118,208, 9,128,164, 73,147, 38, +202,229,203,151,175,132,109, 46, 8,166, 62, 15,131, 59, 73,249, 15, 58, 73,249, 15,234,243, 48,184, 48, 98,180,105,233,210,165, +139,131,130,130,210, 0, 72, 1,120, 23,247,143, 8, 33,109,221,220,220,144,152,152, 8, 39, 39, 39, 56, 57, 57, 33, 49, 49, 17, +132, 16, 88, 8, 96, 38,128,193,100,130, 78,167,131,158, 35,208,113,128, 74,163,129,183,183, 55, 76, 38, 83,181, 18,202,223, 96, +200,144, 33,213,234,215,175,175,156, 53,107, 86, 42,108,185, 50, 91,199,143, 31,127,238,250,245,235,245, 53, 26, 77, 78,120,120, +184,190, 94,189,122, 61, 0,252, 31,123,223, 29, 22,197,213,190,125,207,246,101,119, 97,151,190,116,149, 34, 88, 64,209,216,197, +222,177, 19,187, 70, 99,137,229,213,104,140,177,133, 98,212, 88, 98,143,137, 38,182,136,198,130, 88,130,177, 97,195,174,128,162, + 40, 8,130, 52, 41, 75, 91,182,192,238,194,238,158,239, 15,132, 16, 67, 53,121,127,223,155,100,238,235,218,107, 97,231,204, 61, +231,204,156, 51,115,207,115,158,243, 60,210,164,164,164, 41,187,118,237,194,180,105,211, 80,207, 67,167,237,176, 97,195,126,125, +246,236,153,235,228,201,147,113,227,198, 13,108,218,180, 9, 5, 5, 5, 4, 0,180, 90, 45, 49, 24, 12,229,221,186,117, 43,223, +190,125,123, 39, 63, 63,191, 7, 45, 90,180, 96, 2, 64,106,106,106,114,109,132, 20, 69,181,116,113,113,129, 86,171, 69,126,126, + 62,158, 61,123, 6, 83,177, 24,113,217, 5,182,189,183,126, 95,184,242,204, 21,246,132, 78,222, 22,139, 7,116,215,174,191,124, +195,163,181,189,173,173,174,188, 66,250, 50, 39, 47,251,125, 46, 42,135,195,201, 40, 40, 40,128, 78,167, 67, 89, 89, 25, 20, 10, + 5, 10, 11, 11, 81, 80, 80,128,236,236,108,112, 56,156, 87, 13,113,152, 21, 21, 69,165,222,185, 73,157,216,179, 17,174,250, 34, +176, 78,237, 0,235,236,119,112,211,229, 99,239,234, 57,166, 58, 75,235, 96, 51, 83,211, 98,137, 68,242, 3, 0,247,134,248,124, +125,125, 81, 88, 88,136,194,194, 66, 88, 90, 90,194,220,220, 28,230,230,230,144,203,229, 40, 41, 41,129, 66,161,128,135,135, 7, +218,181,107,135,195,135, 15,255, 37,157,251,190, 14, 41,122, 24,230, 94, 73,204, 6, 71, 40, 68, 11,115,145,203, 7, 34, 88,212, +179, 75, 95, 54,155,125,210,194,194,226, 50,128,249, 0,132, 0,230, 91, 88, 88, 92,102,179,217,163, 0,172, 5,112,164,137,213, + 88, 31, 28, 28,252, 69, 82, 82,146,224,201,147, 39, 88,182,108, 25, 66, 66, 66,144,156,156,252, 45, 0,227,219, 50,243, 44, 45, + 45, 35, 24, 12,198,143, 0,134, 2, 24,108,103,103,215,175, 1,222, 81, 75,151, 46,213,116,232,208,225,229,139, 23, 47, 70,221, +185,115,167,227,146, 37, 75, 74,210,211,211,241,242,229, 75,216,217,217,193,201,201, 9, 42,149, 10,197,197,197, 24, 53,106,148, +216,204,204,108, 34,125, 27,167, 65,131,198,255,178,200,122, 71,139,252,221, 44, 90,181,254, 95,235, 27,181, 64, 32, 8,142,137, +137,233,234,227,227,195, 2,112, 2, 0,188,153, 8, 24,213,173,253,129, 51, 63,108,244, 9,223,190,218,103,144,143,199, 1,111, + 38,170, 86,177, 69,116,236,216,209, 60, 38, 38,166, 27,143,199,251, 79, 29,149, 32, 0, 96,110,110, 14,177, 88, 12,137, 68, 2, +115,115,115, 24,141, 70,168, 74, 53, 80, 27, 0,165, 70,135,146,146, 18, 40,223,254,175,210,150, 67,173, 86, 87,239, 91, 11,122, +207,156, 57, 51,127,215,174, 93,178,156,156,156,141, 0,218, 78,155, 54,109,228,206,157, 59,113,237,218, 53,205, 80, 79, 55,203, +117, 61,219,127,213, 58, 39, 57,200,147,141, 89, 0,162,162,162,162,208,173, 91, 55, 80, 20, 53,190, 54, 66, 19, 19,147,239,142, + 29, 59,102, 18, 31, 31, 15, 55, 55,156,238, 33, 20, 0, 0, 32, 0, 73, 68, 65, 84,183,248,241,227,199,127,184,113,227, 70, 87, +161,170,232, 54, 0,232, 11,115,227, 23, 44, 88,240,229,186,117,235,242,243,243,243,203, 75, 75, 75,109, 70,140, 24,129,140,140, + 12,188,121,243,230,110, 29, 34,243,101,108,108, 44, 41, 41, 41, 65, 74, 74, 10, 98, 99, 99, 77,190,252,242,203, 78, 6, 6, 99, +100, 22, 76,167, 79,235,222,177,211,228, 46,237,113,228,222, 19,206,173,196, 84, 73,199,102, 14,230,143, 51,115,154, 87, 80,120, +245, 62, 87, 91,169, 84,238,248,234,171,175, 84, 42,149, 10, 89, 89, 89,120,250,244, 41, 94,188,120,129,180,180, 52,108,218,180, + 73, 85, 84, 84,180,179, 33, 14,123, 62,235,179,205, 75, 62,166, 88,207,239, 2, 79,110, 2,165, 74,160, 76, 5,109, 66, 12, 14, + 38,228, 98,247,169,211,220,244,140, 12,201,241,227,199,103, 58, 59, 59,199, 0,240,168,143,143,144,202, 75,200, 96, 48,222, 21, +161, 96, 48, 24, 74, 0,185, 66,161, 48,211,212,212, 52,147,193, 96,228, 18, 66,212,127,201,155,132, 30,229, 96, 50, 1,174, 9, + 24,236,122, 83,123,126, 56,126,252,248, 99,153,153,153,131, 82, 82, 82,186,238,220,185,243, 43, 62,159, 31,183,115,231,206,175, + 82, 82, 82,186,102,102,102, 14, 26, 63,126,252, 49, 0, 83,155,114,124,119,119,247, 5, 65, 65, 65,216,180,105, 19,218,181,107, + 7, 15, 15,143,210,224,224,224, 29, 0, 86, 3,248,143,187,187,251,237, 5, 11, 22,204,144,201,100,210,172,172,172,118,223,126, +251,237,156, 29, 59,118,124,144,157,157,205,111,128,186,199,192,129, 3,113,225,194, 5, 0,200, 1,144, 82, 88, 88,168,207,206, +206,134,151,151, 23, 58,117,234, 4,149, 74, 5,149, 74, 5,185, 92, 14, 23, 23, 23, 24,141,198,174,244,173,156, 6, 13, 26, 52, +254, 79, 5, 87,237, 66,139,207,231,155,251,250,250,162, 69,139, 22,230,120,187, 90,203,146,203, 90,177,120,230, 4,129, 40,230, + 34,168,216,171, 24,223,179,141,192,146,203, 90,241,118, 23,150,139,139, 11,207,215,215, 23, 66,161,208,161,142,131,223,200,205, +205,133,175,175, 47, 36, 18, 9,196, 98, 49,124,125,125, 81, 94, 94,142, 18,165, 18,106, 3, 80, 90, 97, 68, 73, 73, 9,138,242, +243, 80,106, 0,244,166,150, 72, 75, 75, 3,147,201, 76,173,131,211,206,205,205, 45, 63, 46, 46, 46, 31, 64, 20,128, 79, 66, 66, + 66,176,124,249,114, 4, 6, 6, 30, 19,228,188, 30,120,236,194, 89,203,163,193,243,172, 61,184,212, 4, 0,229,153,153,153,144, + 72, 36, 16, 10,133,181, 10, 3, 63, 63,191, 14, 66,161, 16,135, 14, 29, 34, 89, 89, 89,221, 81,185,132, 63,149,162, 42,197,158, + 9, 3, 37, 0,118,196,196,196,116,254,242,203, 47, 19,251,247,239,207,238,210,165, 11,214,174, 93, 11, 0, 17,181,113,202,229, +242,251, 83,167, 78,213, 93,191,126, 29, 9, 9, 9,194, 51,103,206, 4,172, 93,187,182, 77,122,122, 58,239,151, 95, 47, 14, 9, +205, 84, 4,108,188,124,139,191,238,210,141,251, 86,102,194,214,205,173, 44, 16,155,254,134, 99, 96,226, 97, 67, 87,180, 51,155, + 57,179, 55,159, 21,219,147,199,200,233,205,103,197,124,192,102,126,172, 84, 42,143,159, 59,119,238,210,146, 37, 75, 84, 50,153, + 12,166,166,166, 40, 44, 44,196,250,245,235, 85,177,177,177,167,116, 58,221, 47, 13,241, 26,140,164,131, 83, 51,103,224, 85, 92, +245,111,229, 70,130,135, 58, 14,252, 63, 89, 4, 79, 47, 47,232,116, 58,180,109,219,150, 10, 9, 9, 17,138,197,226,207, 27, 20, + 61,140, 63,116, 55, 61, 69, 81,185,132,144, 55, 42,149, 42,203,196,196, 36,157,195,225,164, 23, 21, 21,101, 17, 66,242,254, 10, +157, 69, 24,248,172, 91, 91,119,128,103,130,244, 66, 85,246, 35, 21,138,106, 43,104,106,106,250,241,238,221,187,249,251,247,239, +175, 88,176, 96,129,118,206,156, 57,236,178,178, 50,155, 57,115,230,176, 23, 44, 88,160,221,191,127,127,197,238,221,187,249, 34, +145,104,204,251, 84,164,162,162, 2,113,113,113, 27,147,147,147,133,168, 12, 55,178, 40, 56, 56,120, 90, 82, 82, 18,127,215,174, + 93, 8, 11, 11, 67, 88, 88, 24, 70,142, 28,137,133, 11, 23, 34, 40, 40,168, 62, 58,129,143,143,143,175,165,165, 37,110,222,188, +153, 13, 32, 29, 64, 7,145, 72,100, 58,114,228, 72, 12, 26, 52, 8, 26,141, 6,229,229,229,213, 66,139,201,100, 66, 34,145, 88, +210,247, 64, 26, 52,104,208,248,175,139,172,223,137, 45, 22, 0, 84,153,234,252,253,253,169,250, 30,140,134, 98, 25,228,234, 82, +164,149,148, 34,163,216,248,187,109, 70,163,177,222,163,103,103,103,255,114,239,222,189,143,125,125,125, 89,217,217,149, 51, 98, +190,190,190, 40, 45, 45, 69,246,147, 7, 80, 27, 1,161,155, 55,212,106, 53,138, 95, 60,134,200,167, 43, 44,135, 77,198,214, 93, +187,180,133,133,133,123,106,227,228,114,185,108, 71, 71,199,252,212,212, 84, 61,128, 34,177, 88, 60,208,217,217, 25, 55,110,220, + 0,128, 35, 4,216,140,216,235,192,205,112,144, 74,147,138,200,197,197, 5, 50,153, 12, 42,149,234, 70,109,156,247,238,221, 75, +170,168,168,104, 59, 98,196, 8,234,167,159,126, 58,161, 80, 40, 2, 1, 60,213, 26,193,124,146,153, 7,181, 1,124, 0, 3,204, +205,205, 63, 13, 10, 10,234,183, 96,193, 2,156, 59,119, 14,151, 47, 95, 46, 71,165, 47,216,189, 90,104, 75, 82, 82, 82,246, 46, + 93,186,180, 11,131,193,248,228,202,149, 43,122, 15, 15, 15, 69,121,121,185,161,165,167, 39, 35, 48,100, 13,103,254, 39,179, 37, +133,165,120, 62,168,165, 93, 55,138, 2,158,191,145,165, 39,171, 80, 88,223, 57,245,227, 50, 35, 70,117,247,241,251,120,252,112, +145,208,173, 53,212,207, 30, 72,247,158,252,117,171, 73,108,146,255, 77,153,108,228,185,115,231, 2,110,220,184, 49, 95,167,211, +181,224,241,120,175,228,114,249,118,149, 74,213,160,200, 98, 50,153,195,180,118,142,230,242,162, 34,240,223, 90,162, 20, 21, 70, + 20,104,245, 72,144,120, 96,162,163, 83,245, 52,104,110,110, 46,164, 82, 41,101, 48, 24,134,215,199,121,249,242,101,248,251,251, + 87, 9, 79, 80, 20, 5,138,162, 10, 60, 61, 61,243,120, 60, 94, 33,135,195, 81,108,222,188, 89,163,209,104,192, 98,177,248, 6, +131,129,249,103,122,123, 39, 1,108,120,132,250,110,206,136, 62,253,219,181,246, 34, 81,143,158, 80,197,165,154,131,245, 88, 1, +191,117,119,119,103, 21, 21, 21,253, 2, 32,161,162,162,226,232,137, 19, 39,248, 83,166, 76,209,156, 60,121,114, 18, 0,215, 45, + 91,182, 4,168, 84,170, 38,165, 84, 72, 78, 78,254,118,221,186,117, 95,172, 90,181, 10,135, 15, 31, 94,144,156,156,188,252,173, +165,107,100, 80, 80, 16, 54,111,222,140,195,135, 15, 27, 19, 18, 18,126, 53, 26,141,201, 75,150, 44,241,177,181,181, 45,200,201, +201, 73,174,135,182,227,224,193,131,181,183,111,223,230, 42,149,202, 91, 0, 62,157, 59,119,238,204,206,157, 59, 43,198,143, 31, + 47, 42, 42, 42,146, 11, 4, 2,238,190,125,251,204, 89, 44, 22,212,106, 53, 40,138,130, 82,169,212,209,247, 65, 26, 52,104,252, +175,162, 46, 45,242, 55, 65,157,207, 6, 86,109, 13, 44, 45, 45,205,203,200,200,240,122,243,230,141, 30,128, 30, 0, 10,117,250, +175,215,237, 11,223, 63,166,139,187, 48,167,162, 2,103, 30,197,151, 22,234,244, 85,206,239,250, 55,111,222, 40,211,211,211, 77, +203,202,202, 84,117, 28,235,238,119,223,125, 87,118,253,250,117,211,148,148, 20, 24, 12, 6,116,232,208, 1, 47, 95,190, 68,113, + 66, 28,132, 94, 29, 32,236,229,143,248,152, 71,136,189, 28,137,215, 42,157, 62,113,245,186, 18,149, 90, 29, 84, 94, 94,126,166, + 54, 66, 54,155, 93, 4,128, 16, 66, 12, 0,160, 80, 40,158,170, 84,170,158,182,182,182,120,254,252,185, 80,109,192,194,128, 21, + 91,119, 18, 66, 12,156,202,213, 92,139,199,143, 31,143,232,232,104, 0,136,174,141, 83,161, 80, 44,152, 53,107,214,245, 67,135, + 14,177, 82, 82, 82, 6,237,223,191,127, 80, 98, 98, 34,161,138, 50, 12,183, 75,217,112,157,182,240,131,239, 93, 60, 47,251,251, +251,195,206,206, 14,251,246,237,195,246,237,219, 43,230,205,155,151,180,125,251,246, 15,100, 50,217,209, 58,218, 95, 34,151,203, + 47, 90, 90, 90,206,111,211,166,141, 82,173, 86,163,176,176, 16,217,217,217,176,176,180,100,232,193,232,102, 45,145, 28,253, 37, + 87, 41,100, 93,188,143, 7, 89, 57,245, 90,179,186,176,153, 83,199,248,181,247,251,207,170, 21, 34,220, 62, 3,106, 86, 16,200, +254,175,176,232,163, 0, 83,141,246,104, 47,245,147,180, 41, 49, 10, 69,168, 66,161, 8,107, 98,103, 25,220,173, 91,183, 99,235, +214,173, 51, 89,185,105, 29,182,120, 57, 64, 95, 88,136,124,173, 1, 5, 90, 61, 20,197, 9,120,254, 60, 30,150,150, 86,120,253, +250, 53, 52, 26, 13, 94,188,120, 65,152, 76,230, 47, 13, 89,116,170, 80, 99,186, 80,206,227,241, 10,217,108,118, 30,139,197, 42, + 74, 73, 73, 81,107, 52, 26, 48, 24, 12,161,193, 96, 48,105, 68, 93, 29,173,172,172,150,160, 50,152,232, 57,101, 65,193, 14, 95, + 54, 36, 96,161,183,139,149,229,144,213,115,166, 88, 57,219,219,200, 83,146, 94, 85,236,185,116,167, 64,163,173,123,177, 6,128, +136,162,162,162,106,139,228,201,147, 39, 23,157, 60,121,114, 38,128, 3,168,204,187, 21, 41,151,203,191,127,143,193,183,250,212, +169, 83, 95,172, 90,181, 10, 38, 38, 38,213,193, 83, 77, 76, 76,248, 0,240,243,207, 63,227,249,243,231,157,241,214, 95,203,104, + 52, 30,203,201,201,105,136,211,213,219,219, 59, 37, 60, 60,156, 11,192,126,238,220,185, 93,119,238,220,137,143, 62,250, 40, 63, + 62, 62,190, 11,128, 84, 0,174,159,124,242,201,195,195,135, 15,155, 27,141, 70, 20, 23, 23, 67,167,211,165,210,183,114, 26, 52, +104,208, 98,235,191, 2, 95, 0,177,168,140,159, 53, 12,192,121, 84,186,117,212, 9,167,183,234,236, 18,128, 17, 85,207,199, 58, +156,225,129,202, 21, 89, 23, 1,252, 8,192,182, 46, 82, 75, 75,203,207,167, 77,155, 86,145,149,149, 69,114,115,115, 73, 88, 88, + 24, 89,252,241, 52,195, 0, 55,123,163,155,189,173,218,218,218,250,165,157,149,197,193,246, 2, 44, 6,224,216,136,134, 77, 75, + 76, 76,156, 61,109,218,180,143,223, 30,247,227, 99,199,142,169,174, 92,185,162, 98, 50,153, 17,168, 12,237, 80, 37, 40,167, 14, + 31, 62, 92,165,213,106, 85,158,158,158, 69,168,116,220,175, 11, 1,189,123,247, 46,190,112,225, 2, 49, 24, 12,127,136, 81,148, +159,159, 79, 46, 95,190, 76,186,119,239, 46, 7, 48,165, 95,191,126, 55,238,220,185,115,163, 71,143, 30,167, 26,170,176,149,149, +213,138, 39, 79,158, 68,167,165,165,197,156, 63,127, 62,230,232,209,163, 49,159,124,242,201, 83, 31, 31,159,178,164,164, 36,163, + 94,175, 39, 79, 30, 63, 38,158, 45, 91,170, 1,184,212,197,211,215,132,245, 80,177,239, 43,162, 89,251, 17,209,140,114, 34, 0, +136,114,235,231, 36,111, 65,127,242,114,254, 16,210,135,207,188,247, 62, 61,197,194,194,226, 82,116,116, 52, 81, 42,149,228,217, +179,103,100,170,255, 32,114,111,102,127,114,113,144, 59, 57,220,171, 57,217, 58,208,135, 12,234,213,147,124,247,221,119, 36, 60, + 60,156,172, 88,177,194,104,101,101,165, 68, 61, 62, 90, 82,169,244,202,137, 19, 39, 98, 0,196, 48,153,204, 24,133, 66, 17,163, + 84, 42,127,201,204,204,220,237,233,233,249, 69,155, 54,109, 38,121,121,121,245,237,211,220,229,139,126,166,188,151,253,205,248, +175, 90,138, 4, 91,241,199,184, 87,213, 16, 3, 46,110,174,174,202,155, 55,111, 26,181, 90, 45,185,117,235,150,177, 85, 75, 15, +205,150,113,131, 79,189,222,183,225,148,230,194, 79,151, 74,207,254,112,231,228,116,255,184,222, 2,198, 79, 93,133,213,225, 56, +222, 23, 19, 0,156,193,111,171, 14,167, 1, 56,139,250, 87, 33, 50, 0, 28, 88,187,118,109,205,149,134, 0,192,240,241,241,137, + 33,132,196,248,248,248,196, 52,181, 34, 2,129, 96,201,185,115,231,130,157,157,157, 55,141, 31, 63,126,159, 92, 46, 63, 63,105, +210,164, 56, 84, 46, 6,161, 80,153, 29, 97,184,163,163, 99,126,108,108, 44,185,113,227, 6, 25, 59,118,172,146,195,225, 76,166, +111,227, 52,104,208,160,241, 95,193,236, 58,190,235,197,186,184,184,184,170, 24, 90,115,235, 35, 95,190,124,121, 76,116,116,116, + 12, 42,163,196,215, 11, 22,139,117,122,222,188,121,196,214,214, 86,101, 99, 99,115,154,205,100,206,116, 50,129, 47,222,111,169, +123,207,208,208,208,145,223,126,251,237, 48, 0,157, 1,176, 29, 28, 28,178,115,115,115, 85,119,238,220, 81,117,239,222, 93,101, +101,101, 37,243,246,246, 86,109,217,178, 69, 85, 81, 81,161, 90,178,100,137, 10,127,140,247, 85, 27,248, 0,230,115,185,220,211, +173, 90,181,138, 91, 61,162,111,197,166,133, 51,201, 52,119,107, 21,128,111, 1,204, 3, 32, 1,192, 14, 8, 8,184,250,226,197, +139, 75,222,222,222,123, 27,193,107,223,166, 77,155,107,199,142, 29,139, 14, 15, 15,143,249,252,243,207,163, 45, 45, 45,179,146, +146,146,140, 26,141,134, 20, 23, 23, 19,185, 92, 78,206,159, 63,111,176,176,176,216, 85,103,195,121,204, 28,114,249, 72,173, 33, + 28, 50, 87, 77, 38,221,185,140, 55,239,211, 83,132, 66, 97, 81, 97, 97, 33,201,205,205, 37, 41, 41, 41,228,212,169, 83,100,112, +183, 78,228,248, 39, 99,200,145,143, 71,146,205,131, 59,145,206,166,124,181,212, 84, 20,109,106,106, 42,107,204,170, 67,169, 84, +122, 69,171,213, 86,135,111,112,116,116,140,241,244,244, 12,247,246,246,222,122,238,220,185, 69,219,182,109, 27,217,167,185,203, + 23,235, 7,117, 43, 43,141, 60, 73,148, 39,190, 37,203, 59,120,104,222,138,249, 90,225, 96,105, 17,122,243,198, 13, 99,149,248, +213,235,245,228,204,233,211,100,220,144, 1,113, 37, 23,127,254,241, 86,208,130, 99, 75, 58,120,156,233,206,199,132,250, 4, 91, +245,171,136, 8,150,126,102,140,221, 67,157, 45,114,122,138, 25,223,118, 49,253, 93,122,169,113, 30, 30, 30, 41,132,144, 28, 47, + 47,175, 20, 0, 71,188,188,188,106,254, 63,189, 14,218,234,224,164,193,193,193,228,237,248, 96, 0, 8, 92,183,110, 93, 12, 33, + 36,198,221,221,253, 54, 0,180, 19,194,170,151,152,241,227, 8, 87,219,194, 94, 98,198,143,237,132,181,167,140,114,225,160,101, + 79,107,193,173,145,238,118,202,222, 14,226,168, 35, 7,247,111, 26, 58,116,232, 62, 0,187, 0,124,101,105,105,121,107,194,132, + 9,207, 15, 31, 62,252,124,203,150, 45,229, 73, 73, 73,100,198,140, 25,106, 30,143,247, 21,125, 31,164, 65,131, 6,141,255, 26, +170, 34,195,219, 53, 69,104, 13,255,226,139, 47, 98, 8, 33, 85,177,180,166,212, 82,102,196,170, 85,171, 98, 8, 33, 85,209,225, +223, 13, 96, 86, 91, 64,179,224,221,187,119, 19, 30,143,247,227,123, 54,166, 38,167,116,212,168, 81, 93, 20, 10,197, 7,182,182, +182, 31,188,181, 92, 57, 89, 89, 89,165, 28, 61,122, 84, 85, 86, 86,166, 34,132,168,244,122,189, 42, 58, 58, 90,213,187,119,111, + 85,141,183,254,134,234,249, 59,172,148,226,246,163,213, 31,147,149, 82,220,126,103,211,228, 3, 7, 14, 92, 72, 77, 77,253,197, +204,204,108, 89, 35, 57,157,172,173,173, 3, 45, 44, 44, 46, 89, 89, 89,173,180,176,176,200, 41, 47, 47, 39,197,197,197,228,229, +203,151,228,198,141, 27,228,222,189,123,196,194,194, 34,171,174,122,246, 51, 97,221, 47,222, 52,159, 24, 15,172, 35,186,157, 43, + 8, 0, 34,223,182,156, 20,124, 23, 66, 30,205, 26, 68,122,243,153,119,223,227,124, 66, 34,145,252,112,250,244,105, 99,114,114, + 50,137,136,136, 32,231,207,159, 39, 11, 23, 46, 36, 45,237,237,180, 93,184,140,188,158, 60,214,165,247, 9, 88,170,213,106, 99, + 20, 10, 69,140, 74,165,138,105,213,170, 85, 76,167, 78,157,194,187,116,233,178,245,228,201,147,139,214,175, 95, 63,178,159, 41, +239,101,105,228, 73, 66, 62, 31, 66,200,252, 30,228,213,204,222,164,175, 9,235, 73,157,156,182,182, 89, 85,209,218,213,106, 53, +137,138,138, 34,215,174, 93, 35, 82, 43, 43,133,159, 9,115,118,119, 30,122,117, 55,131,164,177,245,236, 35,102, 28,188,255,221, +215,134,178, 11,135,201,207,211,134,232,123, 75, 24,187,107,148, 59, 78, 8,201, 25, 59,118,236,107, 66, 72,206,169, 83,167, 50, + 9, 33, 57, 99,198,140,121, 77, 8,201, 1,112,172, 54,206,119,130,147, 30,120, 43,178,230, 7, 7, 7,199, 16, 66, 98,130,131, +131, 99,128,202, 32,170,189,196,140, 67, 15,246,110, 54,106,207, 31, 34, 39,103, 12, 51,244, 18, 51, 14,213, 90, 79, 9,235,151, +216, 3,219,136,238,210, 17,114,122,225, 36, 67, 15,169,217, 77, 15, 15,143,205,139, 22, 45, 10,191,119,239,222, 83,131,193,240, + 60, 37, 37,229,249,174, 93,187,158,119,237,218,245,182,165,165,101, 28,151,203,157,215,208, 53,250,139, 64,115,210,156, 52, 39, +205, 73,227, 93, 3, 83, 61,219,126,217,184,113,163,144, 16,178, 36, 32, 32, 0, 27, 54,108, 24,215,166, 77,155, 9, 14, 14, 14, +214, 0,144,157,157, 93,250,236,217, 51, 69, 64, 64, 0, 2, 3, 3,177,105,211,166,173,168,244,101,249,191, 68,238,153, 51,103, + 28, 23, 44, 88, 32, 91,191,126,189,113,198,140, 25, 94, 0,158, 21, 20, 20,180,156, 52,105,210,124, 22,139, 21,224,226,226,226, +157,147,147,147, 95, 86, 86,118, 4,192, 94, 52, 48,103, 90, 23,120, 12, 24, 58, 54,179,195, 37, 6, 12, 53,126, 30, 18, 24, 24, + 56,126,204,152, 49,229,219,182,109,211, 43, 20,138,115,141,164,203,204,207,207, 95, 83,245,143,133,133,133,244,201,147, 39,243, +108,108,108, 24, 41, 41, 41,208,106,181, 72, 78, 78, 54,162,114,106,170, 86,168,244,100,199,247,167,174,120, 46,153,236,111, 86, +154,240, 24, 28, 38, 19, 21,108, 46,114,239, 95,194,129,168, 4,133,186, 28, 59,223,167,157,114,185,252,155,133, 11, 23, 78, 90, +182,108, 25,223,197,197,133,186,123,247, 46, 78,156, 56,161,149,201,100,131, 1,220,252, 45,244, 83,211, 96, 52, 26,193,229,114, + 1, 0,203,151, 47, 7,131,193, 96,203,100, 50, 46, 69, 81, 60,138,162, 4, 20, 69, 49, 43, 82,159,195,168, 40, 70, 94,177, 28, +153,121,242,122,249, 12, 70,227,137, 7, 15, 30, 44,110,223,190, 61,227,209,163, 71,200,207,207, 71,114,114, 50, 49, 16,114, 44, +170,204, 80,233,148,168,109,124,253, 4, 22,150,163,218,153,243, 24,220,131,129,240,211, 49,152,123,140, 24,139,202, 88, 90, 0, +112,128,162, 40, 14,128,194, 86,173, 90,245,121,241,226,133, 73,171, 86,173,202, 18, 18, 18, 46, 80, 20,229, 0,224, 80,109,156, + 38, 38, 38, 5, 0, 10, 78,157, 58, 5, 0,179, 80,121,242, 58, 4, 5, 5,229, 68, 69, 69, 33, 56, 56, 56, 15,192,110, 0, 16, +153, 91,142,240, 22,115, 40,238, 79,193,232,170, 5, 99,167,145,212,106,117, 21,217,216,246,109, 35,100,128,189,255, 75,124, 32, +245,100,112,245,229,109, 67, 66, 66,162, 84, 42,149,246,248,241,227,186,233,211,167, 51,147,146,146, 30, 2,184, 5,224, 20,222, +250, 88,210,160, 65,131, 6,141,255, 42,222,181, 96, 53,232,163,245,174,106,221, 0,224,251,196,196,196,234,164,210,137,137,137, + 49, 0,246,160, 50, 26,252,240, 38, 40,222,213,111, 45, 90,123,223,179, 49,239,114,242,125,125,125, 77, 94,188,120,193, 65,237, + 73, 28,169,247,224,252, 3,106,203,117,232,225,225,177,189,162,162, 34,124,207,158, 61, 39,153, 76,230,164, 63,161,246, 93,220, +221,221,139,143, 30, 61,106,140,136,136, 32,171, 87,175, 54,216,217,217, 21,227,143, 62, 90,191,227,244,227, 50,195,150,122, 57, + 40,162,167,244, 32,175, 22,141, 32,183, 38,247, 38,179, 29, 68, 10, 63, 62,243,196,159,124, 43,113, 23,139,197, 7, 76, 76, 76, + 20,102,102,102, 87, 0,116,251, 51,215,200,210,210,242,176, 84, 42,189, 82,243, 99,107,107, 27,110,109,109,253,173,149,149,213, +106,137, 68, 50,199,149,207,221,182,168,165,189, 38,110, 84, 43, 18,217,221,154, 76,182,226,190, 59,117,248,110, 61,237, 92, 93, + 93, 11, 67, 67, 67,141,191,252,242, 11, 89,177, 98,133,177, 89,179,102, 10,212,227,215, 86,175, 69, 75,194, 60, 17, 54,166,139, + 49,111,152, 3,217,224,101,106,236, 99,206,172,107,133,226,228,183, 2,120, 90, 67,156,110,110,110,123, 8, 33, 7,215,174, 93, +123, 16,191,229, 2, 29, 16, 18, 18, 18, 68, 8, 9, 10, 9, 9, 9, 2, 48, 8, 0,252,196,140,208, 35, 35, 59, 26,178,135,218, +147,175,189, 68, 6, 63, 49, 35,180, 86, 75,166, 5,235,204,217,153,195,140, 57, 51,187,147, 64,119,161,161,139, 5,239, 42,151, +203, 93,132, 74,139,115, 39, 0, 92,250,173,153,230,164, 57,105, 78,218,162,245, 63, 39,188, 26, 5,169,133,133,197,129, 22, 45, + 90,156,116,113,113, 57, 41, 18,137,182,162,210,105,190,169, 23,194,117,221,186,117, 10,177, 88,220,238, 47,188,184, 54, 0, 28, +240,199,196,185,127, 89,135, 89, 99,135, 5, 73,203,198, 61, 89, 99,135, 5, 53,126,238,228,229,229,245, 53, 42,163,121,255,217, + 78,232, 98, 97, 97,177,203,194,194, 34,235,173,111,150, 75, 99, 56, 59, 50,153,147,250,240,153,119,187,113, 25,185,125,248,172, + 59, 31, 48,153, 19,255,166, 3,176,190,197, 22,117,113, 58, 90, 89, 89,109,179,176,176,200,182,178,178,218,213, 68,145,245, 59, +206,118, 38,176,235, 43, 97,158,233,102, 74,169,251,138,153,167, 58, 10,234, 94,212,209,132,182,251, 6, 7, 7,127, 68, 8,249, +200,222,222, 62,160,134,240,247, 14, 12, 12,244, 39,132,248, 87, 69,128,239, 36,128, 77,111, 9,243,104,119, 51, 74,222, 91,194, + 60,218, 73, 0,155,186,234,217, 71,194, 60,209,221,140,146,251,153, 49,142, 58,243,208,140,190,153,211,156, 52, 39,205, 73, 11, +173,127,134,208,162, 59, 12,205, 73,115,210,156, 52, 39,205, 73,115,210,156,180,208,170, 93, 88,213,252, 84,207,176,177,232,115, + 67,131, 6, 13, 26, 52,104,208,160,241,167, 80,103,192, 82,170, 30, 85,218, 20,199,246,247, 81,182,145, 52, 39,205, 73,115,210, +156, 52, 39,205, 73,115,254,235, 56, 27,226,254,191, 94, 88,247,183, 6,109, 86,165, 57,105, 78,154,147,230,164, 57,105, 78,154, +243, 95, 11, 6,125, 10,104,208,160, 65,131, 6, 13, 26, 52,254, 20,124,223,126,191, 27,184,180,118, 31, 45, 86,167,181,121,122, +189,222, 6, 0, 88, 44,150,172,226,225,106,187,250,216,217, 64, 63,125,101,250, 29,176,128, 89,122,224, 74, 45,156, 87,244,122, +189,249, 91,206,226,138,135,171, 7,213,203,217,105,237,165,154,229,245, 15, 87, 15,120,183, 12, 1,152,236, 78,107,179,223,169, +171,125, 99,207, 10,133,223,197,196,250,175,213,243,239,194,249,111, 6,187,243,218,188,138,138,202,126,196,102,179,100,229, 15, +234,239, 71,156,206,107,179,107,150,175,120,176,218,182, 62, 78,129, 9,175,208,205,193,122,107,125,156, 41,217, 5, 75,212,165, + 26,203,250, 56,155, 58, 54,157,236,236,250, 25,222,142, 77, 38, 48, 43, 43, 39,231,202,255, 88, 95,234, 8, 96, 53, 0,179, 26, +191,197, 1,248,148,238,149, 52,104,208,248,155, 9,173, 88, 84,230, 57,252,225,173,216,250,161, 78,161,165,215,235,109, 98, 78, + 7, 65,173, 5,250, 77, 93,107,227, 58,106,239, 31, 18, 37,235, 53,197, 92,121,252,113,111,102,133,194,220,154, 85,110,150,157, +157, 77, 1, 0, 69, 81, 63, 2,112,174,133,211, 60,230,116, 16, 74,117,128,223,132, 16,115,103,192, 44,159,195,249,204, 68, 40, +236, 83, 86, 86,214, 6, 0, 76, 76, 76,226,203,212,234,235,214,229,229, 91,222, 45, 95, 87,203,106,214,181,239,148,181, 54, 94, +163,246, 46, 52, 24,141,220, 55,143,246,248,105, 10,146, 88,108,189,118,247, 74,224, 66, 80, 45,162,170, 14,190,223,142,251,225, + 10, 75, 54,208,151,203,231,183,147,152,155,247, 52, 18,210,202,104, 52, 82, 6,189,254,185,162,164,228,150, 81,175,127,162,215, +169, 45, 99,206,125,109,172,175,158,239,182,229, 67,128,117, 26, 8, 16,138, 68,125,152,108,118, 55, 0, 48, 84, 84,220, 85,171, + 84,215, 71, 3, 97,141,105,123, 99,207,207,251,150,255,183,161,162, 66,111,147,122, 41, 8,218, 10,192,119,236,215, 54, 62,147, +126, 58, 10, 0, 58,217, 19, 91, 85,210,185,206, 0, 32,116,243,127,192,147,250,230, 1, 0, 43, 61,199,230,101,196, 42,104, 43, +128, 86,254, 33, 54, 13,113, 78, 15, 60, 97,185,108,246, 24, 30, 0, 92, 62,245,109,203,107,225,223, 15, 1,128,190, 99,230, 94, + 24, 56,118,193, 75, 0,216,244, 67,184,229,177,175,199,213,203,217,184,177, 89,194, 41, 73,138,112,215, 41,114, 36, 78, 66,150, + 52, 41, 41,137, 1, 0,246,246,246,141, 26,155,142,128, 56, 7,152,207, 96, 50,123,186,185,187,251, 2, 32, 41,175, 94,197, 26, +244,250,219,118,192,238,191,184, 47, 45, 36,228,247,193, 89, 41,138,162, 59, 36, 13, 26, 52,254,110, 56,255, 86, 92,157,255,195, +203,108, 93,123,168,181,192,205,100,160, 87, 23, 31,204,158, 52, 84, 84,115, 91,216,222, 16,231,164, 71,103,189,246,255,180,133, +225,227,227,131,212,212,212, 70,213,162, 84, 7,220, 72, 2, 32,127, 97, 90, 44, 20,190,218,182,121,179,217,128, 1, 3, 88,246, +246,246,160, 40, 10,185,185,185, 93, 34, 35, 35, 59, 46, 94,188,248, 19,200, 95, 20,151,234,160,188,145,212, 48,111, 85, 93,219, +180,108,134,213, 11,198,137, 1, 96,229,212,221, 29, 31, 37,230, 89,188,122,245,170,223, 23, 95,124, 81,200,188,126,253,123, 43, +224, 96, 30,144,217,152,122, 30,254,229, 1, 95,156,243,179,235,228, 5, 11, 78,185,187,187,139, 92, 92, 92, 40, 83, 83, 83, 48, +153, 76, 20, 23, 23, 59, 63,123,246,108,200,195,135, 15,213,145, 55,127,228, 70, 63, 28,145, 34,227,119,214, 52,170,237,101,217, +252,203,166,166,241, 83, 70,143,118, 28, 55,110, 28,223,205,205, 13, 0,240,234,213, 43,143,176,176,176, 9,167, 78,157, 10, 68, + 89,182,190, 84, 7, 77, 67,109,175,230, 4,192, 7,186, 73,108,108, 38, 51,217,236, 54,122,189,222,225,173,181,225,141,161,162, + 34, 94, 46,147, 29,121,183, 60,141, 63, 66, 91, 1,188,200, 1,250,247,244,197,148, 49,253,133, 0,240,197,248,117, 93,210, 95, + 39,115,116, 58, 29, 90,122,182,234,254,213,215, 91, 47,129,193, 64,104,120,100,117,249,198,112,198,189, 72, 69,208, 87,219,144, +253, 52,172,139,161, 36,185,143, 82, 81,194, 4, 0, 51,177,120, 76,216,241,159,175,219,123, 7,220, 79, 46, 40,111, 20,103,125, + 99,243,226,241, 93,118, 89,207,174,183,254,238,242, 1,182,179,179, 51,158, 62,125,218,180,177, 89,146,104,106,180,179,123,190, +229,243,207,165,126,126,126, 16,137, 68, 96,177, 88,208,235,245,253,111,223,190,221, 63, 40, 40,104, 46, 74, 18,213,141, 29,155, +141,192, 22,138,162,250, 76,159,189,208,110,232,200, 0,140, 25,220,157,238,136, 52,104,208,248,187,161,202,122, 85,115,229,225, + 15,245, 10, 45, 22,139, 37, 27, 48,109,189, 77,207,206,109,241,232,201,203,146,180,140, 28, 85,213,182,162,248,176,150, 35,187, + 59,180,142,138,186, 9,173, 86,139,187,119,239,226,201,147, 39,120,253,250, 53,230,204,153,163,125, 59,117, 88, 27,103,177,223, +132, 16,115,148, 36,137, 60,184,137,205, 35, 19, 18,152, 26,141, 6, 81, 81, 81, 40, 46, 46, 6,151,203,133,163,163, 35, 6, 14, + 28,200, 74, 72, 72,176,232, 55, 96,176,216,111,240,196, 84,136, 61, 84, 44, 22,171,184,174, 60, 34, 44, 22, 75,214,111,234, 90, +155,214, 30,205,240, 42, 45,187,100,245,215,251, 85, 70, 35, 97,165,188, 78, 47,191,121,243, 38,124,125,125,113,229,202, 21,203, +162,162,162, 47,119,239,222,189,154,189,241,187, 29, 21,186,194,165,168,155,175,216,111, 66,136,185,165,236,164,203,181,139,103, + 56,241,241,241,156, 61,123,246,160,176,176, 16, 92, 46, 23, 18,137, 4, 82,169, 20, 45, 91,182,164, 86,174, 92, 41,242,247,143, +199,127,102, 5,184,148,187,206, 76,172,171,158,213,109, 87,165, 11,172, 20,151,221,194,207,159,103,244,232,209,227,119,175,237, + 45, 90,180,192,160, 65,131,248,147, 39, 79,118, 27, 55, 97,146,209,111,216,244, 87, 16,185,148, 54,200,169,206, 52,177, 44,189, +103,223,127,194,132,115, 33, 33, 33, 18,169, 84, 10,161, 80, 8, 0, 40, 41, 41,113, 76, 75, 75,235, 18, 24, 24, 56,246, 65,220, +113,150,159,127,102, 54,132, 78,101,245,157,207,127, 43,216,108,150,172,202,138,100, 42, 52, 41,206,204,202, 83, 3,128, 78,167, +131, 78,167,131, 86,171,197,188,185,115,152,179,198,118,114,119,233,185,240,241,235, 55,121, 69,173, 34,239, 91, 84,237, 91,209, + 0, 39,171,244,181, 92,158,113,117, 86,208,231,159, 75,109,109,127,155, 17, 12, 61,124,152, 89, 84, 84,212, 63, 40, 40,168, 53, + 17,244,150,183,242, 15,145,212,199, 89,223,216,148,191, 60,223,252,171, 5,131,218,237,253, 58, 2, 6,131, 1,247,238,221, 67, + 84, 84, 20,182,110,221, 74, 46, 92,184, 80, 98, 38, 20,206, 66,189, 99, 51,209,180,135, 93,174,235,198,141,167, 40, 30,143,135, +179,103,207, 34, 33, 33, 1, 12, 6, 3, 62, 62, 62,152, 50,101, 10,250,247,239, 47,157, 61,123, 14,241, 27, 60, 62, 5, 98, 79, +229,159,236, 75, 12, 0, 11, 87, 4,109,180,155, 58,115, 62, 54,125,181,146, 22, 90, 52,104,208,248, 59, 91,179,234, 12,241,128, +136,136, 8,242,246,211, 11, 0, 8,192,104, 49,106,239,177,147,209,198,243, 45, 70,237, 61, 70, 0, 6, 1, 24,102, 64,179,246, +237,219, 87,200,229,114,242,240,225, 67, 50,111,222, 60,245,142, 29, 59,174,159, 63,127, 62, 76, 95, 94,190,207,222,206,238, 27, + 82,135,131, 61, 1, 24, 46,128, 88, 32, 16,228,103,100,100,144, 95,127,253,149, 4, 7, 7,147, 35, 71,142,144, 11, 23, 46,144, +200,200, 72,114,225,194, 5,114,236,216, 49, 18, 23, 23, 71, 94,190,124, 73,132, 66, 97,190, 11, 32,174,135,147, 73, 0,102,203, + 81,123,150,158,122, 84, 17,226, 57,106,239, 98, 2, 48,205, 1,175,246,237,219, 27,194,194,194, 72,104,104, 40,249,233,167,159, + 72, 92, 92, 28, 41, 40, 40, 32, 44,158, 48,191,106,191,186,234, 73, 0,134,131,131, 67,190, 92, 46, 39, 78, 78, 78,132,203,229, + 18, 91, 91, 91,210,178,101, 75,210,165, 75, 23, 50,100,200, 16, 50,105,210, 36,242,229,151, 95, 18,185, 92, 78,248,124,126, 94, +213,126,117,113,250, 2, 38, 66,161, 48, 35, 38, 38,134,212,133,178,178, 50, 82, 80, 80, 64, 46, 93,186, 68,132, 66, 97,134, 47, + 96, 82, 31,167, 9,208,193,219,219, 59,191,160,160,128,148,151,151,147,140,140, 12,242,236,217, 51,146,144,144, 64, 50, 50, 50, + 72, 89, 89, 89, 53,247,203,151, 47,137,171,171,107,190, 9,208,129,208,139, 32,234,236, 75,239,126,156,109,109,135, 72,165,210, +178, 83,167, 78,145, 55,111,222,144, 67,135, 14, 17, 6,176,238,221,114,245,113,114,129,129, 61,122,244, 48,220,187,119,143, 60, +126,252,152, 44, 95,190,156, 12, 26, 52,136, 12, 30, 60,152, 4, 5, 5,145,172,172, 44,146,149,149, 69,134, 12, 25, 98,224, 2, + 3, 27,234,159,181,141, 77, 49,224,236,239,239, 95, 86, 94, 94, 78, 82, 82, 82, 72,155, 54,109,178,152,192,100, 33,208,186, 23, +192,107,168,127, 58, 0,230,118,118,118, 57,247,238,221, 35,225,225,225,196,197,197, 37,159, 9, 76, 55, 3, 90,152, 1, 45,152, +192,244, 22, 45, 90,228,223,187,119,143, 20, 22, 22, 18,103,103,231, 28, 7,192,252, 79,244, 37, 6,128, 3, 43,130, 54,146,196, + 44, 53, 89, 17,180,145, 0,200, 32,132, 16,212,226,227, 73,131, 6,141,127, 62,222,213, 34,255, 20, 84,223, 36,253,253,253, 41, + 0, 55,234, 43, 92,198,100,174,223,180,105, 19, 75,163,209, 96,255,254,253,202, 15,199,142, 61,217,171,103,207,148,230, 46, 46, +114,138,193,104, 48,219,112, 62,143,183,104,211,166, 77, 18,157, 78,135,232,232,104,116,236,216, 17, 82,169, 20, 34,145, 8, 34, +145, 8, 54, 54, 54,240,244,244,132, 76, 38,131,169,169, 41,150, 45, 91, 38,206,231,241, 22, 53,196,107, 52, 18, 22, 0, 24,140, + 70, 46, 7,152,237,250,193, 7,209,129,129,129, 12, 75, 75, 75, 88, 88, 88, 64, 36, 18, 33, 33, 33, 1, 58,157, 14, 2, 19, 65, +163,130,180, 50, 24, 12,134, 72, 36,194,181,107,215,176,112,225, 66,116,235,214, 13, 18,137, 4,166,166,166,104,211,166, 13, 6, + 14, 28,136, 89,179,102, 33, 37, 37, 5, 84, 35,156, 74,158,179, 88,243,103,205,154,101,227,235,235, 91,235,118,141, 70, 3,185, + 92,142,252,252,124, 56, 58, 58, 34, 32, 32,192,230, 57,139, 53,191, 46, 62, 75, 64,234,232,225,113,238,225,195,135, 86, 66,161, + 16,161,161,161, 56,115,230, 12, 46, 94,188,136, 95,127,253, 21, 17, 17, 17, 56,123,246, 44,242,243,243, 1, 0, 30, 30, 30, 56, +113,226,132,149,200,198, 38,194, 18,144,210, 67,186,113, 72,207,203,187,220, 38, 55,215,106,242,164, 73,183, 84, 42, 21, 38, 79, +158,140,245, 27, 54,172,100, 3,139, 27,179,191, 39, 32,182,176,179, 59,184,113,227, 70, 70,110,110, 46, 70,143, 30, 93,176,101, +195,134,143, 99, 47, 93,114,139,185,120,209,109,125, 72,200,199,189,122,245, 42,200,202,202,194,225,195,135, 25,182,206,206, 7, + 61, 1,113, 83,235,169, 4, 22,110,223,190,157,175,209,104, 48, 96,192,128, 20, 99,124,188,167, 30,248, 89, 5, 36,220, 0,202, + 27,218, 63, 7,152,191,108,217, 50, 41,143,199,195,103,159,125, 86, 80,154,158,222, 86, 15,252, 84, 2,164,149, 0,105,122,224, + 39,101,106,106,219,169, 83,167, 22,240,120, 60,108,219,182, 77,154,243, 91,210,237,198,162, 35,128,115, 0,110, 2,200,158, 62, +123,225,116,223, 78, 93,113,120,223,110,124, 29,242,197, 65, 0, 31, 82, 20,117, 4,192, 82,186,231,209,160,241,239, 68, 99,180, +200,255, 40,234, 76,185,195,170,169, 36, 1,244,174,143,197,220,210,178, 99,219,182,109, 17, 21, 21, 5,111,111,239,135, 18,137, + 68,207,225,241,192,102,179, 65,140, 13,234, 44,152, 8,133,253,250,247,239,207,186,127,255, 62, 92, 93, 93, 97, 98, 98, 2, 54, +155,253,187, 15,135,195,129,157,157, 29, 20, 10, 5,250,245,235,199,222,185,115,103, 63,104,181, 95, 53,248, 64, 76,122, 38,202, +191,191,113,210,143,135, 14,182,240,243,243, 67, 73,137, 2, 70,163, 17, 2,129, 0, 58,157, 14, 44, 22,171,114, 10,168,130, 40, + 26,115,198, 12, 6,131,129,201,100,194,213,213, 21,235,215,175,135, 70,163, 1,135,195, 1, 0, 40, 20, 10,200,229,114, 60,123, +246, 12,105,105,105,120,251, 22, 94, 47, 76,197,226,161,227,198,141,171, 53,225,175, 86,171, 69, 73, 73, 9, 74, 74, 74, 32,151, +203,161,209,104,208,181,107, 87,238,249,136,136,161, 40, 44,220, 82,235, 62,124,254,216,195,135, 15,219,112,185, 92,148,149,149, + 65,169, 84, 34, 51, 51, 19,233,233,233, 26,153, 76,166, 55, 53, 53,101,184,184,184, 48,120, 60, 30,111,212,168, 81,148, 66,161, + 0, 69, 81,240,247,247,183, 60, 26, 26, 58, 14, 58,221, 86,122, 72, 55, 14,151, 1,109, 7,157,110,120,231, 78,157,174, 61,124, +244,200,119,209,162, 69,136,139,139,219, 40, 56,126,252,102, 41,240,164,190,125, 83,128,249,223,212, 16, 48, 36, 61,221,187, 28, +200,175, 81, 36,205, 37, 53,245,226,212,169, 83,159,198,197,197, 89,109,219,182, 77,250,225,232,209,243, 1,172,107, 74, 29, 77, +197,226, 15,236,236,236,112,225,194, 5,100,188,126,253,133, 30, 40,107,210, 27, 23,147,217,195,207,207, 15,103,207,158, 69, 86, +122,250, 23,250,223,215,177,242, 69, 9,200,103,165,164,124,113,240,224,193, 3, 51,102,204, 0,147,197,234, 1,125,147, 38, 14, +255,224,248, 62, 99,206, 34, 28,252, 97,231, 65, 0, 51, 1, 24, 1, 60,164,123, 28, 13, 26,255,110,171, 86, 67, 90,228,111, 36, +182,126,104,178, 69,203,198,198,198, 65, 36, 18, 33, 59, 59, 27,173,188,188,100, 60, 30, 15, 92, 54, 27,124, 46,183, 81, 53, 40, + 45, 45,245,182,183,183, 71, 73, 73, 9,172,172,172,192,225,112,170, 63, 92, 46,183,250,111, 83, 83, 83, 48, 24, 12, 56, 59, 59, +163,180,180,212,187, 65,222,188,103, 54,199,119,206,157,119,239,230,133, 22,163, 71,143,129,185,185, 5,156,156, 28, 97, 99, 99, + 3, 19, 19, 19, 56, 57, 57,193,205,205,141,108,217,178, 5, 2, 27,159, 70,221,200,107,138, 39, 22,139, 5,131,193,128,188,188, + 60, 36, 38, 38, 34, 46, 46, 14,247,238,221,195,227,199,143,161, 84, 42,209, 8,157,133,210,178,178,118, 44, 22,171, 86,145, 37, +151,203, 33,151,203,171,133, 86,126,126, 62,210,210,210,160, 82,171,219,215, 35,122,212,246,224,254, 0, 0, 32, 0, 73, 68, 65, + 84,199,180,109,219,150, 9, 0, 38, 38, 38,104,223,190, 61,246,238,221,171,255,229,204,153,241,173,239,221,179,112,186,116, 73, +242,227,158, 61,227, 3, 2, 2, 12,247,239,223,135, 66,161,192,139, 23, 47, 96,109,109,205,226,242,249,227,232,225,220, 52,196, + 0,106, 43,165,114,112,183,110,221, 82, 75, 74, 74,176,121,243,102, 6,219,212,244,135,144, 58,166,248,170,193,100,118,247,243, +243,195,185,115,231,144,157,158,190, 60,189, 22, 1,147, 14,228,103,164,164, 44, 63,120,240, 32, 6, 14, 28, 8,138,197,106,178, +163, 82,151, 46, 93,218, 26,141, 70, 60,125,250, 20, 18,224, 65, 83,247,119,115,119,247,173,178,252, 10,129, 91,117,149, 19, 2, +183, 98, 99, 99, 97, 98, 98,130, 86,173, 91,119,104,226, 97,182, 80, 20,149, 51, 99,206, 34,132, 95,188, 3, 0, 56,248,195,206, +188, 26, 34,139, 6, 13, 26,180, 69,235,239,106,209,170, 18, 86, 53, 63,248,157,208,106,164,248, 0, 0,176,217,108,112,121, 60, +112,185,220, 74,129,196,227, 53,154,131,162, 40,240,249,252,106, 97, 85, 83, 96,213,252, 91, 32, 16, 52, 74,192, 0, 64,113,242, +197,158, 51, 63,158,193,229,241,120,208,233,180, 32,132,128,199,227, 67, 34,145,192,213,213, 21, 10,133, 2,221,186,247,210,102, +202, 57, 17,150,173, 70,197,189,207,217,211,235,245, 80,171,213, 40, 46, 46, 70, 81, 81, 17, 20, 10, 5,202,202,202, 26,189, 20, +221,104, 52, 50, 51, 51, 51,241,243,207, 63,163,176,176, 16, 64,165,163,117,149,184,170,250, 78, 77, 77, 69,104,104, 40, 94,191, +126,221,164,235,211,179,103, 79, 68, 68, 68, 48,123,247,235,183,239,138,139, 75,246, 21, 23,151,236,222,253,250,237, 59,119,238, + 28,211,193,193, 1,105,105,105,136,142,142, 70,113,113, 49, 8, 33,244,250,249,247,192, 43,160,184,180,168,104,198,202,149, 43, +137, 72, 36,194,230,111,190,105,183, 14,152,216, 88, 1, 35,174, 71,192,136,255,156,128, 1, 33, 4, 70,163, 17, 6,131,225,189, +218, 70, 81, 20,197,102,179,155, 26, 90,161, 41,133,171, 29,223,151,125,185, 30,191,158, 13,171,250, 61,137, 22, 89, 52,104,208, +248, 7,160, 78, 71,120, 86, 13, 5, 89,253, 93, 23,242,242,242,222,168,213,234, 22, 46, 46, 46,200,202,202,178,113,118,118, 78, +231,178,217,224,112,185,160, 24, 13,107, 2,129, 64,240, 52, 59, 59,187,187,131,131, 3,244,122,125,181,168,122,119,234,176,202, + 74,243,248,241, 99, 8, 4,130,167,208,212, 27, 57, 1, 6, 93,113,179, 14, 29, 58, 84, 91,134, 36, 18, 9, 36, 18, 49,120, 60, + 62, 86,173, 90,101,220,182,101,203,110,231,190, 33, 37, 31, 45, 94, 73, 86,174,219,247,151,158,217,198, 62,152, 4, 2,193, 83, + 39, 39,167,174, 98,177, 24,225,225,225, 72, 75, 75, 67,113,113, 49, 74, 75, 75,161,213,106, 81, 90, 90, 10,157, 78, 7, 62,159, +143,214,173, 91,195,204,204, 12,145,145,145, 79,161,213,214, 46, 46, 11, 11,195,159, 62,125,218,181, 83,167, 78,213, 22,149, 62, +125,250, 80,125,250,244,177,170,182,162,149,150,162,160,160, 0, 15, 31, 62, 68,100,100, 36, 40,138, 66, 82, 82,146, 65, 91, 86, +118,140, 30, 19,239, 7, 13,112,151,121,240,224,129, 79, 62,249,228,227,238,221,187,195, 0, 12, 1, 16,250,255, 81,192, 0, 0, +238,221,187,247,204, 96, 48,116,111,217,178, 37,228, 64,103, 0,103,155, 36, 34,147,147, 99,245,122,125,191,118,237,218, 33,252, +228,201,158, 0,210,106, 43,167, 6,122,250,250,250,162,172,172, 12, 47,158, 63,143,105,130,200,218,183, 34,104,227,244,169, 51, +231,227,240,190,221, 56,248,195,206,204, 3,123,119, 56,161, 17,254, 99, 52,104,208,248, 87, 89,179, 26,212, 34,255,163,152, 93, +151,248, 98, 53,133,165,164,184, 56, 38, 54, 54,182, 69,135, 14, 29,176,111,223,190, 78,221,186,118,125,195,225,114,245, 92, 14, + 7,140, 70, 60, 72,202,212,234,171, 87,175, 94,237, 60,106,212, 40,214,253,251,247, 33,149, 74,171,133, 86,213, 55,139,197, 2, + 33, 4, 2,129, 0,167, 79,159, 46, 47, 83,171,175, 54,104, 45, 50, 24, 13,140,183, 66,143, 16, 2,185, 92, 14, 14,135,131,173, + 91,183, 97,215,150, 45,147, 12, 64,152,135,208,250,115, 0,252,255,111, 15,232,210,210,107,191,254,250,107,199,192,192, 64,182, +163,163, 35,228,114, 57,138,139,139, 81, 88, 88, 8,133, 66, 1,133, 66,129,226,226, 98,200,229,114,240,249,124,196,197,197, 85, +104, 74, 75,175,213,197,199,211,104, 78, 77,155, 54,109, 89,108,108,172, 29,139,197, 66, 69, 69, 5,140, 70, 35,140, 70, 35,202, +203,203,145,156,156,140,248,248,120, 36, 36, 36,160,168,168, 8,108, 54, 27, 76, 38, 19,143, 31, 63, 46, 22, 86, 84,156,212,209, + 99,250,189,193, 6,194,111,223,190,253,241,148, 41, 83, 96,239,232,216, 11, 89, 89,141, 18, 48,103,234, 17, 48, 37,239, 39, 96, +126, 19, 64, 74,229,163,212,212,212,238,189,123,247,134,157,163,227,198,214, 89, 89, 87,158, 55,193, 79,203,160,215,223,186,125, +251,118,191,169, 83,167, 98,223,190,125, 27,173, 83, 83, 47,230,191, 51,205,105, 13, 88, 55,119,115,219, 56,125,250,116, 92,190, +124, 25, 6,189,254, 86, 61,148, 53, 35,190, 55,155, 62,123,161,211, 59,142,239,123, 41,138, 90, 0, 96, 51,221,163,104,208,160, +241, 79,182,104, 53,105,234,208,196, 96, 88,177,116,233,210, 10, 6,131,129, 49, 99,198,152,158, 61,119, 46,224,241,147, 39,174, + 50,153, 76, 98, 48, 24, 26,228,178,214,106,119, 44, 93,186, 84,174,211,233,224,233,233,137,162,162, 34, 24, 12, 6,176, 88, 44, +176, 88, 44, 80, 20, 5, 6,131, 1,145, 72,132,216,216, 88, 28, 56,112, 64, 97,173,213,238,104,240, 33, 97, 48, 60, 13, 13, 13, + 5,147,201, 36,124, 62, 31, 20, 69,129,197, 98, 97,219,182,109,178, 93, 64, 56, 0, 48, 25, 12, 29, 0, 48, 24, 84, 99,189,119, + 27,156,183,228,114,185, 48, 86, 46, 2,104,176,172,185, 86,187,125,211,166, 77,202, 23, 47, 94, 64,173, 86, 87, 91,223, 84, 42, + 85,181,115,189, 92, 46, 7, 69, 81, 80,171,213, 56,119,238,156,210, 92,171,221, 94, 23, 95, 33,144,155,149,148, 52,162, 83,167, + 78,133,169,169,169, 40, 41, 41,193,211,167, 79, 17, 25, 25,137, 19, 39, 78,224,242,229,203, 72, 78, 78,134, 94,175,135,131,131, + 3, 8, 33, 56,115,230, 76,137, 94,169, 28, 82, 8,228,210, 99,162,110, 52,147, 74,251,217,218,216,100, 88, 91, 89,101, 53,147, + 74,251,189,187, 93, 12,188,124,249,242, 37,244,122, 61, 92, 93, 93, 45,234,243,211, 34,122,253,237,219,183,111, 99,234,212,169, +112,106,209, 98,131, 11, 96,253,110, 25, 23,192,218,197,205,109, 67,149,128, 33,122,253,237,166,214,217, 20,216,249,249,231,159, +151,113, 56, 28, 28, 63,126,220,181,194,221, 61,129, 5, 76, 20, 1, 94,189, 1, 78, 67,251,219, 1,187,191,252,242,203, 92,138, +162,112,228,200, 17, 43,177,155,219, 51, 22, 48, 77, 12, 52, 19, 3,205, 88,192, 52,177,155,219,179,227,199,143, 91,233,245,122, + 44, 94,188, 56,215, 14,216, 93, 15,229, 66, 66,200,112, 66,136, 31, 33,196,233,192,222, 29,248,245,108, 88,149,200,154,137, 74, +167,247, 41, 0,158,209, 61,142, 6, 13, 26,255,100,212,106,134, 98,117, 90,155, 7, 16,155, 94, 93,124,240,232, 73, 98,137,149, +185,217,165,170,109, 69,241, 97, 45,251,122,155,249,124,247,221,119, 96,179,217,200,204,204,196,243,231,207, 97,102,102,134, 73, +147, 38,105,203,148,202, 17, 53,114, 29,246, 7, 16,249,150,179, 50,159, 90, 73,146,200,141, 21,215,226,226,175, 17, 76,177, 88, + 12,149, 74, 5, 6,131, 1, 62,159, 15,129, 64, 0, 19, 19, 19, 68, 71, 71, 99,216,240,145,134,124,129,223,111, 1, 75,127,203, +167, 86,205, 89, 21,107,168, 51, 32,136, 5, 62,179,177,183, 95,186,122,245,106,147, 65,131, 6,129,195,225,192,177,153, 71,174, +235,224,205, 59, 25, 12, 74,159, 85,168, 88,229,214,204, 94,252, 60, 41, 13, 0, 37,171,120,184,218,190, 70,174,195, 63,212,211, + 89,119,211,245,244, 79, 91,204,218,183,175,244, 71,151,203,229,200,203,203,131, 76, 38,131, 92, 46,135, 90,173, 6, 0, 68, 68, + 68,224,215,168, 4, 69,153, 99, 64, 74, 93,245,252,173,237,137,166,246,229, 15,154, 31, 13,253,137,105,109,109,141,188,188, 60, +228,231,231, 67, 46,151,163,172,172, 12, 6,131, 1, 69, 69, 69,216,127,240, 39, 67,161,200,239,117,117, 64,200,250, 56,213,153, + 38, 22,170, 59, 14,190,173, 93,200,199, 31,127,108,106,102,102, 6,163,209,136,226,226, 98,100,100,100, 32, 53, 53, 21, 81, 81, + 81,106,153, 92, 7,181,213,128,172,234,128,165,181,112,254,133,248,219,113,214,140, 91,101,111,103,151,157,158,158,110, 99, 48, + 24,224,224,224,160,151, 23, 21,109,224, 2,151, 77,129, 28, 0,164, 0, 88,189,125,231,206, 25, 35, 71,142,196, 7, 31,124,144, +153,155,151,215,188,182,190, 68, 0,166, 39, 32, 46,117,116,140,127,248,240,161, 52, 35, 35, 3, 83,167, 78, 45, 72,127,245,106, +121,149,191, 86, 9,208,211,197,205,109,195,241,227,199,173, 90,180,104, 1,111,111,239, 92,126, 70, 70,155, 68,160,164,142,254, + 89,231,216,148,191, 60,223,124,238,232,182, 31,204,155, 55, 15,122,189, 30, 81, 81, 81,120,240,224, 1,210,211,211,113,231,206, + 29,185,153, 80, 56,190, 70,174,195, 90,251,231, 16, 15,181,235,145, 35,161, 20,135,195,193,193,131, 7, 17, 27, 27, 11, 0,240, +245,245,197,244,233,211,161,215,235, 49,121,242, 20,114, 62,209, 36,165,190,254, 9,160, 45,128,111, 80, 41,242, 62, 32,132,240, + 41,138,202, 6,224,132,166,249,100,209,253,147,230,164, 57,255, 61,156,255, 72, 52,152,235,112,237,247, 16,255, 62,205,199,172, +236,176,189, 33,172, 30, 61,253,188, 66,130,131, 24,157, 58,117,130,147,147, 19,124,125,125,145,145,145,193,147, 72, 36, 13,229, + 83, 83,249, 13,158,152,234,227,227, 35, 89,190,124,185,120,224,192,129,108, 39, 39, 39, 16, 66, 16, 27, 27,139,240,240,240,242, +125,251,246, 41, 74,109,135,203, 99,174,255,172,106, 76, 62,181, 7, 64, 41,128, 53,142,217,217, 63,204,159, 59, 55,168,125,135, + 14, 31, 7, 7, 7, 51, 68, 2, 19,246,250, 85, 51,249, 0,176,246,219, 19,226,145, 1,147,176,221, 29,232, 53,177,246, 60,114, + 53,235,153,145, 53, 43,125,232,232,126,238,159, 45,152, 97, 24, 55,110,156,208,204,204, 12, 78, 78, 78, 48, 55, 55, 71, 74, 74, + 10,178,178,178,200, 47,191,252,162,186,247,248, 37,251,204,229, 71,233,124,177, 93, 99,242, 18, 42,253, 6,125,248,122,232,208, +161,230,211,166, 77, 51,237,216,177, 35,155,199,227,129,199,227, 33, 47, 47, 15,201,201,201,229,191,252,242,139,170,212,102, 72, +113,204,245,227,202, 70,230, 58, 44,243,155, 16,146,124,235, 74,240,226,248,167, 79,167, 24,129,118,229,229,229, 14, 6,131,129, + 98, 48, 24, 57, 70,163,241,105,185, 82,121, 64,235, 27,188,141,206,117,216, 56, 24, 12, 6,142,193, 96,128, 92, 46,199,149, 43, + 87, 88,175, 94,189, 90,253,228,201,147,213,217,217,217,168,168,168,192,216,177, 99,225,235,235,139,235,215,175, 35, 63, 47,239, +151,250,184, 18,129, 18, 94, 86,214,244, 89,179,102, 93, 8, 13, 13,101, 60,121,242,196,234,224,193,131,251,107, 19, 48, 83,166, + 76, 49,230,101,100, 76,215, 2, 37,245,244,207,250,198,102,193,197,227,187,158,140, 26, 19,208, 58, 56,112, 53,187, 91,183,110, +176,178,178, 66,207,158, 61, 81, 94, 94, 46,105,213,170, 85, 67, 99, 83,233, 55,120,124, 74,187,118,237,132,219,182,109,147,206, +152, 49, 3, 11, 22, 44, 0, 0,148,149,149,225,242,229,203, 88,188,120,113,110, 6,171,179,186,161,254,249,214, 82, 85, 37,192, +110, 2,240, 3,144, 2,218,241,157, 6, 13, 26,255, 76, 84, 37,149,182, 67,101, 98,233,243,168,124, 57,111, 56,215,225,173, 7, +207, 80, 51,205, 71, 37,236,158,235,157,167,189,154,179,116,131, 55,179, 66, 97,206,166, 52,102, 73, 47, 95, 82, 13,229, 60,172, +206,167, 38,246, 80, 89,166, 30,235,180,126,237,218, 69,219,183,111,239, 87, 21,194, 65, 32, 16, 60, 45, 83,171,175, 90,107,181, + 59, 74,197, 30, 87,155,154,155, 47, 11,200, 3, 48,215, 60, 38,102,167,255,200,177,155,248, 22,174,236,149,235,246,105,152, 12, +134, 46, 57, 59, 31,219,221, 1, 97, 35, 22, 72,150,234,128,120,185,157, 62,207, 50, 32,241,203,207, 63,255,108,237,154, 53,157, + 68, 34, 81,175,114,189,222,195,104, 52, 2, 70, 99, 82,169, 90,125,147,148,151, 63,212,250, 6,110,225,139,237, 72,163,243, 18, + 74, 90, 41, 45, 94,135,117, 58,116,224,192,194,147, 39, 79,254,161,237,150, 90,237,206, 82, 73,171,200,198,180,189,102, 25, 13, +112, 23, 50,217,221,250, 76,151,116,174,195, 70,190,125, 24,141,179,205,205,205, 15,247,235,215,143,223,191,127,127, 12, 27, 54, + 12,221,186,117,131,209,104, 4, 33, 4, 74,165, 18, 39, 78,156,192,166, 77,155,146,154, 3,107, 26,226,211, 2, 87,121,191,254, + 58,164, 93,187,118, 7,235, 19, 48,111, 69, 86,131, 62,137,245,143, 77, 94,146, 94, 60, 34,109,194,252,245,238, 58, 69,142,196, + 82,160,151,198, 63,123,202,104,252,216,244, 84, 26, 98, 79,116, 30, 59,122,244,124, 38,139,213,243,237, 10, 72,242,226,249,243, +152,170,164,210,240,157,126,165,137,125,169, 42,118, 29,237,248, 78,131, 6,141,127,186,208, 26,134, 74,127,173,234,148, 60,117, +230, 58,172,178,250,176, 88, 44, 89,202,153, 57,147,234, 99,103, 3,253,222, 90,178,208, 96,174,195,183,127,167, 1, 74,104,181, + 95,253, 46, 24,105,141,213,133,236,119,202, 55, 37, 44, 98, 49,144, 8,189,214, 31,178,231,192,185,185,149,124,157,214,126, 81, +179, 77,117, 62,100,127,119, 92, 78,145, 6,184, 5,149,234, 22, 84,170, 90,157,118,217, 44, 78, 81, 67,245,124,183,237, 25,128, +226,207,182,253, 93,206, 6,197,195,159, 56,159,255, 54,188, 41, 40, 56, 3, 64,228, 24, 17, 97,123, 49, 34, 98,220,103, 75,150, +140,181,179,183,119,179,178,178, 50, 55, 53, 53,101,220,191,127, 63, 85,175,209,236,108, 15, 28,122,107, 77,109, 16, 90,224,170, +103, 70, 70,155, 15, 71,143,158, 79,177, 88, 61,106, 10, 24,162,215,223,113, 5,118,215,103,201,122,223,177,233,196,179,235,247, +214,146, 5, 38, 48,171, 49,125, 35,171,178, 30,235,160,215,175, 67, 92, 92, 45,125,190,201,125,105, 45, 69, 81, 74,208,142,239, + 52,104,208,248,231,162, 42,223,225,249,255,235, 3,247,167, 57,105,206,127, 16, 39, 19,149,171,232,232,243, 73,115,210,156, 52, + 39,205, 73,163, 81, 96,209,167,128, 6,141, 70,195,128,223,166,193,104,208,160, 65,131, 6,141, 42, 84,249,102,213,196, 15, 64, +165,235, 78, 93,170,180, 41,171, 9,222, 71,217, 70,210,156, 52, 39,205, 73,115,210,156, 52, 39,205,249,175,227,108,136,251,239, +184,154,177,202, 39,171,218, 55,235,255, 10,180, 89,149,230,164, 57,105, 78,154,147,230,164, 57,105,206,127, 58,236,222,138,172, +154, 31, 0, 77, 12, 88, 74,131, 6, 13, 26,255, 84, 4, 7,131, 65, 8, 40, 66,130, 25,132,156,100, 18, 18,192, 36, 4,127, 42, + 21, 72, 64, 64,237,193,108,255, 51,201,220,148, 62,227, 52,104,252,163,144,131, 58,146, 74,211, 62, 90,255,127,225, 44,149, 74, +247, 2,160,114,115,115,103, 3,200,160, 79,201,255, 30, 44, 44, 44,250,233,245,122, 40, 20,138,171,255,196,246,181,118,195,104, +194, 64,171,234, 31, 8, 50, 94, 36,227,112,109,101, 91,185, 99, 42,168,223, 98,113, 81, 70,188,120,254, 10,167,155,112, 56,198, +144,254, 78,187, 1,224, 66,100,230,124,252,119,226,106,181,180,182,182,190,196, 98,177, 88, 6,131, 97,174, 76, 38,139,168, 91, + 8, 5, 48, 1,128, 77,174,175,144,231,218, 44,255,244, 19,138, 93,170, 61, 32,215,150,169, 75,152,108,230,107, 30, 91,122,123, +206, 12,198,133, 98, 85,215,231,181,237, 31, 22, 22, 86,103, 22,239, 54,238, 24,194, 48,180, 30,238,219, 54, 53,229,155, 29,157, +182,247,114,181, 98,167,102, 62, 22,109,220, 83,178,151, 43,113, 25, 62,117, 28, 21,193, 18, 80, 83, 14, 28, 40, 84,209,163,172, +241, 88, 15, 88,148, 3,222,108, 30,207,201,160,215,219, 82, 0, 97,178, 88,121, 21, 90,109, 38, 7,136, 91, 1,200,255,233,156, + 28, 30,207,209,160,215,219, 2,192,255, 98, 61,105,252, 30,117, 10, 45,145, 72, 20,205, 96, 48, 28,107, 38,195,173,202, 39, 88, +245, 91,205,109, 20, 69,193, 96, 48,100, 21, 23, 23,119,108,194,241,205, 0,140, 3, 80,181, 68,253, 40,128, 19,120,127,135, 99, + 51, 14,135,179, 84, 40, 20,246, 45, 43, 43,107, 3, 0, 38, 38, 38,241,106,181,250, 90,121,121,249, 55,239,201,203, 2,240,161, + 72, 36,234,195, 96, 48,250, 16, 66, 40, 66,200,117,149, 74,117, 13,192, 73, 0,239, 19, 41,193,196,198,198,102,157,133,133,197, +196, 21, 43, 86, 20, 90, 90, 90,122, 46, 94,188,248, 81, 81, 81,209,207, 5, 5, 5,171,208,132, 28,117,255,101,184, 73,165,210, +163,108, 54,155,153,153,153,217, 7, 0,156,156,156,174,235,116, 58,131, 76, 38,155, 4,224, 85, 19,249,132, 0,186,136, 68,162, +142, 34,145,200,207, 96, 48,180,122,155,159,241,133, 74,165,138, 42, 47, 47,143, 6,112, 31,128,250,127,104,140,152,178, 88,172, +208,183,125,221, 3,128,242,159,118, 19, 32, 12,180,122, 30,159,224, 89, 45,188,218,120,213, 93,152,130,115, 45,101, 27, 45,180, +250,246,178, 27, 62, 98,196, 0, 6, 0,232, 42, 46, 12,191,118, 51,231,236, 95,220,156,150, 99,198,140,185, 27, 26, 26,106,174, +213,106, 49,123,246,236,163,145,145,145,187, 21, 10,197,138,122,111, 28, 34,243,197,155,183, 93, 22, 80, 20, 3, 0,108,140, 70, +131,205,155, 55,175, 60,158, 63,187, 59, 56, 62,254,222,250,178,132,107,247,141, 20,123, 78, 57,122, 38, 52,166, 18,173, 92,225, + 63,124,236,232, 97,107,214, 4, 99,226,248,137,205,226,227, 53, 38, 14,102, 41,220,162, 50,161,187,165,181,205,136, 53,107,195, +168,219,183,206,140, 8, 61, 24,114,109,198, 12,203,190,180,216,106, 20,168,181, 44, 86, 23,177,187,187,223,248, 51,103, 32,114, +114, 98,177,120, 60, 6, 0,232,181, 90, 39, 85,102,166,221,241, 17, 35, 58, 7,191,124,121, 35, 24,120, 64,115,254,127,225,164, +209, 20,161,197, 96, 48, 28,223,188,121, 99, 35, 20, 10, 43,111,198,132,192, 96, 48,192, 96, 48, 84, 39, 47, 38,132, 84,127,235, +245,122,120,121,121, 53,234,141, 22, 64, 95, 0, 31,245,238,221, 59,224,155,111,190, 97,123,123,123, 87,165, 12,233,185,114,229, +202,111, 99, 99, 99, 79, 1, 56,132,202,224,141,141,125,227, 29, 36, 20, 10,143,108,222,188,217,108,192,128, 1, 44,123,123,123, + 80, 20,133,220,220,220, 46,145,145,145, 29, 23, 47, 94, 60, 87,173, 86, 79, 6,112,169, 9,231,167,173,169,169,105,216,232,209, +163, 29,123,245,234,197,111,221,186, 53, 12, 6, 3, 30, 63,126, 60, 35, 58, 58,122,194,169, 83,167,130,148, 74,101, 0, 26,159, +175,141, 18,137, 68,211,204,204,204,214, 5, 6, 6, 90, 76,158, 60,153,251,236,217,179, 98, 87, 87, 87,234,246,237,219,214, 39, + 78,156,152,187, 97,195,134, 15, 21, 10,197, 42,149, 74,245, 19, 26,145, 67,209,212,212, 52,154,193, 96, 56, 54, 70, 8, 3,104, +138, 24,110,223,188,121,243, 19,183,110,221,106,158,150,150,102, 24, 53,106,212, 97, 0,184,118,237,154,119, 69, 69, 5, 53,112, +224,192, 11, 89, 89, 89,227, 0, 60,110,100,219,125, 44, 44, 44,206, 78,156, 56,209,194,205,205, 77,208,188,121,115, 74, 40, 20, +130,201,100,162,164,164,196,254,217,179,103,253, 31, 60,120, 80, 22, 25, 25, 89,164,213,106, 71, 0,136,107,194,117,234,102, 99, + 99, 51,133,205,102,183,213,235,245, 14, 0,192, 98,177,222, 84, 84, 84, 60,147,201,100,161, 0,238,190,239, 0,177,181,181,221, +181,110,221, 58, 43,153, 76, 70, 54,108,216,176, 75,169, 84, 78,251,167,222, 12,142,254,124, 18,209,143, 30, 0,149,105,115,168, + 90,250, 31, 5,128,243,233,167, 75,208,241,131,206,152, 52,241,195, 6, 57,135,246,115,220,204,230,114, 44, 53, 26,205,221,146, + 82,237, 73,161,128, 63,110,226, 4,255, 36, 0,184,112,241,198,184, 78,157,204,175,139, 5,188, 15,249,124,126,183, 10, 93,121, +225,175, 87,179, 62,111,138,168,114,112,112,184,100,110,110, 46, 40, 42, 42,202,205,207,207,255,126,248,240,225,107, 15, 29, 58, +100,158,154,154,138,204,204, 76, 44, 90,180, 72,148,149,149, 53, 63, 46, 46,238,158, 78,167,171,211,178,165, 84, 22,237, 88,185, +124,100,160, 88,108,197, 20, 10,204, 96, 42,182,128,171, 91, 59,116,233, 54, 28, 67,134,125,140,228,164,216, 46,135, 14,174,137, +125,243, 38,242,107,145, 69,139,181,114,121,243, 58,239, 75,173, 91,162,215,136,209,149, 34, 43, 48, 48, 24, 47, 19, 18,148,105, +175, 25,255, 57,127,134, 37, 24,210,207,139,167,215,229,166,221,190,117,166,121,143,158,163, 0,160, 99,232,193,144,107,255,153, +100,222,111,215,209, 98, 37,253, 72,170,251,222,185,134,205,158, 54,104,219, 54, 27,223,185,115, 57,170,215,175,203, 83,246,236, + 41,205,139,138, 50,176,120, 60,226, 52,120, 48,101,221,167, 15,127,238,139, 23,156, 59, 27, 54,248,177, 67, 66, 92, 87,149,151, + 31,161, 57,255, 79, 57,255,237,168,114,130,175,185,250,240,135,122,133, 22, 69, 81, 16, 10,133, 56,126,252, 56,216,108, 54, 88, + 44, 22,216,108,118,157,127, 59, 59, 59, 55,166, 34, 99,164, 82,233,183,187,119,239,182, 29, 52,104, 16,248,124,126,245, 6, 38, +147,137, 1, 3, 6,160,127,255,254,236,236,236,236, 9,199,143, 31,159,176,126,253,250, 60,185, 92,190, 0,111, 19, 67,215,131, + 62,158,158,158,225,151, 47, 95, 54,209,104, 52,136,138,138, 66,113,113, 49,184, 92, 46, 28, 29, 29, 49,112,224, 64, 86, 66, 66, +130,197,128, 1, 3,194, 95,190,124,233, 15,224,122, 35,234,218,209,198,198,230,230,201,147, 39,249,237,218,181,163,146,147,147, +225,235,235, 11, 0, 40, 41, 41,193,168, 81,163,248,147, 39, 79,118,155, 48, 97,194,125,153, 76,214, 11, 64,116, 3,124, 29,164, + 82,233, 79,163, 71,143,182, 95,191,126,189,153,169,169, 41,210,210,210,114,164, 82,169, 71,213,249,158, 48, 97, 2,119,248,240, +225,118,155, 54,109,218, 17, 22, 22,246,185, 76, 38,155, 6, 32,166, 94,213,250, 86, 16, 11, 4, 2,228,229,229,225,232,209,163, +152, 63,127, 62,152, 76, 38,100, 50, 25, 78,156, 56,129,255,252,231, 63, 85,130,166, 81, 98, 88, 32, 16,244,119,119,119,223,127, +237,218, 53, 71,137, 68, 2,123,123,123,198,151, 95,126,217,214,213,213,213,164, 89,179,102,204,156,156, 28,132,135,135,187, 78, +153, 50,229,108, 70, 70,198, 12,173, 86,219,224,148,154,173,173,237,129,243,231,207, 59,199,199,199, 99,207,158, 61, 40, 42, 42, + 2,151,203,133, 68, 34,129, 84, 42,133,135,135, 7,181,124,249,114,193,240,225,195, 5, 11, 22, 44, 56,160,211,233,218, 55,226, + 26,181,179,177,177,217,219,167, 79, 31,215,144,144, 16,137, 84, 42, 69,213,139, 65, 73, 73,137, 99, 90, 90, 90,151,192,192,192, +128,232,232,232, 84,153, 76, 54, 7,192,147, 38, 14,156,246,173, 91,183,246, 31, 53,106, 20, 51, 39, 39, 7,161,161,161,254, 74, +165,178,125, 19,196,229,223, 10,209,143, 30, 96,246,188, 69, 42,123, 39, 39,206,229, 75,251,199,132,157,110,249, 72, 98, 82,153, +144, 90, 94,134,242,128,209, 47, 63, 24, 56,232, 99,206,208, 97,163, 84, 63,124,183, 67,212, 24,161,197,230,114, 44,143, 30,217, +154,113,235,118,116,219, 43,145, 15, 6,143, 25, 49,130,112, 56, 18, 87, 0,248,124,241,167,236,240,115,231, 14, 14,232,223, 57, +187,103,143,142, 25,147, 38, 47,113,110, 66,117, 91,182,108,217,242, 70,108,108,172, 45,143,199, 67, 81, 81,145,229, 15, 63,252, +176,181, 71,143, 30,140,148,148, 20, 36, 36, 36,224,245,235,215, 40, 41, 41,193,128, 1, 3, 68, 49, 49, 49,223, 3,168, 83,104, +149, 51,250,174,179,111, 86,177,211,210, 68,216,188,220,160,176, 33, 21, 57,173,175,156,191,226,115, 44,180,204,215,214,206,203, +227,163,233, 65, 88,179,246, 20,251,231,163, 27, 3,175, 70, 30, 3, 24,205,235,206, 8, 64,208,109,229,170, 21, 80, 40,181,152, + 60,113, 22,166, 76,156,101, 73,160,179, 35, 6,141, 80, 87, 86, 44, 49,229,188,136,216,189,111,235,104, 0,142, 53,196,214, 85, + 90,108,213,141, 53, 44, 86,103,255,111,191,181,110, 59,115, 38,239, 73, 72,136,186, 32, 42,170,204,125,232,208, 98,223, 79, 62, +209, 2,128,242,245,107,206,203,160, 32,129,181,159,159, 73,215,165, 75,205, 13, 58,157,116,205,154, 53,157, 2, 43,147,151, 55, +137,211,121,220, 56, 67,224,193,131, 31, 68, 45, 89,210,155,170,168, 96, 14,238,218,245,241,134,208,208, 55,127,134,243,175,172, +103,246,205,155,218, 34, 87, 87,248,142, 26, 85,232,108, 99,163,253, 43,219,254,103,234, 73,163, 26, 85,190, 90,179,107,190,161, + 34, 34, 34,162, 23,128, 27, 0, 66,252,253,253,131, 1, 64, 44, 22,231,201,229,114,155,240,240,240, 6, 69, 22,155,205,134,157, +157, 29, 60, 60, 60,100, 50,153,204,182,158, 10,100, 26,141, 70, 71, 66, 72,181,245,165, 46,104,181, 90, 36, 37, 37,193,199,199, + 39, 11,149,137,104,235, 52,234, 8, 4,130,148,132,132, 4,171,231,207,159, 35, 58, 58, 26,174,174,174, 48, 55, 55, 7,155,205, + 70, 69, 69, 5, 20, 10, 5, 60, 61, 61,193,227,241,208,161, 67,135, 2,181, 90,237,218,192, 20, 16, 79, 40, 20, 38,221,188,121, +211,201,215,215, 23, 15, 31, 62,132,147,147, 19,164, 82, 41, 0,224,245,235,215,184,125,251, 54,134, 14, 29,138,216,216, 88,140, + 29, 59, 54, 83,173, 86,123, 0,208,214, 69,104, 97, 97,145,115,237,218,181, 44,111,111,111,141, 90,173,102,228,229,229,177,163, +162,162,244, 74,165, 82, 84, 82, 82,194,150,203,229,108,133, 66,193, 82,171,213,108, 6,131,193, 41, 43, 43, 99, 95,189,122,149, + 89, 94, 94, 94,111,128,204,170,235,116,238,220, 57,120,123,123, 35, 60, 60, 28,159,125,246, 25,238,220,185, 3, 39, 39, 39,156, + 60,121, 18, 75,151, 46, 69, 98, 98, 34,172,172,172,208,186,117,235,134,174, 17,220,220,220,146,159, 62,125,234,198,225,112,170, +242, 58, 86,229,203, 67,126,126, 62, 94,189,122,133, 55,111,222,192,221,221, 29, 19, 39, 78,124,245,230,205, 27,247,134,122,158, +131,131, 67,126,124,124,188,149,143,143, 15,242,242,242, 32,145, 72, 32, 22,139, 33,145, 72,170,255,118,117,117,197,146, 37, 75, + 32,149, 74,101, 26,141,198,182, 33, 17,228,237,237,125,233,234,213,171, 86,102,102,102,200,205,205,133, 66,161, 0,139,197,130, + 64, 32,128,149,149, 85,181,144, 79, 74, 74,194,176, 97,195, 10, 82, 82, 82, 6, 53, 65, 36, 49,108,109,109, 19,226,226,226, 60, + 8, 33,200,200,200, 64, 98, 98, 34,230,205,155,151,164,209,104,188,240, 15,202,217, 87,195,239,138, 51,109,250,108,206,232,145, +221,116, 47,226, 35, 40,158, 49, 17,237,219,154,149, 0,192,227,103, 10,177,150,225,137, 86,109,252,201,233,179,119,185, 63, 29, +250,129, 13, 35,108, 65, 33,241, 69, 18,190,170,139,123, 96, 31,187,153,159,126, 58,163,109,239, 30,189, 24, 74,181,218,230,251, +239,183,117, 72, 73,121, 97, 3, 0,174,174,173,100,115,231, 46,142, 49, 21, 10,101, 55,110,223, 52,110,223,126,224,217,229,235, + 57,251, 26, 81,101, 87, 15, 15,143,123,231,206,157,179,178,177,177,129, 88, 44,134, 90,173, 70,121,121, 57,158, 63,127,174, 57, +126,252,120,133,153,153,153,105,110,110, 46,228,114, 57, 40,138,194,185,115,231, 50, 0,184,188, 75, 84,229,163, 5, 0,243,134, +180, 98,183,238,235, 97,206,225,233, 77, 76,216, 47,237, 64, 25,120, 20, 17,217, 94,184,244,216,231,194,149,135,147, 70,143,249, +204,186,103,175,209, 8, 92, 29, 80,145,157,157,225, 91,142,158, 9,181,249,104,121,185,163,239,168,177,163, 63, 92,179, 38, 24, +193,129, 33,136, 56,119,166, 68, 36,100,104,205, 36,108,177, 95,151,238,154, 37,243, 71,102,170, 84,217, 78,107, 54, 29,159, 56, +108,228, 18,199, 30, 61, 71,225,246,173, 51, 8, 61, 24, 18, 77,153, 16,122, 26,241, 29, 4, 3,230, 18, 87,215, 57, 11,147,146, + 56, 79,130,131, 85,250,236,236,226,142,139, 23, 23,212, 86, 54,235,202, 21, 33,215,222,222,204,124,196, 8,139, 29, 46, 46,164, + 66, 38,219, 91,155,143, 81,109,156,145, 34,145,228,216,133, 11,253, 8,155,221,107,217, 23, 95,152,248,251,251, 67,161, 80,224, +212,169, 83,216,187,103,143,214,206,206,238,169,253,179,103,177,109, 21,138,213,141,229,236,184,120,113,129,193, 96,160, 62, 92, +186,116, 64,252,235,215,125,115,101,178,102, 0, 96,103, 97,145,217,209,213, 53,250, 64, 68, 68,226,174,230,205,141,141,173,231, +143, 23, 47,218,134,165,165,205,180,176,176, 48,201,147,201, 88, 60, 46,183,176, 75,235,214, 39,191, 91,181,234,134, 62, 46,142, +195,119,116, 52, 19,251,251, 55,185,237, 29, 23, 47, 46, 40, 82, 42, 89, 11,215,174,237,158,158,151,215, 76,165,213,186,203,149, + 74,169,161,162,130, 97, 38, 16, 20,182,240,244,148,149, 69, 69,229,180, 40, 45, 93,180, 15,144,253,183,174,117,109, 90,228,111, +132,119,227,104,253, 33,215,225, 13,127,127,255, 63,172,174, 33,132, 52,202,154,197,102,179,127, 55, 77, 85, 15, 56, 20, 69, 33, + 38, 38, 6,150,150,150,144, 74,165,224,241,126,159,124, 48, 63, 63, 31,119,238,220,193,139, 23, 47,208,174, 93,187,170,105,140, +186, 21, 17,143,247,233,166, 77,155, 36, 58,157, 14,209,209,209,232,216,177, 35,120, 60, 30, 56, 28,206,239, 68,160, 76, 38, 67, +155, 54,109,176,108,217, 50,241,250,245,235, 63,213,106,181,117,190,145,178, 88,172, 5,179,102,205,178,169,178, 96,101,102,102, +162, 67,135, 14,213,219,173,173,173,241,248,241, 99,116,236,216, 17,142,142,142, 8, 8, 8,176, 9, 13, 13, 93,160,215,235,191, +169,139,147,203,229, 50,188,189,189, 63, 0, 0,161, 80, 8, 6,131,241,210,204,204,204,218,214,214, 86,104,102,102,246,135, 54, + 30, 60,120, 80,206, 96, 48, 42, 26, 84, 3, 12, 6,114,115,115,209,182,109, 91,148,148, 84,102,112, 81,171,213,112,119,119,135, + 66,161,168, 22,173,246,246,246, 40, 43,171,223,245,203,199,199, 39,216,203,203,107,160, 80, 40,228,177,217,108, 60,121,242, 4, +190,190,190, 56,126,252, 56,156,157,157, 33, 16, 8,144,148,148, 4,111,111,111,220,188,121, 19,214,214,214,104,211,166, 13,207, +198,198,230, 86, 81, 81,209,245,244,244,244,224,122,234,201, 16,137, 68,184,121,243, 38, 14, 28, 56,128,215,175, 95, 35, 59, 59, + 27,166,166,166,104,223,190, 61, 90,183,110,141,110,221,186, 33, 41, 41, 9, 84,195,157, 73,234,225,225, 17,241,240,225, 67, 43, + 66, 8, 66, 67, 67,161, 82,169,160,211,233,192, 96, 48,192,231,243, 97,110,110,142,190,125,251,194,218,218, 26, 30, 30, 30, 56, +113,226,132,213,144, 33, 67,126,149,201,100,237, 1,228, 54,116, 94,205,205,205, 23, 5, 5, 5, 57,217,216,216, 32, 45, 45, 13, + 37, 37, 37,176,181,181, 69,239,222,189, 29, 34, 35, 35, 23, 85, 84, 84,108,251,167, 60,200,106, 56,190, 83,151, 47,237, 31,227, +209,162,216,187,157,167,192, 41, 60,194,214,233,120,132,172, 13, 0,180,109,101, 27, 63,198, 95,144,249, 36, 62, 34,243,242,165, + 51,209, 47, 94, 34, 28,141,152,218, 46, 41,213,158,188, 18,249, 96,176,111,187, 14,198, 77, 27,151, 14,155, 63,111, 38,207,198, +246, 99,228,101,156, 65,228,181, 24,231,165,159,205,178,254,102,203,143, 23,174, 68, 62, 96,148,148,106, 87, 55,206,148,229,188, +235,208,119,221,172,148, 5, 97, 72, 78,224,194,196,180, 45, 92, 93, 91, 66,161, 80,128,207,231,243, 39, 78,156,104, 88,177, 98, + 69,169,153,153,153,128,162, 40, 92,191,126, 93, 6, 96, 80, 67,188, 26, 27,115, 98, 40,175,208, 19, 46,211, 72, 40,211, 50,202, + 80,196,125,246, 60, 21, 3,251,247,201,235,209,185,237,250, 21,107,182,172,244,104,233,107, 61, 99,102, 8,123,109,240,164, 61, +160,208,179, 54,158,132,100, 92,163, 78,158, 54, 1, 48,108,205, 87,193, 72, 73, 73, 50,159,253,145, 60,132,197, 51,177,247,114, +233,110,186,231,192,245,193,238,238,205,155, 45, 89, 16,112,126,235,183, 91,135,213,180,108, 29, 58, 24,116, 22, 64,191,198,156, +219,127, 17,124,166, 68, 68, 64,149,145, 81, 81,116,235,150,166,223,183,223, 22, 56, 13, 26,180, 77, 87, 94,110, 85,117,171, 96, + 80, 20,168, 42,215, 9,163,145, 98, 45, 91,198, 32, 44, 22, 42,204,205, 63, 66,113,113,203,134, 56, 63,203,201, 25, 51,105,230, +204, 97,103, 47, 94, 68,243,230,205,171,159,103, 18,137, 4, 75,151, 46,197,226,197,139,121,143, 31, 63,238, 20, 22, 22,214,233, +155,205,155,109, 1,140,105, 76, 61, 47,223,191,111,254,201,154, 53,171,218,117,236,232,124,248,232, 81,158,155,155, 27, 0,224, +213,171, 87, 30, 27, 55,108,112,105,235,237,157,183,254,211, 79, 15,197,175, 88,209, 6,192,173,250, 56,115,163,162,116, 97,105, +105, 51,175, 93,191, 46,105,219,182, 45, 0, 32, 49, 49,209,102,199,142, 29,179,218, 4, 4, 76, 94, 51,119,238,106,127,141, 70, +110,150,159,207,243,223,181,139,117,236,195, 15, 27,228,172,170, 39, 0,244,158, 49,227,211,158,125,250,180, 30, 51,115,166,133, +179,179, 51, 37, 18,137, 80, 94, 94,142,236,236,108,243,248,248,120,183, 8,165, 82,113,250,254,253, 80, 24, 12, 3,254,139,215, +186, 86, 45,242, 55,179,100,253, 81, 83,188,253,238, 29, 17, 17, 65, 0,244,246,247,247,191, 89,245, 0, 55, 24, 12,141, 18, 89, + 44, 22, 11, 20, 69, 53, 86,108,129, 16,130,130,130, 2, 20, 20, 20, 84, 79, 29,201,100, 50, 92,187,118, 13, 73, 73, 73, 96,179, +217,224,112, 56, 40, 47,111, 56, 7,173, 80, 40,236,223,191,127,127,214,253,251,247,225,234,234, 10, 19, 19,147,234,122, 85,125, + 56, 28, 14,236,236,236,160, 80, 40,208,175, 95, 63,246,206,157, 59,251,215, 39,180,196, 98,241,208,113,227,198,113,171,254, 87, +169, 84, 96, 50,153,213,162, 69,165, 82,161,168,168, 8,114,185, 28, 26,141, 6, 93,187,118,229, 70, 68, 68, 12, 45, 44, 44,252, +166, 49,237, 47, 45, 45, 85,201,100, 50, 73,207,158, 61,205, 15, 29, 58,148,216,181,107, 87,207,223,245,180, 27, 55, 52, 26,141, +134,205, 96, 48, 26,149, 71,239,200,145, 35,213,231,254,205,155, 55,216,179,103, 79,245,182,164,164, 36,236,220,185, 19,132, 16, + 16, 66,234,189, 70, 94, 94, 94, 67, 66, 67, 67, 59, 30, 62,124,184,152,201,100, 34, 49, 49, 17, 71,143, 30, 5, 33, 4,214,214, +214, 40, 45, 45, 69, 94, 94, 30,174, 95,191, 14,189, 94, 15,145, 72, 4, 7, 7, 7,254,130, 5, 11,122,132,132,132,176,235, 19, + 90, 6,131,193,192,100, 50,225,226,226,130,192,192, 64,104, 52, 26,112, 56,149,250, 82,161, 80, 64, 46,151, 35, 54, 54, 22,105, +105,105, 32,132,212,251,144,225,243,249, 1,135, 15, 31,182,225,114,185, 40, 43, 43,131, 82,169, 68,102,102, 38,210,211,211, 53, + 50,153, 76,111,106,106,202,112,113,113, 97,240,120, 60,222,168, 81,163,168, 42,193,233,239,239,111, 25, 26, 26, 58, 94,167,211, + 53, 36,146,172,165, 82,233,202, 89,179,102,241,107,246,217,220,220, 92,140, 25, 51, 70,112,247,238,221, 21, 10,133,226, 40,128, +252,127,216, 3,141,132,157,110,249, 40, 58, 50,209, 59, 60,194,214, 41, 61,203,208,125,233,231, 91, 88, 0,240,195,222,175,187, +135, 71,188,185,227,213, 60, 47, 51,236,116,203, 71,230,230, 47, 26, 18, 2,140,190,189,236,134, 11, 5,252,113, 99, 70,140, 32, +223,127,191,173,195,252,121, 51,121, 46, 45,151, 86, 90, 56,217, 54,232,167,255,138, 42, 45,123,197,255,254,251,109, 29,198,252, + 63,246,174, 59, 60,170,162,253,158,187,189,164, 87, 82, 72, 40, 17, 18, 82,104, 6, 80,122, 73,104, 9,130, 52, 81,170, 40,197, +134, 10, 34,136, 2, 98, 9,160, 40,160, 32, 77, 5, 12,210,107,168,161, 4, 68,138, 16, 66, 73,135,144,190,155,108,178, 73,118, +147,237,183,253,254, 32,201, 23, 98,146,221, 4,252,126,234,119,207,243,236,179,187,119,231,158,157,185, 51,119,238,153,119,222, +121,231,133,113,183,178,179,115, 54, 15, 30, 32,217,123,254,162,242, 88, 83, 22, 67, 79, 55,169,175, 92,162,131,111, 64, 8,130, +130,237,144,116, 59, 29, 7,246, 93, 69,112,232,115, 48,153, 76,160, 40,202,110,212,168, 81,250, 61,123,246, 24, 51, 50, 50, 42, + 13,203,227, 38,192, 0, 0, 32, 0, 73, 68, 65, 84, 6,195, 0, 0, 25,214, 10, 95, 80,144,194, 4,121, 61,103, 17,201, 36, 84, +165, 70,164, 95,244,241,254, 9,207,246, 26, 26,238,226,237, 43,244,176, 99,142,141,136,236,185,235,167,109, 75,223,251,120,217, + 46,244,232, 57,244,249,212,244,223, 66, 0,220,109, 80,188,102, 33,142,119,224, 16,149,117,255,126, 84,110, 78, 78, 65, 96, 43, + 47,243,131, 10,150,156,183,104,107,100,191, 1,227,187, 60, 19,220, 95,156,154,114,145, 88,186,240,165, 95, 87,172,254,230,229, + 26,177,117, 46,254,215, 1,211,167, 95, 21,111,223,222,184,117,252,127, 13, 34,137,164,181,125,155, 54,130,236,237,219, 13, 1, +163, 70,149, 3,128,217, 98,113,207,206,201,113,146,203,229, 96, 89, 22, 36, 73, 62,230, 67, 92,227, 55, 28, 22, 20,212,202, 22, +206,236, 79, 62,233,178,112,225, 66, 20, 21, 21,129,162, 40, 8,133,194,250,125, 54,116, 58, 29,166, 79,159,142,239,190,250,234, + 57, 91, 56,105,154, 38,230,172, 88,177,228,195, 37, 75,158,153, 61,123, 54,175,110,223,235,234,234,138,253, 7, 14,136, 55,108, +216,208,250,163,239,190,155,254,138, 68,146, 5,147,169, 73,206,210, 14, 29,224, 90, 92, 44,171, 17, 89, 0, 16, 20, 20,132, 77, +155, 54, 73,102,206,156, 41, 30, 53,106,212,154,164,174, 93,215,125,219,183,239,125,183,192, 64, 71,177, 68,210,218, 26,103,205, +245, 4,128, 74,163, 49,236,219,117,235, 92,174, 95,191,142,226,226, 98, 20, 21, 61, 26,143, 18, 4,129, 30, 61,122, 16, 83,166, + 76,113,106,239,231,215, 19, 52,253, 87, 86,247,159,180,200, 63, 8,179, 26, 56,246, 31, 31,173,234, 2, 17,213, 5, 36,234, 60, + 28, 31, 19, 44,214,132, 86, 75, 80, 81, 81,129,138,138, 10,108,219,182, 13, 34,145,168,246,225, 11, 0,102,179,217, 22,209,210, +217,199,199, 7, 26,141, 6,129,129,129,143, 89,178, 68, 34, 17, 4, 2, 1, 68, 34, 17, 36, 18, 9, 76, 38, 19,252,253,253,161, +215,235, 59, 55,197,105, 48, 24,186,185,186,186,214, 62, 96, 77,213,141,213,100, 50,213,230,215,108, 54,163,188,188, 28, 85, 85, + 85,168,172,172,132, 78,167,235,110, 75,121, 25,134,193,189,123,247, 30, 4, 5, 5,117,227,243,249,176,183,183,183,211,233,116, +181,190, 69,101,101,101,216,177, 99,135,110,234,212,169,238, 71,143, 30,181, 42,180, 8,130,192,219,111,191, 13,137, 68, 2,189, + 94,143, 31,126,248, 1,239,188,243, 14, 68, 34, 17, 42, 43, 43,177,105,211, 38,188,255,254,251, 16, 8, 4, 48,155,205, 88,183, +110, 93,163, 92, 41, 41, 41,217,215,174, 93,235,254,236,179,207,186, 28, 58,116,168, 36, 50, 50,210, 99,216,176, 97,144,201,100, + 48, 24, 12, 32, 73, 18,207, 61,247, 28, 58,117,234, 4,149, 74,133,147, 39, 79,150,118,236,216,209,253,250,245,235, 76, 81, 81, + 81,174, 21,113,205,214,177, 24,130,166,105, 20, 23, 23,163,162,162, 2, 37, 37, 37, 80, 40, 20, 40, 40, 40,128, 64, 32,128, 21, +157, 5, 55, 55,183,113, 97, 97, 97,124, 0,144,201,100,232,214,173, 27,150, 44, 89, 66, 25, 12,134,137, 0, 78, 86, 39, 27,177, +117,235,214, 67,151, 47, 95, 22,248,248,248, 32, 45, 45, 13, 30, 30, 30, 2,169, 84,106, 85,104,121,121,121,253,124,236,216, 49, +215, 26,113, 93,115,157,245,250, 71,213, 49,118,236, 88,215,157, 59,119,254, 76, 81,212,200,127,219, 67,205, 89, 6, 81,183, 48, + 71,205,158, 56, 85,232,130, 15,214, 8, 58,133, 61, 26,188,206,154, 13,193,215, 95,205, 15,157, 60,218,241,184,179, 76, 43,178, +198, 51, 34,194,111,195, 11, 47, 68,242, 94,158, 20,157, 41, 18, 57, 7,108,222,242,169,167,103,171,153,117,100,152, 35,220,220, + 29, 17,208, 70, 76,236, 63,158,234,185,104,241,103,166,216,157,223,100,253,186, 59,110,184, 88, 24, 63,244,228,217,252,185,141, +113,103, 60,168, 56,170, 55, 73,131,181,234, 59,132,107,171, 62,232,214, 53, 8,158, 30,229,216,250,243, 30,180,107,223, 3, 38, +147, 9,142,142,142,114,154,166, 45,124, 62, 63,214, 22,145, 5, 0,231,206, 85, 48,161,161, 21,102,126, 37, 67,189,249,206,215, + 47, 70,142,120, 33,100,240,224, 8,230, 76,252, 25, 75,159,238, 22,229,136, 97,221,138, 79,197,111,200, 84, 42, 30,118, 12,237, +220, 23, 41,201, 23,134,179, 44,238, 17, 68,195,214,167,228,251, 56,101,100, 82, 46,236,217, 51,139, 49, 48,183,100,159,127,113, +119, 68, 84,212,180,176,254,253,250, 51,241,103,207,155,197, 40, 77,117,236,219,187,240,205,215, 70, 28,250, 49,118,221,208, 83, + 39,127,238,160,209,230,198,113, 34,171,222, 32,141,162, 90, 9, 36, 18, 94,201,133, 11, 84,231,153, 51, 77, 53,247,163, 92, 46, +199,145, 35, 71, 32, 22,139,107, 95, 34,145,168,246,115,171, 86,173, 64, 84, 47, 35,181,133, 19, 0,148, 74, 37,138,138,138,224, +228,228, 4, 15, 15, 15, 20, 21, 21,225,202,149, 43,200,200,200,128, 80, 40,196,240,225,195,193,107,196,183,185, 62,231,132, 5, + 11, 34,131, 59,119,246,175, 47,178, 0,192, 98,177,160,172,172, 12,163, 71,143,230,157, 60,121,210,235, 84, 94,222, 11, 0, 98, +155,226,236, 30, 21,165, 46,222,191,191,193,255,126,246,217,103,137,223,127,255, 93, 50,124,216,176,247,230,127,241,197,134,239, +118,238,204,167, 41,202,171, 57,101,231,241,120, 60,130, 32,224,231,231,135,178,178, 50, 84, 85, 61,154,193,182,183,183,135,139, +139, 11, 72,146, 4,195,178,194,191,178,174, 27,211, 34,255, 16,108,169, 35,184,182,252,201,162, 85, 93, 40, 0, 24, 88,247,193, +194, 48,140, 77, 34, 75, 40, 20, 90,245,185,178,197,202, 85, 31,182, 8,173,154,188, 74,165,210,218, 27,173,174,192,170,201, 39, +143,199, 3,159,207,183,250, 16,175, 22, 67,252,202,202, 74, 28, 56,112, 0, 3, 6, 12,168,157,150,210,104, 52,168,168,168,128, + 70,163,129,209,104, 68,118,118, 54,206,157, 59,135, 14, 29, 58, 0, 54, 6,127,205,202,202,186,217,174, 93,187,240,154,135,248, +160, 65,131, 90,111,223,190, 93, 49,114,228, 72, 31,150,101,241,241,199, 31,151, 62,247,220,115,238,117, 31,242,214,192,231,243, +113,229,202, 21,116,232,208, 1, 44,203, 66, 36, 18, 33, 61, 61, 29,158,158,158, 96, 24, 6, 2,129, 0, 37, 37, 37,112,112,104, + 58, 70,226,189,123,247,102,188,250,234,171, 10, 39, 39,167, 46,106,181, 90, 41,145, 72,250, 93,186,116,201,207, 98,177,192,209, +209, 17,142,142,142, 56,113,226, 4,156,157,157,241,238,187,239,230, 25, 12,134, 43,118,118,118,173, 12, 6,195,157,162,162,162, +143,155, 83,223, 20, 69, 65,167,211,161,188,188, 28,101,101,101,208,106,181, 48, 26,141, 86,243,216, 16,250,245,235,135,184,184, + 56,126, 76, 76,204,143, 89, 89, 89, 0,128,128,128, 0,188,251,238,187,124, 95, 95, 95,100,103,103,227,230,205,155,176, 88, 44, + 96, 89,182,201,155, 87, 32, 16, 12,154, 58,117,106, 95,127,127,127,194, 98,177,128, 97, 24,152, 76, 38,212,124,206,203,203, 67, +112,112, 48,175, 77,155, 54,207,103,101,101, 13,130,109, 11, 43, 56, 0, 40,206, 59, 12, 95,161, 39,192,115, 4,107, 56, 12,117, +105,203,162,184,168, 84,170, 47, 22,126,242,251,204,239, 86, 91, 90, 21, 40,129,160,176, 49,232, 24, 50, 4, 51,166, 80,136,249, +234, 0,252,219, 4, 33, 55, 55, 23,131, 6, 13, 18, 41, 20,138, 87,171,170,170, 22,216,202, 29, 31,127,141, 62,115,226,228,248, + 9, 47, 77, 11,143,136, 24, 73,157, 62,125, 2,247,238,156, 78,126,245,165,113, 42,150,169, 34, 92,157,101,183,210,211,110,116, +236,210,109, 32,204, 20,221, 15, 88,190, 26, 88,206, 54,126,191,195,124,252,184, 55,239,248,225,159,167,188, 60,121,122,215, 33, + 67,134,146,167,227,143,225,230,213,248,219,107, 86,191,126, 49,102,221,222, 65,145,195,199,133,122,180,186,114, 34, 44,208,244, +154,159,155,211,131,173,219,203,184,198,210,208,189, 41,149, 50,168,238, 23,121, 4, 1,150,101, 31, 19, 89,245,133, 22,143,199, +179,106, 0,168,203, 89,247, 89, 84, 51,160,222,188,121, 51, 36, 18, 9,196, 98, 49,132, 66,161, 85,247,139,186,156,201,217,217, +131,119,196,198, 74, 26, 18, 89,106,181, 26,106,181, 26, 85, 85, 85,152, 52,105,146,232,211, 27, 55,158, 69,181,235, 71, 99,156, +254,222,222, 38, 59,153,172, 56, 37, 37,197, 39, 36, 36,228,177,252,106,181, 90,200,100, 50,196,238,218, 37,138,142,138,122, 99, +200,137, 19,107, 96, 37,254, 85, 67,101, 39, 8, 2,158,158,158,112,113,113, 1, 65, 16,160, 40, 10, 69, 69, 69, 72, 78, 78,198, +141, 27, 55,192, 39, 8,234,175,172,227,134,180,200, 63,208,170,181,165,193,169,195,198,230, 68,155, 35,180,248,124,126,139,173, + 90,141,193,150,169, 67,185, 92,126, 87,161, 80,244,241,245,245, 5, 69, 81,181, 66,171,254,212, 97,141,245, 35, 41, 41, 9,114, +185,252,174,209,104,108,146,147,101,217,231,123,246,236,137,131, 7, 15,226,194,133, 11,120,248,240, 33,244,122, 61, 76, 38, 19, + 12, 6, 3,146,147,147,193, 48, 12,194,194,194, 96,103,103, 7,185, 92,126,215,100,106,122, 32,170,211,233,148, 66,161, 48, 72, + 38,147,213, 30,243,246,246,134, 90,173,102, 72,146,196,142, 29, 59,180, 94, 94, 94,118, 50,153,204,102,225, 74, 16, 4, 84, 42, + 21, 90,183,110, 93,235,163, 85, 89, 89, 9, 79, 79,207, 26, 97, 1,147,201, 4, 7, 7, 7,171, 83,135, 0,140,247,239,223,159, + 95,231,123,143, 9, 19, 38,252,186,103,207,158,246,103,207,158,197,245,235,215,225,225,225,129, 47,191,252,242, 97, 78, 78,206, +203, 0,110,168, 84, 79,215, 47,210,150, 54,164, 86,171, 15,220,189,123,247,249,158, 61,123,214,246, 18,131, 6, 13, 34, 6, 13, + 26,228, 94,215,212, 95, 82, 82,130, 63,254,248, 3,103,207,158, 5, 65, 16,200,204,204,164, 13, 6,195,175, 77,205, 82,248,250, +250,110, 95,178,100,137, 61, 69, 81,181,109, 91, 38,147, 65, 42,149, 66, 36, 18,129,207,231, 35, 39, 39, 7,163, 71,143,118,250, +254,251,239,127, 54,153, 76,207, 0,176,224, 95,130, 10, 3, 44, 73,247,180, 78, 97,193,173,146,183,108,142,233, 51,107, 54,106, +166, 14,169,176, 96,207,228,164,123,197, 78,225,158,214,203,123,242,108,254,155,102,242,228,168,147,167, 18, 38,126,240,222,187, +194,128,128, 96,213,217,243,137,254, 67,168,207, 8, 55,119, 71,168, 75,181,200,201, 43, 70, 86,174,153, 13, 8, 8, 86,221,252, +227,174,228,171,111,215,118,212,233,141, 53, 83,135, 77,182,211,223,174, 60, 28,179,102,189,228,226,180, 87,123,136,101, 50, 31, +148,149,222,133,191,191, 7, 70, 71,119,193, 79, 59,175,192,201,201, 21,173, 90,181, 2,143,199,179,179,181,236,165,165,165,196, +129,221,191,205,156, 58,253,245,231,134, 13,141,162, 78,157, 62, 46,184,112,230,232,149,159,183,124,116,136,229,235,228, 4, 91, + 41,107,219,206,235,206,131,251, 73, 47, 15,142,152, 4,153,200,161, 3,208,169,193, 6, 91,187,192,128, 69,222,193, 61,203,165, + 83,167,207,234, 61,108,216, 11,212,233,211,135,113,250,196,206,107,203,150,181, 61,241,176,112,151,232,234,141, 2,233,152,241, +115,203,227, 78,166,154,199,141,106,151,225, 99,215,205, 0, 60,228, 84, 85,221,129,164, 64, 80, 76,153, 76,126,173,135, 13,227, +235,115,115,133,246,173, 90, 81, 0, 64,146,164, 85,161,133, 70,166,160,235,115,218,154, 23,189, 94, 15,166,145,216,137,245, 57, +139, 84,170,182,213,131,240, 90,144, 36, 89, 43,178,212,106, 53, 42, 42, 42, 96,103,103,135, 18,147,169,149, 45,156, 67,123,245, +218,241,233,242,229, 11,246, 31, 56, 32,170, 43,178,106, 94, 66,161, 16,171, 86,175, 22,189,243,193, 7,115,223, 16, 8,230,129, +162,108,190,158, 53,131,118, 62,159, 15,129, 64,128,220,220, 92,228,229,229, 33, 55, 55, 23,185,185,185,144,201,100, 96,255,226, + 69, 64,255, 96,255,172, 26,145, 85,247,189,214,202,213,100,120,135,230, 56,195,219, 42, 12,232,102,204,239,218, 34,180,116, 58, +221,217,115,231,206,245, 26, 51,102,140,224,218,181,107,240,242,242,170, 21, 90, 53,239, 53,211, 81,114,185, 28,135, 14, 29,178, +232,116,186,179, 86,110,166,115, 39, 78,156, 8, 95,186,116,169,112,198,140, 25, 72, 73, 73,193,236,217,179, 81, 81, 81, 1,173, + 86, 11,181, 90, 13,189, 94,143, 94,189,122, 65, 42,149,226,206,157, 59,164, 94,175, 63,103,197, 98,199,170, 84,170, 42, 15, 15, + 15,239,250,191,141, 31, 63,190,213,198,141, 27,245,105,105,105,100,159, 62,125, 28,109, 21, 28, 53,216,189,123,119,173,165, 46, + 35, 35, 3, 27, 55,110,172,245,201, 74, 76, 76,196,215, 95,127, 93, 27,251,172,153,184, 81, 90, 90, 74,145, 36,137, 14, 29, 58, +192,215,215, 23, 70,163, 17,107,215,174,165, 0,220,248,255,106,205, 70,163,113,255,180,105,211, 62,188,117,235,150,183, 64, 32, +120,100,210,174, 46,159,197, 98,193,253,251,247,145,156,156,140,180,180, 52,148,149,149,213, 14, 4,146,146,146,202, 73,146,220, +219, 24,175,135,135,199,199, 63,253,244,147,151, 92, 46,127,172, 61,215, 88, 67,107,172,164, 37, 37, 37,112,118,118,198,144, 33, + 67, 60,207,157, 59,247,177,201,100, 90,250, 47,121,166, 17,227, 95,204,232,241,206,155, 99, 48, 54, 90,158,127, 48,174,240,247, +175,191,154, 95,237, 12,239,153, 60, 54,218, 55,255,118,186, 51,198,191,120,184, 7,128, 2, 52,237,176,205,156,191,168, 60,210, +179,167,203,133,131, 71,143,254,188,120,225,123,137, 11,230,191,238,161, 55, 60,144, 6,180, 17, 19, 0,144,149,107,102,239,164, + 48,198,175,215,188,151, 24,179,250,123, 94,177,186, 98,246, 31,127, 52, 30,222,160,174,120,225,241, 32, 13,232, 52, 64,209, 49, +176,111,187,107, 87, 98, 97, 47, 55, 32,168, 83, 15, 12, 27,250, 60, 46, 36, 36,161,168,196, 8,165, 82, 9,147,201,212,100,184, +132,180, 59,135,166,176, 4,235, 79,176, 68, 30,193, 99,165, 83,166,189,214, 47, 42,234, 5, 54, 46,238, 40,117,248, 80,236,229, +189,191,172,223,207, 19, 9, 5, 6,179,147,153, 32,140, 26,240,238,165, 84,233, 30, 13,104,132, 18, 81,227,230,215,234,192,174, + 33,161,157,188,166, 76,155,237, 52,114,196,104,246,196,137,195,204,222, 61, 59, 46,236,221,214, 57,150,225,105, 69,202,124,189, + 68,163, 37, 53, 44, 33,118,174,210, 50,250,226,172,103,140, 62, 81,227, 45,192,126, 78, 93,213,125, 14,152, 76, 5, 85,249,249, +222,174, 3, 6, 72,238, 47, 95, 46,111,213,171,151,145,168,246, 33,110, 74,104,241,249,124,128,199, 99,108,225,180, 53, 47, 6, +131, 1, 12, 64,182,132,147,162,168,199, 68, 86,141,208,170,185, 95,108,225,220,178,108,217, 53,255, 97,195,202, 18, 18, 18, 90, + 13, 28, 56,144,168,172,172, 68,101,101,229, 99, 98,203,199,199,135, 8, 9, 11,147,239,190,112, 33,192,214,235,105, 75,217,121, + 60,222, 95, 46,180,254,225,104,116, 35,233, 38,183,224,169,177,104,217, 34,180,108,180,104,145, 36, 73,194,211,211, 19,165,165, +165,141, 62,248,121, 60, 30,100, 50, 89,205, 28,113,147, 43,239, 76, 38,211,218, 5, 11, 22,188, 53, 98,196, 8,247,160,160, 32, +148,148,148,160, 85,171, 86,144, 74,165,181,190, 99, 53,124,137,137,137,248,233,167,159,180, 38,147,105,173, 21,206,111, 87,175, + 94,253,230,216,177, 99, 93,189,188,188,224,226,226,130, 59,119,238,192,197,197, 5, 90,173, 22,233,233,233,112,112,112,168,245, +219, 57,122,244,104,165,201,100,250,214,138,120, 99, 47, 93,186,100,113,112,112,184, 83, 82, 82,194, 47, 43, 43, 19,148,151,151, + 11,180, 90,173, 80,163,209, 8, 79,157, 58,229,238,228,228,164, 63,127,254,124,137,191,191, 63,255,225,195,135,124,146, 36,173, +170, 87,130, 32, 48,111,222, 60,136, 68, 34,152, 76, 38,172, 93,187, 22, 11, 22, 44,168,245,201, 90,189,122, 53,150, 44, 89, 82, + 43,156,183,110,221,218,172,150,195,178, 44, 44, 22, 11, 72,146, 4, 73,146, 54,137,223, 39,129,141,130,189, 40, 51, 51, 51,186, +103,207,158,103,246,237,219,231, 86, 29,147, 12,197,197,197, 40, 46, 46, 70, 73, 73, 9,170,170,170, 64, 81, 20,124,125,125, 81, + 92, 92,140,195,135, 15,107, 42, 43, 43,135,161,137, 21,135,124, 62,127, 90,191,126,253, 4,245,243, 80, 51,202,171, 17,239, 18, +137, 4, 10,133, 2,131, 6, 13, 18, 39, 36, 36, 76, 3,240,143, 22, 90,117,195, 59, 12, 29, 54, 83, 20, 28,218,219,124, 59, 57, + 46,191, 83,187,226,252,201,163, 29,143, 3, 64,210,189, 98,167,219,233,206, 8, 14,141,102,135, 14,115, 9, 47, 46,218,210, 25, +128,165,169,237,122, 0,192, 73, 46,153, 16, 25,209, 75,225, 96,103,199,251,122,205,214,147, 63,252,240,237,179,251,143,255, 39, +188,195,215,107, 30,133,119,136,140,232,197,164,165,166, 77, 0,176,205, 86,241, 18, 29, 61,234,214, 79,219,127, 66, 90,242,121, +159, 15,231,117, 17,151, 21,147,144,217,251, 33,188, 91, 43,108,217,126, 23,183,111,223, 46, 50,155,205,131,154,108,223, 4,235, +159,156,114, 47,176,115,104,136,215,148,105,179, 28,163,163, 71, 35, 46,238, 8,126,217,177,237,210,184, 73, 99,127, 44, 44,215, +242, 61,133,114,145,156,101,196,124,145,147, 64, 36,145,169,204,230, 71,107, 32,132, 66,169, 35, 48,161,201, 7,207,156, 89,147, +157, 6, 71,140,198,241, 19, 71,240,203,142, 45, 23, 63, 9, 29,191,173, 93,247, 96,162,215,179, 95,205,109,215,190, 93, 27, 93, + 85,177,150, 71,136, 45, 70, 35,227,240,213,142,156,111,178,150, 76,203, 2,176, 6,220,170,195,186,184,243,203,200,145, 61,223, +121,240, 64,228,209,183,175, 76,113,225,130,188,122, 39,146, 38,133,150, 64, 32, 0,219,248, 84,215, 99,156,196,206,157, 60, 0, + 77, 46,194, 18,137, 68,208,235,245, 32, 27,183, 96, 63,198,233,125,250,116,254,131, 7, 15, 58,186,186,186, 62, 38,178,202,202, +202,106, 63, 27,141, 70,232,245,122,200,100,178,100, 67,195, 51, 34,143,113, 22, 95,186,100, 92, 57,111,222,210,151, 39, 77, 90, +127,246,220, 57,169,155,155, 27, 52, 26,205, 99, 66,203,108, 54, 99,240,144, 33,162,213,183,110, 77,129, 86,187,204,150,235,217, +106,208, 32,171,254,192,124, 62, 31,204, 95, 60,117,248, 47,192,172,134,132, 23,207,218, 20,142,173,171, 14, 27,121, 64,214,223, +221,123, 73,120,120,184, 49, 35, 35, 3,254,254,254,181, 98,165,238,127, 58, 58, 58,194,217,217, 25,137,137,137,248,226,139, 47, + 12, 0,150, 88,225,172,212,235,245, 47, 69, 70, 70, 26, 4, 2, 1, 58,117,234, 84, 27, 63,139, 97, 24,136,197, 98,216,217,217, +225,214,173, 91, 24, 53,106,148, 94,175,215,191,132, 63,199,208,170,207,169,209,235,245,175, 12, 29, 58, 84,159,146,146,130,126, +253,250,225,246,237,219,168,170,170, 66, 85, 85, 21,178,179,179, 17, 18, 18, 2,189, 94,143,141, 27, 55, 26,244,122,253, 43, 0, + 52, 77,113, 86, 86, 86,142, 90,176, 96, 1,255,215, 95,127,109,231,235,235, 27,218,163, 71,143,160, 33, 67,134, 60,243,226,139, + 47,182, 25, 57,114,164,119,199,142, 29,141,195,134, 13,243, 24, 49, 98,132,135, 94,175, 23,254,254,251,239, 74,146, 36, 71, 88, +201,103,173, 56,201,200,200,168,157, 42, 20, 8, 4, 40, 45, 45,173,141,220, 95,211, 41, 53, 34,132, 35,172,137,237, 26,129, 85, + 35,184,108,240,115,107,136,211,234, 73, 98,177,184,198,226,201,218,192,153,148,154,154, 26, 57, 96,192,128,164,153, 51,103, 86, + 22, 21, 21,193,193,193, 1, 1, 1, 1, 8, 12, 12,132,187,187, 59, 44, 22, 11, 14, 29, 58,164, 59,124,248,240, 93,141, 70, 51, + 8,127,142,161, 21, 81,239, 58,102, 55,212,201,214, 88,179,106,132,150, 84, 42,133,175,175,111,205,181,205,110,206,245,108, 33, +254, 90,206,106, 1, 51,100,240,176,246, 35,163,198, 56, 29, 58,114, 69,188,126,195,225,187,225, 17,216,234,214, 86,123,212,173, +173,246,104,120, 4,182,174,223,112,248,238,161, 35, 87,196, 35,163,198, 56, 13, 25, 60,172,125, 74,114, 90, 80,221,125, 15, 27, +202,167, 84, 42,237,221,175,111,120,121,194,229,139, 76,204,234,239,121,131, 7,141,187,181,237,199, 67,135,182,253,120,232,208, +224, 65,227,110,197,172,254,158,151,112,249, 34,211,175,111,120,185, 84, 42,237,109, 75,217,231,204,154,236, 20, 53,114, 52,226, +226, 14, 81,251,119,111, 92,189,231, 64,230,128,215,222,186, 84,156,145,113,155, 85, 21,156,134,144,151,139,212,212, 84, 77,181, +200,202,176,133,115,246,235,147,235,138,172,223,220,188,250,109, 77, 77, 5, 29, 31,127,140, 60,119,238,150,225,183, 36,149,230, +102, 74,105,153,162,164,236,161, 86,171, 54, 51, 12, 13,154,166,249,159,126, 90,235,176,219, 96, 29,245,233, 51, 16,231,207,238, +194,142,237,155, 53, 12, 3,227,132,253,251,233, 9, 19,150,179,109,218,182,109, 19,187,123, 23, 17,253,194, 24, 39, 22, 96, 70, +141, 29,237,252,235,158, 95,137,246, 29,218,183, 13, 8,168, 13,105,243,207,107, 75,127, 1,231,114,160, 92,155,155,123, 49,241, +251,239, 77,173, 94,122,201, 85,220,170,149, 35,104,154,168,233,223, 27,123, 9, 4,130,250, 22,152, 70, 57,125,221,221, 11,143, + 30, 61,138,192,192, 64,248,250,250,162,174,143,108, 77, 64,110, 55, 55, 55, 28, 56,112, 0,236,227,193,169, 27,229,236,222,174, + 93,226,170,149, 43,205, 12,195,160,188,188,252, 79,214,172,242,242,114, 48, 12,131, 19,199,143,155,181,143,118, 2,177,169,236, +131,248,252,170,151,251,247,143,137,138,138,178, 60,120,240, 0, 12,195,160,174,101, 75,165, 82,193,222,222, 30, 70,147,201, 15, +128,220, 22, 78,213,169, 83,118,176,210,175, 55, 96,209,250, 43,234,253,159, 46,178,234,110, 40, 61,203, 38,139, 22, 69, 81,240, +243,243,123,108, 75, 23, 30,143,247,216,171,153, 43, 14,119,166,164,164,156, 30, 54,108,216,210,231,158,123,110,206,210,165, 75, +249, 65, 65, 65,208,104, 52,112,113,113,129,167,167, 39,210,211,211,113,244,232, 81,186,180,180,116, 19,128, 21,176,109, 9,253, +133,204,204,204,232, 46, 93,186,236, 89,180,104,145,211,208,161, 67,133,126,126,126, 96, 89, 22,183,110,221,194,193,131, 7, 45, +219,182,109,211, 86,139, 44, 91,157,151,207, 40, 20,138,113, 35, 70,140,136,157, 54,109,154, 3, 77,211,194,236,236,108,152, 76, + 38,144, 36,137,188,188, 60, 75, 92, 92, 92,149, 94,175,159, 12,224,140, 13,124,137, 21, 21, 21, 33,241,241,241,211,126,255,253, +247, 47,102,206,156,233, 54,100,200, 16, 17, 69, 81,184,124,249,114, 73,247,238,221, 61, 85, 42,149,229,192,129, 3,106,163,209, +184,132,166,105,155,182,224, 33, 8, 2, 90,173, 22,238,238,238, 48,153, 76, 96, 24, 6,102,179, 25,246,246,246,181,219, 38,177, + 44,139,230, 56,215,215,107, 3,124,139,197,130, 73,147, 38,129, 97, 24,172, 93,187, 22, 20, 69, 53,155,204,201,201,233,102, 82, + 82, 82,116,183,110,221,106,197, 75, 77, 27,146, 72, 36,112,119,119,135,155,155, 27,226,226,226, 32, 20, 10,111, 90,243,119,171, +198,237,210,210,210,238,241,241,241,189,239,222,189, 59, 21, 64, 55,139,197,226, 75,211, 52,193,227,241,148, 44,203,222,209,106, +181, 63,194,198, 45,120, 84, 42,213, 23,211,167, 79,239,190,107,215, 46,123,129,224, 63,183,134, 64, 32,128, 68, 34, 65, 77,112, + 76,150,101, 97, 54,155,241,241,199, 31,107,117, 58,221, 23,255,150, 94, 34,188, 71, 47,108,217,184,206,254,220,249,211, 37,169, +153, 56,216, 64, 8,135,130,226,162, 45,157, 21,249,249,246,225, 61,122,217,196, 73,154, 45,234, 87, 38,191,239, 95,189, 5,207, +199,217,217, 57,155, 99,119,126,147, 5, 0, 95,125,187,182, 99,177,186, 98,118, 90,106,218,132,205,155,119,247, 38,205, 22,181, + 45,156,255, 17, 47,177, 26,176, 48, 2,184,126,235,110,113,187, 81, 47,157, 90,210,161,189,227, 11, 42,181,161,176,170, 74,255, + 54,128, 44, 91,203,222,183,207, 0,156, 63,243, 43,126,217, 17,171,101, 25,190,209,221,221,157, 5,128,212, 84,119, 54, 53,181, +130,253,143, 95,177,179, 78,200,222, 94,241,254,219, 67,222,215,104,203,190, 93,187,177,233,169,148, 46, 93,159, 67,151,174,207, +225,173,183, 63,114, 10, 9,237,228, 15, 0,251,247,131, 14,237,144,114,108,233, 39,203, 95, 88,177, 98, 57,180,149, 38,212,108, +215,147,126, 47,229,120, 86, 22,204,220, 51,235,113, 44,165,168,235,120,255,253,142,250,178, 50,143,190, 31,126,232, 46,248,224, + 3, 94, 83,206,240,117,239, 95, 91, 56,111,220,185,115,124,246,107,175, 21, 46, 91,186,116,216,166,205,155,101,157, 59,119, 70, + 81, 81, 17, 58,117,234, 4, 95, 95, 95,196,199,199,227,192,222,189,186,138,202,202, 37, 0,126,176,133,115,231,137, 19,233, 65, +161,161,165,155, 55,111,246,137,138,138, 34,116, 58, 29, 52, 26, 13, 52, 26, 13, 76, 38, 19,170, 3, 66,179, 25,153,153,169, 36, + 73,110,178,181,236,116, 73,137,116, 69,175, 94, 5, 34,134, 89, 53,110,236,216, 5, 43, 62,251, 76,210,190,125,123,194,100, 50, +213, 90,181, 44, 22, 11,236,237,237, 45,102,179,217, 13,128,222, 22, 78,201,182,109, 84, 73, 73, 9, 60, 60, 60,106,195, 53,213, +141, 75, 88, 89, 89, 9,150,101,185, 96,186, 45, 64,163, 10,201,197,197,229,166, 64, 32,104, 93,215,186,213,208,222,121,117,143, +145, 36, 89, 80, 90, 90, 26, 94, 79,241, 54,230, 15, 21, 0,224,203,193,131, 7,143,155, 63,127, 62,145,144,144,128,195,135, 15, +179, 89, 89, 89,251,171,173, 88, 89, 77,140,116, 26,227,116,144, 72, 36,239,218,217,217, 69,212,132,112,144,203,229,119,117, 58, +221,217,234,233,194,202, 22,112, 58, 74, 36,146,121,118,118,118,145,213,219,175,192,193,193, 33, 73,167,211,197,155, 76,166,117, +104,124,163,234,166, 56,101, 78, 78, 78, 95,184,187,187,191,242,193, 7, 31,184, 93,186,116, 73,121,254,252,121, 81, 69, 69,197, + 46,179,217,220,212,166,210,127,226,116,117,117,189,201,231,243, 91,255, 69,117,132, 46, 93,186,196,141, 26, 53, 42,106,242,228, +201, 32, 73, 18, 63,252,240, 3,226,227,227,143,223,191,127, 63,218,202,104,180, 62,167,123,235,214,173, 19,230,204,153,211,102, +210,164, 73,114, 23, 23, 23, 8, 4, 2,232,116, 58,220,191,127, 31,183,110,221, 98,143, 28, 57, 82,149,152,152, 88,160,215,235, + 7, 2, 40,109,198,245,124,146, 81,243, 99,156, 2,129, 96,128,159,159,223,238,101,203,150, 57, 68, 70, 70,202,220,220,220,192, +231,243, 65,146, 36,148, 74, 37,238,221,187,135,211,167, 79,235,246,239,223,175, 83,171,213,147, 0, 92,252,255,200,231,211,228, + 12,238,136, 79,234,109, 20,221,104,180,119, 43,105,173,230,115,240, 0,239,209, 19,198,141, 24, 14, 0,251, 14,156, 60,101,195, +166,210,141,230,211, 90, 94,109,225,236,212,129,183, 44, 57,229,222, 99, 1, 45, 67, 67,194, 50,130, 59,143,253,220, 22,162, 58, +145,225, 31, 43,123,157,233,216,186, 54,221,199,166, 89,131, 3, 16, 61,122,194,139, 81, 31, 45, 89,140, 47,191,136,193,145,125, +135,142,167,102, 61,182, 77,208, 63,174, 45,253,197,156,196,231, 2,193,115,114,111,239,254,107, 25,102,241,237,123,247,236,235, + 14,216,106, 44,207,117, 7,149, 62, 62, 62, 42,165, 82,217,202, 22,206,232,239,190,179,232,237,236, 36,139, 87,173, 26, 80,101, + 52, 14, 88,177, 98,133,224,198,141, 27,216,248,253,247,148,177,160, 32,182, 4,152,215,200,108, 72,163,156,109,230,205,147, 46, +220,184,113, 70, 64,135, 14,158, 83,167, 78, 21, 10,133, 66,232,116, 58,228,231,231,227,204,233,211,230,148,212,212, 20,173, 86, +251, 2, 0,133,173,156,209,223,125,103,113, 14, 8,128,220,195,131, 61,119,225,130,211,236,119,223,157,211,182, 93, 59,167, 97, +195,135, 11, 29, 29, 29, 81, 94, 94,142,236,236,108, 28, 58,116, 72, 85, 85, 85,229, 3,128,182,133, 51,246,247,223,187,156,184, +120,113,252,231,159,127, 46, 14, 11, 11,131,147,147, 19, 42, 43, 43,113,239,222, 61, 92,188,120,209,180,105,211, 38,141, 70,163, +153, 67,211,244,209,191,176,222,255, 13, 86,173, 26,108,177, 42,180,254,139, 55, 96, 56,128, 79,170, 63,127, 6,235,123, 6,254, +155, 58, 31,127, 87, 87,215, 45, 70,163,145, 53, 24, 12,179, 1,228,253, 13,243, 41, 8, 15, 15,223,168, 82,169,122,179, 44, 11, + 39, 39,167, 43,201,201,201,111,160,145,149, 55, 86, 56,249, 0,122,219,219,219,247,114,112,112, 24, 96, 50,153,130,171,167,223, + 82,117, 58,221, 69,139,197,114,189,218,250, 68,255, 63,151,157, 15, 32,210,199,199,231, 53,134, 97, 58, 16, 4,225, 76,211, 52, + 72,146,172, 96, 24,230,190, 70,163,217, 6, 32,254,111,144,207,167,194, 25,242, 12, 94,100,121, 8,110, 76, 16, 60, 38,180,234, + 9, 8,130, 65,106,202, 3, 28,106, 70, 62,121, 35, 34,252, 54, 0,143, 86, 38,194,186,115,237,127,132,150, 13,226,165,217, 34, +243, 25,254,116,150, 96, 31,227, 36, 88, 34,175, 83,151, 23,127,121, 18,161,101, 43, 66, 2, 49, 0, 44,122, 51, 44,174,167,221, +199,249,127,113, 95,247,212, 56,191, 4, 92,191,119,113,185,194, 19, 8,188, 0,240,170,173, 47, 12, 67, 16, 52, 75, 16, 84,221, +233,173,122, 3,203, 38, 57, 45, 64,103,161, 68,226, 71, 83, 84,171, 34,192,254, 4, 77, 63,107,100,217,170,214,192, 39, 73, 64, +122, 75,242,105, 1, 58,243, 37, 18,255, 19, 44, 59,186,196,206,174,139,202, 96,240, 0,192,218,219,217,165,106,117,186, 29, 70, +163,113, 3,254, 60,115, 97,149, 83, 36,145,180,166, 41,170, 21, 0,240, 4, 2,213, 30,147,201,175,192,209,113,170,209,100,106, + 99,111,111, 79,154,205,102,173,209,104,156, 76, 81,212,185,230,148,253, 62, 69,133,252,206,227,245,179,216,217,185, 89, 8,194, +206, 76, 81, 22,179,197,146,111, 52, 26,239, 2,248, 6,192,131,191,184,222, 57,180,240,102,225, 56, 57, 78,142,147,227,228, 56, + 57, 78,142,243,175,231,148, 3,240,175, 30, 44,254, 19,203,254,111,130,109, 62, 90, 28, 56,112,224,192,129, 3,135,127, 12,244, +104,192, 39,139,195,255, 47,136, 38, 84,105,115, 76,130, 45, 81,182,103, 57, 78,142,147,227,228, 56, 57, 78,142,147,227,252,159, +227,180,198,253, 79,156,146,108,116,175,195,191, 26,156,249,151,227,228, 56, 57, 78,142,147,227,228, 56, 57,206,255, 89,240,184, + 75,208, 40, 90, 85,191,158,118, 90, 14,255,238,182, 80, 31,190,213,175,230,164,247,230, 46, 57, 7, 14, 28, 56,112, 66,235,175, +126,104, 61,201,195,237, 73,133, 79, 12, 65, 64, 65, 16, 80, 0,136,121,138,105,173,193,199,221,221,253,157,144,144,144,216, 86, +173, 90,189, 5,192,179,153,231,119,148,203,229,235,236,236,236, 18,236,236,236, 18,228,114,249, 58, 0, 29,159, 82,189, 17, 0, +102, 75, 36,146, 11,222,222,222,133, 98,177,248, 2,128, 57,104,249,202,213, 32, 60,138,147,246, 25,128, 46,205, 57,209, 51,116, +244, 94,143,208,209,119, 60, 66, 71,223,115, 11, 27,213,209, 35,116,244, 61,143,208,209,119, 60, 67, 71,239,253, 11,218,235,147, +212,111, 12, 65, 32,143, 32,144,103,227,185,223, 16, 64, 62, 65,160,224, 41,180, 37, 14, 28, 56,112,224,240, 79,131,143,143,207, + 56,111,111,239,179,222,222,222,241, 62, 62, 62,227,108, 56, 37,162,129, 7, 15, 77, 16,160,173, 60, 72,154, 74,103,205, 92, 89, +247,220,175,109, 44, 90, 93,206, 86, 4, 1,154,173, 6, 65,128,241,244,244, 92,239,237,237, 29, 83,255,229,233,233,185,158, 32, +192,212, 73, 75,215, 17,120,205, 53,171,182,154, 50,101,202,190,242,242,242, 56,179,217, 28,151,153,153, 25, 55,112,224,192, 61, +245,172, 27,141,114, 74,165,210,151,123,246,234,157,120,241,242,245,204,140,251, 57,138,148,244,135, 57,199, 78,157,187, 17,214, +185,203, 31, 82,169,244,229,102,212, 17, 1, 96,182, 64, 32,184, 96,111,111, 95, 32, 16, 8, 46, 0,152,203,231,243,143,174, 92, +185, 50, 39, 57, 57,185,248,247,223,127,175,184,120,241, 98,225,204,153, 51,239, 19, 4,113,172, 1,193, 30,209,128,149,166,190, + 85,103,105,110,110,238, 41,165, 82,121, 90, 38,147,125, 97, 67,250, 90, 78,143,208,209,119, 84, 26, 11,171,210, 88, 88,143,208, +209,108,157,207,119,154,121,205,173,213,209,159,218,130, 68, 34,241,183, 34,232, 35, 26, 59, 23,128, 87,245,111,225, 0,190,171, +126,213, 44, 61,247,146, 74, 36, 79,171, 45, 61,141,178,115,156, 28, 39,199,201,113,254,183, 57,255,201,232, 94,253,238,141, 71, +254, 90,181,207,238,230,174, 58,124, 51, 51, 51,211, 30, 0, 2, 3, 3,223, 0,112,160, 57, 66,130, 32,176,144, 97, 88, 30, 0, +240,120,196,135,131, 6, 13,238, 46,147,201, 30,139,130,108, 48, 24,196, 23, 46,156, 31,194, 48, 44, 81,157,110, 33,203, 98, 29, +128, 98, 91,255,195,108, 54,241,132, 66, 49,120, 60,226,253,176,176,206,109, 75, 75, 75, 47,241,120,188,216,194,194,194,242,102, +155,113, 8, 2, 91,183,110, 13,244,246,246,254, 83,180,102,165, 82, 41, 30, 61,250,133,102,241, 77, 7, 36, 38,137,164,151,136, + 32,188,105,138,114, 6, 0,129, 64, 80,126, 67, 44, 14,255,242,243,207,229, 4, 65, 48,106,181, 26, 6,131, 1,239,189,247,158, + 44, 37, 37,101, 76,105,105,233, 6, 43,180,129, 93,186,118,127,239,244,233, 83,193,218,178,114,227,214,111, 55, 39, 26, 4, 34, +125,187,144, 78,162,141, 91,118,184,204,154, 49,249,237,180,180,228, 36, 52,188, 29, 73, 93,240, 0, 28,122,247,221,119, 67,163, +163,163,197,149,149,149, 82,131,193,208, 54, 54, 54,246,227,240,240,112,251,110,221,186,137,119,239,222, 77,104, 52, 26,176, 44, + 43,239,212,169, 19, 59,113,226, 68,227,158, 61,123,222, 2,176,190, 9,225,187,240,209,181,228,173, 13, 10, 10, 90, 6, 0,153, +153,153,162, 58,215, 88, 24, 28, 28,108, 7, 0,233,233,233,159,178, 44,243, 46, 0,176, 44, 86, 3, 88,220,128,105, 45, 51,180, +239, 4,128, 64,135,228,203,251,164,161,253, 38, 24,193,226, 62, 1,100, 86, 15, 8, 86, 0,117,226, 66, 61,142, 84,133, 66,209, +162,189, 9,163,162,162, 9,130, 32,246, 39, 38, 38, 30, 80,169, 84,237, 24,134,126,189,169,124,214,107, 71,132,155,155,219,244, +210,210,210, 24, 0,175,165,166,166,118, 7,128,224,224, 96, 17,128,155,142,142,142,125, 44,102, 51,193,245, 85, 28, 56,112,224, +240,143, 21, 90,183, 0, 68,225, 63, 91,240,108,105,137,208, 18, 3,192,165, 75,151, 0, 64,210,130,140, 16,117, 5,204,188,121, +243,224,237,237, 93, 95,188, 32, 33,225,194,147, 20,246,177,255,248,236,179,207,236, 43, 42, 42, 34,126,252,241,199,254, 44,203, +126,173, 80, 40,174, 89, 57,191,152,101,177,154,199, 35, 62, 36, 8, 2, 18,137, 52, 99,206,156, 57,183,170,127,107,123,236,216, + 49,249,168, 81,163,244, 0,114, 0, 64, 34,145,250,242,249,188, 64,150,101,107, 30,184,141, 10,194,241, 64, 0, 37, 22, 15,158, +253,221,119,212,179,163, 70, 9,236, 60, 60, 8, 0,200, 73, 75,115, 91,253,213, 87,125,202,179,178,196, 6, 55, 55,181, 90,167, + 51,100,100,100, 64, 34,145, 16,124, 62,255, 89,107, 5,182,179,179,123,231,243, 47, 87,217,105,203, 42, 12, 70,109,165,153, 79, +145, 38, 7,153,156, 46, 46, 82,169,237,101,118,250, 15, 63, 89, 46,126,243,245,105,239,232,116,186, 55,172, 80,189,245,254,251, +239, 7,247,236,217,211,119,239,222,189,132, 70,163,129, 64, 32,176,239,214,173, 27,194,195,195,233,243,231,207, 19,237,218,181, + 67, 88, 88, 24, 46, 95,190,140, 43, 87,174, 16,221,187,119,151, 31, 60,120,112, 10, 73,146,235,173,137,107, 62,159,247, 94,167, + 78,157,186,217,217,217,153, 3, 3, 3,241,250,235,175,131,101, 89, 68, 68, 68,132,217,219,219, 31,208,233,116,226,244,244,180, +254,214, 68,182, 42,249,200,196, 26,203, 22,128,206, 96,113,191, 36,249, 72,221,233,199,224,244,244,244,231,202,203,203,241,168, + 94,216,218, 13,204,251,247,239,223,156,182, 84,204,178, 88, 61,106, 84,244,135, 0, 65, 68, 68, 68, 84,188,245,214, 91,188,180, +180,180, 87, 94,124,113, 76, 88,102,230,125, 52,145,207,186,237,136,152, 62,125, 70,177,189,189,253,216,253,251,247,167, 43,149, + 74,129, 72, 84,171, 51,249,158,158,158, 30,129,129,129,115, 93, 93, 93, 85,124, 30,207,147, 5,203, 90,107, 75, 28, 56,112,224, +192,225,111,133,227,213,226,234,120,253, 31, 4, 0, 16, 23, 23, 87, 27,153, 54, 58, 58,186,209, 81, 53,203,178,197,183,111,223, +246,211,235,245, 96, 89,214,150,135, 64,221, 37,154,197, 4,193,219,200,227, 17,111, 16, 4,129,176,176,206, 15,215,174, 93,219, +208,158, 94,230,176,176,206, 15,249,124, 94,123,150,126, 35, 16,153, 0, 0, 32, 0, 73, 68, 65, 84,101, 65, 16,188, 31, 88,150, + 41,110,132,179,193, 7,163, 88, 44, 89, 8, 0, 94, 94,222, 89, 39, 79,158, 52,143, 31, 63, 30, 95,125,245,149,104,209,162, 69, + 11, 4, 2,193, 91,121,121,121, 69, 77,228, 19, 0, 22,123,120,120,202,183,110,221, 26, 56,103,206,156, 91, 74,165,114, 49, 0, +120,123,123,199, 0, 8, 1,144, 83,231, 24, 54,109,218, 83,248,250,235,175,103,168, 84,170,197,141,113,142, 5,158,241,235,212, +105,240,138, 75,151, 88,158,201, 68,148,254,246,155,182,164,184,152,124, 80, 82, 34,223,126,243,102,244,199, 49, 49, 66, 63,127, +127, 36, 28, 61,234, 94,170,215,151,104, 76, 38, 99,113,113, 49, 75, 81,212, 21, 27,202, 30,234,233,225, 41,223,252,205, 15, 55, + 28,132,124,198,179,181, 47, 33,116,117, 21,240,228,142, 98,190,128,103,106,223,182,163, 24, 64,168,181, 58, 18,137, 68, 83,134, + 14, 29, 42,223,179,103, 15, 17, 22, 22, 6,103,103,103,252,246,219,111, 72, 74, 74, 66,121,121, 57,143, 36, 73,244,232,209, 3, +171, 86,173,130,191,191, 63, 42, 42, 42,144,151,151,231, 46, 22,139, 61, 72,146,108,236,122, 62,214,158, 22, 46, 92, 8,111,111, +111, 80, 20,133,178,178, 50, 80, 20, 5,123,123,123, 0, 64, 65, 65, 1,142, 30, 61, 98, 75, 91,178, 10,150,101,241,252,243,207, + 87, 18, 4,145, 90,223,162,213, 28, 78, 95, 95,223,221, 37, 37,165, 35, 6, 15, 30,140,242,242,114,114,249,242,229,232,210,165, + 11, 2, 3, 3,109,201,231, 98,145, 72,252, 99,155, 54,109,190,153, 55,111,158,183,171,171, 43, 76, 38,211,199, 69, 69, 69,152, + 59,119, 46, 0, 96,228,200,145, 93,132, 66,225,201,153, 51,103,162, 93,187,118,133,101,101,101,121,137,137,137,175,235,245,250, +123, 45, 45,187,141,224, 56, 57, 78,142,147,227,252, 91,113,218,170, 69,254,166, 80,226,241,112, 14, 91, 30, 19, 90,209,209,209, + 68, 92, 92, 28,107, 67,193,212,173, 91,183,246,147,201,100, 0,160,110,110, 46, 24,134,121,203,205,205, 77,181,120,241,226,190, +129,129,129,230,183,222,122,235, 94, 78, 78,206,146,186,105,218,182,109,251,197,247,223,127,143,140,140,140,156,152,152,152,203, +106,181,186,185,251,152, 45, 98, 89,172,173,182,142,149, 30, 61,122,180,203,165, 75,151,222,248,246,219,111, 61,222,124,243, 77, +209, 59,239,188, 51, 25,192, 87,214, 72,248,124,190,190,161,233,194,134,224,237,237,109,230,243,249,141, 6,137,139, 6,100, 82, +177,120,208,138, 75,151, 88,115, 78,142,254,167, 53,107, 28, 54,255,241,199, 50,146,101, 91,121,122,122,162, 95,159, 62, 85, 82, + 62,191, 84, 85, 84,196,120, 62,243, 12, 63,251,228, 73,119,131, 88,172,216,179,103,143, 70,173, 86, 31,182,106,194, 35, 8, 45, +195,178,102,251,214,254,228,248, 49,145, 97, 55,174, 39,165, 57,120,186,243,186,119, 11,235,146,150,145,147, 8,134,177, 16, 4, +161,181,198,227,228,228, 20,168, 86,171,161,213,106,225,225,225,129,181,107,215,194,203,203, 11,122,189, 30,201,201,201,108,235, +214,173,137, 75,151, 46,161,117,235,214, 40, 41, 41,129,217,108, 70,101,101,165,202,100, 50, 53,182, 55, 99, 49,143,199,255,153, +199, 35,102, 16, 4,129,246,237, 3,114, 55,108,216, 96,102, 24, 6,193,193,193,120,241,197, 23,113,240,224, 65, 36, 39, 39,215, + 88,158,204,109,218,180,205,229,241,136, 54,213, 90,169,197, 86,157,154,173,125, 20, 10,197,216, 22,222, 52, 60, 31, 31,159,201, + 29, 58,116,120,227,229,151, 95, 38,197, 98, 49,116, 58, 93,205,181, 32, 71,140, 24, 89, 49,106, 84,180,211,241,227,199,155,204, +167,217,108,206,210,104, 52,175,189,255,254,251,177,155, 54,109,114, 89,178,100, 9, 24,134, 1,203,178,160, 40,170,118,211,111, +134, 97,112,232,208, 33, 60,120,240,224,139,122, 34,139, 3, 7, 14, 28,254, 39,208, 12, 45,242,119,132, 55, 30, 77, 27,162,190, +216,250,175, 71,134,231,243,249,155,207,156, 57,211,173,127,255,254,130, 33, 67,134,132,157, 58,117, 42,172,176,176,240, 94,181, +245, 32,108,200,144, 33, 97,158,158,158, 88,183,110,157,158,207,231,111,110,225,223,212, 62,244,138,138,138,110, 1,248,250,224, +193,131,171,103,207,158, 13, 47, 47,175, 16,165, 82,249, 95, 45,179,163, 68,210,125,230,218,181,148,144, 36,121,223,125,253,181, +227,154, 11, 23, 86,239,221,183, 79,240,252,243,207, 19, 44,203,226,238,157, 59,178, 85,235,215,203, 39,141, 25,147,147,158,149, + 69, 29, 57,125,154, 44, 46, 44, 44, 43, 44, 41, 89, 10,160,204, 26, 63, 73,146, 87, 51, 51, 51,125,250, 13,120,222,247,226, 31, +247,146,198,143, 25, 57, 88, 40,224, 17,247,115, 10,110,122,123,185, 59, 37, 92, 56,107, 32, 73,242,170, 53, 30,157, 78,151, 77, + 81,148, 43,203,178, 30, 9, 9, 9,240,240,240, 64,121,121, 57, 72,146,132,217,108, 54,235,245,122,169, 90,173,134,209,104,132, +201,100,130,163,163, 35,238,222,189, 91, 76, 81,212,249,198, 56,105,154,158, 41,145, 72, 62, 19, 10,133, 98,145, 72,164,184,121, +243, 38,180, 90,109, 91,103,103,231,175, 40,138,130, 66,161,192,165, 75,151, 62,112,116,116,204, 1, 0,169, 84, 10,177, 88,226, +102, 50,153, 40, 0,133, 45,189,230, 44,203,182,184,190,188,188,188,252,101, 50,217,138, 15, 63, 92, 24,220,181,107, 55,148,148, +148,128, 97, 24,216,217,217, 65,175,215,195,209,209, 17,189,123,247,206, 94,177, 98,133,146,101, 49,203,154, 24, 84,169, 84, 37, + 2,129,224,173,217,179,103,127, 22, 24, 24,216,158,101, 89,116,236,216, 17, 67,135, 14,197,201,147, 39,145,145,145, 1,157, 78, + 71, 95,187,118,237, 87,165, 82,121,140,235,110, 57,112,224,192,225, 31,135, 63,249,102, 61,102,209,250,111, 66,165, 82,149,164, +165,165,157, 74, 76, 76,140,158, 56,113, 34, 18, 18, 18,166, 3,120, 31, 0, 36, 18,201,244,137, 19, 39, 34, 49, 49, 17,105,105, +105,167, 84, 42, 85,201,211,248, 79,177, 88,108, 52,155, 31, 25,167,164, 82,169,180,153,167,183,173,158, 50, 4,128,182, 77, 28, +107,220, 52, 34, 16,120,119, 30, 62, 92, 80,158,148,164,221,122,253,250,103,177,177,177,130,190,125,251, 18,164,197, 2,154, 97, + 16, 16, 16, 64, 12,137,136,176,251, 57, 54,214,149,214,233, 46,125,254,225,135,191,109,153, 57,179, 42,179,218, 15,204, 26, 76, + 38,211,250, 55,230,190, 22,113, 33,225, 55,223,144, 78,207,184,158, 58,115,225,150,155,155,147, 60,176, 67, 7, 59,117,121, 25, +189,100,209, 7, 2,147,201,244,157, 53, 30,131,193,112,232,236,217,179, 99,252,252,252, 60,238,221,187, 7,179,217, 12,154,166, + 49,100,200, 16,176, 44, 43, 1,192, 8, 4, 2,164,165,165,193, 98,177,168, 50, 51, 51, 21,247,239,223,151, 0, 88,105, 37,127, +185, 38,147, 9,169,169,143,102,237, 90,183,110, 29, 25, 21, 21, 5,138,162, 48,124,248,112, 28, 57,114, 36, 50, 53, 53,117, 77, + 93,205,247,164,117, 94,109, 33, 11,246,241,241, 57, 88,125,200, 38, 39,120, 95, 95,223,176,128,128,128, 77, 43, 87,174, 20,181, +110,221, 26, 44,203,194,197,197, 25,122,189, 30,165,165,106,132,132,132,192,207,207, 15, 43, 87,174, 4,128, 95,109,181,184, 41, + 20,138,251, 10,133, 98,162, 74,165, 18, 85, 84, 84,132, 71, 70, 70,174,139,136,136,192,173, 91,183,240,219,111,191, 77,146, 72, + 36, 42,139,197, 66,121,121,121,205, 34, 8,194,209, 98,177,236, 82,171,213, 74,174,239,226,192,129, 3,135,127, 4,106,124,180, + 80,231,189,121, 22,173,224,224, 96,187,156,156,156,169,109,219,182, 21, 3,128, 76, 38, 11, 9, 8, 8, 88,144,149,149, 85,217, +220,220,232,245,250,189,177,177,177, 67,191,249,230, 27,209,200,145, 35,159, 57,120,240, 96, 79, 0, 24, 57,114,228, 51, 14, 14, + 14,136,141,141,181,232,245,250,167, 22, 19,137, 36,201,254, 61,122,244, 64, 89, 89, 25,114,114,114,154, 53, 45,115,236,216, 49, + 57, 30,249,101, 53,121,172, 41, 80,102,179,139,179,175, 47,175,240,194, 5, 75,153, 86,235,221,127,192, 0,130,180, 88,192,227, +241,160, 86,171,145,151,151, 7, 39,103,103, 34, 45, 51,211,126,219,194,133,199,218,118,237, 42,166,205,102,183,102,100, 83, 87, +170, 42,158,241,246, 91,111, 30,218,181,235, 87,143, 10,173,246,129, 76, 38, 55, 73, 36, 34,175,121,111,191, 77,151,149,149, 77, + 3, 80,101, 3,207,202, 93,187,118, 13, 31, 62,124,248, 29,127,127,127,207,146,146, 18,175,138,138, 10,186,172,172,140,143, 71, +190, 86, 4, 0, 92,184,112, 1, 90,173,150,162,105,250, 18, 30,197,194, 50,219,154,209, 54,109,218, 56,133,135,135, 15,244,240, +240,128, 70,163,129,155,155, 27,186,117,235, 54,144,207,231,255,152,155,155,171,121,154,173, 62, 62, 62,222,129,101,217,231, 88, +150,197,240,225,195,109, 58,135,166,233, 87,163,162,162, 68, 4, 65,192, 96,208, 67, 42,149,193,206,206, 30, 14, 14,142, 8, 12, + 12,130, 66,161,192,176, 97,195,204, 15, 30, 60,216,168, 84, 42,155,221, 70, 53, 26,205,232,222,189,123,207,159, 59,119, 46, 40, +138,194,232,209,163,145,159,159,191, 38, 59, 59,123,143,143,143,207,228, 87, 95,125,213,195,205,205, 13,243,231,207,151, 1,248, +148,235,187, 56,112,224,192,225, 31,129,250, 62, 90,127,182,104, 53, 53, 39,234,229,229,213,143, 32,136,143, 13, 6,131,184,102, + 74,134, 32, 8,177,135,135,199, 17,131,193, 16,163, 84, 42,155,229, 20, 87, 81, 81,161,125,248,240,225,145,171, 87,175, 78, 24, + 59,118, 44,226,227,227,167, 1,192,216,177, 99,113,245,234, 85, 60,124,248,240, 72, 69, 69,133,246,105,148,220,215,215,119,196, +128, 1, 3,198,246,232,209, 3,113,113,113,160,105,250, 74,115,206,175,187,194, 16, 13,172, 58,172, 57,102, 19, 25,159, 15,130, + 32, 64, 81, 20, 0,160,180,164, 4, 25,233,233, 40, 43, 47,135,201,104,132, 78,175,167, 3,219,181, 51,104,204,102, 33, 1, 52, +119,238, 43, 55,241,198,181, 60,189, 78,231,233,230,226,106,144,203, 37,168,208,106, 68, 55,111, 92,171, 2,240,192, 70, 14, 51, +203,178, 3, 78,158, 60,185,148,207,231, 79,180,183,183,199, 27,111,188,193, 31, 56,112, 32, 68, 34, 17, 76, 38, 19, 42, 42, 42, + 16, 27, 27, 91, 66,211,116,251,234,115,236,229,114,249, 14, 62,159, 95, 80, 89, 89,249,177,213, 63, 48,155, 71, 70, 71, 71, 11, +204,102, 51, 62,255,252,115, 44, 91,182, 12,195,135, 15, 23,220,184,113, 99, 36,128, 93, 79,171,197, 51, 12,131,200,200,200,186, +206,240,169,182,156, 39, 20, 10,195, 58,116,232,128,146,146, 18,148,148,148,192,195,195, 3, 62, 62, 62,240,242,242,194,154, 53, +107,216,117,235,214,157,178, 88, 44, 27, 75, 75, 75,139, 91,208, 22,103, 77,155, 54,109,214,132, 9, 19, 80, 85, 85,133,171, 87, +175,162, 79,159, 62, 88,189,122,181,247,165, 75,151,222,239,209,163, 7,132, 66, 33, 18, 18, 18, 64, 81, 84, 62,215,111,113,224, +192,225,127, 13,255, 80,255,172, 38,209,164, 69,203,207,207,207,153,166,233, 15,162,162,162, 34,199,140, 25,131, 97,195,134, 61, +246,251,174, 93,187, 28, 14, 28, 56, 16,179,126,253,250,225, 22,139,101,101,115,166,250, 24,134, 57,180,107,215,174,145,207, 63, +255,188,124,208,160, 65, 1, 0, 32,145, 72,204,187,118,237,210, 51, 12,115,168, 5,101,169, 9,238, 88, 12, 0, 62, 62, 62, 93, + 4, 2,193,216, 17, 35, 70,116,153, 49, 99, 6,146,147,147, 17, 27, 27,123, 63, 48, 48,240,114,113,113,179,158,145, 57, 86, 86, + 29,198, 88,179,110,241,197, 98,117, 69, 81,145,179,189,191,191,208,197,193, 65, 25, 23, 23,231, 23, 17, 17, 65,228,231,231,163, +188,188, 28, 70,163, 17, 55,110,220, 96, 4, 64,174,192,197,133,200,189,122,149,224,139,197,106, 60,190,146,207, 42,252,188, 93, + 58,126,178,104, 78, 91,163,201, 24,170,209,104, 40,129, 80, 40,108,237,229,156,159,254,160, 89, 51,113, 38,185, 92, 30, 14, 64, +192, 48,140,222,213,213, 85,126,230,204, 25,136,197, 98, 16, 4,129,206,157, 59, 67, 42,149,138, 88,150,205, 3, 0, 7, 7, 7, +241,230,205,155,157, 38, 79,158,252,155, 53,226,238,221,187, 11, 37, 18,201, 11,129,129,129,184,122,245, 42,238,221,187,151,123, +245,234,213, 54,221,187,119,135,191,191,255, 11,222,222,222,251,110,221,186, 69, 62,141,134,253,104,197,106,243,157,225,105,154, +102, 8,130, 0,143,199, 3,195, 48, 40, 41, 41, 65,251,246,237,177, 97,195, 6,172, 93,187,246,115,165, 82,121,180, 37,249, 9, + 14, 14, 22,181,111,223,126,218,132, 9, 19,144,149,149,133,152,152,152, 82,165, 82,121,225,244,233,211,227,230,206,157,203,239, +211,167, 15,212,106, 53,126,254,249,103,234,230,205,155, 63, 21, 21, 21,237,228,186, 92, 14, 28, 56,112,248, 23, 11, 45, 63, 63, +191, 9, 34,145,104,254, 75, 47,189,196, 15, 10, 10, 66,113,113, 49, 28, 29, 29, 73,130, 32,132, 0,224,236,236, 76,202,100, 50, +204,153, 51, 7, 93,187,118,237,183,112,225,194, 62, 2,129, 96,131, 66,161,216, 97,203, 31,171, 84, 42, 61,143,199,219,255,198, + 27,111,172, 76, 74,186,213, 30, 0,254,248,227,143,135, 10,133, 98,145, 74,165,210, 55,179, 28, 53, 65, 49, 9,137, 68,122,189, + 99,199,142,217,225,225,225,142, 99,198,140,129,135,135, 7, 18, 19, 19,177,106,213,170, 76,179,217,188,244,226,197,139,212,127, +251, 34, 83, 38, 83,209,205,195,135, 29, 6,190,242,138,227,188,168,168,175,223,124,227,141,111, 62,249,228, 19, 65, 80, 80, 16, +161,215,235,113,253,250,117,246,192,129, 3,228,207,159,125,182, 22,118,118,194,171, 7, 14,136,205,102,115,110, 51,173, 37, 3, +250,246,239, 23,244,245, 55,235, 97, 52, 84,225,250,149,227, 40, 47, 47,193,230, 45, 7,131,124,125,217, 1,133,133,133, 23,109, +229, 34, 8, 34, 48, 62, 62,222,147,101, 89,136,197, 98,172, 88,177, 2, 62, 62, 62,112,116,116, 68,101,101, 37,222,127,255,125, +167,119,223,125,215, 9, 0,146,147,147,107,195, 51, 88,131, 66,161,232, 61,103,206, 28, 7,138,162,112,234,212, 41, 51, 65, 16, + 31,159, 61,123,246,199,206,157, 59,139,251,245,235,231,176,115,231,206, 62, 0, 18,158,150,208,106,225,121,247,207,156, 57,211, + 99,226,196,137,172, 80, 40, 36, 42, 42, 42,224,236,236,140, 13, 27, 54,232,148, 74,229,241, 22,183, 1,138, 18,203,229,114, 49, +203,178,216,191,127, 63,114,115,115, 95, 85,171,213, 69, 52, 77, 31,252,224,131, 15, 22, 4, 5, 5,181, 75, 79, 79,207,173,172, +172, 92,173, 82,169,178,185,174,137, 3, 7, 14, 28,254, 81,168,113,130,175, 89,125,120, 28,143,166, 19, 27, 23, 90, 52, 77,207, + 57,125,250, 52,159, 97, 24,108,217,178, 5, 55,111,222,100,229,114,249,199,114,185,252,123,153, 76, 70, 27, 12,134,217,175,191, +254,250,228,101,203,150,241,250,245,235,135,171, 87,175,242,218,183,111, 63, 13, 64, 93,161, 21,129, 38, 98,109,104, 52,154, 27, +197,197, 69,237,235, 4,168,108, 47,145, 72,111, 88, 41, 76,125,206,250, 65, 49,123,173, 88,177, 66,231,237,237,109,190,119,239, + 30, 54,109,218,196,220,188,121,243,130, 88, 44,222,172, 84, 42, 77, 54,114, 62, 13,212,114,138, 41, 42,241,151, 5, 11,130,159, + 29, 61,154,121,109,254,252, 42,145, 76,246,206,215,235,215, 47,172,168,172,244, 1, 65,176,110, 78, 78,185, 91, 86,172,136, 25, +254,194, 11, 85,201, 23, 47, 74,147,226,227,133, 30, 36,121,187, 57,249, 44, 44, 44,188,152,144,240, 27,182,111,253, 6, 22,139, + 9,202,194, 71, 58,173, 84,173,129, 21,145,245, 39, 78,138,162, 52,227,198,141, 19, 1,144, 77,153, 50, 69,172, 82,169,240,204, + 51,207, 0, 0,180, 90, 45,142, 31, 63,142, 78,157, 58, 1, 0,238,222,189, 91,251,217, 90, 62,237,236,236, 94,232,211,167, 15, +114,115,115,145,156,156,124, 78,169, 84,170, 1,156,203,207,207, 31,217,163, 71, 15, 28, 58,116,104, 84, 19, 66,171, 89,117,100, +163,208,250, 19,167, 76, 38, 91,116,240,224,193, 87,175, 92,185, 50,113,193,130, 5,194, 33, 67,134, 0, 0, 42, 43, 43,245, 0, +232,150,112,214,205, 19, 73,146, 96, 24, 6,174,174,174, 58,181, 90, 13,149, 74,149,173, 82,169,222,120,240,224, 65,139, 56,159, + 70,251,228, 56, 57, 78,142,147,227,252,155,112,254, 27, 96,123,100,120,150,101, 41,134, 97,144,144,144,128,131, 7, 15,210, 22, +139,101,150, 82,169,188, 91, 39,201,250,196,196,196,248,113,227,198,237, 72, 79, 79,231,167,164,164,128,101, 89,186, 57,185, 49, + 26,141, 36, 65,252,249,216,147,150,114,251,246,237, 40, 42, 42,178,228,231,231,159,165, 40,234,208, 19,174, 94,124,226, 85,135, +219, 1,211,203,102,243,217,101,125,251, 70, 46,141,143,151,188,246,209, 71,166,233, 51,102,124, 64,155,205, 36, 95, 36, 98,196, +118,118, 60, 90, 34, 17, 38, 95,188, 40, 93, 55,119,174,171,193,100, 58, 21,219, 12, 7,243, 26,139,214,192,129,253, 48,253,181, +247, 96,168, 99,209,186,122, 35, 3, 38, 11,154,101,209, 50,153, 76,161, 74,165, 18, 82,169, 52, 15,128,215,212,169, 83,193, 48, + 12, 12, 6, 3, 42, 43, 43,161, 80, 40, 52, 51,102,204,160,171,197,147, 96,236,216,177,142,182,240, 6, 4, 4,248, 8,133, 66, +156, 58,117, 10, 66,161,240, 56, 0, 8,133,194,227,241,241,241, 35, 39, 77,154, 4, 95, 95,223,128,172,172, 44, 2, 86,252,211, + 60, 67, 71,239,101,129,142, 32,208,225,145, 9, 14, 29, 60, 66, 71,223, 33,128,204,234,168,241,169,221,187,119, 7,108,244,203, +170,139,234,197, 29,107, 73,146,220,183,112,225,194, 55,122,245,234, 53,116,217,178,101, 4, 0,254,211,184, 3, 41,138,122,162, +208, 19, 28, 56,112,224,192,225,111,109,213,250, 19, 26, 21, 90, 4, 65,108, 25, 48, 96,192, 44, 0,124,130, 32, 54, 41, 20,138, +187,245,211, 40,149,202, 12, 31, 31,159,175,218,181,107, 55, 27, 0, 75, 16,196,150,102,102,170,152,101,177,138,199, 35, 22, 62, + 18,119, 45, 10, 80, 89,179,213,201, 66, 0, 4,143,199,223,113,235,214,173,143,242,242,242, 74,108,180, 64, 52,137,167,177,234, + 16, 0,126, 5,178, 95,202,205, 61, 61, 63, 44, 44, 98,248,220,185,232, 50,124,184,163, 79,155, 54,180,193, 98, 97,238, 94,190, + 76, 92,217,191, 95,148, 20, 31, 47, 52,152, 76,167, 14, 1,121,205,205,103, 97, 97,225,197,243, 23, 46,158, 25, 63,118,228,208, +128,118, 62,143, 68, 67,182, 2,165,101,154, 51,205, 17, 89,245, 68,239,232, 13, 27, 54, 28, 21,137, 68,130,186, 91,217, 88, 44, +150, 50,147,201, 20, 10, 0,229,229,229, 62, 91,182,108,217,205,227,241,114,173,241,165,164,164, 28, 89,186,116,233,216,156,156, +156, 51,249,249,249, 57, 0,144,151,151,151, 67,146,228, 14,165, 82, 57, 54, 55, 55,247, 0,108, 88, 4,192, 2, 29,147, 47,239, +235, 12, 0,161,125, 39, 32,249,242, 62, 41,128,206,161,125, 39, 0, 0, 90,186,151, 97, 93, 84,135, 86,248,248,234,213,171,187, +134, 14, 29,250, 58,158, 32,166, 23, 0,152,205,102,210, 96, 48, 80, 52, 77, 11, 44, 22, 11,107, 54,155, 73,174, 79,226,192,129, + 3, 7,219,193,178,108, 15, 0, 30,213, 95,107, 12, 40, 30,245, 62,155, 81,189, 93, 96, 77,247, 91,253,189,132, 32,136, 27,117, + 56,106,143,219,112, 46, 0,148, 2,184, 67, 16, 68, 99, 70,144, 45,141,125,111, 84,104, 41, 20,138, 3,176, 97,211,104, 91,211, + 53,129,197,213,251,196, 1, 45,223,219,173,150,131,166,233,226,188,188,188, 39,174, 80, 30,143,151, 61,106,212,168,102,165,183, +150,102, 15,144,251,182,201,180, 51,238,187,239,186,157,218,180,201,151,166, 40, 55, 2, 96,249, 98,177,218,108, 54,231,120,144, +228,237,230, 90,178, 30,179,198, 60, 44, 28,150,245,176, 16, 29, 58,116, 96,239,223,191,255,200,214,243,100,184,173,211,233,252, +172, 53, 1,189, 94,223,207, 70, 49,248,107, 97, 97,225,175, 13, 8,246,221, 74,165,114,183,173,153,170,221, 84, 26,224, 49, 4, + 51, 62,180,239,132,253, 0,152,154, 77,165,159, 38,138,138,138,210, 81, 29,231,237, 73,144,155,155,107, 34, 8,226,151, 85,171, + 86, 77, 73, 74, 74,218,163, 80, 40, 76, 92,183,201,129, 3, 7, 14,205, 19, 89, 4, 65,196, 85,127,143,174, 54, 10,197,213,255, + 92,147,166, 38, 93,221, 52, 53, 28,245,143, 55,117, 46, 0, 44, 90,180,232,163,152,152, 24, 57, 0, 91, 55, 99,110,241,166,210, +127, 21,138,255, 38, 28,117, 69,193,214,191,162,160,223, 1,102, 80,212, 53, 80,117,124,242,201,167,107,220,184,127,255, 62,241, +111,190,225,106, 54,149,174,131,176,127, 66,190,115,114,114, 54,248,251,251,111, 86, 40, 20, 20, 56,112,224,192,129, 67,115,224, +209,144, 48,106, 68,148, 69, 55,245,251, 99, 3,247, 6,210, 53,244,157, 32,136,184,152,152,152,232,102,228,183,214,162,197,227, +234,142, 3,135,255, 30,254, 63, 86,189,114,224,192,129, 3,135,134, 81,223,138, 85, 35,190,234,127, 95,180,104,209, 71,104,122, +198,201, 27,143,172, 88,222,213,223,107,253,181, 8, 60, 90, 57,208, 16,154,179,154, 32,162, 5,229, 59,203,113,114,156, 28, 39, +199,201,113,114,156, 28,231,255, 28,167, 53,238,179, 13, 8,162,168,198,166,250,154,154, 70,172,255,217,218,185,214,210, 18, 4, +209, 88,152,159,154,169,194,250,239,127, 57, 34, 56, 78,142,147,227,228, 56, 57, 78,142,147,227,228, 56,159, 4, 44,203,246, 96, + 89, 54, 10,143, 22, 76,177, 44,203, 70,177, 44, 59,124,209,162, 69,139,107,142, 45, 90,180,104, 49,203,178, 67,106,210, 85,167, +169, 61,167,230, 88,253,247,250,199,154, 74,219, 68, 22,103,213,251, 92,251,253,239,226,163,197,129, 3, 7, 14, 28, 56,112,224, +208, 32,106, 86, 12,214,177, 54,149, 0,184, 27, 19, 19, 83, 94,199,119,170, 4,192,109, 0, 93,171,211,149, 84,139,180,186,190, + 85,230,234,239,230, 6,210,152,109, 73,219, 8,182, 52,242,153, 19, 90,141,161,171, 23,239, 51,255,214,158,225,213, 21, 0,150, + 97, 0, 0, 76,117, 12, 36,182, 38, 24, 18,195,128,101, 89, 40, 84, 21,137,119, 85,248,164,165,255, 23,232, 3, 87, 79,169,116, + 45,195,178,125,171, 15, 93,212,168, 77,239, 37,107, 81, 97, 43, 71,167, 86, 8,150,242,240, 1,195,162, 11, 0,240, 8,220, 49, + 50,248, 42,173,184,249,241,164, 26,106,231,161, 30,152, 37,150,201, 95,114,114,118,233, 80, 94, 94,154,105, 49,154,246,165,148, + 96, 51,154,191, 47, 35, 2, 92,240, 28,195,226, 35, 0, 60, 33, 15,107, 50,203,108, 94,201,193,129, 3, 7, 14, 79,106, 29,121, +162,184,120, 4, 65,208, 13,112, 18, 79,200,201, 5,216,179, 65,108, 53,112,248,143, 6,142,221,248, 59,229,187, 89, 66, 43,196, + 3,115, 65, 96, 57, 0, 22, 44, 62, 77, 41,193, 15,205, 58,223, 27, 17, 82, 62,127, 27, 0,190,209, 66,207,103, 25, 92,106,240, + 98,242,208, 95, 42,226,175, 1,192, 24,105,122,102,138,210,118,127,177, 80, 95, 12, 23, 48,188, 95, 24,150, 21,210, 12,187, 3, + 44,226,236, 69,248,253, 90, 33,140,205,201,171,127,107,207,240,195,127, 40,135, 94,248, 97, 30,122,117,121, 6, 44, 77, 1, 12, + 9,121,191, 15,112,238,219,169,232, 21,236, 15,150, 33, 1,134,130,253,136,175, 49, 34,204,137,189,171,106,217, 62,216,129, 62, +112,109,227,238,121,111,235,214,109, 94, 62, 1, 33, 4, 67, 89,144,254,199,153,201,239, 46, 92, 58, 56, 20,154, 48, 91,196, 86, + 23,111,188,230,223, 54,232,131,247,150,127,195,247,246,241,179, 99, 72, 19, 85,148,157,218,125,253,234,165, 7, 68,188,220, 53, +119,148,216,102,107, 91, 14,241,192,108,129, 68, 60, 65, 38,181,235,160,215, 87,222,167, 45,228, 62,158, 80, 48,252,171,175,215, +118, 27, 24, 57,210,158,174, 44,226,145, 12, 66,246,238,217,221,230,187, 13, 27, 71,222, 83,210, 47, 0, 96,154, 83,102,134,197, +194,140,157,179, 70, 10, 5,124, 34,248,213,173,124,128,106,145,208, 10,246,196,203, 4, 11,171,225, 37, 88, 2,191,165,170,240, +107, 75,254,163,147, 39,126, 36, 88, 4,130,192,126,130,197,238,148, 18,168,184, 46,143, 3,135,127, 23,120, 60,222, 5,134, 97, + 6, 61,101, 97,240, 28,203,178,215,184,171,251,191,141,230, 89,180, 8,124,158,252, 32,223, 5,180, 5,161,129, 1,159, 1,205, + 19, 90, 82, 62,127,199,141,204, 98, 47, 80, 22,108,253,226,141, 61,102, 18,160, 72, 11,104,138, 4, 77,145,160, 40, 11,104,146, + 4, 75,154,176,244,167, 11,128,185, 18,225, 97, 29,119, 0,180,183,173,255, 33,100,121,191, 36, 94, 62,227, 74,152, 53,248,245, +135,152,183,243, 75,170,222, 62,123, 71, 81, 26,226,105, 88,156,162,194,207,205, 17, 4, 23, 54,205, 67,236,161,227, 5,235,126, +212,165, 49, 44, 11, 87, 71, 89,208,228,232,100,191,157, 71, 46,228,175,221, 97, 76, 3, 0, 39, 59,113,208,180, 59,153,254, 79, + 82, 9,158, 82,233,218,205, 27,191,243,242,118,147, 17,212,149,149,160,104, 26,126,109,162,248,139,223,154,236,253,249,183,219, +190,133,214, 52,189,169,243,131, 60, 17,210,182, 93,240,252, 29,199,175,248,235,180, 42,243,153, 93, 31, 61,128, 9,164,151,111, +176,240,179,152,111,248, 75, 62,156,247,190,153, 46,184,158,174, 66,138,181,190, 38,216, 19, 71, 98, 86,126,221,101,240,136,104, +123,166,170,132,111,212, 85, 5,110,253,105,219,242, 78, 93,122,202,251,133,181, 22,169,246,205, 33, 12,149,101,176,240,164,146, +193,161, 17,142,134, 41,147,200,173,219, 99,223, 74, 81, 97,125,115,202, 76,179,255,105,123, 12,211,242,168,235, 4,139,126, 73, +215, 46,204,166, 21, 55,192,210, 36, 64, 91,106,223, 65,147, 96,153, 71,239,189,230,252, 4,160,101, 66,139,199, 98,232,217,203, + 55,188,139,139,148, 61,190,253,250,203,197,236,141, 27, 39, 65,227,151,212, 50, 92,108,174,192,228,192,129,195,223,218, 98, 66, +177, 44, 43,120,202,156, 35, 89,150, 61,241,132, 52, 31, 0,120,173,250,243, 54, 0, 95, 61,133,172,181, 6,224, 85,253,185, 8, + 64, 1,215, 2,158, 8,245,157,223, 91, 28, 71, 75, 10,150, 1,246,143, 1, 0, 89,115,115,193, 2, 82, 16,124,128,212, 97,244, +136, 72,184,123,122, 1,164, 30,176,232, 1,210, 0,144, 58,128, 52,160, 84,153, 11, 88,116, 64,214, 73, 80, 44, 43,105,118,113, + 77, 26, 32, 99, 31,134,116,247,135,135,147, 20,243, 70,135,184,111, 57,149,177,109,219,153,244,136, 20, 21, 94,178, 41,175, 44, +139, 94,157, 59, 96,221, 54, 93,218,177, 91, 37,195, 0, 96,100, 87,183, 83,189, 66,218,248,173,221, 97, 76, 59,113,183,124, 56, + 0, 12, 15,117, 60,217, 51,200,219,159, 65,203,173,190, 12,203,246,243,105,219,129,160,147, 54,131,209, 22, 64,171, 53,160, 32, +123, 39, 92,124,159,229,209, 12, 6, 88, 59, 95,198,199,162,119,150,172, 18,234,181,197,102,198, 82, 66,123,240,203,249, 2, 49, + 67,160,240,162,169,138,169,160,223,155, 53,149,154,255,201, 23,139, 0, 76,110,138, 39,196, 19,111,173, 89,179,182,115,159,240, + 78,158, 69, 7,230, 17, 85,229,197,160,248,114,201,232,231,251,192,185, 99, 8, 83,156,176,134, 16, 7, 68,192,217, 45, 0,133, + 87,118, 33,231,218, 65,162,111,247,177,146,159,127, 21, 77, 1, 44, 13, 10,173, 14,238,232, 59,172,127,207, 61, 1,254, 62,222, + 44,203,128, 97, 88,176, 12,141, 42, 35,137,197,123,179, 64,211, 52,198, 13,235, 59,196, 78, 76,176, 12,195,128,101, 25,228, 23, +169,245,231,175,167, 13,201, 42,199,117, 91, 44, 85, 93,159, 27,212,247, 78,226,181, 78,100,198, 49,132, 79,142, 73, 35,128,203, +117,218, 92,223, 91,167,127,238, 4,252,212,114, 45, 71,128,206, 57,181, 18,254,253,103,241, 55,255,122,202, 67, 83, 82, 56,237, +192,206,141,227,127,216,188, 57, 54, 77,133, 57, 92,255,194,129,195,191, 3, 44,203, 62,117,177,149,155,155,171,120, 18,177,229, +235,235,219,191,176,176,112,117,141,183, 10, 65, 16,171,219,182,109,187,244, 63, 3,213,199,198,122, 26,154,166, 39, 23, 22, 22, + 94,106,138, 51, 42, 42,202,231,248,241,227,237,234,112,182, 3,208,174,161,180,206,206,206,116,239,222,189,115,142, 31, 63,174, +224, 90, 72,139, 4, 87,179,133, 86, 90,222,190,121,221, 77,202, 42, 0, 72,179, 33,253, 99, 83,126, 70,146, 94,185,125,249,212, +149,161,109, 93, 81,169, 51,227,204,205, 28,208, 52, 9,154,162,170, 45, 91, 20,104,138,196,176,174,238,232,109,156,131,245,113, +233,160,104, 38,166, 41,206,250,176,176,204,203,221, 34, 38,238,101, 24, 86, 44, 17,242, 52,129,126,110,158,243,199,117,229,205, + 27, 29, 10,131,133,154,184, 43,225,193,249, 84, 21,182,218,196,201,252, 57,228, 17,219,208, 49,154,178, 90,246, 38,172, 81,189, + 34, 6,246,115,100, 77, 26,144,165, 89,168,212,147,200, 82,147, 40, 50, 86, 64, 66, 40,109,226,100, 88,116,105,237,235, 45,255, +125,207,135,217,110,124,173,192,147, 79,137,196, 60, 10, 52,195,242,217,138, 20,147,107,167, 72, 97,141,223, 86, 83,249,148,201, + 29,166,246, 31, 26,229,148,183,107, 22, 33, 11, 28, 6,207,238,126,200,190,180, 29,170,155,113, 80, 43,114, 8, 71, 99, 5, 90, +185, 61,131, 17,147, 95,194, 87, 47,245, 64,165,182, 18,124,229, 3, 39,177, 80,226, 12, 88, 26,228,100,105, 76, 94,179,234, 11, +111, 1,159,247,232,122,214,188,104, 18, 6,147, 9,160, 41, 72, 5, 12, 8,182,230, 55, 18, 52,105,145,119, 25,251,225, 27, 0, +125,221, 90,217, 83, 85,248, 53,196, 3,253,192,144,157, 88,210, 0, 2,184,156, 82,242, 31,241, 19,236,137,151,159, 29, 54,163, + 31, 75,224,183,150,212, 81,152, 27,162,195,219,217,219,217,105,211, 80,176,255,109, 60,128,148,109,213,231, 53,188,252,234, 91, +242, 45, 91,182,140, 2,216,185,120,220, 71,237,175,216,100,149,227,228, 56,255,145,156,142,142,142,237,219,182,109,187,148, 36, +201,254, 34,145,168,149,197, 98, 1,195, 48, 69, 98,177,248,183,156,156,156, 21, 90,173,246,225,223,173,236,119,238,220,105,142, +216,178,202, 41, 20, 10,145,158,158,126,191, 25, 98,235,108,189,243,127,185,124,249, 50,246,238,221, 11, 0,200,200,200, 64,199, +142, 29,237, 26, 58, 49, 59, 59,219,110,224,192,129,191, 0,240,107,138,243,238,221,187,237,143, 29, 59,134,253,251,247, 3, 0, +210,211,211, 17, 24, 24,216, 96,102, 46, 95,190,204,127,229,149, 87,218, 3, 80,252, 23,234,232,223, 32,178,234,190,255, 71,104, +197,197,197,177,209,209,209, 68,253,207, 13, 32,203,223, 69,220, 29, 70, 26, 0,178,154,155,131,212, 98,172, 90,183,243,244,240, +115,251, 55,244,151,138,120, 88,182,117,126,126, 73, 89,229,115, 2,226,209,244, 11,197,130,231, 98, 47,190, 26, 51,173,171,127, +121,149, 17, 71,255, 40,188,148,162,106,158,137, 52, 69,137,120,128,113,126,244,141,134,209,160, 10,156,246, 85,252,238,221,139, +134,119,121,111,116, 23, 28,185,146,243, 30, 64, 89,141,250,206, 50, 12, 88,134,170,117,126,175, 30, 58, 0,204,227,155, 2, 51, + 96, 31, 29, 99,154,103,209, 26, 0, 8,202, 61, 49,194, 65, 46,254,126,246,236,215, 29,201,146, 76,148,153, 69,200, 47, 55,162, +200, 32, 68,149,192, 19,133,105,119,105, 30,129,120,171, 38, 23, 2, 90,150, 50, 58,187,136,237,121, 97,145,111,248,106, 79,125, + 84, 46, 38, 40,190,227,139,159, 59,151,158,251, 38,135,210,149,232, 8, 2, 86,195,207, 59, 57, 57,119, 52,170,115,248,154,242, + 82, 56,123,133, 98,248,196,104,124, 26, 21,130, 74,173, 14, 37,101, 87,217, 14,222,142, 68,238,111,177, 88, 50, 34, 24,234, 98, + 37, 76, 36, 64,232, 76,101, 70,179,177,170,209,235,200,195,230,119, 23, 44,124,185,141,183,135, 93,205,162, 2,150,161,209, 53, + 56, 0,145,253,123, 33,254,242,239,184,113, 55, 3, 76,245,162, 2,150, 97, 80,160, 42, 47, 54, 90,232,237,205,186,160, 52, 5, +150, 52, 54, 40,196,208,130, 41,195, 48, 79,200,105,224,147, 30,237, 29,102, 46,138,110,227, 96, 39, 33, 96, 36,105, 24,205, 36, + 42,127,255, 30,110,109, 59, 67, 46,149, 18,221, 97, 16,220, 2,184,125, 11, 57,112,168,131,241,227,199, 75,139,139,139, 19,252, +252,252, 66, 34, 35, 35,229,253,250,245,131, 78,167,195,153, 51,103,160,211,233,218,248,249,249,181, 57,115,230,204,216,188,188, +188,148,214,173, 91, 15,220,191,127,191,205, 62,180,213, 2,136, 95,219, 5, 3, 20, 65, 16,168, 62, 70, 84, 31,107,241, 62,183, + 98,177, 24,185,185,185, 79,221,178, 85, 88, 88,120,191, 37,150,173,170,170, 42,145,175,175, 47, 60, 60, 60, 64,211, 52,116, 58, + 29, 14, 31, 62, 12,141, 70, 3,134, 97, 32,147,201,240,249,154,173, 72,187,149,128,235,215,175, 67,163,209,136,172,113, 22, 20, + 20, 16, 93,187,118,133,201,100, 2, 69, 81, 48, 26,141, 56,123,246,108,237,119,129, 64,128,133,159,125,139,140,155, 9, 72, 74, + 74, 66, 65, 65,193,127,101,183,145,102,104,145,191, 35, 26,141,153,245, 95, 95,117, 72,211,212,226, 45, 59,118, 95, 93, 60,231, + 37,188, 53, 41,194,111,197,134,131, 17,169,165,216, 1, 0,193,238,152, 54,101, 80, 7,127,103,185, 16,159,238,186, 9,176,236, +226, 39,253,191,228, 50,100,132,180, 98,222, 59,116, 61, 55,225,163,151,186, 35,192,219,177, 99,185,184, 76,156,149,101,195,158, +130, 12, 5, 23,123, 73,208,200,174,110,167,192, 48,112,118,144,116, 2, 77,193,217, 94, 18, 52, 60,212,241, 36, 0, 56,202,133, +157, 26,178,124, 53,134,112, 63,225, 44,185, 68, 48,203,206,193,217,127,250,168, 72,217,200, 81, 99,101,246, 66, 10,234,235,103, +160, 21,182, 6,233,218, 6, 38,178, 12, 5, 15, 31,208,231,174,165, 22,150, 86,154,230, 91,205, 38,139, 75,133, 15,211, 61,218, +119,137,116, 41,141, 91,162,106, 63, 99, 87, 59, 30, 24, 94,101,236,139,197,118,158, 61,101,127,100, 61,172, 98,216, 6, 45, 58, +143, 65,171,209,228,144, 52,188, 13,180,192,225,193,133,159,177,104, 68,103,148,151,169, 96,180, 80,208, 24, 40,139,151,179, 84, + 98,122,120, 15, 38, 11, 5, 51,201, 64,232,236,139, 51, 87,239,150, 50, 36,121,178, 49,206, 44, 53,146,178, 14, 39,217,215, 61, + 22,224,142,174, 31, 58,202,146, 64, 26,144, 91,160,192,142,227, 87,187,103,169,145,244, 36,245,204, 50,212,163,233,231, 58,150, + 44,130, 69,191,150, 56,193,119,242, 68, 79,145, 84,244,221,234,247, 94, 9,121, 62,208, 85,194, 20, 92, 5,193, 88, 96, 71, 11, + 96, 16,211,112,242, 11, 0, 99,174,100,245, 70, 99, 69, 50,192, 69,122,231,192,161, 14,130,130,130,188, 10, 11, 11,147, 23, 44, + 88,224,250,226,139, 47,226,208,161, 67,208,106,181,216,190,125, 59,214,174, 93,139,229,203,151,131, 36, 73,108,217,178, 69,126, +224,192,129,158, 27, 55,110, 44,240,247,247, 15,205,203,203, 43,178, 34,176, 8, 0, 18, 0,194,234,103, 23, 1,128, 57,113,226, + 4, 70,142, 28,137, 19, 39, 78, 48,213,199,104, 60, 26,252,180,104, 63, 81,177, 88, 12,177, 88, 12,141, 70,243, 84,196,150, 80, + 40,132,189,189, 61,196, 98, 49, 42, 43, 43,155, 45,182, 40,138,226, 23, 20, 20, 64,163,209, 32,114,212, 40,124, 27, 19,131, 65, +131, 6, 33, 50, 50, 18, 44,203,226,236,217,179,136,232, 19,134,151, 94, 24,136,212,212, 84, 80, 20,101, 83,126,139,138,138, 80, + 92, 92,140,225,163, 70, 97,235,198,141,232,213,171, 23,130,130,130, 64, 81, 20, 18, 18, 18, 48,126, 88, 31, 72,199, 68, 32, 35, + 35,131,107,212,182, 91,179,158,138,143,214, 19, 35,185, 4,215,152, 35, 23,227, 38, 13,235, 25, 61,170,111, 8,182,238, 57,247, + 5, 60,180,187, 1,192,205, 36,249,124,234,160, 0,164,228,149,227, 92,146, 34, 46,181, 20, 79,101,181, 6, 67,195,221,205, 81, + 14,240,197, 48, 88, 24,202, 49,203,186, 3, 51,195,178,144,247,255, 16, 83, 70,165,248,245, 10,241,243,171, 89,117,104, 63,242, + 27, 76,187,123,223,191, 71,144,151, 63,104, 18,160, 73, 56,190,180, 11,248,204,206,106, 62,250,180, 19,199,191, 59,111, 94,239, + 17, 99, 38,202,196,114, 39,208,218,124,144, 69,119,161,206,188, 4,157,188, 35,138,114,179,176,247,244,117, 77,102,129, 90,203, +227,225, 76,177,198,244, 65, 86, 57,170,172,241, 26, 73,196, 44, 93, 50, 63,106,239,238, 61, 14,146,128,190,196,131,239, 71,106, +196, 2, 74,226,209,238, 89,158, 94,234,206,126,185,125,143,163,206,140,149,214,120,244, 58,237,193,179,103, 78,189,212,161,125, + 95,135,236, 27,199, 97, 48,154, 96, 34,129,208,158, 3, 65,211,172,152,224, 17,140, 35,159, 79,168,212,229, 32, 72,186,248,183, +219,217,202,203,183,179,248, 38, 7,172,108, 50,186, 72,125,117, 79,240,223, 25, 53,176, 27, 64, 26, 70, 17,235,254, 0, 0, 32, + 0, 73, 68, 65, 84,240, 66,255,206,248, 54,246,220,219, 0, 61,227,201, 42,249,145, 69,139, 5,250,134,120, 96, 19,203,162,239, +205,195,107, 59,133,143,121, 23,205,177,104,133,186, 99, 68,112,123,159,159,191,253,252, 67, 87,183,214, 29,249, 4, 67,130,245, +234, 2,104, 11, 88,162,224, 42,156,124,123,129,246,233,131, 45,235,191,174, 98, 24,118, 55, 0,110, 73, 54, 7, 14,117,251, 35, +163,241,224,170, 85,171, 92,163,163,163,107, 44, 50,184,122,245, 42,182,109,219, 6, 59,187,199,251,201,145, 35, 71,130,101, 89, +215,101,203,150, 29, 4,240,124, 99,156,189,123,247, 30,149,148,148,164,232,214,173, 91, 86,181,216, 18, 1,224,221,187,119,143, +151,159,159, 79,184,184,184,176, 62, 62, 62,164, 66,161, 96, 0,208,175,190,250, 42,127,223,190,125, 29,116, 58,221,197,150, 10, + 45,177, 88,252, 84,124,182,132, 66, 33, 8,130,128, 88, 44,134, 72, 36, 2,203,178,205, 18, 91, 52, 77, 11, 78,156, 56,129,155, + 55,111, 98,121,183,110,120,207,215, 23,174,174,174, 72, 72, 72, 0,203,178,176,179,179, 67, 89, 89, 25,118,239,222,141,193,131, + 7,131,162, 40,145, 45,188,251,247,239, 71, 98, 98, 34, 62, 11, 15,199,123, 78, 78,176,183,183,199,217,179,143,102, 3, 37, 18, + 9,114,115,115,113,246,236, 89, 12, 28, 56,144,107,212, 79, 8,155, 27,207, 0, 64, 80, 70,192,203, 98, 54,128,165, 88,128,128, + 79,112, 48, 68,169,169,143, 59,231,216, 2, 30, 15, 75,214,239,136,139,250,230,221, 81,196,172,209,221,125, 86,252,124, 97, 46, + 0,204, 28, 23,232, 43,151, 8,176,238, 72, 10,203,227, 97,201,211, 40, 96,112, 48, 68,132, 26,115, 35,123, 5, 65, 81, 97,198, + 3, 69,197,249, 84, 27,167,122,206,125, 51, 5, 59,143, 38,228,175,221,105, 76, 99, 89, 22,206,246,146,160,105,119, 30,248,255, +124, 34, 49,111,205, 94, 99, 26,203,176,112,150, 11, 59,205, 72,237, 99,117,213, 97,184,159,112,214,251,243,231,247, 25, 61, 99, +129,148, 74,219, 7,243,131,211, 96, 44, 6,104, 45, 34, 84,240,189, 80,144,151,135, 47,183,196,229,107,117,230,151,146, 75,154, + 39, 48, 51,213,168, 18, 16,218, 23,191,252,244,163,248,152,207,151,217, 27,178, 18,170,248, 4,101,224,183, 29, 32,248,124,249, + 55, 68,165,201, 60, 49,171, 28,149,214,120, 76, 14, 88,185,106,205,250,168,215, 39,143, 77, 11,236, 56,192,141, 86, 60,116, 51, +106,181,170, 93,167, 18,189,170, 71,138, 4, 0, 60, 40, 80,163, 68,163,163,104,138,188,232, 32,196,138, 20, 91,172,131,213,104, +239, 9,143,232,190,161,175,120, 56,136, 96,168,170,128,167,131, 16,195,122, 61,243, 10,249, 71,198,135, 15, 85,205,145,107,245, +133, 22, 9,150, 52,224,218,202,193,157, 88,154,236, 4,154,132,229,206, 47,205,183,140, 17,120,239,173,254,246,142, 46,230,108, + 30,116,118,128,204, 29,132, 99, 27,192,169, 29, 33, 12,158, 8, 69, 86, 50,245,246, 43,147,213, 15,115, 10,126,116,151, 61,149, +149, 63, 28, 56,252,171,144,155,155, 59,117,241,226,197,151,123,245,234,213,202,221,221, 29,157, 59,119,198,209,163, 71,177, 96, +193,130,218, 52,221,186,117, 3,203,178, 40, 43, 43,195,170, 85,171,138, 20, 10,197,212, 38, 7,232,201,201,105, 59,119,238,236, + 31, 18, 18, 98, 17,137, 68, 21, 0, 36, 21, 21, 21,210,178,178,178,255, 99,239,188,195,162,184,218, 40,126,166,108, 99,233,101, +233, 69, 69, 65, 81, 20,123,195,168,177, 69,197, 88, 98,141,198, 22, 21,141,137, 26, 19,187,209,152,196,110,212,196,174, 73,236, +189, 99, 98, 33,177, 23,236,130,128, 40, 42, 74, 89,122,103,251,148,239, 15,202, 7, 74,217, 5,211,204,252,158,103,158,217, 50, +123,118,102,238,204,220, 51,239,189,247, 29, 66,163,209,128,227, 56,206,218,218,154, 77, 74, 74, 50, 12, 25, 50, 68,123,237,218, +181,186, 5, 5, 5, 47,106, 18,209,242,240,240,136,200,200,200,200, 33, 8,162,198,169, 31,138, 77,150,131,131,131, 34, 63, 63, +159, 3,144, 85,157,212, 15, 12,195,160, 69,139, 22, 56,115,233, 46,126,253,253, 26,114,147, 30, 97,226,184,143,208,184,113, 99, +156, 57,115,166,218,101, 22, 16, 16,128,211,161, 87,112,229,246,125,188,136,121,128, 79, 39,142, 67,163, 70,141,112,250,244,105, +225,128, 54,158, 83, 40,219, 55,235,212,171, 70,171, 83, 72, 72, 72,241,157,249,107,246,181,129, 3, 2, 68, 54,146, 93, 11,122, +214,245, 19,117, 91, 0, 66,100,134,131, 62,167,219,207, 93,188, 46,154,114,124, 49, 60, 34,181,234,209, 97,101, 78,154, 84, 60, +228,195,162,247,222,143,106,240,225,251,173, 61,176,245,132,124, 62, 0, 12,238, 80, 7, 55, 31,167, 33, 44, 38,117,111,100, 26, + 30,214,116,171,253, 29, 33,103,211,177,119,217,103,125, 59,121,185, 59, 99,219,209, 43, 32, 8, 28, 49,170,194,229,121,190,117, + 67, 47,172,217,249,234, 8, 67,103,207, 85, 7, 52,209,103, 31,230,245, 4,128,110, 13,228,191,181,172,107,235,201,151,238,184, + 85, 14,102, 18,122, 66,207, 1, 35,100, 76,204, 9, 32, 46, 20, 4,163,133, 90,207, 65,153,158, 7,149,181, 7, 46, 92,191,175, +206,209,232,166, 70,166, 85, 47,138, 23,149,142,167,226, 91,247, 95,230, 23,168, 93,228,138,186, 26,138,228,184,124, 45,143,155, +145,113,185,145,201,120,100,140,198,211,167,208,181,113, 99, 58,108,218,113,224, 43,145, 88, 50,152, 34, 64, 56,218,152, 43, 54, +125,255, 13, 44, 45, 45,192,233,242,129,130, 52,244,255,100,113, 90, 68,146,161, 14, 0,248,216,195,162, 67, 29,209, 14,154, 36, + 18,206,199,234,231, 85,245, 31,132, 1,193,195,123, 52, 21,113,186, 2,124,182,108, 63, 54,207,236,139, 17, 93,252, 68,167,174, +198, 4, 3, 88, 84,221,178,230, 89, 6,188, 65,141,182,115, 46, 69, 19,192, 21, 30, 8,188,125,224,219, 6,192, 93,163, 53,154, + 1, 34,150, 38,252,154,120,154,139,185,132,171,224, 18,174,242,148, 71,123, 16,158,239, 16,132,115, 11,254,199,229, 11, 11,182, +110,221,118,150, 35,241,181, 17,169, 50, 4, 4,254,171, 60, 77, 74, 74,122,175, 87,175, 94,191,159, 57,115,198,206,223,223, 31, + 0,112,251,246,237,194,155,206, 22, 45,224,235,235,139,148,148, 20, 12, 29, 58, 52, 93,169, 84,190,135, 42,250,252,230,229,229, + 61, 59,116,232,144, 83, 65, 65, 65,211,121,243,230,165,122,121,121,229,106, 52, 26, 34, 59, 59,155, 99, 24, 6,182,182,182,146, +166, 77,155,162, 93,187,118,249,215,175, 95,175, 21, 31, 31,159, 7, 32,174, 58, 43,223,183,111, 95, 92,186, 84, 56,104,239, 77, +228,213, 18,139,197,240,247,247,119,123,250,244,105, 98, 81,221, 98,242, 53,190,116,245,114,255,254,125, 92,188,155, 0, 90,167, +134, 36, 45, 9, 55,142, 30, 66,159, 9,147,192, 48,213,239,197,112,255,254,125, 28, 11,189, 1,115, 41,141, 71,143, 30,226,208, +161, 67,152, 56,113, 98,141, 52,171, 73,165, 94,228, 31,142, 18, 21,244,211,162, 1, 32, 40, 40,232, 98,113,180,162, 52,222,222, +144, 72,243,177,160, 91, 51,183, 25,131, 3,235, 82,134,220, 36,112, 44, 7, 74, 4, 56, 58, 88, 97,215,174,189,117,246,238,223, +127,125,195,250, 13, 63,112, 12, 51, 55, 34, 21, 42, 19, 86,106,193,247,251,175, 12,222, 53,189, 19, 61,177,103, 3, 59, 0, 16, +211, 36,214,158,120,200, 0, 88, 80,147,173,109,227, 6, 89,190, 1,227, 29,237,173,231,207,254,184,183, 93,167, 22,190,184, 24, + 22,129, 31, 14, 93,191, 36, 73,197, 78,163, 15,110,206,128, 87,253, 83,121,163, 14,193, 85,221,239,146,101,121,103,177,185, 45, +244,113,231, 1,189, 6, 26,173, 30,241, 25, 44,226, 51, 53,160,229, 98,220,142, 73, 80,219, 39, 35,164, 6,155, 77,152,203,101, +174, 95,125,183,202, 93,163,206,103,114,179,210, 25,177,228,134, 72,110, 38, 85,154,210, 85,225, 70, 34, 52,239,212, 22, 53, 7, + 56, 74, 34,227, 85,115, 62, 31,101,158, 24,121, 6,245,200, 36, 16, 60, 15, 51,191,222,176, 52,163,196,129,181, 68, 47, 1,192, +220, 92, 46, 89,246,245, 23,214, 83,103,126, 93,101, 31, 48, 63, 64,236,235,237, 60,213,223,203, 22,151,238, 68,227, 82,248,139, +135,151,110, 63,106,212,185,177, 43,124,221,109,166, 72,178,178,151, 70,193,244, 8,105, 97,193, 48,128, 65, 83, 50,234,208,207, + 17,195, 90, 14,158, 87,209,104,195,114,169, 13,112, 49, 44, 15,130,162, 0,130, 44, 28, 1, 25,127, 21,180,141, 55,191,247,192, + 49,213,182,109, 59,191,137, 74, 23,162, 88, 2, 2, 85,145,147,147,243, 32, 42, 42,170, 71,147, 38, 77,182,127,246,217,103,150, +195,135, 15,119, 29, 55,110, 28, 9, 0, 41, 41, 41,220,154, 53,107,146,126,252,241,199,156,244,244,244,209, 6,131, 33,220,152, + 51, 92,169, 84, 94,251,233,167,159,210, 46, 95,190,220,168, 85,171, 86,210,230,205,155,115,182,182,182,180, 84, 42,101,117, 58, +157, 38, 38, 38,134,125,250,244,169, 75,118,118,246, 19, 0,177,168, 70,179,126, 81,244,106, 17, 69, 81, 95,241, 60,239,255, 38, +250,104,201,229,114, 87, 0, 79, 8,130,168,103,106,179,225,107, 21, 54, 77, 35, 43, 43, 11,170,228,135,144, 37, 60, 70, 19,115, + 18, 13,109, 45, 96,101,101, 85, 35, 83,148,147,147, 3, 20, 36,226,202,149,251, 0,195,192,218,218, 26,214,214,214,127,185,209, +170,200,139,252, 75, 24, 95,206,103,149,247,209,106,168,192, 68, 51, 29,214, 76,232, 93, 87, 92,219,211, 29,218,132,219,184, 31, +159,143,185,109, 90, 69, 82, 82, 75,205,132,143,250,182, 24, 48,176, 22, 58,181,107, 73,212,118,177,158,178,244,251,141,159, 52, + 68,250, 23,145,169, 88,107,204, 26, 69,166,225, 25,135,212,109,231, 31, 36, 4,187,203,213,224, 56, 30,231,195,149, 8,143,203, +218, 22,157,134,103,166,108, 93, 67, 23,116,165, 65,238,231,121, 94,102,109,110,158,215,208,215,221,161,107,219, 0,242,189,142, + 45, 32,166,128, 43, 55,239, 99,218,247, 71,110,112, 28,223,219,232, 17, 98, 28,247,154,129, 42, 28, 97,104, 40, 51,194,144,231, +121,190,112,212, 97,229,221,190, 40,138, 72, 86,189,184,229, 44,178,247,129, 58,246, 60,226,178, 56,188, 72,205, 67, 46,237, 12, +109, 98, 34,192,115, 47, 47,214,160, 99,181,131,131,131, 99,157,134,190,117,215,237, 56, 4,189, 42, 7,207, 46,108, 71,126,150, + 18,223,110, 58, 81,215,205,205,190, 99, 98, 98,226, 69, 19, 46, 54,190,191,135,236,117, 4, 15, 80, 34, 41, 78,109, 56,128,116, +123, 51, 56,200,197,224,212,105,152, 48,117,184,117,207,110,195,173, 1,224,197,163,123,240,146,171,141,210,213,219, 99,192,224, +206,245,109, 96, 80, 99,199,233,123, 26, 18,120,111,231,217,135,177,157, 27,216,200, 6, 7,122,217, 46, 74,202,254, 0, 25,213, + 75, 42, 90, 28,209, 42,137,240, 85, 99,180,225, 33,128,109,192, 33,118,255,181, 84,243,129,221,154,203,197, 52, 65,240,249,137, +224,205, 28,176,113,199,193,124,137,225,175,121, 18,187,128,192,219,128, 90,173,190,163, 86,171, 27,127,249,229,151,195,230,204, +153,243,142,185,185,121, 29, 0, 40, 40, 40,120,102, 48, 24, 46, 21,157,159,166,140, 14,228, 1, 60,137,141,141,125, 22, 27, 27, +235,180,123,247,110, 27, 0,178,162,239, 52, 0,178, 1,164,160, 6, 35, 14,139, 77, 21, 65, 16, 95,189,169,253, 80,108,170, 8, +130,168, 87,157,223,147, 36,201, 18, 4, 1,130, 32, 32,149, 74,113,249,242,101, 12,234,221, 13, 81,167,178,225,111, 99,129, 86, +163, 39, 96,255,185,115,160, 40, 10, 4, 65,128,162, 40,147,234, 17,154,166,113,229,202, 21,140, 24, 58, 16, 82, 26,176,182,182, +198,151, 95,126,137,227,199,143,131,166,133,167,244,153,192,150, 82,134,203,200, 60, 90, 4, 22,157,219,190, 88, 12,214,128,147, +219, 87, 34, 36, 34, 95,247, 40, 13,115,235,167, 97,205, 33,228,113,105,223,239, 12, 62,119, 37, 98,197,152, 33, 65,242,119, 59, +119,195,187,157, 58,211,141, 90,118,156, 15,148, 49, 90, 93, 81, 73,174, 13,150,195, 55, 91, 78, 71, 79,216,127, 33,134,128, 62, + 15, 67,186,183,228, 89, 14,223, 84,177, 49,175,105, 90,155, 89,236,191,114,253,186, 45,244,249,136,187,247,135,172, 86,157,186, + 0,171,199,147, 39,143,241,227,142,163,220,133,155,143,118,233, 24,124,246, 52, 11, 5,198,106, 22, 58, 43, 6,214,230,146,250, +239, 53,178,250,141, 3, 15, 27,185,184, 1,207,177,176,145,139, 26,116,107, 32,255,141,231,121,222,210, 76,212,128,103, 13, 85, +106,170,117,204,230, 29, 63,111, 91, 53,118,236, 88,243,244,132,100, 36,229, 70, 32, 95,226, 6,131,220, 3,177,247, 46,169, 85, + 90,198,152, 74,188,194,253,153,158,158,158,122, 39, 44, 19,251, 55, 45,129, 65,167, 69,106, 66,161, 87, 77, 74,207,133,149,131, +219,245,196,196, 68,163, 53,245, 12,151, 51, 96,248,120,177,153, 37,204, 70, 12, 8,146,196,102,104,209,204,213,178,240,162,145, +159,134,168,208, 43,232, 84,212,199,244,105, 60, 9,175, 0, 87,163,214,211, 82, 38,254,172,103,115, 55, 60,123,169,196,229,135, +137, 59,158,101, 34,137,141, 86,238,136, 77,202, 14,238,219,198, 19,171,143, 71,126, 10, 24,246,154,178,237,126,142, 24,198,243, + 8, 44,236, 12,175, 6, 15, 4,250, 57, 98,152,145, 35, 13, 95,211,164,197,248,112,213,111, 47,230, 29,188,149,222,119,198,135, + 29,172,218,181,235, 37, 1,163, 67,158, 90,107,136,202, 70,110, 77,202,168, 6, 8,154,130,230,191, 85,147, 5,176,203, 96, 48, +236,202,206,206,126,147,154, 73,120, 61,175, 83,141,182,189,116, 51, 33,207,243,116, 81, 52,171,170,206,240,149,106,150,110, 38, +228,121,254,215,162,104, 86, 85, 81,173, 50,154, 28,199, 37,181,104,209,194,174, 79,159, 62, 96, 89, 22,143, 31, 63,198,139,248, +120,116, 13,254, 20, 54, 54, 54,184,244,224, 1, 30, 61,122,132,175,190,250, 10, 6,131, 1,199,142, 29, 75,168, 74,147,166,105, +125,221,186,117,197,253,250,245, 3,195, 48,120,250,244, 41, 18, 19, 19, 49,109,218, 52, 88, 91, 91,227,206,157, 59, 37,154,233, +233,233,160,105, 90, 95, 78,116,235,207, 56,150,254,237,188,102,178, 42, 55, 90, 0, 11,214,128,156,115, 11,176,246, 50,244,122, + 3, 26, 68,166,225,121,228,255, 35, 82, 27,169,176, 7, 39, 31, 68, 68, 63,187,115,245, 93, 9, 82,195, 97,234,157,196,227, 12, + 40, 45,101,121,121,208,231, 89,225,233,111,120,158,146,151,255, 56, 3, 74,147,239, 24, 56,150,128, 94, 5, 40,111,227,218,165, +139,184,112,227, 62,110,133, 71,179,215,238,196,236, 39, 57,124, 19,149,129,199,213,184, 11,129, 69,239,213, 24, 21,254,196,179, +165,175,147, 39, 88, 6, 60,103,128,245,144,189, 24, 29,217,206,179,165,183,141,103, 97, 36,203, 0,219,143,255, 0, 86,201, 42, +213,187, 29,111,216, 34, 57,126,230,131,188,236,140, 54, 93, 58,182, 53,183,246,235,137,244, 39, 49,120,124,255,138,250, 78, 68, +236,181,219,241,134, 26, 69, 75,220,220,220,222,233,210,177, 62,134, 76,152, 13,189, 42, 7, 79, 47,252,140,252,204,100, 92,190, +110,129,232,220,220,182, 0,140,142,104, 93,127,201, 52,194,203, 44,180,175, 37,122,105, 9,173,243, 71, 65,125, 32, 37, 52,224, +180,185, 32, 84,233,136, 77,212,229,124,176, 41,158, 5, 0,185,148,160,205,249, 28, 43,163, 34,143, 94,246, 62,114,202,128,157, +231, 30,130,227, 10, 31,223,196,113,216,184,243,143,216,224,111, 70, 52, 67, 67, 79,219,128,123,137,169, 4, 76, 8,249, 19, 60, + 58,220,218,255,117, 3,205,239,243, 1, 78,143, 43, 83,236, 26,116, 88,155,217, 1,213,124,220, 78, 68, 18, 18, 1, 4,131, 86, +109,158,178,246,244,252, 22,231, 34, 3,167,127,220,215, 10,188,240, 0,118, 1, 1,129,191,158,252,252,252, 9,163, 71,143,222, + 44, 18,137, 20, 0, 8,142,227,192,113, 28,189, 98,197, 10, 17,203,178, 36, 73,146, 44, 69, 81,204,175,191,254,106, 96, 89, 54, + 77,163,209, 76,168, 74,147, 97,152,216, 73,147, 38,213,173,106,132,226,190,125,251,138, 77, 86,172, 80, 18, 70,153,172,210,243, +146, 40, 87,197,149, 7,143,175,219,143, 88,176, 0, 0, 1, 30, 11, 35,211,240,252,213, 69,194, 51,145,212,144,210, 79,107,212, +178,227,130,226,223,152,186,102, 26,150, 29,216,178,177,239, 62, 0,208,242,236,136,234,108, 93,174, 86, 61,184,105,203,182,251, + 57,158,167, 25,158,223, 70,114, 56,172, 97, 16,101,204, 72,187,138, 72, 74,205,190,211,211,223,154, 7, 10,155, 12, 75,154, 11, +139,210, 56,240, 60,207,151, 52, 23,174,148, 33, 61, 71, 91,101, 30,168,171,207,117,221,116,204,173,241,103,175,222,155,192,178, +188, 51, 69, 17,201,106, 29,179,185,166, 38, 11, 0, 18, 19, 19, 47,134,158, 75, 60,251, 32,192,169,187,131,188, 40,202,165, 2, +210, 85, 56,155,152,150,127,177, 58,154, 89, 5,134,190,115,214, 28, 63, 33, 17, 81, 52,120,190, 48,161, 40,207, 67,163,103, 51, +175,191,100, 26, 1, 64, 99, 59,184,126,121,140,217, 71, 81,196,139,170,244,194, 30, 41, 87, 15, 89, 26,250,197,195,184,172,109, +113,217,136, 0,128,184,108, 68, 28,184,242,124,126,108,114,222, 23, 17, 47,178, 86,194,196,126, 21, 60,129,203, 45,135, 44,120, +237,179,154,238,207,104, 37,238, 3,232, 15, 36,116, 27, 50,253,199,233, 4, 1,225,241, 19, 2, 2,255, 33,138,163, 90, 36, 73, + 46,122,131,154,191, 18, 4,209, 11,192, 19, 19,126, 22,150,159,159,223,248, 13,111, 94, 6,195, 48, 25,198, 44,248, 55,116,136, +255,183,242,183,117, 45,233, 42,104,254,245,154,245,234,213,227, 77, 48, 44,194,254, 20, 52, 5, 77, 65,243, 63,165,201,243, 60, + 85,147,169, 2, 77,162, 38,147, 80, 70,255,122,198, 87,244, 94,104, 14,121, 11,121,242,228, 9, 33,236, 5, 1, 1, 1,129,242, + 33, 8,130,253, 19, 52,133,228,197, 2,197, 6,171, 76,116,139, 20,246,137,128,128,128,128,128,128,128,192, 27, 49, 89,165,231, +133, 38, 28, 21,135,255, 76, 25, 77, 80,157, 16, 98,168,160, 41,104, 10,154,130,166,160, 41,104, 10,154,255, 57,205,170,180,133, +209,140,127,178, 1, 19, 52, 5, 77, 65, 83,208, 20, 52, 5, 77, 65,243,191,167,249,111,166,194, 62, 90, 66,211,161,128,128,128, +128,128,128,128,192,159,132,208, 25, 94, 64, 64, 64, 64, 64, 64, 64,160,102, 84,249, 80,105, 1, 1, 1, 1, 1, 1, 1, 1,129, +234, 81,249, 67,165, 5, 4, 4, 4, 4, 4, 4, 4, 4,170,141,233, 15,149, 22, 16, 16, 16, 16, 16, 16, 16, 16, 48,138, 45,194, + 46, 16, 16, 16, 16, 16, 16, 16, 16,248,107, 40, 59,234, 48, 36, 36,132, 47, 61, 23, 16, 16, 16, 16, 16, 16, 16,248, 43,121, 91, +189,136,208,116, 40, 32, 32, 32, 32, 32, 32, 32, 80, 51,198, 11, 70, 75, 64, 64, 64, 64, 64, 64, 64,224,207,161,194, 62, 90,197, + 9, 75, 59, 21,133,234, 58, 9,251, 74, 64, 64, 64, 64, 64, 64,224,111,224,237,246, 34, 66,255, 44, 1, 1, 1, 1, 1, 1, 1, +193,139, 8, 8, 8, 8, 8, 8, 8, 8, 8,252,147, 16,158,117, 40, 32, 32, 32, 32, 32, 32, 32,240, 23, 27,174, 63,221,104, 9, + 79, 54, 23, 52, 5, 77, 65, 83,208, 20, 52, 5, 77, 65,243,191,100,178,202,152, 45, 97,212,161,128,128,128,128,128,128,128, 64, +205,168,114,212,161,128,128,128,128,128,128,128,128, 64,245, 24, 15, 32,168,232,117, 16, 74, 69,181,132,136,150,128,128,128,128, +128,128,128, 64,205,216, 2,192,165,200, 96,157, 2,160, 20,140,150,128,128,128,128,128,128,128,192,155,161,116,191,172,222,165, +204,151, 96,180, 4, 4, 4, 4, 4, 4, 4, 4,106, 72,133,125,180, 8, 84, 60,114, 32,212,132, 63,168,206,232,131, 80, 65, 83, +208, 20, 52, 5, 77, 65, 83,208, 20, 52,255,115,154, 85,105,135,226,223,199,120, 83,204,215,155, 68, 24,250, 42,104, 10,154,130, +166,160, 41,104, 10,154,130,230,127,150, 55, 62,234,176, 25, 96, 38,236,214,183, 18,167,162, 73, 64, 64, 64, 64, 64, 64,160,114, +254,156, 81,135,126,192,199,195,253, 21,155, 12, 17,105, 86, 17,128,170,178,101, 21, 10,197,102,185, 92, 62, 92,165, 82, 21, 16, + 4,193, 21,127,206,243, 60, 0,148,126,214,209,211,180,180,180, 14, 85,253,183, 68, 34, 89,227,228,228,244,113,126,126,190,138, + 32, 8,158, 32, 8, 16, 4, 1, 0,175,205, 89,150, 77,200,200,200,104,241,175, 46, 66,158,167, 28,156,156,110,138, 40,202,205, +212,159,178, 28,247, 60, 53, 37,165,173, 9, 63, 89, 66, 16,152, 81,248,183, 88, 14, 96,246,219,118, 70,240, 0,101,204,114,254, +128,101, 12, 48,132, 37,201, 79, 69,192,122, 45,199,109, 2, 0, 2, 96,171,251,223,218, 48,212, 37,120, 4, 16, 4,172,121, 30, + 57, 60,129,251,210,214,136,253,155,118,197, 0,145, 72,212,215,202,202,202, 34, 35, 35,227, 34,128,125, 0,134,218,219,219,119, +204,205,205,205, 55, 24, 12,199, 1, 28,169,142,112,135, 0,204,148,136, 69, 99, 52,122,195,178,171,247,241,115,199,102,176,103, + 56, 44,149,137,233, 14, 90, 29,179,252,202, 3,108, 51, 81,146, 40,154,138,175, 25, 38, 63, 35,237,160,145,229, 14, 0,199,108, +109,125,165, 10,171,223, 69, 18,234,121,118, 74,254,240,129,169,169,241,131,106, 80,238,255, 68, 28, 28, 28, 70,145, 36,249, 29, +207,243, 96, 89,118,110,102,102,230,246, 55, 36, 61, 23,128, 77,209,235,108, 0,223,213, 80,239, 5, 0,207,162,215, 47, 1,120, + 9,245,122,181,217,120,244,232,209,224,206,157, 59, 99,245,234,213,216,184,113, 99, 92, 90, 90,218, 82, 0, 59, 0,232,254, 6, + 29,129,138,104, 8,244, 90,209,163, 53,107,248,229, 27,174,212,199, 93, 43, 56,153,127,250,232,163,143,244, 60,207,243,143, 30, + 61,226,117, 58, 29,111, 48, 24,120,134, 97,120,134, 97,120,131,193, 80, 50,185,185,185, 37,190,242,243,215, 52, 73,146, 92,251, +193, 7, 31,228,241, 60,207,223,190,125,155, 87,171,213,188, 86,171,229,117, 58, 29,175,209,104,120,181, 90, 93,102,114,114,114, + 74,169, 76,211,202,202,234,182,173,173,109,138,173,173,109,138,157,157, 93,138,157,157, 93,138,189,189,125,201,228,224,224, 80, + 50, 41, 20,138, 20,133, 66,145, 98,103,103,119,187,170,245, 44,162, 7,128,139, 70, 76, 61,202,249,109,215,210, 70,203,197,197, + 37,133,175, 6,238,238,238,241, 70,172,103, 49, 78, 4, 1,182,248,183, 4, 1, 78, 42,149,122,150,254, 30,175, 71,186,170, 12, + 41,187,186,186,126,224,226,226, 18,234,226,226,114,206,213,213,245, 3, 35, 14,177, 50,154,150,150,150,183, 29, 28, 28, 82,156, +157,157, 83,139, 39, 23, 23,151, 50,147,171,171,107,201,228,228,228,148, 98,107,107, 91, 97, 25,241, 0, 85,209,116, 1,160,165, +192,187, 52, 69,133, 56, 57, 57,229,134,135,135,179, 60,207,243, 36, 73, 38, 22, 47, 99,202,182,191,106,178, 84, 87, 48, 55,253, +188, 52, 44,255,249,210,156,244,243,210, 48,213, 21,204,213,134,161,110,117, 53,141,164, 60,205,145, 35, 71,142,188,159,146,146, +146,152,157,157,173,220,180,105, 83,140, 76, 38,187,178,105,211,166,152,236,236,108,101, 74, 74, 74,226,200,145, 35,239, 3,152, +100,130, 38, 0,160,109, 0,218,140, 29,224,162,186,127,108,132,234,221,150,244,189,246,254, 8,234,214, 86,156,184,110,150,159, +234,210,214, 64, 85,231,230,100,132,137,154, 4, 77,211,237, 60, 61, 61,199, 40, 20,138,143,138,166, 17,197,147,179,179,243, 8, +103,103,231, 17,182,182,182,131, 42,211, 60, 8, 80,198, 76, 30, 50, 89,187, 65,117, 60, 85, 47, 22, 45,228,195,167,126,202,143, +241,246,200, 29,232,232, 88,235,111, 40,163, 63, 85,211,209,209, 49,201, 96, 48,240,122,189,158,183,183,183, 79,122,131,235,185, +146,231,249,149, 60,207,175, 4,176,242, 13,104,150, 92,207, 76, 48,216,149,105,202,104,146,156, 46,151, 72,206, 73,105, 58, 85, + 74,211,169,114,137,228, 28, 77,146, 95, 0,144,253,147,202,232, 79,208,180, 80, 40, 20,207,214,172, 89,195,171, 84, 42, 94,165, + 82,241,107,214,172,225, 21, 10,197, 51, 0, 22, 38,104, 86, 87,231,109,138, 96,189, 58,189,185,136,150, 31,208,226,221,128,122, +135,167,140, 26, 2,238,208, 26,162,138, 59,166,159,218,182,104, 49,102,199,142, 29, 0,128,225,125,251,162,123,171, 86,176,180, + 48,135, 68, 82,184, 58, 4, 79, 64, 44, 18,163,223,180,207,141,249,251,229,253,250,245,251,240,208,161, 67, 22, 0,176,113,227, + 70, 12, 24, 48, 0,118,118,118,144,203,229, 16,139,197, 16,137, 68,101,230, 85, 65, 81,148,123, 98, 98,162,163, 76, 38, 43,137, +178,113, 28, 87,102,226,121,190, 56,250, 6,134, 97,224,227,227, 99,236,238,154,149,147,147,243, 78, 65, 65, 65,137, 70,121, 83, +157, 58,117, 0,224,140, 49,130,223,125,251, 13, 56,166, 0, 52, 13, 48, 12,160,213,147,224,248,114,205, 13, 38, 77,154, 84,178, +222,213,161,119,239, 32,130, 32,136, 67,119,238,220, 57,156,154,154, 90,155,227,216,113,213,140,116,125,242,248,241, 99, 11, 0, +240,245,245,157, 4,224,176, 41,235, 65,211,180,251,131, 7, 15, 28,165, 82,105,133,145,203, 82, 17, 76,232,245,122, 52,107,214, +140, 49,229, 63,156, 0,207, 76,146, 28,215,180,121,243,241, 11,250,245,147,221,188,121, 83, 70,146, 36, 24,134,193,138, 21, 43, + 24,158,231,109, 26, 2, 86,145, 64,110, 37, 50,115, 0,140, 42,170, 12,182, 1, 88, 81,198, 45,240, 8, 80, 27,164, 65, 79,243, +251,181,106, 93,107, 38, 34, 31,134,183,242,182, 56, 6, 75, 90, 27, 11,252,181, 81, 45, 43, 43,171,190,171, 87,175, 86,108,219, +182, 45,247,209,163, 71,250, 77,155, 54, 41, 38, 76,152, 96,169,215,235, 17, 28, 28,156, 86,191,126,125,241,234,213,171, 21, 71, +142, 28,121,183,160,160, 96,131, 73,229, 69,224,155,161,125,187, 67, 99, 32, 97, 48, 48, 10, 23,133,229,174, 41, 35, 59,137,120, + 94,135,157,199,239,192,192,112, 63,155, 24,201,106, 59,112,224, 64,239,189,123,247,210,209,209,209,116,131, 6, 13,192,113, 28, + 88,150,133,193, 96, 0, 0,112, 28,135,122,245,234,213,120,191,140, 1,124, 29,156,236,206,181,237,213,211,204, 69, 38,133, 93, + 86, 26,198,138,105,203,237,114,237,110, 0,237,222,170,200, 46,207,131,166,105,196,199,199,195,209,209,209,140,227, 56, 37,128, +133, 89, 89, 89, 91,240,246,210, 74, 66,211,135,119,254,188,214,185,117,187,118,148,147,139, 35, 98, 30,191, 4, 77,176, 93, 31, +220,186,211,105,204,196,233, 83,116, 12,243, 1,128,155,111,219,134, 59,183,155,212,159, 32,169,141, 4,207,225,235,117, 39,242, +150, 44, 95, 35, 15, 30, 55,146,154, 54,109, 26, 60, 60, 60,106,247,239,223,127, 57,128,137, 85,234,180,158,212, 31, 20,185, 17, + 60,143, 5, 63,158,200, 91,188,124,141,124, 98, 53,116,254,229, 84,120,142,212,216,104,249, 1,222,141, 60, 28,207, 46,153, 49, + 81,196,255,246, 11,169,202, 72,173,112, 89,133, 66,177,249,189,247,222, 27,190,125,251,255,163,209,109,253,253,209,255,221, 64, + 56,218, 91, 67,110, 46, 41,172,142, 56, 2,247, 31, 61, 55,202, 16,120,120,120, 4, 31, 62,124,216,162,180,153, 16,139,197, 37, + 83,105,147, 85, 60, 21, 87,192,149, 33,147,201, 16, 26, 26, 10,154,166, 65, 81, 20,104,154, 46,153, 74,191,167, 40, 10, 78, 78, + 38,117, 93, 90,106,109,109,221, 36, 47, 47,207, 42, 59, 59, 27,158,158,158,185, 0, 30,148,250,190, 73, 90, 90,154,149, 41,130, + 28, 83,128,105, 99,253, 32,210,221,128, 78,212, 10,106,186, 61,174,221,138, 66,200,153,139, 72, 76, 74, 70, 96,155,166,248,104, +216, 64,156, 59,119, 14, 44,107,114, 75, 71, 10,207, 99,121,159, 62, 65, 51, 1,130,232,218,181,107,246,228,201,147,201,232,232, +232, 15,251,247,239,231,255,248,241,147,162,168, 34, 49,131,231,177, 22, 64,138,145,186, 18, 0,184,116,233, 18, 0, 72,171,115, +236, 73,165, 82, 92,191,126, 29,197,205,196, 36, 73,130, 36, 73, 80, 20,133,147, 79, 28, 80,160, 35,161, 74,137,192,167, 65,158, +168, 83,167, 14, 72,178,234, 46,137,157, 0,217, 53,160, 63, 33, 18, 77,115,113,117,173,221,209,219, 91, 30, 26, 26, 74, 1,128, +151,151, 23,175, 84, 42,179,143, 31, 63,158, 71, 3, 27,189,120,126, 71,101, 38,203,195,195,163,125, 98, 98,226,119,197,251,156, + 32,136,229,181,106,213,250,170,164,220, 56, 14, 11,127, 46, 16, 77,153, 50, 85,220,186,211, 60, 0, 64,235, 62,123,145,251,116, +137, 31,145, 57,199,250,175,190, 74,228,230,230,238,175, 87,175, 30,149,145,145,113, 13,192, 11,131,193, 48,107,215,174, 93,142, + 99,199,142, 77,221,189,123,247, 82, 0,174,203,150, 45,235, 84, 80, 80,112,192, 20,221,192, 38,232,213,188,137,127, 27, 79, 15, + 15, 92,188,118, 19, 98,137,200,102,210,168, 32, 88, 88,208, 88,185,237, 20,247, 34, 33,115,242,149, 7,216, 97,130,201,106, 53, +112,224,192,218,123,247,238,149, 0,192,131, 7, 15,144,156,156, 12,133, 66, 1, 51, 51, 51,136, 68, 34, 80, 20, 5,145, 72,244, + 70, 76,150,181,135,125,216,177, 99,199,205,236,236,108,176,238,243, 41,248, 40, 53, 5, 54,150, 22, 48,228, 23,212,126,203, 42, + 10,223, 14, 29, 58,200, 88,150, 69, 65, 65, 1, 46, 92,184, 96,109,102,102,102,237,238,238,190, 0, 38,140,158,146,201,100, 41, + 26,141,198,177,232,117,170, 70,163,113, 2,144, 43,149, 74,139,175,211,249, 69,115, 99,155, 19, 95,224,245,102,194,151, 4, 65, +148,254,172,186,180,108,213,178, 73,232,145, 67,123, 44,114,242,146, 97, 99,155, 10, 18, 57,216,178,101, 61,204,204,172,176, 96, +193, 28,250,121,215,119,221,122,244,250, 32,244, 97, 84, 76,215,183,206,108,241,196,150,174,125,134,219,153,201, 45,139,234, 18, + 3,182,111,157, 2,146, 36,241,213, 87, 95,161, 81,163, 70,227, 31, 62,124, 56, 15, 64,102,229, 50,216,210,248,157,193,118, 18, + 89, 97, 17,115,172, 1,155,246,125, 81,168, 51,123, 2,134,246,169, 51,254,203,129,207, 78, 55,242, 70, 94,209,141,185, 90, 68, +226, 37,209, 26, 37,134, 33, 36, 36,164, 99, 80, 80,208,197,138,222,255, 11,112,193,255,243,103,149, 49, 95,116, 72, 72, 8, 31, + 20, 20, 68,148,218,184, 50,239, 43, 35, 0,112,176,181,150,135,110, 92, 56,197,130,190,113,138, 82,191,124,130, 36, 77,153,138, +188,204, 16, 77,185, 92, 62,124,251,246,237,101, 66, 74,158, 78,142, 16,139, 69, 16,137, 9,216,116, 40,204, 94,159,125, 57, 4, + 4, 81,161,201, 42,163, 89, 80, 80,160,185,119,239,158,197,182,109,219,224,232,232,136,218,181,107, 67, 46,151, 67, 38,147,149, + 49, 87,165, 13, 87, 57, 70,171,140,102,241,247, 52, 77,131, 36, 73,156, 59,119, 14, 12,195, 96,224,192,129,175,153, 44,154,166, + 43, 50,110, 21, 13, 79, 61, 3,224, 1,207,243,239, 20, 85,192, 15, 0,116, 44,245,125, 15,133, 66, 49, 11,192, 82, 99, 53, 41, +138, 7,165,185, 6,206,125, 13,232,248, 41,208,137, 2,112,254,202, 29,108,223,188, 26, 0, 80,187, 65, 75, 12,234, 31, 84, 18, +141, 51,114, 61, 75,112,115,115,219,151,150,150,222,243,221,119,223, 69, 86, 86,150, 97,225,194,133,104,210,164, 9,124,125,125, +141, 42,163, 10,238,156, 83, 30, 60,120,224,161, 86,171,193,243,188, 49,230,236, 53, 77,130, 32,176,107,215, 46,104, 52,154,215, + 22,182,237,184, 24, 95, 12,240,194,232, 79,119, 96,249,163, 3,216,176, 97, 67,165,219, 46, 7,154,104,172,235,173,149, 80, 76, +147,165,115, 62,145,126,244,209, 71,212,232,209,163,241,242,229, 75,140, 29, 59, 86,115,238,220, 57, 93,178, 82,121, 92,194,113, +235,244,101,141,113,133,154, 82,169,116,231,153, 51,103,112,224, 64,161, 47,137,137,137,129,143,143,143,121, 25,147,156,121, 16, +121, 47,214, 33,236,100, 52, 90,247,217,139,176,147,195,192,102,159, 18,181,240, 65,142, 41,251,179, 26,148,167,121, 32, 35, 35, +163,196, 68,237,222,189,219,108,247,238,221,253, 0,156, 0,112, 0, 0, 50, 51, 51,191, 55, 81, 19, 32, 48,122,240,128,126,160, +197,150,136,126,146,128,142,109,155,193,201,209, 17, 15,162, 98,241, 34, 49, 51,133, 32, 48,170, 71, 59,201, 82,181, 90, 55,239, +242,125,252, 84,133, 38,225,238,238,238,123,240,224, 65,113,169, 8,116,201, 57, 78, 81, 84,201,251, 98,227, 93,157,227,179,216, +100, 89,186, 91,132,125,179,190,189,121, 88,248,110,248,120,245,130,109,175, 32,252,116,246, 44, 30, 63,140,212,232, 84, 76,151, +191,161,140,254, 44, 77,223, 1, 3, 6, 92,219,179,103,143, 77,124,124, 60, 46, 93,186,132,218,181,107, 67,165, 82, 25,115,195, + 91, 70, 83,163,209, 56, 22,255,134, 32, 8,199,226,192,187, 78,167, 43, 46,140,226, 19,209,166,212,114, 54,149,104,122,150, 90, +174,216, 92,121,189,129,109,151,200,196,226,131,199,142,236,179,136,140,190,132,166, 1,109, 96, 97,221, 16, 28,155,140,140,204, +124,100, 61, 73,194,183,223, 46,199,130,133,115,113,226,232, 33,139,250,126, 1,135,117, 12, 83, 15,128,230,173, 41,119,130, 31, + 31,122,114,247, 70,130,231,160, 78,137,150,138, 10,158,201,135, 15,251,128, 26, 50,100, 8, 78,156, 56,129,135, 15, 31,110,172, +196,100,133,150,138,204,143,143,184,116, 96, 35,120, 30,234,212,104,169, 88,253, 76, 62,242,195, 65,212, 71, 67,187,227,198, 31, +107,209,189,233,179, 8, 87, 71,244,207, 42,178,216, 52,133, 12,169, 12, 87,249, 48,220, 40,101,182, 46, 0, 32, 74, 25,172, 11, +248,127, 31,204,127, 3,189,139,140,213,248, 87,111, 76,232,234, 24, 44, 0,240, 1, 44, 8,137, 56,108,251,130, 79, 92,229, 47, + 31,210,218,136,235, 72,210,114,252,166, 56,134,107, 6,152,221, 5,212,175,254, 70,165, 82, 21,196,198,198,154,141,234,223, 31, +237,252,253,225, 98,111,143,122,238,238, 48,147, 74, 32, 17,139,202,220,178, 26,221,134, 64, 16,124,253,250,245,209,167, 79, 31, +136, 68, 34,200,229,114, 88, 88, 88, 64, 34,145,148, 27,205, 50,246, 46,151,231,121, 80, 20,133,136,136, 8,188,120,241, 2, 54, + 54, 54,184,122,245, 42,186,116,233,242, 90, 84,171,180, 57, 51, 37, 68, 95, 78,197, 95,108,196,206,152,162,197,178, 4,242,249, + 0,200,226, 38, 67, 69, 52,131, 86,203, 64,171,213,226,167, 43,122,220,140, 45,128, 94,175,131, 86,171,173,236, 63, 43,130,116, +117,117, 29, 94,175, 94,189, 73,195,134, 13, 51, 72, 36, 18, 20, 20, 20, 64,165, 82,225,225,195,135,134,158, 61,123,101,247,233, + 19,100,125,234,212, 41,190,168,233, 48,197, 4,237, 12, 55, 55, 55,143,162,230,217,140,234, 28,213, 4, 65,148,152,152, 87, 25, +245,125, 36,104,170,176, 76, 54,110,220, 8,150,101,193,243,124,133,133,164, 33,136,223, 23, 46, 94,101,189,108,205,207,176,182, +115,194,197,139, 23,217,211,167, 79,231, 17, 64,204,227,135, 15,191,127, 31,248,245, 32,160, 55,101,253,178,178,178,204,106,215, +174, 13,119,119,119,112, 28, 7,131,193, 80, 18,125,201,200,200,128, 90,173,134,157,121, 54,234,218,187,131,201,187, 0,101,196, +215,112,177,136,198,142, 51, 58, 67,115, 95,220,255, 7, 92, 56,126, 41,154,106,120,215, 12, 55, 71,103, 15,144,188, 1, 73,169, + 25,232,215,187, 59, 40,177, 5,158,199,167, 35,160,161,183,203,135,239,183,119,161, 8, 6, 51,150,238,157, 4,112, 63, 85, 37, +151,159,159,207, 70, 71, 71,227,193,131, 66,191,107,101,101, 5,115,115,243, 50,231, 56, 73,146, 53,138,104, 21,155,172,197, 27, +187,152,147,162, 2,228,178,161,216,182,235, 14, 2,234, 7, 97, 83,216, 45, 13,155,146,217,117,165, 70, 19,179,239, 95, 28,204, +112,118,118,158,192,113,220, 2,158,231,179, 3, 3, 3,157,246,238,221,107,155,152,152,136, 59,119,238,224,171,175,190, 74, 99, + 89,150,225,121,158,224,121,254,235, 55,240,119, 92, 41,131,245, 38, 17,201,101,248,212,193,138,232, 75,147, 86,181,153,220,252, +231,233, 58,254,184,138,225,126, 4, 96,168,244,226, 70,146, 31, 31,218,191,209,213, 65,193,161,147,226, 93, 40, 83,244, 88,252, +249, 72,100,100,228,225,167,173, 75, 0, 72,160,103, 40,188,211,233, 3, 56, 58,186, 97,252,184,241,206, 27, 55,111,250,132,225, +184,149,120, 75, 72,190,182,225, 40,128, 80,133, 66,241,240,147,241,227, 21,181,107,143,128, 76, 38,195,190,125,251,176,119,221, + 58,118, 13, 48, 72, 10,156, 15, 6,142, 86,170, 19,246,127,157, 41,193,193, 10, 63,191, 96, 72,165, 82,252,113,250, 23,104,146, +119,229,245,110, 7,189, 74,131,222,181,250,240,118,113, 39,137, 76,145, 8, 79, 0, 64, 36,131, 18,192,171,205, 96,255, 54,131, + 85,204, 41,252,191, 95,214,248, 50, 17,173,106, 95, 59, 69,146,240,173, 83,135,122, 57, 65, 75,232,174,156, 68,162,150, 99,151, + 61,214, 83,119,115, 32,223,157, 35, 0, 0, 32, 0, 73, 68, 65, 84,248, 47,162,202, 49, 89, 69, 7, 54,231,233,233,137,119, 91, +180, 64,255, 14, 29, 64,211, 52,100, 18, 49, 44,101,102,224,217,194, 72, 86,113,211, 97, 37,117, 34,202,139, 62,217,219,219, 67, + 44, 22,151, 24, 44, 19,162, 89,229,106,114, 28, 7,154,166,241,224,193, 3, 4, 6, 6,194,195,195, 3, 7, 14, 28, 64,143, 30, + 61, 94,107, 74, 52,213,100, 21, 27,173, 87,154,241,122, 0, 40,142,100,153,100,180, 52, 58, 2,233,186, 0, 16,132, 63, 24, 6, + 96,121, 64,171,209,128,231, 1,158, 7, 12,122, 29, 52, 26, 77,201,127, 26,211, 36,235,236,236,236,105,102,102,182,104,230,204, + 25,126, 1, 1, 77,145,150,150, 6,142,227, 96,110,110, 14,149, 74, 5, 43, 43, 43,180,107,215,238,249,162, 69,139,148, 60,143, +241, 38,154,172, 26, 83,188,207,207,158, 61, 91,166,217,176,120, 42, 80, 38, 96,244,103,187, 33,161, 11,155,150,138,251,240, 84, +118,221,237,252, 78,123, 92,187, 27,195,124, 60, 99,173, 86,148,113,103,169, 51,199,109, 79,168,193,118,241, 60,143,244,244,116, +164,164,164,160,111,191,126,216,187,103, 15,226,226,226,208,176, 97, 67,116,238,220, 25,142,142,142,136,139,139,195,205,203, 90, +104,179, 50,145,169,187, 3,185,101,107, 28,187, 24,171,253,106,163, 62,246,111,188, 96,244, 5, 48,210,202,202,170,142, 74,165, + 82, 50, 12,115, 16,192, 65, 0,131,104,154, 30, 36,151,203, 93,114,115,115,159,161,112, 52,209,241,170,196,204,100, 50,123,169, +204, 10, 28,163, 5, 77,211,240,240,168, 13,158,213, 33, 43, 87,141, 81, 67,250,224,238,131, 40,156, 62,127,131, 49, 24,184, 31, +140,217,173, 20, 69,241,190,190,190, 72, 77, 77,133, 72, 36,130,153,153, 25, 44, 44, 44, 48,123,246,108,172, 91,183,174,196,100, + 85,215,104,141, 1,124,173, 60, 45,110,124,183,190,208,100, 37, 39, 41,145,146, 32,130,194,222, 9, 63,172, 91, 83,144, 21,151, +220,250,103, 32,230,223, 94,201,114, 28,247,117, 98, 98,162, 35, 77,211,206, 12,195, 32, 62, 62, 30,183,111,223,198,228,201,147, + 83, 50, 50, 50, 58,161,154,219, 40,147,201, 82,139, 35, 89, 69, 77,135, 21, 53, 39,102,151,138,100,101, 87, 34, 89, 81, 51,161, +119,109,119,203,115, 91, 87, 79,243,108,217,186, 29, 41,167,173,178,242,159, 36, 7, 94,185,116,177,221,228,213, 63,125,242, 34, + 43,191, 59,128,167, 21,137, 74, 69,162,158,109,218,183,167,193,167,128,150, 4, 98,249,178, 33, 72, 75,207, 69, 86,102, 30,196, + 98,115,232, 12, 20, 88,142, 64,187,192, 14,248,101,199,126, 52, 26, 55,150,146,136, 68,221, 24,157,238,173, 49, 90, 69, 44,249, +241,199, 31, 61,235,215,175,143,237,219,183,227,252,206,157,248, 40, 39, 7, 23, 73,146, 50,136, 68, 14,191, 26, 12, 91, 80,133, +209, 42,173,211,168, 81, 35,252,252,243,207,216,181,107,215,203,225, 93, 82, 15, 79, 27, 14, 71,189, 30,239,221,121, 4,187, 90, +125,128, 59,143, 96,215,188, 62,234, 49, 52,158, 16, 68,217,116, 80, 33, 33, 33, 29, 75,207,255,101, 40, 81, 65, 19, 59, 13,160, + 83, 72, 72, 8, 95,122, 94,229,133, 83,225, 19,188,164,123, 29, 47,255,186,158,132,225,192, 90,196, 23, 48,186,121,143,244,146, +199,249,252,180, 40, 96, 77, 37,119, 16, 60, 69, 81,176, 52, 51,131,194,198,166, 48,204, 79,146, 0, 7,112, 6,128, 96, 11, 13, + 0,207, 17,224, 89,147, 46, 24,144, 72, 36,229,118,124, 55,181,111, 86,105,205,188,188, 60, 60,127,254, 28,227,199,143,135, 92, + 46, 47,116,238,201,201,240,242,242, 2, 77,211, 72, 76, 76,196, 31,127,252,129, 58,117,234, 64, 42,149,154,228,182, 74, 69,151, +154,160,112,148, 97, 19,165, 82,105,229,226,226, 2,147, 35, 90, 28, 15,149,150,128, 78,199,226,241,227,199, 72, 74, 74,194,243, +103, 79,208,178, 32, 23, 60, 40,240, 60,111, 82, 68,203,205,205,205,223,219,219,123,211,210,165, 75,197,238,238,238,224,121, 30, +182,182, 54, 80,169, 84, 72, 79,207, 64,195,134, 13,225,225,225,129,165, 75,151, 2,192,222,191,218,100,189,114, 76,149, 24,173, +210,134,235,179,247, 61,145,153,105, 1,138, 34, 75,140,115, 21,125,180,196, 0,208,169,251, 0,250,220,233, 95,205, 25, 96, 81, + 50, 69, 45,162,171, 46, 71, 3,203,113,242,138,190,143,143,143,135, 72, 36,194,161,131, 7,145,153,146,130,128,128, 0,180,106, +213, 10, 79,158, 60,193,221,187,119, 97,111,111, 15,133,123, 91, 92,124,166, 71,100,146, 26,214,214,214,136, 77, 32,255,206,148, + 1,227,186,118,237,250,213,247,223,127,239,232,236,236, 44, 74, 75, 75,171,191,126,253,250,128,245,235,215, 79,249,228,147, 79, +156, 62,249,228, 19, 91,133, 66, 65, 39, 39, 39,251,126,254,249,231,205, 67, 67, 67,235, 0, 88, 85,153,160,185,185,165, 29, 37, + 54, 7, 65,208,176,177,182, 5, 45, 49, 7,199,208, 96, 57,192,202, 90,129,107,119, 15,225,106,120,222,132,212, 12, 28, 52, 42, + 62, 86, 84,238,246,246,246,175, 69,170, 39, 79,158,140,173, 91,183,150, 52, 35, 86,215,100, 45, 94,223,197,130, 40, 50, 89,201, +241, 52, 8,109, 29,156, 60,122, 61, 59, 43, 46, 57,240,109, 48, 89,197,215, 56,158,231,241,236,217, 51,168, 84, 42, 92,190,124, + 25, 95,127,253,117,218,171, 38,203,209,209,113,156,149,149,213,194,252,252,252,229,201,201,201,107,171,188,241, 43, 52, 81,197, +175,139,231,229, 54, 39, 26,185,170, 94,229, 69,178, 60, 92,100,103,238, 94,222,237,101,205,223, 39,240, 98, 60,240, 56,247,161, +101,152,227, 59,189, 90,246, 38,155,109,248,166, 86,171, 9,179,207,196,231,106,234, 87, 20,217,226, 88,182,153,185,133, 37,128, + 84,220,185,125,161,196,100,101,100,230, 64,171,167,160,213, 17,208,232, 73,188,219,245, 61,172,219,180, 11,137,169,153, 96, 89, +182,241, 91,102,178,236,252,253,253,131, 7, 13, 26,132, 69,139, 22, 33,244,251,239,117, 19, 9, 34,151, 6,248, 83, 44, 11,142, +231, 9,210,184, 78,236,101,116, 86,174, 92,121, 20,192,208,165,147,209, 54, 43, 31,163, 92,251,240,118,181,250, 20, 46, 56,112, + 38, 15, 0,118,105,161,101,171,204,160,160, 32,162,184,101,205,212, 22,182,127, 58,116, 80, 80,208,197,144,144, 16,148,158, 87, +246, 3, 75,167,250,189,190,156, 62,105, 89,203, 30, 29, 8,229,244,110,200,204,213, 48,115, 34,245,146, 4,117,229, 38,171, 52, + 95,174, 95,143,187, 49,133,231,177,187,163, 35,102,124,248, 33,120, 6,184,250, 48, 18,251, 67, 67, 49,164,107, 87,152,203,100, + 70, 71, 54, 56,142, 43, 55,138, 85, 58,154,101,106,212, 41, 59, 59, 27, 7, 15, 30, 68,171, 86,173, 32,151,203, 65,211, 52,154, + 52,105,130,168,168, 40,120,123,123,131, 32, 8, 28, 59,118, 12,253,251,247,199,211,167, 79,209,182,109, 91,139, 23, 47, 94,152, +108,180, 34, 35, 35,173,120,158,127,167, 56,250, 81, 93,180, 90, 45,162,163,163,209,167, 79, 31,216,218,218,194,205,109, 47, 66, +207,236,134,220,255, 35, 16, 4, 76, 50, 90, 44,203,142,233,221,187,183,152, 32, 8,168,213, 42,200,100,102, 48, 55,183,128,165, +165, 21,124,125,235, 35, 41, 41, 9, 61,122,244,208,197,198,198,110, 80, 42,149, 7, 76, 93, 87, 63, 63, 63,243,184,184,184,143, +106,213,170, 37, 1, 0, 51, 51,179,134,222,222,222, 95, 60,125,250, 52,207,212,168, 86,177,193, 34, 8, 2, 20, 69,149, 24, 45, +154, 36,225,226,236, 88,242,190,168,127, 26, 81,137, 86,110, 98,134, 86, 10, 0,158,158,158, 88,183,249, 4,217,187,119,111, 76, +153, 50, 5, 6,131, 1, 27, 54, 20, 14,178, 27, 54,108, 24,244,122, 61, 14, 31, 46, 28, 36, 73,211,116,165, 97,147,219,183,111, +227,206,157, 59, 48, 24, 12,200,201,201,193,111,191,253,134,139,151, 46, 97,223,177,223, 17,247,236, 9,154,212,247,194,216,177, + 99, 32, 18,137,176, 99,199, 14, 4, 6, 6,254,173, 23, 4,145, 72, 52,124,235,214,173, 46,219,183,111,207, 62,118,236, 88, 65, +155, 54,109,164,107,214,172,113, 92,183,110,157, 66,167,211, 97,234,212,169,169, 55,110,220,208,246,235,215,207,124,203,150, 45, + 46,117,235,214,237,198, 48, 76,121, 70,203, 28,192, 16, 0, 35,178,242,116,116,118,158, 26, 28,163,195,179,184,231,200,201,215, +129, 99,245,120,153,144,132,124, 13,139,140,204, 60, 52,105,214,253,199, 11, 23, 46,204,213,235,245,115, 0,132, 84,181,158, 15, + 31, 62,196,141, 27, 55, 16, 23, 23,135,103,207,158,149,117,138,227,198, 97,215,174, 93, 38, 71,180,202, 55, 89, 20, 8,173, 55, + 66,142,133,101,167, 62, 81,190, 53, 38,171,232, 26,180,192,197,197,101,129,139,139,139,236,236,217,179,214,181,106,213, 2,195, + 48,186, 87, 35, 89,157, 58,117,154,183,117,235, 86, 23,111,111,239,201, 0,214,254, 19,214,157, 36, 49,110,249,198, 96, 7, 75, +201,203, 36, 60, 94, 85,148, 75,144, 2, 84,185,192,133, 61,160,219,207,127, 62,185,223, 76,219, 89,219, 23,141,227,192, 85, 56, + 66, 54,246,105, 60, 54,110, 92,135,105, 83, 71,225,151,159,150,131,227,104,104, 13, 20, 60,107,183,129, 86,207,129, 32,105, 4, + 52,107,129,243, 23, 46, 67, 68, 2, 7,183,111,124,203,124, 22, 50, 35, 34, 34, 54, 28, 59,118,236,211, 41, 83,166,128,227, 56, +201,194,141, 27,213,105,105,105, 75, 96, 90,254,171, 87,117,250,111,220,184, 49,102,214,186,180,163,211,134,131,138, 59, 73,100, +222,121, 4,187,129, 51,121, 28, 90, 70,160,121,125,100,202,203,175,226, 47,189, 50,127, 59,140, 86,177,147, 44, 61, 47,143,102, + 62,117,190,177,182,179, 29, 67, 90,186, 57,204,152, 50,145,126,154,172,193,225, 90, 31,230,255,177,243, 7,243,100, 70,250, 99, + 44, 52,107, 76,249,227,253,127,252, 81,242,122,197,222,189,229,126,167, 28, 56,208,232, 59,179,138,162, 88,166, 70,178, 0, 64, + 46,151,219,116,235,214, 13, 93,186,116,193, 7, 31,124, 80,210, 39,171,105,211,166,216,183,111, 31, 6, 12, 24,128,123,247,238, +193,197,197, 5, 13, 26, 52, 64,131, 6, 13,240,235,175,191,154,122,145, 3,203,178,240,247,247, 47, 30,117,216, 36, 33, 33,193, +170,186, 5,169,213,106,145,145,145, 1, 59, 59, 59, 72, 36, 18,180,110,221, 10,159,126,214, 26, 14, 46, 63,195,223,175, 62, 10, + 10, 10, 74,134,191, 27, 81,217,250,215,171, 87, 15,105,105,105, 72, 75, 75,131, 66,161,128,171,171, 43,156,157,157,177,106,213, + 42,126,237,218,181,167,245,122,253,134,244,244,116,147, 35, 89,206,206,206, 29, 8,130,152,167, 86,171, 37,165,238,112, 37, 10, +133,226,184, 90,173, 94,162, 84, 42,141,238, 8, 74, 16, 4,244,122, 61, 8,130,192,169,103,174, 40,208, 17,200, 77,184,131, 41, +239,123,149, 49, 94, 34,145,168,202,230, 82,158,231, 11,134, 14, 29,234,232,225,225,142,248,216,135, 56,116,136,199,247,223,127, + 95, 60, 42, 18, 49, 69, 55, 6,197,239, 59,119,238,140,218,181,107,131, 55, 33, 87, 6,199,113,120,240,224, 1,246, 30,191, 8, + 23, 47, 63,188,124, 28,141,187,191,158, 68, 45,133, 29, 26, 53,107, 1,131,193, 80,163,212, 27,111, 2,131,193,176,205,199,199, +135,215,233,116, 23, 1,172, 11, 15, 15, 31,165, 84, 42,167,158, 56,113,194,117,208,160, 65, 73, 39, 79,158, 92, 3, 96,123,120, +120,120,240,183,223,126,219,133, 97,152,114, 71, 11, 82, 20,245,203,231,159,127,222,105,208,160, 65,132,152, 52,232,206,158,217, + 65, 51,140,129,248,114,206, 54,246,194,149,139, 36,195, 24,136, 15,134,126,206,253,250, 71, 56, 57,225,179, 21,108,211, 54,189, + 17, 17, 17,225, 28, 20, 20,244,173,193, 96,168,212,104, 21, 71,170, 42,138, 80, 82, 20,133, 81,163, 70, 97,223, 62,227,123, 80, +141, 5,188,173,188, 44,110, 44, 94,223,213,130,160,243, 75,153,172,186, 8, 57, 22,150,157,242, 56,233,173, 50, 89, 0,144,145, +145,177, 25,192,102,142,227, 82,204,205,205,145,151,151, 87,222,241, 39, 11, 15, 15,151, 73, 36, 18,116,239,222,221, 46, 52, 52, + 52,134, 36,201,181, 73, 73, 73, 21, 58,142,242,154, 9,203,107, 78, 68, 13, 70, 29,218, 42, 16,212,186, 67, 51,203, 71,214,139, + 44,101,180,230, 94,173, 24,153, 21, 1, 32, 71,235,244,236,218,139, 33,185, 68,170,180,105,139,206,205, 97, 69,155, 7,101, 51, +121,229, 26, 45,146,162,238,230,100,101,247,204,205,211,225,202,213, 8, 12, 29, 82, 15, 90, 61, 1,142, 35,145, 95,160, 5, 40, + 17, 72, 0,195, 62, 28, 9,158,160,145,153,146, 4,138,162,194,193, 48,120,203,152, 29, 28, 28,220,115,206,156, 57,117,102,204, +152,129, 25, 51,102,120,109,221,186,117,243,226,197,139,103,164,165,165, 53, 70, 21,201,199, 43,209,169,117,114,223,252,233,199, + 47,111,202,233,221, 78,253,184,121,253,194,200, 87,243,250,200, 20,137,240,132,166,144,193,243,101,187, 25, 5, 5, 5,117, 44, + 61,255,151,241,106, 39,248,146,247, 70,245,209,170, 87,199,237,189,102, 77,253, 63,155, 59,103,174,101,212,181, 11,152,245,205, + 58,222,167, 69,183,188,205,151,239,234,242,205,107,247,204, 79,127,114,213, 88,127, 1, 0,239,189, 59, 0, 77, 26,182,122,237, +203,192,206,133,201,218,175,156,191,141,148,180, 68,163, 43,219, 34,115, 80,110,159, 44, 99,134,244,191,138, 90,173,206,142,136, +136,112, 76, 72, 72, 40,211,241,189,118,237,218, 32, 8, 2, 97, 97, 97,184,113,227, 6,134, 14, 29, 10,154,166, 33, 18,137,112, +241,226, 69,147,162, 49,165,162, 75,197,163, 14,123,184,187,187, 87, 52,218,176, 74, 45,181, 90,141,156,156, 28,156, 57,115, 6, +245,234,213,195,226,197,139,225,234,226,132,185,115,167,131,227, 56,228,230,230,130,101, 89, 99, 35, 90, 92,113,180,136,227, 56, +164,165,165,161, 78,157, 58, 88,191,126, 61,214,172, 89,243,173, 82,169, 60, 97,234, 58,122,120,120,216,176, 44,251,101,239,222, +189,187,245,235,215, 15, 61,122,148,205,199,186,103,207, 30,203,195,135, 15, 47,249,225,135, 31,222,211,235,245, 75, 83, 83, 83, +211,140,209,253,249,231,194,244, 75,242, 54, 11, 48,107, 80, 45,140,152,180, 3,171, 86, 29,129, 84, 42, 45, 83,241, 46, 90,180, +168, 82, 19,195,241,188,143, 56,253, 90,210,244,153, 43, 29,151, 44, 9, 69,104,104, 42, 72,146,132,139,139, 11, 72,146,196,243, +231,207, 65,146, 36,188,188,188, 64,146, 36, 18, 19, 19,139,251, 4,102,161,156, 81,143,229,223,133,147,208,104, 52,136,127, 25, +135,132,216, 24, 88,228, 38, 67, 97, 37, 71,214,195, 7,104, 50,118, 92, 73,254,167,191,153, 93, 58,157,110, 87,169,247, 43, 79, +158, 60,169, 35, 8,226, 3, 20,246,211, 40,142,104,124,203, 48,204,183, 21,137,180,105,211,166,233,156, 57,115, 68,197,233, 54, + 92, 61,191, 99,244,122, 61, 7, 0,245,155,188, 83,198,237, 63,121,242, 4,171, 86,173, 66, 65, 65, 1,196, 98,177,216,152,253, +192,113, 92,201, 8,195,242, 76,152, 41, 38, 11, 0,236,189,220,127, 12,187,115,145,189, 31,187, 73, 29,254,232, 55, 51,229, 75, + 18,164,238,237, 53, 89,175, 70,182,220,221,221, 23,112, 28,199,243, 60, 63,191,212, 87, 82, 79, 79,207,203,103,207,158,181,103, + 24, 6, 63,252,240,131, 77,114,114,178,205, 59,239,188, 51, 11, 64,133, 70,171,188,102,194,242,154, 19, 81,106,212,161, 84, 42, +181,211,233, 42, 12,158,188, 54,234,144,101,225,107,101,105,131, 44, 36, 64,235, 96,104,154,109,207,100,158, 83,142,187,231,250, +162, 89, 67,115,214, 80,135,204,213,193, 77,110, 3,142,231, 43, 28, 26,173, 53, 24,126,187,119,231,110,119, 79,143,122,212,137, +144, 75,232,219,127, 16,180, 90, 18, 26, 3, 1,130, 18,129,160,196,104,220,164, 25, 26, 52,106, 2, 30,192,237,155,215, 24,157, +193,112,238,109, 42,123,151,246,159, 14, 37, 8,172, 5,207,241,229,228,209,170,211,191,127,255, 37, 0, 62,171, 74,199,177,205, +167, 67, 73,178, 80,167,116, 30,173,207, 63, 13,198,195,155, 34,235, 75,119,150,137,123,180,193,169,180, 80, 2,114,217,255, 71, + 29,138,200, 26,165,230,248,183, 24,174,170,141,150,135,135,135,141,149, 84,246,243, 39, 99,199, 88,190,184,127, 29,201,145, 97, +184,122, 41, 38,107,255,225, 35,153, 5, 25,169, 99, 77, 48, 89, 37,205,124,246,206,181, 80,219,239,117,163, 37,179, 80, 0, 0, +106,251,181, 2,101,110, 90, 26,161,242,162, 89,213, 49, 89,165, 47,216,229,229,208,154, 48, 97, 2,182,110,221,138,246,237,219, +195,199,199,167,228, 98,111,106,212,172,156,232,146,201,163, 13, 75,147,151,151, 7, 47, 47, 47,108,217,178, 5,225,225,225,176, +180,180,196,208,161, 67,145,151,151, 87, 98,176,140,237, 12,207,243,252,147,179,103,207,182, 28, 60,120, 48, 47, 18,137,136,236, +236,108,216,216,216, 96,253,250,245, 5, 74,165,242, 84, 53, 76,214, 32,177, 88, 60,125,200,144, 33, 84,253,250,245,145,146,146, + 2, 43, 43, 43, 3, 65, 16, 34, 0,176,177,177, 49,152,153,153, 33, 56, 56, 24, 1, 1, 1, 29,102,204,152,209,158,166,233,245, + 73, 73, 73, 59, 42, 59,150, 8,130, 40,169, 80,199,174,141,134, 78, 87, 88, 65,111,216,176, 1, 69,125,221,254,223, 68, 16, 27, + 11, 24, 49,146,197,194,194, 2, 62, 62, 62,229,150,125,135, 14, 29,112,251,246,237,194,166, 73,154,134,163,163, 35,174, 94,189, +106,212, 72,170,226, 68,144, 17, 17, 17,240,171,237,128,240,208,179,112,144,139, 16,224,234, 12,247, 14, 29, 17, 19, 19,243,119, + 70,179, 8, 20,246,195,232, 90,116, 12,110, 3, 48,161,212,251,245, 0,126, 52, 69,144, 97, 24,158, 36, 73, 34, 62, 62, 94, 47, +151,203, 9, 59, 59, 59, 90, 42,149, 66,171,213,150, 24,174, 39, 79,158, 32, 36, 36, 4, 9, 9, 9,176,179,179, 35,173,173,173, +161,215,235,179,140,209,247,245,245,133,179,179,115,153,142,239, 99,199,142,173,150,201, 26, 5,248,111,253,110,105, 45, 41, 73, + 89,251, 57,188,135,103,209,207, 53,164, 14,178,255,130,201, 2,128,236,236,236,205, 0, 54, 23,191,119,112,112, 24, 77, 81,212, + 92,173, 86,107,125,241,226, 69, 27,133, 66, 65,236,216,177,195, 48,127,254,252,108,138,162,178, 8,130, 88,253,247,155, 67, 68, +166,231,196,122,137,108, 93,185,251, 26,254,218,212,248, 89, 13,178, 68,245, 20, 68, 35,127,244, 79,141,186, 50,154,137,109,151, +162, 76, 38,121,112,145,149, 92,131,183,205,154,179,232,203,152,232,187,158, 50, 43, 25, 38, 4,207,193,169,211,231, 65,144, 34, + 92,190, 22, 6,157,158, 69,122,102, 14,134, 12, 27, 14,119, 23, 7, 68,222, 56,147,198,112,220,250,183,203,100,115,235,186,247, + 29,109, 43, 53,147, 23,237, 19, 22,187,126,154, 14,146, 92,139,175,190,250, 10,254,254,254,147, 34, 34, 34,190, 70, 21,121,180, + 8,130, 91,215,184,227, 48, 91,177,180, 80,135,231, 88,108, 57, 56,171, 40,143,214, 52,172,223,124,184,113,163,218,207, 22, 86, +150, 71,235, 45, 50, 89,165,231,149, 27, 45, 47, 47, 47,169,185, 8,227, 69, 20, 61,227,147, 15,251, 41, 82, 99, 31, 34, 33,234, +110, 97,243,130, 94,173, 79,126, 28,101, 76, 42,244,174, 40,155,191,131,175,172,233, 74,163, 49,234,142,190,140,102,113,133,251, +106, 52,203, 68,147,245,154,102,105,179, 85, 58,111,150,135,135, 7,150, 44, 89, 98, 76, 30,173, 87,183,189,152, 30, 40,236, 0, + 95,186, 51,124, 15, 35, 77, 86,185,154, 10,133, 2, 25, 25,133, 25, 18, 58,117,234,132, 78,157,254, 63,158, 65,175,215,151, 68, +177, 44, 45, 45,203,139,104,189,166,105,102,102, 54,235,200,145, 35, 99,174, 93,187, 54,248,139, 47,190, 16,117,233,210,165,216, +204,169, 96,220,179,221,202,104,178, 44, 27,124,230,204, 25,138,227, 56,108,217,178, 5,183,111,223,230,229,114,249, 60,185, 92, +190,206,204,204,140, 85,171,213, 19,198,141, 27, 55,124,225,194,133,100,135, 14, 29,112,253,250,117,178, 78,157, 58, 35,129, 50, + 73, 44,203,221,246,176,176, 48,144, 36, 9, 38,243, 37, 38,205,218, 15,115, 51, 26,209,209,209,200,204,204,124, 45,137,169, 49, +251,179,116,164,164,120,234,208,161, 67, 73, 51,100,235,214,173, 65, 81, 20,238,221,187, 87, 81, 51,108,105, 77,222,222,222,190, +228,248, 16,139,197, 56,127,254, 60,190,249,230, 27,120,218,217, 32, 43, 42, 28,206,157,222, 69,183, 49,227, 48,116,232, 80, 80, + 20, 5, 59, 59,187,146,200,175, 17,199, 82, 77, 40,173, 57,198,207,207,111,100,100,100,164,123,227,198,141, 93, 34, 34, 34, 58, +251,251,251,123,133,135,135, 23,191,151,194,184,190, 57, 37,154,183,110,221, 58,180,110,221,186,224, 81,163, 70,137, 57,142, 99, + 95,188,120, 97, 0, 64, 56, 59, 59, 83,183,110,221,226, 78,156, 56, 1,181, 90, 13,119,119,119,210,205,205,141, 56,119,238, 28, + 23, 21, 21, 21,198,243,252, 28, 99,182,157,101,217, 50,105, 28,138, 95,239,217,179,199,228,243,189, 86, 3,223,197, 93,222,169, +239,145,158,116, 15,202,196, 88,176, 57, 10,125,200,177,147, 90, 19, 77,214,159, 93, 70,127,165,230,162,199,143, 31,187,105,181, + 90, 72, 36, 18,108,216,176, 65,191,100,201,146,200,244,244,244, 64,148, 63,162,188,140,102, 53, 71, 29,102, 86,162,249,218,168, +195,156, 12,156, 58,118,252, 86, 75,139,254,219, 48, 41, 41,173,164, 99, 35, 79, 16,118, 71,156, 26, 6,202, 91, 53, 78, 36,127, + 93, 64,230,177,170, 83,149,108,187, 78,173,211, 13,234, 63, 96,216,239,251,246,237,181,152,191, 96, 1,174,134,133, 35, 35, 59, + 31, 28, 79,129, 35, 8,204,157, 59, 31,206, 14,118,200, 77,122,172,210,234,245,253, 81, 54,135,214,191,190,220, 9,130,156,124, +238,196,142,181, 36, 1,174, 32,229,145,148,202,139,149,143, 24,218,159, 30, 52,104, 16,142, 28, 57,130,136,136,136, 77,149,152, +172, 18, 77,158, 39, 39,135, 95,220,191,150, 0, 56,117,218, 35, 41,157,255, 76, 62,242,195,254,244,208,161, 67,113, 52,228, 26, +246,157,124,182,113,223, 73,156,196,219,141,233,153,225, 45,105, 68, 4, 54,244,118,235,208,172,145,140,102,213, 72,136,138, 69, +102,129, 6,231, 30,190,200, 38,121,178,218,185,117, 10, 47,144, 98,188,124,249,184,156, 59, 43, 89, 81,133,174, 49, 73,147, 36, +201, 50,209,172,154, 68,178, 74,175,167,147,147, 83,153,199,185,148,174,184,139,251, 0, 85, 35,181,195,172,151, 47, 95, 90,189, +124,249, 18, 60,207, 35, 44, 44,204,170,117,235,214,179,106, 18,205,154, 62,125,122, 73,212,234,213,121,121,159, 85, 69, 81,167, +244, 53, 6,131,225,224,140, 25, 51, 38,181,110,221,186,251,130, 5, 11, 8,152,240, 0,222, 87,162, 57, 12,199,113,184,112,225, + 2,142, 28, 57,194,234,245,250,241, 74,165, 50,188,212, 34, 63,220,185,115,231,220,128, 1, 3,118, 60,122,244,136,138,140,140, + 4,207, 87, 61,238, 84,173, 86,195,199,199, 7, 12,195, 96,217, 36, 15,228,229, 53, 6,195, 48, 96, 89, 22,230,230,230, 37, 81, +188,210,230,185,170,227,136,101,217,215,140, 86, 88, 88, 24, 40,138, 66, 96, 96, 32,238,222,189, 91, 18,209,170, 42, 2,165,215, +235, 95, 58, 57, 57, 57, 45, 90,180,168,100,189,210,210,210,112,246,236, 89,180,105,219, 14, 13,199, 79, 64, 82, 82, 18, 86,175, + 94, 13, 87, 87, 87, 44, 94,188, 24,153,153,153, 96, 24,230,175, 14,167,247,140,140,140,116,255,240,195, 15, 83,195,195,195,221, + 67, 66, 66,108,130,130,130,204,135, 13, 27,150, 26, 30, 30,238, 78, 16, 68, 59,152,216, 9,154,227,184,217,115,231,206, 61,189, +120,241,226, 89,159,125,246, 89,235, 81,163, 70,137, 68, 34, 17,151,152,152,200,236,221,187,151,240,241,241, 33,197, 98, 49,113, +230,204, 25,238,230,205,155, 55, 24,134, 89, 6,224,178, 41, 17,231,210, 38,139,162, 40, 99, 77, 86, 25,166, 58, 74, 71, 90,146, +105,129,235, 54, 44, 33,235,215,118,215,239,220,123, 54,254,242,245,199, 79, 41, 45, 51,245,231, 74, 82, 3,188,205, 80, 20,117, +192,207,207,111,244,228,201,147,205,122,244,232, 33, 93,184,112, 97, 78, 94, 94, 94, 69, 38,171,156, 27,230,191,100,212,225, 79, +179,191, 8,153,250,121,227,209,222, 31, 59,215, 66,104, 65, 42,178,104,138,180,178, 33,209,204,139, 66, 94,250, 19,197,201,223, +183, 63, 7, 80, 85, 94,182, 91,119, 30, 68,116,109,212,184,233,225,101,139,151, 57,206,155, 57, 67,116, 56,228, 55,240,140, 30, + 97, 23, 47,194, 66,204,242, 81,119, 66, 83,180,122, 93, 63,188,133,143,224, 81, 94,253,113, 31,128,227,118,118,118,247,199,140, + 26,229,227,231, 55, 12,114,185, 28,135, 14, 29,194,174, 31,126, 96,215, 0,131,165,192,221,224, 42,242,233,165,222, 40,209,185, + 55,110,204, 24,223,102,205, 62,134, 92, 46,199,193,131, 7,177, 99,205, 26,163,117,254,229, 20,103,134, 63,133,255,103,136,175, +162,143, 22, 73,228,221,120,252, 34, 63,236,241,139,124,112, 60,207,241,188,150, 36, 17, 95,160,215, 47,126,252, 44,177, 90,166, +160,184,233,240,219,239, 38,191,185, 54,143, 82,230,167,186, 67,186,203, 49, 89, 9,165,159,145, 86,186,146,174,232,181,193, 96, + 72, 48, 82,126,169,167,167,231,107,159, 85, 63,244,203,155,100,178,140,205,163, 5, 0, 25, 25, 25, 74, 0,243,174, 95,191,190, +167,123,247,238,227, 0, 36, 86,179,140,182,116,236,216,113, 60, 0,138, 32,136, 77, 73, 73, 73,225,175,157,240, 74,101,140,171, +171,235,138,218,181,107, 79, 40,188, 49, 37,182, 84, 81,145, 63,107,220,184,177,190,188,178,168,232, 61,199,113, 85,150, 81,118, +118, 54, 90,181,106,245,218, 51, 45,121,158,199,139, 23, 47,138, 35, 78, 37,251,190, 50, 3,151,159,159, 63,225,211, 79, 63,221, + 44, 18,137, 60, 1, 16,197, 38,151,101, 89,234,199, 31,127,148,177, 44, 75, 1, 32, 72,146,100, 68, 34,145,230,200,145, 35, 12, +195, 48, 47,181, 90,237,132,191,248, 2,113,144, 40,124, 20, 67, 65,100,100,100,253,162, 72, 86, 66, 68, 68,196,189,125,251,246, + 41, 0,236,175,166,238,101,149, 74,117,121,201,146, 37, 29, 54,108,216, 48,123,194,132, 9,173,134, 14, 29, 74,119,234,212, 9, +167, 78,157, 98, 47, 92,184, 16,166, 86,171,151,154, 98,176,138,202, 50,199,195,195,163,196,112, 85,113, 46, 87,218,145,215,222, + 75,186,110,248, 68, 87,217,150,165,103,243,211,147,116,215, 12,249,186, 57,219,129, 8,252,135, 73, 73, 73,249, 2,192,252,213, +171, 87, 39, 5, 4, 4, 72,197, 98,177,206, 88,147,245, 23,194,112,217,249,189,190,239, 54,240,120,199,185,159,214,238,214, 57, + 80,238, 81,203,209, 45, 42, 54, 5, 79,174,159, 42,184,127,242,187, 56, 94,155,213, 23,128, 49, 61,215,111,106,245,250,122,211, +103, 76,159, 36, 17,137,186,179, 44,219,164,203,185, 99, 60, 69, 81,225, 58,131,225, 92, 81,115,161,230, 45, 46,242,111, 87,172, + 88,225,227,231,231,135, 67,135, 14,225,220,238,221, 24,146,158,142,243, 20, 69,145, 98,177,253, 73,189,126, 37,140, 51, 72,223, +174, 90,181,202,215,223,223, 31, 7, 14, 28,192,153, 29, 59, 48,184,122, 58, 21,213,117, 45, 1, 40,138,222,166, 3,120, 4,160, + 57, 0, 51, 0, 90, 20, 62,218,201,161,116, 21, 86,244, 93,241,247,151, 8,130,248, 51, 59,194, 86,157, 25,254, 85, 34,158,196, + 53,127,211,107,161, 86,171, 51,125,124,124, 76, 26,115,109, 48, 24, 42,109,195,101, 24, 38,193,219,219,219,232,168,133, 49,166, + 40, 51, 51,179,197,159, 88, 24, 53,234,139, 85,166, 18,225,184, 56, 23, 23, 23,174,184,210, 47,207,132,149,247, 25, 15, 60, 55, +229,127,146,147,147, 31, 1,248,188,186,235,153,148,148,116, 24, 70, 60, 52,218,216,229, 0, 32, 43, 43,235,141, 63,204,151,224, +249,196,133, 11, 23,154,100,176,193,243,149,153,207,240,252,252,252,214,198,252,183, 94,175,199,223,200,129,162,137,140,136,136, + 24, 71, 16, 68, 15, 20, 54, 9,108,194,155,201,230,125, 57, 55, 55,247,242,242,229,203, 59,108,217,178,101, 42,207,243,200,205, +205, 93, 99,170,193, 42,185,123, 78, 77, 61,245,166, 54, 60, 51, 69,247,199,222, 77, 9,239,170,179,245, 83,183,230,235,118, 64, +160, 36, 24,197,243,252, 47, 35, 70,140,104, 3, 96,123, 77,197, 42, 24,117, 88, 83,158,115, 89, 57, 1,231,167,127, 51,230,188, +141,101,111,176,116,125,232,200,147,208,101,156, 2,240, 51,140,235,230, 80,178,189, 12,199,173, 98,116,186, 85,165, 42,151,255, + 66, 57,219,249,251,251, 79, 29, 61,122, 52,230,207,159,143, 51, 43, 87,234, 39, 18, 68,142, 8,224, 79, 23,222,104,146, 4, 48, +211, 88,157,145, 35, 71, 98,254,252,249,248,117,217,178,234,234, 84,134,130, 32,136, 16, 0,152, 53,107,214,156, 37, 75,150,216, +206,158, 61,187,201,210,165, 75, 23, 23,189,127, 88,252,125, 81, 93, 23, 52,123,246,236, 70,165,190,207, 3,112,235, 79,222,159, +229,102,134,255,179,233, 42,104, 10,154,130,166,160, 41,104, 10,154,130,166,160, 89, 19,120,158,239, 93, 56,171,120, 94,209,235, + 82,243,191, 5, 26, 2, 2, 2, 2, 2, 2, 2, 2,255, 66, 74, 71,177,170,243,253, 27,164,184,143, 86,105,182, 0,133,195,186, + 43,114,165,166,140,122,168,142,179, 13, 21, 52, 5, 77, 65, 83,208, 20, 52, 5, 77, 65,243, 63,167, 89,149,246,107,191,231,121, +190, 55, 65, 16, 33, 60,207, 7, 85, 52, 47, 54, 86,175,190, 46, 53,127, 99,221, 14,202,161,184,111,214,107,125,180,254,108,132, +176,170,160, 41,104, 10,154,130,166,160, 41,104, 10,154, 53,162,184, 9, 16, 0, 63,107,214,172,217,255,192,166, 67,151, 34,147, + 85,122, 2, 80, 73,211, 33,207, 31,164, 18, 19, 97, 37,145,200,197, 0,160,211,169,244,110,110,200, 37,136, 65,127,231, 3,111, + 5,254,157, 20, 15,247, 78,121,195,203, 10, 8, 8, 8, 8,252, 55, 72, 43,142, 84, 1, 72, 3, 64, 20,189,215, 21,205,211,138, + 12,217,171,175,203,124,255, 39,162, 68, 5,145, 44,186, 34,147,149,158, 46,119,160,233, 44, 95,150,213, 52, 0, 0,154, 38,163, +211,211,109, 99,120,254, 96,122,117,204,150,131,163,227, 29, 17, 69,185, 25,179,172,129,101, 19,211, 83, 82,202,166,142, 39,136, +183,193,224, 25,107, 34,106, 98, 54,254,116,163,226,224,224,224,228,228,228,244,190,149,149, 85,219,236,236,236,155,105,105,105, + 71, 43,121,238,225, 18,130,192,140,194,227, 10,203, 1,204,174, 68,218,148,101, 95,197, 71, 46,151, 79, 34, 8,194,191,232, 4, +139, 80,169, 84, 27, 0, 60,254, 15, 94,144,204, 0,244,163,105,122,164,131,131, 67,171,228,228,228,133, 0,170,155,205,155, 6, + 48,221,198,198,102,136,141,141,141,119,102,102,230,211,220,220,220, 3, 0, 86, 1,168,114,168,244,194,207, 92,218,118,234,209, +105,222,133, 51, 23,190, 93,248,131,242,250,107,223, 79,119,177,239,222,173,253,252, 11, 39,175, 45,154,179, 62, 41,211,196,117, + 35,139, 38,160,112,116, 36,143,215,147,189,214, 20, 17,128, 62, 0, 58, 1,184, 0,224,164, 49,219, 93, 1,109, 0,204, 41, 90, +231, 85, 0,206,255,195,143, 35,115, 39, 39,167,101, 0,250,208, 52, 29,153,152,152, 56, 30, 64,194,223,188, 78, 52,128,150, 0, +252, 81,152,134,227, 22,140, 75,225, 80, 37,246,246,246, 65, 52, 77, 79, 42, 74,237,178, 33, 35, 35, 35,228,159, 90, 48, 18,137, +100,141,179,179,243,199,106,181, 90, 69, 16, 4, 95, 58,223, 35,195, 48, 9,233,233,233, 45,222,182,139, 26, 65, 16,183,254,225, +171, 56,190,156,207, 42,206,163,149,152, 8, 43,154,206,242, 77, 77, 14, 31,146,164,124, 48, 24, 0, 92, 93,154, 28,112,116,110, +188, 63, 49, 81,162,119,174,223,223, 66, 36,167, 55, 80,148,168,169, 70,167,117, 16,209,162,116, 61, 99,184, 71,234,248, 73,201, +143,142,150,155,108, 81, 68, 81,110,113, 49,231, 29, 25,125, 38, 68, 50, 87,136,204, 60, 43, 92, 91, 87, 87,215,106,109,165,173, +173,183,165, 94, 42,155, 42, 18, 81,221, 56,158,241,231, 57,128, 36, 68, 17, 12,107,248, 93,172,213,126,159,149,245, 52,175,186, +123,176,190, 61,156,121, 96, 40, 8,116, 3,143,115, 4,176,239, 81, 6,146, 77,144, 48,214, 68,212,196,108,148,254,237,106, 0, + 95,188,233, 35,201,205,205,205, 54, 40, 40,104,205, 55,223,124, 99,102, 97, 97, 65,188,124,249,178,199,204,153, 51,223,185,125, +251,246,231,137,137,137, 73,175,154, 62,130,192, 12,142,227, 73, 0, 32, 73, 98,166, 66,225, 40,167, 40,234,181,220, 70, 44,203, +202,211,210, 82, 39,115, 28, 79, 20, 45, 59,131,231,177,214, 24,195, 40,147,201,134,249, 55,110,250,249,178, 21,171, 44,156, 28, + 29,205, 25,150,211, 63,127, 17, 39,159, 55,235,139,214,177, 79, 30,175,213,104, 52,123,171,115, 94, 83, 20, 53, 68, 42,149, 6, + 1,240, 43,250, 44, 74,171,213,134,176, 44,187,223,216, 10,221,201,201,233, 18, 69, 81,181, 76,249, 99,150,101, 95,166,164,164, + 4, 86,179,136, 6,121,122,122,254,220,177, 99, 71,121,171, 86,173, 32,145, 72, 48,127,254,252,233, 74,165,178, 42,163, 69, 3, +152, 46,151,203,135,152,155,155,123,231,231,231,199,170,213,234,195, 18,137,164,235,218,181,107, 61,218,183,111,111,153,146,146, + 66, 80, 20,229,244,235,175,191,126,180,102,205,154, 30, 12,195,116,169,170,146,203,137,229,231, 73,251,248,117,200,137, 61, 63, + 15, 64,207, 87,191,103, 52,178,145, 60,229, 17,164,230,239,198, 23,153, 15,163, 77,150, 72, 36, 90,235,236,236, 60, 90, 83,152, + 43,128,127,181,194, 1, 0,157, 78,151,149,157,157, 93,191, 58,167, 60,128,177, 54, 54, 54,163,191,252,242, 75,219,158, 61,123, + 98,247,238,221,159,108,221,186, 53, 43, 55, 55,247, 23, 20, 38,194,124,100,162,230,140,228,228,228, 94, 34,145,136,240,240,240, +160,212,106,181, 41, 70,203, 23,133, 15, 97,190, 5, 96, 3, 10, 83, 23,116, 6, 10,207,119, 0,203,139,141, 27, 73,146, 27,234, +215,175,255,126, 84, 84,212, 70, 0,223, 86,247, 92,119,118,118,222,188,126,253,250,193,125,251,246,165,210,210,210,220, 2, 2, + 2,246, 36, 39, 39,119,120, 3,151,145, 49, 82,169,116, 90,147, 38, 77, 26, 62,122,244, 40, 38, 55, 55,119, 85,209,254,172,236, +156,114, 7,208,213,198,198,166,203,220,185,115, 45,130,130,130,176,101,203,150, 94, 91,183,110,205,207,203,203,251, 29,133,125, +122,106,100, 2,105,154,158,148,144,144,224,192,243, 60, 92, 92, 92, 38, 1,248, 71, 26, 45,146, 36,215, 14, 24, 48, 96,244,158, + 61,123,228,113,113,113,114, 55, 55,183,146,228,217, 4, 65, 84,187,254, 20,168, 49, 91, 74, 25,174,170,243,104, 73, 36,114, 49, +203,106, 26, 36, 41, 31, 12,126,167,227,143,214, 0,112,233,226,167,131, 29,157, 27, 69, 72, 36,242, 24,169,149,236,200,128, 62, + 93,155, 14, 12,234, 72,184,187, 56, 34, 65,153,234,244,211,190, 51,239,133,156, 57,127, 4,133, 9,196,202,133,209,103,194, 76, + 31,138, 71, 87,126,128, 67,167, 36,172,251, 53, 1,215,239, 63,135, 42, 39, 29,181,156,205,176, 98,106,119, 56,219,202,171,119, +235,229,232,211,153,161,165,251, 63, 28, 54,194,250,253,126,126, 34, 47,103,103,240,188, 20, 49,177,249,237,126, 59,123,190,229, +225,131,123, 39,153,139,124,134, 20,164, 62, 54,250,226,214,204, 5,102, 5,122,244,163, 41,226,163,246, 45, 26,118, 25,214,171, + 3,217,208,175, 30, 34, 31, 70,117, 63,254, 71,216, 10,242,218,195,223, 25,150,223,105, 46,198,177,187,202, 74, 19,250,189,102, + 56,186,116,233,218, 65, 42,149,150, 73,158,164,213,106,197,191,255, 30,218,166, 58,102,163,248, 63,116, 58, 45, 41, 18, 73, 64, +146,196,231,254,254,141,253,210,211,211,207, 19, 4,241,115, 82,146,105,209,130, 79, 1, 73, 22, 77, 55, 39,165, 82, 23, 86,167, +179, 7, 0, 66, 34,201,122, 78,146,141,231,206,153, 99, 65, 81, 20,151,145,145, 1,149, 74, 69,140, 27, 55, 78, 22, 27, 27, 59, + 32, 49, 49,241,135, 42,238, 72,176,117,235, 86, 95, 23, 23,151,215,158, 30,171, 84, 42, 37,125,251,190, 95,157,162,247,109, 18, +208,108,218,153, 51,167,253,114, 51,179, 52, 91, 87,111,190, 99,144,201,181,117,252,234,139, 54,108,217, 97, 61,126,244,240, 79, +163,163, 31,222,131,105,207,171,243, 52, 51, 51, 59,178,114,229, 74,255,206,157, 59,139, 28, 29, 29,145,146,146,130,168,168, 40, +255, 63,254,248,163,223,142, 29, 59,166,171,213,234, 1,128, 81, 15, 68,245,249,125,231,207,142,230,118,246, 96, 13, 6,184, 54, +105, 86,146,223,236,201, 31,103,193,232,245,224, 12, 6,248, 5,245, 43,138, 38,243,240,243,243,171,110,214, 93,215, 70,141, 26, +237, 90,188,120,177, 88,171,213, 34, 44, 44, 12,231,207,159,231,148, 74,101, 85, 9,113,105,130, 32,206, 46, 88,176,192, 61, 48, + 48,208, 50, 61, 61, 29, 44,203, 58, 28, 59,118,108, 82,211,166, 77, 49,184,186, 36, 0, 0, 32, 0, 73, 68, 65, 84,173, 60, 60, + 60, 36, 59,119,238, 68,126,126, 62, 24,134,177,243,246,246,182, 27, 54,108,152,110,231,206,157,211, 1, 44,171, 40,146,149, 27, +203,207, 83, 18,222,239,213,111, 62, 18,201,196,233,247,166,189,135,223,172,234, 18, 37,145,173,247,188,189, 45,115, 19,229, 51, + 45,172, 26,219,229, 38,134,206,124,207,219,123,235,233,167, 70,221, 12,145, 69,149,205,135,251,246,237,147, 71, 69, 69,201,253, +252,252,192,113, 92, 73, 6,254,226,132,179, 62, 62, 62,213,217,143, 75,131,131,131,103, 14, 30, 60, 24, 77,154, 52, 41, 73,138, +250,213, 87, 95, 97,230,204,153,182,151, 46, 93,154,190,119,239,222,233, 71,143, 30, 93, 6, 96,150,137,209,152, 98, 76, 45,227, +175,159, 61,123, 54,232,200,145, 35,195,103,204,152,225, 3, 96, 50,128,249, 25, 25, 25, 29,139,162, 49,146, 34,163, 53,102,250, +244,233, 19,103,205,154,133, 94,189,122,205, 15, 11, 11,251,174,154, 81, 62,138, 97,152, 94,125,251,246,165, 12, 6, 3,204,205, +205, 97, 48, 24,234,214, 52, 40, 1, 96,253,132, 9, 19, 38, 6, 7, 7,195,214,214, 22, 6,131,193,119,223,190,125, 91,231,207, +159,223, 22,192,216, 10,214,117,228,196,137, 19, 63, 24, 49, 98, 4, 90,180,104, 1,154, 46,220,141, 43, 87,174,196,162, 69,139, + 44,206,158, 61,219,111,231,206,157,253,142, 31, 63,126, 24,101, 31,219,101, 18, 28,199,129,166,105,196,199,199,195,209,209, 81, +202,113,220, 25,130, 32,182,100,102,102, 30,253, 7, 85,230,203, 7, 13, 26,244,225,158, 61,123, 44, 0, 96,197,138, 21,152, 54, +109, 26,156,156,156, 96, 97, 97, 33, 88,157,127, 78, 68,107,124,149, 17,173,170, 80,169, 84,205,102,127,246, 17, 72,178,240,174, +177, 94, 29, 79, 44,153, 51,158, 56, 30,114,166, 89,165, 49,120,153, 43, 30, 93,249, 1, 82,143,169,208, 26, 24,220,184,255, 12, +231, 86,244, 40,172, 45,123,206,133, 86,223,165,184,178,177,147,152,153, 45,215,177,236, 85, 56, 59,135,225,197,139,180,170, 76, +150,194,217, 41,100,211,166,101,102,254,117,235, 67,207, 24,144,152,154, 8,130,144,194,221,205, 18, 99, 70,246, 20,117,236,232, +234,240,245,215,155, 79, 37,115,232,175, 74,127, 92,101,194, 80, 95, 7,108,111,230,239, 51,120, 88,239, 64,105, 99,255, 70, 16, + 75,205, 74,190,107,222,162, 5,154,183,104, 65,206,202,207,235,118,243,214,157,110,135,206,222,208,170, 12, 47, 14,196,164, 99, + 84, 21, 23,153, 18,195, 49,101,202, 20, 56, 57, 57,149, 89, 32, 37, 37, 5,127,252,241,123,185,191, 49,225, 66, 86,242, 31,223, +125,247,157,101, 86, 86, 86,207,109,219,182,189,203,113,220,119,201,201,201, 87,140, 17, 25, 1,212,202,145, 74,187,140, 94,181, +138,107,250,254,251,148,141,179, 51,201,177, 44,145,244,244,169,253,234, 31,126,232,148,249,228,137, 89,129,157, 93,102,150, 90, +173,138,137,137,129, 76, 38, 35,104,154,110, 89,142, 84, 10,207, 99, 57, 73, 18, 51, 9,130,128, 84, 42,139, 9, 14, 14,190, 91, +244, 93,173,147, 39, 79,202,251,244,233,163, 2, 16, 7, 0, 82,169,204,141,162, 72,223,194, 76,236, 88,110,140,193, 52, 55, 55, +255,236,219,197,203,204,115, 51,179,213,250,130, 2,131,194,202,130, 32, 44, 44,169,220,156,188,188, 68,101,154,118,238,194, 69, +212,132, 49, 35, 62, 43, 40, 40,152,100,172,201, 10, 8, 8,184,121,228,200, 17, 71,123,123,123,100,103,103, 35, 35, 35, 3, 55, +111,222, 4,199,113, 24, 48, 96,128,180, 93,235, 86,205,230,204,157,119, 61, 62, 49,177,173, 49,102,203,220,206, 1, 43, 2,155, + 22, 86,214,113, 25, 37,229,179,101, 80, 80,201, 50,139, 18,114,138,163,115, 53,121,132, 84,219, 46, 93,186,136, 1, 96,236,216, +177,185,121,121,121, 75, 0,236, 65,213, 25,253,167,207,155, 55,207,173, 78,157, 58, 94,123,246,236, 65,126,126, 62, 0, 56,214, +169, 83, 7,190,190,190,236,133, 11, 23,224,235,235, 11, 75, 75, 75, 92,186,116, 9,215,175, 95, 71,139, 22, 45, 44,197, 98,241, + 96,189, 94, 95,174,209,234,212,163,211, 60,105, 31,191, 14,245,155,143,132,133,149, 11,182,238,221,143, 71,119,118,116,208,234, +163,230,137,217,139, 35,212,188,116, 84,218, 75,139, 89,181, 90,116,180,175,215,232,125,120, 53,191,235,160, 97, 47, 63,155,215, +173,206, 82, 90,166,217,177,112,149, 50,163, 34,147, 5, 96,197,128, 1, 3, 6,237,219,183,207, 6, 0,194,195,195,145,146,146, + 2,133, 66, 1,153, 76, 6,145, 72, 84,242,124,210,106, 50,106,195,134, 13, 37,166,141, 97,152,146,167, 0,200,229,114,188,243, +206, 59,104,218,180, 41,142, 30, 61, 58,170, 2,163, 21,216,186,117,235,221, 94, 94, 94, 30,165, 63, 44, 40, 40,192,208,161, 67, + 1, 0, 29, 59,118,236, 98,102,102,198, 23, 27, 66,165, 82,153,127,235,214,173,110, 0,194, 42,112,150,234,196,196, 68,124,249, +229,151,120,254,252,249, 39,155, 54,109,122, 1, 64, 38,145, 72, 74,238,143, 1,248, 54,106,212,104,237,180,105,211, 16, 27, 27, +139,200,200,200,155,168,126, 83, 42,107,110,110,254,196, 96, 48,180, 96, 24, 6,106,181, 26,253,251,247,151, 29, 62,124, 56,133, +162,168,232,244,244,244,225, 40,236,147, 98, 44, 50, 0,171,130,131,131, 39,206,152, 49, 3,191,255,254, 59,142, 31, 63,142, 17, + 35, 70, 96,234,212,169,176,176,176, 24, 61,117,234,212,235, 40,124,160,249,171,116,217,176, 97, 3, 88,150,125,237,220,144,201, +100, 8, 12, 12, 68,195,134, 13,113,252,248,241, 46, 53, 48, 90, 94,129,129,129, 18,142,227, 80, 80, 80,128, 11, 23, 46, 88,152, +153,153, 89,184,187,187,143, 3,240,143, 49, 90, 94, 94, 94,193,251,246,237,179, 40,221,250, 35,149, 74, 81,234, 56, 16,248,251, + 35, 90,149,222, 97,149,160,211,169,244, 52, 77, 70,187,186, 52, 57,112,233,226,167, 37, 77,135, 0, 25,173,211,169,244, 0,192, +114, 60,114, 85, 12,204,164, 36,226,146,243,240,240,105,122,121, 82,101,134,104,138,204, 60, 33,109, 21, 7,158,231,161,211,179, +208,230, 36, 99,201, 41, 21,162, 18, 52,208, 21,100, 65,167, 47,236,134,229,224,224, 64,159, 57,243,219,180,208,208, 63, 38,254, +242,203, 47, 84,130,181,117,100, 30,208,172, 60, 77, 91, 91,111, 75, 78, 34, 57,176,113,211,124, 51,158,122,138,152,151, 5,168, +231,222, 10, 14, 54, 30, 72, 78, 47,192,213,200, 95, 17,253, 56, 4,117, 92,188, 48,245,179,247,100,223, 46,222,179, 95,204,212, +246,204,206,126,158, 91,209,122, 22,223, 69,109, 62, 29, 3, 38,243, 41,216,140, 88,176,121, 73,175, 45, 96,161,240, 68,243,206, +110, 80,120,212,149,142,154,186,104, 36, 80,198,104,149,214, 76, 33, 8,114, 35, 73, 18, 19, 9,130, 64,147, 38, 1, 9,171, 86, +173, 42, 47, 21,184,190, 73,147,128, 4,138, 34,221, 11, 47,236,228, 6,158,231, 82,170, 88,207, 50,166, 70, 34,145,206, 40, 12, +251,187,196,159, 58,117, 74, 63,104,208, 32,172, 92,185, 82, 50,115,230,204,185, 20, 69,141, 45,167,121,175,140,102,127,192,211, +166,110,221,238,223, 93,189,202,139, 12, 6, 34,243,230,205,220,108,165,146, 73,206,203,147, 28,140,142,238,245,241, 23, 95, 72, + 60, 60, 60,112, 37, 36,196, 62,173,160,128,207,214,106,213,217,217,217, 60,195, 48, 55, 43,208,156,173, 80, 56,202,183,110,221, +234, 27, 28, 28,124, 87,169, 84,206, 6, 0, 23, 23,151, 37, 0, 26, 2,136, 43,245, 25, 54,109,218,159, 56,110,220,184,152,212, +212,212,217,149,173,103, 41, 26, 57, 42, 28,229,123, 55,239,124, 96,103,105, 70, 42,220, 93, 73,145,141, 13,205, 72,204,196, 28, +160,174,227, 81,215, 28, 64,163, 10,126,251,170, 38, 97,102,102,118,228,196,137, 19,142, 34,145, 8, 44,203, 66,161, 80,224,249, +243,231,200,206,206, 70, 94, 94, 30,158, 69, 71,161,182,135, 7,190,158, 53,211,101,242,204, 89, 71, 84, 42, 85,139,255,177,119, +221, 97, 77,100,237,247, 76, 18, 66, 32, 9, 77,186,160,136, 5,236,189,139, 34, 54,236,187,246,186,246,142,117, 45,168,107, 93, +235,170,107, 87,172,235, 98,239,174,172, 29, 21, 11,118,186, 8, 34, 32, 37, 32, 53,148,244,100, 50,247,247, 7,101, 17, 41, 1, +221,239,247,237,126, 57,207,147, 39,153,100,230,228,157,123,239,204, 61,243,222,123,223,183, 84,103,246,101, 2,100,141,250, 11, +207, 94, 89, 89, 12, 74, 15,123,233, 88,239, 37, 17,159,152,152, 8,161, 80,136,102,205,154, 9,159, 62,125,250,184, 2,145, 85, + 50, 9,240,200, 46, 93,186,152,156, 62,125, 26,109,219,182,133,153,153, 25, 30, 62,124,136,176,176, 48,168,213,106,150, 68, 34, +129, 80, 40,196,150, 45, 91, 80,187,118,109,228,231,231,227,227,199,143,150, 6, 6, 6, 86,165, 34,218, 23,115, 62,188,253,112, + 67,238,135, 7, 63,125,162,110,245, 61,114,230, 28,166,141, 25, 5, 59, 18,251,216,172, 62,181,161,207,160, 46,171, 9,187,214, + 64,129, 73, 11, 11,151,102,131,192, 53, 20,194,107,233,122, 68,135, 95,183,144,229,135,206,161,180, 73,181,214,238,184, 48,191, +140,115,167, 0,176,106,213,170, 53,245,194,133, 11, 38,197,174, 23, 54,187, 56,231, 97,201, 36,240, 21, 36,124,175,180, 60, 41, +138, 66,124,124, 60,108,108,108, 32, 20, 10,139, 19,136, 71, 70, 70,226,249,243,231, 40,202, 70, 81, 14,231,184,123,247,238,213, + 18, 8, 4,159,237, 64, 8, 65,102,102, 38,104,154, 6,159,207,135, 86,171,133, 90,173,134, 70,163,129, 66,161, 16, 54,105,210, +100,182, 70,163,121, 81, 22, 39,195, 48,139, 70,142, 28,217,229,197,139, 23,245,246,236,217, 3,149, 74,181,237,211,167, 79, 24, + 54,108, 24, 24,134, 65,207,158, 61, 59, 18, 66,162, 86,174, 92, 9, 0, 88,184,112,161, 70, 42,149,206,172,206,185, 23,162, 73, +155, 54,109,234,249,251,251,163,107,215,174, 80, 42,149,216,190,125,187,169,143,143,143,169,175,175,175,245,210,165, 75,143,103, +100,100,120, 86,194, 73, 1,216,102,103,103, 55,171,123,247,238,198,133, 57, 76,241,251,239,191, 99,221,186,117,103, 1,172,188, +121,243,230,154,107,215,174, 77,152, 58,117, 42,214,173, 91,183, 32, 39, 39,231,104,121,156,113,113,113,176,182,182,134,169,169, +105,193,205, 82,173, 70,112,112, 48,238,222,189,139, 70,141, 26,233,114, 78,229,217,233, 52,116,232,208,227,103,206,156, 49, 73, + 74, 74,194,163, 71,143,224,236,236, 12,153, 76,166, 75,110,216,123,127, 67,135, 93, 46,167, 92, 46, 87, 36, 38, 38, 10,183,110, +221, 10,123,123,123, 56, 57, 57,193,200,200, 8, 20, 69, 65,163,209, 84,148, 94,173, 82, 59,221,221,193,201, 20, 89,124,103,102, +110, 49,135, 16,194,201,205, 21, 31, 82, 35,231, 98,108, 44, 84,255,193,115,255, 39,163, 53,128, 32,124,158,243, 48,181, 88,104, +249,249,249,145,129, 3, 7, 82, 69,239, 14, 14,200,203,204,180,136,182,177,107,126,206,198,174,105, 97,222, 47,214, 59, 54,219, + 34,218,214, 86,150, 7, 0,106,154, 32,240, 93, 14, 66, 99, 62, 33, 44,230, 19, 4, 60,221,156, 47, 74, 53, 93, 48, 99,149, 16, + 40, 36,127, 61,180,170,101, 98, 40,213, 5,211, 61, 84, 74, 25,114, 51,222, 82, 35,134,244, 54,154, 53,107, 6,236,237, 29,172, +203,227, 83,243,140, 22,120, 45,236,111, 94,195,220, 0,126, 79,111,161, 99,163, 33, 48,226, 25, 32, 43, 87, 1, 80,192,251,216, +187, 0, 99,130,240,232, 68,116,104,202,135,103,159,198,194, 43, 23,163, 22, 3, 88,165,139,189,116,242, 75,112, 93,250,193, 64, +171,129, 38, 51, 10, 76, 78, 2, 32,176,131,156, 18, 34, 43, 53, 1,239, 30, 95,210,233,153,145, 97,152, 57, 86, 86, 86, 57, 43, + 87,174,236,222,160, 65, 3,245,236,217,179, 67, 18, 18, 18, 22,149,122, 90,249,245,192,129, 3,136,137,137, 17,109,220,184,241, + 97,102,102,230, 79, 85,172,104,111, 66,176,171,112, 40, 46,243,234,213,171,109, 2, 2, 2, 22,236,218,181,203,118,238,220,185, +134,115,231,206,157, 12,224,231,138,134, 11,243,120,188, 94, 27, 31, 61, 34,116,114,178,242,228,222,189,134,251, 3, 3, 87,170, + 25,166,166,149,141, 13,213,185, 67, 7, 41,159,197,202,204, 74, 75,163,173,235,213, 99,199,223,189,107, 73,140,141, 83,110,222, +188,153, 39,145, 72,202, 77,157,195,102,179,101,101, 13, 23,150, 5,123,123,123, 85, 89,115,184, 42,232, 16,243, 24, 66,212,230, +117,235,146, 62, 61, 59, 53,136,137,138,141, 53, 50, 55,103,187, 52,112,110, 24,241, 46,254, 37,209,106, 21, 20, 69,229,233, 52, + 86,194,102,143,218,181,107, 87,115, 83, 83, 83, 48, 12, 3, 51, 51, 51,100,100,100, 64,165, 82, 33, 47, 47, 15,170,252, 92,168, +114,115, 17,150, 16,143, 46,221,187, 99, 68,223, 62,141,125,175,254, 49, 74,171,213,158,173,112, 60,175, 69,235, 98, 79,214,250, + 58,150,127,141, 5, 37,229, 20,139,174,173,173, 93,192, 21, 10,209,123,145,247,215, 92,232, 65,127,254,249,231,141,161, 67,135, +246, 95,188,120, 49, 43, 53, 53,245, 86,124,124,124, 23, 0,111, 43, 58, 72, 40, 20,214,207,204,204,132, 68, 34,129,153,153, 25, +118,237,218, 5, 91, 91, 91,200,100, 50,188,122,245,138, 56, 58, 58, 82, 15, 31, 62,132,163,163, 35,178,178,178,160, 86,171, 33, +151,203, 63,169, 84,170,114,135,203, 11,135, 7,251, 45,236,139,155, 81,111,126,239,234, 64,197,189, 26,249,163,123, 76, 84,216, +187,196, 59,119,159,254, 76, 43,140,146,114,146,239, 45,171,219, 46,200,106,206,146,117,216,183,109, 13,162, 94, 60,202,182,173, +157,183,223,152, 82,158,168,200, 94,169, 84,170,120,247,238,157, 73, 72, 72, 8, 40,138,130,153,153, 25,248,124,126,153, 98,171, + 26, 96,149,244, 64, 73,165, 82,112,185, 92, 88, 90, 90,226,232,209,163,197, 29,175,179,179,115, 69, 28,135,122,247,238, 61,170, +118,237,218, 38, 37,191,108,215,174, 29,102,204,152,129,131, 7, 15, 34, 48, 48,240,179,124,154,159, 62,125, 74,213,104, 52, 21, +157,119, 78, 90, 90, 90,223, 33, 67,134,188,121,252,248,177,233,209,163, 71, 65,211,116,153,175, 35, 71,142,224,249,243,231,171, + 0,188,171,102, 59,106, 52,108,216,176, 71,167, 78,157, 50,207,200,200, 64, 81,219,144, 74,165,208,106,181,104,216,176, 33, 69, +211,116,101,243,222, 88,108, 54,251,234,222,189,123, 7, 77,155, 54, 13, 28, 14, 7, 42,149, 10,123,247,238,197,178,101,203,210, + 10, 31, 74,213, 0, 86,158, 56,113, 98,194,224,193,131,209,178,101,203,198, 15, 30,148, 63,179, 67, 34,145, 64, 34,145,192,192, +192, 0,118,118,118,216,176, 97, 3, 84,170,130,219,138,171,171,107,241,101, 12,224,144,171,171,235,160,232,232,232,237, 40,152, +187,246, 5,236,236,236,134, 16, 66,166,107,181,218,252,174, 93,187, 90,158, 57,115,198, 68, 36, 18,225,205,155, 55, 88,181,106, +149,152, 97, 24, 45,195, 48,148, 92, 46,143,179,177,177,121,195,227,241,140,101, 50, 89,118, 86, 86,214, 38, 0,183,254,191,122, +114,138,162, 40, 3, 3, 3, 76,153, 50, 5, 28, 14, 7,198,198,198, 80, 40, 20,208,104, 52,197, 98, 30, 85, 28,150,110,208, 64, +104,201, 1,119,154,133, 73,147, 5, 35,230, 15,180,182,175,233, 0,115, 83, 30, 34, 35,223,118,185,239,127,119,175, 33, 39,202, +135, 81,105,124,162, 62,230,254,237,201,238, 75,107,145,127,168,208,250, 34,231, 33,167,236,202, 28,161, 37,228, 66,166, 72,100, +168, 54, 52,228, 71, 23,121,185,108,109,101,121, 20, 53, 66,107,221,244, 59,208,106, 77,225,141,130, 20,190,116, 20, 90, 26, 45, + 98,162,194,241,248,206, 31,176,146,137,144, 25,215, 10,224, 54,135, 74,158, 11,133, 74, 93, 40, 74,180, 8,121,227,143,188,220, +108, 52,107, 59, 16, 96,177,158,151,199,103,102, 73, 13,236,220,166, 5, 59, 38, 49, 28,237, 92,135,163,158, 99, 87, 36,164,230, + 33, 71,162,132, 56, 79,129, 86,205,188,145, 33,150, 35, 79,166,192,219, 24, 95, 56,212,172,199,162, 56,177, 61,117, 21, 90,202, +183,151,161,124,119, 13, 92,167, 46, 48,108, 56, 24,108, 39, 55, 36,134, 62, 64,200,205,157, 72,142,120, 2,194,104, 97,239,218, + 94,215,139,100,239,173, 91,183,218,119,233,210,133,211,171, 87,175,150, 55,110,220,104,153,154,154, 26, 82, 40, 48, 90,246,234, +213,171,165,181,181, 53,118,239,222, 45,167, 40,106,111, 53, 43,187,216, 3,150,158,158,254, 18,192,198,203,151, 47,239,157, 49, + 99, 6,108,108,108,154,167,164,164,148,123, 96,134,129, 65,203,137,155, 54, 17, 3, 54,155,156,221,183,143,187,238,214,173, 29, +191,157, 56,193,237,225,225, 65, 17, 66, 16, 28, 28,204,223,186,111, 31,127,236,119,223,125, 76, 72, 79,167, 3, 2, 3,213,169, +201,201,249,233, 82,233,186,212,212,212, 79,255, 31, 45, 91,163,209, 60,139,139,143,115,104,219,161,149,117, 80,100, 92,132,103, +143,206,157, 89, 44, 22, 43, 42, 54, 33,208,218,218,148,127,247,206, 93,181, 70,163,121,166, 11, 23,143,199, 27,216,163, 71, 15, +142, 88, 44, 70,205,154, 53,145,145,145, 1,145, 72, 84,224,113,200, 21, 67,157,155, 11, 77, 94, 14,180, 82, 9,226, 94,189, 68, +171,122,117,121, 23,120,188,129, 50,153,172, 66,161, 85,244,148, 89, 86,162,235,162,239, 12, 77, 76, 96, 40, 20,130,170,250,176, +225,119,230,230,230,203,114,114,114,110, 0,216,160, 86,171,189,150, 45, 91,214,110,207,158, 61, 86, 27, 55,110, 52,157, 62,125, +250, 5,137, 68,210, 10, 5, 73, 85,203,235,192, 62,208, 52,109, 9,192,214,223,223, 31, 54, 54, 54,200,205,205, 45,242,180,168, +100, 50,153, 81, 86, 86, 22,148, 74, 37, 84, 42, 21, 76, 77, 77,241,250,245,235,108,154,166,175, 87,102,156,105,125,106,131, 82, + 29,249,147,101, 99, 65,138,154,182,112, 79,207,102,196,107,119,164,174, 7,176,163,111,189,122, 71,212,204,163,184,247,225,215, + 45,226, 95, 61,204, 78,121, 47,173,119,244, 70, 92, 69,115,180, 8, 0,134,162, 40,226,234,234,138,140,140, 12,176,217,108,240, +249,124, 8,133, 66, 44, 95,190, 28,123,247,238,173,142,208, 50, 18, 8, 4,155, 88, 44,214, 40, 22,139,101,173,213,106,225,237, +237,141, 65,131, 6,193,208,208, 16,106,181,186,216,163, 89,228,165,170,196,211, 17,252,252,249,115,211,231,207, 63,187,109,121, + 88, 89, 89,221, 87, 42,149,136,141,141,197,213,171, 87,187, 3, 8,168, 98, 93,199, 6, 7, 7,247,117,115,115,251,189, 77,155, + 54,245, 9, 33,104,222,188, 57, 70,143, 30, 13, 95, 95, 95,132,132,132, 32, 55, 55,151,185,123,247,238,111, 0,182, 87,181, 15, + 47, 44,223,134,195,134, 13,123,114,250,244,105,139,172,172, 44,200,229,114, 72,165, 82, 92,184,112, 1, 93,186,116,129,149,149, + 21, 78,157, 58, 69, 19, 66, 42,170,123, 22,139,197, 58,234,227,227, 51,104,234,212,169,216,191,127, 63,206,158, 61,139,193,131, + 7, 99,212,168, 81,200,200,200,176,221,182,109,219,132,194, 97,194, 53,163, 71,143,134, 68, 34,193,171, 87,175, 34,117,188,230, +145,147,147,131,156,156, 28, 24, 27, 27,151,188,198, 40, 0,190, 59,119,238, 28,179, 96,193, 2,212,171, 87,111, 77, 92, 92,220, + 78,148,177, 74,148, 97,152,153, 34,145,200,130,195,225, 88,210, 52,141,164,164, 36,188,126,253, 26,115,230,204,201,206,206,206, +158, 1, 32, 1,192,202, 41, 83,166,108, 88,180,104, 81,113, 91, 90,180,104,145,223,141, 27, 55,250,254,167,189, 57,174,174,230, + 77, 13,217,188,249,226,124,182,165, 88, 44, 46,190,119,168, 84, 42, 40,149,202,207, 60, 89, 92,174,129,101,187, 86,181,255,148, +203,242, 87,188,125,159, 83,110,130,244,198,245,205, 90,240, 5,102, 11,186,116,237, 49,174, 79,223,239,217,180, 70,131,219,183, +175,227,216,177, 3,240,112,115, 69,189, 6,205, 49,119,222,124, 51,165,138,246,190,123,247,214, 50,243,231,143,111,229,231,229, + 44,175,136,243,127, 28,127, 22,138,171, 63,203, 28, 58, 44, 75, 65, 22,134,112, 16, 23,110, 90, 89, 88, 88,236,211,106,181, 30, +166,166,166, 96,114,162,241,246,245, 11,100,139, 13,160,148,107,193,144, 2,177,165,147,112, 81,170,240,232,246, 53,236,218,185, + 3, 89, 89, 89,112,235,214, 29, 18, 78, 45,212,174, 85, 27, 10,185,172,240,162, 1,212, 42, 13,172,109,157, 16, 20, 20,162,201, +147, 74,203,189, 33,113,141,212,141,107,219,186, 66,169,238, 4, 35, 67, 67,228,230,171, 32, 46, 20, 89,167, 46,142,132, 82, 38, + 7,173, 82,131, 86,105, 96, 93,123, 24, 26,217,246, 0,163,189,222,180, 74,197,199,104,161,142,127, 4,117,252, 35, 24,119,154, +135, 63, 54,143, 41,213,145,234,150,119, 55, 35, 35, 35, 61, 34, 34,226,122,112,112,240,144,145, 35, 71,226,193,131, 7,211, 1, +204, 42, 28,190,153, 62,114,228, 72, 4, 7, 7, 35, 34, 34,226,122, 70, 70, 70,250,183,168,121, 67, 67, 67,185, 82, 89,208,199, +242,249,124,163, 74,246,117,104, 55,116, 40, 43, 55, 40, 40,111,231,211,167,107,142, 28, 61,202,237,213,179, 39,165,161,105, 48, + 90, 45, 26,184,184, 80,125,250,244, 17,248,158, 63,111,201,214,104,158, 47,241,242,242, 63, 56,126,124,254, 75,169, 84,215,137, +230,117, 10,135, 12, 1,160, 78, 5,223,233, 12,165, 82,185,103,230,180, 73,189, 2, 30, 61,169, 85,187,150,131,233,237,187, 1, + 33, 60, 99, 67, 86, 61,231,250,108,113,110, 54,103,253,154, 21,198, 74,165, 82, 87,209,218,216,202,202, 10,159, 62,125, 66, 76, + 76, 12,148, 74, 37, 52, 26, 13, 24,153, 20, 42,113, 14, 84,185,217,160, 20,114,240,180, 90, 40, 50,211, 80,167, 94, 93,224,175, + 21,137,149, 14, 69,149, 37,180,138,222,141, 76, 77,193, 21, 8,193, 50, 48,208, 57, 57, 58,128, 54,237,219,183, 63,127,233,210, + 37,238,228,201,147, 59,220,187,119,111, 31,128, 4,145, 72,212,115,213,170, 85, 47,247,237,219,199,155, 49, 99, 70,195,237,219, +183, 79, 0,112,168, 60, 18,133, 66,113,254,207, 63,255, 28,235,228,228,100, 27, 22, 22, 6,133, 66, 1,134, 97,208,175, 95, 63, +160, 96,110, 13, 0, 32, 42, 42, 74,174, 80, 40,210,195,195,195,243, 18, 18, 18,212,208, 97,149,224,218, 61,169,207,242, 62, 61, + 26,106,107,231,240,220,200,184,142, 51,145, 4, 13, 89, 56,220, 97,219,206,139, 34,197,173,216,216,252,159,122,215,221, 34,205, + 15,157, 99,238, 40,217,127,203, 47, 78,151,137,240,197,171, 11, 45, 45, 45,193,225,112, 96, 96, 96, 0, 46,151, 11,138,162, 48, +111,222, 60, 28, 62,124,184,178,161,195,207, 68,150,137,137, 73,196,186,117,235, 28,103,204,152,193, 53, 50, 50,130, 88, 44,198, +169, 83,167, 48,101,202, 20, 28, 59,118,172,204,249, 47, 58, 12, 41,149,246,150, 46, 24, 63,126, 60, 84, 42, 21, 70,143, 30,141, + 35, 71,142, 44,208,106,181, 1,213,184,164,159,135,132,132,184,132,132,132,152, 2, 24, 60,106,212,168, 19,195,134, 13, 67, 64, + 64, 0,174, 95,191,222, 29, 5,139, 62,228, 0, 54, 3,176, 41,124,175,232,250, 20,216,218,218, 30, 96, 24,102,176,181,181,117, +136,171,171,107,179,211,167, 79,155,167,167,167, 23, 45,126, 64,124,124, 60,142, 31, 63,158,122,244,232,209, 60,173, 86,107,201, + 98,177,254,204,201,201, 89, 94,129, 96, 59,186,115,231,206, 73,133,195,129,184,116,233, 18,217,177, 99, 7,181,106,213, 42,136, +197, 98,120,120,120,192,199,199,103,190, 68, 34,105,185, 99,199,142,105, 35, 70,140,192,250,245,235, 33,149, 74,119, 86,246,176, + 82,129,248,162, 0,116,222,185,115,167,211,130, 5, 11,112,233,210, 37,180,105,211,198, 56, 46, 46,238, 32,128,169,101,213, 31, + 33, 4,113,113,113,144,201,100,120,242,228, 9,214,172, 89, 35, 46, 33,178,230,207,154, 53,107,195,252,249,243,177,105,211, 38, + 18, 22, 22,150, 62,108,216, 48,219,195,135, 15,179, 27, 52,104, 48, 95, 38,147,253,199,132, 86,195, 6, 53,182,180,107,211,117, +153,189, 67, 3,156, 58,125, 6,217,217,217,197,101, 82, 84, 46,132, 16,228,231,231,227,211,167, 79, 48, 51, 53,193,182,237, 27, +250,207,158, 62,169, 22, 10,194, 96,124,233,178,172,103,177,125,216,168,201, 63,142, 30, 59, 9, 97, 33,111,224,123,226, 16,194, +195,130,139,249,104,141, 26,209,145,175, 17, 29,249, 26,182,118, 78,232,211,171, 59, 53,102,204,152,126,227,199,142,178, 6,240, +183,133,142,248, 7,123,179,128, 47,227,104, 29,254, 76,104, 85,226,174,179,178,176,176,136, 56,119,238,156,165,155,155, 27,155, +166,105,220,186,125, 27,115,102,253,128, 9,227,189,161,134, 5,104, 21, 23, 12,215, 72, 39, 75,228,114, 25, 8, 8,164, 82, 41, + 2, 3, 3, 65, 24, 26,190,135,119,128, 16,166, 88,104, 1, 4, 42,181, 26, 14,181, 27,226,192,145,141, 52, 12, 12, 94, 66, 83, +118,232,154,188, 44,182, 86, 67, 19,136,210, 19,145,152, 26, 14, 51,147,218,224, 24,212, 70, 86,142, 12, 28,150, 29, 52,138, 40, +104, 11,143,149, 73,147, 33, 87,127, 93,253,105,203,240,158,146, 42,220,116,229,114,249,201,147, 39, 79,246,255,245,215, 95, 13, + 7, 12, 24,224,122,241,226,197,206, 0, 48, 96,192, 0, 87, 83, 83, 83,156, 60,121, 82, 37,151,203, 79,126, 67,143, 79,143,246, +237,219, 67, 44, 22, 35, 62, 62, 62,164,194,115, 83,169, 44,133, 54, 54,236,244, 7, 15, 52, 25, 98,113,173, 30, 61,122, 80, 26, +154, 6,139,162,144,157,155,139,132,143, 31, 97,110,110, 78, 69, 68, 69, 9,247,206,157,123,197,181, 89, 51, 78,209,138, 68, 93, +112,253,250,117, 62, 10,230,101, 85,248, 93, 21, 33, 77, 79,251, 52,201,203,203,235,202,201,147,167,204,210,210,211,162,121,134, +134,180, 80,104, 84,115,252,184,217,156,156,156,156,177, 0, 36,186,146,137,197, 98,196,197,197,193,216,216, 24, 92, 3, 3, 48, +114, 25,180, 82, 9, 20,217, 25, 96,171, 85, 48,212,106, 81,131,207, 67, 45, 91, 91,212,182,182,210,137, 51,230,254,157,226,137, +239, 37,135, 11,183,181,111, 12, 67,129, 16,134, 38, 66,204,246,123, 88,248, 52,202, 5, 86,253,172, 11,173,149,131,131,195, 31, +167, 79,159,230,102,100,100, 32, 56, 56, 56, 4, 64, 46, 0, 19, 0, 76,100,100,228,189,240,240,240,129,133,171,238, 42, 91, 45, +182,227,242,229,203,189,221,220,220,104,103,103,103, 65,122,122,122, 45,177, 88,204,164,166,166,126,230, 18,186,115,231, 14, 47, + 63, 63, 95,202, 48,204,149, 66,145, 85,105,252,162,133,195, 29,140, 2,131, 48,207,221,179, 78,115, 83,171, 22,200,166,131,154, + 63, 15, 73,157,183,112,184,195,158,157, 23, 69, 10, 99, 74,121,130,210, 38,213,226, 24, 41,116,157,196, 76,128,130,185, 82,129, +129,129, 72, 72, 72, 64, 92, 92,220,103,130,106,250,244,233,240,245,245,213,201,163, 37, 16, 8, 54,173, 93,187,214,113,193,130, + 5,220, 18,162, 8, 94, 94, 94,200,205,205,197,145, 35, 71,224,229,229, 85,229,142,191, 20,234,246,232,209, 99,128,189,189, 61, +178,178,178, 96,103,103, 7, 55, 55,183, 65, 1, 1, 1,206, 0,226,171,217,238,103,123,122,122,110, 88,183,110, 29, 52, 26, 13, +166, 76,153,130,247,239,223,159,127,255,254,253,174,218,181,107,207, 91,186,116,169,173,173,173, 45, 70,142, 28, 41,160,105,122, +104,121, 36, 53,106,212,216,124,232,208,161,177, 3, 6, 12, 96,169,213,234,110,247,239,223,199,199,143, 31,161, 82,169, 64,211, + 52, 62,124,248, 0, 47, 47,175,212,194,213,141, 31,116,176,107,242,202,149, 43, 39,205,155, 55, 15, 91,183,110,197,218,181,107, +127, 51, 51, 51,107,214,170, 85,171,214,107,215,174,197,146, 37, 75,224,228,228, 4, 75, 75,203, 70,171, 86,173,106,188,104,209, + 34,236,217,179, 7,107,214,172,249, 13,192,241,234, 20, 4,195, 48,212,150, 45, 91, 90,238,220,185,211,190, 72,100,177, 88, 44, +156, 59,119, 14, 65, 65, 65,131, 98, 99, 99,203, 58,198,199,206,206,110,186,189,189,189,225,221,187,119,133, 78, 78, 78,160,105, + 90, 83, 40,178,246,214,174, 93,123,206,135, 15, 31, 48, 96,192, 0,196,198,198,158, 4, 48,193,204,204, 76,186,104,209, 34,190, +177,177,177,153, 76, 38,251, 79,117,222, 96,179,168,137,155,214, 47,193,171,160, 40, 92,190,204,197,171, 87,175, 96,107,107, 11, + 30,143, 7, 66, 8,148, 74, 37, 50, 50, 50,160, 81, 43,209,188,105, 93,252,126,116, 11,210,211, 51, 0, 22, 85,238,148, 27,138, + 69,141,155,244,195, 16, 60,126,114, 27, 7, 15, 30,130, 68, 34, 45,231,225,219, 8, 13, 92, 27,195,161,166, 13,146,146,147, 64, +177, 96,245,119,158,235, 63,124,232,176,248, 22, 4, 93,194, 59,148,132,185,185,249,174,179,103,207, 90,122,120,120,176,165, 82, + 41, 24,134, 65, 87, 55, 55,204, 91,176, 0,215, 79,159,134, 75,135,209,160, 84, 66,208,124,221, 86, 61, 40,228, 50, 52,105,221, + 25, 35, 70,142, 66, 98, 66, 2, 60, 7, 14,131, 66, 33, 43,126,194, 40,242,104,169, 84,106, 88,217,212,194,157, 59,119,216,152, + 50,229, 45,246,150,237,148,208,170, 13, 67,163, 63, 40,186,228,200,131, 16,248,202, 23,106,165, 26,205,155,175,130,154,177,132, +141,227,116,104, 52, 87,145,151,113,191, 96, 24,195,210, 3,201,137,137, 96,177,185, 17,213, 45, 65, 70,154,241, 85, 55,221,220, +220,220,220,184,184,184,139,129,129,129,227,134, 14, 29,138, 59,119,238, 76, 3,128,161, 67,135, 34, 48, 48, 16,113,113,113, 23, +115,115,115,115,191, 69,109,219,219,219, 15,238,222,189,251,232,118,237,218,193,207,207, 15,132,144,199, 58, 93,216, 6, 6,132, +197, 98,129, 97, 24, 80, 0,178,114,114,240,254,253,123,100,101,102, 66,163,209, 64, 42,145, 48,141, 93, 93, 37,132, 97, 76,170, + 98, 79,201, 21,134, 40, 99,213, 97,209,119,213, 56,213,132,151,207,159, 38,230, 75, 36,214, 22,230, 22,249,134,134,134, 90,113, + 78, 78,238,219,136, 48,149,142,157, 67, 17, 34,195,195,195,155,165,164,164, 32, 49, 49, 17,180, 52, 31,108,165, 10, 44,165, 12, + 61, 59,119,130, 49, 8,140,192,192,128,209,192,128,109,128,252,130,213,121,149, 14,119,104, 75, 60, 36, 20,137, 44,138,162, 10, +134, 11, 5, 2, 24, 10, 77, 62,243,112,233,210,158,120, 60,222,233, 11, 23, 46,216, 59, 56, 56, 96,253,250,245,112,116,116,108, + 84,179,102, 77,153,153,153,153,177,173,173, 45,154, 52,105,130,206,157, 59,227,230,205,155,208,161, 12,104, 66, 72,159,199,143, + 31,255,248,244,233,211, 17, 2,129,128,154, 59,119, 46,167, 95,191,126,224,241,120,144,201,100, 16,139,197, 56,115,230, 76, 38, +195, 48, 69,139, 82, 44,249,124,254,113,138,162,226,165, 82,233,130,210,132,191,255,218,188,102,122, 54, 51,133, 72,248, 67,220, + 61,235, 52,239,225,217, 11,117, 93,122,160,135,103, 34, 0,108,169,193,249, 56,250,151,149,230, 87,204, 77,168,227,119,110,221, + 93,227,230,222, 99,229, 50,201,131, 13, 91, 15,231, 84, 58,159,142,162, 40, 48, 12,243, 89,236,160,210,191, 79,152, 48, 1,231, +206,157,171,180, 28, 89, 44,214,168, 25, 51,102,112, 75,121,158, 33, 18,137, 48,112,224, 64, 12, 29, 58,244, 51,161,101,101,101, + 5, 59, 59, 59,124,252,248, 17, 0,178,116,108, 87,243, 38, 79,158, 76,201,229,114, 76,157, 58, 21, 71,142, 28,193,232,209,163, +169,128,128,128,121, 0, 22, 84,181,177,179, 88,172,109, 75,151, 46,253,209,203,203, 11,217,217,217,184,113,227, 6,250,245,235, +135,115,231,206, 89,223,184,113, 99,147,135,135, 7,216,108, 54,252,252,252, 64,211,116,133,177,190,184, 92,238,224, 1, 3, 6, +176,146,146,146,192,229,114,209,182,109, 91, 36, 39, 39, 67, 38,147, 65, 36, 18, 97,254,252,249,159,178,178,178,186,235,122, 29, +113,185,220, 5,243,230,205,195,217,179,103,225,237,237,125, 2,192,212,220,220,220, 17, 79,159, 62, 61,251,221,119,223, 65, 36, + 18,225,202,149, 43, 88,179,102, 13, 53, 97,194, 4,236,223,191, 31,243,231,207,255,173,208,235, 84, 94,195,207, 79, 79, 79, 55, +171, 95,191, 62,210,210,210, 32,145, 72,112,229,202, 21,155,155, 55,111, 58, 59, 56, 56,152,198,197,197,105,127,254,249,103,195, + 5, 11, 22, 96,215,174, 93, 8, 14, 14,134,175,175, 47,122,244,232, 65,199,198,198,150,233, 37, 43, 12,217,112,133, 16,114, 87, + 32, 16, 32, 63, 63,191,232,186, 91,236,237,237,237,181,121,115,129,147, 61, 37, 37, 5, 19, 39, 78, 28,239,239,239,207,120,120, +120,240,185, 92, 46, 20, 10,133,244, 63,217,107, 51, 90, 6, 0, 3,231, 90, 66,220,190,126, 20,111, 66, 98,241, 38, 36, 28,134, +188,130, 73,240,114,185, 12,173,155, 55, 64,135,182,237,145,146, 42,194, 73,223,163,168, 97,229, 80,225,125,132, 16, 2, 46, 71, +139,198,174,118, 56,237,123, 8,126, 55,252,225,123,242, 76,241,156, 55, 14,199, 0,173, 90,119, 64,219,182,110,136,141,251,128, +163, 71, 15,194,218,166,150,126,112,176,154, 40, 30, 58, 44,249, 94, 74,249,247,112,115,115, 99, 75, 36, 18, 40, 20, 10,124,250, +244, 9, 31, 63,126,132,185,133, 57, 98, 83,226,209,157,175,198, 39, 38, 15,145, 33, 17, 90,138,109, 16, 92,217, 31, 14,112,111, + 5,184,183,194,156,201,163, 43,120,100, 37, 16,152, 90, 21, 12,221,208,116, 12,246,236,161,203, 19, 90,180, 86,115,239,246,221, +251,237, 39, 79, 24,108,112,231,254, 17,104, 84, 12,228, 26, 51, 72, 21, 42, 72,213, 6, 96,153,245, 3, 50, 3,192,230,240,208, +177,101, 3, 92,185,124, 83, 77,104,141,191,206, 5,100,219, 12,116, 90,120, 9,161,149, 94,106,220,161,134,206, 67,135,197, 29, +175, 86,123,238,212,169, 83,223,119,234,212,137,239,225,225, 81,191,176,227, 84,159, 58,117, 74, 86, 24, 12,179,170,248, 44, 26, +188,157,157, 93,107, 46,151, 59,186, 95,191,126,173, 39, 77,154,132,183,111,223,226,228,201,147,209, 13, 26, 52,120,144,154, 90, +254,138,108,182,161, 97,150, 36, 61,221, 92,232,236,204,177, 48, 49, 73,185,121,227,134, 83,175,222,189,169,196,196, 68,100,101, +101, 65,161, 80, 32, 56, 36,132, 24,176,217,201,148,169, 41, 43, 42, 40,136,197, 54, 52,204, 42,207,219, 88, 6, 62, 86,178,234, +112,115,117,189, 91,181,236, 45,234,175,241,158, 89, 87,161, 84, 52,203,203,203,163, 57, 6, 6, 6,142,118,230, 9, 81, 31,116, +191, 39, 42,149, 74,191,123,247,238,125,223,171, 87, 47, 94,116,104, 48,232,220, 92,168,114,197,224, 50, 90,212,104,221, 18,108, +181, 18, 80,105,224,208,152, 64,145,195, 71,192,139, 40,141, 82,169,172, 52,168, 97,145,208, 98,149, 18, 6,134, 66, 33,120, 38, +166,224, 9,133,165, 5, 67,101, 79,114,252, 62,125,250,244,236,216,177, 35, 8, 33, 56,124,248, 48,212,106,181,161, 90,173,134, + 74,165,130, 90,173, 70, 94, 94, 30,124,125,125,113,224,192,129,167, 0,126,211,225,244,105, 99, 99,227,239, 40,138,178,225,112, + 56, 50,107,107,107,193,185,115,231,138,195, 77,180,106,213, 10, 38, 38, 38, 92, 20, 6,133,180,177,177, 49, 56,118,236,152,249, +160, 65,131, 30,149, 57,220,209,188,209,146,186,180,133,187,145,113, 29,103, 83,171, 22,168,235,210, 3, 0,208,123,224,100,212, +109, 80, 27,121,153,161,206, 10,249,199, 33, 92,142,216, 34, 98,143,232,173,241,128,102,147,164,233, 15,223,163,236,229,253,101, +118, 20, 44, 22,171,220,225, 88, 93, 68, 86,129,102, 97, 89, 23,205,243, 1,128,172,172, 44,164,166,166, 34, 50, 50, 18, 13, 27, + 54, 68,118,118, 54, 28, 28, 28,160, 82,169,208,174, 93, 59,200,229,114,236,220,185, 19, 79,158, 60,121, 10, 96,190, 14,255, 97, +236,226,226, 50,177,117,235,214,184,113,227, 6, 94,189,122, 37,186,125,251,182,131,155,155, 27,156,157,157, 39,197,199,199,175, + 40, 28,234,211, 21, 2, 55, 55,183,185, 94, 94, 94, 8, 15, 15,199,204,153, 51,179,146,146,146,174,156, 63,127,126,234,154, 53, +107, 88,158,158,158, 72, 77, 77,197,182,109,219,180, 79,158, 60,217, 14, 96,125, 37,229,248, 46, 41, 41,201, 81,161, 80, 32, 59, + 59, 27, 52, 77, 67, 38,147,225,230,205,155,240,245,245, 77, 43, 20, 89, 49,186, 26,215,178,101,203, 38, 44, 22, 11,103,207,158, + 5,128,159, 80, 16,177,255,202,144, 33, 67, 68, 63,255,252,179,195,242,229,203, 49,109,218, 52,168,213,106,108,221,186, 21,203, +151, 47,255,179, 80,100, 85,116, 19,253,213,206,206,110,250,204,153, 51, 27, 45, 90,180, 8,129,129,129, 54,175, 95,191,110, 27, + 28, 28,140, 90,181,106, 33, 43, 43,139, 99,105,105,137, 93,187,118, 97,225,194,133,151, 0,100, 62,123,246,108, 84, 92, 92,220, +102, 0,219, 42, 17,237, 62, 14, 14, 14,211, 9, 33, 68, 38,147,125,244,246,246,222,182,113,227, 70, 44, 92,184, 16, 17, 17, 17, +200,205,205,133,137,137, 9,181,116,233,210,137, 63,253,244, 19,166, 76,153, 66,164, 82,233,129,255,116, 71, 77,136,133, 81, 18, +228, 0, 0, 32, 0, 73, 68, 65, 84, 22, 50,113, 56,180, 74, 11,180,106,222, 16,173,154,213,193,237,251,111, 0, 0, 61,135,185, + 65, 38,205,199,137, 19,135, 17, 19,243, 30, 28, 3, 3,152,215,176,211,197, 19, 8, 85,222, 59,228,168, 83,209,203,163, 45,250, +121,118,199,111,191,159, 3,173, 81, 99,234,228,177, 16,231,228,224,247,223,143, 34, 54,238, 3, 56, 6, 6,176,180,250,251, 3, +161, 86,164, 69,254,241, 66, 75,135,225, 39, 48, 12, 3,145, 72,132,215,175, 95, 35, 62, 62, 30,124, 62, 31,114, 90,203, 28,188, +247,132,161, 40,110, 50, 67,200, 83, 66, 23, 71, 41,254,146, 67,171, 21,149,136, 88,107,102, 97, 97, 97,168, 84,202, 65,211,154, + 18,189, 10, 5, 80, 0,151, 3,216,215,172,139,164,196, 36,162, 80, 40, 30, 86,248, 4,165, 84,236,186,118,229,130, 87,231, 46, +110, 86,253,122,174,195,149,171,171, 32,206,203,131, 66,109, 0,169, 66, 13,153, 2, 48,175,225,138,118,205, 91, 32, 37, 37, 11, +161,175, 2, 36, 28,165, 76,151,137,162,239,247,174,156,236, 50,121,206, 18, 24, 59,117,129, 50,242, 10, 24, 73, 90,177, 71,203, + 72,104,129, 26,181, 27, 35, 71,170,196, 5,255, 55, 64, 21, 82,189,164,167,167,203,216,108,246, 41, 47, 47,175,173,111,222,188, +118, 4,128, 55,111,222, 36,167,166,166, 46, 75, 79, 79,175,170, 79,186, 40, 26, 60,101,100,100,252,166, 65,131, 6, 41,109,219, +182, 53, 27, 50,100, 8,172,172,172, 16, 28, 28,140,205,155, 55,191, 83,171,213, 75, 2, 2, 2, 42, 28,234, 81,169, 84,162, 55, + 87,175,154,118,255,225, 7,243, 37,131, 6,109,243,242,242,218,181,126,253,122, 3, 23, 23, 23, 74,163, 86, 35, 44, 44,140,156, + 62,117, 74,115, 96,249,242,157,134, 2, 1,231,229,181,107, 6,180, 82, 41,250,255,110,196, 14, 14, 14,238,110,221,186, 54,222, +254,235, 30, 40,228, 18,188, 8,252, 19, 98,113, 6, 14, 29,190,220,216,193,129,184,139, 68,162, 0, 93, 5,240,241,227,199,127, +236,208,186,117,235,122,181,106, 33, 44, 33, 30,134,140, 22, 92,154, 6, 91,173, 4,139, 86,160, 86, 51, 2,138,101,130,212, 79, +121,216,120,246, 98,184, 46,194,184, 81,255,193, 88,159,156, 11,138,162,176,163, 83, 51, 24,154, 8,193, 21, 8, 49,251,143,251, +197,194,192,111,253,114, 24, 10,133,168,223, 65,167,128,240,178, 7, 15, 30,188, 14, 11, 11,107,215,172, 89, 51,252,248,227,143, +248,248,241, 35, 24,134, 65, 90, 90,154, 34, 53, 53, 85,148,145,145,241, 17, 5,241,127,142, 84,210,137,149, 84, 29, 14, 1, 1, + 1,197,195, 13,254,254,254,168, 89,179, 38,204,204,204,144,151,151,135, 25, 51,102,152,175, 94,189, 26, 0,240,250,245,107,148, + 20, 40,165, 17,246, 38,114,123, 78, 62, 17, 19, 73,208,144,108, 58,168,121, 15,207, 36,244, 30, 56, 9,119,253,126,195,253,219, +247, 80,131,243, 49, 30,130,252,155,153,241,153,121,201, 82, 23,159,198,109,166,178, 83,165,183,125,230, 14,142,102,219,219, 51, + 23,150, 31,204,203,169,200, 86, 23, 23, 23,216,218,218, 22,207,209,226,112, 56,152, 50,101, 10, 8, 33,186,138,172,194,190,134, +201, 80, 40, 20,182, 70, 70, 70,248,244,233, 19, 62,124,248,128,216,216,216,226,208, 1, 12,195,104, 22, 47, 94,108, 48,119,238, + 92, 28, 60,120, 16, 15, 31, 62,124, 10, 96, 29, 0, 93, 31,214,198,142, 28, 57,210, 68,165, 82,225,204,153, 51, 52,128,129, 23, + 46, 92,120,221,174, 93, 59, 78,223,190,125, 77,246,239,223, 63,182,176,142,116, 22, 90,166,166,166, 92,181, 90,141,253,251,247, + 35, 41, 41,201, 29, 64,228,203,151, 47,125, 70,142, 28,121,160, 89,179,102, 13,194,195,195,223, 75, 36,146,217, 0, 66, 43, 35, + 75, 75, 75,155,220,182,109,219, 11, 12,195, 56,245,234,213, 75,240,235,175,191,154, 70, 69, 69,193,209,209, 17, 12,195,132,161, +138, 41,172,222,191,127, 31,153,154,154,218,184,123,247,238,184,121,243,230, 22,173, 86,187, 9,192,214, 89,179,102, 57, 36, 36, + 36,160,117,235,214,168, 81,163, 6,162,162,162,242, 83, 83, 83, 15,160, 32, 37, 81,101, 46,220, 56, 0,203,124,124,124, 90,248, +248,248,140,174, 81,163, 70,199,224,224, 96, 60,126,252, 24,219,183,111,199,234,213,171,209,181,107, 87,252,248,227,143,153, 0, + 70, 3,160,227,226,226,116,138,155, 87,228,217, 2,128, 54,109,218,164,108,222,188, 25, 83,167, 78, 37,199,142, 29,219,125,234, +212,169, 5, 99,199,142, 45,238, 3, 39, 78,156, 72, 78,158, 60, 57, 17, 5,105,152,254,147,208,168,213, 42,152,214,168, 11, 73, + 78, 34, 50,146, 2,193, 55,177,131,103,143,150,144,201, 85,184,126,237, 18, 66,195, 66,192, 98,177, 96,107, 87, 11,230, 22, 86, +136,142,126, 15, 84,188,218, 88,163, 86,171, 97, 98, 81, 7,146,220, 36,168,210,223,192, 88,104,131, 73, 63, 12,129, 76,174,198, +229, 43,151, 16, 30, 30, 10, 54,155, 13, 59,251, 90, 48, 51, 47,224,164, 72,197, 43,152,245, 0, 80, 70, 60,173, 74,133, 22,155, +205,126,112,235,214,173,225, 29, 58,116,224,196,196,196, 32, 38,166,224,225, 70, 44, 22,211, 20,180, 23,211,195,174,141,169,224, +240, 94, 40, 92,157, 81, 50,119,161,208,196, 68, 20,245, 46,210, 86,156,157,134,144,160, 39,136,137, 14, 67,124,108, 36,212,106, + 5,216, 44, 22, 88,108, 22,234,212,109,138, 39, 79, 3, 85, 10,154, 14, 44,143,179,192,142,216,124,129,141,203,168, 13,235, 87, +248, 45, 92,178,214,120,196,240,131, 8,141,122, 11, 9,109, 7, 66, 0, 59, 75, 1, 90,213, 91, 10, 81, 74, 6,206,254,182, 95, +198,168,213,227, 74,197,208,250,130, 19, 0,108, 51,209,228,192,225,223,166, 28,241, 61,189,118,201,220, 25,182,223, 13, 29, 7, +195,236,183,208,164,188, 65,221,118,253, 64,241,204,113,227,206,125, 4,188,126,155,198,104,201, 90,219, 44, 28,139,174,132,179, + 36,114,114,114,158,125,250,148,234, 88, 34, 10,188, 35,143,103, 84,217,234,184,210,156,159, 69,156,103,179, 89,109, 54,108,216, +160,177,181,181, 85,135,135,135,227,224,193,131,204,155, 55,111,238,176, 88,172,189,169,169,169,138,202, 56,173, 53,154,144,211, +222,222, 77,218, 15, 29, 74,198,204,157, 43, 3,143, 55,111,219,142, 29,222, 25, 98,113, 77,194, 48,176,174, 81, 35,121,219,242, +229,155,135,143, 28, 41,142,120,242,196, 56,240,234, 85, 99, 67,154,126,163,131,157,223, 2,229,114,138, 68,162,128,135, 15, 31, +227,196,145, 95,161, 86, 43,145, 42, 74, 0, 0,100,102,229,162, 18,145, 85,154,147,200,100,178,161, 63,173, 94,253,252,167,133, + 11,236,186,245,236,133,196,144, 96,168,179, 51, 64,105,104, 24, 80, 28, 72,211,249, 72, 79,147, 96,217,201,243,233, 18,153,108, +104, 25,157, 68,153,118, 22,121,172,120,166, 38,224, 10,132, 48, 20,154,124,230,197, 50, 50, 53,133,161, 64, 8,142,161, 97, 89, + 19,184,191,224,148, 72, 36,195,134, 15, 31, 30,250,242,229, 75,139,169, 83,167,162,115,231,206, 65,114,185,220, 3, 64,126,117, +203,147, 97, 24, 81,183,110,221, 88, 20, 69, 9,199,141, 27,199,203,200,200, 40,142,172, 46,145, 72,112,243,230, 77, 52,108, 88, +176,170, 63, 34, 34, 2, 77,155, 54, 45,151,115,218,178,112, 17,128,245, 11,135, 59,108,123, 30,146, 58, 15,192,150,186, 13,106, +225,254,237,123,120,124, 63,208,187, 99, 51,102, 79,255,113,237,126,230,123,140, 92,210,184,205, 84,182,208,212, 30,191, 95,190, +196,142,124,115,116,163, 76, 22, 86, 31, 7,175, 44, 46,207, 78,138,162, 64, 8,249, 34,148, 3,155,205,198,169, 83,167,170,122, +238,231,143, 28, 57, 50,107,230,204,153,220,212,212, 84,188,123,247, 14, 82,169, 20, 70, 70, 70,184,125,251, 54, 13, 96,255,169, + 83,167,110,159, 58,117,170, 47, 10, 86, 19,249, 87,165,125, 10, 4, 2, 47, 79, 79, 79,188,123,247, 14,175, 94,189,186, 4, 32, + 52, 40, 40,232, 82, 76, 76,204,168,174, 93,187,226,183,223,126,243,146,203,229, 71,170,194,201, 48, 76,201,152, 73, 69, 25, 31, + 66, 36, 18, 73,199,192,192,192,170,214,123,106, 86, 86, 86,151, 66, 97,157,100,107,107,107, 26, 18, 18,130,218,181,107, 67,173, + 86,119,168,106, 91,202,205,205,253,117,239,222,189,199, 38, 79,158,140,159,127,254,121,220,249,243,231,199,245,239,223, 31, 3, + 6, 12,192,241,227,199, 17, 26, 26,186, 5,186,165, 21, 43,235,220, 67, 1,132,218,218,218,206,169, 85,171, 22,182,111,223,142, +176,176,176,205,235,215,175, 95, 30, 26, 26,138,134, 13, 27,242, 34, 35, 35,233,234,220, 67, 0,192,212,212,212, 84,163,209,224, +234,213,171, 47, 0, 44, 28, 55,110,156,205,174, 93,187, 70, 11,133, 66,100,103,103,203,195,195,195,199, 2,184,246,159,190,215, + 17,138, 90, 57,117,218, 60,159,105, 83,199, 26,181,109,211, 10,178,188,100,200, 37,105,144,229,127,194,222, 35,119, 64, 81, 44, + 88, 91,219,195,198,206, 17, 9, 9,137,120,250,231, 13,149, 84, 38,223,101,168, 97,182, 84,204, 57,183,128,179,117, 1,167, 76, +154, 14,185, 36,189,152,211,198,166,102, 33,103, 2,158, 4,222, 80,200,165,210, 95, 85,132,250,229,111, 62,247,127, 50,170,150, +235,176, 36,196, 98,241,252, 25, 51,102,120, 44, 91,182,204,146,166,105,118,141, 26, 53,144,144,144, 64, 95,188,120, 49, 91, 34, +145,204,175,142, 53, 28, 3,131, 80, 23,215,134, 30,223,125,247, 29, 61,120,240, 32,238,248,201,125, 57,214, 54, 54,200,205,201, + 66,244,187, 96, 68,189,125, 3,151,134, 45,177,102,253, 78,192,220,188,210, 68,146,133,105,117, 6,174,251,105,241,185, 46,238, +125, 76, 27, 54,109,201,109, 85,223, 12,106, 13,141,228,228,100, 92,187, 26,162, 14,127,253, 56,143,161, 85,163,100,153,186,165, +224, 9, 0,104,100,225, 80, 51, 27,245,169, 77,219,246,254,184,255,208,137, 37,203,230, 77, 21,116,117,235,141,176,123,191,225, +146,223, 57,169, 66,169,218,198,101, 99, 71,120, 22,100,209, 85, 44, 3,133, 66,161, 46,221,159, 42, 20, 10,245,215,214,244,241, +227,199,145,150,150,166,250,248,241,227, 45,154,166,207, 87,144,236,249, 11,236, 5, 84, 67,148,202,123, 63,185,185,245,253,233, +246,109,163,137, 75,151,170,198,141, 31,191, 24, 74,165, 26,134,134,132, 35, 16,176,192,227, 25, 68, 60,121, 98,188,123,214,172, + 26,148, 74,117,247, 68, 5, 97, 3,202,192, 55, 95,117, 88,228,209,234,222,189, 43, 38, 78, 93, 8,121, 9,143,214,179, 87,209, + 80,170,161,179, 71,171, 16,137, 31,147,146, 58,206, 91,249,211,229, 81,158, 61, 27, 55,115,170,195,179,118,174, 3,161,157, 29, +178, 50, 50,240,228, 85,148,102,253,185,203,225,133, 34, 75,167,184, 50, 12,195, 20, 76,114, 7,208,115,254, 50, 80,108, 54, 80, + 24,198,161,104,229,144,115,187,206,160, 56, 28,104, 9, 3,165, 82,169,203,164,191,228, 15, 31, 62, 12, 27, 55,110,156,191,159, +159, 31,203,211,211,179,213,149, 43, 87,152,175,105, 59,114,185,188, 35, 0, 24, 25, 25,197,155,155,155, 59, 76,158, 60, 25, 26, +141, 6, 50,153, 12,185,185,185, 72, 78, 78,206,153, 60,121,178, 26, 0,140,141,141, 13,135, 15, 31,110, 90, 25,231,206,139, 34, +197,194,225, 14,123,106,112, 62,142,206,203, 12,117,174,193,249, 24,223,177, 25,179,103,231, 69,145,194,180,166,116, 67,230,199, +128,232, 84,233,109,159,223, 47, 95, 98, 79, 24, 50, 76,235, 40,124,239,109,100, 67, 46, 86,198, 75, 81,212, 23,193, 73,117, 20, + 89,159, 33, 63, 63,127,249,170, 85,171, 6,136,197, 98,199,190,125,251,114, 27, 55,110,140,231,207,159,195,207,207,143,126,246, +236, 89,146, 84, 42, 93, 1, 64, 1,224, 78,117,202,212,213,213,213,153,195,225, 20, 13,165,237, 43,252,122,223,149, 43, 87, 70, + 77,157, 58, 21,117,234,212,105, 18, 25, 25,201, 67, 21,174, 35, 66, 72,241, 40,195,183, 4, 69, 81,177,187,119,239,118,176,179, +179,163,110,222,188, 73,179,217,236,234,120,110,142, 31, 61,122,180,131, 70,163,153, 54,125,250,116,184,187,187,131,166,105,156, + 60,121, 18, 71,143, 30,213, 85,100, 85,136,232,232,232, 55, 73, 73, 73,221, 22, 47, 94,140,237,219,183, 47, 95,188,120, 49,146, +146,146, 16, 29, 29, 29,252, 53,188,121,121,121,242,196,196, 68,126,167, 78,157,218,134,135,135,135,123,120,120, 52,157, 58,117, + 42,182,108,217, 66, 30, 62,124, 56, 28,192,205,255,143,222, 59, 42, 38,219,215, 64,203,185,189,126,195,175,171,235,215,115,158, + 57,101,210, 72,182,171, 75, 83, 72,115,147, 97,105,101, 11,199, 90,117,145,145,158,137, 91,183,110,106, 51, 51,115,142,107, 89, +212,186,152,152,236,148,175,225,116,112,172,139,244,244,116,220,184,113, 67,155, 35,206, 59, 12, 13,107,125,100, 66, 78, 26,244, +208,197,147, 53, 29, 21, 68,137,175, 8, 86, 22, 22, 22,103, 76, 77, 77,211, 76, 77, 77,211, 44, 44, 44,206, 0, 58,173, 62,232, + 85,226,238,192,254,236, 53,124,184, 17,140,140, 58,130,195, 89,100,110, 97,113,211,204,204, 44,171,123,247,238, 42, 31, 31, 31, + 69,100,100, 4, 35, 18, 37, 17, 51, 51,179,220,226,253,203,226, 44, 5, 11,139,122, 38, 2,251,166,171,205, 28, 91, 61, 17,218, + 55,201, 23,218, 55,201, 55,115,108,249, 84, 96,223,100,173,133, 69, 61, 19,157,236, 44, 7,117,109, 96,237, 98,133,253, 13,173, + 41,185,139, 21,246,215,181,129,181,206,231, 94,241,176,159,150,162,160, 69,193, 50,108, 84,131,179,136,131, 97,179,217, 39, 28, + 29, 29,237, 81,181,128,117, 95,112,142, 7,234,140,231,241,166, 93,240,246,158, 24,255,240,225,184,188,184,184, 49,185,177,177, + 35,131,207,157, 27,181,111,212,168,241, 99,120,188,233,195,129,122,186,114,218,219,219,111,126,243,230,141,159,174,175, 18,194, + 75,231,242,172, 87,215,225,182,103,175, 14,196,107,198, 80,226, 53, 99, 40,241,236,213,129,212,171,235,112,251, 43,234,136, 98, +179,217,163,249,124,254, 25, 1,159, 31, 38,224,243,195,248,124,254, 25, 54,155, 61, 26, 21,207,161,250,140,211,210,210,242,181, +173,173,109, 90, 85, 94, 86, 86, 86, 65, 85,176,115,140,179,179,115, 18,139,197,218, 89,197,107,186, 34, 78, 23, 99, 99,227, 88, +129, 64,144, 92,242,101,108,108, 92, 50, 48,148, 37,159,207,191, 46, 16, 8,118,233,194,249,203,202,166,171,159,222,153, 19,250, +203,202,166,171, 75,255, 54,247,123,139,201,207,253,215,101,205,253,222, 98,178, 46,118,218,216,216, 60,180,177,177, 73,181,177, +177, 73,181,181,181,173,240,101,101,101,245, 90, 7, 78, 35, 19, 19,147, 93, 38, 38, 38,105, 2,129, 64, 43, 20, 10,211, 4, 2, +193, 78,148, 8,109, 81,221,242,100,177, 88, 91,154, 52,105,162, 96,179,217,199, 74,253,180,189,126,253,250, 10, 14,135,179,173, +138,156,166, 93,187,118,213,134,132,132, 16,119,119,119, 2,192,226, 27,214,187,157,133,133,197, 77, 83, 83,211, 68, 19, 19,147, +189, 0, 4,213,228,164, 0,140,118,112,112, 8,238,209,163,135,204,193,193, 33, 16,192,119,223,208,206, 1,223,127,255, 61,147, +152,152, 72, 8, 33, 36, 49, 49,145,124,255,253,247, 12, 10, 2, 69,126,205, 61,121,229,172, 89,179,200,179,103,207,200,179,103, +207, 72, 96, 96, 32, 25, 48, 96, 0, 3,224,135,175,188,207,227, 91,157,123,227,186, 86,245, 26, 53,176, 56, 63,118,152, 27,115, +231,218, 78,178,102,197, 76,210,219,189, 41,105, 88,223,226,178,139,139,165,203,183,224, 92,189, 98, 6,233,213,173, 9,211,184, +158,197,185,198,117,173,234,253,135,207,253,223,232,213,194,223, 61,225,236, 47,215,226,231, 98,169,108,212,172, 89, 19, 89, 89, + 29,140, 56, 28, 55, 30,143,231,193, 98,179, 31,100,103,100, 44, 40,124,220,210,254,167, 92,181, 21,118,232,245, 96, 88, 65, 74, +130,234,112,126, 54,145,189,154,156, 85,225,208,137,179,188,164,210,140, 82,153, 98, 73,211,175,247,162,194, 50,248,140,211,193, +193, 97, 26,195, 48,206,186, 26,196, 98,177,226, 69, 34,209,145,234,148,103,131, 6, 13, 72,225,240, 54,245, 45,235,253,239,104, + 75,255, 75,156,191,255,218,188,102,195,230,141,150,132,189,137,220, 94, 56,172, 88,140,181,115, 45, 76,220,122,116, 95,245,228, +254,195,159,215,238, 21,231,255, 63,159, 59, 11, 58,206,105,251, 6,156, 69, 65, 66,171,196,105, 96, 96,224,211,190,125,251,105, +207,159, 63, 63,166,213,106,167,255,143,182,207, 1,108, 54,123,177,171,171,107,171,232,232,232, 96,173, 86,187, 29,101, 4,138, +172,134,157, 43,156,157,157,103,115,185, 92,158, 68, 34, 17,167,164,164,172, 2,112,254,191,173, 60, 27, 55,168,209,150,144,226, +160,219, 27,223,125,200,126,249,205, 56, 9,163,101, 8,123, 67,116, 92, 86,208,255, 67,189,255,219, 68,214,225,255,196, 31,247, +210,115,234, 57,245,156,122, 78, 61,231, 55,231, 52,214,151,167,158,243, 95,200,249,175, 4, 71, 95, 4,122,232,161,135, 30,255, + 56,200,245, 69,160,135, 30,255,117, 40,233,213, 42,246,102, 81, 21,168,210,170,184, 4,171,163,108,239,233, 57,245,156,122, 78, + 61,167,158, 83,207,169,231,252,159,227,252,183,138,172,195, 21,108,255,109,208,187, 85,245,156,122, 78, 61,167,158, 83,207,169, +231,212,115,254, 47, 8,173, 50,183,245, 67,135,122,252,237,216, 51, 4, 14, 0, 48,239, 10, 68,127,199,254,122,232,161,135, 30, +122,232,241,255,140,195, 40,103,232,240,191, 65,104,213, 4,208, 17, 5,137,111,163, 0, 60, 6, 32,254, 10, 62, 43, 0, 35, 41, +138, 26, 1, 0,132,144, 11, 40, 88, 53,146,169,203,193, 70, 70, 70,105, 10,133,194,166,240,115,186, 66,161, 40,153,203,128,194, +151,171,217, 72,137, 87,153,112,118,118, 78, 83, 42,149, 54, 58,252,125, 46, 33, 36,148,197, 98,133, 9,133,194,251,209,209,209, +126, 85, 57,113, 15, 15,143,137,108, 54,123, 35, 0,104,181,218,149, 15, 30, 60, 56,241, 55,214, 91,135, 90, 53,237,126, 83,107, +212,116, 90, 70,246, 42,124, 25,200, 15, 0,176,127, 32, 54, 83, 52,150, 20,126,222, 54,199,175,226, 56, 58, 85,221,191, 2,180, + 53, 48, 48,240,178,181,181,237,151,156,156,252, 26,192, 82,160,242,168,198,181,106,213,250,129,195,225,140,211,106,181,245,216, +108,118, 44, 77,211,167,146,146,146,124,245,247, 16, 61,244,208, 67, 15, 61,116, 16, 91, 95,160, 74, 66,171,161, 37,236, 8, 48, + 26, 20,122,131,224, 46, 5,156,141,202,194, 39, 93,143,239,223, 16, 26, 13, 93,240,159, 92, 22,180, 55, 63,176, 14,247,235,215, +207,113,238,220,185,232,220,185, 51,158, 63,127,222,233,248,241,227,147,207,159, 63, 31,202, 48,204, 3, 0,207, 1,157, 66, 41, + 8, 80, 16,167,101,108,191,126,253,122,109,220,184,145,221,180,105, 83,200,229,114, 60,124,248,208,109,219,182,109,187,158, 62, +125,122, 15,192,233, 66, 65, 80,110, 2, 60,133, 66, 97, 83,148,140,147,162, 40,155,225,195,135,191, 44, 41,174, 10,243,171, 81, +132,144,103, 20, 69, 5,106,181,218,231, 23, 47, 94, 76,106, 8,116,152,225,204,189,184, 32, 94,237, 88,154, 83,169, 84,218, 92, +253,101, 19, 56, 60, 30,148,249,121,232, 52,233, 47,209,123,119,245, 18, 80, 12, 13, 54,136,216, 99,195,174, 80, 0, 97, 41, 41, + 41,161,238,238,238,241, 85,173, 97, 54,155,189,241,214,173, 91,246,132, 16,120,122,122,110, 4,240,119, 9, 45, 94,199,182, 45, + 31, 92,191,116,198, 72,146,157,134,190,223,141, 58,245, 62, 41,125, 34,128, 75,159,137,166,126,176,165, 40, 44,153,181,233, 52, + 27, 0, 14,172, 24,187,116,103, 31,236, 89,120, 7,159, 0,120, 20,138, 31, 0,248, 5,192,131,253,253, 96, 11, 96,217,172, 77, +167, 41, 0, 56,184, 98,236,146,253,253,176,123,206,205, 42,135,173,152, 61,113,226,196, 61, 27, 55,110,100,219,219,219, 67, 36, + 18,245,109,210,164,137,107, 94, 94, 94, 19, 84, 48,137,184, 78,157, 58,231,186,246, 24, 84,119,232,136,209,124,107, 43, 11,164, +164,102,154,158, 59,115,108, 6,251,217,195,126, 31, 63,126, 28,165,191,135,232,161,135, 30,122,232, 81, 14,170, 31, 25,190,181, + 61,140,165,106,124,207, 97, 83, 63,116,105,219,164,231,152,254, 93, 89, 77, 26, 55,192,219,136,200, 62,215,238,191,216,198, 10, +140,240,167,181,196, 87,192,197,213,160,212,138, 87,194,104,104,112,238, 92, 61, 93,208, 19, 78, 30,203,126,249,242,101,131, 54, +109,218, 20,167,134,233,217,179, 39,122,246,236, 73, 29, 56,112,160,229,157, 59,119, 90, 30, 61,122, 84,237,239,239,255, 27, 42, +142,143,226, 85,191,126,253,109,123,246,236,225,185,187,187,131,199,227, 21,255, 32, 20, 10, 49,104,208, 32, 12, 26, 52,136,157, +146,146,226,121,253,250,117,207, 95,126,249, 69,149,144,144,176, 24,127, 69,105,174, 16,171, 86,173,106, 91,198,215,183, 40,138, +250, 64,211,116,112,203,150, 45,147, 92,129, 6, 51,250,119,190, 59,187,139,139, 96,193,242,227,101,242,112, 12, 13,241,251,196, +130,190,186,164,208,138,191,127, 19, 66, 83,147, 44,190,137, 73, 40,128, 48, 0,161,132,144,176,216,216,216,200, 70, 64,203,142, + 22,172,223,142,137,153, 22, 85, 16, 91, 72, 74, 74,130,153,153,153,177,187,187,123, 42, 69, 81,107, 31, 62,124,248,173, 39,228, +117, 88,187,100, 54, 87,252, 49, 20,159,222, 61,195,162, 17,110,252, 5,123,255,248, 89,161,210, 92,170,232, 32,138, 98,177,126, + 9,100,188, 81,144,140,119, 85, 86, 86,150, 59, 0, 88, 90, 90, 26, 2,120,176,243, 5,250, 47,236, 66,125, 77,108, 55, 46,155, +205,222,127,252,248,241,169, 63,252,240, 67, 65,234,136, 39, 79, 32, 20, 10,177,126,253,250, 58, 63,254,248,227,102,154,166,231, +151,231,201,234,218, 99, 80,221,221,219,127,110,146,159,157,171, 60,180,255,252,171,154,205, 26,178,102,121,253,104,178, 91,173, +180,211,106,181, 63,232, 61, 91,122,232,161,135, 30,122, 84,197,155, 85,169,208,114,181,194,137,214,205, 92, 70,142, 25,224,198, +107,222,172, 41,184,188,191, 66,183,180,105,219, 22,109,218,182,101,121, 75,242,123,191,124,245,166,247,197, 59,207,149, 50, 77, +194,249,232, 76, 76,212,213,170,162,164,180, 27,191,179,237, 33,205, 73, 55, 2, 0,129,185,141, 98,197,213, 79,247,187,116,233, + 2, 71, 71, 71,174,191,191,255,148, 74,132,214,138,168,168, 40, 30,155, 93,113, 60,212,154, 53,107, 98,248,240,225,104,216,176, +161, 97,247,238,221, 87,148, 39,180,140,140,140,210, 41,138,178, 1,128, 26, 53,106,104,215,174, 93, 27, 76, 10, 0, 0,132, 16, +242,140,197, 98, 61,103, 24,230,197, 31,127,252,145,220, 4,176,233,219,166,225,227,217,227,135,243,201,197, 93,229,138, 4, 69, + 94, 94,153,223,243,133,130, 12, 99,129, 32,148,199, 55, 10, 67, 65, 46,175, 48, 71, 71,199,200, 38,128, 99,251,134,206,119, 14, + 44, 28,107,114,108,250,207,149,150,101,235,214,173, 93, 91,180,104, 97,164,213,106, 33,149, 74,113,240,224, 65, 51, 99, 99, 99, +179,126,253,250,173, 41,217, 0, 26, 3,205,135,213,100, 79, 95,151,162,157, 83,141,134,100,222,181, 83,219,143,195, 7,245, 51, +109,219,177, 43,222, 63, 56,137,236,236,124,228,230, 72,192, 48,204, 23,113,125,230,220, 68,218,254,129,216,118, 96,249,216,101, + 20,139, 69,181, 28,178, 20,131,237,114,231,249,248,248, 68, 0, 48, 48, 52, 52, 44,217, 14,107, 26, 59, 52,219,214,160, 79, 87, + 28, 92, 57, 30,132, 97, 8,128,109, 85,240,102,217,152,152,152, 92,187,115,231, 78,135,118,237,218,225,249,243,231,136,139,139, +195,236,217,179, 85,115,230,204,225, 78,152, 48,129, 90,180,104,209,220, 95,126,249,229, 34,128,167, 95, 92, 8, 28,206,184,239, +134,142, 50,148,228,228, 41, 84, 74,181,170,134,149, 57,163,148, 42,100,153,226, 60,197,168,177,211, 84, 17, 65, 47,198, 1,248, + 66,104,125,101,121,234,161,135, 30,122,232,161, 3, 8, 33,237, 0, 88, 3,200,160, 40,234, 85,201,237,194, 93,138,178,181,148, +222,206, 68,193,168,148,101, 9,186, 76, 20, 76,247,177, 6,160, 5,240,146,162, 40,241, 87,154, 88,241, 42, 67, 63, 63, 63, 82, +242,189,132,208, 34,132, 16,162,201,250, 64,148,209, 55,137,236,213,145, 47, 94,242,136, 75, 36,245,229,121,242,226,244,106,226, +106, 85,113, 22,246,254, 13,161, 25,219, 2,100, 86, 59,144,249,221,205, 21, 47, 95,190,244,103, 24,198,207,187, 43, 8,121,123, +154,144,183,167,201,194, 78, 32, 23, 47, 94,188,181,121,243,102, 63, 95, 95, 95, 63, 0,149,205, 83, 74,203,127, 21, 72, 94,216, +128,148,135,168,168, 40,226,227,227, 67,150, 47, 95, 78,142, 29, 59, 70, 80, 73, 4,117, 79, 79,207,135,225,225,225,100,194,132, + 9,193,168, 32, 48, 96, 99, 64, 48,174,142,221, 59,229,185, 93,106,213, 15,205,137,184,155, 81,153,231,111,111,111,255,153, 61, + 91, 92,236,200,190,246, 46,228, 68,239, 54,159, 8, 33,183, 8, 33, 91, 8, 33,163, 8, 33, 13, 1,160, 53, 96,250,157,189,101, +140,226,252,110,185,106,122,199, 74,243,222,181,110,221,218,117,241,226,197,217, 42,149,138,196,199,199,147, 67,135, 14,145,187, +119,239,146,171, 87,175, 18, 55, 55,183,148, 18,246,218, 78,110,232,148,166, 58,186, 78, 89,157, 86,100,192,102,239,123,117,247, + 34,137,121,124,129,188, 60,187,153,156,250,105, 12,153,251, 93, 7,181,169, 49, 79, 1,160, 71,121,199,205,233,130, 6, 13,235, + 88, 71, 39, 36, 36, 16,181, 90, 77, 38, 77,154, 68, 60, 61, 61, 73,159, 62,125, 72,175, 94,189, 72,207,158, 61, 73,143, 30, 61, +200,253,251,247, 73, 74, 74, 10,233,213,181,141,116, 96, 99,180,173,130,105,205,156,156,156, 62,197,199,199, 19,181, 90, 77,252, +253,253,201,201,147, 39,137,191,191, 63,241,246,246, 38, 0, 78,204,154, 53, 75, 46, 22,139,137,167,167,103, 50,202,136, 26,239, +228,228, 20, 25, 30,157,148,180,115,211,145,251,191,239, 59,115,255,242,197,187,247,175,221,126,249,231,213,219,175,206,191, 8, +137,189,234,228,228, 20, 89, 70,253,127, 85,121,234,161,135, 30,122,232, 81,185, 22, 41, 20, 90, 3, 10,157, 29, 3, 8, 33,189, + 74,109, 15, 40, 20, 78, 95,108,123,123,123, 47, 47,185, 93,180,143,183,183,247,114, 0,164, 83,167, 78,103, 8, 33, 13,190,129, +249,211,203,120, 85,238,209, 42, 2,157,252, 18, 92,151,126, 48,208,106,160,201,140, 2,147,147, 0, 8,236, 32,167,132,200, 74, + 77,192,187,199,151, 42, 78, 36, 81,136, 27, 81, 48, 0,224, 31, 25, 25,137,119,239,222, 33, 41, 41, 9,124, 62,255,139,253,158, + 60,121, 2, 99, 99, 99,216,219,219,235,166,116, 85,159,247,115,161,109,156, 32,236,228,142,204, 49, 51,225,239,239,143,244,244, +116,112,185, 92, 24, 26, 26,130,166,233, 74,249, 88,172,130,140,191, 69, 94,172,178,246,113, 7, 56,188, 26,194,235, 7,214,204, +119,102, 61,243, 51,144, 39,198, 32, 69,161,213,205,147, 39, 20,128, 47,224,167, 26, 27,243,139,135, 11, 1,132, 81, 20,245,190, + 53, 96, 32, 16, 26, 93,255,109,195, 34, 59,118,144,191,145, 60, 38,180, 76,142, 94,189,122,205, 0,176,134, 16,146,211,162, 69, + 11,219,141, 27, 55, 90,136, 68, 34,188,125,251, 22,231,207,159,207,160, 11, 78,148, 34,132,172, 3,128,142,128,145,185,181,249, +237,125,171,231,155,224,193, 57,195,234,180, 34,179,198,131,254, 28, 54, 97,214,156, 61,243, 7, 65,154, 47,199,233,187, 65,184, +245,230,195, 96, 0, 79, 80,193,188,183,253, 79, 17, 3,100,244, 28, 58,116,104,240,163, 71,143,172,142, 30, 61, 10,154,166,203, +124, 29, 61,122, 20,247, 30,191,153, 7,224,181,142,102,213,116,118,118,190,247,226,197, 11,107, 62,159,143,187,119,239, 34, 39, + 39,167,216,147, 53,113,226, 68, 42, 39, 39,103,244,193,131, 7,135,125,252,248,113,251,227,199,143,179, 80,144, 11,242,179,134, +192,102,179, 63,208,180,186,145,125,227, 6,156, 17,131,186,118,149,100,133, 66,104,217, 2,207, 66, 62, 92,207, 17,103,201,217, +108,246,135,146,251,127,139,242,212, 67, 15, 61,244,208,163,106,160, 40,202,143, 16, 50,144,162, 40,191,210,223,149,254, 92,180, +223,230,205,155,139,183,139,142,217,178,101,203,166, 18,219,178,111,100, 94,133,147,225,187, 23, 42,200,238,101,237,164,124,123, + 25,202,119,215,192,117,234, 2,195,134,131,193,118,114, 67, 98,232, 3,132,220,220,137,228,136, 39, 32,140, 22,246,174,237,117, + 53, 68,209,168, 81, 35, 40, 20, 5, 83,179,148, 74, 37,184, 2, 11,197,162,233, 99,141, 0,128,225, 24, 41, 75, 40, 88,157, 8, + 77,186,120,160,125, 26,193, 75,219, 2, 71, 69,251,180,130,227, 54, 76,154, 4, 46,151, 11, 46,151, 11,170,112,234,143, 46, 66, +139, 42,220,153, 41, 24,190, 42,203, 8, 74,198, 51, 56,125,118,141, 87,123,222,199, 48, 67,101,248, 51,164, 40, 25,114, 61, 77, +251,167, 46,246,242, 5,124,145, 49,159, 31,102, 44, 20, 20, 11, 45,138,162, 62, 0, 0, 49, 48,240, 61,185,206,171,133, 32, 45, + 86,160,120,229,143, 84, 5,163, 46,135,102,221,205,155, 55,109, 56, 28,142,157, 86,171, 69, 98, 98, 34, 34, 34, 34,176,123,247, +238,180,252,252,252,238, 65, 65, 65,209, 37,181,163,214,216,240,188,239,250,249,117, 57,161, 1, 70,202, 15,225, 85,110, 61, 86, +205,190,247, 28,220,189,229,159, 51,198,175,196,247,253,251, 96, 66,247, 38, 36, 62, 37, 91, 1,224,110,161,235,181, 50,136,130, +130,130,122,119,235,214,237, 84,171, 86,173, 26, 19, 66,208,188,121,115,140, 30, 61, 26,190,190,190, 8, 9, 9, 65, 94, 94,158, +250,206,157, 59,187, 0, 28,215,209, 44,190,133,133,197,173,251,247,239, 91,243,249,124,220,185,115, 7,114,185, 28,246,246,246, +152, 51,103,142,225,150, 45, 91,126,207,203,203, 27,177,121,243,102,163,248,248,248,125,183,111,223,174,131,130,188,115, 95, 52, + 2,149, 74,117,248,180,239,137, 61,115,188,230, 58,220,127,254,214, 95, 41,201, 55,115,114, 74,202,179,182, 16,154,236,218,186, +174,182, 74,165,154, 81,118,121, 62,172, 86,121,234,161,135, 30,122,232,241, 5, 42,212, 34, 37,197, 83,105,177, 85, 21,145, 6, + 64,238,237,237,189,130,162, 40, 63,111,111,239, 21,155, 55,111,150, 3, 72,249, 59, 68, 86,177,208, 26, 56,112, 96,128,159,159, + 31, 6, 14, 28, 24, 80, 46, 5,163,133, 58,254, 17,212,241,143, 96,220,105, 30,254,216, 60,166,212,201, 51,213,182,110,208,250, +187,247,149, 74, 37,231,196,137, 19,197,243,182, 0, 64,171,213,126,243, 90,172,138,208, 42, 20,122, 95, 24,225,204, 19, 6, 28, + 94, 56,162,163,165, 86,102,160,122,114, 29, 34, 37, 67,111,143, 81,203, 94,229,144, 95,202,227,188,186, 96, 6,146, 30,223, 3, + 95, 40, 76,154,250, 40,172,216,139, 85, 40,178,226, 0,160, 14,207,196,223,103,254,247,110,118, 92,112, 85,127, 94, 64,138,146, + 81,250,124,212, 28, 47,167,177,129, 16,130,184,184, 56,200,100, 50, 4, 6, 6,226,210,165, 75, 25,101,136, 44, 56,243,132, 15, +143, 45, 29,215,193, 52,255, 19, 87,245,234, 30, 82,148,140, 78, 67, 93, 86,205,191,239,194,101, 81,119, 40, 22,219,184,103, 71, + 87, 44,152, 54, 4, 59,143,253, 65,171,108,186, 14,220,115,237,198, 72,137, 82,189, 66, 71,145, 85,236,108, 12, 10, 10,106, 18, + 20, 20,196, 3,224, 49,122,244,232, 27,195,134, 13, 67, 64, 64, 0,174, 95,191,238, 2, 32,181,112,191,245, 40, 72,148,253, 11, +128,216,242, 28,143, 92, 46,247,236,189,123,247,154,214,172, 89, 19,247,238,221,131, 92, 46,199,172, 89,179, 84, 94, 94, 94,220, +137, 19, 39, 82,185,185,185,197,158,172,192,192,192,172,242, 68, 22, 0,136, 68,162,155,151,206,159,236,220,173, 91,183, 33,117, + 93, 26,154,198,230,231,165,243,249, 70,198,143, 3, 30,112, 95,189,120,186, 79, 36, 18,189, 44,187, 60,253,117, 46, 79, 61,244, +208, 67, 15, 61,202,135, 78, 90,164,148,103,170, 42, 40,113,156,193,230,205,155, 35, 54,111,222,252,153,199,235, 43, 81,122,213, +225,159, 69,125, 90,181,226,104,105,115, 19,191, 60, 1,134,169,202,201,126,241,157,133,133, 5,109,108,108,252,153,208, 98,116, +228,204,190,114, 6,177,179,199, 22,123,178,138, 60, 91,232, 59,241,171,132, 22,195, 48,129, 0, 62, 51,130,111,227, 58,102,215, +160,198, 93,154,212,117, 96,105,206,239, 70,178,140, 86,172,137, 82, 43,222,229,147,193,145,101, 76,178, 46,230,164, 53, 48, 18, + 24, 39, 24, 11, 5,165, 69,214, 71, 0, 16,216,186, 12,219,222,175, 97,247,150, 13,235,179,232,115,191, 66, 36,211, 72,188, 35, +213,234, 88, 41,185, 92, 78, 25,174,233,211,167,207, 26, 75, 75, 75,163, 61,123,246,152, 57, 57, 57,129,166,105, 85,105,145,197, +183,113, 29,179,251,251,102, 93, 92,237, 44, 88,154,139,123,145, 36,215,202,118,199,106,126,215, 69,100, 89,153, 9,111,251,108, +154,109,204,231, 25, 64,161, 80, 96,203,129,139,184,243, 52,124, 96,102,248,213,219, 0,110,127, 69,131,156, 58,112,224,192,157, +235,215,175,135, 70,163,193,148, 41, 83,240,225,195,135, 59, 81, 81, 81,187,107,215,174,189,120,233,210,165, 53,237,236,236, 48, +114,228, 72,174, 70,163,153, 88, 14,199,214,211,167, 79, 15,108,217,178, 37, 2, 2, 2,144,147,147, 3,123,123,123,120,121,121, + 25,110,222,188,249,247,188,188,188, 17,155, 54,109, 50,138,139,139,171,208,147,245, 89,187,214,106, 55, 28,218, 57,123,113,187, +142,110,172,152,152,104, 58,177,189, 59,235,193,189,235,143, 44, 45, 45,127, 79, 76, 76,252,171, 60,135, 52,175,114,121,234,161, +135, 30,122,232,241,109, 64, 81,212,159,133,243,174, 62,243,114,149, 22, 97, 69, 30,171,146,219,165,247, 47,252,253, 91, 60, 44, + 31, 46, 67,120,125, 30,222, 97,224,192,129, 58, 47,171,103,164, 25, 58,137,167,210,232,223, 16, 26, 7, 33, 56, 43,220, 89,224, + 10, 44, 20,131,214,223,189, 95,222,190, 2,129, 64,103,143, 22,163, 84, 84, 86, 41, 85, 18, 90,133,115,180,110, 17, 66, 62, 19, + 90,102,182,174,238,203,150,206,223,229, 54,172, 47, 43,109, 90, 39,228, 72,148,202,165,111,105, 38, 89, 86,177,200, 42,232,197, + 53,241,124,129, 48,204, 72,192, 47, 41,178, 18, 1,192,200,166,126,251, 37, 11,230, 28,232, 49,102, 16,149, 49,203, 13,226, 28, +185,114,113, 4, 77,137,228,100, 68, 36,240,160, 44,186,251,247,239, 31, 2,112,200,221,221, 61, 77, 32, 16, 64, 34,145,124, 81, + 7, 69,246,118, 25,214,151,149, 54,181, 3,178,165,106,229,210, 8, 26, 41,114,230,108,101, 34,203,218,220,228,182,207,198,217, +252,148,228,143,224,114,185, 16, 10,133,184,251, 36, 12,153, 17,215,190, 70, 96,129,197, 98,173,245,246,246, 94, 51,103,206, 28, +100,101,101,225,250,245,235,232,223,191, 63,206,156, 57,227,116,227,198,141,157, 30, 30, 30, 96,179,217,240,243,243,131, 70,163, +121, 95, 14,205,144,233,211,167, 47, 30, 54,108, 24, 94,190,124,137,212,212,212,207, 60, 89, 57, 57, 57,163, 15, 28, 56, 48, 44, + 62, 62,190, 82, 79, 86, 41,180,119,174,223,154,187,124,213, 14, 40,101,233,156, 12,209,243, 0,255,187,172,103,217,217,217,124, + 0,185,213, 45, 79, 61,244,208, 67, 15, 61,116,246,106,149,167, 69, 50, 10, 69, 84, 70, 89,219, 37, 4, 86, 89,219, 84, 41, 47, +152,170,212,239, 33,127,231, 57,233,228,209,226,216, 54, 3,157, 22, 94, 66,104,165,127,246,187,145, 73, 13,157,134, 14, 53, 52, + 56, 62,199,139,227,104, 25,101,101,101, 25, 89, 89, 89, 41, 74, 10, 4, 62,159,143,154, 53,107, 66, 44, 22,227,240,225,195, 64, +229,147,162,105,211, 97,227,209,126,204, 20,188,114, 52, 4,209,168,139, 61, 91, 62,147, 38,125, 38,182,184, 92,110,209,220,176, +202, 58,221, 23,133,158,166,103, 0, 72,107,151,186, 63, 27, 9, 4,147,140,172,106, 89, 45,152, 61,213, 32, 62, 93,137,251,110, +203,115, 46,110, 93, 38, 76, 34,194, 57,137,200,125, 90, 9, 95,236,119, 7, 79,150,246,100, 37,183,114,169,187,210,136,111, 52, +205,176, 70, 29, 59,239, 69,179, 13,226,211,148,212,253,246, 75,243, 46,253,178,148, 31, 7,147,197,201,200,121,160, 67,245,172, +233,223,191,255, 26, 66, 8, 97, 24,102, 21, 0,148,180,119,145,215, 52,131,216, 79, 10,248,187,173, 20, 95,218,186,204, 36, 9, + 21,219,107,213,252,251, 46,182, 22,166,183,125, 54,205,225,167,138, 18,192,227,241, 96, 98, 98,130,164,180, 92, 24,112,216,242, +175,108,111,188,174, 93,187, 46,155, 61,123, 54,194,194,194, 48,107,214,172,212,196,196,196,203,231,206,157,155,181,122,245,106, +142,167,167, 39, 82, 83, 83,177,109,219, 54,205,147, 39, 79, 54, 1,216, 86,102,123,228,112,166,254,252,243,207, 36, 37, 37,133, +138,139,139,131,189,189, 61,230,206,215,143,113,139, 0, 0, 32, 0, 73, 68, 65, 84,157,107,184,105,211,166,226, 57, 89, 85,241, +100, 21, 65, 36, 18, 5,220,185,247, 12,131,111,238, 2,173, 81, 6,228,100, 37, 62,122, 23, 43, 14,168, 97,104,248,163, 67,235, +230,213, 42, 79, 61,244,208, 67, 15, 61,190,137, 23,235, 85, 69,219,255, 5, 40,107,232, 80, 39,161,245,126,239,202,201, 46,147, +231, 44,129,177, 83, 23, 40, 35,175,128,145,164, 21,123,180,140,132, 22,168, 81,187, 49,114,164, 74, 92,240,127, 3, 0,239,171, + 98, 85,126,126, 62,218,180,105,131,253, 19, 93,123, 40,242,179,140,140, 1, 40,121,166,138,171,134, 93,239,223,184,113, 67,198, + 48,204, 89, 0, 55, 42,161, 89,219,180,105,211,125, 59,118,236, 48,108, 60,102, 50, 36,207, 31,151,246,160,192,216,216, 24, 60, + 30, 15,161,161,161,184,127,255,190, 10,192,218, 74, 42,244, 5, 77,211, 33,231,206,157, 75,110, 80,215,161,111,155, 86, 45,230, +173, 88,238,109,242,246,241, 29,172,218,180,143,105,208,214, 51,119,203,153,171,249,185,194,218, 61,229,169, 81,193, 58,156,106, + 72, 41,145,149,210,200,185, 86,143, 86,205,154, 46, 89,181,106,165,105,196,227,187, 88,253,139, 15,113,105,217, 43,247,151, 75, +215,242, 50,249,117,250, 40,210,223,189,212,165, 12, 3, 2, 2, 14, 1, 56, 84,180, 93,218, 94,239,245,187, 25,215,118,125,197, + 91,206, 92,146,230,153,212,238, 85,145,189,214,141,135,116,118,180,182,184,189,119,195, 76,254, 39, 81, 34,120, 60, 30,132, 66, + 33, 18, 83,115,176,102,215,121,169,154, 97,250,126,173,208, 50, 49, 49,225,169,213,106,236,223,191, 31,137,137,137,157, 0, 36, +190,126,253,218,103,212,168, 81,123,154, 55,111,222, 40, 34, 34,226,189, 68, 34,153, 3,224, 93,121, 36,230,230,230,157,172,173, +173,169,103,207,158, 97,230,204,153,170,185,115,231,114, 39, 76,152, 64,137,197,226,234,122,178, 0, 0, 14, 14, 14,238,189,123, +118, 68,151,222,179, 2, 84,138,156, 71,241,239,126, 15, 96,145,167, 70,213, 45, 79, 61,244,208, 67, 15, 61,254,103, 80,189,192, +224,238, 0,199,213, 18, 51,154, 58,112, 63,249,110,157, 75,242, 99, 3,137,252,229, 33,146,119,101, 26,249,115,219, 4,114, 99, +239, 2, 50,107, 64, 83,210,200,134,250,228,106,137, 25,238, 95, 10,183,207,178,123,247,111, 8, 77,239,250, 32,189,235,131, 12, +112,133, 6,192,138,214,173, 91, 95,245,106,255, 87, 28, 45,175,246, 32, 0,102, 2, 16,150, 99, 86, 89, 25,195,237, 1, 28,110, +211,166, 13,253,224,193, 3, 18, 53,162, 23, 9,106,100, 69,230,204,153, 67, 86,175, 94, 77,198,142, 29, 75,172,173,173,233,194, +130,176,175,140,115,240,224,193,142, 0, 80,171, 86, 45,243,182,141, 27,124, 10,245,191, 78, 30,249,238, 33,199,188,134,146, 14, +205, 27,103,218, 53,234, 22, 98,108,223,176, 85, 37,197, 87,204,105,103,103,183,156, 16,210,151, 16, 98, 15, 0, 46, 46,150,194, +214,141, 26,164,132,220,187, 78, 30,159,220, 71,142,121, 13, 37, 29, 91, 52,201,114,108,236,241,206,200,166, 81,123, 93, 56,203, + 66,153,246, 54,107,148,105,219,160,115,112, 5,246, 22,115,214,109, 63,242, 90,114, 74, 26,121,241,226, 5,185,113,227, 6,121, +252,248, 49,241, 61,119,141,212,110, 55, 66, 98,213,252,251, 46, 85,104, 58,229,217,105, 54, 96,192, 0,242,254,253,123,210,175, + 95, 63, 2,192,172,154,156, 87,227,227,227, 73,120,120, 56, 89,177, 98, 5, 1,112, 98,246,236,217,242,220,220, 92,210,171, 87, +175,196, 66,129,197,169,142,157,245,156, 29,182, 12, 25,212,117,173,215,204, 97,238, 95, 91,158,223, 16,122, 78, 61,167,158, 83, +207,249,191,192,249, 79,134,125,161, 87,171,232,189,181, 78, 30,173, 0,128, 70, 22, 14, 53,179, 81,159,218,180,109,239,143,251, + 15,157, 88,178,108,222, 84, 65, 87,183,222, 8,187,247, 27, 46,249,157,147, 42,148,170,109, 92, 54,118,132,103, 65, 22, 93,137, + 21,133,113,180, 62, 67, 80, 80, 16,191, 70,253,191, 98, 48,197, 20,196,102,245,169,226, 9,166, 2,152,254,230,205,155, 29, 30, + 30, 30, 27,167,117,105, 63,212,171,115, 15,104, 52, 26,248,250,250, 34, 33, 33,225, 50,128,149,186,122,220,194,194,194, 50,155, +212,119,154,111,192,230, 44,153, 51,118,136,117,198,135,183, 72,142, 12, 2, 0, 40,149,114,205,167,247,143, 90, 86,197, 56, 99, + 99,227, 23,214,214,214, 81,214,214,214, 98,215,186,181,166,243, 96,176,106,214,232,239,108,178,226,223, 33, 41,162, 96,100, 84, +169,144,169,147,223, 63,104, 84,157,218,117,114,114,226, 9, 12, 48,163, 76,123, 85, 10, 77, 90,204,187, 86,186,240,200,148,170, + 77,235,118,250,246,217,176,100, 18,207,212,212, 20,111,194, 99,176,234,215, 51, 82,185, 74,211, 55, 51,236,234, 55, 25, 30, 35, +132, 64,163,209,232,188,208,161, 28, 44,107,217,178,101,195,141, 27, 55,186, 76,156, 56, 17, 95,235,201, 42,137,216,120,145,183, + 67,173,122, 77, 98,162,222,120,212, 48,230,158,250,154,242,212, 67, 15, 61,244,208,227,127, 6, 3, 10,157, 57,211, 75,188, 7, + 85, 42,180,138, 16,158, 14, 25,128,245,117,217, 18,159,229, 27,119,174, 97, 81,187, 38, 49,132,252, 70,179,176, 46, 46, 11, 25, + 95,105,156,204,128, 3,186,207,247, 99, 57, 0, 96,192,169, 94, 7, 89,136,247, 0,134, 29,121,250,178,221,145,167, 47,127, 42, +252,110, 3,128, 42,141,229,154,112, 16,238,214,164,158, 67,215,214, 77,141,216, 90, 57,146, 35, 63, 32, 91,170,192,221,136,132, + 28, 22, 97,253, 86, 85,163,226,226,226, 30, 2,128,173, 25, 63,178,107,147,250,181,187,181,105,202, 55,160, 84, 72,126,251, 6, +185,114, 21,238, 68, 36,228,130,162,170, 61,161,250, 91,217,155, 22,118,237,213, 31,160,122, 81, 20,117,111,133,215, 24,222,154, + 95,207,126, 83,145, 5, 64, 38, 18,137,178,100, 50,153,101, 74, 74,138, 10,213, 15, 18, 23,147,151,151,215,124,193,130, 5,235, + 23, 47, 94,188,100,235,214,173,220,234,204,201, 42, 15, 98, 81,194,149,110, 77,191, 93,253,235,161,135, 30,122,232,241, 63,129, +233,165,222,161,179,208, 42, 22, 12,233,200, 0, 48,167, 94, 61,178, 40, 54, 22,170,111,101, 89, 89,158,174,175,196, 43, 0,131, +170,125, 52,139,202,127,254, 62, 65,242,226,125,130, 4, 12, 33, 12, 33, 74, 22, 11, 73, 82,181,122,211,251, 56, 81,245, 87,221, + 81,148,246, 85, 76,162,252,245,135, 36, 5, 97, 24,194, 16,162,162, 40,124,210,104,152, 77, 17,113, 9,215,254, 27,236,205, 12, +187,250,212,143,166,186, 62,125, 17,190, 72, 42, 85,239,203,140,188, 26,248, 13,235, 69, 19, 22, 22, 54,174, 83,167, 78,147,181, + 90,173, 15, 0,205, 87,112,169,104,154, 94,182,101,203,150,203, 97, 97, 97,231, 3, 3, 3, 83,191,133,200,250, 91,235, 95, 15, + 61,244,208, 67,143,127, 43,170,151, 84,186, 60,124, 75,145,245,223,136,240,152,143,109,254, 14,222,136,152,143,205,254, 9,246, +166, 69, 94,121,157, 6,140,254,155,138,247,142, 86,171,189,243, 45, 69,245,173, 91,183,156, 81, 70, 90,157,255,182,250,215, 67, + 15, 61,244,208,227, 95,139,233,229,137, 47,142,190,108,244,248, 23,128,124, 43,145,165,135, 30,122,232,161,135, 30,213, 64,185, + 30, 45, 10,229,175, 28,184, 87,133, 63,168,206,234,131,123,122, 78, 61,167,158, 83,207,169,231,212,115,234, 57,255,231, 56,255, +141,176, 71,193,132,248, 63, 11,223, 43, 20, 95,223, 18,250,165,175,122, 78, 61,167,158, 83,207,169,231,212,115,234, 57,255,237, + 40,115, 34, 60, 80, 48,121, 88, 15, 61,244,208, 67, 15, 61,254, 46,240, 10, 95,213,253, 93, 15, 61,254,137, 98,171, 88,112, 85, +103,142, 86,131,194,247,152,191,209, 88, 47,123,123,251,233, 45, 90,180,104,204,229,114, 89,249,249,249,235, 30, 60,120,176,182, +244, 78, 93,155,112, 94,179, 89,112,252,235, 27, 10,160,216, 0,139, 5, 45, 65,242,227, 80,121, 91,125,189,255, 87,195,201,216, +212,250, 15,138,197, 54,212,210,106,104, 53,106, 20, 76,183, 42, 0,195,208, 9, 90,181,210,179,188,131,237, 90, 14,169, 77,107, +153,173, 0,217, 15,176,102, 3,204, 1, 10,156, 89, 4,244, 65, 10,236,153, 96,147, 95,160,165,150,114, 12,216,203, 83,131, 46, + 38,253, 27, 10,236,194,133, 11,236,175, 57,126,196,136, 17,101, 38, 16,173, 89,179,166, 31,159,207,175, 95,222,113, 82,169, 52, + 53, 53, 53,213,227, 95,222, 30,187, 1,216, 11,160,105,169,239,223, 1,152, 15,192,255,107,255,192, 29,224,216, 2, 51,184,192, + 82, 0, 80, 3,191,164, 1,135, 2,254,139,230, 24, 90, 91, 91, 63,226,112, 56, 46, 82,169, 84,154,159,159, 95,207,196,196, 36, + 86, 32, 16, 8,104,154,126,159,145,145,209,173,138,116,179,241, 87, 42,173, 37, 0, 14, 84,241,119, 61,244,248,167,224,171, 86, + 29,186, 22,220, 31,224, 14,160, 91,187,118,237,108,165, 82, 41,222,189,123,151, 6,224, 17,128,128,194, 87,244,183,176,148,197, + 98,109,223,185,115,231,143,115,231,206, 45, 78, 6, 29, 26, 26,138,150, 45,191,140, 17,202,102,193,241,193,245,123, 54,175,194, +162,209,174,215,240, 66,161,197, 2,164,169,240,232,221,190,186, 38,152, 88, 88, 88,172,163, 40,106, 4,139,197,170,180, 83, 99, + 24, 70, 75, 8,185, 32, 22,139,215, 0,200,175,202, 31, 9,248, 60, 13,173,213,150,249, 31, 28, 54, 91, 43,149, 41,203, 13,123, + 81,163, 70,141, 64, 22,139, 85,183,100,194,108,224,243, 4,218,229,253, 70,211,116,114,102,102,166, 46, 34,212,136,197,225,206, +167, 40,110,111,176, 24, 87,128, 2, 5, 86, 52,163, 85,221,101,104,245,110, 0,138,175, 17, 89,246,181,234, 61, 94,184,114,139, + 99,120,228, 59,172,240, 26,139,173,123, 79, 96,249,252,201,216,125,248, 12,230, 79, 31,131, 38, 77,154,162,162,180,226, 12,184, +155, 86,206, 27,209,107,243,254,243,110,203,231,140,224,109,222,127,161,235, 10,175, 81,134,155,246,157,239,186,194,107, 36,111, +243,190,243,110,203,231,141, 48,222,116,224, 34, 3, 96,124,117,140, 28,227, 82, 83, 74,209,116,153, 79,219,132,195, 81,158,121, +159, 34,248,255,184,162, 39, 78,156,216, 66, 46,151,191, 25,219,187,245,150, 86,174, 14,162,178,246,201,250, 36,114,136,141, 10, +242, 54,224, 26,183,249,206,251, 68,104,133, 46, 7, 30,175,238,187,119,239, 92, 24,134,129, 86,171, 5, 77,211,197,239, 42,149, + 10,221,186,117,251, 86, 11,103, 6, 1, 88, 87,112,177, 98, 51,128,243, 95,193, 37,228,112, 56, 11, 13, 13, 13,221,105,154,110, + 12, 0, 6, 6, 6,145, 74,165, 50,128,166,233,157, 0, 36, 85,228,219, 37, 18,137,154, 8,133, 66,168,213,234,226, 4,244,108, + 54,187, 81,237,218,181,247, 43, 20, 10,151,175, 61,121, 91, 96, 70,103, 55,183,221, 19,126,252,145, 45,127,244, 8,187,143, 31, +223,133,188, 60, 0,216, 95,217,177,134,134,134,183, 89, 44,150, 83, 85,254,143, 97,152, 4,149, 74,229, 89,149, 99, 56, 28,142, + 75, 74, 74,138, 77,205,154, 53,145,159,159, 15,129, 64, 32, 40,218,174,134, 39,107, 27, 33,196,184,240,222,190,187, 99,199,142, +157, 40,138,162, 1, 16,134, 97, 88, 47, 94,188, 24,195, 48, 12,167,240,254,180, 13,192,113, 0, 74,125,159,173,199, 63,212,155, +117,184,170, 66,235, 6, 0,247,118,237,218, 25,143, 30, 61, 26,238,238,238,112,113,113,129,145,145, 81,193, 77, 60, 43,203, 54, + 56, 56,120,228,163, 71,143, 70, 94,191,126, 29,111,223,190,149, 3,120, 2,160,204,139,186,231, 64,183,185, 70, 66,222, 30, 0, +200, 72,206, 74, 77,142, 75,223,147,154,154,186, 13, 64,201, 16,225,245,198,143, 31,191,104,222,188,121,240,243,243,195,153, 51, +103,160, 84, 42,145,159, 95,129,126,145,165, 67,124,127, 11, 32,136, 7, 18, 3, 0,190, 13, 32,176,173,118, 73, 89, 88, 88,172, +155, 63,127,254,130, 38, 77,154, 20, 71, 49,215,104, 52,160,105, 26, 26,141, 6, 98,177, 24,139, 22, 45, 42,232,104, 9, 1,195, + 48,248, 63,246,190, 59, 44,138,171,109,255,158,217,190, 44,189,131, 34, 42,138,130, 32, 86, 4, 44,216, 75, 68, 99,141,177, 39, +154,248, 38,177,196,146,136, 45, 26, 27, 36,214, 24, 53,106,212, 88, 94, 27,118,177,183,104, 98, 71, 4, 41, 10,138, 52,169, 75, +221,133,109,179, 59, 51,191, 63,128, 21, 17,118, 23,147,239,247,189,223,155,189,175,107,175,217,217,153,121,246,204, 57, 51,231, +220,231,126,206,121,206,197,139, 23,103,125,254,249,231, 40, 45, 45,157, 91,159,205,160,206, 30, 49, 36, 65, 54,173,209,106, 88, +154,126,125,255,201,235, 46, 58,154,230,168, 84, 84,189, 43,149,139, 68,124,131, 36,143,199,227, 53, 77, 58,123,214,153, 20, 8, +192,210, 52,192, 48, 96, 25,166, 58, 59,171, 63,108,213,111, 44,205,128,213,210, 96,116, 12,116, 74, 53, 2,191,252,210,148,172, + 8,225, 9,196,135, 39,126, 54,223,181, 91, 80, 16,175,185,135, 59,116, 52,131,151,233,175, 93, 31,199,220,239, 30,181,127,219, + 23, 26,165,124, 60,128,247,138,179, 37,176,176,190,178,245,151, 95,155, 62,122,146,128,235, 55,111,227,218,141, 91, 0,128,203, + 55,239,214, 16,110,163, 69, 5, 93, 69,251, 57,211, 70, 8, 35,183, 30,225,205,153, 54,146,243,195,214,163,188,217,159,126,200, +137,220,114,152, 63,251,211, 15, 57,145, 63, 31,230,207,158, 54,130, 19,241,211,158, 0, 0,118, 0, 74, 27, 50,214, 80, 25, 17, + 58,157,240,223,105, 5, 28, 0,144,238,216, 1,109, 97, 33,220,151, 47, 7, 0, 76,244,114, 49,217,221,225,232,232, 24,195,227, +241,154, 26, 59, 79,171,213, 26, 37,193, 83,167, 78,237,160, 84, 42, 99,116, 58, 29,203,229,114,195, 39,140, 28,120,122,112,207, + 14,197,181,207,137,143,143,115, 88,187,246,236,136, 99,143,229,236, 71,157,173, 30, 71,175,159,218, 37,108,193,190, 56, 3, 13, + 50,169, 86,171,145,154,154,138,218,139,188,215, 2,253,190,125, 39, 0, 63, 57, 56, 56,116, 43, 46, 46,158, 8, 96,177, 76, 38, + 11,224,112, 56,176,183,183, 95,172,209,104, 94,218,216,216,236, 46, 47, 47,191, 91,173, 26,153,186,100, 64, 47,107,107,235, 3, +167, 78,157,178,235,212,169, 19, 89, 84, 84,132, 22, 45, 90,160,164,164, 36,240,246,237,219,157,167, 77,155, 54, 77, 46,151, 79, +174,238, 12,154,138,182, 22, 22, 22,236,148, 41, 83, 8,154,126,115,187,123,246,236,193, 32,127, 93, 43, 39, 91, 11,133, 74,195, +150, 95, 79,181,249, 23,159,207,255, 51, 51, 51,179,188,177,153,193, 7,190,157, 50,127, 62,199, 50, 35, 3,150,113,113,152, 40, +147,113,127,168, 82,183,140, 18, 45,146, 36, 61, 15, 28,254,205, 91, 32, 16, 64,167,211,233,201, 96, 77, 29,165,213,106, 65, 81, + 20,180, 90, 45,104,154,134,150,210, 34, 98,245,143,239, 93, 23, 90, 88, 88, 88,184,185,185, 21, 88, 88, 88, 88,252, 29,173,144, + 80, 40,228,238,223,191,127,188, 64, 32, 0, 0,104, 52, 26,248,251,251, 19,230,246,217,140,255, 50,178,245,142,202,101,136,104, + 13,145,201,100,160,105, 26, 86, 86, 86,224,112,222,110,247, 29, 28, 28, 48, 96,192, 0,244,234,213, 11, 31,127,252, 49,146,146, +146,196, 31,127,252,241,128,134,140, 77,152, 31, 6, 15,111,151,234,198,132,113,187,115,254, 73,228,158, 85,199,157,242,243,243, +231,215, 58,109,218,140, 25, 51,136,226,226, 98,140, 29, 59,246,182, 90,173, 30, 14, 64,214,144, 77,154,193,235, 62, 31, 79, 4, +195, 18,226, 77, 15,126, 37, 52, 42, 37, 75,146,164,178,198,117,248, 62,185, 68, 16,196, 88,119,119,119, 28, 57,114, 4, 26,205, +187,225,194,172,173,173,145,152,152,248, 70, 85,227,112, 16, 20, 20,196, 33, 8, 98, 44,128,185,245,219, 36,155,222,121,148,225, + 92,179, 31, 54,192,143, 31,212,153, 44,200, 45,168,100, 1, 16, 75,150, 44,209, 19, 55, 0,248,254,251,239, 77, 73, 39, 72, 30, + 15,210, 91,183,222, 84,196, 92, 18, 36,159, 0,193, 3, 72,110,149, 23, 21, 44,192,210, 0,163, 3, 24, 45, 32,114,243, 48, 37, + 27, 2,155, 52,243,142, 94,187,113,187,173, 90,203,226,200,153,235, 72, 79,127, 5, 14, 73,194,171,149, 55, 6,246,238,201,235, +220, 53,216,227,199, 21,243,207,229,102,189, 24, 2,224, 97,163, 51,154, 97, 69,173,154, 57, 98,247,158,199,112,178,179,196,216, + 17, 31, 64, 44, 18,226,135,159,127,195,234, 69, 51,225,237,229,137,157,155,215, 52,120,185,141,141,205, 74, 95,239, 86,158,219, +247,159,135,175,143, 15,103,251,129,243,240,109, 87,189,245,243,229,108, 63,112, 30,237,252,218,113,182, 31, 56,143, 0,191,182, +205, 99,242, 30,172, 44, 41, 41,153,217,112,126,214, 41,163,129, 85,101,196,171, 96,244, 13, 65,198, 23, 95, 0,128,158,104, 53, + 6, 60, 30,175,105,110,110,174,179,177,243,140,169, 6,213, 74, 86,140, 78,167, 67, 97, 97, 33, 81, 86, 86,198,218,218,218,142, +184,180,115,241,169, 65, 61, 58,148, 0, 64, 92, 92,156,125, 68,196,218, 17, 71, 99,100, 80,222,223, 74,252,251,236, 45,102,226, +240,208,152, 51,145, 83, 59,163,122, 73,136,186, 80,171,213,233, 29, 59,118,100,171,191, 55, 17, 10,133,252, 58,207,155,123,235, +214,173,223, 81,173, 77,112, 41,254,116,239,222,189,153,237,218,181,131,143,143,207,221,110,221,186, 89, 75, 36, 18, 92,186,116, + 9,190,190,190,126,214,214,214, 15,162,162,162,120, 11, 23, 46,236,176,119,239, 94, 0,152,101, 66,118,246,239,211,167,207,145, +232,232,104, 17,159,207,135, 82,169, 68, 98, 98, 34,108,108,108, 32, 16, 8,240,225,135, 31,114,186,119,239,238,208,187,119,239, + 19, 41, 41, 41,227,209,136, 25, 80, 42,149,138, 93,188,120, 49, 44, 44, 44, 96, 97, 97, 1,137, 68, 2,137, 68, 2, 75, 17,136, + 29,115,154,137,103,239, 42, 19,207, 93,190, 35,242,192,246, 21, 55, 61, 60,152,239,178,179,179,203, 26,251, 44, 40,111,223,134, +101, 92, 28, 80,235,221, 53, 21, 54, 18,123,132,135,135, 27, 83,164,192,231,243, 17, 18, 18, 98,212,158,189,189,253, 73, 46,151, +251, 86,207, 84,167,211,137,194,195,195,233,148,148, 20, 9, 73,146, 18,134, 97, 16, 30, 30, 78,235,116, 58,145,179,179,243, 93, +134, 97, 10,138,138,138, 70,153,144, 92, 53,128,111, 72,146,252, 73, 40, 20,114,155, 55,111,158,185,108,217,178,123,213,106, 38, + 88,150, 37,155, 55,111, 30, 40, 22,139, 61,213,106,181, 14, 85,174, 67,179,154,101, 70,189, 96, 89,182,115,149, 40,172,135, 6, +128,160,250,123,113, 85,107, 7,199, 58,191, 3, 64, 81,117, 71,209,165,129,253, 98, 0, 73, 0,218, 2,112,174, 62,246,136, 32, +136,146,247, 72,102,195,138, 86,116,116,180,190, 11, 27, 22, 22,166,111, 88,172,172,172,240,232,209, 35, 16, 4, 1, 43, 43, 43, + 88, 91, 91,195,198,198, 6, 50,153, 12, 73, 73, 73,120,246,236, 25, 50, 50, 50, 64, 16, 4,188,188,188, 80,243, 2,213,130,190, +130, 59,180, 33, 26, 34, 75, 33, 8, 2,232,212, 55, 0, 1,189,252,209,245, 97,218,156,152,107,196,174,188,188,188, 84, 0, 92, +127,127,255,105, 65, 65, 65,216,184,113, 35,212,106,245,198, 6, 72,150,222,230, 31, 73,186, 46, 0,224,230,230,182,224,224,165, +151, 22,147, 6,183, 82,228,229,229,173,127,143,204,121,171, 34, 46, 42, 42, 50,121, 45, 62,134, 97, 80, 90, 90,106,208,102, 93, +133, 96,211, 79, 91,109,229,229, 5, 88,245,195, 65,104,181, 90,204,159, 63, 31, 12,195,232, 63,101,101,101, 38,165,147,165,233, +119,181, 3,178,202,123, 74,112,129,102,227,170,120, 69,214,145,173, 32, 88,128,160, 1,188,123, 95,117, 27, 33, 17,135, 47, 62, +186,226,135, 45,182,177,207, 94,227,204,245, 88, 80,178, 28,228,197,157,170,146, 28, 67,198,227,152,154,131,110, 1,173,240,245, +146, 31,237,150,126, 61,249,168, 70, 41,247,193,219,110,196,107,198, 95, 26, 26,171, 86,174,196,174, 45, 27,241,227,198, 45,144, +149,151,129,199,115,172,174,232,105,208, 52,109,248,222, 89,118,112,248,156, 79,136, 31,126, 57,137,192,118,110, 56,113,233, 33, +122,116,244,196,169, 43, 49,232,213,185, 5,206, 92,139, 69,223,110,173,112,225, 86, 2,190,158, 49,158, 24,127,121,239,224,198, +148,209,230,205, 91,109,229,178, 2, 68,175,217,143,194,109,219,144, 57,115, 38, 2,171,207,121, 72, 16,224, 55,109, 10,240,141, +151, 81, 93, 36, 39, 39, 67,173, 86,215,215,219,135,175,175,175,209,114, 87, 42,149,143,117, 58, 29, 91, 80, 80, 64, 20, 20, 20, + 64, 34,145, 16,137,137, 9,180,159,159,255, 72,246,217,241, 95, 1, 32, 34, 98,237,200, 99,143,101, 80,220,221, 2,229,189,159, +193,111, 17, 79,238,250,126, 6,245,249,242,157,143,107,189,163,111,165, 51, 63, 63,127, 72,126,126, 62, 0,160,101,203,150,207, + 82, 82, 82,218,214,184,154,171, 93,136,124,157, 78,231, 93,227, 78,212,233,116, 80,171,213,232,223,191, 63,199,208,189,219,217, +217, 5,249,250,250, 34, 54, 54, 22, 91,182,108,177,239,211,167, 15, 94,188,120, 1,130, 32,176,118,237, 90,162, 93,187,118,188, +162,162, 34, 12, 26, 52, 8, 39, 79,158, 12,145,201,100,198,242,211, 74, 34,145,236, 61,119,238,156,136, 36, 73,200,229,114, 48, + 12,131,238,221,187,131, 36, 73, 36, 36, 36, 96,201,146, 37, 56,121,242, 36, 78,159, 62, 45,238,220,185,243, 94,133, 66,225,139, +183,221,250, 13,149, 17,171, 82,169, 88,161, 80, 8,161, 80, 8,145, 72, 4,145, 72, 4,129, 64,128, 10, 21,240,249,166, 76, 53, + 71,228,200,248,117,236,209,234,147,217,107,201,245,203, 62,189, 1,224,140,169,207, 60, 80, 53, 38,235,167,223,126,219, 50,177, +188,156, 4,128,221, 4,193, 80, 44,251,163, 41,239, 59, 0, 84,168,202,225,233,213, 20, 39,142,158,198,232,113, 35,234, 37, 89, + 60, 30, 31,124, 30, 15,214,246, 18,163, 54,249,124,190,203,179,103,207, 28,120, 60, 30, 88,150, 5, 77,211,160, 40,170, 96,233, +210,165, 78, 67,135, 14,181,186,120,241, 34, 57,116,232, 80,198,206,206,174,242,225,195,135,133, 58,157,206,161,103,207,158,141, +121,230,183, 7, 4, 4,116, 58,117,234,212,167,225,225,225, 49, 11, 22, 44, 88, 85,251,224,186,117,235, 86, 94,184,112,193,115, +228,200,145, 7,226,226,226,182, 55,166, 14,249,171,245,188,217,230,127,158,205,134,184, 72, 53, 92, 8,130,136,174, 85,103,135, +213,236,135,135,135, 47,142,136,136, 72, 36, 8, 34,186,246,239, 53,231, 85,119, 22,163,235,219,175,190,214,126,209,162, 69,254, +145,145,145,107,131,131,131,143,220,189,123,247, 21,128,198, 18, 45,195, 99,180,106,110,168,246, 77,214,105,212, 32,147,201, 32, +147,201,144,157,157,141, 29, 59,118, 84,191,208, 60,112,185, 92,112,185, 92,253,120,134,134,112, 61,250,207,159, 1,252,220,169, + 83, 39,222,211,123, 81, 23,191,221, 53,187, 95,151,254,157, 56,143,175, 63, 29,131,170,245, 8,135, 76,153, 50,197, 17, 0,246, +239,223, 95, 4,224,226,255, 18,107,142, 74, 77, 77,253,218,205,205, 77, 63, 70,165,182,251, 80,167,211, 65, 36, 18,161,102, 44, +139, 74,165,194,142, 29, 59,116, 44,203, 70, 25,176,137,148,196, 27, 72, 77,188, 89,117, 29,195,128,161,223, 92,191, 98,197, 10, +176, 44,171,111,236,191,168, 86, 78,140,146,188,250,242,156,173,179,173,243, 59, 75,211, 70,220, 19,252,217, 99, 38,207,116, 99, + 8, 46,206,222,120, 2, 30,143, 7,166,150,154,201,227, 84,245,150, 19, 95,228,194,221,197, 15,195,199,207,112, 61,117, 96,235, +108, 29,165,250,161,177,121,237, 19, 16,140, 57, 95,127,141, 95,119,237,194,146,229, 43,245, 12, 64, 71,211,208, 25, 77, 39, 73, +246,239,238, 15, 93, 69, 46, 56, 28, 14,250, 6,182, 2,135,195,193,128,224, 54,224,112, 56, 24,212,221, 7, 92, 46, 23,131,123, +180, 67,235,214,173,193,229,114, 73, 35,229,142,148,196,235, 72, 77,252,189, 22,233,101,193, 2,160,242,242,222, 57, 95,155,151, + 7,182,153, 67, 99,159, 45, 76,155, 54,173, 44, 59, 59,155,170,123,204,195,195,131,127,251,246,109,219, 6,220,118,122,136,197, +226,206, 92, 46,247,113, 73, 73, 9, 99, 97, 97, 65, 50, 12,205,248,249,249,115, 46,237, 92,124,170,230,156, 69,139, 22,159,250, +168,179,245,200,131, 81,209, 44,191,121, 15,130,224, 9,117,159, 45,223,201,231,241,197,157, 1,165, 41,157, 7, 82,173, 86,227, +249,243,231, 48,150, 30,150,101, 13,186,126, 74, 75, 75,167,248,250,250,222,254,249,231,159,237, 9,130,192, 31,127,252, 1, 14, +135,163,255,164,165,165,129, 36, 73,124,251,237,183,148, 76, 38,155,110, 44,109, 92, 46,247,235, 19, 39, 78,216, 8, 4, 2,200, +229,114,253,123,195,225,112,240,236,217, 51,172, 95,191, 30, 83,166, 76, 65, 86, 86, 22,220,221,221, 49,127,254,124,203,200,200, +200,175, 41,138, 90,105, 66, 17,197,107, 52,154, 46, 22, 22, 22, 16,137, 68,168, 33, 92, 0,112, 37,145,151,160, 84, 42,219, 59, + 56, 40, 92,157,110, 69,159, 13,233, 51,188,131,131,147, 91,112, 94, 94, 94,163,150,206,122, 9,236, 74,167,233,165, 67, 78,157, +114,190,115,234, 20,115,255,220,185,215, 66,185,124,167,201,207,144,150, 68,102,218,107,116,238,220, 25,143, 31, 63, 70,231,206, +157,107,147, 38, 8, 4, 2,240,249,124,240,249,124, 56,218,153, 52,132,130, 37, 73, 18,119,238,220, 1, 77,211,208,104, 52,208, +104, 52,104,215,174, 93,201,205,155, 55, 45, 1, 32, 45, 45,141,157, 52,105, 82,217,131, 7, 15,208,177,163,225,245,212, 93, 92, + 92,110,115, 56,156,230,181,127, 43, 46, 46,182, 27, 53,106, 20, 74, 75, 75, 63, 24, 53,106, 84,143,234,247, 55,231,248,241,227, +147, 0, 64, 32, 16,128, 36, 73, 26,102,252,227, 97,140,139,212, 38, 74,117, 9, 87, 68, 68, 68, 88,221,223,106,147,170,250,190, +215,190, 54, 50, 50,114,109, 45,219,202,247, 72,190,241, 49, 90,209,209,209,108, 61, 12,210,100, 24, 35, 90, 53,136,141,141,213, +186,187,187,255,154,250, 36,163, 95,171, 0, 47,136, 37,194,129, 0,126, 22, 10,133,243, 38, 79,158,140,251,247,239, 35, 33, 33, + 97, 15,254,226, 44, 28,127,127,255,203, 66,161,208,179, 1, 55, 73,102, 66, 66,194,160, 6, 26,134,229,231,206,157,131,161,193, +240, 55,110,220,168,221, 40,213, 30, 12, 95,255,131,193,176,208, 82, 90, 84, 42,148,111, 26,241,106,162, 85, 89, 89,137,113,227, +198,189,165,104, 21, 22, 22, 26,189, 63,130, 32,176,254,204, 25, 92,141,138,194, 7, 29, 58,224,228,195,135,136,156, 60, 1, 62, +158, 77,192,210, 4, 88, 2,200, 58,188, 21,197,178, 10, 28,186,126, 7, 37,114, 5, 38,246,236, 9,111,107, 71,195,118,121,252, + 1,129, 65,193,252,107,119,147,192,227,113, 65,130, 1,171, 85,192,221,183, 55, 56, 36, 9, 27,151, 22,224,243,120,224,241,184, + 72,203, 46,130,175,127, 87, 65,180, 64, 52,224,125,136,150,135,103, 11,208, 52,141, 41, 83,166,224,200,145, 35,112,112,245,132, +141,135, 63, 86,111,220,133, 15,250,247, 52,122,255, 53, 61,120, 46,151, 11, 14,135,243,206,182,230,187, 41,234, 36,203,176,160, +234,150, 17,195, 2, 44,139,166,107,214,160,233,154, 53,120, 88,253,159,237, 42, 43,161, 84, 42,129,110,126,141, 34, 89, 26,141, + 6,217,217,217, 84,126,126,190, 75, 61,199, 11, 52, 26,141, 81, 98,179,111,223,190,248,169, 83,167,118,177,183,183,143,137,143, +139,211, 6,116,232,192,187,184, 99,241,233, 26,183, 33, 0,116,232,208,161,100,241,226,197,167, 39,141, 13, 27,177, 61,252, 99, +250,203,149, 7,184, 66,177,184, 75,216,130,125,241,135,199,142, 53,238,239, 81,171,211, 3, 2, 2, 88, 83,238, 75,161, 80,228, + 27, 56, 60, 12,192,247,157, 58,117,178,238,211,167, 15,110,223,190,141,209,163, 71,171, 41,138, 74, 5,128,161, 67,135,182, 57, +116,232,144, 32, 41, 41, 9, 78, 78, 78,188,204,204,204,189, 48, 50, 64, 94, 32, 16,244,238,218,181, 43,169, 86,171,223, 33, 89, +145,145,145, 24, 63,126, 60,218,180,105, 3,134, 97, 80, 81, 81,129, 62,125,250,240,182,108,217,210,219, 68,162, 53,199,199,199, +103, 61,170,102, 29,214,174, 11,147, 81,229,214, 66,113,113,113,254,147, 7,215, 19,123,246, 31,213,165,121,107,127,183,132,248, +199, 6, 13, 58, 59, 59, 47, 34, 73,242, 35,134, 97, 56, 50,153, 44,251,137, 70,211,186,157,167,167, 75,247, 17, 35, 80,206,227, +113,126,186,126,157, 44,144,203, 45, 1,152,228,130, 84,105, 43,225,233, 85, 53,212,111,244,184, 17,120,252,248, 49,198,124, 60, + 18,124, 62, 31, 92, 46,175,234,221,228, 87, 41, 90,182,142,214, 38, 61,155, 90,173, 86, 95,135,215,140,243,162, 40, 10, 53, 67, +179, 44, 44, 44,244,199,212,106, 53, 8,130, 48,244,108,120, 31, 91,185,204, 89,108,109, 3, 90,171,133,223,136, 49,250,103,250, +193,238,237, 98, 48,140,184, 44, 51, 29,179,162,206,241, 96,134, 25, 13,168, 90,134,184, 72,109,162,244, 87, 65, 16, 68,116,120, +120,248, 98, 0,108,120,120,248,226,154,253,136,136, 8, 37,128,156,247, 36, 91,239,168, 92,220,191,131,100,213,184, 23, 12,161, + 79,159, 62,179,172,172,172,182,212,236,103,223,207, 65,246,253, 28,248,182,245,235,222,169, 67,151,242,241,227,199,195,193,193, + 1, 11, 22, 44, 96, 1,236,105,236,255,167,165, 36, 90, 2, 96,221,220,220, 22, 84, 87,200, 29, 30, 62,124,232,244,232,209, 35, +116,237,218,245,141,116, 79, 81,232,209,163,135, 33, 83,242,234, 65,237,115,255, 62,149,140, 1, 69, 81, 80, 40,148,208,104, 40, +232,180, 12,116, 58, 29, 58,251, 89,225,192,174,240,170,223,116, 53,234, 89,149,106,214,212,213, 10, 86,150, 60, 45, 73, 18,202, +152,248,252,122,107, 76,141, 70,131,248,204, 76,196,101,100, 0, 0,134, 71, 24, 30,248,122,224,250,109,180,107,215,206, 88,106, + 91, 53,117,119, 69,238,213,248,170,202, 91,153,141, 71,127, 30,131,149,149, 37, 0,192, 47,116, 34,248,252, 42,162, 85,169,164, +224,216,214, 3, 4,203, 54, 24, 22,192,194,206,245, 50,151, 47,242,100,105, 6, 44,203,128,101,104,176, 44, 3, 14,143,111, 49, +235,139, 79,193, 48, 52, 2, 3, 3, 65,112, 56,160,181,106,140, 29, 54, 0,165,229,114, 56,216,154,214, 72,240,249,124,132,134, +134,138, 27, 58,254,226,197, 11,101,109, 98,102,184,140,180,168,172, 84, 66,173, 86,131,210,232, 64,105,117,160, 91,242,177,106, +233, 4,232, 40, 29, 20, 31, 7,131,210,234,192,124, 61, 18,148, 70,139, 44, 11,146, 12,240,117,212,146, 32,148, 79,146,165,214, +198,136, 86, 13, 57,104, 8,245,141, 9,108,128,108,197, 77,157, 58,181,115, 64,135, 14,143, 63,234,223, 97,195,211,132,196,220, +167, 9,137,239,156,231,217,166, 67,250,151,145, 71,230,243,248,226,206, 97, 11, 12,207, 58,172,141,218,110,196,191,136,197,114, +185, 60,192,210,210, 18, 41, 41, 41,224,112, 56, 32, 8,226, 5,128, 0, 0,112,115,115,123,201,229,114,189, 56, 28, 14,182,109, +219, 70,112,185,220,246,193,193,193,139, 85, 42,213, 49, 3, 29, 58, 95, 43, 43,171,183,212, 44, 62,159,143,240,240,112, 76,154, + 52, 73, 79,178,248,124, 62,246,237,219,135, 46, 93,186, 64,163,209,248,154,152,222, 71, 0,122,154,160,248, 17,213,228,220, 40, + 25,213,233,116, 83,139, 63,250,168, 53,110,221, 66,119, 47,175,118,157, 59,119, 6, 69,189, 17, 52,189,188,188, 60,228,114,121, +190, 82,169,252, 55,170, 66, 27, 60, 49, 72,138, 84, 12, 50,211,170,134,159, 62,126,252, 24,129,129,129,122, 5,171,182,154,197, +231,243, 33, 22, 88, 54,138,104, 49, 76, 85,189, 36,151,203,201, 91,183,110, 57,250,248,248, 16, 0,224,227,227, 67, 60,121,242, +196,222,194,194,162,168, 85,171, 86, 70, 59,192, 98,107, 27,236,155, 58, 14, 0,240, 93,255,193,250,142,209,165,239, 23,131,199, +227,161,223,130,197,239, 60,247, 12,195,112, 96,134,153,100,153,192, 69,254, 46,146, 85, 87,209,138,136,136, 72,140,136,136,120, + 71, 29,107, 36,140, 43, 90,181,165,187,198,162,230,101,109, 8, 27, 55,110, 68,251,246,237, 13, 54, 68, 91,182,108,193,193,131, + 7, 55, 2, 72,107,180,228,216,175,147, 31, 54,157, 74,244,106,227, 71, 0,192,202,175,135,145,149,149,149,184,115,231, 14,108, +108,108,240,226,133,201, 97,191,172,108,108,108,190, 39, 73,114, 44,167,238, 12,128,250, 9, 38,205, 48, 76, 84,121,121,121,131, +225, 29, 88, 22,160,180, 58, 84, 42, 84,208,104, 52,248,250,219,173, 70, 19, 17, 1, 16,148, 70,206, 13,237, 21, 44,110, 72,209, + 9,108,223, 27, 95, 77,182,124,167,241,230,144, 0, 73, 2, 29, 3,171, 20,151, 39, 15, 19,193, 48, 0,205, 0,142,206,118,216, +115,120,131, 65,146,175,163,153,234,222, 49,141, 10, 53, 13,223,160, 48,188, 78,190,165, 87,144, 4,252, 42,151, 49,159,199, 3, +195, 18, 85, 81, 31, 26, 34, 66, 2,177,103,105, 94,154,247,174,232,167,248, 60,172, 61,142, 95,139,199,152,254, 1,184,249, 32, + 9,125,186,181, 67, 98,106, 6,252,188,155, 99,219,222, 40,176, 44,228,191,108, 90,157,255,166, 65,211,101,154,162,104,221,191, +127, 95, 89, 87,197,170,189,101,141,183,135, 96,217, 55,138,150, 82,165,198,130, 69, 38,133,243,169, 42,163,158, 65, 98, 83, 78, + 54,164, 88,153, 66,196,234, 42, 91, 48, 18,158,165, 37,128, 46,192,194,255,205,138,147,166,105,156, 63,127, 94, 95, 30,245,149, + 99,237,178, 51,129,228, 32, 51, 51, 19,137,137,137, 8, 10, 10, 66,121,121, 57,120, 36,137,249, 79,159,162,221,228,201,208,240, +249, 96, 24, 6, 2,129, 0, 51,102,204, 48, 57, 63, 27, 89, 59, 87, 15,230,166,141, 25,223, 16, 28, 28,220, 58,165,178, 18,137, +207,158,161,255,138, 21, 0,128, 11, 23, 46,188,245, 76,204,155, 55, 79,144,148,148, 52, 45, 38, 38,102, 90,110,110,238, 70, 0, +243, 27,172,103, 89,181,126,140,214, 71, 19, 70,163,181, 79, 75, 28,252,237,176,254,248,188,111,230,128,199,227,131,199,231,193, +214,198,214,164,187,209,106,181,122,210,170, 80, 40,200, 11, 23, 46, 52, 29, 48, 96, 0,127,206,156, 57, 4, 0, 28, 60,120,144, +252,249,231,159, 37, 87,175, 94,229, 55,105,210, 36,207, 40,185,164,168,119,202,152, 32, 8,240,120, 60,240, 5,124,128, 97, 64, + 16,132,100,221,186,117, 43, 19, 19, 19,187,250,248,248, 64,173, 86, 79, 70,213, 68, 13,115, 28, 45, 51,217, 50,200, 69,234, 27, +107, 85,173, 74, 53, 4,105,237,113, 91, 13, 17,181,218, 99,182,240,126,147, 50, 76, 27,163, 85, 31, 56, 28,142, 81,181,138, 36, + 73,163,174,195,121,243,230,193,202,202,170,161, 6,136,125,250,244,105, 82, 94, 94,222, 46, 0, 91,223,171,112,174,199, 38,126, + 63,119,164, 28,213,190, 85, 91, 91,219,162,190,125,251, 86, 0,160,142, 29,123,187,131,172, 86,171, 27,108,192,109,108,108,190, +223,189,123,247,236, 17, 35, 70,144,117, 67, 12,212,118,239,213,124,180, 90, 45,142, 29, 59, 54,123,225,194,133, 40, 47, 47,159, +107,168, 17, 87, 84, 42,161,172, 30, 8,253, 50,225,184,169,149,122,131,135, 44,109,221,208,180,101, 64,131,141, 9,201,175, 26, + 67,228,210,236, 77, 3,102,101, 37, 2,109,192, 38, 65,144,105, 25, 89,185, 77, 60, 92,237,241, 50, 91, 10,151,230,237, 81,154, +243, 38, 31,184, 92, 14,120,213,174, 67, 91,107, 9,164,133,133, 32, 73,142, 65, 98,188,250, 80, 44, 30, 36,100,224,196,181, 39, +160, 84,149,216,180,255, 18, 40,117, 5, 40, 85, 37, 40, 85,213,118,237,194,207, 64, 16,200,215,170, 43,219, 52,166,220,185, 92, + 46,186,117,235,214, 32,209,201,201,201, 49, 81,209, 98,245,138,150, 82,213,200, 50, 50,173,231,100, 80,177,170, 57,254,190,196, +160, 38,228,131, 88, 44,238,178,111, 95,195, 97, 28,234,131,171,171,235, 69, 75, 75,203, 22,166,158,223,136,224,165,107,109,109, +109,191,247,241,241,241,221,180,105, 19,143,195,225,160, 95,191,126,109, 92, 93, 93, 51, 1,192,207,207,207,189,166,142,249,242, +203, 47,217,251,247,239, 39, 84,245, 49, 26,134, 64, 32,120,102, 99, 99,211,165, 79,159, 62, 40, 47, 47, 71,118,118, 54, 36, 18, + 9,218,109,216,128,167, 95,126,137, 14, 59,118,128,236,219, 23, 4, 65, 64, 32, 16,224,233,211,167, 16,139,197,207, 84,170, 6, + 67,190,117, 3,240, 35,128,238,120,227, 46,100, 1,220, 65, 85,216,133, 7,245,212,119, 36, 0,208, 12, 99,172,176, 38, 44, 88, +176, 0,101, 60, 30, 48,116, 40,248,105,105,160, 40, 10, 65, 65, 65,122,149, 61, 40, 40, 8, 92, 46, 23, 1, 1, 1,112,119,119, +199,182,109,219, 38, 24, 34, 90,170, 10, 10,153,105,175, 17, 28, 28,172, 87,174,134, 14, 29,170, 87,180,120, 60,158, 94,217, 34, +104,227,196,149, 32, 8,182,118, 39,153,166,105,130,203,229,114,231,206,157, 75,140, 15,140, 57,212, 0, 0, 32, 0, 73, 68, 65, + 84, 30, 61,154,213,104, 52,140, 64, 32, 32, 79,156, 56, 65,220,188,121,147, 91, 89, 89,105,180, 35,238, 63,114, 44,190, 27, 48, +164,234,221,111,225, 4, 30,159, 7, 1,159,143, 5,207, 94,235,203,197,122,223, 17, 65,100,100,228, 24, 31, 31,159, 42, 55, 60, +192, 53,199,209, 50,195,136,208, 35,173, 67,146, 52,181,246,165, 0,136,234,125,105, 45, 66, 37, 37, 8,226, 17,203,178, 93,235, +156, 91,115, 92, 83,103, 91,115, 60,238, 61,146, 95,179,214,225, 59,228,203, 80,143, 56,245,222,189,123,222,157, 59,119, 70, 86, + 86,214, 59, 51,225,106, 26, 46,137, 68, 2,177, 88,140,187,119,239, 2, 64,106, 67,198,110,222,188,249, 51,170,162, 46, 87,165, +200,205, 45,184,207, 71,189,239, 6, 14,238,138, 67, 17,135,203,243,242,242, 2,240, 38,134, 14,225,238,238, 62,137, 39,224,142, +243,242,111, 22, 10,134,249,241,250,185, 59, 43, 12,221,161, 87, 27,191, 10, 0,202,154, 89,135,239, 57,251, 16, 36, 73,142, 29, + 49, 98, 4,153,148,148,132,113,227,198,225,224,193,131, 13,158, 59,105,210, 36, 28, 57,114, 4, 35, 70,140, 32, 23, 45, 90,212, + 96,120,135,183,213, 18,205,223,246, 80,166,188,136,195,129, 35,187, 27, 28,131,228,236, 92, 53, 30,171,176,176, 72,255, 91,215, +206,134, 61, 35,140, 78,115, 53, 54,230, 97,112, 72,175,126,252,236,130, 50, 48, 58, 53, 84,242, 55,215, 43,202, 10,192,234, 84, +224, 91,216,195,213,209, 6,143,239, 93,209, 80, 26,213, 85, 67, 54,103,143,240,195,151,195,124, 1,150,193,200,249,123, 16,189, +117,150,190, 7,221, 99,244, 28, 92, 63,246,147,201, 99,252,234,130,199,227,225,233,211,167,202,134,212, 44, 14,135, 99, 74, 76, +174,106,213, 81, 11,133, 66, 9,133, 82,245,119,214, 29, 78, 46, 46, 46,191,216,217,217,137, 26, 32, 82, 78, 78, 78, 78,191, 56, + 56, 56,136, 76,117, 29, 54, 68,178,170,227,106,197, 76,157, 58,181, 81,100, 75, 40, 20,182, 72, 77, 77,213, 7, 43, 53,180,213, +104, 52,232,211,167,143,169,193, 75,207, 1,120,229,230,230,118,167, 93,187,118, 54, 47, 95,190,196,225,195,135,249, 60, 30,175, + 89, 77,253, 33,151,203,193,225,112, 80, 88, 88,168, 5,240, 41,140,184,206,212,106,245,173, 91,183,110,117, 28, 54,108, 24,231, +217,179,103,224,112, 56, 85,233, 10, 14, 70,135, 29, 59,144, 48,119, 46, 66, 51, 50,160,162, 40,136, 68, 34, 92,190,124,153, 82, + 40, 20,183, 26,178, 39, 22,139,119,165,167,167,251,137, 68, 34, 80, 20, 5,134, 97, 64,146, 36,193,229,114,123,216,218,218,110, + 1,208,181, 78, 97, 57,119,232,218,167, 45,173,211,209,121, 89, 47,165,198, 50,160,184,184, 24,231,206,157, 67, 80, 80, 16, 66, + 67, 67,145,147,147,131,180,180, 52,124,240,193, 7,250,115,226,226,226, 16, 27, 27,139, 86,173, 90, 25, 87,244, 72, 45, 90,181, +109, 1, 62,159, 95,165, 16,241,248,213, 29, 31,158, 94,201,226,243,248,224,113,121, 16,137, 69, 38, 43, 90, 4, 65,128, 36, 73, + 16, 4, 1,177, 88, 92,211,201,102,154, 54,109,154, 87, 82, 82,226, 6,128, 35, 22,139, 65,211,180, 73,157,150,154, 54,162,134, +100,241, 5,124,189,178, 5, 0,101,101,101,170, 17, 35, 70,252, 91,173, 86,127,130,247, 91,161,196,140,127, 24, 8,130,120,244, +191,113,109, 35, 48,180,154, 88,189, 51, 40,222,208, 3,254, 65, 72, 72,200,142,241,227,199,247,219,188,121, 51, 44, 45, 45,145, +151,151,167,111, 16, 5, 2, 1, 60, 60, 60, 80, 82, 82,130,157, 59,119,226,245,235,215, 55, 0,204, 48, 53, 69,121,121,121,247, + 95, 60, 73, 45,238, 51, 38,196,193, 47,164,173,109,118,234,235,160,188,188,188,187,213, 36,107,207,248,121, 31,124,210,103, 84, + 32,248, 2, 30,178, 95,228,227,250,185, 59,255, 95, 10,147,195,225,112, 8,130,192,184,113,227, 76, 58,255,227,143, 63,198,173, + 91,183, 96,200,205,200,212, 40, 90, 10, 21, 42,149,127, 95,103,237,171, 89,147,240,213,172, 73,122, 50, 97,138,235, 5, 0,220, +221,143, 26, 32, 90,212,230,232,163, 59, 63,239, 20, 24,236,217,197,175, 5, 30,196, 60,193,161, 29,111, 68,134,189, 63,175,196, + 15,123,111,192,195,197, 14,148,186, 18, 23,143,255,154, 79,169, 21,155,223, 83,148,171, 34,183, 4, 1,150,101, 26,117,239, 53, +228,137,199,227,193,223,223,191, 65, 69,171,164,164, 68,105,172, 97,208,151,145, 70,139,138, 74, 37,148,138,191,141,104,117,232, +209,163,199,213,168,168, 40, 7,103,103,103,228,230,230,214, 37, 90, 29,186,119,239,126, 53, 42, 42,202,193,197,197, 5,217,217, +217, 38,135, 21,169,135,100, 65, 42,149, 18,165,165,165,140,157,157, 93,163,200, 22, 73,146, 80,171,213, 72, 78, 78, 54,245,111, + 77,158, 33,102, 99, 99,179,239,200,145, 35, 54, 69, 69, 69,224,112, 56, 72, 78, 78,126,107,214, 97,205,103,207,158, 61,252,145, + 35, 71,238, 46, 43, 43, 51, 56,173, 77,167,211,109,156, 52,105,210,180,156,156, 28, 59,103,103,103,228,229,229, 65, 32, 16,128, +101, 89, 16,125,250,160,231,171, 87,160,104, 26, 98,177, 24, 41, 41, 41,216,181,107, 87,101,117,168,152,122, 5, 50,130, 32,188, +249,124, 62, 38, 78,156,248,214,129,253,251,247, 99,120, 23, 78, 23, 39, 27,110,133, 14, 34,117,129,120,200, 69, 14,135, 67,116, +232,214,183, 77,183, 94, 67,253,159, 39, 60,120, 41, 45,120,109,172, 82,210,106, 52, 26,248,248,248,224,209,163, 71,184,118,237, + 26,250,246,237,139,208,208, 80,196,199,199,227,202,149, 43,136,141,141, 5, 65, 16,112,112,112,168, 25,126, 97,112, 12,134, 70, +161, 67, 97,110,241, 59,234, 85,221,125, 62,159, 15,181,146, 50,169,140,158, 61,123,134, 71,143, 30,233, 67,203,112, 56, 28,221, +228,201,147,193,178, 44,155,158,158, 14, 43, 43, 43,118,234,212,169, 52,151,203,213,229,228,152, 54, 62,184,134, 84,213,144, 44, + 46,159,247, 22, 65, 99, 24, 70, 30, 31, 31,255, 57,128,248,106, 37, 11, 48,199,209, 50,227,255, 54,206,227,221,133,165,141, 42, + 90,175, 0,244, 63,124,248,240,132,211,167, 79,111,220,178,101,139, 83, 88, 88, 24, 74, 75, 75,225,233,233, 9, 55, 55, 55, 68, + 71, 71,227,194,133, 11, 69, 52, 77,207, 7, 80,159,244,211, 31, 6, 98,214,228,188,204,139, 82, 87, 84,124,217, 57,212, 23, 55, +142,253, 17,225,234,234, 58,131,195,225,124, 61,117,241,135,159,244, 30,209, 21, 41,177,233,184,127,229, 41, 10,178,138,140,218, +172, 59, 24,222,214,214,118,154,133,133,133, 0, 0, 85, 79,175,184,238,172, 67,189, 77,154,166,105,141, 70,131,163, 71,143,154, + 68,182, 14, 31, 62, 12,149, 74, 5,250, 93,255,170,222, 38,203,176, 4,151, 39,132,187,135, 15, 40,170, 18, 12,243,222, 19, 42, +245, 54,107,122,160, 47, 5, 2, 56, 23, 21,225,193,131, 7,166, 81,238,161, 67,141,149,145, 74,163,146, 79,252,105,205,130,232, +153,225, 63,218,246, 13,233,136,239, 54,236, 7, 69,237, 5,201, 33, 33, 22,242,209, 57,176, 59, 56, 80,227,151,200,111,202, 20, +178,210,137,120,119, 41,158,183,108,178,134, 60, 44, 44, 64, 51, 12,174,221,126,104,242,189,235, 91,123,154, 6,151,203,197,139, + 23, 47,148,245,205, 54,228,112,170,220,156, 53, 61,117, 67, 54, 89,134, 33,120,124, 17, 60, 60,219, 65,163,174,248, 91,202,200, +217,217,249,155, 83,167, 78, 57,212,132, 74,136,143,143, 7, 65, 16,201,111, 20,199,170,227, 74,165, 18, 9, 9, 9,136,143,143, + 7,170,102,184,153,252, 30,213, 40, 89, 82,169,148,200,203,203,131,133,133, 5, 25, 31, 31,175, 14, 8, 8,136, 49,242,126,235, +109,170, 84,170,140,134,198, 79,170, 84,170, 38, 34,145,136, 87,167, 17,117,111,221,186,117, 74, 61, 46,196,119,210, 89, 94, 94, +254, 96,225,194,133,157, 7, 15, 30,140,111,190,249,166,196,206,206,206,234,151, 95,126,225,114, 56, 28, 98,230,204,153,116, 97, + 97, 97,197,175,191,254,106,115,250,244,105,148,149,149,221, 53,225,222,229, 42,149,234,243,144,144,144,253,151, 46, 93,178,240, +246,246,134, 76, 38, 3,203,178,216,183,111, 31,102,206,156, 9,145, 72,132,148,148, 20, 12, 31, 62, 92,161, 80, 40, 62,199,187, + 99, 39,107,108, 18, 4, 65,176, 12,195, 96,217,178,101,250,224,164, 53,193, 74,173,196, 4,118,205,107, 41,153,243,107,185,100, +194,119,191, 78, 6, 0, 90,167,163,159, 39, 60,120,185,111,235,119, 55,249,124,254,109, 35,101,180,100,206,156, 57,191, 12, 29, + 58, 84,108,105,105,137,146,146, 18,220,185,115, 7,247,238,221,195,253,251,247,161,209,104,224,224,224, 0, 59, 59, 59,228,229, +229,225,217,179,103, 74, 0, 75, 12,217, 20, 88,240,224,213,166,102,230,111,149,130,197,171, 53,219,176,182,186,197,231,241, 76, +122,143,122,245,234,133,110,221,186,213, 16, 32, 58, 51, 51, 51, 79,173, 86, 19,181, 72,127, 78, 13, 33,111,214,172,153,238,224, +193,131,172, 33,155,247,119,109,195,165, 85, 75, 32,224,243, 49, 63, 57, 91, 79,186,246,247,237, 4,158,128, 15,223, 97,163,107, + 95,187, 29, 85,238, 66,212, 33, 89,134,218,142,191,252,110,154,109,254,199,218,252,191,140, 60,188,199, 18, 60, 53, 56,164, 82, +169, 46,126,246,217,103,145, 29, 58,116,248,108,211,166, 77, 4,159,207,199,138, 21, 43,216,220,220,220,223,170,123, 33,165,239, +147, 42,150,101,127,251,253,228,221, 47,166,132,143, 32,230,109,158,218, 35,230,122,194,179,246, 33,222,104, 31,226,141,152, 27, + 73,216,186,248,240, 65, 90, 75, 47,203,207,207,207, 50, 98, 74,221,191,123,219,186,131,225, 29,110,221,188,238,208,216, 89,135, + 12,195, 68, 29, 62,124,120,246,168, 81,163,200,135, 15, 31,190, 51, 38,171,102,217, 29,134, 97,112,245,234, 85, 80, 20,133,223, +126,251,141, 97, 24,166,225, 56, 90, 96,207,252,180, 57,114,202,111, 7,206, 8, 4,124, 2,247,110,159, 64,121,169,225, 89, 93, +124, 62, 15,123,246,157,164,248,124,222,243,250,142, 83, 20,149,125,253,250,117,151, 65, 52,205, 35, 73,178, 62, 2, 85, 47,162, +162,162,180, 12,195,100, 26, 57,237,110,193,235,172, 97,171,191,249,244,240,208,143, 62,115, 9, 9,233,193,115,116,118, 1, 65, + 16, 40, 44, 40, 68, 74,194, 67,237,197, 19,187, 11, 42, 21,166, 45,193,243,233,250,223,245, 99,178, 0, 32,108,230, 22,253,248, + 44, 0, 24, 54,117, 33,250, 4,249,129, 48, 69,122,122, 67,178, 24,157, 78, 7,137, 68, 2,157, 78, 87,111,136, 7, 27, 27, 27, +177, 74,165, 82, 86, 7, 98, 52, 40, 21,177,192,223, 94, 70, 52, 77,251,150,150,150,162,178,178, 18,247,238,221, 99,215,172, 89, + 35,149, 74,165,250, 65,155, 90,173,214,183,164,164, 4, 21, 21, 21,184,123,247, 46, 27, 25, 25, 41, 45, 46, 46, 94,220,152,119, + 72, 44, 22,119,225,114,185, 49,165,165,165,140,133,133, 5,169,213,106,181, 1, 1, 1, 66,177, 88,108,242,130,234,121,121,121, +131, 27, 58,230,229,229,149,154,154,154,218,154,166,233,218,107, 32,242, 85, 42,149,119, 72, 72,136, 41,245,199,156,189,123,247, +226,228,201,147,129, 50,153,108, 82,102,102,230,126, 0,129, 92, 46, 23, 79,158, 60, 73, 86,169, 84,227, 71,141, 26,181,175,180, +180,244, 1,170,150,224, 49, 5,151, 82, 82, 82, 38,250,250,250,238,253,254,251,239, 45, 67, 67, 67,185,238,238,238,232,218,181, + 43, 82, 82, 82,112,254,252,121,237,246,237,219, 43, 21, 10,197,167, 0,174, 26, 46,118, 16, 58,157, 14, 2,129, 64,255, 17, 10, +133,224,243,249,144, 43, 89, 76,223,144,166,212, 65,172,220,184,226,243,243, 44, 64,228,103,167, 21, 21,230,103, 63, 32, 8,226, +118, 94, 94, 94,121, 3,121, 38, 80,169, 84, 29, 89,150,229, 16, 4,177,153,162,168,169,179,102,205,114, 91,187,118, 45,218,182, +109,139,162,162, 34, 72, 36, 18,120,123,123, 67, 42,149,226,225,195,135,180, 66,161,216, 1, 96, 37,170,199,143, 52,132,178, 34, + 25,154,186, 54,123, 75,249,100, 89, 22, 44, 13,104,213, 52,104,138,133,134,208,130,199,211,130,207,231,155,162, 60,177, 12,195, +160,212,205, 13, 76, 66, 2,238,223,191, 15,150,101, 27, 84,213,124,124,124, 76,168,216, 25, 8,132,130,183,220,133, 4, 65,128, + 47, 16,128, 39,224,215, 55,115,198,172, 98,153,241, 95, 13, 83,125,227,101, 0,102,196,197,197,237,239,221,187,119, 52,203,178, + 60, 84,249, 35,255,248, 43,127,158,159,159,255,248,238,249,199,139, 92,154,218, 69, 14,153,212, 3,109, 59,122,130,214,209,184, +115,225, 9,126, 91,123,250, 72, 78,118,206, 84,152,176,246, 25,195, 48, 55,187,119,105, 75,162, 86,172,110,119,119,119,230,125, +102, 29,150,151,151, 47,159, 63,127, 62,190,249,230,155,247,153,117, 88, 47,158, 62,147,206, 32,192, 54, 29, 54,164,231, 32, 16, + 36,171,209,168, 13, 84,124,208, 71, 46,229,243,121,207, 31,197,231, 5,212,119,158, 84, 42, 29,244,201, 39,159, 92,229,114,185, + 45, 26,147,231, 12,195,100, 22, 20, 20,244, 51,126,166,238,142, 90, 41,243, 62,119,100,231,220, 75, 39,247, 14, 98, 24,186, 21, + 1,128,195,229,191,212, 82,212,101,181, 82,182, 9, 38, 46, 42,189,110, 70, 48,230,252,116, 5,219,190, 25,134, 89,145,199,176, +123,217,116, 44,218,112, 24, 63,126, 51, 7,107,182,252, 27,223,205,153,136, 49, 19, 62, 97, 88,130,252,211,212,251,224,112, 56, +151,118,238,220, 57,101,250,244,233,250, 73, 11, 44,203,190, 85,177,107,181, 90, 37,195, 48,216,177, 99, 7, 3,224,146, 33,123, +111,151, 17,193, 26, 26, 47,101,106, 25,201,100,178, 79,131,131,131,247, 1, 16,178, 44,251,162,180,180,244, 95,192,155,165,161, + 42, 42, 42, 62, 13, 9, 9,217,199,178,172,144, 32,136,119,142,155,130,234, 80, 15, 93,236,236,236, 98,170,149, 44,225,251, 12, +136, 55,148,213, 6,220,138,166,184, 16, 25, 0,179,106, 69,124, 95, 27, 24, 24, 88,123, 81,233,228,210,210,210, 46,239,145,174, +171, 74,165,210,111,217,178,101,115, 69, 34, 81, 31,133, 66,209, 6, 0, 36, 18, 73,138, 90,173,190,169, 84, 42, 55,193,120,108, + 42, 13,195, 48, 41, 58,157,206,223,201,201,169,106, 70,109, 53,217, 2,128,179, 49,116, 12, 64,119,173, 18,197, 15,153,156,176, + 11, 23, 46, 52,183,179,179, 27, 72, 16,196, 24,150,101,125,228,114,185,122,217,178,101,119,163,162,162,202, 91,180,104, 49,100, +232,208,161,132,189,189, 61, 30, 61,122,196, 22, 23, 23,159, 0,176, 24, 38,204,180,102, 24, 38,115,221,186,117,104,236,251,110, +232, 56, 69, 81,249, 23, 46, 92,112, 28, 92, 88,200,101, 24, 6,195,134, 13,123,139,192,213,197,243,231,207,161, 86,171, 13, 6, +115, 84,151,151,162,239,220,133, 64,245,236,207, 26, 84, 41, 89, 44, 88,141,153, 87,153,241,207,194,255,244,130,158, 38, 73,139, +110,110,110,227, 68, 18,225, 87,158,109,220, 2,114,211, 10,147,228,229,138,131,121,121,121, 59, 27,168,200, 77,178,217,200,128, +165,102,249,247,127,200,230,155, 56, 90, 52, 88,150, 6,203,176, 96, 89, 6, 12, 67, 87, 45,120,205, 50, 96,105,154, 32, 8,252, +169, 81, 26,140, 12, 94, 55,157,118,142,142,142, 43, 89,150, 29,204,225,112,200,218, 98, 88,237,239,213, 74,214, 37,169, 84,250, + 93, 61,202,235,255,185,252,140,138,138,170,151,252,155, 58,235,112,236,216,177,116, 35,223,205,155, 18,137,196,173,190, 99,149, +149,149, 89,121,121,121, 3,255, 67,242,179,246,140,193,198,216,108,244,172, 67, 99, 54, 61, 61, 61,133, 20, 69,117, 2,224, 77, + 16,132, 45,128, 18,138,162, 46, 23, 21, 21, 21, 0,232, 2, 96, 89,245, 53,171, 0,196,252, 47,191,239, 98, 71, 71,199,189, 36, + 73, 54, 53,229, 98,157, 78,167, 41, 41, 41,153, 82,167, 67,160,183,233,224,224, 16,195,229,114,155,154, 96,231,117,113,113,113, + 23,115,253,105,182,249, 95,132,186,131,224, 27,140, 20,255, 63, 65,180,204, 54,205, 54,205, 54,205, 54,205, 54,205, 54,205, 54, +205, 54,255,219,137, 86,189,251,230,105,181,102,152, 97,134, 25,102,152, 97,134, 25,127, 13,231,235,144,173,243, 53, 95, 8, 3, +172,180, 49,146,224,251, 48,219,107,102,155,102,155,102,155,102,155,102,155,102,155,102,155,255, 56,155,102,252,141, 48,203,170, +102,155,102,155,102,155,102,155,102,155,102,155,102,155,255,237,104,208,117, 72,154,243,198, 12, 51,204, 48,195, 12, 51,204, 48, +227,127, 6, 38, 19, 45,137,139,143,175,163,103,192, 62,187,166,237,227,237,154,182,143,119,244, 12,216, 39,113,241,241,253,135, +230,155, 24,192, 4, 46,151,123,213,213,213, 85,134, 6,150,222,249, 47,128, 53,128, 49,168,138,239, 51, 18,128,197,223,105, 60, + 20,224,142, 3,190,154, 12,100, 77, 6,178,198, 1, 95,133,254, 23,142, 27, 92, 49,219, 45,248,246,197, 9, 23, 87,204,118, 11, +174,247,248,124, 55,135,251, 87,198,254,180,246, 43,119,251,191,233, 47,173,156,157,157,119,185,184,184,100, 56, 59, 59,103, 58, + 59, 59,239, 5, 96, 99,174,238,204, 48,195, 12, 51,254,199, 80, 51, 70,171,230,163, 31,163,197, 5,128,232,232,232, 80, 0,191, + 3,232, 29, 22, 22,118,171,238,213,118,205,252,167,183,106,217,234,155,213, 43, 22, 19,174,206,142, 22, 58,154,161,210, 51,178, +219, 45, 95, 29,121, 60, 87,192,221, 88,154,149,176,251, 61, 18, 69,112, 56,156,113, 66,161, 48, 12, 64, 13, 97, 75, 86,171,213, +209, 52, 77, 31,133,105,211,180,225,226,226,114,155,195,225, 52,111,204, 31,211, 52,157, 85, 80, 80,208,227, 61, 51,115,108,179, +102,205,246,134,134,134, 90, 4, 6, 6, 66, 32, 16, 96,217,178,101,243,243,242,242, 54,153,106,192,206,206,203,138, 18,138,190, +230, 10, 4, 3, 88,173,198,159, 5, 11,144,194, 4, 70,167,190,206, 87,171, 55,150,150,166,201, 77, 52,181, 24,192,212,234,188, +218, 13, 96,221, 95,121, 74,166,116,132, 86, 75, 87, 61, 19,124, 46,232, 51,175,108,126, 95,178,100, 9, 55, 44, 44, 12,187,119, +239,238,177,107,215,174,207,229,114,249,117, 0,103, 1,188,252,171, 79,165, 11, 48, 35,164, 71,143,159,166,204,159,207, 81,222, +190,141,159,246,238,221,140,170,120, 75,219, 26,251, 44,241,249, 24,227,232,200, 11, 99, 89,116, 34, 0,130, 0,158, 72,139,153, + 11, 20, 69, 31,133, 9,177,216, 12, 96, 2,222,158,142,127,168,177, 6,202, 95,178, 75,133,195,124,123,150,191,188,185, 20,192, +144,186,199,117, 42,209, 20,150,227, 17,166,100, 99,179, 1,108,248,139,217,106,225,228,228, 20,127,230,204,153,166,129,129,129, + 92, 0,136,137,137,153, 28, 22, 22,214, 87, 42,149,250, 3,144,253, 47, 85, 66, 34, 46, 73,126, 37,224,241, 6,208, 52,221, 30, + 0, 56, 28,206, 83,141, 86,123, 85,199, 48,219, 96, 98, 76, 54, 51,204, 48,227,191, 23,198,184,200,127, 56, 26,140, 12, 95,115, +115,108,237,109,109, 72,156,219,182, 11,234, 55,250,121,185, 92,161,202,200,200, 41,157,247,213,154,171,159,207, 89,127,122,195, +175,209, 23,110, 61, 72,190,239, 27, 56, 48, 73,226,220,182, 93, 3,166, 27,242,225, 54, 19,139,197,143,183,111,223, 78,165,164, +164,176,101,101,101,236,243,231,207,217, 19, 39, 78,176, 95,124,241,133, 74, 44, 22, 63, 6,208,204, 20,155, 46, 46, 46, 5,207, +111, 92, 97, 95,199,199,178,153, 49, 15, 88,173, 86,203, 82, 20,197, 82, 20,197, 38, 93,138,102,227,207,158,100,159,156, 56,202, +106, 52, 26, 86,163,209,176,106,181,154,109,217,178,101,174,137,233,172, 11,119, 63, 63, 63, 77,116,116, 52,123,252,248,113,118, +254,252,249,108,135, 14, 29,104, 0, 51, 77,189,119,137,179,119, 31,171, 38, 1,210,233,225,219,168,243,119, 47,179,137,175,158, +176,137,175, 82,217,168,107,201,236,212, 5, 91, 40,171, 38, 29,164, 18,103,239, 62,198,238,221,206,206, 46,136, 32, 8,182, 6, + 0,216,230,205,155, 87,212,254, 52,107,214,236,173,143,135,135, 71, 69,139, 22, 45, 94, 58, 56, 56,116,170,207,230,248,246, 96, +217,164, 67, 44,155,116,136, 93,210, 11,108, 98, 98,226,125,150,101,127,175,249, 40,149,202,223, 79,157, 58,245,251,135, 31,126, +248, 59,128,225, 6,242,201,164,252,156, 12,100,201,207,156, 97,217, 77,155, 88, 54, 52,148, 77, 6,216,201, 64, 86, 35,109,182, +116,117,229, 61, 89,191,238,115,205,153, 51,191,177, 23, 47,158,103, 47, 92,136,102, 79,159,218,203,110,222,244, 21,229,226,194, + 75, 0,208,186, 17, 54,185, 0,214, 0,216,136, 42,229, 50, 69, 42,149,178,249,249,249, 44,128,148,234,223, 54, 58, 57, 57,109, + 64,253,234, 91,255,218, 74,214,220,193,174, 23, 63, 26,210,131,149,151,231,178, 31, 13,233,193,206, 29,236,250,150,178, 53,216, +203,203,106,214,176,246,210,196,152,131,244,172, 97,237,165,131,189,188,172,222, 51, 63, 9, 84,173, 19,186,253,198,141, 27, 58, +182, 22,180, 90, 45,187,127,255,126,218,206,206,238,183, 70,216,108,227,228,228,148,105,111,111,159, 82,251, 71,167,128,145, 33, + 62, 61, 39, 47,119,104,247, 97,104, 35,210, 25, 40,226,243, 95, 95, 61,246, 11, 93,156,245,148,213, 40, 11,216,242, 23,177,236, +235,228,251,236,254,157, 27,181, 2, 46,247, 53,128,192,191,242, 44, 53, 18,102,155,102,155,102,155,255,129, 54, 13,113,145,255, +203,224,214,189,193,186, 16, 10, 5,225,203,151, 44, 36,202,138,203,148, 42,153, 92,163, 85,169, 84, 36,159, 85, 61, 77,122, 85, + 72,114, 57,101,115,231,204,182, 10, 95,180, 36,188, 18,152,104,226,127, 54,235,208,161,195,195,147, 39, 79, 58,219,219,219,163, +188,188, 28,197,197,197,120,248,240, 33, 88,150,197,168, 81,163,132,221,186,118,237,180,116,217,178,123,175,115,114,130,209,112, +195,251,134,188,216, 59, 98, 93,143,170,181,104,191,203, 40,174,106,117, 8, 2,187,198,134,233,207, 89,249,186,106,181, 12,145, + 72,164, 95,144,248, 61, 16,220,175, 95, 63, 62, 0, 76,155, 54, 77, 38,151,203, 35,170, 21, 14,147, 86, 90,149, 56,123,247,113, +116,115,143,254,101,199, 58,113,251, 86,222,160,180, 58,100,230,231,130,203,179, 69,211,166,124,124, 50,113, 0,175, 87,136,189, +227,154, 85,187,206,231, 51, 24,169, 40, 74,189,220,144, 45, 91, 91,219,253, 71,143, 30,197,177, 99,199, 0, 0, 41, 41, 41,240, +246,246,150, 24, 75, 67, 66, 66,130,215,240,225,195,143, 20, 23, 23,183, 54,118,110,221,192,248, 66,161, 16, 61,122,244, 64,187, +118,237,112,230,204,153,222,213,202,214, 95,130,242,246,109, 88,198,197, 1,183,222,171,243,210,178,115,103,207,251, 23,206, 31, +116, 60,127, 33, 25, 27, 54,236,197,203,151, 85, 66,155,151,151, 23, 38,140, 31,203,123,250,244,174,223,152, 49, 19,238,254,241, +199,203, 30,213, 68,201, 24,190,255,245,215, 95, 23,183,104,209, 2, 99,198,140, 25,235,231,231,231,106,109,109,141,157, 59,119, +194,205,205,205, 75,163,209,188, 56,115,230,140,123,126,126, 62,102,207,158,141,130,130,130,249, 13, 25,234, 61,168,247, 82,225, + 48,223,158,109, 59, 79,129,165,181, 27,126, 61,124, 20,207, 31,239,239,169,166,146,151,242,233, 91,147,148,172,112,170, 52,203, + 50,188,121,151, 80,135,214,126,195,225,217, 57,214, 81, 69,255,241,106,233,128,150,145, 92,145,106,255,138, 13,121,197,239, 24, + 29, 19,197,241,151, 61,179, 79,184,138, 98, 96, 5, 83, 67,176,244,106, 45,139,225,189,122,245,210, 23, 92, 70, 70, 6,212,106, + 53,124,125,125, 73,141, 70,211,199,196,124,109, 51,112,224,192, 63, 47, 92,184,224,208,166, 77, 27,105, 73, 73,137,254,128,171, +131,237,160, 91, 39, 55,207, 94,243,211,191,125, 14,176, 68,153, 52,249,244, 83, 35,182, 2,187, 7,117,190,118,241,228, 65, 75, +162, 34, 27, 2,219, 34,128, 41, 70,218,145, 61, 32, 44,236, 49,238,139,121,220, 62,253,250, 54, 25, 48,100,244,181,231,169, 47, +251, 1,120,100,238,215,155, 97,198, 63, 90,213, 98,255,219,238, 73, 79,180,194,194,194,136,250,110,144, 97,153, 0, 23,103, 7, +241,230,245,251, 30,113, 40,141, 70, 98,107,163,225,217, 88, 51,132,149, 13,135,210,104, 43, 60,189, 60, 5, 12,203, 4, 52, 96, +191,238, 20, 79, 66, 44, 22,159, 60,123,246,172, 51,143,199, 3,195, 48,112,114,114, 66,122,122, 58,202,202,202, 32,151,203,241, + 50, 57, 25, 45,154,121, 96, 69,248, 66,183,217, 11,195, 79, 42, 20,138, 46,120,219,141,248,206,180, 81, 90,251,246,186,209, 53, + 75,176,188,211,229,175,254,173,158, 99,166, 78, 69, 77,207,202,202,130,165,165, 37,252,253,253, 45,239,220,185,243,135, 1,146, +245,150, 77, 59, 59, 47, 43, 70, 40, 56,182,253,151,101, 98, 74,155,128,164,180, 18,180,109,209, 19, 46, 14,205,144, 91,162,193, +253,135,103,145, 16,127, 8,173,154, 52,195,204, 47,250,138, 34,215, 29, 63,202,215,181,104, 86, 86,150, 46,171,207,166, 76, 38, +179,108,217,178, 37,154, 53,171, 90,247,140,166,105, 36, 37, 37,129,166,105,253,126,237,237,190, 19, 55,160,147,101, 98,202,228, +201, 40, 46, 46,182,172,207, 38,143, 3,221,188,207, 39,112,197, 60, 64, 32,177,215, 84, 84, 84,232,151,225,160, 40, 10, 79,158, + 60, 65,112,112,112,104, 84, 84,148, 49, 86,100, 82,126, 82,192,143, 63,253,246,219,150,137,229,229, 36, 0,236, 38, 8,134, 98, +217, 31, 77,125,150,156,157,121, 39, 46, 93, 60,224,200, 33,159,193,222,230, 7, 60,124,152, 9,138,170, 74,111,113,113, 33,102, +125, 37, 3,159,103,133, 51,103,254,237,224,235,219,227, 68,126, 62,229,143,183,221,136,245,165, 83,116,241,226, 69,204,154, 53, + 11, 73, 73, 73,238, 28, 14, 7, 15, 30, 60,128, 88, 44,198,250,245,235, 57,190,190,190,238, 18,137, 4,151, 46, 93, 66, 65, 65, + 1, 97, 40,157,191, 95,254,125,117,249,203,155, 75,243,137, 75,131,127, 61,124, 20,159,141, 31, 7, 87, 54,237, 15,155, 86,196, +234,129,195,186,127,199,114, 60,194, 36, 86, 1,118,222,254,195,192, 23, 88, 98,230,183, 43,145,146,112,206, 78, 33,143,255,138, +160,179, 61, 86,108,136,154,243, 78, 58,143,143,165,167, 29,186,211,249,106,179, 71,158,113, 79, 62,127,144, 23,187, 43,254, 13, +209,242,226, 18, 36,109, 3, 84, 45,159,242,226,197, 11,188,124,249, 18, 92, 46, 23, 74,165, 18, 58,157,174,222,116,186,187,187, +207,208,233,116,223, 85,151,243, 62,145, 72,244,233,193,131, 7, 29,106, 19,109,167,128,145, 33, 14, 86,146,126, 5,133,197,165, +119, 31, 37, 62,159, 55, 99, 76,239,219,247, 19,178, 41,222,135, 89,229,241,103,202, 27,200, 79,145, 88, 32, 56,113,233,212,191, + 45,181,175,110, 64,226,219, 27, 60, 75,111,208,218, 28, 40, 74, 43, 33,127,153, 7,245, 47, 91,209,241,171,185, 56,119,250,184, +165, 95,251, 46, 81,106,173,214, 27,128,230, 61,222,205,198,192,108,211,108,211,108,243, 63,211,102,131, 92,132,101,217,206, 0, + 92,170,119,139,171,121,129, 35,128, 34, 84,173, 34,227, 82, 93,119, 8,106, 93, 86,119,191,246,185,117,247,107,127, 47,174,254, +238, 92,189,125, 68, 16, 68,137,145,164,187,161,106,105,194,243,213, 91,160,218,149,104,116,224, 49, 65,144, 50,154,102,132,124, + 39,103,213,180,143,250,181,191,114, 45,230,137,133,163, 53,119, 80,239, 78,161, 15,159,190,186, 71,144,132,150, 32, 72,147,198, +125,112, 56,156,113,155, 55,111,110,111,109,109, 13,134, 97, 96, 99, 99, 3,169, 84, 10,141, 70,131,242,242,114,168,229, 50, 80, +114, 25,226,178, 51,208, 61,180, 55, 70, 15, 30,232,251,239,211,103,199,209, 52,125,196,144, 93,247,128, 78,122, 37,107,101,115, +135, 55,210, 68,118,153,158,116,253,208,201, 27,124, 75, 75, 12,152, 23,254, 87,158,129,216,243,231,207, 95, 28, 53,106,212,144, + 5, 11, 22,144,121,121,121,151,210,211,211,187, 3, 72, 50, 74, 42,132,162,175,191,252, 58,204,206,206,146, 69,212,213,179,232, +213,105, 60, 44, 4, 28, 20,203, 40, 16, 4,144,156,120, 18, 4, 97,143,248,148, 60,244,236,104,141,129,131,124, 45, 79, 31, 79, + 94,128, 55,227,131,222, 41,154,210,210, 82, 20, 22, 22, 66,171,213, 66,171,213, 98,204,216,177, 56,176,127, 63, 42, 43, 43,161, + 84, 42,161,209,104, 64,211, 52, 72,146,196,213,232, 40,100,191, 74, 70, 72,112, 48,208,192,210, 75,251,159,128, 7,224,254,243, +231,207,145,156,156,140,215,175, 95, 67, 36, 18,193,213,213, 21, 43, 87,174,132, 90, 93,181, 70,217,216,177, 99, 67, 1, 60,253, +171, 47,212, 75, 96, 87, 58, 77, 47, 29,114,234,148,243,157, 83,167,152,251,231,206,189, 22,202,229, 59, 77,185,150,207,199,152, +117, 63,126,209, 86, 34,145,224,117,214,102,248,248,240, 49,127,174, 3, 34,126, 40, 2, 0,204,158,213, 20, 93,187, 56, 66, 86, +118, 28,142,206,139,177,101,203,156, 86, 83,167,110,156,172, 80,208,251,140,152, 94,122,246,236,217,209,222,222,222, 77, 98, 99, + 99, 9,129, 64, 0,177, 88, 12,177, 88, 12,145, 72,132,194,194, 66,164,167,167,179,235,214,173,203, 1,176,212,144,161, 21, 91, +242,238, 1, 24, 50,119, 48, 46, 62,127,188,191,103, 19,206,171,184,209, 51,123,100,196,223,143,149, 95,185,122,103,149, 78, 37, +202, 46,123,125,109, 97,203,174,177,142, 95,125,243, 61,182,174, 91,142,231, 15,110,151,184, 52,147,109, 19, 19,234,122,211, 25, + 26,186,130,235,230, 98,175,155, 49,117,180,237, 57,151,187, 51, 46,112, 9,105,126,209,227,245, 72,143, 85, 10, 91,119,154,212, +198,139,212,220,184,113, 67,220,171, 87, 47,168, 84, 42,189, 50,121,240,224, 65, 70,167,211,221,172,247,217,164,168,239,114,114, +114,220,148, 74, 37, 6, 15, 30, 60,123,253,250,245,146,154, 53,234,104,154,126, 75,201, 90,189,233,192,229,175,191,219,118,243, +242,145, 31,220, 87,135,127,218,123,226,204, 53, 55,209,192, 58,146, 92,146,252,234,220,169,189,174, 34, 59, 45,196,246, 3,161, + 42, 80,226,249,174,207,160,144,169,208,117,245,247, 0, 4,208,104, 73,236, 28, 54, 6, 60, 7,119, 44,159,254,169,251,146,157, +191,126,193, 48,204,102,115,191,222, 12, 51,204,168, 3, 23,130, 32,162, 1, 32, 60, 60,124,113, 68, 68, 68, 34, 65, 16,209, 44, +203,134, 85, 11, 40,209, 44,203,134,213,156, 83, 77,206,222,217,175, 57,183,238,126,221,239,139, 22, 45,242,139,140,140, 92, 27, + 28, 28,124,228,238,221,187,175, 0, 24, 35, 90, 67,171,137,213, 59, 75,239,144, 53, 12,178,246,246, 45, 69,139, 97,110,191,120, +149,161, 24,216,191, 91,211,232, 91, 79, 31,125,242,201,208,126,227,134,245, 26,148,158, 85,156,220,202,211,213, 49, 49,241,169, + 53,195, 48,183, 77,201, 37,161, 80, 24,214,183,111, 95,110,105,105, 41, 44, 44, 44, 32,149, 74,145,147,147, 3,138,162,160, 42, + 47,131,186,188, 12,170,178, 82, 80,229,165,120, 25,243, 16, 1,173,188,132,213,131,229, 13,162, 70,117,169,171, 84,213, 86,182, + 4, 86, 86, 16, 90, 89,129,104,188,219,240, 67, 91, 91,219,251, 53,141, 42, 69, 81, 95, 45, 92,184,176,136, 97, 24,172, 89,179, +198,218,210,210, 50, 10,128,208,152, 17, 43, 39, 78, 88,112, 71,127,242, 89,122, 60,122,116,152,130, 54, 45, 63, 64,122,129, 18, + 69,114, 10,133,101, 20,186,246,250, 25,205, 59,124, 15,143,142, 17, 72,206, 44,129,123, 19,111, 18, 92,161,193,197,159,179,179, +179,223,218, 63,114,248, 48, 20, 10, 5, 90,181,106,133,241,227,199, 99,225,194,133, 24, 63,126, 60,220,221,221, 49,241,163,225, + 88,190,124, 57,242,243,243,141, 37, 85,221,166, 77, 27,181,167,167,167,218,211,211, 83, 77, 81, 20, 42, 42, 42, 80, 86, 86, 86, + 55,191,231, 52, 54, 35,157,157,157, 23,185,186,186,198, 59, 59, 59, 39, 10,133,194, 11, 79, 8,226,153,202,211,211,165,251,136, + 17, 68,187,143, 62,226,100,138,197,196, 45,192,210, 20, 91,142,246,188,161,125,250, 14, 17,148,149,238,213,139, 84,159,126,226, +132, 63,111,249,225,206, 31, 93, 48,235,171, 86, 32, 72, 17, 8, 82, 0, 69,229, 13,116, 11, 12,230,219,218, 18,198,158,165, 9, + 0,158,116,239,222,221,125,230,204,153,132, 80, 40,196,236,217,179,169,233,211,167,167,142, 31, 63, 62,245,250,245,235,180,167, +167, 39, 60, 60, 60, 8, 15, 15, 15, 55, 0, 79,170,175, 49, 8,235, 86,196,106, 53,149,252,135,173,183,228, 21, 13,199,144, 10, +173,112,204,138, 13,121,197,171,183,191,218,144,254, 92,225,245,252,193,237,226,212,132,115, 76,250,163,223,139,114, 83,229, 94, +171,183,191,218,176,120, 91,110,189, 47,245,173, 91, 96, 78, 70,223,162, 20,149, 10,238,136, 97,125, 20, 51,166,141,107, 99,111, +233,119, 16, 77, 6,118,104,222,172,233,196,229,107,183, 80,211,191,248,154,218,189,103, 47, 43,151,203, 33,147,201,176,101,203, + 22,221,185,115,231,114,104,154,254,186,161, 62, 16, 0,104,181, 90,204,152, 49, 67, 98,109,109,141,236,236,108,189, 34, 10, 0, +121,210,226,167,119, 30, 37, 60,155,247,175,177,161,149,106,181,250,242,239, 49,201,237,188, 61,155, 18, 4,219,224, 68, 20, 1, +143, 55,160, 75,183,110, 28,150, 45, 3,193,109,134,151,251,215, 65,150, 95, 2, 89, 97, 9, 56, 60, 9,116, 16, 66,203, 8, 96, + 27, 16,136,148, 71,177,104,226,228,194, 21,242,120,131,204,237,137, 25,102,252, 51, 97,136,139,212, 38, 75,145,145,145,107, 13, + 29,175,181,213,212,217,215, 19,169,186, 36,172,246,119, 0,136,140,140, 92,203,178,108,216,221,187,119, 15, 3, 80,154,120, 11, +159,215,218,154, 30, 71,139,163,210, 68, 44, 88,184, 20,118, 54, 98,155,192, 78,222,174,103, 46,221,138,185,125, 55, 38,185,185, +135,163, 19,171,213,216,253,184,113,107, 83, 66,161,140, 52, 49, 17,190,142,142,142,160, 40, 10, 47, 94,188,192,235,215,175, 65, + 81, 20,116,149,149, 80,151,149, 65, 85, 90, 10,186, 82, 14, 62, 77, 67, 41, 45,132,131,133, 8,120, 51, 35,209,136,242, 70,212, + 75,180,106,182, 34,107,107, 8,173,172, 65,242,120,245,186, 21, 27, 64,231,192,192,192, 99, 9, 9, 9,221,250,247,239,191, 10, + 85, 83,228, 51,115,114,114,250, 45, 91,182, 76,237,226,226,130, 25, 51,102,180, 5, 48,197, 40,201, 20,104,124, 61, 93,219,162, +141,215, 20, 52,247,232,139,178, 74, 45,164, 50, 45, 10,203, 40,236,252, 57, 24, 39,118, 7,226,207, 19, 61,145,112,121, 0,202, +180,174,176,116,255, 16, 44,173,241, 51,100,243,234,213,171, 88,185,114, 37, 86,173, 90,133, 53,107,214, 96,213,170, 85,200,201, +201,129,191,191, 63,178,178,178,112,241,226, 69,228,229,229,193,209,209, 17, 15, 31, 62,196,166, 77,155,240,231,159,127, 26,189, +233, 26,226,106,194, 57,141,242,165,235,116,186,169,121, 35, 70,180, 47,176,183,111,215,169, 83,167, 33,179,103,207,246,234,222, +189,187,254,184,151,151, 87, 51,177, 88,156,143,170, 25,148, 29, 13,217, 98,128, 78, 78, 78,254,208,168,159, 85,151, 49, 15, 4, + 33, 66,223, 1,201,232,222, 51, 6,148,150, 15,146, 16,130, 36, 69,208,233,138, 97,103,231, 14,150, 37,252,141, 36,113,153, 84, + 42,245,190,118,237, 26,153,158,158, 14,145, 72, 4, 0, 25, 43, 86,172,216,186, 97,195,134, 36, 7, 7, 7, 58, 58, 58, 26,167, + 79,159, 70, 88, 88, 24,103,250,244,233,222, 30, 30, 30, 59,140,221,247,138, 45,121,247, 14,109,188,248, 49, 79,107,215, 81, 36, +110,222, 2,149,150, 31,126, 25,234, 40, 1,128, 75,105,105,114,231,102,178,200, 74,121,124,150,109,211,138, 31, 46,165, 25,155, +113,186,130,121,156,250,236,254,161, 83,151,202, 11, 11, 74,121,157,218,251, 41, 35, 86,126,195,111,222,162,245,143,203, 23,254, +203, 53, 71, 38, 42, 27, 48,251,226,179,147,151, 30, 86, 76,250,228, 51,221,180,207,103,170, 46, 94,186,122,138, 97,152,246,104, + 96,198, 33,195, 48,200,203,203, 67, 98, 98, 34,210,210,210, 32,149, 74, 81, 84, 84, 4,185, 92,174,119, 55, 90,200,101,231,183, +254,118, 46, 78, 34, 22, 91,116,107,239,221,236, 65,108, 82,161, 68, 44,182,240,110,209,172, 13,176,162,222,122,132,166,233,246, + 34, 11, 49, 0, 2,101, 9,183, 81, 81, 90,129,138,178, 10,200, 75, 42,160,166, 56, 80,169, 73, 40, 53, 36, 60, 67, 7,162,162, + 82,133,138,226,114, 48, 52,221,193,220,220,152, 97,134, 25, 6,218,250,232,240,240,240,197, 38,158,107,178,123,179, 46,241, 10, + 15, 15, 95, 76, 16, 68,244,162, 69,139,252,208,240,132,170,218,216, 85,207, 7,128, 9,225, 29,138,139, 83, 43,172, 8,223, 81, +115,191,253,238,226,225, 61, 63, 59,171,213,138, 44, 7, 59, 75,218,210, 66,224, 56,109,198, 26,200, 43, 74, 71, 86,154, 30,142, + 0,165,165,165,120,245,234, 21,196, 98, 49,248, 60, 30,104,165, 18,180,178, 18,202,210, 98,144,148, 26,124,154,134,189,133, 24, +158,145,229, 2,183, 0, 0, 32, 0, 73, 68, 65, 84,238,174,104,238,226,106,146,205, 23, 55,174,232, 7,190,215,118, 23,174, 11, +244,133, 64, 98, 9,129,149, 37,190,140,254, 29, 0,192,231,243,129,101,171, 76, 18, 77,154, 52,105,114,246,208,161, 67,124,169, + 84,138, 39, 79,158,196, 1, 40, 7, 96, 5,128, 73, 78, 78,190,150,144,144, 16,230,237,237, 13, 0,173,140, 25,147, 21,145,180, + 86,199, 34, 59, 63, 3,233,175, 99, 97,111,211, 18, 60,139, 54, 40, 44,163, 32, 20,183,132, 86,253,198,251,168,146,101, 66, 73, +113, 76,186,119,141, 70, 3,157, 78, 7,157, 78, 7,141, 70,131,207, 63,255, 28,119,238,222,197,145,211,215,241,234,101, 10,218, +182,112,197,228,201,147, 16, 24, 24,136,187,119,239, 26,180, 53,165, 35,180, 77, 44,193,221, 56,132,132,192,210, 65, 29,180,240, +242, 3, 99,100,139, 32, 8, 22, 13,184, 34,235, 96, 67,112,112,112,235,148,202, 74, 36, 62,123,134,254, 43, 86, 0, 0, 46, 92, +184,240,214,189,204,155, 55, 79,144,148,148, 52, 45, 38, 38,102, 90,110,110,238, 70, 0,245, 15, 54,103,129,243,231,239,225, 95, +255, 74,130, 84, 42, 5, 0, 28, 61,252,134,151,166,191,162, 48,120,104,149, 71,203,214,214, 22, 27, 55,250,155,148,159, 52, 77, + 99,215,174, 93,122,119, 33, 0,112,185,220,238,243,230,205, 27, 85,223,249,173, 91,183,230, 27,179, 57,119, 76, 19,209,159,113, +236, 87, 54,173,155,251, 89, 59, 6,160, 88, 27,235, 31,155,147, 55,107,238,152, 38,155, 55, 29,207, 81,137, 9,245, 62,130,206, +246,224,138, 84,251, 77, 73, 99,218,165,159, 53,197,158, 83,247,231, 75,101, 75,102,126, 54,193,193,218,214,185,114,247,214, 8, + 59,146, 67,178,103, 99,168, 50, 63, 47, 7,219, 15,131,126,170,248,215,220,101,177, 26, 93,246, 76,100,159, 77,129,129, 16, 23, + 52, 77, 35, 55, 55, 23, 82,169, 20, 89, 89, 89, 40, 42,170,114,191, 22, 21, 21,129, 97,152,191, 82, 33, 66,153,149,133,204, 83, +187,209,124,210, 36,116, 93,181, 18, 52,195,133, 82, 65, 99, 99, 72, 63,148,150, 43,161,102, 8,184,119, 14,193,103, 23,254, 0, +201,210,192,206,109,230,150,196, 12, 51,254,161, 48, 37,188, 67, 13, 33,138,136,136, 8,251,187,255,191, 54,217,138,136,136, 72, +140,136,136,104,204,127,213,117, 25,234,247,107,198,104,253, 94,107, 0,218, 59,141,166,188, 40, 57, 45, 41,137,155, 91,169,172, +180,112,113,118, 82, 91,136,132, 76,185, 76,206,137,125, 26, 71, 85,230,191,124,222,136,251, 72, 78, 72, 72,240,207,205,205, 69, + 86,102, 38,116,202, 74,144,106, 13, 88,149, 2,253,123,132, 64, 4, 64, 68, 18,224, 51, 20,184, 28, 1,228, 21, 50, 0, 72, 54, +218, 56,106,181,239, 40, 91, 4, 65, 64, 96,101, 5,129, 68, 2,129,165,213, 91, 10,151, 41,138,141, 80, 40, 60, 20, 21, 21,229, +214,164, 73, 19,172, 92,185, 18, 77,155, 54,245,113,119,119, 87,216,216,216,136, 93, 92, 92,208,174, 93, 59,132,132,132,224,226, +197,139,128, 9, 49,165,180, 58, 81,252,243, 12,116, 47, 42,185,139, 63,126,255, 5, 26,165, 26,157, 66,127, 1,197,109, 14, 39, +191,239,193,188, 56, 8, 69,254,153, 42,245,192,117, 24, 94,103,101,128,224, 8, 18, 77, 85,158,106,190,199,197,197,225,240,153, + 91,112,243,244, 69, 86,234, 51, 60,187,121, 13,119,156, 28,224,233,219, 78,239, 6,106, 48,141, 52,184,171,183, 85,133,137, 90, +250,213, 4, 97, 73, 73,137,208,222,222, 94, 93,147,119,110,110,110,127,133,108, 77, 88,176, 96, 1,202,120, 60, 96,232, 80,240, +211,210, 64, 81, 20,130,130,130,208,181,107, 87, 0, 64, 80, 80, 16,184, 92, 46, 2, 2, 2,224,238,238,142,109,219,182, 77,104, +136,104,145, 4,158,232,116,197, 62, 94, 94, 94,122,162,181,255,128, 20,177, 49, 3, 64, 64,128, 45, 91, 95,232,207,109,214,172, + 25,242,243,210, 64, 16,108,130,145, 52,174,114,117,117, 93,230,230,230,230,181, 97,195, 6,142, 72, 36,194, 23, 95,124,209,178, +162,162,162,121,181,148,140, 69,139, 22, 1, 0,150, 47, 95,142, 21, 43, 86, 64,173, 86, 43, 26, 50,182,127, 99,123,247,194, 18, +102, 26, 91, 97, 49,178,143, 99,243,246,125, 7,245, 71, 75,239,190,232, 59, 40, 11, 0,214,218,115, 51, 62,250,113,137,237, 41, + 91, 43, 98,239,149, 75, 87,151,247, 8,237,187,100, 97,197,205,213, 63,236, 42, 51, 58,230,177, 60,115,159,252,185, 96,220,166, +159,119, 28,216,244,221,162, 57,162, 44,169,166, 52,167,148,173,176, 20,114, 45, 91,185, 16,150,179,190, 93,245, 42, 55, 55,109, + 62,178, 47, 25,157,105,201, 48, 12,210,210,210,244, 99,250, 84, 42, 21, 42, 43, 43,145,157,157,173,127,102,148, 18,235,193, 51, + 63, 25,214,161, 82,169, 84, 60,120,154,154,181,116,246,196,224, 74,165, 82,145,154,158,149, 2,108,169,151,141,145, 36,249, 84, + 33, 87,244, 87,148,169, 32,125,242, 28, 77,251,121, 66,171, 35,160,209,209,144, 22,203,161,214, 1, 52,201,131,223, 71,147, 65, + 19, 92, 20,229,230,128,228,112,226,240,246,160,125, 51,204, 48,227,159, 3,131, 92,164, 70,209, 10, 14, 14, 62, 82, 91,117,170, +249, 14, 64, 13,195, 67,121,164,181,201, 84,141, 59,177,161,255,169, 99,215, 84,188, 51, 70,203,104,120,135,154,255,244,176,145, +185,175, 91, 62,177, 41,163,211,181, 45, 44, 42,208,113,185, 66,158,135,141, 50,175, 36,203,244,127, 87,171,213,209,215,174, 93, + 27, 49, 96,192, 0, 97,234,211, 56,104,202,203,161, 41, 47, 3,143,209,193, 94,220, 5, 36,165, 6,161,209,160,137, 15, 3,149, + 92,140, 91,119, 18,180,106,181, 58,218, 84,162, 69,114, 56,111,143,203,178,180,132,208,202, 26, 66, 75,203,186,174, 69, 99,164, +192, 98,224,192,129,253,130,130,130,192,178, 44,118,237,218, 5,138,162, 4, 20, 69, 65,163,209,128,162, 40,200,100, 50, 28, 56, +112, 0,219,183,111,191, 3,224, 55,163,141,153, 78,115,237,242,213, 27,129,159, 78, 12,227, 93,136,222, 8,157,134,134,146,104, +138,202, 74, 45, 42, 52, 22,160, 29, 38, 1, 5,231,193,225,138, 16, 28,208, 18,103,142,159,164,160, 83, 95, 55,145,133,191,165, + 10,101,103,101,224,245,203, 20, 88,202,242,225,100,109, 1, 69, 90, 10, 58, 77,158,242, 94,234,132,135,135, 7, 24,134, 65,159, + 62,125,244,131,171,223,151,108, 21, 23, 23,227,220,185,115, 8, 10, 10, 66,104,104, 40,114,114,114,144,150,150,134, 15, 62,248, + 64,127, 78, 92, 92, 28, 98, 99, 99,209,170,149, 97,145,176,168, 68,123,225,117,246,147,177, 31,126,248, 33,255,254,253,251, 96, + 89, 22,222,222,214,176,182,146,128, 32,133,240,245,117, 6, 80,213, 7,232,221,187, 55,100,178, 52, 93,105, 41,123,193,200,237, + 30, 2,112, 90,163,209,188,232,213,171,151,251,203,151, 47, 49,119,238, 92,238,209,163, 71,107,164,100,132,135,191, 61,153, 66, +169,108,216,117,223,182,189,207, 55, 45,117,118,161, 34,113,243, 22,214,142, 1,104,233,221, 23, 0, 48, 32,236, 83,180,108,221, + 12,178,162,248, 22, 42,101,198, 72, 62,183,212, 46,126, 75, 78,146,120,168,255, 39,170,194,223, 83, 81,229, 58, 53, 90,236,202, +212,163, 5, 89,188, 73,199, 78,159,189, 56,227,131,176,225, 60, 45,173,211,249,123,242,108,163, 78,157, 47,204,201,204,250, 9, + 89,151, 18,222,232,127, 6, 85, 60, 90, 38,147, 65, 34,145, 32, 33, 33, 65, 61,116,232, 80, 33, 73,146,120,241,226,133,158,104, + 57, 59,218,183,235,222,213,223,103,245,166, 3,151, 37, 66,161,112, 80,239, 46,190, 73,169,153,175, 89,150,200,104, 80,109,213, +106,175, 62,125, 18,215,199,201,189, 53, 39,237,247,251,112,232,249, 1,212,106, 18, 74, 13, 3,181, 14,208,113,248,112,235,216, + 13,182,173,124,193, 2,120,116,255,142, 86,173,213, 94, 54,183, 53,102,152,241,143, 86,181, 88, 67, 36,169,250,123, 9,128,140, +136,136,136,162, 90,106,147, 20, 64, 28,128, 14,213,231, 73,235, 92, 39, 37, 8,226, 17,203,178, 93,107,217,145,214, 34, 92,181, +191,107,234,156, 19,215, 8,146, 85,123,251, 54,209,106,104, 74, 37, 0, 56, 58, 58, 58,119,234,212,165,213,175,123,142,129,101, + 89, 60,143, 93,143,210,194,103, 88,182,246, 94,171, 38, 77,154,132,230,228,228,220, 50, 37, 5, 52, 77, 31,221,187,119,239,252, +110,157, 59,117,106,209,180, 41,226, 50,210,193,103,105,240,105, 26, 36,165, 6,151,214,160,169, 63, 13,146,176, 68,110,110, 57, + 34, 15, 29, 75,168,142, 18,111, 16, 62, 31, 12,199,202,215,229, 32, 8, 2, 27,130,253, 33,176,178, 4, 95, 98,137, 47,207,222, +208,147,171,232,149,139, 32,176,180, 68,171,110, 38, 5,132, 87,220,188,121, 51,230,233,211,167, 93,253,253,253, 49,127,254,124, +100,100,100,128, 97, 24, 20, 20, 20,168,242,242,242,114,164, 82,105, 6,128, 83, 0,126,133, 9,145,199,249,106,213,230,232, 19, +251,103, 6,247, 8,117,252,112,228,118,156, 62, 62, 15,101,229, 50, 40,116, 98, 84,170,116,168, 84,115, 96,239,208, 30,221, 2, + 2,144,155, 83,136,196,251,151, 43,184,106,197,250,198, 60,160, 4, 65, 32, 54, 54, 22, 94,238, 86, 72,249,227, 22, 28, 45,120, +232,224,238, 10,247,238, 61,244,241,165, 12,129,199,129,110,194,132, 9,250,200,240, 3, 7, 14, 76,159, 52,105,146,219,188,121, +243,176,103,207, 30,220,185,115,231,157, 1,218,161,161,161,184,125,251,246,247, 0,150, 27, 19,245, 52, 26, 13,124,124,124,240, +232,209, 35, 92,187,118, 13,125,251,246, 69,104,104, 40,226,227,227,113,229,202, 21,196,198,198,130, 32, 8, 56, 56, 56, 64, 91, + 69,158,181, 13, 25,163, 40, 68,253,240,227,222,197,155, 54,109,247,155, 56,113, 34, 78,156, 56,130, 79, 63,105, 11,130, 20,130, + 32,132, 24, 62,172, 45, 86,174,122,132,110,221,122,195,209,145,135, 77, 27,207,188, 82, 42,233, 3, 38,100,227,234, 43, 87,174, +184,171, 84, 42,148,149,149,177,150,150,150, 68,113,113,213,140,214,250, 20, 45,133, 66, 33,106,200,208,211,199,201,235,203,228, +108, 41, 91, 17, 59,178, 68, 23,219,190,239,160,108, 12, 8,251, 4, 87,163,127,195,141,203,215, 96,207,205, 72,135, 68,126,177, + 40,189, 72,150, 87,233,189,195,183,243,116,206,235,202,203, 59,102, 13, 79,225,184,185, 49, 81,139,126,145,149, 25, 34, 90, 0, +136,146,164,131,103, 79,177, 24, 30, 18,220,173,181,127, 51, 55, 65,105, 81, 33,123,252,204,197, 4, 42,253,196,185, 90, 4,139, + 53, 66,212, 87,134,135,135,127, 87,253,125,223,210,165, 75,167, 71, 70, 70, 58,229,231,231,235,199,104, 21, 22,149,220, 8, 25, + 58,139, 46, 46, 43,215,236,221,244,237, 24,177, 72, 40, 88, 26,185,247,119, 45, 7,247, 27,178,171, 99,152,109, 31,205, 93, 54, + 39,245,121,108,147,230, 98, 1,206,124,187, 28,113, 87,110, 66, 75,242,241,175,107, 15,160,166,104,148, 21, 21,227,250,180,175, + 96,233, 98,135,237,191,159, 40, 96, 24,230, 23,115, 83, 99,134, 25,255, 92, 52,196, 69, 8,130,168, 47,198, 94, 65, 61,191, 61, + 50,116, 93, 3,118,254, 14, 52, 24, 21,222,164, 41,120, 69, 69, 69,133,183,111, 63,192,239,209,171,113, 43,122, 53, 18, 99,227, +144,155,163, 65, 78,129, 10,214,214,214,247, 12, 92, 90, 55,114, 44,171, 80, 40, 70, 45, 93,246, 93,190, 72,108,129, 94,253,250, +193,213,201, 25, 22,124, 30, 56, 58, 6, 28,130,135, 10,169, 45, 82,226, 21, 88,184,247, 96, 97,133, 66, 49,170,158, 70,162,127, + 67, 36,131, 32, 8, 8,173,173, 32,176,180,130,208,202,250, 45, 55,162,200,218, 26, 34, 43,107,112, 5,130,250, 6,195,191, 99, +179,162,162, 98,244,152, 49, 99, 74,203,203,203, 49,125,250,116,220,186,117, 43,246,242,229,203,214,241,241,241, 98,169, 84,218, + 26,192, 64, 0, 59, 13,144,172,183,108,150,150,166,201, 89,157,122, 92,196,119, 95, 43, 85, 58, 7,140,157,114, 20, 18, 50, 27, + 58,154, 1, 11,192,221, 94,128,238,253, 87,161, 80, 19,130,163, 59,214, 40, 24, 74, 53,177, 78, 12,173,183,108,178, 44,203,186, +184,184,188,147, 7,215,174, 93,195,216, 49,163, 49,104,228, 8, 56,181,240,130,115,255, 15, 48,104,250,191,176, 99,199, 14,144, + 36, 9, 71, 71,199,186, 13,175,222,230,254, 39,224, 29,126, 10,226,240, 83, 16,251, 98,193, 5, 48,249,224,193,131, 63,116,232, +208,225,230,157, 59,119,214, 3, 24, 87,251,191,106, 97, 69, 29, 53,171,190, 50, 90, 50,103,206, 28,101,106,106, 42, 36, 18, 9, +116, 58, 29,238,220,185,131,237,219,183, 99,195,134, 13,136,141,141,133,131,131, 3, 90,181,106, 5,181, 90,141, 71,143, 30, 41, + 1, 44, 49, 96,147,145, 74,117,163,183,108,137, 44, 14, 11,235,137,189,123,183,194,213, 53, 4, 60,174, 43,184, 60, 39, 72, 44, +125,176,251,215, 31, 48,100, 72, 39,156, 61,115,172,164,168, 88, 55, 26,128,206,132,103, 73,245,224,193, 3,236,216,177, 3, 99, +198,140,201, 25, 59,118, 44, 93, 94, 94,174, 87,180, 88,150, 5,203,178, 88, 81, 61,198, 76,173, 86, 11, 27,178,249,217,194,132, +156,111,215, 36,174, 44,200,207, 9,186,117,243,222,132, 27,151,175,225, 85,234, 13,220,184,124, 13,127,220,184, 27, 94,144,159, + 19,212, 41,176, 13,127,212,244,153,223,236, 63,121,130, 99,105,237,134,253, 39, 79,112,198,207,250,122, 77,151, 65,125,151, 24, +123,230,171,203,145,173, 40, 44, 88,180,118,253,207, 21, 58, 74, 69,174,251,105, 91,174, 82,154,183,164,214,115,201, 26,123, 62, +149, 74,229, 78,149, 74,229,174, 82,169,220,213,106,245,146,140,140,140, 94,243,231,207,151,210, 52,173, 87, 75,165, 73,103,239, + 61,251,115,223, 90,103, 71, 59,113, 72, 87,191,182, 27,119, 30,255, 61, 43,187,224,223,181, 98,104,213,151, 78, 85,133, 82, 53, +122,196,168, 73,149,101,165,106, 4,127, 29, 14, 70,100, 9, 53, 13,104, 89, 14,116, 4, 23, 79, 87,111,132,216,222, 10,135,210, + 31, 43,202,181,212,104,188, 29, 67,203,208,189,255, 21,152,109,154,109,154,109,254,103,218,252,191, 12, 55,188,189,214,161,219, + 91,138,150,177, 41,149, 77,154, 52,233,245,225,240,254,232, 29,182, 20, 44,203,226,217,227, 31, 81, 42,125,142, 38,174, 66,164, +101,201,130, 1,220,106, 68, 98,178, 50,178,179,131,230, 44, 89,122,114,236,192,126,190,254, 45, 90, 8,155, 55,247,132,196,217, + 25, 69, 69, 82,252,121, 63, 73,187,230,112, 84, 66, 53,201, 50,201, 49,201, 48, 76,213, 32,119, 0,253,230, 44, 4,193,225, 0, +213, 97, 28,106, 26,198, 22, 93, 67, 64,112,185,160, 89, 6,106,181,218,148,217,114,175, 95,190,124, 57,122,226,196,137,215,163, +163,163,201, 65,131, 6,117, 60,117,234,212, 95, 89, 51, 15,149,133,169, 55, 1,132,173, 89, 52,227,104, 80,223, 17,214,222,126, + 93,248, 93,154,115, 64,105, 9,228,230,100, 34,250,228, 67, 42,233,193,101, 25,171, 83,141, 83, 20,165,222, 52,100,139,162,168, +172,214,173, 91,187,236,216,177, 67, 63, 24,158,166,105, 20, 21, 21,225,222,189,123,104,223,181, 27,124, 63,153, 6,169, 84,138, + 45, 91,182,160, 89,179,102, 24, 54,108, 24, 74, 74, 74,160,211,233, 76,117,248,210, 0, 46, 87,127, 80,135,100, 17,213, 75, 0, + 25,116, 27,122,121,121, 9, 84, 42, 85, 71,150,101, 57, 4, 65,108,214,104, 52, 83, 23, 45, 90,228,182,118,237, 90,180,109,219, + 22, 69, 69, 69,144, 72, 36,240,246,246,134, 84, 42,197,195,135, 15,105,133, 66,177, 3, 85, 11, 89, 75,141,164,239,197,195,135, +233, 65,179,103,127,121,242,135,200, 25,222, 42,117,111,129,189,125, 15,176,172, 14, 82,105, 6,228,178, 59,212,170,149,191,189, + 44, 40,212,142, 2,144,106,226, 61, 47,159, 57,115, 38, 0,136, 0, 44, 77, 75, 75,123,226,235,235,235,221,144,162,101, 10, 54, + 29,207, 81, 1, 56, 60,122,144,251, 92, 89, 81,188,183, 61, 55, 35, 61,200,159,217,178,233,120,206,255, 99,239,186,227,162,184, +218,238,153,217,157,237,187,192,210,171, 10, 40,136, 8, 2,162,136, 45,162, 38,198, 94,177, 68,197, 94, 98, 75,140, 26, 53,154, +216, 53,126, 38,198,150,216,123, 87,140,130,198,222,187, 98, 67, 69, 65,122,239,117, 97,251,204,247, 7, 44, 65,165,236,162,201, +155,188,239,158,223,111, 92,119,216, 61,123,239,157,153,123,207,125,238,115,159, 71,110, 98, 47, 91,150,147,112,237,117,186,236, +220,230, 61,161,199, 89, 33,253, 7,106, 29,197,209,115,249,214,204, 49, 61,168, 25, 31, 31, 31, 39,130,200,115,201,202,125,245, +112,204,184,137,131, 77, 57,101,103,124, 28,115, 27,147, 13,252,248,143, 30, 61,138,135,129, 59, 67, 43,240, 58, 53, 53,181,227, +188,121,243,206, 49, 12,243,150,111, 66, 86, 78,222,229,192, 94, 83,153,130,130,194,199,217, 47, 79,233, 19, 75,237,254,253,136, + 71, 93,188,188,253,142,255,184, 98,149, 77,167, 25,223,176, 95, 95,185, 10,104,213, 72,188,118, 21, 90,158,146,254,249,246,133, +204, 66,149,170, 63,140, 81,225,141, 48,226,127,222,154, 85,155, 22,249,135,163, 39,106,112,134,215,187, 50,174, 46, 14,231,154, +186, 53,250,172,129,163, 21, 0, 32, 54, 62, 13,177,241,169,231, 99,227, 82,187,213,161,120,107,218, 94, 89,153, 84,154,168, 8, +225,192,232,151, 84,250, 45, 78, 11, 11,139,135,108, 54,219,209,144,214,208,106,181,105, 57, 57, 57,126,122,150,115,152,179,179, +243,170,196,196,196, 80,154,166,191, 54, 80,237, 87,203,169, 75, 42, 77,178,185, 93, 25,141,210, 27, 0, 8, 54, 87,159,164,210, + 85, 57,189,197, 98,241, 22,138,162, 26,232,174,163,206, 7, 75,171,213,178, 84, 42, 21, 95,171,213,178, 0, 16, 36, 73,106, 40, +138,146, 19, 4,161,209,104, 52, 73, 10,133, 98, 34,254, 12, 56, 90, 91,221,235, 28,232, 43,132, 22,170,177,104, 93, 4,128,232, +232,104,119,169, 84, 58,132, 32,136, 65, 12,195,120, 20, 23, 23, 43, 22, 46, 92,248,232,232,209,163, 69,206,206,206,159,247,236, +217,147,120,250,244, 41, 34, 35, 35,153,220,220,220, 99, 21, 86,172, 88, 3,239, 37,146,199, 99, 13, 53, 55, 39,123, 50, 12,124, +192,128, 32, 72, 60, 43, 44,164,207,148,150,106,247, 87, 8, 70, 67,239, 79, 29,190,104,212,168,209,174,248,248,120,170, 38, 75, +106, 77,117,127, 23,171,191,107,190, 32,176, 67,135,129,119,110,220, 56, 49,103,249,243, 37, 85,255, 54,173,159,116,204,176, 41, + 51, 86, 31,220,180,110,206,134,223,243,119,234, 83, 78, 95, 95, 95, 87,130, 32,134, 0,240, 98, 24,166, 9,195, 16,124,130, 96, +242, 9,130,120, 14,224,169, 82,169, 12,127,241,226, 69,202, 7,212,189, 62, 51,220,154, 56, 43,147, 74, 67,171,109,161, 5, 24, + 61,147, 74,255,221,229, 52,114, 26, 57,141,156,255, 57,206,127, 51, 38, 84,115, 78,191,200,240, 58,196,198,165,118,139,141, 75, + 69,147, 38, 77,152,152,152, 24,131, 68, 90, 77,131,180, 86,171, 61, 84, 90, 90,122,232, 67, 72,114,115,115,253,255,226,198, 59, + 24, 31, 31,127,240, 99, 18, 86, 8,169, 37, 21, 71,125,241,172,164,164, 36, 64,223, 15,171, 84,170,191,162,109,136, 10,107,214, +226,154, 62,240,217,103,159, 37,170, 84,170,139, 0,146, 9,130, 48, 3,144,167, 82,169,206,105, 52,154,204,152,152, 24,255,159, +127,254, 89, 23,249,126, 41,128,135,245, 44, 7,173, 80,104, 15,164,165,105, 15,252, 5,117, 60,160, 84, 42,103, 90, 88, 88, 52, +150,203,229, 92,185, 92,206,169,186,249, 64, 32, 16,100,215,230, 16, 95, 21,102, 18, 98, 55,135,157,111, 97, 38, 33,222, 21, 82, + 48,119,192,241, 50, 89,100, 83,115, 7, 28,215,183, 96,143, 31, 63,142,245,241,241,217, 71,146,164, 51,195, 48, 54, 0, 99,202, + 48,200,102, 24, 38,135,205,102,167,190,120,241, 34,245, 31,212, 9,201, 53, 52,189, 70,163, 84,254,233,119,104,220, 93,104,132, + 17, 70,252,247,160, 70, 31, 45,182,161, 76, 49, 49, 49,132,177, 61,141,168, 42,182,106,251, 99, 98, 98,162, 2,192,237,138,227, + 93, 60, 4,208,251,159, 94,193,244,244,116,191,154,254,166,175,200, 2,202,125,182,128,200,106,163,179, 47,218,144, 95,140, 13, +161,179, 13, 45,219,147, 39, 79,146,160,231, 18,187, 17, 70, 24, 97,132, 17,127, 25, 62,220,162,101,132, 17, 70, 24, 97,132, 17, + 70, 24, 97, 68,181,216, 90, 69,112,189,101,221, 34, 80,243,206, 1, 67,214, 94,235,179,251,224,162,145,211,200,105,228, 52,114, + 26, 57,141,156, 70,206,255, 57,206,255, 86,188, 39,178,254, 14, 24,183,190, 26, 57,141,156, 70, 78, 35,167,145,211,200,105,228, +252, 95, 16, 89,239, 30, 0,140, 75,135, 70, 24, 97,196,255, 48,142, 30, 61,170, 87, 82,209,161,115,182,247, 18,139,165, 11, 75, +138, 10, 87, 29, 90, 51,230,132,238,124,112,112,176,214,216,138, 70, 24, 97, 4,234,227, 12,239,226,226,232, 73,106,233,118, 12, + 67,178, 24,146, 81, 19, 69,101,135, 99,243,243,223, 10, 59,224,228,228,100, 70,145,232, 77, 48,140,136, 32,104, 45,205, 34,111, +197,197,165,188, 48,160, 96, 92,169, 84, 58,149,195,225,116, 85, 42,149,142, 36, 73,166, 40, 20,138,139,165,165,165, 27,241,126, +224,194,255, 24,220,221,221,135, 93,189,122,213,172,125,251,246, 10,129, 64,160, 41, 43, 43, 99,159, 61,123,150,215,189,123,247, +130, 55,111,222,212,107, 71,162,189,189,125,231,237,219,183,187,116,235,214, 13, 77,154, 52,145, 13, 25, 50,132, 19, 24, 24,200, + 25, 55,110, 92, 92, 90, 90,218,101, 3,233, 60, 9,130,216, 75, 16, 4,139,166,233,145,248, 51,116,195,199, 6, 73,146,228, 68, +130, 32,250, 51, 12,227, 74, 16, 68, 44,195, 48, 39,104,154,174, 45,112,107,109, 24, 8,160, 7, 73,146,126, 0, 64,211,244, 35, + 0,103, 0,253,119,222,253,157,156, 66,161,208, 23, 0, 74, 75, 75, 31,127, 44, 78,130, 32,124, 1,128, 97,152,250,114,142, 22, + 8, 4,227, 1,160,172,172,108, 27,244, 72, 7,245, 46,152,205, 30,140,223,226, 40, 0,192,163, 31, 60, 0, 0,134,188, 39, 38, + 69, 17,134,252, 86,117,124,134,112, 84,131, 30,195,135, 15, 95,177,127,255,254, 31, 0,156,252, 43,110,124, 91, 91,167,141, 63, +173,219,106,255,213,212,177,171, 80,158, 17,162,246, 7, 18,248,148,203, 98,245, 81,106,181, 55, 94, 0, 71, 1,176,205,205,205, +135,113,185,220,142, 74,165,210,142,205,102,167, 43,149,202,235,133,133,133, 7, 81, 75, 6, 4,189,219,245, 37,164,170, 82,216, + 18,244,159,121,222, 24, 18, 10,142, 16, 25, 68, 51,228,255, 3,186, 81, 18,192,140,138,186,238, 64,205,225, 60,106,235,124,190, +178,183,183,239, 95, 84, 84, 84,202, 98,177, 24,148,239,122, 46,255,167,252,239, 4, 77,211, 89,121,121,121, 35,235,226, 18, 53, + 64, 83,174,136,216,171, 85,163, 76,163, 96, 38,203,146, 17, 37,118, 66, 91, 6, 24,201, 0,206, 36,139,180,162,105, 58, 29,192, +101, 82,131,176,146, 52,196,252, 67, 7,247,134, 21,237,218,168,226, 61, 5,192, 6,192, 83, 0, 95, 1, 40, 49,234,159,191, 13, +239, 58,195,159, 6,144, 94, 41,180,170,132,187,239,212,171, 87,175,107, 46, 46,142,158,131,250, 13, 88, 49,105,226,100,130,197, + 34, 17,249,252, 57,251,139,145,163, 63,147, 74,165, 14, 98,133,162, 25, 8,130, 46,229,243, 35,139,138, 10, 83,143, 30,220, 47, +241,104,218, 84,171,213,210,216,188,229,183,238,199,126, 15,157,175,167,216,114,183,181,181,221, 59,119,238, 92,219, 62,125,250, +176,108,109,109,145,144,144, 96,118,232,208,161,166, 27, 54,108, 24,156,159,159, 63, 18,192,235,122, 84,182,131,173, 57,249,153, + 68, 64,116, 65,177, 22,197,106, 92,202, 40,195,121, 0, 55,234,219,122,165,165,165,211, 74, 75, 75, 3, 90,181,106,197,236,216, +177,131, 24, 53,106, 20, 67, 16, 4, 81, 86, 86,182, 27, 64,189,132,150, 72, 36,218,212,173, 91, 55, 55, 55, 55,183,216, 55,111, +222,244, 56,114,228,200,153,144,144, 16, 87,145, 72, 20, 13,192,221, 64,186, 93,185,185,185, 62,101,101,101,112,116,116,220, 1, +160,229, 95,112, 19, 17, 44, 22,235,132,131,131, 3,179,122,245,234,147, 62, 62, 62, 54,121,121,121,154,217,179,103,119,189,123, +247,110,119,173, 86,219,199, 0,177, 37, 37, 8, 98,139,141,141,141,229,170, 85,171, 98,252,253,253,159,242,120, 60,110,116,116, +180,112,230,204,153, 95,191,126,253,122, 48,195, 48, 19, 1,131, 6, 8, 41, 65, 16, 91,236,237,237, 45, 87,172, 88,145,224,231, +231, 23,201,225,112, 56,209,209,209,162,111,191,253,246,171,168,168,168,122,113,146, 36,185, 57, 32, 32, 64,250,195, 15, 63,188, +108,218,180,233,109, 22,139,197, 77, 73, 73, 33, 23, 45, 90, 52,245,194,133, 11,193, 52, 77, 79,170, 79, 57,173,173,173,165,139, + 22, 45,122, 25, 24, 24,120,151,195,225,112, 94,189,122, 69,206,157, 59,119,106, 76, 76,140,222,229, 52, 55, 55, 15, 34, 8, 98, +107, 70, 70, 6, 27, 0,236,236,236, 90,155,152,152,108,168,154,211, 82, 23,138, 66,173, 86, 23,203,229,242,225,121,121,121,213, + 6,194, 29, 53,111,125,111, 0,216,160,210,189, 47,127,173,235, 61,176, 57, 76,159, 74,251,218,150,199,197,251, 73, 54,166, 31, + 0, 12,171, 72, 21,254,147, 12, 96,179,217,180,175,237, 87,204,227, 12,131, 66,198,244,237,220,185,243,162,203,151, 47,255,214, +169, 83,167,111,247,237,219,103,157,156,156,252,227,141, 27, 55,156,134, 14, 29, 58,234,210,165, 75, 43,115,114,114,142,125,172, +155,159,203,225,241, 8,146,128,128, 47, 52,209,231,243, 20, 73,246,186,221,183,239,248,109,175, 94,249,109,136,138,114,145,217, +217, 5, 76,159, 62,221,102,192,128, 1,164,147,147, 19, 98, 98, 98, 44,246,237,219,215,108,219,182,109,253, 11, 10, 10,102, 0, + 72,252, 16,145, 37, 43,128,183, 66, 9, 63,134,129, 89,229, 3, 75,160,128,167,194, 35,230, 37,158,253, 3,196,214,247,187,118, +237,250, 33, 38, 38, 6, 43, 87,174, 4,128,141, 6,126,127,102,223,190,125,123,134,134,134, 10,142, 30, 61, 42,104,213,170, 21, +108,109,109, 81, 49,153,170, 12, 76,237,226,226,162, 95,155,209,248,233,151, 51, 99, 90, 70,230,253,129, 77, 3, 50, 86, 10, 28, +161,105,219,215,173,127,175, 81,126, 48,181, 18,130, 47,102,163, 32,183,200,235,213,163,228,110, 87,142,196,252, 24, 19,145,189, + 74,150,132,239, 81,115, 76,190,255, 8, 44, 44, 44,118,196,197,197, 5,137, 68,162,183,206,199,198,198,250,186,185,185, 21, 2, +248,198, 80,225,102,101,101,117,128,166,105, 69,110,110,238, 88, 0,144, 72, 36,251, 69, 34,145, 52, 61, 61,125,254, 95, 53,145, +209,225, 93, 45,242, 47,183,104, 85,250,107, 85,151,235,144, 32,181,116,187, 73, 19, 39, 19, 67,134, 13,205,136,137,141,163,217, + 20,119,216,217,115,231,132,158,158,158,164, 98,227, 70,104,178,179,161,254,250,235,182, 23, 47, 94, 84, 7, 15, 27, 81, 70,177, +136, 93,174, 46,206,194,195, 7, 15,217,134, 30, 63,214, 14, 64, 93, 66,139,107,107,107,187,247,234,213,171, 14, 46, 46, 46, 40, + 40, 40, 64, 66, 66, 2,100, 50, 25, 6, 15, 30, 76,181,107,215,206, 97,208,160, 65,123, 11, 11, 11,219, 27, 96,217,178,105,226, +200, 14,159, 56,122,128,123,247,207,218,137, 28,156, 26,131,201,144, 35,249, 77, 84,171,240,171,119,167,239, 58,126,230,117, 76, + 33,211, 11,213,231, 70,170, 21, 57, 57, 57,115,250,247,239,127, 60, 40, 40,200,138,199,227,193,222,222,158,232,211,167, 79, 86, + 90, 90,218,226,122,171,150,138, 20, 54, 36, 73,106,171,190, 86,147, 30, 72, 31, 56, 74,165, 82, 72,165, 82, 0,112,248,208,153, +167,153,153,217, 70,137, 68, 50,168,168,168,168,140, 36, 73,134, 32, 8, 70,169, 84, 10,164, 82,233,147,151, 81,175,237, 21, 10, + 69,147, 53,191,108, 91,215,185,131,143,201,133, 11, 23, 48, 96,192, 0,230,252,249,243, 19,245,205, 83, 71, 16,196,150,254,253, +251,151, 46, 92,184, 80, 30, 19,155,224,240,242,117, 44, 33,226,115,105, 75, 75, 75,234,254,253,251,236,181,107,215,242, 23, 45, + 90,180,133, 97,152, 65, 6,180,231,150,161, 67,135,170,102,205,154,149,254, 42, 38,206,250,217,203, 24, 70,204,167, 52,150,150, + 22,172,187,119,239,210,245,225, 36, 73,114,243,156, 57,115,138, 38, 78,156,152,159,155, 87,104,155, 95, 84,194,240, 40,150,218, +214,214,150,125,242,228, 73,197,129, 3, 7,200,241,227,199,111,166,105, 58,216,128,246,221,220,167, 79,159,226,185,115,231, 22, + 68,199,198,219, 62,123,241, 26, 66, 30,165,182,177,177,102, 61,120,240, 64,181,102,205, 26,114,217,178,101,122,149, 83, 36, 18, +237, 57,114,228, 8,251,228,201,242,190,239,206,157, 59,164,171,171,171,176,234,103,202,228, 10,144, 4,144,147,147, 35, 12, 12, + 12,220, 3,224,189,224,190,126,139,163, 48,106, 30, 48,109,218,180,116, 67,111, 22, 63,187,233,117,126, 70,251,155, 7,179,182, +116, 76, 63, 54,155, 77,143, 31, 63, 62,227,221,191,203,229,114, 2, 64, 31,252,168,191,216,234,209,163,199,119,167, 79,159,110, +188,111,223,190,159, 15, 28, 56,160, 4, 0, 62,159,111,121,232,208,161,149,131, 7, 15,198,224,193,131, 23, 30, 59,118,236,163, + 9, 45, 45,163, 85, 1, 0,143,207,227, 69, 69, 69, 17, 30, 30, 30,181, 70,220, 87,209,244,195,109,175, 94,249,127,233,225,209, + 42,143,166,155,112,186,119, 47,153, 57,115,102, 78, 81, 81, 17, 18, 18, 18,160, 82,169, 48,106,212, 40, 86,167, 78,157,236, 7, + 15, 30,188,190,184,184,120, 32, 0,149, 30,247,228, 26, 7, 7,135, 9,133,133,133, 37, 58,171, 78,251,145, 90,118, 71, 95, 13, +175, 69, 19, 53,151,195,210,112,122,127, 77, 19,231, 55, 18, 50, 15, 23,220, 4, 0, 78, 41,178, 13,156, 12, 84, 11, 19, 71,184, +104, 41, 44,179,114, 20,116,206, 78, 44, 91, 34, 75,170, 85, 44, 13, 20,137, 68,253,100, 50,217,177,138,193,217,189, 87,175, 94, +184,123,247, 46, 0,180,171, 16, 90,157, 73,146,252,130,166,233,237, 0,106, 75,229, 54,189,111,223,190,159,134,134,134, 74, 0, +224,216,177, 99, 80,171,213,112,117,117, 5,135,195, 1,151,203, 5, 69, 81,149,217, 65,244,132,157,149,149, 37, 44, 77, 41, 72, +205, 69,221,191,253,181, 47,187,129,167, 9,178,180,207,145,199, 20, 64,195, 40,192,177, 16,161,105, 55, 51,248,125,214,153, 12, +219, 28, 57, 63,108,211, 75,255, 82, 18,189,145, 8,197, 63,101,100, 39, 73,146,247,244,233, 83,216,219,219,191,117,158,197, 98, + 1, 64,199,122, 80, 46,140,141,141, 13,140,136,136, 64, 80, 80,208, 66,111,111,239,207,175, 93,187,102,155,155,155,139,160,160, +160,245, 41, 41, 41, 39,255,234, 58, 85,213, 34,255, 45,166, 46,242, 29, 37,217,169,124, 22, 76,178, 88, 44, 18,113,177, 9,234, +160,160, 46, 33, 73, 73, 73,226,128,128, 0,146,162, 40,200, 46, 95,134,252,193, 3,136,197, 98,244,239,223,159,186,126,253,186, +137,137,216,100, 92,124, 92,124, 49,139, 69,130, 97,200, 58,125, 30,164, 82,233,212,249,243,231,219,186,185,185, 65,163,209, 84, + 70, 52,215,104, 52, 72, 78, 78,134, 88, 44,198,200,145, 35,173,133, 66,225, 84, 61,235,209,200,221,213,250,209,213, 51, 91, 90, +206,156,212, 67,228, 46,188, 0, 81,242, 12,136,143,125,137,102,105,103, 49,183, 95,128,232,252,166,133,126,141,237,205, 31, 85, + 49,177,234, 13,133, 66,113, 51, 50, 50,114,220,181,107,215,104, 0,184,114,229, 10,243,242,229,203,137, 31, 50, 11,165,105, 26, + 5, 5, 5,160,105,154, 85,241, 94,247,250, 31,189, 31, 76, 76, 76, 54,127,254,249,231, 67, 19, 19, 19, 5,127,252,241,135, 69, + 82, 82,146,101,124,124,188,149,187,187, 59,123,229,202,149,167,229, 10, 21, 75,173,101,148, 26,173,186, 56,253,249,243,216,252, +204,204, 71, 59,119,238, 44, 35, 8,162,191,158,191, 49,208,206,206,206, 98,222,188,121, 32, 40, 97,235,166,205,188,221, 88,148, +192,148,164,184,166,101,101,114,109, 92, 92, 92,242,188,121,243,156,125,124,124,236, 81,190,188,166, 23,167,189,189,189,229,172, + 89,179,192,230, 73,124, 91,248,248, 53,230,242, 68, 18, 22, 37,144, 4, 4, 4,116,138,141,141, 77,155, 59,119,174, 93,171, 86, +173, 12,226,108,213,170,149,116,252,248,241, 26,190, 64, 18,232,226,226,218,172, 69,243,102, 61,221,221,221,251,177,217,108, 77, +118,118,118,226,200,145, 35,237,122,247,238,109, 99, 8,167,181,181,181,116,238,220,185, 26,167,134,174,221,186,125,250, 89, 27, +142, 64, 98,202,230,138,204, 74, 75,229,218, 87,175, 94, 37, 46, 88,176,192,206,215,215,215, 90, 31,206,210,210, 82,202,210,210, + 18, 94, 94, 94,240,116,117, 69, 97, 97, 33, 66, 67, 67,177,107,215, 46,108,223,190, 29, 7, 15, 30,132,127,251,207, 32,145, 72, +144,150,150,134,162,162, 34,234,239,190,161,180,191,121, 48, 27,148, 19,250, 76,158, 60, 57,109,252,248,241, 25, 2,129,128,126, +247, 48, 55, 55,215, 14, 31, 62, 60,115,228,183,191,244,209, 45, 45,214, 97,201,122,122,230,204,153, 55,251,246,237,131,167,167, + 39,186,117,235,198, 5,128,169, 83,167,114, 7, 15, 30,140, 35, 71,142,224,216,177, 99, 47,220,220,220,110, 1,232,171, 79, 57, + 71,142, 28,217, 62, 56, 56,248, 70,112,112,240,227, 33, 67,134,108,157, 56,113,226, 91, 35, 87,122, 90,202, 67,165, 82, 9, 31, +191, 86,194,165, 59,238, 13,175,139,239, 37,176,111,107, 84,212,174, 85,207,159, 39, 46,244,244, 52,107, 24, 31,111,190,123,205, + 26, 75, 93,146,110,181, 90,141,228,228,100, 72,165, 82, 12, 31, 62,220,146,199,227,141,212,163,152,107,251,246,237, 59, 58, 41, + 41, 73,188,109,219, 54,187,199,143, 31,219,167,167,167,219, 93,186,120,206,106,246, 55, 83, 37,166, 98, 46, 55, 45,155, 33, 0, + 32, 62, 13,162,168, 56,180,103, 24,152, 85, 93, 78,172, 23,236, 32, 16, 56, 98, 67,227,246,102,175,103, 29,241, 29, 50, 55,220, +207, 82,106,199,155, 87,203, 55, 90,172, 94,189,250,104, 88, 88,216,176,246,237,219, 31, 7, 32,168,230, 51,124,127,127,255,208, + 35, 71,142,140,238,208,161,195, 77, 0, 94, 53,206, 34, 29, 29,251,255,254,251,239, 22,186,247,150,150,150,224,243,249,239,137, + 44, 14,135, 3,146, 36, 13,174,222,242, 67,195,216,230,205, 20,136,204, 63,131, 35,171,159, 98,117,247, 87,244,138,182,241,138, +141, 35,163,112,254,200, 83,100,225, 41,122,124,217, 24,195, 22,248,116, 21,106,177,236,159, 52,128,103,103,103,127,209,177, 99, +199,163, 61,122,244, 80, 68, 68, 68, 32, 59, 59, 27, 14, 14,149,115,237,140,122, 80,154, 11,133, 66, 56, 57, 57,193,205,205,109, +216,245,235,215,109,213,106, 53,226,227,227,145,149,149,245,232,239,168, 83, 85, 45,242, 47,195,187,142,240,167,223, 19, 90, 21, +185,133,174, 2, 0, 67, 16,178,167,145,145, 20,139,203, 29,177,255,192, 1, 30,135,195, 65, 98, 98, 34, 94,188,120,129,210, 75, +151, 80,118,251, 54, 50, 51, 51, 81, 82, 82, 2, 27, 27, 27,108,217,177, 67,164,212, 50, 99, 94,189,126,205, 98, 72,166,170,191, + 65,181, 91, 60,121, 60, 94,215, 1, 3, 6,212, 40,200,210,210,210,208,163, 71, 15,138,197, 98, 85,183,171,225, 93, 78,194,222, +138, 8,187,116,124,169,157, 29,247, 5, 16, 51, 19, 40,126, 4, 48, 10, 64,163, 4, 82,159, 1,167, 23,163, 97, 73, 20,113,110, +105,136,173,131,144, 29, 86,141, 82,174,107, 43,170,171,135,135,199,246, 17, 35, 70,144, 0,208,185,115,103,194,195,195, 99, 43, + 0,215, 90,190,115,177,142, 65,242,110,126,126, 62, 6, 15, 30,108,209,184,113,227,139,131, 7, 15,182,208,157,175, 47,167,206, +154,236,233,233,153,203,231,243, 15, 2,122,117,176,149,156,102,102,102, 27,123,244,232, 49,232,192,129, 3, 28, 0,184,122,245, + 42,194,194,194,240,252,249,115, 68, 71, 71,211,126,126,126, 86,191,108, 63,186,121,227,111,123,214,246,107,231, 99,223,169,181, + 95, 51,113, 73,126,137,141,141, 77, 59,134, 97, 92,245, 44,103,143,197,139, 23,191,120,249, 38,209,148,100, 83,108, 14,197,230, +153,152,136,108,164, 18,145,163,185,144,239,192, 35, 9,113,105,105,105,198,193,131, 7,105, 0, 61,244,229, 92,186,116,105,220, +203,152, 68, 51,130,100,179, 41, 54,197, 17,139,133,102,221,187, 5,181, 2, 0, 14, 24, 78, 81, 81, 81,230,174, 93,187, 84,134, +112,254,240,195, 15,145,121, 5, 37, 82, 54, 69, 81,108, 54,171,178, 45, 69, 2,129,149,144,199,227, 42, 20,138,212,117,235,214, +149, 25,194,185,120,241,226, 23,175,222, 36,153,147, 4,193, 34, 8,146,109, 34, 17, 89, 88,152, 10,173,172,196, 2, 75, 33,155, +197, 45, 42, 42, 74,221,187,119,175, 94,156, 42,149,138,147,153,153,137,151, 47, 95,194,169, 85, 43, 92,184,112, 1, 13, 26, 52, +192,224,193,131, 49,116,232, 80, 8, 4, 2,116, 14, 5,205, 58,102, 0, 0, 32, 0, 73, 68, 65, 84,244,198,188,121,243,240,230, +205, 27,168, 84, 42, 94,117,156, 58, 63,169,119, 97,111,111, 31, 81,215,205,243,206,119,223, 42,167,175, 45,152, 13,202, 9,125, +170, 10,172,154,248,205,205,205,181,213, 89,187,222,229,236,209,163,199,119,151, 46, 93,106,188,119,239,222, 62, 35, 71,142,188, +185,119,239, 94,180,105,211, 6, 47, 95,190,132,179,179, 51,118,239,222,141,161, 67,135,222, 92,191,126,125,159,136,136, 8, 31, + 23, 23,151,249,117,113, 14, 25, 50,100,138,175,175,239,229,140,140,140,192,188,188, 60,175,208,208,208, 49,253,251,247,143, 27, + 54,108, 88,151, 74,193,168, 86, 31, 56,125,234, 56,122,246, 25,128,166,205,189, 54,143,154,191,207,187,142,103,147,121, 14,108, +221,149,158,158,125, 64, 46, 47, 29, 76, 81, 66,225,189,123,230,199,126,251,205,178,106,102,129,212,212, 84,244,238,221,155,226, +112, 56, 29,234, 40,231,234,126,253,250, 13, 14, 13, 13,149,234,172, 58,183,111,223,198,179,103,207,144,144,144,128,130,130, 2, +116,153, 88,130,201, 43,203,185, 39,175,100,240,217, 84, 70, 84,207, 62,164, 18,130, 6,176,181, 48, 97,223, 26,179,174,233,212, + 9,155, 61,217, 98,115, 10,251,191,141, 70, 78,188,226, 88, 13,156, 68, 96, 96,224,190,224,224, 96, 66,169, 84, 66,169, 84, 42, + 1, 84, 27,213,215,193,193,129,223,162, 69, 11, 76,156, 56,145, 52, 49, 49, 89, 95, 83, 57,101, 50,153,226,204,153, 51, 24, 57, +114, 36,102,204,152,129, 38, 77,154, 64, 42,149,130,162, 40,236,217,119,216,114,232,152, 73,238, 45,219,119,244,241,108,217,166, + 69,177,130,213,138, 18, 72,199,215, 96, 13,169,182,238, 37,214, 17,136,140,191,131, 13,125, 82,232,251,187, 75, 75,102,127,241, +127, 81,175,174,101, 62,159, 31,188, 53,146,185,211, 54,103,223, 87, 73,200, 84,191, 68,135,193, 13,225,226, 43,253, 90,228, 4, +143,250,182,167,158, 48,136,211,219,219,187,253,253,251,247,121, 29, 59,118, 68, 98, 98, 34, 40,170,114, 62,165,253,144,114, 46, + 94,188,152, 39,151,203,241,228,201, 19,132,132,132,164,170, 84,170,175, 63,164,156,134, 88,180,116, 90,228, 95,134,173,239, 28, +233, 53, 89,180, 22, 3,128,154, 70,216,136,144, 49,165,225,225,225, 66, 46,151,139,196,196, 68,164,167,167, 99,207,174, 93,218, +206,214,214,197,221, 28, 28,138,246,236,218,197, 40,149, 74, 48, 12, 3, 15, 15, 15, 12, 26, 52, 72, 48,112,240,176, 44,162,168, +236,176, 30,203, 60,118,186,245,245, 49, 99,198,188,247,247,217,179,103,195,196,196, 4, 4, 65,216,234, 81,185,224,233,139,251, + 57, 74, 93,204, 50,153,140, 61,121, 96,241, 1,182, 4, 96,155, 0,124, 83,128, 39, 1,184, 66, 40, 34, 46,231,145, 76,183,132, + 1, 29,198, 58, 0, 48,100,169, 7,246,246,246, 11, 47, 95,190,108, 21, 17, 17,193, 20, 21, 21, 33, 61, 61,157, 89,177, 98,133, +149,189,189,253,194,250, 94,145,180,180,180,165, 61,123,246,204, 12, 9, 9, 49, 61,123,246,172, 83, 72, 72,136,105,207,158, 61, + 51,211,210,210,150,126,200,149,230,112, 56,172,231,207,159,155, 47, 91,182,108, 40,128,135,205,155, 55,207,117,112,112,120,136, +114,167,201, 90, 33,145, 72, 42, 69,150,206,186,198,102,179, 65, 81, 20,236,237,237,149,121,121,121,218, 14, 45, 93, 5, 30,166, +164,218,158,199, 17,152, 11,248,142, 18, 19,211,128,220,220,220,167, 4, 65,196,234,185,196,231,219,186,117,107, 74,203, 80,244, +228, 17,157,237,167,142, 14,178,254,117,217,248, 6,235,150, 78,112, 88,189,104,156,199,210, 57,195,131, 72,154,150, 59, 59, 59, +219,234, 28,218,245, 48,159,251,249,251,251,179,105, 80,120,249, 58, 33, 51, 49, 37,181,248,211, 78,129,149,150, 75, 79, 95,191, +110, 86, 86, 86, 29, 61, 60, 60,252, 9,130,208,107, 75,178, 64, 32,240,109,218,180, 41,155,100, 81,132,133, 84,226, 36, 17, 11, +108, 42,151, 80,204,204,218,154, 91, 89, 5,147, 12, 83,104,103,103,103, 45, 16, 8,124, 13,168, 59,155, 6, 7, 54,214,230,166, + 86,150,102,226,110, 65,237,154, 4,182, 13,116,247, 14,104, 19,216,188,165,255, 64, 66,163, 41,114,117,117,181,214, 57,201,215, + 97,105,229, 31, 56,112, 0,203,150, 45, 67,139,134, 13,225,224,224, 0,107,107,107,220,190,125, 27,247,239,223,135, 84, 42, 69, + 86, 86, 22,214,172, 89,131, 19, 39, 78, 64,165, 82, 73, 12,189,159,244, 17, 91,181, 65,163,209,144,239, 10,172,154,248, 5, 2, + 1,173,115,146,175, 9,103,206,156,217,167,179,100,125,245,213, 87,237,127,249,229,151,155, 81, 81, 81, 16,139,197,184,127,255, + 62,198,140, 25,115,115,253,250,245,237, 39, 77,154,132, 93,187,118, 33, 46, 46,110, 71,109,124, 67,134, 12, 89, 52,110,220,184, +117,215,174, 93, 35,109,108,108, 32,149, 74,209,175, 95, 63,236,216,177,131,173,209,104,118, 6, 7, 7, 63, 14, 14, 14,126,172, + 77, 62,255,221,209,237, 43,110, 71, 62,125,140, 41,211,103,113,149, 26,245, 92, 61,170,207,148,137,197,197,154,142, 29,243,142, +168,213,165, 67, 56, 28,161,233,227,199,230, 97, 59,119, 86,138,173,121,243,230,193,212,212, 20, 40,119, 96, 70, 45, 86,157, 9, + 39, 78,156,168,236, 15, 45, 44, 44,192,229,114,193,225,112, 64, 81, 20, 88, 44, 22, 46,110, 22,225,183,121,229,250,226,183,121, + 4,206,111, 36,100, 31,114,237,132, 14,240,146,218,112, 31,127,185,187,185,143, 87, 23, 11,220, 62,148,129, 21, 61, 35, 82,238, + 31,201,158, 41,207,194, 79, 53,124,173,229,236,217,179, 61,179,178,178,240,224,193, 3, 60,120,240,160, 38, 11,144,252,212,169, + 83, 63,150,148,148,192,197,197, 5,125,251,246,237, 8,160, 85, 13,207, 13,252,253,253,209,187,119,111, 4, 5, 5,161, 69,139, + 22, 80,170, 52, 84,240,136, 9, 77,159,199,101, 59,172, 88,179, 66,120,249, 74, 40,121,243,230, 53,214,190,227,231, 77, 3,131, + 62, 91,199,145,216,221,133,192,194, 78,159,122,150,106,115,225,107,215, 29, 91, 47, 77, 39, 55, 92, 13, 17,239, 9,219,224, 42, +145, 72,136, 71, 15, 30,171,247,108, 58,146,228, 37,234,155,117,247, 80, 46, 74,137, 12,116, 25,237, 66,210,192,160,127,202,200, +206,231,243,127,185,118,237,154,173, 74,165, 66,100,100, 36,102,204,152, 33,255, 64,202, 74, 3,136,147,147, 19,174, 94,189,138, +225,195,135,203, 51, 51, 51,239,252, 93,117,170,170, 69,254, 91,192,174,162, 32, 43,145,156,156, 92, 32,149, 74, 29,154, 54,109, + 74, 42,149,202,242, 37,137, 99,199,180,219,119,238, 60, 45,151,203,167, 3,224,108,252,245,215,205, 14,142,142, 65, 35, 70,142, + 36,212,106, 53,122,246,236,201, 13, 15, 15,183,136,205,202, 42,214, 99,192,121,235,247, 70,141, 26,133, 95,126,249, 5, 0, 48, +109,218,180, 74,211, 58,161,135,195,146,216, 20, 61,186,245,242, 55, 73, 22,109, 48, 81,181, 85,151, 52,122, 35,185, 43, 42, 17, +248,131,228,178,193,103,129, 86,169, 53,209, 89,253, 31,190,137,110,230, 41,200,203,117,238,218,252, 19,108,191,176,183, 71,169, + 86,126, 68,239, 14, 71, 40,108, 45, 22,139,241,240,225,195, 60,127,127,255, 2,134, 97, 76,151, 46, 93,106, 41, 20, 10, 91,127, + 64,219,199,191,126,253,186, 99,187,118,237,166,146, 36,217,149,166,233,139,153,153,153, 27, 1,196,235,249,253,201, 0,126, 0, + 80, 57,179, 84, 42,149, 32, 73, 18, 12,195, 96,200,144, 33,152, 55,111,158,231,179,103,207,112,249,242,101,243,174, 93,187,222, + 5, 80, 0, 96, 44,128,106,173,102, 69, 69, 69,101,247,239,223, 23, 92,190,124, 25, 52, 77,195,220,220, 28, 38, 38, 38,224,241, +120,232,215,175,159,120,238,220,185, 93,206,157, 59,151, 85,212,168, 1,139,159,158, 42,227,137,197, 18,216, 58,116,152, 52,236, +139, 40,134, 97, 78, 24,208, 57,112, 5,108,141,156,208, 42,200,213,223,175, 39,133, 28, 14,193,231,176,193,163, 75,241,221,143, +203, 9, 14,163,101,195,192,245,121, 14,135,195,145,240,160,100,113, 89,106, 33, 1,230, 99, 60, 28, 44, 22,139,203,231,212,236, +143, 65,145, 36, 73,146, 36, 7,128,222, 73,251,120, 60, 30, 71,194, 99,106,228, 20,176, 8, 22, 65, 16, 92,212,176, 19,205,215, + 22,140,206,138,196,157, 30,171,168, 42,138, 59,116,232,128,211,151, 31,226, 88,216, 69,228, 36, 62,197,130,111,191, 66,171, 86, +173, 16, 30, 30, 94,107,153,116, 62, 90, 53, 89,151,237,237,237, 35,210,210,210, 90,214,244,221,218,150, 12,107,176, 82,189,207, +255,189, 41,252, 22, 71,161, 14, 31,173,190, 29, 58,116,152,114,224,192, 1,229,231,159,127,206, 29, 50,100, 8,188,188,188,218, +143, 30, 61, 26, 0,208,181,107, 87,252,242,203, 47,237, 71,143, 30,141,195,135, 15, 35, 52, 52, 84,209,169, 83,167,111,175, 94, +189,154,138,242, 29,157,239,129,166,233,222, 91,182,108,121,215, 82, 8,141, 70, 3,181, 90,109,167,209,104,236, 42,250, 34,172, + 91,183, 62,231,252,185,112,124, 59,127, 49,172,173,108,125,245,188,135,136, 81,179,102,229,236, 94,179, 6,107, 14, 31,198, 44, +103,103,225,222, 23, 47,112, 94, 46,199,145,203,151,115, 42,126,167, 78,223, 76,153, 76, 86,118,230,204, 25,147, 35, 71,142,192, +204,204, 12, 77,154, 52,129,185,185, 57, 40,138, 2,201, 18,128,197,145,162,105,243,214, 0,238, 3, 0,156,237, 33,243,112,193, + 77,130, 64, 1, 67, 26,238, 83,196,107,128, 70,150,142,252,107, 83,118,121,153,153, 88,115,112,118, 99, 18,206,109, 72, 62, 33, +207,193,207,208,224, 21,106,246,249,242,119,113,113, 65, 86, 86, 22,206,156, 57, 35, 3,106, 20,100,160,105,250,199, 95,127,253, +117,246,252,249,243,121, 30, 30, 30, 0,224, 11,224, 65,117,159, 21,137, 68,112,112,112,168, 20,150, 67, 66, 38,185, 78,156, 57, + 73,208,255,179, 32,176,217,150, 40,144,169,145, 91,172,134,212, 82,140,111,103, 6,243, 47,250, 59,180,218,178,126,255,169,178, + 50,180, 2,222,239, 15, 8, 2, 15,238, 61,189,233,205,247, 0, 8, 18, 72, 38,175,128, 0,129, 18, 66, 13,130,197, 98,180, 90, + 45,146,146,146,192, 48, 12,134,247, 31,147, 60, 97, 69,168,117,251,225, 69,112,106,106, 15,130,193, 39,255, 20, 33, 96, 97, 97, +225,155,155,155,139,248,248,120,132,132,132,164,230,228,228, 92,144,201,100, 99,210,210,210, 0, 32,175, 30,148,149, 98,222,215, +215, 23,173, 91,183,198,224,193,131,249,165,165,165,193,174,174,174, 14,217,217,217,109,255,202,250,188,171, 69,254,171,132, 86, +181, 15,154, 90,221, 84,177,121, 51,100, 23, 47,130,123,254, 60,142,216,219,151,200,229,242,111, 0, 36, 87, 60,248, 95,237,218, +189,251, 86,159, 59,119, 76,148, 81, 81,112,125,246, 12,148,153,153,175,161, 5,216,185,115, 39,138,138,138, 80, 88, 88, 8, 0, +216,176, 97, 3,138,138,138,160,209, 51,225, 44,155,131,246,182,214,206,200, 64, 52,104, 54, 41, 78,104, 90,218, 70, 44,151,164, + 57, 36,217,200, 10, 73, 7, 68, 37, 6,136,202,114,149,109, 8,150, 18,242,156, 82, 56,180,107, 2, 54,216,237, 13, 41,163,110, +221,159,205,102,231,189,126,253,186,183,187,187,123, 24, 0,203,250,248, 3,188,131,152,204,204,204,233,245,249, 34,139,197,250, + 33, 46, 46,206,122,199,142, 29, 83,151, 46, 93,202, 84, 21, 90,186,255,179,217,108, 48, 12, 3, 83, 83, 83, 80, 20,101,115,251, +246,109,155,128,128,128, 77, 52, 77,251,214, 80, 79,198,203,203, 11,113,113,113, 96,179,217, 48, 53, 53, 5,173, 81, 97,241,204, + 73,208,178,120,236, 57,115,230,248, 14, 24, 48, 32,114,199,142, 29,106,147,192,118,109,115,115,115,159, 79, 25, 62, 34,242,228, +201,147,202,138, 16, 15,117, 79,241, 25,230,113,116,116, 52,203,209,222,134,197,104, 74,105, 17, 7,224, 63, 93,199,112,197,182, +224,179, 89, 12,135, 32,193,227, 11, 76,227, 83, 82,114,105,154,126,169, 15, 39, 77,211,143,226,226,226, 4, 54,214, 22,236,210, + 50,101,137,128, 98,184, 9,143, 30,198, 54,242,243,119, 5, 0,249,163,251, 87,121, 77,155, 9, 18, 50,179, 69,206,206,206,122, +113,150,149,149, 61, 78, 77, 77,101,217,216,216,176, 19,147, 83, 78,153,137, 69, 86, 38,102,102,109, 0, 64, 85, 92,120,159, 84, + 40,178, 89, 20,219, 38, 59, 55, 55,175,172,172, 44, 78,223,186,191,121,243,134,109,103,103,205, 58,123,254, 82,152,141,144,103, + 45,225,178, 77,120, 4, 65, 8, 89, 68, 17, 71, 67,231,240,133, 66,235,248,148,148, 60,134, 97,106,180, 16,174, 42, 24,209,191, +252,122, 45, 62, 92,133, 27, 79,159, 62,197, 31, 55, 95, 66,196, 40, 65,200, 11,113,126,215, 54, 12,159, 51,255,131,253,254,234, + 18, 91,245,178,102,109,105, 22,241, 14, 63,210,235,112,132, 31, 62,124,248,226,125,251,246, 85, 58,160,188,124,249, 18,157, 59, +119,214, 45,115,160, 91,183,110, 8, 8, 8,192,203,151, 47,225,230,230,134,203,151, 47,243, 88, 44, 22,111,196,136, 17, 43,246, +239,223,127,166, 78,187,255,214,173, 24, 51,102, 76,117,142,213,111, 0,200, 9,169, 71,201,188, 85,123, 44,243,114,115,144,149, +157,241, 88,223,118, 32, 8, 2,163,102,205,202,217,162, 84,226,192,189,123, 24, 41, 18, 9,119,199,196,160,103, 64, 0,188, 59, +119,206,209,167,175,211, 89,117,228,114, 57, 40,138,130,137,137, 9, 44, 44, 44,192,225,112,192,162,236,193,230,250,128,228,112, +224,215,193, 7,107,190, 17,149,134,116,199,122,130, 64, 1,143,139, 71, 28, 97,141,190, 58,132,168, 1,250, 49, 12,138, 74,147, +113, 69, 39, 72, 76, 27,194,148,146, 80,231,199,109,242, 48, 51,177,230,224,143,245,137, 56,191, 41,229,184, 60, 3, 11, 42,218, +130,174,101, 34,225,109,102,102,134,228,228,100, 36, 37, 37,189, 64,237, 14,254,165, 47, 95,190,140,229,241,120,158, 86, 86, 86, + 0,224, 82,211,196,156,166,233, 74, 63,172,189, 7,142, 90,250,118,116,229,127,218,222, 19,123,194,150,227,203,224,245,160, 88, + 4,180, 90, 21,126,254,165, 23,180,138, 18, 4,247,153, 64,124,210,213,205,231, 98,152,114,156,186, 44,127,219,123, 19, 1, 54, +150,253,223,208,219,102, 60, 49,233, 13,154, 48,179,180,180, 22,113, 56, 28, 88,152,216, 41,231, 79,252, 58,157, 97,152,202,231, +134, 98,113,212,100,177,121, 89,110, 70,137,192,140, 42, 3, 24,178, 81,253,162,217,124,124,164,164,164, 76,239,216,177,227,138, +226,226,226,124,153, 76, 54, 28, 0, 92, 92, 92, 26,146, 36,201, 3, 80,219,234, 72, 67, 84, 31, 22,130,243,236,217, 51, 72, 36, + 18,164,166,166, 86, 53,190,128,166,233,127,204, 38,128,127, 40,252, 0, 60, 2, 96, 7,160, 39,170,132,119, 32, 43, 76,117,159, +132,135,135, 51,225,225,225,159, 84, 14, 94, 12, 67,107,242,242,192, 40,202,219,150,162, 40, 6, 64,213, 29, 77, 66, 51, 51, 51, +130,114,116, 4,193, 43,119,253, 96, 62,226,214, 87,181, 90,191,208, 50,180, 22, 44, 16, 42, 48, 85, 38, 45, 50, 62,129,229,150, + 93, 48,157,187, 16, 25, 92,179,170, 35, 29,160, 97,160, 5,205, 50,176, 56,140, 76, 38,131, 70,163,145, 54,110,220,248,180, 70, +163,145, 86, 12,110,204,127,234,138,106,181,218, 88, 22,139,133,169, 83,167, 66,103,253, 81, 42,149,200,200,200,128, 66,161,128, + 82,169, 68, 92, 92, 28, 10, 11, 11,161, 84, 42,241,252,249,115,184,184,184,128,197, 98,217,213,210,153, 51, 12,195,192,201,201, + 9,141, 26, 53, 2,139, 96,176,125,245, 34,124, 55, 99, 18,134,186,208,216,185,241,103,116,234,212,169,153,179,179,115, 32,155, +205,214,218,218,218,114, 66, 67, 67, 79,105,181,218,126,208,191,231, 57, 51,111,222,188, 70,205,155, 55,183, 54, 51,145,168,121, + 92, 22,184,106, 25,195, 83,228, 50,236,210, 28, 56, 57, 53,212, 64, 32,116, 27, 57,114,164,182, 38, 43, 68,117,156,223,124,243, +141,157,135,135,135,169,212, 76, 34,227, 82,172, 44, 14,152,156,194,167, 15,238, 2, 0,215,202, 90, 14,190,208, 51, 36, 36, 68, + 99, 8,231,194,133, 11, 93,172,172,172,204, 72, 48,197, 90,149,234,207,245,118,133, 50,151,160,168, 50,112,184,254,211,166, 77, + 35, 12,225,156, 61,123,182,179,167,167,167,153,153,137,168,132, 77,177,210, 57, 52,157,206, 7,157, 65, 41, 85,249,124, 43,203, + 82, 8,197,126, 35, 71,142,172,145, 83,103,205,154, 59,119,110,242, 59,194, 27,121,121,121,144,103, 68,130,147, 26, 5, 31, 49, +133, 86, 86, 82,240,120,188,202,173,239, 53,221,174, 53,249,104, 85, 39,182,244,253,174,255,146, 90,150, 0,183, 52,139,120, 55, +110, 86, 90, 90, 26,236,236,236,106,125,158,246,239,223, 63, 63, 40, 40, 40,171, 91,183,110,202,211,167, 79,131, 32, 8, 92,190, +124, 25,169,169,169,232,214,173, 27, 24,134,209,237,106,195,227,199,143,209,181,107, 87,101,199,142, 29, 83, 43,226,107,213,137, + 49, 99,198, 64,173, 86,163,164,164, 4,121,121,121, 8, 15, 15,135,143,143, 15, 35, 20, 10, 7,176,156, 62, 91, 30, 60,110,126, + 91,175, 22,190,216,180,126,141,146,203,166, 86, 25,242,188, 18, 4,129,144,111,190,201, 41,244,243,203,219, 43,147,149,142, 50, + 49, 17, 54, 78, 78, 54,127,120,238,156,165, 74,165,210,139, 67,103,213,113,116,116,172, 20, 89, 28, 14, 7,108,174, 21, 88, 34, +111,112, 45,186, 65,104, 59, 0, 87, 30,241, 20,166, 34,156,144,136,113, 86,100, 86,115,104, 7,161, 19,150,183, 29, 98, 23,218, +110,168,221, 37, 97, 3,236,168, 24, 15, 72,134, 77,132,142,254,217,189,177, 85, 35, 1,238, 28,205,192,249, 77, 41,191,203, 51, +176, 8, 64, 76, 93,207,185, 74,165,146,107,181, 90,144, 36, 9, 54,155, 93,213, 39,240,214,239,191,255,142,135, 15, 31, 2, 85, +194,246, 20, 23, 23,107, 89, 44, 22,248,124, 62, 0,136,107,233,239, 64, 81, 20, 40,138,194,213,187,215, 45,134, 14,236, 69,220, +126,114, 1,237,124,134, 33,183, 68,133,204, 66, 21, 10, 74,129,230,173, 22,192,171,235, 9, 60,141, 43,134,111, 11, 47, 22,139, + 43, 10,169,142, 79, 30,143,100, 89, 18, 6,229,190,160,155, 40, 83, 4,127,220, 57,249,242,197,245, 99, 79,159, 31,250, 53, 44, +166,109,171,142,178, 10, 99, 2, 74, 74, 74, 24,130, 32,152,175,199,207,143,221, 59, 38, 95,187,126,248, 83,154,173,224,191,249, + 27,187,250,134, 86, 86, 86,183, 45, 44, 44, 46, 87,136,163,134, 18,137,228,150,157,157, 93, 20,202, 55,122,156, 76, 79, 79,247, +144,201,100,237, 80,190, 57, 43, 49, 55, 55,183,115,133,229, 41,177, 22, 75,216,142,162,162,162,175,180, 90,109,159,138,163,187, + 86,171,245,141,142,142,246,244,245,245,125,225,234,234,250,216,213,213,245, 15, 87, 87,215, 83,174,174,174,167,130,130,130,126, +209,133,123,248,139,151, 13,223,211, 34,255, 50,161,133, 10,145,181,181,226, 21,149, 66, 11,192,213,119, 29,208, 52, 60,222,115, +205,148, 41, 48, 59,117, 10, 84,116, 52, 70,135,132,152, 8,133,194,245, 40,143,209,212, 78, 44, 22,111, 90,180,104,145,196,114, +229, 74,216, 95,191,142,132,240,112,168, 41,234, 65,125, 74, 87, 86, 86, 6, 54,155, 93,105,137, 17,137, 68,208,106,181,168,206, +228,251,222, 3,168,193,157,212,204, 40,112,209, 8, 52,152,146,179, 69, 29,239, 13,139, 93, 96, 29, 94,228,226, 22, 35,227,184, + 45,177,106, 99,189,190, 97,251,123, 50,130, 93,194, 53,227, 35, 41, 41, 25, 90,208, 6,173, 55,203,229,242, 66,153, 76, 6, 95, + 95, 95,139,135, 15, 31, 54,246,241,241, 49,175, 56,127,255, 3, 47, 76,160,189,189,253, 81, 7, 7,135,120,123,123,251,163, 0, + 2, 13,248,238,142, 27, 55,110,128,197, 98, 97,209,162, 69, 40, 46, 46,134, 74,165, 66,110,110, 46,146,146,146,160, 84, 42,145, +146,146,130, 87,175, 94, 65,169, 84, 34, 33, 33, 1, 10, 69,221, 19, 18,154,166, 97, 98, 98, 2,121, 89, 9,126, 91,254, 29, 22, +206,157,137,194, 55, 17, 72, 73,203,132,153,169, 8,211,167, 79,103, 73,165, 82,154,166,233, 70, 90,173,182, 43, 77,211,155,245, +185, 78, 85,238,183,155, 78, 78, 78, 94,171, 87,175,246,252,110,249,102,142, 9,187,132,225, 73,248, 52, 87,194, 99,184,205,218, + 96,204,130,245,156,117,107,127,122,125,231,206,157, 84,232, 23,188,147, 4,112,211,207,207,207, 61, 53, 53,213,199,195,195,163, +169,101, 67,103, 30,207,206,161,128, 99,215,160,136, 81,200,239, 17, 14, 13, 58,108,222,188, 57,242,214,173, 91,105,134,112,138, + 68,162,102,123,246,236,241,178,177,177,241,162, 4, 2,126,105, 97,225, 17, 77,169,236, 40,203, 76,202, 39, 77,204,186,159, 56, +113, 34,226,248,241,227, 25,134,112,186,185,185,121, 44, 95,190,188,185,183,183,119,115, 91,151,198, 60,129,131, 83, 46,223,177, + 97,174,192,219,135, 7,199, 70,159,111,218,180,233,241,157, 59,119,244,226,100,177, 88, 26,146, 36, 65, 81, 20,132, 66, 33,206, +158, 61,139, 41,227,134,193,201,193, 2, 77, 61, 60,208,229,203,175,112,252,248,241, 74, 31, 30, 22,139, 85,227,136,190,123,229, +244, 48, 63, 59, 34, 2, 91,154, 69, 96, 75,179, 8, 63, 59, 34,162, 70,177, 85,241,247,234, 62,163, 87,111, 84,195,114,163, 30, + 98,235,204,213,171, 87,127, 28, 53,106, 20,183, 71,143, 30,184,119,239, 30,198,140, 25,115, 51, 52, 52, 20, 0,112,239,222, 61, +124,253,245,215, 55, 47, 93,186,132, 73,147, 38,161,115,231,206,220, 27, 55,110,108,130, 30,177,127, 52, 26, 13,118,238,220, 9, +141, 70, 3,177, 88, 12,115,115,115,244,234,213, 11,145,145,145,147,118,237,218, 21,197,162,168, 47,122,246, 25,136,211,167, 66, +241,234,121,228,164,221, 43, 70, 24, 28, 20,152, 36, 73,244, 8, 9,201,201,105,222, 60,111,119, 81, 81,233, 88,169, 84,232,145, +145, 97,126,229,232, 81, 75, 61,132, 26,161,213,106, 43,197,149, 78,116,232, 14, 54,215, 10,108,145, 23,216,146, 86,120, 26,195, + 81,115, 2,240,136,219, 10, 47,107,139,159, 69,113,201, 49, 3,190,115,193,128,239, 92,208,119,142,243,104, 97, 3,108, 23, 53, +192,228, 30, 51, 26, 5,185,182, 50, 69, 81,150, 10,225, 63, 39, 36,202,115,177, 18,192, 43,125,158,115,154,166, 95,164,166,166, +130,203,229,162, 65,131, 6,238, 0,116,126,129, 59,198,143, 31, 63,109,201,146, 37, 51, 1, 44,169, 56, 39, 14, 10, 10,106, 94, + 82, 82,130,232,232,104, 0,120, 88,139, 53,184,114,151, 97, 94, 81, 2,207,217,222, 27, 62,205, 38, 66, 42,109,129,212, 60, 37, +210,242,148,216,254, 91, 63, 68,220, 88,134,135,231, 71, 34, 49, 35, 3, 2,219,254,208,106, 20, 94,122, 76,234,237,159, 60,121, + 66,220,184,113,131,160,105, 26,106,181,154, 41, 46, 42, 98, 30,221,188,137,178,107,215, 8, 19, 19, 19,162,125,235,142, 37,187, +151,157,190,127, 98,227,205,135,170, 82,131, 39,234, 31,130,133,177,177,177,129, 71,143, 30, 13, 2,176,208,219,219,251, 78, 82, + 82, 82,219,235,215,175, 55,117,116,116, 92, 95, 95, 82, 93, 88,136,132,132,132,183,142,138,176, 16,202, 10,209,208,163, 66,204, +245, 5,240, 53, 62, 96,151,189, 1,184,250, 47,118,134, 63,141,119,118, 27,190, 43,180,170, 6, 10,131,171, 84, 42, 81,171, 85, + 41, 23, 46, 92, 80,145, 36, 9,161, 80,136, 81, 99,198,144,191,253,250,107,135, 97,129,129,151, 39,124,250,233, 31,151, 47, 93, +242, 11, 8, 8, 0,195, 48, 32, 73, 18,135, 15, 31, 46,147,203,203,114,157,156,156,204,244,233, 52,170, 62, 64, 69, 69, 69,149, + 66,171,176,176, 16, 54, 54, 54,122, 47, 29,202,138,112,241,210,217,136,124, 70,251,101, 82,143,152,181,170, 85, 25,253, 2, 10, +104, 45,187, 80,171, 70, 97, 25,131, 98, 57,216,247, 72,243,128, 81,110,253, 85,113, 93, 3, 94, 93,139,186,157, 43,215,202, 13, +218, 45,145,149,149,245, 93,112,112,112,174,157,157, 29, 97, 98, 98, 2, 7, 7, 7,178,111,223,190, 57,201,201,201, 75,234,123, + 69, 44, 44, 44,134, 6, 5, 5,133,165,166,166, 14,186,118,237, 90,163,235,215,175, 15, 10, 10, 10, 10,179,176,176, 24,170, 39, +197,145,249,243,231,203,184, 92, 46,218,180,105,131,226,226, 98, 84,236,242,169,245,208,103,137,148,195,225, 96,203,234, 31,176, +112,238, 76,228, 69,221,195,211,155, 23,112, 53,131,192,130,229, 63,129,195,225,212, 43,214, 87, 19, 43,161,183,183,189,228,229, +215, 99,134,164,205,155, 59, 87,242,248,241, 99,106,218,140,175,153,132,244, 60,112,123,172, 97,225,147,239,200, 39, 50, 43,244, +236,222, 5,139, 22,206,242,174, 8,218, 89, 43,154, 89, 9,189,189,236, 37, 47,102, 77, 24, 22, 59, 99,198, 12,193,170, 85,171, +228,129,129,129,101,153,153,153, 2,145,212,220,131,109,106,230,149,144,158, 33, 14, 12, 12,140,251,242,203, 47, 11, 12,229, 92, +176, 96,129,240,220,185,115,236,224,224, 96, 77,126,126,190,152, 18, 8,124, 9, 30,191,117,118,126,190,233,160,224,224,152, 65, +131, 6,149, 86, 4, 44,213,155,243,251,239,191, 23,190,122,245,138, 29, 24, 24,168,206,200,200,144,136, 44, 44,125, 88,102,230, +173,226,211, 51, 77, 90, 7, 4,188,153, 54,109,154,172,182,114, 86, 21, 41, 18,137, 36,181, 93,187,118,248,249,231,159,177,110, +221, 58,124,254,249,231,136,124, 30,137,158,211,102,194,115,242,215, 56,117,251, 46, 82, 83, 83,177,116,233, 82,248,248,248,128, +195,225,188,170,246,121,156, 20, 69, 60,206, 0,241, 56, 3, 4, 49, 41,138,208,189,175,209,178,181,164, 16, 85, 63, 95,221,231, + 30,126, 95,189,165,203,207,142,136,168,205, 15,171, 46,177, 53,104,208,160, 41,186, 16, 14, 99,199,142,189,185,126,253,250,246, + 99,199,150, 79,180,219,180,105,131,101,203,150,181, 95,176, 96,193,205,229,203,151,163, 75,151, 46,112,117,117,173,115,227,139, + 86,171,133, 70,163,193,176, 97,195,160,209,104,144,157,157,141,215,175, 95, 99,235,214,173, 96, 24,134, 15, 0,118,246,142,254, + 92, 46, 23, 79, 30, 61, 40, 93, 56, 54, 96,191, 1,150, 44,162,234, 36,166,164,164, 4,131, 38, 79,206, 73,105,210, 36,111,115, + 78, 78,233, 56,169, 84,232,156,152,104, 46, 81, 42, 29, 80,139, 95, 34, 65, 16,160,105,186, 82, 88,233, 4,215,187, 71,197, 64, +169, 23, 84,165,244,153,235,251,210, 0, 0, 29, 71,216,163,239, 28,231,209,118,110,194, 13, 29,134,151, 27,189,143, 47,139,101, +138,211,180,171,160,198, 11, 3, 44,214,247,238,221,187, 7, 51, 51, 51, 4, 7, 7,243, 72,146, 92,169,155,175,162, 60,118,214, + 90, 29, 23,143,199, 91, 51,114,228, 72,178,160,160, 0, 79,159, 62, 5,128, 75, 53,245, 75, 12,195, 84,214,189, 36,143,128,150, +230,226,214,163,179, 56,127,253, 24,226, 83,179,145,152, 37, 7,216,166,144,203, 82,160, 42, 75,133,178,224, 17,138, 20, 66,189, + 10,204,225,112,178,189,189,189,153, 86,173, 90, 49, 12,195,224,205,155, 55,154,132,196, 68,205,131, 95,126, 97,158, 77,156, 72, + 72, 94,191,230, 8, 4, 2,194,197,197, 5,124, 62,159,230,243,249,185,127,227,224,253,151,132, 91,248, 11,194, 66,124, 76,171, + 22,131,127, 39,210,241,246,110,195,202, 0,166,213, 5, 44, 5, 99, 34, 24,114,108,211,111,166,193,195, 70,200,124,124,124,164, + 14, 14, 14, 32, 8, 2,253,250,247, 39,130,174, 93,147, 80,246,246,176,104,217,178,114, 57,226,226,133, 11, 56,123,246,172,236, +244,239, 39, 28,198,140, 27,215, 27,192,158, 90, 10,195,230,241,120,149,191,155,158,158, 14, 30,143, 87,233, 19, 81, 84, 84, 4, + 43, 43, 43,164,167,167, 67,207,149,185,189,243,230,222,157,155, 21,240,157, 75,128,132, 34,254,144,101, 64,203, 48,160, 8, 45, + 80,198, 64,173, 5, 20,106, 6,254,206, 44,243,243,101, 26,105,248,189,208, 56, 0,123, 13,105, 61,133, 66,113,229,241,227,199, + 19,105,154, 62, 6,128,188,118,237, 26,253,226,197,139, 41,208,223,113,253,125,179,189, 80, 56,231,242,229,203,230,115,230,204, +201, 15, 15, 15, 47,236,213,171,151,233,214,173, 91,205, 59,119,238, 60, 39, 55, 55,247,144, 62,134,192,164,164,164, 61,201,201, +201, 83, 90,181,106,133,188,188, 60,168, 84, 42, 68, 68, 68,192,205,205, 13, 15, 31, 62,132,187,187, 59, 30, 60,120,128,166, 77, +155, 66,171,213, 66, 46,151,131,166,105,109, 93,157,121, 94, 78, 54,144,155,132,180,123,127,224,245,179, 8, 92, 78, 35,176,241, + 80, 24, 26, 52,114,169, 87,156, 26,119,107, 97,115, 59, 43,139,243,171, 22,127,111,157,112,229, 48, 66,119,110,164,175,254,241, +135, 39, 87,130,137,159, 12,251,106,160, 82,141,134, 0,184,109, 3, 90,161,135,244,149, 86,216, 8, 25,151, 95,212, 30, 96,209, +221, 90,216,220,198,210,226,220,255,173, 92, 34,121,115,118, 55,142,108,249,153, 57,190,239,160,143, 28, 8,104,222,188,121, 15, +146, 36,205, 0,200, 43,252,188,244, 74,109, 83, 29,231,197,176, 48, 63, 57, 16,112,242,228,201, 30, 66,161,208, 22,128,186,180, +180, 52,246, 67, 56, 47,133,135,251,233,202, 73, 16,132, 53, 0, 21,195, 48,111, 96, 96, 10,158,193,131, 7, 47,251,250,235,175, +231,106,181, 90,171, 42,179,115,214,154, 53,107,216, 52, 77,179, 24,134, 81,145, 36,169, 58,119,238,156, 86,163,209,164,201,229, +242,201, 31,210,139, 12, 28, 56, 16,119,239,222, 93,140,242, 77, 24,250, 90,171,223,242,211,170, 72,217, 83,111,254,107,215,174, + 45,253,226,139, 47,230, 29, 58,116,232,245,250,245,235,251, 76,154, 52, 9,135, 15, 31, 70,147, 38, 77,240,228,201, 19,124,247, +221,119, 0,208,126,193,130, 5,167,118,236,216,225,154,144,144,176, 70, 15,139, 6, 52, 26, 13, 14, 30, 60,136,126,253,250,193, +202,202, 10,246,246,246, 32, 8,226,202,184,113,227,126, 5, 0, 22,193,226, 0,128, 66,174, 80,120,120,180,210,219,130,203,225, +112, 42,251,186,140,140,140,202,157,130,159,125,241, 69,206,246, 85,171,176,191,172, 12,227,164, 82, 97,138,163,163,221,169, 55, +111, 38, 60, 47,239,156,153,218,172, 58,117,137, 44,125, 93, 26,202,210, 49,255,247, 21,241,182, 0, 62,239, 56,194, 30, 29, 71, +216,163, 85, 95,107,130,100, 17,120,118, 62, 23,145, 23,243,142,171,139,112, 5,134,165,203,121,177,114,229,202, 83,159,124,242, + 73,159,102,205,154, 97,252,248,241, 95,238,220,185,147,163, 86,171,103,224,207, 48, 15,166, 36, 73, 46,217,178,101,203, 4,115, +115,115,220,184,113, 3,215,175, 95,191, 2, 32,169,166,126, 9, 64,101,204,172, 6, 78,238,242, 87, 9, 37,194,172,212, 91,184, +121,227,119, 52,241,249, 10, 2,219,222, 48,247, 88, 14, 85,212, 58, 40,115,207,195,220,169, 23, 82, 18,222,128,197,230, 69,214, +229,132,194, 48,204,243,148,148, 20, 87, 87, 87, 87, 34, 62, 62, 94, 3,128,209,106,181,140,170, 67, 7,181,231,170, 85, 84,228, +151, 95, 18,109, 95,189, 98, 49, 4, 65, 71, 68, 68, 0,192,203,255,196, 40,174, 11,183, 16, 25, 25, 89, 83,184, 5,131,224,237, +237,221,254,250,245,235, 60,185, 92,142,171, 87,175,162,117,235,202,189, 93,255,209,232,247, 85,181,200,191, 12, 19,170, 57,183, +245, 45,139,214, 91, 55, 54, 77, 80, 77,221,221,181, 28, 18,187,250,245,238, 93,250,248,241,227,202, 89,159,252,254,125,200,206, +158,133, 86,171, 5,195, 48,184,126,237, 26, 70,142, 24, 81, 66,177,136,237,206,206,141, 24,130,121, 43,118, 75,215,106,102, 15, +193,193,193,193,149,157, 79,114,114, 50, 68, 34, 17,184, 92, 46,104,154,134, 70,163, 1,139,197,130,169,169, 41, 52, 26, 77,117, + 38,152,119, 57,213,218, 60,217,160, 29, 61,135,167,219,151,168,152,137,102,206,104,200, 17, 84, 62,156,182, 38, 4,250,248, 80, +176,100,103, 49,151,214,124,154, 70, 43,114, 7,225,253, 29, 93,117,109,249,119,111,209,162,197,175, 35, 71,142, 36, 1,160,107, +215,174,100,139, 22, 45, 54,160,246, 84, 57,181,114,242,249,124, 30, 0,132,133,133,229,189,126,253,250,243,176,176,176,188,170, +231,245,228,220,186,122,245,106, 8,133, 66,104, 52, 26, 40,149,202, 74,255,172,170,175, 42,149, 10,150,150,150, 56,125,250, 52, +180, 90,237,233,186,202,233,212,176, 17, 8,171,198,216, 19,118, 25,215,115, 56,245, 17, 89,149,156,141,109, 69, 77,109, 45, 45, + 46,252,223,138,165, 86,249, 49, 17, 72, 73, 73, 97,206,157, 61,125, 71, 14,164, 22, 22, 99, 97,129, 12, 77,203,148,224,183,118, + 69,210,133, 45,223, 50, 11, 58, 66,141,234,119, 13, 86,114,122,218,138,154, 58, 88, 89,156,251,233,255, 86, 72, 10, 98, 34,144, +158,145,129, 51,167,195, 30,203, 1,221,114,227,104,154,166,189,104,154,246, 2, 48,186, 22,241, 98, 16,103,105,105,169,119,105, +105,169,247,199,228,100, 24,198,155, 97, 24,189, 57,171,250, 68,173, 93,187, 54, 42, 61, 61,125,100, 86, 86, 86, 55,221,145,159, +159,223,181,164,164,164, 83,105,105,105,135,178,181,141, 76, 75, 75, 75,173, 75, 74, 74,236,228,114,185, 63,128, 8, 3,238,249, + 74, 84,141, 58,157,158,158,190, 40, 61, 61,157,168,171,156,172,201, 81,196,129,159,102,253,190,101,203, 22,187, 15,228,127,171, +156, 57, 57, 57,199, 14, 29, 58,228,235,226,226,226, 58,122,244,104,108,222,188, 25,235,215,175, 87, 0,192,142, 29, 59, 20, 85, + 44, 89, 78, 9, 9, 9,173,106, 88, 54,236, 90,197, 90,178,247,179,207, 62, 99,174, 95,191,142,126,253,250, 85, 6, 18,221,182, +109, 27, 52, 26, 77, 81,151, 46, 93,104, 0, 40,147,151, 22, 49, 52, 3,165,170,198,245,247,247,218,147,203,229,118,175, 26, 47, + 80, 23,140,153,203,229,130, 97, 24, 52,109,223, 62,167,192,199, 39,111,103, 97, 97,233, 34,111,111,147, 9, 30, 30,163,155, 1, + 35,170,227, 36, 8,226, 45,171,206,187,135, 1,150,172,170,229,204, 42, 75,195,248,223, 87,196,159,213, 89,182,248, 98, 54,228, +197, 26,156, 88, 21,159, 45,207,198,182,154,196, 79,109,117,207,203,203,155,182,106,213, 42,133, 84, 42,197,192,129, 3,177,124, +249,242,113,237,219,183, 47,180,182,182,190,219,164, 73,147,103, 67,134, 12, 73,143,136,136,152, 22, 20, 20,132,232,232,104,252, +244,211, 79, 5,249,249,249,195,107,227, 36, 8,162,210,146,215,183,103,215,188,223, 54,252, 76,119,249,100, 10,132, 2, 19,168, + 41, 39,228,149,168,145, 47, 99,160,228, 5,128,203,225,161, 91, 96,115,220, 61,183,187, 84,171,148,237,169,235,158, 47, 41, 41, + 57, 62,106,212,168, 34, 14,135, 3,165, 82,201, 80, 20, 5, 94,185,223, 49, 77,125,254,185,170,237,139, 23, 26, 45,195,208, 4, + 65,224,155,111,190,145,229,231,231, 31,170,207,115,100, 0,170,114,126,172,112, 11, 93,223, 25,127, 62, 70, 88,136,191,162,238, +255,102,108,173,230,248,211,162,165,219, 82,169,123, 37, 8, 90,171,213,210,112,118,113,150, 36,196, 39,109, 28, 60, 56,120,108, +143, 30, 61,133, 61,123,246,228, 55,143, 42,159,141,134,133,133, 33, 52, 52,180,244,252,249,243, 69, 60,138,181,195,169,129,147, +141, 86, 75,131, 32,232, 90,213,176, 68, 34,153, 49,127,254,124, 65, 97, 97, 33,214,175, 95, 79,251,250,250,146, 34,145, 8, 42, +149, 10, 59,118,236, 80, 55,111,222,156, 34, 73, 18,133,133,133, 32, 73,242,149,158, 21,124, 90,152,148,218,237,215,160, 1,161, +173,166,142,177,240, 12,106, 43,237,228,228, 0,117, 75, 6,105,201,241,120,125,233,124,254,243,115,191,228, 66,158, 57, 0,117, +167, 7,170,110, 32,248,225,252,249,243,214,211,166, 77, 99,228,114, 57,145,148,148,196,172, 88,177,194,122,252,248,241, 63,164, +165,165, 13,173,231, 69, 33, 10, 10, 10, 64, 16, 4, 93,209,145,232,102,253,134,172,203, 69,238,217,179,231,100,255,254,253,251, +118,233,210, 5, 81, 81, 81,149, 75,132, 85,133,150,110,247,225,202,149, 43, 11, 0,204,171,139,148,162, 40,172,223,115, 12, 5, +249, 57,176,177,177, 7, 95, 32, 64,125,119, 88,114, 73,114,209,143, 75,191,183,206,121,121,151,136,188,115,153, 62,250, 52, 51, + 75,163,101,170,143,248, 95,156,198, 84,168,255,218,103, 51, 36,107,209,143, 43,150,152,234,150, 53, 15, 61, 74, 47, 34,180,204, +180, 15,122, 68,254, 45,156,127, 51,236,237,237,145,158,158, 78,216,219,219, 51, 21, 62, 90, 76, 45, 66,235,237, 27,188,124,185, +140,168,109,217,176,190,252,113,113,113, 43, 90,182,108, 57, 43, 58, 58,250,168,167,167,231, 36, 0, 13, 20, 10, 69,193,130, 5, + 11,254,111,199,142, 29, 99,245,177,100, 1,192,225,195,135,127, 25, 51,102,204,217,222,189,123,127, 75,211,116,139, 42, 3,123, +156,181,181,117,229, 18,110,118,102,198,220,137, 99,135,205, 45, 41,201,215, 59,206,157, 88, 44,158,176, 96,193, 2,190, 76, 38, +195,166, 77,155,232,230,205,155,147,186, 73,209,190,125,251, 52,238,238,238,236,224, 41, 83,114,214, 95,111, 53, 45, 0, 0, 32, + 0, 73, 68, 65, 84,102,100, 96,217,141, 27,178,185, 94, 94,190, 59, 95,191,246, 7, 77,239,173,201,170, 83,157, 37, 75,231,118, + 81, 79,164, 85,136,173,109, 0, 62,111, 59,216, 22, 39, 87,199, 35, 63, 65,249,127,208,224, 13,244, 72, 11, 84, 13, 82,142, 31, + 63,222, 45, 51, 51,243,228,247,223,127,111,234,239,239, 15, 47, 47, 47, 74, 44, 22, 7,232,194,197, 20, 22, 22,226,226,197,139, +216,188,121,179,242,249,243,231,253,107, 91,174,210,106,181, 89,238,238,238,186,118, 96, 8,130,200, 45, 82, 16,166, 71,154, 5, +136, 71, 79, 60, 74,220,124,112, 27,105, 42, 26, 10, 53, 13,103, 23, 63,116,250,124, 45, 78,253,241, 76,155,150,240,226,133,186, + 44,127,187, 30,229,125, 19, 19, 19,115, 98,233,210,165,131,191,253,246, 91, 65, 78, 78,142, 86,161, 80,208,199,142, 29, 99,141, + 30, 61, 90,203,176,217, 52,135,205,198,140, 25, 51,202, 10, 10, 10,126, 7,254,214, 4,211,127, 73,184,133,191, 32, 44,196, 71, +179,102, 85,125,253,111, 65,181, 79, 40,205, 34,111,109,222,242, 91,247,195, 7, 15,217,178, 88,164,237,155,216,216, 7,125, 6, + 12, 74,189,112,225,130, 57,199,212,180, 53, 0, 90, 57,105,210, 29,149,162, 44, 47,252,228,201,134,206,206,141,124, 42,146, 74, + 51, 52,139,188, 85,219, 15,150,148,148,200,110,220,184, 81, 58,111,222, 60, 34, 57, 57,249,128,141,141,205,144, 63,254,248, 67, + 60, 96,192,128,178,168,168,168,227,182,182,182,125,131,130,130, 36,179,102,205, 82,148,148,148, 24,146,120,244, 5,147,157,223, +236,254,247,107,190,184,191,250,183, 79,193,102,181,131,130, 2,104,245, 45,168,138, 47, 0, 56, 0, 3,226, 29, 85,133, 72, 36, +242, 17, 10,133,120,252,248,113,126, 64, 64,128, 82, 46,151,115,150, 47, 95,110, 33, 18,137,124,234,219,240, 12,195, 48,249,249, +249,160,105,154, 13,128,168,120, 5,109,248, 94,252,161,125,250,244, 57,121,228,200,145,207,122,246,236, 9, 87, 87, 87,168,213, +106,184,187,187, 67,169, 84,194,205,205, 13, 10,133, 2,139, 23, 47, 70, 97, 97,225, 76,212,146,243,140, 32, 8,104, 52,154, 74, +103, 91, 7,199,134,229,113,122, 62, 32,140,133,136, 34, 93, 95,133,239, 68, 86,110, 14,125,228, 73,102,102,169, 74,219, 45, 38, +187,244,249,187,159, 43,213, 66, 22, 52,122,122, 42, 0, 40,232,218, 51,206,139,184,112,125,125,122, 27, 50,179,114,112,248, 81, +122,129, 76, 69,127,254,186, 26, 78,131,202,249, 47,225,244, 91, 28,133, 65,211,245,255,236,135, 64, 95, 65, 85, 19, 30,103,128, +120, 40,220,201, 96,203,206,106, 99,100,125, 32,255,201,232,232,232,147, 0,240,226,197,139,228, 97,195,134,205,141,143,143, 95, + 10,224, 76, 66, 66,194, 22, 67,136,118,238,220, 25, 13, 96, 76,109,159, 57,180,102,204, 9, 0, 39, 12,225, 45, 46, 46,150, 71, + 68, 68,200,103,205,154, 69, 36, 39, 39,255, 97,107,107,251,217,217,179,103,133, 3, 6, 12, 80, 68, 70, 70, 94,178,183,183,239, +216,181,107, 87,241,153,123,247, 82, 75,223,188, 9, 15,143,143,119, 84,211,116,120,109,207,231, 71, 22, 89,111,137,173, 19,203, +226,127, 60,249, 99,124, 87, 90,129,227,202,124,220, 1,144,242, 1,156,215,111,221,186,229, 57, 98,196,136, 35,189,122,245,106, +235,233,233,137, 6, 13, 26,224,245,235,215,200,206,206,198,211,167, 79, 17, 22, 22, 22, 38,151,203,235, 76,168,157,151,151,247, +126,122, 34,190,185,253,238, 77,139,194, 30,220,108,237,222,161,231, 40,129,151, 61, 13,165,138, 65,114,226, 27, 44, 94,184,189, + 52, 61, 49,250,133, 74,163,234, 15, 61, 55,234,148,149,149,109, 93,183,110, 29, 21, 30, 30,222,115,227,198,141,146,134, 13, 27, +178, 56, 28, 14, 9,128,121,248,240, 33, 51,125,250,116, 89, 78, 78,206,233,162,162,162,173,127,243, 24,125, 61, 54, 54,214,143, +197, 98,125,212,112, 11, 31, 16, 22,194,136,143, 9, 23, 23, 71,207,198, 13,237, 39,185, 54,112,156,226,210,208, 41,164, 58, 39, +119, 87,169, 84,226,210,200, 97,130,107, 3,199, 41,141, 27,218, 79,114,113,113,244,212,195,180,232,106, 98, 98,242,135,157,157, +157, 47, 0,152,154,154,246, 53, 51, 51,123,110,106,106,218,183, 98, 22,216, 87, 44, 22,191,108,222,188,249,248,191,209, 92, 89, + 43,167,187,187,251,176,146,146,146, 47,221,221,221,135,233,222,191,121,243,166,242,125,125, 56,157,156,156,186, 60,124,248,112, +232,154, 53,107, 6, 54,105,210,164,239,138, 21, 43, 6,254,254,251,239, 67, 29, 29, 29,253,235,193,201, 3,176,159,162,168, 76, + 46,151,155, 69, 81, 84,166,238, 96,179,217,153, 44, 22, 43, 19,192,150, 26,172,101, 93,171,204,114,110,218,216,216, 36,216,216, +216, 36,216,218,218, 38,216,218,218, 38,216,217,217,189,119, 88, 90, 90,222,212,183, 61, 61,108,197,237, 3, 26, 72,110,121,219, +137,111, 54,179, 17,121,124,140,107,228, 97, 43,110,223,186,129,233, 45,111, 59,201,141,255, 53, 78, 95, 91, 48,204,102, 15,134, +217,236,193,248,218,130,169,235,253,199, 52,251,219,217,217, 49,118,118,118,139,254,170,165,132, 26,248,255,246,231,253, 35,114, +186, 74, 36,146, 67, 13, 26, 52,208,245,117,189, 77, 76, 76,174,136,197,226,222, 21,125, 93,111,145, 72,116,173,121,243,230,163, +234,226, 52, 55, 55,127,104,109,109,157, 81,113,164,219,216,216,164,219,216,216,164, 91, 91, 91,167, 89, 91, 91,167, 89, 89, 89, +165,234, 14, 51, 51,179,187,245,172,187, 53,128, 54, 0,252, 1,152,124,196,246,116, 1, 48,177,162, 15, 90, 5, 96, 60,128, 22, + 31,225, 26, 17,148,192,124, 50,207,204,233, 22, 37,182, 42,166,196, 86,197, 60, 83,199, 91,181,164,224,209,135,179,169,185,185, +249,114, 19, 19,147,223, 37, 18,201, 13,137, 68,114,210,210,210,114, 5,128,166,255,161,123, 73, 12, 96, 7,202,227, 51,157, 65, +249, 82,248, 73,148,111, 42,104,248, 15,188,231,255,151, 49,225, 63,245,195, 93,141,156, 70, 78, 35,167,145,211,200,105,228,252, + 23,114,146,198,246, 52, 10, 45, 3,133,214,187, 7,128, 90, 34,195, 27, 97,132, 17, 70, 24, 97,196,255, 48,104, 99, 19, 24, 97, + 32,170, 93, 90, 38,106, 81,165,134,196,154,170,143,178,189,104,228, 52,114, 26, 57,141,156, 70, 78, 35,167,145,243,127,142,211, +136,143, 8,163, 89,213,200,105,228, 52,114, 26, 57,141,156, 70, 78, 35,231,127, 59,140, 75,135, 70, 24, 97,132, 17, 70, 24, 97, +132, 17,127, 17,182, 86, 17, 92,111, 45, 33, 26,133,150,225, 32, 1,124, 9, 96, 16,128,198, 40,207,102,127, 12,192,175,168,223, +154,190, 9,128,185, 0,218,161,124,119, 78, 28,128, 27, 40,223,157, 83, 98,108,238,234, 97,105,105, 57,159,162, 40, 51,160, 60, +181,137,238,181,234,255,181, 90,109, 65, 81, 81,209,138,191,168, 8, 44,232, 25, 65, 89, 87,214,170,101,171,250,170, 86,171,255, +202,114, 26,241,207,132,187,185,185,249,254,188,188,188,225,168,146,100,217, 8, 35,254, 27, 96,101,101, 53, 73,165, 82, 45,224, +112, 56,203,179,179,179,127,251, 31,170,250,123, 34,235, 45,161, 21, 30, 30,126, 13, 0,122,245,234,245, 9, 0,152,153,153,221, + 38, 73,210,197,144, 95,160,105, 58,174,160,160,160,198, 0,106,102,102,102,183, 89, 44,214,123,156,106,181, 90,194,102,179,139, +171,251,142, 70,163, 73, 41, 42, 42,242,255,135, 52, 34, 1, 32, 92, 42,149,202,151, 46, 93,250,107,167, 78,157,156,210,210,210, + 52,115,230,204,233,248,228,201,147,158, 0,186, 27, 40,182, 2, 9,130,216,237,235,235,123, 34, 36, 36,228, 72, 64, 64, 0, 55, + 55, 55, 87,114,236,216, 49,135, 61,123,246, 68,208, 52, 61, 28,181, 36, 90,253, 95, 6, 69, 81,102, 41, 41, 41, 18,160, 60, 53, + 73,133,176,130, 90,173,134, 90,173,134, 76, 38,131,143,143,207, 71,255, 93, 91, 91, 91, 63,130, 32, 54,138,197, 98,255,146,146, +146, 7, 0,166,164,167,167, 63, 49,164,172, 26,141, 6, 12,195, 84,150,211,211,211,211,120, 65, 13,195, 56, 46,151,251,185,155, +155, 91,107,133, 66,145, 31, 23, 23,119, 95,171,213,126,143,143,151,163,205, 20,192,247, 60, 30, 47,160,113,227,198, 78,209,209, +209,201, 42,149,234, 30,202,147, 33, 23,126, 12,145,245,201, 39,159,220,220,180,105,147,197,228,201,147,111,222,184,113,163,189, + 81,108, 25,241,159,130,147,147,147,153, 76, 38,219, 14,192,143,162, 40, 91, 62,159, 15,129, 64,144,193,227,241, 30, 11, 4,130, +177,183,110,221, 42, 48,148, 83,171,213,126,159,144,144, 96,219,166, 77,155,213,214,214,214,139,115,114,114,228, 42,149,234, 82, +126,126,254, 76, 0, 69,181,125,247, 93, 45,242, 47, 19, 89, 85, 95,161, 19, 93,236,138,138, 49, 0, 58,189,165,192,216,108,199, +196,196, 68,107, 62,159, 15,154,166, 43, 7,179,119, 15,221,121,165, 82, 9, 47, 47, 47, 85, 29, 3,142, 83,114,114,178, 53,151, +203,173, 60,167, 84, 42,225,224,224, 64,167,164,164, 88, 87,164, 61,168,132, 66,161,128,163,163,227, 63, 41,231,209,151,230,230, +230,133, 73, 73,201, 62,114,133,106,201,248,105,243,230, 15, 31,244,169,244,246,237,219,116,247,238,221, 21,215,174, 93,251, 18, +229,137, 83,245,234,204, 9,130,216, 51,103,206,156,197,124,161,137,197,229,219, 47, 20,123,142,157, 78,245,117,119, 38,102,206, +156,201,154, 62,125,250,117, 63, 63,191,253, 52, 77,183,132, 1,150, 45,169, 84,122,150,199,227, 53,170,104,191,164,252,252,252, +207,254,129, 55, 36, 27,239, 7,143,173,238, 92,157,200,205,205, 69, 89, 89,217,123,135,167,167,167,190,185, 50, 13, 42, 55, 69, + 81, 39, 87,174, 92,233,144,145,158,142,159,215,174,109,131,114, 75,102, 27,125,190,156,149,149,245, 94, 57, 61, 60, 60, 96,132, + 65,152,187,120,241,226,149, 95,124,241, 5,180, 90, 45,202,202,202,236, 99, 98, 98,154, 47, 88,176,160,255,155, 55,111, 90, 3, +136,253,208,201,184,155,155, 91,212, 87, 95,125,101,222,186,117,107, 84,100,169,176,191,113,227, 70,155, 29, 59,118,140, 76, 74, + 74,242, 0,144,253, 33, 63, 96,110,110,190,127,219,182,109, 22, 66,161, 16,167, 78,157,178,232,210,165,203,141, 71,143, 30,117, +248, 0,177, 69, 90, 88, 88, 76, 7,208,153,166,105, 46,128,123,249,249,249,203, 96,120, 84,119, 59,177, 88,124,156, 36, 73,103, +224,207,104,244, 36, 73, 90, 18, 4,145,163, 59, 71, 16,132, 53, 77,211,119,242,242,242,218, 26,111,199,127, 55, 44, 44, 44,198, +101,102,102,110,226,241,120, 28,169, 84, 10,161, 80, 8, 54,155, 13, 54,155,221,128,199,227, 53,224,241,120, 61,130,130,130,166, + 92,185,114,165,214, 8,251,129,190, 54,163, 65, 18, 75, 88, 4,201, 2, 0,146, 18,153,152,154,154, 98,201,146, 37,162,190,125, +251,138, 0,224,230,205,155, 33,163, 70,141,234,146,146,146,226, 85,147,216,170, 78,139,252,139,176,181,182, 1, 15, 21,234,241, +218, 91, 79, 46, 73,130,203,229,226,238,221,187,208, 39, 88,185, 46, 69, 66,173,189, 65, 69,132,241, 39, 79,254, 52, 0,232, 6, + 26, 46,151,139, 91,183,222, 14, 42, 31, 24, 24, 88,249,176,255, 93, 24,228, 89, 30,228,241,232,212,242,114, 5,111, 44,143,174, +125,116,170, 7, 58,254,148,136, 65,211, 23, 13, 41,149,171, 90, 1,144, 21,228,231,231, 63, 8, 13, 77,243,117,119,231,236,223, +191,191,181,131,131,195, 32, 3,132,214,220,150, 45, 91, 30,103, 9, 76, 45, 67, 70,141, 14, 25,203, 38, 85, 35, 39,206, 90,158, +156,158, 35,155, 48, 97, 66,232,169, 83,167, 66,126,252,241,199,151,179,103,207,158, 11,224, 59,125,203,207,231,243, 27,189,122, +245,202, 77,171,213,194,211,211,243,159,152,198,192, 23,229,193,247,190, 0,112,176,226,220, 48,148, 71,238,247, 3,240,216, 16, + 50,157, 5,171,186,227, 99,195,193,193,193, 99,196,136, 17,150,121, 57, 57,248,121,237, 90,221,105,127,212,177,140,168,123,126, +148, 74, 37, 6, 14, 28, 56, 66,171,213,178,117, 34, 80,161, 80, 40, 11, 11, 11,229,248,211,177, 52, 27,192,167,122, 20,199, 69, + 36, 18,253, 31, 0,191,178,178, 50, 7, 0, 16,137, 68,169, 52, 77,159,144,201,100,223,225,207, 4,190, 6, 79,112, 1, 52, 71, +205,169,160,152,149, 43, 87, 70,207,155, 55, 47,246, 63,192,217,200,198,198,102, 69,112,112, 48, 78,159, 62,141, 51,103,206,168, + 5, 2, 1,123,212,168, 81,196,148, 41, 83,164, 95,125,245, 85, 15, 0,235, 62,240, 50,247, 88,188,120,177,121,179,102,205,112, +236,216, 49, 60,125,250,180,204,205,205, 77,208,169, 83, 39,176,217,108,243,249,243,231,119, 7,176,251, 67,126, 32, 47, 47,111, +217,172, 89,179,246, 28, 60,120, 80, 18, 23, 23,135,141, 27, 55, 90, 14, 25, 50,228, 90, 82, 82,210, 39, 6,136, 45, 30,128,233, + 0,130, 88, 44, 86,135, 81,163, 70,105,166, 77,155, 70,145, 36,169, 94,187,118,173,213,142, 29, 59,134, 80, 20,229,151,155,155, +171,207, 36,141, 4,176,100,236,216,177, 99,174, 92,185, 34,189,127,255, 62,215,194,194, 2, 90,173,182,210, 82, 76,211,180,181, +238,158,213,104, 52,240,240,240,112,172,242,125,193,191, 85,104,144, 36,169,162,105,154, 2,192, 7,160,168,235,253,127,147,200, + 50, 55, 55,159,156,151,151,247,171,173,173, 45,108,108,108,222, 27,107, 21, 10, 5,248,124, 62,199,214,214,118, 91,223,190,125, +169,147, 39, 79,214,184, 4, 72,176,136,239, 79, 29, 90,234, 96, 46,149, 0, 0,126,217,124,174, 20, 0,126,255,253,119,164,165, +165, 65, 42,149,194,203,203,139,181,116,233, 82,187,153, 51,103,254,156,159,159, 63,182, 38,174,119,181,200,191,204,162,181,181, +186,247,181,250,104, 49, 12, 83,153, 39, 79,207,155,246,221, 83, 23,223,225, 35,148, 74, 37,222,181,104,233, 30, 94,138,162,222, + 53, 63,130, 32, 8,166, 54,206,106, 48, 74, 36, 18,249,200,100,178, 13, 6,204,110, 43, 57,143, 78,245,192, 30,222,156, 97,186, + 76,164, 61,102,149,191,238, 1,112, 59,126,236,198, 77,159,124,226, 48,125,225,250, 69,101,185,105, 57,243, 71,244,110,228,102, +107, 33, 16, 21,100, 21,154, 55,109,218,237, 29,139, 76, 93,229,236, 24, 18, 18,178,247,252,221, 4,130,207,231,112,216, 44, 22, +213,222,219,221,194,201,148,101, 42, 1, 76,147, 99,163,111,143, 30, 61,218,123,246,236,217, 29, 12,224, 68,197,128,139,125,251, +246,129, 32, 8,210,144,186,127, 68, 92,172, 77,100, 49, 12, 3,130, 32, 14, 84, 25, 84, 14, 84,156,123, 84, 69,108,177,107,107, + 79,157, 53, 85, 39,170, 70,141, 26, 53, 66,163,209,176,171,116, 18,239, 10,152,234, 68,140, 94,117,183,179,179, 59, 15,224, 83, +130, 32,160,148,203,149,255,247,211, 79, 85,255,252,240, 29,145,117,177,166,103, 73,173, 86, 67,171,213,178, 31, 61,122, 68, 85, +185,215, 41, 0, 34, 0,150, 12,195,128, 36,201,103,122,180,167,135, 80, 40,188, 29, 22, 22,102,226,239,239, 79,112,185, 92,104, + 52, 26, 68, 70, 70, 58,253,248,227,143, 19, 47, 94,188,216, 93, 38,147,121,226,253,228,233,250, 92,163,230, 55,110,220,144,185, +186,186, 86, 43, 28,139,138,138,216,238,238,238,159,212, 32,138,254,106,206,148,204,204,204,126,159,126,250,233,164,140,140,140, + 40,141, 70,243, 45, 0, 47, 75, 75,203, 71, 3, 6, 12,128, 64, 32, 8, 42, 43, 43, 91,247, 33,247,188,181,181,117,223,182,109, +219, 98,227,198,141,248,241,199, 31,187, 2,184, 4,160, 75, 81, 81,209,197, 62,125,250,192,204,204,172, 95, 65, 65,193,238, 15, +120,142,220, 59,118,236,184,109,201,146, 37,146,211,167, 79,195,205,205, 13,197,197,197,248,230,155,111,172,127,248,225,135,171, + 5, 5, 5,157,170, 60, 23, 53,113,122,242,120,188,221, 7, 15, 30, 20,187,186,186,186,114, 56, 28,210,213,213, 21,121,121,121, +144,203,229,188,229,203,151,123, 11, 4,130, 39,235,214,173,219, 13, 96, 64, 29,229, 36, 1, 44,219,178,101,203,164, 9, 19, 38, +152,141, 24, 49, 66,171, 84, 42,113,228,200, 17,176, 88, 44, 80, 20, 5,161, 80, 88,153,188,154,195,225,160,105,211,247,130,164, +159,170,165,190,133, 40,247, 67, 53,131, 97,203,174, 23,107,225,171, 92,250,160, 40, 10,124, 62, 31,124, 62, 31, 60, 30, 15,175, + 94,189, 90,200,231,243,215, 18, 4,161,209,135,147,248, 83, 93,248, 0,184, 95,215,123,188,239, 26,242,119,246,159, 58, 56, 18, + 4,241, 11,128,160,242, 97,151,188,102,105,105, 57, 35, 51, 51, 51, 81, 95, 78, 59, 59, 59,139,220,220,220,117,118,118,118,176, +177,177,169, 28,191, 29, 28, 28,160, 86,171,145,153,153, 9,134, 97, 80, 80, 80, 0,161, 80, 8,123,123,251,117, 19, 38, 76, 56, +182,117,235,214,220,106, 57,105,252,216,103,200,130,239, 89, 44, 22, 9, 0, 44,182, 88,252,213, 60,160, 81,163, 70,104,223,190, + 61,228,114, 57, 10, 11, 11,209,188,121,115, 54, 65, 16, 33, 4, 65,152, 48, 12,243, 27,128,203,255,133,134,194, 26,157,225, 23, +191,187, 46,170,203, 22,207,225,112,244, 18, 90, 21,159,175,203,130, 66,170,213,106,112, 56,156,183, 44, 18, 4, 65, 64,171,213, +190,117, 94, 39,180,234, 35,212,167, 76,153, 66,111,219,182,109, 82,126,126,254,102,212,115, 41, 33, 36, 36,228, 61,127,143,153, + 51,103,166,100,101,101, 49, 3,187,249,136,162,254, 72, 75,111, 44, 21, 11,172, 36, 18,103,190,212,220, 44, 55, 55,247, 78, 69, +103,162, 47,154,180,108,217, 82,176, 39,244, 70,202,248,175, 87, 46,245,119,181, 48,105,225,104, 41,181, 53, 21,112,197, 36, 33, +227,107,212, 41,230,230,230,110,134,150, 91,215, 47, 8,133, 66,144, 36,249, 79,178,104,177,117, 34, 43, 47, 47, 15,167, 79,159, + 70,207,158, 61, 31,233, 68, 72, 81, 81, 17,210,211,211, 97,103,103,247,168,194,242, 81,231, 50, 34, 77,211, 80,169, 84, 80,169, + 84,149, 2,166,202, 61, 84, 41, 96,116,159,101,177, 88,207,234, 89,246,165, 82,169,180, 99, 80, 80, 16,247,208,145, 35, 92,134, + 97,100, 40,207,161, 86,194, 48, 53, 36,200,126, 7, 26,141,166,210,202, 70, 81, 20,146,146,146, 42, 7, 46, 93,110, 73, 62,159, +175,159, 41,131,199,155,117,248,240, 97,147,214,173, 91, 19,185,185,185,160,105,186,178,147,252,245,215, 95,249,131, 6, 13,114, +136,136,136,152,175, 80, 40, 22,215,163,174, 68, 77,130, 8, 0, 76, 76, 76, 52,208, 47, 98,118,157,156, 26,141,134,104,215,174, +221,236,156,156, 28,239,178,178,178,229,250, 52, 35,128, 83, 41, 41, 41, 85, 7,246, 39, 81, 81, 81,101,131, 7, 15, 22, 56, 59, + 59, 7,188,120,241,226,131,110, 82,119,119,247, 64,138,162,112,239,222, 61, 5, 0,221,204,250,218,211,167, 79, 21, 3, 6, 12, +224, 57, 57, 57, 5, 22, 20,232,237,178,226,238,225,225,113,193,218,218, 90,160,235, 67,173,172,172,168,173, 91,183, 74, 82, 83, + 83,161, 82,169, 48,119,238, 92,244,234,213, 11,150,150,150,152, 57,115,166,205,234,213,171,247,151,148,148,180,172,205,104,205, +229,114,247,198,196,196,184,217,217,217, 9,238,222,189,139, 22, 45, 90, 32, 39, 39, 7, 25, 25, 25, 40, 41, 41, 65, 70, 70, 6, +198,142, 29,107,253,243,207, 63,219,235, 97,201,170, 20, 89, 91,183,110, 45, 56,126,252, 56,107,251,246,237, 18,138,162, 42,133, + 22,155,205,174, 20, 90,186,220,138,245, 88,105, 40,168, 16,109,102,133,133,133, 31,226,231,198, 3,192,173, 42,178,120, 60, 30, +120, 60, 30,248,124,254, 7,229,101,253,151,192,129, 32,136, 23, 28, 14,135, 39, 20, 10, 57, 36, 73,130,199,227,117, 51, 55, 55, +127,238,229,229,229,117,225,194,133, 4,125, 72,228,114,249, 94, 30,143, 71, 89, 91, 91, 3, 0,220,220,220,208,162, 69, 11,200, +100, 50,186,176,176, 16,102,102,102,100, 98, 98, 34,202,202,202,144,158,158,142,134, 13, 27, 82, 36, 73,238, 69,185, 31,242,123, +184,253, 40, 99, 51,128,205,186,247,150,150,150,153, 85, 45,157,124, 62, 31, 14, 14, 14, 72, 77, 77,133, 68, 34, 97,253,240,195, + 15, 3,142, 28, 57,210,255,246,237,219, 33, 0,246, 85,161, 90,252, 47,246,209,210,137,172,170,175,127, 10,173, 94,189,122, 45, + 10, 15, 15,255,164,186, 89, 56, 69, 81, 31,205,215, 69, 39,168, 76, 76, 76,222,181, 90,129,166,233,154, 44, 90, 6,255, 14,159, +207, 23, 76,158, 60,185,248,183,223,126, 51, 88,108, 5,111,140,170,180, 98,189, 55,141,244,244,188, 61,127,254,252,190, 87,174, + 92, 73,245,119,117,102,139,210, 18, 75,248, 38,102,102,112,108,208,115, 84,191, 1, 79, 81,190,251, 80, 95,196, 20, 23, 23, 11, + 26, 59, 10,149, 36, 41, 39, 26,240,216, 18, 59, 17,135,103, 43,149, 58,112,148,138, 44, 19,169,148,171, 80, 40, 10,254,191,189, +235, 14,143,162,122,215,239,204,108, 47,217,244, 74, 32, 1,164,135, 22,122,175, 2, 2,138,133,242, 83,234, 15, 8, 34, 22, 80, + 65,189, 88, 48, 82, 4,225,130,130,148, 8,210, 4,149, 38, 29,164,152, 64,164, 39, 32, 33, 9, 9, 32,132,244,100,179,217,154, +205,150,153,157,251, 71,118,215, 77, 72,217, 77, 54, 20,111,222,231,153, 39, 59, 59,179,111,206,156, 57,229, 61,223,249,206,119, + 80,205, 38,208, 0, 16, 24, 24,120, 82, 36, 18,133,217,206,189,189,189, 61, 89,150,133, 88, 44, 70,112,112,176,148,162,168, 52, +135,202,149,145,159,159, 63,188,166,132,121,121,121,157, 20, 8, 4, 97, 36, 73,130, 32, 8, 80, 20, 5,146, 36, 65,146,164,253, + 51, 69, 81, 32, 8, 2, 37, 37, 37, 25, 15, 30, 60, 24,238,196,243,210, 0, 34, 9,130, 72, 60,122,244, 40,122,244,232,129,227, +199,143, 99,196,136, 17, 80,169, 84, 72, 74, 74, 66,255,254,253,129,178, 41, 69,167,224,232,252,110, 27, 20,220,190,125,219, 46, + 92, 28, 15, 15, 15,143,186,152,216,227,199,141, 27,135, 31,126,248,129,181, 14, 38, 36, 4, 65,116,244,244,244,188,157,146,146, +226,148, 31, 12,203,178, 48,153,254,185,213,214,121, 89,253, 33, 92,218, 28,152,162,168,225, 93,186,116, 33, 84, 42,149, 77, 64, +130,195,225,128,162, 40, 80, 20,133,239,191,255, 94,212,189,123,247, 79, 5, 2,193,124, 30,143,167, 54,155,205, 63,151,150,150, + 46, 1,160,124,154, 90,164,126,253,250,205,203,204,204, 28, 29, 22, 22,118,184, 14, 52,172,217,108, 54, 2, 16, 81, 20,197,117, + 67, 27, 69, 89,203, 86,169,131,216,167,173,231, 2,148, 77, 19, 59, 5, 63, 63,191,159,142, 29, 59, 22, 26, 22, 22, 6,179,217, + 12,154,166,161,213,106, 17, 23, 23, 7,131,193, 0,154,166,209,178,101, 75,124,254,249,231,165,239,189,247,158,112,211,166, 77, + 5, 90,173,118, 98, 13,180,239,237,221,187, 87, 18, 28, 28, 44,210,235,245,184,119,239, 30,186,116,233, 2,141, 70, 3,157, 78, +135,146,146, 18,152, 76, 38,168,213,106, 47,134, 97,140, 53,112,125,230, 40,178,102,205,154,117,147,207,231,119,121,231,157,119, +144,149,149,101,175,243, 51,103,206, 68, 96, 96,160,189, 46, 89,219,100,151, 26,102, 14,135, 3,129, 64, 0, 30,143,167,108,210, +164, 9, 8,130, 16,102,100,100,212,102, 42, 78, 6, 64,205,229,114,249,142, 2, 75, 32, 16,224,242,229,203,255,195,231,243,171, +178,102, 85, 85, 47, 89, 87,206,159, 52, 8,130, 88,195,227,241, 4, 62, 62, 62, 60,135, 1, 39, 79, 42,149, 34, 32, 32, 96, 29, +128,145, 78, 62,119,103, 31, 31, 31,123,251,222,169, 83, 39,100,102,102, 30, 80,169, 84,147, 11, 10, 10, 64,146,228, 14,146, 36, + 95,177, 13, 82,139,139,139,209,184,113,227,206, 85,241,245,142, 12,122, 19, 4, 91,206,162, 85, 97,128, 6,153, 76,134,251,247, +239, 67,167,211,177,233,233,233,196,236,217,179, 9,163,209,184, 53, 33, 33,225, 34,202, 86,219, 87,169, 69,158, 17,184,238,163, +101,179,104, 57,219, 1, 16, 4, 81,227,104,194,108, 54, 75, 35, 34, 34, 42,115,248, 34, 42, 19, 90,214,233,164, 90, 21,116, 46, +151,235, 81, 91,177, 85, 17,135,247,237, 14, 92,254,249,199,159,251,132, 52,125,110,254,252,207, 56, 47,190,248,226,165,237,219, +183, 51, 62,109, 71, 14, 57,123,114,103,224,183, 31, 44, 56,126,236,216, 49,160,204, 49,218, 89,196, 31, 57,114, 36,232,253,119, +231,224,243, 15,223, 59, 33,107,233,199,151, 18, 62, 18,161, 65, 87, 40, 5,171, 23,180,104, 51,122,255,225,195,185, 0, 18,170, + 35, 17,139,197, 97,201,201,201, 45, 29, 23, 18, 24,141, 70,136,197, 98,156, 61,123,214, 95, 36, 18,249, 3,128, 94,175, 71,251, +246,237,157,181,152,132,165,165,165,181,244,240,240, 64, 73, 73, 9, 12, 6, 3,204,102, 51, 44, 22, 11, 8,130, 0,151,203, 5, +159,207,135, 68, 34,113,117,101,223,117, 0,111,140, 26, 53,106,215,241,227,199, 17, 17, 17,129,226,226, 98,164,166,166,218, 68, +150, 75, 62, 90, 54, 43,145,163, 63, 22,135,195,193, 79,205,155, 99,102, 78,142, 93,192,172,241,244,196,231,150,218,237,166,209, +190,125,123, 54, 62, 62, 30, 39, 78,156,192, 75, 47,189, 68, 28, 60,120,208,196, 48, 12, 47, 39, 39,231,102, 78, 78,142, 83, 28, + 22,139,197,158, 86, 91,187,237, 40,176, 92, 21, 90, 52, 77,123,240,249,124,148,150,150,194,102,121,112, 60,154, 53,107, 6,133, + 66,193, 81,171,213,156,156,156, 28,241,226,197,139,223,137,141,141, 13,214,104, 52,175, 63,201, 86,104,195,134, 13, 97, 51,103, +206,124,200,225,112,216, 17, 35, 70, 76,202,200,200,120, 57, 56, 56,248,204, 31,127,252,177, 10, 64, 43, 87,249,252,252,252,174, +113, 56,156, 80,181, 90,205,219,179,103,143, 89,163,209,240,252,253,253,243,109,109,135, 45,175,205,102,179, 83, 43,151,253,252, +252,174,201,229,114,222,218,181,107,205, 69, 69, 69,188,192,192,192,124, 27,143, 82,169,228,237,217,179,199,172, 86,171,121,158, +158,158,215, 84, 42, 85,141,124,114,185,124,226,148, 41, 83,206,159, 57,115,198,143,162, 40,100,100,100,160,168,168, 8, 94, 94, + 94,216,177, 99, 7,194,194,194,176,119,239, 94,133, 66,161,152,241,205, 55,223,124,106, 21, 89, 53,249,104,245,239,209,163, 71, +152, 82,169,132,151,151, 23,116, 58, 29,174, 93,187,134,118,237,218, 33, 39, 39, 7, 36, 73,194,203,203, 11,235,215,175, 47, 33, + 8, 66, 81, 29,145, 72, 36,122, 57, 42, 42,202, 11, 0,162,162,162,188,162,162,162, 42,237,224,122,245,234,133,117,235,214, 85, + 20, 90,174, 12, 12,236, 86, 39, 7,113, 84,218,179,103, 79,196,198,198, 46,112, 81, 28, 25,109,162,173,162, 53, 75, 32, 16,184, +188,152,198, 98,177,240, 80,230,210, 64, 56,115,254, 20, 96,128, 72, 36,226, 85,252,178,164,164,132, 23, 28, 28,220,207, 5,225, +235, 43, 18,149, 25,156,194,194,194,160, 82,169, 24,163,209, 56, 97,231,206,157,102, 0,136,140,140,156,192, 48, 76, 41, 77,211, + 20,159,207,135, 78,167, 67, 64, 64,128,111, 53,182,209,143, 14,253,188, 56,168,162,143, 86,112,112, 48, 34, 35, 35, 97, 48, 24, +144,155,155,139,184,184, 56, 51,195, 48,187, 54,108,216, 96,241,247,247,255,239,107,175,189, 70, 37, 36, 36,188, 13, 96, 94, 85, + 90,228, 25,179,102,197, 84, 41,180,172, 10, 50, 22,192,192,138, 15, 89, 81,252, 84, 39,180,106,154, 58,228,243,249,202,135, 15, + 31, 74, 28, 59, 21,154,166, 17, 18, 18, 98, 97, 89,150,168, 76,104,213,197, 20,204,229,114, 61, 62,249,228, 19,229,134, 13, 27, + 38,222,191,127,127,145, 51,191,217,243,118, 27,108,175, 32,178, 54, 46,143, 94,183,118,249, 98,159,187, 39,182, 98,243,119, 43, + 25,134, 65, 66,135, 14, 29,250,105,181, 90,142,167,196, 12,185, 18,199,173, 34,203, 89, 81, 72, 2,248,241,202,149, 43, 9, 35, + 71,142,252,243,199, 95,246,251,228,220,187,119, 81,160,150,231,202, 90,180,228,240, 26,133,189,162, 41, 45,229, 77,152, 48,193, + 31,192,107, 53, 53, 98, 74,165, 18,121,121,121, 21, 5, 24,110,223,190,253,200,189, 78, 37,142, 36,193, 48, 12,246,237,219, 7, +177, 88, 12,137, 68, 82,238,176,137,172, 90, 46, 84, 72, 3,128, 17, 35, 70, 64,161, 80, 64, 42,149, 58,157,174,138,226,133,101, + 89, 24,141, 70, 24,141, 70,152, 76, 38, 6, 0,151,195,225, 96,122, 86,150,221,202,227,138,128,169,136, 14, 29, 58,176, 23, 46, + 92,192,159,127,254, 9,157, 78,135,181,107,215, 34, 56, 56,120, 48,128,207, 92,229,114,112,210,103,212,106, 53, 87,173, 86,219, +173,131, 92, 46,215,110, 61,112,210,146,199,227,112, 56,246,209,168,237,112,180,106, 81, 20,133,192,192, 64, 4, 5, 5, 97,227, +198,141,188,166, 77,155,142,126,146, 45,208,138, 21, 43, 90,172, 89,179,102,203,246,237,219,143, 79,156, 56,241,215,164,164,164, +105,158,158,158, 55,207,158, 61,187, 88, 32, 16, 88,106, 89,191, 67,115,114,114, 2, 28,191,178, 88, 44, 98,154,166,237,194,182, +164,164,196,233, 1, 6,151,203, 13, 77, 78, 78, 22, 3,192,226,197,139,185, 0,196, 54,103,112, 27,103, 73, 73, 9,183, 93,187, +118,161,206,150,245,243,231,207,247, 27, 58,116,232,133, 83,167, 78,121,135,133,133, 33, 59, 59, 27,217,217,217,104,209,162, 5, +150, 46, 93,170, 83,171,213,125, 0,164,105,181,218,131, 78,114,134,120,123,123,115, 31, 62,124, 8,154,166,209,185,115,103,172, + 95,191, 30, 19, 38, 76, 64,251,246,237,161, 86,171,145,156,156,140,109,219,182,121,243,120,188,106,219, 14,189, 94,127, 48, 38, + 38,166,113, 69,139,214,164, 73,147, 36,249,249,249,246, 50, 25, 29, 29, 93,110, 10,209,149, 54,217, 58,181, 85,229, 81, 27,208, + 52, 45, 19, 10,133,106,129, 64,192,183,249,103,197,197,197,185,108,205,170, 48, 0,116,229,252,137,193, 38, 90, 43,233, 91, 17, + 20, 20,228, 52,143, 64, 32, 32,108,109, 35, 77,211, 80,169, 84, 76,112,112,176,125,122, 63, 49, 49,145, 9, 15, 15,103, 40,138, +162,248,124, 62, 8,130,128, 88, 44,174,178,193,103, 25, 54,250,197, 9,159,149, 91,117, 56,247, 19,192,100, 50, 33, 49, 49, 17, + 38,147, 9,113,113,113,230,111,190,249, 38, 71,169, 84,206, 5,192, 57,121,242,228,148, 5, 11, 22, 80, 1, 1, 1, 67, 11, 10, + 10, 80,147, 22,121,134,196,214, 35, 86, 46, 91, 47, 20, 59,122,244,104,194,186,180,146,176, 9, 39, 87,132,150,181,242,213,216, +243, 18, 4,129,220,220, 92,251,121, 64, 64,128,203,255,203, 89,248,250,250,234,122,245,234,229, 33,151,203, 15,174, 88,177,162, + 86,150,172,141,203,163,215, 45,251,234, 11, 31, 69,202, 37,100,229,228, 66, 81, 96, 78,136,191,121,255, 0,128, 3, 0,128, 77, +109, 99,137, 55, 83,191,119,150,179,141,159,168, 19,151,199, 57,240,252,200,209,141,199, 71,205, 35,223,122,235,173,190, 83,166, + 76, 81, 77,156, 56,241, 93,169, 84,218,202,100, 50, 21,239, 63,122,244,193,248,241,227,155, 50, 12, 51, 5, 53,196, 28,209,235, +245, 25, 3, 7, 14,116,204, 79,217,233,211,167, 3, 31, 60,120,128, 57,115,230, 20,102,103,103, 43, 29,239,117, 38,141, 38,147, + 41,163, 83,167, 78, 85, 78, 23,218,166, 20, 1, 64,163,209,100,184,144,165,175,195,234,248, 94, 84, 84,132,219,183,111,131,195, +225,160,103,207,158,136,143,143, 71,223,190,125, 19, 93,177,106,149,150,150, 34, 44, 44, 12,165,165,165,208,233,116, 37, 0, 4, + 59,154, 54, 5, 0,188, 93, 84,132,107,223,124,131, 75,203,150,193,177, 60, 59,139,142, 29, 59,178,151, 46, 93,194,205,155, 55, + 97, 48, 24, 48, 99,198, 12, 0, 32,172,101,215,149,144, 25,205, 41,138, 26, 49,114,228,200, 16, 0,208,233,116,196,149, 43, 87, + 32, 20, 10,237,117,225,240,225,195,200,206,206, 6, 65, 16,240,246,246, 14, 45, 46, 46,110, 10,224,126, 53,102,127,226,254,253, +251,248,250,235,175, 97,177, 88,176, 96,193, 2,180,108,217,210, 46,176, 50, 50, 50,176,120,241, 98, 48, 12,131, 47,190,248, 2, + 45, 90,180,128,217,108, 22,162,150, 33, 52,220,129,247,223,127,255,238,129, 3, 7,142,103,102,102,190,176,124,249,242, 1, 4, + 65, 88,230,207,159,255,181, 76, 38, 99,234,194, 91,172,210,224,246,157, 12,187, 16,170,120,248,251,249,184,204,151,126, 47,211, +254,123,134,113,228, 99,224,235,227,237,106, 18, 75,204,102,179,238,149, 87, 94,241,218,183,111, 31,209,162, 69, 11,252,253,247, +223, 54,203, 80, 9, 92, 15,233,144,173, 80, 40, 90, 82, 20,197,187,115,231, 14,194,195,195,209,163, 71, 15, 44, 89,178, 4,114, +185, 28, 52, 77, 35, 32, 32,192, 98, 54,155, 19, 77, 38,211,185, 26,184,162,103,205,154,197, 3,240,166,213,178,213, 97,238,220, +185,150,149, 43, 87, 34, 49, 49,209,110,193,114,116,134,119,117,234,208,209,234,228,120,196,197,197, 45,224,243,249, 44,128,203, +112, 61,208,179,177,162, 69,171, 54,214,172,250, 66,125,174,100, 12, 14, 14,142,243,240,240, 24, 93, 92, 92, 92,206,170,213,167, + 79, 31, 83, 96, 96,224,121,103,121,164, 82,105, 49, 69, 81,190, 0,144,157,157, 13,137, 68,194,187,119,239,222, 50,148, 5,207, + 70,211,166, 77,151, 41, 20, 10, 94, 83,107,123, 26, 20, 20, 4,163,209, 88,165, 27,203,197,235,249, 91, 1,108,181,157,251,248, +248,228,170, 84, 42,209,202,149, 43,181,203,150, 45,211, 51, 12, 99, 0,112, 86,169, 84,218,227,104,229,229,229,169,184, 92,174, +143,151,151, 87, 35,155,208,170, 76,139, 60, 99,168,218,162,101, 85,146,108, 69, 65, 68, 16,196, 35, 14,234, 53, 8,173, 26, 69, + 22,195, 48,229,172, 12, 54,135,247,202,254,151,181, 83,175,213,212,161, 85,100, 9,247,239,223,191, 99,197,138, 21,151,157,253, +157,163,143,214,166, 85, 95, 45,183,137,172,191,254, 60,133,131,169, 42,249,130,101,171,215,212,246, 13,180,245, 19,119, 12, 12, +244,141,253,102,105,180,236,238,137,109,248,117,211,255,178,127, 93,189,218,253,234,213,171,147,231,204,153,211,196, 90,176, 20, + 0,110, 0, 24, 15, 39, 86,233,100,103,103, 15,175,208, 9,167,241,120,188, 64,177, 88,140,236,236,108,109,122,122,186,203, 83, + 50,114,185,124,120, 61, 20, 64,142, 77,100,201,229,114, 36, 39, 39, 99,208,160, 65, 0,128,248,248,120,244,233,211, 7, 9, 9, + 9,232,210,165, 75, 34,128,110,168, 33, 80,171,217,108, 86,182,109,219,214,110,221, 82,169, 84, 22, 0,136,202,205, 69, 76,112, + 48, 56, 28, 14, 46, 45, 91,134,133,102, 51,150,184, 40,224, 59,117,234,196, 94,185,114, 5, 15, 30, 60, 0, 77,211, 24, 51,102, + 12,106, 89,233,219,183,105,211,230,244,217,179,103,253,165, 82, 41,116, 58, 29,180, 90, 45,166, 78,157,138, 9, 19, 38,192, 96, + 48, 96,207,158, 61, 56,116,232, 16, 60, 60, 60,160,211,233,160,211,233,188, 71,141, 26,117, 33, 45, 45,173, 63,128, 59, 85, 8, + 45,118,248,240,225, 56,127,254, 60, 40,138, 66,247,238,221, 81, 84,244,207, 98,160,192,192,192,202,174, 81, 79, 82,104,113, 56, + 28, 54, 46, 46,110,249,128, 1, 3,144,153,153,249, 66,151, 46, 93,214, 78,155, 54, 45,187,174,188,222,158, 30,232,212,174, 57, + 12, 6, 3, 12, 6, 3, 66, 66, 66,160,209,104,112,247,238, 93, 24, 12, 6, 4, 6,120,185,204, 23,217,190,133,157, 47, 32, 32, + 0, 58,157, 14,247,239,223,135,209,104,132,159,159, 75, 66,171,241,240,225,195,255,216,181,107,151,239,182,109,219,140, 3, 7, + 14,228,175, 93,187,150,144,201,100,112,232, 88, 92, 69, 92,124,124,124,216,208,161, 67, 91,167,164,164, 32, 46, 46, 14, 70,163, + 17,145,145,145, 72, 79, 79, 71,175, 94,189,160,213,106, 47, 95,189,122,245,144, 51,134, 97, 0,159,206,154, 53, 11, 54,177,117, +254,252,121,228,230,230,194,195,195,227, 17,161,101,243,125,180,174, 26, 15,113, 38,177, 54, 65,228, 96,121, 90,232,229,229,101, + 2,176,166,150,214, 39, 0, 64,102,102,166,160, 67,135, 14, 6,161, 80,200,183,138,182,213,117,225,115, 39,220,176,146,177, 74, + 4, 5, 5,205,245,243,243, 27,218,172, 89, 51,228,231,231,243,248,124, 62,250,244,233, 99,234,214,173,155, 41, 40, 40,232,109, +103,121, 4, 2, 65, 10,143,199,235, 95, 54,152, 96,240,240,225, 67,176, 44,187,160,125,251,246,239,105, 52, 26, 20, 21, 21,241, +101, 50,153,125, 80,221,186,117,107, 24, 12,134, 20, 23, 44,111,209,225,225,225,159,242,120,188, 37,114,185,188,178,176, 16,124, + 47, 47, 47, 25,143,199,131,201,100, 42, 39, 54, 43,106,145,103, 93,100,149, 19, 90, 14, 42,178,156,208,113,197,162,229,140,213, +192,230, 96,239,120,110, 19,117, 21,255, 87,109, 99,104,121,122,122, 26,108, 34,107,201,146, 37,151,107,195,177,119,215,206, 96, + 79, 75, 73,227,156,203,199,144,118, 51, 1, 7,146,149,242, 5,203, 86,191,251,226,107,175,231, 87, 20,102,206,160,165,191,184, +125, 96,128,111,236,170, 21,203,100,138,148, 75,200,205,203,195,177,203, 87, 19, 76, 64, 50,128, 5,238, 52, 45, 3,101, 83,135, + 20, 69, 61, 77, 5,152, 75, 45,125, 0, 0, 32, 0, 73, 68, 65, 84,214,238, 12,159,155,155,107, 19, 89,145, 0,208,183,111,223, + 68,171,200,130,179, 22, 45,165, 82, 89,113,203,154,161, 0,252,108,207,207,225,112,208,231,211, 79, 93, 22, 89, 0,216,132,132, + 4, 40, 20, 10,219, 72,177,182, 34, 11, 65, 65, 65, 31,158, 61,123,214,255,199, 31,127, 84,111,223,190,189,200, 98,177,112, 59, +117,234, 20,218,181,107, 87, 98,199,142, 29, 0,128,241,227,199, 99,193,130, 5,184,117,235, 22, 36, 18, 9,250,246,237,203, 44, + 90,180, 40, 96,238,220,185,111,231,231,231,191, 91,105,239,104,177,240,132, 66,225, 25, 0,131, 83, 82, 82, 0,224, 2,202,182, +112,178, 89, 17,170,188,230, 76,231,171,209,104,184, 30, 30, 30,149,134,134,224,149,141,134, 92,181, 64,216, 57,255,252,243,207, +175, 87,173, 90,117,224,131, 15, 62,184, 83, 71,206, 74, 45, 90,163, 71,143,134,222, 96, 66, 86,190, 10, 12, 67, 67,111, 42,112, +153,207,209,162, 53,122,244,104,148,148, 26,241, 48, 87, 1,154,102,160,209, 59,221,151,139,159,127,254,249,147, 63,255,252,115, +208,197,139, 23,193, 48,140, 37, 61, 61,253,254, 43,175,188, 34,155, 63,127,190,111, 29, 22, 25,125,247,250,235,175,143,253,243, +207, 63, 21,173, 91,183,246,185,124,249, 50, 10, 10, 10, 64,211, 52, 6, 15, 30, 12, 62,159,255,112,217,178,101, 60, 0,223, 57, +251,110,172, 98,203,116,245,234,213,153,151, 46, 93,242,241,241,241,225, 91,218,180, 65,238,169, 83,216,183,111,223, 35, 63,216, +180,105, 19,224,100, 20,126,155,197,233,202,149, 43,110, 17, 88,229,122,106, 62,191,214,211,143,207, 42,174, 92,185,146,253,214, + 91,111,181,147,201,100,107,250,245,235, 55,200,215,215,151,244,246,246,142,107,212,168,209,123,157, 58,117,114,122,118,129,203, +229, 78,147, 72, 36,119,105,154,166,180, 90, 45,116, 58, 93, 89, 35, 77,211,124,146, 36,209,180,105, 83,123, 95,210,189,123,119, + 4, 5, 5, 49,169,169,169,211,156,229, 47, 44, 44, 44,183, 10,177, 18,204,234,211,167, 15,199, 96, 48,224,193,131, 7,241,142, + 23, 42,211, 34,207, 8,162,170, 21, 95,182,135,114,124,184, 70,141, 26,101,154,205,102, 54, 25, 96,111,220,184,193, 70, 69, 69, + 85,123,148,150,150,178, 1, 1, 1,185,149,116,126,112,228, 52, 24, 12,229,126,103, 48, 24,216,192,192, 64, 70,175,215, 63,194, +169,215,235,217,208,208,208,236,234, 56, 43,193,212,235,215,175,111, 88,184,112, 97, 15, 23, 50,200,206,201,110,108,195,110,219, +182,237, 63, 44,203, 14,232,215, 46,236,230,184, 78,129,108,159,150, 1, 57,135,246,238,154,192,178,236,128,138,135, 45,192,105, +117,156,109, 2, 37,109,135, 68, 52, 41,254,235,196,110,246,236,202,119,216, 85, 99, 90,178, 93, 66, 61,148,109,252, 68,174,238, + 17, 83,227,110,233, 17, 17, 17,105, 22,139,133, 53, 26,141,108, 68, 68, 68,186, 59, 56,107,129,234, 56, 59,163,204,151,237,245, + 74,190,235, 92,135,116,254,197,178, 44,171, 80, 40, 88,173, 86,203, 26, 12, 6,150, 97, 24,214, 17, 0,254,114,130,147, 53,153, + 76,108,113,113, 49, 11,231,125,238, 42,229, 12, 14, 14,190,127,239,222, 61,246,185,231,158,203,180,154,227,231,234,116, 58,182, + 34,116, 58, 29, 59,104,208, 32, 54, 61, 61,157, 13, 15, 15, 47, 77, 79, 79,103,131,131,131,111,215,144,206,102,141, 27, 55, 62, +227,231,231, 23, 7,160,165, 11,215,170,205,207, 61,123,246, 52,103, 89,118, 6,203,178, 81, 85, 28, 51, 88,150,109,243,164, 57, +173,249,155,207,178, 44, 91, 82, 82,194, 42, 20, 10, 54, 39, 39,135, 45, 41, 41, 97,181, 90, 45,123,253,250,117,246,226,197,139, +236,205,155, 55, 89, 31, 31,159,124,103, 56,109,124, 70,163,145, 85,171,213,108, 65, 65, 1,171,215,235, 89,157, 78,199, 38, 37, + 37,177,215,174, 93, 99, 83, 82, 82, 42,227,123,132,211,215,215,119, 83, 94, 94,158,246,194,133, 11, 37, 27, 55,110, 44, 9, 10, + 10, 74, 1, 16, 6,160,149,183,183,119,222, 59,239,188,195, 74,165,210,140, 90,214,163,118, 92, 46,247,250,242,229,203,175, 28, + 57,114, 36,255,208,161, 67,198, 45, 91,182,100,205,153, 51,231, 28,135,195,185, 14,160, 93, 45,235, 81,128,151,151,215,133,203, +151, 47,211,197,197,197,172, 82,169,100,213,106, 53,171,211,233, 88,189, 94,207, 26,141, 70,214,108, 54,179,231,206,157, 99, 3, + 3, 3, 29,167, 37, 63,170,102, 96, 61,143,101,217, 15, 89,150,229,184,187,173,115,224,238,231, 46, 78,119,180,117, 36, 73,154, +172,109, 71,207,178,211,234,207,159, 84, 58,135, 12, 25,242,197,132, 9, 19,216, 17, 35, 70,176,145,145,145,143, 28, 93,186,116, + 97,103,207,158,205, 30, 57,114,132,253,230,155,111,190,112, 67, 58, 57, 40, 91,244,178,116,200,144, 33,230,243,231,207,179,227, +199,143,103, 1, 12,175, 78,139,252, 27, 4,151, 45,188, 3,225,248, 23, 0, 76, 38, 83,102, 90, 90, 90,112,107,154,166, 0,224, +251,239,191,127,196, 50,229,136,243,231,207,211, 4, 65,220,173,238,191,155, 76,166,204,179,103,207, 6,174, 91,183,142,235, 96, + 2, 6, 77,211,150,156,156, 28,114,237,218,181,229,238,143,141,141,165,105,154,126,232,226, 67,110,235,220,185,243, 54,119,228, +214,185, 91, 15,222, 59,121,236, 55,191,158, 61,250, 41,101, 62, 62,149,142,194,246,188,221, 6,196,155,213, 91,181, 8, 14,185, +100,249,210,104, 47,219, 20,228, 47,137,121,202, 82, 3, 51, 40, 85,174,255,203,221,111, 88,171,213, 62,176,173, 4,212,233,116, + 15,159,194, 66,120, 29,101, 49,174,232, 10,223,117, 67, 29,157, 78, 45, 22, 11, 60, 61, 61,237,214,208, 90, 88, 68, 89,155,133, +213,246,234,234,146, 30,150,101,255, 76, 74, 74, 10,159, 58,117,170,199,246,237,219,239, 49, 12,195,157, 62,125,186, 41, 40, 40, +136, 23, 31, 31,111, 6, 64, 12, 24, 48,128,147,151,151,199,102,103,103, 43, 94,122,233, 37,205,204,153, 51,125,111,220,184,193, +183, 88, 44, 53, 5, 45,252, 59, 51, 51,115, 72, 45,174, 85,139,113,227,198,221, 67,221,183,177,169,119, 78, 27, 20, 74, 53,238, + 61,200,182, 70, 48,183,128,201,200,183,251, 85,153,205, 52, 20,234, 34,151, 45, 90,119,239,103, 91,183, 24, 99,192, 48, 57, 86, +190, 50,135,120,182,184,164,230,222,132,195,233,187,104,209,162,145, 36, 73,146,151, 46, 93, 50,172, 88,177, 34,179,176,176,112, + 12,128,135, 0, 80, 92, 92, 60,112,219,182,109, 63, 57, 17,202,161, 42, 36,155,205,230, 94, 31,125,244,209,187, 0,250, 2,104, + 98,229,142,183, 90,178,106, 27,193,188, 64,169, 84, 14, 27, 57,114,228, 41,138,162,154, 58,212, 35, 63, 0,114, 91,189, 96, 89, + 54, 32, 63, 63,255, 5,103, 8, 9,130, 88, 93, 95, 13, 73,125,114,215,177, 29,122, 38, 86, 50,158, 57,115,230,203, 49, 99,198, +112,194,194,194,254, 39, 44, 44,140, 44, 46, 46,134, 86,171, 5, 73,146, 8, 10, 10, 66, 68, 68, 4,130,130,130, 44, 41, 41, 41, + 75, 63,254,248,227, 26, 99,242,181,109,219,182,185,217,108,126,142, 36,201,230, 0,154,179, 44,219,156, 32,136,230, 0,124, 0, + 64, 38,147,201,194,195,195, 57, 61,123,246, 68,143, 30, 61, 16, 27, 27,139,189,123,247,110, 5,112,210,209,154, 85, 81,139, 60, + 13, 72,238, 12,182,221,117, 16,183,186, 96, 0, 97, 65, 44, 75, 98, 96, 68,130, 61,206, 94, 69,145, 85,245,166,210,149,152,254, +134, 15, 30, 60,216, 94,225,156,232, 84, 30,212, 84,249, 10, 11, 11,135, 79,155, 54,173, 28, 39,195, 48,134,162,162,162,183,122, +247,238,189,158,162, 40, 65,133, 2,155, 81, 80, 80,240, 88,247,234,171, 24, 71,107,248,200,151,229,117,229,148,242,200,231,210, +142,254,128,252, 2, 57,126, 73,204, 43,214, 24,153,129,233,242,146,164,250, 72,127, 70, 70,198,136,103, 64,241, 87, 38, 90,235, +186,121,118,161, 19, 1, 73,107,218,163,142,176,134, 19,113, 75, 37,207,203,203, 91,249,233,167,159, 14, 91,186,116,169,255,241, +227,199,101,182, 1,202,171,175,190, 90,144,148,148,212, 15,128,160,180,180,244,244,210,165, 75,253,163,163,163,125, 1,248, 2, +192,168, 81,163,242,243,243,243,215,161, 1,213,194,108, 54,103, 69,180,109,109, 31,248, 57,134,116,112,252, 76,211,116,150, 43, +124,149,241, 56,158, 51, 12, 83, 45, 31, 69, 81, 31,244,232,209,131,250,224,131, 15,242,143, 31, 63,110,219, 72,215, 81,161,165, +213, 16,148,212, 25, 24, 0,172,176, 30,238,132, 78,161, 80,244,114,241, 55, 76, 67,105,172,116, 64,233,202,249, 19,193,193,131, + 7, 63, 27, 63,126,252, 54, 31, 31,159,157,205,155, 55,111, 29, 24, 24, 40, 19,137, 68, 48, 24, 12, 26,163,209,120, 59, 45, 45, +109,226,103,159,125,246,183, 83, 22,142,109,219, 40, 0, 60,139,197, 34, 36, 73, 82, 2, 64, 70, 16,132,183, 77,104, 17, 4, 1, +147,201,132, 7, 15, 30, 96,225,194,133,204,153, 51,103,190, 1,240,133, 11, 3,215,110, 0,252, 29,218,113,127, 0, 70,148, 5, +176, 45, 36, 8,226,106,125,231, 23, 97, 65,108,187,235, 32,146, 59,163,178,126,162,250, 77,165,171,170,112,133,133,133,189,220, + 93,137,171,226, 44, 44, 44, 12,123, 90,106,200, 20,195,138,221,216,180,162,220, 62,135, 54, 17, 86,217,121, 77, 80,233,233, 57, +223,157,188,181,210, 64,179, 22, 19,109,249,111,122, 97, 73,114, 67, 59,228,118, 60,239,174,186,228,198, 52, 37,165,166,166,246, +158, 51,103,206,103, 98,177,184, 59, 0,148,148,148, 92,202,201,201,249, 10,214, 85,133, 53, 93,111, 64,213,144,203,229, 93,159, + 70, 62,163,209,248, 94,239,222,189,191,101, 24,102, 21, 77,211,241,255, 15, 94, 69,105, 67,105,124,118,241,235,175,191,254, 13, +160, 23, 0,140, 29, 59,150, 2,128,189,123,247,186, 44,158,167, 78,157,202,176, 44,107,178,150, 7, 29,202, 86, 23, 22,219,218, + 84,157, 78, 87,156,147,147,147,194, 48, 76, 10,128,159,224,250,138, 91,127,130, 32,142,176, 44, 59,218, 42,220,142,176, 44, 59, +218,241,187,250,182,106,213,112, 75,205,206,240, 13, 40,195,222,100, 16, 21,167, 2,107, 58,175, 9,105,249,186, 56, 0, 93, 26, +114,247,255, 37,238,229,228,228, 76,169,195,245, 6, 60,123,120,104, 52, 26,199,252, 63,122, 94, 85,195, 43,255,151,244,127,181, + 16, 88, 54,164,164,164,212,155,139,192,147, 70,187,235,229, 7,224, 21,207, 29, 16, 85,153,240,106, 16, 90, 13,104, 64, 3, 26, +208,128,186, 64,217,144, 5, 13,248, 55,195,230,155,101, 59,175,194, 71,171,162,127,150,253,156, 64,213, 43, 7, 92,217,149,188, + 54,171, 36, 78, 55,112, 54,112, 54,112, 54,112, 54,112, 62,113, 78, 47, 0,225, 0,150,215,112, 95,197,213,133,249, 0,228, 0, +204, 13,249,217,192, 89, 7,253,224, 20, 88,150, 29, 85,221,212, 33, 65, 16, 71,235, 75,104,217,157,225, 59, 99, 81,196,117, 44, +178,157, 59, 43,180,234, 27, 67, 27, 56, 27, 56, 27, 56, 27, 56, 27, 56, 27, 56, 27, 56, 27, 56,235, 40,180, 6,125,252,241,199, +159,160, 44, 52, 6,251,241,199, 31,127,194,178,236,168,178, 75,236,168,250,252,223,183,186, 96, 64,114,103,176,182,227, 86, 23, + 12,168,226,214, 40,135,195,142,134,169,195, 6, 52,160, 1, 13,104, 64, 3, 26,240,180,227,194,178,101,203, 74,150, 45, 91,102, +115,124, 47, 4, 64, 88, 45, 92,133,245,249,143,173,211,132,206, 44,148,170,126, 11,158, 39,128, 16,146,195,155,196,229, 9, 6, +129,181, 68, 0, 0, 72,234, 22, 99, 44,253,131,166, 77, 59, 1,228,212,150,184, 13,208,182,133,151,232,144,129, 97,120,153, 26, +227,216,212,178,109, 14, 92,198, 88,160,143,128,207,255, 93,224,229, 37,170,236,186, 65,169,212, 27,140,198, 97,123,129, 63, 27, +234, 64, 3, 26,208,128, 6, 52,224, 25,129,196,219,219,251, 12, 73,146, 97,182, 47, 28,227, 14, 86,140, 65,200, 48, 76,174, 66, +161, 24,134,178,169,226,199,201,233,248,123, 35,106,217,151,187, 27,174, 78, 29,114,128,114, 81, 88, 31,203,142,217, 20, 87, 48, +211,195,211,107,201,127,166,189,231,219,178, 85,107,162,113,227, 70, 0, 11, 60,204,204, 10,188,123, 39,125,200,175,219,191,123, + 95,173, 82, 44, 52, 27, 12, 63,184,202,221, 22,144, 52,145, 10,226,127,248,248, 13, 47, 14,104,188,190,120,215, 9, 66,107,106, +156, 82,182,220,212, 37,145,229,229,235,123,114,217,233,211, 34,239,142, 29,203, 93, 99, 89,182,108,127,189,191,254, 18,253,207, +176, 97, 39,199, 42, 20,195, 27,196,214,191, 18, 65, 50,153,108, 46,151,203, 29,104, 50,153,194,248,124,126, 38,195, 48,113,197, +197,197,107, 0,100, 55,100,207,191, 27,173,131, 36,253, 90, 55, 15,219,149,147,151,159,168, 46, 53, 78, 79,203,209, 42, 26,114, +197,101, 84,183,191,230, 19,219,123, 19, 0,164, 82,233, 53,146, 36, 67, 29, 69,128,109,207, 94,219,121,197,191, 22,139,229,111, +133, 66,209,187, 26,218,230, 62, 62, 62,235, 1,116,171, 41, 96,178, 53, 54,219, 85,133, 66,241, 22,170, 94,173,231,225,237,237, +253, 37, 65, 16,227, 72,146,164,106,122, 38,139,197,194,176, 44,187,167,184,184,248, 11, 0,154,170,238,243,246,246, 62,157,154, +154,218, 45, 32, 32,160, 70, 43, 13, 77,211,120,248,240,161,127,247,238,221,207, 41, 20,138, 54,245,201,249,184,181, 72,109, 81, +205,170,195, 42, 11, 58,128,114,251, 11,213,107, 68, 86,158, 80,122,168, 87,255,225,131,102,191,251,129,228,122,210,109,252, 30, +123, 17,106,157, 1, 20, 73,194,203, 67,140, 86,173,158, 35, 86,199,236,243,219,186,113,245,170, 75,231, 79,141, 42,213,169, 94, +114, 73,166,139, 57, 11, 23,188,210, 93,226,235,195, 0, 22, 6, 31,142,236, 36,249,159, 35,137, 11, 81, 66,127,226,178,200, 58, +115, 70, 92,144,159,143,232,144, 16,112,104, 26, 66,146,132,144, 32, 32, 36, 73, 72,132, 66,140,216,178, 5, 95, 29, 63, 46,254, +236,133, 23, 26,196,214,191, 12, 82,169,116, 90, 72, 72,200,138,205,155, 55,251, 54,107,214, 12, 18,137, 4, 10,133,194, 47, 45, + 45,173,243,188,121,243,166,228,230,230,126,170, 86,171, 55, 53,228,212,191, 23, 22, 11, 38,253,184,228,173, 70,185, 25,119, 26, +205, 90,186,187, 21,225,203, 12,188, 93,164,207,107,200, 25,167,209, 25, 64, 34, 42,223,191,180,186,107, 85, 66, 40, 20,230,151, +150,150, 6, 84,119, 15,159,207, 47, 48, 26,141,129, 53,113,145, 36, 25,154,157,157, 29, 32, 22,139,193, 48,140,117, 55, 0,139, +125, 32,237,184,251,137, 53, 80, 45,218,180,105, 99,170,142,211,195,195,227,251,130,130,130,161,182,125, 2, 29, 4, 85,165,200, +206,206, 30,218,174, 93,187,239, 53, 26,205,176, 42,196,203,151,239,190,251,238,220,246,237,219,219,172, 64,214, 93, 16,202,254, +202,229,114,204,153, 51,199,254, 63, 44, 22, 11, 78,157, 58,245,238,180,105,211, 80, 92, 92, 60,175,154,103, 15, 11, 8, 8, 32, +172, 27,138, 87,137, 69,139, 22, 97,209,162, 69,248,238,187,239, 8, 46,151,235, 85, 67,126,186,133,243,113,105,145,218, 88,176, +106,136, 12,127, 20,229,125,179,142, 62, 34,180, 30, 7, 40,174,224,191,221,122, 15, 29, 56,103,238, 2,201,238,223,206, 34, 45, +229, 47,164,198,255, 92,238,158,174,195,166, 33, 79,174,193,180,217, 31, 74, 9,138, 51,240,252,233,131,255, 53, 27,244, 63, 58, +105,205, 10, 12, 19,240,223,233,217, 61,130,155, 45, 74, 67,144,183, 8,125,187,180,224, 54, 62,121,243, 29, 29,232,111, 83,202, + 86,201,184, 36,178, 54,191,241, 6,250,153,205, 8,160, 40, 80, 4, 1, 10, 0, 73, 16, 40, 53, 24,112,117,210, 36,116,223,177, + 3, 95, 28, 62, 44,254,242,197, 23, 93, 18, 91, 18,137,228, 58, 65, 16,222, 90,173,118, 20,202, 54,150,126, 22,208, 78, 42,149, + 30,101, 89,182, 88,167,211,117,126,138,210, 21,140,178, 57,250,138,163, 99, 30,202, 86, 84,185,180,179,176, 64, 32,152, 57,118, +236,216,213,235,214,173, 19,231,231,231, 35, 39, 39, 7, 12,195, 64, 40, 20,162,101,203,150,196,233,211,167,125, 23, 44, 88,176, +242,232,209,163, 2,141, 70,243,173, 43, 3, 27, 46,151, 27,227,227,227,243, 66, 96, 96,160,164,160,160,160, 68,169, 84,158, 50, + 24, 12, 51, 81,251,109, 83, 72, 46,151, 59, 49, 60, 60,252,229,144,144,144,192,236,236,108,121, 86, 86,214, 33,131,193,176, 21, +181,220,168,217, 33, 79, 59,194, 26,173, 30, 64,110,120,120,248,173, 7, 15, 30, 20,184,145, 51, 39, 60, 60, 60,185, 22,156, 18, + 0,191, 2, 8,169,225,190, 28, 0,227,225,162, 53,219,158,177,172,229,216,226, 53,155,167, 71, 79,237, 75,252, 56,111,104,203, + 55,191, 59,125,145,228,177,253, 83,114, 75, 51, 27, 52,148,115, 34,203,186,165, 85, 69, 65, 85,221,181,106, 97, 48, 24,252, 77, + 38, 19,184, 85,108, 22,175,211,233,224,225,225,225,239,108, 34, 69, 34, 17,126,254,249,103,112,185, 92,112,185, 92, 20, 23, 23, + 35, 52, 52,212,126,206,227,241,236,159,155, 52,105, 82, 35, 31,195, 48,221, 41,138,130, 86,171, 5,195, 48,246, 67,169, 84,130, +101, 89, 8, 4, 2, 48, 76,217,118, 78, 14,215,187, 87,197, 71, 16,196,184,144,144, 16,236,222,189, 27, 70,163,241,145,235, 50, +153, 12, 73, 73,255,108, 50, 66, 81, 20,122,244,232, 65, 18, 4, 49, 14,192,188,106,120, 89, 0,136,138,138, 2, 69, 81,160, 40, + 10, 36, 73,218, 63,219, 14,134, 97,176,104,209, 34, 84,216,154,236,177,113, 62,109,168, 33, 50,124, 46,170,240,209, 34,235, 57, + 93,142, 75, 60, 67,196, 18,217,215,111,189,247,161,244,232,185,155,120,152,249,240, 17,145, 5, 0,215,126,223,138,220,156,108, + 36,166,102, 97,226,127,223,150,202,100, 94, 95, 87,104, 80,171, 92, 54,234,233,193,251,230,227,241,125,133, 90,115, 14, 52,222, + 0,213,156, 15,174, 88,135, 5,163, 59, 10,100, 30,188, 21,206,164, 83,192,231,255,190,236,244,105,187,200,234, 99, 48, 64,192, + 48,160, 25,198, 46,178,140, 52, 13,189,209,136, 96,173, 22,119,167, 77, 3,107, 54,227,211, 3, 7,196, 2, 62,255,119,103,210, + 9, 0, 60, 30, 47,248,208,161, 67, 77, 58,116,232, 16, 11,231,131,153,158,174,231,119, 84, 29,186,116,234,212, 41,110,199,142, + 29, 77,120, 60, 94,176, 59, 56,133, 66,225,107, 18,137,164, 80, 40, 20,190, 86,203,116,146, 0, 22, 79,159, 62, 61,225,185,231, +158, 59,107, 21, 86,118, 81,243,220,115,207,157,158, 62,125,250,117, 0,139,170, 40,235,149,113, 54, 10, 9, 9, 89,178,110,221, + 58,113,122,122, 58,178,179,179, 97, 54,155,241,250,235,175,131, 97, 24,232,245,122, 24,141, 70, 44, 95,190, 92,226,235,235,187, + 16,101, 27, 5, 59,243,236, 60, 79, 79,207,244,237,219,183,143,189,127,255,190,244,236,217,179, 68, 82, 82,146,100,229,202,149, + 99,124,125,125,211, 0, 8,106,145,159,100,112,112,240,143, 7, 15, 30,124, 43, 41, 41, 41,116,255,254,253,220, 75,151, 46, 5, +111,220,184,113, 70,112,112,240, 14, 0, 84, 45,223, 81,103,177, 88, 60,100,254,252,249,150, 11, 23, 46,100, 95,184,112, 33,123, +245,234,213,232,215,175, 95,159,232,232,232,200, 90,114,118,241,240,240, 24, 60,127,254,124,203,249,243,231,115, 46, 95,190,156, +181,114,229, 74,114,240,224,193,125,151, 44, 89,210,209, 69,206, 95, 47, 92,184, 48, 32, 51, 51,179, 89, 86, 86, 86,211,172,172, +172,240,172,172,172,240,236,236,236,176,220,220,220, 38,121,121,121,141, 11, 10, 10, 26,199,197,197,245, 5,176,203, 25,206,214, +129,146,183,230,189, 62,180,100,225,127, 71,178,159, 76,126,158, 93,240,250, 0,246,133,254, 29,126,163, 56, 28,226,114,242, 67, +132,122, 2, 91,231,116, 11,107,236, 39, 73,138,240,145,182,122,202,234,230,211,198,201,177, 9, 41,133, 66,129,163, 71,143,194, +106,189,234,236, 40,178,212,106, 53,114,115,115,109,215, 56,206,164, 83, 38,147,157,217,188,121, 51, 91, 90, 90, 10,149, 74,133, +130,130, 2,100,102,102,226,238,221,187, 40, 42, 42,194,237,219,183, 33, 22,139,207, 56,147, 78,130, 32,192, 48,140, 93, 72,157, + 58,117, 10,211,167, 79,135, 66,161,176,127,199,225,112,236,159,109,191,169,137,211,102,121, 98, 24, 6,151, 47, 95,198,172, 89, +179,176,122,245,106,236,218,181, 11, 71,142, 28,129, 66,161,176,139, 45,154,166,107,228,148,203,229,176, 88,156, 27, 51,177, 44, + 11,149, 74,229,244,123,119, 20, 64, 28, 14,231, 17, 81,100, 59, 92, 41, 75,117,228,124,106,225, 68,100,248,170, 71,216,182, 15, + 86, 83,221,192,250, 74, 36,201,225, 77, 28, 55,245, 93,223,172, 2, 53,178,243, 85,160,200,127,250,189,200,161, 83,193,161, 72, + 92, 57, 89,102,184, 34, 41, 10, 42,157, 1, 74,173, 9, 99,167,206,245,249, 97,245,231, 19,105, 83,105,181, 49, 94,218, 3, 45, + 35,164,210, 87,218,181,107, 66,166, 8, 82, 17,249, 66, 60, 24, 11,192,158,127, 17,157,139, 3,168, 54,191,243, 95,209,105, 76, + 75,146,128,244,106,173, 25, 94, 94, 34,239,142, 29, 17, 29, 18,130,254,102, 51,120, 44,139,231,243,243,241,215,220,185, 48,236, +219, 7, 18, 0,239,181,215, 48,104,205, 26,156, 11, 9, 65,144, 94, 15,229,251,239,195,255,196, 9,240,100, 50, 17, 10,157, 91, +252, 64, 16, 4, 6, 14, 28,136,211,167, 79,251,142, 24, 49,226,228,205,155, 55, 95,165,105,250, 92,109,242,214,211,211,243, 26, +135,195, 9,173,233, 62,154,166,179, 84, 42,149,203,219,140,112, 56,156,254, 61,122,244, 56,176,127,255,126,111,147,201,228,150, + 81, 8,159,207, 31, 49,102,204,152,205, 27, 54,108,144,205,152, 49, 99,243,145, 35, 71, 74,140, 70,227, 9, 87,138, 20,128,197, +155, 54,109,122, 51, 42, 42,202,107,198,140, 25,236,221,187,119, 29,173, 87,254,253,250,245,123,110,243,230,205, 65,221,186,117, +123,119,214,172, 89, 60, 0,159,214,100,229,145, 74,165,179, 55,111,222,236, 39,151,203,161,213,106,237,141,108, 86, 86, 22, 68, + 34, 17, 72,146, 4, 73,146,224,114,185,248,250,235,175,125,103,207,158, 61, 87,161, 80,204,117,194, 74, 22,179,126,253,122,255, + 97,195,134,145,247,239,223, 7, 73,146, 16, 10,133,120,227,141, 55, 72,189, 94,239, 29, 29, 29,189, 77,167,211, 77,112, 37, 15, +185, 92,238,196,152,152,152, 86,125,250,244,225,164,166,166,162, 87,175, 94,184,114,229, 10, 94,123,237, 53,174, 70,163,105,186, + 96,193,130,233, 6,131,193,213, 56, 46,193, 98,177,184,253, 31,127,252,145,217,184,113, 99,123,195,210,180,105, 83,102,212,168, + 81,138,212,212,212,214, 23, 46, 92, 40,234,221,187,183, 43, 27,150, 55, 18,139,197,109,142, 29, 59,150, 27, 29, 29, 61,100,211, +166, 77, 99, 0,160,123,247,238,135,190,250,234,171,179, 10,133, 34,226,220,185,115,138,254,253,251,103, 57,201, 23, 18, 28, 28, +204,204,153, 51, 71, 90,221, 77, 91,182,108, 81,162,108,195,229,102, 0,170,221,175,173,117,120,208,194, 21,115,199,137,192,152, +192,154,245,128,169, 4, 48,105, 97, 49,150,128,224,137, 0,179, 30,254, 2, 5,126,157,221, 90,246,209,238,123, 41,204,109, 98, + 84,170, 92,115, 2, 13,168,180,169, 1, 16, 73, 16, 68,226,209,163, 71,209,163, 71, 15, 28, 61,122, 20,163, 70,141, 74,116, 20, + 3, 73, 73, 73,232,223,191, 63,172, 22, 45,167,124,181, 84, 42,213,199,139, 22, 45, 58, 63,113,226, 68,113,185,198,128, 36,225, +229,229,133,145, 35, 71,150,234,116,186,143,157, 77, 40,195, 48,224,112, 56,200,202,202,194,150, 45, 91,176,116,233, 82,180,108, +217, 18,102,179,249, 17,177,101,109,247,156,106,252,104,154,198,213,171, 87,177,115,199, 14,124,186,112, 33, 60, 60, 60, 0, 0, + 38,147, 9,138,226, 98, 8,133, 66,187, 24,171, 65, 56,237,185,115,231,206,220,208,208,208,114, 83,134,182,191,214, 54, 11, 22, +139, 5, 52, 77,163,180,180, 20,171, 87,175,166, 89,150,221, 83, 83,255, 99, 19, 69,115,231,206,133,193,240,143, 65,189,163,213, + 39, 57, 60, 60, 28,157, 58,117,178,159,147, 36,201, 58,203,249, 67,239,246,208, 59,220,221,122,209, 74, 0, 64,104,104, 40, 90, +183,110,141,224,224,224, 42, 57,235, 91,139,212, 6, 46, 68,134,175, 90,104, 61,142,157,178,185, 60,225,160,230, 45, 90, 17, 15, +115, 21,224,112, 56,144,120,250,161,247,203,243, 64, 81, 36,164, 94,126, 32, 24,253, 63,138,152,164,192,161, 56, 80,104,244, 8, +111,214,130, 20, 8, 69,131,116, 53, 8, 45,153, 39,119,253,252, 9,189,133, 69,116, 22, 68, 77,132, 96,108,221,105, 8, 31,164, +175, 6, 31,140,104, 41,138, 58,116,115, 61, 84,230,193,206,164,151,162,105, 4, 80, 20, 76, 44,139,191,230,206, 69,100, 76, 12, + 18,109,194, 48, 38, 6,137, 81, 81,240,225,114, 33, 32, 73,176,102,243, 35,115,250,206, 8, 45, 0,200,204,204,196,190,125,251, +124,198,141, 27,119, 32, 41, 41,105,162,139, 98,195,198,229,119,249,242,229,128,102,205,154, 85,121,207,223,127,255,141,174, 93, +187,186, 60, 61,197,231,243, 71, 12, 30, 60,120,247,190,125,251, 60,147,147,147, 17, 16, 16, 80,103,161, 37, 16, 8,250, 15, 29, + 58,116,247,246,237,219,101,133,133,133,136,137,137,145,189,248,226,139,187, 18, 18, 18, 94, 54, 24, 12,206,136,205,114, 34, 43, + 38, 38, 70,185,101,203,150, 31, 80,126,138, 48,119,203,150, 45, 63,118,235,214,237,173,168,168, 40, 47, 0,111, 90,125, 7,170, + 21, 91, 2,129, 96, 96,243,230,205,203,141,106, 5,130, 50, 99,147, 68, 34,129,167,167, 39,120, 60, 30, 12, 6, 3, 34, 35, 35, + 9, 62,159,223,215,153,103,246,240,240, 24,250,202, 43,175,144,241,241,241,200,203,203,131,151,151, 23,164, 82, 41, 24,134,193, +140, 25, 51,168,213,171, 87, 15,212,233, 92,155,225,106,220,184,241,152, 33, 67,134,112,110,221,186,133,251,247,239,195, 96, 48, + 32, 45, 45, 13, 50,153, 12,147, 39, 79,230,173, 88,177,226,197,236,236,108, 87,133, 86,251,168,168,168,124, 71,145,101,131, 68, + 34, 33, 90,181,106,165,240,245,245,237, 2,192, 21,161,213,254,237,183,223, 46, 88,182,108, 89,255,211,167, 79,219,131, 94,158, + 62,125,122, 1, 0,124,251,237,183,231,253,253,253,187, 0,112, 86,104,129,101, 89,203,127,254,243,159, 12, 62,159, 15, 46,151, + 11, 62,159, 95,238,224,241,120, 32, 73,210,195, 86,157,107,226, 75,185,159,183,124,198,130,149, 43, 37, 66,138,251,222,203, 29, +208,196,139, 7,136,124,192,235,255, 17, 8,175, 50,163, 37,171,248, 27,248,253, 35,172,122, 69, 65, 70,253, 84,250,155,137,241, +246,191, 87, 92,172,121,194,125, 64, 55, 0,255,139,178,205,117, 23, 2,184,252,148,244, 77,215, 1, 68,142, 26, 53,202, 46,182, +142, 31, 63,142, 17, 35, 70, 64,169, 84,226,214,173, 91,142, 34,203,149, 13,150,175,155,205,230, 27, 63,255,252,115,239,113,227, +198, 17, 14,245, 11,201,201,201,184,125,251,118,162,179,124, 36, 73,194, 98,177,128,203,229, 98,229,202,149, 48,153, 76,248,233, +167,159,176,119,239, 94,144, 36, 9,130, 32, 64, 16, 4,100, 50, 25,190,251,238, 59,151,218, 61,134, 97,176,109,219, 54,124,180, + 96,129, 93,100, 89,103, 50, 16, 20, 24, 8, 95, 63, 63,220,187,119,175, 70,161, 85, 92, 92,252,197,225,195,135, 81,157, 51,252, +225,195,135,237,159, 43, 56,195,215,220,207, 81, 20, 12, 6, 3,158,127,254,159,173, 98,223,126,251,109,251,103,133, 66, 1,138, +162,108,121, 65, 56,203,169,103,129,151,133,255,124, 55,242,131, 15,202, 89,232,170,226,124, 28, 90,196, 93,214,173, 74,196, 86, +164,213, 58, 27, 12, 96, 20,202,124,180,114,129,199,232,163,197,178,150, 54,161,141, 66,112,227,110, 18, 56, 20, 5,190,167, 31, + 60,125, 2, 97,161,141, 80, 21,220, 71,236,254,239, 1, 0,155,182,237, 1, 73,146,224,112, 40, 24,140, 12, 90, 54, 9,129,197, + 98,105, 83, 29,119, 91,160,247,192, 64,191, 30,141,195,188,136, 91,222,247,209, 42,192,183,194, 68,136, 0, 45,115,164, 68, 47, +169,168,123,177, 74,221, 59, 5,184, 80,163, 24, 32, 73,144, 4, 1, 49,143, 7,195,190,125,101, 94,155, 49,101,125, 86, 98, 84, + 20,200,223,126,131,135, 64, 0,138, 32,192,177,154,160,107, 3,181, 90, 13,130, 32,176,115,231, 78,239,201,147, 39,239,186,117, +235, 86, 84,105,105,233, 62, 87, 56,148, 74,229,168, 62,125,250,156,221,182,109,155,127, 80, 80,208, 35,215,243,242,242, 48,117, +234,212, 66,165, 82,233, 82, 80, 55,161, 80,248,218,152, 49, 99, 54,111,221,186, 85,118,231,206, 29,104,181, 90,248,251,251,215, +181, 40,116,233,217,179,231,129,125,251,246,121,230,229,229, 65,165, 82,193, 96, 48, 96,231,206,157, 94, 35, 71,142,220,151,154, +154, 58, 2, 64, 66, 13, 28,159, 57,138,172, 89,179,102,221, 4, 16, 0, 96,125, 69, 13,106,189,214,193, 65,108,169, 0,172,168, +102, 36, 26, 38,145, 72, 80, 80, 80,128,169, 83,167, 34, 61,253, 31, 3,104, 72, 72,136,125,164,119,239,222, 61,248,251,251,131, + 32,136, 0,103, 30,218,223,223, 95,106, 52, 26, 49,125,250,116,100,102,102,150,227,204,202,202, 2, 65, 16, 98, 87, 51, 50, 48, + 48, 48, 80,175,215,163, 95,191,126, 40, 45, 45,219,215,119,252,248,241,224,114,185, 40, 40, 40, 0,151,203,245,171,197,251,241, + 27, 53,106, 84,149,161, 85,100, 50,153,201,219,219,187,173,139,156,190, 47,190,248, 98,118, 76, 76,204, 35, 11, 91,174, 92,185, +242,146,143,143,207,105, 31, 31,159, 86, 46,114, 90, 28, 69, 21,143,199, 43, 39,180,184, 92, 46, 72,146,116,218, 71, 45,189, 64, +183,142, 67,228,118, 90, 54,103,216,212, 38, 1,158, 96,181,249,224, 13,254, 2, 55, 10, 69, 88,185,250, 24, 0,224,195, 55,186, +162,227,208,197, 48,110, 29,134,185,189, 40,254,164, 44,195,124, 0,159, 61,225, 54,255, 27, 0,182, 85,112, 27, 0,116,122,138, +250, 35,187,216, 58,126,252, 56, 34, 34, 34, 80, 92, 92,140,212,212,212,218,138, 44, 91,123,247,209,151, 95,126,249,251,171,175, +190, 42,177, 13, 90, 69, 34, 17,222,127,255,125,189, 86,171,253,200,165, 66,100,177,128,195,225,216, 7,201, 66,161, 16,145,145, +145,118,145, 69, 16, 4, 74, 74, 74,192,225,112,108, 43, 18, 9, 39,211,136,224,160, 32,120,120,120,160, 69,203,150,184, 99,109, + 71,108,159, 5, 2, 1, 8,130, 0, 77,215,104,200,211, 88,157,218,231,185,187, 75,182,137,162,106, 77,199, 33, 33,176, 88, 44, + 54,145,201,186,131,211,207,207, 15, 90,173,214, 89,206,167, 18, 85, 88,180,108, 66,107, 20,202,124,181, 30, 9,239, 48, 0, 64, + 44,234,113, 73, 37, 1,150,176,176, 44, 56, 20,105,157,187,165, 64, 81, 36, 20,133,185, 88,243,197,155, 86,145,181, 23, 71,207, +167, 34,180,121,196, 63,243,184, 4, 1,176,213, 23,110,127, 79, 94,204,236, 87,123,138,242,137, 92,120,133,136, 33, 20, 86,208, +143,222, 60, 16,225, 36,230, 12, 12, 21, 95, 61, 92, 26,147,162, 50,213,216, 81, 8, 73,178,204,249,157, 32, 42,117,238, 33,173, +215, 40,130, 0,203,178, 96, 45,174,249, 29,219,132,188, 72, 36,130,201,100, 2, 69, 81, 88,187,118,173,215,208,161, 67,215,187, + 42,180, 0, 36,231,231,231,143,156, 49, 99,198,241, 61,123,246,248,249,249,249,149, 27, 61,204,152, 49, 67,158,159,159, 63, 18, + 46, 58,221,115,185,220,245, 27, 54,108,144, 61,120,240, 0, 37, 37, 37, 16,137, 68,246,198,167,182,229,179,123,247,238, 39, 79, +156, 56,225,173, 82,169, 96, 50,153, 32, 18,137,192,178, 44, 40,138,194, 47,191,252,226, 59,122,244,232, 99, 15, 31, 62, 28, 92, + 93, 90, 69, 34,209,203, 86,225,132,168,168, 40,175,168,168,168, 1, 64,149,145,122,237,136,138,138,242,154, 55,111,222,139,122, +189,126, 69, 53,207,156,169, 80, 40,130, 68, 34, 17,246,239,223, 15,169, 84, 10,177, 88,140,144,144, 16, 40, 20, 10,136,197, 98, +176, 44, 11,179,217,108,107, 44,138,156,121,240,194,194, 66, 45, 77,211,158,199,143, 31, 71, 81,209, 63, 63,105,210,164, 9,148, + 74, 37, 44, 22, 75,137,171,153,153,147,147,147, 79, 16, 68,227, 27, 55,110,224,193,131, 7, 24, 49, 98, 4,126,251,237, 55,116, +237, 90, 54, 59,108, 52, 26,107, 19,196,143,161, 40,138,173,166,220, 18, 0,188,221,201,105,237,188, 92,226,180, 88, 44, 22,155, +200,114,252,235, 40,190,106,248,159,229,170,115,219, 64,233,150,101,179,135, 76, 29, 22,225, 7,125,225,125, 8, 61,252, 64,120, +133, 99,229,234, 99,184,245,119,217,251, 90,185,235, 26,118, 71,143, 4, 68, 62,104,237, 41, 71,144, 7,231,149,219, 5, 79, 92, +104,121, 58,142, 19,158,214,142,105,196,136, 17, 80, 40, 20,144, 74,165,238,240,207,185,168,215,235,211, 14, 30, 60,216,101,212, +168, 81,224,243,249, 72, 75, 75, 67, 66, 66, 66, 42,128,139,174, 10, 45, 46,151,139, 47,191,252, 18,111,190,249, 38, 2, 3, 3, +241,209, 71, 31,129,195,225,216, 15,130, 32,236, 22, 46, 87, 16, 16, 88,253,194, 71,155, 67,124, 77,198,112, 79, 79,207, 47, 73, +146, 28, 71, 57,145,113, 12,195, 48, 22,139,101,143, 74,165,170, 54,188,131,205,113,221,153,119,225,152, 7, 53,244,105,117,230, +124, 28, 90,164, 54,168,184,218,176, 10,139,150,109,213,225, 35, 91, 1,217,158, 50,214,106,178,139,173,175,132, 18, 36,117, 59, + 43, 59, 7,190,222, 82,171,200,178, 30, 36,137,142, 17,101,131,217,163,231, 83, 17,218, 44, 2, 28,138, 2,135,162, 32, 21, 9, +144,159,151, 11, 14,135,188, 93, 21,111,123, 10,175,190,218,170,113,184,183, 47, 23,114,127, 35,130, 3,171, 48, 12,116,241, 64, +104, 48, 31,195,125,133, 97,237, 41,188, 90,189,245,141,181, 11, 45, 19, 77,131,247,218,107,246,233,194,196,168, 40, 68,198,196, +128, 25, 51, 6, 58,147,169,156,169,184,182, 66, 75, 36, 18, 65,163,209, 96,226,196,137, 10,179,217,252, 86, 45,179, 56,161,168, +168,104,236,164, 73,147,138,108, 2,198,100, 50, 97,210,164, 73, 69, 69, 69, 69, 99,157,176, 18, 61, 2,179,217,252, 86,215,174, + 93, 21,114,185,220,158,206,218, 52, 56, 54,248,248,248, 28,221,178,101,139,143,193, 96, 0, 77,211,118, 78,145, 72, 4,138,162, +224,239,239,143,221,187,119,251,251,248,248, 84,187,103,149, 94,175, 63, 24, 19, 19,163, 4,128,152,152, 24, 37, 65, 16,113, 4, + 65,108, 36, 8, 98, 67,133, 99, 35, 65, 16,113,142,247,234,245,250, 3,213,113, 27,141,198,184,212,212, 84, 86, 44, 22,131,162, + 40,152, 76, 38, 8,133, 66,187, 73, 92,173, 86, 67,175, 47,155,230, 78, 72, 72,128,217,108,142,119,230,217, 53, 26,205,153,109, +219,182, 89,154, 52,105,130,136,136, 8, 68, 70, 70,162,103,207,158, 8, 11, 11,195, 87, 95,125,197,232,116, 58,151,235, 94, 78, + 78,206,209, 95,127,253,213,220,184,113, 99,116,233,210, 5, 2,129, 0, 29, 59,118, 68, 72, 72, 8,150, 46, 93,106, 84,169, 84, +199,107,241,154, 30, 38, 37, 37, 81,213,136, 92, 25,156, 88,189, 91, 1,153, 87,175, 94,165,122,246,236,121,168,226,133,238,221, +187, 31,146, 74,165,158, 54, 19,187, 43, 35,114, 71,113, 37, 16, 8,236,135,237,123, 14,135,227,204,232,135,108, 27, 40,221,242, +245,155,131,166, 14,139,240,198,161, 51,151,193, 51, 41, 1, 99, 53, 51,130,140, 25, 4, 79,130, 64, 79,110,232, 83,208, 7,204, + 5,112, 19,101,113,152, 62,194,211, 5,187,227,123, 81, 81, 17, 82, 83, 83,145,144,144,128,158, 61,123, 34, 62, 62, 30,248,199, + 65,222,101,168, 84,170,143,162,163,163,117,182,149,124, 11, 23, 46,212,107, 52,154,143, 92,109,131, 89,150, 5,151,203, 69,235, +214,173, 49,111,222, 60, 28, 59,118, 12,105,105,105, 48,155,205,118, 33,100,243,201,116,197,162,197,227,241, 16, 24, 24, 8,179, +217,108,183,102, 1,192,157,244,116,112, 56, 28, 88, 44, 22, 24,141,198, 26, 45, 90,158,158,158, 95,110,222,188,249, 93,185, 92, + 30, 92, 88, 88, 24,224,120,228,231,231, 7,228,230,230, 6,100,103,103, 7,100,102,102, 6,100,100,100, 4,220,191,127, 63,120, +249,242,229,239,122,122,122,126,233, 76, 58, 41,138, 66,199,142, 29,241,246,219,111,219,143,117,235,214,217,143,216,216, 88,151, +157,215, 41,138, 66,235, 69, 43, 49,178,144,181, 31,199,252, 9,251,113,235,195, 89,213,113,214,187, 22,169,149,126,177,174, 54, +116,220, 88,186, 18,216, 86, 29,218,218, 50,187,219, 70, 69,103,248,122, 3,109, 44, 61,251,247,221,244, 65,173,219,119, 35,243, +228,218,114,203, 63, 35, 7,142, 5, 65, 16,104,212, 44, 2, 20,135, 3,138, 34,193,161, 40,120,201,132, 72,189,113,195, 98,208, +235,207, 86,198, 57, 0,224,240, 69,252,117,111, 12,239, 40,204,225, 23,192, 63, 88, 2, 30,183, 76, 59,178,127,143,173,208, 67, +112,128,246, 30,152,150,237, 43, 58,155, 95,186,206, 91,103, 58, 20,187, 59, 11,174, 0, 0, 12, 83, 73, 68, 65, 84, 87,197, 8, +208, 98,177, 64, 42, 16,160,212, 96,128,158,166, 49,112,205, 26,251,116, 33, 73, 16,184, 14,160,195,154, 53,184,176,111, 31,100, +124, 62, 32, 16, 56,189, 42,164, 50,161, 37,151,203, 49,101,202,148,162,220,220,220,201,181,241,209,178,193, 96, 48,156,203,203, +203,155, 60,118,236,216,157,251,247,239,247, 25, 59,118,172, 34, 47, 47,111,178,147,126, 79,143,160,180,180,116, 95,102,102,102, +201,148, 41, 83,118,236,218,181,203,215,207,207,207, 62, 18,169, 85, 97, 37, 8,249,144, 33, 67, 4,206,220, 87,195, 45,209, 86, +231,246, 55,173,150,173, 14,179,102,205,186,128, 50,255, 43, 71, 44,218,180,105,211,120,135, 41,198,141, 0,214, 84, 71,172, 86, +171, 55,204,155, 55,239,191,231,206,157,243, 19, 10,133, 32, 8, 2, 60, 30, 15, 45, 90,180,176,175,162,225,114,185, 96, 89, 22, + 31,124,240,129,188,160,160,224, 91, 39,223,205,172,232,232,232,254,165,165,165,222, 83,166, 76,161,132, 66, 33,242,243,243,177, +122,245,106,102,235,214,173, 74,157, 78, 55,181, 22, 66,120,219,231,159,127, 62, 80,171,213, 54,155, 49, 99, 6, 79,165, 82, 65, +175,215, 99,254,252,249,198, 31,127,252, 49, 75,175,215,187, 28,240,183, 87,175, 94,119, 51, 50, 50,250,150,148,148, 20,139,197, +226,138,214, 62, 66, 34,145,116, 3,176,195, 21,206,200,200,200,123, 15, 31, 62,236,185,120,241,226, 56,179,217,204,189,114,229, +138,221, 25,126,237,218,181,177, 66,161,112, 8, 92,220,124,149, 32, 8,139, 64, 32, 40,103,193,170,248,153,195,225,212,216,166, +181, 9, 18, 47,254,122,102,255,169,207,183,245,196,193, 51,215, 16,125,224,239,219, 45,167,250,183,126,206,187, 16,150,194, 84, +124,248, 70, 87,172,220,117, 13, 64,217,212,161,165,224, 22,216,226,123, 96, 61, 26,227,190, 66,158,243, 20,244, 1,177, 40, 11, +153,241,180,161,156,200,186,117,235, 22, 6, 13, 26, 4, 0,136,143,143, 71,159, 62,125, 16, 31, 31,143,190,125,251,186, 28, 75, +203,138, 63,212,106,117, 70,108,108,108,187,198,141, 27,227,226,197,139,247, 1,252,225,106, 34,109, 66,139,195,225,224,245,215, + 95,199,208,161, 67,209,164, 73,147,114,171, 13,109,159, 93, 17, 27, 52, 77,163,125,251,246, 48, 24,141,224,241,120,246,169, 73, + 14,135, 3,255,128, 0,220,189,123,215, 41,139, 22, 73,146,227, 94,126,249,101, 50, 57, 57, 25, 19, 38, 76,192,206,157, 59,171, +188,119,210,164, 73,248,249,231,159,241,242,203, 47,147,159,124,242, 73,181,225, 29,108, 78,232,206, 60,147,173,159,174,169,221, +119, 23,103,125,107,145,186,192, 33,180, 67,165,147, 38,149,124, 23, 83, 78,104, 57, 4, 9,171, 31,161, 69,155,118,254,246,211, +247,243,122,174,239,235, 31, 28,224, 9,133, 74,111, 23, 91,137,177,123, 1, 0,175,206, 90, 2, 14, 85, 54,165, 40,147, 10, 33, +226, 81,216,183,253, 91,185,201, 84, 90,105,233,210,112,201, 55, 63,233,221,194,147, 47, 49, 67, 29,196, 34,194,255,159,157,114, +136,102,123, 31, 21, 92,157,189,225,119,171, 24,111, 60, 39,149,125,155,172,124, 19,102,203,186, 71, 58, 68,165, 82,175,188,113, + 67, 52, 98,243,102, 92,153, 60, 25,141, 24, 6,113, 33, 33,240,225,114,225, 41, 16,128, 36, 8,232,143, 28,193,133,253,251, 17, + 40, 16, 0, 30, 30,160,191,250, 10,134,212, 84,152, 53, 26,125, 45, 70,102, 24, 63,126,188, 92, 46,151,143, 53, 26,141,231,234, +154,207,122,189,254, 68,102,102,230,155,189,122,245, 90,111, 54,155,223,210,235,245,117, 90, 25,101, 52, 26, 79,228,229,229,189, + 54,126,252,248,189, 7, 14, 28,240,243,242,242,170, 53, 87, 81, 81, 81, 87, 55, 21, 39, 11,128, 79,173,206,237,111, 70, 69, 69, +121, 93,189,122,245,191, 91,182,108, 89,239, 48,154, 8,152, 62,125,250,204, 10, 34,171,198, 85,135, 0, 30, 22, 20, 20,124,245, +254,251,239, 47, 89,181,106,149,212,230,248,254,215, 95,127,129,166,105,112,185, 92, 48, 12,131,233,211,167,107,139,138,138, 86, +162,234,136,206,143, 20, 45,181, 90,221, 98,241,226,197, 91,214,172, 89, 51,148,162, 40, 9,195, 48,186,146,146,146,184,210,210, +210,169,168, 93, 28, 45, 75, 97, 97,225,148,207, 62,251,108,202,234,213,171, 95, 38, 73, 50,128,166,105,185, 70,163, 57,172,215, +235,127, 68, 45,166,146, 46, 94,188, 88,248,198, 27,111,252, 93, 88, 88,216, 38, 52, 52, 84, 37,149, 74,141, 70,163,145, 18,137, + 68, 50,137, 68, 18, 9,224, 34, 65, 16, 41,174,112, 38, 38, 38,230,205,152, 49,227,129,193, 96,104,189,113,227,198,243, 50,153, +236, 12, 65, 16, 4,143,199,243, 22,137, 68,131, 0,196, 17, 4,113,199, 21, 78,146, 36, 45,142,214,171,138,254, 89,124, 62,223, + 41, 31,173,102,254,226,105, 67, 91,112,112,240,236, 53, 68, 31,124,184,141, 97,217,253,251, 19,139,143,124,212, 7, 48,237,121, + 3, 29,199,238, 40,155, 46, 4, 96, 41,184, 5,211,158, 73, 32,196,126, 56,159,205,133, 74,111, 58,138, 6, 84, 6,123,120, 7, +185, 92,142,228,228,100,155,200,138, 4,128,190,125,251, 38,218,196, 86, 66, 66, 2,186,116,233,146, 8,128,235,106,121, 85,171, +213,239, 79,156, 56,241,132,117,112,252,126, 45, 6,126,118,161,101, 19, 84, 77,154, 52,177,159, 59, 30, 14, 62, 90, 78,129, 97, + 24,240,120, 60,112, 56, 28, 4,135,132,216,255, 23,203,178,184,123,247, 46, 20, 10,133, 83, 66,139,162, 40,138, 32, 8, 76,152, +224,220,130,228,255,252,231, 63,136,139,139, 3,229,164, 42,164, 40, 10,225,225,225, 53,222, 99,211,165,206,114,134,134,134,214, +154,179,190,181, 72,109, 5, 86,101,159, 43, 19, 85, 85, 85,136,199,133, 28,173, 86,245,233,246,205,107, 87, 77,159,253,129,244, +214,189,124,168,180, 6, 80, 20,233,216,120,130,195,161, 32,147, 8,209, 56,200, 19,187,126,248, 95,141, 70,173,252, 12, 85,236, +123,216,196,131, 55,107, 72,183,231, 4,188, 96, 29, 90,119, 24, 15, 74,248,143, 8, 96,243,170,152, 29,236,243, 59, 94,120,168, + 19,254,246, 80, 55,235,122,177,241, 81,161,101, 52, 14, 91, 56,124,248,201,232, 99,199,196,221,183,109,195,189,233,211, 17,162, +215, 67, 96,157, 74, 36, 9, 2, 82, 30, 15, 82, 30,175, 76,100,173, 94, 13, 61, 77, 99,205,228,201, 37, 6,163,113,184, 43,149, +188,168,168, 8, 99,198,140, 41,204,201,201, 25,137, 90, 76,237, 85, 5,157, 78,183, 15,192, 62,119,241, 25, 12,134,115, 89, 89, + 89, 47,140, 25, 51,230,216,137, 19, 39,252,159,146, 32,115, 54,177,101,186,122,245,234,204,243,231,207,223, 67,249,141, 69,149, +231,207,159,191, 55, 99,198, 12, 98,203,150, 45, 63, 2,248, 28, 78, 6,240,212,233,116,107, 79,157, 58,133,254,253,251,127,190, +108,217, 50,223,174, 93,187, 34, 32, 32, 0, 26,141, 6, 9, 9, 9,152, 59,119,174, 66,173, 86, 47, 83, 42,149,171, 92, 76,179, +201, 96, 48, 76,114, 92, 74,237,142,124, 48, 24, 12, 91,115,115,115,183,186,139,112,206,156, 57,127,221,189,123,183,200,223,223, +191, 7,143,199,235,128, 50, 63,160, 60, 0, 63,186, 42,136,108,152, 61,123,246,141,187,119,239,202, 27, 53,106,212,211,202,233, +133,178,109,140, 54,215,130, 51,231,218,181,107,161,221,186,117, 35,185, 92, 46, 75, 81, 20,184, 92, 46,203,225,112, 88,171, 95, + 13, 11, 0,135, 15, 31, 22, 0,168,118,219,156,123, 5,250,197,147,254,247,207, 79, 82,242, 74,247,167,230,151,204, 3,192,238, +185, 37,254,189,163, 63, 53,108, 88,171, 44, 24, 98,250,130,144,149, 5,170,100,181,185, 32, 36,129,200,178, 52,194,162, 67,183, +243,104, 16, 43, 26, 52, 85,229,227,106, 88,195, 59,228,230,230, 58,138, 44,155,213, 42,178,111,223,190,137, 86,145,101,187, 86, + 27,255,178,211, 22,139,165, 78,125, 24,203,178,136,142,142,198,166, 77,155, 80, 83, 68,115,235,234, 62,162, 38, 62,155, 69,139, + 97, 24,152, 76, 38,220,186,117,203, 30,179,203, 54, 93,104, 11,237, 64,211,116,181,171,213, 25,134, 97,140, 70, 35,126,249,229, + 23,167,196,214,238,221,187, 81, 90, 90, 10,166, 6, 5,231, 24,138,161, 83,167, 78, 80, 40, 20,246,197, 62,145,145,255,132,202, + 51,153, 76, 46, 9, 87, 27,103,235,214,173, 33,151,203, 97,243, 23,110, 60,249, 31, 99, 15,173,211,253, 91,203,125,149, 22,173, +199,222, 99, 10,196,178, 19, 93,123, 15,237, 51,121,230, 92,137,214,192,224,193,131, 12, 20, 22,228,130, 36, 72, 4, 55, 10, 69, + 88, 88, 56, 68,124, 18, 59, 99, 86,233, 18, 47,156,249, 83,171, 41, 30, 81, 21,215, 40, 79,222,133,213,175,245,233,217,188,185, + 7, 1,218, 12, 48,102,128, 54, 3, 22,235, 95,219,119,150,242,101, 46, 57, 89,201,126,114, 93,113,233,168,202, 84,233,158, 85, + 99,129, 62, 94, 62, 62, 39, 23, 29, 62, 44,182,152, 76, 40,122,255,125,136,105, 26, 66,235,168,164,236, 65, 4,160,191,250,170, + 76,100, 77,154, 84,162, 82, 42, 93,218,130,199,207,207,239, 26, 65, 16,126,133,133,133,207, 84,100,120,127,127,255,163, 44,203, +202,229,114,121,215,167, 40, 93, 1, 0,148, 0, 76,149, 12, 36,252,225,186,255,143, 13,225,254,254,254,159,144, 36,217,139,101, + 89, 95,146, 36,139, 45, 22,203,197,130,130,130,229, 0,238, 54,244,167, 79, 12,182,200,240, 77,107,184,175, 0,192,123, 40,115, + 10,126,224, 44,121, 71, 79, 79, 79, 3,223,124,224,165, 8,193,192,113,145,158,104, 22,228, 1, 46, 79,136, 28, 53,141,211, 41, +106,108,142,205,203,212,155,153,209,233,133, 37, 73, 13,175,162, 90,184,125, 11, 30,119,194,199,199,231,242,201,147, 39,187, 54, +107,214,140,116,116,120,183,197,202,179, 77,111,113, 56,101, 90,238,220,185,115,244,132, 9, 19, 46,230,231,231,247,175,138,211, +195,195,227,247,155, 55,111, 62,175, 82,169, 30, 17, 84,142,145,226,109,231, 58,157, 14,179,103,207, 62, 85,213, 22, 60,158,158, +158,171, 87,173, 90,245,238,171,175,190, 74,218,194, 81, 56, 30,182,237,130,108,135,201,100,194,142, 29, 59, 44,223,126,251,237, +119, 42,149,170,202,169,195,224,224,224,204,156,156,156, 80, 91,168, 5,103,130,138,134,135,135,231,102,100,100,132, 60, 78,206, +103, 88,112,149,179,110, 61, 17,211, 4, 87, 36,154,227, 33,245,254,226,213,137,111,251,134, 55,111, 73, 4, 6, 55, 2, 1, 18, +249,121,217,200,248, 59,157, 61,240,211,247, 69, 58,181,226, 75,189, 94,247,125,117, 60,109,129,230, 77,101,188, 61,124, 6,173, + 96, 19, 64, 21,246,167,122,100,196, 1,192,196, 37,111, 63,208,152,199,167, 84, 51,237, 99, 19, 91,159, 30, 56, 32,230,183,106, +245, 72,160, 56,139,197, 2, 67,106, 42,214, 76,158,236,178,200,106, 64, 3, 26,224, 22, 52, 67,205, 49,178,204, 40,139,207,229, +170,197,132,104, 29, 32, 25,207, 2,227, 72, 88,218,147, 4,193,167, 89,164,129,197,239, 98, 78,201,250,196, 92,232, 27,178,223, + 41, 60,181,155, 74, 3,144,248,248,248,156,161, 40, 42,204,102,145,113,180,214, 87,178,161,244,131,252,252,252, 33, 0,170, 91, + 33,220,220,195,195,227,123,134, 97,186, 59,179,169, 52, 69, 81, 87, 52, 26,205, 28, 84,179,169,116,125,172, 58,244,245,245,189, +155,145,145,209,220,182,138,218,177,175,172,108,101,249,157, 59,119, 48, 96,192,128,140,188,188,188,240,199,201,249,180,162,138, + 85,135, 79,143, 69,203, 1, 33, 60,129,116, 10, 95, 36, 28,108, 49,211,173, 65, 0, 28, 46,247,182,177, 84,127,214,160,215,110, + 71, 21,211,133,143, 19, 99,129, 62, 2, 62,255,119,158, 76, 38,170, 76,180,153, 53, 26,189,193,104, 28,214, 32,178, 26,208,128, + 6, 52,160, 1,207, 16, 90,249,248,248,156,228,114,185, 2, 71, 49, 89,241,179, 13, 52, 77,151, 22, 22, 22,142, 0,144,246,152, + 57,255,127,194, 69, 39,181,161,206,114, 90,143, 1, 79, 59,103, 61, 62, 59,235, 70,206, 1, 86,206, 69,207, 72, 58, 7, 60,173, +156,182,231,117,129,119,168, 43,229,200, 93,249,233,144, 78,214,221,233,172, 47, 78,119,213,163, 74,210,201,214,195,123, 95,244, +140,164,115,192,211,198, 89,177,252, 56,201,235, 18,167,147,101,202,213,116,178,238, 78,103,125,113,214,181, 30, 85,147, 78,182, +174,101,169,138,119,191, 8,207, 32,146, 59,131, 77,238, 12,246, 86,151, 74,227, 54, 70, 85,245, 59,151, 28, 9,235,107, 37,128, + 45,236,190,149,159,120, 90, 57, 29,243,193,157, 91, 5,212,195,182, 3,177,238,230,172,144,159,238,194, 34,235, 10,147, 56, 56, + 17,112,212,149,103,119,199,123,175,240,172,110,225,173,133,200,114,137,211, 93,229,190,190, 57,221, 85,151, 42,114,186,163,220, + 87,246,222,235,241, 29,185, 43,157,110,169, 75,245, 81,230, 43, 41, 63,117,230,173,200,233,142,186, 84,145,211, 29,229,254,113, +112,186,163, 46, 85,198,233,142,114, 95,213,187,127, 86, 13, 77,182,233, 66,107,136, 7,194, 9,177, 21, 3, 0,100,109, 50,173, + 30, 45,101, 3,221,205,233,238, 52,215,135,216,116,193, 2,243,196, 57,221,252,142, 22, 89, 57,221, 57,186, 25,232,174,119, 84, + 31,229,221,145,211, 93,252, 21,121,220,241,158, 42,227,172,107,122,171, 72,167,219,159,189,174,229,254,113,113,186,249, 29,185, +165, 46, 85,224, 28,232,230,193,192, 64,135,243, 69,238,228,116, 87, 93,170, 36,157,117,126, 79,149,113,214, 53,189, 85,164,211, +237,207,238,142, 62,164,190,120,159,164, 69,139, 37,171, 44, 19, 49, 21,142,199, 34, 52,158,216,148,156,139,220,255, 42, 78, 23, +167,103,134,214,195,187,127,162,233,116, 39,103,197, 52,186,115,186,167, 62,211,233, 78, 78, 23,210,250,175,227,124,214,222,251, +211,152,159, 85,241,213,101, 90,170, 42,235,104,125,164,211,157,156, 78,114,255, 43, 56,235,240,238,255,117,224, 60, 45, 9,177, +101,188,155, 71, 38,112,179, 5,166,222,158,219,205,233, 28, 88, 31, 22,194,122,128,219,211,105, 29, 41,127, 81, 15,207,254,172, +228,105, 67, 93,106,168, 75, 79, 93, 93,170, 80, 38, 7,186,209, 82,228, 86,203,115, 69, 78,119,252, 15, 71, 14,119,149,209,250, +126,118,119,214,165,250,120,247,207, 26,254, 15,219, 91,208, 7,192,137,204,236, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130, 0}; diff --git a/source/blender/editors/include/UI_icons.h b/source/blender/editors/include/UI_icons.h index 25e20909f34..dc1c20dcca5 100644 --- a/source/blender/editors/include/UI_icons.h +++ b/source/blender/editors/include/UI_icons.h @@ -589,8 +589,9 @@ DEF_ICON(MOD_MULTIRES) DEF_ICON(MOD_SMOKE) DEF_ICON(MOD_SOLIDIFY) DEF_ICON(MOD_SCREW) +DEF_ICON(MOD_WEIGHTVG) #ifndef DEF_ICON_BLANK_SKIP - DEF_ICON(BLANK160) +/* DEF_ICON(BLANK160)*/ DEF_ICON(BLANK161) DEF_ICON(BLANK162) DEF_ICON(BLANK163) diff --git a/source/blender/editors/space_outliner/outliner.c b/source/blender/editors/space_outliner/outliner.c index 93dc96cf9c0..d39a8fe4a87 100644 --- a/source/blender/editors/space_outliner/outliner.c +++ b/source/blender/editors/space_outliner/outliner.c @@ -4424,6 +4424,10 @@ static void tselem_draw_icon(uiBlock *block, int xmax, float x, float y, TreeSto UI_icon_draw(x, y, ICON_MOD_SOLIDIFY); break; case eModifierType_Screw: UI_icon_draw(x, y, ICON_MOD_SCREW); break; + case eModifierType_WeightVGEdit: + case eModifierType_WeightVGMix: + case eModifierType_WeightVGProximity: + UI_icon_draw(x, y, ICON_MOD_WEIGHTVG); break; default: UI_icon_draw(x, y, ICON_DOT); break; } diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index d2d8e014015..2b1111e1308 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -71,6 +71,9 @@ typedef enum ModifierType { eModifierType_Solidify, eModifierType_Screw, eModifierType_Warp, + eModifierType_WeightVGEdit, + eModifierType_WeightVGMix, + eModifierType_WeightVGProximity, NUM_MODIFIER_TYPES } ModifierType; @@ -674,7 +677,6 @@ typedef struct ShrinkwrapModifierData { #define MOD_SHRINKWRAP_PROJECT_OVER_Z_AXIS (1<<2) #define MOD_SHRINKWRAP_PROJECT_OVER_NORMAL 0 /* projection over normal is used if no axis is selected */ - typedef struct SimpleDeformModifierData { ModifierData modifier; @@ -784,4 +786,167 @@ typedef enum { /* PROP_RANDOM not used */ } WarpModifierFalloff; +typedef struct WeightVGEditModifierData { + ModifierData modifier; + + /* XXX Note: I tried to keep everything logically ordered – provided the + * alignment constraints… + */ + + char defgrp_name[32]; /* Name of vertex group to edit. */ + + /* Flags (MOD_WVG_EDIT_MAP, MOD_WVG_EDIT_CMAP, MOD_WVG_EDIT_REVERSE_WEIGHTS, + * MOD_WVG_EDIT_ADD2VG, MOD_WVG_EDIT_REMFVG, MOD_WVG_EDIT_CLAMP). + */ + int edit_flags; + float default_weight; /* Weight for vertices not in vgroup. */ + + /* Mapping stuff. */ + float map_org_min, map_org_max; + float map_new_min, map_new_max; + struct CurveMapping *cmap_curve; /* The custom mapping curve! */ + + /* The add/remove vertices weight thresholds. */ + float add_threshold, rem_threshold; + + /* Clamping options. */ + float clamp_min_weight, clamp_max_weight; + + /* Masking options. */ + float mask_constant; /* The global “influence”, if no vgroup nor tex is used as mask. */ + /* Name of mask vertex group from which to get weight factors. */ + char mask_defgrp_name[32]; + + /* Texture masking. */ + int mask_tex_use_channel; /* Which channel to use as weightf. */ + struct Tex *mask_texture; /* The texture. */ + struct Object *mask_tex_map_obj; /* Name of the map object. */ + /* How to map the texture (using MOD_DISP_MAP_xxx constants). */ + int mask_tex_mapping; + char mask_tex_uvlayer_name[32]; /* Name of the UV layer. */ + + /* Padding… */ + int pad_i1; +} WeightVGEditModifierData; + +/* WeightVGEdit flags. */ +/* Use parametric mapping. */ +#define MOD_WVG_EDIT_MAP (1 << 0) +/* Use curve mapping. */ +#define MOD_WVG_EDIT_CMAP (1 << 1) +/* Reverse weights (in the [0.0, 1.0] standard range). */ +#define MOD_WVG_EDIT_REVERSE_WEIGHTS (1 << 2) +/* Add vertices with higher weight than threshold to vgroup. */ +#define MOD_WVG_EDIT_ADD2VG (1 << 3) +/* Remove vertices with lower weight than threshold from vgroup. */ +#define MOD_WVG_EDIT_REMFVG (1 << 4) +/* Clamp weights. */ +#define MOD_WVG_EDIT_CLAMP (1 << 5) + +typedef struct WeightVGMixModifierData { + ModifierData modifier; + + /* XXX Note: I tried to keep everything logically ordered – provided the + * alignment constraints… + */ + + char defgrp_name[32]; /* Name of vertex group to modify/weight. */ + char defgrp_name2[32]; /* Name of other vertex group to mix in. */ + float default_weight; /* Default weight value for first vgroup. */ + float default_weight2; /* Default weight value to mix in. */ + char mix_mode; /* How second vgroup’s weights affect first ones */ + char mix_set; /* What vertices to affect. */ + + char pad_c1, pad_c2; + int pad_i1; + + /* Masking options. */ + float mask_constant; /* The global “influence”, if no vgroup nor tex is used as mask. */ + /* Name of mask vertex group from which to get weight factors. */ + char mask_defgrp_name[32]; + + /* Texture masking. */ + int mask_tex_use_channel; /* Which channel to use as weightf. */ + struct Tex *mask_texture; /* The texture. */ + struct Object *mask_tex_map_obj; /* Name of the map object. */ + int mask_tex_mapping; /* How to map the texture! */ + char mask_tex_uvlayer_name[32]; /* Name of the UV layer. */ + + /* Padding… */ + int pad_i2; +} WeightVGMixModifierData; + +/* How second vgroup’s weights affect first ones. */ +#define MOD_WVG_MIX_SET 1 /* Second weights replace weights. */ +#define MOD_WVG_MIX_ADD 2 /* Second weights are added to weights. */ +#define MOD_WVG_MIX_SUB 3 /* Second weights are subtracted from weights. */ +#define MOD_WVG_MIX_MUL 4 /* Second weights are multiplied with weights. */ +#define MOD_WVG_MIX_DIV 5 /* Second weights divide weights. */ +#define MOD_WVG_MIX_DIF 6 /* Difference between second weights and weights. */ +#define MOD_WVG_MIX_AVG 7 /* Average of both weights. */ + +/* What vertices to affect. */ +#define MOD_WVG_SET_ALL 1 /* Affect all vertices. */ +#define MOD_WVG_SET_ORG 2 /* Affect only vertices in first vgroup. */ +#define MOD_WVG_SET_NEW 3 /* Affect only vertices in second vgroup. */ +#define MOD_WVG_SET_UNION 4 /* Affect only vertices in one vgroup or the other. */ +#define MOD_WVG_SET_INTER 5 /* Affect only vertices in both vgroups. */ + +typedef struct WeightVGProximityModifierData { + ModifierData modifier; + + /* XXX Note: I tried to keep everything logically ordered – provided the + * alignment constraints… + */ + + char defgrp_name[32]; /* Name of vertex group to modify/weight. */ + + /* Proximity modes. */ + int proximity_mode; + int proximity_flags; + + /* Target object from which to calculate vertices’ distances. */ + struct Object *proximity_ob_target; + + /* Masking options. */ + float mask_constant; /* The global “influence”, if no vgroup nor tex is used as mask. */ + /* Name of mask vertex group from which to get weight factors. */ + char mask_defgrp_name[32]; + + /* Texture masking. */ + int mask_tex_use_channel; /* Which channel to use as weightf. */ + struct Tex *mask_texture; /* The texture. */ + struct Object *mask_tex_map_obj; /* Name of the map object. */ + int mask_tex_mapping; /* How to map the texture! */ + char mask_tex_uvlayer_name[32]; /* Name of the UV layer. */ + + /* Padding… */ + int pad_i2; +} WeightVGProximityModifierData; + +/* Modes of proximity weighting. */ +/* Dist from target object to affected object. */ +#define MOD_WVG_PROXIMITY_OBJ2OBJDIST 1 +/* Dist from target object to vertex. */ +#define MOD_WVG_PROXIMITY_OBJ2VERTDIST 2 + +/* Flags options for proximity weighting. */ +/* Use nearest vertices of target obj, in OVJ2VERTDIST mode. */ +#define MOD_WVG_PROXIMITY_O2VD_VERTS (1 << 0) +/* Use nearest edges of target obj, in OVJ2VERTDIST mode. */ +#define MOD_WVG_PROXIMITY_O2VD_EDGES (1 << 1) +/* Use nearest faces of target obj, in OVJ2VERTDIST mode. */ +#define MOD_WVG_PROXIMITY_O2VD_FACES (1 << 2) + +/* Defines common to all WeightVG modifiers. */ +/* Tex channel to be used as mask. */ +#define MOD_WVG_MASK_TEX_USE_INT 1 +#define MOD_WVG_MASK_TEX_USE_RED 2 +#define MOD_WVG_MASK_TEX_USE_GREEN 3 +#define MOD_WVG_MASK_TEX_USE_BLUE 4 +#define MOD_WVG_MASK_TEX_USE_HUE 5 +#define MOD_WVG_MASK_TEX_USE_SAT 6 +#define MOD_WVG_MASK_TEX_USE_VAL 7 +#define MOD_WVG_MASK_TEX_USE_ALPHA 8 + #endif diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h index 882fbce9271..f0e196686e0 100644 --- a/source/blender/makesrna/RNA_access.h +++ b/source/blender/makesrna/RNA_access.h @@ -562,6 +562,9 @@ extern StructRNA RNA_VoxelData; extern StructRNA RNA_VoxelDataTexture; extern StructRNA RNA_WarpModifier; extern StructRNA RNA_WaveModifier; +extern StructRNA RNA_WeightVGEditModifier; +extern StructRNA RNA_WeightVGMixModifier; +extern StructRNA RNA_WeightVGProximityModifier; extern StructRNA RNA_Window; extern StructRNA RNA_WindowManager; extern StructRNA RNA_WipeSequence; diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index d2c1b862fee..fff99cbdf15 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -68,6 +68,9 @@ EnumPropertyItem modifier_type_items[] ={ {eModifierType_Solidify, "SOLIDIFY", ICON_MOD_SOLIDIFY, "Solidify", ""}, {eModifierType_Subsurf, "SUBSURF", ICON_MOD_SUBSURF, "Subdivision Surface", ""}, {eModifierType_UVProject, "UV_PROJECT", ICON_MOD_UVPROJECT, "UV Project", ""}, + {eModifierType_WeightVGEdit, "WEIGHT_VGEDIT", ICON_MOD_WEIGHTVG, "Edit Vertex Group Weights", ""}, + {eModifierType_WeightVGMix, "WEIGHT_VGMIX", ICON_MOD_WEIGHTVG, "Mix Two Vertex Groups", ""}, + {eModifierType_WeightVGProximity, "WEIGHT_VGPROXIMITY", ICON_MOD_WEIGHTVG, "Weight Vertex Group - Poximity", ""}, {0, "", 0, "Deform", ""}, {eModifierType_Armature, "ARMATURE", ICON_MOD_ARMATURE, "Armature", ""}, {eModifierType_Cast, "CAST", ICON_MOD_CAST, "Cast", ""}, @@ -183,6 +186,12 @@ static StructRNA* rna_Modifier_refine(struct PointerRNA *ptr) return &RNA_ScrewModifier; case eModifierType_Warp: return &RNA_WarpModifier; + case eModifierType_WeightVGEdit: + return &RNA_WeightVGEditModifier; + case eModifierType_WeightVGMix: + return &RNA_WeightVGMixModifier; + case eModifierType_WeightVGProximity: + return &RNA_WeightVGProximityModifier; default: return &RNA_Modifier; } @@ -375,6 +384,46 @@ static void rna_SolidifyModifier_vgroup_set(PointerRNA *ptr, const char *value) rna_object_vgroup_name_set(ptr, value, smd->defgrp_name, sizeof(smd->defgrp_name)); } +static void rna_WeightVGModifier_vgroup_set(PointerRNA *ptr, const char *value) +{ + ModifierData *md = (ModifierData*)ptr->data; + if (md->type == eModifierType_WeightVGEdit) { + WeightVGEditModifierData *wmd= (WeightVGEditModifierData*)md; + rna_object_vgroup_name_set(ptr, value, wmd->defgrp_name, sizeof(wmd->defgrp_name)); + } + else if (md->type == eModifierType_WeightVGMix) { + WeightVGMixModifierData *wmd= (WeightVGMixModifierData*)md; + rna_object_vgroup_name_set(ptr, value, wmd->defgrp_name, sizeof(wmd->defgrp_name)); + } + else if (md->type == eModifierType_WeightVGProximity) { + WeightVGProximityModifierData *wmd= (WeightVGProximityModifierData*)md; + rna_object_vgroup_name_set(ptr, value, wmd->defgrp_name, sizeof(wmd->defgrp_name)); + } +} + +static void rna_WeightVGModifier_mask_vgroup_set(PointerRNA *ptr, const char *value) +{ + ModifierData *md = (ModifierData*)ptr->data; + if (md->type == eModifierType_WeightVGEdit) { + WeightVGEditModifierData *wmd= (WeightVGEditModifierData*)md; + rna_object_vgroup_name_set(ptr, value, wmd->mask_defgrp_name, sizeof(wmd->mask_defgrp_name)); + } + else if (md->type == eModifierType_WeightVGMix) { + WeightVGMixModifierData *wmd= (WeightVGMixModifierData*)md; + rna_object_vgroup_name_set(ptr, value, wmd->mask_defgrp_name, sizeof(wmd->mask_defgrp_name)); + } + else if (md->type == eModifierType_WeightVGProximity) { + WeightVGProximityModifierData *wmd= (WeightVGProximityModifierData*)md; + rna_object_vgroup_name_set(ptr, value, wmd->mask_defgrp_name, sizeof(wmd->mask_defgrp_name)); + } +} + +static void rna_WeightVGMixModifier_vgroup2_set(PointerRNA *ptr, const char *value) +{ + WeightVGMixModifierData *wmd= (WeightVGMixModifierData*)ptr->data; + rna_object_vgroup_name_set(ptr, value, wmd->defgrp_name2, sizeof(wmd->defgrp_name2)); +} + static void rna_MappingInfo_uvlayer_set(PointerRNA *ptr, const char *value) { MappingInfoModifierData *mmd= (MappingInfoModifierData *)ptr->data; @@ -399,6 +448,23 @@ static void rna_WaveModifier_uvlayer_set(PointerRNA *ptr, const char *value) rna_object_uvlayer_name_set(ptr, value, wmd->uvlayer_name, sizeof(wmd->uvlayer_name)); } +static void rna_WeightVGModifier_mask_uvlayer_set(PointerRNA *ptr, const char *value) +{ + ModifierData *md = (ModifierData*)ptr->data; + if (md->type == eModifierType_WeightVGEdit) { + WeightVGEditModifierData *wmd = (WeightVGEditModifierData*)md; + rna_object_uvlayer_name_set(ptr, value, wmd->mask_tex_uvlayer_name, sizeof(wmd->mask_tex_uvlayer_name)); + } + else if (md->type == eModifierType_WeightVGMix) { + WeightVGMixModifierData *wmd = (WeightVGMixModifierData*)md; + rna_object_uvlayer_name_set(ptr, value, wmd->mask_tex_uvlayer_name, sizeof(wmd->mask_tex_uvlayer_name)); + } + else if (md->type == eModifierType_WeightVGProximity) { + WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*)md; + rna_object_uvlayer_name_set(ptr, value, wmd->mask_tex_uvlayer_name, sizeof(wmd->mask_tex_uvlayer_name)); + } +} + static void rna_MultiresModifier_level_range(PointerRNA *ptr, int *min, int *max) { MultiresModifierData *mmd = (MultiresModifierData*)ptr->data; @@ -2407,6 +2473,314 @@ static void rna_def_modifier_screw(BlenderRNA *brna) RNA_def_property_update(prop, 0, "rna_Modifier_update");*/ } +static void rna_def_modifier_weightvg_mask(BlenderRNA *brna, StructRNA *srna) +{ + static EnumPropertyItem weightvg_mask_tex_map_items[] = { + {MOD_DISP_MAP_LOCAL, "LOCAL", 0, "Local", ""}, + {MOD_DISP_MAP_GLOBAL, "GLOBAL", 0, "Global", ""}, + {MOD_DISP_MAP_OBJECT, "OBJECT", 0, "Object", ""}, + {MOD_DISP_MAP_UV, "UV", 0, "UV", ""}, + {0, NULL, 0, NULL, NULL}}; + + static EnumPropertyItem weightvg_mask_tex_used_items[] = { + {MOD_WVG_MASK_TEX_USE_INT, "INT", 0, "Intensity", ""}, + {MOD_WVG_MASK_TEX_USE_RED, "RED", 0, "Red", ""}, + {MOD_WVG_MASK_TEX_USE_GREEN, "GREEN", 0, "Green", ""}, + {MOD_WVG_MASK_TEX_USE_BLUE, "BLUE", 0, "Blue", ""}, + {MOD_WVG_MASK_TEX_USE_HUE, "HUE", 0, "Hue", ""}, + {MOD_WVG_MASK_TEX_USE_SAT, "SAT", 0, "Saturation", ""}, + {MOD_WVG_MASK_TEX_USE_VAL, "VAL", 0, "Value", ""}, + {MOD_WVG_MASK_TEX_USE_ALPHA, "ALPHA", 0, "Alpha", ""}, + {0, NULL, 0, NULL, NULL}}; + + PropertyRNA *prop; + + prop= RNA_def_property(srna, "mask_constant", PROP_FLOAT, PROP_NONE); + RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); + RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0); + RNA_def_property_ui_text(prop, "Influence", "Global influence of current modifications on vgroup."); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "mask_vertex_group", PROP_STRING, PROP_NONE); + RNA_def_property_string_sdna(prop, NULL, "mask_defgrp_name"); + RNA_def_property_ui_text(prop, "Mask VGroup", "Masking vertex group name."); + RNA_def_property_string_funcs(prop, NULL, NULL, "rna_WeightVGModifier_mask_vgroup_set"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "mask_texture", PROP_POINTER, PROP_NONE); + RNA_def_property_ui_text(prop, "Masking Tex", "Masking texture."); + RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "mask_tex_use_channel", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_items(prop, weightvg_mask_tex_used_items); + RNA_def_property_ui_text(prop, "Use Channel", "Which texture channel to use for masking."); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "mask_tex_mapping", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_items(prop, weightvg_mask_tex_map_items); + RNA_def_property_ui_text(prop, "Texture Coordinates", "Which texture coordinates " + "to use for mapping."); + RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); + + prop= RNA_def_property(srna, "mask_tex_uv_layer", PROP_STRING, PROP_NONE); + RNA_def_property_string_sdna(prop, NULL, "mask_tex_uvlayer_name"); + RNA_def_property_ui_text(prop, "UV Layer", "UV layer name"); + RNA_def_property_string_funcs(prop, NULL, NULL, "rna_WeightVGModifier_mask_uvlayer_set"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "mask_tex_map_obj", PROP_POINTER, PROP_NONE); + RNA_def_property_ui_text(prop, "Texture Coordinate Object", "Which object to take texture " + "coordinates from."); + RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK); + RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); +} + +static void rna_def_modifier_weightvgedit(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + srna= RNA_def_struct(brna, "WeightVGEditModifier", "Modifier"); + RNA_def_struct_ui_text(srna, "Edit Vertex Group Weights Modifier", + "Edit the weights of vertices in a group."); + RNA_def_struct_sdna(srna, "WeightVGEditModifierData"); + RNA_def_struct_ui_icon(srna, ICON_MOD_WEIGHTVG); + + prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE); + RNA_def_property_string_sdna(prop, NULL, "defgrp_name"); + RNA_def_property_ui_text(prop, "Vertex Group", "Vertex group name."); + RNA_def_property_string_funcs(prop, NULL, NULL, "rna_WeightVGModifier_vgroup_set"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "flag_map", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "edit_flags", MOD_WVG_EDIT_MAP); + RNA_def_property_ui_text(prop, "Map", "Map vertex group weights."); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "flag_curve_map", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "edit_flags", MOD_WVG_EDIT_CMAP); + RNA_def_property_ui_text(prop, "Curve Map", "Map vertex group weights with a curve."); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "flag_reverse", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "edit_flags", MOD_WVG_EDIT_REVERSE_WEIGHTS); + RNA_def_property_ui_text(prop, "Reverse", "Reverse vertex group weights."); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "flag_add2vg", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "edit_flags", MOD_WVG_EDIT_ADD2VG); + RNA_def_property_ui_text(prop, "Add to VG", "Add vertices with weight over threshold " + "to vgroup."); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "flag_remfvg", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "edit_flags", MOD_WVG_EDIT_REMFVG); + RNA_def_property_ui_text(prop, "Rem from VG", "Remove vertices with weight below threshold " + "from vgroup."); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "flag_clamp", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "edit_flags", MOD_WVG_EDIT_CLAMP); + RNA_def_property_ui_text(prop, "Clamp", "Clamp vertex group weights."); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "default_weight", PROP_FLOAT, PROP_NONE); + RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); + RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0); + RNA_def_property_ui_text(prop, "Default Weight", "Default weight a vertex will have if " + "it is not in the vgroup."); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "map_input_low", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "map_org_min"); + RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); + RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0); + RNA_def_property_ui_text(prop, "Input Low Weight", "Low input mapping value."); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "map_input_high", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "map_org_max"); + RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); + RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0); + RNA_def_property_ui_text(prop, "Input High Weight", "High input mapping value."); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "map_output_low", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "map_new_min"); + RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); + RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0); + RNA_def_property_ui_text(prop, "Output Low Weight", "Low output mapping value."); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "map_output_high", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "map_new_max"); + RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); + RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0); + RNA_def_property_ui_text(prop, "Output High Weight", "High output mapping value."); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "cmap_curve", PROP_POINTER, PROP_NONE); + RNA_def_property_pointer_sdna(prop, NULL, "cmap_curve"); + RNA_def_property_ui_text(prop, "Mapping Curve", "Custom mapping curve."); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "add_threshold", PROP_FLOAT, PROP_NONE); + RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); + RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0); + RNA_def_property_ui_text(prop, "Add Threshold", "Lower bound for a vertex’s weight " + "to be added to the vgroup."); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "rem_threshold", PROP_FLOAT, PROP_NONE); + RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); + RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0); + RNA_def_property_ui_text(prop, "Rem Threshold", "Upper bound for a vertex’s weight " + "to be removed from the vgroup."); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "clamp_min_weight", PROP_FLOAT, PROP_NONE); + RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); + RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0); + RNA_def_property_ui_text(prop, "Min Weight", "Lowest weight a vertex can get."); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "clamp_max_weight", PROP_FLOAT, PROP_NONE); + RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); + RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0); + RNA_def_property_ui_text(prop, "Max Weight", "Highest weight a vertex can get."); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + /* Common masking properties. */ + rna_def_modifier_weightvg_mask(brna, srna); +} + +static void rna_def_modifier_weightvgmix(BlenderRNA *brna) +{ + static EnumPropertyItem weightvg_mix_modes_items[] = { + {MOD_WVG_MIX_SET, "SET", 0, "Replace weights", ""}, + {MOD_WVG_MIX_ADD, "ADD", 0, "Add to weights", ""}, + {MOD_WVG_MIX_SUB, "SUB", 0, "Subtract from weights", ""}, + {MOD_WVG_MIX_MUL, "MUL", 0, "Multiply weights", ""}, + {MOD_WVG_MIX_DIV, "DIV", 0, "Divide weights", ""}, + {MOD_WVG_MIX_DIF, "DIF", 0, "Difference", ""}, + {MOD_WVG_MIX_AVG, "AVG", 0, "Average", ""}, + {0, NULL, 0, NULL, NULL}}; + + static EnumPropertyItem weightvg_mix_set_items[] = { + {MOD_WVG_SET_ALL, "ALL", 0, "All vertices", ""}, + {MOD_WVG_SET_ORG, "ORG", 0, "Vertices from vgroup 1", ""}, + {MOD_WVG_SET_NEW, "NEW", 0, "Vertices from vgroup 2", ""}, + {MOD_WVG_SET_UNION, "UNION", 0, "Vertices from one group", ""}, + {MOD_WVG_SET_INTER, "INTER", 0, "Vertices from both groups", ""}, + {0, NULL, 0, NULL, NULL}}; + + StructRNA *srna; + PropertyRNA *prop; + + srna= RNA_def_struct(brna, "WeightVGMixModifier", "Modifier"); + RNA_def_struct_ui_text(srna, "Weight Vertex Group Modifier", + "Mix the weights of two vertex groups."); + RNA_def_struct_sdna(srna, "WeightVGMixModifierData"); + RNA_def_struct_ui_icon(srna, ICON_MOD_WEIGHTVG); + + prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE); + RNA_def_property_string_sdna(prop, NULL, "defgrp_name"); + RNA_def_property_ui_text(prop, "Vertex Group", "First vertex group name."); + RNA_def_property_string_funcs(prop, NULL, NULL, "rna_WeightVGModifier_vgroup_set"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "vertex_group2", PROP_STRING, PROP_NONE); + RNA_def_property_string_sdna(prop, NULL, "defgrp_name2"); + RNA_def_property_ui_text(prop, "Vertex Group 2", "Second vertex group name."); + RNA_def_property_string_funcs(prop, NULL, NULL, "rna_WeightVGMixModifier_vgroup2_set"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "default_weight", PROP_FLOAT, PROP_NONE); + RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); + RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0); + RNA_def_property_ui_text(prop, "Default Weight", "Default weight a vertex will have if " + "it is not in the first vgroup."); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "default_weight2", PROP_FLOAT, PROP_NONE); + RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); + RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0); + RNA_def_property_ui_text(prop, "Default Weight 2", "Default weight a vertex will have if " + "it is not in the second vgroup."); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "mix_mode", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_items(prop, weightvg_mix_modes_items); + RNA_def_property_ui_text(prop, "Mix Mode", "How weights from vgroup 2 affect weights " + "of vgroup 1."); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "mix_set", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_items(prop, weightvg_mix_set_items); + RNA_def_property_ui_text(prop, "Vertex Set", "Which vertices should be affected."); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + /* Common masking properties. */ + rna_def_modifier_weightvg_mask(brna, srna); +} + +static void rna_def_modifier_weightvgproximity(BlenderRNA *brna) +{ + static EnumPropertyItem weightvg_proximity_modes_items[] = { + {MOD_WVG_PROXIMITY_OBJ2OBJDIST, "OBJ2OBJDIST", 0, "O2O Distance", ""}, + {MOD_WVG_PROXIMITY_OBJ2VERTDIST, "OBJ2VERTDIST", 0, "O2V Distance", ""}, + {0, NULL, 0, NULL, NULL}}; + + StructRNA *srna; + PropertyRNA *prop; + + srna= RNA_def_struct(brna, "WeightVGProximityModifier", "Modifier"); + RNA_def_struct_ui_text(srna, "Weight Vertex Group - Proximity Modifier", + "Set the weights of vertices in a group from a target object’s " + "distance."); + RNA_def_struct_sdna(srna, "WeightVGProximityModifierData"); + RNA_def_struct_ui_icon(srna, ICON_MOD_WEIGHTVG); + + prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE); + RNA_def_property_string_sdna(prop, NULL, "defgrp_name"); + RNA_def_property_ui_text(prop, "Vertex Group", "Vertex group name."); + RNA_def_property_string_funcs(prop, NULL, NULL, "rna_WeightVGModifier_vgroup_set"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "proximity_mode", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_items(prop, weightvg_proximity_modes_items); + RNA_def_property_ui_text(prop, "Proximity Mode", "Which distances to target object to use."); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "obj2vert_verts", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "proximity_flags", MOD_WVG_PROXIMITY_O2VD_VERTS); + RNA_def_property_ui_text(prop, "Use Target Vertices", + "Use shortest distance to target object’s vertices as weight."); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "obj2vert_edges", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "proximity_flags", MOD_WVG_PROXIMITY_O2VD_EDGES); + RNA_def_property_ui_text(prop, "Use Target Edges", + "Use shortest distance to target object’s edges as weight."); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "obj2vert_faces", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "proximity_flags", MOD_WVG_PROXIMITY_O2VD_FACES); + RNA_def_property_ui_text(prop, "Use Target Faces", + "Use shortest distance to target object’s faces as weight."); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "ob_target", PROP_POINTER, PROP_NONE); + RNA_def_property_pointer_sdna(prop, NULL, "proximity_ob_target"); + RNA_def_property_ui_text(prop, "Target Object", "Object to calculate vertices’ distances from."); + RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK); + RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); + + /* Common masking properties. */ + rna_def_modifier_weightvg_mask(brna, srna); +} + void RNA_def_modifier(BlenderRNA *brna) { StructRNA *srna; @@ -2504,6 +2878,9 @@ void RNA_def_modifier(BlenderRNA *brna) rna_def_modifier_smoke(brna); rna_def_modifier_solidify(brna); rna_def_modifier_screw(brna); + rna_def_modifier_weightvgedit(brna); + rna_def_modifier_weightvgmix(brna); + rna_def_modifier_weightvgproximity(brna); } #endif diff --git a/source/blender/modifiers/CMakeLists.txt b/source/blender/modifiers/CMakeLists.txt index d1f153265ac..4c3a7423aba 100644 --- a/source/blender/modifiers/CMakeLists.txt +++ b/source/blender/modifiers/CMakeLists.txt @@ -80,11 +80,16 @@ set(SRC intern/MOD_uvproject.c intern/MOD_warp.c intern/MOD_wave.c + intern/MOD_weightvg_util.c + intern/MOD_weightvgedit.c + intern/MOD_weightvgmix.c + intern/MOD_weightvgproximity.c MOD_modifiertypes.h intern/MOD_boolean_util.h intern/MOD_fluidsim_util.h intern/MOD_util.h + intern/MOD_weightvg_util.h ) if(WITH_MOD_BOOLEAN) diff --git a/source/blender/modifiers/MOD_modifiertypes.h b/source/blender/modifiers/MOD_modifiertypes.h index 4e44a226c64..0ba906a433b 100644 --- a/source/blender/modifiers/MOD_modifiertypes.h +++ b/source/blender/modifiers/MOD_modifiertypes.h @@ -72,6 +72,9 @@ extern ModifierTypeInfo modifierType_ShapeKey; extern ModifierTypeInfo modifierType_Solidify; extern ModifierTypeInfo modifierType_Screw; extern ModifierTypeInfo modifierType_Warp; +extern ModifierTypeInfo modifierType_WeightVGEdit; +extern ModifierTypeInfo modifierType_WeightVGMix; +extern ModifierTypeInfo modifierType_WeightVGProximity; /* MOD_util.c */ void modifier_type_init(ModifierTypeInfo *types[]); diff --git a/source/blender/modifiers/intern/MOD_util.c b/source/blender/modifiers/intern/MOD_util.c index e9b835eab81..26e9d48cd0a 100644 --- a/source/blender/modifiers/intern/MOD_util.c +++ b/source/blender/modifiers/intern/MOD_util.c @@ -295,5 +295,8 @@ void modifier_type_init(ModifierTypeInfo *types[]) INIT_TYPE(Solidify); INIT_TYPE(Screw); INIT_TYPE(Warp); + INIT_TYPE(WeightVGEdit); + INIT_TYPE(WeightVGMix); + INIT_TYPE(WeightVGProximity); #undef INIT_TYPE } diff --git a/source/blender/modifiers/intern/MOD_weightvg_util.c b/source/blender/modifiers/intern/MOD_weightvg_util.c new file mode 100644 index 00000000000..c18fceb1e3f --- /dev/null +++ b/source/blender/modifiers/intern/MOD_weightvg_util.c @@ -0,0 +1,246 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2011 by Bastien Montagne. +* All rights reserved. +* +* Contributor(s): None yet. +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +/* + * XXX I’d like to make modified weights visible in WeightPaint mode, + * but couldn’t figure a way to do this… + * Maybe this will need changes in mesh_calc_modifiers (DerivedMesh.c)? + * Or the WeightPaint mode code itself? + */ + +#include "BLI_utildefines.h" +#include "BLI_math.h" +#include "BLI_string.h" + +#include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" +#include "DNA_modifier_types.h" +#include "DNA_object_types.h" + +#include "BKE_cdderivedmesh.h" +#include "BKE_deform.h" +#include "BKE_mesh.h" +#include "BKE_modifier.h" +#include "BKE_texture.h" /* Texture masking. */ + +#include "depsgraph_private.h" +#include "MEM_guardedalloc.h" +#include "MOD_util.h" +#include "MOD_weightvg_util.h" +#include "RE_shader_ext.h" /* Texture masking. */ + +/* Applies new_w weights to org_w ones, using either a texture, vgroup or constant value as factor. + * Return values are in org_w. + * If indices is not NULL, it must be a table of same length as org_w and new_w, mapping to the real + * vertex index (in case the weight tables do not cover the whole vertices...). + * XXX The standard “factor” value is assumed in [0.0, 1.0] range. Else, weird results might appear. + */ +void weightvg_do_mask(int num, int *indices, float *org_w, float *new_w, Object *ob, + DerivedMesh *dm, float fact, const char *defgrp_name, Tex *texture, + int tex_use_channel, int tex_mapping, Object *tex_map_object, + const char *tex_uvlayer_name) { + int ref_didx; + MDeformVert *dvert = NULL; + int i; + + /* If influence factor is null, nothing to do! */ + if (fact == 0.0) return; + + /* If we want to mask vgroup weights from a texture. */ + if (texture) { + /* The texture coordinates. */ + float (*tex_co)[3]; + /* See mapping note below… */ + MappingInfoModifierData t_map; + float (*v_co)[3]; + + /* Use new generic get_texture_coords, but do not modify our DNA struct for it… + * XXX Why use a ModifierData stuff here ? Why not a simple, generic struct for parameters ? + * What e.g. if a modifier wants to use several textures ? + * Why use only v_co, and not MVert (or both) ? + */ + t_map.texture = texture; + t_map.map_object = tex_map_object; + BLI_strncpy(t_map.uvlayer_name, tex_uvlayer_name, sizeof(t_map.uvlayer_name)); + t_map.texmapping = tex_mapping; + v_co = MEM_mallocN(sizeof(*v_co) * num, "WeightVG Modifier, TEX mode, v_co"); + dm->getVertCos(dm, v_co); + tex_co = MEM_callocN(sizeof(*tex_co) * num, "WeightVG Modifier, TEX mode, tex_co"); + get_texture_coords(&t_map, ob, dm, v_co, tex_co, num); + MEM_freeN(v_co); + + /* For each weight (vertex), make the mix between org and new weights. */ + for(i = 0; i < num; ++i) { + int idx = indices ? indices[i] : i; + TexResult texres; + float h, s, v; /* For HSV color space. */ + + texres.nor = NULL; + get_texture_value(texture, tex_co[idx], &texres); + /* Get the good channel value… */ + switch(tex_use_channel) { + case MOD_WVG_MASK_TEX_USE_INT: + org_w[i] = (new_w[i] * texres.tin * fact) + (org_w[i] * (1.0 - (texres.tin*fact))); + break; + case MOD_WVG_MASK_TEX_USE_RED: + org_w[i] = (new_w[i] * texres.tr * fact) + (org_w[i] * (1.0 - (texres.tr*fact))); + break; + case MOD_WVG_MASK_TEX_USE_GREEN: + org_w[i] = (new_w[i] * texres.tg * fact) + (org_w[i] * (1.0 - (texres.tg*fact))); + break; + case MOD_WVG_MASK_TEX_USE_BLUE: + org_w[i] = (new_w[i] * texres.tb * fact) + (org_w[i] * (1.0 - (texres.tb*fact))); + break; + case MOD_WVG_MASK_TEX_USE_HUE: + rgb_to_hsv(texres.tr, texres.tg, texres.tb, &h, &s, &v); + org_w[i] = (new_w[i] * h * fact) + (org_w[i] * (1.0 - (h*fact))); + break; + case MOD_WVG_MASK_TEX_USE_SAT: + rgb_to_hsv(texres.tr, texres.tg, texres.tb, &h, &s, &v); + org_w[i] = (new_w[i] * s * fact) + (org_w[i] * (1.0 - (s*fact))); + break; + case MOD_WVG_MASK_TEX_USE_VAL: + rgb_to_hsv(texres.tr, texres.tg, texres.tb, &h, &s, &v); + org_w[i] = (new_w[i] * v * fact) + (org_w[i] * (1.0 - (v*fact))); + break; + case MOD_WVG_MASK_TEX_USE_ALPHA: + org_w[i] = (new_w[i] * texres.ta * fact) + (org_w[i] * (1.0 - (texres.ta*fact))); + break; + default: + org_w[i] = (new_w[i] * texres.tin * fact) + (org_w[i] * (1.0 - (texres.tin*fact))); + break; + } + } + + MEM_freeN(tex_co); + return; + } + + /* Check whether we want to set vgroup weights from a constant weight factor or a vertex + * group. + */ + /* Get vgroup idx from its name. */ + ref_didx = defgroup_name_index(ob, defgrp_name); + /* Proceed only if vgroup is valid, else use constant factor. */ + if (ref_didx >= 0) { + /* Get actual dverts (ie vertex group data). */ + dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT); + /* Proceed only if vgroup is valid, else assume factor = O. */ + if (dvert == NULL) return; + + /* For each weight (vertex), make the mix between org and new weights. */ + for (i = 0; i < num; i++) { + int idx = indices ? indices[i] : i; + int j; + for (j = 0; j < dvert[idx].totweight; j++) { + if(dvert[idx].dw[j].def_nr == ref_didx) { + float f = dvert[idx].dw[j].weight * fact; + org_w[i] = (new_w[i] * f) + (org_w[i] * (1.0-f)); + break; + } + } + /* If that vertex is not in ref vgroup, assume null factor, and hence do nothing! */ + } + return; + } + + /* Default "influence" behavior. */ + /* For each weight (vertex), make the mix between org and new weights. */ + for (i = 0; i < num; i++) { + org_w[i] = (new_w[i] * fact) + (org_w[i] * (1.0-fact)); + } +} + +/* Applies weights to given vgroup (defgroup), and optionnaly add/remove vertices from the group. + * If indices is not NULL, it must be a table of same length as weights, mapping to the real + * vertex index (in case the weight table does not cover the whole vertices...). + */ +void weightvg_update_vg(MDeformVert *dvert, int defgrp_idx, int num, int *indices, + float *weights, int do_add, float add_thresh, int do_rem, + float rem_thresh){ + int i; + + for (i = 0; i < num; i++) { + int j; + float w = weights[i]; + MDeformVert *dv = &dvert[indices ? indices[i] : i]; + MDeformWeight *newdw; + + /* Let’s first check to see if this vert is already in the weight group – if so + * let’s update it, or remove it if needed. + */ + for (j = 0; j < dv->totweight; j++) { + /* If this weight corresponds to the deform group, update the value or, + * if lower than rem_threshold, remove the vertex from the vgroup. + */ + if (dv->dw[j].def_nr == defgrp_idx) { + /* Remove the vertex from this vgroup if needed. */ + if (do_rem && w < rem_thresh) { + dv->totweight--; + /* If there are still other deform weights attached to this vert then remove + * this deform weight, and reshuffle the others. + */ + if(dv->totweight) { + newdw = MEM_mallocN(sizeof(MDeformWeight)*(dv->totweight), "deformWeight"); + if(dv->dw){ + memcpy(newdw, dv->dw, sizeof(MDeformWeight)*j); + memcpy(newdw+j, dv->dw+j+1, sizeof(MDeformWeight)*(dv->totweight-j)); + MEM_freeN(dv->dw); + } + dv->dw = newdw; + } + /* If there are no other deform weights left then just remove this one. */ + else { + MEM_freeN(dv->dw); + dv->dw = NULL; + } + } + /* Else, just set the new computed weight. */ + else + dv->dw[j].weight = w; + break; + } + continue; + } + + /* If the vert wasn’t in the deform group, add it if needed! + */ + if (do_add && w > add_thresh) { + newdw = MEM_callocN(sizeof(MDeformWeight)*(dv->totweight+1), "WeightVGEdit Modifier, deformWeight"); + if(dv->dw) { + memcpy(newdw, dv->dw, sizeof(MDeformWeight)*dv->totweight); + MEM_freeN(dv->dw); + } + dv->dw = newdw; + dv->dw[dv->totweight].weight = w; + dv->dw[dv->totweight].def_nr = defgrp_idx; + dv->totweight++; + } + } +} + diff --git a/source/blender/modifiers/intern/MOD_weightvg_util.h b/source/blender/modifiers/intern/MOD_weightvg_util.h new file mode 100644 index 00000000000..1bd40e3879f --- /dev/null +++ b/source/blender/modifiers/intern/MOD_weightvg_util.h @@ -0,0 +1,82 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2011 by Bastien Montagne. +* All rights reserved. +* +* Contributor(s): None yet. +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +/** \file blender/modifiers/intern/MOD_util.h + * \ingroup modifiers + */ + + +#ifndef MOD_WEIGHTVG_UTIL_H +#define MOD_WEIGHTVG_UTIL_H + +/* so modifier types match their defines */ +#include "MOD_modifiertypes.h" + +struct Tex; +struct DerivedMesh; +struct Object; +/*struct ModifierData; +struct MappingInfoModifierData;*/ + +/* + * XXX I’d like to make modified weights visible in WeightPaint mode, + * but couldn’t figure a way to do this… + * Maybe this will need changes in mesh_calc_modifiers (DerivedMesh.c)? + * Or the WeightPaint mode code itself? + */ + +/************************************** + * Util functions. * + **************************************/ + +/* We cannot divide by zero (what a surprise…). + * So if -MOD_WEIGHTVGROUP_DIVMODE_ZEROFLOOR < weightf < MOD_WEIGHTVGROUP_DIVMODE_ZEROFLOOR, + * we clamp weightf to this value (or its negative version). + * Also used to avoid null power factor. + */ +#define MOD_WVG_ZEROFLOOR 1.0e-32f + +/* Applies new_w weights to org_w ones, using either a texture, vgroup or constant value as factor. + * Return values are in org_w. + * If indices is not NULL, it must be a table of same length as org_w and new_w, mapping to the real + * vertex index (in case the weight tables do not cover the whole vertices...). + * XXX The standard “factor” value is assumed in [0.0, 1.0] range. Else, weird results might appear. + */ +void weightvg_do_mask(int num, int *indices, float *org_w, float *new_w, Object *ob, + struct DerivedMesh *dm, float fact, const char *defgrp_name, Tex *texture, + int tex_use_channel, int tex_mapping, Object *tex_map_object, + const char *tex_uvlayer_name); + +/* Applies weights to given vgroup (defgroup), and optionnaly add/remove vertices from the group. + * If indices is not NULL, it must be a table of same length as weights, mapping to the real + * vertex index (in case the weight table does not cover the whole vertices...). + */ +void weightvg_update_vg(MDeformVert *dvert, int defgrp_idx, int num, int *indices, float *weights, + int do_add, float add_thresh, int do_rem, float rem_thresh); + +#endif /* MOD_WEIGHTVG_UTIL_H */ diff --git a/source/blender/modifiers/intern/MOD_weightvgedit.c b/source/blender/modifiers/intern/MOD_weightvgedit.c new file mode 100644 index 00000000000..c8d7ab52ce8 --- /dev/null +++ b/source/blender/modifiers/intern/MOD_weightvgedit.c @@ -0,0 +1,343 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2011 by Bastien Montagne. +* All rights reserved. +* +* Contributor(s): None yet. +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +/* + * XXX I’d like to make modified weights visible in WeightPaint mode, + * but couldn’t figure a way to do this… + * Maybe this will need changes in mesh_calc_modifiers (DerivedMesh.c)? + * Or the WeightPaint mode code itself? + */ + +#include "BLI_utildefines.h" +#include "BLI_math.h" +#include "BLI_string.h" + +#include "DNA_color_types.h" /* CurveMapping. */ +#include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" +#include "DNA_modifier_types.h" +#include "DNA_object_types.h" + +#include "BKE_cdderivedmesh.h" +#include "BKE_colortools.h" /* CurveMapping. */ +#include "BKE_deform.h" +#include "BKE_mesh.h" +#include "BKE_modifier.h" +#include "BKE_texture.h" /* Texture masking. */ + +#include "depsgraph_private.h" +#include "MEM_guardedalloc.h" +#include "MOD_util.h" +#include "MOD_weightvg_util.h" + +/************************************** + * Modifiers functions. * + **************************************/ +static void initData(ModifierData *md) +{ + WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md; + wmd->edit_flags = MOD_WVG_EDIT_CLAMP; + wmd->default_weight = 0.0f; + + wmd->map_org_min = 0.0f; + wmd->map_org_max = 1.0f; + wmd->map_new_min = 0.0f; + wmd->map_new_max = 1.0f; + wmd->cmap_curve = curvemapping_add(1, 0.0, 0.0, 1.0, 1.0); + curvemapping_initialize(wmd->cmap_curve); + + wmd->clamp_min_weight = 0.0f; + wmd->clamp_max_weight = 1.0f; + + wmd->add_threshold = 0.01f; + wmd->rem_threshold = 0.01f; + + wmd->mask_constant = 1.0f; + wmd->mask_tex_use_channel = MOD_WVG_MASK_TEX_USE_INT; /* Use intensity by default. */ + wmd->mask_tex_mapping = MOD_DISP_MAP_LOCAL; +} + +static void freeData(ModifierData *md) +{ + WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md; + curvemapping_free(wmd->cmap_curve); +} + +static void copyData(ModifierData *md, ModifierData *target) +{ + WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md; + WeightVGEditModifierData *twmd = (WeightVGEditModifierData*) target; + + BLI_strncpy(twmd->defgrp_name, wmd->defgrp_name, sizeof(twmd->defgrp_name)); + + twmd->edit_flags = wmd->edit_flags; + twmd->default_weight = wmd->default_weight; + + twmd->map_org_min = wmd->map_org_min; + twmd->map_org_max = wmd->map_org_max; + twmd->map_new_min = wmd->map_new_min; + twmd->map_new_max = wmd->map_new_max; + twmd->cmap_curve = curvemapping_copy(wmd->cmap_curve); + + twmd->clamp_min_weight = wmd->clamp_min_weight; + twmd->clamp_max_weight = wmd->clamp_max_weight; + + twmd->add_threshold = wmd->add_threshold; + twmd->rem_threshold = wmd->rem_threshold; + + twmd->mask_constant = wmd->mask_constant; + BLI_strncpy(twmd->mask_defgrp_name, wmd->mask_defgrp_name, sizeof(twmd->mask_defgrp_name)); + twmd->mask_texture = wmd->mask_texture; + twmd->mask_tex_use_channel = wmd->mask_tex_use_channel; + twmd->mask_tex_mapping = wmd->mask_tex_mapping; + twmd->mask_tex_map_obj = wmd->mask_tex_map_obj; + BLI_strncpy(twmd->mask_tex_uvlayer_name, wmd->mask_tex_uvlayer_name, + sizeof(twmd->mask_tex_uvlayer_name)); +} + +static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md) +{ + WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md; + CustomDataMask dataMask = 0; + + /* We need vertex groups! */ + dataMask |= CD_MASK_MDEFORMVERT; + + /* Ask for UV coordinates if we need them. */ + if(wmd->mask_tex_mapping == MOD_DISP_MAP_UV) + dataMask |= CD_MASK_MTFACE; + + return dataMask; +} + +static int dependsOnTime(ModifierData *md) +{ + WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md; + + if(wmd->mask_texture) + return BKE_texture_dependsOnTime(wmd->mask_texture); + return 0; +} + +static void foreachObjectLink(ModifierData *md, Object *ob, + void (*walk)(void *userData, Object *ob, Object **obpoin), + void *userData) +{ + WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md; + walk(userData, ob, &wmd->mask_tex_map_obj); +} + +static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData) +{ + WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md; + + walk(userData, ob, (ID **)&wmd->mask_texture); + + foreachObjectLink(md, ob, (ObjectWalkFunc)walk, userData); +} + +static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *UNUSED(scene), + Object *UNUSED(ob), DagNode *obNode) +{ + WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md; + DagNode *curNode; + + if(wmd->mask_tex_map_obj && wmd->mask_tex_mapping == MOD_DISP_MAP_OBJECT) { + curNode = dag_get_node(forest, wmd->mask_tex_map_obj); + + dag_add_relation(forest, curNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA, + "WeightVGEdit Modifier"); + } + + if(wmd->mask_tex_mapping == MOD_DISP_MAP_GLOBAL) + dag_add_relation(forest, obNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA, + "WeightVGEdit Modifier"); +} + +static int isDisabled(ModifierData *md, int UNUSED(useRenderParams)) +{ + WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md; + /* If no vertex group, bypass. */ + return (wmd->defgrp_name == NULL); +} + +static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *derivedData, + int UNUSED(useRenderParams), int UNUSED(isFinalCalc)) +{ + WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md; + DerivedMesh *dm = derivedData; + DerivedMesh *ret; + MDeformVert *dvert = NULL; + float *org_w = NULL; /* Array original weights. */ + float *new_w = NULL; /* Array new weights. */ + int numVerts; + int defgrp_idx; + int i; + char rel_ret = 0; /* Boolean, whether we have to release ret dm or not, when not using it! */ + float *mapf = NULL; /* Cache for mapping factors. */ + /* Flags. */ + char do_map = wmd->edit_flags & MOD_WVG_EDIT_MAP; + char do_cmap = wmd->edit_flags & MOD_WVG_EDIT_CMAP; + char do_rev = wmd->edit_flags & MOD_WVG_EDIT_REVERSE_WEIGHTS; + char do_add = wmd->edit_flags & MOD_WVG_EDIT_ADD2VG; + char do_rem = wmd->edit_flags & MOD_WVG_EDIT_REMFVG; + char do_clamp = wmd->edit_flags & MOD_WVG_EDIT_CLAMP; + + /* Get number of verts. */ + numVerts = dm->getNumVerts(dm); + + /* Check if we can just return the original mesh. + * Must have verts and therefore verts assigned to vgroups to do anything useful! + */ + if ((numVerts == 0) || (ob->defbase.first == NULL)) + return dm; + + /* Create a copy of our dmesh. + * TODO: This should be done only if needed, i.e. if dm has the org data ! + */ + if (1) { + /* XXX Seems to create problems with weightpaint mode... */ +// DM_set_only_copy(dm, CD_MASK_MDEFORMVERT); /* Only copy defgroup layer. */ + ret = CDDM_copy(dm); + rel_ret = 1; + } + else + ret = dm; + + /* Get vgroup idx from its name. */ + defgrp_idx = defgroup_name_index(ob, wmd->defgrp_name); + + /* Get actual dverts (ie vertex group data). */ + if (defgrp_idx >= 0) + dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT); + /* If no dverts, return unmodified data… */ + if ((defgrp_idx < 0) || (dvert == NULL)) { + if (rel_ret) + ret->release(ret); + return dm; + } + + /* Get org weights, assuming 0.0 for vertices not in given vgroup. */ + org_w = MEM_mallocN(sizeof(float) * numVerts, "WeightVGEdit Modifier, org_w"); + new_w = MEM_mallocN(sizeof(float) * numVerts, "WeightVGEdit Modifier, org_w"); + for (i = 0; i < numVerts; i++) { + int j; + org_w[i] = new_w[i] = wmd->default_weight; + for (j = 0; j < dvert[i].totweight; j++) { + if(dvert[i].dw[j].def_nr == defgrp_idx) { + org_w[i] = new_w[i] = dvert[i].dw[j].weight; + break; + } + } + /* Do mapping. */ + if (do_map) { + /* This mapping is a simple func: a*in + b. + * with a = (out_min - out_max)/(in_min - in_max) + * and b = out_max - a*in_max + * Note a and b are cached! + */ + if (mapf == NULL) { + float denom = wmd->map_org_min - wmd->map_org_max; + mapf = MEM_mallocN(sizeof(float) * 2, "WeightVGEdit, mapf"); + if (denom > 0.0 && denom < MOD_WVG_ZEROFLOOR) + denom = MOD_WVG_ZEROFLOOR; + else if (denom < 0.0 && denom > -MOD_WVG_ZEROFLOOR) + denom = -MOD_WVG_ZEROFLOOR; + mapf[0] = (wmd->map_new_min - wmd->map_new_max) / denom; + mapf[1] = wmd->map_new_max - (mapf[0] * wmd->map_org_max); + } + new_w[i] = (mapf[0] * new_w[i]) + mapf[1]; + } + if (do_cmap) + new_w[i] = curvemapping_evaluateF(wmd->cmap_curve, 0, new_w[i]); + if (do_rev) + new_w[i] = (-1.0 * new_w[i]) + 1.0; + } + + /* Do masking. */ + weightvg_do_mask(numVerts, NULL, org_w, new_w, ob, ret, wmd->mask_constant, + wmd->mask_defgrp_name, wmd->mask_texture, wmd->mask_tex_use_channel, + wmd->mask_tex_mapping, wmd->mask_tex_map_obj, wmd->mask_tex_uvlayer_name); + + /* Do clamping. */ + if (do_clamp) { + for (i = 0; i < numVerts; i++) + CLAMP(org_w[i], wmd->clamp_min_weight, wmd->clamp_max_weight); + } + + /* Update/add/remove from vgroup. */ + weightvg_update_vg(dvert, defgrp_idx, numVerts, NULL, org_w, do_add, wmd->add_threshold, + do_rem, wmd->rem_threshold); + + /* Freeing stuff. */ + if (org_w) + MEM_freeN(org_w); + if (new_w) + MEM_freeN(new_w); + if (mapf) + MEM_freeN(mapf); + + /* Return the vgroup-modified mesh. */ + return ret; +} + +static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob, + struct EditMesh *UNUSED(editData), + DerivedMesh *derivedData) +{ + return applyModifier(md, ob, derivedData, 0, 1); +} + + +ModifierTypeInfo modifierType_WeightVGEdit = { + /* name */ "WeightVGEdit", + /* structName */ "WeightVGEditModifierData", + /* structSize */ sizeof(WeightVGEditModifierData), + /* type */ eModifierTypeType_Nonconstructive, + /* flags */ eModifierTypeFlag_AcceptsMesh + |eModifierTypeFlag_SupportsMapping + |eModifierTypeFlag_SupportsEditmode, + + /* copyData */ copyData, + /* deformVerts */ NULL, + /* deformMatrices */ NULL, + /* deformVertsEM */ NULL, + /* deformMatricesEM */ NULL, + /* applyModifier */ applyModifier, + /* applyModifierEM */ applyModifierEM, + /* initData */ initData, + /* requiredDataMask */ requiredDataMask, + /* freeData */ freeData, + /* isDisabled */ isDisabled, + /* updateDepgraph */ updateDepgraph, + /* dependsOnTime */ dependsOnTime, + /* dependsOnNormals */ NULL, + /* foreachObjectLink */ foreachObjectLink, + /* foreachIDLink */ foreachIDLink, +}; + diff --git a/source/blender/modifiers/intern/MOD_weightvgmix.c b/source/blender/modifiers/intern/MOD_weightvgmix.c new file mode 100644 index 00000000000..c4f107de72e --- /dev/null +++ b/source/blender/modifiers/intern/MOD_weightvgmix.c @@ -0,0 +1,433 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2011 by Bastien Montagne. +* All rights reserved. +* +* Contributor(s): None yet. +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +/* + * XXX I’d like to make modified weights visible in WeightPaint mode, + * but couldn’t figure a way to do this… + * Maybe this will need changes in mesh_calc_modifiers (DerivedMesh.c)? + * Or the WeightPaint mode code itself? + */ + +#include "BLI_utildefines.h" +#include "BLI_math.h" +#include "BLI_string.h" + +#include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" +#include "DNA_modifier_types.h" +#include "DNA_object_types.h" + +#include "BKE_cdderivedmesh.h" +#include "BKE_deform.h" +#include "BKE_mesh.h" +#include "BKE_modifier.h" +#include "BKE_texture.h" /* Texture masking. */ + +#include "depsgraph_private.h" +#include "MEM_guardedalloc.h" +#include "MOD_util.h" +#include "MOD_weightvg_util.h" + + +/** + * This mixes the old weight with the new weight factor. + */ +static float mix_weight(float weight, float weight2, char mix_mode) +{ +#if 0 + /* + * XXX Don’t know why, but the switch version takes many CPU time, + * and produces lag in realtime playback… + */ + switch (mix_mode) + { + case MOD_WVG_MIX_ADD: + return (weight + weight2); + case MOD_WVG_MIX_SUB: + return (weight - weight2); + case MOD_WVG_MIX_MUL: + return (weight * weight2); + case MOD_WVG_MIX_DIV: + /* Avoid dividing by zero (or really small values). */ + if (0.0 <= weight2 < MOD_WVG_ZEROFLOOR) + weight2 = MOD_WVG_ZEROFLOOR; + else if (-MOD_WVG_ZEROFLOOR < weight2) + weight2 = -MOD_WVG_ZEROFLOOR; + return (weight / weight2); + case MOD_WVG_MIX_DIF: + return (weight < weight2 ? weight2 - weight : weight - weight2); + case MOD_WVG_MIX_AVG: + return (weight + weight2) / 2.0; + case MOD_WVG_MIX_SET: + default: + return weight2; + } +#endif + if (mix_mode == MOD_WVG_MIX_SET) + return weight2; + else if (mix_mode == MOD_WVG_MIX_ADD) + return (weight + weight2); + else if (mix_mode == MOD_WVG_MIX_SUB) + return (weight - weight2); + else if (mix_mode == MOD_WVG_MIX_MUL) + return (weight * weight2); + else if (mix_mode == MOD_WVG_MIX_DIV) { + /* Avoid dividing by zero (or really small values). */ + if (weight2 < 0.0 && weight2 > -MOD_WVG_ZEROFLOOR) + weight2 = -MOD_WVG_ZEROFLOOR; + else if (weight2 >= 0.0 && weight2 < MOD_WVG_ZEROFLOOR) + weight2 = MOD_WVG_ZEROFLOOR; + return (weight / weight2); + } + else if (mix_mode == MOD_WVG_MIX_DIF) + return (weight < weight2 ? weight2 - weight : weight - weight2); + else if (mix_mode == MOD_WVG_MIX_AVG) + return (weight + weight2) / 2.0; + else return weight2; +} + +/************************************** + * Modifiers functions. * + **************************************/ +static void initData(ModifierData *md) +{ + WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md; + + wmd->default_weight = 0.0; + wmd->default_weight2 = 0.0; + wmd->mix_mode = MOD_WVG_MIX_SET; + wmd->mix_set = MOD_WVG_SET_INTER; + + wmd->mask_constant = 1.0f; + wmd->mask_tex_use_channel = MOD_WVG_MASK_TEX_USE_INT; /* Use intensity by default. */ + wmd->mask_tex_mapping = MOD_DISP_MAP_LOCAL; +} + +static void copyData(ModifierData *md, ModifierData *target) +{ + WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md; + WeightVGMixModifierData *twmd = (WeightVGMixModifierData*) target; + + BLI_strncpy(twmd->defgrp_name, wmd->defgrp_name, sizeof(twmd->defgrp_name)); + BLI_strncpy(twmd->defgrp_name2, wmd->defgrp_name2, sizeof(twmd->defgrp_name2)); + twmd->default_weight = wmd->default_weight; + twmd->default_weight2 = wmd->default_weight2; + twmd->mix_mode = wmd->mix_mode; + twmd->mix_set = wmd->mix_set; + + twmd->mask_constant = wmd->mask_constant; + BLI_strncpy(twmd->mask_defgrp_name, wmd->mask_defgrp_name, sizeof(twmd->mask_defgrp_name)); + twmd->mask_texture = wmd->mask_texture; + twmd->mask_tex_use_channel = wmd->mask_tex_use_channel; + twmd->mask_tex_mapping = wmd->mask_tex_mapping; + twmd->mask_tex_map_obj = wmd->mask_tex_map_obj; + BLI_strncpy(twmd->mask_tex_uvlayer_name, wmd->mask_tex_uvlayer_name, + sizeof(twmd->mask_tex_uvlayer_name)); +} + +static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md) +{ + WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md; + CustomDataMask dataMask = 0; + + /* We need vertex groups! */ + dataMask |= CD_MASK_MDEFORMVERT; + + /* Ask for UV coordinates if we need them. */ + if(wmd->mask_tex_mapping == MOD_DISP_MAP_UV) + dataMask |= CD_MASK_MTFACE; + + return dataMask; +} + +static int dependsOnTime(ModifierData *md) +{ + WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md; + + if(wmd->mask_texture) + return BKE_texture_dependsOnTime(wmd->mask_texture); + return 0; +} + +static void foreachObjectLink(ModifierData *md, Object *ob, + void (*walk)(void *userData, Object *ob, Object **obpoin), + void *userData) +{ + WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md; + walk(userData, ob, &wmd->mask_tex_map_obj); +} + +static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData) +{ + WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md; + + walk(userData, ob, (ID **)&wmd->mask_texture); + + foreachObjectLink(md, ob, (ObjectWalkFunc)walk, userData); +} + +static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *UNUSED(scene), + Object *UNUSED(ob), DagNode *obNode) +{ + WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md; + DagNode *curNode; + + if(wmd->mask_tex_map_obj && wmd->mask_tex_mapping == MOD_DISP_MAP_OBJECT) { + curNode = dag_get_node(forest, wmd->mask_tex_map_obj); + + dag_add_relation(forest, curNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA, + "WeightVGMix Modifier"); + } + + if(wmd->mask_tex_mapping == MOD_DISP_MAP_GLOBAL) + dag_add_relation(forest, obNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA, + "WeightVGMix Modifier"); +} + +static int isDisabled(ModifierData *md, int UNUSED(useRenderParams)) +{ + WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md; + /* If no vertex group, bypass. */ + return (wmd->defgrp_name == NULL); +} + +static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *derivedData, + int UNUSED(useRenderParams), int UNUSED(isFinalCalc)) +{ + WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md; + DerivedMesh *dm = derivedData; + DerivedMesh *ret; + MDeformVert *dvert = NULL; + int numVerts; + int defgrp_idx, defgrp_idx2 = -1; + float *org_w = NULL; + float *new_w = NULL; + int *tidx, *indices = NULL; + int numIdx = 0; + int i, j; + char rel_ret = 0; /* Boolean, whether we have to release ret dm or not, when not using it! */ + + /* Get number of verts. */ + numVerts = dm->getNumVerts(dm); + + /* Check if we can just return the original mesh. + * Must have verts and therefore verts assigned to vgroups to do anything useful! + */ + if ((numVerts == 0) || (ob->defbase.first == NULL)) + return dm; + + /* Create a copy of our dmesh. + * TODO: This should be done only if needed ! + */ + if (1) { + /* XXX Seems to create problems with weightpaint mode... */ +// DM_set_only_copy(dm, CD_MASK_MDEFORMVERT); /* Only copy defgroup layer. */ + ret = CDDM_copy(dm); + rel_ret = 1; + } + else + ret = dm; + + /* Get first vgroup idx from its name. */ + defgrp_idx = defgroup_name_index(ob, wmd->defgrp_name); + + /* Get seconf vgroup idx from its name, if given. */ + if (wmd->defgrp_name2) + defgrp_idx2 = defgroup_name_index(ob, wmd->defgrp_name2); + + /* Get actual dverts (ie vertex group data). */ + if (defgrp_idx >= 0) + dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT); + /* If no dverts, return unmodified data… */ + if ((defgrp_idx < 0) || (dvert == NULL)) { + if (rel_ret) + ret->release(ret); + return dm; + } + + /* Find out which vertices to work on. */ + tidx = MEM_mallocN(sizeof(int) * numVerts, "WeightVGMix Modifier, tidx"); + switch (wmd->mix_set) { + case MOD_WVG_SET_ORG: + /* All vertices in first vgroup. */ + for (i = 0; i < numVerts; i++) { + for (j = 0; j < dvert[i].totweight; j++) { + if(dvert[i].dw[j].def_nr == defgrp_idx) { + tidx[numIdx++] = i; + break; + } + } + } + break; + case MOD_WVG_SET_NEW: + /* All vertices in second vgroup. */ + for (i = 0; i < numVerts; i++) { + for (j = 0; j < dvert[i].totweight; j++) { + if(dvert[i].dw[j].def_nr == defgrp_idx2) { + tidx[numIdx++] = i; + break; + } + } + } + break; + case MOD_WVG_SET_UNION: + /* All vertices in one vgroup or the other. */ + for (i = 0; i < numVerts; i++) { + for (j = 0; j < dvert[i].totweight; j++) { + if(dvert[i].dw[j].def_nr == defgrp_idx || dvert[i].dw[j].def_nr == defgrp_idx2) { + tidx[numIdx++] = i; + break; + } + } + } + break; + case MOD_WVG_SET_INTER: + /* All vertices in both vgroups. */ + for (i = 0; i < numVerts; i++) { + char idx1 = 0; + char idx2 = 0; + for (j = 0; j < dvert[i].totweight; j++) { + if(dvert[i].dw[j].def_nr == defgrp_idx) { + if (idx2) { + tidx[numIdx++] = i; + break; + } + else + idx1 = 1; + } + else if(dvert[i].dw[j].def_nr == defgrp_idx2) { + if (idx1) { + tidx[numIdx++] = i; + break; + } + else + idx2 = 1; + } + } + } + break; + case MOD_WVG_SET_ALL: + default: + /* Use all vertices, no need to do anything here. */ + break; + } + if (numIdx) { + indices = MEM_mallocN(sizeof(int) * numIdx, "WeightVGMix Modifier, indices"); + memcpy(indices, tidx, sizeof(int) * numIdx); + } + else + numIdx = numVerts; + MEM_freeN(tidx); + + org_w = MEM_mallocN(sizeof(float) * numIdx, "WeightVGMix Modifier, org_w"); + new_w = MEM_mallocN(sizeof(float) * numIdx, "WeightVGMix Modifier, new_w"); + + /* Mix weights. */ + for (i = 0; i < numIdx; i++) { + float weight2 = 0.0; + char w1 = 0; + char w2 = 0; + int idx = indices ? indices[i] : i; + for (j = 0; j < dvert[idx].totweight; j++) { + if(dvert[idx].dw[j].def_nr == defgrp_idx) { + org_w[i] = dvert[idx].dw[j].weight; + w1 = 1; + if (w2) + break; + } + else if(dvert[idx].dw[j].def_nr == defgrp_idx2) { + weight2 = dvert[idx].dw[j].weight; + w2 = 1; + if (w1) + break; + } + } + if (w1 == 0) + org_w[i] = wmd->default_weight; + if (w2 == 0) + weight2 = wmd->default_weight2; + new_w[i] = mix_weight(org_w[i], weight2, wmd->mix_mode); + } + + /* Do masking. */ + weightvg_do_mask(numIdx, indices, org_w, new_w, ob, ret, wmd->mask_constant, + wmd->mask_defgrp_name, wmd->mask_texture, wmd->mask_tex_use_channel, + wmd->mask_tex_mapping, wmd->mask_tex_map_obj, wmd->mask_tex_uvlayer_name); + + /* Update (add to) vgroup. + * XXX Depending on the MOD_WVG_SET_xxx option chosen, we might have to add vertices to vgroup. + */ + weightvg_update_vg(dvert, defgrp_idx, numIdx, indices, org_w, 1, -FLT_MAX, 0, 0.0f); + + /* Freeing stuff. */ + if (org_w) + MEM_freeN(org_w); + if (new_w) + MEM_freeN(new_w); + if (indices) + MEM_freeN(indices); + + /* Return the vgroup-modified mesh. */ + return ret; +} + +static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob, + struct EditMesh *UNUSED(editData), + DerivedMesh *derivedData) +{ + return applyModifier(md, ob, derivedData, 0, 1); +} + + +ModifierTypeInfo modifierType_WeightVGMix = { + /* name */ "WeightVGMix", + /* structName */ "WeightVGMixModifierData", + /* structSize */ sizeof(WeightVGMixModifierData), + /* type */ eModifierTypeType_Nonconstructive, + /* flags */ eModifierTypeFlag_AcceptsMesh + |eModifierTypeFlag_SupportsMapping + |eModifierTypeFlag_SupportsEditmode, + + /* copyData */ copyData, + /* deformVerts */ NULL, + /* deformMatrices */ NULL, + /* deformVertsEM */ NULL, + /* deformMatricesEM */ NULL, + /* applyModifier */ applyModifier, + /* applyModifierEM */ applyModifierEM, + /* initData */ initData, + /* requiredDataMask */ requiredDataMask, + /* freeData */ NULL, + /* isDisabled */ isDisabled, + /* updateDepgraph */ updateDepgraph, + /* dependsOnTime */ dependsOnTime, + /* dependsOnNormals */ NULL, + /* foreachObjectLink */ foreachObjectLink, + /* foreachIDLink */ foreachIDLink, +}; + diff --git a/source/blender/modifiers/intern/MOD_weightvgproximity.c b/source/blender/modifiers/intern/MOD_weightvgproximity.c new file mode 100644 index 00000000000..7349d90c1ec --- /dev/null +++ b/source/blender/modifiers/intern/MOD_weightvgproximity.c @@ -0,0 +1,512 @@ +/* +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* The Original Code is Copyright (C) 2011 by Bastien Montagne. +* All rights reserved. +* +* Contributor(s): None yet. +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ + +/* + * XXX I’d like to make modified weights visible in WeightPaint mode, + * but couldn’t figure a way to do this… + * Maybe this will need changes in mesh_calc_modifiers (DerivedMesh.c)? + * Or the WeightPaint mode code itself? + */ + +#include "BLI_utildefines.h" +#include "BLI_math.h" +#include "BLI_string.h" +#include "BLI_editVert.h" + +#include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" +#include "DNA_modifier_types.h" +#include "DNA_object_types.h" + +#include "BKE_cdderivedmesh.h" +#include "BKE_deform.h" +#include "BKE_mesh.h" +#include "BKE_modifier.h" +#include "BKE_shrinkwrap.h" /* For SpaceTransform stuff. */ +#include "BKE_texture.h" /* Texture masking. */ + +#include "depsgraph_private.h" +#include "MEM_guardedalloc.h" +#include "MOD_util.h" +#include "MOD_weightvg_util.h" + +/************************************** + * Util functions. * + **************************************/ + +/* Util macro. */ +#define OUT_OF_MEMORY() ((void)printf("WeightVGProximity: Out of memory.\n")) + +/** + * Returns the squared distance between two given points. + */ +static float squared_dist(const float *a, const float *b) +{ + float tmp[3]; + VECSUB(tmp, a, b); + return INPR(tmp, tmp); +} + +/** + * Find nearest vertex and/or edge and/or face, for each vertex (adapted from shrinkwrap.c). + */ +static void get_vert2geom_distance(int numVerts, float (*v_cos)[3], + float *dist_v, float *dist_e, float *dist_f, + DerivedMesh *target, const SpaceTransform *loc2trgt) +{ + int i; + BVHTreeFromMesh treeData_v = NULL_BVHTreeFromMesh; + BVHTreeFromMesh treeData_e = NULL_BVHTreeFromMesh; + BVHTreeFromMesh treeData_f = NULL_BVHTreeFromMesh; + BVHTreeNearest nearest_v = NULL_BVHTreeNearest; + BVHTreeNearest nearest_e = NULL_BVHTreeNearest; + BVHTreeNearest nearest_f = NULL_BVHTreeNearest; + + if (dist_v) { + /* Create a bvh-tree of the given target's verts. */ + bvhtree_from_mesh_verts(&treeData_v, target, 0.0, 2, 6); + if(treeData_v.tree == NULL) { + OUT_OF_MEMORY(); + return; + } + } + if (dist_e) { + /* Create a bvh-tree of the given target's edges. */ + bvhtree_from_mesh_edges(&treeData_e, target, 0.0, 2, 6); + if(treeData_e.tree == NULL) { + OUT_OF_MEMORY(); + return; + } + } + if (dist_f) { + /* Create a bvh-tree of the given target's faces. */ + bvhtree_from_mesh_faces(&treeData_f, target, 0.0, 2, 6); + if(treeData_f.tree == NULL) { + OUT_OF_MEMORY(); + return; + } + } + + /* Setup nearest. */ + nearest_v.index = nearest_e.index = nearest_f.index = -1; + /*nearest_v.dist = nearest_e.dist = nearest_f.dist = FLT_MAX;*/ + /* Find the nearest vert/edge/face. */ +#ifndef __APPLE__ +#pragma omp parallel for default(none) private(i) firstprivate(nearest_v,nearest_e,nearest_f) \ + shared(treeData_v,treeData_e,treeData_f,numVerts,v_cos,dist_v,dist_e, \ + dist_f,loc2trgt) \ + schedule(static) +#endif + for (i = 0; i < numVerts; ++i) { + float tmp_co[3]; + + /* Convert the vertex to tree coordinates. */ + VECCOPY(tmp_co, v_cos[i]); + space_transform_apply(loc2trgt, tmp_co); + + /* Use local proximity heuristics (to reduce the nearest search). + * + * If we already had an hit before, we assume this vertex is going to have a close hit to + * that other vertex, so we can initiate the "nearest.dist" with the expected value to that + * last hit. + * This will lead in prunning of the search tree. + */ + if (dist_v) { + nearest_v.dist = nearest_v.index != -1 ? squared_dist(tmp_co, nearest_v.co) : FLT_MAX; + /* Compute and store result. If invalid (-1 idx), keep FLT_MAX dist. */ + BLI_bvhtree_find_nearest(treeData_v.tree, tmp_co, &nearest_v, treeData_v.nearest_callback, &treeData_v); + dist_v[i] = sqrtf(nearest_v.dist); + } + if (dist_e) { + nearest_e.dist = nearest_e.index != -1 ? squared_dist(tmp_co, nearest_e.co) : FLT_MAX; + /* Compute and store result. If invalid (-1 idx), keep FLT_MAX dist. */ + BLI_bvhtree_find_nearest(treeData_e.tree, tmp_co, &nearest_e, treeData_e.nearest_callback, &treeData_e); + dist_e[i] = sqrtf(nearest_e.dist); + } + if (dist_f) { + nearest_f.dist = nearest_f.index != -1 ? squared_dist(tmp_co, nearest_f.co) : FLT_MAX; + /* Compute and store result. If invalid (-1 idx), keep FLT_MAX dist. */ + BLI_bvhtree_find_nearest(treeData_f.tree, tmp_co, &nearest_f, treeData_f.nearest_callback, &treeData_f); + dist_f[i] = sqrtf(nearest_f.dist); + } + } + + if (dist_v) + free_bvhtree_from_mesh(&treeData_v); + if (dist_e) + free_bvhtree_from_mesh(&treeData_e); + if (dist_f) + free_bvhtree_from_mesh(&treeData_f); +} + +/** + * Returns the real distance between a vertex and another reference object. + * Note that it works in final world space (i.e. with constraints etc. applied). + */ +static void get_vert2ob_distance(int numVerts, float (*v_cos)[3], float *dist, + const Object* ob, const Object* obr) +{ + /* Vertex and ref object coordinates. */ + float v_wco[3], + or_wco[3], + or_wro[3][3], /*unused*/ + or_wsz[3]; /*unused*/ + int i; + + /* Get world-coordinates of the reference object (constraints and anim included). + * We also get rotation and scale, even though we do not want them… + */ + mat4_to_loc_rot_size(or_wco, or_wro, or_wsz, (float (*)[4])obr->obmat); + + for (i = 0; i < numVerts; i++) { + /* Get world-coordinates of the vertex (constraints and anim included). */ + mul_v3_m4v3(v_wco, (float (*)[4])ob->obmat, v_cos[i]); + /* Return distance between both coordinates. */ + dist[i] = len_v3v3(v_wco, or_wco); + } +} + +/** + * Returns the real distance between an object and another reference object. + * Note that it works in final world space (i.e. with constraints etc. applied). + */ +static float get_ob2ob_distance(const Object* ob, const Object* obr) +{ + /* Both objects coordinates. */ + float o_wco[3], + o_wro[3][3], /*unused*/ + o_wsz[3], /*unused*/ + or_wco[3], + or_wro[3][3],/*unused*/ + or_wsz[3]; /*unused*/ + /* Get world-coordinates of both objects (constraints and anim included). + * We also get rotation and scale, even though we do not want them… + */ + mat4_to_loc_rot_size(o_wco, o_wro, o_wsz, (float (*)[4])ob->obmat); + mat4_to_loc_rot_size(or_wco, or_wro, or_wsz, (float (*)[4])obr->obmat); + /* Return distance between both coordinates. */ + return len_v3v3(o_wco, or_wco); +} + +/************************************** + * Modifiers functions. * + **************************************/ +static void initData(ModifierData *md) +{ + WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) md; + + wmd->proximity_mode = MOD_WVG_PROXIMITY_OBJ2OBJDIST; + wmd->proximity_flags = MOD_WVG_PROXIMITY_O2VD_VERTS; + + wmd->mask_constant = 1.0f; + wmd->mask_tex_use_channel = MOD_WVG_MASK_TEX_USE_INT; /* Use intensity by default. */ + wmd->mask_tex_mapping = MOD_DISP_MAP_LOCAL; +} + +static void copyData(ModifierData *md, ModifierData *target) +{ + WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) md; + WeightVGProximityModifierData *twmd = (WeightVGProximityModifierData*) target; + + BLI_strncpy(twmd->defgrp_name, wmd->defgrp_name, sizeof(twmd->defgrp_name)); + twmd->proximity_mode = wmd->proximity_mode; + twmd->proximity_flags = wmd->proximity_flags; + twmd->proximity_ob_target = wmd->proximity_ob_target; + + twmd->mask_constant = wmd->mask_constant; + BLI_strncpy(twmd->mask_defgrp_name, wmd->mask_defgrp_name, sizeof(twmd->mask_defgrp_name)); + twmd->mask_texture = wmd->mask_texture; + twmd->mask_tex_use_channel = wmd->mask_tex_use_channel; + twmd->mask_tex_mapping = wmd->mask_tex_mapping; + twmd->mask_tex_map_obj = wmd->mask_tex_map_obj; + BLI_strncpy(twmd->mask_tex_uvlayer_name, wmd->mask_tex_uvlayer_name, + sizeof(twmd->mask_tex_uvlayer_name)); +} + +static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md) +{ + WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) md; + CustomDataMask dataMask = 0; + + /* We need vertex groups! */ + dataMask |= CD_MASK_MDEFORMVERT; + + /* Ask for UV coordinates if we need them. */ + if(wmd->mask_tex_mapping == MOD_DISP_MAP_UV) + dataMask |= CD_MASK_MTFACE; + + return dataMask; +} + +static int dependsOnTime(ModifierData *md) +{ + WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) md; + + if(wmd->mask_texture) + return BKE_texture_dependsOnTime(wmd->mask_texture); + return 0; +} + +static void foreachObjectLink(ModifierData *md, Object *ob, + void (*walk)(void *userData, Object *ob, Object **obpoin), + void *userData) +{ + WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) md; + walk(userData, ob, &wmd->proximity_ob_target); + walk(userData, ob, &wmd->mask_tex_map_obj); +} + +static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData) +{ + WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) md; + + walk(userData, ob, (ID **)&wmd->mask_texture); + + foreachObjectLink(md, ob, (ObjectWalkFunc)walk, userData); +} + +static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *UNUSED(scene), + Object *UNUSED(ob), DagNode *obNode) +{ + WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) md; + DagNode *curNode; + + if (wmd->proximity_ob_target) { + curNode = dag_get_node(forest, wmd->proximity_ob_target); + dag_add_relation(forest, curNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA, + "WeightVGProximity Modifier"); + } + + if(wmd->mask_tex_map_obj && wmd->mask_tex_mapping == MOD_DISP_MAP_OBJECT) { + curNode = dag_get_node(forest, wmd->mask_tex_map_obj); + + dag_add_relation(forest, curNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA, + "WeightVGProximity Modifier"); + } + + if(wmd->mask_tex_mapping == MOD_DISP_MAP_GLOBAL) + dag_add_relation(forest, obNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA, + "WeightVGProximity Modifier"); +} + +static int isDisabled(ModifierData *md, int UNUSED(useRenderParams)) +{ + WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) md; + /* If no vertex group, bypass. */ + if (wmd->defgrp_name == NULL) return 1; + /* If no target object, bypass. */ + return (wmd->proximity_ob_target == NULL); +} + +static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *derivedData, + int UNUSED(useRenderParams), int UNUSED(isFinalCalc)) +{ + WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) md; + DerivedMesh *dm = derivedData; + DerivedMesh *ret; + MDeformVert *dvert = NULL; + int numVerts; + float (*v_cos)[3] = NULL; /* The vertices coordinates. */ + Object *obr; /* Our target object. */ + int defgrp_idx; + float *tw = NULL; + float *org_w = NULL; + float *new_w =NULL; + int *tidx, *indices = NULL; + int numIdx = 0; + int i, j; + char rel_ret = 0; /* Boolean, whether we have to release ret dm or not, when not using it! */ + + /* Get number of verts. */ + numVerts = dm->getNumVerts(dm); + + /* Check if we can just return the original mesh. + * Must have verts and therefore verts assigned to vgroups to do anything useful! + */ + if ((numVerts == 0) || (ob->defbase.first == NULL)) + return dm; + + /* Create a copy of our dmesh. + * TODO: This should be done only if needed ! + */ + if (1) { + /* XXX Seems to create problems with weightpaint mode... */ +// DM_set_only_copy(dm, CD_MASK_MDEFORMVERT); /* Only copy defgroup layer. */ + ret = CDDM_copy(dm); + rel_ret = 1; + } + else + ret = dm; + + /* Get vgroup idx from its name. */ + defgrp_idx = defgroup_name_index(ob, wmd->defgrp_name); + + /* Get actual dverts (ie vertex group data). */ + if (defgrp_idx >= 0) + dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT); + /* Get our target object. */ + obr = wmd->proximity_ob_target; + /* If no dverts or target object, return unmodified data… */ + if ((defgrp_idx < 0) || (dvert == NULL) || (!obr)) { + if (rel_ret) + ret->release(ret); + return dm; + } + + /* Find out which vertices to work on (all vertices in vgroup), and get their relevant weight. + */ + tidx = MEM_mallocN(sizeof(int) * numVerts, "WeightVGProximity Modifier, tidx"); + tw = MEM_mallocN(sizeof(float) * numVerts, "WeightVGProximity Modifier, tw"); + for (i = 0; i < numVerts; i++) { + for (j = 0; j < dvert[i].totweight; j++) { + if(dvert[i].dw[j].def_nr == defgrp_idx) { + tidx[numIdx] = i; + tw[numIdx++] = dvert[i].dw[j].weight; + break; + } + } + } + indices = MEM_mallocN(sizeof(int) * numIdx, "WeightVGProximity Modifier, indices"); + memcpy(indices, tidx, sizeof(int) * numIdx); + org_w = MEM_mallocN(sizeof(float) * numIdx, "WeightVGProximity Modifier, org_w"); + new_w = MEM_mallocN(sizeof(float) * numIdx, "WeightVGProximity Modifier, new_w"); + memcpy(org_w, tw, sizeof(float) * numIdx); + MEM_freeN(tidx); + MEM_freeN(tw); + + /* Get our vertex coordinates. */ + v_cos = MEM_mallocN(sizeof(float[3]) * numIdx, "WeightVGProximity Modifier, v_cos"); + for (i = 0; i < numIdx; i++) + ret->getVertCo(ret, indices[i], v_cos[i]); + + /* Compute wanted distances. */ + if (wmd->proximity_mode == MOD_WVG_PROXIMITY_OBJ2OBJDIST) { + float dist = get_ob2ob_distance(ob, obr); + for(i = 0; i < numIdx; i++) + new_w[i] = dist; + } + else if (wmd->proximity_mode == MOD_WVG_PROXIMITY_OBJ2VERTDIST) { + char use_trgt_verts = (wmd->proximity_flags & MOD_WVG_PROXIMITY_O2VD_VERTS); + char use_trgt_edges = (wmd->proximity_flags & MOD_WVG_PROXIMITY_O2VD_EDGES); + char use_trgt_faces = (wmd->proximity_flags & MOD_WVG_PROXIMITY_O2VD_FACES); + + if (use_trgt_verts || use_trgt_edges || use_trgt_faces) { + DerivedMesh *target_dm = obr->derivedFinal; + if (!target_dm) { + if (ELEM3(obr->type, OB_CURVE, OB_SURF, OB_FONT)) + target_dm = CDDM_from_curve(obr); + else if (obr->type == OB_MESH) { + Mesh *me = (Mesh*)obr->data; + if (me->edit_mesh) + target_dm = CDDM_from_editmesh((EditMesh*)me->edit_mesh, me); + else + target_dm = CDDM_from_mesh(me, obr); + } + } + + /* We must check that we do have a valid target_dm! */ + if (target_dm) { + SpaceTransform loc2trgt; + float *dists_v = use_trgt_verts ? MEM_mallocN(sizeof(float) * numIdx, "WeightVGProximity Modifier, dists_v") : NULL; + float *dists_e = use_trgt_edges ? MEM_mallocN(sizeof(float) * numIdx, "WeightVGProximity Modifier, dists_e") : NULL; + float *dists_f = use_trgt_faces ? MEM_mallocN(sizeof(float) * numIdx, "WeightVGProximity Modifier, dists_f") : NULL; + + space_transform_setup(&loc2trgt, ob, obr); + get_vert2geom_distance(numIdx, v_cos, dists_v, dists_e, dists_f, + target_dm, &loc2trgt); + for(i = 0; i < numIdx; i++) { + new_w[i] = dists_v ? dists_v[i] : FLT_MAX; + new_w[i] = dists_e ? minf(dists_e[i], new_w[i]) : new_w[i]; + new_w[i] = dists_f ? minf(dists_f[i], new_w[i]) : new_w[i]; + } + } + /* Else, fall back to default obj2vert behavior. */ + else + get_vert2ob_distance(numIdx, v_cos, new_w, ob, obr); + } + else + get_vert2ob_distance(numIdx, v_cos, new_w, ob, obr); + } + + /* Do masking. */ + weightvg_do_mask(numIdx, indices, org_w, new_w, ob, ret, wmd->mask_constant, + wmd->mask_defgrp_name, wmd->mask_texture, wmd->mask_tex_use_channel, + wmd->mask_tex_mapping, wmd->mask_tex_map_obj, wmd->mask_tex_uvlayer_name); + + /* Update vgroup. Note we never add nor remove vertices from vgroup here. */ + weightvg_update_vg(dvert, defgrp_idx, numIdx, indices, org_w, 0, 0.0f, 0, 0.0f); + + /* Freeing stuff. */ + if (org_w) + MEM_freeN(org_w); + if (new_w) + MEM_freeN(new_w); + if (indices) + MEM_freeN(indices); + if (v_cos) + MEM_freeN(v_cos); + + /* Return the vgroup-modified mesh. */ + return ret; +} + +static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob, + struct EditMesh *UNUSED(editData), + DerivedMesh *derivedData) +{ + return applyModifier(md, ob, derivedData, 0, 1); +} + + +ModifierTypeInfo modifierType_WeightVGProximity = { + /* name */ "WeightVGProximity", + /* structName */ "WeightVGProximityModifierData", + /* structSize */ sizeof(WeightVGProximityModifierData), + /* type */ eModifierTypeType_Nonconstructive, + /* flags */ eModifierTypeFlag_AcceptsMesh + |eModifierTypeFlag_SupportsMapping + |eModifierTypeFlag_SupportsEditmode, + + /* copyData */ copyData, + /* deformVerts */ NULL, + /* deformMatrices */ NULL, + /* deformVertsEM */ NULL, + /* deformMatricesEM */ NULL, + /* applyModifier */ applyModifier, + /* applyModifierEM */ applyModifierEM, + /* initData */ initData, + /* requiredDataMask */ requiredDataMask, + /* freeData */ NULL, + /* isDisabled */ isDisabled, + /* updateDepgraph */ updateDepgraph, + /* dependsOnTime */ dependsOnTime, + /* dependsOnNormals */ NULL, + /* foreachObjectLink */ foreachObjectLink, + /* foreachIDLink */ foreachIDLink, +}; + From af286ac95b5dbd0a09e433ba672c75f126b206c2 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Tue, 26 Jul 2011 18:51:35 +0000 Subject: [PATCH 049/182] =?UTF-8?q?vgroup=5Fmodifiers:=20Addressed=20most?= =?UTF-8?q?=20ideasman=E2=80=99s=20remarks=20and=20suggestions=20in=20his?= =?UTF-8?q?=20last=20review.=20*Removed=20curve=20init=20code=20in=20readf?= =?UTF-8?q?ile=20(no=20more=20needed=20since=20the=20split=20broke=20anywa?= =?UTF-8?q?y=20compatibility=20with=20earlier=20WeightVGroup=20files?= =?UTF-8?q?=E2=80=A6).=20*Updated=20get=5Fob2ob=5Fdistance()=20code=20(muc?= =?UTF-8?q?h=20simpler=20=E2=80=93=C2=A0I=E2=80=99m=20not=20a=20matrices?= =?UTF-8?q?=E2=80=99=20god!).=20*Enhanced=20a=20few=20RNA=20names=20(Campb?= =?UTF-8?q?ell=20has=20others=20in=20mind=20here,=20though,=20I=20think).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/blender/blenloader/intern/readfile.c | 18 +----------------- source/blender/makesrna/intern/rna_modifier.c | 12 +++++++----- .../modifiers/intern/MOD_weightvgproximity.c | 15 +-------------- 3 files changed, 9 insertions(+), 36 deletions(-) diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index e21a132d16d..ce4a5d21759 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -11714,24 +11714,8 @@ static void do_versions(FileData *fd, Library *lib, Main *main) /* put compatibility code here until next subversion bump */ { - Object *ob; - ModifierData *md; - - /* WeightVGEdit modifier: CurveMapping pointer… */ - for(ob = main->object.first; ob; ob = ob->id.next) { - for(md = ob->modifiers.first; md; md = md->next) { - if(md->type == eModifierType_WeightVGEdit) { - WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md; - if (wmd->cmap_curve == NULL) { - wmd->cmap_curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f); - curvemapping_initialize(wmd->cmap_curve); - } - } - } - } - } - + /* WATCH IT!!!: pointers from libdata have not been converted yet here! */ /* WATCH IT 2!: Userdef struct init has to be in editors/interface/resources.c! */ diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index fff99cbdf15..39d3e5873bb 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -2728,8 +2728,10 @@ static void rna_def_modifier_weightvgmix(BlenderRNA *brna) static void rna_def_modifier_weightvgproximity(BlenderRNA *brna) { static EnumPropertyItem weightvg_proximity_modes_items[] = { - {MOD_WVG_PROXIMITY_OBJ2OBJDIST, "OBJ2OBJDIST", 0, "O2O Distance", ""}, - {MOD_WVG_PROXIMITY_OBJ2VERTDIST, "OBJ2VERTDIST", 0, "O2V Distance", ""}, + {MOD_WVG_PROXIMITY_OBJ2OBJDIST, "OBJ2OBJDIST", 0, "Object Distance", + "Use distance between affected and target objects."}, + {MOD_WVG_PROXIMITY_OBJ2VERTDIST, "OBJ2VERTDIST", 0, "Verts Distance", + "Use distance between affected object’s vertices and target object, or target object’s geometry."}, {0, NULL, 0, NULL, NULL}}; StructRNA *srna; @@ -2755,19 +2757,19 @@ static void rna_def_modifier_weightvgproximity(BlenderRNA *brna) prop= RNA_def_property(srna, "obj2vert_verts", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "proximity_flags", MOD_WVG_PROXIMITY_O2VD_VERTS); - RNA_def_property_ui_text(prop, "Use Target Vertices", + RNA_def_property_ui_text(prop, "Verts as Target", "Use shortest distance to target object’s vertices as weight."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); prop= RNA_def_property(srna, "obj2vert_edges", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "proximity_flags", MOD_WVG_PROXIMITY_O2VD_EDGES); - RNA_def_property_ui_text(prop, "Use Target Edges", + RNA_def_property_ui_text(prop, "Edges as Target", "Use shortest distance to target object’s edges as weight."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); prop= RNA_def_property(srna, "obj2vert_faces", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "proximity_flags", MOD_WVG_PROXIMITY_O2VD_FACES); - RNA_def_property_ui_text(prop, "Use Target Faces", + RNA_def_property_ui_text(prop, "Faces as Target", "Use shortest distance to target object’s faces as weight."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); diff --git a/source/blender/modifiers/intern/MOD_weightvgproximity.c b/source/blender/modifiers/intern/MOD_weightvgproximity.c index 7349d90c1ec..06ffb5e4510 100644 --- a/source/blender/modifiers/intern/MOD_weightvgproximity.c +++ b/source/blender/modifiers/intern/MOD_weightvgproximity.c @@ -197,20 +197,7 @@ static void get_vert2ob_distance(int numVerts, float (*v_cos)[3], float *dist, */ static float get_ob2ob_distance(const Object* ob, const Object* obr) { - /* Both objects coordinates. */ - float o_wco[3], - o_wro[3][3], /*unused*/ - o_wsz[3], /*unused*/ - or_wco[3], - or_wro[3][3],/*unused*/ - or_wsz[3]; /*unused*/ - /* Get world-coordinates of both objects (constraints and anim included). - * We also get rotation and scale, even though we do not want them… - */ - mat4_to_loc_rot_size(o_wco, o_wro, o_wsz, (float (*)[4])ob->obmat); - mat4_to_loc_rot_size(or_wco, or_wro, or_wsz, (float (*)[4])obr->obmat); - /* Return distance between both coordinates. */ - return len_v3v3(o_wco, or_wco); + return len_v3v3(ob->obmat[3], obr->obmat[3]); } /************************************** From 048eabf302b024a6f98907ece0d22c63b1c95dca Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Wed, 27 Jul 2011 18:48:23 +0000 Subject: [PATCH 050/182] vgroup_modifiers: coded a way to test whether the dm needs to be copied (i.e. if the affected cdata layer is or not the original one). However, as this piece of code tends to slow down things (see e.g. scene 5 of WeightVG test blend file), I deactivated it for now... --- .../modifiers/intern/MOD_weightvgedit.c | 54 +++++++++++----- .../modifiers/intern/MOD_weightvgmix.c | 64 +++++++++++++------ .../modifiers/intern/MOD_weightvgproximity.c | 63 ++++++++++++------ 3 files changed, 129 insertions(+), 52 deletions(-) diff --git a/source/blender/modifiers/intern/MOD_weightvgedit.c b/source/blender/modifiers/intern/MOD_weightvgedit.c index c8d7ab52ce8..e84ecffa74b 100644 --- a/source/blender/modifiers/intern/MOD_weightvgedit.c +++ b/source/blender/modifiers/intern/MOD_weightvgedit.c @@ -190,8 +190,8 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der int UNUSED(useRenderParams), int UNUSED(isFinalCalc)) { WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md; - DerivedMesh *dm = derivedData; - DerivedMesh *ret; + DerivedMesh *dm = derivedData, *ret = NULL; + Mesh *ob_m = NULL; MDeformVert *dvert = NULL; float *org_w = NULL; /* Array original weights. */ float *new_w = NULL; /* Array new weights. */ @@ -217,30 +217,54 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der if ((numVerts == 0) || (ob->defbase.first == NULL)) return dm; - /* Create a copy of our dmesh. - * TODO: This should be done only if needed, i.e. if dm has the org data ! + /* Get vgroup idx from its name. */ + defgrp_idx = defgroup_name_index(ob, wmd->defgrp_name); + if (defgrp_idx < 0) + return dm; + + /* XXX All this to avoid copying dm when not needed… However, it nearly doubles compute + * time! See scene 5 of the WeighVG test file… */ - if (1) { - /* XXX Seems to create problems with weightpaint mode... */ +#if 0 + /* Get actual dverts (ie vertex group data). */ + dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT); + /* If no dverts, return unmodified data… */ + if (dvert == NULL) + return dm; + + /* Get org mesh, only to test whether affected cdata layer has already been copied + * somewhere up in the modifiers stack. + */ + ob_m = get_mesh(ob); + if (ob_m == NULL) + return dm; + + /* Create a copy of our dmesh, only if our affected cdata layer is the same as org mesh. */ + if (dvert == CustomData_get_layer(&ob_m->vdata, CD_MDEFORMVERT)) { + /* XXX Seems to create problems with weightpaint mode??? + * I’m missing something here, I guess… + */ // DM_set_only_copy(dm, CD_MASK_MDEFORMVERT); /* Only copy defgroup layer. */ ret = CDDM_copy(dm); + dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT); + if (dvert == NULL) { + ret->release(ret); + return dm; + } rel_ret = 1; } else ret = dm; - - /* Get vgroup idx from its name. */ - defgrp_idx = defgroup_name_index(ob, wmd->defgrp_name); - - /* Get actual dverts (ie vertex group data). */ - if (defgrp_idx >= 0) - dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT); - /* If no dverts, return unmodified data… */ - if ((defgrp_idx < 0) || (dvert == NULL)) { +#else + ret = CDDM_copy(dm); + rel_ret = 1; + dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT); + if (dvert == NULL) { if (rel_ret) ret->release(ret); return dm; } +#endif /* Get org weights, assuming 0.0 for vertices not in given vgroup. */ org_w = MEM_mallocN(sizeof(float) * numVerts, "WeightVGEdit Modifier, org_w"); diff --git a/source/blender/modifiers/intern/MOD_weightvgmix.c b/source/blender/modifiers/intern/MOD_weightvgmix.c index c4f107de72e..f99060bdf63 100644 --- a/source/blender/modifiers/intern/MOD_weightvgmix.c +++ b/source/blender/modifiers/intern/MOD_weightvgmix.c @@ -220,8 +220,8 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der int UNUSED(useRenderParams), int UNUSED(isFinalCalc)) { WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md; - DerivedMesh *dm = derivedData; - DerivedMesh *ret; + DerivedMesh *dm = derivedData, *ret = NULL; + Mesh *ob_m = NULL; MDeformVert *dvert = NULL; int numVerts; int defgrp_idx, defgrp_idx2 = -1; @@ -241,34 +241,60 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der if ((numVerts == 0) || (ob->defbase.first == NULL)) return dm; - /* Create a copy of our dmesh. - * TODO: This should be done only if needed ! + /* Get vgroup idx from its name. */ + defgrp_idx = defgroup_name_index(ob, wmd->defgrp_name); + if (defgrp_idx < 0) + return dm; + /* Get seconf vgroup idx from its name, if given. */ + if (wmd->defgrp_name2[0] != (char)0) { + defgrp_idx2 = defgroup_name_index(ob, wmd->defgrp_name2); + if (defgrp_idx2 < 0) + return dm; + } + + /* XXX All this to avoid copying dm when not needed… However, it nearly doubles compute + * time! See scene 5 of the WeighVG test file… */ - if (1) { - /* XXX Seems to create problems with weightpaint mode... */ +#if 0 + /* Get actual dverts (ie vertex group data). */ + dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT); + /* If no dverts, return unmodified data… */ + if (dvert == NULL) + return dm; + + /* Get org mesh, only to test whether affected cdata layer has already been copied + * somewhere up in the modifiers stack. + */ + ob_m = get_mesh(ob); + if (ob_m == NULL) + return dm; + + /* Create a copy of our dmesh, only if our affected cdata layer is the same as org mesh. */ + if (dvert == CustomData_get_layer(&ob_m->vdata, CD_MDEFORMVERT)) { + /* XXX Seems to create problems with weightpaint mode??? + * I’m missing something here, I guess… + */ // DM_set_only_copy(dm, CD_MASK_MDEFORMVERT); /* Only copy defgroup layer. */ ret = CDDM_copy(dm); + dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT); + if (dvert == NULL) { + ret->release(ret); + return dm; + } rel_ret = 1; } else ret = dm; - - /* Get first vgroup idx from its name. */ - defgrp_idx = defgroup_name_index(ob, wmd->defgrp_name); - - /* Get seconf vgroup idx from its name, if given. */ - if (wmd->defgrp_name2) - defgrp_idx2 = defgroup_name_index(ob, wmd->defgrp_name2); - - /* Get actual dverts (ie vertex group data). */ - if (defgrp_idx >= 0) - dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT); - /* If no dverts, return unmodified data… */ - if ((defgrp_idx < 0) || (dvert == NULL)) { +#else + ret = CDDM_copy(dm); + rel_ret = 1; + dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT); + if (dvert == NULL) { if (rel_ret) ret->release(ret); return dm; } +#endif /* Find out which vertices to work on. */ tidx = MEM_mallocN(sizeof(int) * numVerts, "WeightVGMix Modifier, tidx"); diff --git a/source/blender/modifiers/intern/MOD_weightvgproximity.c b/source/blender/modifiers/intern/MOD_weightvgproximity.c index 06ffb5e4510..80524eec9af 100644 --- a/source/blender/modifiers/intern/MOD_weightvgproximity.c +++ b/source/blender/modifiers/intern/MOD_weightvgproximity.c @@ -314,12 +314,12 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der int UNUSED(useRenderParams), int UNUSED(isFinalCalc)) { WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) md; - DerivedMesh *dm = derivedData; - DerivedMesh *ret; + DerivedMesh *dm = derivedData, *ret = NULL; + Mesh *ob_m = NULL; MDeformVert *dvert = NULL; int numVerts; float (*v_cos)[3] = NULL; /* The vertices coordinates. */ - Object *obr; /* Our target object. */ + Object *obr = NULL; /* Our target object. */ int defgrp_idx; float *tw = NULL; float *org_w = NULL; @@ -338,32 +338,59 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der if ((numVerts == 0) || (ob->defbase.first == NULL)) return dm; - /* Create a copy of our dmesh. - * TODO: This should be done only if needed ! + /* Get our target object. */ + obr = wmd->proximity_ob_target; + if (obr == NULL) + return dm; + + /* Get vgroup idx from its name. */ + defgrp_idx = defgroup_name_index(ob, wmd->defgrp_name); + if (defgrp_idx < 0) + return dm; + + /* XXX All this to avoid copying dm when not needed… However, it nearly doubles compute + * time! See scene 5 of the WeighVG test file… */ - if (1) { - /* XXX Seems to create problems with weightpaint mode... */ +#if 0 + /* Get actual dverts (ie vertex group data). */ + dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT); + /* If no dverts, return unmodified data… */ + if (dvert == NULL) + return dm; + + /* Get org mesh, only to test whether affected cdata layer has already been copied + * somewhere up in the modifiers stack. + */ + ob_m = get_mesh(ob); + if (ob_m == NULL) + return dm; + + /* Create a copy of our dmesh, only if our affected cdata layer is the same as org mesh. */ + if (dvert == CustomData_get_layer(&ob_m->vdata, CD_MDEFORMVERT)) { + /* XXX Seems to create problems with weightpaint mode??? + * I’m missing something here, I guess… + */ // DM_set_only_copy(dm, CD_MASK_MDEFORMVERT); /* Only copy defgroup layer. */ ret = CDDM_copy(dm); + dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT); + if (dvert == NULL) { + ret->release(ret); + return dm; + } rel_ret = 1; } else ret = dm; - - /* Get vgroup idx from its name. */ - defgrp_idx = defgroup_name_index(ob, wmd->defgrp_name); - - /* Get actual dverts (ie vertex group data). */ - if (defgrp_idx >= 0) - dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT); - /* Get our target object. */ - obr = wmd->proximity_ob_target; - /* If no dverts or target object, return unmodified data… */ - if ((defgrp_idx < 0) || (dvert == NULL) || (!obr)) { +#else + ret = CDDM_copy(dm); + rel_ret = 1; + dvert = ret->getVertDataArray(ret, CD_MDEFORMVERT); + if (dvert == NULL) { if (rel_ret) ret->release(ret); return dm; } +#endif /* Find out which vertices to work on (all vertices in vgroup), and get their relevant weight. */ From fb99e23205aa1eb7b3f47b8f43e8b812f598a574 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 28 Jul 2011 01:38:48 +0000 Subject: [PATCH 051/182] minor cleanup of rna - use an rna enum-set for proximity vert/edge/face options. - rename some flags. - better conform to rna naming conventions. --- .../startup/bl_ui/properties_data_modifier.py | 40 +++++++------- source/blender/makesdna/DNA_modifier_types.h | 20 +++---- source/blender/makesrna/intern/rna_modifier.c | 55 +++++++++---------- .../modifiers/intern/MOD_weightvgedit.c | 10 ++-- .../modifiers/intern/MOD_weightvgproximity.c | 22 +++++--- 5 files changed, 73 insertions(+), 74 deletions(-) diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py index 18ae7ec2be6..a789a65c0f8 100644 --- a/release/scripts/startup/bl_ui/properties_data_modifier.py +++ b/release/scripts/startup/bl_ui/properties_data_modifier.py @@ -777,8 +777,8 @@ class DATA_PT_modifiers(ModifierButtonsPanel, bpy.types.Panel): col.label(text="Default Weight:") col.prop(md, "default_weight", text="") - layout.prop(md, "flag_map") - if md.flag_map: + layout.prop(md, "use_map") + if md.use_map: split = layout.split() col = split.column() col.label("Input:") @@ -790,27 +790,27 @@ class DATA_PT_modifiers(ModifierButtonsPanel, bpy.types.Panel): col.prop(md, "map_input_high", text="Max") col.prop(md, "map_output_high", text="Max") - layout.prop(md, "flag_curve_map") - if md.flag_curve_map: - row = layout.row() - row.template_curve_mapping(md, "cmap_curve") + layout.prop(md, "use_map_curve") + if md.use_map_curve: + col = layout.column() + col.template_curve_mapping(md, "map_curve") - layout.prop(md, "flag_reverse") + layout.prop(md, "use_reverse") - layout.prop(md, "flag_clamp") - if md.flag_clamp: + layout.prop(md, "use_clamp") + if md.use_clamp: row = layout.row() - row.prop(md, "clamp_min_weight") - row.prop(md, "clamp_max_weight") + row.prop(md, "clamp_weight_min") + row.prop(md, "clamp_weight_max") row = layout.row() - row.prop(md, "flag_add2vg") - row.prop(md, "flag_remfvg") + row.prop(md, "use_add") + row.prop(md, "use_remove") row = layout.row() - if md.flag_add2vg: + if md.use_add: row.prop(md, "add_threshold") - if md.flag_remfvg: - row.prop(md, "rem_threshold") + if md.use_remove: + row.prop(md, "remove_threshold") # Common mask options… layout.separator() @@ -850,15 +850,13 @@ class DATA_PT_modifiers(ModifierButtonsPanel, bpy.types.Panel): col = split.column() col.label(text="Target Object:") - col.prop(md, "ob_target", text="") + col.prop(md, "target", text="") row = layout.row() row.prop(md, "proximity_mode", expand=True) - if md.proximity_mode == 'OBJ2VERTDIST': + if md.proximity_mode == 'GEOMETRY': row = layout.row() - row.prop(md, "obj2vert_verts") - row.prop(md, "obj2vert_edges") - row.prop(md, "obj2vert_faces") + row.prop(md, "proximity_geometry", expand=True) # Common mask options… layout.separator() diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index 2b1111e1308..cc8da863c44 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -810,7 +810,7 @@ typedef struct WeightVGEditModifierData { float add_threshold, rem_threshold; /* Clamping options. */ - float clamp_min_weight, clamp_max_weight; + float clamp_weight_min, clamp_weight_max; /* Masking options. */ float mask_constant; /* The global “influence”, if no vgroup nor tex is used as mask. */ @@ -846,7 +846,7 @@ typedef struct WeightVGEditModifierData { typedef struct WeightVGMixModifierData { ModifierData modifier; - /* XXX Note: I tried to keep everything logically ordered – provided the + /* XXX Note: I tried to keep everything logically ordered – provided the * alignment constraints… */ @@ -926,17 +926,17 @@ typedef struct WeightVGProximityModifierData { /* Modes of proximity weighting. */ /* Dist from target object to affected object. */ -#define MOD_WVG_PROXIMITY_OBJ2OBJDIST 1 +#define MOD_WVG_PROXIMITY_OBJECT 1 /* source vertex to other location */ /* Dist from target object to vertex. */ -#define MOD_WVG_PROXIMITY_OBJ2VERTDIST 2 +#define MOD_WVG_PROXIMITY_GEOMETRY 2 /* source vertex to other geometry */ /* Flags options for proximity weighting. */ -/* Use nearest vertices of target obj, in OVJ2VERTDIST mode. */ -#define MOD_WVG_PROXIMITY_O2VD_VERTS (1 << 0) -/* Use nearest edges of target obj, in OVJ2VERTDIST mode. */ -#define MOD_WVG_PROXIMITY_O2VD_EDGES (1 << 1) -/* Use nearest faces of target obj, in OVJ2VERTDIST mode. */ -#define MOD_WVG_PROXIMITY_O2VD_FACES (1 << 2) +/* Use nearest vertices of target obj, in MOD_WVG_PROXIMITY_GEOMETRY mode. */ +#define MOD_WVG_PROXIMITY_GEOM_VERTS (1 << 0) +/* Use nearest edges of target obj, in MOD_WVG_PROXIMITY_GEOMETRY mode. */ +#define MOD_WVG_PROXIMITY_GEOM_EDGES (1 << 1) +/* Use nearest faces of target obj, in MOD_WVG_PROXIMITY_GEOMETRY mode. */ +#define MOD_WVG_PROXIMITY_GEOM_FACES (1 << 2) /* Defines common to all WeightVG modifiers. */ /* Tex channel to be used as mask. */ diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index 39d3e5873bb..75449382c5e 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -2553,34 +2553,34 @@ static void rna_def_modifier_weightvgedit(BlenderRNA *brna) RNA_def_property_string_funcs(prop, NULL, NULL, "rna_WeightVGModifier_vgroup_set"); RNA_def_property_update(prop, 0, "rna_Modifier_update"); - prop= RNA_def_property(srna, "flag_map", PROP_BOOLEAN, PROP_NONE); + prop= RNA_def_property(srna, "use_map", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "edit_flags", MOD_WVG_EDIT_MAP); RNA_def_property_ui_text(prop, "Map", "Map vertex group weights."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); - prop= RNA_def_property(srna, "flag_curve_map", PROP_BOOLEAN, PROP_NONE); + prop= RNA_def_property(srna, "use_map_curve", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "edit_flags", MOD_WVG_EDIT_CMAP); RNA_def_property_ui_text(prop, "Curve Map", "Map vertex group weights with a curve."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); - prop= RNA_def_property(srna, "flag_reverse", PROP_BOOLEAN, PROP_NONE); + prop= RNA_def_property(srna, "use_reverse", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "edit_flags", MOD_WVG_EDIT_REVERSE_WEIGHTS); RNA_def_property_ui_text(prop, "Reverse", "Reverse vertex group weights."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); - prop= RNA_def_property(srna, "flag_add2vg", PROP_BOOLEAN, PROP_NONE); + prop= RNA_def_property(srna, "use_add", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "edit_flags", MOD_WVG_EDIT_ADD2VG); RNA_def_property_ui_text(prop, "Add to VG", "Add vertices with weight over threshold " "to vgroup."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); - prop= RNA_def_property(srna, "flag_remfvg", PROP_BOOLEAN, PROP_NONE); + prop= RNA_def_property(srna, "use_remove", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "edit_flags", MOD_WVG_EDIT_REMFVG); RNA_def_property_ui_text(prop, "Rem from VG", "Remove vertices with weight below threshold " "from vgroup."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); - prop= RNA_def_property(srna, "flag_clamp", PROP_BOOLEAN, PROP_NONE); + prop= RNA_def_property(srna, "use_clamp", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "edit_flags", MOD_WVG_EDIT_CLAMP); RNA_def_property_ui_text(prop, "Clamp", "Clamp vertex group weights."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); @@ -2620,32 +2620,34 @@ static void rna_def_modifier_weightvgedit(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Output High Weight", "High output mapping value."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); - prop= RNA_def_property(srna, "cmap_curve", PROP_POINTER, PROP_NONE); + prop= RNA_def_property(srna, "map_curve", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "cmap_curve"); RNA_def_property_ui_text(prop, "Mapping Curve", "Custom mapping curve."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); prop= RNA_def_property(srna, "add_threshold", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "add_threshold"); RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0); RNA_def_property_ui_text(prop, "Add Threshold", "Lower bound for a vertex’s weight " "to be added to the vgroup."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); - prop= RNA_def_property(srna, "rem_threshold", PROP_FLOAT, PROP_NONE); + prop= RNA_def_property(srna, "remove_threshold", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "rem_threshold"); RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0); RNA_def_property_ui_text(prop, "Rem Threshold", "Upper bound for a vertex’s weight " "to be removed from the vgroup."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); - prop= RNA_def_property(srna, "clamp_min_weight", PROP_FLOAT, PROP_NONE); + prop= RNA_def_property(srna, "clamp_weight_min", PROP_FLOAT, PROP_NONE); RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0); RNA_def_property_ui_text(prop, "Min Weight", "Lowest weight a vertex can get."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); - prop= RNA_def_property(srna, "clamp_max_weight", PROP_FLOAT, PROP_NONE); + prop= RNA_def_property(srna, "clamp_weight_max", PROP_FLOAT, PROP_NONE); RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0); RNA_def_property_ui_text(prop, "Max Weight", "Highest weight a vertex can get."); @@ -2728,12 +2730,18 @@ static void rna_def_modifier_weightvgmix(BlenderRNA *brna) static void rna_def_modifier_weightvgproximity(BlenderRNA *brna) { static EnumPropertyItem weightvg_proximity_modes_items[] = { - {MOD_WVG_PROXIMITY_OBJ2OBJDIST, "OBJ2OBJDIST", 0, "Object Distance", + {MOD_WVG_PROXIMITY_OBJECT, "OBJECT", 0, "Object Distance", "Use distance between affected and target objects."}, - {MOD_WVG_PROXIMITY_OBJ2VERTDIST, "OBJ2VERTDIST", 0, "Verts Distance", + {MOD_WVG_PROXIMITY_GEOMETRY, "GEOMETRY", 0, "Geometry Distance", "Use distance between affected object’s vertices and target object, or target object’s geometry."}, {0, NULL, 0, NULL, NULL}}; + static EnumPropertyItem proximity_geometry_items[] = { + {MOD_WVG_PROXIMITY_GEOM_VERTS, "VERTEX", ICON_VERTEXSEL, "Vertex", ""}, + {MOD_WVG_PROXIMITY_GEOM_EDGES, "EDGE", ICON_EDGESEL, "Edge", ""}, + {MOD_WVG_PROXIMITY_GEOM_FACES, "FACE", ICON_FACESEL, "Face", ""}, + {0, NULL, 0, NULL, NULL}}; + StructRNA *srna; PropertyRNA *prop; @@ -2755,25 +2763,14 @@ static void rna_def_modifier_weightvgproximity(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Proximity Mode", "Which distances to target object to use."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); - prop= RNA_def_property(srna, "obj2vert_verts", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "proximity_flags", MOD_WVG_PROXIMITY_O2VD_VERTS); - RNA_def_property_ui_text(prop, "Verts as Target", - "Use shortest distance to target object’s vertices as weight."); + prop= RNA_def_property(srna, "proximity_geometry", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "proximity_flags"); + RNA_def_property_enum_items(prop, proximity_geometry_items); + RNA_def_property_flag(prop, PROP_ENUM_FLAG); /* important to run before default set */ + RNA_def_property_ui_text(prop, "Proximity Geometry", "Use shortest distance to target object’s geometry as weight"); RNA_def_property_update(prop, 0, "rna_Modifier_update"); - prop= RNA_def_property(srna, "obj2vert_edges", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "proximity_flags", MOD_WVG_PROXIMITY_O2VD_EDGES); - RNA_def_property_ui_text(prop, "Edges as Target", - "Use shortest distance to target object’s edges as weight."); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop= RNA_def_property(srna, "obj2vert_faces", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "proximity_flags", MOD_WVG_PROXIMITY_O2VD_FACES); - RNA_def_property_ui_text(prop, "Faces as Target", - "Use shortest distance to target object’s faces as weight."); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop= RNA_def_property(srna, "ob_target", PROP_POINTER, PROP_NONE); + prop= RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "proximity_ob_target"); RNA_def_property_ui_text(prop, "Target Object", "Object to calculate vertices’ distances from."); RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK); diff --git a/source/blender/modifiers/intern/MOD_weightvgedit.c b/source/blender/modifiers/intern/MOD_weightvgedit.c index e84ecffa74b..5bc185a40af 100644 --- a/source/blender/modifiers/intern/MOD_weightvgedit.c +++ b/source/blender/modifiers/intern/MOD_weightvgedit.c @@ -71,8 +71,8 @@ static void initData(ModifierData *md) wmd->cmap_curve = curvemapping_add(1, 0.0, 0.0, 1.0, 1.0); curvemapping_initialize(wmd->cmap_curve); - wmd->clamp_min_weight = 0.0f; - wmd->clamp_max_weight = 1.0f; + wmd->clamp_weight_min = 0.0f; + wmd->clamp_weight_max = 1.0f; wmd->add_threshold = 0.01f; wmd->rem_threshold = 0.01f; @@ -104,8 +104,8 @@ static void copyData(ModifierData *md, ModifierData *target) twmd->map_new_max = wmd->map_new_max; twmd->cmap_curve = curvemapping_copy(wmd->cmap_curve); - twmd->clamp_min_weight = wmd->clamp_min_weight; - twmd->clamp_max_weight = wmd->clamp_max_weight; + twmd->clamp_weight_min = wmd->clamp_weight_min; + twmd->clamp_weight_max = wmd->clamp_weight_max; twmd->add_threshold = wmd->add_threshold; twmd->rem_threshold = wmd->rem_threshold; @@ -311,7 +311,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der /* Do clamping. */ if (do_clamp) { for (i = 0; i < numVerts; i++) - CLAMP(org_w[i], wmd->clamp_min_weight, wmd->clamp_max_weight); + CLAMP(org_w[i], wmd->clamp_weight_min, wmd->clamp_weight_max); } /* Update/add/remove from vgroup. */ diff --git a/source/blender/modifiers/intern/MOD_weightvgproximity.c b/source/blender/modifiers/intern/MOD_weightvgproximity.c index 80524eec9af..84de87a4662 100644 --- a/source/blender/modifiers/intern/MOD_weightvgproximity.c +++ b/source/blender/modifiers/intern/MOD_weightvgproximity.c @@ -207,8 +207,8 @@ static void initData(ModifierData *md) { WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) md; - wmd->proximity_mode = MOD_WVG_PROXIMITY_OBJ2OBJDIST; - wmd->proximity_flags = MOD_WVG_PROXIMITY_O2VD_VERTS; + wmd->proximity_mode = MOD_WVG_PROXIMITY_OBJECT; + wmd->proximity_flags = MOD_WVG_PROXIMITY_GEOM_VERTS; wmd->mask_constant = 1.0f; wmd->mask_tex_use_channel = MOD_WVG_MASK_TEX_USE_INT; /* Use intensity by default. */ @@ -315,7 +315,9 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der { WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) md; DerivedMesh *dm = derivedData, *ret = NULL; +#if 0 Mesh *ob_m = NULL; +#endif MDeformVert *dvert = NULL; int numVerts; float (*v_cos)[3] = NULL; /* The vertices coordinates. */ @@ -419,15 +421,15 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der ret->getVertCo(ret, indices[i], v_cos[i]); /* Compute wanted distances. */ - if (wmd->proximity_mode == MOD_WVG_PROXIMITY_OBJ2OBJDIST) { + if (wmd->proximity_mode == MOD_WVG_PROXIMITY_OBJECT) { float dist = get_ob2ob_distance(ob, obr); for(i = 0; i < numIdx; i++) new_w[i] = dist; } - else if (wmd->proximity_mode == MOD_WVG_PROXIMITY_OBJ2VERTDIST) { - char use_trgt_verts = (wmd->proximity_flags & MOD_WVG_PROXIMITY_O2VD_VERTS); - char use_trgt_edges = (wmd->proximity_flags & MOD_WVG_PROXIMITY_O2VD_EDGES); - char use_trgt_faces = (wmd->proximity_flags & MOD_WVG_PROXIMITY_O2VD_FACES); + else if (wmd->proximity_mode == MOD_WVG_PROXIMITY_GEOMETRY) { + const short use_trgt_verts = (wmd->proximity_flags & MOD_WVG_PROXIMITY_GEOM_VERTS); + const short use_trgt_edges = (wmd->proximity_flags & MOD_WVG_PROXIMITY_GEOM_EDGES); + const short use_trgt_faces = (wmd->proximity_flags & MOD_WVG_PROXIMITY_GEOM_FACES); if (use_trgt_verts || use_trgt_edges || use_trgt_faces) { DerivedMesh *target_dm = obr->derivedFinal; @@ -460,11 +462,13 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der } } /* Else, fall back to default obj2vert behavior. */ - else + else { get_vert2ob_distance(numIdx, v_cos, new_w, ob, obr); + } } - else + else { get_vert2ob_distance(numIdx, v_cos, new_w, ob, obr); + } } /* Do masking. */ From a22f75606e2c179460bfa36a9a4afd4b9548d5f5 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Fri, 29 Jul 2011 13:25:58 +0000 Subject: [PATCH 052/182] =?UTF-8?q?vgroup=5Fmodifiers:=20Fixed=20last=20pr?= =?UTF-8?q?oblems=20with=20WP=20mode,=20plus=20a=20small=20fix=20in=20weig?= =?UTF-8?q?htvg=5Futil.c.=20It=20seems=20WeightVG=20modifiers=20can?= =?UTF-8?q?=E2=80=99t=20enable=20the=20eModifierTypeFlag=5FSupportsMapping?= =?UTF-8?q?=20flag...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/blender/modifiers/intern/MOD_weightvg_util.c | 8 +++++--- source/blender/modifiers/intern/MOD_weightvgedit.c | 4 +++- source/blender/modifiers/intern/MOD_weightvgmix.c | 4 +++- source/blender/modifiers/intern/MOD_weightvgproximity.c | 2 +- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/source/blender/modifiers/intern/MOD_weightvg_util.c b/source/blender/modifiers/intern/MOD_weightvg_util.c index c18fceb1e3f..1fe1a96c2e5 100644 --- a/source/blender/modifiers/intern/MOD_weightvg_util.c +++ b/source/blender/modifiers/intern/MOD_weightvg_util.c @@ -187,6 +187,7 @@ void weightvg_update_vg(MDeformVert *dvert, int defgrp_idx, int num, int *indice for (i = 0; i < num; i++) { int j; + char add2vg = do_add; float w = weights[i]; MDeformVert *dv = &dvert[indices ? indices[i] : i]; MDeformWeight *newdw; @@ -221,16 +222,17 @@ void weightvg_update_vg(MDeformVert *dvert, int defgrp_idx, int num, int *indice } } /* Else, just set the new computed weight. */ - else + else { dv->dw[j].weight = w; + } + add2vg = 0; break; } - continue; } /* If the vert wasn’t in the deform group, add it if needed! */ - if (do_add && w > add_thresh) { + if (add2vg && w > add_thresh) { newdw = MEM_callocN(sizeof(MDeformWeight)*(dv->totweight+1), "WeightVGEdit Modifier, deformWeight"); if(dv->dw) { memcpy(newdw, dv->dw, sizeof(MDeformWeight)*dv->totweight); diff --git a/source/blender/modifiers/intern/MOD_weightvgedit.c b/source/blender/modifiers/intern/MOD_weightvgedit.c index 5bc185a40af..57c93cdfddf 100644 --- a/source/blender/modifiers/intern/MOD_weightvgedit.c +++ b/source/blender/modifiers/intern/MOD_weightvgedit.c @@ -191,7 +191,9 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der { WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md; DerivedMesh *dm = derivedData, *ret = NULL; +#if 0 Mesh *ob_m = NULL; +#endif MDeformVert *dvert = NULL; float *org_w = NULL; /* Array original weights. */ float *new_w = NULL; /* Array new weights. */ @@ -344,7 +346,7 @@ ModifierTypeInfo modifierType_WeightVGEdit = { /* structSize */ sizeof(WeightVGEditModifierData), /* type */ eModifierTypeType_Nonconstructive, /* flags */ eModifierTypeFlag_AcceptsMesh - |eModifierTypeFlag_SupportsMapping +/* |eModifierTypeFlag_SupportsMapping*/ |eModifierTypeFlag_SupportsEditmode, /* copyData */ copyData, diff --git a/source/blender/modifiers/intern/MOD_weightvgmix.c b/source/blender/modifiers/intern/MOD_weightvgmix.c index f99060bdf63..29e00040bf6 100644 --- a/source/blender/modifiers/intern/MOD_weightvgmix.c +++ b/source/blender/modifiers/intern/MOD_weightvgmix.c @@ -221,7 +221,9 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der { WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md; DerivedMesh *dm = derivedData, *ret = NULL; +#if 0 Mesh *ob_m = NULL; +#endif MDeformVert *dvert = NULL; int numVerts; int defgrp_idx, defgrp_idx2 = -1; @@ -436,7 +438,7 @@ ModifierTypeInfo modifierType_WeightVGMix = { /* structSize */ sizeof(WeightVGMixModifierData), /* type */ eModifierTypeType_Nonconstructive, /* flags */ eModifierTypeFlag_AcceptsMesh - |eModifierTypeFlag_SupportsMapping +/* |eModifierTypeFlag_SupportsMapping*/ |eModifierTypeFlag_SupportsEditmode, /* copyData */ copyData, diff --git a/source/blender/modifiers/intern/MOD_weightvgproximity.c b/source/blender/modifiers/intern/MOD_weightvgproximity.c index 84de87a4662..537c5784d29 100644 --- a/source/blender/modifiers/intern/MOD_weightvgproximity.c +++ b/source/blender/modifiers/intern/MOD_weightvgproximity.c @@ -507,7 +507,7 @@ ModifierTypeInfo modifierType_WeightVGProximity = { /* structSize */ sizeof(WeightVGProximityModifierData), /* type */ eModifierTypeType_Nonconstructive, /* flags */ eModifierTypeFlag_AcceptsMesh - |eModifierTypeFlag_SupportsMapping +/* |eModifierTypeFlag_SupportsMapping*/ |eModifierTypeFlag_SupportsEditmode, /* copyData */ copyData, From e2c24bac6c56df6a54c37233d43f609f86d868d5 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Mon, 8 Aug 2011 21:12:51 +0000 Subject: [PATCH 053/182] vgroup_modifiers: Now clamping output values to [0.0, 1.0] range (and added min/max mapping values for Prowimity modif). --- .../startup/bl_ui/properties_data_modifier.py | 4 ++++ source/blender/makesdna/DNA_modifier_types.h | 2 ++ source/blender/makesrna/intern/rna_modifier.c | 12 ++++++++++ .../modifiers/intern/MOD_weightvg_util.c | 3 +++ .../modifiers/intern/MOD_weightvgproximity.c | 24 +++++++++++++++++++ 5 files changed, 45 insertions(+) diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py index 6680d118a75..5654ecd6b2c 100644 --- a/release/scripts/startup/bl_ui/properties_data_modifier.py +++ b/release/scripts/startup/bl_ui/properties_data_modifier.py @@ -859,6 +859,10 @@ class DATA_PT_modifiers(ModifierButtonsPanel, bpy.types.Panel): row = layout.row() row.prop(md, "proximity_geometry", expand=True) + row = layout.split() + row.prop(md, "min_dist") + row.prop(md, "max_dist") + # Common mask options… layout.separator() self.weight_vg_mask(layout, ob, md) diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index a693277b786..7f43659d8de 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -921,6 +921,8 @@ typedef struct WeightVGProximityModifierData { int mask_tex_mapping; /* How to map the texture! */ char mask_tex_uvlayer_name[32]; /* Name of the UV layer. */ + float min_dist, max_dist; /* Distances mapping to 0.0/1.0 weights. */ + /* Padding… */ int pad_i2; } WeightVGProximityModifierData; diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index a6ba56cc590..17cf30d390f 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -2781,6 +2781,18 @@ static void rna_def_modifier_weightvgproximity(BlenderRNA *brna) RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK); RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); + prop= RNA_def_property(srna, "min_dist", PROP_FLOAT, PROP_NONE); + RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); + RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0); + RNA_def_property_ui_text(prop, "Lowest Dist", "Distance mapping to weight 0.0."); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop= RNA_def_property(srna, "max_dist", PROP_FLOAT, PROP_NONE); + RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); + RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0); + RNA_def_property_ui_text(prop, "Highest Dist", "Distance mapping to weight 1.0."); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + /* Common masking properties. */ rna_def_modifier_weightvg_mask(brna, srna); } diff --git a/source/blender/modifiers/intern/MOD_weightvg_util.c b/source/blender/modifiers/intern/MOD_weightvg_util.c index 1fe1a96c2e5..43cc3081199 100644 --- a/source/blender/modifiers/intern/MOD_weightvg_util.c +++ b/source/blender/modifiers/intern/MOD_weightvg_util.c @@ -192,6 +192,9 @@ void weightvg_update_vg(MDeformVert *dvert, int defgrp_idx, int num, int *indice MDeformVert *dv = &dvert[indices ? indices[i] : i]; MDeformWeight *newdw; + /* Never allow weights out of [0.0, 1.0] range. */ + CLAMP(w, 0.0, 1.0); + /* Let’s first check to see if this vert is already in the weight group – if so * let’s update it, or remove it if needed. */ diff --git a/source/blender/modifiers/intern/MOD_weightvgproximity.c b/source/blender/modifiers/intern/MOD_weightvgproximity.c index 537c5784d29..7272878b5b5 100644 --- a/source/blender/modifiers/intern/MOD_weightvgproximity.c +++ b/source/blender/modifiers/intern/MOD_weightvgproximity.c @@ -200,6 +200,27 @@ static float get_ob2ob_distance(const Object* ob, const Object* obr) return len_v3v3(ob->obmat[3], obr->obmat[3]); } +/** + * Maps distances to weights. + */ +void do_map(float *weights, const int nidx, const float min_d, const float max_d) +{ + int i; + float b = min_d / (min_d - max_d); + float a = -b / min_d; + for (i = 0; i < nidx; i++) + weights[i] = a * weights[i] + b; +} + +/*a min_d + b = 0.0*/ +/*a max_d + b = 1.0*/ +/*a min_d = -b*/ +/*a = -b / min_d*/ + +/*max_d(-b/min_d) + b = 1.0*/ +/*b((-max_d/min_d)+1.0) = 1.0*/ +/*b = 1.0 / ((min_d-max_d)/min_d)*/ +/*b = min_d/(min_d-max_d)*/ /************************************** * Modifiers functions. * **************************************/ @@ -476,6 +497,9 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der wmd->mask_defgrp_name, wmd->mask_texture, wmd->mask_tex_use_channel, wmd->mask_tex_mapping, wmd->mask_tex_map_obj, wmd->mask_tex_uvlayer_name); + /* Map distances to weights. */ + do_map(org_w, numIdx, wmd->min_dist, wmd->max_dist); + /* Update vgroup. Note we never add nor remove vertices from vgroup here. */ weightvg_update_vg(dvert, defgrp_idx, numIdx, indices, org_w, 0, 0.0f, 0, 0.0f); From 58af2c36aca4e2092e699dead2bd2ea2347b5622 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Wed, 17 Aug 2011 13:07:51 +0000 Subject: [PATCH 054/182] vgroup_modifiers: Removed (commented out, for now) addtionnal mapping/clamping options in WeightVGEdit mod, leaving the only curve mapping stuff. Also, updated all three modifiers with new foreachTexLink walking func. --- .../startup/bl_ui/properties_data_modifier.py | 36 ++++---- source/blender/makesdna/DNA_modifier_types.h | 12 +-- source/blender/makesrna/intern/rna_modifier.c | 92 +++++++++---------- .../modifiers/intern/MOD_weightvgedit.c | 52 ++++++----- .../modifiers/intern/MOD_weightvgmix.c | 6 ++ .../modifiers/intern/MOD_weightvgproximity.c | 6 ++ 6 files changed, 112 insertions(+), 92 deletions(-) diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py index 30600d5534c..6370cc8942a 100644 --- a/release/scripts/startup/bl_ui/properties_data_modifier.py +++ b/release/scripts/startup/bl_ui/properties_data_modifier.py @@ -779,31 +779,31 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel): col.label(text="Default Weight:") col.prop(md, "default_weight", text="") - layout.prop(md, "use_map") - if md.use_map: - split = layout.split() - col = split.column() - col.label("Input:") - col.label("Output:") - col = split.column() - col.prop(md, "map_input_low", text="Min") - col.prop(md, "map_output_low", text="Min") - col = split.column() - col.prop(md, "map_input_high", text="Max") - col.prop(md, "map_output_high", text="Max") +# layout.prop(md, "use_map") +# if md.use_map: +# split = layout.split() +# col = split.column() +# col.label("Input:") +# col.label("Output:") +# col = split.column() +# col.prop(md, "map_input_low", text="Min") +# col.prop(md, "map_output_low", text="Min") +# col = split.column() +# col.prop(md, "map_input_high", text="Max") +# col.prop(md, "map_output_high", text="Max") layout.prop(md, "use_map_curve") if md.use_map_curve: col = layout.column() col.template_curve_mapping(md, "map_curve") - layout.prop(md, "use_reverse") +# layout.prop(md, "use_reverse") - layout.prop(md, "use_clamp") - if md.use_clamp: - row = layout.row() - row.prop(md, "clamp_weight_min") - row.prop(md, "clamp_weight_max") +# layout.prop(md, "use_clamp") +# if md.use_clamp: +# row = layout.row() +# row.prop(md, "clamp_weight_min") +# row.prop(md, "clamp_weight_max") row = layout.row() row.prop(md, "use_add") diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index 9411d3370ba..61db9230b66 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -803,15 +803,15 @@ typedef struct WeightVGEditModifierData { float default_weight; /* Weight for vertices not in vgroup. */ /* Mapping stuff. */ - float map_org_min, map_org_max; - float map_new_min, map_new_max; + float map_org_min, map_org_max; /* Deprecated, keeping for file compatibility for now... */ + float map_new_min, map_new_max; /* Deprecated, keeping for file compatibility for now... */ struct CurveMapping *cmap_curve; /* The custom mapping curve! */ /* The add/remove vertices weight thresholds. */ float add_threshold, rem_threshold; /* Clamping options. */ - float clamp_weight_min, clamp_weight_max; + float clamp_weight_min, clamp_weight_max; /* Deprecated, keeping for file compatibility for now... */ /* Masking options. */ float mask_constant; /* The global “influence”, if no vgroup nor tex is used as mask. */ @@ -832,17 +832,17 @@ typedef struct WeightVGEditModifierData { /* WeightVGEdit flags. */ /* Use parametric mapping. */ -#define MOD_WVG_EDIT_MAP (1 << 0) +//#define MOD_WVG_EDIT_MAP (1 << 0) /* Use curve mapping. */ #define MOD_WVG_EDIT_CMAP (1 << 1) /* Reverse weights (in the [0.0, 1.0] standard range). */ -#define MOD_WVG_EDIT_REVERSE_WEIGHTS (1 << 2) +//#define MOD_WVG_EDIT_REVERSE_WEIGHTS (1 << 2) /* Add vertices with higher weight than threshold to vgroup. */ #define MOD_WVG_EDIT_ADD2VG (1 << 3) /* Remove vertices with lower weight than threshold from vgroup. */ #define MOD_WVG_EDIT_REMFVG (1 << 4) /* Clamp weights. */ -#define MOD_WVG_EDIT_CLAMP (1 << 5) +//#define MOD_WVG_EDIT_CLAMP (1 << 5) typedef struct WeightVGMixModifierData { ModifierData modifier; diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index 6294f149b68..533baf98915 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -2565,20 +2565,20 @@ static void rna_def_modifier_weightvgedit(BlenderRNA *brna) RNA_def_property_string_funcs(prop, NULL, NULL, "rna_WeightVGModifier_vgroup_set"); RNA_def_property_update(prop, 0, "rna_Modifier_update"); - prop= RNA_def_property(srna, "use_map", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "edit_flags", MOD_WVG_EDIT_MAP); - RNA_def_property_ui_text(prop, "Map", "Map vertex group weights."); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); +/* prop= RNA_def_property(srna, "use_map", PROP_BOOLEAN, PROP_NONE);*/ +/* RNA_def_property_boolean_sdna(prop, NULL, "edit_flags", MOD_WVG_EDIT_MAP);*/ +/* RNA_def_property_ui_text(prop, "Map", "Map vertex group weights.");*/ +/* RNA_def_property_update(prop, 0, "rna_Modifier_update");*/ prop= RNA_def_property(srna, "use_map_curve", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "edit_flags", MOD_WVG_EDIT_CMAP); RNA_def_property_ui_text(prop, "Curve Map", "Map vertex group weights with a curve."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); - prop= RNA_def_property(srna, "use_reverse", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "edit_flags", MOD_WVG_EDIT_REVERSE_WEIGHTS); - RNA_def_property_ui_text(prop, "Reverse", "Reverse vertex group weights."); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); +/* prop= RNA_def_property(srna, "use_reverse", PROP_BOOLEAN, PROP_NONE);*/ +/* RNA_def_property_boolean_sdna(prop, NULL, "edit_flags", MOD_WVG_EDIT_REVERSE_WEIGHTS);*/ +/* RNA_def_property_ui_text(prop, "Reverse", "Reverse vertex group weights.");*/ +/* RNA_def_property_update(prop, 0, "rna_Modifier_update");*/ prop= RNA_def_property(srna, "use_add", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "edit_flags", MOD_WVG_EDIT_ADD2VG); @@ -2592,10 +2592,10 @@ static void rna_def_modifier_weightvgedit(BlenderRNA *brna) "from vgroup."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); - prop= RNA_def_property(srna, "use_clamp", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "edit_flags", MOD_WVG_EDIT_CLAMP); - RNA_def_property_ui_text(prop, "Clamp", "Clamp vertex group weights."); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); +/* prop= RNA_def_property(srna, "use_clamp", PROP_BOOLEAN, PROP_NONE);*/ +/* RNA_def_property_boolean_sdna(prop, NULL, "edit_flags", MOD_WVG_EDIT_CLAMP);*/ +/* RNA_def_property_ui_text(prop, "Clamp", "Clamp vertex group weights.");*/ +/* RNA_def_property_update(prop, 0, "rna_Modifier_update");*/ prop= RNA_def_property(srna, "default_weight", PROP_FLOAT, PROP_NONE); RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); @@ -2604,33 +2604,33 @@ static void rna_def_modifier_weightvgedit(BlenderRNA *brna) "it is not in the vgroup."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); - prop= RNA_def_property(srna, "map_input_low", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "map_org_min"); - RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); - RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0); - RNA_def_property_ui_text(prop, "Input Low Weight", "Low input mapping value."); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); +/* prop= RNA_def_property(srna, "map_input_low", PROP_FLOAT, PROP_NONE);*/ +/* RNA_def_property_float_sdna(prop, NULL, "map_org_min");*/ +/* RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);*/ +/* RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0);*/ +/* RNA_def_property_ui_text(prop, "Input Low Weight", "Low input mapping value.");*/ +/* RNA_def_property_update(prop, 0, "rna_Modifier_update");*/ - prop= RNA_def_property(srna, "map_input_high", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "map_org_max"); - RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); - RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0); - RNA_def_property_ui_text(prop, "Input High Weight", "High input mapping value."); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); +/* prop= RNA_def_property(srna, "map_input_high", PROP_FLOAT, PROP_NONE);*/ +/* RNA_def_property_float_sdna(prop, NULL, "map_org_max");*/ +/* RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);*/ +/* RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0);*/ +/* RNA_def_property_ui_text(prop, "Input High Weight", "High input mapping value.");*/ +/* RNA_def_property_update(prop, 0, "rna_Modifier_update");*/ - prop= RNA_def_property(srna, "map_output_low", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "map_new_min"); - RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); - RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0); - RNA_def_property_ui_text(prop, "Output Low Weight", "Low output mapping value."); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); +/* prop= RNA_def_property(srna, "map_output_low", PROP_FLOAT, PROP_NONE);*/ +/* RNA_def_property_float_sdna(prop, NULL, "map_new_min");*/ +/* RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);*/ +/* RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0);*/ +/* RNA_def_property_ui_text(prop, "Output Low Weight", "Low output mapping value.");*/ +/* RNA_def_property_update(prop, 0, "rna_Modifier_update");*/ - prop= RNA_def_property(srna, "map_output_high", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "map_new_max"); - RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); - RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0); - RNA_def_property_ui_text(prop, "Output High Weight", "High output mapping value."); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); +/* prop= RNA_def_property(srna, "map_output_high", PROP_FLOAT, PROP_NONE);*/ +/* RNA_def_property_float_sdna(prop, NULL, "map_new_max");*/ +/* RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);*/ +/* RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0);*/ +/* RNA_def_property_ui_text(prop, "Output High Weight", "High output mapping value.");*/ +/* RNA_def_property_update(prop, 0, "rna_Modifier_update");*/ prop= RNA_def_property(srna, "map_curve", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "cmap_curve"); @@ -2653,17 +2653,17 @@ static void rna_def_modifier_weightvgedit(BlenderRNA *brna) "to be removed from the vgroup."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); - prop= RNA_def_property(srna, "clamp_weight_min", PROP_FLOAT, PROP_NONE); - RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); - RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0); - RNA_def_property_ui_text(prop, "Min Weight", "Lowest weight a vertex can get."); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); +/* prop= RNA_def_property(srna, "clamp_weight_min", PROP_FLOAT, PROP_NONE);*/ +/* RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);*/ +/* RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0);*/ +/* RNA_def_property_ui_text(prop, "Min Weight", "Lowest weight a vertex can get.");*/ +/* RNA_def_property_update(prop, 0, "rna_Modifier_update");*/ - prop= RNA_def_property(srna, "clamp_weight_max", PROP_FLOAT, PROP_NONE); - RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); - RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0); - RNA_def_property_ui_text(prop, "Max Weight", "Highest weight a vertex can get."); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); +/* prop= RNA_def_property(srna, "clamp_weight_max", PROP_FLOAT, PROP_NONE);*/ +/* RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);*/ +/* RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0);*/ +/* RNA_def_property_ui_text(prop, "Max Weight", "Highest weight a vertex can get.");*/ +/* RNA_def_property_update(prop, 0, "rna_Modifier_update");*/ /* Common masking properties. */ rna_def_modifier_weightvg_mask(brna, srna); diff --git a/source/blender/modifiers/intern/MOD_weightvgedit.c b/source/blender/modifiers/intern/MOD_weightvgedit.c index 57c93cdfddf..a8d51cee092 100644 --- a/source/blender/modifiers/intern/MOD_weightvgedit.c +++ b/source/blender/modifiers/intern/MOD_weightvgedit.c @@ -61,18 +61,18 @@ static void initData(ModifierData *md) { WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md; - wmd->edit_flags = MOD_WVG_EDIT_CLAMP; + wmd->edit_flags = 0; wmd->default_weight = 0.0f; - wmd->map_org_min = 0.0f; - wmd->map_org_max = 1.0f; - wmd->map_new_min = 0.0f; - wmd->map_new_max = 1.0f; +/* wmd->map_org_min = 0.0f;*/ +/* wmd->map_org_max = 1.0f;*/ +/* wmd->map_new_min = 0.0f;*/ +/* wmd->map_new_max = 1.0f;*/ wmd->cmap_curve = curvemapping_add(1, 0.0, 0.0, 1.0, 1.0); curvemapping_initialize(wmd->cmap_curve); - wmd->clamp_weight_min = 0.0f; - wmd->clamp_weight_max = 1.0f; +/* wmd->clamp_weight_min = 0.0f;*/ +/* wmd->clamp_weight_max = 1.0f;*/ wmd->add_threshold = 0.01f; wmd->rem_threshold = 0.01f; @@ -98,14 +98,14 @@ static void copyData(ModifierData *md, ModifierData *target) twmd->edit_flags = wmd->edit_flags; twmd->default_weight = wmd->default_weight; - twmd->map_org_min = wmd->map_org_min; - twmd->map_org_max = wmd->map_org_max; - twmd->map_new_min = wmd->map_new_min; - twmd->map_new_max = wmd->map_new_max; +/* twmd->map_org_min = wmd->map_org_min;*/ +/* twmd->map_org_max = wmd->map_org_max;*/ +/* twmd->map_new_min = wmd->map_new_min;*/ +/* twmd->map_new_max = wmd->map_new_max;*/ twmd->cmap_curve = curvemapping_copy(wmd->cmap_curve); - twmd->clamp_weight_min = wmd->clamp_weight_min; - twmd->clamp_weight_max = wmd->clamp_weight_max; +/* twmd->clamp_weight_min = wmd->clamp_weight_min;*/ +/* twmd->clamp_weight_max = wmd->clamp_weight_max;*/ twmd->add_threshold = wmd->add_threshold; twmd->rem_threshold = wmd->rem_threshold; @@ -161,6 +161,11 @@ static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *u foreachObjectLink(md, ob, (ObjectWalkFunc)walk, userData); } +static void foreachTexLink(ModifierData *md, Object *ob, TexWalkFunc walk, void *userData) +{ + walk(userData, ob, md, "mask_texture"); +} + static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *UNUSED(scene), Object *UNUSED(ob), DagNode *obNode) { @@ -203,12 +208,12 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der char rel_ret = 0; /* Boolean, whether we have to release ret dm or not, when not using it! */ float *mapf = NULL; /* Cache for mapping factors. */ /* Flags. */ - char do_map = wmd->edit_flags & MOD_WVG_EDIT_MAP; +/* char do_map = wmd->edit_flags & MOD_WVG_EDIT_MAP;*/ char do_cmap = wmd->edit_flags & MOD_WVG_EDIT_CMAP; - char do_rev = wmd->edit_flags & MOD_WVG_EDIT_REVERSE_WEIGHTS; +/* char do_rev = wmd->edit_flags & MOD_WVG_EDIT_REVERSE_WEIGHTS;*/ char do_add = wmd->edit_flags & MOD_WVG_EDIT_ADD2VG; char do_rem = wmd->edit_flags & MOD_WVG_EDIT_REMFVG; - char do_clamp = wmd->edit_flags & MOD_WVG_EDIT_CLAMP; +/* char do_clamp = wmd->edit_flags & MOD_WVG_EDIT_CLAMP;*/ /* Get number of verts. */ numVerts = dm->getNumVerts(dm); @@ -281,6 +286,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der } } /* Do mapping. */ +#if 0 if (do_map) { /* This mapping is a simple func: a*in + b. * with a = (out_min - out_max)/(in_min - in_max) @@ -299,10 +305,11 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der } new_w[i] = (mapf[0] * new_w[i]) + mapf[1]; } +#endif if (do_cmap) new_w[i] = curvemapping_evaluateF(wmd->cmap_curve, 0, new_w[i]); - if (do_rev) - new_w[i] = (-1.0 * new_w[i]) + 1.0; +/* if (do_rev)*/ +/* new_w[i] = (-1.0 * new_w[i]) + 1.0;*/ } /* Do masking. */ @@ -311,10 +318,10 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der wmd->mask_tex_mapping, wmd->mask_tex_map_obj, wmd->mask_tex_uvlayer_name); /* Do clamping. */ - if (do_clamp) { - for (i = 0; i < numVerts; i++) - CLAMP(org_w[i], wmd->clamp_weight_min, wmd->clamp_weight_max); - } +/* if (do_clamp) {*/ +/* for (i = 0; i < numVerts; i++)*/ +/* CLAMP(org_w[i], wmd->clamp_weight_min, wmd->clamp_weight_max);*/ +/* }*/ /* Update/add/remove from vgroup. */ weightvg_update_vg(dvert, defgrp_idx, numVerts, NULL, org_w, do_add, wmd->add_threshold, @@ -365,5 +372,6 @@ ModifierTypeInfo modifierType_WeightVGEdit = { /* dependsOnNormals */ NULL, /* foreachObjectLink */ foreachObjectLink, /* foreachIDLink */ foreachIDLink, + /* foreachTexLink */ foreachTexLink, }; diff --git a/source/blender/modifiers/intern/MOD_weightvgmix.c b/source/blender/modifiers/intern/MOD_weightvgmix.c index 29e00040bf6..8b0e598962e 100644 --- a/source/blender/modifiers/intern/MOD_weightvgmix.c +++ b/source/blender/modifiers/intern/MOD_weightvgmix.c @@ -191,6 +191,11 @@ static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *u foreachObjectLink(md, ob, (ObjectWalkFunc)walk, userData); } +static void foreachTexLink(ModifierData *md, Object *ob, TexWalkFunc walk, void *userData) +{ + walk(userData, ob, md, "mask_texture"); +} + static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *UNUSED(scene), Object *UNUSED(ob), DagNode *obNode) { @@ -457,5 +462,6 @@ ModifierTypeInfo modifierType_WeightVGMix = { /* dependsOnNormals */ NULL, /* foreachObjectLink */ foreachObjectLink, /* foreachIDLink */ foreachIDLink, + /* foreachTexLink */ foreachTexLink, }; diff --git a/source/blender/modifiers/intern/MOD_weightvgproximity.c b/source/blender/modifiers/intern/MOD_weightvgproximity.c index 7272878b5b5..c4f0c2b214c 100644 --- a/source/blender/modifiers/intern/MOD_weightvgproximity.c +++ b/source/blender/modifiers/intern/MOD_weightvgproximity.c @@ -298,6 +298,11 @@ static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *u foreachObjectLink(md, ob, (ObjectWalkFunc)walk, userData); } +static void foreachTexLink(ModifierData *md, Object *ob, TexWalkFunc walk, void *userData) +{ + walk(userData, ob, md, "mask_texture"); +} + static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *UNUSED(scene), Object *UNUSED(ob), DagNode *obNode) { @@ -550,5 +555,6 @@ ModifierTypeInfo modifierType_WeightVGProximity = { /* dependsOnNormals */ NULL, /* foreachObjectLink */ foreachObjectLink, /* foreachIDLink */ foreachIDLink, + /* foreachTexLink */ foreachTexLink, }; From 2dee23fad42616ac149f01bc23126365e3b18995 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Thu, 18 Aug 2011 06:30:59 +0000 Subject: [PATCH 055/182] vgroup_modifiers: Minor update (names...). --- source/blender/makesrna/intern/rna_modifier.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index 533baf98915..390c4ae3e9b 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -68,9 +68,9 @@ EnumPropertyItem modifier_type_items[] ={ {eModifierType_Solidify, "SOLIDIFY", ICON_MOD_SOLIDIFY, "Solidify", ""}, {eModifierType_Subsurf, "SUBSURF", ICON_MOD_SUBSURF, "Subdivision Surface", ""}, {eModifierType_UVProject, "UV_PROJECT", ICON_MOD_UVPROJECT, "UV Project", ""}, - {eModifierType_WeightVGEdit, "WEIGHT_VGEDIT", ICON_MOD_WEIGHTVG, "Edit Vertex Group Weights", ""}, - {eModifierType_WeightVGMix, "WEIGHT_VGMIX", ICON_MOD_WEIGHTVG, "Mix Two Vertex Groups", ""}, - {eModifierType_WeightVGProximity, "WEIGHT_VGPROXIMITY", ICON_MOD_WEIGHTVG, "Weight Vertex Group - Poximity", ""}, + {eModifierType_WeightVGEdit, "WEIGHT_VGEDIT", ICON_MOD_WEIGHTVG, "WeightVG Edit", ""}, + {eModifierType_WeightVGMix, "WEIGHT_VGMIX", ICON_MOD_WEIGHTVG, "WeightVG Mix", ""}, + {eModifierType_WeightVGProximity, "WEIGHT_VGPROXIMITY", ICON_MOD_WEIGHTVG, "WeightVG Proximity", ""}, {0, "", 0, "Deform", ""}, {eModifierType_Armature, "ARMATURE", ICON_MOD_ARMATURE, "Armature", ""}, {eModifierType_Cast, "CAST", ICON_MOD_CAST, "Cast", ""}, @@ -2554,7 +2554,7 @@ static void rna_def_modifier_weightvgedit(BlenderRNA *brna) PropertyRNA *prop; srna= RNA_def_struct(brna, "WeightVGEditModifier", "Modifier"); - RNA_def_struct_ui_text(srna, "Edit Vertex Group Weights Modifier", + RNA_def_struct_ui_text(srna, "WeightVG Edit Modifier", "Edit the weights of vertices in a group."); RNA_def_struct_sdna(srna, "WeightVGEditModifierData"); RNA_def_struct_ui_icon(srna, ICON_MOD_WEIGHTVG); @@ -2693,7 +2693,7 @@ static void rna_def_modifier_weightvgmix(BlenderRNA *brna) PropertyRNA *prop; srna= RNA_def_struct(brna, "WeightVGMixModifier", "Modifier"); - RNA_def_struct_ui_text(srna, "Weight Vertex Group Modifier", + RNA_def_struct_ui_text(srna, "WeightVG Mix Modifier", "Mix the weights of two vertex groups."); RNA_def_struct_sdna(srna, "WeightVGMixModifierData"); RNA_def_struct_ui_icon(srna, ICON_MOD_WEIGHTVG); @@ -2758,7 +2758,7 @@ static void rna_def_modifier_weightvgproximity(BlenderRNA *brna) PropertyRNA *prop; srna= RNA_def_struct(brna, "WeightVGProximityModifier", "Modifier"); - RNA_def_struct_ui_text(srna, "Weight Vertex Group - Proximity Modifier", + RNA_def_struct_ui_text(srna, "WeightVG Proximity Modifier", "Set the weights of vertices in a group from a target object’s " "distance."); RNA_def_struct_sdna(srna, "WeightVGProximityModifierData"); From cd6f93bdc905e811da79df64f8016d5d27b6ad72 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Tue, 23 Aug 2011 12:33:45 +0000 Subject: [PATCH 056/182] vgroup_modifiers: Definitively removed addtionnal mapping/clamping options in WeightVGEdit mod, including from DNA struct. --- source/blender/makesdna/DNA_modifier_types.h | 5 -- .../modifiers/intern/MOD_weightvgedit.c | 55 ++----------------- 2 files changed, 5 insertions(+), 55 deletions(-) diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index 61db9230b66..83b82972cef 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -803,16 +803,11 @@ typedef struct WeightVGEditModifierData { float default_weight; /* Weight for vertices not in vgroup. */ /* Mapping stuff. */ - float map_org_min, map_org_max; /* Deprecated, keeping for file compatibility for now... */ - float map_new_min, map_new_max; /* Deprecated, keeping for file compatibility for now... */ struct CurveMapping *cmap_curve; /* The custom mapping curve! */ /* The add/remove vertices weight thresholds. */ float add_threshold, rem_threshold; - /* Clamping options. */ - float clamp_weight_min, clamp_weight_max; /* Deprecated, keeping for file compatibility for now... */ - /* Masking options. */ float mask_constant; /* The global “influence”, if no vgroup nor tex is used as mask. */ /* Name of mask vertex group from which to get weight factors. */ diff --git a/source/blender/modifiers/intern/MOD_weightvgedit.c b/source/blender/modifiers/intern/MOD_weightvgedit.c index a8d51cee092..a1057bdbbbb 100644 --- a/source/blender/modifiers/intern/MOD_weightvgedit.c +++ b/source/blender/modifiers/intern/MOD_weightvgedit.c @@ -64,18 +64,11 @@ static void initData(ModifierData *md) wmd->edit_flags = 0; wmd->default_weight = 0.0f; -/* wmd->map_org_min = 0.0f;*/ -/* wmd->map_org_max = 1.0f;*/ -/* wmd->map_new_min = 0.0f;*/ -/* wmd->map_new_max = 1.0f;*/ wmd->cmap_curve = curvemapping_add(1, 0.0, 0.0, 1.0, 1.0); curvemapping_initialize(wmd->cmap_curve); -/* wmd->clamp_weight_min = 0.0f;*/ -/* wmd->clamp_weight_max = 1.0f;*/ - - wmd->add_threshold = 0.01f; wmd->rem_threshold = 0.01f; + wmd->add_threshold = 0.01f; wmd->mask_constant = 1.0f; wmd->mask_tex_use_channel = MOD_WVG_MASK_TEX_USE_INT; /* Use intensity by default. */ @@ -98,15 +91,8 @@ static void copyData(ModifierData *md, ModifierData *target) twmd->edit_flags = wmd->edit_flags; twmd->default_weight = wmd->default_weight; -/* twmd->map_org_min = wmd->map_org_min;*/ -/* twmd->map_org_max = wmd->map_org_max;*/ -/* twmd->map_new_min = wmd->map_new_min;*/ -/* twmd->map_new_max = wmd->map_new_max;*/ twmd->cmap_curve = curvemapping_copy(wmd->cmap_curve); -/* twmd->clamp_weight_min = wmd->clamp_weight_min;*/ -/* twmd->clamp_weight_max = wmd->clamp_weight_max;*/ - twmd->add_threshold = wmd->add_threshold; twmd->rem_threshold = wmd->rem_threshold; @@ -208,12 +194,9 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der char rel_ret = 0; /* Boolean, whether we have to release ret dm or not, when not using it! */ float *mapf = NULL; /* Cache for mapping factors. */ /* Flags. */ -/* char do_map = wmd->edit_flags & MOD_WVG_EDIT_MAP;*/ - char do_cmap = wmd->edit_flags & MOD_WVG_EDIT_CMAP; -/* char do_rev = wmd->edit_flags & MOD_WVG_EDIT_REVERSE_WEIGHTS;*/ - char do_add = wmd->edit_flags & MOD_WVG_EDIT_ADD2VG; - char do_rem = wmd->edit_flags & MOD_WVG_EDIT_REMFVG; -/* char do_clamp = wmd->edit_flags & MOD_WVG_EDIT_CLAMP;*/ + char do_map = wmd->edit_flags & MOD_WVG_EDIT_CMAP; + char do_add = wmd->edit_flags & MOD_WVG_EDIT_ADD2VG; + char do_rem = wmd->edit_flags & MOD_WVG_EDIT_REMFVG; /* Get number of verts. */ numVerts = dm->getNumVerts(dm); @@ -286,30 +269,8 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der } } /* Do mapping. */ -#if 0 - if (do_map) { - /* This mapping is a simple func: a*in + b. - * with a = (out_min - out_max)/(in_min - in_max) - * and b = out_max - a*in_max - * Note a and b are cached! - */ - if (mapf == NULL) { - float denom = wmd->map_org_min - wmd->map_org_max; - mapf = MEM_mallocN(sizeof(float) * 2, "WeightVGEdit, mapf"); - if (denom > 0.0 && denom < MOD_WVG_ZEROFLOOR) - denom = MOD_WVG_ZEROFLOOR; - else if (denom < 0.0 && denom > -MOD_WVG_ZEROFLOOR) - denom = -MOD_WVG_ZEROFLOOR; - mapf[0] = (wmd->map_new_min - wmd->map_new_max) / denom; - mapf[1] = wmd->map_new_max - (mapf[0] * wmd->map_org_max); - } - new_w[i] = (mapf[0] * new_w[i]) + mapf[1]; - } -#endif - if (do_cmap) + if (do_map) new_w[i] = curvemapping_evaluateF(wmd->cmap_curve, 0, new_w[i]); -/* if (do_rev)*/ -/* new_w[i] = (-1.0 * new_w[i]) + 1.0;*/ } /* Do masking. */ @@ -317,12 +278,6 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der wmd->mask_defgrp_name, wmd->mask_texture, wmd->mask_tex_use_channel, wmd->mask_tex_mapping, wmd->mask_tex_map_obj, wmd->mask_tex_uvlayer_name); - /* Do clamping. */ -/* if (do_clamp) {*/ -/* for (i = 0; i < numVerts; i++)*/ -/* CLAMP(org_w[i], wmd->clamp_weight_min, wmd->clamp_weight_max);*/ -/* }*/ - /* Update/add/remove from vgroup. */ weightvg_update_vg(dvert, defgrp_idx, numVerts, NULL, org_w, do_add, wmd->add_threshold, do_rem, wmd->rem_threshold); From 1764f2135d3c1780c4ead12fae3eb97ac2de5a7d Mon Sep 17 00:00:00 2001 From: Nathan Letwory Date: Sun, 4 Sep 2011 00:15:59 +0000 Subject: [PATCH 057/182] Some whitespace changes --- source/blender/collada/AnimationExporter.cpp | 1778 +++++++++--------- source/blender/collada/AnimationImporter.cpp | 390 ++-- source/blender/collada/AnimationImporter.h | 10 +- source/blender/collada/ArmatureExporter.cpp | 2 +- source/blender/collada/ArmatureImporter.cpp | 4 +- source/blender/collada/ArmatureImporter.h | 4 +- source/blender/collada/MeshImporter.cpp | 2 +- source/blender/collada/SkinInfo.cpp | 6 +- source/blender/collada/TransformWriter.cpp | 2 +- 9 files changed, 1098 insertions(+), 1100 deletions(-) diff --git a/source/blender/collada/AnimationExporter.cpp b/source/blender/collada/AnimationExporter.cpp index 8a0a39da558..4c20d1cf6c1 100644 --- a/source/blender/collada/AnimationExporter.cpp +++ b/source/blender/collada/AnimationExporter.cpp @@ -1,26 +1,26 @@ /* - * $Id$ - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed. - * - * ***** END GPL LICENSE BLOCK ***** - */ +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +* Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed. +* +* ***** END GPL LICENSE BLOCK ***** +*/ #include "GeometryExporter.h" #include "AnimationExporter.h" @@ -30,10 +30,10 @@ template void forEachObjectInScene(Scene *sce, Functor &f) { Base *base= (Base*) sce->base.first; - + while(base) { Object *ob = base->object; - + f(ob); base= base->next; @@ -61,7 +61,7 @@ void AnimationExporter::operator() (Object *ob) bool isMatAnim = false; //Export transform animations - if(ob->adt && ob->adt->action) + if(ob->adt && ob->adt->action) { fcu = (FCurve*)ob->adt->action->curves.first; @@ -72,21 +72,21 @@ void AnimationExporter::operator() (Object *ob) for (Bone *bone = (Bone*)arm->bonebase.first; bone; bone = bone->next) write_bone_animation_matrix(ob, bone); } - + while (fcu) { //for armature animations as objects if ( ob->type == OB_ARMATURE ) transformName = fcu->rna_path; else transformName = extract_transform_name( fcu->rna_path ); - + if ((!strcmp(transformName, "location") || !strcmp(transformName, "scale")) || (!strcmp(transformName, "rotation_euler") && ob->rotmode == ROT_MODE_EUL)|| (!strcmp(transformName, "rotation_quaternion"))) dae_animation(ob ,fcu, transformName, false); fcu = fcu->next; } - + } //Export Lamp parameter animations @@ -94,8 +94,8 @@ void AnimationExporter::operator() (Object *ob) { fcu = (FCurve*)(((Lamp*)ob ->data)->adt->action->curves.first); while (fcu) { - transformName = extract_transform_name( fcu->rna_path ); - + transformName = extract_transform_name( fcu->rna_path ); + if ((!strcmp(transformName, "color")) || (!strcmp(transformName, "spot_size"))|| (!strcmp(transformName, "spot_blend"))|| (!strcmp(transformName, "distance")) ) dae_animation(ob , fcu, transformName, true ); @@ -108,8 +108,8 @@ void AnimationExporter::operator() (Object *ob) { fcu = (FCurve*)(((Camera*)ob ->data)->adt->action->curves.first); while (fcu) { - transformName = extract_transform_name( fcu->rna_path ); - + transformName = extract_transform_name( fcu->rna_path ); + if ((!strcmp(transformName, "lens"))|| (!strcmp(transformName, "ortho_scale"))|| (!strcmp(transformName, "clip_end"))||(!strcmp(transformName, "clip_start"))) @@ -129,7 +129,7 @@ void AnimationExporter::operator() (Object *ob) fcu = (FCurve*)ma->adt->action->curves.first; while (fcu) { transformName = extract_transform_name( fcu->rna_path ); - + if ((!strcmp(transformName, "specular_hardness"))||(!strcmp(transformName, "specular_color")) ||(!strcmp(transformName, "diffuse_color"))||(!strcmp(transformName, "alpha"))|| (!strcmp(transformName, "ior"))) @@ -137,384 +137,384 @@ void AnimationExporter::operator() (Object *ob) fcu = fcu->next; } } - + } } - //euler sources from quternion sources - float * AnimationExporter::get_eul_source_for_quat(Object *ob ) +//euler sources from quternion sources +float * AnimationExporter::get_eul_source_for_quat(Object *ob ) +{ + FCurve *fcu = (FCurve*)ob->adt->action->curves.first; + const int keys = fcu->totvert; + float *quat = (float*)MEM_callocN(sizeof(float) * fcu->totvert * 4, "quat output source values"); + float *eul = (float*)MEM_callocN(sizeof(float) * fcu->totvert * 3, "quat output source values"); + float temp_quat[4]; + float temp_eul[3]; + while(fcu) { - FCurve *fcu = (FCurve*)ob->adt->action->curves.first; - const int keys = fcu->totvert; - float *quat = (float*)MEM_callocN(sizeof(float) * fcu->totvert * 4, "quat output source values"); - float *eul = (float*)MEM_callocN(sizeof(float) * fcu->totvert * 3, "quat output source values"); - float temp_quat[4]; - float temp_eul[3]; - while(fcu) - { - char * transformName = extract_transform_name( fcu->rna_path ); - - if( !strcmp(transformName, "rotation_quaternion") ) { - for ( int i = 0 ; i < fcu->totvert ; i++){ - *(quat + ( i * 4 ) + fcu->array_index) = fcu->bezt[i].vec[1][1]; - } - } - fcu = fcu->next; + char * transformName = extract_transform_name( fcu->rna_path ); + + if( !strcmp(transformName, "rotation_quaternion") ) { + for ( int i = 0 ; i < fcu->totvert ; i++){ + *(quat + ( i * 4 ) + fcu->array_index) = fcu->bezt[i].vec[1][1]; } - - for ( int i = 0 ; i < keys ; i++){ - for ( int j = 0;j<4;j++) - temp_quat[j] = quat[(i*4)+j]; - - quat_to_eul(temp_eul,temp_quat); - - for (int k = 0;k<3;k++) - eul[i*3 + k] = temp_eul[k]; - - } - MEM_freeN(quat); - return eul; - - } - - //Get proper name for bones - std::string AnimationExporter::getObjectBoneName( Object* ob,const FCurve* fcu ) - { - //hard-way to derive the bone name from rna_path. Must find more compact method - std::string rna_path = std::string(fcu->rna_path); - - char* boneName = strtok((char *)rna_path.c_str(), "\""); - boneName = strtok(NULL,"\""); - - if( boneName != NULL ) - return /*id_name(ob) + "_" +*/ std::string(boneName); - else - return id_name(ob); - } - - //convert f-curves to animation curves and write - void AnimationExporter::dae_animation(Object* ob, FCurve *fcu, char* transformName , bool is_param, Material * ma ) - { - const char *axis_name = NULL; - char anim_id[200]; - - bool has_tangents = false; - bool quatRotation = false; - - if ( !strcmp(transformName, "rotation_quaternion") ) - { - fprintf(stderr, "quaternion rotation curves are not supported. rotation curve will not be exported\n"); - quatRotation = true; - return; } - - //axis names for colors - else if ( !strcmp(transformName, "color")||!strcmp(transformName, "specular_color")||!strcmp(transformName, "diffuse_color")|| - (!strcmp(transformName, "alpha"))) - { - const char *axis_names[] = {"R", "G", "B"}; - if (fcu->array_index < 3) + fcu = fcu->next; + } + + for ( int i = 0 ; i < keys ; i++){ + for ( int j = 0;j<4;j++) + temp_quat[j] = quat[(i*4)+j]; + + quat_to_eul(temp_eul,temp_quat); + + for (int k = 0;k<3;k++) + eul[i*3 + k] = temp_eul[k]; + + } + MEM_freeN(quat); + return eul; + +} + +//Get proper name for bones +std::string AnimationExporter::getObjectBoneName( Object* ob,const FCurve* fcu ) +{ + //hard-way to derive the bone name from rna_path. Must find more compact method + std::string rna_path = std::string(fcu->rna_path); + + char* boneName = strtok((char *)rna_path.c_str(), "\""); + boneName = strtok(NULL,"\""); + + if( boneName != NULL ) + return /*id_name(ob) + "_" +*/ std::string(boneName); + else + return id_name(ob); +} + +//convert f-curves to animation curves and write +void AnimationExporter::dae_animation(Object* ob, FCurve *fcu, char* transformName , bool is_param, Material * ma ) +{ + const char *axis_name = NULL; + char anim_id[200]; + + bool has_tangents = false; + bool quatRotation = false; + + if ( !strcmp(transformName, "rotation_quaternion") ) + { + fprintf(stderr, "quaternion rotation curves are not supported. rotation curve will not be exported\n"); + quatRotation = true; + return; + } + + //axis names for colors + else if ( !strcmp(transformName, "color")||!strcmp(transformName, "specular_color")||!strcmp(transformName, "diffuse_color")|| + (!strcmp(transformName, "alpha"))) + { + const char *axis_names[] = {"R", "G", "B"}; + if (fcu->array_index < 3) axis_name = axis_names[fcu->array_index]; - } - - //axis names for transforms - else if ((!strcmp(transformName, "location") || !strcmp(transformName, "scale")) || - (!strcmp(transformName, "rotation_euler"))||(!strcmp(transformName, "rotation_quaternion"))) - { - const char *axis_names[] = {"X", "Y", "Z"}; - if (fcu->array_index < 3) - axis_name = axis_names[fcu->array_index]; - } - - //no axis name. single parameter. - else{ - axis_name = ""; - } - - std::string ob_name = std::string("null"); - - //Create anim Id - if (ob->type == OB_ARMATURE) - { - ob_name = getObjectBoneName( ob , fcu); - BLI_snprintf(anim_id, sizeof(anim_id), "%s_%s.%s", (char*)translate_id(ob_name).c_str(), - transformName, axis_name); - } - else - { - if (ma) - ob_name = id_name(ob) + "_material"; - else - ob_name = id_name(ob); - BLI_snprintf(anim_id, sizeof(anim_id), "%s_%s_%s", (char*)translate_id(ob_name).c_str(), - fcu->rna_path, axis_name); - } - - openAnimation(anim_id, COLLADABU::Utils::EMPTY_STRING); - - // create input source - std::string input_id = create_source_from_fcurve(COLLADASW::InputSemantic::INPUT, fcu, anim_id, axis_name); - - // create output source - std::string output_id ; - - //quat rotations are skipped for now, because of complications with determining axis. - if(quatRotation) - { - float * eul = get_eul_source_for_quat(ob); - float * eul_axis = (float*)MEM_callocN(sizeof(float) * fcu->totvert, "quat output source values"); - for ( int i = 0 ; i< fcu->totvert ; i++) - eul_axis[i] = eul[i*3 + fcu->array_index]; - output_id= create_source_from_array(COLLADASW::InputSemantic::OUTPUT, eul_axis , fcu->totvert, quatRotation, anim_id, axis_name); - MEM_freeN(eul); - MEM_freeN(eul_axis); - } - else - { - output_id= create_source_from_fcurve(COLLADASW::InputSemantic::OUTPUT, fcu, anim_id, axis_name); - } - // create interpolations source - std::string interpolation_id = create_interpolation_source(fcu, anim_id, axis_name, &has_tangents); - - // handle tangents (if required) - std::string intangent_id; - std::string outtangent_id; - - if (has_tangents) { - // create in_tangent source - intangent_id = create_source_from_fcurve(COLLADASW::InputSemantic::IN_TANGENT, fcu, anim_id, axis_name); - - // create out_tangent source - outtangent_id = create_source_from_fcurve(COLLADASW::InputSemantic::OUT_TANGENT, fcu, anim_id, axis_name); - } - - std::string sampler_id = std::string(anim_id) + SAMPLER_ID_SUFFIX; - COLLADASW::LibraryAnimations::Sampler sampler(sw, sampler_id); - std::string empty; - sampler.addInput(COLLADASW::InputSemantic::INPUT, COLLADABU::URI(empty, input_id)); - sampler.addInput(COLLADASW::InputSemantic::OUTPUT, COLLADABU::URI(empty, output_id)); - - // this input is required - sampler.addInput(COLLADASW::InputSemantic::INTERPOLATION, COLLADABU::URI(empty, interpolation_id)); - - if (has_tangents) { - sampler.addInput(COLLADASW::InputSemantic::IN_TANGENT, COLLADABU::URI(empty, intangent_id)); - sampler.addInput(COLLADASW::InputSemantic::OUT_TANGENT, COLLADABU::URI(empty, outtangent_id)); - } - - addSampler(sampler); - - std::string target ; - - if ( !is_param ) - target = translate_id(ob_name) - + "/" + get_transform_sid(fcu->rna_path, -1, axis_name, true); - else - { - if ( ob->type == OB_LAMP ) - target = get_light_id(ob) - + "/" + get_light_param_sid(fcu->rna_path, -1, axis_name, true); - - if ( ob->type == OB_CAMERA ) - target = get_camera_id(ob) - + "/" + get_camera_param_sid(fcu->rna_path, -1, axis_name, true); - - if( ma ) - target = translate_id(id_name(ma)) + "-effect" - +"/common/" /*profile common is only supported */ + get_transform_sid(fcu->rna_path, -1, axis_name, true); - } - addChannel(COLLADABU::URI(empty, sampler_id), target); - - closeAnimation(); } - - - //write bone animations in transform matrix sources - void AnimationExporter::write_bone_animation_matrix(Object *ob_arm, Bone *bone) + //axis names for transforms + else if ((!strcmp(transformName, "location") || !strcmp(transformName, "scale")) || + (!strcmp(transformName, "rotation_euler"))||(!strcmp(transformName, "rotation_quaternion"))) { - if (!ob_arm->adt) - return; - - //This will only export animations of bones in deform group. - /*if(!is_bone_deform_group(bone)) - return;*/ - - sample_and_write_bone_animation_matrix(ob_arm, bone); - - for (Bone *child = (Bone*)bone->childbase.first; child; child = child->next) - write_bone_animation_matrix(ob_arm, child); + const char *axis_names[] = {"X", "Y", "Z"}; + if (fcu->array_index < 3) + axis_name = axis_names[fcu->array_index]; } - bool AnimationExporter::is_bone_deform_group(Bone * bone) + //no axis name. single parameter. + else{ + axis_name = ""; + } + + std::string ob_name = std::string("null"); + + //Create anim Id + if (ob->type == OB_ARMATURE) { - bool is_def; - //Check if current bone is deform - if((bone->flag & BONE_NO_DEFORM) == 0 ) return true; - //Check child bones - else - { - for (Bone *child = (Bone*)bone->childbase.first; child; child = child->next){ - //loop through all the children until deform bone is found, and then return - is_def = is_bone_deform_group(child); - if (is_def) return true; - } - } - //no deform bone found in children also - return false; + ob_name = getObjectBoneName( ob , fcu); + BLI_snprintf(anim_id, sizeof(anim_id), "%s_%s.%s", (char*)translate_id(ob_name).c_str(), + transformName, axis_name); + } + else + { + if (ma) + ob_name = id_name(ob) + "_material"; + else + ob_name = id_name(ob); + BLI_snprintf(anim_id, sizeof(anim_id), "%s_%s_%s", (char*)translate_id(ob_name).c_str(), + fcu->rna_path, axis_name); } - void AnimationExporter::sample_and_write_bone_animation_matrix(Object *ob_arm, Bone *bone) + openAnimation(anim_id, COLLADABU::Utils::EMPTY_STRING); + + // create input source + std::string input_id = create_source_from_fcurve(COLLADASW::InputSemantic::INPUT, fcu, anim_id, axis_name); + + // create output source + std::string output_id ; + + //quat rotations are skipped for now, because of complications with determining axis. + if(quatRotation) { - bArmature *arm = (bArmature*)ob_arm->data; - int flag = arm->flag; - std::vector fra; - //char prefix[256]; + float * eul = get_eul_source_for_quat(ob); + float * eul_axis = (float*)MEM_callocN(sizeof(float) * fcu->totvert, "quat output source values"); + for ( int i = 0 ; i< fcu->totvert ; i++) + eul_axis[i] = eul[i*3 + fcu->array_index]; + output_id= create_source_from_array(COLLADASW::InputSemantic::OUTPUT, eul_axis , fcu->totvert, quatRotation, anim_id, axis_name); + MEM_freeN(eul); + MEM_freeN(eul_axis); + } + else + { + output_id= create_source_from_fcurve(COLLADASW::InputSemantic::OUTPUT, fcu, anim_id, axis_name); + } + // create interpolations source + std::string interpolation_id = create_interpolation_source(fcu, anim_id, axis_name, &has_tangents); - FCurve* fcu = (FCurve*)ob_arm->adt->action->curves.first; - while(fcu) - { - std::string bone_name = getObjectBoneName(ob_arm,fcu); - int val = BLI_strcasecmp((char*)bone_name.c_str(),bone->name); - if(val==0) break; - fcu = fcu->next; + // handle tangents (if required) + std::string intangent_id; + std::string outtangent_id; + + if (has_tangents) { + // create in_tangent source + intangent_id = create_source_from_fcurve(COLLADASW::InputSemantic::IN_TANGENT, fcu, anim_id, axis_name); + + // create out_tangent source + outtangent_id = create_source_from_fcurve(COLLADASW::InputSemantic::OUT_TANGENT, fcu, anim_id, axis_name); + } + + std::string sampler_id = std::string(anim_id) + SAMPLER_ID_SUFFIX; + COLLADASW::LibraryAnimations::Sampler sampler(sw, sampler_id); + std::string empty; + sampler.addInput(COLLADASW::InputSemantic::INPUT, COLLADABU::URI(empty, input_id)); + sampler.addInput(COLLADASW::InputSemantic::OUTPUT, COLLADABU::URI(empty, output_id)); + + // this input is required + sampler.addInput(COLLADASW::InputSemantic::INTERPOLATION, COLLADABU::URI(empty, interpolation_id)); + + if (has_tangents) { + sampler.addInput(COLLADASW::InputSemantic::IN_TANGENT, COLLADABU::URI(empty, intangent_id)); + sampler.addInput(COLLADASW::InputSemantic::OUT_TANGENT, COLLADABU::URI(empty, outtangent_id)); + } + + addSampler(sampler); + + std::string target ; + + if ( !is_param ) + target = translate_id(ob_name) + + "/" + get_transform_sid(fcu->rna_path, -1, axis_name, true); + else + { + if ( ob->type == OB_LAMP ) + target = get_light_id(ob) + + "/" + get_light_param_sid(fcu->rna_path, -1, axis_name, true); + + if ( ob->type == OB_CAMERA ) + target = get_camera_id(ob) + + "/" + get_camera_param_sid(fcu->rna_path, -1, axis_name, true); + + if( ma ) + target = translate_id(id_name(ma)) + "-effect" + +"/common/" /*profile common is only supported */ + get_transform_sid(fcu->rna_path, -1, axis_name, true); + } + addChannel(COLLADABU::URI(empty, sampler_id), target); + + closeAnimation(); +} + + + +//write bone animations in transform matrix sources +void AnimationExporter::write_bone_animation_matrix(Object *ob_arm, Bone *bone) +{ + if (!ob_arm->adt) + return; + + //This will only export animations of bones in deform group. + /*if(!is_bone_deform_group(bone)) + return;*/ + + sample_and_write_bone_animation_matrix(ob_arm, bone); + + for (Bone *child = (Bone*)bone->childbase.first; child; child = child->next) + write_bone_animation_matrix(ob_arm, child); +} + +bool AnimationExporter::is_bone_deform_group(Bone * bone) +{ + bool is_def; + //Check if current bone is deform + if((bone->flag & BONE_NO_DEFORM) == 0 ) return true; + //Check child bones + else + { + for (Bone *child = (Bone*)bone->childbase.first; child; child = child->next){ + //loop through all the children until deform bone is found, and then return + is_def = is_bone_deform_group(child); + if (is_def) return true; } + } + //no deform bone found in children also + return false; +} - if(!(fcu)) return; - bPoseChannel *pchan = get_pose_channel(ob_arm->pose, bone->name); - if (!pchan) - return; - - find_frames(ob_arm, fra); +void AnimationExporter::sample_and_write_bone_animation_matrix(Object *ob_arm, Bone *bone) +{ + bArmature *arm = (bArmature*)ob_arm->data; + int flag = arm->flag; + std::vector fra; + //char prefix[256]; - if (flag & ARM_RESTPOS) { - arm->flag &= ~ARM_RESTPOS; - where_is_pose(scene, ob_arm); - } + FCurve* fcu = (FCurve*)ob_arm->adt->action->curves.first; + while(fcu) + { + std::string bone_name = getObjectBoneName(ob_arm,fcu); + int val = BLI_strcasecmp((char*)bone_name.c_str(),bone->name); + if(val==0) break; + fcu = fcu->next; + } - if (fra.size()) { - dae_baked_animation(fra ,ob_arm, bone ); - } + if(!(fcu)) return; + bPoseChannel *pchan = get_pose_channel(ob_arm->pose, bone->name); + if (!pchan) + return; - if (flag & ARM_RESTPOS) - arm->flag = flag; + find_frames(ob_arm, fra); + + if (flag & ARM_RESTPOS) { + arm->flag &= ~ARM_RESTPOS; where_is_pose(scene, ob_arm); } - void AnimationExporter::dae_baked_animation(std::vector &fra, Object *ob_arm , Bone *bone) - { - std::string ob_name = id_name(ob_arm); - std::string bone_name = bone->name; - char anim_id[200]; - - if (!fra.size()) - return; - - BLI_snprintf(anim_id, sizeof(anim_id), "%s_%s_%s", (char*)translate_id(ob_name).c_str(), - (char*)translate_id(bone_name).c_str(), "pose_matrix"); - - openAnimation(anim_id, COLLADABU::Utils::EMPTY_STRING); - - // create input source - std::string input_id = create_source_from_vector(COLLADASW::InputSemantic::INPUT, fra, false, anim_id, ""); - - // create output source - std::string output_id; - output_id = create_4x4_source( fra, ob_arm , bone , anim_id); - - // create interpolations source - std::string interpolation_id = fake_interpolation_source(fra.size(), anim_id, ""); - - std::string sampler_id = std::string(anim_id) + SAMPLER_ID_SUFFIX; - COLLADASW::LibraryAnimations::Sampler sampler(sw, sampler_id); - std::string empty; - sampler.addInput(COLLADASW::InputSemantic::INPUT, COLLADABU::URI(empty, input_id)); - sampler.addInput(COLLADASW::InputSemantic::OUTPUT, COLLADABU::URI(empty, output_id)); - - // TODO create in/out tangents source - - // this input is required - sampler.addInput(COLLADASW::InputSemantic::INTERPOLATION, COLLADABU::URI(empty, interpolation_id)); - - addSampler(sampler); - - std::string target = translate_id(bone_name) + "/transform"; - addChannel(COLLADABU::URI(empty, sampler_id), target); - - closeAnimation(); + if (fra.size()) { + dae_baked_animation(fra ,ob_arm, bone ); } - // dae_bone_animation -> add_bone_animation - // (blend this into dae_bone_animation) - void AnimationExporter::dae_bone_animation(std::vector &fra, float *values, int tm_type, int axis, std::string ob_name, std::string bone_name) - { - const char *axis_names[] = {"X", "Y", "Z"}; - const char *axis_name = NULL; - char anim_id[200]; - bool is_rot = tm_type == 0; - - if (!fra.size()) - return; + if (flag & ARM_RESTPOS) + arm->flag = flag; + where_is_pose(scene, ob_arm); +} - char rna_path[200]; - BLI_snprintf(rna_path, sizeof(rna_path), "pose.bones[\"%s\"].%s", bone_name.c_str(), - tm_type == 0 ? "rotation_quaternion" : (tm_type == 1 ? "scale" : "location")); +void AnimationExporter::dae_baked_animation(std::vector &fra, Object *ob_arm , Bone *bone) +{ + std::string ob_name = id_name(ob_arm); + std::string bone_name = bone->name; + char anim_id[200]; - if (axis > -1) - axis_name = axis_names[axis]; - - std::string transform_sid = get_transform_sid(NULL, tm_type, axis_name, false); - - BLI_snprintf(anim_id, sizeof(anim_id), "%s_%s_%s", (char*)translate_id(ob_name).c_str(), - (char*)translate_id(bone_name).c_str(), (char*)transform_sid.c_str()); + if (!fra.size()) + return; - openAnimation(anim_id, COLLADABU::Utils::EMPTY_STRING); + BLI_snprintf(anim_id, sizeof(anim_id), "%s_%s_%s", (char*)translate_id(ob_name).c_str(), + (char*)translate_id(bone_name).c_str(), "pose_matrix"); - // create input source - std::string input_id = create_source_from_vector(COLLADASW::InputSemantic::INPUT, fra, is_rot, anim_id, axis_name); + openAnimation(anim_id, COLLADABU::Utils::EMPTY_STRING); - // create output source - std::string output_id; - if (axis == -1) - output_id = create_xyz_source(values, fra.size(), anim_id); - else - output_id = create_source_from_array(COLLADASW::InputSemantic::OUTPUT, values, fra.size(), is_rot, anim_id, axis_name); + // create input source + std::string input_id = create_source_from_vector(COLLADASW::InputSemantic::INPUT, fra, false, anim_id, ""); - // create interpolations source - std::string interpolation_id = fake_interpolation_source(fra.size(), anim_id, axis_name); + // create output source + std::string output_id; + output_id = create_4x4_source( fra, ob_arm , bone , anim_id); - std::string sampler_id = std::string(anim_id) + SAMPLER_ID_SUFFIX; - COLLADASW::LibraryAnimations::Sampler sampler(sw, sampler_id); - std::string empty; - sampler.addInput(COLLADASW::InputSemantic::INPUT, COLLADABU::URI(empty, input_id)); - sampler.addInput(COLLADASW::InputSemantic::OUTPUT, COLLADABU::URI(empty, output_id)); + // create interpolations source + std::string interpolation_id = fake_interpolation_source(fra.size(), anim_id, ""); - // TODO create in/out tangents source + std::string sampler_id = std::string(anim_id) + SAMPLER_ID_SUFFIX; + COLLADASW::LibraryAnimations::Sampler sampler(sw, sampler_id); + std::string empty; + sampler.addInput(COLLADASW::InputSemantic::INPUT, COLLADABU::URI(empty, input_id)); + sampler.addInput(COLLADASW::InputSemantic::OUTPUT, COLLADABU::URI(empty, output_id)); - // this input is required - sampler.addInput(COLLADASW::InputSemantic::INTERPOLATION, COLLADABU::URI(empty, interpolation_id)); + // TODO create in/out tangents source - addSampler(sampler); + // this input is required + sampler.addInput(COLLADASW::InputSemantic::INTERPOLATION, COLLADABU::URI(empty, interpolation_id)); - std::string target = translate_id(ob_name + "_" + bone_name) + "/" + transform_sid; - addChannel(COLLADABU::URI(empty, sampler_id), target); + addSampler(sampler); - closeAnimation(); - } + std::string target = translate_id(bone_name) + "/transform"; + addChannel(COLLADABU::URI(empty, sampler_id), target); - float AnimationExporter::convert_time(float frame) - { - return FRA2TIME(frame); - } + closeAnimation(); +} - float AnimationExporter::convert_angle(float angle) - { - return COLLADABU::Math::Utils::radToDegF(angle); - } +// dae_bone_animation -> add_bone_animation +// (blend this into dae_bone_animation) +void AnimationExporter::dae_bone_animation(std::vector &fra, float *values, int tm_type, int axis, std::string ob_name, std::string bone_name) +{ + const char *axis_names[] = {"X", "Y", "Z"}; + const char *axis_name = NULL; + char anim_id[200]; + bool is_rot = tm_type == 0; - std::string AnimationExporter::get_semantic_suffix(COLLADASW::InputSemantic::Semantics semantic) - { - switch(semantic) { + if (!fra.size()) + return; + + char rna_path[200]; + BLI_snprintf(rna_path, sizeof(rna_path), "pose.bones[\"%s\"].%s", bone_name.c_str(), + tm_type == 0 ? "rotation_quaternion" : (tm_type == 1 ? "scale" : "location")); + + if (axis > -1) + axis_name = axis_names[axis]; + + std::string transform_sid = get_transform_sid(NULL, tm_type, axis_name, false); + + BLI_snprintf(anim_id, sizeof(anim_id), "%s_%s_%s", (char*)translate_id(ob_name).c_str(), + (char*)translate_id(bone_name).c_str(), (char*)transform_sid.c_str()); + + openAnimation(anim_id, COLLADABU::Utils::EMPTY_STRING); + + // create input source + std::string input_id = create_source_from_vector(COLLADASW::InputSemantic::INPUT, fra, is_rot, anim_id, axis_name); + + // create output source + std::string output_id; + if (axis == -1) + output_id = create_xyz_source(values, fra.size(), anim_id); + else + output_id = create_source_from_array(COLLADASW::InputSemantic::OUTPUT, values, fra.size(), is_rot, anim_id, axis_name); + + // create interpolations source + std::string interpolation_id = fake_interpolation_source(fra.size(), anim_id, axis_name); + + std::string sampler_id = std::string(anim_id) + SAMPLER_ID_SUFFIX; + COLLADASW::LibraryAnimations::Sampler sampler(sw, sampler_id); + std::string empty; + sampler.addInput(COLLADASW::InputSemantic::INPUT, COLLADABU::URI(empty, input_id)); + sampler.addInput(COLLADASW::InputSemantic::OUTPUT, COLLADABU::URI(empty, output_id)); + + // TODO create in/out tangents source + + // this input is required + sampler.addInput(COLLADASW::InputSemantic::INTERPOLATION, COLLADABU::URI(empty, interpolation_id)); + + addSampler(sampler); + + std::string target = translate_id(ob_name + "_" + bone_name) + "/" + transform_sid; + addChannel(COLLADABU::URI(empty, sampler_id), target); + + closeAnimation(); +} + +float AnimationExporter::convert_time(float frame) +{ + return FRA2TIME(frame); +} + +float AnimationExporter::convert_angle(float angle) +{ + return COLLADABU::Math::Utils::radToDegF(angle); +} + +std::string AnimationExporter::get_semantic_suffix(COLLADASW::InputSemantic::Semantics semantic) +{ + switch(semantic) { case COLLADASW::InputSemantic::INPUT: return INPUT_SOURCE_ID_SUFFIX; case COLLADASW::InputSemantic::OUTPUT: @@ -527,14 +527,14 @@ void AnimationExporter::operator() (Object *ob) return OUTTANGENT_SOURCE_ID_SUFFIX; default: break; - } - return ""; } + return ""; +} - void AnimationExporter::add_source_parameters(COLLADASW::SourceBase::ParameterNameList& param, - COLLADASW::InputSemantic::Semantics semantic, bool is_rot, const char *axis, bool transform) - { - switch(semantic) { +void AnimationExporter::add_source_parameters(COLLADASW::SourceBase::ParameterNameList& param, + COLLADASW::InputSemantic::Semantics semantic, bool is_rot, const char *axis, bool transform) +{ + switch(semantic) { case COLLADASW::InputSemantic::INPUT: param.push_back("TIME"); break; @@ -547,14 +547,14 @@ void AnimationExporter::operator() (Object *ob) param.push_back(axis); } else - if ( transform ) - { - param.push_back("TRANSFORM"); - }else{ //assumes if axis isn't specified all axises are added - param.push_back("X"); - param.push_back("Y"); - param.push_back("Z"); - } + if ( transform ) + { + param.push_back("TRANSFORM"); + }else{ //assumes if axis isn't specified all axises are added + param.push_back("X"); + param.push_back("Y"); + param.push_back("Z"); + } } break; case COLLADASW::InputSemantic::IN_TANGENT: @@ -564,12 +564,12 @@ void AnimationExporter::operator() (Object *ob) break; default: break; - } } +} - void AnimationExporter::get_source_values(BezTriple *bezt, COLLADASW::InputSemantic::Semantics semantic, bool rotation, float *values, int *length) - { - switch (semantic) { +void AnimationExporter::get_source_values(BezTriple *bezt, COLLADASW::InputSemantic::Semantics semantic, bool rotation, float *values, int *length) +{ + switch (semantic) { case COLLADASW::InputSemantic::INPUT: *length = 1; values[0] = convert_time(bezt->vec[1][0]); @@ -583,9 +583,9 @@ void AnimationExporter::operator() (Object *ob) values[0] = bezt->vec[1][1]; } break; - + case COLLADASW::InputSemantic::IN_TANGENT: - *length = 2; + *length = 2; values[0] = convert_time(bezt->vec[0][0]); if (bezt->ipo != BEZT_IPO_BEZ) { // We're in a mixed interpolation scenario, set zero as it's irrelevant but value might contain unused data @@ -598,7 +598,7 @@ void AnimationExporter::operator() (Object *ob) values[1] = bezt->vec[0][1]; } break; - + case COLLADASW::InputSemantic::OUT_TANGENT: *length = 2; values[0] = convert_time(bezt->vec[2][0]); @@ -617,283 +617,283 @@ void AnimationExporter::operator() (Object *ob) default: *length = 0; break; - } } +} - std::string AnimationExporter::create_source_from_fcurve(COLLADASW::InputSemantic::Semantics semantic, FCurve *fcu, const std::string& anim_id, const char *axis_name) - { - std::string source_id = anim_id + get_semantic_suffix(semantic); +std::string AnimationExporter::create_source_from_fcurve(COLLADASW::InputSemantic::Semantics semantic, FCurve *fcu, const std::string& anim_id, const char *axis_name) +{ + std::string source_id = anim_id + get_semantic_suffix(semantic); - //bool is_rotation = !strcmp(fcu->rna_path, "rotation"); - bool is_angle = false; - - if (strstr(fcu->rna_path, "rotation")) is_angle = true; - - COLLADASW::FloatSourceF source(mSW); - source.setId(source_id); - source.setArrayId(source_id + ARRAY_ID_SUFFIX); - source.setAccessorCount(fcu->totvert); - - switch (semantic) { + //bool is_rotation = !strcmp(fcu->rna_path, "rotation"); + bool is_angle = false; + + if (strstr(fcu->rna_path, "rotation")) is_angle = true; + + COLLADASW::FloatSourceF source(mSW); + source.setId(source_id); + source.setArrayId(source_id + ARRAY_ID_SUFFIX); + source.setAccessorCount(fcu->totvert); + + switch (semantic) { case COLLADASW::InputSemantic::INPUT: case COLLADASW::InputSemantic::OUTPUT: - source.setAccessorStride(1); + source.setAccessorStride(1); break; case COLLADASW::InputSemantic::IN_TANGENT: case COLLADASW::InputSemantic::OUT_TANGENT: - source.setAccessorStride(2); + source.setAccessorStride(2); break; - } - - - COLLADASW::SourceBase::ParameterNameList ¶m = source.getParameterNameList(); - add_source_parameters(param, semantic, is_angle, axis_name, false); - - source.prepareToAppendValues(); - - for (unsigned int i = 0; i < fcu->totvert; i++) { - float values[3]; // be careful! - int length = 0; - get_source_values(&fcu->bezt[i], semantic, is_angle, values, &length); - for (int j = 0; j < length; j++) - source.appendValues(values[j]); - } - - source.finish(); - - return source_id; } - //Currently called only to get OUTPUT source values ( if rotation and hence the axis is also specified ) - std::string AnimationExporter::create_source_from_array(COLLADASW::InputSemantic::Semantics semantic, float *v, int tot, bool is_rot, const std::string& anim_id, const char *axis_name) - { - std::string source_id = anim_id + get_semantic_suffix(semantic); - COLLADASW::FloatSourceF source(mSW); - source.setId(source_id); - source.setArrayId(source_id + ARRAY_ID_SUFFIX); - source.setAccessorCount(tot); - source.setAccessorStride(1); - - COLLADASW::SourceBase::ParameterNameList ¶m = source.getParameterNameList(); - add_source_parameters(param, semantic, is_rot, axis_name, false); + COLLADASW::SourceBase::ParameterNameList ¶m = source.getParameterNameList(); + add_source_parameters(param, semantic, is_angle, axis_name, false); - source.prepareToAppendValues(); + source.prepareToAppendValues(); - for (int i = 0; i < tot; i++) { - float val = v[i]; - ////if (semantic == COLLADASW::InputSemantic::INPUT) - // val = convert_time(val); - //else - if (is_rot) - val *= 180.0f / M_PI; - source.appendValues(val); - } - - source.finish(); - - return source_id; + for (unsigned int i = 0; i < fcu->totvert; i++) { + float values[3]; // be careful! + int length = 0; + get_source_values(&fcu->bezt[i], semantic, is_angle, values, &length); + for (int j = 0; j < length; j++) + source.appendValues(values[j]); } + + source.finish(); + + return source_id; +} + +//Currently called only to get OUTPUT source values ( if rotation and hence the axis is also specified ) +std::string AnimationExporter::create_source_from_array(COLLADASW::InputSemantic::Semantics semantic, float *v, int tot, bool is_rot, const std::string& anim_id, const char *axis_name) +{ + std::string source_id = anim_id + get_semantic_suffix(semantic); + + COLLADASW::FloatSourceF source(mSW); + source.setId(source_id); + source.setArrayId(source_id + ARRAY_ID_SUFFIX); + source.setAccessorCount(tot); + source.setAccessorStride(1); + + COLLADASW::SourceBase::ParameterNameList ¶m = source.getParameterNameList(); + add_source_parameters(param, semantic, is_rot, axis_name, false); + + source.prepareToAppendValues(); + + for (int i = 0; i < tot; i++) { + float val = v[i]; + ////if (semantic == COLLADASW::InputSemantic::INPUT) + // val = convert_time(val); + //else + if (is_rot) + val *= 180.0f / M_PI; + source.appendValues(val); + } + + source.finish(); + + return source_id; +} // only used for sources with INPUT semantic - std::string AnimationExporter::create_source_from_vector(COLLADASW::InputSemantic::Semantics semantic, std::vector &fra, bool is_rot, const std::string& anim_id, const char *axis_name) - { - std::string source_id = anim_id + get_semantic_suffix(semantic); +std::string AnimationExporter::create_source_from_vector(COLLADASW::InputSemantic::Semantics semantic, std::vector &fra, bool is_rot, const std::string& anim_id, const char *axis_name) +{ + std::string source_id = anim_id + get_semantic_suffix(semantic); - COLLADASW::FloatSourceF source(mSW); - source.setId(source_id); - source.setArrayId(source_id + ARRAY_ID_SUFFIX); - source.setAccessorCount(fra.size()); - source.setAccessorStride(1); - - COLLADASW::SourceBase::ParameterNameList ¶m = source.getParameterNameList(); - add_source_parameters(param, semantic, is_rot, axis_name, false); + COLLADASW::FloatSourceF source(mSW); + source.setId(source_id); + source.setArrayId(source_id + ARRAY_ID_SUFFIX); + source.setAccessorCount(fra.size()); + source.setAccessorStride(1); - source.prepareToAppendValues(); + COLLADASW::SourceBase::ParameterNameList ¶m = source.getParameterNameList(); + add_source_parameters(param, semantic, is_rot, axis_name, false); - std::vector::iterator it; - for (it = fra.begin(); it != fra.end(); it++) { - float val = *it; - //if (semantic == COLLADASW::InputSemantic::INPUT) - val = convert_time(val); - /*else if (is_rot) - val = convert_angle(val);*/ - source.appendValues(val); - } + source.prepareToAppendValues(); - source.finish(); - - return source_id; + std::vector::iterator it; + for (it = fra.begin(); it != fra.end(); it++) { + float val = *it; + //if (semantic == COLLADASW::InputSemantic::INPUT) + val = convert_time(val); + /*else if (is_rot) + val = convert_angle(val);*/ + source.appendValues(val); } - std::string AnimationExporter::create_4x4_source(std::vector &frames , Object * ob_arm, Bone *bone , const std::string& anim_id) - { - COLLADASW::InputSemantic::Semantics semantic = COLLADASW::InputSemantic::OUTPUT; - std::string source_id = anim_id + get_semantic_suffix(semantic); + source.finish(); - COLLADASW::Float4x4Source source(mSW); - source.setId(source_id); - source.setArrayId(source_id + ARRAY_ID_SUFFIX); - source.setAccessorCount(frames.size()); - source.setAccessorStride(16); - - COLLADASW::SourceBase::ParameterNameList ¶m = source.getParameterNameList(); - add_source_parameters(param, semantic, false, NULL, true); + return source_id; +} - source.prepareToAppendValues(); - - bPoseChannel *parchan = NULL; - bPoseChannel *pchan = NULL; - bPose *pose = ob_arm->pose; +std::string AnimationExporter::create_4x4_source(std::vector &frames , Object * ob_arm, Bone *bone , const std::string& anim_id) +{ + COLLADASW::InputSemantic::Semantics semantic = COLLADASW::InputSemantic::OUTPUT; + std::string source_id = anim_id + get_semantic_suffix(semantic); - pchan = get_pose_channel(pose, bone->name); + COLLADASW::Float4x4Source source(mSW); + source.setId(source_id); + source.setArrayId(source_id + ARRAY_ID_SUFFIX); + source.setAccessorCount(frames.size()); + source.setAccessorStride(16); - if (!pchan) - return ""; + COLLADASW::SourceBase::ParameterNameList ¶m = source.getParameterNameList(); + add_source_parameters(param, semantic, false, NULL, true); - parchan = pchan->parent; + source.prepareToAppendValues(); - enable_fcurves(ob_arm->adt->action, bone->name); + bPoseChannel *parchan = NULL; + bPoseChannel *pchan = NULL; + bPose *pose = ob_arm->pose; - std::vector::iterator it; - int j = 0; - for (it = frames.begin(); it != frames.end(); it++) { - float mat[4][4], ipar[4][4]; + pchan = get_pose_channel(pose, bone->name); - float ctime = bsystem_time(scene, ob_arm, *it, 0.0f); + if (!pchan) + return ""; - BKE_animsys_evaluate_animdata(scene , &ob_arm->id, ob_arm->adt, ctime, ADT_RECALC_ANIM); - where_is_pose_bone(scene, ob_arm, pchan, ctime, 1); + parchan = pchan->parent; - // compute bone local mat - if (bone->parent) { - invert_m4_m4(ipar, parchan->pose_mat); - mul_m4_m4m4(mat, pchan->pose_mat, ipar); - } - else - copy_m4_m4(mat, pchan->pose_mat); - UnitConverter converter; + enable_fcurves(ob_arm->adt->action, bone->name); - float outmat[4][4]; - converter.mat4_to_dae(outmat,mat); + std::vector::iterator it; + int j = 0; + for (it = frames.begin(); it != frames.end(); it++) { + float mat[4][4], ipar[4][4]; + float ctime = bsystem_time(scene, ob_arm, *it, 0.0f); - source.appendValues(outmat); - + BKE_animsys_evaluate_animdata(scene , &ob_arm->id, ob_arm->adt, ctime, ADT_RECALC_ANIM); + where_is_pose_bone(scene, ob_arm, pchan, ctime, 1); - j++; + // compute bone local mat + if (bone->parent) { + invert_m4_m4(ipar, parchan->pose_mat); + mul_m4_m4m4(mat, pchan->pose_mat, ipar); } + else + copy_m4_m4(mat, pchan->pose_mat); + UnitConverter converter; - enable_fcurves(ob_arm->adt->action, NULL); + float outmat[4][4]; + converter.mat4_to_dae(outmat,mat); - source.finish(); - return source_id; - } - // only used for sources with OUTPUT semantic ( locations and scale) - std::string AnimationExporter::create_xyz_source(float *v, int tot, const std::string& anim_id) - { - COLLADASW::InputSemantic::Semantics semantic = COLLADASW::InputSemantic::OUTPUT; - std::string source_id = anim_id + get_semantic_suffix(semantic); + source.appendValues(outmat); - COLLADASW::FloatSourceF source(mSW); - source.setId(source_id); - source.setArrayId(source_id + ARRAY_ID_SUFFIX); - source.setAccessorCount(tot); - source.setAccessorStride(3); - - COLLADASW::SourceBase::ParameterNameList ¶m = source.getParameterNameList(); - add_source_parameters(param, semantic, false, NULL, false); - source.prepareToAppendValues(); - - for (int i = 0; i < tot; i++) { - source.appendValues(*v, *(v + 1), *(v + 2)); - v += 3; - } - - source.finish(); - - return source_id; + j++; } - std::string AnimationExporter::create_interpolation_source(FCurve *fcu, const std::string& anim_id, const char *axis_name, bool *has_tangents) - { - std::string source_id = anim_id + get_semantic_suffix(COLLADASW::InputSemantic::INTERPOLATION); + enable_fcurves(ob_arm->adt->action, NULL); - COLLADASW::NameSource source(mSW); - source.setId(source_id); - source.setArrayId(source_id + ARRAY_ID_SUFFIX); - source.setAccessorCount(fcu->totvert); - source.setAccessorStride(1); - - COLLADASW::SourceBase::ParameterNameList ¶m = source.getParameterNameList(); - param.push_back("INTERPOLATION"); + source.finish(); - source.prepareToAppendValues(); + return source_id; +} +// only used for sources with OUTPUT semantic ( locations and scale) +std::string AnimationExporter::create_xyz_source(float *v, int tot, const std::string& anim_id) +{ + COLLADASW::InputSemantic::Semantics semantic = COLLADASW::InputSemantic::OUTPUT; + std::string source_id = anim_id + get_semantic_suffix(semantic); - *has_tangents = false; + COLLADASW::FloatSourceF source(mSW); + source.setId(source_id); + source.setArrayId(source_id + ARRAY_ID_SUFFIX); + source.setAccessorCount(tot); + source.setAccessorStride(3); - for (unsigned int i = 0; i < fcu->totvert; i++) { - if (fcu->bezt[i].ipo==BEZT_IPO_BEZ) { - source.appendValues(BEZIER_NAME); - *has_tangents = true; - } else if (fcu->bezt[i].ipo==BEZT_IPO_CONST) { - source.appendValues(STEP_NAME); - } else { // BEZT_IPO_LIN - source.appendValues(LINEAR_NAME); - } - } - // unsupported? -- HERMITE, CARDINAL, BSPLINE, NURBS + COLLADASW::SourceBase::ParameterNameList ¶m = source.getParameterNameList(); + add_source_parameters(param, semantic, false, NULL, false); - source.finish(); + source.prepareToAppendValues(); - return source_id; + for (int i = 0; i < tot; i++) { + source.appendValues(*v, *(v + 1), *(v + 2)); + v += 3; } - std::string AnimationExporter::fake_interpolation_source(int tot, const std::string& anim_id, const char *axis_name) - { - std::string source_id = anim_id + get_semantic_suffix(COLLADASW::InputSemantic::INTERPOLATION); + source.finish(); - COLLADASW::NameSource source(mSW); - source.setId(source_id); - source.setArrayId(source_id + ARRAY_ID_SUFFIX); - source.setAccessorCount(tot); - source.setAccessorStride(1); - - COLLADASW::SourceBase::ParameterNameList ¶m = source.getParameterNameList(); - param.push_back("INTERPOLATION"); + return source_id; +} - source.prepareToAppendValues(); +std::string AnimationExporter::create_interpolation_source(FCurve *fcu, const std::string& anim_id, const char *axis_name, bool *has_tangents) +{ + std::string source_id = anim_id + get_semantic_suffix(COLLADASW::InputSemantic::INTERPOLATION); - for (int i = 0; i < tot; i++) { + COLLADASW::NameSource source(mSW); + source.setId(source_id); + source.setArrayId(source_id + ARRAY_ID_SUFFIX); + source.setAccessorCount(fcu->totvert); + source.setAccessorStride(1); + + COLLADASW::SourceBase::ParameterNameList ¶m = source.getParameterNameList(); + param.push_back("INTERPOLATION"); + + source.prepareToAppendValues(); + + *has_tangents = false; + + for (unsigned int i = 0; i < fcu->totvert; i++) { + if (fcu->bezt[i].ipo==BEZT_IPO_BEZ) { + source.appendValues(BEZIER_NAME); + *has_tangents = true; + } else if (fcu->bezt[i].ipo==BEZT_IPO_CONST) { + source.appendValues(STEP_NAME); + } else { // BEZT_IPO_LIN source.appendValues(LINEAR_NAME); } + } + // unsupported? -- HERMITE, CARDINAL, BSPLINE, NURBS - source.finish(); + source.finish(); - return source_id; + return source_id; +} + +std::string AnimationExporter::fake_interpolation_source(int tot, const std::string& anim_id, const char *axis_name) +{ + std::string source_id = anim_id + get_semantic_suffix(COLLADASW::InputSemantic::INTERPOLATION); + + COLLADASW::NameSource source(mSW); + source.setId(source_id); + source.setArrayId(source_id + ARRAY_ID_SUFFIX); + source.setAccessorCount(tot); + source.setAccessorStride(1); + + COLLADASW::SourceBase::ParameterNameList ¶m = source.getParameterNameList(); + param.push_back("INTERPOLATION"); + + source.prepareToAppendValues(); + + for (int i = 0; i < tot; i++) { + source.appendValues(LINEAR_NAME); } - std::string AnimationExporter::get_light_param_sid(char *rna_path, int tm_type, const char *axis_name, bool append_axis) - { - std::string tm_name; - // when given rna_path, determine tm_type from it - if (rna_path) { - char *name = extract_transform_name(rna_path); + source.finish(); - if (!strcmp(name, "color")) - tm_type = 1; - else if (!strcmp(name, "spot_size")) - tm_type = 2; - else if (!strcmp(name, "spot_blend")) - tm_type = 3; - else if (!strcmp(name, "distance")) - tm_type = 4; - else - tm_type = -1; - } + return source_id; +} - switch (tm_type) { +std::string AnimationExporter::get_light_param_sid(char *rna_path, int tm_type, const char *axis_name, bool append_axis) +{ + std::string tm_name; + // when given rna_path, determine tm_type from it + if (rna_path) { + char *name = extract_transform_name(rna_path); + + if (!strcmp(name, "color")) + tm_type = 1; + else if (!strcmp(name, "spot_size")) + tm_type = 2; + else if (!strcmp(name, "spot_blend")) + tm_type = 3; + else if (!strcmp(name, "distance")) + tm_type = 4; + else + tm_type = -1; + } + + switch (tm_type) { case 1: tm_name = "color"; break; @@ -906,43 +906,43 @@ void AnimationExporter::operator() (Object *ob) case 4: tm_name = "blender/blender_dist"; break; - + default: tm_name = ""; break; - } - - if (tm_name.size()) { - if (axis_name != "") - return tm_name + "." + std::string(axis_name); - else - return tm_name; - } - - return std::string(""); } - - std::string AnimationExporter::get_camera_param_sid(char *rna_path, int tm_type, const char *axis_name, bool append_axis) - { - std::string tm_name; - // when given rna_path, determine tm_type from it - if (rna_path) { - char *name = extract_transform_name(rna_path); - if (!strcmp(name, "lens")) - tm_type = 0; - else if (!strcmp(name, "ortho_scale")) - tm_type = 1; - else if (!strcmp(name, "clip_end")) - tm_type = 2; - else if (!strcmp(name, "clip_start")) - tm_type = 3; - - else - tm_type = -1; - } + if (tm_name.size()) { + if (axis_name != "") + return tm_name + "." + std::string(axis_name); + else + return tm_name; + } - switch (tm_type) { + return std::string(""); +} + +std::string AnimationExporter::get_camera_param_sid(char *rna_path, int tm_type, const char *axis_name, bool append_axis) +{ + std::string tm_name; + // when given rna_path, determine tm_type from it + if (rna_path) { + char *name = extract_transform_name(rna_path); + + if (!strcmp(name, "lens")) + tm_type = 0; + else if (!strcmp(name, "ortho_scale")) + tm_type = 1; + else if (!strcmp(name, "clip_end")) + tm_type = 2; + else if (!strcmp(name, "clip_start")) + tm_type = 3; + + else + tm_type = -1; + } + + switch (tm_type) { case 0: tm_name = "xfov"; break; @@ -955,56 +955,56 @@ void AnimationExporter::operator() (Object *ob) case 3: tm_name = "znear"; break; - + default: tm_name = ""; break; - } - - if (tm_name.size()) { - if (axis_name != "") - return tm_name + "." + std::string(axis_name); - else - return tm_name; - } - - return std::string(""); } - // Assign sid of the animated parameter or transform - // for rotation, axis name is always appended and the value of append_axis is ignored - std::string AnimationExporter::get_transform_sid(char *rna_path, int tm_type, const char *axis_name, bool append_axis) - { - std::string tm_name; - bool is_rotation =false; - // when given rna_path, determine tm_type from it - if (rna_path) { - char *name = extract_transform_name(rna_path); + if (tm_name.size()) { + if (axis_name != "") + return tm_name + "." + std::string(axis_name); + else + return tm_name; + } - if (!strcmp(name, "rotation_euler")) - tm_type = 0; - else if (!strcmp(name, "rotation_quaternion")) - tm_type = 1; - else if (!strcmp(name, "scale")) - tm_type = 2; - else if (!strcmp(name, "location")) - tm_type = 3; - else if (!strcmp(name, "specular_hardness")) - tm_type = 4; - else if (!strcmp(name, "specular_color")) - tm_type = 5; - else if (!strcmp(name, "diffuse_color")) - tm_type = 6; - else if (!strcmp(name, "alpha")) - tm_type = 7; - else if (!strcmp(name, "ior")) - tm_type = 8; - - else - tm_type = -1; - } + return std::string(""); +} - switch (tm_type) { +// Assign sid of the animated parameter or transform +// for rotation, axis name is always appended and the value of append_axis is ignored +std::string AnimationExporter::get_transform_sid(char *rna_path, int tm_type, const char *axis_name, bool append_axis) +{ + std::string tm_name; + bool is_rotation =false; + // when given rna_path, determine tm_type from it + if (rna_path) { + char *name = extract_transform_name(rna_path); + + if (!strcmp(name, "rotation_euler")) + tm_type = 0; + else if (!strcmp(name, "rotation_quaternion")) + tm_type = 1; + else if (!strcmp(name, "scale")) + tm_type = 2; + else if (!strcmp(name, "location")) + tm_type = 3; + else if (!strcmp(name, "specular_hardness")) + tm_type = 4; + else if (!strcmp(name, "specular_color")) + tm_type = 5; + else if (!strcmp(name, "diffuse_color")) + tm_type = 6; + else if (!strcmp(name, "alpha")) + tm_type = 7; + else if (!strcmp(name, "ior")) + tm_type = 8; + + else + tm_type = -1; + } + + switch (tm_type) { case 0: case 1: tm_name = "rotation"; @@ -1031,173 +1031,173 @@ void AnimationExporter::operator() (Object *ob) case 8: tm_name = "index_of_refraction"; break; - + default: tm_name = ""; break; + } + + if (tm_name.size()) { + if (is_rotation) + return tm_name + std::string(axis_name) + ".ANGLE"; + else + if (axis_name != "") + return tm_name + "." + std::string(axis_name); + else + return tm_name; + } + + return std::string(""); +} + +char* AnimationExporter::extract_transform_name(char *rna_path) +{ + char *dot = strrchr(rna_path, '.'); + return dot ? (dot + 1) : rna_path; +} + +//find keyframes of all the objects animations +void AnimationExporter::find_frames(Object *ob, std::vector &fra) +{ + FCurve *fcu= (FCurve*)ob->adt->action->curves.first; + + for (; fcu; fcu = fcu->next) { + + for (unsigned int i = 0; i < fcu->totvert; i++) { + float f = fcu->bezt[i].vec[1][0]; + if (std::find(fra.begin(), fra.end(), f) == fra.end()) + fra.push_back(f); } - - if (tm_name.size()) { - if (is_rotation) - return tm_name + std::string(axis_name) + ".ANGLE"; + } + + // keep the keys in ascending order + std::sort(fra.begin(), fra.end()); +} + + + +// enable fcurves driving a specific bone, disable all the rest +// if bone_name = NULL enable all fcurves +void AnimationExporter::enable_fcurves(bAction *act, char *bone_name) +{ + FCurve *fcu; + char prefix[200]; + + if (bone_name) + BLI_snprintf(prefix, sizeof(prefix), "pose.bones[\"%s\"]", bone_name); + + for (fcu = (FCurve*)act->curves.first; fcu; fcu = fcu->next) { + if (bone_name) { + if (!strncmp(fcu->rna_path, prefix, strlen(prefix))) + fcu->flag &= ~FCURVE_DISABLED; else - if (axis_name != "") - return tm_name + "." + std::string(axis_name); - else - return tm_name; + fcu->flag |= FCURVE_DISABLED; + } + else { + fcu->flag &= ~FCURVE_DISABLED; + } + } +} + +bool AnimationExporter::hasAnimations(Scene *sce) +{ + Base *base= (Base*) sce->base.first; + + while(base) { + Object *ob = base->object; + + FCurve *fcu = 0; + //Check for object transform animations + if(ob->adt && ob->adt->action) + fcu = (FCurve*)ob->adt->action->curves.first; + //Check for Lamp parameter animations + else if( (ob->type == OB_LAMP ) && ((Lamp*)ob ->data)->adt && ((Lamp*)ob ->data)->adt->action ) + fcu = (FCurve*)(((Lamp*)ob ->data)->adt->action->curves.first); + //Check for Camera parameter animations + else if( (ob->type == OB_CAMERA ) && ((Camera*)ob ->data)->adt && ((Camera*)ob ->data)->adt->action ) + fcu = (FCurve*)(((Camera*)ob ->data)->adt->action->curves.first); + + //Check Material Effect parameter animations. + for(int a = 0; a < ob->totcol; a++) + { + Material *ma = give_current_material(ob, a+1); + if (!ma) continue; + if(ma->adt && ma->adt->action) + { + fcu = (FCurve*)ma->adt->action->curves.first; + } } - return std::string(""); + if ( fcu) + return true; + base= base->next; } + return false; +} - char* AnimationExporter::extract_transform_name(char *rna_path) - { - char *dot = strrchr(rna_path, '.'); - return dot ? (dot + 1) : rna_path; - } +//------------------------------- Not used in the new system.-------------------------------------------------------- +void AnimationExporter::find_rotation_frames(Object *ob, std::vector &fra, const char *prefix, int rotmode) +{ + if (rotmode > 0) + find_frames(ob, fra, prefix, "rotation_euler"); + else if (rotmode == ROT_MODE_QUAT) + find_frames(ob, fra, prefix, "rotation_quaternion"); + /*else if (rotmode == ROT_MODE_AXISANGLE) + ;*/ +} - //find keyframes of all the objects animations - void AnimationExporter::find_frames(Object *ob, std::vector &fra) - { - FCurve *fcu= (FCurve*)ob->adt->action->curves.first; +void AnimationExporter::find_frames(Object *ob, std::vector &fra, const char *prefix, const char *tm_name) +{ + FCurve *fcu= (FCurve*)ob->adt->action->curves.first; - for (; fcu; fcu = fcu->next) { - + for (; fcu; fcu = fcu->next) { + if (prefix && strncmp(prefix, fcu->rna_path, strlen(prefix))) + continue; + + char *name = extract_transform_name(fcu->rna_path); + if (!strcmp(name, tm_name)) { for (unsigned int i = 0; i < fcu->totvert; i++) { - float f = fcu->bezt[i].vec[1][0]; // + float f = fcu->bezt[i].vec[1][0]; if (std::find(fra.begin(), fra.end(), f) == fra.end()) fra.push_back(f); } } - - // keep the keys in ascending order - std::sort(fra.begin(), fra.end()); } - + // keep the keys in ascending order + std::sort(fra.begin(), fra.end()); +} - // enable fcurves driving a specific bone, disable all the rest - // if bone_name = NULL enable all fcurves - void AnimationExporter::enable_fcurves(bAction *act, char *bone_name) - { - FCurve *fcu; - char prefix[200]; +void AnimationExporter::write_bone_animation(Object *ob_arm, Bone *bone) +{ + if (!ob_arm->adt) + return; - if (bone_name) - BLI_snprintf(prefix, sizeof(prefix), "pose.bones[\"%s\"]", bone_name); + //write bone animations for 3 transform types + //i=0 --> rotations + //i=1 --> scale + //i=2 --> location + for (int i = 0; i < 3; i++) + sample_and_write_bone_animation(ob_arm, bone, i); - for (fcu = (FCurve*)act->curves.first; fcu; fcu = fcu->next) { - if (bone_name) { - if (!strncmp(fcu->rna_path, prefix, strlen(prefix))) - fcu->flag &= ~FCURVE_DISABLED; - else - fcu->flag |= FCURVE_DISABLED; - } - else { - fcu->flag &= ~FCURVE_DISABLED; - } - } - } - - bool AnimationExporter::hasAnimations(Scene *sce) - { - Base *base= (Base*) sce->base.first; - - while(base) { - Object *ob = base->object; - - FCurve *fcu = 0; - //Check for object transform animations - if(ob->adt && ob->adt->action) - fcu = (FCurve*)ob->adt->action->curves.first; - //Check for Lamp parameter animations - else if( (ob->type == OB_LAMP ) && ((Lamp*)ob ->data)->adt && ((Lamp*)ob ->data)->adt->action ) - fcu = (FCurve*)(((Lamp*)ob ->data)->adt->action->curves.first); - //Check for Camera parameter animations - else if( (ob->type == OB_CAMERA ) && ((Camera*)ob ->data)->adt && ((Camera*)ob ->data)->adt->action ) - fcu = (FCurve*)(((Camera*)ob ->data)->adt->action->curves.first); - - //Check Material Effect parameter animations. - for(int a = 0; a < ob->totcol; a++) - { - Material *ma = give_current_material(ob, a+1); - if (!ma) continue; - if(ma->adt && ma->adt->action) - { - fcu = (FCurve*)ma->adt->action->curves.first; - } - } + for (Bone *child = (Bone*)bone->childbase.first; child; child = child->next) + write_bone_animation(ob_arm, child); +} - if ( fcu) - return true; - base= base->next; - } - return false; - } +void AnimationExporter::sample_and_write_bone_animation(Object *ob_arm, Bone *bone, int transform_type) +{ + bArmature *arm = (bArmature*)ob_arm->data; + int flag = arm->flag; + std::vector fra; + char prefix[256]; - //------------------------------- Not used in the new system.-------------------------------------------------------- - void AnimationExporter::find_rotation_frames(Object *ob, std::vector &fra, const char *prefix, int rotmode) - { - if (rotmode > 0) - find_frames(ob, fra, prefix, "rotation_euler"); - else if (rotmode == ROT_MODE_QUAT) - find_frames(ob, fra, prefix, "rotation_quaternion"); - /*else if (rotmode == ROT_MODE_AXISANGLE) - ;*/ - } + BLI_snprintf(prefix, sizeof(prefix), "pose.bones[\"%s\"]", bone->name); - void AnimationExporter::find_frames(Object *ob, std::vector &fra, const char *prefix, const char *tm_name) - { - FCurve *fcu= (FCurve*)ob->adt->action->curves.first; - - for (; fcu; fcu = fcu->next) { - if (prefix && strncmp(prefix, fcu->rna_path, strlen(prefix))) - continue; - - char *name = extract_transform_name(fcu->rna_path); - if (!strcmp(name, tm_name)) { - for (unsigned int i = 0; i < fcu->totvert; i++) { - float f = fcu->bezt[i].vec[1][0]; // - if (std::find(fra.begin(), fra.end(), f) == fra.end()) - fra.push_back(f); - } - } - } - - // keep the keys in ascending order - std::sort(fra.begin(), fra.end()); - } - - void AnimationExporter::write_bone_animation(Object *ob_arm, Bone *bone) - { - if (!ob_arm->adt) - return; - - //write bone animations for 3 transform types - //i=0 --> rotations - //i=1 --> scale - //i=2 --> location - for (int i = 0; i < 3; i++) - sample_and_write_bone_animation(ob_arm, bone, i); - - for (Bone *child = (Bone*)bone->childbase.first; child; child = child->next) - write_bone_animation(ob_arm, child); - } - - void AnimationExporter::sample_and_write_bone_animation(Object *ob_arm, Bone *bone, int transform_type) - { - bArmature *arm = (bArmature*)ob_arm->data; - int flag = arm->flag; - std::vector fra; - char prefix[256]; - - BLI_snprintf(prefix, sizeof(prefix), "pose.bones[\"%s\"]", bone->name); - - bPoseChannel *pchan = get_pose_channel(ob_arm->pose, bone->name); - if (!pchan) - return; - //Fill frame array with key frame values framed at @param:transform_type - switch (transform_type) { + bPoseChannel *pchan = get_pose_channel(ob_arm->pose, bone->name); + if (!pchan) + return; + //Fill frame array with key frame values framed at @param:transform_type + switch (transform_type) { case 0: find_rotation_frames(ob_arm, fra, prefix, pchan->rotmode); break; @@ -1209,77 +1209,77 @@ void AnimationExporter::operator() (Object *ob) break; default: return; - } - - // exit rest position - if (flag & ARM_RESTPOS) { - arm->flag &= ~ARM_RESTPOS; - where_is_pose(scene, ob_arm); - } - //v array will hold all values which will be exported. - if (fra.size()) { - float *values = (float*)MEM_callocN(sizeof(float) * 3 * fra.size(), "temp. anim frames"); - sample_animation(values, fra, transform_type, bone, ob_arm, pchan); - - if (transform_type == 0) { - // write x, y, z curves separately if it is rotation - float *axisValues = (float*)MEM_callocN(sizeof(float) * fra.size(), "temp. anim frames"); - - for (int i = 0; i < 3; i++) { - for (unsigned int j = 0; j < fra.size(); j++) - axisValues[j] = values[j * 3 + i]; - - dae_bone_animation(fra, axisValues, transform_type, i, id_name(ob_arm), bone->name); - } - MEM_freeN(axisValues); - } - else { - // write xyz at once if it is location or scale - dae_bone_animation(fra, values, transform_type, -1, id_name(ob_arm), bone->name); - } - - MEM_freeN(values); - } - - // restore restpos - if (flag & ARM_RESTPOS) - arm->flag = flag; - where_is_pose(scene, ob_arm); } - void AnimationExporter::sample_animation(float *v, std::vector &frames, int type, Bone *bone, Object *ob_arm, bPoseChannel *pchan) - { - bPoseChannel *parchan = NULL; - bPose *pose = ob_arm->pose; + // exit rest position + if (flag & ARM_RESTPOS) { + arm->flag &= ~ARM_RESTPOS; + where_is_pose(scene, ob_arm); + } + //v array will hold all values which will be exported. + if (fra.size()) { + float *values = (float*)MEM_callocN(sizeof(float) * 3 * fra.size(), "temp. anim frames"); + sample_animation(values, fra, transform_type, bone, ob_arm, pchan); - pchan = get_pose_channel(pose, bone->name); + if (transform_type == 0) { + // write x, y, z curves separately if it is rotation + float *axisValues = (float*)MEM_callocN(sizeof(float) * fra.size(), "temp. anim frames"); - if (!pchan) - return; + for (int i = 0; i < 3; i++) { + for (unsigned int j = 0; j < fra.size(); j++) + axisValues[j] = values[j * 3 + i]; - parchan = pchan->parent; - - enable_fcurves(ob_arm->adt->action, bone->name); - - std::vector::iterator it; - for (it = frames.begin(); it != frames.end(); it++) { - float mat[4][4], ipar[4][4]; - - float ctime = bsystem_time(scene, ob_arm, *it, 0.0f); - - - BKE_animsys_evaluate_animdata(scene , &ob_arm->id, ob_arm->adt, ctime, ADT_RECALC_ANIM); - where_is_pose_bone(scene, ob_arm, pchan, ctime, 1); - - // compute bone local mat - if (bone->parent) { - invert_m4_m4(ipar, parchan->pose_mat); - mul_m4_m4m4(mat, pchan->pose_mat, ipar); + dae_bone_animation(fra, axisValues, transform_type, i, id_name(ob_arm), bone->name); } - else - copy_m4_m4(mat, pchan->pose_mat); + MEM_freeN(axisValues); + } + else { + // write xyz at once if it is location or scale + dae_bone_animation(fra, values, transform_type, -1, id_name(ob_arm), bone->name); + } - switch (type) { + MEM_freeN(values); + } + + // restore restpos + if (flag & ARM_RESTPOS) + arm->flag = flag; + where_is_pose(scene, ob_arm); +} + +void AnimationExporter::sample_animation(float *v, std::vector &frames, int type, Bone *bone, Object *ob_arm, bPoseChannel *pchan) +{ + bPoseChannel *parchan = NULL; + bPose *pose = ob_arm->pose; + + pchan = get_pose_channel(pose, bone->name); + + if (!pchan) + return; + + parchan = pchan->parent; + + enable_fcurves(ob_arm->adt->action, bone->name); + + std::vector::iterator it; + for (it = frames.begin(); it != frames.end(); it++) { + float mat[4][4], ipar[4][4]; + + float ctime = bsystem_time(scene, ob_arm, *it, 0.0f); + + + BKE_animsys_evaluate_animdata(scene , &ob_arm->id, ob_arm->adt, ctime, ADT_RECALC_ANIM); + where_is_pose_bone(scene, ob_arm, pchan, ctime, 1); + + // compute bone local mat + if (bone->parent) { + invert_m4_m4(ipar, parchan->pose_mat); + mul_m4_m4m4(mat, pchan->pose_mat, ipar); + } + else + copy_m4_m4(mat, pchan->pose_mat); + + switch (type) { case 0: mat4_to_eul(v, mat); break; @@ -1289,12 +1289,10 @@ void AnimationExporter::operator() (Object *ob) case 2: copy_v3_v3(v, mat[3]); break; - } - - v += 3; } - enable_fcurves(ob_arm->adt->action, NULL); + v += 3; } - + enable_fcurves(ob_arm->adt->action, NULL); +} diff --git a/source/blender/collada/AnimationImporter.cpp b/source/blender/collada/AnimationImporter.cpp index 4a3cd5eeb06..db32664f736 100644 --- a/source/blender/collada/AnimationImporter.cpp +++ b/source/blender/collada/AnimationImporter.cpp @@ -89,17 +89,17 @@ void AnimationImporter::animation_to_fcurves(COLLADAFW::AnimationCurve *curve) { COLLADAFW::FloatOrDoubleArray& input = curve->getInputValues(); COLLADAFW::FloatOrDoubleArray& output = curve->getOutputValues(); - + if( curve->getInterpolationType() == COLLADAFW::AnimationCurve::INTERPOLATION_BEZIER || curve->getInterpolationType() == COLLADAFW::AnimationCurve::INTERPOLATION_STEP ) { - COLLADAFW::FloatOrDoubleArray& intan = curve->getInTangentValues(); - COLLADAFW::FloatOrDoubleArray& outtan = curve->getOutTangentValues(); + COLLADAFW::FloatOrDoubleArray& intan = curve->getInTangentValues(); + COLLADAFW::FloatOrDoubleArray& outtan = curve->getOutTangentValues(); } float fps = (float)FPS; size_t dim = curve->getOutDimension(); unsigned int i; - + std::vector& fcurves = curve_map[curve->getUniqueId()]; switch (dim) { @@ -110,18 +110,18 @@ void AnimationImporter::animation_to_fcurves(COLLADAFW::AnimationCurve *curve) { for (i = 0; i < dim; i++ ) { FCurve *fcu = (FCurve*)MEM_callocN(sizeof(FCurve), "FCurve"); - + fcu->flag = (FCURVE_VISIBLE|FCURVE_AUTO_HANDLES|FCURVE_SELECTED); // fcu->rna_path = BLI_strdupn(path, strlen(path)); fcu->array_index = 0; fcu->totvert = curve->getKeyCount(); - + // create beztriple for each key for (unsigned int j = 0; j < curve->getKeyCount(); j++) { BezTriple bez; memset(&bez, 0, sizeof(BezTriple)); - + // input, output bez.vec[1][0] = bc_get_float_value(input, j) * fps; bez.vec[1][1] = bc_get_float_value(output, j * dim + i); @@ -131,20 +131,20 @@ void AnimationImporter::animation_to_fcurves(COLLADAFW::AnimationCurve *curve) curve->getInterpolationType() == COLLADAFW::AnimationCurve::INTERPOLATION_STEP) { COLLADAFW::FloatOrDoubleArray& intan = curve->getInTangentValues(); - COLLADAFW::FloatOrDoubleArray& outtan = curve->getOutTangentValues(); + COLLADAFW::FloatOrDoubleArray& outtan = curve->getOutTangentValues(); // intangent - bez.vec[0][0] = bc_get_float_value(intan, (j * 2 * dim ) + (2 * i)) * fps; - bez.vec[0][1] = bc_get_float_value(intan, (j * 2 * dim )+ (2 * i) + 1); + bez.vec[0][0] = bc_get_float_value(intan, (j * 2 * dim ) + (2 * i)) * fps; + bez.vec[0][1] = bc_get_float_value(intan, (j * 2 * dim )+ (2 * i) + 1); - // outtangent - bez.vec[2][0] = bc_get_float_value(outtan, (j * 2 * dim ) + (2 * i)) * fps; - bez.vec[2][1] = bc_get_float_value(outtan, (j * 2 * dim )+ (2 * i) + 1); - if(curve->getInterpolationType() == COLLADAFW::AnimationCurve::INTERPOLATION_BEZIER) + // outtangent + bez.vec[2][0] = bc_get_float_value(outtan, (j * 2 * dim ) + (2 * i)) * fps; + bez.vec[2][1] = bc_get_float_value(outtan, (j * 2 * dim )+ (2 * i) + 1); + if(curve->getInterpolationType() == COLLADAFW::AnimationCurve::INTERPOLATION_BEZIER) bez.ipo = BEZT_IPO_BEZ; - else - bez.ipo = BEZT_IPO_CONST; - //bez.h1 = bez.h2 = HD_AUTO; + else + bez.ipo = BEZT_IPO_CONST; + //bez.h1 = bez.h2 = HD_AUTO; } else { @@ -153,7 +153,7 @@ void AnimationImporter::animation_to_fcurves(COLLADAFW::AnimationCurve *curve) } // bez.ipo = U.ipo_new; /* use default interpolation mode here... */ bez.f1 = bez.f2 = bez.f3 = SELECT; - + insert_bezt_fcurve(fcu, &bez, 0); } @@ -306,9 +306,9 @@ bool AnimationImporter::write_animation(const COLLADAFW::Animation* anim) bool AnimationImporter::write_animation_list(const COLLADAFW::AnimationList* animlist) { const COLLADAFW::UniqueId& animlist_id = animlist->getUniqueId(); - + animlist_map[animlist_id] = animlist; - + #if 0 // should not happen @@ -317,10 +317,10 @@ bool AnimationImporter::write_animation_list(const COLLADAFW::AnimationList* ani } // for bones rna_path is like: pose.bones["bone-name"].rotation - + #endif - + return true; } @@ -433,7 +433,7 @@ virtual void AnimationImporter::change_eul_to_quat(Object *ob, bAction *act) //sets the rna_path and array index to curve void AnimationImporter::modify_fcurve(std::vector* curves , char* rna_path , int array_index ) -{ +{ std::vector::iterator it; int i; for (it = curves->begin(), i = 0; it != curves->end(); it++, i++) { @@ -450,18 +450,18 @@ void AnimationImporter::modify_fcurve(std::vector* curves , char* rna_p void AnimationImporter::find_frames( std::vector* frames , std::vector* curves) { std::vector::iterator iter; - for (iter = curves->begin(); iter != curves->end(); iter++) { - FCurve *fcu = *iter; - - for (unsigned int k = 0; k < fcu->totvert; k++) { - //get frame value from bezTriple - float fra = fcu->bezt[k].vec[1][0]; - //if frame already not added add frame to frames - if (std::find(frames->begin(), frames->end(), fra) == frames->end()) - frames->push_back(fra); - - } + for (iter = curves->begin(); iter != curves->end(); iter++) { + FCurve *fcu = *iter; + + for (unsigned int k = 0; k < fcu->totvert; k++) { + //get frame value from bezTriple + float fra = fcu->bezt[k].vec[1][0]; + //if frame already not added add frame to frames + if (std::find(frames->begin(), frames->end(), fra) == frames->end()) + frames->push_back(fra); + } + } } //creates the rna_paths and array indices of fcurves from animations using transformation and bound animation class of each animation. @@ -472,18 +472,18 @@ void AnimationImporter:: Assign_transform_animations(COLLADAFW::Transformation * COLLADAFW::Transformation::TransformationType tm_type = transform->getTransformationType(); bool is_matrix = tm_type == COLLADAFW::Transformation::MATRIX; bool is_rotation = tm_type == COLLADAFW::Transformation::ROTATE; - + //to check if the no of curves are valid bool xyz = ((tm_type == COLLADAFW::Transformation::TRANSLATE ||tm_type == COLLADAFW::Transformation::SCALE) && binding->animationClass == COLLADAFW::AnimationList::POSITION_XYZ); - - + + if (!((!xyz && curves->size() == 1) || (xyz && curves->size() == 3) || is_matrix)) { fprintf(stderr, "expected %d curves, got %d\n", xyz ? 3 : 1, (int)curves->size()); return; } - + char rna_path[100]; - + switch (tm_type) { case COLLADAFW::Transformation::TRANSLATE: case COLLADAFW::Transformation::SCALE: @@ -495,80 +495,80 @@ void AnimationImporter:: Assign_transform_animations(COLLADAFW::Transformation * BLI_strncpy(rna_path, loc ? "location" : "scale", sizeof(rna_path)); switch (binding->animationClass) { - case COLLADAFW::AnimationList::POSITION_X: - modify_fcurve(curves, rna_path, 0 ); - break; - case COLLADAFW::AnimationList::POSITION_Y: - modify_fcurve(curves, rna_path, 1 ); - break; - case COLLADAFW::AnimationList::POSITION_Z: - modify_fcurve(curves, rna_path, 2 ); - break; - case COLLADAFW::AnimationList::POSITION_XYZ: - modify_fcurve(curves, rna_path, -1 ); - break; - default: - fprintf(stderr, "AnimationClass %d is not supported for %s.\n", - binding->animationClass, loc ? "TRANSLATE" : "SCALE"); - } - break; + case COLLADAFW::AnimationList::POSITION_X: + modify_fcurve(curves, rna_path, 0 ); + break; + case COLLADAFW::AnimationList::POSITION_Y: + modify_fcurve(curves, rna_path, 1 ); + break; + case COLLADAFW::AnimationList::POSITION_Z: + modify_fcurve(curves, rna_path, 2 ); + break; + case COLLADAFW::AnimationList::POSITION_XYZ: + modify_fcurve(curves, rna_path, -1 ); + break; + default: + fprintf(stderr, "AnimationClass %d is not supported for %s.\n", + binding->animationClass, loc ? "TRANSLATE" : "SCALE"); + } + break; } - - + + case COLLADAFW::Transformation::ROTATE: { if (is_joint) BLI_snprintf(rna_path, sizeof(rna_path), "%s.rotation_euler", joint_path); else BLI_strncpy(rna_path, "rotation_euler", sizeof(rna_path)); - std::vector::iterator iter; + std::vector::iterator iter; for (iter = curves->begin(); iter != curves->end(); iter++) { FCurve* fcu = *iter; - + //if transform is rotation the fcurves values must be turned in to radian. if (is_rotation) fcurve_deg_to_rad(fcu); } COLLADAFW::Rotate* rot = (COLLADAFW::Rotate*)transform; COLLADABU::Math::Vector3& axis = rot->getRotationAxis(); - + switch (binding->animationClass) { - case COLLADAFW::AnimationList::ANGLE: - if (COLLADABU::Math::Vector3::UNIT_X == axis) { - modify_fcurve(curves, rna_path, 0 ); - } - else if (COLLADABU::Math::Vector3::UNIT_Y == axis) { - modify_fcurve(curves, rna_path, 1 ); - } - else if (COLLADABU::Math::Vector3::UNIT_Z == axis) { - modify_fcurve(curves, rna_path, 2 ); - } - break; - case COLLADAFW::AnimationList::AXISANGLE: - // TODO convert axis-angle to quat? or XYZ? - default: - fprintf(stderr, "AnimationClass %d is not supported for ROTATE transformation.\n", - binding->animationClass); - } - break; + case COLLADAFW::AnimationList::ANGLE: + if (COLLADABU::Math::Vector3::UNIT_X == axis) { + modify_fcurve(curves, rna_path, 0 ); } - + else if (COLLADABU::Math::Vector3::UNIT_Y == axis) { + modify_fcurve(curves, rna_path, 1 ); + } + else if (COLLADABU::Math::Vector3::UNIT_Z == axis) { + modify_fcurve(curves, rna_path, 2 ); + } + break; + case COLLADAFW::AnimationList::AXISANGLE: + // TODO convert axis-angle to quat? or XYZ? + default: + fprintf(stderr, "AnimationClass %d is not supported for ROTATE transformation.\n", + binding->animationClass); + } + break; + } + case COLLADAFW::Transformation::MATRIX: /*{ - COLLADAFW::Matrix* mat = (COLLADAFW::Matrix*)transform; - COLLADABU::Math::Matrix4 mat4 = mat->getMatrix(); - switch (binding->animationClass) { - case COLLADAFW::AnimationList::TRANSFORM: - - } + COLLADAFW::Matrix* mat = (COLLADAFW::Matrix*)transform; + COLLADABU::Math::Matrix4 mat4 = mat->getMatrix(); + switch (binding->animationClass) { + case COLLADAFW::AnimationList::TRANSFORM: + + } }*/ break; case COLLADAFW::Transformation::SKEW: case COLLADAFW::Transformation::LOOKAT: fprintf(stderr, "Animation of SKEW and LOOKAT transformations is not supported yet.\n"); break; - } - + } + } //creates the rna_paths and array indices of fcurves from animations using color and bound animation class of each animation. @@ -576,15 +576,15 @@ void AnimationImporter:: Assign_color_animations(const COLLADAFW::UniqueId& list { char rna_path[100]; BLI_strncpy(rna_path,anim_type, sizeof(rna_path)); - + const COLLADAFW::AnimationList *animlist = animlist_map[listid]; const COLLADAFW::AnimationList::AnimationBindings& bindings = animlist->getAnimationBindings(); - //all the curves belonging to the current binding - std::vector animcurves; + //all the curves belonging to the current binding + std::vector animcurves; for (unsigned int j = 0; j < bindings.getCount(); j++) { - animcurves = curve_map[bindings[j].animation]; - - switch (bindings[j].animationClass) { + animcurves = curve_map[bindings[j].animation]; + + switch (bindings[j].animationClass) { case COLLADAFW::AnimationList::COLOR_R: modify_fcurve(&animcurves, rna_path, 0 ); break; @@ -598,13 +598,13 @@ void AnimationImporter:: Assign_color_animations(const COLLADAFW::UniqueId& list case COLLADAFW::AnimationList::COLOR_RGBA: // to do-> set intensity modify_fcurve(&animcurves, rna_path, -1 ); break; - + default: fprintf(stderr, "AnimationClass %d is not supported for %s.\n", - bindings[j].animationClass, "COLOR" ); + bindings[j].animationClass, "COLOR" ); } - std::vector::iterator iter; + std::vector::iterator iter; //Add the curves of the current animation to the object for (iter = animcurves.begin(); iter != animcurves.end(); iter++) { FCurve * fcu = *iter; @@ -612,7 +612,7 @@ void AnimationImporter:: Assign_color_animations(const COLLADAFW::UniqueId& list } } - + } void AnimationImporter:: Assign_float_animations(const COLLADAFW::UniqueId& listid, ListBase *AnimCurves, char * anim_type) @@ -625,7 +625,7 @@ void AnimationImporter:: Assign_float_animations(const COLLADAFW::UniqueId& list const COLLADAFW::AnimationList *animlist = animlist_map[listid]; const COLLADAFW::AnimationList::AnimationBindings& bindings = animlist->getAnimationBindings(); //all the curves belonging to the current binding - std::vector animcurves; + std::vector animcurves; for (unsigned int j = 0; j < bindings.getCount(); j++) { animcurves = curve_map[bindings[j].animation]; @@ -671,28 +671,28 @@ void AnimationImporter::apply_matrix_curves( Object * ob, std::vector& copy_m4_m4(rest, bone->arm_mat); invert_m4_m4(irest, rest); } - // new curves to assign matrix transform animation + // new curves to assign matrix transform animation FCurve *newcu[10]; // if tm_type is matrix, then create 10 curves: 4 rot, 3 loc, 3 scale unsigned int totcu = 10 ; - const char *tm_str = NULL; + const char *tm_str = NULL; char rna_path[200]; for (int i = 0; i < totcu; i++) { int axis = i; - if (i < 4) { - tm_str = "rotation_quaternion"; - axis = i; - } - else if (i < 7) { - tm_str = "location"; - axis = i - 4; - } - else { - tm_str = "scale"; - axis = i - 7; - } - + if (i < 4) { + tm_str = "rotation_quaternion"; + axis = i; + } + else if (i < 7) { + tm_str = "location"; + axis = i - 4; + } + else { + tm_str = "scale"; + axis = i - 7; + } + if (is_joint) BLI_snprintf(rna_path, sizeof(rna_path), "%s.%s", joint_path, tm_str); @@ -702,11 +702,11 @@ void AnimationImporter::apply_matrix_curves( Object * ob, std::vector& newcu[i]->totvert = frames.size(); } - if (frames.size() == 0) + if (frames.size() == 0) return; -std::sort(frames.begin(), frames.end()); - + std::sort(frames.begin(), frames.end()); + std::vector::iterator it; // sample values at each frame @@ -717,7 +717,7 @@ std::sort(frames.begin(), frames.end()); float matfra[4][4]; unit_m4(matfra); - + // calc object-space mat evaluate_transform_at_frame(matfra, node, fra); @@ -743,23 +743,23 @@ std::sort(frames.begin(), frames.end()); } float rot[4], loc[3], scale[3]; - - mat4_to_quat(rot, mat); - /*for ( int i = 0 ; i < 4 ; i ++ ) - { - rot[i] = rot[i] * (180 / M_PI); - }*/ - copy_v3_v3(loc, mat[3]); - mat4_to_size(scale, mat); - + + mat4_to_quat(rot, mat); + /*for ( int i = 0 ; i < 4 ; i ++ ) + { + rot[i] = rot[i] * (180 / M_PI); + }*/ + copy_v3_v3(loc, mat[3]); + mat4_to_size(scale, mat); + // add keys for (int i = 0; i < totcu; i++) { - if (i < 4) - add_bezt(newcu[i], fra, rot[i]); - else if (i < 7) - add_bezt(newcu[i], fra, loc[i - 4]); - else - add_bezt(newcu[i], fra, scale[i - 7]); + if (i < 4) + add_bezt(newcu[i], fra, rot[i]); + else if (i < 7) + add_bezt(newcu[i], fra, loc[i - 4]); + else + add_bezt(newcu[i], fra, scale[i - 7]); } } verify_adt_action((ID*)&ob->id, 1); @@ -774,13 +774,13 @@ std::sort(frames.begin(), frames.end()); BLI_addtail(curves, newcu[i]); } - if (is_joint) { - bPoseChannel *chan = get_pose_channel(ob->pose, bone_name); - chan->rotmode = ROT_MODE_QUAT; - } - else { - ob->rotmode = ROT_MODE_QUAT; - } + if (is_joint) { + bPoseChannel *chan = get_pose_channel(ob->pose, bone_name); + chan->rotmode = ROT_MODE_QUAT; + } + else { + ob->rotmode = ROT_MODE_QUAT; + } return; @@ -804,24 +804,24 @@ void AnimationImporter::translate_Animations ( COLLADAFW::Node * node , bAction * act; bActionGroup *grp = NULL; - + if ( (animType->transform) != 0 ) { - const char *bone_name = is_joint ? bc_get_joint_name(node) : NULL; - char joint_path[200]; + const char *bone_name = is_joint ? bc_get_joint_name(node) : NULL; + char joint_path[200]; if ( is_joint ) - armature_importer->get_rna_path_for_joint(node, joint_path, sizeof(joint_path)); - - + armature_importer->get_rna_path_for_joint(node, joint_path, sizeof(joint_path)); + + if (!ob->adt || !ob->adt->action) act = verify_adt_action((ID*)&ob->id, 1); else act = ob->adt->action; - - //Get the list of animation curves of the object - ListBase *AnimCurves = &(act->curves); + + //Get the list of animation curves of the object + ListBase *AnimCurves = &(act->curves); const COLLADAFW::TransformationPointerArray& nodeTransforms = node->getTransformations(); - + //for each transformation in node for (unsigned int i = 0; i < nodeTransforms.getCount(); i++) { COLLADAFW::Transformation *transform = nodeTransforms[i]; @@ -829,10 +829,10 @@ void AnimationImporter::translate_Animations ( COLLADAFW::Node * node , bool is_rotation = tm_type == COLLADAFW::Transformation::ROTATE; bool is_matrix = tm_type == COLLADAFW::Transformation::MATRIX; - + const COLLADAFW::UniqueId& listid = transform->getAnimationList(); - - //check if transformation has animations + + //check if transformation has animations if (animlist_map.find(listid) == animlist_map.end()) continue ; else { @@ -840,25 +840,25 @@ void AnimationImporter::translate_Animations ( COLLADAFW::Node * node , const COLLADAFW::AnimationList *animlist = animlist_map[listid]; const COLLADAFW::AnimationList::AnimationBindings& bindings = animlist->getAnimationBindings(); //all the curves belonging to the current binding - std::vector animcurves; + std::vector animcurves; for (unsigned int j = 0; j < bindings.getCount(); j++) { - animcurves = curve_map[bindings[j].animation]; - if ( is_matrix ) - apply_matrix_curves(ob, animcurves, root , node, transform ); - else { + animcurves = curve_map[bindings[j].animation]; + if ( is_matrix ) + apply_matrix_curves(ob, animcurves, root , node, transform ); + else { //calculate rnapaths and array index of fcurves according to transformation and animation class - Assign_transform_animations(transform, &bindings[j], &animcurves, is_joint, joint_path ); - - std::vector::iterator iter; - //Add the curves of the current animation to the object - for (iter = animcurves.begin(); iter != animcurves.end(); iter++) { - FCurve * fcu = *iter; - if ((ob->type == OB_ARMATURE)) - add_bone_fcurve( ob, node , fcu ); - else - BLI_addtail(AnimCurves, fcu); - } + Assign_transform_animations(transform, &bindings[j], &animcurves, is_joint, joint_path ); + + std::vector::iterator iter; + //Add the curves of the current animation to the object + for (iter = animcurves.begin(); iter != animcurves.end(); iter++) { + FCurve * fcu = *iter; + if ((ob->type == OB_ARMATURE)) + add_bone_fcurve( ob, node , fcu ); + else + BLI_addtail(AnimCurves, fcu); } + } } } if (is_rotation) { @@ -880,7 +880,7 @@ void AnimationImporter::translate_Animations ( COLLADAFW::Node * node , Lamp * lamp = (Lamp*) ob->data; if (!lamp->adt || !lamp->adt->action) act = verify_adt_action((ID*)&lamp->id, 1); - else act = lamp->adt->action; + else act = lamp->adt->action; ListBase *AnimCurves = &(act->curves); const COLLADAFW::InstanceLightPointerArray& nodeLights = node->getInstanceLights(); @@ -892,23 +892,23 @@ void AnimationImporter::translate_Animations ( COLLADAFW::Node * node , { const COLLADAFW::Color *col = &(light->getColor()); const COLLADAFW::UniqueId& listid = col->getAnimationList(); - + Assign_color_animations(listid, AnimCurves, "color"); } if ((animType->light & LIGHT_FOA) != 0 ) { const COLLADAFW::AnimatableFloat *foa = &(light->getFallOffAngle()); const COLLADAFW::UniqueId& listid = foa->getAnimationList(); - + Assign_float_animations( listid ,AnimCurves, "spot_size"); } if ( (animType->light & LIGHT_FOE) != 0 ) { const COLLADAFW::AnimatableFloat *foe = &(light->getFallOffExponent()); const COLLADAFW::UniqueId& listid = foe->getAnimationList(); - + Assign_float_animations( listid ,AnimCurves, "spot_blend"); - + } } } @@ -918,7 +918,7 @@ void AnimationImporter::translate_Animations ( COLLADAFW::Node * node , Camera * camera = (Camera*) ob->data; if (!camera->adt || !camera->adt->action) act = verify_adt_action((ID*)&camera->id, 1); - else act = camera->adt->action; + else act = camera->adt->action; ListBase *AnimCurves = &(act->curves); const COLLADAFW::InstanceCameraPointerArray& nodeCameras= node->getInstanceCameras(); @@ -957,12 +957,12 @@ void AnimationImporter::translate_Animations ( COLLADAFW::Node * node , } } if ( animType->material != 0){ - Material *ma = give_current_material(ob, 1); - if (!ma->adt || !ma->adt->action) act = verify_adt_action((ID*)&ma->id, 1); - else act = ma->adt->action; + Material *ma = give_current_material(ob, 1); + if (!ma->adt || !ma->adt->action) act = verify_adt_action((ID*)&ma->id, 1); + else act = ma->adt->action; ListBase *AnimCurves = &(act->curves); - + const COLLADAFW::InstanceGeometryPointerArray& nodeGeoms = node->getInstanceGeometries(); for (unsigned int i = 0; i < nodeGeoms.getCount(); i++) { const COLLADAFW::MaterialBindingArray& matBinds = nodeGeoms[i]->getMaterialBindings(); @@ -988,7 +988,7 @@ void AnimationImporter::translate_Animations ( COLLADAFW::Node * node , const COLLADAFW::UniqueId& listid = cot->getColor().getAnimationList(); Assign_color_animations( listid, AnimCurves , "specular_color" ); } - + if((animType->material & MATERIAL_DIFF_COLOR) != 0){ const COLLADAFW::ColorOrTexture *cot = &(efc->getDiffuse()); const COLLADAFW::UniqueId& listid = cot->getColor().getAnimationList(); @@ -1005,15 +1005,15 @@ AnimationImporter::AnimMix* AnimationImporter::get_animation_type ( const COLLAD std::map FW_object_map) { AnimMix *types = new AnimMix(); - + const COLLADAFW::TransformationPointerArray& nodeTransforms = node->getTransformations(); - + //for each transformation in node for (unsigned int i = 0; i < nodeTransforms.getCount(); i++) { COLLADAFW::Transformation *transform = nodeTransforms[i]; const COLLADAFW::UniqueId& listid = transform->getAnimationList(); - - //check if transformation has animations + + //check if transformation has animations if (animlist_map.find(listid) == animlist_map.end()) continue ; else { @@ -1028,9 +1028,9 @@ AnimationImporter::AnimMix* AnimationImporter::get_animation_type ( const COLLAD types->light = setAnimType(&(light->getColor()),(types->light), LIGHT_COLOR); types->light = setAnimType(&(light->getFallOffAngle()),(types->light), LIGHT_FOA); types->light = setAnimType(&(light->getFallOffExponent()),(types->light), LIGHT_FOE); - + if ( types->light != 0) break; - + } const COLLADAFW::InstanceCameraPointerArray& nodeCameras = node->getInstanceCameras(); @@ -1039,9 +1039,9 @@ AnimationImporter::AnimMix* AnimationImporter::get_animation_type ( const COLLAD if ( camera->getCameraType() == COLLADAFW::Camera::PERSPECTIVE ) { - types->camera = setAnimType(&(camera->getXMag()),(types->camera), CAMERA_XFOV); + types->camera = setAnimType(&(camera->getXMag()),(types->camera), CAMERA_XFOV); } - else + else { types->camera = setAnimType(&(camera->getXMag()),(types->camera), CAMERA_XMAG); } @@ -1063,7 +1063,7 @@ AnimationImporter::AnimMix* AnimationImporter::get_animation_type ( const COLLAD types->material = setAnimType(&(efc->getShininess()),(types->material), MATERIAL_SHININESS); types->material = setAnimType(&(efc->getSpecular().getColor()),(types->material), MATERIAL_SPEC_COLOR); types->material = setAnimType(&(efc->getDiffuse().getColor()),(types->material), MATERIAL_DIFF_COLOR); - // types->material = setAnimType(&(efc->get()),(types->material), MATERIAL_TRANSPARENCY); + // types->material = setAnimType(&(efc->get()),(types->material), MATERIAL_TRANSPARENCY); types->material = setAnimType(&(efc->getIndexOfRefraction()),(types->material), MATERIAL_IOR); } } @@ -1101,7 +1101,7 @@ void AnimationImporter::find_frames_old(std::vector * frames, COLLADAFW:: const COLLADAFW::AnimationList *animlist = animlist_map[listid]; const COLLADAFW::AnimationList::AnimationBindings& bindings = animlist->getAnimationBindings(); - + if (bindings.getCount()) { //for each AnimationBinding get the fcurves which animate the transform for (unsigned int j = 0; j < bindings.getCount(); j++) { @@ -1113,7 +1113,7 @@ void AnimationImporter::find_frames_old(std::vector * frames, COLLADAFW:: for (iter = curves.begin(); iter != curves.end(); iter++) { FCurve *fcu = *iter; - + //if transform is rotation the fcurves values must be turned in to radian. if (is_rotation) fcurve_deg_to_rad(fcu); @@ -1448,9 +1448,9 @@ bool AnimationImporter::evaluate_animation(COLLADAFW::Transformation *tm, float COLLADAFW::Transformation::TransformationType type = tm->getTransformationType(); if (type != COLLADAFW::Transformation::ROTATE && - type != COLLADAFW::Transformation::SCALE && - type != COLLADAFW::Transformation::TRANSLATE && - type != COLLADAFW::Transformation::MATRIX) { + type != COLLADAFW::Transformation::SCALE && + type != COLLADAFW::Transformation::TRANSLATE && + type != COLLADAFW::Transformation::MATRIX) { fprintf(stderr, "animation of transformation %d is not supported yet\n", type); return false; } @@ -1572,7 +1572,7 @@ bool AnimationImporter::evaluate_animation(COLLADAFW::Transformation *tm, float COLLADAFW::Matrix tm(matrix); dae_matrix_to_mat4(&tm, mat); - + std::vector::iterator it; return true; diff --git a/source/blender/collada/AnimationImporter.h b/source/blender/collada/AnimationImporter.h index 18303eb2f0b..ed9a2171c87 100644 --- a/source/blender/collada/AnimationImporter.h +++ b/source/blender/collada/AnimationImporter.h @@ -88,7 +88,7 @@ private: void add_fcurves_to_object(Object *ob, std::vector& curves, char *rna_path, int array_index, Animation *animated); int typeFlag; - + enum lightAnim { // INANIMATE = 0, @@ -144,7 +144,7 @@ public: #if 0 virtual void change_eul_to_quat(Object *ob, bAction *act); #endif - + void translate_Animations( COLLADAFW::Node * Node , std::map& root_map, std::map& object_map , @@ -161,7 +161,7 @@ public: void Assign_color_animations(const COLLADAFW::UniqueId& listid, ListBase *AnimCurves ,char * anim_type); void Assign_float_animations(const COLLADAFW::UniqueId& listid, ListBase *AnimCurves, char * anim_type); - + int setAnimType ( const COLLADAFW::Animatable * prop , int type, int addition); void modify_fcurve(std::vector* curves , char* rna_path , int array_index ); @@ -206,5 +206,5 @@ public: void extra_data_importer(std::string elementName); }; - - #endif + +#endif diff --git a/source/blender/collada/ArmatureExporter.cpp b/source/blender/collada/ArmatureExporter.cpp index 92d06bb639f..de01c000373 100644 --- a/source/blender/collada/ArmatureExporter.cpp +++ b/source/blender/collada/ArmatureExporter.cpp @@ -188,7 +188,7 @@ void ArmatureExporter::add_bone_node(Bone *bone, Object *ob_arm) for (Bone *child = (Bone*)bone->childbase.first; child; child = child->next) { add_bone_node(child, ob_arm); } - node.end(); + node.end(); //} } diff --git a/source/blender/collada/ArmatureImporter.cpp b/source/blender/collada/ArmatureImporter.cpp index 2ec8ae540d2..27aee133557 100644 --- a/source/blender/collada/ArmatureImporter.cpp +++ b/source/blender/collada/ArmatureImporter.cpp @@ -87,7 +87,7 @@ void ArmatureImporter::create_unskinned_bone( COLLADAFW::Node *node, EditBone *p if ( it != finished_joints.end()) return; float mat[4][4]; - float obmat[4][4]; + float obmat[4][4]; // object-space get_node_mat(obmat, node, NULL, NULL); @@ -296,7 +296,7 @@ void ArmatureImporter::add_leaf_bone(float mat[][4], EditBone *bone, COLLADAFW: et->setData("tip_z",&z); float vec[3] = {x,y,z}; copy_v3_v3(leaf.bone->tail, leaf.bone->head); - add_v3_v3v3(leaf.bone->tail, leaf.bone->head, vec); + add_v3_v3v3(leaf.bone->tail, leaf.bone->head, vec); }else leaf_bones.push_back(leaf); } diff --git a/source/blender/collada/ArmatureImporter.h b/source/blender/collada/ArmatureImporter.h index 4f4aed210f2..a197e612a87 100644 --- a/source/blender/collada/ArmatureImporter.h +++ b/source/blender/collada/ArmatureImporter.h @@ -115,7 +115,7 @@ private: void fix_leaf_bones(); - void set_pose ( Object * ob_arm , COLLADAFW::Node * root_node ,char * parentname, float parent_mat[][4]); + void set_pose ( Object * ob_arm , COLLADAFW::Node * root_node ,char * parentname, float parent_mat[][4]); #if 0 @@ -171,7 +171,7 @@ public: // gives a world-space mat bool get_joint_bind_mat(float m[][4], COLLADAFW::Node *joint); - + void set_tags_map( TagsMap& tags_map); }; diff --git a/source/blender/collada/MeshImporter.cpp b/source/blender/collada/MeshImporter.cpp index 760fb2359a4..6032109b809 100644 --- a/source/blender/collada/MeshImporter.cpp +++ b/source/blender/collada/MeshImporter.cpp @@ -411,7 +411,7 @@ int MeshImporter::count_new_tris(COLLADAFW::Mesh *mesh, Mesh *me) } // TODO: import uv set names -void MeshImporter::read_faces(COLLADAFW::Mesh *mesh, Mesh *me, int new_tris) //TODO:: Refactor. Possibly replace by iterators +void MeshImporter::read_faces(COLLADAFW::Mesh *mesh, Mesh *me, int new_tris) //TODO:: Refactor. Possibly replace by iterators { unsigned int i; diff --git a/source/blender/collada/SkinInfo.cpp b/source/blender/collada/SkinInfo.cpp index ce0d561c524..1d890415ebe 100644 --- a/source/blender/collada/SkinInfo.cpp +++ b/source/blender/collada/SkinInfo.cpp @@ -266,9 +266,9 @@ void SkinInfo::link_armature(bContext *C, Object *ob, std::mapmat4_to_dae_double(dmat,local); + converter->mat4_to_dae_double(dmat,local); TransformBase::decompose(local, loc, rot, NULL, scale); if ( node.getType() == COLLADASW::Node::JOINT) From cbc812b757068c65effd90bdd4b08d7f4e25c342 Mon Sep 17 00:00:00 2001 From: Nathan Letwory Date: Sun, 4 Sep 2011 01:13:44 +0000 Subject: [PATCH 058/182] Fix [#28322] COLLADA imports messed up UVs Reported by Chad Gleason Imported index order could put mface->v4==0. We already know amount of verts, so use that instead. --- source/blender/collada/MeshImporter.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/blender/collada/MeshImporter.cpp b/source/blender/collada/MeshImporter.cpp index 6032109b809..e9086f05628 100644 --- a/source/blender/collada/MeshImporter.cpp +++ b/source/blender/collada/MeshImporter.cpp @@ -220,8 +220,8 @@ void MeshImporter::set_face_uv(MTFace *mtface, UVDataWrapper &uvs, if (quad) uvs.getUV(indices[index + 3], mtface->uv[3]); -#ifdef COLLADA_DEBUG - /*if (quad) { +#if 1 // #ifdef COLLADA_DEBUG + if (quad) { fprintf(stderr, "face uv:\n" "((%d, %d, %d, %d))\n" "((%.1f, %.1f), (%.1f, %.1f), (%.1f, %.1f), (%.1f, %.1f))\n", @@ -248,7 +248,7 @@ void MeshImporter::set_face_uv(MTFace *mtface, UVDataWrapper &uvs, mtface->uv[0][0], mtface->uv[0][1], mtface->uv[1][0], mtface->uv[1][1], mtface->uv[2][0], mtface->uv[2][1]); - }*/ + } #endif } @@ -587,7 +587,7 @@ void MeshImporter::read_faces(COLLADAFW::Mesh *mesh, Mesh *me, int new_tris) //T for (k = 0; k < index_list_array.getCount(); k++) { // get mtface by face index and uv set index MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, k); - set_face_uv(&mtface[face_index], uvs, *index_list_array[k], index, mface->v4 != 0); + set_face_uv(&mtface[face_index], uvs, *index_list_array[k], index, vcount == 4); } #endif From 70e3541f3a4327db0fd3fd4070091ddfda313cfe Mon Sep 17 00:00:00 2001 From: Mitchell Stokes Date: Sun, 4 Sep 2011 01:27:16 +0000 Subject: [PATCH 059/182] BGE animations: Fixing a potential crash when using camera IPOs. The IPOs were being created off of blendercamera->adt->action when they should have been using the supplied action. Thanks to z0r for pointing out the problem and a potential fix. --- source/gameengine/Converter/KX_IpoConvert.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/gameengine/Converter/KX_IpoConvert.cpp b/source/gameengine/Converter/KX_IpoConvert.cpp index 0ee99f5335b..b13dbe324f5 100644 --- a/source/gameengine/Converter/KX_IpoConvert.cpp +++ b/source/gameengine/Converter/KX_IpoConvert.cpp @@ -257,7 +257,7 @@ SG_Controller *BL_CreateCameraIPO(struct bAction *action, KX_GameObject* camera ipocontr->m_clipstart = blendercamera->clipsta; ipocontr->m_clipend = blendercamera->clipend; - BL_InterpolatorList *adtList= GetAdtList(blendercamera->adt->action, converter); + BL_InterpolatorList *adtList= GetAdtList(action, converter); // For each active channel in the adtList add an // interpolator to the game object. From 103b06d4dfe0c5cda0eed2dad8d077e32aa056df Mon Sep 17 00:00:00 2001 From: Mitchell Stokes Date: Sun, 4 Sep 2011 01:42:47 +0000 Subject: [PATCH 060/182] BGE animations: fixing initialization order issues for BL_ActionActuator and BL_ArmatureObject. Thanks to z0r for pointing them out and providing a fix. --- source/gameengine/Converter/BL_ActionActuator.cpp | 2 +- source/gameengine/Converter/BL_ArmatureObject.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/source/gameengine/Converter/BL_ActionActuator.cpp b/source/gameengine/Converter/BL_ActionActuator.cpp index 063544932de..895def17e8e 100644 --- a/source/gameengine/Converter/BL_ActionActuator.cpp +++ b/source/gameengine/Converter/BL_ActionActuator.cpp @@ -88,10 +88,10 @@ BL_ActionActuator::BL_ActionActuator(SCA_IObject* gameobj, m_blendin(blendin), m_blendstart(0), m_stridelength(stride), + m_layer_weight(layer_weight), m_playtype(playtype), m_priority(priority), m_layer(layer), - m_layer_weight(layer_weight), m_ipo_flags(ipo_flags), m_pose(NULL), m_blendpose(NULL), diff --git a/source/gameengine/Converter/BL_ArmatureObject.cpp b/source/gameengine/Converter/BL_ArmatureObject.cpp index 395cae4ba87..684bd3f341e 100644 --- a/source/gameengine/Converter/BL_ArmatureObject.cpp +++ b/source/gameengine/Converter/BL_ArmatureObject.cpp @@ -231,10 +231,10 @@ BL_ArmatureObject::BL_ArmatureObject( m_timestep(0.040), m_activeAct(NULL), m_activePriority(999), + m_vert_deform_type(vert_deform_type), m_constraintNumber(0), m_channelNumber(0), - m_lastapplyframe(0.0), - m_vert_deform_type(vert_deform_type) + m_lastapplyframe(0.0) { m_armature = (bArmature *)armature->data; From caa1acb6b1d6b908e34be31c4b9bd026066b820f Mon Sep 17 00:00:00 2001 From: Nathan Letwory Date: Sun, 4 Sep 2011 02:12:03 +0000 Subject: [PATCH 061/182] Prevent potential crasher, commonEffects could be empty. --- source/blender/collada/AnimationImporter.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/source/blender/collada/AnimationImporter.cpp b/source/blender/collada/AnimationImporter.cpp index db32664f736..29c356ed8f0 100644 --- a/source/blender/collada/AnimationImporter.cpp +++ b/source/blender/collada/AnimationImporter.cpp @@ -1059,12 +1059,14 @@ AnimationImporter::AnimMix* AnimationImporter::get_animation_type ( const COLLAD const COLLADAFW::UniqueId & matuid = matBinds[j].getReferencedMaterial(); const COLLADAFW::Effect *ef = (COLLADAFW::Effect *) (FW_object_map[matuid]); const COLLADAFW::CommonEffectPointerArray& commonEffects = ef->getCommonEffects(); - COLLADAFW::EffectCommon *efc = commonEffects[0]; - types->material = setAnimType(&(efc->getShininess()),(types->material), MATERIAL_SHININESS); - types->material = setAnimType(&(efc->getSpecular().getColor()),(types->material), MATERIAL_SPEC_COLOR); - types->material = setAnimType(&(efc->getDiffuse().getColor()),(types->material), MATERIAL_DIFF_COLOR); - // types->material = setAnimType(&(efc->get()),(types->material), MATERIAL_TRANSPARENCY); - types->material = setAnimType(&(efc->getIndexOfRefraction()),(types->material), MATERIAL_IOR); + if(!commonEffects.empty()) { + COLLADAFW::EffectCommon *efc = commonEffects[0]; + types->material = setAnimType(&(efc->getShininess()),(types->material), MATERIAL_SHININESS); + types->material = setAnimType(&(efc->getSpecular().getColor()),(types->material), MATERIAL_SPEC_COLOR); + types->material = setAnimType(&(efc->getDiffuse().getColor()),(types->material), MATERIAL_DIFF_COLOR); + // types->material = setAnimType(&(efc->get()),(types->material), MATERIAL_TRANSPARENCY); + types->material = setAnimType(&(efc->getIndexOfRefraction()),(types->material), MATERIAL_IOR); + } } } return types; From 317908a330184799eecfe34ed47648d5323b43de Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Sun, 4 Sep 2011 11:13:41 +0000 Subject: [PATCH 062/182] Fix #28423: Screw-modifier crash in cunjunction with subsurf modifier Problems was caused by angle=2*pi and steps=2 in screw modifier. Such configuration produced duplicated geometry to close object and it was confusing for subsurf cache. Restrict steps=2 for screw modifier now, so now 3<=steps<=512. --- source/blender/makesrna/intern/rna_modifier.c | 2 +- source/blender/modifiers/intern/MOD_screw.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index 37a629f46d0..22fdfcea29c 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -2366,7 +2366,7 @@ static void rna_def_modifier_screw(BlenderRNA *brna) prop= RNA_def_property(srna, "steps", PROP_INT, PROP_UNSIGNED); RNA_def_property_range(prop, 2, 10000); - RNA_def_property_ui_range(prop, 2, 512, 1, 0); + RNA_def_property_ui_range(prop, 3, 512, 1, 0); RNA_def_property_ui_text(prop, "Steps", "Number of steps in the revolution"); RNA_def_property_update(prop, 0, "rna_Modifier_update"); diff --git a/source/blender/modifiers/intern/MOD_screw.c b/source/blender/modifiers/intern/MOD_screw.c index c5fdf465a0a..486c98f82a0 100644 --- a/source/blender/modifiers/intern/MOD_screw.c +++ b/source/blender/modifiers/intern/MOD_screw.c @@ -275,7 +275,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, if (fabsf(screw_ofs) <= (FLT_EPSILON*100.0f) && fabsf(fabsf(angle) - ((float)M_PI * 2.0f)) <= (FLT_EPSILON*100.0f)) { close= 1; step_tot--; - if(step_tot < 2) step_tot= 2; + if(step_tot < 3) step_tot= 3; maxVerts = totvert * step_tot; /* -1 because we're joining back up */ maxEdges = (totvert * step_tot) + /* these are the edges between new verts */ @@ -286,7 +286,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, } else { close= 0; - if(step_tot < 2) step_tot= 2; + if(step_tot < 3) step_tot= 3; maxVerts = totvert * step_tot; /* -1 because we're joining back up */ maxEdges = (totvert * (step_tot-1)) + /* these are the edges between new verts */ From 7f5c5f8ecaf6d366293cadbd8db08d4516a9499f Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Sun, 4 Sep 2011 11:38:53 +0000 Subject: [PATCH 063/182] Fix #28500: Reshape in multires modifier makes blender crash Multires doesn't store displacement for base mesh and reshaping when multires subdivision level is set to zero is crappy. Add report that reshape can't work with base level and cancel reshape operator. --- source/blender/editors/object/object_modifier.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c index c96d7c1fd10..8813b0027cd 100644 --- a/source/blender/editors/object/object_modifier.c +++ b/source/blender/editors/object/object_modifier.c @@ -1066,7 +1066,12 @@ static int multires_reshape_exec(bContext *C, wmOperator *op) if (!mmd) return OPERATOR_CANCELLED; - + + if(mmd->lvl==0) { + BKE_report(op->reports, RPT_ERROR, "Reshape can work only with higher levels of subdivisions."); + return OPERATOR_CANCELLED; + } + CTX_DATA_BEGIN(C, Object*, selob, selected_editable_objects) { if(selob->type == OB_MESH && selob != ob) { secondob= selob; From 1cada203bcae3a65f34e5631f8e8e1ae22ce4415 Mon Sep 17 00:00:00 2001 From: Nathan Letwory Date: Sun, 4 Sep 2011 14:31:23 +0000 Subject: [PATCH 064/182] [#27884] Collada import: materials mismatch when 2 instance_geometry reference the same material Reported by David Roy Multi-materials used on different meshes would get ignored (resulting in white faces in textured view). --- source/blender/collada/MeshImporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/collada/MeshImporter.cpp b/source/blender/collada/MeshImporter.cpp index e9086f05628..01eff8069c1 100644 --- a/source/blender/collada/MeshImporter.cpp +++ b/source/blender/collada/MeshImporter.cpp @@ -796,7 +796,7 @@ MTFace *MeshImporter::assign_material_to_geom(COLLADAFW::MaterialBinding cmateri std::multimap::iterator it; it=materials_mapped_to_geom.find(*geom_uid); while(it!=materials_mapped_to_geom.end()) { - if(it->second == ma_uid) return NULL; // do nothing if already found + if(it->second == ma_uid && it->first == *geom_uid) return NULL; // do nothing if already found it++; } // first time we get geom_uid, ma_uid pair. Save for later check. From f1eab8e85365a91592bf0f369d173e4b9854619d Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Sun, 4 Sep 2011 15:53:12 +0000 Subject: [PATCH 065/182] Fix #28503: Selecting a Grease Pencil from the Properties panel does not update 3D View Added missing notifiers. --- source/blender/makesrna/intern/rna_nodetree.c | 1 + source/blender/makesrna/intern/rna_object.c | 1 + source/blender/makesrna/intern/rna_scene.c | 1 + source/blender/makesrna/intern/rna_space.c | 1 + 4 files changed, 4 insertions(+) diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index 56492a52da9..d6e475fdbad 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -2736,6 +2736,7 @@ static void rna_def_nodetree(BlenderRNA *brna) RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_struct_type(prop, "GreasePencil"); RNA_def_property_ui_text(prop, "Grease Pencil Data", "Grease Pencil datablock"); + RNA_def_property_update(prop, NC_NODE, NULL); prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE); RNA_def_property_clear_flag(prop, PROP_EDITABLE); diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c index ad323b0aba4..4e2be7682f8 100644 --- a/source/blender/makesrna/intern/rna_object.c +++ b/source/blender/makesrna/intern/rna_object.c @@ -2297,6 +2297,7 @@ static void rna_def_object(BlenderRNA *brna) RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_struct_type(prop, "GreasePencil"); RNA_def_property_ui_text(prop, "Grease Pencil Data", "Grease Pencil datablock"); + RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL); /* pose */ prop= RNA_def_property(srna, "pose_library", PROP_POINTER, PROP_NONE); diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index cc1e7d9390b..3c60a3b4cd7 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -3517,6 +3517,7 @@ void RNA_def_scene(BlenderRNA *brna) RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_struct_type(prop, "GreasePencil"); RNA_def_property_ui_text(prop, "Grease Pencil Data", "Grease Pencil datablock"); + RNA_def_property_update(prop, NC_SCENE, NULL); /* Transform Orientations */ prop= RNA_def_property(srna, "orientations", PROP_COLLECTION, PROP_NONE); diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index 7a7debe1bf5..35360910015 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -1622,6 +1622,7 @@ static void rna_def_space_image(BlenderRNA *brna) RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_struct_type(prop, "GreasePencil"); RNA_def_property_ui_text(prop, "Grease Pencil", "Grease pencil data for this space"); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL); prop= RNA_def_property(srna, "use_grease_pencil", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", SI_DISPGP); From 5c5b9cf4d793e4169147201dae701ab7aef36c86 Mon Sep 17 00:00:00 2001 From: Nathan Letwory Date: Sun, 4 Sep 2011 22:14:28 +0000 Subject: [PATCH 066/182] Remove NULL-checks, as they might cause infinite loops while reading a DAE containing unsupported data, i.e. geometry. --- source/blender/collada/DocumentImporter.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/source/blender/collada/DocumentImporter.cpp b/source/blender/collada/DocumentImporter.cpp index 3a92c95e7ee..1a91e185bac 100644 --- a/source/blender/collada/DocumentImporter.cpp +++ b/source/blender/collada/DocumentImporter.cpp @@ -410,18 +410,15 @@ void DocumentImporter::write_node (COLLADAFW::Node *node, COLLADAFW::Node *paren while (geom_done < geom.getCount()) { ob = mesh_importer.create_mesh_object(node, geom[geom_done], false, uid_material_map, material_texture_mapping_map); - if ( ob != NULL ) - ++geom_done; + ++geom_done; } while (camera_done < camera.getCount()) { ob = create_camera_object(camera[camera_done], sce); - if ( ob != NULL ) - ++camera_done; + ++camera_done; } while (lamp_done < lamp.getCount()) { ob = create_lamp_object(lamp[lamp_done], sce); - if ( ob != NULL ) - ++lamp_done; + ++lamp_done; } while (controller_done < controller.getCount()) { COLLADAFW::InstanceGeometry *geom = (COLLADAFW::InstanceGeometry*)controller[controller_done]; From 57411d1c5f1e1043643bf7e5dbd98803c8ff7311 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 5 Sep 2011 03:09:49 +0000 Subject: [PATCH 067/182] minor edits. - init proximity to 1.0f - min/max proximity dist were not being copied. - minor edits to comments - use ascii chars in a few places. --- source/blender/makesdna/DNA_modifier_types.h | 44 ++++++++----------- source/blender/makesrna/intern/rna_modifier.c | 12 ++--- .../modifiers/intern/MOD_weightvg_util.c | 28 ++++++------ .../modifiers/intern/MOD_weightvg_util.h | 11 ++--- .../modifiers/intern/MOD_weightvgedit.c | 9 ++-- .../modifiers/intern/MOD_weightvgmix.c | 11 +++-- .../modifiers/intern/MOD_weightvgproximity.c | 12 ++--- 7 files changed, 61 insertions(+), 66 deletions(-) diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index 83b82972cef..d3c3ba2f93b 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -790,16 +790,13 @@ typedef enum { typedef struct WeightVGEditModifierData { ModifierData modifier; - /* XXX Note: I tried to keep everything logically ordered – provided the - * alignment constraints… - */ + /* Note: I tried to keep everything logically ordered - provided the + * alignment constraints... */ char defgrp_name[32]; /* Name of vertex group to edit. */ - /* Flags (MOD_WVG_EDIT_MAP, MOD_WVG_EDIT_CMAP, MOD_WVG_EDIT_REVERSE_WEIGHTS, - * MOD_WVG_EDIT_ADD2VG, MOD_WVG_EDIT_REMFVG, MOD_WVG_EDIT_CLAMP). - */ - int edit_flags; + short edit_flags; /* using MOD_WVG_EDIT_* flags */ + short pad1; float default_weight; /* Weight for vertices not in vgroup. */ /* Mapping stuff. */ @@ -809,7 +806,7 @@ typedef struct WeightVGEditModifierData { float add_threshold, rem_threshold; /* Masking options. */ - float mask_constant; /* The global “influence”, if no vgroup nor tex is used as mask. */ + float mask_constant; /* The global "influence", if no vgroup nor tex is used as mask. */ /* Name of mask vertex group from which to get weight factors. */ char mask_defgrp_name[32]; @@ -817,10 +814,9 @@ typedef struct WeightVGEditModifierData { int mask_tex_use_channel; /* Which channel to use as weightf. */ struct Tex *mask_texture; /* The texture. */ struct Object *mask_tex_map_obj; /* Name of the map object. */ - /* How to map the texture (using MOD_DISP_MAP_xxx constants). */ + /* How to map the texture (using MOD_DISP_MAP_* constants). */ int mask_tex_mapping; char mask_tex_uvlayer_name[32]; /* Name of the UV layer. */ - /* Padding… */ int pad_i1; } WeightVGEditModifierData; @@ -843,21 +839,19 @@ typedef struct WeightVGMixModifierData { ModifierData modifier; /* XXX Note: I tried to keep everything logically ordered – provided the - * alignment constraints… - */ + * alignment constraints... */ char defgrp_name[32]; /* Name of vertex group to modify/weight. */ char defgrp_name2[32]; /* Name of other vertex group to mix in. */ float default_weight; /* Default weight value for first vgroup. */ float default_weight2; /* Default weight value to mix in. */ - char mix_mode; /* How second vgroup’s weights affect first ones */ + char mix_mode; /* How second vgroups weights affect first ones */ char mix_set; /* What vertices to affect. */ - char pad_c1, pad_c2; - int pad_i1; + char pad[6]; /* Masking options. */ - float mask_constant; /* The global “influence”, if no vgroup nor tex is used as mask. */ + float mask_constant; /* The global "influence", if no vgroup nor tex is used as mask. */ /* Name of mask vertex group from which to get weight factors. */ char mask_defgrp_name[32]; @@ -867,12 +861,11 @@ typedef struct WeightVGMixModifierData { struct Object *mask_tex_map_obj; /* Name of the map object. */ int mask_tex_mapping; /* How to map the texture! */ char mask_tex_uvlayer_name[32]; /* Name of the UV layer. */ - /* Padding… */ - int pad_i2; + int pad2; } WeightVGMixModifierData; -/* How second vgroup’s weights affect first ones. */ +/* How second vgroup's weights affect first ones. */ #define MOD_WVG_MIX_SET 1 /* Second weights replace weights. */ #define MOD_WVG_MIX_ADD 2 /* Second weights are added to weights. */ #define MOD_WVG_MIX_SUB 3 /* Second weights are subtracted from weights. */ @@ -891,9 +884,8 @@ typedef struct WeightVGMixModifierData { typedef struct WeightVGProximityModifierData { ModifierData modifier; - /* XXX Note: I tried to keep everything logically ordered – provided the - * alignment constraints… - */ + /* Note: I tried to keep everything logically ordered - provided the + * alignment constraints... */ char defgrp_name[32]; /* Name of vertex group to modify/weight. */ @@ -901,11 +893,11 @@ typedef struct WeightVGProximityModifierData { int proximity_mode; int proximity_flags; - /* Target object from which to calculate vertices’ distances. */ + /* Target object from which to calculate vertices distances. */ struct Object *proximity_ob_target; /* Masking options. */ - float mask_constant; /* The global “influence”, if no vgroup nor tex is used as mask. */ + float mask_constant; /* The global "influence", if no vgroup nor tex is used as mask. */ /* Name of mask vertex group from which to get weight factors. */ char mask_defgrp_name[32]; @@ -918,8 +910,8 @@ typedef struct WeightVGProximityModifierData { float min_dist, max_dist; /* Distances mapping to 0.0/1.0 weights. */ - /* Padding… */ - int pad_i2; + /* Padding... */ + int pad; } WeightVGProximityModifierData; /* Modes of proximity weighting. */ diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index b30c4f84a9e..8dff0e376cb 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -2642,7 +2642,7 @@ static void rna_def_modifier_weightvgedit(BlenderRNA *brna) RNA_def_property_float_sdna(prop, NULL, "add_threshold"); RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0); - RNA_def_property_ui_text(prop, "Add Threshold", "Lower bound for a vertex’s weight " + RNA_def_property_ui_text(prop, "Add Threshold", "Lower bound for a vertex's weight " "to be added to the vgroup."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); @@ -2650,7 +2650,7 @@ static void rna_def_modifier_weightvgedit(BlenderRNA *brna) RNA_def_property_float_sdna(prop, NULL, "rem_threshold"); RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0); - RNA_def_property_ui_text(prop, "Rem Threshold", "Upper bound for a vertex’s weight " + RNA_def_property_ui_text(prop, "Rem Threshold", "Upper bound for a vertex's weight " "to be removed from the vgroup."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); @@ -2746,7 +2746,7 @@ static void rna_def_modifier_weightvgproximity(BlenderRNA *brna) {MOD_WVG_PROXIMITY_OBJECT, "OBJECT", 0, "Object Distance", "Use distance between affected and target objects."}, {MOD_WVG_PROXIMITY_GEOMETRY, "GEOMETRY", 0, "Geometry Distance", - "Use distance between affected object’s vertices and target object, or target object’s geometry."}, + "Use distance between affected object's vertices and target object, or target object's geometry."}, {0, NULL, 0, NULL, NULL}}; static EnumPropertyItem proximity_geometry_items[] = { @@ -2760,7 +2760,7 @@ static void rna_def_modifier_weightvgproximity(BlenderRNA *brna) srna= RNA_def_struct(brna, "WeightVGProximityModifier", "Modifier"); RNA_def_struct_ui_text(srna, "WeightVG Proximity Modifier", - "Set the weights of vertices in a group from a target object’s " + "Set the weights of vertices in a group from a target object's " "distance."); RNA_def_struct_sdna(srna, "WeightVGProximityModifierData"); RNA_def_struct_ui_icon(srna, ICON_MOD_WEIGHTVG); @@ -2780,12 +2780,12 @@ static void rna_def_modifier_weightvgproximity(BlenderRNA *brna) RNA_def_property_enum_sdna(prop, NULL, "proximity_flags"); RNA_def_property_enum_items(prop, proximity_geometry_items); RNA_def_property_flag(prop, PROP_ENUM_FLAG); /* important to run before default set */ - RNA_def_property_ui_text(prop, "Proximity Geometry", "Use shortest distance to target object’s geometry as weight"); + RNA_def_property_ui_text(prop, "Proximity Geometry", "Use shortest distance to target object's geometry as weight"); RNA_def_property_update(prop, 0, "rna_Modifier_update"); prop= RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "proximity_ob_target"); - RNA_def_property_ui_text(prop, "Target Object", "Object to calculate vertices’ distances from."); + RNA_def_property_ui_text(prop, "Target Object", "Object to calculate vertices distances from."); RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK); RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); diff --git a/source/blender/modifiers/intern/MOD_weightvg_util.c b/source/blender/modifiers/intern/MOD_weightvg_util.c index 43cc3081199..d688da4ba80 100644 --- a/source/blender/modifiers/intern/MOD_weightvg_util.c +++ b/source/blender/modifiers/intern/MOD_weightvg_util.c @@ -27,8 +27,8 @@ */ /* - * XXX I’d like to make modified weights visible in WeightPaint mode, - * but couldn’t figure a way to do this… + * XXX I'd like to make modified weights visible in WeightPaint mode, + * but couldn't figure a way to do this… * Maybe this will need changes in mesh_calc_modifiers (DerivedMesh.c)? * Or the WeightPaint mode code itself? */ @@ -61,9 +61,10 @@ * XXX The standard “factor” value is assumed in [0.0, 1.0] range. Else, weird results might appear. */ void weightvg_do_mask(int num, int *indices, float *org_w, float *new_w, Object *ob, - DerivedMesh *dm, float fact, const char *defgrp_name, Tex *texture, + DerivedMesh *dm, float fact, const char defgrp_name[32], Tex *texture, int tex_use_channel, int tex_mapping, Object *tex_map_object, - const char *tex_uvlayer_name) { + const char *tex_uvlayer_name) +{ int ref_didx; MDeformVert *dvert = NULL; int i; @@ -80,9 +81,9 @@ void weightvg_do_mask(int num, int *indices, float *org_w, float *new_w, Object float (*v_co)[3]; /* Use new generic get_texture_coords, but do not modify our DNA struct for it… - * XXX Why use a ModifierData stuff here ? Why not a simple, generic struct for parameters ? - * What e.g. if a modifier wants to use several textures ? - * Why use only v_co, and not MVert (or both) ? + * XXX Why use a ModifierData stuff here ? Why not a simple, generic struct for parameters ? + * What e.g. if a modifier wants to use several textures ? + * Why use only v_co, and not MVert (or both) ? */ t_map.texture = texture; t_map.map_object = tex_map_object; @@ -180,9 +181,10 @@ void weightvg_do_mask(int num, int *indices, float *org_w, float *new_w, Object * If indices is not NULL, it must be a table of same length as weights, mapping to the real * vertex index (in case the weight table does not cover the whole vertices...). */ -void weightvg_update_vg(MDeformVert *dvert, int defgrp_idx, int num, int *indices, - float *weights, int do_add, float add_thresh, int do_rem, - float rem_thresh){ +void weightvg_update_vg(MDeformVert *dvert, int defgrp_idx, int num, + const int *indices, const float *weights, int do_add, + float add_thresh, int do_rem, float rem_thresh) +{ int i; for (i = 0; i < num; i++) { @@ -195,8 +197,8 @@ void weightvg_update_vg(MDeformVert *dvert, int defgrp_idx, int num, int *indice /* Never allow weights out of [0.0, 1.0] range. */ CLAMP(w, 0.0, 1.0); - /* Let’s first check to see if this vert is already in the weight group – if so - * let’s update it, or remove it if needed. + /* Let's first check to see if this vert is already in the weight group – if so + * let's update it, or remove it if needed. */ for (j = 0; j < dv->totweight; j++) { /* If this weight corresponds to the deform group, update the value or, @@ -233,7 +235,7 @@ void weightvg_update_vg(MDeformVert *dvert, int defgrp_idx, int num, int *indice } } - /* If the vert wasn’t in the deform group, add it if needed! + /* If the vert wasn't in the deform group, add it if needed! */ if (add2vg && w > add_thresh) { newdw = MEM_callocN(sizeof(MDeformWeight)*(dv->totweight+1), "WeightVGEdit Modifier, deformWeight"); diff --git a/source/blender/modifiers/intern/MOD_weightvg_util.h b/source/blender/modifiers/intern/MOD_weightvg_util.h index 1bd40e3879f..b42e9c20035 100644 --- a/source/blender/modifiers/intern/MOD_weightvg_util.h +++ b/source/blender/modifiers/intern/MOD_weightvg_util.h @@ -44,8 +44,8 @@ struct Object; struct MappingInfoModifierData;*/ /* - * XXX I’d like to make modified weights visible in WeightPaint mode, - * but couldn’t figure a way to do this… + * XXX I'd like to make modified weights visible in WeightPaint mode, + * but couldn't figure a way to do this… * Maybe this will need changes in mesh_calc_modifiers (DerivedMesh.c)? * Or the WeightPaint mode code itself? */ @@ -68,7 +68,7 @@ struct MappingInfoModifierData;*/ * XXX The standard “factor” value is assumed in [0.0, 1.0] range. Else, weird results might appear. */ void weightvg_do_mask(int num, int *indices, float *org_w, float *new_w, Object *ob, - struct DerivedMesh *dm, float fact, const char *defgrp_name, Tex *texture, + struct DerivedMesh *dm, float fact, const char defgrp_name[32], Tex *texture, int tex_use_channel, int tex_mapping, Object *tex_map_object, const char *tex_uvlayer_name); @@ -76,7 +76,8 @@ void weightvg_do_mask(int num, int *indices, float *org_w, float *new_w, Object * If indices is not NULL, it must be a table of same length as weights, mapping to the real * vertex index (in case the weight table does not cover the whole vertices...). */ -void weightvg_update_vg(MDeformVert *dvert, int defgrp_idx, int num, int *indices, float *weights, - int do_add, float add_thresh, int do_rem, float rem_thresh); +void weightvg_update_vg(MDeformVert *dvert, int defgrp_idx, int num, + const int *indices, const float *weights, int do_add, + float add_thresh, int do_rem, float rem_thresh); #endif /* MOD_WEIGHTVG_UTIL_H */ diff --git a/source/blender/modifiers/intern/MOD_weightvgedit.c b/source/blender/modifiers/intern/MOD_weightvgedit.c index a1057bdbbbb..bcf2195d366 100644 --- a/source/blender/modifiers/intern/MOD_weightvgedit.c +++ b/source/blender/modifiers/intern/MOD_weightvgedit.c @@ -27,8 +27,8 @@ */ /* - * XXX I’d like to make modified weights visible in WeightPaint mode, - * but couldn’t figure a way to do this… + * XXX I'd like to make modified weights visible in WeightPaint mode, + * but couldn't figure a way to do this… * Maybe this will need changes in mesh_calc_modifiers (DerivedMesh.c)? * Or the WeightPaint mode code itself? */ @@ -102,8 +102,7 @@ static void copyData(ModifierData *md, ModifierData *target) twmd->mask_tex_use_channel = wmd->mask_tex_use_channel; twmd->mask_tex_mapping = wmd->mask_tex_mapping; twmd->mask_tex_map_obj = wmd->mask_tex_map_obj; - BLI_strncpy(twmd->mask_tex_uvlayer_name, wmd->mask_tex_uvlayer_name, - sizeof(twmd->mask_tex_uvlayer_name)); + BLI_strncpy(twmd->mask_tex_uvlayer_name, wmd->mask_tex_uvlayer_name, sizeof(twmd->mask_tex_uvlayer_name)); } static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md) @@ -232,7 +231,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der /* Create a copy of our dmesh, only if our affected cdata layer is the same as org mesh. */ if (dvert == CustomData_get_layer(&ob_m->vdata, CD_MDEFORMVERT)) { /* XXX Seems to create problems with weightpaint mode??? - * I’m missing something here, I guess… + * I'm missing something here, I guess… */ // DM_set_only_copy(dm, CD_MASK_MDEFORMVERT); /* Only copy defgroup layer. */ ret = CDDM_copy(dm); diff --git a/source/blender/modifiers/intern/MOD_weightvgmix.c b/source/blender/modifiers/intern/MOD_weightvgmix.c index 8b0e598962e..ba5ae5a2d70 100644 --- a/source/blender/modifiers/intern/MOD_weightvgmix.c +++ b/source/blender/modifiers/intern/MOD_weightvgmix.c @@ -27,8 +27,8 @@ */ /* - * XXX I’d like to make modified weights visible in WeightPaint mode, - * but couldn’t figure a way to do this… + * XXX I'd like to make modified weights visible in WeightPaint mode, + * but couldn't figure a way to do this… * Maybe this will need changes in mesh_calc_modifiers (DerivedMesh.c)? * Or the WeightPaint mode code itself? */ @@ -61,7 +61,7 @@ static float mix_weight(float weight, float weight2, char mix_mode) { #if 0 /* - * XXX Don’t know why, but the switch version takes many CPU time, + * XXX Don't know why, but the switch version takes many CPU time, * and produces lag in realtime playback… */ switch (mix_mode) @@ -146,8 +146,7 @@ static void copyData(ModifierData *md, ModifierData *target) twmd->mask_tex_use_channel = wmd->mask_tex_use_channel; twmd->mask_tex_mapping = wmd->mask_tex_mapping; twmd->mask_tex_map_obj = wmd->mask_tex_map_obj; - BLI_strncpy(twmd->mask_tex_uvlayer_name, wmd->mask_tex_uvlayer_name, - sizeof(twmd->mask_tex_uvlayer_name)); + BLI_strncpy(twmd->mask_tex_uvlayer_name, wmd->mask_tex_uvlayer_name, sizeof(twmd->mask_tex_uvlayer_name)); } static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md) @@ -279,7 +278,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der /* Create a copy of our dmesh, only if our affected cdata layer is the same as org mesh. */ if (dvert == CustomData_get_layer(&ob_m->vdata, CD_MDEFORMVERT)) { /* XXX Seems to create problems with weightpaint mode??? - * I’m missing something here, I guess… + * I'm missing something here, I guess… */ // DM_set_only_copy(dm, CD_MASK_MDEFORMVERT); /* Only copy defgroup layer. */ ret = CDDM_copy(dm); diff --git a/source/blender/modifiers/intern/MOD_weightvgproximity.c b/source/blender/modifiers/intern/MOD_weightvgproximity.c index c4f0c2b214c..1acb3035d2a 100644 --- a/source/blender/modifiers/intern/MOD_weightvgproximity.c +++ b/source/blender/modifiers/intern/MOD_weightvgproximity.c @@ -27,8 +27,8 @@ */ /* - * XXX I’d like to make modified weights visible in WeightPaint mode, - * but couldn’t figure a way to do this… + * XXX I'd like to make modified weights visible in WeightPaint mode, + * but couldn't figure a way to do this… * Maybe this will need changes in mesh_calc_modifiers (DerivedMesh.c)? * Or the WeightPaint mode code itself? */ @@ -234,6 +234,7 @@ static void initData(ModifierData *md) wmd->mask_constant = 1.0f; wmd->mask_tex_use_channel = MOD_WVG_MASK_TEX_USE_INT; /* Use intensity by default. */ wmd->mask_tex_mapping = MOD_DISP_MAP_LOCAL; + wmd->max_dist = 1.0f; /* vert arbitrary distance, but don't use 0 */ } static void copyData(ModifierData *md, ModifierData *target) @@ -252,8 +253,9 @@ static void copyData(ModifierData *md, ModifierData *target) twmd->mask_tex_use_channel = wmd->mask_tex_use_channel; twmd->mask_tex_mapping = wmd->mask_tex_mapping; twmd->mask_tex_map_obj = wmd->mask_tex_map_obj; - BLI_strncpy(twmd->mask_tex_uvlayer_name, wmd->mask_tex_uvlayer_name, - sizeof(twmd->mask_tex_uvlayer_name)); + BLI_strncpy(twmd->mask_tex_uvlayer_name, wmd->mask_tex_uvlayer_name, sizeof(twmd->mask_tex_uvlayer_name)); + twmd->min_dist = wmd->min_dist; + twmd->max_dist = wmd->max_dist; } static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md) @@ -396,7 +398,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der /* Create a copy of our dmesh, only if our affected cdata layer is the same as org mesh. */ if (dvert == CustomData_get_layer(&ob_m->vdata, CD_MDEFORMVERT)) { /* XXX Seems to create problems with weightpaint mode??? - * I’m missing something here, I guess… + * I'm missing something here, I guess… */ // DM_set_only_copy(dm, CD_MASK_MDEFORMVERT); /* Only copy defgroup layer. */ ret = CDDM_copy(dm); From 5fd8ffd242da37ff12e56b05b0e44b0053e5143b Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 5 Sep 2011 03:26:49 +0000 Subject: [PATCH 068/182] - mask_tex_map_obj --> mask_tex_map_object - dont allow negative min distances --- .../scripts/startup/bl_ui/properties_data_modifier.py | 2 +- source/blender/makesrna/intern/rna_modifier.c | 11 ++++++----- source/blender/modifiers/intern/MOD_weightvg_util.c | 1 - source/blender/modifiers/intern/MOD_weightvgedit.c | 1 - source/blender/modifiers/intern/MOD_weightvgmix.c | 1 - .../blender/modifiers/intern/MOD_weightvgproximity.c | 1 - 6 files changed, 7 insertions(+), 10 deletions(-) diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py index 6370cc8942a..4e1056549a7 100644 --- a/release/scripts/startup/bl_ui/properties_data_modifier.py +++ b/release/scripts/startup/bl_ui/properties_data_modifier.py @@ -764,7 +764,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel): col.prop(md, "mask_tex_use_channel", text="") if md.mask_tex_mapping == 'OBJECT': - layout.prop(md, "mask_tex_map_obj", text="Object") + layout.prop(md, "mask_tex_map_object", text="Object") elif md.mask_tex_mapping == 'UV' and ob.type == 'MESH': layout.prop_search(md, "mask_tex_uv_layer", ob.data, "uv_textures") diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index 8dff0e376cb..a071284467b 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -2542,7 +2542,8 @@ static void rna_def_modifier_weightvg_mask(BlenderRNA *brna, StructRNA *srna) RNA_def_property_string_funcs(prop, NULL, NULL, "rna_WeightVGModifier_mask_uvlayer_set"); RNA_def_property_update(prop, 0, "rna_Modifier_update"); - prop= RNA_def_property(srna, "mask_tex_map_obj", PROP_POINTER, PROP_NONE); + prop= RNA_def_property(srna, "mask_tex_map_object", PROP_POINTER, PROP_NONE); + RNA_def_property_pointer_sdna(prop, NULL, "mask_tex_map_obj"); RNA_def_property_ui_text(prop, "Texture Coordinate Object", "Which object to take texture " "coordinates from."); RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK); @@ -2790,14 +2791,14 @@ static void rna_def_modifier_weightvgproximity(BlenderRNA *brna) RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update"); prop= RNA_def_property(srna, "min_dist", PROP_FLOAT, PROP_NONE); - RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); - RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0); + RNA_def_property_range(prop, 0.0, FLT_MAX); + RNA_def_property_ui_range(prop, 0.0, 1000.0, 10, 0); RNA_def_property_ui_text(prop, "Lowest Dist", "Distance mapping to weight 0.0."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); prop= RNA_def_property(srna, "max_dist", PROP_FLOAT, PROP_NONE); - RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); - RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0); + RNA_def_property_range(prop, 0.0, FLT_MAX); + RNA_def_property_ui_range(prop, 0.0, 1000.0, 10, 0); RNA_def_property_ui_text(prop, "Highest Dist", "Distance mapping to weight 1.0."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); diff --git a/source/blender/modifiers/intern/MOD_weightvg_util.c b/source/blender/modifiers/intern/MOD_weightvg_util.c index d688da4ba80..dc6ec638b4c 100644 --- a/source/blender/modifiers/intern/MOD_weightvg_util.c +++ b/source/blender/modifiers/intern/MOD_weightvg_util.c @@ -250,4 +250,3 @@ void weightvg_update_vg(MDeformVert *dvert, int defgrp_idx, int num, } } } - diff --git a/source/blender/modifiers/intern/MOD_weightvgedit.c b/source/blender/modifiers/intern/MOD_weightvgedit.c index bcf2195d366..55f8716e0b0 100644 --- a/source/blender/modifiers/intern/MOD_weightvgedit.c +++ b/source/blender/modifiers/intern/MOD_weightvgedit.c @@ -328,4 +328,3 @@ ModifierTypeInfo modifierType_WeightVGEdit = { /* foreachIDLink */ foreachIDLink, /* foreachTexLink */ foreachTexLink, }; - diff --git a/source/blender/modifiers/intern/MOD_weightvgmix.c b/source/blender/modifiers/intern/MOD_weightvgmix.c index ba5ae5a2d70..a26a3d1e7f4 100644 --- a/source/blender/modifiers/intern/MOD_weightvgmix.c +++ b/source/blender/modifiers/intern/MOD_weightvgmix.c @@ -463,4 +463,3 @@ ModifierTypeInfo modifierType_WeightVGMix = { /* foreachIDLink */ foreachIDLink, /* foreachTexLink */ foreachTexLink, }; - diff --git a/source/blender/modifiers/intern/MOD_weightvgproximity.c b/source/blender/modifiers/intern/MOD_weightvgproximity.c index 1acb3035d2a..3bd39b0417f 100644 --- a/source/blender/modifiers/intern/MOD_weightvgproximity.c +++ b/source/blender/modifiers/intern/MOD_weightvgproximity.c @@ -559,4 +559,3 @@ ModifierTypeInfo modifierType_WeightVGProximity = { /* foreachIDLink */ foreachIDLink, /* foreachTexLink */ foreachTexLink, }; - From 1ba71e2caf0f7e425eaefc24891a1752247ef6bd Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 5 Sep 2011 03:53:26 +0000 Subject: [PATCH 069/182] change proximity method since minimum distance of 0.0 wasnt working at all. --- .../blender/modifiers/intern/MOD_weightvgproximity.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/source/blender/modifiers/intern/MOD_weightvgproximity.c b/source/blender/modifiers/intern/MOD_weightvgproximity.c index 3bd39b0417f..6519d781f05 100644 --- a/source/blender/modifiers/intern/MOD_weightvgproximity.c +++ b/source/blender/modifiers/intern/MOD_weightvgproximity.c @@ -205,11 +205,13 @@ static float get_ob2ob_distance(const Object* ob, const Object* obr) */ void do_map(float *weights, const int nidx, const float min_d, const float max_d) { - int i; - float b = min_d / (min_d - max_d); - float a = -b / min_d; - for (i = 0; i < nidx; i++) - weights[i] = a * weights[i] + b; + const float range_inv= 1.0f / (max_d - min_d); /* invert since multiplication is faster */ + unsigned int i= nidx; + while (i-- > 0) { + if (weights[i] >= max_d) weights[i]= 1.0f; /* most likely case first */ + else if(weights[i] <= min_d) weights[i]= 0.0f; + else weights[i]= (weights[i] - min_d) * range_inv; + } } /*a min_d + b = 0.0*/ From e8346fa84c68005a508b290cf3d255f4004157f1 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 5 Sep 2011 04:00:08 +0000 Subject: [PATCH 070/182] simplify get_vert2ob_distance, mat4_to_loc_rot_size isnt needed. --- .../modifiers/intern/MOD_weightvgproximity.c | 20 ++++++------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/source/blender/modifiers/intern/MOD_weightvgproximity.c b/source/blender/modifiers/intern/MOD_weightvgproximity.c index 6519d781f05..36f749ab506 100644 --- a/source/blender/modifiers/intern/MOD_weightvgproximity.c +++ b/source/blender/modifiers/intern/MOD_weightvgproximity.c @@ -169,25 +169,17 @@ static void get_vert2geom_distance(int numVerts, float (*v_cos)[3], * Note that it works in final world space (i.e. with constraints etc. applied). */ static void get_vert2ob_distance(int numVerts, float (*v_cos)[3], float *dist, - const Object* ob, const Object* obr) + Object* ob, Object* obr) { /* Vertex and ref object coordinates. */ - float v_wco[3], - or_wco[3], - or_wro[3][3], /*unused*/ - or_wsz[3]; /*unused*/ - int i; + float v_wco[3]; + unsigned int i= numVerts; - /* Get world-coordinates of the reference object (constraints and anim included). - * We also get rotation and scale, even though we do not want them… - */ - mat4_to_loc_rot_size(or_wco, or_wro, or_wsz, (float (*)[4])obr->obmat); - - for (i = 0; i < numVerts; i++) { + while(i-- > 0) { /* Get world-coordinates of the vertex (constraints and anim included). */ - mul_v3_m4v3(v_wco, (float (*)[4])ob->obmat, v_cos[i]); + mul_v3_m4v3(v_wco, ob->obmat, v_cos[i]); /* Return distance between both coordinates. */ - dist[i] = len_v3v3(v_wco, or_wco); + dist[i] = len_v3v3(v_wco, obr->obmat[3]); } } From 2c740a9b5e07faec543d30c85f16f6bbe6fa0c77 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 5 Sep 2011 04:53:23 +0000 Subject: [PATCH 071/182] rename vertex group mix "vgroup, vgroup2" to "vgroup_a, vgroup_b" also clamp more values between 0.0 and 1.0 --- .../startup/bl_ui/properties_data_modifier.py | 16 ++--- source/blender/makesdna/DNA_modifier_types.h | 16 ++--- source/blender/makesrna/intern/rna_modifier.c | 54 +++++++-------- .../modifiers/intern/MOD_weightvgmix.c | 68 ++++++++++--------- 4 files changed, 78 insertions(+), 76 deletions(-) diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py index 4e1056549a7..a7e87c6ab62 100644 --- a/release/scripts/startup/bl_ui/properties_data_modifier.py +++ b/release/scripts/startup/bl_ui/properties_data_modifier.py @@ -822,19 +822,19 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel): if ob.type == 'MESH': split = layout.split() col = split.column() - col.label(text="Vertex Group 1:") - col.prop_search(md, "vertex_group", ob, "vertex_groups", text="") - col.label(text="Default Weight 1:") - col.prop(md, "default_weight", text="") + col.label(text="Vertex Group A:") + col.prop_search(md, "vertex_group_a", ob, "vertex_groups", text="") + col.label(text="Default Weight A:") + col.prop(md, "default_weight_a", text="") col.label(text="Mix Mode:") col.prop(md, "mix_mode", text="") col = split.column() - col.label(text="Vertex Group 2:") - col.prop_search(md, "vertex_group2", ob, "vertex_groups", text="") - col.label(text="Default Weight 2:") - col.prop(md, "default_weight2", text="") + col.label(text="Vertex Group B:") + col.prop_search(md, "vertex_group_b", ob, "vertex_groups", text="") + col.label(text="Default Weight B:") + col.prop(md, "default_weight_b", text="") col.label(text="Mix Set:") col.prop(md, "mix_set", text="") diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index d3c3ba2f93b..1714ae2a018 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -841,10 +841,10 @@ typedef struct WeightVGMixModifierData { /* XXX Note: I tried to keep everything logically ordered – provided the * alignment constraints... */ - char defgrp_name[32]; /* Name of vertex group to modify/weight. */ - char defgrp_name2[32]; /* Name of other vertex group to mix in. */ - float default_weight; /* Default weight value for first vgroup. */ - float default_weight2; /* Default weight value to mix in. */ + char defgrp_name_a[32]; /* Name of vertex group to modify/weight. */ + char defgrp_name_b[32]; /* Name of other vertex group to mix in. */ + float default_weight_a; /* Default weight value for first vgroup. */ + float default_weight_b; /* Default weight value to mix in. */ char mix_mode; /* How second vgroups weights affect first ones */ char mix_set; /* What vertices to affect. */ @@ -876,10 +876,10 @@ typedef struct WeightVGMixModifierData { /* What vertices to affect. */ #define MOD_WVG_SET_ALL 1 /* Affect all vertices. */ -#define MOD_WVG_SET_ORG 2 /* Affect only vertices in first vgroup. */ -#define MOD_WVG_SET_NEW 3 /* Affect only vertices in second vgroup. */ -#define MOD_WVG_SET_UNION 4 /* Affect only vertices in one vgroup or the other. */ -#define MOD_WVG_SET_INTER 5 /* Affect only vertices in both vgroups. */ +#define MOD_WVG_SET_A 2 /* Affect only vertices in first vgroup. */ +#define MOD_WVG_SET_B 3 /* Affect only vertices in second vgroup. */ +#define MOD_WVG_SET_OR 4 /* Affect only vertices in one vgroup or the other. */ +#define MOD_WVG_SET_AND 5 /* Affect only vertices in both vgroups. */ typedef struct WeightVGProximityModifierData { ModifierData modifier; diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index a071284467b..169288cfed3 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -394,7 +394,7 @@ static void rna_WeightVGModifier_vgroup_set(PointerRNA *ptr, const char *value) } else if (md->type == eModifierType_WeightVGMix) { WeightVGMixModifierData *wmd= (WeightVGMixModifierData*)md; - rna_object_vgroup_name_set(ptr, value, wmd->defgrp_name, sizeof(wmd->defgrp_name)); + rna_object_vgroup_name_set(ptr, value, wmd->defgrp_name_a, sizeof(wmd->defgrp_name_a)); } else if (md->type == eModifierType_WeightVGProximity) { WeightVGProximityModifierData *wmd= (WeightVGProximityModifierData*)md; @@ -422,7 +422,7 @@ static void rna_WeightVGModifier_mask_vgroup_set(PointerRNA *ptr, const char *va static void rna_WeightVGMixModifier_vgroup2_set(PointerRNA *ptr, const char *value) { WeightVGMixModifierData *wmd= (WeightVGMixModifierData*)ptr->data; - rna_object_vgroup_name_set(ptr, value, wmd->defgrp_name2, sizeof(wmd->defgrp_name2)); + rna_object_vgroup_name_set(ptr, value, wmd->defgrp_name_b, sizeof(wmd->defgrp_name_b)); } static void rna_MappingInfo_uvlayer_set(PointerRNA *ptr, const char *value) @@ -2510,7 +2510,7 @@ static void rna_def_modifier_weightvg_mask(BlenderRNA *brna, StructRNA *srna) prop= RNA_def_property(srna, "mask_constant", PROP_FLOAT, PROP_NONE); RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); - RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0); + RNA_def_property_ui_range(prop, -1.0, 1.0, 10, 0); RNA_def_property_ui_text(prop, "Influence", "Global influence of current modifications on vgroup."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); @@ -2600,8 +2600,8 @@ static void rna_def_modifier_weightvgedit(BlenderRNA *brna) /* RNA_def_property_update(prop, 0, "rna_Modifier_update");*/ prop= RNA_def_property(srna, "default_weight", PROP_FLOAT, PROP_NONE); - RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); - RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0); + RNA_def_property_range(prop, 0.0, 1.0f); + RNA_def_property_ui_range(prop, 0.0, 1.0, 10, 0); RNA_def_property_ui_text(prop, "Default Weight", "Default weight a vertex will have if " "it is not in the vgroup."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); @@ -2641,16 +2641,16 @@ static void rna_def_modifier_weightvgedit(BlenderRNA *brna) prop= RNA_def_property(srna, "add_threshold", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "add_threshold"); - RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); - RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0); + RNA_def_property_range(prop, 0.0, 1.0); + RNA_def_property_ui_range(prop, 0.0, 1.0, 10, 0); RNA_def_property_ui_text(prop, "Add Threshold", "Lower bound for a vertex's weight " "to be added to the vgroup."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); prop= RNA_def_property(srna, "remove_threshold", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "rem_threshold"); - RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); - RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0); + RNA_def_property_range(prop, 0.0, 1.0); + RNA_def_property_ui_range(prop, 0.0, 1.0, 10, 0); RNA_def_property_ui_text(prop, "Rem Threshold", "Upper bound for a vertex's weight " "to be removed from the vgroup."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); @@ -2685,10 +2685,10 @@ static void rna_def_modifier_weightvgmix(BlenderRNA *brna) static EnumPropertyItem weightvg_mix_set_items[] = { {MOD_WVG_SET_ALL, "ALL", 0, "All vertices", ""}, - {MOD_WVG_SET_ORG, "ORG", 0, "Vertices from vgroup 1", ""}, - {MOD_WVG_SET_NEW, "NEW", 0, "Vertices from vgroup 2", ""}, - {MOD_WVG_SET_UNION, "UNION", 0, "Vertices from one group", ""}, - {MOD_WVG_SET_INTER, "INTER", 0, "Vertices from both groups", ""}, + {MOD_WVG_SET_A, "A", 0, "Vertices from group A", ""}, + {MOD_WVG_SET_B, "B", 0, "Vertices from group B", ""}, + {MOD_WVG_SET_OR, "OR", 0, "Vertices from one group", ""}, + {MOD_WVG_SET_AND, "AND", 0, "Vertices from both groups", ""}, {0, NULL, 0, NULL, NULL}}; StructRNA *srna; @@ -2700,29 +2700,29 @@ static void rna_def_modifier_weightvgmix(BlenderRNA *brna) RNA_def_struct_sdna(srna, "WeightVGMixModifierData"); RNA_def_struct_ui_icon(srna, ICON_MOD_WEIGHTVG); - prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE); - RNA_def_property_string_sdna(prop, NULL, "defgrp_name"); - RNA_def_property_ui_text(prop, "Vertex Group", "First vertex group name."); + prop= RNA_def_property(srna, "vertex_group_a", PROP_STRING, PROP_NONE); + RNA_def_property_string_sdna(prop, NULL, "defgrp_name_a"); + RNA_def_property_ui_text(prop, "Vertex Group A", "First vertex group name."); RNA_def_property_string_funcs(prop, NULL, NULL, "rna_WeightVGModifier_vgroup_set"); RNA_def_property_update(prop, 0, "rna_Modifier_update"); - prop= RNA_def_property(srna, "vertex_group2", PROP_STRING, PROP_NONE); - RNA_def_property_string_sdna(prop, NULL, "defgrp_name2"); - RNA_def_property_ui_text(prop, "Vertex Group 2", "Second vertex group name."); + prop= RNA_def_property(srna, "vertex_group_b", PROP_STRING, PROP_NONE); + RNA_def_property_string_sdna(prop, NULL, "defgrp_name_b"); + RNA_def_property_ui_text(prop, "Vertex Group B", "Second vertex group name."); RNA_def_property_string_funcs(prop, NULL, NULL, "rna_WeightVGMixModifier_vgroup2_set"); RNA_def_property_update(prop, 0, "rna_Modifier_update"); - prop= RNA_def_property(srna, "default_weight", PROP_FLOAT, PROP_NONE); - RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); - RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0); - RNA_def_property_ui_text(prop, "Default Weight", "Default weight a vertex will have if " + prop= RNA_def_property(srna, "default_weight_a", PROP_FLOAT, PROP_NONE); + RNA_def_property_range(prop, 0.0, 1.0f); + RNA_def_property_ui_range(prop, 0.0, 1.0, 10, 0); + RNA_def_property_ui_text(prop, "Default Weight A", "Default weight a vertex will have if " "it is not in the first vgroup."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); - prop= RNA_def_property(srna, "default_weight2", PROP_FLOAT, PROP_NONE); - RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); - RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0); - RNA_def_property_ui_text(prop, "Default Weight 2", "Default weight a vertex will have if " + prop= RNA_def_property(srna, "default_weight_b", PROP_FLOAT, PROP_NONE); + RNA_def_property_range(prop, 0.0, 1.0f); + RNA_def_property_ui_range(prop, 0.0, 1.0, 10, 0); + RNA_def_property_ui_text(prop, "Default Weight B", "Default weight a vertex will have if " "it is not in the second vgroup."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); diff --git a/source/blender/modifiers/intern/MOD_weightvgmix.c b/source/blender/modifiers/intern/MOD_weightvgmix.c index a26a3d1e7f4..ad70e8ab55c 100644 --- a/source/blender/modifiers/intern/MOD_weightvgmix.c +++ b/source/blender/modifiers/intern/MOD_weightvgmix.c @@ -118,10 +118,10 @@ static void initData(ModifierData *md) { WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md; - wmd->default_weight = 0.0; - wmd->default_weight2 = 0.0; + wmd->default_weight_a = 0.0f; + wmd->default_weight_b = 0.0f; wmd->mix_mode = MOD_WVG_MIX_SET; - wmd->mix_set = MOD_WVG_SET_INTER; + wmd->mix_set = MOD_WVG_SET_AND; wmd->mask_constant = 1.0f; wmd->mask_tex_use_channel = MOD_WVG_MASK_TEX_USE_INT; /* Use intensity by default. */ @@ -133,10 +133,10 @@ static void copyData(ModifierData *md, ModifierData *target) WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md; WeightVGMixModifierData *twmd = (WeightVGMixModifierData*) target; - BLI_strncpy(twmd->defgrp_name, wmd->defgrp_name, sizeof(twmd->defgrp_name)); - BLI_strncpy(twmd->defgrp_name2, wmd->defgrp_name2, sizeof(twmd->defgrp_name2)); - twmd->default_weight = wmd->default_weight; - twmd->default_weight2 = wmd->default_weight2; + BLI_strncpy(twmd->defgrp_name_a, wmd->defgrp_name_a, sizeof(twmd->defgrp_name_a)); + BLI_strncpy(twmd->defgrp_name_b, wmd->defgrp_name_b, sizeof(twmd->defgrp_name_b)); + twmd->default_weight_a = wmd->default_weight_a; + twmd->default_weight_b = wmd->default_weight_b; twmd->mix_mode = wmd->mix_mode; twmd->mix_set = wmd->mix_set; @@ -217,7 +217,7 @@ static int isDisabled(ModifierData *md, int UNUSED(useRenderParams)) { WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md; /* If no vertex group, bypass. */ - return (wmd->defgrp_name == NULL); + return (wmd->defgrp_name_a == NULL); } static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *derivedData, @@ -248,12 +248,12 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der return dm; /* Get vgroup idx from its name. */ - defgrp_idx = defgroup_name_index(ob, wmd->defgrp_name); + defgrp_idx = defgroup_name_index(ob, wmd->defgrp_name_a); if (defgrp_idx < 0) return dm; /* Get seconf vgroup idx from its name, if given. */ - if (wmd->defgrp_name2[0] != (char)0) { - defgrp_idx2 = defgroup_name_index(ob, wmd->defgrp_name2); + if (wmd->defgrp_name_b[0] != (char)0) { + defgrp_idx2 = defgroup_name_index(ob, wmd->defgrp_name_b); if (defgrp_idx2 < 0) return dm; } @@ -305,7 +305,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der /* Find out which vertices to work on. */ tidx = MEM_mallocN(sizeof(int) * numVerts, "WeightVGMix Modifier, tidx"); switch (wmd->mix_set) { - case MOD_WVG_SET_ORG: + case MOD_WVG_SET_A: /* All vertices in first vgroup. */ for (i = 0; i < numVerts; i++) { for (j = 0; j < dvert[i].totweight; j++) { @@ -316,7 +316,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der } } break; - case MOD_WVG_SET_NEW: + case MOD_WVG_SET_B: /* All vertices in second vgroup. */ for (i = 0; i < numVerts; i++) { for (j = 0; j < dvert[i].totweight; j++) { @@ -327,7 +327,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der } } break; - case MOD_WVG_SET_UNION: + case MOD_WVG_SET_OR: /* All vertices in one vgroup or the other. */ for (i = 0; i < numVerts; i++) { for (j = 0; j < dvert[i].totweight; j++) { @@ -338,27 +338,29 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der } } break; - case MOD_WVG_SET_INTER: + case MOD_WVG_SET_AND: /* All vertices in both vgroups. */ for (i = 0; i < numVerts; i++) { - char idx1 = 0; - char idx2 = 0; + int idx1 = FALSE; + int idx2 = FALSE; for (j = 0; j < dvert[i].totweight; j++) { if(dvert[i].dw[j].def_nr == defgrp_idx) { - if (idx2) { + if (idx2 == TRUE) { tidx[numIdx++] = i; break; } - else - idx1 = 1; + else { + idx1 = TRUE; + } } else if(dvert[i].dw[j].def_nr == defgrp_idx2) { - if (idx1) { + if (idx1 == TRUE) { tidx[numIdx++] = i; break; } - else - idx2 = 1; + else { + idx2 = TRUE; + } } } } @@ -382,27 +384,27 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der /* Mix weights. */ for (i = 0; i < numIdx; i++) { float weight2 = 0.0; - char w1 = 0; - char w2 = 0; + int w1 = FALSE; + int w2 = FALSE; int idx = indices ? indices[i] : i; for (j = 0; j < dvert[idx].totweight; j++) { if(dvert[idx].dw[j].def_nr == defgrp_idx) { org_w[i] = dvert[idx].dw[j].weight; - w1 = 1; - if (w2) + w1 = TRUE; + if (w2 == TRUE) break; } else if(dvert[idx].dw[j].def_nr == defgrp_idx2) { weight2 = dvert[idx].dw[j].weight; - w2 = 1; - if (w1) + w2 = TRUE; + if (w1 == TRUE) break; } } - if (w1 == 0) - org_w[i] = wmd->default_weight; - if (w2 == 0) - weight2 = wmd->default_weight2; + if (w1 == FALSE) + org_w[i] = wmd->default_weight_a; + if (w2 == FALSE) + weight2 = wmd->default_weight_b; new_w[i] = mix_weight(org_w[i], weight2, wmd->mix_mode); } From e5209c205974b03f1090bf73414a82072a6a0d5b Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 5 Sep 2011 05:28:32 +0000 Subject: [PATCH 072/182] - vertex group modifiers isDisabled functions were incorrect, need to check if the string is set: == NULL will never be true. - was doing NULL checks on freeing memory in cases where the values were already accessed (blender would have crashed anyway), so remove the NULL checks. - use deform.c api weight functions to replace inline weight lookups in some cases. - change if checks in weightvg_do_mask() so its more obvious whats going on. --- .../modifiers/intern/MOD_weightvg_util.c | 50 +++++++++---------- .../modifiers/intern/MOD_weightvgedit.c | 35 ++++++------- .../modifiers/intern/MOD_weightvgmix.c | 15 +++--- .../modifiers/intern/MOD_weightvgproximity.c | 14 ++---- 4 files changed, 51 insertions(+), 63 deletions(-) diff --git a/source/blender/modifiers/intern/MOD_weightvg_util.c b/source/blender/modifiers/intern/MOD_weightvg_util.c index dc6ec638b4c..8952d70d323 100644 --- a/source/blender/modifiers/intern/MOD_weightvg_util.c +++ b/source/blender/modifiers/intern/MOD_weightvg_util.c @@ -66,7 +66,6 @@ void weightvg_do_mask(int num, int *indices, float *org_w, float *new_w, Object const char *tex_uvlayer_name) { int ref_didx; - MDeformVert *dvert = NULL; int i; /* If influence factor is null, nothing to do! */ @@ -139,16 +138,16 @@ void weightvg_do_mask(int num, int *indices, float *org_w, float *new_w, Object } MEM_freeN(tex_co); - return; } + else if ((ref_didx = defgroup_name_index(ob, defgrp_name)) != -1) { + MDeformVert *dvert = NULL; - /* Check whether we want to set vgroup weights from a constant weight factor or a vertex - * group. - */ - /* Get vgroup idx from its name. */ - ref_didx = defgroup_name_index(ob, defgrp_name); - /* Proceed only if vgroup is valid, else use constant factor. */ - if (ref_didx >= 0) { + /* Check whether we want to set vgroup weights from a constant weight factor or a vertex + * group. + */ + /* Get vgroup idx from its name. */ + + /* Proceed only if vgroup is valid, else use constant factor. */ /* Get actual dverts (ie vertex group data). */ dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT); /* Proceed only if vgroup is valid, else assume factor = O. */ @@ -157,23 +156,18 @@ void weightvg_do_mask(int num, int *indices, float *org_w, float *new_w, Object /* For each weight (vertex), make the mix between org and new weights. */ for (i = 0; i < num; i++) { int idx = indices ? indices[i] : i; - int j; - for (j = 0; j < dvert[idx].totweight; j++) { - if(dvert[idx].dw[j].def_nr == ref_didx) { - float f = dvert[idx].dw[j].weight * fact; - org_w[i] = (new_w[i] * f) + (org_w[i] * (1.0-f)); - break; - } - } + const float f= defvert_find_weight(&dvert[idx], ref_didx) * fact; + org_w[i] = (new_w[i] * f) + (org_w[i] * (1.0f-f)); /* If that vertex is not in ref vgroup, assume null factor, and hence do nothing! */ } - return; } - - /* Default "influence" behavior. */ - /* For each weight (vertex), make the mix between org and new weights. */ - for (i = 0; i < num; i++) { - org_w[i] = (new_w[i] * fact) + (org_w[i] * (1.0-fact)); + else { + /* Default "influence" behavior. */ + /* For each weight (vertex), make the mix between org and new weights. */ + const float ifact= 1.0-fact; + for (i = 0; i < num; i++) { + org_w[i] = (new_w[i] * fact) + (org_w[i] * ifact); + } } } @@ -189,7 +183,7 @@ void weightvg_update_vg(MDeformVert *dvert, int defgrp_idx, int num, for (i = 0; i < num; i++) { int j; - char add2vg = do_add; + int add2vg = do_add; float w = weights[i]; MDeformVert *dv = &dvert[indices ? indices[i] : i]; MDeformWeight *newdw; @@ -207,6 +201,8 @@ void weightvg_update_vg(MDeformVert *dvert, int defgrp_idx, int num, if (dv->dw[j].def_nr == defgrp_idx) { /* Remove the vertex from this vgroup if needed. */ if (do_rem && w < rem_thresh) { + /* TODO, move this into deform.c to make into a generic function */ + dv->totweight--; /* If there are still other deform weights attached to this vert then remove * this deform weight, and reshuffle the others. @@ -230,14 +226,16 @@ void weightvg_update_vg(MDeformVert *dvert, int defgrp_idx, int num, else { dv->dw[j].weight = w; } - add2vg = 0; + add2vg = FALSE; break; } } /* If the vert wasn't in the deform group, add it if needed! */ - if (add2vg && w > add_thresh) { + if ((add2vg == TRUE) && w > add_thresh) { + /* TODO, mvoe into deform.c and make into a generic function, this assumes the vertex + * groups have already been checked, so this has to remain low level */ newdw = MEM_callocN(sizeof(MDeformWeight)*(dv->totweight+1), "WeightVGEdit Modifier, deformWeight"); if(dv->dw) { memcpy(newdw, dv->dw, sizeof(MDeformWeight)*dv->totweight); diff --git a/source/blender/modifiers/intern/MOD_weightvgedit.c b/source/blender/modifiers/intern/MOD_weightvgedit.c index 55f8716e0b0..87747f255fd 100644 --- a/source/blender/modifiers/intern/MOD_weightvgedit.c +++ b/source/blender/modifiers/intern/MOD_weightvgedit.c @@ -173,7 +173,7 @@ static int isDisabled(ModifierData *md, int UNUSED(useRenderParams)) { WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md; /* If no vertex group, bypass. */ - return (wmd->defgrp_name == NULL); + return (wmd->defgrp_name[0] == '\0'); } static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *derivedData, @@ -185,17 +185,16 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der Mesh *ob_m = NULL; #endif MDeformVert *dvert = NULL; - float *org_w = NULL; /* Array original weights. */ - float *new_w = NULL; /* Array new weights. */ + float *org_w; /* Array original weights. */ + float *new_w; /* Array new weights. */ int numVerts; int defgrp_idx; int i; char rel_ret = 0; /* Boolean, whether we have to release ret dm or not, when not using it! */ - float *mapf = NULL; /* Cache for mapping factors. */ /* Flags. */ - char do_map = wmd->edit_flags & MOD_WVG_EDIT_CMAP; - char do_add = wmd->edit_flags & MOD_WVG_EDIT_ADD2VG; - char do_rem = wmd->edit_flags & MOD_WVG_EDIT_REMFVG; + int do_map = (wmd->edit_flags & MOD_WVG_EDIT_CMAP) != 0; + int do_add = (wmd->edit_flags & MOD_WVG_EDIT_ADD2VG) != 0; + int do_rem = (wmd->edit_flags & MOD_WVG_EDIT_REMFVG) != 0; /* Get number of verts. */ numVerts = dm->getNumVerts(dm); @@ -259,17 +258,17 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der org_w = MEM_mallocN(sizeof(float) * numVerts, "WeightVGEdit Modifier, org_w"); new_w = MEM_mallocN(sizeof(float) * numVerts, "WeightVGEdit Modifier, org_w"); for (i = 0; i < numVerts; i++) { - int j; + MDeformWeight *dw= defvert_find_index(&dvert[i], defgrp_idx); org_w[i] = new_w[i] = wmd->default_weight; - for (j = 0; j < dvert[i].totweight; j++) { - if(dvert[i].dw[j].def_nr == defgrp_idx) { - org_w[i] = new_w[i] = dvert[i].dw[j].weight; - break; - } + + if(dw) { + org_w[i] = new_w[i] = dw->weight; } + /* Do mapping. */ - if (do_map) + if (do_map) { new_w[i] = curvemapping_evaluateF(wmd->cmap_curve, 0, new_w[i]); + } } /* Do masking. */ @@ -282,12 +281,8 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der do_rem, wmd->rem_threshold); /* Freeing stuff. */ - if (org_w) - MEM_freeN(org_w); - if (new_w) - MEM_freeN(new_w); - if (mapf) - MEM_freeN(mapf); + MEM_freeN(org_w); + MEM_freeN(new_w); /* Return the vgroup-modified mesh. */ return ret; diff --git a/source/blender/modifiers/intern/MOD_weightvgmix.c b/source/blender/modifiers/intern/MOD_weightvgmix.c index ad70e8ab55c..a30afcb230f 100644 --- a/source/blender/modifiers/intern/MOD_weightvgmix.c +++ b/source/blender/modifiers/intern/MOD_weightvgmix.c @@ -217,7 +217,7 @@ static int isDisabled(ModifierData *md, int UNUSED(useRenderParams)) { WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md; /* If no vertex group, bypass. */ - return (wmd->defgrp_name_a == NULL); + return (wmd->defgrp_name_a[0] == '\0'); } static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *derivedData, @@ -231,8 +231,8 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der MDeformVert *dvert = NULL; int numVerts; int defgrp_idx, defgrp_idx2 = -1; - float *org_w = NULL; - float *new_w = NULL; + float *org_w; + float *new_w; int *tidx, *indices = NULL; int numIdx = 0; int i, j; @@ -416,13 +416,12 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der /* Update (add to) vgroup. * XXX Depending on the MOD_WVG_SET_xxx option chosen, we might have to add vertices to vgroup. */ - weightvg_update_vg(dvert, defgrp_idx, numIdx, indices, org_w, 1, -FLT_MAX, 0, 0.0f); + weightvg_update_vg(dvert, defgrp_idx, numIdx, indices, org_w, TRUE, -FLT_MAX, 0, 0.0f); /* Freeing stuff. */ - if (org_w) - MEM_freeN(org_w); - if (new_w) - MEM_freeN(new_w); + MEM_freeN(org_w); + MEM_freeN(new_w); + if (indices) MEM_freeN(indices); diff --git a/source/blender/modifiers/intern/MOD_weightvgproximity.c b/source/blender/modifiers/intern/MOD_weightvgproximity.c index 36f749ab506..513ba9c815f 100644 --- a/source/blender/modifiers/intern/MOD_weightvgproximity.c +++ b/source/blender/modifiers/intern/MOD_weightvgproximity.c @@ -327,7 +327,7 @@ static int isDisabled(ModifierData *md, int UNUSED(useRenderParams)) { WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) md; /* If no vertex group, bypass. */ - if (wmd->defgrp_name == NULL) return 1; + if (wmd->defgrp_name[0] == '\0') return 1; /* If no target object, bypass. */ return (wmd->proximity_ob_target == NULL); } @@ -505,14 +505,10 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der weightvg_update_vg(dvert, defgrp_idx, numIdx, indices, org_w, 0, 0.0f, 0, 0.0f); /* Freeing stuff. */ - if (org_w) - MEM_freeN(org_w); - if (new_w) - MEM_freeN(new_w); - if (indices) - MEM_freeN(indices); - if (v_cos) - MEM_freeN(v_cos); + MEM_freeN(org_w); + MEM_freeN(new_w); + MEM_freeN(indices); + MEM_freeN(v_cos); /* Return the vgroup-modified mesh. */ return ret; From 3b09c331faae4406d619bfb1fab28a01c77097b4 Mon Sep 17 00:00:00 2001 From: Daniel Salazar Date: Mon, 5 Sep 2011 05:42:49 +0000 Subject: [PATCH 073/182] Adding noise module by default in driver_namespace http://www.pasteall.org/blend/8677 --- source/blender/python/intern/bpy_driver.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/source/blender/python/intern/bpy_driver.c b/source/blender/python/intern/bpy_driver.c index d68fd9a9111..f3ef55d29c4 100644 --- a/source/blender/python/intern/bpy_driver.c +++ b/source/blender/python/intern/bpy_driver.c @@ -76,6 +76,13 @@ int bpy_pydriver_create_dict(void) Py_DECREF(mod); } + /* add noise to global namespace */ + mod= PyImport_ImportModuleLevel((char *)"noise", NULL, NULL, NULL, 0); + if (mod) { + PyDict_SetItemString(bpy_pydriver_Dict, "noise", mod); + Py_DECREF(mod); + } + return 0; } From cc906e0e2a1de9b19c6cefa1167332f348bb9e0f Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 5 Sep 2011 05:43:01 +0000 Subject: [PATCH 074/182] correct float -> double promotion warnings --- source/blender/makesrna/intern/rna_modifier.c | 4 ++-- .../modifiers/intern/MOD_weightvg_util.c | 24 +++++++++---------- .../modifiers/intern/MOD_weightvgmix.c | 6 ++--- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index 169288cfed3..415900af6fc 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -2584,13 +2584,13 @@ static void rna_def_modifier_weightvgedit(BlenderRNA *brna) prop= RNA_def_property(srna, "use_add", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "edit_flags", MOD_WVG_EDIT_ADD2VG); - RNA_def_property_ui_text(prop, "Add to VG", "Add vertices with weight over threshold " + RNA_def_property_ui_text(prop, "Group Add", "Add vertices with weight over threshold " "to vgroup."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); prop= RNA_def_property(srna, "use_remove", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "edit_flags", MOD_WVG_EDIT_REMFVG); - RNA_def_property_ui_text(prop, "Rem from VG", "Remove vertices with weight below threshold " + RNA_def_property_ui_text(prop, "Group Remove", "Remove vertices with weight below threshold " "from vgroup."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); diff --git a/source/blender/modifiers/intern/MOD_weightvg_util.c b/source/blender/modifiers/intern/MOD_weightvg_util.c index 8952d70d323..93e1899ad60 100644 --- a/source/blender/modifiers/intern/MOD_weightvg_util.c +++ b/source/blender/modifiers/intern/MOD_weightvg_util.c @@ -69,7 +69,7 @@ void weightvg_do_mask(int num, int *indices, float *org_w, float *new_w, Object int i; /* If influence factor is null, nothing to do! */ - if (fact == 0.0) return; + if (fact == 0.0f) return; /* If we want to mask vgroup weights from a texture. */ if (texture) { @@ -105,34 +105,34 @@ void weightvg_do_mask(int num, int *indices, float *org_w, float *new_w, Object /* Get the good channel value… */ switch(tex_use_channel) { case MOD_WVG_MASK_TEX_USE_INT: - org_w[i] = (new_w[i] * texres.tin * fact) + (org_w[i] * (1.0 - (texres.tin*fact))); + org_w[i] = (new_w[i] * texres.tin * fact) + (org_w[i] * (1.0f - (texres.tin*fact))); break; case MOD_WVG_MASK_TEX_USE_RED: - org_w[i] = (new_w[i] * texres.tr * fact) + (org_w[i] * (1.0 - (texres.tr*fact))); + org_w[i] = (new_w[i] * texres.tr * fact) + (org_w[i] * (1.0f - (texres.tr*fact))); break; case MOD_WVG_MASK_TEX_USE_GREEN: - org_w[i] = (new_w[i] * texres.tg * fact) + (org_w[i] * (1.0 - (texres.tg*fact))); + org_w[i] = (new_w[i] * texres.tg * fact) + (org_w[i] * (1.0f - (texres.tg*fact))); break; case MOD_WVG_MASK_TEX_USE_BLUE: - org_w[i] = (new_w[i] * texres.tb * fact) + (org_w[i] * (1.0 - (texres.tb*fact))); + org_w[i] = (new_w[i] * texres.tb * fact) + (org_w[i] * (1.0f - (texres.tb*fact))); break; case MOD_WVG_MASK_TEX_USE_HUE: rgb_to_hsv(texres.tr, texres.tg, texres.tb, &h, &s, &v); - org_w[i] = (new_w[i] * h * fact) + (org_w[i] * (1.0 - (h*fact))); + org_w[i] = (new_w[i] * h * fact) + (org_w[i] * (1.0f - (h*fact))); break; case MOD_WVG_MASK_TEX_USE_SAT: rgb_to_hsv(texres.tr, texres.tg, texres.tb, &h, &s, &v); - org_w[i] = (new_w[i] * s * fact) + (org_w[i] * (1.0 - (s*fact))); + org_w[i] = (new_w[i] * s * fact) + (org_w[i] * (1.0f - (s*fact))); break; case MOD_WVG_MASK_TEX_USE_VAL: rgb_to_hsv(texres.tr, texres.tg, texres.tb, &h, &s, &v); - org_w[i] = (new_w[i] * v * fact) + (org_w[i] * (1.0 - (v*fact))); + org_w[i] = (new_w[i] * v * fact) + (org_w[i] * (1.0f - (v*fact))); break; case MOD_WVG_MASK_TEX_USE_ALPHA: - org_w[i] = (new_w[i] * texres.ta * fact) + (org_w[i] * (1.0 - (texres.ta*fact))); + org_w[i] = (new_w[i] * texres.ta * fact) + (org_w[i] * (1.0f - (texres.ta*fact))); break; default: - org_w[i] = (new_w[i] * texres.tin * fact) + (org_w[i] * (1.0 - (texres.tin*fact))); + org_w[i] = (new_w[i] * texres.tin * fact) + (org_w[i] * (1.0f - (texres.tin*fact))); break; } } @@ -164,7 +164,7 @@ void weightvg_do_mask(int num, int *indices, float *org_w, float *new_w, Object else { /* Default "influence" behavior. */ /* For each weight (vertex), make the mix between org and new weights. */ - const float ifact= 1.0-fact; + const float ifact= 1.0f - fact; for (i = 0; i < num; i++) { org_w[i] = (new_w[i] * fact) + (org_w[i] * ifact); } @@ -189,7 +189,7 @@ void weightvg_update_vg(MDeformVert *dvert, int defgrp_idx, int num, MDeformWeight *newdw; /* Never allow weights out of [0.0, 1.0] range. */ - CLAMP(w, 0.0, 1.0); + CLAMP(w, 0.0f, 1.0f); /* Let's first check to see if this vert is already in the weight group – if so * let's update it, or remove it if needed. diff --git a/source/blender/modifiers/intern/MOD_weightvgmix.c b/source/blender/modifiers/intern/MOD_weightvgmix.c index a30afcb230f..7543b085b51 100644 --- a/source/blender/modifiers/intern/MOD_weightvgmix.c +++ b/source/blender/modifiers/intern/MOD_weightvgmix.c @@ -98,16 +98,16 @@ static float mix_weight(float weight, float weight2, char mix_mode) return (weight * weight2); else if (mix_mode == MOD_WVG_MIX_DIV) { /* Avoid dividing by zero (or really small values). */ - if (weight2 < 0.0 && weight2 > -MOD_WVG_ZEROFLOOR) + if (weight2 < 0.0f && weight2 > -MOD_WVG_ZEROFLOOR) weight2 = -MOD_WVG_ZEROFLOOR; - else if (weight2 >= 0.0 && weight2 < MOD_WVG_ZEROFLOOR) + else if (weight2 >= 0.0f && weight2 < MOD_WVG_ZEROFLOOR) weight2 = MOD_WVG_ZEROFLOOR; return (weight / weight2); } else if (mix_mode == MOD_WVG_MIX_DIF) return (weight < weight2 ? weight2 - weight : weight - weight2); else if (mix_mode == MOD_WVG_MIX_AVG) - return (weight + weight2) / 2.0; + return (weight + weight2) * 0.5f; else return weight2; } From 919bd181b764b0cf76b7e0fee76a07cc8126fc9a Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Mon, 5 Sep 2011 08:20:11 +0000 Subject: [PATCH 075/182] Partial revert commit 39878 "Fix #28280: Insert Hook wrong index" Such load/make edit structures introduced regression into iterators via object's geometry (vertices, edges, control points and so) when adding hooks in the body of this iterator. Fix for wrong index should be non-destructable for geometry. This will fix #28506: Unusual behavior in curves. --- source/blender/editors/object/object_hook.c | 21 +++------------- .../blender/editors/object/object_relations.c | 25 +++---------------- 2 files changed, 8 insertions(+), 38 deletions(-) diff --git a/source/blender/editors/object/object_hook.c b/source/blender/editors/object/object_hook.c index 266556773f0..bb32869469a 100644 --- a/source/blender/editors/object/object_hook.c +++ b/source/blender/editors/object/object_hook.c @@ -64,7 +64,6 @@ #include "ED_curve.h" #include "ED_mesh.h" -#include "ED_lattice.h" #include "ED_screen.h" #include "WM_types.h" @@ -293,7 +292,7 @@ static int return_editcurve_indexar(Object *obedit, int *tot, int **indexar, flo return totvert; } -static int object_hook_index_array(Scene *scene, Object *obedit, int *tot, int **indexar, char *name, float *cent_r) +static int object_hook_index_array(Object *obedit, int *tot, int **indexar, char *name, float *cent_r) { *indexar= NULL; *tot= 0; @@ -303,12 +302,7 @@ static int object_hook_index_array(Scene *scene, Object *obedit, int *tot, int * case OB_MESH: { Mesh *me= obedit->data; - EditMesh *em; - - load_editMesh(scene, obedit); - make_editMesh(scene, obedit); - - em = BKE_mesh_get_editmesh(me); + EditMesh *em = BKE_mesh_get_editmesh(me); /* check selected vertices first */ if( return_editmesh_indexar(em, tot, indexar, cent_r)) { @@ -322,17 +316,10 @@ static int object_hook_index_array(Scene *scene, Object *obedit, int *tot, int * } case OB_CURVE: case OB_SURF: - load_editNurb(obedit); - make_editNurb(obedit); - return return_editcurve_indexar(obedit, tot, indexar, cent_r); case OB_LATTICE: { Lattice *lt= obedit->data; - - load_editLatt(obedit); - make_editLatt(obedit); - return return_editlattice_indexar(lt->editlatt->latt, tot, indexar, cent_r); } default: @@ -440,7 +427,7 @@ static void add_hook_object(Main *bmain, Scene *scene, Object *obedit, Object *o int tot, ok, *indexar; char name[32]; - ok = object_hook_index_array(scene, obedit, &tot, &indexar, name, cent); + ok = object_hook_index_array(obedit, &tot, &indexar, name, cent); if (!ok) return; // XXX error("Requires selected vertices or active Vertex Group"); @@ -773,7 +760,7 @@ static int object_hook_assign_exec(bContext *C, wmOperator *op) /* assign functionality */ - if(!object_hook_index_array(CTX_data_scene(C), ob, &tot, &indexar, name, cent)) { + if(!object_hook_index_array(ob, &tot, &indexar, name, cent)) { BKE_report(op->reports, RPT_WARNING, "Requires selected vertices or active vertex group"); return OPERATOR_CANCELLED; } diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c index b9208e778c7..e9418ca9f9f 100644 --- a/source/blender/editors/object/object_relations.c +++ b/source/blender/editors/object/object_relations.c @@ -91,8 +91,6 @@ #include "ED_armature.h" #include "ED_curve.h" -#include "ED_lattice.h" -#include "ED_mesh.h" #include "ED_keyframing.h" #include "ED_object.h" #include "ED_screen.h" @@ -124,12 +122,7 @@ static int vertex_parent_set_exec(bContext *C, wmOperator *op) if(obedit->type==OB_MESH) { Mesh *me= obedit->data; - EditMesh *em; - - load_editMesh(scene, obedit); - make_editMesh(scene, obedit); - - em = BKE_mesh_get_editmesh(me); + EditMesh *em = BKE_mesh_get_editmesh(me); eve= em->verts.first; while(eve) { @@ -147,12 +140,7 @@ static int vertex_parent_set_exec(bContext *C, wmOperator *op) BKE_mesh_end_editmesh(me, em); } else if(ELEM(obedit->type, OB_SURF, OB_CURVE)) { - ListBase *editnurb; - - load_editNurb(obedit); - make_editNurb(obedit); - - editnurb= curve_get_editcurve(obedit); + ListBase *editnurb= curve_get_editcurve(obedit); cu= obedit->data; @@ -192,13 +180,8 @@ static int vertex_parent_set_exec(bContext *C, wmOperator *op) } } else if(obedit->type==OB_LATTICE) { - Lattice *lt; - - load_editLatt(obedit); - make_editLatt(obedit); - - lt= obedit->data; - + Lattice *lt= obedit->data; + a= lt->editlatt->latt->pntsu*lt->editlatt->latt->pntsv*lt->editlatt->latt->pntsw; bp= lt->editlatt->latt->def; while(a--) { From d91587752c1a27e0569dec4ea24a682e7ea51007 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 5 Sep 2011 13:19:19 +0000 Subject: [PATCH 076/182] Fix #28504: lib linking errors were not shown when opening a file from the splash screen. --- .../blender/windowmanager/intern/wm_event_system.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 27586525253..5711ec899bf 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -437,9 +437,18 @@ static void wm_operator_print(bContext *C, wmOperator *op) static void wm_operator_reports(bContext *C, wmOperator *op, int retval, int popup) { - if(popup) - if(op->reports->list.first) + if(popup) { + if(op->reports->list.first) { + /* FIXME, temp setting window, see other call to uiPupMenuReports for why */ + wmWindow *win_prev= CTX_wm_window(C); + if(win_prev==NULL) + CTX_wm_window_set(C, CTX_wm_manager(C)->windows.first); + uiPupMenuReports(C, op->reports); + + CTX_wm_window_set(C, win_prev); + } + } if(retval & OPERATOR_FINISHED) { if(G.f & G_DEBUG) From cc1c8268f755adfcf02085251e095b0589548719 Mon Sep 17 00:00:00 2001 From: Nathan Letwory Date: Mon, 5 Sep 2011 15:03:31 +0000 Subject: [PATCH 077/182] Left debug print accidently enabled. --- source/blender/collada/MeshImporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/collada/MeshImporter.cpp b/source/blender/collada/MeshImporter.cpp index 01eff8069c1..15bd9c48f12 100644 --- a/source/blender/collada/MeshImporter.cpp +++ b/source/blender/collada/MeshImporter.cpp @@ -220,7 +220,7 @@ void MeshImporter::set_face_uv(MTFace *mtface, UVDataWrapper &uvs, if (quad) uvs.getUV(indices[index + 3], mtface->uv[3]); -#if 1 // #ifdef COLLADA_DEBUG +#ifdef COLLADA_DEBUG if (quad) { fprintf(stderr, "face uv:\n" "((%d, %d, %d, %d))\n" From 59dbd53e72ae25edf247e49ea1e291af277fecc4 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 5 Sep 2011 15:55:53 +0000 Subject: [PATCH 078/182] Fix #28389: UILayout.menu function didn't emboss menu button correct in the 3d view tools region. --- source/blender/editors/interface/interface_layout.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c index ef88bb0bbb6..a2e65f5e4ec 100644 --- a/source/blender/editors/interface/interface_layout.c +++ b/source/blender/editors/interface/interface_layout.c @@ -1404,7 +1404,7 @@ static void ui_item_menu(uiLayout *layout, const char *name, int icon, uiMenuCre if(layout->root->type == UI_LAYOUT_HEADER) uiBlockSetEmboss(block, UI_EMBOSS); - else if(layout->root->type == UI_LAYOUT_PANEL) { + else if(ELEM(layout->root->type, UI_LAYOUT_PANEL, UI_LAYOUT_TOOLBAR)) { but->type= MENU; but->flag |= UI_TEXT_LEFT; } From 4393df93202198b5eaaff438e18060c66b98928d Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Mon, 5 Sep 2011 16:16:00 +0000 Subject: [PATCH 079/182] VGroup Modifiers: added mapping options to proximity and edit. *Added Smooth/Sharp/Root/etc. mappings to WeightVGEdit modifier, in addition to custom curve one. *Added Smooth/Sharp/Root/etc. mappings to WeightVGProximity modifier, without the custom curve one! *Factorized the common mapping code into MOD_weightvg_util. --- .../startup/bl_ui/properties_data_modifier.py | 27 +----- source/blender/makesdna/DNA_modifier_types.h | 29 ++++-- source/blender/makesrna/intern/rna_modifier.c | 88 +++++++------------ .../modifiers/intern/MOD_weightvg_util.c | 66 ++++++++++++-- .../modifiers/intern/MOD_weightvg_util.h | 17 ++-- .../modifiers/intern/MOD_weightvgedit.c | 11 +-- .../modifiers/intern/MOD_weightvgproximity.c | 27 +++--- 7 files changed, 149 insertions(+), 116 deletions(-) diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py index a7e87c6ab62..8e7f50cd6f2 100644 --- a/release/scripts/startup/bl_ui/properties_data_modifier.py +++ b/release/scripts/startup/bl_ui/properties_data_modifier.py @@ -779,32 +779,11 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel): col.label(text="Default Weight:") col.prop(md, "default_weight", text="") -# layout.prop(md, "use_map") -# if md.use_map: -# split = layout.split() -# col = split.column() -# col.label("Input:") -# col.label("Output:") -# col = split.column() -# col.prop(md, "map_input_low", text="Min") -# col.prop(md, "map_output_low", text="Min") -# col = split.column() -# col.prop(md, "map_input_high", text="Max") -# col.prop(md, "map_output_high", text="Max") - - layout.prop(md, "use_map_curve") - if md.use_map_curve: + layout.prop(md, "mapping_mode") + if md.mapping_mode == 'CURVE': col = layout.column() col.template_curve_mapping(md, "map_curve") -# layout.prop(md, "use_reverse") - -# layout.prop(md, "use_clamp") -# if md.use_clamp: -# row = layout.row() -# row.prop(md, "clamp_weight_min") -# row.prop(md, "clamp_weight_max") - row = layout.row() row.prop(md, "use_add") row.prop(md, "use_remove") @@ -864,6 +843,8 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel): row.prop(md, "min_dist") row.prop(md, "max_dist") + layout.prop(md, "mapping_mode") + # Common mask options… layout.separator() self.weight_vg_mask(layout, ob, md) diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index 1714ae2a018..c4eef981669 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -795,8 +795,8 @@ typedef struct WeightVGEditModifierData { char defgrp_name[32]; /* Name of vertex group to edit. */ - short edit_flags; /* using MOD_WVG_EDIT_* flags */ - short pad1; + short edit_flags; /* Using MOD_WVG_EDIT_* flags. */ + short mapping_mode; /* Using MOD_WVG_MAPPING_* defines. */ float default_weight; /* Weight for vertices not in vgroup. */ /* Mapping stuff. */ @@ -817,6 +817,7 @@ typedef struct WeightVGEditModifierData { /* How to map the texture (using MOD_DISP_MAP_* constants). */ int mask_tex_mapping; char mask_tex_uvlayer_name[32]; /* Name of the UV layer. */ + /* Padding… */ int pad_i1; } WeightVGEditModifierData; @@ -825,7 +826,7 @@ typedef struct WeightVGEditModifierData { /* Use parametric mapping. */ //#define MOD_WVG_EDIT_MAP (1 << 0) /* Use curve mapping. */ -#define MOD_WVG_EDIT_CMAP (1 << 1) +//#define MOD_WVG_EDIT_CMAP (1 << 1) /* Reverse weights (in the [0.0, 1.0] standard range). */ //#define MOD_WVG_EDIT_REVERSE_WEIGHTS (1 << 2) /* Add vertices with higher weight than threshold to vgroup. */ @@ -848,7 +849,7 @@ typedef struct WeightVGMixModifierData { char mix_mode; /* How second vgroups weights affect first ones */ char mix_set; /* What vertices to affect. */ - char pad[6]; + char pad_c1[6]; /* Masking options. */ float mask_constant; /* The global "influence", if no vgroup nor tex is used as mask. */ @@ -861,8 +862,9 @@ typedef struct WeightVGMixModifierData { struct Object *mask_tex_map_obj; /* Name of the map object. */ int mask_tex_mapping; /* How to map the texture! */ char mask_tex_uvlayer_name[32]; /* Name of the UV layer. */ + /* Padding… */ - int pad2; + int pad_i1; } WeightVGMixModifierData; /* How second vgroup's weights affect first ones. */ @@ -910,8 +912,11 @@ typedef struct WeightVGProximityModifierData { float min_dist, max_dist; /* Distances mapping to 0.0/1.0 weights. */ + /* Put here to avoid breaking existing struct... */ + short mapping_mode; /* Using MOD_WVG_MAPPING_* defines. */ + /* Padding... */ - int pad; + short pad_s1; } WeightVGProximityModifierData; /* Modes of proximity weighting. */ @@ -929,6 +934,18 @@ typedef struct WeightVGProximityModifierData { #define MOD_WVG_PROXIMITY_GEOM_FACES (1 << 2) /* Defines common to all WeightVG modifiers. */ +/* Mapping modes. */ +#define MOD_WVG_MAPPING_NONE 0 +#define MOD_WVG_MAPPING_CURVE 1 +#define MOD_WVG_MAPPING_SHARP 2 /* PROP_SHARP */ +#define MOD_WVG_MAPPING_SMOOTH 3 /* PROP_SMOOTH */ +#define MOD_WVG_MAPPING_ROOT 4 /* PROP_ROOT */ +/* PROP_LIN not used (same as NONE, here...). */ +/* PROP_CONST not used. */ +#define MOD_WVG_MAPPING_SPHERE 7 /* PROP_SPHERE */ +#define MOD_WVG_MAPPING_RANDOM 8 /* PROP_RANDOM */ +#define MOD_WVG_MAPPING_STEP 9 /* Median Step. */ + /* Tex channel to be used as mask. */ #define MOD_WVG_MASK_TEX_USE_INT 1 #define MOD_WVG_MASK_TEX_USE_RED 2 diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index 415900af6fc..8700a6938ef 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -2552,6 +2552,17 @@ static void rna_def_modifier_weightvg_mask(BlenderRNA *brna, StructRNA *srna) static void rna_def_modifier_weightvgedit(BlenderRNA *brna) { + static EnumPropertyItem weightvg_edit_mapping_mode_items[] = { + {MOD_WVG_MAPPING_NONE, "LINEAR", ICON_LINCURVE, "Linear", ""}, + {MOD_WVG_MAPPING_CURVE, "CURVE", ICON_RNDCURVE, "Custom Curve", ""}, + {MOD_WVG_MAPPING_SHARP, "SHARP", ICON_SHARPCURVE, "Sharp", ""}, + {MOD_WVG_MAPPING_SMOOTH, "SMOOTH", ICON_SMOOTHCURVE, "Smooth", ""}, + {MOD_WVG_MAPPING_ROOT, "ROOT", ICON_ROOTCURVE, "Root", ""}, + {MOD_WVG_MAPPING_SPHERE, "ICON_SPHERECURVE", ICON_SPHERECURVE, "Sphere", ""}, + {MOD_WVG_MAPPING_RANDOM, "RANDOM", ICON_RNDCURVE, "Random", ""}, + {MOD_WVG_MAPPING_STEP, "STEP", ICON_NOCURVE, "Median Step", ""}, /* Would need a better icon... */ + {0, NULL, 0, NULL, NULL}}; + StructRNA *srna; PropertyRNA *prop; @@ -2567,21 +2578,11 @@ static void rna_def_modifier_weightvgedit(BlenderRNA *brna) RNA_def_property_string_funcs(prop, NULL, NULL, "rna_WeightVGModifier_vgroup_set"); RNA_def_property_update(prop, 0, "rna_Modifier_update"); -/* prop= RNA_def_property(srna, "use_map", PROP_BOOLEAN, PROP_NONE);*/ -/* RNA_def_property_boolean_sdna(prop, NULL, "edit_flags", MOD_WVG_EDIT_MAP);*/ -/* RNA_def_property_ui_text(prop, "Map", "Map vertex group weights.");*/ -/* RNA_def_property_update(prop, 0, "rna_Modifier_update");*/ - - prop= RNA_def_property(srna, "use_map_curve", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "edit_flags", MOD_WVG_EDIT_CMAP); - RNA_def_property_ui_text(prop, "Curve Map", "Map vertex group weights with a curve."); + prop= RNA_def_property(srna, "mapping_mode", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_items(prop, weightvg_edit_mapping_mode_items); + RNA_def_property_ui_text(prop, "Mapping Mode", "How weights are mapped to there new values."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); -/* prop= RNA_def_property(srna, "use_reverse", PROP_BOOLEAN, PROP_NONE);*/ -/* RNA_def_property_boolean_sdna(prop, NULL, "edit_flags", MOD_WVG_EDIT_REVERSE_WEIGHTS);*/ -/* RNA_def_property_ui_text(prop, "Reverse", "Reverse vertex group weights.");*/ -/* RNA_def_property_update(prop, 0, "rna_Modifier_update");*/ - prop= RNA_def_property(srna, "use_add", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "edit_flags", MOD_WVG_EDIT_ADD2VG); RNA_def_property_ui_text(prop, "Group Add", "Add vertices with weight over threshold " @@ -2594,11 +2595,6 @@ static void rna_def_modifier_weightvgedit(BlenderRNA *brna) "from vgroup."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); -/* prop= RNA_def_property(srna, "use_clamp", PROP_BOOLEAN, PROP_NONE);*/ -/* RNA_def_property_boolean_sdna(prop, NULL, "edit_flags", MOD_WVG_EDIT_CLAMP);*/ -/* RNA_def_property_ui_text(prop, "Clamp", "Clamp vertex group weights.");*/ -/* RNA_def_property_update(prop, 0, "rna_Modifier_update");*/ - prop= RNA_def_property(srna, "default_weight", PROP_FLOAT, PROP_NONE); RNA_def_property_range(prop, 0.0, 1.0f); RNA_def_property_ui_range(prop, 0.0, 1.0, 10, 0); @@ -2606,34 +2602,6 @@ static void rna_def_modifier_weightvgedit(BlenderRNA *brna) "it is not in the vgroup."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); -/* prop= RNA_def_property(srna, "map_input_low", PROP_FLOAT, PROP_NONE);*/ -/* RNA_def_property_float_sdna(prop, NULL, "map_org_min");*/ -/* RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);*/ -/* RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0);*/ -/* RNA_def_property_ui_text(prop, "Input Low Weight", "Low input mapping value.");*/ -/* RNA_def_property_update(prop, 0, "rna_Modifier_update");*/ - -/* prop= RNA_def_property(srna, "map_input_high", PROP_FLOAT, PROP_NONE);*/ -/* RNA_def_property_float_sdna(prop, NULL, "map_org_max");*/ -/* RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);*/ -/* RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0);*/ -/* RNA_def_property_ui_text(prop, "Input High Weight", "High input mapping value.");*/ -/* RNA_def_property_update(prop, 0, "rna_Modifier_update");*/ - -/* prop= RNA_def_property(srna, "map_output_low", PROP_FLOAT, PROP_NONE);*/ -/* RNA_def_property_float_sdna(prop, NULL, "map_new_min");*/ -/* RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);*/ -/* RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0);*/ -/* RNA_def_property_ui_text(prop, "Output Low Weight", "Low output mapping value.");*/ -/* RNA_def_property_update(prop, 0, "rna_Modifier_update");*/ - -/* prop= RNA_def_property(srna, "map_output_high", PROP_FLOAT, PROP_NONE);*/ -/* RNA_def_property_float_sdna(prop, NULL, "map_new_max");*/ -/* RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);*/ -/* RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0);*/ -/* RNA_def_property_ui_text(prop, "Output High Weight", "High output mapping value.");*/ -/* RNA_def_property_update(prop, 0, "rna_Modifier_update");*/ - prop= RNA_def_property(srna, "map_curve", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "cmap_curve"); RNA_def_property_ui_text(prop, "Mapping Curve", "Custom mapping curve."); @@ -2655,18 +2623,6 @@ static void rna_def_modifier_weightvgedit(BlenderRNA *brna) "to be removed from the vgroup."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); -/* prop= RNA_def_property(srna, "clamp_weight_min", PROP_FLOAT, PROP_NONE);*/ -/* RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);*/ -/* RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0);*/ -/* RNA_def_property_ui_text(prop, "Min Weight", "Lowest weight a vertex can get.");*/ -/* RNA_def_property_update(prop, 0, "rna_Modifier_update");*/ - -/* prop= RNA_def_property(srna, "clamp_weight_max", PROP_FLOAT, PROP_NONE);*/ -/* RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);*/ -/* RNA_def_property_ui_range(prop, -100000.0, 100000.0, 10, 0);*/ -/* RNA_def_property_ui_text(prop, "Max Weight", "Highest weight a vertex can get.");*/ -/* RNA_def_property_update(prop, 0, "rna_Modifier_update");*/ - /* Common masking properties. */ rna_def_modifier_weightvg_mask(brna, srna); } @@ -2756,6 +2712,17 @@ static void rna_def_modifier_weightvgproximity(BlenderRNA *brna) {MOD_WVG_PROXIMITY_GEOM_FACES, "FACE", ICON_FACESEL, "Face", ""}, {0, NULL, 0, NULL, NULL}}; + static EnumPropertyItem weightvg_proximity_mapping_mode_items[] = { + {MOD_WVG_MAPPING_NONE, "LINEAR", ICON_LINCURVE, "Linear", ""}, + /* No curve mapping here! */ + {MOD_WVG_MAPPING_SHARP, "SHARP", ICON_SHARPCURVE, "Sharp", ""}, + {MOD_WVG_MAPPING_SMOOTH, "SMOOTH", ICON_SMOOTHCURVE, "Smooth", ""}, + {MOD_WVG_MAPPING_ROOT, "ROOT", ICON_ROOTCURVE, "Root", ""}, + {MOD_WVG_MAPPING_SPHERE, "ICON_SPHERECURVE", ICON_SPHERECURVE, "Sphere", ""}, + {MOD_WVG_MAPPING_RANDOM, "RANDOM", ICON_RNDCURVE, "Random", ""}, + {MOD_WVG_MAPPING_STEP, "STEP", ICON_NOCURVE, "Median Step", ""}, /* Would need a better icon... */ + {0, NULL, 0, NULL, NULL}}; + StructRNA *srna; PropertyRNA *prop; @@ -2802,6 +2769,11 @@ static void rna_def_modifier_weightvgproximity(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Highest Dist", "Distance mapping to weight 1.0."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); + prop= RNA_def_property(srna, "mapping_mode", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_items(prop, weightvg_proximity_mapping_mode_items); + RNA_def_property_ui_text(prop, "Mapping Mode", "How weights are mapped to there new values."); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + /* Common masking properties. */ rna_def_modifier_weightvg_mask(brna, srna); } diff --git a/source/blender/modifiers/intern/MOD_weightvg_util.c b/source/blender/modifiers/intern/MOD_weightvg_util.c index 93e1899ad60..675f0d76a48 100644 --- a/source/blender/modifiers/intern/MOD_weightvg_util.c +++ b/source/blender/modifiers/intern/MOD_weightvg_util.c @@ -33,16 +33,19 @@ * Or the WeightPaint mode code itself? */ -#include "BLI_utildefines.h" #include "BLI_math.h" +#include "BLI_rand.h" #include "BLI_string.h" +#include "BLI_utildefines.h" +#include "DNA_color_types.h" /* CurveMapping. */ #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" #include "DNA_modifier_types.h" #include "DNA_object_types.h" #include "BKE_cdderivedmesh.h" +#include "BKE_colortools.h" /* CurveMapping. */ #include "BKE_deform.h" #include "BKE_mesh.h" #include "BKE_modifier.h" @@ -54,16 +57,69 @@ #include "MOD_weightvg_util.h" #include "RE_shader_ext.h" /* Texture masking. */ +/* Maps new_w weights in place, using either one of the predifined functions, or a custom curve. + * Return values are in new_w. + * If indices is not NULL, it must be a table of same length as org_w and new_w, mapping to the real + * vertex index (in case the weight tables do not cover the whole vertices...). + * cmap might be NULL, in which case curve mapping mode will return unmodified data. + */ +void weightvg_do_map(int num, float *new_w, short mode, CurveMapping *cmap) +{ + int i; + + /* Return immediately, if we have nothing to do! */ + /* Also security checks... */ + if(((mode == MOD_WVG_MAPPING_CURVE) && (cmap == NULL)) + || !ELEM7(mode, MOD_WVG_MAPPING_CURVE, MOD_WVG_MAPPING_SHARP, MOD_WVG_MAPPING_SMOOTH, + MOD_WVG_MAPPING_ROOT, MOD_WVG_MAPPING_SPHERE, MOD_WVG_MAPPING_RANDOM, + MOD_WVG_MAPPING_STEP)) + return; + + /* Map each weight (vertex) to its new value, accordingly to the chosen mode. */ + for(i = 0; i < num; ++i) { + float fac = new_w[i]; + + /* Code borrowed from the warp modifier. */ + /* Closely matches PROP_SMOOTH and similar. */ + switch(mode) { + case MOD_WVG_MAPPING_CURVE: + fac = curvemapping_evaluateF(cmap, 0, fac); + break; + case MOD_WVG_MAPPING_SHARP: + fac = fac*fac; + break; + case MOD_WVG_MAPPING_SMOOTH: + fac = 3.0f*fac*fac - 2.0f*fac*fac*fac; + break; + case MOD_WVG_MAPPING_ROOT: + fac = (float)sqrt(fac); + break; + case MOD_WVG_MAPPING_SPHERE: + fac = (float)sqrt(2*fac - fac * fac); + break; + case MOD_WVG_MAPPING_RANDOM: + BLI_srand(BLI_rand()); /* random seed */ + fac = BLI_frand()*fac; + break; + case MOD_WVG_MAPPING_STEP: + fac = (fac >= 0.5f)?1.0f:0.0f; + break; + } + + new_w[i] = fac; + } +} + /* Applies new_w weights to org_w ones, using either a texture, vgroup or constant value as factor. * Return values are in org_w. * If indices is not NULL, it must be a table of same length as org_w and new_w, mapping to the real * vertex index (in case the weight tables do not cover the whole vertices...). * XXX The standard “factor” value is assumed in [0.0, 1.0] range. Else, weird results might appear. */ -void weightvg_do_mask(int num, int *indices, float *org_w, float *new_w, Object *ob, - DerivedMesh *dm, float fact, const char defgrp_name[32], Tex *texture, - int tex_use_channel, int tex_mapping, Object *tex_map_object, - const char *tex_uvlayer_name) +void weightvg_do_mask(int num, const int *indices, float *org_w, const float *new_w, + Object *ob, DerivedMesh *dm, float fact, const char defgrp_name[32], + Tex *texture, int tex_use_channel, int tex_mapping, + Object *tex_map_object, const char *tex_uvlayer_name) { int ref_didx; int i; diff --git a/source/blender/modifiers/intern/MOD_weightvg_util.h b/source/blender/modifiers/intern/MOD_weightvg_util.h index b42e9c20035..3afff391943 100644 --- a/source/blender/modifiers/intern/MOD_weightvg_util.h +++ b/source/blender/modifiers/intern/MOD_weightvg_util.h @@ -37,11 +37,10 @@ /* so modifier types match their defines */ #include "MOD_modifiertypes.h" -struct Tex; +struct CurveMapping; struct DerivedMesh; struct Object; -/*struct ModifierData; -struct MappingInfoModifierData;*/ +struct Tex; /* * XXX I'd like to make modified weights visible in WeightPaint mode, @@ -61,14 +60,22 @@ struct MappingInfoModifierData;*/ */ #define MOD_WVG_ZEROFLOOR 1.0e-32f +/* Maps new_w weights in place, using either one of the predifined functions, or a custom curve. + * Return values are in new_w. + * If indices is not NULL, it must be a table of same length as org_w and new_w, mapping to the real + * vertex index (in case the weight tables do not cover the whole vertices...). + * cmap might be NULL, in which case curve mapping mode will return unmodified data. + */ +void weightvg_do_map(int num, float *new_w, short mode, struct CurveMapping *cmap); + /* Applies new_w weights to org_w ones, using either a texture, vgroup or constant value as factor. * Return values are in org_w. * If indices is not NULL, it must be a table of same length as org_w and new_w, mapping to the real * vertex index (in case the weight tables do not cover the whole vertices...). * XXX The standard “factor” value is assumed in [0.0, 1.0] range. Else, weird results might appear. */ -void weightvg_do_mask(int num, int *indices, float *org_w, float *new_w, Object *ob, - struct DerivedMesh *dm, float fact, const char defgrp_name[32], Tex *texture, +void weightvg_do_mask(int num, const int *indices, float *org_w, const float *new_w, Object *ob, + DerivedMesh *dm, float fact, const char defgrp_name[32], Tex *texture, int tex_use_channel, int tex_mapping, Object *tex_map_object, const char *tex_uvlayer_name); diff --git a/source/blender/modifiers/intern/MOD_weightvgedit.c b/source/blender/modifiers/intern/MOD_weightvgedit.c index 87747f255fd..763a063567b 100644 --- a/source/blender/modifiers/intern/MOD_weightvgedit.c +++ b/source/blender/modifiers/intern/MOD_weightvgedit.c @@ -62,6 +62,7 @@ static void initData(ModifierData *md) { WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md; wmd->edit_flags = 0; + wmd->mapping_mode = MOD_WVG_MAPPING_NONE; wmd->default_weight = 0.0f; wmd->cmap_curve = curvemapping_add(1, 0.0, 0.0, 1.0, 1.0); @@ -89,6 +90,7 @@ static void copyData(ModifierData *md, ModifierData *target) BLI_strncpy(twmd->defgrp_name, wmd->defgrp_name, sizeof(twmd->defgrp_name)); twmd->edit_flags = wmd->edit_flags; + twmd->mapping_mode = wmd->mapping_mode; twmd->default_weight = wmd->default_weight; twmd->cmap_curve = curvemapping_copy(wmd->cmap_curve); @@ -192,7 +194,6 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der int i; char rel_ret = 0; /* Boolean, whether we have to release ret dm or not, when not using it! */ /* Flags. */ - int do_map = (wmd->edit_flags & MOD_WVG_EDIT_CMAP) != 0; int do_add = (wmd->edit_flags & MOD_WVG_EDIT_ADD2VG) != 0; int do_rem = (wmd->edit_flags & MOD_WVG_EDIT_REMFVG) != 0; @@ -264,11 +265,11 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der if(dw) { org_w[i] = new_w[i] = dw->weight; } + } - /* Do mapping. */ - if (do_map) { - new_w[i] = curvemapping_evaluateF(wmd->cmap_curve, 0, new_w[i]); - } + /* Do mapping. */ + if (wmd->mapping_mode != MOD_WVG_MAPPING_NONE) { + weightvg_do_map(numVerts, new_w, wmd->mapping_mode, wmd->cmap_curve); } /* Do masking. */ diff --git a/source/blender/modifiers/intern/MOD_weightvgproximity.c b/source/blender/modifiers/intern/MOD_weightvgproximity.c index 513ba9c815f..35f993e24b6 100644 --- a/source/blender/modifiers/intern/MOD_weightvgproximity.c +++ b/source/blender/modifiers/intern/MOD_weightvgproximity.c @@ -33,10 +33,10 @@ * Or the WeightPaint mode code itself? */ -#include "BLI_utildefines.h" +#include "BLI_editVert.h" #include "BLI_math.h" #include "BLI_string.h" -#include "BLI_editVert.h" +#include "BLI_utildefines.h" #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" @@ -193,9 +193,9 @@ static float get_ob2ob_distance(const Object* ob, const Object* obr) } /** - * Maps distances to weights. + * Maps distances to weights, with an optionnal “smoothing” mapping. */ -void do_map(float *weights, const int nidx, const float min_d, const float max_d) +void do_map(float *weights, const int nidx, const float min_d, const float max_d, short mode) { const float range_inv= 1.0f / (max_d - min_d); /* invert since multiplication is faster */ unsigned int i= nidx; @@ -204,17 +204,12 @@ void do_map(float *weights, const int nidx, const float min_d, const float max_d else if(weights[i] <= min_d) weights[i]= 0.0f; else weights[i]= (weights[i] - min_d) * range_inv; } + + if(!ELEM(mode, MOD_WVG_MAPPING_NONE, MOD_WVG_MAPPING_CURVE)) { + weightvg_do_map(nidx, weights, mode, NULL); + } } -/*a min_d + b = 0.0*/ -/*a max_d + b = 1.0*/ -/*a min_d = -b*/ -/*a = -b / min_d*/ - -/*max_d(-b/min_d) + b = 1.0*/ -/*b((-max_d/min_d)+1.0) = 1.0*/ -/*b = 1.0 / ((min_d-max_d)/min_d)*/ -/*b = min_d/(min_d-max_d)*/ /************************************** * Modifiers functions. * **************************************/ @@ -225,6 +220,8 @@ static void initData(ModifierData *md) wmd->proximity_mode = MOD_WVG_PROXIMITY_OBJECT; wmd->proximity_flags = MOD_WVG_PROXIMITY_GEOM_VERTS; + wmd->mapping_mode = MOD_WVG_MAPPING_NONE; + wmd->mask_constant = 1.0f; wmd->mask_tex_use_channel = MOD_WVG_MASK_TEX_USE_INT; /* Use intensity by default. */ wmd->mask_tex_mapping = MOD_DISP_MAP_LOCAL; @@ -241,6 +238,8 @@ static void copyData(ModifierData *md, ModifierData *target) twmd->proximity_flags = wmd->proximity_flags; twmd->proximity_ob_target = wmd->proximity_ob_target; + twmd->mapping_mode = wmd->mapping_mode; + twmd->mask_constant = wmd->mask_constant; BLI_strncpy(twmd->mask_defgrp_name, wmd->mask_defgrp_name, sizeof(twmd->mask_defgrp_name)); twmd->mask_texture = wmd->mask_texture; @@ -499,7 +498,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der wmd->mask_tex_mapping, wmd->mask_tex_map_obj, wmd->mask_tex_uvlayer_name); /* Map distances to weights. */ - do_map(org_w, numIdx, wmd->min_dist, wmd->max_dist); + do_map(org_w, numIdx, wmd->min_dist, wmd->max_dist, wmd->mapping_mode); /* Update vgroup. Note we never add nor remove vertices from vgroup here. */ weightvg_update_vg(dvert, defgrp_idx, numIdx, indices, org_w, 0, 0.0f, 0, 0.0f); From 419042af55ddb789f29771886e0bb090ad757cad Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 5 Sep 2011 16:25:42 +0000 Subject: [PATCH 080/182] Fix #28394: clouds texture error with high noise depth and blender original noise, patch from Campbell, --- source/blender/blenlib/intern/noise.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/source/blender/blenlib/intern/noise.c b/source/blender/blenlib/intern/noise.c index 9bc666dc971..9efe8dc9739 100644 --- a/source/blender/blenlib/intern/noise.c +++ b/source/blender/blenlib/intern/noise.c @@ -263,13 +263,21 @@ static float newPerlinU(float x, float y, float z) static float orgBlenderNoise(float x, float y, float z) { register float cn1, cn2, cn3, cn4, cn5, cn6, i, *h; - float ox, oy, oz, jx, jy, jz; + float fx, fy, fz, ox, oy, oz, jx, jy, jz; float n= 0.5; int ix, iy, iz, b00, b01, b10, b11, b20, b21; - ox= (x- (ix= (int)floor(x)) ); - oy= (y- (iy= (int)floor(y)) ); - oz= (z- (iz= (int)floor(z)) ); + fx= floor(x); + fy= floor(y); + fz= floor(z); + + ox= x- fx; + oy= y- fy; + oz= z- fz; + + ix= (int)fx; + iy= (int)fy; + iz= (int)fz; jx= ox-1; jy= oy-1; From 76ddf6d2ee97bf51290492d4c692dd8ca031182c Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 5 Sep 2011 17:57:04 +0000 Subject: [PATCH 081/182] Fix #28404: certain keyboard shortcuts not shown in menus, e.g. move operators in graph editor > channel menu. Problem was these did not inherit operator execution context correctly. Fix found by Sergey, also needed to fix logic operators which were not working when invoked instead of executed. --- source/blender/editors/interface/interface_layout.c | 2 +- source/blender/editors/space_logic/logic_ops.c | 6 +++--- source/blender/windowmanager/intern/wm_event_system.c | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c index a2e65f5e4ec..803da55cea6 100644 --- a/source/blender/editors/interface/interface_layout.c +++ b/source/blender/editors/interface/interface_layout.c @@ -1526,7 +1526,7 @@ static void menu_item_enum_opname_menu(bContext *UNUSED(C), uiLayout *layout, vo { MenuItemLevel *lvl= (MenuItemLevel*)(((uiBut*)arg)->func_argN); - uiLayoutSetOperatorContext(layout, WM_OP_EXEC_REGION_WIN); + uiLayoutSetOperatorContext(layout, lvl->opcontext); uiItemsEnumO(layout, lvl->opname, lvl->propname); } diff --git a/source/blender/editors/space_logic/logic_ops.c b/source/blender/editors/space_logic/logic_ops.c index 638bfe57608..60e9595b77a 100644 --- a/source/blender/editors/space_logic/logic_ops.c +++ b/source/blender/editors/space_logic/logic_ops.c @@ -322,7 +322,7 @@ static void LOGIC_OT_sensor_add(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ - prop= RNA_def_enum(ot->srna, "type", DummyRNA_NULL_items, SENS_ALWAYS, "Type", "Type of sensor to add"); + ot->prop= prop= RNA_def_enum(ot->srna, "type", DummyRNA_NULL_items, SENS_ALWAYS, "Type", "Type of sensor to add"); RNA_def_enum_funcs(prop, rna_Sensor_type_itemf); RNA_def_string(ot->srna, "name", "", 32, "Name", "Name of the Sensor to add"); RNA_def_string(ot->srna, "object", "", 32, "Object", "Name of the Object to add the Sensor to"); @@ -437,7 +437,7 @@ static void LOGIC_OT_controller_add(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ - RNA_def_enum(ot->srna, "type", controller_type_items, CONT_LOGIC_AND, "Type", "Type of controller to add"); + ot->prop= RNA_def_enum(ot->srna, "type", controller_type_items, CONT_LOGIC_AND, "Type", "Type of controller to add"); RNA_def_string(ot->srna, "name", "", 32, "Name", "Name of the Controller to add"); RNA_def_string(ot->srna, "object", "", 32, "Object", "Name of the Object to add the Controller to"); } @@ -539,7 +539,7 @@ static void LOGIC_OT_actuator_add(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ - prop= RNA_def_enum(ot->srna, "type", DummyRNA_NULL_items, CONT_LOGIC_AND, "Type", "Type of actuator to add"); + ot->prop= prop= RNA_def_enum(ot->srna, "type", DummyRNA_NULL_items, CONT_LOGIC_AND, "Type", "Type of actuator to add"); RNA_def_enum_funcs(prop, rna_Actuator_type_itemf); RNA_def_string(ot->srna, "name", "", 32, "Name", "Name of the Actuator to add"); RNA_def_string(ot->srna, "object", "", 32, "Object", "Name of the Object to add the Actuator to"); diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 5711ec899bf..8861f128c4b 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -886,8 +886,8 @@ static int wm_operator_call_internal(bContext *C, wmOperatorType *ot, PointerRNA CTX_wm_region_set(C, NULL); CTX_wm_area_set(C, NULL); retval= wm_operator_invoke(C, ot, event, properties, reports, poll_only); - CTX_wm_region_set(C, ar); CTX_wm_area_set(C, area); + CTX_wm_region_set(C, ar); return retval; } From a6d9a5a972595c898e596deb95eb683430621188 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 5 Sep 2011 19:27:21 +0000 Subject: [PATCH 082/182] Code cleanup: warning fixes. --- source/blender/blenlib/BLI_math_inline.h | 2 +- source/blender/collada/AnimationExporter.cpp | 8 +- source/blender/collada/AnimationImporter.cpp | 11 +-- source/blender/collada/AnimationImporter.h | 4 +- source/blender/collada/ArmatureImporter.cpp | 5 - source/blender/collada/DocumentImporter.cpp | 4 +- source/blender/collada/TransformReader.cpp | 1 - .../editors/space_logic/logic_window.c | 34 ------- .../blender/imbuf/intern/cineon/cineonlib.c | 5 +- .../imbuf/intern/cineon/logImageCore.h | 4 + source/blender/makesrna/intern/rna_actuator.c | 95 ------------------- source/blender/makesrna/intern/rna_particle.c | 16 ++-- source/blender/makesrna/intern/rna_texture.c | 2 +- source/gameengine/VideoTexture/CMakeLists.txt | 1 - 14 files changed, 29 insertions(+), 163 deletions(-) diff --git a/source/blender/blenlib/BLI_math_inline.h b/source/blender/blenlib/BLI_math_inline.h index 0f8493e25a6..122b2679d5b 100644 --- a/source/blender/blenlib/BLI_math_inline.h +++ b/source/blender/blenlib/BLI_math_inline.h @@ -45,7 +45,7 @@ extern "C" { #define MALWAYS_INLINE MINLINE #else #define MINLINE static inline -#define MALWAYS_INLINE static __attribute__((always_inline)) +#define MALWAYS_INLINE static inline __attribute__((always_inline)) #endif #else #define MINLINE diff --git a/source/blender/collada/AnimationExporter.cpp b/source/blender/collada/AnimationExporter.cpp index 4c20d1cf6c1..498ccb5709d 100644 --- a/source/blender/collada/AnimationExporter.cpp +++ b/source/blender/collada/AnimationExporter.cpp @@ -643,6 +643,8 @@ std::string AnimationExporter::create_source_from_fcurve(COLLADASW::InputSemanti case COLLADASW::InputSemantic::OUT_TANGENT: source.setAccessorStride(2); break; + default: + break; } @@ -913,7 +915,7 @@ std::string AnimationExporter::get_light_param_sid(char *rna_path, int tm_type, } if (tm_name.size()) { - if (axis_name != "") + if (axis_name[0]) return tm_name + "." + std::string(axis_name); else return tm_name; @@ -962,7 +964,7 @@ std::string AnimationExporter::get_camera_param_sid(char *rna_path, int tm_type, } if (tm_name.size()) { - if (axis_name != "") + if (axis_name[0]) return tm_name + "." + std::string(axis_name); else return tm_name; @@ -1041,7 +1043,7 @@ std::string AnimationExporter::get_transform_sid(char *rna_path, int tm_type, co if (is_rotation) return tm_name + std::string(axis_name) + ".ANGLE"; else - if (axis_name != "") + if (axis_name[0]) return tm_name + "." + std::string(axis_name); else return tm_name; diff --git a/source/blender/collada/AnimationImporter.cpp b/source/blender/collada/AnimationImporter.cpp index 29c356ed8f0..43428f57d4f 100644 --- a/source/blender/collada/AnimationImporter.cpp +++ b/source/blender/collada/AnimationImporter.cpp @@ -90,12 +90,6 @@ void AnimationImporter::animation_to_fcurves(COLLADAFW::AnimationCurve *curve) COLLADAFW::FloatOrDoubleArray& input = curve->getInputValues(); COLLADAFW::FloatOrDoubleArray& output = curve->getOutputValues(); - if( curve->getInterpolationType() == COLLADAFW::AnimationCurve::INTERPOLATION_BEZIER || - curve->getInterpolationType() == COLLADAFW::AnimationCurve::INTERPOLATION_STEP ) { - COLLADAFW::FloatOrDoubleArray& intan = curve->getInTangentValues(); - COLLADAFW::FloatOrDoubleArray& outtan = curve->getOutTangentValues(); - } - float fps = (float)FPS; size_t dim = curve->getOutDimension(); unsigned int i; @@ -572,7 +566,7 @@ void AnimationImporter:: Assign_transform_animations(COLLADAFW::Transformation * } //creates the rna_paths and array indices of fcurves from animations using color and bound animation class of each animation. -void AnimationImporter:: Assign_color_animations(const COLLADAFW::UniqueId& listid, ListBase *AnimCurves ,char * anim_type) +void AnimationImporter:: Assign_color_animations(const COLLADAFW::UniqueId& listid, ListBase *AnimCurves ,const char * anim_type) { char rna_path[100]; BLI_strncpy(rna_path,anim_type, sizeof(rna_path)); @@ -615,7 +609,7 @@ void AnimationImporter:: Assign_color_animations(const COLLADAFW::UniqueId& list } -void AnimationImporter:: Assign_float_animations(const COLLADAFW::UniqueId& listid, ListBase *AnimCurves, char * anim_type) +void AnimationImporter:: Assign_float_animations(const COLLADAFW::UniqueId& listid, ListBase *AnimCurves, const char * anim_type) { char rna_path[100]; if (animlist_map.find(listid) == animlist_map.end()) return ; @@ -803,7 +797,6 @@ void AnimationImporter::translate_Animations ( COLLADAFW::Node * node , } bAction * act; - bActionGroup *grp = NULL; if ( (animType->transform) != 0 ) { diff --git a/source/blender/collada/AnimationImporter.h b/source/blender/collada/AnimationImporter.h index ed9a2171c87..9e8f7b42069 100644 --- a/source/blender/collada/AnimationImporter.h +++ b/source/blender/collada/AnimationImporter.h @@ -159,8 +159,8 @@ public: const COLLADAFW::AnimationList::AnimationBinding * binding, std::vector* curves, bool is_joint, char * joint_path); - void Assign_color_animations(const COLLADAFW::UniqueId& listid, ListBase *AnimCurves ,char * anim_type); - void Assign_float_animations(const COLLADAFW::UniqueId& listid, ListBase *AnimCurves, char * anim_type); + void Assign_color_animations(const COLLADAFW::UniqueId& listid, ListBase *AnimCurves, const char * anim_type); + void Assign_float_animations(const COLLADAFW::UniqueId& listid, ListBase *AnimCurves, const char * anim_type); int setAnimType ( const COLLADAFW::Animatable * prop , int type, int addition); diff --git a/source/blender/collada/ArmatureImporter.cpp b/source/blender/collada/ArmatureImporter.cpp index 27aee133557..19fa54c5044 100644 --- a/source/blender/collada/ArmatureImporter.cpp +++ b/source/blender/collada/ArmatureImporter.cpp @@ -95,8 +95,6 @@ void ArmatureImporter::create_unskinned_bone( COLLADAFW::Node *node, EditBone *p EditBone *bone = ED_armature_edit_bone_add((bArmature*)ob_arm->data, (char*)bc_get_joint_name(node)); totbone++; - bPoseChannel *pchan = get_pose_channel(ob_arm->pose, (char*)bc_get_joint_name(node)); - if (parent) bone->parent = parent; float angle = 0; @@ -280,8 +278,6 @@ void ArmatureImporter::add_leaf_bone(float mat[][4], EditBone *bone, COLLADAFW: copy_m4_m4(leaf.mat, mat); BLI_strncpy(leaf.name, bone->name, sizeof(leaf.name)); - float vec[3]; - TagsMap::iterator etit; ExtraTags *et = 0; etit = uid_tags_map.find(node->getUniqueId().toAscii()); @@ -579,7 +575,6 @@ void ArmatureImporter::set_pose ( Object * ob_arm , COLLADAFW::Node * root_node float mat[4][4]; float obmat[4][4]; - bArmature * arm = (bArmature * ) ob_arm-> data ; float ax[3]; float angle = NULL; diff --git a/source/blender/collada/DocumentImporter.cpp b/source/blender/collada/DocumentImporter.cpp index 1a91e185bac..586c6ccfe82 100644 --- a/source/blender/collada/DocumentImporter.cpp +++ b/source/blender/collada/DocumentImporter.cpp @@ -240,15 +240,15 @@ void DocumentImporter::translate_anim_recursive(COLLADAFW::Node *node, COLLADAFW root_map[node->getUniqueId()] = root_map[par->getUniqueId()]; } - COLLADAFW::Transformation::TransformationType types[] = { + /*COLLADAFW::Transformation::TransformationType types[] = { COLLADAFW::Transformation::ROTATE, COLLADAFW::Transformation::SCALE, COLLADAFW::Transformation::TRANSLATE, COLLADAFW::Transformation::MATRIX }; + Object *ob;*/ unsigned int i; - Object *ob; //for (i = 0; i < 4; i++) //ob = diff --git a/source/blender/collada/TransformReader.cpp b/source/blender/collada/TransformReader.cpp index 0fd0c85aa09..625a0220830 100644 --- a/source/blender/collada/TransformReader.cpp +++ b/source/blender/collada/TransformReader.cpp @@ -37,7 +37,6 @@ void TransformReader::get_node_mat(float mat[][4], COLLADAFW::Node *node, std::m { float cur[4][4]; float copy[4][4]; - float eul[3]; unit_m4(mat); diff --git a/source/blender/editors/space_logic/logic_window.c b/source/blender/editors/space_logic/logic_window.c index 920e93cc0fc..20b001965aa 100644 --- a/source/blender/editors/space_logic/logic_window.c +++ b/source/blender/editors/space_logic/logic_window.c @@ -3989,40 +3989,6 @@ static void draw_actuator_game(uiLayout *layout, PointerRNA *ptr) uiItemR(layout, ptr, "filename", 0, NULL, ICON_NONE); } -/* The IPO/Fcurve actuator has been deprecated, so this is no longer used */ -static void draw_actuator_ipo(uiLayout *layout, PointerRNA *ptr) -{ - Object *ob; - PointerRNA settings_ptr; - uiLayout *row, *subrow, *col; - - ob = (Object *)ptr->id.data; - RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr); - - row= uiLayoutRow(layout, 0); - uiItemR(row, ptr, "play_type", 0, "", ICON_NONE); - subrow= uiLayoutRow(row, 1); - uiItemR(subrow, ptr, "use_force", UI_ITEM_R_TOGGLE, NULL, ICON_NONE); - uiItemR(subrow, ptr, "use_additive", UI_ITEM_R_TOGGLE, NULL, ICON_NONE); - - col = uiLayoutColumn(subrow, 0); - uiLayoutSetActive(col, (RNA_boolean_get(ptr, "use_additive") || RNA_boolean_get(ptr, "use_force"))); - uiItemR(col, ptr, "use_local", UI_ITEM_R_TOGGLE, NULL, ICON_NONE); - - row= uiLayoutRow(layout, 0); - if((RNA_enum_get(ptr, "play_type") == ACT_IPO_FROM_PROP)) - uiItemPointerR(row, ptr, "property", &settings_ptr, "properties", NULL, ICON_NONE); - - else { - uiItemR(row, ptr, "frame_start", 0, NULL, ICON_NONE); - uiItemR(row, ptr, "frame_end", 0, NULL, ICON_NONE); - } - uiItemR(row, ptr, "apply_to_children", 0, NULL, ICON_NONE); - - row= uiLayoutRow(layout, 0); - uiItemPointerR(row, ptr, "frame_property", &settings_ptr, "properties", NULL, ICON_NONE); -} - static void draw_actuator_message(uiLayout *layout, PointerRNA *ptr, bContext *C) { Object *ob; diff --git a/source/blender/imbuf/intern/cineon/cineonlib.c b/source/blender/imbuf/intern/cineon/cineonlib.c index 922cfcf9629..b4da39ac41e 100644 --- a/source/blender/imbuf/intern/cineon/cineonlib.c +++ b/source/blender/imbuf/intern/cineon/cineonlib.c @@ -36,6 +36,9 @@ #include /* htonl() */ #endif #include /* memset */ + +#include "BLI_utildefines.h" + #include "cin_debug_stuff.h" #include "logmemfile.h" @@ -288,7 +291,7 @@ initCineonGenericHeader(CineonFile* cineon, CineonGenericHeader* header, const c } static void -dumpCineonGenericHeader(CineonGenericHeader* header) { +UNUSED_FUNCTION(dumpCineonGenericHeader)(CineonGenericHeader* header) { dumpCineonFileInfo(&header->fileInfo); dumpCineonImageInfo(&header->imageInfo); dumpCineonFormatInfo(&header->formatInfo); diff --git a/source/blender/imbuf/intern/cineon/logImageCore.h b/source/blender/imbuf/intern/cineon/logImageCore.h index f05c19c4f47..cbc7cb9d64a 100644 --- a/source/blender/imbuf/intern/cineon/logImageCore.h +++ b/source/blender/imbuf/intern/cineon/logImageCore.h @@ -38,8 +38,12 @@ extern "C" { #endif #include "BLO_sys_types.h" // for intptr_t support + +#ifdef _MSC_VER #undef ntohl #undef htonl +#endif + typedef int (GetRowFn)(LogImageFile* logImage, unsigned short* row, int lineNum); typedef int (SetRowFn)(LogImageFile* logImage, const unsigned short* row, int lineNum); typedef void (CloseFn)(LogImageFile* logImage); diff --git a/source/blender/makesrna/intern/rna_actuator.c b/source/blender/makesrna/intern/rna_actuator.c index 5eccba16c3d..3d0e177c94e 100644 --- a/source/blender/makesrna/intern/rna_actuator.c +++ b/source/blender/makesrna/intern/rna_actuator.c @@ -323,30 +323,6 @@ static void rna_Actuator_constraint_detect_material_set(struct PointerRNA *ptr, } } -static void rna_FcurveActuator_add_set(struct PointerRNA *ptr, int value) -{ - bActuator *act = (bActuator *)ptr->data; - bIpoActuator *ia = act->data; - - if(value == 1){ - ia->flag &= ~ACT_IPOFORCE; - ia->flag |= ACT_IPOADD; - }else - ia->flag &= ~ACT_IPOADD; -} - -static void rna_FcurveActuator_force_set(struct PointerRNA *ptr, int value) -{ - bActuator *act = (bActuator *)ptr->data; - bIpoActuator *ia = act->data; - - if(value == 1){ - ia->flag &= ~ACT_IPOADD; - ia->flag |= ACT_IPOFORCE; - }else - ia->flag &= ~ACT_IPOFORCE; -} - static void rna_ActionActuator_add_set(struct PointerRNA *ptr, int value) { bActuator *act = (bActuator *)ptr->data; @@ -858,77 +834,6 @@ static void rna_def_object_actuator(BlenderRNA *brna) RNA_def_property_update(prop, NC_LOGIC, NULL); } -/* The fcurve actuator has been replace with the action actuator, so this is no longer used */ -static void rna_def_fcurve_actuator(BlenderRNA *brna) -{ - StructRNA *srna; - PropertyRNA *prop; - - static EnumPropertyItem prop_type_items[] ={ - {ACT_IPO_PLAY, "PLAY", 0, "Play", ""}, - {ACT_IPO_PINGPONG, "PINGPONG", 0, "Ping Pong", ""}, - {ACT_IPO_FLIPPER, "FLIPPER", 0, "Flipper", ""}, - {ACT_IPO_LOOP_STOP, "STOP", 0, "Loop Stop", ""}, - {ACT_IPO_LOOP_END, "END", 0, "Loop End", ""}, -// {ACT_IPO_KEY2KEY, "IPOCHILD", 0, "Key to Key", ""}, - {ACT_IPO_FROM_PROP, "PROP", 0, "Property", ""}, - {0, NULL, 0, NULL, NULL}}; - - srna= RNA_def_struct(brna, "FCurveActuator", "Actuator"); - RNA_def_struct_ui_text(srna, "F-Curve Actuator", "Actuator to animate the object"); - RNA_def_struct_sdna_from(srna, "bIpoActuator", "data"); - - prop= RNA_def_property(srna, "play_type", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, NULL, "type"); - RNA_def_property_enum_items(prop, prop_type_items); - RNA_def_property_ui_text(prop, "F-Curve Type", "Specify the way you want to play the animation"); - RNA_def_property_update(prop, NC_LOGIC, NULL); - - prop= RNA_def_property(srna, "frame_start", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "sta"); - RNA_def_property_ui_range(prop, 1.0, MAXFRAME, 100, 2); - RNA_def_property_ui_text(prop, "Start Frame", ""); - RNA_def_property_update(prop, NC_SCENE, NULL); - - prop= RNA_def_property(srna, "frame_end", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "end"); - RNA_def_property_ui_range(prop, 1.0, MAXFRAME, 100, 2); - RNA_def_property_ui_text(prop, "End Frame", ""); - RNA_def_property_update(prop, NC_LOGIC, NULL); - - prop= RNA_def_property(srna, "property", PROP_STRING, PROP_NONE); - RNA_def_property_string_sdna(prop, NULL, "name"); - RNA_def_property_ui_text(prop, "Property", "Use this property to define the F-Curve position"); - RNA_def_property_update(prop, NC_LOGIC, NULL); - - prop= RNA_def_property(srna, "frame_property", PROP_STRING, PROP_NONE); - RNA_def_property_string_sdna(prop, NULL, "frameProp"); - RNA_def_property_ui_text(prop, "Frame Property", "Assign the action's current frame number to this property"); - - /* booleans */ - prop= RNA_def_property(srna, "use_additive", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_IPOADD); - RNA_def_property_boolean_funcs(prop, NULL, "rna_FcurveActuator_add_set"); - RNA_def_property_ui_text(prop, "Add", "F-Curve is added to the current loc/rot/scale in global or local coordinate according to Local flag"); - RNA_def_property_update(prop, NC_LOGIC, NULL); - - prop= RNA_def_property(srna, "use_force", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_IPOFORCE); - RNA_def_property_boolean_funcs(prop, NULL, "rna_FcurveActuator_force_set"); - RNA_def_property_ui_text(prop, "Force", "Apply F-Curve as a global or local force depending on the local option (dynamic objects only)"); - RNA_def_property_update(prop, NC_LOGIC, NULL); - - prop= RNA_def_property(srna, "use_local", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_IPOLOCAL); - RNA_def_property_ui_text(prop, "L", "Let the F-Curve act in local coordinates, used in Force and Add mode"); - RNA_def_property_update(prop, NC_LOGIC, NULL); - - prop= RNA_def_property(srna, "apply_to_children", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_IPOCHILD); - RNA_def_property_ui_text(prop, "Child", "Update F-Curve on all children Objects as well"); - RNA_def_property_update(prop, NC_LOGIC, NULL); -} - static void rna_def_camera_actuator(BlenderRNA *brna) { StructRNA *srna; diff --git a/source/blender/makesrna/intern/rna_particle.c b/source/blender/makesrna/intern/rna_particle.c index ba91fc3536b..77fa975761f 100644 --- a/source/blender/makesrna/intern/rna_particle.c +++ b/source/blender/makesrna/intern/rna_particle.c @@ -51,34 +51,34 @@ #include "WM_types.h" #include "WM_api.h" -static EnumPropertyItem part_from_items[] = { +EnumPropertyItem part_from_items[] = { {PART_FROM_VERT, "VERT", 0, "Verts", ""}, {PART_FROM_FACE, "FACE", 0, "Faces", ""}, {PART_FROM_VOLUME, "VOLUME", 0, "Volume", ""}, {0, NULL, 0, NULL, NULL} }; -static EnumPropertyItem part_reactor_from_items[] = { +EnumPropertyItem part_reactor_from_items[] = { {PART_FROM_VERT, "VERT", 0, "Verts", ""}, {PART_FROM_FACE, "FACE", 0, "Faces", ""}, {PART_FROM_VOLUME, "VOLUME", 0, "Volume", ""}, {0, NULL, 0, NULL, NULL} }; -static EnumPropertyItem part_dist_items[] = { +EnumPropertyItem part_dist_items[] = { {PART_DISTR_JIT, "JIT", 0, "Jittered", ""}, {PART_DISTR_RAND, "RAND", 0, "Random", ""}, {PART_DISTR_GRID, "GRID", 0, "Grid", ""}, {0, NULL, 0, NULL, NULL} }; -static EnumPropertyItem part_hair_dist_items[] = { +EnumPropertyItem part_hair_dist_items[] = { {PART_DISTR_JIT, "JIT", 0, "Jittered", ""}, {PART_DISTR_RAND, "RAND", 0, "Random", ""}, {0, NULL, 0, NULL, NULL} }; -static EnumPropertyItem part_draw_as_items[] = { +EnumPropertyItem part_draw_as_items[] = { {PART_DRAW_NOT, "NONE", 0, "None", ""}, {PART_DRAW_REND, "RENDER", 0, "Rendered", ""}, {PART_DRAW_DOT, "DOT", 0, "Point", ""}, @@ -88,14 +88,14 @@ static EnumPropertyItem part_draw_as_items[] = { {0, NULL, 0, NULL, NULL} }; -static EnumPropertyItem part_hair_draw_as_items[] = { +EnumPropertyItem part_hair_draw_as_items[] = { {PART_DRAW_NOT, "NONE", 0, "None", ""}, {PART_DRAW_REND, "RENDER", 0, "Rendered", ""}, {PART_DRAW_PATH, "PATH", 0, "Path", ""}, {0, NULL, 0, NULL, NULL} }; -static EnumPropertyItem part_ren_as_items[] = { +EnumPropertyItem part_ren_as_items[] = { {PART_DRAW_NOT, "NONE", 0, "None", ""}, {PART_DRAW_HALO, "HALO", 0, "Halo", ""}, {PART_DRAW_LINE, "LINE", 0, "Line", ""}, @@ -106,7 +106,7 @@ static EnumPropertyItem part_ren_as_items[] = { {0, NULL, 0, NULL, NULL} }; -static EnumPropertyItem part_hair_ren_as_items[] = { +EnumPropertyItem part_hair_ren_as_items[] = { {PART_DRAW_NOT, "NONE", 0, "None", ""}, {PART_DRAW_PATH, "PATH", 0, "Path", ""}, {PART_DRAW_OB, "OBJECT", 0, "Object", ""}, diff --git a/source/blender/makesrna/intern/rna_texture.c b/source/blender/makesrna/intern/rna_texture.c index a1ce77b061d..503212201c4 100644 --- a/source/blender/makesrna/intern/rna_texture.c +++ b/source/blender/makesrna/intern/rna_texture.c @@ -48,7 +48,7 @@ #include "BKE_node.h" -static EnumPropertyItem texture_filter_items[] = { +EnumPropertyItem texture_filter_items[] = { {TXF_BOX, "BOX", 0, "Box", ""}, {TXF_EWA, "EWA", 0, "EWA", ""}, {TXF_FELINE, "FELINE", 0, "FELINE", ""}, diff --git a/source/gameengine/VideoTexture/CMakeLists.txt b/source/gameengine/VideoTexture/CMakeLists.txt index 04683a5f99b..448fb307d2d 100644 --- a/source/gameengine/VideoTexture/CMakeLists.txt +++ b/source/gameengine/VideoTexture/CMakeLists.txt @@ -95,7 +95,6 @@ if(WITH_CODEC_FFMPEG) ${PTHREADS_INCLUDE_DIRS} ) add_definitions(-DWITH_FFMPEG) - add_definitions(-D__STDC_CONSTANT_MACROS) endif() blender_add_lib(ge_videotex "${SRC}" "${INC}" "${INC_SYS}") From 59a823c48aec80a48b39e27f8474302caf2dbf26 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 5 Sep 2011 19:34:27 +0000 Subject: [PATCH 083/182] Code cleanup: remove context from RNA update functions, only one left. --- source/blender/blenkernel/BKE_sound.h | 9 +- source/blender/blenkernel/intern/sequencer.c | 3 +- source/blender/blenkernel/intern/sound.c | 34 +++-- source/blender/editors/animation/anim_ops.c | 4 +- source/blender/editors/include/ED_sequencer.h | 4 - source/blender/editors/screen/screen_ops.c | 17 ++- source/blender/editors/sound/sound_ops.c | 2 +- .../blender/editors/space_graph/graph_ops.c | 4 +- .../editors/space_sequencer/sequencer_edit.c | 2 +- .../editors/space_sequencer/space_sequencer.c | 138 +++++++++++------- source/blender/makesrna/intern/rna_scene.c | 8 +- source/blender/makesrna/intern/rna_screen.c | 5 +- source/blender/makesrna/intern/rna_space.c | 16 +- source/blender/makesrna/intern/rna_wm.c | 5 +- 14 files changed, 141 insertions(+), 110 deletions(-) diff --git a/source/blender/blenkernel/BKE_sound.h b/source/blender/blenkernel/BKE_sound.h index fac5bf1cfd2..3728dd41089 100644 --- a/source/blender/blenkernel/BKE_sound.h +++ b/source/blender/blenkernel/BKE_sound.h @@ -39,7 +39,6 @@ struct PackedFile; struct bSound; -struct bContext; struct ListBase; struct Main; struct Sequence; @@ -65,12 +64,12 @@ struct bSound* sound_new_file(struct Main *main, const char *filename); // XXX unused currently #if 0 -struct bSound* sound_new_buffer(struct bContext *C, struct bSound *source); +struct bSound* sound_new_buffer(struct Main *bmain, struct bSound *source); -struct bSound* sound_new_limiter(struct bContext *C, struct bSound *source, float start, float end); +struct bSound* sound_new_limiter(struct Main *bmain, struct bSound *source, float start, float end); #endif -void sound_delete(struct bContext *C, struct bSound* sound); +void sound_delete(struct Main *bmain, struct bSound* sound); void sound_cache(struct bSound* sound); @@ -124,7 +123,7 @@ void sound_play_scene(struct Scene *scene); void sound_stop_scene(struct Scene *scene); -void sound_seek_scene(struct bContext *C); +void sound_seek_scene(struct Main *bmain, struct Scene *scene); float sound_sync_scene(struct Scene *scene); diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c index 9ef30bdd49b..dbb2e7860c5 100644 --- a/source/blender/blenkernel/intern/sequencer.c +++ b/source/blender/blenkernel/intern/sequencer.c @@ -3603,6 +3603,7 @@ Sequence *sequencer_add_image_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo #ifdef WITH_AUDASPACE Sequence *sequencer_add_sound_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo *seq_load) { + Main *bmain= CTX_data_main(C); Scene *scene= CTX_data_scene(C); /* only for sound */ Editing *ed= seq_give_editing(scene, TRUE); bSound *sound; @@ -3624,7 +3625,7 @@ Sequence *sequencer_add_sound_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo info = AUD_getInfo(sound->playback_handle); if (info.specs.channels == AUD_CHANNELS_INVALID) { - sound_delete(C, sound); + sound_delete(bmain, sound); //if(op) // BKE_report(op->reports, RPT_ERROR, "Unsupported audio format"); return NULL; diff --git a/source/blender/blenkernel/intern/sound.c b/source/blender/blenkernel/intern/sound.c index 74f4830b86c..ff518d69e21 100644 --- a/source/blender/blenkernel/intern/sound.c +++ b/source/blender/blenkernel/intern/sound.c @@ -203,7 +203,7 @@ void sound_exit(void) // XXX unused currently #if 0 -struct bSound* sound_new_buffer(struct bContext *C, struct bSound *source) +struct bSound* sound_new_buffer(struct Main *bmain, struct bSound *source) { bSound* sound = NULL; @@ -211,23 +211,23 @@ struct bSound* sound_new_buffer(struct bContext *C, struct bSound *source) strcpy(name, "buf_"); strcpy(name + 4, source->id.name); - sound = alloc_libblock(&CTX_data_main(C)->sound, ID_SO, name); + sound = alloc_libblock(&bmain->sound, ID_SO, name); sound->child_sound = source; sound->type = SOUND_TYPE_BUFFER; - sound_load(CTX_data_main(C), sound); + sound_load(bmain, sound); if(!sound->playback_handle) { - free_libblock(&CTX_data_main(C)->sound, sound); + free_libblock(&bmain->sound, sound); sound = NULL; } return sound; } -struct bSound* sound_new_limiter(struct bContext *C, struct bSound *source, float start, float end) +struct bSound* sound_new_limiter(struct Main *bmain, struct bSound *source, float start, float end) { bSound* sound = NULL; @@ -235,18 +235,18 @@ struct bSound* sound_new_limiter(struct bContext *C, struct bSound *source, floa strcpy(name, "lim_"); strcpy(name + 4, source->id.name); - sound = alloc_libblock(&CTX_data_main(C)->sound, ID_SO, name); + sound = alloc_libblock(&bmain->sound, ID_SO, name); sound->child_sound = source; sound->start = start; sound->end = end; sound->type = SOUND_TYPE_LIMITER; - sound_load(CTX_data_main(C), sound); + sound_load(bmain, sound); if(!sound->playback_handle) { - free_libblock(&CTX_data_main(C)->sound, sound); + free_libblock(&bmain->sound, sound); sound = NULL; } @@ -254,13 +254,13 @@ struct bSound* sound_new_limiter(struct bContext *C, struct bSound *source, floa } #endif -void sound_delete(struct bContext *C, struct bSound* sound) +void sound_delete(struct Main *bmain, struct bSound* sound) { if(sound) { sound_free(sound); - free_libblock(&CTX_data_main(C)->sound, sound); + free_libblock(&bmain->sound, sound); } } @@ -538,10 +538,11 @@ void sound_stop_scene(struct Scene *scene) } } -void sound_seek_scene(struct bContext *C) +void sound_seek_scene(struct Main *bmain, struct Scene *scene) { - struct Scene *scene = CTX_data_scene(C); AUD_Status status; + bScreen *screen; + int animation_playing; AUD_lock(); @@ -560,7 +561,12 @@ void sound_seek_scene(struct bContext *C) AUD_pause(scene->sound_scene_handle); } - if(scene->audio.flag & AUDIO_SCRUB && !CTX_wm_screen(C)->animtimer) + animation_playing = 0; + for(screen=bmain->screen.first; screen; screen=screen->id.next) + if(screen->animtimer) + animation_playing = 1; + + if(scene->audio.flag & AUDIO_SCRUB && !animation_playing) { if(scene->audio.flag & AUDIO_SYNC) { @@ -758,7 +764,7 @@ void sound_move_scene_sound(struct Scene *UNUSED(scene), void* UNUSED(handle), i static void sound_start_play_scene(struct Scene *UNUSED(scene)) {} void sound_play_scene(struct Scene *UNUSED(scene)) {} void sound_stop_scene(struct Scene *UNUSED(scene)) {} -void sound_seek_scene(struct bContext *UNUSED(C)) {} +void sound_seek_scene(struct Main *UNUSED(bmain), struct Scene *UNUSED(scene)) {} float sound_sync_scene(struct Scene *UNUSED(scene)) { return 0.0f; } int sound_scene_playing(struct Scene *UNUSED(scene)) { return -1; } int sound_read_sound_buffer(struct bSound* UNUSED(sound), float* UNUSED(buffer), int UNUSED(length), float UNUSED(start), float UNUSED(end)) { return 0; } diff --git a/source/blender/editors/animation/anim_ops.c b/source/blender/editors/animation/anim_ops.c index eaba8343f4d..aa61afbac78 100644 --- a/source/blender/editors/animation/anim_ops.c +++ b/source/blender/editors/animation/anim_ops.c @@ -41,6 +41,7 @@ #include "BKE_context.h" #include "BKE_global.h" +#include "BKE_main.h" #include "BKE_sound.h" #include "UI_view2d.h" @@ -76,6 +77,7 @@ static int change_frame_poll(bContext *C) /* Set the new frame number */ static void change_frame_apply(bContext *C, wmOperator *op) { + Main *bmain= CTX_data_main(C); Scene *scene= CTX_data_scene(C); /* set the new frame number */ @@ -84,7 +86,7 @@ static void change_frame_apply(bContext *C, wmOperator *op) SUBFRA = 0.f; /* do updates */ - sound_seek_scene(C); + sound_seek_scene(bmain, scene); WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene); } diff --git a/source/blender/editors/include/ED_sequencer.h b/source/blender/editors/include/ED_sequencer.h index cd22a5c6ca4..5be1403c97b 100644 --- a/source/blender/editors/include/ED_sequencer.h +++ b/source/blender/editors/include/ED_sequencer.h @@ -31,8 +31,4 @@ #define SEQ_ZOOM_FAC(szoom) ((szoom) > 0.0f)? (szoom) : ((szoom) == 0.0f)? (1.0f) : (-1.0f/(szoom)) - -/* in space_sequencer.c, for rna update function */ -void ED_sequencer_update_view(bContext *C, int view); - #endif /* ED_SEQUENCER_H */ diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index 66a67d7c4f2..b199f54cde1 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -1732,14 +1732,16 @@ static void SCREEN_OT_region_scale(wmOperatorType *ot) /* function to be called outside UI context, or for redo */ static int frame_offset_exec(bContext *C, wmOperator *op) { + Main *bmain= CTX_data_main(C); + Scene *scene= CTX_data_scene(C); int delta; delta = RNA_int_get(op->ptr, "delta"); - CTX_data_scene(C)->r.cfra += delta; - CTX_data_scene(C)->r.subframe = 0.f; + scene->r.cfra += delta; + scene->r.subframe = 0.f; - sound_seek_scene(C); + sound_seek_scene(bmain, scene); WM_event_add_notifier(C, NC_SCENE|ND_FRAME, CTX_data_scene(C)); @@ -1764,6 +1766,7 @@ static void SCREEN_OT_frame_offset(wmOperatorType *ot) /* function to be called outside UI context, or for redo */ static int frame_jump_exec(bContext *C, wmOperator *op) { + Main *bmain= CTX_data_main(C); Scene *scene= CTX_data_scene(C); wmTimer *animtimer= CTX_wm_screen(C)->animtimer; @@ -1787,7 +1790,7 @@ static int frame_jump_exec(bContext *C, wmOperator *op) else CFRA= PSFRA; - sound_seek_scene(C); + sound_seek_scene(bmain, scene); WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene); } @@ -1816,6 +1819,7 @@ static void SCREEN_OT_frame_jump(wmOperatorType *ot) /* function to be called outside UI context, or for redo */ static int keyframe_jump_exec(bContext *C, wmOperator *op) { + Main *bmain= CTX_data_main(C); Scene *scene= CTX_data_scene(C); Object *ob= CTX_data_active_object(C); bDopeSheet ads= {NULL}; @@ -1870,7 +1874,7 @@ static int keyframe_jump_exec(bContext *C, wmOperator *op) /* free temp stuff */ BLI_dlrbTree_free(&keys); - sound_seek_scene(C); + sound_seek_scene(bmain, scene); WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene); @@ -2796,6 +2800,7 @@ static int screen_animation_step(bContext *C, wmOperator *UNUSED(op), wmEvent *e bScreen *screen= CTX_wm_screen(C); if(screen->animtimer && screen->animtimer==event->customdata) { + Main *bmain= CTX_data_main(C); Scene *scene= CTX_data_scene(C); wmTimer *wt= screen->animtimer; ScreenAnimData *sad= wt->customdata; @@ -2872,7 +2877,7 @@ static int screen_animation_step(bContext *C, wmOperator *UNUSED(op), wmEvent *e } if (sad->flag & ANIMPLAY_FLAG_JUMPED) - sound_seek_scene(C); + sound_seek_scene(bmain, scene); /* since we follow drawflags, we can't send notifier but tag regions ourselves */ ED_update_for_newframe(CTX_data_main(C), scene, screen, 1); diff --git a/source/blender/editors/sound/sound_ops.c b/source/blender/editors/sound/sound_ops.c index 70884d47c23..72dbbd9da9a 100644 --- a/source/blender/editors/sound/sound_ops.c +++ b/source/blender/editors/sound/sound_ops.c @@ -119,7 +119,7 @@ static int open_exec(bContext *C, wmOperator *op) info = AUD_getInfo(sound->playback_handle); if (info.specs.channels == AUD_CHANNELS_INVALID) { - sound_delete(C, sound); + sound_delete(bmain, sound); if(op->customdata) MEM_freeN(op->customdata); BKE_report(op->reports, RPT_ERROR, "Unsupported audio format"); return OPERATOR_CANCELLED; diff --git a/source/blender/editors/space_graph/graph_ops.c b/source/blender/editors/space_graph/graph_ops.c index 0d7cdf94bc7..46918407447 100644 --- a/source/blender/editors/space_graph/graph_ops.c +++ b/source/blender/editors/space_graph/graph_ops.c @@ -41,6 +41,7 @@ #include "BLI_utildefines.h" #include "BKE_context.h" +#include "BKE_main.h" #include "BKE_sound.h" #include "UI_view2d.h" @@ -70,6 +71,7 @@ /* Set the new frame number */ static void graphview_cursor_apply(bContext *C, wmOperator *op) { + Main *bmain= CTX_data_main(C); Scene *scene= CTX_data_scene(C); SpaceIpo *sipo= CTX_wm_space_graph(C); @@ -78,7 +80,7 @@ static void graphview_cursor_apply(bContext *C, wmOperator *op) */ CFRA= RNA_int_get(op->ptr, "frame"); SUBFRA=0.f; - sound_seek_scene(C); + sound_seek_scene(bmain, scene); /* set the cursor value */ sipo->cursorVal= RNA_float_get(op->ptr, "value"); diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c index df347506e74..e7673651546 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.c +++ b/source/blender/editors/space_sequencer/sequencer_edit.c @@ -2174,7 +2174,7 @@ static int sequencer_view_toggle_exec(bContext *C, wmOperator *UNUSED(op)) sseq->view++; if (sseq->view > SEQ_VIEW_SEQUENCE_PREVIEW) sseq->view = SEQ_VIEW_SEQUENCE; - ED_sequencer_update_view(C, sseq->view); + ED_area_tag_refresh(CTX_wm_area(C)); return OPERATOR_FINISHED; } diff --git a/source/blender/editors/space_sequencer/space_sequencer.c b/source/blender/editors/space_sequencer/space_sequencer.c index 36471c7ffcf..5a0369ef80b 100644 --- a/source/blender/editors/space_sequencer/space_sequencer.c +++ b/source/blender/editors/space_sequencer/space_sequencer.c @@ -98,61 +98,6 @@ static ARegion *sequencer_find_region(ScrArea *sa, short type) return ar; } -void ED_sequencer_update_view(bContext *C, int view) -{ - ScrArea *sa= CTX_wm_area(C); - - ARegion *ar_main= sequencer_find_region(sa, RGN_TYPE_WINDOW); - ARegion *ar_preview= sequencer_find_region(sa, RGN_TYPE_PREVIEW); - - switch (view) { - case SEQ_VIEW_SEQUENCE: - if (ar_main && (ar_main->flag & RGN_FLAG_HIDDEN)) { - ar_main->flag &= ~RGN_FLAG_HIDDEN; - ar_main->v2d.flag &= ~V2D_IS_INITIALISED; - } - if (ar_preview && !(ar_preview->flag & RGN_FLAG_HIDDEN)) { - ar_preview->flag |= RGN_FLAG_HIDDEN; - ar_preview->v2d.flag &= ~V2D_IS_INITIALISED; - WM_event_remove_handlers(C, &ar_preview->handlers); - } - if (ar_main) ar_main->alignment= RGN_ALIGN_NONE; - if (ar_preview) ar_preview->alignment= RGN_ALIGN_NONE; - break; - case SEQ_VIEW_PREVIEW: - if (ar_main && !(ar_main->flag & RGN_FLAG_HIDDEN)) { - ar_main->flag |= RGN_FLAG_HIDDEN; - ar_main->v2d.flag &= ~V2D_IS_INITIALISED; - WM_event_remove_handlers(C, &ar_main->handlers); - } - if (ar_preview && (ar_preview->flag & RGN_FLAG_HIDDEN)) { - ar_preview->flag &= ~RGN_FLAG_HIDDEN; - ar_preview->v2d.flag &= ~V2D_IS_INITIALISED; - ar_preview->v2d.cur = ar_preview->v2d.tot; - } - if (ar_main) ar_main->alignment= RGN_ALIGN_NONE; - if (ar_preview) ar_preview->alignment= RGN_ALIGN_NONE; - break; - case SEQ_VIEW_SEQUENCE_PREVIEW: - if (ar_main && (ar_main->flag & RGN_FLAG_HIDDEN)) { - ar_main->flag &= ~RGN_FLAG_HIDDEN; - ar_main->v2d.flag &= ~V2D_IS_INITIALISED; - } - if (ar_preview && (ar_preview->flag & RGN_FLAG_HIDDEN)) { - ar_preview->flag &= ~RGN_FLAG_HIDDEN; - ar_preview->v2d.flag &= ~V2D_IS_INITIALISED; - ar_preview->v2d.cur = ar_preview->v2d.tot; - } - if (ar_main) ar_main->alignment= RGN_ALIGN_NONE; - if (ar_preview) ar_preview->alignment= RGN_ALIGN_TOP; - break; - } - - ED_area_initialize(CTX_wm_manager(C), CTX_wm_window(C), sa); - ED_area_tag_redraw(sa); -} - - /* ******************** default callbacks for sequencer space ***************** */ static SpaceLink *sequencer_new(const bContext *C) @@ -256,6 +201,88 @@ static void sequencer_init(struct wmWindowManager *UNUSED(wm), ScrArea *UNUSED(s } +static void sequencer_refresh(const bContext *C, ScrArea *sa) +{ + wmWindowManager *wm= CTX_wm_manager(C); + wmWindow *window= CTX_wm_window(C); + SpaceSeq *sseq= (SpaceSeq *)sa->spacedata.first; + ARegion *ar_main= sequencer_find_region(sa, RGN_TYPE_WINDOW); + ARegion *ar_preview= sequencer_find_region(sa, RGN_TYPE_PREVIEW); + int view_changed= 0; + + switch (sseq->view) { + case SEQ_VIEW_SEQUENCE: + if (ar_main && (ar_main->flag & RGN_FLAG_HIDDEN)) { + ar_main->flag &= ~RGN_FLAG_HIDDEN; + ar_main->v2d.flag &= ~V2D_IS_INITIALISED; + view_changed= 1; + } + if (ar_preview && !(ar_preview->flag & RGN_FLAG_HIDDEN)) { + ar_preview->flag |= RGN_FLAG_HIDDEN; + ar_preview->v2d.flag &= ~V2D_IS_INITIALISED; + WM_event_remove_handlers((bContext*)C, &ar_preview->handlers); + view_changed= 1; + } + if (ar_main && ar_main->alignment != RGN_ALIGN_TOP) { + ar_main->alignment= RGN_ALIGN_NONE; + view_changed= 1; + } + if (ar_preview && ar_preview->alignment != RGN_ALIGN_TOP) { + ar_preview->alignment= RGN_ALIGN_NONE; + view_changed= 1; + } + break; + case SEQ_VIEW_PREVIEW: + if (ar_main && !(ar_main->flag & RGN_FLAG_HIDDEN)) { + ar_main->flag |= RGN_FLAG_HIDDEN; + ar_main->v2d.flag &= ~V2D_IS_INITIALISED; + WM_event_remove_handlers((bContext*)C, &ar_main->handlers); + view_changed= 1; + } + if (ar_preview && (ar_preview->flag & RGN_FLAG_HIDDEN)) { + ar_preview->flag &= ~RGN_FLAG_HIDDEN; + ar_preview->v2d.flag &= ~V2D_IS_INITIALISED; + ar_preview->v2d.cur = ar_preview->v2d.tot; + view_changed= 1; + } + if (ar_main && ar_main->alignment != RGN_ALIGN_TOP) { + ar_main->alignment= RGN_ALIGN_NONE; + view_changed= 1; + } + if (ar_preview && ar_preview->alignment != RGN_ALIGN_TOP) { + ar_preview->alignment= RGN_ALIGN_NONE; + view_changed= 1; + } + break; + case SEQ_VIEW_SEQUENCE_PREVIEW: + if (ar_main && (ar_main->flag & RGN_FLAG_HIDDEN)) { + ar_main->flag &= ~RGN_FLAG_HIDDEN; + ar_main->v2d.flag &= ~V2D_IS_INITIALISED; + view_changed= 1; + } + if (ar_preview && (ar_preview->flag & RGN_FLAG_HIDDEN)) { + ar_preview->flag &= ~RGN_FLAG_HIDDEN; + ar_preview->v2d.flag &= ~V2D_IS_INITIALISED; + ar_preview->v2d.cur = ar_preview->v2d.tot; + view_changed= 1; + } + if (ar_main && ar_main->alignment != RGN_ALIGN_TOP) { + ar_main->alignment= RGN_ALIGN_NONE; + view_changed= 1; + } + if (ar_preview && ar_preview->alignment != RGN_ALIGN_TOP) { + ar_preview->alignment= RGN_ALIGN_TOP; + view_changed= 1; + } + break; + } + + if(view_changed) { + ED_area_initialize(wm, window, sa); + ED_area_tag_redraw(sa); + } +} + static SpaceLink *sequencer_duplicate(SpaceLink *sl) { SpaceSeq *sseqn= MEM_dupallocN(sl); @@ -516,6 +543,7 @@ void ED_spacetype_sequencer(void) st->operatortypes= sequencer_operatortypes; st->keymap= sequencer_keymap; st->dropboxes= sequencer_dropboxes; + st->refresh= sequencer_refresh; /* regions: main window */ art= MEM_callocN(sizeof(ARegionType), "spacetype sequencer region"); diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 3c60a3b4cd7..8c2f473c65e 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -439,11 +439,10 @@ static void rna_Scene_preview_range_end_frame_set(PointerRNA *ptr, int value) data->r.pefra= value; } -static void rna_Scene_frame_update(bContext *C, PointerRNA *UNUSED(ptr)) +static void rna_Scene_frame_update(Main *bmain, Scene *UNUSED(current_scene), PointerRNA *ptr) { - //Scene *scene= ptr->id.data; - //ED_update_for_newframe(C); - sound_seek_scene(C); + Scene *scene= (Scene*)ptr->id.data; + sound_seek_scene(bmain, scene); } static PointerRNA rna_Scene_active_keying_set_get(PointerRNA *ptr) @@ -3298,7 +3297,6 @@ void RNA_def_scene(BlenderRNA *brna) RNA_def_property_range(prop, MINAFRAME, MAXFRAME); RNA_def_property_int_funcs(prop, NULL, "rna_Scene_current_frame_set", NULL); RNA_def_property_ui_text(prop, "Current Frame", "Current Frame, to update animation data from python frame_set() instead"); - RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); RNA_def_property_update(prop, NC_SCENE|ND_FRAME, "rna_Scene_frame_update"); prop= RNA_def_property(srna, "frame_subframe", PROP_FLOAT, PROP_TIME); diff --git a/source/blender/makesrna/intern/rna_screen.c b/source/blender/makesrna/intern/rna_screen.c index be4adb405e2..59707f05e6f 100644 --- a/source/blender/makesrna/intern/rna_screen.c +++ b/source/blender/makesrna/intern/rna_screen.c @@ -68,13 +68,13 @@ static void rna_Screen_scene_set(PointerRNA *ptr, PointerRNA value) sc->newscene= value.data; } -static void rna_Screen_scene_update(bContext *C, PointerRNA *ptr) +static void rna_Screen_scene_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr) { bScreen *sc= (bScreen*)ptr->data; /* exception: can't set screens inside of area/region handers */ if(sc->newscene) { - WM_event_add_notifier(C, NC_SCENE|ND_SCENEBROWSE, sc->newscene); + WM_main_add_notifier(NC_SCENE|ND_SCENEBROWSE, sc->newscene); sc->newscene= NULL; } } @@ -231,7 +231,6 @@ static void rna_def_screen(BlenderRNA *brna) RNA_def_property_flag(prop, PROP_EDITABLE|PROP_NEVER_NULL); RNA_def_property_pointer_funcs(prop, NULL, "rna_Screen_scene_set", NULL, NULL); RNA_def_property_ui_text(prop, "Scene", "Active scene to be edited in the screen"); - RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); RNA_def_property_update(prop, 0, "rna_Screen_scene_update"); /* collections */ diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index 35360910015..35115b40d59 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -805,10 +805,9 @@ static void rna_SpaceDopeSheetEditor_mode_update(Main *UNUSED(bmain), Scene *sce /* Space Graph Editor */ -static void rna_SpaceGraphEditor_display_mode_update(bContext *C, PointerRNA *UNUSED(ptr)) +static void rna_SpaceGraphEditor_display_mode_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr) { - //SpaceIpo *sipo= (SpaceIpo*)(ptr->data); - ScrArea *sa= CTX_wm_area(C); + ScrArea *sa= rna_area_from_space(ptr); /* after changing view mode, must force recalculation of F-Curve colors * which can only be achieved using refresh as opposed to redraw @@ -822,11 +821,10 @@ static int rna_SpaceGraphEditor_has_ghost_curves_get(PointerRNA *ptr) return (sipo->ghostCurves.first != NULL); } -static void rna_Sequencer_display_mode_update(bContext *C, PointerRNA *ptr) +static void rna_Sequencer_view_type_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr) { - int view = RNA_enum_get(ptr, "view_type"); - - ED_sequencer_update_view(C, view); + ScrArea *sa= rna_area_from_space(ptr); + ED_area_tag_refresh(sa); } static float rna_BackgroundImage_opacity_get(PointerRNA *ptr) @@ -1689,8 +1687,7 @@ static void rna_def_space_sequencer(BlenderRNA *brna) RNA_def_property_enum_sdna(prop, NULL, "view"); RNA_def_property_enum_items(prop, view_type_items); RNA_def_property_ui_text(prop, "View Type", "The type of the Sequencer view (sequencer, preview or both)"); - RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); - RNA_def_property_update(prop, 0, "rna_Sequencer_display_mode_update"); + RNA_def_property_update(prop, 0, "rna_Sequencer_view_type_update"); /* display type, fairly important */ prop= RNA_def_property(srna, "display_mode", PROP_ENUM, PROP_NONE); @@ -1987,7 +1984,6 @@ static void rna_def_space_graph(BlenderRNA *brna) RNA_def_property_enum_sdna(prop, NULL, "mode"); RNA_def_property_enum_items(prop, mode_items); RNA_def_property_ui_text(prop, "Mode", "Editing context being displayed"); - RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); RNA_def_property_update(prop, NC_SPACE|ND_SPACE_GRAPH, "rna_SpaceGraphEditor_display_mode_update"); /* display */ diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c index 4c07a89a42f..a595b121d1a 100644 --- a/source/blender/makesrna/intern/rna_wm.c +++ b/source/blender/makesrna/intern/rna_wm.c @@ -482,13 +482,13 @@ static void rna_Window_screen_set(PointerRNA *ptr, PointerRNA value) win->newscreen= value.data; } -static void rna_Window_screen_update(bContext *C, PointerRNA *ptr) +static void rna_Window_screen_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr) { wmWindow *win= (wmWindow*)ptr->data; /* exception: can't set screens inside of area/region handers */ if(win->newscreen) { - WM_event_add_notifier(C, NC_SCREEN|ND_SCREENBROWSE, win->newscreen); + WM_main_add_notifier(NC_SCREEN|ND_SCREENBROWSE, win->newscreen); win->newscreen= NULL; } } @@ -1454,7 +1454,6 @@ static void rna_def_window(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Screen", "Active screen showing in the window"); RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_pointer_funcs(prop, NULL, "rna_Window_screen_set", NULL, NULL); - RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); RNA_def_property_update(prop, 0, "rna_Window_screen_update"); } From 6e9ff495eb082aeb49e6a1da23a7827d3fcd0fde Mon Sep 17 00:00:00 2001 From: Nathan Letwory Date: Mon, 5 Sep 2011 20:41:58 +0000 Subject: [PATCH 084/182] Add parser error handler. OpenCOLLADA is a validating parser, so is pretty strict about document form. The added error handler will print out any errors the parser finds. A pop-up will be shown too, advising the user to check the console for the error log. --- source/blender/collada/CMakeLists.txt | 2 + source/blender/collada/DocumentImporter.cpp | 9 +- source/blender/collada/ErrorHandler.cpp | 90 +++++++++++++++++++ source/blender/collada/ErrorHandler.h | 58 ++++++++++++ source/blender/collada/collada.cpp | 4 +- .../windowmanager/intern/wm_operators.c | 4 +- 6 files changed, 161 insertions(+), 6 deletions(-) create mode 100644 source/blender/collada/ErrorHandler.cpp create mode 100644 source/blender/collada/ErrorHandler.h diff --git a/source/blender/collada/CMakeLists.txt b/source/blender/collada/CMakeLists.txt index ffe3d5f4f85..d73373aa901 100644 --- a/source/blender/collada/CMakeLists.txt +++ b/source/blender/collada/CMakeLists.txt @@ -51,6 +51,7 @@ set(SRC DocumentExporter.cpp DocumentImporter.cpp EffectExporter.cpp + ErrorHandler.cpp ExtraHandler.cpp ExtraTags.cpp GeometryExporter.cpp @@ -74,6 +75,7 @@ set(SRC DocumentExporter.h DocumentImporter.h EffectExporter.h + ErrorHandler.h ExtraHandler.h ExtraTags.h GeometryExporter.h diff --git a/source/blender/collada/DocumentImporter.cpp b/source/blender/collada/DocumentImporter.cpp index 586c6ccfe82..366837421e3 100644 --- a/source/blender/collada/DocumentImporter.cpp +++ b/source/blender/collada/DocumentImporter.cpp @@ -76,6 +76,7 @@ #include "MEM_guardedalloc.h" #include "ExtraHandler.h" +#include "ErrorHandler.h" #include "DocumentImporter.h" #include "TransformReader.h" @@ -113,17 +114,19 @@ DocumentImporter::~DocumentImporter() bool DocumentImporter::import() { - /** TODO Add error handler (implement COLLADASaxFWL::IErrorHandler */ - COLLADASaxFWL::Loader loader; + ErrorHandler errorHandler; + COLLADASaxFWL::Loader loader(&errorHandler); COLLADAFW::Root root(&loader, this); ExtraHandler *ehandler = new ExtraHandler(this, &(this->anim_importer)); loader.registerExtraDataCallbackHandler(ehandler); - if (!root.loadDocument(mFilename)) return false; + if(errorHandler.hasError()) + return false; + /** TODO set up scene graph and such here */ mImportStage = Controller; diff --git a/source/blender/collada/ErrorHandler.cpp b/source/blender/collada/ErrorHandler.cpp new file mode 100644 index 00000000000..7108dbad18a --- /dev/null +++ b/source/blender/collada/ErrorHandler.cpp @@ -0,0 +1,90 @@ +/* + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): Nathan Letwory. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/collada/ErrorHandler.cpp + * \ingroup collada + */ +#include "ErrorHandler.h" +#include + +#include "COLLADASaxFWLIError.h" +#include "COLLADASaxFWLSaxParserError.h" +#include "COLLADASaxFWLSaxFWLError.h" + +#include "GeneratedSaxParserParserError.h" + +#include + +//-------------------------------------------------------------------- +ErrorHandler::ErrorHandler() : mError(false) +{ +} + +//-------------------------------------------------------------------- +ErrorHandler::~ErrorHandler() +{ +} + +//-------------------------------------------------------------------- +bool ErrorHandler::handleError( const COLLADASaxFWL::IError* error ) +{ + if ( error->getErrorClass() == COLLADASaxFWL::IError::ERROR_SAXPARSER ) + { + COLLADASaxFWL::SaxParserError* saxParserError = (COLLADASaxFWL::SaxParserError*) error; + const GeneratedSaxParser::ParserError& parserError = saxParserError->getError(); + + // Workaround to avoid wrong error + if ( parserError.getErrorType() == GeneratedSaxParser::ParserError::ERROR_VALIDATION_MIN_OCCURS_UNMATCHED) + { + if ( strcmp(parserError.getElement(), "effect") == 0 ) + { + return false; + } + } + if ( parserError.getErrorType() == GeneratedSaxParser::ParserError::ERROR_VALIDATION_SEQUENCE_PREVIOUS_SIBLING_NOT_PRESENT) + { + if ( (strcmp(parserError.getElement(), "extra") == 0) + && (strcmp(parserError.getAdditionalText().c_str(), "sibling: fx_profile_abstract") == 0)) + { + return false; + } + } + + if ( parserError.getErrorType() == GeneratedSaxParser::ParserError::ERROR_COULD_NOT_OPEN_FILE) + { + std::cout << "Couldn't open file" << std::endl; + mError = true; + } + + std::cout << "Schema validation error: " << parserError.getErrorMessage() << std::endl; + mError = true; + } + else if ( error->getErrorClass() == COLLADASaxFWL::IError::ERROR_SAXFWL ) + { + COLLADASaxFWL::SaxFWLError* saxFWLError = (COLLADASaxFWL::SaxFWLError*) error; + std::cout << "Sax FWL Error: " << saxFWLError->getErrorMessage() << std::endl; + mError = true; + } + return false; +} diff --git a/source/blender/collada/ErrorHandler.h b/source/blender/collada/ErrorHandler.h new file mode 100644 index 00000000000..4064abb89f6 --- /dev/null +++ b/source/blender/collada/ErrorHandler.h @@ -0,0 +1,58 @@ +/* + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): Nathan Letwory. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/collada/ErrorHandler.h + * \ingroup collada + */ + +#include +#include +#include +#include // sort() + +#include "COLLADASaxFWLIErrorHandler.h" + +/** \brief Handler class for parser errors + */ +class ErrorHandler : public COLLADASaxFWL::IErrorHandler +{ +public: + /** Constructor. */ + ErrorHandler(); + + /** Destructor. */ + virtual ~ErrorHandler(); + /** handle any error thrown by the parser. */ + bool virtual handleError(const COLLADASaxFWL::IError* error); + /** True if there was an error during parsing. */ + bool hasError() { return mError; } +private: + /** Disable default copy ctor. */ + ErrorHandler( const ErrorHandler& pre ); + /** Disable default assignment operator. */ + const ErrorHandler& operator= ( const ErrorHandler& pre ); + /** Hold error status. */ + bool mError; +}; + diff --git a/source/blender/collada/collada.cpp b/source/blender/collada/collada.cpp index c15e608c360..4caca20531f 100644 --- a/source/blender/collada/collada.cpp +++ b/source/blender/collada/collada.cpp @@ -46,9 +46,9 @@ extern "C" int collada_import(bContext *C, const char *filepath) { DocumentImporter imp (C, filepath); - imp.import(); + if(imp.import()) return 1; - return 1; + return 0; } int collada_export(Scene *sce, const char *filepath, int selected) diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index 0e0203543a4..68a4eebf93f 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -2082,7 +2082,9 @@ static int wm_collada_import_exec(bContext *C, wmOperator *op) } RNA_string_get(op->ptr, "filepath", filename); - collada_import(C, filename); + if(collada_import(C, filename)) return OPERATOR_FINISHED; + + BKE_report(op->reports, RPT_ERROR, "Errors found during parsing COLLADA document. Please see console for error log."); return OPERATOR_FINISHED; } From 8e0fe8bff72e2dc2926618577eaffdd3417a8304 Mon Sep 17 00:00:00 2001 From: Lukas Toenne Date: Mon, 5 Sep 2011 21:01:50 +0000 Subject: [PATCH 085/182] Merged the particles-2010 branch with node improvements into trunk. This branch adds mostly organizational improvements to the node system by renaming the node folders and files. A couple of internal features have been added too. Detailed information can be found on the wiki page: http://wiki.blender.org/index.php/User:Phonybone/Particles2010 --- source/blender/blenkernel/BKE_blender.h | 2 +- source/blender/blenkernel/BKE_node.h | 346 +- source/blender/blenkernel/intern/material.c | 9 +- source/blender/blenkernel/intern/node.c | 3437 +++++------------ source/blender/blenkernel/intern/texture.c | 4 +- source/blender/blenlib/BLI_math_matrix.h | 3 + source/blender/blenlib/BLI_math_vector.h | 1 + source/blender/blenlib/intern/math_matrix.c | 18 + source/blender/blenlib/intern/math_vector.c | 8 + source/blender/blenloader/CMakeLists.txt | 1 + source/blender/blenloader/SConscript | 2 +- source/blender/blenloader/intern/readfile.c | 255 +- source/blender/blenloader/intern/writefile.c | 26 +- source/blender/editors/include/ED_node.h | 5 +- .../editors/sculpt_paint/paint_image.c | 5 +- source/blender/editors/sculpt_paint/sculpt.c | 5 +- source/blender/editors/space_node/drawnode.c | 748 +++- .../blender/editors/space_node/node_buttons.c | 4 +- source/blender/editors/space_node/node_draw.c | 679 +--- source/blender/editors/space_node/node_edit.c | 672 ++-- .../blender/editors/space_node/node_header.c | 192 +- .../blender/editors/space_node/node_intern.h | 15 +- source/blender/editors/space_node/node_ops.c | 3 +- .../blender/editors/space_node/node_select.c | 24 +- .../blender/editors/space_node/node_state.c | 34 +- .../blender/editors/space_node/space_node.c | 22 +- .../editors/transform/transform_conversions.c | 19 +- source/blender/gpu/SConscript | 2 +- source/blender/makesdna/DNA_node_types.h | 171 +- source/blender/makesrna/RNA_access.h | 8 +- source/blender/makesrna/RNA_enum_types.h | 2 + source/blender/makesrna/RNA_types.h | 5 +- source/blender/makesrna/SConscript | 1 + source/blender/makesrna/intern/rna_access.c | 11 + source/blender/makesrna/intern/rna_main_api.c | 4 +- source/blender/makesrna/intern/rna_nodetree.c | 437 ++- .../makesrna/intern/rna_nodetree_types.h | 10 +- source/blender/makesrna/intern/rna_object.c | 14 +- source/blender/makesrna/intern/rna_rna.c | 36 + source/blender/makesrna/intern/rna_space.c | 33 +- source/blender/modifiers/CMakeLists.txt | 1 + source/blender/modifiers/SConscript | 2 +- source/blender/nodes/CMakeLists.txt | 232 +- .../nodes/{CMP_node.h => NOD_composite.h} | 14 +- .../nodes/{SHD_node.h => NOD_shader.h} | 14 +- source/blender/nodes/NOD_socket.h | 89 + .../nodes/{TEX_node.h => NOD_texture.h} | 14 +- source/blender/nodes/SConscript | 8 +- .../nodes/composite/node_composite_tree.c | 811 ++++ .../node_composite_util.c} | 12 +- .../node_composite_util.h} | 9 +- .../nodes/node_composite_alphaOver.c} | 24 +- .../nodes/node_composite_bilateralblur.c} | 20 +- .../nodes/node_composite_blur.c} | 22 +- .../nodes/node_composite_brightness.c} | 22 +- .../nodes/node_composite_channelMatte.c} | 22 +- .../nodes/node_composite_chromaMatte.c} | 24 +- .../nodes/node_composite_colorMatte.c} | 24 +- .../nodes/node_composite_colorSpill.c} | 22 +- .../nodes/node_composite_colorbalance.c} | 20 +- .../composite/nodes/node_composite_common.c | 373 ++ .../nodes/node_composite_composite.c} | 18 +- .../nodes/node_composite_crop.c} | 18 +- .../nodes/node_composite_curves.c} | 50 +- .../nodes/node_composite_defocus.c} | 22 +- .../nodes/node_composite_diffMatte.c} | 24 +- .../nodes/node_composite_dilate.c} | 18 +- .../nodes/node_composite_directionalblur.c} | 18 +- .../nodes/node_composite_displace.c} | 24 +- .../nodes/node_composite_distanceMatte.c} | 24 +- .../nodes/node_composite_filter.c} | 20 +- .../nodes/node_composite_flip.c} | 18 +- .../nodes/node_composite_gamma.c} | 20 +- .../nodes/node_composite_glare.c} | 18 +- .../nodes/node_composite_hueSatVal.c} | 22 +- .../nodes/node_composite_huecorrect.c} | 22 +- .../nodes/node_composite_idMask.c} | 18 +- .../nodes/node_composite_image.c} | 32 +- .../nodes/node_composite_invert.c} | 22 +- .../nodes/node_composite_lensdist.c} | 22 +- .../nodes/node_composite_levels.c} | 37 +- .../nodes/node_composite_lummaMatte.c} | 22 +- .../nodes/node_composite_mapUV.c} | 20 +- .../nodes/node_composite_mapValue.c} | 20 +- .../nodes/node_composite_math.c} | 21 +- .../nodes/node_composite_mixrgb.c} | 22 +- .../nodes/node_composite_normal.c} | 36 +- .../nodes/node_composite_normalize.c} | 18 +- .../nodes/node_composite_outputFile.c} | 18 +- .../nodes/node_composite_premulkey.c} | 18 +- .../nodes/node_composite_rgb.c} | 29 +- .../nodes/node_composite_rotate.c} | 22 +- .../nodes/node_composite_scale.c} | 22 +- .../nodes/node_composite_sepcombHSVA.c} | 42 +- .../nodes/node_composite_sepcombRGBA.c} | 42 +- .../nodes/node_composite_sepcombYCCA.c} | 42 +- .../nodes/node_composite_sepcombYUVA.c} | 42 +- .../nodes/node_composite_setalpha.c} | 20 +- .../nodes/node_composite_splitViewer.c} | 18 +- .../nodes/node_composite_texture.c} | 22 +- .../nodes/node_composite_tonemap.c} | 18 +- .../nodes/node_composite_translate.c} | 22 +- .../nodes/node_composite_valToRgb.c} | 32 +- .../nodes/node_composite_value.c} | 26 +- .../nodes/node_composite_vecBlur.c} | 24 +- .../nodes/node_composite_viewer.c} | 22 +- .../nodes/node_composite_zcombine.c} | 26 +- source/blender/nodes/intern/SHD_util.c | 219 -- source/blender/nodes/intern/node_common.c | 982 +++++ source/blender/nodes/intern/node_common.h | 65 + source/blender/nodes/intern/node_exec.c | 308 ++ source/blender/nodes/intern/node_exec.h | 89 + source/blender/nodes/intern/node_socket.c | 428 ++ source/blender/nodes/intern/node_util.c | 18 +- source/blender/nodes/intern/node_util.h | 13 + .../blender/nodes/shader/node_shader_tree.c | 212 + .../blender/nodes/shader/node_shader_util.c | 287 ++ .../SHD_util.h => shader/node_shader_util.h} | 15 +- .../nodes/node_shader_camera.c} | 18 +- .../nodes/shader/nodes/node_shader_common.c | 327 ++ .../nodes/node_shader_curves.c} | 38 +- .../nodes/node_shader_dynamic.c} | 10 +- .../nodes/node_shader_geom.c} | 30 +- .../nodes/node_shader_hueSatVal.c} | 24 +- .../nodes/node_shader_invert.c} | 20 +- .../nodes/node_shader_mapping.c} | 20 +- .../nodes/node_shader_material.c} | 86 +- .../nodes/node_shader_math.c} | 20 +- .../nodes/node_shader_mixRgb.c} | 24 +- .../nodes/node_shader_normal.c} | 36 +- .../nodes/node_shader_output.c} | 18 +- .../nodes/node_shader_rgb.c} | 32 +- .../nodes/node_shader_sepcombRGB.c} | 36 +- .../nodes/node_shader_squeeze.c} | 28 +- .../nodes/node_shader_texture.c} | 22 +- .../nodes/node_shader_valToRgb.c} | 34 +- .../nodes/node_shader_value.c} | 29 +- .../nodes/node_shader_vectMath.c} | 22 +- .../blender/nodes/texture/node_texture_tree.c | 237 ++ .../node_texture_util.c} | 52 +- .../node_texture_util.h} | 9 +- .../nodes/node_texture_at.c} | 20 +- .../nodes/node_texture_bricks.c} | 33 +- .../nodes/node_texture_checker.c} | 22 +- .../nodes/texture/nodes/node_texture_common.c | 271 ++ .../nodes/node_texture_compose.c} | 24 +- .../nodes/node_texture_coord.c} | 14 +- .../nodes/node_texture_curves.c} | 30 +- .../nodes/node_texture_decompose.c} | 24 +- .../nodes/node_texture_distance.c} | 20 +- .../nodes/node_texture_hueSatVal.c} | 26 +- .../nodes/node_texture_image.c} | 18 +- .../nodes/node_texture_invert.c} | 18 +- .../nodes/node_texture_math.c} | 20 +- .../nodes/node_texture_mixRgb.c} | 22 +- .../nodes/node_texture_output.c} | 18 +- .../nodes/node_texture_proc.c} | 87 +- .../nodes/node_texture_rotate.c} | 22 +- .../nodes/node_texture_scale.c} | 18 +- .../nodes/node_texture_texture.c} | 24 +- .../nodes/node_texture_translate.c} | 20 +- .../nodes/node_texture_valToNor.c} | 20 +- .../nodes/node_texture_valToRgb.c} | 32 +- .../nodes/node_texture_viewer.c} | 16 +- .../render/intern/source/render_texture.c | 6 +- source/creator/CMakeLists.txt | 1 - 166 files changed, 9403 insertions(+), 5416 deletions(-) rename source/blender/nodes/{CMP_node.h => NOD_composite.h} (93%) rename source/blender/nodes/{SHD_node.h => NOD_shader.h} (88%) create mode 100644 source/blender/nodes/NOD_socket.h rename source/blender/nodes/{TEX_node.h => NOD_texture.h} (90%) create mode 100644 source/blender/nodes/composite/node_composite_tree.c rename source/blender/nodes/{intern/CMP_util.c => composite/node_composite_util.c} (99%) rename source/blender/nodes/{intern/CMP_util.h => composite/node_composite_util.h} (97%) rename source/blender/nodes/{intern/CMP_nodes/CMP_alphaOver.c => composite/nodes/node_composite_alphaOver.c} (86%) rename source/blender/nodes/{intern/CMP_nodes/CMP_bilateralblur.c => composite/nodes/node_composite_bilateralblur.c} (91%) rename source/blender/nodes/{intern/CMP_nodes/CMP_blur.c => composite/nodes/node_composite_blur.c} (96%) rename source/blender/nodes/{intern/CMP_nodes/CMP_brightness.c => composite/nodes/node_composite_brightness.c} (79%) rename source/blender/nodes/{intern/CMP_nodes/CMP_channelMatte.c => composite/nodes/node_composite_channelMatte.c} (89%) rename source/blender/nodes/{intern/CMP_nodes/CMP_chromaMatte.c => composite/nodes/node_composite_chromaMatte.c} (88%) rename source/blender/nodes/{intern/CMP_nodes/CMP_colorMatte.c => composite/nodes/node_composite_colorMatte.c} (84%) rename source/blender/nodes/{intern/CMP_nodes/CMP_colorSpill.c => composite/nodes/node_composite_colorSpill.c} (93%) rename source/blender/nodes/{intern/CMP_nodes/CMP_colorbalance.c => composite/nodes/node_composite_colorbalance.c} (91%) create mode 100644 source/blender/nodes/composite/nodes/node_composite_common.c rename source/blender/nodes/{intern/CMP_nodes/CMP_composite.c => composite/nodes/node_composite_composite.c} (85%) rename source/blender/nodes/{intern/CMP_nodes/CMP_crop.c => composite/nodes/node_composite_crop.c} (87%) rename source/blender/nodes/{intern/CMP_nodes/CMP_curves.c => composite/nodes/node_composite_curves.c} (78%) rename source/blender/nodes/{intern/CMP_nodes/CMP_defocus.c => composite/nodes/node_composite_defocus.c} (97%) rename source/blender/nodes/{intern/CMP_nodes/CMP_diffMatte.c => composite/nodes/node_composite_diffMatte.c} (84%) rename source/blender/nodes/{intern/CMP_nodes/CMP_dilate.c => composite/nodes/node_composite_dilate.c} (87%) rename source/blender/nodes/{intern/CMP_nodes/CMP_directionalblur.c => composite/nodes/node_composite_directionalblur.c} (88%) rename source/blender/nodes/{intern/CMP_nodes/CMP_displace.c => composite/nodes/node_composite_displace.c} (88%) rename source/blender/nodes/{intern/CMP_nodes/CMP_distanceMatte.c => composite/nodes/node_composite_distanceMatte.c} (83%) rename source/blender/nodes/{intern/CMP_nodes/CMP_filter.c => composite/nodes/node_composite_filter.c} (92%) rename source/blender/nodes/{intern/CMP_nodes/CMP_flip.c => composite/nodes/node_composite_flip.c} (85%) rename source/blender/nodes/{intern/CMP_nodes/CMP_gamma.c => composite/nodes/node_composite_gamma.c} (81%) rename source/blender/nodes/{intern/CMP_nodes/CMP_glare.c => composite/nodes/node_composite_glare.c} (96%) rename source/blender/nodes/{intern/CMP_nodes/CMP_hueSatVal.c => composite/nodes/node_composite_hueSatVal.c} (82%) rename source/blender/nodes/{intern/CMP_nodes/CMP_huecorrect.c => composite/nodes/node_composite_huecorrect.c} (87%) rename source/blender/nodes/{intern/CMP_nodes/CMP_idMask.c => composite/nodes/node_composite_idMask.c} (84%) rename source/blender/nodes/{intern/CMP_nodes/CMP_image.c => composite/nodes/node_composite_image.c} (93%) rename source/blender/nodes/{intern/CMP_nodes/CMP_invert.c => composite/nodes/node_composite_invert.c} (84%) rename source/blender/nodes/{intern/CMP_nodes/CMP_lensdist.c => composite/nodes/node_composite_lensdist.c} (90%) rename source/blender/nodes/{intern/CMP_nodes/CMP_levels.c => composite/nodes/node_composite_levels.c} (87%) rename source/blender/nodes/{intern/CMP_nodes/CMP_lummaMatte.c => composite/nodes/node_composite_lummaMatte.c} (82%) rename source/blender/nodes/{intern/CMP_nodes/CMP_mapUV.c => composite/nodes/node_composite_mapUV.c} (90%) rename source/blender/nodes/{intern/CMP_nodes/CMP_mapValue.c => composite/nodes/node_composite_mapValue.c} (80%) rename source/blender/nodes/{intern/CMP_nodes/CMP_math.c => composite/nodes/node_composite_math.c} (89%) rename source/blender/nodes/{intern/CMP_nodes/CMP_mixrgb.c => composite/nodes/node_composite_mixrgb.c} (81%) rename source/blender/nodes/{intern/CMP_nodes/CMP_normal.c => composite/nodes/node_composite_normal.c} (72%) rename source/blender/nodes/{intern/CMP_nodes/CMP_normalize.c => composite/nodes/node_composite_normalize.c} (86%) rename source/blender/nodes/{intern/CMP_nodes/CMP_outputFile.c => composite/nodes/node_composite_outputFile.c} (85%) rename source/blender/nodes/{intern/CMP_nodes/CMP_premulkey.c => composite/nodes/node_composite_premulkey.c} (79%) rename source/blender/nodes/{intern/CMP_nodes/CMP_rgb.c => composite/nodes/node_composite_rgb.c} (64%) rename source/blender/nodes/{intern/CMP_nodes/CMP_rotate.c => composite/nodes/node_composite_rotate.c} (83%) rename source/blender/nodes/{intern/CMP_nodes/CMP_scale.c => composite/nodes/node_composite_scale.c} (84%) rename source/blender/nodes/{intern/CMP_nodes/CMP_sepcombHSVA.c => composite/nodes/node_composite_sepcombHSVA.c} (80%) rename source/blender/nodes/{intern/CMP_nodes/CMP_sepcombRGBA.c => composite/nodes/node_composite_sepcombRGBA.c} (78%) rename source/blender/nodes/{intern/CMP_nodes/CMP_sepcombYCCA.c => composite/nodes/node_composite_sepcombYCCA.c} (87%) rename source/blender/nodes/{intern/CMP_nodes/CMP_sepcombYUVA.c => composite/nodes/node_composite_sepcombYUVA.c} (80%) rename source/blender/nodes/{intern/CMP_nodes/CMP_setalpha.c => composite/nodes/node_composite_setalpha.c} (81%) rename source/blender/nodes/{intern/CMP_nodes/CMP_splitViewer.c => composite/nodes/node_composite_splitViewer.c} (88%) rename source/blender/nodes/{intern/CMP_nodes/CMP_texture.c => composite/nodes/node_composite_texture.c} (90%) rename source/blender/nodes/{intern/CMP_nodes/CMP_tonemap.c => composite/nodes/node_composite_tonemap.c} (91%) rename source/blender/nodes/{intern/CMP_nodes/CMP_translate.c => composite/nodes/node_composite_translate.c} (73%) rename source/blender/nodes/{intern/CMP_nodes/CMP_valToRgb.c => composite/nodes/node_composite_valToRgb.c} (80%) rename source/blender/nodes/{intern/CMP_nodes/CMP_value.c => composite/nodes/node_composite_value.c} (65%) rename source/blender/nodes/{intern/CMP_nodes/CMP_vecBlur.c => composite/nodes/node_composite_vecBlur.c} (81%) rename source/blender/nodes/{intern/CMP_nodes/CMP_viewer.c => composite/nodes/node_composite_viewer.c} (86%) rename source/blender/nodes/{intern/CMP_nodes/CMP_zcombine.c => composite/nodes/node_composite_zcombine.c} (89%) delete mode 100644 source/blender/nodes/intern/SHD_util.c create mode 100644 source/blender/nodes/intern/node_common.c create mode 100644 source/blender/nodes/intern/node_common.h create mode 100644 source/blender/nodes/intern/node_exec.c create mode 100644 source/blender/nodes/intern/node_exec.h create mode 100644 source/blender/nodes/intern/node_socket.c create mode 100644 source/blender/nodes/shader/node_shader_tree.c create mode 100644 source/blender/nodes/shader/node_shader_util.c rename source/blender/nodes/{intern/SHD_util.h => shader/node_shader_util.h} (86%) rename source/blender/nodes/{intern/SHD_nodes/SHD_camera.c => shader/nodes/node_shader_camera.c} (80%) create mode 100644 source/blender/nodes/shader/nodes/node_shader_common.c rename source/blender/nodes/{intern/SHD_nodes/SHD_curves.c => shader/nodes/node_shader_curves.c} (76%) rename source/blender/nodes/{intern/SHD_nodes/SHD_dynamic.c => shader/nodes/node_shader_dynamic.c} (99%) rename source/blender/nodes/{intern/SHD_nodes/SHD_geom.c => shader/nodes/node_shader_geom.c} (84%) rename source/blender/nodes/{intern/SHD_nodes/SHD_hueSatVal.c => shader/nodes/node_shader_hueSatVal.c} (77%) rename source/blender/nodes/{intern/SHD_nodes/SHD_invert.c => shader/nodes/node_shader_invert.c} (80%) rename source/blender/nodes/{intern/SHD_nodes/SHD_mapping.c => shader/nodes/node_shader_mapping.c} (85%) rename source/blender/nodes/{intern/SHD_nodes/SHD_material.c => shader/nodes/node_shader_material.c} (77%) rename source/blender/nodes/{intern/SHD_nodes/SHD_math.c => shader/nodes/node_shader_math.c} (92%) rename source/blender/nodes/{intern/SHD_nodes/SHD_mixRgb.c => shader/nodes/node_shader_mixRgb.c} (79%) rename source/blender/nodes/{intern/SHD_nodes/SHD_normal.c => shader/nodes/node_shader_normal.c} (67%) rename source/blender/nodes/{intern/SHD_nodes/SHD_output.c => shader/nodes/node_shader_output.c} (83%) rename source/blender/nodes/{intern/SHD_nodes/SHD_rgb.c => shader/nodes/node_shader_rgb.c} (65%) rename source/blender/nodes/{intern/SHD_nodes/SHD_sepcombRGB.c => shader/nodes/node_shader_sepcombRGB.c} (74%) rename source/blender/nodes/{intern/SHD_nodes/SHD_squeeze.c => shader/nodes/node_shader_squeeze.c} (70%) rename source/blender/nodes/{intern/SHD_nodes/SHD_texture.c => shader/nodes/node_shader_texture.c} (88%) rename source/blender/nodes/{intern/SHD_nodes/SHD_valToRgb.c => shader/nodes/node_shader_valToRgb.c} (76%) rename source/blender/nodes/{intern/SHD_nodes/SHD_value.c => shader/nodes/node_shader_value.c} (66%) rename source/blender/nodes/{intern/SHD_nodes/SHD_vectMath.c => shader/nodes/node_shader_vectMath.c} (87%) create mode 100644 source/blender/nodes/texture/node_texture_tree.c rename source/blender/nodes/{intern/TEX_util.c => texture/node_texture_util.c} (78%) rename source/blender/nodes/{intern/TEX_util.h => texture/node_texture_util.h} (93%) rename source/blender/nodes/{intern/TEX_nodes/TEX_at.c => texture/nodes/node_texture_at.c} (82%) rename source/blender/nodes/{intern/TEX_nodes/TEX_bricks.c => texture/nodes/node_texture_bricks.c} (76%) rename source/blender/nodes/{intern/TEX_nodes/TEX_checker.c => texture/nodes/node_texture_checker.c} (79%) create mode 100644 source/blender/nodes/texture/nodes/node_texture_common.c rename source/blender/nodes/{intern/TEX_nodes/TEX_compose.c => texture/nodes/node_texture_compose.c} (71%) rename source/blender/nodes/{intern/TEX_nodes/TEX_coord.c => texture/nodes/node_texture_coord.c} (86%) rename source/blender/nodes/{intern/TEX_nodes/TEX_curves.c => texture/nodes/node_texture_curves.c} (80%) rename source/blender/nodes/{intern/TEX_nodes/TEX_decompose.c => texture/nodes/node_texture_decompose.c} (80%) rename source/blender/nodes/{intern/TEX_nodes/TEX_distance.c => texture/nodes/node_texture_distance.c} (84%) rename source/blender/nodes/{intern/TEX_nodes/TEX_hueSatVal.c => texture/nodes/node_texture_hueSatVal.c} (78%) rename source/blender/nodes/{intern/TEX_nodes/TEX_image.c => texture/nodes/node_texture_image.c} (86%) rename source/blender/nodes/{intern/TEX_nodes/TEX_invert.c => texture/nodes/node_texture_invert.c} (83%) rename source/blender/nodes/{intern/TEX_nodes/TEX_math.c => texture/nodes/node_texture_math.c} (89%) rename source/blender/nodes/{intern/TEX_nodes/TEX_mixRgb.c => texture/nodes/node_texture_mixRgb.c} (79%) rename source/blender/nodes/{intern/TEX_nodes/TEX_output.c => texture/nodes/node_texture_output.c} (89%) rename source/blender/nodes/{intern/TEX_nodes/TEX_proc.c => texture/nodes/node_texture_proc.c} (72%) rename source/blender/nodes/{intern/TEX_nodes/TEX_rotate.c => texture/nodes/node_texture_rotate.c} (84%) rename source/blender/nodes/{intern/TEX_nodes/TEX_scale.c => texture/nodes/node_texture_scale.c} (85%) rename source/blender/nodes/{intern/TEX_nodes/TEX_texture.c => texture/nodes/node_texture_texture.c} (84%) rename source/blender/nodes/{intern/TEX_nodes/TEX_translate.c => texture/nodes/node_texture_translate.c} (82%) rename source/blender/nodes/{intern/TEX_nodes/TEX_valToNor.c => texture/nodes/node_texture_valToNor.c} (81%) rename source/blender/nodes/{intern/TEX_nodes/TEX_valToRgb.c => texture/nodes/node_texture_valToRgb.c} (77%) rename source/blender/nodes/{intern/TEX_nodes/TEX_viewer.c => texture/nodes/node_texture_viewer.c} (83%) diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h index 0f19cfbc481..742240d53b5 100644 --- a/source/blender/blenkernel/BKE_blender.h +++ b/source/blender/blenkernel/BKE_blender.h @@ -44,7 +44,7 @@ extern "C" { * and keep comment above the defines. * Use STRINGIFY() rather than defining with quotes */ #define BLENDER_VERSION 259 -#define BLENDER_SUBVERSION 1 +#define BLENDER_SUBVERSION 2 #define BLENDER_MINVERSION 250 #define BLENDER_MINSUBVERSION 0 diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index e44b5d96852..7207fb7d0fb 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -37,6 +37,10 @@ * \ingroup bke */ +#include "DNA_listBase.h" + +#include "RNA_types.h" + /* not very important, but the stack solver likes to know a maximum */ #define MAX_SOCKET 64 @@ -46,63 +50,151 @@ struct bNodeLink; struct bNodeSocket; struct bNodeStack; struct bNodeTree; +struct bNodeTreeExec; struct GPUMaterial; struct GPUNode; struct GPUNodeStack; struct ID; struct ListBase; struct Main; +struct uiBlock; +struct uiLayout; struct MTex; struct PointerRNA; struct rctf; struct RenderData; struct Scene; struct Tex; -struct uiLayout; - +struct SpaceNode; +struct ARegion; +struct Object; /* ************** NODE TYPE DEFINITIONS ***** */ -typedef struct bNodeSocketType { +/** Compact definition of a node socket. + * Can be used to quickly define a list of static sockets for a node, + * which are added to each new node of that type. + * + * \deprecated New nodes should add default sockets in the initialization + * function instead. This struct is mostly kept for old nodes and should + * be removed some time. + */ +typedef struct bNodeSocketTemplate { int type, limit; - const char *name; - float val1, val2, val3, val4; /* default alloc value for inputs */ - float min, max; /* default range for inputs */ + char name[32]; + float val1, val2, val3, val4; /* default alloc value for inputs */ + float min, max; + PropertySubType subtype; /* after this line is used internal only */ - struct bNodeSocket *sock; /* used during verify_types */ + struct bNodeSocket *sock; /* used to hold verified socket */ +} bNodeSocketTemplate; + +typedef void (*NodeSocketButtonFunction)(const struct bContext *C, struct uiBlock *block, + struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *sock, + const char *name, int x, int y, int width); + +/** Defines a socket type. + * Defines the appearance and behavior of a socket in the UI. + */ +typedef struct bNodeSocketType { + int type; + char ui_name[32]; + char ui_description[128]; + int ui_icon; + char ui_color[4]; + + const char *value_structname; + int value_structsize; + + NodeSocketButtonFunction buttonfunc; } bNodeSocketType; +/** Template for creating a node. + * Stored required parameters to make a new node of a specific type. + */ +typedef struct bNodeTemplate { + int type; + + /* group tree */ + struct bNodeTree *ngroup; +} bNodeTemplate; + +/** Defines a node type. + * Initial attributes and constants for a node as well as callback functions + * implementing the node behavior. + */ typedef struct bNodeType { void *next,*prev; + short needs_free; /* set for allocated types that need to be freed */ + int type; - const char *name; /* can be allocated too */ + char name[32]; float width, minwidth, maxwidth; + float height, minheight, maxheight; short nclass, flag; - bNodeSocketType *inputs, *outputs; + /* templates for static sockets */ + bNodeSocketTemplate *inputs, *outputs; char storagename[64]; /* struct name for DNA */ - void (*execfunc)(void *data, struct bNode *, struct bNodeStack **, struct bNodeStack **); - - /* this line is set on startup of blender */ + /// Main draw function for the node. + void (*drawfunc)(const struct bContext *C, struct ARegion *ar, struct SpaceNode *snode, struct bNodeTree *ntree, struct bNode *node); + /// Updates the node geometry attributes according to internal state before actual drawing. + void (*drawupdatefunc)(const struct bContext *C, struct bNodeTree *ntree, struct bNode *node); + /// Draw the option buttons on the node. void (*uifunc)(struct uiLayout *, struct bContext *C, struct PointerRNA *ptr); + /// Additional parameters in the side panel. void (*uifuncbut)(struct uiLayout *, struct bContext *C, struct PointerRNA *ptr); + /// Optional custom label function for the node header. const char *(*labelfunc)(struct bNode *); - - void (*initfunc)(struct bNode *); - void (*freestoragefunc)(struct bNode *); - void (*copystoragefunc)(struct bNode *, struct bNode *); + /// Optional custom resize handle polling. + int (*resize_area_func)(struct bNode *node, int x, int y); - /* for use with dynamic typedefs */ - ID *id; - void *pynode; /* holds pointer to python script */ - void *pydict; /* holds pointer to python script dictionary (scope)*/ - + /// Called when the node is updated in the editor. + void (*updatefunc)(struct bNodeTree *ntree, struct bNode *node); + /// Check and update if internal ID data has changed. + void (*verifyfunc)(struct bNodeTree *ntree, struct bNode *node, struct ID *id); + + /// Initialize a new node instance of this type after creation. + void (*initfunc)(struct bNodeTree *ntree, struct bNode *node, struct bNodeTemplate *ntemp); + /// Free the custom storage data. + void (*freestoragefunc)(struct bNode *node); + /// Make a copy of the custom storage data. + void (*copystoragefunc)(struct bNode *node, struct bNode *target); + + /// Create a template from an existing node. + struct bNodeTemplate (*templatefunc)(struct bNode *); + /** If a node can be made from the template in the given node tree. + * \example Node groups can not be created inside their own node tree. + */ + int (*validfunc)(struct bNodeTree *ntree, struct bNodeTemplate *ntemp); + + /// Initialize a node tree associated to this node type. + void (*inittreefunc)(struct bNodeTree *ntree); + /// Update a node tree associated to this node type. + void (*updatetreefunc)(struct bNodeTree *ntree); + + /* group edit callbacks for operators */ + /* XXX this is going to be changed as required by the UI */ + struct bNodeTree *(*group_edit_get)(struct bNode *node); + struct bNodeTree *(*group_edit_set)(struct bNode *node, int edit); + void (*group_edit_clear)(struct bNode *node); + + + /* **** execution callbacks **** */ + void *(*initexecfunc)(struct bNode *node); + void (*freeexecfunc)(struct bNode *node, void *nodedata); + void (*execfunc)(void *data, struct bNode *, struct bNodeStack **, struct bNodeStack **); + /* XXX this alternative exec function has been added to avoid changing all node types. + * when a final generic version of execution code is defined, this will be changed anyway + */ + void (*newexecfunc)(void *data, int thread, struct bNode *, void *nodedata, struct bNodeStack **, struct bNodeStack **); /* gpu */ int (*gpufunc)(struct GPUMaterial *mat, struct bNode *node, struct GPUNodeStack *in, struct GPUNodeStack *out); - + /* extended gpu function */ + int (*gpuextfunc)(struct GPUMaterial *mat, struct bNode *node, void *nodedata, struct GPUNodeStack *in, struct GPUNodeStack *out); } bNodeType; /* node->exec, now in use for composites (#define for break is same as ready yes) */ @@ -113,72 +205,124 @@ typedef struct bNodeType { #define NODE_FREEBUFS 8 #define NODE_SKIPPED 16 +/* sim_exec return value */ +#define NODE_EXEC_FINISHED 0 +#define NODE_EXEC_SUSPEND 1 + /* nodetype->nclass, for add-menu and themes */ -#define NODE_CLASS_INPUT 0 -#define NODE_CLASS_OUTPUT 1 -#define NODE_CLASS_OP_COLOR 3 -#define NODE_CLASS_OP_VECTOR 4 -#define NODE_CLASS_OP_FILTER 5 -#define NODE_CLASS_GROUP 6 -#define NODE_CLASS_FILE 7 -#define NODE_CLASS_CONVERTOR 8 -#define NODE_CLASS_MATTE 9 -#define NODE_CLASS_DISTORT 10 -#define NODE_CLASS_OP_DYNAMIC 11 -#define NODE_CLASS_PATTERN 12 -#define NODE_CLASS_TEXTURE 13 +#define NODE_CLASS_INPUT 0 +#define NODE_CLASS_OUTPUT 1 +#define NODE_CLASS_OP_COLOR 3 +#define NODE_CLASS_OP_VECTOR 4 +#define NODE_CLASS_OP_FILTER 5 +#define NODE_CLASS_GROUP 6 +#define NODE_CLASS_FILE 7 +#define NODE_CLASS_CONVERTOR 8 +#define NODE_CLASS_MATTE 9 +#define NODE_CLASS_DISTORT 10 +#define NODE_CLASS_OP_DYNAMIC 11 +#define NODE_CLASS_PATTERN 12 +#define NODE_CLASS_TEXTURE 13 +#define NODE_CLASS_EXECUTION 14 +#define NODE_CLASS_GETDATA 15 +#define NODE_CLASS_SETDATA 16 +#define NODE_CLASS_MATH 17 +#define NODE_CLASS_MATH_VECTOR 18 +#define NODE_CLASS_MATH_ROTATION 19 +#define NODE_CLASS_PARTICLES 25 +#define NODE_CLASS_TRANSFORM 30 +#define NODE_CLASS_COMBINE 31 +#define NODE_CLASS_LAYOUT 100 /* enum values for input/output */ #define SOCK_IN 1 #define SOCK_OUT 2 +struct bNodeTreeExec; + +typedef void (*bNodeTreeCallback)(void *calldata, struct ID *owner_id, struct bNodeTree *ntree); +typedef struct bNodeTreeType +{ + int type; /* type identifier */ + char idname[64]; /* id name for RNA identification */ + + ListBase node_types; /* type definitions */ + + /* callbacks */ + void (*free_cache)(struct bNodeTree *ntree); + void (*free_node_cache)(struct bNodeTree *ntree, struct bNode *node); + void (*foreach_nodetree)(struct Main *main, void *calldata, bNodeTreeCallback func); /* iteration over all node trees */ + + /* calls allowing threaded composite */ + void (*localize)(struct bNodeTree *localtree, struct bNodeTree *ntree); + void (*local_sync)(struct bNodeTree *localtree, struct bNodeTree *ntree); + void (*local_merge)(struct bNodeTree *localtree, struct bNodeTree *ntree); + + /* Tree update. Overrides nodetype->updatetreefunc! */ + void (*update)(struct bNodeTree *ntree); + /* Node update. Overrides nodetype->updatefunc! */ + void (*update_node)(struct bNodeTree *ntree, struct bNode *node); + + int (*validate_link)(struct bNodeTree *ntree, struct bNodeLink *link); +} bNodeTreeType; + /* ************** GENERIC API, TREES *************** */ -void ntreeVerifyTypes(struct bNodeTree *ntree); +struct bNodeTreeType *ntreeGetType(int type); +struct bNodeType *ntreeGetNodeType(struct bNodeTree *ntree); +struct bNodeSocketType *ntreeGetSocketType(int type); -struct bNodeTree *ntreeAddTree(const char *name, int type, const short is_group); +struct bNodeTree *ntreeAddTree(const char *name, int type, int nodetype); void ntreeInitTypes(struct bNodeTree *ntree); -//void ntreeMakeGroupSockets(struct bNodeTree *ntree); -void ntreeUpdateType(struct bNodeTree *ntree, struct bNodeType *ntype); void ntreeFreeTree(struct bNodeTree *ntree); struct bNodeTree *ntreeCopyTree(struct bNodeTree *ntree); void ntreeSwitchID(struct bNodeTree *ntree, struct ID *sce_from, struct ID *sce_to); void ntreeMakeLocal(struct bNodeTree *ntree); +int ntreeHasType(struct bNodeTree *ntree, int type); void ntreeSocketUseFlags(struct bNodeTree *ntree); -void ntreeSolveOrder(struct bNodeTree *ntree); +void ntreeUpdateTree(struct bNodeTree *ntree); +/* XXX Currently each tree update call does call to ntreeVerifyNodes too. + * Some day this should be replaced by a decent depsgraph automatism! + */ +void ntreeVerifyNodes(struct Main *main, struct ID *id); -void ntreeBeginExecTree(struct bNodeTree *ntree); -void ntreeExecTree(struct bNodeTree *ntree, void *callerdata, int thread); -void ntreeCompositExecTree(struct bNodeTree *ntree, struct RenderData *rd, int do_previews); -void ntreeEndExecTree(struct bNodeTree *ntree); +void ntreeGetDependencyList(struct bNodeTree *ntree, struct bNode ***deplist, int *totnodes); +/* XXX old trees handle output flags automatically based on special output node types and last active selection. + * new tree types have a per-output socket flag to indicate the final output to use explicitly. + */ +void ntreeSetOutput(struct bNodeTree *ntree); void ntreeInitPreview(struct bNodeTree *, int xsize, int ysize); void ntreeClearPreview(struct bNodeTree *ntree); void ntreeFreeCache(struct bNodeTree *ntree); - - /* calls allowing threaded composite */ + +int ntreeNodeExists(struct bNodeTree *ntree, struct bNode *testnode); +int ntreeOutputExists(struct bNode *node, struct bNodeSocket *testsock); struct bNodeTree *ntreeLocalize(struct bNodeTree *ntree); void ntreeLocalSync(struct bNodeTree *localtree, struct bNodeTree *ntree); void ntreeLocalMerge(struct bNodeTree *localtree, struct bNodeTree *ntree); /* ************** GENERIC API, NODES *************** */ -void nodeVerifyType(struct bNodeTree *ntree, struct bNode *node); +struct bNodeSocket *nodeAddSocket(struct bNodeTree *ntree, struct bNode *node, int in_out, const char *name, int type); +struct bNodeSocket *nodeInsertSocket(struct bNodeTree *ntree, struct bNode *node, int in_out, struct bNodeSocket *next_sock, const char *name, int type); +void nodeRemoveSocket(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *sock); +void nodeRemoveAllSockets(struct bNodeTree *ntree, struct bNode *node); void nodeAddToPreview(struct bNode *, float *, int, int, int); +struct bNode *nodeAddNode(struct bNodeTree *ntree, struct bNodeTemplate *ntemp); void nodeUnlinkNode(struct bNodeTree *ntree, struct bNode *node); void nodeUniqueName(struct bNodeTree *ntree, struct bNode *node); -void nodeAddSockets(struct bNode *node, struct bNodeType *ntype); -struct bNode *nodeAddNodeType(struct bNodeTree *ntree, int type, struct bNodeTree *ngroup, struct ID *id); -void nodeRegisterType(struct ListBase *typelist, const struct bNodeType *ntype) ; -void nodeUpdateType(struct bNodeTree *ntree, struct bNode* node, struct bNodeType *ntype); + +void nodeRegisterType(struct ListBase *typelist, struct bNodeType *ntype) ; void nodeMakeDynamicType(struct bNode *node); int nodeDynamicUnlinkText(struct ID *txtid); + void nodeFreeNode(struct bNodeTree *ntree, struct bNode *node); struct bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node); @@ -186,6 +330,10 @@ struct bNodeLink *nodeAddLink(struct bNodeTree *ntree, struct bNode *fromnode, s void nodeRemLink(struct bNodeTree *ntree, struct bNodeLink *link); void nodeRemSocketLinks(struct bNodeTree *ntree, struct bNodeSocket *sock); +void nodeSpaceCoords(struct bNode *node, float *locx, float *locy); +void nodeAttachNode(struct bNode *node, struct bNode *parent); +void nodeDetachNode(struct bNode *node); + struct bNode *nodeFindNodebyName(struct bNodeTree *ntree, const char *name); int nodeFindNode(struct bNodeTree *ntree, struct bNodeSocket *sock, struct bNode **nodep, int *sockindex, int *in_out); @@ -202,41 +350,71 @@ void NodeTagChanged(struct bNodeTree *ntree, struct bNode *node); int NodeTagIDChanged(struct bNodeTree *ntree, struct ID *id); void ntreeClearTags(struct bNodeTree *ntree); -/* ************** Groups ****************** */ +void nodeFreePreview(struct bNode *node); -struct bNode *nodeMakeGroupFromSelected(struct bNodeTree *ntree); -int nodeGroupUnGroup(struct bNodeTree *ntree, struct bNode *gnode); +/* ************** NODE TYPE ACCESS *************** */ -void nodeGroupVerify(struct bNodeTree *ngroup); -void nodeGroupSocketUseFlags(struct bNodeTree *ngroup); - -void nodeGroupCopy(struct bNode *gnode); - -struct bNodeSocket *nodeGroupAddSocket(struct bNodeTree *ngroup, const char *name, int type, int in_out); -struct bNodeSocket *nodeGroupExposeSocket(struct bNodeTree *ngroup, struct bNodeSocket *sock, int in_out); -void nodeGroupExposeAllSockets(struct bNodeTree *ngroup); -void nodeGroupRemoveSocket(struct bNodeTree *ngroup, struct bNodeSocket *gsock, int in_out); - -/* ************** COMMON NODES *************** */ +struct bNodeTemplate nodeMakeTemplate(struct bNode *node); +int nodeValid(struct bNodeTree *ntree, struct bNodeTemplate *ntemp); +const char* nodeLabel(struct bNode *node); +struct bNodeTree *nodeGroupEditGet(struct bNode *node); +struct bNodeTree *nodeGroupEditSet(struct bNode *node, int edit); +void nodeGroupEditClear(struct bNode *node); /* Init a new node type struct with default values and callbacks */ -void node_type_base(struct bNodeType *ntype, int type, const char *name, short nclass, short flag, - struct bNodeSocketType *inputs, struct bNodeSocketType *outputs); +void node_type_base(struct bNodeType *ntype, int type, const char *name, short nclass, short flag); +void node_type_socket_templates(struct bNodeType *ntype, struct bNodeSocketTemplate *inputs, struct bNodeSocketTemplate *outputs); void node_type_size(struct bNodeType *ntype, int width, int minwidth, int maxwidth); -void node_type_init(struct bNodeType *ntype, void (*initfunc)(struct bNode *)); +void node_type_init(struct bNodeType *ntype, void (*initfunc)(struct bNodeTree *ntree, struct bNode *node, struct bNodeTemplate *ntemp)); +void node_type_valid(struct bNodeType *ntype, int (*validfunc)(struct bNodeTree *ntree, struct bNodeTemplate *ntemp)); void node_type_storage(struct bNodeType *ntype, const char *storagename, void (*freestoragefunc)(struct bNode *), void (*copystoragefunc)(struct bNode *, struct bNode *)); -void node_type_exec(struct bNodeType *ntype, void (*execfunc)(void *data, struct bNode *, struct bNodeStack **, struct bNodeStack **)); -void node_type_gpu(struct bNodeType *ntype, int (*gpufunc)(struct GPUMaterial *mat, struct bNode *node, struct GPUNodeStack *in, struct GPUNodeStack *out)); void node_type_label(struct bNodeType *ntype, const char *(*labelfunc)(struct bNode *)); +void node_type_template(struct bNodeType *ntype, struct bNodeTemplate (*templatefunc)(struct bNode *)); +void node_type_update(struct bNodeType *ntype, + void (*updatefunc)(struct bNodeTree *ntree, struct bNode *node), + void (*verifyfunc)(struct bNodeTree *ntree, struct bNode *node, struct ID *id)); +void node_type_tree(struct bNodeType *ntype, + void (*inittreefunc)(struct bNodeTree *), + void (*updatetreefunc)(struct bNodeTree *)); +void node_type_group_edit(struct bNodeType *ntype, + struct bNodeTree *(*group_edit_get)(struct bNode *node), + struct bNodeTree *(*group_edit_set)(struct bNode *node, int edit), + void (*group_edit_clear)(struct bNode *node)); + +void node_type_exec(struct bNodeType *ntype, void (*execfunc)(void *data, struct bNode *, struct bNodeStack **, struct bNodeStack **)); +void node_type_exec_new(struct bNodeType *ntype, + void *(*initexecfunc)(struct bNode *node), + void (*freeexecfunc)(struct bNode *node, void *nodedata), + void (*newexecfunc)(void *data, int thread, struct bNode *, void *nodedata, struct bNodeStack **, struct bNodeStack **)); +void node_type_gpu(struct bNodeType *ntype, int (*gpufunc)(struct GPUMaterial *mat, struct bNode *node, struct GPUNodeStack *in, struct GPUNodeStack *out)); +void node_type_gpu_ext(struct bNodeType *ntype, int (*gpuextfunc)(struct GPUMaterial *mat, struct bNode *node, void *nodedata, struct GPUNodeStack *in, struct GPUNodeStack *out)); + +/* ************** COMMON NODES *************** */ #define NODE_GROUP 2 -#define NODE_GROUP_MENU 1000 -#define NODE_DYNAMIC_MENU 4000 +#define NODE_FORLOOP 3 +#define NODE_WHILELOOP 4 +#define NODE_FRAME 5 +#define NODE_GROUP_MENU 10000 +#define NODE_DYNAMIC_MENU 20000 -void register_node_type_group(ListBase *lb); +/* look up a socket on a group node by the internal group socket */ +struct bNodeSocket *node_group_find_input(struct bNode *gnode, struct bNodeSocket *gsock); +struct bNodeSocket *node_group_find_output(struct bNode *gnode, struct bNodeSocket *gsock); + +struct bNodeSocket *node_group_add_socket(struct bNodeTree *ngroup, const char *name, int type, int in_out); +struct bNodeSocket *node_group_expose_socket(struct bNodeTree *ngroup, struct bNodeSocket *sock, int in_out); +void node_group_expose_all_sockets(struct bNodeTree *ngroup); +void node_group_remove_socket(struct bNodeTree *ngroup, struct bNodeSocket *gsock, int in_out); + +struct bNode *node_group_make_from_selected(struct bNodeTree *ntree); +int node_group_ungroup(struct bNodeTree *ntree, struct bNode *gnode); + +/* in node_common.c */ +void register_node_type_frame(ListBase *lb); /* ************** SHADER NODES *************** */ @@ -286,11 +464,10 @@ struct ShadeResult; #define NODE_DYNAMIC_REPARSE 6 /* 64 */ #define NODE_DYNAMIC_SET 15 /* sign */ -/* the type definitions array */ -extern struct ListBase node_all_shaders; - /* API */ +struct bNodeTreeExec *ntreeShaderBeginExecTree(struct bNodeTree *ntree); +void ntreeShaderEndExecTree(struct bNodeTreeExec *exec); void ntreeShaderExecTree(struct bNodeTree *ntree, struct ShadeInput *shi, struct ShadeResult *shr); void ntreeShaderGetTexcoMode(struct bNodeTree *ntree, int osa, short *texco, int *mode); void nodeShaderSynchronizeID(struct bNode *node, int copyto); @@ -415,11 +592,11 @@ void ntreeGPUMaterialNodes(struct bNodeTree *ntree, struct GPUMaterial *mat); #define CMP_SCALE_RENDERPERCENT 3 -/* the type definitions array */ -extern struct ListBase node_all_composit; - /* API */ struct CompBuf; +struct bNodeTreeExec *ntreeCompositBeginExecTree(struct bNodeTree *ntree); +void ntreeCompositEndExecTree(struct bNodeTreeExec *exec); +void ntreeCompositExecTree(struct bNodeTree *ntree, struct RenderData *rd, int do_previews); void ntreeCompositTagRender(struct Scene *sce); int ntreeCompositTagAnimated(struct bNodeTree *ntree); void ntreeCompositTagGenerators(struct bNodeTree *ntree); @@ -459,23 +636,22 @@ struct TexResult; #define TEX_NODE_PROC 500 #define TEX_NODE_PROC_MAX 600 -extern struct ListBase node_all_textures; - /* API */ int ntreeTexTagAnimated(struct bNodeTree *ntree); void ntreeTexSetPreviewFlag(int); -int ntreeTexExecTree(struct bNodeTree *ntree, struct TexResult *target, float *coord, float *dxt, float *dyt, int osatex, short thread, struct Tex *tex, short which_output, int cfra, int preview, struct ShadeInput *shi, struct MTex *mtex); void ntreeTexCheckCyclics(struct bNodeTree *ntree); char* ntreeTexOutputMenu(struct bNodeTree *ntree); +struct bNodeTreeExec *ntreeTexBeginExecTree(struct bNodeTree *ntree); +void ntreeTexEndExecTree(struct bNodeTreeExec *exec); +int ntreeTexExecTree(struct bNodeTree *ntree, struct TexResult *target, float *coord, float *dxt, float *dyt, int osatex, short thread, struct Tex *tex, short which_output, int cfra, int preview, struct ShadeInput *shi, struct MTex *mtex); -/**/ + +/*************************************************/ void init_nodesystem(void); void free_nodesystem(void); -/**/ - void clear_scene_in_nodes(struct Main *bmain, struct Scene *sce); #endif diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index 29615986191..36631d5af90 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -925,7 +925,8 @@ void init_render_material(Material *mat, int r_mode, float *amb) if(mat->nodetree && mat->use_nodes) { init_render_nodetree(mat->nodetree, mat, r_mode, amb); - ntreeBeginExecTree(mat->nodetree); /* has internal flag to detect it only does it once */ + if (!mat->nodetree->execdata) + mat->nodetree->execdata = ntreeShaderBeginExecTree(mat->nodetree); } } @@ -957,8 +958,10 @@ void init_render_materials(Main *bmain, int r_mode, float *amb) /* only needed for nodes now */ void end_render_material(Material *mat) { - if(mat && mat->nodetree && mat->use_nodes) - ntreeEndExecTree(mat->nodetree); /* has internal flag to detect it only does it once */ + if(mat && mat->nodetree && mat->use_nodes) { + if (mat->nodetree->execdata) + ntreeShaderEndExecTree(mat->nodetree->execdata); + } } void end_render_materials(Main *bmain) diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index 5f1a6c911bc..6f34383101d 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -46,84 +46,107 @@ #include #include "DNA_anim_types.h" -#include "DNA_action_types.h" #include "DNA_node_types.h" +#include "DNA_scene_types.h" +#include "DNA_action_types.h" + +#include "BLI_string.h" +#include "BLI_math.h" +#include "BLI_listbase.h" +#include "BLI_path_util.h" +#include "BLI_utildefines.h" + +#include "BKE_animsys.h" +#include "BKE_action.h" +#include "BKE_fcurve.h" +#include "BKE_global.h" +#include "BKE_image.h" +#include "BKE_library.h" +#include "BKE_main.h" +#include "BKE_node.h" +#include "BKE_utildefines.h" +#include "BKE_utildefines.h" #include "BLI_listbase.h" #include "RNA_access.h" -#include "BKE_animsys.h" -#include "BKE_action.h" -#include "BKE_fcurve.h" -#include "BKE_node.h" -#include "BKE_utildefines.h" +#include "NOD_socket.h" +#include "NOD_composite.h" +#include "NOD_shader.h" +#include "NOD_texture.h" -#include "PIL_time.h" -#include "CMP_node.h" -#include "intern/CMP_util.h" /* stupid include path... */ - -#include "SHD_node.h" -#include "TEX_node.h" -#include "intern/TEX_util.h" - -#include "GPU_material.h" - -static ListBase empty_list = {NULL, NULL}; -ListBase node_all_composit = {NULL, NULL}; -ListBase node_all_shaders = {NULL, NULL}; -ListBase node_all_textures = {NULL, NULL}; - -/* ************** Type stuff ********** */ - -static bNodeType *node_get_type(bNodeTree *ntree, int type, ID *id) +bNodeTreeType *ntreeGetType(int type) { - bNodeType *ntype = ntree->alltypes.first; + static bNodeTreeType *types[NUM_NTREE_TYPES]; + static int types_init = 1; + if (types_init) { + types[NTREE_SHADER] = &ntreeType_Shader; + types[NTREE_COMPOSIT] = &ntreeType_Composite; + types[NTREE_TEXTURE] = &ntreeType_Texture; + types_init = 0; + } + + if(type >= 0 && type < NUM_NTREE_TYPES) { + return types[type]; + } + else { + return NULL; + } +} + +static bNodeType *node_get_type(bNodeTree *ntree, int type) +{ + bNodeType *ntype = ntreeGetType(ntree->type)->node_types.first; for(; ntype; ntype= ntype->next) - if(ntype->type==type && id==ntype->id ) + if(ntype->type==type) return ntype; return NULL; } +bNodeType *ntreeGetNodeType(bNodeTree *ntree) +{ + return node_get_type(ntree, ntree->nodetype); +} + +bNodeSocketType *ntreeGetSocketType(int type) +{ + static bNodeSocketType *types[NUM_SOCKET_TYPES]= {NULL}; + static int types_init = 1; + + if (types_init) { + node_socket_type_init(types); + types_init= 0; + } + + if(type < NUM_SOCKET_TYPES) { + return types[type]; + } + else { + return NULL; + } +} + void ntreeInitTypes(bNodeTree *ntree) { bNode *node, *next; - if(ntree->type==NTREE_SHADER) - ntree->alltypes= node_all_shaders; - else if(ntree->type==NTREE_COMPOSIT) - ntree->alltypes= node_all_composit; - else if(ntree->type==NTREE_TEXTURE) - ntree->alltypes= node_all_textures; - else { - ntree->alltypes= empty_list; - printf("Error: no type definitions for nodes\n"); - } - for(node= ntree->nodes.first; node; node= next) { next= node->next; + + node->typeinfo= node_get_type(ntree, node->type); + if(node->type==NODE_DYNAMIC) { - bNodeType *stype= NULL; - if(node->id==NULL) { /* empty script node */ - stype= node_get_type(ntree, node->type, NULL); - } else { /* not an empty script node */ - stype= node_get_type(ntree, node->type, node->id); - if(!stype) { - stype= node_get_type(ntree, node->type, NULL); - /* needed info if the pynode script fails now: */ - if (node->id) node->storage= ntree; - } else { - node->custom1= 0; - node->custom1= BSET(node->custom1,NODE_DYNAMIC_ADDEXIST); - } + /* needed info if the pynode script fails now: */ + node->storage= ntree; + if(node->id!=NULL) { /* not an empty script node */ + node->custom1= 0; + node->custom1= BSET(node->custom1,NODE_DYNAMIC_ADDEXIST); } - node->typeinfo= stype; - if(node->typeinfo) - node->typeinfo->initfunc(node); - } else { - node->typeinfo= node_get_type(ntree, node->type, NULL); +// if(node->typeinfo) +// node->typeinfo->initfunc(node); } if(node->typeinfo==NULL) { @@ -135,66 +158,51 @@ void ntreeInitTypes(bNodeTree *ntree) ntree->init |= NTREE_TYPE_INIT; } -/* updates node with (modified) bNodeType.. this should be done for all trees */ -void ntreeUpdateType(bNodeTree *ntree, bNodeType *ntype) +static bNodeSocket *make_socket(bNodeTree *ntree, int in_out, const char *name, int type) { - bNode *node; - - for(node= ntree->nodes.first; node; node= node->next) { - if(node->typeinfo== ntype) { - nodeUpdateType(ntree, node, ntype); - } - } -} - -/* only used internal... we depend on type definitions! */ -static bNodeSocket *node_add_socket_type(ListBase *lb, bNodeSocketType *stype) -{ - bNodeSocket *sock= MEM_callocN(sizeof(bNodeSocket), "sock"); + bNodeSocketType *stype= ntreeGetSocketType(type); + bNodeSocket *sock; - BLI_strncpy(sock->name, stype->name, NODE_MAXSTR); - if(stype->limit==0) sock->limit= 0xFFF; - else sock->limit= stype->limit; - sock->type= stype->type; + sock= MEM_callocN(sizeof(bNodeSocket), "sock"); - sock->ns.vec[0]= stype->val1; - sock->ns.vec[1]= stype->val2; - sock->ns.vec[2]= stype->val3; - sock->ns.vec[3]= stype->val4; - sock->ns.min= stype->min; - sock->ns.max= stype->max; + BLI_strncpy(sock->name, name, NODE_MAXSTR); + sock->limit = (in_out==SOCK_IN ? 1 : 0xFFF); + sock->type= type; + sock->storage = NULL; + + if (stype->value_structsize > 0) + sock->default_value = MEM_callocN(stype->value_structsize, "default socket value"); - if(lb) - BLI_addtail(lb, sock); - return sock; } -static bNodeSocket *node_add_group_socket(ListBase *lb, bNodeSocket *gsock) +bNodeSocket *nodeAddSocket(bNodeTree *ntree, bNode *node, int in_out, const char *name, int type) { - bNodeSocket *sock= MEM_callocN(sizeof(bNodeSocket), "sock"); + bNodeSocket *sock = make_socket(ntree, in_out, name, type); + if (in_out==SOCK_IN) + BLI_addtail(&node->inputs, sock); + else if (in_out==SOCK_OUT) + BLI_addtail(&node->outputs, sock); - /* make a copy of the group socket */ - *sock = *gsock; - sock->link = NULL; - sock->next = sock->prev = NULL; - sock->new_sock = NULL; - sock->ns.data = NULL; + ntree->update |= NTREE_UPDATE_NODES; - sock->own_index = gsock->own_index; - sock->groupsock = gsock; - /* XXX hack: group socket input/output roles are inverted internally, - * need to change the limit value when making actual node sockets from them. - */ - sock->limit = (gsock->limit==1 ? 0xFFF : 1); - - if(lb) - BLI_addtail(lb, sock); - return sock; } -static void node_rem_socket(bNodeTree *ntree, ListBase *lb, bNodeSocket *sock) +bNodeSocket *nodeInsertSocket(bNodeTree *ntree, bNode *node, int in_out, bNodeSocket *next_sock, const char *name, int type) +{ + bNodeSocket *sock = make_socket(ntree, in_out, name, type); + if (in_out==SOCK_IN) + BLI_insertlinkbefore(&node->inputs, next_sock, sock); + else if (in_out==SOCK_OUT) + BLI_insertlinkbefore(&node->outputs, next_sock, sock); + + ntree->update |= NTREE_UPDATE_NODES; + + return sock; +} + +void nodeRemoveSocket(bNodeTree *ntree, bNode *node, bNodeSocket *sock) { bNodeLink *link, *next; @@ -205,428 +213,42 @@ static void node_rem_socket(bNodeTree *ntree, ListBase *lb, bNodeSocket *sock) } } - BLI_remlink(lb, sock); + /* this is fast, this way we don't need an in_out argument */ + BLI_remlink(&node->inputs, sock); + BLI_remlink(&node->outputs, sock); + + if (sock->default_value) + MEM_freeN(sock->default_value); MEM_freeN(sock); + + ntree->update |= NTREE_UPDATE_NODES; } -static bNodeSocket *verify_socket(ListBase *lb, bNodeSocketType *stype) +void nodeRemoveAllSockets(bNodeTree *ntree, bNode *node) { bNodeSocket *sock; + bNodeLink *link, *next; - for(sock= lb->first; sock; sock= sock->next) { - if(strncmp(sock->name, stype->name, NODE_MAXSTR)==0) - break; - } - if(sock) { - sock->type= stype->type; /* in future, read this from tydefs! */ - if(stype->limit==0) sock->limit= 0xFFF; - else sock->limit= stype->limit; - - sock->ns.min= stype->min; - sock->ns.max= stype->max; - - BLI_remlink(lb, sock); - - return sock; - } - else { - return node_add_socket_type(NULL, stype); + for(link= ntree->links.first; link; link= next) { + next= link->next; + if(link->fromnode==node || link->tonode==node) { + nodeRemLink(ntree, link); + } } + + for (sock=node->inputs.first; sock; sock=sock->next) + if (sock->default_value) + MEM_freeN(sock->default_value); + BLI_freelistN(&node->inputs); + for (sock=node->outputs.first; sock; sock=sock->next) + if (sock->default_value) + MEM_freeN(sock->default_value); + + BLI_freelistN(&node->outputs); + + ntree->update |= NTREE_UPDATE_NODES; } -static bNodeSocket *verify_group_socket(ListBase *lb, bNodeSocket *gsock) -{ - bNodeSocket *sock; - - for(sock= lb->first; sock; sock= sock->next) { - if(sock->own_index==gsock->own_index) - break; - } - if(sock) { - sock->groupsock = gsock; - - strcpy(sock->name, gsock->name); - sock->type= gsock->type; - - /* XXX hack: group socket input/output roles are inverted internally, - * need to change the limit value when making actual node sockets from them. - */ - sock->limit = (gsock->limit==1 ? 0xFFF : 1); - - sock->ns.min= gsock->ns.min; - sock->ns.max= gsock->ns.max; - - BLI_remlink(lb, sock); - - return sock; - } - else { - return node_add_group_socket(NULL, gsock); - } -} - -static void verify_socket_list(bNodeTree *ntree, ListBase *lb, bNodeSocketType *stype_first) -{ - bNodeSocketType *stype; - - /* no inputs anymore? */ - if(stype_first==NULL) { - while(lb->first) - node_rem_socket(ntree, lb, lb->first); - } - else { - /* step by step compare */ - stype= stype_first; - while(stype->type != -1) { - stype->sock= verify_socket(lb, stype); - stype++; - } - /* leftovers are removed */ - while(lb->first) - node_rem_socket(ntree, lb, lb->first); - /* and we put back the verified sockets */ - stype= stype_first; - while(stype->type != -1) { - BLI_addtail(lb, stype->sock); - stype++; - } - } -} - -static void verify_group_socket_list(bNodeTree *ntree, ListBase *lb, ListBase *glb) -{ - bNodeSocket *gsock; - - /* step by step compare */ - for (gsock= glb->first; gsock; gsock=gsock->next) { - /* abusing new_sock pointer for verification here! only used inside this function */ - gsock->new_sock= verify_group_socket(lb, gsock); - } - /* leftovers are removed */ - while(lb->first) - node_rem_socket(ntree, lb, lb->first); - /* and we put back the verified sockets */ - for (gsock= glb->first; gsock; gsock=gsock->next) { - BLI_addtail(lb, gsock->new_sock); - gsock->new_sock = NULL; - } -} - -void nodeVerifyType(bNodeTree *ntree, bNode *node) -{ - /* node groups don't have static sock lists, but use external sockets from the tree instead */ - if (node->type==NODE_GROUP) { - bNodeTree *ngroup= (bNodeTree*)node->id; - if (ngroup) { - verify_group_socket_list(ntree, &node->inputs, &ngroup->inputs); - verify_group_socket_list(ntree, &node->outputs, &ngroup->outputs); - } - } - else { - bNodeType *ntype= node->typeinfo; - if(ntype) { - verify_socket_list(ntree, &node->inputs, ntype->inputs); - verify_socket_list(ntree, &node->outputs, ntype->outputs); - } - } -} - -void ntreeVerifyTypes(bNodeTree *ntree) -{ - bNode *node; - - /* if((ntree->init & NTREE_TYPE_INIT)==0) */ - ntreeInitTypes(ntree); - - /* check inputs and outputs, and remove or insert them */ - for(node= ntree->nodes.first; node; node= node->next) - nodeVerifyType(ntree, node); - -} - -/* ************** Group stuff ********** */ - -/* XXX group typeinfo struct is used directly in ntreeMakeOwnType, needs cleanup */ -static bNodeType ntype_group; - -/* groups display their internal tree name as label */ -static const char *group_label(bNode *node) -{ - return (node->id)? node->id->name+2: "Missing Datablock"; -} - -void register_node_type_group(ListBase *lb) -{ - node_type_base(&ntype_group, NODE_GROUP, "Group", NODE_CLASS_GROUP, NODE_OPTIONS, NULL, NULL); - node_type_size(&ntype_group, 120, 60, 200); - node_type_label(&ntype_group, group_label); - - nodeRegisterType(lb, &ntype_group); -} - -static bNodeSocket *find_group_node_input(bNode *gnode, bNodeSocket *gsock) -{ - bNodeSocket *sock; - for (sock=gnode->inputs.first; sock; sock=sock->next) - if (sock->groupsock == gsock) - return sock; - return NULL; -} - -static bNodeSocket *find_group_node_output(bNode *gnode, bNodeSocket *gsock) -{ - bNodeSocket *sock; - for (sock=gnode->outputs.first; sock; sock=sock->next) - if (sock->groupsock == gsock) - return sock; - return NULL; -} - -bNode *nodeMakeGroupFromSelected(bNodeTree *ntree) -{ - bNodeLink *link, *linkn; - bNode *node, *gnode, *nextn; - bNodeTree *ngroup; - bNodeSocket *gsock; - ListBase anim_basepaths = {NULL, NULL}; - float min[2], max[2]; - int totnode=0; - - INIT_MINMAX2(min, max); - - /* is there something to group? also do some clearing */ - for(node= ntree->nodes.first; node; node= node->next) { - if(node->flag & NODE_SELECT) { - /* no groups in groups */ - if(node->type==NODE_GROUP) - return NULL; - DO_MINMAX2( (&node->locx), min, max); - totnode++; - } - node->done= 0; - } - if(totnode==0) return NULL; - - /* check if all connections are OK, no unselected node has both - inputs and outputs to a selection */ - for(link= ntree->links.first; link; link= link->next) { - if(link->fromnode && link->tonode && link->fromnode->flag & NODE_SELECT) - link->tonode->done |= 1; - if(link->fromnode && link->tonode && link->tonode->flag & NODE_SELECT) - link->fromnode->done |= 2; - } - - for(node= ntree->nodes.first; node; node= node->next) { - if((node->flag & NODE_SELECT)==0) - if(node->done==3) - break; - } - if(node) - return NULL; - - /* OK! new nodetree */ - ngroup= ntreeAddTree("NodeGroup", ntree->type, TRUE); - - /* move nodes over */ - for(node= ntree->nodes.first; node; node= nextn) { - nextn= node->next; - if(node->flag & NODE_SELECT) { - /* keep track of this node's RNA "base" path (the part of the pat identifying the node) - * if the old nodetree has animation data which potentially covers this node - */ - if (ntree->adt) { - PointerRNA ptr; - char *path; - - RNA_pointer_create(&ntree->id, &RNA_Node, node, &ptr); - path = RNA_path_from_ID_to_struct(&ptr); - - if (path) - BLI_addtail(&anim_basepaths, BLI_genericNodeN(path)); - } - - /* change node-collection membership */ - BLI_remlink(&ntree->nodes, node); - BLI_addtail(&ngroup->nodes, node); - - node->locx-= 0.5f*(min[0]+max[0]); - node->locy-= 0.5f*(min[1]+max[1]); - } - } - - /* move animation data over */ - if (ntree->adt) { - LinkData *ld, *ldn=NULL; - - BKE_animdata_separate_by_basepath(&ntree->id, &ngroup->id, &anim_basepaths); - - /* paths + their wrappers need to be freed */ - for (ld = anim_basepaths.first; ld; ld = ldn) { - ldn = ld->next; - - MEM_freeN(ld->data); - BLI_freelinkN(&anim_basepaths, ld); - } - } - - /* make group node */ - gnode= nodeAddNodeType(ntree, NODE_GROUP, ngroup, NULL); - gnode->locx= 0.5f*(min[0]+max[0]); - gnode->locy= 0.5f*(min[1]+max[1]); - - /* relink external sockets */ - for(link= ntree->links.first; link; link= linkn) { - linkn= link->next; - - if(link->fromnode && link->tonode && (link->fromnode->flag & link->tonode->flag & NODE_SELECT)) { - BLI_remlink(&ntree->links, link); - BLI_addtail(&ngroup->links, link); - } - else if(link->tonode && (link->tonode->flag & NODE_SELECT)) { - gsock = nodeGroupExposeSocket(ngroup, link->tosock, SOCK_IN); - link->tosock->link = nodeAddLink(ngroup, NULL, gsock, link->tonode, link->tosock); - link->tosock = node_add_group_socket(&gnode->inputs, gsock); - link->tonode = gnode; - } - else if(link->fromnode && (link->fromnode->flag & NODE_SELECT)) { - /* search for existing group node socket */ - for (gsock=ngroup->outputs.first; gsock; gsock=gsock->next) - if (gsock->link && gsock->link->fromsock==link->fromsock) - break; - if (!gsock) { - gsock = nodeGroupExposeSocket(ngroup, link->fromsock, SOCK_OUT); - gsock->link = nodeAddLink(ngroup, link->fromnode, link->fromsock, NULL, gsock); - link->fromsock = node_add_group_socket(&gnode->outputs, gsock); - } - else - link->fromsock = find_group_node_output(gnode, gsock); - link->fromnode = gnode; - } - } - - /* update node levels */ - ntreeSolveOrder(ntree); - - return gnode; -} - -/* here's a nasty little one, need to check users... */ -/* should become callbackable... */ -void nodeGroupVerify(bNodeTree *ngroup) -{ - /* group changed, so we rebuild the type definition */ -// ntreeMakeGroupSockets(ngroup); - - if(ngroup->type==NTREE_SHADER) { - Material *ma; - for(ma= G.main->mat.first; ma; ma= ma->id.next) { - if(ma->nodetree) { - bNode *node; - for(node= ma->nodetree->nodes.first; node; node= node->next) - if(node->id == (ID *)ngroup) - nodeVerifyType(ma->nodetree, node); - } - } - } - else if(ngroup->type==NTREE_COMPOSIT) { - Scene *sce; - for(sce= G.main->scene.first; sce; sce= sce->id.next) { - if(sce->nodetree) { - bNode *node; - for(node= sce->nodetree->nodes.first; node; node= node->next) - if(node->id == (ID *)ngroup) - nodeVerifyType(sce->nodetree, node); - } - } - } - else if(ngroup->type==NTREE_TEXTURE) { - Tex *tx; - for(tx= G.main->tex.first; tx; tx= tx->id.next) { - if(tx->nodetree) { - bNode *node; - for(node= tx->nodetree->nodes.first; node; node= node->next) - if(node->id == (ID *)ngroup) - nodeVerifyType(tx->nodetree, node); - } - } - } -} - -/* also to check all users of groups. Now only used in editor for hide/unhide */ -/* should become callbackable? */ -void nodeGroupSocketUseFlags(bNodeTree *ngroup) -{ - bNode *node; - bNodeSocket *sock; - - /* clear flags */ - for(node= ngroup->nodes.first; node; node= node->next) { - for(sock= node->inputs.first; sock; sock= sock->next) - sock->flag &= ~SOCK_IN_USE; - for(sock= node->outputs.first; sock; sock= sock->next) - sock->flag &= ~SOCK_IN_USE; - } - - /* tag all thats in use */ - if(ngroup->type==NTREE_SHADER) { - Material *ma; - for(ma= G.main->mat.first; ma; ma= ma->id.next) { - if(ma->nodetree) { - for(node= ma->nodetree->nodes.first; node; node= node->next) { - if(node->id==&ngroup->id) { - for(sock= node->inputs.first; sock; sock= sock->next) - if(sock->link) - if(sock->groupsock) - sock->groupsock->flag |= SOCK_IN_USE; - for(sock= node->outputs.first; sock; sock= sock->next) - if(nodeCountSocketLinks(ma->nodetree, sock)) - if(sock->groupsock) - sock->groupsock->flag |= SOCK_IN_USE; - } - } - } - } - } - else if(ngroup->type==NTREE_COMPOSIT) { - Scene *sce; - for(sce= G.main->scene.first; sce; sce= sce->id.next) { - if(sce->nodetree) { - for(node= sce->nodetree->nodes.first; node; node= node->next) { - if(node->id==(ID *)ngroup) { - for(sock= node->inputs.first; sock; sock= sock->next) - if(sock->link) - if(sock->groupsock) - sock->groupsock->flag |= SOCK_IN_USE; - for(sock= node->outputs.first; sock; sock= sock->next) - if(nodeCountSocketLinks(sce->nodetree, sock)) - if(sock->groupsock) - sock->groupsock->flag |= SOCK_IN_USE; - } - } - } - } - } - else if(ngroup->type==NTREE_TEXTURE) { - Tex *tx; - for(tx= G.main->tex.first; tx; tx= tx->id.next) { - if(tx->nodetree) { - for(node= tx->nodetree->nodes.first; node; node= node->next) { - if(node->id==(ID *)ngroup) { - for(sock= node->inputs.first; sock; sock= sock->next) - if(sock->link) - if(sock->groupsock) - sock->groupsock->flag |= SOCK_IN_USE; - for(sock= node->outputs.first; sock; sock= sock->next) - if(nodeCountSocketLinks(tx->nodetree, sock)) - if(sock->groupsock) - sock->groupsock->flag |= SOCK_IN_USE; - } - } - } - } - } - -} /* finds a node based on its name */ bNode *nodeFindNodebyName(bNodeTree *ntree, const char *name) { @@ -669,272 +291,26 @@ int nodeFindNode(bNodeTree *ntree, bNodeSocket *sock, bNode **nodep, int *sockin return 0; } -/* returns 1 if its OK */ -int nodeGroupUnGroup(bNodeTree *ntree, bNode *gnode) -{ - bNodeLink *link, *linkn; - bNode *node, *nextn; - bNodeTree *ngroup, *wgroup; - ListBase anim_basepaths = {NULL, NULL}; - - ngroup= (bNodeTree *)gnode->id; - if(ngroup==NULL) return 0; - - /* clear new pointers, set in copytree */ - for(node= ntree->nodes.first; node; node= node->next) - node->new_node= NULL; - - /* wgroup is a temporary copy of the NodeTree we're merging in - * - all of wgroup's nodes are transferred across to their new home - * - ngroup (i.e. the source NodeTree) is left unscathed - */ - wgroup= ntreeCopyTree(ngroup); - - /* add the nodes into the ntree */ - for(node= wgroup->nodes.first; node; node= nextn) { - nextn= node->next; - - /* keep track of this node's RNA "base" path (the part of the pat identifying the node) - * if the old nodetree has animation data which potentially covers this node - */ - if (wgroup->adt) { - PointerRNA ptr; - char *path; - - RNA_pointer_create(&wgroup->id, &RNA_Node, node, &ptr); - path = RNA_path_from_ID_to_struct(&ptr); - - if (path) - BLI_addtail(&anim_basepaths, BLI_genericNodeN(path)); - } - - /* migrate node */ - BLI_remlink(&wgroup->nodes, node); - BLI_addtail(&ntree->nodes, node); - - node->locx+= gnode->locx; - node->locy+= gnode->locy; - - node->flag |= NODE_SELECT; - } - - /* restore external links to and from the gnode */ - for(link= ntree->links.first; link; link= link->next) { - if (link->fromnode==gnode) { - if (link->fromsock->groupsock) { - bNodeSocket *gsock= link->fromsock->groupsock; - if (gsock->link) { - if (gsock->link->fromnode) { - /* NB: using the new internal copies here! the groupsock pointer still maps to the old tree */ - link->fromnode = (gsock->link->fromnode ? gsock->link->fromnode->new_node : NULL); - link->fromsock = gsock->link->fromsock->new_sock; - } - else { - /* group output directly maps to group input */ - bNodeSocket *insock= find_group_node_input(gnode, gsock->link->fromsock); - if (insock->link) { - link->fromnode = insock->link->fromnode; - link->fromsock = insock->link->fromsock; - } - } - } - else { - /* constant group output: copy the stack value to the external socket. - * the link is kept here until all possible external users have been fixed. - */ - QUATCOPY(link->tosock->ns.vec, gsock->ns.vec); - } - } - } - } - /* remove internal output links, these are not used anymore */ - for(link=wgroup->links.first; link; link= linkn) { - linkn = link->next; - if (!link->tonode) - nodeRemLink(wgroup, link); - } - /* restore links from internal nodes */ - for(link= wgroup->links.first; link; link= link->next) { - /* indicates link to group input */ - if (!link->fromnode) { - /* NB: can't use find_group_node_input here, - * because gnode sockets still point to the old tree! - */ - bNodeSocket *insock; - for (insock= gnode->inputs.first; insock; insock= insock->next) - if (insock->groupsock->new_sock == link->fromsock) - break; - if (insock->link) { - link->fromnode = insock->link->fromnode; - link->fromsock = insock->link->fromsock; - } - else { - /* uses group constant input. copy the input value and remove the dead link. */ - QUATCOPY(link->tosock->ns.vec, insock->ns.vec); - nodeRemLink(wgroup, link); - } - } - } - - /* add internal links to the ntree */ - for(link= wgroup->links.first; link; link= linkn) { - linkn= link->next; - BLI_remlink(&wgroup->links, link); - BLI_addtail(&ntree->links, link); - } - - /* and copy across the animation */ - if (wgroup->adt) { - LinkData *ld, *ldn=NULL; - bAction *waction; - - /* firstly, wgroup needs to temporary dummy action that can be destroyed, as it shares copies */ - waction = wgroup->adt->action = copy_action(wgroup->adt->action); - - /* now perform the moving */ - BKE_animdata_separate_by_basepath(&wgroup->id, &ntree->id, &anim_basepaths); - - /* paths + their wrappers need to be freed */ - for (ld = anim_basepaths.first; ld; ld = ldn) { - ldn = ld->next; - - MEM_freeN(ld->data); - BLI_freelinkN(&anim_basepaths, ld); - } - - /* free temp action too */ - free_libblock(&G.main->action, waction); - } - - /* delete the group instance. this also removes old input links! */ - nodeFreeNode(ntree, gnode); - - /* free the group tree (takes care of user count) */ - free_libblock(&G.main->nodetree, wgroup); - - /* solve order goes fine, but the level tags not... doing it twice works for now. solve this once */ - /* XXX is this still necessary with new groups? it may have been caused by non-updated sock->link pointers. lukas */ - ntreeSolveOrder(ntree); - ntreeSolveOrder(ntree); - - return 1; -} - -void nodeGroupCopy(bNode *gnode) +/* ************** Add stuff ********** */ +static void node_add_sockets_from_type(bNodeTree *ntree, bNode *node, bNodeType *ntype) { + bNodeSocketTemplate *sockdef; bNodeSocket *sock; - gnode->id->us--; - gnode->id= (ID *)ntreeCopyTree((bNodeTree *)gnode->id); - - /* new_sock was set in nodeCopyNode */ - for(sock=gnode->inputs.first; sock; sock=sock->next) - if(sock->groupsock) - sock->groupsock= sock->groupsock->new_sock; - - for(sock=gnode->outputs.first; sock; sock=sock->next) - if(sock->groupsock) - sock->groupsock= sock->groupsock->new_sock; -} - -bNodeSocket *nodeGroupAddSocket(bNodeTree *ngroup, const char *name, int type, int in_out) -{ - bNodeSocket *gsock = MEM_callocN(sizeof(bNodeSocket), "bNodeSocket"); - - strncpy(gsock->name, name, sizeof(gsock->name)); - gsock->type = type; - gsock->ns.sockettype = type; - gsock->ns.min = INT_MIN; - gsock->ns.max = INT_MAX; - zero_v4(gsock->ns.vec); - gsock->ns.data = NULL; - gsock->flag = 0; - - gsock->next = gsock->prev = NULL; - gsock->new_sock = NULL; - gsock->link = NULL; - gsock->ns.data = NULL; - /* assign new unique index */ - gsock->own_index = ngroup->cur_index++; - gsock->limit = (in_out==SOCK_IN ? 0xFFF : 1); - - BLI_addtail(in_out==SOCK_IN ? &ngroup->inputs : &ngroup->outputs, gsock); - - return gsock; -} - -bNodeSocket *nodeGroupExposeSocket(bNodeTree *ngroup, bNodeSocket *sock, int in_out) -{ - bNodeSocket *gsock= nodeGroupAddSocket(ngroup, sock->name, sock->type, in_out); - /* initialize the default socket value */ - QUATCOPY(gsock->ns.vec, sock->ns.vec); - return gsock; -} - -void nodeGroupExposeAllSockets(bNodeTree *ngroup) -{ - bNode *node; - bNodeSocket *sock, *gsock; - - for (node=ngroup->nodes.first; node; node=node->next) { - for (sock=node->inputs.first; sock; sock=sock->next) { - if (!sock->link && !(sock->flag & SOCK_HIDDEN)) { - gsock = nodeGroupAddSocket(ngroup, sock->name, sock->type, SOCK_IN); - /* initialize the default socket value */ - QUATCOPY(gsock->ns.vec, sock->ns.vec); - sock->link = nodeAddLink(ngroup, NULL, gsock, node, sock); - } - } - for (sock=node->outputs.first; sock; sock=sock->next) { - if (nodeCountSocketLinks(ngroup, sock)==0 && !(sock->flag & SOCK_HIDDEN)) { - gsock = nodeGroupAddSocket(ngroup, sock->name, sock->type, SOCK_OUT); - /* initialize the default socket value */ - QUATCOPY(gsock->ns.vec, sock->ns.vec); - gsock->link = nodeAddLink(ngroup, node, sock, NULL, gsock); - } + if(ntype->inputs) { + sockdef= ntype->inputs; + while(sockdef->type != -1) { + sock = node_add_input_from_template(ntree, node, sockdef); + + sockdef++; } } -} - -void nodeGroupRemoveSocket(bNodeTree *ngroup, bNodeSocket *gsock, int in_out) -{ - nodeRemSocketLinks(ngroup, gsock); - switch (in_out) { - case SOCK_IN: BLI_remlink(&ngroup->inputs, gsock); break; - case SOCK_OUT: BLI_remlink(&ngroup->outputs, gsock); break; - } - MEM_freeN(gsock); -} - -/* ************** Add stuff ********** */ -void nodeAddSockets(bNode *node, bNodeType *ntype) -{ - if (node->type==NODE_GROUP) { - bNodeTree *ntree= (bNodeTree*)node->id; - if (ntree) { - bNodeSocket *gsock; - for (gsock=ntree->inputs.first; gsock; gsock=gsock->next) - node_add_group_socket(&node->inputs, gsock); - for (gsock=ntree->outputs.first; gsock; gsock=gsock->next) - node_add_group_socket(&node->outputs, gsock); - } - } - else { - bNodeSocketType *stype; - - if(ntype->inputs) { - stype= ntype->inputs; - while(stype->type != -1) { - node_add_socket_type(&node->inputs, stype); - stype++; - } - } - if(ntype->outputs) { - stype= ntype->outputs; - while(stype->type != -1) { - node_add_socket_type(&node->outputs, stype); - stype++; - } + if(ntype->outputs) { + sockdef= ntype->outputs; + while(sockdef->type != -1) { + sock = node_add_output_from_template(ntree, node, sockdef); + + sockdef++; } } } @@ -945,65 +321,40 @@ void nodeUniqueName(bNodeTree *ntree, bNode *node) BLI_uniquename(&ntree->nodes, node, "Node", '.', offsetof(bNode, name), sizeof(node->name)); } -bNode *nodeAddNodeType(bNodeTree *ntree, int type, bNodeTree *ngroup, ID *id) +bNode *nodeAddNode(bNodeTree *ntree, struct bNodeTemplate *ntemp) { - bNode *node= NULL; - bNodeType *ntype= NULL; - - if (ngroup && BLI_findindex(&G.main->nodetree, ngroup)==-1) { - printf("nodeAddNodeType() error: '%s' not in main->nodetree\n", ngroup->id.name); - return NULL; - } - - if(type>=NODE_DYNAMIC_MENU) { - int a=0, idx= type-NODE_DYNAMIC_MENU; - ntype= ntree->alltypes.first; - while(ntype) { - if(ntype->type==NODE_DYNAMIC) { - if(a==idx) - break; - a++; - } - ntype= ntype->next; - } - } else - ntype= node_get_type(ntree, type, id); - - if(ntype == NULL) { - printf("nodeAddNodeType() error: '%d' type invalid\n", type); - return NULL; - } - - node= MEM_callocN(sizeof(bNode), "new node"); - BLI_addtail(&ntree->nodes, node); - node->typeinfo= ntype; - if(type>=NODE_DYNAMIC_MENU) - node->custom2= type; /* for node_dynamic_init */ - - if(ngroup) - BLI_strncpy(node->name, ngroup->id.name+2, NODE_MAXSTR); - else if(type>NODE_DYNAMIC_MENU) { - BLI_strncpy(node->name, ntype->id->name+2, NODE_MAXSTR); - } - else - BLI_strncpy(node->name, ntype->name, NODE_MAXSTR); - - nodeUniqueName(ntree, node); + bNode *node; + bNodeType *ntype; + ntype= node_get_type(ntree, ntemp->type); + if(ntype == NULL) { + printf("nodeAddNodeType() error: '%d' type invalid\n", ntemp->type); + return NULL; + } + /* validity check */ + if (!nodeValid(ntree, ntemp)) + return NULL; + + node= MEM_callocN(sizeof(bNode), "new node"); node->type= ntype->type; + node->typeinfo= ntype; node->flag= NODE_SELECT|ntype->flag; node->width= ntype->width; - node->miniwidth= 42.0f; /* small value only, allows print of first chars */ - - if(type==NODE_GROUP) - node->id= (ID *)ngroup; - - /* need init handler later? */ - /* got it-bob*/ - if(ntype->initfunc!=NULL) - ntype->initfunc(node); + node->miniwidth= 42.0f; + node->height= ntype->height; - nodeAddSockets(node, ntype); + node_add_sockets_from_type(ntree, node, ntype); + + if(ntype->initfunc!=NULL) + ntype->initfunc(ntree, node, ntemp); + + /* initialize the node name with the node label */ + BLI_strncpy(node->name, nodeLabel(node), NODE_MAXSTR); + nodeUniqueName(ntree, node); + + BLI_addtail(&ntree->nodes, node); + + ntree->update |= NTREE_UPDATE_NODES; return node; } @@ -1011,9 +362,9 @@ bNode *nodeAddNodeType(bNodeTree *ntree, int type, bNodeTree *ngroup, ID *id) void nodeMakeDynamicType(bNode *node) { /* find SH_DYNAMIC_NODE ntype */ - bNodeType *ntype= node_all_shaders.first; + bNodeType *ntype= ntreeGetType(NTREE_SHADER)->node_types.first; while(ntype) { - if(ntype->type==NODE_DYNAMIC && ntype->id==NULL) + if(ntype->type==NODE_DYNAMIC) break; ntype= ntype->next; } @@ -1023,17 +374,11 @@ void nodeMakeDynamicType(bNode *node) /*node->typeinfo= MEM_dupallocN(ntype);*/ bNodeType *newtype= MEM_callocN(sizeof(bNodeType), "dynamic bNodeType"); *newtype= *ntype; - newtype->name= BLI_strdup(ntype->name); + strcpy(newtype->name, ntype->name); node->typeinfo= newtype; } } -void nodeUpdateType(bNodeTree *ntree, bNode* node, bNodeType *ntype) -{ - verify_socket_list(ntree, &node->inputs, ntype->inputs); - verify_socket_list(ntree, &node->outputs, ntype->outputs); -} - /* keep socket listorder identical, for copying links */ /* ntree is the target tree */ bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node) @@ -1045,19 +390,23 @@ bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node) nodeUniqueName(ntree, nnode); BLI_addtail(&ntree->nodes, nnode); - + BLI_duplicatelist(&nnode->inputs, &node->inputs); oldsock= node->inputs.first; for(sock= nnode->inputs.first; sock; sock= sock->next, oldsock= oldsock->next) { oldsock->new_sock= sock; + sock->stack_index= 0; + + sock->default_value = (oldsock->default_value ? MEM_dupallocN(oldsock->default_value) : NULL); } BLI_duplicatelist(&nnode->outputs, &node->outputs); oldsock= node->outputs.first; for(sock= nnode->outputs.first; sock; sock= sock->next, oldsock= oldsock->next) { - sock->stack_index= 0; - sock->ns.data= NULL; oldsock->new_sock= sock; + sock->stack_index= 0; + + sock->default_value = (oldsock->default_value ? MEM_dupallocN(oldsock->default_value) : NULL); } /* don't increase node->id users, freenode doesn't decrement either */ @@ -1069,10 +418,11 @@ bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node) nnode->new_node= NULL; nnode->preview= NULL; + ntree->update |= NTREE_UPDATE_NODES; + return nnode; } -/* fromsock and tosock can be NULL */ /* also used via rna api, so we check for proper input output direction */ bNodeLink *nodeAddLink(bNodeTree *ntree, bNode *fromnode, bNodeSocket *fromsock, bNode *tonode, bNodeSocket *tosock) { @@ -1095,6 +445,21 @@ bNodeLink *nodeAddLink(bNodeTree *ntree, bNode *fromnode, bNodeSocket *fromsock, from= -1; /* OK but flip */ } } + else { + /* check tree sockets */ + for(sock= ntree->inputs.first; sock; sock= sock->next) + if(sock==fromsock) + break; + if(sock) + from= 1; /* OK */ + else { + for(sock= ntree->outputs.first; sock; sock= sock->next) + if(sock==fromsock) + break; + if(sock) + from= -1; /* OK but flip */ + } + } if(tonode) { for(sock= tonode->inputs.first; sock; sock= sock->next) if(sock==tosock) @@ -1109,8 +474,22 @@ bNodeLink *nodeAddLink(bNodeTree *ntree, bNode *fromnode, bNodeSocket *fromsock, to= -1; /* OK but flip */ } } + else { + /* check tree sockets */ + for(sock= ntree->outputs.first; sock; sock= sock->next) + if(sock==tosock) + break; + if(sock) + to= 1; /* OK */ + else { + for(sock= ntree->inputs.first; sock; sock= sock->next) + if(sock==tosock) + break; + if(sock) + to= -1; /* OK but flip */ + } + } - /* this allows NULL sockets to work */ if(from >= 0 && to >= 0) { link= MEM_callocN(sizeof(bNodeLink), "link"); BLI_addtail(&ntree->links, link); @@ -1128,6 +507,8 @@ bNodeLink *nodeAddLink(bNodeTree *ntree, bNode *fromnode, bNodeSocket *fromsock, link->tosock= fromsock; } + ntree->update |= NTREE_UPDATE_LINKS; + return link; } @@ -1137,6 +518,8 @@ void nodeRemLink(bNodeTree *ntree, bNodeLink *link) if(link->tosock) link->tosock->link= NULL; MEM_freeN(link); + + ntree->update |= NTREE_UPDATE_LINKS; } void nodeRemSocketLinks(bNodeTree *ntree, bNodeSocket *sock) @@ -1149,26 +532,73 @@ void nodeRemSocketLinks(bNodeTree *ntree, bNodeSocket *sock) nodeRemLink(ntree, link); } } + + ntree->update |= NTREE_UPDATE_LINKS; } +/* transforms node location to area coords */ +void nodeSpaceCoords(bNode *node, float *locx, float *locy) +{ + if (node->parent) { + nodeSpaceCoords(node->parent, locx, locy); + *locx += node->locx; + *locy += node->locy; + } + else { + *locx = node->locx; + *locy = node->locy; + } +} -bNodeTree *ntreeAddTree(const char *name, int type, const short is_group) +void nodeAttachNode(bNode *node, bNode *parent) +{ + float parentx, parenty; + + node->parent = parent; + /* transform to parent space */ + nodeSpaceCoords(parent, &parentx, &parenty); + node->locx -= parentx; + node->locy -= parenty; +} + +void nodeDetachNode(struct bNode *node) +{ + float parentx, parenty; + + if (node->parent) { + /* transform to "global" (area) space */ + nodeSpaceCoords(node->parent, &parentx, &parenty); + node->locx += parentx; + node->locy += parenty; + node->parent = NULL; + } +} + +bNodeTree *ntreeAddTree(const char *name, int type, int nodetype) { bNodeTree *ntree; - - if (is_group) - ntree= alloc_libblock(&G.main->nodetree, ID_NT, name); - else { + bNodeType *ntype; + + /* trees are created as local trees if they of compositor, material or texture type, + * node groups and other tree types are created as library data. + */ + if (ELEM3(type, NTREE_COMPOSIT, NTREE_SHADER, NTREE_TEXTURE) && nodetype==0) { ntree= MEM_callocN(sizeof(bNodeTree), "new node tree"); *( (short *)ntree->id.name )= ID_NT; /* not "type", as that is ntree->type */ BLI_strncpy(ntree->id.name+2, name, sizeof(ntree->id.name)); } - + else + ntree= alloc_libblock(&G.main->nodetree, ID_NT, name); + ntree->type= type; - ntree->alltypes.first = NULL; - ntree->alltypes.last = NULL; - + ntree->nodetype = nodetype; + ntreeInitTypes(ntree); + + ntype = node_get_type(ntree, ntree->nodetype); + if (ntype && ntype->inittreefunc) + ntype->inittreefunc(ntree); + return ntree; } @@ -1199,9 +629,7 @@ bNodeTree *ntreeCopyTree(bNodeTree *ntree) id_us_plus((ID *)newtree->gpd); /* in case a running nodetree is copied */ - newtree->init &= ~(NTREE_EXEC_INIT); - newtree->threadstack= NULL; - newtree->stack= NULL; + newtree->execdata= NULL; newtree->nodes.first= newtree->nodes.last= NULL; newtree->links.first= newtree->links.last= NULL; @@ -1210,7 +638,10 @@ bNodeTree *ntreeCopyTree(bNodeTree *ntree) for(node= ntree->nodes.first; node; node= node->next) { node->new_node= NULL; nnode= nodeCopyNode(newtree, node); /* sets node->new */ - if(node==last) break; + + /* make sure we don't copy new nodes again! */ + if (node==last) + break; } /* socket definition for group usage */ @@ -1218,14 +649,15 @@ bNodeTree *ntreeCopyTree(bNodeTree *ntree) for(gsock= newtree->inputs.first, oldgsock= ntree->inputs.first; gsock; gsock=gsock->next, oldgsock=oldgsock->next) { oldgsock->new_sock= gsock; gsock->groupsock = (oldgsock->groupsock ? oldgsock->groupsock->new_sock : NULL); + gsock->default_value = (oldgsock->default_value ? MEM_dupallocN(oldgsock->default_value) : NULL); } - BLI_duplicatelist(&newtree->outputs, &ntree->outputs); for(gsock= newtree->outputs.first, oldgsock= ntree->outputs.first; gsock; gsock=gsock->next, oldgsock=oldgsock->next) { oldgsock->new_sock= gsock; gsock->groupsock = (oldgsock->groupsock ? oldgsock->groupsock->new_sock : NULL); + gsock->default_value = (oldgsock->default_value ? MEM_dupallocN(oldgsock->default_value) : NULL); } - + /* copy links */ BLI_duplicatelist(&newtree->links, &ntree->links); for(link= newtree->links.first; link; link= link->next) { @@ -1237,7 +669,13 @@ bNodeTree *ntreeCopyTree(bNodeTree *ntree) if (link->tosock) link->tosock->link = link; } - + + /* update node->parent pointers */ + for (node=newtree->nodes.first; node; node=node->next) { + if (node->parent) + node->parent = node->parent->new_node; + } + return newtree; } @@ -1256,7 +694,7 @@ void ntreeSwitchID(bNodeTree *ntree, ID *id_from, ID *id_to) /* *************** preview *********** */ /* if node->preview, then we assume the rect to exist */ -static void node_free_preview(bNode *node) +void nodeFreePreview(bNode *node) { if(node->preview) { if(node->preview->rect) @@ -1360,7 +798,6 @@ void nodeAddToPreview(bNode *node, float *col, int x, int y, int do_manage) } } - /* ************** Free stuff ********** */ /* goes over entire tree */ @@ -1395,50 +832,84 @@ void nodeUnlinkNode(bNodeTree *ntree, bNode *node) } } -static void composit_free_node_cache(bNode *node) +static void node_unlink_attached(bNodeTree *ntree, bNode *parent) { - bNodeSocket *sock; - - for(sock= node->outputs.first; sock; sock= sock->next) { - if(sock->ns.data) { - free_compbuf(sock->ns.data); - sock->ns.data= NULL; - } + bNode *node; + for (node=ntree->nodes.first; node; node=node->next) { + if (node->parent == parent) + nodeDetachNode(node); } } void nodeFreeNode(bNodeTree *ntree, bNode *node) { + bNodeTreeType *treetype= ntreeGetType(ntree->type); + bNodeSocket *sock, *nextsock; + + /* remove all references to this node */ nodeUnlinkNode(ntree, node); + node_unlink_attached(ntree, node); + BLI_remlink(&ntree->nodes, node); /* since it is called while free database, node->id is undefined */ - if(ntree->type==NTREE_COMPOSIT) - composit_free_node_cache(node); - BLI_freelistN(&node->inputs); - BLI_freelistN(&node->outputs); + if (treetype->free_node_cache) + treetype->free_node_cache(ntree, node); - node_free_preview(node); + for (sock=node->inputs.first; sock; sock = nextsock) { + nextsock = sock->next; + if (sock->default_value) + MEM_freeN(sock->default_value); + MEM_freeN(sock); + } + for (sock=node->outputs.first; sock; sock = nextsock) { + nextsock = sock->next; + if (sock->default_value) + MEM_freeN(sock->default_value); + MEM_freeN(sock); + } + + nodeFreePreview(node); if(node->typeinfo && node->typeinfo->freestoragefunc) { node->typeinfo->freestoragefunc(node); } MEM_freeN(node); + + ntree->update |= NTREE_UPDATE_NODES; } /* do not free ntree itself here, free_libblock calls this function too */ void ntreeFreeTree(bNodeTree *ntree) { bNode *node, *next; + bNodeSocket *sock; if(ntree==NULL) return; - ntreeEndExecTree(ntree); /* checks for if it is still initialized */ + /* XXX hack! node trees should not store execution graphs at all. + * This should be removed when old tree types no longer require it. + * Currently the execution data for texture nodes remains in the tree + * after execution, until the node tree is updated or freed. + */ + if (ntree->execdata) { + switch (ntree->type) { + case NTREE_COMPOSIT: + ntreeCompositEndExecTree(ntree->execdata); + break; + case NTREE_SHADER: + ntreeShaderEndExecTree(ntree->execdata); + break; + case NTREE_TEXTURE: + ntreeTexEndExecTree(ntree->execdata); + break; + } + } BKE_free_animdata((ID *)ntree); - + id_us_min((ID *)ntree->gpd); BLI_freelistN(&ntree->links); /* do first, then unlink_node goes fast */ @@ -1448,25 +919,120 @@ void ntreeFreeTree(bNodeTree *ntree) nodeFreeNode(ntree, node); } + for (sock=ntree->inputs.first; sock; sock=sock->next) + if (sock->default_value) + MEM_freeN(sock->default_value); BLI_freelistN(&ntree->inputs); + for (sock=ntree->outputs.first; sock; sock=sock->next) + if (sock->default_value) + MEM_freeN(sock->default_value); BLI_freelistN(&ntree->outputs); } void ntreeFreeCache(bNodeTree *ntree) { - bNode *node; + bNodeTreeType *treetype; if(ntree==NULL) return; + + treetype= ntreeGetType(ntree->type); + if (treetype->free_cache) + treetype->free_cache(ntree); +} - if(ntree->type==NTREE_COMPOSIT) - for(node= ntree->nodes.first; node; node= node->next) - composit_free_node_cache(node); +void ntreeSetOutput(bNodeTree *ntree) +{ + bNode *node; + /* find the active outputs, might become tree type dependant handler */ + for(node= ntree->nodes.first; node; node= node->next) { + if(node->typeinfo->nclass==NODE_CLASS_OUTPUT) { + bNode *tnode; + int output= 0; + + /* we need a check for which output node should be tagged like this, below an exception */ + if(node->type==CMP_NODE_OUTPUT_FILE) + continue; + + /* there is more types having output class, each one is checked */ + for(tnode= ntree->nodes.first; tnode; tnode= tnode->next) { + if(tnode->typeinfo->nclass==NODE_CLASS_OUTPUT) { + + if(ntree->type==NTREE_COMPOSIT) { + + /* same type, exception for viewer */ + if(tnode->type==node->type || + (ELEM(tnode->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER) && + ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER))) { + if(tnode->flag & NODE_DO_OUTPUT) { + output++; + if(output>1) + tnode->flag &= ~NODE_DO_OUTPUT; + } + } + } + else { + /* same type */ + if(tnode->type==node->type) { + if(tnode->flag & NODE_DO_OUTPUT) { + output++; + if(output>1) + tnode->flag &= ~NODE_DO_OUTPUT; + } + } + } + } + } + if(output==0) + node->flag |= NODE_DO_OUTPUT; + } + } + + /* here we could recursively set which nodes have to be done, + might be different for editor or for "real" use... */ +} + +typedef struct MakeLocalCallData { + ID *group_id; + ID *new_id; + int lib, local; +} MakeLocalCallData; + +static void ntreeMakeLocal_CheckLocal(void *calldata, ID *owner_id, bNodeTree *ntree) +{ + MakeLocalCallData *cd= (MakeLocalCallData*)calldata; + bNode *node; + + /* find if group is in tree */ + for(node= ntree->nodes.first; node; node= node->next) { + if(node->id == cd->group_id) { + if(owner_id->lib) cd->lib= 1; + else cd->local= 1; + } + } +} + +static void ntreeMakeLocal_LinkNew(void *calldata, ID *owner_id, bNodeTree *ntree) +{ + MakeLocalCallData *cd= (MakeLocalCallData*)calldata; + bNode *node; + + /* find if group is in tree */ + for(node= ntree->nodes.first; node; node= node->next) { + if(node->id == cd->group_id) { + if(owner_id->lib==NULL) { + node->id= cd->new_id; + cd->new_id->us++; + cd->group_id->us--; + } + } + } } void ntreeMakeLocal(bNodeTree *ntree) { - int local=0, lib=0; + bNodeTreeType *treetype= ntreeGetType(ntree->type); + MakeLocalCallData cd; /* - only lib users: do nothing * - only local users: set flag @@ -1475,138 +1041,146 @@ void ntreeMakeLocal(bNodeTree *ntree) if(ntree->id.lib==NULL) return; if(ntree->id.us==1) { - ntree->id.lib= NULL; + ntree->id.lib= 0; ntree->id.flag= LIB_LOCAL; - new_id(NULL, (ID *)ntree, NULL); + new_id(0, (ID *)ntree, 0); return; } /* now check users of groups... again typedepending, callback... */ - if(ntree->type==NTREE_SHADER) { - Material *ma; - for(ma= G.main->mat.first; ma; ma= ma->id.next) { - if(ma->nodetree) { - bNode *node; - - /* find if group is in tree */ - for(node= ma->nodetree->nodes.first; node; node= node->next) { - if(node->id == (ID *)ntree) { - if(ma->id.lib) lib= 1; - else local= 1; - } - } - } - } - } - else if(ntree->type==NTREE_COMPOSIT) { - Scene *sce; - for(sce= G.main->scene.first; sce; sce= sce->id.next) { - if(sce->nodetree) { - bNode *node; - - /* find if group is in tree */ - for(node= sce->nodetree->nodes.first; node; node= node->next) { - if(node->id == (ID *)ntree) { - if(sce->id.lib) lib= 1; - else local= 1; - } - } - } - } - } - else if(ntree->type==NTREE_TEXTURE) { - Tex *tx; - for(tx= G.main->tex.first; tx; tx= tx->id.next) { - if(tx->nodetree) { - bNode *node; - - /* find if group is in tree */ - for(node= tx->nodetree->nodes.first; node; node= node->next) { - if(node->id == (ID *)ntree) { - if(tx->id.lib) lib= 1; - else local= 1; - } - } - } - } - } + cd.group_id = &ntree->id; + cd.new_id = NULL; + cd.local = 0; + cd.lib = 0; + + treetype->foreach_nodetree(G.main, &cd, &ntreeMakeLocal_CheckLocal); /* if all users are local, we simply make tree local */ - if(local && lib==0) { + if(cd.local && cd.lib==0) { ntree->id.lib= NULL; ntree->id.flag= LIB_LOCAL; - new_id(NULL, (ID *)ntree, NULL); + new_id(0, (ID *)ntree, 0); } - else if(local && lib) { + else if(cd.local && cd.lib) { /* this is the mixed case, we copy the tree and assign it to local users */ bNodeTree *newtree= ntreeCopyTree(ntree); newtree->id.us= 0; - if(ntree->type==NTREE_SHADER) { - Material *ma; - for(ma= G.main->mat.first; ma; ma= ma->id.next) { - if(ma->nodetree) { - bNode *node; - - /* find if group is in tree */ - for(node= ma->nodetree->nodes.first; node; node= node->next) { - if(node->id == (ID *)ntree) { - if(ma->id.lib==NULL) { - node->id= &newtree->id; - newtree->id.us++; - ntree->id.us--; - } - } - } - } - } - } - else if(ntree->type==NTREE_COMPOSIT) { - Scene *sce; - for(sce= G.main->scene.first; sce; sce= sce->id.next) { - if(sce->nodetree) { - bNode *node; - - /* find if group is in tree */ - for(node= sce->nodetree->nodes.first; node; node= node->next) { - if(node->id == (ID *)ntree) { - if(sce->id.lib==NULL) { - node->id= &newtree->id; - newtree->id.us++; - ntree->id.us--; - } - } - } - } - } - } - else if(ntree->type==NTREE_TEXTURE) { - Tex *tx; - for(tx= G.main->tex.first; tx; tx= tx->id.next) { - if(tx->nodetree) { - bNode *node; - - /* find if group is in tree */ - for(node= tx->nodetree->nodes.first; node; node= node->next) { - if(node->id == (ID *)ntree) { - if(tx->id.lib==NULL) { - node->id= &newtree->id; - newtree->id.us++; - ntree->id.us--; - } - } - } - } - } - } + + cd.new_id = &newtree->id; + treetype->foreach_nodetree(G.main, &cd, &ntreeMakeLocal_LinkNew); } } +int ntreeNodeExists(bNodeTree *ntree, bNode *testnode) +{ + bNode *node= ntree->nodes.first; + for(; node; node= node->next) + if(node==testnode) + return 1; + return 0; +} + +int ntreeOutputExists(bNode *node, bNodeSocket *testsock) +{ + bNodeSocket *sock= node->outputs.first; + for(; sock; sock= sock->next) + if(sock==testsock) + return 1; + return 0; +} + +/* returns localized tree for execution in threads */ +bNodeTree *ntreeLocalize(bNodeTree *ntree) +{ + bNodeTreeType *ntreetype= ntreeGetType(ntree->type); + + bNodeTree *ltree; + bNode *node; + + bAction *action_backup= NULL, *tmpact_backup= NULL; + + /* Workaround for copying an action on each render! + * set action to NULL so animdata actions dont get copied */ + AnimData *adt= BKE_animdata_from_id(&ntree->id); + + if(adt) { + action_backup= adt->action; + tmpact_backup= adt->tmpact; + + adt->action= NULL; + adt->tmpact= NULL; + } + + /* node copy func */ + ltree= ntreeCopyTree(ntree); + + if(adt) { + AnimData *ladt= BKE_animdata_from_id(<ree->id); + + adt->action= ladt->action= action_backup; + adt->tmpact= ladt->tmpact= tmpact_backup; + + if(action_backup) action_backup->id.us++; + if(tmpact_backup) tmpact_backup->id.us++; + + } + /* end animdata uglyness */ + + /* ensures only a single output node is enabled */ + ntreeSetOutput(ntree); + + for(node= ntree->nodes.first; node; node= node->next) { + /* store new_node pointer to original */ + node->new_node->new_node= node; + } + + if (ntreetype->localize) + ntreetype->localize(ltree, ntree); + + return ltree; +} + +/* sync local composite with real tree */ +/* local tree is supposed to be running, be careful moving previews! */ +/* is called by jobs manager, outside threads, so it doesnt happen during draw */ +void ntreeLocalSync(bNodeTree *localtree, bNodeTree *ntree) +{ + bNodeTreeType *ntreetype= ntreeGetType(ntree->type); + + if (ntreetype->local_sync) + ntreetype->local_sync(localtree, ntree); +} + +/* merge local tree results back, and free local tree */ +/* we have to assume the editor already changed completely */ +void ntreeLocalMerge(bNodeTree *localtree, bNodeTree *ntree) +{ + bNodeTreeType *ntreetype= ntreeGetType(ntree->type); + bNode *lnode; + + /* move over the compbufs and previews */ + for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) { + if(ntreeNodeExists(ntree, lnode->new_node)) { + if(lnode->preview && lnode->preview->rect) { + nodeFreePreview(lnode->new_node); + lnode->new_node->preview= lnode->preview; + lnode->preview= NULL; + } + } + } + + if (ntreetype->local_merge) + ntreetype->local_merge(localtree, ntree); + + ntreeFreeTree(localtree); + MEM_freeN(localtree); +} /* ************ find stuff *************** */ -static int ntreeHasType(bNodeTree *ntree, int type) +int ntreeHasType(bNodeTree *ntree, int type) { bNode *node; @@ -1770,7 +1344,7 @@ void ntreeSocketUseFlags(bNodeTree *ntree) /* ************** dependency stuff *********** */ /* node is guaranteed to be not checked before */ -static int node_recurs_check(bNode *node, bNode ***nsort) +static int node_get_deplist_recurs(bNode *node, bNode ***nsort) { bNode *fromnode; bNodeSocket *sock; @@ -1778,163 +1352,207 @@ static int node_recurs_check(bNode *node, bNode ***nsort) node->done= 1; + /* check linked nodes */ for(sock= node->inputs.first; sock; sock= sock->next) { if(sock->link) { fromnode= sock->link->fromnode; if(fromnode) { if (fromnode->done==0) - fromnode->level= node_recurs_check(fromnode, nsort); + fromnode->level= node_get_deplist_recurs(fromnode, nsort); if (fromnode->level <= level) level = fromnode->level - 1; } } } - **nsort= node; - (*nsort)++; + + /* check parent node */ + if (node->parent) { + if (node->parent->done==0) + node->parent->level= node_get_deplist_recurs(node->parent, nsort); + if (node->parent->level <= level) + level = node->parent->level - 1; + } + + if (nsort) { + **nsort= node; + (*nsort)++; + } return level; } - -static void ntreeSetOutput(bNodeTree *ntree) +void ntreeGetDependencyList(struct bNodeTree *ntree, struct bNode ***deplist, int *totnodes) { - bNode *node; - - /* find the active outputs, might become tree type dependant handler */ - for(node= ntree->nodes.first; node; node= node->next) { - if(node->typeinfo->nclass==NODE_CLASS_OUTPUT) { - bNode *tnode; - int output= 0; - - /* we need a check for which output node should be tagged like this, below an exception */ - if(node->type==CMP_NODE_OUTPUT_FILE) - continue; - - /* there is more types having output class, each one is checked */ - for(tnode= ntree->nodes.first; tnode; tnode= tnode->next) { - if(tnode->typeinfo->nclass==NODE_CLASS_OUTPUT) { - - if(ntree->type==NTREE_COMPOSIT) { - - /* same type, exception for viewer */ - if(tnode->type==node->type || - (ELEM(tnode->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER) && - ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER))) { - if(tnode->flag & NODE_DO_OUTPUT) { - output++; - if(output>1) - tnode->flag &= ~NODE_DO_OUTPUT; - } - } - } - else { - /* same type */ - if(tnode->type==node->type) { - if(tnode->flag & NODE_DO_OUTPUT) { - output++; - if(output>1) - tnode->flag &= ~NODE_DO_OUTPUT; - } - } - } - } - } - if(output==0) - node->flag |= NODE_DO_OUTPUT; - } - } + bNode *node, **nsort; - /* here we could recursively set which nodes have to be done, - might be different for editor or for "real" use... */ -} - -void ntreeSolveOrder(bNodeTree *ntree) -{ - bNode *node, **nodesort, **nsort; - bNodeSocket *sock; - bNodeLink *link; - int a, totnode=0; + *totnodes=0; - /* the solve-order is called on each tree change, so we should be sure no exec can be running */ - ntreeEndExecTree(ntree); - - /* set links pointers the input sockets, to find dependencies */ /* first clear data */ for(node= ntree->nodes.first; node; node= node->next) { node->done= 0; - totnode++; - for(sock= node->inputs.first; sock; sock= sock->next) - sock->link= NULL; + (*totnodes)++; } - /* clear group socket links */ - for(sock= ntree->outputs.first; sock; sock= sock->next) - sock->link= NULL; - if(totnode==0) + if(*totnodes==0) { + *deplist = NULL; return; - - for(link= ntree->links.first; link; link= link->next) { - link->tosock->link= link; } - nsort= nodesort= MEM_callocN(totnode*sizeof(void *), "sorted node array"); + nsort= *deplist= MEM_callocN((*totnodes)*sizeof(bNode*), "sorted node array"); /* recursive check */ for(node= ntree->nodes.first; node; node= node->next) { if(node->done==0) { - node->level= node_recurs_check(node, &nsort); + node->level= node_get_deplist_recurs(node, &nsort); } } - - /* re-insert nodes in order, first a paranoia check */ - for(a=0; anodes.first= ntree->nodes.last= NULL; - for(a=0; anodes, nodesort[a]); - } - - MEM_freeN(nodesort); - - ntreeSetOutput(ntree); } +static void ntree_update_link_pointers(bNodeTree *ntree) +{ + bNode *node; + bNodeSocket *sock; + bNodeLink *link; + + /* first clear data */ + for(node= ntree->nodes.first; node; node= node->next) { + for(sock= node->inputs.first; sock; sock= sock->next) + sock->link= NULL; + } + /* clear socket links */ + for(sock= ntree->outputs.first; sock; sock= sock->next) + sock->link= NULL; + + for(link= ntree->links.first; link; link= link->next) { + if (link->tosock) + link->tosock->link= link; + } +} + +void ntree_validate_links(bNodeTree *ntree) +{ + bNodeTreeType *ntreetype = ntreeGetType(ntree->type); + bNodeLink *link; + + for (link = ntree->links.first; link; link = link->next) { + link->flag |= NODE_LINK_VALID; + if (link->fromnode && link->tonode && link->fromnode->level <= link->tonode->level) + link->flag &= ~NODE_LINK_VALID; + else if (ntreetype->validate_link) { + if (!ntreetype->validate_link(ntree, link)) + link->flag &= ~NODE_LINK_VALID; + } + } +} + +static void ntree_verify_nodes_cb(void *calldata, struct ID *UNUSED(owner_id), struct bNodeTree *ntree) +{ + ID *id= (ID*)calldata; + bNode *node; + + for (node=ntree->nodes.first; node; node=node->next) + if (node->typeinfo->verifyfunc) + node->typeinfo->verifyfunc(ntree, node, id); +} + +void ntreeVerifyNodes(struct Main *main, struct ID *id) +{ + bNodeTreeType *ntreetype; + bNodeTree *ntree; + int n; + + for (n=0; n < NUM_NTREE_TYPES; ++n) { + ntreetype= ntreeGetType(n); + if (ntreetype && ntreetype->foreach_nodetree) + ntreetype->foreach_nodetree(main, id, ntree_verify_nodes_cb); + } + for (ntree=main->nodetree.first; ntree; ntree=ntree->id.next) + ntree_verify_nodes_cb(id, NULL, ntree); +} + +void ntreeUpdateTree(bNodeTree *ntree) +{ + bNodeTreeType *ntreetype= ntreeGetType(ntree->type); + bNode *node; + bNode **deplist; + int totnodes, n; + + ntree_update_link_pointers(ntree); + + /* also updates the node level! */ + ntreeGetDependencyList(ntree, &deplist, &totnodes); + + if (deplist) { + /* update individual nodes */ + for (n=0; n < totnodes; ++n) { + node = deplist[n]; + if (ntreetype->update_node) + ntreetype->update_node(ntree, node); + else if (node->typeinfo->updatefunc) + node->typeinfo->updatefunc(ntree, node); + } + + MEM_freeN(deplist); + + /* ensures only a single output node is enabled, texnode allows multiple though */ + if(ntree->type!=NTREE_TEXTURE) + ntreeSetOutput(ntree); + + } + + /* general tree updates */ + if (ntree->update & (NTREE_UPDATE_LINKS|NTREE_UPDATE_NODES)) { + ntree_validate_links(ntree); + } + + /* update tree */ + if (ntreetype->update) + ntreetype->update(ntree); + else { + bNodeType *ntype= node_get_type(ntree, ntree->nodetype); + if (ntype && ntype->updatetreefunc) + ntype->updatetreefunc(ntree); + } + + /* XXX hack, should be done by depsgraph!! */ + ntreeVerifyNodes(G.main, &ntree->id); + + /* clear the update flag */ + ntree->update = 0; +} -/* Should be callback! */ -/* Do not call execs here */ void NodeTagChanged(bNodeTree *ntree, bNode *node) { - if(ntree->type==NTREE_COMPOSIT) { - bNodeSocket *sock; - - for(sock= node->outputs.first; sock; sock= sock->next) { - if(sock->ns.data) { - //free_compbuf(sock->ns.data); - //sock->ns.data= NULL; - } - } - node->need_exec= 1; - } + bNodeTreeType *ntreetype = ntreeGetType(ntree->type); + + if (ntreetype->update_node) + ntreetype->update_node(ntree, node); + else if (node->typeinfo->updatefunc) + node->typeinfo->updatefunc(ntree, node); } int NodeTagIDChanged(bNodeTree *ntree, ID *id) { + bNodeTreeType *ntreetype = ntreeGetType(ntree->type); + bNode *node; int change = FALSE; if(ELEM(NULL, id, ntree)) return change; - if(ntree->type==NTREE_COMPOSIT) { - bNode *node; - + if (ntreetype->update_node) { for(node= ntree->nodes.first; node; node= node->next) { if(node->id==id) { - change= TRUE; - NodeTagChanged(ntree, node); + change = TRUE; + ntreetype->update_node(ntree, node); + } + } + } + else { + for(node= ntree->nodes.first; node; node= node->next) { + if(node->id==id) { + change = TRUE; + if (node->typeinfo->updatefunc) + node->typeinfo->updatefunc(ntree, node); } } } @@ -1943,1454 +1561,108 @@ int NodeTagIDChanged(bNodeTree *ntree, ID *id) } +/* ************* node type access ********** */ -/* ******************* executing ************* */ - -/* for a given socket, find the actual stack entry */ -static bNodeStack *get_socket_stack(bNodeStack *stack, bNodeSocket *sock, bNodeStack **gin) +int nodeValid(bNodeTree *ntree, bNodeTemplate *ntemp) { - switch (sock->stack_type) { - case SOCK_STACK_LOCAL: - return stack + sock->stack_index; - case SOCK_STACK_EXTERN: - return (gin ? gin[sock->stack_index] : NULL); - case SOCK_STACK_CONST: - return sock->stack_ptr; - } - return NULL; -} - -/* see notes at ntreeBeginExecTree */ -static void node_get_stack(bNode *node, bNodeStack *stack, bNodeStack **in, bNodeStack **out, bNodeStack **gin) -{ - bNodeSocket *sock; - - /* build pointer stack */ - if (in) { - for(sock= node->inputs.first; sock; sock= sock->next) { - *(in++) = get_socket_stack(stack, sock, gin); - } - } - - if (out) { - for(sock= node->outputs.first; sock; sock= sock->next) { - *(out++) = get_socket_stack(stack, sock, gin); - } - } -} - -static void node_group_execute(bNodeStack *stack, void *data, bNode *gnode, bNodeStack **in) -{ - bNode *node; - bNodeTree *ntree= (bNodeTree *)gnode->id; - bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */ - bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */ - - if(ntree==NULL) return; - - stack+= gnode->stack_index; - - for(node= ntree->nodes.first; node; node= node->next) { - if(node->typeinfo->execfunc) { - node_get_stack(node, stack, nsin, nsout, in); - - /* for groups, only execute outputs for edited group */ - if(node->typeinfo->nclass==NODE_CLASS_OUTPUT) { - if(node->type==CMP_NODE_OUTPUT_FILE || (gnode->flag & NODE_GROUP_EDIT)) - node->typeinfo->execfunc(data, node, nsin, nsout); - } - else - node->typeinfo->execfunc(data, node, nsin, nsout); - } - } - - /* free internal buffers */ - if (ntree->type==NTREE_COMPOSIT) { - bNodeSocket *sock; - bNodeStack *ns; - - /* clear hasoutput on all local stack data, - * only the group output will be used from now on - */ - for (node=ntree->nodes.first; node; node=node->next) { - for (sock=node->outputs.first; sock; sock=sock->next) { - if (sock->stack_type==SOCK_STACK_LOCAL) { - ns= get_socket_stack(stack, sock, in); - ns->hasoutput = 0; - } - } - } - /* use the hasoutput flag to tag external sockets */ - for (sock=ntree->outputs.first; sock; sock=sock->next) { - if (sock->stack_type==SOCK_STACK_LOCAL) { - ns= get_socket_stack(stack, sock, in); - ns->hasoutput = 1; - } - } - /* now free all stacks that are not used from outside */ - for (node=ntree->nodes.first; node; node=node->next) { - for (sock=node->outputs.first; sock; sock=sock->next) { - if (sock->stack_type==SOCK_STACK_LOCAL ) { - ns= get_socket_stack(stack, sock, in); - if (ns->hasoutput==0 && ns->data) { - free_compbuf(ns->data); - ns->data = NULL; - } - } - } - } - } -} - -static int set_stack_indexes_default(bNode *node, int index) -{ - bNodeSocket *sock; - - for (sock=node->inputs.first; sock; sock=sock->next) { - if (sock->link && sock->link->fromsock) { - sock->stack_type = sock->link->fromsock->stack_type; - sock->stack_index = sock->link->fromsock->stack_index; - sock->stack_ptr = sock->link->fromsock->stack_ptr; - } - else { - sock->stack_type = SOCK_STACK_CONST; - sock->stack_index = -1; - sock->stack_ptr = &sock->ns; - } - } - - for (sock=node->outputs.first; sock; sock=sock->next) { - sock->stack_type = SOCK_STACK_LOCAL; - sock->stack_index = index++; - sock->stack_ptr = NULL; - } - - return index; -} - -static int ntree_begin_exec_tree(bNodeTree *ntree); -static int set_stack_indexes_group(bNode *node, int index) -{ - bNodeTree *ngroup= (bNodeTree*)node->id; - bNodeSocket *sock; - - if(ngroup && (ngroup->init & NTREE_TYPE_INIT)==0) - ntreeInitTypes(ngroup); - - node->stack_index = index; - if(ngroup) - index += ntree_begin_exec_tree(ngroup); - - for (sock=node->inputs.first; sock; sock=sock->next) { - if (sock->link && sock->link->fromsock) { - sock->stack_type = sock->link->fromsock->stack_type; - sock->stack_index = sock->link->fromsock->stack_index; - sock->stack_ptr = sock->link->fromsock->stack_ptr; - } - else { - sock->stack_type = SOCK_STACK_CONST; - sock->stack_index = -1; - sock->stack_ptr = &sock->ns; - } - } - - /* identify group node outputs from internal group sockets */ - for(sock= node->outputs.first; sock; sock= sock->next) { - if (sock->groupsock) { - bNodeSocket *insock, *gsock = sock->groupsock; - switch (gsock->stack_type) { - case SOCK_STACK_EXTERN: - /* extern stack is resolved for this group node instance */ - insock= find_group_node_input(node, gsock->link->fromsock); - sock->stack_type = insock->stack_type; - sock->stack_index = insock->stack_index; - sock->stack_ptr = insock->stack_ptr; - break; - case SOCK_STACK_LOCAL: - sock->stack_type = SOCK_STACK_LOCAL; - /* local stack index must be offset by group node instance */ - sock->stack_index = gsock->stack_index + node->stack_index; - sock->stack_ptr = NULL; - break; - case SOCK_STACK_CONST: - sock->stack_type = SOCK_STACK_CONST; - sock->stack_index = -1; - sock->stack_ptr = gsock->stack_ptr; - break; - } - } - else { - sock->stack_type = SOCK_STACK_LOCAL; - sock->stack_index = index++; - sock->stack_ptr = NULL; - } - } - - return index; -} - -/* recursively called for groups */ -/* we set all trees on own local indices, but put a total counter - in the groups, so each instance of a group has own stack */ -static int ntree_begin_exec_tree(bNodeTree *ntree) -{ - bNode *node; - bNodeSocket *gsock; - int index= 0, i; - - if((ntree->init & NTREE_TYPE_INIT)==0) - ntreeInitTypes(ntree); - - /* group inputs are numbered 0..totinputs, so external stack can easily be addressed */ - i = 0; - for(gsock=ntree->inputs.first; gsock; gsock = gsock->next) { - gsock->stack_type = SOCK_STACK_EXTERN; - gsock->stack_index = i++; - gsock->stack_ptr = NULL; - } - - /* create indices for stack, check preview */ - for(node= ntree->nodes.first; node; node= node->next) { - /* XXX can this be done by a generic one-for-all function? - * otherwise should use node-type callback. - */ - if(node->type==NODE_GROUP) - index = set_stack_indexes_group(node, index); + bNodeType *ntype= node_get_type(ntree, ntemp->type); + if (ntype) { + if (ntype->validfunc) + return ntype->validfunc(ntree, ntemp); else - index = set_stack_indexes_default(node, index); + return 1; } - - /* group outputs */ - for(gsock=ntree->outputs.first; gsock; gsock = gsock->next) { - if (gsock->link && gsock->link->fromsock) { - gsock->stack_type = gsock->link->fromsock->stack_type; - gsock->stack_index = gsock->link->fromsock->stack_index; - gsock->stack_ptr = gsock->link->fromsock->stack_ptr; - } - else { - gsock->stack_type = SOCK_STACK_CONST; - gsock->stack_index = -1; - gsock->stack_ptr = &gsock->ns; - } - } - - return index; + else + return 0; } -/* copy socket compbufs to stack, initialize usage of curve nodes */ -static void composit_begin_exec(bNodeTree *ntree, bNodeStack *stack) +const char* nodeLabel(bNode *node) { - bNode *node; - bNodeSocket *sock; - - for(node= ntree->nodes.first; node; node= node->next) { - - /* initialize needed for groups */ - node->exec= 0; - - for(sock= node->outputs.first; sock; sock= sock->next) { - bNodeStack *ns= get_socket_stack(stack, sock, NULL); - if(ns && sock->ns.data) { - ns->data= sock->ns.data; - sock->ns.data= NULL; - } - } - - /* cannot initialize them while using in threads */ - if(ELEM4(node->type, CMP_NODE_TIME, CMP_NODE_CURVE_VEC, CMP_NODE_CURVE_RGB, CMP_NODE_HUECORRECT)) { - curvemapping_initialize(node->storage); - if(node->type==CMP_NODE_CURVE_RGB) - curvemapping_premultiply(node->storage, 0); - } - if(node->type==NODE_GROUP && node->id) - composit_begin_exec((bNodeTree *)node->id, stack + node->stack_index); - - } + if (node->label[0]!='\0') + return node->label; + else if (node->typeinfo->labelfunc) + return node->typeinfo->labelfunc(node); + else + return node->typeinfo->name; } -/* copy stack compbufs to sockets */ -static void composit_end_exec(bNodeTree *ntree, bNodeStack *stack) +struct bNodeTree *nodeGroupEditGet(struct bNode *node) { - bNode *node; - bNodeStack *ns; - - for(node= ntree->nodes.first; node; node= node->next) { - bNodeSocket *sock; - - for(sock= node->outputs.first; sock; sock= sock->next) { - ns = get_socket_stack(stack, sock, NULL); - if(ns && ns->data) { - sock->ns.data= ns->data; - ns->data= NULL; - } - } - - if(node->type==CMP_NODE_CURVE_RGB) - curvemapping_premultiply(node->storage, 1); - - if(node->type==NODE_GROUP && node->id) - composit_end_exec((bNodeTree *)node->id, stack + node->stack_index); - - node->need_exec= 0; - } + if (node->typeinfo->group_edit_get) + return node->typeinfo->group_edit_get(node); + else + return NULL; } -static void group_tag_used_outputs(bNode *gnode, bNodeStack *stack, bNodeStack **gin) +struct bNodeTree *nodeGroupEditSet(struct bNode *node, int edit) { - bNodeTree *ntree= (bNodeTree *)gnode->id; - bNode *node; - bNodeSocket *sock; - - stack+= gnode->stack_index; - - for(node= ntree->nodes.first; node; node= node->next) { - if(node->typeinfo->execfunc) { - for(sock= node->inputs.first; sock; sock= sock->next) { - bNodeStack *ns = get_socket_stack(stack, sock, gin); - ns->hasoutput= 1; - } - } - - /* non-composite trees do all nodes by default */ - if (ntree->type!=NTREE_COMPOSIT) - node->need_exec = 1; - - for(sock= node->inputs.first; sock; sock= sock->next) { - bNodeStack *ns = get_socket_stack(stack, sock, gin); - if (ns) { - ns->hasoutput = 1; - - /* sock type is needed to detect rgba or value or vector types */ - if(sock->link && sock->link->fromsock) - ns->sockettype= sock->link->fromsock->type; - else - sock->ns.sockettype= sock->type; - } - - if(sock->link) { - bNodeLink *link= sock->link; - /* this is the test for a cyclic case */ - if(link->fromnode && link->tonode) { - if(link->fromnode->level >= link->tonode->level && link->tonode->level!=0xFFF); - else { - node->need_exec= 0; - } - } - } - } - - /* set stack types (for local stack entries) */ - for(sock= node->outputs.first; sock; sock= sock->next) { - bNodeStack *ns = get_socket_stack(stack, sock, gin); - if (ns) - ns->sockettype = sock->type; - } - } + if (node->typeinfo->group_edit_set) + return node->typeinfo->group_edit_set(node, edit); + else if (node->typeinfo->group_edit_get) + return node->typeinfo->group_edit_get(node); + else + return NULL; } -/* notes below are ancient! (ton) */ -/* stack indices make sure all nodes only write in allocated data, for making it thread safe */ -/* only root tree gets the stack, to enable instances to have own stack entries */ -/* per tree (and per group) unique indices are created */ -/* the index_ext we need to be able to map from groups to the group-node own stack */ - -typedef struct bNodeThreadStack { - struct bNodeThreadStack *next, *prev; - bNodeStack *stack; - int used; -} bNodeThreadStack; - -static bNodeThreadStack *ntreeGetThreadStack(bNodeTree *ntree, int thread) +void nodeGroupEditClear(struct bNode *node) { - ListBase *lb= &ntree->threadstack[thread]; - bNodeThreadStack *nts; - - for(nts=lb->first; nts; nts=nts->next) { - if(!nts->used) { - nts->used= 1; - return nts; - } - } - nts= MEM_callocN(sizeof(bNodeThreadStack), "bNodeThreadStack"); - nts->stack= MEM_dupallocN(ntree->stack); - nts->used= 1; - BLI_addtail(lb, nts); - - return nts; + if (node->typeinfo->group_edit_clear) + node->typeinfo->group_edit_clear(node); } -static void ntreeReleaseThreadStack(bNodeThreadStack *nts) +struct bNodeTemplate nodeMakeTemplate(struct bNode *node) { - nts->used= 0; -} - -/* free texture delegates */ -static void tex_end_exec(bNodeTree *ntree) -{ - bNodeThreadStack *nts; - bNodeStack *ns; - int th, a; - - if(ntree->threadstack) { - for(th=0; ththreadstack[th].first; nts; nts=nts->next) { - for(ns= nts->stack, a=0; astacksize; a++, ns++) { - if(ns->data) { - MEM_freeN(ns->data); - ns->data= NULL; - } - } - } - } - } -} - -void ntreeBeginExecTree(bNodeTree *ntree) -{ - bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */ - - /* let's make it sure */ - if(ntree->init & NTREE_EXEC_INIT) - return; - - /* allocate the thread stack listbase array */ - if(ntree->type!=NTREE_COMPOSIT) - ntree->threadstack= MEM_callocN(BLENDER_MAX_THREADS*sizeof(ListBase), "thread stack array"); - - /* goes recursive over all groups */ - ntree->stacksize= ntree_begin_exec_tree(ntree); - - if(ntree->stacksize) { - bNode *node; - bNodeStack *ns; - int a; - - /* allocate the base stack */ - ns=ntree->stack= MEM_callocN(ntree->stacksize*sizeof(bNodeStack), "node stack"); - - /* tag inputs, the get_stack() gives own socket stackdata if not in use */ - for(a=0; astacksize; a++, ns++) ns->hasinput= 1; - - /* tag used outputs, so we know when we can skip operations */ - for(node= ntree->nodes.first; node; node= node->next) { - bNodeSocket *sock; - - /* non-composite trees do all nodes by default */ - if(ntree->type!=NTREE_COMPOSIT) - node->need_exec= 1; - - for(sock= node->inputs.first; sock; sock= sock->next) { - ns = get_socket_stack(ntree->stack, sock, NULL); - if (ns) { - ns->hasoutput = 1; - - /* sock type is needed to detect rgba or value or vector types */ - if(sock->link && sock->link->fromsock) - ns->sockettype= sock->link->fromsock->type; - else - sock->ns.sockettype= sock->type; - } - - if(sock->link) { - bNodeLink *link= sock->link; - /* this is the test for a cyclic case */ - if(link->fromnode && link->tonode) { - if(link->fromnode->level >= link->tonode->level && link->tonode->level!=0xFFF); - else { - node->need_exec= 0; - } - } - } - } - - /* set stack types (for local stack entries) */ - for(sock= node->outputs.first; sock; sock= sock->next) { - ns = get_socket_stack(ntree->stack, sock, NULL); - if (ns) - ns->sockettype = sock->type; - } - - if(node->type==NODE_GROUP && node->id) { - node_get_stack(node, ntree->stack, nsin, NULL, NULL); - group_tag_used_outputs(node, ntree->stack, nsin); - } - } - - if(ntree->type==NTREE_COMPOSIT) - composit_begin_exec(ntree, ntree->stack); - - /* ensures only a single output node is enabled, texnode allows multiple though */ - if(ntree->type!=NTREE_TEXTURE) - ntreeSetOutput(ntree); - - } - - ntree->init |= NTREE_EXEC_INIT; -} - -void ntreeEndExecTree(bNodeTree *ntree) -{ - bNodeStack *ns; - - if(ntree->init & NTREE_EXEC_INIT) { - bNodeThreadStack *nts; - int a; - - /* another callback candidate! */ - if(ntree->type==NTREE_COMPOSIT) { - composit_end_exec(ntree, ntree->stack); - - for(ns= ntree->stack, a=0; astacksize; a++, ns++) { - if(ns->data) { - printf("freed leftover buffer from stack\n"); - free_compbuf(ns->data); - ns->data= NULL; - } - } - } - else if(ntree->type==NTREE_TEXTURE) - tex_end_exec(ntree); - - if(ntree->stack) { - MEM_freeN(ntree->stack); - ntree->stack= NULL; - } - - if(ntree->threadstack) { - for(a=0; athreadstack[a].first; nts; nts=nts->next) - if (nts->stack) MEM_freeN(nts->stack); - BLI_freelistN(&ntree->threadstack[a]); - } - - MEM_freeN(ntree->threadstack); - ntree->threadstack= NULL; - } - - ntree->init &= ~NTREE_EXEC_INIT; - } -} - -/* nodes are presorted, so exec is in order of list */ -void ntreeExecTree(bNodeTree *ntree, void *callerdata, int thread) -{ - bNode *node; - bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */ - bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */ - bNodeStack *stack; - bNodeThreadStack *nts = NULL; - - /* only when initialized */ - if((ntree->init & NTREE_EXEC_INIT)==0) - ntreeBeginExecTree(ntree); - - /* composite does 1 node per thread, so no multiple stacks needed */ - if(ntree->type==NTREE_COMPOSIT) { - stack= ntree->stack; - } + bNodeTemplate ntemp; + if (node->typeinfo->templatefunc) + return node->typeinfo->templatefunc(node); else { - nts= ntreeGetThreadStack(ntree, thread); - stack= nts->stack; - } - - for(node= ntree->nodes.first; node; node= node->next) { - if(node->need_exec) { - if(node->typeinfo->execfunc) { - node_get_stack(node, stack, nsin, nsout, NULL); - node->typeinfo->execfunc(callerdata, node, nsin, nsout); - } - else if(node->type==NODE_GROUP && node->id) { - node_get_stack(node, stack, nsin, NULL, NULL); - node_group_execute(stack, callerdata, node, nsin); - } - } - } - - if(nts) - ntreeReleaseThreadStack(nts); -} - - -/* ***************************** threaded version for execute composite nodes ************* */ -/* these are nodes without input, only giving values */ -/* or nodes with only value inputs */ -static int node_only_value(bNode *node) -{ - bNodeSocket *sock; - - if(ELEM3(node->type, CMP_NODE_TIME, CMP_NODE_VALUE, CMP_NODE_RGB)) - return 1; - - /* doing this for all node types goes wrong. memory free errors */ - if(node->inputs.first && node->type==CMP_NODE_MAP_VALUE) { - int retval= 1; - for(sock= node->inputs.first; sock; sock= sock->next) { - if(sock->link && sock->link->fromnode) - retval &= node_only_value(sock->link->fromnode); - } - return retval; - } - return 0; -} - - -/* not changing info, for thread callback */ -typedef struct ThreadData { - bNodeStack *stack; - RenderData *rd; -} ThreadData; - -static void *exec_composite_node(void *node_v) -{ - bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */ - bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */ - bNode *node= node_v; - ThreadData *thd= (ThreadData *)node->threaddata; - - node_get_stack(node, thd->stack, nsin, nsout, NULL); - - if((node->flag & NODE_MUTED) && (!node_only_value(node))) { - /* viewers we execute, for feedback to user */ - if(ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) - node->typeinfo->execfunc(thd->rd, node, nsin, nsout); - else - node_compo_pass_on(node, nsin, nsout); - } - else if(node->typeinfo->execfunc) { - node->typeinfo->execfunc(thd->rd, node, nsin, nsout); - } - else if(node->type==NODE_GROUP && node->id) { - node_group_execute(thd->stack, thd->rd, node, nsin); - } - - node->exec |= NODE_READY; - return NULL; -} - -/* return total of executable nodes, for timecursor */ -/* only compositor uses it */ -static int setExecutableNodes(bNodeTree *ntree, ThreadData *thd) -{ - bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */ - bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */ - bNode *node; - bNodeSocket *sock; - int totnode= 0, group_edit= 0; - - /* note; do not add a dependency sort here, the stack was created already */ - - /* if we are in group edit, viewer nodes get skipped when group has viewer */ - for(node= ntree->nodes.first; node; node= node->next) - if(node->type==NODE_GROUP && (node->flag & NODE_GROUP_EDIT)) - if(ntreeHasType((bNodeTree *)node->id, CMP_NODE_VIEWER)) - group_edit= 1; - - for(node= ntree->nodes.first; node; node= node->next) { - int a; - - node_get_stack(node, thd->stack, nsin, nsout, NULL); - - /* test the outputs */ - /* skip value-only nodes (should be in type!) */ - if(!node_only_value(node)) { - for(a=0, sock= node->outputs.first; sock; sock= sock->next, a++) { - if(nsout[a]->data==NULL && nsout[a]->hasoutput) { - node->need_exec= 1; - break; - } - } - } - - /* test the inputs */ - for(a=0, sock= node->inputs.first; sock; sock= sock->next, a++) { - /* skip viewer nodes in bg render or group edit */ - if( ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER) && (G.background || group_edit)) - node->need_exec= 0; - /* is sock in use? */ - else if(sock->link) { - bNodeLink *link= sock->link; - - /* this is the test for a cyclic case */ - if(link->fromnode==NULL || link->tonode==NULL); - else if(link->fromnode->level >= link->tonode->level && link->tonode->level!=0xFFF) { - if(link->fromnode->need_exec) { - node->need_exec= 1; - break; - } - } - else { - node->need_exec= 0; - printf("Node %s skipped, cyclic dependency\n", node->name); - } - } - } - - if(node->need_exec) { - - /* free output buffers */ - for(a=0, sock= node->outputs.first; sock; sock= sock->next, a++) { - if(nsout[a]->data) { - free_compbuf(nsout[a]->data); - nsout[a]->data= NULL; - } - } - totnode++; - /* printf("node needs exec %s\n", node->name); */ - - /* tag for getExecutableNode() */ - node->exec= 0; - } - else { - /* tag for getExecutableNode() */ - node->exec= NODE_READY|NODE_FINISHED|NODE_SKIPPED; - - } - } - - /* last step: set the stack values for only-value nodes */ - /* just does all now, compared to a full buffer exec this is nothing */ - if(totnode) { - for(node= ntree->nodes.first; node; node= node->next) { - if(node->need_exec==0 && node_only_value(node)) { - if(node->typeinfo->execfunc) { - node_get_stack(node, thd->stack, nsin, nsout, NULL); - node->typeinfo->execfunc(thd->rd, node, nsin, nsout); - } - } - } - } - - return totnode; -} - -/* while executing tree, free buffers from nodes that are not needed anymore */ -static void freeExecutableNode(bNodeTree *ntree) -{ - /* node outputs can be freed when: - - not a render result or image node - - when node outputs go to nodes all being set NODE_FINISHED - */ - bNode *node; - bNodeSocket *sock; - - /* set exec flag for finished nodes that might need freed */ - for(node= ntree->nodes.first; node; node= node->next) { - if(node->type!=CMP_NODE_R_LAYERS) - if(node->exec & NODE_FINISHED) - node->exec |= NODE_FREEBUFS; - } - /* clear this flag for input links that are not done yet */ - for(node= ntree->nodes.first; node; node= node->next) { - if((node->exec & NODE_FINISHED)==0) { - for(sock= node->inputs.first; sock; sock= sock->next) - if(sock->link && sock->link->fromnode) - sock->link->fromnode->exec &= ~NODE_FREEBUFS; - } - } - /* now we can free buffers */ - for(node= ntree->nodes.first; node; node= node->next) { - if(node->exec & NODE_FREEBUFS) { - for(sock= node->outputs.first; sock; sock= sock->next) { - bNodeStack *ns= get_socket_stack(ntree->stack, sock, NULL); - if(ns && ns->data) { - free_compbuf(ns->data); - ns->data= NULL; - // printf("freed buf node %s \n", node->name); - } - } - } + ntemp.type = node->type; + return ntemp; } } -static bNode *getExecutableNode(bNodeTree *ntree) -{ - bNode *node; - bNodeSocket *sock; - - for(node= ntree->nodes.first; node; node= node->next) { - if(node->exec==0) { - - /* input sockets should be ready */ - for(sock= node->inputs.first; sock; sock= sock->next) { - if(sock->link && sock->link->fromnode) - if((sock->link->fromnode->exec & NODE_READY)==0) - break; - } - if(sock==NULL) - return node; - } - } - return NULL; -} - -/* check if texture nodes need exec or end */ -static void ntree_composite_texnode(bNodeTree *ntree, int init) -{ - bNode *node; - - for(node= ntree->nodes.first; node; node= node->next) { - if(node->type==CMP_NODE_TEXTURE && node->id) { - Tex *tex= (Tex *)node->id; - if(tex->nodetree && tex->use_nodes) { - /* has internal flag to detect it only does it once */ - if(init) - ntreeBeginExecTree(tex->nodetree); - else - ntreeEndExecTree(tex->nodetree); - } - } - } - -} - -/* optimized tree execute test for compositing */ -void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview) -{ - bNode *node; - ListBase threads; - ThreadData thdata; - int totnode, curnode, rendering= 1; - - if(ntree==NULL) return; - - if(do_preview) - ntreeInitPreview(ntree, 0, 0); - - ntreeBeginExecTree(ntree); - ntree_composite_texnode(ntree, 1); - - /* prevent unlucky accidents */ - if(G.background) - rd->scemode &= ~R_COMP_CROP; - - /* setup callerdata for thread callback */ - thdata.rd= rd; - thdata.stack= ntree->stack; - - /* fixed seed, for example noise texture */ - BLI_srandom(rd->cfra); - - /* sets need_exec tags in nodes */ - curnode = totnode= setExecutableNodes(ntree, &thdata); - - BLI_init_threads(&threads, exec_composite_node, rd->threads); - - while(rendering) { - - if(BLI_available_threads(&threads)) { - node= getExecutableNode(ntree); - if(node) { - if(ntree->progress && totnode) - ntree->progress(ntree->prh, (1.0f - curnode/(float)totnode)); - if(ntree->stats_draw) { - char str[64]; - sprintf(str, "Compositing %d %s", curnode, node->name); - ntree->stats_draw(ntree->sdh, str); - } - curnode--; - - node->threaddata = &thdata; - node->exec= NODE_PROCESSING; - BLI_insert_thread(&threads, node); - } - else - PIL_sleep_ms(50); - } - else - PIL_sleep_ms(50); - - rendering= 0; - /* test for ESC */ - if(ntree->test_break && ntree->test_break(ntree->tbh)) { - for(node= ntree->nodes.first; node; node= node->next) - node->exec |= NODE_READY; - } - - /* check for ready ones, and if we need to continue */ - for(node= ntree->nodes.first; node; node= node->next) { - if(node->exec & NODE_READY) { - if((node->exec & NODE_FINISHED)==0) { - BLI_remove_thread(&threads, node); /* this waits for running thread to finish btw */ - node->exec |= NODE_FINISHED; - - /* freeing unused buffers */ - if(rd->scemode & R_COMP_FREE) - freeExecutableNode(ntree); - } - } - else rendering= 1; - } - } - - BLI_end_threads(&threads); - - ntreeEndExecTree(ntree); -} - - -/* ********** copy composite tree entirely, to allow threaded exec ******************* */ -/* ***************** do NOT execute this in a thread! ****************** */ - -/* returns localized tree for execution in threads */ -/* local tree then owns all compbufs (for composite) */ -bNodeTree *ntreeLocalize(bNodeTree *ntree) -{ - bNodeTree *ltree; - bNode *node; - bNodeSocket *sock; - - bAction *action_backup= NULL, *tmpact_backup= NULL; - - /* Workaround for copying an action on each render! - * set action to NULL so animdata actions dont get copied */ - AnimData *adt= BKE_animdata_from_id(&ntree->id); - - if(adt) { - action_backup= adt->action; - tmpact_backup= adt->tmpact; - - adt->action= NULL; - adt->tmpact= NULL; - } - - /* node copy func */ - ltree= ntreeCopyTree(ntree); - - if(adt) { - AnimData *ladt= BKE_animdata_from_id(<ree->id); - - adt->action= ladt->action= action_backup; - adt->tmpact= ladt->tmpact= tmpact_backup; - - if(action_backup) action_backup->id.us++; - if(tmpact_backup) tmpact_backup->id.us++; - - } - /* end animdata uglyness */ - - /* ensures only a single output node is enabled */ - ntreeSetOutput(ltree); - - for(node= ntree->nodes.first; node; node= node->next) { - - /* store new_node pointer to original */ - node->new_node->new_node= node; - - if(ntree->type==NTREE_COMPOSIT) { - /* ensure new user input gets handled ok, only composites (texture nodes will break, for painting since it uses no tags) */ - node->need_exec= 0; - - /* move over the compbufs */ - /* right after ntreeCopyTree() oldsock pointers are valid */ - - if(ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) { - if(node->id) { - if(node->flag & NODE_DO_OUTPUT) - node->new_node->id= (ID *)copy_image((Image *)node->id); - else - node->new_node->id= NULL; - } - } - - for(sock= node->outputs.first; sock; sock= sock->next) { - - sock->new_sock->ns.data= sock->ns.data; - compbuf_set_node(sock->new_sock->ns.data, node->new_node); - - sock->ns.data= NULL; - sock->new_sock->new_sock= sock; - } - } - } - - return ltree; -} - -static int node_exists(bNodeTree *ntree, bNode *testnode) -{ - bNode *node= ntree->nodes.first; - for(; node; node= node->next) - if(node==testnode) - return 1; - return 0; -} - -static int outsocket_exists(bNode *node, bNodeSocket *testsock) -{ - bNodeSocket *sock= node->outputs.first; - for(; sock; sock= sock->next) - if(sock==testsock) - return 1; - return 0; -} - - -/* sync local composite with real tree */ -/* local composite is supposed to be running, be careful moving previews! */ -/* is called by jobs manager, outside threads, so it doesnt happen during draw */ -void ntreeLocalSync(bNodeTree *localtree, bNodeTree *ntree) -{ - bNode *lnode; - - if(ntree->type==NTREE_COMPOSIT) { - /* move over the compbufs and previews */ - for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) { - if( (lnode->exec & NODE_READY) && !(lnode->exec & NODE_SKIPPED) ) { - if(node_exists(ntree, lnode->new_node)) { - - if(lnode->preview && lnode->preview->rect) { - node_free_preview(lnode->new_node); - lnode->new_node->preview= lnode->preview; - lnode->preview= NULL; - } - } - } - } - } - else if(ELEM(ntree->type, NTREE_SHADER, NTREE_TEXTURE)) { - /* copy over contents of previews */ - for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) { - if(node_exists(ntree, lnode->new_node)) { - bNode *node= lnode->new_node; - - if(node->preview && node->preview->rect) { - if(lnode->preview && lnode->preview->rect) { - int xsize= node->preview->xsize; - int ysize= node->preview->ysize; - memcpy(node->preview->rect, lnode->preview->rect, 4*xsize + xsize*ysize*sizeof(char)*4); - } - } - } - } - } -} - -/* merge local tree results back, and free local tree */ -/* we have to assume the editor already changed completely */ -void ntreeLocalMerge(bNodeTree *localtree, bNodeTree *ntree) -{ - bNode *lnode; - bNodeSocket *lsock; - - /* move over the compbufs and previews */ - for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) { - if(node_exists(ntree, lnode->new_node)) { - - if(lnode->preview && lnode->preview->rect) { - node_free_preview(lnode->new_node); - lnode->new_node->preview= lnode->preview; - lnode->preview= NULL; - } - - if(ELEM(lnode->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) { - if(lnode->id && (lnode->flag & NODE_DO_OUTPUT)) { - /* image_merge does sanity check for pointers */ - BKE_image_merge((Image *)lnode->new_node->id, (Image *)lnode->id); - } - } - - for(lsock= lnode->outputs.first; lsock; lsock= lsock->next) { - if(outsocket_exists(lnode->new_node, lsock->new_sock)) { - lsock->new_sock->ns.data= lsock->ns.data; - compbuf_set_node(lsock->new_sock->ns.data, lnode->new_node); - lsock->ns.data= NULL; - lsock->new_sock= NULL; - } - } - } - } - ntreeFreeTree(localtree); - MEM_freeN(localtree); -} - -/* *********************************************** */ - -/* GPU material from shader nodes */ - -static void gpu_from_node_stack(ListBase *sockets, bNodeStack **ns, GPUNodeStack *gs) -{ - bNodeSocket *sock; - int i; - - for (sock=sockets->first, i=0; sock; sock=sock->next, i++) { - memset(&gs[i], 0, sizeof(gs[i])); - - QUATCOPY(gs[i].vec, ns[i]->vec); - gs[i].link= ns[i]->data; - - if (sock->type == SOCK_VALUE) - gs[i].type= GPU_FLOAT; - else if (sock->type == SOCK_VECTOR) - gs[i].type= GPU_VEC3; - else if (sock->type == SOCK_RGBA) - gs[i].type= GPU_VEC4; - else - gs[i].type= GPU_NONE; - - gs[i].name = ""; - gs[i].hasinput= ns[i]->hasinput && ns[i]->data; - gs[i].hasoutput= ns[i]->hasoutput && ns[i]->data; - gs[i].sockettype= ns[i]->sockettype; - } - - gs[i].type= GPU_NONE; -} - -static void data_from_gpu_stack(ListBase *sockets, bNodeStack **ns, GPUNodeStack *gs) -{ - bNodeSocket *sock; - int i; - - for (sock=sockets->first, i=0; sock; sock=sock->next, i++) { - ns[i]->data= gs[i].link; - ns[i]->sockettype= gs[i].sockettype; - } -} - -static void gpu_node_group_execute(bNodeStack *stack, GPUMaterial *mat, bNode *gnode, bNodeStack **in) -{ - bNode *node; - bNodeTree *ntree= (bNodeTree *)gnode->id; - bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */ - bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */ - GPUNodeStack gpuin[MAX_SOCKET+1], gpuout[MAX_SOCKET+1]; - int doit = 0; - - if(ntree==NULL) return; - - stack+= gnode->stack_index; - - for(node= ntree->nodes.first; node; node= node->next) { - if(node->typeinfo->gpufunc) { - node_get_stack(node, stack, nsin, nsout, in); - - doit = 0; - - /* for groups, only execute outputs for edited group */ - if(node->typeinfo->nclass==NODE_CLASS_OUTPUT) { - if(gnode->flag & NODE_GROUP_EDIT) - if(node->flag & NODE_DO_OUTPUT) - doit = 1; - } - else - doit = 1; - - if(doit) { - gpu_from_node_stack(&node->inputs, nsin, gpuin); - gpu_from_node_stack(&node->outputs, nsout, gpuout); - if(node->typeinfo->gpufunc(mat, node, gpuin, gpuout)) - data_from_gpu_stack(&node->outputs, nsout, gpuout); - } - } - } -} - -void ntreeGPUMaterialNodes(bNodeTree *ntree, GPUMaterial *mat) -{ - bNode *node; - bNodeStack *stack; - bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */ - bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */ - GPUNodeStack gpuin[MAX_SOCKET+1], gpuout[MAX_SOCKET+1]; - - if((ntree->init & NTREE_EXEC_INIT)==0) - ntreeBeginExecTree(ntree); - - stack= ntree->stack; - - for(node= ntree->nodes.first; node; node= node->next) { - if(node->typeinfo->gpufunc) { - node_get_stack(node, stack, nsin, nsout, NULL); - gpu_from_node_stack(&node->inputs, nsin, gpuin); - gpu_from_node_stack(&node->outputs, nsout, gpuout); - if(node->typeinfo->gpufunc(mat, node, gpuin, gpuout)) - data_from_gpu_stack(&node->outputs, nsout, gpuout); - } - else if(node->type==NODE_GROUP && node->id) { - node_get_stack(node, stack, nsin, nsout, NULL); - gpu_node_group_execute(stack, mat, node, nsin); - } - } - - ntreeEndExecTree(ntree); -} - -/* **************** call to switch lamploop for material node ************ */ - -void (*node_shader_lamp_loop)(struct ShadeInput *, struct ShadeResult *); - -void set_node_shader_lamp_loop(void (*lamp_loop_func)(ShadeInput *, ShadeResult *)) -{ - node_shader_lamp_loop= lamp_loop_func; -} - -/* clumsy checking... should do dynamic outputs once */ -static void force_hidden_passes(bNode *node, int passflag) -{ - bNodeSocket *sock; - - for(sock= node->outputs.first; sock; sock= sock->next) - sock->flag &= ~SOCK_UNAVAIL; - - sock= BLI_findlink(&node->outputs, RRES_OUT_Z); - if(!(passflag & SCE_PASS_Z)) sock->flag |= SOCK_UNAVAIL; - sock= BLI_findlink(&node->outputs, RRES_OUT_NORMAL); - if(!(passflag & SCE_PASS_NORMAL)) sock->flag |= SOCK_UNAVAIL; - sock= BLI_findlink(&node->outputs, RRES_OUT_VEC); - if(!(passflag & SCE_PASS_VECTOR)) sock->flag |= SOCK_UNAVAIL; - sock= BLI_findlink(&node->outputs, RRES_OUT_UV); - if(!(passflag & SCE_PASS_UV)) sock->flag |= SOCK_UNAVAIL; - sock= BLI_findlink(&node->outputs, RRES_OUT_RGBA); - if(!(passflag & SCE_PASS_RGBA)) sock->flag |= SOCK_UNAVAIL; - sock= BLI_findlink(&node->outputs, RRES_OUT_DIFF); - if(!(passflag & SCE_PASS_DIFFUSE)) sock->flag |= SOCK_UNAVAIL; - sock= BLI_findlink(&node->outputs, RRES_OUT_SPEC); - if(!(passflag & SCE_PASS_SPEC)) sock->flag |= SOCK_UNAVAIL; - sock= BLI_findlink(&node->outputs, RRES_OUT_SHADOW); - if(!(passflag & SCE_PASS_SHADOW)) sock->flag |= SOCK_UNAVAIL; - sock= BLI_findlink(&node->outputs, RRES_OUT_AO); - if(!(passflag & SCE_PASS_AO)) sock->flag |= SOCK_UNAVAIL; - sock= BLI_findlink(&node->outputs, RRES_OUT_REFLECT); - if(!(passflag & SCE_PASS_REFLECT)) sock->flag |= SOCK_UNAVAIL; - sock= BLI_findlink(&node->outputs, RRES_OUT_REFRACT); - if(!(passflag & SCE_PASS_REFRACT)) sock->flag |= SOCK_UNAVAIL; - sock= BLI_findlink(&node->outputs, RRES_OUT_INDIRECT); - if(!(passflag & SCE_PASS_INDIRECT)) sock->flag |= SOCK_UNAVAIL; - sock= BLI_findlink(&node->outputs, RRES_OUT_INDEXOB); - if(!(passflag & SCE_PASS_INDEXOB)) sock->flag |= SOCK_UNAVAIL; - sock= BLI_findlink(&node->outputs, RRES_OUT_INDEXMA); - if(!(passflag & SCE_PASS_INDEXMA)) sock->flag |= SOCK_UNAVAIL; - sock= BLI_findlink(&node->outputs, RRES_OUT_MIST); - if(!(passflag & SCE_PASS_MIST)) sock->flag |= SOCK_UNAVAIL; - sock= BLI_findlink(&node->outputs, RRES_OUT_EMIT); - if(!(passflag & SCE_PASS_EMIT)) sock->flag |= SOCK_UNAVAIL; - sock= BLI_findlink(&node->outputs, RRES_OUT_ENV); - if(!(passflag & SCE_PASS_ENVIRONMENT)) sock->flag |= SOCK_UNAVAIL; - -} - -/* based on rules, force sockets hidden always */ -void ntreeCompositForceHidden(bNodeTree *ntree, Scene *curscene) -{ - bNode *node; - - if(ntree==NULL) return; - - for(node= ntree->nodes.first; node; node= node->next) { - if( node->type==CMP_NODE_R_LAYERS) { - Scene *sce= node->id?(Scene *)node->id:curscene; - SceneRenderLayer *srl= BLI_findlink(&sce->r.layers, node->custom1); - if(srl) - force_hidden_passes(node, srl->passflag); - } - else if( node->type==CMP_NODE_IMAGE) { - Image *ima= (Image *)node->id; - if(ima) { - if(ima->rr) { - ImageUser *iuser= node->storage; - RenderLayer *rl= BLI_findlink(&ima->rr->layers, iuser->layer); - if(rl) - force_hidden_passes(node, rl->passflag); - else - force_hidden_passes(node, 0); - } - else if(ima->type!=IMA_TYPE_MULTILAYER) { /* if ->rr not yet read we keep inputs */ - force_hidden_passes(node, RRES_OUT_Z); - } - else - force_hidden_passes(node, 0); - } - else - force_hidden_passes(node, 0); - } - } - -} - -/* called from render pipeline, to tag render input and output */ -/* need to do all scenes, to prevent errors when you re-render 1 scene */ -void ntreeCompositTagRender(Scene *curscene) -{ - Scene *sce; - - for(sce= G.main->scene.first; sce; sce= sce->id.next) { - if(sce->nodetree) { - bNode *node; - - for(node= sce->nodetree->nodes.first; node; node= node->next) { - if(node->id==(ID *)curscene || node->type==CMP_NODE_COMPOSITE) - NodeTagChanged(sce->nodetree, node); - else if(node->type==CMP_NODE_TEXTURE) /* uses scene sizex/sizey */ - NodeTagChanged(sce->nodetree, node); - } - } - } -} - -static int node_animation_properties(bNodeTree *ntree, bNode *node) -{ - bNodeSocket *sock; - const ListBase *lb; - Link *link; - PointerRNA ptr; - PropertyRNA *prop; - - /* check to see if any of the node's properties have fcurves */ - RNA_pointer_create((ID *)ntree, &RNA_Node, node, &ptr); - lb = RNA_struct_type_properties(ptr.type); - - for (link=lb->first; link; link=link->next) { - int driven, len=1, index; - prop = (PropertyRNA *)link; - - if (RNA_property_array_check(prop)) - len = RNA_property_array_length(&ptr, prop); - - for (index=0; indexinputs.first; sock; sock=sock->next) { - int driven, len=1, index; - - RNA_pointer_create((ID *)ntree, &RNA_NodeSocket, sock, &ptr); - prop = RNA_struct_find_property(&ptr, "default_value"); - - if (RNA_property_array_check(prop)) - len = RNA_property_array_length(&ptr, prop); - - for (index=0; indexnodes.first; node; node= node->next) { - - tagged = node_animation_properties(ntree, node); - - /* otherwise always tag these node types */ - if(node->type==CMP_NODE_IMAGE) { - Image *ima= (Image *)node->id; - if(ima && ELEM(ima->source, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE)) { - NodeTagChanged(ntree, node); - tagged= 1; - } - } - else if(node->type==CMP_NODE_TIME) { - NodeTagChanged(ntree, node); - tagged= 1; - } - /* here was tag render layer, but this is called after a render, so re-composites fail */ - else if(node->type==NODE_GROUP) { - if( ntreeCompositTagAnimated((bNodeTree *)node->id) ) { - NodeTagChanged(ntree, node); - } - } - } - - return tagged; -} - - -/* called from image window preview */ -void ntreeCompositTagGenerators(bNodeTree *ntree) -{ - bNode *node; - - if(ntree==NULL) return; - - for(node= ntree->nodes.first; node; node= node->next) { - if( ELEM(node->type, CMP_NODE_R_LAYERS, CMP_NODE_IMAGE)) - NodeTagChanged(ntree, node); - } -} - -/* XXX after render animation system gets a refresh, this call allows composite to end clean */ -void ntreeClearTags(bNodeTree *ntree) -{ - bNode *node; - - if(ntree==NULL) return; - - for(node= ntree->nodes.first; node; node= node->next) { - node->need_exec= 0; - if(node->type==NODE_GROUP) - ntreeClearTags((bNodeTree *)node->id); - } -} - - -int ntreeTexTagAnimated(bNodeTree *ntree) -{ - bNode *node; - - if(ntree==NULL) return 0; - - for(node= ntree->nodes.first; node; node= node->next) { - if(node->type==TEX_NODE_CURVE_TIME) { - NodeTagChanged(ntree, node); - return 1; - } - else if(node->type==NODE_GROUP) { - if( ntreeTexTagAnimated((bNodeTree *)node->id) ) { - return 1; - } - } - } - - return 0; -} - -/* ************* node definition init ********** */ - -void node_type_base(bNodeType *ntype, int type, const char *name, short nclass, short flag, - struct bNodeSocketType *inputs, struct bNodeSocketType *outputs) +void node_type_base(bNodeType *ntype, int type, const char *name, short nclass, short flag) { memset(ntype, 0, sizeof(bNodeType)); ntype->type = type; - ntype->name = name; + BLI_strncpy(ntype->name, name, sizeof(ntype->name)); ntype->nclass = nclass; ntype->flag = flag; - ntype->inputs = inputs; - ntype->outputs = outputs; - /* default size values */ ntype->width = 140; ntype->minwidth = 100; ntype->maxwidth = 320; + ntype->height = 100; + ntype->minheight = 30; + ntype->maxheight = FLT_MAX; } -void node_type_init(bNodeType *ntype, void (*initfunc)(struct bNode *)) +void node_type_socket_templates(struct bNodeType *ntype, struct bNodeSocketTemplate *inputs, struct bNodeSocketTemplate *outputs) +{ + ntype->inputs = inputs; + ntype->outputs = outputs; +} + +void node_type_init(struct bNodeType *ntype, void (*initfunc)(struct bNodeTree *ntree, struct bNode *node, struct bNodeTemplate *ntemp)) { ntype->initfunc = initfunc; } +void node_type_valid(struct bNodeType *ntype, int (*validfunc)(struct bNodeTree *ntree, struct bNodeTemplate *ntemp)) +{ + ntype->validfunc = validfunc; +} + void node_type_size(struct bNodeType *ntype, int width, int minwidth, int maxwidth) { ntype->width = width; ntype->minwidth = minwidth; - ntype->maxwidth = maxwidth; + if (maxwidth <= minwidth) + ntype->maxwidth = FLT_MAX; + else + ntype->maxwidth = maxwidth; } void node_type_storage(bNodeType *ntype, const char *storagename, void (*freestoragefunc)(struct bNode *), void (*copystoragefunc)(struct bNode *, struct bNode *)) @@ -3403,47 +1675,92 @@ void node_type_storage(bNodeType *ntype, const char *storagename, void (*freesto ntype->freestoragefunc = freestoragefunc; } +void node_type_label(struct bNodeType *ntype, const char *(*labelfunc)(struct bNode *)) +{ + ntype->labelfunc = labelfunc; +} + +void node_type_template(struct bNodeType *ntype, struct bNodeTemplate (*templatefunc)(struct bNode *)) +{ + ntype->templatefunc = templatefunc; +} + +void node_type_update(struct bNodeType *ntype, + void (*updatefunc)(struct bNodeTree *ntree, struct bNode *node), + void (*verifyfunc)(struct bNodeTree *ntree, struct bNode *node, struct ID *id)) +{ + ntype->updatefunc = updatefunc; + ntype->verifyfunc = verifyfunc; +} + +void node_type_tree(struct bNodeType *ntype, void (*inittreefunc)(struct bNodeTree *), void (*updatetreefunc)(struct bNodeTree *)) +{ + ntype->inittreefunc = inittreefunc; + ntype->updatetreefunc = updatetreefunc; +} + +void node_type_group_edit(struct bNodeType *ntype, + struct bNodeTree *(*group_edit_get)(struct bNode *node), + struct bNodeTree *(*group_edit_set)(struct bNode *node, int edit), + void (*group_edit_clear)(struct bNode *node)) +{ + ntype->group_edit_get = group_edit_get; + ntype->group_edit_set = group_edit_set; + ntype->group_edit_clear = group_edit_clear; +} + void node_type_exec(struct bNodeType *ntype, void (*execfunc)(void *data, struct bNode *, struct bNodeStack **, struct bNodeStack **)) { ntype->execfunc = execfunc; } +void node_type_exec_new(struct bNodeType *ntype, + void *(*initexecfunc)(struct bNode *node), + void (*freeexecfunc)(struct bNode *node, void *nodedata), + void (*newexecfunc)(void *data, int thread, struct bNode *, void *nodedata, struct bNodeStack **, struct bNodeStack **)) +{ + ntype->initexecfunc = initexecfunc; + ntype->freeexecfunc = freeexecfunc; + ntype->newexecfunc = newexecfunc; +} + void node_type_gpu(struct bNodeType *ntype, int (*gpufunc)(struct GPUMaterial *mat, struct bNode *node, struct GPUNodeStack *in, struct GPUNodeStack *out)) { ntype->gpufunc = gpufunc; } -void node_type_label(struct bNodeType *ntype, const char *(*labelfunc)(struct bNode *)) +void node_type_gpu_ext(struct bNodeType *ntype, int (*gpuextfunc)(struct GPUMaterial *mat, struct bNode *node, void *nodedata, struct GPUNodeStack *in, struct GPUNodeStack *out)) { - ntype->labelfunc = labelfunc; + ntype->gpuextfunc = gpuextfunc; } -static bNodeType *is_nodetype_registered(ListBase *typelist, int type, ID *id) + +static bNodeType *is_nodetype_registered(ListBase *typelist, int type) { bNodeType *ntype= typelist->first; for(;ntype; ntype= ntype->next ) - if(ntype->type==type && ntype->id==id) + if(ntype->type==type) return ntype; return NULL; } -/* type can be from a static array, we make copy for duplicate types (like group) */ -void nodeRegisterType(ListBase *typelist, const bNodeType *ntype) +void nodeRegisterType(ListBase *typelist, bNodeType *ntype) { - bNodeType *found= is_nodetype_registered(typelist, ntype->type, ntype->id); + bNodeType *found= is_nodetype_registered(typelist, ntype->type); - if(found==NULL) { - bNodeType *ntypen= MEM_callocN(sizeof(bNodeType), "node type"); - *ntypen= *ntype; - BLI_addtail(typelist, ntypen); - } + if(found==NULL) + BLI_addtail(typelist, ntype); } static void registerCompositNodes(ListBase *ntypelist) { - register_node_type_group(ntypelist); + register_node_type_frame(ntypelist); + + register_node_type_cmp_group(ntypelist); +// register_node_type_cmp_forloop(ntypelist); +// register_node_type_cmp_whileloop(ntypelist); register_node_type_cmp_rlayers(ntypelist); register_node_type_cmp_image(ntypelist); @@ -3519,7 +1836,11 @@ static void registerCompositNodes(ListBase *ntypelist) static void registerShaderNodes(ListBase *ntypelist) { - register_node_type_group(ntypelist); + register_node_type_frame(ntypelist); + + register_node_type_sh_group(ntypelist); +// register_node_type_sh_forloop(ntypelist); +// register_node_type_sh_whileloop(ntypelist); register_node_type_sh_output(ntypelist); register_node_type_sh_mix_rgb(ntypelist); @@ -3548,7 +1869,11 @@ static void registerShaderNodes(ListBase *ntypelist) static void registerTextureNodes(ListBase *ntypelist) { - register_node_type_group(ntypelist); + register_node_type_frame(ntypelist); + + register_node_type_tex_group(ntypelist); +// register_node_type_tex_forloop(ntypelist); +// register_node_type_tex_whileloop(ntypelist); register_node_type_tex_math(ntypelist); register_node_type_tex_mix_rgb(ntypelist); @@ -3589,53 +1914,47 @@ static void registerTextureNodes(ListBase *ntypelist) register_node_type_tex_proc_distnoise(ntypelist); } -static void remove_dynamic_typeinfos(ListBase *list) +static void free_dynamic_typeinfo(bNodeType *ntype) { - bNodeType *ntype= list->first; - bNodeType *next= NULL; - while(ntype) { - next= ntype->next; - if(ntype->type==NODE_DYNAMIC && ntype->id!=NULL) { - BLI_remlink(list, ntype); - if(ntype->inputs) { - bNodeSocketType *sock= ntype->inputs; - while(sock->type!=-1) { - MEM_freeN((void *)sock->name); - sock++; - } - MEM_freeN(ntype->inputs); - } - if(ntype->outputs) { - bNodeSocketType *sock= ntype->outputs; - while(sock->type!=-1) { - MEM_freeN((void *)sock->name); - sock++; - } - MEM_freeN(ntype->outputs); - } - if(ntype->name) { - MEM_freeN((void *)ntype->name); - } - MEM_freeN(ntype); + if(ntype->type==NODE_DYNAMIC) { + if(ntype->inputs) { + MEM_freeN(ntype->inputs); } - ntype= next; + if(ntype->outputs) { + MEM_freeN(ntype->outputs); + } + if(ntype->name) { + MEM_freeN((void *)ntype->name); + } + } +} + +static void free_typeinfos(ListBase *list) +{ + bNodeType *ntype, *next; + for(ntype=list->first; ntype; ntype=next) { + next = ntype->next; + + if(ntype->type==NODE_DYNAMIC) + free_dynamic_typeinfo(ntype); + + if(ntype->needs_free) + MEM_freeN(ntype); } } void init_nodesystem(void) { - registerCompositNodes(&node_all_composit); - registerShaderNodes(&node_all_shaders); - registerTextureNodes(&node_all_textures); + registerCompositNodes(&ntreeGetType(NTREE_COMPOSIT)->node_types); + registerShaderNodes(&ntreeGetType(NTREE_SHADER)->node_types); + registerTextureNodes(&ntreeGetType(NTREE_TEXTURE)->node_types); } void free_nodesystem(void) { - /*remove_dynamic_typeinfos(&node_all_composit);*/ /* unused for now */ - BLI_freelistN(&node_all_composit); - remove_dynamic_typeinfos(&node_all_shaders); - BLI_freelistN(&node_all_shaders); - BLI_freelistN(&node_all_textures); + free_typeinfos(&ntreeGetType(NTREE_COMPOSIT)->node_types); + free_typeinfos(&ntreeGetType(NTREE_SHADER)->node_types); + free_typeinfos(&ntreeGetType(NTREE_TEXTURE)->node_types); } /* called from unlink_scene, when deleting a scene goes over all scenes diff --git a/source/blender/blenkernel/intern/texture.c b/source/blender/blenkernel/intern/texture.c index 493baebd197..6119a855366 100644 --- a/source/blender/blenkernel/intern/texture.c +++ b/source/blender/blenkernel/intern/texture.c @@ -766,7 +766,9 @@ Tex *copy_texture(Tex *tex) if(tex->preview) texn->preview = BKE_previewimg_copy(tex->preview); if(tex->nodetree) { - ntreeEndExecTree(tex->nodetree); + if (tex->nodetree->execdata) { + ntreeTexEndExecTree(tex->nodetree->execdata); + } texn->nodetree= ntreeCopyTree(tex->nodetree); } diff --git a/source/blender/blenlib/BLI_math_matrix.h b/source/blender/blenlib/BLI_math_matrix.h index d8719f399ae..18955c158c6 100644 --- a/source/blender/blenlib/BLI_math_matrix.h +++ b/source/blender/blenlib/BLI_math_matrix.h @@ -66,6 +66,9 @@ void swap_m4m4(float A[4][4], float B[4][4]); void add_m3_m3m3(float R[3][3], float A[3][3], float B[3][3]); void add_m4_m4m4(float R[4][4], float A[4][4], float B[4][4]); +void sub_m3_m3m3(float R[3][3], float A[3][3], float B[3][3]); +void sub_m4_m4m4(float R[4][4], float A[4][4], float B[4][4]); + void mul_m3_m3m3(float R[3][3], float A[3][3], float B[3][3]); void mul_m4_m4m4(float R[4][4], float A[4][4], float B[4][4]); void mul_m4_m3m4(float R[4][4], float A[3][3], float B[4][4]); diff --git a/source/blender/blenlib/BLI_math_vector.h b/source/blender/blenlib/BLI_math_vector.h index c8b598a1e85..d30168c8657 100644 --- a/source/blender/blenlib/BLI_math_vector.h +++ b/source/blender/blenlib/BLI_math_vector.h @@ -124,6 +124,7 @@ void interp_v3_v3v3v3(float p[3], const float v1[3], const float v2[3], const fl void interp_v3_v3v3v3v3(float p[3], const float v1[3], const float v2[3], const float v3[3], const float v4[3], const float w[4]); void interp_v4_v4v4(float r[4], const float a[4], const float b[4], const float t); void interp_v4_v4v4v4(float p[4], const float v1[4], const float v2[4], const float v3[4], const float w[3]); +void interp_v4_v4v4v4v4(float p[4], const float v1[4], const float v2[4], const float v3[4], const float v4[4], const float w[4]); void mid_v3_v3v3(float r[3], const float a[3], const float b[3]); diff --git a/source/blender/blenlib/intern/math_matrix.c b/source/blender/blenlib/intern/math_matrix.c index 3c79a77707a..e2f594376cb 100644 --- a/source/blender/blenlib/intern/math_matrix.c +++ b/source/blender/blenlib/intern/math_matrix.c @@ -451,6 +451,24 @@ void add_m4_m4m4(float m1[][4], float m2[][4], float m3[][4]) m1[i][j]= m2[i][j] + m3[i][j]; } +void sub_m3_m3m3(float m1[][3], float m2[][3], float m3[][3]) +{ + int i, j; + + for(i=0;i<3;i++) + for(j=0;j<3;j++) + m1[i][j]= m2[i][j] - m3[i][j]; +} + +void sub_m4_m4m4(float m1[][4], float m2[][4], float m3[][4]) +{ + int i, j; + + for(i=0;i<4;i++) + for(j=0;j<4;j++) + m1[i][j]= m2[i][j] - m3[i][j]; +} + int invert_m3(float m[3][3]) { float tmp[3][3]; diff --git a/source/blender/blenlib/intern/math_vector.c b/source/blender/blenlib/intern/math_vector.c index 15d671e38d7..7dbceff46e4 100644 --- a/source/blender/blenlib/intern/math_vector.c +++ b/source/blender/blenlib/intern/math_vector.c @@ -96,6 +96,14 @@ void interp_v4_v4v4v4(float p[4], const float v1[4], const float v2[4], const fl p[3] = v1[3]*w[0] + v2[3]*w[1] + v3[3]*w[2]; } +void interp_v4_v4v4v4v4(float p[4], const float v1[4], const float v2[4], const float v3[4], const float v4[4], const float w[4]) +{ + p[0] = v1[0]*w[0] + v2[0]*w[1] + v3[0]*w[2] + v4[0]*w[3]; + p[1] = v1[1]*w[0] + v2[1]*w[1] + v3[1]*w[2] + v4[1]*w[3]; + p[2] = v1[2]*w[0] + v2[2]*w[1] + v3[2]*w[2] + v4[2]*w[3]; + p[3] = v1[3]*w[0] + v2[3]*w[1] + v3[3]*w[2] + v4[3]*w[3]; +} + void mid_v3_v3v3(float v[3], const float v1[3], const float v2[3]) { v[0]= 0.5f*(v1[0] + v2[0]); diff --git a/source/blender/blenloader/CMakeLists.txt b/source/blender/blenloader/CMakeLists.txt index 4088481c844..ab00a8e90dd 100644 --- a/source/blender/blenloader/CMakeLists.txt +++ b/source/blender/blenloader/CMakeLists.txt @@ -30,6 +30,7 @@ set(INC ../blenlib ../makesdna ../makesrna + ../nodes ../render/extern/include ../../../intern/guardedalloc ) diff --git a/source/blender/blenloader/SConscript b/source/blender/blenloader/SConscript index be9908d84e6..d5d2df3ea35 100644 --- a/source/blender/blenloader/SConscript +++ b/source/blender/blenloader/SConscript @@ -5,7 +5,7 @@ sources = env.Glob('intern/*.c') incs = '. #/intern/guardedalloc ../blenlib ../blenkernel' incs += ' ../makesdna ../editors/include' -incs += ' ../render/extern/include ../makesrna' +incs += ' ../render/extern/include ../makesrna ../nodes' incs += ' ' + env['BF_ZLIB_INC'] diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 363e98d7a4b..355fc14705a 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -134,6 +134,8 @@ #include "BKE_utildefines.h" // SWITCH_INT DATA ENDB DNA1 O_BINARY GLOB USER TEST REND #include "BKE_sound.h" +#include "NOD_socket.h" + //XXX #include "BIF_butspace.h" // badlevel, for do_versions, patching event codes //XXX #include "BIF_filelist.h" // badlevel too, where to move this? - elubie //XXX #include "BIF_previewrender.h" // bedlelvel, for struct RenderInfo @@ -2052,10 +2054,21 @@ static void lib_link_nodetree(FileData *fd, Main *main) } } +static void lib_nodetree_init_types_cb(void *UNUSED(data), ID *UNUSED(id), bNodeTree *ntree) +{ + bNode *node; + + ntreeInitTypes(ntree); + + /* XXX could be replaced by do_versions for new nodes */ + for (node=ntree->nodes.first; node; node=node->next) + node_verify_socket_templates(ntree, node); +} + /* updates group node socket own_index so that * external links to/from the group node are preserved. */ -static void lib_node_do_versions_group(bNode *gnode) +static void lib_node_do_versions_group_indices(bNode *gnode) { bNodeTree *ngroup= (bNodeTree*)gnode->id; bNode *intnode; @@ -2088,92 +2101,101 @@ static void lib_node_do_versions_group(bNode *gnode) } /* updates external links for all group nodes in a tree */ -static void lib_nodetree_do_versions_group(bNodeTree *ntree) +static void lib_nodetree_do_versions_group_indices_cb(void *UNUSED(data), ID *UNUSED(id), bNodeTree *ntree) { bNode *node; for (node=ntree->nodes.first; node; node=node->next) { if (node->type==NODE_GROUP) { bNodeTree *ngroup= (bNodeTree*)node->id; - if (ngroup && (ngroup->flag & NTREE_DO_VERSIONS)) - lib_node_do_versions_group(node); + if (ngroup && (ngroup->flag & NTREE_DO_VERSIONS_GROUP_EXPOSE)) + lib_node_do_versions_group_indices(node); } } } +/* make an update call for the tree */ +static void lib_nodetree_do_versions_update_cb(void *UNUSED(data), ID *UNUSED(id), bNodeTree *ntree) +{ + if (ntree->update) + ntreeUpdateTree(ntree); +} + /* verify types for nodes and groups, all data has to be read */ /* open = 0: appending/linking, open = 1: open new file (need to clean out dynamic * typedefs*/ static void lib_verify_nodetree(Main *main, int UNUSED(open)) { - Scene *sce; - Material *ma; - Tex *tx; bNodeTree *ntree; - + int i; + bNodeTreeType *ntreetype; + /* this crashes blender on undo/redo if(open==1) { reinit_nodesystem(); }*/ - /* now create the own typeinfo structs an verify nodes */ - /* here we still assume no groups in groups */ - for(ntree= main->nodetree.first; ntree; ntree= ntree->id.next) { - ntreeVerifyTypes(ntree); /* internal nodes, no groups! */ + /* set node->typeinfo pointers */ + for (i=0; i < NUM_NTREE_TYPES; ++i) { + ntreetype= ntreeGetType(i); + if (ntreetype && ntreetype->foreach_nodetree) + ntreetype->foreach_nodetree(main, NULL, lib_nodetree_init_types_cb); } + for(ntree= main->nodetree.first; ntree; ntree= ntree->id.next) + ntreeInitTypes(ntree); { - /*int has_old_groups=0;*/ /*UNUSED*/ + int has_old_groups=0; /* XXX this should actually be part of do_versions, but since we need * finished library linking, it is not possible there. Instead in do_versions * we have set the NTREE_DO_VERSIONS flag, so at this point we can do the * actual group node updates. */ for(ntree= main->nodetree.first; ntree; ntree= ntree->id.next) { - if (ntree->flag & NTREE_DO_VERSIONS) { + if (ntree->flag & NTREE_DO_VERSIONS_GROUP_EXPOSE) { /* this adds copies and links from all unlinked internal sockets to group inputs/outputs. */ - nodeGroupExposeAllSockets(ntree); - /*has_old_groups = 1;*/ /*UNUSED*/ + node_group_expose_all_sockets(ntree); + has_old_groups = 1; } } - /* now verify all types in material trees, groups are set OK now */ - for(ma= main->mat.first; ma; ma= ma->id.next) { - if(ma->nodetree) - lib_nodetree_do_versions_group(ma->nodetree); - } - /* and scene trees */ - for(sce= main->scene.first; sce; sce= sce->id.next) { - if(sce->nodetree) - lib_nodetree_do_versions_group(sce->nodetree); - } - /* and texture trees */ - for(tx= main->tex.first; tx; tx= tx->id.next) { - if(tx->nodetree) - lib_nodetree_do_versions_group(tx->nodetree); + + if (has_old_groups) { + for (i=0; i < NUM_NTREE_TYPES; ++i) { + ntreetype= ntreeGetType(i); + if (ntreetype && ntreetype->foreach_nodetree) + ntreetype->foreach_nodetree(main, NULL, lib_nodetree_do_versions_group_indices_cb); + } } for(ntree= main->nodetree.first; ntree; ntree= ntree->id.next) - ntree->flag &= ~NTREE_DO_VERSIONS; + ntree->flag &= ~NTREE_DO_VERSIONS_GROUP_EXPOSE; } - - /* now verify all types in material trees, groups are set OK now */ - for(ma= main->mat.first; ma; ma= ma->id.next) { - if(ma->nodetree) - ntreeVerifyTypes(ma->nodetree); + + /* verify all group user nodes */ + for(ntree= main->nodetree.first; ntree; ntree= ntree->id.next) { + ntreeVerifyNodes(main, &ntree->id); } - /* and scene trees */ - for(sce= main->scene.first; sce; sce= sce->id.next) { - if(sce->nodetree) - ntreeVerifyTypes(sce->nodetree); - } - /* and texture trees */ - for(tx= main->tex.first; tx; tx= tx->id.next) { - if(tx->nodetree) - ntreeVerifyTypes(tx->nodetree); + + /* make update calls where necessary */ + { + for(ntree= main->nodetree.first; ntree; ntree= ntree->id.next) + if (ntree->update) + ntreeUpdateTree(ntree); + for (i=0; i < NUM_NTREE_TYPES; ++i) { + ntreetype= ntreeGetType(i); + if (ntreetype && ntreetype->foreach_nodetree) + ntreetype->foreach_nodetree(main, NULL, lib_nodetree_do_versions_update_cb); + } } } - +static void direct_link_node_socket(FileData *fd, bNodeSocket *sock) +{ + sock->link= newdataadr(fd, sock->link); + sock->storage= newdataadr(fd, sock->storage); + sock->default_value= newdataadr(fd, sock->default_value); + sock->cache= NULL; +} /* ntree itself has been read! */ static void direct_link_nodetree(FileData *fd, bNodeTree *ntree) @@ -2185,6 +2207,7 @@ static void direct_link_nodetree(FileData *fd, bNodeTree *ntree) ntree->init= 0; /* to set callbacks and force setting types */ ntree->progress= NULL; + ntree->execdata= NULL; ntree->adt= newdataadr(fd, ntree->adt); direct_link_animdata(fd, ntree->adt); @@ -2197,9 +2220,11 @@ static void direct_link_nodetree(FileData *fd, bNodeTree *ntree) node->typeinfo= NULL; } + link_list(fd, &node->inputs); + link_list(fd, &node->outputs); + node->storage= newdataadr(fd, node->storage); if(node->storage) { - /* could be handlerized at some point */ if(ntree->type==NTREE_SHADER && (node->type==SH_NODE_CURVE_VEC || node->type==SH_NODE_CURVE_RGB)) direct_link_curvemapping(fd, node->storage); @@ -2216,8 +2241,6 @@ static void direct_link_nodetree(FileData *fd, bNodeTree *ntree) ((ImageUser *)node->storage)->ok= 1; } } - link_list(fd, &node->inputs); - link_list(fd, &node->outputs); } link_list(fd, &ntree->links); @@ -2227,15 +2250,19 @@ static void direct_link_nodetree(FileData *fd, bNodeTree *ntree) /* and we connect the rest */ for(node= ntree->nodes.first; node; node= node->next) { + node->parent = newdataadr(fd, node->parent); node->preview= newimaadr(fd, node->preview); node->lasty= 0; + for(sock= node->inputs.first; sock; sock= sock->next) - sock->link= newdataadr(fd, sock->link); + direct_link_node_socket(fd, sock); for(sock= node->outputs.first; sock; sock= sock->next) - sock->ns.data= NULL; + direct_link_node_socket(fd, sock); } + for(sock= ntree->inputs.first; sock; sock= sock->next) + direct_link_node_socket(fd, sock); for(sock= ntree->outputs.first; sock; sock= sock->next) - sock->link= newdataadr(fd, sock->link); + direct_link_node_socket(fd, sock); for(link= ntree->links.first; link; link= link->next) { link->fromnode= newdataadr(fd, link->fromnode); @@ -4957,15 +4984,22 @@ static void lib_link_screen(FileData *fd, Main *main) SpaceNode *snode= (SpaceNode *)sl; snode->id= newlibadr(fd, sc->id.lib, snode->id); + snode->edittree= NULL; - /* internal data, a bit patchy */ - if(snode->id) { - if(GS(snode->id->name)==ID_MA) - snode->nodetree= ((Material *)snode->id)->nodetree; - else if(GS(snode->id->name)==ID_SCE) - snode->nodetree= ((Scene *)snode->id)->nodetree; - else if(GS(snode->id->name)==ID_TE) - snode->nodetree= ((Tex *)snode->id)->nodetree; + if (ELEM3(snode->treetype, NTREE_COMPOSIT, NTREE_SHADER, NTREE_TEXTURE)) { + /* internal data, a bit patchy */ + snode->nodetree= NULL; + if(snode->id) { + if(GS(snode->id->name)==ID_MA) + snode->nodetree= ((Material *)snode->id)->nodetree; + else if(GS(snode->id->name)==ID_SCE) + snode->nodetree= ((Scene *)snode->id)->nodetree; + else if(GS(snode->id->name)==ID_TE) + snode->nodetree= ((Tex *)snode->id)->nodetree; + } + } + else { + snode->nodetree= newlibadr_us(fd, sc->id.lib, snode->nodetree); } snode->linkdrag.first = snode->linkdrag.last = NULL; @@ -5185,15 +5219,19 @@ void lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *curscene) snode->id= restore_pointer_by_name(newmain, snode->id, 1); snode->edittree= NULL; - if(snode->id==NULL) + if (ELEM3(snode->treetype, NTREE_COMPOSIT, NTREE_SHADER, NTREE_TEXTURE)) { snode->nodetree= NULL; + if(snode->id) { + if(GS(snode->id->name)==ID_MA) + snode->nodetree= ((Material *)snode->id)->nodetree; + else if(GS(snode->id->name)==ID_SCE) + snode->nodetree= ((Scene *)snode->id)->nodetree; + else if(GS(snode->id->name)==ID_TE) + snode->nodetree= ((Tex *)snode->id)->nodetree; + } + } else { - if(GS(snode->id->name)==ID_MA) - snode->nodetree= ((Material *)snode->id)->nodetree; - else if(GS(snode->id->name)==ID_SCE) - snode->nodetree= ((Scene *)snode->id)->nodetree; - else if(GS(snode->id->name)==ID_TE) - snode->nodetree= ((Tex *)snode->id)->nodetree; + snode->nodetree= restore_pointer_by_name(newmain, &snode->nodetree->id, 1); } } } @@ -5422,7 +5460,6 @@ static void direct_link_screen(FileData *fd, bScreen *sc) snode->gpd= newdataadr(fd, snode->gpd); direct_link_gpencil(fd, snode->gpd); } - snode->nodetree= snode->edittree= NULL; } else if(sl->spacetype==SPACE_TIME) { SpaceTime *stime= (SpaceTime *)sl; @@ -6931,6 +6968,53 @@ static void do_version_bone_roll_256(Bone *bone) do_version_bone_roll_256(child); } +static void do_versions_socket_default_value(bNodeSocket *sock) +{ + bNodeSocketValueFloat *valfloat; + bNodeSocketValueVector *valvector; + bNodeSocketValueRGBA *valrgba; + + if (sock->default_value) + return; + + switch (sock->type) { + case SOCK_FLOAT: + valfloat = sock->default_value = MEM_callocN(sizeof(bNodeSocketValueFloat), "default socket value"); + valfloat->value = sock->ns.vec[0]; + valfloat->min = sock->ns.min; + valfloat->max = sock->ns.max; + valfloat->subtype = PROP_NONE; + break; + case SOCK_VECTOR: + valvector = sock->default_value = MEM_callocN(sizeof(bNodeSocketValueVector), "default socket value"); + copy_v3_v3(valvector->value, sock->ns.vec); + valvector->min = sock->ns.min; + valvector->max = sock->ns.max; + valvector->subtype = PROP_NONE; + break; + case SOCK_RGBA: + valrgba = sock->default_value = MEM_callocN(sizeof(bNodeSocketValueRGBA), "default socket value"); + copy_v4_v4(valrgba->value, sock->ns.vec); + break; + } +} + +static void do_versions_nodetree_default_value(bNodeTree *ntree) +{ + bNode *node; + bNodeSocket *sock; + for (node=ntree->nodes.first; node; node=node->next) { + for (sock=node->inputs.first; sock; sock=sock->next) + do_versions_socket_default_value(sock); + for (sock=node->outputs.first; sock; sock=sock->next) + do_versions_socket_default_value(sock); + } + for (sock=ntree->inputs.first; sock; sock=sock->next) + do_versions_socket_default_value(sock); + for (sock=ntree->outputs.first; sock; sock=sock->next) + do_versions_socket_default_value(sock); +} + static void do_versions(FileData *fd, Library *lib, Main *main) { /* WATCH IT!!!: pointers from libdata have not been converted */ @@ -11582,7 +11666,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main) * is done in lib_verify_nodetree, because at this point the internal * nodes may not be up-to-date! (missing lib-link) */ - ntree->flag |= NTREE_DO_VERSIONS; + ntree->flag |= NTREE_DO_VERSIONS_GROUP_EXPOSE; } } @@ -11707,10 +11791,10 @@ static void do_versions(FileData *fd, Library *lib, Main *main) if(tex->pd) { if (tex->pd->falloff_speed_scale == 0.0f) tex->pd->falloff_speed_scale = 100.0f; - + if (!tex->pd->falloff_curve) { tex->pd->falloff_curve = curvemapping_add(1, 0, 0, 1, 1); - + tex->pd->falloff_curve->preset = CURVE_PRESET_LINE; tex->pd->falloff_curve->cm->flag &= ~CUMA_EXTEND_EXTRAPOLATE; curvemap_reset(tex->pd->falloff_curve->cm, &tex->pd->falloff_curve->clipr, tex->pd->falloff_curve->preset, CURVEMAP_SLOPE_POSITIVE); @@ -11861,6 +11945,35 @@ static void do_versions(FileData *fd, Library *lib, Main *main) } } + if (main->versionfile < 259 || (main->versionfile == 259 && main->subversionfile < 2)){ + { + /* Convert default socket values from bNodeStack */ + Scene *sce; + Material *mat; + Tex *tex; + bNodeTree *ntree; + for (ntree=main->nodetree.first; ntree; ntree=ntree->id.next) { + do_versions_nodetree_default_value(ntree); + ntree->update |= NTREE_UPDATE; + } + for (sce=main->scene.first; sce; sce=sce->id.next) + if (sce->nodetree) { + do_versions_nodetree_default_value(sce->nodetree); + sce->nodetree->update |= NTREE_UPDATE; + } + for (mat=main->mat.first; mat; mat=mat->id.next) + if (mat->nodetree) { + do_versions_nodetree_default_value(mat->nodetree); + mat->nodetree->update |= NTREE_UPDATE; + } + for (tex=main->tex.first; tex; tex=tex->id.next) + if (tex->nodetree) { + do_versions_nodetree_default_value(tex->nodetree); + tex->nodetree->update |= NTREE_UPDATE; + } + } + } + /* put compatibility code here until next subversion bump */ { diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index 406a9bdc02e..b982630ec41 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -642,6 +642,14 @@ static void write_curvemapping(WriteData *wd, CurveMapping *cumap) writestruct(wd, DATA, "CurveMapPoint", cumap->cm[a].totpoint, cumap->cm[a].curve); } +static void write_node_socket(WriteData *wd, bNodeSocket *sock) +{ + bNodeSocketType *stype= ntreeGetSocketType(sock->type); + writestruct(wd, DATA, "bNodeSocket", 1, sock); + if (sock->default_value) + writestruct(wd, DATA, stype->value_structname, 1, sock->default_value); +} + /* this is only direct data, tree itself should have been written */ static void write_nodetree(WriteData *wd, bNodeTree *ntree) { @@ -657,6 +665,12 @@ static void write_nodetree(WriteData *wd, bNodeTree *ntree) writestruct(wd, DATA, "bNode", 1, node); for(node= ntree->nodes.first; node; node= node->next) { + for(sock= node->inputs.first; sock; sock= sock->next) + write_node_socket(wd, sock); + for(sock= node->outputs.first; sock; sock= sock->next) + write_node_socket(wd, sock); + + if(node->storage && node->type!=NODE_DYNAMIC) { /* could be handlerized at some point, now only 1 exception still */ if(ntree->type==NTREE_SHADER && (node->type==SH_NODE_CURVE_VEC || node->type==SH_NODE_CURVE_RGB)) @@ -665,13 +679,9 @@ static void write_nodetree(WriteData *wd, bNodeTree *ntree) write_curvemapping(wd, node->storage); else if(ntree->type==NTREE_TEXTURE && (node->type==TEX_NODE_CURVE_RGB || node->type==TEX_NODE_CURVE_TIME) ) write_curvemapping(wd, node->storage); - else + else writestruct(wd, DATA, node->typeinfo->storagename, 1, node->storage); } - for(sock= node->inputs.first; sock; sock= sock->next) - writestruct(wd, DATA, "bNodeSocket", 1, sock); - for(sock= node->outputs.first; sock; sock= sock->next) - writestruct(wd, DATA, "bNodeSocket", 1, sock); } for(link= ntree->links.first; link; link= link->next) @@ -679,9 +689,9 @@ static void write_nodetree(WriteData *wd, bNodeTree *ntree) /* external sockets */ for(sock= ntree->inputs.first; sock; sock= sock->next) - writestruct(wd, DATA, "bNodeSocket", 1, sock); + write_node_socket(wd, sock); for(sock= ntree->outputs.first; sock; sock= sock->next) - writestruct(wd, DATA, "bNodeSocket", 1, sock); + write_node_socket(wd, sock); } static void current_screen_compat(Main *mainvar, bScreen **screen) @@ -933,7 +943,7 @@ static void write_particlesystems(WriteData *wd, ListBase *particles) writestruct(wd, DATA, "ClothSimSettings", 1, psys->clmd->sim_parms); writestruct(wd, DATA, "ClothCollSettings", 1, psys->clmd->coll_parms); } - + write_pointcaches(wd, &psys->ptcaches); } } diff --git a/source/blender/editors/include/ED_node.h b/source/blender/editors/include/ED_node.h index cc4dd6330fb..1cbf45960d3 100644 --- a/source/blender/editors/include/ED_node.h +++ b/source/blender/editors/include/ED_node.h @@ -39,6 +39,7 @@ struct Material; struct Scene; struct Tex; struct bContext; +struct bNodeTree; struct bNode; struct bNodeTree; struct ScrArea; @@ -47,6 +48,7 @@ struct ScrArea; void ED_init_node_butfuncs(void); /* node_draw.c */ +void ED_node_tree_update(struct SpaceNode *snode, struct Scene *scene); void ED_node_changed_update(struct ID *id, struct bNode *node); void ED_node_generic_update(struct Main *bmain, struct bNodeTree *ntree, struct bNode *node); @@ -57,8 +59,9 @@ void ED_node_texture_default(struct Tex *tex); void ED_node_link_intersect_test(struct ScrArea *sa, int test); void ED_node_link_insert(struct ScrArea *sa); -void ED_node_set_active(struct Main *bmain, struct bNodeTree *ntree, struct bNode *node); +void ED_node_update_hierarchy(struct bContext *C, struct bNodeTree *ntree); +void ED_node_set_active(struct Main *bmain, struct bNodeTree *ntree, struct bNode *node); /* node ops.c */ void ED_operatormacros_node(void); diff --git a/source/blender/editors/sculpt_paint/paint_image.c b/source/blender/editors/sculpt_paint/paint_image.c index d69c1d9c447..9539706468f 100644 --- a/source/blender/editors/sculpt_paint/paint_image.c +++ b/source/blender/editors/sculpt_paint/paint_image.c @@ -60,6 +60,7 @@ #include "DNA_brush_types.h" #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" +#include "DNA_node_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_texture_types.h" @@ -4663,7 +4664,7 @@ static void paint_brush_init_tex(Brush *brush) if(brush) { MTex *mtex= &brush->mtex; if(mtex->tex && mtex->tex->nodetree) - ntreeBeginExecTree(mtex->tex->nodetree); /* has internal flag to detect it only does it once */ + ntreeTexBeginExecTree(mtex->tex->nodetree); /* has internal flag to detect it only does it once */ } } @@ -4805,7 +4806,7 @@ static void paint_brush_exit_tex(Brush *brush) if(brush) { MTex *mtex= &brush->mtex; if(mtex->tex && mtex->tex->nodetree) - ntreeEndExecTree(mtex->tex->nodetree); + ntreeTexEndExecTree(mtex->tex->nodetree->execdata); } } diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c index 2ee49f71a78..bf34a3b8c9f 100644 --- a/source/blender/editors/sculpt_paint/sculpt.c +++ b/source/blender/editors/sculpt_paint/sculpt.c @@ -48,6 +48,7 @@ #include "BLI_rand.h" #include "DNA_meshdata_types.h" +#include "DNA_node_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_brush_types.h" @@ -3273,7 +3274,7 @@ static void sculpt_brush_init_tex(Sculpt *sd, SculptSession *ss) /* init mtex nodes */ if(mtex->tex && mtex->tex->nodetree) - ntreeBeginExecTree(mtex->tex->nodetree); /* has internal flag to detect it only does it once */ + ntreeTexBeginExecTree(mtex->tex->nodetree); /* has internal flag to detect it only does it once */ /* TODO: Shouldn't really have to do this at the start of every stroke, but sculpt would need some sort of notification when @@ -3454,7 +3455,7 @@ static void sculpt_brush_exit_tex(Sculpt *sd) MTex *mtex= &brush->mtex; if(mtex->tex && mtex->tex->nodetree) - ntreeEndExecTree(mtex->tex->nodetree); + ntreeTexEndExecTree(mtex->tex->nodetree->execdata); } static void sculpt_stroke_done(bContext *C, struct PaintStroke *UNUSED(stroke)) diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index 0474d1f3bb1..890b04dce91 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -53,9 +53,10 @@ #include "BKE_image.h" #include "BKE_library.h" #include "BKE_main.h" +#include "BKE_node.h" -#include "CMP_node.h" -#include "SHD_node.h" +#include "NOD_composite.h" +#include "NOD_shader.h" #include "BIF_gl.h" #include "BIF_glutil.h" @@ -81,6 +82,141 @@ #include "node_intern.h" +// XXX interface.h +extern void ui_dropshadow(rctf *rct, float radius, float aspect, int select); + +/* ****************** SOCKET BUTTON DRAW FUNCTIONS ***************** */ + +static void node_sync_cb(bContext *UNUSED(C), void *snode_v, void *node_v) +{ + SpaceNode *snode= snode_v; + + if(snode->treetype==NTREE_SHADER) { + nodeShaderSynchronizeID(node_v, 1); + // allqueue(REDRAWBUTSSHADING, 0); + } +} + +void node_socket_button_default(const bContext *C, uiBlock *block, + bNodeTree *ntree, bNode *node, bNodeSocket *sock, + const char *name, int x, int y, int width) +{ + PointerRNA ptr; + uiBut *bt; + + RNA_pointer_create(&ntree->id, &RNA_NodeSocket, sock, &ptr); + + bt = uiDefButR(block, NUM, B_NODE_EXEC, name, + x, y+1, width, NODE_DY-2, + &ptr, "default_value", 0, 0, 0, -1, -1, NULL); + if (node) + uiButSetFunc(bt, node_sync_cb, CTX_wm_space_node(C), node); +} + +typedef struct SocketComponentMenuArgs { + PointerRNA ptr; + int x, y, width; + uiButHandleFunc cb; + void *arg1, *arg2; +} SocketComponentMenuArgs; +/* NOTE: this is a block-menu, needs 0 events, otherwise the menu closes */ +static uiBlock *socket_component_menu(bContext *C, ARegion *ar, void *args_v) +{ + SocketComponentMenuArgs *args= (SocketComponentMenuArgs*)args_v; + uiBlock *block; + uiLayout *layout; + + block= uiBeginBlock(C, ar, "socket menu", UI_EMBOSS); + uiBlockSetFlag(block, UI_BLOCK_KEEP_OPEN); + + layout= uiLayoutColumn(uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, args->x, args->y+2, args->width, NODE_DY, U.uistyles.first), 0); + + uiItemR(layout, &args->ptr, "default_value", UI_ITEM_R_EXPAND, "", ICON_NONE); + + return block; +} +void node_socket_button_components(const bContext *C, uiBlock *block, + bNodeTree *ntree, bNode *node, bNodeSocket *sock, + const char *name, int x, int y, int width) +{ + PointerRNA ptr; + SocketComponentMenuArgs *args; + + RNA_pointer_create(&ntree->id, &RNA_NodeSocket, sock, &ptr); + + args= MEM_callocN(sizeof(SocketComponentMenuArgs), "SocketComponentMenuArgs"); + + args->ptr = ptr; + args->x = x; + args->y = y; + args->width = width; + args->cb = node_sync_cb; + args->arg1 = CTX_wm_space_node(C); + args->arg2 = node; + + uiDefBlockButN(block, socket_component_menu, args, name, x, y+1, width, NODE_DY-2, ""); +} + +void node_socket_button_color(const bContext *C, uiBlock *block, + bNodeTree *ntree, bNode *node, bNodeSocket *sock, + const char *name, int x, int y, int width) +{ + PointerRNA ptr; + uiBut *bt; + int labelw= width - 40; + + RNA_pointer_create(&ntree->id, &RNA_NodeSocket, sock, &ptr); + + bt=uiDefButR(block, COL, B_NODE_EXEC, "", + x, y+2, (labelw>0 ? 40 : width), NODE_DY-2, + &ptr, "default_value", 0, 0, 0, -1, -1, NULL); + if (node) + uiButSetFunc(bt, node_sync_cb, CTX_wm_space_node(C), node); + + if (name[0]!='\0' && labelw>0) + uiDefBut(block, LABEL, 0, name, x + 40, y+2, labelw, NODE_DY-2, NULL, 0, 0, 0, 0, ""); +} + +/* ****************** BASE DRAW FUNCTIONS FOR NEW OPERATOR NODES ***************** */ + +void node_draw_socket_new(bNodeSocket *sock, float size) +{ + float x=sock->locx, y=sock->locy; + + /* 16 values of sin function */ + static float si[16] = { + 0.00000000f, 0.39435585f,0.72479278f,0.93775213f, + 0.99871650f,0.89780453f,0.65137248f,0.29936312f, + -0.10116832f,-0.48530196f,-0.79077573f,-0.96807711f, + -0.98846832f,-0.84864425f,-0.57126821f,-0.20129852f + }; + /* 16 values of cos function */ + static float co[16] ={ + 1.00000000f,0.91895781f,0.68896691f,0.34730525f, + -0.05064916f,-0.44039415f,-0.75875812f,-0.95413925f, + -0.99486932f,-0.87434661f,-0.61210598f,-0.25065253f, + 0.15142777f,0.52896401f,0.82076344f,0.97952994f, + }; + int a; + + glColor3ub(180, 180, 180); + + glBegin(GL_POLYGON); + for(a=0; a<16; a++) + glVertex2f(x+size*si[a], y+size*co[a]); + glEnd(); + + glColor4ub(0, 0, 0, 150); + glEnable(GL_BLEND); + glEnable( GL_LINE_SMOOTH ); + glBegin(GL_LINE_LOOP); + for(a=0; a<16; a++) + glVertex2f(x+size*si[a], y+size*co[a]); + glEnd(); + glDisable( GL_LINE_SMOOTH ); + glDisable(GL_BLEND); +} + /* ****************** BUTTON CALLBACKS FOR ALL TREES ***************** */ static void node_buts_value(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) @@ -192,11 +328,12 @@ static void node_buts_normal(uiLayout *layout, bContext *UNUSED(C), PointerRNA * bNode *node= ptr->data; rctf *butr= &node->butr; bNodeSocket *sock= node->outputs.first; /* first socket stores normal */ + float *nor= ((bNodeSocketValueVector*)sock->default_value)->value; uiBut *bt; bt= uiDefButF(block, BUT_NORMAL, B_NODE_EXEC, "", (short)butr->xmin, (short)butr->xmin, butr->xmax-butr->xmin, butr->xmax-butr->xmin, - sock->ns.vec, 0.0f, 1.0f, 0, 0, ""); + nor, 0.0f, 1.0f, 0, 0, ""); uiButSetFunc(bt, node_normal_cb, ntree, node); } #if 0 // not used in 2.5x yet @@ -287,6 +424,470 @@ static void node_buts_math(uiLayout *layout, bContext *UNUSED(C), PointerRNA *pt uiItemR(layout, ptr, "operation", 0, "", ICON_NONE); } +static int node_resize_area_default(bNode *node, int x, int y) +{ + if (node->flag & NODE_HIDDEN) { + rctf totr= node->totr; + /* right part of node */ + totr.xmin= node->totr.xmax-20.0f; + return BLI_in_rctf(&totr, x, y); + } + else { + /* rect we're interested in is just the bottom right corner */ + rctf totr= node->totr; + /* bottom right corner */ + totr.xmin= totr.xmax-10.0f; + totr.ymax= totr.ymin+10.0f; + return BLI_in_rctf(&totr, x, y); + } +} + +/* ****************** BUTTON CALLBACKS FOR COMMON NODES ***************** */ + +/* width of socket columns in group display */ +#define NODE_GROUP_FRAME 120 + +/* based on settings in node, sets drawing rect info. each redraw! */ +/* note: this assumes only 1 group at a time is drawn (linked data) */ +/* in node->totr the entire boundbox for the group is stored */ +static void node_update_group(const bContext *C, bNodeTree *ntree, bNode *gnode) +{ + if (!(gnode->flag & NODE_GROUP_EDIT)) { + node_update_default(C, ntree, gnode); + } + else { + bNodeTree *ngroup= (bNodeTree *)gnode->id; + bNode *node; + bNodeSocket *sock, *gsock; + float locx, locy; + rctf *rect= &gnode->totr; + float node_group_frame= U.dpi*NODE_GROUP_FRAME/72; + int counter; + int dy; + + /* get "global" coords */ + nodeSpaceCoords(gnode, &locx, &locy); + + /* center them, is a bit of abuse of locx and locy though */ + node_update_nodetree(C, ngroup, locx, locy); + + rect->xmin = rect->xmax = locx; + rect->ymin = rect->ymax = locy; + + counter= 1; + for(node= ngroup->nodes.first; node; node= node->next) { + if(counter) { + *rect= node->totr; + counter= 0; + } + else + BLI_union_rctf(rect, &node->totr); + } + + /* add some room for links to group sockets */ + rect->xmin -= 4*NODE_DY; + rect->xmax += 4*NODE_DY; + rect->ymin-= NODE_DY; + rect->ymax+= NODE_DY; + + /* input sockets */ + dy = 0.5f*(rect->ymin+rect->ymax) + NODE_DY*(BLI_countlist(&gnode->inputs)-1); + gsock=ngroup->inputs.first; + sock=gnode->inputs.first; + while (gsock || sock) { + while (sock && !sock->groupsock) { + sock->locx = rect->xmin - node_group_frame; + sock->locy = dy; + + /* prevent long socket lists from growing out of the group box */ + if (dy-3*NODE_DYS < rect->ymin) + rect->ymin = dy-3*NODE_DYS; + if (dy+3*NODE_DYS > rect->ymax) + rect->ymax = dy+3*NODE_DYS; + dy -= 2*NODE_DY; + + sock = sock->next; + } + while (gsock && (!sock || sock->groupsock!=gsock)) { + gsock->locx = rect->xmin; + gsock->locy = dy; + + /* prevent long socket lists from growing out of the group box */ + if (dy-3*NODE_DYS < rect->ymin) + rect->ymin = dy-3*NODE_DYS; + if (dy+3*NODE_DYS > rect->ymax) + rect->ymax = dy+3*NODE_DYS; + dy -= 2*NODE_DY; + + gsock = gsock->next; + } + while (sock && gsock && sock->groupsock==gsock) { + gsock->locx = rect->xmin; + sock->locx = rect->xmin - node_group_frame; + sock->locy = gsock->locy = dy; + + /* prevent long socket lists from growing out of the group box */ + if (dy-3*NODE_DYS < rect->ymin) + rect->ymin = dy-3*NODE_DYS; + if (dy+3*NODE_DYS > rect->ymax) + rect->ymax = dy+3*NODE_DYS; + dy -= 2*NODE_DY; + + sock = sock->next; + gsock = gsock->next; + } + } + + /* output sockets */ + dy = 0.5f*(rect->ymin+rect->ymax) + NODE_DY*(BLI_countlist(&gnode->outputs)-1); + gsock=ngroup->outputs.first; + sock=gnode->outputs.first; + while (gsock || sock) { + while (sock && !sock->groupsock) { + sock->locx = rect->xmax + node_group_frame; + sock->locy = dy - NODE_DYS; + + /* prevent long socket lists from growing out of the group box */ + if (dy-3*NODE_DYS < rect->ymin) + rect->ymin = dy-3*NODE_DYS; + if (dy+3*NODE_DYS > rect->ymax) + rect->ymax = dy+3*NODE_DYS; + dy -= 2*NODE_DY; + + sock = sock->next; + } + while (gsock && (!sock || sock->groupsock!=gsock)) { + gsock->locx = rect->xmax; + gsock->locy = dy - NODE_DYS; + + /* prevent long socket lists from growing out of the group box */ + if (dy-3*NODE_DYS < rect->ymin) + rect->ymin = dy-3*NODE_DYS; + if (dy+3*NODE_DYS > rect->ymax) + rect->ymax = dy+3*NODE_DYS; + dy -= 2*NODE_DY; + + gsock = gsock->next; + } + while (sock && gsock && sock->groupsock==gsock) { + gsock->locx = rect->xmax; + sock->locx = rect->xmax + node_group_frame; + sock->locy = gsock->locy = dy - NODE_DYS; + + /* prevent long socket lists from growing out of the group box */ + if (dy-3*NODE_DYS < rect->ymin) + rect->ymin = dy-3*NODE_DYS; + if (dy+3*NODE_DYS > rect->ymax) + rect->ymax = dy+3*NODE_DYS; + dy -= 2*NODE_DY; + + sock = sock->next; + gsock = gsock->next; + } + } + } +} + +static void update_group_input_cb(bContext *UNUSED(C), void *UNUSED(snode_v), void *ngroup_v) +{ + bNodeTree *ngroup= (bNodeTree*)ngroup_v; + + ngroup->update |= NTREE_UPDATE_GROUP_IN; + ntreeUpdateTree(ngroup); +} + +static void update_group_output_cb(bContext *UNUSED(C), void *UNUSED(snode_v), void *ngroup_v) +{ + bNodeTree *ngroup= (bNodeTree*)ngroup_v; + + ngroup->update |= NTREE_UPDATE_GROUP_OUT; + ntreeUpdateTree(ngroup); +} + +static void draw_group_socket_name(SpaceNode *snode, bNode *gnode, bNodeSocket *sock, int in_out, float xoffset, float yoffset) +{ + bNodeTree *ngroup= (bNodeTree*)gnode->id; + uiBut *bt; + + if (sock->flag & SOCK_DYNAMIC) { + bt = uiDefBut(gnode->block, TEX, 0, "", + sock->locx+xoffset, sock->locy+1+yoffset, 72, NODE_DY, + sock->name, 0, 31, 0, 0, ""); + if (in_out==SOCK_IN) + uiButSetFunc(bt, update_group_input_cb, snode, ngroup); + else + uiButSetFunc(bt, update_group_output_cb, snode, ngroup); + } + else { + uiDefBut(gnode->block, LABEL, 0, sock->name, + sock->locx+xoffset, sock->locy+1+yoffset, 72, NODE_DY, + NULL, 0, 31, 0, 0, ""); + } +} + +static void draw_group_socket(const bContext *C, SpaceNode *snode, bNodeTree *ntree, bNode *gnode, bNodeSocket *sock, bNodeSocket *gsock, int index, int in_out) +{ + bNodeTree *ngroup= (bNodeTree*)gnode->id; + bNodeSocketType *stype= ntreeGetSocketType(gsock ? gsock->type : sock->type); + uiBut *bt; + float offset; + int draw_value; + float node_group_frame= U.dpi*NODE_GROUP_FRAME/72; + float socket_size= NODE_SOCKSIZE*U.dpi/72; + float arrowbutw= 0.8f*UI_UNIT_X; + /* layout stuff for buttons on group left frame */ + float colw= 0.6f*node_group_frame; + float col1= 6; + float col2= col1 + colw+6; + float col3= node_group_frame - arrowbutw - 6; + /* layout stuff for buttons on group right frame */ + float cor1= 6; + float cor2= cor1 + arrowbutw + 6; + float cor3= cor2 + arrowbutw + 6; + + /* node and group socket circles */ + if (sock) + node_socket_circle_draw(ntree, sock, socket_size); + if (gsock) + node_socket_circle_draw(ngroup, gsock, socket_size); + + /* socket name */ + offset = (in_out==SOCK_IN ? col1 : cor3); + if (!gsock) + offset += (in_out==SOCK_IN ? node_group_frame : -node_group_frame); + + /* draw both name and value button if: + * 1) input: not internal + * 2) output: (node type uses const outputs) and (group output is unlinked) + */ + switch (in_out) { + case SOCK_IN: + draw_value = !(gsock && (gsock->flag & SOCK_INTERNAL)); + break; + case SOCK_OUT: + if (gnode->typeinfo->flag & NODE_CONST_OUTPUT) + draw_value = !(gsock && gsock->link); + else + draw_value = 0; + break; + } + if (draw_value) { + /* both name and value buttons */ + if (gsock) { + draw_group_socket_name(snode, gnode, gsock, in_out, offset, 0); + if (stype->buttonfunc) + stype->buttonfunc(C, gnode->block, ngroup, NULL, gsock, "", gsock->locx+offset, gsock->locy-NODE_DY, colw); + } + else { + draw_group_socket_name(snode, gnode, sock, in_out, offset, 0); + if (stype->buttonfunc) + stype->buttonfunc(C, gnode->block, ngroup, NULL, sock, "", sock->locx+offset, sock->locy-NODE_DY, colw); + } + } + else { + /* only name, no value button */ + if (gsock) + draw_group_socket_name(snode, gnode, gsock, in_out, offset, -NODE_DYS); + else + draw_group_socket_name(snode, gnode, sock, in_out, offset, -NODE_DYS); + } + + if (gsock && (gsock->flag & SOCK_DYNAMIC)) { + /* up/down buttons */ + offset = (in_out==SOCK_IN ? col2 : cor2); + uiBlockSetDirection(gnode->block, UI_TOP); + uiBlockBeginAlign(gnode->block); + bt = uiDefIconButO(gnode->block, BUT, "NODE_OT_group_socket_move_up", 0, ICON_TRIA_UP, + gsock->locx+offset, gsock->locy, arrowbutw, arrowbutw, ""); + if (!gsock->prev || !(gsock->prev->flag & SOCK_DYNAMIC)) + uiButSetFlag(bt, UI_BUT_DISABLED); + RNA_int_set(uiButGetOperatorPtrRNA(bt), "index", index); + RNA_enum_set(uiButGetOperatorPtrRNA(bt), "in_out", in_out); + bt = uiDefIconButO(gnode->block, BUT, "NODE_OT_group_socket_move_down", 0, ICON_TRIA_DOWN, + gsock->locx+offset, gsock->locy-arrowbutw, arrowbutw, arrowbutw, ""); + if (!gsock->next || !(gsock->next->flag & SOCK_DYNAMIC)) + uiButSetFlag(bt, UI_BUT_DISABLED); + RNA_int_set(uiButGetOperatorPtrRNA(bt), "index", index); + RNA_enum_set(uiButGetOperatorPtrRNA(bt), "in_out", in_out); + uiBlockEndAlign(gnode->block); + uiBlockSetDirection(gnode->block, 0); + + /* remove button */ + offset = (in_out==SOCK_IN ? col3 : col1); + uiBlockSetEmboss(gnode->block, UI_EMBOSSN); + bt = uiDefIconButO(gnode->block, BUT, "NODE_OT_group_socket_remove", 0, ICON_X, + gsock->locx+offset, gsock->locy-0.5f*arrowbutw, arrowbutw, arrowbutw, ""); + RNA_int_set(uiButGetOperatorPtrRNA(bt), "index", index); + RNA_enum_set(uiButGetOperatorPtrRNA(bt), "in_out", in_out); + uiBlockSetEmboss(gnode->block, UI_EMBOSS); + } +} + +/* groups are, on creation, centered around 0,0 */ +static void node_draw_group(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeTree *ntree, bNode *gnode) +{ + if (!(gnode->flag & NODE_GROUP_EDIT)) { + node_draw_default(C, ar, snode, ntree, gnode); + } + else { + bNodeTree *ngroup= (bNodeTree *)gnode->id; + bNodeSocket *sock, *gsock; + uiLayout *layout; + PointerRNA ptr; + rctf rect= gnode->totr; + float node_group_frame= U.dpi*NODE_GROUP_FRAME/72; + float group_header= 26*U.dpi/72; + + int index; + + /* backdrop header */ + glEnable(GL_BLEND); + uiSetRoundBox(3); + UI_ThemeColorShadeAlpha(TH_NODE_GROUP, 0, -70); + uiDrawBox(GL_POLYGON, rect.xmin-node_group_frame, rect.ymax, rect.xmax+node_group_frame, rect.ymax+group_header, BASIS_RAD); + + /* backdrop body */ + UI_ThemeColorShadeAlpha(TH_BACK, -8, -70); + uiSetRoundBox(0); + uiDrawBox(GL_POLYGON, rect.xmin, rect.ymin, rect.xmax, rect.ymax, BASIS_RAD); + + /* input column */ + UI_ThemeColorShadeAlpha(TH_BACK, 10, -50); + uiSetRoundBox(8); + uiDrawBox(GL_POLYGON, rect.xmin-node_group_frame, rect.ymin, rect.xmin, rect.ymax, BASIS_RAD); + + /* output column */ + UI_ThemeColorShadeAlpha(TH_BACK, 10, -50); + uiSetRoundBox(4); + uiDrawBox(GL_POLYGON, rect.xmax, rect.ymin, rect.xmax+node_group_frame, rect.ymax, BASIS_RAD); + + /* input column separator */ + glColor4ub(200, 200, 200, 140); + glBegin(GL_LINES); + glVertex2f(rect.xmin, rect.ymin); + glVertex2f(rect.xmin, rect.ymax); + glEnd(); + + /* output column separator */ + glColor4ub(200, 200, 200, 140); + glBegin(GL_LINES); + glVertex2f(rect.xmax, rect.ymin); + glVertex2f(rect.xmax, rect.ymax); + glEnd(); + + /* group node outline */ + uiSetRoundBox(15); + glColor4ub(200, 200, 200, 140); + glEnable( GL_LINE_SMOOTH ); + uiDrawBox(GL_LINE_LOOP, rect.xmin-node_group_frame, rect.ymin, rect.xmax+node_group_frame, rect.ymax+group_header, BASIS_RAD); + glDisable( GL_LINE_SMOOTH ); + glDisable(GL_BLEND); + + /* backdrop title */ + UI_ThemeColor(TH_TEXT_HI); + + layout = uiBlockLayout(gnode->block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, (short)(rect.xmin+15), (short)(rect.ymax+group_header), + MIN2((int)(rect.xmax - rect.xmin-18.0f), node_group_frame+20), group_header, U.uistyles.first); + RNA_pointer_create(&ntree->id, &RNA_Node, gnode, &ptr); + uiTemplateIDBrowse(layout, (bContext*)C, &ptr, "node_tree", NULL, NULL, NULL); + uiBlockLayoutResolve(gnode->block, NULL, NULL); + + /* draw the internal tree nodes and links */ + node_draw_nodetree(C, ar, snode, ngroup); + + /* group sockets */ + gsock=ngroup->inputs.first; + sock=gnode->inputs.first; + index = 0; + while (gsock || sock) { + while (sock && !sock->groupsock) { + draw_group_socket(C, snode, ntree, gnode, sock, NULL, index, SOCK_IN); + sock = sock->next; + } + while (gsock && (!sock || sock->groupsock!=gsock)) { + draw_group_socket(C, snode, ntree, gnode, NULL, gsock, index, SOCK_IN); + gsock = gsock->next; + ++index; + } + while (sock && gsock && sock->groupsock==gsock) { + draw_group_socket(C, snode, ntree, gnode, sock, gsock, index, SOCK_IN); + sock = sock->next; + gsock = gsock->next; + ++index; + } + } + gsock=ngroup->outputs.first; + sock=gnode->outputs.first; + index = 0; + while (gsock || sock) { + while (sock && !sock->groupsock) { + draw_group_socket(C, snode, ntree, gnode, sock, NULL, index, SOCK_OUT); + sock = sock->next; + } + while (gsock && (!sock || sock->groupsock!=gsock)) { + draw_group_socket(C, snode, ntree, gnode, NULL, gsock, index, SOCK_OUT); + gsock = gsock->next; + ++index; + } + while (sock && gsock && sock->groupsock==gsock) { + draw_group_socket(C, snode, ntree, gnode, sock, gsock, index, SOCK_OUT); + sock = sock->next; + gsock = gsock->next; + ++index; + } + } + + uiEndBlock(C, gnode->block); + uiDrawBlock(C, gnode->block); + gnode->block= NULL; + } +} + +static void node_common_buts_whileloop(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiItemR(layout, ptr, "max_iterations", 0, NULL, 0); +} + +static void node_update_frame(const bContext *UNUSED(C), bNodeTree *UNUSED(ntree), bNode *node) +{ + float locx, locy; + + /* get "global" coords */ + nodeSpaceCoords(node, &locx, &locy); + + node->prvr.xmin= locx + NODE_DYS; + node->prvr.xmax= locx + node->width- NODE_DYS; + + node->totr.xmin= locx; + node->totr.xmax= locx + node->width; + node->totr.ymax= locy; + node->totr.ymin= locy - node->height; +} + +static void node_common_set_butfunc(bNodeType *ntype) +{ + switch(ntype->type) { + case NODE_GROUP: +// ntype->uifunc= node_common_buts_group; + ntype->drawfunc= node_draw_group; + ntype->drawupdatefunc= node_update_group; + break; + case NODE_FORLOOP: +// ntype->uifunc= node_common_buts_group; + ntype->drawfunc= node_draw_group; + ntype->drawupdatefunc= node_update_group; + break; + case NODE_WHILELOOP: + ntype->uifunc= node_common_buts_whileloop; + ntype->drawfunc= node_draw_group; + ntype->drawupdatefunc= node_update_group; + break; + case NODE_FRAME: + ntype->drawupdatefunc= node_update_frame; + break; + } +} + /* ****************** BUTTON CALLBACKS FOR SHADER NODES ***************** */ static void node_browse_text_cb(bContext *C, void *ntree_v, void *node_v) @@ -470,8 +1071,6 @@ static void node_shader_set_butfunc(bNodeType *ntype) case NODE_DYNAMIC: ntype->uifunc= node_shader_buts_dynamic; break; - default: - ntype->uifunc= NULL; } if (ntype->uifuncbut == NULL) ntype->uifuncbut = ntype->uifunc; } @@ -1225,8 +1824,6 @@ static void node_composit_set_butfunc(bNodeType *ntype) case CMP_NODE_SEPYCCA: ntype->uifunc=node_composit_buts_ycc; break; - default: - ntype->uifunc= NULL; } if (ntype->uifuncbut == NULL) ntype->uifuncbut = ntype->uifunc; @@ -1381,9 +1978,6 @@ static void node_texture_set_butfunc(bNodeType *ntype) case TEX_NODE_OUTPUT: ntype->uifunc = node_texture_buts_output; break; - - default: - ntype->uifunc= NULL; } if (ntype->uifuncbut == NULL) ntype->uifuncbut = ntype->uifunc; } @@ -1392,24 +1986,60 @@ static void node_texture_set_butfunc(bNodeType *ntype) void ED_init_node_butfuncs(void) { + bNodeTreeType *treetype; bNodeType *ntype; + bNodeSocketType *stype; + int i; - /* shader nodes */ - ntype= node_all_shaders.first; - while(ntype) { - node_shader_set_butfunc(ntype); - ntype= ntype->next; + /* node type ui functions */ + for (i=0; i < NUM_NTREE_TYPES; ++i) { + treetype = ntreeGetType(i); + if (treetype) { + for (ntype= treetype->node_types.first; ntype; ntype= ntype->next) { + /* default ui functions */ + ntype->drawfunc = node_draw_default; + ntype->drawupdatefunc = node_update_default; + ntype->uifunc = NULL; + ntype->uifuncbut = NULL; + ntype->resize_area_func = node_resize_area_default; + + node_common_set_butfunc(ntype); + + switch (i) { + case NTREE_COMPOSIT: + node_composit_set_butfunc(ntype); + break; + case NTREE_SHADER: + node_shader_set_butfunc(ntype); + break; + case NTREE_TEXTURE: + node_texture_set_butfunc(ntype); + break; + } + } + } } - /* composit nodes */ - ntype= node_all_composit.first; - while(ntype) { - node_composit_set_butfunc(ntype); - ntype= ntype->next; - } - ntype = node_all_textures.first; - while(ntype) { - node_texture_set_butfunc(ntype); - ntype= ntype->next; + + /* socket type ui functions */ + for (i=0; i < NUM_SOCKET_TYPES; ++i) { + stype = ntreeGetSocketType(i); + if (stype) { + switch(stype->type) { + case SOCK_FLOAT: + case SOCK_INT: + case SOCK_BOOLEAN: + stype->buttonfunc = node_socket_button_default; + break; + case SOCK_VECTOR: + stype->buttonfunc = node_socket_button_components; + break; + case SOCK_RGBA: + stype->buttonfunc = node_socket_button_color; + break; + default: + stype->buttonfunc = NULL; + } + } } } @@ -1840,6 +2470,69 @@ void node_draw_link_bezier(View2D *v2d, SpaceNode *snode, bNodeLink *link, int t } } +static void node_link_straight_points(View2D *UNUSED(v2d), SpaceNode *snode, bNodeLink *link, float coord_array[][2]) +{ + if(link->fromsock) { + coord_array[0][0]= link->fromsock->locx; + coord_array[0][1]= link->fromsock->locy; + } + else { + if(snode==NULL) return; + coord_array[0][0]= snode->mx; + coord_array[0][1]= snode->my; + } + if(link->tosock) { + coord_array[1][0]= link->tosock->locx; + coord_array[1][1]= link->tosock->locy; + } + else { + if(snode==NULL) return; + coord_array[1][0]= snode->mx; + coord_array[1][1]= snode->my; + } +} + +void node_draw_link_straight(View2D *v2d, SpaceNode *snode, bNodeLink *link, int th_col1, int do_shaded, int th_col2, int do_triple, int th_col3 ) +{ + float coord_array[2][2]; + float linew; + int i; + + node_link_straight_points(v2d, snode, link, coord_array); + + /* store current linewidth */ + glGetFloatv(GL_LINE_WIDTH, &linew); + + glEnable(GL_LINE_SMOOTH); + + if(do_triple) { + UI_ThemeColorShadeAlpha(th_col3, -80, -120); + glLineWidth(4.0f); + + glBegin(GL_LINES); + glVertex2fv(coord_array[0]); + glVertex2fv(coord_array[1]); + glEnd(); + } + + UI_ThemeColor(th_col1); + glLineWidth(1.5f); + + glBegin(GL_LINE_STRIP); + for (i=0; i < LINK_RESOL; ++i) { + float t= (float)i/(float)(LINK_RESOL-1); + if(do_shaded) + UI_ThemeColorBlend(th_col1, th_col2, t); + glVertex2f((1.0f-t)*coord_array[0][0]+t*coord_array[1][0], (1.0f-t)*coord_array[0][1]+t*coord_array[1][1]); + } + glEnd(); + + glDisable(GL_LINE_SMOOTH); + + /* restore previuos linewidth */ + glLineWidth(linew); +} + /* note; this is used for fake links in groups too */ void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link) { @@ -1868,7 +2561,7 @@ void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link) } else { /* check cyclic */ - if(link->fromnode->level >= link->tonode->level && link->tonode->level!=0xFFF) { + if((link->fromnode->level >= link->tonode->level && link->tonode->level!=0xFFF) && (link->flag & NODE_LINK_VALID)) { /* special indicated link, on drop-node */ if(link->flag & NODE_LINKFLAG_HILITE) { th_col1= th_col2= TH_ACTIVE; @@ -1890,6 +2583,5 @@ void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link) } node_draw_link_bezier(v2d, snode, link, th_col1, do_shaded, th_col2, do_triple, th_col3); +// node_draw_link_straight(v2d, snode, link, th_col1, do_shaded, th_col2, do_triple, th_col3); } - - diff --git a/source/blender/editors/space_node/node_buttons.c b/source/blender/editors/space_node/node_buttons.c index 4b989a78fab..7b14e35e8fe 100644 --- a/source/blender/editors/space_node/node_buttons.c +++ b/source/blender/editors/space_node/node_buttons.c @@ -116,10 +116,12 @@ static void active_node_panel(const bContext *C, Panel *pa) uiItemS(layout); uiItemR(layout, &ptr, "name", 0, NULL, ICON_NODE); uiItemS(layout); - + /* draw this node's settings */ if (node->typeinfo && node->typeinfo->uifuncbut) node->typeinfo->uifuncbut(layout, (bContext *)C, &ptr); + else if (node->typeinfo && node->typeinfo->uifunc) + node->typeinfo->uifunc(layout, (bContext *)C, &ptr); } /* ******************* node buttons registration ************** */ diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c index 950b3c72fe7..ec118bb3ca2 100644 --- a/source/blender/editors/space_node/node_draw.c +++ b/source/blender/editors/space_node/node_draw.c @@ -70,8 +70,8 @@ #include "RNA_access.h" -#include "CMP_node.h" -#include "SHD_node.h" +#include "NOD_composite.h" +#include "NOD_shader.h" #include "node_intern.h" @@ -81,6 +81,15 @@ // XXX interface.h extern void ui_dropshadow(rctf *rct, float radius, float aspect, int select); +/* XXX update functions for node editor are a mess, needs a clear concept */ +void ED_node_tree_update(SpaceNode *snode, Scene *scene) +{ + snode_set_context(snode, scene); + + if(snode->nodetree && snode->nodetree->id.us==0) + snode->nodetree->id.us= 1; +} + void ED_node_changed_update(ID *id, bNode *node) { bNodeTree *nodetree, *edittree; @@ -123,24 +132,25 @@ static int has_nodetree(bNodeTree *ntree, bNodeTree *lookup) return 0; } +typedef struct NodeUpdateCalldata { + bNodeTree *ntree; + bNode *node; +} NodeUpdateCalldata; +static void node_generic_update_cb(void *calldata, ID *owner_id, bNodeTree *ntree) +{ + NodeUpdateCalldata *cd= (NodeUpdateCalldata*)calldata; + /* check if nodetree uses the group stored in calldata */ + if (has_nodetree(ntree, cd->ntree)) + ED_node_changed_update(owner_id, cd->node); +} void ED_node_generic_update(Main *bmain, bNodeTree *ntree, bNode *node) { - Material *ma; - Tex *tex; - Scene *sce; - + bNodeTreeType *tti= ntreeGetType(ntree->type); + NodeUpdateCalldata cd; + cd.ntree = ntree; + cd.node = node; /* look through all datablocks, to support groups */ - for(ma=bmain->mat.first; ma; ma=ma->id.next) - if(ma->nodetree && ma->use_nodes && has_nodetree(ma->nodetree, ntree)) - ED_node_changed_update(&ma->id, node); - - for(tex=bmain->tex.first; tex; tex=tex->id.next) - if(tex->nodetree && tex->use_nodes && has_nodetree(tex->nodetree, ntree)) - ED_node_changed_update(&tex->id, node); - - for(sce=bmain->scene.first; sce; sce=sce->id.next) - if(sce->nodetree && sce->use_nodes && has_nodetree(sce->nodetree, ntree)) - ED_node_changed_update(&sce->id, node); + tti->foreach_nodetree(bmain, &cd, node_generic_update_cb); if(ntree->type == NTREE_TEXTURE) ntreeTexCheckCyclics(ntree); @@ -204,14 +214,19 @@ static void node_uiblocks_init(const bContext *C, bNodeTree *ntree) } /* based on settings in node, sets drawing rect info. each redraw! */ -static void node_update(const bContext *C, bNodeTree *ntree, bNode *node) +static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) { uiLayout *layout; PointerRNA ptr; bNodeSocket *nsock; - float dy= node->locy; + float locx, locy; + float dy= locy; int buty; + /* get "global" coords */ + nodeSpaceCoords(node, &locx, &locy); + dy= locy; + /* header */ dy-= NODE_DY; @@ -222,14 +237,14 @@ static void node_update(const bContext *C, bNodeTree *ntree, bNode *node) /* output sockets */ for(nsock= node->outputs.first; nsock; nsock= nsock->next) { if(!(nsock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) { - nsock->locx= node->locx + node->width; + nsock->locx= locx + node->width; nsock->locy= dy - NODE_DYS; dy-= NODE_DY; } } - node->prvr.xmin= node->locx + NODE_DYS; - node->prvr.xmax= node->locx + node->width- NODE_DYS; + node->prvr.xmin= locx + NODE_DYS; + node->prvr.xmax= locx + node->width- NODE_DYS; /* preview rect? */ if(node->flag & NODE_PREVIEW) { @@ -286,21 +301,22 @@ static void node_update(const bContext *C, bNodeTree *ntree, bNode *node) node->butr.ymax= 0; RNA_pointer_create(&ntree->id, &RNA_Node, node, &ptr); - + layout= uiBlockLayout(node->block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, - node->locx+NODE_DYS, dy, node->butr.xmax, NODE_DY, U.uistyles.first); - + locx+NODE_DYS, dy, node->butr.xmax, NODE_DY, U.uistyles.first); + node->typeinfo->uifunc(layout, (bContext *)C, &ptr); + uiBlockEndAlign(node->block); uiBlockLayoutResolve(node->block, NULL, &buty); - + dy= buty - NODE_DYS/2; } /* input sockets */ for(nsock= node->inputs.first; nsock; nsock= nsock->next) { if(!(nsock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) { - nsock->locx= node->locx; + nsock->locx= locx; nsock->locy= dy - NODE_DYS; dy-= NODE_DY; } @@ -310,19 +326,23 @@ static void node_update(const bContext *C, bNodeTree *ntree, bNode *node) if(node->inputs.first || (node->flag & (NODE_OPTIONS|NODE_PREVIEW))==0 ) dy-= NODE_DYS/2; - node->totr.xmin= node->locx; - node->totr.xmax= node->locx + node->width; - node->totr.ymax= node->locy; - node->totr.ymin= MIN2(dy, node->locy-2*NODE_DY); + node->totr.xmin= locx; + node->totr.xmax= locx + node->width; + node->totr.ymax= locy; + node->totr.ymin= MIN2(dy, locy-2*NODE_DY); } /* based on settings in node, sets drawing rect info. each redraw! */ static void node_update_hidden(bNode *node) { bNodeSocket *nsock; + float locx, locy; float rad, drad, hiddenrad= HIDDEN_RAD; int totin=0, totout=0, tot; + /* get "global" coords */ + nodeSpaceCoords(node, &locx, &locy); + /* calculate minimal radius */ for(nsock= node->inputs.first; nsock; nsock= nsock->next) if(!(nsock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) @@ -336,9 +356,9 @@ static void node_update_hidden(bNode *node) hiddenrad += 5.0f*(float)(tot-4); } - node->totr.xmin= node->locx; - node->totr.xmax= node->locx + 3*hiddenrad + node->miniwidth; - node->totr.ymax= node->locy + (hiddenrad - 0.5f*NODE_DY); + node->totr.xmin= locx; + node->totr.xmax= locx + 3*hiddenrad + node->miniwidth; + node->totr.ymax= locy + (hiddenrad - 0.5f*NODE_DY); node->totr.ymin= node->totr.ymax - 2*hiddenrad; /* output sockets */ @@ -364,6 +384,14 @@ static void node_update_hidden(bNode *node) } } +void node_update_default(const bContext *C, bNodeTree *ntree, bNode *node) +{ + if(node->flag & NODE_HIDDEN) + node_update_hidden(node); + else + node_update_basis(C, ntree, node); +} + static int node_get_colorid(bNode *node) { if(node->typeinfo->nclass==NODE_CLASS_INPUT) @@ -383,138 +411,42 @@ static int node_get_colorid(bNode *node) return TH_NODE; } -/* based on settings in node, sets drawing rect info. each redraw! */ -/* note: this assumes only 1 group at a time is drawn (linked data) */ -/* in node->totr the entire boundbox for the group is stored */ -static void node_update_group(const bContext *C, bNodeTree *UNUSED(ntree), bNode *gnode) -{ - bNodeTree *ngroup= (bNodeTree *)gnode->id; - bNode *node; - bNodeSocket *sock, *gsock; - rctf *rect= &gnode->totr; - float node_group_frame= U.dpi*NODE_GROUP_FRAME/72; - int counter; - int dy; - - rect->xmin = rect->xmax = gnode->locx; - rect->ymin = rect->ymax = gnode->locy; - - /* center them, is a bit of abuse of locx and locy though */ - for(node= ngroup->nodes.first; node; node= node->next) { - node->locx+= gnode->locx; - node->locy+= gnode->locy; - - if(node->flag & NODE_HIDDEN) - node_update_hidden(node); - else - node_update(C, ngroup, node); - node->locx-= gnode->locx; - node->locy-= gnode->locy; - } - counter= 1; - for(node= ngroup->nodes.first; node; node= node->next) { - if(counter) { - *rect= node->totr; - counter= 0; - } - else - BLI_union_rctf(rect, &node->totr); - } - - /* add some room for links to group sockets */ - rect->xmin -= 4*NODE_DY; - rect->xmax += 4*NODE_DY; - rect->ymin-= NODE_DY; - rect->ymax+= NODE_DY; - - /* input sockets */ - dy = 0.5f*(rect->ymin+rect->ymax) + NODE_DY*(BLI_countlist(&gnode->inputs)-1); - for(gsock=ngroup->inputs.first, sock=gnode->inputs.first; gsock; gsock=gsock->next, sock=sock->next) { - gsock->locx = rect->xmin; - sock->locx = rect->xmin - node_group_frame; - sock->locy = gsock->locy = dy; - - /* prevent long socket lists from growing out of the group box */ - if (dy-3*NODE_DYS < rect->ymin) - rect->ymin = dy-3*NODE_DYS; - if (dy+3*NODE_DYS > rect->ymax) - rect->ymax = dy+3*NODE_DYS; - - dy -= 2*NODE_DY; - } - - /* output sockets */ - dy = 0.5f*(rect->ymin+rect->ymax) + NODE_DY*(BLI_countlist(&gnode->outputs)-1); - for(gsock=ngroup->outputs.first, sock=gnode->outputs.first; gsock; gsock=gsock->next, sock=sock->next) { - gsock->locx = rect->xmax; - sock->locx = rect->xmax + node_group_frame; - sock->locy = gsock->locy = dy - NODE_DYS; - - /* prevent long socket lists from growing out of the group box */ - if (dy-3*NODE_DYS < rect->ymin) - rect->ymin = dy-3*NODE_DYS; - if (dy+3*NODE_DYS > rect->ymax) - rect->ymax = dy+3*NODE_DYS; - - dy -= 2*NODE_DY; - } -} - /* note: in cmp_util.c is similar code, for node_compo_pass_on() */ /* note: in node_edit.c is similar code, for untangle node */ static void node_draw_mute_line(View2D *v2d, SpaceNode *snode, bNode *node) { - bNodeSocket *valsock= NULL, *colsock= NULL, *vecsock= NULL; - bNodeSocket *sock; + static int types[]= { SOCK_FLOAT, SOCK_VECTOR, SOCK_RGBA }; bNodeLink link= {NULL}; - int a; + int i; - /* connect the first value buffer in with first value out */ - /* connect the first RGBA buffer in with first RGBA out */ + /* connect the first input of each type with first output of the same type */ - /* test the inputs */ - for(a=0, sock= node->inputs.first; sock; sock= sock->next, a++) { - if(nodeCountSocketLinks(snode->edittree, sock)) { - if(sock->type==SOCK_VALUE && valsock==NULL) valsock= sock; - if(sock->type==SOCK_VECTOR && vecsock==NULL) vecsock= sock; - if(sock->type==SOCK_RGBA && colsock==NULL) colsock= sock; - } - } - - /* outputs, draw lines */ glEnable(GL_BLEND); glEnable( GL_LINE_SMOOTH ); - if(valsock || colsock || vecsock) { - for(a=0, sock= node->outputs.first; sock; sock= sock->next, a++) { - if(nodeCountSocketLinks(snode->edittree, sock)) { - link.tosock= sock; - - if(sock->type==SOCK_VALUE && valsock) { - link.fromsock= valsock; - node_draw_link_bezier(v2d, snode, &link, TH_REDALERT, 0, TH_WIRE, 0, TH_WIRE); - valsock= NULL; - } - if(sock->type==SOCK_VECTOR && vecsock) { - link.fromsock= vecsock; - node_draw_link_bezier(v2d, snode, &link, TH_REDALERT, 0, TH_WIRE, 0, TH_WIRE); - vecsock= NULL; - } - if(sock->type==SOCK_RGBA && colsock) { - link.fromsock= colsock; - node_draw_link_bezier(v2d, snode, &link, TH_REDALERT, 0, TH_WIRE, 0, TH_WIRE); - colsock= NULL; - } + link.fromnode = link.tonode = node; + for (i=0; i < 3; ++i) { + /* find input socket */ + for (link.fromsock=node->inputs.first; link.fromsock; link.fromsock=link.fromsock->next) + if (link.fromsock->type==types[i] && nodeCountSocketLinks(snode->edittree, link.fromsock)) + break; + if (link.fromsock) { + for (link.tosock=node->outputs.first; link.tosock; link.tosock=link.tosock->next) + if (link.tosock->type==types[i] && nodeCountSocketLinks(snode->edittree, link.tosock)) + break; + + if (link.tosock) { + node_draw_link_bezier(v2d, snode, &link, TH_REDALERT, 0, TH_WIRE, 0, TH_WIRE); } } } + glDisable(GL_BLEND); glDisable( GL_LINE_SMOOTH ); } -/* nice AA filled circle */ /* this might have some more generic use */ -static void circle_draw(float x, float y, float size, int col[3]) +static void node_circle_draw(float x, float y, float size, char *col) { /* 16 values of sin function */ static float si[16] = { @@ -550,37 +482,10 @@ static void circle_draw(float x, float y, float size, int col[3]) glDisable(GL_BLEND); } -static void socket_circle_draw(bNodeSocket *sock, float size) +void node_socket_circle_draw(bNodeTree *UNUSED(ntree), bNodeSocket *sock, float size) { - int col[3]; - - if(sock->type==-1) { - col[0]= 0; col[1]= 0; col[2]= 0; - } - else if(sock->type==SOCK_VALUE) { - col[0]= 160; col[1]= 160; col[2]= 160; - } - else if(sock->type==SOCK_VECTOR) { - col[0]= 100; col[1]= 100; col[2]= 200; - } - else if(sock->type==SOCK_RGBA) { - col[0]= 200; col[1]= 200; col[2]= 40; - } - else { - col[0]= 100; col[1]= 200; col[2]= 100; - } - - circle_draw(sock->locx, sock->locy, size, col); -} - -static void node_sync_cb(bContext *UNUSED(C), void *snode_v, void *node_v) -{ - SpaceNode *snode= snode_v; - - if(snode->treetype==NTREE_SHADER) { - nodeShaderSynchronizeID(node_v, 1); - // allqueue(REDRAWBUTSSHADING, 0); - } + bNodeSocketType *stype = ntreeGetSocketType(sock->type); + node_circle_draw(sock->locx, sock->locy, size, stype->ui_color); } /* ************** Socket callbacks *********** */ @@ -639,83 +544,6 @@ static void node_draw_preview(bNodePreview *preview, rctf *prv) } -typedef struct SocketVectorMenuArgs { - PointerRNA ptr; - int x, y, width; - uiButHandleFunc cb; - void *arg1, *arg2; -} SocketVectorMenuArgs; - -/* NOTE: this is a block-menu, needs 0 events, otherwise the menu closes */ -static uiBlock *socket_vector_menu(bContext *C, ARegion *ar, void *args_v) -{ - SocketVectorMenuArgs *args= (SocketVectorMenuArgs*)args_v; - uiBlock *block; - uiLayout *layout; - - block= uiBeginBlock(C, ar, "socket menu", UI_EMBOSS); - uiBlockSetFlag(block, UI_BLOCK_KEEP_OPEN); - - layout= uiLayoutColumn(uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, args->x, args->y+2, args->width, NODE_DY, U.uistyles.first), 0); - - uiItemR(layout, &args->ptr, "default_value", UI_ITEM_R_EXPAND, "", ICON_NONE); - - return block; -} - -static void node_draw_socket_button(bNodeTree *ntree, bNodeSocket *sock, const char *name, - uiBlock *block, int x, int y, int width, - uiButHandleFunc cb, void *arg1, void *arg2) -{ - uiBut *bt= NULL; - PointerRNA ptr; - int labelw; - SocketVectorMenuArgs *args; - - RNA_pointer_create(&ntree->id, &RNA_NodeSocket, sock, &ptr); - - switch (sock->type) { - case SOCK_VALUE: - bt=uiDefButR(block, NUM, B_NODE_EXEC, name, - x, y+1, width, NODE_DY-2, - &ptr, "default_value", 0, sock->ns.min, sock->ns.max, -1, -1, NULL); - if (cb) - uiButSetFunc(bt, cb, arg1, arg2); - break; - - case SOCK_VECTOR: - args= MEM_callocN(sizeof(SocketVectorMenuArgs), "SocketVectorMenuArgs"); - - args->ptr = ptr; - args->x = x; - args->y = y; - args->width = width; - args->cb = cb; - args->arg1 = arg1; - args->arg2 = arg2; - - uiDefBlockButN(block, socket_vector_menu, args, name, - x, y+1, width, NODE_DY-2, - ""); - break; - - case SOCK_RGBA: - labelw= width - 40; - - bt=uiDefButR(block, COL, B_NODE_EXEC, "", - x, y+2, (labelw>0 ? 40 : width), NODE_DY-2, - &ptr, "default_value", 0, sock->ns.min, sock->ns.max, -1, -1, NULL); - if (cb) - uiButSetFunc(bt, cb, arg1, arg2); - - if (name[0]!='\0' && labelw>0) - uiDefBut(block, LABEL, 0, name, - x + 40, y+2, labelw, NODE_DY-2, - NULL, 0, 0, 0, 0, ""); - break; - } -} - static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeTree *ntree, bNode *node) { bNodeSocket *sock; @@ -809,13 +637,8 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN else UI_ThemeColor(TH_TEXT); */ - if (node->label[0]!='\0') - BLI_strncpy(showname, node->label, sizeof(showname)); - else if (node->typeinfo->labelfunc) - BLI_strncpy(showname, node->typeinfo->labelfunc(node), sizeof(showname)); - else - BLI_strncpy(showname, node->typeinfo->name, sizeof(showname)); - + BLI_strncpy(showname, nodeLabel(node), sizeof(showname)); + //if(node->flag & NODE_MUTED) // sprintf(showname, "[%s]", showname); @@ -855,37 +678,45 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN /* socket inputs, buttons */ for(sock= node->inputs.first; sock; sock= sock->next) { - if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) { - socket_circle_draw(sock, socket_size); - - if(node->block && sock->link==NULL) { - node_draw_socket_button(ntree, sock, sock->name, node->block, sock->locx+NODE_DYS, sock->locy-NODE_DYS, node->width-NODE_DY, node_sync_cb, snode, node); - } - else { - uiDefBut(node->block, LABEL, 0, sock->name, (short)(sock->locx+7), (short)(sock->locy-9.0f), - (short)(node->width-NODE_DY), NODE_DY, NULL, 0, 0, 0, 0, ""); - } + bNodeSocketType *stype= ntreeGetSocketType(sock->type); + + if(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)) + continue; + + node_socket_circle_draw(ntree, sock, NODE_SOCKSIZE); + + if (sock->link) { + uiDefBut(node->block, LABEL, 0, sock->name, sock->locx+NODE_DYS, sock->locy-NODE_DYS, node->width-NODE_DY, NODE_DY, + NULL, 0, 0, 0, 0, ""); + } + else { + if (stype->buttonfunc) + stype->buttonfunc(C, node->block, ntree, node, sock, sock->name, sock->locx+NODE_DYS, sock->locy-NODE_DYS, node->width-NODE_DY); } } /* socket outputs */ for(sock= node->outputs.first; sock; sock= sock->next) { - if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) { - float slen; - int ofs= 0; - - socket_circle_draw(sock, socket_size); - - UI_ThemeColor(TH_TEXT); - slen= snode->aspect*UI_GetStringWidth(sock->name); - while(slen > node->width) { - ofs++; - slen= snode->aspect*UI_GetStringWidth(sock->name+ofs); - } - - uiDefBut(node->block, LABEL, 0, sock->name+ofs, (short)(sock->locx-15.0f-slen), (short)(sock->locy-9.0f), - (short)(node->width-NODE_DY), NODE_DY, NULL, 0, 0, 0, 0, ""); + PointerRNA sockptr; + float slen; + int ofs; + + RNA_pointer_create((ID*)ntree, &RNA_NodeSocket, sock, &sockptr); + + if(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)) + continue; + + node_socket_circle_draw(ntree, sock, NODE_SOCKSIZE); + + ofs= 0; + UI_ThemeColor(TH_TEXT); + slen= snode->aspect*UI_GetStringWidth(sock->name); + while(slen > node->width) { + ofs++; + slen= snode->aspect*UI_GetStringWidth(sock->name+ofs); } + uiDefBut(node->block, LABEL, 0, sock->name+ofs, (short)(sock->locx-15.0f-slen), (short)(sock->locy-9.0f), + (short)(node->width-NODE_DY), NODE_DY, NULL, 0, 0, 0, 0, ""); } /* preview */ @@ -956,12 +787,7 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b UI_ThemeColor(TH_TEXT); if(node->miniwidth>0.0f) { - if (node->label[0]!='\0') - BLI_strncpy(showname, node->label, sizeof(showname)); - else if (node->typeinfo->labelfunc) - BLI_strncpy(showname, node->typeinfo->labelfunc(node), sizeof(showname)); - else - BLI_strncpy(showname, node->typeinfo->name, sizeof(showname)); + BLI_strncpy(showname, nodeLabel(node), sizeof(showname)); //if(node->flag & NODE_MUTED) // sprintf(showname, "[%s]", showname); @@ -984,12 +810,12 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b /* sockets */ for(sock= node->inputs.first; sock; sock= sock->next) { if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) - socket_circle_draw(sock, socket_size); + node_socket_circle_draw(snode->nodetree, sock, socket_size); } for(sock= node->outputs.first; sock; sock= sock->next) { if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) - socket_circle_draw(sock, socket_size); + node_socket_circle_draw(snode->nodetree, sock, socket_size); } uiEndBlock(C, node->block); @@ -997,7 +823,43 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b node->block= NULL; } -static void node_draw_nodetree(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeTree *ntree) +void node_draw_default(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeTree *ntree, bNode *node) +{ + if(node->flag & NODE_HIDDEN) + node_draw_hidden(C, ar, snode, node); + else + node_draw_basis(C, ar, snode, ntree, node); +} + +static void node_update(const bContext *C, bNodeTree *ntree, bNode *node) +{ + if (node->typeinfo->drawupdatefunc) + node->typeinfo->drawupdatefunc(C, ntree, node); +} + +void node_update_nodetree(const bContext *C, bNodeTree *ntree, float offsetx, float offsety) +{ + bNode *node; + + for(node= ntree->nodes.first; node; node= node->next) { + /* XXX little hack */ + node->locx += offsetx; + node->locy += offsety; + + node_update(C, ntree, node); + + node->locx -= offsetx; + node->locy -= offsety; + } +} + +static void node_draw(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeTree *ntree, bNode *node) +{ + if (node->typeinfo->drawfunc) + node->typeinfo->drawfunc(C, ar, snode, ntree, node); +} + +void node_draw_nodetree(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeTree *ntree) { bNode *node; bNodeLink *link; @@ -1013,212 +875,11 @@ static void node_draw_nodetree(const bContext *C, ARegion *ar, SpaceNode *snode, glDisable(GL_LINE_SMOOTH); glDisable(GL_BLEND); - /* not selected first */ - for(a=0, node= ntree->nodes.first; node; node= node->next, a++) { + /* draw nodes, last nodes in front */ + for(a=0, node= ntree->nodes.first; node; node=node->next, a++) { node->nr= a; /* index of node in list, used for exec event code */ - if(!(node->flag & SELECT)) { - if(node->flag & NODE_GROUP_EDIT); - else if(node->flag & NODE_HIDDEN) - node_draw_hidden(C, ar, snode, node); - else - node_draw_basis(C, ar, snode, ntree, node); - } + node_draw(C, ar, snode, ntree, node); } - - /* selected */ - for(node= ntree->nodes.first; node; node= node->next) { - if(node->flag & SELECT) { - if(node->flag & NODE_GROUP_EDIT); - else if(node->flag & NODE_HIDDEN) - node_draw_hidden(C, ar, snode, node); - else - node_draw_basis(C, ar, snode, ntree, node); - } - } -} - -static void group_verify_cb(bContext *UNUSED(C), void *UNUSED(snode_v), void *ngroup_v) -{ - bNodeTree *ngroup= (bNodeTree*)ngroup_v; - - nodeGroupVerify(ngroup); -} - -/* groups are, on creation, centered around 0,0 */ -static void node_draw_group(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeTree *ntree, bNode *gnode) -{ - bNodeTree *ngroup= (bNodeTree *)gnode->id; - bNodeSocket *sock; - uiLayout *layout; - PointerRNA ptr; - uiBut *bt; - rctf rect= gnode->totr; - float socket_size= NODE_SOCKSIZE*U.dpi/72; - float node_group_frame= U.dpi*NODE_GROUP_FRAME/72; - float group_header= 26*U.dpi/72; - float arrowbutw= 0.8f*UI_UNIT_X; - /* layout stuff for buttons on group left frame */ - float col1= 6, colw1= 0.6f*node_group_frame; - float col2= col1 + colw1+6; - float col3= node_group_frame - arrowbutw - 6; - /* layout stuff for buttons on group right frame */ - float cor1= 6; - float cor2= cor1 + arrowbutw + 6; - float cor3= cor2 + arrowbutw + 6, corw3= node_group_frame - cor3-6; - - int index; - - /* backdrop header */ - glEnable(GL_BLEND); - uiSetRoundBox(3); - UI_ThemeColorShadeAlpha(TH_NODE_GROUP, 0, -70); - uiDrawBox(GL_POLYGON, rect.xmin-node_group_frame, rect.ymax, rect.xmax+node_group_frame, rect.ymax+group_header, BASIS_RAD); - - /* backdrop body */ - UI_ThemeColorShadeAlpha(TH_BACK, -8, -70); - uiSetRoundBox(0); - uiDrawBox(GL_POLYGON, rect.xmin, rect.ymin, rect.xmax, rect.ymax, BASIS_RAD); - - /* input column */ - UI_ThemeColorShadeAlpha(TH_BACK, 10, -50); - uiSetRoundBox(8); - uiDrawBox(GL_POLYGON, rect.xmin-node_group_frame, rect.ymin, rect.xmin, rect.ymax, BASIS_RAD); - - /* output column */ - UI_ThemeColorShadeAlpha(TH_BACK, 10, -50); - uiSetRoundBox(4); - uiDrawBox(GL_POLYGON, rect.xmax, rect.ymin, rect.xmax+node_group_frame, rect.ymax, BASIS_RAD); - - /* input column separator */ - glColor4ub(200, 200, 200, 140); - glBegin(GL_LINES); - glVertex2f(rect.xmin, rect.ymin); - glVertex2f(rect.xmin, rect.ymax); - glEnd(); - - /* output column separator */ - glColor4ub(200, 200, 200, 140); - glBegin(GL_LINES); - glVertex2f(rect.xmax, rect.ymin); - glVertex2f(rect.xmax, rect.ymax); - glEnd(); - - /* group node outline */ - uiSetRoundBox(15); - glColor4ub(200, 200, 200, 140); - glEnable( GL_LINE_SMOOTH ); - uiDrawBox(GL_LINE_LOOP, rect.xmin-node_group_frame, rect.ymin, rect.xmax+node_group_frame, rect.ymax+group_header, BASIS_RAD); - glDisable( GL_LINE_SMOOTH ); - glDisable(GL_BLEND); - - /* backdrop title */ - UI_ThemeColor(TH_TEXT_HI); - - layout = uiBlockLayout(gnode->block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, (short)(rect.xmin+15), (short)(rect.ymax+group_header), - MIN2((int)(rect.xmax - rect.xmin-18.0f), node_group_frame+20), group_header, U.uistyles.first); - RNA_pointer_create(&ntree->id, &RNA_Node, gnode, &ptr); - uiTemplateIDBrowse(layout, (bContext*)C, &ptr, "node_tree", NULL, NULL, NULL); - uiBlockLayoutResolve(gnode->block, NULL, NULL); - - /* draw the internal tree nodes and links */ - node_draw_nodetree(C, ar, snode, ngroup); - - /* group sockets */ - for(sock=ngroup->inputs.first, index=0; sock; sock=sock->next, ++index) { - float locx= sock->locx - node_group_frame; - - socket_circle_draw(sock, socket_size); - /* small hack to use socket_circle_draw function with offset */ - sock->locx -= node_group_frame; - socket_circle_draw(sock, socket_size); - sock->locx += node_group_frame; - - bt = uiDefBut(gnode->block, TEX, 0, "", - locx+col1, sock->locy+1, colw1, NODE_DY, - sock->name, 0, 31, 0, 0, ""); - uiButSetFunc(bt, group_verify_cb, snode, ngroup); - - node_draw_socket_button(ngroup, sock, "", gnode->block, - locx+col1, sock->locy-NODE_DY, colw1, - NULL, NULL, NULL); - - uiBlockSetDirection(gnode->block, UI_TOP); - uiBlockBeginAlign(gnode->block); - bt = uiDefIconButO(gnode->block, BUT, "NODE_OT_group_socket_move_up", 0, ICON_TRIA_UP, - locx+col2, sock->locy, arrowbutw, arrowbutw, ""); - if (!sock->prev) - uiButSetFlag(bt, UI_BUT_DISABLED); - RNA_int_set(uiButGetOperatorPtrRNA(bt), "index", index); - RNA_enum_set(uiButGetOperatorPtrRNA(bt), "in_out", SOCK_IN); - bt = uiDefIconButO(gnode->block, BUT, "NODE_OT_group_socket_move_down", 0, ICON_TRIA_DOWN, - locx+col2, sock->locy-arrowbutw, arrowbutw, arrowbutw, ""); - if (!sock->next) - uiButSetFlag(bt, UI_BUT_DISABLED); - RNA_int_set(uiButGetOperatorPtrRNA(bt), "index", index); - RNA_enum_set(uiButGetOperatorPtrRNA(bt), "in_out", SOCK_IN); - uiBlockEndAlign(gnode->block); - uiBlockSetDirection(gnode->block, 0); - - uiBlockSetEmboss(gnode->block, UI_EMBOSSN); - bt = uiDefIconButO(gnode->block, BUT, "NODE_OT_group_socket_remove", 0, ICON_X, - locx+col3, sock->locy-0.5f*arrowbutw, arrowbutw, arrowbutw, ""); - RNA_int_set(uiButGetOperatorPtrRNA(bt), "index", index); - RNA_enum_set(uiButGetOperatorPtrRNA(bt), "in_out", SOCK_IN); - uiBlockSetEmboss(gnode->block, UI_EMBOSS); - } - - for(sock=ngroup->outputs.first, index=0; sock; sock=sock->next, ++index) { - float locx= sock->locx; - - socket_circle_draw(sock, socket_size); - /* small hack to use socket_circle_draw function with offset */ - sock->locx += node_group_frame; - socket_circle_draw(sock, socket_size); - sock->locx -= node_group_frame; - - uiBlockSetEmboss(gnode->block, UI_EMBOSSN); - bt = uiDefIconButO(gnode->block, BUT, "NODE_OT_group_socket_remove", 0, ICON_X, - locx+col1, sock->locy-0.5f*arrowbutw, arrowbutw, arrowbutw, ""); - RNA_int_set(uiButGetOperatorPtrRNA(bt), "index", index); - RNA_enum_set(uiButGetOperatorPtrRNA(bt), "in_out", SOCK_OUT); - uiBlockSetEmboss(gnode->block, UI_EMBOSS); - - uiBlockSetDirection(gnode->block, UI_TOP); - uiBlockBeginAlign(gnode->block); - bt = uiDefIconButO(gnode->block, BUT, "NODE_OT_group_socket_move_up", 0, ICON_TRIA_UP, - locx+cor2, sock->locy, arrowbutw, arrowbutw, ""); - if (!sock->prev) - uiButSetFlag(bt, UI_BUT_DISABLED); - RNA_int_set(uiButGetOperatorPtrRNA(bt), "index", index); - RNA_enum_set(uiButGetOperatorPtrRNA(bt), "in_out", SOCK_OUT); - bt = uiDefIconButO(gnode->block, BUT, "NODE_OT_group_socket_move_down", 0, ICON_TRIA_DOWN, - locx+cor2, sock->locy-arrowbutw, arrowbutw, arrowbutw, ""); - if (!sock->next) - uiButSetFlag(bt, UI_BUT_DISABLED); - RNA_int_set(uiButGetOperatorPtrRNA(bt), "index", index); - RNA_enum_set(uiButGetOperatorPtrRNA(bt), "in_out", SOCK_OUT); - uiBlockEndAlign(gnode->block); - uiBlockSetDirection(gnode->block, 0); - - if (sock->link) { - bt = uiDefBut(gnode->block, TEX, 0, "", - locx+cor3, sock->locy-NODE_DYS+1, corw3, NODE_DY, - sock->name, 0, 31, 0, 0, ""); - uiButSetFunc(bt, group_verify_cb, snode, ngroup); - } - else { - bt = uiDefBut(gnode->block, TEX, 0, "", - locx+cor3, sock->locy+1, corw3, NODE_DY, - sock->name, 0, 31, 0, 0, ""); - uiButSetFunc(bt, group_verify_cb, snode, ngroup); - - node_draw_socket_button(ngroup, sock, "", gnode->block, locx+cor3, sock->locy-NODE_DY, corw3, NULL, NULL, NULL); - } - } - - uiEndBlock(C, gnode->block); - uiDrawBlock(C, gnode->block); - gnode->block= NULL; } void drawnodespace(const bContext *C, ARegion *ar, View2D *v2d) @@ -1260,27 +921,19 @@ void drawnodespace(const bContext *C, ARegion *ar, View2D *v2d) if(node->flag & NODE_GROUP_EDIT) node_uiblocks_init(C, (bNodeTree *)node->id); } - + node_uiblocks_init(C, snode->nodetree); - - /* for now, we set drawing coordinates on each redraw */ - for(node= snode->nodetree->nodes.first; node; node= node->next) { - if(node->flag & NODE_GROUP_EDIT) - node_update_group(C, snode->nodetree, node); - else if(node->flag & NODE_HIDDEN) - node_update_hidden(node); - else - node_update(C, snode->nodetree, node); - } - + node_update_nodetree(C, snode->nodetree, 0.0f, 0.0f); node_draw_nodetree(C, ar, snode, snode->nodetree); - + + #if 0 /* active group */ for(node= snode->nodetree->nodes.first; node; node= node->next) { if(node->flag & NODE_GROUP_EDIT) node_draw_group(C, ar, snode, snode->nodetree, node); } + #endif } /* temporary links */ diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index 508cb82ee1b..214f375855d 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -40,9 +40,11 @@ #include "MEM_guardedalloc.h" +#include "DNA_ID.h" #include "DNA_object_types.h" #include "DNA_material_types.h" #include "DNA_node_types.h" +#include "DNA_particle_types.h" #include "DNA_scene_types.h" #include "BLI_math.h" @@ -58,11 +60,17 @@ #include "BKE_main.h" #include "BKE_node.h" #include "BKE_material.h" +#include "BKE_modifier.h" #include "BKE_paint.h" #include "BKE_screen.h" #include "BKE_texture.h" #include "BKE_report.h" + +#include "BLI_math.h" +#include "BLI_blenlib.h" +#include "BLI_storage_types.h" + #include "RE_pipeline.h" #include "IMB_imbuf_types.h" @@ -74,11 +82,13 @@ #include "RNA_access.h" #include "RNA_define.h" +#include "RNA_enum_types.h" #include "WM_api.h" #include "WM_types.h" #include "UI_interface.h" +#include "UI_resources.h" #include "UI_view2d.h" #include "IMB_imbuf.h" @@ -88,9 +98,9 @@ #include "node_intern.h" static EnumPropertyItem socket_in_out_items[] = { - { SOCK_IN, "IN", 0, "In", "" }, - { SOCK_OUT, "OUT", 0, "Out", "" }, - { 0, NULL, 0, NULL, NULL} + { SOCK_IN, "SOCK_IN", 0, "Input", "" }, + { SOCK_OUT, "SOCK_OUT", 0, "Output", "" }, + { 0, NULL, 0, NULL, NULL }, }; /* ***************** composite job manager ********************** */ @@ -227,7 +237,7 @@ static bNode *editnode_get_active(bNodeTree *ntree) /* check for edited group */ for(node= ntree->nodes.first; node; node= node->next) - if(node->flag & NODE_GROUP_EDIT) + if(nodeGroupEditGet(node)) break; if(node) return nodeGetActive((bNodeTree *)node->id); @@ -258,7 +268,7 @@ bNode *node_tree_get_editgroup(bNodeTree *nodetree) /* get the groupnode */ for(gnode= nodetree->nodes.first; gnode; gnode= gnode->next) - if(gnode->flag & NODE_GROUP_EDIT) + if(nodeGroupEditGet(gnode)) break; return gnode; } @@ -269,6 +279,7 @@ void ED_node_shader_default(Material *ma) { bNode *in, *out; bNodeSocket *fromsock, *tosock; + bNodeTemplate ntemp; /* but lets check it anyway */ if(ma->nodetree) { @@ -277,12 +288,14 @@ void ED_node_shader_default(Material *ma) return; } - ma->nodetree= ntreeAddTree("Shader Nodetree", NTREE_SHADER, FALSE); + ma->nodetree= ntreeAddTree("Shader Nodetree", NTREE_SHADER, 0); - out= nodeAddNodeType(ma->nodetree, SH_NODE_OUTPUT, NULL, NULL); + ntemp.type = SH_NODE_OUTPUT; + out= nodeAddNode(ma->nodetree, &ntemp); out->locx= 300.0f; out->locy= 300.0f; - in= nodeAddNodeType(ma->nodetree, SH_NODE_MATERIAL, NULL, NULL); + ntemp.type = SH_NODE_MATERIAL; + in= nodeAddNode(ma->nodetree, &ntemp); in->locx= 10.0f; in->locy= 300.0f; nodeSetActive(ma->nodetree, in); @@ -291,7 +304,7 @@ void ED_node_shader_default(Material *ma) tosock= out->inputs.first; nodeAddLink(ma->nodetree, in, fromsock, out, tosock); - ntreeSolveOrder(ma->nodetree); /* needed for pointers */ + ntreeUpdateTree(ma->nodetree); } /* assumes nothing being done in ntree yet, sets the default in/out node */ @@ -300,6 +313,7 @@ void ED_node_composit_default(Scene *sce) { bNode *in, *out; bNodeSocket *fromsock, *tosock; + bNodeTemplate ntemp; /* but lets check it anyway */ if(sce->nodetree) { @@ -308,14 +322,16 @@ void ED_node_composit_default(Scene *sce) return; } - sce->nodetree= ntreeAddTree("Compositing Nodetree", NTREE_COMPOSIT, FALSE); + sce->nodetree= ntreeAddTree("Compositing Nodetree", NTREE_COMPOSIT, 0); - out= nodeAddNodeType(sce->nodetree, CMP_NODE_COMPOSITE, NULL, NULL); + ntemp.type = CMP_NODE_COMPOSITE; + out= nodeAddNode(sce->nodetree, &ntemp); out->locx= 300.0f; out->locy= 400.0f; out->id= &sce->id; id_us_plus(out->id); - in= nodeAddNodeType(sce->nodetree, CMP_NODE_R_LAYERS, NULL, NULL); + ntemp.type = CMP_NODE_R_LAYERS; + in= nodeAddNode(sce->nodetree, &ntemp); in->locx= 10.0f; in->locy= 400.0f; in->id= &sce->id; id_us_plus(in->id); @@ -326,7 +342,7 @@ void ED_node_composit_default(Scene *sce) tosock= out->inputs.first; nodeAddLink(sce->nodetree, in, fromsock, out, tosock); - ntreeSolveOrder(sce->nodetree); /* needed for pointers */ + ntreeUpdateTree(sce->nodetree); // XXX ntreeCompositForceHidden(sce->nodetree); } @@ -337,6 +353,7 @@ void ED_node_texture_default(Tex *tx) { bNode *in, *out; bNodeSocket *fromsock, *tosock; + bNodeTemplate ntemp; /* but lets check it anyway */ if(tx->nodetree) { @@ -345,12 +362,14 @@ void ED_node_texture_default(Tex *tx) return; } - tx->nodetree= ntreeAddTree("Texture Nodetree", NTREE_TEXTURE, FALSE); + tx->nodetree= ntreeAddTree("Texture Nodetree", NTREE_TEXTURE, 0); - out= nodeAddNodeType(tx->nodetree, TEX_NODE_OUTPUT, NULL, NULL); + ntemp.type = TEX_NODE_OUTPUT; + out= nodeAddNode(tx->nodetree, &ntemp); out->locx= 300.0f; out->locy= 300.0f; - in= nodeAddNodeType(tx->nodetree, TEX_NODE_CHECKER, NULL, NULL); + ntemp.type = TEX_NODE_CHECKER; + in= nodeAddNode(tx->nodetree, &ntemp); in->locx= 10.0f; in->locy= 300.0f; nodeSetActive(tx->nodetree, in); @@ -358,43 +377,53 @@ void ED_node_texture_default(Tex *tx) tosock= out->inputs.first; nodeAddLink(tx->nodetree, in, fromsock, out, tosock); - ntreeSolveOrder(tx->nodetree); /* needed for pointers */ + ntreeUpdateTree(tx->nodetree); } /* id is supposed to contain a node tree */ void node_tree_from_ID(ID *id, bNodeTree **ntree, bNodeTree **edittree, int *treetype) { - bNode *node= NULL; - short idtype= GS(id->name); - - if(idtype == ID_MA) { - *ntree= ((Material*)id)->nodetree; - if(treetype) *treetype= NTREE_SHADER; - } - else if(idtype == ID_SCE) { - *ntree= ((Scene*)id)->nodetree; - if(treetype) *treetype= NTREE_COMPOSIT; - } - else if(idtype == ID_TE) { - *ntree= ((Tex*)id)->nodetree; - if(treetype) *treetype= NTREE_TEXTURE; + if (id) { + bNode *node= NULL; + short idtype= GS(id->name); + + if(idtype == ID_NT) { + *ntree= (bNodeTree*)id; + if(treetype) *treetype= (*ntree)->type; + } + else if(idtype == ID_MA) { + *ntree= ((Material*)id)->nodetree; + if(treetype) *treetype= NTREE_SHADER; + } + else if(idtype == ID_SCE) { + *ntree= ((Scene*)id)->nodetree; + if(treetype) *treetype= NTREE_COMPOSIT; + } + else if(idtype == ID_TE) { + *ntree= ((Tex*)id)->nodetree; + if(treetype) *treetype= NTREE_TEXTURE; + } + else { + if(treetype) *treetype= 0; + return; + } + + /* find editable group */ + if(edittree) { + if(*ntree) + for(node= (*ntree)->nodes.first; node; node= node->next) + if(nodeGroupEditGet(node)) + break; + + if(node && node->id) + *edittree= (bNodeTree *)node->id; + else + *edittree= *ntree; + } } else { + *ntree= NULL; if(treetype) *treetype= 0; - return; - } - - /* find editable group */ - if(edittree) { - if(*ntree) - for(node= (*ntree)->nodes.first; node; node= node->next) - if(node->flag & NODE_GROUP_EDIT) - break; - - if(node && node->id) - *edittree= (bNodeTree *)node->id; - else - *edittree= *ntree; } } @@ -403,8 +432,6 @@ void snode_set_context(SpaceNode *snode, Scene *scene) { Object *ob= OBACT; - snode->nodetree= NULL; - snode->edittree= NULL; snode->id= snode->from= NULL; if(snode->treetype==NTREE_SHADER) { @@ -418,7 +445,6 @@ void snode_set_context(SpaceNode *snode, Scene *scene) } } else if(snode->treetype==NTREE_COMPOSIT) { - snode->from= NULL; snode->id= &scene->id; /* bit clumsy but reliable way to see if we draw first time */ @@ -461,9 +487,14 @@ void snode_set_context(SpaceNode *snode, Scene *scene) } } } + else { + if (snode->nodetree && snode->nodetree->type == snode->treetype) + snode->id = &snode->nodetree->id; + else + snode->id = NULL; + } - if(snode->id) - node_tree_from_ID(snode->id, &snode->nodetree, &snode->edittree, NULL); + node_tree_from_ID(snode->id, &snode->nodetree, &snode->edittree, NULL); } static void snode_tag_changed(SpaceNode *snode, bNode *node) @@ -574,17 +605,199 @@ void ED_node_set_active(Main *bmain, bNodeTree *ntree, bNode *node) } } -/* when links in groups change, inputs/outputs change, nodes added/deleted... */ -void node_tree_verify_groups(bNodeTree *nodetree) +static int compare_nodes(bNode *a, bNode *b) { - bNode *gnode; + bNode *parent; - gnode= node_tree_get_editgroup(nodetree); + /* if one is an ancestor of the other */ + /* XXX there might be a better sorting algorithm for stable topological sort, this is O(n^2) worst case */ + for (parent = a->parent; parent; parent=parent->parent) { + if (parent==b) + return 1; + } + for (parent = b->parent; parent; parent=parent->parent) { + if (parent==a) + return 0; + } + + /* if one of the nodes is in the background and the other not */ + if ((a->flag & NODE_BACKGROUND) && !(b->typeinfo->flag & NODE_BACKGROUND)) + return 0; + else if (!(a->flag & NODE_BACKGROUND) && (b->typeinfo->flag & NODE_BACKGROUND)) + return 1; - /* does all materials */ - if(gnode) - nodeGroupVerify((bNodeTree *)gnode->id); + /* if one has a higher selection state (active > selected > nothing) */ + if (!(b->flag & NODE_ACTIVE) && (a->flag & NODE_ACTIVE)) + return 1; + else if (!(b->flag & NODE_SELECT) && ((a->flag & NODE_ACTIVE) || (a->flag & NODE_SELECT))) + return 1; + return 0; +} +/* Sorts nodes by selection: unselected nodes first, then selected, + * then the active node at the very end. Relative order is kept intact! + */ +void node_sort(bNodeTree *ntree) +{ + /* merge sort is the algorithm of choice here */ + bNode *first_a, *first_b, *node_a, *node_b, *tmp; + int totnodes= BLI_countlist(&ntree->nodes); + int k, a, b; + + k = 1; + while (k < totnodes) { + first_a = first_b = ntree->nodes.first; + + do { + /* setup first_b pointer */ + for (b=0; b < k && first_b; ++b) { + first_b = first_b->next; + } + /* all batches merged? */ + if (first_b==NULL) + break; + + /* merge batches */ + node_a = first_a; + node_b = first_b; + a = b = 0; + while (a < k && b < k && node_b) { + if (compare_nodes(node_a, node_b)==0) { + node_a = node_a->next; + ++a; + } + else { + tmp = node_b; + node_b = node_b->next; + ++b; + BLI_remlink(&ntree->nodes, tmp); + BLI_insertlinkbefore(&ntree->nodes, node_a, tmp); + } + } + + /* setup first pointers for next batch */ + first_b = node_b; + for (; b < k; ++b) { + /* all nodes sorted? */ + if (first_b==NULL) + break; + first_b = first_b->next; + } + first_a = first_b; + } while (first_b); + + k = k << 1; + } +} + +static int inside_rctf(rctf *bounds, rctf *rect) +{ + return (bounds->xmin <= rect->xmin && bounds->xmax >= rect->xmax + && bounds->ymin <= rect->ymin && bounds->ymax >= rect->ymax); +} + +static void node_frame_attach_nodes(bNodeTree *UNUSED(ntree), bNode *frame) +{ + bNode *node; + + /* only check nodes on top of the frame for attaching */ + for (node=frame->next; node; node=node->next) { + if (node->parent==frame) { + /* detach nodes that went outside the frame */ + if (!inside_rctf(&frame->totr, &node->totr)) + nodeDetachNode(node); + } + else if (node->flag & NODE_SELECT && node->parent==NULL) { + /* attach selected, still unparented nodes */ + if (inside_rctf(&frame->totr, &node->totr)) + nodeAttachNode(node, frame); + } + } +} + +void ED_node_update_hierarchy(bContext *UNUSED(C), bNodeTree *ntree) +{ + bNode *node; + + /* XXX This does not work due to layout functions relying on node->block, + * which only exists during actual drawing. Can we rely on valid totr rects? + */ + /* make sure nodes have correct bounding boxes after transform */ +// node_update_nodetree(C, ntree, 0.0f, 0.0f); + + /* all selected nodes are re-parented */ + for (node=ntree->nodes.last; node; node=node->prev) { + if (node->flag & NODE_SELECT && node->parent) + nodeDetachNode(node); + } + + /* update higher Z-level nodes first */ + for (node=ntree->nodes.last; node; node=node->prev) { + /* XXX callback? */ + if (node->type==NODE_FRAME) + node_frame_attach_nodes(ntree, node); + } +} + +/* ***************** generic operator functions for nodes ***************** */ + +static int edit_node_poll(bContext *C) +{ + return ED_operator_node_active(C); +} + +static void edit_node_properties(wmOperatorType *ot) +{ + /* XXX could node be a context pointer? */ + RNA_def_string(ot->srna, "node", "", 32, "Node", ""); + RNA_def_int(ot->srna, "socket", 0, 0, MAX_SOCKET, "Socket", "", 0, MAX_SOCKET); + RNA_def_enum(ot->srna, "in_out", socket_in_out_items, SOCK_IN, "Socket Side", ""); +} + +static int edit_node_invoke_properties(bContext *C, wmOperator *op) +{ + if (!RNA_property_is_set(op->ptr, "node")) { + bNode *node= CTX_data_pointer_get_type(C, "node", &RNA_Node).data; + if (!node) + return 0; + else + RNA_string_set(op->ptr, "node", node->name); + } + + if (!RNA_property_is_set(op->ptr, "in_out")) + RNA_enum_set(op->ptr, "in_out", SOCK_IN); + + if (!RNA_property_is_set(op->ptr, "socket")) + RNA_int_set(op->ptr, "socket", 0); + + return 1; +} + +static void edit_node_properties_get(wmOperator *op, bNodeTree *ntree, bNode **rnode, bNodeSocket **rsock, int *rin_out) +{ + bNode *node; + bNodeSocket *sock; + char nodename[32]; + int sockindex; + int in_out; + + RNA_string_get(op->ptr, "node", nodename); + node = nodeFindNodebyName(ntree, nodename); + + in_out = RNA_enum_get(op->ptr, "in_out"); + + sockindex = RNA_int_get(op->ptr, "socket"); + switch (in_out) { + case SOCK_IN: sock = BLI_findlink(&node->inputs, sockindex); break; + case SOCK_OUT: sock = BLI_findlink(&node->outputs, sockindex); break; + } + + if (rnode) + *rnode = node; + if (rsock) + *rsock = sock; + if (rin_out) + *rin_out = in_out; } /* ***************** Edit Group operator ************* */ @@ -594,8 +807,8 @@ void snode_make_group_editable(SpaceNode *snode, bNode *gnode) bNode *node; /* make sure nothing has group editing on */ - for(node= snode->nodetree->nodes.first; node; node= node->next) - node->flag &= ~NODE_GROUP_EDIT; + for(node=snode->nodetree->nodes.first; node; node=node->next) + nodeGroupEditClear(node); if(gnode==NULL) { /* with NULL argument we do a toggle */ @@ -603,34 +816,30 @@ void snode_make_group_editable(SpaceNode *snode, bNode *gnode) gnode= nodeGetActive(snode->nodetree); } - if(gnode && gnode->type==NODE_GROUP && gnode->id) { - if(gnode->id->lib) - ntreeMakeLocal((bNodeTree *)gnode->id); - - gnode->flag |= NODE_GROUP_EDIT; - snode->edittree= (bNodeTree *)gnode->id; + if (gnode) { + snode->edittree = nodeGroupEditSet(gnode, 1); /* deselect all other nodes, so we can also do grabbing of entire subtree */ for(node= snode->nodetree->nodes.first; node; node= node->next) node->flag &= ~SELECT; gnode->flag |= SELECT; - } else snode->edittree= snode->nodetree; - - ntreeSolveOrder(snode->nodetree); } static int node_group_edit_exec(bContext *C, wmOperator *UNUSED(op)) { SpaceNode *snode = CTX_wm_space_node(C); - bNode *gnode; ED_preview_kill_jobs(C); - gnode= nodeGetActive(snode->edittree); - snode_make_group_editable(snode, gnode); + if (snode->nodetree==snode->edittree) { + bNode *gnode= nodeGetActive(snode->nodetree); + snode_make_group_editable(snode, gnode); + } + else + snode_make_group_editable(snode, NULL); WM_event_add_notifier(C, NC_SCENE|ND_NODES, NULL); @@ -643,7 +852,8 @@ static int node_group_edit_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(e bNode *gnode; gnode= nodeGetActive(snode->edittree); - if(gnode && gnode->type==NODE_GROUP && gnode->id && gnode->id->lib) { + /* 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; } @@ -674,7 +884,7 @@ static int node_group_socket_add_exec(bContext *C, wmOperator *op) SpaceNode *snode = CTX_wm_space_node(C); int in_out= -1; char name[32]= ""; - int type= SOCK_VALUE; + int type= SOCK_FLOAT; bNodeTree *ngroup= snode->edittree; bNodeSocket *sock; @@ -691,9 +901,10 @@ static int node_group_socket_add_exec(bContext *C, wmOperator *op) else return OPERATOR_CANCELLED; - sock = nodeGroupAddSocket(ngroup, name, type, in_out); + /* using placeholder subtype first */ + sock = node_group_add_socket(ngroup, name, type, in_out); - node_tree_verify_groups(snode->nodetree); + ntreeUpdateTree(ngroup); snode_notify(C, snode); @@ -716,7 +927,7 @@ void NODE_OT_group_socket_add(wmOperatorType *ot) RNA_def_enum(ot->srna, "in_out", socket_in_out_items, SOCK_IN, "Socket Type", "Input or Output"); RNA_def_string(ot->srna, "name", "", 32, "Name", "Group socket name"); - RNA_def_enum(ot->srna, "type", node_socket_type_items, SOCK_VALUE, "Type", "Type of the group socket"); + RNA_def_enum(ot->srna, "type", node_socket_type_items, SOCK_FLOAT, "Type", "Type of the group socket"); } /* ***************** Remove Group Socket operator ************* */ @@ -743,8 +954,8 @@ static int node_group_socket_remove_exec(bContext *C, wmOperator *op) sock = (bNodeSocket*)BLI_findlink(in_out==SOCK_IN ? &ngroup->inputs : &ngroup->outputs, index); if (sock) { - nodeGroupRemoveSocket(ngroup, sock, in_out); - node_tree_verify_groups(snode->nodetree); + node_group_remove_socket(ngroup, sock, in_out); + ntreeUpdateTree(ngroup); snode_notify(C, snode); } @@ -801,6 +1012,8 @@ static int node_group_socket_move_up_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; BLI_remlink(&ngroup->inputs, sock); BLI_insertlinkbefore(&ngroup->inputs, prev, sock); + + ngroup->update |= NTREE_UPDATE_GROUP_IN; } else if (in_out==SOCK_OUT) { sock = (bNodeSocket*)BLI_findlink(&ngroup->outputs, index); @@ -810,8 +1023,10 @@ static int node_group_socket_move_up_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; BLI_remlink(&ngroup->outputs, sock); BLI_insertlinkbefore(&ngroup->outputs, prev, sock); + + ngroup->update |= NTREE_UPDATE_GROUP_OUT; } - node_tree_verify_groups(snode->nodetree); + ntreeUpdateTree(ngroup); snode_notify(C, snode); @@ -867,6 +1082,8 @@ static int node_group_socket_move_down_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; BLI_remlink(&ngroup->inputs, sock); BLI_insertlinkafter(&ngroup->inputs, next, sock); + + ngroup->update |= NTREE_UPDATE_GROUP_IN; } else if (in_out==SOCK_OUT) { sock = (bNodeSocket*)BLI_findlink(&ngroup->outputs, index); @@ -876,8 +1093,10 @@ static int node_group_socket_move_down_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; BLI_remlink(&ngroup->outputs, sock); BLI_insertlinkafter(&ngroup->outputs, next, sock); + + ngroup->update |= NTREE_UPDATE_GROUP_OUT; } - node_tree_verify_groups(snode->nodetree); + ntreeUpdateTree(ngroup); snode_notify(C, snode); @@ -924,7 +1143,7 @@ static int node_group_ungroup_exec(bContext *C, wmOperator *op) BKE_report(op->reports, RPT_WARNING, "Not a group"); return OPERATOR_CANCELLED; } - else if(!nodeGroupUnGroup(snode->edittree, gnode)) { + else if(!node_group_ungroup(snode->edittree, gnode)) { BKE_report(op->reports, RPT_WARNING, "Can't ungroup"); return OPERATOR_CANCELLED; } @@ -952,70 +1171,16 @@ void NODE_OT_group_ungroup(wmOperatorType *ot) /* ************************** Node generic ************** */ -/* allows to walk the list in order of visibility */ -bNode *next_node(bNodeTree *ntree) -{ - static bNode *current=NULL, *last= NULL; - - if(ntree) { - /* set current to the first selected node */ - for(current= ntree->nodes.last; current; current= current->prev) - if(current->flag & NODE_SELECT) - break; - - /* set last to the first unselected node */ - for(last= ntree->nodes.last; last; last= last->prev) - if((last->flag & NODE_SELECT)==0) - break; - - if(current==NULL) - current= last; - - return NULL; - } - /* no nodes, or we are ready */ - if(current==NULL) - return NULL; - - /* now we walk the list backwards, but we always return current */ - if(current->flag & NODE_SELECT) { - bNode *node= current; - - /* find previous selected */ - current= current->prev; - while(current && (current->flag & NODE_SELECT)==0) - current= current->prev; - - /* find first unselected */ - if(current==NULL) - current= last; - - return node; - } - else { - bNode *node= current; - - /* find previous unselected */ - current= current->prev; - while(current && (current->flag & NODE_SELECT)) - current= current->prev; - - return node; - } - - return NULL; -} - /* is rct in visible part of node? */ static bNode *visible_node(SpaceNode *snode, rctf *rct) { - bNode *tnode; + bNode *node; - for(next_node(snode->edittree); (tnode=next_node(NULL));) { - if(BLI_isect_rctf(&tnode->totr, rct, NULL)) + for(node=snode->edittree->nodes.last; node; node=node->prev) { + if(BLI_isect_rctf(&node->totr, rct, NULL)) break; } - return tnode; + return node; } /* **************************** */ @@ -1318,8 +1483,9 @@ void NODE_OT_backimage_sample(wmOperatorType *ot) /* ********************** size widget operator ******************** */ typedef struct NodeSizeWidget { - float mxstart; - float oldwidth; + float mxstart, mystart; + float oldwidth, oldheight; + float oldminiwidth; } NodeSizeWidget; static int node_resize_modal(bContext *C, wmOperator *op, wmEvent *event) @@ -1338,13 +1504,16 @@ static int node_resize_modal(bContext *C, wmOperator *op, wmEvent *event) if (node) { if(node->flag & NODE_HIDDEN) { - node->miniwidth= nsw->oldwidth + mx - nsw->mxstart; + node->miniwidth= nsw->oldminiwidth + mx - nsw->mxstart; CLAMP(node->miniwidth, 0.0f, 100.0f); } else { node->width= nsw->oldwidth + mx - nsw->mxstart; CLAMP(node->width, UI_DPI_FAC*node->typeinfo->minwidth, UI_DPI_FAC*node->typeinfo->maxwidth); } + /* height works the other way round ... */ + node->height= nsw->oldheight - my + nsw->mystart; + CLAMP(node->height, node->typeinfo->minheight, node->typeinfo->maxheight); } ED_region_tag_redraw(ar); @@ -1358,6 +1527,8 @@ static int node_resize_modal(bContext *C, wmOperator *op, wmEvent *event) MEM_freeN(nsw); op->customdata= NULL; + ED_node_update_hierarchy(C, snode->edittree); + return OPERATOR_FINISHED; } @@ -1371,35 +1542,21 @@ static int node_resize_invoke(bContext *C, wmOperator *op, wmEvent *event) bNode *node= editnode_get_active(snode->edittree); if(node) { - rctf totr; - /* convert mouse coordinates to v2d space */ UI_view2d_region_to_view(&ar->v2d, event->mval[0], event->mval[1], &snode->mx, &snode->my); - totr= node->totr; - - if(node->flag & NODE_HIDDEN) { - /* right part of node */ - totr.xmin= node->totr.xmax-20.0f; - } - else { - /* bottom right corner */ - totr.xmin= totr.xmax-10.0f; - totr.ymax= totr.ymin+10.0f; - } - - if(BLI_in_rctf(&totr, snode->mx, snode->my)) { + if(node->typeinfo->resize_area_func(node, snode->mx, snode->my)) { NodeSizeWidget *nsw= MEM_callocN(sizeof(NodeSizeWidget), "size widget op data"); op->customdata= nsw; nsw->mxstart= snode->mx; + nsw->mystart= snode->my; /* store old */ - if(node->flag & NODE_HIDDEN) - nsw->oldwidth= node->miniwidth; - else - nsw->oldwidth= node->width; + nsw->oldwidth= node->width; + nsw->oldheight= node->height; + nsw->oldminiwidth= node->miniwidth; /* add modal handler */ WM_event_add_modal_handler(C, op); @@ -1598,7 +1755,7 @@ static void node_link_viewer(SpaceNode *snode, bNode *tonode) link->fromnode= tonode; link->fromsock= sock; } - ntreeSolveOrder(snode->edittree); + ntreeUpdateTree(snode->edittree); snode_tag_changed(snode, node); } } @@ -1905,6 +2062,7 @@ void snode_autoconnect(SpaceNode *snode, int allow_multiple, int replace) ListBase *nodelist = MEM_callocN(sizeof(ListBase), "items_list"); bNodeListItem *nli; bNode *node; + bNodeLink *link; int i, numlinks=0; for(node= snode->edittree->nodes.first; node; node= node->next) { @@ -1941,7 +2099,15 @@ void snode_autoconnect(SpaceNode *snode, int allow_multiple, int replace) /* then we can connect */ if (replace) nodeRemSocketLinks(snode->edittree, sock_to); - nodeAddLink(snode->edittree, node_fr, sock_fr, node_to, sock_to); + + link = nodeAddLink(snode->edittree, node_fr, sock_fr, node_to, sock_to); + /* validate the new link */ + ntreeUpdateTree(snode->edittree); + if (!(link->flag & NODE_LINK_VALID)) { + nodeRemLink(snode->edittree, link); + continue; + } + snode_tag_changed(snode, node_to); ++numlinks; break; @@ -1949,8 +2115,7 @@ void snode_autoconnect(SpaceNode *snode, int allow_multiple, int replace) } if (numlinks > 0) { - node_tree_verify_groups(snode->nodetree); - ntreeSolveOrder(snode->edittree); + ntreeUpdateTree(snode->edittree); } BLI_freelistN(nodelist); @@ -1958,28 +2123,13 @@ void snode_autoconnect(SpaceNode *snode, int allow_multiple, int replace) } /* can be called from menus too, but they should do own undopush and redraws */ -bNode *node_add_node(SpaceNode *snode, Main *bmain, Scene *scene, int type, float locx, float locy) +bNode *node_add_node(SpaceNode *snode, Main *bmain, Scene *scene, bNodeTemplate *ntemp, float locx, float locy) { bNode *node= NULL, *gnode; node_deselectall(snode); - if(type>=NODE_DYNAMIC_MENU) { - node= nodeAddNodeType(snode->edittree, type, NULL, NULL); - } - else if(type>=NODE_GROUP_MENU) { - if(snode->edittree!=snode->nodetree) { - // XXX error("Can not add a Group in a Group"); - return NULL; - } - else { - bNodeTree *ngroup= BLI_findlink(&bmain->nodetree, type-NODE_GROUP_MENU); - if(ngroup) - node= nodeAddNodeType(snode->edittree, NODE_GROUP, ngroup, NULL); - } - } - else - node= nodeAddNodeType(snode->edittree, type, NULL, NULL); + node = nodeAddNode(snode->edittree, ntemp); /* generics */ if(node) { @@ -1993,7 +2143,7 @@ bNode *node_add_node(SpaceNode *snode, Main *bmain, Scene *scene, int type, floa node->locy -= gnode->locy; } - node_tree_verify_groups(snode->nodetree); + ntreeUpdateTree(snode->edittree); ED_node_set_active(bmain, snode->edittree, node); if(snode->nodetree->type==NTREE_COMPOSIT) { @@ -2025,6 +2175,7 @@ static int node_duplicate_exec(bContext *C, wmOperator *op) bNode *node, *newnode, *lastnode; bNodeLink *link, *newlink, *lastlink; int keep_inputs = RNA_boolean_get(op->ptr, "keep_inputs"); + bNodeSocket *sock; ED_preview_kill_jobs(C); @@ -2094,9 +2245,8 @@ static int node_duplicate_exec(bContext *C, wmOperator *op) break; } - ntreeSolveOrder(ntree); + ntreeUpdateTree(snode->edittree); - node_tree_verify_groups(snode->nodetree); snode_notify(C, snode); snode_dag_update(C, snode); @@ -2185,17 +2335,25 @@ static int node_link_modal(bContext *C, wmOperator *op, wmEvent *event) if( link->tosock!= tsock && (!tnode || (tnode!=node && link->tonode!=tnode)) ) { link->tonode= tnode; link->tosock= tsock; - if (link->prev==NULL && link->next==NULL) + if (link->prev==NULL && link->next==NULL) { BLI_addtail(&snode->edittree->links, link); - ntreeSolveOrder(snode->edittree); /* for interactive red line warning */ + } + + snode->edittree->update |= NTREE_UPDATE_LINKS; + ntreeUpdateTree(snode->edittree); } } } else { - BLI_remlink(&snode->edittree->links, link); - link->prev = link->next = NULL; - link->tonode= NULL; - link->tosock= NULL; + if (link->tonode || link->tosock) { + BLI_remlink(&snode->edittree->links, link); + link->prev = link->next = NULL; + link->tonode= NULL; + link->tosock= NULL; + + snode->edittree->update |= NTREE_UPDATE_LINKS; + ntreeUpdateTree(snode->edittree); + } } } else { @@ -2205,18 +2363,25 @@ static int node_link_modal(bContext *C, wmOperator *op, wmEvent *event) if( link->fromsock!= tsock && (!tnode || (tnode!=node && link->fromnode!=tnode)) ) { link->fromnode= tnode; link->fromsock= tsock; - if (link->prev==NULL && link->next==NULL) + if (link->prev==NULL && link->next==NULL) { BLI_addtail(&snode->edittree->links, link); - ntreeSolveOrder(snode->edittree); /* for interactive red line warning */ + } + + snode->edittree->update |= NTREE_UPDATE_LINKS; + ntreeUpdateTree(snode->edittree); } } } } else { - BLI_remlink(&snode->edittree->links, link); - link->prev = link->next = NULL; - link->fromnode= NULL; - link->fromsock= NULL; + if (link->tonode || link->tosock) { + BLI_remlink(&snode->edittree->links, link); + link->prev = link->next = NULL; + link->fromnode= NULL; + link->fromsock= NULL; + snode->edittree->update |= NTREE_UPDATE_LINKS; + ntreeUpdateTree(snode->edittree); + } } } /* hilight target sockets only */ @@ -2244,23 +2409,26 @@ static int node_link_modal(bContext *C, wmOperator *op, wmEvent *event) else if (outside_group_rect(snode) && (link->tonode || link->fromnode)) { /* automatically add new group socket */ if (link->tonode && link->tosock) { - link->fromsock = nodeGroupExposeSocket(snode->edittree, link->tosock, SOCK_IN); + link->fromsock = node_group_expose_socket(snode->edittree, link->tosock, SOCK_IN); link->fromnode = NULL; - if (link->prev==NULL && link->next==NULL) + if (link->prev==NULL && link->next==NULL) { BLI_addtail(&snode->edittree->links, link); + } + snode->edittree->update |= NTREE_UPDATE_GROUP_IN | NTREE_UPDATE_LINKS; } else if (link->fromnode && link->fromsock) { - link->tosock = nodeGroupExposeSocket(snode->edittree, link->fromsock, SOCK_OUT); + link->tosock = node_group_expose_socket(snode->edittree, link->fromsock, SOCK_OUT); link->tonode = NULL; - if (link->prev==NULL && link->next==NULL) + if (link->prev==NULL && link->next==NULL) { BLI_addtail(&snode->edittree->links, link); + } + snode->edittree->update |= NTREE_UPDATE_GROUP_OUT | NTREE_UPDATE_LINKS; } } else nodeRemLink(snode->edittree, link); - ntreeSolveOrder(snode->edittree); - node_tree_verify_groups(snode->nodetree); + ntreeUpdateTree(snode->edittree); snode_notify(C, snode); snode_dag_update(C, snode); @@ -2335,7 +2503,7 @@ static int node_link_invoke(bContext *C, wmOperator *op, wmEvent *event) ED_preview_kill_jobs(C); nldrag->in_out= node_link_init(snode, nldrag); - + if(nldrag->in_out) { op->customdata= nldrag; @@ -2408,7 +2576,7 @@ static int node_make_link_exec(bContext *C, wmOperator *op) snode_autoconnect(snode, 1, replace); - node_tree_verify_groups(snode->nodetree); + ntreeUpdateTree(snode->edittree); snode_notify(C, snode); snode_dag_update(C, snode); @@ -2482,8 +2650,7 @@ static int cut_links_exec(bContext *C, wmOperator *op) } } - ntreeSolveOrder(snode->edittree); - node_tree_verify_groups(snode->nodetree); + ntreeUpdateTree(snode->edittree); snode_notify(C, snode); snode_dag_update(C, snode); @@ -2608,7 +2775,7 @@ void ED_node_link_insert(ScrArea *sa) link->flag &= ~NODE_LINKFLAG_HILITE; nodeAddLink(snode->edittree, select, socket_best_match(&select->outputs, sockto->type), node, sockto); - ntreeSolveOrder(snode->edittree); /* needed for pointers */ + ntreeUpdateTree(snode->edittree); /* needed for pointers */ snode_tag_changed(snode, select); ED_node_changed_update(snode->id, select); } @@ -2819,14 +2986,14 @@ static int node_group_make_exec(bContext *C, wmOperator *op) ED_preview_kill_jobs(C); - gnode= nodeMakeGroupFromSelected(snode->nodetree); + gnode= node_group_make_from_selected(snode->nodetree); if(gnode==NULL) { BKE_report(op->reports, RPT_WARNING, "Can not make Group"); return OPERATOR_CANCELLED; } else { nodeSetActive(snode->nodetree, gnode); - ntreeSolveOrder(snode->nodetree); + ntreeUpdateTree(snode->nodetree); } snode_notify(C, snode); @@ -2972,7 +3139,7 @@ static int node_socket_toggle_exec(bContext *C, wmOperator *UNUSED(op)) } } - node_tree_verify_groups(snode->nodetree); + ntreeUpdateTree(snode->edittree); snode_notify(C, snode); @@ -3056,7 +3223,7 @@ static int node_delete_exec(bContext *C, wmOperator *UNUSED(op)) } } - node_tree_verify_groups(snode->nodetree); + ntreeUpdateTree(snode->edittree); snode_notify(C, snode); snode_dag_update(C, snode); @@ -3126,7 +3293,7 @@ static void node_delete_reconnect(bNodeTree* tree, bNode* node) deliveringvecsocket = link->fromsock; } break; - case SOCK_VALUE: + case SOCK_FLOAT: if (valsocket == NULL) { valsocket = link->tosock; deliveringvalnode = link->fromnode; @@ -3147,7 +3314,7 @@ static void node_delete_reconnect(bNodeTree* tree, bNode* node) numberOfConnectedOutputSockets ++; if (!first) first = link; switch(sock->type) { - case SOCK_VALUE: + case SOCK_FLOAT: if (deliveringvalsocket) { link->fromnode = deliveringvalnode; link->fromsock = deliveringvalsocket; @@ -3205,7 +3372,7 @@ static int node_delete_reconnect_exec(bContext *C, wmOperator *UNUSED(op)) } } - node_tree_verify_groups(snode->nodetree); + ntreeUpdateTree(snode->edittree); snode_notify(C, snode); snode_dag_update(C, snode); @@ -3235,7 +3402,7 @@ static int node_show_cycles_exec(bContext *C, wmOperator *UNUSED(op)) SpaceNode *snode= CTX_wm_space_node(C); /* this is just a wrapper around this call... */ - ntreeSolveOrder(snode->edittree); + ntreeUpdateTree(snode->nodetree); snode_notify(C, snode); return OPERATOR_FINISHED; @@ -3265,7 +3432,9 @@ static int node_add_file_exec(bContext *C, wmOperator *op) SpaceNode *snode= CTX_wm_space_node(C); bNode *node; Image *ima= NULL; - int ntype=0; + bNodeTemplate ntemp; + + ntemp.type = -1; /* check input variables */ if (RNA_property_is_set(op->ptr, "filepath")) @@ -3297,11 +3466,14 @@ static int node_add_file_exec(bContext *C, wmOperator *op) node_deselectall(snode); if (snode->nodetree->type==NTREE_COMPOSIT) - ntype = CMP_NODE_IMAGE; + ntemp.type = CMP_NODE_IMAGE; + if (ntemp.type < 0) + return OPERATOR_CANCELLED; + ED_preview_kill_jobs(C); - node = node_add_node(snode, bmain, scene, ntype, snode->mx, snode->my); + node = node_add_node(snode, bmain, scene, &ntemp, snode->mx, snode->my); if (!node) { BKE_report(op->reports, RPT_WARNING, "Could not add an image node."); @@ -3350,5 +3522,67 @@ void NODE_OT_add_file(wmOperatorType *ot) RNA_def_string(ot->srna, "name", "Image", 24, "Name", "Datablock name to assign."); } +/********************** New node tree operator *********************/ +static int new_node_tree_exec(bContext *C, wmOperator *op) +{ + SpaceNode *snode; + bNodeTree *ntree; + PointerRNA ptr, idptr; + PropertyRNA *prop; + int treetype; + char treename[MAX_ID_NAME-2] = "NodeTree"; + + /* retrieve state */ + snode= CTX_wm_space_node(C); + + if (RNA_property_is_set(op->ptr, "type")) + treetype = RNA_enum_get(op->ptr, "type"); + else + treetype = snode->treetype; + + if (RNA_property_is_set(op->ptr, "name")) + RNA_string_get(op->ptr, "name", treename); + + ntree = ntreeAddTree(treename, treetype, 0); + if(!ntree) + return OPERATOR_CANCELLED; + + /* hook into UI */ + uiIDContextProperty(C, &ptr, &prop); + if(prop) { + RNA_id_pointer_create(&ntree->id, &idptr); + RNA_property_pointer_set(&ptr, prop, idptr); + /* RNA_property_pointer_set increases the user count, + * fixed here as the editor is the initial user. + */ + --ntree->id.us; + RNA_property_update(C, &ptr, prop); + } + else if(snode) { + Scene *scene= CTX_data_scene(C); + snode->nodetree = ntree; + + ED_node_tree_update(snode, scene); + } + + return OPERATOR_FINISHED; +} + +void NODE_OT_new_node_tree(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "New node tree"; + ot->idname= "NODE_OT_new_node_tree"; + + /* api callbacks */ + ot->exec= new_node_tree_exec; + ot->poll= ED_operator_node_active; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + RNA_def_enum(ot->srna, "type", nodetree_type_items, NTREE_COMPOSIT, "Tree Type", ""); + RNA_def_string(ot->srna, "name", "NodeTree", MAX_ID_NAME-2, "Name", ""); +} diff --git a/source/blender/editors/space_node/node_header.c b/source/blender/editors/space_node/node_header.c index 634e49dc515..5c921d40344 100644 --- a/source/blender/editors/space_node/node_header.c +++ b/source/blender/editors/space_node/node_header.c @@ -45,24 +45,26 @@ #include "BLI_utildefines.h" #include "BKE_context.h" +#include "BKE_global.h" #include "BKE_screen.h" #include "BKE_node.h" #include "BKE_main.h" +#include "RNA_access.h" + #include "WM_api.h" #include "WM_types.h" - #include "UI_interface.h" -#include "UI_resources.h" #include "UI_interface_icons.h" +#include "UI_resources.h" #include "UI_view2d.h" #include "node_intern.h" /* ************************ add menu *********************** */ -static void do_node_add(bContext *C, void *UNUSED(arg), int event) +static void do_node_add(bContext *C, bNodeTemplate *ntemp) { Main *bmain= CTX_data_main(C); Scene *scene= CTX_data_scene(C); @@ -89,7 +91,7 @@ static void do_node_add(bContext *C, void *UNUSED(arg), int event) else node->flag &= ~NODE_TEST; } - node= node_add_node(snode, bmain, scene, event, snode->mx, snode->my); + node= node_add_node(snode, bmain, scene, ntemp, snode->mx, snode->my); /* select previous selection before autoconnect */ for(node= snode->edittree->nodes.first; node; node= node->next) { @@ -105,69 +107,111 @@ static void do_node_add(bContext *C, void *UNUSED(arg), int event) snode_dag_update(C, snode); } -static void node_auto_add_menu(bContext *C, uiLayout *layout, void *arg_nodeclass) +static void do_node_add_static(bContext *C, void *UNUSED(arg), int event) +{ + bNodeTemplate ntemp; + ntemp.type = event; + do_node_add(C, &ntemp); +} + +static void do_node_add_group(bContext *C, void *UNUSED(arg), int event) +{ + SpaceNode *snode= CTX_wm_space_node(C); + bNodeTemplate ntemp; + + if (event>=0) { + ntemp.ngroup= BLI_findlink(&G.main->nodetree, event); + ntemp.type = ntemp.ngroup->nodetype; + } + else { + ntemp.type = -event; + switch (ntemp.type) { + case NODE_GROUP: + ntemp.ngroup = ntreeAddTree("Group", snode->treetype, ntemp.type); + break; + case NODE_FORLOOP: + ntemp.ngroup = ntreeAddTree("For Loop", snode->treetype, ntemp.type); + break; + case NODE_WHILELOOP: + ntemp.ngroup = ntreeAddTree("While Loop", snode->treetype, ntemp.type); + break; + default: + ntemp.ngroup = NULL; + } + } + if (!ntemp.ngroup) + return; + + do_node_add(C, &ntemp); +} + +#if 0 /* disabled */ +static void do_node_add_dynamic(bContext *C, void *UNUSED(arg), int event) +{ + bNodeTemplate ntemp; + ntemp.type = NODE_DYNAMIC; + do_node_add(C, &ntemp); +} +#endif + +static int node_tree_has_type(int treetype, int nodetype) +{ + bNodeTreeType *ttype= ntreeGetType(treetype); + bNodeType *ntype; + for (ntype=ttype->node_types.first; ntype; ntype=ntype->next) { + if (ntype->type==nodetype) + return 1; + } + return 0; +} + +static void node_add_menu(bContext *C, uiLayout *layout, void *arg_nodeclass) { Main *bmain= CTX_data_main(C); SpaceNode *snode= CTX_wm_space_node(C); bNodeTree *ntree; int nodeclass= GET_INT_FROM_POINTER(arg_nodeclass); - int tot= 0, a; + int event; ntree = snode->nodetree; - + if(!ntree) { uiItemS(layout); return; } - - /* mostly taken from toolbox.c, node_add_sublevel() */ - if(nodeclass==NODE_CLASS_GROUP) { - bNodeTree *ngroup= bmain->nodetree.first; - for(; ngroup; ngroup= ngroup->id.next) - if(ngroup->type==ntree->type) - tot++; - } - else { - bNodeType *type = ntree->alltypes.first; - while(type) { - if(type->nclass == nodeclass) - tot++; - type= type->next; - } - } - if(tot==0) { + if (nodeclass==NODE_CLASS_GROUP) { + bNodeTree *ngroup; + + uiLayoutSetFunc(layout, do_node_add_group, NULL); + + /* XXX hack: negative numbers used for empty group types */ + if (node_tree_has_type(ntree->type, NODE_GROUP)) + uiItemV(layout, "New Group", 0, -NODE_GROUP); + if (node_tree_has_type(ntree->type, NODE_FORLOOP)) + uiItemV(layout, "New For Loop", 0, -NODE_FORLOOP); + if (node_tree_has_type(ntree->type, NODE_WHILELOOP)) + uiItemV(layout, "New While Loop", 0, -NODE_WHILELOOP); uiItemS(layout); - return; - } - - uiLayoutSetFunc(layout, do_node_add, NULL); - - if(nodeclass==NODE_CLASS_GROUP) { - bNodeTree *ngroup= bmain->nodetree.first; - - for(tot=0, a=0; ngroup; ngroup= ngroup->id.next, tot++) { - if(ngroup->type==ntree->type) { - uiItemV(layout, ngroup->id.name+2, ICON_NONE, NODE_GROUP_MENU+tot); - a++; + + for(ngroup=bmain->nodetree.first, event=0; ngroup; ngroup= ngroup->id.next, ++event) { + /* only use group trees */ + if (ngroup->type==ntree->type && ELEM3(ngroup->nodetype, NODE_GROUP, NODE_FORLOOP, NODE_WHILELOOP)) { + uiItemV(layout, ngroup->id.name+2, 0, event); } } } + else if (nodeclass==NODE_DYNAMIC) { + /* disabled */ + } else { - bNodeType *type; - int script=0; - - for(a=0, type= ntree->alltypes.first; type; type=type->next) { - if(type->nclass == nodeclass && type->name) { - if(type->type == NODE_DYNAMIC) { - uiItemV(layout, type->name, ICON_NONE, NODE_DYNAMIC_MENU+script); - script++; - } - else - uiItemV(layout, type->name, ICON_NONE, type->type); - - a++; - } + bNodeType *ntype; + + uiLayoutSetFunc(layout, do_node_add_static, NULL); + + for (ntype=ntreeGetType(ntree->type)->node_types.first; ntype; ntype=ntype->next) { + if(ntype->nclass==nodeclass && ntype->name) + uiItemV(layout, ntype->name, 0, ntype->type); } } } @@ -181,34 +225,34 @@ static void node_menu_add(const bContext *C, Menu *menu) uiLayoutSetActive(layout, 0); if(snode->treetype==NTREE_SHADER) { - uiItemMenuF(layout, "Input", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_INPUT)); - uiItemMenuF(layout, "Output", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OUTPUT)); - uiItemMenuF(layout, "Color", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_COLOR)); - uiItemMenuF(layout, "Vector", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_VECTOR)); - uiItemMenuF(layout, "Convertor", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_CONVERTOR)); - uiItemMenuF(layout, "Group", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_GROUP)); - uiItemMenuF(layout, "Dynamic", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_DYNAMIC)); + uiItemMenuF(layout, "Input", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_INPUT)); + uiItemMenuF(layout, "Output", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OUTPUT)); + uiItemMenuF(layout, "Color", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_COLOR)); + uiItemMenuF(layout, "Vector", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_VECTOR)); + uiItemMenuF(layout, "Convertor", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_CONVERTOR)); + uiItemMenuF(layout, "Group", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_GROUP)); + uiItemMenuF(layout, "Dynamic", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_DYNAMIC)); } else if(snode->treetype==NTREE_COMPOSIT) { - uiItemMenuF(layout, "Input", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_INPUT)); - uiItemMenuF(layout, "Output", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OUTPUT)); - uiItemMenuF(layout, "Color", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_COLOR)); - uiItemMenuF(layout, "Vector", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_VECTOR)); - uiItemMenuF(layout, "Filter", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_FILTER)); - uiItemMenuF(layout, "Convertor", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_CONVERTOR)); - uiItemMenuF(layout, "Matte", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_MATTE)); - uiItemMenuF(layout, "Distort", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_DISTORT)); - uiItemMenuF(layout, "Group", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_GROUP)); + uiItemMenuF(layout, "Input", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_INPUT)); + uiItemMenuF(layout, "Output", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OUTPUT)); + uiItemMenuF(layout, "Color", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_COLOR)); + uiItemMenuF(layout, "Vector", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_VECTOR)); + uiItemMenuF(layout, "Filter", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_FILTER)); + uiItemMenuF(layout, "Convertor", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_CONVERTOR)); + uiItemMenuF(layout, "Matte", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_MATTE)); + uiItemMenuF(layout, "Distort", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_DISTORT)); + uiItemMenuF(layout, "Group", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_GROUP)); } else if(snode->treetype==NTREE_TEXTURE) { - uiItemMenuF(layout, "Input", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_INPUT)); - uiItemMenuF(layout, "Output", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OUTPUT)); - uiItemMenuF(layout, "Color", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_COLOR)); - uiItemMenuF(layout, "Patterns", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_PATTERN)); - uiItemMenuF(layout, "Textures", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_TEXTURE)); - uiItemMenuF(layout, "Convertor", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_CONVERTOR)); - uiItemMenuF(layout, "Distort", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_DISTORT)); - uiItemMenuF(layout, "Group", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_GROUP)); + uiItemMenuF(layout, "Input", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_INPUT)); + uiItemMenuF(layout, "Output", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OUTPUT)); + uiItemMenuF(layout, "Color", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_COLOR)); + uiItemMenuF(layout, "Patterns", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_PATTERN)); + uiItemMenuF(layout, "Textures", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_TEXTURE)); + uiItemMenuF(layout, "Convertor", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_CONVERTOR)); + uiItemMenuF(layout, "Distort", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_DISTORT)); + uiItemMenuF(layout, "Group", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_GROUP)); } } diff --git a/source/blender/editors/space_node/node_intern.h b/source/blender/editors/space_node/node_intern.h index 4cfde22b8a0..3751d8efae8 100644 --- a/source/blender/editors/space_node/node_intern.h +++ b/source/blender/editors/space_node/node_intern.h @@ -33,6 +33,8 @@ #ifndef ED_NODE_INTERN_H #define ED_NODE_INTERN_H +#include "UI_interface.h" + /* internal exports only */ struct ARegion; @@ -40,6 +42,7 @@ struct ARegionType; struct View2D; struct bContext; struct wmWindowManager; +struct bNodeTemplate; struct bNode; struct bNodeSocket; struct bNodeLink; @@ -64,6 +67,11 @@ void node_header_buttons(const bContext *C, ARegion *ar); void node_menus_register(void); /* node_draw.c */ +void node_socket_circle_draw(struct bNodeTree *ntree, struct bNodeSocket *sock, float size); +void node_draw_default(const struct bContext *C, struct ARegion *ar, struct SpaceNode *snode, struct bNodeTree *ntree, struct bNode *node); +void node_update_default(const struct bContext *C, struct bNodeTree *ntree, struct bNode *node); +void node_update_nodetree(const struct bContext *C, struct bNodeTree *ntree, float offsetx, float offsety); +void node_draw_nodetree(const struct bContext *C, struct ARegion *ar, struct SpaceNode *snode, struct bNodeTree *ntree); void drawnodespace(const bContext *C, ARegion *ar, View2D *v2d); /* node_buttons.c */ @@ -90,6 +98,7 @@ void NODE_OT_select_same_type_prev(wmOperatorType *ot); void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link); void node_draw_link_bezier(View2D *v2d, SpaceNode *snode, bNodeLink *link, int th_col1, int do_shaded, int th_col2, int do_triple, int th_col3 ); int node_link_bezier_points(View2D *v2d, SpaceNode *snode, bNodeLink *link, float coord_array[][2], int resol); +void node_draw_link_straight(View2D *v2d, SpaceNode *snode, bNodeLink *link, int th_col1, int do_shaded, int th_col2, int do_triple, int th_col3 ); void draw_nodespace_back_pix(ARegion *ar, SpaceNode *snode, int color_manage); void draw_nodespace_color_info(struct ARegion *ar, int color_manage, int channels, int x, int y, char *cp, float *fp); @@ -97,10 +106,10 @@ void draw_nodespace_color_info(struct ARegion *ar, int color_manage, int channel void node_tree_from_ID(ID *id, bNodeTree **ntree, bNodeTree **edittree, int *treetype); void snode_notify(bContext *C, SpaceNode *snode); void snode_dag_update(bContext *C, SpaceNode *snode); -bNode *next_node(bNodeTree *ntree); -bNode *node_add_node(SpaceNode *snode, struct Main *bmain, Scene *scene, int type, float locx, float locy); +bNode *node_add_node(struct SpaceNode *snode, struct Main *bmain, struct Scene *scene, struct bNodeTemplate *ntemp, float locx, float locy); void snode_set_context(SpaceNode *snode, Scene *scene); void snode_make_group_editable(SpaceNode *snode, bNode *gnode); +void node_sort(struct bNodeTree *ntree); void node_deselectall(SpaceNode *snode); int node_select_same_type(SpaceNode *snode); int node_select_same_type_np(SpaceNode *snode, int dir); @@ -146,6 +155,8 @@ void NODE_OT_backimage_sample(wmOperatorType *ot); void NODE_OT_add_file(struct wmOperatorType *ot); +void NODE_OT_new_node_tree(struct wmOperatorType *ot); + extern const char *node_context_dir[]; // XXXXXX diff --git a/source/blender/editors/space_node/node_ops.c b/source/blender/editors/space_node/node_ops.c index 4bb0283690b..153d703ddf6 100644 --- a/source/blender/editors/space_node/node_ops.c +++ b/source/blender/editors/space_node/node_ops.c @@ -96,6 +96,8 @@ void node_operatortypes(void) WM_operatortype_append(NODE_OT_backimage_sample); WM_operatortype_append(NODE_OT_add_file); + + WM_operatortype_append(NODE_OT_new_node_tree); } void ED_operatormacros_node(void) @@ -193,6 +195,5 @@ void node_keymap(struct wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "NODE_OT_read_fullsamplelayers", RKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "NODE_OT_render_changed", ZKEY, KM_PRESS, 0, 0); - transform_keymap_for_space(keyconf, keymap, SPACE_NODE); } diff --git a/source/blender/editors/space_node/node_select.c b/source/blender/editors/space_node/node_select.c index ca673277739..3d8b1676ea5 100644 --- a/source/blender/editors/space_node/node_select.c +++ b/source/blender/editors/space_node/node_select.c @@ -62,7 +62,7 @@ static bNode *node_under_mouse(bNodeTree *ntree, int mx, int my) { bNode *node; - for(next_node(ntree); (node=next_node(NULL));) { + for(node=ntree->nodes.last; node; node=node->prev) { /* node body (header and scale are in other operators) */ if (BLI_in_rctf(&node->totr, mx, my)) return node; @@ -93,8 +93,10 @@ static bNode *node_mouse_select(Main *bmain, SpaceNode *snode, ARegion *ar, cons } else node->flag ^= SELECT; - + ED_node_set_active(bmain, snode->edittree, node); + + node_sort(snode->edittree); } return node; @@ -182,6 +184,8 @@ static int node_borderselect_exec(bContext *C, wmOperator *op) } } + node_sort(snode->edittree); + WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL); return OPERATOR_FINISHED; @@ -252,6 +256,8 @@ static int node_select_all_exec(bContext *C, wmOperator *UNUSED(op)) node->flag |= NODE_SELECT; } + node_sort(snode->edittree); + WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL); return OPERATOR_FINISHED; } @@ -292,6 +298,8 @@ static int node_select_linked_to_exec(bContext *C, wmOperator *UNUSED(op)) node->flag |= NODE_SELECT; } + node_sort(snode->edittree); + WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL); return OPERATOR_FINISHED; } @@ -332,6 +340,8 @@ static int node_select_linked_from_exec(bContext *C, wmOperator *UNUSED(op)) node->flag |= NODE_SELECT; } + node_sort(snode->edittree); + WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL); return OPERATOR_FINISHED; } @@ -358,6 +368,9 @@ static int node_select_same_type_exec(bContext *C, wmOperator *UNUSED(op)) SpaceNode *snode = CTX_wm_space_node(C); node_select_same_type(snode); + + node_sort(snode->edittree); + WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL); return OPERATOR_FINISHED; } @@ -384,7 +397,11 @@ static int node_select_same_type_next_exec(bContext *C, wmOperator *UNUSED(op)) SpaceNode *snode = CTX_wm_space_node(C); node_select_same_type_np(snode, 0); + + node_sort(snode->edittree); + WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL); + return OPERATOR_FINISHED; } @@ -408,6 +425,9 @@ static int node_select_same_type_prev_exec(bContext *C, wmOperator *UNUSED(op)) SpaceNode *snode = CTX_wm_space_node(C); node_select_same_type_np(snode, 1); + + node_sort(snode->edittree); + WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL); return OPERATOR_FINISHED; } diff --git a/source/blender/editors/space_node/node_state.c b/source/blender/editors/space_node/node_state.c index 601ffbd313d..c4567bea648 100644 --- a/source/blender/editors/space_node/node_state.c +++ b/source/blender/editors/space_node/node_state.c @@ -69,30 +69,14 @@ void node_set_hidden_sockets(SpaceNode *snode, bNode *node, int set) sock->flag &= ~SOCK_HIDDEN; } else { - bNode *gnode= node_tree_get_editgroup(snode->nodetree); - - /* hiding inside group should not break links in other group users */ - if(gnode) { - nodeGroupSocketUseFlags((bNodeTree *)gnode->id); - for(sock= node->inputs.first; sock; sock= sock->next) - if(!(sock->flag & SOCK_IN_USE)) - if(sock->link==NULL) - sock->flag |= SOCK_HIDDEN; - for(sock= node->outputs.first; sock; sock= sock->next) - if(!(sock->flag & SOCK_IN_USE)) - if(nodeCountSocketLinks(snode->edittree, sock)==0) - sock->flag |= SOCK_HIDDEN; + /* hide unused sockets */ + for(sock= node->inputs.first; sock; sock= sock->next) { + if(sock->link==NULL) + sock->flag |= SOCK_HIDDEN; } - else { - /* hide unused sockets */ - for(sock= node->inputs.first; sock; sock= sock->next) { - if(sock->link==NULL) - sock->flag |= SOCK_HIDDEN; - } - for(sock= node->outputs.first; sock; sock= sock->next) { - if(nodeCountSocketLinks(snode->edittree, sock)==0) - sock->flag |= SOCK_HIDDEN; - } + for(sock= node->outputs.first; sock; sock= sock->next) { + if(nodeCountSocketLinks(snode->edittree, sock)==0) + sock->flag |= SOCK_HIDDEN; } } } @@ -100,7 +84,7 @@ void node_set_hidden_sockets(SpaceNode *snode, bNode *node, int set) static void node_hide_unhide_sockets(SpaceNode *snode, bNode *node) { node_set_hidden_sockets(snode, node, !node_has_hidden_sockets(node)); - node_tree_verify_groups(snode->nodetree); + ntreeUpdateTree(snode->edittree); } static int do_header_node(SpaceNode *snode, bNode *node, float mx, float my) @@ -168,7 +152,7 @@ static int node_toggle_visibility(SpaceNode *snode, ARegion *ar, const int mval[ UI_view2d_region_to_view(&ar->v2d, mval[0], mval[1], &mx, &my); - for(next_node(snode->edittree); (node=next_node(NULL));) { + for(node=snode->edittree->nodes.last; node; node=node->prev) { if(node->flag & NODE_HIDDEN) { if(do_header_hidden_node(node, mx, my)) { ED_region_tag_redraw(ar); diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c index 3c5f4a163a2..0990afa4fe6 100644 --- a/source/blender/editors/space_node/space_node.c +++ b/source/blender/editors/space_node/space_node.c @@ -439,14 +439,30 @@ static int node_context(const bContext *C, const char *member, bContextDataResul else if(CTX_data_equals(member, "selected_nodes")) { bNode *node; - for(next_node(snode->edittree); (node=next_node(NULL));) { - if(node->flag & NODE_SELECT) { - CTX_data_list_add(result, &snode->edittree->id, &RNA_Node, node); + if(snode->edittree) { + for(node=snode->edittree->nodes.last; node; node=node->prev) { + if(node->flag & NODE_SELECT) { + CTX_data_list_add(result, &snode->edittree->id, &RNA_Node, node); + } } } CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); return 1; } + else if(CTX_data_equals(member, "active_node")) { + bNode *node; + + if(snode->edittree) { + for(node=snode->edittree->nodes.last; node; node=node->prev) { + if(node->flag & NODE_ACTIVE) { + CTX_data_pointer_set(result, &snode->edittree->id, &RNA_Node, node); + break; + } + } + } + CTX_data_type_set(result, CTX_DATA_TYPE_POINTER); + return 1; + } return 0; } diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index 7b43d0955a7..cae64899aeb 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -4771,12 +4771,14 @@ void special_aftertrans_update(bContext *C, TransInfo *t) } else if (t->spacetype == SPACE_NODE) { + SpaceNode *snode= (SpaceNode *)t->sa->spacedata.first; + ED_node_update_hierarchy(C, snode->edittree); + if(cancelled == 0) ED_node_link_insert(t->sa); /* clear link line */ ED_node_link_intersect_test(t->sa, 0); - } else if (t->spacetype == SPACE_ACTION) { SpaceAction *saction= (SpaceAction *)t->sa->spacedata.first; @@ -5194,6 +5196,11 @@ static void NodeToTransData(TransData *td, TransData2D *td2d, bNode *node) td2d->loc2d = &node->locx; /* current location */ td->flag = 0; + /* exclude nodes whose parent is also transformed */ + if (node->parent && (node->parent->flag & NODE_TRANSFORM)) { + td->flag |= TD_SKIP; + } + td->loc = td2d->loc; VECCOPY(td->center, td->loc); VECCOPY(td->iloc, td->loc); @@ -5214,6 +5221,16 @@ static void createTransNodeData(bContext *C, TransInfo *t) { TransData *td; TransData2D *td2d; + SpaceNode *snode= t->sa->spacedata.first; + bNode *node; + + /* set transform flags on nodes */ + for (node=snode->edittree->nodes.first; node; node=node->next) { + if ((node->flag & NODE_SELECT) || (node->parent && (node->parent->flag & NODE_TRANSFORM))) + node->flag |= NODE_TRANSFORM; + else + node->flag &= ~NODE_TRANSFORM; + } t->total= CTX_DATA_COUNT(C, selected_nodes); diff --git a/source/blender/gpu/SConscript b/source/blender/gpu/SConscript index b48e1d5a8e2..adb52d577a1 100644 --- a/source/blender/gpu/SConscript +++ b/source/blender/gpu/SConscript @@ -5,7 +5,7 @@ sources = env.Glob('intern/*.c') defs = [ 'GLEW_STATIC' ] -incs = '../blenlib ../blenkernel ../makesdna ../include ../blenloader' +incs = '../blenlib ../blenkernel ../makesdna ../makesrna ../include ../blenloader' incs += ' #/extern/glew/include #intern/guardedalloc #intern/smoke/extern ../imbuf .' if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'): diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index efaf30b02f6..3a51a6a56a4 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -38,26 +38,29 @@ #include "DNA_vec_types.h" #include "DNA_listBase.h" +struct ID; struct ListBase; struct SpaceNode; struct bNodeLink; struct bNodeType; -struct bNodeGroup; +struct bNodeTreeExec; struct AnimData; struct bGPdata; struct uiBlock; #define NODE_MAXSTR 32 - typedef struct bNodeStack { float vec[4]; - float min, max; /* min/max for values (UI writes it, execute might use it) */ + float min, max; void *data; short hasinput; /* when input has link, tagged before executing */ short hasoutput; /* when output is linked, tagged before executing */ short datatype; /* type of data pointer */ short sockettype; /* type of socket stack comes from, to remap linking different sockets */ + short is_copy; /* data is a copy of external data (no freeing) */ + short external; /* data is used by external nodes (no freeing) */ + short pad[2]; } bNodeStack; /* ns->datatype, shadetree only */ @@ -68,50 +71,58 @@ typedef struct bNodeSocket { struct bNodeSocket *next, *prev, *new_sock; char name[32]; - bNodeStack ns; /* custom data for inputs, only UI writes in this */ + + void *storage; /* custom storage */ short type, flag; short limit; /* max. number of links */ - - /* stack data info (only during execution!) */ - short stack_type; /* type of stack reference */ - /* XXX only one of stack_ptr or stack_index is used (depending on stack_type). - * could store the index in the pointer with SET_INT_IN_POINTER (a bit ugly). - * (union won't work here, not supported by DNA) - */ - struct bNodeStack *stack_ptr; /* constant input value */ - short stack_index; /* local stack index or external input number */ short pad1; float locx, locy; + void *default_value; /* default input value used for unlinked sockets */ + + /* execution data */ + short stack_index; /* local stack index */ + short pad2; + int pad3; + void *cache; /* cached data from execution */ + /* internal data to retrieve relations and groups */ - int own_index; /* group socket identifiers, to find matching pairs after reading files */ - struct bNodeSocket *groupsock; int to_index; /* XXX deprecated, only used for restoring old group node links */ - int pad2; + struct bNodeSocket *groupsock; - struct bNodeLink *link; /* a link pointer, set in nodeSolveOrder() */ + struct bNodeLink *link; /* a link pointer, set in ntreeUpdateTree */ + + /* DEPRECATED only needed for do_versions */ + bNodeStack ns; /* custom data for inputs, only UI writes in this */ } bNodeSocket; /* sock->type */ -#define SOCK_VALUE 0 -#define SOCK_VECTOR 1 -#define SOCK_RGBA 2 +#define SOCK_FLOAT 0 +#define SOCK_VECTOR 1 +#define SOCK_RGBA 2 +#define SOCK_INT 3 +#define SOCK_BOOLEAN 4 +#define SOCK_MESH 5 +#define NUM_SOCKET_TYPES 6 /* must be last! */ + +/* socket side (input/output) */ +#define SOCK_IN 1 +#define SOCK_OUT 2 /* sock->flag, first bit is select */ - /* hidden is user defined, to hide unused */ + /* hidden is user defined, to hide unused */ #define SOCK_HIDDEN 2 - /* only used now for groups... */ -#define SOCK_IN_USE 4 - /* unavailable is for dynamic sockets */ + /* only used now for groups... */ +#define SOCK_IN_USE 4 /* XXX deprecated */ + /* unavailable is for dynamic sockets */ #define SOCK_UNAVAIL 8 - -/* sock->stack_type */ -#define SOCK_STACK_LOCAL 1 /* part of the local tree stack */ -#define SOCK_STACK_EXTERN 2 /* use input stack pointer */ -#define SOCK_STACK_CONST 3 /* use pointer to constant input value */ + /* dynamic socket (can be modified by user) */ +#define SOCK_DYNAMIC 16 + /* group socket should not be exposed */ +#define SOCK_INTERNAL 32 typedef struct bNodePreview { unsigned char *rect; @@ -119,7 +130,6 @@ typedef struct bNodePreview { int pad; } bNodePreview; - /* limit data in bNode to what we want to see saved? */ typedef struct bNode { struct bNode *next, *prev, *new_node; @@ -132,11 +142,14 @@ typedef struct bNode { short nr; /* number of this node in list, used for UI exec events */ ListBase inputs, outputs; + struct bNode *parent; /* parent node */ struct ID *id; /* optional link to libdata */ void *storage; /* custom data, must be struct, for storage in file */ float locx, locy; /* root offset for drawing */ - float width, miniwidth; + float width, height; /* node custom width and height */ + float miniwidth; /* node width if hidden */ + int pad; char label[32]; /* custom user-defined label */ short custom1, custom2; /* to be abused for buttons */ float custom3, custom4; @@ -151,7 +164,6 @@ typedef struct bNode { struct uiBlock *block; /* runtime during drawing */ struct bNodeType *typeinfo; /* lookup of callbacks and defaults */ - } bNode; /* node->flag */ @@ -163,11 +175,17 @@ typedef struct bNode { #define NODE_ACTIVE_ID 32 #define NODE_DO_OUTPUT 64 #define NODE_GROUP_EDIT 128 - /* free test flag, undefined */ + /* free test flag, undefined */ #define NODE_TEST 256 - /* composite: don't do node but pass on buffer(s) */ + /* composite: don't do node but pass on buffer(s) */ #define NODE_MUTED 512 -#define NODE_CUSTOM_NAME 1024 /* deprecated! */ +#define NODE_CUSTOM_NAME 1024 /* deprecated! */ + /* group node types: use const outputs by default */ +#define NODE_CONST_OUTPUT (1<<11) + /* node is always behind others */ +#define NODE_BACKGROUND (1<<12) + /* automatic flag for nodes included in transforms */ +#define NODE_TRANSFORM (1<<13) typedef struct bNodeLink { struct bNodeLink *next, *prev; @@ -175,13 +193,13 @@ typedef struct bNodeLink { bNode *fromnode, *tonode; bNodeSocket *fromsock, *tosock; - int flag, pad; - + int flag; + int pad; } bNodeLink; - /* link->flag */ -#define NODE_LINKFLAG_HILITE 1 +#define NODE_LINK_VALID 1 /* link has been successfully validated */ +#define NODE_LINKFLAG_HILITE 2 /* the basis for a Node tree, all links and nodes reside internal here */ /* only re-usable node trees are in the library though, materials and textures allocate own tree struct */ @@ -193,19 +211,24 @@ typedef struct bNodeTree { ListBase nodes, links; - bNodeStack *stack; /* stack is only while executing, no read/write in file */ - struct ListBase *threadstack; /* same as above */ - int type, init; /* set init on fileread */ - int stacksize; /* amount of elements in stack */ int cur_index; /* sockets in groups have unique identifiers, adding new sockets always will increase this counter */ - int flag, pad; + int flag; + int update; /* update flags */ + + int nodetype; /* specific node type this tree is used for */ - ListBase alltypes; /* type definitions */ ListBase inputs, outputs; /* external sockets for group nodes */ - - int pad2[2]; + + /* execution data */ + /* XXX It would be preferable to completely move this data out of the underlying node tree, + * so node tree execution could finally run independent of the tree itself. This would allow node trees + * to be merely linked by other data (materials, textures, etc.), as ID data is supposed to. + * Execution data is generated from the tree once at execution start and can then be used + * as long as necessary, even while the tree is being modified. + */ + struct bNodeTreeExec *execdata; /* callbacks */ void (*progress)(void *, float progress); @@ -216,20 +239,59 @@ typedef struct bNodeTree { } bNodeTree; /* ntree->type, index */ -#define NTREE_SHADER 0 -#define NTREE_COMPOSIT 1 -#define NTREE_TEXTURE 2 +#define NTREE_SHADER 0 +#define NTREE_COMPOSIT 1 +#define NTREE_TEXTURE 2 +#define NUM_NTREE_TYPES 3 /* ntree->init, flag */ -#define NTREE_TYPE_INIT 1 -#define NTREE_EXEC_INIT 2 +#define NTREE_TYPE_INIT 1 /* ntree->flag */ #define NTREE_DS_EXPAND 1 /* for animation editors */ -/* XXX not nice, but needed as a temporary flag +/* XXX not nice, but needed as a temporary flags * for group updates after library linking. */ -#define NTREE_DO_VERSIONS 1024 +#define NTREE_DO_VERSIONS_GROUP_EXPOSE 1024 + +/* ntree->update */ +#define NTREE_UPDATE 0xFFFF /* generic update flag (includes all others) */ +#define NTREE_UPDATE_LINKS 1 /* links have been added or removed */ +#define NTREE_UPDATE_NODES 2 /* nodes or sockets have been added or removed */ +#define NTREE_UPDATE_GROUP_IN 16 /* group inputs have changed */ +#define NTREE_UPDATE_GROUP_OUT 32 /* group outputs have changed */ +#define NTREE_UPDATE_GROUP 48 /* group has changed (generic flag including all other group flags) */ + + +/* socket value structs for input buttons */ + +typedef struct bNodeSocketValueInt { + int subtype; /* RNA subtype */ + int value; + int min, max; +} bNodeSocketValueInt; + +typedef struct bNodeSocketValueFloat { + int subtype; /* RNA subtype */ + float value; + float min, max; +} bNodeSocketValueFloat; + +typedef struct bNodeSocketValueBoolean { + char value; + char pad[3]; +} bNodeSocketValueBoolean; + +typedef struct bNodeSocketValueVector { + int subtype; /* RNA subtype */ + float value[3]; + float min, max; +} bNodeSocketValueVector; + +typedef struct bNodeSocketValueRGBA { + float value[4]; +} bNodeSocketValueRGBA; + /* data structs, for node->storage */ @@ -354,7 +416,6 @@ typedef struct TexNodeOutput { char name[32]; } TexNodeOutput; - /* comp channel matte */ #define CMP_NODE_CHANNEL_MATTE_CS_RGB 1 #define CMP_NODE_CHANNEL_MATTE_CS_HSV 2 diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h index 259c7de5cd4..477ee2fe43e 100644 --- a/source/blender/makesrna/RNA_access.h +++ b/source/blender/makesrna/RNA_access.h @@ -327,10 +327,13 @@ extern StructRNA RNA_NearSensor; extern StructRNA RNA_NlaStrip; extern StructRNA RNA_NlaTrack; extern StructRNA RNA_Node; +extern StructRNA RNA_NodeForLoop; extern StructRNA RNA_NodeGroup; extern StructRNA RNA_NodeLink; extern StructRNA RNA_NodeSocket; +extern StructRNA RNA_NodeSocketPanel; extern StructRNA RNA_NodeTree; +extern StructRNA RNA_NodeWhileLoop; extern StructRNA RNA_NoiseTexture; extern StructRNA RNA_NorController; extern StructRNA RNA_Object; @@ -376,7 +379,6 @@ extern StructRNA RNA_PropertyGroupItem; extern StructRNA RNA_PropertySensor; extern StructRNA RNA_PythonConstraint; extern StructRNA RNA_PythonController; -extern StructRNA RNA_RGBANodeSocket; extern StructRNA RNA_RadarSensor; extern StructRNA RNA_RandomSensor; extern StructRNA RNA_RaySensor; @@ -553,9 +555,7 @@ extern StructRNA RNA_UserPreferencesFilePaths; extern StructRNA RNA_UserPreferencesSystem; extern StructRNA RNA_UserPreferencesView; extern StructRNA RNA_UserSolidLight; -extern StructRNA RNA_ValueNodeSocket; extern StructRNA RNA_VectorFont; -extern StructRNA RNA_VectorNodeSocket; extern StructRNA RNA_VertexGroup; extern StructRNA RNA_VertexGroupElement; extern StructRNA RNA_VertexPaint; @@ -599,6 +599,8 @@ extern const PointerRNA PointerRNA_NULL; /* Structs */ +StructRNA *RNA_struct_find(const char *identifier); + const char *RNA_struct_identifier(StructRNA *type); const char *RNA_struct_ui_name(StructRNA *type); const char *RNA_struct_ui_description(StructRNA *type); diff --git a/source/blender/makesrna/RNA_enum_types.h b/source/blender/makesrna/RNA_enum_types.h index 0b63bb02436..2300b72910d 100644 --- a/source/blender/makesrna/RNA_enum_types.h +++ b/source/blender/makesrna/RNA_enum_types.h @@ -102,10 +102,12 @@ extern EnumPropertyItem transform_mode_types[]; extern EnumPropertyItem posebone_rotmode_items[]; extern EnumPropertyItem property_type_items[]; +extern EnumPropertyItem property_subtype_items[]; extern EnumPropertyItem property_unit_items[]; extern EnumPropertyItem viewport_shade_items[]; +extern EnumPropertyItem nodetree_type_items[]; extern EnumPropertyItem node_socket_type_items[]; extern EnumPropertyItem node_math_items[]; diff --git a/source/blender/makesrna/RNA_types.h b/source/blender/makesrna/RNA_types.h index f8199074f27..4a18518dde9 100644 --- a/source/blender/makesrna/RNA_types.h +++ b/source/blender/makesrna/RNA_types.h @@ -99,7 +99,10 @@ typedef enum PropertyUnit { #define RNA_ENUM_BITFLAG_SIZE 32 -/* also update enums in bpy_props.c when adding items here */ +/* also update enums in bpy_props.c when adding items here + * watch it: these values are written to files as part of + * node socket button subtypes! + */ typedef enum PropertySubType { PROP_NONE = 0, diff --git a/source/blender/makesrna/SConscript b/source/blender/makesrna/SConscript index 1cb24630fbe..10b20fc795a 100644 --- a/source/blender/makesrna/SConscript +++ b/source/blender/makesrna/SConscript @@ -9,6 +9,7 @@ objs += o incs = '#/intern/guardedalloc #/intern/memutil #/intern/audaspace/intern ../blenkernel ../blenlib ../makesdna intern .' incs += ' ../windowmanager ../editors/include ../gpu ../imbuf ../ikplugin ../blenfont ../blenloader' incs += ' ../render/extern/include' +incs += ' ../nodes' incs += ' #/extern/glew/include' defs = [] diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c index ad79771416d..936f2e5e40c 100644 --- a/source/blender/makesrna/intern/rna_access.c +++ b/source/blender/makesrna/intern/rna_access.c @@ -475,6 +475,17 @@ static const char *rna_ensure_property_name(PropertyRNA *prop) /* Structs */ +StructRNA *RNA_struct_find(const char *identifier) +{ + StructRNA *type; + if (identifier) { + for (type = BLENDER_RNA.structs.first; type; type = type->cont.next) + if (strcmp(type->identifier, identifier)==0) + return type; + } + return NULL; +} + const char *RNA_struct_identifier(StructRNA *type) { return type->identifier; diff --git a/source/blender/makesrna/intern/rna_main_api.c b/source/blender/makesrna/intern/rna_main_api.c index d69cb2063ab..1ba6905ea37 100644 --- a/source/blender/makesrna/intern/rna_main_api.c +++ b/source/blender/makesrna/intern/rna_main_api.c @@ -214,9 +214,7 @@ void rna_Main_materials_remove(Main *bmain, ReportList *reports, struct Material struct bNodeTree *rna_Main_nodetree_new(Main *UNUSED(bmain), const char *name, int type) { - bNodeTree *tree = ntreeAddTree(name, type, TRUE); - -// ntreeMakeGroupSockets(tree); + bNodeTree *tree = ntreeAddTree(name, type, NODE_GROUP); id_us_min(&tree->id); return tree; diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index d6e475fdbad..49a0458977a 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -30,13 +30,17 @@ #include #include +#include "RNA_access.h" #include "RNA_define.h" #include "RNA_enum_types.h" #include "rna_internal.h" +#include "rna_internal_types.h" #include "DNA_material_types.h" +#include "DNA_mesh_types.h" #include "DNA_node_types.h" +#include "DNA_object_types.h" #include "DNA_scene_types.h" #include "DNA_texture_types.h" @@ -53,9 +57,16 @@ #include "MEM_guardedalloc.h" +EnumPropertyItem nodetree_type_items[] = { + {NTREE_SHADER, "MATERIAL", ICON_MATERIAL, "Material", "Material nodes" }, + {NTREE_TEXTURE, "TEXTURE", ICON_TEXTURE, "Texture", "Texture nodes" }, + {NTREE_COMPOSIT, "COMPOSITING", ICON_RENDERLAYERS, "Compositing", "Compositing nodes" }, + {0, NULL, 0, NULL, NULL} +}; + EnumPropertyItem node_socket_type_items[] = { - {SOCK_VALUE, "VALUE", 0, "Value", ""}, + {SOCK_FLOAT, "VALUE", 0, "Value", ""}, {SOCK_VECTOR, "VECTOR", 0, "Vector", ""}, {SOCK_RGBA, "RGBA", 0, "RGBA", ""}, {0, NULL, 0, NULL, NULL}}; @@ -99,6 +110,41 @@ EnumPropertyItem node_filter_items[] = { {6, "SHADOW", 0, "Shadow", ""}, {0, NULL, 0, NULL, NULL}}; + +/* Add any new socket value subtype here. + * When adding a new subtype here, make sure you also add it + * to the subtype definitions in DNA_node_types.h. + * This macro is used by the RNA and the internal converter functions + * to define all socket subtypes. The SUBTYPE macro must be defined + * before using this macro, and undefined afterwards. + */ +#define NODE_DEFINE_SUBTYPES_INT \ +SUBTYPE(INT, Int, NONE, None) \ +SUBTYPE(INT, Int, UNSIGNED, Unsigned) + +#define NODE_DEFINE_SUBTYPES_FLOAT \ +SUBTYPE(FLOAT, Float, NONE, None) \ +SUBTYPE(FLOAT, Float, UNSIGNED, Unsigned) \ +SUBTYPE(FLOAT, Float, PERCENTAGE, Percentage) \ +SUBTYPE(FLOAT, Float, FACTOR, Factor) \ +SUBTYPE(FLOAT, Float, ANGLE, Angle) \ +SUBTYPE(FLOAT, Float, TIME, Time) \ +SUBTYPE(FLOAT, Float, DISTANCE, Distance) + +#define NODE_DEFINE_SUBTYPES_VECTOR \ +SUBTYPE(VECTOR, Vector, NONE, None) \ +SUBTYPE(VECTOR, Vector, TRANSLATION, Translation) \ +SUBTYPE(VECTOR, Vector, DIRECTION, Direction) \ +SUBTYPE(VECTOR, Vector, VELOCITY, Velocity) \ +SUBTYPE(VECTOR, Vector, ACCELERATION, Acceleration) \ +SUBTYPE(VECTOR, Vector, EULER, Euler) \ +SUBTYPE(VECTOR, Vector, XYZ, XYZ) + +#define NODE_DEFINE_SUBTYPES \ +NODE_DEFINE_SUBTYPES_INT \ +NODE_DEFINE_SUBTYPES_FLOAT \ +NODE_DEFINE_SUBTYPES_VECTOR + #ifdef RNA_RUNTIME #include "BLI_linklist.h" @@ -121,32 +167,18 @@ static StructRNA *rna_Node_refine(struct PointerRNA *ptr) #include "rna_nodetree_types.h" - #undef DefNode - case NODE_GROUP: return &RNA_NodeGroup; + case NODE_FORLOOP: + return &RNA_NodeForLoop; + case NODE_WHILELOOP: + return &RNA_NodeWhileLoop; default: return &RNA_Node; } } -static StructRNA *rna_NodeSocketType_refine(struct PointerRNA *ptr) -{ - bNodeSocket *ns= (bNodeSocket*)ptr->data; - - switch(ns->type) { - case SOCK_VALUE: - return &RNA_ValueNodeSocket; - case SOCK_VECTOR: - return &RNA_VectorNodeSocket; - case SOCK_RGBA: - return &RNA_RGBANodeSocket; - default: - return &RNA_UnknownType; - } -} - static StructRNA *rna_NodeTree_refine(struct PointerRNA *ptr) { bNodeTree *ntree= (bNodeTree*)ptr->data; @@ -170,6 +202,46 @@ static char *rna_Node_path(PointerRNA *ptr) return BLI_sprintfN("nodes[\"%s\"]", node->name); } +static StructRNA *rna_NodeSocket_refine(PointerRNA *ptr) +{ + bNodeSocket *sock= (bNodeSocket*)ptr->data; + + if (sock->default_value) { + /* This returns the refined socket type with the full definition + * of the default input value with type and subtype. + */ + + #define SUBTYPE(socktype, stypename, id, idname) \ + { \ + bNodeSocketValue##stypename *value= (bNodeSocketValue##stypename*)sock->default_value; \ + if (value->subtype==PROP_##id) \ + return &RNA_NodeSocket##stypename##idname; \ + } + + switch (sock->type) { + case SOCK_FLOAT: + NODE_DEFINE_SUBTYPES_FLOAT + break; + case SOCK_INT: + NODE_DEFINE_SUBTYPES_INT + break; + case SOCK_BOOLEAN: + return &RNA_NodeSocketBoolean; + break; + case SOCK_VECTOR: + NODE_DEFINE_SUBTYPES_VECTOR + break; + case SOCK_RGBA: + return &RNA_NodeSocketRGBA; + break; + } + + #undef SUBTYPE + } + + return &RNA_NodeSocket; +} + static char *rna_NodeSocket_path(PointerRNA *ptr) { bNodeTree *ntree= (bNodeTree*)ptr->id.data; @@ -275,7 +347,7 @@ static void rna_NodeGroup_update(Main *bmain, Scene *scene, PointerRNA *ptr) bNodeTree *ntree= (bNodeTree*)ptr->id.data; bNode *node= (bNode*)ptr->data; - nodeGroupVerify((bNodeTree *)node->id); + ntreeUpdateTree((bNodeTree *)node->id); node_update(bmain, scene, ntree, node); } @@ -313,18 +385,42 @@ static void rna_NodeGroupSocket_update(Main *bmain, Scene *scene, PointerRNA *pt bNodeSocket *sock= (bNodeSocket*)ptr->data; bNode *node; - nodeGroupVerify(ntree); + ntreeUpdateTree(ntree); if (nodeFindNode(ntree, sock, &node, NULL, NULL)) node_update(bmain, scene, ntree, node); } -static void rna_NodeSocket_defvalue_range(PointerRNA *ptr, float *min, float *max) +static void rna_NodeLink_update(Main *bmain, Scene *scene, PointerRNA *ptr) +{ + bNodeTree *ntree= (bNodeTree*)ptr->id.data; + + ntree->update |= NTREE_UPDATE_LINKS; + ntreeUpdateTree(ntree); +} + +static void rna_NodeSocketInt_range(PointerRNA *ptr, int *min, int *max) { bNodeSocket *sock= (bNodeSocket*)ptr->data; + bNodeSocketValueInt *val= (bNodeSocketValueInt*)sock->default_value; + *min = val->min; + *max = val->max; +} - *min = sock->ns.min; - *max = sock->ns.max; +static void rna_NodeSocketFloat_range(PointerRNA *ptr, float *min, float *max) +{ + bNodeSocket *sock= (bNodeSocket*)ptr->data; + bNodeSocketValueFloat *val= (bNodeSocketValueFloat*)sock->default_value; + *min = val->min; + *max = val->max; +} + +static void rna_NodeSocketVector_range(PointerRNA *ptr, float *min, float *max) +{ + bNodeSocket *sock= (bNodeSocket*)ptr->data; + bNodeSocketValueVector *val= (bNodeSocketValueVector*)sock->default_value; + *min = val->min; + *max = val->max; } static void rna_Node_mapping_update(Main *bmain, Scene *scene, PointerRNA *ptr) @@ -454,18 +550,22 @@ static EnumPropertyItem *rna_Node_channel_itemf(bContext *UNUSED(C), PointerRNA static bNode *rna_NodeTree_node_new(bNodeTree *ntree, bContext *UNUSED(C), ReportList *reports, int type, bNodeTree *group) { bNode *node; + bNodeTemplate ntemp; if (type == NODE_GROUP && group == NULL) { BKE_reportf(reports, RPT_ERROR, "node type \'GROUP\' missing group argument"); return NULL; } - node = nodeAddNodeType(ntree, type, group, NULL); - + + ntemp.type = type; + ntemp.ngroup = group; + node = nodeAddNode(ntree, &ntemp); + if (node == NULL) { BKE_reportf(reports, RPT_ERROR, "Unable to create node"); } else { - nodeGroupVerify(ntree); /* update group node socket links*/ + ntreeUpdateTree(ntree); /* update group node socket links*/ NodeTagChanged(ntree, node); WM_main_add_notifier(NC_NODE|NA_EDITED, ntree); @@ -495,7 +595,7 @@ static bNode *rna_NodeTree_node_composite_new(bNodeTree *ntree, bContext *C, Rep } ntreeCompositForceHidden(ntree, CTX_data_scene(C)); - ntreeSolveOrder(ntree); + ntreeUpdateTree(ntree); } return node; @@ -523,7 +623,7 @@ static void rna_NodeTree_node_remove(bNodeTree *ntree, ReportList *reports, bNod id_us_min(node->id); nodeFreeNode(ntree, node); - nodeGroupVerify(ntree); /* update group node socket links*/ + ntreeUpdateTree(ntree); /* update group node socket links*/ WM_main_add_notifier(NC_NODE|NA_EDITED, ntree); } @@ -551,9 +651,7 @@ static bNodeLink *rna_NodeTree_link_new(bNodeTree *ntree, ReportList *reports, b if(ret) { NodeTagChanged(ntree, tonode); - nodeGroupVerify(ntree); /* update group node socket links*/ - - ntreeSolveOrder(ntree); + ntreeUpdateTree(ntree); WM_main_add_notifier(NC_NODE|NA_EDITED, ntree); } @@ -567,8 +665,7 @@ static void rna_NodeTree_link_remove(bNodeTree *ntree, ReportList *reports, bNod } else { nodeRemLink(ntree, link); - ntreeSolveOrder(ntree); - nodeGroupVerify(ntree); /* update group node socket links*/ + ntreeUpdateTree(ntree); WM_main_add_notifier(NC_NODE|NA_EDITED, ntree); } @@ -577,9 +674,10 @@ static void rna_NodeTree_link_remove(bNodeTree *ntree, ReportList *reports, bNod static bNodeSocket *rna_NodeTree_input_new(bNodeTree *ntree, ReportList *UNUSED(reports), const char *name, int type) { /* XXX should check if tree is a group here! no good way to do this currently. */ - bNodeSocket *gsock= nodeGroupAddSocket(ntree, name, type, SOCK_IN); + bNodeSocket *gsock= node_group_add_socket(ntree, name, type, SOCK_IN); - nodeGroupVerify(ntree); /* update group node socket links*/ + ntree->update |= NTREE_UPDATE_GROUP_IN; + ntreeUpdateTree(ntree); WM_main_add_notifier(NC_NODE|NA_EDITED, ntree); return gsock; } @@ -587,9 +685,10 @@ static bNodeSocket *rna_NodeTree_input_new(bNodeTree *ntree, ReportList *UNUSED( static bNodeSocket *rna_NodeTree_output_new(bNodeTree *ntree, ReportList *UNUSED(reports), const char *name, int type) { /* XXX should check if tree is a group here! no good way to do this currently. */ - bNodeSocket *gsock= nodeGroupAddSocket(ntree, name, type, SOCK_OUT); + bNodeSocket *gsock= node_group_add_socket(ntree, name, type, SOCK_OUT); - nodeGroupVerify(ntree); /* update group node socket links*/ + ntree->update |= NTREE_UPDATE_GROUP_OUT; + ntreeUpdateTree(ntree); WM_main_add_notifier(NC_NODE|NA_EDITED, ntree); return gsock; } @@ -606,11 +705,12 @@ static bNodeSocket *rna_NodeTree_input_expose(bNodeTree *ntree, ReportList *repo BKE_reportf(reports, RPT_ERROR, "Socket is not an input"); else { /* XXX should check if tree is a group here! no good way to do this currently. */ - gsock = nodeGroupAddSocket(ntree, sock->name, sock->type, SOCK_IN); + gsock = node_group_add_socket(ntree, sock->name, sock->type, SOCK_IN); if (add_link) nodeAddLink(ntree, NULL, gsock, node, sock); - nodeGroupVerify(ntree); /* update group node socket links*/ + ntree->update |= NTREE_UPDATE_GROUP_IN; + ntreeUpdateTree(ntree); WM_main_add_notifier(NC_NODE|NA_EDITED, ntree); return gsock; } @@ -629,11 +729,12 @@ static bNodeSocket *rna_NodeTree_output_expose(bNodeTree *ntree, ReportList *rep BKE_reportf(reports, RPT_ERROR, "Socket is not an output"); else { /* XXX should check if tree is a group here! no good way to do this currently. */ - gsock = nodeGroupAddSocket(ntree, sock->name, sock->type, SOCK_OUT); + gsock = node_group_add_socket(ntree, sock->name, sock->type, SOCK_OUT); if (add_link) nodeAddLink(ntree, node, sock, NULL, gsock); - nodeGroupVerify(ntree); /* update group node socket links*/ + ntree->update |= NTREE_UPDATE_GROUP_OUT; + ntreeUpdateTree(ntree); WM_main_add_notifier(NC_NODE|NA_EDITED, ntree); return gsock; } @@ -668,14 +769,16 @@ static EnumPropertyItem node_ycc_items[] = { { 2, "JFIF", 0, "Jpeg", ""}, {0, NULL, 0, NULL, NULL}}; -#define MaxNodes 1000 +#define MaxNodes 50000 enum { Category_GroupNode, + Category_LoopNode, + Category_LayoutNode, Category_ShaderNode, Category_CompositorNode, - Category_TextureNode + Category_TextureNode, }; typedef struct NodeInfo @@ -715,9 +818,10 @@ static void init(void) #include "rna_nodetree_types.h" - #undef DefNode - reg_node(NODE_GROUP, Category_GroupNode, "GROUP", "NodeGroup", "Node", "Group", ""); + reg_node(NODE_FORLOOP, Category_LoopNode, "FORLOOP", "NodeForLoop", "Node", "ForLoop", ""); + reg_node(NODE_WHILELOOP, Category_LoopNode, "WHILELOOP", "NodeWhileLoop", "Node", "WhileLoop", ""); + reg_node(NODE_FRAME, Category_LayoutNode, "FRAME", "NodeFrame", "Node", "Frame", ""); } static StructRNA* def_node(BlenderRNA *brna, int node_id) @@ -793,6 +897,41 @@ static void def_group(StructRNA *srna) RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeGroup_update"); } +static void def_forloop(StructRNA *srna) +{ + PropertyRNA *prop; + + prop = RNA_def_property(srna, "node_tree", PROP_POINTER, PROP_NONE); + RNA_def_property_pointer_sdna(prop, NULL, "id"); + RNA_def_property_struct_type(prop, "NodeTree"); + RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Node Tree", ""); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeGroup_update"); +} + +static void def_whileloop(StructRNA *srna) +{ + PropertyRNA *prop; + + prop = RNA_def_property(srna, "node_tree", PROP_POINTER, PROP_NONE); + RNA_def_property_pointer_sdna(prop, NULL, "id"); + RNA_def_property_struct_type(prop, "NodeTree"); + RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Node Tree", ""); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeGroup_update"); + + prop = RNA_def_property(srna, "max_iterations", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "custom1"); + RNA_def_property_range(prop, 0.0f, 10000000.0f); + RNA_def_property_ui_text(prop, "Max. Iterations", "Limit for number of iterations"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeGroup_update"); +} + +static void def_frame(StructRNA *srna) +{ +// PropertyRNA *prop; + +} static void def_math(StructRNA *srna) { @@ -2510,94 +2649,112 @@ static void rna_def_node_socket(BlenderRNA *brna) srna = RNA_def_struct(brna, "NodeSocket", NULL); RNA_def_struct_ui_text(srna, "Node Socket", "Input or output socket of a node"); - RNA_def_struct_refine_func(srna, "rna_NodeSocketType_refine"); RNA_def_struct_sdna(srna, "bNodeSocket"); + RNA_def_struct_refine_func(srna, "rna_NodeSocket_refine"); RNA_def_struct_ui_icon(srna, ICON_PLUG); RNA_def_struct_path_func(srna, "rna_NodeSocket_path"); + prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "type"); + RNA_def_property_enum_items(prop, node_socket_type_items); + RNA_def_property_enum_default(prop, 0); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Type", "Node Socket type"); + prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE); /* XXX must be editable for group sockets. if necessary use a special rna definition for these */ // RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Name", "Socket name"); RNA_def_struct_name_property(srna, prop); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeGroupSocket_update"); - - /* can add back if there is any use in reading them */ -#if 0 - prop = RNA_def_property(srna, "min", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "ns.min"); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); - RNA_def_property_ui_text(prop, "Minimum Value", ""); - RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update"); - - prop = RNA_def_property(srna, "max", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "ns.max"); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); - RNA_def_property_ui_text(prop, "Maximum Value", ""); - RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update"); -#endif - - prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); - RNA_def_property_enum_items(prop, node_socket_type_items); - RNA_def_property_ui_text(prop, "Type", "Node Socket type"); } -static void rna_def_node_socket_value(BlenderRNA *brna) +static void rna_def_node_socket_subtype(BlenderRNA *brna, int type, int subtype, const char *name, const char *ui_name) { StructRNA *srna; - PropertyRNA *prop; + PropertyRNA *prop=NULL; + PropertySubType propsubtype= PROP_NONE; + + #define SUBTYPE(socktype, stypename, id, idname) { PROP_##id, #id, 0, #idname, ""}, + static EnumPropertyItem subtype_items[] = { + NODE_DEFINE_SUBTYPES + {0, NULL, 0, NULL, NULL} + }; + #undef SUBTYPE - srna = RNA_def_struct(brna, "ValueNodeSocket", "NodeSocket"); - RNA_def_struct_ui_text(srna, "Value Node Socket", "Input or output socket of a node"); + #define SUBTYPE(socktype, stypename, id, idname) if (subtype==PROP_##id) propsubtype = PROP_##id; + NODE_DEFINE_SUBTYPES + #undef SUBTYPE + + srna = RNA_def_struct(brna, name, "NodeSocket"); + RNA_def_struct_ui_text(srna, ui_name, "Input or output socket of a node"); RNA_def_struct_sdna(srna, "bNodeSocket"); RNA_def_struct_ui_icon(srna, ICON_PLUG); RNA_def_struct_path_func(srna, "rna_NodeSocket_path"); - - prop = RNA_def_property(srna, "default_value", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "ns.vec"); - RNA_def_property_array(prop, 1); - RNA_def_property_ui_text(prop, "Default Value", "Default value of the socket when no link is attached"); - RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update"); - RNA_def_property_float_funcs(prop, NULL, NULL, "rna_NodeSocket_defvalue_range"); -} - -static void rna_def_node_socket_vector(BlenderRNA *brna) -{ - StructRNA *srna; - PropertyRNA *prop; - - srna = RNA_def_struct(brna, "VectorNodeSocket", "NodeSocket"); - RNA_def_struct_ui_text(srna, "Vector Node Socket", "Input or output socket of a node"); - RNA_def_struct_sdna(srna, "bNodeSocket"); - RNA_def_struct_ui_icon(srna, ICON_PLUG); - RNA_def_struct_path_func(srna, "rna_NodeSocket_path"); - - prop = RNA_def_property(srna, "default_value", PROP_FLOAT, PROP_XYZ); - RNA_def_property_float_sdna(prop, NULL, "ns.vec"); - RNA_def_property_array(prop, 3); - RNA_def_property_ui_text(prop, "Default Value", "Default value of the socket when no link is attached"); - RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update"); - RNA_def_property_float_funcs(prop, NULL, NULL, "rna_NodeSocket_defvalue_range"); -} - -static void rna_def_node_socket_rgba(BlenderRNA *brna) -{ - StructRNA *srna; - PropertyRNA *prop; - - srna = RNA_def_struct(brna, "RGBANodeSocket", "NodeSocket"); - RNA_def_struct_ui_text(srna, "RGBA Node Socket", "Input or output socket of a node"); - RNA_def_struct_sdna(srna, "bNodeSocket"); - RNA_def_struct_ui_icon(srna, ICON_PLUG); - RNA_def_struct_path_func(srna, "rna_NodeSocket_path"); - - prop = RNA_def_property(srna, "default_value", PROP_FLOAT, PROP_COLOR); - RNA_def_property_float_sdna(prop, NULL, "ns.vec"); - RNA_def_property_array(prop, 4); - RNA_def_property_ui_text(prop, "Default Value", "Default value of the socket when no link is attached"); - RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update"); - RNA_def_property_float_funcs(prop, NULL, NULL, "rna_NodeSocket_defvalue_range"); + + switch (type) { + case SOCK_INT: + RNA_def_struct_sdna_from(srna, "bNodeSocketValueInt", "default_value"); + + prop = RNA_def_property(srna, "subtype", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "subtype"); + RNA_def_property_enum_items(prop, subtype_items); + RNA_def_property_ui_text(prop, "Subtype", "Subtype defining the socket value details"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update"); + + prop = RNA_def_property(srna, "default_value", PROP_INT, propsubtype); + RNA_def_property_int_sdna(prop, NULL, "value"); + RNA_def_property_int_funcs(prop, NULL, NULL, "rna_NodeSocketInt_range"); + RNA_def_property_ui_text(prop, "Default Value", ""); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update"); + break; + case SOCK_FLOAT: + RNA_def_struct_sdna_from(srna, "bNodeSocketValueFloat", "default_value"); + + prop = RNA_def_property(srna, "subtype", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "subtype"); + RNA_def_property_enum_items(prop, subtype_items); + RNA_def_property_ui_text(prop, "Subtype", "Subtype defining the socket value details"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update"); + + prop = RNA_def_property(srna, "default_value", PROP_FLOAT, propsubtype); + RNA_def_property_float_sdna(prop, NULL, "value"); + RNA_def_property_float_funcs(prop, NULL, NULL, "rna_NodeSocketFloat_range"); + RNA_def_property_ui_text(prop, "Default Value", ""); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update"); + break; + case SOCK_BOOLEAN: + RNA_def_struct_sdna_from(srna, "bNodeSocketValueBoolean", "default_value"); + + prop = RNA_def_property(srna, "default_value", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "value", 1); + RNA_def_property_ui_text(prop, "Default Value", ""); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update"); + break; + case SOCK_VECTOR: + RNA_def_struct_sdna_from(srna, "bNodeSocketValueVector", "default_value"); + + prop = RNA_def_property(srna, "subtype", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "subtype"); + RNA_def_property_enum_items(prop, subtype_items); + RNA_def_property_ui_text(prop, "Subtype", "Subtype defining the socket value details"); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update"); + + prop = RNA_def_property(srna, "default_value", PROP_FLOAT, propsubtype); + RNA_def_property_float_sdna(prop, NULL, "value"); + RNA_def_property_float_funcs(prop, NULL, NULL, "rna_NodeSocketVector_range"); + RNA_def_property_ui_text(prop, "Default Value", ""); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update"); + break; + case SOCK_RGBA: + RNA_def_struct_sdna_from(srna, "bNodeSocketValueRGBA", "default_value"); + + prop = RNA_def_property(srna, "default_value", PROP_FLOAT, PROP_COLOR); + RNA_def_property_float_sdna(prop, NULL, "value"); + RNA_def_property_ui_text(prop, "Default Value", ""); + RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update"); + break; + } } static void rna_def_node(BlenderRNA *brna) @@ -2625,6 +2782,11 @@ static void rna_def_node(BlenderRNA *brna) RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Node_name_set"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); + prop = RNA_def_property(srna, "label", PROP_STRING, PROP_NONE); + RNA_def_property_string_sdna(prop, NULL, "label"); + RNA_def_property_ui_text(prop, "Label", "Optional custom node label"); + RNA_def_property_update(prop, NC_NODE, "rna_Node_update"); + prop = RNA_def_property(srna, "inputs", PROP_COLLECTION, PROP_NONE); RNA_def_property_collection_sdna(prop, NULL, "inputs", NULL); RNA_def_property_struct_type(prop, "NodeSocket"); @@ -2634,18 +2796,19 @@ static void rna_def_node(BlenderRNA *brna) RNA_def_property_collection_sdna(prop, NULL, "outputs", NULL); RNA_def_property_struct_type(prop, "NodeSocket"); RNA_def_property_ui_text(prop, "Outputs", ""); - - prop = RNA_def_property(srna, "label", PROP_STRING, PROP_NONE); - RNA_def_property_string_sdna(prop, NULL, "label"); - RNA_def_property_ui_text(prop, "Label", "Optional custom node label"); - RNA_def_property_update(prop, NC_NODE, "rna_Node_update"); + + prop = RNA_def_property(srna, "parent", PROP_POINTER, PROP_NONE); + RNA_def_property_pointer_sdna(prop, NULL, "parent"); + RNA_def_property_struct_type(prop, "Node"); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Parent", "Parent this node is attached to"); } static void rna_def_node_link(BlenderRNA *brna) { StructRNA *srna; PropertyRNA *prop; - + srna = RNA_def_struct(brna, "NodeLink", NULL); RNA_def_struct_ui_text(srna, "NodeLink", "Link between nodes in a node tree"); RNA_def_struct_sdna(srna, "bNodeLink"); @@ -2687,7 +2850,7 @@ static void rna_def_group_sockets_api(BlenderRNA *brna, PropertyRNA *cprop, int RNA_def_function_ui_description(func, "Add a socket to the group tree."); RNA_def_function_flag(func, FUNC_USE_REPORTS); RNA_def_string(func, "name", "Socket", 32, "Name", "Name of the socket"); - RNA_def_enum(func, "type", node_socket_type_items, SOCK_VALUE, "Type", "Type of socket"); + RNA_def_enum(func, "type", node_socket_type_items, SOCK_FLOAT, "Type", "Type of socket"); /* return value */ parm= RNA_def_pointer(func, "socket", "NodeSocket", "", "New socket."); RNA_def_function_return(func, parm); @@ -2708,12 +2871,6 @@ static void rna_def_nodetree(BlenderRNA *brna) StructRNA *srna; PropertyRNA *prop; - static EnumPropertyItem nodetree_type_items[] = { - {NTREE_SHADER, "SHADER", 0, "Shader", ""}, - {NTREE_COMPOSIT, "COMPOSITE", 0, "Composite", ""}, - {NTREE_TEXTURE, "TEXTURE", 0, "Texture", ""}, - {0, NULL, 0, NULL, NULL}}; - srna = RNA_def_struct(brna, "NodeTree", "ID"); RNA_def_struct_ui_text(srna, "Node Tree", "Node tree consisting of linked nodes used for materials, textures and compositing"); RNA_def_struct_sdna(srna, "bNodeTree"); @@ -2826,15 +2983,23 @@ void RNA_def_nodetree(BlenderRNA *brna) { init(); rna_def_nodetree(brna); + rna_def_node_socket(brna); - rna_def_node_socket_value(brna); - rna_def_node_socket_vector(brna); - rna_def_node_socket_rgba(brna); + + /* Generate RNA definitions for all socket subtypes */ + #define SUBTYPE(socktype, stypename, id, idname) \ + rna_def_node_socket_subtype(brna, SOCK_##socktype, PROP_##id, "NodeSocket"#stypename#idname, #idname" "#stypename" Node Socket"); + NODE_DEFINE_SUBTYPES + #undef SUBTYPE + rna_def_node_socket_subtype(brna, SOCK_BOOLEAN, 0, "NodeSocketBoolean", "Boolean Node Socket"); + rna_def_node_socket_subtype(brna, SOCK_RGBA, 0, "NodeSocketRGBA", "RGBA Node Socket"); + rna_def_node(brna); rna_def_node_link(brna); rna_def_shader_node(brna); rna_def_compositor_node(brna); rna_def_texture_node(brna); + rna_def_composite_nodetree(brna); rna_def_shader_nodetree(brna); rna_def_texture_nodetree(brna); @@ -2843,10 +3008,14 @@ void RNA_def_nodetree(BlenderRNA *brna) #include "rna_nodetree_types.h" - #undef DefNode - define_specific_node(brna, NODE_GROUP, def_group); + define_specific_node(brna, NODE_FORLOOP, def_forloop); + define_specific_node(brna, NODE_WHILELOOP, def_whileloop); + define_specific_node(brna, NODE_FRAME, def_frame); } +/* clean up macro definition */ +#undef NODE_DEFINE_SUBTYPES + #endif diff --git a/source/blender/makesrna/intern/rna_nodetree_types.h b/source/blender/makesrna/intern/rna_nodetree_types.h index d48df85697a..a624d1d6403 100644 --- a/source/blender/makesrna/intern/rna_nodetree_types.h +++ b/source/blender/makesrna/intern/rna_nodetree_types.h @@ -26,7 +26,12 @@ * \ingroup RNA */ - + +/* Empty definitions for undefined macros to avoid warnings */ +#ifndef DefNode +#define DefNode(Category, ID, DefFunc, EnumName, StructName, UIName, UIDesc) +#endif + /* Tree type Node ID RNA def function Enum name Struct name UI Name UI Description */ DefNode( ShaderNode, SH_NODE_OUTPUT, 0, "OUTPUT", Output, "Output", "" ) DefNode( ShaderNode, SH_NODE_MATERIAL, def_sh_material, "MATERIAL", Material, "Material", "" ) @@ -138,3 +143,6 @@ DefNode( TextureNode, TEX_NODE_DECOMPOSE, 0, "DECOM DefNode( TextureNode, TEX_NODE_VALTONOR, 0, "VALTONOR", ValToNor, "Val to Nor", "" ) DefNode( TextureNode, TEX_NODE_SCALE, 0, "SCALE", Scale, "Scale", "" ) + +/* undefine macros */ +#undef DefNode diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c index 4e2be7682f8..83efd9d1a9f 100644 --- a/source/blender/makesrna/intern/rna_object.c +++ b/source/blender/makesrna/intern/rna_object.c @@ -132,6 +132,7 @@ EnumPropertyItem object_type_curve_items[] = { #include "DNA_key_types.h" #include "DNA_constraint_types.h" #include "DNA_lattice_types.h" +#include "DNA_node_types.h" #include "BKE_armature.h" #include "BKE_bullet.h" @@ -2035,18 +2036,19 @@ static void rna_def_object(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Matrix", "Inverse of object's parent matrix at time of parenting"); RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_internal_update"); - /* collections */ + /* modifiers */ + prop= RNA_def_property(srna, "modifiers", PROP_COLLECTION, PROP_NONE); + RNA_def_property_struct_type(prop, "Modifier"); + RNA_def_property_ui_text(prop, "Modifiers", "Modifiers affecting the geometric data of the object"); + rna_def_object_modifiers(brna, prop); + + /* constraints */ prop= RNA_def_property(srna, "constraints", PROP_COLLECTION, PROP_NONE); RNA_def_property_struct_type(prop, "Constraint"); RNA_def_property_ui_text(prop, "Constraints", "Constraints affecting the transformation of the object"); // RNA_def_property_collection_funcs(prop, 0, 0, 0, 0, 0, 0, 0, "constraints__add", "constraints__remove"); rna_def_object_constraints(brna, prop); - prop= RNA_def_property(srna, "modifiers", PROP_COLLECTION, PROP_NONE); - RNA_def_property_struct_type(prop, "Modifier"); - RNA_def_property_ui_text(prop, "Modifiers", "Modifiers affecting the geometric data of the object"); - rna_def_object_modifiers(brna, prop); - /* game engine */ prop= RNA_def_property(srna, "game", PROP_POINTER, PROP_NONE); RNA_def_property_flag(prop, PROP_NEVER_NULL); diff --git a/source/blender/makesrna/intern/rna_rna.c b/source/blender/makesrna/intern/rna_rna.c index e063f8ec85a..7f85a2fa1d7 100644 --- a/source/blender/makesrna/intern/rna_rna.c +++ b/source/blender/makesrna/intern/rna_rna.c @@ -46,6 +46,42 @@ EnumPropertyItem property_type_items[] = { {PROP_COLLECTION, "COLLECTION", 0, "Collection", ""}, {0, NULL, 0, NULL, NULL}}; +EnumPropertyItem property_subtype_items[] = { + {PROP_NONE, "NONE", 0, "None", ""}, + + /* strings */ + {PROP_FILEPATH, "FILEPATH", 0, "File Path", ""}, + {PROP_DIRPATH, "DIRPATH", 0, "Directory Path", ""}, + {PROP_FILENAME, "FILENAME", 0, "File Name", ""}, + + /* numbers */ + {PROP_UNSIGNED, "UNSIGNED", 0, "Unsigned", ""}, + {PROP_PERCENTAGE, "PERCENTAGE", 0, "Percentage", ""}, + {PROP_FACTOR, "FACTOR", 0, "Factor", ""}, + {PROP_ANGLE, "ANGLE", 0, "Angle", ""}, + {PROP_TIME, "TIME", 0, "Time", ""}, + {PROP_DISTANCE, "DISTANCE", 0, "Distance", ""}, + + /* number arrays */ + {PROP_COLOR, "COLOR", 0, "Color", ""}, + {PROP_TRANSLATION, "TRANSLATION", 0, "Translation", ""}, + {PROP_DIRECTION, "DIRECTION", 0, "Direction", ""}, + {PROP_VELOCITY, "VELOCITY", 0, "Velocity", ""}, + {PROP_ACCELERATION, "ACCELERATION", 0, "Acceleration", ""}, + {PROP_MATRIX, "MATRIX", 0, "Matrix", ""}, + {PROP_EULER, "EULER", 0, "Euler Angles", ""}, + {PROP_QUATERNION, "QUATERNION", 0, "Quaternion", ""}, + {PROP_AXISANGLE, "AXISANGLE", 0, "Axis-Angle", ""}, + {PROP_XYZ, "XYZ", 0, "XYZ", ""}, + {PROP_XYZ_LENGTH, "XYZ_LENGTH", 0, "XYZ Length", ""}, + {PROP_COLOR_GAMMA, "COLOR_GAMMA", 0, "Color", ""}, + {PROP_COORDS, "COORDS", 0, "Coordinates", ""}, + + /* booleans */ + {PROP_LAYER, "LAYER", 0, "Layer", ""}, + {PROP_LAYER_MEMBER, "LAYER_MEMBER", 0, "Layer Member", ""}, + {0, NULL, 0, NULL, NULL}}; + EnumPropertyItem property_unit_items[] = { {PROP_UNIT_NONE, "NONE", 0, "None", ""}, {PROP_UNIT_LENGTH, "LENGTH", 0, "Length", ""}, diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index 35115b40d59..249cdb28ae1 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -48,6 +48,8 @@ #include "WM_api.h" #include "WM_types.h" +#include "RNA_enum_types.h" + EnumPropertyItem space_type_items[] = { {SPACE_EMPTY, "EMPTY", 0, "Empty", ""}, {SPACE_VIEW3D, "VIEW_3D", 0, "3D View", ""}, @@ -119,6 +121,7 @@ EnumPropertyItem viewport_shade_items[] = { #include "BKE_paint.h" #include "ED_image.h" +#include "ED_node.h" #include "ED_screen.h" #include "ED_view3d.h" #include "ED_sequencer.h" @@ -839,6 +842,24 @@ static void rna_BackgroundImage_opacity_set(PointerRNA *ptr, float value) bgpic->blend = 1.0f - value; } +/* Space Node Editor */ + +static int rna_SpaceNodeEditor_node_tree_poll(PointerRNA *ptr, PointerRNA value) +{ + SpaceNode *snode= (SpaceNode*)ptr->data; + bNodeTree *ntree= (bNodeTree*)value.data; + + /* exclude group trees, only trees of the active type */ + return (ntree->nodetype==0 && ntree->type == snode->treetype); +} + +static void rna_SpaceNodeEditor_node_tree_update(Main *bmain, Scene *scene, PointerRNA *ptr) +{ + SpaceNode *snode= (SpaceNode*)ptr->data; + + ED_node_tree_update(snode, scene); +} + static EnumPropertyItem *rna_SpaceProperties_texture_context_itemf(bContext *C, PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), int *free) { Scene *scene = CTX_data_scene(C); @@ -2414,12 +2435,6 @@ static void rna_def_space_node(BlenderRNA *brna) StructRNA *srna; PropertyRNA *prop; - static EnumPropertyItem tree_type_items[] = { - {NTREE_SHADER, "MATERIAL", ICON_MATERIAL, "Material", "Material nodes"}, - {NTREE_TEXTURE, "TEXTURE", ICON_TEXTURE, "Texture", "Texture nodes"}, - {NTREE_COMPOSIT, "COMPOSITING", ICON_RENDERLAYERS, "Compositing", "Compositing nodes"}, - {0, NULL, 0, NULL, NULL}}; - static EnumPropertyItem texture_type_items[] = { {SNODE_TEX_OBJECT, "OBJECT", ICON_OBJECT_DATA, "Object", "Edit texture nodes from Object"}, {SNODE_TEX_WORLD, "WORLD", ICON_WORLD_DATA, "World", "Edit texture nodes from World"}, @@ -2438,7 +2453,7 @@ static void rna_def_space_node(BlenderRNA *brna) prop= RNA_def_property(srna, "tree_type", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "treetype"); - RNA_def_property_enum_items(prop, tree_type_items); + RNA_def_property_enum_items(prop, nodetree_type_items); RNA_def_property_ui_text(prop, "Tree Type", "Node tree type to display and edit"); RNA_def_property_update(prop, NC_SPACE|ND_SPACE_NODE, NULL); @@ -2459,8 +2474,10 @@ static void rna_def_space_node(BlenderRNA *brna) prop= RNA_def_property(srna, "node_tree", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "nodetree"); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_pointer_funcs(prop, NULL, NULL, NULL, "rna_SpaceNodeEditor_node_tree_poll"); + RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Node Tree", "Node tree being displayed and edited"); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_NODE, "rna_SpaceNodeEditor_node_tree_update"); prop= RNA_def_property(srna, "show_backdrop", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", SNODE_BACKDRAW); diff --git a/source/blender/modifiers/CMakeLists.txt b/source/blender/modifiers/CMakeLists.txt index d1f153265ac..1d942de348b 100644 --- a/source/blender/modifiers/CMakeLists.txt +++ b/source/blender/modifiers/CMakeLists.txt @@ -32,6 +32,7 @@ set(INC ../blenlib ../blenloader ../makesdna + ../makesrna ../render/extern/include ../../../intern/elbeem/extern ../../../intern/guardedalloc diff --git a/source/blender/modifiers/SConscript b/source/blender/modifiers/SConscript index d1bb95761ff..66dd00f0248 100644 --- a/source/blender/modifiers/SConscript +++ b/source/blender/modifiers/SConscript @@ -6,7 +6,7 @@ sources = env.Glob('intern/*.c') incs = '. ./intern' incs += ' #/intern/guardedalloc #/intern/decimation/extern #/intern/bsp/extern #/intern/elbeem/extern' incs += ' ../render/extern/include ../blenloader' -incs += ' ../include ../blenlib ../makesdna ../blenkernel ../blenkernel/intern' +incs += ' ../include ../blenlib ../makesdna ../makesrna ../blenkernel ../blenkernel/intern' incs += ' ' + env['BF_ZLIB_INC'] diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt index c3bd37c18ee..82848c6a5d7 100644 --- a/source/blender/nodes/CMakeLists.txt +++ b/source/blender/nodes/CMakeLists.txt @@ -38,117 +38,137 @@ set(INC set(INC_SYS ${GLEW_INCLUDE_PATH} + intern + composite + shader + texture ) set(SRC - intern/CMP_nodes/CMP_alphaOver.c - intern/CMP_nodes/CMP_bilateralblur.c - intern/CMP_nodes/CMP_blur.c - intern/CMP_nodes/CMP_brightness.c - intern/CMP_nodes/CMP_channelMatte.c - intern/CMP_nodes/CMP_chromaMatte.c - intern/CMP_nodes/CMP_colorMatte.c - intern/CMP_nodes/CMP_colorSpill.c - intern/CMP_nodes/CMP_colorbalance.c - intern/CMP_nodes/CMP_composite.c - intern/CMP_nodes/CMP_crop.c - intern/CMP_nodes/CMP_curves.c - intern/CMP_nodes/CMP_defocus.c - intern/CMP_nodes/CMP_diffMatte.c - intern/CMP_nodes/CMP_dilate.c - intern/CMP_nodes/CMP_directionalblur.c - intern/CMP_nodes/CMP_displace.c - intern/CMP_nodes/CMP_distanceMatte.c - intern/CMP_nodes/CMP_filter.c - intern/CMP_nodes/CMP_flip.c - intern/CMP_nodes/CMP_gamma.c - intern/CMP_nodes/CMP_glare.c - intern/CMP_nodes/CMP_hueSatVal.c - intern/CMP_nodes/CMP_huecorrect.c - intern/CMP_nodes/CMP_idMask.c - intern/CMP_nodes/CMP_image.c - intern/CMP_nodes/CMP_invert.c - intern/CMP_nodes/CMP_lensdist.c - intern/CMP_nodes/CMP_levels.c - intern/CMP_nodes/CMP_lummaMatte.c - intern/CMP_nodes/CMP_mapUV.c - intern/CMP_nodes/CMP_mapValue.c - intern/CMP_nodes/CMP_math.c - intern/CMP_nodes/CMP_mixrgb.c - intern/CMP_nodes/CMP_normal.c - intern/CMP_nodes/CMP_normalize.c - intern/CMP_nodes/CMP_outputFile.c - intern/CMP_nodes/CMP_premulkey.c - intern/CMP_nodes/CMP_rgb.c - intern/CMP_nodes/CMP_rotate.c - intern/CMP_nodes/CMP_scale.c - intern/CMP_nodes/CMP_sepcombHSVA.c - intern/CMP_nodes/CMP_sepcombRGBA.c - intern/CMP_nodes/CMP_sepcombYCCA.c - intern/CMP_nodes/CMP_sepcombYUVA.c - intern/CMP_nodes/CMP_setalpha.c - intern/CMP_nodes/CMP_splitViewer.c - intern/CMP_nodes/CMP_texture.c - intern/CMP_nodes/CMP_tonemap.c - intern/CMP_nodes/CMP_translate.c - intern/CMP_nodes/CMP_valToRgb.c - intern/CMP_nodes/CMP_value.c - intern/CMP_nodes/CMP_vecBlur.c - intern/CMP_nodes/CMP_viewer.c - intern/CMP_nodes/CMP_zcombine.c - intern/CMP_util.c - intern/SHD_nodes/SHD_camera.c - intern/SHD_nodes/SHD_curves.c - intern/SHD_nodes/SHD_dynamic.c - intern/SHD_nodes/SHD_geom.c - intern/SHD_nodes/SHD_hueSatVal.c - intern/SHD_nodes/SHD_invert.c - intern/SHD_nodes/SHD_mapping.c - intern/SHD_nodes/SHD_material.c - intern/SHD_nodes/SHD_math.c - intern/SHD_nodes/SHD_mixRgb.c - intern/SHD_nodes/SHD_normal.c - intern/SHD_nodes/SHD_output.c - intern/SHD_nodes/SHD_rgb.c - intern/SHD_nodes/SHD_sepcombRGB.c - intern/SHD_nodes/SHD_squeeze.c - intern/SHD_nodes/SHD_texture.c - intern/SHD_nodes/SHD_valToRgb.c - intern/SHD_nodes/SHD_value.c - intern/SHD_nodes/SHD_vectMath.c - intern/SHD_util.c - intern/TEX_nodes/TEX_at.c - intern/TEX_nodes/TEX_bricks.c - intern/TEX_nodes/TEX_checker.c - intern/TEX_nodes/TEX_compose.c - intern/TEX_nodes/TEX_coord.c - intern/TEX_nodes/TEX_curves.c - intern/TEX_nodes/TEX_decompose.c - intern/TEX_nodes/TEX_distance.c - intern/TEX_nodes/TEX_hueSatVal.c - intern/TEX_nodes/TEX_image.c - intern/TEX_nodes/TEX_invert.c - intern/TEX_nodes/TEX_math.c - intern/TEX_nodes/TEX_mixRgb.c - intern/TEX_nodes/TEX_output.c - intern/TEX_nodes/TEX_proc.c - intern/TEX_nodes/TEX_rotate.c - intern/TEX_nodes/TEX_scale.c - intern/TEX_nodes/TEX_texture.c - intern/TEX_nodes/TEX_translate.c - intern/TEX_nodes/TEX_valToNor.c - intern/TEX_nodes/TEX_valToRgb.c - intern/TEX_nodes/TEX_viewer.c - intern/TEX_util.c - intern/node_util.c + composite/nodes/node_composite_alphaOver.c + composite/nodes/node_composite_bilateralblur.c + composite/nodes/node_composite_blur.c + composite/nodes/node_composite_brightness.c + composite/nodes/node_composite_channelMatte.c + composite/nodes/node_composite_chromaMatte.c + composite/nodes/node_composite_colorMatte.c + composite/nodes/node_composite_colorSpill.c + composite/nodes/node_composite_colorbalance.c + composite/nodes/node_composite_common.c + composite/nodes/node_composite_composite.c + composite/nodes/node_composite_crop.c + composite/nodes/node_composite_curves.c + composite/nodes/node_composite_defocus.c + composite/nodes/node_composite_diffMatte.c + composite/nodes/node_composite_dilate.c + composite/nodes/node_composite_directionalblur.c + composite/nodes/node_composite_displace.c + composite/nodes/node_composite_distanceMatte.c + composite/nodes/node_composite_filter.c + composite/nodes/node_composite_flip.c + composite/nodes/node_composite_gamma.c + composite/nodes/node_composite_glare.c + composite/nodes/node_composite_hueSatVal.c + composite/nodes/node_composite_huecorrect.c + composite/nodes/node_composite_idMask.c + composite/nodes/node_composite_image.c + composite/nodes/node_composite_invert.c + composite/nodes/node_composite_lensdist.c + composite/nodes/node_composite_levels.c + composite/nodes/node_composite_lummaMatte.c + composite/nodes/node_composite_mapUV.c + composite/nodes/node_composite_mapValue.c + composite/nodes/node_composite_math.c + composite/nodes/node_composite_mixrgb.c + composite/nodes/node_composite_normal.c + composite/nodes/node_composite_normalize.c + composite/nodes/node_composite_outputFile.c + composite/nodes/node_composite_premulkey.c + composite/nodes/node_composite_rgb.c + composite/nodes/node_composite_rotate.c + composite/nodes/node_composite_scale.c + composite/nodes/node_composite_sepcombHSVA.c + composite/nodes/node_composite_sepcombRGBA.c + composite/nodes/node_composite_sepcombYCCA.c + composite/nodes/node_composite_sepcombYUVA.c + composite/nodes/node_composite_setalpha.c + composite/nodes/node_composite_splitViewer.c + composite/nodes/node_composite_texture.c + composite/nodes/node_composite_tonemap.c + composite/nodes/node_composite_translate.c + composite/nodes/node_composite_valToRgb.c + composite/nodes/node_composite_value.c + composite/nodes/node_composite_vecBlur.c + composite/nodes/node_composite_viewer.c + composite/nodes/node_composite_zcombine.c + composite/node_composite_tree.c + composite/node_composite_util.c - CMP_node.h - SHD_node.h - TEX_node.h - intern/CMP_util.h - intern/SHD_util.h - intern/TEX_util.h + shader/nodes/node_shader_camera.c + shader/nodes/node_shader_common.c + shader/nodes/node_shader_curves.c + shader/nodes/node_shader_dynamic.c + shader/nodes/node_shader_geom.c + shader/nodes/node_shader_hueSatVal.c + shader/nodes/node_shader_invert.c + shader/nodes/node_shader_mapping.c + shader/nodes/node_shader_material.c + shader/nodes/node_shader_math.c + shader/nodes/node_shader_mixRgb.c + shader/nodes/node_shader_normal.c + shader/nodes/node_shader_output.c + shader/nodes/node_shader_rgb.c + shader/nodes/node_shader_sepcombRGB.c + shader/nodes/node_shader_squeeze.c + shader/nodes/node_shader_texture.c + shader/nodes/node_shader_valToRgb.c + shader/nodes/node_shader_value.c + shader/nodes/node_shader_vectMath.c + shader/node_shader_tree.c + shader/node_shader_util.c + + texture/nodes/node_texture_at.c + texture/nodes/node_texture_bricks.c + texture/nodes/node_texture_checker.c + texture/nodes/node_texture_common.c + texture/nodes/node_texture_compose.c + texture/nodes/node_texture_coord.c + texture/nodes/node_texture_curves.c + texture/nodes/node_texture_decompose.c + texture/nodes/node_texture_distance.c + texture/nodes/node_texture_hueSatVal.c + texture/nodes/node_texture_image.c + texture/nodes/node_texture_invert.c + texture/nodes/node_texture_math.c + texture/nodes/node_texture_mixRgb.c + texture/nodes/node_texture_output.c + texture/nodes/node_texture_proc.c + texture/nodes/node_texture_rotate.c + texture/nodes/node_texture_scale.c + texture/nodes/node_texture_texture.c + texture/nodes/node_texture_translate.c + texture/nodes/node_texture_valToNor.c + texture/nodes/node_texture_valToRgb.c + texture/nodes/node_texture_viewer.c + texture/node_texture_tree.c + texture/node_texture_util.c + + intern/node_util.c + intern/node_exec.c + intern/node_common.c + intern/node_socket.c + + composite/node_composite_util.h + shader/node_shader_util.h + texture/node_texture_util.h + + NOD_composite.h + NOD_shader.h + NOD_texture.h + NOD_socket.h intern/node_util.h + intern/node_exec.h + intern/node_common.h ) if(WITH_PYTHON) diff --git a/source/blender/nodes/CMP_node.h b/source/blender/nodes/NOD_composite.h similarity index 93% rename from source/blender/nodes/CMP_node.h rename to source/blender/nodes/NOD_composite.h index 65c9236710f..ab56199079e 100644 --- a/source/blender/nodes/CMP_node.h +++ b/source/blender/nodes/NOD_composite.h @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_node.h 36550 2011-05-08 16:08:08Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -30,18 +30,24 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file CMP_node.h +/** \file NOD_composite.h * \ingroup nodes */ -#ifndef CMP_NODE_H -#define CMP_NODE_H +#ifndef NOD_composite_H +#define NOD_composite_H #include "BKE_node.h" +extern bNodeTreeType ntreeType_Composite; + /* ****************** types array for all composite nodes ****************** */ +void register_node_type_cmp_group(ListBase *lb); +void register_node_type_cmp_forloop(ListBase *lb); +void register_node_type_cmp_whileloop(ListBase *lb); + void register_node_type_cmp_rlayers(ListBase *lb); void register_node_type_cmp_image(ListBase *lb); void register_node_type_cmp_texture(ListBase *lb); diff --git a/source/blender/nodes/SHD_node.h b/source/blender/nodes/NOD_shader.h similarity index 88% rename from source/blender/nodes/SHD_node.h rename to source/blender/nodes/NOD_shader.h index 80e5eec6893..5bc0c381f0b 100644 --- a/source/blender/nodes/SHD_node.h +++ b/source/blender/nodes/NOD_shader.h @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: SHD_node.h 36550 2011-05-08 16:08:08Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -30,19 +30,25 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file SHD_node.h +/** \file NOD_shader.h * \ingroup nodes */ -#ifndef SHD_NODE_H -#define SHD_NODE_H +#ifndef NOD_SHADER_H +#define NOD_SHADER_H #include "BKE_node.h" +extern struct bNodeTreeType ntreeType_Shader; + /* the type definitions array */ /* ****************** types array for all shaders ****************** */ +void register_node_type_sh_group(ListBase *lb); +void register_node_type_sh_forloop(ListBase *lb); +void register_node_type_sh_whileloop(ListBase *lb); + void register_node_type_sh_output(ListBase *lb); void register_node_type_sh_material(ListBase *lb); void register_node_type_sh_camera(ListBase *lb); diff --git a/source/blender/nodes/NOD_socket.h b/source/blender/nodes/NOD_socket.h new file mode 100644 index 00000000000..92e8a8e058d --- /dev/null +++ b/source/blender/nodes/NOD_socket.h @@ -0,0 +1,89 @@ +/** + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2007 Blender Foundation. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): Lukas Toenne + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file NOD_socket.h + * \ingroup nodes + */ + + +#ifndef NOD_SOCKET_H_ +#define NOD_SOCKET_H_ + +#include "DNA_listBase.h" + +#include "BLI_utildefines.h" + +#include "BKE_node.h" + +#include "RNA_types.h" + +struct bNodeTree; +struct bNode; +struct bNodeStack; + +void node_socket_type_init(struct bNodeSocketType *types[]); + +struct bNodeSocket *nodeAddInputInt(struct bNodeTree *ntree, struct bNode *node, const char *name, PropertySubType subtype, int value, int min, int max); +struct bNodeSocket *nodeAddOutputInt(struct bNodeTree *ntree, struct bNode *node, const char *name); + +struct bNodeSocket *nodeAddInputFloat(struct bNodeTree *ntree, struct bNode *node, const char *name, PropertySubType subtype, float value, float min, float max); +struct bNodeSocket *nodeAddOutputFloat(struct bNodeTree *ntree, struct bNode *node, const char *name); + +struct bNodeSocket *nodeAddInputBoolean(struct bNodeTree *ntree, struct bNode *node, const char *name, char value); +struct bNodeSocket *nodeAddOutputBoolean(struct bNodeTree *ntree, struct bNode *node, const char *name); + +struct bNodeSocket *nodeAddInputVector(struct bNodeTree *ntree, struct bNode *node, const char *name, PropertySubType subtype, float x, float y, float z, float min, float max); +struct bNodeSocket *nodeAddOutputVector(struct bNodeTree *ntree, struct bNode *node, const char *name); + +struct bNodeSocket *nodeAddInputRGBA(struct bNodeTree *ntree, struct bNode *node, const char *name, float r, float g, float b, float a); +struct bNodeSocket *nodeAddOutputRGBA(struct bNodeTree *ntree, struct bNode *node, const char *name); + +struct bNodeSocket *nodeAddInputMesh(struct bNodeTree *ntree, struct bNode *node, const char *name); +struct bNodeSocket *nodeAddOutputMesh(struct bNodeTree *ntree, struct bNode *node, const char *name); + +struct bNodeSocket *node_add_input_from_template(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocketTemplate *stemp); +struct bNodeSocket *node_add_output_from_template(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocketTemplate *stemp); + +void node_verify_socket_templates(struct bNodeTree *ntree, struct bNode *node); + + +/* Socket Converters */ + +#define SOCK_VECTOR_X 1 +#define SOCK_VECTOR_Y 2 +#define SOCK_VECTOR_Z 3 + +#define SOCK_RGBA_R 1 +#define SOCK_RGBA_G 2 +#define SOCK_RGBA_B 3 +#define SOCK_RGBA_A 4 + +#define SOCK_MESH_VERT_CO 1 +#define SOCK_MESH_VERT_NO 2 + +#endif diff --git a/source/blender/nodes/TEX_node.h b/source/blender/nodes/NOD_texture.h similarity index 90% rename from source/blender/nodes/TEX_node.h rename to source/blender/nodes/NOD_texture.h index 23a6b4427af..6f30685aff1 100644 --- a/source/blender/nodes/TEX_node.h +++ b/source/blender/nodes/NOD_texture.h @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: TEX_node.h 36550 2011-05-08 16:08:08Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -30,18 +30,24 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file TEX_node.h +/** \file NOD_texture.h * \ingroup nodes */ -#ifndef TEX_NODE_H -#define TEX_NODE_H +#ifndef NOD_TEXTURE_H +#define NOD_TEXTURE_H #include "BKE_node.h" +extern bNodeTreeType ntreeType_Texture; + /* ****************** types array for all texture nodes ****************** */ +void register_node_type_tex_group(ListBase *lb); +void register_node_type_tex_forloop(ListBase *lb); +void register_node_type_tex_whileloop(ListBase *lb); + void register_node_type_tex_math(ListBase *lb); void register_node_type_tex_mix_rgb(ListBase *lb); void register_node_type_tex_valtorgb(ListBase *lb); diff --git a/source/blender/nodes/SConscript b/source/blender/nodes/SConscript index 8d17c6f5e16..0cbc7b80933 100644 --- a/source/blender/nodes/SConscript +++ b/source/blender/nodes/SConscript @@ -2,11 +2,11 @@ Import ('env') sources = env.Glob('intern/*.c') -cmpsources = env.Glob('intern/CMP_nodes/*.c') -shdsources = env.Glob('intern/SHD_nodes/*.c') -texsources = env.Glob('intern/TEX_nodes/*.c') - +cmpsources = env.Glob('composite/*.c') + env.Glob('composite/nodes/*.c') +shdsources = env.Glob('shader/*.c') + env.Glob('shader/nodes/*.c') +texsources = env.Glob('texture/*.c') + env.Glob('texture/nodes/*.c') incs = '. ./intern ' +incs += './composite ./shader ./texture ' incs += '#/intern/guardedalloc ../editors/include ../blenlib ../makesdna' incs += ' ../render/extern/include ../makesrna ' incs += ' ../imbuf ../avi ' diff --git a/source/blender/nodes/composite/node_composite_tree.c b/source/blender/nodes/composite/node_composite_tree.c new file mode 100644 index 00000000000..1a2fb04be8c --- /dev/null +++ b/source/blender/nodes/composite/node_composite_tree.c @@ -0,0 +1,811 @@ +/** + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2007 Blender Foundation. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/nodes/composite/node_composite_tree.c + * \ingroup nodes + */ + + +#include + +#include "DNA_anim_types.h" +#include "DNA_scene_types.h" +#include "DNA_node_types.h" + +#include "BLI_listbase.h" +#include "BLI_threads.h" + +#include "BKE_animsys.h" +#include "BKE_colortools.h" +#include "BKE_fcurve.h" +#include "BKE_global.h" +#include "BKE_main.h" +#include "BKE_node.h" +#include "BKE_utildefines.h" + +#include "node_exec.h" +#include "node_util.h" + +#include "PIL_time.h" + +#include "RNA_access.h" + +#include "NOD_composite.h" +#include "node_composite_util.h" + +static void foreach_nodetree(Main *main, void *calldata, bNodeTreeCallback func) +{ + Scene *sce; + for(sce= main->scene.first; sce; sce= sce->id.next) { + if(sce->nodetree) { + func(calldata, &sce->id, sce->nodetree); + } + } +} + +static void free_node_cache(bNodeTree *UNUSED(ntree), bNode *node) +{ + bNodeSocket *sock; + + for(sock= node->outputs.first; sock; sock= sock->next) { + if(sock->cache) { + free_compbuf(sock->cache); + sock->cache= NULL; + } + } +} + +static void free_cache(bNodeTree *ntree) +{ + bNode *node; + for(node= ntree->nodes.first; node; node= node->next) + free_node_cache(ntree, node); +} + +static void update_node(bNodeTree *ntree, bNode *node) +{ + bNodeSocket *sock; + + for(sock= node->outputs.first; sock; sock= sock->next) { + if(sock->cache) { + //free_compbuf(sock->cache); + //sock->cache= NULL; + } + } + node->need_exec= 1; + + /* individual node update call */ + if (node->typeinfo->updatefunc) + node->typeinfo->updatefunc(ntree, node); +} + +/* local tree then owns all compbufs */ +static void localize(bNodeTree *UNUSED(localtree), bNodeTree *ntree) +{ + bNode *node; + bNodeSocket *sock; + + for(node= ntree->nodes.first; node; node= node->next) { + /* ensure new user input gets handled ok */ + node->need_exec= 0; + + /* move over the compbufs */ + /* right after ntreeCopyTree() oldsock pointers are valid */ + + if(ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) { + if(node->id) { + if(node->flag & NODE_DO_OUTPUT) + node->new_node->id= (ID *)copy_image((Image *)node->id); + else + node->new_node->id= NULL; + } + } + + for(sock= node->outputs.first; sock; sock= sock->next) { + sock->new_sock->cache= sock->cache; + compbuf_set_node(sock->new_sock->cache, node->new_node); + + sock->cache= NULL; + sock->new_sock->new_sock= sock; + } + } +} + +static void local_sync(bNodeTree *localtree, bNodeTree *ntree) +{ + bNode *lnode; + + /* move over the compbufs and previews */ + for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) { + if( (lnode->exec & NODE_READY) && !(lnode->exec & NODE_SKIPPED) ) { + if(ntreeNodeExists(ntree, lnode->new_node)) { + + if(lnode->preview && lnode->preview->rect) { + nodeFreePreview(lnode->new_node); + lnode->new_node->preview= lnode->preview; + lnode->preview= NULL; + } + } + } + } +} + +static void local_merge(bNodeTree *localtree, bNodeTree *ntree) +{ + bNode *lnode; + bNodeSocket *lsock; + + /* move over the compbufs and previews */ + for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) { + if(ntreeNodeExists(ntree, lnode->new_node)) { + if(ELEM(lnode->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) { + if(lnode->id && (lnode->flag & NODE_DO_OUTPUT)) { + /* image_merge does sanity check for pointers */ + BKE_image_merge((Image *)lnode->new_node->id, (Image *)lnode->id); + } + } + + for(lsock= lnode->outputs.first; lsock; lsock= lsock->next) { + if(ntreeOutputExists(lnode->new_node, lsock->new_sock)) { + lsock->new_sock->cache= lsock->cache; + compbuf_set_node(lsock->new_sock->cache, lnode->new_node); + lsock->cache= NULL; + lsock->new_sock= NULL; + } + } + } + } +} + +bNodeTreeType ntreeType_Composite = { + /* type */ NTREE_COMPOSIT, + /* idname */ "NTCompositing Nodetree", + + /* node_types */ { NULL, NULL }, + + /* free_cache */ free_cache, + /* free_node_cache */ free_node_cache, + /* foreach_nodetree */ foreach_nodetree, + /* localize */ localize, + /* local_sync */ local_sync, + /* local_merge */ local_merge, + /* update */ NULL, + /* update_node */ update_node +}; + + +struct bNodeTreeExec *ntreeCompositBeginExecTree(bNodeTree *ntree) +{ + bNodeTreeExec *exec; + bNode *node; + bNodeSocket *sock; + + /* XXX hack: prevent exec data from being generated twice. + * this should be handled by the renderer! + */ + if (ntree->execdata) + return ntree->execdata; + + /* ensures only a single output node is enabled */ + ntreeSetOutput(ntree); + + exec = ntree_exec_begin(ntree); + + for(node= exec->nodetree->nodes.first; node; node= node->next) { + /* initialize needed for groups */ + node->exec= 0; + + for(sock= node->outputs.first; sock; sock= sock->next) { + bNodeStack *ns= node_get_socket_stack(exec->stack, sock); + if(ns && sock->cache) { + ns->data= sock->cache; + sock->cache= NULL; + } + } + /* cannot initialize them while using in threads */ + if(ELEM4(node->type, CMP_NODE_TIME, CMP_NODE_CURVE_VEC, CMP_NODE_CURVE_RGB, CMP_NODE_HUECORRECT)) { + curvemapping_initialize(node->storage); + if(node->type==CMP_NODE_CURVE_RGB) + curvemapping_premultiply(node->storage, 0); + } + } + + /* XXX this should not be necessary, but is still used for cmp/sha/tex nodes, + * which only store the ntree pointer. Should be fixed at some point! + */ + ntree->execdata = exec; + + return exec; +} + +void ntreeCompositEndExecTree(bNodeTreeExec *exec) +{ + if(exec) { + bNodeTree *ntree= exec->nodetree; + bNode *node; + bNodeStack *ns; + + for(node= exec->nodetree->nodes.first; node; node= node->next) { + bNodeSocket *sock; + + for(sock= node->outputs.first; sock; sock= sock->next) { + ns = node_get_socket_stack(exec->stack, sock); + if(ns && ns->data) { + sock->cache= ns->data; + ns->data= NULL; + } + } + if(node->type==CMP_NODE_CURVE_RGB) + curvemapping_premultiply(node->storage, 1); + + node->need_exec= 0; + } + + ntree_exec_end(exec); + + /* XXX clear nodetree backpointer to exec data, same problem as noted in ntreeBeginExecTree */ + ntree->execdata = NULL; + } +} + +/* ***************************** threaded version for execute composite nodes ************* */ +/* these are nodes without input, only giving values */ +/* or nodes with only value inputs */ +static int node_only_value(bNode *node) +{ + bNodeSocket *sock; + + if(ELEM3(node->type, CMP_NODE_TIME, CMP_NODE_VALUE, CMP_NODE_RGB)) + return 1; + + /* doing this for all node types goes wrong. memory free errors */ + if(node->inputs.first && node->type==CMP_NODE_MAP_VALUE) { + int retval= 1; + for(sock= node->inputs.first; sock; sock= sock->next) { + if(sock->link) + retval &= node_only_value(sock->link->fromnode); + } + return retval; + } + return 0; +} + +/* not changing info, for thread callback */ +typedef struct ThreadData { + bNodeStack *stack; + RenderData *rd; +} ThreadData; + +static void *exec_composite_node(void *nodeexec_v) +{ + bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */ + bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */ + bNodeExec *nodeexec= nodeexec_v; + bNode *node= nodeexec->node; + ThreadData *thd= (ThreadData *)node->threaddata; + + node_get_stack(node, thd->stack, nsin, nsout); + + if((node->flag & NODE_MUTED) && (!node_only_value(node))) { + /* viewers we execute, for feedback to user */ + if(ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) + node->typeinfo->execfunc(thd->rd, node, nsin, nsout); + else + node_compo_pass_on(node, nsin, nsout); + } + else if(node->typeinfo->execfunc) + node->typeinfo->execfunc(thd->rd, node, nsin, nsout); + else if (node->typeinfo->newexecfunc) + node->typeinfo->newexecfunc(thd->rd, 0, node, nodeexec->data, nsin, nsout); + + node->exec |= NODE_READY; + return 0; +} + +/* return total of executable nodes, for timecursor */ +static int setExecutableNodes(bNodeTree *ntree, ThreadData *thd) +{ + bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */ + bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */ + bNode *node; + bNodeSocket *sock; + int totnode= 0, group_edit= 0; + + /* note; do not add a dependency sort here, the stack was created already */ + + /* if we are in group edit, viewer nodes get skipped when group has viewer */ + for(node= ntree->nodes.first; node; node= node->next) + if(node->type==NODE_GROUP && (node->flag & NODE_GROUP_EDIT)) + if(ntreeHasType((bNodeTree *)node->id, CMP_NODE_VIEWER)) + group_edit= 1; + + for(node= ntree->nodes.first; node; node= node->next) { + int a; + + node_get_stack(node, thd->stack, nsin, nsout); + + /* test the outputs */ + /* skip value-only nodes (should be in type!) */ + if(!node_only_value(node)) { + for(a=0, sock= node->outputs.first; sock; sock= sock->next, a++) { + if(nsout[a]->data==NULL && nsout[a]->hasoutput) { + node->need_exec= 1; + break; + } + } + } + + /* test the inputs */ + for(a=0, sock= node->inputs.first; sock; sock= sock->next, a++) { + /* skip viewer nodes in bg render or group edit */ + if( ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER) && (G.background || group_edit)) + node->need_exec= 0; + /* is sock in use? */ + else if(sock->link) { + bNodeLink *link= sock->link; + + /* this is the test for a cyclic case */ + if(link->fromnode==NULL || link->tonode==NULL); + else if(link->fromnode->level >= link->tonode->level && link->tonode->level!=0xFFF) { + if(link->fromnode->need_exec) { + node->need_exec= 1; + break; + } + } + else { + node->need_exec= 0; + printf("Node %s skipped, cyclic dependency\n", node->name); + } + } + } + + if(node->need_exec) { + + /* free output buffers */ + for(a=0, sock= node->outputs.first; sock; sock= sock->next, a++) { + if(nsout[a]->data) { + free_compbuf(nsout[a]->data); + nsout[a]->data= NULL; + } + } + totnode++; + /* printf("node needs exec %s\n", node->name); */ + + /* tag for getExecutableNode() */ + node->exec= 0; + } + else { + /* tag for getExecutableNode() */ + node->exec= NODE_READY|NODE_FINISHED|NODE_SKIPPED; + + } + } + + /* last step: set the stack values for only-value nodes */ + /* just does all now, compared to a full buffer exec this is nothing */ + if(totnode) { + for(node= ntree->nodes.first; node; node= node->next) { + if(node->need_exec==0 && node_only_value(node)) { + if(node->typeinfo->execfunc) { + node_get_stack(node, thd->stack, nsin, nsout); + node->typeinfo->execfunc(thd->rd, node, nsin, nsout); + } + } + } + } + + return totnode; +} + +/* while executing tree, free buffers from nodes that are not needed anymore */ +static void freeExecutableNode(bNodeTree *ntree, bNodeTreeExec *exec) +{ + /* node outputs can be freed when: + - not a render result or image node + - when node outputs go to nodes all being set NODE_FINISHED + */ + bNode *node; + bNodeSocket *sock; + + /* set exec flag for finished nodes that might need freed */ + for(node= ntree->nodes.first; node; node= node->next) { + if(node->type!=CMP_NODE_R_LAYERS) + if(node->exec & NODE_FINISHED) + node->exec |= NODE_FREEBUFS; + } + /* clear this flag for input links that are not done yet */ + for(node= ntree->nodes.first; node; node= node->next) { + if((node->exec & NODE_FINISHED)==0) { + for(sock= node->inputs.first; sock; sock= sock->next) + if(sock->link) + sock->link->fromnode->exec &= ~NODE_FREEBUFS; + } + } + /* now we can free buffers */ + for(node= ntree->nodes.first; node; node= node->next) { + if(node->exec & NODE_FREEBUFS) { + for(sock= node->outputs.first; sock; sock= sock->next) { + bNodeStack *ns= node_get_socket_stack(exec->stack, sock); + if(ns && ns->data) { + free_compbuf(ns->data); + ns->data= NULL; + // printf("freed buf node %s \n", node->name); + } + } + } + } +} + +static bNodeExec *getExecutableNode(bNodeTreeExec *exec) +{ + bNodeExec *nodeexec; + bNodeSocket *sock; + int n; + + for(n=0, nodeexec=exec->nodeexec; n < exec->totnodes; ++n, ++nodeexec) { + if(nodeexec->node->exec==0) { + /* input sockets should be ready */ + for(sock= nodeexec->node->inputs.first; sock; sock= sock->next) { + if(sock->link && sock->link->fromnode) + if((sock->link->fromnode->exec & NODE_READY)==0) + break; + } + if(sock==NULL) + return nodeexec; + } + } + return NULL; +} + +/* check if texture nodes need exec or end */ +static void ntree_composite_texnode(bNodeTree *ntree, int init) +{ + bNode *node; + + for(node= ntree->nodes.first; node; node= node->next) { + if(node->type==CMP_NODE_TEXTURE && node->id) { + Tex *tex= (Tex *)node->id; + if(tex->nodetree && tex->use_nodes) { + /* has internal flag to detect it only does it once */ + if(init) { + if (!tex->nodetree->execdata) + tex->nodetree->execdata = ntreeTexBeginExecTree(tex->nodetree); + } + else + ntreeTexEndExecTree(tex->nodetree->execdata); + tex->nodetree->execdata = NULL; + } + } + } + +} + +/* optimized tree execute test for compositing */ +void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview) +{ + bNodeExec *nodeexec; + bNode *node; + ListBase threads; + ThreadData thdata; + int totnode, curnode, rendering= 1, n; + bNodeTreeExec *exec= NULL; + + if(ntree==NULL) return; + + if(do_preview) + ntreeInitPreview(ntree, 0, 0); + + if (!ntree->execdata) + exec = ntreeCompositBeginExecTree(ntree); + ntree_composite_texnode(ntree, 1); + + /* prevent unlucky accidents */ + if(G.background) + rd->scemode &= ~R_COMP_CROP; + + /* setup callerdata for thread callback */ + thdata.rd= rd; + thdata.stack= exec->stack; + + /* fixed seed, for example noise texture */ + BLI_srandom(rd->cfra); + + /* sets need_exec tags in nodes */ + curnode = totnode= setExecutableNodes(ntree, &thdata); + + BLI_init_threads(&threads, exec_composite_node, rd->threads); + + while(rendering) { + + if(BLI_available_threads(&threads)) { + nodeexec= getExecutableNode(exec); + if(nodeexec) { + node = nodeexec->node; + if(ntree->progress && totnode) + ntree->progress(ntree->prh, (1.0 - curnode/(float)totnode)); + if(ntree->stats_draw) { + char str[64]; + sprintf(str, "Compositing %d %s", curnode, node->name); + ntree->stats_draw(ntree->sdh, str); + } + curnode--; + + node->threaddata = &thdata; + node->exec= NODE_PROCESSING; + BLI_insert_thread(&threads, nodeexec); + } + else + PIL_sleep_ms(50); + } + else + PIL_sleep_ms(50); + + rendering= 0; + /* test for ESC */ + if(ntree->test_break && ntree->test_break(ntree->tbh)) { + for(node= ntree->nodes.first; node; node= node->next) + node->exec |= NODE_READY; + } + + /* check for ready ones, and if we need to continue */ + for(n=0, nodeexec=exec->nodeexec; n < exec->totnodes; ++n, ++nodeexec) { + node = nodeexec->node; + if(node->exec & NODE_READY) { + if((node->exec & NODE_FINISHED)==0) { + BLI_remove_thread(&threads, nodeexec); /* this waits for running thread to finish btw */ + node->exec |= NODE_FINISHED; + + /* freeing unused buffers */ + if(rd->scemode & R_COMP_FREE) + freeExecutableNode(ntree, exec); + } + } + else rendering= 1; + } + } + + BLI_end_threads(&threads); + + ntreeCompositEndExecTree(exec); +} + +/* *********************************************** */ + +/* clumsy checking... should do dynamic outputs once */ +static void force_hidden_passes(bNode *node, int passflag) +{ + bNodeSocket *sock; + + for(sock= node->outputs.first; sock; sock= sock->next) + sock->flag &= ~SOCK_UNAVAIL; + + sock= BLI_findlink(&node->outputs, RRES_OUT_Z); + if(!(passflag & SCE_PASS_Z)) sock->flag |= SOCK_UNAVAIL; + sock= BLI_findlink(&node->outputs, RRES_OUT_NORMAL); + if(!(passflag & SCE_PASS_NORMAL)) sock->flag |= SOCK_UNAVAIL; + sock= BLI_findlink(&node->outputs, RRES_OUT_VEC); + if(!(passflag & SCE_PASS_VECTOR)) sock->flag |= SOCK_UNAVAIL; + sock= BLI_findlink(&node->outputs, RRES_OUT_UV); + if(!(passflag & SCE_PASS_UV)) sock->flag |= SOCK_UNAVAIL; + sock= BLI_findlink(&node->outputs, RRES_OUT_RGBA); + if(!(passflag & SCE_PASS_RGBA)) sock->flag |= SOCK_UNAVAIL; + sock= BLI_findlink(&node->outputs, RRES_OUT_DIFF); + if(!(passflag & SCE_PASS_DIFFUSE)) sock->flag |= SOCK_UNAVAIL; + sock= BLI_findlink(&node->outputs, RRES_OUT_SPEC); + if(!(passflag & SCE_PASS_SPEC)) sock->flag |= SOCK_UNAVAIL; + sock= BLI_findlink(&node->outputs, RRES_OUT_SHADOW); + if(!(passflag & SCE_PASS_SHADOW)) sock->flag |= SOCK_UNAVAIL; + sock= BLI_findlink(&node->outputs, RRES_OUT_AO); + if(!(passflag & SCE_PASS_AO)) sock->flag |= SOCK_UNAVAIL; + sock= BLI_findlink(&node->outputs, RRES_OUT_REFLECT); + if(!(passflag & SCE_PASS_REFLECT)) sock->flag |= SOCK_UNAVAIL; + sock= BLI_findlink(&node->outputs, RRES_OUT_REFRACT); + if(!(passflag & SCE_PASS_REFRACT)) sock->flag |= SOCK_UNAVAIL; + sock= BLI_findlink(&node->outputs, RRES_OUT_INDIRECT); + if(!(passflag & SCE_PASS_INDIRECT)) sock->flag |= SOCK_UNAVAIL; + sock= BLI_findlink(&node->outputs, RRES_OUT_INDEXOB); + if(!(passflag & SCE_PASS_INDEXOB)) sock->flag |= SOCK_UNAVAIL; + sock= BLI_findlink(&node->outputs, RRES_OUT_INDEXMA); + if(!(passflag & SCE_PASS_INDEXMA)) sock->flag |= SOCK_UNAVAIL; + sock= BLI_findlink(&node->outputs, RRES_OUT_MIST); + if(!(passflag & SCE_PASS_MIST)) sock->flag |= SOCK_UNAVAIL; + sock= BLI_findlink(&node->outputs, RRES_OUT_EMIT); + if(!(passflag & SCE_PASS_EMIT)) sock->flag |= SOCK_UNAVAIL; + sock= BLI_findlink(&node->outputs, RRES_OUT_ENV); + if(!(passflag & SCE_PASS_ENVIRONMENT)) sock->flag |= SOCK_UNAVAIL; + +} + +/* based on rules, force sockets hidden always */ +void ntreeCompositForceHidden(bNodeTree *ntree, Scene *curscene) +{ + bNode *node; + + if(ntree==NULL) return; + + for(node= ntree->nodes.first; node; node= node->next) { + if( node->type==CMP_NODE_R_LAYERS) { + Scene *sce= node->id?(Scene *)node->id:curscene; + SceneRenderLayer *srl= BLI_findlink(&sce->r.layers, node->custom1); + if(srl) + force_hidden_passes(node, srl->passflag); + } + else if( node->type==CMP_NODE_IMAGE) { + Image *ima= (Image *)node->id; + if(ima) { + if(ima->rr) { + ImageUser *iuser= node->storage; + RenderLayer *rl= BLI_findlink(&ima->rr->layers, iuser->layer); + if(rl) + force_hidden_passes(node, rl->passflag); + else + force_hidden_passes(node, 0); + } + else if(ima->type!=IMA_TYPE_MULTILAYER) { /* if ->rr not yet read we keep inputs */ + force_hidden_passes(node, RRES_OUT_Z); + } + else + force_hidden_passes(node, 0); + } + else + force_hidden_passes(node, 0); + } + } + +} + +/* called from render pipeline, to tag render input and output */ +/* need to do all scenes, to prevent errors when you re-render 1 scene */ +void ntreeCompositTagRender(Scene *curscene) +{ + Scene *sce; + + for(sce= G.main->scene.first; sce; sce= sce->id.next) { + if(sce->nodetree) { + bNode *node; + + for(node= sce->nodetree->nodes.first; node; node= node->next) { + if(node->id==(ID *)curscene || node->type==CMP_NODE_COMPOSITE) + NodeTagChanged(sce->nodetree, node); + else if(node->type==CMP_NODE_TEXTURE) /* uses scene sizex/sizey */ + NodeTagChanged(sce->nodetree, node); + } + } + } +} + +static int node_animation_properties(bNodeTree *ntree, bNode *node) +{ + bNodeSocket *sock; + const ListBase *lb; + Link *link; + PointerRNA ptr; + PropertyRNA *prop; + + /* check to see if any of the node's properties have fcurves */ + RNA_pointer_create((ID *)ntree, &RNA_Node, node, &ptr); + lb = RNA_struct_type_properties(ptr.type); + + for (link=lb->first; link; link=link->next) { + int driven, len=1, index; + prop = (PropertyRNA *)link; + + if (RNA_property_array_check(prop)) + len = RNA_property_array_length(&ptr, prop); + + for (index=0; indexinputs.first; sock; sock=sock->next) { + int driven, len=1, index; + + RNA_pointer_create((ID *)ntree, &RNA_NodeSocket, sock, &ptr); + prop = RNA_struct_find_property(&ptr, "default_value"); + if (prop) { + if (RNA_property_array_check(prop)) + len = RNA_property_array_length(&ptr, prop); + + for (index=0; indexnodes.first; node; node= node->next) { + + tagged = node_animation_properties(ntree, node); + + /* otherwise always tag these node types */ + if(node->type==CMP_NODE_IMAGE) { + Image *ima= (Image *)node->id; + if(ima && ELEM(ima->source, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE)) { + NodeTagChanged(ntree, node); + tagged= 1; + } + } + else if(node->type==CMP_NODE_TIME) { + NodeTagChanged(ntree, node); + tagged= 1; + } + /* here was tag render layer, but this is called after a render, so re-composites fail */ + else if(node->type==NODE_GROUP) { + if( ntreeCompositTagAnimated((bNodeTree *)node->id) ) { + NodeTagChanged(ntree, node); + } + } + } + + return tagged; +} + + +/* called from image window preview */ +void ntreeCompositTagGenerators(bNodeTree *ntree) +{ + bNode *node; + + if(ntree==NULL) return; + + for(node= ntree->nodes.first; node; node= node->next) { + if( ELEM(node->type, CMP_NODE_R_LAYERS, CMP_NODE_IMAGE)) + NodeTagChanged(ntree, node); + } +} + +/* XXX after render animation system gets a refresh, this call allows composite to end clean */ +void ntreeClearTags(bNodeTree *ntree) +{ + bNode *node; + + if(ntree==NULL) return; + + for(node= ntree->nodes.first; node; node= node->next) { + node->need_exec= 0; + if(node->type==NODE_GROUP) + ntreeClearTags((bNodeTree *)node->id); + } +} diff --git a/source/blender/nodes/intern/CMP_util.c b/source/blender/nodes/composite/node_composite_util.c similarity index 99% rename from source/blender/nodes/intern/CMP_util.c rename to source/blender/nodes/composite/node_composite_util.c index a763f34a644..f7759775af0 100644 --- a/source/blender/nodes/intern/CMP_util.c +++ b/source/blender/nodes/composite/node_composite_util.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_util.c 36536 2011-05-07 13:27:27Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,12 +27,12 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_util.c +/** \file blender/nodes/composite/node_composite_util.c * \ingroup nodes */ -#include "CMP_util.h" +#include "node_composite_util.h" CompBuf *alloc_compbuf(int sizex, int sizey, int type, int alloc) { @@ -67,7 +67,7 @@ CompBuf *dupalloc_compbuf(CompBuf *cbuf) { CompBuf *dupbuf= alloc_compbuf(cbuf->x, cbuf->y, cbuf->type, 1); if(dupbuf) { - memmove(dupbuf->rect, cbuf->rect, cbuf->type*sizeof(float)*cbuf->x*cbuf->y); + memcpy(dupbuf->rect, cbuf->rect, cbuf->type*sizeof(float)*cbuf->x*cbuf->y); dupbuf->xof= cbuf->xof; dupbuf->yof= cbuf->yof; @@ -156,7 +156,7 @@ void node_compo_pass_on(bNode *node, bNodeStack **nsin, bNodeStack **nsout) if(valbuf || colbuf || vecbuf) { for(a=0, sock= node->outputs.first; sock; sock= sock->next, a++) { if(nsout[a]->hasoutput) { - if(sock->type==SOCK_VALUE && valbuf) { + if(sock->type==SOCK_FLOAT && valbuf) { nsout[a]->data= pass_on_compbuf(valbuf); valbuf= NULL; } @@ -1325,7 +1325,7 @@ void IIR_gauss(CompBuf* src, float sigma, int chan, int xy) if (src->x < 3) xy &= ~(int) 1; if (src->y < 3) xy &= ~(int) 2; if (xy < 1) return; - + // see "Recursive Gabor Filtering" by Young/VanVliet // all factors here in double.prec. Required, because for single.prec it seems to blow up if sigma > ~200 if (sigma >= 3.556) diff --git a/source/blender/nodes/intern/CMP_util.h b/source/blender/nodes/composite/node_composite_util.h similarity index 97% rename from source/blender/nodes/intern/CMP_util.h rename to source/blender/nodes/composite/node_composite_util.h index 3f37eae2af9..e3158b2a286 100644 --- a/source/blender/nodes/intern/CMP_util.h +++ b/source/blender/nodes/composite/node_composite_util.h @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_util.h 35562 2011-03-15 20:10:32Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,13 +27,13 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_util.h +/** \file blender/nodes/composite/node_composite_util.h * \ingroup nodes */ -#ifndef CMP_NODE_UTILS_H_ -#define CMP_NODE_UTILS_H_ +#ifndef NODE_COMPOSITE_UTIL_H_ +#define NODE_COMPOSITE_UTIL_H_ #include #include @@ -70,7 +70,6 @@ #include "BKE_library.h" #include "BKE_object.h" -#include "../CMP_node.h" #include "node_util.h" #include "IMB_imbuf_types.h" diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_alphaOver.c b/source/blender/nodes/composite/nodes/node_composite_alphaOver.c similarity index 86% rename from source/blender/nodes/intern/CMP_nodes/CMP_alphaOver.c rename to source/blender/nodes/composite/nodes/node_composite_alphaOver.c index 9dcdfaf21e6..400bdd92b6f 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_alphaOver.c +++ b/source/blender/nodes/composite/nodes/node_composite_alphaOver.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_alphaOver.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,22 +27,22 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_alphaOver.c +/** \file blender/nodes/composite/nodes/node_composite_alphaOver.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** ALPHAOVER ******************** */ -static bNodeSocketType cmp_node_alphaover_in[]= { - { SOCK_VALUE, 1, "Fac", 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, - { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_alphaover_in[]= { + { SOCK_FLOAT, 1, "Fac", 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR}, + { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f}, + { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_alphaover_out[]= { - { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_alphaover_out[]= { + { SOCK_RGBA, 0, "Image"}, { -1, 0, "" } }; @@ -140,7 +140,7 @@ static void node_composit_exec_alphaover(void *UNUSED(data), bNode *node, bNodeS } } -static void node_alphaover_init(bNode* node) +static void node_alphaover_init(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { node->storage= MEM_callocN(sizeof(NodeTwoFloats), "NodeTwoFloats"); } @@ -149,8 +149,8 @@ void register_node_type_cmp_alphaover(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_ALPHAOVER, "AlphaOver", NODE_CLASS_OP_COLOR, NODE_OPTIONS, - cmp_node_alphaover_in, cmp_node_alphaover_out); + node_type_base(&ntype, CMP_NODE_ALPHAOVER, "AlphaOver", NODE_CLASS_OP_COLOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_alphaover_in, cmp_node_alphaover_out); node_type_size(&ntype, 80, 40, 120); node_type_init(&ntype, node_alphaover_init); node_type_storage(&ntype, "NodeTwoFloats", node_free_standard_storage, node_copy_standard_storage); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_bilateralblur.c b/source/blender/nodes/composite/nodes/node_composite_bilateralblur.c similarity index 91% rename from source/blender/nodes/intern/CMP_nodes/CMP_bilateralblur.c rename to source/blender/nodes/composite/nodes/node_composite_bilateralblur.c index c106b437e17..e7a9ee12ca1 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_bilateralblur.c +++ b/source/blender/nodes/composite/nodes/node_composite_bilateralblur.c @@ -27,21 +27,21 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_bilateralblur.c +/** \file blender/nodes/composite/nodes/node_composite_bilateralblur.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** BILATERALBLUR ******************** */ -static bNodeSocketType cmp_node_bilateralblur_in[]= { - { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, - { SOCK_RGBA, 1, "Determinator", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_bilateralblur_in[]= { + { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f}, + { SOCK_RGBA, 1, "Determinator", 0.8f, 0.8f, 0.8f, 1.0f}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_bilateralblur_out[]= { - { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_bilateralblur_out[]= { + { SOCK_RGBA, 0, "Image"}, { -1, 0, "" } }; @@ -247,7 +247,7 @@ static void node_composit_exec_bilateralblur(void *UNUSED(data), bNode *node, bN free_compbuf(new); } -static void node_composit_init_bilateralblur(bNode* node) +static void node_composit_init_bilateralblur(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { NodeBilateralBlurData *nbbd= MEM_callocN(sizeof(NodeBilateralBlurData), "node bilateral blur data"); node->storage= nbbd; @@ -259,8 +259,8 @@ void register_node_type_cmp_bilateralblur(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_BILATERALBLUR, "Bilateral Blur", NODE_CLASS_OP_FILTER, NODE_OPTIONS, - cmp_node_bilateralblur_in, cmp_node_bilateralblur_out); + node_type_base(&ntype, CMP_NODE_BILATERALBLUR, "Bilateral Blur", NODE_CLASS_OP_FILTER, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_bilateralblur_in, cmp_node_bilateralblur_out); node_type_size(&ntype, 150, 120, 200); node_type_init(&ntype, node_composit_init_bilateralblur); node_type_storage(&ntype, "NodeBilateralBlurData", node_free_standard_storage, node_copy_standard_storage); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_blur.c b/source/blender/nodes/composite/nodes/node_composite_blur.c similarity index 96% rename from source/blender/nodes/intern/CMP_nodes/CMP_blur.c rename to source/blender/nodes/composite/nodes/node_composite_blur.c index 718578a921b..7b1a9623845 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_blur.c +++ b/source/blender/nodes/composite/nodes/node_composite_blur.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_blur.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -28,21 +28,21 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_blur.c +/** \file blender/nodes/composite/nodes/node_composite_blur.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** BLUR ******************** */ -static bNodeSocketType cmp_node_blur_in[]= { - { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "Size", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_blur_in[]= { + { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f}, + { SOCK_FLOAT, 1, "Size", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_blur_out[]= { - { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_blur_out[]= { + { SOCK_RGBA, 0, "Image"}, { -1, 0, "" } }; @@ -713,7 +713,7 @@ static void node_composit_exec_blur(void *data, bNode *node, bNodeStack **in, bN generate_preview(data, node, out[0]->data); } -static void node_composit_init_blur(bNode* node) +static void node_composit_init_blur(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { node->storage= MEM_callocN(sizeof(NodeBlurData), "node blur data"); } @@ -722,8 +722,8 @@ void register_node_type_cmp_blur(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_BLUR, "Blur", NODE_CLASS_OP_FILTER, NODE_PREVIEW|NODE_OPTIONS, - cmp_node_blur_in, cmp_node_blur_out); + node_type_base(&ntype, CMP_NODE_BLUR, "Blur", NODE_CLASS_OP_FILTER, NODE_PREVIEW|NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_blur_in, cmp_node_blur_out); node_type_size(&ntype, 120, 80, 200); node_type_init(&ntype, node_composit_init_blur); node_type_storage(&ntype, "NodeBlurData", node_free_standard_storage, node_copy_standard_storage); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_brightness.c b/source/blender/nodes/composite/nodes/node_composite_brightness.c similarity index 79% rename from source/blender/nodes/intern/CMP_nodes/CMP_brightness.c rename to source/blender/nodes/composite/nodes/node_composite_brightness.c index 50a8d05b03d..1a5cf956a52 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_brightness.c +++ b/source/blender/nodes/composite/nodes/node_composite_brightness.c @@ -1,5 +1,5 @@ /* -* $Id$ +* $Id: CMP_brightness.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -28,24 +28,24 @@ */ -/** \file blender/nodes/intern/CMP_nodes/CMP_brightness.c +/** \file blender/nodes/composite/nodes/node_composite_brightness.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** Brigh and contrsast ******************** */ -static bNodeSocketType cmp_node_brightcontrast_in[]= { - { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "Bright", 0.0f, 0.0f, 0.0f, 0.0f, -100.0f, 100.0f}, - { SOCK_VALUE, 1, "Contrast", 0.0f, 0.0f, 0.0f, 0.0f, -100.0f, 100.0f}, +static bNodeSocketTemplate cmp_node_brightcontrast_in[]= { + { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f}, + { SOCK_FLOAT, 1, "Bright", 0.0f, 0.0f, 0.0f, 0.0f, -100.0f, 100.0f, PROP_NONE}, + { SOCK_FLOAT, 1, "Contrast", 0.0f, 0.0f, 0.0f, 0.0f, -100.0f, 100.0f, PROP_NONE}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_brightcontrast_out[]= { - { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_brightcontrast_out[]= { + { SOCK_RGBA, 0, "Image"}, { -1, 0, "" } }; @@ -100,8 +100,8 @@ void register_node_type_cmp_brightcontrast(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_BRIGHTCONTRAST, "Bright/Contrast", NODE_CLASS_OP_COLOR, NODE_OPTIONS, - cmp_node_brightcontrast_in, cmp_node_brightcontrast_out); + node_type_base(&ntype, CMP_NODE_BRIGHTCONTRAST, "Bright/Contrast", NODE_CLASS_OP_COLOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_brightcontrast_in, cmp_node_brightcontrast_out); node_type_size(&ntype, 140, 100, 320); node_type_exec(&ntype, node_composit_exec_brightcontrast); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c b/source/blender/nodes/composite/nodes/node_composite_channelMatte.c similarity index 89% rename from source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c rename to source/blender/nodes/composite/nodes/node_composite_channelMatte.c index e395716f36d..afdbe82aebc 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c +++ b/source/blender/nodes/composite/nodes/node_composite_channelMatte.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_channelMatte.c 36536 2011-05-07 13:27:27Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,23 +27,23 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_channelMatte.c +/** \file blender/nodes/composite/nodes/node_composite_channelMatte.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* ******************* Channel Matte Node ********************************* */ -static bNodeSocketType cmp_node_channel_matte_in[]={ - {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_channel_matte_in[]={ + {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f}, {-1,0,""} }; -static bNodeSocketType cmp_node_channel_matte_out[]={ - {SOCK_RGBA,0,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, - {SOCK_VALUE,0,"Matte",0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_channel_matte_out[]={ + {SOCK_RGBA,0,"Image"}, + {SOCK_FLOAT,0,"Matte"}, {-1,0,""} }; @@ -187,7 +187,7 @@ static void node_composit_exec_channel_matte(void *data, bNode *node, bNodeStack } -static void node_composit_init_channel_matte(bNode *node) +static void node_composit_init_channel_matte(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node chroma"); node->storage=c; @@ -206,8 +206,8 @@ void register_node_type_cmp_channel_matte(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_CHANNEL_MATTE, "Channel Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS, - cmp_node_channel_matte_in, cmp_node_channel_matte_out); + node_type_base(&ntype, CMP_NODE_CHANNEL_MATTE, "Channel Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_channel_matte_in, cmp_node_channel_matte_out); node_type_size(&ntype, 200, 80, 250); node_type_init(&ntype, node_composit_init_channel_matte); node_type_storage(&ntype, "NodeChroma", node_free_standard_storage, node_copy_standard_storage); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c b/source/blender/nodes/composite/nodes/node_composite_chromaMatte.c similarity index 88% rename from source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c rename to source/blender/nodes/composite/nodes/node_composite_chromaMatte.c index 03230f2e212..db5e6d93856 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c +++ b/source/blender/nodes/composite/nodes/node_composite_chromaMatte.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_chromaMatte.c 36536 2011-05-07 13:27:27Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,23 +27,23 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c +/** \file blender/nodes/composite/nodes/node_composite_chromaMatte.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* ******************* Chroma Key ********************************************************** */ -static bNodeSocketType cmp_node_chroma_in[]={ - {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, - {SOCK_RGBA,1,"Key Color", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_chroma_in[]={ + {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f}, + {SOCK_RGBA,1,"Key Color", 0.8f, 0.8f, 0.8f, 1.0f}, {-1,0,""} }; -static bNodeSocketType cmp_node_chroma_out[]={ - {SOCK_RGBA,0,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, - {SOCK_VALUE,0,"Matte",0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_chroma_out[]={ + {SOCK_RGBA,0,"Image"}, + {SOCK_FLOAT,0,"Matte"}, {-1,0,""} }; @@ -178,7 +178,7 @@ static void node_composit_exec_chroma_matte(void *data, bNode *node, bNodeStack } -static void node_composit_init_chroma_matte(bNode *node) +static void node_composit_init_chroma_matte(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node chroma"); node->storage= c; @@ -193,8 +193,8 @@ void register_node_type_cmp_chroma_matte(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_CHROMA_MATTE, "Chroma Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS, - cmp_node_chroma_in, cmp_node_chroma_out); + node_type_base(&ntype, CMP_NODE_CHROMA_MATTE, "Chroma Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_chroma_in, cmp_node_chroma_out); node_type_size(&ntype, 200, 80, 300); node_type_init(&ntype, node_composit_init_chroma_matte); node_type_storage(&ntype, "NodeChroma", node_free_standard_storage, node_copy_standard_storage); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_colorMatte.c b/source/blender/nodes/composite/nodes/node_composite_colorMatte.c similarity index 84% rename from source/blender/nodes/intern/CMP_nodes/CMP_colorMatte.c rename to source/blender/nodes/composite/nodes/node_composite_colorMatte.c index 55d77a902b9..7f687240daf 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_colorMatte.c +++ b/source/blender/nodes/composite/nodes/node_composite_colorMatte.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_colorMatte.c 36536 2011-05-07 13:27:27Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,23 +27,23 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_colorMatte.c +/** \file blender/nodes/composite/nodes/node_composite_colorMatte.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* ******************* Color Key ********************************************************** */ -static bNodeSocketType cmp_node_color_in[]={ - {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, - {SOCK_RGBA,1,"Key Color", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_color_in[]={ + {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f}, + {SOCK_RGBA,1,"Key Color", 0.8f, 0.8f, 0.8f, 1.0f}, {-1,0,""} }; -static bNodeSocketType cmp_node_color_out[]={ - {SOCK_RGBA,0,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, - {SOCK_VALUE,0,"Matte",0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_color_out[]={ + {SOCK_RGBA,0,"Image"}, + {SOCK_FLOAT,0,"Matte"}, {-1,0,""} }; @@ -114,7 +114,7 @@ static void node_composit_exec_color_matte(void *data, bNode *node, bNodeStack * free_compbuf(cbuf); } -static void node_composit_init_color_matte(bNode *node) +static void node_composit_init_color_matte(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node color"); node->storage= c; @@ -129,8 +129,8 @@ void register_node_type_cmp_color_matte(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_COLOR_MATTE, "Color Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS, - cmp_node_color_in, cmp_node_color_out); + node_type_base(&ntype, CMP_NODE_COLOR_MATTE, "Color Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_color_in, cmp_node_color_out); node_type_size(&ntype, 200, 80, 300); node_type_init(&ntype, node_composit_init_color_matte); node_type_storage(&ntype, "NodeChroma", node_free_standard_storage, node_copy_standard_storage); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_colorSpill.c b/source/blender/nodes/composite/nodes/node_composite_colorSpill.c similarity index 93% rename from source/blender/nodes/intern/CMP_nodes/CMP_colorSpill.c rename to source/blender/nodes/composite/nodes/node_composite_colorSpill.c index 905d97709c3..18b6d806c82 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_colorSpill.c +++ b/source/blender/nodes/composite/nodes/node_composite_colorSpill.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_colorSpill.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,25 +27,25 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_colorSpill.c +/** \file blender/nodes/composite/nodes/node_composite_colorSpill.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" #define avg(a,b) ((a+b)/2) /* ******************* Color Spill Supression ********************************* */ -static bNodeSocketType cmp_node_color_spill_in[]={ - {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, - {SOCK_VALUE, 1, "Fac", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_color_spill_in[]={ + {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f}, + {SOCK_FLOAT, 1, "Fac", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR}, {-1,0,""} }; -static bNodeSocketType cmp_node_color_spill_out[]={ - {SOCK_RGBA,0,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_color_spill_out[]={ + {SOCK_RGBA,0,"Image"}, {-1,0,""} }; @@ -315,7 +315,7 @@ static void node_composit_exec_color_spill(void *UNUSED(data), bNode *node, bNod free_compbuf(spillmap); } -static void node_composit_init_color_spill(bNode *node) +static void node_composit_init_color_spill(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { NodeColorspill *ncs= MEM_callocN(sizeof(NodeColorspill), "node colorspill"); node->storage=ncs; @@ -330,8 +330,8 @@ void register_node_type_cmp_color_spill(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_COLOR_SPILL, "Color Spill", NODE_CLASS_MATTE, NODE_OPTIONS, - cmp_node_color_spill_in, cmp_node_color_spill_out); + node_type_base(&ntype, CMP_NODE_COLOR_SPILL, "Color Spill", NODE_CLASS_MATTE, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_color_spill_in, cmp_node_color_spill_out); node_type_size(&ntype, 140, 80, 200); node_type_init(&ntype, node_composit_init_color_spill); node_type_storage(&ntype, "NodeColorspill", node_free_standard_storage, node_copy_standard_storage); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c b/source/blender/nodes/composite/nodes/node_composite_colorbalance.c similarity index 91% rename from source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c rename to source/blender/nodes/composite/nodes/node_composite_colorbalance.c index 4074ea2fa29..7ebceb5c206 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c +++ b/source/blender/nodes/composite/nodes/node_composite_colorbalance.c @@ -27,24 +27,24 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_colorbalance.c +/** \file blender/nodes/composite/nodes/node_composite_colorbalance.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* ******************* Color Balance ********************************* */ -static bNodeSocketType cmp_node_colorbalance_in[]={ - {SOCK_VALUE, 1, "Fac", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_colorbalance_in[]={ + {SOCK_FLOAT, 1, "Fac", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR}, + {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f}, {-1,0,""} }; -static bNodeSocketType cmp_node_colorbalance_out[]={ - {SOCK_RGBA,0,"Image", 0.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_colorbalance_out[]={ + {SOCK_RGBA,0,"Image"}, {-1,0,""} }; @@ -175,7 +175,7 @@ static void node_composit_exec_colorbalance(void *UNUSED(data), bNode *node, bNo } } -static void node_composit_init_colorbalance(bNode *node) +static void node_composit_init_colorbalance(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { NodeColorBalance *n= node->storage= MEM_callocN(sizeof(NodeColorBalance), "node colorbalance"); @@ -188,8 +188,8 @@ void register_node_type_cmp_colorbalance(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_COLORBALANCE, "Color Balance", NODE_CLASS_OP_COLOR, NODE_OPTIONS, - cmp_node_colorbalance_in, cmp_node_colorbalance_out); + node_type_base(&ntype, CMP_NODE_COLORBALANCE, "Color Balance", NODE_CLASS_OP_COLOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_colorbalance_in, cmp_node_colorbalance_out); node_type_size(&ntype, 400, 200, 400); node_type_init(&ntype, node_composit_init_colorbalance); node_type_storage(&ntype, "NodeColorBalance", node_free_standard_storage, node_copy_standard_storage); diff --git a/source/blender/nodes/composite/nodes/node_composite_common.c b/source/blender/nodes/composite/nodes/node_composite_common.c new file mode 100644 index 00000000000..ab8cf663ef2 --- /dev/null +++ b/source/blender/nodes/composite/nodes/node_composite_common.c @@ -0,0 +1,373 @@ +/* + * $Id: CMP_blur.c 35562 2011-03-15 20:10:32Z lukastoenne $ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2006 Blender Foundation. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): Campbell Barton, Alfredo de Greef, David Millan Escriva, + * Juho Vepsäläinen + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/nodes/composite/nodes/node_composite_common.c + * \ingroup cmpnodes + */ + + +#include "DNA_node_types.h" + +#include "BKE_node.h" + +#include "node_composite_util.h" +#include "node_common.h" +#include "node_exec.h" + +#if 0 +static void PRINT_BUFFERS(bNodeTreeExec *exec) +{ + bNodeTree *ntree= exec->nodetree; + bNode *node; + bNodeSocket *sock; + bNodeStack *ns; + int i; + + printf("-------------- DEBUG --------------\n"); + for (sock=ntree->inputs.first, i=0; sock; sock=sock->next, ++i) { + ns = node_get_socket_stack(exec->stack, sock); + printf("%d. Tree Input %s", i, sock->name); + if (ns->external) + printf(" (external)"); + printf(": data=%p\n", ns->data); + } + for (sock=ntree->outputs.first, i=0; sock; sock=sock->next, ++i) { + ns = node_get_socket_stack(exec->stack, sock); + printf("%d. Tree Output %s", i, sock->name); + if (ns->external) + printf(" (external)"); + printf(": data=%p\n", ns->data); + } + for (node=ntree->nodes.first; node; node=node->next) { + printf("Node %s:\n", node->name); + for (sock=node->inputs.first, i=0; sock; sock=sock->next, ++i) { + ns = node_get_socket_stack(exec->stack, sock); + printf("\t%d. Input %s", i, sock->name); + if (ns->external) + printf(" (external)"); + printf(": data=%p\n", ns->data); + } + for (sock=node->outputs.first, i=0; sock; sock=sock->next, ++i) { + ns = node_get_socket_stack(exec->stack, sock); + printf("\t%d. Output %s", i, sock->name); + if (ns->external) + printf(" (external)"); + printf(": data=%p\n", ns->data); + } + } +} +#endif + +static void copy_stack(bNodeStack *to, bNodeStack *from) +{ + if (to != from) { + copy_v4_v4(to->vec, from->vec); + to->data = from->data; + to->datatype = from->datatype; + + /* tag as copy to prevent freeing */ + to->is_copy = 1; + } +} + +static void move_stack(bNodeStack *to, bNodeStack *from) +{ + if (to != from) { + copy_v4_v4(to->vec, from->vec); + to->data = from->data; + to->datatype = from->datatype; + to->is_copy = from->is_copy; + + zero_v4(from->vec); + from->data = NULL; + from->datatype = 0; + from->is_copy = 0; + } +} + +/**** GROUP ****/ + +static void *group_initexec(bNode *node) +{ + bNodeTree *ngroup= (bNodeTree*)node->id; + bNodeTreeExec *exec; + bNodeSocket *sock; + bNodeStack *ns; + + /* initialize the internal node tree execution */ + exec = ntreeCompositBeginExecTree(ngroup); + + /* tag group outputs as external to prevent freeing */ + for (sock=ngroup->outputs.first; sock; sock=sock->next) { + if (!(sock->flag & SOCK_INTERNAL)) { + ns = node_get_socket_stack(exec->stack, sock); + ns->external = 1; + } + } + + return exec; +} + +static void group_freeexec(bNode *UNUSED(node), void *nodedata) +{ + bNodeTreeExec *gexec= (bNodeTreeExec*)nodedata; + + ntreeCompositEndExecTree(gexec); +} + +/* Copy inputs to the internal stack. + * This is a shallow copy, no buffers are duplicated here! + */ +static void group_copy_inputs(bNode *node, bNodeStack **in, bNodeStack *gstack) +{ + bNodeSocket *sock; + bNodeStack *ns; + int a; + for (sock=node->inputs.first, a=0; sock; sock=sock->next, ++a) { + if (sock->groupsock) { + ns = node_get_socket_stack(gstack, sock->groupsock); + copy_stack(ns, in[a]); + } + } +} + +/* Copy internal results to the external outputs. + */ +static void group_move_outputs(bNode *node, bNodeStack **out, bNodeStack *gstack) +{ + bNodeSocket *sock; + bNodeStack *ns; + int a; + for (sock=node->outputs.first, a=0; sock; sock=sock->next, ++a) { + if (sock->groupsock) { + ns = node_get_socket_stack(gstack, sock->groupsock); + move_stack(out[a], ns); + } + } +} + +/* Free internal buffers */ +static void group_free_internal(bNodeTreeExec *gexec) { + bNodeStack *ns; + int i; + + for (i=0, ns=gexec->stack; i < gexec->stacksize; ++i, ++ns) { + if (!ns->external && !ns->is_copy) { + if (ns->data) { + free_compbuf(ns->data); + ns->data = NULL; + } + } + } +} + +static void group_execute(void *data, int thread, struct bNode *node, void *nodedata, struct bNodeStack **in, struct bNodeStack **out) +{ + bNodeTreeExec *exec= (bNodeTreeExec*)nodedata; + + /* XXX same behavior as trunk: all nodes inside group are executed. + * it's stupid, but just makes it work. compo redesign will do this better. + */ + { + bNode *inode; + for (inode=exec->nodetree->nodes.first; inode; inode=inode->next) + inode->need_exec = 1; + } + + group_copy_inputs(node, in, exec->stack); + ntreeExecNodes(exec, data, thread); + group_free_internal(exec); + group_move_outputs(node, out, exec->stack); +} + +void register_node_type_cmp_group(ListBase *lb) +{ + static bNodeType ntype; + + node_type_base(&ntype, NODE_GROUP, "Group", NODE_CLASS_GROUP, NODE_OPTIONS|NODE_CONST_OUTPUT); + node_type_socket_templates(&ntype, NULL, NULL); + node_type_size(&ntype, 120, 60, 200); + node_type_label(&ntype, node_group_label); + node_type_init(&ntype, node_group_init); + node_type_valid(&ntype, node_group_valid); + node_type_template(&ntype, node_group_template); + node_type_update(&ntype, NULL, node_group_verify); + node_type_group_edit(&ntype, node_group_edit_get, node_group_edit_set, node_group_edit_clear); + node_type_exec_new(&ntype, group_initexec, group_freeexec, group_execute); + + nodeRegisterType(lb, &ntype); +} + + +/**** FOR LOOP ****/ + +#if 0 /* XXX loop nodes don't work nicely with current trees */ +/* Move the results from the previous iteration back to the input sockets. */ +static void loop_iteration_reset(bNodeTree *ngroup, bNodeStack *gstack) +{ + bNodeSocket *gin, *gout; + bNodeStack *nsin, *nsout; + + gin = ngroup->inputs.first; + gout = ngroup->outputs.first; + + while (gin && gout) { + /* skip static (non-looping) sockets */ + while (gin && !(gin->flag & SOCK_DYNAMIC)) + gin=gin->next; + while (gout && !(gout->flag & SOCK_DYNAMIC)) + gout=gout->next; + + if (gin && gout) { + nsin = node_get_socket_stack(gstack, gin); + nsout = node_get_socket_stack(gstack, gout); + + move_stack(nsin, nsout); + + gin=gin->next; + gout=gout->next; + } + } +} + +static void forloop_execute(void *data, int thread, struct bNode *node, void *nodedata, struct bNodeStack **in, struct bNodeStack **out) +{ + bNodeTreeExec *exec= (bNodeTreeExec*)nodedata; + int totiterations= (int)in[0]->vec[0]; + bNodeSocket *sock; + bNodeStack *ns; + int iteration; + + /* XXX same behavior as trunk: all nodes inside group are executed. + * it's stupid, but just makes it work. compo redesign will do this better. + */ + { + bNode *inode; + for (inode=exec->nodetree->nodes.first; inode; inode=inode->next) + inode->need_exec = 1; + } + + /* "Iteration" socket */ + sock = exec->nodetree->inputs.first; + ns = node_get_socket_stack(exec->stack, sock); + + group_copy_inputs(node, in, exec->stack); + for (iteration=0; iteration < totiterations; ++iteration) { + /* first input contains current iteration counter */ + ns->vec[0] = (float)iteration; + + if (iteration > 0) + loop_iteration_reset(exec->nodetree, exec->stack); + ntreeExecNodes(exec, data, thread); + group_free_internal(exec); + } + group_move_outputs(node, out, exec->stack); +} + +void register_node_type_cmp_forloop(ListBase *lb) +{ + static bNodeType ntype; + + node_type_base(&ntype, NODE_FORLOOP, "For", NODE_CLASS_GROUP, NODE_OPTIONS); + node_type_socket_templates(&ntype, NULL, NULL); + node_type_size(&ntype, 120, 60, 200); + node_type_label(&ntype, node_group_label); + node_type_init(&ntype, node_forloop_init); + node_type_valid(&ntype, node_group_valid); + node_type_template(&ntype, node_forloop_template); + node_type_update(&ntype, NULL, node_group_verify); + node_type_tree(&ntype, node_forloop_init_tree, node_loop_update_tree); + node_type_group_edit(&ntype, node_group_edit_get, node_group_edit_set, node_group_edit_clear); + node_type_exec_new(&ntype, group_initexec, group_freeexec, forloop_execute); + + nodeRegisterType(lb, &ntype); +} +#endif + + +/**** WHILE LOOP ****/ + +#if 0 /* XXX loop nodes don't work nicely with current trees */ +static void whileloop_execute(void *data, int thread, struct bNode *node, void *nodedata, struct bNodeStack **in, struct bNodeStack **out) +{ + bNodeTreeExec *exec= (bNodeTreeExec*)nodedata; + int condition= (in[0]->vec[0] > 0.0f); + bNodeSocket *sock; + bNodeStack *ns; + int iteration; + + /* XXX same behavior as trunk: all nodes inside group are executed. + * it's stupid, but just makes it work. compo redesign will do this better. + */ + { + bNode *inode; + for (inode=exec->nodetree->nodes.first; inode; inode=inode->next) + inode->need_exec = 1; + } + + /* "Condition" socket */ + sock = exec->nodetree->outputs.first; + ns = node_get_socket_stack(exec->stack, sock); + + iteration = 0; + group_copy_inputs(node, in, exec->stack); + while (condition && iteration < node->custom1) { + if (iteration > 0) + loop_iteration_reset(exec->nodetree, exec->stack); + ntreeExecNodes(exec, data, thread); + group_free_internal(exec); + +// PRINT_BUFFERS(exec); + + condition = (ns->vec[0] > 0.0f); + ++iteration; + } + group_move_outputs(node, out, exec->stack); +} + +void register_node_type_cmp_whileloop(ListBase *lb) +{ + static bNodeType ntype; + + node_type_base(&ntype, NODE_WHILELOOP, "While", NODE_CLASS_GROUP, NODE_OPTIONS); + node_type_socket_templates(&ntype, NULL, NULL); + node_type_size(&ntype, 120, 60, 200); + node_type_label(&ntype, node_group_label); + node_type_init(&ntype, node_whileloop_init); + node_type_valid(&ntype, node_group_valid); + node_type_template(&ntype, node_whileloop_template); + node_type_update(&ntype, NULL, node_group_verify); + node_type_tree(&ntype, node_whileloop_init_tree, node_loop_update_tree); + node_type_group_edit(&ntype, node_group_edit_get, node_group_edit_set, node_group_edit_clear); + node_type_exec_new(&ntype, group_initexec, group_freeexec, whileloop_execute); + + nodeRegisterType(lb, &ntype); +} +#endif diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_composite.c b/source/blender/nodes/composite/nodes/node_composite_composite.c similarity index 85% rename from source/blender/nodes/intern/CMP_nodes/CMP_composite.c rename to source/blender/nodes/composite/nodes/node_composite_composite.c index fb68f56ae64..be6246b42d8 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_composite.c +++ b/source/blender/nodes/composite/nodes/node_composite_composite.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_composite.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,20 +27,20 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_composite.c +/** \file blender/nodes/composite/nodes/node_composite_composite.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** COMPOSITE ******************** */ -static bNodeSocketType cmp_node_composite_in[]= { - { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "Z", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_composite_in[]= { + { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_FLOAT, 1, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR}, + { SOCK_FLOAT, 1, "Z", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR}, { -1, 0, "" } }; @@ -103,8 +103,8 @@ void register_node_type_cmp_composite(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_COMPOSITE, "Composite", NODE_CLASS_OUTPUT, NODE_PREVIEW, - cmp_node_composite_in, NULL); + node_type_base(&ntype, CMP_NODE_COMPOSITE, "Composite", NODE_CLASS_OUTPUT, NODE_PREVIEW); + node_type_socket_templates(&ntype, cmp_node_composite_in, NULL); node_type_size(&ntype, 80, 60, 200); node_type_exec(&ntype, node_composit_exec_composite); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_crop.c b/source/blender/nodes/composite/nodes/node_composite_crop.c similarity index 87% rename from source/blender/nodes/intern/CMP_nodes/CMP_crop.c rename to source/blender/nodes/composite/nodes/node_composite_crop.c index 0331217f0cb..332ecf39616 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_crop.c +++ b/source/blender/nodes/composite/nodes/node_composite_crop.c @@ -27,21 +27,21 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_crop.c +/** \file blender/nodes/composite/nodes/node_composite_crop.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** Crop ******************** */ -static bNodeSocketType cmp_node_crop_in[]= { - { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_crop_in[]= { + { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_crop_out[]= { - { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_crop_out[]= { + { SOCK_RGBA, 0, "Image"}, { -1, 0, "" } }; @@ -103,7 +103,7 @@ static void node_composit_exec_crop(void *UNUSED(data), bNode *node, bNodeStack } } -static void node_composit_init_crop(bNode* node) +static void node_composit_init_crop(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { NodeTwoXYs *nxy= MEM_callocN(sizeof(NodeTwoXYs), "node xy data"); node->storage= nxy; @@ -117,8 +117,8 @@ void register_node_type_cmp_crop(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_CROP, "Crop", NODE_CLASS_DISTORT, NODE_OPTIONS, - cmp_node_crop_in, cmp_node_crop_out); + node_type_base(&ntype, CMP_NODE_CROP, "Crop", NODE_CLASS_DISTORT, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_crop_in, cmp_node_crop_out); node_type_size(&ntype, 140, 100, 320); node_type_init(&ntype, node_composit_init_crop); node_type_storage(&ntype, "NodeTwoXYs", node_free_standard_storage, node_copy_standard_storage); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_curves.c b/source/blender/nodes/composite/nodes/node_composite_curves.c similarity index 78% rename from source/blender/nodes/intern/CMP_nodes/CMP_curves.c rename to source/blender/nodes/composite/nodes/node_composite_curves.c index 921c5e21fea..a830b595321 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_curves.c +++ b/source/blender/nodes/composite/nodes/node_composite_curves.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_curves.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,19 +27,19 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_curves.c +/** \file blender/nodes/composite/nodes/node_composite_curves.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** CURVE Time ******************** */ /* custom1 = sfra, custom2 = efra */ -static bNodeSocketType cmp_node_time_out[]= { - { SOCK_VALUE, 0, "Fac", 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_time_out[]= { + { SOCK_FLOAT, 0, "Fac"}, { -1, 0, "" } }; @@ -57,7 +57,7 @@ static void node_composit_exec_curves_time(void *data, bNode *node, bNodeStack * } -static void node_composit_init_curves_time(bNode* node) +static void node_composit_init_curves_time(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { node->custom1= 1; node->custom2= 250; @@ -68,8 +68,8 @@ void register_node_type_cmp_curve_time(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_TIME, "Time", NODE_CLASS_INPUT, NODE_OPTIONS, - NULL, cmp_node_time_out); + node_type_base(&ntype, CMP_NODE_TIME, "Time", NODE_CLASS_INPUT, NODE_OPTIONS); + node_type_socket_templates(&ntype, NULL, cmp_node_time_out); node_type_size(&ntype, 140, 100, 320); node_type_init(&ntype, node_composit_init_curves_time); node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves); @@ -82,13 +82,13 @@ void register_node_type_cmp_curve_time(ListBase *lb) /* **************** CURVE VEC ******************** */ -static bNodeSocketType cmp_node_curve_vec_in[]= { - { SOCK_VECTOR, 1, "Vector", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_curve_vec_in[]= { + { SOCK_VECTOR, 1, "Vector", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_NONE}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_curve_vec_out[]= { - { SOCK_VECTOR, 0, "Vector", 0.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_curve_vec_out[]= { + { SOCK_VECTOR, 0, "Vector"}, { -1, 0, "" } }; @@ -100,7 +100,7 @@ static void node_composit_exec_curve_vec(void *UNUSED(data), bNode *node, bNodeS curvemapping_evaluate_premulRGBF(node->storage, out[0]->vec, in[0]->vec); } -static void node_composit_init_curve_vec(bNode* node) +static void node_composit_init_curve_vec(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { node->storage= curvemapping_add(3, -1.0f, -1.0f, 1.0f, 1.0f); } @@ -109,8 +109,8 @@ void register_node_type_cmp_curve_vec(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_CURVE_VEC, "Vector Curves", NODE_CLASS_OP_VECTOR, NODE_OPTIONS, - cmp_node_curve_vec_in, cmp_node_curve_vec_out); + node_type_base(&ntype, CMP_NODE_CURVE_VEC, "Vector Curves", NODE_CLASS_OP_VECTOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_curve_vec_in, cmp_node_curve_vec_out); node_type_size(&ntype, 200, 140, 320); node_type_init(&ntype, node_composit_init_curve_vec); node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves); @@ -121,16 +121,16 @@ void register_node_type_cmp_curve_vec(ListBase *lb) /* **************** CURVE RGB ******************** */ -static bNodeSocketType cmp_node_curve_rgb_in[]= { - { SOCK_VALUE, 1, "Fac", 1.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f}, - { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f}, - { SOCK_RGBA, 1, "Black Level", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f}, - { SOCK_RGBA, 1, "White Level", 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_curve_rgb_in[]= { + { SOCK_FLOAT, 1, "Fac", 1.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_FACTOR}, + { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_RGBA, 1, "Black Level", 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_RGBA, 1, "White Level", 1.0f, 1.0f, 1.0f, 1.0f}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_curve_rgb_out[]= { - { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_curve_rgb_out[]= { + { SOCK_RGBA, 0, "Image"}, { -1, 0, "" } }; @@ -187,7 +187,7 @@ static void node_composit_exec_curve_rgb(void *UNUSED(data), bNode *node, bNodeS } -static void node_composit_init_curve_rgb(bNode* node) +static void node_composit_init_curve_rgb(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { node->storage= curvemapping_add(4, 0.0f, 0.0f, 1.0f, 1.0f); } @@ -196,8 +196,8 @@ void register_node_type_cmp_curve_rgb(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_CURVE_RGB, "RGB Curves", NODE_CLASS_OP_COLOR, NODE_OPTIONS, - cmp_node_curve_rgb_in, cmp_node_curve_rgb_out); + node_type_base(&ntype, CMP_NODE_CURVE_RGB, "RGB Curves", NODE_CLASS_OP_COLOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_curve_rgb_in, cmp_node_curve_rgb_out); node_type_size(&ntype, 200, 140, 320); node_type_init(&ntype, node_composit_init_curve_rgb); node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c b/source/blender/nodes/composite/nodes/node_composite_defocus.c similarity index 97% rename from source/blender/nodes/intern/CMP_nodes/CMP_defocus.c rename to source/blender/nodes/composite/nodes/node_composite_defocus.c index f249e2cff6c..a218bfb009d 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c +++ b/source/blender/nodes/composite/nodes/node_composite_defocus.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_defocus.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,21 +27,21 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_defocus.c +/** \file blender/nodes/composite/nodes/node_composite_defocus.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* ************ qdn: Defocus node ****************** */ -static bNodeSocketType cmp_node_defocus_in[]= { - { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "Z", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_defocus_in[]= { + { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f}, + { SOCK_FLOAT, 1, "Z", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f, PROP_FACTOR}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_defocus_out[]= { - { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_defocus_out[]= { + { SOCK_RGBA, 0, "Image"}, { -1, 0, "" } }; @@ -857,7 +857,7 @@ static void node_composit_exec_defocus(void *UNUSED(data), bNode *node, bNodeSta if (zbuf_use && (zbuf_use != zbuf)) free_compbuf(zbuf_use); } -static void node_composit_init_defocus(bNode* node) +static void node_composit_init_defocus(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { /* qdn: defocus node */ NodeDefocus *nbd = MEM_callocN(sizeof(NodeDefocus), "node defocus data"); @@ -878,8 +878,8 @@ void register_node_type_cmp_defocus(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_DEFOCUS, "Defocus", NODE_CLASS_OP_FILTER, NODE_OPTIONS, - cmp_node_defocus_in, cmp_node_defocus_out); + node_type_base(&ntype, CMP_NODE_DEFOCUS, "Defocus", NODE_CLASS_OP_FILTER, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_defocus_in, cmp_node_defocus_out); node_type_size(&ntype, 150, 120, 200); node_type_init(&ntype, node_composit_init_defocus); node_type_storage(&ntype, "NodeDefocus", node_free_standard_storage, node_copy_standard_storage); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c b/source/blender/nodes/composite/nodes/node_composite_diffMatte.c similarity index 84% rename from source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c rename to source/blender/nodes/composite/nodes/node_composite_diffMatte.c index 296053298da..a0fff88f5dc 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c +++ b/source/blender/nodes/composite/nodes/node_composite_diffMatte.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_diffMatte.c 36536 2011-05-07 13:27:27Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,23 +27,23 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_diffMatte.c +/** \file blender/nodes/composite/nodes/node_composite_diffMatte.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* ******************* channel Difference Matte ********************************* */ -static bNodeSocketType cmp_node_diff_matte_in[]={ - {SOCK_RGBA,1,"Image 1", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, - {SOCK_RGBA,1,"Image 2", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_diff_matte_in[]={ + {SOCK_RGBA,1,"Image 1", 0.8f, 0.8f, 0.8f, 1.0f}, + {SOCK_RGBA,1,"Image 2", 0.8f, 0.8f, 0.8f, 1.0f}, {-1,0,""} }; -static bNodeSocketType cmp_node_diff_matte_out[]={ - {SOCK_RGBA,0,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, - {SOCK_VALUE,0,"Matte",0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_diff_matte_out[]={ + {SOCK_RGBA,0,"Image"}, + {SOCK_FLOAT,0,"Matte"}, {-1,0,""} }; @@ -125,7 +125,7 @@ static void node_composit_exec_diff_matte(void *data, bNode *node, bNodeStack ** free_compbuf(imbuf2); } -static void node_composit_init_diff_matte(bNode *node) +static void node_composit_init_diff_matte(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node chroma"); node->storage= c; @@ -137,8 +137,8 @@ void register_node_type_cmp_diff_matte(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_DIFF_MATTE, "Difference Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS, - cmp_node_diff_matte_in, cmp_node_diff_matte_out); + node_type_base(&ntype, CMP_NODE_DIFF_MATTE, "Difference Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_diff_matte_in, cmp_node_diff_matte_out); node_type_size(&ntype, 200, 80, 250); node_type_init(&ntype, node_composit_init_diff_matte); node_type_storage(&ntype, "NodeChroma", node_free_standard_storage, node_copy_standard_storage); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_dilate.c b/source/blender/nodes/composite/nodes/node_composite_dilate.c similarity index 87% rename from source/blender/nodes/intern/CMP_nodes/CMP_dilate.c rename to source/blender/nodes/composite/nodes/node_composite_dilate.c index f5d16ff0ab8..ef47fdbfef0 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_dilate.c +++ b/source/blender/nodes/composite/nodes/node_composite_dilate.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_dilate.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,22 +27,22 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_dilate.c +/** \file blender/nodes/composite/nodes/node_composite_dilate.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** Dilate/Erode ******************** */ -static bNodeSocketType cmp_node_dilateerode_in[]= { - { SOCK_VALUE, 1, "Mask", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_dilateerode_in[]= { + { SOCK_FLOAT, 1, "Mask", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_dilateerode_out[]= { - { SOCK_VALUE, 0, "Mask", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_dilateerode_out[]= { + { SOCK_FLOAT, 0, "Mask"}, { -1, 0, "" } }; @@ -152,8 +152,8 @@ void register_node_type_cmp_dilateerode(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_DILATEERODE, "Dilate/Erode", NODE_CLASS_OP_FILTER, NODE_OPTIONS, - cmp_node_dilateerode_in, cmp_node_dilateerode_out); + node_type_base(&ntype, CMP_NODE_DILATEERODE, "Dilate/Erode", NODE_CLASS_OP_FILTER, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_dilateerode_in, cmp_node_dilateerode_out); node_type_size(&ntype, 130, 100, 320); node_type_exec(&ntype, node_composit_exec_dilateerode); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_directionalblur.c b/source/blender/nodes/composite/nodes/node_composite_directionalblur.c similarity index 88% rename from source/blender/nodes/intern/CMP_nodes/CMP_directionalblur.c rename to source/blender/nodes/composite/nodes/node_composite_directionalblur.c index 2a8bbcc9ad5..3d541120a61 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_directionalblur.c +++ b/source/blender/nodes/composite/nodes/node_composite_directionalblur.c @@ -26,20 +26,20 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_directionalblur.c +/** \file blender/nodes/composite/nodes/node_composite_directionalblur.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" -static bNodeSocketType cmp_node_dblur_in[]= { - { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.f, 0.f, 1.f}, +static bNodeSocketTemplate cmp_node_dblur_in[]= { + { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.f}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_dblur_out[]= { - { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_dblur_out[]= { + { SOCK_RGBA, 0, "Image"}, { -1, 0, "" } }; @@ -122,7 +122,7 @@ static void node_composit_exec_dblur(void *UNUSED(data), bNode *node, bNodeStack out[0]->data= dblur(node, new, ndbd->iter, ndbd->wrap, ndbd->center_x, ndbd->center_y, ndbd->distance, ndbd->angle, ndbd->spin, ndbd->zoom); } -static void node_composit_init_dblur(bNode* node) +static void node_composit_init_dblur(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { NodeDBlurData *ndbd= MEM_callocN(sizeof(NodeDBlurData), "node dblur data"); node->storage= ndbd; @@ -134,8 +134,8 @@ void register_node_type_cmp_dblur(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_DBLUR, "Directional Blur", NODE_CLASS_OP_FILTER, NODE_OPTIONS, - cmp_node_dblur_in, cmp_node_dblur_out); + node_type_base(&ntype, CMP_NODE_DBLUR, "Directional Blur", NODE_CLASS_OP_FILTER, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_dblur_in, cmp_node_dblur_out); node_type_size(&ntype, 150, 120, 200); node_type_init(&ntype, node_composit_init_dblur); node_type_storage(&ntype, "NodeDBlurData", node_free_standard_storage, node_copy_standard_storage); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_displace.c b/source/blender/nodes/composite/nodes/node_composite_displace.c similarity index 88% rename from source/blender/nodes/intern/CMP_nodes/CMP_displace.c rename to source/blender/nodes/composite/nodes/node_composite_displace.c index 9139edf8560..4688553d27f 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_displace.c +++ b/source/blender/nodes/composite/nodes/node_composite_displace.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_displace.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,25 +27,25 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_displace.c +/** \file blender/nodes/composite/nodes/node_composite_displace.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** Displace ******************** */ -static bNodeSocketType cmp_node_displace_in[]= { - { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, - { SOCK_VECTOR, 1, "Vector", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "X Scale", 0.0f, 0.0f, 0.0f, 0.0f, -1000.0f, 1000.0f}, - { SOCK_VALUE, 1, "Y Scale", 0.0f, 0.0f, 0.0f, 0.0f, -1000.0f, 1000.0f}, +static bNodeSocketTemplate cmp_node_displace_in[]= { + { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f}, + { SOCK_VECTOR, 1, "Vector", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_TRANSLATION}, + { SOCK_FLOAT, 1, "X Scale", 0.0f, 0.0f, 0.0f, 0.0f, -1000.0f, 1000.0f, PROP_FACTOR}, + { SOCK_FLOAT, 1, "Y Scale", 0.0f, 0.0f, 0.0f, 0.0f, -1000.0f, 1000.0f, PROP_FACTOR}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_displace_out[]= { - { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_displace_out[]= { + { SOCK_RGBA, 0, "Image"}, { -1, 0, "" } }; @@ -188,8 +188,8 @@ void register_node_type_cmp_displace(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_DISPLACE, "Displace", NODE_CLASS_DISTORT, NODE_OPTIONS, - cmp_node_displace_in, cmp_node_displace_out); + node_type_base(&ntype, CMP_NODE_DISPLACE, "Displace", NODE_CLASS_DISTORT, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_displace_in, cmp_node_displace_out); node_type_size(&ntype, 140, 100, 320); node_type_exec(&ntype, node_composit_exec_displace); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c b/source/blender/nodes/composite/nodes/node_composite_distanceMatte.c similarity index 83% rename from source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c rename to source/blender/nodes/composite/nodes/node_composite_distanceMatte.c index 5f7613464c1..c895eab391c 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c +++ b/source/blender/nodes/composite/nodes/node_composite_distanceMatte.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_distanceMatte.c 36536 2011-05-07 13:27:27Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,23 +27,23 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c +/** \file blender/nodes/composite/nodes/node_composite_distanceMatte.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* ******************* channel Distance Matte ********************************* */ -static bNodeSocketType cmp_node_distance_matte_in[]={ - {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, - {SOCK_RGBA,1,"Key Color", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_distance_matte_in[]={ + {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f}, + {SOCK_RGBA,1,"Key Color", 0.8f, 0.8f, 0.8f, 1.0f}, {-1,0,""} }; -static bNodeSocketType cmp_node_distance_matte_out[]={ - {SOCK_RGBA,0,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, - {SOCK_VALUE,0,"Matte",0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_distance_matte_out[]={ + {SOCK_RGBA,0,"Image"}, + {SOCK_FLOAT,0,"Matte"}, {-1,0,""} }; @@ -122,7 +122,7 @@ static void node_composit_exec_distance_matte(void *data, bNode *node, bNodeStac free_compbuf(inbuf); } -static void node_composit_init_distance_matte(bNode *node) +static void node_composit_init_distance_matte(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node chroma"); node->storage= c; @@ -134,8 +134,8 @@ void register_node_type_cmp_distance_matte(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_DIST_MATTE, "Distance Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS, - cmp_node_distance_matte_in, cmp_node_distance_matte_out); + node_type_base(&ntype, CMP_NODE_DIST_MATTE, "Distance Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_distance_matte_in, cmp_node_distance_matte_out); node_type_size(&ntype, 200, 80, 250); node_type_init(&ntype, node_composit_init_distance_matte); node_type_storage(&ntype, "NodeChroma", node_free_standard_storage, node_copy_standard_storage); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_filter.c b/source/blender/nodes/composite/nodes/node_composite_filter.c similarity index 92% rename from source/blender/nodes/intern/CMP_nodes/CMP_filter.c rename to source/blender/nodes/composite/nodes/node_composite_filter.c index 915cb01d2d4..6beeec49c63 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_filter.c +++ b/source/blender/nodes/composite/nodes/node_composite_filter.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_filter.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,21 +27,21 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_filter.c +/** \file blender/nodes/composite/nodes/node_composite_filter.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** FILTER ******************** */ -static bNodeSocketType cmp_node_filter_in[]= { - { SOCK_VALUE, 1, "Fac", 1.0f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, - { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_filter_in[]= { + { SOCK_FLOAT, 1, "Fac", 1.0f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f, PROP_FACTOR}, + { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_filter_out[]= { - { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_filter_out[]= { + { SOCK_RGBA, 0, "Image"}, { -1, 0, "" } }; @@ -226,8 +226,8 @@ void register_node_type_cmp_filter(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_FILTER, "Filter", NODE_CLASS_OP_FILTER, NODE_PREVIEW|NODE_OPTIONS, - cmp_node_filter_in, cmp_node_filter_out); + node_type_base(&ntype, CMP_NODE_FILTER, "Filter", NODE_CLASS_OP_FILTER, NODE_PREVIEW|NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_filter_in, cmp_node_filter_out); node_type_size(&ntype, 80, 40, 120); node_type_label(&ntype, node_filter_label); node_type_exec(&ntype, node_composit_exec_filter); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_flip.c b/source/blender/nodes/composite/nodes/node_composite_flip.c similarity index 85% rename from source/blender/nodes/intern/CMP_nodes/CMP_flip.c rename to source/blender/nodes/composite/nodes/node_composite_flip.c index b5fd7b46e03..026130641a3 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_flip.c +++ b/source/blender/nodes/composite/nodes/node_composite_flip.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_flip.c 36333 2011-04-26 09:27:43Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,21 +27,21 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_flip.c +/** \file blender/nodes/composite/nodes/node_composite_flip.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** Flip ******************** */ -static bNodeSocketType cmp_node_flip_in[]= { - { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_flip_in[]= { + { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_flip_out[]= { - { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_flip_out[]= { + { SOCK_RGBA, 0, "Image"}, { -1, 0, "" } }; @@ -94,8 +94,8 @@ void register_node_type_cmp_flip(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_FLIP, "Flip", NODE_CLASS_DISTORT, NODE_OPTIONS, - cmp_node_flip_in, cmp_node_flip_out); + node_type_base(&ntype, CMP_NODE_FLIP, "Flip", NODE_CLASS_DISTORT, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_flip_in, cmp_node_flip_out); node_type_size(&ntype, 140, 100, 320); node_type_exec(&ntype, node_composit_exec_flip); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_gamma.c b/source/blender/nodes/composite/nodes/node_composite_gamma.c similarity index 81% rename from source/blender/nodes/intern/CMP_nodes/CMP_gamma.c rename to source/blender/nodes/composite/nodes/node_composite_gamma.c index 261257d3b5f..d191f649f1f 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_gamma.c +++ b/source/blender/nodes/composite/nodes/node_composite_gamma.c @@ -1,5 +1,5 @@ /* -* $Id$ +* $Id: CMP_gamma.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -28,22 +28,22 @@ */ -/** \file blender/nodes/intern/CMP_nodes/CMP_gamma.c +/** \file blender/nodes/composite/nodes/node_composite_gamma.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** Gamma Tools ******************** */ -static bNodeSocketType cmp_node_gamma_in[]= { - { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "Gamma", 1.0f, 0.0f, 0.0f, 0.0f, 0.001f, 10.0f}, +static bNodeSocketTemplate cmp_node_gamma_in[]= { + { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f}, + { SOCK_FLOAT, 1, "Gamma", 1.0f, 0.0f, 0.0f, 0.0f, 0.001f, 10.0f, PROP_UNSIGNED}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_gamma_out[]= { - { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_gamma_out[]= { + { SOCK_RGBA, 0, "Image"}, { -1, 0, "" } }; @@ -81,8 +81,8 @@ void register_node_type_cmp_gamma(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_GAMMA, "Gamma", NODE_CLASS_OP_COLOR, NODE_OPTIONS, - cmp_node_gamma_in, cmp_node_gamma_out); + node_type_base(&ntype, CMP_NODE_GAMMA, "Gamma", NODE_CLASS_OP_COLOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_gamma_in, cmp_node_gamma_out); node_type_size(&ntype, 140, 100, 320); node_type_exec(&ntype, node_composit_exec_gamma); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_glare.c b/source/blender/nodes/composite/nodes/node_composite_glare.c similarity index 96% rename from source/blender/nodes/intern/CMP_nodes/CMP_glare.c rename to source/blender/nodes/composite/nodes/node_composite_glare.c index 2e0822a4511..0890b9ba24b 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_glare.c +++ b/source/blender/nodes/composite/nodes/node_composite_glare.c @@ -26,19 +26,19 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_glare.c +/** \file blender/nodes/composite/nodes/node_composite_glare.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" -static bNodeSocketType cmp_node_glare_in[]= { - { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_glare_in[]= { + { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_glare_out[]= { - { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_glare_out[]= { + { SOCK_RGBA, 0, "Image"}, { -1, 0, "" } }; @@ -474,7 +474,7 @@ static void node_composit_exec_glare(void *UNUSED(data), bNode *node, bNodeStack out[0]->data = new; } -static void node_composit_init_glare(bNode* node) +static void node_composit_init_glare(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { NodeGlare *ndg = MEM_callocN(sizeof(NodeGlare), "node glare data"); ndg->quality = 1; @@ -494,8 +494,8 @@ void register_node_type_cmp_glare(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_GLARE, "Glare", NODE_CLASS_OP_FILTER, NODE_OPTIONS, - cmp_node_glare_in, cmp_node_glare_out); + node_type_base(&ntype, CMP_NODE_GLARE, "Glare", NODE_CLASS_OP_FILTER, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_glare_in, cmp_node_glare_out); node_type_size(&ntype, 150, 120, 200); node_type_init(&ntype, node_composit_init_glare); node_type_storage(&ntype, "NodeGlare", node_free_standard_storage, node_copy_standard_storage); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_hueSatVal.c b/source/blender/nodes/composite/nodes/node_composite_hueSatVal.c similarity index 82% rename from source/blender/nodes/intern/CMP_nodes/CMP_hueSatVal.c rename to source/blender/nodes/composite/nodes/node_composite_hueSatVal.c index 7b5511c699c..525728ade31 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_hueSatVal.c +++ b/source/blender/nodes/composite/nodes/node_composite_hueSatVal.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_hueSatVal.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,22 +27,22 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_hueSatVal.c +/** \file blender/nodes/composite/nodes/node_composite_hueSatVal.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** Hue Saturation ******************** */ -static bNodeSocketType cmp_node_hue_sat_in[]= { - { SOCK_VALUE, 1, "Fac", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, - { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_hue_sat_in[]= { + { SOCK_FLOAT, 1, "Fac", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR}, + { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_hue_sat_out[]= { - { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_hue_sat_out[]= { + { SOCK_RGBA, 0, "Image"}, { -1, 0, "" } }; @@ -95,7 +95,7 @@ static void node_composit_exec_hue_sat(void *UNUSED(data), bNode *node, bNodeSta } } -static void node_composit_init_hue_sat(bNode* node) +static void node_composit_init_hue_sat(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { NodeHueSat *nhs= MEM_callocN(sizeof(NodeHueSat), "node hue sat"); node->storage= nhs; @@ -108,8 +108,8 @@ void register_node_type_cmp_hue_sat(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_HUE_SAT, "Hue Saturation Value", NODE_CLASS_OP_COLOR, NODE_OPTIONS, - cmp_node_hue_sat_in, cmp_node_hue_sat_out); + node_type_base(&ntype, CMP_NODE_HUE_SAT, "Hue Saturation Value", NODE_CLASS_OP_COLOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_hue_sat_in, cmp_node_hue_sat_out); node_type_size(&ntype, 150, 80, 250); node_type_init(&ntype, node_composit_init_hue_sat); node_type_storage(&ntype, "NodeHueSat", node_free_standard_storage, node_copy_standard_storage); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_huecorrect.c b/source/blender/nodes/composite/nodes/node_composite_huecorrect.c similarity index 87% rename from source/blender/nodes/intern/CMP_nodes/CMP_huecorrect.c rename to source/blender/nodes/composite/nodes/node_composite_huecorrect.c index edf6c454285..edf26aed882 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_huecorrect.c +++ b/source/blender/nodes/composite/nodes/node_composite_huecorrect.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_huecorrect.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,21 +27,21 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_huecorrect.c +/** \file blender/nodes/composite/nodes/node_composite_huecorrect.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" -static bNodeSocketType cmp_node_huecorrect_in[]= { - { SOCK_VALUE, 1, "Fac", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_huecorrect_in[]= { + { SOCK_FLOAT, 1, "Fac", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR}, + { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_huecorrect_out[]= { - { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_huecorrect_out[]= { + { SOCK_RGBA, 0, "Image"}, { -1, 0, "" } }; @@ -137,7 +137,7 @@ static void node_composit_exec_huecorrect(void *UNUSED(data), bNode *node, bNode } -static void node_composit_init_huecorrect(bNode* node) +static void node_composit_init_huecorrect(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { CurveMapping *cumapping = node->storage= curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f); int c; @@ -157,8 +157,8 @@ void register_node_type_cmp_huecorrect(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_HUECORRECT, "Hue Correct", NODE_CLASS_OP_COLOR, NODE_OPTIONS, - cmp_node_huecorrect_in, cmp_node_huecorrect_out); + node_type_base(&ntype, CMP_NODE_HUECORRECT, "Hue Correct", NODE_CLASS_OP_COLOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_huecorrect_in, cmp_node_huecorrect_out); node_type_size(&ntype, 320, 140, 400); node_type_init(&ntype, node_composit_init_huecorrect); node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_idMask.c b/source/blender/nodes/composite/nodes/node_composite_idMask.c similarity index 84% rename from source/blender/nodes/intern/CMP_nodes/CMP_idMask.c rename to source/blender/nodes/composite/nodes/node_composite_idMask.c index 72d0de7d15e..97d84997697 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_idMask.c +++ b/source/blender/nodes/composite/nodes/node_composite_idMask.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_idMask.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,22 +27,22 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_idMask.c +/** \file blender/nodes/composite/nodes/node_composite_idMask.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** ID Mask ******************** */ -static bNodeSocketType cmp_node_idmask_in[]= { - { SOCK_VALUE, 1, "ID value", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_idmask_in[]= { + { SOCK_FLOAT, 1, "ID value", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f, PROP_NONE}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_idmask_out[]= { - { SOCK_VALUE, 0, "Alpha", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_idmask_out[]= { + { SOCK_FLOAT, 0, "Alpha"}, { -1, 0, "" } }; @@ -113,8 +113,8 @@ void register_node_type_cmp_idmask(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_ID_MASK, "ID Mask", NODE_CLASS_CONVERTOR, NODE_OPTIONS, - cmp_node_idmask_in, cmp_node_idmask_out); + node_type_base(&ntype, CMP_NODE_ID_MASK, "ID Mask", NODE_CLASS_CONVERTOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_idmask_in, cmp_node_idmask_out); node_type_size(&ntype, 140, 100, 320); node_type_exec(&ntype, node_composit_exec_idmask); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_image.c b/source/blender/nodes/composite/nodes/node_composite_image.c similarity index 93% rename from source/blender/nodes/intern/CMP_nodes/CMP_image.c rename to source/blender/nodes/composite/nodes/node_composite_image.c index a5f256054cd..1278202d5b5 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_image.c +++ b/source/blender/nodes/composite/nodes/node_composite_image.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_image.c 36536 2011-05-07 13:27:27Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,20 +27,20 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_image.c +/** \file blender/nodes/composite/nodes/node_composite_image.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** IMAGE (and RenderResult, multilayer image) ******************** */ -static bNodeSocketType cmp_node_rlayers_out[]= { +static bNodeSocketTemplate cmp_node_rlayers_out[]= { { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 0, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 0, "Z", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_FLOAT, 0, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_FLOAT, 0, "Z", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, { SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, { SOCK_VECTOR, 0, "UV", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, { SOCK_VECTOR, 0, "Speed", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, @@ -52,9 +52,9 @@ static bNodeSocketType cmp_node_rlayers_out[]= { { SOCK_RGBA, 0, "Reflect", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, { SOCK_RGBA, 0, "Refract", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, { SOCK_RGBA, 0, "Indirect", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 0, "IndexOB", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 0, "IndexMA", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 0, "Mist", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_FLOAT, 0, "IndexOB", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_FLOAT, 0, "IndexMA", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_FLOAT, 0, "Mist", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, { SOCK_RGBA, 0, "Emit", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, { SOCK_RGBA, 0, "Environment",0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, { -1, 0, "" } @@ -74,7 +74,7 @@ static CompBuf *node_composit_get_image(RenderData *rd, Image *ima, ImageUser *i ibuf= BKE_image_get_ibuf(ima, iuser); if(ibuf==NULL || (ibuf->rect==NULL && ibuf->rect_float==NULL)) { - return NULL; + return NULL; } if (ibuf->rect_float == NULL) { @@ -213,7 +213,7 @@ static void outputs_multilayer_get(RenderData *rd, RenderLayer *rl, bNodeStack * if(out[RRES_OUT_INDEXOB]->hasoutput) out[RRES_OUT_INDEXOB]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_INDEXOB); if(out[RRES_OUT_INDEXMA]->hasoutput) - out[RRES_OUT_INDEXMA]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_INDEXMA); + out[RRES_OUT_INDEXMA]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_INDEXMA); if(out[RRES_OUT_MIST]->hasoutput) out[RRES_OUT_MIST]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_MIST); if(out[RRES_OUT_EMIT]->hasoutput) @@ -295,7 +295,7 @@ static void node_composit_exec_image(void *data, bNode *node, bNodeStack **UNUSE } } -static void node_composit_init_image(bNode* node) +static void node_composit_init_image(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { ImageUser *iuser= MEM_callocN(sizeof(ImageUser), "node image user"); node->storage= iuser; @@ -309,8 +309,8 @@ void register_node_type_cmp_image(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_IMAGE, "Image", NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS, - NULL, cmp_node_rlayers_out); + node_type_base(&ntype, CMP_NODE_IMAGE, "Image", NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS); + node_type_socket_templates(&ntype, NULL, cmp_node_rlayers_out); node_type_size(&ntype, 120, 80, 300); node_type_init(&ntype, node_composit_init_image); node_type_storage(&ntype, "ImageUser", node_free_standard_storage, node_copy_standard_storage); @@ -440,8 +440,8 @@ void register_node_type_cmp_rlayers(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_R_LAYERS, "Render Layers", NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS, - NULL, cmp_node_rlayers_out); + node_type_base(&ntype, CMP_NODE_R_LAYERS, "Render Layers", NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS); + node_type_socket_templates(&ntype, NULL, cmp_node_rlayers_out); node_type_size(&ntype, 150, 100, 300); node_type_exec(&ntype, node_composit_exec_rlayers); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_invert.c b/source/blender/nodes/composite/nodes/node_composite_invert.c similarity index 84% rename from source/blender/nodes/intern/CMP_nodes/CMP_invert.c rename to source/blender/nodes/composite/nodes/node_composite_invert.c index 27b0324dfe0..1f7589cae8f 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_invert.c +++ b/source/blender/nodes/composite/nodes/node_composite_invert.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_invert.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,21 +27,21 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_invert.c +/** \file blender/nodes/composite/nodes/node_composite_invert.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** INVERT ******************** */ -static bNodeSocketType cmp_node_invert_in[]= { - { SOCK_VALUE, 1, "Fac", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, - { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_invert_in[]= { + { SOCK_FLOAT, 1, "Fac", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR}, + { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_invert_out[]= { - { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_invert_out[]= { + { SOCK_RGBA, 0, "Color"}, { -1, 0, "" } }; @@ -114,7 +114,7 @@ static void node_composit_exec_invert(void *UNUSED(data), bNode *node, bNodeStac } } -static void node_composit_init_invert(bNode *node) +static void node_composit_init_invert(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { node->custom1 |= CMP_CHAN_RGB; } @@ -124,8 +124,8 @@ void register_node_type_cmp_invert(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_INVERT, "Invert", NODE_CLASS_OP_COLOR, NODE_OPTIONS, - cmp_node_invert_in, cmp_node_invert_out); + node_type_base(&ntype, CMP_NODE_INVERT, "Invert", NODE_CLASS_OP_COLOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_invert_in, cmp_node_invert_out); node_type_size(&ntype, 120, 120, 140); node_type_init(&ntype, node_composit_init_invert); node_type_exec(&ntype, node_composit_exec_invert); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_lensdist.c b/source/blender/nodes/composite/nodes/node_composite_lensdist.c similarity index 90% rename from source/blender/nodes/intern/CMP_nodes/CMP_lensdist.c rename to source/blender/nodes/composite/nodes/node_composite_lensdist.c index 3a005210c6a..85578deecbb 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_lensdist.c +++ b/source/blender/nodes/composite/nodes/node_composite_lensdist.c @@ -26,21 +26,21 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_lensdist.c +/** \file blender/nodes/composite/nodes/node_composite_lensdist.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" -static bNodeSocketType cmp_node_lensdist_in[]= { - { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "Distort", 0.f, 0.f, 0.f, 0.f, -0.999f, 1.f}, - { SOCK_VALUE, 1, "Dispersion", 0.f, 0.f, 0.f, 0.f, 0.f, 1.f}, +static bNodeSocketTemplate cmp_node_lensdist_in[]= { + { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f}, + { SOCK_FLOAT, 1, "Distort", 0.f, 0.f, 0.f, 0.f, -0.999f, 1.f, PROP_NONE}, + { SOCK_FLOAT, 1, "Dispersion", 0.f, 0.f, 0.f, 0.f, 0.f, 1.f, PROP_NONE}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_lensdist_out[]= { - { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_lensdist_out[]= { + { SOCK_RGBA, 0, "Image"}, { -1, 0, "" } }; @@ -183,7 +183,7 @@ static void node_composit_exec_lensdist(void *UNUSED(data), bNode *node, bNodeSt } -static void node_composit_init_lensdist(bNode* node) +static void node_composit_init_lensdist(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { NodeLensDist *nld = MEM_callocN(sizeof(NodeLensDist), "node lensdist data"); nld->jit = nld->proj = nld->fit = 0; @@ -195,8 +195,8 @@ void register_node_type_cmp_lensdist(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_LENSDIST, "Lens Distortion", NODE_CLASS_DISTORT, NODE_OPTIONS, - cmp_node_lensdist_in, cmp_node_lensdist_out); + node_type_base(&ntype, CMP_NODE_LENSDIST, "Lens Distortion", NODE_CLASS_DISTORT, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_lensdist_in, cmp_node_lensdist_out); node_type_size(&ntype, 150, 120, 200); node_type_init(&ntype, node_composit_init_lensdist); node_type_storage(&ntype, "NodeLensDist", node_free_standard_storage, node_copy_standard_storage); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_levels.c b/source/blender/nodes/composite/nodes/node_composite_levels.c similarity index 87% rename from source/blender/nodes/intern/CMP_nodes/CMP_levels.c rename to source/blender/nodes/composite/nodes/node_composite_levels.c index 2c9f7d97f09..673ffe4cbef 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_levels.c +++ b/source/blender/nodes/composite/nodes/node_composite_levels.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_levels.c 36536 2011-05-07 13:27:27Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,23 +27,23 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_levels.c +/** \file blender/nodes/composite/nodes/node_composite_levels.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** LEVELS ******************** */ -static bNodeSocketType cmp_node_view_levels_in[]= { - { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_view_levels_in[]= { + { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_view_levels_out[]={ - {SOCK_VALUE, 0,"Mean",0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - {SOCK_VALUE, 0,"Std Dev",0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_view_levels_out[]={ + {SOCK_FLOAT, 0,"Mean"}, + {SOCK_FLOAT, 0,"Std Dev"}, {-1,0,""} }; @@ -52,7 +52,7 @@ static void rgb_tobw(float r, float g, float b, float* out) *out= r*0.35f + g*0.45f + b*0.2f; } -static void fill_bins(bNode* node, CompBuf* in, int* bins, int colorcor) +static void fill_bins(bNode* node, CompBuf* in, int* bins) { float value[4]; int ivalue=0; @@ -68,39 +68,29 @@ static void fill_bins(bNode* node, CompBuf* in, int* bins, int colorcor) if(value[3] > 0.0) { /* don't count transparent pixels */ switch(node->custom1) { case 1: { /* all colors */ - if(colorcor) - linearrgb_to_srgb_v3_v3(&value[0],&value[0]); rgb_tobw(value[0],value[1],value[2], &value[0]); value[0]=value[0]*255; /* scale to 0-255 range */ ivalue=(int)value[0]; break; } case 2: { /* red channel */ - if(colorcor) - value[0]=linearrgb_to_srgb(value[0]); value[0]=value[0]*255; /* scale to 0-255 range */ ivalue=(int)value[0]; break; } case 3: { /* green channel */ - if(colorcor) - value[1]=linearrgb_to_srgb(value[1]); value[1]=value[1]*255; /* scale to 0-255 range */ ivalue=(int)value[1]; break; } case 4: /*blue channel */ { - if(colorcor) - value[2]=linearrgb_to_srgb(value[2]); value[2]=value[2]*255; /* scale to 0-255 range */ ivalue=(int)value[2]; break; } case 5: /* luminence */ { - if(colorcor) - linearrgb_to_srgb_v3_v3(&value[0],&value[0]); rgb_to_yuv(value[0],value[1],value[2], &value[0], &value[1], &value[2]); value[0]=value[0]*255; /* scale to 0-255 range */ ivalue=(int)value[0]; @@ -285,7 +275,6 @@ static void node_composit_exec_view_levels(void *data, bNode *node, bNodeStack * { CompBuf* cbuf; CompBuf* histogram; - RenderData *rd=data; float mean, std_dev; int bins[256]; int x; @@ -302,7 +291,7 @@ static void node_composit_exec_view_levels(void *data, bNode *node, bNodeStack * } /*fill bins */ - fill_bins(node, in[0]->data, bins, rd->color_mgt_flag & R_COLOR_MANAGEMENT); + fill_bins(node, in[0]->data, bins); /* draw the histogram chart */ draw_histogram(node, histogram, bins); @@ -328,7 +317,7 @@ static void node_composit_exec_view_levels(void *data, bNode *node, bNodeStack * free_compbuf(histogram); } -static void node_composit_init_view_levels(bNode* node) +static void node_composit_init_view_levels(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { node->custom1=1; /*All channels*/ } @@ -337,8 +326,8 @@ void register_node_type_cmp_view_levels(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_VIEW_LEVELS, "Levels", NODE_CLASS_OUTPUT, NODE_OPTIONS|NODE_PREVIEW, - cmp_node_view_levels_in, cmp_node_view_levels_out); + node_type_base(&ntype, CMP_NODE_VIEW_LEVELS, "Levels", NODE_CLASS_OUTPUT, NODE_OPTIONS|NODE_PREVIEW); + node_type_socket_templates(&ntype, cmp_node_view_levels_in, cmp_node_view_levels_out); node_type_size(&ntype, 140, 100, 320); node_type_init(&ntype, node_composit_init_view_levels); node_type_storage(&ntype, "ImageUser", NULL, NULL); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c b/source/blender/nodes/composite/nodes/node_composite_lummaMatte.c similarity index 82% rename from source/blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c rename to source/blender/nodes/composite/nodes/node_composite_lummaMatte.c index 34e58791932..bc7676934fa 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c +++ b/source/blender/nodes/composite/nodes/node_composite_lummaMatte.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_lummaMatte.c 36536 2011-05-07 13:27:27Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,23 +27,23 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c +/** \file blender/nodes/composite/nodes/node_composite_lummaMatte.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* ******************* Luma Matte Node ********************************* */ -static bNodeSocketType cmp_node_luma_matte_in[]={ - {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_luma_matte_in[]={ + {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f}, {-1,0,""} }; -static bNodeSocketType cmp_node_luma_matte_out[]={ - {SOCK_RGBA,0,"Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, - {SOCK_VALUE,0,"Matte",0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_luma_matte_out[]={ + {SOCK_RGBA,0,"Image"}, + {SOCK_FLOAT,0,"Matte"}, {-1,0,""} }; @@ -100,7 +100,7 @@ static void node_composit_exec_luma_matte(void *data, bNode *node, bNodeStack ** free_compbuf(cbuf); } -static void node_composit_init_luma_matte(bNode *node) +static void node_composit_init_luma_matte(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { NodeChroma *c= MEM_callocN(sizeof(NodeChroma), "node chroma"); node->storage=c; @@ -112,8 +112,8 @@ void register_node_type_cmp_luma_matte(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_LUMA_MATTE, "Luminance Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS, - cmp_node_luma_matte_in, cmp_node_luma_matte_out); + node_type_base(&ntype, CMP_NODE_LUMA_MATTE, "Luminance Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_luma_matte_in, cmp_node_luma_matte_out); node_type_size(&ntype, 200, 80, 250); node_type_init(&ntype, node_composit_init_luma_matte); node_type_storage(&ntype, "NodeChroma", node_free_standard_storage, node_copy_standard_storage); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_mapUV.c b/source/blender/nodes/composite/nodes/node_composite_mapUV.c similarity index 90% rename from source/blender/nodes/intern/CMP_nodes/CMP_mapUV.c rename to source/blender/nodes/composite/nodes/node_composite_mapUV.c index 6b2c561b14a..2d92c26b554 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_mapUV.c +++ b/source/blender/nodes/composite/nodes/node_composite_mapUV.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_mapUV.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,22 +27,22 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_mapUV.c +/** \file blender/nodes/composite/nodes/node_composite_mapUV.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** Map UV ******************** */ -static bNodeSocketType cmp_node_mapuv_in[]= { - { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, - { SOCK_VECTOR, 1, "UV", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_mapuv_in[]= { + { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f}, + { SOCK_VECTOR, 1, "UV", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_mapuv_out[]= { - { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_mapuv_out[]= { + { SOCK_RGBA, 0, "Image"}, { -1, 0, "" } }; @@ -168,8 +168,8 @@ void register_node_type_cmp_mapuv(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_MAP_UV, "Map UV", NODE_CLASS_DISTORT, NODE_OPTIONS, - cmp_node_mapuv_in, cmp_node_mapuv_out); + node_type_base(&ntype, CMP_NODE_MAP_UV, "Map UV", NODE_CLASS_DISTORT, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_mapuv_in, cmp_node_mapuv_out); node_type_size(&ntype, 140, 100, 320); node_type_exec(&ntype, node_composit_exec_mapuv); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_mapValue.c b/source/blender/nodes/composite/nodes/node_composite_mapValue.c similarity index 80% rename from source/blender/nodes/intern/CMP_nodes/CMP_mapValue.c rename to source/blender/nodes/composite/nodes/node_composite_mapValue.c index f14e0fbd804..0d38aca4ce3 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_mapValue.c +++ b/source/blender/nodes/composite/nodes/node_composite_mapValue.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_mapValue.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,20 +27,20 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_mapValue.c +/** \file blender/nodes/composite/nodes/node_composite_mapValue.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** MAP VALUE ******************** */ -static bNodeSocketType cmp_node_map_value_in[]= { - { SOCK_VALUE, 1, "Value", 1.0f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_map_value_in[]= { + { SOCK_FLOAT, 1, "Value", 1.0f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f, PROP_NONE}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_map_value_out[]= { - { SOCK_VALUE, 0, "Value", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_map_value_out[]= { + { SOCK_FLOAT, 0, "Value"}, { -1, 0, "" } }; @@ -79,7 +79,7 @@ static void node_composit_exec_map_value(void *UNUSED(data), bNode *node, bNodeS } -static void node_composit_init_map_value(bNode* node) +static void node_composit_init_map_value(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { node->storage= add_mapping(); } @@ -88,8 +88,8 @@ void register_node_type_cmp_map_value(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_MAP_VALUE, "Map Value", NODE_CLASS_OP_VECTOR, NODE_OPTIONS, - cmp_node_map_value_in, cmp_node_map_value_out); + node_type_base(&ntype, CMP_NODE_MAP_VALUE, "Map Value", NODE_CLASS_OP_VECTOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_map_value_in, cmp_node_map_value_out); node_type_size(&ntype, 100, 60, 150); node_type_init(&ntype, node_composit_init_map_value); node_type_storage(&ntype, "TexMapping", node_free_standard_storage, node_copy_standard_storage); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_math.c b/source/blender/nodes/composite/nodes/node_composite_math.c similarity index 89% rename from source/blender/nodes/intern/CMP_nodes/CMP_math.c rename to source/blender/nodes/composite/nodes/node_composite_math.c index b7a67f3563b..2489491fdd8 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_math.c +++ b/source/blender/nodes/composite/nodes/node_composite_math.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_math.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,22 +27,22 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_math.c +/** \file blender/nodes/composite/nodes/node_composite_math.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** SCALAR MATH ******************** */ -static bNodeSocketType cmp_node_math_in[]= { - { SOCK_VALUE, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -10000.0f, 10000.0f}, - { SOCK_VALUE, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -10000.0f, 10000.0f}, +static bNodeSocketTemplate cmp_node_math_in[]= { + { SOCK_FLOAT, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -10000.0f, 10000.0f, PROP_NONE}, + { SOCK_FLOAT, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -10000.0f, 10000.0f, PROP_NONE}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_math_out[]= { - { SOCK_VALUE, 0, "Value", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_math_out[]= { + { SOCK_FLOAT, 0, "Value"}, { -1, 0, "" } }; @@ -145,7 +145,6 @@ static void do_math(bNode *node, float *out, float *in, float *in2) out[0]= floorf(in[0] / in2[0] + 0.5f) * in2[0]; else out[0]= floorf(in[0] + 0.5f); - } break; case 15: /* Less Than */ @@ -201,8 +200,8 @@ void register_node_type_cmp_math(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_MATH, "Math", NODE_CLASS_CONVERTOR, NODE_OPTIONS, - cmp_node_math_in, cmp_node_math_out); + node_type_base(&ntype, CMP_NODE_MATH, "Math", NODE_CLASS_CONVERTOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_math_in, cmp_node_math_out); node_type_size(&ntype, 120, 110, 160); node_type_label(&ntype, node_math_label); node_type_exec(&ntype, node_composit_exec_math); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_mixrgb.c b/source/blender/nodes/composite/nodes/node_composite_mixrgb.c similarity index 81% rename from source/blender/nodes/intern/CMP_nodes/CMP_mixrgb.c rename to source/blender/nodes/composite/nodes/node_composite_mixrgb.c index d2454b37c29..a5dcfcc44da 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_mixrgb.c +++ b/source/blender/nodes/composite/nodes/node_composite_mixrgb.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_mixrgb.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,21 +27,21 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_mixrgb.c +/** \file blender/nodes/composite/nodes/node_composite_mixrgb.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** MIX RGB ******************** */ -static bNodeSocketType cmp_node_mix_rgb_in[]= { - { SOCK_VALUE, 1, "Fac", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 5.0f}, - { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, - { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_mix_rgb_in[]= { + { SOCK_FLOAT, 1, "Fac", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 5.0f, PROP_FACTOR}, + { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f}, + { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_mix_rgb_out[]= { - { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_mix_rgb_out[]= { + { SOCK_RGBA, 0, "Image"}, { -1, 0, "" } }; @@ -88,8 +88,8 @@ void register_node_type_cmp_mix_rgb(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_MIX_RGB, "Mix", NODE_CLASS_OP_COLOR, NODE_PREVIEW|NODE_OPTIONS, - cmp_node_mix_rgb_in, cmp_node_mix_rgb_out); + node_type_base(&ntype, CMP_NODE_MIX_RGB, "Mix", NODE_CLASS_OP_COLOR, NODE_PREVIEW|NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_mix_rgb_in, cmp_node_mix_rgb_out); node_type_size(&ntype, 110, 60, 120); node_type_label(&ntype, node_blend_label); node_type_exec(&ntype, node_composit_exec_mix_rgb); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_normal.c b/source/blender/nodes/composite/nodes/node_composite_normal.c similarity index 72% rename from source/blender/nodes/intern/CMP_nodes/CMP_normal.c rename to source/blender/nodes/composite/nodes/node_composite_normal.c index f53d3041947..5f3c848903c 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_normal.c +++ b/source/blender/nodes/composite/nodes/node_composite_normal.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_normal.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,30 +27,30 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_normal.c +/** \file blender/nodes/composite/nodes/node_composite_normal.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** NORMAL ******************** */ -static bNodeSocketType cmp_node_normal_in[]= { - { SOCK_VECTOR, 1, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_normal_in[]= { + { SOCK_VECTOR, 1, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_DIRECTION}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_normal_out[]= { - { SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f}, - { SOCK_VALUE, 0, "Dot", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_normal_out[]= { + { SOCK_VECTOR, 0, "Normal"}, + { SOCK_FLOAT, 0, "Dot"}, { -1, 0, "" } }; static void do_normal(bNode *node, float *out, float *in) { bNodeSocket *sock= node->outputs.first; - float *nor= sock->ns.vec; + float *nor= ((bNodeSocketValueVector*)sock->default_value)->value; /* render normals point inside... the widget points outside */ out[0]= -INPR(nor, in); @@ -60,12 +60,13 @@ static void do_normal(bNode *node, float *out, float *in) static void node_composit_exec_normal(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) { bNodeSocket *sock= node->outputs.first; + float *nor= ((bNodeSocketValueVector*)sock->default_value)->value; /* stack order input: normal */ /* stack order output: normal, value */ /* input no image? then only vector op */ if(in[0]->data==NULL) { - VECCOPY(out[0]->vec, sock->ns.vec); + VECCOPY(out[0]->vec, nor); /* render normals point inside... the widget points outside */ out[1]->vec[0]= -INPR(out[0]->vec, in[0]->vec); } @@ -82,12 +83,23 @@ static void node_composit_exec_normal(void *UNUSED(data), bNode *node, bNodeStac } +static void init(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) +{ + bNodeSocket *sock= node->outputs.first; + float *nor= ((bNodeSocketValueVector*)sock->default_value)->value; + + nor[0] = 0.0f; + nor[1] = 0.0f; + nor[2] = 1.0f; +} + void register_node_type_cmp_normal(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_NORMAL, "Normal", NODE_CLASS_OP_VECTOR, NODE_OPTIONS, - cmp_node_normal_in, cmp_node_normal_out); + node_type_base(&ntype, CMP_NODE_NORMAL, "Normal", NODE_CLASS_OP_VECTOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_normal_in, cmp_node_normal_out); + node_type_init(&ntype, init); node_type_size(&ntype, 100, 60, 200); node_type_exec(&ntype, node_composit_exec_normal); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_normalize.c b/source/blender/nodes/composite/nodes/node_composite_normalize.c similarity index 86% rename from source/blender/nodes/intern/CMP_nodes/CMP_normalize.c rename to source/blender/nodes/composite/nodes/node_composite_normalize.c index 22ebd924f09..1c5c3b57b80 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_normalize.c +++ b/source/blender/nodes/composite/nodes/node_composite_normalize.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_normalize.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,21 +27,21 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_normalize.c +/** \file blender/nodes/composite/nodes/node_composite_normalize.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** NORMALIZE single channel, useful for Z buffer ******************** */ -static bNodeSocketType cmp_node_normalize_in[]= { - { SOCK_VALUE, 1, "Value", 1.0f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_normalize_in[]= { + { SOCK_FLOAT, 1, "Value", 1.0f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f, PROP_NONE}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_normalize_out[]= { - { SOCK_VALUE, 0, "Value", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_normalize_out[]= { + { SOCK_FLOAT, 0, "Value"}, { -1, 0, "" } }; @@ -107,8 +107,8 @@ void register_node_type_cmp_normalize(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_NORMALIZE, "Normalize", NODE_CLASS_OP_VECTOR, NODE_OPTIONS, - cmp_node_normalize_in, cmp_node_normalize_out); + node_type_base(&ntype, CMP_NODE_NORMALIZE, "Normalize", NODE_CLASS_OP_VECTOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_normalize_in, cmp_node_normalize_out); node_type_size(&ntype, 100, 60, 150); node_type_exec(&ntype, node_composit_exec_normalize); node_type_storage(&ntype, "TexMapping", NULL, NULL); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_outputFile.c b/source/blender/nodes/composite/nodes/node_composite_outputFile.c similarity index 85% rename from source/blender/nodes/intern/CMP_nodes/CMP_outputFile.c rename to source/blender/nodes/composite/nodes/node_composite_outputFile.c index 1d52e694ea9..13391a4a790 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_outputFile.c +++ b/source/blender/nodes/composite/nodes/node_composite_outputFile.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_outputFile.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,17 +27,17 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_outputFile.c +/** \file blender/nodes/composite/nodes/node_composite_outputFile.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** OUTPUT FILE ******************** */ -static bNodeSocketType cmp_node_output_file_in[]= { - { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "Z", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_output_file_in[]= { + { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_FLOAT, 1, "Z", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE}, { -1, 0, "" } }; @@ -93,7 +93,7 @@ static void node_composit_exec_output_file(void *data, bNode *node, bNodeStack * } } -static void node_composit_init_output_file(bNode *node) +static void node_composit_init_output_file(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { Scene *scene= (Scene *)node->id; NodeImageFile *nif= MEM_callocN(sizeof(NodeImageFile), "node image file"); @@ -113,8 +113,8 @@ void register_node_type_cmp_output_file(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_OUTPUT_FILE, "File Output", NODE_CLASS_OUTPUT, NODE_PREVIEW|NODE_OPTIONS, - cmp_node_output_file_in, NULL); + node_type_base(&ntype, CMP_NODE_OUTPUT_FILE, "File Output", NODE_CLASS_OUTPUT, NODE_PREVIEW|NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_output_file_in, NULL); node_type_size(&ntype, 140, 80, 300); node_type_init(&ntype, node_composit_init_output_file); node_type_storage(&ntype, "NodeImageFile", node_free_standard_storage, node_copy_standard_storage); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_premulkey.c b/source/blender/nodes/composite/nodes/node_composite_premulkey.c similarity index 79% rename from source/blender/nodes/intern/CMP_nodes/CMP_premulkey.c rename to source/blender/nodes/composite/nodes/node_composite_premulkey.c index 15d2ac25180..066a8a81891 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_premulkey.c +++ b/source/blender/nodes/composite/nodes/node_composite_premulkey.c @@ -1,5 +1,5 @@ /* -* $Id$ +* $Id: CMP_premulkey.c 36333 2011-04-26 09:27:43Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -28,21 +28,21 @@ */ -/** \file blender/nodes/intern/CMP_nodes/CMP_premulkey.c +/** \file blender/nodes/composite/nodes/node_composite_premulkey.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** Premul and Key Alpha Convert ******************** */ -static bNodeSocketType cmp_node_premulkey_in[]= { - { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_premulkey_in[]= { + { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_premulkey_out[]= { - { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_premulkey_out[]= { + { SOCK_RGBA, 0, "Image"}, { -1, 0, "" } }; @@ -67,8 +67,8 @@ void register_node_type_cmp_premulkey(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_PREMULKEY, "Alpha Convert", NODE_CLASS_CONVERTOR, NODE_OPTIONS, - cmp_node_premulkey_in, cmp_node_premulkey_out); + node_type_base(&ntype, CMP_NODE_PREMULKEY, "Alpha Convert", NODE_CLASS_CONVERTOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_premulkey_in, cmp_node_premulkey_out); node_type_size(&ntype, 140, 100, 320); node_type_exec(&ntype, node_composit_exec_premulkey); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_rgb.c b/source/blender/nodes/composite/nodes/node_composite_rgb.c similarity index 64% rename from source/blender/nodes/intern/CMP_nodes/CMP_rgb.c rename to source/blender/nodes/composite/nodes/node_composite_rgb.c index 36b7988c4e0..41a13487edd 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_rgb.c +++ b/source/blender/nodes/composite/nodes/node_composite_rgb.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_rgb.c 36333 2011-04-26 09:27:43Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,33 +27,46 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_rgb.c +/** \file blender/nodes/composite/nodes/node_composite_rgb.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** RGB ******************** */ -static bNodeSocketType cmp_node_rgb_out[]= { - { SOCK_RGBA, 0, "RGBA", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_rgb_out[]= { + { SOCK_RGBA, 0, "RGBA", 0.8f, 0.8f, 0.8f, 1.0f}, { -1, 0, "" } }; +static void node_composit_init_rgb(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) +{ + bNodeSocket *sock= node->outputs.first; + float *col= ((bNodeSocketValueRGBA*)sock->default_value)->value; + /* uses the default value of the output socket, must be initialized here */ + col[0] = 0.5f; + col[1] = 0.5f; + col[2] = 0.5f; + col[3] = 1.0f; +} + static void node_composit_exec_rgb(void *UNUSED(data), bNode *node, bNodeStack **UNUSED(in), bNodeStack **out) { bNodeSocket *sock= node->outputs.first; + float *col= ((bNodeSocketValueRGBA*)sock->default_value)->value; - QUATCOPY(out[0]->vec, sock->ns.vec); + QUATCOPY(out[0]->vec, col); } void register_node_type_cmp_rgb(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_RGB, "RGB", NODE_CLASS_INPUT, NODE_OPTIONS, - NULL, cmp_node_rgb_out); + node_type_base(&ntype, CMP_NODE_RGB, "RGB", NODE_CLASS_INPUT, NODE_OPTIONS); + node_type_socket_templates(&ntype, NULL, cmp_node_rgb_out); + node_type_init(&ntype, node_composit_init_rgb); node_type_size(&ntype, 140, 80, 140); node_type_exec(&ntype, node_composit_exec_rgb); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_rotate.c b/source/blender/nodes/composite/nodes/node_composite_rotate.c similarity index 83% rename from source/blender/nodes/intern/CMP_nodes/CMP_rotate.c rename to source/blender/nodes/composite/nodes/node_composite_rotate.c index eccac4f0e6d..4ece562c508 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_rotate.c +++ b/source/blender/nodes/composite/nodes/node_composite_rotate.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_rotate.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,22 +27,22 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_rotate.c +/** \file blender/nodes/composite/nodes/node_composite_rotate.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** Rotate ******************** */ -static bNodeSocketType cmp_node_rotate_in[]= { - { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "Degr", 0.0f, 0.0f, 0.0f, 0.0f, -10000.0f, 10000.0f}, +static bNodeSocketTemplate cmp_node_rotate_in[]= { + { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f}, + { SOCK_FLOAT, 1, "Degr", 0.0f, 0.0f, 0.0f, 0.0f, -10000.0f, 10000.0f, PROP_ANGLE}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_rotate_out[]= { - { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_rotate_out[]= { + { SOCK_RGBA, 0, "Image"}, { -1, 0, "" } }; @@ -122,7 +122,7 @@ static void node_composit_exec_rotate(void *UNUSED(data), bNode *node, bNodeStac } } -static void node_composit_init_rotate(bNode *node) +static void node_composit_init_rotate(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { node->custom1= 1; /* Bilinear Filter*/ } @@ -131,8 +131,8 @@ void register_node_type_cmp_rotate(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_ROTATE, "Rotate", NODE_CLASS_DISTORT, NODE_OPTIONS, - cmp_node_rotate_in, cmp_node_rotate_out); + node_type_base(&ntype, CMP_NODE_ROTATE, "Rotate", NODE_CLASS_DISTORT, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_rotate_in, cmp_node_rotate_out); node_type_size(&ntype, 140, 100, 320); node_type_init(&ntype, node_composit_init_rotate); node_type_exec(&ntype, node_composit_exec_rotate); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_scale.c b/source/blender/nodes/composite/nodes/node_composite_scale.c similarity index 84% rename from source/blender/nodes/intern/CMP_nodes/CMP_scale.c rename to source/blender/nodes/composite/nodes/node_composite_scale.c index b6030cc5a5f..4ba654e82d4 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_scale.c +++ b/source/blender/nodes/composite/nodes/node_composite_scale.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_scale.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,25 +27,25 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_scale.c +/** \file blender/nodes/composite/nodes/node_composite_scale.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** Scale ******************** */ #define CMP_SCALE_MAX 12000 -static bNodeSocketType cmp_node_scale_in[]= { - { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "X", 1.0f, 0.0f, 0.0f, 0.0f, 0.0001f, CMP_SCALE_MAX}, - { SOCK_VALUE, 1, "Y", 1.0f, 0.0f, 0.0f, 0.0f, 0.0001f, CMP_SCALE_MAX}, +static bNodeSocketTemplate cmp_node_scale_in[]= { + { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f}, + { SOCK_FLOAT, 1, "X", 1.0f, 0.0f, 0.0f, 0.0f, 0.0001f, CMP_SCALE_MAX, PROP_FACTOR}, + { SOCK_FLOAT, 1, "Y", 1.0f, 0.0f, 0.0f, 0.0f, 0.0001f, CMP_SCALE_MAX, PROP_FACTOR}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_scale_out[]= { - { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_scale_out[]= { + { SOCK_RGBA, 0, "Image"}, { -1, 0, "" } }; @@ -118,8 +118,8 @@ void register_node_type_cmp_scale(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_SCALE, "Scale", NODE_CLASS_DISTORT, NODE_OPTIONS, - cmp_node_scale_in, cmp_node_scale_out); + node_type_base(&ntype, CMP_NODE_SCALE, "Scale", NODE_CLASS_DISTORT, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_scale_in, cmp_node_scale_out); node_type_size(&ntype, 140, 100, 320); node_type_exec(&ntype, node_composit_exec_scale); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c b/source/blender/nodes/composite/nodes/node_composite_sepcombHSVA.c similarity index 80% rename from source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c rename to source/blender/nodes/composite/nodes/node_composite_sepcombHSVA.c index 87c4ed1dac0..5460427fd73 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c +++ b/source/blender/nodes/composite/nodes/node_composite_sepcombHSVA.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_sepcombHSVA.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,24 +27,24 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c +/** \file blender/nodes/composite/nodes/node_composite_sepcombHSVA.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** SEPARATE HSVA ******************** */ -static bNodeSocketType cmp_node_sephsva_in[]= { - { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_sephsva_in[]= { + { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_sephsva_out[]= { - { SOCK_VALUE, 0, "H", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 0, "S", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 0, "V", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 0, "A", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_sephsva_out[]= { + { SOCK_FLOAT, 0, "H"}, + { SOCK_FLOAT, 0, "S"}, + { SOCK_FLOAT, 0, "V"}, + { SOCK_FLOAT, 0, "A"}, { -1, 0, "" } }; @@ -105,8 +105,8 @@ void register_node_type_cmp_sephsva(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_SEPHSVA, "Separate HSVA", NODE_CLASS_CONVERTOR, 0, - cmp_node_sephsva_in, cmp_node_sephsva_out); + node_type_base(&ntype, CMP_NODE_SEPHSVA, "Separate HSVA", NODE_CLASS_CONVERTOR, 0); + node_type_socket_templates(&ntype, cmp_node_sephsva_in, cmp_node_sephsva_out); node_type_size(&ntype, 80, 40, 140); node_type_exec(&ntype, node_composit_exec_sephsva); @@ -115,15 +115,15 @@ void register_node_type_cmp_sephsva(ListBase *lb) /* **************** COMBINE HSVA ******************** */ -static bNodeSocketType cmp_node_combhsva_in[]= { - { SOCK_VALUE, 1, "H", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "S", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "V", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "A", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_combhsva_in[]= { + { SOCK_FLOAT, 1, "H", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE}, + { SOCK_FLOAT, 1, "S", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE}, + { SOCK_FLOAT, 1, "V", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE}, + { SOCK_FLOAT, 1, "A", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_combhsva_out[]= { - { SOCK_RGBA, 0, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_combhsva_out[]= { + { SOCK_RGBA, 0, "Image"}, { -1, 0, "" } }; @@ -175,8 +175,8 @@ void register_node_type_cmp_combhsva(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_COMBHSVA, "Combine HSVA", NODE_CLASS_CONVERTOR, NODE_OPTIONS, - cmp_node_combhsva_in, cmp_node_combhsva_out); + node_type_base(&ntype, CMP_NODE_COMBHSVA, "Combine HSVA", NODE_CLASS_CONVERTOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_combhsva_in, cmp_node_combhsva_out); node_type_size(&ntype, 80, 40, 140); node_type_exec(&ntype, node_composit_exec_combhsva); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombRGBA.c b/source/blender/nodes/composite/nodes/node_composite_sepcombRGBA.c similarity index 78% rename from source/blender/nodes/intern/CMP_nodes/CMP_sepcombRGBA.c rename to source/blender/nodes/composite/nodes/node_composite_sepcombRGBA.c index 11afd1eaaef..a074d895acb 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombRGBA.c +++ b/source/blender/nodes/composite/nodes/node_composite_sepcombRGBA.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_sepcombRGBA.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,23 +27,23 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_sepcombRGBA.c +/** \file blender/nodes/composite/nodes/node_composite_sepcombRGBA.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** SEPARATE RGBA ******************** */ -static bNodeSocketType cmp_node_seprgba_in[]= { - { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_seprgba_in[]= { + { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_seprgba_out[]= { - { SOCK_VALUE, 0, "R", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 0, "G", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 0, "B", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 0, "A", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_seprgba_out[]= { + { SOCK_FLOAT, 0, "R"}, + { SOCK_FLOAT, 0, "G"}, + { SOCK_FLOAT, 0, "B"}, + { SOCK_FLOAT, 0, "A"}, { -1, 0, "" } }; @@ -83,8 +83,8 @@ void register_node_type_cmp_seprgba(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_SEPRGBA, "Separate RGBA", NODE_CLASS_CONVERTOR, 0, - cmp_node_seprgba_in, cmp_node_seprgba_out); + node_type_base(&ntype, CMP_NODE_SEPRGBA, "Separate RGBA", NODE_CLASS_CONVERTOR, 0); + node_type_socket_templates(&ntype, cmp_node_seprgba_in, cmp_node_seprgba_out); node_type_size(&ntype, 80, 40, 140); node_type_exec(&ntype, node_composit_exec_seprgba); @@ -94,15 +94,15 @@ void register_node_type_cmp_seprgba(ListBase *lb) /* **************** COMBINE RGBA ******************** */ -static bNodeSocketType cmp_node_combrgba_in[]= { - { SOCK_VALUE, 1, "R", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "G", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "B", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "A", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_combrgba_in[]= { + { SOCK_FLOAT, 1, "R", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE}, + { SOCK_FLOAT, 1, "G", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE}, + { SOCK_FLOAT, 1, "B", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE}, + { SOCK_FLOAT, 1, "A", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_combrgba_out[]= { - { SOCK_RGBA, 0, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_combrgba_out[]= { + { SOCK_RGBA, 0, "Image"}, { -1, 0, "" } }; @@ -151,8 +151,8 @@ void register_node_type_cmp_combrgba(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_COMBRGBA, "Combine RGBA", NODE_CLASS_CONVERTOR, NODE_OPTIONS, - cmp_node_combrgba_in, cmp_node_combrgba_out); + node_type_base(&ntype, CMP_NODE_COMBRGBA, "Combine RGBA", NODE_CLASS_CONVERTOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_combrgba_in, cmp_node_combrgba_out); node_type_size(&ntype, 80, 40, 140); node_type_exec(&ntype, node_composit_exec_combrgba); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYCCA.c b/source/blender/nodes/composite/nodes/node_composite_sepcombYCCA.c similarity index 87% rename from source/blender/nodes/intern/CMP_nodes/CMP_sepcombYCCA.c rename to source/blender/nodes/composite/nodes/node_composite_sepcombYCCA.c index 81591602dae..61e88418e59 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYCCA.c +++ b/source/blender/nodes/composite/nodes/node_composite_sepcombYCCA.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_sepcombYCCA.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,24 +27,24 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_sepcombYCCA.c +/** \file blender/nodes/composite/nodes/node_composite_sepcombYCCA.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** SEPARATE YCCA ******************** */ -static bNodeSocketType cmp_node_sepycca_in[]= { - { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_sepycca_in[]= { + { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_sepycca_out[]= { - { SOCK_VALUE, 0, "Y", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 0, "Cb", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 0, "Cr", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 0, "A", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_sepycca_out[]= { + { SOCK_FLOAT, 0, "Y"}, + { SOCK_FLOAT, 0, "Cb"}, + { SOCK_FLOAT, 0, "Cr"}, + { SOCK_FLOAT, 0, "A"}, { -1, 0, "" } }; @@ -154,8 +154,8 @@ void register_node_type_cmp_sepycca(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_SEPYCCA, "Separate YCbCrA", NODE_CLASS_CONVERTOR, NODE_OPTIONS, - cmp_node_sepycca_in, cmp_node_sepycca_out); + node_type_base(&ntype, CMP_NODE_SEPYCCA, "Separate YCbCrA", NODE_CLASS_CONVERTOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_sepycca_in, cmp_node_sepycca_out); node_type_size(&ntype, 80, 40, 140); node_type_exec(&ntype, node_composit_exec_sepycca); @@ -165,15 +165,15 @@ void register_node_type_cmp_sepycca(ListBase *lb) /* **************** COMBINE YCCA ******************** */ -static bNodeSocketType cmp_node_combycca_in[]= { - { SOCK_VALUE, 1, "Y", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "Cb", 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "Cr", 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "A", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_combycca_in[]= { + { SOCK_FLOAT, 1, "Y", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE}, + { SOCK_FLOAT, 1, "Cb", 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE}, + { SOCK_FLOAT, 1, "Cr", 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE}, + { SOCK_FLOAT, 1, "A", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_combycca_out[]= { - { SOCK_RGBA, 0, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_combycca_out[]= { + { SOCK_RGBA, 0, "Image"}, { -1, 0, "" } }; @@ -301,8 +301,8 @@ void register_node_type_cmp_combycca(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_COMBYCCA, "Combine YCbCrA", NODE_CLASS_CONVERTOR, NODE_OPTIONS, - cmp_node_combycca_in, cmp_node_combycca_out); + node_type_base(&ntype, CMP_NODE_COMBYCCA, "Combine YCbCrA", NODE_CLASS_CONVERTOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_combycca_in, cmp_node_combycca_out); node_type_size(&ntype, 80, 40, 140); node_type_exec(&ntype, node_composit_exec_combycca); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYUVA.c b/source/blender/nodes/composite/nodes/node_composite_sepcombYUVA.c similarity index 80% rename from source/blender/nodes/intern/CMP_nodes/CMP_sepcombYUVA.c rename to source/blender/nodes/composite/nodes/node_composite_sepcombYUVA.c index 8687e307df3..14f086300c0 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYUVA.c +++ b/source/blender/nodes/composite/nodes/node_composite_sepcombYUVA.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_sepcombYUVA.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,24 +27,24 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_sepcombYUVA.c +/** \file blender/nodes/composite/nodes/node_composite_sepcombYUVA.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** SEPARATE YUVA ******************** */ -static bNodeSocketType cmp_node_sepyuva_in[]= { - { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_sepyuva_in[]= { + { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_sepyuva_out[]= { - { SOCK_VALUE, 0, "Y", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 0, "U", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 0, "V", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 0, "A", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_sepyuva_out[]= { + { SOCK_FLOAT, 0, "Y"}, + { SOCK_FLOAT, 0, "U"}, + { SOCK_FLOAT, 0, "V"}, + { SOCK_FLOAT, 0, "A"}, { -1, 0, "" } }; @@ -105,8 +105,8 @@ void register_node_type_cmp_sepyuva(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_SEPYUVA, "Separate YUVA", NODE_CLASS_CONVERTOR, 0, - cmp_node_sepyuva_in, cmp_node_sepyuva_out); + node_type_base(&ntype, CMP_NODE_SEPYUVA, "Separate YUVA", NODE_CLASS_CONVERTOR, 0); + node_type_socket_templates(&ntype, cmp_node_sepyuva_in, cmp_node_sepyuva_out); node_type_size(&ntype, 80, 40, 140); node_type_exec(&ntype, node_composit_exec_sepyuva); @@ -116,15 +116,15 @@ void register_node_type_cmp_sepyuva(ListBase *lb) /* **************** COMBINE YUVA ******************** */ -static bNodeSocketType cmp_node_combyuva_in[]= { - { SOCK_VALUE, 1, "Y", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "U", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "V", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "A", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_combyuva_in[]= { + { SOCK_FLOAT, 1, "Y", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE}, + { SOCK_FLOAT, 1, "U", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE}, + { SOCK_FLOAT, 1, "V", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE}, + { SOCK_FLOAT, 1, "A", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_combyuva_out[]= { - { SOCK_RGBA, 0, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_combyuva_out[]= { + { SOCK_RGBA, 0, "Image"}, { -1, 0, "" } }; @@ -176,8 +176,8 @@ void register_node_type_cmp_combyuva(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_COMBYUVA, "Combine YUVA", NODE_CLASS_CONVERTOR, NODE_OPTIONS, - cmp_node_combyuva_in, cmp_node_combyuva_out); + node_type_base(&ntype, CMP_NODE_COMBYUVA, "Combine YUVA", NODE_CLASS_CONVERTOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_combyuva_in, cmp_node_combyuva_out); node_type_size(&ntype, 80, 40, 140); node_type_exec(&ntype, node_composit_exec_combyuva); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_setalpha.c b/source/blender/nodes/composite/nodes/node_composite_setalpha.c similarity index 81% rename from source/blender/nodes/intern/CMP_nodes/CMP_setalpha.c rename to source/blender/nodes/composite/nodes/node_composite_setalpha.c index bb8533a79f6..781d6f11614 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_setalpha.c +++ b/source/blender/nodes/composite/nodes/node_composite_setalpha.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_setalpha.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,21 +27,21 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_setalpha.c +/** \file blender/nodes/composite/nodes/node_composite_setalpha.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** SET ALPHA ******************** */ -static bNodeSocketType cmp_node_setalpha_in[]= { - { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_setalpha_in[]= { + { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_FLOAT, 1, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_setalpha_out[]= { - { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_setalpha_out[]= { + { SOCK_RGBA, 0, "Image"}, { -1, 0, "" } }; @@ -79,8 +79,8 @@ void register_node_type_cmp_setalpha(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_SETALPHA, "Set Alpha", NODE_CLASS_CONVERTOR, NODE_OPTIONS, - cmp_node_setalpha_in, cmp_node_setalpha_out); + node_type_base(&ntype, CMP_NODE_SETALPHA, "Set Alpha", NODE_CLASS_CONVERTOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_setalpha_in, cmp_node_setalpha_out); node_type_size(&ntype, 120, 40, 140); node_type_exec(&ntype, node_composit_exec_setalpha); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_splitViewer.c b/source/blender/nodes/composite/nodes/node_composite_splitViewer.c similarity index 88% rename from source/blender/nodes/intern/CMP_nodes/CMP_splitViewer.c rename to source/blender/nodes/composite/nodes/node_composite_splitViewer.c index 13cb3bcfed5..d78faf69e26 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_splitViewer.c +++ b/source/blender/nodes/composite/nodes/node_composite_splitViewer.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_splitViewer.c 36340 2011-04-26 13:24:20Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,17 +27,17 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_splitViewer.c +/** \file blender/nodes/composite/nodes/node_composite_splitViewer.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** SPLIT VIEWER ******************** */ -static bNodeSocketType cmp_node_splitviewer_in[]= { - { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_splitviewer_in[]= { + { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f}, { -1, 0, "" } }; @@ -141,7 +141,7 @@ static void node_composit_exec_splitviewer(void *data, bNode *node, bNodeStack * } } -static void node_composit_init_splitviewer(bNode* node) +static void node_composit_init_splitviewer(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { ImageUser *iuser= MEM_callocN(sizeof(ImageUser), "node image user"); node->storage= iuser; @@ -155,8 +155,8 @@ void register_node_type_cmp_splitviewer(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_SPLITVIEWER, "SplitViewer", NODE_CLASS_OUTPUT, NODE_PREVIEW|NODE_OPTIONS, - cmp_node_splitviewer_in, NULL); + node_type_base(&ntype, CMP_NODE_SPLITVIEWER, "SplitViewer", NODE_CLASS_OUTPUT, NODE_PREVIEW|NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_splitviewer_in, NULL); node_type_size(&ntype, 140, 100, 320); node_type_init(&ntype, node_composit_init_splitviewer); node_type_storage(&ntype, "ImageUser", node_free_standard_storage, node_copy_standard_storage); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_texture.c b/source/blender/nodes/composite/nodes/node_composite_texture.c similarity index 90% rename from source/blender/nodes/intern/CMP_nodes/CMP_texture.c rename to source/blender/nodes/composite/nodes/node_composite_texture.c index 46e71b8b8e5..bdeef74c617 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_texture.c +++ b/source/blender/nodes/composite/nodes/node_composite_texture.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_texture.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,22 +27,22 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_texture.c +/** \file blender/nodes/composite/nodes/node_composite_texture.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** TEXTURE ******************** */ -static bNodeSocketType cmp_node_texture_in[]= { - { SOCK_VECTOR, 1, "Offset", 0.0f, 0.0f, 0.0f, 0.0f, -2.0f, 2.0f}, - { SOCK_VECTOR, 1, "Scale", 1.0f, 1.0f, 1.0f, 1.0f, -10.0f, 10.0f}, +static bNodeSocketTemplate cmp_node_texture_in[]= { + { SOCK_VECTOR, 1, "Offset", 0.0f, 0.0f, 0.0f, 0.0f, -2.0f, 2.0f, PROP_TRANSLATION}, + { SOCK_VECTOR, 1, "Scale", 1.0f, 1.0f, 1.0f, 1.0f, -10.0f, 10.0f, PROP_XYZ}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_texture_out[]= { - { SOCK_VALUE, 0, "Value", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_RGBA , 0, "Color", 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_texture_out[]= { + { SOCK_FLOAT, 0, "Value"}, + { SOCK_RGBA , 0, "Color"}, { -1, 0, "" } }; @@ -148,8 +148,8 @@ void register_node_type_cmp_texture(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_TEXTURE, "Texture", NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW, - cmp_node_texture_in, cmp_node_texture_out); + node_type_base(&ntype, CMP_NODE_TEXTURE, "Texture", NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW); + node_type_socket_templates(&ntype, cmp_node_texture_in, cmp_node_texture_out); node_type_size(&ntype, 120, 80, 240); node_type_exec(&ntype, node_composit_exec_texture); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_tonemap.c b/source/blender/nodes/composite/nodes/node_composite_tonemap.c similarity index 91% rename from source/blender/nodes/intern/CMP_nodes/CMP_tonemap.c rename to source/blender/nodes/composite/nodes/node_composite_tonemap.c index f15811ec790..31ffed08c95 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_tonemap.c +++ b/source/blender/nodes/composite/nodes/node_composite_tonemap.c @@ -26,19 +26,19 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_tonemap.c +/** \file blender/nodes/composite/nodes/node_composite_tonemap.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" -static bNodeSocketType cmp_node_tonemap_in[]= { - { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_tonemap_in[]= { + { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_tonemap_out[]= { - { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_tonemap_out[]= { + { SOCK_RGBA, 0, "Image"}, { -1, 0, "" } }; @@ -147,7 +147,7 @@ static void node_composit_exec_tonemap(void *UNUSED(data), bNode *node, bNodeSta free_compbuf(img); } -static void node_composit_init_tonemap(bNode* node) +static void node_composit_init_tonemap(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { NodeTonemap *ntm = MEM_callocN(sizeof(NodeTonemap), "node tonemap data"); ntm->type = 1; @@ -167,8 +167,8 @@ void register_node_type_cmp_tonemap(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_TONEMAP, "Tonemap", NODE_CLASS_OP_COLOR, NODE_OPTIONS, - cmp_node_tonemap_in, cmp_node_tonemap_out); + node_type_base(&ntype, CMP_NODE_TONEMAP, "Tonemap", NODE_CLASS_OP_COLOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_tonemap_in, cmp_node_tonemap_out); node_type_size(&ntype, 150, 120, 200); node_type_init(&ntype, node_composit_init_tonemap); node_type_storage(&ntype, "NodeTonemap", node_free_standard_storage, node_copy_standard_storage); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_translate.c b/source/blender/nodes/composite/nodes/node_composite_translate.c similarity index 73% rename from source/blender/nodes/intern/CMP_nodes/CMP_translate.c rename to source/blender/nodes/composite/nodes/node_composite_translate.c index eb69523e7a9..a07dfb936ae 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_translate.c +++ b/source/blender/nodes/composite/nodes/node_composite_translate.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_translate.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,24 +27,24 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_translate.c +/** \file blender/nodes/composite/nodes/node_composite_translate.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** Translate ******************** */ -static bNodeSocketType cmp_node_translate_in[]= { - { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "X", 0.0f, 0.0f, 0.0f, 0.0f, -10000.0f, 10000.0f}, - { SOCK_VALUE, 1, "Y", 0.0f, 0.0f, 0.0f, 0.0f, -10000.0f, 10000.0f}, +static bNodeSocketTemplate cmp_node_translate_in[]= { + { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f}, + { SOCK_FLOAT, 1, "X", 0.0f, 0.0f, 0.0f, 0.0f, -10000.0f, 10000.0f, PROP_NONE}, + { SOCK_FLOAT, 1, "Y", 0.0f, 0.0f, 0.0f, 0.0f, -10000.0f, 10000.0f, PROP_NONE}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_translate_out[]= { - { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_translate_out[]= { + { SOCK_RGBA, 0, "Image"}, { -1, 0, "" } }; @@ -65,8 +65,8 @@ void register_node_type_cmp_translate(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_TRANSLATE, "Translate", NODE_CLASS_DISTORT, NODE_OPTIONS, - cmp_node_translate_in, cmp_node_translate_out); + node_type_base(&ntype, CMP_NODE_TRANSLATE, "Translate", NODE_CLASS_DISTORT, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_translate_in, cmp_node_translate_out); node_type_size(&ntype, 140, 100, 320); node_type_exec(&ntype, node_composit_exec_translate); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_valToRgb.c b/source/blender/nodes/composite/nodes/node_composite_valToRgb.c similarity index 80% rename from source/blender/nodes/intern/CMP_nodes/CMP_valToRgb.c rename to source/blender/nodes/composite/nodes/node_composite_valToRgb.c index 1e1c8c61b46..9481d769557 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_valToRgb.c +++ b/source/blender/nodes/composite/nodes/node_composite_valToRgb.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_valToRgb.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,22 +27,22 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_valToRgb.c +/** \file blender/nodes/composite/nodes/node_composite_valToRgb.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** VALTORGB ******************** */ -static bNodeSocketType cmp_node_valtorgb_in[]= { - { SOCK_VALUE, 1, "Fac", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_valtorgb_in[]= { + { SOCK_FLOAT, 1, "Fac", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_valtorgb_out[]= { - { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 0, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_valtorgb_out[]= { + { SOCK_RGBA, 0, "Image"}, + { SOCK_FLOAT, 0, "Alpha"}, { -1, 0, "" } }; @@ -80,7 +80,7 @@ static void node_composit_exec_valtorgb(void *UNUSED(data), bNode *node, bNodeSt } } -static void node_composit_init_valtorgb(bNode* node) +static void node_composit_init_valtorgb(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { node->storage= add_colorband(1); } @@ -89,8 +89,8 @@ void register_node_type_cmp_valtorgb(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_VALTORGB, "ColorRamp", NODE_CLASS_CONVERTOR, NODE_OPTIONS, - cmp_node_valtorgb_in, cmp_node_valtorgb_out); + node_type_base(&ntype, CMP_NODE_VALTORGB, "ColorRamp", NODE_CLASS_CONVERTOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_valtorgb_in, cmp_node_valtorgb_out); node_type_size(&ntype, 240, 200, 300); node_type_init(&ntype, node_composit_init_valtorgb); node_type_storage(&ntype, "ColorBand", node_free_standard_storage, node_copy_standard_storage); @@ -102,12 +102,12 @@ void register_node_type_cmp_valtorgb(ListBase *lb) /* **************** RGBTOBW ******************** */ -static bNodeSocketType cmp_node_rgbtobw_in[]= { +static bNodeSocketTemplate cmp_node_rgbtobw_in[]= { { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_rgbtobw_out[]= { - { SOCK_VALUE, 0, "Val", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_rgbtobw_out[]= { + { SOCK_FLOAT, 0, "Val", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, { -1, 0, "" } }; @@ -143,8 +143,8 @@ void register_node_type_cmp_rgbtobw(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_RGBTOBW, "RGB to BW", NODE_CLASS_CONVERTOR, 0, - cmp_node_rgbtobw_in, cmp_node_rgbtobw_out); + node_type_base(&ntype, CMP_NODE_RGBTOBW, "RGB to BW", NODE_CLASS_CONVERTOR, 0); + node_type_socket_templates(&ntype, cmp_node_rgbtobw_in, cmp_node_rgbtobw_out); node_type_size(&ntype, 80, 40, 120); node_type_exec(&ntype, node_composit_exec_rgbtobw); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_value.c b/source/blender/nodes/composite/nodes/node_composite_value.c similarity index 65% rename from source/blender/nodes/intern/CMP_nodes/CMP_value.c rename to source/blender/nodes/composite/nodes/node_composite_value.c index 46762065bb4..e99b665f2ae 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_value.c +++ b/source/blender/nodes/composite/nodes/node_composite_value.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_value.c 36536 2011-05-07 13:27:27Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,32 +27,42 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_value.c +/** \file blender/nodes/composite/nodes/node_composite_value.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** VALUE ******************** */ -static bNodeSocketType cmp_node_value_out[]= { - { SOCK_VALUE, 0, "Value", 0.5f, 0.0f, 0.0f, 0.0f, -10000.0f, 10000.0f}, +static bNodeSocketTemplate cmp_node_value_out[]= { + { SOCK_FLOAT, 0, "Value"}, { -1, 0, "" } }; +static void node_composit_init_value(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) +{ + bNodeSocket *sock= node->outputs.first; + bNodeSocketValueFloat *dval= (bNodeSocketValueFloat*)sock->default_value; + /* uses the default value of the output socket, must be initialized here */ + dval->value = 0.5f; +} + static void node_composit_exec_value(void *UNUSED(data), bNode *node, bNodeStack **UNUSED(in), bNodeStack **out) { bNodeSocket *sock= node->outputs.first; + float val= ((bNodeSocketValueFloat*)sock->default_value)->value; - out[0]->vec[0]= sock->ns.vec[0]; + out[0]->vec[0]= val; } void register_node_type_cmp_value(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_VALUE, "Value", NODE_CLASS_INPUT, NODE_OPTIONS, - NULL, cmp_node_value_out); + node_type_base(&ntype, CMP_NODE_VALUE, "Value", NODE_CLASS_INPUT, NODE_OPTIONS); + node_type_socket_templates(&ntype, NULL, cmp_node_value_out); + node_type_init(&ntype, node_composit_init_value); node_type_size(&ntype, 80, 40, 120); node_type_exec(&ntype, node_composit_exec_value); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_vecBlur.c b/source/blender/nodes/composite/nodes/node_composite_vecBlur.c similarity index 81% rename from source/blender/nodes/intern/CMP_nodes/CMP_vecBlur.c rename to source/blender/nodes/composite/nodes/node_composite_vecBlur.c index c43bfa2435a..e730728d077 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_vecBlur.c +++ b/source/blender/nodes/composite/nodes/node_composite_vecBlur.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_vecBlur.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,23 +27,23 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_vecBlur.c +/** \file blender/nodes/composite/nodes/node_composite_vecBlur.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** VECTOR BLUR ******************** */ -static bNodeSocketType cmp_node_vecblur_in[]= { - { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "Z", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, - { SOCK_VECTOR, 1, "Speed", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_vecblur_in[]= { + { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f}, + { SOCK_FLOAT, 1, "Z", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE}, + { SOCK_VECTOR, 1, "Speed", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_VELOCITY}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_vecblur_out[]= { - { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_vecblur_out[]= { + { SOCK_RGBA, 0, "Image"}, { -1, 0, "" } }; @@ -87,7 +87,7 @@ static void node_composit_exec_vecblur(void *UNUSED(data), bNode *node, bNodeSta free_compbuf(img); } -static void node_composit_init_vecblur(bNode* node) +static void node_composit_init_vecblur(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { NodeBlurData *nbd= MEM_callocN(sizeof(NodeBlurData), "node blur data"); node->storage= nbd; @@ -100,8 +100,8 @@ void register_node_type_cmp_vecblur(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_VECBLUR, "Vector Blur", NODE_CLASS_OP_FILTER, NODE_OPTIONS, - cmp_node_vecblur_in, cmp_node_vecblur_out); + node_type_base(&ntype, CMP_NODE_VECBLUR, "Vector Blur", NODE_CLASS_OP_FILTER, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_vecblur_in, cmp_node_vecblur_out); node_type_size(&ntype, 120, 80, 200); node_type_init(&ntype, node_composit_init_vecblur); node_type_storage(&ntype, "NodeBlurData", node_free_standard_storage, node_copy_standard_storage); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_viewer.c b/source/blender/nodes/composite/nodes/node_composite_viewer.c similarity index 86% rename from source/blender/nodes/intern/CMP_nodes/CMP_viewer.c rename to source/blender/nodes/composite/nodes/node_composite_viewer.c index c4e719efbf9..bcfb45411f1 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_viewer.c +++ b/source/blender/nodes/composite/nodes/node_composite_viewer.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_viewer.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,19 +27,19 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_viewer.c +/** \file blender/nodes/composite/nodes/node_composite_viewer.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** VIEWER ******************** */ -static bNodeSocketType cmp_node_viewer_in[]= { - { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "Z", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate cmp_node_viewer_in[]= { + { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_FLOAT, 1, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE}, + { SOCK_FLOAT, 1, "Z", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE}, { -1, 0, "" } }; @@ -124,7 +124,7 @@ static void node_composit_exec_viewer(void *data, bNode *node, bNodeStack **in, } } -static void node_composit_init_viewer(bNode* node) +static void node_composit_init_viewer(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { ImageUser *iuser= MEM_callocN(sizeof(ImageUser), "node image user"); node->storage= iuser; @@ -137,8 +137,8 @@ void register_node_type_cmp_viewer(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_VIEWER, "Viewer", NODE_CLASS_OUTPUT, NODE_PREVIEW, - cmp_node_viewer_in, NULL); + node_type_base(&ntype, CMP_NODE_VIEWER, "Viewer", NODE_CLASS_OUTPUT, NODE_PREVIEW); + node_type_socket_templates(&ntype, cmp_node_viewer_in, NULL); node_type_size(&ntype, 80, 60, 200); node_type_init(&ntype, node_composit_init_viewer); node_type_storage(&ntype, "ImageUser", node_free_standard_storage, node_copy_standard_storage); @@ -146,5 +146,3 @@ void register_node_type_cmp_viewer(ListBase *lb) nodeRegisterType(lb, &ntype); } - - diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c b/source/blender/nodes/composite/nodes/node_composite_zcombine.c similarity index 89% rename from source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c rename to source/blender/nodes/composite/nodes/node_composite_zcombine.c index 0fae0fcd4d5..dfed26be343 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c +++ b/source/blender/nodes/composite/nodes/node_composite_zcombine.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: CMP_zcombine.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,26 +27,26 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/CMP_nodes/CMP_zcombine.c +/** \file blender/nodes/composite/nodes/node_composite_zcombine.c * \ingroup cmpnodes */ -#include "../CMP_util.h" +#include "node_composite_util.h" /* **************** Z COMBINE ******************** */ /* lazy coder note: node->custom2 is abused to send signal */ -static bNodeSocketType cmp_node_zcombine_in[]= { - { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "Z", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 10000.0f}, - { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "Z", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 10000.0f}, +static bNodeSocketTemplate cmp_node_zcombine_in[]= { + { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f}, + { SOCK_FLOAT, 1, "Z", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 10000.0f, PROP_NONE}, + { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f}, + { SOCK_FLOAT, 1, "Z", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 10000.0f, PROP_NONE}, { -1, 0, "" } }; -static bNodeSocketType cmp_node_zcombine_out[]= { - { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 0, "Z", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 10000.0f}, +static bNodeSocketTemplate cmp_node_zcombine_out[]= { + { SOCK_RGBA, 0, "Image"}, + { SOCK_FLOAT, 0, "Z"}, { -1, 0, "" } }; @@ -228,8 +228,8 @@ void register_node_type_cmp_zcombine(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, CMP_NODE_ZCOMBINE, "Z Combine", NODE_CLASS_OP_COLOR, NODE_OPTIONS, - cmp_node_zcombine_in, cmp_node_zcombine_out); + node_type_base(&ntype, CMP_NODE_ZCOMBINE, "Z Combine", NODE_CLASS_OP_COLOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, cmp_node_zcombine_in, cmp_node_zcombine_out); node_type_size(&ntype, 80, 40, 120); node_type_exec(&ntype, node_composit_exec_zcombine); diff --git a/source/blender/nodes/intern/SHD_util.c b/source/blender/nodes/intern/SHD_util.c deleted file mode 100644 index 190f68ce19a..00000000000 --- a/source/blender/nodes/intern/SHD_util.c +++ /dev/null @@ -1,219 +0,0 @@ -/* - * $Id$ - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2005 Blender Foundation. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - */ - -/** \file blender/nodes/intern/SHD_util.c - * \ingroup nodes - */ - - -#include "SHD_util.h" - - - - - -/* ****** */ - -void nodestack_get_vec(float *in, short type_in, bNodeStack *ns) -{ - float *from= ns->vec; - - if(type_in==SOCK_VALUE) { - if(ns->sockettype==SOCK_VALUE) - *in= *from; - else - *in= 0.333333f*(from[0]+from[1]+from[2]); - } - else if(type_in==SOCK_VECTOR) { - if(ns->sockettype==SOCK_VALUE) { - in[0]= from[0]; - in[1]= from[0]; - in[2]= from[0]; - } - else { - VECCOPY(in, from); - } - } - else { /* type_in==SOCK_RGBA */ - if(ns->sockettype==SOCK_RGBA) { - QUATCOPY(in, from); - } - else if(ns->sockettype==SOCK_VALUE) { - in[0]= from[0]; - in[1]= from[0]; - in[2]= from[0]; - in[3]= 1.0f; - } - else { - VECCOPY(in, from); - in[3]= 1.0f; - } - } -} - - -/* ******************* execute and parse ************ */ - -void ntreeShaderExecTree(bNodeTree *ntree, ShadeInput *shi, ShadeResult *shr) -{ - ShaderCallData scd; - /* - @note: preserve material from ShadeInput for material id, nodetree execs change it - fix for bug "[#28012] Mat ID messy with shader nodes" - */ - Material *mat = shi->mat; - /* convert caller data to struct */ - scd.shi= shi; - scd.shr= shr; - - /* each material node has own local shaderesult, with optional copying */ - memset(shr, 0, sizeof(ShadeResult)); - - ntreeExecTree(ntree, &scd, shi->thread); /* threads */ - // @note: set material back to preserved material - shi->mat = mat; - /* better not allow negative for now */ - if(shr->combined[0]<0.0f) shr->combined[0]= 0.0f; - if(shr->combined[1]<0.0f) shr->combined[1]= 0.0f; - if(shr->combined[2]<0.0f) shr->combined[2]= 0.0f; - -} - -/* go over all used Geometry and Texture nodes, and return a texco flag */ -/* no group inside needed, this function is called for groups too */ -void ntreeShaderGetTexcoMode(bNodeTree *ntree, int r_mode, short *texco, int *mode) -{ - bNode *node; - bNodeSocket *sock; - int a; - - ntreeSocketUseFlags(ntree); - - for(node= ntree->nodes.first; node; node= node->next) { - if(node->type==SH_NODE_TEXTURE) { - if((r_mode & R_OSA) && node->id) { - Tex *tex= (Tex *)node->id; - if ELEM3(tex->type, TEX_IMAGE, TEX_PLUGIN, TEX_ENVMAP) - *texco |= TEXCO_OSA|NEED_UV; - } - /* usability exception... without input we still give the node orcos */ - sock= node->inputs.first; - if(sock==NULL || sock->link==NULL) - *texco |= TEXCO_ORCO|NEED_UV; - } - else if(node->type==SH_NODE_GEOMETRY) { - /* note; sockets always exist for the given type! */ - for(a=0, sock= node->outputs.first; sock; sock= sock->next, a++) { - if(sock->flag & SOCK_IN_USE) { - switch(a) { - case GEOM_OUT_GLOB: - *texco |= TEXCO_GLOB|NEED_UV; break; - case GEOM_OUT_VIEW: - *texco |= TEXCO_VIEW|NEED_UV; break; - case GEOM_OUT_ORCO: - *texco |= TEXCO_ORCO|NEED_UV; break; - case GEOM_OUT_UV: - *texco |= TEXCO_UV|NEED_UV; break; - case GEOM_OUT_NORMAL: - *texco |= TEXCO_NORM|NEED_UV; break; - case GEOM_OUT_VCOL: - *texco |= NEED_UV; *mode |= MA_VERTEXCOL; break; - } - } - } - } - } -} - -/* nodes that use ID data get synced with local data */ -void nodeShaderSynchronizeID(bNode *node, int copyto) -{ - if(node->id==NULL) return; - - if(ELEM(node->type, SH_NODE_MATERIAL, SH_NODE_MATERIAL_EXT)) { - bNodeSocket *sock; - Material *ma= (Material *)node->id; - int a; - - /* hrmf, case in loop isnt super fast, but we dont edit 100s of material at same time either! */ - for(a=0, sock= node->inputs.first; sock; sock= sock->next, a++) { - if(!(sock->flag & SOCK_HIDDEN)) { - if(copyto) { - switch(a) { - case MAT_IN_COLOR: - VECCOPY(&ma->r, sock->ns.vec); break; - case MAT_IN_SPEC: - VECCOPY(&ma->specr, sock->ns.vec); break; - case MAT_IN_REFL: - ma->ref= sock->ns.vec[0]; break; - case MAT_IN_MIR: - VECCOPY(&ma->mirr, sock->ns.vec); break; - case MAT_IN_AMB: - ma->amb= sock->ns.vec[0]; break; - case MAT_IN_EMIT: - ma->emit= sock->ns.vec[0]; break; - case MAT_IN_SPECTRA: - ma->spectra= sock->ns.vec[0]; break; - case MAT_IN_RAY_MIRROR: - ma->ray_mirror= sock->ns.vec[0]; break; - case MAT_IN_ALPHA: - ma->alpha= sock->ns.vec[0]; break; - case MAT_IN_TRANSLUCENCY: - ma->translucency= sock->ns.vec[0]; break; - } - } - else { - switch(a) { - case MAT_IN_COLOR: - VECCOPY(sock->ns.vec, &ma->r); break; - case MAT_IN_SPEC: - VECCOPY(sock->ns.vec, &ma->specr); break; - case MAT_IN_REFL: - sock->ns.vec[0]= ma->ref; break; - case MAT_IN_MIR: - VECCOPY(sock->ns.vec, &ma->mirr); break; - case MAT_IN_AMB: - sock->ns.vec[0]= ma->amb; break; - case MAT_IN_EMIT: - sock->ns.vec[0]= ma->emit; break; - case MAT_IN_SPECTRA: - sock->ns.vec[0]= ma->spectra; break; - case MAT_IN_RAY_MIRROR: - sock->ns.vec[0]= ma->ray_mirror; break; - case MAT_IN_ALPHA: - sock->ns.vec[0]= ma->alpha; break; - case MAT_IN_TRANSLUCENCY: - sock->ns.vec[0]= ma->translucency; break; - } - } - } - } - } - -} diff --git a/source/blender/nodes/intern/node_common.c b/source/blender/nodes/intern/node_common.c new file mode 100644 index 00000000000..76203c52293 --- /dev/null +++ b/source/blender/nodes/intern/node_common.c @@ -0,0 +1,982 @@ +/** + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2007 Blender Foundation. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): Lukas Toenne. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/nodes/intern/node_common.c + * \ingroup nodes + */ + + +#include + +#include "DNA_action_types.h" +#include "DNA_anim_types.h" +#include "DNA_node_types.h" + +#include "BLI_listbase.h" +#include "BLI_string.h" +#include "BLI_utildefines.h" + +#include "BKE_action.h" +#include "BKE_animsys.h" +#include "BKE_global.h" +#include "BKE_library.h" +#include "BKE_main.h" +#include "BLI_math.h" +#include "BKE_node.h" +#include "BKE_utildefines.h" + +#include "RNA_access.h" +#include "RNA_types.h" + +#include "MEM_guardedalloc.h" + +#include "node_common.h" +#include "node_exec.h" +#include "NOD_socket.h" + +/**** Group ****/ + +bNodeSocket *node_group_find_input(bNode *gnode, bNodeSocket *gsock) +{ + bNodeSocket *sock; + for (sock=gnode->inputs.first; sock; sock=sock->next) + if (sock->groupsock == gsock) + return sock; + return NULL; +} + +bNodeSocket *node_group_find_output(bNode *gnode, bNodeSocket *gsock) +{ + bNodeSocket *sock; + for (sock=gnode->outputs.first; sock; sock=sock->next) + if (sock->groupsock == gsock) + return sock; + return NULL; +} + +bNodeSocket *node_group_add_extern_socket(bNodeTree *UNUSED(ntree), ListBase *lb, int in_out, bNodeSocket *gsock) +{ + bNodeSocket *sock; + + if (gsock->flag & SOCK_INTERNAL) + return NULL; + + sock= MEM_callocN(sizeof(bNodeSocket), "sock"); + + /* make a copy of the group socket */ + *sock = *gsock; + sock->link = NULL; + sock->next = sock->prev = NULL; + sock->new_sock = NULL; + + /* group sockets are dynamically added */ + sock->flag |= SOCK_DYNAMIC; + + sock->own_index = gsock->own_index; + sock->groupsock = gsock; + sock->limit = (in_out==SOCK_IN ? 1 : 0xFFF); + + if (gsock->default_value) + sock->default_value = MEM_dupallocN(gsock->default_value); + + if(lb) + BLI_addtail(lb, sock); + + return sock; +} + +bNode *node_group_make_from_selected(bNodeTree *ntree) +{ + bNodeLink *link, *linkn; + bNode *node, *gnode, *nextn; + bNodeTree *ngroup; + bNodeSocket *gsock; + ListBase anim_basepaths = {NULL, NULL}; + float min[2], max[2]; + int totnode=0; + bNodeTemplate ntemp; + + INIT_MINMAX2(min, max); + + /* is there something to group? also do some clearing */ + for(node= ntree->nodes.first; node; node= node->next) { + if(node->flag & NODE_SELECT) { + /* no groups in groups */ + if(node->type==NODE_GROUP) + return NULL; + DO_MINMAX2( (&node->locx), min, max); + totnode++; + } + node->done= 0; + } + if(totnode==0) return NULL; + + /* check if all connections are OK, no unselected node has both + inputs and outputs to a selection */ + for(link= ntree->links.first; link; link= link->next) { + if(link->fromnode && link->tonode && link->fromnode->flag & NODE_SELECT) + link->tonode->done |= 1; + if(link->fromnode && link->tonode && link->tonode->flag & NODE_SELECT) + link->fromnode->done |= 2; + } + + for(node= ntree->nodes.first; node; node= node->next) { + if((node->flag & NODE_SELECT)==0) + if(node->done==3) + break; + } + if(node) + return NULL; + + /* OK! new nodetree */ + ngroup= ntreeAddTree("NodeGroup", ntree->type, NODE_GROUP); + + /* move nodes over */ + for(node= ntree->nodes.first; node; node= nextn) { + nextn= node->next; + if(node->flag & NODE_SELECT) { + /* keep track of this node's RNA "base" path (the part of the pat identifying the node) + * if the old nodetree has animation data which potentially covers this node + */ + if (ntree->adt) { + PointerRNA ptr; + char *path; + + RNA_pointer_create(&ntree->id, &RNA_Node, node, &ptr); + path = RNA_path_from_ID_to_struct(&ptr); + + if (path) + BLI_addtail(&anim_basepaths, BLI_genericNodeN(path)); + } + + /* change node-collection membership */ + BLI_remlink(&ntree->nodes, node); + BLI_addtail(&ngroup->nodes, node); + + node->locx-= 0.5f*(min[0]+max[0]); + node->locy-= 0.5f*(min[1]+max[1]); + } + } + + /* move animation data over */ + if (ntree->adt) { + LinkData *ld, *ldn=NULL; + + BKE_animdata_separate_by_basepath(&ntree->id, &ngroup->id, &anim_basepaths); + + /* paths + their wrappers need to be freed */ + for (ld = anim_basepaths.first; ld; ld = ldn) { + ldn = ld->next; + + MEM_freeN(ld->data); + BLI_freelinkN(&anim_basepaths, ld); + } + } + + /* make group node */ + ntemp.type = NODE_GROUP; + ntemp.ngroup = ngroup; + gnode= nodeAddNode(ntree, &ntemp); + gnode->locx= 0.5f*(min[0]+max[0]); + gnode->locy= 0.5f*(min[1]+max[1]); + + /* relink external sockets */ + for(link= ntree->links.first; link; link= linkn) { + linkn= link->next; + + if(link->fromnode && link->tonode && (link->fromnode->flag & link->tonode->flag & NODE_SELECT)) { + BLI_remlink(&ntree->links, link); + BLI_addtail(&ngroup->links, link); + } + else if(link->tonode && (link->tonode->flag & NODE_SELECT)) { + gsock = node_group_expose_socket(ngroup, link->tosock, SOCK_IN); + link->tosock->link = nodeAddLink(ngroup, NULL, gsock, link->tonode, link->tosock); + link->tosock = node_group_add_extern_socket(ntree, &gnode->inputs, SOCK_IN, gsock); + link->tonode = gnode; + } + else if(link->fromnode && (link->fromnode->flag & NODE_SELECT)) { + /* search for existing group node socket */ + for (gsock=ngroup->outputs.first; gsock; gsock=gsock->next) + if (gsock->link && gsock->link->fromsock==link->fromsock) + break; + if (!gsock) { + gsock = node_group_expose_socket(ngroup, link->fromsock, SOCK_OUT); + gsock->link = nodeAddLink(ngroup, link->fromnode, link->fromsock, NULL, gsock); + link->fromsock = node_group_add_extern_socket(ntree, &gnode->outputs, SOCK_OUT, gsock); + } + else + link->fromsock = node_group_find_output(gnode, gsock); + link->fromnode = gnode; + } + } + + ngroup->update |= NTREE_UPDATE; + ntreeUpdateTree(ngroup); + ntree->update |= NTREE_UPDATE_NODES|NTREE_UPDATE_LINKS; + ntreeUpdateTree(ntree); + + return gnode; +} + +/* XXX This is a makeshift function to have useful initial group socket values. + * In the end this should be implemented by a flexible socket data conversion system, + * which is yet to be implemented. The idea is that beside default standard conversions, + * such as int-to-float, it should be possible to quickly select a conversion method or + * a chain of conversions for each input, whenever there is more than one option. + * E.g. a vector-to-float conversion could use either of the x/y/z components or + * the vector length. + * + * In the interface this could be implemented by a pseudo-script textbox on linked inputs, + * with quick selection from a predefined list of conversion options. Some Examples: + * - vector component 'z' (vector->float): "z" + * - greyscale color (float->color): "grey" + * - color luminance (color->float): "lum" + * - matrix column 2 length (matrix->vector->float): "col[1].len" + * - mesh vertex coordinate 'y' (mesh->vertex->vector->float): "vertex.co.y" + * + * The actual conversion is then done by a series of conversion functions, + * which are defined in the socket type structs. + */ +static void convert_socket_value(bNodeSocket *from, bNodeSocket *to) +{ + /* XXX only one of these pointers is valid! just putting them here for convenience */ + bNodeSocketValueFloat *fromfloat= (bNodeSocketValueFloat*)from->default_value; + bNodeSocketValueInt *fromint= (bNodeSocketValueInt*)from->default_value; + bNodeSocketValueBoolean *frombool= (bNodeSocketValueBoolean*)from->default_value; + bNodeSocketValueVector *fromvector= (bNodeSocketValueVector*)from->default_value; + bNodeSocketValueRGBA *fromrgba= (bNodeSocketValueRGBA*)from->default_value; + + bNodeSocketValueFloat *tofloat= (bNodeSocketValueFloat*)to->default_value; + bNodeSocketValueInt *toint= (bNodeSocketValueInt*)to->default_value; + bNodeSocketValueBoolean *tobool= (bNodeSocketValueBoolean*)to->default_value; + bNodeSocketValueVector *tovector= (bNodeSocketValueVector*)to->default_value; + bNodeSocketValueRGBA *torgba= (bNodeSocketValueRGBA*)to->default_value; + + switch (from->type) { + case SOCK_FLOAT: + switch (to->type) { + case SOCK_FLOAT: + tofloat->value = fromfloat->value; + break; + case SOCK_INT: + toint->value = (int)fromfloat->value; + break; + case SOCK_BOOLEAN: + tobool->value = (fromfloat->value > 0.0f); + break; + case SOCK_VECTOR: + tovector->value[0] = tovector->value[1] = tovector->value[2] = fromfloat->value; + break; + case SOCK_RGBA: + torgba->value[0] = torgba->value[1] = torgba->value[2] = torgba->value[3] = fromfloat->value; + break; + } + break; + case SOCK_INT: + switch (to->type) { + case SOCK_FLOAT: + tofloat->value = (float)fromint->value; + break; + case SOCK_INT: + toint->value = fromint->value; + break; + case SOCK_BOOLEAN: + tobool->value = (fromint->value > 0); + break; + case SOCK_VECTOR: + tovector->value[0] = tovector->value[1] = tovector->value[2] = (float)fromint->value; + break; + case SOCK_RGBA: + torgba->value[0] = torgba->value[1] = torgba->value[2] = torgba->value[3] = (float)fromint->value; + break; + } + break; + case SOCK_BOOLEAN: + switch (to->type) { + case SOCK_FLOAT: + tofloat->value = (float)frombool->value; + break; + case SOCK_INT: + toint->value = (int)frombool->value; + break; + case SOCK_BOOLEAN: + tobool->value = frombool->value; + break; + case SOCK_VECTOR: + tovector->value[0] = tovector->value[1] = tovector->value[2] = (float)frombool->value; + break; + case SOCK_RGBA: + torgba->value[0] = torgba->value[1] = torgba->value[2] = torgba->value[3] = (float)frombool->value; + break; + } + break; + case SOCK_VECTOR: + switch (to->type) { + case SOCK_FLOAT: + tofloat->value = fromvector->value[0]; + break; + case SOCK_INT: + toint->value = (int)fromvector->value[0]; + break; + case SOCK_BOOLEAN: + tobool->value = (fromvector->value[0] > 0.0f); + break; + case SOCK_VECTOR: + copy_v3_v3(tovector->value, fromvector->value); + break; + case SOCK_RGBA: + copy_v3_v3(torgba->value, fromvector->value); + torgba->value[3] = 1.0f; + break; + } + break; + case SOCK_RGBA: + switch (to->type) { + case SOCK_FLOAT: + tofloat->value = fromrgba->value[0]; + break; + case SOCK_INT: + toint->value = (int)fromrgba->value[0]; + break; + case SOCK_BOOLEAN: + tobool->value = (fromrgba->value[0] > 0.0f); + break; + case SOCK_VECTOR: + copy_v3_v3(tovector->value, fromrgba->value); + break; + case SOCK_RGBA: + copy_v4_v4(torgba->value, fromrgba->value); + break; + } + break; + } +} + +static void copy_socket_value(bNodeSocket *from, bNodeSocket *to) +{ + /* XXX only one of these pointers is valid! just putting them here for convenience */ + bNodeSocketValueFloat *fromfloat= (bNodeSocketValueFloat*)from->default_value; + bNodeSocketValueInt *fromint= (bNodeSocketValueInt*)from->default_value; + bNodeSocketValueBoolean *frombool= (bNodeSocketValueBoolean*)from->default_value; + bNodeSocketValueVector *fromvector= (bNodeSocketValueVector*)from->default_value; + bNodeSocketValueRGBA *fromrgba= (bNodeSocketValueRGBA*)from->default_value; + + bNodeSocketValueFloat *tofloat= (bNodeSocketValueFloat*)to->default_value; + bNodeSocketValueInt *toint= (bNodeSocketValueInt*)to->default_value; + bNodeSocketValueBoolean *tobool= (bNodeSocketValueBoolean*)to->default_value; + bNodeSocketValueVector *tovector= (bNodeSocketValueVector*)to->default_value; + bNodeSocketValueRGBA *torgba= (bNodeSocketValueRGBA*)to->default_value; + + if (from->type != to->type) + return; + + switch (from->type) { + case SOCK_FLOAT: + *tofloat = *fromfloat; + break; + case SOCK_INT: + *toint = *fromint; + break; + case SOCK_BOOLEAN: + *tobool = *frombool; + break; + case SOCK_VECTOR: + *tovector = *fromvector; + break; + case SOCK_RGBA: + *torgba = *fromrgba; + break; + } +} + +/* returns 1 if its OK */ +int node_group_ungroup(bNodeTree *ntree, bNode *gnode) +{ + bNodeLink *link, *linkn; + bNode *node, *nextn; + bNodeTree *ngroup, *wgroup; + ListBase anim_basepaths = {NULL, NULL}; + + ngroup= (bNodeTree *)gnode->id; + if(ngroup==NULL) return 0; + + /* clear new pointers, set in copytree */ + for(node= ntree->nodes.first; node; node= node->next) + node->new_node= NULL; + + /* wgroup is a temporary copy of the NodeTree we're merging in + * - all of wgroup's nodes are transferred across to their new home + * - ngroup (i.e. the source NodeTree) is left unscathed + */ + wgroup= ntreeCopyTree(ngroup); + + /* add the nodes into the ntree */ + for(node= wgroup->nodes.first; node; node= nextn) { + nextn= node->next; + + /* keep track of this node's RNA "base" path (the part of the pat identifying the node) + * if the old nodetree has animation data which potentially covers this node + */ + if (wgroup->adt) { + PointerRNA ptr; + char *path; + + RNA_pointer_create(&wgroup->id, &RNA_Node, node, &ptr); + path = RNA_path_from_ID_to_struct(&ptr); + + if (path) + BLI_addtail(&anim_basepaths, BLI_genericNodeN(path)); + } + + /* migrate node */ + BLI_remlink(&wgroup->nodes, node); + BLI_addtail(&ntree->nodes, node); + + node->locx+= gnode->locx; + node->locy+= gnode->locy; + + node->flag |= NODE_SELECT; + } + + /* restore external links to and from the gnode */ + for(link= ntree->links.first; link; link= link->next) { + if (link->fromnode==gnode) { + if (link->fromsock->groupsock) { + bNodeSocket *gsock= link->fromsock->groupsock; + if (gsock->link) { + if (gsock->link->fromnode) { + /* NB: using the new internal copies here! the groupsock pointer still maps to the old tree */ + link->fromnode = (gsock->link->fromnode ? gsock->link->fromnode->new_node : NULL); + link->fromsock = gsock->link->fromsock->new_sock; + } + else { + /* group output directly maps to group input */ + bNodeSocket *insock= node_group_find_input(gnode, gsock->link->fromsock); + if (insock->link) { + link->fromnode = insock->link->fromnode; + link->fromsock = insock->link->fromsock; + } + } + } + else { + /* copy the default input value from the group socket default to the external socket */ + convert_socket_value(gsock, link->tosock); + } + } + } + } + /* remove internal output links, these are not used anymore */ + for(link=wgroup->links.first; link; link= linkn) { + linkn = link->next; + if (!link->tonode) + nodeRemLink(wgroup, link); + } + /* restore links from internal nodes */ + for(link= wgroup->links.first; link; link= link->next) { + /* indicates link to group input */ + if (!link->fromnode) { + /* NB: can't use find_group_node_input here, + * because gnode sockets still point to the old tree! + */ + bNodeSocket *insock; + for (insock= gnode->inputs.first; insock; insock= insock->next) + if (insock->groupsock->new_sock == link->fromsock) + break; + if (insock->link) { + link->fromnode = insock->link->fromnode; + link->fromsock = insock->link->fromsock; + } + else { + /* copy the default input value from the group node socket default to the internal socket */ + convert_socket_value(insock, link->tosock); + nodeRemLink(wgroup, link); + } + } + } + + /* add internal links to the ntree */ + for(link= wgroup->links.first; link; link= linkn) { + linkn= link->next; + BLI_remlink(&wgroup->links, link); + BLI_addtail(&ntree->links, link); + } + + /* and copy across the animation */ + if (wgroup->adt) { + LinkData *ld, *ldn=NULL; + bAction *waction; + + /* firstly, wgroup needs to temporary dummy action that can be destroyed, as it shares copies */ + waction = wgroup->adt->action = copy_action(wgroup->adt->action); + + /* now perform the moving */ + BKE_animdata_separate_by_basepath(&wgroup->id, &ntree->id, &anim_basepaths); + + /* paths + their wrappers need to be freed */ + for (ld = anim_basepaths.first; ld; ld = ldn) { + ldn = ld->next; + + MEM_freeN(ld->data); + BLI_freelinkN(&anim_basepaths, ld); + } + + /* free temp action too */ + free_libblock(&G.main->action, waction); + } + + /* delete the group instance. this also removes old input links! */ + nodeFreeNode(ntree, gnode); + + /* free the group tree (takes care of user count) */ + free_libblock(&G.main->nodetree, wgroup); + + ntree->update |= NTREE_UPDATE_NODES|NTREE_UPDATE_LINKS; + ntreeUpdateTree(ntree); + + return 1; +} + +bNodeSocket *node_group_add_socket(bNodeTree *ngroup, const char *name, int type, int in_out) +{ + bNodeSocketType *stype = ntreeGetSocketType(type); + bNodeSocket *gsock = MEM_callocN(sizeof(bNodeSocket), "bNodeSocket"); + + strncpy(gsock->name, name, sizeof(gsock->name)); + gsock->type = type; + /* group sockets are dynamically added */ + gsock->flag |= SOCK_DYNAMIC; + + gsock->next = gsock->prev = NULL; + gsock->new_sock = NULL; + gsock->link = NULL; + /* assign new unique index */ + gsock->own_index = ngroup->cur_index++; + gsock->limit = (in_out==SOCK_IN ? 0xFFF : 1); + + if (stype->value_structsize > 0) + gsock->default_value = MEM_callocN(stype->value_structsize, "default socket value"); + + BLI_addtail(in_out==SOCK_IN ? &ngroup->inputs : &ngroup->outputs, gsock); + + ngroup->update |= (in_out==SOCK_IN ? NTREE_UPDATE_GROUP_IN : NTREE_UPDATE_GROUP_OUT); + + return gsock; +} + +bNodeSocket *node_group_expose_socket(bNodeTree *ngroup, bNodeSocket *sock, int in_out) +{ + bNodeSocket *gsock= node_group_add_socket(ngroup, sock->name, sock->type, in_out); + + /* initialize the default value. */ + copy_socket_value(sock, gsock); + + return gsock; +} + +void node_group_expose_all_sockets(bNodeTree *ngroup) +{ + bNode *node; + bNodeSocket *sock, *gsock; + + for (node=ngroup->nodes.first; node; node=node->next) { + for (sock=node->inputs.first; sock; sock=sock->next) { + if (!sock->link && !(sock->flag & SOCK_HIDDEN)) { + gsock = node_group_add_socket(ngroup, sock->name, sock->type, SOCK_IN); + + /* initialize the default value. */ + copy_socket_value(sock, gsock); + + sock->link = nodeAddLink(ngroup, NULL, gsock, node, sock); + } + } + for (sock=node->outputs.first; sock; sock=sock->next) { + if (nodeCountSocketLinks(ngroup, sock)==0 && !(sock->flag & SOCK_HIDDEN)) { + gsock = node_group_add_socket(ngroup, sock->name, sock->type, SOCK_OUT); + + /* initialize the default value. */ + copy_socket_value(sock, gsock); + + gsock->link = nodeAddLink(ngroup, node, sock, NULL, gsock); + } + } + } +} + +void node_group_remove_socket(bNodeTree *ngroup, bNodeSocket *gsock, int in_out) +{ + nodeRemSocketLinks(ngroup, gsock); + + switch (in_out) { + case SOCK_IN: + BLI_remlink(&ngroup->inputs, gsock); + ngroup->update |= NTREE_UPDATE_GROUP_IN; + break; + case SOCK_OUT: + BLI_remlink(&ngroup->outputs, gsock); + ngroup->update |= NTREE_UPDATE_GROUP_OUT; + break; + } + + if (gsock->default_value) + MEM_freeN(gsock->default_value); + + MEM_freeN(gsock); +} + +/* groups display their internal tree name as label */ +const char *node_group_label(bNode *node) +{ + return (node->id)? node->id->name+2: "Missing Datablock"; +} + +int node_group_valid(bNodeTree *ntree, bNodeTemplate *ntemp) +{ + bNodeTemplate childtemp; + bNode *node; + + /* regular groups cannot be recursive */ + if (ntree == ntemp->ngroup) + return 0; + + /* make sure all children are valid */ + for (node=ntemp->ngroup->nodes.first; node; node=node->next) { + childtemp = nodeMakeTemplate(node); + if (!nodeValid(ntree, &childtemp)) + return 0; + } + + return 1; +} + +bNodeTemplate node_group_template(bNode *node) +{ + bNodeTemplate ntemp; + ntemp.type = NODE_GROUP; + ntemp.ngroup = (bNodeTree*)node->id; + return ntemp; +} + +void node_group_init(bNodeTree *ntree, bNode *node, bNodeTemplate *ntemp) +{ + node->id = (ID*)ntemp->ngroup; + + /* NB: group socket input/output roles are inverted internally! + * Group "inputs" work as outputs in links and vice versa. + */ + if (ntemp->ngroup) { + bNodeSocket *gsock; + for (gsock=ntemp->ngroup->inputs.first; gsock; gsock=gsock->next) + node_group_add_extern_socket(ntree, &node->inputs, SOCK_IN, gsock); + for (gsock=ntemp->ngroup->outputs.first; gsock; gsock=gsock->next) + node_group_add_extern_socket(ntree, &node->outputs, SOCK_OUT, gsock); + } +} + +static bNodeSocket *group_verify_socket(bNodeTree *ntree, ListBase *lb, int in_out, bNodeSocket *gsock) +{ + bNodeSocket *sock; + + /* group sockets tagged as internal are not exposed ever */ + if (gsock->flag & SOCK_INTERNAL) + return NULL; + + for(sock= lb->first; sock; sock= sock->next) { + if(sock->own_index==gsock->own_index) + break; + } + if(sock) { + sock->groupsock = gsock; + + strcpy(sock->name, gsock->name); + sock->type= gsock->type; + + /* XXX hack: group socket input/output roles are inverted internally, + * need to change the limit value when making actual node sockets from them. + */ + sock->limit = (in_out==SOCK_IN ? 1 : 0xFFF); + + BLI_remlink(lb, sock); + + return sock; + } + else { + return node_group_add_extern_socket(ntree, NULL, in_out, gsock); + } +} + +static void group_verify_socket_list(bNodeTree *ntree, bNode *node, ListBase *lb, int in_out, ListBase *glb) +{ + bNodeSocket *sock, *nextsock, *gsock; + + /* step by step compare */ + for (gsock= glb->first; gsock; gsock=gsock->next) { + /* abusing new_sock pointer for verification here! only used inside this function */ + gsock->new_sock= group_verify_socket(ntree, lb, in_out, gsock); + } + /* leftovers are removed */ + for (sock=lb->first; sock; sock=nextsock) { + nextsock=sock->next; + if (sock->flag & SOCK_DYNAMIC) + nodeRemoveSocket(ntree, node, sock); + } + /* and we put back the verified sockets */ + for (gsock= glb->first; gsock; gsock=gsock->next) { + if (gsock->new_sock) { + BLI_addtail(lb, gsock->new_sock); + gsock->new_sock = NULL; + } + } +} + +/* make sure all group node in ntree, which use ngroup, are sync'd */ +void node_group_verify(struct bNodeTree *ntree, struct bNode *node, struct ID *id) +{ + /* check inputs and outputs, and remove or insert them */ + if (node->id==id) { + bNodeTree *ngroup= (bNodeTree*)node->id; + group_verify_socket_list(ntree, node, &node->inputs, SOCK_IN, &ngroup->inputs); + group_verify_socket_list(ntree, node, &node->outputs, SOCK_OUT, &ngroup->outputs); + } +} + +struct bNodeTree *node_group_edit_get(bNode *node) +{ + if (node->flag & NODE_GROUP_EDIT) + return (bNodeTree*)node->id; + else + return NULL; +} + +struct bNodeTree *node_group_edit_set(bNode *node, int edit) +{ + if (edit) { + bNodeTree *ngroup= (bNodeTree*)node->id; + if (ngroup) { + if(ngroup->id.lib) + ntreeMakeLocal(ngroup); + + node->flag |= NODE_GROUP_EDIT; + } + return ngroup; + } + else { + node->flag &= ~NODE_GROUP_EDIT; + return NULL; + } +} + +void node_group_edit_clear(bNode *node) +{ + bNodeTree *ngroup= (bNodeTree*)node->id; + bNode *inode; + + node->flag &= ~NODE_GROUP_EDIT; + + if (ngroup) + for (inode=ngroup->nodes.first; inode; inode=inode->next) + nodeGroupEditClear(inode); +} + +void node_group_link(bNodeTree *ntree, bNodeSocket *sock, int in_out) +{ + node_group_expose_socket(ntree, sock, in_out); +} + +/**** For Loop ****/ + +/* Essentially a group node with slightly different behavior. + * The internal tree is executed several times, with each output being re-used + * as an input in the next iteration. For this purpose, input and output socket + * lists are kept identical! + */ + +bNodeTemplate node_forloop_template(bNode *node) +{ + bNodeTemplate ntemp; + ntemp.type = NODE_FORLOOP; + ntemp.ngroup = (bNodeTree*)node->id; + return ntemp; +} + +void node_forloop_init(bNodeTree *ntree, bNode *node, bNodeTemplate *ntemp) +{ + bNodeSocket *sock; + + node->id = (ID*)ntemp->ngroup; + + sock = nodeAddInputFloat(ntree, node, "Iterations", PROP_UNSIGNED, 1, 0, 10000); + + /* NB: group socket input/output roles are inverted internally! + * Group "inputs" work as outputs in links and vice versa. + */ + if (ntemp->ngroup) { + bNodeSocket *gsock; + for (gsock=ntemp->ngroup->inputs.first; gsock; gsock=gsock->next) + node_group_add_extern_socket(ntree, &node->inputs, SOCK_IN, gsock); + for (gsock=ntemp->ngroup->outputs.first; gsock; gsock=gsock->next) + node_group_add_extern_socket(ntree, &node->outputs, SOCK_OUT, gsock); + } +} + +void node_forloop_init_tree(bNodeTree *ntree) +{ + bNodeSocket *sock; + sock = node_group_add_socket(ntree, "Iteration", SOCK_FLOAT, SOCK_IN); + sock->flag |= SOCK_INTERNAL; +} + +static void loop_sync(bNodeTree *ntree, int sync_in_out) +{ + bNodeSocket *sock, *sync, *nsync, *mirror; + ListBase *sync_lb; + + if (sync_in_out==SOCK_IN) { + sock = ntree->outputs.first; + + sync = ntree->inputs.first; + sync_lb = &ntree->inputs; + } + else { + sock = ntree->inputs.first; + + sync = ntree->outputs.first; + sync_lb = &ntree->outputs; + } + + /* NB: the sock->storage pointer is used here directly to store the own_index int + * out the mirrored socket counterpart! + */ + + while (sock) { + /* skip static and internal sockets on the sync side (preserves socket order!) */ + while (sync && ((sync->flag & SOCK_INTERNAL) || !(sync->flag & SOCK_DYNAMIC))) + sync = sync->next; + + if (!(sync->flag & SOCK_INTERNAL) && (sync->flag & SOCK_DYNAMIC)) { + if (sock->storage==NULL) { + /* if mirror index is 0, the sockets is newly added and a new mirror must be created. */ + mirror = node_group_expose_socket(ntree, sock, sync_in_out); + /* store the mirror index */ + sock->storage = SET_INT_IN_POINTER(mirror->own_index); + mirror->storage = SET_INT_IN_POINTER(sock->own_index); + /* move mirror to the right place */ + BLI_remlink(sync_lb, mirror); + if (sync) + BLI_insertlinkbefore(sync_lb, sync, mirror); + else + BLI_addtail(sync_lb, mirror); + } + else { + /* look up the mirror socket */ + for (mirror=sync; mirror; mirror=mirror->next) + if (mirror->own_index == GET_INT_FROM_POINTER(sock->storage)) + break; + /* make sure the name is the same (only for identification by user, no deeper meaning) */ + strcpy(mirror->name, sock->name); + /* fix the socket order if necessary */ + if (mirror != sync) { + BLI_remlink(sync_lb, mirror); + BLI_insertlinkbefore(sync_lb, sync, mirror); + } + else + sync = sync->next; + } + } + + sock = sock->next; + } + + /* remaining sockets in sync_lb are leftovers from deleted sockets, remove them */ + while (sync) { + nsync = sync->next; + if (!(sync->flag & SOCK_INTERNAL) && (sync->flag & SOCK_DYNAMIC)) + node_group_remove_socket(ntree, sync, sync_in_out); + sync = nsync; + } +} + +void node_loop_update_tree(bNodeTree *ngroup) +{ + /* make sure inputs & outputs are identical */ + if (ngroup->update & NTREE_UPDATE_GROUP_IN) + loop_sync(ngroup, SOCK_OUT); + if (ngroup->update & NTREE_UPDATE_GROUP_OUT) + loop_sync(ngroup, SOCK_IN); +} + +void node_whileloop_init(bNodeTree *ntree, bNode *node, bNodeTemplate *ntemp) +{ + bNodeSocket *sock; + + node->id = (ID*)ntemp->ngroup; + + sock = nodeAddInputFloat(ntree, node, "Condition", PROP_NONE, 1, 0, 1); + + /* max iterations */ + node->custom1 = 10000; + + /* NB: group socket input/output roles are inverted internally! + * Group "inputs" work as outputs in links and vice versa. + */ + if (ntemp->ngroup) { + bNodeSocket *gsock; + for (gsock=ntemp->ngroup->inputs.first; gsock; gsock=gsock->next) + node_group_add_extern_socket(ntree, &node->inputs, SOCK_IN, gsock); + for (gsock=ntemp->ngroup->outputs.first; gsock; gsock=gsock->next) + node_group_add_extern_socket(ntree, &node->outputs, SOCK_OUT, gsock); + } +} + +void node_whileloop_init_tree(bNodeTree *ntree) +{ + bNodeSocket *sock; + sock = node_group_add_socket(ntree, "Condition", SOCK_FLOAT, SOCK_OUT); + sock->flag |= SOCK_INTERNAL; +} + +bNodeTemplate node_whileloop_template(bNode *node) +{ + bNodeTemplate ntemp; + ntemp.type = NODE_WHILELOOP; + ntemp.ngroup = (bNodeTree*)node->id; + return ntemp; +} + +/**** FRAME ****/ + +void register_node_type_frame(ListBase *lb) +{ + /* frame type is used for all tree types, needs dynamic allocation */ + bNodeType *ntype= MEM_callocN(sizeof(bNodeType), "frame node type"); + + node_type_base(ntype, NODE_FRAME, "Frame", NODE_CLASS_LAYOUT, NODE_BACKGROUND); + node_type_size(ntype, 150, 100, 0); + + ntype->needs_free = 1; + nodeRegisterType(lb, ntype); +} diff --git a/source/blender/nodes/intern/node_common.h b/source/blender/nodes/intern/node_common.h new file mode 100644 index 00000000000..31a13d8168d --- /dev/null +++ b/source/blender/nodes/intern/node_common.h @@ -0,0 +1,65 @@ +/** + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2007 Blender Foundation. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): Lukas Toenne. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/nodes/intern/node_common.h + * \ingroup nodes + */ + + +#ifndef NODE_COMMON_H_ +#define NODE_COMMON_H_ + +#include "DNA_listBase.h" + +struct bNodeTree; + +struct bNodeSocket *node_group_add_extern_socket(struct bNodeTree *ntree, ListBase *lb, int in_out, struct bNodeSocket *gsock); + +void node_group_init(struct bNodeTree *ntree, struct bNode *node, struct bNodeTemplate *ntemp); +void node_forloop_init(struct bNodeTree *ntree, struct bNode *node, struct bNodeTemplate *ntemp); +void node_whileloop_init(struct bNodeTree *ntree, struct bNode *node, struct bNodeTemplate *ntemp); + +void node_forloop_init_tree(struct bNodeTree *ntree); +void node_whileloop_init_tree(struct bNodeTree *ntree); + +const char *node_group_label(struct bNode *node); + +struct bNodeTemplate node_group_template(struct bNode *node); +struct bNodeTemplate node_forloop_template(struct bNode *node); +struct bNodeTemplate node_whileloop_template(struct bNode *node); + +int node_group_valid(struct bNodeTree *ntree, struct bNodeTemplate *ntemp); +void node_group_verify(struct bNodeTree *ntree, struct bNode *node, struct ID *id); + +struct bNodeTree *node_group_edit_get(struct bNode *node); +struct bNodeTree *node_group_edit_set(struct bNode *node, int edit); +void node_group_edit_clear(bNode *node); + +void node_loop_update_tree(struct bNodeTree *ngroup); + +#endif diff --git a/source/blender/nodes/intern/node_exec.c b/source/blender/nodes/intern/node_exec.c new file mode 100644 index 00000000000..0d688438cf9 --- /dev/null +++ b/source/blender/nodes/intern/node_exec.c @@ -0,0 +1,308 @@ +/** + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2007 Blender Foundation. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): Nathan Letwory. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/nodes/intern/node_exec.c + * \ingroup nodes + */ + + +#include "DNA_node_types.h" + +#include "BLI_listbase.h" +#include "BLI_math.h" +#include "BLI_utildefines.h" + +#include "BKE_node.h" + +#include "MEM_guardedalloc.h" + +#include "node_exec.h" + + +/* for a given socket, find the actual stack entry */ +bNodeStack *node_get_socket_stack(bNodeStack *stack, bNodeSocket *sock) +{ + return stack + sock->stack_index; +} + +void node_get_stack(bNode *node, bNodeStack *stack, bNodeStack **in, bNodeStack **out) +{ + bNodeSocket *sock; + + /* build pointer stack */ + if (in) { + for(sock= node->inputs.first; sock; sock= sock->next) { + *(in++) = node_get_socket_stack(stack, sock); + } + } + + if (out) { + for(sock= node->outputs.first; sock; sock= sock->next) { + *(out++) = node_get_socket_stack(stack, sock); + } + } +} + +void node_init_input_index(bNodeSocket *sock, int *index) +{ + if (sock->link && sock->link->fromsock) { + sock->stack_index = sock->link->fromsock->stack_index; + } + else { + sock->stack_index = (*index)++; + } +} + +void node_init_output_index(bNodeSocket *sock, int *index) +{ + sock->stack_index = (*index)++; +} + +/* basic preparation of socket stacks */ +static struct bNodeStack *setup_stack(bNodeStack *stack, bNodeSocket *sock) +{ + bNodeStack *ns = node_get_socket_stack(stack, sock); + float null_value[4]= {0.0f, 0.0f, 0.0f, 0.0f}; + + /* don't mess with remote socket stacks, these are initialized by other nodes! */ + if (sock->link) + return ns; + + ns->sockettype = sock->type; + + if (sock->default_value) { + switch (sock->type) { + case SOCK_FLOAT: + ns->vec[0] = ((bNodeSocketValueFloat*)sock->default_value)->value; + break; + case SOCK_VECTOR: + copy_v3_v3(ns->vec, ((bNodeSocketValueVector*)sock->default_value)->value); + break; + case SOCK_RGBA: + copy_v4_v4(ns->vec, ((bNodeSocketValueRGBA*)sock->default_value)->value); + break; + } + } + else { + switch (sock->type) { + case SOCK_FLOAT: + ns->vec[0] = 0.0f; + break; + case SOCK_VECTOR: + copy_v3_v3(ns->vec, null_value); + break; + case SOCK_RGBA: + copy_v4_v4(ns->vec, null_value); + break; + } + } + + return ns; +} + +bNodeTreeExec *ntree_exec_begin(bNodeTree *ntree) +{ + bNodeTreeExec *exec; + bNode *node; + bNodeExec *nodeexec; + bNodeSocket *sock, *gsock; + bNodeStack *ns; + int index= 0; + bNode **nodelist; + int totnodes, n; + + if((ntree->init & NTREE_TYPE_INIT)==0) + ntreeInitTypes(ntree); + + /* get a dependency-sorted list of nodes */ + ntreeGetDependencyList(ntree, &nodelist, &totnodes); + + /* XXX could let callbacks do this for specialized data */ + exec = MEM_callocN(sizeof(bNodeTreeExec), "node tree execution data"); + /* backpointer to node tree */ + exec->nodetree = ntree; + + /* group inputs essentially work as outputs */ + for(gsock=ntree->inputs.first; gsock; gsock = gsock->next) + node_init_output_index(gsock, &index); + /* set stack indexes */ + for(n=0; n < totnodes; ++n) { + node = nodelist[n]; + + node->stack_index = index; + + /* init node socket stack indexes */ + for (sock=node->inputs.first; sock; sock=sock->next) + node_init_input_index(sock, &index); + for (sock=node->outputs.first; sock; sock=sock->next) + node_init_output_index(sock, &index); + } + /* group outputs essentially work as inputs */ + for(gsock=ntree->outputs.first; gsock; gsock = gsock->next) + node_init_input_index(gsock, &index); + + /* allocated exec data pointers for nodes */ + exec->totnodes = totnodes; + exec->nodeexec = MEM_callocN(exec->totnodes * sizeof(bNodeExec), "node execution data"); + /* allocate data pointer for node stack */ + exec->stacksize = index; + exec->stack = MEM_callocN(exec->stacksize * sizeof(bNodeStack), "bNodeStack"); + + /* prepare group tree inputs */ + for (sock=ntree->inputs.first; sock; sock=sock->next) { + ns = setup_stack(exec->stack, sock); + if (ns->hasoutput) + ns->hasinput = 1; + } + /* prepare all internal nodes for execution */ + for(n=0, nodeexec= exec->nodeexec; n < totnodes; ++n, ++nodeexec) { + node = nodeexec->node = nodelist[n]; + + /* tag inputs */ + for (sock=node->inputs.first; sock; sock=sock->next) { + /* disable the node if an input link is invalid */ + if(sock->link && !(sock->link->flag & NODE_LINK_VALID)) + node->need_exec= 0; + + ns = setup_stack(exec->stack, sock); + if (ns->hasoutput) + ns->hasinput = 1; + } + + /* tag all outputs */ + for (sock=node->outputs.first; sock; sock=sock->next) { + ns = setup_stack(exec->stack, sock); + ns->hasoutput = 1; + } + + if(node->typeinfo->initexecfunc) + nodeexec->data = node->typeinfo->initexecfunc(node); + } + /* prepare group tree outputs */ + for (sock=ntree->outputs.first; sock; sock=sock->next) { + ns = setup_stack(exec->stack, sock); + ns->hasoutput = 1; + } + + if (nodelist) + MEM_freeN(nodelist); + + return exec; +} + +void ntree_exec_end(bNodeTreeExec *exec) +{ + bNodeExec *nodeexec; + int n; + + if (exec->stack) + MEM_freeN(exec->stack); + + for(n=0, nodeexec= exec->nodeexec; n < exec->totnodes; ++n, ++nodeexec) { + if (nodeexec->node->typeinfo->freeexecfunc) + nodeexec->node->typeinfo->freeexecfunc(nodeexec->node, nodeexec->data); + } + + if (exec->nodeexec) + MEM_freeN(exec->nodeexec); + + MEM_freeN(exec); +} + +/**** Compositor/Material/Texture trees ****/ + +bNodeThreadStack *ntreeGetThreadStack(bNodeTreeExec *exec, int thread) +{ + ListBase *lb= &exec->threadstack[thread]; + bNodeThreadStack *nts; + + for(nts=lb->first; nts; nts=nts->next) { + if(!nts->used) { + nts->used= 1; + break; + } + } + + if (!nts) { + nts= MEM_callocN(sizeof(bNodeThreadStack), "bNodeThreadStack"); + nts->stack= MEM_dupallocN(exec->stack); + nts->used= 1; + BLI_addtail(lb, nts); + } + + return nts; +} + +void ntreeReleaseThreadStack(bNodeThreadStack *nts) +{ + nts->used = 0; +} + +void ntreeExecNodes(bNodeTreeExec *exec, void *callerdata, int thread) +{ + bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */ + bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */ + bNodeExec *nodeexec; + bNode *node; + int n; + + /* nodes are presorted, so exec is in order of list */ + + for(n=0, nodeexec= exec->nodeexec; n < exec->totnodes; ++n, ++nodeexec) { + node = nodeexec->node; + if(node->need_exec) { + node_get_stack(node, exec->stack, nsin, nsout); + if(node->typeinfo->execfunc) + node->typeinfo->execfunc(callerdata, node, nsin, nsout); + else if (node->typeinfo->newexecfunc) + node->typeinfo->newexecfunc(callerdata, thread, node, nodeexec->data, nsin, nsout); + } + } +} + +void ntreeExecThreadNodes(bNodeTreeExec *exec, bNodeThreadStack *nts, void *callerdata, int thread) +{ + bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */ + bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */ + bNodeExec *nodeexec; + bNode *node; + int n; + + /* nodes are presorted, so exec is in order of list */ + + for(n=0, nodeexec= exec->nodeexec; n < exec->totnodes; ++n, ++nodeexec) { + node = nodeexec->node; + if(node->need_exec) { + node_get_stack(node, nts->stack, nsin, nsout); + if(node->typeinfo->execfunc) + node->typeinfo->execfunc(callerdata, node, nsin, nsout); + else if (node->typeinfo->newexecfunc) + node->typeinfo->newexecfunc(callerdata, thread, node, nodeexec->data, nsin, nsout); + } + } +} diff --git a/source/blender/nodes/intern/node_exec.h b/source/blender/nodes/intern/node_exec.h new file mode 100644 index 00000000000..457e119613b --- /dev/null +++ b/source/blender/nodes/intern/node_exec.h @@ -0,0 +1,89 @@ +/** + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2007 Blender Foundation. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): Nathan Letwory. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/nodes/intern/node_exec.h + * \ingroup nodes + */ + + +#ifndef NODE_EXEC_H_ +#define NODE_EXEC_H_ + +#include "DNA_listBase.h" + +#include "BLI_utildefines.h" + +#include "BKE_node.h" + +#include "RNA_types.h" + +struct bNodeTree; +struct bNode; +struct bNodeStack; + +/* Node execution data */ +typedef struct bNodeExec { + struct bNode *node; /* backpointer to node */ + void *data; /* custom data storage */ +} bNodeExec; + +/* Execution Data for each instance of node tree execution */ +typedef struct bNodeTreeExec { + struct bNodeTree *nodetree; /* backpointer to node tree */ + + int totnodes; /* total node count */ + struct bNodeExec *nodeexec; /* per-node execution data */ + + int stacksize; + struct bNodeStack *stack; /* socket data stack */ + /* only used by material and texture trees to keep one stack for each thread */ + ListBase *threadstack; /* one instance of the stack for each thread */ +} bNodeTreeExec; + +/* stores one stack copy for each thread (material and texture trees) */ +typedef struct bNodeThreadStack { + struct bNodeThreadStack *next, *prev; + struct bNodeStack *stack; + int used; +} bNodeThreadStack; + +struct bNodeStack *node_get_socket_stack(struct bNodeStack *stack, struct bNodeSocket *sock); +void node_get_stack(struct bNode *node, struct bNodeStack *stack, struct bNodeStack **in, struct bNodeStack **out); +void node_init_input_index(struct bNodeSocket *sock, int *index); +void node_init_output_index(struct bNodeSocket *sock, int *index); + +struct bNodeTreeExec *ntree_exec_begin(struct bNodeTree *ntree); +void ntree_exec_end(struct bNodeTreeExec *exec); + +void ntreeExecNodes(struct bNodeTreeExec *exec, void *callerdata, int thread); + +struct bNodeThreadStack *ntreeGetThreadStack(struct bNodeTreeExec *exec, int thread); +void ntreeReleaseThreadStack(struct bNodeThreadStack *nts); +void ntreeExecThreadNodes(struct bNodeTreeExec *exec, struct bNodeThreadStack *nts, void *callerdata, int thread); + +#endif diff --git a/source/blender/nodes/intern/node_socket.c b/source/blender/nodes/intern/node_socket.c new file mode 100644 index 00000000000..ef8b3e797ce --- /dev/null +++ b/source/blender/nodes/intern/node_socket.c @@ -0,0 +1,428 @@ +/** + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2007 Blender Foundation. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): Lukas Toennne + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/nodes/intern/node_socket.c + * \ingroup nodes + */ + + +#include "DNA_node_types.h" + +#include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" +#include "DNA_object_types.h" +#include "DNA_scene_types.h" + +#include "BLI_listbase.h" +#include "BLI_math.h" +#include "BLI_utildefines.h" + +#include "BKE_DerivedMesh.h" +#include "BKE_node.h" + +#include "RNA_access.h" +#include "RNA_types.h" + +#include "MEM_guardedalloc.h" + +#include "NOD_socket.h" + +/****************** FLOAT ******************/ + +static bNodeSocketType node_socket_type_float = { + /* type */ SOCK_FLOAT, + /* ui_name */ "Float", + /* ui_description */ "Floating Point", + /* ui_icon */ 0, + /* ui_color */ {160,160,160,255}, + + /* value_structname */ "bNodeSocketValueFloat", + /* value_structsize */ sizeof(bNodeSocketValueFloat), + + /* buttonfunc */ NULL, +}; + +/****************** VECTOR ******************/ + +static bNodeSocketType node_socket_type_vector = { + /* type */ SOCK_VECTOR, + /* ui_name */ "Vector", + /* ui_description */ "3-dimensional floating point vector", + /* ui_icon */ 0, + /* ui_color */ {100,100,200,255}, + + /* value_structname */ "bNodeSocketValueVector", + /* value_structsize */ sizeof(bNodeSocketValueVector), + + /* buttonfunc */ NULL, +}; + +/****************** RGBA ******************/ + +static bNodeSocketType node_socket_type_rgba = { + /* type */ SOCK_RGBA, + /* ui_name */ "RGBA", + /* ui_description */ "RGBA color", + /* ui_icon */ 0, + /* ui_color */ {200,200,40,255}, + + /* value_structname */ "bNodeSocketValueRGBA", + /* value_structsize */ sizeof(bNodeSocketValueRGBA), + + /* buttonfunc */ NULL, +}; + +/****************** INT ******************/ + +static bNodeSocketType node_socket_type_int = { + /* type */ SOCK_INT, + /* ui_name */ "Int", + /* ui_description */ "Integer", + /* ui_icon */ 0, + /* ui_color */ {17,133,37,255}, + + /* value_structname */ "bNodeSocketValueInt", + /* value_structsize */ sizeof(bNodeSocketValueInt), + + /* buttonfunc */ NULL, +}; + +/****************** BOOLEAN ******************/ + +static bNodeSocketType node_socket_type_boolean = { + /* type */ SOCK_BOOLEAN, + /* ui_name */ "Boolean", + /* ui_description */ "Boolean", + /* ui_icon */ 0, + /* ui_color */ {158,139,63,255}, + + /* value_structname */ "bNodeSocketValueBoolean", + /* value_structsize */ sizeof(bNodeSocketValueBoolean), + + /* buttonfunc */ NULL, +}; + +/****************** MESH ******************/ + +static bNodeSocketType node_socket_type_mesh = { + /* type */ SOCK_MESH, + /* ui_name */ "Mesh", + /* ui_description */ "Mesh geometry data", + /* ui_icon */ 0, + /* ui_color */ {255,133,7,255}, + + /* value_structname */ NULL, + /* value_structsize */ 0, + + /* buttonfunc */ NULL, +}; + + +void node_socket_type_init(bNodeSocketType *types[]) +{ + #define INIT_TYPE(name) types[node_socket_type_##name.type] = &node_socket_type_##name; + + INIT_TYPE(float); + INIT_TYPE(vector); + INIT_TYPE(rgba); + INIT_TYPE(int); + INIT_TYPE(boolean); + INIT_TYPE(mesh); + + #undef INIT_TYPE +} + +struct bNodeSocket *nodeAddInputInt(struct bNodeTree *ntree, struct bNode *node, const char *name, PropertySubType subtype, + int value, int min, int max) +{ + bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_IN, name, SOCK_INT); + bNodeSocketValueInt *dval= (bNodeSocketValueInt*)sock->default_value; + dval->subtype = subtype; + dval->value = value; + dval->min = min; + dval->max = max; + return sock; +} +struct bNodeSocket *nodeAddOutputInt(struct bNodeTree *ntree, struct bNode *node, const char *name) +{ + bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_OUT, name, SOCK_INT); + return sock; +} + +struct bNodeSocket *nodeAddInputFloat(struct bNodeTree *ntree, struct bNode *node, const char *name, PropertySubType subtype, + float value, float min, float max) +{ + bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_IN, name, SOCK_FLOAT); + bNodeSocketValueFloat *dval= (bNodeSocketValueFloat*)sock->default_value; + dval->subtype = subtype; + dval->value = value; + dval->min = min; + dval->max = max; + return sock; +} +struct bNodeSocket *nodeAddOutputFloat(struct bNodeTree *ntree, struct bNode *node, const char *name) +{ + bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_OUT, name, SOCK_FLOAT); + return sock; +} + +struct bNodeSocket *nodeAddInputBoolean(struct bNodeTree *ntree, struct bNode *node, const char *name, char value) +{ + bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_IN, name, SOCK_BOOLEAN); + bNodeSocketValueBoolean *dval= (bNodeSocketValueBoolean*)sock->default_value; + dval->value = value; + return sock; +} +struct bNodeSocket *nodeAddOutputBoolean(struct bNodeTree *ntree, struct bNode *node, const char *name) +{ + bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_OUT, name, SOCK_BOOLEAN); + return sock; +} + +struct bNodeSocket *nodeAddInputVector(struct bNodeTree *ntree, struct bNode *node, const char *name, PropertySubType subtype, + float x, float y, float z, float min, float max) +{ + bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_IN, name, SOCK_VECTOR); + bNodeSocketValueVector *dval= (bNodeSocketValueVector*)sock->default_value; + dval->subtype = subtype; + dval->value[0] = x; + dval->value[1] = y; + dval->value[2] = z; + dval->min = min; + dval->max = max; + return sock; +} +struct bNodeSocket *nodeAddOutputVector(struct bNodeTree *ntree, struct bNode *node, const char *name) +{ + bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_OUT, name, SOCK_VECTOR); + return sock; +} + +struct bNodeSocket *nodeAddInputRGBA(struct bNodeTree *ntree, struct bNode *node, const char *name, + float r, float g, float b, float a) +{ + bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_IN, name, SOCK_RGBA); + bNodeSocketValueRGBA *dval= (bNodeSocketValueRGBA*)sock->default_value; + dval->value[0] = r; + dval->value[1] = g; + dval->value[2] = b; + dval->value[3] = a; + return sock; +} +struct bNodeSocket *nodeAddOutputRGBA(struct bNodeTree *ntree, struct bNode *node, const char *name) +{ + bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_OUT, name, SOCK_RGBA); + return sock; +} + +struct bNodeSocket *nodeAddInputMesh(struct bNodeTree *ntree, struct bNode *node, const char *name) +{ + bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_IN, name, SOCK_MESH); + return sock; +} +struct bNodeSocket *nodeAddOutputMesh(struct bNodeTree *ntree, struct bNode *node, const char *name) +{ + bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_OUT, name, SOCK_MESH); + return sock; +} + +struct bNodeSocket *node_add_input_from_template(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocketTemplate *stemp) +{ + bNodeSocket *sock; + switch (stemp->type) { + case SOCK_INT: + sock = nodeAddInputInt(ntree, node, stemp->name, stemp->subtype, (int)stemp->val1, (int)stemp->min, (int)stemp->max); + break; + case SOCK_FLOAT: + sock = nodeAddInputFloat(ntree, node, stemp->name, stemp->subtype, stemp->val1, stemp->min, stemp->max); + break; + case SOCK_BOOLEAN: + sock = nodeAddInputBoolean(ntree, node, stemp->name, (char)stemp->val1); + break; + case SOCK_VECTOR: + sock = nodeAddInputVector(ntree, node, stemp->name, stemp->subtype, stemp->val1, stemp->val2, stemp->val3, stemp->min, stemp->max); + break; + case SOCK_RGBA: + sock = nodeAddInputRGBA(ntree, node, stemp->name, stemp->val1, stemp->val2, stemp->val3, stemp->val4); + break; + case SOCK_MESH: + sock = nodeAddInputMesh(ntree, node, stemp->name); + break; + default: + sock = nodeAddSocket(ntree, node, SOCK_IN, stemp->name, stemp->type); + } + return sock; +} + +struct bNodeSocket *node_add_output_from_template(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocketTemplate *stemp) +{ + bNodeSocket *sock; + switch (stemp->type) { + case SOCK_INT: + sock = nodeAddOutputInt(ntree, node, stemp->name); + break; + case SOCK_FLOAT: + sock = nodeAddOutputFloat(ntree, node, stemp->name); + break; + case SOCK_BOOLEAN: + sock = nodeAddOutputBoolean(ntree, node, stemp->name); + break; + case SOCK_VECTOR: + sock = nodeAddOutputVector(ntree, node, stemp->name); + break; + case SOCK_RGBA: + sock = nodeAddOutputRGBA(ntree, node, stemp->name); + break; + case SOCK_MESH: + sock = nodeAddOutputMesh(ntree, node, stemp->name); + break; + default: + sock = nodeAddSocket(ntree, node, SOCK_OUT, stemp->name, stemp->type); + } + return sock; +} + +static bNodeSocket *verify_socket_template(bNodeTree *ntree, bNode *node, int in_out, ListBase *socklist, bNodeSocketTemplate *stemp) +{ + bNodeSocket *sock; + + for(sock= socklist->first; sock; sock= sock->next) { + if(!(sock->flag & SOCK_DYNAMIC) && strncmp(sock->name, stemp->name, NODE_MAXSTR)==0) + break; + } + if(sock) { + sock->type= stemp->type; /* in future, read this from tydefs! */ + if(stemp->limit==0) sock->limit= 0xFFF; + else sock->limit= stemp->limit; + + /* Copy the property range and subtype parameters in case the template changed. + * NOT copying the actual value here, only button behavior changes! + */ + switch (sock->type) { + case SOCK_FLOAT: + { + bNodeSocketValueFloat *dval= sock->default_value; + dval->min = stemp->min; + dval->max = stemp->max; + dval->subtype = stemp->subtype; + } + break; + case SOCK_INT: + { + bNodeSocketValueInt *dval= sock->default_value; + dval->min = stemp->min; + dval->max = stemp->max; + dval->subtype = stemp->subtype; + } + break; + case SOCK_VECTOR: + { + bNodeSocketValueVector *dval= sock->default_value; + dval->min = stemp->min; + dval->max = stemp->max; + dval->subtype = stemp->subtype; + } + break; + } + + BLI_remlink(socklist, sock); + + return sock; + } + else { + /* no socket for this template found, make a new one */ + if (in_out==SOCK_IN) + sock = node_add_input_from_template(ntree, node, stemp); + else + sock = node_add_output_from_template(ntree, node, stemp); + /* remove the new socket from the node socket list first, + * will be added back after verification. + */ + BLI_remlink(socklist, sock); + } + + return sock; +} + +static void verify_socket_template_list(bNodeTree *ntree, bNode *node, int in_out, ListBase *socklist, bNodeSocketTemplate *stemp_first) +{ + bNodeSocket *sock; + bNodeSocketTemplate *stemp; + + /* no inputs anymore? */ + if(stemp_first==NULL) { + while(socklist->first) { + sock = (bNodeSocket*)socklist->first; + if (!(sock->flag & SOCK_DYNAMIC)) + nodeRemoveSocket(ntree, node, socklist->first); + } + } + else { + /* step by step compare */ + stemp= stemp_first; + while(stemp->type != -1) { + stemp->sock= verify_socket_template(ntree, node, in_out, socklist, stemp); + stemp++; + } + /* leftovers are removed */ + while(socklist->first) { + sock = (bNodeSocket*)socklist->first; + if (!(sock->flag & SOCK_DYNAMIC)) + nodeRemoveSocket(ntree, node, socklist->first); + } + + /* and we put back the verified sockets */ + stemp= stemp_first; + if (socklist->first) { + /* some dynamic sockets left, store the list start + * so we can add static sockets infront of it. + */ + sock = socklist->first; + while(stemp->type != -1) { + /* put static sockets infront of dynamic */ + BLI_insertlinkbefore(socklist, sock, stemp->sock); + stemp++; + } + } + else { + while(stemp->type != -1) { + BLI_addtail(socklist, stemp->sock); + stemp++; + } + } + } +} + +void node_verify_socket_templates(bNodeTree *ntree, bNode *node) +{ + bNodeType *ntype= node->typeinfo; + if(ntype) { + verify_socket_template_list(ntree, node, SOCK_IN, &node->inputs, ntype->inputs); + verify_socket_template_list(ntree, node, SOCK_OUT, &node->outputs, ntype->outputs); + } +} diff --git a/source/blender/nodes/intern/node_util.c b/source/blender/nodes/intern/node_util.c index 1cc8c282179..bdf53df06af 100644 --- a/source/blender/nodes/intern/node_util.c +++ b/source/blender/nodes/intern/node_util.c @@ -32,12 +32,24 @@ */ -#include "CMP_util.h" -#include "SHD_util.h" +#include "DNA_action_types.h" +#include "DNA_node_types.h" + +#include "BLI_listbase.h" +#include "BLI_utildefines.h" + +#include "BKE_colortools.h" +#include "BKE_node.h" #include "RNA_access.h" #include "RNA_enum_types.h" +#include "MEM_guardedalloc.h" + +#include "node_util.h" + +/**** Storage Data ****/ + void node_free_curves(bNode *node) { curvemapping_free(node->storage); @@ -58,6 +70,8 @@ void node_copy_standard_storage(bNode *orig_node, bNode *new_node) new_node->storage= MEM_dupallocN(orig_node->storage); } +/**** Labels ****/ + const char *node_blend_label(bNode *node) { const char *name; diff --git a/source/blender/nodes/intern/node_util.h b/source/blender/nodes/intern/node_util.h index 5a78fc07883..8d38d57f577 100644 --- a/source/blender/nodes/intern/node_util.h +++ b/source/blender/nodes/intern/node_util.h @@ -35,14 +35,27 @@ #ifndef NODE_UTIL_H_ #define NODE_UTIL_H_ +#include "DNA_listBase.h" + +#include "BKE_node.h" + #include "MEM_guardedalloc.h" +#include "NOD_socket.h" + +struct bNodeTree; +struct bNode; + +/**** Storage Data ****/ + extern void node_free_curves(struct bNode *node); extern void node_free_standard_storage(struct bNode *node); extern void node_copy_curves(struct bNode *orig_node, struct bNode *new_node); extern void node_copy_standard_storage(struct bNode *orig_node, struct bNode *new_node); +/**** Labels ****/ + const char *node_blend_label(struct bNode *node); const char *node_math_label(struct bNode *node); const char *node_vect_math_label(struct bNode *node); diff --git a/source/blender/nodes/shader/node_shader_tree.c b/source/blender/nodes/shader/node_shader_tree.c new file mode 100644 index 00000000000..620da7553b3 --- /dev/null +++ b/source/blender/nodes/shader/node_shader_tree.c @@ -0,0 +1,212 @@ +/** + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2007 Blender Foundation. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/nodes/shader/node_shader_tree.c + * \ingroup nodes + */ + + +#include + +#include "DNA_material_types.h" +#include "DNA_node_types.h" + +#include "BLI_listbase.h" +#include "BLI_math.h" +#include "BLI_threads.h" +#include "BLI_utildefines.h" + +#include "BKE_global.h" +#include "BKE_main.h" +#include "BKE_node.h" +#include "BKE_utildefines.h" + +#include "GPU_material.h" + +#include "RE_shader_ext.h" + +#include "node_exec.h" +#include "node_util.h" +#include "node_shader_util.h" + +static void foreach_nodetree(Main *main, void *calldata, bNodeTreeCallback func) +{ + Material *ma; + for(ma= main->mat.first; ma; ma= ma->id.next) { + if(ma->nodetree) { + func(calldata, &ma->id, ma->nodetree); + } + } +} + +static void local_sync(bNodeTree *localtree, bNodeTree *ntree) +{ + bNode *lnode; + + /* copy over contents of previews */ + for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) { + if(ntreeNodeExists(ntree, lnode->new_node)) { + bNode *node= lnode->new_node; + + if(node->preview && node->preview->rect) { + if(lnode->preview && lnode->preview->rect) { + int xsize= node->preview->xsize; + int ysize= node->preview->ysize; + memcpy(node->preview->rect, lnode->preview->rect, 4*xsize + xsize*ysize*sizeof(char)*4); + } + } + } + } +} + +bNodeTreeType ntreeType_Shader = { + /* type */ NTREE_SHADER, + /* id_name */ "NTShader Nodetree", + + /* node_types */ { NULL, NULL }, + + /* free_cache */ NULL, + /* free_node_cache */ NULL, + /* foreach_nodetree */ foreach_nodetree, + /* localize */ NULL, + /* local_sync */ local_sync, + /* local_merge */ NULL, + /* update */ NULL, + /* update_node */ NULL +}; + +/* GPU material from shader nodes */ + +void ntreeGPUMaterialNodes(bNodeTree *ntree, GPUMaterial *mat) +{ + bNodeTreeExec *exec; + + if(!ntree->execdata) + exec = ntreeShaderBeginExecTree(ntree); + + ntreeExecGPUNodes(exec, mat, 1); + + ntreeShaderEndExecTree(exec); +} + +/* **************** call to switch lamploop for material node ************ */ + +void (*node_shader_lamp_loop)(struct ShadeInput *, struct ShadeResult *); + +void set_node_shader_lamp_loop(void (*lamp_loop_func)(ShadeInput *, ShadeResult *)) +{ + node_shader_lamp_loop= lamp_loop_func; +} + + +bNodeTreeExec *ntreeShaderBeginExecTree(bNodeTree *ntree) +{ + bNodeTreeExec *exec; + bNode *node; + + /* XXX hack: prevent exec data from being generated twice. + * this should be handled by the renderer! + */ + if (ntree->execdata) + return ntree->execdata; + + /* ensures only a single output node is enabled */ + ntreeSetOutput(ntree); + + /* common base initialization */ + exec = ntree_exec_begin(ntree); + + /* allocate the thread stack listbase array */ + exec->threadstack= MEM_callocN(BLENDER_MAX_THREADS*sizeof(ListBase), "thread stack array"); + + for(node= exec->nodetree->nodes.first; node; node= node->next) + node->need_exec= 1; + + /* XXX this should not be necessary, but is still used for cmp/sha/tex nodes, + * which only store the ntree pointer. Should be fixed at some point! + */ + ntree->execdata = exec; + + return exec; +} + +void ntreeShaderEndExecTree(bNodeTreeExec *exec) +{ + if(exec) { + bNodeTree *ntree= exec->nodetree; + bNodeThreadStack *nts; + int a; + + if(exec->threadstack) { + for(a=0; athreadstack[a].first; nts; nts=nts->next) + if (nts->stack) MEM_freeN(nts->stack); + BLI_freelistN(&exec->threadstack[a]); + } + + MEM_freeN(exec->threadstack); + exec->threadstack= NULL; + } + + ntree_exec_end(exec); + + /* XXX clear nodetree backpointer to exec data, same problem as noted in ntreeBeginExecTree */ + ntree->execdata = NULL; + } +} + +void ntreeShaderExecTree(bNodeTree *ntree, ShadeInput *shi, ShadeResult *shr) +{ + ShaderCallData scd; + /* + @note: preserve material from ShadeInput for material id, nodetree execs change it + fix for bug "[#28012] Mat ID messy with shader nodes" + */ + Material *mat = shi->mat; bNodeThreadStack *nts = NULL; + bNodeTreeExec *exec = ntree->execdata; + + /* convert caller data to struct */ + scd.shi= shi; + scd.shr= shr; + + /* each material node has own local shaderesult, with optional copying */ + memset(shr, 0, sizeof(ShadeResult)); + + if (!exec) + exec = ntree->execdata = ntreeShaderBeginExecTree(exec->nodetree); + + nts= ntreeGetThreadStack(exec, shi->thread); + ntreeExecThreadNodes(exec, nts, &scd, shi->thread); + ntreeReleaseThreadStack(nts); + + // @note: set material back to preserved material + shi->mat = mat; + /* better not allow negative for now */ + if(shr->combined[0]<0.0f) shr->combined[0]= 0.0f; + if(shr->combined[1]<0.0f) shr->combined[1]= 0.0f; + if(shr->combined[2]<0.0f) shr->combined[2]= 0.0f; +} diff --git a/source/blender/nodes/shader/node_shader_util.c b/source/blender/nodes/shader/node_shader_util.c new file mode 100644 index 00000000000..cf910ba3f64 --- /dev/null +++ b/source/blender/nodes/shader/node_shader_util.c @@ -0,0 +1,287 @@ +/* + * $Id: SHD_util.c 36549 2011-05-08 14:23:38Z lukastoenne $ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2005 Blender Foundation. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/nodes/shader/node_shader_util.c + * \ingroup nodes + */ + + +#include "DNA_node_types.h" + +#include "node_shader_util.h" + +#include "node_exec.h" + +/* ****** */ + +void nodestack_get_vec(float *in, short type_in, bNodeStack *ns) +{ + float *from= ns->vec; + + if(type_in==SOCK_FLOAT) { + if(ns->sockettype==SOCK_FLOAT) + *in= *from; + else + *in= 0.333333f*(from[0]+from[1]+from[2]); + } + else if(type_in==SOCK_VECTOR) { + if(ns->sockettype==SOCK_FLOAT) { + in[0]= from[0]; + in[1]= from[0]; + in[2]= from[0]; + } + else { + VECCOPY(in, from); + } + } + else { /* type_in==SOCK_RGBA */ + if(ns->sockettype==SOCK_RGBA) { + QUATCOPY(in, from); + } + else if(ns->sockettype==SOCK_FLOAT) { + in[0]= from[0]; + in[1]= from[0]; + in[2]= from[0]; + in[3]= 1.0f; + } + else { + VECCOPY(in, from); + in[3]= 1.0f; + } + } +} + + +/* ******************* execute and parse ************ */ + +/* go over all used Geometry and Texture nodes, and return a texco flag */ +/* no group inside needed, this function is called for groups too */ +void ntreeShaderGetTexcoMode(bNodeTree *ntree, int r_mode, short *texco, int *mode) +{ + bNode *node; + bNodeSocket *sock; + int a; + + ntreeSocketUseFlags(ntree); + + for(node= ntree->nodes.first; node; node= node->next) { + if(node->type==SH_NODE_TEXTURE) { + if((r_mode & R_OSA) && node->id) { + Tex *tex= (Tex *)node->id; + if ELEM3(tex->type, TEX_IMAGE, TEX_PLUGIN, TEX_ENVMAP) + *texco |= TEXCO_OSA|NEED_UV; + } + /* usability exception... without input we still give the node orcos */ + sock= node->inputs.first; + if(sock==NULL || sock->link==NULL) + *texco |= TEXCO_ORCO|NEED_UV; + } + else if(node->type==SH_NODE_GEOMETRY) { + /* note; sockets always exist for the given type! */ + for(a=0, sock= node->outputs.first; sock; sock= sock->next, a++) { + if(sock->flag & SOCK_IN_USE) { + switch(a) { + case GEOM_OUT_GLOB: + *texco |= TEXCO_GLOB|NEED_UV; break; + case GEOM_OUT_VIEW: + *texco |= TEXCO_VIEW|NEED_UV; break; + case GEOM_OUT_ORCO: + *texco |= TEXCO_ORCO|NEED_UV; break; + case GEOM_OUT_UV: + *texco |= TEXCO_UV|NEED_UV; break; + case GEOM_OUT_NORMAL: + *texco |= TEXCO_NORM|NEED_UV; break; + case GEOM_OUT_VCOL: + *texco |= NEED_UV; *mode |= MA_VERTEXCOL; break; + } + } + } + } + } +} + +/* nodes that use ID data get synced with local data */ +void nodeShaderSynchronizeID(bNode *node, int copyto) +{ + if(node->id==NULL) return; + + if(ELEM(node->type, SH_NODE_MATERIAL, SH_NODE_MATERIAL_EXT)) { + bNodeSocket *sock; + Material *ma= (Material *)node->id; + int a; + + /* hrmf, case in loop isnt super fast, but we dont edit 100s of material at same time either! */ + for(a=0, sock= node->inputs.first; sock; sock= sock->next, a++) { + if(!(sock->flag & SOCK_HIDDEN)) { + if(copyto) { + switch(a) { + case MAT_IN_COLOR: + VECCOPY(&ma->r, ((bNodeSocketValueRGBA*)sock->default_value)->value); break; + case MAT_IN_SPEC: + VECCOPY(&ma->specr, ((bNodeSocketValueRGBA*)sock->default_value)->value); break; + case MAT_IN_REFL: + ma->ref= ((bNodeSocketValueFloat*)sock->default_value)->value; break; + case MAT_IN_MIR: + VECCOPY(&ma->mirr, ((bNodeSocketValueRGBA*)sock->default_value)->value); break; + case MAT_IN_AMB: + ma->amb= ((bNodeSocketValueFloat*)sock->default_value)->value; break; + case MAT_IN_EMIT: + ma->emit= ((bNodeSocketValueFloat*)sock->default_value)->value; break; + case MAT_IN_SPECTRA: + ma->spectra= ((bNodeSocketValueFloat*)sock->default_value)->value; break; + case MAT_IN_RAY_MIRROR: + ma->ray_mirror= ((bNodeSocketValueFloat*)sock->default_value)->value; break; + case MAT_IN_ALPHA: + ma->alpha= ((bNodeSocketValueFloat*)sock->default_value)->value; break; + case MAT_IN_TRANSLUCENCY: + ma->translucency= ((bNodeSocketValueFloat*)sock->default_value)->value; break; + } + } + else { + switch(a) { + case MAT_IN_COLOR: + VECCOPY(((bNodeSocketValueRGBA*)sock->default_value)->value, &ma->r); break; + case MAT_IN_SPEC: + VECCOPY(((bNodeSocketValueRGBA*)sock->default_value)->value, &ma->specr); break; + case MAT_IN_REFL: + ((bNodeSocketValueFloat*)sock->default_value)->value= ma->ref; break; + case MAT_IN_MIR: + VECCOPY(((bNodeSocketValueRGBA*)sock->default_value)->value, &ma->mirr); break; + case MAT_IN_AMB: + ((bNodeSocketValueFloat*)sock->default_value)->value= ma->amb; break; + case MAT_IN_EMIT: + ((bNodeSocketValueFloat*)sock->default_value)->value= ma->emit; break; + case MAT_IN_SPECTRA: + ((bNodeSocketValueFloat*)sock->default_value)->value= ma->spectra; break; + case MAT_IN_RAY_MIRROR: + ((bNodeSocketValueFloat*)sock->default_value)->value= ma->ray_mirror; break; + case MAT_IN_ALPHA: + ((bNodeSocketValueFloat*)sock->default_value)->value= ma->alpha; break; + case MAT_IN_TRANSLUCENCY: + ((bNodeSocketValueFloat*)sock->default_value)->value= ma->translucency; break; + } + } + } + } + } + +} + + +void node_gpu_stack_from_data(struct GPUNodeStack *gs, int type, bNodeStack *ns) +{ + memset(gs, 0, sizeof(*gs)); + + QUATCOPY(gs->vec, ns->vec); + gs->link= ns->data; + + if (type == SOCK_FLOAT) + gs->type= GPU_FLOAT; + else if (type == SOCK_VECTOR) + gs->type= GPU_VEC3; + else if (type == SOCK_RGBA) + gs->type= GPU_VEC4; + else + gs->type= GPU_NONE; + + gs->name = ""; + gs->hasinput= ns->hasinput && ns->data; + gs->hasoutput= ns->hasoutput && ns->data; + gs->sockettype= ns->sockettype; +} + +void node_data_from_gpu_stack(bNodeStack *ns, GPUNodeStack *gs) +{ + ns->data= gs->link; + ns->sockettype= gs->sockettype; +} + +static void gpu_stack_from_data_list(GPUNodeStack *gs, ListBase *sockets, bNodeStack **ns) +{ + bNodeSocket *sock; + int i; + + for (sock=sockets->first, i=0; sock; sock=sock->next, i++) + node_gpu_stack_from_data(&gs[i], sock->type, ns[i]); + + gs[i].type= GPU_NONE; +} + +static void data_from_gpu_stack_list(ListBase *sockets, bNodeStack **ns, GPUNodeStack *gs) +{ + bNodeSocket *sock; + int i; + + for (sock=sockets->first, i=0; sock; sock=sock->next, i++) + node_data_from_gpu_stack(ns[i], &gs[i]); +} + +void ntreeExecGPUNodes(bNodeTreeExec *exec, GPUMaterial *mat, int do_outputs) +{ + bNodeExec *nodeexec; + bNode *node; + int n; + bNodeStack *stack; + bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */ + bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */ + GPUNodeStack gpuin[MAX_SOCKET+1], gpuout[MAX_SOCKET+1]; + int doit; + + stack= exec->stack; + + for(n=0, nodeexec= exec->nodeexec; n < exec->totnodes; ++n, ++nodeexec) { + node = nodeexec->node; + + doit = 0; + /* for groups, only execute outputs for edited group */ + if(node->typeinfo->nclass==NODE_CLASS_OUTPUT) { + if(do_outputs && (node->flag & NODE_DO_OUTPUT)) + doit = 1; + } + else + doit = 1; + + if (doit) { + if(node->typeinfo->gpufunc) { + node_get_stack(node, stack, nsin, nsout); + gpu_stack_from_data_list(gpuin, &node->inputs, nsin); + gpu_stack_from_data_list(gpuout, &node->outputs, nsout); + if(node->typeinfo->gpufunc(mat, node, gpuin, gpuout)) + data_from_gpu_stack_list(&node->outputs, nsout, gpuout); + } + else if(node->typeinfo->gpuextfunc) { + node_get_stack(node, stack, nsin, nsout); + gpu_stack_from_data_list(gpuin, &node->inputs, nsin); + gpu_stack_from_data_list(gpuout, &node->outputs, nsout); + if(node->typeinfo->gpuextfunc(mat, node, nodeexec->data, gpuin, gpuout)) + data_from_gpu_stack_list(&node->outputs, nsout, gpuout); + } + } + } +} diff --git a/source/blender/nodes/intern/SHD_util.h b/source/blender/nodes/shader/node_shader_util.h similarity index 86% rename from source/blender/nodes/intern/SHD_util.h rename to source/blender/nodes/shader/node_shader_util.h index e6b1377067d..1cc04d95d6f 100644 --- a/source/blender/nodes/intern/SHD_util.h +++ b/source/blender/nodes/shader/node_shader_util.h @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: SHD_util.h 36549 2011-05-08 14:23:38Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,13 +27,13 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/SHD_util.h +/** \file blender/nodes/shader/node_shader_util.h * \ingroup nodes */ -#ifndef SHD_NODE_UTIL_H_ -#define SHD_NODE_UTIL_H_ +#ifndef NODE_SHADER_UTIL_H_ +#define NODE_SHADER_UTIL_H_ #include #include @@ -61,7 +61,7 @@ #include "BKE_library.h" -#include "../SHD_node.h" +#include "NOD_shader.h" #include "node_util.h" #include "BLI_math.h" @@ -122,4 +122,9 @@ typedef struct ShaderCallData { extern void node_ID_title_cb(void *node_v, void *unused_v); void nodestack_get_vec(float *in, short type_in, bNodeStack *ns); +void node_gpu_stack_from_data(struct GPUNodeStack *gs, int type, struct bNodeStack *ns); +void node_data_from_gpu_stack(struct bNodeStack *ns, struct GPUNodeStack *gs); + +void ntreeExecGPUNodes(struct bNodeTreeExec *exec, struct GPUMaterial *mat, int do_outputs); + #endif diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_camera.c b/source/blender/nodes/shader/nodes/node_shader_camera.c similarity index 80% rename from source/blender/nodes/intern/SHD_nodes/SHD_camera.c rename to source/blender/nodes/shader/nodes/node_shader_camera.c index eea572bf271..ecb7c486dc4 100644 --- a/source/blender/nodes/intern/SHD_nodes/SHD_camera.c +++ b/source/blender/nodes/shader/nodes/node_shader_camera.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: SHD_camera.c 36536 2011-05-07 13:27:27Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,18 +27,18 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/SHD_nodes/SHD_camera.c +/** \file blender/nodes/shader/nodes/node_shader_camera.c * \ingroup shdnodes */ -#include "../SHD_util.h" +#include "node_shader_util.h" /* **************** CAMERA INFO ******************** */ -static bNodeSocketType sh_node_camera_out[]= { - { SOCK_VECTOR, 0, "View Vector", 1.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f}, /* None of these actually */ - { SOCK_VALUE, 0, "View Z Depth", 0.f, 0.0f, 0.0f, 0.0f, 0.0f, 99999999999.0f}, /* have any limits on their */ - { SOCK_VALUE, 0, "View Distance", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 99999999999.0f}, /* values. */ +static bNodeSocketTemplate sh_node_camera_out[]= { + { SOCK_VECTOR, 0, "View Vector"}, + { SOCK_FLOAT, 0, "View Z Depth"}, + { SOCK_FLOAT, 0, "View Distance"}, { -1, 0, "" } }; @@ -63,8 +63,8 @@ void register_node_type_sh_camera(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, SH_NODE_CAMERA, "Camera Data", NODE_CLASS_INPUT, 0, - NULL, sh_node_camera_out); + node_type_base(&ntype, SH_NODE_CAMERA, "Camera Data", NODE_CLASS_INPUT, 0); + node_type_socket_templates(&ntype, NULL, sh_node_camera_out); node_type_size(&ntype, 95, 95, 120); node_type_storage(&ntype, "node_camera", NULL, NULL); node_type_exec(&ntype, node_shader_exec_camera); diff --git a/source/blender/nodes/shader/nodes/node_shader_common.c b/source/blender/nodes/shader/nodes/node_shader_common.c new file mode 100644 index 00000000000..ab3638436f1 --- /dev/null +++ b/source/blender/nodes/shader/nodes/node_shader_common.c @@ -0,0 +1,327 @@ +/* + * $Id: CMP_blur.c 35562 2011-03-15 20:10:32Z lukastoenne $ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2006 Blender Foundation. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): Campbell Barton, Alfredo de Greef, David Millan Escriva, + * Juho Vepsäläinen + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/nodes/shader/nodes/node_shader_common.c + * \ingroup shdnodes + */ + + +#include "DNA_node_types.h" + +#include "BKE_node.h" + +#include "node_shader_util.h" +#include "node_common.h" +#include "node_exec.h" + +static void copy_stack(bNodeStack *to, bNodeStack *from) +{ + if (to != from) { + copy_v4_v4(to->vec, from->vec); + to->data = from->data; + to->datatype = from->datatype; + + /* tag as copy to prevent freeing */ + to->is_copy = 1; + } +} + +static void move_stack(bNodeStack *to, bNodeStack *from) +{ + if (to != from) { + copy_v4_v4(to->vec, from->vec); + to->data = from->data; + to->datatype = from->datatype; + to->is_copy = from->is_copy; + + zero_v4(from->vec); + from->data = NULL; + from->datatype = 0; + from->is_copy = 0; + } +} + +/**** GROUP ****/ + +static void *group_initexec(bNode *node) +{ + bNodeTree *ngroup= (bNodeTree*)node->id; + bNodeTreeExec *exec; + + /* initialize the internal node tree execution */ + exec = ntreeShaderBeginExecTree(ngroup); + + return exec; +} + +static void group_freeexec(bNode *UNUSED(node), void *nodedata) +{ + bNodeTreeExec*gexec= (bNodeTreeExec*)nodedata; + + ntreeShaderEndExecTree(gexec); +} + +/* Copy inputs to the internal stack. + */ +static void group_copy_inputs(bNode *node, bNodeStack **in, bNodeStack *gstack) +{ + bNodeSocket *sock; + bNodeStack *ns; + int a; + for (sock=node->inputs.first, a=0; sock; sock=sock->next, ++a) { + if (sock->groupsock) { + ns = node_get_socket_stack(gstack, sock->groupsock); + copy_stack(ns, in[a]); + } + } +} + +/* Copy internal results to the external outputs. + */ +static void group_move_outputs(bNode *node, bNodeStack **out, bNodeStack *gstack) +{ + bNodeSocket *sock; + bNodeStack *ns; + int a; + for (sock=node->outputs.first, a=0; sock; sock=sock->next, ++a) { + if (sock->groupsock) { + ns = node_get_socket_stack(gstack, sock->groupsock); + move_stack(out[a], ns); + } + } +} + +static void group_execute(void *data, int thread, struct bNode *node, void *nodedata, struct bNodeStack **in, struct bNodeStack **out) +{ + bNodeTreeExec *exec= (bNodeTreeExec*)nodedata; + bNodeThreadStack *nts; + + /* XXX same behavior as trunk: all nodes inside group are executed. + * it's stupid, but just makes it work. compo redesign will do this better. + */ + { + bNode *inode; + for (inode=exec->nodetree->nodes.first; inode; inode=inode->next) + inode->need_exec = 1; + } + + nts = ntreeGetThreadStack(exec, thread); + + group_copy_inputs(node, in, nts->stack); + ntreeExecThreadNodes(exec, nts, data, thread); + group_move_outputs(node, out, nts->stack); + + ntreeReleaseThreadStack(nts); +} + +static void group_gpu_copy_inputs(bNode *node, GPUNodeStack *in, bNodeStack *gstack) +{ + bNodeSocket *sock; + bNodeStack *ns; + int a; + for (sock=node->inputs.first, a=0; sock; sock=sock->next, ++a) { + if (sock->groupsock) { + ns = node_get_socket_stack(gstack, sock->groupsock); + /* convert the external gpu stack back to internal node stack data */ + node_data_from_gpu_stack(ns, &in[a]); + } + } +} + +/* Copy internal results to the external outputs. + */ +static void group_gpu_move_outputs(bNode *node, GPUNodeStack *out, bNodeStack *gstack) +{ + bNodeSocket *sock; + bNodeStack *ns; + int a; + for (sock=node->outputs.first, a=0; sock; sock=sock->next, ++a) { + if (sock->groupsock) { + ns = node_get_socket_stack(gstack, sock->groupsock); + /* convert the node stack data result back to gpu stack */ + node_gpu_stack_from_data(&out[a], sock->type, ns); + } + } +} + +static int gpu_group_execute(GPUMaterial *mat, bNode *node, void *nodedata, GPUNodeStack *in, GPUNodeStack *out) +{ + bNodeTreeExec *exec= (bNodeTreeExec*)nodedata; + + group_gpu_copy_inputs(node, in, exec->stack); + ntreeExecGPUNodes(exec, mat, (node->flag & NODE_GROUP_EDIT)); + group_gpu_move_outputs(node, out, exec->stack); + + return 1; +} + +void register_node_type_sh_group(ListBase *lb) +{ + static bNodeType ntype; + + node_type_base(&ntype, NODE_GROUP, "Group", NODE_CLASS_GROUP, NODE_OPTIONS|NODE_CONST_OUTPUT); + node_type_socket_templates(&ntype, NULL, NULL); + node_type_size(&ntype, 120, 60, 200); + node_type_label(&ntype, node_group_label); + node_type_init(&ntype, node_group_init); + node_type_valid(&ntype, node_group_valid); + node_type_template(&ntype, node_group_template); + node_type_update(&ntype, NULL, node_group_verify); + node_type_group_edit(&ntype, node_group_edit_get, node_group_edit_set, node_group_edit_clear); + node_type_exec_new(&ntype, group_initexec, group_freeexec, group_execute); + node_type_gpu_ext(&ntype, gpu_group_execute); + + nodeRegisterType(lb, &ntype); +} + + +/**** FOR LOOP ****/ + +#if 0 /* XXX loop nodes don't work nicely with current trees */ +static void forloop_execute(void *data, int thread, struct bNode *node, void *nodedata, struct bNodeStack **in, struct bNodeStack **out) +{ + bNodeTreeExec *exec= (bNodeTreeExec*)nodedata; + bNodeThreadStack *nts; + int iterations= (int)in[0]->vec[0]; + bNodeSocket *sock; + bNodeStack *ns; + int iteration; + + /* XXX same behavior as trunk: all nodes inside group are executed. + * it's stupid, but just makes it work. compo redesign will do this better. + */ + { + bNode *inode; + for (inode=exec->nodetree->nodes.first; inode; inode=inode->next) + inode->need_exec = 1; + } + + nts = ntreeGetThreadStack(exec, thread); + + /* "Iteration" socket */ + sock = exec->nodetree->inputs.first; + ns = node_get_socket_stack(nts->stack, sock); + +// group_copy_inputs(node, in, nts->stack); + for (iteration=0; iteration < iterations; ++iteration) { + /* first input contains current iteration counter */ + ns->vec[0] = (float)iteration; + ns->vec[1]=ns->vec[2]=ns->vec[3] = 0.0f; + +// if (iteration > 0) +// loop_init_iteration(exec->nodetree, nts->stack); +// ntreeExecThreadNodes(exec, nts, data, thread); + } +// loop_copy_outputs(node, in, out, exec->stack); + + ntreeReleaseThreadStack(nts); +} + +void register_node_type_sh_forloop(ListBase *lb) +{ + static bNodeType ntype; + + node_type_base(&ntype, NODE_FORLOOP, "For", NODE_CLASS_GROUP, NODE_OPTIONS); + node_type_socket_templates(&ntype, NULL, NULL); + node_type_size(&ntype, 120, 60, 200); + node_type_label(&ntype, node_group_label); + node_type_init(&ntype, node_forloop_init); + node_type_valid(&ntype, node_group_valid); + node_type_template(&ntype, node_forloop_template); + node_type_update(&ntype, NULL, node_group_verify); + node_type_tree(&ntype, node_forloop_init_tree, node_loop_update_tree); + node_type_group_edit(&ntype, node_group_edit_get, node_group_edit_set, node_group_edit_clear); + node_type_exec_new(&ntype, group_initexec, group_freeexec, forloop_execute); + + nodeRegisterType(lb, &ntype); +} +#endif + +/**** WHILE LOOP ****/ + +#if 0 /* XXX loop nodes don't work nicely with current trees */ +static void whileloop_execute(void *data, int thread, struct bNode *node, void *nodedata, struct bNodeStack **in, struct bNodeStack **out) +{ + bNodeTreeExec *exec= (bNodeTreeExec*)nodedata; + bNodeThreadStack *nts; + int condition= (in[0]->vec[0] > 0.0f); + bNodeSocket *sock; + bNodeStack *ns; + int iteration; + + /* XXX same behavior as trunk: all nodes inside group are executed. + * it's stupid, but just makes it work. compo redesign will do this better. + */ + { + bNode *inode; + for (inode=exec->nodetree->nodes.first; inode; inode=inode->next) + inode->need_exec = 1; + } + + nts = ntreeGetThreadStack(exec, thread); + + /* "Condition" socket */ + sock = exec->nodetree->outputs.first; + ns = node_get_socket_stack(nts->stack, sock); + + iteration = 0; +// group_copy_inputs(node, in, nts->stack); + while (condition && iteration < node->custom1) { +// if (iteration > 0) +// loop_init_iteration(exec->nodetree, nts->stack); +// ntreeExecThreadNodes(exec, nts, data, thread); + + condition = (ns->vec[0] > 0.0f); + ++iteration; + } +// loop_copy_outputs(node, in, out, exec->stack); + + ntreeReleaseThreadStack(nts); +} + +void register_node_type_sh_whileloop(ListBase *lb) +{ + static bNodeType ntype; + + node_type_base(&ntype, NODE_WHILELOOP, "While", NODE_CLASS_GROUP, NODE_OPTIONS); + node_type_socket_templates(&ntype, NULL, NULL); + node_type_size(&ntype, 120, 60, 200); + node_type_label(&ntype, node_group_label); + node_type_init(&ntype, node_whileloop_init); + node_type_valid(&ntype, node_group_valid); + node_type_template(&ntype, node_whileloop_template); + node_type_update(&ntype, NULL, node_group_verify); + node_type_tree(&ntype, node_whileloop_init_tree, node_loop_update_tree); + node_type_group_edit(&ntype, node_group_edit_get, node_group_edit_set, node_group_edit_clear); + node_type_exec_new(&ntype, group_initexec, group_freeexec, whileloop_execute); + + nodeRegisterType(lb, &ntype); +} +#endif diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_curves.c b/source/blender/nodes/shader/nodes/node_shader_curves.c similarity index 76% rename from source/blender/nodes/intern/SHD_nodes/SHD_curves.c rename to source/blender/nodes/shader/nodes/node_shader_curves.c index a39a639897e..ded867ec441 100644 --- a/source/blender/nodes/intern/SHD_nodes/SHD_curves.c +++ b/source/blender/nodes/shader/nodes/node_shader_curves.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: SHD_curves.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,23 +27,23 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/SHD_nodes/SHD_curves.c +/** \file blender/nodes/shader/nodes/node_shader_curves.c * \ingroup shdnodes */ -#include "../SHD_util.h" +#include "node_shader_util.h" /* **************** CURVE VEC ******************** */ -static bNodeSocketType sh_node_curve_vec_in[]= { - { SOCK_VALUE, 0, "Fac", 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VECTOR, 1, "Vector", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f}, +static bNodeSocketTemplate sh_node_curve_vec_in[]= { + { SOCK_FLOAT, 0, "Fac", 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR}, + { SOCK_VECTOR, 1, "Vector", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_NONE}, { -1, 0, "" } }; -static bNodeSocketType sh_node_curve_vec_out[]= { - { SOCK_VECTOR, 0, "Vector", 0.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f}, +static bNodeSocketTemplate sh_node_curve_vec_out[]= { + { SOCK_VECTOR, 0, "Vector"}, { -1, 0, "" } }; @@ -57,7 +57,7 @@ static void node_shader_exec_curve_vec(void *UNUSED(data), bNode *node, bNodeSta curvemapping_evaluate3F(node->storage, out[0]->vec, vec); } -static void node_shader_init_curve_vec(bNode* node) +static void node_shader_init_curve_vec(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { node->storage= curvemapping_add(3, -1.0f, -1.0f, 1.0f, 1.0f); } @@ -75,8 +75,8 @@ void register_node_type_sh_curve_vec(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, SH_NODE_CURVE_VEC, "Vector Curves", NODE_CLASS_OP_VECTOR, NODE_OPTIONS, - sh_node_curve_vec_in, sh_node_curve_vec_out); + node_type_base(&ntype, SH_NODE_CURVE_VEC, "Vector Curves", NODE_CLASS_OP_VECTOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, sh_node_curve_vec_in, sh_node_curve_vec_out); node_type_size(&ntype, 200, 140, 320); node_type_init(&ntype, node_shader_init_curve_vec); node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves); @@ -88,14 +88,14 @@ void register_node_type_sh_curve_vec(ListBase *lb) /* **************** CURVE RGB ******************** */ -static bNodeSocketType sh_node_curve_rgb_in[]= { - { SOCK_VALUE, 1, "Fac", 1.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f}, - { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f}, +static bNodeSocketTemplate sh_node_curve_rgb_in[]= { + { SOCK_FLOAT, 1, "Fac", 1.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_FACTOR}, + { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f}, { -1, 0, "" } }; -static bNodeSocketType sh_node_curve_rgb_out[]= { - { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f}, +static bNodeSocketTemplate sh_node_curve_rgb_out[]= { + { SOCK_RGBA, 0, "Color"}, { -1, 0, "" } }; @@ -112,7 +112,7 @@ static void node_shader_exec_curve_rgb(void *UNUSED(data), bNode *node, bNodeSta } } -static void node_shader_init_curve_rgb(bNode *node) +static void node_shader_init_curve_rgb(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { node->storage= curvemapping_add(4, 0.0f, 0.0f, 1.0f, 1.0f); } @@ -129,8 +129,8 @@ void register_node_type_sh_curve_rgb(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, SH_NODE_CURVE_RGB, "RGB Curves", NODE_CLASS_OP_COLOR, NODE_OPTIONS, - sh_node_curve_rgb_in, sh_node_curve_rgb_out); + node_type_base(&ntype, SH_NODE_CURVE_RGB, "RGB Curves", NODE_CLASS_OP_COLOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, sh_node_curve_rgb_in, sh_node_curve_rgb_out); node_type_size(&ntype, 200, 140, 320); node_type_init(&ntype, node_shader_init_curve_rgb); node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves); diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c b/source/blender/nodes/shader/nodes/node_shader_dynamic.c similarity index 99% rename from source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c rename to source/blender/nodes/shader/nodes/node_shader_dynamic.c index d5e5d5eeb93..6490ee00787 100644 --- a/source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c +++ b/source/blender/nodes/shader/nodes/node_shader_dynamic.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: SHD_dynamic.c 35927 2011-03-31 20:59:55Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,7 +27,7 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/SHD_nodes/SHD_dynamic.c +/** \file blender/nodes/shader/nodes/node_shader_dynamic.c * \ingroup shdnodes */ @@ -54,7 +54,7 @@ #endif #endif -#include "../SHD_util.h" +#include "node_shader_util.h" // XXX #if 0 @@ -95,7 +95,7 @@ static bNodeType *node_dynamic_find_typeinfo(ListBase *list, ID *id) static void node_dynamic_free_typeinfo_sockets(bNodeType *tinfo) { - bNodeSocketType *sock; + bNodeSocketTemplate *sock; if (!tinfo) return; @@ -782,7 +782,7 @@ void register_node_type_sh_dynamic(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, NODE_DYNAMIC, "Dynamic", NODE_CLASS_OP_DYNAMIC, 0, NULL, NULL); + node_type_base(&ntype, NODE_DYNAMIC, "Dynamic", NODE_CLASS_OP_DYNAMIC, 0); nodeRegisterType(lb, &ntype); } diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_geom.c b/source/blender/nodes/shader/nodes/node_shader_geom.c similarity index 84% rename from source/blender/nodes/intern/SHD_nodes/SHD_geom.c rename to source/blender/nodes/shader/nodes/node_shader_geom.c index 379f54bec57..b88c5979b54 100644 --- a/source/blender/nodes/intern/SHD_nodes/SHD_geom.c +++ b/source/blender/nodes/shader/nodes/node_shader_geom.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: SHD_geom.c 36536 2011-05-07 13:27:27Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,27 +27,27 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/SHD_nodes/SHD_geom.c +/** \file blender/nodes/shader/nodes/node_shader_geom.c * \ingroup shdnodes */ -#include "../SHD_util.h" +#include "node_shader_util.h" #include "DNA_customdata_types.h" /* **************** GEOMETRY ******************** */ /* output socket type definition */ -static bNodeSocketType sh_node_geom_out[]= { - { SOCK_VECTOR, 0, "Global", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f}, /* btw; uses no limit */ - { SOCK_VECTOR, 0, "Local", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f}, - { SOCK_VECTOR, 0, "View", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f}, - { SOCK_VECTOR, 0, "Orco", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f}, - { SOCK_VECTOR, 0, "UV", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f}, - { SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f}, - { SOCK_RGBA, 0, "Vertex Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 0, "Front/Back", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate sh_node_geom_out[]= { + { SOCK_VECTOR, 0, "Global"}, + { SOCK_VECTOR, 0, "Local"}, + { SOCK_VECTOR, 0, "View"}, + { SOCK_VECTOR, 0, "Orco"}, + { SOCK_VECTOR, 0, "UV"}, + { SOCK_VECTOR, 0, "Normal"}, + { SOCK_RGBA, 0, "Vertex Color"}, + { SOCK_FLOAT, 0, "Front/Back"}, { -1, 0, "" } }; @@ -118,7 +118,7 @@ static void node_shader_exec_geom(void *data, bNode *node, bNodeStack **UNUSED(i } } -static void node_shader_init_geometry(bNode *node) +static void node_shader_init_geometry(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { node->storage= MEM_callocN(sizeof(NodeGeometry), "NodeGeometry"); } @@ -140,8 +140,8 @@ void register_node_type_sh_geom(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, SH_NODE_GEOMETRY, "Geometry", NODE_CLASS_INPUT, NODE_OPTIONS, - NULL, sh_node_geom_out); + node_type_base(&ntype, SH_NODE_GEOMETRY, "Geometry", NODE_CLASS_INPUT, NODE_OPTIONS); + node_type_socket_templates(&ntype, NULL, sh_node_geom_out); node_type_size(&ntype, 120, 80, 160); node_type_init(&ntype, node_shader_init_geometry); node_type_storage(&ntype, "NodeGeometry", node_free_standard_storage, node_copy_standard_storage); diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_hueSatVal.c b/source/blender/nodes/shader/nodes/node_shader_hueSatVal.c similarity index 77% rename from source/blender/nodes/intern/SHD_nodes/SHD_hueSatVal.c rename to source/blender/nodes/shader/nodes/node_shader_hueSatVal.c index 91fd995dbbe..ef1434b82ca 100644 --- a/source/blender/nodes/intern/SHD_nodes/SHD_hueSatVal.c +++ b/source/blender/nodes/shader/nodes/node_shader_hueSatVal.c @@ -27,25 +27,25 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/SHD_nodes/SHD_hueSatVal.c +/** \file blender/nodes/shader/nodes/node_shader_hueSatVal.c * \ingroup shdnodes */ -#include "../SHD_util.h" +#include "node_shader_util.h" /* **************** Hue Saturation ******************** */ -static bNodeSocketType sh_node_hue_sat_in[]= { - { SOCK_VALUE, 1, "Hue", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "Saturation", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f}, - { SOCK_VALUE, 1, "Value", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f}, - { SOCK_VALUE, 1, "Fac", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, - { SOCK_RGBA, 1, "Color", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate sh_node_hue_sat_in[]= { + { SOCK_FLOAT, 1, "Hue", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE}, + { SOCK_FLOAT, 1, "Saturation", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f, PROP_FACTOR}, + { SOCK_FLOAT, 1, "Value", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f, PROP_FACTOR}, + { SOCK_FLOAT, 1, "Fac", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR}, + { SOCK_RGBA, 1, "Color", 0.8f, 0.8f, 0.8f, 1.0f}, { -1, 0, "" } }; -static bNodeSocketType sh_node_hue_sat_out[]= { - { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate sh_node_hue_sat_out[]= { + { SOCK_RGBA, 0, "Color"}, { -1, 0, "" } }; @@ -86,8 +86,8 @@ void register_node_type_sh_hue_sat(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, SH_NODE_HUE_SAT, "Hue Saturation Value", NODE_CLASS_OP_COLOR, NODE_OPTIONS, - sh_node_hue_sat_in, sh_node_hue_sat_out); + node_type_base(&ntype, SH_NODE_HUE_SAT, "Hue Saturation Value", NODE_CLASS_OP_COLOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, sh_node_hue_sat_in, sh_node_hue_sat_out); node_type_size(&ntype, 150, 80, 250); node_type_exec(&ntype, node_shader_exec_hue_sat); node_type_gpu(&ntype, gpu_shader_hue_sat); diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_invert.c b/source/blender/nodes/shader/nodes/node_shader_invert.c similarity index 80% rename from source/blender/nodes/intern/SHD_nodes/SHD_invert.c rename to source/blender/nodes/shader/nodes/node_shader_invert.c index f8d6e54859e..bd7e571f073 100644 --- a/source/blender/nodes/intern/SHD_nodes/SHD_invert.c +++ b/source/blender/nodes/shader/nodes/node_shader_invert.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: SHD_invert.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,24 +27,24 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/SHD_nodes/SHD_invert.c +/** \file blender/nodes/shader/nodes/node_shader_invert.c * \ingroup shdnodes */ -#include "../SHD_util.h" +#include "node_shader_util.h" /* **************** INVERT ******************** */ -static bNodeSocketType sh_node_invert_in[]= { - { SOCK_VALUE, 1, "Fac", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, - { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate sh_node_invert_in[]= { + { SOCK_FLOAT, 1, "Fac", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR}, + { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f}, { -1, 0, "" } }; -static bNodeSocketType sh_node_invert_out[]= { - { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate sh_node_invert_out[]= { + { SOCK_RGBA, 0, "Color"}, { -1, 0, "" } }; @@ -78,8 +78,8 @@ void register_node_type_sh_invert(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, SH_NODE_INVERT, "Invert", NODE_CLASS_OP_COLOR, NODE_OPTIONS, - sh_node_invert_in, sh_node_invert_out); + node_type_base(&ntype, SH_NODE_INVERT, "Invert", NODE_CLASS_OP_COLOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, sh_node_invert_in, sh_node_invert_out); node_type_size(&ntype, 90, 80, 100); node_type_exec(&ntype, node_shader_exec_invert); node_type_gpu(&ntype, gpu_shader_invert); diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_mapping.c b/source/blender/nodes/shader/nodes/node_shader_mapping.c similarity index 85% rename from source/blender/nodes/intern/SHD_nodes/SHD_mapping.c rename to source/blender/nodes/shader/nodes/node_shader_mapping.c index eb300301ce2..21cea4853ad 100644 --- a/source/blender/nodes/intern/SHD_nodes/SHD_mapping.c +++ b/source/blender/nodes/shader/nodes/node_shader_mapping.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: SHD_mapping.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,21 +27,21 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/SHD_nodes/SHD_mapping.c +/** \file blender/nodes/shader/nodes/node_shader_mapping.c * \ingroup shdnodes */ -#include "../SHD_util.h" +#include "node_shader_util.h" /* **************** MAPPING ******************** */ -static bNodeSocketType sh_node_mapping_in[]= { - { SOCK_VECTOR, 1, "Vector", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f}, +static bNodeSocketTemplate sh_node_mapping_in[]= { + { SOCK_VECTOR, 1, "Vector", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_NONE}, { -1, 0, "" } }; -static bNodeSocketType sh_node_mapping_out[]= { - { SOCK_VECTOR, 0, "Vector", 0.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f}, +static bNodeSocketTemplate sh_node_mapping_out[]= { + { SOCK_VECTOR, 0, "Vector"}, { -1, 0, "" } }; @@ -69,7 +69,7 @@ static void node_shader_exec_mapping(void *UNUSED(data), bNode *node, bNodeStack } -static void node_shader_init_mapping(bNode *node) +static void node_shader_init_mapping(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { node->storage= add_mapping(); } @@ -92,8 +92,8 @@ void register_node_type_sh_mapping(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, SH_NODE_MAPPING, "Mapping", NODE_CLASS_OP_VECTOR, NODE_OPTIONS, - sh_node_mapping_in, sh_node_mapping_out); + node_type_base(&ntype, SH_NODE_MAPPING, "Mapping", NODE_CLASS_OP_VECTOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, sh_node_mapping_in, sh_node_mapping_out); node_type_size(&ntype, 240, 160, 320); node_type_init(&ntype, node_shader_init_mapping); node_type_storage(&ntype, "TexMapping", node_free_standard_storage, node_copy_standard_storage); diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_material.c b/source/blender/nodes/shader/nodes/node_shader_material.c similarity index 77% rename from source/blender/nodes/intern/SHD_nodes/SHD_material.c rename to source/blender/nodes/shader/nodes/node_shader_material.c index f78dd9ec727..a0bfd430506 100644 --- a/source/blender/nodes/intern/SHD_nodes/SHD_material.c +++ b/source/blender/nodes/shader/nodes/node_shader_material.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: SHD_material.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,54 +27,54 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/SHD_nodes/SHD_material.c +/** \file blender/nodes/shader/nodes/node_shader_material.c * \ingroup shdnodes */ -#include "../SHD_util.h" +#include "node_shader_util.h" /* **************** MATERIAL ******************** */ -static bNodeSocketType sh_node_material_in[]= { - { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_RGBA, 1, "Spec", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "Refl", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VECTOR, 1, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f}, +static bNodeSocketTemplate sh_node_material_in[]= { + { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_RGBA, 1, "Spec", 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_FLOAT, 1, "Refl", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR}, + { SOCK_VECTOR, 1, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_DIRECTION}, { -1, 0, "" } }; -static bNodeSocketType sh_node_material_out[]= { - { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 0, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, - { SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f}, +static bNodeSocketTemplate sh_node_material_out[]= { + { SOCK_RGBA, 0, "Color"}, + { SOCK_FLOAT, 0, "Alpha"}, + { SOCK_VECTOR, 0, "Normal"}, { -1, 0, "" } }; /* **************** EXTENDED MATERIAL ******************** */ -static bNodeSocketType sh_node_material_ext_in[]= { - { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_RGBA, 1, "Spec", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "Refl", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VECTOR, 1, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f}, - { SOCK_RGBA, 1, "Mirror", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "Ambient", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "Emit", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "SpecTra", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "Ray Mirror", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "Alpha", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "Translucency", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate sh_node_material_ext_in[]= { + { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_RGBA, 1, "Spec", 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_FLOAT, 1, "Refl", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR}, + { SOCK_VECTOR, 1, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_DIRECTION}, + { SOCK_RGBA, 1, "Mirror", 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_FLOAT, 1, "Ambient", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR}, + { SOCK_FLOAT, 1, "Emit", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_UNSIGNED}, + { SOCK_FLOAT, 1, "SpecTra", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR}, + { SOCK_FLOAT, 1, "Ray Mirror", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR}, + { SOCK_FLOAT, 1, "Alpha", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_UNSIGNED}, + { SOCK_FLOAT, 1, "Translucency", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR}, { -1, 0, "" } }; -static bNodeSocketType sh_node_material_ext_out[]= { - { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 0, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, - { SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f}, - { SOCK_RGBA, 0, "Diffuse", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_RGBA, 0, "Spec", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_RGBA, 0, "AO", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate sh_node_material_ext_out[]= { + { SOCK_RGBA, 0, "Color"}, + { SOCK_FLOAT, 0, "Alpha"}, + { SOCK_VECTOR, 0, "Normal"}, + { SOCK_RGBA, 0, "Diffuse"}, + { SOCK_RGBA, 0, "Spec"}, + { SOCK_RGBA, 0, "AO"}, { -1, 0, "" } }; @@ -112,7 +112,7 @@ static void node_shader_exec_material(void *data, bNode *node, bNodeStack **in, nodestack_get_vec(&shi->specr, SOCK_VECTOR, in[MAT_IN_SPEC]); if(hasinput[MAT_IN_REFL]) - nodestack_get_vec(&shi->refl, SOCK_VALUE, in[MAT_IN_REFL]); + nodestack_get_vec(&shi->refl, SOCK_FLOAT, in[MAT_IN_REFL]); /* retrieve normal */ if(hasinput[MAT_IN_NORMAL]) { @@ -133,17 +133,17 @@ static void node_shader_exec_material(void *data, bNode *node, bNodeStack **in, if(hasinput[MAT_IN_MIR]) nodestack_get_vec(&shi->mirr, SOCK_VECTOR, in[MAT_IN_MIR]); if(hasinput[MAT_IN_AMB]) - nodestack_get_vec(&shi->amb, SOCK_VALUE, in[MAT_IN_AMB]); + nodestack_get_vec(&shi->amb, SOCK_FLOAT, in[MAT_IN_AMB]); if(hasinput[MAT_IN_EMIT]) - nodestack_get_vec(&shi->emit, SOCK_VALUE, in[MAT_IN_EMIT]); + nodestack_get_vec(&shi->emit, SOCK_FLOAT, in[MAT_IN_EMIT]); if(hasinput[MAT_IN_SPECTRA]) - nodestack_get_vec(&shi->spectra, SOCK_VALUE, in[MAT_IN_SPECTRA]); + nodestack_get_vec(&shi->spectra, SOCK_FLOAT, in[MAT_IN_SPECTRA]); if(hasinput[MAT_IN_RAY_MIRROR]) - nodestack_get_vec(&shi->ray_mirror, SOCK_VALUE, in[MAT_IN_RAY_MIRROR]); + nodestack_get_vec(&shi->ray_mirror, SOCK_FLOAT, in[MAT_IN_RAY_MIRROR]); if(hasinput[MAT_IN_ALPHA]) - nodestack_get_vec(&shi->alpha, SOCK_VALUE, in[MAT_IN_ALPHA]); + nodestack_get_vec(&shi->alpha, SOCK_FLOAT, in[MAT_IN_ALPHA]); if(hasinput[MAT_IN_TRANSLUCENCY]) - nodestack_get_vec(&shi->translucency, SOCK_VALUE, in[MAT_IN_TRANSLUCENCY]); + nodestack_get_vec(&shi->translucency, SOCK_FLOAT, in[MAT_IN_TRANSLUCENCY]); } shi->nodes= 1; /* temp hack to prevent trashadow recursion */ @@ -204,7 +204,7 @@ static void node_shader_exec_material(void *data, bNode *node, bNodeStack **in, } -static void node_shader_init_material(bNode* node) +static void node_shader_init_material(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { node->custom1= SH_NODE_MAT_DIFF|SH_NODE_MAT_SPEC; } @@ -308,8 +308,8 @@ void register_node_type_sh_material(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, SH_NODE_MATERIAL, "Material", NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW, - sh_node_material_in, sh_node_material_out); + node_type_base(&ntype, SH_NODE_MATERIAL, "Material", NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW); + node_type_socket_templates(&ntype, sh_node_material_in, sh_node_material_out); node_type_size(&ntype, 120, 80, 240); node_type_init(&ntype, node_shader_init_material); node_type_exec(&ntype, node_shader_exec_material); @@ -323,8 +323,8 @@ void register_node_type_sh_material_ext(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, SH_NODE_MATERIAL_EXT, "Extended Material", NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW, - sh_node_material_ext_in, sh_node_material_ext_out); + node_type_base(&ntype, SH_NODE_MATERIAL_EXT, "Extended Material", NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW); + node_type_socket_templates(&ntype, sh_node_material_ext_in, sh_node_material_ext_out); node_type_size(&ntype, 120, 80, 240); node_type_init(&ntype, node_shader_init_material); node_type_exec(&ntype, node_shader_exec_material); diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_math.c b/source/blender/nodes/shader/nodes/node_shader_math.c similarity index 92% rename from source/blender/nodes/intern/SHD_nodes/SHD_math.c rename to source/blender/nodes/shader/nodes/node_shader_math.c index dd0a564dc4b..0618598379f 100644 --- a/source/blender/nodes/intern/SHD_nodes/SHD_math.c +++ b/source/blender/nodes/shader/nodes/node_shader_math.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: SHD_math.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,23 +27,23 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/SHD_nodes/SHD_math.c +/** \file blender/nodes/shader/nodes/node_shader_math.c * \ingroup shdnodes */ -#include "../SHD_util.h" +#include "node_shader_util.h" /* **************** SCALAR MATH ******************** */ -static bNodeSocketType sh_node_math_in[]= { - { SOCK_VALUE, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -100.0f, 100.0f}, - { SOCK_VALUE, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -100.0f, 100.0f}, +static bNodeSocketTemplate sh_node_math_in[]= { + { SOCK_FLOAT, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -100.0f, 100.0f, PROP_NONE}, + { SOCK_FLOAT, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -100.0f, 100.0f, PROP_NONE}, { -1, 0, "" } }; -static bNodeSocketType sh_node_math_out[]= { - { SOCK_VALUE, 0, "Value", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate sh_node_math_out[]= { + { SOCK_FLOAT, 0, "Value"}, { -1, 0, "" } }; @@ -242,8 +242,8 @@ void register_node_type_sh_math(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, SH_NODE_MATH, "Math", NODE_CLASS_CONVERTOR, NODE_OPTIONS, - sh_node_math_in, sh_node_math_out); + node_type_base(&ntype, SH_NODE_MATH, "Math", NODE_CLASS_CONVERTOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, sh_node_math_in, sh_node_math_out); node_type_size(&ntype, 120, 110, 160); node_type_label(&ntype, node_math_label); node_type_storage(&ntype, "node_math", NULL, NULL); diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_mixRgb.c b/source/blender/nodes/shader/nodes/node_shader_mixRgb.c similarity index 79% rename from source/blender/nodes/intern/SHD_nodes/SHD_mixRgb.c rename to source/blender/nodes/shader/nodes/node_shader_mixRgb.c index 8b3033a98ca..a89faa66fc0 100644 --- a/source/blender/nodes/intern/SHD_nodes/SHD_mixRgb.c +++ b/source/blender/nodes/shader/nodes/node_shader_mixRgb.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: SHD_mixRgb.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,22 +27,22 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/SHD_nodes/SHD_mixRgb.c +/** \file blender/nodes/shader/nodes/node_shader_mixRgb.c * \ingroup shdnodes */ -#include "../SHD_util.h" +#include "node_shader_util.h" /* **************** MIX RGB ******************** */ -static bNodeSocketType sh_node_mix_rgb_in[]= { - { SOCK_VALUE, 1, "Fac", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, - { SOCK_RGBA, 1, "Color1", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f}, - { SOCK_RGBA, 1, "Color2", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate sh_node_mix_rgb_in[]= { + { SOCK_FLOAT, 1, "Fac", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR}, + { SOCK_RGBA, 1, "Color1", 0.5f, 0.5f, 0.5f, 1.0f}, + { SOCK_RGBA, 1, "Color2", 0.5f, 0.5f, 0.5f, 1.0f}, { -1, 0, "" } }; -static bNodeSocketType sh_node_mix_rgb_out[]= { - { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate sh_node_mix_rgb_out[]= { + { SOCK_RGBA, 0, "Color"}, { -1, 0, "" } }; @@ -54,7 +54,7 @@ static void node_shader_exec_mix_rgb(void *UNUSED(data), bNode *node, bNodeStack float fac; float vec[3]; - nodestack_get_vec(&fac, SOCK_VALUE, in[0]); + nodestack_get_vec(&fac, SOCK_FLOAT, in[0]); CLAMP(fac, 0.0f, 1.0f); nodestack_get_vec(col, SOCK_VECTOR, in[1]); @@ -79,8 +79,8 @@ void register_node_type_sh_mix_rgb(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, SH_NODE_MIX_RGB, "Mix", NODE_CLASS_OP_COLOR, NODE_OPTIONS, - sh_node_mix_rgb_in, sh_node_mix_rgb_out); + node_type_base(&ntype, SH_NODE_MIX_RGB, "Mix", NODE_CLASS_OP_COLOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, sh_node_mix_rgb_in, sh_node_mix_rgb_out); node_type_size(&ntype, 100, 60, 150); node_type_label(&ntype, node_blend_label); node_type_exec(&ntype, node_shader_exec_mix_rgb); diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_normal.c b/source/blender/nodes/shader/nodes/node_shader_normal.c similarity index 67% rename from source/blender/nodes/intern/SHD_nodes/SHD_normal.c rename to source/blender/nodes/shader/nodes/node_shader_normal.c index a4e39935cea..099a9bed10d 100644 --- a/source/blender/nodes/intern/SHD_nodes/SHD_normal.c +++ b/source/blender/nodes/shader/nodes/node_shader_normal.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: SHD_normal.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,25 +27,36 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/SHD_nodes/SHD_normal.c +/** \file blender/nodes/shader/nodes/node_shader_normal.c * \ingroup shdnodes */ -#include "../SHD_util.h" +#include "node_shader_util.h" /* **************** NORMAL ******************** */ -static bNodeSocketType sh_node_normal_in[]= { - { SOCK_VECTOR, 1, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f}, +static bNodeSocketTemplate sh_node_normal_in[]= { + { SOCK_VECTOR, 1, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_NONE}, { -1, 0, "" } }; -static bNodeSocketType sh_node_normal_out[]= { - { SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f}, - { SOCK_VALUE, 0, "Dot", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate sh_node_normal_out[]= { + { SOCK_VECTOR, 0, "Normal"}, + { SOCK_FLOAT, 0, "Dot"}, { -1, 0, "" } }; +static void node_shader_init_normal(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) +{ + bNodeSocket *sock= node->outputs.first; + bNodeSocketValueVector *dval= (bNodeSocketValueVector*)sock->default_value; + + /* output value is used for normal vector */ + dval->value[0] = 0.0f; + dval->value[1] = 0.0f; + dval->value[2] = 1.0f; +} + /* generates normal, does dot product */ static void node_shader_exec_normal(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out) { @@ -57,7 +68,7 @@ static void node_shader_exec_normal(void *UNUSED(data), bNode *node, bNodeStack nodestack_get_vec(vec, SOCK_VECTOR, in[0]); - VECCOPY(out[0]->vec, sock->ns.vec); + VECCOPY(out[0]->vec, ((bNodeSocketValueVector*)sock->default_value)->value); /* render normals point inside... the widget points outside */ out[1]->vec[0]= -INPR(out[0]->vec, vec); } @@ -65,7 +76,7 @@ static void node_shader_exec_normal(void *UNUSED(data), bNode *node, bNodeStack static int gpu_shader_normal(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out) { bNodeSocket *sock= node->outputs.first; - GPUNodeLink *vec = GPU_uniform(sock->ns.vec); + GPUNodeLink *vec = GPU_uniform(((bNodeSocketValueVector*)sock->default_value)->value); return GPU_stack_link(mat, "normal", in, out, vec); } @@ -74,8 +85,9 @@ void register_node_type_sh_normal(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, SH_NODE_NORMAL, "Normal", NODE_CLASS_OP_VECTOR, NODE_OPTIONS, - sh_node_normal_in, sh_node_normal_out); + node_type_base(&ntype, SH_NODE_NORMAL, "Normal", NODE_CLASS_OP_VECTOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, sh_node_normal_in, sh_node_normal_out); + node_type_init(&ntype, node_shader_init_normal); node_type_exec(&ntype, node_shader_exec_normal); node_type_gpu(&ntype, gpu_shader_normal); diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_output.c b/source/blender/nodes/shader/nodes/node_shader_output.c similarity index 83% rename from source/blender/nodes/intern/SHD_nodes/SHD_output.c rename to source/blender/nodes/shader/nodes/node_shader_output.c index e42caabff34..638af7d4eb3 100644 --- a/source/blender/nodes/intern/SHD_nodes/SHD_output.c +++ b/source/blender/nodes/shader/nodes/node_shader_output.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: SHD_output.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,17 +27,17 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/SHD_nodes/SHD_output.c +/** \file blender/nodes/shader/nodes/node_shader_output.c * \ingroup shdnodes */ -#include "../SHD_util.h" +#include "node_shader_util.h" /* **************** OUTPUT ******************** */ -static bNodeSocketType sh_node_output_in[]= { - { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate sh_node_output_in[]= { + { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_FLOAT, 1, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR}, { -1, 0, "" } }; @@ -49,7 +49,7 @@ static void node_shader_exec_output(void *data, bNode *node, bNodeStack **in, bN /* stack order input sockets: col, alpha, normal */ nodestack_get_vec(col, SOCK_VECTOR, in[0]); - nodestack_get_vec(col+3, SOCK_VALUE, in[1]); + nodestack_get_vec(col+3, SOCK_FLOAT, in[1]); if(shi->do_preview) { nodeAddToPreview(node, col, shi->xs, shi->ys, shi->do_manage); @@ -84,8 +84,8 @@ void register_node_type_sh_output(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, SH_NODE_OUTPUT, "Output", NODE_CLASS_OUTPUT, NODE_PREVIEW, - sh_node_output_in, NULL); + node_type_base(&ntype, SH_NODE_OUTPUT, "Output", NODE_CLASS_OUTPUT, NODE_PREVIEW); + node_type_socket_templates(&ntype, sh_node_output_in, NULL); node_type_size(&ntype, 80, 60, 200); node_type_exec(&ntype, node_shader_exec_output); node_type_gpu(&ntype, gpu_shader_output); diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_rgb.c b/source/blender/nodes/shader/nodes/node_shader_rgb.c similarity index 65% rename from source/blender/nodes/intern/SHD_nodes/SHD_rgb.c rename to source/blender/nodes/shader/nodes/node_shader_rgb.c index 3d7f401b055..c9bb78b45dd 100644 --- a/source/blender/nodes/intern/SHD_nodes/SHD_rgb.c +++ b/source/blender/nodes/shader/nodes/node_shader_rgb.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: SHD_rgb.c 36481 2011-05-04 11:42:25Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,30 +27,43 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/SHD_nodes/SHD_rgb.c +/** \file blender/nodes/shader/nodes/node_shader_rgb.c * \ingroup shdnodes */ -#include "../SHD_util.h" +#include "node_shader_util.h" /* **************** RGB ******************** */ -static bNodeSocketType sh_node_rgb_out[]= { - { SOCK_RGBA, 0, "Color", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate sh_node_rgb_out[]= { + { SOCK_RGBA, 0, "Color"}, { -1, 0, "" } }; +static void node_shader_init_rgb(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) +{ + bNodeSocket *sock= node->outputs.first; + bNodeSocketValueRGBA *dval= (bNodeSocketValueRGBA*)sock->default_value; + /* uses the default value of the output socket, must be initialized here */ + dval->value[0] = 0.5f; + dval->value[1] = 0.5f; + dval->value[2] = 0.5f; + dval->value[3] = 1.0f; +} + static void node_shader_exec_rgb(void *UNUSED(data), bNode *node, bNodeStack **UNUSED(in), bNodeStack **out) { bNodeSocket *sock= node->outputs.first; + float *col= ((bNodeSocketValueRGBA*)sock->default_value)->value; - VECCOPY(out[0]->vec, sock->ns.vec); + VECCOPY(out[0]->vec, col); } static int gpu_shader_rgb(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out) { bNodeSocket *sock= node->outputs.first; - GPUNodeLink *vec = GPU_uniform(sock->ns.vec); + float *col= ((bNodeSocketValueRGBA*)sock->default_value)->value; + GPUNodeLink *vec = GPU_uniform(col); return GPU_stack_link(mat, "set_rgba", in, out, vec); } @@ -59,8 +72,9 @@ void register_node_type_sh_rgb(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, SH_NODE_RGB, "RGB", NODE_CLASS_INPUT, NODE_OPTIONS, - NULL, sh_node_rgb_out); + node_type_base(&ntype, SH_NODE_RGB, "RGB", NODE_CLASS_INPUT, NODE_OPTIONS); + node_type_socket_templates(&ntype, NULL, sh_node_rgb_out); + node_type_init(&ntype, node_shader_init_rgb); node_type_size(&ntype, 140, 80, 140); node_type_exec(&ntype, node_shader_exec_rgb); node_type_gpu(&ntype, gpu_shader_rgb); diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_sepcombRGB.c b/source/blender/nodes/shader/nodes/node_shader_sepcombRGB.c similarity index 74% rename from source/blender/nodes/intern/SHD_nodes/SHD_sepcombRGB.c rename to source/blender/nodes/shader/nodes/node_shader_sepcombRGB.c index e4fa0b02521..9528aca2574 100644 --- a/source/blender/nodes/intern/SHD_nodes/SHD_sepcombRGB.c +++ b/source/blender/nodes/shader/nodes/node_shader_sepcombRGB.c @@ -27,22 +27,22 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/SHD_nodes/SHD_sepcombRGB.c +/** \file blender/nodes/shader/nodes/node_shader_sepcombRGB.c * \ingroup shdnodes */ -#include "../SHD_util.h" +#include "node_shader_util.h" /* **************** SEPARATE RGBA ******************** */ -static bNodeSocketType sh_node_seprgb_in[]= { - { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate sh_node_seprgb_in[]= { + { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f}, { -1, 0, "" } }; -static bNodeSocketType sh_node_seprgb_out[]= { - { SOCK_VALUE, 0, "R", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 0, "G", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 0, "B", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate sh_node_seprgb_out[]= { + { SOCK_FLOAT, 0, "R"}, + { SOCK_FLOAT, 0, "G"}, + { SOCK_FLOAT, 0, "B"}, { -1, 0, "" } }; @@ -62,8 +62,8 @@ void register_node_type_sh_seprgb(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, SH_NODE_SEPRGB, "Separate RGB", NODE_CLASS_CONVERTOR, 0, - sh_node_seprgb_in, sh_node_seprgb_out); + node_type_base(&ntype, SH_NODE_SEPRGB, "Separate RGB", NODE_CLASS_CONVERTOR, 0); + node_type_socket_templates(&ntype, sh_node_seprgb_in, sh_node_seprgb_out); node_type_size(&ntype, 80, 40, 140); node_type_exec(&ntype, node_shader_exec_seprgb); node_type_gpu(&ntype, gpu_shader_seprgb); @@ -74,14 +74,14 @@ void register_node_type_sh_seprgb(ListBase *lb) /* **************** COMBINE RGB ******************** */ -static bNodeSocketType sh_node_combrgb_in[]= { - { SOCK_VALUE, 1, "R", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "G", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "B", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate sh_node_combrgb_in[]= { + { SOCK_FLOAT, 1, "R", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_UNSIGNED}, + { SOCK_FLOAT, 1, "G", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_UNSIGNED}, + { SOCK_FLOAT, 1, "B", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_UNSIGNED}, { -1, 0, "" } }; -static bNodeSocketType sh_node_combrgb_out[]= { - { SOCK_RGBA, 0, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate sh_node_combrgb_out[]= { + { SOCK_RGBA, 0, "Image"}, { -1, 0, "" } }; @@ -101,8 +101,8 @@ void register_node_type_sh_combrgb(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, SH_NODE_COMBRGB, "Combine RGB", NODE_CLASS_CONVERTOR, NODE_OPTIONS, - sh_node_combrgb_in, sh_node_combrgb_out); + node_type_base(&ntype, SH_NODE_COMBRGB, "Combine RGB", NODE_CLASS_CONVERTOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, sh_node_combrgb_in, sh_node_combrgb_out); node_type_size(&ntype, 80, 40, 140); node_type_exec(&ntype, node_shader_exec_combrgb); node_type_gpu(&ntype, gpu_shader_combrgb); diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_squeeze.c b/source/blender/nodes/shader/nodes/node_shader_squeeze.c similarity index 70% rename from source/blender/nodes/intern/SHD_nodes/SHD_squeeze.c rename to source/blender/nodes/shader/nodes/node_shader_squeeze.c index 80693ff08f0..305639dff21 100644 --- a/source/blender/nodes/intern/SHD_nodes/SHD_squeeze.c +++ b/source/blender/nodes/shader/nodes/node_shader_squeeze.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: SHD_squeeze.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,23 +27,23 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/SHD_nodes/SHD_squeeze.c +/** \file blender/nodes/shader/nodes/node_shader_squeeze.c * \ingroup shdnodes */ -#include "../SHD_util.h" +#include "node_shader_util.h" /* **************** VALUE SQUEEZE ******************** */ -static bNodeSocketType sh_node_squeeze_in[]= { - { SOCK_VALUE, 1, "Value", 0.0f, 0.0f, 0.0f, 0.0f, -100.0f, 100.0f}, - { SOCK_VALUE, 1, "Width", 1.0f, 0.0f, 0.0f, 0.0f, -100.0f, 100.0f}, - { SOCK_VALUE, 1, "Center", 0.0f, 0.0f, 0.0f, 0.0f, -100.0f, 100.0f}, +static bNodeSocketTemplate sh_node_squeeze_in[]= { + { SOCK_FLOAT, 1, "Value", 0.0f, 0.0f, 0.0f, 0.0f, -100.0f, 100.0f, PROP_NONE}, + { SOCK_FLOAT, 1, "Width", 1.0f, 0.0f, 0.0f, 0.0f, -100.0f, 100.0f, PROP_NONE}, + { SOCK_FLOAT, 1, "Center", 0.0f, 0.0f, 0.0f, 0.0f, -100.0f, 100.0f, PROP_NONE}, { -1, 0, "" } }; -static bNodeSocketType sh_node_squeeze_out[]= { - { SOCK_VALUE, 0, "Value", 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate sh_node_squeeze_out[]= { + { SOCK_FLOAT, 0, "Value"}, { -1, 0, "" } }; @@ -52,9 +52,9 @@ bNodeStack **out) { float vec[3]; - nodestack_get_vec(vec, SOCK_VALUE, in[0]); - nodestack_get_vec(vec+1, SOCK_VALUE, in[1]); - nodestack_get_vec(vec+2, SOCK_VALUE, in[2]); + nodestack_get_vec(vec, SOCK_FLOAT, in[0]); + nodestack_get_vec(vec+1, SOCK_FLOAT, in[1]); + nodestack_get_vec(vec+2, SOCK_FLOAT, in[2]); out[0]->vec[0] = 1.0f / (1.0f + pow(2.71828183,-((vec[0]-vec[2])*vec[1]))) ; } @@ -68,8 +68,8 @@ void register_node_type_sh_squeeze(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, SH_NODE_SQUEEZE, "Squeeze Value", NODE_CLASS_CONVERTOR, NODE_OPTIONS, - sh_node_squeeze_in, sh_node_squeeze_out); + node_type_base(&ntype, SH_NODE_SQUEEZE, "Squeeze Value", NODE_CLASS_CONVERTOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, sh_node_squeeze_in, sh_node_squeeze_out); node_type_size(&ntype, 120, 110, 160); node_type_storage(&ntype, "node_squeeze", NULL, NULL); node_type_exec(&ntype, node_shader_exec_squeeze); diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_texture.c b/source/blender/nodes/shader/nodes/node_shader_texture.c similarity index 88% rename from source/blender/nodes/intern/SHD_nodes/SHD_texture.c rename to source/blender/nodes/shader/nodes/node_shader_texture.c index 249e4eeca5d..a4957d8f683 100644 --- a/source/blender/nodes/intern/SHD_nodes/SHD_texture.c +++ b/source/blender/nodes/shader/nodes/node_shader_texture.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: SHD_texture.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,24 +27,24 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/SHD_nodes/SHD_texture.c +/** \file blender/nodes/shader/nodes/node_shader_texture.c * \ingroup shdnodes */ #include "DNA_texture_types.h" -#include "../SHD_util.h" +#include "node_shader_util.h" /* **************** TEXTURE ******************** */ -static bNodeSocketType sh_node_texture_in[]= { - { SOCK_VECTOR, 1, "Vector", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f}, /* no limit */ +static bNodeSocketTemplate sh_node_texture_in[]= { + { SOCK_VECTOR, 1, "Vector", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_NONE}, /* no limit */ { -1, 0, "" } }; -static bNodeSocketType sh_node_texture_out[]= { - { SOCK_VALUE, 0, "Value", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_RGBA , 0, "Color", 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f}, +static bNodeSocketTemplate sh_node_texture_out[]= { + { SOCK_FLOAT, 0, "Value"}, + { SOCK_RGBA , 0, "Color"}, + { SOCK_VECTOR, 0, "Normal"}, { -1, 0, "" } }; @@ -137,8 +137,8 @@ void register_node_type_sh_texture(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, SH_NODE_TEXTURE, "Texture", NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW, - sh_node_texture_in, sh_node_texture_out); + node_type_base(&ntype, SH_NODE_TEXTURE, "Texture", NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW); + node_type_socket_templates(&ntype, sh_node_texture_in, sh_node_texture_out); node_type_size(&ntype, 120, 80, 240); node_type_exec(&ntype, node_shader_exec_texture); node_type_gpu(&ntype, gpu_shader_texture); diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_valToRgb.c b/source/blender/nodes/shader/nodes/node_shader_valToRgb.c similarity index 76% rename from source/blender/nodes/intern/SHD_nodes/SHD_valToRgb.c rename to source/blender/nodes/shader/nodes/node_shader_valToRgb.c index 86f832c12ee..9353143095a 100644 --- a/source/blender/nodes/intern/SHD_nodes/SHD_valToRgb.c +++ b/source/blender/nodes/shader/nodes/node_shader_valToRgb.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: SHD_valToRgb.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,21 +27,21 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/SHD_nodes/SHD_valToRgb.c +/** \file blender/nodes/shader/nodes/node_shader_valToRgb.c * \ingroup shdnodes */ -#include "../SHD_util.h" +#include "node_shader_util.h" /* **************** VALTORGB ******************** */ -static bNodeSocketType sh_node_valtorgb_in[]= { - { SOCK_VALUE, 1, "Fac", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate sh_node_valtorgb_in[]= { + { SOCK_FLOAT, 1, "Fac", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR}, { -1, 0, "" } }; -static bNodeSocketType sh_node_valtorgb_out[]= { - { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 0, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate sh_node_valtorgb_out[]= { + { SOCK_RGBA, 0, "Color"}, + { SOCK_FLOAT, 0, "Alpha"}, { -1, 0, "" } }; @@ -52,14 +52,14 @@ static void node_shader_exec_valtorgb(void *UNUSED(data), bNode *node, bNodeStac if(node->storage) { float fac; - nodestack_get_vec(&fac, SOCK_VALUE, in[0]); + nodestack_get_vec(&fac, SOCK_FLOAT, in[0]); do_colorband(node->storage, fac, out[0]->vec); out[1]->vec[0]= out[0]->vec[3]; } } -static void node_shader_init_valtorgb(bNode *node) +static void node_shader_init_valtorgb(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { node->storage= add_colorband(1); } @@ -77,8 +77,8 @@ void register_node_type_sh_valtorgb(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, SH_NODE_VALTORGB, "ColorRamp", NODE_CLASS_CONVERTOR, NODE_OPTIONS, - sh_node_valtorgb_in, sh_node_valtorgb_out); + node_type_base(&ntype, SH_NODE_VALTORGB, "ColorRamp", NODE_CLASS_CONVERTOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, sh_node_valtorgb_in, sh_node_valtorgb_out); node_type_size(&ntype, 240, 200, 300); node_type_init(&ntype, node_shader_init_valtorgb); node_type_storage(&ntype, "ColorBand", node_free_standard_storage, node_copy_standard_storage); @@ -90,12 +90,12 @@ void register_node_type_sh_valtorgb(ListBase *lb) /* **************** RGBTOBW ******************** */ -static bNodeSocketType sh_node_rgbtobw_in[]= { +static bNodeSocketTemplate sh_node_rgbtobw_in[]= { { SOCK_RGBA, 1, "Color", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f}, { -1, 0, "" } }; -static bNodeSocketType sh_node_rgbtobw_out[]= { - { SOCK_VALUE, 0, "Val", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate sh_node_rgbtobw_out[]= { + { SOCK_FLOAT, 0, "Val", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, { -1, 0, "" } }; @@ -117,8 +117,8 @@ void register_node_type_sh_rgbtobw(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, SH_NODE_RGBTOBW, "RGB to BW", NODE_CLASS_CONVERTOR, 0, - sh_node_rgbtobw_in, sh_node_rgbtobw_out); + node_type_base(&ntype, SH_NODE_RGBTOBW, "RGB to BW", NODE_CLASS_CONVERTOR, 0); + node_type_socket_templates(&ntype, sh_node_rgbtobw_in, sh_node_rgbtobw_out); node_type_size(&ntype, 80, 40, 120); node_type_exec(&ntype, node_shader_exec_rgbtobw); node_type_gpu(&ntype, gpu_shader_rgbtobw); diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_value.c b/source/blender/nodes/shader/nodes/node_shader_value.c similarity index 66% rename from source/blender/nodes/intern/SHD_nodes/SHD_value.c rename to source/blender/nodes/shader/nodes/node_shader_value.c index 29a75bbf36d..21ff565306d 100644 --- a/source/blender/nodes/intern/SHD_nodes/SHD_value.c +++ b/source/blender/nodes/shader/nodes/node_shader_value.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: SHD_value.c 36536 2011-05-07 13:27:27Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,30 +27,40 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/SHD_nodes/SHD_value.c +/** \file blender/nodes/shader/nodes/node_shader_value.c * \ingroup shdnodes */ -#include "../SHD_util.h" +#include "node_shader_util.h" /* **************** VALUE ******************** */ -static bNodeSocketType sh_node_value_out[]= { - { SOCK_VALUE, 0, "Value", 0.5f, 0.0f, 0.0f, 0.0f, -10000.0f, 10000.0f}, +static bNodeSocketTemplate sh_node_value_out[]= { + { SOCK_FLOAT, 0, "Value"}, { -1, 0, "" } }; +static void node_shader_init_value(bNodeTree *UNUSED(ntree), bNode *node, bNodeTemplate *UNUSED(ntemp)) +{ + bNodeSocket *sock= node->outputs.first; + bNodeSocketValueFloat *dval= (bNodeSocketValueFloat*)sock->default_value; + /* uses the default value of the output socket, must be initialized here */ + dval->value = 0.5f; +} + static void node_shader_exec_value(void *UNUSED(data), bNode *node, bNodeStack **UNUSED(in), bNodeStack **out) { bNodeSocket *sock= node->outputs.first; + float val= ((bNodeSocketValueFloat*)sock->default_value)->value; - out[0]->vec[0]= sock->ns.vec[0]; + out[0]->vec[0]= val; } static int gpu_shader_value(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out) { bNodeSocket *sock= node->outputs.first; - GPUNodeLink *vec = GPU_uniform(sock->ns.vec); + float *val= &((bNodeSocketValueFloat*)sock->default_value)->value; + GPUNodeLink *vec = GPU_uniform(val); return GPU_stack_link(mat, "set_value", in, out, vec); } @@ -59,8 +69,9 @@ void register_node_type_sh_value(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, SH_NODE_VALUE, "Value", NODE_CLASS_INPUT, NODE_OPTIONS, - NULL, sh_node_value_out); + node_type_base(&ntype, SH_NODE_VALUE, "Value", NODE_CLASS_INPUT, NODE_OPTIONS); + node_type_socket_templates(&ntype, NULL, sh_node_value_out); + node_type_init(&ntype, node_shader_init_value); node_type_size(&ntype, 80, 50, 120); node_type_exec(&ntype, node_shader_exec_value); node_type_gpu(&ntype, gpu_shader_value); diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_vectMath.c b/source/blender/nodes/shader/nodes/node_shader_vectMath.c similarity index 87% rename from source/blender/nodes/intern/SHD_nodes/SHD_vectMath.c rename to source/blender/nodes/shader/nodes/node_shader_vectMath.c index 9979e488a71..c6a081431a2 100644 --- a/source/blender/nodes/intern/SHD_nodes/SHD_vectMath.c +++ b/source/blender/nodes/shader/nodes/node_shader_vectMath.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: SHD_vectMath.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,25 +27,25 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/SHD_nodes/SHD_vectMath.c +/** \file blender/nodes/shader/nodes/node_shader_vectMath.c * \ingroup shdnodes */ -#include "../SHD_util.h" +#include "node_shader_util.h" /* **************** VECTOR MATH ******************** */ -static bNodeSocketType sh_node_vect_math_in[]= { - { SOCK_VECTOR, 1, "Vector", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f}, - { SOCK_VECTOR, 1, "Vector", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate sh_node_vect_math_in[]= { + { SOCK_VECTOR, 1, "Vector", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f, PROP_NONE}, + { SOCK_VECTOR, 1, "Vector", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f, PROP_NONE}, { -1, 0, "" } }; -static bNodeSocketType sh_node_vect_math_out[]= { - { SOCK_VECTOR, 0, "Vector", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 0, "Value", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate sh_node_vect_math_out[]= { + { SOCK_VECTOR, 0, "Vector"}, + { SOCK_FLOAT, 0, "Value"}, { -1, 0, "" } }; @@ -136,8 +136,8 @@ void register_node_type_sh_vect_math(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, SH_NODE_VECT_MATH, "Vector Math", NODE_CLASS_CONVERTOR, NODE_OPTIONS, - sh_node_vect_math_in, sh_node_vect_math_out); + node_type_base(&ntype, SH_NODE_VECT_MATH, "Vector Math", NODE_CLASS_CONVERTOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, sh_node_vect_math_in, sh_node_vect_math_out); node_type_size(&ntype, 80, 75, 140); node_type_label(&ntype, node_vect_math_label); node_type_storage(&ntype, "node_vect_math", NULL, NULL); diff --git a/source/blender/nodes/texture/node_texture_tree.c b/source/blender/nodes/texture/node_texture_tree.c new file mode 100644 index 00000000000..75a57c64f2f --- /dev/null +++ b/source/blender/nodes/texture/node_texture_tree.c @@ -0,0 +1,237 @@ +/** + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2007 Blender Foundation. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/nodes/texture/node_texture_tree.c + * \ingroup nodes + */ + + +#include + +#include "DNA_texture_types.h" +#include "DNA_node_types.h" + +#include "BLI_listbase.h" +#include "BLI_threads.h" +#include "BLI_utildefines.h" + +#include "BKE_global.h" +#include "BKE_main.h" +#include "BKE_node.h" + +#include "node_exec.h" +#include "node_util.h" +#include "NOD_texture.h" +#include "node_texture_util.h" + +#include "RE_pipeline.h" +#include "RE_shader_ext.h" + + +static void foreach_nodetree(Main *main, void *calldata, bNodeTreeCallback func) +{ + Tex *tx; + for(tx= main->tex.first; tx; tx= tx->id.next) { + if(tx->nodetree) { + func(calldata, &tx->id, tx->nodetree); + } + } +} + +static void local_sync(bNodeTree *localtree, bNodeTree *ntree) +{ + bNode *lnode; + + /* copy over contents of previews */ + for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) { + if(ntreeNodeExists(ntree, lnode->new_node)) { + bNode *node= lnode->new_node; + + if(node->preview && node->preview->rect) { + if(lnode->preview && lnode->preview->rect) { + int xsize= node->preview->xsize; + int ysize= node->preview->ysize; + memcpy(node->preview->rect, lnode->preview->rect, 4*xsize + xsize*ysize*sizeof(char)*4); + } + } + } + } +} + +bNodeTreeType ntreeType_Texture = { + /* type */ NTREE_TEXTURE, + /* id_name */ "NTTexture Nodetree", + + /* node_types */ { NULL, NULL }, + + /* free_cache */ NULL, + /* free_node_cache */ NULL, + /* foreach_nodetree */ foreach_nodetree, + /* localize */ NULL, + /* local_sync */ local_sync, + /* local_merge */ NULL, + /* update */ NULL, + /* update_node */ NULL +}; + +int ntreeTexTagAnimated(bNodeTree *ntree) +{ + bNode *node; + + if(ntree==NULL) return 0; + + for(node= ntree->nodes.first; node; node= node->next) { + if(node->type==TEX_NODE_CURVE_TIME) { + NodeTagChanged(ntree, node); + return 1; + } + else if(node->type==NODE_GROUP) { + if( ntreeTexTagAnimated((bNodeTree *)node->id) ) { + return 1; + } + } + } + + return 0; +} + +bNodeTreeExec *ntreeTexBeginExecTree(bNodeTree *ntree) +{ + bNodeTreeExec *exec; + bNode *node; + + /* XXX hack: prevent exec data from being generated twice. + * this should be handled by the renderer! + */ + if (ntree->execdata) + return ntree->execdata; + + /* common base initialization */ + exec = ntree_exec_begin(ntree); + + /* allocate the thread stack listbase array */ + exec->threadstack= MEM_callocN(BLENDER_MAX_THREADS*sizeof(ListBase), "thread stack array"); + + for(node= exec->nodetree->nodes.first; node; node= node->next) + node->need_exec= 1; + + /* XXX this should not be necessary, but is still used for cmp/sha/tex nodes, + * which only store the ntree pointer. Should be fixed at some point! + */ + ntree->execdata = exec; + + return exec; +} + +/* free texture delegates */ +static void tex_free_delegates(bNodeTreeExec *exec) +{ + bNodeThreadStack *nts; + bNodeStack *ns; + int th, a; + + for(th=0; ththreadstack[th].first; nts; nts=nts->next) + for(ns= nts->stack, a=0; astacksize; a++, ns++) + if(ns->data && !ns->is_copy) + MEM_freeN(ns->data); +} + +void ntreeTexEndExecTree(bNodeTreeExec *exec) +{ + if(exec) { + bNodeTree *ntree= exec->nodetree; + bNodeThreadStack *nts; + int a; + + if(exec->threadstack) { + tex_free_delegates(exec); + + for(a=0; athreadstack[a].first; nts; nts=nts->next) + if (nts->stack) MEM_freeN(nts->stack); + BLI_freelistN(&exec->threadstack[a]); + } + + MEM_freeN(exec->threadstack); + exec->threadstack= NULL; + } + + ntree_exec_end(exec); + + /* XXX clear nodetree backpointer to exec data, same problem as noted in ntreeBeginExecTree */ + ntree->execdata = NULL; + } +} + +int ntreeTexExecTree( + bNodeTree *nodes, + TexResult *texres, + float *co, + float *dxt, float *dyt, + int osatex, + short thread, + Tex *UNUSED(tex), + short which_output, + int cfra, + int preview, + ShadeInput *shi, + MTex *mtex +){ + TexCallData data; + float *nor= texres->nor; + int retval = TEX_INT; + bNodeThreadStack *nts = NULL; + bNodeTreeExec *exec= nodes->execdata; + + data.co = co; + data.dxt = dxt; + data.dyt = dyt; + data.osatex = osatex; + data.target = texres; + data.do_preview = preview; + data.thread = thread; + data.which_output = which_output; + data.cfra= cfra; + data.mtex= mtex; + data.shi= shi; + + if (!exec) + exec = ntreeTexBeginExecTree(nodes); + + nts= ntreeGetThreadStack(exec, thread); + ntreeExecThreadNodes(exec, nts, &data, thread); + ntreeReleaseThreadStack(nts); + + if(texres->nor) retval |= TEX_NOR; + retval |= TEX_RGB; + /* confusing stuff; the texture output node sets this to NULL to indicate no normal socket was set + however, the texture code checks this for other reasons (namely, a normal is required for material) */ + texres->nor= nor; + + return retval; +} diff --git a/source/blender/nodes/intern/TEX_util.c b/source/blender/nodes/texture/node_texture_util.c similarity index 78% rename from source/blender/nodes/intern/TEX_util.c rename to source/blender/nodes/texture/node_texture_util.c index b5e27ca2ccb..5aedd8681ab 100644 --- a/source/blender/nodes/intern/TEX_util.c +++ b/source/blender/nodes/texture/node_texture_util.c @@ -26,7 +26,7 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/TEX_util.c +/** \file blender/nodes/texture/node_texture_util.c * \ingroup nodes */ @@ -48,11 +48,11 @@ */ #include -#include "TEX_util.h" +#include "node_texture_util.h" #define PREV_RES 128 /* default preview resolution */ -void tex_call_delegate(TexDelegate *dg, float *out, TexParams *params, short thread) +static void tex_call_delegate(TexDelegate *dg, float *out, TexParams *params, short thread) { if(dg->node->need_exec) { dg->fn(out, params, dg->node, dg->in, thread); @@ -68,7 +68,7 @@ static void tex_input(float *out, int sz, bNodeStack *in, TexParams *params, sho if(dg) { tex_call_delegate(dg, in->vec, params, thread); - if(in->hasoutput && in->sockettype == SOCK_VALUE) + if(in->hasoutput && in->sockettype == SOCK_FLOAT) in->vec[1] = in->vec[2] = in->vec[0]; } memcpy(out, in->vec, sz * sizeof(float)); @@ -83,7 +83,7 @@ void tex_input_rgba(float *out, bNodeStack *in, TexParams *params, short thread) { tex_input(out, 4, in, params, thread); - if(in->hasoutput && in->sockettype == SOCK_VALUE) + if(in->hasoutput && in->sockettype == SOCK_FLOAT) { out[1] = out[2] = out[0]; out[3] = 1; @@ -170,45 +170,3 @@ void ntreeTexCheckCyclics(struct bNodeTree *ntree) } } - -int ntreeTexExecTree( - bNodeTree *nodes, - TexResult *texres, - float *co, - float *dxt, float *dyt, - int osatex, - short thread, - Tex *UNUSED(tex), - short which_output, - int cfra, - int preview, - ShadeInput *shi, - MTex *mtex -){ - TexCallData data; - float *nor= texres->nor; - int retval = TEX_INT; - - data.co = co; - data.dxt = dxt; - data.dyt = dyt; - data.osatex = osatex; - data.target = texres; - data.do_preview = preview; - data.thread = thread; - data.which_output = which_output; - data.cfra= cfra; - data.mtex= mtex; - data.shi= shi; - - ntreeExecTree(nodes, &data, thread); - - if(texres->nor) retval |= TEX_NOR; - retval |= TEX_RGB; - /* confusing stuff; the texture output node sets this to NULL to indicate no normal socket was set - however, the texture code checks this for other reasons (namely, a normal is required for material) */ - texres->nor= nor; - - return retval; -} - diff --git a/source/blender/nodes/intern/TEX_util.h b/source/blender/nodes/texture/node_texture_util.h similarity index 93% rename from source/blender/nodes/intern/TEX_util.h rename to source/blender/nodes/texture/node_texture_util.h index 0875bcd52bf..867b4142052 100644 --- a/source/blender/nodes/intern/TEX_util.h +++ b/source/blender/nodes/texture/node_texture_util.h @@ -26,13 +26,13 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/TEX_util.h +/** \file blender/nodes/texture/node_texture_util.h * \ingroup nodes */ -#ifndef TEX_NODE_UTIL_H_ -#define TEX_NODE_UTIL_H_ +#ifndef NODE_TEXTURE_UTIL_H_ +#define NODE_TEXTURE_UTIL_H_ #include #include @@ -60,7 +60,6 @@ #include "BKE_library.h" -#include "../SHD_node.h" #include "node_util.h" #include "BLI_math.h" @@ -112,8 +111,6 @@ typedef struct TexDelegate { int type; } TexDelegate; -void tex_call_delegate(TexDelegate*, float *out, TexParams *params, short thread); - void tex_input_rgba(float *out, bNodeStack *in, TexParams *params, short thread); void tex_input_vec(float *out, bNodeStack *in, TexParams *params, short thread); float tex_input_value(bNodeStack *in, TexParams *params, short thread); diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_at.c b/source/blender/nodes/texture/nodes/node_texture_at.c similarity index 82% rename from source/blender/nodes/intern/TEX_nodes/TEX_at.c rename to source/blender/nodes/texture/nodes/node_texture_at.c index d5980b786b0..f3275f2bcdf 100644 --- a/source/blender/nodes/intern/TEX_nodes/TEX_at.c +++ b/source/blender/nodes/texture/nodes/node_texture_at.c @@ -26,21 +26,21 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/TEX_nodes/TEX_at.c +/** \file blender/nodes/texture/nodes/node_texture_at.c * \ingroup texnodes */ -#include "../TEX_util.h" -#include "TEX_node.h" +#include "node_texture_util.h" +#include "NOD_texture.h" -static bNodeSocketType inputs[]= { - { SOCK_RGBA, 1, "Texture", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f }, - { SOCK_VECTOR, 1, "Coordinates", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f }, +static bNodeSocketTemplate inputs[]= { + { SOCK_RGBA, 1, "Texture", 0.0f, 0.0f, 0.0f, 1.0f }, + { SOCK_VECTOR, 1, "Coordinates", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f, PROP_NONE }, { -1, 0, "" } }; -static bNodeSocketType outputs[]= { - { SOCK_RGBA, 0, "Texture", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f }, +static bNodeSocketTemplate outputs[]= { + { SOCK_RGBA, 0, "Texture" }, { -1, 0, "" } }; @@ -63,8 +63,8 @@ void register_node_type_tex_at(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, TEX_NODE_AT, "At", NODE_CLASS_DISTORT, 0, - inputs, outputs); + node_type_base(&ntype, TEX_NODE_AT, "At", NODE_CLASS_DISTORT, 0); + node_type_socket_templates(&ntype, inputs, outputs); node_type_size(&ntype, 140, 100, 320); node_type_exec(&ntype, exec); diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_bricks.c b/source/blender/nodes/texture/nodes/node_texture_bricks.c similarity index 76% rename from source/blender/nodes/intern/TEX_nodes/TEX_bricks.c rename to source/blender/nodes/texture/nodes/node_texture_bricks.c index 0eb982496a9..060ed791871 100644 --- a/source/blender/nodes/intern/TEX_nodes/TEX_bricks.c +++ b/source/blender/nodes/texture/nodes/node_texture_bricks.c @@ -26,32 +26,33 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/TEX_nodes/TEX_bricks.c +/** \file blender/nodes/texture/nodes/node_texture_bricks.c * \ingroup texnodes */ -#include "../TEX_util.h" -#include "TEX_node.h" +#include "node_texture_util.h" +#include "NOD_texture.h" #include -static bNodeSocketType inputs[]= { - { SOCK_RGBA, 1, "Bricks 1", 0.596f, 0.282f, 0.0f, 1.0f, 0.0f, 1.0f }, - { SOCK_RGBA, 1, "Bricks 2", 0.632f, 0.504f, 0.05f, 1.0f, 0.0f, 1.0f }, - { SOCK_RGBA, 1, "Mortar", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f }, - { SOCK_VALUE, 1, "Thickness", 0.02f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f }, - { SOCK_VALUE, 1, "Bias", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f }, - { SOCK_VALUE, 1, "Brick Width", 0.5f, 0.0f, 0.0f, 0.0f, 0.001f, 99.0f }, - { SOCK_VALUE, 1, "Row Height", 0.25f, 0.0f, 0.0f, 0.0f, 0.001f, 99.0f }, +static bNodeSocketTemplate inputs[]= { + { SOCK_RGBA, 1, "Bricks 1", 0.596f, 0.282f, 0.0f, 1.0f }, + { SOCK_RGBA, 1, "Bricks 2", 0.632f, 0.504f, 0.05f, 1.0f }, + { SOCK_RGBA, 1, "Mortar", 0.0f, 0.0f, 0.0f, 1.0f }, + { SOCK_FLOAT, 1, "Thickness", 0.02f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_UNSIGNED }, + { SOCK_FLOAT, 1, "Bias", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f, PROP_NONE }, + { SOCK_FLOAT, 1, "Brick Width", 0.5f, 0.0f, 0.0f, 0.0f, 0.001f, 99.0f, PROP_UNSIGNED }, + { SOCK_FLOAT, 1, "Row Height", 0.25f, 0.0f, 0.0f, 0.0f, 0.001f, 99.0f, PROP_UNSIGNED }, { -1, 0, "" } }; -static bNodeSocketType outputs[]= { - { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate outputs[]= { + { SOCK_RGBA, 0, "Color"}, { -1, 0, "" } }; -static void init(bNode *node) { +static void init(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) +{ node->custom3 = 0.5; /* offset */ node->custom4 = 1.0; /* squash */ } @@ -123,8 +124,8 @@ void register_node_type_tex_bricks(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, TEX_NODE_BRICKS, "Bricks", NODE_CLASS_PATTERN, NODE_PREVIEW|NODE_OPTIONS, - inputs, outputs); + node_type_base(&ntype, TEX_NODE_BRICKS, "Bricks", NODE_CLASS_PATTERN, NODE_PREVIEW|NODE_OPTIONS); + node_type_socket_templates(&ntype, inputs, outputs); node_type_size(&ntype, 150, 60, 150); node_type_init(&ntype, init); node_type_exec(&ntype, exec); diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_checker.c b/source/blender/nodes/texture/nodes/node_texture_checker.c similarity index 79% rename from source/blender/nodes/intern/TEX_nodes/TEX_checker.c rename to source/blender/nodes/texture/nodes/node_texture_checker.c index c6c25ba1a8a..916ee80d66b 100644 --- a/source/blender/nodes/intern/TEX_nodes/TEX_checker.c +++ b/source/blender/nodes/texture/nodes/node_texture_checker.c @@ -26,23 +26,23 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/TEX_nodes/TEX_checker.c +/** \file blender/nodes/texture/nodes/node_texture_checker.c * \ingroup texnodes */ -#include "../TEX_util.h" -#include "TEX_node.h" +#include "node_texture_util.h" +#include "NOD_texture.h" #include -static bNodeSocketType inputs[]= { - { SOCK_RGBA, 1, "Color1", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f }, - { SOCK_RGBA, 1, "Color2", 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f }, - { SOCK_VALUE, 1, "Size", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 100.0f }, +static bNodeSocketTemplate inputs[]= { + { SOCK_RGBA, 1, "Color1", 1.0f, 0.0f, 0.0f, 1.0f }, + { SOCK_RGBA, 1, "Color2", 1.0f, 1.0f, 1.0f, 1.0f }, + { SOCK_FLOAT, 1, "Size", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 100.0f, PROP_UNSIGNED }, { -1, 0, "" } }; -static bNodeSocketType outputs[]= { - { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f }, +static bNodeSocketTemplate outputs[]= { + { SOCK_RGBA, 0, "Color" }, { -1, 0, "" } }; @@ -74,8 +74,8 @@ void register_node_type_tex_checker(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, TEX_NODE_CHECKER, "Checker", NODE_CLASS_PATTERN, NODE_PREVIEW|NODE_OPTIONS, - inputs, outputs); + node_type_base(&ntype, TEX_NODE_CHECKER, "Checker", NODE_CLASS_PATTERN, NODE_PREVIEW|NODE_OPTIONS); + node_type_socket_templates(&ntype, inputs, outputs); node_type_size(&ntype, 100, 60, 150); node_type_exec(&ntype, exec); diff --git a/source/blender/nodes/texture/nodes/node_texture_common.c b/source/blender/nodes/texture/nodes/node_texture_common.c new file mode 100644 index 00000000000..cb5102bae4e --- /dev/null +++ b/source/blender/nodes/texture/nodes/node_texture_common.c @@ -0,0 +1,271 @@ +/* + * $Id: CMP_blur.c 35562 2011-03-15 20:10:32Z lukastoenne $ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2006 Blender Foundation. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): Campbell Barton, Alfredo de Greef, David Millan Escriva, + * Juho Vepsäläinen + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/nodes/texture/nodes/node_texture_common.c + * \ingroup texnodes + */ + + +#include "DNA_node_types.h" + +#include "BKE_node.h" + +#include "node_texture_util.h" +#include "node_common.h" +#include "node_exec.h" + +static void copy_stack(bNodeStack *to, bNodeStack *from) +{ + if (to != from) { + copy_v4_v4(to->vec, from->vec); + to->data = from->data; + to->datatype = from->datatype; + + /* tag as copy to prevent freeing */ + to->is_copy = 1; + } +} + +/**** GROUP ****/ + +static void *group_initexec(bNode *node) +{ + bNodeTree *ngroup= (bNodeTree*)node->id; + void *exec; + + /* initialize the internal node tree execution */ + exec = ntreeTexBeginExecTree(ngroup); + + return exec; +} + +static void group_freeexec(bNode *UNUSED(node), void *nodedata) +{ + bNodeTreeExec*gexec= (bNodeTreeExec*)nodedata; + + ntreeTexEndExecTree(gexec); +} + +/* Copy inputs to the internal stack. + * This is a shallow copy, no buffers are duplicated here! + */ +static void group_copy_inputs(bNode *node, bNodeStack **in, bNodeStack *gstack) +{ + bNodeSocket *sock; + bNodeStack *ns; + int a; + for (sock=node->inputs.first, a=0; sock; sock=sock->next, ++a) { + if (sock->groupsock) { + ns = node_get_socket_stack(gstack, sock->groupsock); + copy_stack(ns, in[a]); + } + } +} + +/* Copy internal results to the external outputs. + */ +static void group_copy_outputs(bNode *node, bNodeStack **out, bNodeStack *gstack) +{ + bNodeSocket *sock; + bNodeStack *ns; + int a; + for (sock=node->outputs.first, a=0; sock; sock=sock->next, ++a) { + if (sock->groupsock) { + ns = node_get_socket_stack(gstack, sock->groupsock); + copy_stack(out[a], ns); + } + } +} + +static void group_execute(void *data, int thread, struct bNode *node, void *nodedata, struct bNodeStack **in, struct bNodeStack **out) +{ + bNodeTreeExec *exec= (bNodeTreeExec*)nodedata; + bNodeThreadStack *nts; + + /* XXX same behavior as trunk: all nodes inside group are executed. + * it's stupid, but just makes it work. compo redesign will do this better. + */ + { + bNode *inode; + for (inode=exec->nodetree->nodes.first; inode; inode=inode->next) + inode->need_exec = 1; + } + + nts = ntreeGetThreadStack(exec, thread); + + group_copy_inputs(node, in, nts->stack); + ntreeExecThreadNodes(exec, nts, data, thread); + group_copy_outputs(node, out, nts->stack); + + ntreeReleaseThreadStack(nts); +} + +void register_node_type_tex_group(ListBase *lb) +{ + static bNodeType ntype; + + node_type_base(&ntype, NODE_GROUP, "Group", NODE_CLASS_GROUP, NODE_OPTIONS|NODE_CONST_OUTPUT); + node_type_socket_templates(&ntype, NULL, NULL); + node_type_size(&ntype, 120, 60, 200); + node_type_label(&ntype, node_group_label); + node_type_init(&ntype, node_group_init); + node_type_valid(&ntype, node_group_valid); + node_type_template(&ntype, node_group_template); + node_type_update(&ntype, NULL, node_group_verify); + node_type_group_edit(&ntype, node_group_edit_get, node_group_edit_set, node_group_edit_clear); + node_type_exec_new(&ntype, group_initexec, group_freeexec, group_execute); + + nodeRegisterType(lb, &ntype); +} + + +/**** FOR LOOP ****/ + +#if 0 /* XXX loop nodes don't work nicely with current trees */ +static void forloop_execute(void *data, int thread, struct bNode *node, void *nodedata, struct bNodeStack **in, struct bNodeStack **out) +{ + bNodeTreeExec *exec= (bNodeTreeExec*)nodedata; + bNodeThreadStack *nts; + int iterations= (int)in[0]->vec[0]; + bNodeSocket *sock; + bNodeStack *ns; + int iteration; + + /* XXX same behavior as trunk: all nodes inside group are executed. + * it's stupid, but just makes it work. compo redesign will do this better. + */ + { + bNode *inode; + for (inode=exec->nodetree->nodes.first; inode; inode=inode->next) + inode->need_exec = 1; + } + + nts = ntreeGetThreadStack(exec, thread); + + /* "Iteration" socket */ + sock = exec->nodetree->inputs.first; + ns = node_get_socket_stack(nts->stack, sock); + +// group_copy_inputs(node, in, nts->stack); + for (iteration=0; iteration < iterations; ++iteration) { + /* first input contains current iteration counter */ + ns->vec[0] = (float)iteration; + ns->vec[1]=ns->vec[2]=ns->vec[3] = 0.0f; + +// if (iteration > 0) +// loop_init_iteration(exec->nodetree, nts->stack); +// ntreeExecThreadNodes(exec, nts, data, thread); + } +// loop_copy_outputs(node, in, out, exec->stack); + + ntreeReleaseThreadStack(nts); +} + +void register_node_type_tex_forloop(ListBase *lb) +{ + static bNodeType ntype; + + node_type_base(&ntype, NODE_FORLOOP, "For", NODE_CLASS_GROUP, NODE_OPTIONS); + node_type_socket_templates(&ntype, NULL, NULL); + node_type_size(&ntype, 120, 60, 200); + node_type_label(&ntype, node_group_label); + node_type_init(&ntype, node_forloop_init); + node_type_valid(&ntype, node_group_valid); + node_type_template(&ntype, node_forloop_template); + node_type_update(&ntype, NULL, node_group_verify); + node_type_tree(&ntype, node_forloop_init_tree, node_loop_update_tree); + node_type_group_edit(&ntype, node_group_edit_get, node_group_edit_set, node_group_edit_clear); + node_type_exec_new(&ntype, group_initexec, group_freeexec, forloop_execute); + + nodeRegisterType(lb, &ntype); +} +#endif + +/**** WHILE LOOP ****/ + +#if 0 /* XXX loop nodes don't work nicely with current trees */ +static void whileloop_execute(void *data, int thread, struct bNode *node, void *nodedata, struct bNodeStack **in, struct bNodeStack **out) +{ + bNodeTreeExec *exec= (bNodeTreeExec*)nodedata; + bNodeThreadStack *nts; + int condition= (in[0]->vec[0] > 0.0f); + bNodeSocket *sock; + bNodeStack *ns; + int iteration; + + /* XXX same behavior as trunk: all nodes inside group are executed. + * it's stupid, but just makes it work. compo redesign will do this better. + */ + { + bNode *inode; + for (inode=exec->nodetree->nodes.first; inode; inode=inode->next) + inode->need_exec = 1; + } + + nts = ntreeGetThreadStack(exec, thread); + + /* "Condition" socket */ + sock = exec->nodetree->outputs.first; + ns = node_get_socket_stack(nts->stack, sock); + + iteration = 0; +// group_copy_inputs(node, in, nts->stack); + while (condition && iteration < node->custom1) { +// if (iteration > 0) +// loop_init_iteration(exec->nodetree, nts->stack); +// ntreeExecThreadNodes(exec, nts, data, thread); + + condition = (ns->vec[0] > 0.0f); + ++iteration; + } +// loop_copy_outputs(node, in, out, exec->stack); + + ntreeReleaseThreadStack(nts); +} + +void register_node_type_tex_whileloop(ListBase *lb) +{ + static bNodeType ntype; + + node_type_base(&ntype, NODE_WHILELOOP, "While", NODE_CLASS_GROUP, NODE_OPTIONS); + node_type_socket_templates(&ntype, NULL, NULL); + node_type_size(&ntype, 120, 60, 200); + node_type_label(&ntype, node_group_label); + node_type_init(&ntype, node_whileloop_init); + node_type_valid(&ntype, node_group_valid); + node_type_template(&ntype, node_whileloop_template); + node_type_update(&ntype, NULL, node_group_verify); + node_type_tree(&ntype, node_whileloop_init_tree, node_loop_update_tree); + node_type_group_edit(&ntype, node_group_edit_get, node_group_edit_set, node_group_edit_clear); + node_type_exec_new(&ntype, group_initexec, group_freeexec, whileloop_execute); + + nodeRegisterType(lb, &ntype); +} +#endif diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_compose.c b/source/blender/nodes/texture/nodes/node_texture_compose.c similarity index 71% rename from source/blender/nodes/intern/TEX_nodes/TEX_compose.c rename to source/blender/nodes/texture/nodes/node_texture_compose.c index 6eae78ec3de..a11769173a3 100644 --- a/source/blender/nodes/intern/TEX_nodes/TEX_compose.c +++ b/source/blender/nodes/texture/nodes/node_texture_compose.c @@ -26,23 +26,23 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/TEX_nodes/TEX_compose.c +/** \file blender/nodes/texture/nodes/node_texture_compose.c * \ingroup texnodes */ -#include "../TEX_util.h" -#include "TEX_node.h" +#include "node_texture_util.h" +#include "NOD_texture.h" -static bNodeSocketType inputs[]= { - { SOCK_VALUE, 1, "Red", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f }, - { SOCK_VALUE, 1, "Green", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f }, - { SOCK_VALUE, 1, "Blue", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f }, - { SOCK_VALUE, 1, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f }, +static bNodeSocketTemplate inputs[]= { + { SOCK_FLOAT, 1, "Red", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_UNSIGNED }, + { SOCK_FLOAT, 1, "Green", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_UNSIGNED }, + { SOCK_FLOAT, 1, "Blue", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_UNSIGNED }, + { SOCK_FLOAT, 1, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_UNSIGNED }, { -1, 0, "" } }; -static bNodeSocketType outputs[]= { - { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f }, +static bNodeSocketTemplate outputs[]= { + { SOCK_RGBA, 0, "Color" }, { -1, 0, "" } }; @@ -62,8 +62,8 @@ void register_node_type_tex_compose(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, TEX_NODE_COMPOSE, "Compose RGBA", NODE_CLASS_OP_COLOR, 0, - inputs, outputs); + node_type_base(&ntype, TEX_NODE_COMPOSE, "Compose RGBA", NODE_CLASS_OP_COLOR, 0); + node_type_socket_templates(&ntype, inputs, outputs); node_type_size(&ntype, 100, 60, 150); node_type_exec(&ntype, exec); diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_coord.c b/source/blender/nodes/texture/nodes/node_texture_coord.c similarity index 86% rename from source/blender/nodes/intern/TEX_nodes/TEX_coord.c rename to source/blender/nodes/texture/nodes/node_texture_coord.c index 3c46971f0d4..b2d9cecc164 100644 --- a/source/blender/nodes/intern/TEX_nodes/TEX_coord.c +++ b/source/blender/nodes/texture/nodes/node_texture_coord.c @@ -26,16 +26,16 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/TEX_nodes/TEX_coord.c +/** \file blender/nodes/texture/nodes/node_texture_coord.c * \ingroup texnodes */ -#include "../TEX_util.h" -#include "TEX_node.h" +#include "node_texture_util.h" +#include "NOD_texture.h" -static bNodeSocketType outputs[]= { - { SOCK_VECTOR, 0, "Coordinates", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f }, +static bNodeSocketTemplate outputs[]= { + { SOCK_VECTOR, 0, "Coordinates" }, { -1, 0, "" } }; @@ -55,8 +55,8 @@ void register_node_type_tex_coord(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, TEX_NODE_COORD, "Coordinates", NODE_CLASS_INPUT, NODE_OPTIONS, - NULL, outputs); + node_type_base(&ntype, TEX_NODE_COORD, "Coordinates", NODE_CLASS_INPUT, NODE_OPTIONS); + node_type_socket_templates(&ntype, NULL, outputs); node_type_size(&ntype, 120, 110, 160); node_type_storage(&ntype, "node_coord", NULL, NULL); node_type_exec(&ntype, exec); diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_curves.c b/source/blender/nodes/texture/nodes/node_texture_curves.c similarity index 80% rename from source/blender/nodes/intern/TEX_nodes/TEX_curves.c rename to source/blender/nodes/texture/nodes/node_texture_curves.c index b7af6c748ff..af6d880cc18 100644 --- a/source/blender/nodes/intern/TEX_nodes/TEX_curves.c +++ b/source/blender/nodes/texture/nodes/node_texture_curves.c @@ -26,19 +26,19 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/TEX_nodes/TEX_curves.c +/** \file blender/nodes/texture/nodes/node_texture_curves.c * \ingroup texnodes */ -#include "../TEX_util.h" -#include "TEX_node.h" +#include "node_texture_util.h" +#include "NOD_texture.h" /* **************** CURVE Time ******************** */ /* custom1 = sfra, custom2 = efra */ -static bNodeSocketType time_outputs[]= { - { SOCK_VALUE, 0, "Value", 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f }, +static bNodeSocketTemplate time_outputs[]= { + { SOCK_FLOAT, 0, "Value" }, { -1, 0, "" } }; @@ -60,7 +60,7 @@ static void time_exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out } -static void time_init(bNode* node) +static void time_init(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { node->custom1= 1; node->custom2= 250; @@ -71,8 +71,8 @@ void register_node_type_tex_curve_time(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, TEX_NODE_CURVE_TIME, "Time", NODE_CLASS_INPUT, NODE_OPTIONS, - NULL, time_outputs); + node_type_base(&ntype, TEX_NODE_CURVE_TIME, "Time", NODE_CLASS_INPUT, NODE_OPTIONS); + node_type_socket_templates(&ntype, NULL, time_outputs); node_type_size(&ntype, 140, 100, 320); node_type_init(&ntype, time_init); node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves); @@ -82,13 +82,13 @@ void register_node_type_tex_curve_time(ListBase *lb) } /* **************** CURVE RGB ******************** */ -static bNodeSocketType rgb_inputs[]= { - { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f}, +static bNodeSocketTemplate rgb_inputs[]= { + { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f}, { -1, 0, "" } }; -static bNodeSocketType rgb_outputs[]= { - { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f}, +static bNodeSocketTemplate rgb_outputs[]= { + { SOCK_RGBA, 0, "Color"}, { -1, 0, "" } }; @@ -106,7 +106,7 @@ static void rgb_exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out) tex_output(node, in, out[0], &rgb_colorfn, data); } -static void rgb_init(bNode *node) +static void rgb_init(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { node->storage= curvemapping_add(4, 0.0f, 0.0f, 1.0f, 1.0f); } @@ -115,8 +115,8 @@ void register_node_type_tex_curve_rgb(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, TEX_NODE_CURVE_RGB, "RGB Curves", NODE_CLASS_OP_COLOR, NODE_OPTIONS, - rgb_inputs, rgb_outputs); + node_type_base(&ntype, TEX_NODE_CURVE_RGB, "RGB Curves", NODE_CLASS_OP_COLOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, rgb_inputs, rgb_outputs); node_type_size(&ntype, 200, 140, 320); node_type_init(&ntype, rgb_init); node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves); diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_decompose.c b/source/blender/nodes/texture/nodes/node_texture_decompose.c similarity index 80% rename from source/blender/nodes/intern/TEX_nodes/TEX_decompose.c rename to source/blender/nodes/texture/nodes/node_texture_decompose.c index f27d8c98716..312765f866e 100644 --- a/source/blender/nodes/intern/TEX_nodes/TEX_decompose.c +++ b/source/blender/nodes/texture/nodes/node_texture_decompose.c @@ -26,24 +26,24 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/TEX_nodes/TEX_decompose.c +/** \file blender/nodes/texture/nodes/node_texture_decompose.c * \ingroup texnodes */ -#include "../TEX_util.h" -#include "TEX_node.h" +#include "node_texture_util.h" +#include "NOD_texture.h" #include -static bNodeSocketType inputs[]= { - { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f }, +static bNodeSocketTemplate inputs[]= { + { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f }, { -1, 0, "" } }; -static bNodeSocketType outputs[]= { - { SOCK_VALUE, 0, "Red", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f }, - { SOCK_VALUE, 0, "Green", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f }, - { SOCK_VALUE, 0, "Blue", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f }, - { SOCK_VALUE, 0, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f }, +static bNodeSocketTemplate outputs[]= { + { SOCK_FLOAT, 0, "Red" }, + { SOCK_FLOAT, 0, "Green" }, + { SOCK_FLOAT, 0, "Blue" }, + { SOCK_FLOAT, 0, "Alpha" }, { -1, 0, "" } }; @@ -83,8 +83,8 @@ void register_node_type_tex_decompose(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, TEX_NODE_DECOMPOSE, "Decompose RGBA", NODE_CLASS_OP_COLOR, 0, - inputs, outputs); + node_type_base(&ntype, TEX_NODE_DECOMPOSE, "Decompose RGBA", NODE_CLASS_OP_COLOR, 0); + node_type_socket_templates(&ntype, inputs, outputs); node_type_size(&ntype, 100, 60, 150); node_type_exec(&ntype, exec); diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_distance.c b/source/blender/nodes/texture/nodes/node_texture_distance.c similarity index 84% rename from source/blender/nodes/intern/TEX_nodes/TEX_distance.c rename to source/blender/nodes/texture/nodes/node_texture_distance.c index b460844ba4a..fe524baaa96 100644 --- a/source/blender/nodes/intern/TEX_nodes/TEX_distance.c +++ b/source/blender/nodes/texture/nodes/node_texture_distance.c @@ -26,24 +26,24 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/TEX_nodes/TEX_distance.c +/** \file blender/nodes/texture/nodes/node_texture_distance.c * \ingroup texnodes */ #include #include "BLI_math.h" -#include "../TEX_util.h" -#include "TEX_node.h" +#include "node_texture_util.h" +#include "NOD_texture.h" -static bNodeSocketType inputs[]= { - { SOCK_VECTOR, 1, "Coordinate 1", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f }, - { SOCK_VECTOR, 1, "Coordinate 2", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f }, +static bNodeSocketTemplate inputs[]= { + { SOCK_VECTOR, 1, "Coordinate 1", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f, PROP_NONE }, + { SOCK_VECTOR, 1, "Coordinate 2", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f, PROP_NONE }, { -1, 0, "" } }; -static bNodeSocketType outputs[]= { - { SOCK_VALUE, 0, "Value", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f }, +static bNodeSocketTemplate outputs[]= { + { SOCK_FLOAT, 0, "Value" }, { -1, 0, "" } }; @@ -66,8 +66,8 @@ void register_node_type_tex_distance(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, TEX_NODE_DISTANCE, "Distance", NODE_CLASS_CONVERTOR, NODE_OPTIONS, - inputs, outputs); + node_type_base(&ntype, TEX_NODE_DISTANCE, "Distance", NODE_CLASS_CONVERTOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, inputs, outputs); node_type_size(&ntype, 120, 110, 160); node_type_storage(&ntype, "node_distance", NULL, NULL); node_type_exec(&ntype, exec); diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_hueSatVal.c b/source/blender/nodes/texture/nodes/node_texture_hueSatVal.c similarity index 78% rename from source/blender/nodes/intern/TEX_nodes/TEX_hueSatVal.c rename to source/blender/nodes/texture/nodes/node_texture_hueSatVal.c index 471d8db2c03..ebc2501cee3 100644 --- a/source/blender/nodes/intern/TEX_nodes/TEX_hueSatVal.c +++ b/source/blender/nodes/texture/nodes/node_texture_hueSatVal.c @@ -26,25 +26,25 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/TEX_nodes/TEX_hueSatVal.c +/** \file blender/nodes/texture/nodes/node_texture_hueSatVal.c * \ingroup texnodes */ -#include "../TEX_util.h" -#include "TEX_node.h" +#include "node_texture_util.h" +#include "NOD_texture.h" -static bNodeSocketType inputs[]= { - { SOCK_VALUE, 1, "Hue", 0.0f, 0.0f, 0.0f, 0.0f, -0.5f, 0.5f }, - { SOCK_VALUE, 1, "Saturation", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f }, - { SOCK_VALUE, 1, "Value", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f }, - { SOCK_VALUE, 1, "Factor", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f }, - { SOCK_RGBA, 1, "Color", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f }, +static bNodeSocketTemplate inputs[]= { + { SOCK_FLOAT, 1, "Hue", 0.0f, 0.0f, 0.0f, 0.0f, -0.5f, 0.5f, PROP_NONE }, + { SOCK_FLOAT, 1, "Saturation", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f, PROP_FACTOR }, + { SOCK_FLOAT, 1, "Value", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f, PROP_FACTOR }, + { SOCK_FLOAT, 1, "Factor", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR }, + { SOCK_RGBA, 1, "Color", 0.8f, 0.8f, 0.8f, 1.0f }, { -1, 0, "" } }; -static bNodeSocketType outputs[]= { - { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f }, +static bNodeSocketTemplate outputs[]= { + { SOCK_RGBA, 0, "Color" }, { -1, 0, "" } }; @@ -97,8 +97,8 @@ void register_node_type_tex_hue_sat(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, TEX_NODE_HUE_SAT, "Hue Saturation Value", NODE_CLASS_OP_COLOR, NODE_OPTIONS, - inputs, outputs); + node_type_base(&ntype, TEX_NODE_HUE_SAT, "Hue Saturation Value", NODE_CLASS_OP_COLOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, inputs, outputs); node_type_size(&ntype, 150, 80, 250); node_type_exec(&ntype, exec); diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_image.c b/source/blender/nodes/texture/nodes/node_texture_image.c similarity index 86% rename from source/blender/nodes/intern/TEX_nodes/TEX_image.c rename to source/blender/nodes/texture/nodes/node_texture_image.c index a54ca4bb119..1359cf4275f 100644 --- a/source/blender/nodes/intern/TEX_nodes/TEX_image.c +++ b/source/blender/nodes/texture/nodes/node_texture_image.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: TEX_image.c 36481 2011-05-04 11:42:25Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,16 +27,16 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/TEX_nodes/TEX_image.c +/** \file blender/nodes/texture/nodes/node_texture_image.c * \ingroup texnodes */ -#include "../TEX_util.h" -#include "TEX_node.h" +#include "node_texture_util.h" +#include "NOD_texture.h" -static bNodeSocketType outputs[]= { - { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate outputs[]= { + { SOCK_RGBA, 0, "Image"}, { -1, 0, "" } }; @@ -88,7 +88,7 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out) tex_output(node, in, out[0], &colorfn, data); } -static void init(bNode* node) +static void init(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { ImageUser *iuser= MEM_callocN(sizeof(ImageUser), "node image user"); node->storage= iuser; @@ -101,8 +101,8 @@ void register_node_type_tex_image(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, TEX_NODE_IMAGE, "Image", NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS, - NULL, outputs); + node_type_base(&ntype, TEX_NODE_IMAGE, "Image", NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS); + node_type_socket_templates(&ntype, NULL, outputs); node_type_size(&ntype, 120, 80, 300); node_type_init(&ntype, init); node_type_storage(&ntype, "ImageUser", node_free_standard_storage, node_copy_standard_storage); diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_invert.c b/source/blender/nodes/texture/nodes/node_texture_invert.c similarity index 83% rename from source/blender/nodes/intern/TEX_nodes/TEX_invert.c rename to source/blender/nodes/texture/nodes/node_texture_invert.c index e908bdcff07..8ba4f292fec 100644 --- a/source/blender/nodes/intern/TEX_nodes/TEX_invert.c +++ b/source/blender/nodes/texture/nodes/node_texture_invert.c @@ -26,22 +26,22 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/TEX_nodes/TEX_invert.c +/** \file blender/nodes/texture/nodes/node_texture_invert.c * \ingroup texnodes */ -#include "../TEX_util.h" -#include "TEX_node.h" +#include "node_texture_util.h" +#include "NOD_texture.h" /* **************** INVERT ******************** */ -static bNodeSocketType inputs[]= { - { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate inputs[]= { + { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f}, { -1, 0, "" } }; -static bNodeSocketType outputs[]= { - { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate outputs[]= { + { SOCK_RGBA, 0, "Color"}, { -1, 0, "" } }; @@ -68,8 +68,8 @@ void register_node_type_tex_invert(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, TEX_NODE_INVERT, "Invert", NODE_CLASS_OP_COLOR, NODE_OPTIONS, - inputs, outputs); + node_type_base(&ntype, TEX_NODE_INVERT, "Invert", NODE_CLASS_OP_COLOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, inputs, outputs); node_type_size(&ntype, 90, 80, 100); node_type_exec(&ntype, exec); diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_math.c b/source/blender/nodes/texture/nodes/node_texture_math.c similarity index 89% rename from source/blender/nodes/intern/TEX_nodes/TEX_math.c rename to source/blender/nodes/texture/nodes/node_texture_math.c index 18468bdd55c..182bc37978f 100644 --- a/source/blender/nodes/intern/TEX_nodes/TEX_math.c +++ b/source/blender/nodes/texture/nodes/node_texture_math.c @@ -26,24 +26,24 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/TEX_nodes/TEX_math.c +/** \file blender/nodes/texture/nodes/node_texture_math.c * \ingroup texnodes */ -#include "../TEX_util.h" -#include "TEX_node.h" +#include "node_texture_util.h" +#include "NOD_texture.h" /* **************** SCALAR MATH ******************** */ -static bNodeSocketType inputs[]= { - { SOCK_VALUE, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -100.0f, 100.0f}, - { SOCK_VALUE, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -100.0f, 100.0f}, +static bNodeSocketTemplate inputs[]= { + { SOCK_FLOAT, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -100.0f, 100.0f, PROP_NONE}, + { SOCK_FLOAT, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -100.0f, 100.0f, PROP_NONE}, { -1, 0, "" } }; -static bNodeSocketType outputs[]= { - { SOCK_VALUE, 0, "Value", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate outputs[]= { + { SOCK_FLOAT, 0, "Value"}, { -1, 0, "" } }; @@ -189,8 +189,8 @@ void register_node_type_tex_math(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, TEX_NODE_MATH, "Math", NODE_CLASS_CONVERTOR, NODE_OPTIONS, - inputs, outputs); + node_type_base(&ntype, TEX_NODE_MATH, "Math", NODE_CLASS_CONVERTOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, inputs, outputs); node_type_size(&ntype, 120, 110, 160); node_type_label(&ntype, node_math_label); node_type_storage(&ntype, "node_math", NULL, NULL); diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_mixRgb.c b/source/blender/nodes/texture/nodes/node_texture_mixRgb.c similarity index 79% rename from source/blender/nodes/intern/TEX_nodes/TEX_mixRgb.c rename to source/blender/nodes/texture/nodes/node_texture_mixRgb.c index c7668c27b99..8baac682b18 100644 --- a/source/blender/nodes/intern/TEX_nodes/TEX_mixRgb.c +++ b/source/blender/nodes/texture/nodes/node_texture_mixRgb.c @@ -26,23 +26,23 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/TEX_nodes/TEX_mixRgb.c +/** \file blender/nodes/texture/nodes/node_texture_mixRgb.c * \ingroup texnodes */ -#include "../TEX_util.h" -#include "TEX_node.h" +#include "node_texture_util.h" +#include "NOD_texture.h" /* **************** MIX RGB ******************** */ -static bNodeSocketType inputs[]= { - { SOCK_VALUE, 1, "Factor", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f }, - { SOCK_RGBA, 1, "Color1", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f }, - { SOCK_RGBA , 1, "Color2", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f }, +static bNodeSocketTemplate inputs[]= { + { SOCK_FLOAT, 1, "Factor", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR }, + { SOCK_RGBA, 1, "Color1", 0.5f, 0.5f, 0.5f, 1.0f }, + { SOCK_RGBA , 1, "Color2", 0.5f, 0.5f, 0.5f, 1.0f }, { -1, 0, "" } }; -static bNodeSocketType outputs[]= { - { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f }, +static bNodeSocketTemplate outputs[]= { + { SOCK_RGBA, 0, "Color" }, { -1, 0, "" } }; @@ -69,8 +69,8 @@ void register_node_type_tex_mix_rgb(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, TEX_NODE_MIX_RGB, "Mix", NODE_CLASS_OP_COLOR, NODE_OPTIONS, - inputs, outputs); + node_type_base(&ntype, TEX_NODE_MIX_RGB, "Mix", NODE_CLASS_OP_COLOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, inputs, outputs); node_type_size(&ntype, 100, 60, 150); node_type_label(&ntype, node_blend_label); node_type_exec(&ntype, exec); diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_output.c b/source/blender/nodes/texture/nodes/node_texture_output.c similarity index 89% rename from source/blender/nodes/intern/TEX_nodes/TEX_output.c rename to source/blender/nodes/texture/nodes/node_texture_output.c index 046ad724507..c321f5738a1 100644 --- a/source/blender/nodes/intern/TEX_nodes/TEX_output.c +++ b/source/blender/nodes/texture/nodes/node_texture_output.c @@ -26,18 +26,18 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/TEX_nodes/TEX_output.c +/** \file blender/nodes/texture/nodes/node_texture_output.c * \ingroup texnodes */ -#include "../TEX_util.h" -#include "TEX_node.h" +#include "node_texture_util.h" +#include "NOD_texture.h" /* **************** COMPOSITE ******************** */ -static bNodeSocketType inputs[]= { - { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VECTOR, 1, "Normal", 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate inputs[]= { + { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_VECTOR, 1, "Normal", 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, PROP_DIRECTION}, { -1, 0, "" } }; @@ -141,7 +141,7 @@ static void assign_index(struct bNode *node) node->custom1 = index; } -static void init(bNode *node) +static void init(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { TexNodeOutput *tno = MEM_callocN(sizeof(TexNodeOutput), "TEX_output"); node->storage= tno; @@ -162,8 +162,8 @@ void register_node_type_tex_output(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, TEX_NODE_OUTPUT, "Output", NODE_CLASS_OUTPUT, NODE_PREVIEW|NODE_OPTIONS, - inputs, NULL); + node_type_base(&ntype, TEX_NODE_OUTPUT, "Output", NODE_CLASS_OUTPUT, NODE_PREVIEW|NODE_OPTIONS); + node_type_socket_templates(&ntype, inputs, NULL); node_type_size(&ntype, 150, 60, 200); node_type_init(&ntype, init); node_type_storage(&ntype, "TexNodeOutput", node_free_standard_storage, copy); diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_proc.c b/source/blender/nodes/texture/nodes/node_texture_proc.c similarity index 72% rename from source/blender/nodes/intern/TEX_nodes/TEX_proc.c rename to source/blender/nodes/texture/nodes/node_texture_proc.c index 294c1f7322f..8b4c25d85c9 100644 --- a/source/blender/nodes/intern/TEX_nodes/TEX_proc.c +++ b/source/blender/nodes/texture/nodes/node_texture_proc.c @@ -26,13 +26,13 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/TEX_nodes/TEX_proc.c +/** \file blender/nodes/texture/nodes/node_texture_proc.c * \ingroup texnodes */ -#include "../TEX_util.h" -#include "TEX_node.h" +#include "node_texture_util.h" +#include "NOD_texture.h" #include "RE_shader_ext.h" @@ -41,21 +41,21 @@ */ -static bNodeSocketType outputs_both[]= { - { SOCK_RGBA, 0, "Color", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f }, - { SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f }, +static bNodeSocketTemplate outputs_both[]= { + { SOCK_RGBA, 0, "Color", 1.0f, 0.0f, 0.0f, 1.0f }, + { SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, PROP_DIRECTION }, { -1, 0, "" } }; -static bNodeSocketType outputs_color_only[]= { - { SOCK_RGBA, 0, "Color", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f }, +static bNodeSocketTemplate outputs_color_only[]= { + { SOCK_RGBA, 0, "Color" }, { -1, 0, "" } }; /* Inputs common to all, #defined because nodes will need their own inputs too */ #define I 2 /* count */ #define COMMON_INPUTS \ - { SOCK_RGBA, 1, "Color 1", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f }, \ - { SOCK_RGBA, 1, "Color 2", 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f } + { SOCK_RGBA, 1, "Color 1", 0.0f, 0.0f, 0.0f, 1.0f }, \ + { SOCK_RGBA, 1, "Color 2", 1.0f, 1.0f, 1.0f, 1.0f } /* Calls multitex and copies the result to the outputs. Called by xxx_exec, which handles inputs. */ static void do_proc(float *result, TexParams *p, float *col1, float *col2, char is_normal, Tex *tex, short thread) @@ -139,15 +139,15 @@ static int count_outputs(bNode *node) /* --- VORONOI -- */ -static bNodeSocketType voronoi_inputs[]= { +static bNodeSocketTemplate voronoi_inputs[]= { COMMON_INPUTS, - { SOCK_VALUE, 1, "W1", 1.0f, 0.0f, 0.0f, 0.0f, -2.0f, 2.0f }, - { SOCK_VALUE, 1, "W2", 0.0f, 0.0f, 0.0f, 0.0f, -2.0f, 2.0f }, - { SOCK_VALUE, 1, "W3", 0.0f, 0.0f, 0.0f, 0.0f, -2.0f, 2.0f }, - { SOCK_VALUE, 1, "W4", 0.0f, 0.0f, 0.0f, 0.0f, -2.0f, 2.0f }, + { SOCK_FLOAT, 1, "W1", 1.0f, 0.0f, 0.0f, 0.0f, -2.0f, 2.0f, PROP_NONE }, + { SOCK_FLOAT, 1, "W2", 0.0f, 0.0f, 0.0f, 0.0f, -2.0f, 2.0f, PROP_NONE }, + { SOCK_FLOAT, 1, "W3", 0.0f, 0.0f, 0.0f, 0.0f, -2.0f, 2.0f, PROP_NONE }, + { SOCK_FLOAT, 1, "W4", 0.0f, 0.0f, 0.0f, 0.0f, -2.0f, 2.0f, PROP_NONE }, - { SOCK_VALUE, 1, "iScale", 1.0f, 0.0f, 0.0f, 0.0f, 0.01f, 10.0f }, - { SOCK_VALUE, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 4.0f }, + { SOCK_FLOAT, 1, "iScale", 1.0f, 0.0f, 0.0f, 0.0f, 0.01f, 10.0f, PROP_UNSIGNED }, + { SOCK_FLOAT, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 4.0f, PROP_UNSIGNED }, { -1, 0, "" } }; @@ -164,7 +164,7 @@ static void voronoi_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short th ProcDef(voronoi) /* --- BLEND -- */ -static bNodeSocketType blend_inputs[]= { +static bNodeSocketTemplate blend_inputs[]= { COMMON_INPUTS, { -1, 0, "" } }; @@ -172,9 +172,9 @@ ProcNoInputs(blend) ProcDef(blend) /* -- MAGIC -- */ -static bNodeSocketType magic_inputs[]= { +static bNodeSocketTemplate magic_inputs[]= { COMMON_INPUTS, - { SOCK_VALUE, 1, "Turbulence", 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 200.0f }, + { SOCK_FLOAT, 1, "Turbulence", 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 200.0f, PROP_UNSIGNED }, { -1, 0, "" } }; static void magic_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thread) @@ -184,10 +184,10 @@ static void magic_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thre ProcDef(magic) /* --- MARBLE --- */ -static bNodeSocketType marble_inputs[]= { +static bNodeSocketTemplate marble_inputs[]= { COMMON_INPUTS, - { SOCK_VALUE, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f }, - { SOCK_VALUE, 1, "Turbulence", 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 200.0f }, + { SOCK_FLOAT, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f, PROP_UNSIGNED }, + { SOCK_FLOAT, 1, "Turbulence", 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 200.0f, PROP_UNSIGNED }, { -1, 0, "" } }; static void marble_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thread) @@ -198,9 +198,9 @@ static void marble_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thr ProcDef(marble) /* --- CLOUDS --- */ -static bNodeSocketType clouds_inputs[]= { +static bNodeSocketTemplate clouds_inputs[]= { COMMON_INPUTS, - { SOCK_VALUE, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f }, + { SOCK_FLOAT, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f, PROP_UNSIGNED }, { -1, 0, "" } }; static void clouds_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thread) @@ -210,10 +210,10 @@ static void clouds_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thr ProcDef(clouds) /* --- DISTORTED NOISE --- */ -static bNodeSocketType distnoise_inputs[]= { +static bNodeSocketTemplate distnoise_inputs[]= { COMMON_INPUTS, - { SOCK_VALUE, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f }, - { SOCK_VALUE, 1, "Distortion", 1.00f, 0.0f, 0.0f, 0.0f, 0.0000f, 10.0f }, + { SOCK_FLOAT, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f, PROP_UNSIGNED }, + { SOCK_FLOAT, 1, "Distortion", 1.00f, 0.0f, 0.0f, 0.0f, 0.0000f, 10.0f, PROP_UNSIGNED }, { -1, 0, "" } }; static void distnoise_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thread) @@ -224,10 +224,10 @@ static void distnoise_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short ProcDef(distnoise) /* --- WOOD --- */ -static bNodeSocketType wood_inputs[]= { +static bNodeSocketTemplate wood_inputs[]= { COMMON_INPUTS, - { SOCK_VALUE, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f }, - { SOCK_VALUE, 1, "Turbulence", 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 200.0f }, + { SOCK_FLOAT, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f, PROP_UNSIGNED }, + { SOCK_FLOAT, 1, "Turbulence", 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 200.0f, PROP_UNSIGNED }, { -1, 0, "" } }; static void wood_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thread) @@ -238,14 +238,14 @@ static void wood_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short threa ProcDef(wood) /* --- MUSGRAVE --- */ -static bNodeSocketType musgrave_inputs[]= { +static bNodeSocketTemplate musgrave_inputs[]= { COMMON_INPUTS, - { SOCK_VALUE, 1, "H", 1.0f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f }, - { SOCK_VALUE, 1, "Lacunarity", 2.0f, 0.0f, 0.0f, 0.0f, 0.0f, 6.0f }, - { SOCK_VALUE, 1, "Octaves", 2.0f, 0.0f, 0.0f, 0.0f, 0.0f, 8.0f }, + { SOCK_FLOAT, 1, "H", 1.0f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f, PROP_UNSIGNED }, + { SOCK_FLOAT, 1, "Lacunarity", 2.0f, 0.0f, 0.0f, 0.0f, 0.0f, 6.0f, PROP_UNSIGNED }, + { SOCK_FLOAT, 1, "Octaves", 2.0f, 0.0f, 0.0f, 0.0f, 0.0f, 8.0f, PROP_UNSIGNED }, - { SOCK_VALUE, 1, "iScale", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 10.0f }, - { SOCK_VALUE, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f }, + { SOCK_FLOAT, 1, "iScale", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 10.0f, PROP_UNSIGNED }, + { SOCK_FLOAT, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f, PROP_UNSIGNED }, { -1, 0, "" } }; static void musgrave_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thread) @@ -259,7 +259,7 @@ static void musgrave_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short t ProcDef(musgrave) /* --- NOISE --- */ -static bNodeSocketType noise_inputs[]= { +static bNodeSocketTemplate noise_inputs[]= { COMMON_INPUTS, { -1, 0, "" } }; @@ -267,10 +267,10 @@ ProcNoInputs(noise) ProcDef(noise) /* --- STUCCI --- */ -static bNodeSocketType stucci_inputs[]= { +static bNodeSocketTemplate stucci_inputs[]= { COMMON_INPUTS, - { SOCK_VALUE, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f }, - { SOCK_VALUE, 1, "Turbulence", 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 200.0f }, + { SOCK_FLOAT, 1, "Size", 0.25f, 0.0f, 0.0f, 0.0f, 0.0001f, 2.0f, PROP_UNSIGNED }, + { SOCK_FLOAT, 1, "Turbulence", 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 200.0f, PROP_UNSIGNED }, { -1, 0, "" } }; static void stucci_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thread) @@ -282,7 +282,7 @@ ProcDef(stucci) /* --- */ -static void init(bNode *node) +static void init(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { Tex *tex = MEM_callocN(sizeof(Tex), "Tex"); node->storage= tex; @@ -301,7 +301,8 @@ void register_node_type_tex_proc_##name(ListBase *lb) \ { \ static bNodeType ntype; \ \ - node_type_base(&ntype, TEX_NODE_PROC+TEXTYPE, Name, NODE_CLASS_TEXTURE, NODE_PREVIEW|NODE_OPTIONS, name##_inputs, outputs); \ + node_type_base(&ntype, TEX_NODE_PROC+TEXTYPE, Name, NODE_CLASS_TEXTURE, NODE_PREVIEW|NODE_OPTIONS); \ + node_type_socket_templates(&ntype, name##_inputs, outputs); \ node_type_size(&ntype, 140, 80, 140); \ node_type_init(&ntype, init); \ node_type_storage(&ntype, "Tex", node_free_standard_storage, node_copy_standard_storage); \ diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_rotate.c b/source/blender/nodes/texture/nodes/node_texture_rotate.c similarity index 84% rename from source/blender/nodes/intern/TEX_nodes/TEX_rotate.c rename to source/blender/nodes/texture/nodes/node_texture_rotate.c index 1be6152a2b3..a788b9cbbde 100644 --- a/source/blender/nodes/intern/TEX_nodes/TEX_rotate.c +++ b/source/blender/nodes/texture/nodes/node_texture_rotate.c @@ -26,25 +26,25 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/TEX_nodes/TEX_rotate.c +/** \file blender/nodes/texture/nodes/node_texture_rotate.c * \ingroup texnodes */ #include -#include "../TEX_util.h" -#include "TEX_node.h" +#include "node_texture_util.h" +#include "NOD_texture.h" -static bNodeSocketType inputs[]= { - { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VALUE, 1, "Turns", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f }, - { SOCK_VECTOR, 1, "Axis", 0.0f, 0.0f, 1.0f, 0.0f, -1.0f, 1.0f }, +static bNodeSocketTemplate inputs[]= { + { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_FLOAT, 1, "Turns", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f, PROP_NONE }, + { SOCK_VECTOR, 1, "Axis", 0.0f, 0.0f, 1.0f, 0.0f, -1.0f, 1.0f, PROP_DIRECTION }, { -1, 0, "" } }; -static bNodeSocketType outputs[]= { - { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate outputs[]= { + { SOCK_RGBA, 0, "Color"}, { -1, 0, "" } }; @@ -100,8 +100,8 @@ void register_node_type_tex_rotate(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, TEX_NODE_ROTATE, "Rotate", NODE_CLASS_DISTORT, NODE_OPTIONS, - inputs, outputs); + node_type_base(&ntype, TEX_NODE_ROTATE, "Rotate", NODE_CLASS_DISTORT, NODE_OPTIONS); + node_type_socket_templates(&ntype, inputs, outputs); node_type_size(&ntype, 140, 100, 320); node_type_exec(&ntype, exec); diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_scale.c b/source/blender/nodes/texture/nodes/node_texture_scale.c similarity index 85% rename from source/blender/nodes/intern/TEX_nodes/TEX_scale.c rename to source/blender/nodes/texture/nodes/node_texture_scale.c index cfffcfda2e5..136dde0d52f 100644 --- a/source/blender/nodes/intern/TEX_nodes/TEX_scale.c +++ b/source/blender/nodes/texture/nodes/node_texture_scale.c @@ -26,22 +26,22 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/TEX_nodes/TEX_scale.c +/** \file blender/nodes/texture/nodes/node_texture_scale.c * \ingroup texnodes */ #include -#include "../TEX_util.h" +#include "node_texture_util.h" -static bNodeSocketType inputs[]= { - { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f }, - { SOCK_VECTOR, 1, "Scale", 1.0f, 1.0f, 1.0f, 0.0f, -10.0f, 10.0f }, +static bNodeSocketTemplate inputs[]= { + { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f }, + { SOCK_VECTOR, 1, "Scale", 1.0f, 1.0f, 1.0f, 0.0f, -10.0f, 10.0f, PROP_FACTOR }, { -1, 0, "" } }; -static bNodeSocketType outputs[]= { - { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate outputs[]= { + { SOCK_RGBA, 0, "Color"}, { -1, 0, "" } }; @@ -73,8 +73,8 @@ void register_node_type_tex_scale(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, TEX_NODE_SCALE, "Scale", NODE_CLASS_DISTORT, NODE_OPTIONS, - inputs, outputs); + node_type_base(&ntype, TEX_NODE_SCALE, "Scale", NODE_CLASS_DISTORT, NODE_OPTIONS); + node_type_socket_templates(&ntype, inputs, outputs); node_type_size(&ntype, 90, 80, 100); node_type_exec(&ntype, exec); diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_texture.c b/source/blender/nodes/texture/nodes/node_texture_texture.c similarity index 84% rename from source/blender/nodes/intern/TEX_nodes/TEX_texture.c rename to source/blender/nodes/texture/nodes/node_texture_texture.c index c58595866af..10b9b8979f8 100644 --- a/source/blender/nodes/intern/TEX_nodes/TEX_texture.c +++ b/source/blender/nodes/texture/nodes/node_texture_texture.c @@ -26,24 +26,24 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/TEX_nodes/TEX_texture.c +/** \file blender/nodes/texture/nodes/node_texture_texture.c * \ingroup texnodes */ -#include "../TEX_util.h" -#include "TEX_node.h" +#include "node_texture_util.h" +#include "NOD_texture.h" #include "RE_shader_ext.h" -static bNodeSocketType inputs[]= { - { SOCK_RGBA, 1, "Color1", 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f }, - { SOCK_RGBA, 1, "Color2", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f }, +static bNodeSocketTemplate inputs[]= { + { SOCK_RGBA, 1, "Color1", 1.0f, 1.0f, 1.0f, 1.0f }, + { SOCK_RGBA, 1, "Color2", 0.0f, 0.0f, 0.0f, 1.0f }, { -1, 0, "" } }; -static bNodeSocketType outputs[]= { - { SOCK_RGBA, 0, "Color", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f }, +static bNodeSocketTemplate outputs[]= { + { SOCK_RGBA, 0, "Color" }, { -1, 0, "" } }; @@ -53,7 +53,7 @@ static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, shor static float red[] = {1,0,0,1}; static float white[] = {1,1,1,1}; float co[3], dxt[3], dyt[3]; - + copy_v3_v3(co, p->co); copy_v3_v3(dxt, p->dxt); copy_v3_v3(dyt, p->dyt); @@ -70,7 +70,7 @@ static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, shor tex_input_rgba(col1, in[0], p, thread); tex_input_rgba(col2, in[1], p, thread); - + texres.nor = nor; textype = multitex_nodes(nodetex, co, dxt, dyt, p->osatex, &texres, thread, 0, p->shi, p->mtex); @@ -94,8 +94,8 @@ void register_node_type_tex_texture(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, TEX_NODE_TEXTURE, "Texture", NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS, - inputs, outputs); + node_type_base(&ntype, TEX_NODE_TEXTURE, "Texture", NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS); + node_type_socket_templates(&ntype, inputs, outputs); node_type_size(&ntype, 120, 80, 240); node_type_exec(&ntype, exec); diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_translate.c b/source/blender/nodes/texture/nodes/node_texture_translate.c similarity index 82% rename from source/blender/nodes/intern/TEX_nodes/TEX_translate.c rename to source/blender/nodes/texture/nodes/node_texture_translate.c index 8f7d6d837d7..395404a9411 100644 --- a/source/blender/nodes/intern/TEX_nodes/TEX_translate.c +++ b/source/blender/nodes/texture/nodes/node_texture_translate.c @@ -26,23 +26,23 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/TEX_nodes/TEX_translate.c +/** \file blender/nodes/texture/nodes/node_texture_translate.c * \ingroup texnodes */ #include -#include "../TEX_util.h" -#include "TEX_node.h" +#include "node_texture_util.h" +#include "NOD_texture.h" -static bNodeSocketType inputs[]= { - { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, - { SOCK_VECTOR, 1, "Offset", 0.0f, 0.0f, 0.0f, 0.0f, -10000.0f, 10000.0f }, +static bNodeSocketTemplate inputs[]= { + { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_VECTOR, 1, "Offset", 0.0f, 0.0f, 0.0f, 0.0f, -10000.0f, 10000.0f, PROP_TRANSLATION }, { -1, 0, "" } }; -static bNodeSocketType outputs[]= { - { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate outputs[]= { + { SOCK_RGBA, 0, "Color"}, { -1, 0, "" } }; @@ -69,8 +69,8 @@ void register_node_type_tex_translate(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, TEX_NODE_TRANSLATE, "Translate", NODE_CLASS_DISTORT, NODE_OPTIONS, - inputs, outputs); + node_type_base(&ntype, TEX_NODE_TRANSLATE, "Translate", NODE_CLASS_DISTORT, NODE_OPTIONS); + node_type_socket_templates(&ntype, inputs, outputs); node_type_size(&ntype, 90, 80, 100); node_type_exec(&ntype, exec); diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_valToNor.c b/source/blender/nodes/texture/nodes/node_texture_valToNor.c similarity index 81% rename from source/blender/nodes/intern/TEX_nodes/TEX_valToNor.c rename to source/blender/nodes/texture/nodes/node_texture_valToNor.c index e430c0c9a95..62b457bc862 100644 --- a/source/blender/nodes/intern/TEX_nodes/TEX_valToNor.c +++ b/source/blender/nodes/texture/nodes/node_texture_valToNor.c @@ -26,22 +26,22 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/TEX_nodes/TEX_valToNor.c +/** \file blender/nodes/texture/nodes/node_texture_valToNor.c * \ingroup texnodes */ -#include "../TEX_util.h" -#include "TEX_node.h" +#include "node_texture_util.h" +#include "NOD_texture.h" -static bNodeSocketType inputs[]= { - { SOCK_VALUE, 1, "Val", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f }, - { SOCK_VALUE, 1, "Nabla", 0.025f, 0.0f, 0.0f, 0.0f, 0.001f, 0.1f }, +static bNodeSocketTemplate inputs[]= { + { SOCK_FLOAT, 1, "Val", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_NONE }, + { SOCK_FLOAT, 1, "Nabla", 0.025f, 0.0f, 0.0f, 0.0f, 0.001f, 0.1f, PROP_UNSIGNED }, { -1, 0, "" } }; -static bNodeSocketType outputs[]= { - { SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f }, +static bNodeSocketTemplate outputs[]= { + { SOCK_VECTOR, 0, "Normal" }, { -1, 0, "" } }; @@ -85,8 +85,8 @@ void register_node_type_tex_valtonor(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, TEX_NODE_VALTONOR, "Value to Normal", NODE_CLASS_CONVERTOR, NODE_OPTIONS, - inputs, outputs); + node_type_base(&ntype, TEX_NODE_VALTONOR, "Value to Normal", NODE_CLASS_CONVERTOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, inputs, outputs); node_type_size(&ntype, 90, 80, 100); node_type_exec(&ntype, exec); diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_valToRgb.c b/source/blender/nodes/texture/nodes/node_texture_valToRgb.c similarity index 77% rename from source/blender/nodes/intern/TEX_nodes/TEX_valToRgb.c rename to source/blender/nodes/texture/nodes/node_texture_valToRgb.c index 8f59828081c..caca6fa97a4 100644 --- a/source/blender/nodes/intern/TEX_nodes/TEX_valToRgb.c +++ b/source/blender/nodes/texture/nodes/node_texture_valToRgb.c @@ -1,5 +1,5 @@ /* - * $Id$ + * $Id: TEX_valToRgb.c 36593 2011-05-10 11:19:26Z lukastoenne $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -27,21 +27,21 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/TEX_nodes/TEX_valToRgb.c +/** \file blender/nodes/texture/nodes/node_texture_valToRgb.c * \ingroup texnodes */ -#include "../TEX_util.h" -#include "TEX_node.h" +#include "node_texture_util.h" +#include "NOD_texture.h" /* **************** VALTORGB ******************** */ -static bNodeSocketType valtorgb_in[]= { - { SOCK_VALUE, 1, "Fac", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate valtorgb_in[]= { + { SOCK_FLOAT, 1, "Fac", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR}, { -1, 0, "" } }; -static bNodeSocketType valtorgb_out[]= { - { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate valtorgb_out[]= { + { SOCK_RGBA, 0, "Color"}, { -1, 0, "" } }; @@ -59,7 +59,7 @@ static void valtorgb_exec(void *data, bNode *node, bNodeStack **in, bNodeStack * tex_output(node, in, out[0], &valtorgb_colorfn, data); } -static void valtorgb_init(bNode *node) +static void valtorgb_init(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp)) { node->storage = add_colorband(1); } @@ -68,8 +68,8 @@ void register_node_type_tex_valtorgb(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, TEX_NODE_VALTORGB, "ColorRamp", NODE_CLASS_CONVERTOR, NODE_OPTIONS, - valtorgb_in, valtorgb_out); + node_type_base(&ntype, TEX_NODE_VALTORGB, "ColorRamp", NODE_CLASS_CONVERTOR, NODE_OPTIONS); + node_type_socket_templates(&ntype, valtorgb_in, valtorgb_out); node_type_size(&ntype, 240, 200, 300); node_type_init(&ntype, valtorgb_init); node_type_storage(&ntype, "ColorBand", node_free_standard_storage, node_copy_standard_storage); @@ -79,12 +79,12 @@ void register_node_type_tex_valtorgb(ListBase *lb) } /* **************** RGBTOBW ******************** */ -static bNodeSocketType rgbtobw_in[]= { +static bNodeSocketTemplate rgbtobw_in[]= { { SOCK_RGBA, 1, "Color", 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f}, { -1, 0, "" } }; -static bNodeSocketType rgbtobw_out[]= { - { SOCK_VALUE, 0, "Val", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, +static bNodeSocketTemplate rgbtobw_out[]= { + { SOCK_FLOAT, 0, "Val", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, { -1, 0, "" } }; @@ -106,8 +106,8 @@ void register_node_type_tex_rgbtobw(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, TEX_NODE_RGBTOBW, "RGB to BW", NODE_CLASS_CONVERTOR, 0, - rgbtobw_in, rgbtobw_out); + node_type_base(&ntype, TEX_NODE_RGBTOBW, "RGB to BW", NODE_CLASS_CONVERTOR, 0); + node_type_socket_templates(&ntype, rgbtobw_in, rgbtobw_out); node_type_size(&ntype, 80, 40, 120); node_type_exec(&ntype, rgbtobw_exec); diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_viewer.c b/source/blender/nodes/texture/nodes/node_texture_viewer.c similarity index 83% rename from source/blender/nodes/intern/TEX_nodes/TEX_viewer.c rename to source/blender/nodes/texture/nodes/node_texture_viewer.c index e917e525e17..01734f56937 100644 --- a/source/blender/nodes/intern/TEX_nodes/TEX_viewer.c +++ b/source/blender/nodes/texture/nodes/node_texture_viewer.c @@ -26,20 +26,20 @@ * ***** END GPL LICENSE BLOCK ***** */ -/** \file blender/nodes/intern/TEX_nodes/TEX_viewer.c +/** \file blender/nodes/texture/nodes/node_texture_viewer.c * \ingroup texnodes */ -#include "../TEX_util.h" -#include "TEX_node.h" +#include "node_texture_util.h" +#include "NOD_texture.h" #include -static bNodeSocketType inputs[]= { - { SOCK_RGBA, 1, "Color", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f }, +static bNodeSocketTemplate inputs[]= { + { SOCK_RGBA, 1, "Color", 1.0f, 0.0f, 0.0f, 1.0f }, { -1, 0, "" } }; -static bNodeSocketType outputs[]= { +static bNodeSocketTemplate outputs[]= { { -1, 0, "" } }; @@ -61,8 +61,8 @@ void register_node_type_tex_viewer(ListBase *lb) { static bNodeType ntype; - node_type_base(&ntype, TEX_NODE_VIEWER, "Viewer", NODE_CLASS_OUTPUT, NODE_PREVIEW, - inputs, outputs); + node_type_base(&ntype, TEX_NODE_VIEWER, "Viewer", NODE_CLASS_OUTPUT, NODE_PREVIEW); + node_type_socket_templates(&ntype, inputs, outputs); node_type_size(&ntype, 100, 60, 150); node_type_exec(&ntype, exec); diff --git a/source/blender/render/intern/source/render_texture.c b/source/blender/render/intern/source/render_texture.c index fbbb33d0172..e35b3e53f5b 100644 --- a/source/blender/render/intern/source/render_texture.c +++ b/source/blender/render/intern/source/render_texture.c @@ -125,7 +125,7 @@ static void init_render_texture(Render *re, Tex *tex) } if(tex->nodetree && tex->use_nodes) { - ntreeBeginExecTree(tex->nodetree); /* has internal flag to detect it only does it once */ + ntreeTexBeginExecTree(tex->nodetree); /* has internal flag to detect it only does it once */ } } @@ -144,8 +144,8 @@ void init_render_textures(Render *re) static void end_render_texture(Tex *tex) { - if(tex && tex->use_nodes && tex->nodetree) - ntreeEndExecTree(tex->nodetree); + if(tex && tex->use_nodes && tex->nodetree && tex->nodetree->execdata) + ntreeTexEndExecTree(tex->nodetree->execdata); } void end_render_textures(Render *re) diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt index 315cd5312cf..bf2808ba4c0 100644 --- a/source/creator/CMakeLists.txt +++ b/source/creator/CMakeLists.txt @@ -718,7 +718,6 @@ if(WITH_MOD_FLUID) list(APPEND BLENDER_LINK_LIBS bf_intern_elbeem) endif() - #if(UNIX) # Sort libraries set(BLENDER_SORTED_LIBS From 3efe8670515a05215b7da427aee52605582e6acf Mon Sep 17 00:00:00 2001 From: Nathan Letwory Date: Mon, 5 Sep 2011 21:52:06 +0000 Subject: [PATCH 086/182] Put dead zone printout behind debug. --- intern/ghost/intern/GHOST_NDOFManager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/intern/ghost/intern/GHOST_NDOFManager.cpp b/intern/ghost/intern/GHOST_NDOFManager.cpp index a24ccc3ff6c..51525df003e 100644 --- a/intern/ghost/intern/GHOST_NDOFManager.cpp +++ b/intern/ghost/intern/GHOST_NDOFManager.cpp @@ -366,11 +366,11 @@ void GHOST_NDOFManager::setDeadZone(float dz) } else if (dz > 0.5f) { // warn the rogue user/programmer, but allow it - printf("ndof: dead zone of %.2f is rather high...\n", dz); + GHOST_PRINT("ndof: dead zone of %.2f is rather high...\n", dz); } m_deadZone = dz; - printf("ndof: dead zone set to %.2f\n", dz); + GHOST_PRINT("ndof: dead zone set to %.2f\n", dz); } static bool atHomePosition(GHOST_TEventNDOFMotionData* ndof) From 82f19e8df217f62931b8f8a68725fcdea13fcbe2 Mon Sep 17 00:00:00 2001 From: Lukas Toenne Date: Mon, 5 Sep 2011 22:04:23 +0000 Subject: [PATCH 087/182] Fix for blender player linker bug, missing a stub function used in RNA. --- source/blenderplayer/bad_level_call_stubs/stubs.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c index a04fdfa0f74..56ebb71a7ac 100644 --- a/source/blenderplayer/bad_level_call_stubs/stubs.c +++ b/source/blenderplayer/bad_level_call_stubs/stubs.c @@ -247,6 +247,7 @@ void WM_cursor_wait (int val) {} void ED_node_texture_default(struct Tex *tx){} void ED_node_changed_update(struct bContext *C, struct bNode *node){} void ED_node_generic_update(struct Main *bmain, struct bNodeTree *ntree, struct bNode *node){} +void ED_node_tree_update(struct SpaceNode *snode, struct Scene *scene){} void ED_view3d_scene_layers_update(struct Main *bmain, struct Scene *scene){} int ED_view3d_scene_layer_set(int lay, const int *values){return 0;} void ED_view3d_quadview_update(struct ScrArea *sa, struct ARegion *ar){} From 271f069b8531b1fa01539dcab4675ff3b8e4485b Mon Sep 17 00:00:00 2001 From: "Guillermo S. Romero" Date: Mon, 5 Sep 2011 22:04:30 +0000 Subject: [PATCH 088/182] SVN maintenance. --- source/blender/nodes/NOD_composite.h | 2 +- source/blender/nodes/NOD_shader.h | 2 +- source/blender/nodes/NOD_socket.h | 1 + source/blender/nodes/NOD_texture.h | 2 +- source/blender/nodes/composite/node_composite_tree.c | 2 ++ source/blender/nodes/composite/node_composite_util.c | 2 +- source/blender/nodes/composite/node_composite_util.h | 2 +- source/blender/nodes/composite/nodes/node_composite_alphaOver.c | 2 +- .../nodes/composite/nodes/node_composite_bilateralblur.c | 2 +- source/blender/nodes/composite/nodes/node_composite_blur.c | 2 +- .../blender/nodes/composite/nodes/node_composite_brightness.c | 2 +- .../blender/nodes/composite/nodes/node_composite_channelMatte.c | 2 +- .../blender/nodes/composite/nodes/node_composite_chromaMatte.c | 2 +- .../blender/nodes/composite/nodes/node_composite_colorMatte.c | 2 +- .../blender/nodes/composite/nodes/node_composite_colorSpill.c | 2 +- .../blender/nodes/composite/nodes/node_composite_colorbalance.c | 2 +- source/blender/nodes/composite/nodes/node_composite_common.c | 2 +- source/blender/nodes/composite/nodes/node_composite_composite.c | 2 +- source/blender/nodes/composite/nodes/node_composite_crop.c | 2 +- source/blender/nodes/composite/nodes/node_composite_curves.c | 2 +- source/blender/nodes/composite/nodes/node_composite_defocus.c | 2 +- source/blender/nodes/composite/nodes/node_composite_diffMatte.c | 2 +- source/blender/nodes/composite/nodes/node_composite_dilate.c | 2 +- .../nodes/composite/nodes/node_composite_directionalblur.c | 1 + source/blender/nodes/composite/nodes/node_composite_displace.c | 2 +- .../nodes/composite/nodes/node_composite_distanceMatte.c | 2 +- source/blender/nodes/composite/nodes/node_composite_filter.c | 2 +- source/blender/nodes/composite/nodes/node_composite_flip.c | 2 +- source/blender/nodes/composite/nodes/node_composite_gamma.c | 2 +- source/blender/nodes/composite/nodes/node_composite_glare.c | 1 + source/blender/nodes/composite/nodes/node_composite_hueSatVal.c | 2 +- .../blender/nodes/composite/nodes/node_composite_huecorrect.c | 2 +- source/blender/nodes/composite/nodes/node_composite_idMask.c | 2 +- source/blender/nodes/composite/nodes/node_composite_image.c | 2 +- source/blender/nodes/composite/nodes/node_composite_invert.c | 2 +- source/blender/nodes/composite/nodes/node_composite_lensdist.c | 1 + source/blender/nodes/composite/nodes/node_composite_levels.c | 2 +- .../blender/nodes/composite/nodes/node_composite_lummaMatte.c | 2 +- source/blender/nodes/composite/nodes/node_composite_mapUV.c | 2 +- source/blender/nodes/composite/nodes/node_composite_mapValue.c | 2 +- source/blender/nodes/composite/nodes/node_composite_math.c | 2 +- source/blender/nodes/composite/nodes/node_composite_mixrgb.c | 2 +- source/blender/nodes/composite/nodes/node_composite_normal.c | 2 +- source/blender/nodes/composite/nodes/node_composite_normalize.c | 2 +- .../blender/nodes/composite/nodes/node_composite_outputFile.c | 2 +- source/blender/nodes/composite/nodes/node_composite_premulkey.c | 2 +- source/blender/nodes/composite/nodes/node_composite_rgb.c | 2 +- source/blender/nodes/composite/nodes/node_composite_rotate.c | 2 +- source/blender/nodes/composite/nodes/node_composite_scale.c | 2 +- .../blender/nodes/composite/nodes/node_composite_sepcombHSVA.c | 2 +- .../blender/nodes/composite/nodes/node_composite_sepcombRGBA.c | 2 +- .../blender/nodes/composite/nodes/node_composite_sepcombYCCA.c | 2 +- .../blender/nodes/composite/nodes/node_composite_sepcombYUVA.c | 2 +- source/blender/nodes/composite/nodes/node_composite_setalpha.c | 2 +- .../blender/nodes/composite/nodes/node_composite_splitViewer.c | 2 +- source/blender/nodes/composite/nodes/node_composite_texture.c | 2 +- source/blender/nodes/composite/nodes/node_composite_tonemap.c | 1 + source/blender/nodes/composite/nodes/node_composite_translate.c | 2 +- source/blender/nodes/composite/nodes/node_composite_valToRgb.c | 2 +- source/blender/nodes/composite/nodes/node_composite_value.c | 2 +- source/blender/nodes/composite/nodes/node_composite_vecBlur.c | 2 +- source/blender/nodes/composite/nodes/node_composite_viewer.c | 2 +- source/blender/nodes/composite/nodes/node_composite_zcombine.c | 2 +- source/blender/nodes/intern/node_common.c | 1 + source/blender/nodes/intern/node_common.h | 1 + source/blender/nodes/intern/node_exec.c | 1 + source/blender/nodes/intern/node_exec.h | 1 + source/blender/nodes/intern/node_socket.c | 1 + source/blender/nodes/shader/node_shader_tree.c | 2 ++ source/blender/nodes/shader/node_shader_util.c | 2 +- source/blender/nodes/shader/node_shader_util.h | 2 +- source/blender/nodes/shader/nodes/node_shader_camera.c | 2 +- source/blender/nodes/shader/nodes/node_shader_common.c | 2 +- source/blender/nodes/shader/nodes/node_shader_curves.c | 2 +- source/blender/nodes/shader/nodes/node_shader_dynamic.c | 2 +- source/blender/nodes/shader/nodes/node_shader_geom.c | 2 +- source/blender/nodes/shader/nodes/node_shader_hueSatVal.c | 2 +- source/blender/nodes/shader/nodes/node_shader_invert.c | 2 +- source/blender/nodes/shader/nodes/node_shader_mapping.c | 2 +- source/blender/nodes/shader/nodes/node_shader_material.c | 2 +- source/blender/nodes/shader/nodes/node_shader_math.c | 2 +- source/blender/nodes/shader/nodes/node_shader_mixRgb.c | 2 +- source/blender/nodes/shader/nodes/node_shader_normal.c | 2 +- source/blender/nodes/shader/nodes/node_shader_output.c | 2 +- source/blender/nodes/shader/nodes/node_shader_rgb.c | 2 +- source/blender/nodes/shader/nodes/node_shader_sepcombRGB.c | 2 +- source/blender/nodes/shader/nodes/node_shader_squeeze.c | 2 +- source/blender/nodes/shader/nodes/node_shader_texture.c | 2 +- source/blender/nodes/shader/nodes/node_shader_valToRgb.c | 2 +- source/blender/nodes/shader/nodes/node_shader_value.c | 2 +- source/blender/nodes/shader/nodes/node_shader_vectMath.c | 2 +- source/blender/nodes/texture/node_texture_tree.c | 2 ++ source/blender/nodes/texture/node_texture_util.c | 1 + source/blender/nodes/texture/node_texture_util.h | 1 + source/blender/nodes/texture/nodes/node_texture_at.c | 1 + source/blender/nodes/texture/nodes/node_texture_bricks.c | 1 + source/blender/nodes/texture/nodes/node_texture_checker.c | 1 + source/blender/nodes/texture/nodes/node_texture_common.c | 2 +- source/blender/nodes/texture/nodes/node_texture_compose.c | 1 + source/blender/nodes/texture/nodes/node_texture_coord.c | 1 + source/blender/nodes/texture/nodes/node_texture_curves.c | 1 + source/blender/nodes/texture/nodes/node_texture_decompose.c | 1 + source/blender/nodes/texture/nodes/node_texture_distance.c | 1 + source/blender/nodes/texture/nodes/node_texture_hueSatVal.c | 1 + source/blender/nodes/texture/nodes/node_texture_image.c | 2 +- source/blender/nodes/texture/nodes/node_texture_invert.c | 1 + source/blender/nodes/texture/nodes/node_texture_math.c | 1 + source/blender/nodes/texture/nodes/node_texture_mixRgb.c | 1 + source/blender/nodes/texture/nodes/node_texture_output.c | 1 + source/blender/nodes/texture/nodes/node_texture_proc.c | 1 + source/blender/nodes/texture/nodes/node_texture_rotate.c | 1 + source/blender/nodes/texture/nodes/node_texture_scale.c | 1 + source/blender/nodes/texture/nodes/node_texture_texture.c | 1 + source/blender/nodes/texture/nodes/node_texture_translate.c | 1 + source/blender/nodes/texture/nodes/node_texture_valToNor.c | 1 + source/blender/nodes/texture/nodes/node_texture_valToRgb.c | 2 +- source/blender/nodes/texture/nodes/node_texture_viewer.c | 1 + 117 files changed, 120 insertions(+), 82 deletions(-) diff --git a/source/blender/nodes/NOD_composite.h b/source/blender/nodes/NOD_composite.h index ab56199079e..11ffcc9027f 100644 --- a/source/blender/nodes/NOD_composite.h +++ b/source/blender/nodes/NOD_composite.h @@ -1,5 +1,5 @@ /* - * $Id: CMP_node.h 36550 2011-05-08 16:08:08Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/NOD_shader.h b/source/blender/nodes/NOD_shader.h index 5bc0c381f0b..6c5ea79e1ee 100644 --- a/source/blender/nodes/NOD_shader.h +++ b/source/blender/nodes/NOD_shader.h @@ -1,5 +1,5 @@ /* - * $Id: SHD_node.h 36550 2011-05-08 16:08:08Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/NOD_socket.h b/source/blender/nodes/NOD_socket.h index 92e8a8e058d..9ddf159cd9c 100644 --- a/source/blender/nodes/NOD_socket.h +++ b/source/blender/nodes/NOD_socket.h @@ -1,4 +1,5 @@ /** + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/NOD_texture.h b/source/blender/nodes/NOD_texture.h index 6f30685aff1..d098c241583 100644 --- a/source/blender/nodes/NOD_texture.h +++ b/source/blender/nodes/NOD_texture.h @@ -1,5 +1,5 @@ /* - * $Id: TEX_node.h 36550 2011-05-08 16:08:08Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/node_composite_tree.c b/source/blender/nodes/composite/node_composite_tree.c index 1a2fb04be8c..0ea62b0aa5f 100644 --- a/source/blender/nodes/composite/node_composite_tree.c +++ b/source/blender/nodes/composite/node_composite_tree.c @@ -1,4 +1,6 @@ /** + * $Id$ + * * ***** BEGIN GPL LICENSE BLOCK ***** * * This program is free software; you can redistribute it and/or diff --git a/source/blender/nodes/composite/node_composite_util.c b/source/blender/nodes/composite/node_composite_util.c index f7759775af0..78f97c5289e 100644 --- a/source/blender/nodes/composite/node_composite_util.c +++ b/source/blender/nodes/composite/node_composite_util.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_util.c 36536 2011-05-07 13:27:27Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/node_composite_util.h b/source/blender/nodes/composite/node_composite_util.h index e3158b2a286..57ebe2191dd 100644 --- a/source/blender/nodes/composite/node_composite_util.h +++ b/source/blender/nodes/composite/node_composite_util.h @@ -1,5 +1,5 @@ /* - * $Id: CMP_util.h 35562 2011-03-15 20:10:32Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_alphaOver.c b/source/blender/nodes/composite/nodes/node_composite_alphaOver.c index 400bdd92b6f..551f716e72b 100644 --- a/source/blender/nodes/composite/nodes/node_composite_alphaOver.c +++ b/source/blender/nodes/composite/nodes/node_composite_alphaOver.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_alphaOver.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_bilateralblur.c b/source/blender/nodes/composite/nodes/node_composite_bilateralblur.c index e7a9ee12ca1..e8e6e164983 100644 --- a/source/blender/nodes/composite/nodes/node_composite_bilateralblur.c +++ b/source/blender/nodes/composite/nodes/node_composite_bilateralblur.c @@ -1,5 +1,5 @@ /* - * + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_blur.c b/source/blender/nodes/composite/nodes/node_composite_blur.c index 7b1a9623845..cd37404e677 100644 --- a/source/blender/nodes/composite/nodes/node_composite_blur.c +++ b/source/blender/nodes/composite/nodes/node_composite_blur.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_blur.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_brightness.c b/source/blender/nodes/composite/nodes/node_composite_brightness.c index 1a5cf956a52..55d890e6d31 100644 --- a/source/blender/nodes/composite/nodes/node_composite_brightness.c +++ b/source/blender/nodes/composite/nodes/node_composite_brightness.c @@ -1,5 +1,5 @@ /* -* $Id: CMP_brightness.c 36593 2011-05-10 11:19:26Z lukastoenne $ +* $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_channelMatte.c b/source/blender/nodes/composite/nodes/node_composite_channelMatte.c index afdbe82aebc..1e3992a7185 100644 --- a/source/blender/nodes/composite/nodes/node_composite_channelMatte.c +++ b/source/blender/nodes/composite/nodes/node_composite_channelMatte.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_channelMatte.c 36536 2011-05-07 13:27:27Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_chromaMatte.c b/source/blender/nodes/composite/nodes/node_composite_chromaMatte.c index db5e6d93856..49c90e85621 100644 --- a/source/blender/nodes/composite/nodes/node_composite_chromaMatte.c +++ b/source/blender/nodes/composite/nodes/node_composite_chromaMatte.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_chromaMatte.c 36536 2011-05-07 13:27:27Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_colorMatte.c b/source/blender/nodes/composite/nodes/node_composite_colorMatte.c index 7f687240daf..b17052ed542 100644 --- a/source/blender/nodes/composite/nodes/node_composite_colorMatte.c +++ b/source/blender/nodes/composite/nodes/node_composite_colorMatte.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_colorMatte.c 36536 2011-05-07 13:27:27Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_colorSpill.c b/source/blender/nodes/composite/nodes/node_composite_colorSpill.c index 18b6d806c82..418d6802cec 100644 --- a/source/blender/nodes/composite/nodes/node_composite_colorSpill.c +++ b/source/blender/nodes/composite/nodes/node_composite_colorSpill.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_colorSpill.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_colorbalance.c b/source/blender/nodes/composite/nodes/node_composite_colorbalance.c index 7ebceb5c206..6bce18c14ef 100644 --- a/source/blender/nodes/composite/nodes/node_composite_colorbalance.c +++ b/source/blender/nodes/composite/nodes/node_composite_colorbalance.c @@ -1,5 +1,5 @@ /* - * + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_common.c b/source/blender/nodes/composite/nodes/node_composite_common.c index ab8cf663ef2..fbff8198dde 100644 --- a/source/blender/nodes/composite/nodes/node_composite_common.c +++ b/source/blender/nodes/composite/nodes/node_composite_common.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_blur.c 35562 2011-03-15 20:10:32Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_composite.c b/source/blender/nodes/composite/nodes/node_composite_composite.c index be6246b42d8..492e5c28459 100644 --- a/source/blender/nodes/composite/nodes/node_composite_composite.c +++ b/source/blender/nodes/composite/nodes/node_composite_composite.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_composite.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_crop.c b/source/blender/nodes/composite/nodes/node_composite_crop.c index 332ecf39616..b8c539b6d66 100644 --- a/source/blender/nodes/composite/nodes/node_composite_crop.c +++ b/source/blender/nodes/composite/nodes/node_composite_crop.c @@ -1,5 +1,5 @@ /* - * + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_curves.c b/source/blender/nodes/composite/nodes/node_composite_curves.c index a830b595321..58074eaca57 100644 --- a/source/blender/nodes/composite/nodes/node_composite_curves.c +++ b/source/blender/nodes/composite/nodes/node_composite_curves.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_curves.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_defocus.c b/source/blender/nodes/composite/nodes/node_composite_defocus.c index a218bfb009d..84a084591c5 100644 --- a/source/blender/nodes/composite/nodes/node_composite_defocus.c +++ b/source/blender/nodes/composite/nodes/node_composite_defocus.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_defocus.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_diffMatte.c b/source/blender/nodes/composite/nodes/node_composite_diffMatte.c index a0fff88f5dc..23bcf57e2bc 100644 --- a/source/blender/nodes/composite/nodes/node_composite_diffMatte.c +++ b/source/blender/nodes/composite/nodes/node_composite_diffMatte.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_diffMatte.c 36536 2011-05-07 13:27:27Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_dilate.c b/source/blender/nodes/composite/nodes/node_composite_dilate.c index ef47fdbfef0..c774045a12f 100644 --- a/source/blender/nodes/composite/nodes/node_composite_dilate.c +++ b/source/blender/nodes/composite/nodes/node_composite_dilate.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_dilate.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_directionalblur.c b/source/blender/nodes/composite/nodes/node_composite_directionalblur.c index 3d541120a61..1a5e3150f53 100644 --- a/source/blender/nodes/composite/nodes/node_composite_directionalblur.c +++ b/source/blender/nodes/composite/nodes/node_composite_directionalblur.c @@ -1,4 +1,5 @@ /* + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_displace.c b/source/blender/nodes/composite/nodes/node_composite_displace.c index 4688553d27f..28d220eb4c9 100644 --- a/source/blender/nodes/composite/nodes/node_composite_displace.c +++ b/source/blender/nodes/composite/nodes/node_composite_displace.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_displace.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_distanceMatte.c b/source/blender/nodes/composite/nodes/node_composite_distanceMatte.c index c895eab391c..b186be5500b 100644 --- a/source/blender/nodes/composite/nodes/node_composite_distanceMatte.c +++ b/source/blender/nodes/composite/nodes/node_composite_distanceMatte.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_distanceMatte.c 36536 2011-05-07 13:27:27Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_filter.c b/source/blender/nodes/composite/nodes/node_composite_filter.c index 6beeec49c63..64a4c69b671 100644 --- a/source/blender/nodes/composite/nodes/node_composite_filter.c +++ b/source/blender/nodes/composite/nodes/node_composite_filter.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_filter.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_flip.c b/source/blender/nodes/composite/nodes/node_composite_flip.c index 026130641a3..931aacbe6fd 100644 --- a/source/blender/nodes/composite/nodes/node_composite_flip.c +++ b/source/blender/nodes/composite/nodes/node_composite_flip.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_flip.c 36333 2011-04-26 09:27:43Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_gamma.c b/source/blender/nodes/composite/nodes/node_composite_gamma.c index d191f649f1f..f1dd3d40c09 100644 --- a/source/blender/nodes/composite/nodes/node_composite_gamma.c +++ b/source/blender/nodes/composite/nodes/node_composite_gamma.c @@ -1,5 +1,5 @@ /* -* $Id: CMP_gamma.c 36593 2011-05-10 11:19:26Z lukastoenne $ +* $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_glare.c b/source/blender/nodes/composite/nodes/node_composite_glare.c index 0890b9ba24b..98a41e4af69 100644 --- a/source/blender/nodes/composite/nodes/node_composite_glare.c +++ b/source/blender/nodes/composite/nodes/node_composite_glare.c @@ -1,4 +1,5 @@ /* + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_hueSatVal.c b/source/blender/nodes/composite/nodes/node_composite_hueSatVal.c index 525728ade31..1d060726b67 100644 --- a/source/blender/nodes/composite/nodes/node_composite_hueSatVal.c +++ b/source/blender/nodes/composite/nodes/node_composite_hueSatVal.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_hueSatVal.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_huecorrect.c b/source/blender/nodes/composite/nodes/node_composite_huecorrect.c index edf26aed882..13a606e2c68 100644 --- a/source/blender/nodes/composite/nodes/node_composite_huecorrect.c +++ b/source/blender/nodes/composite/nodes/node_composite_huecorrect.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_huecorrect.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_idMask.c b/source/blender/nodes/composite/nodes/node_composite_idMask.c index 97d84997697..43f78a90add 100644 --- a/source/blender/nodes/composite/nodes/node_composite_idMask.c +++ b/source/blender/nodes/composite/nodes/node_composite_idMask.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_idMask.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_image.c b/source/blender/nodes/composite/nodes/node_composite_image.c index 1278202d5b5..6149947233e 100644 --- a/source/blender/nodes/composite/nodes/node_composite_image.c +++ b/source/blender/nodes/composite/nodes/node_composite_image.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_image.c 36536 2011-05-07 13:27:27Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_invert.c b/source/blender/nodes/composite/nodes/node_composite_invert.c index 1f7589cae8f..fa64c9ec1b1 100644 --- a/source/blender/nodes/composite/nodes/node_composite_invert.c +++ b/source/blender/nodes/composite/nodes/node_composite_invert.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_invert.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_lensdist.c b/source/blender/nodes/composite/nodes/node_composite_lensdist.c index 85578deecbb..7d6c945a9e3 100644 --- a/source/blender/nodes/composite/nodes/node_composite_lensdist.c +++ b/source/blender/nodes/composite/nodes/node_composite_lensdist.c @@ -1,4 +1,5 @@ /* + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_levels.c b/source/blender/nodes/composite/nodes/node_composite_levels.c index 673ffe4cbef..e34788ff62b 100644 --- a/source/blender/nodes/composite/nodes/node_composite_levels.c +++ b/source/blender/nodes/composite/nodes/node_composite_levels.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_levels.c 36536 2011-05-07 13:27:27Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_lummaMatte.c b/source/blender/nodes/composite/nodes/node_composite_lummaMatte.c index bc7676934fa..cac2a386801 100644 --- a/source/blender/nodes/composite/nodes/node_composite_lummaMatte.c +++ b/source/blender/nodes/composite/nodes/node_composite_lummaMatte.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_lummaMatte.c 36536 2011-05-07 13:27:27Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_mapUV.c b/source/blender/nodes/composite/nodes/node_composite_mapUV.c index 2d92c26b554..b1cae62274b 100644 --- a/source/blender/nodes/composite/nodes/node_composite_mapUV.c +++ b/source/blender/nodes/composite/nodes/node_composite_mapUV.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_mapUV.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_mapValue.c b/source/blender/nodes/composite/nodes/node_composite_mapValue.c index 0d38aca4ce3..95e0f3dadd1 100644 --- a/source/blender/nodes/composite/nodes/node_composite_mapValue.c +++ b/source/blender/nodes/composite/nodes/node_composite_mapValue.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_mapValue.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_math.c b/source/blender/nodes/composite/nodes/node_composite_math.c index 2489491fdd8..a8a631bdbad 100644 --- a/source/blender/nodes/composite/nodes/node_composite_math.c +++ b/source/blender/nodes/composite/nodes/node_composite_math.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_math.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_mixrgb.c b/source/blender/nodes/composite/nodes/node_composite_mixrgb.c index a5dcfcc44da..eaab24d628a 100644 --- a/source/blender/nodes/composite/nodes/node_composite_mixrgb.c +++ b/source/blender/nodes/composite/nodes/node_composite_mixrgb.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_mixrgb.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_normal.c b/source/blender/nodes/composite/nodes/node_composite_normal.c index 5f3c848903c..adf087019dc 100644 --- a/source/blender/nodes/composite/nodes/node_composite_normal.c +++ b/source/blender/nodes/composite/nodes/node_composite_normal.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_normal.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_normalize.c b/source/blender/nodes/composite/nodes/node_composite_normalize.c index 1c5c3b57b80..3a913b1a0a2 100644 --- a/source/blender/nodes/composite/nodes/node_composite_normalize.c +++ b/source/blender/nodes/composite/nodes/node_composite_normalize.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_normalize.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_outputFile.c b/source/blender/nodes/composite/nodes/node_composite_outputFile.c index 13391a4a790..20203f66b5a 100644 --- a/source/blender/nodes/composite/nodes/node_composite_outputFile.c +++ b/source/blender/nodes/composite/nodes/node_composite_outputFile.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_outputFile.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_premulkey.c b/source/blender/nodes/composite/nodes/node_composite_premulkey.c index 066a8a81891..a3f958e04d9 100644 --- a/source/blender/nodes/composite/nodes/node_composite_premulkey.c +++ b/source/blender/nodes/composite/nodes/node_composite_premulkey.c @@ -1,5 +1,5 @@ /* -* $Id: CMP_premulkey.c 36333 2011-04-26 09:27:43Z lukastoenne $ +* $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_rgb.c b/source/blender/nodes/composite/nodes/node_composite_rgb.c index 41a13487edd..b9287a4978e 100644 --- a/source/blender/nodes/composite/nodes/node_composite_rgb.c +++ b/source/blender/nodes/composite/nodes/node_composite_rgb.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_rgb.c 36333 2011-04-26 09:27:43Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_rotate.c b/source/blender/nodes/composite/nodes/node_composite_rotate.c index 4ece562c508..2bbb77cd1da 100644 --- a/source/blender/nodes/composite/nodes/node_composite_rotate.c +++ b/source/blender/nodes/composite/nodes/node_composite_rotate.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_rotate.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_scale.c b/source/blender/nodes/composite/nodes/node_composite_scale.c index 4ba654e82d4..b6ad36f957f 100644 --- a/source/blender/nodes/composite/nodes/node_composite_scale.c +++ b/source/blender/nodes/composite/nodes/node_composite_scale.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_scale.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_sepcombHSVA.c b/source/blender/nodes/composite/nodes/node_composite_sepcombHSVA.c index 5460427fd73..6b1813d2142 100644 --- a/source/blender/nodes/composite/nodes/node_composite_sepcombHSVA.c +++ b/source/blender/nodes/composite/nodes/node_composite_sepcombHSVA.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_sepcombHSVA.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_sepcombRGBA.c b/source/blender/nodes/composite/nodes/node_composite_sepcombRGBA.c index a074d895acb..a60f6b81c95 100644 --- a/source/blender/nodes/composite/nodes/node_composite_sepcombRGBA.c +++ b/source/blender/nodes/composite/nodes/node_composite_sepcombRGBA.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_sepcombRGBA.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_sepcombYCCA.c b/source/blender/nodes/composite/nodes/node_composite_sepcombYCCA.c index 61e88418e59..5e042f54fb0 100644 --- a/source/blender/nodes/composite/nodes/node_composite_sepcombYCCA.c +++ b/source/blender/nodes/composite/nodes/node_composite_sepcombYCCA.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_sepcombYCCA.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_sepcombYUVA.c b/source/blender/nodes/composite/nodes/node_composite_sepcombYUVA.c index 14f086300c0..70bc36a020d 100644 --- a/source/blender/nodes/composite/nodes/node_composite_sepcombYUVA.c +++ b/source/blender/nodes/composite/nodes/node_composite_sepcombYUVA.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_sepcombYUVA.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_setalpha.c b/source/blender/nodes/composite/nodes/node_composite_setalpha.c index 781d6f11614..8264d4d4dea 100644 --- a/source/blender/nodes/composite/nodes/node_composite_setalpha.c +++ b/source/blender/nodes/composite/nodes/node_composite_setalpha.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_setalpha.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_splitViewer.c b/source/blender/nodes/composite/nodes/node_composite_splitViewer.c index d78faf69e26..e73caa542b7 100644 --- a/source/blender/nodes/composite/nodes/node_composite_splitViewer.c +++ b/source/blender/nodes/composite/nodes/node_composite_splitViewer.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_splitViewer.c 36340 2011-04-26 13:24:20Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_texture.c b/source/blender/nodes/composite/nodes/node_composite_texture.c index bdeef74c617..1dbbd56d2f1 100644 --- a/source/blender/nodes/composite/nodes/node_composite_texture.c +++ b/source/blender/nodes/composite/nodes/node_composite_texture.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_texture.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_tonemap.c b/source/blender/nodes/composite/nodes/node_composite_tonemap.c index 31ffed08c95..ba2dc9c5c79 100644 --- a/source/blender/nodes/composite/nodes/node_composite_tonemap.c +++ b/source/blender/nodes/composite/nodes/node_composite_tonemap.c @@ -1,4 +1,5 @@ /* + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_translate.c b/source/blender/nodes/composite/nodes/node_composite_translate.c index a07dfb936ae..872667a4e17 100644 --- a/source/blender/nodes/composite/nodes/node_composite_translate.c +++ b/source/blender/nodes/composite/nodes/node_composite_translate.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_translate.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_valToRgb.c b/source/blender/nodes/composite/nodes/node_composite_valToRgb.c index 9481d769557..edd315e5a92 100644 --- a/source/blender/nodes/composite/nodes/node_composite_valToRgb.c +++ b/source/blender/nodes/composite/nodes/node_composite_valToRgb.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_valToRgb.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_value.c b/source/blender/nodes/composite/nodes/node_composite_value.c index e99b665f2ae..0bb558cfa9d 100644 --- a/source/blender/nodes/composite/nodes/node_composite_value.c +++ b/source/blender/nodes/composite/nodes/node_composite_value.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_value.c 36536 2011-05-07 13:27:27Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_vecBlur.c b/source/blender/nodes/composite/nodes/node_composite_vecBlur.c index e730728d077..26fcffa93ac 100644 --- a/source/blender/nodes/composite/nodes/node_composite_vecBlur.c +++ b/source/blender/nodes/composite/nodes/node_composite_vecBlur.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_vecBlur.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_viewer.c b/source/blender/nodes/composite/nodes/node_composite_viewer.c index bcfb45411f1..8b052c5db35 100644 --- a/source/blender/nodes/composite/nodes/node_composite_viewer.c +++ b/source/blender/nodes/composite/nodes/node_composite_viewer.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_viewer.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/composite/nodes/node_composite_zcombine.c b/source/blender/nodes/composite/nodes/node_composite_zcombine.c index dfed26be343..220b770198a 100644 --- a/source/blender/nodes/composite/nodes/node_composite_zcombine.c +++ b/source/blender/nodes/composite/nodes/node_composite_zcombine.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_zcombine.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/intern/node_common.c b/source/blender/nodes/intern/node_common.c index 76203c52293..07f3eb943cc 100644 --- a/source/blender/nodes/intern/node_common.c +++ b/source/blender/nodes/intern/node_common.c @@ -1,4 +1,5 @@ /** + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/intern/node_common.h b/source/blender/nodes/intern/node_common.h index 31a13d8168d..2723c595380 100644 --- a/source/blender/nodes/intern/node_common.h +++ b/source/blender/nodes/intern/node_common.h @@ -1,4 +1,5 @@ /** + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/intern/node_exec.c b/source/blender/nodes/intern/node_exec.c index 0d688438cf9..608347bc258 100644 --- a/source/blender/nodes/intern/node_exec.c +++ b/source/blender/nodes/intern/node_exec.c @@ -1,4 +1,5 @@ /** + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/intern/node_exec.h b/source/blender/nodes/intern/node_exec.h index 457e119613b..567c6ae56cf 100644 --- a/source/blender/nodes/intern/node_exec.h +++ b/source/blender/nodes/intern/node_exec.h @@ -1,4 +1,5 @@ /** + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/intern/node_socket.c b/source/blender/nodes/intern/node_socket.c index ef8b3e797ce..3ea34dd094a 100644 --- a/source/blender/nodes/intern/node_socket.c +++ b/source/blender/nodes/intern/node_socket.c @@ -1,4 +1,5 @@ /** + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/shader/node_shader_tree.c b/source/blender/nodes/shader/node_shader_tree.c index 620da7553b3..8cb1ebeb15f 100644 --- a/source/blender/nodes/shader/node_shader_tree.c +++ b/source/blender/nodes/shader/node_shader_tree.c @@ -1,4 +1,6 @@ /** + * $Id$ + * * ***** BEGIN GPL LICENSE BLOCK ***** * * This program is free software; you can redistribute it and/or diff --git a/source/blender/nodes/shader/node_shader_util.c b/source/blender/nodes/shader/node_shader_util.c index cf910ba3f64..01dd0f7d5a1 100644 --- a/source/blender/nodes/shader/node_shader_util.c +++ b/source/blender/nodes/shader/node_shader_util.c @@ -1,5 +1,5 @@ /* - * $Id: SHD_util.c 36549 2011-05-08 14:23:38Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/shader/node_shader_util.h b/source/blender/nodes/shader/node_shader_util.h index 1cc04d95d6f..4c929c93517 100644 --- a/source/blender/nodes/shader/node_shader_util.h +++ b/source/blender/nodes/shader/node_shader_util.h @@ -1,5 +1,5 @@ /* - * $Id: SHD_util.h 36549 2011-05-08 14:23:38Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/shader/nodes/node_shader_camera.c b/source/blender/nodes/shader/nodes/node_shader_camera.c index ecb7c486dc4..c1e737fcb53 100644 --- a/source/blender/nodes/shader/nodes/node_shader_camera.c +++ b/source/blender/nodes/shader/nodes/node_shader_camera.c @@ -1,5 +1,5 @@ /* - * $Id: SHD_camera.c 36536 2011-05-07 13:27:27Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/shader/nodes/node_shader_common.c b/source/blender/nodes/shader/nodes/node_shader_common.c index ab3638436f1..aa8e8241bf8 100644 --- a/source/blender/nodes/shader/nodes/node_shader_common.c +++ b/source/blender/nodes/shader/nodes/node_shader_common.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_blur.c 35562 2011-03-15 20:10:32Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/shader/nodes/node_shader_curves.c b/source/blender/nodes/shader/nodes/node_shader_curves.c index ded867ec441..9dedeba6d39 100644 --- a/source/blender/nodes/shader/nodes/node_shader_curves.c +++ b/source/blender/nodes/shader/nodes/node_shader_curves.c @@ -1,5 +1,5 @@ /* - * $Id: SHD_curves.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/shader/nodes/node_shader_dynamic.c b/source/blender/nodes/shader/nodes/node_shader_dynamic.c index 6490ee00787..5aae54d858b 100644 --- a/source/blender/nodes/shader/nodes/node_shader_dynamic.c +++ b/source/blender/nodes/shader/nodes/node_shader_dynamic.c @@ -1,5 +1,5 @@ /* - * $Id: SHD_dynamic.c 35927 2011-03-31 20:59:55Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/shader/nodes/node_shader_geom.c b/source/blender/nodes/shader/nodes/node_shader_geom.c index b88c5979b54..585d1e59d15 100644 --- a/source/blender/nodes/shader/nodes/node_shader_geom.c +++ b/source/blender/nodes/shader/nodes/node_shader_geom.c @@ -1,5 +1,5 @@ /* - * $Id: SHD_geom.c 36536 2011-05-07 13:27:27Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/shader/nodes/node_shader_hueSatVal.c b/source/blender/nodes/shader/nodes/node_shader_hueSatVal.c index ef1434b82ca..f4f69cf56fe 100644 --- a/source/blender/nodes/shader/nodes/node_shader_hueSatVal.c +++ b/source/blender/nodes/shader/nodes/node_shader_hueSatVal.c @@ -1,5 +1,5 @@ /* - * + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/shader/nodes/node_shader_invert.c b/source/blender/nodes/shader/nodes/node_shader_invert.c index bd7e571f073..5347d98b42e 100644 --- a/source/blender/nodes/shader/nodes/node_shader_invert.c +++ b/source/blender/nodes/shader/nodes/node_shader_invert.c @@ -1,5 +1,5 @@ /* - * $Id: SHD_invert.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/shader/nodes/node_shader_mapping.c b/source/blender/nodes/shader/nodes/node_shader_mapping.c index 21cea4853ad..05432708b29 100644 --- a/source/blender/nodes/shader/nodes/node_shader_mapping.c +++ b/source/blender/nodes/shader/nodes/node_shader_mapping.c @@ -1,5 +1,5 @@ /* - * $Id: SHD_mapping.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/shader/nodes/node_shader_material.c b/source/blender/nodes/shader/nodes/node_shader_material.c index a0bfd430506..984bfed3ff9 100644 --- a/source/blender/nodes/shader/nodes/node_shader_material.c +++ b/source/blender/nodes/shader/nodes/node_shader_material.c @@ -1,5 +1,5 @@ /* - * $Id: SHD_material.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/shader/nodes/node_shader_math.c b/source/blender/nodes/shader/nodes/node_shader_math.c index 0618598379f..592779d6803 100644 --- a/source/blender/nodes/shader/nodes/node_shader_math.c +++ b/source/blender/nodes/shader/nodes/node_shader_math.c @@ -1,5 +1,5 @@ /* - * $Id: SHD_math.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/shader/nodes/node_shader_mixRgb.c b/source/blender/nodes/shader/nodes/node_shader_mixRgb.c index a89faa66fc0..a9e4f2129be 100644 --- a/source/blender/nodes/shader/nodes/node_shader_mixRgb.c +++ b/source/blender/nodes/shader/nodes/node_shader_mixRgb.c @@ -1,5 +1,5 @@ /* - * $Id: SHD_mixRgb.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/shader/nodes/node_shader_normal.c b/source/blender/nodes/shader/nodes/node_shader_normal.c index 099a9bed10d..1ce7c61c593 100644 --- a/source/blender/nodes/shader/nodes/node_shader_normal.c +++ b/source/blender/nodes/shader/nodes/node_shader_normal.c @@ -1,5 +1,5 @@ /* - * $Id: SHD_normal.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/shader/nodes/node_shader_output.c b/source/blender/nodes/shader/nodes/node_shader_output.c index 638af7d4eb3..94990bd9cf1 100644 --- a/source/blender/nodes/shader/nodes/node_shader_output.c +++ b/source/blender/nodes/shader/nodes/node_shader_output.c @@ -1,5 +1,5 @@ /* - * $Id: SHD_output.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/shader/nodes/node_shader_rgb.c b/source/blender/nodes/shader/nodes/node_shader_rgb.c index c9bb78b45dd..d612e5c228f 100644 --- a/source/blender/nodes/shader/nodes/node_shader_rgb.c +++ b/source/blender/nodes/shader/nodes/node_shader_rgb.c @@ -1,5 +1,5 @@ /* - * $Id: SHD_rgb.c 36481 2011-05-04 11:42:25Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/shader/nodes/node_shader_sepcombRGB.c b/source/blender/nodes/shader/nodes/node_shader_sepcombRGB.c index 9528aca2574..15a8a4952fb 100644 --- a/source/blender/nodes/shader/nodes/node_shader_sepcombRGB.c +++ b/source/blender/nodes/shader/nodes/node_shader_sepcombRGB.c @@ -1,5 +1,5 @@ /* - * + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/shader/nodes/node_shader_squeeze.c b/source/blender/nodes/shader/nodes/node_shader_squeeze.c index 305639dff21..b9eb116b866 100644 --- a/source/blender/nodes/shader/nodes/node_shader_squeeze.c +++ b/source/blender/nodes/shader/nodes/node_shader_squeeze.c @@ -1,5 +1,5 @@ /* - * $Id: SHD_squeeze.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/shader/nodes/node_shader_texture.c b/source/blender/nodes/shader/nodes/node_shader_texture.c index a4957d8f683..09716820800 100644 --- a/source/blender/nodes/shader/nodes/node_shader_texture.c +++ b/source/blender/nodes/shader/nodes/node_shader_texture.c @@ -1,5 +1,5 @@ /* - * $Id: SHD_texture.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/shader/nodes/node_shader_valToRgb.c b/source/blender/nodes/shader/nodes/node_shader_valToRgb.c index 9353143095a..5c1d3096a6e 100644 --- a/source/blender/nodes/shader/nodes/node_shader_valToRgb.c +++ b/source/blender/nodes/shader/nodes/node_shader_valToRgb.c @@ -1,5 +1,5 @@ /* - * $Id: SHD_valToRgb.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/shader/nodes/node_shader_value.c b/source/blender/nodes/shader/nodes/node_shader_value.c index 21ff565306d..bbd3f8fc242 100644 --- a/source/blender/nodes/shader/nodes/node_shader_value.c +++ b/source/blender/nodes/shader/nodes/node_shader_value.c @@ -1,5 +1,5 @@ /* - * $Id: SHD_value.c 36536 2011-05-07 13:27:27Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/shader/nodes/node_shader_vectMath.c b/source/blender/nodes/shader/nodes/node_shader_vectMath.c index c6a081431a2..ca31d879e3e 100644 --- a/source/blender/nodes/shader/nodes/node_shader_vectMath.c +++ b/source/blender/nodes/shader/nodes/node_shader_vectMath.c @@ -1,5 +1,5 @@ /* - * $Id: SHD_vectMath.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/texture/node_texture_tree.c b/source/blender/nodes/texture/node_texture_tree.c index 75a57c64f2f..3ea15a316ab 100644 --- a/source/blender/nodes/texture/node_texture_tree.c +++ b/source/blender/nodes/texture/node_texture_tree.c @@ -1,4 +1,6 @@ /** + * $Id$ + * * ***** BEGIN GPL LICENSE BLOCK ***** * * This program is free software; you can redistribute it and/or diff --git a/source/blender/nodes/texture/node_texture_util.c b/source/blender/nodes/texture/node_texture_util.c index 5aedd8681ab..7b8f42aa925 100644 --- a/source/blender/nodes/texture/node_texture_util.c +++ b/source/blender/nodes/texture/node_texture_util.c @@ -1,4 +1,5 @@ /* + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/texture/node_texture_util.h b/source/blender/nodes/texture/node_texture_util.h index 867b4142052..ccaf5df9897 100644 --- a/source/blender/nodes/texture/node_texture_util.h +++ b/source/blender/nodes/texture/node_texture_util.h @@ -1,4 +1,5 @@ /* + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/texture/nodes/node_texture_at.c b/source/blender/nodes/texture/nodes/node_texture_at.c index f3275f2bcdf..34993a93092 100644 --- a/source/blender/nodes/texture/nodes/node_texture_at.c +++ b/source/blender/nodes/texture/nodes/node_texture_at.c @@ -1,4 +1,5 @@ /* + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/texture/nodes/node_texture_bricks.c b/source/blender/nodes/texture/nodes/node_texture_bricks.c index 060ed791871..a9a82fe4d65 100644 --- a/source/blender/nodes/texture/nodes/node_texture_bricks.c +++ b/source/blender/nodes/texture/nodes/node_texture_bricks.c @@ -1,4 +1,5 @@ /* + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/texture/nodes/node_texture_checker.c b/source/blender/nodes/texture/nodes/node_texture_checker.c index 916ee80d66b..7762c9ef992 100644 --- a/source/blender/nodes/texture/nodes/node_texture_checker.c +++ b/source/blender/nodes/texture/nodes/node_texture_checker.c @@ -1,4 +1,5 @@ /* + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/texture/nodes/node_texture_common.c b/source/blender/nodes/texture/nodes/node_texture_common.c index cb5102bae4e..afb24226416 100644 --- a/source/blender/nodes/texture/nodes/node_texture_common.c +++ b/source/blender/nodes/texture/nodes/node_texture_common.c @@ -1,5 +1,5 @@ /* - * $Id: CMP_blur.c 35562 2011-03-15 20:10:32Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/texture/nodes/node_texture_compose.c b/source/blender/nodes/texture/nodes/node_texture_compose.c index a11769173a3..d224ae793e2 100644 --- a/source/blender/nodes/texture/nodes/node_texture_compose.c +++ b/source/blender/nodes/texture/nodes/node_texture_compose.c @@ -1,4 +1,5 @@ /* + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/texture/nodes/node_texture_coord.c b/source/blender/nodes/texture/nodes/node_texture_coord.c index b2d9cecc164..2bfa2ff2314 100644 --- a/source/blender/nodes/texture/nodes/node_texture_coord.c +++ b/source/blender/nodes/texture/nodes/node_texture_coord.c @@ -1,4 +1,5 @@ /* + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/texture/nodes/node_texture_curves.c b/source/blender/nodes/texture/nodes/node_texture_curves.c index af6d880cc18..dd65f979bbe 100644 --- a/source/blender/nodes/texture/nodes/node_texture_curves.c +++ b/source/blender/nodes/texture/nodes/node_texture_curves.c @@ -1,4 +1,5 @@ /* + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/texture/nodes/node_texture_decompose.c b/source/blender/nodes/texture/nodes/node_texture_decompose.c index 312765f866e..016ee5498d8 100644 --- a/source/blender/nodes/texture/nodes/node_texture_decompose.c +++ b/source/blender/nodes/texture/nodes/node_texture_decompose.c @@ -1,4 +1,5 @@ /* + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/texture/nodes/node_texture_distance.c b/source/blender/nodes/texture/nodes/node_texture_distance.c index fe524baaa96..ef3f701d8f3 100644 --- a/source/blender/nodes/texture/nodes/node_texture_distance.c +++ b/source/blender/nodes/texture/nodes/node_texture_distance.c @@ -1,4 +1,5 @@ /* + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/texture/nodes/node_texture_hueSatVal.c b/source/blender/nodes/texture/nodes/node_texture_hueSatVal.c index ebc2501cee3..cd7ebb18018 100644 --- a/source/blender/nodes/texture/nodes/node_texture_hueSatVal.c +++ b/source/blender/nodes/texture/nodes/node_texture_hueSatVal.c @@ -1,4 +1,5 @@ /* + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/texture/nodes/node_texture_image.c b/source/blender/nodes/texture/nodes/node_texture_image.c index 1359cf4275f..6e749a80d99 100644 --- a/source/blender/nodes/texture/nodes/node_texture_image.c +++ b/source/blender/nodes/texture/nodes/node_texture_image.c @@ -1,5 +1,5 @@ /* - * $Id: TEX_image.c 36481 2011-05-04 11:42:25Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/texture/nodes/node_texture_invert.c b/source/blender/nodes/texture/nodes/node_texture_invert.c index 8ba4f292fec..d18bb86d5fa 100644 --- a/source/blender/nodes/texture/nodes/node_texture_invert.c +++ b/source/blender/nodes/texture/nodes/node_texture_invert.c @@ -1,4 +1,5 @@ /* + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/texture/nodes/node_texture_math.c b/source/blender/nodes/texture/nodes/node_texture_math.c index 182bc37978f..04f399069c1 100644 --- a/source/blender/nodes/texture/nodes/node_texture_math.c +++ b/source/blender/nodes/texture/nodes/node_texture_math.c @@ -1,4 +1,5 @@ /* + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/texture/nodes/node_texture_mixRgb.c b/source/blender/nodes/texture/nodes/node_texture_mixRgb.c index 8baac682b18..933a0302df8 100644 --- a/source/blender/nodes/texture/nodes/node_texture_mixRgb.c +++ b/source/blender/nodes/texture/nodes/node_texture_mixRgb.c @@ -1,4 +1,5 @@ /* + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/texture/nodes/node_texture_output.c b/source/blender/nodes/texture/nodes/node_texture_output.c index c321f5738a1..3095e224446 100644 --- a/source/blender/nodes/texture/nodes/node_texture_output.c +++ b/source/blender/nodes/texture/nodes/node_texture_output.c @@ -1,4 +1,5 @@ /* + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/texture/nodes/node_texture_proc.c b/source/blender/nodes/texture/nodes/node_texture_proc.c index 8b4c25d85c9..237e4d6923d 100644 --- a/source/blender/nodes/texture/nodes/node_texture_proc.c +++ b/source/blender/nodes/texture/nodes/node_texture_proc.c @@ -1,4 +1,5 @@ /* + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/texture/nodes/node_texture_rotate.c b/source/blender/nodes/texture/nodes/node_texture_rotate.c index a788b9cbbde..afba9f199f9 100644 --- a/source/blender/nodes/texture/nodes/node_texture_rotate.c +++ b/source/blender/nodes/texture/nodes/node_texture_rotate.c @@ -1,4 +1,5 @@ /* + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/texture/nodes/node_texture_scale.c b/source/blender/nodes/texture/nodes/node_texture_scale.c index 136dde0d52f..e3aee35977a 100644 --- a/source/blender/nodes/texture/nodes/node_texture_scale.c +++ b/source/blender/nodes/texture/nodes/node_texture_scale.c @@ -1,4 +1,5 @@ /* + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/texture/nodes/node_texture_texture.c b/source/blender/nodes/texture/nodes/node_texture_texture.c index 10b9b8979f8..96d6325671a 100644 --- a/source/blender/nodes/texture/nodes/node_texture_texture.c +++ b/source/blender/nodes/texture/nodes/node_texture_texture.c @@ -1,4 +1,5 @@ /* + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/texture/nodes/node_texture_translate.c b/source/blender/nodes/texture/nodes/node_texture_translate.c index 395404a9411..b970bfbff76 100644 --- a/source/blender/nodes/texture/nodes/node_texture_translate.c +++ b/source/blender/nodes/texture/nodes/node_texture_translate.c @@ -1,4 +1,5 @@ /* + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/texture/nodes/node_texture_valToNor.c b/source/blender/nodes/texture/nodes/node_texture_valToNor.c index 62b457bc862..523f416568c 100644 --- a/source/blender/nodes/texture/nodes/node_texture_valToNor.c +++ b/source/blender/nodes/texture/nodes/node_texture_valToNor.c @@ -1,4 +1,5 @@ /* + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/texture/nodes/node_texture_valToRgb.c b/source/blender/nodes/texture/nodes/node_texture_valToRgb.c index caca6fa97a4..6398a398b32 100644 --- a/source/blender/nodes/texture/nodes/node_texture_valToRgb.c +++ b/source/blender/nodes/texture/nodes/node_texture_valToRgb.c @@ -1,5 +1,5 @@ /* - * $Id: TEX_valToRgb.c 36593 2011-05-10 11:19:26Z lukastoenne $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * diff --git a/source/blender/nodes/texture/nodes/node_texture_viewer.c b/source/blender/nodes/texture/nodes/node_texture_viewer.c index 01734f56937..b0aa74a83b2 100644 --- a/source/blender/nodes/texture/nodes/node_texture_viewer.c +++ b/source/blender/nodes/texture/nodes/node_texture_viewer.c @@ -1,4 +1,5 @@ /* + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * From 0c992c73a1d85ad63ad80cc93c3e716577f5566e Mon Sep 17 00:00:00 2001 From: Nathan Letwory Date: Mon, 5 Sep 2011 22:15:07 +0000 Subject: [PATCH 089/182] Typofix --- intern/ghost/intern/GHOST_NDOFManager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/intern/ghost/intern/GHOST_NDOFManager.cpp b/intern/ghost/intern/GHOST_NDOFManager.cpp index 51525df003e..c2e6f278c6b 100644 --- a/intern/ghost/intern/GHOST_NDOFManager.cpp +++ b/intern/ghost/intern/GHOST_NDOFManager.cpp @@ -366,11 +366,11 @@ void GHOST_NDOFManager::setDeadZone(float dz) } else if (dz > 0.5f) { // warn the rogue user/programmer, but allow it - GHOST_PRINT("ndof: dead zone of %.2f is rather high...\n", dz); + GHOST_PRINTF("ndof: dead zone of %.2f is rather high...\n", dz); } m_deadZone = dz; - GHOST_PRINT("ndof: dead zone set to %.2f\n", dz); + GHOST_PRINTF("ndof: dead zone set to %.2f\n", dz); } static bool atHomePosition(GHOST_TEventNDOFMotionData* ndof) From 0991bed4139e4a77ba81514ad1dfb6a852a41fa5 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 5 Sep 2011 23:40:52 +0000 Subject: [PATCH 090/182] fix some complier warnings and add -Wundef to CMake's default GCC warnings. --- CMakeLists.txt | 2 ++ intern/opennl/CMakeLists.txt | 7 +++++++ source/blender/blenkernel/intern/node.c | 2 +- source/blender/editors/space_node/node_draw.c | 2 +- source/blender/editors/space_node/node_edit.c | 1 - source/gameengine/Converter/BL_SkinDeformer.cpp | 2 -- source/gameengine/Converter/KX_BlenderSceneConverter.cpp | 6 ++++++ 7 files changed, 17 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 38ce8689855..b54b18aab37 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1267,6 +1267,7 @@ if(CMAKE_COMPILER_IS_GNUCC) ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_POINTER_ARITH -Wpointer-arith) ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_UNUSED_PARAMETER -Wunused-parameter) ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_WRITE_STRINGS -Wwrite-strings) + ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_UNDEFINED -Wundef) # disable because it gives warnings for printf() & friends. # ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_DOUBLE_PROMOTION -Wdouble-promotion -Wno-error=double-promotion) ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_NO_ERROR_UNUSED_BUT_SET_VARIABLE -Wno-error=unused-but-set-variable) @@ -1274,6 +1275,7 @@ if(CMAKE_COMPILER_IS_GNUCC) ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_ALL -Wall) ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_NO_INVALID_OFFSETOF -Wno-invalid-offsetof) ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_NO_SIGN_COMPARE -Wno-sign-compare) + ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_UNDEFINED -Wundef) elseif(CMAKE_C_COMPILER_ID MATCHES "Intel") diff --git a/intern/opennl/CMakeLists.txt b/intern/opennl/CMakeLists.txt index 55b0bc5855f..7d6a579819e 100644 --- a/intern/opennl/CMakeLists.txt +++ b/intern/opennl/CMakeLists.txt @@ -31,6 +31,13 @@ remove_strict_flags() # and debug gives a lot of prints on UV unwrapping. developers can enable if they need to. remove_flag("-DDEBUG") + +# quiet compiler warnings about undefined defines +add_definitions( + -DDEBUGlevel=0 + -DPRNTlevel=0 +) + set(INC extern superlu diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index 6f34383101d..481893b86a8 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -158,7 +158,7 @@ void ntreeInitTypes(bNodeTree *ntree) ntree->init |= NTREE_TYPE_INIT; } -static bNodeSocket *make_socket(bNodeTree *ntree, int in_out, const char *name, int type) +static bNodeSocket *make_socket(bNodeTree *UNUSED(ntree), int in_out, const char *name, int type) { bNodeSocketType *stype= ntreeGetSocketType(type); bNodeSocket *sock; diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c index ec118bb3ca2..6be8978cb5b 100644 --- a/source/blender/editors/space_node/node_draw.c +++ b/source/blender/editors/space_node/node_draw.c @@ -549,7 +549,7 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN bNodeSocket *sock; rctf *rct= &node->totr; float iconofs; - float socket_size= NODE_SOCKSIZE*U.dpi/72; + /* float socket_size= NODE_SOCKSIZE*U.dpi/72; */ /* UNUSED */ float iconbutw= 0.8f*UI_UNIT_X; int color_id= node_get_colorid(node); char showname[128]; /* 128 used below */ diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index 214f375855d..b5633d50997 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -2175,7 +2175,6 @@ static int node_duplicate_exec(bContext *C, wmOperator *op) bNode *node, *newnode, *lastnode; bNodeLink *link, *newlink, *lastlink; int keep_inputs = RNA_boolean_get(op->ptr, "keep_inputs"); - bNodeSocket *sock; ED_preview_kill_jobs(C); diff --git a/source/gameengine/Converter/BL_SkinDeformer.cpp b/source/gameengine/Converter/BL_SkinDeformer.cpp index 3a379e8b0ed..98afcf877a1 100644 --- a/source/gameengine/Converter/BL_SkinDeformer.cpp +++ b/source/gameengine/Converter/BL_SkinDeformer.cpp @@ -243,7 +243,6 @@ void BL_SkinDeformer::BGEDeformVerts() for (int i=0; itotvert; ++i) { float contrib = 0.f, weight, max_weight=0.f; - Bone *bone; bPoseChannel *pchan=NULL; MDeformVert *dvert; Eigen::Map norm(m_transnors[i]); @@ -266,7 +265,6 @@ void BL_SkinDeformer::BGEDeformVerts() if (index < numGroups && (pchan=m_dfnrToPC[index])) { weight = dvert->dw[j].weight; - bone = pchan->bone; if (weight) { diff --git a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp index 7191730187c..656dcfa3220 100644 --- a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp +++ b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp @@ -385,6 +385,12 @@ void KX_BlenderSceneConverter::ConvertScene(class KX_Scene* destinationscene, //This cache mecanism is buggy so I leave it disable and the memory leak //that would result from this is fixed in RemoveScene() m_map_mesh_to_gamemesh.clear(); + +#ifndef USE_BULLET + /* quiet compiler warning */ + (void)useDbvtCulling; +#endif + } // This function removes all entities stored in the converter for that scene From bf5a6531a61638b74b9e80e055e00c2b97483fdf Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 5 Sep 2011 23:46:08 +0000 Subject: [PATCH 091/182] replace define '#if FFTW3==1' --> '#ifdef WITH_FFTW3' --- intern/smoke/CMakeLists.txt | 2 +- intern/smoke/SConscript | 2 +- intern/smoke/intern/FFT_NOISE.h | 2 +- intern/smoke/intern/WTURBULENCE.cpp | 2 +- source/blender/makesrna/intern/CMakeLists.txt | 2 +- source/blender/makesrna/intern/SConscript | 2 +- source/blender/makesrna/intern/rna_smoke.c | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/intern/smoke/CMakeLists.txt b/intern/smoke/CMakeLists.txt index 094d398a83c..228ff6ec389 100644 --- a/intern/smoke/CMakeLists.txt +++ b/intern/smoke/CMakeLists.txt @@ -88,7 +88,7 @@ if(WITH_OPENMP) endif() if(WITH_FFTW3) - add_definitions(-DFFTW3=1) + add_definitions(-DWITH_FFTW3) list(APPEND INC ${FFTW3_INCLUDE_DIRS} ) diff --git a/intern/smoke/SConscript b/intern/smoke/SConscript index fa32c5f36c3..0511257d319 100644 --- a/intern/smoke/SConscript +++ b/intern/smoke/SConscript @@ -16,7 +16,7 @@ incs += ' ' + env['BF_PNG_INC'] + ' ' + env['BF_ZLIB_INC'] incs += ' intern ../../extern/bullet2/src ../memutil ../guardealloc ' if env['WITH_BF_FFTW3']: - defs += ' FFTW3=1' + defs += ' WITH_FFTW3' incs += env['BF_FFTW3_INC'] env.BlenderLib ('bf_intern_smoke', sources, Split(incs), Split(defs), libtype=['intern'], priority=[40] ) diff --git a/intern/smoke/intern/FFT_NOISE.h b/intern/smoke/intern/FFT_NOISE.h index b0597d7b20c..a087b4e1391 100644 --- a/intern/smoke/intern/FFT_NOISE.h +++ b/intern/smoke/intern/FFT_NOISE.h @@ -25,7 +25,7 @@ #ifndef FFT_NOISE_H_ #define FFT_NOISE_H_ -#if FFTW3==1 +#ifdef WITH_FFTW3 #include #include #include diff --git a/intern/smoke/intern/WTURBULENCE.cpp b/intern/smoke/intern/WTURBULENCE.cpp index 9934e3017cf..cd18cf7b344 100644 --- a/intern/smoke/intern/WTURBULENCE.cpp +++ b/intern/smoke/intern/WTURBULENCE.cpp @@ -155,7 +155,7 @@ void WTURBULENCE::setNoise(int type) if(type == (1<<1)) // FFT { // needs fft - #if FFTW3==1 + #ifdef WITH_FFTW3 std::string noiseTileFilename = std::string("noise.fft"); generatTile_FFT(_noiseTile, noiseTileFilename); #endif diff --git a/source/blender/makesrna/intern/CMakeLists.txt b/source/blender/makesrna/intern/CMakeLists.txt index 0307b5222d7..c2b46a3b69a 100644 --- a/source/blender/makesrna/intern/CMakeLists.txt +++ b/source/blender/makesrna/intern/CMakeLists.txt @@ -200,7 +200,7 @@ if(NOT WITH_MOD_FLUID) endif() if(WITH_FFTW3) - add_definitions(-DFFTW3=1) + add_definitions(-DWITH_FFTW3) endif() if(WITH_SDL) diff --git a/source/blender/makesrna/intern/SConscript b/source/blender/makesrna/intern/SConscript index 24c892b96c4..5c2580e4b90 100644 --- a/source/blender/makesrna/intern/SConscript +++ b/source/blender/makesrna/intern/SConscript @@ -71,7 +71,7 @@ if env['WITH_BF_GAMEENGINE']: defs.append('WITH_GAMEENGINE') if env['WITH_BF_FFTW3']: - defs.append('FFTW3=1') + defs.append('WITH_FFTW3') if env['WITH_BF_SDL']: defs.append('WITH_SDL') diff --git a/source/blender/makesrna/intern/rna_smoke.c b/source/blender/makesrna/intern/rna_smoke.c index d439c2551f1..93ffa62a4c6 100644 --- a/source/blender/makesrna/intern/rna_smoke.c +++ b/source/blender/makesrna/intern/rna_smoke.c @@ -121,7 +121,7 @@ static void rna_def_smoke_domain_settings(BlenderRNA *brna) static EnumPropertyItem prop_noise_type_items[] = { {MOD_SMOKE_NOISEWAVE, "NOISEWAVE", 0, "Wavelet", ""}, -#if FFTW3 == 1 +#ifdef WITH_FFTW3 {MOD_SMOKE_NOISEFFT, "NOISEFFT", 0, "FFT", ""}, #endif /* {MOD_SMOKE_NOISECURL, "NOISECURL", 0, "Curl", ""}, */ From 67712c10c4ff3cad574c5daed0e22b30dc769bad Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 6 Sep 2011 00:12:34 +0000 Subject: [PATCH 092/182] fix for doc building after pepper merge, also WIP tips/tricks. --- doc/python_api/rst/info_tips_and_tricks.rst | 118 ++++++++++++++++---- doc/python_api/sphinx_doc_gen.py | 1 + 2 files changed, 98 insertions(+), 21 deletions(-) diff --git a/doc/python_api/rst/info_tips_and_tricks.rst b/doc/python_api/rst/info_tips_and_tricks.rst index bd5faf000c8..f4e68a4516c 100644 --- a/doc/python_api/rst/info_tips_and_tricks.rst +++ b/doc/python_api/rst/info_tips_and_tricks.rst @@ -1,34 +1,112 @@ -############### +*************** Tips and Tricks -############### +*************** Some of these are just python features that scripters may not have thaught to use with blender. -**************** Use The Terminal -**************** +================ + +When writing python scripts, its useful to have a terminal open, this is not the built-in python console but a terminal application which is used to start blender. + +There are 3 main uses for the terminal, these are: + +* You can see the output of `print()` as you're script runs, which is useful to view debug info. + +* The error tracebacks are printed in full to the terminal which wont always generate an error popup in blenders user interface (depending on how the script is executed). + +* If the script runs for too long or you accidentally enter an infinate loop, Ctrl+C in the terminal (Ctrl+Break on Windows) will quit the script early. + +.. note:: + For Linux and OSX users this means starting the terminal first, then running blender from within it. On Windows the terminal can be enabled from the help menu. -For Linux and OSX users this means starting the terminal first, then running blender from within it. on Windows the terminal can be enabled from the help menu. -******************** Run External Scripts -******************** +==================== + +Blenders text editor is fine for edits and writing small tests but it is not a full featured editor so for larger projects you'll probably want to use an external editor. + +Editing a text file externally and having the same text open in blender does work but isn't that optimal so here are 2 ways you can easily use an external file from blender. + + +Executing External Scripts +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This is the equivilent to running the script directly, referencing a scripts path from a 2 line textblock. + +.. code-block:: + + filename = "/full/path/to/myscript.py" + exec(compile(open(filename).read(), filename, 'exec')) + + +You might also want to reference the file relative to the blend file. + +.. code-block:: + + filename = "/full/path/to/script.py" + exec(compile(open(filename).read(), filename, 'exec')) + + +You might want to reference a script thats at the same location as the blend file. + +.. code-block:: + + import bpy + import os + + filename = os.path.join(os.path.basename(bpy.data.filepath), "myscript.py") + exec(compile(open(filename).read(), filename, 'exec')) + + +Executing Modules +^^^^^^^^^^^^^^^^^ + +This example shows loading a script in as a module and executing a module function. + +.. code-block:: + + import myscript + import imp + + imp.reload(myscript) + myscript.main() + + +Notice that the script is reloaded every time, this forces an update, normally the module stays cached in `sys.modules`. + +The main difference between this and executing the script directly is it has to call a function in the module, in this case `main()` but it can be any function, an advantage with this is you can pass argumnents to the function from this small script which is often useful for testing differnt settings quickly. + +The other issue with this is the script has to be in pythons module search path. +While this is not best practice - for testing you can extend the search path, this example adds the current blend files directory to the search path, then loads the script as a module. + +.. code-block:: + + import sys + import os + impory bpy + + blend_dir = os.path.basename(bpy.data.filepath) + if blend_dir not in sys.path: + sys.path.append(blend_dir) + + import myscript + import imp + imp.reload(myscript) + myscript.main() -****************** Don't Use Blender! -****************** +================== -****************** Use External Tools -****************** +================== -************** Bundled Python -************** +============== Blender from blender.org includes a compleate python installation on all platforms, this has the disadvantage that any extensions you have installed in you're systems python wont be found by blender. @@ -38,20 +116,18 @@ There are 2 ways around this: * copy the extensions into blender's python subdirectry so blender can access them, you could also copy the entire python installation into blenders subdirectory, replacing the one blender comes with. This works as long as the python versions match and the paths are created in the same location relative locations. Doing this has the advantage that you can redistribute this bundle to others with blender and/or the game player, including any extensions you rely on. -******** + Advanced -******** +======== -=================== Blender as a module -=================== +------------------- -============================ Python Safety (Build Option) -============================ +---------------------------- + -================= CTypes in Blender -================= +----------------- diff --git a/doc/python_api/sphinx_doc_gen.py b/doc/python_api/sphinx_doc_gen.py index e378dd19e73..661d41af4ef 100644 --- a/doc/python_api/sphinx_doc_gen.py +++ b/doc/python_api/sphinx_doc_gen.py @@ -578,6 +578,7 @@ def pycontext2sphinx(BASEPATH): "sequences": ("Sequence", True), "smoke": ("SmokeModifier", False), "soft_body": ("SoftBodyModifier", False), + "speaker": ("Speaker", False), "texture": ("Texture", False), "texture_slot": ("MaterialTextureSlot", False), "vertex_paint_object": ("Object", False), From fa32395b33f084d5c6c9d8026fd7d53335c9b41a Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 6 Sep 2011 00:41:28 +0000 Subject: [PATCH 093/182] more minor doc fixes --- doc/python_api/rst/bgl.rst | 90 +++++++++++++------------- doc/python_api/rst/info_quickstart.rst | 2 +- 2 files changed, 46 insertions(+), 46 deletions(-) diff --git a/doc/python_api/rst/bgl.rst b/doc/python_api/rst/bgl.rst index 5f3158bf5dd..61400351d16 100644 --- a/doc/python_api/rst/bgl.rst +++ b/doc/python_api/rst/bgl.rst @@ -56,9 +56,9 @@ OpenGL}" and the online NeHe tutorials are two of the best resources. :type n: int :arg n: Specifies the number of textures to be queried. - :type textures: :class:`Buffer` object I{type GL_INT} + :type textures: :class:`bgl.Buffer` object I{type GL_INT} :arg textures: Specifies an array containing the names of the textures to be queried - :type residences: :class:`Buffer` object I{type GL_INT}(boolean) + :type residences: :class:`bgl.Buffer` object I{type GL_INT}(boolean) :arg residences: An array in which the texture residence status in returned. The residence status of a texture named by an element of textures is returned in the corresponding element of residences. @@ -101,7 +101,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources. :type xmove, ymove: float :arg xmove, ymove: Specify the x and y offsets to be added to the current raster position after the bitmap is drawn. - :type bitmap: :class:`Buffer` object I{type GL_BYTE} + :type bitmap: :class:`bgl.Buffer` object I{type GL_BYTE} :arg bitmap: Specifies the address of the bitmap image. @@ -139,7 +139,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources. :arg n: Specifies the number of display lists to be executed. :type type: Enumerated constant :arg type: Specifies the type of values in lists. - :type lists: :class:`Buffer` object + :type lists: :class:`bgl.Buffer` object :arg lists: Specifies the address of an array of name offsets in the display list. The pointer type is void because the offsets can be bytes, shorts, ints, or floats, depending on the value of type. @@ -217,7 +217,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources. :type plane: Enumerated constant :arg plane: Specifies which clipping plane is being positioned. - :type equation: :class:`Buffer` object I{type GL_FLOAT}(double) + :type equation: :class:`bgl.Buffer` object I{type GL_FLOAT}(double) :arg equation: Specifies the address of an array of four double- precision floating-point values. These values are interpreted as a plane equation. @@ -340,7 +340,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources. :type n: int :arg n: Specifies the number of textures to be deleted - :type textures: :class:`Buffer` I{GL_INT} + :type textures: :class:`bgl.Buffer` I{GL_INT} :arg textures: Specifies an array of textures to be deleted @@ -413,7 +413,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources. :arg format: Specifies the format of the pixel data. :type type: Enumerated constant :arg type: Specifies the data type for pixels. - :type pixels: :class:`Buffer` object + :type pixels: :class:`bgl.Buffer` object :arg pixels: Specifies a pointer to the pixel data. @@ -512,7 +512,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources. :type type: Enumerated constant :arg type: Specifies a symbolic constant that describes the information that will be returned for each vertex. - :type buffer: :class:`Buffer` object I{GL_FLOAT} + :type buffer: :class:`bgl.Buffer` object I{GL_FLOAT} :arg buffer: Returns the feedback data. @@ -592,7 +592,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources. :type n: int :arg n: Specifies the number of textures name to be generated. - :type textures: :class:`Buffer` object I{type GL_INT} + :type textures: :class:`bgl.Buffer` object I{type GL_INT} :arg textures: Specifies an array in which the generated textures names are stored. @@ -620,7 +620,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources. :arg plane: Specifies a clipping plane. The number of clipping planes depends on the implementation, but at least six clipping planes are supported. They are identified by symbolic names of the form GL_CLIP_PLANEi where 0 < i < GL_MAX_CLIP_PLANES. - :type equation: :class:`Buffer` object I{type GL_FLOAT} + :type equation: :class:`bgl.Buffer` object I{type GL_FLOAT} :arg equation: Returns four float (double)-precision values that are the coefficients of the plane equation of plane in eye coordinates. The initial value is (0, 0, 0, 0). @@ -646,7 +646,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources. names of the form GL_LIGHTi where 0 < i < GL_MAX_LIGHTS. :type pname: Enumerated constant :arg pname: Specifies a light source parameter for light. - :type params: :class:`Buffer` object. Depends on function prototype. + :type params: :class:`bgl.Buffer` object. Depends on function prototype. :arg params: Returns the requested data. @@ -662,7 +662,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources. :arg target: Specifies the symbolic name of a map. :type query: Enumerated constant :arg query: Specifies which parameter to return. - :type v: :class:`Buffer` object. Depends on function prototype. + :type v: :class:`bgl.Buffer` object. Depends on function prototype. :arg v: Returns the requested data. @@ -679,7 +679,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources. representing the front and back materials, respectively. :type pname: Enumerated constant :arg pname: Specifies the material parameter to return. - :type params: :class:`Buffer` object. Depends on function prototype. + :type params: :class:`bgl.Buffer` object. Depends on function prototype. :arg params: Returns the requested data. @@ -693,7 +693,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources. :type map: Enumerated constant :arg map: Specifies the name of the pixel map to return. - :type values: :class:`Buffer` object. Depends on function prototype. + :type values: :class:`bgl.Buffer` object. Depends on function prototype. :arg values: Returns the pixel map contents. @@ -703,7 +703,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources. .. seealso:: `OpenGL Docs `_ - :type mask: :class:`Buffer` object I{type GL_BYTE} + :type mask: :class:`bgl.Buffer` object I{type GL_BYTE} :arg mask: Returns the stipple pattern. The initial value is all 1's. @@ -730,7 +730,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources. :arg target: Specifies a texture environment. Must be GL_TEXTURE_ENV. :type pname: Enumerated constant :arg pname: Specifies the symbolic name of a texture environment parameter. - :type params: :class:`Buffer` object. Depends on function prototype. + :type params: :class:`bgl.Buffer` object. Depends on function prototype. :arg params: Returns the requested data. @@ -746,7 +746,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources. :arg coord: Specifies a texture coordinate. :type pname: Enumerated constant :arg pname: Specifies the symbolic name of the value(s) to be returned. - :type params: :class:`Buffer` object. Depends on function prototype. + :type params: :class:`bgl.Buffer` object. Depends on function prototype. :arg params: Returns the requested data. @@ -765,7 +765,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources. :arg format: Specifies a pixel format for the returned data. :type type: Enumerated constant :arg type: Specifies a pixel type for the returned data. - :type pixels: :class:`Buffer` object. + :type pixels: :class:`bgl.Buffer` object. :arg pixels: Returns the texture image. Should be a pointer to an array of the type specified by type @@ -785,7 +785,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources. Level 0 is the base image level. Level n is the nth mipmap reduction image. :type pname: Enumerated constant :arg pname: Specifies the symbolic name of a texture parameter. - :type params: :class:`Buffer` object. Depends on function prototype. + :type params: :class:`bgl.Buffer` object. Depends on function prototype. :arg params: Returns the requested data. @@ -801,7 +801,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources. :arg target: Specifies the symbolic name of the target texture. :type pname: Enumerated constant :arg pname: Specifies the symbolic name the target texture. - :type params: :class:`Buffer` object. Depends on function prototype. + :type params: :class:`bgl.Buffer` object. Depends on function prototype. :arg params: Returns the texture parameters. @@ -826,7 +826,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources. .. seealso:: `OpenGL Docs `_ - :type c: :class:`Buffer` object. Depends on function prototype. + :type c: :class:`bgl.Buffer` object. Depends on function prototype. :arg c: Specifies a pointer to a one element array that contains the new value for the current color index. @@ -956,7 +956,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources. .. seealso:: `OpenGL Docs `_ - :type m: :class:`Buffer` object. Depends on function prototype. + :type m: :class:`bgl.Buffer` object. Depends on function prototype. :arg m: Specifies a pointer to 16 consecutive values, which are used as the elements of a 4x4 column-major matrix. @@ -1002,7 +1002,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources. occupy contiguous memory locations. :type order: int :arg order: Specifies the number of control points. Must be positive. - :type points: :class:`Buffer` object. Depends on function prototype. + :type points: :class:`bgl.Buffer` object. Depends on function prototype. :arg points: Specifies a pointer to the array of control points. @@ -1043,7 +1043,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources. :type vorder: int :arg vorder: Specifies the dimension of the control point array in the v axis. Must be positive. The initial value is 1. - :type points: :class:`Buffer` object. Depends on function prototype. + :type points: :class:`bgl.Buffer` object. Depends on function prototype. :arg points: Specifies a pointer to the array of control points. @@ -1103,7 +1103,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources. .. seealso:: `OpenGL Docs `_ - :type m: :class:`Buffer` object. Depends on function prototype. + :type m: :class:`bgl.Buffer` object. Depends on function prototype. :arg m: Points to 16 consecutive values that are used as the elements of a 4x4 column major matrix. @@ -1132,7 +1132,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources. :type nx, ny, nz: Depends on function prototype. (non - 'v' prototypes only) :arg nx, ny, nz: Specify the x, y, and z coordinates of the new current normal. The initial value of the current normal is the unit vector, (0, 0, 1). - :type v: :class:`Buffer` object. Depends on function prototype. ('v' prototypes) + :type v: :class:`bgl.Buffer` object. Depends on function prototype. ('v' prototypes) :arg v: Specifies a pointer to an array of three elements: the x, y, and z coordinates of the new current normal. @@ -1177,7 +1177,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources. :arg map: Specifies a symbolic map name. :type mapsize: int :arg mapsize: Specifies the size of the map being defined. - :type values: :class:`Buffer` object. Depends on function prototype. + :type values: :class:`bgl.Buffer` object. Depends on function prototype. :arg values: Specifies an array of mapsize values. @@ -1266,7 +1266,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources. .. seealso:: `OpenGL Docs `_ - :type mask: :class:`Buffer` object I{type GL_BYTE} + :type mask: :class:`bgl.Buffer` object I{type GL_BYTE} :arg mask: Specifies a pointer to a 32x32 stipple pattern that will be unpacked from memory in the same way that glDrawPixels unpacks pixels. @@ -1307,9 +1307,9 @@ OpenGL}" and the online NeHe tutorials are two of the best resources. :type n: int :arg n: Specifies the number of textures to be prioritized. - :type textures: :class:`Buffer` I{type GL_INT} + :type textures: :class:`bgl.Buffer` I{type GL_INT} :arg textures: Specifies an array containing the names of the textures to be prioritized. - :type priorities: :class:`Buffer` I{type GL_FLOAT} + :type priorities: :class:`bgl.Buffer` I{type GL_FLOAT} :arg priorities: Specifies an array containing the texture priorities. A priority given in an element of priorities applies to the texture named by the corresponding element of textures. @@ -1417,7 +1417,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources. :arg format: Specifies the format of the pixel data. :type type: Enumerated constant :arg type: Specifies the data type of the pixel data. - :type pixels: :class:`Buffer` object + :type pixels: :class:`bgl.Buffer` object :arg pixels: Returns the pixel data. @@ -1496,7 +1496,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources. :type size: int :arg size: Specifies the size of buffer - :type buffer: :class:`Buffer` I{type GL_INT} + :type buffer: :class:`bgl.Buffer` I{type GL_INT} :arg buffer: Returns the selection data @@ -1575,7 +1575,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources. :type s, t, r, q: Depends on function prototype. (r and q for '3' and '4' prototypes only) :arg s, t, r, q: Specify s, t, r, and q texture coordinates. Not all parameters are present in all forms of the command. - :type v: :class:`Buffer` object. Depends on function prototype. (for 'v' prototypes only) + :type v: :class:`bgl.Buffer` object. Depends on function prototype. (for 'v' prototypes only) :arg v: Specifies a pointer to an array of one, two, three, or four elements, which in turn specify the s, t, r, and q texture coordinates. @@ -1642,7 +1642,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources. :arg format: Specifies the format of the pixel data. :type type: Enumerated constant :arg type: Specifies the data type of the pixel data. - :type pixels: :class:`Buffer` object. + :type pixels: :class:`bgl.Buffer` object. :arg pixels: Specifies a pointer to the image data in memory. @@ -1673,7 +1673,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources. :arg format: Specifies the format of the pixel data. :type type: Enumerated constant :arg type: Specifies the data type of the pixel data. - :type pixels: :class:`Buffer` object. + :type pixels: :class:`bgl.Buffer` object. :arg pixels: Specifies a pointer to the image data in memory. @@ -1720,7 +1720,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources. :type x, y, z, w: Depends on function prototype (z and w for '3' and '4' prototypes only) :arg x, y, z, w: Specify x, y, z, and w coordinates of a vertex. Not all parameters are present in all forms of the command. - :type v: :class:`Buffer` object. Depends of function prototype (for 'v' + :type v: :class:`bgl.Buffer` object. Depends of function prototype (for 'v' prototypes only) :arg v: Specifies a pointer to an array of two, three, or four elements. The elements of a two-element array are x and y; of a three-element array, @@ -1795,7 +1795,7 @@ OpenGL}" and the online NeHe tutorials are two of the best resources. :arg x, y: Specify the center of a picking region in window coordinates. :type width, height: double :arg width, height: Specify the width and height, respectively, of the picking region in window coordinates. - :type viewport: :class:`Buffer` object. [int] + :type viewport: :class:`bgl.Buffer` object. [int] :arg viewport: Specifies the current viewport. @@ -1807,13 +1807,13 @@ OpenGL}" and the online NeHe tutorials are two of the best resources. :type objx, objy, objz: double :arg objx, objy, objz: Specify the object coordinates. - :type modelMatrix: :class:`Buffer` object. [double] + :type modelMatrix: :class:`bgl.Buffer` object. [double] :arg modelMatrix: Specifies the current modelview matrix (as from a glGetDoublev call). - :type projMatrix: :class:`Buffer` object. [double] + :type projMatrix: :class:`bgl.Buffer` object. [double] :arg projMatrix: Specifies the current projection matrix (as from a glGetDoublev call). - :type viewport: :class:`Buffer` object. [int] + :type viewport: :class:`bgl.Buffer` object. [int] :arg viewport: Specifies the current viewport (as from a glGetIntegerv call). - :type winx, winy, winz: :class:`Buffer` object. [double] + :type winx, winy, winz: :class:`bgl.Buffer` object. [double] :arg winx, winy, winz: Return the computed window coordinates. @@ -1825,13 +1825,13 @@ OpenGL}" and the online NeHe tutorials are two of the best resources. :type winx, winy, winz: double :arg winx, winy, winz: Specify the window coordinates to be mapped. - :type modelMatrix: :class:`Buffer` object. [double] + :type modelMatrix: :class:`bgl.Buffer` object. [double] :arg modelMatrix: Specifies the current modelview matrix (as from a glGetDoublev call). - :type projMatrix: :class:`Buffer` object. [double] + :type projMatrix: :class:`bgl.Buffer` object. [double] :arg projMatrix: Specifies the current projection matrix (as from a glGetDoublev call). - :type viewport: :class:`Buffer` object. [int] + :type viewport: :class:`bgl.Buffer` object. [int] :arg viewport: Specifies the current viewport (as from a glGetIntegerv call). - :type objx, objy, objz: :class:`Buffer` object. [double] + :type objx, objy, objz: :class:`bgl.Buffer` object. [double] :arg objx, objy, objz: Return the computed object coordinates. diff --git a/doc/python_api/rst/info_quickstart.rst b/doc/python_api/rst/info_quickstart.rst index e77e9a76d7f..751e5e1ec61 100644 --- a/doc/python_api/rst/info_quickstart.rst +++ b/doc/python_api/rst/info_quickstart.rst @@ -156,7 +156,7 @@ Note that these properties can only be assigned basic Python types. * array of ints/floats -* dictionary (only string keys types on this list) +* dictionary (only string keys are supported, values must be basic types too) These properties are valid outside of Python. They can be animated by curves or used in driver paths. From a41f45946f8bf7b58e2b6bc048bfa30015e4ba2f Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 6 Sep 2011 07:08:20 +0000 Subject: [PATCH 094/182] fix for error in strinc.c's BLI_strescape --- source/blender/blenlib/intern/string.c | 4 +++- source/blender/makesrna/intern/rna_access.c | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/source/blender/blenlib/intern/string.c b/source/blender/blenlib/intern/string.c index c4ed44f0cdb..ae5fa40f3b9 100644 --- a/source/blender/blenlib/intern/string.c +++ b/source/blender/blenlib/intern/string.c @@ -129,7 +129,7 @@ size_t BLI_strescape(char *dst, const char *src, const size_t maxlen) while(len < maxlen) { switch(*src) { case '\0': - break; + goto escape_finish; case '\\': case '"': @@ -154,6 +154,8 @@ size_t BLI_strescape(char *dst, const char *src, const size_t maxlen) len++; } +escape_finish: + *dst= '\0'; return len; diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c index 936f2e5e40c..e7d0c5cdec2 100644 --- a/source/blender/makesrna/intern/rna_access.c +++ b/source/blender/makesrna/intern/rna_access.c @@ -4407,7 +4407,7 @@ char *RNA_property_as_string(bContext *C, PointerRNA *ptr, PropertyRNA *prop) buf= MEM_mallocN(sizeof(char)*(length+1), "RNA_property_as_string"); buf_esc= MEM_mallocN(sizeof(char)*(length*2+1), "RNA_property_as_string esc"); RNA_property_string_get(ptr, prop, buf); - BLI_strescape(buf_esc, buf, length*2); + BLI_strescape(buf_esc, buf, length*2+1); MEM_freeN(buf); BLI_dynstr_appendf(dynstr, "\"%s\"", buf_esc); MEM_freeN(buf_esc); From c94fe5e2995873536cbdb180652b1aa027e4ef8d Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 6 Sep 2011 07:59:18 +0000 Subject: [PATCH 095/182] Grease pencil: non-blocking sketch sessions - Implement own undo stack for grease pencil, so now there'll be no keymaps conflicts. - Supported redo's during sketch session. - Get rid of flag stored in Globals -- use undo stack to check if grease pencil session is active. --- source/blender/blenkernel/BKE_global.h | 2 +- source/blender/editors/gpencil/CMakeLists.txt | 1 + source/blender/editors/gpencil/drawgpencil.c | 2 +- .../blender/editors/gpencil/gpencil_intern.h | 6 + .../blender/editors/gpencil/gpencil_paint.c | 136 +++++++------- source/blender/editors/gpencil/gpencil_undo.c | 168 ++++++++++++++++++ source/blender/editors/include/ED_gpencil.h | 4 + source/blender/editors/util/undo.c | 6 + 8 files changed, 263 insertions(+), 62 deletions(-) create mode 100644 source/blender/editors/gpencil/gpencil_undo.c diff --git a/source/blender/blenkernel/BKE_global.h b/source/blender/blenkernel/BKE_global.h index 17876c6ec9d..0e48673f1b1 100644 --- a/source/blender/blenkernel/BKE_global.h +++ b/source/blender/blenkernel/BKE_global.h @@ -111,7 +111,7 @@ typedef struct Global { #define G_SCRIPT_OVERRIDE_PREF (1 << 14) /* when this flag is set ignore the userprefs */ /* #define G_NOFROZEN (1 << 17) also removed */ -#define G_GREASEPENCIL (1 << 17) +/* #define G_GREASEPENCIL (1 << 17) also removed */ /* #define G_AUTOMATKEYS (1 << 30) also removed */ diff --git a/source/blender/editors/gpencil/CMakeLists.txt b/source/blender/editors/gpencil/CMakeLists.txt index 7a2f196fd6d..b312f397939 100644 --- a/source/blender/editors/gpencil/CMakeLists.txt +++ b/source/blender/editors/gpencil/CMakeLists.txt @@ -42,6 +42,7 @@ set(SRC gpencil_edit.c gpencil_ops.c gpencil_paint.c + gpencil_undo.c gpencil_intern.h ) diff --git a/source/blender/editors/gpencil/drawgpencil.c b/source/blender/editors/gpencil/drawgpencil.c index 440d5ee7c4d..cfa9585868e 100644 --- a/source/blender/editors/gpencil/drawgpencil.c +++ b/source/blender/editors/gpencil/drawgpencil.c @@ -644,7 +644,7 @@ static void gp_draw_data (bGPdata *gpd, int offsx, int offsy, int winx, int winy /* Check if may need to draw the active stroke cache, only if this layer is the active layer * that is being edited. (Stroke buffer is currently stored in gp-data) */ - if ((G.f & G_GREASEPENCIL) && (gpl->flag & GP_LAYER_ACTIVE) && + if (ED_gpencil_session_active() && (gpl->flag & GP_LAYER_ACTIVE) && (gpf->flag & GP_FRAME_PAINT)) { /* Buffer stroke needs to be drawn with a different linestyle to help differentiate them from normal strokes. */ diff --git a/source/blender/editors/gpencil/gpencil_intern.h b/source/blender/editors/gpencil/gpencil_intern.h index c31de8d30a7..db4315a8ca6 100644 --- a/source/blender/editors/gpencil/gpencil_intern.h +++ b/source/blender/editors/gpencil/gpencil_intern.h @@ -37,6 +37,7 @@ /* ***************************************************** */ /* Operator Defines */ +struct bGPdata; struct wmOperatorType; /* drawing ---------- */ @@ -61,6 +62,11 @@ void GPENCIL_OT_active_frame_delete(struct wmOperatorType *ot); void GPENCIL_OT_convert(struct wmOperatorType *ot); +/* undo stack ---------- */ + +void gpencil_undo_init(struct bGPdata *gpd); +void gpencil_undo_push(struct bGPdata *gpd); +void gpencil_undo_finish(void); /******************************************************* */ /* FILTERED ACTION DATA - TYPES ---> XXX DEPRECEATED OLD ANIM SYSTEM CODE! */ diff --git a/source/blender/editors/gpencil/gpencil_paint.c b/source/blender/editors/gpencil/gpencil_paint.c index 04565eab155..df5fa65c980 100644 --- a/source/blender/editors/gpencil/gpencil_paint.c +++ b/source/blender/editors/gpencil/gpencil_paint.c @@ -152,7 +152,7 @@ static int gpencil_draw_poll (bContext *C) /* check if current context can support GPencil data */ if (gpencil_data_get_pointers(C, NULL) != NULL) { /* check if Grease Pencil isn't already running */ - if ((G.f & G_GREASEPENCIL) == 0) + if (ED_gpencil_session_active() == 0) return 1; else CTX_wm_operator_poll_msg_set(C, "Grease Pencil operator is already active"); @@ -893,8 +893,10 @@ static void gp_session_validatebuffer (tGPsdata *p) /* clear memory of buffer (or allocate it if starting a new session) */ if (gpd->sbuffer) memset(gpd->sbuffer, 0, sizeof(tGPspoint)*GP_STROKE_BUFFER_MAX); - else + else { + //printf("\t\tGP - allocate sbuffer\n"); gpd->sbuffer= MEM_callocN(sizeof(tGPspoint)*GP_STROKE_BUFFER_MAX, "gp_session_strokebuffer"); + } /* reset indices */ gpd->sbuffer_size = 0; @@ -1051,8 +1053,11 @@ static tGPsdata *gp_session_initpaint (bContext *C) p->gpd= *gpd_ptr; } - /* set edit flags - so that buffer will get drawn */ - G.f |= G_GREASEPENCIL; + if(ED_gpencil_session_active()==0) { + /* initialize undo stack, + also, existing undo stack would make buffer drawn */ + gpencil_undo_init(p->gpd); + } /* clear out buffer (stored in gp-data), in case something contaminated it */ gp_session_validatebuffer(p); @@ -1078,6 +1083,7 @@ static void gp_session_cleanup (tGPsdata *p) /* free stroke buffer */ if (gpd->sbuffer) { + //printf("\t\tGP - free sbuffer\n"); MEM_freeN(gpd->sbuffer); gpd->sbuffer= NULL; } @@ -1247,7 +1253,8 @@ static void gp_paint_strokeend (tGPsdata *p) static void gp_paint_cleanup (tGPsdata *p) { /* finish off a stroke */ - gp_paint_strokeend(p); + if(p->gpd) + gp_paint_strokeend(p); /* "unlock" frame */ if (p->gpf) @@ -1260,8 +1267,8 @@ static void gpencil_draw_exit (bContext *C, wmOperator *op) { tGPsdata *p= op->customdata; - /* clear edit flags */ - G.f &= ~G_GREASEPENCIL; + /* clear undo stack */ + gpencil_undo_finish(); /* restore cursor to indicate end of drawing */ WM_cursor_restore(CTX_wm_window(C)); @@ -1592,6 +1599,7 @@ static int gpencil_draw_invoke (bContext *C, wmOperator *op, wmEvent *event) //printf("\tGP - hotkey invoked... waiting for click-drag\n"); } + WM_event_add_notifier(C, NC_SCREEN|ND_GPENCIL, NULL); /* add a modal handler for this operator, so that we can then draw continuous strokes */ WM_event_add_modal_handler(C, op); return OPERATOR_RUNNING_MODAL; @@ -1609,16 +1617,60 @@ static int gpencil_area_exists(bContext *C, ScrArea *satest) return 0; } +static tGPsdata *gpencil_stroke_begin(bContext *C, wmOperator *op) +{ + tGPsdata *p= op->customdata; + + /* we must check that we're still within the area that we're set up to work from + * otherwise we could crash (see bug #20586) + */ + if (CTX_wm_area(C) != p->sa) { + printf("\t\t\tGP - wrong area execution abort! \n"); + p->status= GP_STATUS_ERROR; + } + + /* free pointer used by previous stroke */ + if(p) + MEM_freeN(p); + + //printf("\t\tGP - start stroke \n"); + + /* we may need to set up paint env again if we're resuming */ + // XXX: watch it with the paintmode! in future, it'd be nice to allow changing paint-mode when in sketching-sessions + // XXX: with tablet events, we may event want to check for eraser here, for nicer tablet support + + gpencil_draw_init(C, op); + + p= op->customdata; + + if(p->status != GP_STATUS_ERROR) + p->status= GP_STATUS_PAINTING; + + return op->customdata; +} + +static void gpencil_stroke_end(wmOperator *op) +{ + tGPsdata *p= op->customdata; + + gp_paint_cleanup(p); + + gpencil_undo_push(p->gpd); + + gp_session_cleanup(p); + + p->status= GP_STATUS_IDLING; + + p->gpd= NULL; + p->gpl= NULL; + p->gpf= NULL; +} + /* events handling during interactive drawing part of operator */ static int gpencil_draw_modal (bContext *C, wmOperator *op, wmEvent *event) { tGPsdata *p= op->customdata; - //int estate = OPERATOR_PASS_THROUGH; /* default exit state - not handled, so let others have a share of the pie */ - /* currently, grease pencil conflicts with such operators as undo and set object mode - which makes behavior of operator totally unpredictable and crash for some cases. - the only way to solve this proper is to ger rid of pointers to data which can - chage stored in operator custom data (sergey) */ - int estate = OPERATOR_RUNNING_MODAL; + int estate = OPERATOR_PASS_THROUGH; /* default exit state - not handled, so let others have a share of the pie */ // if (event->type == NDOF_MOTION) // return OPERATOR_PASS_THROUGH; @@ -1652,11 +1704,13 @@ static int gpencil_draw_modal (bContext *C, wmOperator *op, wmEvent *event) if (GPENCIL_SKETCH_SESSIONS_ON(p->scene)) { /* end stroke only, and then wait to resume painting soon */ //printf("\t\tGP - end stroke only\n"); - gp_paint_cleanup(p); - p->status= GP_STATUS_IDLING; + gpencil_stroke_end(op); /* we've just entered idling state, so this event was processed (but no others yet) */ estate = OPERATOR_RUNNING_MODAL; + + /* stroke could be smoothed, send notifier to refresh screen */ + ED_region_tag_redraw(p->ar); } else { //printf("\t\tGP - end of stroke + op\n"); @@ -1664,35 +1718,19 @@ static int gpencil_draw_modal (bContext *C, wmOperator *op, wmEvent *event) estate = OPERATOR_FINISHED; } } - else { + else if (event->val == KM_PRESS) { /* not painting, so start stroke (this should be mouse-button down) */ - /* we must check that we're still within the area that we're set up to work from - * otherwise we could crash (see bug #20586) - */ - if (CTX_wm_area(C) != p->sa) { - //printf("\t\t\tGP - wrong area execution abort! \n"); - p->status= GP_STATUS_ERROR; + p= gpencil_stroke_begin(C, op); + + if (p->status == GP_STATUS_ERROR) { estate = OPERATOR_CANCELLED; } - else { - //printf("\t\tGP - start stroke \n"); - p->status= GP_STATUS_PAINTING; - - /* we may need to set up paint env again if we're resuming */ - // XXX: watch it with the paintmode! in future, it'd be nice to allow changing paint-mode when in sketching-sessions - // XXX: with tablet events, we may event want to check for eraser here, for nicer tablet support - gp_paint_initstroke(p, p->paintmode); - - if (p->status == GP_STATUS_ERROR) { - estate = OPERATOR_CANCELLED; - } - } + } else { + p->status = GP_STATUS_IDLING; } } - - /* handle mode-specific events */ if (p->status == GP_STATUS_PAINTING) { /* handle painting mouse-movements? */ @@ -1704,7 +1742,7 @@ static int gpencil_draw_modal (bContext *C, wmOperator *op, wmEvent *event) /* finish painting operation if anything went wrong just now */ if (p->status == GP_STATUS_ERROR) { - //printf("\t\t\t\tGP - add error done! \n"); + printf("\t\t\t\tGP - add error done! \n"); estate = OPERATOR_CANCELLED; } else { @@ -1721,28 +1759,6 @@ static int gpencil_draw_modal (bContext *C, wmOperator *op, wmEvent *event) estate = OPERATOR_RUNNING_MODAL; } } - else if (p->status == GP_STATUS_IDLING) { - /* standard undo/redo shouldn't be allowed to execute or else it causes crashes, so catch it here */ - // FIXME: this is a hardcoded hotkey that can't be changed - // TODO: catch redo as well, but how? - if (event->type == ZKEY && event->val == KM_RELEASE) { - /* oskey = cmd key on macs as they seem to use cmd-z for undo as well? */ - if ((event->ctrl) || (event->oskey)) { - /* just delete last stroke, which will look like undo to the end user */ - //printf("caught attempted undo event... deleting last stroke \n"); - gpencil_frame_delete_laststroke(p->gpl, p->gpf); - /* undoing the last line can free p->gpf - * note, could do this in a bit more of an elegant way then a search but it at least prevents a crash */ - if(BLI_findindex(&p->gpl->frames, p->gpf) == -1) { - p->gpf= NULL; - } - - /* event handled, so force refresh */ - ED_region_tag_redraw(p->ar); /* just active area for now, since doing whole screen is too slow */ - estate = OPERATOR_RUNNING_MODAL; - } - } - } /* gpencil modal operator stores area, which can be removed while using it (like fullscreen) */ if(0==gpencil_area_exists(C, p->sa)) diff --git a/source/blender/editors/gpencil/gpencil_undo.c b/source/blender/editors/gpencil/gpencil_undo.c new file mode 100644 index 00000000000..1154975e3cc --- /dev/null +++ b/source/blender/editors/gpencil/gpencil_undo.c @@ -0,0 +1,168 @@ +/* + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2011 Blender Foundation. + * All rights reserved. + * + * + * Contributor(s): Blender Foundation, + * Sergey Sharybin + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include +#include + +#include "MEM_guardedalloc.h" + +#include "DNA_gpencil_types.h" +#include "DNA_listBase.h" +#include "DNA_windowmanager_types.h" + +#include "BKE_context.h" +#include "BKE_gpencil.h" + +#include "BLI_listbase.h" + +#include "ED_gpencil.h" + +#include "WM_api.h" +#include "WM_types.h" + +#include "gpencil_intern.h" + +#define MAXUNDONAME 64 + +typedef struct bGPundonode { + struct bGPundonode *next, *prev; + + char name[MAXUNDONAME]; + struct bGPdata *gpd; +} bGPundonode; + +static ListBase undo_nodes = {NULL, NULL}; +static bGPundonode *cur_node = NULL; + +int ED_gpencil_session_active(void) +{ + return undo_nodes.first != NULL; +} + +int ED_undo_gpencil_step(bContext *C, int step, const char *name) +{ + bGPdata **gpd_ptr= NULL, *new_gpd= NULL; + + gpd_ptr= gpencil_data_get_pointers(C, NULL); + + if(step==1) { /* undo */ + //printf("\t\tGP - undo step\n"); + if(cur_node->prev) { + if(!name || strcmp(cur_node->name, name) == 0) { + cur_node= cur_node->prev; + new_gpd= cur_node->gpd; + } + } + } + else if (step==-1) { + //printf("\t\tGP - redo step\n"); + if(cur_node->next) { + if(!name || strcmp(cur_node->name, name) == 0) { + cur_node= cur_node->next; + new_gpd= cur_node->gpd; + } + } + } + + if(new_gpd) { + if(gpd_ptr) { + if(*gpd_ptr) { + bGPdata *gpd= *gpd_ptr; + bGPDlayer *gpl, *gpld; + + free_gpencil_layers(&gpd->layers); + + /* copy layers */ + gpd->layers.first= gpd->layers.last= NULL; + + for (gpl= new_gpd->layers.first; gpl; gpl= gpl->next) { + /* make a copy of source layer and its data */ + gpld= gpencil_layer_duplicate(gpl); + BLI_addtail(&gpd->layers, gpld); + } + } + } + } + + WM_event_add_notifier(C, NC_SCREEN|ND_GPENCIL|NA_EDITED, NULL); + + return OPERATOR_FINISHED; +} + +void gpencil_undo_init(bGPdata *gpd) +{ + gpencil_undo_push(gpd); +} + +void gpencil_undo_push(bGPdata *gpd) +{ + bGPundonode *undo_node; + + //printf("\t\tGP - undo push\n"); + + if(cur_node) { + /* remove all un-done nodes from stack */ + undo_node= cur_node->next; + + while(undo_node) { + bGPundonode *next_node= undo_node->next; + + free_gpencil_data(undo_node->gpd); + MEM_freeN(undo_node->gpd); + + BLI_freelinkN(&undo_nodes, undo_node); + + undo_node= next_node; + } + } + + /* create new undo node */ + undo_node= MEM_callocN(sizeof(bGPundonode), "gpencil undo node"); + undo_node->gpd= gpencil_data_duplicate(gpd); + + cur_node= undo_node; + + BLI_addtail(&undo_nodes, undo_node); +} + +void gpencil_undo_finish(void) +{ + bGPundonode *undo_node= undo_nodes.first; + + while(undo_node) { + free_gpencil_data(undo_node->gpd); + MEM_freeN(undo_node->gpd); + + undo_node= undo_node->next; + } + + BLI_freelistN(&undo_nodes); + + cur_node= NULL; +} diff --git a/source/blender/editors/include/ED_gpencil.h b/source/blender/editors/include/ED_gpencil.h index 07dcc959e32..bfd16487ae5 100644 --- a/source/blender/editors/include/ED_gpencil.h +++ b/source/blender/editors/include/ED_gpencil.h @@ -106,4 +106,8 @@ void paste_gpdata(void); void snap_gplayer_frames(struct bGPDlayer *gpl, short mode); void mirror_gplayer_frames(struct bGPDlayer *gpl, short mode); +/* ------------ Grease-Pencil Undo System ------------------ */ +int ED_gpencil_session_active(void); +int ED_undo_gpencil_step(struct bContext *C, int step, const char *name); + #endif /* ED_GPENCIL_H */ diff --git a/source/blender/editors/util/undo.c b/source/blender/editors/util/undo.c index a2381a208ef..c1aca61f795 100644 --- a/source/blender/editors/util/undo.c +++ b/source/blender/editors/util/undo.c @@ -54,6 +54,7 @@ #include "ED_armature.h" #include "ED_particle.h" #include "ED_curve.h" +#include "ED_gpencil.h" #include "ED_mball.h" #include "ED_mesh.h" #include "ED_object.h" @@ -126,6 +127,11 @@ static int ed_undo_step(bContext *C, int step, const char *undoname) Object *obact= CTX_data_active_object(C); ScrArea *sa= CTX_wm_area(C); + /* grease pencil can be can be used in plenty of spaces, so check it first */ + if(ED_gpencil_session_active()) { + return ED_undo_gpencil_step(C, step, undoname); + } + if(sa && sa->spacetype==SPACE_IMAGE) { SpaceImage *sima= (SpaceImage *)sa->spacedata.first; From 82f7a5e3a25492eb58a0c0ec1933309c37d17e28 Mon Sep 17 00:00:00 2001 From: Lukas Toenne Date: Tue, 6 Sep 2011 08:28:06 +0000 Subject: [PATCH 096/182] Fix for #28517, group nodes losing all links from older files. The reason was that group nodes tried to reconstruct sockets from the template lists, which are empty. Now the verification function checks if there are any sockets in the template lists, which are always empty for group nodes. --- source/blender/nodes/intern/node_socket.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/source/blender/nodes/intern/node_socket.c b/source/blender/nodes/intern/node_socket.c index 3ea34dd094a..aabaf5b86de 100644 --- a/source/blender/nodes/intern/node_socket.c +++ b/source/blender/nodes/intern/node_socket.c @@ -422,7 +422,11 @@ static void verify_socket_template_list(bNodeTree *ntree, bNode *node, int in_ou void node_verify_socket_templates(bNodeTree *ntree, bNode *node) { bNodeType *ntype= node->typeinfo; - if(ntype) { + /* XXX Small trick: don't try to match socket lists when there are no templates. + * This also prevents group node sockets from being removed, without the need to explicitly + * check the node type here. + */ + if(ntype && ((ntype->inputs && ntype->inputs[0].type>=0) || (ntype->outputs && ntype->outputs[0].type>=0))) { verify_socket_template_list(ntree, node, SOCK_IN, &node->inputs, ntype->inputs); verify_socket_template_list(ntree, node, SOCK_OUT, &node->outputs, ntype->outputs); } From 32287bebe82615b8500ef0196b7b780745147835 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 6 Sep 2011 08:30:17 +0000 Subject: [PATCH 097/182] New grease pencil mode: poly line drawing - It's like sketch mode for lines, but you're specifying line knots by clicking on position you want to add next knot. - View can be navigated between knots creation. - Holding LMB down and sliding mouse will lead to new segment preview so it can be created more accurate. Additional change: fixed GP->Bezier conversion. Last point used to be ignored in this operator. --- .../startup/bl_ui/space_view3d_toolbar.py | 3 + source/blender/editors/gpencil/gpencil_edit.c | 4 +- .../blender/editors/gpencil/gpencil_intern.h | 1 + source/blender/editors/gpencil/gpencil_ops.c | 3 + .../blender/editors/gpencil/gpencil_paint.c | 130 ++++++++++++++---- 5 files changed, 112 insertions(+), 29 deletions(-) diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py index b71593add96..aa26cb43eed 100644 --- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py +++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py @@ -54,6 +54,9 @@ def draw_gpencil_tools(context, layout): row = col.row() row.operator("gpencil.draw", text="Draw").mode = 'DRAW' row.operator("gpencil.draw", text="Line").mode = 'DRAW_STRAIGHT' + + row = col.row() + row.operator("gpencil.draw", text="Poly").mode = 'DRAW_POLY' row.operator("gpencil.draw", text="Erase").mode = 'ERASER' row = col.row() diff --git a/source/blender/editors/gpencil/gpencil_edit.c b/source/blender/editors/gpencil/gpencil_edit.c index 9dc764b7aac..1cd8b1f05db 100644 --- a/source/blender/editors/gpencil/gpencil_edit.c +++ b/source/blender/editors/gpencil/gpencil_edit.c @@ -511,8 +511,8 @@ static void gp_stroke_to_bezier (bContext *C, bGPDlayer *gpl, bGPDstroke *gps, C copy_v3_v3(p3d_prev, p3d_cur); copy_v3_v3(p3d_cur, p3d_next); - if (i + 1 < tot) { - gp_strokepoint_convertcoords(C, gps, pt+1, p3d_next, subrect); + if (i + 2 < tot) { + gp_strokepoint_convertcoords(C, gps, pt + 2, p3d_next, subrect); } } diff --git a/source/blender/editors/gpencil/gpencil_intern.h b/source/blender/editors/gpencil/gpencil_intern.h index db4315a8ca6..8000af54f53 100644 --- a/source/blender/editors/gpencil/gpencil_intern.h +++ b/source/blender/editors/gpencil/gpencil_intern.h @@ -49,6 +49,7 @@ typedef enum eGPencil_PaintModes { GP_PAINTMODE_DRAW = 0, GP_PAINTMODE_ERASER, GP_PAINTMODE_DRAW_STRAIGHT, + GP_PAINTMODE_DRAW_POLY } eGPencil_PaintModes; /* buttons editing --- */ diff --git a/source/blender/editors/gpencil/gpencil_ops.c b/source/blender/editors/gpencil/gpencil_ops.c index e1e4c8d5457..150e0ba90e4 100644 --- a/source/blender/editors/gpencil/gpencil_ops.c +++ b/source/blender/editors/gpencil/gpencil_ops.c @@ -59,6 +59,9 @@ void ED_keymap_gpencil(wmKeyConfig *keyconf) /* draw - straight lines */ kmi=WM_keymap_add_item(keymap, "GPENCIL_OT_draw", LEFTMOUSE, KM_PRESS, KM_CTRL, DKEY); RNA_enum_set(kmi->ptr, "mode", GP_PAINTMODE_DRAW_STRAIGHT); + /* draw - poly lines */ + kmi=WM_keymap_add_item(keymap, "GPENCIL_OT_draw", RIGHTMOUSE, KM_PRESS, KM_CTRL, DKEY); + RNA_enum_set(kmi->ptr, "mode", GP_PAINTMODE_DRAW_POLY); /* erase */ kmi=WM_keymap_add_item(keymap, "GPENCIL_OT_draw", RIGHTMOUSE, KM_PRESS, 0, DKEY); RNA_enum_set(kmi->ptr, "mode", GP_PAINTMODE_ERASER); diff --git a/source/blender/editors/gpencil/gpencil_paint.c b/source/blender/editors/gpencil/gpencil_paint.c index df5fa65c980..460408c6269 100644 --- a/source/blender/editors/gpencil/gpencil_paint.c +++ b/source/blender/editors/gpencil/gpencil_paint.c @@ -124,6 +124,7 @@ enum { /* Runtime flags */ enum { GP_PAINTFLAG_FIRSTRUN = (1<<0), /* operator just started */ + GP_PAINTFLAG_STROKEADDED = (1<<1) /* stroke was already added during draw session */ }; /* ------ */ @@ -375,6 +376,43 @@ static short gp_stroke_addpoint (tGPsdata *p, const int mval[2], float pressure) else return GP_STROKEADD_NORMAL; } + else if (p->paintmode == GP_PAINTMODE_DRAW_POLY) { + /* get pointer to destination point */ + pt= (tGPspoint *)(gpd->sbuffer); + + /* store settings */ + pt->x= mval[0]; + pt->y= mval[1]; + pt->pressure= pressure; + + /* if there's stroke fir this poly line session add (or replace last) point + to stroke. This allows to draw lines more interactively (see new segment + during mouse slide, i.e.) */ + if (p->flags & GP_PAINTFLAG_STROKEADDED) { + bGPDstroke *gps= p->gpf->strokes.last; + bGPDspoint *pts; + + /* first time point is adding to temporary buffer -- need to allocate new point in stroke */ + if (gpd->sbuffer_size == 0) { + gps->points = MEM_reallocN(gps->points, sizeof(bGPDspoint)*(gps->totpoints+1)); + gps->totpoints++; + } + + pts = &gps->points[gps->totpoints-1]; + + /* convert screen-coordinates to appropriate coordinates (and store them) */ + gp_stroke_convertcoords(p, &pt->x, &pts->x, NULL); + + /* copy pressure */ + pts->pressure= pt->pressure; + } + + /* increment counters */ + if (gpd->sbuffer_size == 0) + gpd->sbuffer_size++; + + return GP_STROKEADD_NORMAL; + } /* return invalid state for now... */ return GP_STROKEADD_INVALID; @@ -395,7 +433,7 @@ static void gp_stroke_smooth (tGPsdata *p) int i=0, cmx=gpd->sbuffer_size; /* only smooth if smoothing is enabled, and we're not doing a straight line */ - if (!(U.gp_settings & GP_PAINT_DOSMOOTH) || (p->paintmode == GP_PAINTMODE_DRAW_STRAIGHT)) + if (!(U.gp_settings & GP_PAINT_DOSMOOTH) || ELEM(p->paintmode, GP_PAINTMODE_DRAW_STRAIGHT, GP_PAINTMODE_DRAW_POLY)) return; /* don't try if less than 2 points in buffer */ @@ -527,17 +565,28 @@ static void gp_stroke_newfrombuffer (tGPsdata *p) return; } + /* special case for poly line -- for already added stroke during session + coordinates are getting added to stroke immediatelly to allow more + interactive behavior */ + if (p->paintmode == GP_PAINTMODE_DRAW_POLY) { + if (p->flags & GP_PAINTFLAG_STROKEADDED) + return; + } + /* allocate memory for a new stroke */ gps= MEM_callocN(sizeof(bGPDstroke), "gp_stroke"); - /* allocate enough memory for a continuous array for storage points */ - pt= gps->points= MEM_callocN(sizeof(bGPDspoint)*totelem, "gp_stroke_points"); - /* copy appropriate settings for stroke */ gps->totpoints= totelem; gps->thickness= p->gpl->thickness; gps->flag= gpd->sbuffer_sflag; + /* allocate enough memory for a continuous array for storage points */ + gps->points= MEM_callocN(sizeof(bGPDspoint)*gps->totpoints, "gp_stroke_points"); + + /* set pointer to first non-initialized point */ + pt= gps->points + (gps->totpoints - totelem); + /* copy points from the buffer to the stroke */ if (p->paintmode == GP_PAINTMODE_DRAW_STRAIGHT) { /* straight lines only -> only endpoints */ @@ -565,6 +614,16 @@ static void gp_stroke_newfrombuffer (tGPsdata *p) pt->pressure= ptc->pressure; } } + else if (p->paintmode == GP_PAINTMODE_DRAW_POLY) { + /* first point */ + ptc= gpd->sbuffer; + + /* convert screen-coordinates to appropriate coordinates (and store them) */ + gp_stroke_convertcoords(p, &ptc->x, &pt->x, NULL); + + /* copy pressure */ + pt->pressure= ptc->pressure; + } else { float *depth_arr= NULL; @@ -643,6 +702,8 @@ static void gp_stroke_newfrombuffer (tGPsdata *p) MEM_freeN(depth_arr); } + p->flags |= GP_PAINTFLAG_STROKEADDED; + /* add stroke to frame */ BLI_addtail(&p->gpf->strokes, gps); } @@ -891,8 +952,10 @@ static void gp_session_validatebuffer (tGPsdata *p) bGPdata *gpd= p->gpd; /* clear memory of buffer (or allocate it if starting a new session) */ - if (gpd->sbuffer) + if (gpd->sbuffer) { + //printf("\t\tGP - reset sbuffer\n"); memset(gpd->sbuffer, 0, sizeof(tGPspoint)*GP_STROKE_BUFFER_MAX); + } else { //printf("\t\tGP - allocate sbuffer\n"); gpd->sbuffer= MEM_callocN(sizeof(tGPspoint)*GP_STROKE_BUFFER_MAX, "gp_session_strokebuffer"); @@ -905,24 +968,21 @@ static void gp_session_validatebuffer (tGPsdata *p) gpd->sbuffer_sflag= 0; } -/* init new painting session */ -static tGPsdata *gp_session_initpaint (bContext *C) +/* (re)init new painting data */ +static int gp_session_initdata (bContext *C, tGPsdata *p) { - tGPsdata *p = NULL; bGPdata **gpd_ptr = NULL; ScrArea *curarea= CTX_wm_area(C); ARegion *ar= CTX_wm_region(C); /* make sure the active view (at the starting time) is a 3d-view */ if (curarea == NULL) { + p->status= GP_STATUS_ERROR; if (G.f & G_DEBUG) printf("Error: No active view for painting \n"); - return NULL; + return 0; } - /* create new context data */ - p= MEM_callocN(sizeof(tGPsdata), "GPencil Drawing Data"); - /* pass on current scene and window */ p->scene= CTX_data_scene(C); p->win= CTX_wm_window(C); @@ -944,7 +1004,7 @@ static tGPsdata *gp_session_initpaint (bContext *C) p->status= GP_STATUS_ERROR; if (G.f & G_DEBUG) printf("Error: 3D-View active region doesn't have any region data, so cannot be drawable \n"); - return p; + return 0; } #if 0 // XXX will this sort of antiquated stuff be restored? @@ -953,7 +1013,7 @@ static tGPsdata *gp_session_initpaint (bContext *C) p->status= GP_STATUS_ERROR; if (G.f & G_DEBUG) printf("Error: In active view, Grease Pencil not shown \n"); - return p; + return 0; } #endif } @@ -974,7 +1034,7 @@ static tGPsdata *gp_session_initpaint (bContext *C) p->status= GP_STATUS_ERROR; if (G.f & G_DEBUG) printf("Error: In active view, Grease Pencil not shown \n"); - return; + return 0; } #endif } @@ -994,13 +1054,13 @@ static tGPsdata *gp_session_initpaint (bContext *C) p->status= GP_STATUS_ERROR; if (G.f & G_DEBUG) printf("Error: In active view (sequencer), active mode doesn't support Grease Pencil \n"); - return; + return 0; } if ((sseq->flag & SEQ_DRAW_GPENCIL)==0) { p->status= GP_STATUS_ERROR; if (G.f & G_DEBUG) printf("Error: In active view, Grease Pencil not shown \n"); - return; + return 0; } } break; @@ -1021,7 +1081,7 @@ static tGPsdata *gp_session_initpaint (bContext *C) p->status= GP_STATUS_ERROR; if (G.f & G_DEBUG) printf("Error: In active view, Grease Pencil not shown \n"); - return p; + return 0; } #endif } @@ -1033,7 +1093,7 @@ static tGPsdata *gp_session_initpaint (bContext *C) p->status= GP_STATUS_ERROR; if (G.f & G_DEBUG) printf("Error: Active view not appropriate for Grease Pencil drawing \n"); - return p; + return 0; } break; } @@ -1044,7 +1104,7 @@ static tGPsdata *gp_session_initpaint (bContext *C) p->status= GP_STATUS_ERROR; if (G.f & G_DEBUG) printf("Error: Current context doesn't allow for any Grease Pencil data \n"); - return p; + return 0; } else { /* if no existing GPencil block exists, add one */ @@ -1067,6 +1127,19 @@ static tGPsdata *gp_session_initpaint (bContext *C) p->im2d_settings.sizex= 1; p->im2d_settings.sizey= 1; #endif + + return 1; +} + +/* init new painting session */ +static tGPsdata *gp_session_initpaint (bContext *C) +{ + tGPsdata *p = NULL; + + /* create new context data */ + p= MEM_callocN(sizeof(tGPsdata), "GPencil Drawing Data"); + + gp_session_initdata(C, p); /* return context data for running paint operator */ return p; @@ -1629,17 +1702,14 @@ static tGPsdata *gpencil_stroke_begin(bContext *C, wmOperator *op) p->status= GP_STATUS_ERROR; } - /* free pointer used by previous stroke */ - if(p) - MEM_freeN(p); - //printf("\t\tGP - start stroke \n"); /* we may need to set up paint env again if we're resuming */ // XXX: watch it with the paintmode! in future, it'd be nice to allow changing paint-mode when in sketching-sessions // XXX: with tablet events, we may event want to check for eraser here, for nicer tablet support - gpencil_draw_init(C, op); + if (gp_session_initdata(C, p)) + gp_paint_initstroke(p, p->paintmode); p= op->customdata; @@ -1698,10 +1768,15 @@ static int gpencil_draw_modal (bContext *C, wmOperator *op, wmEvent *event) if (ELEM(event->type, LEFTMOUSE, RIGHTMOUSE)) { /* if painting, end stroke */ if (p->status == GP_STATUS_PAINTING) { + int sketch= 0; /* basically, this should be mouse-button up = end stroke * BUT what happens next depends on whether we 'painting sessions' is enabled */ - if (GPENCIL_SKETCH_SESSIONS_ON(p->scene)) { + sketch|= GPENCIL_SKETCH_SESSIONS_ON(p->scene); + /* polyline drawig is also 'sketching' -- all knots should be added during one session */ + sketch|= p->paintmode == GP_PAINTMODE_DRAW_POLY; + + if (sketch) { /* end stroke only, and then wait to resume painting soon */ //printf("\t\tGP - end stroke only\n"); gpencil_stroke_end(op); @@ -1710,7 +1785,7 @@ static int gpencil_draw_modal (bContext *C, wmOperator *op, wmEvent *event) estate = OPERATOR_RUNNING_MODAL; /* stroke could be smoothed, send notifier to refresh screen */ - ED_region_tag_redraw(p->ar); + WM_event_add_notifier(C, NC_SCREEN|ND_GPENCIL|NA_EDITED, NULL); } else { //printf("\t\tGP - end of stroke + op\n"); @@ -1794,6 +1869,7 @@ static int gpencil_draw_modal (bContext *C, wmOperator *op, wmEvent *event) static EnumPropertyItem prop_gpencil_drawmodes[] = { {GP_PAINTMODE_DRAW, "DRAW", 0, "Draw Freehand", ""}, {GP_PAINTMODE_DRAW_STRAIGHT, "DRAW_STRAIGHT", 0, "Draw Straight Lines", ""}, + {GP_PAINTMODE_DRAW_POLY, "DRAW_POLY", 0, "Dtaw Poly Line", ""}, {GP_PAINTMODE_ERASER, "ERASER", 0, "Eraser", ""}, {0, NULL, 0, NULL, NULL} }; From 7062788017cfb2841596d15f7c37612312692195 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 6 Sep 2011 10:49:55 +0000 Subject: [PATCH 098/182] texture evaluation function (like we had in 2.4x api), requested by Lee. eg: red, green, blue, intensity = texture.evaluate(vec) --- source/blender/makesrna/intern/rna_internal.h | 1 + source/blender/makesrna/intern/rna_texture.c | 2 + .../blender/makesrna/intern/rna_texture_api.c | 54 ++++++++++++++----- 3 files changed, 45 insertions(+), 12 deletions(-) diff --git a/source/blender/makesrna/intern/rna_internal.h b/source/blender/makesrna/intern/rna_internal.h index 9e98f166875..78b8c67d92c 100644 --- a/source/blender/makesrna/intern/rna_internal.h +++ b/source/blender/makesrna/intern/rna_internal.h @@ -261,6 +261,7 @@ void RNA_api_wm(struct StructRNA *srna); void RNA_api_sensor(struct StructRNA *srna); void RNA_api_controller(struct StructRNA *srna); void RNA_api_actuator(struct StructRNA *srna); +void RNA_api_texture(struct StructRNA *srna); void RNA_api_environment_map(struct StructRNA *srna); /* main collection functions */ diff --git a/source/blender/makesrna/intern/rna_texture.c b/source/blender/makesrna/intern/rna_texture.c index 503212201c4..890be76c49a 100644 --- a/source/blender/makesrna/intern/rna_texture.c +++ b/source/blender/makesrna/intern/rna_texture.c @@ -1820,6 +1820,8 @@ static void rna_def_texture(BlenderRNA *brna) rna_def_texture_pointdensity(brna); rna_def_texture_voxeldata(brna); /* XXX add more types here .. */ + + RNA_api_texture(srna); } void RNA_def_texture(BlenderRNA *brna) diff --git a/source/blender/makesrna/intern/rna_texture_api.c b/source/blender/makesrna/intern/rna_texture_api.c index 8d4b73f1f0c..8c63d5da8fd 100644 --- a/source/blender/makesrna/intern/rna_texture_api.c +++ b/source/blender/makesrna/intern/rna_texture_api.c @@ -43,6 +43,7 @@ #include "BKE_context.h" #include "BKE_global.h" #include "RE_pipeline.h" +#include "RE_shader_ext.h" void save_envmap(struct EnvMap *env, bContext *C, ReportList *reports, const char* filepath, struct Scene *scene, float layout[12]) { @@ -67,30 +68,59 @@ void clear_envmap(struct EnvMap *env, bContext *C) } } +void texture_evaluate(struct Tex *tex, float value[3], float color_r[3]) +{ + TexResult texres= {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, NULL}; + multitex_ext(tex, value, NULL, NULL, 1, &texres); + + color_r[0] = texres.tr; + color_r[1] = texres.tg; + color_r[2] = texres.tb; + color_r[3] = texres.tin; +} + #else +void RNA_api_texture(StructRNA *srna) +{ + FunctionRNA *func; + PropertyRNA *parm; + + func= RNA_def_function(srna, "evaluate", "texture_evaluate"); + RNA_def_function_ui_description(func, "Evaluate the texture at the coordinates given"); + + parm= RNA_def_float_vector(func, "value", 3, NULL, -FLT_MAX, FLT_MAX, "", "", -1e4, 1e4); + RNA_def_property_flag(parm, PROP_REQUIRED); + + /* return location and normal */ + parm= RNA_def_float_vector(func, "result", 4, NULL, -FLT_MAX, FLT_MAX, "Result", NULL, -1e4, 1e4); + RNA_def_property_flag(parm, PROP_THICK_WRAP); + RNA_def_function_output(func, parm); + +} + void RNA_api_environment_map(StructRNA *srna) { FunctionRNA *func; PropertyRNA *parm; - + static const float default_layout[] = { 0,0, 1,0, 2,0, 0,1, 1,1, 2,1 }; - + func= RNA_def_function(srna, "clear", "clear_envmap"); - RNA_def_function_ui_description(func, "Discard the environment map and free it from memory."); - RNA_def_function_flag(func, FUNC_USE_CONTEXT); + RNA_def_function_ui_description(func, "Discard the environment map and free it from memory."); + RNA_def_function_flag(func, FUNC_USE_CONTEXT); func= RNA_def_function(srna,"save", "save_envmap"); - RNA_def_function_ui_description(func, "Save the environment map to disc using the scene render settings."); - RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS); - - parm= RNA_def_string_file_name(func,"filepath","",FILE_MAX,"File path","Location of the output file"); - RNA_def_property_flag(parm, PROP_REQUIRED); - - RNA_def_pointer(func, "scene", "Scene", "", "Overrides the scene from which image parameters are taken."); + RNA_def_function_ui_description(func, "Save the environment map to disc using the scene render settings."); + RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS); - parm = RNA_def_float_array(func, "layout", 12, default_layout, 0.0f, 0.0f, "File layout", "Flat array describing the X,Y position of each cube face in the output image, where 1 is the size of a face. Order is [+Z -Z +Y -X -Y +X]. Use -1 to skip a face.", 0.0f, 0.0f); + parm= RNA_def_string_file_name(func,"filepath","",FILE_MAX,"File path","Location of the output file"); + RNA_def_property_flag(parm, PROP_REQUIRED); + + RNA_def_pointer(func, "scene", "Scene", "", "Overrides the scene from which image parameters are taken."); + + parm = RNA_def_float_array(func, "layout", 12, default_layout, 0.0f, 0.0f, "File layout", "Flat array describing the X,Y position of each cube face in the output image, where 1 is the size of a face. Order is [+Z -Z +Y -X -Y +X]. Use -1 to skip a face.", 0.0f, 0.0f); } #endif From aabd702dbdbba5af116f37c401f6a17f0ac714ca Mon Sep 17 00:00:00 2001 From: Antony Riakiotakis Date: Tue, 6 Sep 2011 11:17:29 +0000 Subject: [PATCH 099/182] fix link issues with MinGW - a substitute declaration(correctByteOrder) for itoln that was not present in MinGW was being used. Duplicated the declaration from (tried including but gave some errors) and added the appropriate link library, wsock32, according to MinGW documentation. --- CMakeLists.txt | 2 +- build_files/scons/config/win32-mingw-config.py | 2 +- intern/guardedalloc/MEM_sys_types.h | 5 ++++- source/blender/blenloader/BLO_sys_types.h | 9 ++++++++- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b54b18aab37..8b5693fb1aa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -797,7 +797,7 @@ elseif(WIN32) else() # keep GCC spesific stuff here if(CMAKE_COMPILER_IS_GNUCC) - set(PLATFORM_LINKLIBS "-lshell32 -lshfolder -lgdi32 -lmsvcrt -lwinmm -lmingw32 -lm -lws2_32 -lz -lstdc++ -lole32 -luuid") + set(PLATFORM_LINKLIBS "-lshell32 -lshfolder -lgdi32 -lmsvcrt -lwinmm -lmingw32 -lm -lws2_32 -lz -lstdc++ -lole32 -luuid -lwsock32") set(PLATFORM_CFLAGS "-pipe -funsigned-char -fno-strict-aliasing") add_definitions(-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE) diff --git a/build_files/scons/config/win32-mingw-config.py b/build_files/scons/config/win32-mingw-config.py index c815b76ef73..37d693db560 100644 --- a/build_files/scons/config/win32-mingw-config.py +++ b/build_files/scons/config/win32-mingw-config.py @@ -174,7 +174,7 @@ C_WARN = ['-Wno-char-subscripts', '-Wdeclaration-after-statement', '-Wstrict-pro CC_WARN = [ '-Wall' ] -LLIBS = ['-lshell32', '-lshfolder', '-lgdi32', '-lmsvcrt', '-lwinmm', '-lmingw32', '-lm', '-lws2_32', '-lz', '-lstdc++','-lole32','-luuid'] +LLIBS = ['-lshell32', '-lshfolder', '-lgdi32', '-lmsvcrt', '-lwinmm', '-lmingw32', '-lm', '-lws2_32', '-lz', '-lstdc++','-lole32','-luuid', '-lwsock32'] PLATFORM_LINKFLAGS = ['--stack,2097152'] diff --git a/intern/guardedalloc/MEM_sys_types.h b/intern/guardedalloc/MEM_sys_types.h index 48230db23a3..4debb32b5c4 100644 --- a/intern/guardedalloc/MEM_sys_types.h +++ b/intern/guardedalloc/MEM_sys_types.h @@ -98,7 +98,8 @@ typedef unsigned long uintptr_t; #include #elif defined(FREE_WINDOWS) - +/* define htoln here, there must be a syntax error in winsock2.h in MinGW */ +unsigned long __attribute__((__stdcall__)) htonl(unsigned long); #include #else @@ -109,12 +110,14 @@ typedef unsigned long uintptr_t; #endif /* ifdef platform for types */ #ifdef _WIN32 +#ifndef FREE_WINDOWS #ifndef htonl #define htonl(x) correctByteOrder(x) #endif #ifndef ntohl #define ntohl(x) correctByteOrder(x) #endif +#endif #elif defined (__FreeBSD__) || defined (__OpenBSD__) #include #elif defined (__APPLE__) diff --git a/source/blender/blenloader/BLO_sys_types.h b/source/blender/blenloader/BLO_sys_types.h index 2114fc34bf1..4b3902dca43 100644 --- a/source/blender/blenloader/BLO_sys_types.h +++ b/source/blender/blenloader/BLO_sys_types.h @@ -93,7 +93,8 @@ typedef unsigned long uintptr_t; #include #elif defined(FREE_WINDOWS) - +/* define htoln here, there must be a syntax error in winsock2.h in MinGW */ +unsigned long __attribute__((__stdcall__)) htonl(unsigned long); #include #else @@ -105,8 +106,14 @@ typedef unsigned long uintptr_t; #ifdef _WIN32 +#ifndef FREE_WINDOWS +#ifndef htonl #define htonl(x) correctByteOrder(x) +#endif +#ifndef ntohl #define ntohl(x) correctByteOrder(x) +#endif +#endif #elif defined (__FreeBSD__) || defined (__OpenBSD__) #include #elif defined (__APPLE__) From c6002873fa5b967ce30b9fc827fb6abc0931ef3c Mon Sep 17 00:00:00 2001 From: Lukas Toenne Date: Tue, 6 Sep 2011 11:38:44 +0000 Subject: [PATCH 100/182] Backward compatibility fix for SOCK_DYNAMICS flag on group sockets. This is currently only needed for displaying the up/down buttons of group sockets. All regular group sockets should have this flag to indicate they are added by the user. More complex "group-type" trees may use non-dynamic sockets in the future for sockets that are not supposed to be manipulated. --- source/blender/blenloader/intern/readfile.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 355fc14705a..66e38f1c5f8 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -7015,6 +7015,15 @@ static void do_versions_nodetree_default_value(bNodeTree *ntree) do_versions_socket_default_value(sock); } +static void do_versions_nodetree_dynamic_sockets(bNodeTree *ntree) +{ + bNodeSocket *sock; + for (sock=ntree->inputs.first; sock; sock=sock->next) + sock->flag |= SOCK_DYNAMIC; + for (sock=ntree->outputs.first; sock; sock=sock->next) + sock->flag |= SOCK_DYNAMIC; +} + static void do_versions(FileData *fd, Library *lib, Main *main) { /* WATCH IT!!!: pointers from libdata have not been converted */ @@ -11972,6 +11981,16 @@ static void do_versions(FileData *fd, Library *lib, Main *main) tex->nodetree->update |= NTREE_UPDATE; } } + + /* add SOCK_DYNAMIC flag to existing group sockets */ + { + bNodeTree *ntree; + /* only need to do this for trees in main, local trees are not used as groups */ + for (ntree=main->nodetree.first; ntree; ntree=ntree->id.next) { + do_versions_nodetree_dynamic_sockets(ntree); + ntree->update |= NTREE_UPDATE; + } + } } /* put compatibility code here until next subversion bump */ From 71abf218f0dcc8e2b038de3672a8332fd3e544af Mon Sep 17 00:00:00 2001 From: Lukas Toenne Date: Tue, 6 Sep 2011 11:42:20 +0000 Subject: [PATCH 101/182] Fix for wrong offset of the input socket column in group node tree display. --- source/blender/editors/space_node/drawnode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index 890b04dce91..0d2ec7c646f 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -637,7 +637,7 @@ static void draw_group_socket(const bContext *C, SpaceNode *snode, bNodeTree *nt float arrowbutw= 0.8f*UI_UNIT_X; /* layout stuff for buttons on group left frame */ float colw= 0.6f*node_group_frame; - float col1= 6; + float col1= 6 - node_group_frame; float col2= col1 + colw+6; float col3= node_group_frame - arrowbutw - 6; /* layout stuff for buttons on group right frame */ From 47ffe63c86eb495aa5556939467692484aea8322 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 6 Sep 2011 13:00:46 +0000 Subject: [PATCH 102/182] remove -Wundef for code we don't maintain & generated code. --- build_files/cmake/macros.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/build_files/cmake/macros.cmake b/build_files/cmake/macros.cmake index 58938c8b0b0..d09215d040d 100644 --- a/build_files/cmake/macros.cmake +++ b/build_files/cmake/macros.cmake @@ -392,6 +392,7 @@ macro(remove_strict_flags) remove_flag("-Wstrict-prototypes") remove_flag("-Wunused-parameter") remove_flag("-Wwrite-strings") + remove_flag("-Wundef") remove_flag("-Wshadow") remove_flag("-Werror=[^ ]+") remove_flag("-Werror") From 0c15f834e49b2e1c43c0e06f1fd8a7e7f5faa83f Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 6 Sep 2011 14:02:28 +0000 Subject: [PATCH 103/182] Fix for poly line grease pencil and surface drawing. --- source/blender/editors/gpencil/gpencil_paint.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/source/blender/editors/gpencil/gpencil_paint.c b/source/blender/editors/gpencil/gpencil_paint.c index 460408c6269..a23f2064a9e 100644 --- a/source/blender/editors/gpencil/gpencil_paint.c +++ b/source/blender/editors/gpencil/gpencil_paint.c @@ -400,6 +400,15 @@ static short gp_stroke_addpoint (tGPsdata *p, const int mval[2], float pressure) pts = &gps->points[gps->totpoints-1]; + /* special case for poly lines: normally, depth is needed only when creating new stroke from buffer, + but poly lines are converting to stroke instantly, so initialize depth buffer before converting coordinates */ + if (gpencil_project_check(p)) { + View3D *v3d= p->sa->spacedata.first; + + view3d_region_operator_needs_opengl(p->win, p->ar); + ED_view3d_autodist_init(p->scene, p->ar, v3d, (p->gpd->flag & GP_DATA_DEPTH_STROKE) ? 1:0); + } + /* convert screen-coordinates to appropriate coordinates (and store them) */ gp_stroke_convertcoords(p, &pt->x, &pts->x, NULL); From d4ce95d1dc9103c018b17f42872d231cece33383 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 6 Sep 2011 14:59:55 +0000 Subject: [PATCH 104/182] Fix #28524: Push/Pull Assert when using Operator Panel to Alter Distance value Some transform operators (like push/pull, shrink/fatten, to sphere and so) were creating "value" as single scalar value. This used to confuse RNA_float_get_array used in initTransform. Use RNA_float_get_array for array values and RNA_float_get for scalar value in transform initi function. --- source/blender/editors/transform/transform.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index 09507194969..1796bd4e928 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -1678,7 +1678,14 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int if (RNA_property_is_set(op->ptr, "value")) { float values[4]= {0}; /* incase value isn't length 4, avoid uninitialized memory */ - RNA_float_get_array(op->ptr, "value", values); + PropertyRNA *prop= RNA_struct_find_property(op->ptr, "value"); + + if(RNA_property_array_check(prop)) { + RNA_float_get_array(op->ptr, "value", values); + } else { + values[0]= RNA_float_get(op->ptr, "value"); + } + QUATCOPY(t->values, values); QUATCOPY(t->auto_values, values); t->flag |= T_AUTOVALUES; From e79d16270bc29f44431689fdb1b362b1866ab8c3 Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Tue, 6 Sep 2011 15:44:44 +0000 Subject: [PATCH 105/182] Ambient Occlusion: * Increase max. samples from 32 to 128. --- source/blender/makesrna/intern/rna_world.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/makesrna/intern/rna_world.c b/source/blender/makesrna/intern/rna_world.c index 72b54dce473..11ec327c306 100644 --- a/source/blender/makesrna/intern/rna_world.c +++ b/source/blender/makesrna/intern/rna_world.c @@ -360,7 +360,7 @@ static void rna_def_lighting(BlenderRNA *brna) prop= RNA_def_property(srna, "samples", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "aosamp"); - RNA_def_property_range(prop, 1, 32); + RNA_def_property_range(prop, 1, 128); RNA_def_property_ui_text(prop, "Samples", "Amount of ray samples. Higher values give smoother results and longer rendering times"); RNA_def_property_update(prop, 0, "rna_World_update"); From 884fc84793be1c5fdd6643ad267331381f8e1c6b Mon Sep 17 00:00:00 2001 From: Lukas Toenne Date: Tue, 6 Sep 2011 16:32:51 +0000 Subject: [PATCH 106/182] Fix for multiple parallel group node executions. This would previously break because begin/end functions for each tree type still have some checks of the ntree->execdata pointer in them, despite the intended use of execdata instances instead of trees themselves for execution data storage. This is an artifact of the old execution system that required these checks to be made in the functions to avoid multiple execution of top-level trees. Now these functions take an additional argument, so group nodes can prevent them from setting and checking the nodetree->execdata pointers. --- source/blender/blenkernel/BKE_node.h | 12 ++--- source/blender/blenkernel/intern/material.c | 4 +- source/blender/blenkernel/intern/node.c | 6 +-- source/blender/blenkernel/intern/texture.c | 2 +- .../editors/sculpt_paint/paint_image.c | 4 +- source/blender/editors/sculpt_paint/sculpt.c | 4 +- .../nodes/composite/node_composite_tree.c | 47 ++++++++++++------- .../composite/nodes/node_composite_common.c | 6 +-- .../blender/nodes/shader/node_shader_tree.c | 44 ++++++++++------- .../nodes/shader/nodes/node_shader_common.c | 4 +- .../blender/nodes/texture/node_texture_tree.c | 40 ++++++++++------ .../nodes/texture/nodes/node_texture_common.c | 4 +- .../render/intern/source/render_texture.c | 4 +- 13 files changed, 110 insertions(+), 71 deletions(-) diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index 7207fb7d0fb..1de3c295f4d 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -466,8 +466,8 @@ struct ShadeResult; /* API */ -struct bNodeTreeExec *ntreeShaderBeginExecTree(struct bNodeTree *ntree); -void ntreeShaderEndExecTree(struct bNodeTreeExec *exec); +struct bNodeTreeExec *ntreeShaderBeginExecTree(struct bNodeTree *ntree, int use_tree_data); +void ntreeShaderEndExecTree(struct bNodeTreeExec *exec, int use_tree_data); void ntreeShaderExecTree(struct bNodeTree *ntree, struct ShadeInput *shi, struct ShadeResult *shr); void ntreeShaderGetTexcoMode(struct bNodeTree *ntree, int osa, short *texco, int *mode); void nodeShaderSynchronizeID(struct bNode *node, int copyto); @@ -594,8 +594,8 @@ void ntreeGPUMaterialNodes(struct bNodeTree *ntree, struct GPUMaterial *mat); /* API */ struct CompBuf; -struct bNodeTreeExec *ntreeCompositBeginExecTree(struct bNodeTree *ntree); -void ntreeCompositEndExecTree(struct bNodeTreeExec *exec); +struct bNodeTreeExec *ntreeCompositBeginExecTree(struct bNodeTree *ntree, int use_tree_data); +void ntreeCompositEndExecTree(struct bNodeTreeExec *exec, int use_tree_data); void ntreeCompositExecTree(struct bNodeTree *ntree, struct RenderData *rd, int do_previews); void ntreeCompositTagRender(struct Scene *sce); int ntreeCompositTagAnimated(struct bNodeTree *ntree); @@ -642,8 +642,8 @@ void ntreeTexSetPreviewFlag(int); void ntreeTexCheckCyclics(struct bNodeTree *ntree); char* ntreeTexOutputMenu(struct bNodeTree *ntree); -struct bNodeTreeExec *ntreeTexBeginExecTree(struct bNodeTree *ntree); -void ntreeTexEndExecTree(struct bNodeTreeExec *exec); +struct bNodeTreeExec *ntreeTexBeginExecTree(struct bNodeTree *ntree, int use_tree_data); +void ntreeTexEndExecTree(struct bNodeTreeExec *exec, int use_tree_data); int ntreeTexExecTree(struct bNodeTree *ntree, struct TexResult *target, float *coord, float *dxt, float *dyt, int osatex, short thread, struct Tex *tex, short which_output, int cfra, int preview, struct ShadeInput *shi, struct MTex *mtex); diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index 36631d5af90..aab8e1abbea 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -926,7 +926,7 @@ void init_render_material(Material *mat, int r_mode, float *amb) init_render_nodetree(mat->nodetree, mat, r_mode, amb); if (!mat->nodetree->execdata) - mat->nodetree->execdata = ntreeShaderBeginExecTree(mat->nodetree); + mat->nodetree->execdata = ntreeShaderBeginExecTree(mat->nodetree, 1); } } @@ -960,7 +960,7 @@ void end_render_material(Material *mat) { if(mat && mat->nodetree && mat->use_nodes) { if (mat->nodetree->execdata) - ntreeShaderEndExecTree(mat->nodetree->execdata); + ntreeShaderEndExecTree(mat->nodetree->execdata, 1); } } diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index 481893b86a8..cd1a6e61151 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -897,13 +897,13 @@ void ntreeFreeTree(bNodeTree *ntree) if (ntree->execdata) { switch (ntree->type) { case NTREE_COMPOSIT: - ntreeCompositEndExecTree(ntree->execdata); + ntreeCompositEndExecTree(ntree->execdata, 1); break; case NTREE_SHADER: - ntreeShaderEndExecTree(ntree->execdata); + ntreeShaderEndExecTree(ntree->execdata, 1); break; case NTREE_TEXTURE: - ntreeTexEndExecTree(ntree->execdata); + ntreeTexEndExecTree(ntree->execdata, 1); break; } } diff --git a/source/blender/blenkernel/intern/texture.c b/source/blender/blenkernel/intern/texture.c index 6119a855366..38165182d83 100644 --- a/source/blender/blenkernel/intern/texture.c +++ b/source/blender/blenkernel/intern/texture.c @@ -767,7 +767,7 @@ Tex *copy_texture(Tex *tex) if(tex->nodetree) { if (tex->nodetree->execdata) { - ntreeTexEndExecTree(tex->nodetree->execdata); + ntreeTexEndExecTree(tex->nodetree->execdata, 1); } texn->nodetree= ntreeCopyTree(tex->nodetree); } diff --git a/source/blender/editors/sculpt_paint/paint_image.c b/source/blender/editors/sculpt_paint/paint_image.c index 9539706468f..79a3251cdf1 100644 --- a/source/blender/editors/sculpt_paint/paint_image.c +++ b/source/blender/editors/sculpt_paint/paint_image.c @@ -4664,7 +4664,7 @@ static void paint_brush_init_tex(Brush *brush) if(brush) { MTex *mtex= &brush->mtex; if(mtex->tex && mtex->tex->nodetree) - ntreeTexBeginExecTree(mtex->tex->nodetree); /* has internal flag to detect it only does it once */ + ntreeTexBeginExecTree(mtex->tex->nodetree, 1); /* has internal flag to detect it only does it once */ } } @@ -4806,7 +4806,7 @@ static void paint_brush_exit_tex(Brush *brush) if(brush) { MTex *mtex= &brush->mtex; if(mtex->tex && mtex->tex->nodetree) - ntreeTexEndExecTree(mtex->tex->nodetree->execdata); + ntreeTexEndExecTree(mtex->tex->nodetree->execdata, 1); } } diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c index bf34a3b8c9f..ced3dd00a9c 100644 --- a/source/blender/editors/sculpt_paint/sculpt.c +++ b/source/blender/editors/sculpt_paint/sculpt.c @@ -3274,7 +3274,7 @@ static void sculpt_brush_init_tex(Sculpt *sd, SculptSession *ss) /* init mtex nodes */ if(mtex->tex && mtex->tex->nodetree) - ntreeTexBeginExecTree(mtex->tex->nodetree); /* has internal flag to detect it only does it once */ + ntreeTexBeginExecTree(mtex->tex->nodetree, 1); /* has internal flag to detect it only does it once */ /* TODO: Shouldn't really have to do this at the start of every stroke, but sculpt would need some sort of notification when @@ -3455,7 +3455,7 @@ static void sculpt_brush_exit_tex(Sculpt *sd) MTex *mtex= &brush->mtex; if(mtex->tex && mtex->tex->nodetree) - ntreeTexEndExecTree(mtex->tex->nodetree->execdata); + ntreeTexEndExecTree(mtex->tex->nodetree->execdata, 1); } static void sculpt_stroke_done(bContext *C, struct PaintStroke *UNUSED(stroke)) diff --git a/source/blender/nodes/composite/node_composite_tree.c b/source/blender/nodes/composite/node_composite_tree.c index 0ea62b0aa5f..4fc5e23e26a 100644 --- a/source/blender/nodes/composite/node_composite_tree.c +++ b/source/blender/nodes/composite/node_composite_tree.c @@ -200,17 +200,22 @@ bNodeTreeType ntreeType_Composite = { }; -struct bNodeTreeExec *ntreeCompositBeginExecTree(bNodeTree *ntree) +/* XXX Group nodes must set use_tree_data to false, since their trees can be shared by multiple nodes. + * If use_tree_data is true, the ntree->execdata pointer is checked to avoid multiple execution of top-level trees. + */ +struct bNodeTreeExec *ntreeCompositBeginExecTree(bNodeTree *ntree, int use_tree_data) { bNodeTreeExec *exec; bNode *node; bNodeSocket *sock; - /* XXX hack: prevent exec data from being generated twice. - * this should be handled by the renderer! - */ - if (ntree->execdata) - return ntree->execdata; + if (use_tree_data) { + /* XXX hack: prevent exec data from being generated twice. + * this should be handled by the renderer! + */ + if (ntree->execdata) + return ntree->execdata; + } /* ensures only a single output node is enabled */ ntreeSetOutput(ntree); @@ -236,15 +241,20 @@ struct bNodeTreeExec *ntreeCompositBeginExecTree(bNodeTree *ntree) } } - /* XXX this should not be necessary, but is still used for cmp/sha/tex nodes, + if (use_tree_data) { + /* XXX this should not be necessary, but is still used for cmp/sha/tex nodes, * which only store the ntree pointer. Should be fixed at some point! */ - ntree->execdata = exec; + ntree->execdata = exec; + } return exec; } -void ntreeCompositEndExecTree(bNodeTreeExec *exec) +/* XXX Group nodes must set use_tree_data to false, since their trees can be shared by multiple nodes. + * If use_tree_data is true, the ntree->execdata pointer is checked to avoid multiple execution of top-level trees. + */ +void ntreeCompositEndExecTree(bNodeTreeExec *exec, int use_tree_data) { if(exec) { bNodeTree *ntree= exec->nodetree; @@ -269,8 +279,10 @@ void ntreeCompositEndExecTree(bNodeTreeExec *exec) ntree_exec_end(exec); - /* XXX clear nodetree backpointer to exec data, same problem as noted in ntreeBeginExecTree */ - ntree->execdata = NULL; + if (use_tree_data) { + /* XXX clear nodetree backpointer to exec data, same problem as noted in ntreeBeginExecTree */ + ntree->execdata = NULL; + } } } @@ -495,10 +507,10 @@ static void ntree_composite_texnode(bNodeTree *ntree, int init) /* has internal flag to detect it only does it once */ if(init) { if (!tex->nodetree->execdata) - tex->nodetree->execdata = ntreeTexBeginExecTree(tex->nodetree); + tex->nodetree->execdata = ntreeTexBeginExecTree(tex->nodetree, 1); } else - ntreeTexEndExecTree(tex->nodetree->execdata); + ntreeTexEndExecTree(tex->nodetree->execdata, 1); tex->nodetree->execdata = NULL; } } @@ -521,8 +533,10 @@ void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview) if(do_preview) ntreeInitPreview(ntree, 0, 0); - if (!ntree->execdata) - exec = ntreeCompositBeginExecTree(ntree); + if (!ntree->execdata) { + /* XXX this is the top-level tree, so we use the ntree->execdata pointer. */ + exec = ntreeCompositBeginExecTree(ntree, 1); + } ntree_composite_texnode(ntree, 1); /* prevent unlucky accidents */ @@ -592,7 +606,8 @@ void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview) BLI_end_threads(&threads); - ntreeCompositEndExecTree(exec); + /* XXX top-level tree uses the ntree->execdata pointer */ + ntreeCompositEndExecTree(exec, 1); } /* *********************************************** */ diff --git a/source/blender/nodes/composite/nodes/node_composite_common.c b/source/blender/nodes/composite/nodes/node_composite_common.c index fbff8198dde..8067f7e92be 100644 --- a/source/blender/nodes/composite/nodes/node_composite_common.c +++ b/source/blender/nodes/composite/nodes/node_composite_common.c @@ -122,7 +122,7 @@ static void *group_initexec(bNode *node) bNodeStack *ns; /* initialize the internal node tree execution */ - exec = ntreeCompositBeginExecTree(ngroup); + exec = ntreeCompositBeginExecTree(ngroup, 0); /* tag group outputs as external to prevent freeing */ for (sock=ngroup->outputs.first; sock; sock=sock->next) { @@ -135,11 +135,11 @@ static void *group_initexec(bNode *node) return exec; } -static void group_freeexec(bNode *UNUSED(node), void *nodedata) +static void group_freeexec(bNode *node, void *nodedata) { bNodeTreeExec *gexec= (bNodeTreeExec*)nodedata; - ntreeCompositEndExecTree(gexec); + ntreeCompositEndExecTree(gexec, 0); } /* Copy inputs to the internal stack. diff --git a/source/blender/nodes/shader/node_shader_tree.c b/source/blender/nodes/shader/node_shader_tree.c index 8cb1ebeb15f..642e4be10d7 100644 --- a/source/blender/nodes/shader/node_shader_tree.c +++ b/source/blender/nodes/shader/node_shader_tree.c @@ -108,11 +108,11 @@ void ntreeGPUMaterialNodes(bNodeTree *ntree, GPUMaterial *mat) bNodeTreeExec *exec; if(!ntree->execdata) - exec = ntreeShaderBeginExecTree(ntree); + exec = ntreeShaderBeginExecTree(ntree, 1); ntreeExecGPUNodes(exec, mat, 1); - ntreeShaderEndExecTree(exec); + ntreeShaderEndExecTree(exec, 1); } /* **************** call to switch lamploop for material node ************ */ @@ -125,16 +125,21 @@ void set_node_shader_lamp_loop(void (*lamp_loop_func)(ShadeInput *, ShadeResult } -bNodeTreeExec *ntreeShaderBeginExecTree(bNodeTree *ntree) +/* XXX Group nodes must set use_tree_data to false, since their trees can be shared by multiple nodes. + * If use_tree_data is true, the ntree->execdata pointer is checked to avoid multiple execution of top-level trees. + */ +bNodeTreeExec *ntreeShaderBeginExecTree(bNodeTree *ntree, int use_tree_data) { bNodeTreeExec *exec; bNode *node; - /* XXX hack: prevent exec data from being generated twice. - * this should be handled by the renderer! - */ - if (ntree->execdata) - return ntree->execdata; + if (use_tree_data) { + /* XXX hack: prevent exec data from being generated twice. + * this should be handled by the renderer! + */ + if (ntree->execdata) + return ntree->execdata; + } /* ensures only a single output node is enabled */ ntreeSetOutput(ntree); @@ -148,15 +153,20 @@ bNodeTreeExec *ntreeShaderBeginExecTree(bNodeTree *ntree) for(node= exec->nodetree->nodes.first; node; node= node->next) node->need_exec= 1; - /* XXX this should not be necessary, but is still used for cmp/sha/tex nodes, - * which only store the ntree pointer. Should be fixed at some point! - */ - ntree->execdata = exec; + if (use_tree_data) { + /* XXX this should not be necessary, but is still used for cmp/sha/tex nodes, + * which only store the ntree pointer. Should be fixed at some point! + */ + ntree->execdata = exec; + } return exec; } -void ntreeShaderEndExecTree(bNodeTreeExec *exec) +/* XXX Group nodes must set use_tree_data to false, since their trees can be shared by multiple nodes. + * If use_tree_data is true, the ntree->execdata pointer is checked to avoid multiple execution of top-level trees. + */ +void ntreeShaderEndExecTree(bNodeTreeExec *exec, int use_tree_data) { if(exec) { bNodeTree *ntree= exec->nodetree; @@ -176,8 +186,10 @@ void ntreeShaderEndExecTree(bNodeTreeExec *exec) ntree_exec_end(exec); - /* XXX clear nodetree backpointer to exec data, same problem as noted in ntreeBeginExecTree */ - ntree->execdata = NULL; + if (use_tree_data) { + /* XXX clear nodetree backpointer to exec data, same problem as noted in ntreeBeginExecTree */ + ntree->execdata = NULL; + } } } @@ -199,7 +211,7 @@ void ntreeShaderExecTree(bNodeTree *ntree, ShadeInput *shi, ShadeResult *shr) memset(shr, 0, sizeof(ShadeResult)); if (!exec) - exec = ntree->execdata = ntreeShaderBeginExecTree(exec->nodetree); + exec = ntree->execdata = ntreeShaderBeginExecTree(exec->nodetree, 1); nts= ntreeGetThreadStack(exec, shi->thread); ntreeExecThreadNodes(exec, nts, &scd, shi->thread); diff --git a/source/blender/nodes/shader/nodes/node_shader_common.c b/source/blender/nodes/shader/nodes/node_shader_common.c index aa8e8241bf8..2dd15ab1e99 100644 --- a/source/blender/nodes/shader/nodes/node_shader_common.c +++ b/source/blender/nodes/shader/nodes/node_shader_common.c @@ -76,7 +76,7 @@ static void *group_initexec(bNode *node) bNodeTreeExec *exec; /* initialize the internal node tree execution */ - exec = ntreeShaderBeginExecTree(ngroup); + exec = ntreeShaderBeginExecTree(ngroup, 0); return exec; } @@ -85,7 +85,7 @@ static void group_freeexec(bNode *UNUSED(node), void *nodedata) { bNodeTreeExec*gexec= (bNodeTreeExec*)nodedata; - ntreeShaderEndExecTree(gexec); + ntreeShaderEndExecTree(gexec, 0); } /* Copy inputs to the internal stack. diff --git a/source/blender/nodes/texture/node_texture_tree.c b/source/blender/nodes/texture/node_texture_tree.c index 3ea15a316ab..603aa7ceb77 100644 --- a/source/blender/nodes/texture/node_texture_tree.c +++ b/source/blender/nodes/texture/node_texture_tree.c @@ -121,16 +121,21 @@ int ntreeTexTagAnimated(bNodeTree *ntree) return 0; } -bNodeTreeExec *ntreeTexBeginExecTree(bNodeTree *ntree) +/* XXX Group nodes must set use_tree_data to false, since their trees can be shared by multiple nodes. + * If use_tree_data is true, the ntree->execdata pointer is checked to avoid multiple execution of top-level trees. + */ +bNodeTreeExec *ntreeTexBeginExecTree(bNodeTree *ntree, int use_tree_data) { bNodeTreeExec *exec; bNode *node; - /* XXX hack: prevent exec data from being generated twice. - * this should be handled by the renderer! - */ - if (ntree->execdata) - return ntree->execdata; + if (use_tree_data) { + /* XXX hack: prevent exec data from being generated twice. + * this should be handled by the renderer! + */ + if (ntree->execdata) + return ntree->execdata; + } /* common base initialization */ exec = ntree_exec_begin(ntree); @@ -141,10 +146,12 @@ bNodeTreeExec *ntreeTexBeginExecTree(bNodeTree *ntree) for(node= exec->nodetree->nodes.first; node; node= node->next) node->need_exec= 1; - /* XXX this should not be necessary, but is still used for cmp/sha/tex nodes, - * which only store the ntree pointer. Should be fixed at some point! - */ - ntree->execdata = exec; + if (use_tree_data) { + /* XXX this should not be necessary, but is still used for cmp/sha/tex nodes, + * which only store the ntree pointer. Should be fixed at some point! + */ + ntree->execdata = exec; + } return exec; } @@ -163,7 +170,10 @@ static void tex_free_delegates(bNodeTreeExec *exec) MEM_freeN(ns->data); } -void ntreeTexEndExecTree(bNodeTreeExec *exec) +/* XXX Group nodes must set use_tree_data to false, since their trees can be shared by multiple nodes. + * If use_tree_data is true, the ntree->execdata pointer is checked to avoid multiple execution of top-level trees. + */ +void ntreeTexEndExecTree(bNodeTreeExec *exec, int use_tree_data) { if(exec) { bNodeTree *ntree= exec->nodetree; @@ -185,8 +195,10 @@ void ntreeTexEndExecTree(bNodeTreeExec *exec) ntree_exec_end(exec); - /* XXX clear nodetree backpointer to exec data, same problem as noted in ntreeBeginExecTree */ - ntree->execdata = NULL; + if (use_tree_data) { + /* XXX clear nodetree backpointer to exec data, same problem as noted in ntreeBeginExecTree */ + ntree->execdata = NULL; + } } } @@ -223,7 +235,7 @@ int ntreeTexExecTree( data.shi= shi; if (!exec) - exec = ntreeTexBeginExecTree(nodes); + exec = ntreeTexBeginExecTree(nodes, 1); nts= ntreeGetThreadStack(exec, thread); ntreeExecThreadNodes(exec, nts, &data, thread); diff --git a/source/blender/nodes/texture/nodes/node_texture_common.c b/source/blender/nodes/texture/nodes/node_texture_common.c index afb24226416..1b46b830909 100644 --- a/source/blender/nodes/texture/nodes/node_texture_common.c +++ b/source/blender/nodes/texture/nodes/node_texture_common.c @@ -61,7 +61,7 @@ static void *group_initexec(bNode *node) void *exec; /* initialize the internal node tree execution */ - exec = ntreeTexBeginExecTree(ngroup); + exec = ntreeTexBeginExecTree(ngroup, 0); return exec; } @@ -70,7 +70,7 @@ static void group_freeexec(bNode *UNUSED(node), void *nodedata) { bNodeTreeExec*gexec= (bNodeTreeExec*)nodedata; - ntreeTexEndExecTree(gexec); + ntreeTexEndExecTree(gexec, 0); } /* Copy inputs to the internal stack. diff --git a/source/blender/render/intern/source/render_texture.c b/source/blender/render/intern/source/render_texture.c index e35b3e53f5b..cf1fae81eb5 100644 --- a/source/blender/render/intern/source/render_texture.c +++ b/source/blender/render/intern/source/render_texture.c @@ -125,7 +125,7 @@ static void init_render_texture(Render *re, Tex *tex) } if(tex->nodetree && tex->use_nodes) { - ntreeTexBeginExecTree(tex->nodetree); /* has internal flag to detect it only does it once */ + ntreeTexBeginExecTree(tex->nodetree, 1); /* has internal flag to detect it only does it once */ } } @@ -145,7 +145,7 @@ void init_render_textures(Render *re) static void end_render_texture(Tex *tex) { if(tex && tex->use_nodes && tex->nodetree && tex->nodetree->execdata) - ntreeTexEndExecTree(tex->nodetree->execdata); + ntreeTexEndExecTree(tex->nodetree->execdata, 1); } void end_render_textures(Render *re) From 84b8ec2ec37e21f6672044c4bff1339365d76b55 Mon Sep 17 00:00:00 2001 From: Lukas Toenne Date: Tue, 6 Sep 2011 16:48:28 +0000 Subject: [PATCH 107/182] Fix for node group add menu, groups from old files wouldn't show up there. Reason was that node trees are now associated to specific node types (NODE_GROUP in particular) by the ntree->nodetype id. --- source/blender/blenloader/intern/readfile.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 66e38f1c5f8..d1a19f24b97 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -11991,6 +11991,17 @@ static void do_versions(FileData *fd, Library *lib, Main *main) ntree->update |= NTREE_UPDATE; } } + + { + /* Initialize group tree nodetypes. + * These are used to distinguish tree types and + * associate them with specific node types for polling. + */ + bNodeTree *ntree; + /* all node trees in main->nodetree are considered groups */ + for (ntree=main->nodetree.first; ntree; ntree=ntree->id.next) + ntree->nodetype = NODE_GROUP; + } } /* put compatibility code here until next subversion bump */ From c8a092789f5e53ebf418457bd2f7ea1a3818d0b7 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 6 Sep 2011 16:51:10 +0000 Subject: [PATCH 108/182] Node merge: some forward compatibility code to avoid crash loading files with node groups in older version, and to keep unconnected/default socket values. --- source/blender/blenloader/intern/writefile.c | 33 ++++++++++++++++++++ source/blender/makesdna/DNA_node_types.h | 6 ++-- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index b982630ec41..5c2d3e0c458 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -135,6 +135,7 @@ Any case: direct data is ALWAYS after the lib block #include "BLI_blenlib.h" #include "BLI_linklist.h" #include "BLI_bpath.h" +#include "BLI_math.h" #include "BLI_utildefines.h" #include "BKE_action.h" @@ -645,6 +646,38 @@ static void write_curvemapping(WriteData *wd, CurveMapping *cumap) static void write_node_socket(WriteData *wd, bNodeSocket *sock) { bNodeSocketType *stype= ntreeGetSocketType(sock->type); + + /* forward compatibility code, so older blenders still open */ + sock->stack_type = 1; + + if(sock->default_value) { + bNodeSocketValueFloat *valfloat; + bNodeSocketValueVector *valvector; + bNodeSocketValueRGBA *valrgba; + + switch (sock->type) { + case SOCK_FLOAT: + valfloat = sock->default_value; + sock->ns.vec[0] = valfloat->value; + sock->ns.min = valfloat->min; + sock->ns.max = valfloat->max; + break; + case SOCK_VECTOR: + valvector = sock->default_value; + copy_v3_v3(sock->ns.vec, valvector->value); + sock->ns.min = valvector->min; + sock->ns.max = valvector->max; + break; + case SOCK_RGBA: + valrgba = sock->default_value; + copy_v4_v4(sock->ns.vec, valrgba->value); + sock->ns.min = 0.0f; + sock->ns.max = 1.0f; + break; + } + } + + /* actual socket writing */ writestruct(wd, DATA, "bNodeSocket", 1, sock); if (sock->default_value) writestruct(wd, DATA, stype->value_structname, 1, sock->default_value); diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index 3a51a6a56a4..bac1e3cd8ca 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -84,7 +84,7 @@ typedef struct bNodeSocket { /* execution data */ short stack_index; /* local stack index */ - short pad2; + short stack_type; /* deprecated, kept for forward compatibility */ int pad3; void *cache; /* cached data from execution */ @@ -198,8 +198,8 @@ typedef struct bNodeLink { } bNodeLink; /* link->flag */ -#define NODE_LINK_VALID 1 /* link has been successfully validated */ -#define NODE_LINKFLAG_HILITE 2 +#define NODE_LINKFLAG_HILITE 1 /* link has been successfully validated */ +#define NODE_LINK_VALID 2 /* the basis for a Node tree, all links and nodes reside internal here */ /* only re-usable node trees are in the library though, materials and textures allocate own tree struct */ From 2ebc534900ab7ccaa37ec25dcc1aa24230fb1426 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 6 Sep 2011 17:18:50 +0000 Subject: [PATCH 109/182] Fix screen/scene browsing in info header not working right, mistake in code cleanup. --- source/blender/makesrna/intern/rna_screen.c | 8 +++++--- source/blender/makesrna/intern/rna_wm.c | 8 +++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/source/blender/makesrna/intern/rna_screen.c b/source/blender/makesrna/intern/rna_screen.c index 59707f05e6f..bd1021f038a 100644 --- a/source/blender/makesrna/intern/rna_screen.c +++ b/source/blender/makesrna/intern/rna_screen.c @@ -68,13 +68,14 @@ static void rna_Screen_scene_set(PointerRNA *ptr, PointerRNA value) sc->newscene= value.data; } -static void rna_Screen_scene_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr) +static void rna_Screen_scene_update(bContext *C, PointerRNA *ptr) { bScreen *sc= (bScreen*)ptr->data; - /* exception: can't set screens inside of area/region handers */ + /* exception: can't set screens inside of area/region handers, and must + use context so notifier gets to the right window */ if(sc->newscene) { - WM_main_add_notifier(NC_SCENE|ND_SCENEBROWSE, sc->newscene); + WM_event_add_notifier(C, NC_SCENE|ND_SCENEBROWSE, sc->newscene); sc->newscene= NULL; } } @@ -231,6 +232,7 @@ static void rna_def_screen(BlenderRNA *brna) RNA_def_property_flag(prop, PROP_EDITABLE|PROP_NEVER_NULL); RNA_def_property_pointer_funcs(prop, NULL, "rna_Screen_scene_set", NULL, NULL); RNA_def_property_ui_text(prop, "Scene", "Active scene to be edited in the screen"); + RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); RNA_def_property_update(prop, 0, "rna_Screen_scene_update"); /* collections */ diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c index a595b121d1a..7ce1e1ab88f 100644 --- a/source/blender/makesrna/intern/rna_wm.c +++ b/source/blender/makesrna/intern/rna_wm.c @@ -482,13 +482,14 @@ static void rna_Window_screen_set(PointerRNA *ptr, PointerRNA value) win->newscreen= value.data; } -static void rna_Window_screen_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr) +static void rna_Window_screen_update(bContext *C, PointerRNA *ptr) { wmWindow *win= (wmWindow*)ptr->data; - /* exception: can't set screens inside of area/region handers */ + /* exception: can't set screens inside of area/region handers, and must + use context so notifier gets to the right window */ if(win->newscreen) { - WM_main_add_notifier(NC_SCREEN|ND_SCREENBROWSE, win->newscreen); + WM_event_add_notifier(C, NC_SCREEN|ND_SCREENBROWSE, win->newscreen); win->newscreen= NULL; } } @@ -1454,6 +1455,7 @@ static void rna_def_window(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Screen", "Active screen showing in the window"); RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_pointer_funcs(prop, NULL, "rna_Window_screen_set", NULL, NULL); + RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); RNA_def_property_update(prop, 0, "rna_Window_screen_update"); } From 5700b1b1b24c42ac5c02b1da622d28bfefef6154 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 6 Sep 2011 17:27:18 +0000 Subject: [PATCH 110/182] Fix missing warning message when reading files that are not forward compatible, it seems this never worked in 2.5. --- source/blender/blenkernel/intern/blender.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c index 5f33059e117..2d4354bdd9f 100644 --- a/source/blender/blenkernel/intern/blender.c +++ b/source/blender/blenkernel/intern/blender.c @@ -324,17 +324,14 @@ static void setup_app_data(bContext *C, BlendFileData *bfd, const char *filepath MEM_freeN(bfd); } -static int handle_subversion_warning(Main *main) +static int handle_subversion_warning(Main *main, ReportList *reports) { if(main->minversionfile > BLENDER_VERSION || (main->minversionfile == BLENDER_VERSION && main->minsubversionfile > BLENDER_SUBVERSION)) { - - char str[128]; - - BLI_snprintf(str, sizeof(str), "File written by newer Blender binary: %d.%d , expect loss of data!", main->minversionfile, main->minsubversionfile); -// XXX error(str); + BKE_reportf(reports, RPT_ERROR, "File written by newer Blender binary: %d.%d , expect loss of data!", main->minversionfile, main->minsubversionfile); } + return 1; } @@ -392,7 +389,7 @@ int BKE_read_file(bContext *C, const char *filepath, ReportList *reports) if (bfd) { if(bfd->user) retval= BKE_READ_FILE_OK_USERPREFS; - if(0==handle_subversion_warning(bfd->main)) { + if(0==handle_subversion_warning(bfd->main, reports)) { free_main(bfd->main); MEM_freeN(bfd); bfd= NULL; From f2e236e312eb2e441e9869120165b316f0fddb44 Mon Sep 17 00:00:00 2001 From: Lukas Toenne Date: Tue, 6 Sep 2011 17:28:26 +0000 Subject: [PATCH 111/182] Enabled the 'Layout' node category, currently only containing the 'Frame' node. Both the category and the node could be renamed as needed. The frame node is largely experimental and not totally useful yet, but much asked for, so can't hurt to let people try it out. --- source/blender/editors/space_node/node_header.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/blender/editors/space_node/node_header.c b/source/blender/editors/space_node/node_header.c index 5c921d40344..7077f4a7497 100644 --- a/source/blender/editors/space_node/node_header.c +++ b/source/blender/editors/space_node/node_header.c @@ -232,6 +232,7 @@ static void node_menu_add(const bContext *C, Menu *menu) uiItemMenuF(layout, "Convertor", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_CONVERTOR)); uiItemMenuF(layout, "Group", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_GROUP)); uiItemMenuF(layout, "Dynamic", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_DYNAMIC)); + uiItemMenuF(layout, "Layout", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_LAYOUT)); } else if(snode->treetype==NTREE_COMPOSIT) { uiItemMenuF(layout, "Input", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_INPUT)); @@ -243,6 +244,7 @@ static void node_menu_add(const bContext *C, Menu *menu) uiItemMenuF(layout, "Matte", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_MATTE)); uiItemMenuF(layout, "Distort", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_DISTORT)); uiItemMenuF(layout, "Group", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_GROUP)); + uiItemMenuF(layout, "Layout", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_LAYOUT)); } else if(snode->treetype==NTREE_TEXTURE) { uiItemMenuF(layout, "Input", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_INPUT)); @@ -253,6 +255,7 @@ static void node_menu_add(const bContext *C, Menu *menu) uiItemMenuF(layout, "Convertor", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_CONVERTOR)); uiItemMenuF(layout, "Distort", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_DISTORT)); uiItemMenuF(layout, "Group", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_GROUP)); + uiItemMenuF(layout, "Layout", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_LAYOUT)); } } From decc2c2e774d11126d6006f9c4d4f37f2a09099d Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 6 Sep 2011 17:34:56 +0000 Subject: [PATCH 112/182] Node merge: fix crash loading files with unknown nodes (e.g. cycles files). --- source/blender/blenkernel/intern/node.c | 6 ++++-- source/blender/blenloader/intern/readfile.c | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index cd1a6e61151..47fc72f5e52 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -1524,9 +1524,11 @@ void NodeTagChanged(bNodeTree *ntree, bNode *node) { bNodeTreeType *ntreetype = ntreeGetType(ntree->type); - if (ntreetype->update_node) + /* extra null pointer checks here because this is called when unlinking + unknown nodes on file load, so typeinfo pointers may not be set */ + if (ntreetype && ntreetype->update_node) ntreetype->update_node(ntree, node); - else if (node->typeinfo->updatefunc) + else if (node->typeinfo && node->typeinfo->updatefunc) node->typeinfo->updatefunc(ntree, node); } diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index d1a19f24b97..664148157cb 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -2217,8 +2217,9 @@ static void direct_link_nodetree(FileData *fd, bNodeTree *ntree) if(node->type == NODE_DYNAMIC) { node->custom1= 0; node->custom1= BSET(node->custom1, NODE_DYNAMIC_LOADED); - node->typeinfo= NULL; } + + node->typeinfo= NULL; link_list(fd, &node->inputs); link_list(fd, &node->outputs); From 53671577a4ead5e96889a5fcd5a04255f8c948de Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 6 Sep 2011 18:15:34 +0000 Subject: [PATCH 113/182] Fixed potential crash in NodeTagIDChanged. Discovered after merge trunk into tomato where there were no check for tree before calling this function. Old design worked fine with this. Mark some arguments as UNUSED. --- source/blender/blenkernel/intern/node.c | 4 +++- source/blender/nodes/composite/nodes/node_composite_common.c | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index 47fc72f5e52..292f38b9472 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -1534,13 +1534,15 @@ void NodeTagChanged(bNodeTree *ntree, bNode *node) int NodeTagIDChanged(bNodeTree *ntree, ID *id) { - bNodeTreeType *ntreetype = ntreeGetType(ntree->type); + bNodeTreeType *ntreetype; bNode *node; int change = FALSE; if(ELEM(NULL, id, ntree)) return change; + ntreetype = ntreeGetType(ntree->type); + if (ntreetype->update_node) { for(node= ntree->nodes.first; node; node= node->next) { if(node->id==id) { diff --git a/source/blender/nodes/composite/nodes/node_composite_common.c b/source/blender/nodes/composite/nodes/node_composite_common.c index 8067f7e92be..d5ae442c25f 100644 --- a/source/blender/nodes/composite/nodes/node_composite_common.c +++ b/source/blender/nodes/composite/nodes/node_composite_common.c @@ -135,7 +135,7 @@ static void *group_initexec(bNode *node) return exec; } -static void group_freeexec(bNode *node, void *nodedata) +static void group_freeexec(bNode *UNUSED(node), void *nodedata) { bNodeTreeExec *gexec= (bNodeTreeExec*)nodedata; From 813d09cb5904bd435a6eefa328314d3cb9076be8 Mon Sep 17 00:00:00 2001 From: Joerg Mueller Date: Tue, 6 Sep 2011 21:02:26 +0000 Subject: [PATCH 114/182] BGE fix: ignore sounds that cannot be opened instead of crashing. ;-) --- .../Converter/KX_ConvertActuators.cpp | 21 ++++++++++++------- source/gameengine/Ketsji/KX_SoundActuator.cpp | 10 ++++++++- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/source/gameengine/Converter/KX_ConvertActuators.cpp b/source/gameengine/Converter/KX_ConvertActuators.cpp index 8fc224fba6f..6ba178cbb2f 100644 --- a/source/gameengine/Converter/KX_ConvertActuators.cpp +++ b/source/gameengine/Converter/KX_ConvertActuators.cpp @@ -413,14 +413,21 @@ void BL_ConvertActuators(char* maggiename, // if sound shall be 3D but isn't mono, we have to make it mono! if(is3d) { - AUD_Reference reader = snd_sound->createReader(); - if(reader->getSpecs().channels != AUD_CHANNELS_MONO) + try { - AUD_DeviceSpecs specs; - specs.channels = AUD_CHANNELS_MONO; - specs.rate = AUD_RATE_INVALID; - specs.format = AUD_FORMAT_INVALID; - snd_sound = new AUD_ChannelMapperFactory(snd_sound, specs); + AUD_Reference reader = snd_sound->createReader(); + if(reader->getSpecs().channels != AUD_CHANNELS_MONO) + { + AUD_DeviceSpecs specs; + specs.channels = AUD_CHANNELS_MONO; + specs.rate = AUD_RATE_INVALID; + specs.format = AUD_FORMAT_INVALID; + snd_sound = new AUD_ChannelMapperFactory(snd_sound, specs); + } + } + catch(AUD_Exception&) + { + // sound cannot be played... ignore } } } diff --git a/source/gameengine/Ketsji/KX_SoundActuator.cpp b/source/gameengine/Ketsji/KX_SoundActuator.cpp index 6c7b515c095..f24243fcdfc 100644 --- a/source/gameengine/Ketsji/KX_SoundActuator.cpp +++ b/source/gameengine/Ketsji/KX_SoundActuator.cpp @@ -108,7 +108,15 @@ void KX_SoundActuator::play() break; } - m_handle = AUD_getDevice()->play(sound, 0); + try + { + m_handle = AUD_getDevice()->play(sound, 0); + } + catch(AUD_Exception&) + { + // cannot play back, ignore + return; + } AUD_Reference handle3d = AUD_Reference(m_handle); From 9baff83d72ccb287e2e6011c648877b96790e9a9 Mon Sep 17 00:00:00 2001 From: Nathan Letwory Date: Tue, 6 Sep 2011 22:18:12 +0000 Subject: [PATCH 115/182] Split off scene export code. --- source/blender/collada/CMakeLists.txt | 2 + source/blender/collada/DocumentExporter.cpp | 162 +------------------- source/blender/collada/SceneExporter.cpp | 161 +++++++++++++++++++ source/blender/collada/SceneExporter.h | 101 ++++++++++++ 4 files changed, 267 insertions(+), 159 deletions(-) create mode 100644 source/blender/collada/SceneExporter.cpp create mode 100644 source/blender/collada/SceneExporter.h diff --git a/source/blender/collada/CMakeLists.txt b/source/blender/collada/CMakeLists.txt index d73373aa901..cc7229383e3 100644 --- a/source/blender/collada/CMakeLists.txt +++ b/source/blender/collada/CMakeLists.txt @@ -61,6 +61,7 @@ set(SRC MaterialExporter.cpp MeshImporter.cpp SkinInfo.cpp + SceneExporter.cpp TransformReader.cpp TransformWriter.cpp collada.cpp @@ -85,6 +86,7 @@ set(SRC MaterialExporter.h MeshImporter.h SkinInfo.h + SceneExporter.h TransformReader.h TransformWriter.h collada.h diff --git a/source/blender/collada/DocumentExporter.cpp b/source/blender/collada/DocumentExporter.cpp index 6e780889d16..85f37d29f22 100644 --- a/source/blender/collada/DocumentExporter.cpp +++ b/source/blender/collada/DocumentExporter.cpp @@ -34,6 +34,7 @@ extern "C" { #include "DNA_scene_types.h" #include "DNA_object_types.h" +#include "DNA_group_types.h" #include "DNA_meshdata_types.h" #include "DNA_mesh_types.h" #include "DNA_image_types.h" @@ -104,6 +105,7 @@ extern char build_rev[]; #include "COLLADASWConstants.h" #include "COLLADASWLibraryControllers.h" #include "COLLADASWInstanceController.h" +#include "COLLADASWInstanceNode.h" #include "COLLADASWBaseInputElement.h" #include "collada_internal.h" @@ -113,6 +115,7 @@ extern char build_rev[]; #include "InstanceWriter.h" #include "TransformWriter.h" +#include "SceneExporter.h" #include "ArmatureExporter.h" #include "AnimationExporter.h" #include "CameraExporter.h" @@ -142,165 +145,6 @@ char *bc_CustomData_get_active_layer_name(const CustomData *data, int type) return data->layers[layer_index].name; } - -/* - Utilities to avoid code duplication. - Definition can take some time to understand, but they should be useful. -*/ - - -template -void forEachObjectInScene(Scene *sce, Functor &f) -{ - Base *base= (Base*) sce->base.first; - while(base) { - Object *ob = base->object; - - f(ob); - - base= base->next; - } -} - - - -class SceneExporter: COLLADASW::LibraryVisualScenes, protected TransformWriter, protected InstanceWriter -{ - ArmatureExporter *arm_exporter; -public: - SceneExporter(COLLADASW::StreamWriter *sw, ArmatureExporter *arm) : COLLADASW::LibraryVisualScenes(sw), - arm_exporter(arm) {} - - void exportScene(Scene *sce, bool export_selected) { - // - std::string id_naming = id_name(sce); - openVisualScene(translate_id(id_naming), id_naming); - - // write s - //forEachMeshObjectInScene(sce, *this); - //forEachCameraObjectInScene(sce, *this); - //forEachLampObjectInScene(sce, *this); - exportHierarchy(sce, export_selected); - - // - closeVisualScene(); - - closeLibrary(); - } - - void exportHierarchy(Scene *sce, bool export_selected) - { - Base *base= (Base*) sce->base.first; - while(base) { - Object *ob = base->object; - - if (!ob->parent) { - if(sce->lay & ob->lay) { - switch(ob->type) { - case OB_MESH: - case OB_CAMERA: - case OB_LAMP: - case OB_ARMATURE: - case OB_EMPTY: - if (export_selected && !(ob->flag & SELECT)) { - break; - } - // write nodes.... - writeNodes(ob, sce); - break; - } - } - } - - base= base->next; - } - } - - - // called for each object - //void operator()(Object *ob) { - void writeNodes(Object *ob, Scene *sce) - { - COLLADASW::Node node(mSW); - node.setNodeId(translate_id(id_name(ob))); - node.setType(COLLADASW::Node::NODE); - - node.start(); - - bool is_skinned_mesh = arm_exporter->is_skinned_mesh(ob); - - if (ob->type == OB_MESH && is_skinned_mesh) - // for skinned mesh we write obmat in - TransformWriter::add_node_transform_identity(node); - else - TransformWriter::add_node_transform_ob(node, ob); - - // - if (ob->type == OB_MESH) { - if (is_skinned_mesh) { - arm_exporter->add_instance_controller(ob); - } - else { - COLLADASW::InstanceGeometry instGeom(mSW); - instGeom.setUrl(COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, get_geometry_id(ob))); - - InstanceWriter::add_material_bindings(instGeom.getBindMaterial(), ob); - - instGeom.add(); - } - } - - // - else if (ob->type == OB_ARMATURE) { - arm_exporter->add_armature_bones(ob, sce); - - // XXX this looks unstable... - node.end(); - } - - // - else if (ob->type == OB_CAMERA) { - COLLADASW::InstanceCamera instCam(mSW, COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, get_camera_id(ob))); - instCam.add(); - } - - // - else if (ob->type == OB_LAMP) { - COLLADASW::InstanceLight instLa(mSW, COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, get_light_id(ob))); - instLa.add(); - } - - // empty object - else if (ob->type == OB_EMPTY) { - } - - // write nodes for child objects - Base *b = (Base*) sce->base.first; - while(b) { - // cob - child object - Object *cob = b->object; - - if (cob->parent == ob) { - switch(cob->type) { - case OB_MESH: - case OB_CAMERA: - case OB_LAMP: - case OB_EMPTY: - case OB_ARMATURE: - // write node... - writeNodes(cob, sce); - break; - } - } - - b = b->next; - } - - if (ob->type != OB_ARMATURE) - node.end(); - } -}; - // TODO: it would be better to instantiate animations rather than create a new one per object // COLLADA allows this through multiple s in . // For this to work, we need to know objects that use a certain action. diff --git a/source/blender/collada/SceneExporter.cpp b/source/blender/collada/SceneExporter.cpp new file mode 100644 index 00000000000..96f20ac21c3 --- /dev/null +++ b/source/blender/collada/SceneExporter.cpp @@ -0,0 +1,161 @@ +/* + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/collada/SceneExporter.cpp + * \ingroup collada + */ + +#include "SceneExporter.h" + +SceneExporter::SceneExporter(COLLADASW::StreamWriter *sw, ArmatureExporter *arm) + : COLLADASW::LibraryVisualScenes(sw), arm_exporter(arm) +{} + +void SceneExporter::exportScene(Scene *sce, bool export_selected) +{ + // + std::string id_naming = id_name(sce); + openVisualScene(translate_id(id_naming), id_naming); + exportHierarchy(sce, export_selected); + closeVisualScene(); + closeLibrary(); +} + +void SceneExporter::exportHierarchy(Scene *sce, bool export_selected) +{ + Base *base= (Base*) sce->base.first; + while(base) { + Object *ob = base->object; + + if (!ob->parent) { + if(sce->lay & ob->lay) { + switch(ob->type) { + case OB_MESH: + case OB_CAMERA: + case OB_LAMP: + case OB_ARMATURE: + case OB_EMPTY: + if (export_selected && !(ob->flag & SELECT)) { + break; + } + // write nodes.... + writeNodes(ob, sce); + break; + } + } + } + + base= base->next; + } +} + +void SceneExporter::writeNodes(Object *ob, Scene *sce) +{ + COLLADASW::Node node(mSW); + node.setNodeId(translate_id(id_name(ob))); + node.setType(COLLADASW::Node::NODE); + + node.start(); + + bool is_skinned_mesh = arm_exporter->is_skinned_mesh(ob); + + if (ob->type == OB_MESH && is_skinned_mesh) + // for skinned mesh we write obmat in + TransformWriter::add_node_transform_identity(node); + else + TransformWriter::add_node_transform_ob(node, ob); + + // + if (ob->type == OB_MESH) { + if (is_skinned_mesh) { + arm_exporter->add_instance_controller(ob); + } + else { + COLLADASW::InstanceGeometry instGeom(mSW); + instGeom.setUrl(COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, get_geometry_id(ob))); + + InstanceWriter::add_material_bindings(instGeom.getBindMaterial(), ob); + + instGeom.add(); + } + } + + // + else if (ob->type == OB_ARMATURE) { + arm_exporter->add_armature_bones(ob, sce); + + // XXX this looks unstable... + node.end(); + } + + // + else if (ob->type == OB_CAMERA) { + COLLADASW::InstanceCamera instCam(mSW, COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, get_camera_id(ob))); + instCam.add(); + } + + // + else if (ob->type == OB_LAMP) { + COLLADASW::InstanceLight instLa(mSW, COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, get_light_id(ob))); + instLa.add(); + } + + // empty object + else if (ob->type == OB_EMPTY) { // TODO: handle groups (OB_DUPLIGROUP + if((ob->transflag & OB_DUPLIGROUP) == OB_DUPLIGROUP && ob->dup_group) { + GroupObject *go = NULL; + Group *gr = ob->dup_group; + printf("group detected %u\n", gr); + for(go = (GroupObject*)(gr->gobject.first); go; go=go->next) { + printf("\t%s\n", go->ob->id.name); + } + } + } + + // write nodes for child objects + Base *b = (Base*) sce->base.first; + while(b) { + // cob - child object + Object *cob = b->object; + + if (cob->parent == ob) { + switch(cob->type) { + case OB_MESH: + case OB_CAMERA: + case OB_LAMP: + case OB_EMPTY: + case OB_ARMATURE: + // write node... + writeNodes(cob, sce); + break; + } + } + + b = b->next; + } + + if (ob->type != OB_ARMATURE) + node.end(); +} + diff --git a/source/blender/collada/SceneExporter.h b/source/blender/collada/SceneExporter.h new file mode 100644 index 00000000000..30fef924ffd --- /dev/null +++ b/source/blender/collada/SceneExporter.h @@ -0,0 +1,101 @@ +/* + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file SceneExporter.h + * \ingroup collada + */ + +#ifndef __SCENEEXPORTER_H__ +#define __SCENEEXPORTER_H__ + +extern "C" { +#include "DNA_scene_types.h" +#include "DNA_object_types.h" +#include "DNA_group_types.h" +#include "DNA_meshdata_types.h" +#include "DNA_mesh_types.h" +#include "DNA_image_types.h" +#include "DNA_material_types.h" +#include "DNA_texture_types.h" +#include "DNA_anim_types.h" +#include "DNA_action_types.h" +#include "DNA_curve_types.h" +#include "DNA_armature_types.h" +#include "DNA_modifier_types.h" +#include "DNA_userdef_types.h" + +#include "BKE_DerivedMesh.h" +#include "BKE_fcurve.h" +#include "BKE_animsys.h" +#include "BLI_path_util.h" +#include "BLI_fileops.h" +#include "ED_keyframing.h" +} + +#include "COLLADASWAsset.h" +#include "COLLADASWLibraryVisualScenes.h" +#include "COLLADASWNode.h" +#include "COLLADASWSource.h" +#include "COLLADASWInstanceGeometry.h" +#include "COLLADASWInputList.h" +#include "COLLADASWPrimitves.h" +#include "COLLADASWVertices.h" +#include "COLLADASWLibraryAnimations.h" +#include "COLLADASWLibraryImages.h" +#include "COLLADASWLibraryEffects.h" +#include "COLLADASWImage.h" +#include "COLLADASWEffectProfile.h" +#include "COLLADASWColorOrTexture.h" +#include "COLLADASWParamTemplate.h" +#include "COLLADASWParamBase.h" +#include "COLLADASWSurfaceInitOption.h" +#include "COLLADASWSampler.h" +#include "COLLADASWScene.h" +#include "COLLADASWTechnique.h" +#include "COLLADASWTexture.h" +#include "COLLADASWLibraryMaterials.h" +#include "COLLADASWBindMaterial.h" +#include "COLLADASWInstanceCamera.h" +#include "COLLADASWInstanceLight.h" +#include "COLLADASWConstants.h" +#include "COLLADASWLibraryControllers.h" +#include "COLLADASWInstanceController.h" +#include "COLLADASWInstanceNode.h" +#include "COLLADASWBaseInputElement.h" + +#include "ArmatureExporter.h" + +class SceneExporter: COLLADASW::LibraryVisualScenes, protected TransformWriter, protected InstanceWriter +{ + ArmatureExporter *arm_exporter; +public: + SceneExporter(COLLADASW::StreamWriter *sw, ArmatureExporter *arm); + void exportScene(Scene *sce, bool export_selected); + +private: + void exportHierarchy(Scene *sce, bool export_selected); + void writeNodes(Object *ob, Scene *sce); +}; + +#endif From 9161d3ce4bdd7c838751462b47eb045ea33a686e Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 6 Sep 2011 23:46:20 +0000 Subject: [PATCH 116/182] use Py_ssize_t rather than int when dealing with list sizes (original patch from Fedora but applied changes elsewhere too), also replace PyList_Size with PyList_GET_SIZE where typechecking is already done. --- source/blender/python/generic/bpy_internal_import.c | 4 ++-- source/blender/python/intern/bpy_rna.c | 2 +- source/blender/python/mathutils/mathutils_geometry.c | 12 ++++++------ .../BlenderRoutines/BL_KetsjiEmbedStart.cpp | 5 +++-- source/gameengine/Expressions/ListValue.cpp | 4 ++-- source/gameengine/Expressions/Value.cpp | 4 ++-- source/gameengine/Ketsji/KX_PythonInit.cpp | 6 +++--- source/gameengine/Ketsji/KX_Scene.cpp | 4 ++-- 8 files changed, 21 insertions(+), 20 deletions(-) diff --git a/source/blender/python/generic/bpy_internal_import.c b/source/blender/python/generic/bpy_internal_import.c index f0158fe72c3..67ed90c79eb 100644 --- a/source/blender/python/generic/bpy_internal_import.c +++ b/source/blender/python/generic/bpy_internal_import.c @@ -344,7 +344,7 @@ void bpy_text_clear_modules(int clear_all) /* looping over the dict */ PyObject *key, *value; - int pos= 0; + Py_ssize_t pos= 0; /* new list */ PyObject *list; @@ -374,7 +374,7 @@ void bpy_text_clear_modules(int clear_all) } /* remove all our modules */ - for(pos=0; pos < PyList_Size(list); pos++) { + for(pos=0; pos < PyList_GET_SIZE(list); pos++) { /* PyObject_Print(key, stderr, 0); */ key= PyList_GET_ITEM(list, pos); PyDict_DelItem(modules, key); diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index d10c8c843e8..2212499d842 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -4608,7 +4608,7 @@ static PyObject *pyrna_func_call(BPy_FunctionRNA *self, PyObject *args, PyObject #ifdef DEBUG_STRING_FREE - // if(PyList_Size(string_free_ls)) printf("%.200s.%.200s(): has %d strings\n", RNA_struct_identifier(self_ptr->type), RNA_function_identifier(self_func), (int)PyList_Size(string_free_ls)); + // if(PyList_GET_SIZE(string_free_ls)) printf("%.200s.%.200s(): has %d strings\n", RNA_struct_identifier(self_ptr->type), RNA_function_identifier(self_func), (int)PyList_GET_SIZE(string_free_ls)); Py_DECREF(string_free_ls); #undef DEBUG_STRING_FREE #endif diff --git a/source/blender/python/mathutils/mathutils_geometry.c b/source/blender/python/mathutils/mathutils_geometry.c index bcdfe020e1a..0394d732ae3 100644 --- a/source/blender/python/mathutils/mathutils_geometry.c +++ b/source/blender/python/mathutils/mathutils_geometry.c @@ -983,7 +983,7 @@ static PyObject *M_Geometry_tesselate_polygon(PyObject *UNUSED(self), PyObject * static int boxPack_FromPyObject(PyObject *value, boxPack **boxarray) { - int len, i; + Py_ssize_t len, i; PyObject *list_item, *item_1, *item_2; boxPack *box; @@ -995,14 +995,14 @@ static int boxPack_FromPyObject(PyObject *value, boxPack **boxarray) return -1; } - len= PyList_Size(value); + len= PyList_GET_SIZE(value); (*boxarray)= MEM_mallocN(len*sizeof(boxPack), "boxPack box"); for(i= 0; i < len; i++) { list_item= PyList_GET_ITEM(value, i); - if(!PyList_Check(list_item) || PyList_Size(list_item) < 4) { + if(!PyList_Check(list_item) || PyList_GET_SIZE(list_item) < 4) { MEM_freeN(*boxarray); PyErr_SetString(PyExc_TypeError, "can only pack a list of [x, y, w, h]"); @@ -1034,11 +1034,11 @@ static int boxPack_FromPyObject(PyObject *value, boxPack **boxarray) static void boxPack_ToPyObject(PyObject *value, boxPack **boxarray) { - int len, i; + Py_ssize_t len, i; PyObject *list_item; boxPack *box; - len= PyList_Size(value); + len= PyList_GET_SIZE(value); for(i= 0; i < len; i++) { box= (*boxarray)+i; @@ -1062,7 +1062,7 @@ PyDoc_STRVAR(M_Geometry_box_pack_2d_doc, static PyObject *M_Geometry_box_pack_2d(PyObject *UNUSED(self), PyObject *boxlist) { float tot_width= 0.0f, tot_height= 0.0f; - int len; + Py_ssize_t len; PyObject *ret; diff --git a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp index 40f1701e44a..810e9b6ddfb 100644 --- a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp +++ b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp @@ -507,9 +507,10 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c //PyDict_Clear(PyModule_GetDict(gameLogic)); // Keep original items, means python plugins will autocomplete members - int listIndex; PyObject *gameLogic_keys_new = PyDict_Keys(PyModule_GetDict(gameLogic)); - for (listIndex=0; listIndex < PyList_Size(gameLogic_keys_new); listIndex++) { + const Py_ssize_t numitems= PyList_GET_SIZE(gameLogic_keys_new); + Py_ssize_t listIndex; + for (listIndex=0; listIndex < numitems; listIndex++) { PyObject* item = PyList_GET_ITEM(gameLogic_keys_new, listIndex); if (!PySequence_Contains(gameLogic_keys, item)) { PyDict_DelItem( PyModule_GetDict(gameLogic), item); diff --git a/source/gameengine/Expressions/ListValue.cpp b/source/gameengine/Expressions/ListValue.cpp index 271d5067dd9..934f2a8dd87 100644 --- a/source/gameengine/Expressions/ListValue.cpp +++ b/source/gameengine/Expressions/ListValue.cpp @@ -387,7 +387,7 @@ PyObject* listvalue_buffer_slice(PyObject* self,Py_ssize_t ilow, Py_ssize_t ihig static PyObject *listvalue_buffer_concat(PyObject * self, PyObject * other) { CListValue *listval= static_cast(BGE_PROXY_REF(self)); - int i, numitems, numitems_orig; + Py_ssize_t i, numitems, numitems_orig; if (listval==NULL) { PyErr_SetString(PyExc_SystemError, "CList+other, "BGE_PROXY_ERROR_MSG); @@ -408,7 +408,7 @@ static PyObject *listvalue_buffer_concat(PyObject * self, PyObject * other) CValue* listitemval; bool error = false; - numitems = PyList_Size(other); + numitems = PyList_GET_SIZE(other); /* copy the first part of the list */ listval_new->Resize(numitems_orig + numitems); diff --git a/source/gameengine/Expressions/Value.cpp b/source/gameengine/Expressions/Value.cpp index e60b380e95c..41c0850a779 100644 --- a/source/gameengine/Expressions/Value.cpp +++ b/source/gameengine/Expressions/Value.cpp @@ -546,8 +546,8 @@ CValue* CValue::ConvertPythonToValue(PyObject* pyobj, const char *error_prefix) CListValue* listval = new CListValue(); bool error = false; - int i; - int numitems = PyList_Size(pyobj); + Py_ssize_t i; + Py_ssize_t numitems = PyList_GET_SIZE(pyobj); for (i=0;iGetSceneConverter()->ConvertMeshSpecial(kx_scene, maggie, name); @@ -1751,7 +1751,7 @@ static void initPySysObjects(Main *maggie) initPySysObjects__append(sys_path, gp_GamePythonPath); -// fprintf(stderr, "\nNew Path: %d ", PyList_Size(sys_path)); +// fprintf(stderr, "\nNew Path: %d ", PyList_GET_SIZE(sys_path)); // PyObject_Print(sys_path, stderr, 0); } @@ -1775,7 +1775,7 @@ static void restorePySysObjects(void) gp_OrigPythonSysModules= NULL; -// fprintf(stderr, "\nRestore Path: %d ", PyList_Size(sys_path)); +// fprintf(stderr, "\nRestore Path: %d ", PyList_GET_SIZE(sys_path)); // PyObject_Print(sys_path, stderr, 0); } diff --git a/source/gameengine/Ketsji/KX_Scene.cpp b/source/gameengine/Ketsji/KX_Scene.cpp index 06e343cedb2..7c76ab01e93 100644 --- a/source/gameengine/Ketsji/KX_Scene.cpp +++ b/source/gameengine/Ketsji/KX_Scene.cpp @@ -1916,7 +1916,7 @@ void KX_Scene::Render2DFilters(RAS_ICanvas* canvas) void KX_Scene::RunDrawingCallbacks(PyObject* cb_list) { - int len; + Py_ssize_t len; if (cb_list && (len=PyList_GET_SIZE(cb_list))) { @@ -1925,7 +1925,7 @@ void KX_Scene::RunDrawingCallbacks(PyObject* cb_list) PyObject* ret; // Iterate the list and run the callbacks - for (int pos=0; pos < len; pos++) + for (Py_ssize_t pos=0; pos < len; pos++) { func= PyList_GET_ITEM(cb_list, pos); ret= PyObject_Call(func, args, NULL); From 527907662822fea5727bb5deecb96c9f1017adbd Mon Sep 17 00:00:00 2001 From: Lukas Toenne Date: Wed, 7 Sep 2011 06:17:28 +0000 Subject: [PATCH 117/182] Fix for value node limits. The value input nodes (like rgb input nodes) use the output value out their first socket for the button value. This needs explicitly set range limits to allow meaningful user input. --- source/blender/nodes/composite/nodes/node_composite_value.c | 2 ++ source/blender/nodes/shader/nodes/node_shader_value.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/source/blender/nodes/composite/nodes/node_composite_value.c b/source/blender/nodes/composite/nodes/node_composite_value.c index 0bb558cfa9d..80b71b9e65d 100644 --- a/source/blender/nodes/composite/nodes/node_composite_value.c +++ b/source/blender/nodes/composite/nodes/node_composite_value.c @@ -46,6 +46,8 @@ static void node_composit_init_value(bNodeTree *UNUSED(ntree), bNode *node, bNod bNodeSocketValueFloat *dval= (bNodeSocketValueFloat*)sock->default_value; /* uses the default value of the output socket, must be initialized here */ dval->value = 0.5f; + dval->min = -FLT_MAX; + dval->max = FLT_MAX; } static void node_composit_exec_value(void *UNUSED(data), bNode *node, bNodeStack **UNUSED(in), bNodeStack **out) diff --git a/source/blender/nodes/shader/nodes/node_shader_value.c b/source/blender/nodes/shader/nodes/node_shader_value.c index bbd3f8fc242..aadbd034e10 100644 --- a/source/blender/nodes/shader/nodes/node_shader_value.c +++ b/source/blender/nodes/shader/nodes/node_shader_value.c @@ -46,6 +46,8 @@ static void node_shader_init_value(bNodeTree *UNUSED(ntree), bNode *node, bNodeT bNodeSocketValueFloat *dval= (bNodeSocketValueFloat*)sock->default_value; /* uses the default value of the output socket, must be initialized here */ dval->value = 0.5f; + dval->min = -FLT_MAX; + dval->max = FLT_MAX; } static void node_shader_exec_value(void *UNUSED(data), bNode *node, bNodeStack **UNUSED(in), bNodeStack **out) From 5fa74525590f2014e92a687eb739389368a1b780 Mon Sep 17 00:00:00 2001 From: Nathan Letwory Date: Wed, 7 Sep 2011 07:02:56 +0000 Subject: [PATCH 118/182] Attempt to fix compile error on OSX --- source/blender/collada/SceneExporter.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/blender/collada/SceneExporter.h b/source/blender/collada/SceneExporter.h index 30fef924ffd..65dbd616b20 100644 --- a/source/blender/collada/SceneExporter.h +++ b/source/blender/collada/SceneExporter.h @@ -29,6 +29,10 @@ #ifndef __SCENEEXPORTER_H__ #define __SCENEEXPORTER_H__ +#include +#include +#include + extern "C" { #include "DNA_scene_types.h" #include "DNA_object_types.h" From f6a64f4d799ad28b297d78c1107e74233b7018b0 Mon Sep 17 00:00:00 2001 From: "Guillermo S. Romero" Date: Wed, 7 Sep 2011 07:06:43 +0000 Subject: [PATCH 119/182] SVN maintenance. --- .../modifiers/intern/MOD_weightvg_util.c | 58 +++++++++---------- .../modifiers/intern/MOD_weightvg_util.h | 52 ++++++++--------- .../modifiers/intern/MOD_weightvgedit.c | 52 ++++++++--------- .../modifiers/intern/MOD_weightvgmix.c | 52 ++++++++--------- .../modifiers/intern/MOD_weightvgproximity.c | 52 ++++++++--------- 5 files changed, 133 insertions(+), 133 deletions(-) diff --git a/source/blender/modifiers/intern/MOD_weightvg_util.c b/source/blender/modifiers/intern/MOD_weightvg_util.c index 675f0d76a48..52c851c5a1d 100644 --- a/source/blender/modifiers/intern/MOD_weightvg_util.c +++ b/source/blender/modifiers/intern/MOD_weightvg_util.c @@ -1,34 +1,34 @@ /* -* $Id$ -* -* ***** BEGIN GPL LICENSE BLOCK ***** -* -* This program is free software; you can redistribute it and/or -* modify it under the terms of the GNU General Public License -* as published by the Free Software Foundation; either version 2 -* of the License, or (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program; if not, write to the Free Software Foundation, -* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -* -* The Original Code is Copyright (C) 2011 by Bastien Montagne. -* All rights reserved. -* -* Contributor(s): None yet. -* -* ***** END GPL LICENSE BLOCK ***** -* -*/ + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2011 by Bastien Montagne. + * All rights reserved. + * + * Contributor(s): None yet. + * + * ***** END GPL LICENSE BLOCK ***** + * + */ /* * XXX I'd like to make modified weights visible in WeightPaint mode, - * but couldn't figure a way to do this… + * but couldn't figure a way to do this... * Maybe this will need changes in mesh_calc_modifiers (DerivedMesh.c)? * Or the WeightPaint mode code itself? */ @@ -131,7 +131,7 @@ void weightvg_do_mask(int num, const int *indices, float *org_w, const float *ne if (texture) { /* The texture coordinates. */ float (*tex_co)[3]; - /* See mapping note below… */ + /* See mapping note below... */ MappingInfoModifierData t_map; float (*v_co)[3]; @@ -158,7 +158,7 @@ void weightvg_do_mask(int num, const int *indices, float *org_w, const float *ne texres.nor = NULL; get_texture_value(texture, tex_co[idx], &texres); - /* Get the good channel value… */ + /* Get the good channel value... */ switch(tex_use_channel) { case MOD_WVG_MASK_TEX_USE_INT: org_w[i] = (new_w[i] * texres.tin * fact) + (org_w[i] * (1.0f - (texres.tin*fact))); diff --git a/source/blender/modifiers/intern/MOD_weightvg_util.h b/source/blender/modifiers/intern/MOD_weightvg_util.h index 3afff391943..00c63a3d5d5 100644 --- a/source/blender/modifiers/intern/MOD_weightvg_util.h +++ b/source/blender/modifiers/intern/MOD_weightvg_util.h @@ -1,30 +1,30 @@ /* -* $Id$ -* -* ***** BEGIN GPL LICENSE BLOCK ***** -* -* This program is free software; you can redistribute it and/or -* modify it under the terms of the GNU General Public License -* as published by the Free Software Foundation; either version 2 -* of the License, or (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program; if not, write to the Free Software Foundation, -* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -* -* The Original Code is Copyright (C) 2011 by Bastien Montagne. -* All rights reserved. -* -* Contributor(s): None yet. -* -* ***** END GPL LICENSE BLOCK ***** -* -*/ + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2011 by Bastien Montagne. + * All rights reserved. + * + * Contributor(s): None yet. + * + * ***** END GPL LICENSE BLOCK ***** + * + */ /** \file blender/modifiers/intern/MOD_util.h * \ingroup modifiers diff --git a/source/blender/modifiers/intern/MOD_weightvgedit.c b/source/blender/modifiers/intern/MOD_weightvgedit.c index 763a063567b..7a7f69c4751 100644 --- a/source/blender/modifiers/intern/MOD_weightvgedit.c +++ b/source/blender/modifiers/intern/MOD_weightvgedit.c @@ -1,30 +1,30 @@ /* -* $Id$ -* -* ***** BEGIN GPL LICENSE BLOCK ***** -* -* This program is free software; you can redistribute it and/or -* modify it under the terms of the GNU General Public License -* as published by the Free Software Foundation; either version 2 -* of the License, or (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program; if not, write to the Free Software Foundation, -* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -* -* The Original Code is Copyright (C) 2011 by Bastien Montagne. -* All rights reserved. -* -* Contributor(s): None yet. -* -* ***** END GPL LICENSE BLOCK ***** -* -*/ + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2011 by Bastien Montagne. + * All rights reserved. + * + * Contributor(s): None yet. + * + * ***** END GPL LICENSE BLOCK ***** + * + */ /* * XXX I'd like to make modified weights visible in WeightPaint mode, diff --git a/source/blender/modifiers/intern/MOD_weightvgmix.c b/source/blender/modifiers/intern/MOD_weightvgmix.c index 7543b085b51..97857644c35 100644 --- a/source/blender/modifiers/intern/MOD_weightvgmix.c +++ b/source/blender/modifiers/intern/MOD_weightvgmix.c @@ -1,30 +1,30 @@ /* -* $Id$ -* -* ***** BEGIN GPL LICENSE BLOCK ***** -* -* This program is free software; you can redistribute it and/or -* modify it under the terms of the GNU General Public License -* as published by the Free Software Foundation; either version 2 -* of the License, or (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program; if not, write to the Free Software Foundation, -* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -* -* The Original Code is Copyright (C) 2011 by Bastien Montagne. -* All rights reserved. -* -* Contributor(s): None yet. -* -* ***** END GPL LICENSE BLOCK ***** -* -*/ + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2011 by Bastien Montagne. + * All rights reserved. + * + * Contributor(s): None yet. + * + * ***** END GPL LICENSE BLOCK ***** + * + */ /* * XXX I'd like to make modified weights visible in WeightPaint mode, diff --git a/source/blender/modifiers/intern/MOD_weightvgproximity.c b/source/blender/modifiers/intern/MOD_weightvgproximity.c index 35f993e24b6..55f0102bef3 100644 --- a/source/blender/modifiers/intern/MOD_weightvgproximity.c +++ b/source/blender/modifiers/intern/MOD_weightvgproximity.c @@ -1,30 +1,30 @@ /* -* $Id$ -* -* ***** BEGIN GPL LICENSE BLOCK ***** -* -* This program is free software; you can redistribute it and/or -* modify it under the terms of the GNU General Public License -* as published by the Free Software Foundation; either version 2 -* of the License, or (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program; if not, write to the Free Software Foundation, -* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -* -* The Original Code is Copyright (C) 2011 by Bastien Montagne. -* All rights reserved. -* -* Contributor(s): None yet. -* -* ***** END GPL LICENSE BLOCK ***** -* -*/ + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2011 by Bastien Montagne. + * All rights reserved. + * + * Contributor(s): None yet. + * + * ***** END GPL LICENSE BLOCK ***** + * + */ /* * XXX I'd like to make modified weights visible in WeightPaint mode, From 6d18b1800a9bbbb7ab0ab03907a1d2a720d7f8d0 Mon Sep 17 00:00:00 2001 From: Lukas Toenne Date: Wed, 7 Sep 2011 07:29:29 +0000 Subject: [PATCH 120/182] Another fix for value nodes, those need full template definitions for their output sockets, since they use their range limits for buttons. --- source/blender/nodes/composite/nodes/node_composite_value.c | 3 ++- source/blender/nodes/shader/nodes/node_shader_value.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/source/blender/nodes/composite/nodes/node_composite_value.c b/source/blender/nodes/composite/nodes/node_composite_value.c index 80b71b9e65d..ed650477f50 100644 --- a/source/blender/nodes/composite/nodes/node_composite_value.c +++ b/source/blender/nodes/composite/nodes/node_composite_value.c @@ -36,7 +36,8 @@ /* **************** VALUE ******************** */ static bNodeSocketTemplate cmp_node_value_out[]= { - { SOCK_FLOAT, 0, "Value"}, + /* XXX value nodes use the output sockets for buttons, so we need explicit limits here! */ + { SOCK_FLOAT, 0, "Value", 0.0f, 0.0f, 0.0f, 0.0f, -FLT_MAX, FLT_MAX}, { -1, 0, "" } }; diff --git a/source/blender/nodes/shader/nodes/node_shader_value.c b/source/blender/nodes/shader/nodes/node_shader_value.c index aadbd034e10..119a3664308 100644 --- a/source/blender/nodes/shader/nodes/node_shader_value.c +++ b/source/blender/nodes/shader/nodes/node_shader_value.c @@ -36,7 +36,8 @@ /* **************** VALUE ******************** */ static bNodeSocketTemplate sh_node_value_out[]= { - { SOCK_FLOAT, 0, "Value"}, + /* XXX value nodes use the output sockets for buttons, so we need explicit limits here! */ + { SOCK_FLOAT, 0, "Value", 0.0f, 0.0f, 0.0f, 0.0f, -FLT_MAX, FLT_MAX}, { -1, 0, "" } }; From 520778163debe82b8cebe9ddec6ab4111ab2d6bd Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 7 Sep 2011 07:46:26 +0000 Subject: [PATCH 121/182] interface + naming improvements to vertex wright modifier - WeightVG -> Vertex Weight - mapping_mode -> falloff_type - nicer layout for VertexWeightModifiers add/remove options --- doc/python_api/rst/info_tips_and_tricks.rst | 16 ++++++++ .../startup/bl_ui/properties_data_modifier.py | 31 +++++++------- source/blender/editors/include/UI_icons.h | 2 +- source/blender/makesdna/DNA_modifier_types.h | 4 +- source/blender/makesrna/intern/rna_modifier.c | 40 +++++++++---------- .../modifiers/intern/MOD_weightvg_util.c | 12 +++--- .../modifiers/intern/MOD_weightvgedit.c | 10 ++--- .../modifiers/intern/MOD_weightvgmix.c | 2 +- .../modifiers/intern/MOD_weightvgproximity.c | 8 ++-- 9 files changed, 72 insertions(+), 53 deletions(-) diff --git a/doc/python_api/rst/info_tips_and_tricks.rst b/doc/python_api/rst/info_tips_and_tricks.rst index f4e68a4516c..3ce2cfd48ad 100644 --- a/doc/python_api/rst/info_tips_and_tricks.rst +++ b/doc/python_api/rst/info_tips_and_tricks.rst @@ -100,6 +100,22 @@ While this is not best practice - for testing you can extend the search path, th Don't Use Blender! ================== +While developing your own scripts blenders interface can get in the way, manually reloading, running the scripts, opening file import etc is just overhead. + +For scripts that are not interactive it can end up being easier not to use blender at all and run blender from a terminal, without opening a window and execute the script on the command line. + +.. code-block:: + + blender --backgruond --python myscript.py + + +You might want to run this with a blend file too. + +.. code-block:: + + blender myscene.blend --backgruond --python myscript.py + + Use External Tools ================== diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py index 8e7f50cd6f2..058e8161fe6 100644 --- a/release/scripts/startup/bl_ui/properties_data_modifier.py +++ b/release/scripts/startup/bl_ui/properties_data_modifier.py @@ -768,7 +768,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel): elif md.mask_tex_mapping == 'UV' and ob.type == 'MESH': layout.prop_search(md, "mask_tex_uv_layer", ob.data, "uv_textures") - def WEIGHT_VGEDIT(self, layout, ob, md): + def VERTEX_WEIGHT_EDIT(self, layout, ob, md): if ob.type == 'MESH': split = layout.split() col = split.column() @@ -779,25 +779,28 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel): col.label(text="Default Weight:") col.prop(md, "default_weight", text="") - layout.prop(md, "mapping_mode") - if md.mapping_mode == 'CURVE': + layout.prop(md, "falloff_type") + if md.falloff_type == 'CURVE': col = layout.column() col.template_curve_mapping(md, "map_curve") - row = layout.row() - row.prop(md, "use_add") - row.prop(md, "use_remove") - row = layout.row() - if md.use_add: - row.prop(md, "add_threshold") - if md.use_remove: - row.prop(md, "remove_threshold") + split = layout.split(percentage=0.4) + split.prop(md, "use_add") + row = split.row() + row.active = md.use_add + row.prop(md, "add_threshold") + + split = layout.split(percentage=0.4) + split.prop(md, "use_remove") + row = split.row() + row.active = md.use_remove + row.prop(md, "remove_threshold") # Common mask options… layout.separator() self.weight_vg_mask(layout, ob, md) - def WEIGHT_VGMIX(self, layout, ob, md): + def VERTEX_WEIGHT_MIX(self, layout, ob, md): if ob.type == 'MESH': split = layout.split() col = split.column() @@ -822,7 +825,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel): layout.separator() self.weight_vg_mask(layout, ob, md) - def WEIGHT_VGPROXIMITY(self, layout, ob, md): + def VERTEX_WEIGHT_PROXIMITY(self, layout, ob, md): if ob.type == 'MESH': split = layout.split() col = split.column() @@ -843,7 +846,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel): row.prop(md, "min_dist") row.prop(md, "max_dist") - layout.prop(md, "mapping_mode") + layout.prop(md, "falloff_type") # Common mask options… layout.separator() diff --git a/source/blender/editors/include/UI_icons.h b/source/blender/editors/include/UI_icons.h index d6ef4264b07..f8d0b819ac1 100644 --- a/source/blender/editors/include/UI_icons.h +++ b/source/blender/editors/include/UI_icons.h @@ -589,7 +589,7 @@ DEF_ICON(MOD_MULTIRES) DEF_ICON(MOD_SMOKE) DEF_ICON(MOD_SOLIDIFY) DEF_ICON(MOD_SCREW) -DEF_ICON(MOD_WEIGHTVG) +DEF_ICON(MOD_VERTEX_WEIGHT) #ifndef DEF_ICON_BLANK_SKIP DEF_ICON(BLANK161) DEF_ICON(BLANK162) diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index c4eef981669..32a78cb823a 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -796,7 +796,7 @@ typedef struct WeightVGEditModifierData { char defgrp_name[32]; /* Name of vertex group to edit. */ short edit_flags; /* Using MOD_WVG_EDIT_* flags. */ - short mapping_mode; /* Using MOD_WVG_MAPPING_* defines. */ + short falloff_type; /* Using MOD_WVG_MAPPING_* defines. */ float default_weight; /* Weight for vertices not in vgroup. */ /* Mapping stuff. */ @@ -913,7 +913,7 @@ typedef struct WeightVGProximityModifierData { float min_dist, max_dist; /* Distances mapping to 0.0/1.0 weights. */ /* Put here to avoid breaking existing struct... */ - short mapping_mode; /* Using MOD_WVG_MAPPING_* defines. */ + short falloff_type; /* Using MOD_WVG_MAPPING_* defines. */ /* Padding... */ short pad_s1; diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index 76e34352e8d..2e8e8520dbf 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -69,9 +69,9 @@ EnumPropertyItem modifier_type_items[] ={ {eModifierType_Solidify, "SOLIDIFY", ICON_MOD_SOLIDIFY, "Solidify", ""}, {eModifierType_Subsurf, "SUBSURF", ICON_MOD_SUBSURF, "Subdivision Surface", ""}, {eModifierType_UVProject, "UV_PROJECT", ICON_MOD_UVPROJECT, "UV Project", ""}, - {eModifierType_WeightVGEdit, "WEIGHT_VGEDIT", ICON_MOD_WEIGHTVG, "WeightVG Edit", ""}, - {eModifierType_WeightVGMix, "WEIGHT_VGMIX", ICON_MOD_WEIGHTVG, "WeightVG Mix", ""}, - {eModifierType_WeightVGProximity, "WEIGHT_VGPROXIMITY", ICON_MOD_WEIGHTVG, "WeightVG Proximity", ""}, + {eModifierType_WeightVGEdit, "VERTEX_WEIGHT_EDIT", ICON_MOD_VERTEX_WEIGHT, "Vertex Weight Edit", ""}, + {eModifierType_WeightVGMix, "VERTEX_WEIGHT_MIX", ICON_MOD_VERTEX_WEIGHT, "Vertex Weight Mix", ""}, + {eModifierType_WeightVGProximity, "VERTEX_WEIGHT_PROXIMITY", ICON_MOD_VERTEX_WEIGHT, "Vertex Weight Proximity", ""}, {0, "", 0, "Deform", ""}, {eModifierType_Armature, "ARMATURE", ICON_MOD_ARMATURE, "Armature", ""}, {eModifierType_Cast, "CAST", ICON_MOD_CAST, "Cast", ""}, @@ -188,11 +188,11 @@ static StructRNA* rna_Modifier_refine(struct PointerRNA *ptr) case eModifierType_Warp: return &RNA_WarpModifier; case eModifierType_WeightVGEdit: - return &RNA_WeightVGEditModifier; + return &RNA_VertexWeightEditModifier; case eModifierType_WeightVGMix: - return &RNA_WeightVGMixModifier; + return &RNA_VertexWeightMixModifier; case eModifierType_WeightVGProximity: - return &RNA_WeightVGProximityModifier; + return &RNA_VertexWeightProximityModifier; default: return &RNA_Modifier; } @@ -2552,7 +2552,7 @@ static void rna_def_modifier_weightvg_mask(BlenderRNA *brna, StructRNA *srna) static void rna_def_modifier_weightvgedit(BlenderRNA *brna) { - static EnumPropertyItem weightvg_edit_mapping_mode_items[] = { + static EnumPropertyItem weightvg_edit_falloff_type_items[] = { {MOD_WVG_MAPPING_NONE, "LINEAR", ICON_LINCURVE, "Linear", ""}, {MOD_WVG_MAPPING_CURVE, "CURVE", ICON_RNDCURVE, "Custom Curve", ""}, {MOD_WVG_MAPPING_SHARP, "SHARP", ICON_SHARPCURVE, "Sharp", ""}, @@ -2566,11 +2566,11 @@ static void rna_def_modifier_weightvgedit(BlenderRNA *brna) StructRNA *srna; PropertyRNA *prop; - srna= RNA_def_struct(brna, "WeightVGEditModifier", "Modifier"); + srna= RNA_def_struct(brna, "VertexWeightEditModifier", "Modifier"); RNA_def_struct_ui_text(srna, "WeightVG Edit Modifier", "Edit the weights of vertices in a group."); RNA_def_struct_sdna(srna, "WeightVGEditModifierData"); - RNA_def_struct_ui_icon(srna, ICON_MOD_WEIGHTVG); + RNA_def_struct_ui_icon(srna, ICON_MOD_VERTEX_WEIGHT); prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE); RNA_def_property_string_sdna(prop, NULL, "defgrp_name"); @@ -2578,9 +2578,9 @@ static void rna_def_modifier_weightvgedit(BlenderRNA *brna) RNA_def_property_string_funcs(prop, NULL, NULL, "rna_WeightVGModifier_vgroup_set"); RNA_def_property_update(prop, 0, "rna_Modifier_update"); - prop= RNA_def_property(srna, "mapping_mode", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_items(prop, weightvg_edit_mapping_mode_items); - RNA_def_property_ui_text(prop, "Mapping Mode", "How weights are mapped to there new values."); + prop= RNA_def_property(srna, "falloff_type", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_items(prop, weightvg_edit_falloff_type_items); + RNA_def_property_ui_text(prop, "Falloff Type", "How weights are mapped to there new values."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); prop= RNA_def_property(srna, "use_add", PROP_BOOLEAN, PROP_NONE); @@ -2650,11 +2650,11 @@ static void rna_def_modifier_weightvgmix(BlenderRNA *brna) StructRNA *srna; PropertyRNA *prop; - srna= RNA_def_struct(brna, "WeightVGMixModifier", "Modifier"); + srna= RNA_def_struct(brna, "VertexWeightMixModifier", "Modifier"); RNA_def_struct_ui_text(srna, "WeightVG Mix Modifier", "Mix the weights of two vertex groups."); RNA_def_struct_sdna(srna, "WeightVGMixModifierData"); - RNA_def_struct_ui_icon(srna, ICON_MOD_WEIGHTVG); + RNA_def_struct_ui_icon(srna, ICON_MOD_VERTEX_WEIGHT); prop= RNA_def_property(srna, "vertex_group_a", PROP_STRING, PROP_NONE); RNA_def_property_string_sdna(prop, NULL, "defgrp_name_a"); @@ -2712,7 +2712,7 @@ static void rna_def_modifier_weightvgproximity(BlenderRNA *brna) {MOD_WVG_PROXIMITY_GEOM_FACES, "FACE", ICON_FACESEL, "Face", ""}, {0, NULL, 0, NULL, NULL}}; - static EnumPropertyItem weightvg_proximity_mapping_mode_items[] = { + static EnumPropertyItem weightvg_proximity_falloff_type_items[] = { {MOD_WVG_MAPPING_NONE, "LINEAR", ICON_LINCURVE, "Linear", ""}, /* No curve mapping here! */ {MOD_WVG_MAPPING_SHARP, "SHARP", ICON_SHARPCURVE, "Sharp", ""}, @@ -2726,12 +2726,12 @@ static void rna_def_modifier_weightvgproximity(BlenderRNA *brna) StructRNA *srna; PropertyRNA *prop; - srna= RNA_def_struct(brna, "WeightVGProximityModifier", "Modifier"); + srna= RNA_def_struct(brna, "VertexWeightProximityModifier", "Modifier"); RNA_def_struct_ui_text(srna, "WeightVG Proximity Modifier", "Set the weights of vertices in a group from a target object's " "distance."); RNA_def_struct_sdna(srna, "WeightVGProximityModifierData"); - RNA_def_struct_ui_icon(srna, ICON_MOD_WEIGHTVG); + RNA_def_struct_ui_icon(srna, ICON_MOD_VERTEX_WEIGHT); prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE); RNA_def_property_string_sdna(prop, NULL, "defgrp_name"); @@ -2769,9 +2769,9 @@ static void rna_def_modifier_weightvgproximity(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Highest Dist", "Distance mapping to weight 1.0."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); - prop= RNA_def_property(srna, "mapping_mode", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_items(prop, weightvg_proximity_mapping_mode_items); - RNA_def_property_ui_text(prop, "Mapping Mode", "How weights are mapped to there new values."); + prop= RNA_def_property(srna, "falloff_type", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_items(prop, weightvg_proximity_falloff_type_items); + RNA_def_property_ui_text(prop, "Falloff Type", "How weights are mapped to there new values."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); /* Common masking properties. */ diff --git a/source/blender/modifiers/intern/MOD_weightvg_util.c b/source/blender/modifiers/intern/MOD_weightvg_util.c index 52c851c5a1d..51465cc80b0 100644 --- a/source/blender/modifiers/intern/MOD_weightvg_util.c +++ b/source/blender/modifiers/intern/MOD_weightvg_util.c @@ -63,16 +63,16 @@ * vertex index (in case the weight tables do not cover the whole vertices...). * cmap might be NULL, in which case curve mapping mode will return unmodified data. */ -void weightvg_do_map(int num, float *new_w, short mode, CurveMapping *cmap) +void weightvg_do_map(int num, float *new_w, short falloff_type, CurveMapping *cmap) { int i; /* Return immediately, if we have nothing to do! */ /* Also security checks... */ - if(((mode == MOD_WVG_MAPPING_CURVE) && (cmap == NULL)) - || !ELEM7(mode, MOD_WVG_MAPPING_CURVE, MOD_WVG_MAPPING_SHARP, MOD_WVG_MAPPING_SMOOTH, - MOD_WVG_MAPPING_ROOT, MOD_WVG_MAPPING_SPHERE, MOD_WVG_MAPPING_RANDOM, - MOD_WVG_MAPPING_STEP)) + if(((falloff_type == MOD_WVG_MAPPING_CURVE) && (cmap == NULL)) + || !ELEM7(falloff_type, MOD_WVG_MAPPING_CURVE, MOD_WVG_MAPPING_SHARP, MOD_WVG_MAPPING_SMOOTH, + MOD_WVG_MAPPING_ROOT, MOD_WVG_MAPPING_SPHERE, MOD_WVG_MAPPING_RANDOM, + MOD_WVG_MAPPING_STEP)) return; /* Map each weight (vertex) to its new value, accordingly to the chosen mode. */ @@ -81,7 +81,7 @@ void weightvg_do_map(int num, float *new_w, short mode, CurveMapping *cmap) /* Code borrowed from the warp modifier. */ /* Closely matches PROP_SMOOTH and similar. */ - switch(mode) { + switch(falloff_type) { case MOD_WVG_MAPPING_CURVE: fac = curvemapping_evaluateF(cmap, 0, fac); break; diff --git a/source/blender/modifiers/intern/MOD_weightvgedit.c b/source/blender/modifiers/intern/MOD_weightvgedit.c index 7a7f69c4751..0b6b69b2b3c 100644 --- a/source/blender/modifiers/intern/MOD_weightvgedit.c +++ b/source/blender/modifiers/intern/MOD_weightvgedit.c @@ -62,7 +62,7 @@ static void initData(ModifierData *md) { WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md; wmd->edit_flags = 0; - wmd->mapping_mode = MOD_WVG_MAPPING_NONE; + wmd->falloff_type = MOD_WVG_MAPPING_NONE; wmd->default_weight = 0.0f; wmd->cmap_curve = curvemapping_add(1, 0.0, 0.0, 1.0, 1.0); @@ -90,7 +90,7 @@ static void copyData(ModifierData *md, ModifierData *target) BLI_strncpy(twmd->defgrp_name, wmd->defgrp_name, sizeof(twmd->defgrp_name)); twmd->edit_flags = wmd->edit_flags; - twmd->mapping_mode = wmd->mapping_mode; + twmd->falloff_type = wmd->falloff_type; twmd->default_weight = wmd->default_weight; twmd->cmap_curve = curvemapping_copy(wmd->cmap_curve); @@ -268,8 +268,8 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der } /* Do mapping. */ - if (wmd->mapping_mode != MOD_WVG_MAPPING_NONE) { - weightvg_do_map(numVerts, new_w, wmd->mapping_mode, wmd->cmap_curve); + if (wmd->falloff_type != MOD_WVG_MAPPING_NONE) { + weightvg_do_map(numVerts, new_w, wmd->falloff_type, wmd->cmap_curve); } /* Do masking. */ @@ -298,7 +298,7 @@ static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob, ModifierTypeInfo modifierType_WeightVGEdit = { - /* name */ "WeightVGEdit", + /* name */ "VertexWeightEdit", /* structName */ "WeightVGEditModifierData", /* structSize */ sizeof(WeightVGEditModifierData), /* type */ eModifierTypeType_Nonconstructive, diff --git a/source/blender/modifiers/intern/MOD_weightvgmix.c b/source/blender/modifiers/intern/MOD_weightvgmix.c index 97857644c35..8bfc56fc18f 100644 --- a/source/blender/modifiers/intern/MOD_weightvgmix.c +++ b/source/blender/modifiers/intern/MOD_weightvgmix.c @@ -438,7 +438,7 @@ static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob, ModifierTypeInfo modifierType_WeightVGMix = { - /* name */ "WeightVGMix", + /* name */ "VertexWeightMix", /* structName */ "WeightVGMixModifierData", /* structSize */ sizeof(WeightVGMixModifierData), /* type */ eModifierTypeType_Nonconstructive, diff --git a/source/blender/modifiers/intern/MOD_weightvgproximity.c b/source/blender/modifiers/intern/MOD_weightvgproximity.c index 55f0102bef3..ffb783f8adc 100644 --- a/source/blender/modifiers/intern/MOD_weightvgproximity.c +++ b/source/blender/modifiers/intern/MOD_weightvgproximity.c @@ -220,7 +220,7 @@ static void initData(ModifierData *md) wmd->proximity_mode = MOD_WVG_PROXIMITY_OBJECT; wmd->proximity_flags = MOD_WVG_PROXIMITY_GEOM_VERTS; - wmd->mapping_mode = MOD_WVG_MAPPING_NONE; + wmd->falloff_type = MOD_WVG_MAPPING_NONE; wmd->mask_constant = 1.0f; wmd->mask_tex_use_channel = MOD_WVG_MASK_TEX_USE_INT; /* Use intensity by default. */ @@ -238,7 +238,7 @@ static void copyData(ModifierData *md, ModifierData *target) twmd->proximity_flags = wmd->proximity_flags; twmd->proximity_ob_target = wmd->proximity_ob_target; - twmd->mapping_mode = wmd->mapping_mode; + twmd->falloff_type = wmd->falloff_type; twmd->mask_constant = wmd->mask_constant; BLI_strncpy(twmd->mask_defgrp_name, wmd->mask_defgrp_name, sizeof(twmd->mask_defgrp_name)); @@ -498,7 +498,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der wmd->mask_tex_mapping, wmd->mask_tex_map_obj, wmd->mask_tex_uvlayer_name); /* Map distances to weights. */ - do_map(org_w, numIdx, wmd->min_dist, wmd->max_dist, wmd->mapping_mode); + do_map(org_w, numIdx, wmd->min_dist, wmd->max_dist, wmd->falloff_type); /* Update vgroup. Note we never add nor remove vertices from vgroup here. */ weightvg_update_vg(dvert, defgrp_idx, numIdx, indices, org_w, 0, 0.0f, 0, 0.0f); @@ -522,7 +522,7 @@ static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob, ModifierTypeInfo modifierType_WeightVGProximity = { - /* name */ "WeightVGProximity", + /* name */ "VertexWeightProximity", /* structName */ "WeightVGProximityModifierData", /* structSize */ sizeof(WeightVGProximityModifierData), /* type */ eModifierTypeType_Nonconstructive, From beb6ac217b687052d89cfddc28e84cbbc3105b90 Mon Sep 17 00:00:00 2001 From: Lukas Toenne Date: Wed, 7 Sep 2011 10:09:24 +0000 Subject: [PATCH 122/182] Initialize the exec data in for composite with the node tree pointer. Doesn't matter now since composites are not executed in parallel, but just to be safe. --- source/blender/nodes/composite/node_composite_tree.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/nodes/composite/node_composite_tree.c b/source/blender/nodes/composite/node_composite_tree.c index 4fc5e23e26a..018ec0ad6b9 100644 --- a/source/blender/nodes/composite/node_composite_tree.c +++ b/source/blender/nodes/composite/node_composite_tree.c @@ -526,7 +526,7 @@ void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview) ListBase threads; ThreadData thdata; int totnode, curnode, rendering= 1, n; - bNodeTreeExec *exec= NULL; + bNodeTreeExec *exec= ntree->execdata; if(ntree==NULL) return; From 68582612aa26cdb37beb71ef2840b3306f6fcf3d Mon Sep 17 00:00:00 2001 From: Lukas Toenne Date: Wed, 7 Sep 2011 10:26:22 +0000 Subject: [PATCH 123/182] Code for setting/getting/freeing executable nodes in compositor was still using the plain nodetree->nodes list, which is not dependency sorted any more. This caused missing updates for viewers and other nodes. Instead this code now uses the execution data generated before, which has a correctly sorted list of bNodeExecData. --- .../nodes/composite/node_composite_tree.c | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/source/blender/nodes/composite/node_composite_tree.c b/source/blender/nodes/composite/node_composite_tree.c index 018ec0ad6b9..9593e61beb6 100644 --- a/source/blender/nodes/composite/node_composite_tree.c +++ b/source/blender/nodes/composite/node_composite_tree.c @@ -341,15 +341,15 @@ static void *exec_composite_node(void *nodeexec_v) } /* return total of executable nodes, for timecursor */ -static int setExecutableNodes(bNodeTree *ntree, ThreadData *thd) +static int setExecutableNodes(bNodeTreeExec *exec, ThreadData *thd) { + bNodeTree *ntree = exec->nodetree; bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */ bNodeStack *nsout[MAX_SOCKET]; /* arbitrary... watch this */ + bNodeExec *nodeexec; bNode *node; bNodeSocket *sock; - int totnode= 0, group_edit= 0; - - /* note; do not add a dependency sort here, the stack was created already */ + int n, totnode= 0, group_edit= 0; /* if we are in group edit, viewer nodes get skipped when group has viewer */ for(node= ntree->nodes.first; node; node= node->next) @@ -357,8 +357,10 @@ static int setExecutableNodes(bNodeTree *ntree, ThreadData *thd) if(ntreeHasType((bNodeTree *)node->id, CMP_NODE_VIEWER)) group_edit= 1; - for(node= ntree->nodes.first; node; node= node->next) { + /* NB: using the exec data list here to have valid dependency sort */ + for(n=0, nodeexec=exec->nodeexec; n < exec->totnodes; ++n, ++nodeexec) { int a; + node = nodeexec->node; node_get_stack(node, thd->stack, nsin, nsout); @@ -422,7 +424,8 @@ static int setExecutableNodes(bNodeTree *ntree, ThreadData *thd) /* last step: set the stack values for only-value nodes */ /* just does all now, compared to a full buffer exec this is nothing */ if(totnode) { - for(node= ntree->nodes.first; node; node= node->next) { + for(n=0, nodeexec=exec->nodeexec; n < exec->totnodes; ++n, ++nodeexec) { + node = nodeexec->node; if(node->need_exec==0 && node_only_value(node)) { if(node->typeinfo->execfunc) { node_get_stack(node, thd->stack, nsin, nsout); @@ -436,14 +439,17 @@ static int setExecutableNodes(bNodeTree *ntree, ThreadData *thd) } /* while executing tree, free buffers from nodes that are not needed anymore */ -static void freeExecutableNode(bNodeTree *ntree, bNodeTreeExec *exec) +static void freeExecutableNode(bNodeTreeExec *exec) { /* node outputs can be freed when: - not a render result or image node - when node outputs go to nodes all being set NODE_FINISHED */ + bNodeTree *ntree = exec->nodetree; + bNodeExec *nodeexec; bNode *node; bNodeSocket *sock; + int n; /* set exec flag for finished nodes that might need freed */ for(node= ntree->nodes.first; node; node= node->next) { @@ -451,8 +457,11 @@ static void freeExecutableNode(bNodeTree *ntree, bNodeTreeExec *exec) if(node->exec & NODE_FINISHED) node->exec |= NODE_FREEBUFS; } - /* clear this flag for input links that are not done yet */ - for(node= ntree->nodes.first; node; node= node->next) { + /* clear this flag for input links that are not done yet. + * Using the exec data for valid dependency sort. + */ + for(n=0, nodeexec=exec->nodeexec; n < exec->totnodes; ++n, ++nodeexec) { + node = nodeexec->node; if((node->exec & NODE_FINISHED)==0) { for(sock= node->inputs.first; sock; sock= sock->next) if(sock->link) @@ -551,7 +560,7 @@ void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview) BLI_srandom(rd->cfra); /* sets need_exec tags in nodes */ - curnode = totnode= setExecutableNodes(ntree, &thdata); + curnode = totnode= setExecutableNodes(exec, &thdata); BLI_init_threads(&threads, exec_composite_node, rd->threads); @@ -597,7 +606,7 @@ void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview) /* freeing unused buffers */ if(rd->scemode & R_COMP_FREE) - freeExecutableNode(ntree, exec); + freeExecutableNode(exec); } } else rendering= 1; From f9ed529bc95ba06c556fd1ac88d3bf8b03f88ff4 Mon Sep 17 00:00:00 2001 From: Nathan Letwory Date: Wed, 7 Sep 2011 10:33:46 +0000 Subject: [PATCH 124/182] Apply patch [#28415] 3d mouse orbit mode individual axes enhancement Submitted by Rainer Wahler This patch enables individual axis inversion in trackball mode. --- .../scripts/startup/bl_ui/space_userpref.py | 13 +++++- .../editors/space_view3d/view3d_edit.c | 46 +++++++++++++++---- source/blender/makesdna/DNA_userdef_types.h | 6 +++ source/blender/makesrna/intern/rna_userdef.c | 30 ++++++++++++ 4 files changed, 84 insertions(+), 11 deletions(-) diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py index 13edc3471d2..67aca5eb4c1 100644 --- a/release/scripts/startup/bl_ui/space_userpref.py +++ b/release/scripts/startup/bl_ui/space_userpref.py @@ -773,7 +773,18 @@ class USERPREF_MT_ndof_settings(Menu): layout.separator() layout.label(text="orbit options") - layout.prop(input_prefs, "ndof_orbit_invert_axes") + if input_prefs.view_rotate_method == 'TRACKBALL': + layout.prop(input_prefs, "ndof_roll_invert_axis") + layout.prop(input_prefs, "ndof_tilt_invert_axis") + layout.prop(input_prefs, "ndof_rotate_invert_axis") + else: + layout.prop(input_prefs, "ndof_orbit_invert_axes") + + layout.separator() + layout.label(text="pan options") + layout.prop(input_prefs, "ndof_panx_invert_axis") + layout.prop(input_prefs, "ndof_pany_invert_axis") + layout.prop(input_prefs, "ndof_panz_invert_axis") layout.separator() layout.label(text="fly options") diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c index 19e8d42db2d..761de836cfb 100644 --- a/source/blender/editors/space_view3d/view3d_edit.c +++ b/source/blender/editors/space_view3d/view3d_edit.c @@ -1017,18 +1017,26 @@ static int ndof_orbit_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *event if (has_rotation) { - const int invert = U.ndof_flag & NDOF_ORBIT_INVERT_AXES; - rv3d->view = RV3D_VIEW_USER; if (U.flag & USER_TRACKBALL) { + const int invert_roll = U.ndof_flag & NDOF_ROLL_INVERT_AXIS; + const int invert_tilt = U.ndof_flag & NDOF_TILT_INVERT_AXIS; + const int invert_rot = U.ndof_flag & NDOF_ROTATE_INVERT_AXIS; + float rot[4]; float axis[3]; float angle = rot_sensitivity * ndof_to_axis_angle(ndof, axis); - - if (invert) - angle = -angle; - + + if (invert_roll) + axis[2] = -axis[2]; + + if (invert_tilt) + axis[0] = -axis[0]; + + if (invert_rot) + axis[1] = -axis[1]; + // transform rotation axis from view to world coordinates mul_qt_v3(view_inv, axis); @@ -1042,6 +1050,8 @@ static int ndof_orbit_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *event mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, rot); } else { /* turntable view code by John Aughey, adapted for 3D mouse by [mce] */ + const int invert = U.ndof_flag & NDOF_ORBIT_INVERT_AXES; + float angle, rot[4]; float xvec[3] = {1,0,0}; @@ -1143,10 +1153,26 @@ static int ndof_pan_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *event) const float vertical_sensitivity = 0.4f; const float lateral_sensitivity = 0.6f; - float pan_vec[3] = {lateral_sensitivity * ndof->tvec[0], - vertical_sensitivity * ndof->tvec[1], - forward_sensitivity * ndof->tvec[2] - }; + const int invert_panx = U.ndof_flag & NDOF_PANX_INVERT_AXIS; + const int invert_pany = U.ndof_flag & NDOF_PANY_INVERT_AXIS; + const int invert_panz = U.ndof_flag & NDOF_PANZ_INVERT_AXIS; + + float pan_vec[3]; + + if (invert_panx) + pan_vec[0] = -lateral_sensitivity * ndof->tvec[0]; + else + pan_vec[0] = lateral_sensitivity * ndof->tvec[0]; + + if (invert_panz) + pan_vec[1] = -vertical_sensitivity * ndof->tvec[1]; + else + pan_vec[1] = vertical_sensitivity * ndof->tvec[1]; + + if (invert_pany) + pan_vec[2] = -forward_sensitivity * ndof->tvec[2]; + else + pan_vec[2] = forward_sensitivity * ndof->tvec[2]; mul_v3_fl(pan_vec, speed * dt); #endif diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h index 43dc532d4f6..d3ac09dc812 100644 --- a/source/blender/makesdna/DNA_userdef_types.h +++ b/source/blender/makesdna/DNA_userdef_types.h @@ -607,6 +607,12 @@ extern UserDef U; /* from blenkernel blender.c */ /* zoom is up/down if this flag is set (otherwise forward/backward) */ #define NDOF_ZOOM_UPDOWN (1 << 7) #define NDOF_ZOOM_INVERT (1 << 8) +#define NDOF_ROTATE_INVERT_AXIS (1 << 9) +#define NDOF_TILT_INVERT_AXIS (1 << 10) +#define NDOF_ROLL_INVERT_AXIS (1 << 11) +#define NDOF_PANX_INVERT_AXIS (1 << 12) +#define NDOF_PANY_INVERT_AXIS (1 << 13) +#define NDOF_PANZ_INVERT_AXIS (1 << 14) #ifdef __cplusplus diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c index 7d0502f1be9..66c4e7245c4 100644 --- a/source/blender/makesrna/intern/rna_userdef.c +++ b/source/blender/makesrna/intern/rna_userdef.c @@ -2791,6 +2791,36 @@ static void rna_def_userdef_input(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Invert Axes", "Toggle between moving the viewpoint or moving the scene being viewed"); /* in 3Dx docs, this is called 'object mode' vs. 'target camera mode' */ + /* 3D view: roll */ + prop= RNA_def_property(srna, "ndof_roll_invert_axis", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "ndof_flag", NDOF_ROLL_INVERT_AXIS); + RNA_def_property_ui_text(prop, "Invert roll Axis", "Invert roll axis"); + + /* 3D view: tilt */ + prop= RNA_def_property(srna, "ndof_tilt_invert_axis", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "ndof_flag", NDOF_TILT_INVERT_AXIS); + RNA_def_property_ui_text(prop, "Invert tilt Axis", "Invert tilt axis"); + + /* 3D view: rotate */ + prop= RNA_def_property(srna, "ndof_rotate_invert_axis", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "ndof_flag", NDOF_ROTATE_INVERT_AXIS); + RNA_def_property_ui_text(prop, "Invert rotation Axis", "Invert rotation axis"); + + /* 3D view: pan x */ + prop= RNA_def_property(srna, "ndof_panx_invert_axis", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "ndof_flag", NDOF_PANX_INVERT_AXIS); + RNA_def_property_ui_text(prop, "Invert x Axis", "Invert x axis"); + + /* 3D view: pan y */ + prop= RNA_def_property(srna, "ndof_pany_invert_axis", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "ndof_flag", NDOF_PANY_INVERT_AXIS); + RNA_def_property_ui_text(prop, "Invert y Axis", "Invert y axis"); + + /* 3D view: pan z */ + prop= RNA_def_property(srna, "ndof_panz_invert_axis", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "ndof_flag", NDOF_PANZ_INVERT_AXIS); + RNA_def_property_ui_text(prop, "Invert z Axis", "Invert z axis"); + /* 3D view: fly */ prop= RNA_def_property(srna, "ndof_lock_horizon", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "ndof_flag", NDOF_LOCK_HORIZON); From fcbf3041a9eb6fee725318df861015ebbdb8d1be Mon Sep 17 00:00:00 2001 From: Lukas Toenne Date: Wed, 7 Sep 2011 10:48:33 +0000 Subject: [PATCH 125/182] Fixed offset for socket remove buttons ('x') in node groups. --- source/blender/editors/space_node/drawnode.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index 0d2ec7c646f..dd14441a89b 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -639,7 +639,7 @@ static void draw_group_socket(const bContext *C, SpaceNode *snode, bNodeTree *nt float colw= 0.6f*node_group_frame; float col1= 6 - node_group_frame; float col2= col1 + colw+6; - float col3= node_group_frame - arrowbutw - 6; + float col3= - arrowbutw - 6; /* layout stuff for buttons on group right frame */ float cor1= 6; float cor2= cor1 + arrowbutw + 6; @@ -713,7 +713,7 @@ static void draw_group_socket(const bContext *C, SpaceNode *snode, bNodeTree *nt uiBlockSetDirection(gnode->block, 0); /* remove button */ - offset = (in_out==SOCK_IN ? col3 : col1); + offset = (in_out==SOCK_IN ? col3 : cor1); uiBlockSetEmboss(gnode->block, UI_EMBOSSN); bt = uiDefIconButO(gnode->block, BUT, "NODE_OT_group_socket_remove", 0, ICON_X, gsock->locx+offset, gsock->locy-0.5f*arrowbutw, arrowbutw, arrowbutw, ""); From 68693b453240d10104a54bbd527918850b4f7b7f Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 7 Sep 2011 11:53:16 +0000 Subject: [PATCH 126/182] Fix #28541: crash with operator reports in some cases, caused by my recent fix for missing reports, thanks to Sergey for tracking this down. --- source/blender/windowmanager/intern/wm_event_system.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 8861f128c4b..518ebeafc80 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -441,12 +441,17 @@ static void wm_operator_reports(bContext *C, wmOperator *op, int retval, int pop if(op->reports->list.first) { /* FIXME, temp setting window, see other call to uiPupMenuReports for why */ wmWindow *win_prev= CTX_wm_window(C); + ScrArea *area_prev= CTX_wm_area(C); + ARegion *ar_prev= CTX_wm_region(C); + if(win_prev==NULL) CTX_wm_window_set(C, CTX_wm_manager(C)->windows.first); uiPupMenuReports(C, op->reports); CTX_wm_window_set(C, win_prev); + CTX_wm_area_set(C, area_prev); + CTX_wm_region_set(C, ar_prev); } } @@ -1394,6 +1399,9 @@ static int wm_handler_fileselect_call(bContext *C, ListBase *handlers, wmEventHa * only have because lib linking errors need to be seen by users :( * it can be removed without breaking anything but then no linking errors - campbell */ wmWindow *win_prev= CTX_wm_window(C); + ScrArea *area_prev= CTX_wm_area(C); + ARegion *ar_prev= CTX_wm_region(C); + if(win_prev==NULL) CTX_wm_window_set(C, CTX_wm_manager(C)->windows.first); @@ -1405,6 +1413,8 @@ static int wm_handler_fileselect_call(bContext *C, ListBase *handlers, wmEventHa BLI_movelisttolist(&CTX_wm_reports(C)->list, &handler->op->reports->list); CTX_wm_window_set(C, win_prev); + CTX_wm_area_set(C, area_prev); + CTX_wm_region_set(C, ar_prev); } WM_operator_free(handler->op); From 7db716599cd939cee4cc574e02ecd1468bb40b94 Mon Sep 17 00:00:00 2001 From: Lukas Toenne Date: Wed, 7 Sep 2011 12:46:30 +0000 Subject: [PATCH 127/182] Fix for crash when duplicating image or render layer nodes. These nodes use cached buffers (in sock->cache), which need to be cleared when duplicating the node, otherwise the buffer will be freed twice. --- source/blender/blenkernel/intern/node.c | 10 ++++++++++ source/blender/nodes/composite/node_composite_tree.c | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index 292f38b9472..d40b030c470 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -398,6 +398,11 @@ bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node) sock->stack_index= 0; sock->default_value = (oldsock->default_value ? MEM_dupallocN(oldsock->default_value) : NULL); + + /* XXX some compositor node (e.g. image, render layers) still store + * some persistent buffer data here, need to clear this to avoid dangling pointers. + */ + sock->cache = NULL; } BLI_duplicatelist(&nnode->outputs, &node->outputs); @@ -407,6 +412,11 @@ bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node) sock->stack_index= 0; sock->default_value = (oldsock->default_value ? MEM_dupallocN(oldsock->default_value) : NULL); + + /* XXX some compositor node (e.g. image, render layers) still store + * some persistent buffer data here, need to clear this to avoid dangling pointers. + */ + sock->cache = NULL; } /* don't increase node->id users, freenode doesn't decrement either */ diff --git a/source/blender/nodes/composite/node_composite_tree.c b/source/blender/nodes/composite/node_composite_tree.c index 9593e61beb6..01e46ed3df9 100644 --- a/source/blender/nodes/composite/node_composite_tree.c +++ b/source/blender/nodes/composite/node_composite_tree.c @@ -362,7 +362,7 @@ static int setExecutableNodes(bNodeTreeExec *exec, ThreadData *thd) int a; node = nodeexec->node; - node_get_stack(node, thd->stack, nsin, nsout); + node_get_stack(node, exec->stack, nsin, nsout); /* test the outputs */ /* skip value-only nodes (should be in type!) */ @@ -428,7 +428,7 @@ static int setExecutableNodes(bNodeTreeExec *exec, ThreadData *thd) node = nodeexec->node; if(node->need_exec==0 && node_only_value(node)) { if(node->typeinfo->execfunc) { - node_get_stack(node, thd->stack, nsin, nsout); + node_get_stack(node, exec->stack, nsin, nsout); node->typeinfo->execfunc(thd->rd, node, nsin, nsout); } } From 3f565fc2120f69b8ddeed077461b522103be2f3b Mon Sep 17 00:00:00 2001 From: Lukas Toenne Date: Wed, 7 Sep 2011 13:30:16 +0000 Subject: [PATCH 128/182] Updating render layer and image output sockets was not working due to changes in snode_set_context. Before the r39941 this used a hack to 'test for first drawing', but since the snode->nodetree was set to NULL each time at the start of that function the condition would always evaluate true anyway. Simply removed that check to restore previous behavior. --- source/blender/editors/space_node/node_edit.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index b5633d50997..43f8a071597 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -447,9 +447,8 @@ void snode_set_context(SpaceNode *snode, Scene *scene) else if(snode->treetype==NTREE_COMPOSIT) { snode->id= &scene->id; - /* bit clumsy but reliable way to see if we draw first time */ - if(snode->nodetree==NULL) - ntreeCompositForceHidden(scene->nodetree, scene); + /* update output sockets based on available layers */ + ntreeCompositForceHidden(scene->nodetree, scene); } else if(snode->treetype==NTREE_TEXTURE) { Tex *tx= NULL; From 79836275006ded6408ff7e15e1ac26cf906e6663 Mon Sep 17 00:00:00 2001 From: Jens Verwiebe Date: Wed, 7 Sep 2011 14:44:52 +0000 Subject: [PATCH 129/182] OSX: revert default compile to i386, for it breakes QTKit-condition for some unknown reason --- build_files/scons/config/darwin-config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_files/scons/config/darwin-config.py b/build_files/scons/config/darwin-config.py index 102ec73a4e3..29d2b39323e 100644 --- a/build_files/scons/config/darwin-config.py +++ b/build_files/scons/config/darwin-config.py @@ -14,7 +14,7 @@ USE_SDK=True ################### Cocoa & architecture settings ################## ############################################################################# WITH_GHOST_COCOA=True -MACOSX_ARCHITECTURE = 'x86_64' # valid archs: ppc, i386, ppc64, x86_64 +MACOSX_ARCHITECTURE = 'i386' # valid archs: ppc, i386, ppc64, x86_64 cmd = 'uname -p' From 08a7a680ac855fcbec009a4c0c693917e6e74353 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 7 Sep 2011 15:09:03 +0000 Subject: [PATCH 130/182] Fix #28551: Select similar by normals ignores z component of normal angles Select grouped used angle_v2v2 instead of angle_v3v3. --- source/blender/editors/mesh/editmesh_mods.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/blender/editors/mesh/editmesh_mods.c b/source/blender/editors/mesh/editmesh_mods.c index eb6854d2548..612d1b18426 100644 --- a/source/blender/editors/mesh/editmesh_mods.c +++ b/source/blender/editors/mesh/editmesh_mods.c @@ -827,7 +827,7 @@ static int similar_face_select__internal(EditMesh *em, int mode, float thresh) float angle; for(efa= em->faces.first; efa; efa= efa->next) { if (!(efa->f & SELECT) && !efa->h) { - angle= RAD2DEGF(angle_v2v2(base_efa->n, efa->n)); + angle= RAD2DEGF(angle_v3v3(base_efa->n, efa->n)); if (angle/180.0f<=thresh) { EM_select_face(efa, 1); selcount++; @@ -842,7 +842,7 @@ static int similar_face_select__internal(EditMesh *em, int mode, float thresh) base_dot= dot_v3v3(base_efa->cent, base_efa->n); for(efa= em->faces.first; efa; efa= efa->next) { if (!(efa->f & SELECT) && !efa->h) { - angle= RAD2DEGF(angle_v2v2(base_efa->n, efa->n)); + angle= RAD2DEGF(angle_v3v3(base_efa->n, efa->n)); if (angle/180.0f<=thresh) { dot=dot_v3v3(efa->cent, base_efa->n); if (fabsf(base_dot-dot) <= thresh) { @@ -989,7 +989,7 @@ static int similar_edge_select__internal(EditMesh *em, int mode, float thresh) for(eed= em->edges.first; eed; eed= eed->next) { if (!(eed->f & SELECT) && !eed->h) { sub_v3_v3v3(dir, eed->v1->co, eed->v2->co); - angle= RAD2DEGF(angle_v2v2(base_dir, dir)); + angle= RAD2DEGF(angle_v3v3(base_dir, dir)); if (angle>90.0f) /* use the smallest angle between the edges */ angle= fabsf(angle-180.0f); @@ -1159,7 +1159,7 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op) float angle; for(eve= em->verts.first; eve; eve= eve->next) { if (!(eve->f & SELECT) && !eve->h) { - angle= RAD2DEGF(angle_v2v2(base_eve->no, eve->no)); + angle= RAD2DEGF(angle_v3v3(base_eve->no, eve->no)); if (angle/180.0f<=thresh) { eve->f |= SELECT; selcount++; From c00eba13e0303efeb2c0e4846eec5376661c92be Mon Sep 17 00:00:00 2001 From: Lukas Toenne Date: Wed, 7 Sep 2011 15:11:36 +0000 Subject: [PATCH 131/182] Node comparison function for sort order did not take parent selection into account. --- source/blender/editors/space_node/node_edit.c | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index 43f8a071597..bb85a0dbe3a 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -607,28 +607,45 @@ void ED_node_set_active(Main *bmain, bNodeTree *ntree, bNode *node) static int compare_nodes(bNode *a, bNode *b) { bNode *parent; + /* These tell if either the node or any of the parent nodes is selected. + * A selected parent means an unselected node is also in foreground! + */ + int a_select=(a->flag & NODE_SELECT), b_select=(b->flag & NODE_SELECT); + int a_active=(a->flag & NODE_ACTIVE), b_active=(b->flag & NODE_ACTIVE); /* if one is an ancestor of the other */ /* XXX there might be a better sorting algorithm for stable topological sort, this is O(n^2) worst case */ for (parent = a->parent; parent; parent=parent->parent) { + /* if b is an ancestor, it is always behind a */ if (parent==b) return 1; + /* any selected ancestor moves the node forward */ + if (parent->flag & NODE_ACTIVE) + a_active = 1; + if (parent->flag & NODE_SELECT) + a_select = 1; } for (parent = b->parent; parent; parent=parent->parent) { + /* if a is an ancestor, it is always behind b */ if (parent==a) return 0; + /* any selected ancestor moves the node forward */ + if (parent->flag & NODE_ACTIVE) + b_active = 1; + if (parent->flag & NODE_SELECT) + b_select = 1; } /* if one of the nodes is in the background and the other not */ - if ((a->flag & NODE_BACKGROUND) && !(b->typeinfo->flag & NODE_BACKGROUND)) + if ((a->flag & NODE_BACKGROUND) && !(b->flag & NODE_BACKGROUND)) return 0; - else if (!(a->flag & NODE_BACKGROUND) && (b->typeinfo->flag & NODE_BACKGROUND)) + else if (!(a->flag & NODE_BACKGROUND) && (b->flag & NODE_BACKGROUND)) return 1; /* if one has a higher selection state (active > selected > nothing) */ - if (!(b->flag & NODE_ACTIVE) && (a->flag & NODE_ACTIVE)) + if (!b_active && a_active) return 1; - else if (!(b->flag & NODE_SELECT) && ((a->flag & NODE_ACTIVE) || (a->flag & NODE_SELECT))) + else if (!b_select && (a_active || a_select)) return 1; return 0; From a1277508ccf6dc47765608f415284e1089685d5a Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 7 Sep 2011 15:16:30 +0000 Subject: [PATCH 132/182] Commiting patch #28552 which was posted by Andrew Wiggin as fix for #28551 Didn't notice this patch when was fixing bug myself, but it fixes some more suspecious usages of angle_v2v2 instead of angle_v3v3. --- source/blender/editors/mesh/editmesh_tools.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c index 9ff2923f733..44e00ed8181 100644 --- a/source/blender/editors/mesh/editmesh_tools.c +++ b/source/blender/editors/mesh/editmesh_tools.c @@ -3234,13 +3234,13 @@ static float measure_facepair(EditVert *v1, EditVert *v2, EditVert *v3, EditVert normal_tri_v3( noA2,v1->co, v3->co, v4->co); if(noA1[0] == noA2[0] && noA1[1] == noA2[1] && noA1[2] == noA2[2]) normalADiff = 0.0; - else normalADiff = RAD2DEGF(angle_v2v2(noA1, noA2)); + else normalADiff = RAD2DEGF(angle_v3v3(noA1, noA2)); //if(!normalADiff) normalADiff = 179; normal_tri_v3( noB1,v2->co, v3->co, v4->co); normal_tri_v3( noB2,v4->co, v1->co, v2->co); if(noB1[0] == noB2[0] && noB1[1] == noB2[1] && noB1[2] == noB2[2]) normalBDiff = 0.0; - else normalBDiff = RAD2DEGF(angle_v2v2(noB1, noB2)); + else normalBDiff = RAD2DEGF(angle_v3v3(noB1, noB2)); //if(!normalBDiff) normalBDiff = 179; measure += (normalADiff/360) + (normalBDiff/360); @@ -3255,10 +3255,10 @@ static float measure_facepair(EditVert *v1, EditVert *v2, EditVert *v3, EditVert diff = 0.0; diff = ( - fabsf(RAD2DEGF(angle_v2v2(edgeVec1, edgeVec2)) - 90) + - fabsf(RAD2DEGF(angle_v2v2(edgeVec2, edgeVec3)) - 90) + - fabsf(RAD2DEGF(angle_v2v2(edgeVec3, edgeVec4)) - 90) + - fabsf(RAD2DEGF(angle_v2v2(edgeVec4, edgeVec1)) - 90)) / 360; + fabsf(RAD2DEGF(angle_v3v3(edgeVec1, edgeVec2)) - 90) + + fabsf(RAD2DEGF(angle_v3v3(edgeVec2, edgeVec3)) - 90) + + fabsf(RAD2DEGF(angle_v3v3(edgeVec3, edgeVec4)) - 90) + + fabsf(RAD2DEGF(angle_v3v3(edgeVec4, edgeVec1)) - 90)) / 360; if(!diff) return 0.0; measure += diff; @@ -4869,7 +4869,7 @@ void mesh_set_face_flags(EditMesh *em, short mode) /* helper to find edge for edge_rip */ static float mesh_rip_edgedist(ARegion *ar, float mat[][4], float *co1, float *co2, const int mval[2]) { - float vec1[3], vec2[3], mvalf[2]; + float vec1[2], vec2[2], mvalf[2]; ED_view3d_project_float(ar, co1, vec1, mat); ED_view3d_project_float(ar, co2, vec2, mat); From 3dc0ee19c44c33d15c7f696f313f5703b1eb32bf Mon Sep 17 00:00:00 2001 From: Nathan Letwory Date: Wed, 7 Sep 2011 18:23:30 +0000 Subject: [PATCH 133/182] Introduce struct for export settings in COLLADA export code. This will make it easier to add new options without having to change function signatures all over the place. --- source/blender/collada/ArmatureExporter.cpp | 6 ++-- source/blender/collada/ArmatureExporter.h | 33 ++++------------- source/blender/collada/CMakeLists.txt | 2 ++ source/blender/collada/CameraExporter.cpp | 6 ++-- source/blender/collada/CameraExporter.h | 8 +++-- source/blender/collada/DocumentExporter.cpp | 39 +++++++++++---------- source/blender/collada/DocumentExporter.h | 7 +++- source/blender/collada/EffectExporter.cpp | 6 ++-- source/blender/collada/EffectExporter.h | 8 +++-- source/blender/collada/ExportSettings.cpp | 29 +++++++++++++++ source/blender/collada/ExportSettings.h | 39 +++++++++++++++++++++ source/blender/collada/GeometryExporter.cpp | 6 ++-- source/blender/collada/GeometryExporter.h | 8 +++-- source/blender/collada/ImageExporter.cpp | 8 ++--- source/blender/collada/ImageExporter.h | 10 +++--- source/blender/collada/LightExporter.cpp | 6 ++-- source/blender/collada/LightExporter.h | 7 ++-- source/blender/collada/MaterialExporter.cpp | 6 ++-- source/blender/collada/MaterialExporter.h | 6 ++-- source/blender/collada/SceneExporter.cpp | 12 +++---- source/blender/collada/SceneExporter.h | 12 ++++--- source/blender/collada/collada.cpp | 9 +++-- 22 files changed, 179 insertions(+), 94 deletions(-) create mode 100644 source/blender/collada/ExportSettings.cpp create mode 100644 source/blender/collada/ExportSettings.h diff --git a/source/blender/collada/ArmatureExporter.cpp b/source/blender/collada/ArmatureExporter.cpp index de01c000373..431c67833f1 100644 --- a/source/blender/collada/ArmatureExporter.cpp +++ b/source/blender/collada/ArmatureExporter.cpp @@ -49,7 +49,7 @@ // XXX exporter writes wrong data for shared armatures. A separate // controller should be written for each armature-mesh binding how do // we make controller ids then? -ArmatureExporter::ArmatureExporter(COLLADASW::StreamWriter *sw) : COLLADASW::LibraryControllers(sw) {} +ArmatureExporter::ArmatureExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings) : COLLADASW::LibraryControllers(sw), export_settings(export_settings) {} // write bone nodes void ArmatureExporter::add_armature_bones(Object *ob_arm, Scene *sce) @@ -90,14 +90,14 @@ void ArmatureExporter::add_instance_controller(Object *ob) ins.add(); } -void ArmatureExporter::export_controllers(Scene *sce, bool export_selected) +void ArmatureExporter::export_controllers(Scene *sce) { scene = sce; openLibrary(); GeometryFunctor gf; - gf.forEachMeshObjectInScene(sce, *this, export_selected); + gf.forEachMeshObjectInScene(sce, *this, this->export_settings->selected); closeLibrary(); } diff --git a/source/blender/collada/ArmatureExporter.h b/source/blender/collada/ArmatureExporter.h index b3441c797e8..554a8a7cfe6 100644 --- a/source/blender/collada/ArmatureExporter.h +++ b/source/blender/collada/ArmatureExporter.h @@ -47,16 +47,15 @@ #include "TransformWriter.h" #include "InstanceWriter.h" +#include "ExportSettings.h" + // XXX exporter writes wrong data for shared armatures. A separate // controller should be written for each armature-mesh binding how do // we make controller ids then? class ArmatureExporter: public COLLADASW::LibraryControllers, protected TransformWriter, protected InstanceWriter { -private: - Scene *scene; - public: - ArmatureExporter(COLLADASW::StreamWriter *sw); + ArmatureExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings); // write bone nodes void add_armature_bones(Object *ob_arm, Scene *sce); @@ -65,13 +64,14 @@ public: void add_instance_controller(Object *ob); - void export_controllers(Scene *sce, bool export_selected); + void export_controllers(Scene *sce); void operator()(Object *ob); private: - + Scene *scene; UnitConverter converter; + const ExportSettings *export_settings; #if 0 std::vector written_armatures; @@ -119,25 +119,4 @@ private: Object *ob_arm, ListBase *defbase); }; -/* -struct GeometryFunctor { - // f should have - // void operator()(Object* ob) - template - void forEachMeshObjectInScene(Scene *sce, Functor &f) - { - - Base *base= (Base*) sce->base.first; - while(base) { - Object *ob = base->object; - - if (ob->type == OB_MESH && ob->data) { - f(ob); - } - base= base->next; - - } - } -};*/ - #endif diff --git a/source/blender/collada/CMakeLists.txt b/source/blender/collada/CMakeLists.txt index cc7229383e3..2ee34091fc9 100644 --- a/source/blender/collada/CMakeLists.txt +++ b/source/blender/collada/CMakeLists.txt @@ -52,6 +52,7 @@ set(SRC DocumentImporter.cpp EffectExporter.cpp ErrorHandler.cpp + ExportSettings.cpp ExtraHandler.cpp ExtraTags.cpp GeometryExporter.cpp @@ -77,6 +78,7 @@ set(SRC DocumentImporter.h EffectExporter.h ErrorHandler.h + ExportSettings.h ExtraHandler.h ExtraTags.h GeometryExporter.h diff --git a/source/blender/collada/CameraExporter.cpp b/source/blender/collada/CameraExporter.cpp index a935f45c403..542409072f1 100644 --- a/source/blender/collada/CameraExporter.cpp +++ b/source/blender/collada/CameraExporter.cpp @@ -39,7 +39,7 @@ #include "collada_internal.h" -CamerasExporter::CamerasExporter(COLLADASW::StreamWriter *sw): COLLADASW::LibraryCameras(sw){} +CamerasExporter::CamerasExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings): COLLADASW::LibraryCameras(sw), export_settings(export_settings) {} template void forEachCameraObjectInScene(Scene *sce, Functor &f, bool export_selected) @@ -56,11 +56,11 @@ void forEachCameraObjectInScene(Scene *sce, Functor &f, bool export_selected) } } -void CamerasExporter::exportCameras(Scene *sce, bool export_selected) +void CamerasExporter::exportCameras(Scene *sce) { openLibrary(); - forEachCameraObjectInScene(sce, *this, export_selected); + forEachCameraObjectInScene(sce, *this, this->export_settings->selected); closeLibrary(); } diff --git a/source/blender/collada/CameraExporter.h b/source/blender/collada/CameraExporter.h index 999a6ddd3e5..8d08fe23f80 100644 --- a/source/blender/collada/CameraExporter.h +++ b/source/blender/collada/CameraExporter.h @@ -36,12 +36,16 @@ #include "DNA_object_types.h" #include "DNA_scene_types.h" +#include "ExportSettings.h" + class CamerasExporter: COLLADASW::LibraryCameras { public: - CamerasExporter(COLLADASW::StreamWriter *sw); - void exportCameras(Scene *sce, bool export_selected); + CamerasExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings); + void exportCameras(Scene *sce); void operator()(Object *ob, Scene *sce); +private: + const ExportSettings *export_settings; }; #endif diff --git a/source/blender/collada/DocumentExporter.cpp b/source/blender/collada/DocumentExporter.cpp index 85f37d29f22..d562e51b922 100644 --- a/source/blender/collada/DocumentExporter.cpp +++ b/source/blender/collada/DocumentExporter.cpp @@ -110,6 +110,7 @@ extern char build_rev[]; #include "collada_internal.h" #include "DocumentExporter.h" +#include "ExportSettings.h" // can probably go after refactor is complete #include "InstanceWriter.h" @@ -145,11 +146,13 @@ char *bc_CustomData_get_active_layer_name(const CustomData *data, int type) return data->layers[layer_index].name; } +DocumentExporter::DocumentExporter(const ExportSettings *export_settings) : export_settings(export_settings) {} + // TODO: it would be better to instantiate animations rather than create a new one per object // COLLADA allows this through multiple s in . // For this to work, we need to know objects that use a certain action. -void DocumentExporter::exportCurrentScene(Scene *sce, const char* filename, bool selected) +void DocumentExporter::exportCurrentScene(Scene *sce) { PointerRNA sceneptr, unit_settings; PropertyRNA *system; /* unused , *scale; */ @@ -157,7 +160,7 @@ void DocumentExporter::exportCurrentScene(Scene *sce, const char* filename, bool clear_global_id_map(); COLLADABU::NativeString native_filename = - COLLADABU::NativeString(std::string(filename)); + COLLADABU::NativeString(std::string(this->export_settings->filepath)); COLLADASW::StreamWriter sw(native_filename); // open @@ -227,32 +230,32 @@ void DocumentExporter::exportCurrentScene(Scene *sce, const char* filename, bool // if(has_object_type(sce, OB_CAMERA)) { - CamerasExporter ce(&sw); - ce.exportCameras(sce, selected); + CamerasExporter ce(&sw, this->export_settings); + ce.exportCameras(sce); } // if(has_object_type(sce, OB_LAMP)) { - LightsExporter le(&sw); - le.exportLights(sce, selected); + LightsExporter le(&sw, this->export_settings); + le.exportLights(sce); } // - ImagesExporter ie(&sw, filename); - ie.exportImages(sce, selected); + ImagesExporter ie(&sw, this->export_settings); + ie.exportImages(sce); // - EffectsExporter ee(&sw); - ee.exportEffects(sce, selected); + EffectsExporter ee(&sw, this->export_settings); + ee.exportEffects(sce); // - MaterialsExporter me(&sw); - me.exportMaterials(sce, selected); + MaterialsExporter me(&sw, this->export_settings); + me.exportMaterials(sce); // if(has_object_type(sce, OB_MESH)) { - GeometryExporter ge(&sw); - ge.exportGeom(sce, selected); + GeometryExporter ge(&sw, this->export_settings); + ge.exportGeom(sce); } // @@ -260,14 +263,14 @@ void DocumentExporter::exportCurrentScene(Scene *sce, const char* filename, bool ae.exportAnimations(sce); // - ArmatureExporter arm_exporter(&sw); + ArmatureExporter arm_exporter(&sw, this->export_settings); if(has_object_type(sce, OB_ARMATURE)) { - arm_exporter.export_controllers(sce, selected); + arm_exporter.export_controllers(sce); } // - SceneExporter se(&sw, &arm_exporter); - se.exportScene(sce, selected); + SceneExporter se(&sw, &arm_exporter, this->export_settings); + se.exportScene(sce); // std::string scene_name(translate_id(id_name(sce))); diff --git a/source/blender/collada/DocumentExporter.h b/source/blender/collada/DocumentExporter.h index 923313c4ed9..83724505efa 100644 --- a/source/blender/collada/DocumentExporter.h +++ b/source/blender/collada/DocumentExporter.h @@ -29,13 +29,18 @@ #ifndef __DOCUMENTEXPORTER_H__ #define __DOCUMENTEXPORTER_H__ +#include "ExportSettings.h" + struct Scene; class DocumentExporter { public: - void exportCurrentScene(Scene *sce, const char* filename, bool selected); + DocumentExporter(const ExportSettings *export_settings); + void exportCurrentScene(Scene *sce); void exportScenes(const char* filename); +private: + const ExportSettings *export_settings; }; #endif diff --git a/source/blender/collada/EffectExporter.cpp b/source/blender/collada/EffectExporter.cpp index 355e384d000..ed37dada195 100644 --- a/source/blender/collada/EffectExporter.cpp +++ b/source/blender/collada/EffectExporter.cpp @@ -55,7 +55,7 @@ static std::string getActiveUVLayerName(Object *ob) return ""; } -EffectsExporter::EffectsExporter(COLLADASW::StreamWriter *sw) : COLLADASW::LibraryEffects(sw){} +EffectsExporter::EffectsExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings) : COLLADASW::LibraryEffects(sw), export_settings(export_settings) {} bool EffectsExporter::hasEffects(Scene *sce) { @@ -78,12 +78,12 @@ bool EffectsExporter::hasEffects(Scene *sce) return false; } -void EffectsExporter::exportEffects(Scene *sce, bool export_selected) +void EffectsExporter::exportEffects(Scene *sce) { if(hasEffects(sce)) { openLibrary(); MaterialFunctor mf; - mf.forEachMaterialInScene(sce, *this, export_selected); + mf.forEachMaterialInScene(sce, *this, this->export_settings->selected); closeLibrary(); } diff --git a/source/blender/collada/EffectExporter.h b/source/blender/collada/EffectExporter.h index 86143ae4d07..dc1f4c4474b 100644 --- a/source/blender/collada/EffectExporter.h +++ b/source/blender/collada/EffectExporter.h @@ -43,11 +43,13 @@ #include "DNA_object_types.h" #include "DNA_scene_types.h" +#include "ExportSettings.h" + class EffectsExporter: COLLADASW::LibraryEffects { public: - EffectsExporter(COLLADASW::StreamWriter *sw); - void exportEffects(Scene *sce, bool export_selected); + EffectsExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings); + void exportEffects(Scene *sce); void operator()(Material *ma, Object *ob); @@ -66,6 +68,8 @@ private: void writePhong(COLLADASW::EffectProfile &ep, Material *ma); bool hasEffects(Scene *sce); + + const ExportSettings *export_settings; }; #endif diff --git a/source/blender/collada/ExportSettings.cpp b/source/blender/collada/ExportSettings.cpp new file mode 100644 index 00000000000..19f1c05ddcf --- /dev/null +++ b/source/blender/collada/ExportSettings.cpp @@ -0,0 +1,29 @@ +/* + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/collada/ExportSettings.cpp + * \ingroup collada + */ + +#include "ExportSettings.h" diff --git a/source/blender/collada/ExportSettings.h b/source/blender/collada/ExportSettings.h new file mode 100644 index 00000000000..2636ca88a23 --- /dev/null +++ b/source/blender/collada/ExportSettings.h @@ -0,0 +1,39 @@ +/* + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file ExportSettings.h + * \ingroup collada + */ + +#ifndef __EXPORTSETTINGS_H__ +#define __EXPORTSETTINGS_H__ + +struct ExportSettings +{ + public: + bool selected; + char *filepath; +}; + +#endif diff --git a/source/blender/collada/GeometryExporter.cpp b/source/blender/collada/GeometryExporter.cpp index b724844b1ec..4da0a4c6e1f 100644 --- a/source/blender/collada/GeometryExporter.cpp +++ b/source/blender/collada/GeometryExporter.cpp @@ -44,16 +44,16 @@ #include "collada_internal.h" // TODO: optimize UV sets by making indexed list with duplicates removed -GeometryExporter::GeometryExporter(COLLADASW::StreamWriter *sw) : COLLADASW::LibraryGeometries(sw) {} +GeometryExporter::GeometryExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings) : COLLADASW::LibraryGeometries(sw), export_settings(export_settings) {} -void GeometryExporter::exportGeom(Scene *sce, bool export_selected) +void GeometryExporter::exportGeom(Scene *sce) { openLibrary(); mScene = sce; GeometryFunctor gf; - gf.forEachMeshObjectInScene(sce, *this, export_selected); + gf.forEachMeshObjectInScene(sce, *this, this->export_settings->selected); closeLibrary(); } diff --git a/source/blender/collada/GeometryExporter.h b/source/blender/collada/GeometryExporter.h index d9d265a66fc..64c51b6324e 100644 --- a/source/blender/collada/GeometryExporter.h +++ b/source/blender/collada/GeometryExporter.h @@ -42,6 +42,8 @@ #include "DNA_object_types.h" #include "DNA_scene_types.h" +#include "ExportSettings.h" + // TODO: optimize UV sets by making indexed list with duplicates removed class GeometryExporter : COLLADASW::LibraryGeometries { @@ -58,9 +60,9 @@ class GeometryExporter : COLLADASW::LibraryGeometries Scene *mScene; public: - GeometryExporter(COLLADASW::StreamWriter *sw); + GeometryExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings); - void exportGeom(Scene *sce, bool export_selected); + void exportGeom(Scene *sce); void operator()(Object *ob); @@ -96,6 +98,8 @@ public: /* int getTriCount(MFace *faces, int totface);*/ private: std::set exportedGeometry; + + const ExportSettings *export_settings; }; struct GeometryFunctor { diff --git a/source/blender/collada/ImageExporter.cpp b/source/blender/collada/ImageExporter.cpp index 8e426e9dba8..747f3c783d7 100644 --- a/source/blender/collada/ImageExporter.cpp +++ b/source/blender/collada/ImageExporter.cpp @@ -43,7 +43,7 @@ #include "BLI_path_util.h" #include "BLI_string.h" -ImagesExporter::ImagesExporter(COLLADASW::StreamWriter *sw, const char* filename) : COLLADASW::LibraryImages(sw), mfilename(filename) +ImagesExporter::ImagesExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings) : COLLADASW::LibraryImages(sw), export_settings(export_settings) {} bool ImagesExporter::hasImages(Scene *sce) @@ -71,12 +71,12 @@ bool ImagesExporter::hasImages(Scene *sce) return false; } -void ImagesExporter::exportImages(Scene *sce, bool export_selected) +void ImagesExporter::exportImages(Scene *sce) { if(hasImages(sce)) { openLibrary(); MaterialFunctor mf; - mf.forEachMaterialInScene(sce, *this, export_selected); + mf.forEachMaterialInScene(sce, *this, this->export_settings->selected); closeLibrary(); } @@ -97,7 +97,7 @@ void ImagesExporter::operator()(Material *ma, Object *ob) char src[FILE_MAX]; char dir[FILE_MAX]; - BLI_split_dirfile(mfilename, dir, NULL); + BLI_split_dirfile(this->export_settings->filepath, dir, NULL); BKE_rebase_path(abs, sizeof(abs), rel, sizeof(rel), G.main->name, image->name, dir); diff --git a/source/blender/collada/ImageExporter.h b/source/blender/collada/ImageExporter.h index 6b81c099259..9e5767fd9d3 100644 --- a/source/blender/collada/ImageExporter.h +++ b/source/blender/collada/ImageExporter.h @@ -40,17 +40,19 @@ #include "DNA_object_types.h" #include "DNA_scene_types.h" +#include "ExportSettings.h" + class ImagesExporter: COLLADASW::LibraryImages { - const char *mfilename; - std::vector mImages; // contains list of written images, to avoid duplicates public: - ImagesExporter(COLLADASW::StreamWriter *sw, const char* filename); + ImagesExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings); - void exportImages(Scene *sce, bool export_selected); + void exportImages(Scene *sce); void operator()(Material *ma, Object *ob); private: + std::vector mImages; // contains list of written images, to avoid duplicates bool hasImages(Scene *sce); + const ExportSettings *export_settings; }; #endif diff --git a/source/blender/collada/LightExporter.cpp b/source/blender/collada/LightExporter.cpp index 31ade5604a7..3d5814cb6db 100644 --- a/source/blender/collada/LightExporter.cpp +++ b/source/blender/collada/LightExporter.cpp @@ -52,13 +52,13 @@ void forEachLampObjectInScene(Scene *sce, Functor &f, bool export_selected) } } -LightsExporter::LightsExporter(COLLADASW::StreamWriter *sw): COLLADASW::LibraryLights(sw){} +LightsExporter::LightsExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings): COLLADASW::LibraryLights(sw), export_settings(export_settings) {} -void LightsExporter::exportLights(Scene *sce, bool export_selected) +void LightsExporter::exportLights(Scene *sce) { openLibrary(); - forEachLampObjectInScene(sce, *this, export_selected); + forEachLampObjectInScene(sce, *this, this->export_settings->selected); closeLibrary(); } diff --git a/source/blender/collada/LightExporter.h b/source/blender/collada/LightExporter.h index 2ae1a19fdb1..6c52ed2b76d 100644 --- a/source/blender/collada/LightExporter.h +++ b/source/blender/collada/LightExporter.h @@ -37,14 +37,17 @@ #include "DNA_object_types.h" #include "DNA_scene_types.h" +#include "ExportSettings.h" + class LightsExporter: COLLADASW::LibraryLights { public: - LightsExporter(COLLADASW::StreamWriter *sw); - void exportLights(Scene *sce, bool export_selected); + LightsExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings); + void exportLights(Scene *sce); void operator()(Object *ob); private: bool exportBlenderProfile(COLLADASW::Light &cla, Lamp *la); + const ExportSettings *export_settings; }; #endif diff --git a/source/blender/collada/MaterialExporter.cpp b/source/blender/collada/MaterialExporter.cpp index 9d29177578d..37c1a6f6b68 100644 --- a/source/blender/collada/MaterialExporter.cpp +++ b/source/blender/collada/MaterialExporter.cpp @@ -33,15 +33,15 @@ #include "COLLADABUUtils.h" #include "collada_internal.h" -MaterialsExporter::MaterialsExporter(COLLADASW::StreamWriter *sw): COLLADASW::LibraryMaterials(sw){} +MaterialsExporter::MaterialsExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings): COLLADASW::LibraryMaterials(sw), export_settings(export_settings) {} -void MaterialsExporter::exportMaterials(Scene *sce, bool export_selected) +void MaterialsExporter::exportMaterials(Scene *sce) { if(hasMaterials(sce)) { openLibrary(); MaterialFunctor mf; - mf.forEachMaterialInScene(sce, *this, export_selected); + mf.forEachMaterialInScene(sce, *this, this->export_settings->selected); closeLibrary(); } diff --git a/source/blender/collada/MaterialExporter.h b/source/blender/collada/MaterialExporter.h index c080e4b0596..97a1e27358f 100644 --- a/source/blender/collada/MaterialExporter.h +++ b/source/blender/collada/MaterialExporter.h @@ -44,16 +44,18 @@ #include "GeometryExporter.h" #include "collada_internal.h" +#include "ExportSettings.h" class MaterialsExporter: COLLADASW::LibraryMaterials { public: - MaterialsExporter(COLLADASW::StreamWriter *sw); - void exportMaterials(Scene *sce, bool export_selected); + MaterialsExporter(COLLADASW::StreamWriter *sw, const ExportSettings *export_settings); + void exportMaterials(Scene *sce); void operator()(Material *ma, Object *ob); private: bool hasMaterials(Scene *sce); + const ExportSettings *export_settings; }; // used in forEachMaterialInScene diff --git a/source/blender/collada/SceneExporter.cpp b/source/blender/collada/SceneExporter.cpp index 96f20ac21c3..5109df0bb6a 100644 --- a/source/blender/collada/SceneExporter.cpp +++ b/source/blender/collada/SceneExporter.cpp @@ -28,21 +28,21 @@ #include "SceneExporter.h" -SceneExporter::SceneExporter(COLLADASW::StreamWriter *sw, ArmatureExporter *arm) - : COLLADASW::LibraryVisualScenes(sw), arm_exporter(arm) +SceneExporter::SceneExporter(COLLADASW::StreamWriter *sw, ArmatureExporter *arm, const ExportSettings *export_settings) + : COLLADASW::LibraryVisualScenes(sw), arm_exporter(arm), export_settings(export_settings) {} -void SceneExporter::exportScene(Scene *sce, bool export_selected) +void SceneExporter::exportScene(Scene *sce) { // std::string id_naming = id_name(sce); openVisualScene(translate_id(id_naming), id_naming); - exportHierarchy(sce, export_selected); + exportHierarchy(sce); closeVisualScene(); closeLibrary(); } -void SceneExporter::exportHierarchy(Scene *sce, bool export_selected) +void SceneExporter::exportHierarchy(Scene *sce) { Base *base= (Base*) sce->base.first; while(base) { @@ -56,7 +56,7 @@ void SceneExporter::exportHierarchy(Scene *sce, bool export_selected) case OB_LAMP: case OB_ARMATURE: case OB_EMPTY: - if (export_selected && !(ob->flag & SELECT)) { + if (this->export_settings->selected && !(ob->flag & SELECT)) { break; } // write nodes.... diff --git a/source/blender/collada/SceneExporter.h b/source/blender/collada/SceneExporter.h index 65dbd616b20..919cba61ec0 100644 --- a/source/blender/collada/SceneExporter.h +++ b/source/blender/collada/SceneExporter.h @@ -90,16 +90,20 @@ extern "C" { #include "ArmatureExporter.h" +#include "ExportSettings.h" + class SceneExporter: COLLADASW::LibraryVisualScenes, protected TransformWriter, protected InstanceWriter { - ArmatureExporter *arm_exporter; public: - SceneExporter(COLLADASW::StreamWriter *sw, ArmatureExporter *arm); - void exportScene(Scene *sce, bool export_selected); + SceneExporter(COLLADASW::StreamWriter *sw, ArmatureExporter *arm, const ExportSettings *export_settings); + void exportScene(Scene *sce); private: - void exportHierarchy(Scene *sce, bool export_selected); + void exportHierarchy(Scene *sce); void writeNodes(Object *ob, Scene *sce); + + ArmatureExporter *arm_exporter; + const ExportSettings *export_settings; }; #endif diff --git a/source/blender/collada/collada.cpp b/source/blender/collada/collada.cpp index 4caca20531f..8059b1cf3ff 100644 --- a/source/blender/collada/collada.cpp +++ b/source/blender/collada/collada.cpp @@ -30,6 +30,7 @@ /* COLLADABU_ASSERT, may be able to remove later */ #include "COLLADABUPlatform.h" +#include "ExportSettings.h" #include "DocumentExporter.h" #include "DocumentImporter.h" @@ -53,7 +54,10 @@ extern "C" int collada_export(Scene *sce, const char *filepath, int selected) { - DocumentExporter exp; + ExportSettings export_settings; + + export_settings.selected = selected != 0; + export_settings.filepath = (char *)filepath; /* annoying, collada crashes if file cant be created! [#27162] */ if(!BLI_exist(filepath)) { @@ -64,7 +68,8 @@ extern "C" } /* end! */ - exp.exportCurrentScene(sce, filepath, selected); + DocumentExporter exporter(&export_settings); + exporter.exportCurrentScene(sce); return 1; } From 698b8930faa8c95bbc28be4e24109c3ff4f67697 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Wed, 7 Sep 2011 20:06:04 +0000 Subject: [PATCH 134/182] Vertex Weight Proximity: fixing bug #28560 (memory leak). --- source/blender/modifiers/intern/MOD_weightvgproximity.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/blender/modifiers/intern/MOD_weightvgproximity.c b/source/blender/modifiers/intern/MOD_weightvgproximity.c index ffb783f8adc..561a021ce0c 100644 --- a/source/blender/modifiers/intern/MOD_weightvgproximity.c +++ b/source/blender/modifiers/intern/MOD_weightvgproximity.c @@ -481,6 +481,9 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der new_w[i] = dists_e ? minf(dists_e[i], new_w[i]) : new_w[i]; new_w[i] = dists_f ? minf(dists_f[i], new_w[i]) : new_w[i]; } + if(dists_v) MEM_freeN(dists_v); + if(dists_e) MEM_freeN(dists_e); + if(dists_f) MEM_freeN(dists_f); } /* Else, fall back to default obj2vert behavior. */ else { From f5f7ed433c2e0c830ead8e8a665a056cb6dcfced Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 7 Sep 2011 23:36:32 +0000 Subject: [PATCH 135/182] fix [#28558] more edge_keys than edges --- release/scripts/modules/bpy_types.py | 29 +++++++++++++++---- .../startup/bl_ui/properties_data_modifier.py | 8 ++--- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/release/scripts/modules/bpy_types.py b/release/scripts/modules/bpy_types.py index 101416f4943..ef03951108f 100644 --- a/release/scripts/modules/bpy_types.py +++ b/release/scripts/modules/bpy_types.py @@ -356,7 +356,10 @@ class Mesh(bpy_types.ID): @property def edge_keys(self): - return [edge_key for face in self.faces for edge_key in face.edge_keys] + return list({edge_key + for face in self.faces + for edge_key in face.edge_keys + }) class MeshEdge(StructRNA): @@ -376,17 +379,31 @@ class MeshFace(StructRNA): face_verts = self.vertices[:] mesh_verts = self.id_data.vertices if len(face_verts) == 3: - return (mesh_verts[face_verts[0]].co + mesh_verts[face_verts[1]].co + mesh_verts[face_verts[2]].co) / 3.0 + return (mesh_verts[face_verts[0]].co + + mesh_verts[face_verts[1]].co + + mesh_verts[face_verts[2]].co + ) / 3.0 else: - return (mesh_verts[face_verts[0]].co + mesh_verts[face_verts[1]].co + mesh_verts[face_verts[2]].co + mesh_verts[face_verts[3]].co) / 4.0 + return (mesh_verts[face_verts[0]].co + + mesh_verts[face_verts[1]].co + + mesh_verts[face_verts[2]].co + + mesh_verts[face_verts[3]].co + ) / 4.0 @property def edge_keys(self): verts = self.vertices[:] if len(verts) == 3: - return ord_ind(verts[0], verts[1]), ord_ind(verts[1], verts[2]), ord_ind(verts[2], verts[0]) - - return ord_ind(verts[0], verts[1]), ord_ind(verts[1], verts[2]), ord_ind(verts[2], verts[3]), ord_ind(verts[3], verts[0]) + return (ord_ind(verts[0], verts[1]), + ord_ind(verts[1], verts[2]), + ord_ind(verts[2], verts[0]), + ) + else: + return (ord_ind(verts[0], verts[1]), + ord_ind(verts[1], verts[2]), + ord_ind(verts[2], verts[3]), + ord_ind(verts[3], verts[0]), + ) class Text(bpy_types.ID): diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py index 058e8161fe6..348ca554e63 100644 --- a/release/scripts/startup/bl_ui/properties_data_modifier.py +++ b/release/scripts/startup/bl_ui/properties_data_modifier.py @@ -738,7 +738,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel): col.prop(md, "narrowness", slider=True) @staticmethod - def weight_vg_mask(layout, ob, md): + def vertex_weight_mask(layout, ob, md): layout.label(text="Influence/Mask Options:") split = layout.split() col1 = split.column() @@ -798,7 +798,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel): # Common mask options… layout.separator() - self.weight_vg_mask(layout, ob, md) + self.vertex_weight_mask(layout, ob, md) def VERTEX_WEIGHT_MIX(self, layout, ob, md): if ob.type == 'MESH': @@ -823,7 +823,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel): # Common mask options… layout.separator() - self.weight_vg_mask(layout, ob, md) + self.vertex_weight_mask(layout, ob, md) def VERTEX_WEIGHT_PROXIMITY(self, layout, ob, md): if ob.type == 'MESH': @@ -850,7 +850,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel): # Common mask options… layout.separator() - self.weight_vg_mask(layout, ob, md) + self.vertex_weight_mask(layout, ob, md) if __name__ == "__main__": # only for live edit. bpy.utils.register_module(__name__) From 290ad64a222a09aec8cb2645942863b68c86e95d Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 8 Sep 2011 01:26:23 +0000 Subject: [PATCH 136/182] finished tips and tricks section of blender/python api docs, now included in generated docs. --- doc/python_api/rst/info_tips_and_tricks.rst | 156 +++++++++++++++----- doc/python_api/sphinx_doc_gen.py | 1 + 2 files changed, 118 insertions(+), 39 deletions(-) diff --git a/doc/python_api/rst/info_tips_and_tricks.rst b/doc/python_api/rst/info_tips_and_tricks.rst index 3ce2cfd48ad..00766508056 100644 --- a/doc/python_api/rst/info_tips_and_tricks.rst +++ b/doc/python_api/rst/info_tips_and_tricks.rst @@ -2,7 +2,9 @@ Tips and Tricks *************** -Some of these are just python features that scripters may not have thaught to use with blender. +Here are various suggestions that you might find useful when writing scripts. + +Some of these are just python features that scripters may not have thought to use with blender, others are blender specific. Use The Terminal @@ -14,44 +16,36 @@ There are 3 main uses for the terminal, these are: * You can see the output of `print()` as you're script runs, which is useful to view debug info. -* The error tracebacks are printed in full to the terminal which wont always generate an error popup in blenders user interface (depending on how the script is executed). +* The error trace-back is printed in full to the terminal which wont always generate an error popup in blenders user interface (depending on how the script is executed). -* If the script runs for too long or you accidentally enter an infinate loop, Ctrl+C in the terminal (Ctrl+Break on Windows) will quit the script early. +* If the script runs for too long or you accidentally enter an infinite loop, Ctrl+C in the terminal (Ctrl+Break on Windows) will quit the script early. .. note:: For Linux and OSX users this means starting the terminal first, then running blender from within it. On Windows the terminal can be enabled from the help menu. -Run External Scripts -==================== +Use an External Editor +====================== -Blenders text editor is fine for edits and writing small tests but it is not a full featured editor so for larger projects you'll probably want to use an external editor. +Blenders text editor is fine for small changes and writing tests but its not full featured, for larger projects you'll probably want to use a standalone editor or python IDE. Editing a text file externally and having the same text open in blender does work but isn't that optimal so here are 2 ways you can easily use an external file from blender. Executing External Scripts -^^^^^^^^^^^^^^^^^^^^^^^^^^ +-------------------------- -This is the equivilent to running the script directly, referencing a scripts path from a 2 line textblock. +This is the equivalent to running the script directly, referencing a scripts path from a 2 line textblock. -.. code-block:: +.. code-block:: python filename = "/full/path/to/myscript.py" exec(compile(open(filename).read(), filename, 'exec')) -You might also want to reference the file relative to the blend file. +You might want to reference a script relative to the blend file. -.. code-block:: - - filename = "/full/path/to/script.py" - exec(compile(open(filename).read(), filename, 'exec')) - - -You might want to reference a script thats at the same location as the blend file. - -.. code-block:: +.. code-block:: python import bpy import os @@ -61,11 +55,11 @@ You might want to reference a script thats at the same location as the blend fil Executing Modules -^^^^^^^^^^^^^^^^^ +----------------- This example shows loading a script in as a module and executing a module function. -.. code-block:: +.. code-block:: python import myscript import imp @@ -74,18 +68,18 @@ This example shows loading a script in as a module and executing a module functi myscript.main() -Notice that the script is reloaded every time, this forces an update, normally the module stays cached in `sys.modules`. +Notice that the script is reloaded every time, this forces use of the modified version otherwise the cached one in `sys.modules` would be used until blender was restarted. -The main difference between this and executing the script directly is it has to call a function in the module, in this case `main()` but it can be any function, an advantage with this is you can pass argumnents to the function from this small script which is often useful for testing differnt settings quickly. +The important difference between this and executing the script directly is it has to call a function in the module, in this case `main()` but it can be any function, an advantage with this is you can pass arguments to the function from this small script which is often useful for testing different settings quickly. The other issue with this is the script has to be in pythons module search path. While this is not best practice - for testing you can extend the search path, this example adds the current blend files directory to the search path, then loads the script as a module. -.. code-block:: +.. code-block:: python import sys import os - impory bpy + import bpy blend_dir = os.path.basename(bpy.data.filepath) if blend_dir not in sys.path: @@ -100,37 +94,103 @@ While this is not best practice - for testing you can extend the search path, th Don't Use Blender! ================== -While developing your own scripts blenders interface can get in the way, manually reloading, running the scripts, opening file import etc is just overhead. +While developing your own scripts blenders interface can get in the way, manually reloading, running the scripts, opening file import etc. adds overhead. -For scripts that are not interactive it can end up being easier not to use blender at all and run blender from a terminal, without opening a window and execute the script on the command line. +For scripts that are not interactive it can end up being more efficient not to use blenders interface at all and instead execute the script on the command line. -.. code-block:: +.. code-block:: python - blender --backgruond --python myscript.py + blender --background --python myscript.py -You might want to run this with a blend file too. +You might want to run this with a blend file so the script has some data to operate on. -.. code-block:: +.. code-block:: python - blender myscene.blend --backgruond --python myscript.py + blender myscene.blend --background --python myscript.py +.. note:: + + Depending on you're setup you might have to enter the full path to the blender executable. + + +Once the script is running properly in background mode, you'll want to check the output of the script, this depends completely on the task at hand however here are some suggestions. + +* render the output to an image, use an image viewer and keep writing over the same image each time. + +* save a new blend file, or export the file using one of blenders exporters. + +* if the results can be displayed as text - print them or write them to a file. + + +This can take a little time to setup, but it can be well worth the effort to reduce the time it takes to test changes - you can even have blender running the script ever few seconds with a viewer updating the results, so no need to leave you're text editor to see changes. + Use External Tools ================== +When there are no readily available python modules to perform specific tasks its worth keeping in mind you may be able to have python execute an external command on you're data and read the result back in. -Bundled Python -============== +Using external programs adds an extra dependency and may limit who can use the script but to quickly setup you're own custom pipeline or writing one-off scripts this can be handy. -Blender from blender.org includes a compleate python installation on all platforms, this has the disadvantage that any extensions you have installed in you're systems python wont be found by blender. +Examples include: + +* Run The Gimp in batch mode to execute custom scripts for advanced image processing. + +* Write out 3D models to use external mesh manipulation tools and read back in the results. + +* Convert files into recognizable formats before reading. + + +Bundled Python & Extensions +=========================== + +The Blender releases distributed from blender.org include a complete python installation on all platforms, this has the disadvantage that any extensions you have installed in you're systems python wont be found by blender. There are 2 ways around this: -* remove blender python subdirectory, blender will then look for the systems python and use that instead **python version must match the one that blender comes with**. +* remove blender python sub-directory, blender will then fallback on the systems python and use that instead **python version must match the one that blender comes with**. -* copy the extensions into blender's python subdirectry so blender can access them, you could also copy the entire python installation into blenders subdirectory, replacing the one blender comes with. This works as long as the python versions match and the paths are created in the same location relative locations. Doing this has the advantage that you can redistribute this bundle to others with blender and/or the game player, including any extensions you rely on. +* copy the extensions into blender's python sub-directory so blender can access them, you could also copy the entire python installation into blenders sub-directory, replacing the one blender comes with. This works as long as the python versions match and the paths are created in the same relative locations. Doing this has the advantage that you can redistribute this bundle to others with blender and/or the game player, including any extensions you rely on. + + +Drop Into a Python Interpreter in You're Script +=============================================== + +In the middle of a script you may want to inspect some variables, run some function and generally dig about to see whats going on. + +.. code-block:: python + + import code + code.interact(locals=locals()) + + +If you want to access both global and local variables do this... + +.. code-block:: python + + import code + namespace = globals().copy() + namespace.update(locals()) + code.interact(locals=namespace) + + +The next example is an equivalent single line version of the script above which is easier to paste into you're code: + +.. code-block:: python + + __import__('code').interact(locals={k: v for ns in (globals(), locals()) for k, v in ns.items()}) + + +`code.interact` can be added at any line in the script and will pause the script an launch an interactive interpreter in the terminal, when you're done you can quit the interpreter and the script will continue execution. + + +Admittedly this highlights the lack of any python debugging support built into blender, but its still handy to know. + +.. note:: + + This works in the game engine as well, it can be handy to inspect the state of a running game. Advanced @@ -140,10 +200,28 @@ Advanced Blender as a module ------------------- +From a python perspective its nicer to have everything as an extension which lets the python script combine many components. + +Advantages include: + +* you can use external editors/IDE's with blenders python API and execute scripts within the IDE (step over code, inspect variables as the script runs). + +* editors/IDE's can auto complete blender modules & variables. + +* existing scripts can import blender API's without having to run inside blender. + + +This is marked advanced because to run blender as a python module requires a special build option. + +For instructions on building see `Building blender as a python module `_ + Python Safety (Build Option) ---------------------------- +Since its possible to accessed data which has been removed (see Gotcha's), this can be a hard to track down the cause of crashes. + +To raise python exceptions on accessing freed data (rather then crashing), enable the CMake build option WITH_PYTHON_SAFETY. + +This enables data tracking which makes data access about 2x slower which is why the option is not enabled in release builds. -CTypes in Blender ------------------ diff --git a/doc/python_api/sphinx_doc_gen.py b/doc/python_api/sphinx_doc_gen.py index 661d41af4ef..a7657fad432 100644 --- a/doc/python_api/sphinx_doc_gen.py +++ b/doc/python_api/sphinx_doc_gen.py @@ -103,6 +103,7 @@ sphinx-build doc/python_api/sphinx-in doc/python_api/sphinx-out INFO_DOCS = ( ("info_quickstart.rst", "Blender/Python Quickstart: new to blender/scripting and want to get you're feet wet?"), ("info_overview.rst", "Blender/Python API Overview: a more complete explanation of python integration"), + ("info_tips_and_tricks.rst", "Tips and Tricks: Hints to help you while writeing scripts for blender"), ("info_gotcha.rst", "Gotcha's: some of the problems you may come up against when writing scripts"), ) From 5a900be4d685b9b038327e49c4c5da948e1ba2ad Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 8 Sep 2011 02:14:24 +0000 Subject: [PATCH 137/182] attempt to have a threadsafe version of PyC_ExceptionBuffer didnt work with UI script errors, reverting r39886. --- source/blender/python/generic/py_capi_utils.c | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/source/blender/python/generic/py_capi_utils.c b/source/blender/python/generic/py_capi_utils.c index b7e67ec5a93..a1571dc028c 100644 --- a/source/blender/python/generic/py_capi_utils.c +++ b/source/blender/python/generic/py_capi_utils.c @@ -209,6 +209,10 @@ PyObject *PyC_Object_GetAttrStringArgs(PyObject *o, Py_ssize_t n, ...) } /* returns the exception string as a new PyUnicode object, depends on external traceback module */ +#if 0 + +/* this version uses traceback module but somehow fails on UI errors */ + PyObject *PyC_ExceptionBuffer(void) { PyObject *traceback_mod= NULL; @@ -236,6 +240,78 @@ error_cleanup: return ret; } +#else /* verbose, non-threadsafe version */ +PyObject *PyC_ExceptionBuffer(void) +{ + PyObject *stdout_backup = PySys_GetObject("stdout"); /* borrowed */ + PyObject *stderr_backup = PySys_GetObject("stderr"); /* borrowed */ + PyObject *string_io = NULL; + PyObject *string_io_buf = NULL; + PyObject *string_io_mod= NULL; + PyObject *string_io_getvalue= NULL; + + PyObject *error_type, *error_value, *error_traceback; + + if (!PyErr_Occurred()) + return NULL; + + PyErr_Fetch(&error_type, &error_value, &error_traceback); + + PyErr_Clear(); + + /* import io + * string_io = io.StringIO() + */ + + if(! (string_io_mod= PyImport_ImportModule("io")) ) { + goto error_cleanup; + } + else if (! (string_io = PyObject_CallMethod(string_io_mod, (char *)"StringIO", NULL))) { + goto error_cleanup; + } + else if (! (string_io_getvalue= PyObject_GetAttrString(string_io, "getvalue"))) { + goto error_cleanup; + } + + Py_INCREF(stdout_backup); // since these were borrowed we dont want them freed when replaced. + Py_INCREF(stderr_backup); + + PySys_SetObject("stdout", string_io); // both of these are free'd when restoring + PySys_SetObject("stderr", string_io); + + PyErr_Restore(error_type, error_value, error_traceback); + PyErr_Print(); /* print the error */ + PyErr_Clear(); + + string_io_buf = PyObject_CallObject(string_io_getvalue, NULL); + + PySys_SetObject("stdout", stdout_backup); + PySys_SetObject("stderr", stderr_backup); + + Py_DECREF(stdout_backup); /* now sys owns the ref again */ + Py_DECREF(stderr_backup); + + Py_DECREF(string_io_mod); + Py_DECREF(string_io_getvalue); + Py_DECREF(string_io); /* free the original reference */ + + PyErr_Clear(); + return string_io_buf; + + +error_cleanup: + /* could not import the module so print the error and close */ + Py_XDECREF(string_io_mod); + Py_XDECREF(string_io); + + PyErr_Restore(error_type, error_value, error_traceback); + PyErr_Print(); /* print the error */ + PyErr_Clear(); + + return NULL; +} +#endif + /* string conversion, escape non-unicode chars, coerce must be set to NULL */ const char *PyC_UnicodeAsByte(PyObject *py_str, PyObject **coerce) From c61827ed255432637a335dcff12745c156f619fb Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 8 Sep 2011 03:57:11 +0000 Subject: [PATCH 138/182] patch from Uncle_Entity on IRC for fedora/collada --- CMakeLists.txt | 11 +-- .../cmake/Modules/FindOpenCOLLADA.cmake | 27 +++++- build_files/cmake/Modules/FindPCRE.cmake | 43 +++++++++ build_files/cmake/Modules/FindXML2.cmake | 88 +++++++++++++++++++ 4 files changed, 157 insertions(+), 12 deletions(-) create mode 100644 build_files/cmake/Modules/FindPCRE.cmake create mode 100644 build_files/cmake/Modules/FindXML2.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 8b5693fb1aa..ea89cbddb9f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -452,15 +452,8 @@ if(UNIX AND NOT APPLE) if(WITH_OPENCOLLADA) find_package(OpenCOLLADA) if(OPENCOLLADA_FOUND) - set(PCRE /usr CACHE PATH "PCRE Directory") - mark_as_advanced(PCRE) - set(PCRE_LIBPATH ${PCRE}/lib) - set(PCRE_LIB pcre) - - set(EXPAT /usr CACHE PATH "Expat Directory") - mark_as_advanced(EXPAT) - set(EXPAT_LIBPATH ${EXPAT}/lib) - set(EXPAT_LIB expat) + find_package(XML2) + find_package(PCRE) else() set(WITH_OPENCOLLADA OFF) endif() diff --git a/build_files/cmake/Modules/FindOpenCOLLADA.cmake b/build_files/cmake/Modules/FindOpenCOLLADA.cmake index c7637283514..a9a1d544507 100644 --- a/build_files/cmake/Modules/FindOpenCOLLADA.cmake +++ b/build_files/cmake/Modules/FindOpenCOLLADA.cmake @@ -49,12 +49,14 @@ SET(_opencollada_FIND_COMPONENTS OpenCOLLADAFramework OpenCOLLADABaseUtils GeneratedSaxParser - UTF MathMLSolver - pcre +) + +# Fedora openCOLLADA package links these statically +SET(_opencollada_FIND_STATIC_COMPONENTS + UTF ftoa buffer - xml2 ) SET(_opencollada_SEARCH_DIRS @@ -104,6 +106,25 @@ FOREACH(COMPONENT ${_opencollada_FIND_COMPONENTS}) LIST(APPEND _opencollada_LIBRARIES "${OPENCOLLADA_${UPPERCOMPONENT}_LIBRARY}") ENDFOREACH() +FOREACH(COMPONENT ${_opencollada_FIND_STATIC_COMPONENTS}) + STRING(TOUPPER ${COMPONENT} UPPERCOMPONENT) + + FIND_LIBRARY(OPENCOLLADA_${UPPERCOMPONENT}_LIBRARY + NAMES + ${COMPONENT} + HINTS + ${_opencollada_SEARCH_DIRS} + PATH_SUFFIXES + lib64 lib + # Ubuntu ppa needs this. + lib64/opencollada lib/opencollada + ) + IF(OPENCOLLADA_${UPPERCOMPONENT}_LIBRARY) + MARK_AS_ADVANCED(OPENCOLLADA_${UPPERCOMPONENT}_LIBRARY) + LIST(APPEND _opencollada_LIBRARIES "${OPENCOLLADA_${UPPERCOMPONENT}_LIBRARY}") + ENDIF() +ENDFOREACH() + # handle the QUIETLY and REQUIRED arguments and set OPENCOLLADA_FOUND to TRUE if # all listed variables are TRUE diff --git a/build_files/cmake/Modules/FindPCRE.cmake b/build_files/cmake/Modules/FindPCRE.cmake new file mode 100644 index 00000000000..a09375287a6 --- /dev/null +++ b/build_files/cmake/Modules/FindPCRE.cmake @@ -0,0 +1,43 @@ +# - Try to find the PCRE regular expression library +# Once done this will define +# +# PCRE_FOUND - system has the PCRE library +# PCRE_INCLUDE_DIR - the PCRE include directory +# PCRE_LIBRARIES - The libraries needed to use PCRE + +# Copyright (c) 2006, Alexander Neundorf, +# +# Redistribution and use is allowed according to the terms of the BSD license. + +if (PCRE_INCLUDE_DIR AND PCRE_PCREPOSIX_LIBRARY AND PCRE_PCRE_LIBRARY) + # Already in cache, be silent + set(PCRE_FIND_QUIETLY TRUE) +endif (PCRE_INCLUDE_DIR AND PCRE_PCREPOSIX_LIBRARY AND PCRE_PCRE_LIBRARY) + +if (NOT WIN32) + # use pkg-config to get the directories and then use these values + # in the FIND_PATH() and FIND_LIBRARY() calls + find_package(PkgConfig) + pkg_check_modules(PC_PCRE QUIET libpcre) + set(PCRE_DEFINITIONS ${PC_PCRE_CFLAGS_OTHER}) +endif (NOT WIN32) + +find_path(PCRE_INCLUDE_DIR pcre.h + HINTS ${PC_PCRE_INCLUDEDIR} ${PC_PCRE_INCLUDE_DIRS} + PATH_SUFFIXES pcre) + +find_library(PCRE_PCRE_LIBRARY NAMES pcre HINTS ${PC_PCRE_LIBDIR} ${PC_PCRE_LIBRARY_DIRS}) + +find_library(PCRE_PCREPOSIX_LIBRARY NAMES pcreposix HINTS ${PC_PCRE_LIBDIR} ${PC_PCRE_LIBRARY_DIRS}) + +include(FindPackageHandleStandardArgs) + +IF(NOT WIN32) + find_package_handle_standard_args(PCRE DEFAULT_MSG PCRE_INCLUDE_DIR PCRE_PCRE_LIBRARY PCRE_PCREPOSIX_LIBRARY ) + mark_as_advanced(PCRE_INCLUDE_DIR PCRE_LIBRARIES PCRE_PCREPOSIX_LIBRARY PCRE_PCRE_LIBRARY) + set(PCRE_LIBRARIES ${PCRE_PCRE_LIBRARY} ${PCRE_PCREPOSIX_LIBRARY}) +ELSE() + find_package_handle_standard_args(PCRE DEFAULT_MSG PCRE_INCLUDE_DIR PCRE_PCRE_LIBRARY ) + set(PCRE_LIBRARIES ${PCRE_PCRE_LIBRARY} ) + mark_as_advanced(PCRE_INCLUDE_DIR PCRE_LIBRARIES PCRE_PCRE_LIBRARY) +ENDIF() diff --git a/build_files/cmake/Modules/FindXML2.cmake b/build_files/cmake/Modules/FindXML2.cmake new file mode 100644 index 00000000000..e9f9fb3ca74 --- /dev/null +++ b/build_files/cmake/Modules/FindXML2.cmake @@ -0,0 +1,88 @@ +# - Try to find XML2 +# Once done this will define +# +# XML2_FOUND - system has XML2 +# XML2_INCLUDE_DIRS - the XML2 include directory +# XML2_LIBRARIES - Link these to use XML2 +# XML2_DEFINITIONS - Compiler switches required for using XML2 +# +# Copyright (c) 2008 Andreas Schneider +# +# Redistribution and use is allowed according to the terms of the New +# BSD license. +# + + +if (XML2_LIBRARIES AND XML2_INCLUDE_DIRS) + # in cache already + set(XML2_FOUND TRUE) +else (XML2_LIBRARIES AND XML2_INCLUDE_DIRS) + # use pkg-config to get the directories and then use these values + # in the FIND_PATH() and FIND_LIBRARY() calls + if (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) + include(UsePkgConfig) + pkgconfig(libxml-2.0 _XML2_INCLUDEDIR _XML2_LIBDIR _XML2_LDFLAGS _XML2_CFLAGS) + else (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) + find_package(PkgConfig) + if (PKG_CONFIG_FOUND) + pkg_check_modules(_XML2 libxml-2.0) + endif (PKG_CONFIG_FOUND) + endif (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) + find_path(XML2_INCLUDE_DIR + NAMES + libxml/xpath.h + PATHS + ${_XML2_INCLUDEDIR} + /usr/include + /usr/local/include + /opt/local/include + /sw/include + PATH_SUFFIXES + libxml2 + ) + + find_library(XML2_LIBRARY + NAMES + xml2 + PATHS + ${_XML2_LIBDIR} + /usr/lib + /usr/local/lib + /opt/local/lib + /sw/lib + ) + + if (XML2_LIBRARY) + set(XML2_FOUND TRUE) + endif (XML2_LIBRARY) + + set(XML2_INCLUDE_DIRS + ${XML2_INCLUDE_DIR} + ) + + if (XML2_FOUND) + set(XML2_LIBRARIES + ${XML2_LIBRARIES} + ${XML2_LIBRARY} + ) + endif (XML2_FOUND) + + if (XML2_INCLUDE_DIRS AND XML2_LIBRARIES) + set(XML2_FOUND TRUE) + endif (XML2_INCLUDE_DIRS AND XML2_LIBRARIES) + + if (XML2_FOUND) + if (NOT XML2_FIND_QUIETLY) + message(STATUS "Found XML2: ${XML2_LIBRARIES}") + endif (NOT XML2_FIND_QUIETLY) + else (XML2_FOUND) + if (XML2_FIND_REQUIRED) + message(FATAL_ERROR "Could not find XML2") + endif (XML2_FIND_REQUIRED) + endif (XML2_FOUND) + + # show the XML2_INCLUDE_DIRS and XML2_LIBRARIES variables only in the advanced view + mark_as_advanced(XML2_INCLUDE_DIRS XML2_LIBRARIES) + +endif (XML2_LIBRARIES AND XML2_INCLUDE_DIRS) + From 7500f4cd488b90f30cd72c1a25e6cc5a1fe8c55b Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 8 Sep 2011 05:42:44 +0000 Subject: [PATCH 139/182] fix for misc py errors + some pep8 edits. --- doc/python_api/examples/bge.texture.1.py | 2 +- doc/python_api/examples/bpy.types.Operator.py | 2 +- .../scripts/startup/bl_operators/animsys_update.py | 1 - release/scripts/startup/bl_operators/nla.py | 9 ++++++--- .../startup/bl_ui/properties_data_armature.py | 12 ++++++------ .../scripts/startup/bl_ui/properties_data_speaker.py | 2 +- release/scripts/startup/bl_ui/properties_game.py | 2 +- 7 files changed, 16 insertions(+), 14 deletions(-) diff --git a/doc/python_api/examples/bge.texture.1.py b/doc/python_api/examples/bge.texture.1.py index faa0ae736e8..4be6f51de67 100644 --- a/doc/python_api/examples/bge.texture.1.py +++ b/doc/python_api/examples/bge.texture.1.py @@ -14,7 +14,7 @@ def createTexture(cont): object = cont.owner # get the reference pointer (ID) of the internal texture - ID = texture.materialID(obj, 'IMoriginal.png') + ID = texture.materialID(object, 'IMoriginal.png') # create a texture object object_texture = texture.Texture(object, ID) diff --git a/doc/python_api/examples/bpy.types.Operator.py b/doc/python_api/examples/bpy.types.Operator.py index 52edfa0a61b..0981712e1ff 100644 --- a/doc/python_api/examples/bpy.types.Operator.py +++ b/doc/python_api/examples/bpy.types.Operator.py @@ -21,7 +21,7 @@ class HelloWorldOperator(bpy.types.Operator): print("Hello World") return {'FINISHED'} -bpy.utils.register_class(SimpleOperator) +bpy.utils.register_class(HelloWorldOperator) # test call to the newly defined operator bpy.ops.wm.hello_world() diff --git a/release/scripts/startup/bl_operators/animsys_update.py b/release/scripts/startup/bl_operators/animsys_update.py index 3710c57ac16..23b9cf13f07 100644 --- a/release/scripts/startup/bl_operators/animsys_update.py +++ b/release/scripts/startup/bl_operators/animsys_update.py @@ -685,7 +685,6 @@ data_path_update = [ ] -import bpy from bpy.types import Operator diff --git a/release/scripts/startup/bl_operators/nla.py b/release/scripts/startup/bl_operators/nla.py index c764f7d62f1..feb0016b1c7 100644 --- a/release/scripts/startup/bl_operators/nla.py +++ b/release/scripts/startup/bl_operators/nla.py @@ -271,7 +271,8 @@ class BakeAction(Operator): class ClearUselessActions(Operator): - '''Mark actions with no F-Curves for deletion after save+reload of file preserving "action libraries"''' + '''Mark actions with no F-Curves for deletion after save+reload of ''' \ + '''file preserving "action libraries"''' bl_idname = "anim.clear_useless_actions" bl_label = "Clear Useless Actions" bl_options = {'REGISTER', 'UNDO'} @@ -292,12 +293,14 @@ class ClearUselessActions(Operator): if ((self.only_unused is False) or (action.use_fake_user and action.users == 1)): - # if it has F-Curves, then it's a "action library" (i.e. walk, wave, jump, etc.) + # if it has F-Curves, then it's a "action library" + # (i.e. walk, wave, jump, etc.) # and should be left alone as that's what fake users are for! if not action.fcurves: # mark action for deletion action.user_clear() removed += 1 - self.report({'INFO'}, "Removed %d empty and/or fake-user only Actions" % (removed)) + self.report({'INFO'}, "Removed %d empty and/or fake-user only Actions" + % removed) return {'FINISHED'} diff --git a/release/scripts/startup/bl_ui/properties_data_armature.py b/release/scripts/startup/bl_ui/properties_data_armature.py index 463ba84470f..61093abe814 100644 --- a/release/scripts/startup/bl_ui/properties_data_armature.py +++ b/release/scripts/startup/bl_ui/properties_data_armature.py @@ -74,6 +74,7 @@ class DATA_PT_skeleton(ArmatureButtonsPanel, Panel): if context.scene.render.engine == "BLENDER_GAME": layout.row().prop(arm, "vert_deformer", expand=True) + class DATA_PT_display(ArmatureButtonsPanel, Panel): bl_label = "Display" @@ -185,11 +186,10 @@ class DATA_PT_pose_library(ArmatureButtonsPanel, Panel): layout.template_ID(ob, "pose_library", new="poselib.new", unlink="poselib.unlink") if poselib: - - # list of poses in pose library + # list of poses in pose library row = layout.row() row.template_list(poselib, "pose_markers", poselib.pose_markers, "active_index", rows=5) - + # column of operators for active pose # - goes beside list col = row.column(align=True) @@ -206,9 +206,9 @@ class DATA_PT_pose_library(ArmatureButtonsPanel, Panel): if pose_marker_active is not None: col.operator("poselib.pose_remove", icon='ZOOMOUT', text="").pose = pose_marker_active.name col.operator("poselib.apply_pose", icon='ZOOM_SELECTED', text="").pose_index = poselib.pose_markers.active_index - - col.operator("poselib.action_sanitise", icon='HELP', text="") # XXX: put in menu? - + + col.operator("poselib.action_sanitise", icon='HELP', text="") # XXX: put in menu? + # properties for active marker if pose_marker_active is not None: layout.prop(pose_marker_active, "name") diff --git a/release/scripts/startup/bl_ui/properties_data_speaker.py b/release/scripts/startup/bl_ui/properties_data_speaker.py index 657c0fe652a..a1b86b51f5f 100644 --- a/release/scripts/startup/bl_ui/properties_data_speaker.py +++ b/release/scripts/startup/bl_ui/properties_data_speaker.py @@ -81,7 +81,7 @@ class DATA_PT_distance(DataButtonsPanel, bpy.types.Panel): speaker = context.speaker split = layout.split() - + col = split.column() col.label("Volume:") col.prop(speaker, "volume_min", text="Minimum") diff --git a/release/scripts/startup/bl_ui/properties_game.py b/release/scripts/startup/bl_ui/properties_game.py index 161e4b10cff..5ea55d82471 100644 --- a/release/scripts/startup/bl_ui/properties_game.py +++ b/release/scripts/startup/bl_ui/properties_game.py @@ -344,7 +344,7 @@ class RENDER_PT_game_performance(RenderButtonsPanel, Panel): row = col.row() row.prop(gs, "use_frame_rate") row.prop(gs, "use_display_lists") - + col.prop(gs, "restrict_animation_updates") From 939a733659e78ff6839a5e9f8368e1b5071d82c1 Mon Sep 17 00:00:00 2001 From: Lukas Toenne Date: Thu, 8 Sep 2011 06:14:03 +0000 Subject: [PATCH 140/182] Shader node tree exec data cannot use the exec->nodetree before it is initialized. --- source/blender/nodes/shader/node_shader_tree.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/nodes/shader/node_shader_tree.c b/source/blender/nodes/shader/node_shader_tree.c index 642e4be10d7..c50005bef67 100644 --- a/source/blender/nodes/shader/node_shader_tree.c +++ b/source/blender/nodes/shader/node_shader_tree.c @@ -211,7 +211,7 @@ void ntreeShaderExecTree(bNodeTree *ntree, ShadeInput *shi, ShadeResult *shr) memset(shr, 0, sizeof(ShadeResult)); if (!exec) - exec = ntree->execdata = ntreeShaderBeginExecTree(exec->nodetree, 1); + exec = ntree->execdata = ntreeShaderBeginExecTree(ntree, 1); nts= ntreeGetThreadStack(exec, shi->thread); ntreeExecThreadNodes(exec, nts, &scd, shi->thread); From 595ed90fe32c0621b47f1b3960be54b47002fd17 Mon Sep 17 00:00:00 2001 From: Lukas Toenne Date: Thu, 8 Sep 2011 07:01:29 +0000 Subject: [PATCH 141/182] Minor fixes for some unfounded clang warnings. --- source/blender/editors/space_node/drawnode.c | 3 +-- source/blender/editors/space_node/node_draw.c | 2 +- source/blender/editors/space_node/node_edit.c | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index dd14441a89b..623855485d7 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -660,6 +660,7 @@ static void draw_group_socket(const bContext *C, SpaceNode *snode, bNodeTree *nt * 1) input: not internal * 2) output: (node type uses const outputs) and (group output is unlinked) */ + draw_value = 0; switch (in_out) { case SOCK_IN: draw_value = !(gsock && (gsock->flag & SOCK_INTERNAL)); @@ -667,8 +668,6 @@ static void draw_group_socket(const bContext *C, SpaceNode *snode, bNodeTree *nt case SOCK_OUT: if (gnode->typeinfo->flag & NODE_CONST_OUTPUT) draw_value = !(gsock && gsock->link); - else - draw_value = 0; break; } if (draw_value) { diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c index 6be8978cb5b..ba1e8d3dd59 100644 --- a/source/blender/editors/space_node/node_draw.c +++ b/source/blender/editors/space_node/node_draw.c @@ -220,7 +220,7 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node) PointerRNA ptr; bNodeSocket *nsock; float locx, locy; - float dy= locy; + float dy; int buty; /* get "global" coords */ diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index bb85a0dbe3a..5f58f540aae 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -792,7 +792,7 @@ static int edit_node_invoke_properties(bContext *C, wmOperator *op) static void edit_node_properties_get(wmOperator *op, bNodeTree *ntree, bNode **rnode, bNodeSocket **rsock, int *rin_out) { bNode *node; - bNodeSocket *sock; + bNodeSocket *sock=NULL; char nodename[32]; int sockindex; int in_out; From 3dccd96ac705011ac396a3eb1d3b07a18ef485a7 Mon Sep 17 00:00:00 2001 From: Lukas Toenne Date: Thu, 8 Sep 2011 07:05:27 +0000 Subject: [PATCH 142/182] Fixed potential issue in mirrored loop node sockets. These are currently not used, but clang pointed this out. --- source/blender/nodes/intern/node_common.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/nodes/intern/node_common.c b/source/blender/nodes/intern/node_common.c index 07f3eb943cc..d7830b6a260 100644 --- a/source/blender/nodes/intern/node_common.c +++ b/source/blender/nodes/intern/node_common.c @@ -878,7 +878,7 @@ static void loop_sync(bNodeTree *ntree, int sync_in_out) while (sync && ((sync->flag & SOCK_INTERNAL) || !(sync->flag & SOCK_DYNAMIC))) sync = sync->next; - if (!(sync->flag & SOCK_INTERNAL) && (sync->flag & SOCK_DYNAMIC)) { + if (sync && !(sync->flag & SOCK_INTERNAL) && (sync->flag & SOCK_DYNAMIC)) { if (sock->storage==NULL) { /* if mirror index is 0, the sockets is newly added and a new mirror must be created. */ mirror = node_group_expose_socket(ntree, sock, sync_in_out); From 1f0bb0e0353687c17738608d884077dc6779638d Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Thu, 8 Sep 2011 07:36:59 +0000 Subject: [PATCH 143/182] =?UTF-8?q?Vertex=20Weight=20Proximity:=20minor=20?= =?UTF-8?q?updates=20and=20fixes.=20*Updated=20UI=20code=20(replaced=20?= =?UTF-8?q?=E2=80=9Crow=20columns=E2=80=9D=20by=20splits=20;)=20).=20*Clam?= =?UTF-8?q?ped=20global=20influence=20to=20[0.0,=201.0]=20range!=20*Added/?= =?UTF-8?q?edited=20some=20tooltips=20for=20Proximity.=20*Proximity=20dist?= =?UTF-8?q?ance=20mapping=20can=20now=20be=20reversed=20by=20entering=20Lo?= =?UTF-8?q?west=20Dist=20>=20Highest=20Dist.=20*Moved=20mapping=20before?= =?UTF-8?q?=20masking=20in=20Proximity,=20much=20more=20sensible=20this=20?= =?UTF-8?q?way!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../startup/bl_ui/properties_data_modifier.py | 19 +++++++------ source/blender/makesrna/intern/rna_modifier.c | 16 ++++++----- .../modifiers/intern/MOD_weightvgproximity.c | 28 ++++++++++++++----- 3 files changed, 40 insertions(+), 23 deletions(-) diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py index 348ca554e63..c80823b0803 100644 --- a/release/scripts/startup/bl_ui/properties_data_modifier.py +++ b/release/scripts/startup/bl_ui/properties_data_modifier.py @@ -740,20 +740,21 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel): @staticmethod def vertex_weight_mask(layout, ob, md): layout.label(text="Influence/Mask Options:") - split = layout.split() - col1 = split.column() - col2 = split.column() + row = layout.row() - col1.label(text="Global Influence:") - col2.prop(md, "mask_constant", text="") + split = layout.split(percentage=0.4) + split.label(text="Global Influence:") + split.prop(md, "mask_constant", text="") if not md.mask_texture: - col1.label(text="Vertex Group Mask:") - col2.prop_search(md, "mask_vertex_group", ob, "vertex_groups", text="") + split = layout.split(percentage=0.4) + split.label(text="Vertex Group Mask:") + split.prop_search(md, "mask_vertex_group", ob, "vertex_groups", text="") if not md.mask_vertex_group: - col1.label(text="Texture Mask:") - col2.template_ID(md, "mask_texture", new="texture.new") + split = layout.split(percentage=0.4) + split.label(text="Texture Mask:") + split.template_ID(md, "mask_texture", new="texture.new") if md.mask_texture: split = layout.split() col = split.column() diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index 2e8e8520dbf..d5c7002e07f 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -2510,7 +2510,7 @@ static void rna_def_modifier_weightvg_mask(BlenderRNA *brna, StructRNA *srna) prop= RNA_def_property(srna, "mask_constant", PROP_FLOAT, PROP_NONE); RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); - RNA_def_property_ui_range(prop, -1.0, 1.0, 10, 0); + RNA_def_property_ui_range(prop, 0.0, 1.0, 10, 0); RNA_def_property_ui_text(prop, "Influence", "Global influence of current modifications on vgroup."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); @@ -2707,9 +2707,9 @@ static void rna_def_modifier_weightvgproximity(BlenderRNA *brna) {0, NULL, 0, NULL, NULL}}; static EnumPropertyItem proximity_geometry_items[] = { - {MOD_WVG_PROXIMITY_GEOM_VERTS, "VERTEX", ICON_VERTEXSEL, "Vertex", ""}, - {MOD_WVG_PROXIMITY_GEOM_EDGES, "EDGE", ICON_EDGESEL, "Edge", ""}, - {MOD_WVG_PROXIMITY_GEOM_FACES, "FACE", ICON_FACESEL, "Face", ""}, + {MOD_WVG_PROXIMITY_GEOM_VERTS, "VERTEX", ICON_VERTEXSEL, "Vertex", "Compute distance to nearest vertex."}, + {MOD_WVG_PROXIMITY_GEOM_EDGES, "EDGE", ICON_EDGESEL, "Edge", "Compute distance to nearest edge."}, + {MOD_WVG_PROXIMITY_GEOM_FACES, "FACE", ICON_FACESEL, "Face", "Compute distance to nearest face."}, {0, NULL, 0, NULL, NULL}}; static EnumPropertyItem weightvg_proximity_falloff_type_items[] = { @@ -2748,7 +2748,9 @@ static void rna_def_modifier_weightvgproximity(BlenderRNA *brna) RNA_def_property_enum_sdna(prop, NULL, "proximity_flags"); RNA_def_property_enum_items(prop, proximity_geometry_items); RNA_def_property_flag(prop, PROP_ENUM_FLAG); /* important to run before default set */ - RNA_def_property_ui_text(prop, "Proximity Geometry", "Use shortest distance to target object's geometry as weight"); + RNA_def_property_ui_text(prop, "Proximity Geometry", + "Use the shortest computed distance to target object's geometry " + "as weight."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); prop= RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE); @@ -2760,13 +2762,13 @@ static void rna_def_modifier_weightvgproximity(BlenderRNA *brna) prop= RNA_def_property(srna, "min_dist", PROP_FLOAT, PROP_NONE); RNA_def_property_range(prop, 0.0, FLT_MAX); RNA_def_property_ui_range(prop, 0.0, 1000.0, 10, 0); - RNA_def_property_ui_text(prop, "Lowest Dist", "Distance mapping to weight 0.0."); + RNA_def_property_ui_text(prop, "Lowest Dist", "Distance mapping to weight 0.0 (or weight 1.0 if above Highest Dist)."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); prop= RNA_def_property(srna, "max_dist", PROP_FLOAT, PROP_NONE); RNA_def_property_range(prop, 0.0, FLT_MAX); RNA_def_property_ui_range(prop, 0.0, 1000.0, 10, 0); - RNA_def_property_ui_text(prop, "Highest Dist", "Distance mapping to weight 1.0."); + RNA_def_property_ui_text(prop, "Highest Dist", "Distance mapping to weight 1.0 (or weight 0.0 if below Lowest Dist)."); RNA_def_property_update(prop, 0, "rna_Modifier_update"); prop= RNA_def_property(srna, "falloff_type", PROP_ENUM, PROP_NONE); diff --git a/source/blender/modifiers/intern/MOD_weightvgproximity.c b/source/blender/modifiers/intern/MOD_weightvgproximity.c index 561a021ce0c..0dbf8a91d21 100644 --- a/source/blender/modifiers/intern/MOD_weightvgproximity.c +++ b/source/blender/modifiers/intern/MOD_weightvgproximity.c @@ -199,10 +199,24 @@ void do_map(float *weights, const int nidx, const float min_d, const float max_d { const float range_inv= 1.0f / (max_d - min_d); /* invert since multiplication is faster */ unsigned int i= nidx; - while (i-- > 0) { - if (weights[i] >= max_d) weights[i]= 1.0f; /* most likely case first */ - else if(weights[i] <= min_d) weights[i]= 0.0f; - else weights[i]= (weights[i] - min_d) * range_inv; + if(max_d == min_d) { + while (i-- > 0) { + weights[i] = (weights[i] >= max_d) ? 1.0f : 0.0f; /* "Step" behavior... */ + } + } + else if(max_d > min_d) { + while (i-- > 0) { + if (weights[i] >= max_d) weights[i]= 1.0f; /* most likely case first */ + else if(weights[i] <= min_d) weights[i]= 0.0f; + else weights[i]= (weights[i] - min_d) * range_inv; + } + } + else { + while (i-- > 0) { + if (weights[i] <= max_d) weights[i]= 1.0f; /* most likely case first */ + else if(weights[i] >= min_d) weights[i]= 0.0f; + else weights[i]= (weights[i] - min_d) * range_inv; + } } if(!ELEM(mode, MOD_WVG_MAPPING_NONE, MOD_WVG_MAPPING_CURVE)) { @@ -495,14 +509,14 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der } } + /* Map distances to weights. */ + do_map(new_w, numIdx, wmd->min_dist, wmd->max_dist, wmd->falloff_type); + /* Do masking. */ weightvg_do_mask(numIdx, indices, org_w, new_w, ob, ret, wmd->mask_constant, wmd->mask_defgrp_name, wmd->mask_texture, wmd->mask_tex_use_channel, wmd->mask_tex_mapping, wmd->mask_tex_map_obj, wmd->mask_tex_uvlayer_name); - /* Map distances to weights. */ - do_map(org_w, numIdx, wmd->min_dist, wmd->max_dist, wmd->falloff_type); - /* Update vgroup. Note we never add nor remove vertices from vgroup here. */ weightvg_update_vg(dvert, defgrp_idx, numIdx, indices, org_w, 0, 0.0f, 0, 0.0f); From 279d64def710f90579c096ae43699daf742c73a5 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Thu, 8 Sep 2011 09:46:31 +0000 Subject: [PATCH 144/182] Fix #28545: User Preferences - System Tab - Reset All To Default Values on OpenGL Lights Added default direction to light. --- source/blender/makesrna/intern/rna_userdef.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c index 66c4e7245c4..4bc828cdc4f 100644 --- a/source/blender/makesrna/intern/rna_userdef.c +++ b/source/blender/makesrna/intern/rna_userdef.c @@ -1959,6 +1959,7 @@ static void rna_def_userdef_solidlight(BlenderRNA *brna) { StructRNA *srna; PropertyRNA *prop; + static float default_dir[3] = {0.f, 1.f, 0.f}; srna= RNA_def_struct(brna, "UserSolidLight", NULL); RNA_def_struct_sdna(srna, "SolidLight"); @@ -1972,6 +1973,7 @@ static void rna_def_userdef_solidlight(BlenderRNA *brna) prop= RNA_def_property(srna, "direction", PROP_FLOAT, PROP_DIRECTION); RNA_def_property_float_sdna(prop, NULL, "vec"); RNA_def_property_array(prop, 3); + RNA_def_property_float_array_default(prop, default_dir); RNA_def_property_ui_text(prop, "Direction", "The direction that the OpenGL light is shining"); RNA_def_property_update(prop, 0, "rna_UserDef_viewport_lights_update"); From 9e9fbd371ef2a6e074dabbda84513e4591c266a3 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 8 Sep 2011 09:48:41 +0000 Subject: [PATCH 145/182] correct fix for #28558 --- release/scripts/modules/bpy_types.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/release/scripts/modules/bpy_types.py b/release/scripts/modules/bpy_types.py index ef03951108f..b3127733c1e 100644 --- a/release/scripts/modules/bpy_types.py +++ b/release/scripts/modules/bpy_types.py @@ -356,10 +356,7 @@ class Mesh(bpy_types.ID): @property def edge_keys(self): - return list({edge_key - for face in self.faces - for edge_key in face.edge_keys - }) + return [ed.key for ed in self.edges] class MeshEdge(StructRNA): From 49547241d607d902e1a6a76e788580303cb65653 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 8 Sep 2011 10:15:27 +0000 Subject: [PATCH 146/182] correction to docs. --- doc/python_api/rst/info_tips_and_tricks.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/doc/python_api/rst/info_tips_and_tricks.rst b/doc/python_api/rst/info_tips_and_tricks.rst index 00766508056..bd3ed196193 100644 --- a/doc/python_api/rst/info_tips_and_tricks.rst +++ b/doc/python_api/rst/info_tips_and_tricks.rst @@ -31,6 +31,7 @@ Blenders text editor is fine for small changes and writing tests but its not ful Editing a text file externally and having the same text open in blender does work but isn't that optimal so here are 2 ways you can easily use an external file from blender. +Using the following examples you'll still need textblock in blender to execute, but reference an external file rather then including it directly. Executing External Scripts -------------------------- @@ -163,7 +164,7 @@ In the middle of a script you may want to inspect some variables, run some funct .. code-block:: python import code - code.interact(locals=locals()) + code.interact(local=locals()) If you want to access both global and local variables do this... @@ -173,14 +174,14 @@ If you want to access both global and local variables do this... import code namespace = globals().copy() namespace.update(locals()) - code.interact(locals=namespace) + code.interact(local=namespace) The next example is an equivalent single line version of the script above which is easier to paste into you're code: .. code-block:: python - __import__('code').interact(locals={k: v for ns in (globals(), locals()) for k, v in ns.items()}) + __import__('code').interact(local={k: v for ns in (globals(), locals()) for k, v in ns.items()}) `code.interact` can be added at any line in the script and will pause the script an launch an interactive interpreter in the terminal, when you're done you can quit the interpreter and the script will continue execution. From 10ad5e8770c70572b34713404419c25389750753 Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Thu, 8 Sep 2011 11:08:22 +0000 Subject: [PATCH 147/182] Vertex Weight UI: * Remove check for ob.type mesh, this is done on RNA Level and not needed here * Removed unnecessary row declaration --- .../startup/bl_ui/properties_data_modifier.py | 128 +++++++++--------- 1 file changed, 63 insertions(+), 65 deletions(-) diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py index c80823b0803..7d913788054 100644 --- a/release/scripts/startup/bl_ui/properties_data_modifier.py +++ b/release/scripts/startup/bl_ui/properties_data_modifier.py @@ -740,7 +740,6 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel): @staticmethod def vertex_weight_mask(layout, ob, md): layout.label(text="Influence/Mask Options:") - row = layout.row() split = layout.split(percentage=0.4) split.label(text="Global Influence:") @@ -757,9 +756,11 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel): split.template_ID(md, "mask_texture", new="texture.new") if md.mask_texture: split = layout.split() + col = split.column() col.label(text="Texture Coordinates:") col.prop(md, "mask_tex_mapping", text="") + col = split.column() col.label(text="Use Channel:") col.prop(md, "mask_tex_use_channel", text="") @@ -770,88 +771,85 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel): layout.prop_search(md, "mask_tex_uv_layer", ob.data, "uv_textures") def VERTEX_WEIGHT_EDIT(self, layout, ob, md): - if ob.type == 'MESH': - split = layout.split() - col = split.column() - col.label(text="Vertex Group:") - col.prop_search(md, "vertex_group", ob, "vertex_groups", text="") + split = layout.split() + col = split.column() + col.label(text="Vertex Group:") + col.prop_search(md, "vertex_group", ob, "vertex_groups", text="") - col = split.column() - col.label(text="Default Weight:") - col.prop(md, "default_weight", text="") + col = split.column() + col.label(text="Default Weight:") + col.prop(md, "default_weight", text="") - layout.prop(md, "falloff_type") - if md.falloff_type == 'CURVE': - col = layout.column() - col.template_curve_mapping(md, "map_curve") + layout.prop(md, "falloff_type") + if md.falloff_type == 'CURVE': + col = layout.column() + col.template_curve_mapping(md, "map_curve") - split = layout.split(percentage=0.4) - split.prop(md, "use_add") - row = split.row() - row.active = md.use_add - row.prop(md, "add_threshold") + split = layout.split(percentage=0.4) + split.prop(md, "use_add") + row = split.row() + row.active = md.use_add + row.prop(md, "add_threshold") - split = layout.split(percentage=0.4) - split.prop(md, "use_remove") - row = split.row() - row.active = md.use_remove - row.prop(md, "remove_threshold") + split = layout.split(percentage=0.4) + split.prop(md, "use_remove") + row = split.row() + row.active = md.use_remove + row.prop(md, "remove_threshold") - # Common mask options… - layout.separator() - self.vertex_weight_mask(layout, ob, md) + # Common mask options + layout.separator() + self.vertex_weight_mask(layout, ob, md) def VERTEX_WEIGHT_MIX(self, layout, ob, md): - if ob.type == 'MESH': - split = layout.split() - col = split.column() - col.label(text="Vertex Group A:") - col.prop_search(md, "vertex_group_a", ob, "vertex_groups", text="") - col.label(text="Default Weight A:") - col.prop(md, "default_weight_a", text="") + split = layout.split() + + col = split.column() + col.label(text="Vertex Group A:") + col.prop_search(md, "vertex_group_a", ob, "vertex_groups", text="") + col.label(text="Default Weight A:") + col.prop(md, "default_weight_a", text="") - col.label(text="Mix Mode:") - col.prop(md, "mix_mode", text="") + col.label(text="Mix Mode:") + col.prop(md, "mix_mode", text="") - col = split.column() - col.label(text="Vertex Group B:") - col.prop_search(md, "vertex_group_b", ob, "vertex_groups", text="") - col.label(text="Default Weight B:") - col.prop(md, "default_weight_b", text="") + col = split.column() + col.label(text="Vertex Group B:") + col.prop_search(md, "vertex_group_b", ob, "vertex_groups", text="") + col.label(text="Default Weight B:") + col.prop(md, "default_weight_b", text="") - col.label(text="Mix Set:") - col.prop(md, "mix_set", text="") + col.label(text="Mix Set:") + col.prop(md, "mix_set", text="") - # Common mask options… - layout.separator() - self.vertex_weight_mask(layout, ob, md) + # Common mask options + layout.separator() + self.vertex_weight_mask(layout, ob, md) def VERTEX_WEIGHT_PROXIMITY(self, layout, ob, md): - if ob.type == 'MESH': - split = layout.split() - col = split.column() - col.label(text="Vertex Group:") - col.prop_search(md, "vertex_group", ob, "vertex_groups", text="") + split = layout.split() + + col = split.column() + col.label(text="Vertex Group:") + col.prop_search(md, "vertex_group", ob, "vertex_groups", text="") - col = split.column() - col.label(text="Target Object:") - col.prop(md, "target", text="") + col = split.column() + col.label(text="Target Object:") + col.prop(md, "target", text="") - row = layout.row() - row.prop(md, "proximity_mode", expand=True) - if md.proximity_mode == 'GEOMETRY': - row = layout.row() - row.prop(md, "proximity_geometry", expand=True) + layout.row().prop(md, "proximity_mode", expand=True) + if md.proximity_mode == 'GEOMETRY': + layout.row().prop(md, "proximity_geometry", expand=True) - row = layout.split() - row.prop(md, "min_dist") - row.prop(md, "max_dist") + row = layout.row() + row.prop(md, "min_dist") + row.prop(md, "max_dist") - layout.prop(md, "falloff_type") + layout.prop(md, "falloff_type") - # Common mask options… - layout.separator() - self.vertex_weight_mask(layout, ob, md) + # Common mask options + layout.separator() + self.vertex_weight_mask(layout, ob, md) if __name__ == "__main__": # only for live edit. bpy.utils.register_module(__name__) From d6363ee8258d2d6ad42432f6f6251ff2b1f8a82f Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Thu, 8 Sep 2011 11:12:25 +0000 Subject: [PATCH 148/182] Modifier UV Project UI: * Code cleanup. --- .../startup/bl_ui/properties_data_modifier.py | 41 +++++++++---------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py index 7d913788054..8d4e3f153b1 100644 --- a/release/scripts/startup/bl_ui/properties_data_modifier.py +++ b/release/scripts/startup/bl_ui/properties_data_modifier.py @@ -608,32 +608,31 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel): layout.label(text="Settings can be found inside the Physics context") def UV_PROJECT(self, layout, ob, md): - if ob.type == 'MESH': - split = layout.split() + split = layout.split() - col = split.column() - col.label(text="Image:") - col.prop(md, "image", text="") + col = split.column() + col.label(text="Image:") + col.prop(md, "image", text="") - col = split.column() - col.label(text="UV Layer:") - col.prop_search(md, "uv_layer", ob.data, "uv_textures", text="") + col = split.column() + col.label(text="UV Layer:") + col.prop_search(md, "uv_layer", ob.data, "uv_textures", text="") - split = layout.split() - col = split.column() - col.prop(md, "use_image_override") - col.prop(md, "projector_count", text="Projectors") - for proj in md.projectors: - col.prop(proj, "object", text="") + split = layout.split() + col = split.column() + col.prop(md, "use_image_override") + col.prop(md, "projector_count", text="Projectors") + for proj in md.projectors: + col.prop(proj, "object", text="") - col = split.column() - sub = col.column(align=True) - sub.prop(md, "aspect_x", text="Aspect X") - sub.prop(md, "aspect_y", text="Aspect Y") + col = split.column() + sub = col.column(align=True) + sub.prop(md, "aspect_x", text="Aspect X") + sub.prop(md, "aspect_y", text="Aspect Y") - sub = col.column(align=True) - sub.prop(md, "scale_x", text="Scale X") - sub.prop(md, "scale_y", text="Scale Y") + sub = col.column(align=True) + sub.prop(md, "scale_x", text="Scale X") + sub.prop(md, "scale_y", text="Scale Y") def WARP(self, layout, ob, md): use_falloff = (md.falloff_type != 'NONE') From 41703b851dfff378fbd0bd652d4c5ded55a07743 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Thu, 8 Sep 2011 12:53:01 +0000 Subject: [PATCH 149/182] Modifiers: put uv project and vertex weight modifiers in separate category, couldn't really think of a good name for it, suggestions welcome. --- source/blender/makesrna/intern/rna_modifier.c | 1 + 1 file changed, 1 insertion(+) diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index d5c7002e07f..07967103a40 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -68,6 +68,7 @@ EnumPropertyItem modifier_type_items[] ={ {eModifierType_Screw, "SCREW", ICON_MOD_SCREW, "Screw", ""}, {eModifierType_Solidify, "SOLIDIFY", ICON_MOD_SOLIDIFY, "Solidify", ""}, {eModifierType_Subsurf, "SUBSURF", ICON_MOD_SUBSURF, "Subdivision Surface", ""}, + {0, "", 0, "Modify", ""}, {eModifierType_UVProject, "UV_PROJECT", ICON_MOD_UVPROJECT, "UV Project", ""}, {eModifierType_WeightVGEdit, "VERTEX_WEIGHT_EDIT", ICON_MOD_VERTEX_WEIGHT, "Vertex Weight Edit", ""}, {eModifierType_WeightVGMix, "VERTEX_WEIGHT_MIX", ICON_MOD_VERTEX_WEIGHT, "Vertex Weight Mix", ""}, From ff0a452a8a49a9bcd5a3fd9f96e240425e267aa6 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Thu, 8 Sep 2011 13:22:26 +0000 Subject: [PATCH 150/182] Fix #28310: import of key configuration with modal keymap not working. --- source/blender/windowmanager/intern/wm_keymap.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/source/blender/windowmanager/intern/wm_keymap.c b/source/blender/windowmanager/intern/wm_keymap.c index 0e94ad72d35..854fa688ea4 100644 --- a/source/blender/windowmanager/intern/wm_keymap.c +++ b/source/blender/windowmanager/intern/wm_keymap.c @@ -47,6 +47,7 @@ #include "BKE_blender.h" #include "BKE_context.h" #include "BKE_idprop.h" +#include "BKE_global.h" #include "BKE_library.h" #include "BKE_main.h" #include "BKE_screen.h" @@ -680,6 +681,17 @@ wmKeyMap *WM_modalkeymap_add(wmKeyConfig *keyconf, const char *idname, EnumPrope wmKeyMap *km= WM_keymap_find(keyconf, idname, 0, 0); km->flag |= KEYMAP_MODAL; km->modal_items= items; + + if(!items) { + /* init modal items from default config */ + wmWindowManager *wm = G.main->wm.first; + wmKeyMap *defaultkm= WM_keymap_list_find(&wm->defaultconf->keymaps, km->idname, 0, 0); + + if(defaultkm) { + km->modal_items = defaultkm->modal_items; + km->poll = defaultkm->poll; + } + } return km; } From 899bd19c7150cb401e90c5c844d14fe6c7757ae2 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Thu, 8 Sep 2011 19:05:52 +0000 Subject: [PATCH 151/182] Forgot to add FFmpeg DLLs list to linuxcross config. --- build_files/scons/config/linuxcross-config.py | 1 + 1 file changed, 1 insertion(+) diff --git a/build_files/scons/config/linuxcross-config.py b/build_files/scons/config/linuxcross-config.py index 1bdf735f458..8057d478c31 100644 --- a/build_files/scons/config/linuxcross-config.py +++ b/build_files/scons/config/linuxcross-config.py @@ -127,6 +127,7 @@ WITH_BF_BINRELOC = False WITH_BF_FFMPEG = True # -DWITH_FFMPEG BF_FFMPEG = LIBDIR + '/ffmpeg' BF_FFMPEG_LIB = 'avformat-53 avcodec-53 avdevice-53 avutil-51 swscale-2' +BF_FFMPEG_DLL = '${BF_FFMPEG_LIBPATH}/avformat-53.dll ${BF_FFMPEG_LIBPATH}/avcodec-53.dll ${BF_FFMPEG_LIBPATH}/avdevice-53.dll ${BF_FFMPEG_LIBPATH}/avutil-51.dll ${BF_FFMPEG_LIBPATH}/swscale-2.dll' BF_FFMPEG_INC = '${BF_FFMPEG}/include' BF_FFMPEG_LIBPATH = '${BF_FFMPEG}/lib' BF_FFMPEG_DLL = '${BF_FFMPEG_LIBPATH}/avformat-53.dll ${BF_FFMPEG_LIBPATH}/avcodec-53.dll ${BF_FFMPEG_LIBPATH}/avdevice-53.dll ${BF_FFMPEG_LIBPATH}/avutil-51.dll ${BF_FFMPEG_LIBPATH}/swscale-2.dll' From 4eb9b9e4f1b8aec1e939bd6ca5f60728d5902448 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 8 Sep 2011 23:59:47 +0000 Subject: [PATCH 152/182] bpy api - add new page for best-practice (so Thomas has something to point to when kicking devs for writing shoddy UI layouts) --- doc/python_api/rst/info_best_practice.rst | 65 +++++++++++++++++++++++ doc/python_api/rst/info_quickstart.rst | 46 ---------------- doc/python_api/sphinx_doc_gen.py | 1 + 3 files changed, 66 insertions(+), 46 deletions(-) create mode 100644 doc/python_api/rst/info_best_practice.rst diff --git a/doc/python_api/rst/info_best_practice.rst b/doc/python_api/rst/info_best_practice.rst new file mode 100644 index 00000000000..2fbc636613c --- /dev/null +++ b/doc/python_api/rst/info_best_practice.rst @@ -0,0 +1,65 @@ +************* +Best Practice +************* + + +TODO: Intro text + + +Style Conventions +================= + +For Blender 2.5 we have chosen to follow python suggested style guide to avoid mixing styles amongst our own scripts and make it easier to use python scripts from other projects. + +Using our style guide for your own scripts makes it easier if you eventually want to contribute them to blender. + +This style guide is known as pep8 and can be found `here `_ + +A brief listing of pep8 criteria. + +* camel caps for class names: MyClass + +* all lower case underscore separated module names: my_module + +* indentation of 4 spaces (no tabs) + +* spaces around operators. ``1 + 1``, not ``1+1`` + +* only use explicit imports, (no importing '*') + +* don't use single line: ``if val: body``, separate onto 2 lines instead. + + +As well as pep8 we have other conventions used for blender python scripts. + +* Use single quotes for enums, and double quotes for strings. + + Both are of course strings but in our internal API enums are unique items from a limited set. eg. + + .. code-block:: python + + bpy.context.scene.render.file_format = 'PNG' + bpy.context.scene.render.filepath = "//render_out" + +* pep8 also defines that lines should not exceed 79 characters, we felt this is too restrictive so this is optional per script. + +Periodically we run checks for pep8 compliance on blender scripts, for scripts to be included in this check add this line as a comment at the top of the script. + +``# `` + +To enable line length checks use this instead. + +``# `` + + +User Interface Layout +===================== + +TODO: Thomas + + +Script Efficiency +================= + +TODO: Campbell + diff --git a/doc/python_api/rst/info_quickstart.rst b/doc/python_api/rst/info_quickstart.rst index 751e5e1ec61..e7f2900b212 100644 --- a/doc/python_api/rst/info_quickstart.rst +++ b/doc/python_api/rst/info_quickstart.rst @@ -420,49 +420,3 @@ Using Low-Level Functions: fcu_z.keyframe_points[0].co = 10.0, 0.0 fcu_z.keyframe_points[1].co = 20.0, 1.0 - -Style Conventions -================= - -For Blender 2.5 we have chosen to follow python suggested style guide to avoid mixing styles amongst our own scripts and make it easier to use python scripts from other projects. - -Using our style guide for your own scripts makes it easier if you eventually want to contribute them to blender. - -This style guide is known as pep8 and can be found `here `_ - -A brief listing of pep8 criteria. - -* camel caps for class names: MyClass - -* all lower case underscore separated module names: my_module - -* indentation of 4 spaces (no tabs) - -* spaces around operators. ``1 + 1``, not ``1+1`` - -* only use explicit imports, (no importing '*') - -* don't use single line: ``if val: body``, separate onto 2 lines instead. - - -As well as pep8 we have other conventions used for blender python scripts. - -* Use single quotes for enums, and double quotes for strings. - - Both are of course strings but in our internal API enums are unique items from a limited set. eg. - - .. code-block:: python - - bpy.context.scene.render.file_format = 'PNG' - bpy.context.scene.render.filepath = "//render_out" - -* pep8 also defines that lines should not exceed 79 characters, we felt this is too restrictive so this is optional per script. - -Periodically we run checks for pep8 compliance on blender scripts, for scripts to be included in this check add this line as a comment at the top of the script. - -``# `` - -To enable line length checks use this instead. - -``# `` - diff --git a/doc/python_api/sphinx_doc_gen.py b/doc/python_api/sphinx_doc_gen.py index a7657fad432..ac2a498efc2 100644 --- a/doc/python_api/sphinx_doc_gen.py +++ b/doc/python_api/sphinx_doc_gen.py @@ -103,6 +103,7 @@ sphinx-build doc/python_api/sphinx-in doc/python_api/sphinx-out INFO_DOCS = ( ("info_quickstart.rst", "Blender/Python Quickstart: new to blender/scripting and want to get you're feet wet?"), ("info_overview.rst", "Blender/Python API Overview: a more complete explanation of python integration"), + ("info_best_practice.rst", "Best Practice: Conventions to follow for writing good scripts"), ("info_tips_and_tricks.rst", "Tips and Tricks: Hints to help you while writeing scripts for blender"), ("info_gotcha.rst", "Gotcha's: some of the problems you may come up against when writing scripts"), ) From ae7401751c126dfd0373d6f16b71d0311c1c2ea2 Mon Sep 17 00:00:00 2001 From: "Guillermo S. Romero" Date: Fri, 9 Sep 2011 00:46:00 +0000 Subject: [PATCH 153/182] SVN maintenance. --- source/blender/makesdna/DNA_modifier_types.h | 4 ++-- source/blender/modifiers/intern/MOD_weightvg_util.c | 2 +- source/blender/modifiers/intern/MOD_weightvg_util.h | 4 ++-- source/blender/modifiers/intern/MOD_weightvgedit.c | 10 +++++----- source/blender/modifiers/intern/MOD_weightvgmix.c | 12 ++++++------ .../blender/modifiers/intern/MOD_weightvgproximity.c | 10 +++++----- 6 files changed, 21 insertions(+), 21 deletions(-) diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index 32a78cb823a..d09e56a5708 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -818,7 +818,7 @@ typedef struct WeightVGEditModifierData { int mask_tex_mapping; char mask_tex_uvlayer_name[32]; /* Name of the UV layer. */ - /* Padding… */ + /* Padding... */ int pad_i1; } WeightVGEditModifierData; @@ -863,7 +863,7 @@ typedef struct WeightVGMixModifierData { int mask_tex_mapping; /* How to map the texture! */ char mask_tex_uvlayer_name[32]; /* Name of the UV layer. */ - /* Padding… */ + /* Padding... */ int pad_i1; } WeightVGMixModifierData; diff --git a/source/blender/modifiers/intern/MOD_weightvg_util.c b/source/blender/modifiers/intern/MOD_weightvg_util.c index 51465cc80b0..98615c70553 100644 --- a/source/blender/modifiers/intern/MOD_weightvg_util.c +++ b/source/blender/modifiers/intern/MOD_weightvg_util.c @@ -135,7 +135,7 @@ void weightvg_do_mask(int num, const int *indices, float *org_w, const float *ne MappingInfoModifierData t_map; float (*v_co)[3]; - /* Use new generic get_texture_coords, but do not modify our DNA struct for it… + /* Use new generic get_texture_coords, but do not modify our DNA struct for it... * XXX Why use a ModifierData stuff here ? Why not a simple, generic struct for parameters ? * What e.g. if a modifier wants to use several textures ? * Why use only v_co, and not MVert (or both) ? diff --git a/source/blender/modifiers/intern/MOD_weightvg_util.h b/source/blender/modifiers/intern/MOD_weightvg_util.h index 00c63a3d5d5..ce3520f1900 100644 --- a/source/blender/modifiers/intern/MOD_weightvg_util.h +++ b/source/blender/modifiers/intern/MOD_weightvg_util.h @@ -44,7 +44,7 @@ struct Tex; /* * XXX I'd like to make modified weights visible in WeightPaint mode, - * but couldn't figure a way to do this… + * but couldn't figure a way to do this... * Maybe this will need changes in mesh_calc_modifiers (DerivedMesh.c)? * Or the WeightPaint mode code itself? */ @@ -53,7 +53,7 @@ struct Tex; * Util functions. * **************************************/ -/* We cannot divide by zero (what a surprise…). +/* We cannot divide by zero (what a surprise...). * So if -MOD_WEIGHTVGROUP_DIVMODE_ZEROFLOOR < weightf < MOD_WEIGHTVGROUP_DIVMODE_ZEROFLOOR, * we clamp weightf to this value (or its negative version). * Also used to avoid null power factor. diff --git a/source/blender/modifiers/intern/MOD_weightvgedit.c b/source/blender/modifiers/intern/MOD_weightvgedit.c index 0b6b69b2b3c..fb6d4dc10e6 100644 --- a/source/blender/modifiers/intern/MOD_weightvgedit.c +++ b/source/blender/modifiers/intern/MOD_weightvgedit.c @@ -28,7 +28,7 @@ /* * XXX I'd like to make modified weights visible in WeightPaint mode, - * but couldn't figure a way to do this… + * but couldn't figure a way to do this... * Maybe this will need changes in mesh_calc_modifiers (DerivedMesh.c)? * Or the WeightPaint mode code itself? */ @@ -211,13 +211,13 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der if (defgrp_idx < 0) return dm; - /* XXX All this to avoid copying dm when not needed… However, it nearly doubles compute - * time! See scene 5 of the WeighVG test file… + /* XXX All this to avoid copying dm when not needed... However, it nearly doubles compute + * time! See scene 5 of the WeighVG test file... */ #if 0 /* Get actual dverts (ie vertex group data). */ dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT); - /* If no dverts, return unmodified data… */ + /* If no dverts, return unmodified data... */ if (dvert == NULL) return dm; @@ -231,7 +231,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der /* Create a copy of our dmesh, only if our affected cdata layer is the same as org mesh. */ if (dvert == CustomData_get_layer(&ob_m->vdata, CD_MDEFORMVERT)) { /* XXX Seems to create problems with weightpaint mode??? - * I'm missing something here, I guess… + * I'm missing something here, I guess... */ // DM_set_only_copy(dm, CD_MASK_MDEFORMVERT); /* Only copy defgroup layer. */ ret = CDDM_copy(dm); diff --git a/source/blender/modifiers/intern/MOD_weightvgmix.c b/source/blender/modifiers/intern/MOD_weightvgmix.c index 8bfc56fc18f..f1422a342eb 100644 --- a/source/blender/modifiers/intern/MOD_weightvgmix.c +++ b/source/blender/modifiers/intern/MOD_weightvgmix.c @@ -28,7 +28,7 @@ /* * XXX I'd like to make modified weights visible in WeightPaint mode, - * but couldn't figure a way to do this… + * but couldn't figure a way to do this... * Maybe this will need changes in mesh_calc_modifiers (DerivedMesh.c)? * Or the WeightPaint mode code itself? */ @@ -62,7 +62,7 @@ static float mix_weight(float weight, float weight2, char mix_mode) #if 0 /* * XXX Don't know why, but the switch version takes many CPU time, - * and produces lag in realtime playback… + * and produces lag in realtime playback... */ switch (mix_mode) { @@ -258,13 +258,13 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der return dm; } - /* XXX All this to avoid copying dm when not needed… However, it nearly doubles compute - * time! See scene 5 of the WeighVG test file… + /* XXX All this to avoid copying dm when not needed... However, it nearly doubles compute + * time! See scene 5 of the WeighVG test file... */ #if 0 /* Get actual dverts (ie vertex group data). */ dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT); - /* If no dverts, return unmodified data… */ + /* If no dverts, return unmodified data... */ if (dvert == NULL) return dm; @@ -278,7 +278,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der /* Create a copy of our dmesh, only if our affected cdata layer is the same as org mesh. */ if (dvert == CustomData_get_layer(&ob_m->vdata, CD_MDEFORMVERT)) { /* XXX Seems to create problems with weightpaint mode??? - * I'm missing something here, I guess… + * I'm missing something here, I guess... */ // DM_set_only_copy(dm, CD_MASK_MDEFORMVERT); /* Only copy defgroup layer. */ ret = CDDM_copy(dm); diff --git a/source/blender/modifiers/intern/MOD_weightvgproximity.c b/source/blender/modifiers/intern/MOD_weightvgproximity.c index 0dbf8a91d21..af3f71d6099 100644 --- a/source/blender/modifiers/intern/MOD_weightvgproximity.c +++ b/source/blender/modifiers/intern/MOD_weightvgproximity.c @@ -28,7 +28,7 @@ /* * XXX I'd like to make modified weights visible in WeightPaint mode, - * but couldn't figure a way to do this… + * but couldn't figure a way to do this... * Maybe this will need changes in mesh_calc_modifiers (DerivedMesh.c)? * Or the WeightPaint mode code itself? */ @@ -385,13 +385,13 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der if (defgrp_idx < 0) return dm; - /* XXX All this to avoid copying dm when not needed… However, it nearly doubles compute - * time! See scene 5 of the WeighVG test file… + /* XXX All this to avoid copying dm when not needed... However, it nearly doubles compute + * time! See scene 5 of the WeighVG test file... */ #if 0 /* Get actual dverts (ie vertex group data). */ dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT); - /* If no dverts, return unmodified data… */ + /* If no dverts, return unmodified data... */ if (dvert == NULL) return dm; @@ -405,7 +405,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *der /* Create a copy of our dmesh, only if our affected cdata layer is the same as org mesh. */ if (dvert == CustomData_get_layer(&ob_m->vdata, CD_MDEFORMVERT)) { /* XXX Seems to create problems with weightpaint mode??? - * I'm missing something here, I guess… + * I'm missing something here, I guess... */ // DM_set_only_copy(dm, CD_MASK_MDEFORMVERT); /* Only copy defgroup layer. */ ret = CDDM_copy(dm); From a59ba9a519c076aad17e00442e3fc0ad6bf26284 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 9 Sep 2011 01:29:53 +0000 Subject: [PATCH 154/182] - turn RNA_warning into a macro which includes the function name (was being written in manually but had incorrect func names in places). - add __func__ define to BLI_utildefines.h for MSVC. --- source/blender/blenlib/BLI_utildefines.h | 6 +++ .../editors/interface/interface_layout.c | 38 ++++++++--------- .../editors/interface/interface_templates.c | 42 ++++++++++--------- source/blender/makesrna/RNA_access.h | 6 ++- source/blender/makesrna/intern/rna_access.c | 3 +- source/blender/makesrna/intern/rna_ui_api.c | 2 +- source/blender/python/intern/bpy_rna.c | 24 +++++------ 7 files changed, 67 insertions(+), 54 deletions(-) diff --git a/source/blender/blenlib/BLI_utildefines.h b/source/blender/blenlib/BLI_utildefines.h index 1a1f7be2471..9a3b81e5776 100644 --- a/source/blender/blenlib/BLI_utildefines.h +++ b/source/blender/blenlib/BLI_utildefines.h @@ -176,6 +176,12 @@ /* useful for debugging */ #define AT __FILE__ ":" STRINGIFY(__LINE__) +/* so we can use __func__ everywhere */ +#if defined(_MSC_VER) +# define __func__ __FUNCTION__ +#endif + + /* UNUSED macro, for function argument */ #ifdef __GNUC__ # define UNUSED(x) UNUSED_ ## x __attribute__((__unused__)) diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c index 803da55cea6..3e3e6da188e 100644 --- a/source/blender/editors/interface/interface_layout.c +++ b/source/blender/editors/interface/interface_layout.c @@ -630,7 +630,7 @@ PointerRNA uiItemFullO(uiLayout *layout, const char *opname, const char *name, i if(!ot) { ui_item_disabled(layout, opname); - RNA_warning("uiItemFullO: unknown operator '%s'\n", opname); + RNA_warning("unknown operator '%s'", opname); return PointerRNA_NULL; } @@ -737,7 +737,7 @@ void uiItemsFullEnumO(uiLayout *layout, const char *opname, const char *propname if(!ot || !ot->srna) { ui_item_disabled(layout, opname); - RNA_warning("uiItemsFullEnumO: %s '%s'\n", ot ? "unknown operator" : "operator missing srna", opname); + RNA_warning("%s '%s'", ot ? "unknown operator" : "operator missing srna", opname); return; } @@ -815,7 +815,7 @@ void uiItemEnumO_value(uiLayout *layout, const char *name, int icon, const char /* pass */ } else { - RNA_warning("uiItemEnumO_value: %s.%s not found.\n", RNA_struct_identifier(ptr.type), propname); + RNA_warning("%s.%s not found.", RNA_struct_identifier(ptr.type), propname); return; } @@ -844,7 +844,7 @@ void uiItemEnumO_string(uiLayout *layout, const char *name, int icon, const char RNA_property_enum_items(layout->root->block->evil_C, &ptr, prop, &item, NULL, &free); if(item==NULL || RNA_enum_value_from_id(item, value_str, &value)==0) { if(free) MEM_freeN(item); - RNA_warning("uiItemEnumO_string: %s.%s, enum %s not found.\n", RNA_struct_identifier(ptr.type), propname, value_str); + RNA_warning("%s.%s, enum %s not found.", RNA_struct_identifier(ptr.type), propname, value_str); return; } @@ -852,7 +852,7 @@ void uiItemEnumO_string(uiLayout *layout, const char *name, int icon, const char MEM_freeN(item); } else { - RNA_warning("uiItemEnumO_string: %s.%s not found.\n", RNA_struct_identifier(ptr.type), propname); + RNA_warning("%s.%s not found.", RNA_struct_identifier(ptr.type), propname); return; } @@ -1059,7 +1059,7 @@ void uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, int flag, if(!prop) { ui_item_disabled(layout, propname); - RNA_warning("uiItemR: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname); + RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname); return; } @@ -1072,7 +1072,7 @@ void uiItemEnumR(uiLayout *layout, const char *name, int icon, struct PointerRNA if(!prop || RNA_property_type(prop) != PROP_ENUM) { ui_item_disabled(layout, propname); - RNA_warning("uiItemEnumR: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname); + RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname); return; } @@ -1087,7 +1087,7 @@ void uiItemEnumR_string(uiLayout *layout, struct PointerRNA *ptr, const char *pr if(!prop || RNA_property_type(prop) != PROP_ENUM) { ui_item_disabled(layout, propname); - RNA_warning("uiItemEnumR_string: enum property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname); + RNA_warning("enum property not found: %s.%s", RNA_struct_identifier(ptr->type), propname); return; } @@ -1096,7 +1096,7 @@ void uiItemEnumR_string(uiLayout *layout, struct PointerRNA *ptr, const char *pr if(!RNA_enum_value_from_id(item, value, &ivalue)) { if(free) MEM_freeN(item); ui_item_disabled(layout, propname); - RNA_warning("uiItemEnumR: enum property value not found: %s\n", value); + RNA_warning("enum property value not found: %s", value); return; } @@ -1121,12 +1121,12 @@ void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propname if(!prop) { ui_item_disabled(layout, propname); - RNA_warning("uiItemsEnumR: enum property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname); + RNA_warning("enum property not found: %s.%s", RNA_struct_identifier(ptr->type), propname); return; } if(RNA_property_type(prop) != PROP_ENUM) { - RNA_warning("uiItemsEnumR: not an enum property: %s.%s\n", RNA_struct_identifier(ptr->type), propname); + RNA_warning("not an enum property: %s.%s", RNA_struct_identifier(ptr->type), propname); return; } else { @@ -1314,13 +1314,13 @@ void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, const char *propna prop= RNA_struct_find_property(ptr, propname); if(!prop) { - RNA_warning("uiItemPointerR: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname); + RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname); return; } type= RNA_property_type(prop); if(!ELEM(type, PROP_POINTER, PROP_STRING)) { - RNA_warning("uiItemPointerR: property %s must be a pointer or string.\n", propname); + RNA_warning("property %s must be a pointer or string.", propname); return; } @@ -1328,11 +1328,11 @@ void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, const char *propna if(!searchprop) { - RNA_warning("uiItemPointerR: search collection property not found: %s.%s\n", RNA_struct_identifier(ptr->type), searchpropname); + RNA_warning("search collection property not found: %s.%s", RNA_struct_identifier(ptr->type), searchpropname); return; } else if (RNA_property_type(searchprop) != PROP_COLLECTION) { - RNA_warning("uiItemPointerR: search collection property is not a collection type: %s.%s\n", RNA_struct_identifier(ptr->type), searchpropname); + RNA_warning("search collection property is not a collection type: %s.%s", RNA_struct_identifier(ptr->type), searchpropname); return; } @@ -1417,7 +1417,7 @@ void uiItemM(uiLayout *layout, bContext *UNUSED(C), const char *menuname, const mt= WM_menutype_find(menuname, FALSE); if(mt==NULL) { - RNA_warning("uiItemM: not found %s\n", menuname); + RNA_warning("not found %s", menuname); return; } @@ -1537,12 +1537,12 @@ void uiItemMenuEnumO(uiLayout *layout, const char *opname, const char *propname, if(!ot) { ui_item_disabled(layout, opname); - RNA_warning("uiItemMenuEnumO: unknown operator '%s'\n", opname); + RNA_warning("unknown operator '%s'", opname); return; } if(!ot->srna) { ui_item_disabled(layout, opname); - RNA_warning("uiItemMenuEnumO: operator missing srna '%s'\n", opname); + RNA_warning("operator missing srna '%s'", opname); return; } @@ -1575,7 +1575,7 @@ void uiItemMenuEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propn prop= RNA_struct_find_property(ptr, propname); if(!prop) { ui_item_disabled(layout, propname); - RNA_warning("uiItemMenuEnumR: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname); + RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname); return; } diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c index d2cee11c755..8c151712f95 100644 --- a/source/blender/editors/interface/interface_templates.c +++ b/source/blender/editors/interface/interface_templates.c @@ -245,7 +245,7 @@ static void template_id_cb(bContext *C, void *arg_litem, void *arg_event) switch(event) { case UI_ID_BROWSE: case UI_ID_PIN: - RNA_warning("warning, id event %d shouldnt come here\n", event); + RNA_warning("warning, id event %d shouldnt come here", event); break; case UI_ID_OPEN: case UI_ID_ADD_NEW: @@ -488,7 +488,7 @@ static void ui_template_id(uiLayout *layout, bContext *C, PointerRNA *ptr, const prop= RNA_struct_find_property(ptr, propname); if(!prop || RNA_property_type(prop) != PROP_POINTER) { - RNA_warning("uiTemplateID: pointer property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname); + RNA_warning("pointer property not found: %s.%s", RNA_struct_identifier(ptr->type), propname); return; } @@ -549,11 +549,11 @@ void uiTemplateAnyID(uiLayout *layout, PointerRNA *ptr, const char *propname, co propType= RNA_struct_find_property(ptr, proptypename); if (!propID || RNA_property_type(propID) != PROP_POINTER) { - RNA_warning("uiTemplateAnyID: pointer property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname); + RNA_warning("pointer property not found: %s.%s", RNA_struct_identifier(ptr->type), propname); return; } if (!propType || RNA_property_type(propType) != PROP_ENUM) { - RNA_warning("uiTemplateAnyID: pointer-type property not found: %s.%s\n", RNA_struct_identifier(ptr->type), proptypename); + RNA_warning("pointer-type property not found: %s.%s", RNA_struct_identifier(ptr->type), proptypename); return; } @@ -592,7 +592,7 @@ void uiTemplatePathBuilder(uiLayout *layout, PointerRNA *ptr, const char *propna /* check that properties are valid */ propPath= RNA_struct_find_property(ptr, propname); if (!propPath || RNA_property_type(propPath) != PROP_STRING) { - RNA_warning("uiTemplatePathBuilder: path property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname); + RNA_warning("path property not found: %s.%s", RNA_struct_identifier(ptr->type), propname); return; } @@ -855,7 +855,7 @@ uiLayout *uiTemplateModifier(uiLayout *layout, bContext *C, PointerRNA *ptr) /* verify we have valid data */ if(!RNA_struct_is_a(ptr->type, &RNA_Modifier)) { - RNA_warning("uiTemplateModifier: Expected modifier on object.\n"); + RNA_warning("Expected modifier on object."); return NULL; } @@ -863,7 +863,7 @@ uiLayout *uiTemplateModifier(uiLayout *layout, bContext *C, PointerRNA *ptr) md= ptr->data; if(!ob || !(GS(ob->id.name) == ID_OB)) { - RNA_warning("uiTemplateModifier: Expected modifier on object.\n"); + RNA_warning("expected modifier on object."); return NULL; } @@ -1084,7 +1084,7 @@ uiLayout *uiTemplateConstraint(uiLayout *layout, PointerRNA *ptr) /* verify we have valid data */ if(!RNA_struct_is_a(ptr->type, &RNA_Constraint)) { - RNA_warning("uiTemplateConstraint: Expected constraint on object.\n"); + RNA_warning("Expected constraint on object."); return NULL; } @@ -1092,7 +1092,7 @@ uiLayout *uiTemplateConstraint(uiLayout *layout, PointerRNA *ptr) con= ptr->data; if(!ob || !(GS(ob->id.name) == ID_OB)) { - RNA_warning("uiTemplateConstraint: Expected constraint on object.\n"); + RNA_warning("Expected constraint on object."); return NULL; } @@ -1138,7 +1138,7 @@ void uiTemplatePreview(uiLayout *layout, ID *id, int show_buttons, ID *parent, M PointerRNA texture_ptr; if(id && !ELEM4(GS(id->name), ID_MA, ID_TE, ID_WO, ID_LA)) { - RNA_warning("uiTemplatePreview: Expected ID of type material, texture, lamp or world.\n"); + RNA_warning("expected ID of type material, texture, lamp or world."); return; } @@ -1844,12 +1844,14 @@ void uiTemplateCurveMapping(uiLayout *layout, PointerRNA *ptr, const char *propn PointerRNA cptr; if(!prop) { - RNA_warning("uiTemplateCurveMapping: curve property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname); + RNA_warning("curve property not found: %s.%s", + RNA_struct_identifier(ptr->type), propname); return; } if(RNA_property_type(prop) != PROP_POINTER) { - RNA_warning("uiTemplateCurveMapping: curve is not a pointer: %s.%s\n", RNA_struct_identifier(ptr->type), propname); + RNA_warning("curve is not a pointer: %s.%s", + RNA_struct_identifier(ptr->type), propname); return; } @@ -1879,7 +1881,7 @@ void uiTemplateColorWheel(uiLayout *layout, PointerRNA *ptr, const char *propnam float softmin, softmax, step, precision; if (!prop) { - RNA_warning("uiTemplateColorWheel: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname); + RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname); return; } @@ -1949,7 +1951,7 @@ void uiTemplateLayers(uiLayout *layout, PointerRNA *ptr, const char *propname, prop= RNA_struct_find_property(ptr, propname); if (!prop) { - RNA_warning("uiTemplateLayer: layers property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname); + RNA_warning("layers property not found: %s.%s", RNA_struct_identifier(ptr->type), propname); return; } @@ -1966,7 +1968,7 @@ void uiTemplateLayers(uiLayout *layout, PointerRNA *ptr, const char *propname, if(used_ptr && used_propname) { used_prop= RNA_struct_find_property(used_ptr, used_propname); if (!used_prop) { - RNA_warning("uiTemplateLayer: used layers property not found: %s.%s\n", RNA_struct_identifier(ptr->type), used_propname); + RNA_warning("used layers property not found: %s.%s", RNA_struct_identifier(ptr->type), used_propname); return; } @@ -2157,7 +2159,7 @@ void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, const char * pa= block->panel; if(!pa) { - RNA_warning("uiTemplateList: only works inside a panel.\n"); + RNA_warning("only works inside a panel."); return; } @@ -2167,28 +2169,28 @@ void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, const char * if(ptr->data) { prop= RNA_struct_find_property(ptr, propname); if(!prop) { - RNA_warning("uiTemplateList: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname); + RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname); return; } } activeprop= RNA_struct_find_property(activeptr, activepropname); if(!activeprop) { - RNA_warning("uiTemplateList: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), activepropname); + RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), activepropname); return; } if(prop) { type= RNA_property_type(prop); if(type != PROP_COLLECTION) { - RNA_warning("uiTemplateList: Expected collection property.\n"); + RNA_warning("uiExpected collection property."); return; } } activetype= RNA_property_type(activeprop); if(activetype != PROP_INT) { - RNA_warning("uiTemplateList: Expected integer property.\n"); + RNA_warning("expected integer property."); return; } diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h index 5da125bb440..7d013d01e72 100644 --- a/source/blender/makesrna/RNA_access.h +++ b/source/blender/makesrna/RNA_access.h @@ -974,7 +974,11 @@ int RNA_function_call_direct_va_lookup(struct bContext *C, struct ReportList *re short RNA_type_to_ID_code(StructRNA *type); StructRNA *ID_code_to_RNA_type(short idcode); -void RNA_warning(const char *format, ...) + +/* macro which inserts the function name */ +#define RNA_warning(format, args...) _RNA_warning("%s: " format "\n", __func__, ##args) + +void _RNA_warning(const char *format, ...) #ifdef __GNUC__ __attribute__ ((format (printf, 1, 2))) #endif diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c index e7d0c5cdec2..ea23fea0c2c 100644 --- a/source/blender/makesrna/intern/rna_access.c +++ b/source/blender/makesrna/intern/rna_access.c @@ -5374,7 +5374,8 @@ int RNA_property_copy(PointerRNA *ptr, PointerRNA *fromptr, PropertyRNA *prop, i return 0; } -void RNA_warning(const char *format, ...) +/* use RNA_warning macro which includes __func__ suffix */ +void _RNA_warning(const char *format, ...) { va_list args; diff --git a/source/blender/makesrna/intern/rna_ui_api.c b/source/blender/makesrna/intern/rna_ui_api.c index d4ac9880290..92c93f41dfc 100644 --- a/source/blender/makesrna/intern/rna_ui_api.c +++ b/source/blender/makesrna/intern/rna_ui_api.c @@ -46,7 +46,7 @@ static void rna_uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, int flag= 0; if(!prop) { - RNA_warning("rna_uiItemR: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname); + RNA_warning("property not found: %s.%s", RNA_struct_identifier(ptr->type), propname); return; } diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index 2212499d842..4c382efdda3 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -5443,7 +5443,7 @@ static PyObject* pyrna_srna_ExternalType(StructRNA *srna) if(bpy_types==NULL) { PyErr_Print(); PyErr_Clear(); - fprintf(stderr, "pyrna_srna_ExternalType: failed to find 'bpy_types' module\n"); + fprintf(stderr, "%s: failed to find 'bpy_types' module\n", __func__); return NULL; } bpy_types_dict= PyModule_GetDict(bpy_types); // borrow @@ -5457,18 +5457,18 @@ static PyObject* pyrna_srna_ExternalType(StructRNA *srna) PyObject *base_compare= pyrna_srna_PyBase(srna); //PyObject *slots= PyObject_GetAttrString(newclass, "__slots__"); // cant do this because it gets superclasses values! //PyObject *bases= PyObject_GetAttrString(newclass, "__bases__"); // can do this but faster not to. - PyObject *bases= ((PyTypeObject *)newclass)->tp_bases; - PyObject *slots= PyDict_GetItem(((PyTypeObject *)newclass)->tp_dict, bpy_intern_str___slots__); + PyObject *tp_bases= ((PyTypeObject *)newclass)->tp_bases; + PyObject *tp_slots= PyDict_GetItem(((PyTypeObject *)newclass)->tp_dict, bpy_intern_str___slots__); - if(slots==NULL) { - fprintf(stderr, "pyrna_srna_ExternalType: expected class '%s' to have __slots__ defined\n\nSee bpy_types.py\n", idname); + if(tp_slots==NULL) { + fprintf(stderr, "%s: expected class '%s' to have __slots__ defined\n\nSee bpy_types.py\n", __func__, idname); newclass= NULL; } - else if(PyTuple_GET_SIZE(bases)) { - PyObject *base= PyTuple_GET_ITEM(bases, 0); + else if(PyTuple_GET_SIZE(tp_bases)) { + PyObject *base= PyTuple_GET_ITEM(tp_bases, 0); if(base_compare != base) { - fprintf(stderr, "pyrna_srna_ExternalType: incorrect subclassing of SRNA '%s'\nSee bpy_types.py\n", idname); + fprintf(stderr, "%s: incorrect subclassing of SRNA '%s'\nSee bpy_types.py\n", __func__, idname); PyC_ObSpit("Expected! ", base_compare); newclass= NULL; } @@ -5538,7 +5538,7 @@ static PyObject* pyrna_srna_Subtype(StructRNA *srna) } else { /* this should not happen */ - printf("Error registering '%s'\n", idname); + printf("%s: error registering '%s'\n", __func__, idname); PyErr_Print(); PyErr_Clear(); } @@ -5581,7 +5581,7 @@ PyObject *pyrna_struct_CreatePyObject(PointerRNA *ptr) Py_DECREF(tp); /* srna owns, cant hold a ref */ } else { - fprintf(stderr, "Could not make type\n"); + fprintf(stderr, "%s: could not make type\n", __func__); pyrna= (BPy_StructRNA *) PyObject_GC_New(BPy_StructRNA, &pyrna_struct_Type); #ifdef USE_WEAKREFS pyrna->in_weakreflist= NULL; @@ -6231,10 +6231,10 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param #endif py_class= RNA_struct_py_type_get(ptr->type); - /* rare case. can happen when registering subclasses */ if(py_class==NULL) { - fprintf(stderr, "bpy_class_call(): unable to get python class for rna struct '%.200s'\n", RNA_struct_identifier(ptr->type)); + fprintf(stderr, "%s: unable to get python class for rna struct '%.200s'\n", + __func__, RNA_struct_identifier(ptr->type)); return -1; } From fe48e008e5b011bced5544818a1afc9a12ab98f4 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 9 Sep 2011 10:15:14 +0000 Subject: [PATCH 155/182] Fix #28392: some selection operators were working in linked scenes, others not. This allows all object selection operators now, useful for inspecting the scene. --- source/blender/editors/object/object_select.c | 34 +++++++++++++------ 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/source/blender/editors/object/object_select.c b/source/blender/editors/object/object_select.c index cb1fc7541d0..8fdd7a53e91 100644 --- a/source/blender/editors/object/object_select.c +++ b/source/blender/editors/object/object_select.c @@ -121,6 +121,20 @@ void ED_base_object_activate(bContext *C, Base *base) /********************** Selection Operators **********************/ +static int objects_selectable_poll(bContext *C) +{ + /* we don't check for linked scenes here, selection is + still allowed then for inspection of scene */ + Object *obact= CTX_data_active_object(C); + + if(CTX_data_edit_object(C)) + return 0; + if(obact && obact->mode) + return 0; + + return 1; +} + /************************ Select by Type *************************/ static int object_select_by_type_exec(bContext *C, wmOperator *op) @@ -159,7 +173,7 @@ void OBJECT_OT_select_by_type(wmOperatorType *ot) /* api callbacks */ ot->invoke= WM_menu_invoke; ot->exec= object_select_by_type_exec; - ot->poll= ED_operator_objectmode; + ot->poll= objects_selectable_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -341,7 +355,7 @@ void OBJECT_OT_select_linked(wmOperatorType *ot) /* api callbacks */ ot->invoke= WM_menu_invoke; ot->exec= object_select_linked_exec; - ot->poll= ED_operator_objectmode; + ot->poll= objects_selectable_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -667,7 +681,7 @@ void OBJECT_OT_select_grouped(wmOperatorType *ot) /* api callbacks */ ot->invoke= WM_menu_invoke; ot->exec= object_select_grouped_exec; - ot->poll= ED_operator_objectmode; + ot->poll= objects_selectable_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -716,7 +730,7 @@ void OBJECT_OT_select_by_layer(wmOperatorType *ot) /* api callbacks */ /*ot->invoke = XXX - need a int grid popup*/ ot->exec= object_select_by_layer_exec; - ot->poll= ED_operator_objectmode; + ot->poll= objects_selectable_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -754,7 +768,7 @@ void OBJECT_OT_select_inverse(wmOperatorType *ot) /* api callbacks */ ot->exec= object_select_inverse_exec; - ot->poll= ED_operator_objectmode; + ot->poll= objects_selectable_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -815,7 +829,7 @@ void OBJECT_OT_select_all(wmOperatorType *ot) /* api callbacks */ ot->exec= object_select_all_exec; - ot->poll= ED_operator_objectmode; + ot->poll= objects_selectable_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -864,7 +878,7 @@ void OBJECT_OT_select_same_group(wmOperatorType *ot) /* api callbacks */ ot->exec= object_select_same_group_exec; - ot->poll= ED_operator_objectmode; + ot->poll= objects_selectable_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -917,7 +931,7 @@ void OBJECT_OT_select_mirror(wmOperatorType *ot) /* api callbacks */ ot->exec= object_select_mirror_exec; - ot->poll= ED_operator_objectmode; + ot->poll= objects_selectable_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -974,7 +988,7 @@ void OBJECT_OT_select_name(wmOperatorType *ot) /* api callbacks */ ot->exec= object_select_name_exec; - ot->poll= ED_operator_objectmode; + ot->poll= objects_selectable_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -1022,7 +1036,7 @@ void OBJECT_OT_select_random(wmOperatorType *ot) /* api callbacks */ /*ot->invoke= object_select_random_invoke XXX - need a number popup ;*/ ot->exec = object_select_random_exec; - ot->poll= ED_operator_objectmode; + ot->poll= objects_selectable_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; From 2b33c6b0b27c0a4fee5a1a405e012eb4032bba05 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 9 Sep 2011 11:54:13 +0000 Subject: [PATCH 156/182] workaround for msvc not supporting variable length args in macros. --- source/blender/makesrna/RNA_access.h | 6 +++++- source/blender/makesrna/intern/rna_access.c | 5 +++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h index 7d013d01e72..8af4fe7b76b 100644 --- a/source/blender/makesrna/RNA_access.h +++ b/source/blender/makesrna/RNA_access.h @@ -976,7 +976,11 @@ StructRNA *ID_code_to_RNA_type(short idcode); /* macro which inserts the function name */ -#define RNA_warning(format, args...) _RNA_warning("%s: " format "\n", __func__, ##args) +#ifdef __GNUC__ +# define RNA_warning(format, args...) _RNA_warning("%s: " format "\n", __func__, ##args) +#else /* MSVC doesnt support variable length args in macros */ +# define RNA_warning _RNA_warning +#endif void _RNA_warning(const char *format, ...) #ifdef __GNUC__ diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c index ea23fea0c2c..1ccd6d9a1d7 100644 --- a/source/blender/makesrna/intern/rna_access.c +++ b/source/blender/makesrna/intern/rna_access.c @@ -5383,6 +5383,11 @@ void _RNA_warning(const char *format, ...) vprintf(format, args); va_end(args); + /* gcc macro adds '\n', but cant use for other compilers */ +#ifndef __GNUC__ + fputc('\n', stdout); +#endif + #ifdef WITH_PYTHON { extern void PyC_LineSpit(void); From 01744abd8187d1566b336bf38033673aa05b6786 Mon Sep 17 00:00:00 2001 From: Benoit Bolsee Date: Fri, 9 Sep 2011 11:55:38 +0000 Subject: [PATCH 157/182] GPU: add gpu python module with export_shader() function to export GLSL shader. shader = gpu.export_shader(scene,material) Returns the GLSL shader that blender generates to produce the visual effect of material in scene for the purpose of reusing the shader in an external engine. This function is meant to be used in a material exporter so that the GLSL shader can be exported entirely. The return value is a dictionary containing the shader source code and all associated data. The full documentation is under sphinx. Warning: there has been an API between the patch and this commit: uniform['lamp'] and uniform['image'] now return python reference to ID block instead of ID name as before. The X3D exporter that uses this function must be adapted. --- doc/python_api/rst/gpu.rst | 531 ++++ source/blender/gpu/GPU_extensions.h | 2 + source/blender/gpu/GPU_material.h | 74 +- source/blender/gpu/intern/gpu_codegen.c | 139 +- source/blender/gpu/intern/gpu_codegen.h | 103 +- source/blender/gpu/intern/gpu_extensions.c | 7 +- source/blender/gpu/intern/gpu_material.c | 210 +- .../gpu/intern/gpu_shader_material.glsl | 24 +- .../gpu/intern/gpu_shader_material.glsl.c | 2514 +++++++++-------- source/blender/python/SConscript | 2 +- source/blender/python/intern/CMakeLists.txt | 3 + source/blender/python/intern/bpy_interface.c | 2 + source/blender/python/intern/gpu.c | 291 ++ source/blender/python/intern/gpu.h | 41 + 14 files changed, 2571 insertions(+), 1372 deletions(-) create mode 100644 doc/python_api/rst/gpu.rst create mode 100644 source/blender/python/intern/gpu.c create mode 100644 source/blender/python/intern/gpu.h diff --git a/doc/python_api/rst/gpu.rst b/doc/python_api/rst/gpu.rst new file mode 100644 index 00000000000..72a5dc2f5d3 --- /dev/null +++ b/doc/python_api/rst/gpu.rst @@ -0,0 +1,531 @@ + +GPU functions (gpu) +=================== + +***** +Intro +***** + +Module to provide functions concerning the GPU implementation in Blender, in particular +the GLSL shaders that blender generates automatically to render materials in the 3D view +and in the game engine. + +.. warning:: + + The API provided by this module should be consider unstable. The data exposed by the API + are are closely related to Blender's internal GLSL code and may change if the GLSL code + is modified (e.g. new uniform type). + +.. module:: gpu + +********* +Constants +********* + +-------------- +GLSL data type +-------------- + +.. _data-type: + +Type of GLSL data. +For shader uniforms, the data type determines which glUniform function +variant to use to send the uniform value to the GPU. +For vertex attributes, the data type determines which glVertexAttrib function +variant to use to send the vertex attribute to the GPU. + +See export_shader_ + +.. data:: GPU_DATA_1I + + one integer + + :value: 1 + +.. data:: GPU_DATA_1F + + one float + + :value: 2 + +.. data:: GPU_DATA_2F + + two floats + + :value: 3 + +.. data:: GPU_DATA_3F + + three floats + + :value: 4 + +.. data:: GPU_DATA_4F + + four floats + + :value: 5 + +.. data:: GPU_DATA_9F + + matrix 3x3 in column-major order + + :value: 6 + +.. data:: GPU_DATA_16F + + matrix 4x4 in column-major order + + :value: 7 + +.. data:: GPU_DATA_4UB + + four unsigned byte + + :value: 8 + +----------------- +GLSL uniform type +----------------- + +.. _uniform-type: + +Constants that specify the type of uniform used in a GLSL shader. +The uniform type determines the data type, origin and method +of calculation used by Blender to compute the uniform value. + +The calculation of some of the uniforms is based on matrices available in the scene: + + .. _mat4_cam_to_world: + .. _mat4_world_to_cam: + + *mat4_cam_to_world* + Model matrix of the camera. OpenGL 4x4 matrix that converts + camera local coordinates to world coordinates. In blender this is obtained from the + 'matrix_world' attribute of the camera object. + + Some uniform will need the *mat4_world_to_cam* + matrix computed as the inverse of this matrix. + + .. _mat4_object_to_world: + .. _mat4_world_to_object: + + *mat4_object_to_world* + Model matrix of the object that is being rendered. OpenGL 4x4 matric that converts + object local coordinates to world coordinates. In blender this is obtained from the + 'matrix_world' attribute of the object. + + Some uniform will need the *mat4_world_to_object* matrix, computed as the inverse of this matrix. + + .. _mat4_lamp_to_world: + .. _mat4_world_to_lamp: + + *mat4_lamp_to_world* + Model matrix of the lamp lighting the object. OpenGL 4x4 matrix that converts lamp + local coordinates to world coordinates. In blender this is obtained from the + 'matrix_world' attribute of the lamp object. + + Some uniform will need the *mat4_world_to_lamp* matrix + computed as the inverse of this matrix. + +.. data:: GPU_DYNAMIC_OBJECT_VIEWMAT + + The uniform is a 4x4 GL matrix that converts world coordinates to + camera coordinates (see mat4_world_to_cam_). Can be set once per frame. + There is at most one uniform of that type per shader. + + :value: 1 + +.. data:: GPU_DYNAMIC_OBJECT_MAT + + The uniform is a 4x4 GL matrix that converts object coordinates + to world coordinates (see mat4_object_to_world_). Must be set before drawing the object. + There is at most one uniform of that type per shader. + + :value: 2 + +.. data:: GPU_DYNAMIC_OBJECT_VIEWIMAT + + The uniform is a 4x4 GL matrix that converts coordinates + in camera space to world coordinates (see mat4_cam_to_world_). + Can be set once per frame. + There is at most one uniform of that type per shader. + + :value: 3 + +.. data:: GPU_DYNAMIC_OBJECT_IMAT + + The uniform is a 4x4 GL matrix that converts world coodinates + to object coordinates (see mat4_world_to_object_). + Must be set before drawing the object. + There is at most one uniform of that type per shader. + + :value: 4 + +.. data:: GPU_DYNAMIC_OBJECT_COLOR + + The uniform is a vector of 4 float representing a RGB color + alpha defined at object level. + Each values between 0.0 and 1.0. In blender it corresponds to the 'color' attribute of the object. + Must be set before drawing the object. + There is at most one uniform of that type per shader. + + :value: 5 + +.. data:: GPU_DYNAMIC_LAMP_DYNVEC + + The uniform is a vector of 3 float representing the direction of light in camera space. + In Blender, this is computed by + + mat4_world_to_cam_ * (-vec3_lamp_Z_axis) + + as the lamp Z axis points to the opposite direction of light. + The norm of the vector should be unity. Can be set once per frame. + There is one uniform of that type per lamp lighting the material. + + :value: 6 + +.. data:: GPU_DYNAMIC_LAMP_DYNCO + + The uniform is a vector of 3 float representing the position of the light in camera space. + Computed as + + mat4_world_to_cam_ * vec3_lamp_pos + + Can be set once per frame. + There is one uniform of that type per lamp lighting the material. + + :value: 7 + +.. data:: GPU_DYNAMIC_LAMP_DYNIMAT + + The uniform is a 4x4 GL matrix that converts vector in camera space to lamp space. + Computed as + + mat4_world_to_lamp_ * mat4_cam_to_world_ + + Can be set once per frame. + There is one uniform of that type per lamp lighting the material. + + :value: 8 + +.. data:: GPU_DYNAMIC_LAMP_DYNPERSMAT + + The uniform is a 4x4 GL matrix that converts a vector in camera space to shadow buffer depth space. + Computed as + + mat4_perspective_to_depth_ * mat4_lamp_to_perspective_ * mat4_world_to_lamp_ * mat4_cam_to_world_. + + .. _mat4_perspective_to_depth: + + *mat4_perspective_to_depth* is a fixed matrix defined as follow:: + + 0.5 0.0 0.0 0.5 + 0.0 0.5 0.0 0.5 + 0.0 0.0 0.5 0.5 + 0.0 0.0 0.0 1.0 + + This uniform can be set once per frame. There is one uniform of that type per lamp casting shadow in the scene. + + :value: 9 + +.. data:: GPU_DYNAMIC_LAMP_DYNENERGY + + The uniform is a single float representing the lamp energy. In blender it corresponds + to the 'energy' attribute of the lamp data block. + There is one uniform of that type per lamp lighting the material. + + :value: 10 + +.. data:: GPU_DYNAMIC_LAMP_DYNCOL + + The uniform is a vector of 3 float representing the lamp color. + Color elements are between 0.0 and 1.0. In blender it corresponds + to the 'color' attribute of the lamp data block. + There is one uniform of that type per lamp lighting the material. + + :value: 11 + +.. data:: GPU_DYNAMIC_SAMPLER_2DBUFFER + + The uniform is an integer representing an internal texture used for certain effect + (color band, etc). + + :value: 12 + +.. data:: GPU_DYNAMIC_SAMPLER_2DIMAGE + + The uniform is an integer representing a texture loaded from an image file. + + :value: 13 + +.. data:: GPU_DYNAMIC_SAMPLER_2DSHADOW + + The uniform is an integer representing a shadow buffer corresponding to a lamp + casting shadow. + + :value: 14 + +------------------- +GLSL attribute type +------------------- + +.. _attribute-type: + +Type of the vertex attribute used in the GLSL shader. Determines the mesh custom data +layer that contains the vertex attribute. + +.. data:: CD_MTFACE + + Vertex attribute is a UV layer. Data type is vector of 2 float. + + There can be more than one attribute of that type, they are differenciated by name. + In blender, you can retrieve the attribute data with: + + .. code-block:: python + + mesh.uv_textures[attribute['name']] + + :value: 5 + +.. data:: CD_MCOL + + Vertex attribute is color layer. Data type is vector 4 unsigned byte (RGBA). + + There can be more than one attribute of that type, they are differenciated by name. + In blender you can retrieve the attribute data with: + + .. code-block:: python + + mesh.vertex_colors[attribute['name']] + + :value: 6 + +.. data:: CD_ORCO + + Vertex attribute is original coordinates. Data type is vector 3 float. + + There can be only 1 attribute of that type per shader. + In blender you can retrieve the attribute data with: + + .. code-block:: python + + mesh.vertices + + :value: 14 + +.. data:: CD_TANGENT + + Vertex attribute is the tangent vector. Data type is vector 4 float. + + There can be only 1 attribute of that type per shader. + There is currently no way to retrieve this attribute data via the RNA API but a standalone + C function to compute the tangent layer from the other layers can be obtained from + blender.org. + + :value: 18 + +********* +Functions +********* + +.. _export_shader: + +.. function:: export_shader(scene,material) + + Extracts the GLSL shader producing the visual effect of material in scene for the purpose of + reusing the shader in an external engine. This function is meant to be used in material exporter + so that the GLSL shader can be exported entirely. The return value is a dictionary containing the + shader source code and all associated data. + + :arg scene: the scene in which the material in rendered. + :type scene: :class:`bpy.types.Scene` + :arg material: the material that you want to export the GLSL shader + :type material: :class:`bpy.types.Material` + :return: the shader source code and all associated data in a dictionary + :rtype: dictionary + + The dictionary contains the following elements: + + * ['fragment'] : string + fragment shader source code. + + * ['vertex'] : string + vertex shader source code. + + * ['uniforms'] : sequence + list of uniforms used in fragment shader, can be empty list. Each element of the + sequence is a dictionary with the following elements: + + * ['varname'] : string + name of the uniform in the fragment shader. Always of the form 'unf'. + + * ['datatype'] : integer + data type of the uniform variable. Can be one of the following: + + * :data:`gpu.GPU_DATA_1I` : use glUniform1i + * :data:`gpu.GPU_DATA_1F` : use glUniform1fv + * :data:`gpu.GPU_DATA_2F` : use glUniform2fv + * :data:`gpu.GPU_DATA_3F` : use glUniform3fv + * :data:`gpu.GPU_DATA_4F` : use glUniform4fv + * :data:`gpu.GPU_DATA_9F` : use glUniformMatrix3fv + * :data:`gpu.GPU_DATA_16F` : use glUniformMatrix4fv + + * ['type'] : integer + type of uniform, determines the origin and method of calculation. See uniform-type_. + Depending on the type, more elements will be be present. + + * ['lamp'] : :class:`bpy.types.Object` + Reference to the lamp object from which the uniforms value are extracted. Set for the following uniforms types: + + .. hlist:: + :columns: 3 + + * :data:`gpu.GPU_DYNAMIC_LAMP_DYNVEC` + * :data:`gpu.GPU_DYNAMIC_LAMP_DYNCO` + * :data:`gpu.GPU_DYNAMIC_LAMP_DYNIMAT` + * :data:`gpu.GPU_DYNAMIC_LAMP_DYNPERSMAT` + * :data:`gpu.GPU_DYNAMIC_LAMP_DYNENERGY` + * :data:`gpu.GPU_DYNAMIC_LAMP_DYNCOL` + * :data:`gpu.GPU_DYNAMIC_SAMPLER_2DSHADOW` + + Notes: + + * The uniforms :data:`gpu.GPU_DYNAMIC_LAMP_DYNVEC`, :data:`gpu.GPU_DYNAMIC_LAMP_DYNCO`, :data:`gpu.GPU_DYNAMIC_LAMP_DYNIMAT` and :data:`gpu.GPU_DYNAMIC_LAMP_DYNPERSMAT` + refer to the lamp object position and orientation, both of can be derived from the object world matrix: + + .. code-block:: python + + obmat = uniform['lamp'].matrix_world + + where obmat is the mat4_lamp_to_world_ matrix of the lamp as a 2 dimensional array, + the lamp world location location is in obmat[3]. + + * The uniform types :data:`gpu.GPU_DYNAMIC_LAMP_DYNENERGY` and :data:`gpu.GPU_DYNAMIC_LAMP_DYNCOL` refer to the lamp data bloc that you get from: + + .. code-block:: python + + la = uniform['lamp'].data + + from which you get la.energy and la.color + + * Lamp duplication is not supported: if you have duplicated lamps in your scene + (i.e. lamp that are instantiated by dupligroup, etc), this element will only + give you a reference to the orignal lamp and you will not know which instance + of the lamp it is refering too. You can still handle that case in the exporter + by distributing the uniforms amongst the duplicated lamps. + + * ['image'] : :class:`bpy.types.Image` + Reference to the image databloc. Set for uniform type :data:`gpu.GPU_DYNAMIC_SAMPLER_2DIMAGE`. You can get the image data from: + + .. code-block:: python + + # full path to image file + uniform['image'].filepath + # image size as a 2-dimensional array of int + uniform['image'].size + + * ['texnumber'] : integer + Channel number to which the texture is bound when drawing the object. + Set for uniform types :data:`gpu.GPU_DYNAMIC_SAMPLER_2DBUFFER`, :data:`gpu.GPU_DYNAMIC_SAMPLER_2DIMAGE` and :data:`gpu.GPU_DYNAMIC_SAMPLER_2DSHADOW`. + + This is provided for information only: when reusing the shader outside blencer, + you are free to assign the textures to the channel of your choice and to pass + that number channel to the GPU in the uniform. + + * ['texpixels'] : byte array + texture data for uniform type :data:`gpu.GPU_DYNAMIC_SAMPLER_2DBUFFER`. Although + the corresponding uniform is a 2D sampler, the texture is always a 1D texture + of n x 1 pixel. The texture size n is provided in ['texsize'] element. + These texture are only used for computer generated texture (colorband, etc). + The texture data is provided so that you can make a real image out of it in the + exporter. + + * ['texsize'] : integer + horizontal size of texture for uniform type :data:`gpu.GPU_DYNAMIC_SAMPLER_2DBUFFER`. + The texture data is in ['texpixels']. + + * ['attributes'] : sequence + list of attributes used in vertex shader, can be empty. Blender doesn't use + standard attributes except for vertex position and normal. All other vertex + attributes must be passed using the generic glVertexAttrib functions. + The attribute data can be found in the derived mesh custom data using RNA. + Each element of the sequence is a dictionary containing the following elements: + + * ['varname'] : string + name of the uniform in the vertex shader. Always of the form 'att'. + + * ['datatype'] : integer + data type of vertex attribute, can be one of the following: + + * :data:`gpu.GPU_DATA_2F` : use glVertexAttrib2fv + * :data:`gpu.GPU_DATA_3F` : use glVertexAttrib3fv + * :data:`gpu.GPU_DATA_4F` : use glVertexAttrib4fv + * :data:`gpu.GPU_DATA_4UB` : use glVertexAttrib4ubv + + * ['number'] : integer + generic attribute number. This is provided for information only. Blender + doesn't use glBindAttribLocation to place generic attributes at specific location, + it lets the shader compiler place the attributes automatically and query the + placement with glGetAttribLocation. The result of this placement is returned in + this element. + + When using this shader in a render engine, you should either use + glBindAttribLocation to force the attribute at this location or use + glGetAttribLocation to get the placement chosen by the compiler of your GPU. + + * ['type'] : integer + type of the mesh custom data from which the vertex attribute is loaded. + See attribute-type_. + + * ['name'] : string or integer + custom data layer name, used for attribute type :data:`gpu.CD_MTFACE` and :data:`gpu.CD_MCOL`. + + Example: + + .. code-block:: python + + import gpu + # get GLSL shader of material Mat.001 in scene Scene.001 + scene = bpy.data.scenes['Scene.001'] + material = bpy.data.materials['Mat.001'] + shader = gpu.export_shader(scene,material) + # scan the uniform list and find the images used in the shader + for uniform in shader['uniforms']: + if uniform['type'] == gpu.GPU_DYNAMIC_SAMPLER_2DIMAGE: + print("uniform {0} is using image {1}".format(uniform['varname'], uniform['image'].filepath)) + # scan the attribute list and find the UV layer used in the shader + for attribute in shader['attributes']: + if attribute['type'] == gpu.CD_MTFACE: + print("attribute {0} is using UV layer {1}".format(attribute['varname'], attribute['name'])) + +***** +Notes +***** + +.. _mat4_lamp_to_perspective: + +1. Calculation of the *mat4_lamp_to_perspective* matrix for a spot lamp. + + The following pseudo code shows how the *mat4_lamp_to_perspective* matrix is computed + in blender for uniforms of :data:`gpu.GPU_DYNAMIC_LAMP_DYNPERSMAT` type:: + + #Get the lamp datablock with: + lamp=bpy.data.objects[uniform['lamp']].data + + #Compute the projection matrix: + # You will need these lamp attributes: + # lamp.clipsta : near clip plane in world unit + # lamp.clipend : far clip plane in world unit + # lamp.spotsize : angle in degree of the spot light + + #The size of the projection plane is computed with the usual formula: + wsize = lamp.clista * tan(lamp.spotsize/2) + + #And the projection matrix: + mat4_lamp_to_perspective = glFrustum(-wsize,wsize,-wsize,wsize,lamp.clista,lamp.clipend) + +2. Creation of the shadow map for a spot lamp. + + The shadow map is the depth buffer of a render performed by placing the camera at the + spot light position. The size of the shadow map is given by the attribute lamp.bufsize : + shadow map size in pixel, same size in both dimensions. diff --git a/source/blender/gpu/GPU_extensions.h b/source/blender/gpu/GPU_extensions.h index d0c7f9d494f..5a1c0c537c0 100644 --- a/source/blender/gpu/GPU_extensions.h +++ b/source/blender/gpu/GPU_extensions.h @@ -126,6 +126,7 @@ GPUFrameBuffer *GPU_texture_framebuffer(GPUTexture *tex); int GPU_texture_target(GPUTexture *tex); int GPU_texture_opengl_width(GPUTexture *tex); int GPU_texture_opengl_height(GPUTexture *tex); +int GPU_texture_opengl_bindcode(GPUTexture *tex); /* GPU Framebuffer - this is a wrapper for an OpenGL framebuffer object (FBO). in practice @@ -179,6 +180,7 @@ typedef struct GPUVertexAttribs { int type; int glindex; int gltexco; + int attribid; char name[32]; } layer[GPU_MAX_ATTRIB]; diff --git a/source/blender/gpu/GPU_material.h b/source/blender/gpu/GPU_material.h index f563d8cbe92..95a08e6d5b3 100644 --- a/source/blender/gpu/GPU_material.h +++ b/source/blender/gpu/GPU_material.h @@ -37,6 +37,8 @@ #ifndef __GPU_MATERIAL__ #define __GPU_MATERIAL__ +#include "DNA_listBase.h" + #ifdef __cplusplus extern "C" { #endif @@ -46,6 +48,7 @@ struct ImageUser; struct Material; struct Object; struct Lamp; +struct Image; struct bNode; struct LinkNode; struct Scene; @@ -72,7 +75,6 @@ typedef enum GPUType { GPU_VEC4 = 4, GPU_MAT3 = 9, GPU_MAT4 = 16, - GPU_TEX1D = 1001, GPU_TEX2D = 1002, GPU_SHADOW2D = 1003, GPU_ATTRIB = 3001 @@ -107,10 +109,10 @@ typedef struct GPUNodeStack { GPUNodeLink *GPU_attribute(int type, const char *name); GPUNodeLink *GPU_uniform(float *num); -GPUNodeLink *GPU_dynamic_uniform(float *num); +GPUNodeLink *GPU_dynamic_uniform(float *num, int dynamictype, void *data); GPUNodeLink *GPU_image(struct Image *ima, struct ImageUser *iuser); GPUNodeLink *GPU_texture(int size, float *pixels); -GPUNodeLink *GPU_dynamic_texture(struct GPUTexture *tex); +GPUNodeLink *GPU_dynamic_texture(struct GPUTexture *tex, int dynamictype, void *data); GPUNodeLink *GPU_socket(GPUNodeStack *sock); GPUNodeLink *GPU_builtin(GPUBuiltin builtin); @@ -153,6 +155,72 @@ typedef struct GPUShadeResult { void GPU_shadeinput_set(GPUMaterial *mat, struct Material *ma, GPUShadeInput *shi); void GPU_shaderesult_set(GPUShadeInput *shi, GPUShadeResult *shr); +/* Export GLSL shader */ + +typedef enum GPUDynamicType { + GPU_DYNAMIC_NONE = 0, + GPU_DYNAMIC_OBJECT_VIEWMAT = 1, + GPU_DYNAMIC_OBJECT_MAT = 2, + GPU_DYNAMIC_OBJECT_VIEWIMAT = 3, + GPU_DYNAMIC_OBJECT_IMAT = 4, + GPU_DYNAMIC_OBJECT_COLOR = 5, + GPU_DYNAMIC_LAMP_FIRST = 6, + GPU_DYNAMIC_LAMP_DYNVEC = 6, + GPU_DYNAMIC_LAMP_DYNCO = 7, + GPU_DYNAMIC_LAMP_DYNIMAT = 8, + GPU_DYNAMIC_LAMP_DYNPERSMAT = 9, + GPU_DYNAMIC_LAMP_DYNENERGY = 10, + GPU_DYNAMIC_LAMP_DYNCOL = 11, + GPU_DYNAMIC_LAMP_LAST = 11, + GPU_DYNAMIC_SAMPLER_2DBUFFER = 12, + GPU_DYNAMIC_SAMPLER_2DIMAGE = 13, + GPU_DYNAMIC_SAMPLER_2DSHADOW = 14, +} GPUDynamicType; + +typedef enum GPUDataType { + GPU_DATA_NONE = 0, + GPU_DATA_1I = 1, // 1 integer + GPU_DATA_1F = 2, + GPU_DATA_2F = 3, + GPU_DATA_3F = 4, + GPU_DATA_4F = 5, + GPU_DATA_9F = 6, + GPU_DATA_16F = 7, + GPU_DATA_4UB = 8, +} GPUDataType; + +/* this structure gives information of each uniform found in the shader */ +typedef struct GPUInputUniform { + struct GPUInputUniform *next, *prev; + char varname[32]; /* name of uniform in shader */ + GPUDynamicType type; /* type of uniform, data format and calculation derive from it */ + GPUDataType datatype; /* type of uniform data */ + struct Object *lamp; /* when type=GPU_DYNAMIC_LAMP_... or GPU_DYNAMIC_SAMPLER_2DSHADOW */ + struct Image *image; /* when type=GPU_DYNAMIC_SAMPLER_2DIMAGE */ + int texnumber; /* when type=GPU_DYNAMIC_SAMPLER, texture number: 0.. */ + unsigned char *texpixels; /* for internally generated texture, pixel data in RGBA format */ + int texsize; /* size in pixel of the texture in texpixels buffer: for 2D textures, this is S and T size (square texture) */ +} GPUInputUniform; + +typedef struct GPUInputAttribute { + struct GPUInputAttribute *next, *prev; + char varname[32]; /* name of attribute in shader */ + int type; /* from CustomData.type, data type derives from it */ + GPUDataType datatype; /* type of attribute data */ + const char *name; /* layer name */ + int number; /* generic attribute number */ +} GPUInputAttribute; + +typedef struct GPUShaderExport { + ListBase uniforms; + ListBase attributes; + char *vertex; + char *fragment; +} GPUShaderExport; + +GPUShaderExport *GPU_shader_export(struct Scene *scene, struct Material *ma); +void GPU_free_shader_export(GPUShaderExport *shader); + /* Lamps */ GPULamp *GPU_lamp_from_blender(struct Scene *scene, struct Object *ob, struct Object *par); diff --git a/source/blender/gpu/intern/gpu_codegen.c b/source/blender/gpu/intern/gpu_codegen.c index 360f3dbf63f..f02aee8d8af 100644 --- a/source/blender/gpu/intern/gpu_codegen.c +++ b/source/blender/gpu/intern/gpu_codegen.c @@ -64,101 +64,9 @@ extern char datatoc_gpu_shader_vertex_glsl[]; /* structs and defines */ -typedef enum GPUDataSource { - GPU_SOURCE_VEC_UNIFORM, - GPU_SOURCE_BUILTIN, - GPU_SOURCE_TEX_PIXEL, - GPU_SOURCE_TEX, - GPU_SOURCE_ATTRIB -} GPUDataSource; - static const char* GPU_DATATYPE_STR[17] = {"", "float", "vec2", "vec3", "vec4", NULL, NULL, NULL, NULL, "mat3", NULL, NULL, NULL, NULL, NULL, NULL, "mat4"}; -struct GPUNode { - struct GPUNode *next, *prev; - - const char *name; - int tag; - - ListBase inputs; - ListBase outputs; -}; - -struct GPUNodeLink { - GPUNodeStack *socket; - - int attribtype; - const char *attribname; - - int image; - - int texture; - int texturesize; - - void *ptr1, *ptr2; - - int dynamic; - - int type; - int users; - - GPUTexture *dynamictex; - - GPUBuiltin builtin; - - struct GPUOutput *output; -}; - -typedef struct GPUOutput { - struct GPUOutput *next, *prev; - - GPUNode *node; - int type; /* data type = length of vector/matrix */ - GPUNodeLink *link; /* output link */ - int id; /* unique id as created by code generator */ -} GPUOutput; - -typedef struct GPUInput { - struct GPUInput *next, *prev; - - GPUNode *node; - - int type; /* datatype */ - int source; /* data source */ - - int id; /* unique id as created by code generator */ - int texid; /* number for multitexture */ - int attribid; /* id for vertex attributes */ - int bindtex; /* input is responsible for binding the texture? */ - int definetex; /* input is responsible for defining the pixel? */ - int textarget; /* GL_TEXTURE_* */ - int textype; /* datatype */ - - struct Image *ima; /* image */ - struct ImageUser *iuser;/* image user */ - float *dynamicvec; /* vector data in case it is dynamic */ - GPUTexture *tex; /* input texture, only set at runtime */ - int shaderloc; /* id from opengl */ - char shadername[32]; /* name in shader */ - - float vec[16]; /* vector data */ - GPUNodeLink *link; - int dynamictex; /* dynamic? */ - int attribtype; /* attribute type */ - char attribname[32]; /* attribute name */ - int attribfirst; /* this is the first one that is bound */ - GPUBuiltin builtin; /* builtin uniform */ -} GPUInput; - -struct GPUPass { - struct GPUPass *next, *prev; - - ListBase inputs; - struct GPUOutput *output; - struct GPUShader *shader; -}; - /* GLSL code parsing for finding function definitions. * These are stored in a hash for lookup when creating a material. */ @@ -245,8 +153,6 @@ static void gpu_parse_functions_string(GHash *hash, char *code) if(!type && gpu_str_prefix(code, "sampler2DShadow")) type= GPU_SHADOW2D; - if(!type && gpu_str_prefix(code, "sampler1D")) - type= GPU_TEX1D; if(!type && gpu_str_prefix(code, "sampler2D")) type= GPU_TEX2D; @@ -298,9 +204,7 @@ static char *gpu_generate_function_prototyps(GHash *hash) else if(function->paramqual[a] == FUNCTION_QUAL_INOUT) BLI_dynstr_append(ds, "inout "); - if(function->paramtype[a] == GPU_TEX1D) - BLI_dynstr_append(ds, "sampler1D"); - else if(function->paramtype[a] == GPU_TEX2D) + if(function->paramtype[a] == GPU_TEX2D) BLI_dynstr_append(ds, "sampler2D"); else if(function->paramtype[a] == GPU_SHADOW2D) BLI_dynstr_append(ds, "sampler2DShadow"); @@ -542,7 +446,6 @@ static void codegen_print_uniforms_functions(DynStr *ds, ListBase *nodes) /* create exactly one sampler for each texture */ if (codegen_input_has_texture(input) && input->bindtex) BLI_dynstr_appendf(ds, "uniform %s samp%d;\n", - (input->textype == GPU_TEX1D)? "sampler1D": (input->textype == GPU_TEX2D)? "sampler2D": "sampler2DShadow", input->texid); } @@ -947,6 +850,7 @@ static void gpu_node_input_link(GPUNode *node, GPUNodeLink *link, int type) input->textarget = GL_TEXTURE_2D; input->textype = type; input->dynamictex = 1; + input->dynamicdata = link->ptr2; MEM_freeN(link); } else if(link->texture) { @@ -955,14 +859,9 @@ static void gpu_node_input_link(GPUNode *node, GPUNodeLink *link, int type) input->source = GPU_SOURCE_TEX; input->textype = type; - if (type == GPU_TEX1D) { - input->tex = GPU_texture_create_1D(link->texturesize, link->ptr1, NULL); - input->textarget = GL_TEXTURE_1D; - } - else { - input->tex = GPU_texture_create_2D(link->texturesize, link->texturesize, link->ptr2, NULL); - input->textarget = GL_TEXTURE_2D; - } + //input->tex = GPU_texture_create_2D(link->texturesize, link->texturesize, link->ptr2, NULL); + input->tex = GPU_texture_create_2D(link->texturesize, 1, link->ptr1, NULL); + input->textarget = GL_TEXTURE_2D; MEM_freeN(link->ptr1); MEM_freeN(link); @@ -993,8 +892,11 @@ static void gpu_node_input_link(GPUNode *node, GPUNodeLink *link, int type) input->source = GPU_SOURCE_VEC_UNIFORM; memcpy(input->vec, link->ptr1, type*sizeof(float)); - if(link->dynamic) + if(link->dynamic) { input->dynamicvec= link->ptr1; + input->dynamictype= link->dynamictype; + input->dynamicdata= link->ptr2; + } MEM_freeN(link); } @@ -1102,12 +1004,12 @@ static void gpu_nodes_get_vertex_attributes(ListBase *nodes, GPUVertexAttribs *a input->attribfirst = 1; attribs->layer[a].type = input->attribtype; - attribs->layer[a].glindex = input->attribid; + attribs->layer[a].attribid = input->attribid; BLI_strncpy(attribs->layer[a].name, input->attribname, sizeof(attribs->layer[a].name)); } else - input->attribid = attribs->layer[a].glindex; + input->attribid = attribs->layer[a].attribid; } } } @@ -1148,13 +1050,15 @@ GPUNodeLink *GPU_uniform(float *num) return link; } -GPUNodeLink *GPU_dynamic_uniform(float *num) +GPUNodeLink *GPU_dynamic_uniform(float *num, int dynamictype, void *data) { GPUNodeLink *link = GPU_node_link_create(0); link->ptr1= num; - link->ptr2= NULL; + link->ptr2= data; link->dynamic= 1; + link->dynamictype = dynamictype; + return link; } @@ -1181,12 +1085,14 @@ GPUNodeLink *GPU_texture(int size, float *pixels) return link; } -GPUNodeLink *GPU_dynamic_texture(GPUTexture *tex) +GPUNodeLink *GPU_dynamic_texture(GPUTexture *tex, int dynamictype, void *data) { GPUNodeLink *link = GPU_node_link_create(0); link->dynamic = 1; link->dynamictex = tex; + link->dynamictype = dynamictype; + link->ptr2 = data; return link; } @@ -1389,8 +1295,6 @@ GPUPass *GPU_generate_pass(ListBase *nodes, GPUNodeLink *outlink, GPUVertexAttri fragmentcode = code_generate_fragment(nodes, outlink->output, name); vertexcode = code_generate_vertex(nodes); shader = GPU_shader_create(vertexcode, fragmentcode, datatoc_gpu_shader_material_glsl); /*FUNCTION_LIB);*/ - MEM_freeN(fragmentcode); - MEM_freeN(vertexcode); /* failed? */ if (!shader) { @@ -1405,6 +1309,9 @@ GPUPass *GPU_generate_pass(ListBase *nodes, GPUNodeLink *outlink, GPUVertexAttri pass->output = outlink->output; pass->shader = shader; + pass->fragmentcode = fragmentcode; + pass->vertexcode = vertexcode; + pass->libcode = datatoc_gpu_shader_material_glsl; /* extract dynamic inputs and throw away nodes */ GPU_nodes_extract_dynamic_inputs(pass, nodes); @@ -1417,6 +1324,10 @@ void GPU_pass_free(GPUPass *pass) { GPU_shader_free(pass->shader); GPU_inputs_free(&pass->inputs); + if (pass->fragmentcode) + MEM_freeN(pass->fragmentcode); + if (pass->vertexcode) + MEM_freeN(pass->vertexcode); MEM_freeN(pass); } diff --git a/source/blender/gpu/intern/gpu_codegen.h b/source/blender/gpu/intern/gpu_codegen.h index b0a131f5989..1e44eba89d4 100644 --- a/source/blender/gpu/intern/gpu_codegen.h +++ b/source/blender/gpu/intern/gpu_codegen.h @@ -39,12 +39,15 @@ #define __GPU_CODEGEN_H__ #include "DNA_listBase.h" +#include "GPU_material.h" +#include "GL/glew.h" struct ListBase; struct GPUShader; struct GPUOutput; struct GPUNode; struct GPUVertexAttribs; +struct GPUFrameBuffer; #define MAX_FUNCTION_NAME 64 #define MAX_PARAMETER 32 @@ -68,7 +71,105 @@ GPUFunction *GPU_lookup_function(const char *name); at the end if used. */ -struct GPUPass; +typedef enum GPUDataSource { + GPU_SOURCE_VEC_UNIFORM, + GPU_SOURCE_BUILTIN, + GPU_SOURCE_TEX_PIXEL, + GPU_SOURCE_TEX, + GPU_SOURCE_ATTRIB +} GPUDataSource; + +struct GPUNode { + struct GPUNode *next, *prev; + + const char *name; + int tag; + + ListBase inputs; + ListBase outputs; +}; + +struct GPUNodeLink { + GPUNodeStack *socket; + + int attribtype; + const char *attribname; + + int image; + + int texture; + int texturesize; + + void *ptr1, *ptr2; + + int dynamic; + int dynamictype; + + int type; + int users; + + GPUTexture *dynamictex; + + GPUBuiltin builtin; + + struct GPUOutput *output; +}; + +typedef struct GPUOutput { + struct GPUOutput *next, *prev; + + GPUNode *node; + int type; /* data type = length of vector/matrix */ + GPUNodeLink *link; /* output link */ + int id; /* unique id as created by code generator */ +} GPUOutput; + +typedef struct GPUInput { + struct GPUInput *next, *prev; + + GPUNode *node; + + int type; /* datatype */ + int source; /* data source */ + + int id; /* unique id as created by code generator */ + int texid; /* number for multitexture */ + int attribid; /* id for vertex attributes */ + int bindtex; /* input is responsible for binding the texture? */ + int definetex; /* input is responsible for defining the pixel? */ + int textarget; /* GL_TEXTURE_* */ + int textype; /* datatype */ + + struct Image *ima; /* image */ + struct ImageUser *iuser;/* image user */ + float *dynamicvec; /* vector data in case it is dynamic */ + int dynamictype; /* origin of the dynamic uniform (GPUDynamicType) */ + void *dynamicdata; /* data source of the dynamic uniform */ + GPUTexture *tex; /* input texture, only set at runtime */ + int shaderloc; /* id from opengl */ + char shadername[32]; /* name in shader */ + + float vec[16]; /* vector data */ + GPUNodeLink *link; + int dynamictex; /* dynamic? */ + int attribtype; /* attribute type */ + char attribname[32]; /* attribute name */ + int attribfirst; /* this is the first one that is bound */ + GPUBuiltin builtin; /* builtin uniform */ +} GPUInput; + +struct GPUPass { + struct GPUPass *next, *prev; + + ListBase inputs; + struct GPUOutput *output; + struct GPUShader *shader; + char *fragmentcode; + char *vertexcode; + const char *libcode; +}; + + typedef struct GPUPass GPUPass; GPUPass *GPU_generate_pass(ListBase *nodes, struct GPUNodeLink *outlink, diff --git a/source/blender/gpu/intern/gpu_extensions.c b/source/blender/gpu/intern/gpu_extensions.c index c9f1b093b7a..fb9f21cde8c 100644 --- a/source/blender/gpu/intern/gpu_extensions.c +++ b/source/blender/gpu/intern/gpu_extensions.c @@ -423,7 +423,7 @@ static GPUTexture *GPU_texture_create_nD(int w, int h, int n, float *fpixels, in if (tex->target != GL_TEXTURE_1D) { /* CLAMP_TO_BORDER is an OpenGL 1.3 core feature */ - GLenum wrapmode = (depth)? GL_CLAMP_TO_EDGE: GL_CLAMP_TO_BORDER; + GLenum wrapmode = (depth || tex->h == 1)? GL_CLAMP_TO_EDGE: GL_CLAMP_TO_BORDER; glTexParameteri(tex->target, GL_TEXTURE_WRAP_S, wrapmode); glTexParameteri(tex->target, GL_TEXTURE_WRAP_T, wrapmode); @@ -685,6 +685,11 @@ int GPU_texture_opengl_height(GPUTexture *tex) return tex->h; } +int GPU_texture_opengl_bindcode(GPUTexture *tex) +{ + return tex->bindcode; +} + GPUFrameBuffer *GPU_texture_framebuffer(GPUTexture *tex) { return tex->fb; diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c index 15b96b6d808..9aa453af4d6 100644 --- a/source/blender/gpu/intern/gpu_material.c +++ b/source/blender/gpu/intern/gpu_material.c @@ -175,7 +175,7 @@ static void gpu_material_set_attrib_id(GPUMaterial *material) * removed by the glsl compiler by dead code elimination */ for(a=0, b=0; atotlayer; a++) { - sprintf(name, "att%d", attribs->layer[a].glindex); + sprintf(name, "att%d", attribs->layer[a].attribid); attribs->layer[a].glindex = GPU_shader_get_attribute(shader, name); if(attribs->layer[a].glindex >= 0) { @@ -386,12 +386,12 @@ static GPUNodeLink *lamp_get_visibility(GPUMaterial *mat, GPULamp *lamp, GPUNode /* from get_lamp_visibility */ if(lamp->type==LA_SUN || lamp->type==LA_HEMI) { mat->dynproperty |= DYN_LAMP_VEC; - GPU_link(mat, "lamp_visibility_sun_hemi", GPU_dynamic_uniform(lamp->dynvec), lv, dist, &visifac); + GPU_link(mat, "lamp_visibility_sun_hemi", GPU_dynamic_uniform(lamp->dynvec, GPU_DYNAMIC_LAMP_DYNVEC, lamp->ob), lv, dist, &visifac); return visifac; } else { mat->dynproperty |= DYN_LAMP_CO; - GPU_link(mat, "lamp_visibility_other", GPU_builtin(GPU_VIEW_POSITION), GPU_dynamic_uniform(lamp->dynco), lv, dist, &visifac); + GPU_link(mat, "lamp_visibility_other", GPU_builtin(GPU_VIEW_POSITION), GPU_dynamic_uniform(lamp->dynco, GPU_DYNAMIC_LAMP_DYNCO, lamp->ob), lv, dist, &visifac); if(lamp->type==LA_AREA) return visifac; @@ -426,11 +426,11 @@ static GPUNodeLink *lamp_get_visibility(GPUMaterial *mat, GPULamp *lamp, GPUNode if(lamp->type == LA_SPOT) { if(lamp->mode & LA_SQUARE) { mat->dynproperty |= DYN_LAMP_VEC|DYN_LAMP_IMAT; - GPU_link(mat, "lamp_visibility_spot_square", GPU_dynamic_uniform(lamp->dynvec), GPU_dynamic_uniform((float*)lamp->dynimat), *lv, &inpr); + GPU_link(mat, "lamp_visibility_spot_square", GPU_dynamic_uniform(lamp->dynvec, GPU_DYNAMIC_LAMP_DYNVEC, lamp->ob), GPU_dynamic_uniform((float*)lamp->dynimat, GPU_DYNAMIC_LAMP_DYNIMAT, lamp->ob), *lv, &inpr); } else { mat->dynproperty |= DYN_LAMP_VEC; - GPU_link(mat, "lamp_visibility_spot_circle", GPU_dynamic_uniform(lamp->dynvec), *lv, &inpr); + GPU_link(mat, "lamp_visibility_spot_circle", GPU_dynamic_uniform(lamp->dynvec, GPU_DYNAMIC_LAMP_DYNVEC, lamp->ob), *lv, &inpr); } GPU_link(mat, "lamp_visibility_spot", GPU_uniform(&lamp->spotsi), GPU_uniform(&lamp->spotbl), inpr, visifac, &visifac); @@ -646,7 +646,7 @@ static void shade_one_light(GPUShadeInput *shi, GPUShadeResult *shr, GPULamp *la float area[4][4]= {{0.0f}}, areasize= 0.0f; mat->dynproperty |= DYN_LAMP_VEC|DYN_LAMP_CO; - GPU_link(mat, "shade_inp_area", GPU_builtin(GPU_VIEW_POSITION), GPU_dynamic_uniform(lamp->dynco), GPU_dynamic_uniform(lamp->dynvec), vn, GPU_uniform((float*)area), + GPU_link(mat, "shade_inp_area", GPU_builtin(GPU_VIEW_POSITION), GPU_dynamic_uniform(lamp->dynco, GPU_DYNAMIC_LAMP_DYNCO, lamp->ob), GPU_dynamic_uniform(lamp->dynvec, GPU_DYNAMIC_LAMP_DYNVEC, lamp->ob), vn, GPU_uniform((float*)area), GPU_uniform(&areasize), GPU_uniform(&lamp->k), &inp); } @@ -684,13 +684,13 @@ static void shade_one_light(GPUShadeInput *shi, GPUShadeResult *shr, GPULamp *la GPU_link(mat, "test_shadowbuf", GPU_builtin(GPU_VIEW_POSITION), - GPU_dynamic_texture(lamp->tex), - GPU_dynamic_uniform((float*)lamp->dynpersmat), + GPU_dynamic_texture(lamp->tex, GPU_DYNAMIC_SAMPLER_2DSHADOW, lamp->ob), + GPU_dynamic_uniform((float*)lamp->dynpersmat, GPU_DYNAMIC_LAMP_DYNPERSMAT, lamp->ob), GPU_uniform(&lamp->bias), inp, &shadfac); if(lamp->mode & LA_ONLYSHADOW) { GPU_link(mat, "shade_only_shadow", i, shadfac, - GPU_dynamic_uniform(&lamp->dynenergy), &shadfac); + GPU_dynamic_uniform(&lamp->dynenergy, GPU_DYNAMIC_LAMP_DYNENERGY, lamp->ob), &shadfac); if(!(lamp->mode & LA_NO_DIFF)) GPU_link(mat, "shade_only_shadow_diffuse", shadfac, shi->rgb, @@ -719,7 +719,7 @@ static void shade_one_light(GPUShadeInput *shi, GPUShadeResult *shr, GPULamp *la if(GPU_link_changed(shi->refl) || ma->ref != 0.0f) { if(!(lamp->mode & LA_NO_DIFF)) { GPUNodeLink *rgb; - GPU_link(mat, "shade_mul_value", i, GPU_dynamic_uniform(lamp->dyncol), &rgb); + GPU_link(mat, "shade_mul_value", i, GPU_dynamic_uniform(lamp->dyncol, GPU_DYNAMIC_LAMP_DYNCOL, lamp->ob), &rgb); add_to_diffuse(mat, ma, shi, is, rgb, &shr->diff); } } @@ -729,7 +729,7 @@ static void shade_one_light(GPUShadeInput *shi, GPUShadeResult *shr, GPULamp *la (GPU_link_changed(shi->spec) || ma->spec != 0.0f)) { if(lamp->type == LA_HEMI) { GPU_link(mat, "shade_hemi_spec", vn, lv, view, GPU_uniform(&ma->spec), shi->har, visifac, &t); - GPU_link(mat, "shade_add_spec", t, GPU_dynamic_uniform(lamp->dyncol), shi->specrgb, &outcol); + GPU_link(mat, "shade_add_spec", t, GPU_dynamic_uniform(lamp->dyncol, GPU_DYNAMIC_LAMP_DYNCOL, lamp->ob), shi->specrgb, &outcol); GPU_link(mat, "shade_add_clamped", shr->spec, outcol, &shr->spec); } else { @@ -752,11 +752,11 @@ static void shade_one_light(GPUShadeInput *shi, GPUShadeResult *shr, GPULamp *la if(ma->mode & MA_RAMP_SPEC) { GPUNodeLink *spec; do_specular_ramp(shi, specfac, t, &spec); - GPU_link(mat, "shade_add_spec", t, GPU_dynamic_uniform(lamp->dyncol), spec, &outcol); + GPU_link(mat, "shade_add_spec", t, GPU_dynamic_uniform(lamp->dyncol, GPU_DYNAMIC_LAMP_DYNCOL, lamp->ob), spec, &outcol); GPU_link(mat, "shade_add_clamped", shr->spec, outcol, &shr->spec); } else { - GPU_link(mat, "shade_add_spec", t, GPU_dynamic_uniform(lamp->dyncol), shi->specrgb, &outcol); + GPU_link(mat, "shade_add_spec", t, GPU_dynamic_uniform(lamp->dyncol, GPU_DYNAMIC_LAMP_DYNCOL, lamp->ob), shi->specrgb, &outcol); GPU_link(mat, "shade_add_clamped", shr->spec, outcol, &shr->spec); } } @@ -1676,3 +1676,187 @@ int GPU_lamp_shadow_layer(GPULamp *lamp) return -1; } +/* export the GLSL shader */ + +GPUShaderExport *GPU_shader_export(struct Scene *scene, struct Material *ma) +{ + static struct { + GPUBuiltin gputype; + GPUDynamicType dynamictype; + GPUDataType datatype; + } builtins[] = { + { GPU_VIEW_MATRIX, GPU_DYNAMIC_OBJECT_VIEWMAT, GPU_DATA_16F }, + { GPU_INVERSE_VIEW_MATRIX, GPU_DYNAMIC_OBJECT_VIEWIMAT, GPU_DATA_16F }, + { GPU_OBJECT_MATRIX, GPU_DYNAMIC_OBJECT_MAT, GPU_DATA_16F }, + { GPU_INVERSE_OBJECT_MATRIX, GPU_DYNAMIC_OBJECT_IMAT, GPU_DATA_16F }, + { GPU_OBCOLOR, GPU_DYNAMIC_OBJECT_COLOR, GPU_DATA_4F }, + { 0 } + }; + + GPUShaderExport *shader = NULL; + GPUPass *pass; + GPUInput *input; + GPUMaterial *mat; + GPUInputUniform *uniform; + GPUInputAttribute *attribute; + GLint lastbindcode; + int i, liblen, fraglen; + + if(!GPU_glsl_support()) + return NULL; + + mat = GPU_material_from_blender(scene, ma); + pass = (mat)? mat->pass: NULL; + + if(pass && pass->fragmentcode && pass->vertexcode) { + shader = MEM_callocN(sizeof(GPUShaderExport), "GPUShaderExport"); + + for(input = pass->inputs.first; input; input = input->next) { + uniform = MEM_callocN(sizeof(GPUInputUniform), "GPUInputUniform"); + + if(input->ima) { + /* image sampler uniform */ + uniform->type = GPU_DYNAMIC_SAMPLER_2DIMAGE; + uniform->datatype = GPU_DATA_1I; + uniform->image = input->ima; + uniform->texnumber = input->texid; + BLI_strncpy(uniform->varname, input->shadername, sizeof(uniform->varname)); + } + else if(input->tex) { + /* generated buffer */ + uniform->texnumber = input->texid; + uniform->datatype = GPU_DATA_1I; + BLI_strncpy(uniform->varname, input->shadername, sizeof(uniform->varname)); + + switch(input->textype) { + case GPU_SHADOW2D: + uniform->type = GPU_DYNAMIC_SAMPLER_2DSHADOW; + uniform->lamp = input->dynamicdata; + break; + case GPU_TEX2D: + if(GPU_texture_opengl_bindcode(input->tex)) { + uniform->type = GPU_DYNAMIC_SAMPLER_2DBUFFER; + glGetIntegerv(GL_TEXTURE_BINDING_2D, &lastbindcode); + glBindTexture(GL_TEXTURE_2D, GPU_texture_opengl_bindcode(input->tex)); + uniform->texsize = GPU_texture_opengl_width(input->tex) * GPU_texture_opengl_height(input->tex); + uniform->texpixels = MEM_mallocN(uniform->texsize*4, "RGBApixels"); + glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, uniform->texpixels); + glBindTexture(GL_TEXTURE_2D, lastbindcode); + } + break; + } + } + else { + uniform->type = input->dynamictype; + BLI_strncpy(uniform->varname, input->shadername, sizeof(uniform->varname)); + switch(input->type) { + case 1: + uniform->datatype = GPU_DATA_1F; + break; + case 2: + uniform->datatype = GPU_DATA_2F; + break; + case 3: + uniform->datatype = GPU_DATA_3F; + break; + case 4: + uniform->datatype = GPU_DATA_4F; + break; + case 9: + uniform->datatype = GPU_DATA_9F; + break; + case 16: + uniform->datatype = GPU_DATA_16F; + break; + } + + if(uniform->type >= GPU_DYNAMIC_LAMP_FIRST && uniform->type <= GPU_DYNAMIC_LAMP_LAST) + uniform->lamp = input->dynamicdata; + } + + if(uniform->type != GPU_DYNAMIC_NONE) + BLI_addtail(&shader->uniforms, uniform); + else + MEM_freeN(uniform); + } + + /* process builtin uniform */ + for(i=0; builtins[i].gputype; i++) { + if(mat->builtins & builtins[i].gputype) { + uniform = MEM_callocN(sizeof(GPUInputUniform), "GPUInputUniform"); + uniform->type = builtins[i].dynamictype; + uniform->datatype = builtins[i].datatype; + BLI_strncpy(uniform->varname, GPU_builtin_name(builtins[i].gputype), sizeof(uniform->varname)); + BLI_addtail(&shader->uniforms, uniform); + } + } + + // now link fragement shader with library shader + // TBD: remove the function that are not used in the main function + liblen = (pass->libcode) ? strlen(pass->libcode) : 0; + fraglen = strlen(pass->fragmentcode); + shader->fragment = (char *)MEM_mallocN(liblen+fraglen+1, "GPUFragShader"); + if(pass->libcode) + memcpy(shader->fragment, pass->libcode, liblen); + memcpy(&shader->fragment[liblen], pass->fragmentcode, fraglen); + shader->fragment[liblen+fraglen] = 0; + + // export the attribute + for(i=0; iattribs.totlayer; i++) { + attribute = MEM_callocN(sizeof(GPUInputAttribute), "GPUInputAttribute"); + attribute->type = mat->attribs.layer[i].type; + attribute->number = mat->attribs.layer[i].glindex; + BLI_snprintf(attribute->varname, sizeof(attribute->varname), "att%d", mat->attribs.layer[i].attribid); + + switch(attribute->type) { + case CD_TANGENT: + attribute->datatype = GPU_DATA_4F; + break; + case CD_MTFACE: + attribute->datatype = GPU_DATA_2F; + attribute->name = mat->attribs.layer[i].name; + break; + case CD_MCOL: + attribute->datatype = GPU_DATA_4UB; + attribute->name = mat->attribs.layer[i].name; + break; + case CD_ORCO: + attribute->datatype = GPU_DATA_3F; + break; + } + + if(attribute->datatype != GPU_DATA_NONE) + BLI_addtail(&shader->attributes, attribute); + else + MEM_freeN(attribute); + } + + // export the vertex shader + shader->vertex = BLI_strdup(pass->vertexcode); + } + + return shader; +} + +void GPU_free_shader_export(GPUShaderExport *shader) +{ + GPUInputUniform *uniform; + + if(shader == NULL) + return; + + for(uniform = shader->uniforms.first; uniform; uniform=uniform->next) + if(uniform->texpixels) + MEM_freeN(uniform->texpixels); + + BLI_freelistN(&shader->uniforms); + BLI_freelistN(&shader->attributes); + + if(shader->vertex) + MEM_freeN(shader->vertex); + if(shader->fragment) + MEM_freeN(shader->fragment); + + MEM_freeN(shader); +} + diff --git a/source/blender/gpu/intern/gpu_shader_material.glsl b/source/blender/gpu/intern/gpu_shader_material.glsl index 815b74a1bf4..c5c822d9224 100644 --- a/source/blender/gpu/intern/gpu_shader_material.glsl +++ b/source/blender/gpu/intern/gpu_shader_material.glsl @@ -308,22 +308,22 @@ void normal(vec3 dir, vec3 nor, out vec3 outnor, out float outdot) outdot = -dot(dir, nor); } -void curves_vec(float fac, vec3 vec, sampler1D curvemap, out vec3 outvec) +void curves_vec(float fac, vec3 vec, sampler2D curvemap, out vec3 outvec) { - outvec.x = texture1D(curvemap, (vec.x + 1.0)*0.5).x; - outvec.y = texture1D(curvemap, (vec.y + 1.0)*0.5).y; - outvec.z = texture1D(curvemap, (vec.z + 1.0)*0.5).z; + outvec.x = texture2D(curvemap, vec2((vec.x + 1.0)*0.5, 0.0)).x; + outvec.y = texture2D(curvemap, vec2((vec.y + 1.0)*0.5, 0.0)).y; + outvec.z = texture2D(curvemap, vec2((vec.z + 1.0)*0.5, 0.0)).z; if (fac != 1.0) outvec = (outvec*fac) + (vec*(1.0-fac)); } -void curves_rgb(float fac, vec4 col, sampler1D curvemap, out vec4 outcol) +void curves_rgb(float fac, vec4 col, sampler2D curvemap, out vec4 outcol) { - outcol.r = texture1D(curvemap, texture1D(curvemap, col.r).a).r; - outcol.g = texture1D(curvemap, texture1D(curvemap, col.g).a).g; - outcol.b = texture1D(curvemap, texture1D(curvemap, col.b).a).b; + outcol.r = texture2D(curvemap, vec2(texture2D(curvemap, vec2(col.r, 0.0)).a, 0.0)).r; + outcol.g = texture2D(curvemap, vec2(texture2D(curvemap, vec2(col.g, 0.0)).a, 0.0)).g; + outcol.b = texture2D(curvemap, vec2(texture2D(curvemap, vec2(col.b, 0.0)).a, 0.0)).b; if (fac != 1.0) outcol = (outcol*fac) + (col*(1.0-fac)); @@ -635,9 +635,9 @@ void mix_linear(float fac, vec4 col1, vec4 col2, out vec4 outcol) outcol.b= col1.b + fac*(2.0*(col2.b) - 1.0); } -void valtorgb(float fac, sampler1D colormap, out vec4 outcol, out float outalpha) +void valtorgb(float fac, sampler2D colormap, out vec4 outcol, out float outalpha) { - outcol = texture1D(colormap, fac); + outcol = texture2D(colormap, vec2(fac, 0.0)); outalpha = outcol.a; } @@ -1320,9 +1320,9 @@ void lamp_falloff_sliders(float lampdist, float ld1, float ld2, float dist, out visifac *= lampdistkw/(lampdistkw + ld2*dist*dist); } -void lamp_falloff_curve(float lampdist, sampler1D curvemap, float dist, out float visifac) +void lamp_falloff_curve(float lampdist, sampler2D curvemap, float dist, out float visifac) { - visifac = texture1D(curvemap, dist/lampdist).x; + visifac = texture2D(curvemap, vec2(dist/lampdist, 0.0)).x; } void lamp_visibility_sphere(float lampdist, float dist, float visifac, out float outvisifac) diff --git a/source/blender/gpu/intern/gpu_shader_material.glsl.c b/source/blender/gpu/intern/gpu_shader_material.glsl.c index 87a8ed65532..63c7d34cda8 100644 --- a/source/blender/gpu/intern/gpu_shader_material.glsl.c +++ b/source/blender/gpu/intern/gpu_shader_material.glsl.c @@ -1,1250 +1,1310 @@ /* DataToC output of file */ -int datatoc_gpu_shader_material_glsl_size= 39789; +int datatoc_gpu_shader_material_glsl_size= 41714; 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, + 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, 10,123, 10, 9, 99,111,108, 95,116,111, 46,114, 32, 61, 32,108,105,110,101, 97,114,114,103, - 98, 95,116,111, 95,115,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,114, 41, 59, 10, 9, 99,111,108, 95,116,111, 46,103, - 32, 61, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,103, 41, - 59, 10, 9, 99,111,108, 95,116,111, 46, 98, 32, 61, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40, - 99,111,108, 95,102,114,111,109, 46, 98, 41, 59, 10, 9, 99,111,108, 95,116,111, 46, 97, 32, 61, 32, 99,111,108, 95,102,114,111, -109, 46, 97, 59, 10,125, 10, 10, 35,100,101,102,105,110,101, 32, 77, 95, 80, 73, 32, 51, 46, 49, 52, 49, 53, 57, 50, 54, 53, 51, - 53, 56, 57, 55, 57, 51, 50, 51, 56, 52, 54, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 83, 72, 65, 68, 69, 82, - 32, 78, 79, 68, 69, 83, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,118, 99, -111,108, 95, 97,116,116,114,105, 98,117,116,101, 40,118,101, 99, 52, 32, 97,116,116,118, 99,111,108, 44, 32,111,117,116, 32,118, -101, 99, 52, 32,118, 99,111,108, 41, 10,123, 10, 9,118, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 97,116,116,118, 99,111,108, - 46,120, 47, 50, 53, 53, 46, 48, 44, 32, 97,116,116,118, 99,111,108, 46,121, 47, 50, 53, 53, 46, 48, 44, 32, 97,116,116,118, 99, -111,108, 46,122, 47, 50, 53, 53, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,117,118, 95, 97,116,116, -114,105, 98,117,116,101, 40,118,101, 99, 50, 32, 97,116,116,117,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 41, 10, -123, 10, 9,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,117,118, 42, 50, 46, 48, 32, 45, 32,118,101, 99, 50, 40, 49, 46, - 48, 44, 32, 49, 46, 48, 41, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,103,101,111,109, 40,118,101, 99, 51, - 32, 99,111, 44, 32,118,101, 99, 51, 32,110,111,114, 44, 32,109, 97,116, 52, 32,118,105,101,119,105,110,118,109, 97,116, 44, 32, -118,101, 99, 51, 32, 97,116,116,111,114, 99,111, 44, 32,118,101, 99, 50, 32, 97,116,116,117,118, 44, 32,118,101, 99, 52, 32, 97, -116,116,118, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,103,108,111, 98, 97,108, 44, 32,111,117,116, 32,118,101, 99, - 51, 32,108,111, 99, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,111,117,116, 32,118,101, 99, 51, - 32,111,114, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114, -109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,118, 99,111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102,114, -111,110,116, 98, 97, 99,107, 41, 10,123, 10, 9,108,111, 99, 97,108, 32, 61, 32, 99,111, 59, 10, 9,118,105,101,119, 32, 61, 32, -110,111,114,109, 97,108,105,122,101, 40,108,111, 99, 97,108, 41, 59, 10, 9,103,108,111, 98, 97,108, 32, 61, 32, 40,118,105,101, -119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40,108,111, 99, 97,108, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10, 9, -111,114, 99,111, 32, 61, 32, 97,116,116,111,114, 99,111, 59, 10, 9,117,118, 95, 97,116,116,114,105, 98,117,116,101, 40, 97,116, -116,117,118, 44, 32,117,118, 41, 59, 10, 9,110,111,114,109, 97,108, 32, 61, 32, 45,110,111,114,109, 97,108,105,122,101, 40,110, -111,114, 41, 59, 9, 47, 42, 32, 98,108,101,110,100,101,114, 32,114,101,110,100,101,114, 32,110,111,114,109, 97,108, 32,105,115, - 32,110,101,103, 97,116,101,100, 32, 42, 47, 10, 9,118, 99,111,108, 95, 97,116,116,114,105, 98,117,116,101, 40, 97,116,116,118, - 99,111,108, 44, 32,118, 99,111,108, 41, 59, 10, 9,102,114,111,110,116, 98, 97, 99,107, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, - 10,118,111,105,100, 32,109, 97,112,112,105,110,103, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,109, 97,116, 52, 32,109, 97,116, - 44, 32,118,101, 99, 51, 32,109,105,110,118,101, 99, 44, 32,118,101, 99, 51, 32,109, 97,120,118,101, 99, 44, 32,102,108,111, 97, -116, 32,100,111,109,105,110, 44, 32,102,108,111, 97,116, 32,100,111,109, 97,120, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111, -117,116,118,101, 99, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32, 40,109, 97,116, 32, 42, 32,118,101, 99, 52, 40,118, -101, 99, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10, 9,105,102, 40,100,111,109,105,110, 32, 61, 61, 32, 49, 46, 48, 41, - 10, 9, 9,111,117,116,118,101, 99, 32, 61, 32,109, 97,120, 40,111,117,116,118,101, 99, 44, 32,109,105,110,118,101, 99, 41, 59, - 10, 9,105,102, 40,100,111,109, 97,120, 32, 61, 61, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116,118,101, 99, 32, 61, 32,109,105, -110, 40,111,117,116,118,101, 99, 44, 32,109, 97,120,118,101, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32, 99, 97,109,101,114, - 97, 40,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,105,101,119, 44, 32,111,117,116, - 32,102,108,111, 97,116, 32,111,117,116,100,101,112,116,104, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,100,105, -115,116, 41, 10,123, 10, 9,111,117,116,100,101,112,116,104, 32, 61, 32, 97, 98,115, 40, 99,111, 46,122, 41, 59, 10, 9,111,117, -116,100,105,115,116, 32, 61, 32,108,101,110,103,116,104, 40, 99,111, 41, 59, 10, 9,111,117,116,118,105,101,119, 32, 61, 32,110, -111,114,109, 97,108,105,122,101, 40, 99,111, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97,100,100, 40,102, -108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, - 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 43, 32,118, 97,108, 50, - 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,115,117, 98,116,114, 97, 99,116, 40,102,108,111, 97,116, 32,118, 97, -108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, - 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 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,108,111, 97,116, 32,118, - 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97, -108, 41, 10,123, 10, 9,105,102, 32, 40,118, 97,108, 49, 32, 62, 61, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116,118, 97,108, 32, - 61, 32,112,111,119, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97, -108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,108,111,103, 40,102,108,111, 97,116, 32, -118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, - 97,108, 41, 10,123, 10, 9,105,102, 40,118, 97,108, 49, 32, 62, 32, 48, 46, 48, 32, 32, 38, 38, 32,118, 97,108, 50, 32, 62, 32, - 48, 46, 48, 41, 10, 9, 9,111,117,116,118, 97,108, 61, 32,108,111,103, 50, 40,118, 97,108, 49, 41, 32, 47, 32,108,111,103, 50, - 40,118, 97,108, 50, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, 61, 32, 48, 46, 48, 59, 10,125, 10, 10, -118,111,105,100, 32,109, 97,116,104, 95,109, 97,120, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32, -118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97, -108, 32, 61, 32,109, 97,120, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116, -104, 95,109,105,110, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117, -116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,109,105,110, 40, -118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,114,111,117,110,100, 40, -102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9, -111,117,116,118, 97,108, 61, 32,102,108,111,111,114, 40,118, 97,108, 32, 43, 32, 48, 46, 53, 41, 59, 10,125, 10, 10,118,111,105, -100, 32,109, 97,116,104, 95,108,101,115,115, 95,116,104, 97,110, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, - 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105,102, - 40,118, 97,108, 49, 32, 60, 32,118, 97,108, 50, 41, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 59, 10, 9,101, -108,115,101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, - 95,103,114,101, 97,116,101,114, 95,116,104, 97,110, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32, -118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105,102, 40,118, 97, -108, 49, 32, 62, 32,118, 97,108, 50, 41, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,115,101, - 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,115,113,117,101,101,122,101, - 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,102,108,111, 97,116, 32,119,105,100,116,104, 44, 32,102,108,111, 97,116, 32, 99, -101,110,116,101,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, - 97,108, 32, 61, 32, 49, 46, 48, 47, 40, 49, 46, 48, 32, 43, 32,112,111,119, 40, 50, 46, 55, 49, 56, 50, 56, 49, 56, 51, 44, 32, - 45, 40, 40,118, 97,108, 45, 99,101,110,116,101,114, 41, 42,119,105,100,116,104, 41, 41, 41, 59, 10,125, 10, 10,118,111,105,100, - 32,118,101, 99, 95,109, 97,116,104, 95, 97,100,100, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32, -111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97, -108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 43, 32,118, 50, 59, 10, 9,111,117,116,118, 97,108, 32, - 61, 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 49, - 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 50, 93, 41, 41, 47, 51, 46, 48, 59, 10,125, 10, 10,118,111,105, -100, 32,118,101, 99, 95,109, 97,116,104, 95,115,117, 98, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, + 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, 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,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,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, 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, 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, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 45, 32,118, 50, 59, 10, 9,111,117,116,118, 97,108, - 32, 61, 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, - 49, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 50, 93, 41, 41, 47, 51, 46, 48, 59, 10,125, 10, 10,118,111, -105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 97,118,101,114, 97,103,101, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, - 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, - 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 43, 32,118, 50, 59, 10, 9,111, -117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,111,117,116,118,101, 99, 41, 59, 10, 9,111,117,116,118,101, 99, 32, - 61, 32,110,111,114,109, 97,108,105,122,101, 40,111,117,116,118,101, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, - 95,109, 97,116,104, 95,100,111,116, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32, -118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, - 10, 9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 51, 40, 48, 44, 32, 48, 44, 32, 48, 41, 59, 10, 9,111,117,116,118, 97, -108, 32, 61, 32,100,111,116, 40,118, 49, 44, 32,118, 50, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116, -104, 95, 99,114,111,115,115, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, - 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9, -111,117,116,118,101, 99, 32, 61, 32, 99,114,111,115,115, 40,118, 49, 44, 32,118, 50, 41, 59, 10, 9,111,117,116,118, 97,108, 32, - 61, 32,108,101,110,103,116,104, 40,111,117,116,118,101, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97, + 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, 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, 10,123, 10, 9,111,117,116,118, 97, -108, 32, 61, 32,108,101,110,103,116,104, 40,118, 41, 59, 10, 9,111,117,116,118,101, 99, 32, 61, 32,110,111,114,109, 97,108,105, -122,101, 40,118, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,110,101,103, 97,116,101, 40,118, -101, 99, 51, 32,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118, 41, 10,123, 10, 9,111,117,116,118, 32, 61, 32, - 45,118, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,114,109, 97,108, 40,118,101, 99, 51, 32,100,105,114, 44, 32,118,101, 99, - 51, 32,110,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114, 44, 32,111,117,116, 32,102,108,111, 97, -116, 32,111,117,116,100,111,116, 41, 10,123, 10, 9,111,117,116,110,111,114, 32, 61, 32,100,105,114, 59, 10, 9,111,117,116,100, -111,116, 32, 61, 32, 45,100,111,116, 40,100,105,114, 44, 32,110,111,114, 41, 59, 10,125, 10, 10,118,111,105,100, 32, 99,117,114, -118,101,115, 95,118,101, 99, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 51, 32,118,101, 99, 44, 32,115, 97,109, -112,108,101,114, 49, 68, 32, 99,117,114,118,101,109, 97,112, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, - 41, 10,123, 10, 9,111,117,116,118,101, 99, 46,120, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, - 97,112, 44, 32, 40,118,101, 99, 46,120, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 41, 46,120, 59, 10, 9,111,117,116,118,101, - 99, 46,121, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 40,118,101, 99, 46,121, - 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 41, 46,121, 59, 10, 9,111,117,116,118,101, 99, 46,122, 32, 61, 32,116,101,120,116, -117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 40,118,101, 99, 46,122, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, - 53, 41, 46,122, 59, 10, 10, 9,105,102, 32, 40,102, 97, 99, 32, 33, 61, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116,118,101, 99, - 32, 61, 32, 40,111,117,116,118,101, 99, 42,102, 97, 99, 41, 32, 43, 32, 40,118,101, 99, 42, 40, 49, 46, 48, 45,102, 97, 99, 41, - 41, 59, 10, 10,125, 10, 10,118,111,105,100, 32, 99,117,114,118,101,115, 95,114,103, 98, 40,102,108,111, 97,116, 32,102, 97, 99, - 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,115, 97,109,112,108,101,114, 49, 68, 32, 99,117,114,118,101,109, 97,112, 44, 32, -111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116, -101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114, -118,101,109, 97,112, 44, 32, 99,111,108, 46,114, 41, 46, 97, 41, 46,114, 59, 10, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, -116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117, -114,118,101,109, 97,112, 44, 32, 99,111,108, 46,103, 41, 46, 97, 41, 46,103, 59, 10, 9,111,117,116, 99,111,108, 46, 98, 32, 61, - 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,116,101,120,116,117,114,101, 49, 68, 40, 99, -117,114,118,101,109, 97,112, 44, 32, 99,111,108, 46, 98, 41, 46, 97, 41, 46, 98, 59, 10, 10, 9,105,102, 32, 40,102, 97, 99, 32, - 33, 61, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32, 40,111,117,116, 99,111,108, 42,102, 97, 99, 41, 32, - 43, 32, 40, 99,111,108, 42, 40, 49, 46, 48, 45,102, 97, 99, 41, 41, 59, 10, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, - 99,111,108, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 40,102,108,111, 97,116, 32,118, - 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, - 61, 32,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 40,118,101, 99, 51, 32, 99,111,108, 44, - 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111, -108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 97, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117, -116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 59, 10, -125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 95,122,101,114,111, 40,111,117,116, 32,102,108,111, 97,116, - 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105, -100, 32,115,101,116, 95,118, 97,108,117,101, 95,111,110,101, 40,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, - 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114, -103, 98, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, - 97,108, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 97, - 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 52, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, - 32, 61, 32,118,101, 99, 52, 40, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 98,108,101,110,100, 40, -102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, - 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, - 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99, -111,108, 49, 44, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, - 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 97,100,100, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32, -118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111, -117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, - 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 49, 32, 43, - 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, - 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,109,117,108,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, - 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99, -111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, - 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 49, 32, 42, 32, 99,111, -108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, - 10,118,111,105,100, 32,109,105,120, 95,115, 99,114,101,101,110, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, - 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111, -108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, - 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116, - 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 40,118,101, 99, 52, 40,102, 97, 99,109, 41, 32, 43, 32, -102, 97, 99, 42, 40,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 50, 41, 41, 42, 40,118,101, 99, 52, 40, 49, 46, - 48, 41, 32, 45, 32, 99,111,108, 49, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10, -125, 10, 10,118,111,105,100, 32,109,105,120, 95,111,118,101,114,108, 97,121, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118, +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,100,105,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, 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,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, 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, +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,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, 10,125, 10, - 10,118,111,105,100, 32,109,105,120, 95,115,117, 98, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111, -108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10, -123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9, -111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 49, 32, 45, 32, 99,111,108, 50, 44, 32, -102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105, -100, 32,109,105,120, 95,100,105,118, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32, -118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, - 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97, -116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99, -111,108, 49, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46,114, 32, 33, 61, 32, 48, 46, 48, 41, 32,111,117,116, 99,111,108, 46, -114, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,114, 32, 43, 32,102, 97, 99, 42,111,117,116, 99,111,108, 46,114, - 47, 99,111,108, 50, 46,114, 59, 10, 9,105,102, 40, 99,111,108, 50, 46,103, 32, 33, 61, 32, 48, 46, 48, 41, 32,111,117,116, 99, -111,108, 46,103, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,103, 32, 43, 32,102, 97, 99, 42,111,117,116, 99,111, -108, 46,103, 47, 99,111,108, 50, 46,103, 59, 10, 9,105,102, 40, 99,111,108, 50, 46, 98, 32, 33, 61, 32, 48, 46, 48, 41, 32,111, -117,116, 99,111,108, 46, 98, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46, 98, 32, 43, 32,102, 97, 99, 42,111,117, -116, 99,111,108, 46, 98, 47, 99,111,108, 50, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,100,105,102,102, 40, -102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, - 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, - 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99, -111,108, 49, 44, 32, 97, 98,115, 40, 99,111,108, 49, 32, 45, 32, 99,111,108, 50, 41, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117, -116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,100, 97,114, -107, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, - 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97, -109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 46,114,103, 98, 32, 61, - 32,109,105,110, 40, 99,111,108, 49, 46,114,103, 98, 44, 32, 99,111,108, 50, 46,114,103, 98, 42,102, 97, 99, 41, 59, 10, 9,111, -117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,108,105, -103,104,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 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, + 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, 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, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, - 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9, -111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 59, - 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,115,118, 41, 59, 10, 10, 9,105,102, 40, -104,115,118, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, - 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9, 9,104,115,118, 46,121, 32, 61, 32,102, 97, 99,109, 42,104,115,118, 46,121, 32, - 43, 32,102, 97, 99, 42,104,115,118, 50, 46,121, 59, 10, 9, 9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32, -111,117,116, 99,111,108, 41, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,118, 97,108, 40,102,108,111, 97, -116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, - 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, - 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, - 32,102, 97, 99, 59, 10, 10, 9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 59, 10, 9,114,103, 98, 95,116,111, 95, -104,115,118, 40, 99,111,108, 49, 44, 32,104,115,118, 41, 59, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 50, - 44, 32,104,115,118, 50, 41, 59, 10, 10, 9,104,115,118, 46,122, 32, 61, 32,102, 97, 99,109, 42,104,115,118, 46,122, 32, 43, 32, -102, 97, 99, 42,104,115,118, 50, 46,122, 59, 10, 9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,111,117,116, - 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 99,111,108,111,114, 40,102,108,111, 97,116, 32,102, 97, +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, 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, 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, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, - 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, - 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,118,101, 99, 52, 32,104,115,118, 44, 32,104, -115,118, 50, 44, 32,116,109,112, 59, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, - 41, 59, 10, 10, 9,105,102, 40,104,115,118, 50, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,114,103, 98, 95,116, -111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,115,118, 41, 59, 10, 9, 9,104,115,118, 46,120, 32, 61, 32,104,115, -118, 50, 46,120, 59, 10, 9, 9,104,115,118, 46,121, 32, 61, 32,104,115,118, 50, 46,121, 59, 10, 9, 9,104,115,118, 95,116,111, - 95,114,103, 98, 40,104,115,118, 44, 32,116,109,112, 41, 59, 32, 10, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, - 40,111,117,116, 99,111,108, 44, 32,116,109,112, 44, 32,102, 97, 99, 41, 59, 10, 9, 9,111,117,116, 99,111,108, 46, 97, 32, 61, - 32, 99,111,108, 49, 46, 97, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115,111,102,116, 40,102,108,111, - 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117, -116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, - 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, - 45, 32,102, 97, 99, 59, 10, 10, 9,118,101, 99, 52, 32,111,110,101, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 59, 10, 9,118, -101, 99, 52, 32,115, 99,114, 61, 32,111,110,101, 32, 45, 32, 40,111,110,101, 32, 45, 32, 99,111,108, 50, 41, 42, 40,111,110,101, - 32, 45, 32, 99,111,108, 49, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,102, 97, 99,109, 42, 99,111,108, 49, 32, 43, 32, -102, 97, 99, 42, 40, 40,111,110,101, 32, 45, 32, 99,111,108, 49, 41, 42, 99,111,108, 50, 42, 99,111,108, 49, 32, 43, 32, 99,111, -108, 49, 42,115, 99,114, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,108,105,110,101, 97,114, 40,102,108,111, 97, -116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, - 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, - 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9, -105,102, 40, 99,111,108, 50, 46,114, 32, 62, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 61, 32, 99,111,108, - 49, 46,114, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,114, 32, 45, 32, 48, 46, 53, 41, 41, 59, 10, - 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,114, 61, 32, 99,111,108, 49, 46,114, 32, 43, 32,102, 97, 99, 42, 40, - 50, 46, 48, 42, 40, 99,111,108, 50, 46,114, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46,103, - 32, 62, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 61, 32, 99,111,108, 49, 46,103, 32, 43, 32,102, 97, 99, - 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,103, 32, 45, 32, 48, 46, 53, 41, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111, -117,116, 99,111,108, 46,103, 61, 32, 99,111,108, 49, 46,103, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, - 46,103, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46, 98, 32, 62, 32, 48, 46, 53, 41, 10, 9, - 9,111,117,116, 99,111,108, 46, 98, 61, 32, 99,111,108, 49, 46, 98, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111, -108, 50, 46, 98, 32, 45, 32, 48, 46, 53, 41, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 61, 32, - 99,111,108, 49, 46, 98, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46, 98, 41, 32, 45, 32, 49, 46, 48, - 41, 59, 10,125, 10, 10,118,111,105,100, 32,118, 97,108,116,111,114,103, 98, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,115, - 97,109,112,108,101,114, 49, 68, 32, 99,111,108,111,114,109, 97,112, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99, -111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116, 97,108,112,104, 97, 41, 10,123, 10, 9,111,117,116, 99,111, -108, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,111,108,111,114,109, 97,112, 44, 32,102, 97, 99, 41, 59, 10, 9,111, -117,116, 97,108,112,104, 97, 32, 61, 32,111,117,116, 99,111,108, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,114,103, 98,116, -111, 98,119, 40,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, - 41, 32, 32, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 99,111,108,111,114, 46,114, 42, 48, 46, 51, 53, 32, 43, 32, 99, -111,108,111,114, 46,103, 42, 48, 46, 52, 53, 32, 43, 32, 99,111,108,111,114, 46, 98, 42, 48, 46, 50, 59, 32, 47, 42, 32,107,101, -101,112, 32,116,104,101,115,101, 32,102, 97, 99,116,111,114,115, 32,105,110, 32,115,121,110, 99, 32,119,105,116,104, 32,116,101, -120,116,117,114,101, 46,104, 58, 82, 71, 66, 84, 79, 66, 87, 32, 42, 47, 10,125, 10, 10,118,111,105,100, 32,105,110,118,101,114, -116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32, -111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 46,120,121,122, 32, 61, 32,109,105,120, 40, 99,111,108, 46, -120,121,122, 44, 32,118,101, 99, 51, 40, 49, 46, 48, 44, 32, 49, 46, 48, 44, 32, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 46,120, -121,122, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46,119, 32, 61, 32, 99,111,108, 46,119, 59, 10,125, 10, 10, -118,111,105,100, 32,104,117,101, 95,115, 97,116, 40,102,108,111, 97,116, 32,104,117,101, 44, 32,102,108,111, 97,116, 32,115, 97, -116, 44, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, - 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32,104,115, -118, 59, 10, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 44, 32,104,115,118, 41, 59, 10, 10, 9,104,115,118, - 91, 48, 93, 32, 43, 61, 32, 40,104,117,101, 32, 45, 32, 48, 46, 53, 41, 59, 10, 9,105,102, 40,104,115,118, 91, 48, 93, 62, 49, - 46, 48, 41, 32,104,115,118, 91, 48, 93, 45, 61, 49, 46, 48, 59, 32,101,108,115,101, 32,105,102, 40,104,115,118, 91, 48, 93, 60, - 48, 46, 48, 41, 32,104,115,118, 91, 48, 93, 43, 61, 32, 49, 46, 48, 59, 10, 9,104,115,118, 91, 49, 93, 32, 42, 61, 32,115, 97, -116, 59, 10, 9,105,102, 40,104,115,118, 91, 49, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91, 49, 93, 61, 32, 49, 46, 48, 59, 32, + 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, + 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, - 10, 9,104,115,118, 91, 50, 93, 32, 42, 61, 32,118, 97,108,117,101, 59, 10, 9,105,102, 40,104,115,118, 91, 50, 93, 62, 49, 46, - 48, 41, 32,104,115,118, 91, 50, 93, 61, 32, 49, 46, 48, 59, 32,101,108,115,101, 32,105,102, 40,104,115,118, 91, 50, 93, 60, 48, - 46, 48, 41, 32,104,115,118, 91, 50, 93, 61, 32, 48, 46, 48, 59, 10, 10, 9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115, -118, 44, 32,111,117,116, 99,111,108, 41, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 44, 32, -111,117,116, 99,111,108, 44, 32,102, 97, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,112, 97,114, 97,116,101, 95,114, -103, 98, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,114, 44, 32,111,117,116, 32,102,108, -111, 97,116, 32,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, 98, 41, 10,123, 10, 9,114, 32, 61, 32, 99,111,108, 46,114, - 59, 10, 9,103, 32, 61, 32, 99,111,108, 46,103, 59, 10, 9, 98, 32, 61, 32, 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111,105, -100, 32, 99,111,109, 98,105,110,101, 95,114,103, 98, 40,102,108,111, 97,116, 32,114, 44, 32,102,108,111, 97,116, 32,103, 44, 32, -102,108,111, 97,116, 32, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108, 41, 10,123, 10, 9, 99,111,108, 32, 61, 32, -118,101, 99, 52, 40,114, 44, 32,103, 44, 32, 98, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,111,117,116,112, -117,116, 95,110,111,100,101, 40,118,101, 99, 52, 32,114,103, 98, 44, 32,102,108,111, 97,116, 32, 97,108,112,104, 97, 44, 32,111, -117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98, 41, 10,123, 10, 9,111,117,116,114,103, 98, 32, 61, 32,118,101, 99, 52, - 40,114,103, 98, 46,114,103, 98, 44, 32, 97,108,112,104, 97, 41, 59, 10,125, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 32, 84, 69, 88, 84, 85, 82, 69, 83, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105, -100, 32,116,101,120,116,117,114,101, 95,102,108,105,112, 95, 98,108,101,110,100, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111, -117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 46, -121,120,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95, 98,108,101,110,100, 95,108,105,110, 40,118, -101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117, -116,118, 97,108, 32, 61, 32, 40, 49, 46, 48, 43,118,101, 99, 46,120, 41, 47, 50, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32, -116,101,120,116,117,114,101, 95, 98,108,101,110,100, 95,113,117, 97,100, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, - 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,109, 97,120, 40, 40, - 49, 46, 48, 43,118,101, 99, 46,120, 41, 47, 50, 46, 48, 44, 32, 48, 46, 48, 41, 59, 10, 9,111,117,116,118, 97,108, 32, 42, 61, - 32,111,117,116,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95,119,111,111,100, 95,115,105, -110, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,111,117,116, - 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 41, 10,123, 10, - 9,102,108,111, 97,116, 32, 97, 32, 61, 32,115,113,114,116, 40,118,101, 99, 46,120, 42,118,101, 99, 46,120, 32, 43, 32,118,101, - 99, 46,121, 42,118,101, 99, 46,121, 32, 43, 32,118,101, 99, 46,122, 42,118,101, 99, 46,122, 41, 42, 50, 48, 46, 48, 59, 10, 9, -102,108,111, 97,116, 32,119,105, 32, 61, 32, 48, 46, 53, 32, 43, 32, 48, 46, 53, 42,115,105,110, 40, 97, 41, 59, 10, 10, 9,118, - 97,108,117,101, 32, 61, 32,119,105, 59, 10, 9, 99,111,108,111,114, 32, 61, 32,118,101, 99, 52, 40,119,105, 44, 32,119,105, 44, - 32,119,105, 44, 32, 49, 46, 48, 41, 59, 10, 9,110,111,114,109, 97,108, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 44, 32, 48, - 46, 48, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95,105,109, 97,103,101, 40, -118,101, 99, 51, 32,118,101, 99, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,111,117,116, 32,102,108,111, - 97,116, 32,118, 97,108,117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,118,101, - 99, 51, 32,110,111,114,109, 97,108, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40, -105,109, 97, 44, 32, 40,118,101, 99, 46,120,121, 32, 43, 32,118,101, 99, 50, 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 41, 42, 48, - 46, 53, 41, 59, 10, 9,118, 97,108,117,101, 32, 61, 32, 49, 46, 48, 59, 10, 10, 9,110,111,114,109, 97,108, 46,120, 32, 61, 32, - 50, 46, 48, 42, 40, 99,111,108,111,114, 46,114, 32, 45, 32, 48, 46, 53, 41, 59, 10, 9,110,111,114,109, 97,108, 46,121, 32, 61, - 32, 50, 46, 48, 42, 40, 48, 46, 53, 32, 45, 32, 99,111,108,111,114, 46,103, 41, 59, 10, 9,110,111,114,109, 97,108, 46,122, 32, - 61, 32, 50, 46, 48, 42, 40, 99,111,108,111,114, 46, 98, 32, 45, 32, 48, 46, 53, 41, 59, 10,125, 10, 10, 47, 42, 42, 42, 42, 42, + 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, 13, 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, 13, 10, 13, 10, 9,118, 97,108,117,101, 32, 61, 32,119,105, 59, 13, 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, 13, 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, 13, 10,125, 13, + 10, 13, 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, + 13, 10,123, 13, 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, 13, 10, 9,118, + 97,108,117,101, 32, 61, 32, 49, 46, 48, 59, 13, 10, 13, 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, 13, 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, 13, 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, 13, 10,125, 13, 10, 13, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 77, 84, 69, 88, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, - 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,111,114, 99,111, 40,118,101, 99, 51, 32, 97,116,116,111,114, 99,111, 44, 32, -111,117,116, 32,118,101, 99, 51, 32,111,114, 99,111, 41, 10,123, 10, 9,111,114, 99,111, 32, 61, 32, 97,116,116,111,114, 99,111, - 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,117,118, 40,118,101, 99, 50, 32, 97,116,116,117,118, 44, 32,111, -117,116, 32,118,101, 99, 51, 32,117,118, 41, 10,123, 10, 9, 47, 42, 32,100,105,115, 97, 98,108,101,100, 32,102,111,114, 32,110, -111,119, 44, 32,119,111,114,107,115, 32,116,111,103,101,116,104,101,114, 32,119,105,116,104, 32,108,101, 97,118,105,110,103, 32, -111,117,116, 32,109,116,101,120, 95, 50,100, 95,109, 97,112,112,105,110,103, 10, 9, 32, 32, 32,117,118, 32, 61, 32,118,101, 99, - 51, 40, 97,116,116,117,118, 42, 50, 46, 48, 32, 45, 32,118,101, 99, 50, 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 44, 32, 48, 46, - 48, 41, 59, 32, 42, 47, 10, 9,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,117,118, 44, 32, 48, 46, 48, 41, 59, 10,125, - 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,110,111,114,109, 40,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111, -117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9, 47, 42, 32, 99,111,114,114,101,115,112, -111,110,100,115, 32,116,111, 32,115,104,105, 45, 62,111,114,110, 44, 32,119,104,105, 99,104, 32,105,115, 32,110,101,103, 97,116, -101,100, 32,115,111, 32, 99, 97,110, 99,101,108,115, 10, 9, 32, 32, 32,111,117,116, 32, 98,108,101,110,100,101,114, 32,110,111, -114,109, 97,108, 32,110,101,103, 97,116,105,111,110, 32, 42, 47, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,110,111, -114,109, 97,108,105,122,101, 40,110,111,114,109, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,116, - 97,110,103,101,110,116, 40,118,101, 99, 52, 32,116, 97,110,103,101,110,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117, -116,116, 97,110,103,101,110,116, 41, 10,123, 10, 9,111,117,116,116, 97,110,103,101,110,116, 32, 61, 32,110,111,114,109, 97,108, -105,122,101, 40,116, 97,110,103,101,110,116, 46,120,121,122, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95, -103,108,111, 98, 97,108, 40,109, 97,116, 52, 32,118,105,101,119,105,110,118,109, 97,116, 44, 32,118,101, 99, 51, 32, 99,111, 44, - 32,111,117,116, 32,118,101, 99, 51, 32,103,108,111, 98, 97,108, 41, 10,123, 10, 9,103,108,111, 98, 97,108, 32, 61, 32, 40,118, -105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40, 99,111, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10,125, 10, - 10,118,111,105,100, 32,116,101,120, 99,111, 95,111, 98,106,101, 99,116, 40,109, 97,116, 52, 32,118,105,101,119,105,110,118,109, - 97,116, 44, 32,109, 97,116, 52, 32,111, 98,105,110,118,109, 97,116, 44, 32,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32, -118,101, 99, 51, 32,111, 98,106,101, 99,116, 41, 10,123, 10, 9,111, 98,106,101, 99,116, 32, 61, 32, 40,111, 98,105,110,118,109, - 97,116, 42, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40, 99,111, 44, 32, 49, 46, 48, 41, 41, 41, 46,120, -121,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,114,101,102,108, 40,118,101, 99, 51, 32,118,110, 44, 32, -118,101, 99, 51, 32,118,105,101,119, 44, 32,111,117,116, 32,118,101, 99, 51, 32,114,101,102, 41, 10,123, 10, 9,114,101,102, 32, - 61, 32,118,105,101,119, 32, 45, 32, 50, 46, 48, 42,100,111,116, 40,118,110, 44, 32,118,105,101,119, 41, 42,118,110, 59, 10,125, - 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,110,111,114,109, 40,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111, -117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9, 47, 42, 32, 98,108,101,110,100,101,114, - 32,114,101,110,100,101,114, 32,110,111,114,109, 97,108, 32,105,115, 32,110,101,103, 97,116,101,100, 32, 42, 47, 10, 9,111,117, -116,110,111,114,109, 97,108, 32, 61, 32, 45,110,111,114,109, 97,108,105,122,101, 40,110,111,114,109, 97,108, 41, 59, 10,125, 10, - 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 98,108,101,110,100, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, - 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, - 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32, -102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, - 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32, -102, 97, 99,109, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,109,117, -108, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97, + 13, 10, 13, 10,118,111,105,100, 32,116,101,120, 99,111, 95,111,114, 99,111, 40,118,101, 99, 51, 32, 97,116,116,111,114, 99,111, + 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,114, 99,111, 41, 13, 10,123, 13, 10, 9,111,114, 99,111, 32, 61, 32, 97,116,116, +111,114, 99,111, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,116,101,120, 99,111, 95,117,118, 40,118,101, 99, 50, 32, 97, +116,116,117,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 41, 13, 10,123, 13, 10, 9, 47, 42, 32,100,105,115, 97, 98, +108,101,100, 32,102,111,114, 32,110,111,119, 44, 32,119,111,114,107,115, 32,116,111,103,101,116,104,101,114, 32,119,105,116,104, + 32,108,101, 97,118,105,110,103, 32,111,117,116, 32,109,116,101,120, 95, 50,100, 95,109, 97,112,112,105,110,103, 13, 10, 9, 32, + 32, 32,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,117,118, 42, 50, 46, 48, 32, 45, 32,118,101, 99, 50, 40, 49, 46, 48, + 44, 32, 49, 46, 48, 41, 44, 32, 48, 46, 48, 41, 59, 32, 42, 47, 13, 10, 9,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116, +117,118, 44, 32, 48, 46, 48, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,116,101,120, 99,111, 95,110,111,114,109, 40, +118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, + 13, 10,123, 13, 10, 9, 47, 42, 32, 99,111,114,114,101,115,112,111,110,100,115, 32,116,111, 32,115,104,105, 45, 62,111,114,110, + 44, 32,119,104,105, 99,104, 32,105,115, 32,110,101,103, 97,116,101,100, 32,115,111, 32, 99, 97,110, 99,101,108,115, 13, 10, 9, + 32, 32, 32,111,117,116, 32, 98,108,101,110,100,101,114, 32,110,111,114,109, 97,108, 32,110,101,103, 97,116,105,111,110, 32, 42, + 47, 13, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,110,111,114,109, 97,108, + 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,116,101,120, 99,111, 95,116, 97,110,103,101,110,116, 40,118,101, 99, 52, + 32,116, 97,110,103,101,110,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,116, 97,110,103,101,110,116, 41, 13, 10, +123, 13, 10, 9,111,117,116,116, 97,110,103,101,110,116, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,116, 97,110,103,101, +110,116, 46,120,121,122, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,116,101,120, 99,111, 95,103,108,111, 98, 97,108, + 40,109, 97,116, 52, 32,118,105,101,119,105,110,118,109, 97,116, 44, 32,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118, +101, 99, 51, 32,103,108,111, 98, 97,108, 41, 13, 10,123, 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, 99,111, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 13, 10,125, 13, 10, 13, 10, +118,111,105,100, 32,116,101,120, 99,111, 95,111, 98,106,101, 99,116, 40,109, 97,116, 52, 32,118,105,101,119,105,110,118,109, 97, +116, 44, 32,109, 97,116, 52, 32,111, 98,105,110,118,109, 97,116, 44, 32,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118, +101, 99, 51, 32,111, 98,106,101, 99,116, 41, 13, 10,123, 13, 10, 9,111, 98,106,101, 99,116, 32, 61, 32, 40,111, 98,105,110,118, +109, 97,116, 42, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40, 99,111, 44, 32, 49, 46, 48, 41, 41, 41, 46, +120,121,122, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,116,101,120, 99,111, 95,114,101,102,108, 40,118,101, 99, 51, 32, +118,110, 44, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,111,117,116, 32,118,101, 99, 51, 32,114,101,102, 41, 13, 10,123, 13, + 10, 9,114,101,102, 32, 61, 32,118,105,101,119, 32, 45, 32, 50, 46, 48, 42,100,111,116, 40,118,110, 44, 32,118,105,101,119, 41, + 42,118,110, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95,110,111,114,109, 40,118,101, 99, 51, 32, +110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 13, 10,123, 13, 10, + 9, 47, 42, 32, 98,108,101,110,100,101,114, 32,114,101,110,100,101,114, 32,110,111,114,109, 97,108, 32,105,115, 32,110,101,103, + 97,116,101,100, 32, 42, 47, 13, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32, 45,110,111,114,109, 97,108,105,122,101, + 40,110,111,114,109, 97,108, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 98,108, +101,110,100, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108, +111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105, +110, 99,111,108, 41, 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 13, 10, 13, 10, 9,102, 97, 99,116, 32, + 42, 61, 32,102, 97, 99,103, 59, 13, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 13, 10, 13, 10, 9, +105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,102, 97, 99,109, 42,111,117,116, 99,111, +108, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,109,117,108, 40,118,101, 99, 51, 32, +111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, + 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 13, 10,123, 13, + 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 13, 10, 13, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 13, + 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 13, 10, 13, 10, 9,105,110, 99,111,108, 32, 61, 32, 40, +102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 41, 42,111,117,116, 99,111,108, 59, 13, 10,125, 13, 10, + 13, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115, 99,114,101,101,110, 40,118,101, 99, 51, 32,111,117,116, 99, +111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, + 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 13, 10,123, 13, 10, 9,102,108, +111, 97,116, 32,102, 97, 99,109, 59, 13, 10, 13, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 13, 10, 9,102, 97, + 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 13, 10, 13, 10, 9,105,110, 99,111,108, 32, 61, 32,118,101, 99, 51, 40, + 49, 46, 48, 41, 32, 45, 32, 40,118,101, 99, 51, 40,102, 97, 99,109, 41, 32, 43, 32,102, 97, 99,116, 42, 40,118,101, 99, 51, 40, + 49, 46, 48, 41, 32, 45, 32,116,101,120, 99,111,108, 41, 41, 42, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32,111,117,116, + 99,111,108, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,111,118,101,114,108, 97, +121, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97, 116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99, -111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99, -103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32, 40, -102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 41, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118, -111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115, 99,114,101,101,110, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, - 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32, -102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, - 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, - 45,102, 97, 99,103, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32, 40,118,101, - 99, 51, 40,102, 97, 99,109, 41, 32, 43, 32,102, 97, 99,116, 42, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32,116,101,120, - 99,111,108, 41, 41, 42, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118, -111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,111,118,101,114,108, 97,121, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, - 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, - 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32, -102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, - 48, 45,102, 97, 99,103, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,114, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,105, -110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108, 46,114, 42, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, - 99,116, 42,116,101,120, 99,111,108, 46,114, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,105,110, 99,111,108, 46,114, 32, 61, 32, - 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101, -120, 99,111,108, 46,114, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, 59, 10, 10, 9,105,102, 40, -111,117,116, 99,111,108, 46,103, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,105,110, 99,111,108, 46,103, 32, 61, 32,111,117,116, 99, -111,108, 46,103, 42, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103, 41, 59, - 10, 9,101,108,115,101, 10, 9, 9,105,110, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, - 32, 50, 46, 48, 42,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 46,103, 41, 41, 42, 40, 49, 46, 48, - 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46, 98, 32, 60, 32, 48, 46, - 53, 41, 10, 9, 9,105,110, 99,111,108, 46, 98, 32, 61, 32,111,117,116, 99,111,108, 46, 98, 42, 40,102, 97, 99,109, 32, 43, 32, - 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46, 98, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,105,110, 99,111, -108, 46, 98, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42, 40, 49, 46, - 48, 32, 45, 32,116,101,120, 99,111,108, 46, 98, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46, 98, 41, 59, - 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115,117, 98, 40,118,101, 99, 51, 32,111,117,116, 99,111, -108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97, -116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,105,110, 99,111,108, - 32, 61, 32, 45,102, 97, 99,116, 42,102, 97, 99,103, 42,116,101,120, 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, - 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 97,100,100, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, - 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32, -102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,105,110, 99,111,108, 32, 61, - 32,102, 97, 99,116, 42,102, 97, 99,103, 42,116,101,120, 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118, -111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100,105,118, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, - 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99, -103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, - 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, - 99,116, 59, 10, 10, 9,105,102, 40,116,101,120, 99,111,108, 46,114, 32, 33, 61, 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46, -114, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,114, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 46, -114, 47,116,101,120, 99,111,108, 46,114, 59, 10, 9,105,102, 40,116,101,120, 99,111,108, 46,103, 32, 33, 61, 32, 48, 46, 48, 41, - 32,105,110, 99,111,108, 46,103, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,103, 32, 43, 32,102, 97, 99,116, 42, -111,117,116, 99,111,108, 46,103, 47,116,101,120, 99,111,108, 46,103, 59, 10, 9,105,102, 40,116,101,120, 99,111,108, 46, 98, 32, - 33, 61, 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46, 98, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46, 98, 32, - 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 46, 98, 47,116,101,120, 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111,105, -100, 32,109,116,101,120, 95,114,103, 98, 95,100,105,102,102, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, +111,108, 41, 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 13, 10, 13, 10, 9,102, 97, 99,116, 32, 42, 61, + 32,102, 97, 99,103, 59, 13, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 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,105,110, 99,111,108, 46,114, 32, 61, 32,111,117, +116, 99,111,108, 46,114, 42, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,114, + 41, 59, 13, 10, 9,101,108,115,101, 13, 10, 9, 9,105,110, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, + 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 46,114, 41, 41, 42, + 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, 59, 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,105,110, 99,111,108, 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 42, 40, +102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103, 41, 59, 13, 10, 9,101,108,115, +101, 13, 10, 9, 9,105,110, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, + 42,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 46,103, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111, +117,116, 99,111,108, 46,103, 41, 59, 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,105,110, 99,111,108, 46, 98, 32, 61, 32,111,117,116, 99,111,108, 46, 98, 42, 40,102, 97, 99,109, 32, 43, 32, 50, + 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46, 98, 41, 59, 13, 10, 9,101,108,115,101, 13, 10, 9, 9,105,110, 99, +111,108, 46, 98, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42, 40, 49, + 46, 48, 32, 45, 32,116,101,120, 99,111,108, 46, 98, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46, 98, 41, + 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115,117, 98, 40,118,101, 99, 51, 32,111, +117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32, +102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 13, 10,123, 13, 10, + 9,105,110, 99,111,108, 32, 61, 32, 45,102, 97, 99,116, 42,102, 97, 99,103, 42,116,101,120, 99,111,108, 32, 43, 32,111,117,116, + 99,111,108, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 97,100,100, 40,118,101, 99, + 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99, +116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 13, 10, +123, 13, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,102, 97, 99,103, 42,116,101,120, 99,111,108, 32, 43, 32,111, +117,116, 99,111,108, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100,105,118, 40,118, +101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, + 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, + 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 13, 10, 13, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, + 99,103, 59, 13, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 13, 10, 13, 10, 9,105,102, 40,116,101, +120, 99,111,108, 46,114, 32, 33, 61, 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46,114, 32, 61, 32,102, 97, 99,109, 42,111,117, +116, 99,111,108, 46,114, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 46,114, 47,116,101,120, 99,111,108, 46,114, 59, + 13, 10, 9,105,102, 40,116,101,120, 99,111,108, 46,103, 32, 33, 61, 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46,103, 32, 61, + 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,103, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 46,103, 47,116, +101,120, 99,111,108, 46,103, 59, 13, 10, 9,105,102, 40,116,101,120, 99,111,108, 46, 98, 32, 33, 61, 32, 48, 46, 48, 41, 32,105, +110, 99,111,108, 46, 98, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46, 98, 32, 43, 32,102, 97, 99,116, 42,111,117, +116, 99,111,108, 46, 98, 47,116,101,120, 99,111,108, 46, 98, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, + 95,114,103, 98, 95,100,105,102,102, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99, +111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32, +118,101, 99, 51, 32,105,110, 99,111,108, 41, 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 13, 10, 13, 10, + 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 13, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, + 59, 13, 10, 13, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 32, 43, 32,102, 97, 99,116, + 42, 97, 98,115, 40,116,101,120, 99,111,108, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105, +100, 32,109,116,101,120, 95,114,103, 98, 95,100, 97,114,107, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, - 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, - 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99, -116, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 32, 43, 32,102, 97, 99,116, 42, - 97, 98,115, 40,116,101,120, 99,111,108, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116, -101,120, 95,114,103, 98, 95,100, 97,114,107, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101, -120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117, -116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 44, 32, 99,111,108, - 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, - 99,116, 59, 10, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,114, 59, 10, 9,105,102, 40, 99, -111,108, 32, 60, 32,111,117,116, 99,111,108, 46,114, 41, 32,105,110, 99,111,108, 46,114, 32, 61, 32, 99,111,108, 59, 32,101,108, -115,101, 32,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108, 46,114, 59, 10, 9, 99,111,108, 32, 61, 32,102, 97, - 99,116, 42,116,101,120, 99,111,108, 46,103, 59, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 46,103, 41, - 32,105,110, 99,111,108, 46,103, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,103, 32, 61, 32,111, -117,116, 99,111,108, 46,103, 59, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46, 98, 59, 10, 9, -105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 46, 98, 41, 32,105,110, 99,111,108, 46, 98, 32, 61, 32, 99,111,108, - 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46, 98, 32, 61, 32,111,117,116, 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111, -105,100, 32,109,116,101,120, 95,114,103, 98, 95,108,105,103,104,116, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118, -101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, - 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99, -109, 44, 32, 99,111,108, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, - 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,114, 59, - 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 46,114, 41, 32,105,110, 99,111,108, 46,114, 32, 61, 32, 99, -111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108, 46,114, 59, 10, 9, 99,111, -108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103, 59, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, - 99,111,108, 46,103, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, - 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 59, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111, -108, 46, 98, 59, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 46, 98, 41, 32,105,110, 99,111,108, 46, 98, - 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46, 98, 32, 61, 32,111,117,116, 99,111,108, 46, 98, 59, - 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,104,117,101, 40,118,101, 99, 51, 32,111,117,116, 99,111, -108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97, -116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32, - 99,111,108, 59, 10, 10, 9,109,105,120, 95,104,117,101, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111, -117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, - 99,111,108, 41, 59, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 10,125, 10, 10,118, -111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115, 97,116, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, - 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99, -103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32, 99,111,108, 59, 10, - 10, 9,109,105,120, 95,115, 97,116, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111,117,116, 99,111,108, - 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, - 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109, -116,101,120, 95,114,103, 98, 95,118, 97,108, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101, -120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117, -116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32, 99,111,108, 59, 10, 10, 9,109,105,120, - 95,118, 97,108, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, - 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, 10, 9,105,110, 99, -111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114, -103, 98, 95, 99,111,108,111,114, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111, -108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118, -101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32, 99,111,108, 59, 10, 10, 9,109,105,120, 95, 99,111, -108,111,114, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41, - 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, 10, 9,105,110, 99,111, -108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97, -108,117,101, 95,118, 97,114,115, 40,105,110,111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, - 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99,109, 41, 10,123, 10, 9,102, 97, 99,116, 32, 42, - 61, 32, 97, 98,115, 40,102, 97, 99,103, 41, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, - 9,105,102, 40,102, 97, 99,103, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, -102, 97, 99,116, 59, 10, 9, 9,102, 97, 99,116, 32, 61, 32,102, 97, 99,109, 59, 10, 9, 9,102, 97, 99,109, 32, 61, 32,116,109, -112, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95, 98,108,101,110,100, 40,102, + 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32,102, 97, 99, +109, 44, 32, 99,111,108, 59, 13, 10, 13, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 13, 10, 9,102, 97, 99,109, + 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 13, 10, 13, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99, +111,108, 46,114, 59, 13, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 46,114, 41, 32,105,110, 99,111,108, + 46,114, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108, 46, +114, 59, 13, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103, 59, 13, 10, 9,105,102, 40, 99, +111,108, 32, 60, 32,111,117,116, 99,111,108, 46,103, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32, 99,111,108, 59, 32,101,108, +115,101, 32,105,110, 99,111,108, 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 59, 13, 10, 9, 99,111,108, 32, 61, 32,102, + 97, 99,116, 42,116,101,120, 99,111,108, 46, 98, 59, 13, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 46, + 98, 41, 32,105,110, 99,111,108, 46, 98, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46, 98, 32, 61, + 32,111,117,116, 99,111,108, 46, 98, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,108, +105,103,104,116, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102, +108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32, +105,110, 99,111,108, 41, 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 44, 32, 99,111,108, 59, 13, 10, 13, 10, + 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 13, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, + 59, 13, 10, 13, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,114, 59, 13, 10, 9,105,102, 40, + 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 46,114, 41, 32,105,110, 99,111,108, 46,114, 32, 61, 32, 99,111,108, 59, 32,101, +108,115,101, 32,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108, 46,114, 59, 13, 10, 9, 99,111,108, 32, 61, 32, +102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103, 59, 13, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, + 46,103, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,103, 32, + 61, 32,111,117,116, 99,111,108, 46,103, 59, 13, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46, + 98, 59, 13, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 46, 98, 41, 32,105,110, 99,111,108, 46, 98, 32, + 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46, 98, 32, 61, 32,111,117,116, 99,111,108, 46, 98, 59, 13, + 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,104,117,101, 40,118,101, 99, 51, 32,111,117,116, + 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108, +111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 13, 10,123, 13, 10, 9,118, +101, 99, 52, 32, 99,111,108, 59, 13, 10, 13, 10, 9,109,105,120, 95,104,117,101, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32, +118,101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, + 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, 13, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, + 98, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115, 97,116, 40,118,101, 99, 51, 32, +111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, + 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 13, 10,123, 13, + 10, 9,118,101, 99, 52, 32, 99,111,108, 59, 13, 10, 13, 10, 9,109,105,120, 95,115, 97,116, 40,102, 97, 99,116, 42,102, 97, 99, +103, 44, 32,118,101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111, +108, 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, 13, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, + 46,114,103, 98, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,118, 97,108, 40,118,101, + 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, + 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 13, + 10,123, 13, 10, 9,118,101, 99, 52, 32, 99,111,108, 59, 13, 10, 13, 10, 9,109,105,120, 95,118, 97,108, 40,102, 97, 99,116, 42, +102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101, +120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, 13, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, + 99,111,108, 46,114,103, 98, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 99,111,108, +111,114, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, + 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, + 99,111,108, 41, 13, 10,123, 13, 10, 9,118,101, 99, 52, 32, 99,111,108, 59, 13, 10, 13, 10, 9,109,105,120, 95, 99,111,108,111, +114, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, +118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, 13, 10, 9,105,110, 99,111,108, + 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95, +118, 97,108,117,101, 95,118, 97,114,115, 40,105,110,111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, + 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99,109, 41, 13, 10,123, 13, 10, 9,102, 97, + 99,116, 32, 42, 61, 32, 97, 98,115, 40,102, 97, 99,103, 41, 59, 13, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, + 99,116, 59, 13, 10, 13, 10, 9,105,102, 40,102, 97, 99,103, 32, 60, 32, 48, 46, 48, 41, 32,123, 13, 10, 9, 9,102,108,111, 97, +116, 32,116,109,112, 32, 61, 32,102, 97, 99,116, 59, 13, 10, 9, 9,102, 97, 99,116, 32, 61, 32,102, 97, 99,109, 59, 13, 10, 9, + 9,102, 97, 99,109, 32, 61, 32,116,109,112, 59, 13, 10, 9,125, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, + 95,118, 97,108,117,101, 95, 98,108,101,110,100, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, + 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, + 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32,102, 97, 99, +109, 59, 13, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, + 32,102, 97, 99,109, 41, 59, 13, 10, 13, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, + 43, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,118, + 97,108,117,101, 95,109,117,108, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, + 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, + 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 13, 10, + 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99, +109, 41, 59, 13, 10, 13, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99,103, 59, 13, 10, 9,105,110, 99, +111,108, 32, 61, 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 41, 42,111,117,116, 99,111,108, + 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,115, 99,114,101,101,110, 40,102, 108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99, -111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, - 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, - 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118, -111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,109,117,108, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, - 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, - 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, - 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, - 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99,103, 59, 10, - 9,105,110, 99,111,108, 32, 61, 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 41, 42,111,117, -116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,115, 99,114,101,101,110, 40, -102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97, -116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, - 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95, -118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102, 97, 99,109, 32, 61, - 32, 49, 46, 48, 32, 45, 32,102, 97, 99,103, 59, 10, 9,105,110, 99,111,108, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99, -109, 32, 43, 32,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32, -111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,115,117, 98, 40, -102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97, -116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, - 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95, -118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102, 97, 99,116, 32, 61, - 32, 45,102, 97, 99,116, 59, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,111, -117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95, 97,100,100, 40,102,108, -111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32, -102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111, -108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97, -114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102, 97, 99,116, 32, 61, 32,102, - 97, 99,116, 59, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,111,117,116, 99, -111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,100,105,118, 40,102,108,111, 97,116, - 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99, -116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10, -123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40, -102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,105,102, 40,116,101,120, 99,111,108, 32, 33, - 61, 32, 48, 46, 48, 41, 10, 9, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 32, 43, 32,102, - 97, 99,116, 42,111,117,116, 99,111,108, 47,116,101,120, 99,111,108, 59, 10, 9,101,108,115,101, 10, 9, 9,105,110, 99,111,108, - 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,100,105,102,102, 40, -102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97, -116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, - 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95, -118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,105,110, 99,111,108, 32, - 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 32, 43, 32,102, 97, 99,116, 42, 97, 98,115, 40,116,101,120, 99,111,108, 32, - 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,100, 97, -114,107, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102, -108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, - 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108, -117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102,108,111, - 97,116, 32, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 59, 10, 9,105,102, 40, 99,111,108, 32, 60, 32, -111,117,116, 99,111,108, 41, 32,105,110, 99,111,108, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 32, - 61, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,108,105,103, -104,116, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102, -108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, - 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108, -117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102,108,111, - 97,116, 32, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 59, 10, 9,105,102, 40, 99,111,108, 32, 62, 32, -111,117,116, 99,111,108, 41, 32,105,110, 99,111,108, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 32, - 61, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95, 99,108, 97, -109,112, 95,112,111,115,105,116,105,118,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, - 32,111,117,116,102, 97, 99, 41, 10,123, 10, 9,111,117,116,102, 97, 99, 32, 61, 32,109, 97,120, 40,102, 97, 99, 44, 32, 48, 46, - 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95, 99,108, 97,109,112, 40,102,108,111, - 97,116, 32,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,102, 97, 99, 41, 10,123, 10, 9,111,117,116, -102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118, -111,105,100, 32,109,116,101,120, 95,104, 97,114, 95,100,105,118,105,100,101, 40,102,108,111, 97,116, 32,104, 97,114, 44, 32,111, -117,116, 32,102,108,111, 97,116, 32,111,117,116,104, 97,114, 41, 10,123, 10, 9,111,117,116,104, 97,114, 32, 61, 32,104, 97,114, - 47, 49, 50, 56, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,104, 97,114, 95,109,117,108,116,105,112,108, -121, 95, 99,108, 97,109,112, 40,102,108,111, 97,116, 32,104, 97,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116, -104, 97,114, 41, 10,123, 10, 9,104, 97,114, 32, 42, 61, 32, 49, 50, 56, 46, 48, 59, 10, 10, 9,105,102, 40,104, 97,114, 32, 60, - 32, 49, 46, 48, 41, 32,111,117,116,104, 97,114, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40,104, 97,114, - 32, 62, 32, 53, 49, 49, 46, 48, 41, 32,111,117,116,104, 97,114, 32, 61, 32, 53, 49, 49, 46, 48, 59, 10, 9,101,108,115,101, 32, -111,117,116,104, 97,114, 32, 61, 32,104, 97,114, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 97,108,112,104, 97, - 95,102,114,111,109, 95, 99,111,108, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, 97,108, -112,104, 97, 41, 10,123, 10, 9, 97,108,112,104, 97, 32, 61, 32, 99,111,108, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109, -116,101,120, 95, 97,108,112,104, 97, 95,116,111, 95, 99,111,108, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,102,108,111, 97,116, - 32, 97,108,112,104, 97, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99, -111,108, 32, 61, 32,118,101, 99, 52, 40, 99,111,108, 46,114,103, 98, 44, 32, 97,108,112,104, 97, 41, 59, 10,125, 10, 10,118,111, -105,100, 32,109,116,101,120, 95,114,103, 98,116,111,105,110,116, 40,118,101, 99, 52, 32,114,103, 98, 44, 32,111,117,116, 32,102, -108,111, 97,116, 32,105,110,116,101,110,115,105,116,121, 41, 10,123, 10, 9,105,110,116,101,110,115,105,116,121, 32, 61, 32,100, -111,116, 40,118,101, 99, 51, 40, 48, 46, 51, 53, 44, 32, 48, 46, 52, 53, 44, 32, 48, 46, 50, 41, 44, 32,114,103, 98, 46,114,103, - 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,105,110,118,101,114,116, 40,102,108, -111, 97,116, 32,105,110,118, 97,108,117,101, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108,117,101, 41, - 10,123, 10, 9,111,117,116,118, 97,108,117,101, 32, 61, 32, 49, 46, 48, 32, 45, 32,105,110,118, 97,108,117,101, 59, 10,125, 10, - 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,105,110,118,101,114,116, 40,118,101, 99, 52, 32,105,110,114,103, 98, - 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98, 41, 10,123, 10, 9,111,117,116,114,103, 98, 32, 61, 32,118, -101, 99, 52, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32,105,110,114,103, 98, 46,114,103, 98, 44, 32,105,110,114,103, 98, - 46, 97, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,115,116,101,110, 99,105,108, 40, -102,108,111, 97,116, 32,115,116,101,110, 99,105,108, 44, 32,102,108,111, 97,116, 32,105,110,116,101,110,115,105,116,121, 44, 32, -111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,116,101,110, 99,105,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, -111,117,116,105,110,116,101,110,115,105,116,121, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,116, 32, 61, 32,105,110, -116,101,110,115,105,116,121, 59, 10, 9,111,117,116,105,110,116,101,110,115,105,116,121, 32, 61, 32,105,110,116,101,110,115,105, -116,121, 42,115,116,101,110, 99,105,108, 59, 10, 9,111,117,116,115,116,101,110, 99,105,108, 32, 61, 32,115,116,101,110, 99,105, -108, 42,102, 97, 99,116, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115,116,101,110, 99,105,108, - 40,102,108,111, 97,116, 32,115,116,101,110, 99,105,108, 44, 32,118,101, 99, 52, 32,114,103, 98, 44, 32,111,117,116, 32,102,108, -111, 97,116, 32,111,117,116,115,116,101,110, 99,105,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98, 41, - 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,116, 32, 61, 32,114,103, 98, 46, 97, 59, 10, 9,111,117,116,114,103, 98, 32, - 61, 32,118,101, 99, 52, 40,114,103, 98, 46,114,103, 98, 44, 32,114,103, 98, 46, 97, 42,115,116,101,110, 99,105,108, 41, 59, 10, - 9,111,117,116,115,116,101,110, 99,105,108, 32, 61, 32,115,116,101,110, 99,105,108, 42,102, 97, 99,116, 59, 10,125, 10, 10,118, -111,105,100, 32,109,116,101,120, 95,109, 97,112,112,105,110,103, 95,111,102,115, 40,118,101, 99, 51, 32,116,101,120, 99,111, 44, - 32,118,101, 99, 51, 32,111,102,115, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,116,101,120, 99,111, 41, 10,123, 10, - 9,111,117,116,116,101,120, 99,111, 32, 61, 32,116,101,120, 99,111, 32, 43, 32,111,102,115, 59, 10,125, 10, 10,118,111,105,100, - 32,109,116,101,120, 95,109, 97,112,112,105,110,103, 95,115,105,122,101, 40,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,118, -101, 99, 51, 32,115,105,122,101, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,116,101,120, 99,111, 41, 10,123, 10, 9, -111,117,116,116,101,120, 99,111, 32, 61, 32,115,105,122,101, 42,116,101,120, 99,111, 59, 10,125, 10, 10,118,111,105,100, 32,109, -116,101,120, 95, 50,100, 95,109, 97,112,112,105,110,103, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,118,101, 99, - 51, 32,111,117,116,118,101, 99, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 51, 40,118,101, 99, 46,120, -121, 42, 48, 46, 53, 32, 43, 32,118,101, 99, 50, 40, 48, 46, 53, 44, 32, 48, 46, 53, 41, 44, 32,118,101, 99, 46,122, 41, 59, 10, -125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,105,109, 97,103,101, 40,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,115, - 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,111, -117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,116,101,120,116,117,114, -101, 50, 68, 40,105,109, 97, 44, 32,116,101,120, 99,111, 46,120,121, 41, 59, 10, 9,118, 97,108,117,101, 32, 61, 32, 49, 46, 48, - 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,110,111,114,109, 97,108, 40,118,101, 99, 51, 32,116,101,120, 99,111, - 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, - 41, 10,123, 10, 9, 47, 47, 32, 84,104,101, 32,105,110,118,101,114,116, 32,111,102, 32,116,104,101, 32,114,101,100, 32, 99,104, - 97,110,110,101,108, 32,105,115, 32,116,111, 32,109, 97,107,101, 10, 9, 47, 47, 32,116,104,101, 32,110,111,114,109, 97,108, 32, -109, 97,112, 32, 99,111,109,112,108,105, 97,110,116, 32,119,105,116,104, 32,116,104,101, 32,111,117,116,115,105,100,101, 32,119, -111,114,108,100, 46, 10, 9, 47, 47, 32, 73,116, 32,110,101,101,100,115, 32,116,111, 32, 98,101, 32,100,111,110,101, 32, 98,101, - 99, 97,117,115,101, 32,105,110, 32, 66,108,101,110,100,101,114, 10, 9, 47, 47, 32,116,104,101, 32,110,111,114,109, 97,108, 32, -117,115,101,100, 32,112,111,105,110,116,115, 32,105,110,119, 97,114,100, 46, 10, 9, 47, 47, 32, 83,104,111,117,108,100, 32,116, -104,105,115, 32,101,118,101,114, 32, 99,104, 97,110,103,101, 32,116,104,105,115, 32,110,101,103, 97,116,101, 32,109,117,115,116, - 32, 98,101, 32,114,101,109,111,118,101,100, 46, 10, 32, 32, 32, 32,118,101, 99, 52, 32, 99,111,108,111,114, 32, 61, 32,116,101, -120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32,116,101,120, 99,111, 46,120,121, 41, 59, 10, 9,110,111,114,109, 97,108, 32, - 61, 32, 50, 46, 48, 42, 40,118,101, 99, 51, 40, 45, 99,111,108,111,114, 46,114, 44, 32, 99,111,108,111,114, 46,103, 44, 32, 99, -111,108,111,114, 46, 98, 41, 32, 45, 32,118,101, 99, 51, 40, 45, 48, 46, 53, 44, 32, 48, 46, 53, 44, 32, 48, 46, 53, 41, 41, 59, - 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,110,111,114,109, 97,108,115, 95,105,110,105,116, 40, - 32,118,101, 99, 51, 32,118, 78, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78,111,114,103, 44, 32,111,117,116, 32,118,101, - 99, 51, 32,118, 78, 97, 99, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117, -100,101, 32, 41, 10,123, 10, 9,118, 78,111,114,103, 32, 61, 32,118, 78, 59, 10, 9,118, 78, 97, 99, 99, 32, 61, 32,118, 78, 59, - 10, 9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10, 47, 42, 42, 32,104, -101,108,112,101,114, 32,109,101,116,104,111,100, 32,116,111, 32,101,120,116,114, 97, 99,116, 32,116,104,101, 32,117,112,112,101, -114, 32,108,101,102,116, 32, 51,120, 51, 32,109, 97,116,114,105,120, 32,102,114,111,109, 32, 97, 32, 52,120, 52, 32,109, 97,116, -114,105,120, 32, 42, 47, 10,109, 97,116, 51, 32,116,111, 95,109, 97,116, 51, 40,109, 97,116, 52, 32,109, 52, 41, 10,123, 10, 9, -109, 97,116, 51, 32,109, 51, 59, 10, 9,109, 51, 91, 48, 93, 32, 61, 32,109, 52, 91, 48, 93, 46,120,121,122, 59, 10, 9,109, 51, - 91, 49, 93, 32, 61, 32,109, 52, 91, 49, 93, 46,120,121,122, 59, 10, 9,109, 51, 91, 50, 93, 32, 61, 32,109, 52, 91, 50, 93, 46, -120,121,122, 59, 10, 9,114,101,116,117,114,110, 32,109, 51, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117, -109,112, 95,105,110,105,116, 95,111, 98,106,115,112, 97, 99,101, 40, 32,118,101, 99, 51, 32,115,117,114,102, 95,112,111,115, 44, - 32,118,101, 99, 51, 32,115,117,114,102, 95,110,111,114,109, 44, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32,109, 97,116, 52, 32,109, - 86,105,101,119, 44, 32,109, 97,116, 52, 32,109, 86,105,101,119, 73,110,118, 44, 32,109, 97,116, 52, 32,109, 79, 98,106, 44, 32, -109, 97,116, 52, 32,109, 79, 98,106, 73,110,118, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32,102,108,111, 97,116, 32,102, 80, -114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 10, - 9, 9, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100, -101, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32, 10, 9, 9, 9, 9, - 9, 9, 9, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 50, 44, - 32,111,117,116, 32,102,108,111, 97,116, 32,102, 68,101,116, 32, 41, 32, 10,123, 10, 9,109, 97,116, 51, 32,111, 98,106, 50,118, -105,101,119, 32, 61, 32,116,111, 95,109, 97,116, 51, 40,109, 86,105,101,119, 32, 42, 32,109, 79, 98,106, 41, 59, 10, 9,109, 97, -116, 51, 32,118,105,101,119, 50,111, 98,106, 32, 61, 32,116,111, 95,109, 97,116, 51, 40,109, 79, 98,106, 73,110,118, 32, 42, 32, -109, 86,105,101,119, 73,110,118, 41, 59, 10, 9, 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 83, 32, 61, 32,118,105,101, -119, 50,111, 98,106, 32, 42, 32,100, 70,100,120, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,101, 99, 51, 32, -118, 83,105,103,109, 97, 84, 32, 61, 32,118,105,101,119, 50,111, 98,106, 32, 42, 32,100, 70,100,121, 40, 32,115,117,114,102, 95, -112,111,115, 32, 41, 59, 10, 9,118,101, 99, 51, 32,118, 78, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32,115,117,114, -102, 95,110,111,114,109, 32, 42, 32,111, 98,106, 50,118,105,101,119, 32, 41, 59, 10, 10, 9,118, 82, 49, 32, 61, 32, 99,114,111, -115,115, 40, 32,118, 83,105,103,109, 97, 84, 44, 32,118, 78, 32, 41, 59, 10, 9,118, 82, 50, 32, 61, 32, 99,114,111,115,115, 40, - 32,118, 78, 44, 32,118, 83,105,103,109, 97, 83, 32, 41, 32, 59, 10, 9,102, 68,101,116, 32, 61, 32,100,111,116, 32, 40, 32,118, - 83,105,103,109, 97, 83, 44, 32,118, 82, 49, 32, 41, 59, 10, 9, 10, 9, 47, 42, 32,112,114,101,116,114, 97,110,115,102,111,114, +111,108, 41, 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 13, 10, 9,109,116,101,120, 95,118, 97,108,117, +101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 13, 10, 13, 10, 9,102, 97, + 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99,103, 59, 13, 10, 9,105,110, 99,111,108, 32, 61, 32, 49, 46, 48, 32, 45, + 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 41, 41, 42, 40, 49, + 46, 48, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97, +108,117,101, 95,115,117, 98, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99, +111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32, +102,108,111, 97,116, 32,105,110, 99,111,108, 41, 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 13, 10, 9, +109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, + 41, 59, 13, 10, 13, 10, 9,102, 97, 99,116, 32, 61, 32, 45,102, 97, 99,116, 59, 13, 10, 9,105,110, 99,111,108, 32, 61, 32,102, + 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32, +109,116,101,120, 95,118, 97,108,117,101, 95, 97,100,100, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, + 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99, +103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32,102, + 97, 99,109, 59, 13, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99, +103, 44, 32,102, 97, 99,109, 41, 59, 13, 10, 13, 10, 9,102, 97, 99,116, 32, 61, 32,102, 97, 99,116, 59, 13, 10, 9,105,110, 99, +111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59, 13, 10,125, 13, 10, 13, + 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,100,105,118, 40,102,108,111, 97,116, 32,111,117,116, 99,111, +108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, + 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 13, 10,123, 13, 10, 9,102, +108,111, 97,116, 32,102, 97, 99,109, 59, 13, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99, +116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 13, 10, 13, 10, 9,105,102, 40,116,101,120, 99,111,108, 32, 33, 61, + 32, 48, 46, 48, 41, 13, 10, 9, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 32, 43, 32,102, + 97, 99,116, 42,111,117,116, 99,111,108, 47,116,101,120, 99,111,108, 59, 13, 10, 9,101,108,115,101, 13, 10, 9, 9,105,110, 99, +111,108, 32, 61, 32, 48, 46, 48, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95, +100,105,102,102, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, + 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, + 97,116, 32,105,110, 99,111,108, 41, 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 13, 10, 9,109,116,101, +120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 13, + 10, 13, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 32, 43, 32,102, 97, 99,116, 42, 97, + 98,115, 40,116,101,120, 99,111,108, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32, +109,116,101,120, 95,118, 97,108,117,101, 95,100, 97,114,107, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108, +111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, + 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32, +102, 97, 99,109, 59, 13, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, + 99,103, 44, 32,102, 97, 99,109, 41, 59, 13, 10, 13, 10, 9,102,108,111, 97,116, 32, 99,111,108, 32, 61, 32,102, 97, 99,116, 42, +116,101,120, 99,111,108, 59, 13, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 41, 32,105,110, 99,111,108, + 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 32, 61, 32,111,117,116, 99,111,108, 59, 13, 10,125, 13, + 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,108,105,103,104,116, 40,102,108,111, 97,116, 32,111, +117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, + 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 13, 10,123, + 13, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 13, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, + 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 13, 10, 13, 10, 9,102,108,111, 97,116, 32, 99,111, +108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 59, 13, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99, +111,108, 41, 32,105,110, 99,111,108, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 32, 61, 32,111,117, +116, 99,111,108, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95, 99,108, 97,109, +112, 95,112,111,115,105,116,105,118,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, +111,117,116,102, 97, 99, 41, 13, 10,123, 13, 10, 9,111,117,116,102, 97, 99, 32, 61, 32,109, 97,120, 40,102, 97, 99, 44, 32, 48, + 46, 48, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95, 99,108, 97,109,112, + 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,102, 97, 99, 41, 13, 10,123, + 13, 10, 9,111,117,116,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, + 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,104, 97,114, 95,100,105,118,105,100,101, 40,102,108,111, + 97,116, 32,104, 97,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,104, 97,114, 41, 13, 10,123, 13, 10, 9,111, +117,116,104, 97,114, 32, 61, 32,104, 97,114, 47, 49, 50, 56, 46, 48, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116, +101,120, 95,104, 97,114, 95,109,117,108,116,105,112,108,121, 95, 99,108, 97,109,112, 40,102,108,111, 97,116, 32,104, 97,114, 44, + 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,104, 97,114, 41, 13, 10,123, 13, 10, 9,104, 97,114, 32, 42, 61, 32, 49, + 50, 56, 46, 48, 59, 13, 10, 13, 10, 9,105,102, 40,104, 97,114, 32, 60, 32, 49, 46, 48, 41, 32,111,117,116,104, 97,114, 32, 61, + 32, 49, 46, 48, 59, 13, 10, 9,101,108,115,101, 32,105,102, 40,104, 97,114, 32, 62, 32, 53, 49, 49, 46, 48, 41, 32,111,117,116, +104, 97,114, 32, 61, 32, 53, 49, 49, 46, 48, 59, 13, 10, 9,101,108,115,101, 32,111,117,116,104, 97,114, 32, 61, 32,104, 97,114, + 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95, 97,108,112,104, 97, 95,102,114,111,109, 95, 99,111,108, + 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, 97,108,112,104, 97, 41, 13, 10,123, 13, 10, + 9, 97,108,112,104, 97, 32, 61, 32, 99,111,108, 46, 97, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95, + 97,108,112,104, 97, 95,116,111, 95, 99,111,108, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,102,108,111, 97,116, 32, 97,108,112, +104, 97, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 13, 10,123, 13, 10, 9,111,117,116, 99,111,108, + 32, 61, 32,118,101, 99, 52, 40, 99,111,108, 46,114,103, 98, 44, 32, 97,108,112,104, 97, 41, 59, 13, 10,125, 13, 10, 13, 10,118, +111,105,100, 32,109,116,101,120, 95,114,103, 98,116,111,105,110,116, 40,118,101, 99, 52, 32,114,103, 98, 44, 32,111,117,116, 32, +102,108,111, 97,116, 32,105,110,116,101,110,115,105,116,121, 41, 13, 10,123, 13, 10, 9,105,110,116,101,110,115,105,116,121, 32, + 61, 32,100,111,116, 40,118,101, 99, 51, 40, 48, 46, 51, 53, 44, 32, 48, 46, 52, 53, 44, 32, 48, 46, 50, 41, 44, 32,114,103, 98, + 46,114,103, 98, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,105,110,118, +101,114,116, 40,102,108,111, 97,116, 32,105,110,118, 97,108,117,101, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116, +118, 97,108,117,101, 41, 13, 10,123, 13, 10, 9,111,117,116,118, 97,108,117,101, 32, 61, 32, 49, 46, 48, 32, 45, 32,105,110,118, + 97,108,117,101, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,105,110,118,101,114,116, + 40,118,101, 99, 52, 32,105,110,114,103, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98, 41, 13, 10,123, + 13, 10, 9,111,117,116,114,103, 98, 32, 61, 32,118,101, 99, 52, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32,105,110,114, +103, 98, 46,114,103, 98, 44, 32,105,110,114,103, 98, 46, 97, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101, +120, 95,118, 97,108,117,101, 95,115,116,101,110, 99,105,108, 40,102,108,111, 97,116, 32,115,116,101,110, 99,105,108, 44, 32,102, +108,111, 97,116, 32,105,110,116,101,110,115,105,116,121, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,116,101, +110, 99,105,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,105,110,116,101,110,115,105,116,121, 41, 13, 10,123, + 13, 10, 9,102,108,111, 97,116, 32,102, 97, 99,116, 32, 61, 32,105,110,116,101,110,115,105,116,121, 59, 13, 10, 9,111,117,116, +105,110,116,101,110,115,105,116,121, 32, 61, 32,105,110,116,101,110,115,105,116,121, 42,115,116,101,110, 99,105,108, 59, 13, 10, + 9,111,117,116,115,116,101,110, 99,105,108, 32, 61, 32,115,116,101,110, 99,105,108, 42,102, 97, 99,116, 59, 13, 10,125, 13, 10, + 13, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115,116,101,110, 99,105,108, 40,102,108,111, 97,116, 32,115,116, +101,110, 99,105,108, 44, 32,118,101, 99, 52, 32,114,103, 98, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,116, +101,110, 99,105,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98, 41, 13, 10,123, 13, 10, 9,102,108,111, + 97,116, 32,102, 97, 99,116, 32, 61, 32,114,103, 98, 46, 97, 59, 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,114,103, 98, 46, 97, 42,115,116,101,110, 99,105,108, 41, 59, 13, 10, 9,111,117,116,115, +116,101,110, 99,105,108, 32, 61, 32,115,116,101,110, 99,105,108, 42,102, 97, 99,116, 59, 13, 10,125, 13, 10, 13, 10,118,111,105, +100, 32,109,116,101,120, 95,109, 97,112,112,105,110,103, 95,111,102,115, 40,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,118, +101, 99, 51, 32,111,102,115, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,116,101,120, 99,111, 41, 13, 10,123, 13, 10, + 9,111,117,116,116,101,120, 99,111, 32, 61, 32,116,101,120, 99,111, 32, 43, 32,111,102,115, 59, 13, 10,125, 13, 10, 13, 10,118, +111,105,100, 32,109,116,101,120, 95,109, 97,112,112,105,110,103, 95,115,105,122,101, 40,118,101, 99, 51, 32,116,101,120, 99,111, + 44, 32,118,101, 99, 51, 32,115,105,122,101, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,116,101,120, 99,111, 41, 13, + 10,123, 13, 10, 9,111,117,116,116,101,120, 99,111, 32, 61, 32,115,105,122,101, 42,116,101,120, 99,111, 59, 13, 10,125, 13, 10, + 13, 10,118,111,105,100, 32,109,116,101,120, 95, 50,100, 95,109, 97,112,112,105,110,103, 40,118,101, 99, 51, 32,118,101, 99, 44, + 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 13, 10,123, 13, 10, 9,111,117,116,118,101, 99, 32, 61, 32, +118,101, 99, 51, 40,118,101, 99, 46,120,121, 42, 48, 46, 53, 32, 43, 32,118,101, 99, 50, 40, 48, 46, 53, 44, 32, 48, 46, 53, 41, + 44, 32,118,101, 99, 46,122, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,105,109, 97,103,101, 40, +118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,111,117,116, 32,102, +108,111, 97,116, 32,118, 97,108,117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 41, 13, 10,123, 13, 10, + 9, 99,111,108,111,114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32,116,101,120, 99,111, 46,120,121, + 41, 59, 13, 10, 9,118, 97,108,117,101, 32, 61, 32, 49, 46, 48, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101, +120, 95,110,111,114,109, 97,108, 40,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105, +109, 97, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 41, 13, 10,123, 13, 10, 9, 47, 47, 32, 84,104,101, + 32,105,110,118,101,114,116, 32,111,102, 32,116,104,101, 32,114,101,100, 32, 99,104, 97,110,110,101,108, 32,105,115, 32,116,111, + 32,109, 97,107,101, 13, 10, 9, 47, 47, 32,116,104,101, 32,110,111,114,109, 97,108, 32,109, 97,112, 32, 99,111,109,112,108,105, + 97,110,116, 32,119,105,116,104, 32,116,104,101, 32,111,117,116,115,105,100,101, 32,119,111,114,108,100, 46, 13, 10, 9, 47, 47, + 32, 73,116, 32,110,101,101,100,115, 32,116,111, 32, 98,101, 32,100,111,110,101, 32, 98,101, 99, 97,117,115,101, 32,105,110, 32, + 66,108,101,110,100,101,114, 13, 10, 9, 47, 47, 32,116,104,101, 32,110,111,114,109, 97,108, 32,117,115,101,100, 32,112,111,105, +110,116,115, 32,105,110,119, 97,114,100, 46, 13, 10, 9, 47, 47, 32, 83,104,111,117,108,100, 32,116,104,105,115, 32,101,118,101, +114, 32, 99,104, 97,110,103,101, 32,116,104,105,115, 32,110,101,103, 97,116,101, 32,109,117,115,116, 32, 98,101, 32,114,101,109, +111,118,101,100, 46, 13, 10, 32, 32, 32, 32,118,101, 99, 52, 32, 99,111,108,111,114, 32, 61, 32,116,101,120,116,117,114,101, 50, + 68, 40,105,109, 97, 44, 32,116,101,120, 99,111, 46,120,121, 41, 59, 13, 10, 9,110,111,114,109, 97,108, 32, 61, 32, 50, 46, 48, + 42, 40,118,101, 99, 51, 40, 45, 99,111,108,111,114, 46,114, 44, 32, 99,111,108,111,114, 46,103, 44, 32, 99,111,108,111,114, 46, + 98, 41, 32, 45, 32,118,101, 99, 51, 40, 45, 48, 46, 53, 44, 32, 48, 46, 53, 44, 32, 48, 46, 53, 41, 41, 59, 13, 10,125, 13, 10, + 13, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,110,111,114,109, 97,108,115, 95,105,110,105,116, 40, 32,118, +101, 99, 51, 32,118, 78, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78,111,114,103, 44, 32,111,117,116, 32,118,101, 99, 51, + 32,118, 78, 97, 99, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, + 32, 41, 13, 10,123, 13, 10, 9,118, 78,111,114,103, 32, 61, 32,118, 78, 59, 13, 10, 9,118, 78, 97, 99, 99, 32, 61, 32,118, 78, + 59, 13, 10, 9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 49, 46, 48, 59, 13, 10,125, 13, 10, 13, 10, + 47, 42, 42, 32,104,101,108,112,101,114, 32,109,101,116,104,111,100, 32,116,111, 32,101,120,116,114, 97, 99,116, 32,116,104,101, + 32,117,112,112,101,114, 32,108,101,102,116, 32, 51,120, 51, 32,109, 97,116,114,105,120, 32,102,114,111,109, 32, 97, 32, 52,120, + 52, 32,109, 97,116,114,105,120, 32, 42, 47, 13, 10,109, 97,116, 51, 32,116,111, 95,109, 97,116, 51, 40,109, 97,116, 52, 32,109, + 52, 41, 13, 10,123, 13, 10, 9,109, 97,116, 51, 32,109, 51, 59, 13, 10, 9,109, 51, 91, 48, 93, 32, 61, 32,109, 52, 91, 48, 93, + 46,120,121,122, 59, 13, 10, 9,109, 51, 91, 49, 93, 32, 61, 32,109, 52, 91, 49, 93, 46,120,121,122, 59, 13, 10, 9,109, 51, 91, + 50, 93, 32, 61, 32,109, 52, 91, 50, 93, 46,120,121,122, 59, 13, 10, 9,114,101,116,117,114,110, 32,109, 51, 59, 13, 10,125, 13, + 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,105,110,105,116, 95,111, 98,106,115,112, 97, 99,101, 40, + 32,118,101, 99, 51, 32,115,117,114,102, 95,112,111,115, 44, 32,118,101, 99, 51, 32,115,117,114,102, 95,110,111,114,109, 44, 13, + 10, 9, 9, 9, 9, 9, 9, 9, 32, 32,109, 97,116, 52, 32,109, 86,105,101,119, 44, 32,109, 97,116, 52, 32,109, 86,105,101,119, + 73,110,118, 44, 32,109, 97,116, 52, 32,109, 79, 98,106, 44, 32,109, 97,116, 52, 32,109, 79, 98,106, 73,110,118, 44, 32, 13, 10, + 9, 9, 9, 9, 9, 9, 9, 32, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, + 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 13, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,102, +108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, + 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32, 13, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,118,101, 99, 51, + 32,118, 82, 49, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 68, +101,116, 32, 41, 32, 13, 10,123, 13, 10, 9,109, 97,116, 51, 32,111, 98,106, 50,118,105,101,119, 32, 61, 32,116,111, 95,109, 97, +116, 51, 40,109, 86,105,101,119, 32, 42, 32,109, 79, 98,106, 41, 59, 13, 10, 9,109, 97,116, 51, 32,118,105,101,119, 50,111, 98, +106, 32, 61, 32,116,111, 95,109, 97,116, 51, 40,109, 79, 98,106, 73,110,118, 32, 42, 32,109, 86,105,101,119, 73,110,118, 41, 59, + 13, 10, 9, 13, 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 83, 32, 61, 32,118,105,101,119, 50,111, 98,106, 32, 42, 32, +100, 70,100,120, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 13, 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 84, + 32, 61, 32,118,105,101,119, 50,111, 98,106, 32, 42, 32,100, 70,100,121, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 13, + 10, 9,118,101, 99, 51, 32,118, 78, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32,115,117,114,102, 95,110,111,114,109, + 32, 42, 32,111, 98,106, 50,118,105,101,119, 32, 41, 59, 13, 10, 13, 10, 9,118, 82, 49, 32, 61, 32, 99,114,111,115,115, 40, 32, +118, 83,105,103,109, 97, 84, 44, 32,118, 78, 32, 41, 59, 13, 10, 9,118, 82, 50, 32, 61, 32, 99,114,111,115,115, 40, 32,118, 78, + 44, 32,118, 83,105,103,109, 97, 83, 32, 41, 32, 59, 13, 10, 9,102, 68,101,116, 32, 61, 32,100,111,116, 32, 40, 32,118, 83,105, +103,109, 97, 83, 44, 32,118, 82, 49, 32, 41, 59, 13, 10, 9, 13, 10, 9, 47, 42, 32,112,114,101,116,114, 97,110,115,102,111,114, 109, 32,118, 78, 97, 99, 99, 32, 40,105,110, 32,109,116,101,120, 95, 98,117,109,112, 95, 97,112,112,108,121, 41, 32,117,115,105, -110,103, 32,116,104,101, 32,105,110,118,101,114,115,101, 32,116,114, 97,110,115,112,111,115,101,100, 32, 42, 47, 10, 9,118, 82, - 49, 32, 61, 32,118, 82, 49, 32, 42, 32,118,105,101,119, 50,111, 98,106, 59, 10, 9,118, 82, 50, 32, 61, 32,118, 82, 50, 32, 42, - 32,118,105,101,119, 50,111, 98,106, 59, 10, 9,118, 78, 32, 61, 32,118, 78, 32, 42, 32,118,105,101,119, 50,111, 98,106, 59, 10, - 9, 10, 9,102,108,111, 97,116, 32,102, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 97, 98,115, 40,102, 68,101,116, 41, 32, - 42, 32,108,101,110,103,116,104, 40,118, 78, 41, 59, 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, - 95,105,110, 32, 42, 32, 40,102, 77, 97,103,110,105,116,117,100,101, 32, 47, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117, -100,101, 95,105,110, 41, 59, 10, 9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 32, 61, 32,102, 77, - 97,103,110,105,116,117,100,101, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,105,110,105,116, - 95,116,101,120,116,117,114,101,115,112, 97, 99,101, 40, 32,118,101, 99, 51, 32,115,117,114,102, 95,112,111,115, 44, 32,118,101, - 99, 51, 32,115,117,114,102, 95,110,111,114,109, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 9, 32, 32,102,108,111, 97,116, 32,102, - 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, - 10, 9, 9, 9, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116, -117,100,101, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32, 10, 9, 9, - 9, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, - 82, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 68,101,116, 32, 41, 32, 10,123, 10, 9,118,101, 99, 51, 32,118, 83, -105,103,109, 97, 83, 32, 61, 32,100, 70,100,120, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,101, 99, 51, 32, -118, 83,105,103,109, 97, 84, 32, 61, 32,100, 70,100,121, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,101, 99, - 51, 32,118, 78, 32, 61, 32,115,117,114,102, 95,110,111,114,109, 59, 32, 47, 42, 32,110,111,114,109, 97,108,105,122,101,100, 32, -105,110,116,101,114,112,111,108, 97,116,101,100, 32,118,101,114,116,101,120, 32,110,111,114,109, 97,108, 32, 42, 47, 10, 9, 10, - 9,118, 82, 49, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32, 99,114,111,115,115, 40, 32,118, 83,105,103,109, 97, 84, - 44, 32,118, 78, 32, 41, 32, 41, 59, 10, 9,118, 82, 50, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32, 99,114,111,115, -115, 40, 32,118, 78, 44, 32,118, 83,105,103,109, 97, 83, 32, 41, 32, 41, 59, 10, 9,102, 68,101,116, 32, 61, 32,115,105,103,110, - 40, 32,100,111,116, 40,118, 83,105,103,109, 97, 83, 44, 32,118, 82, 49, 41, 32, 41, 59, 10, 9, 10, 9,102,108,111, 97,116, 32, -102, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 97, 98,115, 40,102, 68,101,116, 41, 59, 10, 9,118, 78, 97, 99, 99, 95,111, -117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 42, 32, 40,102, 77, 97,103,110,105,116,117,100,101, 32, 47, 32,102, 80, -114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 41, 59, 10, 9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100, -101, 95,111,117,116, 32, 61, 32,102, 77, 97,103,110,105,116,117,100,101, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, - 95, 98,117,109,112, 95,105,110,105,116, 95,118,105,101,119,115,112, 97, 99,101, 40, 32,118,101, 99, 51, 32,115,117,114,102, 95, -112,111,115, 44, 32,118,101, 99, 51, 32,115,117,114,102, 95,110,111,114,109, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32, -102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 44, 32,118,101, 99, 51, 32,118, 78, - 97, 99, 99, 95,105,110, 44, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101, -118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111, -117,116, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,111,117,116, - 32,118,101, 99, 51, 32,118, 82, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 68,101,116, 32, 41, 32, 10,123, 10, 9, -118,101, 99, 51, 32,118, 83,105,103,109, 97, 83, 32, 61, 32,100, 70,100,120, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, - 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 84, 32, 61, 32,100, 70,100,121, 40, 32,115,117,114,102, 95,112,111,115, 32, - 41, 59, 10, 9,118,101, 99, 51, 32,118, 78, 32, 61, 32,115,117,114,102, 95,110,111,114,109, 59, 32, 47, 42, 32,110,111,114,109, - 97,108,105,122,101,100, 32,105,110,116,101,114,112,111,108, 97,116,101,100, 32,118,101,114,116,101,120, 32,110,111,114,109, 97, -108, 32, 42, 47, 10, 9, 10, 9,118, 82, 49, 32, 61, 32, 99,114,111,115,115, 40, 32,118, 83,105,103,109, 97, 84, 44, 32,118, 78, - 32, 41, 59, 10, 9,118, 82, 50, 32, 61, 32, 99,114,111,115,115, 40, 32,118, 78, 44, 32,118, 83,105,103,109, 97, 83, 32, 41, 32, - 59, 10, 9,102, 68,101,116, 32, 61, 32,100,111,116, 32, 40, 32,118, 83,105,103,109, 97, 83, 44, 32,118, 82, 49, 32, 41, 59, 10, - 9, 10, 9,102,108,111, 97,116, 32,102, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 97, 98,115, 40,102, 68,101,116, 41, 59, - 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 42, 32, 40,102, 77, 97,103,110,105, -116,117,100,101, 32, 47, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 41, 59, 10, 9,102, 80,114,101, -118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 32, 61, 32,102, 77, 97,103,110,105,116,117,100,101, 59, 10,125, 10, 10, -118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,116, 97,112, 51, 40, 32,118,101, 99, 51, 32,116,101,120, 99,111, 44, - 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,102,108,111, 97,116, 32,104, 83, 99, 97,108,101, 44, 32, 10, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66, -115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,116, 32, 41, 32, 10,123, 10, 9,118,101, 99, 50, 32, 83, 84,108,108, - 32, 61, 32,116,101,120, 99,111, 46,120,121, 59, 10, 9,118,101, 99, 50, 32, 83, 84,108,114, 32, 61, 32,116,101,120, 99,111, 46, -120,121, 32, 43, 32,100, 70,100,120, 40,116,101,120, 99,111, 46,120,121, 41, 32, 59, 10, 9,118,101, 99, 50, 32, 83, 84,117,108, - 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43, 32,100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41, 32, 59, 10, 9, - 10, 9,102,108,111, 97,116, 32, 72,108,108, 44, 72,108,114, 44, 72,117,108, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116, -101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,108,108, 41, 44, 32, 72,108,108, 32, 41, 59, 10, 9,114,103, 98, -116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,108,114, 41, 44, 32, 72,108,114, 32, - 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,117,108, - 41, 44, 32, 72,117,108, 32, 41, 59, 10, 9, 10, 9,100, 66,115, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32, 40, 72,108,114, - 32, 45, 32, 72,108,108, 41, 59, 10, 9,100, 66,116, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32, 40, 72,117,108, 32, 45, 32, - 72,108,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,116, 97,112, 53, 40, 32,118,101, - 99, 51, 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,102,108,111, 97,116, 32,104, - 83, 99, 97,108,101, 44, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,111,117,116, - 32,102,108,111, 97,116, 32,100, 66,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,116, 32, 41, 32, 10,123, 10, 9, -118,101, 99, 50, 32, 84,101,120, 68,120, 32, 61, 32,100, 70,100,120, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10, 9,118,101, - 99, 50, 32, 84,101,120, 68,121, 32, 61, 32,100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10, 10, 9,118,101, 99, - 50, 32, 83, 84, 99, 32, 61, 32,116,101,120, 99,111, 46,120,121, 59, 10, 9,118,101, 99, 50, 32, 83, 84,108, 32, 61, 32,116,101, -120, 99,111, 46,120,121, 32, 45, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,120, 32, 59, 10, 9,118,101, 99, 50, 32, 83, 84,114, - 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,120, 32, 59, 10, 9,118,101, 99, - 50, 32, 83, 84,100, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 45, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,121, 32, 59, - 10, 9,118,101, 99, 50, 32, 83, 84,117, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43, 32, 48, 46, 53, 32, 42, 32, 84,101, -120, 68,121, 32, 59, 10, 9, 10, 9,102,108,111, 97,116, 32, 72, 99, 44, 72,108, 44, 72,114, 44, 72,100, 44, 72,117, 59, 10, 9, -114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84, 99, 41, 44, 32, 72, 99, - 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,108, - 41, 44, 32, 72,108, 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, - 44, 32, 83, 84,114, 41, 44, 32, 72,114, 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, - 68, 40,105,109, 97, 44, 32, 83, 84,100, 41, 44, 32, 72,100, 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120, -116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,117, 41, 44, 32, 72,117, 32, 41, 59, 10, 9, 10, 9,100, 66,115, 32, 61, - 32,104, 83, 99, 97,108,101, 32, 42, 32, 40, 72,114, 32, 45, 32, 72,108, 41, 59, 10, 9,100, 66,116, 32, 61, 32,104, 83, 99, 97, -108,101, 32, 42, 32, 40, 72,117, 32, 45, 32, 72,100, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109, -112, 95,100,101,114,105,118, 40, 32,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105, -109, 97, 44, 32,102,108,111, 97,116, 32,105,109, 97, 95,120, 44, 32,102,108,111, 97,116, 32,105,109, 97, 95,121, 44, 32,102,108, -111, 97,116, 32,104, 83, 99, 97,108,101, 44, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,116, 32, 41, - 32, 10,123, 10, 9,102,108,111, 97,116, 32,115, 32, 61, 32, 49, 46, 48, 59, 9, 9, 47, 47, 32,110,101,103, 97,116,101, 32,116, -104,105,115, 32,105,102, 32,102,108,105,112,112,101,100, 32,116,101,120,116,117,114,101, 32, 99,111,111,114,100,105,110, 97,116, -101, 10, 9,118,101, 99, 50, 32, 84,101,120, 68,120, 32, 61, 32,100, 70,100,120, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10, - 9,118,101, 99, 50, 32, 84,101,120, 68,121, 32, 61, 32,100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10, 9, 10, - 9, 47, 47, 32,116,104,105,115, 32,118, 97,114,105, 97,110,116, 32,117,115,105,110,103, 32, 97, 32,100,101,114,105,118, 97,116, -105,118,101, 32,109, 97,112, 32,105,115, 32,100,101,115, 99,114,105, 98,101,100, 32,104,101,114,101, 10, 9, 47, 47, 32,104,116, -116,112, 58, 47, 47,109,109,105,107,107,101,108,115,101,110, 51,100, 46, 98,108,111,103,115,112,111,116, 46, 99,111,109, 47, 50, - 48, 49, 49, 47, 48, 55, 47,100,101,114,105,118, 97,116,105,118,101, 45,109, 97,112,115, 46,104,116,109,108, 10, 9,118,101, 99, - 50, 32,100,105,109, 32, 61, 32,118,101, 99, 50, 40,105,109, 97, 95,120, 44, 32,105,109, 97, 95,121, 41, 59, 10, 9,118,101, 99, - 50, 32,100, 66,100,117,118, 32, 61, 32,104, 83, 99, 97,108,101, 42,100,105,109, 42, 40, 50, 46, 48, 42,116,101,120,116,117,114, -101, 50, 68, 40,105,109, 97, 44, 32,116,101,120, 99,111, 46,120,121, 41, 46,120,121, 45, 49, 46, 48, 41, 59, 10, 9, 10, 9,100, - 66,115, 32, 61, 32,100, 66,100,117,118, 46,120, 42, 84,101,120, 68,120, 46,120, 32, 43, 32,115, 42,100, 66,100,117,118, 46,121, - 42, 84,101,120, 68,120, 46,121, 59, 10, 9,100, 66,116, 32, 61, 32,100, 66,100,117,118, 46,120, 42, 84,101,120, 68,121, 46,120, - 32, 43, 32,115, 42,100, 66,100,117,118, 46,121, 42, 84,101,120, 68,121, 46,121, 59, 10,125, 10, 10,118,111,105,100, 32,109,116, -101,120, 95, 98,117,109,112, 95, 97,112,112,108,121, 40, 32,102,108,111, 97,116, 32,102, 68,101,116, 44, 32,102,108,111, 97,116, - 32,100, 66,115, 44, 32,102,108,111, 97,116, 32,100, 66,116, 44, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,118,101, 99, 51, 32, -118, 82, 50, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 10, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,118, -101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,112,101,114,116,117,114, 98,101, -100, 95,110,111,114,109, 32, 41, 32, 10,123, 10, 9,118,101, 99, 51, 32,118, 83,117,114,102, 71,114, 97,100, 32, 61, 32,115,105, -103,110, 40,102, 68,101,116, 41, 32, 42, 32, 40, 32,100, 66,115, 32, 42, 32,118, 82, 49, 32, 43, 32,100, 66,116, 32, 42, 32,118, - 82, 50, 32, 41, 59, 10, 9, 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 45, 32, -118, 83,117,114,102, 71,114, 97,100, 59, 10, 9,112,101,114,116,117,114, 98,101,100, 95,110,111,114,109, 32, 61, 32,110,111,114, -109, 97,108,105,122,101, 40, 32,118, 78, 97, 99, 99, 95,111,117,116, 32, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101, -120, 95, 98,117,109,112, 95, 97,112,112,108,121, 95,116,101,120,115,112, 97, 99,101, 40, 32,102,108,111, 97,116, 32,102, 68,101, -116, 44, 32,102,108,111, 97,116, 32,100, 66,115, 44, 32,102,108,111, 97,116, 32,100, 66,116, 44, 32,118,101, 99, 51, 32,118, 82, - 49, 44, 32,118,101, 99, 51, 32,118, 82, 50, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,118,101, 99, 51, 32, -116,101,120, 99,111, 44, 32,102,108,111, 97,116, 32,105,109, 97, 95,120, 44, 32,102,108,111, 97,116, 32,105,109, 97, 95,121, 44, - 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,111,117,116, 32,118,101, - 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,112,101,114,116,117,114, 98,101,100, - 95,110,111,114,109, 32, 41, 32, 10,123, 10, 9,118,101, 99, 50, 32, 84,101,120, 68,120, 32, 61, 32,100, 70,100,120, 40,116,101, -120, 99,111, 46,120,121, 41, 59, 10, 9,118,101, 99, 50, 32, 84,101,120, 68,121, 32, 61, 32,100, 70,100,121, 40,116,101,120, 99, -111, 46,120,121, 41, 59, 10, 10, 9,118,101, 99, 51, 32,118, 83,117,114,102, 71,114, 97,100, 32, 61, 32,115,105,103,110, 40,102, - 68,101,116, 41, 32, 42, 32, 40, 32, 10, 9, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,100, 66,115, 32, 47, 32,108,101,110, -103,116,104, 40, 32,118,101, 99, 50, 40,105,109, 97, 95,120, 42, 84,101,120, 68,120, 46,120, 44, 32,105,109, 97, 95,121, 42, 84, -101,120, 68,120, 46,121, 41, 32, 41, 32, 42, 32,118, 82, 49, 32, 43, 32, 10, 9, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, -100, 66,116, 32, 47, 32,108,101,110,103,116,104, 40, 32,118,101, 99, 50, 40,105,109, 97, 95,120, 42, 84,101,120, 68,121, 46,120, - 44, 32,105,109, 97, 95,121, 42, 84,101,120, 68,121, 46,121, 41, 32, 41, 32, 42, 32,118, 82, 50, 32, 41, 59, 10, 9, 9, 9, 9, - 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 45, 32,118, 83,117,114,102, 71,114, - 97,100, 59, 10, 9,112,101,114,116,117,114, 98,101,100, 95,110,111,114,109, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, - 32,118, 78, 97, 99, 99, 95,111,117,116, 32, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,110,101,103, 97,116, -101, 95,116,101,120,110,111,114,109, 97,108, 40,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, - 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,118,101, 99, 51, - 40, 45,110,111,114,109, 97,108, 46,120, 44, 32, 45,110,111,114,109, 97,108, 46,121, 44, 32,110,111,114,109, 97,108, 46,122, 41, - 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,110,115,112, 97, 99,101, 95,116, 97,110,103,101,110,116, 40,118,101, - 99, 52, 32,116, 97,110,103,101,110,116, 44, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,118,101, 99, 51, 32,116,101, -120,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9, -118,101, 99, 51, 32, 66, 32, 61, 32,116, 97,110,103,101,110,116, 46,119, 32, 42, 32, 99,114,111,115,115, 40,110,111,114,109, 97, -108, 44, 32,116, 97,110,103,101,110,116, 46,120,121,122, 41, 59, 10, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,116, -101,120,110,111,114,109, 97,108, 46,120, 42,116, 97,110,103,101,110,116, 46,120,121,122, 32, 43, 32,116,101,120,110,111,114,109, - 97,108, 46,121, 42, 66, 32, 43, 32,116,101,120,110,111,114,109, 97,108, 46,122, 42,110,111,114,109, 97,108, 59, 10, 9,111,117, -116,110,111,114,109, 97,108, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,111,117,116,110,111,114,109, 97,108, 41, 59, 10, -125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,108,101,110,100, 95,110,111,114,109, 97,108, 40,102,108,111, 97,116, 32, -110,111,114,102, 97, 99, 44, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,118,101, 99, 51, 32,110,101,119,110,111,114, -109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9,111,117,116,110, -111,114,109, 97,108, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32,110,111,114,102, 97, 99, 41, 42,110,111,114,109, 97,108, 32, 43, 32, -110,111,114,102, 97, 99, 42,110,101,119,110,111,114,109, 97,108, 59, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,110, -111,114,109, 97,108,105,122,101, 40,111,117,116,110,111,114,109, 97,108, 41, 59, 10,125, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, - 32, 77, 65, 84, 69, 82, 73, 65, 76, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,108, 97,109,112, 95, -118,105,115,105, 98,105,108,105,116,121, 95,115,117,110, 95,104,101,109,105, 40,118,101, 99, 51, 32,108, 97,109,112,118,101, 99, - 44, 32,111,117,116, 32,118,101, 99, 51, 32,108,118, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111, -117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,108,118, 32, 61, 32,108, 97,109,112,118,101, - 99, 59, 10, 9,100,105,115,116, 32, 61, 32, 49, 46, 48, 59, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10, -125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95,111,116,104,101,114, 40,118,101, - 99, 51, 32, 99,111, 44, 32,118,101, 99, 51, 32,108, 97,109,112, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,108,118, 44, +110,103, 32,116,104,101, 32,105,110,118,101,114,115,101, 32,116,114, 97,110,115,112,111,115,101,100, 32, 42, 47, 13, 10, 9,118, + 82, 49, 32, 61, 32,118, 82, 49, 32, 42, 32,118,105,101,119, 50,111, 98,106, 59, 13, 10, 9,118, 82, 50, 32, 61, 32,118, 82, 50, + 32, 42, 32,118,105,101,119, 50,111, 98,106, 59, 13, 10, 9,118, 78, 32, 61, 32,118, 78, 32, 42, 32,118,105,101,119, 50,111, 98, +106, 59, 13, 10, 9, 13, 10, 9,102,108,111, 97,116, 32,102, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 97, 98,115, 40,102, + 68,101,116, 41, 32, 42, 32,108,101,110,103,116,104, 40,118, 78, 41, 59, 13, 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, + 32,118, 78, 97, 99, 99, 95,105,110, 32, 42, 32, 40,102, 77, 97,103,110,105,116,117,100,101, 32, 47, 32,102, 80,114,101,118, 77, + 97,103,110,105,116,117,100,101, 95,105,110, 41, 59, 13, 10, 9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111, +117,116, 32, 61, 32,102, 77, 97,103,110,105,116,117,100,101, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, + 95, 98,117,109,112, 95,105,110,105,116, 95,116,101,120,116,117,114,101,115,112, 97, 99,101, 40, 32,118,101, 99, 51, 32,115,117, +114,102, 95,112,111,115, 44, 32,118,101, 99, 51, 32,115,117,114,102, 95,110,111,114,109, 44, 32, 13, 10, 9, 9, 9, 9, 9, 9, + 9, 9, 32, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 44, 32,118,101, 99, + 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 13, 10, 9, 9, 9, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,102,108,111, 97,116, + 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, + 97, 99, 99, 95,111,117,116, 44, 32, 13, 10, 9, 9, 9, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, + 49, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 68,101,116, 32, + 41, 32, 13, 10,123, 13, 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 83, 32, 61, 32,100, 70,100,120, 40, 32,115,117,114, +102, 95,112,111,115, 32, 41, 59, 13, 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 84, 32, 61, 32,100, 70,100,121, 40, 32, +115,117,114,102, 95,112,111,115, 32, 41, 59, 13, 10, 9,118,101, 99, 51, 32,118, 78, 32, 61, 32,115,117,114,102, 95,110,111,114, +109, 59, 32, 47, 42, 32,110,111,114,109, 97,108,105,122,101,100, 32,105,110,116,101,114,112,111,108, 97,116,101,100, 32,118,101, +114,116,101,120, 32,110,111,114,109, 97,108, 32, 42, 47, 13, 10, 9, 13, 10, 9,118, 82, 49, 32, 61, 32,110,111,114,109, 97,108, +105,122,101, 40, 32, 99,114,111,115,115, 40, 32,118, 83,105,103,109, 97, 84, 44, 32,118, 78, 32, 41, 32, 41, 59, 13, 10, 9,118, + 82, 50, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32, 99,114,111,115,115, 40, 32,118, 78, 44, 32,118, 83,105,103,109, + 97, 83, 32, 41, 32, 41, 59, 13, 10, 9,102, 68,101,116, 32, 61, 32,115,105,103,110, 40, 32,100,111,116, 40,118, 83,105,103,109, + 97, 83, 44, 32,118, 82, 49, 41, 32, 41, 59, 13, 10, 9, 13, 10, 9,102,108,111, 97,116, 32,102, 77, 97,103,110,105,116,117,100, +101, 32, 61, 32, 97, 98,115, 40,102, 68,101,116, 41, 59, 13, 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, + 99, 99, 95,105,110, 32, 42, 32, 40,102, 77, 97,103,110,105,116,117,100,101, 32, 47, 32,102, 80,114,101,118, 77, 97,103,110,105, +116,117,100,101, 95,105,110, 41, 59, 13, 10, 9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 32, 61, + 32,102, 77, 97,103,110,105,116,117,100,101, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109, +112, 95,105,110,105,116, 95,118,105,101,119,115,112, 97, 99,101, 40, 32,118,101, 99, 51, 32,115,117,114,102, 95,112,111,115, 44, + 32,118,101, 99, 51, 32,115,117,114,102, 95,110,111,114,109, 44, 32, 13, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,102,108,111, + 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, + 95,105,110, 44, 13, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, + 97,103,110,105,116,117,100,101, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, + 44, 32, 13, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,111,117,116, 32, +118,101, 99, 51, 32,118, 82, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 68,101,116, 32, 41, 32, 13, 10,123, 13, 10, + 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 83, 32, 61, 32,100, 70,100,120, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, + 59, 13, 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 84, 32, 61, 32,100, 70,100,121, 40, 32,115,117,114,102, 95,112,111, +115, 32, 41, 59, 13, 10, 9,118,101, 99, 51, 32,118, 78, 32, 61, 32,115,117,114,102, 95,110,111,114,109, 59, 32, 47, 42, 32,110, +111,114,109, 97,108,105,122,101,100, 32,105,110,116,101,114,112,111,108, 97,116,101,100, 32,118,101,114,116,101,120, 32,110,111, +114,109, 97,108, 32, 42, 47, 13, 10, 9, 13, 10, 9,118, 82, 49, 32, 61, 32, 99,114,111,115,115, 40, 32,118, 83,105,103,109, 97, + 84, 44, 32,118, 78, 32, 41, 59, 13, 10, 9,118, 82, 50, 32, 61, 32, 99,114,111,115,115, 40, 32,118, 78, 44, 32,118, 83,105,103, +109, 97, 83, 32, 41, 32, 59, 13, 10, 9,102, 68,101,116, 32, 61, 32,100,111,116, 32, 40, 32,118, 83,105,103,109, 97, 83, 44, 32, +118, 82, 49, 32, 41, 59, 13, 10, 9, 13, 10, 9,102,108,111, 97,116, 32,102, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 97, + 98,115, 40,102, 68,101,116, 41, 59, 13, 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, + 32, 42, 32, 40,102, 77, 97,103,110,105,116,117,100,101, 32, 47, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95, +105,110, 41, 59, 13, 10, 9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 32, 61, 32,102, 77, 97,103, +110,105,116,117,100,101, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,116, 97,112, + 51, 40, 32,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,102,108, +111, 97,116, 32,104, 83, 99, 97,108,101, 44, 32, 13, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,116, 32, + 41, 32, 13, 10,123, 13, 10, 9,118,101, 99, 50, 32, 83, 84,108,108, 32, 61, 32,116,101,120, 99,111, 46,120,121, 59, 13, 10, 9, +118,101, 99, 50, 32, 83, 84,108,114, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43, 32,100, 70,100,120, 40,116,101,120, 99, +111, 46,120,121, 41, 32, 59, 13, 10, 9,118,101, 99, 50, 32, 83, 84,117,108, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43, + 32,100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41, 32, 59, 13, 10, 9, 13, 10, 9,102,108,111, 97,116, 32, 72,108,108, + 44, 72,108,114, 44, 72,117,108, 59, 13, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105, +109, 97, 44, 32, 83, 84,108,108, 41, 44, 32, 72,108,108, 32, 41, 59, 13, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120, +116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,108,114, 41, 44, 32, 72,108,114, 32, 41, 59, 13, 10, 9,114,103, 98,116, +111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,117,108, 41, 44, 32, 72,117,108, 32, 41, + 59, 13, 10, 9, 13, 10, 9,100, 66,115, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32, 40, 72,108,114, 32, 45, 32, 72,108,108, + 41, 59, 13, 10, 9,100, 66,116, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32, 40, 72,117,108, 32, 45, 32, 72,108,108, 41, 59, + 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,116, 97,112, 53, 40, 32,118,101, 99, 51, + 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,102,108,111, 97,116, 32,104, 83, 99, + 97,108,101, 44, 32, 13, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,111,117,116, 32, +102,108,111, 97,116, 32,100, 66,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,116, 32, 41, 32, 13, 10,123, 13, 10, + 9,118,101, 99, 50, 32, 84,101,120, 68,120, 32, 61, 32,100, 70,100,120, 40,116,101,120, 99,111, 46,120,121, 41, 59, 13, 10, 9, +118,101, 99, 50, 32, 84,101,120, 68,121, 32, 61, 32,100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41, 59, 13, 10, 13, 10, + 9,118,101, 99, 50, 32, 83, 84, 99, 32, 61, 32,116,101,120, 99,111, 46,120,121, 59, 13, 10, 9,118,101, 99, 50, 32, 83, 84,108, + 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 45, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,120, 32, 59, 13, 10, 9,118,101, + 99, 50, 32, 83, 84,114, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,120, 32, + 59, 13, 10, 9,118,101, 99, 50, 32, 83, 84,100, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 45, 32, 48, 46, 53, 32, 42, 32, + 84,101,120, 68,121, 32, 59, 13, 10, 9,118,101, 99, 50, 32, 83, 84,117, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43, 32, + 48, 46, 53, 32, 42, 32, 84,101,120, 68,121, 32, 59, 13, 10, 9, 13, 10, 9,102,108,111, 97,116, 32, 72, 99, 44, 72,108, 44, 72, +114, 44, 72,100, 44, 72,117, 59, 13, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, + 97, 44, 32, 83, 84, 99, 41, 44, 32, 72, 99, 32, 41, 59, 13, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114, +101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,108, 41, 44, 32, 72,108, 32, 41, 59, 13, 10, 9,114,103, 98,116,111, 98,119, 40, 32, +116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,114, 41, 44, 32, 72,114, 32, 41, 59, 13, 10, 9,114,103, 98, +116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,100, 41, 44, 32, 72,100, 32, 41, 59, + 13, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,117, 41, 44, + 32, 72,117, 32, 41, 59, 13, 10, 9, 13, 10, 9,100, 66,115, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32, 40, 72,114, 32, 45, + 32, 72,108, 41, 59, 13, 10, 9,100, 66,116, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32, 40, 72,117, 32, 45, 32, 72,100, 41, + 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,100,101,114,105,118, 40, 32,118,101, + 99, 51, 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,102,108,111, 97,116, 32,105, +109, 97, 95,120, 44, 32,102,108,111, 97,116, 32,105,109, 97, 95,121, 44, 32,102,108,111, 97,116, 32,104, 83, 99, 97,108,101, 44, + 32, 13, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,111,117,116, 32,102,108,111, 97, +116, 32,100, 66,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,116, 32, 41, 32, 13, 10,123, 13, 10, 9,102,108,111, + 97,116, 32,115, 32, 61, 32, 49, 46, 48, 59, 9, 9, 47, 47, 32,110,101,103, 97,116,101, 32,116,104,105,115, 32,105,102, 32,102, +108,105,112,112,101,100, 32,116,101,120,116,117,114,101, 32, 99,111,111,114,100,105,110, 97,116,101, 13, 10, 9,118,101, 99, 50, + 32, 84,101,120, 68,120, 32, 61, 32,100, 70,100,120, 40,116,101,120, 99,111, 46,120,121, 41, 59, 13, 10, 9,118,101, 99, 50, 32, + 84,101,120, 68,121, 32, 61, 32,100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41, 59, 13, 10, 9, 13, 10, 9, 47, 47, 32, +116,104,105,115, 32,118, 97,114,105, 97,110,116, 32,117,115,105,110,103, 32, 97, 32,100,101,114,105,118, 97,116,105,118,101, 32, +109, 97,112, 32,105,115, 32,100,101,115, 99,114,105, 98,101,100, 32,104,101,114,101, 13, 10, 9, 47, 47, 32,104,116,116,112, 58, + 47, 47,109,109,105,107,107,101,108,115,101,110, 51,100, 46, 98,108,111,103,115,112,111,116, 46, 99,111,109, 47, 50, 48, 49, 49, + 47, 48, 55, 47,100,101,114,105,118, 97,116,105,118,101, 45,109, 97,112,115, 46,104,116,109,108, 13, 10, 9,118,101, 99, 50, 32, +100,105,109, 32, 61, 32,118,101, 99, 50, 40,105,109, 97, 95,120, 44, 32,105,109, 97, 95,121, 41, 59, 13, 10, 9,118,101, 99, 50, + 32,100, 66,100,117,118, 32, 61, 32,104, 83, 99, 97,108,101, 42,100,105,109, 42, 40, 50, 46, 48, 42,116,101,120,116,117,114,101, + 50, 68, 40,105,109, 97, 44, 32,116,101,120, 99,111, 46,120,121, 41, 46,120,121, 45, 49, 46, 48, 41, 59, 13, 10, 9, 13, 10, 9, +100, 66,115, 32, 61, 32,100, 66,100,117,118, 46,120, 42, 84,101,120, 68,120, 46,120, 32, 43, 32,115, 42,100, 66,100,117,118, 46, +121, 42, 84,101,120, 68,120, 46,121, 59, 13, 10, 9,100, 66,116, 32, 61, 32,100, 66,100,117,118, 46,120, 42, 84,101,120, 68,121, + 46,120, 32, 43, 32,115, 42,100, 66,100,117,118, 46,121, 42, 84,101,120, 68,121, 46,121, 59, 13, 10,125, 13, 10, 13, 10,118,111, +105,100, 32,109,116,101,120, 95, 98,117,109,112, 95, 97,112,112,108,121, 40, 32,102,108,111, 97,116, 32,102, 68,101,116, 44, 32, +102,108,111, 97,116, 32,100, 66,115, 44, 32,102,108,111, 97,116, 32,100, 66,116, 44, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32, +118,101, 99, 51, 32,118, 82, 50, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 13, 10, 9, 9, 9, 9, 9, 32, + 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,112,101, +114,116,117,114, 98,101,100, 95,110,111,114,109, 32, 41, 32, 13, 10,123, 13, 10, 9,118,101, 99, 51, 32,118, 83,117,114,102, 71, +114, 97,100, 32, 61, 32,115,105,103,110, 40,102, 68,101,116, 41, 32, 42, 32, 40, 32,100, 66,115, 32, 42, 32,118, 82, 49, 32, 43, + 32,100, 66,116, 32, 42, 32,118, 82, 50, 32, 41, 59, 13, 10, 9, 13, 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, + 78, 97, 99, 99, 95,105,110, 32, 45, 32,118, 83,117,114,102, 71,114, 97,100, 59, 13, 10, 9,112,101,114,116,117,114, 98,101,100, + 95,110,111,114,109, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32,118, 78, 97, 99, 99, 95,111,117,116, 32, 41, 59, 13, + 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95, 97,112,112,108,121, 95,116,101,120,115,112, + 97, 99,101, 40, 32,102,108,111, 97,116, 32,102, 68,101,116, 44, 32,102,108,111, 97,116, 32,100, 66,115, 44, 32,102,108,111, 97, +116, 32,100, 66,116, 44, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,118,101, 99, 51, 32,118, 82, 50, 44, 13, 10, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,115, 97,109,112,108, +101,114, 50, 68, 32,105,109, 97, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,102,108,111, 97,116, 32,105,109, 97, 95, +120, 44, 32,102,108,111, 97,116, 32,105,109, 97, 95,121, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 13, 10, + 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32,111,117, +116, 32,118,101, 99, 51, 32,112,101,114,116,117,114, 98,101,100, 95,110,111,114,109, 32, 41, 32, 13, 10,123, 13, 10, 9,118,101, + 99, 50, 32, 84,101,120, 68,120, 32, 61, 32,100, 70,100,120, 40,116,101,120, 99,111, 46,120,121, 41, 59, 13, 10, 9,118,101, 99, + 50, 32, 84,101,120, 68,121, 32, 61, 32,100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41, 59, 13, 10, 13, 10, 9,118,101, + 99, 51, 32,118, 83,117,114,102, 71,114, 97,100, 32, 61, 32,115,105,103,110, 40,102, 68,101,116, 41, 32, 42, 32, 40, 32, 13, 10, + 9, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,100, 66,115, 32, 47, 32,108,101,110,103,116,104, 40, 32,118,101, 99, 50, 40, +105,109, 97, 95,120, 42, 84,101,120, 68,120, 46,120, 44, 32,105,109, 97, 95,121, 42, 84,101,120, 68,120, 46,121, 41, 32, 41, 32, + 42, 32,118, 82, 49, 32, 43, 32, 13, 10, 9, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,100, 66,116, 32, 47, 32,108,101,110, +103,116,104, 40, 32,118,101, 99, 50, 40,105,109, 97, 95,120, 42, 84,101,120, 68,121, 46,120, 44, 32,105,109, 97, 95,121, 42, 84, +101,120, 68,121, 46,121, 41, 32, 41, 32, 42, 32,118, 82, 50, 32, 41, 59, 13, 10, 9, 9, 9, 9, 13, 10, 9,118, 78, 97, 99, 99, + 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 45, 32,118, 83,117,114,102, 71,114, 97,100, 59, 13, 10, 9,112, +101,114,116,117,114, 98,101,100, 95,110,111,114,109, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32,118, 78, 97, 99, 99, + 95,111,117,116, 32, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,110,101,103, 97,116,101, 95,116, +101,120,110,111,114,109, 97,108, 40,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111, +117,116,110,111,114,109, 97,108, 41, 13, 10,123, 13, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,118,101, 99, 51, 40, + 45,110,111,114,109, 97,108, 46,120, 44, 32, 45,110,111,114,109, 97,108, 46,121, 44, 32,110,111,114,109, 97,108, 46,122, 41, 59, + 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95,110,115,112, 97, 99,101, 95,116, 97,110,103,101,110,116, 40, +118,101, 99, 52, 32,116, 97,110,103,101,110,116, 44, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,118,101, 99, 51, 32, +116,101,120,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 13, 10, +123, 13, 10, 9,118,101, 99, 51, 32, 66, 32, 61, 32,116, 97,110,103,101,110,116, 46,119, 32, 42, 32, 99,114,111,115,115, 40,110, +111,114,109, 97,108, 44, 32,116, 97,110,103,101,110,116, 46,120,121,122, 41, 59, 13, 10, 13, 10, 9,111,117,116,110,111,114,109, + 97,108, 32, 61, 32,116,101,120,110,111,114,109, 97,108, 46,120, 42,116, 97,110,103,101,110,116, 46,120,121,122, 32, 43, 32,116, +101,120,110,111,114,109, 97,108, 46,121, 42, 66, 32, 43, 32,116,101,120,110,111,114,109, 97,108, 46,122, 42,110,111,114,109, 97, +108, 59, 13, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,111,117,116,110,111, +114,109, 97,108, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,109,116,101,120, 95, 98,108,101,110,100, 95,110,111,114, +109, 97,108, 40,102,108,111, 97,116, 32,110,111,114,102, 97, 99, 44, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,118, +101, 99, 51, 32,110,101,119,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97, +108, 41, 13, 10,123, 13, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32,110,111,114,102, 97, + 99, 41, 42,110,111,114,109, 97,108, 32, 43, 32,110,111,114,102, 97, 99, 42,110,101,119,110,111,114,109, 97,108, 59, 13, 10, 9, +111,117,116,110,111,114,109, 97,108, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,111,117,116,110,111,114,109, 97,108, 41, + 59, 13, 10,125, 13, 10, 13, 10, 47, 42, 42, 42, 42, 42, 42, 42, 32, 77, 65, 84, 69, 82, 73, 65, 76, 32, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 47, 13, 10, 13, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95,115,117,110, + 95,104,101,109,105, 40,118,101, 99, 51, 32,108, 97,109,112,118,101, 99, 44, 32,111,117,116, 32,118,101, 99, 51, 32,108,118, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, - 97, 99, 41, 10,123, 10, 9,108,118, 32, 61, 32, 99,111, 32, 45, 32,108, 97,109,112, 99,111, 59, 10, 9,100,105,115,116, 32, 61, - 32,108,101,110,103,116,104, 40,108,118, 41, 59, 10, 9,108,118, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108,118, 41, - 59, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,102, - 97,108,108,111,102,102, 95,105,110,118,108,105,110,101, 97,114, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, - 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 10, -123, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32,108, 97,109,112,100,105,115,116, 47, 40,108, 97,109,112,100,105,115,116, 32, - 43, 32,100,105,115,116, 41, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,102, 97,108,108,111,102,102, 95,105,110, -118,115,113,117, 97,114,101, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,102,108,111, 97,116, 32,100,105, -115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,118,105,115,105,102, 97, - 99, 32, 61, 32,108, 97,109,112,100,105,115,116, 47, 40,108, 97,109,112,100,105,115,116, 32, 43, 32,100,105,115,116, 42,100,105, -115,116, 41, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,102, 97,108,108,111,102,102, 95,115,108,105,100,101,114, -115, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,102,108,111, 97,116, 32,108,100, 49, 44, 32,102,108,111, - 97,116, 32,108,100, 50, 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105, -115,105,102, 97, 99, 41, 10,123, 10, 9,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116,107,119, 32, 61, 32,108, 97,109, -112,100,105,115,116, 42,108, 97,109,112,100,105,115,116, 59, 10, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32,108, 97,109,112, -100,105,115,116, 47, 40,108, 97,109,112,100,105,115,116, 32, 43, 32,108,100, 49, 42,100,105,115,116, 41, 59, 10, 9,118,105,115, -105,102, 97, 99, 32, 42, 61, 32,108, 97,109,112,100,105,115,116,107,119, 47, 40,108, 97,109,112,100,105,115,116,107,119, 32, 43, - 32,108,100, 50, 42,100,105,115,116, 42,100,105,115,116, 41, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,102, 97, -108,108,111,102,102, 95, 99,117,114,118,101, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,115, 97,109,112, -108,101,114, 49, 68, 32, 99,117,114,118,101,109, 97,112, 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32, -102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32,116,101,120,116, -117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,100,105,115,116, 47,108, 97,109,112,100,105,115,116, 41, 46,120, - 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95,115,112,104,101,114,101, - 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,102,108,111, - 97,116, 32,118,105,115,105,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,105,115,105,102, 97, 99, - 41, 10,123, 10, 9,102,108,111, 97,116, 32,116, 61, 32,108, 97,109,112,100,105,115,116, 32, 45, 32,100,105,115,116, 59, 10, 10, - 9,111,117,116,118,105,115,105,102, 97, 99, 61, 32,118,105,115,105,102, 97, 99, 42,109, 97,120, 40,116, 44, 32, 48, 46, 48, 41, - 47,108, 97,109,112,100,105,115,116, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105, -116,121, 95,115,112,111,116, 95,115,113,117, 97,114,101, 40,118,101, 99, 51, 32,108, 97,109,112,118,101, 99, 44, 32,109, 97,116, - 52, 32,108, 97,109,112,105,109, 97,116, 44, 32,118,101, 99, 51, 32,108,118, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105, -110,112,114, 41, 10,123, 10, 9,105,102, 40,100,111,116, 40,108,118, 44, 32,108, 97,109,112,118,101, 99, 41, 32, 62, 32, 48, 46, - 48, 41, 32,123, 10, 9, 9,118,101, 99, 51, 32,108,118,114,111,116, 32, 61, 32, 40,108, 97,109,112,105,109, 97,116, 42,118,101, - 99, 52, 40,108,118, 44, 32, 48, 46, 48, 41, 41, 46,120,121,122, 59, 10, 9, 9,102,108,111, 97,116, 32,120, 32, 61, 32,109, 97, -120, 40, 97, 98,115, 40,108,118,114,111,116, 46,120, 47,108,118,114,111,116, 46,122, 41, 44, 32, 97, 98,115, 40,108,118,114,111, -116, 46,121, 47,108,118,114,111,116, 46,122, 41, 41, 59, 10, 10, 9, 9,105,110,112,114, 32, 61, 32, 49, 46, 48, 47,115,113,114, -116, 40, 49, 46, 48, 32, 43, 32,120, 42,120, 41, 59, 10, 9,125, 10, 9,101,108,115,101, 10, 9, 9,105,110,112,114, 32, 61, 32, - 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95,115,112,111, -116, 95, 99,105,114, 99,108,101, 40,118,101, 99, 51, 32,108, 97,109,112,118,101, 99, 44, 32,118,101, 99, 51, 32,108,118, 44, 32, -111,117,116, 32,102,108,111, 97,116, 32,105,110,112,114, 41, 10,123, 10, 9,105,110,112,114, 32, 61, 32,100,111,116, 40,108,118, - 44, 32,108, 97,109,112,118,101, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108, -105,116,121, 95,115,112,111,116, 40,102,108,111, 97,116, 32,115,112,111,116,115,105, 44, 32,102,108,111, 97,116, 32,115,112,111, -116, 98,108, 44, 32,102,108,111, 97,116, 32,105,110,112,114, 44, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 44, 32, -111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,102,108,111, 97,116, 32,116, - 32, 61, 32,115,112,111,116,115,105, 59, 10, 10, 9,105,102, 40,105,110,112,114, 32, 60, 61, 32,116, 41, 32,123, 10, 9, 9,111, -117,116,118,105,115,105,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,116, 32, - 61, 32,105,110,112,114, 32, 45, 32,116, 59, 10, 10, 9, 9, 47, 42, 32,115,111,102,116, 32, 97,114,101, 97, 32, 42, 47, 10, 9, - 9,105,102, 40,115,112,111,116, 98,108, 32, 33, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,105,110,112,114, 32, 42, 61, 32,115,109, -111,111,116,104,115,116,101,112, 40, 48, 46, 48, 44, 32, 49, 46, 48, 44, 32,116, 47,115,112,111,116, 98,108, 41, 59, 10, 10, 9, - 9,111,117,116,118,105,115,105,102, 97, 99, 32, 61, 32,118,105,115,105,102, 97, 99, 42,105,110,112,114, 59, 10, 9,125, 10,125, - 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95, 99,108, 97,109,112, 40,102,108,111, - 97,116, 32,118,105,115,105,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,105,115,105,102, 97, 99, - 41, 10,123, 10, 9,111,117,116,118,105,115,105,102, 97, 99, 32, 61, 32, 40,118,105,115,105,102, 97, 99, 32, 60, 32, 48, 46, 48, - 48, 49, 41, 63, 32, 48, 46, 48, 58, 32,118,105,115,105,102, 97, 99, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, - 95,118,105,101,119, 40,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,105,101,119, 41, 10,123, 10, - 9, 47, 42, 32,104, 97,110,100,108,101, 32,112,101,114,115,112,101, 99,116,105,118,101, 47,111,114,116,104,111,103,114, 97,112, -104,105, 99, 32, 42, 47, 10, 9,118,105,101,119, 32, 61, 32, 40,103,108, 95, 80,114,111,106,101, 99,116,105,111,110, 77, 97,116, -114,105,120, 91, 51, 93, 91, 51, 93, 32, 61, 61, 32, 48, 46, 48, 41, 63, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 41, - 58, 32,118,101, 99, 51, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 45, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32, -115,104, 97,100,101, 95,116, 97,110,103,101,110,116, 95,118, 40,118,101, 99, 51, 32,108,118, 44, 32,118,101, 99, 51, 32,116, 97, -110,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,110, 41, 10,123, 10, 9,118,101, 99, 51, 32, 99, 32, 61, 32, 99,114,111, -115,115, 40,108,118, 44, 32,116, 97,110,103, 41, 59, 10, 9,118,101, 99, 51, 32,118,110,111,114, 32, 61, 32, 99,114,111,115,115, - 40, 99, 44, 32,116, 97,110,103, 41, 59, 10, 10, 9,118,110, 32, 61, 32, 45,110,111,114,109, 97,108,105,122,101, 40,118,110,111, -114, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,105,110,112, 40,118,101, 99, 51, 32,118,110, 44, 32,118, -101, 99, 51, 32,108,118, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,112, 41, 10,123, 10, 9,105,110,112, 32, 61, 32, -100,111,116, 40,118,110, 44, 32,108,118, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,105,115, 95,110,111, - 95,100,105,102,102,117,115,101, 40,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,105,115, 32, 61, 32, 48, - 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,105,115, 95,104,101,109,105, 40,102,108,111, 97,116, 32, -105,110,112, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,105,115, 32, 61, 32, 48, 46, 53, 42,105, -110,112, 32, 43, 32, 48, 46, 53, 59, 10,125, 10, 10,102,108,111, 97,116, 32, 97,114,101, 97, 95,108, 97,109,112, 95,101,110,101, -114,103,121, 40,109, 97,116, 52, 32, 97,114,101, 97, 44, 32,118,101, 99, 51, 32, 99,111, 44, 32,118,101, 99, 51, 32,118,110, 41, - 10,123, 10, 9,118,101, 99, 51, 32,118,101, 99, 91, 52, 93, 44, 32, 99, 91, 52, 93, 59, 10, 9,102,108,111, 97,116, 32,114, 97, -100, 91, 52, 93, 44, 32,102, 97, 99, 59, 10, 9, 10, 9,118,101, 99, 91, 48, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, - 40, 99,111, 32, 45, 32, 97,114,101, 97, 91, 48, 93, 46,120,121,122, 41, 59, 10, 9,118,101, 99, 91, 49, 93, 32, 61, 32,110,111, -114,109, 97,108,105,122,101, 40, 99,111, 32, 45, 32, 97,114,101, 97, 91, 49, 93, 46,120,121,122, 41, 59, 10, 9,118,101, 99, 91, - 50, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 32, 45, 32, 97,114,101, 97, 91, 50, 93, 46,120,121,122, 41, - 59, 10, 9,118,101, 99, 91, 51, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 32, 45, 32, 97,114,101, 97, 91, - 51, 93, 46,120,121,122, 41, 59, 10, 10, 9, 99, 91, 48, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,114,111,115, -115, 40,118,101, 99, 91, 48, 93, 44, 32,118,101, 99, 91, 49, 93, 41, 41, 59, 10, 9, 99, 91, 49, 93, 32, 61, 32,110,111,114,109, - 97,108,105,122,101, 40, 99,114,111,115,115, 40,118,101, 99, 91, 49, 93, 44, 32,118,101, 99, 91, 50, 93, 41, 41, 59, 10, 9, 99, - 91, 50, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,114,111,115,115, 40,118,101, 99, 91, 50, 93, 44, 32,118,101, - 99, 91, 51, 93, 41, 41, 59, 10, 9, 99, 91, 51, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,114,111,115,115, 40, -118,101, 99, 91, 51, 93, 44, 32,118,101, 99, 91, 48, 93, 41, 41, 59, 10, 10, 9,114, 97,100, 91, 48, 93, 32, 61, 32, 97, 99,111, -115, 40,100,111,116, 40,118,101, 99, 91, 48, 93, 44, 32,118,101, 99, 91, 49, 93, 41, 41, 59, 10, 9,114, 97,100, 91, 49, 93, 32, - 61, 32, 97, 99,111,115, 40,100,111,116, 40,118,101, 99, 91, 49, 93, 44, 32,118,101, 99, 91, 50, 93, 41, 41, 59, 10, 9,114, 97, + 97, 99, 41, 13, 10,123, 13, 10, 9,108,118, 32, 61, 32,108, 97,109,112,118,101, 99, 59, 13, 10, 9,100,105,115,116, 32, 61, 32, + 49, 46, 48, 59, 13, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, + 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95,111,116,104,101,114, 40,118,101, 99, 51, 32, 99,111, 44, 32, +118,101, 99, 51, 32,108, 97,109,112, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,108,118, 44, 32,111,117,116, 32,102,108, +111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 13, 10,123, 13, + 10, 9,108,118, 32, 61, 32, 99,111, 32, 45, 32,108, 97,109,112, 99,111, 59, 13, 10, 9,100,105,115,116, 32, 61, 32,108,101,110, +103,116,104, 40,108,118, 41, 59, 13, 10, 9,108,118, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108,118, 41, 59, 13, 10, + 9,118,105,115,105,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,108, 97,109,112, 95, +102, 97,108,108,111,102,102, 95,105,110,118,108,105,110,101, 97,114, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, + 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, + 13, 10,123, 13, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32,108, 97,109,112,100,105,115,116, 47, 40,108, 97,109,112,100,105, +115,116, 32, 43, 32,100,105,115,116, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,108, 97,109,112, 95,102, 97,108,108, +111,102,102, 95,105,110,118,115,113,117, 97,114,101, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,102,108, +111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 13, 10,123, 13, + 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32,108, 97,109,112,100,105,115,116, 47, 40,108, 97,109,112,100,105,115,116, 32, 43, + 32,100,105,115,116, 42,100,105,115,116, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,108, 97,109,112, 95,102, 97,108, +108,111,102,102, 95,115,108,105,100,101,114,115, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,102,108,111, + 97,116, 32,108,100, 49, 44, 32,102,108,111, 97,116, 32,108,100, 50, 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111, +117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32,108, 97,109, +112,100,105,115,116,107,119, 32, 61, 32,108, 97,109,112,100,105,115,116, 42,108, 97,109,112,100,105,115,116, 59, 13, 10, 13, 10, + 9,118,105,115,105,102, 97, 99, 32, 61, 32,108, 97,109,112,100,105,115,116, 47, 40,108, 97,109,112,100,105,115,116, 32, 43, 32, +108,100, 49, 42,100,105,115,116, 41, 59, 13, 10, 9,118,105,115,105,102, 97, 99, 32, 42, 61, 32,108, 97,109,112,100,105,115,116, +107,119, 47, 40,108, 97,109,112,100,105,115,116,107,119, 32, 43, 32,108,100, 50, 42,100,105,115,116, 42,100,105,115,116, 41, 59, + 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,108, 97,109,112, 95,102, 97,108,108,111,102,102, 95, 99,117,114,118,101, 40,102, +108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32, 99,117,114,118,101,109, 97, +112, 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, + 41, 13, 10,123, 13, 10, 9,118,105,115,105,102, 97, 99, 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,100,105,115,116, 47,108, 97,109,112,100,105,115,116, 44, 32, 48, 46, 48, 41, 41, 46,120, + 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95,115,112,104, +101,114,101, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32, +102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,105,115,105, +102, 97, 99, 41, 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32,116, 61, 32,108, 97,109,112,100,105,115,116, 32, 45, 32,100,105, +115,116, 59, 13, 10, 13, 10, 9,111,117,116,118,105,115,105,102, 97, 99, 61, 32,118,105,115,105,102, 97, 99, 42,109, 97,120, 40, +116, 44, 32, 48, 46, 48, 41, 47,108, 97,109,112,100,105,115,116, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,108, 97,109, +112, 95,118,105,115,105, 98,105,108,105,116,121, 95,115,112,111,116, 95,115,113,117, 97,114,101, 40,118,101, 99, 51, 32,108, 97, +109,112,118,101, 99, 44, 32,109, 97,116, 52, 32,108, 97,109,112,105,109, 97,116, 44, 32,118,101, 99, 51, 32,108,118, 44, 32,111, +117,116, 32,102,108,111, 97,116, 32,105,110,112,114, 41, 13, 10,123, 13, 10, 9,105,102, 40,100,111,116, 40,108,118, 44, 32,108, + 97,109,112,118,101, 99, 41, 32, 62, 32, 48, 46, 48, 41, 32,123, 13, 10, 9, 9,118,101, 99, 51, 32,108,118,114,111,116, 32, 61, + 32, 40,108, 97,109,112,105,109, 97,116, 42,118,101, 99, 52, 40,108,118, 44, 32, 48, 46, 48, 41, 41, 46,120,121,122, 59, 13, 10, + 9, 9,102,108,111, 97,116, 32,120, 32, 61, 32,109, 97,120, 40, 97, 98,115, 40,108,118,114,111,116, 46,120, 47,108,118,114,111, +116, 46,122, 41, 44, 32, 97, 98,115, 40,108,118,114,111,116, 46,121, 47,108,118,114,111,116, 46,122, 41, 41, 59, 13, 10, 13, 10, + 9, 9,105,110,112,114, 32, 61, 32, 49, 46, 48, 47,115,113,114,116, 40, 49, 46, 48, 32, 43, 32,120, 42,120, 41, 59, 13, 10, 9, +125, 13, 10, 9,101,108,115,101, 13, 10, 9, 9,105,110,112,114, 32, 61, 32, 48, 46, 48, 59, 13, 10,125, 13, 10, 13, 10,118,111, +105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95,115,112,111,116, 95, 99,105,114, 99,108,101, 40,118, +101, 99, 51, 32,108, 97,109,112,118,101, 99, 44, 32,118,101, 99, 51, 32,108,118, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, +105,110,112,114, 41, 13, 10,123, 13, 10, 9,105,110,112,114, 32, 61, 32,100,111,116, 40,108,118, 44, 32,108, 97,109,112,118,101, + 99, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95,115, +112,111,116, 40,102,108,111, 97,116, 32,115,112,111,116,115,105, 44, 32,102,108,111, 97,116, 32,115,112,111,116, 98,108, 44, 32, +102,108,111, 97,116, 32,105,110,112,114, 44, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 44, 32,111,117,116, 32,102, +108,111, 97,116, 32,111,117,116,118,105,115,105,102, 97, 99, 41, 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32,116, 32, 61, 32, +115,112,111,116,115,105, 59, 13, 10, 13, 10, 9,105,102, 40,105,110,112,114, 32, 60, 61, 32,116, 41, 32,123, 13, 10, 9, 9,111, +117,116,118,105,115,105,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 13, 10, 9,125, 13, 10, 9,101,108,115,101, 32,123, 13, 10, 9, + 9,116, 32, 61, 32,105,110,112,114, 32, 45, 32,116, 59, 13, 10, 13, 10, 9, 9, 47, 42, 32,115,111,102,116, 32, 97,114,101, 97, + 32, 42, 47, 13, 10, 9, 9,105,102, 40,115,112,111,116, 98,108, 32, 33, 61, 32, 48, 46, 48, 41, 13, 10, 9, 9, 9,105,110,112, +114, 32, 42, 61, 32,115,109,111,111,116,104,115,116,101,112, 40, 48, 46, 48, 44, 32, 49, 46, 48, 44, 32,116, 47,115,112,111,116, + 98,108, 41, 59, 13, 10, 13, 10, 9, 9,111,117,116,118,105,115,105,102, 97, 99, 32, 61, 32,118,105,115,105,102, 97, 99, 42,105, +110,112,114, 59, 13, 10, 9,125, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108, +105,116,121, 95, 99,108, 97,109,112, 40,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, + 97,116, 32,111,117,116,118,105,115,105,102, 97, 99, 41, 13, 10,123, 13, 10, 9,111,117,116,118,105,115,105,102, 97, 99, 32, 61, + 32, 40,118,105,115,105,102, 97, 99, 32, 60, 32, 48, 46, 48, 48, 49, 41, 63, 32, 48, 46, 48, 58, 32,118,105,115,105,102, 97, 99, + 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95,118,105,101,119, 40,118,101, 99, 51, 32, 99,111, 44, + 32,111,117,116, 32,118,101, 99, 51, 32,118,105,101,119, 41, 13, 10,123, 13, 10, 9, 47, 42, 32,104, 97,110,100,108,101, 32,112, +101,114,115,112,101, 99,116,105,118,101, 47,111,114,116,104,111,103,114, 97,112,104,105, 99, 32, 42, 47, 13, 10, 9,118,105,101, +119, 32, 61, 32, 40,103,108, 95, 80,114,111,106,101, 99,116,105,111,110, 77, 97,116,114,105,120, 91, 51, 93, 91, 51, 93, 32, 61, + 61, 32, 48, 46, 48, 41, 63, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 41, 58, 32,118,101, 99, 51, 40, 48, 46, 48, 44, + 32, 48, 46, 48, 44, 32, 45, 49, 46, 48, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95,116, 97, +110,103,101,110,116, 95,118, 40,118,101, 99, 51, 32,108,118, 44, 32,118,101, 99, 51, 32,116, 97,110,103, 44, 32,111,117,116, 32, +118,101, 99, 51, 32,118,110, 41, 13, 10,123, 13, 10, 9,118,101, 99, 51, 32, 99, 32, 61, 32, 99,114,111,115,115, 40,108,118, 44, + 32,116, 97,110,103, 41, 59, 13, 10, 9,118,101, 99, 51, 32,118,110,111,114, 32, 61, 32, 99,114,111,115,115, 40, 99, 44, 32,116, + 97,110,103, 41, 59, 13, 10, 13, 10, 9,118,110, 32, 61, 32, 45,110,111,114,109, 97,108,105,122,101, 40,118,110,111,114, 41, 59, + 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95,105,110,112, 40,118,101, 99, 51, 32,118,110, 44, 32,118, +101, 99, 51, 32,108,118, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,112, 41, 13, 10,123, 13, 10, 9,105,110,112, 32, + 61, 32,100,111,116, 40,118,110, 44, 32,108,118, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95, +105,115, 95,110,111, 95,100,105,102,102,117,115,101, 40,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 13, 10,123, 13, 10, + 9,105,115, 32, 61, 32, 48, 46, 48, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95,105,115, 95,104, +101,109,105, 40,102,108,111, 97,116, 32,105,110,112, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 13, 10,123, 13, + 10, 9,105,115, 32, 61, 32, 48, 46, 53, 42,105,110,112, 32, 43, 32, 48, 46, 53, 59, 13, 10,125, 13, 10, 13, 10,102,108,111, 97, +116, 32, 97,114,101, 97, 95,108, 97,109,112, 95,101,110,101,114,103,121, 40,109, 97,116, 52, 32, 97,114,101, 97, 44, 32,118,101, + 99, 51, 32, 99,111, 44, 32,118,101, 99, 51, 32,118,110, 41, 13, 10,123, 13, 10, 9,118,101, 99, 51, 32,118,101, 99, 91, 52, 93, + 44, 32, 99, 91, 52, 93, 59, 13, 10, 9,102,108,111, 97,116, 32,114, 97,100, 91, 52, 93, 44, 32,102, 97, 99, 59, 13, 10, 9, 13, + 10, 9,118,101, 99, 91, 48, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 32, 45, 32, 97,114,101, 97, 91, 48, + 93, 46,120,121,122, 41, 59, 13, 10, 9,118,101, 99, 91, 49, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 32, + 45, 32, 97,114,101, 97, 91, 49, 93, 46,120,121,122, 41, 59, 13, 10, 9,118,101, 99, 91, 50, 93, 32, 61, 32,110,111,114,109, 97, +108,105,122,101, 40, 99,111, 32, 45, 32, 97,114,101, 97, 91, 50, 93, 46,120,121,122, 41, 59, 13, 10, 9,118,101, 99, 91, 51, 93, + 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 32, 45, 32, 97,114,101, 97, 91, 51, 93, 46,120,121,122, 41, 59, 13, + 10, 13, 10, 9, 99, 91, 48, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,114,111,115,115, 40,118,101, 99, 91, 48, + 93, 44, 32,118,101, 99, 91, 49, 93, 41, 41, 59, 13, 10, 9, 99, 91, 49, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, + 99,114,111,115,115, 40,118,101, 99, 91, 49, 93, 44, 32,118,101, 99, 91, 50, 93, 41, 41, 59, 13, 10, 9, 99, 91, 50, 93, 32, 61, + 32,110,111,114,109, 97,108,105,122,101, 40, 99,114,111,115,115, 40,118,101, 99, 91, 50, 93, 44, 32,118,101, 99, 91, 51, 93, 41, + 41, 59, 13, 10, 9, 99, 91, 51, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,114,111,115,115, 40,118,101, 99, 91, + 51, 93, 44, 32,118,101, 99, 91, 48, 93, 41, 41, 59, 13, 10, 13, 10, 9,114, 97,100, 91, 48, 93, 32, 61, 32, 97, 99,111,115, 40, +100,111,116, 40,118,101, 99, 91, 48, 93, 44, 32,118,101, 99, 91, 49, 93, 41, 41, 59, 13, 10, 9,114, 97,100, 91, 49, 93, 32, 61, + 32, 97, 99,111,115, 40,100,111,116, 40,118,101, 99, 91, 49, 93, 44, 32,118,101, 99, 91, 50, 93, 41, 41, 59, 13, 10, 9,114, 97, 100, 91, 50, 93, 32, 61, 32, 97, 99,111,115, 40,100,111,116, 40,118,101, 99, 91, 50, 93, 44, 32,118,101, 99, 91, 51, 93, 41, 41, - 59, 10, 9,114, 97,100, 91, 51, 93, 32, 61, 32, 97, 99,111,115, 40,100,111,116, 40,118,101, 99, 91, 51, 93, 44, 32,118,101, 99, - 91, 48, 93, 41, 41, 59, 10, 10, 9,102, 97, 99, 61, 32, 32,114, 97,100, 91, 48, 93, 42,100,111,116, 40,118,110, 44, 32, 99, 91, - 48, 93, 41, 59, 10, 9,102, 97, 99, 43, 61, 32,114, 97,100, 91, 49, 93, 42,100,111,116, 40,118,110, 44, 32, 99, 91, 49, 93, 41, - 59, 10, 9,102, 97, 99, 43, 61, 32,114, 97,100, 91, 50, 93, 42,100,111,116, 40,118,110, 44, 32, 99, 91, 50, 93, 41, 59, 10, 9, -102, 97, 99, 43, 61, 32,114, 97,100, 91, 51, 93, 42,100,111,116, 40,118,110, 44, 32, 99, 91, 51, 93, 41, 59, 10, 10, 9,114,101, -116,117,114,110, 32,109, 97,120, 40,102, 97, 99, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100, -101, 95,105,110,112, 95, 97,114,101, 97, 40,118,101, 99, 51, 32,112,111,115,105,116,105,111,110, 44, 32,118,101, 99, 51, 32,108, - 97,109,112, 99,111, 44, 32,118,101, 99, 51, 32,108, 97,109,112,118,101, 99, 44, 32,118,101, 99, 51, 32,118,110, 44, 32,109, 97, -116, 52, 32, 97,114,101, 97, 44, 32,102,108,111, 97,116, 32, 97,114,101, 97,115,105,122,101, 44, 32,102,108,111, 97,116, 32,107, - 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,112, 41, 10,123, 10, 9,118,101, 99, 51, 32, 99,111, 32, 61, 32,112,111, -115,105,116,105,111,110, 59, 10, 9,118,101, 99, 51, 32,118,101, 99, 32, 61, 32, 99,111, 32, 45, 32,108, 97,109,112, 99,111, 59, - 10, 10, 9,105,102, 40,100,111,116, 40,118,101, 99, 44, 32,108, 97,109,112,118,101, 99, 41, 32, 60, 32, 48, 46, 48, 41, 32,123, - 10, 9, 9,105,110,112, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,102,108,111, 97,116, - 32,105,110,116,101,110,115, 32, 61, 32, 97,114,101, 97, 95,108, 97,109,112, 95,101,110,101,114,103,121, 40, 97,114,101, 97, 44, - 32, 99,111, 44, 32,118,110, 41, 59, 10, 10, 9, 9,105,110,112, 32, 61, 32,112,111,119, 40,105,110,116,101,110,115, 42, 97,114, -101, 97,115,105,122,101, 44, 32,107, 41, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,100,105,102, -102,117,115,101, 95,111,114,101,110, 95,110, 97,121,101,114, 40,102,108,111, 97,116, 32,110,108, 44, 32,118,101, 99, 51, 32,110, - 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,114,111,117,103,104, 44, 32,111, -117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105, -122,101, 40,118, 32, 43, 32,108, 41, 59, 10, 9,102,108,111, 97,116, 32,110,104, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, - 44, 32,104, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40, -110, 44, 32,118, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,114,101, 97,108,110,108, 32, 61, 32,100,111,116, - 40,110, 44, 32,108, 41, 59, 10, 10, 9,105,102, 40,114,101, 97,108,110,108, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,105, -115, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,105,102, 40,110,108, 32, 60, 32, 48, 46, 48, 41, 32,123, - 10, 9, 9,105,115, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,102,108,111, 97,116, 32, -118,104, 32, 61, 32,109, 97,120, 40,100,111,116, 40,118, 44, 32,104, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9, 9,102,108,111, 97, -116, 32, 76,105,116, 95, 65, 32, 61, 32, 97, 99,111,115, 40,114,101, 97,108,110,108, 41, 59, 10, 9, 9,102,108,111, 97,116, 32, - 86,105,101,119, 95, 65, 32, 61, 32, 97, 99,111,115, 40,110,118, 41, 59, 10, 10, 9, 9,118,101, 99, 51, 32, 76,105,116, 95, 66, - 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108, 32, 45, 32,114,101, 97,108,110,108, 42,110, 41, 59, 10, 9, 9,118,101, - 99, 51, 32, 86,105,101,119, 95, 66, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,118, 32, 45, 32,110,118, 42,110, 41, 59, - 10, 10, 9, 9,102,108,111, 97,116, 32,116, 32, 61, 32,109, 97,120, 40,100,111,116, 40, 76,105,116, 95, 66, 44, 32, 86,105,101, -119, 95, 66, 41, 44, 32, 48, 46, 48, 41, 59, 10, 10, 9, 9,102,108,111, 97,116, 32, 97, 44, 32, 98, 59, 10, 10, 9, 9,105,102, - 40, 76,105,116, 95, 65, 32, 62, 32, 86,105,101,119, 95, 65, 41, 32,123, 10, 9, 9, 9, 97, 32, 61, 32, 76,105,116, 95, 65, 59, - 10, 9, 9, 9, 98, 32, 61, 32, 86,105,101,119, 95, 65, 59, 10, 9, 9,125, 10, 9, 9,101,108,115,101, 32,123, 10, 9, 9, 9, - 97, 32, 61, 32, 86,105,101,119, 95, 65, 59, 10, 9, 9, 9, 98, 32, 61, 32, 76,105,116, 95, 65, 59, 10, 9, 9,125, 10, 10, 9, - 9,102,108,111, 97,116, 32, 65, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 48, 46, 53, 42, 40, 40,114,111,117,103,104, 42,114,111, -117,103,104, 41, 47, 40, 40,114,111,117,103,104, 42,114,111,117,103,104, 41, 32, 43, 32, 48, 46, 51, 51, 41, 41, 41, 59, 10, 9, - 9,102,108,111, 97,116, 32, 66, 32, 61, 32, 48, 46, 52, 53, 42, 40, 40,114,111,117,103,104, 42,114,111,117,103,104, 41, 47, 40, - 40,114,111,117,103,104, 42,114,111,117,103,104, 41, 32, 43, 32, 48, 46, 48, 57, 41, 41, 59, 10, 10, 9, 9, 98, 32, 42, 61, 32, - 48, 46, 57, 53, 59, 10, 9, 9,105,115, 32, 61, 32,110,108, 42, 40, 65, 32, 43, 32, 40, 66, 32, 42, 32,116, 32, 42, 32,115,105, -110, 40, 97, 41, 32, 42, 32,116, 97,110, 40, 98, 41, 41, 41, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100, -101, 95,100,105,102,102,117,115,101, 95,116,111,111,110, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118, -101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,115,105,122,101, 44, 32,102,108,111, 97,116, 32,116,115,109,111,111,116,104, - 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,102,108,111, 97,116, 32,114,115,108,116, 32, 61, 32, -100,111,116, 40,110, 44, 32,108, 41, 59, 10, 9,102,108,111, 97,116, 32, 97,110,103, 32, 61, 32, 97, 99,111,115, 40,114,115,108, -116, 41, 59, 10, 10, 9,105,102, 40, 97,110,103, 32, 60, 32,115,105,122,101, 41, 32,105,115, 32, 61, 32, 49, 46, 48, 59, 10, 9, -101,108,115,101, 32,105,102, 40, 97,110,103, 32, 62, 32, 40,115,105,122,101, 32, 43, 32,116,115,109,111,111,116,104, 41, 32,124, -124, 32,116,115,109,111,111,116,104, 32, 61, 61, 32, 48, 46, 48, 41, 32,105,115, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115, -101, 32,105,115, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 40, 97,110,103, 32, 45, 32,115,105,122,101, 41, 47,116,115,109,111,111, -116,104, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,100,105,102,102,117,115,101, 95,109,105,110,110, 97, -101,114,116, 40,102,108,111, 97,116, 32,110,108, 44, 32,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108, -111, 97,116, 32,100, 97,114,107,110,101,115,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,105, -102, 40,110,108, 32, 60, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,105,115, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101, -108,115,101, 32,123, 10, 9, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,118, 41, - 44, 32, 48, 46, 48, 41, 59, 10, 10, 9, 9,105,102, 40,100, 97,114,107,110,101,115,115, 32, 60, 61, 32, 49, 46, 48, 41, 10, 9, - 9, 9,105,115, 32, 61, 32,110,108, 42,112,111,119, 40,109, 97,120, 40,110,118, 42,110,108, 44, 32, 48, 46, 49, 41, 44, 32,100, - 97,114,107,110,101,115,115, 32, 45, 32, 49, 46, 48, 41, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,105,115, 32, 61, 32,110, -108, 42,112,111,119, 40, 49, 46, 48, 48, 48, 49, 32, 45, 32,110,118, 44, 32,100, 97,114,107,110,101,115,115, 32, 45, 32, 49, 46, - 48, 41, 59, 10, 9,125, 10,125, 10, 10,102,108,111, 97,116, 32,102,114,101,115,110,101,108, 95,102, 97, 99, 40,118,101, 99, 51, - 32,118,105,101,119, 44, 32,118,101, 99, 51, 32,118,110, 44, 32,102,108,111, 97,116, 32,103,114, 97,100, 44, 32,102,108,111, 97, -116, 32,102, 97, 99, 41, 10,123, 10, 9,102,108,111, 97,116, 32,116, 49, 44, 32,116, 50, 59, 10, 9,102,108,111, 97,116, 32,102, -102, 97, 99, 59, 10, 10, 9,105,102, 40,102, 97, 99, 61, 61, 48, 46, 48, 41, 32,123, 10, 9, 9,102,102, 97, 99, 32, 61, 32, 49, - 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,116, 49, 61, 32,100,111,116, 40,118,105,101,119, 44, 32,118, -110, 41, 59, 10, 9, 9,105,102, 40,116, 49, 62, 48, 46, 48, 41, 32, 32,116, 50, 61, 32, 49, 46, 48, 43,116, 49, 59, 10, 9, 9, -101,108,115,101, 32,116, 50, 61, 32, 49, 46, 48, 45,116, 49, 59, 10, 10, 9, 9,116, 50, 61, 32,103,114, 97,100, 32, 43, 32, 40, - 49, 46, 48, 45,103,114, 97,100, 41, 42,112,111,119, 40,116, 50, 44, 32,102, 97, 99, 41, 59, 10, 10, 9, 9,105,102, 40,116, 50, - 60, 48, 46, 48, 41, 32,102,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,105,102, 40,116, 50, 62, 49, - 46, 48, 41, 32,102,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,102,102, 97, 99, 32, 61, 32,116, 50, - 59, 10, 9,125, 10, 10, 9,114,101,116,117,114,110, 32,102,102, 97, 99, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100, -101, 95,100,105,102,102,117,115,101, 95,102,114,101,115,110,101,108, 40,118,101, 99, 51, 32,118,110, 44, 32,118,101, 99, 51, 32, -108,118, 44, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,102,108,111, 97,116, 32,102, 97, 99, 95,105, 44, 32,102,108,111, 97, -116, 32,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,105,115, 32, 61, 32,102,114,101, -115,110,101,108, 95,102, 97, 99, 40,108,118, 44, 32,118,110, 44, 32,102, 97, 99, 95,105, 44, 32,102, 97, 99, 41, 59, 10,125, 10, - 10,118,111,105,100, 32,115,104, 97,100,101, 95, 99,117, 98,105, 99, 40,102,108,111, 97,116, 32,105,115, 44, 32,111,117,116, 32, -102,108,111, 97,116, 32,111,117,116,105,115, 41, 10,123, 10, 9,105,102, 40,105,115, 62, 48, 46, 48, 32, 38, 38, 32,105,115, 60, - 49, 46, 48, 41, 10, 9, 9,111,117,116,105,115, 61, 32,115,109,111,111,116,104,115,116,101,112, 40, 48, 46, 48, 44, 32, 49, 46, - 48, 44, 32,105,115, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,105,115, 61, 32,105,115, 59, 10,125, 10, 10,118,111, -105,100, 32,115,104, 97,100,101, 95,118,105,115,105,102, 97, 99, 40,102,108,111, 97,116, 32,105, 44, 32,102,108,111, 97,116, 32, -118,105,115,105,102, 97, 99, 44, 32,102,108,111, 97,116, 32,114,101,102,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111, -117,116,105, 41, 10,123, 10, 9, 47, 42,105,102, 40,105, 32, 62, 32, 48, 46, 48, 41, 42, 47, 10, 9, 9,111,117,116,105, 32, 61, - 32,109, 97,120, 40,105, 42,118,105,115,105,102, 97, 99, 42,114,101,102,108, 44, 32, 48, 46, 48, 41, 59, 10, 9, 47, 42,101,108, -115,101, 10, 9, 9,111,117,116,105, 32, 61, 32,105, 59, 42, 47, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,116, - 97,110,103,101,110,116, 95,118, 95,115,112,101, 99, 40,118,101, 99, 51, 32,116, 97,110,103, 44, 32,111,117,116, 32,118,101, 99, - 51, 32,118,110, 41, 10,123, 10, 9,118,110, 32, 61, 32,116, 97,110,103, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100, -101, 95, 97,100,100, 95,116,111, 95,100,105,102,102,117,115,101, 40,102,108,111, 97,116, 32,105, 44, 32,118,101, 99, 51, 32,108, - 97,109,112, 99,111,108, 44, 32,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,105,102, 40,105, 32, 62, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32,105, 42,108, - 97,109,112, 99,111,108, 42, 99,111,108, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,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,115,104, 97,100,101, 95, -104,101,109,105, 95,115,112,101, 99, 40,118,101, 99, 51, 32,118,110, 44, 32,118,101, 99, 51, 32,108,118, 44, 32,118,101, 99, 51, - 32,118,105,101,119, 44, 32,102,108,111, 97,116, 32,115,112,101, 99, 44, 32,102,108,111, 97,116, 32,104, 97,114,100, 44, 32,102, -108,111, 97,116, 32,118,105,115,105,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,116, 41, 10,123, 10, 9,108,118, - 32, 43, 61, 32,118,105,101,119, 59, 10, 9,108,118, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108,118, 41, 59, 10, 10, - 9,116, 32, 61, 32,100,111,116, 40,118,110, 44, 32,108,118, 41, 59, 10, 9,116, 32, 61, 32, 48, 46, 53, 42,116, 32, 43, 32, 48, - 46, 53, 59, 10, 10, 9,116, 32, 61, 32,118,105,115,105,102, 97, 99, 42,115,112,101, 99, 42,112,111,119, 40,116, 44, 32,104, 97, -114,100, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,112,104,111,110,103, 95,115,112,101, 99, 40,118,101, - 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,104, 97,114,100, - 44, 32,111,117,116, 32,102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61, - 32,110,111,114,109, 97,108,105,122,101, 40,108, 32, 43, 32,118, 41, 59, 10, 9,102,108,111, 97,116, 32,114,115,108,116, 32, 61, - 32,109, 97,120, 40,100,111,116, 40,104, 44, 32,110, 41, 44, 32, 48, 46, 48, 41, 59, 10, 10, 9,115,112,101, 99,102, 97, 99, 32, - 61, 32,112,111,119, 40,114,115,108,116, 44, 32,104, 97,114,100, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, - 95, 99,111,111,107,116,111,114,114, 95,115,112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118, -101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,104, 97,114,100, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,115,112,101, - 99,102, 97, 99, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,118, 32, 43, 32, -108, 41, 59, 10, 9,102,108,111, 97,116, 32,110,104, 32, 61, 32,100,111,116, 40,110, 44, 32,104, 41, 59, 10, 10, 9,105,102, 40, -110,104, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, - 9,101,108,115,101, 32,123, 10, 9, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32, -118, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9, 9,102,108,111, 97,116, 32,105, 32, 61, 32,112,111,119, 40,110,104, 44, 32,104, 97, -114,100, 41, 59, 10, 10, 9, 9,105, 32, 61, 32,105, 47, 40, 48, 46, 49, 43,110,118, 41, 59, 10, 9, 9,115,112,101, 99,102, 97, - 99, 32, 61, 32,105, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 98,108,105,110,110, 95,115,112, -101, 99, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, - 32,114,101,102,114, 97, 99, 44, 32,102,108,111, 97,116, 32,115,112,101, 99, 95,112,111,119,101,114, 44, 32,111,117,116, 32,102, -108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 41, 10,123, 10, 9,105,102, 40,114,101,102,114, 97, 99, 32, 60, 32, 49, 46, 48, - 41, 32,123, 10, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,105,102, - 40,115,112,101, 99, 95,112,111,119,101,114, 32, 61, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,115,112,101, 99,102, 97, 99, 32, - 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,105,102, 40,115,112,101, 99, 95,112,111,119,101, -114, 60, 49, 48, 48, 46, 48, 41, 10, 9, 9, 9,115,112,101, 99, 95,112,111,119,101,114, 61, 32,115,113,114,116, 40, 49, 46, 48, - 47,115,112,101, 99, 95,112,111,119,101,114, 41, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,115,112,101, 99, 95,112,111,119, -101,114, 61, 32, 49, 48, 46, 48, 47,115,112,101, 99, 95,112,111,119,101,114, 59, 10, 10, 9, 9,118,101, 99, 51, 32,104, 32, 61, - 32,110,111,114,109, 97,108,105,122,101, 40,118, 32, 43, 32,108, 41, 59, 10, 9, 9,102,108,111, 97,116, 32,110,104, 32, 61, 32, -100,111,116, 40,110, 44, 32,104, 41, 59, 10, 9, 9,105,102, 40,110,104, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9, 9,115, -112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9, 9,125, 10, 9, 9,101,108,115,101, 32,123, 10, 9, 9, 9,102,108, -111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,118, 41, 44, 32, 48, 46, 48, 49, 41, 59, 10, 9, - 9, 9,102,108,111, 97,116, 32,110,108, 32, 61, 32,100,111,116, 40,110, 44, 32,108, 41, 59, 10, 9, 9, 9,105,102, 40,110,108, - 32, 60, 61, 32, 48, 46, 48, 49, 41, 32,123, 10, 9, 9, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9, - 9, 9,125, 10, 9, 9, 9,101,108,115,101, 32,123, 10, 9, 9, 9, 9,102,108,111, 97,116, 32,118,104, 32, 61, 32,109, 97,120, - 40,100,111,116, 40,118, 44, 32,104, 41, 44, 32, 48, 46, 48, 49, 41, 59, 10, 10, 9, 9, 9, 9,102,108,111, 97,116, 32, 97, 32, - 61, 32, 49, 46, 48, 59, 10, 9, 9, 9, 9,102,108,111, 97,116, 32, 98, 32, 61, 32, 40, 50, 46, 48, 42,110,104, 42,110,118, 41, - 47,118,104, 59, 10, 9, 9, 9, 9,102,108,111, 97,116, 32, 99, 32, 61, 32, 40, 50, 46, 48, 42,110,104, 42,110,108, 41, 47,118, -104, 59, 10, 10, 9, 9, 9, 9,102,108,111, 97,116, 32,103, 32, 61, 32, 48, 46, 48, 59, 10, 10, 9, 9, 9, 9,105,102, 40, 97, - 32, 60, 32, 98, 32, 38, 38, 32, 97, 32, 60, 32, 99, 41, 32,103, 32, 61, 32, 97, 59, 10, 9, 9, 9, 9,101,108,115,101, 32,105, -102, 40, 98, 32, 60, 32, 97, 32, 38, 38, 32, 98, 32, 60, 32, 99, 41, 32,103, 32, 61, 32, 98, 59, 10, 9, 9, 9, 9,101,108,115, -101, 32,105,102, 40, 99, 32, 60, 32, 97, 32, 38, 38, 32, 99, 32, 60, 32, 98, 41, 32,103, 32, 61, 32, 99, 59, 10, 10, 9, 9, 9, + 59, 13, 10, 9,114, 97,100, 91, 51, 93, 32, 61, 32, 97, 99,111,115, 40,100,111,116, 40,118,101, 99, 91, 51, 93, 44, 32,118,101, + 99, 91, 48, 93, 41, 41, 59, 13, 10, 13, 10, 9,102, 97, 99, 61, 32, 32,114, 97,100, 91, 48, 93, 42,100,111,116, 40,118,110, 44, + 32, 99, 91, 48, 93, 41, 59, 13, 10, 9,102, 97, 99, 43, 61, 32,114, 97,100, 91, 49, 93, 42,100,111,116, 40,118,110, 44, 32, 99, + 91, 49, 93, 41, 59, 13, 10, 9,102, 97, 99, 43, 61, 32,114, 97,100, 91, 50, 93, 42,100,111,116, 40,118,110, 44, 32, 99, 91, 50, + 93, 41, 59, 13, 10, 9,102, 97, 99, 43, 61, 32,114, 97,100, 91, 51, 93, 42,100,111,116, 40,118,110, 44, 32, 99, 91, 51, 93, 41, + 59, 13, 10, 13, 10, 9,114,101,116,117,114,110, 32,109, 97,120, 40,102, 97, 99, 44, 32, 48, 46, 48, 41, 59, 13, 10,125, 13, 10, + 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95,105,110,112, 95, 97,114,101, 97, 40,118,101, 99, 51, 32,112,111,115,105,116, +105,111,110, 44, 32,118,101, 99, 51, 32,108, 97,109,112, 99,111, 44, 32,118,101, 99, 51, 32,108, 97,109,112,118,101, 99, 44, 32, +118,101, 99, 51, 32,118,110, 44, 32,109, 97,116, 52, 32, 97,114,101, 97, 44, 32,102,108,111, 97,116, 32, 97,114,101, 97,115,105, +122,101, 44, 32,102,108,111, 97,116, 32,107, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,112, 41, 13, 10,123, 13, 10, + 9,118,101, 99, 51, 32, 99,111, 32, 61, 32,112,111,115,105,116,105,111,110, 59, 13, 10, 9,118,101, 99, 51, 32,118,101, 99, 32, + 61, 32, 99,111, 32, 45, 32,108, 97,109,112, 99,111, 59, 13, 10, 13, 10, 9,105,102, 40,100,111,116, 40,118,101, 99, 44, 32,108, + 97,109,112,118,101, 99, 41, 32, 60, 32, 48, 46, 48, 41, 32,123, 13, 10, 9, 9,105,110,112, 32, 61, 32, 48, 46, 48, 59, 13, 10, + 9,125, 13, 10, 9,101,108,115,101, 32,123, 13, 10, 9, 9,102,108,111, 97,116, 32,105,110,116,101,110,115, 32, 61, 32, 97,114, +101, 97, 95,108, 97,109,112, 95,101,110,101,114,103,121, 40, 97,114,101, 97, 44, 32, 99,111, 44, 32,118,110, 41, 59, 13, 10, 13, + 10, 9, 9,105,110,112, 32, 61, 32,112,111,119, 40,105,110,116,101,110,115, 42, 97,114,101, 97,115,105,122,101, 44, 32,107, 41, + 59, 13, 10, 9,125, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95,100,105,102,102,117,115,101, 95,111, +114,101,110, 95,110, 97,121,101,114, 40,102,108,111, 97,116, 32,110,108, 44, 32,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, + 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,114,111,117,103,104, 44, 32,111,117,116, 32,102,108,111, + 97,116, 32,105,115, 41, 13, 10,123, 13, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,118, + 32, 43, 32,108, 41, 59, 13, 10, 9,102,108,111, 97,116, 32,110,104, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,104, + 41, 44, 32, 48, 46, 48, 41, 59, 13, 10, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, + 32,118, 41, 44, 32, 48, 46, 48, 41, 59, 13, 10, 9,102,108,111, 97,116, 32,114,101, 97,108,110,108, 32, 61, 32,100,111,116, 40, +110, 44, 32,108, 41, 59, 13, 10, 13, 10, 9,105,102, 40,114,101, 97,108,110,108, 32, 60, 32, 48, 46, 48, 41, 32,123, 13, 10, 9, + 9,105,115, 32, 61, 32, 48, 46, 48, 59, 13, 10, 9,125, 13, 10, 9,101,108,115,101, 32,105,102, 40,110,108, 32, 60, 32, 48, 46, + 48, 41, 32,123, 13, 10, 9, 9,105,115, 32, 61, 32, 48, 46, 48, 59, 13, 10, 9,125, 13, 10, 9,101,108,115,101, 32,123, 13, 10, + 9, 9,102,108,111, 97,116, 32,118,104, 32, 61, 32,109, 97,120, 40,100,111,116, 40,118, 44, 32,104, 41, 44, 32, 48, 46, 48, 41, + 59, 13, 10, 9, 9,102,108,111, 97,116, 32, 76,105,116, 95, 65, 32, 61, 32, 97, 99,111,115, 40,114,101, 97,108,110,108, 41, 59, + 13, 10, 9, 9,102,108,111, 97,116, 32, 86,105,101,119, 95, 65, 32, 61, 32, 97, 99,111,115, 40,110,118, 41, 59, 13, 10, 13, 10, + 9, 9,118,101, 99, 51, 32, 76,105,116, 95, 66, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108, 32, 45, 32,114,101, 97, +108,110,108, 42,110, 41, 59, 13, 10, 9, 9,118,101, 99, 51, 32, 86,105,101,119, 95, 66, 32, 61, 32,110,111,114,109, 97,108,105, +122,101, 40,118, 32, 45, 32,110,118, 42,110, 41, 59, 13, 10, 13, 10, 9, 9,102,108,111, 97,116, 32,116, 32, 61, 32,109, 97,120, + 40,100,111,116, 40, 76,105,116, 95, 66, 44, 32, 86,105,101,119, 95, 66, 41, 44, 32, 48, 46, 48, 41, 59, 13, 10, 13, 10, 9, 9, +102,108,111, 97,116, 32, 97, 44, 32, 98, 59, 13, 10, 13, 10, 9, 9,105,102, 40, 76,105,116, 95, 65, 32, 62, 32, 86,105,101,119, + 95, 65, 41, 32,123, 13, 10, 9, 9, 9, 97, 32, 61, 32, 76,105,116, 95, 65, 59, 13, 10, 9, 9, 9, 98, 32, 61, 32, 86,105,101, +119, 95, 65, 59, 13, 10, 9, 9,125, 13, 10, 9, 9,101,108,115,101, 32,123, 13, 10, 9, 9, 9, 97, 32, 61, 32, 86,105,101,119, + 95, 65, 59, 13, 10, 9, 9, 9, 98, 32, 61, 32, 76,105,116, 95, 65, 59, 13, 10, 9, 9,125, 13, 10, 13, 10, 9, 9,102,108,111, + 97,116, 32, 65, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 48, 46, 53, 42, 40, 40,114,111,117,103,104, 42,114,111,117,103,104, 41, + 47, 40, 40,114,111,117,103,104, 42,114,111,117,103,104, 41, 32, 43, 32, 48, 46, 51, 51, 41, 41, 41, 59, 13, 10, 9, 9,102,108, +111, 97,116, 32, 66, 32, 61, 32, 48, 46, 52, 53, 42, 40, 40,114,111,117,103,104, 42,114,111,117,103,104, 41, 47, 40, 40,114,111, +117,103,104, 42,114,111,117,103,104, 41, 32, 43, 32, 48, 46, 48, 57, 41, 41, 59, 13, 10, 13, 10, 9, 9, 98, 32, 42, 61, 32, 48, + 46, 57, 53, 59, 13, 10, 9, 9,105,115, 32, 61, 32,110,108, 42, 40, 65, 32, 43, 32, 40, 66, 32, 42, 32,116, 32, 42, 32,115,105, +110, 40, 97, 41, 32, 42, 32,116, 97,110, 40, 98, 41, 41, 41, 59, 13, 10, 9,125, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32, +115,104, 97,100,101, 95,100,105,102,102,117,115,101, 95,116,111,111,110, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32, +108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,115,105,122,101, 44, 32,102,108,111, 97,116, 32,116,115,109, +111,111,116,104, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32,114, +115,108,116, 32, 61, 32,100,111,116, 40,110, 44, 32,108, 41, 59, 13, 10, 9,102,108,111, 97,116, 32, 97,110,103, 32, 61, 32, 97, + 99,111,115, 40,114,115,108,116, 41, 59, 13, 10, 13, 10, 9,105,102, 40, 97,110,103, 32, 60, 32,115,105,122,101, 41, 32,105,115, + 32, 61, 32, 49, 46, 48, 59, 13, 10, 9,101,108,115,101, 32,105,102, 40, 97,110,103, 32, 62, 32, 40,115,105,122,101, 32, 43, 32, +116,115,109,111,111,116,104, 41, 32,124,124, 32,116,115,109,111,111,116,104, 32, 61, 61, 32, 48, 46, 48, 41, 32,105,115, 32, 61, + 32, 48, 46, 48, 59, 13, 10, 9,101,108,115,101, 32,105,115, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 40, 97,110,103, 32, 45, 32, +115,105,122,101, 41, 47,116,115,109,111,111,116,104, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, + 95,100,105,102,102,117,115,101, 95,109,105,110,110, 97,101,114,116, 40,102,108,111, 97,116, 32,110,108, 44, 32,118,101, 99, 51, + 32,110, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,100, 97,114,107,110,101,115,115, 44, 32,111,117,116, 32, +102,108,111, 97,116, 32,105,115, 41, 13, 10,123, 13, 10, 9,105,102, 40,110,108, 32, 60, 61, 32, 48, 46, 48, 41, 32,123, 13, 10, + 9, 9,105,115, 32, 61, 32, 48, 46, 48, 59, 13, 10, 9,125, 13, 10, 9,101,108,115,101, 32,123, 13, 10, 9, 9,102,108,111, 97, +116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,118, 41, 44, 32, 48, 46, 48, 41, 59, 13, 10, 13, 10, 9, + 9,105,102, 40,100, 97,114,107,110,101,115,115, 32, 60, 61, 32, 49, 46, 48, 41, 13, 10, 9, 9, 9,105,115, 32, 61, 32,110,108, + 42,112,111,119, 40,109, 97,120, 40,110,118, 42,110,108, 44, 32, 48, 46, 49, 41, 44, 32,100, 97,114,107,110,101,115,115, 32, 45, + 32, 49, 46, 48, 41, 59, 13, 10, 9, 9,101,108,115,101, 13, 10, 9, 9, 9,105,115, 32, 61, 32,110,108, 42,112,111,119, 40, 49, + 46, 48, 48, 48, 49, 32, 45, 32,110,118, 44, 32,100, 97,114,107,110,101,115,115, 32, 45, 32, 49, 46, 48, 41, 59, 13, 10, 9,125, + 13, 10,125, 13, 10, 13, 10,102,108,111, 97,116, 32,102,114,101,115,110,101,108, 95,102, 97, 99, 40,118,101, 99, 51, 32,118,105, +101,119, 44, 32,118,101, 99, 51, 32,118,110, 44, 32,102,108,111, 97,116, 32,103,114, 97,100, 44, 32,102,108,111, 97,116, 32,102, + 97, 99, 41, 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32,116, 49, 44, 32,116, 50, 59, 13, 10, 9,102,108,111, 97,116, 32,102, +102, 97, 99, 59, 13, 10, 13, 10, 9,105,102, 40,102, 97, 99, 61, 61, 48, 46, 48, 41, 32,123, 13, 10, 9, 9,102,102, 97, 99, 32, + 61, 32, 49, 46, 48, 59, 13, 10, 9,125, 13, 10, 9,101,108,115,101, 32,123, 13, 10, 9, 9,116, 49, 61, 32,100,111,116, 40,118, +105,101,119, 44, 32,118,110, 41, 59, 13, 10, 9, 9,105,102, 40,116, 49, 62, 48, 46, 48, 41, 32, 32,116, 50, 61, 32, 49, 46, 48, + 43,116, 49, 59, 13, 10, 9, 9,101,108,115,101, 32,116, 50, 61, 32, 49, 46, 48, 45,116, 49, 59, 13, 10, 13, 10, 9, 9,116, 50, + 61, 32,103,114, 97,100, 32, 43, 32, 40, 49, 46, 48, 45,103,114, 97,100, 41, 42,112,111,119, 40,116, 50, 44, 32,102, 97, 99, 41, + 59, 13, 10, 13, 10, 9, 9,105,102, 40,116, 50, 60, 48, 46, 48, 41, 32,102,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 13, 10, 9, + 9,101,108,115,101, 32,105,102, 40,116, 50, 62, 49, 46, 48, 41, 32,102,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 13, 10, 9, 9, +101,108,115,101, 32,102,102, 97, 99, 32, 61, 32,116, 50, 59, 13, 10, 9,125, 13, 10, 13, 10, 9,114,101,116,117,114,110, 32,102, +102, 97, 99, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95,100,105,102,102,117,115,101, 95,102,114, +101,115,110,101,108, 40,118,101, 99, 51, 32,118,110, 44, 32,118,101, 99, 51, 32,108,118, 44, 32,118,101, 99, 51, 32,118,105,101, +119, 44, 32,102,108,111, 97,116, 32,102, 97, 99, 95,105, 44, 32,102,108,111, 97,116, 32,102, 97, 99, 44, 32,111,117,116, 32,102, +108,111, 97,116, 32,105,115, 41, 13, 10,123, 13, 10, 9,105,115, 32, 61, 32,102,114,101,115,110,101,108, 95,102, 97, 99, 40,108, +118, 44, 32,118,110, 44, 32,102, 97, 99, 95,105, 44, 32,102, 97, 99, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115, +104, 97,100,101, 95, 99,117, 98,105, 99, 40,102,108,111, 97,116, 32,105,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111, +117,116,105,115, 41, 13, 10,123, 13, 10, 9,105,102, 40,105,115, 62, 48, 46, 48, 32, 38, 38, 32,105,115, 60, 49, 46, 48, 41, 13, + 10, 9, 9,111,117,116,105,115, 61, 32,115,109,111,111,116,104,115,116,101,112, 40, 48, 46, 48, 44, 32, 49, 46, 48, 44, 32,105, +115, 41, 59, 13, 10, 9,101,108,115,101, 13, 10, 9, 9,111,117,116,105,115, 61, 32,105,115, 59, 13, 10,125, 13, 10, 13, 10,118, +111,105,100, 32,115,104, 97,100,101, 95,118,105,115,105,102, 97, 99, 40,102,108,111, 97,116, 32,105, 44, 32,102,108,111, 97,116, + 32,118,105,115,105,102, 97, 99, 44, 32,102,108,111, 97,116, 32,114,101,102,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, +111,117,116,105, 41, 13, 10,123, 13, 10, 9, 47, 42,105,102, 40,105, 32, 62, 32, 48, 46, 48, 41, 42, 47, 13, 10, 9, 9,111,117, +116,105, 32, 61, 32,109, 97,120, 40,105, 42,118,105,115,105,102, 97, 99, 42,114,101,102,108, 44, 32, 48, 46, 48, 41, 59, 13, 10, + 9, 47, 42,101,108,115,101, 13, 10, 9, 9,111,117,116,105, 32, 61, 32,105, 59, 42, 47, 13, 10,125, 13, 10, 13, 10,118,111,105, +100, 32,115,104, 97,100,101, 95,116, 97,110,103,101,110,116, 95,118, 95,115,112,101, 99, 40,118,101, 99, 51, 32,116, 97,110,103, + 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,110, 41, 13, 10,123, 13, 10, 9,118,110, 32, 61, 32,116, 97,110,103, 59, 13, 10, +125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,100,100, 95,116,111, 95,100,105,102,102,117,115,101, 40,102, +108,111, 97,116, 32,105, 44, 32,118,101, 99, 51, 32,108, 97,109,112, 99,111,108, 44, 32,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,105,102, 40,105, 32, 62, 32, 48, 46, 48, + 41, 13, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32,105, 42,108, 97,109,112, 99,111,108, 42, 99,111,108, 59, 13, 10, 9,101, +108,115,101, 13, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, + 46, 48, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95,104,101,109,105, 95,115,112,101, 99, 40, +118,101, 99, 51, 32,118,110, 44, 32,118,101, 99, 51, 32,108,118, 44, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,102,108,111, + 97,116, 32,115,112,101, 99, 44, 32,102,108,111, 97,116, 32,104, 97,114,100, 44, 32,102,108,111, 97,116, 32,118,105,115,105,102, + 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,116, 41, 13, 10,123, 13, 10, 9,108,118, 32, 43, 61, 32,118,105,101,119, + 59, 13, 10, 9,108,118, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108,118, 41, 59, 13, 10, 13, 10, 9,116, 32, 61, 32, +100,111,116, 40,118,110, 44, 32,108,118, 41, 59, 13, 10, 9,116, 32, 61, 32, 48, 46, 53, 42,116, 32, 43, 32, 48, 46, 53, 59, 13, + 10, 13, 10, 9,116, 32, 61, 32,118,105,115,105,102, 97, 99, 42,115,112,101, 99, 42,112,111,119, 40,116, 44, 32,104, 97,114,100, + 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95,112,104,111,110,103, 95,115,112,101, 99, 40,118, +101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,104, 97,114, +100, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 41, 13, 10,123, 13, 10, 9,118,101, 99, 51, 32, +104, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108, 32, 43, 32,118, 41, 59, 13, 10, 9,102,108,111, 97,116, 32,114,115, +108,116, 32, 61, 32,109, 97,120, 40,100,111,116, 40,104, 44, 32,110, 41, 44, 32, 48, 46, 48, 41, 59, 13, 10, 13, 10, 9,115,112, +101, 99,102, 97, 99, 32, 61, 32,112,111,119, 40,114,115,108,116, 44, 32,104, 97,114,100, 41, 59, 13, 10,125, 13, 10, 13, 10,118, +111,105,100, 32,115,104, 97,100,101, 95, 99,111,111,107,116,111,114,114, 95,115,112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32, +118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,104, 97,114,100, 44, 32,111,117,116, 32, +102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 41, 13, 10,123, 13, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114, +109, 97,108,105,122,101, 40,118, 32, 43, 32,108, 41, 59, 13, 10, 9,102,108,111, 97,116, 32,110,104, 32, 61, 32,100,111,116, 40, +110, 44, 32,104, 41, 59, 13, 10, 13, 10, 9,105,102, 40,110,104, 32, 60, 32, 48, 46, 48, 41, 32,123, 13, 10, 9, 9,115,112,101, + 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 13, 10, 9,125, 13, 10, 9,101,108,115,101, 32,123, 13, 10, 9, 9,102,108,111, 97, +116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,118, 41, 44, 32, 48, 46, 48, 41, 59, 13, 10, 9, 9,102, +108,111, 97,116, 32,105, 32, 61, 32,112,111,119, 40,110,104, 44, 32,104, 97,114,100, 41, 59, 13, 10, 13, 10, 9, 9,105, 32, 61, + 32,105, 47, 40, 48, 46, 49, 43,110,118, 41, 59, 13, 10, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32,105, 59, 13, 10, 9,125, + 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 98,108,105,110,110, 95,115,112,101, 99, 40,118,101, 99, + 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,114,101,102,114, 97, + 99, 44, 32,102,108,111, 97,116, 32,115,112,101, 99, 95,112,111,119,101,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,115, +112,101, 99,102, 97, 99, 41, 13, 10,123, 13, 10, 9,105,102, 40,114,101,102,114, 97, 99, 32, 60, 32, 49, 46, 48, 41, 32,123, 13, + 10, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 13, 10, 9,125, 13, 10, 9,101,108,115,101, 32,105,102, 40, +115,112,101, 99, 95,112,111,119,101,114, 32, 61, 61, 32, 48, 46, 48, 41, 32,123, 13, 10, 9, 9,115,112,101, 99,102, 97, 99, 32, + 61, 32, 48, 46, 48, 59, 13, 10, 9,125, 13, 10, 9,101,108,115,101, 32,123, 13, 10, 9, 9,105,102, 40,115,112,101, 99, 95,112, +111,119,101,114, 60, 49, 48, 48, 46, 48, 41, 13, 10, 9, 9, 9,115,112,101, 99, 95,112,111,119,101,114, 61, 32,115,113,114,116, + 40, 49, 46, 48, 47,115,112,101, 99, 95,112,111,119,101,114, 41, 59, 13, 10, 9, 9,101,108,115,101, 13, 10, 9, 9, 9,115,112, +101, 99, 95,112,111,119,101,114, 61, 32, 49, 48, 46, 48, 47,115,112,101, 99, 95,112,111,119,101,114, 59, 13, 10, 13, 10, 9, 9, +118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,118, 32, 43, 32,108, 41, 59, 13, 10, 9, 9,102,108, +111, 97,116, 32,110,104, 32, 61, 32,100,111,116, 40,110, 44, 32,104, 41, 59, 13, 10, 9, 9,105,102, 40,110,104, 32, 60, 32, 48, + 46, 48, 41, 32,123, 13, 10, 9, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 13, 10, 9, 9,125, 13, 10, 9, + 9,101,108,115,101, 32,123, 13, 10, 9, 9, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, + 44, 32,118, 41, 44, 32, 48, 46, 48, 49, 41, 59, 13, 10, 9, 9, 9,102,108,111, 97,116, 32,110,108, 32, 61, 32,100,111,116, 40, +110, 44, 32,108, 41, 59, 13, 10, 9, 9, 9,105,102, 40,110,108, 32, 60, 61, 32, 48, 46, 48, 49, 41, 32,123, 13, 10, 9, 9, 9, + 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 13, 10, 9, 9, 9,125, 13, 10, 9, 9, 9,101,108,115,101, 32,123, + 13, 10, 9, 9, 9, 9,102,108,111, 97,116, 32,118,104, 32, 61, 32,109, 97,120, 40,100,111,116, 40,118, 44, 32,104, 41, 44, 32, + 48, 46, 48, 49, 41, 59, 13, 10, 13, 10, 9, 9, 9, 9,102,108,111, 97,116, 32, 97, 32, 61, 32, 49, 46, 48, 59, 13, 10, 9, 9, + 9, 9,102,108,111, 97,116, 32, 98, 32, 61, 32, 40, 50, 46, 48, 42,110,104, 42,110,118, 41, 47,118,104, 59, 13, 10, 9, 9, 9, + 9,102,108,111, 97,116, 32, 99, 32, 61, 32, 40, 50, 46, 48, 42,110,104, 42,110,108, 41, 47,118,104, 59, 13, 10, 13, 10, 9, 9, + 9, 9,102,108,111, 97,116, 32,103, 32, 61, 32, 48, 46, 48, 59, 13, 10, 13, 10, 9, 9, 9, 9,105,102, 40, 97, 32, 60, 32, 98, + 32, 38, 38, 32, 97, 32, 60, 32, 99, 41, 32,103, 32, 61, 32, 97, 59, 13, 10, 9, 9, 9, 9,101,108,115,101, 32,105,102, 40, 98, + 32, 60, 32, 97, 32, 38, 38, 32, 98, 32, 60, 32, 99, 41, 32,103, 32, 61, 32, 98, 59, 13, 10, 9, 9, 9, 9,101,108,115,101, 32, +105,102, 40, 99, 32, 60, 32, 97, 32, 38, 38, 32, 99, 32, 60, 32, 98, 41, 32,103, 32, 61, 32, 99, 59, 13, 10, 13, 10, 9, 9, 9, 9,102,108,111, 97,116, 32,112, 32, 61, 32,115,113,114,116, 40, 40, 40,114,101,102,114, 97, 99, 32, 42, 32,114,101,102,114, 97, - 99, 41, 43, 40,118,104, 42,118,104, 41, 45, 49, 46, 48, 41, 41, 59, 10, 9, 9, 9, 9,102,108,111, 97,116, 32,102, 32, 61, 32, - 40, 40, 40,112, 45,118,104, 41, 42, 40,112, 45,118,104, 41, 41, 47, 40, 40,112, 43,118,104, 41, 42, 40,112, 43,118,104, 41, 41, - 41, 42, 40, 49, 46, 48, 43, 40, 40, 40, 40,118,104, 42, 40,112, 43,118,104, 41, 41, 45, 49, 46, 48, 41, 42, 40, 40,118,104, 42, - 40,112, 43,118,104, 41, 41, 45, 49, 46, 48, 41, 41, 47, 40, 40, 40,118,104, 42, 40,112, 45,118,104, 41, 41, 43, 49, 46, 48, 41, - 42, 40, 40,118,104, 42, 40,112, 45,118,104, 41, 41, 43, 49, 46, 48, 41, 41, 41, 41, 59, 10, 9, 9, 9, 9,102,108,111, 97,116, - 32, 97,110,103, 32, 61, 32, 97, 99,111,115, 40,110,104, 41, 59, 10, 10, 9, 9, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32, -109, 97,120, 40,102, 42,103, 42,101,120,112, 95, 98,108,101,110,100,101,114, 40, 40, 45, 40, 97,110,103, 42, 97,110,103, 41, 47, - 40, 50, 46, 48, 42,115,112,101, 99, 95,112,111,119,101,114, 42,115,112,101, 99, 95,112,111,119,101,114, 41, 41, 41, 44, 32, 48, - 46, 48, 41, 59, 10, 9, 9, 9,125, 10, 9, 9,125, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,119, - 97,114,100,105,115,111, 95,115,112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, - 32,118, 44, 32,102,108,111, 97,116, 32,114,109,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99, - 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108, 32, 43, 32,118, 41, 59, 10, - 9,102,108,111, 97,116, 32,110,104, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,104, 41, 44, 32, 48, 46, 48, 48, 49, - 41, 59, 10, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,118, 41, 44, 32, 48, 46, - 48, 48, 49, 41, 59, 10, 9,102,108,111, 97,116, 32,110,108, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,108, 41, 44, - 32, 48, 46, 48, 48, 49, 41, 59, 10, 9,102,108,111, 97,116, 32, 97,110,103,108,101, 32, 61, 32,116, 97,110, 40, 97, 99,111,115, - 40,110,104, 41, 41, 59, 10, 9,102,108,111, 97,116, 32, 97,108,112,104, 97, 32, 61, 32,109, 97,120, 40,114,109,115, 44, 32, 48, - 46, 48, 48, 49, 41, 59, 10, 10, 9,115,112,101, 99,102, 97, 99, 61, 32,110,108, 32, 42, 32, 40, 49, 46, 48, 47, 40, 52, 46, 48, - 42, 77, 95, 80, 73, 42, 97,108,112,104, 97, 42, 97,108,112,104, 97, 41, 41, 42, 40,101,120,112, 95, 98,108,101,110,100,101,114, - 40, 45, 40, 97,110,103,108,101, 42, 97,110,103,108,101, 41, 47, 40, 97,108,112,104, 97, 42, 97,108,112,104, 97, 41, 41, 47, 40, -115,113,114,116, 40,110,118, 42,110,108, 41, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,116,111,111, -110, 95,115,112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102, -108,111, 97,116, 32,115,105,122,101, 44, 32,102,108,111, 97,116, 32,116,115,109,111,111,116,104, 44, 32,111,117,116, 32,102,108, -111, 97,116, 32,115,112,101, 99,102, 97, 99, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105, -122,101, 40,108, 32, 43, 32,118, 41, 59, 10, 9,102,108,111, 97,116, 32,114,115,108,116, 32, 61, 32,100,111,116, 40,104, 44, 32, -110, 41, 59, 10, 9,102,108,111, 97,116, 32, 97,110,103, 32, 61, 32, 97, 99,111,115, 40,114,115,108,116, 41, 59, 10, 10, 9,105, -102, 40, 97,110,103, 32, 60, 32,115,105,122,101, 41, 32,114,115,108,116, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,115,101, 32, -105,102, 40, 97,110,103, 32, 62, 61, 32, 40,115,105,122,101, 32, 43, 32,116,115,109,111,111,116,104, 41, 32,124,124, 32,116,115, -109,111,111,116,104, 32, 61, 61, 32, 48, 46, 48, 41, 32,114,115,108,116, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32, -114,115,108,116, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 40, 97,110,103, 32, 45, 32,115,105,122,101, 41, 47,116,115,109,111,111, -116,104, 41, 59, 10, 10, 9,115,112,101, 99,102, 97, 99, 32, 61, 32,114,115,108,116, 59, 10,125, 10, 10,118,111,105,100, 32,115, -104, 97,100,101, 95,115,112,101, 99, 95, 97,114,101, 97, 95,105,110,112, 40,102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99, - 44, 32,102,108,111, 97,116, 32,105,110,112, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,112,101, 99,102, 97, - 99, 41, 10,123, 10, 9,111,117,116,115,112,101, 99,102, 97, 99, 32, 61, 32,115,112,101, 99,102, 97, 99, 42,105,110,112, 59, 10, -125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,115,112,101, 99, 95,116, 40,102,108,111, 97,116, 32,115,104, 97,100,102, - 97, 99, 44, 32,102,108,111, 97,116, 32,115,112,101, 99, 44, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 44, 32,102, -108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,116, 41, 10,123, 10, 9,116, 32, - 61, 32,115,104, 97,100,102, 97, 99, 42,115,112,101, 99, 42,118,105,115,105,102, 97, 99, 42,115,112,101, 99,102, 97, 99, 59, 10, -125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,100,100, 95,115,112,101, 99, 40,102,108,111, 97,116, 32,116, 44, 32, -118,101, 99, 51, 32,108, 97,109,112, 99,111,108, 44, 32,118,101, 99, 51, 32,115,112,101, 99, 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,116, 42,108, 97,109,112, 99, -111,108, 42,115,112,101, 99, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,100,100, 40,118,101, + 99, 41, 43, 40,118,104, 42,118,104, 41, 45, 49, 46, 48, 41, 41, 59, 13, 10, 9, 9, 9, 9,102,108,111, 97,116, 32,102, 32, 61, + 32, 40, 40, 40,112, 45,118,104, 41, 42, 40,112, 45,118,104, 41, 41, 47, 40, 40,112, 43,118,104, 41, 42, 40,112, 43,118,104, 41, + 41, 41, 42, 40, 49, 46, 48, 43, 40, 40, 40, 40,118,104, 42, 40,112, 43,118,104, 41, 41, 45, 49, 46, 48, 41, 42, 40, 40,118,104, + 42, 40,112, 43,118,104, 41, 41, 45, 49, 46, 48, 41, 41, 47, 40, 40, 40,118,104, 42, 40,112, 45,118,104, 41, 41, 43, 49, 46, 48, + 41, 42, 40, 40,118,104, 42, 40,112, 45,118,104, 41, 41, 43, 49, 46, 48, 41, 41, 41, 41, 59, 13, 10, 9, 9, 9, 9,102,108,111, + 97,116, 32, 97,110,103, 32, 61, 32, 97, 99,111,115, 40,110,104, 41, 59, 13, 10, 13, 10, 9, 9, 9, 9,115,112,101, 99,102, 97, + 99, 32, 61, 32,109, 97,120, 40,102, 42,103, 42,101,120,112, 95, 98,108,101,110,100,101,114, 40, 40, 45, 40, 97,110,103, 42, 97, +110,103, 41, 47, 40, 50, 46, 48, 42,115,112,101, 99, 95,112,111,119,101,114, 42,115,112,101, 99, 95,112,111,119,101,114, 41, 41, + 41, 44, 32, 48, 46, 48, 41, 59, 13, 10, 9, 9, 9,125, 13, 10, 9, 9,125, 13, 10, 9,125, 13, 10,125, 13, 10, 13, 10,118,111, +105,100, 32,115,104, 97,100,101, 95,119, 97,114,100,105,115,111, 95,115,112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32,118,101, + 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,114,109,115, 44, 32,111,117,116, 32,102,108,111, + 97,116, 32,115,112,101, 99,102, 97, 99, 41, 13, 10,123, 13, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108, +105,122,101, 40,108, 32, 43, 32,118, 41, 59, 13, 10, 9,102,108,111, 97,116, 32,110,104, 32, 61, 32,109, 97,120, 40,100,111,116, + 40,110, 44, 32,104, 41, 44, 32, 48, 46, 48, 48, 49, 41, 59, 13, 10, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, + 40,100,111,116, 40,110, 44, 32,118, 41, 44, 32, 48, 46, 48, 48, 49, 41, 59, 13, 10, 9,102,108,111, 97,116, 32,110,108, 32, 61, + 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,108, 41, 44, 32, 48, 46, 48, 48, 49, 41, 59, 13, 10, 9,102,108,111, 97,116, 32, + 97,110,103,108,101, 32, 61, 32,116, 97,110, 40, 97, 99,111,115, 40,110,104, 41, 41, 59, 13, 10, 9,102,108,111, 97,116, 32, 97, +108,112,104, 97, 32, 61, 32,109, 97,120, 40,114,109,115, 44, 32, 48, 46, 48, 48, 49, 41, 59, 13, 10, 13, 10, 9,115,112,101, 99, +102, 97, 99, 61, 32,110,108, 32, 42, 32, 40, 49, 46, 48, 47, 40, 52, 46, 48, 42, 77, 95, 80, 73, 42, 97,108,112,104, 97, 42, 97, +108,112,104, 97, 41, 41, 42, 40,101,120,112, 95, 98,108,101,110,100,101,114, 40, 45, 40, 97,110,103,108,101, 42, 97,110,103,108, +101, 41, 47, 40, 97,108,112,104, 97, 42, 97,108,112,104, 97, 41, 41, 47, 40,115,113,114,116, 40,110,118, 42,110,108, 41, 41, 41, + 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95,116,111,111,110, 95,115,112,101, 99, 40,118,101, 99, + 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,115,105,122,101, 44, + 32,102,108,111, 97,116, 32,116,115,109,111,111,116,104, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,115,112,101, 99,102, 97, + 99, 41, 13, 10,123, 13, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108, 32, 43, 32,118, + 41, 59, 13, 10, 9,102,108,111, 97,116, 32,114,115,108,116, 32, 61, 32,100,111,116, 40,104, 44, 32,110, 41, 59, 13, 10, 9,102, +108,111, 97,116, 32, 97,110,103, 32, 61, 32, 97, 99,111,115, 40,114,115,108,116, 41, 59, 13, 10, 13, 10, 9,105,102, 40, 97,110, +103, 32, 60, 32,115,105,122,101, 41, 32,114,115,108,116, 32, 61, 32, 49, 46, 48, 59, 13, 10, 9,101,108,115,101, 32,105,102, 40, + 97,110,103, 32, 62, 61, 32, 40,115,105,122,101, 32, 43, 32,116,115,109,111,111,116,104, 41, 32,124,124, 32,116,115,109,111,111, +116,104, 32, 61, 61, 32, 48, 46, 48, 41, 32,114,115,108,116, 32, 61, 32, 48, 46, 48, 59, 13, 10, 9,101,108,115,101, 32,114,115, +108,116, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 40, 97,110,103, 32, 45, 32,115,105,122,101, 41, 47,116,115,109,111,111,116,104, + 41, 59, 13, 10, 13, 10, 9,115,112,101, 99,102, 97, 99, 32, 61, 32,114,115,108,116, 59, 13, 10,125, 13, 10, 13, 10,118,111,105, +100, 32,115,104, 97,100,101, 95,115,112,101, 99, 95, 97,114,101, 97, 95,105,110,112, 40,102,108,111, 97,116, 32,115,112,101, 99, +102, 97, 99, 44, 32,102,108,111, 97,116, 32,105,110,112, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,112,101, + 99,102, 97, 99, 41, 13, 10,123, 13, 10, 9,111,117,116,115,112,101, 99,102, 97, 99, 32, 61, 32,115,112,101, 99,102, 97, 99, 42, +105,110,112, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95,115,112,101, 99, 95,116, 40,102,108,111, + 97,116, 32,115,104, 97,100,102, 97, 99, 44, 32,102,108,111, 97,116, 32,115,112,101, 99, 44, 32,102,108,111, 97,116, 32,118,105, +115,105,102, 97, 99, 44, 32,102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, +116, 41, 13, 10,123, 13, 10, 9,116, 32, 61, 32,115,104, 97,100,102, 97, 99, 42,115,112,101, 99, 42,118,105,115,105,102, 97, 99, + 42,115,112,101, 99,102, 97, 99, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,100,100, 95,115, +112,101, 99, 40,102,108,111, 97,116, 32,116, 44, 32,118,101, 99, 51, 32,108, 97,109,112, 99,111,108, 44, 32,118,101, 99, 51, 32, +115,112,101, 99, 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,116, 42,108, 97,109,112, 99,111,108, 42,115,112,101, 99, 99,111,108, 59, 13, 10,125, 13, 10, 13, + 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,100,100, 40,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,111,117,116, 99, +111,108, 32, 61, 32, 99,111,108, 49, 32, 43, 32, 99,111,108, 50, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97, +100,101, 95,109, 97,100,100, 40,118,101, 99, 52, 32, 99,111,108, 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,111,117, +116, 99,111,108, 32, 61, 32, 99,111,108, 32, 43, 32, 99,111,108, 49, 42, 99,111,108, 50, 59, 13, 10,125, 13, 10, 13, 10,118,111, +105,100, 32,115,104, 97,100,101, 95, 97,100,100, 95, 99,108, 97,109,112,101,100, 40,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,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 32, 43, 32,109, 97,120, 40, 99,111,108, 50, 44, 32,118,101, 99, 52, 40, + 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 41, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, + 32,115,104, 97,100,101, 95,109, 97,100,100, 95, 99,108, 97,109,112,101,100, 40,118,101, 99, 52, 32, 99,111,108, 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,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 32, 43, 32, 99,111,108, 50, 59, 10,125, 10, - 10,118,111,105,100, 32,115,104, 97,100,101, 95,109, 97,100,100, 40,118,101, 99, 52, 32, 99,111,108, 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,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 32, 43, 32, 99,111,108, 49, 42, 99,111,108, 50, 59, 10,125, - 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,100,100, 95, 99,108, 97,109,112,101,100, 40,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,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 32, 43, 32,109, 97,120, 40, 99,111,108, 50, 44, 32,118,101, 99, - 52, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32, -115,104, 97,100,101, 95,109, 97,100,100, 95, 99,108, 97,109,112,101,100, 40,118,101, 99, 52, 32, 99,111,108, 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,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 32, 43, 32,109, 97,120, 40, 99,111,108, 49, 42, 99, -111,108, 50, 44, 32,118,101, 99, 52, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 41, 41, 59, 10, -125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,109, 97,100,100,102, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,102,108, -111, 97,116, 32,102, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 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, 32, 43, 32,102, 42, 99,111,108, 49, 59, 10,125, 10, 10, -118,111,105,100, 32,115,104, 97,100,101, 95,109,117,108, 40,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,111,117,116, 99,111,108, 32, - 61, 32, 99,111,108, 49, 42, 99,111,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,109,117,108, 95,118, - 97,108,117,101, 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, 32, 61, 32, 99,111,108, 42,102, 97, 99, 59, 10, -125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,111, 98, 99,111,108,111,114, 40,118,101, 99, 52, 32, 99,111,108, 44, 32, -118,101, 99, 52, 32,111, 98, 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,118,101, 99, 52, 40, 99,111,108, 46,114,103, 98, 42,111, 98, 99,111,108, 46,114,103, 98, 44, - 32, 99,111,108, 46, 97, 41, 59, 10,125, 10, 10,118,111,105,100, 32,114, 97,109,112, 95,114,103, 98,116,111, 98,119, 40,118,101, - 99, 51, 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, 10,123, 10, 9,111, -117,116,118, 97,108, 32, 61, 32, 99,111,108,111,114, 46,114, 42, 48, 46, 51, 32, 43, 32, 99,111,108,111,114, 46,103, 42, 48, 46, - 53, 56, 32, 43, 32, 99,111,108,111,114, 46, 98, 42, 48, 46, 49, 50, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, - 95,111,110,108,121, 95,115,104, 97,100,111,119, 40,102,108,111, 97,116, 32,105, 44, 32,102,108,111, 97,116, 32,115,104, 97,100, -102, 97, 99, 44, 32,102,108,111, 97,116, 32,101,110,101,114,103,121, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116, -115,104, 97,100,102, 97, 99, 41, 10,123, 10, 9,111,117,116,115,104, 97,100,102, 97, 99, 32, 61, 32,105, 42,101,110,101,114,103, -121, 42, 40, 49, 46, 48, 32, 45, 32,115,104, 97,100,102, 97, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, - 95,111,110,108,121, 95,115,104, 97,100,111,119, 95,100,105,102,102,117,115,101, 40,102,108,111, 97,116, 32,115,104, 97,100,102, - 97, 99, 44, 32,118,101, 99, 51, 32,114,103, 98, 44, 32,118,101, 99, 52, 32,100,105,102,102, 44, 32,111,117,116, 32,118,101, 99, - 52, 32,111,117,116,100,105,102,102, 41, 10,123, 10, 9,111,117,116,100,105,102,102, 32, 61, 32,100,105,102,102, 32, 45, 32,118, -101, 99, 52, 40,114,103, 98, 42,115,104, 97,100,102, 97, 99, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115, -104, 97,100,101, 95,111,110,108,121, 95,115,104, 97,100,111,119, 95,115,112,101, 99,117,108, 97,114, 40,102,108,111, 97,116, 32, -115,104, 97,100,102, 97, 99, 44, 32,118,101, 99, 51, 32,115,112,101, 99,114,103, 98, 44, 32,118,101, 99, 52, 32,115,112,101, 99, - 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,115,112,101, 99, 41, 10,123, 10, 9,111,117,116,115,112,101, 99, 32, 61, - 32,115,112,101, 99, 32, 45, 32,118,101, 99, 52, 40,115,112,101, 99,114,103, 98, 42,115,104, 97,100,102, 97, 99, 44, 32, 48, 46, - 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,115,116, 95,115,104, 97,100,111,119, 98,117,102, 40,118,101, 99, 51, 32, -114, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 83,104, 97,100,111,119, 32,115,104, 97,100,111,119,109, 97,112, 44, 32, -109, 97,116, 52, 32,115,104, 97,100,111,119,112,101,114,115,109, 97,116, 44, 32,102,108,111, 97,116, 32,115,104, 97,100,111,119, - 98,105, 97,115, 44, 32,102,108,111, 97,116, 32,105,110,112, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,114,101,115,117,108, -116, 41, 10,123, 10, 9,105,102, 40,105,110,112, 32, 60, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,114,101,115,117,108,116, 32, - 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,118,101, 99, 52, 32, 99,111, 32, 61, 32,115,104, - 97,100,111,119,112,101,114,115,109, 97,116, 42,118,101, 99, 52, 40,114, 99,111, 44, 32, 49, 46, 48, 41, 59, 10, 10, 9, 9, 47, - 47,102,108,111, 97,116, 32, 98,105, 97,115, 32, 61, 32, 40, 49, 46, 53, 32, 45, 32,105,110,112, 42,105,110,112, 41, 42,115,104, - 97,100,111,119, 98,105, 97,115, 59, 10, 9, 9, 99,111, 46,122, 32, 45, 61, 32,115,104, 97,100,111,119, 98,105, 97,115, 42, 99, -111, 46,119, 59, 10, 10, 9, 9,114,101,115,117,108,116, 32, 61, 32,115,104, 97,100,111,119, 50, 68, 80,114,111,106, 40,115,104, - 97,100,111,119,109, 97,112, 44, 32, 99,111, 41, 46,120, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, - 95,101,120,112,111,115,117,114,101, 95, 99,111,114,114,101, 99,116, 40,118,101, 99, 51, 32, 99,111,108, 44, 32,102,108,111, 97, -116, 32,108,105,110,102, 97, 99, 44, 32,102,108,111, 97,116, 32,108,111,103,102, 97, 99, 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,108,105,110,102, 97, 99, 42, 40, 49, 46, 48, - 32, 45, 32,101,120,112, 40, 99,111,108, 42,108,111,103,102, 97, 99, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97, -100,101, 95,109,105,115,116, 95,102, 97, 99,116,111,114, 40,118,101, 99, 51, 32, 99,111, 44, 32,102,108,111, 97,116, 32,109,105, -115,116,115,116, 97, 44, 32,102,108,111, 97,116, 32,109,105,115,116,100,105,115,116, 44, 32,102,108,111, 97,116, 32,109,105,115, -116,116,121,112,101, 44, 32,102,108,111, 97,116, 32,109,105,115,105, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116, -102, 97, 99, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99, 44, 32,122, 99,111,114, 59, 10, 10, 9,122, 99,111,114, 32, - 61, 32, 40,103,108, 95, 80,114,111,106,101, 99,116,105,111,110, 77, 97,116,114,105,120, 91, 51, 93, 91, 51, 93, 32, 61, 61, 32, - 48, 46, 48, 41, 63, 32,108,101,110,103,116,104, 40, 99,111, 41, 58, 32, 45, 99,111, 91, 50, 93, 59, 10, 9, 10, 9,102, 97, 99, - 32, 61, 32, 99,108, 97,109,112, 40, 40,122, 99,111,114, 45,109,105,115,116,115,116, 97, 41, 47,109,105,115,116,100,105,115,116, - 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,105,102, 40,109,105,115,116,116,121,112,101, 32, 61, 61, 32, 48, 46, 48, - 41, 32,102, 97, 99, 32, 42, 61, 32,102, 97, 99, 59, 10, 9,101,108,115,101, 32,105,102, 40,109,105,115,116,116,121,112,101, 32, - 61, 61, 32, 49, 46, 48, 41, 59, 10, 9,101,108,115,101, 32,102, 97, 99, 32, 61, 32,115,113,114,116, 40,102, 97, 99, 41, 59, 10, - 10, 9,111,117,116,102, 97, 99, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 45,102, 97, 99, 41, 42, 40, 49, 46, 48, 45, -109,105,115,105, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,119,111,114,108,100, 95,109,105,120, 40,118, -101, 99, 51, 32,104,111,114, 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,102,108,111, 97,116, 32,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40, 99,111,108, 46, 97, 44, 32, - 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,109,105,120, 40,104,111, -114, 44, 32, 99,111,108, 46,114,103, 98, 44, 32,102, 97, 99, 41, 44, 32, 99,111,108, 46, 97, 41, 59, 10,125, 10, 10,118,111,105, -100, 32,115,104, 97,100,101, 95, 97,108,112,104, 97, 95,111,112, 97,113,117,101, 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,118,101, 99, 52, - 40, 99,111,108, 46,114,103, 98, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,108, -112,104, 97, 95,111, 98, 99,111,108,111,114, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,118,101, 99, 52, 32,111, 98, 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,118, -101, 99, 52, 40, 99,111,108, 46,114,103, 98, 44, 32, 99,111,108, 46, 97, 42,111, 98, 99,111,108, 46, 97, 41, 59, 10,125, 10, 10, + 99,111,108, 41, 13, 10,123, 13, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 32, 43, 32,109, 97,120, 40, 99,111,108, + 49, 42, 99,111,108, 50, 44, 32,118,101, 99, 52, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 41, + 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95,109, 97,100,100,102, 40,118,101, 99, 52, 32, 99, +111,108, 44, 32,102,108,111, 97,116, 32,102, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 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, 32, 43, 32,102, 42, 99, +111,108, 49, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95,109,117,108, 40,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,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 42, 99,111,108, 50, 59, 13, 10,125, 13, 10, 13, 10, +118,111,105,100, 32,115,104, 97,100,101, 95,109,117,108, 95,118, 97,108,117,101, 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, 32, 61, 32, 99,111,108, 42,102, 97, 99, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97, +100,101, 95,111, 98, 99,111,108,111,114, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,118,101, 99, 52, 32,111, 98, 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, +118,101, 99, 52, 40, 99,111,108, 46,114,103, 98, 42,111, 98, 99,111,108, 46,114,103, 98, 44, 32, 99,111,108, 46, 97, 41, 59, 13, + 10,125, 13, 10, 13, 10,118,111,105,100, 32,114, 97,109,112, 95,114,103, 98,116,111, 98,119, 40,118,101, 99, 51, 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, 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, 32, 43, 32, 99,111,108,111,114, 46,103, 42, 48, 46, 53, 56, 32, 43, + 32, 99,111,108,111,114, 46, 98, 42, 48, 46, 49, 50, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95, +111,110,108,121, 95,115,104, 97,100,111,119, 40,102,108,111, 97,116, 32,105, 44, 32,102,108,111, 97,116, 32,115,104, 97,100,102, + 97, 99, 44, 32,102,108,111, 97,116, 32,101,110,101,114,103,121, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115, +104, 97,100,102, 97, 99, 41, 13, 10,123, 13, 10, 9,111,117,116,115,104, 97,100,102, 97, 99, 32, 61, 32,105, 42,101,110,101,114, +103,121, 42, 40, 49, 46, 48, 32, 45, 32,115,104, 97,100,102, 97, 99, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115, +104, 97,100,101, 95,111,110,108,121, 95,115,104, 97,100,111,119, 95,100,105,102,102,117,115,101, 40,102,108,111, 97,116, 32,115, +104, 97,100,102, 97, 99, 44, 32,118,101, 99, 51, 32,114,103, 98, 44, 32,118,101, 99, 52, 32,100,105,102,102, 44, 32,111,117,116, + 32,118,101, 99, 52, 32,111,117,116,100,105,102,102, 41, 13, 10,123, 13, 10, 9,111,117,116,100,105,102,102, 32, 61, 32,100,105, +102,102, 32, 45, 32,118,101, 99, 52, 40,114,103, 98, 42,115,104, 97,100,102, 97, 99, 44, 32, 48, 46, 48, 41, 59, 13, 10,125, 13, + 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95,111,110,108,121, 95,115,104, 97,100,111,119, 95,115,112,101, 99,117,108, + 97,114, 40,102,108,111, 97,116, 32,115,104, 97,100,102, 97, 99, 44, 32,118,101, 99, 51, 32,115,112,101, 99,114,103, 98, 44, 32, +118,101, 99, 52, 32,115,112,101, 99, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,115,112,101, 99, 41, 13, 10,123, 13, + 10, 9,111,117,116,115,112,101, 99, 32, 61, 32,115,112,101, 99, 32, 45, 32,118,101, 99, 52, 40,115,112,101, 99,114,103, 98, 42, +115,104, 97,100,102, 97, 99, 44, 32, 48, 46, 48, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,116,101,115,116, 95,115, +104, 97,100,111,119, 98,117,102, 40,118,101, 99, 51, 32,114, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 83,104, 97,100, +111,119, 32,115,104, 97,100,111,119,109, 97,112, 44, 32,109, 97,116, 52, 32,115,104, 97,100,111,119,112,101,114,115,109, 97,116, + 44, 32,102,108,111, 97,116, 32,115,104, 97,100,111,119, 98,105, 97,115, 44, 32,102,108,111, 97,116, 32,105,110,112, 44, 32,111, +117,116, 32,102,108,111, 97,116, 32,114,101,115,117,108,116, 41, 13, 10,123, 13, 10, 9,105,102, 40,105,110,112, 32, 60, 61, 32, + 48, 46, 48, 41, 32,123, 13, 10, 9, 9,114,101,115,117,108,116, 32, 61, 32, 48, 46, 48, 59, 13, 10, 9,125, 13, 10, 9,101,108, +115,101, 32,123, 13, 10, 9, 9,118,101, 99, 52, 32, 99,111, 32, 61, 32,115,104, 97,100,111,119,112,101,114,115,109, 97,116, 42, +118,101, 99, 52, 40,114, 99,111, 44, 32, 49, 46, 48, 41, 59, 13, 10, 13, 10, 9, 9, 47, 47,102,108,111, 97,116, 32, 98,105, 97, +115, 32, 61, 32, 40, 49, 46, 53, 32, 45, 32,105,110,112, 42,105,110,112, 41, 42,115,104, 97,100,111,119, 98,105, 97,115, 59, 13, + 10, 9, 9, 99,111, 46,122, 32, 45, 61, 32,115,104, 97,100,111,119, 98,105, 97,115, 42, 99,111, 46,119, 59, 13, 10, 13, 10, 9, + 9,114,101,115,117,108,116, 32, 61, 32,115,104, 97,100,111,119, 50, 68, 80,114,111,106, 40,115,104, 97,100,111,119,109, 97,112, + 44, 32, 99,111, 41, 46,120, 59, 13, 10, 9,125, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95,101,120, +112,111,115,117,114,101, 95, 99,111,114,114,101, 99,116, 40,118,101, 99, 51, 32, 99,111,108, 44, 32,102,108,111, 97,116, 32,108, +105,110,102, 97, 99, 44, 32,102,108,111, 97,116, 32,108,111,103,102, 97, 99, 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,108,105,110,102, 97, 99, 42, 40, 49, 46, 48, 32, + 45, 32,101,120,112, 40, 99,111,108, 42,108,111,103,102, 97, 99, 41, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115, +104, 97,100,101, 95,109,105,115,116, 95,102, 97, 99,116,111,114, 40,118,101, 99, 51, 32, 99,111, 44, 32,102,108,111, 97,116, 32, +109,105,115,116,115,116, 97, 44, 32,102,108,111, 97,116, 32,109,105,115,116,100,105,115,116, 44, 32,102,108,111, 97,116, 32,109, +105,115,116,116,121,112,101, 44, 32,102,108,111, 97,116, 32,109,105,115,105, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111, +117,116,102, 97, 99, 41, 13, 10,123, 13, 10, 9,102,108,111, 97,116, 32,102, 97, 99, 44, 32,122, 99,111,114, 59, 13, 10, 13, 10, + 9,122, 99,111,114, 32, 61, 32, 40,103,108, 95, 80,114,111,106,101, 99,116,105,111,110, 77, 97,116,114,105,120, 91, 51, 93, 91, + 51, 93, 32, 61, 61, 32, 48, 46, 48, 41, 63, 32,108,101,110,103,116,104, 40, 99,111, 41, 58, 32, 45, 99,111, 91, 50, 93, 59, 13, + 10, 9, 13, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40, 40,122, 99,111,114, 45,109,105,115,116,115,116, 97, 41, 47, +109,105,115,116,100,105,115,116, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 13, 10, 9,105,102, 40,109,105,115,116,116,121, +112,101, 32, 61, 61, 32, 48, 46, 48, 41, 32,102, 97, 99, 32, 42, 61, 32,102, 97, 99, 59, 13, 10, 9,101,108,115,101, 32,105,102, + 40,109,105,115,116,116,121,112,101, 32, 61, 61, 32, 49, 46, 48, 41, 59, 13, 10, 9,101,108,115,101, 32,102, 97, 99, 32, 61, 32, +115,113,114,116, 40,102, 97, 99, 41, 59, 13, 10, 13, 10, 9,111,117,116,102, 97, 99, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 49, + 46, 48, 45,102, 97, 99, 41, 42, 40, 49, 46, 48, 45,109,105,115,105, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115, +104, 97,100,101, 95,119,111,114,108,100, 95,109,105,120, 40,118,101, 99, 51, 32,104,111,114, 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,102,108,111, 97,116, 32,102, + 97, 99, 32, 61, 32, 99,108, 97,109,112, 40, 99,111,108, 46, 97, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 13, 10, 9,111, +117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,109,105,120, 40,104,111,114, 44, 32, 99,111,108, 46,114,103, 98, 44, 32,102, + 97, 99, 41, 44, 32, 99,111,108, 46, 97, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,108, +112,104, 97, 95,111,112, 97,113,117,101, 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,118,101, 99, 52, 40, 99,111,108, 46,114,103, 98, + 44, 32, 49, 46, 48, 41, 59, 13, 10,125, 13, 10, 13, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,108,112,104, 97, 95,111, + 98, 99,111,108,111,114, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,118,101, 99, 52, 32,111, 98, 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,118,101, 99, 52, + 40, 99,111,108, 46,114,103, 98, 44, 32, 99,111,108, 46, 97, 42,111, 98, 99,111,108, 46, 97, 41, 59, 13, 10,125, 13, 10, 13, 10, 0}; diff --git a/source/blender/python/SConscript b/source/blender/python/SConscript index dec0de4a6ab..9d7928c4432 100644 --- a/source/blender/python/SConscript +++ b/source/blender/python/SConscript @@ -5,7 +5,7 @@ Import ('env') incs = '. ../editors/include ../makesdna ../makesrna ../blenlib ../blenkernel ../nodes' -incs += ' ../imbuf ../blenloader ../render/extern/include ../windowmanager' +incs += ' ../imbuf ../blenloader ../gpu ../render/extern/include ../windowmanager' incs += ' #intern/guardedalloc #intern/memutil #extern/glew/include' incs += ' #intern/audaspace/intern ' + env['BF_PYTHON_INC'] diff --git a/source/blender/python/intern/CMakeLists.txt b/source/blender/python/intern/CMakeLists.txt index 93a4b3ec269..9ed08591eea 100644 --- a/source/blender/python/intern/CMakeLists.txt +++ b/source/blender/python/intern/CMakeLists.txt @@ -32,6 +32,7 @@ set(INC ../../makesdna ../../makesrna ../../windowmanager + ../../gpu ../../../../intern/guardedalloc ) @@ -40,6 +41,7 @@ set(INC_SYS ) set(SRC + gpu.c bpy.c bpy_app.c bpy_app_handlers.c @@ -58,6 +60,7 @@ set(SRC bpy_util.c stubs.c + gpu.h bpy.h bpy_app.h bpy_app_handlers.h diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c index e5e90380d61..e5bfc1d633f 100644 --- a/source/blender/python/intern/bpy_interface.c +++ b/source/blender/python/intern/bpy_interface.c @@ -40,6 +40,7 @@ #include "RNA_types.h" #include "bpy.h" +#include "gpu.h" #include "bpy_rna.h" #include "bpy_util.h" #include "bpy_traceback.h" @@ -181,6 +182,7 @@ static struct _inittab bpy_internal_modules[]= { #ifdef WITH_AUDASPACE {(char *)"aud", AUD_initPython}, #endif + {(char *)"gpu", GPU_initPython}, {NULL, NULL} }; diff --git a/source/blender/python/intern/gpu.c b/source/blender/python/intern/gpu.c new file mode 100644 index 00000000000..7a798d7d579 --- /dev/null +++ b/source/blender/python/intern/gpu.c @@ -0,0 +1,291 @@ +/* + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2006 Blender Foundation. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): Benoit Bolsee. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/python/intern/gpu.c + * \ingroup pythonintern + */ + +/* python redefines */ +#ifdef _POSIX_C_SOURCE +#undef _POSIX_C_SOURCE +#endif + +#include + +#include "GPU_material.h" + +#include "DNA_scene_types.h" +#include "DNA_image_types.h" +#include "DNA_material_types.h" +#include "DNA_lamp_types.h" +#include "DNA_object_types.h" +#include "DNA_ID.h" +#include "DNA_customdata_types.h" +#include "BLI_listbase.h" +#include "RNA_access.h" + +#include "bpy_rna.h" + +#define PY_MODULE_ADD_CONSTANT(module, name) PyModule_AddIntConstant(module, #name, name) + +PyDoc_STRVAR(M_gpu_doc, + "This module provides access to the GLSL shader."); + +static struct PyModuleDef gpumodule = { + PyModuleDef_HEAD_INIT, + "gpu", /* name of module */ + M_gpu_doc, /* module documentation */ + -1, /* size of per-interpreter state of the module, + or -1 if the module keeps state in global variables. */ + NULL, NULL, NULL, NULL, NULL +}; + +PyMODINIT_FUNC +PyInit_gpu(void) +{ + PyObject* m; + + m = PyModule_Create(&gpumodule); + if(m == NULL) + return NULL; + + // device constants + PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_OBJECT_VIEWMAT); + PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_OBJECT_MAT); + PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_OBJECT_VIEWIMAT); + PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_OBJECT_IMAT); + PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_OBJECT_COLOR); + PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_LAMP_DYNVEC); + PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_LAMP_DYNCO); + PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_LAMP_DYNIMAT); + PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_LAMP_DYNPERSMAT); + PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_LAMP_DYNENERGY); + PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_LAMP_DYNCOL); + PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_SAMPLER_2DBUFFER); + PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_SAMPLER_2DIMAGE); + PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_SAMPLER_2DSHADOW); + + PY_MODULE_ADD_CONSTANT(m, GPU_DATA_1I); + PY_MODULE_ADD_CONSTANT(m, GPU_DATA_1F); + PY_MODULE_ADD_CONSTANT(m, GPU_DATA_2F); + PY_MODULE_ADD_CONSTANT(m, GPU_DATA_3F); + PY_MODULE_ADD_CONSTANT(m, GPU_DATA_4F); + PY_MODULE_ADD_CONSTANT(m, GPU_DATA_9F); + PY_MODULE_ADD_CONSTANT(m, GPU_DATA_16F); + PY_MODULE_ADD_CONSTANT(m, GPU_DATA_4UB); + + PY_MODULE_ADD_CONSTANT(m, CD_MTFACE); + PY_MODULE_ADD_CONSTANT(m, CD_ORCO); + PY_MODULE_ADD_CONSTANT(m, CD_TANGENT); + PY_MODULE_ADD_CONSTANT(m, CD_MCOL); + return m; +} + +#define PY_DICT_ADD_STRING(d,s,f) \ + val = PyUnicode_FromString(s->f); \ + PyDict_SetItemString(d, #f, val); \ + Py_DECREF(val) + +#define PY_DICT_ADD_LONG(d,s,f) \ + val = PyLong_FromLong(s->f); \ + PyDict_SetItemString(d, #f, val); \ + Py_DECREF(val) + +#define PY_DICT_ADD_ID(d,s,f) \ + RNA_id_pointer_create((struct ID*)s->f, &tptr); \ + val = pyrna_struct_CreatePyObject(&tptr); \ + PyDict_SetItemString(d, #f, val); \ + Py_DECREF(val) + +#define PY_OBJ_ADD_ID(d,s,f) \ + val = PyUnicode_FromString(&s->f->id.name[2]); \ + PyObject_SetAttrString(d, #f, val); \ + Py_DECREF(val) + +#define PY_OBJ_ADD_LONG(d,s,f) \ + val = PyLong_FromLong(s->f); \ + PyObject_SetAttrString(d, #f, val); \ + Py_DECREF(val) + +#define PY_OBJ_ADD_STRING(d,s,f) \ + val = PyUnicode_FromString(s->f); \ + PyObject_SetAttrString(d, #f, val); \ + Py_DECREF(val) + +static PyObject* GPU_export_shader(PyObject* self, PyObject *args, PyObject *kwds) +{ + PyObject* pyscene; + PyObject* pymat; + PyObject* as_pointer; + PyObject* pointer; + PyObject* noargs; + PyObject* result; + PyObject* dict; + PyObject* val; + PyObject* seq; + + int i; + Scene *scene; + PointerRNA tptr; + Material *material; + GPUShaderExport *shader; + GPUInputUniform *uniform; + GPUInputAttribute *attribute; + + static const char *kwlist[] = {"scene", "material", NULL}; + + if(!PyArg_ParseTupleAndKeywords(args, kwds, "OO:export_shader", (char**)(kwlist), &pyscene, &pymat)) + return NULL; + + if (!strcmp(Py_TYPE(pyscene)->tp_name, "Scene") && + (as_pointer = PyObject_GetAttrString(pyscene, "as_pointer")) != NULL && + PyCallable_Check(as_pointer)) { + // must be a scene object + noargs = PyTuple_New(0); + pointer = PyObject_CallObject(as_pointer, noargs); + Py_DECREF(noargs); + if (!pointer) { + PyErr_SetString(PyExc_SystemError, "scene.as_pointer() failed"); + return NULL; + } + scene = (Scene*)PyLong_AsVoidPtr(pointer); + Py_DECREF(pointer); + if (!scene) { + PyErr_SetString(PyExc_SystemError, "scene.as_pointer() failed"); + return NULL; + } + } else { + PyErr_SetString(PyExc_TypeError, "gpu.export_shader() first argument should be of Scene type"); + return NULL; + } + + if (!strcmp(Py_TYPE(pymat)->tp_name, "Material") && + (as_pointer = PyObject_GetAttrString(pymat, "as_pointer")) != NULL && + PyCallable_Check(as_pointer)) { + // must be a material object + noargs = PyTuple_New(0); + pointer = PyObject_CallObject(as_pointer, noargs); + Py_DECREF(noargs); + if (!pointer) { + PyErr_SetString(PyExc_SystemError, "scene.as_pointer() failed"); + return NULL; + } + material = (Material*)PyLong_AsVoidPtr(pointer); + Py_DECREF(pointer); + if (!material) { + PyErr_SetString(PyExc_SystemError, "scene.as_pointer() failed"); + return NULL; + } + } else { + PyErr_SetString(PyExc_TypeError, "gpu.export_shader() second argument should be of Material type"); + return NULL; + } + // we can call our internal function at last: + shader = GPU_shader_export(scene, material); + if (!shader) { + PyErr_SetString(PyExc_RuntimeError, "cannot export shader"); + return NULL; + } + // build a dictionary + result = PyDict_New(); + if (shader->fragment) { + PY_DICT_ADD_STRING(result,shader,fragment); + } + if (shader->vertex) { + PY_DICT_ADD_STRING(result,shader,vertex); + } + seq = PyList_New(BLI_countlist(&shader->uniforms)); + for (i=0, uniform=shader->uniforms.first; uniform; uniform=uniform->next, i++) { + dict = PyDict_New(); + PY_DICT_ADD_STRING(dict,uniform,varname); + PY_DICT_ADD_LONG(dict,uniform,datatype); + PY_DICT_ADD_LONG(dict,uniform,type); + if (uniform->lamp) { + PY_DICT_ADD_ID(dict,uniform,lamp); + } + if (uniform->image) { + PY_DICT_ADD_ID(dict,uniform,image); + } + if (uniform->type == GPU_DYNAMIC_SAMPLER_2DBUFFER || + uniform->type == GPU_DYNAMIC_SAMPLER_2DIMAGE || + uniform->type == GPU_DYNAMIC_SAMPLER_2DSHADOW) { + PY_DICT_ADD_LONG(dict,uniform,texnumber); + } + if (uniform->texpixels) { + val = PyByteArray_FromStringAndSize(uniform->texpixels, uniform->texsize); + PyDict_SetItemString(dict, "texpixels", val); + Py_DECREF(val); + PY_DICT_ADD_LONG(dict,uniform,texsize); + } + PyList_SET_ITEM(seq, i, dict); + } + PyDict_SetItemString(result, "uniforms", seq); + Py_DECREF(seq); + + seq = PyList_New(BLI_countlist(&shader->attributes)); + for (i=0, attribute=shader->attributes.first; attribute; attribute=attribute->next, i++) { + dict = PyDict_New(); + PY_DICT_ADD_STRING(dict,attribute,varname); + PY_DICT_ADD_LONG(dict,attribute,datatype); + PY_DICT_ADD_LONG(dict,attribute,type); + PY_DICT_ADD_LONG(dict,attribute,number); + if (attribute->name) { + if (attribute->name[0] != 0) { + PY_DICT_ADD_STRING(dict,attribute,name); + } else { + val = PyLong_FromLong(0); + PyDict_SetItemString(dict, "name", val); + Py_DECREF(val); + } + } + PyList_SET_ITEM(seq, i, dict); + } + PyDict_SetItemString(result, "attributes", seq); + Py_DECREF(seq); + + GPU_free_shader_export(shader); + + return result; +} + +static PyMethodDef meth_export_shader[] = {{ "export_shader", (PyCFunction)GPU_export_shader, METH_VARARGS | METH_KEYWORDS, + "export_shader(scene,material)\n\n" + "Returns the GLSL shader that produces the visual effect of material in scene.\n\n" + ":return: Dictionary defining the shader, uniforms and attributes.\n" + ":rtype: Dict"}}; + +PyObject* GPU_initPython() +{ + PyObject* module = PyInit_gpu(); + PyModule_AddObject(module, "export_shader", (PyObject *)PyCFunction_New(meth_export_shader, NULL)); + PyDict_SetItemString(PyImport_GetModuleDict(), "gpu", module); + + return module; +} + diff --git a/source/blender/python/intern/gpu.h b/source/blender/python/intern/gpu.h new file mode 100644 index 00000000000..d604c7c6201 --- /dev/null +++ b/source/blender/python/intern/gpu.h @@ -0,0 +1,41 @@ +/* + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This shader is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This shader is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this shader; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2005 Blender Foundation. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): Benoit Bolsee. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/python/intern/gpu.h + * \ingroup pythonintern + */ + +/** + * Initalizes the gpu Python module. + */ +PyObject* GPU_initPython(void); + From bef9509565e18504ca1a82b4972214a52aedad08 Mon Sep 17 00:00:00 2001 From: Nathan Letwory Date: Fri, 9 Sep 2011 12:23:45 +0000 Subject: [PATCH 158/182] Apply small patch by Shane Ambler: * inline of math funcs for Apple PPC * eltopo big/little endian ifdef --- source/blender/blenlib/BLI_math_inline.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/blender/blenlib/BLI_math_inline.h b/source/blender/blenlib/BLI_math_inline.h index 122b2679d5b..4309e6122df 100644 --- a/source/blender/blenlib/BLI_math_inline.h +++ b/source/blender/blenlib/BLI_math_inline.h @@ -45,8 +45,13 @@ extern "C" { #define MALWAYS_INLINE MINLINE #else #define MINLINE static inline +#if (defined(__APPLE__) && defined(__ppc__)) +/* static inline __attribute__ here breaks osx ppc gcc42 build */ +#define MALWAYS_INLINE static __attribute__((always_inline)) +#else #define MALWAYS_INLINE static inline __attribute__((always_inline)) #endif +#endif #else #define MINLINE #define MALWAYS_INLINE From ca170a8ed6745da4f9de5d2f5a1544571a2df783 Mon Sep 17 00:00:00 2001 From: Benoit Bolsee Date: Fri, 9 Sep 2011 12:37:56 +0000 Subject: [PATCH 159/182] forgot to resolve one conflict in previous merge --- source/blender/makesrna/intern/rna_modifier.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index 370c9b8bd0c..f6c96c2594c 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -2490,7 +2490,6 @@ static void rna_def_modifier_screw(BlenderRNA *brna) RNA_def_property_update(prop, 0, "rna_Modifier_update");*/ } -<<<<<<< .working static void rna_def_modifier_navmesh(BlenderRNA *brna) { StructRNA *srna; @@ -2502,7 +2501,6 @@ static void rna_def_modifier_navmesh(BlenderRNA *brna) RNA_def_struct_ui_icon(srna, ICON_MOD_DECIM); } -======= static void rna_def_modifier_weightvg_mask(BlenderRNA *brna, StructRNA *srna) { static EnumPropertyItem weightvg_mask_tex_map_items[] = { @@ -2797,7 +2795,6 @@ static void rna_def_modifier_weightvgproximity(BlenderRNA *brna) rna_def_modifier_weightvg_mask(brna, srna); } ->>>>>>> .merge-right.r40061 void RNA_def_modifier(BlenderRNA *brna) { StructRNA *srna; @@ -2895,13 +2892,10 @@ void RNA_def_modifier(BlenderRNA *brna) rna_def_modifier_smoke(brna); rna_def_modifier_solidify(brna); rna_def_modifier_screw(brna); -<<<<<<< .working rna_def_modifier_navmesh(brna); -======= rna_def_modifier_weightvgedit(brna); rna_def_modifier_weightvgmix(brna); rna_def_modifier_weightvgproximity(brna); ->>>>>>> .merge-right.r40061 } #endif From 67ea3180d902e762b6373fe2cbe2434aceb0f597 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Fri, 9 Sep 2011 12:46:07 +0000 Subject: [PATCH 160/182] Patch [#23443] Change outliner filter into search Shane Ambler (sambler) for this 12-month vintage! From description: One thing with the outliner filter box is it only filters items that are currently visible. To find what you want you need to manually expand a few levels so that what you want to find is visible. This small patch expands items when filtering is done - effectively turning it into a search. Currently this does not alter the datablocks view as expanding all entries takes waaaay tooooo long. I prevent the expansion of RNA entries for userprefs which prevents infinite recursion but the datablocks list is just too big for this approach. I think it would need a custom outliner_build_tree for a full search. --- .../editors/space_outliner/outliner_draw.c | 46 ++++++++++++------- .../editors/space_outliner/outliner_edit.c | 8 ++-- .../editors/space_outliner/outliner_intern.h | 21 +++++++++ .../editors/space_outliner/outliner_select.c | 2 +- .../editors/space_outliner/outliner_tools.c | 10 ++-- .../editors/space_outliner/outliner_tree.c | 38 ++++++++++++--- source/blender/makesdna/DNA_outliner_types.h | 2 + source/blender/makesdna/DNA_space_types.h | 1 + 8 files changed, 95 insertions(+), 33 deletions(-) diff --git a/source/blender/editors/space_outliner/outliner_draw.c b/source/blender/editors/space_outliner/outliner_draw.c index 95a315272b9..e77bb979d47 100644 --- a/source/blender/editors/space_outliner/outliner_draw.c +++ b/source/blender/editors/space_outliner/outliner_draw.c @@ -97,7 +97,7 @@ static void outliner_height(SpaceOops *soops, ListBase *lb, int *h) TreeElement *te= lb->first; while(te) { TreeStoreElem *tselem= TREESTORE(te); - if((tselem->flag & TSE_CLOSED)==0) + if(TSELEM_OPEN(tselem,soops)) outliner_height(soops, &te->subtree, h); (*h) += UI_UNIT_Y; te= te->next; @@ -112,7 +112,7 @@ static void outliner_width(SpaceOops *soops, ListBase *lb, int *w) // TreeStoreElem *tselem= TREESTORE(te); // XXX fixme... te->xend is not set yet - if(tselem->flag & TSE_CLOSED) { + if(!TSELEM_OPEN(tselem,soops)) { if (te->xend > *w) *w = te->xend; } @@ -135,7 +135,7 @@ static void outliner_rna_width(SpaceOops *soops, ListBase *lb, int *w, int start if(startx+100 > *w) *w = startx+100; - if((tselem->flag & TSE_CLOSED)==0) + if(TSELEM_OPEN(tselem,soops)) outliner_rna_width(soops, &te->subtree, w, startx+UI_UNIT_X); te= te->next; } @@ -519,7 +519,7 @@ static void outliner_draw_restrictbuts(uiBlock *block, Scene *scene, ARegion *ar } } - if((tselem->flag & TSE_CLOSED)==0) outliner_draw_restrictbuts(block, scene, ar, soops, &te->subtree); + if(TSELEM_OPEN(tselem,soops)) outliner_draw_restrictbuts(block, scene, ar, soops, &te->subtree); } } @@ -560,7 +560,7 @@ static void outliner_draw_rnabuts(uiBlock *block, Scene *scene, ARegion *ar, Spa ptr= &te->rnaptr; prop= te->directdata; - if(!(RNA_property_type(prop) == PROP_POINTER && (tselem->flag & TSE_CLOSED)==0)) + if(!(RNA_property_type(prop) == PROP_POINTER && (TSELEM_OPEN(tselem,soops))) ) uiDefAutoButR(block, ptr, prop, -1, "", ICON_NONE, sizex, (int)te->ys, OL_RNA_COL_SIZEX, UI_UNIT_Y-1); } else if(tselem->type == TSE_RNA_ARRAY_ELEM) { @@ -571,7 +571,7 @@ static void outliner_draw_rnabuts(uiBlock *block, Scene *scene, ARegion *ar, Spa } } - if((tselem->flag & TSE_CLOSED)==0) outliner_draw_rnabuts(block, scene, ar, soops, sizex, &te->subtree); + if(TSELEM_OPEN(tselem,soops)) outliner_draw_rnabuts(block, scene, ar, soops, sizex, &te->subtree); } } @@ -828,7 +828,7 @@ static void outliner_draw_keymapbuts(uiBlock *block, ARegion *ar, SpaceOops *soo } } - if((tselem->flag & TSE_CLOSED)==0) outliner_draw_keymapbuts(block, ar, soops, &te->subtree); + if(TSELEM_OPEN(tselem,soops)) outliner_draw_keymapbuts(block, ar, soops, &te->subtree); } } @@ -871,7 +871,7 @@ static void outliner_buttons(const bContext *C, uiBlock *block, ARegion *ar, Spa } } - if((tselem->flag & TSE_CLOSED)==0) outliner_buttons(C, block, ar, soops, &te->subtree); + if(TSELEM_OPEN(tselem,soops)) outliner_buttons(C, block, ar, soops, &te->subtree); } } @@ -1237,6 +1237,18 @@ static void outliner_draw_tree_element(bContext *C, uiBlock *block, Scene *scene glEnable(GL_BLEND); + /* start by highlighting search matches + * we don't expand items when searching in the datablocks but we + * still want to highlight any filter matches. + */ + if ( (SEARCHING_OUTLINER(soops) || (soops->outlinevis==SO_DATABLOCKS && soops->search_string[0]!=0)) && + (tselem->flag & TSE_SEARCHMATCH)) + { + /* TODO - add search highlight colour to theme? */ + glColor4f(0.2f, 0.5f, 0.2f, 0.3f); + glRecti(startx, *starty+1, ar->v2d.cur.xmax, *starty+UI_UNIT_Y-1); + } + /* colors for active/selected data */ if(tselem->type==0) { if(te->idcode==ID_SCE) { @@ -1317,10 +1329,10 @@ static void outliner_draw_tree_element(bContext *C, uiBlock *block, Scene *scene icon_x = startx+5*ufac; // icons a bit higher - if(tselem->flag & TSE_CLOSED) - UI_icon_draw((float)icon_x, (float)*starty+2*ufac, ICON_DISCLOSURE_TRI_RIGHT); - else + if(TSELEM_OPEN(tselem,soops)) UI_icon_draw((float)icon_x, (float)*starty+2*ufac, ICON_DISCLOSURE_TRI_DOWN); + else + UI_icon_draw((float)icon_x, (float)*starty+2*ufac, ICON_DISCLOSURE_TRI_RIGHT); } offsx+= UI_UNIT_X; @@ -1356,7 +1368,7 @@ static void outliner_draw_tree_element(bContext *C, uiBlock *block, Scene *scene offsx+= (int)(UI_UNIT_X + UI_GetStringWidth(te->name)); /* closed item, we draw the icons, not when it's a scene, or master-server list though */ - if(tselem->flag & TSE_CLOSED) { + if(!TSELEM_OPEN(tselem,soops)) { if(te->subtree.first) { if(tselem->type==0 && te->idcode==ID_SCE); else if(tselem->type!=TSE_R_LAYER) { /* this tree element always has same amount of branches, so dont draw */ @@ -1382,7 +1394,7 @@ static void outliner_draw_tree_element(bContext *C, uiBlock *block, Scene *scene te->ys= (float)*starty; te->xend= startx+offsx; - if((tselem->flag & TSE_CLOSED)==0) { + if(TSELEM_OPEN(tselem,soops)) { *starty-= UI_UNIT_Y; for(ten= te->subtree.first; ten; ten= ten->next) @@ -1415,7 +1427,7 @@ static void outliner_draw_hierarchy(SpaceOops *soops, ListBase *lb, int startx, *starty-= UI_UNIT_Y; - if((tselem->flag & TSE_CLOSED)==0) + if(TSELEM_OPEN(tselem,soops)) outliner_draw_hierarchy(soops, &te->subtree, startx+UI_UNIT_X, starty); } @@ -1439,12 +1451,12 @@ static void outliner_draw_struct_marks(ARegion *ar, SpaceOops *soops, ListBase * tselem= TREESTORE(te); /* selection status */ - if((tselem->flag & TSE_CLOSED)==0) + if(TSELEM_OPEN(tselem,soops)) if(tselem->type == TSE_RNA_STRUCT) glRecti(0, *starty+1, (int)ar->v2d.cur.xmax+V2D_SCROLL_WIDTH, *starty+UI_UNIT_Y-1); *starty-= UI_UNIT_Y; - if((tselem->flag & TSE_CLOSED)==0) { + if(TSELEM_OPEN(tselem,soops)) { outliner_draw_struct_marks(ar, soops, &te->subtree, starty); if(tselem->type == TSE_RNA_STRUCT) fdrawline(0, (float)*starty+UI_UNIT_Y, ar->v2d.cur.xmax+V2D_SCROLL_WIDTH, (float)*starty+UI_UNIT_Y); @@ -1465,7 +1477,7 @@ static void outliner_draw_selection(ARegion *ar, SpaceOops *soops, ListBase *lb, glRecti(0, *starty+1, (int)ar->v2d.cur.xmax, *starty+UI_UNIT_Y-1); } *starty-= UI_UNIT_Y; - if((tselem->flag & TSE_CLOSED)==0) outliner_draw_selection(ar, soops, &te->subtree, starty); + if(TSELEM_OPEN(tselem,soops)) outliner_draw_selection(ar, soops, &te->subtree, starty); } } diff --git a/source/blender/editors/space_outliner/outliner_edit.c b/source/blender/editors/space_outliner/outliner_edit.c index 2b451a48748..05eace0d4ef 100644 --- a/source/blender/editors/space_outliner/outliner_edit.c +++ b/source/blender/editors/space_outliner/outliner_edit.c @@ -687,7 +687,7 @@ static void outliner_set_coordinates_element(SpaceOops *soops, TreeElement *te, te->ys= (float)(*starty); *starty-= UI_UNIT_Y; - if((tselem->flag & TSE_CLOSED)==0) { + if(TSELEM_OPEN(tselem,soops)) { TreeElement *ten; for(ten= te->subtree.first; ten; ten= ten->next) { outliner_set_coordinates_element(soops, ten, startx+UI_UNIT_X, starty); @@ -910,7 +910,7 @@ static void tree_element_show_hierarchy(Scene *scene, SpaceOops *soops, ListBase } else tselem->flag |= TSE_CLOSED; - if(tselem->flag & TSE_CLOSED); else tree_element_show_hierarchy(scene, soops, &te->subtree); + if(TSELEM_OPEN(tselem,soops)) tree_element_show_hierarchy(scene, soops, &te->subtree); } } @@ -1175,7 +1175,7 @@ static void do_outliner_drivers_editop(SpaceOops *soops, ListBase *tree, ReportL } /* go over sub-tree */ - if ((tselem->flag & TSE_CLOSED)==0) + if (TSELEM_OPEN(tselem,soops)) do_outliner_drivers_editop(soops, &te->subtree, reports, mode); } } @@ -1343,7 +1343,7 @@ static void do_outliner_keyingset_editop(SpaceOops *soops, KeyingSet *ks, ListBa } /* go over sub-tree */ - if ((tselem->flag & TSE_CLOSED)==0) + if (TSELEM_OPEN(tselem,soops)) do_outliner_keyingset_editop(soops, ks, &te->subtree, mode); } } diff --git a/source/blender/editors/space_outliner/outliner_intern.h b/source/blender/editors/space_outliner/outliner_intern.h index 61507d1ffe5..215ab508ab6 100644 --- a/source/blender/editors/space_outliner/outliner_intern.h +++ b/source/blender/editors/space_outliner/outliner_intern.h @@ -126,6 +126,27 @@ typedef struct TreeElement { #define OL_RNA_COL_SPACEX (UI_UNIT_X*2.5f) +/* Outliner Searching -- + + Are we looking for something in the outliner? + If so finding matches in child items makes it more useful + + - We want to flag parents to act as being open to filter child matches + - and also flag matches so we can highlight them + - Flags are stored in TreeStoreElem->flag + - Flag options defined in DNA_outliner_types.h + - SO_SEARCH_RECURSIVE defined in DNA_space_types.h + + - NOT in datablocks view - searching all datablocks takes way too long + to be useful + - not searching into RNA items helps but isn't the complete solution + */ + +#define SEARCHING_OUTLINER(sov) (sov->search_flags & SO_SEARCH_RECURSIVE) + +/* is the currrent element open? if so we also show children */ +#define TSELEM_OPEN(telm,sv) ( (telm->flag & TSE_CLOSED)==0 || (SEARCHING_OUTLINER(sv) && (telm->flag & TSE_CHILDSEARCH)) ) + /* outliner_tree.c ----------------------------------------------- */ void outliner_free_tree(ListBase *lb); diff --git a/source/blender/editors/space_outliner/outliner_select.c b/source/blender/editors/space_outliner/outliner_select.c index 2c0a8c34747..a88625aad0d 100644 --- a/source/blender/editors/space_outliner/outliner_select.c +++ b/source/blender/editors/space_outliner/outliner_select.c @@ -134,7 +134,7 @@ static int outliner_select(SpaceOops *soops, ListBase *lb, int *index, short *se change |= 1; } } - else if ((tselem->flag & TSE_CLOSED)==0) { + else if (TSELEM_OPEN(tselem,soops)) { /* Only try selecting sub-elements if we haven't hit the right element yet * * Hack warning: diff --git a/source/blender/editors/space_outliner/outliner_tools.c b/source/blender/editors/space_outliner/outliner_tools.c index b3170f9cd1e..b2fdd34aab2 100644 --- a/source/blender/editors/space_outliner/outliner_tools.c +++ b/source/blender/editors/space_outliner/outliner_tools.c @@ -145,7 +145,7 @@ static void set_operation_types(SpaceOops *soops, ListBase *lb, } } } - if((tselem->flag & TSE_CLOSED)==0) { + if(TSELEM_OPEN(tselem,soops)) { set_operation_types(soops, &te->subtree, scenelevel, objectlevel, idlevel, datalevel); } @@ -250,7 +250,7 @@ static void outliner_do_libdata_operation(bContext *C, Scene *scene, SpaceOops * operation_cb(C, scene, te, tsep, tselem); } } - if((tselem->flag & TSE_CLOSED)==0) { + if(TSELEM_OPEN(tselem,soops)) { outliner_do_libdata_operation(C, scene, soops, &te->subtree, operation_cb); } } @@ -397,7 +397,7 @@ void outliner_do_object_operation(bContext *C, Scene *scene_act, SpaceOops *soop operation_cb(C, scene_owner ? scene_owner : scene_act, te, NULL, tselem); } } - if((tselem->flag & TSE_CLOSED)==0) { + if(TSELEM_OPEN(tselem,soops)) { outliner_do_object_operation(C, scene_act, soops, &te->subtree, operation_cb); } } @@ -504,7 +504,7 @@ static void outliner_do_data_operation(SpaceOops *soops, int type, int event, Li operation_cb(event, te, tselem); } } - if((tselem->flag & TSE_CLOSED)==0) { + if(TSELEM_OPEN(tselem,soops)) { outliner_do_data_operation(soops, type, event, &te->subtree, operation_cb); } } @@ -857,7 +857,7 @@ static void outliner_do_id_set_operation(SpaceOops *soops, int type, ListBase *l operation_cb(te, tselem, tsep, newid); } } - if ((tselem->flag & TSE_CLOSED)==0) { + if (TSELEM_OPEN(tselem,soops)) { outliner_do_id_set_operation(soops, type, &te->subtree, newid, operation_cb); } } diff --git a/source/blender/editors/space_outliner/outliner_tree.c b/source/blender/editors/space_outliner/outliner_tree.c index 8904dcc360f..7e9eabc08db 100644 --- a/source/blender/editors/space_outliner/outliner_tree.c +++ b/source/blender/editors/space_outliner/outliner_tree.c @@ -827,6 +827,10 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i check_persistant(soops, te, id, type, index); tselem= TREESTORE(te); + /* if we are searching for something expand to see child elements */ + if(SEARCHING_OUTLINER(soops)) + tselem->flag |= TSE_CHILDSEARCH; + te->parent= parent; te->index= index; // for data arays if(ELEM3(type, TSE_SEQUENCE, TSE_SEQ_STRIP, TSE_SEQUENCE_DUP)); @@ -981,6 +985,9 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i else te->name= (char*)RNA_struct_ui_name(ptr->type); + /* If searching don't expand RNA entries */ + if(SEARCHING_OUTLINER(soops) && BLI_strcasecmp("RNA",te->name)==0) tselem->flag &= ~TSE_CHILDSEARCH; + iterprop= RNA_struct_iterator_property(ptr->type); tot= RNA_property_collection_length(ptr, iterprop); @@ -989,7 +996,7 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i if(!tselem->used) tselem->flag &= ~TSE_CLOSED; - if(!(tselem->flag & TSE_CLOSED)) { + if(TSELEM_OPEN(tselem,soops)) { for(a=0; asubtree, (void*)ptr, te, TSE_RNA_PROPERTY, a); } @@ -1010,11 +1017,14 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i te->directdata= prop; te->rnaptr= *ptr; + /* If searching don't expand RNA entries */ + if(SEARCHING_OUTLINER(soops) && BLI_strcasecmp("RNA",te->name)==0) tselem->flag &= ~TSE_CHILDSEARCH; + if(proptype == PROP_POINTER) { pptr= RNA_property_pointer_get(ptr, prop); if(pptr.data) { - if(!(tselem->flag & TSE_CLOSED)) + if(TSELEM_OPEN(tselem,soops)) outliner_add_element(soops, &te->subtree, (void*)&pptr, te, TSE_RNA_STRUCT, -1); else te->flag |= TE_LAZY_CLOSED; @@ -1023,7 +1033,7 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i else if(proptype == PROP_COLLECTION) { tot= RNA_property_collection_length(ptr, prop); - if(!(tselem->flag & TSE_CLOSED)) { + if(TSELEM_OPEN(tselem,soops)) { for(a=0; asubtree, (void*)&pptr, te, TSE_RNA_STRUCT, a); @@ -1035,7 +1045,7 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i else if(ELEM3(proptype, PROP_BOOLEAN, PROP_INT, PROP_FLOAT)) { tot= RNA_property_array_length(ptr, prop); - if(!(tselem->flag & TSE_CLOSED)) { + if(TSELEM_OPEN(tselem,soops)) { for(a=0; asubtree, (void*)ptr, te, TSE_RNA_ARRAY_ELEM, a); } @@ -1068,7 +1078,7 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i te->directdata= idv; te->name= km->idname; - if(!(tselem->flag & TSE_CLOSED)) { + if(TSELEM_OPEN(tselem,soops)) { a= 0; for (kmi= km->items.first; kmi; kmi= kmi->next, a++) { @@ -1368,7 +1378,10 @@ static int outliner_filter_tree(SpaceOops *soops, ListBase *lb) */ tselem= TREESTORE(te); - if ((tselem->flag & TSE_CLOSED) || outliner_filter_tree(soops, &te->subtree)==0) { + /* flag as not a found item */ + tselem->flag &= ~TSE_SEARCHMATCH; + + if ((!TSELEM_OPEN(tselem,soops)) || outliner_filter_tree(soops, &te->subtree)==0) { outliner_free_tree(&te->subtree); BLI_remlink(lb, te); @@ -1377,6 +1390,11 @@ static int outliner_filter_tree(SpaceOops *soops, ListBase *lb) } } else { + tselem= TREESTORE(te); + + /* flag as a found item - we can then highlight it */ + tselem->flag |= TSE_SEARCHMATCH; + /* filter subtree too */ outliner_filter_tree(soops, &te->subtree); } @@ -1399,6 +1417,14 @@ void outliner_build_tree(Main *mainvar, Scene *scene, SpaceOops *soops) TreeStoreElem *tselem; int show_opened= (soops->treestore==NULL); /* on first view, we open scenes */ + /* Are we looking for something - we want to tag parents to filter child matches + - NOT in datablocks view - searching all datablocks takes way too long to be useful + - this variable is only set once per tree build */ + if(soops->search_string[0]!=0 && soops->outlinevis!=SO_DATABLOCKS) + soops->search_flags |= SO_SEARCH_RECURSIVE; + else + soops->search_flags &= ~SO_SEARCH_RECURSIVE; + if(soops->tree.first && (soops->storeflag & SO_TREESTORE_REDRAW)) return; diff --git a/source/blender/makesdna/DNA_outliner_types.h b/source/blender/makesdna/DNA_outliner_types.h index c44f10efde8..af19aa490ae 100644 --- a/source/blender/makesdna/DNA_outliner_types.h +++ b/source/blender/makesdna/DNA_outliner_types.h @@ -51,6 +51,8 @@ typedef struct TreeStore { #define TSE_CLOSED 1 #define TSE_SELECTED 2 #define TSE_TEXTBUT 4 +#define TSE_CHILDSEARCH 8 +#define TSE_SEARCHMATCH 16 /* TreeStoreElem types in BIF_outliner.h */ diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h index 66b10bcbf21..1627d4d2acb 100644 --- a/source/blender/makesdna/DNA_space_types.h +++ b/source/blender/makesdna/DNA_space_types.h @@ -861,6 +861,7 @@ enum { /* outliner search flags (SpaceOops->search_flags) */ #define SO_FIND_CASE_SENSITIVE (1<<0) #define SO_FIND_COMPLETE (1<<1) +#define SO_SEARCH_RECURSIVE (1<<2) /* headerbuttons: 450-499 */ From 8af4b90f0731da8b8b2f2ed5148e2e1ac9f57685 Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Fri, 9 Sep 2011 13:02:15 +0000 Subject: [PATCH 161/182] Hotkey tweaks: Start/End frame jumping back to Shift-Left/Right I'd moved them to Ctrl-Shift-Left/Right having thought that they were for some reason now conflicting with some other hotkeys. Apparently not. --- source/blender/editors/screen/screen_ops.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index b199f54cde1..62fdfc140df 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -3485,8 +3485,8 @@ void ED_keymap_screen(wmKeyConfig *keyconf) RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", UPARROWKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0)->ptr, "end", 1); RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", DOWNARROWKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0)->ptr, "end", 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", RIGHTARROWKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0)->ptr, "end", 1); - RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", LEFTARROWKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0)->ptr, "end", 0); + RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", RIGHTARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "end", 1); + RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", LEFTARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "end", 0); WM_keymap_add_item(keymap, "SCREEN_OT_keyframe_jump", UPARROWKEY, KM_PRESS, 0, 0); RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_keyframe_jump", DOWNARROWKEY, KM_PRESS, 0, 0)->ptr, "next", 0); From 40481af180475d23cf09aeb031e8ff936463fcfa Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 9 Sep 2011 13:10:18 +0000 Subject: [PATCH 162/182] replace magic numbers with defines to make the interface source more readable. only functional change is the uiWidgetBase struct stored up to 64 verts, changed this to 36 since thats the most that is used atm, added assert if this ever changes. --- .../editors/interface/interface_widgets.c | 163 +++++++++--------- 1 file changed, 85 insertions(+), 78 deletions(-) diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c index 5da875356ea..8a634dd344d 100644 --- a/source/blender/editors/interface/interface_widgets.c +++ b/source/blender/editors/interface/interface_widgets.c @@ -86,12 +86,25 @@ typedef struct uiWidgetTrias { } uiWidgetTrias; +/* max as used by round_box__edges */ +#define WIDGET_CURVE_RESOLU 9 +#define WIDGET_SIZE_MAX (WIDGET_CURVE_RESOLU*4) + +enum { + WIDGET_TOP_LEFT= 1, + WIDGET_TOP_RIGHT= 2, + WIDGET_BOTTOM_RIGHT= 4, + WIDGET_BOTTOM_LEFT= 8, + /* just for convenience */ + WIDGET_ALL_CORNERS= (WIDGET_TOP_LEFT | WIDGET_TOP_RIGHT | WIDGET_BOTTOM_RIGHT | WIDGET_BOTTOM_LEFT) +}; + typedef struct uiWidgetBase { int totvert, halfwayvert; - float outer_v[64][2]; - float inner_v[64][2]; - float inner_uv[64][2]; + float outer_v[WIDGET_SIZE_MAX][2]; + float inner_v[WIDGET_SIZE_MAX][2]; + float inner_uv[WIDGET_SIZE_MAX][2]; short inner, outline, emboss; /* set on/off */ short shadedir; @@ -123,7 +136,7 @@ typedef struct uiWidgetType { /* *********************** draw data ************************** */ -static float cornervec[9][2]= {{0.0, 0.0}, {0.195, 0.02}, {0.383, 0.067}, {0.55, 0.169}, +static float cornervec[WIDGET_CURVE_RESOLU][2]= {{0.0, 0.0}, {0.195, 0.02}, {0.383, 0.067}, {0.55, 0.169}, {0.707, 0.293}, {0.831, 0.45}, {0.924, 0.617}, {0.98, 0.805}, {1.0, 1.0}}; static float jit[8][2]= {{0.468813 , -0.481430}, {-0.155755 , -0.352820}, @@ -216,7 +229,7 @@ static void widget_init(uiWidgetBase *wtb) /* return tot */ static int round_box_shadow_edges(float (*vert)[2], rcti *rect, float rad, int roundboxalign, float step) { - float vec[9][2]; + float vec[WIDGET_CURVE_RESOLU][2]; float minx, miny, maxx, maxy; int a, tot= 0; @@ -231,59 +244,59 @@ static int round_box_shadow_edges(float (*vert)[2], rcti *rect, float rad, int r maxy= rect->ymax+step; /* mult */ - for(a=0; a<9; a++) { + for(a=0; a < WIDGET_CURVE_RESOLU; a++) { vec[a][0]= rad*cornervec[a][0]; vec[a][1]= rad*cornervec[a][1]; } /* start with left-top, anti clockwise */ - if(roundboxalign & 1) { - for(a=0; a<9; a++, tot++) { + if(roundboxalign & WIDGET_TOP_LEFT) { + for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) { vert[tot][0]= minx+rad-vec[a][0]; vert[tot][1]= maxy-vec[a][1]; } } else { - for(a=0; a<9; a++, tot++) { + for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) { vert[tot][0]= minx; vert[tot][1]= maxy; } } - if(roundboxalign & 8) { - for(a=0; a<9; a++, tot++) { + if(roundboxalign & WIDGET_BOTTOM_LEFT) { + for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) { vert[tot][0]= minx+vec[a][1]; vert[tot][1]= miny+rad-vec[a][0]; } } else { - for(a=0; a<9; a++, tot++) { + for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) { vert[tot][0]= minx; vert[tot][1]= miny; } } - if(roundboxalign & 4) { - for(a=0; a<9; a++, tot++) { + if(roundboxalign & WIDGET_BOTTOM_RIGHT) { + for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) { vert[tot][0]= maxx-rad+vec[a][0]; vert[tot][1]= miny+vec[a][1]; } } else { - for(a=0; a<9; a++, tot++) { + for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) { vert[tot][0]= maxx; vert[tot][1]= miny; } } - if(roundboxalign & 2) { - for(a=0; a<9; a++, tot++) { + if(roundboxalign & WIDGET_TOP_RIGHT) { + for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) { vert[tot][0]= maxx-vec[a][1]; vert[tot][1]= maxy-rad+vec[a][0]; } } else { - for(a=0; a<9; a++, tot++) { + for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) { vert[tot][0]= maxx; vert[tot][1]= maxy; } @@ -294,7 +307,7 @@ static int round_box_shadow_edges(float (*vert)[2], rcti *rect, float rad, int r /* this call has 1 extra arg to allow mask outline */ static void round_box__edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, float rad, float radi) { - float vec[9][2], veci[9][2]; + float vec[WIDGET_CURVE_RESOLU][2], veci[WIDGET_CURVE_RESOLU][2]; float minx= rect->xmin, miny= rect->ymin, maxx= rect->xmax, maxy= rect->ymax; float minxi= minx + 1.0f; /* boundbox inner */ float maxxi= maxx - 1.0f; @@ -303,8 +316,10 @@ static void round_box__edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, fl float facxi= (maxxi!=minxi) ? 1.0f/(maxxi-minxi) : 0.0f; /* for uv, can divide by zero */ float facyi= (maxyi!=minyi) ? 1.0f/(maxyi-minyi) : 0.0f; int a, tot= 0, minsize; - const int hnum= ((roundboxalign & (1|2))==(1|2) || (roundboxalign & (4|8))==(4|8)) ? 1 : 2; - const int vnum= ((roundboxalign & (1|8))==(1|8) || (roundboxalign & (2|4))==(2|4)) ? 1 : 2; + const int hnum= ((roundboxalign & (WIDGET_TOP_LEFT|WIDGET_TOP_RIGHT))==(WIDGET_TOP_LEFT|WIDGET_TOP_RIGHT) || + (roundboxalign & (WIDGET_BOTTOM_RIGHT|WIDGET_BOTTOM_LEFT))==(WIDGET_BOTTOM_RIGHT|WIDGET_BOTTOM_LEFT)) ? 1 : 2; + const int vnum= ((roundboxalign & (WIDGET_TOP_LEFT|WIDGET_BOTTOM_LEFT))==(WIDGET_TOP_LEFT|WIDGET_BOTTOM_LEFT) || + (roundboxalign & (WIDGET_TOP_RIGHT|WIDGET_BOTTOM_RIGHT))==(WIDGET_TOP_RIGHT|WIDGET_BOTTOM_RIGHT)) ? 1 : 2; minsize= MIN2((rect->xmax-rect->xmin)*hnum, (rect->ymax-rect->ymin)*vnum); @@ -315,7 +330,7 @@ static void round_box__edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, fl radi= 0.5f*minsize - 1.0f; /* mult */ - for(a=0; a<9; a++) { + for(a=0; a < WIDGET_CURVE_RESOLU; a++) { veci[a][0]= radi*cornervec[a][0]; veci[a][1]= radi*cornervec[a][1]; vec[a][0]= rad*cornervec[a][0]; @@ -323,9 +338,9 @@ static void round_box__edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, fl } /* corner left-bottom */ - if(roundboxalign & 8) { + if(roundboxalign & WIDGET_BOTTOM_LEFT) { - for(a=0; a<9; a++, tot++) { + for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) { wt->inner_v[tot][0]= minxi+veci[a][1]; wt->inner_v[tot][1]= minyi+radi-veci[a][0]; @@ -350,9 +365,9 @@ static void round_box__edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, fl } /* corner right-bottom */ - if(roundboxalign & 4) { + if(roundboxalign & WIDGET_BOTTOM_RIGHT) { - for(a=0; a<9; a++, tot++) { + for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) { wt->inner_v[tot][0]= maxxi-radi+veci[a][0]; wt->inner_v[tot][1]= minyi+veci[a][1]; @@ -379,9 +394,9 @@ static void round_box__edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, fl wt->halfwayvert= tot; /* corner right-top */ - if(roundboxalign & 2) { + if(roundboxalign & WIDGET_TOP_RIGHT) { - for(a=0; a<9; a++, tot++) { + for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) { wt->inner_v[tot][0]= maxxi-veci[a][1]; wt->inner_v[tot][1]= maxyi-radi+veci[a][0]; @@ -406,9 +421,9 @@ static void round_box__edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, fl } /* corner left-top */ - if(roundboxalign & 1) { + if(roundboxalign & WIDGET_TOP_LEFT) { - for(a=0; a<9; a++, tot++) { + for(a=0; a < WIDGET_CURVE_RESOLU; a++, tot++) { wt->inner_v[tot][0]= minxi+radi-veci[a][0]; wt->inner_v[tot][1]= maxyi-veci[a][1]; @@ -433,7 +448,9 @@ static void round_box__edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, fl tot++; } - + + BLI_assert(tot <= WIDGET_SIZE_MAX); + wt->totvert= tot; } @@ -1620,14 +1637,14 @@ static void widget_softshadow(rcti *rect, int roundboxalign, float radin, float rect1.ymax -= 2.0f*radout; /* inner part */ - tot= round_box_shadow_edges(wtb.inner_v, &rect1, radin, roundboxalign & 12, 0.0f); + tot= round_box_shadow_edges(wtb.inner_v, &rect1, radin, roundboxalign & (WIDGET_BOTTOM_RIGHT | WIDGET_BOTTOM_LEFT), 0.0f); /* inverse linear shadow alpha */ alpha= 0.15; alphastep= 0.67; for(step= 1; step<=radout; step++, alpha*=alphastep) { - round_box_shadow_edges(wtb.outer_v, &rect1, radin, 15, (float)step); + round_box_shadow_edges(wtb.outer_v, &rect1, radin, WIDGET_ALL_CORNERS, (float)step); glColor4f(0.0f, 0.0f, 0.0f, alpha); @@ -1644,7 +1661,7 @@ static void widget_softshadow(rcti *rect, int roundboxalign, float radin, float static void widget_menu_back(uiWidgetColors *wcol, rcti *rect, int flag, int direction) { uiWidgetBase wtb; - int roundboxalign= 15; + int roundboxalign= WIDGET_ALL_CORNERS; widget_init(&wtb); @@ -1654,11 +1671,11 @@ static void widget_menu_back(uiWidgetColors *wcol, rcti *rect, int flag, int dir //rect->ymax += 4.0; } else if (direction == UI_DOWN) { - roundboxalign= 12; + roundboxalign= (WIDGET_BOTTOM_RIGHT | WIDGET_BOTTOM_LEFT); rect->ymin -= 4.0; } else if (direction == UI_TOP) { - roundboxalign= 3; + roundboxalign= WIDGET_TOP_LEFT | WIDGET_TOP_RIGHT; rect->ymax += 4.0; } @@ -2008,7 +2025,7 @@ static void ui_draw_but_HSV_v(uiBut *but, rcti *rect) widget_init(&wtb); /* fully rounded */ - round_box_edges(&wtb, 15, rect, rad); + round_box_edges(&wtb, WIDGET_ALL_CORNERS, rect, rad); /* setup temp colors */ wcol_tmp.outline[0]= wcol_tmp.outline[1]= wcol_tmp.outline[2]= 0; @@ -2148,7 +2165,7 @@ void uiWidgetScrollDraw(uiWidgetColors *wcol, rcti *rect, rcti *slider, int stat if(horizontal) SWAP(short, wcol->shadetop, wcol->shadedown); - round_box_edges(&wtb, 15, rect, rad); + round_box_edges(&wtb, WIDGET_ALL_CORNERS, rect, rad); widgetbase_draw(&wtb, wcol); /* slider */ @@ -2176,7 +2193,7 @@ void uiWidgetScrollDraw(uiWidgetColors *wcol, rcti *rect, rcti *slider, int stat if (state & UI_SCROLL_NO_OUTLINE) SWAP(short, outline, wtb.outline); - round_box_edges(&wtb, 15, slider, rad); + round_box_edges(&wtb, WIDGET_ALL_CORNERS, slider, rad); if(state & UI_SCROLL_ARROWS) { if(wcol->item[0] > 48) wcol->item[0]-= 48; @@ -2343,7 +2360,7 @@ static void widget_numslider(uiBut *but, uiWidgetColors *wcol, rcti *rect, int s /* left part of slider, always rounded */ rect1.xmax= rect1.xmin + ceil(offs+1.0f); - round_box_edges(&wtb1, roundboxalign & ~6, &rect1, offs); + round_box_edges(&wtb1, roundboxalign & ~(WIDGET_TOP_RIGHT | WIDGET_BOTTOM_RIGHT), &rect1, offs); wtb1.outline= 0; widgetbase_draw(&wtb1, wcol); @@ -2354,7 +2371,7 @@ static void widget_numslider(uiBut *but, uiWidgetColors *wcol, rcti *rect, int s offs*= (rect1.xmax + offs - rect->xmax)/offs; else offs= 0.0f; - round_box_edges(&wtb1, roundboxalign & ~9, &rect1, offs); + round_box_edges(&wtb1, roundboxalign & ~(WIDGET_TOP_LEFT | WIDGET_BOTTOM_LEFT), &rect1, offs); widgetbase_draw(&wtb1, wcol); VECCOPY(wcol->outline, outline); @@ -2436,7 +2453,7 @@ static void widget_icon_has_anim(uiBut *UNUSED(but), uiWidgetColors *wcol, rcti wtb.outline= 0; /* rounded */ - round_box_edges(&wtb, 15, rect, 10.0f); + round_box_edges(&wtb, WIDGET_ALL_CORNERS, rect, 10.0f); widgetbase_draw(&wtb, wcol); } } @@ -2499,7 +2516,7 @@ static void widget_pulldownbut(uiWidgetColors *wcol, rcti *rect, int state, int widget_init(&wtb); /* half rounded */ - round_box_edges(&wtb, 15, rect, rad); + round_box_edges(&wtb, WIDGET_ALL_CORNERS, rect, rad); widgetbase_draw(&wtb, wcol); } @@ -2526,7 +2543,7 @@ static void widget_list_itembut(uiWidgetColors *wcol, rcti *rect, int UNUSED(sta /* rounded, but no outline */ wtb.outline= 0; - round_box_edges(&wtb, 15, rect, 4.0f); + round_box_edges(&wtb, WIDGET_ALL_CORNERS, rect, 4.0f); widgetbase_draw(&wtb, wcol); } @@ -2550,7 +2567,7 @@ static void widget_optionbut(uiWidgetColors *wcol, rcti *rect, int state, int UN recttemp.ymax-= delta; /* half rounded */ - round_box_edges(&wtb, 15, &recttemp, 4.0f); + round_box_edges(&wtb, WIDGET_ALL_CORNERS, &recttemp, 4.0f); /* decoration */ if(state & UI_SELECT) { @@ -2650,12 +2667,12 @@ static void widget_draw_extra_mask(const bContext *C, uiBut *but, uiWidgetType * UI_GetThemeColor3ubv(TH_BACK, col); glColor3ubv(col); - round_box__edges(&wtb, 15, rect, 0.0f, 4.0); + round_box__edges(&wtb, WIDGET_ALL_CORNERS, rect, 0.0f, 4.0); widgetbase_outline(&wtb); } /* outline */ - round_box_edges(&wtb, 15, rect, 5.0f); + round_box_edges(&wtb, WIDGET_ALL_CORNERS, rect, 5.0f); wtb.outline= 1; wtb.inner= 0; widgetbase_draw(&wtb, &wt->wcol); @@ -2824,7 +2841,7 @@ static uiWidgetType *widget_type(uiWidgetTypeEnum type) } -static int widget_roundbox_set(uiBut *but, rcti *rect) +static int WIDGET_set(uiBut *but, rcti *rect) { /* alignment */ if(but->flag & UI_BUT_ALIGN) { @@ -2836,37 +2853,27 @@ static int widget_roundbox_set(uiBut *but, rcti *rect) switch(but->flag & UI_BUT_ALIGN) { case UI_BUT_ALIGN_TOP: - return (12); - break; + return WIDGET_BOTTOM_LEFT | WIDGET_BOTTOM_RIGHT; case UI_BUT_ALIGN_DOWN: - return (3); - break; + return WIDGET_TOP_LEFT | WIDGET_TOP_RIGHT; case UI_BUT_ALIGN_LEFT: - return (6); - break; + return WIDGET_TOP_RIGHT | WIDGET_BOTTOM_RIGHT; case UI_BUT_ALIGN_RIGHT: - return (9); - break; - - case UI_BUT_ALIGN_DOWN|UI_BUT_ALIGN_RIGHT: - return (1); - break; - case UI_BUT_ALIGN_DOWN|UI_BUT_ALIGN_LEFT: - return (2); - break; - case UI_BUT_ALIGN_TOP|UI_BUT_ALIGN_RIGHT: - return (8); - break; - case UI_BUT_ALIGN_TOP|UI_BUT_ALIGN_LEFT: - return (4); - break; - + return WIDGET_TOP_LEFT | WIDGET_BOTTOM_LEFT; + case UI_BUT_ALIGN_DOWN | UI_BUT_ALIGN_RIGHT: + return WIDGET_TOP_LEFT; + case UI_BUT_ALIGN_DOWN | UI_BUT_ALIGN_LEFT: + return WIDGET_TOP_RIGHT; + case UI_BUT_ALIGN_TOP | UI_BUT_ALIGN_RIGHT: + return WIDGET_BOTTOM_LEFT; + case UI_BUT_ALIGN_TOP | UI_BUT_ALIGN_LEFT: + return WIDGET_BOTTOM_RIGHT; default: - return (0); - break; + return 0; } - } - return 15; + } + + return WIDGET_ALL_CORNERS; } /* conversion from old to new buttons, so still messy */ @@ -3057,7 +3064,7 @@ void ui_draw_but(const bContext *C, ARegion *ar, uiStyle *style, uiBut *but, rct rcti disablerect= *rect; /* rect gets clipped smaller for text */ int roundboxalign, state; - roundboxalign= widget_roundbox_set(but, rect); + roundboxalign= WIDGET_set(but, rect); state= but->flag; if(but->editstr) state |= UI_TEXTINPUT; @@ -3104,14 +3111,14 @@ void ui_draw_search_back(uiStyle *UNUSED(style), uiBlock *block, rcti *rect) uiWidgetType *wt= widget_type(UI_WTYPE_BOX); glEnable(GL_BLEND); - widget_softshadow(rect, 15, 5.0f, 8.0f); + widget_softshadow(rect, WIDGET_ALL_CORNERS, 5.0f, 8.0f); glDisable(GL_BLEND); wt->state(wt, 0); if(block) - wt->draw(&wt->wcol, rect, block->flag, 15); + wt->draw(&wt->wcol, rect, block->flag, WIDGET_ALL_CORNERS); else - wt->draw(&wt->wcol, rect, 0, 15); + wt->draw(&wt->wcol, rect, 0, WIDGET_ALL_CORNERS); } From a3ac15db3dd572740a1fb1429670bcd4fa2b14a2 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 9 Sep 2011 13:37:17 +0000 Subject: [PATCH 163/182] error (case insensitive search replace) --- source/blender/editors/interface/interface_widgets.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c index 8a634dd344d..b204a514c39 100644 --- a/source/blender/editors/interface/interface_widgets.c +++ b/source/blender/editors/interface/interface_widgets.c @@ -205,7 +205,7 @@ void ui_draw_anti_tria(float x1, float y1, float x2, float y2, float x3, float y glVertex2f(x2, y2); glVertex2f(x3, y3); glEnd(); - + glTranslatef(-1.0f * jit[j][0], -1.0f * jit[j][1], 0.0f); } @@ -2841,7 +2841,7 @@ static uiWidgetType *widget_type(uiWidgetTypeEnum type) } -static int WIDGET_set(uiBut *but, rcti *rect) +static int widget_roundbox_set(uiBut *but, rcti *rect) { /* alignment */ if(but->flag & UI_BUT_ALIGN) { @@ -3064,7 +3064,7 @@ void ui_draw_but(const bContext *C, ARegion *ar, uiStyle *style, uiBut *but, rct rcti disablerect= *rect; /* rect gets clipped smaller for text */ int roundboxalign, state; - roundboxalign= WIDGET_set(but, rect); + roundboxalign= widget_roundbox_set(but, rect); state= but->flag; if(but->editstr) state |= UI_TEXTINPUT; From 8c1b4f8e05592822c2efe2083dfc7a1d9de3f4da Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Fri, 9 Sep 2011 13:42:22 +0000 Subject: [PATCH 164/182] Fix #28590: Sculpt Overlay Texture in Viewport Glitched and Wrong icon for Overlay Option? Use clamp to border for fixed textures. --- release/scripts/startup/bl_ui/space_view3d_toolbar.py | 4 ++-- source/blender/editors/sculpt_paint/paint_stroke.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py index aa26cb43eed..4b2ee57df68 100644 --- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py +++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py @@ -768,9 +768,9 @@ class VIEW3D_PT_tools_brush_texture(PaintPanel, Panel): col = row.column() if brush.use_texture_overlay: - col.prop(brush, "use_texture_overlay", toggle=True, text="", icon='MUTE_IPO_OFF') + col.prop(brush, "use_texture_overlay", toggle=True, text="", icon='RESTRICT_VIEW_OFF') else: - col.prop(brush, "use_texture_overlay", toggle=True, text="", icon='MUTE_IPO_ON') + col.prop(brush, "use_texture_overlay", toggle=True, text="", icon='RESTRICT_VIEW_ON') col.active = tex_slot.map_mode in {'FIXED', 'TILED'} diff --git a/source/blender/editors/sculpt_paint/paint_stroke.c b/source/blender/editors/sculpt_paint/paint_stroke.c index 09873566d4a..9500c7f663c 100644 --- a/source/blender/editors/sculpt_paint/paint_stroke.c +++ b/source/blender/editors/sculpt_paint/paint_stroke.c @@ -322,8 +322,8 @@ static int load_tex(Sculpt *sd, Brush* br, ViewContext* vc) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); if (br->mtex.brush_map_mode == MTEX_MAP_MODE_FIXED) { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); } return 1; From 5fc9baa962edc7657ec3c69e340add8ed7c567a7 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 9 Sep 2011 13:46:47 +0000 Subject: [PATCH 165/182] warning fixes --- source/blender/python/intern/gpu.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/source/blender/python/intern/gpu.c b/source/blender/python/intern/gpu.c index 7a798d7d579..8d705e44bb8 100644 --- a/source/blender/python/intern/gpu.c +++ b/source/blender/python/intern/gpu.c @@ -47,7 +47,10 @@ #include "DNA_object_types.h" #include "DNA_ID.h" #include "DNA_customdata_types.h" + #include "BLI_listbase.h" +#include "BLI_utildefines.h" + #include "RNA_access.h" #include "bpy_rna.h" @@ -138,7 +141,7 @@ PyInit_gpu(void) PyObject_SetAttrString(d, #f, val); \ Py_DECREF(val) -static PyObject* GPU_export_shader(PyObject* self, PyObject *args, PyObject *kwds) +static PyObject* GPU_export_shader(PyObject* UNUSED(self), PyObject *args, PyObject *kwds) { PyObject* pyscene; PyObject* pymat; @@ -238,7 +241,7 @@ static PyObject* GPU_export_shader(PyObject* self, PyObject *args, PyObject *kwd PY_DICT_ADD_LONG(dict,uniform,texnumber); } if (uniform->texpixels) { - val = PyByteArray_FromStringAndSize(uniform->texpixels, uniform->texsize); + val = PyByteArray_FromStringAndSize((const char *)uniform->texpixels, uniform->texsize); PyDict_SetItemString(dict, "texpixels", val); Py_DECREF(val); PY_DICT_ADD_LONG(dict,uniform,texsize); @@ -280,7 +283,7 @@ static PyMethodDef meth_export_shader[] = {{ "export_shader", (PyCFunction)GPU_e ":return: Dictionary defining the shader, uniforms and attributes.\n" ":rtype: Dict"}}; -PyObject* GPU_initPython() +PyObject* GPU_initPython(void) { PyObject* module = PyInit_gpu(); PyModule_AddObject(module, "export_shader", (PyObject *)PyCFunction_New(meth_export_shader, NULL)); From 657fa2494ffd82edf815bd972159f093e31d22e9 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Fri, 9 Sep 2011 14:04:33 +0000 Subject: [PATCH 166/182] [#28595] Select similar edges by face angles ignores z component of normal angles Patch provided by Andrew Wiggin (ender79). Thanks! --- source/blender/editors/mesh/editmesh_mods.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/editors/mesh/editmesh_mods.c b/source/blender/editors/mesh/editmesh_mods.c index 612d1b18426..57b31b1c84f 100644 --- a/source/blender/editors/mesh/editmesh_mods.c +++ b/source/blender/editors/mesh/editmesh_mods.c @@ -959,7 +959,7 @@ static int similar_edge_select__internal(EditMesh *em, int mode, float thresh) else if (eed->f2==0) /* first access, assign the face */ eed->tmp.f= efa; else if (eed->f2==1) /* second, we assign the angle*/ - eed->tmp.fp= RAD2DEGF(angle_v2v2(eed->tmp.f->n, efa->n))/180; + eed->tmp.fp= RAD2DEGF(angle_v3v3(eed->tmp.f->n, efa->n))/180; eed->f2++; /* f2==0 no face assigned. f2==1 one face found. f2==2 angle calculated.*/ } j++; @@ -1086,7 +1086,7 @@ static int similar_edge_select_exec(bContext *C, wmOperator *op) Mesh *me= obedit->data; EditMesh *em= BKE_mesh_get_editmesh(me); - int selcount = similar_edge_select__internal(em, RNA_int_get(op->ptr, "type"), RNA_float_get(op->ptr, "threshold")); + int selcount = similar_edge_select__internal(em, RNA_enum_get(op->ptr, "type"), RNA_float_get(op->ptr, "threshold")); if (selcount) { /* here was an edge-mode only select flush case, has to be generalized */ From 4b1a8d62e1b8f575bec87d12afc4d367468c1002 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 9 Sep 2011 14:44:36 +0000 Subject: [PATCH 167/182] use opengl vertex arrays for the base widgets, their rounded corners, arrows and emboss. (note, this is from OpenGL 1.1 from 1992, nothing fancy), gives moderate speedup on my system when showing many buttons (10% - 15%). --- .../editors/interface/interface_widgets.c | 223 +++++++++++------- 1 file changed, 136 insertions(+), 87 deletions(-) diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c index b204a514c39..c06e26eecaa 100644 --- a/source/blender/editors/interface/interface_widgets.c +++ b/source/blender/editors/interface/interface_widgets.c @@ -188,6 +188,7 @@ GLubyte checker_stipple_sml[32*32/8] = void ui_draw_anti_tria(float x1, float y1, float x2, float y2, float x3, float y3) { + float tri_arr[3][2]= {{x1, y1}, {x2, y2}, {x3, y3}}; float color[4]; int j; @@ -195,20 +196,18 @@ void ui_draw_anti_tria(float x1, float y1, float x2, float y2, float x3, float y glGetFloatv(GL_CURRENT_COLOR, color); color[3] *= 0.125f; glColor4fv(color); - + + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(2, GL_FLOAT, 0, tri_arr); + /* for each AA step */ for(j=0; j<8; j++) { glTranslatef(1.0f * jit[j][0], 1.0f * jit[j][1], 0.0f); - - glBegin(GL_POLYGON); - glVertex2f(x1, y1); - glVertex2f(x2, y2); - glVertex2f(x3, y3); - glEnd(); - + glDrawArrays(GL_TRIANGLES, 0, 3); glTranslatef(-1.0f * jit[j][0], -1.0f * jit[j][1], 0.0f); } + glDisableClientState(GL_VERTEX_ARRAY); glDisable(GL_BLEND); } @@ -533,16 +532,13 @@ static void widget_scroll_circle(uiWidgetTrias *tria, rcti *rect, float triasize static void widget_trias_draw(uiWidgetTrias *tria) { - int a; - - glBegin(GL_TRIANGLES); - for(a=0; atot; a++) { - glVertex2fv(tria->vec[ tria->index[a][0] ]); - glVertex2fv(tria->vec[ tria->index[a][1] ]); - glVertex2fv(tria->vec[ tria->index[a][2] ]); - } - glEnd(); - + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_INDEX_ARRAY); + glIndexPointer(GL_INT, 0, tria->index); + glVertexPointer(2, GL_FLOAT, 0, tria->vec); + glDrawArrays(GL_TRIANGLES, 0, tria->tot*3); + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_INDEX_ARRAY); } static void widget_menu_trias(uiWidgetTrias *tria, rcti *rect) @@ -618,19 +614,48 @@ static void round_box_shade_col4(const char col1[4], const char col2[4], const f glColor4ubv(col); } -static void widgetbase_outline(uiWidgetBase *wtb) +static void round_box_shade_col4_r(unsigned char col_r[4], const char col1[4], const char col2[4], const float fac) +{ + const int faci= FTOCHAR(fac); + const int facm= 255-faci; + + col_r[0]= (faci*col1[0] + facm*col2[0])>>8; + col_r[1]= (faci*col1[1] + facm*col2[1])>>8; + col_r[2]= (faci*col1[2] + facm*col2[2])>>8; + col_r[3]= (faci*col1[3] + facm*col2[3])>>8; +} + +static void widget_verts_to_quad_strip(uiWidgetBase *wtb, const int totvert, float quad_strip[WIDGET_SIZE_MAX*2+2][2]) { int a; - - /* outline */ - glBegin(GL_QUAD_STRIP); - for(a=0; atotvert; a++) { - glVertex2fv(wtb->outer_v[a]); - glVertex2fv(wtb->inner_v[a]); + for(a=0; aouter_v[a]); + copy_v2_v2(quad_strip[a*2+1], wtb->inner_v[a]); } - glVertex2fv(wtb->outer_v[0]); - glVertex2fv(wtb->inner_v[0]); - glEnd(); + copy_v2_v2(quad_strip[a*2], wtb->outer_v[0]); + copy_v2_v2(quad_strip[a*2+1], wtb->inner_v[0]); +} + +static void widget_verts_to_quad_strip_open(uiWidgetBase *wtb, const int totvert, float quad_strip[WIDGET_SIZE_MAX*2][2]) +{ + int a; + for(a=0; aouter_v[a][0]; + quad_strip[a*2][1]= wtb->outer_v[a][1]; + quad_strip[a*2+1][0]= wtb->outer_v[a][0]; + quad_strip[a*2+1][1]= wtb->outer_v[a][1] - 1.0f; + } +} + +static void widgetbase_outline(uiWidgetBase *wtb) +{ + float quad_strip[WIDGET_SIZE_MAX*2+2][2]; /* + 2 because the last pair is wrapped */ + widget_verts_to_quad_strip(wtb, wtb->totvert, quad_strip); + + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(2, GL_FLOAT, 0, quad_strip); + glDrawArrays(GL_QUAD_STRIP, 0, wtb->totvert*2 + 2); + glDisableClientState(GL_VERTEX_ARRAY); } static void widgetbase_draw(uiWidgetBase *wtb, uiWidgetColors *wcol) @@ -643,100 +668,124 @@ static void widgetbase_draw(uiWidgetBase *wtb, uiWidgetColors *wcol) if(wtb->inner) { if(wcol->shaded==0) { if (wcol->alpha_check) { + float inner_v_half[WIDGET_SIZE_MAX][2]; float x_mid= 0.0f; /* used for dumb clamping of values */ /* dark checkers */ glColor4ub(UI_TRANSP_DARK, UI_TRANSP_DARK, UI_TRANSP_DARK, 255); - glBegin(GL_POLYGON); - for(a=0; atotvert; a++) { - glVertex2fv(wtb->inner_v[a]); - } - glEnd(); + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(2, GL_FLOAT, 0, wtb->inner_v); + glDrawArrays(GL_POLYGON, 0, wtb->totvert); + glDisableClientState(GL_VERTEX_ARRAY); /* light checkers */ glEnable(GL_POLYGON_STIPPLE); glColor4ub(UI_TRANSP_LIGHT, UI_TRANSP_LIGHT, UI_TRANSP_LIGHT, 255); glPolygonStipple(checker_stipple_sml); - glBegin(GL_POLYGON); - for(a=0; atotvert; a++) { - glVertex2fv(wtb->inner_v[a]); - } - glEnd(); + + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(2, GL_FLOAT, 0, wtb->inner_v); + glDrawArrays(GL_POLYGON, 0, wtb->totvert); + glDisableClientState(GL_VERTEX_ARRAY); + glDisable(GL_POLYGON_STIPPLE); /* alpha fill */ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor4ubv((unsigned char*)wcol->inner); - glBegin(GL_POLYGON); + glEnableClientState(GL_VERTEX_ARRAY); + for(a=0; atotvert; a++) { - glVertex2fv(wtb->inner_v[a]); x_mid += wtb->inner_v[a][0]; } x_mid /= wtb->totvert; - glEnd(); + + glVertexPointer(2, GL_FLOAT, 0, wtb->inner_v); + glDrawArrays(GL_POLYGON, 0, wtb->totvert); + glDisableClientState(GL_VERTEX_ARRAY); /* 1/2 solid color */ glColor4ub(wcol->inner[0], wcol->inner[1], wcol->inner[2], 255); - glBegin(GL_POLYGON); - for(a=0; atotvert; a++) - glVertex2f(MIN2(wtb->inner_v[a][0], x_mid), wtb->inner_v[a][1]); - glEnd(); + + for(a=0; atotvert; a++) { + inner_v_half[a][0]= MIN2(wtb->inner_v[a][0], x_mid); + inner_v_half[a][1]= wtb->inner_v[a][1]; + } + + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(2, GL_FLOAT, 0, inner_v_half); + glDrawArrays(GL_POLYGON, 0, wtb->totvert); + glDisableClientState(GL_VERTEX_ARRAY); } else { /* simple fill */ glColor4ubv((unsigned char*)wcol->inner); - glBegin(GL_POLYGON); - for(a=0; atotvert; a++) - glVertex2fv(wtb->inner_v[a]); - glEnd(); + + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(2, GL_FLOAT, 0, wtb->inner_v); + glDrawArrays(GL_POLYGON, 0, wtb->totvert); + glDisableClientState(GL_VERTEX_ARRAY); } } else { char col1[4], col2[4]; + unsigned char col_array[WIDGET_SIZE_MAX * 4]; + unsigned char *col_pt= col_array; shadecolors4(col1, col2, wcol->inner, wcol->shadetop, wcol->shadedown); glShadeModel(GL_SMOOTH); - glBegin(GL_POLYGON); - for(a=0; atotvert; a++) { - round_box_shade_col4(col1, col2, wtb->inner_uv[a][wtb->shadedir]); - glVertex2fv(wtb->inner_v[a]); + for(a=0; atotvert; a++, col_pt += 4) { + round_box_shade_col4_r(col_pt, col1, col2, wtb->inner_uv[a][wtb->shadedir]); } - glEnd(); + + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_COLOR_ARRAY); + glVertexPointer(2, GL_FLOAT, 0, wtb->inner_v); + glColorPointer(4, GL_UNSIGNED_BYTE, 0, col_array); + glDrawArrays(GL_POLYGON, 0, wtb->totvert); + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_COLOR_ARRAY); + glShadeModel(GL_FLAT); } } /* for each AA step */ if(wtb->outline) { + float quad_strip[WIDGET_SIZE_MAX*2+2][2]; /* + 2 because the last pair is wrapped */ + float quad_strip_emboss[WIDGET_SIZE_MAX*2][2]; /* only for emboss */ + + widget_verts_to_quad_strip(wtb, wtb->totvert, quad_strip); + + if(wtb->emboss) { + widget_verts_to_quad_strip_open(wtb, wtb->halfwayvert, quad_strip_emboss); + } + + glEnableClientState(GL_VERTEX_ARRAY); + for(j=0; j<8; j++) { glTranslatef(1.0f * jit[j][0], 1.0f * jit[j][1], 0.0f); /* outline */ glColor4ub(wcol->outline[0], wcol->outline[1], wcol->outline[2], 32); - glBegin(GL_QUAD_STRIP); - for(a=0; atotvert; a++) { - glVertex2fv(wtb->outer_v[a]); - glVertex2fv(wtb->inner_v[a]); - } - glVertex2fv(wtb->outer_v[0]); - glVertex2fv(wtb->inner_v[0]); - glEnd(); + + glVertexPointer(2, GL_FLOAT, 0, quad_strip); + glDrawArrays(GL_QUAD_STRIP, 0, wtb->totvert*2 + 2); /* emboss bottom shadow */ if(wtb->emboss) { glColor4f(1.0f, 1.0f, 1.0f, 0.02f); - glBegin(GL_QUAD_STRIP); - for(a=0; ahalfwayvert; a++) { - glVertex2fv(wtb->outer_v[a]); - glVertex2f(wtb->outer_v[a][0], wtb->outer_v[a][1]-1.0f); - } - glEnd(); + + glVertexPointer(2, GL_FLOAT, 0, quad_strip_emboss); + glDrawArrays(GL_QUAD_STRIP, 0, wtb->halfwayvert*2); } glTranslatef(-1.0f * jit[j][0], -1.0f * jit[j][1], 0.0f); } + + glDisableClientState(GL_VERTEX_ARRAY); } /* decoration */ @@ -1628,7 +1677,8 @@ static void widget_softshadow(rcti *rect, int roundboxalign, float radin, float uiWidgetBase wtb; rcti rect1= *rect; float alpha, alphastep; - int step, tot, a; + int step, totvert; + float quad_strip[WIDGET_SIZE_MAX*2][2]; /* prevent tooltips to not show round shadow */ if( 2.0f*radout > 0.2f*(rect1.ymax-rect1.ymin) ) @@ -1637,25 +1687,26 @@ static void widget_softshadow(rcti *rect, int roundboxalign, float radin, float rect1.ymax -= 2.0f*radout; /* inner part */ - tot= round_box_shadow_edges(wtb.inner_v, &rect1, radin, roundboxalign & (WIDGET_BOTTOM_RIGHT | WIDGET_BOTTOM_LEFT), 0.0f); - + totvert= round_box_shadow_edges(wtb.inner_v, &rect1, radin, roundboxalign & (WIDGET_BOTTOM_RIGHT | WIDGET_BOTTOM_LEFT), 0.0f); + /* inverse linear shadow alpha */ alpha= 0.15; alphastep= 0.67; + glEnableClientState(GL_VERTEX_ARRAY); + for(step= 1; step<=radout; step++, alpha*=alphastep) { round_box_shadow_edges(wtb.outer_v, &rect1, radin, WIDGET_ALL_CORNERS, (float)step); glColor4f(0.0f, 0.0f, 0.0f, alpha); - - glBegin(GL_QUAD_STRIP); - for(a=0; a Date: Fri, 9 Sep 2011 22:02:12 +0000 Subject: [PATCH 168/182] SVN maintenance. --- source/blender/editors/include/ED_navmesh_conversion.h | 2 +- source/blender/editors/util/navmesh_conversion.cpp | 2 +- source/blender/modifiers/intern/MOD_navmesh.cpp | 2 +- source/gameengine/Ketsji/KX_NavMeshObject.cpp | 2 +- source/gameengine/Ketsji/KX_ObstacleSimulation.cpp | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/source/blender/editors/include/ED_navmesh_conversion.h b/source/blender/editors/include/ED_navmesh_conversion.h index 28922142f5c..71b60cc4e4a 100644 --- a/source/blender/editors/include/ED_navmesh_conversion.h +++ b/source/blender/editors/include/ED_navmesh_conversion.h @@ -93,4 +93,4 @@ inline bool left(const float* a, const float* b, const float* c) #ifdef __cplusplus } #endif -#endif //NAVMESH_CONVERSION_H \ No newline at end of file +#endif //NAVMESH_CONVERSION_H diff --git a/source/blender/editors/util/navmesh_conversion.cpp b/source/blender/editors/util/navmesh_conversion.cpp index 873660baa13..2068d17435c 100644 --- a/source/blender/editors/util/navmesh_conversion.cpp +++ b/source/blender/editors/util/navmesh_conversion.cpp @@ -441,4 +441,4 @@ int polyFindVertex(const unsigned short* p, const int vertsPerPoly, unsigned sho } } return res; -} \ No newline at end of file +} diff --git a/source/blender/modifiers/intern/MOD_navmesh.cpp b/source/blender/modifiers/intern/MOD_navmesh.cpp index 888da7ba985..7a1c2bb6059 100644 --- a/source/blender/modifiers/intern/MOD_navmesh.cpp +++ b/source/blender/modifiers/intern/MOD_navmesh.cpp @@ -266,4 +266,4 @@ ModifierTypeInfo modifierType_NavMesh = { /* foreachIDLink */ 0, }; -}; \ No newline at end of file +}; diff --git a/source/gameengine/Ketsji/KX_NavMeshObject.cpp b/source/gameengine/Ketsji/KX_NavMeshObject.cpp index 499cbae85e9..a474ee984c5 100644 --- a/source/gameengine/Ketsji/KX_NavMeshObject.cpp +++ b/source/gameengine/Ketsji/KX_NavMeshObject.cpp @@ -705,4 +705,4 @@ KX_PYMETHODDEF_DOC_NOARGS(KX_NavMeshObject, rebuild, Py_RETURN_NONE; } -#endif // DISABLE_PYTHON \ No newline at end of file +#endif // DISABLE_PYTHON diff --git a/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp b/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp index 9bca98d7fde..5f78d9a3722 100644 --- a/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp +++ b/source/gameengine/Ketsji/KX_ObstacleSimulation.cpp @@ -866,4 +866,4 @@ KX_ObstacleSimulationTOI_cells::KX_ObstacleSimulationTOI_cells(MT_Scalar levelHe m_curVelWeight = 0.75f; m_toiWeight = 2.5f; m_collisionWeight = 0.75f; //side_weight -} \ No newline at end of file +} From 015813642b5633fc6917d45fc4fbd5cf3a007345 Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Fri, 9 Sep 2011 22:47:26 +0000 Subject: [PATCH 169/182] Fixing bugs after Recast & Detour branch merge!! * The new NAVMESH Modifier did not show any buttons, console printed errors instead! * Poll of "PHYSICS_PT_game_obstacles" panel caused errors as well, self instead of cls was used as argument. * Check to show/hide buttons in "WORLD_PT_game_physics_obstacles" panel did not worked due to wrong ENUM identifier ('None' instead if 'NONE') * Moved "SCENE_PT_navmesh" panel out of properties_scene.py into the properties_game.py where it belongs and renamed it. Also, don't use abreviations in Panel Headers (Navmesh > Navigaion Mesh) * Code cleanup, removed unnescecary code. * bpy.types.Panel > Panel --- .../startup/bl_ui/properties_data_modifier.py | 9 +-- .../scripts/startup/bl_ui/properties_game.py | 73 +++++++++++++++++-- .../scripts/startup/bl_ui/properties_scene.py | 71 ------------------ 3 files changed, 68 insertions(+), 85 deletions(-) diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py index 510cab879ec..d8860d98654 100644 --- a/release/scripts/startup/bl_ui/properties_data_modifier.py +++ b/release/scripts/startup/bl_ui/properties_data_modifier.py @@ -380,12 +380,9 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel): col.prop(md, "mirror_object", text="") def NAVMESH(self, layout, ob, md): - split = layout.split() - if ob.mode == 'EDIT': - col = split.column() - col.operator("object.assign_navpolygon", text="Assign poly idx") - col = split.column() - col.operator("object.assign_new_navpolygon", text="Assign new poly idx") + row = layout.row() + row.operator("object.assign_navpolygon", text="Assign poly idx") + row.operator("object.assign_new_navpolygon", text="Assign new poly idx") def MULTIRES(self, layout, ob, md): layout.row().prop(md, "subdivision_type", expand=True) diff --git a/release/scripts/startup/bl_ui/properties_game.py b/release/scripts/startup/bl_ui/properties_game.py index 51f2ece72b8..711b51a5d5f 100644 --- a/release/scripts/startup/bl_ui/properties_game.py +++ b/release/scripts/startup/bl_ui/properties_game.py @@ -195,12 +195,12 @@ class PHYSICS_PT_game_collision_bounds(PhysicsButtonsPanel, Panel): row.prop(game, "collision_margin", text="Margin", slider=True) row.prop(game, "use_collision_compound", text="Compound") -class PHYSICS_PT_game_obstacles(PhysicsButtonsPanel, bpy.types.Panel): - bl_label = "Create obstacle" +class PHYSICS_PT_game_obstacles(PhysicsButtonsPanel, Panel): + bl_label = "Create Obstacle" COMPAT_ENGINES = {'BLENDER_GAME'} @classmethod - def poll(self, context): + def poll(cls, context): game = context.object.game rd = context.scene.render return (game.physics_type in ('DYNAMIC', 'RIGID_BODY', 'SENSOR', 'SOFT_BODY', 'STATIC')) and (rd.engine in cls.COMPAT_ENGINES) @@ -217,9 +217,9 @@ class PHYSICS_PT_game_obstacles(PhysicsButtonsPanel, bpy.types.Panel): layout.active = game.create_obstacle - split = layout.split() - col = split.column() - col.prop(game, "obstacle_radius", text="Radius") + row = layout.row() + row.prop(game, "obstacle_radius", text="Radius") + row.label() class RenderButtonsPanel(): bl_space_type = 'PROPERTIES' @@ -387,6 +387,63 @@ class RENDER_PT_game_display(RenderButtonsPanel, Panel): flow.prop(gs, "show_physics_visualization", text="Physics Visualization") flow.prop(gs, "use_deprecation_warnings") flow.prop(gs, "show_mouse", text="Mouse Cursor") + +class SceneButtonsPanel(): + bl_space_type = 'PROPERTIES' + bl_region_type = 'WINDOW' + bl_context = "scene" + +class SCENE_PT_game_navmesh(SceneButtonsPanel, bpy.types.Panel): + bl_label = "Navigation mesh" + bl_default_closed = True + COMPAT_ENGINES = {'BLENDER_GAME'} + + def draw(self, context): + layout = self.layout + + rd = context.scene.game_settings.recast_data + + layout.operator("object.create_navmesh", text='Build navigation mesh') + + col = layout.column() + col.label(text="Rasterization:") + row = col.row() + row.prop(rd, "cell_size") + row.prop(rd, "cell_height") + + col = layout.column() + col.label(text="Agent:") + split = col.split() + + col = split.column() + col.prop(rd, "agent_height", text="Height") + col.prop(rd, "agent_radius", text="Radius") + + col = split.column() + col.prop(rd, "max_slope") + col.prop(rd, "max_climb") + + col = layout.column() + col.label(text="Region:") + row = col.row() + row.prop(rd, "region_min_size") + row.prop(rd, "region_merge_size") + + col = layout.column() + col.label(text="Polygonization:") + split = col.split() + + col = split.column() + col.prop(rd, "edge_max_len") + col.prop(rd, "edge_max_error") + + split.prop(rd, "verts_per_poly") + + col = layout.column() + col.label(text="Detail Mesh:") + row = col.row() + row.prop(rd, "sample_dist") + row.prop(rd, "sample_max_error") class WorldButtonsPanel(): @@ -512,7 +569,7 @@ class WORLD_PT_game_physics(WorldButtonsPanel, Panel): col.label(text="Logic Steps:") col.prop(gs, "logic_step_max", text="Max") -class WORLD_PT_game_physics_obstacles(WorldButtonsPanel, bpy.types.Panel): +class WORLD_PT_game_physics_obstacles(WorldButtonsPanel, Panel): bl_label = "Obstacle simulation" COMPAT_ENGINES = {'BLENDER_GAME'} @@ -522,7 +579,7 @@ class WORLD_PT_game_physics_obstacles(WorldButtonsPanel, bpy.types.Panel): gs = context.scene.game_settings layout.prop(gs, "obstacle_simulation", text = "Type") - if gs.obstacle_simulation != 'None': + if gs.obstacle_simulation != 'NONE': layout.prop(gs, "level_height") layout.prop(gs, "show_obstacle_simulation") diff --git a/release/scripts/startup/bl_ui/properties_scene.py b/release/scripts/startup/bl_ui/properties_scene.py index 001897c222f..66f967bb6e1 100644 --- a/release/scripts/startup/bl_ui/properties_scene.py +++ b/release/scripts/startup/bl_ui/properties_scene.py @@ -331,76 +331,5 @@ class ANIM_OT_keying_set_export(Operator): wm.fileselect_add(self) return {'RUNNING_MODAL'} -class SCENE_PT_navmesh(SceneButtonsPanel, bpy.types.Panel): - bl_label = "Navmesh" - bl_default_closed = True - COMPAT_ENGINES = {'BLENDER_GAME'} - - def draw(self, context): - layout = self.layout - - rd = context.scene.game_settings.recast_data - - layout.operator("object.create_navmesh", text='Build navigation mesh') - - layout.label(text="Rasterization:") - split = layout.split() - - col = split.column() - col.prop(rd, "cell_size") - col = split.column() - col.prop(rd, "cell_height") - - layout.separator() - - layout.label(text="Agent:") - split = layout.split() - - col = split.column() - row = col.row() - row.prop(rd, "agent_height") - row = col.row() - row.prop(rd, "agent_radius") - - col = split.column() - row = col.row() - row.prop(rd, "max_slope") - row = col.row() - row.prop(rd, "max_climb") - - layout.separator() - - layout.label(text="Region:") - split = layout.split() - col = split.column() - col.prop(rd, "region_min_size") - - col = split.column() - col.prop(rd, "region_merge_size") - - layout.separator() - - layout.label(text="Polygonization:") - split = layout.split() - col = split.column() - row = col.row() - row.prop(rd, "edge_max_len") - row = col.row() - row.prop(rd, "edge_max_error") - - col = split.column() - row = col.row() - row.prop(rd, "verts_per_poly") - - layout.separator() - - layout.label(text="Detail Mesh:") - split = layout.split() - col = split.column() - col.prop(rd, "sample_dist") - - col = split.column() - col.prop(rd, "sample_max_error") - if __name__ == "__main__": # only for live edit. bpy.utils.register_module(__name__) From 23b843130b5aa77988ac158bb11addcccec01e68 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 10 Sep 2011 01:39:21 +0000 Subject: [PATCH 170/182] fix own mistake in recent commit, was using glIndexPointer incorrectly. --- .../editors/interface/interface_widgets.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c index c06e26eecaa..d9d75c34a94 100644 --- a/source/blender/editors/interface/interface_widgets.c +++ b/source/blender/editors/interface/interface_widgets.c @@ -79,10 +79,10 @@ /* it has outline, back, and two optional tria meshes */ typedef struct uiWidgetTrias { - int tot; + unsigned int tot; float vec[32][2]; - int (*index)[3]; + unsigned int (*index)[3]; } uiWidgetTrias; @@ -146,7 +146,7 @@ static float jit[8][2]= {{0.468813 , -0.481430}, {-0.155755 , -0.352820}, static float num_tria_vert[3][2]= { {-0.352077, 0.532607}, {-0.352077, -0.549313}, {0.330000, -0.008353}}; -static int num_tria_face[1][3]= { +static unsigned int num_tria_face[1][3]= { {0, 1, 2}}; static float scroll_circle_vert[16][2]= { @@ -155,7 +155,7 @@ static float scroll_circle_vert[16][2]= { {-0.382683, -0.923880}, {0.000000, -1.000000}, {0.382684, -0.923880}, {0.707107, -0.707107}, {0.923880, -0.382684}, {1.000000, -0.000000}, {0.923880, 0.382683}, {0.707107, 0.707107}}; -static int scroll_circle_face[14][3]= { +static unsigned int scroll_circle_face[14][3]= { {0, 1, 2}, {2, 0, 3}, {3, 0, 15}, {3, 15, 4}, {4, 15, 14}, {4, 14, 5}, {5, 14, 13}, {5, 13, 6}, {6, 13, 12}, {6, 12, 7}, {7, 12, 11}, {7, 11, 8}, {8, 11, 10}, {8, 10, 9}}; @@ -163,13 +163,13 @@ static float menu_tria_vert[6][2]= { {-0.41, 0.16}, {0.41, 0.16}, {0, 0.82}, {0, -0.82}, {-0.41, -0.16}, {0.41, -0.16}}; -static int menu_tria_face[2][3]= {{2, 0, 1}, {3, 5, 4}}; +static unsigned int menu_tria_face[2][3]= {{2, 0, 1}, {3, 5, 4}}; static float check_tria_vert[6][2]= { {-0.578579, 0.253369}, {-0.392773, 0.412794}, {-0.004241, -0.328551}, {-0.003001, 0.034320}, {1.055313, 0.864744}, {0.866408, 1.026895}}; -static int check_tria_face[4][3]= { +static unsigned int check_tria_face[4][3]= { {3, 2, 4}, {3, 4, 5}, {1, 0, 3}, {0, 2, 3}}; GLubyte checker_stipple_sml[32*32/8] = @@ -533,12 +533,9 @@ static void widget_scroll_circle(uiWidgetTrias *tria, rcti *rect, float triasize static void widget_trias_draw(uiWidgetTrias *tria) { glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_INDEX_ARRAY); - glIndexPointer(GL_INT, 0, tria->index); glVertexPointer(2, GL_FLOAT, 0, tria->vec); - glDrawArrays(GL_TRIANGLES, 0, tria->tot*3); + glDrawElements(GL_TRIANGLES, tria->tot*3, GL_UNSIGNED_INT, tria->index); glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_INDEX_ARRAY); } static void widget_menu_trias(uiWidgetTrias *tria, rcti *rect) From 0128218254df07f804b15088036a1e7ef4938664 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 10 Sep 2011 03:07:26 +0000 Subject: [PATCH 171/182] recast and detour patch now builds again with GCC - rearrange structs to work for 64bit - define all vars before goto's - ifdefs for qsort_r/qsort_s - dont cast pointers to int only for NULL checks - dont printf STR_String directly, get the char pointer from it also minor change to gpu py module, no need to pass empty tuple to PyObject_CallObject, can just be NULL --- .../recastnavigation/Recast/Source/Recast.cpp | 2 +- .../Recast/Source/RecastFilter.cpp | 10 +++---- .../Recast/Source/RecastMesh.cpp | 16 ++++++++---- .../Recast/Source/RecastMeshDetail.cpp | 24 +++++++++++------ .../editors/util/navmesh_conversion.cpp | 16 ++++++++---- source/blender/makesdna/DNA_scene_types.h | 26 +++++++++---------- source/blender/python/intern/gpu.c | 9 ++----- source/gameengine/Ketsji/KX_NavMeshObject.cpp | 4 +-- 8 files changed, 61 insertions(+), 46 deletions(-) diff --git a/extern/recastnavigation/Recast/Source/Recast.cpp b/extern/recastnavigation/Recast/Source/Recast.cpp index 4bd8b7a12a9..0db26c2c1cd 100644 --- a/extern/recastnavigation/Recast/Source/Recast.cpp +++ b/extern/recastnavigation/Recast/Source/Recast.cpp @@ -188,7 +188,7 @@ bool rcBuildCompactHeightfield(const int walkableHeight, const int walkableClimb if (s->flags == flags) { const int bot = (int)s->smax; - const int top = (int)s->next ? (int)s->next->smin : MAX_HEIGHT; + const int top = s->next ? (int)s->next->smin : MAX_HEIGHT; chf.spans[idx].y = (unsigned short)rcClamp(bot, 0, 0xffff); chf.spans[idx].h = (unsigned char)rcClamp(top - bot, 0, 0xff); idx++; diff --git a/extern/recastnavigation/Recast/Source/RecastFilter.cpp b/extern/recastnavigation/Recast/Source/RecastFilter.cpp index 3421ea1899e..ebe60714a18 100644 --- a/extern/recastnavigation/Recast/Source/RecastFilter.cpp +++ b/extern/recastnavigation/Recast/Source/RecastFilter.cpp @@ -46,7 +46,7 @@ void rcFilterLedgeSpans(const int walkableHeight, continue; const int bot = (int)s->smax; - const int top = (int)s->next ? (int)s->next->smin : MAX_HEIGHT; + const int top = s->next ? (int)s->next->smin : MAX_HEIGHT; // Find neighbours minimum height. int minh = MAX_HEIGHT; @@ -74,7 +74,7 @@ void rcFilterLedgeSpans(const int walkableHeight, for (ns = solid.spans[dx + dy*w]; ns; ns = ns->next) { nbot = (int)ns->smax; - ntop = (int)ns->next ? (int)ns->next->smin : MAX_HEIGHT; + ntop = ns->next ? (int)ns->next->smin : MAX_HEIGHT; // Skip neightbour if the gap between the spans is too small. if (rcMin(top,ntop) - rcMax(bot,nbot) > walkableHeight) minh = rcMin(minh, nbot - bot); @@ -115,7 +115,7 @@ void rcFilterWalkableLowHeightSpans(int walkableHeight, for (rcSpan* s = solid.spans[x + y*w]; s; s = s->next) { const int bot = (int)s->smax; - const int top = (int)s->next ? (int)s->next->smin : MAX_HEIGHT; + const int top = s->next ? (int)s->next->smin : MAX_HEIGHT; if ((top - bot) <= walkableHeight) s->flags &= ~RC_WALKABLE; } @@ -194,7 +194,7 @@ bool rcMarkReachableSpans(const int walkableHeight, rcReachableSeed cur = stack[stackSize]; const int bot = (int)cur.s->smax; - const int top = (int)cur.s->next ? (int)cur.s->next->smin : MAX_HEIGHT; + const int top = cur.s->next ? (int)cur.s->next->smin : MAX_HEIGHT; // Visit neighbours in all 4 directions. for (int dir = 0; dir < 4; ++dir) @@ -214,7 +214,7 @@ bool rcMarkReachableSpans(const int walkableHeight, continue; const int nbot = (int)ns->smax; - const int ntop = (int)ns->next ? (int)ns->next->smin : MAX_HEIGHT; + const int ntop = ns->next ? (int)ns->next->smin : MAX_HEIGHT; // Skip neightbour if the gap between the spans is too small. if (rcMin(top,ntop) - rcMax(bot,nbot) < walkableHeight) continue; diff --git a/extern/recastnavigation/Recast/Source/RecastMesh.cpp b/extern/recastnavigation/Recast/Source/RecastMesh.cpp index 45ed4a2fdc6..38d62904213 100644 --- a/extern/recastnavigation/Recast/Source/RecastMesh.cpp +++ b/extern/recastnavigation/Recast/Source/RecastMesh.cpp @@ -489,6 +489,9 @@ static void pushBack(int v, int* arr, int& an) static bool removeVertex(rcPolyMesh& mesh, const unsigned short rem, const int maxTris) { + unsigned short* tmpPoly; + int ntris; + static const int nvp = mesh.nvp; int* edges = 0; @@ -671,7 +674,7 @@ static bool removeVertex(rcPolyMesh& mesh, const unsigned short rem, const int m } // Triangulate the hole. - int ntris = triangulate(nhole, &tverts[0], &thole[0], tris); + ntris = triangulate(nhole, &tverts[0], &thole[0], tris); // Merge the hole triangles back to polygons. polys = new unsigned short[(ntris+1)*nvp]; @@ -689,7 +692,7 @@ static bool removeVertex(rcPolyMesh& mesh, const unsigned short rem, const int m goto failure; } - unsigned short* tmpPoly = &polys[ntris*nvp]; + tmpPoly = &polys[ntris*nvp]; // Build initial polygons. memset(polys, 0xff, ntris*nvp*sizeof(unsigned short)); @@ -793,7 +796,9 @@ failure: bool rcBuildPolyMesh(rcContourSet& cset, int nvp, rcPolyMesh& mesh) { + unsigned short* tmpPoly; rcTimeVal startTime = rcGetPerformanceTimer(); + rcTimeVal endTime; vcopy(mesh.bmin, cset.bmin); vcopy(mesh.bmax, cset.bmax); @@ -902,7 +907,7 @@ bool rcBuildPolyMesh(rcContourSet& cset, int nvp, rcPolyMesh& mesh) rcGetLog()->log(RC_LOG_ERROR, "rcBuildPolyMesh: Out of memory 'polys' (%d).", maxVertsPerCont*nvp); goto failure; } - unsigned short* tmpPoly = &polys[maxVertsPerCont*nvp]; + tmpPoly = &polys[maxVertsPerCont*nvp]; for (int i = 0; i < cset.nconts; ++i) { @@ -1050,7 +1055,7 @@ bool rcBuildPolyMesh(rcContourSet& cset, int nvp, rcPolyMesh& mesh) return false; } - rcTimeVal endTime = rcGetPerformanceTimer(); + endTime = rcGetPerformanceTimer(); // if (rcGetLog()) // rcGetLog()->log(RC_LOG_PROGRESS, "Build polymesh: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f); @@ -1076,6 +1081,7 @@ bool rcMergePolyMeshes(rcPolyMesh** meshes, const int nmeshes, rcPolyMesh& mesh) return true; rcTimeVal startTime = rcGetPerformanceTimer(); + rcTimeVal endTime; int* nextVert = 0; int* firstVert = 0; @@ -1196,7 +1202,7 @@ bool rcMergePolyMeshes(rcPolyMesh** meshes, const int nmeshes, rcPolyMesh& mesh) delete [] nextVert; delete [] vremap; - rcTimeVal endTime = rcGetPerformanceTimer(); + endTime = rcGetPerformanceTimer(); if (rcGetBuildTimes()) rcGetBuildTimes()->mergePolyMesh += rcGetDeltaTimeUsec(startTime, endTime); diff --git a/extern/recastnavigation/Recast/Source/RecastMeshDetail.cpp b/extern/recastnavigation/Recast/Source/RecastMeshDetail.cpp index ef17531d7bc..b43346c53e2 100644 --- a/extern/recastnavigation/Recast/Source/RecastMeshDetail.cpp +++ b/extern/recastnavigation/Recast/Source/RecastMeshDetail.cpp @@ -95,7 +95,11 @@ static int circumCircle(const float xp, const float yp, return (drsqr <= rsqr) ? 1 : 0; } +#if defined(_MSC_VER) static int ptcmp(void* up, const void *v1, const void *v2) +#else +static int ptcmp(const void *v1, const void *v2, void* up) +#endif { const float* verts = (const float*)up; const float* p1 = &verts[(*(const int*)v1)*3]; @@ -116,10 +120,10 @@ static void delaunay(const int nv, float *verts, rcIntArray& idx, rcIntArray& tr idx.resize(nv); for (int i = 0; i < nv; ++i) idx[i] = i; -#ifdef WIN32 +#if defined(_MSC_VER) qsort_s(&idx[0], idx.size(), sizeof(int), ptcmp, verts); #else - qsort_r(&idx[0], idx.size(), sizeof(int), verts, ptcmp); + qsort_r(&idx[0], idx.size(), sizeof(int), ptcmp, verts); #endif // Find the maximum and minimum vertex bounds. @@ -673,11 +677,15 @@ bool rcBuildPolyMeshDetail(const rcPolyMesh& mesh, const rcCompactHeightfield& c const float sampleDist, const float sampleMaxError, rcPolyMeshDetail& dmesh) { - rcTimeVal startTime = rcGetPerformanceTimer(); - if (mesh.nverts == 0 || mesh.npolys == 0) return true; - + + rcTimeVal startTime = rcGetPerformanceTimer(); + rcTimeVal endTime; + + int vcap; + int tcap; + const int nvp = mesh.nvp; const float cs = mesh.cs; const float ch = mesh.ch; @@ -760,8 +768,8 @@ bool rcBuildPolyMeshDetail(const rcPolyMesh& mesh, const rcCompactHeightfield& c goto failure; } - int vcap = nPolyVerts+nPolyVerts/2; - int tcap = vcap*2; + vcap = nPolyVerts+nPolyVerts/2; + tcap = vcap*2; dmesh.nverts = 0; dmesh.verts = new float[vcap*3]; @@ -882,7 +890,7 @@ bool rcBuildPolyMeshDetail(const rcPolyMesh& mesh, const rcCompactHeightfield& c delete [] bounds; delete [] poly; - rcTimeVal endTime = rcGetPerformanceTimer(); + endTime = rcGetPerformanceTimer(); if (rcGetBuildTimes()) rcGetBuildTimes()->buildDetailMesh += rcGetDeltaTimeUsec(startTime, endTime); diff --git a/source/blender/editors/util/navmesh_conversion.cpp b/source/blender/editors/util/navmesh_conversion.cpp index 2068d17435c..255e3387ab2 100644 --- a/source/blender/editors/util/navmesh_conversion.cpp +++ b/source/blender/editors/util/navmesh_conversion.cpp @@ -146,7 +146,6 @@ bool buildPolygonsByDetailedMeshes(const int vertsPerPoly, const int npolys, const float* verts, const unsigned short* dtris, const int* dtrisToPolysMap) { - bool res = false; int capacity = vertsPerPoly; unsigned short* newPoly = new unsigned short[capacity]; memset(newPoly, 0xff, sizeof(unsigned short)*capacity); @@ -268,7 +267,6 @@ bool buildPolygonsByDetailedMeshes(const int vertsPerPoly, const int npolys, } } } - res = true; returnLabel: delete newPoly; @@ -280,8 +278,13 @@ struct SortContext const int* recastData; const int* trisToFacesMap; }; -static int compareByData(void* data, const void * a, const void * b){ - SortContext* context = (SortContext*)data; +#if defined(_MSC_VER) +static int compareByData(const void* data, void * a, void * b) +#else +static int compareByData(const void * a, const void * b, void* data) +#endif +{ + const SortContext* context = (const SortContext*)data; return ( context->recastData[context->trisToFacesMap[*(int*)a]] - context->recastData[context->trisToFacesMap[*(int*)b]] ); } @@ -307,8 +310,11 @@ bool buildNavMeshData(const int nverts, const float* verts, SortContext context; context.recastData = recastData; context.trisToFacesMap = trisToFacesMap; +#if defined(_MSC_VER) qsort_s(trisMapping, ntris, sizeof(int), compareByData, &context); - +#else + qsort_r(trisMapping, ntris, sizeof(int), compareByData, &context); +#endif //search first valid triangle - triangle of convex polygon int validTriStart = -1; for (int i=0; i< ntris; i++) diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index be44b87d48e..5f20432d6f8 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -445,6 +445,19 @@ typedef struct RecastData typedef struct GameData { + /* standalone player */ + struct GameFraming framing; + short fullscreen, xplay, yplay, freqplay; + short depth, attrib, rt1, rt2; + + /* stereo/dome mode */ + struct GameDome dome; + short stereoflag, stereomode; + short pad2, pad3; + float eyeseparation, pad1; + RecastData recastData; + + /* physics (it was in world)*/ float gravity; /*Gravitation constant for the game world*/ @@ -463,19 +476,6 @@ typedef struct GameData { short ticrate, maxlogicstep, physubstep, maxphystep; short obstacleSimulation; float levelHeight; - - - /* standalone player */ - struct GameFraming framing; - short fullscreen, xplay, yplay, freqplay; - short depth, attrib, rt1, rt2; - - /* stereo/dome mode */ - struct GameDome dome; - short stereoflag, stereomode; - short pad2, pad3; - float eyeseparation, pad1; - RecastData recastData; } GameData; #define STEREO_NOSTEREO 1 diff --git a/source/blender/python/intern/gpu.c b/source/blender/python/intern/gpu.c index 8d705e44bb8..334bb1f725a 100644 --- a/source/blender/python/intern/gpu.c +++ b/source/blender/python/intern/gpu.c @@ -147,7 +147,6 @@ static PyObject* GPU_export_shader(PyObject* UNUSED(self), PyObject *args, PyObj PyObject* pymat; PyObject* as_pointer; PyObject* pointer; - PyObject* noargs; PyObject* result; PyObject* dict; PyObject* val; @@ -170,9 +169,7 @@ static PyObject* GPU_export_shader(PyObject* UNUSED(self), PyObject *args, PyObj (as_pointer = PyObject_GetAttrString(pyscene, "as_pointer")) != NULL && PyCallable_Check(as_pointer)) { // must be a scene object - noargs = PyTuple_New(0); - pointer = PyObject_CallObject(as_pointer, noargs); - Py_DECREF(noargs); + pointer = PyObject_CallObject(as_pointer, NULL); if (!pointer) { PyErr_SetString(PyExc_SystemError, "scene.as_pointer() failed"); return NULL; @@ -192,9 +189,7 @@ static PyObject* GPU_export_shader(PyObject* UNUSED(self), PyObject *args, PyObj (as_pointer = PyObject_GetAttrString(pymat, "as_pointer")) != NULL && PyCallable_Check(as_pointer)) { // must be a material object - noargs = PyTuple_New(0); - pointer = PyObject_CallObject(as_pointer, noargs); - Py_DECREF(noargs); + pointer = PyObject_CallObject(as_pointer, NULL); if (!pointer) { PyErr_SetString(PyExc_SystemError, "scene.as_pointer() failed"); return NULL; diff --git a/source/gameengine/Ketsji/KX_NavMeshObject.cpp b/source/gameengine/Ketsji/KX_NavMeshObject.cpp index a474ee984c5..293fc6eaa08 100644 --- a/source/gameengine/Ketsji/KX_NavMeshObject.cpp +++ b/source/gameengine/Ketsji/KX_NavMeshObject.cpp @@ -282,7 +282,7 @@ bool KX_NavMeshObject::BuildNavMesh() if (GetMeshCount()==0) { - printf("Can't find mesh for navmesh object: %s \n", m_name); + printf("Can't find mesh for navmesh object: %s \n", m_name.ReadPtr()); return false; } @@ -294,7 +294,7 @@ bool KX_NavMeshObject::BuildNavMesh() dmeshes, dvertices, ndvertsuniq, dtris, ndtris, vertsPerPoly ) || vertsPerPoly<3) { - printf("Can't build navigation mesh data for object:%s \n", m_name); + printf("Can't build navigation mesh data for object:%s \n", m_name.ReadPtr()); return false; } From fb4abf2e414064449624d169e8f10708990ea0d9 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 10 Sep 2011 03:42:45 +0000 Subject: [PATCH 172/182] fixed linking with CMake --- extern/CMakeLists.txt | 6 +++++- extern/recastnavigation/CMakeLists.txt | 2 +- source/creator/CMakeLists.txt | 2 ++ source/gameengine/Ketsji/CMakeLists.txt | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/extern/CMakeLists.txt b/extern/CMakeLists.txt index 7a59e41c89b..266ac6d9f0d 100644 --- a/extern/CMakeLists.txt +++ b/extern/CMakeLists.txt @@ -42,7 +42,11 @@ endif() if(WITH_BUILTIN_GLEW) add_subdirectory(glew) endif() -add_subdirectory(recastnavigation) + +## TODO MAKE GAME ENGINE ONLY +# if(WITH_GAMEENGINE) + add_subdirectory(recastnavigation) +# endif() if(WITH_IMAGE_OPENJPEG AND (NOT UNIX OR APPLE)) add_subdirectory(libopenjpeg) diff --git a/extern/recastnavigation/CMakeLists.txt b/extern/recastnavigation/CMakeLists.txt index 694f14293c2..1af01b1b427 100644 --- a/extern/recastnavigation/CMakeLists.txt +++ b/extern/recastnavigation/CMakeLists.txt @@ -63,4 +63,4 @@ set(SRC Recast/Include/RecastTimer.h ) -blender_add_lib(extern_recastnavigation "${SRC}" "${INC}" "${INC_SYS}") \ No newline at end of file +blender_add_lib(extern_recastnavigation "${SRC}" "${INC}" "${INC_SYS}") diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt index 243f51f04db..93236f93ceb 100644 --- a/source/creator/CMakeLists.txt +++ b/source/creator/CMakeLists.txt @@ -819,6 +819,8 @@ endif() bf_blenfont bf_intern_audaspace bf_intern_mikktspace + extern_recastnavigation + bf_editor_util # --- BAD LEVEL CALL HERE --- XXX, this should be removed before release! ) if(WITH_MOD_CLOTH_ELTOPO) diff --git a/source/gameengine/Ketsji/CMakeLists.txt b/source/gameengine/Ketsji/CMakeLists.txt index 6846da5b019..4b2d828fe81 100644 --- a/source/gameengine/Ketsji/CMakeLists.txt +++ b/source/gameengine/Ketsji/CMakeLists.txt @@ -59,7 +59,7 @@ set(INC_SYS ${GLEW_INCLUDE_PATH} ../../../extern/recastnavigation/Recast/Include ../../../extern/recastnavigation/Detour/Include - ../../../source/blender/editors/include + ../../blender/editors/include ) set(SRC From 01dca44a840cb6066adb4845a5e93e0d118f239c Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 10 Sep 2011 04:21:58 +0000 Subject: [PATCH 173/182] disable navmesh feature when building without the game engine. --- extern/CMakeLists.txt | 5 ++--- source/blender/editors/object/CMakeLists.txt | 11 ++++++++++- source/blender/editors/object/object_ops.c | 3 +++ source/blender/editors/util/CMakeLists.txt | 7 ++++++- source/blender/modifiers/CMakeLists.txt | 4 ++++ source/blender/modifiers/intern/MOD_navmesh.cpp | 16 +++++++++++++--- 6 files changed, 38 insertions(+), 8 deletions(-) diff --git a/extern/CMakeLists.txt b/extern/CMakeLists.txt index 266ac6d9f0d..0386b3d71d8 100644 --- a/extern/CMakeLists.txt +++ b/extern/CMakeLists.txt @@ -43,10 +43,9 @@ if(WITH_BUILTIN_GLEW) add_subdirectory(glew) endif() -## TODO MAKE GAME ENGINE ONLY -# if(WITH_GAMEENGINE) +if(WITH_GAMEENGINE) add_subdirectory(recastnavigation) -# endif() +endif() if(WITH_IMAGE_OPENJPEG AND (NOT UNIX OR APPLE)) add_subdirectory(libopenjpeg) diff --git a/source/blender/editors/object/CMakeLists.txt b/source/blender/editors/object/CMakeLists.txt index de74a0321c7..58ebb12e345 100644 --- a/source/blender/editors/object/CMakeLists.txt +++ b/source/blender/editors/object/CMakeLists.txt @@ -49,7 +49,6 @@ set(SRC object_hook.c object_lattice.c object_modifier.c - object_navmesh.cpp object_ops.c object_relations.c object_select.c @@ -60,8 +59,18 @@ set(SRC object_intern.h ) +if(WITH_GAMEENGINE) + list(APPEND SRC + object_navmesh.cpp + ) +endif() + if(WITH_PYTHON) add_definitions(-DWITH_PYTHON) endif() +if(WITH_GAMEENGINE) + add_definitions(-DWITH_GAMEENGINE) +endif() + blender_add_lib(bf_editor_object "${SRC}" "${INC}" "${INC_SYS}") diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c index 29d536c1dab..5eb17268d19 100644 --- a/source/blender/editors/object/object_ops.c +++ b/source/blender/editors/object/object_ops.c @@ -213,11 +213,14 @@ void ED_operatortypes_object(void) WM_operatortype_append(OBJECT_OT_bake_image); WM_operatortype_append(OBJECT_OT_drop_named_material); +#ifdef WITH_GAMEENGINE WM_operatortype_append(OBJECT_OT_create_navmesh); WM_operatortype_append(OBJECT_OT_assign_navpolygon); WM_operatortype_append(OBJECT_OT_assign_new_navpolygon); +#endif } + void ED_operatormacros_object(void) { wmOperatorType *ot; diff --git a/source/blender/editors/util/CMakeLists.txt b/source/blender/editors/util/CMakeLists.txt index da6e1990622..5e05342f3dc 100644 --- a/source/blender/editors/util/CMakeLists.txt +++ b/source/blender/editors/util/CMakeLists.txt @@ -40,7 +40,6 @@ set(SRC editmode_undo.c numinput.c undo.c - navmesh_conversion.cpp crazyspace.c util_intern.h @@ -90,4 +89,10 @@ set(SRC ../include/UI_view2d.h ) +if(WITH_GAMEENGINE) + list(APPEND SRC + navmesh_conversion.cpp + ) +endif() + blender_add_lib(bf_editor_util "${SRC}" "${INC}" "${INC_SYS}") diff --git a/source/blender/modifiers/CMakeLists.txt b/source/blender/modifiers/CMakeLists.txt index d06ada737ee..bdbc51605ba 100644 --- a/source/blender/modifiers/CMakeLists.txt +++ b/source/blender/modifiers/CMakeLists.txt @@ -119,4 +119,8 @@ if(NOT WITH_MOD_FLUID) add_definitions(-DDISABLE_ELBEEM) endif() +if(WITH_GAMEENGINE) + add_definitions(-DWITH_GAMEENGINE) +endif() + blender_add_lib(bf_modifiers "${SRC}" "${INC}" "${INC_SYS}") diff --git a/source/blender/modifiers/intern/MOD_navmesh.cpp b/source/blender/modifiers/intern/MOD_navmesh.cpp index 7a1c2bb6059..bc97023a58b 100644 --- a/source/blender/modifiers/intern/MOD_navmesh.cpp +++ b/source/blender/modifiers/intern/MOD_navmesh.cpp @@ -33,7 +33,10 @@ extern "C"{ #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" + #include "BLI_math.h" +#include "BLI_utildefines.h" + #include "BKE_cdderivedmesh.h" #include "BKE_mesh.h" #include "BKE_modifier.h" @@ -47,13 +50,13 @@ extern "C"{ static void initData(ModifierData *md) { - NavMeshModifierData *nmmd = (NavMeshModifierData*) md; + /* NavMeshModifierData *nmmd = (NavMeshModifierData*) md; */ /* UNUSED */ } static void copyData(ModifierData *md, ModifierData *target) { - NavMeshModifierData *nmmd = (NavMeshModifierData*) md; - NavMeshModifierData *tnmmd = (NavMeshModifierData*) target; + /* NavMeshModifierData *nmmd = (NavMeshModifierData*) md; */ + /* NavMeshModifierData *tnmmd = (NavMeshModifierData*) target; */ //.todo - deep copy } @@ -62,6 +65,8 @@ static void copyData(ModifierData *md, ModifierData *target) static void (*drawFacesSolid_original)(DerivedMesh *dm, float (*partial_redraw_planes)[4], int fast, int (*setMaterial)(int, void *attribs)) = NULL;*/ +#ifdef WITH_GAMEENGINE + static void drawNavMeshColored(DerivedMesh *dm) { int a, glmode; @@ -122,9 +127,11 @@ static void navDM_drawFacesSolid(DerivedMesh *dm, //drawFacesSolid_original(dm, partial_redraw_planes, fast, setMaterial); drawNavMeshColored(dm); } +#endif /* WITH_GAMEENGINE */ static DerivedMesh *createNavMeshForVisualization(NavMeshModifierData *mmd,DerivedMesh *dm) { +#ifdef WITH_GAMEENGINE DerivedMesh *result; int maxFaces = dm->getNumFaces(dm); @@ -194,6 +201,9 @@ static DerivedMesh *createNavMeshForVisualization(NavMeshModifierData *mmd,Deriv delete trisToFacesMap; return result; +#else // WITH_GAMEENGINE + return dm; +#endif // WITH_GAMEENGINE } /* From 1334d3cb45804583dfb875eef0e46d1e21181efd Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Sat, 10 Sep 2011 07:14:35 +0000 Subject: [PATCH 174/182] NAVMESH Modifier was not alphabetical correct in the modifier list, as the others. --- source/blender/makesrna/intern/rna_modifier.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index f6c96c2594c..fe79ed9e532 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -91,12 +91,12 @@ EnumPropertyItem modifier_type_items[] ={ {eModifierType_Collision, "COLLISION", ICON_MOD_PHYSICS, "Collision", ""}, {eModifierType_Explode, "EXPLODE", ICON_MOD_EXPLODE, "Explode", ""}, {eModifierType_Fluidsim, "FLUID_SIMULATION", ICON_MOD_FLUIDSIM, "Fluid Simulation", ""}, + {eModifierType_NavMesh, "NAVMESH", ICON_MOD_PHYSICS, "Navigation mesh", ""}, {eModifierType_ParticleInstance, "PARTICLE_INSTANCE", ICON_MOD_PARTICLES, "Particle Instance", ""}, {eModifierType_ParticleSystem, "PARTICLE_SYSTEM", ICON_MOD_PARTICLES, "Particle System", ""}, {eModifierType_Smoke, "SMOKE", ICON_MOD_SMOKE, "Smoke", ""}, {eModifierType_Softbody, "SOFT_BODY", ICON_MOD_SOFT, "Soft Body", ""}, {eModifierType_Surface, "SURFACE", ICON_MOD_PHYSICS, "Surface", ""}, - {eModifierType_NavMesh, "NAVMESH", ICON_MOD_PHYSICS, "Navigation mesh", ""}, {0, NULL, 0, NULL, NULL}}; #ifdef RNA_RUNTIME From 21f4ef77c013e5ce84e3cd7a6b60596551291894 Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Sat, 10 Sep 2011 07:58:42 +0000 Subject: [PATCH 175/182] Fixing bugs after Recast & Detour branch merge *The eModifierType_NavMesh enum define was added before WeightVG ones, in ModifierType, breaking file load for WeightVG modifier. New modifier should always be added at the end of that enum! --- source/blender/makesdna/DNA_modifier_types.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index 3ba7fbd711f..ed060d58123 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -71,10 +71,10 @@ typedef enum ModifierType { eModifierType_Solidify, eModifierType_Screw, eModifierType_Warp, - eModifierType_NavMesh, eModifierType_WeightVGEdit, eModifierType_WeightVGMix, eModifierType_WeightVGProximity, + eModifierType_NavMesh, NUM_MODIFIER_TYPES } ModifierType; From e86bda9a5b5a3730c04a8dbde37b71aa1668fb97 Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Sat, 10 Sep 2011 08:25:03 +0000 Subject: [PATCH 176/182] Compile fix for scons: * Don't compile with navmesh_conversion.cpp if Game engine is disabled. --- source/blender/editors/util/SConscript | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/blender/editors/util/SConscript b/source/blender/editors/util/SConscript index 0ee64fbf9f2..5cb46480e1f 100644 --- a/source/blender/editors/util/SConscript +++ b/source/blender/editors/util/SConscript @@ -9,4 +9,7 @@ incs += ' ../../makesrna' incs += ' #extern/recastnavigation/Recast/Include' incs += ' ../../blenloader' +if not env['WITH_BF_GAMEENGINE']: + sources.remove('navmesh_conversion.cpp') + env.BlenderLib ( 'bf_editors_util', sources, Split(incs), [], libtype=['core','player'], priority=[130,210] ) From e9c645c7274614a89215b85509267b0b1d3f8b75 Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Sat, 10 Sep 2011 08:29:50 +0000 Subject: [PATCH 177/182] Small comment change, when built without Fluids. --- release/scripts/startup/bl_ui/properties_physics_fluid.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release/scripts/startup/bl_ui/properties_physics_fluid.py b/release/scripts/startup/bl_ui/properties_physics_fluid.py index 46893af3582..55629e6c6b9 100644 --- a/release/scripts/startup/bl_ui/properties_physics_fluid.py +++ b/release/scripts/startup/bl_ui/properties_physics_fluid.py @@ -46,7 +46,7 @@ class PHYSICS_PT_fluid(PhysicButtonsPanel, Panel): row = layout.row() if fluid is None: - row.label("built without fluids") + row.label("Built without fluids") return row.prop(fluid, "type") From 129452ebab3192415ab6329dd5c6acf438d2f18c Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Sat, 10 Sep 2011 08:43:11 +0000 Subject: [PATCH 178/182] Recast & Detour UI: * Panels showed up even if in non game engine mode, polls were missing! --- release/scripts/startup/bl_ui/properties_game.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/release/scripts/startup/bl_ui/properties_game.py b/release/scripts/startup/bl_ui/properties_game.py index 711b51a5d5f..b06876637f7 100644 --- a/release/scripts/startup/bl_ui/properties_game.py +++ b/release/scripts/startup/bl_ui/properties_game.py @@ -397,6 +397,11 @@ class SCENE_PT_game_navmesh(SceneButtonsPanel, bpy.types.Panel): bl_label = "Navigation mesh" bl_default_closed = True COMPAT_ENGINES = {'BLENDER_GAME'} + + @classmethod + def poll(cls, context): + scene = context.scene + return (scene and scene.render.engine in cls.COMPAT_ENGINES) def draw(self, context): layout = self.layout @@ -572,6 +577,11 @@ class WORLD_PT_game_physics(WorldButtonsPanel, Panel): class WORLD_PT_game_physics_obstacles(WorldButtonsPanel, Panel): bl_label = "Obstacle simulation" COMPAT_ENGINES = {'BLENDER_GAME'} + + @classmethod + def poll(cls, context): + scene = context.scene + return (scene.world and scene.render.engine in cls.COMPAT_ENGINES) def draw(self, context): layout = self.layout From 571f7db529c3e0f351b90e7e76b1e7aba878b3a7 Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Sat, 10 Sep 2011 09:06:42 +0000 Subject: [PATCH 179/182] MSVC build fix by MiikaH for NAVMESH. Thanks! :) --- source/blender/editors/util/navmesh_conversion.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/editors/util/navmesh_conversion.cpp b/source/blender/editors/util/navmesh_conversion.cpp index 255e3387ab2..aebd9624bc7 100644 --- a/source/blender/editors/util/navmesh_conversion.cpp +++ b/source/blender/editors/util/navmesh_conversion.cpp @@ -279,7 +279,7 @@ struct SortContext const int* trisToFacesMap; }; #if defined(_MSC_VER) -static int compareByData(const void* data, void * a, void * b) +static int compareByData(void* data, const void * a, const void * b) #else static int compareByData(const void * a, const void * b, void* data) #endif From 8ed1c07a7b21d916f149dfa00649579165c45979 Mon Sep 17 00:00:00 2001 From: Thomas Dinges Date: Sat, 10 Sep 2011 09:21:46 +0000 Subject: [PATCH 180/182] Navigation Mesh Modifier: * Fix scons define for operator append * Don't use abbreviations in the UI. --- release/scripts/startup/bl_ui/properties_data_modifier.py | 5 ++--- source/blender/editors/object/SConscript | 3 +++ source/blender/editors/object/object_navmesh.cpp | 4 ++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py index d8860d98654..8e90dc3216e 100644 --- a/release/scripts/startup/bl_ui/properties_data_modifier.py +++ b/release/scripts/startup/bl_ui/properties_data_modifier.py @@ -380,9 +380,8 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel): col.prop(md, "mirror_object", text="") def NAVMESH(self, layout, ob, md): - row = layout.row() - row.operator("object.assign_navpolygon", text="Assign poly idx") - row.operator("object.assign_new_navpolygon", text="Assign new poly idx") + layout.operator("object.assign_navpolygon") + layout.operator("object.assign_new_navpolygon") def MULTIRES(self, layout, ob, md): layout.row().prop(md, "subdivision_type", expand=True) diff --git a/source/blender/editors/object/SConscript b/source/blender/editors/object/SConscript index 900c96044a5..cdda16582ef 100644 --- a/source/blender/editors/object/SConscript +++ b/source/blender/editors/object/SConscript @@ -20,5 +20,8 @@ if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'): if env['WITH_BF_PYTHON']: defs.append('WITH_PYTHON') + +if env['WITH_BF_GAMEENGINE']: + defs.append('WITH_GAMEENGINE') env.BlenderLib ( 'bf_editors_object', sources, Split(incs), defs, libtype=['core'], priority=[35] ) diff --git a/source/blender/editors/object/object_navmesh.cpp b/source/blender/editors/object/object_navmesh.cpp index 8ee63296c70..155ffd37627 100644 --- a/source/blender/editors/object/object_navmesh.cpp +++ b/source/blender/editors/object/object_navmesh.cpp @@ -537,7 +537,7 @@ static int assign_navpolygon_exec(bContext *C, wmOperator *op) void OBJECT_OT_assign_navpolygon(struct wmOperatorType *ot) { /* identifiers */ - ot->name= "Assign polygon index "; + ot->name= "Assign polygon index"; ot->description= "Assign polygon index to face by active face"; ot->idname= "OBJECT_OT_assign_navpolygon"; @@ -615,7 +615,7 @@ static int assign_new_navpolygon_exec(bContext *C, wmOperator *op) void OBJECT_OT_assign_new_navpolygon(struct wmOperatorType *ot) { /* identifiers */ - ot->name= "Assign new polygon index "; + ot->name= "Assign new polygon index"; ot->description= "Assign new polygon index to face"; ot->idname= "OBJECT_OT_assign_new_navpolygon"; From 357febc168cb13981f277b32f1ea2e3488b05b99 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 10 Sep 2011 09:38:38 +0000 Subject: [PATCH 181/182] fix for building with collada and some other warnings --- source/blender/collada/AnimationExporter.cpp | 4 ++-- source/blender/collada/ArmatureImporter.cpp | 2 +- source/blender/collada/SceneExporter.cpp | 2 +- source/blender/editors/include/ED_object.h | 4 ++-- source/blender/editors/object/object_navmesh.cpp | 3 +-- source/blender/makesrna/intern/rna_modifier.c | 2 +- source/gameengine/Expressions/IfExpr.h | 2 +- source/gameengine/Ketsji/KX_NavMeshObject.cpp | 2 +- source/gameengine/VideoTexture/blendVideoTex.cpp | 4 ++-- 9 files changed, 12 insertions(+), 13 deletions(-) diff --git a/source/blender/collada/AnimationExporter.cpp b/source/blender/collada/AnimationExporter.cpp index 498ccb5709d..2ea10111bb9 100644 --- a/source/blender/collada/AnimationExporter.cpp +++ b/source/blender/collada/AnimationExporter.cpp @@ -58,7 +58,7 @@ void AnimationExporter::operator() (Object *ob) { FCurve *fcu; char * transformName ; - bool isMatAnim = false; + /* bool isMatAnim = false; */ /* UNUSED */ //Export transform animations if(ob->adt && ob->adt->action) @@ -125,7 +125,7 @@ void AnimationExporter::operator() (Object *ob) if (!ma) continue; if(ma->adt && ma->adt->action) { - isMatAnim = true; + /* isMatAnim = true; */ fcu = (FCurve*)ma->adt->action->curves.first; while (fcu) { transformName = extract_transform_name( fcu->rna_path ); diff --git a/source/blender/collada/ArmatureImporter.cpp b/source/blender/collada/ArmatureImporter.cpp index 19fa54c5044..ae25d343d36 100644 --- a/source/blender/collada/ArmatureImporter.cpp +++ b/source/blender/collada/ArmatureImporter.cpp @@ -576,7 +576,7 @@ void ArmatureImporter::set_pose ( Object * ob_arm , COLLADAFW::Node * root_node float obmat[4][4]; float ax[3]; - float angle = NULL; + float angle = 0.0f; // object-space get_node_mat(obmat, root_node, NULL, NULL); diff --git a/source/blender/collada/SceneExporter.cpp b/source/blender/collada/SceneExporter.cpp index 5109df0bb6a..a561d18c6e3 100644 --- a/source/blender/collada/SceneExporter.cpp +++ b/source/blender/collada/SceneExporter.cpp @@ -126,7 +126,7 @@ void SceneExporter::writeNodes(Object *ob, Scene *sce) if((ob->transflag & OB_DUPLIGROUP) == OB_DUPLIGROUP && ob->dup_group) { GroupObject *go = NULL; Group *gr = ob->dup_group; - printf("group detected %u\n", gr); + /* printf("group detected '%s'\n", gr->id.name+2); */ for(go = (GroupObject*)(gr->gobject.first); go; go=go->next) { printf("\t%s\n", go->ob->id.name); } diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h index c646ec55506..b451e278d47 100644 --- a/source/blender/editors/include/ED_object.h +++ b/source/blender/editors/include/ED_object.h @@ -136,8 +136,8 @@ void ED_setflagsLatt(struct Object *obedit, int flag); /* object_modifier.c */ enum { MODIFIER_APPLY_DATA=1, - MODIFIER_APPLY_SHAPE, -} eModifier_Apply_Mode; + MODIFIER_APPLY_SHAPE +}; struct ModifierData *ED_object_modifier_add(struct ReportList *reports, struct Main *bmain, struct Scene *scene, struct Object *ob, const char *name, int type); int ED_object_modifier_remove(struct ReportList *reports, struct Main *bmain, struct Scene *scene, struct Object *ob, struct ModifierData *md); diff --git a/source/blender/editors/object/object_navmesh.cpp b/source/blender/editors/object/object_navmesh.cpp index 155ffd37627..d0768d30236 100644 --- a/source/blender/editors/object/object_navmesh.cpp +++ b/source/blender/editors/object/object_navmesh.cpp @@ -312,7 +312,7 @@ static Object* createRepresentation(bContext *C, rcPolyMesh*& pmesh, rcPolyMeshD { float co[3], rot[3]; EditMesh *em; - int i,j, k, polyverts; + int i,j, k; unsigned short* v; int face[3]; Main *bmain = CTX_data_main(C); @@ -355,7 +355,6 @@ static Object* createRepresentation(bContext *C, rcPolyMesh*& pmesh, rcPolyMeshD SWAP(float, co[1], co[2]); addvertlist(em, co, NULL); } - polyverts = pmesh->nverts; //create custom data layer to save polygon idx CustomData_add_layer_named(&em->fdata, CD_RECAST, CD_CALLOC, NULL, 0, "recastData"); diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index fe79ed9e532..464f676b7f6 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -2493,7 +2493,7 @@ static void rna_def_modifier_screw(BlenderRNA *brna) static void rna_def_modifier_navmesh(BlenderRNA *brna) { StructRNA *srna; - PropertyRNA *prop; + /* PropertyRNA *prop; */ /* UNUSED */ srna= RNA_def_struct(brna, "NavMeshModifier", "Modifier"); RNA_def_struct_ui_text(srna, "NavMesh Modifier", "NavMesh modifier"); diff --git a/source/gameengine/Expressions/IfExpr.h b/source/gameengine/Expressions/IfExpr.h index 5ac8d835afd..e67134c2271 100644 --- a/source/gameengine/Expressions/IfExpr.h +++ b/source/gameengine/Expressions/IfExpr.h @@ -20,7 +20,7 @@ #if !defined(AFX_IFEXPR_H__1F691841_C5C7_11D1_A863_0000B4542BD8__INCLUDED_) #define AFX_IFEXPR_H__1F691841_C5C7_11D1_A863_0000B4542BD8__INCLUDED_ -#if _MSC_VER >= 1000 +#if defined(_MSC_VER) && _MSC_VER >= 1000 #pragma once #endif // _MSC_VER >= 1000 diff --git a/source/gameengine/Ketsji/KX_NavMeshObject.cpp b/source/gameengine/Ketsji/KX_NavMeshObject.cpp index 293fc6eaa08..9fd87b03d29 100644 --- a/source/gameengine/Ketsji/KX_NavMeshObject.cpp +++ b/source/gameengine/Ketsji/KX_NavMeshObject.cpp @@ -237,7 +237,7 @@ bool KX_NavMeshObject::BuildVertIndArrays(float *&vertices, int& nverts, copy_v3_v3(vert, pos); else { - memset(vert, NULL, 3*sizeof(float)); //vertex isn't in any poly, set dummy zero coordinates + memset(vert, 0, 3*sizeof(float)); //vertex isn't in any poly, set dummy zero coordinates } vert+=3; } diff --git a/source/gameengine/VideoTexture/blendVideoTex.cpp b/source/gameengine/VideoTexture/blendVideoTex.cpp index 2cb3831de52..e7244265fc4 100644 --- a/source/gameengine/VideoTexture/blendVideoTex.cpp +++ b/source/gameengine/VideoTexture/blendVideoTex.cpp @@ -112,7 +112,7 @@ static PyMethodDef moduleMethods[] = {NULL} /* Sentinel */ }; -#if WITH_FFMPEG +#ifdef WITH_FFMPEG extern PyTypeObject VideoFFmpegType; extern PyTypeObject ImageFFmpegType; #endif @@ -134,7 +134,7 @@ extern PyTypeObject ImageViewportType; static void registerAllTypes(void) { -#if WITH_FFMPEG +#ifdef WITH_FFMPEG pyImageTypes.add(&VideoFFmpegType, "VideoFFmpeg"); pyImageTypes.add(&ImageFFmpegType, "ImageFFmpeg"); #endif From 322dbc9a0fa7d0e1c82fa2968728cbfc5c536445 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 10 Sep 2011 12:07:16 +0000 Subject: [PATCH 182/182] use vertex arrays for wireframe octahedral bone drawing. --- .../editors/space_view3d/drawarmature.c | 148 +++++++++--------- 1 file changed, 72 insertions(+), 76 deletions(-) diff --git a/source/blender/editors/space_view3d/drawarmature.c b/source/blender/editors/space_view3d/drawarmature.c index ecf5df4af7c..4aec1a8e61c 100644 --- a/source/blender/editors/space_view3d/drawarmature.c +++ b/source/blender/editors/space_view3d/drawarmature.c @@ -85,7 +85,7 @@ enum { PCHAN_COLOR_SPHEREBONE_BASE, /* for the 'stick' of sphere (envelope) bones */ PCHAN_COLOR_SPHEREBONE_END, /* for the ends of sphere (envelope) bones */ PCHAN_COLOR_LINEBONE /* for the middle of line-bones */ -}; +}; /* This function sets the color-set for coloring a certain bone */ static void set_pchan_colorset (Object *ob, bPoseChannel *pchan) @@ -437,43 +437,64 @@ static void draw_bonevert_solid(void) glCallList(displist); } +static float bone_octahedral_verts[6][3]= { + { 0.0f, 0.0f, 0.0f}, + { 0.1f, 0.1f, 0.1f}, + { 0.1f, 0.1f, -0.1f}, + {-0.1f, 0.1f, -0.1f}, + {-0.1f, 0.1f, 0.1f}, + { 0.0f, 1.0f, 0.0f} +}; + +static unsigned int bone_octahedral_wire_sides[8]= {0, 1, 5, 3, 0, 4, 5, 2}; +static unsigned int bone_octahedral_wire_square[8]= {1, 2, 3, 4, 1}; + +static unsigned int bone_octahedral_solid_tris[8][3]= { + {2, 1, 0}, /* bottom */ + {3, 2, 0}, + {4, 3, 0}, + {1, 4, 0}, + + {5, 1, 2}, /* top */ + {5, 2, 3}, + {5, 3, 4}, + {5, 4, 1} +}; + +/* aligned with bone_octahedral_solid_tris */ +static float bone_octahedral_solid_normals[8][3]= { + { 0.70710683f, -0.70710683f, 0.00000000f}, + {-0.00000000f, -0.70710683f, -0.70710683f}, + {-0.70710683f, -0.70710683f, 0.00000000f}, + { 0.00000000f, -0.70710683f, 0.70710683f}, + { 0.99388373f, 0.11043154f, -0.00000000f}, + { 0.00000000f, 0.11043154f, -0.99388373f}, + {-0.99388373f, 0.11043154f, 0.00000000f}, + { 0.00000000f, 0.11043154f, 0.99388373f} +}; + static void draw_bone_octahedral(void) { static GLuint displist=0; if (displist == 0) { - float vec[6][3]; - displist= glGenLists(1); glNewList(displist, GL_COMPILE); - - vec[0][0]= vec[0][1]= vec[0][2]= 0.0f; - vec[5][0]= vec[5][2]= 0.0f; vec[5][1]= 1.0f; - - vec[1][0]= 0.1f; vec[1][2]= 0.1f; vec[1][1]= 0.1f; - vec[2][0]= 0.1f; vec[2][2]= -0.1f; vec[2][1]= 0.1f; - vec[3][0]= -0.1f; vec[3][2]= -0.1f; vec[3][1]= 0.1f; - vec[4][0]= -0.1f; vec[4][2]= 0.1f; vec[4][1]= 0.1f; - + /* Section 1, sides */ - glBegin(GL_LINE_LOOP); - glVertex3fv(vec[0]); - glVertex3fv(vec[1]); - glVertex3fv(vec[5]); - glVertex3fv(vec[3]); - glVertex3fv(vec[0]); - glVertex3fv(vec[4]); - glVertex3fv(vec[5]); - glVertex3fv(vec[2]); - glEnd(); - + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(3, GL_FLOAT, 0, bone_octahedral_verts); + glDrawElements(GL_LINE_LOOP, + sizeof(bone_octahedral_wire_sides)/sizeof(*bone_octahedral_wire_sides), + GL_UNSIGNED_INT, + bone_octahedral_wire_sides); + /* Section 1, square */ - glBegin(GL_LINE_LOOP); - glVertex3fv(vec[1]); - glVertex3fv(vec[2]); - glVertex3fv(vec[3]); - glVertex3fv(vec[4]); - glEnd(); + glDrawElements(GL_LINE_LOOP, + sizeof(bone_octahedral_wire_square)/sizeof(*bone_octahedral_wire_square), + GL_UNSIGNED_INT, + bone_octahedral_wire_square); + glDisableClientState(GL_VERTEX_ARRAY); glEndList(); } @@ -484,59 +505,34 @@ static void draw_bone_octahedral(void) static void draw_bone_solid_octahedral(void) { static GLuint displist=0; - + if (displist == 0) { - float vec[6][3], nor[3]; - + int i; + displist= glGenLists(1); glNewList(displist, GL_COMPILE); - - vec[0][0]= vec[0][1]= vec[0][2]= 0.0f; - vec[5][0]= vec[5][2]= 0.0f; vec[5][1]= 1.0f; - - vec[1][0]= 0.1f; vec[1][2]= 0.1f; vec[1][1]= 0.1f; - vec[2][0]= 0.1f; vec[2][2]= -0.1f; vec[2][1]= 0.1f; - vec[3][0]= -0.1f; vec[3][2]= -0.1f; vec[3][1]= 0.1f; - vec[4][0]= -0.1f; vec[4][2]= 0.1f; vec[4][1]= 0.1f; - - + +#if 1 glBegin(GL_TRIANGLES); - /* bottom */ - normal_tri_v3( nor,vec[2], vec[1], vec[0]); - glNormal3fv(nor); - glVertex3fv(vec[2]); glVertex3fv(vec[1]); glVertex3fv(vec[0]); - - normal_tri_v3( nor,vec[3], vec[2], vec[0]); - glNormal3fv(nor); - glVertex3fv(vec[3]); glVertex3fv(vec[2]); glVertex3fv(vec[0]); - - normal_tri_v3( nor,vec[4], vec[3], vec[0]); - glNormal3fv(nor); - glVertex3fv(vec[4]); glVertex3fv(vec[3]); glVertex3fv(vec[0]); + for(i= 0; i < 8; i++) { + glNormal3fv(bone_octahedral_solid_normals[i]); + glVertex3fv(bone_octahedral_verts[bone_octahedral_solid_tris[i][0]]); + glVertex3fv(bone_octahedral_verts[bone_octahedral_solid_tris[i][1]]); + glVertex3fv(bone_octahedral_verts[bone_octahedral_solid_tris[i][2]]); + } - normal_tri_v3( nor,vec[1], vec[4], vec[0]); - glNormal3fv(nor); - glVertex3fv(vec[1]); glVertex3fv(vec[4]); glVertex3fv(vec[0]); - - /* top */ - normal_tri_v3( nor,vec[5], vec[1], vec[2]); - glNormal3fv(nor); - glVertex3fv(vec[5]); glVertex3fv(vec[1]); glVertex3fv(vec[2]); - - normal_tri_v3( nor,vec[5], vec[2], vec[3]); - glNormal3fv(nor); - glVertex3fv(vec[5]); glVertex3fv(vec[2]); glVertex3fv(vec[3]); - - normal_tri_v3( nor,vec[5], vec[3], vec[4]); - glNormal3fv(nor); - glVertex3fv(vec[5]); glVertex3fv(vec[3]); glVertex3fv(vec[4]); - - normal_tri_v3( nor,vec[5], vec[4], vec[1]); - glNormal3fv(nor); - glVertex3fv(vec[5]); glVertex3fv(vec[4]); glVertex3fv(vec[1]); - glEnd(); - + +#else /* not working because each vert needs a different normal */ + glEnableClientState(GL_NORMAL_ARRAY); + glEnableClientState(GL_VERTEX_ARRAY); + glNormalPointer(GL_FLOAT, 0, bone_octahedral_solid_normals); + glVertexPointer(3, GL_FLOAT, 0, bone_octahedral_verts); + glDrawElements(GL_TRIANGLES, sizeof(bone_octahedral_solid_tris)/sizeof(unsigned int), GL_UNSIGNED_INT, bone_octahedral_solid_tris); + glDisableClientState(GL_NORMAL_ARRAY); + glDisableClientState(GL_VERTEX_ARRAY); +#endif + glEndList(); }