From 53bb3472eac8ffb1ccb511207f19d1dc71bbeb44 Mon Sep 17 00:00:00 2001 From: hhalen Date: Mon, 8 Apr 2019 18:48:16 -0700 Subject: [PATCH 01/11] Fix skinning weight normalization. Previous code would call Normalized() on a Vec4f containing the weights. This normalizes the vector, i.e. makes the length of the vector equal to 1.0. For skinning weights what we want is the sum of the weights to be 1.0, which is a different. This commit fixes that. --- src/fbx/FbxSkinningAccess.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/fbx/FbxSkinningAccess.cpp b/src/fbx/FbxSkinningAccess.cpp index f76d8ec..795cece 100644 --- a/src/fbx/FbxSkinningAccess.cpp +++ b/src/fbx/FbxSkinningAccess.cpp @@ -75,7 +75,8 @@ FbxSkinningAccess::FbxSkinningAccess(const FbxMesh* pMesh, FbxScene* pScene, Fbx } } for (int i = 0; i < controlPointCount; i++) { - vertexJointWeights[i] = vertexJointWeights[i].Normalized(); + const float weightSumRcp = 1.0 / (vertexJointWeights[i][0] + vertexJointWeights[i][1] + vertexJointWeights[i][2] + vertexJointWeights[i][3]); + vertexJointWeights[i] *= weightSumRcp; } } } From a7b9f80e328e49973f60cbf69a4846c327b74e42 Mon Sep 17 00:00:00 2001 From: hhalen Date: Wed, 10 Apr 2019 13:11:24 -0700 Subject: [PATCH 02/11] Add support for 8 bone influences per vertex. This generalizes FbxSkinningAccess to be agnostic to vertex types and support any number of bone influences. RawModel and Raw2Gltf still operates on (multiple) Vec4f Vec4i types for per vertex weights and bone ids. A good second step would be to generalize RawModel as well, though AddAttributeToPrimitive, GetAttributeArray and the attribute pointer in AttributeDefinition complicates this. --- src/FBX2glTF.cpp | 2 +- src/fbx/Fbx2Raw.cpp | 79 +++++++++++++++++++---------------- src/fbx/FbxSkinningAccess.cpp | 20 +++++---- src/fbx/FbxSkinningAccess.hpp | 36 ++++++++++------ src/gltf/Raw2Gltf.cpp | 26 ++++++++++-- src/raw/RawModel.cpp | 39 +++++++++++------ src/raw/RawModel.hpp | 12 ++++-- 7 files changed, 136 insertions(+), 78 deletions(-) diff --git a/src/FBX2glTF.cpp b/src/FBX2glTF.cpp index 270fcd7..430cabc 100644 --- a/src/FBX2glTF.cpp +++ b/src/FBX2glTF.cpp @@ -144,7 +144,7 @@ int main(int argc, char* argv[]) { "-k,--keep-attribute", [&](std::vector attributes) -> bool { gltfOptions.keepAttribs = - RAW_VERTEX_ATTRIBUTE_JOINT_INDICES | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS; + RAW_VERTEX_ATTRIBUTE_JOINT_INDICES0 | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS0 | RAW_VERTEX_ATTRIBUTE_JOINT_INDICES1 | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS1; for (std::string attribute : attributes) { if (attribute == "position") { gltfOptions.keepAttribs |= RAW_VERTEX_ATTRIBUTE_POSITION; diff --git a/src/fbx/Fbx2Raw.cpp b/src/fbx/Fbx2Raw.cpp index 9a11bdd..31aa086 100644 --- a/src/fbx/Fbx2Raw.cpp +++ b/src/fbx/Fbx2Raw.cpp @@ -69,6 +69,27 @@ static RawMaterialType GetMaterialType( return skinned ? RAW_MATERIAL_TYPE_SKINNED_OPAQUE : RAW_MATERIAL_TYPE_OPAQUE; } +static void calcMinMax(RawSurface& rawSurface, const FbxSkinningAccess& skinning, const FbxVector4& globalPosition, const Vec4i& indices, const Vec4f& weights) { + for (int i = 0; i < 4; i++) { + if (weights[i] > 0.0f) { + const FbxVector4 localPosition = + skinning.GetJointInverseGlobalTransforms(indices[i]).MultNormalize(globalPosition); + + Vec3f& mins = rawSurface.jointGeometryMins[indices[i]]; + mins[0] = std::min(mins[0], (float)localPosition[0]); + mins[1] = std::min(mins[1], (float)localPosition[1]); + mins[2] = std::min(mins[2], (float)localPosition[2]); + + Vec3f& maxs = rawSurface.jointGeometryMaxs[indices[i]]; + maxs[0] = std::max(maxs[0], (float)localPosition[0]); + maxs[1] = std::max(maxs[1], (float)localPosition[1]); + maxs[2] = std::max(maxs[2], (float)localPosition[2]); + } + } +} + + + static void ReadMesh( RawModel& raw, FbxScene* pScene, @@ -159,8 +180,15 @@ static void ReadMesh( raw.AddVertexAttribute(RAW_VERTEX_ATTRIBUTE_UV1); } if (skinning.IsSkinned()) { - raw.AddVertexAttribute(RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS); - raw.AddVertexAttribute(RAW_VERTEX_ATTRIBUTE_JOINT_INDICES); + FBX_ASSERT(skinning.MaxWeights() <= 8); // output only supports up to 8 + + raw.AddVertexAttribute(RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS0); + raw.AddVertexAttribute(RAW_VERTEX_ATTRIBUTE_JOINT_INDICES0); + if (skinning.MaxWeights() > 4) { + raw.AddVertexAttribute(RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS1); + raw.AddVertexAttribute(RAW_VERTEX_ATTRIBUTE_JOINT_INDICES1); + } + } RawSurface& rawSurface = raw.GetSurface(rawSurfaceIndex); @@ -342,8 +370,10 @@ static void ReadMesh( vertex.uv0[1] = (float)fbxUV0[1]; vertex.uv1[0] = (float)fbxUV1[0]; vertex.uv1[1] = (float)fbxUV1[1]; - vertex.jointIndices = skinning.GetVertexIndices(controlPointIndex); - vertex.jointWeights = skinning.GetVertexWeights(controlPointIndex); + vertex.jointIndices0 = skinning.GetVertexIndices(controlPointIndex, 0); + vertex.jointWeights0 = skinning.GetVertexWeights(controlPointIndex, 0); + vertex.jointIndices1 = skinning.GetVertexIndices(controlPointIndex, 1); + vertex.jointWeights1 = skinning.GetVertexWeights(controlPointIndex, 1); vertex.polarityUv0 = false; // flag this triangle as transparent if any of its corner vertices substantially deviates from @@ -387,38 +417,15 @@ static void ReadMesh( } if (skinning.IsSkinned()) { - const int jointIndices[FbxSkinningAccess::MAX_WEIGHTS] = {vertex.jointIndices[0], - vertex.jointIndices[1], - vertex.jointIndices[2], - vertex.jointIndices[3]}; - const float jointWeights[FbxSkinningAccess::MAX_WEIGHTS] = {vertex.jointWeights[0], - vertex.jointWeights[1], - vertex.jointWeights[2], - vertex.jointWeights[3]}; - const FbxMatrix skinningMatrix = - skinning.GetJointSkinningTransform(jointIndices[0]) * jointWeights[0] + - skinning.GetJointSkinningTransform(jointIndices[1]) * jointWeights[1] + - skinning.GetJointSkinningTransform(jointIndices[2]) * jointWeights[2] + - skinning.GetJointSkinningTransform(jointIndices[3]) * jointWeights[3]; - - const FbxVector4 globalPosition = skinningMatrix.MultNormalize(fbxPosition); - for (int i = 0; i < FbxSkinningAccess::MAX_WEIGHTS; i++) { - if (jointWeights[i] > 0.0f) { - const FbxVector4 localPosition = - skinning.GetJointInverseGlobalTransforms(jointIndices[i]) - .MultNormalize(globalPosition); - - Vec3f& mins = rawSurface.jointGeometryMins[jointIndices[i]]; - mins[0] = std::min(mins[0], (float)localPosition[0]); - mins[1] = std::min(mins[1], (float)localPosition[1]); - mins[2] = std::min(mins[2], (float)localPosition[2]); - - Vec3f& maxs = rawSurface.jointGeometryMaxs[jointIndices[i]]; - maxs[0] = std::max(maxs[0], (float)localPosition[0]); - maxs[1] = std::max(maxs[1], (float)localPosition[1]); - maxs[2] = std::max(maxs[2], (float)localPosition[2]); - } - } + FbxMatrix skinningMatrix = FbxMatrix() * 0.0; + for (int j = 0; j < 4; j++) + skinningMatrix += skinning.GetJointSkinningTransform(vertex.jointIndices0[j]) * vertex.jointWeights0[j]; + for (int j = 0; j < 4; j++) + skinningMatrix += skinning.GetJointSkinningTransform(vertex.jointIndices1[j]) * vertex.jointWeights1[j]; + + const FbxVector4 globalPosition = skinningMatrix.MultNormalize(fbxPosition); + calcMinMax(rawSurface, skinning, globalPosition, vertex.jointIndices0, vertex.jointWeights0); + calcMinMax(rawSurface, skinning, globalPosition, vertex.jointIndices1, vertex.jointWeights1); } } diff --git a/src/fbx/FbxSkinningAccess.cpp b/src/fbx/FbxSkinningAccess.cpp index 795cece..e57bc90 100644 --- a/src/fbx/FbxSkinningAccess.cpp +++ b/src/fbx/FbxSkinningAccess.cpp @@ -20,8 +20,8 @@ FbxSkinningAccess::FbxSkinningAccess(const FbxMesh* pMesh, FbxScene* pScene, Fbx continue; } int controlPointCount = pMesh->GetControlPointsCount(); - vertexJointIndices.resize(controlPointCount, Vec4i(0, 0, 0, 0)); - vertexJointWeights.resize(controlPointCount, Vec4f(0.0f, 0.0f, 0.0f, 0.0f)); + vertexJointIndices.resize(controlPointCount); + vertexJointWeights.resize(controlPointCount); for (int clusterIndex = 0; clusterIndex < clusterCount; clusterIndex++) { FbxCluster* cluster = skin->GetCluster(clusterIndex); @@ -55,12 +55,12 @@ FbxSkinningAccess::FbxSkinningAccess(const FbxMesh* pMesh, FbxScene* pScene, Fbx if (clusterIndices[i] < 0 || clusterIndices[i] >= controlPointCount) { continue; } - if (clusterWeights[i] <= vertexJointWeights[clusterIndices[i]][MAX_WEIGHTS - 1]) { + if (clusterWeights[i] <= 0.0 || vertexJointWeights[clusterIndices[i]].size() >= MAX_WEIGHTS) { continue; } - vertexJointIndices[clusterIndices[i]][MAX_WEIGHTS - 1] = clusterIndex; - vertexJointWeights[clusterIndices[i]][MAX_WEIGHTS - 1] = (float)clusterWeights[i]; - for (int j = MAX_WEIGHTS - 1; j > 0; j--) { + vertexJointIndices[clusterIndices[i]].push_back(clusterIndex); + vertexJointWeights[clusterIndices[i]].push_back((float)clusterWeights[i]); + for (int j = vertexJointWeights[clusterIndices[i]].size() - 1; j > 0; j--) { if (vertexJointWeights[clusterIndices[i]][j - 1] >= vertexJointWeights[clusterIndices[i]][j]) { break; @@ -75,8 +75,12 @@ FbxSkinningAccess::FbxSkinningAccess(const FbxMesh* pMesh, FbxScene* pScene, Fbx } } for (int i = 0; i < controlPointCount; i++) { - const float weightSumRcp = 1.0 / (vertexJointWeights[i][0] + vertexJointWeights[i][1] + vertexJointWeights[i][2] + vertexJointWeights[i][3]); - vertexJointWeights[i] *= weightSumRcp; + float weightSum = 0.0; + for (int w = 0; w < vertexJointWeights[i].size(); ++w) + weightSum += vertexJointWeights[i][w]; + float weightSumRcp = 1.0 / weightSum; + for (int w = 0; w < vertexJointWeights[i].size(); ++w) + vertexJointWeights[i][w] *= weightSumRcp; } } } diff --git a/src/fbx/FbxSkinningAccess.hpp b/src/fbx/FbxSkinningAccess.hpp index d2b42d8..aa4e6c7 100644 --- a/src/fbx/FbxSkinningAccess.hpp +++ b/src/fbx/FbxSkinningAccess.hpp @@ -21,7 +21,7 @@ class FbxSkinningAccess { public: - static const int MAX_WEIGHTS = 4; + static const int MAX_WEIGHTS = 8; FbxSkinningAccess(const FbxMesh* pMesh, FbxScene* pScene, FbxNode* pNode); @@ -29,6 +29,10 @@ class FbxSkinningAccess { return (vertexJointWeights.size() > 0); } + int MaxWeights() const { + return MAX_WEIGHTS; + } + int GetNodeCount() const { return (int)jointNodes.size(); } @@ -58,15 +62,23 @@ class FbxSkinningAccess { return inverseBindMatrices[jointIndex]; } - const Vec4i GetVertexIndices(const int controlPointIndex) const { - return (!vertexJointIndices.empty()) ? vertexJointIndices[controlPointIndex] - : Vec4i(0, 0, 0, 0); - } - - const Vec4f GetVertexWeights(const int controlPointIndex) const { - return (!vertexJointWeights.empty()) ? vertexJointWeights[controlPointIndex] - : Vec4f(0, 0, 0, 0); - } + const Vec4i GetVertexIndices(const int controlPointIndex, const int subset) const { + if (vertexJointIndices.empty()) + return Vec4i(0, 0, 0, 0); + Vec4i indices(0, 0, 0, 0); + for (int k = subset * 4; k < subset * 4 + 4 && k < vertexJointIndices[controlPointIndex].size(); k++) + indices[k - subset * 4] = vertexJointIndices[controlPointIndex][k]; + return indices; + } + + const Vec4f GetVertexWeights(const int controlPointIndex, const int subset) const { + if (vertexJointWeights.empty()) + return Vec4f(0.0f); + Vec4f weights(0.0f); + for (int k = subset * 4; k < subset * 4 + 4 && k < vertexJointWeights[controlPointIndex].size(); k++) + weights[k - subset * 4] = vertexJointWeights[controlPointIndex][k]; + return weights; + } private: int rootIndex; @@ -75,6 +87,6 @@ class FbxSkinningAccess { std::vector jointSkinningTransforms; std::vector jointInverseGlobalTransforms; std::vector inverseBindMatrices; - std::vector vertexJointIndices; - std::vector vertexJointWeights; + std::vector> vertexJointIndices; + std::vector> vertexJointWeights; }; diff --git a/src/gltf/Raw2Gltf.cpp b/src/gltf/Raw2Gltf.cpp index 84ec82b..3ed539e 100644 --- a/src/gltf/Raw2Gltf.cpp +++ b/src/gltf/Raw2Gltf.cpp @@ -532,24 +532,42 @@ ModelData* Raw2Gltf( draco::DT_FLOAT32); gltf->AddAttributeToPrimitive(buffer, surfaceModel, *primitive, ATTR_TEXCOORD_1); } - if ((surfaceModel.GetVertexAttributes() & RAW_VERTEX_ATTRIBUTE_JOINT_INDICES) != 0) { + if ((surfaceModel.GetVertexAttributes() & RAW_VERTEX_ATTRIBUTE_JOINT_INDICES0) != 0) { const AttributeDefinition ATTR_JOINTS( "JOINTS_0", - &RawVertex::jointIndices, + &RawVertex::jointIndices0, GLT_VEC4I, draco::GeometryAttribute::GENERIC, draco::DT_UINT16); gltf->AddAttributeToPrimitive(buffer, surfaceModel, *primitive, ATTR_JOINTS); } - if ((surfaceModel.GetVertexAttributes() & RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS) != 0) { + if ((surfaceModel.GetVertexAttributes() & RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS0) != 0) { const AttributeDefinition ATTR_WEIGHTS( "WEIGHTS_0", - &RawVertex::jointWeights, + &RawVertex::jointWeights0, GLT_VEC4F, draco::GeometryAttribute::GENERIC, draco::DT_FLOAT32); gltf->AddAttributeToPrimitive(buffer, surfaceModel, *primitive, ATTR_WEIGHTS); } + if ((surfaceModel.GetVertexAttributes() & RAW_VERTEX_ATTRIBUTE_JOINT_INDICES1) != 0) { + const AttributeDefinition ATTR_JOINTS( + "JOINTS_1", + &RawVertex::jointIndices1, + GLT_VEC4I, + draco::GeometryAttribute::GENERIC, + draco::DT_UINT16); + gltf->AddAttributeToPrimitive(buffer, surfaceModel, *primitive, ATTR_JOINTS); + } + if ((surfaceModel.GetVertexAttributes() & RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS1) != 0) { + const AttributeDefinition ATTR_WEIGHTS( + "WEIGHTS_1", + &RawVertex::jointWeights1, + GLT_VEC4F, + draco::GeometryAttribute::GENERIC, + draco::DT_FLOAT32); + gltf->AddAttributeToPrimitive(buffer, surfaceModel, *primitive, ATTR_WEIGHTS); + } // each channel present in the mesh always ends up a target in the primitive for (int channelIx = 0; channelIx < rawSurface.blendChannels.size(); channelIx++) { diff --git a/src/raw/RawModel.cpp b/src/raw/RawModel.cpp index cafc076..19c4fd5 100644 --- a/src/raw/RawModel.cpp +++ b/src/raw/RawModel.cpp @@ -26,8 +26,9 @@ bool RawVertex::operator==(const RawVertex& other) const { return (position == other.position) && (normal == other.normal) && (tangent == other.tangent) && (binormal == other.binormal) && (color == other.color) && (uv0 == other.uv0) && - (uv1 == other.uv1) && (jointIndices == other.jointIndices) && - (jointWeights == other.jointWeights) && (polarityUv0 == other.polarityUv0) && + (uv1 == other.uv1) && (jointIndices0 == other.jointIndices0) && + (jointWeights0 == other.jointWeights0) && (jointIndices1 == other.jointIndices1) && + (jointWeights1 == other.jointWeights1) && (polarityUv0 == other.polarityUv0) && (blendSurfaceIx == other.blendSurfaceIx) && (blends == other.blends); } @@ -55,11 +56,17 @@ size_t RawVertex::Difference(const RawVertex& other) const { attributes |= RAW_VERTEX_ATTRIBUTE_UV1; } // Always need both or neither. - if (jointIndices != other.jointIndices) { - attributes |= RAW_VERTEX_ATTRIBUTE_JOINT_INDICES | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS; - } - if (jointWeights != other.jointWeights) { - attributes |= RAW_VERTEX_ATTRIBUTE_JOINT_INDICES | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS; + if (jointIndices0 != other.jointIndices0) { + attributes |= RAW_VERTEX_ATTRIBUTE_JOINT_INDICES0 | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS0; + } + if (jointWeights0 != other.jointWeights0) { + attributes |= RAW_VERTEX_ATTRIBUTE_JOINT_INDICES0 | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS0; + } + if (jointIndices1 != other.jointIndices1) { + attributes |= RAW_VERTEX_ATTRIBUTE_JOINT_INDICES1 | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS1; + } + if (jointWeights1 != other.jointWeights1) { + attributes |= RAW_VERTEX_ATTRIBUTE_JOINT_INDICES1 | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS1; } return attributes; } @@ -573,7 +580,7 @@ void RawModel::CreateMaterialModels( if (keepAttribs != -1) { int keep = keepAttribs; if ((keepAttribs & RAW_VERTEX_ATTRIBUTE_POSITION) != 0) { - keep |= RAW_VERTEX_ATTRIBUTE_JOINT_INDICES | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS; + keep |= RAW_VERTEX_ATTRIBUTE_JOINT_INDICES0 | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS0 | RAW_VERTEX_ATTRIBUTE_JOINT_INDICES1 | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS1; } if ((keepAttribs & RAW_VERTEX_ATTRIBUTE_AUTO) != 0) { keep |= RAW_VERTEX_ATTRIBUTE_POSITION; @@ -614,11 +621,17 @@ void RawModel::CreateMaterialModels( if ((keep & RAW_VERTEX_ATTRIBUTE_UV1) == 0) { vertex.uv1 = defaultVertex.uv1; } - if ((keep & RAW_VERTEX_ATTRIBUTE_JOINT_INDICES) == 0) { - vertex.jointIndices = defaultVertex.jointIndices; - } - if ((keep & RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS) == 0) { - vertex.jointWeights = defaultVertex.jointWeights; + if ((keep & RAW_VERTEX_ATTRIBUTE_JOINT_INDICES0) == 0) { + vertex.jointIndices0 = defaultVertex.jointIndices0; + } + if ((keep & RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS0) == 0) { + vertex.jointWeights0 = defaultVertex.jointWeights0; + } + if ((keep & RAW_VERTEX_ATTRIBUTE_JOINT_INDICES1) == 0) { + vertex.jointIndices1 = defaultVertex.jointIndices1; + } + if ((keep & RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS1) == 0) { + vertex.jointWeights1 = defaultVertex.jointWeights1; } } diff --git a/src/raw/RawModel.hpp b/src/raw/RawModel.hpp index c21c4bb..d09f0c3 100644 --- a/src/raw/RawModel.hpp +++ b/src/raw/RawModel.hpp @@ -23,8 +23,10 @@ enum RawVertexAttribute { RAW_VERTEX_ATTRIBUTE_COLOR = 1 << 4, RAW_VERTEX_ATTRIBUTE_UV0 = 1 << 5, RAW_VERTEX_ATTRIBUTE_UV1 = 1 << 6, - RAW_VERTEX_ATTRIBUTE_JOINT_INDICES = 1 << 7, - RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS = 1 << 8, + RAW_VERTEX_ATTRIBUTE_JOINT_INDICES0 = 1 << 7, + RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS0 = 1 << 8, + RAW_VERTEX_ATTRIBUTE_JOINT_INDICES1 = 1 << 9, + RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS1 = 1 << 10, RAW_VERTEX_ATTRIBUTE_AUTO = 1 << 31 }; @@ -49,8 +51,10 @@ struct RawVertex { Vec4f color{0.0f}; Vec2f uv0{0.0f}; Vec2f uv1{0.0f}; - Vec4i jointIndices{0, 0, 0, 0}; - Vec4f jointWeights{0.0f}; + Vec4i jointIndices0{0,0,0,0}; + Vec4i jointIndices1{0,0,0,0}; + Vec4f jointWeights0{0.0f}; + Vec4f jointWeights1{0.0f}; // end of members that directly correspond to vertex attributes // if this vertex participates in a blend shape setup, the surfaceIx of its dedicated mesh; From b6d7fd04f258f36c83ea438259fc440828a140e8 Mon Sep 17 00:00:00 2001 From: hhalen Date: Wed, 17 Apr 2019 19:00:08 -0700 Subject: [PATCH 03/11] Missing files for commit a7b9f8, adding up to 16 bone influences. --- src/FBX2glTF.cpp | 19 +++++- src/FBX2glTF.h | 4 ++ src/fbx/Fbx2Raw.cpp | 41 +++++-------- src/fbx/FbxSkinningAccess.cpp | 34 +++-------- src/fbx/FbxSkinningAccess.hpp | 34 ++++------- src/gltf/GltfModel.hpp | 32 ++++++++++ src/gltf/Raw2Gltf.cpp | 70 ++++++++++++++++------ src/raw/RawModel.cpp | 108 ++++++++++++++++++++++++++++++---- src/raw/RawModel.hpp | 30 ++++++++-- 9 files changed, 263 insertions(+), 109 deletions(-) diff --git a/src/FBX2glTF.cpp b/src/FBX2glTF.cpp index 430cabc..b5ae8b0 100644 --- a/src/FBX2glTF.cpp +++ b/src/FBX2glTF.cpp @@ -140,11 +140,24 @@ int main(int argc, char* argv[]) { gltfOptions.useBlendShapeTangents, "Include blend shape tangents, if reported present by the FBX SDK."); + app.add_flag( + "--normalize-weights", + gltfOptions.normalizeSkinningWeights, + "Normalize skinning weights."); + + app.add_option( + "--skinning-weights", + gltfOptions.maxSkinningWeights, + "How many joint influences per vertex are allowed.", + true) + ->check(CLI::Range(1, RawModel::MAX_SUPPORTED_WEIGHTS)); + app.add_option( "-k,--keep-attribute", [&](std::vector attributes) -> bool { gltfOptions.keepAttribs = - RAW_VERTEX_ATTRIBUTE_JOINT_INDICES0 | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS0 | RAW_VERTEX_ATTRIBUTE_JOINT_INDICES1 | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS1; + RAW_VERTEX_ATTRIBUTE_JOINT_INDICES0 | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS0 | RAW_VERTEX_ATTRIBUTE_JOINT_INDICES1 | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS1 | + RAW_VERTEX_ATTRIBUTE_JOINT_INDICES2 | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS2 | RAW_VERTEX_ATTRIBUTE_JOINT_INDICES3 | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS3; for (std::string attribute : attributes) { if (attribute == "position") { gltfOptions.keepAttribs |= RAW_VERTEX_ATTRIBUTE_POSITION; @@ -204,7 +217,7 @@ int main(int argc, char* argv[]) { app.add_option( "--draco-bits-for-normals", gltfOptions.draco.quantBitsNormal, - "How many bits to quantize nornals to.", + "How many bits to quantize normals to.", true) ->check(CLI::Range(1, 32)) ->group("Draco"); @@ -310,7 +323,7 @@ int main(int argc, char* argv[]) { if (!texturesTransforms.empty()) { raw.TransformTextures(texturesTransforms); } - raw.Condense(); + raw.Condense(gltfOptions.maxSkinningWeights, gltfOptions.normalizeSkinningWeights); raw.TransformGeometry(gltfOptions.computeNormals); std::ofstream outStream; // note: auto-flushes in destructor diff --git a/src/FBX2glTF.h b/src/FBX2glTF.h index 5d3f07a..67b73cb 100644 --- a/src/FBX2glTF.h +++ b/src/FBX2glTF.h @@ -99,6 +99,10 @@ struct GltfOptions bool useBlendShapeNormals { false }; /** Whether to include blend shape tangents, if present according to the SDK. */ bool useBlendShapeTangents { false }; + /** Whether to normalized skinning weights. */ + bool normalizeSkinningWeights { true }; + /** Maximum number of bone influences per vertex. */ + int maxSkinningWeights { 4 }; /** When to compute vertex normals from geometry. */ ComputeNormalsOption computeNormals = ComputeNormalsOption::BROKEN; /** When to use 32-bit indices. */ diff --git a/src/fbx/Fbx2Raw.cpp b/src/fbx/Fbx2Raw.cpp index 31aa086..d4d2f29 100644 --- a/src/fbx/Fbx2Raw.cpp +++ b/src/fbx/Fbx2Raw.cpp @@ -69,18 +69,18 @@ static RawMaterialType GetMaterialType( return skinned ? RAW_MATERIAL_TYPE_SKINNED_OPAQUE : RAW_MATERIAL_TYPE_OPAQUE; } -static void calcMinMax(RawSurface& rawSurface, const FbxSkinningAccess& skinning, const FbxVector4& globalPosition, const Vec4i& indices, const Vec4f& weights) { - for (int i = 0; i < 4; i++) { - if (weights[i] > 0.0f) { +static void calcMinMax(RawSurface& rawSurface, const FbxSkinningAccess& skinning, const FbxVector4& globalPosition, const std::vector& indicesAndWeights) { + for (int i = 0; i < indicesAndWeights.size(); i++) { + if (indicesAndWeights[i].jointWeight > 0.0f) { const FbxVector4 localPosition = - skinning.GetJointInverseGlobalTransforms(indices[i]).MultNormalize(globalPosition); + skinning.GetJointInverseGlobalTransforms(indicesAndWeights[i].jointIndex).MultNormalize(globalPosition); - Vec3f& mins = rawSurface.jointGeometryMins[indices[i]]; + Vec3f& mins = rawSurface.jointGeometryMins[indicesAndWeights[i].jointIndex]; mins[0] = std::min(mins[0], (float)localPosition[0]); mins[1] = std::min(mins[1], (float)localPosition[1]); mins[2] = std::min(mins[2], (float)localPosition[2]); - Vec3f& maxs = rawSurface.jointGeometryMaxs[indices[i]]; + Vec3f& maxs = rawSurface.jointGeometryMaxs[indicesAndWeights[i].jointIndex]; maxs[0] = std::max(maxs[0], (float)localPosition[0]); maxs[1] = std::max(maxs[1], (float)localPosition[1]); maxs[2] = std::max(maxs[2], (float)localPosition[2]); @@ -179,17 +179,6 @@ static void ReadMesh( if (uvLayer1.LayerPresent()) { raw.AddVertexAttribute(RAW_VERTEX_ATTRIBUTE_UV1); } - if (skinning.IsSkinned()) { - FBX_ASSERT(skinning.MaxWeights() <= 8); // output only supports up to 8 - - raw.AddVertexAttribute(RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS0); - raw.AddVertexAttribute(RAW_VERTEX_ATTRIBUTE_JOINT_INDICES0); - if (skinning.MaxWeights() > 4) { - raw.AddVertexAttribute(RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS1); - raw.AddVertexAttribute(RAW_VERTEX_ATTRIBUTE_JOINT_INDICES1); - } - - } RawSurface& rawSurface = raw.GetSurface(rawSurfaceIndex); @@ -370,10 +359,11 @@ static void ReadMesh( vertex.uv0[1] = (float)fbxUV0[1]; vertex.uv1[0] = (float)fbxUV1[0]; vertex.uv1[1] = (float)fbxUV1[1]; - vertex.jointIndices0 = skinning.GetVertexIndices(controlPointIndex, 0); - vertex.jointWeights0 = skinning.GetVertexWeights(controlPointIndex, 0); - vertex.jointIndices1 = skinning.GetVertexIndices(controlPointIndex, 1); - vertex.jointWeights1 = skinning.GetVertexWeights(controlPointIndex, 1); + const std::vector skinningInfo = skinning.GetVertexSkinningInfo(controlPointIndex); + for (int skinningIndex = 0; skinningIndex < skinningInfo.size(); skinningIndex++) { + const FbxVertexSkinningInfo& sourceSkinningInfo = skinningInfo[skinningIndex]; + vertex.skinningInfo.push_back(RawVertexSkinningInfo{ sourceSkinningInfo.jointId, sourceSkinningInfo.weight }); + } vertex.polarityUv0 = false; // flag this triangle as transparent if any of its corner vertices substantially deviates from @@ -418,14 +408,11 @@ static void ReadMesh( if (skinning.IsSkinned()) { FbxMatrix skinningMatrix = FbxMatrix() * 0.0; - for (int j = 0; j < 4; j++) - skinningMatrix += skinning.GetJointSkinningTransform(vertex.jointIndices0[j]) * vertex.jointWeights0[j]; - for (int j = 0; j < 4; j++) - skinningMatrix += skinning.GetJointSkinningTransform(vertex.jointIndices1[j]) * vertex.jointWeights1[j]; + for (int j = 0; j < vertex.skinningInfo.size(); j++) + skinningMatrix += skinning.GetJointSkinningTransform(vertex.skinningInfo[j].jointIndex) * vertex.skinningInfo[j].jointWeight; const FbxVector4 globalPosition = skinningMatrix.MultNormalize(fbxPosition); - calcMinMax(rawSurface, skinning, globalPosition, vertex.jointIndices0, vertex.jointWeights0); - calcMinMax(rawSurface, skinning, globalPosition, vertex.jointIndices1, vertex.jointWeights1); + calcMinMax(rawSurface, skinning, globalPosition, vertex.skinningInfo); } } diff --git a/src/fbx/FbxSkinningAccess.cpp b/src/fbx/FbxSkinningAccess.cpp index e57bc90..b6a8541 100644 --- a/src/fbx/FbxSkinningAccess.cpp +++ b/src/fbx/FbxSkinningAccess.cpp @@ -20,8 +20,7 @@ FbxSkinningAccess::FbxSkinningAccess(const FbxMesh* pMesh, FbxScene* pScene, Fbx continue; } int controlPointCount = pMesh->GetControlPointsCount(); - vertexJointIndices.resize(controlPointCount); - vertexJointWeights.resize(controlPointCount); + vertexSkinning.resize(controlPointCount); for (int clusterIndex = 0; clusterIndex < clusterCount; clusterIndex++) { FbxCluster* cluster = skin->GetCluster(clusterIndex); @@ -55,33 +54,18 @@ FbxSkinningAccess::FbxSkinningAccess(const FbxMesh* pMesh, FbxScene* pScene, Fbx if (clusterIndices[i] < 0 || clusterIndices[i] >= controlPointCount) { continue; } - if (clusterWeights[i] <= 0.0 || vertexJointWeights[clusterIndices[i]].size() >= MAX_WEIGHTS) { + if (clusterWeights[i] <= 0.0) { continue; } - vertexJointIndices[clusterIndices[i]].push_back(clusterIndex); - vertexJointWeights[clusterIndices[i]].push_back((float)clusterWeights[i]); - for (int j = vertexJointWeights[clusterIndices[i]].size() - 1; j > 0; j--) { - if (vertexJointWeights[clusterIndices[i]][j - 1] >= - vertexJointWeights[clusterIndices[i]][j]) { - break; - } - std::swap( - vertexJointIndices[clusterIndices[i]][j - 1], - vertexJointIndices[clusterIndices[i]][j]); - std::swap( - vertexJointWeights[clusterIndices[i]][j - 1], - vertexJointWeights[clusterIndices[i]][j]); - } + + vertexSkinning[clusterIndices[i]].push_back(FbxVertexSkinningInfo{(int) clusterIndex, (float)clusterWeights[i]}); + } } - for (int i = 0; i < controlPointCount; i++) { - float weightSum = 0.0; - for (int w = 0; w < vertexJointWeights[i].size(); ++w) - weightSum += vertexJointWeights[i][w]; - float weightSumRcp = 1.0 / weightSum; - for (int w = 0; w < vertexJointWeights[i].size(); ++w) - vertexJointWeights[i][w] *= weightSumRcp; - } + + for (int i = 0; i < vertexSkinning.size(); i++) + maxBoneInfluences = std::max((int) vertexSkinning[i].size(), maxBoneInfluences); + } } diff --git a/src/fbx/FbxSkinningAccess.hpp b/src/fbx/FbxSkinningAccess.hpp index aa4e6c7..07b0fe9 100644 --- a/src/fbx/FbxSkinningAccess.hpp +++ b/src/fbx/FbxSkinningAccess.hpp @@ -19,19 +19,21 @@ #include "FBX2glTF.h" +struct FbxVertexSkinningInfo { + int jointId; + float weight; +}; + + class FbxSkinningAccess { public: - static const int MAX_WEIGHTS = 8; FbxSkinningAccess(const FbxMesh* pMesh, FbxScene* pScene, FbxNode* pNode); bool IsSkinned() const { - return (vertexJointWeights.size() > 0); + return (vertexSkinning.size() > 0); } - int MaxWeights() const { - return MAX_WEIGHTS; - } int GetNodeCount() const { return (int)jointNodes.size(); @@ -61,32 +63,18 @@ class FbxSkinningAccess { const FbxAMatrix& GetInverseBindMatrix(const int jointIndex) const { return inverseBindMatrices[jointIndex]; } - - const Vec4i GetVertexIndices(const int controlPointIndex, const int subset) const { - if (vertexJointIndices.empty()) - return Vec4i(0, 0, 0, 0); - Vec4i indices(0, 0, 0, 0); - for (int k = subset * 4; k < subset * 4 + 4 && k < vertexJointIndices[controlPointIndex].size(); k++) - indices[k - subset * 4] = vertexJointIndices[controlPointIndex][k]; - return indices; - } - const Vec4f GetVertexWeights(const int controlPointIndex, const int subset) const { - if (vertexJointWeights.empty()) - return Vec4f(0.0f); - Vec4f weights(0.0f); - for (int k = subset * 4; k < subset * 4 + 4 && k < vertexJointWeights[controlPointIndex].size(); k++) - weights[k - subset * 4] = vertexJointWeights[controlPointIndex][k]; - return weights; + const std::vector GetVertexSkinningInfo(const int controlPointIndex) const { + return vertexSkinning[controlPointIndex]; } private: int rootIndex; + int maxBoneInfluences; std::vector jointIds; std::vector jointNodes; std::vector jointSkinningTransforms; std::vector jointInverseGlobalTransforms; std::vector inverseBindMatrices; - std::vector> vertexJointIndices; - std::vector> vertexJointWeights; + std::vector> vertexSkinning; }; diff --git a/src/gltf/GltfModel.hpp b/src/gltf/GltfModel.hpp index f82b09f..4702c08 100644 --- a/src/gltf/GltfModel.hpp +++ b/src/gltf/GltfModel.hpp @@ -123,6 +123,38 @@ class GltfModel { return accessor; }; + template + std::shared_ptr AddArrayAttributeToPrimitive( + BufferData& buffer, + const RawModel& surfaceModel, + PrimitiveData& primitive, + const AttributeDefinition& attrDef) { + // copy attribute data into vector + std::vector> attribArr; + surfaceModel.GetAttributeArray(attribArr, attrDef.rawAttributeIx); + + const AttributeDefinition ATTR_WEIGHTS( + "WEIGHTS_0", + &RawVertex::jointWeights, + attrDef.glType, + attrDef.dracoAttribute, + draco::DT_FLOAT32); + + std::shared_ptr accessor; + if (attrDef.dracoComponentType != draco::DT_INVALID && primitive.dracoMesh != nullptr) { + primitive.AddDracoAttrib(attrDef, attribArr); + + accessor = accessors.hold(new AccessorData(attrDef.glType)); + accessor->count = attribArr.size(); + } + else { + auto bufferView = GetAlignedBufferView(buffer, BufferViewData::GL_ARRAY_BUFFER); + accessor = AddAccessorWithView(*bufferView, attrDef.glType, attribArr, std::string("")); + } + primitive.AddAttrib(attrDef.gltfName, *accessor); + return accessor; + }; + template void serializeHolder(json& glTFJson, std::string key, const Holder holder) { if (!holder.ptrs.empty()) { diff --git a/src/gltf/Raw2Gltf.cpp b/src/gltf/Raw2Gltf.cpp index 3ed539e..15834a9 100644 --- a/src/gltf/Raw2Gltf.cpp +++ b/src/gltf/Raw2Gltf.cpp @@ -550,23 +550,59 @@ ModelData* Raw2Gltf( draco::DT_FLOAT32); gltf->AddAttributeToPrimitive(buffer, surfaceModel, *primitive, ATTR_WEIGHTS); } - if ((surfaceModel.GetVertexAttributes() & RAW_VERTEX_ATTRIBUTE_JOINT_INDICES1) != 0) { - const AttributeDefinition ATTR_JOINTS( - "JOINTS_1", - &RawVertex::jointIndices1, - GLT_VEC4I, - draco::GeometryAttribute::GENERIC, - draco::DT_UINT16); - gltf->AddAttributeToPrimitive(buffer, surfaceModel, *primitive, ATTR_JOINTS); - } - if ((surfaceModel.GetVertexAttributes() & RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS1) != 0) { - const AttributeDefinition ATTR_WEIGHTS( - "WEIGHTS_1", - &RawVertex::jointWeights1, - GLT_VEC4F, - draco::GeometryAttribute::GENERIC, - draco::DT_FLOAT32); - gltf->AddAttributeToPrimitive(buffer, surfaceModel, *primitive, ATTR_WEIGHTS); + if ((surfaceModel.GetVertexAttributes() & RAW_VERTEX_ATTRIBUTE_JOINT_INDICES1) != 0) { + const AttributeDefinition ATTR_JOINTS( + "JOINTS_1", + &RawVertex::jointIndices1, + GLT_VEC4I, + draco::GeometryAttribute::GENERIC, + draco::DT_UINT16); + gltf->AddAttributeToPrimitive(buffer, surfaceModel, *primitive, ATTR_JOINTS); + } + if ((surfaceModel.GetVertexAttributes() & RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS1) != 0) { + const AttributeDefinition ATTR_WEIGHTS( + "WEIGHTS_1", + &RawVertex::jointWeights1, + GLT_VEC4F, + draco::GeometryAttribute::GENERIC, + draco::DT_FLOAT32); + gltf->AddAttributeToPrimitive(buffer, surfaceModel, *primitive, ATTR_WEIGHTS); + } + if ((surfaceModel.GetVertexAttributes() & RAW_VERTEX_ATTRIBUTE_JOINT_INDICES2) != 0) { + const AttributeDefinition ATTR_JOINTS( + "JOINTS_0", + &RawVertex::jointIndices2, + GLT_VEC4I, + draco::GeometryAttribute::GENERIC, + draco::DT_UINT16); + gltf->AddAttributeToPrimitive(buffer, surfaceModel, *primitive, ATTR_JOINTS); + } + if ((surfaceModel.GetVertexAttributes() & RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS2) != 0) { + const AttributeDefinition ATTR_WEIGHTS( + "WEIGHTS_0", + &RawVertex::jointWeights2, + GLT_VEC4F, + draco::GeometryAttribute::GENERIC, + draco::DT_FLOAT32); + gltf->AddAttributeToPrimitive(buffer, surfaceModel, *primitive, ATTR_WEIGHTS); + } + if ((surfaceModel.GetVertexAttributes() & RAW_VERTEX_ATTRIBUTE_JOINT_INDICES3) != 0) { + const AttributeDefinition ATTR_JOINTS( + "JOINTS_0", + &RawVertex::jointIndices3, + GLT_VEC4I, + draco::GeometryAttribute::GENERIC, + draco::DT_UINT16); + gltf->AddAttributeToPrimitive(buffer, surfaceModel, *primitive, ATTR_JOINTS); + } + if ((surfaceModel.GetVertexAttributes() & RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS3) != 0) { + const AttributeDefinition ATTR_WEIGHTS( + "WEIGHTS_0", + &RawVertex::jointWeights3, + GLT_VEC4F, + draco::GeometryAttribute::GENERIC, + draco::DT_FLOAT32); + gltf->AddAttributeToPrimitive(buffer, surfaceModel, *primitive, ATTR_WEIGHTS); } // each channel present in the mesh always ends up a target in the primitive diff --git a/src/raw/RawModel.cpp b/src/raw/RawModel.cpp index 19c4fd5..c63dba6 100644 --- a/src/raw/RawModel.cpp +++ b/src/raw/RawModel.cpp @@ -56,22 +56,22 @@ size_t RawVertex::Difference(const RawVertex& other) const { attributes |= RAW_VERTEX_ATTRIBUTE_UV1; } // Always need both or neither. - if (jointIndices0 != other.jointIndices0) { + if (jointIndices0 != other.jointIndices0 || jointWeights0 != other.jointWeights0) { attributes |= RAW_VERTEX_ATTRIBUTE_JOINT_INDICES0 | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS0; } - if (jointWeights0 != other.jointWeights0) { - attributes |= RAW_VERTEX_ATTRIBUTE_JOINT_INDICES0 | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS0; - } - if (jointIndices1 != other.jointIndices1) { + if (jointIndices1 != other.jointIndices1 || jointWeights1 != other.jointWeights1) { attributes |= RAW_VERTEX_ATTRIBUTE_JOINT_INDICES1 | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS1; } - if (jointWeights1 != other.jointWeights1) { - attributes |= RAW_VERTEX_ATTRIBUTE_JOINT_INDICES1 | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS1; + if (jointIndices2 != other.jointIndices2 || jointWeights2 != other.jointWeights2) { + attributes |= RAW_VERTEX_ATTRIBUTE_JOINT_INDICES2 | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS2; + } + if (jointIndices3 != other.jointIndices3 || jointWeights3 != other.jointWeights3) { + attributes |= RAW_VERTEX_ATTRIBUTE_JOINT_INDICES3 | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS3; } return attributes; } -RawModel::RawModel() : vertexAttributes(0) {} +RawModel::RawModel() : vertexAttributes(0){} void RawModel::AddVertexAttribute(const RawVertexAttribute attrib) { vertexAttributes |= attrib; @@ -334,7 +334,7 @@ int RawModel::AddNode(const long id, const char* name, const long parentId) { return (int)nodes.size() - 1; } -void RawModel::Condense() { +void RawModel::Condense(const int maxSkinningWeights, const bool normalizeWeights) { // Only keep surfaces that are referenced by one or more triangles. { std::vector oldSurfaces = surfaces; @@ -404,6 +404,81 @@ void RawModel::Condense() { } } } + + { + int globalMaxWeights = 0; + for (auto& vertex: vertices) { + + // Sort from largest to smallest weight. + std::sort(vertex.skinningInfo.begin(), vertex.skinningInfo.end(), std::greater()); + + // Reduce to fit the requirements. + if (maxSkinningWeights < vertex.skinningInfo.size()) + vertex.skinningInfo.resize(maxSkinningWeights); + globalMaxWeights = std::max(globalMaxWeights, (int) vertex.skinningInfo.size()); + + // Normalize weights if requested. + if (normalizeWeights) { + float weightSum = 0; + for (auto& jointWeight : vertex.skinningInfo) + weightSum += jointWeight.jointWeight; + const float weightSumRcp = 1.0 / weightSum; + for (auto& jointWeight : vertex.skinningInfo) + jointWeight.jointWeight *= weightSumRcp; + } + } + + if (globalMaxWeights > 0) { + AddVertexAttribute(RAW_VERTEX_ATTRIBUTE_JOINT_INDICES0); + AddVertexAttribute(RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS0); + } + if (globalMaxWeights > 1) { + AddVertexAttribute(RAW_VERTEX_ATTRIBUTE_JOINT_INDICES1); + AddVertexAttribute(RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS1); + } + if (globalMaxWeights > 2) { + AddVertexAttribute(RAW_VERTEX_ATTRIBUTE_JOINT_INDICES2); + AddVertexAttribute(RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS2); + } + if (globalMaxWeights > 3) { + AddVertexAttribute(RAW_VERTEX_ATTRIBUTE_JOINT_INDICES3); + AddVertexAttribute(RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS3); + } + + assert(globalMaxWeights <= RawModel::MAX_SUPPORTED_WEIGHTS); + // Copy to gltf friendly structure + for (auto& vertex : vertices) { + for (int i = 0; i < globalMaxWeights; i += 4) { // Ensure all vertices have the same number of streams + Vec4f weights{0.0}; + Vec4i jointIds{0,0,0,0}; + for (int j = i; j < i + 4 && j < vertex.skinningInfo.size(); j++) { + weights[j - i] = vertex.skinningInfo[j].jointWeight; + jointIds[j - i] = vertex.skinningInfo[j].jointIndex; + } + const int vertexStream = i / 4; + switch (vertexStream) { + case 0: + vertex.jointIndices0 = jointIds; + vertex.jointWeights0 = weights; + break; + case 1: + vertex.jointIndices1 = jointIds; + vertex.jointWeights1 = weights; + break; + case 2: + vertex.jointIndices2 = jointIds; + vertex.jointWeights2 = weights; + break; + case 3: + vertex.jointIndices3 = jointIds; + vertex.jointWeights3 = weights; + break; + default: + assert(0); + } + } + } + } } void RawModel::TransformGeometry(ComputeNormalsOption normals) { @@ -580,7 +655,8 @@ void RawModel::CreateMaterialModels( if (keepAttribs != -1) { int keep = keepAttribs; if ((keepAttribs & RAW_VERTEX_ATTRIBUTE_POSITION) != 0) { - keep |= RAW_VERTEX_ATTRIBUTE_JOINT_INDICES0 | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS0 | RAW_VERTEX_ATTRIBUTE_JOINT_INDICES1 | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS1; + keep |= RAW_VERTEX_ATTRIBUTE_JOINT_INDICES0 | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS0 | RAW_VERTEX_ATTRIBUTE_JOINT_INDICES1 | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS1 | + RAW_VERTEX_ATTRIBUTE_JOINT_INDICES2 | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS2 | RAW_VERTEX_ATTRIBUTE_JOINT_INDICES3 | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS3; } if ((keepAttribs & RAW_VERTEX_ATTRIBUTE_AUTO) != 0) { keep |= RAW_VERTEX_ATTRIBUTE_POSITION; @@ -633,6 +709,18 @@ void RawModel::CreateMaterialModels( if ((keep & RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS1) == 0) { vertex.jointWeights1 = defaultVertex.jointWeights1; } + if ((keep & RAW_VERTEX_ATTRIBUTE_JOINT_INDICES2) == 0) { + vertex.jointIndices2 = defaultVertex.jointIndices2; + } + if ((keep & RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS2) == 0) { + vertex.jointWeights2 = defaultVertex.jointWeights2; + } + if ((keep & RAW_VERTEX_ATTRIBUTE_JOINT_INDICES3) == 0) { + vertex.jointIndices3 = defaultVertex.jointIndices3; + } + if ((keep & RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS3) == 0) { + vertex.jointWeights3 = defaultVertex.jointWeights3; + } } verts[j] = model->AddVertex(vertex); diff --git a/src/raw/RawModel.hpp b/src/raw/RawModel.hpp index d09f0c3..2f42f31 100644 --- a/src/raw/RawModel.hpp +++ b/src/raw/RawModel.hpp @@ -27,6 +27,10 @@ enum RawVertexAttribute { RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS0 = 1 << 8, RAW_VERTEX_ATTRIBUTE_JOINT_INDICES1 = 1 << 9, RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS1 = 1 << 10, + RAW_VERTEX_ATTRIBUTE_JOINT_INDICES2 = 1 << 11, + RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS2 = 1 << 12, + RAW_VERTEX_ATTRIBUTE_JOINT_INDICES3 = 1 << 13, + RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS3 = 1 << 14, RAW_VERTEX_ATTRIBUTE_AUTO = 1 << 31 }; @@ -41,6 +45,16 @@ struct RawBlendVertex { } }; +struct RawVertexSkinningInfo +{ + int jointIndex; + float jointWeight; + + bool operator>(const RawVertexSkinningInfo& rjw) const { + return jointWeight > rjw.jointWeight; + } +}; + struct RawVertex { RawVertex() : polarityUv0(false), pad1(false), pad2(false), pad3(false) {} @@ -51,10 +65,16 @@ struct RawVertex { Vec4f color{0.0f}; Vec2f uv0{0.0f}; Vec2f uv1{0.0f}; - Vec4i jointIndices0{0,0,0,0}; - Vec4i jointIndices1{0,0,0,0}; - Vec4f jointWeights0{0.0f}; + Vec4i jointIndices0{0,0,0,0}; + Vec4i jointIndices1{0,0,0,0}; + Vec4i jointIndices2{0,0,0,0}; + Vec4i jointIndices3{0,0,0,0}; + Vec4f jointWeights0{0.0f}; Vec4f jointWeights1{0.0f}; + Vec4f jointWeights2{0.0f}; + Vec4f jointWeights3{0.0f}; + + std::vector skinningInfo; // end of members that directly correspond to vertex attributes // if this vertex participates in a blend shape setup, the surfaceIx of its dedicated mesh; @@ -361,6 +381,8 @@ struct RawNode { class RawModel { public: + static const int MAX_SUPPORTED_WEIGHTS = 16; + RawModel(); // Add geometry. @@ -421,7 +443,7 @@ class RawModel { // Remove unused vertices, textures or materials after removing vertex attributes, textures, // materials or surfaces. - void Condense(); + void Condense(const int maxSkinningWeights, const bool normalizeWeights); void TransformGeometry(ComputeNormalsOption); From 772965ad03d231df439bde4d837bee0aee7f422a Mon Sep 17 00:00:00 2001 From: hhalen Date: Wed, 17 Apr 2019 19:04:25 -0700 Subject: [PATCH 04/11] Remove unused function. --- src/gltf/GltfModel.hpp | 32 -------------------------------- 1 file changed, 32 deletions(-) diff --git a/src/gltf/GltfModel.hpp b/src/gltf/GltfModel.hpp index 4702c08..f82b09f 100644 --- a/src/gltf/GltfModel.hpp +++ b/src/gltf/GltfModel.hpp @@ -123,38 +123,6 @@ class GltfModel { return accessor; }; - template - std::shared_ptr AddArrayAttributeToPrimitive( - BufferData& buffer, - const RawModel& surfaceModel, - PrimitiveData& primitive, - const AttributeDefinition& attrDef) { - // copy attribute data into vector - std::vector> attribArr; - surfaceModel.GetAttributeArray(attribArr, attrDef.rawAttributeIx); - - const AttributeDefinition ATTR_WEIGHTS( - "WEIGHTS_0", - &RawVertex::jointWeights, - attrDef.glType, - attrDef.dracoAttribute, - draco::DT_FLOAT32); - - std::shared_ptr accessor; - if (attrDef.dracoComponentType != draco::DT_INVALID && primitive.dracoMesh != nullptr) { - primitive.AddDracoAttrib(attrDef, attribArr); - - accessor = accessors.hold(new AccessorData(attrDef.glType)); - accessor->count = attribArr.size(); - } - else { - auto bufferView = GetAlignedBufferView(buffer, BufferViewData::GL_ARRAY_BUFFER); - accessor = AddAccessorWithView(*bufferView, attrDef.glType, attribArr, std::string("")); - } - primitive.AddAttrib(attrDef.gltfName, *accessor); - return accessor; - }; - template void serializeHolder(json& glTFJson, std::string key, const Holder holder) { if (!holder.ptrs.empty()) { From 467e7b2171a9e7c759f5963e708482773193b8c2 Mon Sep 17 00:00:00 2001 From: hhalen Date: Wed, 17 Apr 2019 19:19:50 -0700 Subject: [PATCH 05/11] Adding missing attributes to RawVertex operator==. --- src/raw/RawModel.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/raw/RawModel.cpp b/src/raw/RawModel.cpp index c63dba6..cefa9e5 100644 --- a/src/raw/RawModel.cpp +++ b/src/raw/RawModel.cpp @@ -26,9 +26,12 @@ bool RawVertex::operator==(const RawVertex& other) const { return (position == other.position) && (normal == other.normal) && (tangent == other.tangent) && (binormal == other.binormal) && (color == other.color) && (uv0 == other.uv0) && - (uv1 == other.uv1) && (jointIndices0 == other.jointIndices0) && - (jointWeights0 == other.jointWeights0) && (jointIndices1 == other.jointIndices1) && - (jointWeights1 == other.jointWeights1) && (polarityUv0 == other.polarityUv0) && + (uv1 == other.uv1) && + (jointWeights0 == other.jointWeights0) && (jointWeights1 == other.jointWeights1) && + (jointWeights2 == other.jointWeights2) && (jointWeights3 == other.jointWeights3) && + (jointIndices0 == other.jointIndices0) && (jointIndices1 == other.jointIndices1) && + (jointIndices2 == other.jointIndices2) && (jointIndices3 == other.jointIndices3) && + (polarityUv0 == other.polarityUv0) && (blendSurfaceIx == other.blendSurfaceIx) && (blends == other.blends); } From c4395b9b92285a3bd807f89f5e519219ed78d8cd Mon Sep 17 00:00:00 2001 From: hhalen Date: Thu, 18 Apr 2019 16:20:36 -0700 Subject: [PATCH 06/11] Change gltf structures representing weights and jointIds to single data structure to make code cleaner and simplify further generalization. Added array versions of AttributeDefinition and AddAttributeToPrimitive to facilitate this. --- src/FBX2glTF.cpp | 8 +-- src/gltf/GltfModel.hpp | 25 +++++++ src/gltf/Raw2Gltf.cpp | 86 ++++++------------------- src/gltf/Raw2Gltf.hpp | 38 +++++++++++ src/gltf/properties/PrimitiveData.hpp | 26 ++++++++ src/raw/RawModel.cpp | 93 ++++++--------------------- src/raw/RawModel.hpp | 50 +++++++++----- 7 files changed, 164 insertions(+), 162 deletions(-) diff --git a/src/FBX2glTF.cpp b/src/FBX2glTF.cpp index b5ae8b0..d31a62d 100644 --- a/src/FBX2glTF.cpp +++ b/src/FBX2glTF.cpp @@ -140,10 +140,11 @@ int main(int argc, char* argv[]) { gltfOptions.useBlendShapeTangents, "Include blend shape tangents, if reported present by the FBX SDK."); - app.add_flag( + app.add_option( "--normalize-weights", gltfOptions.normalizeSkinningWeights, - "Normalize skinning weights."); + "Normalize skinning weights.", + true); app.add_option( "--skinning-weights", @@ -156,8 +157,7 @@ int main(int argc, char* argv[]) { "-k,--keep-attribute", [&](std::vector attributes) -> bool { gltfOptions.keepAttribs = - RAW_VERTEX_ATTRIBUTE_JOINT_INDICES0 | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS0 | RAW_VERTEX_ATTRIBUTE_JOINT_INDICES1 | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS1 | - RAW_VERTEX_ATTRIBUTE_JOINT_INDICES2 | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS2 | RAW_VERTEX_ATTRIBUTE_JOINT_INDICES3 | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS3; + RAW_VERTEX_ATTRIBUTE_JOINT_INDICES | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS; for (std::string attribute : attributes) { if (attribute == "position") { gltfOptions.keepAttribs |= RAW_VERTEX_ATTRIBUTE_POSITION; diff --git a/src/gltf/GltfModel.hpp b/src/gltf/GltfModel.hpp index f82b09f..502d37a 100644 --- a/src/gltf/GltfModel.hpp +++ b/src/gltf/GltfModel.hpp @@ -123,6 +123,31 @@ class GltfModel { return accessor; }; + template + std::shared_ptr AddAttributeArrayToPrimitive( + BufferData& buffer, + const RawModel& surfaceModel, + PrimitiveData& primitive, + const AttributeArrayDefinition& attrDef) { + // copy attribute data into vector + std::vector attribArr; + surfaceModel.GetArrayAttributeArray(attribArr, attrDef.rawAttributeIx, attrDef.arrayOffset); + + std::shared_ptr accessor; + if (attrDef.dracoComponentType != draco::DT_INVALID && primitive.dracoMesh != nullptr) { + primitive.AddDracoArrayAttrib(attrDef, attribArr); + + accessor = accessors.hold(new AccessorData(attrDef.glType)); + accessor->count = attribArr.size(); + } + else { + auto bufferView = GetAlignedBufferView(buffer, BufferViewData::GL_ARRAY_BUFFER); + accessor = AddAccessorWithView(*bufferView, attrDef.glType, attribArr, std::string("")); + } + primitive.AddAttrib(attrDef.gltfName, *accessor); + return accessor; + }; + template void serializeHolder(json& glTFJson, std::string key, const Holder holder) { if (!holder.ptrs.empty()) { diff --git a/src/gltf/Raw2Gltf.cpp b/src/gltf/Raw2Gltf.cpp index 15834a9..880bd37 100644 --- a/src/gltf/Raw2Gltf.cpp +++ b/src/gltf/Raw2Gltf.cpp @@ -532,77 +532,31 @@ ModelData* Raw2Gltf( draco::DT_FLOAT32); gltf->AddAttributeToPrimitive(buffer, surfaceModel, *primitive, ATTR_TEXCOORD_1); } - if ((surfaceModel.GetVertexAttributes() & RAW_VERTEX_ATTRIBUTE_JOINT_INDICES0) != 0) { - const AttributeDefinition ATTR_JOINTS( - "JOINTS_0", - &RawVertex::jointIndices0, + if ((surfaceModel.GetVertexAttributes() & RAW_VERTEX_ATTRIBUTE_JOINT_INDICES) != 0) { + for (int i = 0; i < surfaceModel.GetGlobalWeightCount(); i += 4) { + const AttributeArrayDefinition ATTR_JOINTS( + std::string("JOINTS_") + std::to_string(i/4), + //"JOINTS_0", + &RawVertex::jointIndices, GLT_VEC4I, draco::GeometryAttribute::GENERIC, - draco::DT_UINT16); - gltf->AddAttributeToPrimitive(buffer, surfaceModel, *primitive, ATTR_JOINTS); + draco::DT_UINT16, + i/4); + gltf->AddAttributeArrayToPrimitive(buffer, surfaceModel, *primitive, ATTR_JOINTS); + } } - if ((surfaceModel.GetVertexAttributes() & RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS0) != 0) { - const AttributeDefinition ATTR_WEIGHTS( - "WEIGHTS_0", - &RawVertex::jointWeights0, + if ((surfaceModel.GetVertexAttributes() & RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS) != 0) { + for (int i = 0; i < surfaceModel.GetGlobalWeightCount(); i += 4) { + const AttributeArrayDefinition ATTR_WEIGHTS( + std::string("WEIGHTS_") + std::to_string(i/4), + //"WEIGHTS_0", + &RawVertex::jointWeights, GLT_VEC4F, draco::GeometryAttribute::GENERIC, - draco::DT_FLOAT32); - gltf->AddAttributeToPrimitive(buffer, surfaceModel, *primitive, ATTR_WEIGHTS); - } - if ((surfaceModel.GetVertexAttributes() & RAW_VERTEX_ATTRIBUTE_JOINT_INDICES1) != 0) { - const AttributeDefinition ATTR_JOINTS( - "JOINTS_1", - &RawVertex::jointIndices1, - GLT_VEC4I, - draco::GeometryAttribute::GENERIC, - draco::DT_UINT16); - gltf->AddAttributeToPrimitive(buffer, surfaceModel, *primitive, ATTR_JOINTS); - } - if ((surfaceModel.GetVertexAttributes() & RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS1) != 0) { - const AttributeDefinition ATTR_WEIGHTS( - "WEIGHTS_1", - &RawVertex::jointWeights1, - GLT_VEC4F, - draco::GeometryAttribute::GENERIC, - draco::DT_FLOAT32); - gltf->AddAttributeToPrimitive(buffer, surfaceModel, *primitive, ATTR_WEIGHTS); - } - if ((surfaceModel.GetVertexAttributes() & RAW_VERTEX_ATTRIBUTE_JOINT_INDICES2) != 0) { - const AttributeDefinition ATTR_JOINTS( - "JOINTS_0", - &RawVertex::jointIndices2, - GLT_VEC4I, - draco::GeometryAttribute::GENERIC, - draco::DT_UINT16); - gltf->AddAttributeToPrimitive(buffer, surfaceModel, *primitive, ATTR_JOINTS); - } - if ((surfaceModel.GetVertexAttributes() & RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS2) != 0) { - const AttributeDefinition ATTR_WEIGHTS( - "WEIGHTS_0", - &RawVertex::jointWeights2, - GLT_VEC4F, - draco::GeometryAttribute::GENERIC, - draco::DT_FLOAT32); - gltf->AddAttributeToPrimitive(buffer, surfaceModel, *primitive, ATTR_WEIGHTS); - } - if ((surfaceModel.GetVertexAttributes() & RAW_VERTEX_ATTRIBUTE_JOINT_INDICES3) != 0) { - const AttributeDefinition ATTR_JOINTS( - "JOINTS_0", - &RawVertex::jointIndices3, - GLT_VEC4I, - draco::GeometryAttribute::GENERIC, - draco::DT_UINT16); - gltf->AddAttributeToPrimitive(buffer, surfaceModel, *primitive, ATTR_JOINTS); - } - if ((surfaceModel.GetVertexAttributes() & RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS3) != 0) { - const AttributeDefinition ATTR_WEIGHTS( - "WEIGHTS_0", - &RawVertex::jointWeights3, - GLT_VEC4F, - draco::GeometryAttribute::GENERIC, - draco::DT_FLOAT32); - gltf->AddAttributeToPrimitive(buffer, surfaceModel, *primitive, ATTR_WEIGHTS); + draco::DT_FLOAT32, + i/4); + gltf->AddAttributeArrayToPrimitive(buffer, surfaceModel, *primitive, ATTR_WEIGHTS); + } } // each channel present in the mesh always ends up a target in the primitive diff --git a/src/gltf/Raw2Gltf.hpp b/src/gltf/Raw2Gltf.hpp index 0dbdc6e..fb0d6c9 100644 --- a/src/gltf/Raw2Gltf.hpp +++ b/src/gltf/Raw2Gltf.hpp @@ -154,6 +154,44 @@ struct AttributeDefinition { glType(_glType), dracoAttribute(draco::GeometryAttribute::INVALID), dracoComponentType(draco::DataType::DT_INVALID) {} + + AttributeDefinition( + const std::string gltfName, + const T RawVertex::*rawAttributeIx, + const GLType& _glType, + const draco::GeometryAttribute::Type dracoAttribute, + const draco::DataType dracoComponentType, + const int arrayOffset) + : gltfName(gltfName), + rawAttributeIx(rawAttributeIx), + glType(_glType), + dracoAttribute(dracoAttribute), + dracoComponentType(dracoComponentType), + arrayOffset(arrayOffset){} +}; + +template +struct AttributeArrayDefinition { + const std::string gltfName; + const T (RawVertex::*rawAttributeIx)[(RawModel::MAX_SUPPORTED_WEIGHTS -1 ) / 4 + 1]; + const GLType glType; + const int arrayOffset; + const draco::GeometryAttribute::Type dracoAttribute; + const draco::DataType dracoComponentType; + + AttributeArrayDefinition( + const std::string gltfName, + const T (RawVertex::*rawAttributeIx)[(RawModel::MAX_SUPPORTED_WEIGHTS - 1) / 4 + 1], + const GLType& _glType, + const draco::GeometryAttribute::Type dracoAttribute, + const draco::DataType dracoComponentType, + const int arrayOffset) + : gltfName(gltfName), + rawAttributeIx(rawAttributeIx), + glType(_glType), + dracoAttribute(dracoAttribute), + dracoComponentType(dracoComponentType), + arrayOffset(arrayOffset) {} }; struct AccessorData; diff --git a/src/gltf/properties/PrimitiveData.hpp b/src/gltf/properties/PrimitiveData.hpp index 16bf7e9..81ba4b1 100644 --- a/src/gltf/properties/PrimitiveData.hpp +++ b/src/gltf/properties/PrimitiveData.hpp @@ -62,6 +62,32 @@ struct PrimitiveData { dracoAttributes[attribute.gltfName] = dracoAttId; } + template + void AddDracoArrayAttrib(const AttributeArrayDefinition attribute, const std::vector& attribArr) { + draco::PointAttribute att; + int8_t componentCount = attribute.glType.count; + att.Init( + attribute.dracoAttribute, + nullptr, + componentCount, + attribute.dracoComponentType, + false, + componentCount * draco::DataTypeLength(attribute.dracoComponentType), + 0); + + const int dracoAttId = dracoMesh->AddAttribute(att, true, attribArr.size()); + draco::PointAttribute* attPtr = dracoMesh->attribute(dracoAttId); + + std::vector buf(sizeof(T)); + for (uint32_t ii = 0; ii < attribArr.size(); ii++) { + uint8_t* ptr = &buf[0]; + attribute.glType.write(ptr, attribArr[ii]); + attPtr->SetAttributeValue(attPtr->mapped_index(draco::PointIndex(ii)), ptr); + } + + dracoAttributes[attribute.gltfName] = dracoAttId; + } + void NoteDracoBuffer(const BufferViewData& data); const int indices; diff --git a/src/raw/RawModel.cpp b/src/raw/RawModel.cpp index cefa9e5..7977ccf 100644 --- a/src/raw/RawModel.cpp +++ b/src/raw/RawModel.cpp @@ -27,10 +27,7 @@ bool RawVertex::operator==(const RawVertex& other) const { return (position == other.position) && (normal == other.normal) && (tangent == other.tangent) && (binormal == other.binormal) && (color == other.color) && (uv0 == other.uv0) && (uv1 == other.uv1) && - (jointWeights0 == other.jointWeights0) && (jointWeights1 == other.jointWeights1) && - (jointWeights2 == other.jointWeights2) && (jointWeights3 == other.jointWeights3) && - (jointIndices0 == other.jointIndices0) && (jointIndices1 == other.jointIndices1) && - (jointIndices2 == other.jointIndices2) && (jointIndices3 == other.jointIndices3) && + (jointWeights == other.jointWeights) && (jointIndices == other.jointIndices) && (polarityUv0 == other.polarityUv0) && (blendSurfaceIx == other.blendSurfaceIx) && (blends == other.blends); } @@ -59,17 +56,8 @@ size_t RawVertex::Difference(const RawVertex& other) const { attributes |= RAW_VERTEX_ATTRIBUTE_UV1; } // Always need both or neither. - if (jointIndices0 != other.jointIndices0 || jointWeights0 != other.jointWeights0) { - attributes |= RAW_VERTEX_ATTRIBUTE_JOINT_INDICES0 | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS0; - } - if (jointIndices1 != other.jointIndices1 || jointWeights1 != other.jointWeights1) { - attributes |= RAW_VERTEX_ATTRIBUTE_JOINT_INDICES1 | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS1; - } - if (jointIndices2 != other.jointIndices2 || jointWeights2 != other.jointWeights2) { - attributes |= RAW_VERTEX_ATTRIBUTE_JOINT_INDICES2 | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS2; - } - if (jointIndices3 != other.jointIndices3 || jointWeights3 != other.jointWeights3) { - attributes |= RAW_VERTEX_ATTRIBUTE_JOINT_INDICES3 | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS3; + if (jointIndices != other.jointIndices || jointWeights != other.jointWeights) { + attributes |= RAW_VERTEX_ATTRIBUTE_JOINT_INDICES | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS; } return attributes; } @@ -409,7 +397,7 @@ void RawModel::Condense(const int maxSkinningWeights, const bool normalizeWeight } { - int globalMaxWeights = 0; + globalMaxWeights = 0; for (auto& vertex: vertices) { // Sort from largest to smallest weight. @@ -432,26 +420,15 @@ void RawModel::Condense(const int maxSkinningWeights, const bool normalizeWeight } if (globalMaxWeights > 0) { - AddVertexAttribute(RAW_VERTEX_ATTRIBUTE_JOINT_INDICES0); - AddVertexAttribute(RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS0); - } - if (globalMaxWeights > 1) { - AddVertexAttribute(RAW_VERTEX_ATTRIBUTE_JOINT_INDICES1); - AddVertexAttribute(RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS1); - } - if (globalMaxWeights > 2) { - AddVertexAttribute(RAW_VERTEX_ATTRIBUTE_JOINT_INDICES2); - AddVertexAttribute(RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS2); - } - if (globalMaxWeights > 3) { - AddVertexAttribute(RAW_VERTEX_ATTRIBUTE_JOINT_INDICES3); - AddVertexAttribute(RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS3); + AddVertexAttribute(RAW_VERTEX_ATTRIBUTE_JOINT_INDICES); + AddVertexAttribute(RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS); } + assert(globalMaxWeights <= RawModel::MAX_SUPPORTED_WEIGHTS); // Copy to gltf friendly structure for (auto& vertex : vertices) { - for (int i = 0; i < globalMaxWeights; i += 4) { // Ensure all vertices have the same number of streams + for (int i = 0; i < globalMaxWeights; i += 4) { Vec4f weights{0.0}; Vec4i jointIds{0,0,0,0}; for (int j = i; j < i + 4 && j < vertex.skinningInfo.size(); j++) { @@ -459,26 +436,8 @@ void RawModel::Condense(const int maxSkinningWeights, const bool normalizeWeight jointIds[j - i] = vertex.skinningInfo[j].jointIndex; } const int vertexStream = i / 4; - switch (vertexStream) { - case 0: - vertex.jointIndices0 = jointIds; - vertex.jointWeights0 = weights; - break; - case 1: - vertex.jointIndices1 = jointIds; - vertex.jointWeights1 = weights; - break; - case 2: - vertex.jointIndices2 = jointIds; - vertex.jointWeights2 = weights; - break; - case 3: - vertex.jointIndices3 = jointIds; - vertex.jointWeights3 = weights; - break; - default: - assert(0); - } + vertex.jointIndices[vertexStream] = jointIds; + vertex.jointWeights[vertexStream] = weights; } } } @@ -631,6 +590,7 @@ void RawModel::CreateMaterialModels( surfaces[sortedTriangles[i - 1].surfaceIndex].discrete))) { materialModels.resize(materialModels.size() + 1); model = &materialModels[materialModels.size() - 1]; + model->globalMaxWeights = globalMaxWeights; } // FIXME: will have to unlink from the nodes, transform both surfaces into a @@ -658,8 +618,7 @@ void RawModel::CreateMaterialModels( if (keepAttribs != -1) { int keep = keepAttribs; if ((keepAttribs & RAW_VERTEX_ATTRIBUTE_POSITION) != 0) { - keep |= RAW_VERTEX_ATTRIBUTE_JOINT_INDICES0 | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS0 | RAW_VERTEX_ATTRIBUTE_JOINT_INDICES1 | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS1 | - RAW_VERTEX_ATTRIBUTE_JOINT_INDICES2 | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS2 | RAW_VERTEX_ATTRIBUTE_JOINT_INDICES3 | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS3; + keep |= RAW_VERTEX_ATTRIBUTE_JOINT_INDICES | RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS; } if ((keepAttribs & RAW_VERTEX_ATTRIBUTE_AUTO) != 0) { keep |= RAW_VERTEX_ATTRIBUTE_POSITION; @@ -700,29 +659,13 @@ void RawModel::CreateMaterialModels( if ((keep & RAW_VERTEX_ATTRIBUTE_UV1) == 0) { vertex.uv1 = defaultVertex.uv1; } - if ((keep & RAW_VERTEX_ATTRIBUTE_JOINT_INDICES0) == 0) { - vertex.jointIndices0 = defaultVertex.jointIndices0; + if ((keep & RAW_VERTEX_ATTRIBUTE_JOINT_INDICES) == 0) { + for (int i = 0; i < RawModel::MAX_SUPPORTED_WEIGHTS ; i++) + vertex.jointIndices[i] = defaultVertex.jointIndices[i]; } - if ((keep & RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS0) == 0) { - vertex.jointWeights0 = defaultVertex.jointWeights0; - } - if ((keep & RAW_VERTEX_ATTRIBUTE_JOINT_INDICES1) == 0) { - vertex.jointIndices1 = defaultVertex.jointIndices1; - } - if ((keep & RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS1) == 0) { - vertex.jointWeights1 = defaultVertex.jointWeights1; - } - if ((keep & RAW_VERTEX_ATTRIBUTE_JOINT_INDICES2) == 0) { - vertex.jointIndices2 = defaultVertex.jointIndices2; - } - if ((keep & RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS2) == 0) { - vertex.jointWeights2 = defaultVertex.jointWeights2; - } - if ((keep & RAW_VERTEX_ATTRIBUTE_JOINT_INDICES3) == 0) { - vertex.jointIndices3 = defaultVertex.jointIndices3; - } - if ((keep & RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS3) == 0) { - vertex.jointWeights3 = defaultVertex.jointWeights3; + if ((keep & RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS) == 0) { + for (int i = 0; i < RawModel::MAX_SUPPORTED_WEIGHTS; i++) + vertex.jointWeights[i] = defaultVertex.jointWeights[i]; } } diff --git a/src/raw/RawModel.hpp b/src/raw/RawModel.hpp index 2f42f31..45fe3a9 100644 --- a/src/raw/RawModel.hpp +++ b/src/raw/RawModel.hpp @@ -15,6 +15,8 @@ #include "FBX2glTF.h" +#define MAX_SKINNING_WEIGHTS 32 + enum RawVertexAttribute { RAW_VERTEX_ATTRIBUTE_POSITION = 1 << 0, RAW_VERTEX_ATTRIBUTE_NORMAL = 1 << 1, @@ -23,14 +25,8 @@ enum RawVertexAttribute { RAW_VERTEX_ATTRIBUTE_COLOR = 1 << 4, RAW_VERTEX_ATTRIBUTE_UV0 = 1 << 5, RAW_VERTEX_ATTRIBUTE_UV1 = 1 << 6, - RAW_VERTEX_ATTRIBUTE_JOINT_INDICES0 = 1 << 7, - RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS0 = 1 << 8, - RAW_VERTEX_ATTRIBUTE_JOINT_INDICES1 = 1 << 9, - RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS1 = 1 << 10, - RAW_VERTEX_ATTRIBUTE_JOINT_INDICES2 = 1 << 11, - RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS2 = 1 << 12, - RAW_VERTEX_ATTRIBUTE_JOINT_INDICES3 = 1 << 13, - RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS3 = 1 << 14, + RAW_VERTEX_ATTRIBUTE_JOINT_INDICES = 1 << 7, + RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS = 1 << 8, RAW_VERTEX_ATTRIBUTE_AUTO = 1 << 31 }; @@ -65,14 +61,9 @@ struct RawVertex { Vec4f color{0.0f}; Vec2f uv0{0.0f}; Vec2f uv1{0.0f}; - Vec4i jointIndices0{0,0,0,0}; - Vec4i jointIndices1{0,0,0,0}; - Vec4i jointIndices2{0,0,0,0}; - Vec4i jointIndices3{0,0,0,0}; - Vec4f jointWeights0{0.0f}; - Vec4f jointWeights1{0.0f}; - Vec4f jointWeights2{0.0f}; - Vec4f jointWeights3{0.0f}; + Vec4i jointIndices[(MAX_SKINNING_WEIGHTS - 1) / 4 + 1]; + Vec4f jointWeights[(MAX_SKINNING_WEIGHTS - 1) / 4 + 1]; + std::vector skinningInfo; // end of members that directly correspond to vertex attributes @@ -381,7 +372,7 @@ struct RawNode { class RawModel { public: - static const int MAX_SUPPORTED_WEIGHTS = 16; + static const int MAX_SUPPORTED_WEIGHTS = MAX_SKINNING_WEIGHTS; RawModel(); @@ -460,6 +451,11 @@ class RawModel { int GetVertexCount() const { return (int)vertices.size(); } + + int GetGlobalWeightCount() const{ + return globalMaxWeights; + } + const RawVertex& GetVertex(const int index) const { return vertices[index]; } @@ -542,6 +538,14 @@ class RawModel { void GetAttributeArray(std::vector<_attrib_type_>& out, const _attrib_type_ RawVertex::*ptr) const; + // Create individual attribute arrays, with the source as an array. + // Returns true if the vertices store the particular attribute. + template + void GetArrayAttributeArray(std::vector<_attrib_type_>& out, + const _attrib_type_ (RawVertex::*ptr)[(RawModel::MAX_SUPPORTED_WEIGHTS - 1) / 4 + 1], + const int arrayOffset) + const; + // Create an array with a raw model for each material. // Multiple surfaces with the same material will turn into a single model. // However, surfaces that are marked as 'discrete' will turn into separate models. @@ -556,6 +560,7 @@ class RawModel { long rootNodeId; int vertexAttributes; + int globalMaxWeights; std::unordered_map vertexHash; std::vector vertices; std::vector triangles; @@ -577,3 +582,14 @@ void RawModel::GetAttributeArray( out[i] = vertices[i].*ptr; } } + +template +void RawModel::GetArrayAttributeArray( + std::vector<_attrib_type_>& out, + const _attrib_type_ (RawVertex::*ptr)[(RawModel::MAX_SUPPORTED_WEIGHTS - 1) / 4 + 1], + const int arrayOffset) const { + out.resize(vertices.size()); + for (size_t i = 0; i < vertices.size(); i++) { + out[i] = (vertices[i].*ptr)[arrayOffset]; + } +} From 10f4ac856f4cb82440e54ae9fb29f8ffe7670d70 Mon Sep 17 00:00:00 2001 From: hhalen Date: Fri, 19 Apr 2019 15:59:07 -0700 Subject: [PATCH 07/11] Allow arbitrary number of skinning weights. Controlled through command line parameter. Defaults to 4. --- src/FBX2glTF.cpp | 2 +- src/gltf/Raw2Gltf.cpp | 2 -- src/gltf/Raw2Gltf.hpp | 4 ++-- src/raw/RawModel.cpp | 17 ++++++++--------- src/raw/RawModel.hpp | 11 ++++------- 5 files changed, 15 insertions(+), 21 deletions(-) diff --git a/src/FBX2glTF.cpp b/src/FBX2glTF.cpp index d31a62d..610a407 100644 --- a/src/FBX2glTF.cpp +++ b/src/FBX2glTF.cpp @@ -151,7 +151,7 @@ int main(int argc, char* argv[]) { gltfOptions.maxSkinningWeights, "How many joint influences per vertex are allowed.", true) - ->check(CLI::Range(1, RawModel::MAX_SUPPORTED_WEIGHTS)); + ->check(CLI::Range(0, 512)); app.add_option( "-k,--keep-attribute", diff --git a/src/gltf/Raw2Gltf.cpp b/src/gltf/Raw2Gltf.cpp index 880bd37..352e7c2 100644 --- a/src/gltf/Raw2Gltf.cpp +++ b/src/gltf/Raw2Gltf.cpp @@ -536,7 +536,6 @@ ModelData* Raw2Gltf( for (int i = 0; i < surfaceModel.GetGlobalWeightCount(); i += 4) { const AttributeArrayDefinition ATTR_JOINTS( std::string("JOINTS_") + std::to_string(i/4), - //"JOINTS_0", &RawVertex::jointIndices, GLT_VEC4I, draco::GeometryAttribute::GENERIC, @@ -549,7 +548,6 @@ ModelData* Raw2Gltf( for (int i = 0; i < surfaceModel.GetGlobalWeightCount(); i += 4) { const AttributeArrayDefinition ATTR_WEIGHTS( std::string("WEIGHTS_") + std::to_string(i/4), - //"WEIGHTS_0", &RawVertex::jointWeights, GLT_VEC4F, draco::GeometryAttribute::GENERIC, diff --git a/src/gltf/Raw2Gltf.hpp b/src/gltf/Raw2Gltf.hpp index fb0d6c9..ec9dac0 100644 --- a/src/gltf/Raw2Gltf.hpp +++ b/src/gltf/Raw2Gltf.hpp @@ -173,7 +173,7 @@ struct AttributeDefinition { template struct AttributeArrayDefinition { const std::string gltfName; - const T (RawVertex::*rawAttributeIx)[(RawModel::MAX_SUPPORTED_WEIGHTS -1 ) / 4 + 1]; + const std::vector RawVertex::*rawAttributeIx; const GLType glType; const int arrayOffset; const draco::GeometryAttribute::Type dracoAttribute; @@ -181,7 +181,7 @@ struct AttributeArrayDefinition { AttributeArrayDefinition( const std::string gltfName, - const T (RawVertex::*rawAttributeIx)[(RawModel::MAX_SUPPORTED_WEIGHTS - 1) / 4 + 1], + const std::vector RawVertex::*rawAttributeIx, const GLType& _glType, const draco::GeometryAttribute::Type dracoAttribute, const draco::DataType dracoComponentType, diff --git a/src/raw/RawModel.cpp b/src/raw/RawModel.cpp index 7977ccf..5f75d28 100644 --- a/src/raw/RawModel.cpp +++ b/src/raw/RawModel.cpp @@ -425,19 +425,20 @@ void RawModel::Condense(const int maxSkinningWeights, const bool normalizeWeight } - assert(globalMaxWeights <= RawModel::MAX_SUPPORTED_WEIGHTS); + assert(globalMaxWeights >= 0); // Copy to gltf friendly structure for (auto& vertex : vertices) { - for (int i = 0; i < globalMaxWeights; i += 4) { + vertex.jointIndices.reserve(globalMaxWeights); + vertex.jointWeights.reserve(globalMaxWeights); + for (int i = 0; i < globalMaxWeights; i += 4) { // ensure every vertex has the same amount of weights Vec4f weights{0.0}; Vec4i jointIds{0,0,0,0}; for (int j = i; j < i + 4 && j < vertex.skinningInfo.size(); j++) { weights[j - i] = vertex.skinningInfo[j].jointWeight; jointIds[j - i] = vertex.skinningInfo[j].jointIndex; } - const int vertexStream = i / 4; - vertex.jointIndices[vertexStream] = jointIds; - vertex.jointWeights[vertexStream] = weights; + vertex.jointIndices.push_back(jointIds); + vertex.jointWeights.push_back(weights); } } } @@ -660,12 +661,10 @@ void RawModel::CreateMaterialModels( vertex.uv1 = defaultVertex.uv1; } if ((keep & RAW_VERTEX_ATTRIBUTE_JOINT_INDICES) == 0) { - for (int i = 0; i < RawModel::MAX_SUPPORTED_WEIGHTS ; i++) - vertex.jointIndices[i] = defaultVertex.jointIndices[i]; + vertex.jointIndices = defaultVertex.jointIndices; } if ((keep & RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS) == 0) { - for (int i = 0; i < RawModel::MAX_SUPPORTED_WEIGHTS; i++) - vertex.jointWeights[i] = defaultVertex.jointWeights[i]; + vertex.jointWeights = defaultVertex.jointWeights; } } diff --git a/src/raw/RawModel.hpp b/src/raw/RawModel.hpp index 45fe3a9..99be544 100644 --- a/src/raw/RawModel.hpp +++ b/src/raw/RawModel.hpp @@ -15,8 +15,6 @@ #include "FBX2glTF.h" -#define MAX_SKINNING_WEIGHTS 32 - enum RawVertexAttribute { RAW_VERTEX_ATTRIBUTE_POSITION = 1 << 0, RAW_VERTEX_ATTRIBUTE_NORMAL = 1 << 1, @@ -61,8 +59,8 @@ struct RawVertex { Vec4f color{0.0f}; Vec2f uv0{0.0f}; Vec2f uv1{0.0f}; - Vec4i jointIndices[(MAX_SKINNING_WEIGHTS - 1) / 4 + 1]; - Vec4f jointWeights[(MAX_SKINNING_WEIGHTS - 1) / 4 + 1]; + std::vector jointIndices; + std::vector jointWeights; std::vector skinningInfo; @@ -372,7 +370,6 @@ struct RawNode { class RawModel { public: - static const int MAX_SUPPORTED_WEIGHTS = MAX_SKINNING_WEIGHTS; RawModel(); @@ -542,7 +539,7 @@ class RawModel { // Returns true if the vertices store the particular attribute. template void GetArrayAttributeArray(std::vector<_attrib_type_>& out, - const _attrib_type_ (RawVertex::*ptr)[(RawModel::MAX_SUPPORTED_WEIGHTS - 1) / 4 + 1], + const std::vector<_attrib_type_> RawVertex::*ptr, const int arrayOffset) const; @@ -586,7 +583,7 @@ void RawModel::GetAttributeArray( template void RawModel::GetArrayAttributeArray( std::vector<_attrib_type_>& out, - const _attrib_type_ (RawVertex::*ptr)[(RawModel::MAX_SUPPORTED_WEIGHTS - 1) / 4 + 1], + const std::vector<_attrib_type_> RawVertex::*ptr, const int arrayOffset) const { out.resize(vertices.size()); for (size_t i = 0; i < vertices.size(); i++) { From 3bc4f7080ec05a41d85fa4230c9a1c9894774a82 Mon Sep 17 00:00:00 2001 From: hhalen Date: Mon, 24 Jun 2019 16:36:57 -0700 Subject: [PATCH 08/11] Removing large binaries. --- models/Pinecone.glb | Bin 71340 -> 0 bytes models/SphereWithTangents.glb | Bin 27648 -> 0 bytes models/apple.glb | Bin 25216 -> 0 bytes models/roughness.glb | Bin 145564 -> 0 bytes models/shininess_example.glb | Bin 79564 -> 0 bytes 5 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 models/Pinecone.glb delete mode 100644 models/SphereWithTangents.glb delete mode 100644 models/apple.glb delete mode 100644 models/roughness.glb delete mode 100644 models/shininess_example.glb diff --git a/models/Pinecone.glb b/models/Pinecone.glb deleted file mode 100644 index a877761a145980040de71b0f2972520aab106836..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71340 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

6@vjd0y5N4PU6XP_Ga>YFHU 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 HzWVV?54*lfAOmT(i%)=9>FB-ZoU*j6fh# zg=65OqrJO5+Q!=h4IWRZT{e|)1WQhwkCW6!2uu0pQ%a>urC{-rdpL35 zHfYD+G{2yUSNXW>@{Ui;MpkBE==- zB;}<38_a(5{Ghm zwjOSt9`5$;-iCKQSumu%_ zf&Wgh{|)rt{P_#Iv8syXzrq%mlav2X*#CtwEFE=oX6dgvhp5;&NpW#888LZzDLENQ zX@CeAl8^%W0EQ%`0S{%shG0zkH{0B7?)+Z&Uzhzit9~!~OB4QYAmo3k{r@v;iT{a7 zEIs*80sJP|+0DlBFC_qW_P3tccv!pHdt0MDd>oyu-94N!_N)#5O{9Og>}LO$TAcU| z=)8-ky(91#e^k)M&GYs@9L1k8Z~HsmKIs454KaTp0Ew`6!+7|hZGStVzcz5Q@wP`h z+uZ&yYJSDu!N%vdHw$N*+n!D~+Cb3(kQ2JsmGz8NS;GJgv<+(=Ald=#;RgKQp9hSS zjh(Z*BWuNN){^T^9`25;70wt#w2%Gu%lcr{0qkiHkYIU6&s%71dvBZDx1DYES?qEL z=JN;CEgOuzipOmaw3?0WA2(~xA$Cq&MqEl(UII83d7zmmiRefqhLEAmVe*N@DE4-Z0YQ7XU|e#7P|neRXjYOx*skpQVE~ z-ri{ETRz^u=K|jA=;~`LUjy@4R(xI8K*LZ&R|h<@9EPE)sfw;Y7r0#dkz2oG>7?W>^urw-2YGn;4xKtJct%KAN?Jx%PF_LfimICW zRSiu8LnC7o(;H^CcJ>aAPR=eEZy#U3J9qtqA3c5&^7L6~bWChqe8S7bq>Rk0?3~=! zdHHYNmX%jjR#n%0`uyc<1HQ4TxwEUgr?;>F`@q=G@rlVP;`GeyuVpf2Wp!jcSXDDpMz&COJDbfQEYDD_|(j8W~dOBoHYH|AV1Y{sPNda zlw0Mi39_q|d(){JCSd z_seu!Cp^?#owd-eQCl0mWyqh4q(5n=688fCJmvubA}<>8%~b2<<-m{8At!BVy(!HN zL(PqbVU;BeXH5+b13f|0ij=fK6pfM3zhF0u5jjsa@2^+9W5Ov}Gdtj2!D)-oEkU->;;|KoK;x*G{$6D;HwL z*ei28lj0MEwA4E6d63!mf|wnO2{!{@5p!JAGHT`X@reb8eCKN~2ImHeL}ygyeKx!B zzVQ1)Rh_HtB2Tg`-bKn3^4IiFi=H|hSPRieZ8&yJ;}-)zXR>x-ok#Pg_3Mq^PhpVB>=BAgL>d#paGBB4=B&b< z3*C5nYnyoA3^l2@DbrOD`MEnh0@L4f(#-ro?nX7~BNHJ=-!M^Cg2(gY85LrVqJ(8Q zqmIK@$xOqU8e1`u5=p3}6g?lb%~>6!F;s6}J%(I{kR%Nc&xjc&!n&`qsp>_J`dC^$ zvD~*SQhZd6e}IYjAUWW71R!D5nfGNb{LFjo(xm4k71dleS@C4(UCrK_Z4BLUT3sl9~b& zL7Tm;V)n3_08{|g9CCp3OznOz0&xZQdDPLS=bE0mcUsZpYzJP?{q~3JXNXB-dA{^W znPSQKfkVb`#!9I{NFtKqKZ)B}z#wwpv69_ro3_4h`fFvz%6l9aHE9@8akZL1n4O)rQ!7Nf&Si$`DOqZHy?Uk>!~c(U=*F{;V8Cf$Z|J@eQ3CIV=^-Gkv9M-JGH`*nT8 zS0jjSe)<6xl-HHnt#`Sf_;aaPb~vYnolLEy2yG&?ecQmS;0EWsD+kH+ElvsY^OuuL zdemL_zR4T!D%Nes$yk^Vg*0#R>Y@WNx=>fTyHZE>9v)AL>JH+zfb9d+T?JwLNB8%B zJlfAhTwo%En~nIw^2_UgnueZ5t82Dns^c^hx~i_--+YHS@Ki~k1Ko2X?Zk-c)-0wEdv#;mJY);7LM`a!6Yoyi1qvSEX_{@hXwg`@QteEOP^2I=u1QC z4b+^V^erje0)G~y6DE)Oz}{Vb`kA6etH-a%PuSAe3S#5JPn~i*(vr7_)Ro%>#FIRT zi8ner80pl#YegwfNcL5xypqfnt~mZ*X6go}-``I@-H*nS3Dh=wz3(r35=7L>wj25f z#o_f$0tpujtFagzY1Ek`T-Mf1go(>|j9KNfoa3p209<%uXa*bh+A=2TM-n<7pQxv) z@ACC=)pec2xpF}1I^TE?&Qw3o8r5#Jd$;?A294o*^;<>WA(h>3`l|8{4%1!{@7HO) z-yWK;DA;I=uGIg~ckYjRcG(|V#$lwUU-e>h~y}p^HtHZC<;>+#sH4E zo=mEdj@GvH-jT&2p5~N$xFmaL?VyUVvxXdU!o=FLizV0GdiW%f_SDjqa;+=3aU6sDYLJtFtkq4RcBw=EK`FUEQHJ_#e29-svI$=W6e za|Td|m6YO(*WWtEDfqetDe#O{5nj<Q}4=Y+aRJfYS^;j`Ue4RpEAdaEV7Y8U5ePDupI6Ob*~Y;XMp*%2Q-tgKGX z*&B2qI&zpwh*3tbd(#+>BFnXKrfaxyFtK~!Q9HDkh?i>r`&bfDa& zS44z=g4T=kmT@*~tmie+doUO^2;zgqvYV2QMztzwRN3q-6R{mh?2N{~6i%~yc60j|r9MS4ZH%`CXIOJI@N3wY9&u?@p z*T&(}VY#E9;^Y-MVw24i-==Kio%83I%_-_4D+-B}E%xQb-Nz&2)ljsa@1@iC6k@0X zJHsebZ;3sL0otZa#G9Bff6PGcplPIs8(w3F>Jbn<8HSnCr#C{m4w)#c+1zsCzB|gYP7FYd(%bZ zM{F0Ol^0d!UJOo0+eMb0_6vme0{P^HQ!6MZF0>n0=8iHEi2VG+kCn*gGQEYv73KEb zVP`g~OmzrYkNo;d%rs&y7HHnUs$|trR@$}~$)p5OAf%SIXA+>=UH4q-V z#C~BsvY}Q;Hc(1&y3)rD)!1@ALLQFm&BRozjY}L(xf#}T1Gn?7nctZq8CJ9d%7^N# z%&9#hWg8f_DlcD@RT$A&AhNw$=@M`Zy-(!tiqCJFMbTD-Grqsb$Gyyd?75u;2V9?c zDKBJM^hld;8%~3VFGFH`eqD>s*riV_V@15$u_xLK`zc4m^x4U{mZk=-Z+#ca+*Jc;tnp2Wn|3p5A@|W7?b)*YPM%$kJz9&Dpy*&lujW*#1q=ddHTS{bBrT z?GSJiWnmZ9UgUb5aJG1lzQgjX8GB1pD8~}pFVSXSKpYDG5$g_%-BVT#wVmnV~>~lMP1FrTB=|zHDV&F zr1vdLCd5BpPu#%|g-lv>>8qboJr$@m#&%BK3l55FpL9T1n^}e3(@Tjopg~yw#Fm8< zS@48)IN#liY2^f=)97|hv%BF5#4Ty!_;NXC5Am)wGt1WJX~1we=Ci+1oG3!7yrNz8 z@@vSIaWQ{6$9ySbmU^UmPMEQ$hkWDRgk#8?Z*D<3A}^c%Ogd@`#i;vVR;3o;SK zCR-hYp2T+PEM9RekrQM)nkpVTW6VT6^!Zvaz(goD&wW4Uy^7O+!_dwsEMAYn@3rYm zs|ysr(d^8plVOS4Oc6YSq5c}B{{o@QHa_G1*Ju*{7$n@Jx+ZKEBpc1<=>rioEOC?%$|6a(x=Tg z(m0o{_?M?15ZUEpWe{V>p&#ySCEy%l z7N@IrIcx6g#&v@}0Xlr3?s<^%++j=X3R!T&)CpeV#+H^4mQi0ZfEK zSKLrv)KKop>}P8v^M-@!*Mz?BF@BQuy0-er+punpLG&pRkG@ig)|S3OKr(jb`j4~* zouv3L;b@s9VC}G_i;<}B2`TCRY~n#olN^bHV^YV;G)@ zH$Hf~KSJz)Sc5035t;4TtTV3^seo}STXY498ogx)?=8vxUi}zz-exzeFOPY;ZCMAS zHq997i!9hyW>Z8iirAG@P>HTiuD0J>^??q3dV^Mzh-M=0JAc}K{T)b`CX!8VkG<|0 zls*xD)u5{{l1vZ5p>=ePsz1w@4Gcv+W#^k;H#|8XuqUQ`9=6+eO!%rm6`m@cWsgge zepE-2a@5)$lsSkZ;(RXO%e51hTOpTBR_?v;i`B(1XU&pjiiC`bZWck}gXJ2sd(cC3#m3tC^K))8!B)^)7m7OX^E<{kqq^B6U_o?P%wxNqh)7=5K64ds&lI zTDx5^c$7|q4XH8a>EzS#1-UCs1m|TH_al$Z%EP&uav8HPhMps z^_Ij(8YG!1Y3S*0t-^aWWatL)H7&a5yg^*1NPiV{Xx|}|Qh8=nHR=J_5=$Pb5hKsG z7oJ_I6+a}+*Dgt+6s-t$5_58faTtZWd(rG>v$=eVl5b*9&b0>M58qjY{Y~7qlk%p= zGK+E!L~IuZ3U#q(xEk<}oltTd`_xxs`fY^x2KIn_;jIhfH0gUisoJlynGUd?kNESHCXFzw~ne zIql^*sw-5dqjT`tGG5DF=fQ(Ehq<1xtS)24rZ|qYi&#d`3i%tldO3EeI!y7MHy==v z+UYgNypV-f$Dth*;5f7W)Y|T*h28E;+|)#%(n+dzw+o+a_L?!WM;8|9^1qx8Y;!y_ z>TNG)?X7XVIYJ&RAxeuG2VGIVLFN0BhDoav$!XC#@=R28(Ce42;OH;b1gYG>9eIHl z>WfKB=P#QcRe;QhsY%_FuQPgUlPlite+&XfY45w)60^6>#o8`RL{Uz+*CHEx+B#Uw za2boOw#rSGU#`=WFDK}&+g7-uTen2K(^@8+3HHl^!pYm^3KvDD9a5@`iqvjdfP+7` z#loa;#N>_RBGJ|IxJ)UE!_w=tu-89UxXW&PtG>EEdfvj1h?=-QU;Kk}0A_36ET*2@ zo0~MOG37im@j!u7_-;+~WS_o|^0!Dl>x8~iAS+k{at`s>G*Arr$p7uvhxxCkuIuFu zMW1o)rgnn692a z`>i}G#Mj&z5ymp+fjSN$YlE)O*@4DS_WCvrld$A@tB0Y}{`n$Wh?~S{#GLro-KK}U z2KDiZi1`~cenTxf4z#!d$+ScweX30VTd!nS0H@Q^yIl;0>)C#Fk8=I$>aMC3?nHkrl>vFdwP`WKRwBd7eexqBRzNdT+N66(p|Ms+Q&xC$%F+1*Bl2f9FbgAtz z{$Af2iSnL^HyZb613VQ?!g=rdTnsue>Yj5u^4(NT=21i6PZwU}PAZ4w`u9pYugN?b z2y8wrS<9B=WyxW7MAPLHRqGoKLcx{G+3jm&PQRK3sZTr$aH>L3UEYS)0?N7V7nf;& z*vhI@N&PD&R@Q?|JTT{@-x4_~gRSnPfxx6_V-JEbR}VWf4LXRBF}sFd@; zq?5*cycA?Em89SG_EfHe#iin~2#7%WdUMc3K5NLs?fFNZ!|GFO)wGXFM<1Xzp5dqo|rTcQ(IlfYO=xP7GNz+;flq0QrB$L&APLFrxx!z=R$E?iHn39!N#iu;X z&1v1vmoa$VUaZ7oRd;knZN$#12)VDP=T6T^CUXWkbLnG=Hg?aOYQ2qWc)bn z-*<(tM|)<=q9)k?0e*|gg}PpJ%kb?o0XAMFG23o3;H7+Jp!!iIp`B>KL|b;b86#eK zoaFz$7-hM87-ZA9P=HZS425411sY$TPJv+Tz8I;+YD5xZE&|*KO zdn!IT^v%s8C32FEtj^EabE$2-rj3`5jUz*-Z5VBIL5dI0iJGC34}t)Qe^Wq%5c$9a zy6rK6zxP*oeC{=Y=JL`LyH-DZU>S>iUQA`;K3@_2Z@R@8E>@bGQ&Lyi%VW1Shpjc;a^9B<#3*q-Oz^VB=jwU$R9Weru_TN)>YX^%d4 z`ATpx>amTUT)jYAzGr}wf|JTa#faE+S)K`Pg@|(ug;?W*m(hwa5=))8E?Sua1!w<0 z9fCL*L+X9b(Fg_*obs=9^)FFjBN>6%G(lnYnVGMSazpK2)i((r*%7@~go>PtE%`mW zH7fUQ(*?|loz&@NunQZ%g+f-=lRq1kvLymB7a2gmYRDs8d!aEVVqyvWMhg89H-Qgg z$8&*S4p+cMHJk=%%(W>dV%+=e5oiL8ri0(zH^oupMQ~BXn)ae4??&|&trVzB9$F9W zs1OLYM>JbTAQ;>W{vlO6r%+ zK+9KV@=TeC1652!1saQg+U9unoIuujCc;ByB`U1MwCF`Wqkb#3HDN>lGm=D(7%?0I zcwyT!XJ1BA*Xq~Ca^Y+0-Chux1kvv5>e636)Yj>EI(SYTPyjIhDPlS%A~FJSgQxbn~ayuTNm< zs;GhsQL+{>r-i3k1=})H(R5b{wvG8Kr=rxs$dRXBo))bM0g1W#ccVtEtzhzHSk>`Vfkst*-GxtI3{AA1{Hp~p(dMsn28wDw8mYr zs{C~>208NX!{WyC;+d_O?&i`r10k?sCaqiEWup4g>Srcm(hP|+xO691nIJm^^_3Gr z#k)_kS@P&hfED0vd`jerwi+8~`8@!daM0lE#Y3|LPxTd`^ikxbi>r`5U-30jCSu{@ zkszP2Q&EnVVt&@Edmme;qKAUSmO8z=AB-3GFK$4CINP%^(h2lW^t$&*0Et&O1d|7~ za=&~3_7Om0e6YdlkUf4C3u}ym-0MwuVWhM!1Jp`I#_FkFB2UO!i!0~p)t{i{U;Dp~ z9BdNJdw@qyn}tw7v4><3ua!*s1Wn$PC7GW3{Cz&!RAh~baQ+lj^AjyQ#8WWoujyqo zHx9ZdY+zvv8;I&zzZ7@p4u80cJPCfzn%rGqN|vb~#tp9ZL$KNTIsV~-3rA`}VgPn) z!E+tF1NjDxJ^&%CvYLtL^k|N0dMjc+J4!VRVIoBLH%bPW&n7@1QDu=54DTC8$hN%Z zhx%}flT5@>3S{eG+_$@!5d=iM+yNC(-sM_Z@RIBm#3)?v8}NcSARcvP=XBFfC!gHJz7WB8=}mq}_y; zNn4qSwiCJG^fS5e@(2yCDUP5}Jo}^kZ<_4^F zX*ApRT%e!o3w}%BSo`YwRvwwyU#LeOELI0zKo6iD;&Zk@BG}~fApG+icr0v+G3e6O zdZh*t!#}`YCU%}Lv+G2lK?)N=mHhT(=b_4UkBw(QMdNoLib%YFv6CJ6wI9Iz&y|hv z@IYfIIwx?Rr)7g1M%RI94r!w3B_%cQch z6S1uYey%L7m3L#h8t>F`SHm=1~zv6XP=sZ|*C$9KS9~~$V^+ar?Z`+zZA-Cxm z>>`qJzy&wvvEh%(RB#?6{r-r|3Ux5m5WIt20^<1z9U6>wHV5|-(y*iY+t<++l~g>v z;q52&QTFK~R1z87udPDdu)Ufz&-co9)Re((yB`xlsNM>bihTSP4>u!h3uRxT^4|$Q zt9>F!YC8%^gb%PcqWHgUX>81lApmiOtQ1Zp2U+(erevO`nBA*yb$!1GSGZ&z<`ge^ zx)D^SVSx^BFgp1AXwHK2S1-o@|DXRaapK_a)P9mH`eKPDYSpY|up_`Yn~4ZM4m%)C zKi3s>Kx+q)^cPtB>Y3HMOvGY0madI*)q;b7OZzYm+D`mYWLg5eD});I-MyYT0Bw*3 znTY-B6#xjznThz}#YBh)_#^)@>0G3iYcLaW+YTtQ(`q+FoCh|InnIcaqd?_BKN_KB zmG@uo_RS^8fy8tl6Y=XnT^$#d0er$X75dke6j{cW>!6}m2JGf|PUo~wMHSMN1_WF=(Q@Zf!$iD$ZF%e?41|$r10B9v(&)~TPkbMHu zgZ@e8c{(2#nXAwSw97D%^ur*Xv@W%R2-yTBlotpfd$k6?fn#TP{gNH3)%wO~=$k4R z{je?*5zR9vTTdqXfIEt17B>QKg@AJiz%ckYa3ecOrXIBIfOo-pz&l-LA{;@EL5LfL z*|eF6FZ#6hf5GbU$~!^EmN6z`$p-~?pPN@H?)MM}QTQzj?)$e-n21-Q$aNXuVNW70 zK0)7%L0-fTI5hDjdFNPf`*fh&6msJfs?cVnXBvpMABf7dP-JkwGR-&_;IdmLK?PU- zf%f?r6Y<@puAHab%mecT z%zFTg2Y5Pur{der-XDx(F-*j>?D^M#oLTF23FOrILYv-|zxQpx2KnEx#AcV_nFzZ) zTKf?XE6~tT#bW-`JMT`6?hmml|ILwb#p{Bb8?UMohzvRb4&x-^c@fK1@Uqfpi#n22u^-K97Ak!Dzuog0(N<=de)kCtZjB10;63F%(4&3Sv5@1Q)4XtzF zna%@qUk8-q8Mrv;8v!WcC)V_{TX%;<)+R&91_V3}xwbY;)l#^hRWT6FeAt)`-IV@LZ7Q7~sN zpqz`;FIXW7GVX<2EKL?%bpWy9(#9x#3l?y+i#EaoKlB7*Qvi=AQAI!Mr_b*Mh#sh? ziXC#u@^@at&o~1iAI>D*v8L_#46vSsfR*`esr))-!f4e8T>1*PbORY4fq;|rL(<(7 zdY7;iZh-zrR$_Vlk43(;rk`O+;;DDrRiCcKkls$gQvuXqPe>=!P*WEy051@W~PsrjUa0pg^JIKdy8wh2e)|iM*jzC+z16=_L z%2I#kT3i0x+=l;f(grLi{Sdg7-wu^FvLAj}@;5uAzFTotBnXhUWKy%Gt%3*21!we; zQ~F=V()vTWI&rd0MCI;{Q+@Oe3urVEwVo6-5J_hMLRfxuCG@YT3)p(T9~cI)cO0gJ zIQpd%6eWn@%=w=I$>yO~FQ0m^EV47tFlRLdnUx9K3zwz!2-RzRg)=Wyvl{}AZ9M?#4qWOXKDv-Q+r-$(4f+j>>My?-#TDR;!`l2}~sv3^1%a&dp1EicM zbGd4G=yF%SrH_2P!EJvkS#3PL9G`{ zRsIC&7eHz5-xyBYiff`N1IM>tYp~;=(bx1djszZmhw_lXCu{J%h5DtVAc2o81U8AK zKp;i~t@>Ae(ESt38SB7=o@V|FGSI(=avnTvQ3Q}V>H(if=oJH}Yd8|#9l{b3ZVZ|h z!?qFB(^cf$6F2RwQ=T15j(W48eZmEl0R9y`enlv3_bYe8Z?%Y$J)IX4N=&d=o#@R{N{+=1g@&ye-`Ha-fib83PIb^4JTM;@`bn7Z;a zPrL4UxVq^3pM3I-R%sv!V)$eQyft+$kj!;U#9OU&X=9GWCWyzj>u4yEN>xQ8Rt}UY zKM3mxye&eqk%^xMrwdfLV*kA+|JbQYqClFz?aEr4hfYzvqqgwCjl}3r3J)4dFp9Wb z^jdpO(YZU260m2>mhn30*4~_umxV1)u3ga#4agY6MD-PO zhvhK_Qpj2F%@V$Rc}??y%Lz?+%`@NON2Oen!5>#ibdvnW6C>p50;4I*tNoz&L}Z7C zWRiidzC+|gb{z&I|3JBLmJ7qf%*OQH_tm8xl2@QXptIQn27~O_ZR786By0 z5#_p^_vyl(q3|6?s!(x;(e_QJ&(?dVc?H9Pc`5;S zL(^8tXM{eIdTXrk=4KpWew<81_UW<%(UbNcvVcaHhtFZ;&6kgcV({)*>tEw^N}k7M zJBsL)R^CliV*}0Bh74_)Hm3x+;cq4fhAS>mn+Nw_-E^IYA2YKKVRc=e)+)X|Ba=G3 zBFwv_L0TOA1ypA+IlY4rAo^_2%|nU%1$~u0AHRs{D+ad}7kXo}ot>wh)ig9)+`?@6 z&gmk8>fxFNVkbVkJ=U#2H2+5!Ehz4}pIB^BYB+EI%}o*Pnv>DJ!~^5FesR8bXcxoD zr2K)PtNGH|k0)MlSv~zG?_jITCtaQCZ(6VXQ*L@$bY}G8`Cm&{>dPj0Hjnc&AOgIvc4ujN$XQQijI`20N>h6Gpt6 znyg!6GfJi}W>$8lYZPS(X(++V$n(y4cf9nyJ}F{-p7HqP5hfxB^{FDa*w)`{Rnjii z(3_}KkS{f;Xrrn7t+_f;{Kee`6vODd=DxZl#p$lNx!w>Z%pG~Y307H^u-=!e84@2- ztiFrl+mYyoZU??a7re7GZs`(j$+`YbZ~DZLMA|!t5Dn=P1##C~UrYp{5xfV1?(gt6 z^^{v!zMe%bq(y(8aoGe!1mKrMunFe;MTh#su|bf9Eo)@OWqOJeT8_Yvj>Njum(7U18(%N8A@K#2&;VZQ^ zlAQGOH8m|H)rhR6!$kBvN>tmiNYmT4@WQ}-hL^lAi{T%sIiKrj+mRJpXxApPN4>a@ z4w614k%~QEN(J&x_OiD=z1S{D zSt%SD;MH=7y323NNBDh_%M%#ktU9t<>f3wi@GPRpzoYBhWHGykw)V8x7cO^KLZ0_s zBlq%+XG@##_tpxFeU>HadT6F<59|m!SY0x;%ZUHBTu-d%d*UX(iM?=uNvDPr0hiQ~ zV=i&8r4O*p6g}PUvzvF-^Yg{;cY+I~FXqh&w=)SHzF||~wLWyysMf*EOCOF>fw(!E z^_}SvcbjrHOy5PFncn7_X5dj2ayDnwa;L@%E-Jl1$UV&7;oJ0!=o|HBi7j@|QsSQl zu}z%W&sGdt{lWILx3VVl#Prd9?qTg@u`k{%ty%#ogCP_Bpar6x`D9Pn?KFtMtvSejSd_hCZabl#)pMrdddrcwY)6lS&T^ak>x*k-wtbFElgS6{4n00wj$OXCMfWwGE|6zVjM+_PXw^3BR4S z(HCF!?#r1kB`D|&ayefW@FCZD#0w@QjHOHnMj^bZuq#|!M=Tty*JSMxpJR_i3|FusoHdPM=1!D+=0OTm?# z=H4I^Hj8}L=#HUww+m$mtIAO}!k^j?Aq2zLNKC{maL9cJ#vB8V241~Uk+1^Wry#a} z1f3dCyNIYcMXc6M5w~U8F9H)u1bs3TM(+97jN)^HksER!I21urOP(>9w_IpiZC|?; z_%eMAtw@2r0}Ok|S7)^XAj{`F_KXXF#tKKFy4$U%^hge7yfYC9JooeJ=k+>r;|6S(wc$#7Ww34q>KG;nl@p$NI7xl0sbIIvOwIy*u&Qf~bTPUjxU65+J-f03Y zG1{WdF={ec>uJ|JT87>RX|LOoB=WCLcz^Y|Y~riv+`e4-)4nlGM_qvTt51W5h-A&a zP-DBprbk1%co)qqO?zjDFD|R>w-qG8Uivx3w+wscmrsV@S>ROIYap1HGV*E`F&9+l zq%(GKG$H-uRh@uC&lG4CypCE9!@;-vYHso>R#1rjQ&RW{u;Nl zDf*T7aDz6cMSU8)sIgY5La-5ex696?vwd}>l}3BETz9*rjn`c*C{-j?1J`aOdxVco zfKwc}3M_fS)##*4R_%SuOkXcpO4jeD`$F#_!V4XUsDRz`(zG5!LT$GlH5gK)k%FcV{Yz#EM^y40lYkuw>T?6H!%e1_9=Ar@aox&C%kO@OhnWTjqeM#r@MOM zGoL%Qs*k}?oUPF46&rc7)B9gnTip4<6{{|Jt z;`x8A8)@z+ele*ny)24r*Hu!gKmV!3JHqdB%Vmm*qS~F0pzWBOpkT6?-l88qT>kBi z`*wW{p%OWEL)d?yK{&d`m~nOYcL541%s4bW-1z9%orx-Jg!hs#Bs`P7(_Ez}Tv0kV z9*@EZ=1R}#M`C)@If+Vs=Q`1M;PRP{$MZw0Viaoh!YwUHyONV!la@<4IESd2Ptk9l zYfgBze;2Ka@OK0`#Y&H6QaNs&M?tf<@`n>%c)sa(Kiy<3NRGPheQgX)v0GuqS_S%C7U>{OIFNN5; zrXXZE6_;Fnbu+sz(R_rc@`zJ zI;2oxQti>S)l*$y5HvJiSoN#_X)}Mw5Bv`=cHBCA^(K*MfZBxy(kq?Cmj!dD~^^ z6OKn;t`=pRsFWIanfniUe2=wDVJLz2P-BYqU8~{RQyzMc_k;dk)T?~`1l>eU{TZ^z z0R*xI1d}MUJQ??_{&9-m=`qpngHg5a<8_`2jE9Y&dr#~1#?!tAcH-BSsoS+v!2xt~2lP=kD+*dByhUGLrZGrn&lynexv ziKuIL_DYVfT=l76aAzVm@+~7jxCFBs3vnU#ypko?sZo_}o=c6ZGu?EhjYdS!+}w z0J|BShIw2e$9r%knE6@v^9yJSY!wUoA{KJ0(u=8}Lfitd67q_%CZ7YJ3Gm8(m>bUv ze@9t^W+iwbli}3I0GpnJHil4rN*;`4aA^)PW_K=)BO>Qhh;aHSV_47$b)nfSS4<=&99`pW~_UJ4`^#Xk1bo?q*%TQr81#Ju&FDW9aq2urnwDBgI z(8)x+MA552y>+w2^#u9{XcC0;fGE`c7O2$%R2ey;)m5C=K5Oz;fHjiwq3V}eB)tVx zvu8&)3e_$mqqe8i1aiJlzj%_kVT)Yj0-JPb zd!6_L3&mKF{@Mh!)&M5U0;)4|Kd)NVG(Zc;NJgC$cAp>sW(*{Tg?|WnxdhmQB1Sc+ za4oQ^otGl5=RN44EVs~%U3m__0_cnb726M&GZEcDVE~!^@hG-f0$tnB5l$%uob%cD zbL)9(a3!M^TH7!G>oOqK9G)s>B5KC#$F?_}oJ}M!E}4^~}tD9q{}mi`Ig zhT3>aS!(!CnI)U+Urhn`FPhGv@HmQD8!07mu)KkD%tCK&$1_iS<-6wDAlqZNBl@n#=`lJO`hj zV0XtvQoe~Z5jvxc4#T%s>Zg#PF#{kg5syxw|6lCAXIN8P*8qqW3y6iLlw3tcKt)8P z8_QJ$lw5izN|7cYAksN1A{GP{sR9uY5osd5Mnyns=qLzC4ZVbxgyc9Yp!a>hZ+_16 z%seyC{1AxQXP>oK-)pVCb~zpeBrokqEH@Z5gNP{L*(q@uNW{WDYm`*U)N&t@lK+d% zWldk2AQS#L0Fv#C=`2FltqwVcb`|Bft&Z9Mi|w9gvDpCHO-6_FE%@g?yHk93R#ZYJwsEL1i(R) zFpE;IsiQu4v>#bI-tI^o*#n^Q!K^%kGv!}5p^cTuXa{!LMZ#dX=HxH7YeXi5*rzTu zl0>#5Sv|dA4S-rN2%j>_F`bd3g&#j0#DbUgb5fv*ze0G8q!4kDtb>vTV;+l|BkPjl&W zo{3JxiX@GLkUZ%S09+j>G9WfJeI|9LiXGeK34l0a7tz3q2>cXgMN^ggIJr4Z)FMBo zf3bP(3JF}l7Mlk;w-tQj;&<5g5c-`}Z6xhu?T$?JGD=`JEe{mKUy03=4knC%7uD5b zSo@HhIJ{*=+5F&0uBZX5eQ*CQULTH%-c<`i?5xMF0Aja$*@N9^iqmok@P~%2^Kq6I zhSh-ZYLsmk@lUZvy8-R_x-T1AfHjSgACSYfq&~#b?ygAMnkMSs7rx6b6DK<`%PzL+ z3NCu|T;h~0u*g}$_QF(Ot==W@XqE%^INPZ6Vw+t<=oTT&clOUc{bPTzxj8NS!IxLd zwPjq1Qw~s{i7+dlY!e2TD{^j z*NQ%!Nw zhCS|dBB}@cerh$J~ME9wSp5jrwbyZWEdH#z68Y-7+CwdGz~7WnwmQxhT&BXT?%GtQoEsRD+D{ z>m`8rwrb7{T41_%(?^+*A5n;)H%ucbpfp!(tf)7T-na#Xz9%uTJPDZoVg5M+bq3bi zi5~~xU#)8EwLa#(D-t*j5*UExa@mA-e8etrvBvT3?82uYEIQoS*}n|WSR+F~Iq&VT z!j=k_LiL(eBc(59Vh@ zI)7Rmm2`pd5rUcmlCtb1*Lfmy+})tP3}AG&0qKD}ad>C%3b_(D&#GVY98J3trf*HqOrpc3tqht(+fQZr8R;__bP)32|11B#ENBR zQz0tW^fo_a05iwGl-I;$;f)P^k^?fD@p^a;NidJ+{jL}ErIPvrK;%ax8!l$JIVcGV z1S8`wdYhH>9&dPPHx_~7a4@%wp`TRhI|ZZzDg`404O#+?gAkV6Ol_07TcMnS41!&v zNu?F@FD3$YAm40tYnC^d;57%#{e}X2mw z4x#a8E^md2UV*D|A6UBrj?Wo(FxMbM4It$a4}9$Vo>jMk6M*{%4bN#m_YzCH_q!xk zrd+PJ zPlHr&!iWGg&6+U3js*i2wc(;(W&l~vu;#_Wyb~O~=pF28K{q=+GY)CwLQP?AE~$_GvMWdEDwXVor$8_qj&K%Q3NWPbBOP= z@pM@7N=Yz|o*#=e@}VYuSegg&*}5;2z8M(=y9P?Ei5Uz7=e6RLr;GwHDK+89x& z4(9f#WffqPn1#LY_9LRth9CQ^j_f-n*q}#MM1HIw|2gv6un)k64J?Ry1d;JXoB1RP zX_Q6v%HhFgY#U=`fdgAvr~r2>^EB+wpdu)&6#O?k{5M(z6L2#Gc+0`Qmv*AB{|&h~ zHTjHFu`glStpv@RkJF4y2i>_^Z+&3UFwOmQ7dpTyM?W+x9Hg;f7?=Eg3Rty5y=Jyn z{~UOFO)%*_rI*Lmra6;W3$L49ux`_ZK zJE!$!<)a9N1E92vX#KB}+fe4qCwP{g71x5OtIh+NrIjNO zk%+YgmP|r*lAuK6`4hFT1H0f&Z(Kr#!??DZI)Stu3p8ltnMv!y2=7!^7}a5CW$b=C#xG_9*_^AK)?w_%jk@Uf zFuLk+Wqs!fU_57=%!UN9{6{yr`!cgYqvr?GjHAC>?GDN-?}egfrd{lgui1t^a>igm zeU3B6x911>$Pv9YtA5kk=7UnxB#^3xil8QT1+MbmSK$4w{2)Pp%@XdDE~{e~$t$eZ zb3QtKhPcY+_o+?_#y`RPaAk=ad!?CxklSITYn9cS4TWtML2`zCu&^`Q*;g_;3D~O* z5(Q2Z_{Fw4^FA_i5IeJt#h1_Qi0@th!w35GY?y;36<2|UTLzG=AvAEl2gBom*&YAfI*1|79}ploHQ*6g=_ep4^siPTEb`ieoc~5ZAev6b zp;w5Mfz9w-C1DTM(yf&UM;!oIHSBv=pwqEGxGJz#^oEgS7+Jp-`RvpeOz1>t2UY|f zJHgTQuS(!z8j!Ff>;Ui$gwcp)sYMHHrwP*W8?Wf+`djqO6$$P~+DgV2>EXo1U7-Dj z`ZI%kPFAhc1j~`B2-0bOXW1xkmdegd0*jL0a7^3i@(__=qGm39A# z-s;cxykH*Ig8@Eogqhyp_SKtb%;e#Lg+V67E8;UoFC9Nx$;Ff^z%=YNR3h@{+(al| zct+IYnyk_9eckZ7AwHUpuuSZU`9cyi3*`NYPRTYgCqSKOGKj=e$`8AqkpGCsJdD^| z%hZbRvriude8Fp>D)O*e&u`Oo_`sLr9EnqysrOKBF0U2icc^QaSXZfIcTV*}uN)fW z94^&HoCW`Ki^=mzFp7NHFGu0mcGC8-DwKwx2MO5(r%LQF)=HB}V1P~CTX@gS6)J$_ zQT4M)vL67XMD)trR&N!M%n*>ewZprbNK6){E^m9$!8$iJyzR;P5`A<72EBOBjqPV4 zW@a-OX}c#XIS9oD{L!{8neb~B@=ki2=kXn&9)_^h;^D&Cop5vuOWW7ZTigi*SjWNu z2igp8jq9ataYAKrW4U180XKp0YW>!%{~S?+lWe!4sE>&qebLKsB(%=n5>zejsW*pgC(opI%YtiEdfaI++Y>w*}8ccvA1@mI62pC zapl0o-z5k4BDKU7&E4m1=cP`du8$@D+9 zAbI_Z?V_xLi>Gi|_YIp5S8ZyYM#C~TyG=q@nG3l|HrZZc=NFC}N`C(TH0PPDcp;km3W>3-JO8xR~l zM?iDEbfPaUjO6lBxo_>7@|7|b{5m##Znr!ca%DP6-`>_<-crd+a!R*vNOPFv@vjj* z)$00c@qu2@9YWF;)%QUyxAwfnnMtEw{|ttgyQn*;HyKm7Z8S|7tC-m&I-AHK|^5?)zy3#7f@N`<%f+Dw9P7HbtCf~drgao*N!;e z67S8J&v1QlL+ksg?svxTUuu5X|K#Fz@;XY=!RUPsGWI4-0r!WlFELWX?JuM`>lmpT z$0uB4-;!QUPIr0dq}Lv}?{!<35nnvJqbjTY)^H)&J|^sl_tAR`QBl|SF*umYL^#r} zt$FNiVpm69{?W6pcW;5)F^6g#qn2IcMkS*jI)9Z{nyYYcZpx@iR=H4YmeRH; zQgf-Dw4QPi4^J*d>Y&C&<>Lx)u6ES5HR;GMfh~uWsZ7sgd8yV=-}`lZ!c1%x)~r>V zIHurE3?H^nVJFUK6y!9FR7K-@-K80_4Xc6dC z-%Es&2Zn?^^z3R#V)g`#)TFQ%%*)&hb)RUkebX{gZ$MUbCVWBYslhr6h2)0k!-dHX zqA3l|!HMZEx*?X%`hiwixtrwK<4n2c1oRbd6b#sg`~<>UJe*EZ8OHN4>VI>9I0Q_ZQoXhBZtR|FoqW?vy2f}@ zRrB0)aog;yjnq?iWgc+2XayyS{TaK8el+t)3YjHpN6364q@GwKl6%FUSXeP5=X zDbg|88SIheS}~29R~fUIj=IZ#%&2j0Cc7O zpI;NK5ELhFdii3QJvOp>Usvy=w+%yQlfGV3mglj%_9!`J-=Fn%X$HP-S zYed1fP__wEoEJ=SwKpHs<`Y?{(xmyh-TRs78l5D=U0-Wk%lUd>T|RBvgva*vRIXCZ z{0sbX{bI=!MX+=PyJ7pw!54DAHQkF}C;F_TWz-~Ft2mD|E%#3B;6#qM`%YWwr-hZu zqn}T<1;-pom9pk6v5xlkvc?HmC)b+l3>J^w(u#2?d&Bd^!j;2q zG-Q_E5wGD`9hbhlSk$HH0=HmDW$ufYV-8~Z_Sk27W*Tgx!M-?}OwI}Y>z#3rCc`2H zcQm%AEXd;Ce%{75*^9x=)t~67d);12=a6521)&qgldM~luEo9nnWtbONN;zn)adni z)qnp^!o?2v_16+Kx-SjW+zL|!|9bmzlrjEX+crk}ZEI}RrfshIEzeY2Tbvb&jKEJZ zlsa_DU4-VI_M*#ON;@=+&i#!?$+g}w_s7WNvZ1akH7+YnwcOLhzo!beO|%6+s^@uM zRVGEKN~Y>Zm|eETD&5UhoHHhxd)&vwQguT^Kz=^*@0G8X_R;@mr*W$naV<@^c3$06MuO{$pM2x1UUG zIkc=zKbh`WIUk*ynYH%4_MMKqu0|(1J1h*(=Vp9K4OhAnT(WIJ5@-6r%e}1f?9>IN zrT${m*Uv`O!&Uu6EDJ>C<;L3|G*b%tRBDFY3Y3Cop=A|R*S0mA<~DZf=tbMd8|kkn z!xm#a{VH$Rlaz`ihdLUDT}ZWRp#Em1tm0mQaY%{!SX#h-CDT+VG3)yUMZ14&*O*w6 zp#VrC>HLrJAfZLQLj7AV&T%)eB$N5{bcdr(_O{;cf=_vA4?eOgj-F|YKeUNU2-6kX zRlNU@KGX(iV3X9smiDSD%Fc-ukU35fL)3aC-}wbz!s{?MT~t09M~pB*2vy_m#y^_J zy)(ye?9Y@Nh{JwO=vWUXKq}4|Q{JBX%w6Jp#?XUa5r5LSVa+Kc{)SUVd~14QD1LFh zeJ0c0;epa7A6ouaFZ8~#=hKuJb1kaI;|rqF z41R8ySC)`@U|JV0=1%#Mt{g14)jzl`T}ed`o%1qC9qaAUS{7b25Es@o*+58(NT2*B z#!seoD66Fu{}@U)lsBXEnsW+R`Ww`zh-@xsP%vl?{>Qbew__AN?^44lsO_%@4cxyz z-F5~`?#ysH<+SIO>1T%-XCh88Aku3?+yiO%|oC4O^N$6a{%E5QFAZ;K^v;q-jo;D1apkyKwJSXn zep{EO?EZ=1DH3mF^rB;*WyIzlpW@MdFioiK$aQOR$P_7h?4ml4rk&n6B}Ib9D;Fly z>y7jB_ucv)tT;Cz-e34cMA$L$`I#=Foz}zS{(PCjC0e|dVd=$BFEZGZT-sB11(zDU zAwowfEB>k^7d6}L``ST-9*x4S;r!EvrSr#cIbBvO{!ryVffcs5Hx%fsMI!6iebzKW ziT4m}IlKzeGiWAGtuo_r9XUN=4&3Q&*E?qz zH)YC=bu-AZc!Tkx6ZS6#R{F87y}k4H9#a)4Ry#8Jw$=E%NnOd!h6@79;~Dp?@~Up_ zIi8zqrh?u7xHyg+G=~a@jb1p~DO|Ew!nRA3UqbS26@(d;v3qQDKAj}gHQXG(Q#GFv zS!-Xa@fCiknqT68?>Sl4Zq=Ym>|?uT& zX?&L|B>o|9C~_~Wg${PGU02j~Pwr8VHM3LiRk7ABo)F2AHGnn%HB6x!QyV0_P4rQA z*xA0oq-Su~KF`mCWZusj45LA+#5Gmc*gV z17V-EIpZC6=ss+0{4%gK@yum*c6hZEc4aW0o(-EoLIIJn8%Dm^LEs;|H&|{3W2dB` ztXW1~1Y^1_?3tZQRmA;XHeP$AD`!x#)|$Pd(m?C2!r4yab{kXm^PdtuP3aik>BtSgaEERtv>d&(<3AXHdU0@ zr`^WOVbhpSTpt1L8T1|>eO1SE=!USS=tSyLrAQB^auLiUkRW<6}Zcrf4P5E?6)ur?WBuOnt1BhIn% zQ+JvHh<(Usb>FI~>r}wMD|9Bod^bSIAc}Xi;Y$m&0^&=gI+ayYJge^CTD|Sk$=l2O z%V`aE1L2LqZ4y31T&SMO@gSuWx>8*2EEu(RGmG7z9?$`qeuz*PuoHAF3F0(s10i`N zu`C|QVCA+~=0EM$l?ZEg0OFhDQDv1yUkn+7U3bm_$^#d5H$Wf@P`RgHwBZefE zK7@RaJc&}sv$N(Hr6*&rmj;W%(&6Xt#Vus1H{T@E)J27*TJL<#Yk`DpTNNY;^qfRK z6KUS?%1^M&Q~z=cM2v4> z=9WRV_#c8}L2~5-M=p|2c6!2|x)9b!l3`i`&>j;`~vePwHOZh+)uJ;nlf*=0%9Tl?F2DE0gl72H+|G^3Pud?(2y|i;}?YtQBqm zY}}V}NS=izJ1m(Ctv;5Cn)M?y3V6nAT;MT{UuXZy|g;anc zi5YMYq0IfunLaXiyxS{SVh>QTKan{DkqJ7&q_5yX`27DKi%^#Neq&Ak&}>5*+uAOT z0W|UlyvS6APP~gymUw3R~7yX|n`CgRZ4AI+d{B7MhLuM&bLSVn_1 zx=To%Fz4sQZOz$dcJZ@kg^<#cIzxZgZui`DeCkn{NNueE*RfJ~d=?z1z8? ziI)vEvKL-p)odQv>90$G7x)l=vGM6I7&)b(An25XAsbW|QkH;SpKTwLmeqO83g;b- zF4s0zLwpe0jx?bIIq!UdhJzO#(^UR`Oo4A-mVaWVFjxL>=0$Jk>eCoz@+sF3nB^e| z3k~7g#2{_6@`C+LwTL;L};!`1Xsxv?}u z{I_oor5Pft!NZz+kVm;chkA4(y}OWEIu-^hL#YoaVB{OsiAH|v{ z8O)d;5CS{fOO@sN#a8zPdFzQ~t{=uz6}Q62tI)|u{|k1GoQV8XUIImK^NUTJ!s-|o z43brVpx3w-xI`g^7gGxz1R&NQgzdAV2BJRmP7L-kz`&FLHUB3x9s-8*yP}Yv6QEI~ z0vSi}+ra?EJ%Q7=OTCP&L?*5lOGXu;3j{C+EfU+RL_qJlN-~53AZvFF;7|DjKfn{t z4I;*ojUofY83(R^p$S@nhDZzIs=#e0&|Lql_5|{7w-Y$CRmjgDz*f@i^uQNLqlOhI zmG?wO<==2VG^5T(KsyQ0}uG`^DF} zk~1TWdd8j5PHn3Spiqn7u~Z09I;vjeQgJMw3XHM z0&nmjGXCh4Z2_Qx^mMZb)Z>8w7I475B?Am)@(t+Cmzn6LBsAj+LS9ipi7X@Yi%o|z zO=AMiSlTTTN5#qbSWFaIGigO2(KX1})K(OMSnY}xz%FP5rU}&PRqe(Sf@%HHMTZke zmjuk6$b?n}q#xjmu~?LgsSCIxFTxTxf(J8vb)bs=Ip(p0bk`CeBq~&AhBts7{Q=f4 zi3Nzyfe0CEybxf>2AMlHJG<3L=*Ugt@|-*9!d%JwH@HyzZ!oO)&fGTwhWMAVFS0OS zN^eOP+rB0&y(+=hF!Z$gOv=35D;e)tFTQ4VYD-OWnaDA-up7M@J3^7q&9m(ItPxN{ zT)qIpo{$BVBfpmgI2*Q*T;KzX^D3r_#W}!;Ps&8?>s%a8-1beM#?nru+=w#?E6tN7 zYq2oQTYwRJl;19mStaI{Q=<0c%`LF+p)Qr65&eOmJzZG_p?4K!cVeVE$i%iP4Djx%>V1L*+y(f};)E*LaLoTYMaZZnd8{_Am;83H>aMw#a zA!MP$6HX;P1;v!dgXt_F41%=Y1`lxPKGJ1Cq%8&JQ^B>PG*$OK=9QB+U4FJ7%Pk_`}@Ems-GY&)ELSW>$Qt>!E&A|hie2ryL^Izn4)AO6VsKmS*E$9?s4mKEV{m zpi<}RrMCV%ZsS}GEI7ggVQfr>6xEUQeZEH;_IUSIY3>(71S|}3vK8sNO4tUN#P;4? z-A&yA^)1Y+`c4eti#@wq?mNp&DG%NzFb_gY`y^|* zG?YI}^Gm+x(sRtHlTljNcCXHo|n(WP==NYXzeIQ5;fp zNT0xa$QpL64pdouBT55Z@lzT=x{G#Jfc;^il7;{9y)zlH2i>Jf8y=LfClGrITbHeO83hxKMc}yJEU&VI`sTR+ zC)CX1ltf)(E(c#jtUJwIGoGtFcCALf*ZaYn1=)g_^g9{0vllFc-u|RdYk;qLA|_0( z_T>F= z2@&%c@h-5}pG1plUsiLqCsK1K|@WV`crjdL4!KQ_^!rT!? z{1^t$15oBqO*~&Nl>ZqTaEpqM_s=mMqg9V9$6@Dh>!m(+-D=wO$+#vKL2XZ(xJJvk z2i8swsqcb`%`x})@M~S}Nhjb=ksx^tykzXUaXt|WXT3Aw`!#6E@RQf?X}-kqcF|vK z(N!ul#4~>RUIhzGW+YUPcqW(_M?!xHXyaoFvvX6)G9irepAu-h79&QD{?lLQi+>c%>7|`c z@8A7cHsA!cf!Ds-wdbN7CgA;WaeR!qRcgS7(LJD@=10ljs#A+REKA~9@~}fPU?TFT zIw(M2&^BKeoMbb?Xorv$A-n&a$kIYGpg`njo;;|Uc7maAo+1=wYi90)jvs%7 z`i=SnXV^m)m)kOHh>U_*AA#iUT(Q2>%Uwtdb5FMCuo$-Qx0K~n&k9Q^dLNcV*BAo? z;h~@QoT(g-{d?Cpbq4?;>_s-it~30Pm<1j9Lc3e~_U9xV#2rWGPS5>x5JYMllBo6e ztijmvjk2ikRb*yMFQXu!Vs{9G_6hk3{uHB8_vNSP>lPBqv-Da=kHw0&=_%xb6ek=P zB>>l+(u8~Hob9)8SbRRfiq>I;r~W-ZbK_bmbZvdgMRo$0=X$@_*}zrp{u1hu24r<+ zdZ`>F|M_a^sOkI42lCOpwp|Ug&Yf`}6J22l%{EqJU)4D~1Hh~!6!{Jf4tz2) z({Pl8-I*z@jmF*XbgE)L3Cj9DvMkB~-189Ue6g`umq zM=UO$gwninV+IeaiD&zDP$Hi`b@t9pfyOzp6*P`UXb>|Ij0Um27kW(EB2E^P3? zsA8`VE%$Pn51$jJoFOnpdD;Y9cA^zrt5!yFZ>+_EQY9J23IlQCwvA4<8-D_Y0qp+_ zqA*U0|DxCm69}fI0P|?LrshWKNnfvTPHKK@FnjTTQXh7LTP|+{UnFt z3WA*22W|Md$ zs2iz@|Mqj5#m`-EwZOJ_J`T_eoL;sTBDUi@oS14B2~^ux7d?yH=(h?!pm{vf{b`ko znxA||J3s?I(;2wlx%JX1)48OFOew2RGnwUs>lRm4E2tgN;OVsAdZ$E%rSM51(r(FZ zA9@+P9>L?RE@2+tC?Z2(Y{~+ZyGbsTOM`CySHVKgT{?umu@;%pkod*+avjQ}A4nw6 z83M~b#-RF|Xu&mPZs3n?z>E(&Ls8gwCvc4GZAe|P2G@b+vch?!u_=cHzSE39%_Gl8ie#Od${6B_wr5;&v7aX}` zw5RNi8eL?9EHLuqkfj+w$JDKs%YO7)xa@qg+&baAS&!uVGZ8I=1D_yS>NFP}{j~AX z`=Z9Euh**O_|y8MFF0$6ca7&b)Gs*)}Lrp=*WOPKf2jRoqjA z_Bl@JR!1&bW|(MQR4gNgOYo-6%MYftJ<`rQex?Dtrzg5JRORxap6XPS+M|XKC+S>h z?k$(^LSrY*tiG8XXUb)GR@M!r2w+VwgwDnNKnO{S-l=b!m-Mxmg%YIee#(UzUeWZJ z+}xIwEPjDAP$QEJEe-B_=Xkbsry9hpp}87%N0~l)XZrq-V@-dkrv3@@hc{gPCrz?n z5-oz=gytK)D%bqAR+-3^q#inU?&Sx^%B0tqZrqAf=r~}Tl+AP1Z}wV(uqln&d)lz87?1;cTUFLTgo(-ap3lDOt;BE&uIxI-)Vjs z+c=~(u3vcdsl(TC!-G>6yA{7ZxO!2Z+;Xa{CpWPpK5;2juca{(dv>FW9VsHIj^?g^ z;K);K*jYVk&DH znwP_%LQam6=dPC@T-H=wXKuLmwzGcB^8Kh`=>^XT#W(^=tR!UP;?1g0-Mc>%HUKt4 z*-n=eIm;^~N=J-&;;t}pI5^pwm0bHl_KB>}GriNB|Muv?V4;ki3xU z-F@ArJ>Qr&KJ+S2*u}YnSM>y|V=sq&(`BP5c7&KczCM#B=Pq^n8bX*(Hfm=k$x<@U=_=sVnptv9}s7WBf+OwXIg%9siznKrW zm{RxWZZvOPy{hDnE4E^M@#Z{ucvHsqRhTSHX9AAOSEns2s%t3+g`KI=Uc*!meVO4+XEs(g*Jf- zsQD1&9a$+fb^1rf05tnRU5$h z_SE@D$&;9QC5uySqyrRrD~xW6M&FIi>_OIZ>7&J+XyEzXrm6JZ`>%AED{sg$m%ei+ zE^0n)C}UW8 zVdDvxn&cBV9gGW;c-~$YyjEy!)U6@kF*IiLdM}@{RQ0+AFl_n~FGHuCYZ61J#|+Yf z&aXyc)*Mi+gP4i`w=5Oj?yz} zMz)cvCl(Kx?ZXOglSfTc-`snh+d5vZrrDwAlK;>8{r+_QtP6?HmB)BYo?Y4&;{rFY z=3O6gqE8(+`w6!;zUASPmVe1PJqL-)4?>SUnaf6xYcy?B=Q=Z&hbR}b6p--T6liumFLcwQx1FkAt z(R($0u%j^w6xcpcbI~AX-8W}#d%J6i4*Jgg&UemQ;EbQ>ew^|h&3Ac8v=m7_HV|Uu zY%5i%s_eG+oBrQjiEVF?^}lxrj$6`(_T+lh+3s2u914mA7>w(F#P?>z<@R08MBC;cWy4M zXJqr(x{kQ-Pzj=c^B5^>RQpp|uRCMcClSY6%N--xrnok;kmMl#-bt@$a%`|#@W~Nl zmrovJE)tuP5Rpx2UUeTKK(UF*QuFpNsf{( zaSYWntv9}M`%au+Zk2AWUm(G>x_kbl2%A24hUeV%h`LS{jZ$o7V)(F6#PSn$70#d; z_EFT8ks6$1)OG8I`M&nfyz6ImUj||3P{gP|+SW~lpsA|z?!BA&~T9npO;AaKF=vID34wV8GXsnMnKi^MwrR@Wduo};QK?+u6A-!#-|IZeg0%s+#`w#q*AtgO>d3Xzg|yOVUBHQ)iog zuIX*h(JFjx?NYZrhAg-|pY~2?#6mBjlg<^frCgq&4F1Tt_ST&0Yd8ewCZGV( zdLrpvRzz0#yUMWA#=bN30U8qEqMNXUbVOAc`L_|P<_;?kE-V4-W74hpyW)c^9PdeS zW*93gFSphAoXi^z6Y3Akml?P*@K*Y=-_jw~9l@)ZR z9eYLYTwZ6$8JaluyDu-6Jd>FiZgI!1Rsb>xpQEvisD zv;K^Y#0f=|W>K*WaTr@28jICkw@$s)Ik;UP%dlt6^?Wdh5uWA)7(PLAQ~E&AM`bfb zb|Q0q6Qp*&64cuwos-7orymOtMtMw}J!Bw>=J6YfXceJ|WR&SoDH9KbLdOdy(oHy^ z*|o_pww5r``0_hq#+Co{+&$idm4r>s#A32dCcDkV6;&2DQ8VkvSfST&%1w&Y%P)iTr^~jt_+RZ+v8T~V3L?+2dgZb_}dTCCIYg@}u z`uX16i`W_!72)AdLj&i=6n^Xj2C>1X+R*f1srIE=a!tmI(2koehl9hO-OjlUmTr^f zvxuog*#a%(sSGqns+QD?7`ELc=5#0%{y28&+pxSe>_dAQ;;}NUhQ%MDC$EC@s2sxT ztbcrSQdq>$BMn~>xPh6@GCkYxdNp9E&_}m9=C8Qyzy@c0$|V(PVe=PU^x<+^rcrP7 zR@-ujlHwK=JVz^RS<@gHU!1r<2AvZVZYsnkw28IY8-BvhsxWGUMo&y@ZKgF~Q@NSR z0)I>2gjl(jGj)=Qt;QFXGLx{Z#{H5%deCM9>jHph+(jZAHE@lN%=~7iY0bglH6XjSMNE#;tg?<3fa-NEv-9InFB+Ue-Sl% ztqUMJAlz~nI~o+l$ZKBAnPwOvR6(SU;BX#007;2YPxFT_9G==d+;bi2U>zPxHj6gW zO@^GK2x?VwnL8&PQu7Oo(EN6Nr|;LHBgrC-=R_%8M(1{^+v>h4wZ=3I=gi)`6=tX2 z{u-+ohJJDn@_kMw(A|O155S9#wO@#qMP($ROEP+~Yuv;87h8!YycQA&aA61CYH8+s zHzuj%3;NKwrJ|4Ckx*)P4obolY%Sgs?RTB=YJWqN=N2y4CGYX2(Ty~a!z!jyU#`GW zdQmQb5fTR!6_8U-Z08J-s;P=h4rwRbC8Jlp0?{?B^OPOq1}ie`#K5S-9#Gbx4#GE) z6QV2fFj#dkG$m%LCG+f(dwO{iT$FS`^mFcPj-9z#k;XJu7wcnA!gX%*_P!9rpMk6tS!aarOl|OX$R!GY#e}+(%hdLS}_q%L>mNk>XxyQM~uC z-yVredjCpXi+T}1#=MvxB66O@xSIO@k?F~iai|5l3Yu=Wy3m>Ng_u*s`ITue(5o1hR z%@CSIrZ2ESHQ&O7D09QrX$UrrqCOSW`SA+DP7^Z!r~DTdzt{vbJk4!n8FqN;Nnnp! zrE9xOrMTUDyR<;2*~5WK)(ZIfHi3na#X9=X8_jW5(I?I zgqtCNDIXa1vSUW{BNvuWd;<-KH6l6$I-|;IpYht;3r&H{Kf_qWRtfWu7ZIXm5W!YzHTGe#gTVRU(0rZ+{7*DR6 z6Ljq!scob^zH9Mx&9_7((2GovAeIUtB}9n0R7)(+6pz=#C2MQGj+~kQt3z6EEb41p zQSwN|>%U%Yc(wl3rfc2#LmaN()-fg2Zk44=>OB#2>D7x!y&%*o%k?}<&2=OgH^@#l z3)u4_eD3bTbM-l8HJ(G2)eX@LFSHnShS#Sk7jp~t)6a>KXD+##&SYL_cT15pdJ4(@ zmgI-!-$l(HEu?a_U(m@@xNpqMcMqd(8$t;#>U&Ubh~)gE2OOKzf&Oqm$K(G2+S8OD zEbe$sT%2o79mL)LU7h=X(=RRvp9O@*lQEWU#OVqUK+%q7XlnXBkby!zq6YF24Za9H zBHHK|n?Ws*$x#&Ow7H|7H>mrF8?JIIZq&;T!)Xz|013t8`M=l>9go;_O|z$r9qJ&y!km0X-7l9Na}IBrKB*?isMXfLDwW@Xmk7|k;^VLw%JqS9@KD`=K$X{7aMbc%`#tTP z1q|Fxxv>aZxb}x+gBwCSqaNT2=#rdKZ%;x{>kYF#PkSkoDO_nMiHt}aA7wbqzOxBNp72pc)q2zm9GYq^Y1og-bp%BHVhcM}|X&EfSkD;=tA6(;eTn0@v-$66Tgbs_(P`!uF!6*Pu)k;P97Vm5Fi*+KQs43u_i0u||)c z!az2}la>Er5$)M2J}5LS`$SX=1FIE-?UQSECS=3Z!~Z=s=YOUi{xdZ)C--fLOFrHlAG?S zu$lM>Y3#e7J(6)x`>vKSEd1#vduj|X92B3rc}i<#Qmbd?KQqRzmT9wCL(@&BSY>ek z0COk^5xac#@CF;^J15r79#7?y!p%iWQn0Ex`0#hRPM$KaHe6$XL*)&bTA3cc6rjkZ zvP472Q6}q8wy|3Su^{ZdV!zlbnikYz`<7sqXIyXF5j#S!B>K10Vmfi@Ae6JhEWz6J zSp0DE$_PxW1R^6@hG*QamU(G_QgGD6NV}%4Ag8T^I3g>Fo_=eUOU_C08N#Bc1JRvZ zC23?=D9}6)M)}<@wrqPymP<0WAdIw*WszNs`BhOm*DtV_&}}N{wI9#$i>{R*=Bt4B z2I4QVr+QWrHTwtf^bVoC65f|}^_dWfISZnKi64p#ScJQj0KlOu6d$eSo2!#unB{py zF)so#IU}=U_J_YHC;ypkLuh|e&It0;4NKG9JgX6-P~i?@)dyRp1^Yu^{`1xohP+Zt zsES}&sxVGG&uD$K1ZjB**m1wM=P5BK1q_u3hw5mvWHHidm7<3wAEX&rs<=^K17kF` zh1N=K_0$5mlYwk?X1GU>vtzj!Ti}zp5R+&PVWbRX`T>!;AUV+qp#}Bd>*ZV25TyZx zx={4q(yzFqU6JrMYzO_zWvZ!SDE%e=&nN{Q#jdxg@?EA*=kJ zOQ1SS-ShXT1gFW`OV(CZ%vs=8At*V>9!F%bK*l=}i)Q;4he5sE0nQ0~O4wnzE<}9% zR5c65sfJd!GD&~tJ7IY0Ke|I-IU}KDMAmu)tPHE16ez2VS)nZcJ3oO&3tR;+ zKD}S!!0uz+=#FwiyYpqMu&(^y!;(VHjq`KL!Q)sZhhCiY^2-M7XbdJqC-N%%Vn*N)X=Bf1dS>Bx8T4pYu>R(z~6t4E%Qk!oRq9yu6F= z4~J^^8*kVx1;chg?JTeEL&Pow-GD{)wjQV`J_%-N52H-WHuZ=!7c@ zmgYwL&d)l*lvVkYAG(t&L}oEU1oR}i=+wXNlu7SW4KiCpNWIK_yCUbR25L{b;#gvQ zIw05EZJej-=QCJcXVaB;#C)Lg%A>Y|WjT4Vm>2-*D-Y?x;f^$Y{L&YYzZ^pc_r*Vu zU#k`Sf~9$$gNIn!=mF{Bb#BWlxB2h9$h@ynO_roB>=ssdyw>pOk;&hJaY0EtIrI(> znYkPYL=untuXTk}4x8({9fM6Ri<($;r#%;K=(iLOJ|aw{smwL4a?S@NOA49$*M^=h zJCNo0%oLRZj;R{))Z6P@gr#zW!Z!dOz=N$_;Qb;@wNSmyt{XF`-!nA^_o(0_74fNlwNY@xWso(JVCDHqvTXoNR?q)ldAet}ewG`~;iwsAE}x=a0a2G4Yj?lfQ*lFSL?= z$(oZBRWUj5#B>a>7xWi6qI(I;@;B5^269~6rLTL8pb$n>pQBqBJ zusp`zG7hKAGZb>WNvHA-{OHWfy>j|fr((wjqv|))DZ_dh(T-!x$I`|VyUBtvNSp#) z@1KlOrG7sbUi`;8w+;?)T=5ysMcfrX9o{Z%d<5U{)Oww%2sA8Hxjx!^R0 z)HK~qs|(ZWDhHS37+4a1_Ko7v2gt%})!j$FRt z8(v~Pq5n*_M)eDEXtw`TDq!SWeRA!sZ4Y|9Q|QYT5_&{GB&Byj+(JRA^jBHn-?sJ_ z-59+n8YOl6IK$6OIV%({qReDN!3)+`o?T!(VAXo5!~JNbF8)HY zrnvFas1{MfS>6!MqswQI;D_TGm_QR3vd&iZH&7;J`-yAo-)S8+(vuQgiM5f7~?OMp#Oy8)W>;d{OQ8 z)U+;dk9_p4^GQ)B#T{ylJfdW)ChvS0UfNH=D4g7%Eg$AIH86lzp^)`b79|t;a7!!U z(HA9Vyrs12w3~Z`E8>m}pE(|wmucak+cdnVH|L?tr-AdYox(_*KFEg08|z66YsL2L zU8Y-|M}U&p`HbN^tjT*836|#@Xd+Bf;A!1F;b~QH`scM8J{s$gs#!&~SL#%@ z$)$^z+olPg?iW&i_Ke=sA z!m3%FOisYD4TW+@OQSdLWyv>#>VM{-@%4=JKrwG2QxJ`nvSDSc^x=g3hs4G%6ltxq z#kWf=P&!LBxcx8r8itR3{~He;$Y-|{41WFCam$I@_#1(zJ9?xg59!J0nMqf>I!a+E zt6dK)b$htx6Rj<~zm&Zjr5L{aTi}sLk(E`w%=@4%vHOFG6uhXW6!)D;a$o$Vov zGPc&dn7_m3DruWlBW?g$-CmiNMhfuBuk5uQn5&69tDxLNf8qG_S1$p?xDYp*=1A#QYhi z=e@Kw57;#ab+O#ji8d(&{5PM^Uve>-D#A+lg3P1y>(-grxvUK>oNUee6KUCnoaVTw zf!cUip8_5s=EWt50)^`@pV!FVW$Y21?_znZ{(Z9}D~>v=(cy1Zbyoi`x1|~?O~6e~ zCS||Pp~f%7twBGvCL{cAB&L)^-Y*$piT_OM>im?dh#z#)OvqdYOP)u`)=hsue9Jnx z_2+On*UX#dp9dsty`@ao5Uc_zj<*D~L~Hm2QXOwoBzGP>n(ThGt z>*n&mw(3u6m0;dRAX3?4O=3!J+56j)5u-MKd2!82sU@&E=k;#I_1D}yDDcUpdw z4&}*CAEw_=8u#c5MkR6%`R(4aIIG{9($>N0l+@N?L`>M7Yn^AEPOqS#@>ODS7;9mVPS4G99d;n4bkUV13SW|RrRaZP>LS+^`{ zSraa1*Pb={5l}-`GEZjN9D+d4jmwUDXgZ!=uAi9vChSp$^fJ4(kz9Hq>A9i3%}Y5&3XTFgFxVh zkbbyYu6R0cXyMX^S7YtFGovJF=~oa1rHse;_(iIUZlL$)GJS20lV&H2M!j)h;-$yI zodVvkl&sObIMI-+-1cyYLfRjX3}b^us!JZvjE6A zB5QICI3}pgsugf-SIM+V$`flLa?#pU&5x{mkq0TQ%+t@yOfj?~!-KAUH(DkU-Bu6qNm2 zzm-Y4-QmUU_LcQM30Tr2RMhPtATxepl)0HccGQmR+D(a8g$~e== zX-a!kA11hp@9dT?M9M$IwHHYpZcmZ z39v?VtF=S}rhg_oF}qB#sLW@QHH_TbZlz7NHv~U>j;$;`8RNm#{3f*d1Lr6s>8^{m zrZpo_-h^XIDKvZ4@oFStO6Pl0gL$jZGwPKPgjl$k+$3oEJ}8TY8B1QGhYh!RWLH&{ z8@@0Szw49lGi4q>WoE(Dne8I_=3%P9D_`M7E~d54X3SNBdyDdwndPNRDPh^-wo-70 z{`i|WU(Q>cH(!?L1Vs2t{Igr%XDEc)tYK@we$kCmFFugmxNzaRy&`iw){jalgbK(n%&>aKm?YwmfupoXF#BU?LWJ9I)w@7yWf3=pG4=29S%^ELBArdD&BTC*^s` z@%j5PKX0A@Z12OiI20*aKLik`LgZ~yeS{0+%d{`&x0#0cEXP>MUg@tWo`UES`EzTy zFu!GP>@omzoM0}Ale&lJjFRBg$_esqdl{T)$K$#*5^o)mp<1K+cb>Ac^`VS_138~! zUd<|Z?J`Obj9#sFTKYH|I3t%EICJB{i5w-}XAfJhi#&LhRE+8$&$^5?y{+o)n^_ld zu#2{IsPA;0^RXkuJ+Y6Wy~@P0OMca_VjJ(*2TZ$1;-l!;%scO2g^To#TV0phk8x-# zcW6%u73Xi2A879@_)?7=T!M0O_a$4*h5U}jzpIZi&3AF9Ku@BwW$|(NNA&*Ax*gI| zU3+e|U75_RDm|QZtv*Pc(*sM-&M*}a{#(Ayb zz6C69NCOCknr__NtPuH?6GB|&5=(Tij@0ys6g;7RfuG%dbgv(7vj>#NL+7+;OGdfI zx#OcG6gU*nnbtdUJsuyW03hi5SBp*8mPo;RPBH7srAY9$&nN7m_fDo|UjKNzuI-9& zZ*dKi&*SD&{V9X2yAeuB!O%@-P5TayryzMP&UvWOYy+*fy=Z4yptf3m|4_2 zns&ZkHrv3qE?#_vA+G&-&gw=98K20RKEstpgM-;Tc=X7IfQ0dEX2l4Hv0!G!?9}`z zdTY%wLY!QOT{9-tNN-la3?;A5>+xI5B&Y>p=XQoFTq9D^3jO<3WIn`Q?!(AkJ>ASoBe2r8LG*Xj zc7P;fE2e4yS*6}GS(F8vR8ny3+ zHBU&EOx*YNqSNb0-p~<}!C@7D+SxBh!JqQ^yc}pFG?Aop4l52ZA(h|YwbcU0iOX(q zXM4$jgFP8pRly2^zEBoXE_{RZI<&t}4 z6?<*khjpU_E|Ci&&Tw@d2h@JJ%mHv;8-ATtbPD{Co5-)X=%<_C?O&d6qkG$-GYQni zv>^3&r?DOIy?nsq)pxwpa(NSNdk)G3zQyRZ-itLDb=jz@9hrZD#BWShuW^YDkTpvs!%nOF8ogDmuNNLr_& zGR-!y80~yO6^AX1V24Yvxz+Ml;9H|l;H}NO)phv}SK*WRfr%A_c3)k`2d&t=w86k9 z6bT=XHrg|_z6nowRxyKYG4qqu`<($(srQxnjb1A>C4i&-Y~00qhba#*sf+TA##F;% zw6aN$s0=K?wHm#Q!#s*@;K?6?A1(pGDoYO|sx+E@r=h6*c<9Xcc%*1UI_E8=9U^Gq;9`l6 zQj7TkU#kt@iFrt8d^YM4_O}m}n;`HHlWfMRm#L@b21qE11nyb-sX1J4KZY9FrJeh^ zPl$zHT!)0YWm!DKdmoSfhY9M*c_MUtPS3Qr8I7b6mKRhrer&jA;ZyZ~V3x_rKg6mu-sw|x&ClPqX=&aHFN5zfOh=)^ zKqz8i0xo#sZ>Yy8Ai8NJtq8c8fn2$3O4ru0Py*@^#ZZw#T5q=a=f?qXF5_vIoVmxW zB^k5~BT$Vwqx+r*?0{u~JBenSCcaz2bs1sM?{<;dyQ0!{_);W%Nk}A}4OokYbe$!j zmmaHqHbK!!{}7$+Tp@gUtZNe$JCyrzocIzfqZT}Q^CjU=zu~E_5NH7o8GWr|D`W#4 z%0L4itunAyzU$xs9(x=OJrB?7By1%5hj;NFzdX0rT zrFrhWR-P|m7+B>Bn|WMn`aewm;IZ|QHu>%lH9xhU3X#QP+|zGT^w~e4qnx4j*=psf zM)Uzl7KmmxXng{HvMh(1nG2xeYDF3rXcn|Jpc#-tIB@LVGI-x`8{UZ!k=kBR3fZ-L znp8F%is;!Ov;vs|$WH|$T9j&CcKJgcfE`EEJ{foA%~DrkDq)6V!T{dS;p#eA1KdbOa>!E zSe}0Csf(ykhu^kRFu(426Z!}Y<$uqDo@H)>lpteXVo)P{`TcyCUo+F1FDMn| z$Qr8N(b3eeKSEdSyFjM85xTB}=Fp>lrG-Iwk`ucowNv)%$N-?Tt6!BZk%sU^rvG}1+bhhI2rU*UmW z4~jv`!0kwV|GLa($O$sRPC(XyF1+|j%?v+LBMQv6`BwQ~B_K@q4q7LCfl%UgRhsEg z!`qU#0&rt>rEb{BEo3GJk4JRv!fznJ2n!=0u1Li8>K_J36g~KBQFukeRCKY2WW+q=AmDGXwMzsm^Eg%Yt6pBin{?1QYIGuz@szEZF2%D zA(9O1)Pkj*lhl%p?n83^;E-#qV&%9lETE_QClGM~NbK}z`7H;=CAAdpB2VO}6+oQ( z8||NHDmvm$%m5Su(`5ZiWzGhDC|ar_D5Il*uFGCpCQV=f=Ia&9FO{Dqj7@c6PLe?4 zBSe}%u~)%{{XRa)K{^h)afLV9Tu2p)a{Nfz-b)V9G&;Ji`)Uu3 z(9kiI{KKdNiF+xQ#Sq)_z6NWgPY}pQ5E7%2MarLX5%P9Q*TgN>9ItEt7JuKat1M+=)ZxF>i3Wppl7|}hWDP?$%tMmC==ipgINv*+q3fxmlW;ddNQ2xN6*zI(~ly~1nQ-{ zl1I12Em_-P@Am6{Ws`9BgX<2J=b@>^`4QF zlGh3-I-mN(mvn$4py(_;EtfIy)ds`<IDE9XERylevnCJX zTh_r8=9S;Tayyi$G$N}({8w`?z#pl>OU28Z%RX_mQiOEL#~N_V?`9wH=2-!g*!qZA zD+(Sx>gydSZA3AmpT_sr=lPK6X5J&}O zqU88YDh4hz`H^N|v_%>AFup}Oq?<}6P*5}_?hgDI4QWs=HL7QP%-@|*eFytgmDb*V zMej`-Cr+Xn0@Q{dkGMzu2Dc4=DaDXj4?WA()o9vHUfX596!n5y*Iym_Y=pz^azHi}t?7D1;41%&4 zt>lO}tyc-qCTRM-yOAnSw`(S&wNxgam7I8;dcOS#z|IGEs2tH!Zo159o)a8Dmqt4F ziiWN%(dg|Tz)<6YKlalI80xc1-1-3Mg`J!|)38qmQ&08IAmeumvJ15wR$(6#I-|*` z8d}4cp>-01qOjx#y6uL>Q9zehouPelu=-x&a;xf(&3^cx$JH}0 z_@gn@Akh}n6Iiq+gX#ElD;PuyNpG*n-sHZtN&nm12%Lx?U}-yAtsSfSo?Z%HmD6~* zd7?5^yEjRffXA9^ZAX8PF5Ucv)^aP8q5`YeC1iekF-|K(FUPNuv9l8VTKMhLM_tH| z1?ji*O1yLL&tOrreB|}Cs$r|FuuVy0<R%BN-116^=K4h53<40rv~lb7;kbdC$>QaFS z@!Zs*0-Owq0r@b7-8Z7uZa*NdxgoGa@Wo;g5Px_T_E-8itjp>|>@XMeMYbCRZUrre8j180B&V=2x( zBC&{zV(5|^X5ocvRRlP)AYB z-Id#A6jx!_hqpb}soJhW|gM(NBUsNWwXP$ku&z^;36ny4X@#-DR!HJ@fp&#{4u}|v#eF2JzUr0TrWS+M7`Q6{m&WFa+ywQ@s zlmsj%T~ort%M}jTntuhHb#h=xiR6&ku@8B#x_Le>uW4n6lrM|DNOWE{*ZbC>VpyiF z8!gY(@-aluJ-ko!@rL#7y787s(SfJOc0ZH8p00aYt>r_^je8+APpA3|)eHKR!_|5& zBy$*(#!z&8UEz!M+_X3)>2Xb=!zh{6&N|CusY%r@d7eYBaHYH@SqZ+hPn8+UQt+l% zm$c>C+>)Jc{r&o`P?L3ZQmf~LL&wL^fg7YBbC=+Lq)S>ZnQ-#7aXuc-q`n9Yi4a9H zczZ=&#F(*sUgFMg&X*ih2Bw=LW zGpzPS8#lD!6TZVBDyf(M;sr;iHLdzSxf@pe-x4lvsga!lRNmj~Fa@!d zj4>w;qXci(YdA&|N_3!;ysI2<#LA7LTEKY}{~&3zaWN>yh`u9If_V&LIskNRpwlNW zmM&~?YgW}j)q^YBXZGC~=4wCf@mj0nAsmJKqnre(H(4=!ZQp2o#Co-q?MQQn?7ffa zRx%+wYM01lx_f#~AvOAkNaA{JylP$$Bful0HlozWCjY(BCc8vy=k`DLzC7nk)+^8cKhQD z3l34I_7}Y(_e*yE^?bI!Xj08~I^J7%PhXx@a`WHUB*dZpI6dE??#+0w%rgy?$aHdT zQtT&A2m<_CzWnmk;l=DN;-e&%1qgAp_}ohM+5WiFx0adEwm>&2v6Rw@3)9njl)!%C z)Aiw!2OWh!r(%>0*FzMyIDDoFsqgeZ_exXMlUAoD`?Tp68fP0`X5pF~^iHF+bzp8> z=`)}B?_lx|r4{L&=LPgXxQ|3n$f?cjOo~3%%o+aX_%9=92A&aJDr6lM{xbqLAlWM9 zR*U?eT~kWgh28r17n2?I|8CskiMmY<;^l#qmT|)QF=f7CTClweJ~(0b`t3q3pgeeS>waXS=pI7wSC1BD8Ed*W2FzB zD`)Bk+=CyVso|0vfdF$>&s|sPo%>uDPTo4@1g%4QKI(+MntK*;K zr|`iV70N6NOPLyvvTPI0TsQ7ry>`(lv>)TKG9l=(LhjC*I5so5&tttaI8-m@mXci> zpYMQ+w4ZL%<40y{`FQFPw!g$U0md6RU}sf*l$BGl#QDeEvoFU}gi22em7cjhI=T$; z!}YE^nn6XkI{Ejpk1mqtmf3P#BoF4SzgjVU+BT4>`KD0oax7$AbjIZ!)!lgyquhtC z4$(f~ZxT5;ilGyz({dL|{t8N~ebb=&Ji04fxxk;WoFOew_eV#>55Ut{K zRsr=2r!voXgq_R)Lg~_37e<-r$*=5nXVjeHJ*wJrCB_uP$q8CsE`!TNBTAKxG6+nK ztN@MhSK3FGkHm7T-iLh!Ee~FrZLw#)Gp}P6*IzAW+1FobqrYEyWvF zx)PQXR^zP$c0xqEC$}NCOQBy5S1jErk~Q7_e$EWT&h^syR&vP9<6D^_lXbH@uE#Rq z<^fLK@@S-Jpe&#DzE0nSe{X7s2P3yKgJ@!PtCIv>oHSp~w0Md0;Z=0U9UhK4Sf`AI zhd$Z%V5C&YzAy4*q@5FyN&=4N+qEb`Qr_6L!|6H26Ta-xq=C;4_&8uZ$W{F1aJf%zJX_kGz z9`Z8bcnTr&B3ctARKt&txe?oJw_9{%&7=^g*6Au~*)f(|?C0=Mf`tNC!L9^_+?M!c zPMH?^cH;sjY$Q5rtxGN42WN%%NqVydu$oS&O*$7}Nb4ESuejw<1GaltQreGhh5R`G zKo%UAr&e7;Njin|B>Cx@2g0vx@>s0h|K^wPvum2wx*kVwXdAvbSLzv*|G{F%B3_%zW(>&XDAh~rOKfyUD5&5%}?%#KUFr%)$3-=A-< zG@Y9JLa$dfQ^>fTv+ZuSLR{%v0W-<~ZILE$tGrDs^MG2$H&bb=3nA@|;#E@17i1sZ zqkVlIpmi`UqDETb`+3PDH%)}vU~b7TjkRM=PLm>`_T<&IotE7n>%N&^`W(~^(g}h7 zwDE#ur(|<;{Tp@4JK#Q!uJ11)H%dKnRZBe_(RKFO*Qd?n1ub!hRa66T5>1T7PIa8l z(6#E-H>q~Q*0U+!wzc~D%Jw>`Engt>JmrA3qF3F_J?5a>)4I1BV`NXaXufflV9QZV zC{gXR66U*H*ZfYUkQrqN#nQA%1F0!QMoeLCpgB&@eyg)|`ss{@q+&h7jZx)W7ojUX zAP1!HsHV$_+{TSwl_~8WL6OJ`{FToNqfhKqWNwE{BhCKWmhZfswIy#yckhO(G~F*m zEhmNKn2IV)E~hhzFakT4v5`gy#uR7|TnqY3&ys~BnLk4N4xi>J=cRMysk<;_s<*(I z&dz_BQeRlFcWo&665E|R3pATvzCNpejfsaV{X@7?P@0HdLHV86=er*~-4G}cIoJ~a zf*+SCaNoakyzBb4%BQT|w})}>;%!G1f|V!I-){{H>nRd(lnpOr?&?YSa8P1CD=B#m9HVrY3TzX`O-#O{N?_PXzkp?FT15xo@h4WTo4E`_*M@~vx2QKr z1+o(=b6f`!o>#22?2|vj2@!Ume1~|#(;%38>&oKXMQn$~Kk43ZskegwaT`VP_>5~v}t!p|NUBdk== z=DWQlTrZQOJH78=GZ9j9R;sQ#mM1rqhUSfMg4@PLOZPzUuP6x>58nKJU(A6p#p%gz)PSRpfft@2rU9ddqpn< z9}5;stPT=Hv{m6E^AqvFr!lZMEv*hz?{y0inI-XjvTT9DpP+ zWpr3RVo)VW1)UfI14no11PLMavw+hK!6hDgWoyX>_ETHx=R4yEnJ1S zLBSVXu|RO?YKh={uGw?s4)b5Vn6+sK$e_0LMh?NPWR}hdWz-&^oU`ugwFbvIq=zqL z2fint?*t|tl&z(!?@WF-au_M138p$tW?b2# z5M2;Q=o-i8I$wz&HlhlTNG-~cPT1i0c<8-1V=3ell9%^2Xj;UxB=(4Qj9Fhe;~hFK!&;rA=4;3LB6p z_D!dL0G=1I3S~%lDh@YmCqF?gQ{0faFCX12Ojf=jWBdU7-AF3VD6B%pIML*r>OVx;X8Knz{TXbIFKl4gn+@|O zC{Y%JIMydDVDCRGyC`XirAhz`eb+$j%!zc9e}_IFel$G`7mWHxd_XbgK|DPEK6;tK zZQnJ{t&8gYH}V;bvgJp%h@%7-KB1i+@Khjf5UgaVhME^nHfaHpc3~wf;aMabX}%XmMHC5k?G~d0i@iV? zUCKilRm7*;AUH0JU)%HV@&q<)hf!xOA!kPj4n7!h{*AT&H zUKh)tGxDAv8v z_Ne70Pk18{R>_9`RV*!$!FU`MCz`ldYak_=A%uWLNkaqu!9gDl$G~Vby1+?rjqxys zq9OcGdN5b|pxCSYRMtGo(M{u_O-_6j3|cpX(z!;V{g{38hiZ*fu2dCp=4rm6rbnFwO~cc-l$y`2K$x5PV7h zGN2dZ{aBX@Um+95oBT>Q2fqCq^->ZsLq?aAVI5(F&T}OCbMykEqbvi*U6%p|5bRRD zJ`5EGXWa|tN~1;i;QNLOJmM_$hL7sn*p7@<90dMiqZiDxZ0trabitX`P>EE+$+Gbm zdI3=f`t~6IYu#Jug$}HYv2DyS_N(8ME4-4HXsUE72$h-O5=Ii)RL~3s$yZf&ZKdJQ ztT2*xM$!_(?x_%H7hHM+O78t1VSI{Yx~~I~fu$ImAx@ZkwyFUt(+nQJ%-CmmKhBZ= z-cOdEN9y%PK!WTMS`(VS53`$<>WhrdB*4(e=w52!2E51EZqPz!`8F(|W3LoLAHi7W zFWl@bJa>T5_|5ZW!kzwT(TzY$@P+ZmSFu;Dh+K@*1<1$Cy?1U<;;1W>4gm~r8g{y& z1>RSCQ?G`g_LBs?EH?Gw^)quRPs-1Mp0?8_bdD#GI6?;)dkQ%KiDKCCe^qhF^`W?Z zj^_vq=0KScenT6KXBUIRp_zoBR3kTtS^|T=c?d(CEhQTmP(ikkWwaqUea97SS;k0^ z1$3`O()uSz} zdV;ifrQq>h{D&#u0i*<2?f0n;me9C00&SF@i|Lu7 z=zo9p$-7N_UMB8A9-xYOp~E}0m&YFx#sxq`hCsuqTEC)%L%0V^wR;Ksw3T(xXy^BO zvL0c2MHPzDwStE^htYd44Xg;hMB)zKo7eJY^+VaMhkqdu_tp}IjND}CPf=7fgPCoN z*6N{IyWMXpxkuD=62D$Eti}|2;arX)6 z+nI2gZO$|e9v;hQl&Ybrs%36YT<6nvRaLeN9BL-*Jt|O~eb|Cy3@iGBHOMk|lwQsr#MJZlsTEGdQtcEUu zQY8hhY^)VBjxFr3D;5;snK?;79KbHw0ZXGV5>^=n<~QkLt?HQ-?;Xf&g-fMu4z)rd zJt@aXjN;eUD?*rv4*NHq$#!jf>oVtAW$(=7cYrQS5yjGC^e%AJ)LRv)&^YwKOlTbW zLX9oJKLs279foekewF9pgF!tj?8iYi}O{61($eb+?tjbUD+a8V*-N{&_ZI=;UDQVS?voQ1Dq1eC2|6n?R zb{aSSTGJyzwn<&8SpzrooupMKPUw#V+Krh(r5#>;@9_<$7 z)&MP1m5v`llV*GBF-*yc}1dG=ogVqG+M28-e}`v_IADjdOGnf%Q8ggc@y7ND^p=M-(Thq|F>4^02x_Ky( zz183PXV^}WUSVRS!)g-nzF%aQkyYdX)ZMG_e-r$#f}XpiG2J<6WFD>>tJ8{~JB+Nb z^leZX>=)5xWE;sSV7=zhF%8{#ph_S3x903QHtprqjRoMotvQpk(|?4icDIdH$M!p} zsAqC8NLJ)Y=J{mBKc&PPj&%z?&OVM<$R6M?e4VlHtx4%ft2nZ{ni-+_IwI{)32g2M ziPIMpCf$(ONo3)}>3PHGauZPA1bf(8S>5mR|CO|V=)4~2sqqzVmQWum&%8=h#AF;H zk=Y1KC2UEK=kyCw{iscNI5$Nwdq!~i`g~1~2~-)-u9fad7Ir`K1=lIon2mFpNXJhb z{3ad)pjFt=)65SO3K=jWEB`RH8?$0AzZ4hk!4B<#nNHs=ay<$H_#fMBu}`@Vzth1| z*$z}2H?AKkKT)D*B{Q`LzgTt|%WA4kE3c&CfGxsy%w-v)sNT=08Zc8sr5H>+1tkdk zdKkvWE=m z-4E0!P$&eu*EFJ{YX^Sg3PX@U=qn9UMy|?&Y61ZXu|!OU3I9L%1t?+d>{3sCK{^X8 zIcy&xFz;j2(Sf_PlLf#@+1i|b9OwT9OX<8KjEPSxI7r%DaWGQpnuHK55`QC{T*7Y{ zGF${d|IBoRo;HsDA5b7m^A#aAf5F5ijEQsA7IvF}p8Xev;nZBUG*bTyRhJCvio5@E zYul{eBx+@nu@`AtvTuN`0R92EN@ysbx;a)kKgbK(6KEL2=VW-Pug*i{cnq|`Edv9Aq$$iwb=k={|7mx#lBx+ zT5ksf3I+5G^GGJI#l{ge@kQS*(9Z(0U%NqS1sR|tz~oj%+7}TJ-EDY}O>K9i#zO`H zq?fCoHkpytFFPIP_1VM{*)j)+cw_V(YnyC4==C@WLw($iX*~u?G{JsZn2s3#KIpdC zXKl*D4v+Rt2FG$)9)Hkl1^6nA6`V!Vy9cQ2V90EOu{=f6e!QHX{uk#ZJZAW`e{o}0 zdX4e66lAfW02%>9Cp%y!cpHjD$snzTkEv%m1y5F=pZtT{Q_WD~OZHfPIIymZ&)de{@`@R#7DrQ0CyaI{ zW;hUd?JVW zZE#olgV3Qg3v-A}LYI`WF9iWGSIR97FbBd1>PI?$*Yx%%JGE6CSMM zmj3{nobzL+_k&byqUGEszR7EL7#%<*F_4vXzdNYV4H-*k7&`f1ySwoDm3W;F*npEL zcFX6XdzPiWN zhlwLICh1{18E!@wp<`sFpl&$fjub!Pn>2@Hj}?x*4YyRmmf>c>bw2$*{V{_v%iPeH zBDw=unzDGn8d1Q^qpx9Rb*4}+%OfH8Vw(;3fd;dDFV^3PN;Nm#j)}&1$Ci@x!0c%7 zbcBe^dt2vYhb)4z1>*1grCZfZgzwl&5Yc&&#cx;`BxDf-5(25?eF!l1xgm~r2 ziTt3_doBx!WW{h%6@I&Ri=HhKeDNTGzzvDyAYb2Hc z1Wh5!gz6?ph)?EojeX>Fp%GM|i2DJhV2Q_U`U?xy$H1!X@|&rSy|=&U(@{{mPMb92 zb37&1pkH{cTpFEes-`V5C0|}Yru_41^;N=#)p$wq_lDx9#`F_db(z$*nPcf~GyAg( znS4-PbK}uJ*=9YXj;KV`Tob~~XY~lRwJ)BLQ&D^ORg7y3BN!5@SH8b>(dgvDzVuK! z@-fTZs!4~B&zM`~;_$1QFbBUAJH$tpxahd(7M_~~9Q|gt(z7kqQtiq|(Vv@=rBQ>H zJby_(hbmTuv5;Kx(P+7BNTjNWPwv{#~9TFN`$?Ua!d4Uwv|l*7KBeazaeSC4_*}`IT@ov)d zATaaM;ihLVj0?wlrbjmC+#g&cvCK6()wRM^C-}R7!sOK4`RaZP@r(z>&JyFrmw9(l z9IzCK#C@!I;bfUA7B<4diNtqsLh<7C$;FEIU&_%t4_=F&xf>zf;DJeYzM-X<+M(>C zXs#OWvcIr!0jh8tov%}DAFF%yz7^hE24$l(dj5wy9kSES8BK=4-0wAp?qu@7Vpf_%`>*6ZccNa|yK$lU zr+qO_%_+sY?aL|r8Ugcdi)8wB{4?!hYP9mWP2Fy8WjU*ZZ4)>_%k)WC`EnE|4a?)S;xa2Bfra9Sr>hP-V zv&5dheNzUHk4Ic}`pNyAFtytGHj*Zh!H2`EYLBU6DAV$j-SL?il+Y|4AzlrOe<8g` z@j+$4%6Kt<-E8wPUZ7m^u(sc3kdB`JVCnVq&eLJ{s@+C#nU2aU*;P{gJ(2eXf{6%a zDTCjz*I6R1pQ!A+xJ7vj15RO$ikD2Z*5lUH>gbEQ;?IgJFTZUrB!g&QrT%56=h z%I!?r^<%fJndX~HXBkW59oGUA$H~tzRwUb5nF!@srJDI?i6|15g6YKR^@V26)CC1x za?4EQ{bk3&_uzp6pM*G3d>Y!f7X)B#y(qQWc%*hi%w~3K%HTkGmh*QhBiyL63j4H9 zcip$GZ-0{5N2YXnqsdMhp$39$tXj1sa&$z-cdLdM0s`|`yd7n_CyV^8m0Y8DcqqzO za?asi(~j7svjC_)_PAT<`xUK=Z^kd;IGm&={O=Dw*Aq!-?r5MUL$2^NkNjoT2@Jx?-(Q<=3uwG@eQ%DMo*zIMP2HbKwczaH4xQr}2vDoX1Yc za}`{)mt3S-nQ6T4EZ^93Z(6y=2f@_HMb4oa*WZu17zXl*n2}vn`A0cF-0u|751sx z{U0Xr4FR|I4xSV?@6iDHk>k(1U6z2HMgZYG8ZE7$u5>Bk+K)kp=z-|YcE->9`M2NV zi{X-2!o%AURMaS9ck*Q=={OzW~vzfIB#V|!iLaRrGBdh9IdM5F@tVlyd z@>yRM&Uu4;tfE!f^h4XVdD}dA{4LA(jXO3558!ZP(TCKG-X$K2AfP9!Tv)Os zGWX|sJMTZjhou*GaaXjDF78mMU!&Dq?q!h%BU9uB4xd2ek0v*N3etGuA&4k6sVW&2 zhkb}HnY_b!_zFd5;fGB^%o|0U9i1{8zf1>c!?_L%LSg7q$I*jkC6s&ZFCjZa*G2D` zOV`%>kGarLzHUh?i8ru9^A$_=v5kntTJoiaJ>*MOwhsBh{S!mds|?YSv}{)BFQwno zQx=ZOftpjLC?Ko#4sm-{T1*7%Ossa?#i9 zNQrt>WeGWRf1kXLVANK}Y2z-5%u~A(b=pc6M7G8}3#Pk`7fU?qYvNYcYCG}v>?7wI z$OJ1YwENt;r*}>u=fSA+6x}WJP)3FghmOwLVU0cSnX&p{q+5%XHdm|kyBfZHp$upA zdZ$`M%7KWCcYh^u$5miSB1bRF| zVc~_B;Ag!?k=uj02Cr~8ywK#ubg59*-N(o0RNDP#k}veBD7=WT&kPuRAG=aRHV|vA zu@F}1+bS`w^jG%fhZ#xn8&?VSwBZkGmJ>I}co$C?2RxBPS>??ZJGgc%G3_$tZ0^yX z5N$1AJiR06p6B96$BKr=y7fz9r;0e1K_*E4ACn6C&z`57#kjrJFD%rpOZv4al&;G6 zFw%vqh#iht^y`rP#&!@ zW9IEx0mw&Yy>&susZAQ)BrtwR-2-*>Lrj~`h~{(i7_DPkpALQjs!2aA_#9E?u$L0r zMq|joZayg|=jV_1F)h8oux)oN2)g#J;WgWT;#WCBD({7``o!mV>_~D||M;PR8hFo* zN?2R$Q~nxm;0#&v@|@Q%$$3O6)jRTuo#zm*Zi5paX3X_WDVi9ydp_qa(?8&GlaeF`-D&)s{0qh^o?h=HGbv zgI;V{`&!LrlQguw@BT;65HoR|u&KBg(k^}OBGHGXd%ccKD#doBM zVp4UwSdMFDyEgY+s(8_&Fal;^?9gEgwOF0g!;P^^sX2-!=fYgN3(`vErG@C;>4*F1 z7E*Rmdd2MeoRlCmZc1Z7Ik~Vci;(If%FHgoO(2yUpYkN9Hi~$X&6T^+cbw6rd5|J4 ztBLOhdjlL*#uQW(y@z932izU>nIsS16YryPHi_9e`{t!TC)&cea52Crzi=@KSgMwFmX7M2H8iPd|BrrJ=X-nI57?bAuKK8c*UT!|?Nv5U50mG~e_ z<5773NbBx^;D8Yhz+p1%xRh#h;Z9ob%^6F%BTNjYk6OyoQPFZxPRWcs@Yij9PdYc2 z)c+}5(Hh~2*0jl_RUlmxhU>>QM;&N^PV3g?O-3086LrGZgIKzfoz+vF(&F?cC3krZ zegao{5&VRuX%@WFwAQ<+xBsJfwKwAiK%!*mV-uRjdnyJlRX%Nw)l#a6j*_p44oyGl zJQ|>7BR`w{MlE9fl4eQo445Ws{~uXr0#{SlhW$O9y^ndGA~H{zdx%mQqY#qNWEL`& zAu?p1$0$>SkR&pOQ05Q{QAnmDNv6sWdA|QX@9X`3-|u_Yv##s9@4eQ2t-a6QyK{Ca zCkyk2PHjfGM&yMhpP1#5)_zu#*wt^s<~HlhFLL2+=KEIz0|U#r#ay}M)BR>+lLCH) z&(In{@2Wd*aP8^t`Lo-N`u;YFXG5%}KgbDb>2l`&i4HgPp+%ES_dXcb+jG0H{%fDe zoD$Q%SBk%xZ?Jq)*#BFQ~gJF=r`NAYWkV~g*sxLWsOf)foi+q-N!4ENu$+wQUd`g(_2_hB{!b$x z`wm=6#_4XOKFqmN;r76wYQ@7^#3fw$kM2%FV+zg|`P3A9J)%ED~&}*L- zt2UMMxHZ;Z{XX+gL37~C%q=&5UT+hAveXNsTeb8yk!fpeOC<03!|N*F3jX$u`@rFd zvi>{QznWgqw1W^oV{(_-kMDMWF}lXcZ)bDE-p#-FD!W41_MKIe#mgn--6rMEnpAs0 z^wFD9|0E65r+?<1@s~e-X@$9`lGi%z58?ZOeDl%1VK+PL5YzDMM<2eQ;gu8T*P^)X z^dWg`b3&|Mc-&}h@0t+5ZrqpPasI`5y4Ytq{aoEf^{<<`Y4p&$5o>)OyjcBOuwMM& z{KR2XeUH6VXDCgdv_9{VeXzsARcHKpTK_Y5aI^7mdxdP@8D4GP4P))k4OYL~Wq4MU zK%uKNx* zA35CaE=?`U8<6z!jkmlkv|=@%4L7Ft%?=q7**SWHdBazBw-=Txn46I@I`8+zmbp&V zH(p=4spb1yd*hs&`1tszycv>?Dsi{+Uw>#Qq zPSlW$i@6>fY7d*V@6pwJ7q+@PIKI#Rm@<(2iv73d51g%vs|{U0f8EM1m$M>&q|dgn z8(ui^{@T+kyPl}GC)7V=&K1)`j|(SVp6y!c)0lZS8zvmsy?j{@5L! z+VVB1r_V3twD>u<5rRjy{S29e@%gk|Un^#!bcyk56Apyfm_jcc#J>YDXb>Q+x zK{vW)C7o`QCGe>!G_)vXp@Zvt`{e2dk8b=ZnJ^`BHuS{~ERKk-l%yX_8kRyX&#?=LqiFRb9_&|8^q zaY^sLzZf%OP&?~Po&w$N-}ru|t&h2b=NS5V&7WF zS7a~yvoJT#d~fT!w|gZ$IHqqDp6}Y-JfY<7p54y#WA?jV(s#`%IP~UW>UQ^k%yM>5 zbMpT5^xUK?#V2C|t*3e<*qYfN=$~_uy|UTh+q`4d2kUFEy6OIYVB^7_kKK-*Y~5(; z4gZ3|!{cH`H-B++{${5vo`2eD2(^iokPA?SAC^I-~d5PU(A&bb4;K@wcPXrz1-o6Hdp8=f`d?eItJ2 z!H5Yw=pMSt{_c?lOQwCf+-z&!^$MGcMg`R?{Hnt-c8)s^Ryr zy-BaF_g)_g@T>W%_sjq@-W~a+cg;@Abg&Qb&Nz6YN5ZPmu$t1@jDjxX9)?_OpA^3FV_4Rw zJiGG~n?4)5X7KR&5A7neJzF%(9y$E+0q>vuUc~IJUB>^jf9TeY6@OlzD$kufzU%IO zmGk~|d{Qg3ZO?P<&h@*w&%0gO%f+0&7ylf37g>I`MeY#ahj->B&$UYQPbr8wn3_6r zOGa&%$?>HhIC>|RKDe#M0iOebzZzcYdu@sKX3sy_v_cYS@fezEW2E^QZ9 z@b{dbxk!2JdZ$aXjnDa<{rR_7nRVOy`2|0!*>sK9!~1=|EVbD6X4}zyo!?l#yEW9r z%0Hr~_wn7^rZ^nD6fjWcmNt1+lZc?hNscZfCf~Vzt7f@AZo`I_Iv@Sra>i%hVNY{R z7PfhrnNpbV@w{G*iN#%8TXuZ>CdbDvnP*5IfqALUv76>>bBw)s)Xbvi=6NL+#>1S3 zZoFyQF+8ZmE5@?!{l`<=2Q{oUIz4a1-FJ5mSss{mpoeR-uSZP-n~c3S$i7qSUe`BP zv`IR?>-dVk`(q~dINNAT%H+4Z?+4FrvhVlZ;fVu1+PnG8={zC--tkIC&3vr`gP#W- zU;jMl^m513rTHoMA49uO+&L?4%{GVEeLT$a+{@gmYk$jX-DX?YuRoZMZv>|PAKl;b!xbN2J=Q`c=>R$}VmId+lf`0%P5_AJZ&{r>gGNj2x2 zS@bYlpB4Pef78#xm>u6O>z{j?J+|@Iq4(ljZJBITu}q%@^Z(4=_WDd8tG=yW%|4Lq4=2ywv zA*Wx?O*C`g;%xc)$d5|%mgz!E{k~W-JF?AzXS-q!SY_{*EVf=Mx>OkRv{Ik&RZFMN z^D1cX(xXm7#h<_P;(HG-d|0*T@;%4$GIDoqFK^Ul_sO<58Z-CW%LEa~t)pvws!; z#F7s>e-@pJ9MIY>%C3p;nBq@UIt^rg*EunsNvFDuPl{P%XUR7lBKi!mYMb3--TC_8 zy0FzbV9uHF!(pxCRg0Ge+zV3PIJ7-J*!S__LD@N*uKsksa5H1)r1ZD-^OpMY5v=n8 z-h0KzoLl>`TcVG}mlqGVjX64h_~5ni`O^oliMwc>c_?C>)8UIpZa1zbY`s@h^zCra z(e&`O3sQPt>@hLB_)qYc!OeFjo1~9*Fq(0pM2NAw@~P*_{cQ@{T%Xa$fuEEc?yzfq z@S_&Z_`S${WW1$)7^&hG%^SwRDHFTxk?+oQn)b^$a9oB<)f3s?>x&Mj{#w7!)K4&S zzqsn>-SSVK)j1hAxz3n{t76AG9`ZO)-L%QuyLIL-IF?*0#k+V|NBeV=;%+#f-k7m{ z|LTTWa^&Qk^&da^#@#MmVE=u7QJ3=<_L-0V1XhUY`!tm)8lUG#H5^iqjTz*7Iw+aT99S^C^t3W z_y@<}sXw;u?0jQEFn9g0rs4gfQjNS8?K1jmYjz_m-@WqI(~)jX^N-%XQ>E*&dvn5* zF1O&RM!A<*EIl54F1V;kdhy38n?)Osuq-#zvB|?G#tT1Z@+}3wO|HhV9;aJ}cQF~6 zbUf%zPEbm5T!fLO->x?S4`1&Z)^tP}o(1HkO>0qPHe=wy{P%Z!9p6kcEgN{f&7jAt zA_o=}Mc!?4cBb95k*C+0^f0?Sb7;t)f`Hh5#Rpnlwp|qL80kBGu;bK>he;E1tS<7! zeNK~zjfJO<>yj%DN#FILvVZuI&I!+Z8|uk%3t#=;4Pl_oRNFFKUuWGZfuuJh51E!u08ri-7g*O^9iC030+_9<4i-)gT>|c4V~sh~B;DZW-*+^x2eBd5;%$yxe%+OqbucN~PEbhL?WaTUh8H`Lmk2fA=%~ zJua*}TavYLpY|2rFRe{xY!?zs>UFN>VxcEEIQ>>z{oBm!^ZENZ=+Y+%T zkKcgFzZ`8+_pyWJ#fG1^m7DYZaF;q=LOR{9JfJ`hHEnU#cD?67+YQ6VyI(3!H-7oy z{$pp8-!M7dAe#e&wx^1^Gi9?Von=8qjfHr~EA4 zV(Zw;&dzaf(smE~wP8t_50~Cs&3k*+?M27pdNZTicomMT7;9VVUFYvMD<;)B6L}}i zd|GaCaka)%wC~HD8*_Me_u(rNZQBPwI%2Ww`jh8xtsdIjB`rz+{cBOjOxx-G%9THr%&CMrZx1i+BDsJ*Sm;Lvj^{fxR2ZSgL4hP zTZFfMyn6rU=3DJwH4T_@V(gS9_k7=;aCH7S=D^|S*~fdwuKCUh`|F{DZ!d?4^qXgo zEPFW0xwZS0nRf0|ZUwo8idOz*?p}3R=}^PH(s#EFnTvC*AGIj_y=L9XGuacKwHJzV ztW0A9hFKom|MYA7@!O|$*GKsFsL3BNj=bwtE7iJIAaC1vTlzibU7vnt4d!T)8kFqCAV_+=-0lBJpQQnyVZS@zNAO;Sj+yw zw+UxXJ`5F?@z0q{Of5FP9qL|Ees%DuMKXWsyV~oIDHi+PpG@s=wcv1*aWj){&Urp# zlH2ZF@3#%k@R7dr{>X!Y1NXYea{x<155n5RZh~S@$U$$ zI&XjJ+^fmw3rk#*oHri$8ZbEB=d10^RO@&?Y4&}y?Uu)5WA8tP_X|!fkIZh^@#*`a zUJKeMS_htpo;5An-D^hsFR9_xT1;+Y<(pZfq5HMw#m+o&h3}KLHRx84 zzebn$Ans7d)(#d&?DK!G+rOfIPHD$J})0 ze9OBZ2kp-3l04s};FJ45C6B!3h0M}0aKMS1W<~EU(~_dsoyndSZC~NVmfrbNaFL$B zT7JRH-8JfwaqmaxHe1CE6pS||#%}OxbKv;V@sAeuGV!dO^XA6aoQO&JUC!?HDcl+cVIdy*RLqR7$^qShO%lGJ^9@h_jn%;0g#Ed-^3*Jv|6Y|9PR_5tRE-gPA zS-(h&^D>`Wp;gZX=W176k;}a_r7&h<=0_jfPd?4A1y|VfCv1h=^t#_BY`HLdzRjKW z-HaCTP9tPUl;^${k51m-QnEv^OYwg*G=JL2Gt)9=wfi(SZwX&7i{}>=9qqAv(~$C3 z7mrkM`BHXV<#d~p$wlw%+C-jT8Q^^K=?yb)qZj;JsG}~yft#kSPjCCX^3sM^Ijv%c zgq#a{?;2&%P496r!n5W2q@k`E)34n><2Gv4Sex4q;wGQ}-Z{^{I5V(E7T-?Z_2hh^ z`LyEw%@^($Z=Ck~_2A99nyv5eo8D=Ddh5Q%v!gP?BXtoQE84$_(gm$5KfHPLk-K`~ z=snNe>oaY?|E|zC(PRM^Zr^W%fVol-d$k4)Gaw{1vV)tiTcXLrrwO?+03>`ArEThFm|3s9d` zbo14IarErO@-8oyWR~jawMfx#KAykvMc}N&PDK`3y6vu;mUf$$o31xW>DaO1t!UN# z*>Y)ySJ{7l8DBUtps;!cyBpKfR_*E6ui}l)QH@Wn?v^s$FVS&e`pqjE1oh}tu9#o0 zz$4f{k17w`S-kVIwdecs0~@aY^2a+Yb?t}9ng=2mHn-~7u5D>6p5m8FkLWod#kJyr zKelzMp4UhEyL_^9$vGGh%b(hA)9n*q9rNx-SKnQ?+A81J7T1Rltsgf)n(3By{Fawd zK?5Tj?UQ5U53?Tx%;_nY6XxY+#1CC;t`TIdzCr(?oWn<_w=MLvx^P`r>WFxV#PuO*zpF6GdrhN*($6^@25_$Z5{vK3^>+#X!X5akJ532;) zCnZ+*ik|f_bM5_Y%R=M%v{i68bk+7Dl|t@Emz&$D{ugc@vp#UUNIia}Ha|naU#3Vm z4$aYJ9{stia?kUvbG4uIEx7BGJm+3kl;hKd*JhS8i7f2sl$mtk<7$^N)t050MDUyR zXL<4K1A3KhGdCs2rL(JR?WB;{;@5ub$432eir>4g+0*9dpRMdSu+_Bs z{LIj!#4~2c_qR9xnBL-S_TtVa$!9jEd-nI(KHc%us%aHX9;O}VPqLILuIg$Z_p*4= zyzeEGTVCFo&fE8x#Kh0WUY9pBasJ-enk&UrVw zg=@HR)W%iEvx*;ef8mpx^lQiV_Br)8UgYo26gxh>Q}`~$%WC6WeXJ>VEh)LWSo4+VixRSBz zrwNaieheAntPCCz^q{NHA+OR7zfOh@N%-*Z6G8h=6eK|wbb=zNf?g;klorYeWrcD= zd7*+(QK%$T7ODtU`L{ULg&IOlp_X7I)E4Rp#zI}8o?s%>7a9l+g+@YSp^4B`XeKll zS_mx#Q=yg6T4*D*71{~yg${z5@Q=_@=p>j6orNxfgRSU?S5W-bI53I5N0@m`I1Yx9i6nmvJVqQz-2=i2 z;UrZLfv3PI;zOut+Fn#NIu?w@;k0lDJS)V(=Y;d{1tDHY5H1Rr;LE}l_%LgU2CuT7 z!_2w{UNg)*&CD~xb+*Kz&Vh+U3BnDkBnUT!ThvH`r0a$7essX&hT zHbZzVWKk&_&J^Cjnbb~W{$nb>Ks^TEvSk~iUx5oa$6qlo3tT{)CFG#8gm*$NH8Svc zExaenrm9vk(=h)96&DD3T;mJ4*5`w-n3p4bAeY1JTv|TSJK-bzj*M0%oB8jBPvqVc zXA7T&FRbN@@Ri&bwrTo3JX{xh5V&@Ac|66N8bRnMXB2cd{u5u8u^CVU5T4NgCZ zKBC@J@e9>I2|tA&;CrGeLNRy9Dcl_=Q*SmE3xr?f3Q-@x-$W(CAO1z}H@>j_0rRQ# zli6RXA&P?dgZL9Qrct99oC;2%%5P>%;x9oKi>aX#6?6eP{>_G{r&1|V1xu(XQsXDp zON*tb_l>&Kxbu$zi)GNm}y;xqXKqY=@2^GtuN>Np-RS{L1 zdLr{Hi9@LlhPZ-QRjfv@K<)ClsbDE; zmlvy(tqxZdYtU;NxH?!GT}w0)Yt!n8#iJOTQq9v`XXhpLYZD`%Z?zA3aPq7!+TePM35&P2Z zM04q$sNKy_wHG)@9Bim< z3l0_?4Gw)lM{x)~PWbgh4Q0J%thfs+?@u#B^+yk&nd3PC@BXkk&JMT^fX%5r5LXAd z8)^`4JwS7O27`_U=iUa-KA<^1nx`FTj^j|#nP@0_7|mQ9PBRxrfX>7t&@P}Wu?yM_ zbSHL0dw?T}J{Mtj4f zX&$U{wCF?Z1COPRVy$DvnZz^U3AAync!D^Kcosa7HlB4)6lW7pVlU><%tc>tGVvU7 zF6>KY9yphH9@-C_Pwai#iigfqNV8N;0mJU;!1cqnN?gj z=3FnUxPn%K=ERd(%_LSc5j9s_jhai>v@f2k>1zx;7o3Ol8v0rT&jrztCL4r;4k z$$e%sxSXh^VOvYK)e^Ue0peELHZhPEByOke5O;$iU!7y}-LkBY~{&&_aYATVc*NJXW@jN<_=mvZazAWA(d()6T zCEgN~*q<2oD@nX9-VyJL$zlr83AWq@x@qzeAG!fEaW8zfmJ^&xEC6)e|d8r0`EItvRiW%gdis|ArID>o|v!B8lVkX-k z8!%IRj()++m*Ok7ykzuiIE$?rjDE@XY(_jM^9Ia>-->=K2<)5A5oQrPhxpKr9Z^K5_|a&EXQZ|O6+x2KEr<&%Ydc% zEMJ~{B|h7K5%r+TXZ$kc%k!CE=2O3(Oc|a62s{VSkdOFijwq; zTHg%nH%elQAj#5ilq~6_KUDlq{x@|>K$*-RQ70*qD(R(CQfaA-RF+b# z>q`yjTHHWtC^e!tHlUVmOw@$d6x9@N1~!*k(3_%LNG&B(L(~%03f&5BO>2W{1GlB= zQF^!(sIq_Ur1tD}2e2Jz2LA(g06R*ZBy*`VtVmths&L%8u-!uXS2P3LGtLq=le)rY z%;-e3BI<}X2d#5Za2vm?#8?xv_4W_(3ZHnWJlDUyp<$!E*J6Uzeu!4cj0-L$a$_4 z?4=^kB717~lI*Ez1NLS_Z zNOFXSNI9Y-+xn63%yH}w_hZ~Zj%Q~^4PcyurH2skGRVZXWed+30XHr4@YU+O!zus%vYW|Jnb}L zRzu-FUzJ8lqb2R@(`e})U!g`z_sNWsPKaZqv1}P7jgiKo#*i5gjwLfr8ZS+tk0TyW z-V>ZiW+LoKJ0VU2Clh-~Q>3ZVG-*0KL-Lk<=rg5Rqo`=jPDdp_s` z`=b_v^9;O1S_=C~OTZ=MC$auztlkqfSz0D7r=Jj4fRo8+(F$oLyn=Q@Tm`NsUJb9J zoeqF`}1eGBhO1IY*Dr0Lyk3zkBp zP$^8>g9?}SO8db5aD;RK6+zzzMoI^1QK*B`At{=67&pM7p#aI$5D>u`27)sv$0gR^`%i z8M!Q~462-5UalZllq<=V=@p49%T?s6bS&bOx6M8+lzT7}=C^w=tmYc{;;SjNsRI}# zHKQNo`qQ=_AZkjsnS5AkNss1=JZu;d%JmaWq-9&mp^_Qvs?E56>^vp zmU36vlGq9dYrL#cHlU3`w_tlWxx3th-c9Z)_mX>4qo-^O_mumP?PJLHmF;AEdS7bx zll!Ck!(HS7bj@La>;QJcsRb);3R>gWoNX<@rt&~kb9oSG$(CBYCWApoc?j%?8X`N% zLs3pBXVfs-aMUog6Ka?|LUxf|QLeBX=RrAM|MI8`hR9WRmp$Z>v{9&0@@RPsI7S{z zA19BePmn!9PxJ(NqC5$lL^M&J3{Qr=(Eq{3hb^NI} z51daOf0V|HsIWv{DX#*T!b_>N99%B1rmvCLQg@E9DKaR&TYu5xv?_Z>_vZ-b~GV%uS@$J!uObnbcW>+cK)GV%B;&0JTBh zirOG=gEvrVH8WQ;H;~L`IS92z-Y##EcgR<%b&fmr7DK(O(oV8LYz<)kR@yGqHhDK{ z8>=I?=b%15cYkFRHYs29%6eYAtr+e?iwFp79T>Hv61j;6{1 zW=6_~iH^W~z&%viD;)t3GCGR3myuCi(J|mr>P3^;4|XXoUhYT7KpQg07;%jIQagCRWXtv54W}p^k8&5V#U~0sb38f{ z_hNf*w!{$qBOeE246D<&osdt;r{q}qH0q3e78NI-L!Fl|pw7$jasvILe2IQpzCyn$ zU!z}_6XhH7P5G9bB;S_r(36Po$am#rx)vwPDe^tK7T=Ta%Ma*Ud|ysQr@{|uk5G@` zG+H_;O@0hNmY*2#Dg0Eyvxj-(YYjL4mB!8o8@i+Oq{DZE= zKjfcsFRR;NP?oR0;ft_AlyRm=BgZQTMORBM}`RlXWstzO2(J;Ac2bR&*+u z59hKvcJDDcu|P?5$iHE~Cq0Z?lQBCw;R1sC0>UwgOP?hm0O|A;6s;(4RT2~FOt}6rP$d%z5y0YLK)>4)g zlmTn%%F$l2igLPIy7E-5M7@eSBVBE<0$d5M4OTJKu13`=M0Kcbj7K%1x~O`1RwXtD zP4KL)tB+fCoU6iRP&IT7aI2|nh)+$NYf#ll*9fdbz1pb8sM-dsYp7aB*M!wS|p9$Cs&jvWv2V3LZn2L44M!Gg&8(mxC=G1FK z)E3o_>dlGTqnhhFfX&FX)0x3$x_|IABkBliaSL51oLlP5@ob5A3)lo@s_Tq%D_l*% zE;zTPViT~9&H}X1SrWH3prx)Wx`V;3J-P$cHHQv5E6^GjYn=_w)9p_HE z9yoWx^&hw=p5}OWf_vfF8EMGscc9X3bx)D2=SiH5sOB3Jth zRC(QC-8IAA=ZfJ@bVVMlbJSgu9d$!M?GBY7JL%4YLv%xRPPznH!=XB7aG34__p5ZGBa3TJ1ck??5UaL|c(xNeMY1b9In29MRbfah43 zi*B6G6+FwjYH?N71P60vX`X|@hPv^1jMq(|_5__LRVPwyBx(}q0Z)V{fs=6_#kPr{ z7tW(~Q}7&(|0sAWo@4MI4Ua&L)lI{>A$|=&H(bYa=1n)ax#2WjH^boRj>8O{HxAx9 zAJEgFXW}xG$OoK-^JLv@JSQ8nUb;Crd*M16_QiP$u3qq5Jg4G41*h@2w#K^^PF-~K zzzO7Lp!`5jB5%}u9Omm5fD3V2s9S{FLZSt*Kc2G;+1WVFB3g{|9Gqr@OK|qZX%4s) z=Po#P2B+gXkMnF9ID^O!pBdmX-Ey3k>sA;%y>VEfTM4ehZV4$8#~>{_qAom*Bk^r_P+&y>RP-habF*^L!&t8+Druo_;tjz;y-jW;|9A ztwe3XEdb{=sIBleJXf=I4IGH`T3lDd{-|}jApFzN7bV^#efI!(;NH^iHh)$s5 z@kt;$iMpt}gvVv@3ZAF&xCCCs^Q`U~K48?}t98PiIG5j=#W8igNqQT)f zn5es9a5w?p(A~u07ETvYNgT&8_HPj9+(7U)XW1amxL)ub&M)n}TL$0d{My7Bw;WF9 z{L;?56>th?ns(l;3zQaf4qkgCZz+=TTUzK5vSu52nG^AMyG?@;RM|iJQLW@ zTkt8=J>65B@8fz8%)t2puJ^%bIH%(G0L;YyA$3#0Wa8)OhhQ4~0(=gp!!N-X;A8j| z_!4{#-_m8_e2b%-4JV+U=-%M`6xS!+=EK>%mLI`S_-E-p4mUvbXC?=4t> z|2tfBz+4;)!FS+$xCkr+^Wbk_5%>ZA4t@iFz&|-ti@{%=YDHN#e(;Bru!YN4~Kp zD<63~{E7Wkl+R!`+0X3TCs0+su(xkeUvzrqEBjeWDFELR7qBPqz#QVzN)b_MrI5G` zy0lV8`NrOr1D(*dh>DSG2vnf&N!ljlHa{)G+MpP4=*cQj~4 zF;Z$PbrfU#>nN3ojNw{Db(P9s1){pJF;P9G3iwM`5mlLN6~#oU3jSujCU8BX5>{G` zs6JQ~u8wK|imawOx%zlZL^a4Z1gpa}IpPx7P-z6#FmPj36Q!xrOlhvPP+HQP6Sq`M zl~!~uZl$zV+R(MQjnYD?MNhyDL4FUa*F}6p`F2U@Ni`WJe)oZw?>K!=!(B9>;lX1AjOSU zxEZp8S<4_Ich=%=$T}(>ti_Ra4Mu6%A<9TrG=$YTqK1$isfdVp=+^^GEt`MiuWV2@(zSS_vPs!Y*W%5}7A1hb)qq-dE73Mu zASw_JQnu4~7&uVbsq9jA(|0Ptv=CGX914ahd*CqC9wl7aiwZ~WRrV?SQTtH)l?dek zDgt#tiBt}vB2f#KDCH1+A;;j560IDjYw=;_h!R8B;-ktj<+ySJJgS_8Pti`GPbsm) zvG8fy8Ppm0EG-Td2cM&zN1cZ+(Be@E%0*uJi^?VCvT{Yas$5g9D~ZYt@FwvsC5h;^ zatFSvB*Q7nJ=l};BLSQMUpCCY%$eh<+^5b1@G^W~NrfLOk5CWk52$#Rnm3g+_y&9( zOjjO*PlytUZ-GzAB`Fzj60zp}jOY$ZTR|pKGAf1R^_=7O9DYH2iFygYqP<4FhO=nd zsBHKR?JeppoI`tu%B8=fy+`HI-_t&z^64LFA5oUdC+=IHP#{Dln)b^f!7D?K|oR{X6X^s+j(h_6zk3{!J@EmB4>!|Dyhd`GFi&RR2{(SW=sE zcW%!8T2hsxeU|RAsO( zQ595GupW^SU+wDfb+5Ww8|SL5pqg4qsi#ilo;jQ|<}&9~Re+nRB@Yd)v~m_cc+qR8zy=*J6*gJ+A{-09&c8*~<#-ZEdv; zk+IqqHYV2gxgAkm6i1r9t-x3MYV3JEwOH4Vqfmu?9>M#Na_nI$dsd&lY5y1VMgmp-V9GGnlNz_^G1$QRaR?rmJE^2Rb7OE|5LEIdt_Bj0Do$Uu*SE^eR<@0{i8n-?~ zeTn<1b|@P>y3x#W>89Ef_fY$xdZ_)?0l1mt+Ff-Z>WS(M4kYS@>H-cT>W#7h2NUJv z))#!uJL9y2J;3Rc2T|1{I(Y-(~bqc)>XSEj@ji;*9IIrt)ez#Jm6SYxiz-@@NbKRKpyRGU? zu9)9fQ;B!d6_lTx-IsOVoc(n<%Po1;TYwWe3$#^Cq)k?R46B%onxf7$tYQjkmO9(u zKMUoB_bmD}+8osv=eh7yGTJ)k5lu&FtMMb6foh9uJJxZT_wbkSKcn+wWo=o9E$4wH z=)<{Si?a`HraB*-49~=M0XPMotu9pg+x9pwr1`4;;4D_KknT%ctS(^{OW`?Wv^6aw znv2rbG@W(KQ~&T#(e>O zCEZ_L1ulgBaa|4i!b{XO>RSBQ!Hdagt65L96s4_Z1JN?nJX~XWk`ayn8T{w5g5_$s zZUdf!@OHz`)8M}XwNl+^@L!2qrEW6#uR{6byNbSobp(21*Iq`H%6 zBv-~Ru7urcFgTp+V5}NKG?r^(3~e;gXs&@!aG2rR7_WvAI~%Tz3F;oMi4lft!&43C z%5dS@*r401F6G(S673n8x=-DU=XRYtek1YPf&WNwKU;#;2=xGNqww3UMiPaf#uz+9 z!BBFcxP^gX>OuM*H3}RL@4@d7H~|h<1LE!qkW5^0_X!QHIjAbuwe&QYjC>M3v!dtF* z(ePZJx%%=1^sG9Kb;PM>@n6b1j^eo==X2y@SkXS5&#M=3j)#x27Hu67xSqr#0gQrA zk~;{;su#gSa4b%jz{Btv^|E>eJPl9NT~){N#CI(IXVq)!Rh;Ltf^)bX#q$Upr(S2v z1vOE-8eUXy(J!eRs?MJWiLa zy7GkE1^=sRikgi7G}dt)&vSU*BX^Az#o>HkeSl{woXA?V6`aTOCOrYX#g<#RJ_K)) zNy6_DcnMB2tm!tcX+&4xyLhLA>FQ(rpQtBgSH8#K!fM8`j%4+z`ULN5tRsaLT>~@7 zJy4&infO14@3SIpH4lkWQ8!VK)EA((jz>7X1Rvs^hQ}-L5#DKdKBm1^v%qxNQ_be} z_vGw%16OdRZ{+&k1ioR*CiN}6iK~1wEr&?E*0<2!5oy=@R<823hO2#z;W}T(wcVSm z+LkB68@R%Qh&OP}_txd&^Pbl{8=s9}9?={11N??qbIK=ri_)Av66K&Yr!Ba=GdO*M z1JqCSZR%%O!)@G8zNoqCSMakz2jXXepXO`1D`iOc5zQgS&tl=koezNtWS`2>%KjTo$3VzXx(O=a9^|#svZ_U4r zu7vn2>$t4`;gv5`|Ah-#k+vE^|1bF7u#P-d@Qr^yDCocQqvRs^!LW{eykxzk{{jBQ zK}P+=O{bUjzle%))4Utuq`CdZuY^d^-%(Y4I&ONss{ez(=3Pp!$FtDjU0PoXw<3dU z8GUIyzp>X6&Obm|&o^lGWpFNw&u_IX(J!zZTwebhkMeB!ts3E^xf$sy=oPkLa#wwOWzPQLF@3-JaxK8WNWelS=U(K1eA15^^M`C zM9uWg=}m~6>s#ns(zUpy-c;X;)>_{N)f#1L*w$L#mP}hR?P%>$?cokIGn5(p53M7r zBixB*j`}P&Vilj|&iY3B&P1Px8?vTG`Yv!6L$)D%Qj^F6wlHKHu%9MGmawHETVLOm z<4~Wj9giv;gRX{cT{%+P(W*?YE;%cjG0K?ZS{by`Thr>G>TuL6f!2B(ni0x~*Q6q7 zqwhwmjWTD|-Ss`-?)skkUi#jkIdLzz2a&D554|^WAAMiF9bJp<^!ECGbS<{m_eb}K z2k0H>{GocdzkZN@u-=hANI!(;gmQw1>TmKhC`tTO%253+`c2u1b#&7^>xaS4`Yi5- zwZYoN!{K52SKK4BxOZl$!}TMGhU;H)2Ytnz^_4n8??N;}|APDPL+-ne$iASv=$~_M zP9^(7b=AAF-35F`{EYkeeb80!rq5K}^zH_J#+^Ndd%cJLDe5Wr{uIzdKa%zY^@Ohv z$>2!+DE&!(3gV9lfcULHBN5*ZPO|KL*`-UsG$Pwwpok3fy3|X@4(+c3OASD*pNqgMM=A zfz{tJ$&YKEe^X|lA^$L~l$G+s8e&g~wx`kx+nrE3CShB2BKbqxBybqrdo!4$3Z&} zpAX&CRXaZYk~05yY`xCpCrA$#8S+LZY5&s;XTSO17}LzV2@iXj7{=`Bd@q4I7yi~^ zu0d<#|7xuc;|+Oj{NK6XUGx5z*R=LpJBjJ>RvyQ!&-V!HYWm`2{3)+127RLH^Y~FW zj#_ivyBfW`5}$YQia~e0^(nrOLk#;;(aP2%E#9a2ib1oU1a<7;|3_;4?H*4C5s`cM3(@T&%0rf;2u7|;LY?VcWq zcN+2^uP4p+#GBQ4^#80u^YZC%JpP$|x?yg=)$`&@mfbVdZ#AY?yxHJq1|3|oB)(Vs z`-b&2tkgDMGJRptHgz|}FU@*jsQGDQ|M=gpUmNsaFRlLh@{{9BcDyyzIboL&FaCOL z@Zwm+?=;OY+J&l1 zUK{3ayfvolTkm&<_1rG%)OF#p|EwYI`fp2fv#*A{zTrB{+%w+||{w~OCb~y5!$ZTjO=93zVG{XEBp36XEYwK-oMZNc>Mmj zANP42bIqLdJjnCFemJ%*@c%NV`>hF8M9I+L7G)f95wI z(24YV@l4J$zIIR2i~faWJ@=yHI-AjpMn{+wmlHV%w zt4O?@ze4S-kpj5n(BNGqAaH#9XT(n?1hqvSzahr{17xR#P1X@wici_#Hk zr8|z%;}7|qj9a=8bvG&-p$rOJy=*u}XY0RXa8Bh9xR%b2M&(QRS>-_UC zALmp)jC1OI&!}PqKdXx)O~oDZb@BL@k8`S+#W{8HVpOq)pH;Dsa_VB%sLK_9`8cP_ zCpf1rKNwZsz2p_*F|>D&hxgCKd)*rTBwwR=^V$;=9lI8^gChX){lFVM!wSbLeydxg+s)u z+;p{WAu5bYo?KfiP2ra9(@9f!HuqnkDV#gJUa2YkCzi|9l#TqIxu$HC)+|?3c5MC8 zk}LZr4|}L7yE`UV;mRM@9sI2+KPmC3K3D$J;HVi_ewAb2oGTl3h%ChwKJQ(F4NCWb zw9IscbBnr5jSBw;P6ah(myx8YrtEd%z;I33vGK#%nzDO^Uf~-0HrhQq*O@E)SMFRZ z`RD_SUfXaSgSMEk0{-xe=}IHgI0oj?kj8mneo5o}Aiohmi}HgEl8-Wgz8dmTUyxJs zQBJ@|@(~}umzX%fGq%jNhAJXJ4vJM00%i9aR7WIjrf4w7bh0+UsUdfMft#rp&Q@CLaD%~;G6wVl@3OCFZ z$}Sko3TMnMN-vqC@-WA|r0k1%K-mlPoALq7A4x7ajo>l9Hnr;{Gjl` zoThNYyr=NQe5i27oT+Sqc~#j6bFZ=;=I5%T%nk9!TG5Gzix}c+v^Mk_>`tw1E~hu$ zA1e7LUbQyV*qkf*&Ls_o!zoFB#(!OI@SS2waJ)x_y#~Lo=Ow?)_bkJ*?`0()ZPcsP zP02@keCS-mt1m-obo=qfu()J7XQ7c}TrhTUo-|j_45V>PIjVetJ1!@=;znZxo&SQ zIp&V(Cc`S%5ptd;SAXS`4fVx&eqC}fA`Lm5q6{m;8p+Qht(Q&VY?oArDExyfI}>G> zw@ICevX^awCsB6X?=+k!%=fPhCCb+8Yb+tk2h4;0@eC|&;q+p;q|rBiewsv-EyBvV z5``huD1U7_U&P7rXs>necM^re=QBNt!sl*_MMT+XXX~|p?dZk!5ru7`Qn7L#v|WOE zDp44w?P#5EPKAHqP1=+Dy{B%3e3tei$gnR4iVae-BR~)8oofo74ju;)dg6cG~gas^28v!F9Cu z?zlC@F&Dxo7)@Q;OMalk1MT#~nPmM7dpdD!Px)CKb0+b<=CCBuaV=8=S&P; zI-HYqjm?3E_oY8bI(oz*gX!|CQZ`&`dGl#e|1ml+m9%G-g_@2 z3d09&cl^b6)IY_j(*5|Mbm=FEt#fb*s`R}P)QCWxEOkd66()n{c@Txwm#^cA!a45! zEIAM2+0ZoeZ`@(-MgLKlBaLy_^S~V!^;xu$ie=2nYJRkZiv5X@la&nrYZsL_FhA>M z*5_w626KyEM>RiUrsn@&9hGdDXOzsS@Bii&)DiFdm5!KOkXC#cZ$#ZO7r{J6#z9 zaF(A%oWT~7Mq4P^q>b|AN82gA(AIjrz{iZ}59niR9@GVVQbRuaBw#M*M_nL(B|p!H zC5=9;|(PImFLqi`%--fu5G{yzQj-)YmAf_aZF$J+KX`BaQO2Zt5F$M7` zX^cmRS&sa?n3a5tS;#q(uVlb6(67Px)i6(D{6g$Y8e<>w14n*devmZg2grMpR`cMP z;^jOs1|=qF7rh-7R%jRS1BnCXK!uykdpdh5oY8K|7BbiAY^SioT&=Le{H*ZAJgjiT zT&=LeJg>0AJpyu?#3yfGkoe%fpfJHbMPY(_kirD_9qc)v?zkVp{$<2HOYL83uY~n1 z!8!FgMB$0GpVATQOoe}5-6-Y6x>VUNug;WwtZ9|4v2Ij&V%@7S!P;0qzrqmfTZKbj zZ7lJ}+F0q1b-Tg`YkOrElt;govM<){3V%E!D9o{jSD0YVR9Io2)aOHmv)bMW*jl_mrlIQDrmr@9|y~RDhEHq?Jd`xKH zNBq@^IK$RQ2_(2xsvMJZCX6_mCiCpZn&Co?1w{L`U-CzPNF;U@4sw&xMM*2SEo5t) z#&O-q=V!?1VMgA+TRC#aVhRa;p2i!QlqK!G){#xyk4hPw_n#yU<{##1EozhRr}~k> zu7~72H5V)=(-N|H_Lrh$aHAvS+3eF&o?$N+kc5&K<+{)dBM!~8CA~YUC-JP4#L;iM z53f#kY(2=6Yqln5PJc37i8u1u%dQ&!;q6HqlYRO4IKJGKSi{4F!%|M$1uaQn(s8Nd zh>lf>^ZG0~zx6j;vU9~*NyA+p`Cd3N-&!vt{xw`K_S3NP?{-7!X32c{ zxc+2zp?5BiKc?mzujk|V((HIf@&TStHkA44q;>{R*AsHxAfuI`OSMyyM&I9QvLoMG z`gN~5n~+%^z zEb3T1ex9*u)gw}d_nqU7XP+IF_N-V&NK1UijPg^sAHMMO|$}gnMBgelq)Rt^qollp;V^$N}NlUez)z-`T@!lm& zB+BvU#vRu7#z)I}$n5XhtMPy2@n3pg8|biy@3*Z99N8xajptp60ih z?D*`VRSQ`tKO4t_j6JVK@IL8Lq|NWGn#0n?a?HNj_q1}+OL$Jvdc?Vn3D0V{OpgE1 z+LB+-UdFdIY(TJ&oV3VS@)x~KGm;b&=!1oDgBYe;B zzwaFMm!FeRlFo_x!Q%?~8QzDP)6imna*omqT-tskTU;YvfUne zS-uqs>vDokT6TJ*-yjhnQTt7xHkDi`*c&?o1ZM6>)6TLiW$M132)fHRGl&n&X;k|o$YWIU zz+P!odnN2gn%a**9{E|s{D0?B`T`De4B~+EsQnK1S)-B-_DZALD-|Y)C)nMn$61H1 zoD*%KWI#LOoNDjZV*++GDj(C22Y)aspVW`h>wAAltIa?*9Cmr zsA5pRF2tPz7Jg@ynp4U`PhP^{m`vT-}e4n6l zxTbPA{*)Hvrsm*ufhJPsr?SesJ#sNYTtyt zQq%2~n%XOI9$UZ~+U zU2SYswK3G~nyTCN^W(az4#&@``XA?1bvv9djH;f8bAhJL1#phgRQ->%I#a;8!>G<3 zm^0P62Io}g7o1a_S@gN?;n@mgT~QytdDcAKp9+v1PmXV9kVd|R$pTt<+G;tbqirbd zdZHr1F*$`7&Is!xr*Gd(7H98`}Rdu@6gR8JiHae5q74;_1U zdK^^G9s7Fv_Xc`Q)cEnK%QMuRjsK~pDGd3XjTuUYDW4+YJ?J0IO-k0%l+0t(vNdHR zxFgb(UL#3Su59{!z%@0-;tJ2ZaSgcgu?~r? zxWd223Br|6&e+hID|_9D>>&3t^poA2I!hY;&3{i^19g(Cest1AEhY9hEO(FI%sp@;&T#>vdEdR0$;XUZTx-mxa!r}yN!4f^wLb7Cc(ljz2^ zLv`i&;$dd|*V$K+U(mM|rxm(W9RI`arIy^ToTL{&uEP&(_LTH0&v-5V(F92!Z(z_8 zMg>Xw&Z-X?5s5P;tz-zF(VkZ~_2qpBHX=xOTs($%9J@=>VH1Y%LYJG!@!evqxz_lb zNQK!+HW`Q*U)*AE@|yx9B02k(rVrJ*P8Ib zUuW>}Py<1FNylkCm8D2JILwdF3au>1CkMCSqwg?D?~S+PzjBID9N(tjV1C?tjHJB= z72{u)hDbVm#xZUEu!WM|uzi%anJ<-ePC|F%qBYAUtz@7RD)XN0=JT=pIuNAayU*oz z5w+zQt0o=z@&=ibU$j>+zf;44;uwbpV|mguS2^bUUPrF|3Y7e&>q_yL=Ne1e^i)so zyAP5UjCXsOtqnf9T+;Yf?DW`3Ne}m%VyriGjii-4HkQTs{hTmhTQRG{9oy2Ya?IS-sIHL*oX*^T%Ee4e5naf*BdjHRX{PCeMN%tRjSDRZq zQqtbP=V-r*MM=8Qrp3mLlF^b@GT@uBMYWdk<)wQNq<2+V!u?xiN%}#}`P^-?4Mo1Q z%QW7iE|GLj#8BS1$WS>?>^TGXcsxt;=X|Qbm(=u>^!0xkpPIT<(oI4iY8h?TNZRDe zd~HF~Xh}~E3O9~uyHV08kBXhZ4y%ZYsWm(A5fy8mx2&nkjU?NZs@RM@;6zpI1bpgF zRh)+X<3&|0cR4tnsu=g%I+v>04{Eqb?r|8WWe+c=Ds~(StR*U@Qr+mu-;w(^ zQ56fDj>Z!eBf)12Q58E8gX&WiUol1cP!)Hh?EI*THRttVRK;e8vumh|+2;2)Q5DzQ z=Kp!`jqzwQeLGeDe|hFkqT<4StO-@|QYN-BRWUW`*dVH6?L>`fRK=HHlW?kh-XwY! zRk6u$ZJ;Vs}9)^pk^x*EfVnI?B$L@9nij(!HbZX%mk{O4>Plu9mwaO46GUnJr3u8yLt(KnS6xcn>cOREPm{F35s-UqaPn!yP2fHzC7o6e@W97&ACU* zsgh2}wc+2VE|heYRoApNJ61@#z>1j~8L>vvb^o1Z^l|Gf=T~=1ivX*^ZJp;JWQoLwS7v0u=cq z*n@}ds3z%O)hO?IrJbasH#+eB1BOZZYCs|WVc%p)Kj~=H(&Fbxy50AF+RH)fr0%$G z#^r^QpE$OOk^kFNuA3P!UapI4Sr!f8RZO>$S?!WZ8Q)&~!<2WDwtUl;o36E`$hR)t zfOn5>F6nh%W%%*VJtV#5=v(cm!)Qq_ve>C*ZJs1)JV#c}j*vK@46{0gNPd@~!bar} z#^*bU@)P(vC{_Mb+PMi;epPhQV5jXgew1E zb$At3J{kFLos|%H12?-^usLc!O~aJ4^6y=$@2@|S>gEw&p1fq83)fqNUJju z(s(Aqa}&~dZo;z_(s;JQ^B2;1{=zdF(s)M0vn|r7yW->dSB=LrvYH3a(Q1A?Yh%5E zpT&AZ#m*Oui!dX7%duXEwztj(HnVp5MAtRnj%K7v!-gTS|Jg@vO!@yGi=rjw`gJrUNA% zonfafzcxbBw!S_Yb>gf^A1fRB#_lmigqbU%sN`=N`?`{!5n!ZyL!lS=ym|dhOWKR`TIqDW8r5&$~-c?Yy}tVIm8Czx~Ho5eMa~aNkOl56AAm zMwD-RT9%;7=c7BsS1Wr!8tm8rae_i1<^f_%Jl!#fb9@m>zG#hlZ^JA&$M zq5Lz1FD1%vE1F~z<Pw;v%j@U#eoZ->*Sb#g0iSZ>r)t zaP4@i;%n!G$yDWm(PM+Dioq==bEKT;50^vdN*d+IyGIoZeb3FL3R}|^ONd^6J+{g& z=E)cG>80#=>6a!^Id?R2$#`YNA!+>PebUHMpKRgZi)D4!gBV^lsI^tvm5hFXQH zJYY(K^67~7!klAvb=F@@wpr)bUHKb+$6v3n@=yH!zFuGD&-i_Ry}l|I@VoqaeO2t> z_xJVssu;oF1W<8@-~HF?uHqEG*RR)C#Wns8fL?dh7j2EdS%EbA0O|{4G^7z9{ci}s zoRW_i!dm#fFp6t|43dxd>wlL(PlGNT=S17-$Ai8c=Rth|2RR1quKx`Lz)FrmtN=qf z27N~TZUbTqm`gtT7}!FNM_Yi6Bp-cJ|N9K!&ytV+47oy%$NT{PEctmk^Dhn%3mWNPIAd=;ep}Bl(zr^!n=cf*dPx z&dafq#vBVdP12at^!h@6mVC_5dVL{>OFrgsy}pp=B_H#=USFsOBp-Ezd?@9_e5jWb za=7$u%;9=nAkRxa=6T5flE(ZG^_%pcy!uVjSieC%DQVm)ev7|7qU?zKzVdVY?Ga^ntP@mR;2x^{1nUYFN4WngzrvbC#Tx!b zii$`4T@>ZFSkI_f#@|{|ev9>w$^-aYD=IFqUQ&4jf4@cL6Rf-R@uk;M*$8Vky^hMJ zSl8)wR6c;UpI%4hGgu$$byU8GHKg)YtS$9ADj&f5Q?H})d8|?OI;yz9T34^5UKhRm z$|tc-*2kJ&7v;}bSL=0A{*Se{UKbTdSf8ud$*bX|pJNTL*H`&7*8F;XRV?5cL9efh zajez#`YON0^N#XoJO?R1$Mcbji@bi5^zFQ}m89`(rQ!(BUn;)vT&7|W&o62W#u}XI zG_0xcyaVSTN#i*P&PS5Q^AVhzIF7+{6Pzn0op-L3G@dKr>?vtHd%~Gi(s(9?dj?74 zSryK(lE!#ce7t{9E&oG@ke2PC(LmcLI_|z2N*V zd-`~O*RKUe=;T#`l^;NC{Q_rQA_{aSFhBl&o@19v_g?^y882kw_7 zop-+^X}n*8J0eNr9TD6|NgD5?;GRm-cuxiQSCYp2E4bg2G|B*Xsv6#-;+?8~Ex31; ze7tvs`&f=+@IDsqZzYZQw{T}GX}q(AyIe`*T`t`BN*eEb;T~Ahcn=Ks!;;4PVd#lS z8f8#^f_Hr?M(|!v`4Zj@s+hvNJLPY9f2jO3@4iv`7~VH3zrs67<=c2~sr(=B5|wY@ zou~2{ybD!+j(3&HukgN9`C;Dus`MqiUsb+}cd*Kb@orZ6Io_QrAHaKEy=1o|nG#(oO)StN~p7U;!j*nh!Z4D@IujXfIZ-Eib%?*@80lFsYt z{N+RcMbg-Rfqsyru^$9|B1vPP2>M5o#{LoXH2QN&|i~$ z?5{x&PQ$(%_TZp5Cu!`>LC;Ro*t3IP9>+0xy}ZAC=(|Zi_T8ZOCu!{cL4Q!v*dK(x zp`@{I2>oukF3JGCMajqBBJ>|M>^Wlp5&Dvn#=a!4Q3mKKOFs6Lv4&A^ zw6L~8TAdw`#(De& z`vDd2_+~)GJH9bcxdPuFsF=mK5Gt1Oy@c{@d|#pbAKzW5xWM-qDqirNhKeJ6JE7to z-%F@GfbT0*JmMP<6{q+nM8z+@6;b|-Z%dTVNK}mD8xIw0 z_|8PdCcc4DzKU;Vlt1HJ8s+Es#zy%+zQa**k@rqU#w@;*QE`Otb5y+JyBZaP_~u9X zB)$<+ev5C1lt1H}BIW1!?nwE6-n$?foA@qB#S6YiQgMy%h*W&xTP78E_{K^3VO~!} z`Xu@%o)^$R)p-GFbzVRk&kM@`@rNhm-4H&!)lYD&trhaDw-;BXqGLCcNdpY%6 z9C`1}Bp=`1!J9Nm+u+Tck5~SH@97kt_%2uZ624Q_W3Ja%ucKZsy)Fv#|CL`agPzvQsh0=u=%B+Of4A~* z7w3b^3r}YUst=NPxr(nJ)8fVg;#_Pxdswo^e~xKZwICg3F`bdQjs9~?a9AUnV?Lc( z)hzg*Vei6mjYQ) z=GRyM+g|5ER+RaE<^Q%j%8D}2Tk_xj;|a2&%pg0}%b=%En?|L#{4tZAsBti#|I}Wa z#rGJz8CiTcA7B4jJ-r3qASEA|!FHco`JdwhE6(MCFa6n+J40!5@tJhlmI!jC6`fbTFw)PU~9;azSPT zI)d4cOKusoeJ;;!J%y3P*DdGN8AtCFpC%?;IY-C7ov$5^@D|;Qy0c>k%4q|hmljuG z&f4!wW{mz?rRBHZq#bv9IFT|>Lm#P7k( zdG8alHhv^=UYJZ*H}_;svSMi3(c{#-Obcee%!aiZy~HJRxj*x@-9v{|OLAFuqaEA3 zy(-JRv&`k_m5X%iY;SgR>mHY39#h4|w5hz~^({28@&wVi@I`HY0Abmdb;RzW8?>A? z-mLk*=XoRFE}GSTUl!$>POry2C95Y>=G(`Seeua8*KOjdSBLSe&I~L1vQ2H5J#S{P z(8~67p0T~l{#i4{3HWWi&1^H>d~~9)39Y0>+;U;7L_LwY=3k@F+A)l7yTZE}qm45j zd9(4Z=jfR#Lx_151B)6`k99gyngkb*rCxy(*_UPmNvke%TOJ7yVGZZ_k$1+&EkjR+ zh(5z=X>Sg1qJ_-@#L#86j7{gcu;jM&g?s-3#wnx5u$ie>dG_(R44N>84R*aktBgxD zR1bGyfz9f(@zw1Ni%)N&u|)$|WWXrHnJz}>DPKa^C9kQ5!6oXptn?#9%y`zwxbXJg z)U&@s#P96N8TV2)(QcLjqSE#98EY50ursaei(Kti`l7L8m`&_ezGL%}^i8ntn}b)W z_CCcW*?SE8vg0asZ5!J%Xs!!u*0DZI?NGucX6Gi_q*MTVFrmH6j{}={uw?*?$!YKM zsqQ9DD+RD~HGB;nX1j>6$LDY<3ET4Tg& zagE-5bi(DlkBfNVSzq*c@h*L?t&2!ISYJ?Y3!{_67;)vsH6HAhmJtxQiPyId5J$r* zWSHLB$on=35XIXx&8MSY_nCYnzi@6MdzR)&911LV-U)Hou8O-$+2<`qVqAUpqiQ9R zlj9})dt9ehVchVs#~88G>KcC&9-H1jw51s4*g*8LFwq)a_7YbgU*~)5_8Q+0jNxCJ z28c%Sbu_&lk2Hzp@lVIIpI^(+?Un{%msW=j*m{B3&K)CCKW5YFj#J6Mds~Vv$Lfhq zW=Wcf?HF;|`YQjfd19EVbH{e_yYZf^?~$#v=ekzHq;w@#;MY*< zc+E##gk1X6tq?t$M8t8^>SDzDR@|zjj~H%oobMX`NwZrN%P&mu5mq09xISKr*=Rh@ zt~smlpd5QMrIV;I?F(JvaDraX^b^q{g3cU0j2^1pUR)_$OiWMQ&w~s33A-xm`9!Dw zJk)$I&sxw`++^%x>QnriZ6=+#z7IS0D@5Gyb2uZS#Hp5des>cOEN0R2*NZc& z?_I^$)~k7?eMLn^wPXB3-CTa5eV2Ust(x&P7t4c7;RZdj4IK_ip1NpOIBiNYZ-Nc?^cJMuE8bp%!093Vn`kf9y2xd(BrXwBASP^LdPSCciiL84thK zoh7a9BHj*K!$*EA#%{d~7HzcE+JofFq}#{N!pR|wrrMSe7lFTgNEkWcaa(gW7yQk# zQ}k7-zCyq6yf2;1SLWJ_!K)jy$sO8>m;=}NZ<8-{{cm4UcfoW%XVpr&qNu-E+pH?x z#$x!6dTqtG2PdeZVi94H;w!cd44_dx*YfO+d$`pCbJpxlTcO`)m)iS_WlbHqL#Yk4 z+NiC(Eb0KhGy`sKBH*4A}vKEFDtsVI6xOJis1vt^$_6> zUub;G79t{~G&|sVgf~ncEl%2J(BcVx{JZHoKKMvyR+bkRm(ydocSJw2)b1|zY0y%f zEm=`y1#YJQdU}cFc89rJQCB+SKnvl#$>j>x1FS<(VSvd>Xl1B%W+2Fh#_lhx+42BeL|$Oi|}- zBB^*GmlQOeA~w5>ryXKOkwRBziXy4eWT=%rJ#RKeoGaO%-g~u(*aF|`^&%2;na~XL zDPl`Dp&zaLQy&%BYVO`dI`up=_(eSucvqsY<8L9(+OuI~S*1wA3)!h)W%=fcl z;i)w#W?v?YjxaWG@rb5JvS*5C=Z}ztH@=1+Fy^V>GegxUYYk@iLWEtBONOlI6hkSX zPi#yvOe}QCU=DPx$7>Cz$38Rsg7Lkd`Wl8CL+ICnQ$*o!afF;nBllt5mD@fTF2KAv z|AcTulgCK~$Q2mhw*MBFy*;!+n|jSY#gmei@m(K`v0xjt(d{Df zT5qro+Nl1GMjF}%ZDfBTS1SRwK^wJ>8Ks>C+n|jGS=saVc{Zx^dXcsjY=bt6zD)RH zu#Gp2`EK2xR|MOjjr>KlRvm1EHd@(aJRb?RK^uXsG{gci8DR|JD*y|`gq}&$c7n~& zc3?w38*GNQ`_v&*Lo5)Jvpu(Dpq<{)pyPO*P%yQd^XPV@J=ZJc8|=O&z->rXp1LF1+=GS zwn!fUTWLF8&ox7w0dFmH!j=q_XHQ}QZN#c7#+N`l`g}GHz3OZH3G{%#XU5NKCK=Hd zyW3`Jq4(DsQHGKxmyFJFAB@?+KY1Zd3j+C2&Qb7xPq0Ba;M3$xqV}W6B{}}fy|u<^ zY0=tq;D0_iN(%(s%b{K1|9#FTYKwv2^>!mIXTmeNuE_Q^Zua|ZM7`Rtu40Too2K1? zwU%%CU|hMofQB+3nzSWjbNfuK67Wl{pJWUhT1Z15bGc^T1>;X&>+b?S-8TtX%i21Oqz6Qh>aR$5%h%e&o68FK- zI1lGU@C(EjaUKo%=|13#;|2H*>VUc&*gc9o1gsJB(P`17Z64+mAuqiHd~vP06P_8G z0PbO^``JW-SR>|J{5~5HYs5V6Y#J#G_#)1LH^~CrQ5UcSxeu5kwi`_x31W)aX1|Ri zh$&(ldpei&1{}`nRX(sXe)8o^(*b+VJW(7sw2MIRb^Jk?8LE;uX)#) zI&4i}OL3|5SKgpVE4FEtop755XMw_9*z6LPqVuZRd~=~L%+ShC*mZy2uf zBj$oEt0$(;KiNFH)&<`3k+&#Zim_Yt8z6;96*NTC}A*yPH@-jGx?{ew*gc&YLXbkI(I+zm$nBmT<9o)@3#+P7Gt=!qJfzA0zk9g|j>(5rKy{-+*yiVHq__Otc z;`xpzJJPt7J6l)1j41e~L0ZFs{!AE>_|D1|8p!*)MqUjcwoamKfIr*wI5}mPV;PoR z!kt;A*GtW^?82hJUfaNK@kLuPv{yZ_o9m`J4DEFj?AG1BDq9KIIs(RnJA9>RucaI7 zFq7QZ)Eex#4*vb_w5fCe*lsY`@aL-8^t-vGU`4vHpNaQV=YZ{ez=m-t71J*rEGecg z@L*swhPJx}HUxYb;*5CzaGFa?%r+N3V5@oo1DqE@@#O%v0^6|7U?a2@tw7i%uo2p7 zLg612@kcvMf3=)G2mH|vuMEXmB-p4B*ebHq^X3d}fi{U66i*Si!GIswgP~onfPF5Q zER%Ne2m9O)eJ}0u1ndJgpiy9prC<}V4P65^8UnW3KCn4OyP$oRti4Vefn834eZH40 zmgWIC`vKmrfwQRJ5-&DkO%neWkwl}Hda-*GX7Q7s&r>$ti(Rc|%74`|r4^@nu{uA_ zb5{8tafk?F2Z!47aj%{=D?i$cohfjOFBob|s{`Mv@;z#i%mF1s*Re#?#?jdXWN%-x^YnuTQrFB>od)$1@KD-oYJ1utxCg(&tT0gJhX)c zZqZsW|J*yTn=~!%LDm32q;6GyXm>R_f=*@|13dZ3^<$bl51GMY@7Lky13jrL@O$p5 z#@7s@6zBKo5Z-i+*F0+5bTZrLl&C$v{+O)T?8iR$O5!j2#--ZSo6It%E#XctN2L8) z;m7tRrSa$W5=kzM-#&aE-+QP(eZAX{S?-VIUV9_y%sqbWtJa@i9F|0@Z1iI-?mX5O z->XC0gACKy%%(9jme7Q{lUer(rw`WsabDt9(9x6vz7profcM=AvuF(9{2B1xoZ5sU zK34&!6u=O%MU1WCKg4q(@UB!drLDjgC%`74KSdl`03P>dm_f}wgCVYl8$JXvN9+Md zf_UBlTtNqly1W3L056GKCg2AcNvzHRW=$H0Vaz9oA(Kk z^rFuedh*0*5!8H;^Mkru=%%=d`RIIO)|O;FBDYXW)=mWJ=p*ghv5MYX=goEhztx9zaZNoPa5a*ThIMgGJ-xEw6U||hAB*-#g4~>_Ed?KQ0pE-~*q=9s znEG}gl14z>4u<$00)83;@fHkxrvv?Ivyt<7B^XZzBoY?r$-Basf=ShAy@5&mQH&qE z=JbTbLkyRNSZ@xhrIm-chzK&HGav_*06KKq zDUwvDDvyRS3FaPT3*-^ZCy_l@?>~LbN6UnmdIvE&!Tz3B1LDzSm@TzSX~M4oKlQ2) zu^nd1F-{lQ-y>m=%P{AxHH|!QXZ@W6F-Sum+6g(-5%Om|p)zeu53z;E0g#p$O+tk7Ci>}v;yS4`A!?0w(PyptPap2kPA0>Byq$r60l5$JoOv$ z)tU8`nge#+39woXSPq4ph#0N}EL%eULY&tD-hiXT6LAIXB!-Bk%YZ};v26+%XFEO7 z5YM`RE8wCbK8O?G#Syn~z;B1ShlW@oW`HS2Z0!K!Xzj_ zOmL;BHmu+Fk1}hv8|uYjF#l=Cx%61fRK7acPHZa- zb&IZ6`ThAd9||?kRj5@zc@!7nRWI_LB?!A#v8phEn&{`+z<80 z@M~)m&ZmK0c7uJg9N{+w0DrW@)~Kl*aYOtHz-NjAwuo_DkuKs+Zb`B3^K5=Us*Whr z%TnAP@Rb8zJQ{Gb2mBn~&*q3*Pr#2KEt{SWSX}|k<|n;$kJY6;|iJD#N$LbvmHM$=-LmzGMVTC4nu(d6A(^i8X(sw7{Qw#Th z>4k!fIgIbY*6mK9&ad9l$5BCS%!1m~seP=rXKr7XRWzN}?0JTokC?_5xKsLbU}2t< z){C9`dQ%JTP(qZM8O$Q#d%U0KIcPmR?$IZM_wxNw9^zN$K%@1XhkU`(QDRtA3u6V( zBzm%kKRdn8jqTa7mj*q2Ps?nZ%0l;zqqB1QXt__0(4#l^)7DD|u#M%Wu$BYb(ekC5 z@#uceY(txdS_RrrxL%ReY$Pq4cku?{eSPv zSm|1Zq@IZO^TSsC1P`k;Zm{X^W>|9f3e9@16Xkx?Om|voenl@!qPZ?Olho|W8 zVHWJl-edI3wW93c(l#tJY6^4d;ZJ95J+A5H8M$er0)=mfvMgib zFS;-5YSHa_S zr{6^O<5>*tov?#k>o$d%E*nWd3@gezl<&p9H-W#)+F(63sXUdn?f95HOCH91eRg5X z0Eq>~s)#v-chHHRas2pwPeC>eVC9<#qebbWqU^1hjL~I|@X$TJqFIgyV_OTeJ$HN4 z-W^7^{JyadyR+Dw1(O>zXha9L^zu7;zkd)r8Mc62D%p(hy|$l*AAZA^zi<$RpF(2xY1fQ82Ta77r2b<5jXo@Dk||5CUVx@=9>&IXdO$6L+fsw|O!lkH8$;vl z9BqB=Bd{w{w-0fayiv@N1i)Kqq#q?)q({G({5^q~J7ZZ$`L%9Z&kRgrz3T?d@dprAJ+t;Stb}EU||USQ^5zzdUjI zcap!BQmZdp)xDs&`lu7%+~zSoP_duzAGwylBGxV)=S>h5#17uD*Bjcan z6zQ`1^bD4>qzVmOf50WHV+dlS9RzFI}V&w5C&flBC)>vNvUSxq)V9)RwI*X zdf7Zaou$1V^CA#B%F|)6i1w$elZZ z%&~1Gjq6p_IMZ_mb9y&Zi)dVlpM*NJQDPmsn?A`X^mzu`acC^rEK2c08=5hbS~kM9 z<5_+v^cf8>v=uMTzviTJE)}`0MBuV#+}dDgtmHOKL?(aYkM5frgLZg|wz+S(*@!3L zTZH8{D8Rx4`m^#*S+r-_eN>Ozug=8yIKBr9xo6E9HVt8eqhg46g~7((!$Vk=%8Y#V z>Z$$e>dC_Er||lv*YiOQyR*0wUwE;ygS%p}}=63U8krO8HoObctZGMOtl%a;MU**)a1r^v1OTV))uj zTKM$=dOo3u=o3OHvfhd5@r?cOgZmC?BMv^fo)6pM-E(+Ft*r=t zd6(}D?kUDp`@{?WjN-4gZ#=7PLs6t=aiPa##lDu}#GcY3pl%vJ(=u3yy9>0*1x&ba zt4SjHOavWRFgAVf(_m42RWst+;iKjpF-iQJw2Z=^t0IoU22m=o8Z$Tcr?p>Q8Y3@RE@vcixRxz~>jZW%H%k2(ibMFnJzYF%^#?U}!EY_Dgh)Tu+MM9XV`#$Y_ z!hJ0W-buI>ovKx{U1RjB6T++}Y$9`>7UmXrgIQrevs69Z*+@~G>iK=edY9y9A#7vPErZ`?_)d3h5c|-se!h6u$I*UY z6FO=_5bG3KJl|WX2?6PJ*NdU7!?`UqnYCmazt&{u8+W7c8g8Nmt50N&XC{$YlS%9= zSw+X*Dr(e^X^=dTJ+>&pZ(NGt`Y~y4_RKxDu;^X2ywH!)^RqARpsp9I2;Q-=(9`-H zTRP%CCqezhJ}oL=o@Wmp@tiF~MCPIa{CbT(qRfawqWeww&cTZiv8m=%mjK_ZMsvTu z;&A~Jas5a!KK(#n(bB#+8?;$v`WQe)o*?R@9cyu`K2;@gTk`S!#w0bNA3UPfMS(l=h* ze})K}y^3saV9N&|y~?XRY0u_t&!Hwwdx@Z0McAi)W2t_RzSy*l2s}22Q)gQ-ZjX_V zv;CJ}ZP-nCmYy!m&b=TdsyOrQ8RvPo2DRAwoepfZ)9vB64WBBiM^&H|ttqc@ z<`nPq)|5>v-iqn#rP3o(c(Ke`JhA?0v8EptX^H!^3#pFcMu9-_F0c^YJ#z{FFxFkP zdU%V@FL#nwe?i5KlP~F!fX_6ckh^H~_$VFR`96Ko_7ora^fujn*Ny4x!+qtC^SzzD zc{m>_OjmReQ;zv*r5{xmgXc^Ysb8I_|H4}Q?y;#Nqu6j->(U-=|H^5?ak2}&w5uTh zV0w|Cb3058i#?dW?p?UAr^vX!Ov~eLj;_2@OL#X` z95(T${@y(`qk9igzvV%?EcqF=@8lus{N775OWmjXx_xK&FWfdYoqrE<6}<<|5R2zl zr@yYbXq7t*5w|AiXbm=e;)m|`73a4er2FolrTZ4$=VM=GQf-Sno4Bs9@Sav!*xYX* z^yil;@j2Yv>IOa2u00E=KT0&RO5s1NE#x(a+R$B-vbbI0F>Dsu-y-EuE-!j(7>gfp zvc;&8S={QK537~3g04@<;i?1$UgFWq3gt@tWZ^95|Gj^~>TO znJcJ6T5s0uX)b>r97aEZ4#WMkcwsO2`@m*H*r!_{XW0_;*;^mxFe;1N?;Vix?&dI7 zJTsRs=rtro|7PGt(7BYt(|rZ2c$DgU?oW$MCdFp?inJA(RR5OX-Nz5)+!9|=s(d=t zza|7KFYw+H(723tVS zx6^!uQ=PHR$^mYtzy~T0wUIVn1-7o2vVy+_8;=EBzp*aC_uBPfKFhQCx9?Z@HL!8- zG9P*H#67Ta9k8`u=}rP|-y3`Yd_ka%n}V&u=AtLq z9(@3OL3{)oe*{~D&4m@%9(~|r;W5Ix!ipBAVD~p~eZ;G)Q(9~V-!{87Oui9O?-0_# zu4vzfMJ8+dcL)|>*YjZCmmfdmdxwB_Mf-xCv5)-s9YP}5ZaUbm?9WkL{|>-(OxKJO@6G$Fz@Y8>tP&QZK8+)OO$yPNJPRa-># zt}RB!RA8~yYm0l0A8>OD=PbM0;_8+PqS&C?Y;N(|qSTPxyut6LEIQXwyj?qvyEzfI z;i99k==NSaw3)F@u$Jem*n{1+wrW1evaN8=sxB5iK2OXl!h5AXRYkz8Zq%ZATk*)> zPK%H5G{pqW@ub&;O>)ck1p4p9uBvxe??0~*^UaOH+o%zDLV{s;L_|Ra6g${><{Ep9U^gm8#ol|b z*s=G58Z~O{qKS>D>_(#zQL#nr3U*_|-s5}D@O}6_zVGM#!_V0}J9FpGopWaQ*;$u` z0aA62#k@MBmGLldh$IcQm^qy;CnZ)bE6dPV+Aq(-=DSbW-=|Bk+2y5}4R&Q(&J7MW zznf|?bLH!=JeLHU52C`&ik(u_*n<|c=VK@HL#|gU_n#JXQm$9V#*GQ;?}T9U#`+NR zhkt!!*ZyGhX+nk(ye&lL{~ByQ+>u}mZx${$76hAvUHcmsCR)TC9&83~&rBNgQlu&R zZ5Hht{vo1E)s^EM%%0BCW=4m+YWr*lb9ZDL^Ik%Rip90G_ah(k&AsXB=4J`HC3*u>mYAM-eDVs10#P6c^(-obRcW@nDRY9~?uIGE+{R4}_=tu3yH z9n80bjvMO(nu^0Fls}kmghjQH^jQvO*A97&ADyFRA7a=t@Ah8j3X`j@`+Knw_Ijup zve{dGy}sDE^>C2sonyJWn_~&I($maS^p?s|afva-zMXmfkdKtU;$ZGMzSv%ww2YEB}UUCw~XEAd&>E|ON>JH%Z*8o2Fd!%i;a9+ zyp1Zahssv;`{m!RRfahv@0mU&U($yw6U;{A{Z-?Y`I2IHjx__1u2xI$WILF?0zX%2wzx4!XpesMp3Hu|{58?<38jM|@REK{HxA)X=rc z8EQQ=+XdR){ZoQ+bP6%oMu$l4<^5E#H^Ju7|H8yOGSl)ibQ%S{PPl)%>MxjI6MCJp zGeGh{n^U0CdjpF~K4^0=GzuLG^*9TlbJQIDX+Smo3!e1L$(_ zl)v`JLy!BQ%UVU`uY%|);2?P(1TDH)W?+n>G3^qE^KPB zKeYIGM}nFM4TeCA?cDmSd(dDsv{-q2riB`$79U^Ow7)SlI00JxEwYX5gzla}e_Km5 zmFv*jYiO?OmD=J9t(Ai2LZPpw(9{@c3wqPKqyB1Kvy*Yqo&DVkGI{WEMXl9==IkC! zSN);29?)Dn_`L(IRe|RISTd*TerS!FgRX@7stlb$SMm`0qRyt;w-f3s2XyxFX+6ma z9rb{oWCjv|aQ+u?ehaW(ky~mLw3Z6ZRj^;Kj66$>YtUTp zt=?+krNzc-XwJFWgsLl{wQy(-x{^H5S8eDFx{_4ri#mg@BnJ8_4V{HSN7UDE(AgjO zH*B(VQe%|;4ox+JrhWyE^?0OyTj!iK2JN6FHLrnlk}v#~n&7X3x93ahkA5WPK-iwC z`I4xuVV_p1#NEEiD|Vo1Ot`P^r2DF_m1E5PuL_CjQdD`2Y;0Q6E6D}FqN;RyB{OA2 zV=3rSRIPti$V{#jBeP!mD!&Q$jfSxUC2FUy>hWon(d5P`c`(jbZQtl;6yNBlM$Gk9 z3D-xNp`*|5-#x@vE&Ok+S;9A7`Rt2R>C<|fSC6Hu@9xB@70aT{ap7*#+8*Ek?%Ke- z+NYeve2i18`;;?3b!#C1J&RLb)!fXFOQYrWgE%$dSh{g*YHvB76sP(Yi8nTHA0h+s zO}>`Le2k=HJ}P)xoZ7r&h*{`Xc(s2A#i{?2hMNZ~Em4i_cBzVSUCnsMYiesK-W_@0 z%G?v1Un(}*r7qX6ZT5N*EXUjIQuAH}n-%NVmRwDCAwT)exc9BZv)nGV*zub2d3sk_ zV82UEsI#~8ZYR{i1v=cG;Y)ewy0H+!sC{f3rGGHF??I^i0Bg_Zev_&*dny z$eBEn{v}NfJ5kdt*Dz2<=DMVcHVia9Q))`mhctELOdhl8l_+_BHBEIfE*MK+w3pXg z(^TK^`9_~11La4I%W+Jhz5ADSlRg8|lwr6TJFkzD-rzt9aKRHi*$2Lj0Pnyvc>um8 zfp>*QHkPB{+aKUvAoz9(d=uc79Ydrf=J9XL=dEeI#TT3j1b4s{sRPbj0e8N3X&`OE z8FJ@maHbdIP~r`2c=?22Y0|rYGPhdD^o`ygCAY zrh})AFopr(CwY3f`kDP}z>`JbOa5g&r6K0%2IgwO)IQ>ZIlASNytmhtj?w^}Nd|Wg zENCVt!4vYO@^?!908h4oFW-YFPr;L7Kp(`E16(C%mm*d-aCHV^AB{2023P+BXTecL zu9CAZZlTpGfithcoktU}?tPzzzwsCQ+uZnW644_~&HU4i{E!pi3Hg%ua+HuK9^ec3 zAsOHa`Qi(ni~>){mtL!!Bp0}956*r+H%(mvSMPzd8D0xj2)KFxoSnGXU3r6_Ie&@t@GxOba+4}_XJe<(eT)bhu;Wt^oEqKNL4_ecvasfP7W`AOB=d zEwfVPDJ9Z(si#?ONU~~NUF7ckyk?E{nW}$Xk@o8{jhI<^<$w}d-7nebw!l-SmJ#s_ zTxnE$UtDUsinNJqVf2p)l40+aR6l(&$3h;(=#M?oSUfKNODM zpL``oniP0p>^ObV;`v!g|j7JP=(BpmEj{0L-OsE93jriu+wod%eUPh5! zp|bpVC9ys3R$-gra6VK%HY+W*$FW0h7`qOI%J*+P#rAmRYX{SHf2frG;2^fgrR}`T zW4l9T^5o3cGFkX*^^gLo?R>7{IsL#|dg!{>#{Ucuiov^nnA zCc=#D94h5=c1&zlw1{CiOg5VL87g&)9jsR3!8c9bvA0 zG08~YnzYaM7@QMwZznid{6le>0bNvtKKd;66l!5QG;wHtUZEC#g(mu}%T#@!g-Xzb zIX#E0&1)wWupXp3rl^Kk2coeatlKd|^~X9;4C_H$*?g)RbeA9NLH|+J_CCUz!?kdF zffwoz@c;JRmisPdK2@Edk$ljK+o`+iA^3k7I#}kHruk1DtZsTl-30$5p@XBZx2RTm zJInreTh#u=b5v`T-@-Fcul~vEFK9Ce8f_I4t!_dKv!IFAfh$#g=yW6W3O%TF=z{u4 zj%%SlV7z0Y-8vZmU}$zAw7YY0#l)%5NO5Rob3T%Pgg!qvFsLG-Fab z+o2)bV_S}`z+SNz`1vz*V|)C$S!vTAdg%e(*d9YCCiOzC*dCYr!2fd-SfW0rzO>Od>D$Es#~a~d?#30ko|{`6l1b2K#Ku-(nHJ)W9b&TO=7 zvhf94IlbA<{A=!HqY|`Ydu&^$=g16W2{b}|*dFhQk2jt{Bh-iO@nVl6Mk+K?6k4%8 z9zOqkwK>qp7-+@z_+k&EID+v95;hRVzqlZ}^+ix{@YJ+TgQJzO#8&v4u0JT6ZxSHSr`;J)qg z_d|QBw4I@n0lwQFw^Z9yBzW!@Rob*Yt~=s}I)5-!9=!Jaru_e}PMOyZavc2M@!r9- zJzn$ieE-fQ=gi6cq+YH;|mdTZ*H2Cib9oQZ}zFJ*|f&cYfo+Q~G z2jW`DYhtaY?W!f^dA#p0tXDBuxBkn&Ea@k#S6{Gh1$HltZ#l(C<&?W>*UgJb*FWL9 zk2ST;{5eKpT$h((UHY@+O5;;Wk+;h{r9j1Kqb{!L0magk%lj=x7}l{OxSp4qlh;hf z+BLgpvZ}W})98yewiVXe9Q~7x$yj^GEzB$1qK+7wvDUS~n%8!br|FC}?Tp__^{GUf zu?cIPf7xht{C#oL0rw%xrnFGUuiiC^K97-A!wakMm>{z)*0*XmFIwh2duq609V?S( zndK(#MGj-FyH@;ec;U${jKx?Fd*eD_8|NqAd`4#buj)^%;kIMhzix)nc-dFwmEK$& zTvCjUxPKeaxt=7Jt!%c&bzw(b4%v|8Yc|0B+e_TPeK#|Q8G!q`h2<(s`CR{H9 z@~5a)*P5GCaJ_i4W`=Su8Ep#sTJMuj-;?p)Z0(cZ!mITfDh;5)Gti>#@z0g|$Yf}c z`m;SQP^-PPga!*ii?+wmn{dsc&TNk(ptY^IE^l~VPHc~z65OQfqRGauZySj1acH*; zwEYZYU?{XbJRWd)%t~Hbouz zK~J{F(2oj+j#@xZw#T&)_Xz0d5%gqxT;j!3qb2m>=&~$HrQ9_>K`+z|bYfC3o1vR% z+y@_nzK+$23WqkdM##aTxJO?KPR34ZVc6l`w-7XyI&Y4#Y?-Io8uuqdp{;|s4?YPU z{qS~+5wb9^nFhUV!Tovjp2@}$XsRx>)dlzN{h+CEXlvBMIYxE(=^S~)NcCH3Xe^t-(rx?x4RW^Hr|1F?{J8?P8Wc-GD3$2vIZ>l8xwz>_i zltjI?&_xI6~<;2jKc4! zNyjdzVt8gT9lxg{E6rC4%e$F>_D@qiwz~1Y&E)+Xe#2Jmw4$3?75(N%|LD)`jeeV> z|0n2+{^QV3N%(I7|Lg~T4fxZsXZd4g5y-3|y#+$M-Z-@f$h+es>j(=QX|YJF#j*BdpPR52FK~ zQPdgM@0-2?@Ej@v&nqJF+~SeLH6szvD~{v0f8Fu<%}RK#wYnjmV>PU8u8!KJ_KeFf z9r0|-tL-i|70)jA;`tY!Yh^fGQ-$$dEDp~KGAk}oWAWT70M80~p7&7Q@vLePey9KR zGH;lz|AC1<#t=N8DVZ=trWTIJ_fz83i|M^(=aF<{0G`iuULGwaEN*55p3ju)*gy)$ zG%y!Fk5fC9o7~59z0?nJDgn=Gj^Wv#`@=X@`$)R_f@gxUcxH03P`s*)=XXu<%p`ZB zkA8mlcu<_$R$|TG%-w#*4|t{&h-XW-eHHk!%DDNPFP?tge`7SB**3#7RolLnom_2n%*dDIS8a%F@_uAo z8|0jna-@qqIUQxjj&)9&vd%*WWB;S&Z0Dp5JhL6M&cpnDw{z0z(^0bbNEg!sdm@Xx zAE|p)hnU?OIVZ*9+b?ag?@}3iB7yjuoOo_)reaSdx^v&Kq$NGgPv9iE8JQMkPJpJS zLtFbVbu>4Dleq#G8uyOZGzUOm{lIS?pxa1t-Z(aMA1pPUZ&=o|0yi z1t-Z(ufT;yRdABrEV$p@I0;Uc05@xc8(qP}7T{xJaHb}>R~j6=U0<2a!1;~fKKN%I z0uS$lkGsd^H`juD{a*rH*hG*?F!98-Y1N@c%_r{^0QVB!Me&E<3 za1Got%Yb9#+RyM+9o()1j)Q0BFz{_FcvrS#1G5hJM&9jEZsua}%>%sK4!)fS-yQ<% zpq?xEM&4a06mN_J-^jaM=%X?CRt3DPgn5qu$A13Z&$u#Spt%UoEx&$VW#kQuF| zRpU|jjlaOFbnxdmc$9#DUBR(YCcE=^4tnm)0K7 z|FO4bE=Rq>;Ljek18U%-*Va6S zy^oS5ZYlfoJujdx_d~C}ZRW$i z&-ekyv4%D^?`?E2)9+4K)v$-U2>UGaDv#MyJF1QObe4nJy?tKgbUZWZ&|q+Iibej; z(cgHrIN03VBwQZFCm02G2AgRcL!`!z4C4^?xsGDL%eK54_Iit8PjKPH+%o51#Irxx zOxTfu{jU(SCHB1L|B|34H4n${%3yO;?*6KabF{f0`%UYA$PAN-*q6ip*Rms-mcp+t zCH2G}Uzgk=GI?Sv<1g&-O~+o})pe_kJlNy&#$I3EPANuN?CagdUY>1v2KK+bu@Bw} z`))a(IGGo*-}e!Ff2-WQ%~{y*8@6VZs<#OLX9WB26DGA%-LSvj3wv#MHV5sSggwvU z*!zq6bjecS{+T2n>}mGE-sYC6k;c35I_3iGZSFX+)aZ{rO|!YX#2z|ggkw*0>2Akw z%9r1JWL(AmWBTn!Dsi8q`Cq3x=B1-Y)W^o|X8G3ed1R@2->;}y1$&)CCr7Gfc(-6L z_8BjR+3oANBfz|eeNQ9(jO9|F%%rwwg3SY!Ei!0*KO^_^U~?Ascpo-TFiv1^cU|ic z@&7Kv=z{&+_3M1TDW6_5x49ngMU2HBukX)3=6USxo(<1X=i7&vAMp-G`L+qF#(!bv z7rcYfX>C7M6Yp3=V~=&_$Sq;ZD_YFA=YmcDm`uw+ysz`e_18uk-ho;dH_M2`J2TPy zTggK6l;Mu|YEtknRq5sq=A?>mjKdqlz9}D{;b%5%{l=(+{b$!-!c5<$Z;TT^I7n*Y zhGqob<63^?l)AFDmH9p1^~yPMmb!%ZOQwN8llQI<|C+ypc@ggmjdIDaoS~5-&}Lm| z^aZrzm~)9y2O2&3wXJ!o!V=>_z%8TOlX~Vu=y3&fIRhG;3Jp#GdT#JG=0RWk;o~6Q zT`-`pukG_1g#wzIXQ8j9ccvRh@V-J_=xYUZX5zgBzMrrMI@JfO3#=;JvwRSVjJmP~5u{ok2Mr<#PDFQKV} z_Wg~E8}Tj-G<6r+T8DQj_CQlRpe^V}>!>Oa8aB^C%hdF^0mqHJ(6S3OJ@=OcqXjfI z584`^yT3tAQCn+|WG3B*jui9+{g~8IF6b!^@2MPtjwV1)7YlitQP9zB=xH6^9T^NA z9q5>1bcS}kpq<-5=+>ZqsblEJppK}gHlHpf4TDA|Lo3jRSp*ufhgRm}U7YvO$VO=8 zP;+;4AT+WaT3NE&(X0xMOoUdT2dxY0WB8g?2KD$ebb0yc5rZ0`R;Em9Wi*F2>qDbQ z)6XQ`hZZ_O6Gml=*%DfyCYI$4H*-M?_waWl{C^BFi$Dv%v`8?V*ZY_|eM8KmwKI%y zcpqpT_&)g4fszTT)}%_+rj?< z&_PkW?-hghzB(@IP}O&TD|5qx*G9_pS;jHETXwd@8{<7Raerf&d8Pat;{Y^K7w@9g z1^*{N2Nl{T7$2a!3(#N64-Q%j)C4qO)PNSwKodD8&N3Q63s<3u(JuLoWbi+SO9#{T zTO}Ru3`=@7p|5#z;bFt}yDqlhFmXzIne-L!o9*>J@Xhy3y17*{KH+_{N_i8E);8ZW z`Rz+LV?N#`dwTolZ@z8P2k)7k!TV;b3ePmc?)+@DLY+f)-M{(f$vgW5<9EDoCV4A; z^Zk?Goemh4@xGbm@0Z_v3nggQVPgf}HyeC<*f-xr!Ml z(bHU?yuf(A<)l%%K}XZDOEc==9nmpGo0(%Goy>N4FSN-`i|L8?0xRPEz;#}w%*VGZ zW~qrMjU!E*%w+#&rtg@OMwOgt#@Zh{n$@FE8q3ZtFm~d7KL0@{jfcJ54cqUr*nYR< zEb{vjd5*d>?3-_x>_JYMTj#Ww-+a%6Ic08)yTPU{QMX7}RGSA4jvaN6Xy_8wVbv$xjZr0&% zzMbOqytg?K@8ve>|6|pQ$aO#D+^e&@Vy>Sd=g7Spi(J=6&XerYR8!=dIUgPAB)=fn z%()ld!|j1wmqgCXrCVeeavgzpEPEGk_RaCO^9zh0@s4GYHXY?L@*aTvC*Pk5$QMD_Y8Sn4&(U9k*0)U8P({ZL_$1p0Dm?{A`)MYKdBO++8)livK$w{>8Gn z-%8c<-#3=!*Vn2BEgS0cr}@jN--FjE;=_y$szZg5ihh2H{YkO@#!@kg^|znY`NJH%md3g&Oh62(rCBaGlF@eALfVknIG0?p4l(+ zN&n0z{c~OzC-cvEn19B@dE~e_UyPsg#rO*iFDmVqnyTe2e_7$5qK=-%JC~CWXq>s_ zs4n+)-mCuk$4|zt+@}_=4bb)PHVhD+C+hm&mC)x|uf~F8brd$yHRlbrs(C3%v%jpC z9rx4N@JK1CnSNdk99~T0_MAcT=a@69S4)45r{aUN@n@G)s(HEMLOdH%M&1p>J0e$$ zYb?~MtfbC8s$vV2(Ae*ISz&*tR{81n9V&Qb`(^u)OTF~@TYWus9OpN?YP9R;spAN| z?5Z*Ku%~YKuz*{(AGTjn%T4!t@OhS>cRRD%SKZ{K+r2&Ir0aM8kcHOvM7BRvET3-g z(j*HH4R_OV5Bf2m#">?^swb)5c*PCCA(tsJ%g&J!H9|82V*wZHy19JRlCZn<>( zo4&bpyTpZ#x?RvDJKe77-*&p)Tzh-nZhm=t-7cz|y>7RCu)S`#f1h1e`;qSz=j-N~ z4~p|N^wLMg`El6zNpTzlYkt<}Q|G_b=dYK0t7JS80Ztml93{Y+iI zQni0|{agi~==yPmpJlhBe{1_EN1kVw(~sA`ncCmYMeh{n+gH8NxGOo!-hL~qpLK5@ z>VCRUNZ0*zEq+`3nO*R1c7KdN56V&rSMhV{`0(lbbH@g$94PuJ&x;kYk$c?`eFOtmyhfADMgZX z`|BZDIyqDu?*M|o|L)wc{Wt{d*M6oH+^7A#-MQx*f3)fEN%P&>-|TL`tGzP~Rck;N zZdS=^;=%)})12KJqXh3?r0-K_9rtSNTsc`a*!H`cIeVYRsKBiAEI;SJLybSRU*n#t z$*O6;&FcJ|M2%-hC+mLf?qrSspC`X*|6TpAXus3!E@$^c|EsRxof7oRa{Arpf@>B0 zt;?OJ{T!b|abYRp|7&+mWS&bHaELQlM_j&^Y#8M@u#&zZVi!Ozciz4^_a z>2@vKKFPM(Zf?TAx?R`gN4njH4exZj_y4`s^_ri3quV_!|2o@dyJ@3e>UQP+&eZJ^ zkA2qXEA9NG+t=v$S-0!I@uMDB{kk7?{j=Y_)Af6Fu@{be&cGTxnTQ~~)ADY`yINrCxU$y`1c%DtWHpGt+m zcj$ldQKxL1ex}4b>2|xeI_Y-fhhd)-@hooUrt6(9o`u%-9iO^pm$Uugzg>0vKhm?x zS&#j%c~4?a$Bk)a~1?$SPmi#$VUZ5nNpR2|rm}w_81- zm~O}OY*!`CPoG~XWp#aDr!x9{#WBIUe&5H~t3iHgvwo)?rF1_#DraHJ20tl1^^x)l zSfS38zpcXC&Qi5Y-c*gcE>p{fTv0FgPFJprFQ^UwEmYr4IHz8oo1_-MJE1xhnxpIn zr>F``N2$Yu4y*8!Q`NyBToY%GR*rp+s$FCHs1|CEI@_#=a-43eKNm);Ti!d=+5t6{ z%j!RrL;b4iQR(e!WZMAcx#F>MS~ExaYeEP-O-t1N z|J-v{6{RZXfuaW)V@;a{$m8q#5s-M;M8DEut1$4YE>*Uk^8dm&Z zp?}xhk1QNdr&?(ij<4Yn!@}{p4%lbm_}esHZed>X)L3C*Ui=65wJ=|q!Idn`pTFNE z3-h@vEr*5qt>ycZh57bxWkxXn{yA$|I3NB!7ez2HvHyfx7=NIbr;fAQ^n7}}{>SX} z_+!65wJ;yme!XsCejc7XZDGEeo;qw{KI1MXTA0s2>raW``191;t?hwJN^A6L{hKBC zZ=ZB|!XZ0h{mT7v3foVZ_Eq;k>!zd7Z;O!*!uT%c%_Hn@Kw2JQ{7vuX6~>X+&Rv*? zAAWQdjz95KVPT$fbjv4<_xfaKVf^h@dkXXUI4r+#Ty+n73G;noNPgjb1eWyHxaqW= z*mYkNv0_{AF1tbMWeJ$Wc#@%;V0pl znmKpF|H@Odk>v#sqa9G!2Zp95T3XsaP~B#2(CC16S?5!=UG10o8r@f;f7Jiy;K;1{ z=#TA6%t^7>l{ltOr0ldDdU9OV4=^pWjTE)3)jCU#Mkm#aRXZ#t{Ld&eWSM38$8&07 zu?3c>v8UCiMTwRwYyMIJ8&WNCs|+=D_d$)vgGXm$g}SMVb{jirZf<}cU+KvKdOWoX zzK!5`W4^wLV7_JqZPa$Jnj5wKre}!8^EE>k-**|0wvwcp83r6G7ZF7xjSp zJn-%K06o6lnQtOE&WRTINBN;qA=>tAv{57L^L+0@&Goq4{;Q|QS$=bQJ^t<9-g^9w zK2IW;moG_$be_f!G$NR{_%bxUW~;8b+NrnSEmdmN za`n%$R_edZ$tq}8AC>$0O8vWS?}q_u-yajzzayHd-cx6&`G;ny_IV>!K+nEvZI>Ta z-sy97y=Uj5)#495)SGqn)v46M`uAq~{&?kW8KJsXsjVK>ZLaJp)m5*3#_0NyYa6Qe zX_30#-6pfu=#~+xkY7u+{X`wL{c!~qeY%~lH}+XwjT>gSQBUqwRi_u$QVqkas!JPc zs))b{Rij;)@{Jblr|b6N8eKcKRwD}M(Brz?Ez!bpmhv5K;kYx`JLz#Ws(abOaU~7e zY~grE|610<@!ua=SjWHhdpkXzq4j21INkw0Zdo|qPREPsIOmLU*YUqd%d5xr<CgX_IjLFopvjlY8n1H zrx3}fR@W1?ZPjh`k`3Cn>bCZ>`P!bcW~4@2{bu>e(yx{0^;QPxdRCs#@_HM=dU#=9 zqm}RD@`PyHmglUed5pL=7mZT1KaHw`cZ%%9AK$Q{&2ri;+Emxrscm&#-YL3#R(ZSf z+D;2Esqu65lDfRfQXg#-+5VT81vE~1Q$Ux0JnN|K+~*y&{rcB;dK~#Tzteg8*x`=0 z&8~N}&HTEyD52-&Y?~sAc~8uPUqGC<`~~!U#QJ#ZdAC7|>dDAofPYa(v>XU^$O^n-VA%AN<_OXz^nK3=H>W}&_qRKm0U7x(S z#&^~zsP({cP*;qfdg6Gf7mio!596hdmX_r9-Z>7vE?^v7 z4;Vk!1CEF52IJZahw#P#*1I-%mx$|h`s)OZ%d2fw3|*Pp;Yl#^d+9=mK%dUGt>$+6UC?}1&yjEw*m64#5Pt@KoWu$rO_bQ)DWvLPH z65lfnmAbCD{tpb4hkxai<=6e?^4nba|4b!i?blq=?25lc{hL#6w<#^3qjE~X>i}uJ z!cM;L5+wB&1>OuL;+-rp!I2~+LGxkj+0zxt&7pO%-V zzIJj^sz|BZU)0od{<8RxlWgr0ESoFmlb7*jMd3No-2){h=!#ReedBa_*%pvbdV7_V zzX#+JV`@dIIml5SJr9#H1s$aL34eL!?~?7O?1WO{I@m=D?GBMXnJ%)gVmXN&Um*Lu z)ebsXQF8Pukljy#iIrtqgp*WvsV4K+=8^J-zx3bamhH#tuX&x)lKH_c+po3U^LZJ$ ze5j!8zEECzN4m@5xs}CluzPkrj}2k6ZncXn9bH4#{^cyz`b&TJ7q2>nv+Y6;OUvBd zg{66cP^r?}Bios{;&TEuOp=QQCIP}8Y)3C zK9c#Xzr>dJ7E9+KX|&2)s{Bw%>b~(2ujSR{>tYW%F*sb#mMS87TZ&vgR!H{OEhkPXJKesZwOcM_D}TfU2l!2i83Chunl z$-Y-b%!llL>q$csb%GG+Y+_55B5*;s3%I=#4rv@5ettvU+6q@m|Fwb#3hB%VCx_mn)jBfcp*ggUAviG?s+jpJ}{O7UauNF@RAaC4^>oG4@r)FqOLsjlJ|XHDzDVSvM%Vosu1fX&z^izOb-q5lJobRfRq&Dj_F6s^)u(%EIM#QmtnJY3*`ReM)tg z^zx~y+ol3i(Cehyl;SRF{VuCf&_>^dw^Z!U?$UGY12wLF0jYNFu4>%ZLmU?4y~h8Y zPk8AiK84e>%dK&wL=}<6{T`}Fqo}M-d#bFqb-t|SjBVBi^SU3OrmscZ+&)(MN(NY*KaR z_=%UpMiuN>R8|exp#FO9Czs#hZ{hq;e^$M{xbjh5u2V)b#yd#6X@SzH(yve|Kq=>Mfg2 zVK3pXyR0bTEQ!@TWL;uz>9D3Su4%5)x3q`+GuB(4^e8MoO$y2U1BJ!8wS!!YE+F?- z=9Q*H-6SzNza-QzC|4J{$>CN7rPZ{;xTgJ|y|O0WW%|QShT&TXKUngK^Zk4hGAO?c z|GR+v-N!{%VZPe!bIERJZNKKOhg6Gok+mL0q)~kr@$hnzy1jDCt>!M`*9zaQyW=Je zhB;-oxAwovyD+ZPPSWRj5jk?$Nji>lmM6_~O1b0iQq47&9Gu`P>XCyCpWz|DZOoP3 zzI0=)xp2q**GCk#Cj~tSazpylJZ7&D9`^cn- zobq9fuf)H|B@2tYOY+FqYGAGc_%_l@^|4-2X?`%LSame!%{fcMCgUWu&MHffi(@p> z-ufbkBDQ{cPM2S6=Bw?$Ugc1%XWukT+YwFh|J`9PEgq%q=_sdN_EmRnZ+zKZ+s$80 z(DsX06SRGJ^K5PJ-85U<)i%Uy+y2*hZJ%`Aq-`Sooqci6GH>hn?D!ZjZEO6Dm$o%- z{2gFzTjMsGglXFvH{)e}Yuwg&2Ow^iTjMSAa)P$4@e+C78gB{2OPg_8k$LMl4$nJ* z7e^k}xMb`eJ&vbAsoKsMby(YWo3Cnnb?Maqjr)PN>!O_FZZYarcDc?oZ2Eow;j1p+ z^8Tx~ueQLqUr|4%WiH|Q*z?ZX_65@J9_OBotTz<#Fkag@X2Gk@U&MZAY~jmY(xNWZMd^_zCX zroI{(AMH1Yk4S$+#>aVmkM)}vg!qWX;Ezautd}3-rR@lRL<_DTM8-#?KjJO;<2-V_ z#LJiuBI6^{AL}tbt4(Z$`5Y#nI+Sm#bx8aKe?m-qJ5;tSq#2)ZVr0%lLZ_;s6-?X_-5E(C#`AoE{E4)q+xvmrG zm&o;=$m^1Hn@w`A;OT=#Tuj=8H(a5<6fV z#Oqi;i1bUOU;1AT{u7_VFOl&P>6iXFpUe;MQ;5tDk@q!3u5(2CB{s#l=|2_m5~%|s zbw#9K`sa0<^*N73-hXU~jL`QbM6UBh&LffQKaux2MBe`p$vYzBBr>l=-WL*izewad zKxCXmuE*?`_jyFl50UqYM8?T@sW;YVe1B}IuH&W6>ppGrjmS8O8Yk~dXj|hXpJ?00Nt^tl z-&N2V=ZX9x^7>4q4v6Fzk=GgWguicy{M|#OzKG-(c}BmSH|mSH2!4sbKwm_z2SoZM zQny6%m;KCw&S>*~fOf9eIke6GXg|U_L1cecWdGzj+i~6CxUBtK$H{ex<<@w(j?lKo z#os%$ZR4YDjg!BVXj|judO+J6uQg7tJ1pn=K(xlico`p&<<>ZaBnoF}3+PTptGw#LVKqiv0oanZKM_pwx@jx%>qq%QwFBPD|U z#ZE|xU_I{d(I#fuv6{~(4~^0~;bt?{}CN9sIV;|&{?62ZLN#!K5a&aCrU@qR(Pv>B%r z=|8naKW*C~ZrTBeljp7R+9!3=wl&@wh?D1SMg}n$On$nLqNIXpMvT z9C5Im@e!{hUZOR=OyrTaHNF?fA8l)V;}92ZYkbTf?Wi#+5k%&R{czr?E85ocS$3?x zew08SXfqDt7Q{j1JQCS2k@H4mKg5CO8|(bV0?C7>E$eIhbBp@gUjA9KY#`5{JcL-0 zZ(Ny0KF%BGk^K@sqd(#n^g}Fx@e-L2BIkohzeMJrNL~@C170_NpPUjwB;SeTHIaNL zl4r!a&>b-W{34RaS?615WZr1|fmcM1JL`O9jdd{(v=a~yk>etA{owr($yef`;*t9IBK^{4e);>6@e;QqP9psh zizSWHNWZk1Un2f0kw*HZP2DoD)4@Z|TYk(tZStNrbxXS?cu6ELiPRy{01t@N9g+NI zUa5cL2>4-nH~67V-4N+VBm5AlV6f+}{1Ve~og{MnMEa#a#!LHRK%{=|#d!IA zi++h*hqCNgjr2>q8~hS^{U6gg$mpB4> zAX0}}=UZrh)FW-K8+=a4`v@Za5}DsDJ60q8(q?{%yk8*leu2n%>5uCNZR(rz7z4f% zhl8&~UT=uxDUtdmQg@sm-cJyzHzIXHWPKv9Q>@<#{3iAWzlpqG;Cbqf7z%%!7wV2k zy%5;~`qmp7Y3f zh`iqGc}9DUXirSXb(i(Kp*?MmkM>;nq0M!GdFDDmYzaR^uA4;0LFD}b>+?EFo8zI) z^?)|l10vTa>--UUe?a8@0g?I2I$v4i2;_(DI8K)HK7q*l1R~cfBCpTf4`DwI|F>^L zo8z$}%XwX=O~14mFKym`WwooUZH|jJ@85_VFY9sqw0Rw&&H15Cq|JQM=KTe2@|3nU zF2+OK+P`hTEVuS&?Z@ih>X-iLm-jP7>Wb~SKF}u8=KT+C>XA0}Nt?e*Xj5ObiM07U zhe&Yxk& diff --git a/models/shininess_example.glb b/models/shininess_example.glb deleted file mode 100644 index c7198bf9eb992056933ef0c84dda92a59c2360e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79564 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

*%D=q!B@?ELK1@c_op8OWlleC^;vRt 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 czjgo5Kd!s} Date: Mon, 24 Jun 2019 16:40:07 -0700 Subject: [PATCH 09/11] Removing more large binaries causing LFS quota issues. --- npm/tests/.npmignore | 2 - npm/tests/README.md | 24 - .../models/fromFacebook/Jon/jon_morph.fbx | 3 - .../models/fromFacebook/Jon/troll-final.fbx | 3 - .../fromFacebook/Natalie/GlitchRobot.fbx | 3 - .../Ocean/blackvan/blackvan_diffuse.png | 3 - .../Ocean/blackvan/blackvan_emissive.png | 3 - .../Ocean/blackvan/blackvan_gloss.png | 3 - .../Ocean/blackvan/blackvan_normals.png | 3 - .../Ocean/blackvan/blackvan_specular.png | 3 - .../Ocean/blackvan/blackvan_windows.png | 3 - .../Ocean/blackvan/blackvan_with_windows.fbx | 3 - .../Ocean/zell_van_vertex_color.fbx | 3 - npm/tests/models/fromFacebook/RAZ/RAZ_ape.fbx | 3 - npm/tests/models/fromFbxSDK/Box.fbx | 3 - npm/tests/models/fromFbxSDK/Camera.fbx | 3 - npm/tests/models/fromFbxSDK/Humanoid.fbx | 3 - npm/tests/models/fromFbxSDK/Normals.fbx | 3 - .../BoxVertexColors/BoxVertexColors.fbx | 3 - .../WaterBottle/NewWaterBottle.fbx | 3 - .../fromGltfSamples/WaterBottle/README.md | 26 - .../WaterBottle/WaterBottle_BaseColor.png | 3 - .../WaterBottle/WaterBottle_Metallic.png | 3 - .../WaterBottle/WaterBottle_Normal.png | 3 - .../WaterBottle/WaterBottle_Roughness.png | 3 - npm/tests/package.json | 42 -- npm/tests/test/fbx2gltf.ts | 83 --- npm/tests/test/mocha.opts | 3 - npm/tests/tsconfig.json | 9 - npm/tests/yarn.lock | 564 ------------------ 30 files changed, 819 deletions(-) delete mode 100644 npm/tests/.npmignore delete mode 100644 npm/tests/README.md delete mode 100644 npm/tests/models/fromFacebook/Jon/jon_morph.fbx delete mode 100644 npm/tests/models/fromFacebook/Jon/troll-final.fbx delete mode 100644 npm/tests/models/fromFacebook/Natalie/GlitchRobot.fbx delete mode 100644 npm/tests/models/fromFacebook/Ocean/blackvan/blackvan_diffuse.png delete mode 100644 npm/tests/models/fromFacebook/Ocean/blackvan/blackvan_emissive.png delete mode 100644 npm/tests/models/fromFacebook/Ocean/blackvan/blackvan_gloss.png delete mode 100644 npm/tests/models/fromFacebook/Ocean/blackvan/blackvan_normals.png delete mode 100644 npm/tests/models/fromFacebook/Ocean/blackvan/blackvan_specular.png delete mode 100644 npm/tests/models/fromFacebook/Ocean/blackvan/blackvan_windows.png delete mode 100644 npm/tests/models/fromFacebook/Ocean/blackvan/blackvan_with_windows.fbx delete mode 100644 npm/tests/models/fromFacebook/Ocean/zell_van_vertex_color.fbx delete mode 100644 npm/tests/models/fromFacebook/RAZ/RAZ_ape.fbx delete mode 100644 npm/tests/models/fromFbxSDK/Box.fbx delete mode 100644 npm/tests/models/fromFbxSDK/Camera.fbx delete mode 100644 npm/tests/models/fromFbxSDK/Humanoid.fbx delete mode 100644 npm/tests/models/fromFbxSDK/Normals.fbx delete mode 100644 npm/tests/models/fromGltfSamples/BoxVertexColors/BoxVertexColors.fbx delete mode 100644 npm/tests/models/fromGltfSamples/WaterBottle/NewWaterBottle.fbx delete mode 100644 npm/tests/models/fromGltfSamples/WaterBottle/README.md delete mode 100644 npm/tests/models/fromGltfSamples/WaterBottle/WaterBottle_BaseColor.png delete mode 100644 npm/tests/models/fromGltfSamples/WaterBottle/WaterBottle_Metallic.png delete mode 100644 npm/tests/models/fromGltfSamples/WaterBottle/WaterBottle_Normal.png delete mode 100644 npm/tests/models/fromGltfSamples/WaterBottle/WaterBottle_Roughness.png delete mode 100644 npm/tests/package.json delete mode 100644 npm/tests/test/fbx2gltf.ts delete mode 100644 npm/tests/test/mocha.opts delete mode 100644 npm/tests/tsconfig.json delete mode 100644 npm/tests/yarn.lock diff --git a/npm/tests/.npmignore b/npm/tests/.npmignore deleted file mode 100644 index bd6c7fe..0000000 --- a/npm/tests/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -*.ts -!*.d.ts \ No newline at end of file diff --git a/npm/tests/README.md b/npm/tests/README.md deleted file mode 100644 index c153b05..0000000 --- a/npm/tests/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# FBX2glTF Regression Suite - -It's imperative that as we add new functionality to FBX2glTF and refactor code, -that old behaviour does not change underfoot in unexpected and detrimental ways. - -This is a very simple first beginnings of a test suite for converting FBX files -and ensuring the consistency of the GLB. At present all we do is make sure that -the generated GLB is valid. We will have to add other integrity checks here for -the tests to accomplish what we intend. - -We will also want to test the same file with a variety of command line switches, -e.g. with Draco compression and different materials. - -## Setting up - -We recommend using Yarn rather than NPM. Installation instructions can be found -[here](https://yarnpkg.com/lang/en/docs/install/). - -> yarn install - -## Running tests - -> yarn test - diff --git a/npm/tests/models/fromFacebook/Jon/jon_morph.fbx b/npm/tests/models/fromFacebook/Jon/jon_morph.fbx deleted file mode 100644 index 21edfcb..0000000 --- a/npm/tests/models/fromFacebook/Jon/jon_morph.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4c2a5e85e167c1b9d91dbfe29a44cad80afab7f95a97f42c69a40dbd573265df -size 68128 diff --git a/npm/tests/models/fromFacebook/Jon/troll-final.fbx b/npm/tests/models/fromFacebook/Jon/troll-final.fbx deleted file mode 100644 index 3360922..0000000 --- a/npm/tests/models/fromFacebook/Jon/troll-final.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:84732464cd4c52e813a6ec7c0b5bff50290a2e8e05b6ecc38c2b98e474eaafcf -size 14302496 diff --git a/npm/tests/models/fromFacebook/Natalie/GlitchRobot.fbx b/npm/tests/models/fromFacebook/Natalie/GlitchRobot.fbx deleted file mode 100644 index a7e72ce..0000000 --- a/npm/tests/models/fromFacebook/Natalie/GlitchRobot.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:afcc80ed8ce4a5cd62e5b14fa91c1ae69188211d973dd9a8c0300e21e91d1f8f -size 219872 diff --git a/npm/tests/models/fromFacebook/Ocean/blackvan/blackvan_diffuse.png b/npm/tests/models/fromFacebook/Ocean/blackvan/blackvan_diffuse.png deleted file mode 100644 index d0d9126..0000000 --- a/npm/tests/models/fromFacebook/Ocean/blackvan/blackvan_diffuse.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9361b0de05056e7208ba5a8f44f27273c20594967617d4965acdac091e4e63e8 -size 3634331 diff --git a/npm/tests/models/fromFacebook/Ocean/blackvan/blackvan_emissive.png b/npm/tests/models/fromFacebook/Ocean/blackvan/blackvan_emissive.png deleted file mode 100644 index 91f85a1..0000000 --- a/npm/tests/models/fromFacebook/Ocean/blackvan/blackvan_emissive.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:982d00006d786a95eb76b41973119a179009f546cbe720a416640ce680a32e67 -size 36280 diff --git a/npm/tests/models/fromFacebook/Ocean/blackvan/blackvan_gloss.png b/npm/tests/models/fromFacebook/Ocean/blackvan/blackvan_gloss.png deleted file mode 100644 index e06853d..0000000 --- a/npm/tests/models/fromFacebook/Ocean/blackvan/blackvan_gloss.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:37e79b91ec0eefaeccaf1235be8f96fda7e8b8cb9bb1074cb987a20ea8d1f164 -size 1856211 diff --git a/npm/tests/models/fromFacebook/Ocean/blackvan/blackvan_normals.png b/npm/tests/models/fromFacebook/Ocean/blackvan/blackvan_normals.png deleted file mode 100644 index 88c1545..0000000 --- a/npm/tests/models/fromFacebook/Ocean/blackvan/blackvan_normals.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1eb84a76fe8faa5c375a9fcabee4239b5e23cd5d9a08489c985a7379d754cdca -size 2562707 diff --git a/npm/tests/models/fromFacebook/Ocean/blackvan/blackvan_specular.png b/npm/tests/models/fromFacebook/Ocean/blackvan/blackvan_specular.png deleted file mode 100644 index 4a6e6fa..0000000 --- a/npm/tests/models/fromFacebook/Ocean/blackvan/blackvan_specular.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:039686eea30aaa2ecddc425e2adc54d942566298c9a3c790fb1d513838c9a305 -size 1916685 diff --git a/npm/tests/models/fromFacebook/Ocean/blackvan/blackvan_windows.png b/npm/tests/models/fromFacebook/Ocean/blackvan/blackvan_windows.png deleted file mode 100644 index 1d3bbe2..0000000 --- a/npm/tests/models/fromFacebook/Ocean/blackvan/blackvan_windows.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f41122ebb23597fdaaa44d66c93b5b95675abd5e379d1b27917f1ec4119c2576 -size 4092711 diff --git a/npm/tests/models/fromFacebook/Ocean/blackvan/blackvan_with_windows.fbx b/npm/tests/models/fromFacebook/Ocean/blackvan/blackvan_with_windows.fbx deleted file mode 100644 index 5d460a9..0000000 --- a/npm/tests/models/fromFacebook/Ocean/blackvan/blackvan_with_windows.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:52cb225bad9cc9c74bc80c2c9f15a44cddf738d08e2194df4bd1259b830b17c7 -size 1072432 diff --git a/npm/tests/models/fromFacebook/Ocean/zell_van_vertex_color.fbx b/npm/tests/models/fromFacebook/Ocean/zell_van_vertex_color.fbx deleted file mode 100644 index 99fc979..0000000 --- a/npm/tests/models/fromFacebook/Ocean/zell_van_vertex_color.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a56249c6d7a953f4dac9fd823324ac948c348ae5b306fa020667ee5b8e9c4f2f -size 2295056 diff --git a/npm/tests/models/fromFacebook/RAZ/RAZ_ape.fbx b/npm/tests/models/fromFacebook/RAZ/RAZ_ape.fbx deleted file mode 100644 index 5954a28..0000000 --- a/npm/tests/models/fromFacebook/RAZ/RAZ_ape.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a5ae59378d0e90957bce9f766e4e5b41212af8ca2835902391b3d31c0181a056 -size 564048 diff --git a/npm/tests/models/fromFbxSDK/Box.fbx b/npm/tests/models/fromFbxSDK/Box.fbx deleted file mode 100644 index d78a3cb..0000000 --- a/npm/tests/models/fromFbxSDK/Box.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:862247f82d91dab7a998c6110775eaed0bd7196368e40f3bf6115f9221bf1875 -size 12128 diff --git a/npm/tests/models/fromFbxSDK/Camera.fbx b/npm/tests/models/fromFbxSDK/Camera.fbx deleted file mode 100644 index 361bda7..0000000 --- a/npm/tests/models/fromFbxSDK/Camera.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b4c6de8e9b23c05bd0bd2c227e9d817deb30efea5779db5afe03752a2869e2cd -size 23180 diff --git a/npm/tests/models/fromFbxSDK/Humanoid.fbx b/npm/tests/models/fromFbxSDK/Humanoid.fbx deleted file mode 100644 index 57d0733..0000000 --- a/npm/tests/models/fromFbxSDK/Humanoid.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6ce40cb9b86d0bcdfb66a3382a80349b70037d65197906be34eab0db6eb9418c -size 8983744 diff --git a/npm/tests/models/fromFbxSDK/Normals.fbx b/npm/tests/models/fromFbxSDK/Normals.fbx deleted file mode 100644 index 801a458..0000000 --- a/npm/tests/models/fromFbxSDK/Normals.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6a783718dd72e3d1acd76b6e41c950ca1f9f04743a4c7f3dd4e571169ff464d4 -size 704532 diff --git a/npm/tests/models/fromGltfSamples/BoxVertexColors/BoxVertexColors.fbx b/npm/tests/models/fromGltfSamples/BoxVertexColors/BoxVertexColors.fbx deleted file mode 100644 index d672f76..0000000 --- a/npm/tests/models/fromGltfSamples/BoxVertexColors/BoxVertexColors.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:03ed8da4f2b5b6a5309fa52b2b700e49215f8ba680789b5f210688615232625b -size 17424 diff --git a/npm/tests/models/fromGltfSamples/WaterBottle/NewWaterBottle.fbx b/npm/tests/models/fromGltfSamples/WaterBottle/NewWaterBottle.fbx deleted file mode 100644 index a6aee69..0000000 --- a/npm/tests/models/fromGltfSamples/WaterBottle/NewWaterBottle.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:36f5082165900ce7c0e53d8638c12aa55ef79d80983b65c024a468d210b4c1ff -size 159532 diff --git a/npm/tests/models/fromGltfSamples/WaterBottle/README.md b/npm/tests/models/fromGltfSamples/WaterBottle/README.md deleted file mode 100644 index c1888fa..0000000 --- a/npm/tests/models/fromGltfSamples/WaterBottle/README.md +++ /dev/null @@ -1,26 +0,0 @@ -# Water Bottle - -## FBX2glTF Changes - -Imported into Blender, texture files explicitly re-attached to material, -metallic & smoothness separated into distinct textures, smoothness negated -into roughmess, then re-exported as FBX. - -## Original Description - -Authored with PBR metallic/smoothness intended for import into Unity3D. - -Binary FBX contains only the geometry. Textures are in separate files. - -|Name|Map| -|----|---| -|`WaterBottle_BaseColor`|Albedo| -|`WaterBottle_MetalSmooth`|Metallic/Smoothness| -|`WaterBottle_Emissive`|Emissive| -|`WaterBottle_Normal`|Normal| -|`WaterBottle_Occlusion`|Occlusion| - -## License Information - -[![CC0](http://i.creativecommons.org/p/zero/1.0/88x31.png)](http://creativecommons.org/publicdomain/zero/1.0/) -To the extent possible under law, Microsoft has waived all copyright and related or neighboring rights to this asset. diff --git a/npm/tests/models/fromGltfSamples/WaterBottle/WaterBottle_BaseColor.png b/npm/tests/models/fromGltfSamples/WaterBottle/WaterBottle_BaseColor.png deleted file mode 100644 index 4170ac1..0000000 --- a/npm/tests/models/fromGltfSamples/WaterBottle/WaterBottle_BaseColor.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1bf6b6c6f87085e3d880f6b2d4c0350b2582b1f5a36cafa689cdebdc65720908 -size 1538074 diff --git a/npm/tests/models/fromGltfSamples/WaterBottle/WaterBottle_Metallic.png b/npm/tests/models/fromGltfSamples/WaterBottle/WaterBottle_Metallic.png deleted file mode 100644 index 10d531e..0000000 --- a/npm/tests/models/fromGltfSamples/WaterBottle/WaterBottle_Metallic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1e0b4d7567a663838d4e58a9d7ca145b560a19c7ee3b2fbe9cbc446f8a221a5f -size 279918 diff --git a/npm/tests/models/fromGltfSamples/WaterBottle/WaterBottle_Normal.png b/npm/tests/models/fromGltfSamples/WaterBottle/WaterBottle_Normal.png deleted file mode 100644 index 60221c8..0000000 --- a/npm/tests/models/fromGltfSamples/WaterBottle/WaterBottle_Normal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e539a182f42071f47585bf34e4f035fb008a38c3942752e7147e5b281d1e55a -size 2301362 diff --git a/npm/tests/models/fromGltfSamples/WaterBottle/WaterBottle_Roughness.png b/npm/tests/models/fromGltfSamples/WaterBottle/WaterBottle_Roughness.png deleted file mode 100644 index 26b94d2..0000000 --- a/npm/tests/models/fromGltfSamples/WaterBottle/WaterBottle_Roughness.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:915d320f5e8660b32e64524cede52ab9591b693c7dc7d7088fc973dae38f0875 -size 1633811 diff --git a/npm/tests/package.json b/npm/tests/package.json deleted file mode 100644 index 91a4c86..0000000 --- a/npm/tests/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "fbx2gltf-tests", - "version": "0.9.6", - "description": "Test suite for FBX2glTF", - "main": "index.js", - "repository": { - "type": "git", - "url": "git+https://github.com/facebookincubator/FBX2glTF.git" - }, - "contributors": [ - "Pär Winzell ", - "Michael Bayne", - "J.M.P. van Waveren", - "Amanda Watson" - ], - "license": "BSD-3-Clause", - "bugs": { - "url": "https://github.com/facebookincubator/FBX2glTF/issues" - }, - "homepage": "https://github.com/facebookincubator/FBX2glTF", - "scripts": { - "pretest": "tsc", - "test": "mocha", - "watch": "mocha-typescript-watch", - "prepare": "tsc" - }, - "dependencies": { - "fbx2gltf": "file:../fbx2gltf", - "gltf-validator": "^2.0.0-dev.2.7", - "tmp": "^0.0.33" - }, - "devDependencies": { - "@types/chai": "^4.1.7", - "@types/mocha": "^5.2.5", - "@types/node": "^10.12.12", - "chai": "^4.2.0", - "mocha": "^5.2.0", - "mocha-typescript": "^1.1.17", - "source-map-support": "^0.5.9", - "typescript": "^3.2.2" - } -} diff --git a/npm/tests/test/fbx2gltf.ts b/npm/tests/test/fbx2gltf.ts deleted file mode 100644 index 93e5a27..0000000 --- a/npm/tests/test/fbx2gltf.ts +++ /dev/null @@ -1,83 +0,0 @@ -import {assert, expect} from 'chai'; -import * as fbx2gltf from 'fbx2gltf'; -import {readFileSync} from 'fs'; -import {validateBytes} from 'gltf-validator'; -import * as path from 'path'; -import * as tmp from 'tmp'; - -interface Model { - path: string; - ignoredIssues?: Array; - args?: Array; -} - -const MODELS: Array = [ - {path : 'fromFacebook/Jon/jon_morph'}, - { - path : 'fromFacebook/Jon/troll-final', - ignoredIssues : [ 'ACCESSOR_NON_UNIT' ], - }, - {path : 'fromFacebook/Natalie/GlitchRobot'}, - {path : 'fromFacebook/Ocean/blackvan/blackvan_with_windows'}, - { - path : 'fromFacebook/Ocean/zell_van_vertex_color', - args : [ '--draco' ], - ignoredIssues : [ 'UNSUPPORTED_EXTENSION' ], - }, - {path : 'fromFacebook/RAZ/RAZ_ape', args : [ '--long-indices=always' ]}, - {path : 'fromFbxSDK/Box'}, - { - path : 'fromFbxSDK/Humanoid', - ignoredIssues : [ 'UNSUPPORTED_EXTENSION' ], - }, - { - path : 'fromFbxSDK/Camera', - ignoredIssues : [ 'UNSUPPORTED_EXTENSION' ], - }, - {path : 'fromFbxSDK/Normals'}, - {path : 'fromGltfSamples/BoxVertexColors/BoxVertexColors', args : [ '--khr-materials-unlit' ]}, - {path : 'fromGltfSamples/WaterBottle/NewWaterBottle'}, -]; - -const CONVERSION_TIMEOUT_MS = 50000; - -describe('FBX2glTF', () => { - const tmpobj = tmp.dirSync(); - for (let model of MODELS) { - const modelName = path.basename(model.path); - describe('Model: ' + modelName, () => { - const fbxPath = path.join('models', model.path + '.fbx'); - let glbBytes; - it('should convert fbx to glb', async () => { - const glbPath = path.join(tmpobj.name, modelName + '.glb'); - - try { - const destPath = await fbx2gltf(fbxPath, glbPath, model.args || []); - assert.isNotNull(destPath); - glbBytes = readFileSync(destPath); - } catch (err) { - throw new Error('Conversion failed: ' + err); - } - }).timeout(CONVERSION_TIMEOUT_MS); - - if (!glbBytes) { - return; - } - it('resulting glb should be valid', async () => { - try { - let options = {}; - if (model.ignoredIssues) { - options.ignoredIssues = model.ignoredIssues; - } - const report = await validateBytes(glbBytes, options); - expect(report.issues.numErrors).to.equal(0); - expect(report.issues.numWarnings).to.equal(0); - - } catch (err) { - throw new Error('Validation failed: ' + err); - } - }); - }); - } - console.log('GLB files may be inspected in: ' + tmpobj.name); -}); diff --git a/npm/tests/test/mocha.opts b/npm/tests/test/mocha.opts deleted file mode 100644 index bb4e390..0000000 --- a/npm/tests/test/mocha.opts +++ /dev/null @@ -1,3 +0,0 @@ ---ui mocha-typescript ---require source-map-support/register ---recursive test diff --git a/npm/tests/tsconfig.json b/npm/tests/tsconfig.json deleted file mode 100644 index 75d60af..0000000 --- a/npm/tests/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "compilerOptions": { - "target": "es6", - "module": "commonjs", - "sourceMap": true, - "experimentalDecorators": true, - "lib": [ "es6" ] - } -} \ No newline at end of file diff --git a/npm/tests/yarn.lock b/npm/tests/yarn.lock deleted file mode 100644 index 7a4972e..0000000 --- a/npm/tests/yarn.lock +++ /dev/null @@ -1,564 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@types/chai@^4.1.7": - version "4.1.7" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.1.7.tgz#1b8e33b61a8c09cbe1f85133071baa0dbf9fa71a" - -"@types/mocha@^5.2.0", "@types/mocha@^5.2.5": - version "5.2.6" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.6.tgz#b8622d50557dd155e9f2f634b7d68fd38de5e94b" - -"@types/node@^10.12.12": - version "10.12.26" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.26.tgz#2dec19f1f7981c95cb54bab8f618ecb5dc983d0e" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - dependencies: - color-convert "^1.9.0" - -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -browser-stdout@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - -buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - -camelcase@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - -chai@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.2" - deep-eql "^3.0.1" - get-func-name "^2.0.0" - pathval "^1.1.0" - type-detect "^4.0.5" - -chalk@^2.4.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -check-error@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - -cliui@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi "^2.0.0" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - dependencies: - color-name "1.1.3" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - -commander@2.15.1: - version "2.15.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - -cross-spawn@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -debug@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - dependencies: - ms "2.0.0" - -decamelize@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - -deep-eql@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" - dependencies: - type-detect "^4.0.0" - -diff@3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - -execa@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -"fbx2gltf@file:../fbx2gltf": - version "0.9.6" - dependencies: - rimraf "^2.6.2" - -find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - dependencies: - locate-path "^2.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - -get-caller-file@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" - -get-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - -get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - -glob@7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -gltf-validator@^2.0.0-dev.2.7: - version "2.0.0-dev.2.7" - resolved "https://registry.yarnpkg.com/gltf-validator/-/gltf-validator-2.0.0-dev.2.7.tgz#56369153c11a4cd005f5a7034716fc3baa1f8410" - -growl@1.10.5: - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - -he@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - dependencies: - invert-kv "^1.0.0" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -lru-cache@^4.0.1: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -mem@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" - dependencies: - mimic-fn "^1.0.0" - -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - -minimatch@3.0.4, minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - dependencies: - brace-expansion "^1.1.7" - -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - -mkdirp@0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - dependencies: - minimist "0.0.8" - -mocha-typescript@^1.1.17: - version "1.1.17" - resolved "https://registry.yarnpkg.com/mocha-typescript/-/mocha-typescript-1.1.17.tgz#f78b29ad4f87fce8c25f657883e3eca39fb026c9" - dependencies: - "@types/mocha" "^5.2.0" - chalk "^2.4.1" - cross-spawn "^6.0.5" - yargs "^11.0.0" - -mocha@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6" - dependencies: - browser-stdout "1.3.1" - commander "2.15.1" - debug "3.1.0" - diff "3.5.0" - escape-string-regexp "1.0.5" - glob "7.1.2" - growl "1.10.5" - he "1.1.1" - minimatch "3.0.4" - mkdirp "0.5.1" - supports-color "5.4.0" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - dependencies: - path-key "^2.0.0" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - dependencies: - wrappy "1" - -os-locale@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" - dependencies: - execa "^0.7.0" - lcid "^1.0.0" - mem "^1.1.0" - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - dependencies: - p-try "^1.0.0" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - dependencies: - p-limit "^1.1.0" - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - -pathval@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" - -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - -rimraf@^2.6.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - dependencies: - glob "^7.1.3" - -semver@^5.5.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - dependencies: - shebang-regex "^1.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - -signal-exit@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - -source-map-support@^0.5.9: - version "0.5.10" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.10.tgz#2214080bc9d51832511ee2bab96e3c2f9353120c" - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -string-width@^2.0.0, string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - dependencies: - ansi-regex "^3.0.0" - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - -supports-color@5.4.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" - dependencies: - has-flag "^3.0.0" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - dependencies: - has-flag "^3.0.0" - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - dependencies: - os-tmpdir "~1.0.2" - -type-detect@^4.0.0, type-detect@^4.0.5: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - -typescript@^3.2.2: - version "3.3.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.3.3.tgz#f1657fc7daa27e1a8930758ace9ae8da31403221" - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - -which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - dependencies: - isexe "^2.0.0" - -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - -y18n@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - -yargs-parser@^9.0.2: - version "9.0.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" - dependencies: - camelcase "^4.1.0" - -yargs@^11.0.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" - dependencies: - cliui "^4.0.0" - decamelize "^1.1.1" - find-up "^2.1.0" - get-caller-file "^1.0.1" - os-locale "^2.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^9.0.2" From 530a40d0e1d55f5f1128da8bdd184b8abab05b62 Mon Sep 17 00:00:00 2001 From: Henrik Halen Date: Wed, 26 Jun 2019 16:04:54 -0700 Subject: [PATCH 10/11] Remove dead code causing compilation issues. --- src/gltf/Raw2Gltf.hpp | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/gltf/Raw2Gltf.hpp b/src/gltf/Raw2Gltf.hpp index d1cef7f..305b437 100644 --- a/src/gltf/Raw2Gltf.hpp +++ b/src/gltf/Raw2Gltf.hpp @@ -153,20 +153,6 @@ struct AttributeDefinition { glType(_glType), dracoAttribute(draco::GeometryAttribute::INVALID), dracoComponentType(draco::DataType::DT_INVALID) {} - - AttributeDefinition( - const std::string gltfName, - const T RawVertex::*rawAttributeIx, - const GLType& _glType, - const draco::GeometryAttribute::Type dracoAttribute, - const draco::DataType dracoComponentType, - const int arrayOffset) - : gltfName(gltfName), - rawAttributeIx(rawAttributeIx), - glType(_glType), - dracoAttribute(dracoAttribute), - dracoComponentType(dracoComponentType), - arrayOffset(arrayOffset){} }; template From ef35253c8234881de9b696e5898d663d1ae03478 Mon Sep 17 00:00:00 2001 From: Henrik Halen Date: Wed, 26 Jun 2019 16:32:42 -0700 Subject: [PATCH 11/11] Fix white space issues. --- src/raw/RawModel.cpp | 4 ++-- src/raw/RawModel.hpp | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/raw/RawModel.cpp b/src/raw/RawModel.cpp index 40aedf5..e4f1a79 100644 --- a/src/raw/RawModel.cpp +++ b/src/raw/RawModel.cpp @@ -660,10 +660,10 @@ void RawModel::CreateMaterialModels( vertex.uv1 = defaultVertex.uv1; } if ((keep & RAW_VERTEX_ATTRIBUTE_JOINT_INDICES) == 0) { - vertex.jointIndices = defaultVertex.jointIndices; + vertex.jointIndices = defaultVertex.jointIndices; } if ((keep & RAW_VERTEX_ATTRIBUTE_JOINT_WEIGHTS) == 0) { - vertex.jointWeights = defaultVertex.jointWeights; + vertex.jointWeights = defaultVertex.jointWeights; } } diff --git a/src/raw/RawModel.hpp b/src/raw/RawModel.hpp index b790a24..aa6ce1f 100644 --- a/src/raw/RawModel.hpp +++ b/src/raw/RawModel.hpp @@ -60,8 +60,7 @@ struct RawVertex { Vec2f uv1{0.0f}; std::vector jointIndices; std::vector jointWeights; - - + std::vector skinningInfo; // end of members that directly correspond to vertex attributes