Remove custom SkVertices data and runtime effect `varying` support
This was an experimental feature. It worked (but only the GPU backend).
It was never adopted or used by anyone, to my knowledge. It's a large
amount of code, and a strange corner of SkSL for users to stumble into.
Bug: skia:10680
Change-Id: I0dda0364bce7dbffa58c32de4c7801ec2a6bc42e
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/398222
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
diff --git a/RELEASE_NOTES.txt b/RELEASE_NOTES.txt
index bfeef83..448d7e4 100644
--- a/RELEASE_NOTES.txt
+++ b/RELEASE_NOTES.txt
@@ -6,7 +6,9 @@
Milestone 92
------------
- *
+ * Removed custom attributes from SkVertices and the corresponding `varying` feature from
+ SkRuntimeEffect.
+ https://review.skia.org/398222
* * *
diff --git a/gm/vertices.cpp b/gm/vertices.cpp
index d8d3a80..a1ac94a 100644
--- a/gm/vertices.cpp
+++ b/gm/vertices.cpp
@@ -272,49 +272,6 @@
draw_batching(canvas);
}
-using AttrType = SkVertices::Attribute::Type;
-
-DEF_SIMPLE_GM(vertices_data, canvas, 512, 256) {
- for (auto attrType : {AttrType::kFloat4, AttrType::kByte4_unorm}) {
- SkRect r = SkRect::MakeWH(256, 256);
- int vcount = 4; // just a quad
- int icount = 0;
- SkVertices::Attribute attrs[] = { attrType };
- SkVertices::Builder builder(SkVertices::kTriangleFan_VertexMode, vcount, icount, attrs, 1);
-
- r.toQuad(builder.positions());
-
- if (attrType == AttrType::kFloat4) {
- SkV4* col = (SkV4*)builder.customData();
- col[0] = {1, 0, 0, 1}; // red
- col[1] = {0, 1, 0, 1}; // green
- col[2] = {0, 0, 1, 1}; // blue
- col[3] = {0.5, 0.5, 0.5, 1}; // gray
- } else {
- uint32_t* col = (uint32_t*)builder.customData();
- col[0] = 0xFF0000FF;
- col[1] = 0xFF00FF00;
- col[2] = 0xFFFF0000;
- col[3] = 0xFF7F7F7F;
- }
-
- SkPaint paint;
- const char* gProg = R"(
- varying float4 vtx_color;
- half4 main(float2 p) {
- return vtx_color;
- }
- )";
- auto [effect, errorText] = SkRuntimeEffect::Make(SkString(gProg));
- if (!effect) {
- SK_ABORT("RuntimeEffect error: %s\n", errorText.c_str());
- }
- paint.setShader(effect->makeShader(nullptr, nullptr, 0, nullptr, true));
- canvas->drawVertices(builder.detach(), paint);
- canvas->translate(r.width(), 0);
- }
-}
-
// Test case for skbug.com/10069. We need to draw the vertices twice (with different matrices) to
// trigger the bug.
DEF_SIMPLE_GM(vertices_perspective, canvas, 256, 256) {
@@ -353,279 +310,3 @@
canvas->drawVertices(verts, paint);
canvas->restore();
}
-
-DEF_SIMPLE_GM(vertices_data_lerp, canvas, 256, 256) {
- SkPoint pts[12] = {{0, 0}, {85, 0}, {171, 0}, {256, 0}, {256, 85}, {256, 171},
- {256, 256}, {171, 256}, {85, 256}, {0, 256}, {0, 171}, {0, 85}};
-
- auto patchVerts = SkPatchUtils::MakeVertices(pts, nullptr, nullptr, 12, 12);
- SkVerticesPriv pv(patchVerts->priv());
-
- SkVertices::Attribute attrs[1] = { AttrType::kFloat };
- SkVertices::Builder builder(pv.mode(), pv.vertexCount(), pv.indexCount(), attrs, 1);
-
- memcpy(builder.positions(), pv.positions(), pv.vertexCount() * sizeof(SkPoint));
- memcpy(builder.indices(), pv.indices(), pv.indexCount() * sizeof(uint16_t));
-
- SkRandom rnd;
- float* lerpData = (float*)builder.customData();
- for (int i = 0; i < pv.vertexCount(); ++i) {
- lerpData[i] = rnd.nextBool() ? 1.0f : 0.0f;
- }
-
- auto verts = builder.detach();
-
- SkPaint paint;
- const char* gProg = R"(
- uniform shader c0;
- uniform shader c1;
- varying float vtx_lerp;
- half4 main(float2 p) {
- half4 col0 = sample(c0, p);
- half4 col1 = sample(c1, p);
- return mix(col0, col1, vtx_lerp);
- }
- )";
- auto [effect, errorText] = SkRuntimeEffect::Make(SkString(gProg));
- SkMatrix scale = SkMatrix::Scale(2, 2);
- sk_sp<SkShader> children[] = {
- GetResourceAsImage("images/mandrill_256.png")->makeShader(SkSamplingOptions()),
- GetResourceAsImage("images/color_wheel.png")->makeShader(SkSamplingOptions(), scale),
- };
- paint.setShader(effect->makeShader(nullptr, children, 2, nullptr, false));
-
- canvas->drawVertices(verts, paint);
-}
-
-static constexpr SkScalar kSin60 = 0.8660254f; // sqrt(3) / 2
-static constexpr SkPoint kHexVerts[] = {
- { 0, 0 },
- { 0, -1 },
- { kSin60, -0.5f },
- { kSin60, 0.5f },
- { 0, 1 },
- { -kSin60, 0.5f },
- { -kSin60, -0.5f },
- { 0, -1 },
-};
-
-static constexpr SkColor4f kColors[] = {
- SkColors::kWhite,
- SkColors::kRed,
- SkColors::kYellow,
- SkColors::kGreen,
- SkColors::kCyan,
- SkColors::kBlue,
- SkColors::kMagenta,
- SkColors::kRed,
-};
-
-using Attr = SkVertices::Attribute;
-
-DEF_SIMPLE_GM(vertices_custom_colors, canvas, 400, 200) {
- ToolUtils::draw_checkerboard(canvas);
-
- auto draw = [=](SkScalar cx, SkScalar cy, SkVertices::Builder& builder, const SkPaint& paint) {
- memcpy(builder.positions(), kHexVerts, sizeof(kHexVerts));
-
- canvas->save();
- canvas->translate(cx, cy);
- canvas->scale(45, 45);
- canvas->drawVertices(builder.detach(), paint);
- canvas->restore();
- };
-
- auto transColor = [](int i) {
- return SkColor4f { kColors[i].fR, kColors[i].fG, kColors[i].fB, i % 2 ? 0.5f : 1.0f };
- };
-
- // Fixed function SkVertices, opaque
- {
- SkVertices::Builder builder(SkVertices::kTriangleFan_VertexMode, 8, 0,
- SkVertices::kHasColors_BuilderFlag);
- for (int i = 0; i < 8; ++i) {
- builder.colors()[i] = kColors[i].toSkColor();
- }
- draw(50, 50, builder, SkPaint());
- }
-
- // Fixed function SkVertices, w/transparency
- {
- SkVertices::Builder builder(SkVertices::kTriangleFan_VertexMode, 8, 0,
- SkVertices::kHasColors_BuilderFlag);
- for (int i = 0; i < 8; ++i) {
- builder.colors()[i] = transColor(i).toSkColor();
- }
- draw(50, 150, builder, SkPaint());
- }
-
- const char* gProg = R"(
- varying half4 vtx_color;
- half4 main(float2 p) {
- return vtx_color;
- }
- )";
- SkPaint skslPaint;
- auto [effect, errorText] = SkRuntimeEffect::Make(SkString(gProg));
- skslPaint.setShader(effect->makeShader(nullptr, nullptr, 0, nullptr, false));
-
- Attr byteColorAttr(Attr::Type::kByte4_unorm, Attr::Usage::kColor);
- Attr float4ColorAttr(Attr::Type::kFloat4, Attr::Usage::kColor);
- Attr float3ColorAttr(Attr::Type::kFloat3, Attr::Usage::kColor);
-
- // Custom vertices, byte colors, opaque
- {
- SkVertices::Builder builder(SkVertices::kTriangleFan_VertexMode, 8, 0, &byteColorAttr, 1);
- for (int i = 0; i < 8; ++i) {
- ((uint32_t*)builder.customData())[i] = kColors[i].toBytes_RGBA();
- }
- draw(150, 50, builder, skslPaint);
- }
-
- // Custom vertices, byte colors, w/transparency
- {
- SkVertices::Builder builder(SkVertices::kTriangleFan_VertexMode, 8, 0, &byteColorAttr, 1);
- for (int i = 0; i < 8; ++i) {
- ((uint32_t*)builder.customData())[i] = transColor(i).toBytes_RGBA();
- }
- draw(150, 150, builder, skslPaint);
- }
-
- // Custom vertices, float4 colors, opaque
- {
- SkVertices::Builder builder(SkVertices::kTriangleFan_VertexMode, 8, 0, &float4ColorAttr, 1);
- for (int i = 0; i < 8; ++i) {
- ((SkColor4f*)builder.customData())[i] = kColors[i];
- }
- draw(250, 50, builder, skslPaint);
- }
-
- // Custom vertices, float4 colors, w/transparency
- {
- SkVertices::Builder builder(SkVertices::kTriangleFan_VertexMode, 8, 0, &float4ColorAttr, 1);
- SkColor4f* clr = (SkColor4f*)builder.customData();
- for (int i = 0; i < 8; ++i) {
- clr[i] = transColor(i);
- }
- draw(250, 150, builder, skslPaint);
- }
-
- // Custom vertices, float3 colors, opaque
- {
- SkVertices::Builder builder(SkVertices::kTriangleFan_VertexMode, 8, 0, &float3ColorAttr, 1);
- for (int i = 0; i < 8; ++i) {
- ((SkV3*)builder.customData())[i] = { kColors[i].fR, kColors[i].fG, kColors[i].fB };
- }
- draw(350, 50, builder, skslPaint);
- }
-}
-
-static sk_sp<SkVertices> make_cone(Attr::Usage u, const char* markerName) {
- Attr attr(Attr::Type::kFloat3, u, markerName);
-
- constexpr int kPerimeterVerts = 64;
- // +1 for the center, +1 to repeat the first perimeter point (so we draw a complete circle)
- constexpr int kNumVerts = kPerimeterVerts + 2;
-
- SkVertices::Builder builder(SkVertices::kTriangleFan_VertexMode, kNumVerts, /*indexCount=*/0,
- &attr, /*attrCount=*/1);
-
- SkPoint* pos = builder.positions();
- SkPoint3* vec = static_cast<SkPoint3*>(builder.customData());
-
- pos[0] = { 0, 0 };
- vec[0] = { 0, 0, 1 };
-
- for (int i = 0; i < kPerimeterVerts + 1; ++i) {
- SkScalar t = (i / SkIntToScalar(kPerimeterVerts)) * 2 * SK_ScalarPI;
- SkScalar s = SkScalarSin(t),
- c = SkScalarCos(t);
- pos[i + 1] = { c, s };
- vec[i + 1] = { c, s, 0 };
- }
-
- return builder.detach();
-}
-
-DEF_SIMPLE_GM(vertices_custom_matrices, canvas, 400, 400) {
- ToolUtils::draw_checkerboard(canvas);
-
- const char* kViewSpace = "local_to_view";
- const char* kWorldSpace = "local_to_world";
- const char* kLocalSpace = "local_to_local";
-
- auto draw = [=](SkScalar cx, SkScalar cy, sk_sp<SkVertices> vertices, const char* prog,
- SkScalar squish = 1.0f) {
- SkPaint paint;
- auto [effect, errorText] = SkRuntimeEffect::Make(SkString(prog));
- paint.setShader(effect->makeShader(nullptr, nullptr, 0, nullptr, false));
-
- canvas->save();
-
- // Device space: mesh is upright, translated to its "cell"
- canvas->translate(cx, cy);
-
- // View (camera) space: Mesh is upright, centered on origin, device scale
- canvas->markCTM(kViewSpace);
- canvas->rotate(90);
-
- // World space: Mesh is sideways, centered on origin, device scale (possibly squished)
- canvas->markCTM(kWorldSpace);
- canvas->rotate(-90);
- canvas->scale(45, 45 * squish);
-
- // Local space: Mesh is upright, centered on origin, unit scale
- canvas->markCTM(kLocalSpace);
- canvas->drawVertices(vertices, paint);
-
- canvas->restore();
- };
-
- const char* vectorProg = R"(
- varying float3 vtx_vec;
- half4 main(float2 p) {
- return (vtx_vec * 0.5 + 0.5).rgb1;
- })";
-
- // raw, local vectors, normals, and positions should all look the same (no real transform)
- draw(50, 50, make_cone(Attr::Usage::kRaw, nullptr), vectorProg);
- draw(150, 50, make_cone(Attr::Usage::kVector, kLocalSpace), vectorProg);
- draw(250, 50, make_cone(Attr::Usage::kNormalVector, kLocalSpace), vectorProg);
- draw(350, 50, make_cone(Attr::Usage::kPosition, kLocalSpace), vectorProg);
-
- // world-space vectors and normals are rotated 90 degrees, positions are centered but scaled up
- draw(150, 150, make_cone(Attr::Usage::kVector, kWorldSpace), vectorProg);
- draw(250, 150, make_cone(Attr::Usage::kNormalVector, kWorldSpace), vectorProg);
- draw(350, 150, make_cone(Attr::Usage::kPosition, kWorldSpace), vectorProg);
-
- // Squished vectors are "wrong", but normals are correct (because we use the inverse transpose)
- // Positions remain scaled up (saturated), but otherwise correct
- draw(150, 250, make_cone(Attr::Usage::kVector, kWorldSpace), vectorProg, 0.5f);
- draw(250, 250, make_cone(Attr::Usage::kNormalVector, kWorldSpace), vectorProg, 0.5f);
- draw(350, 250, make_cone(Attr::Usage::kPosition, kWorldSpace), vectorProg, 0.5f);
-
- draw( 50, 350, make_cone(Attr::Usage::kVector, nullptr), vectorProg, 0.5f);
- draw(150, 350, make_cone(Attr::Usage::kNormalVector, nullptr), vectorProg, 0.5f);
-
- // For canvas-space positions, color them according to their position relative to the center.
- // We do this test twice, with and without saveLayer. That ensures that we get the canvas CTM,
- // not just a local-to-device matrix, which exposes effect authors to an implementation detail.
-
- const char* ctmPositionProg250 = R"(
- varying float3 vtx_pos;
- half4 main(float2 p) {
- return ((vtx_pos - float3(250, 350, 0)) / 50 + 0.5).rgb1;
- }
- )";
- draw(250, 350, make_cone(Attr::Usage::kPosition, nullptr), ctmPositionProg250, 0.5f);
-
- const char* ctmPositionProg350 = R"(
- varying float3 vtx_pos;
- half4 main(float2 p) {
- return ((vtx_pos - float3(350, 350, 0)) / 50 + 0.5).rgb1;
- }
- )";
- canvas->saveLayer({ 300, 300, 400, 400 }, nullptr);
- draw(350, 350, make_cone(Attr::Usage::kPosition, nullptr), ctmPositionProg350, 0.5f);
- canvas->restore();
-}
diff --git a/include/core/SkVertices.h b/include/core/SkVertices.h
index 7184dd2..fc53e9d 100644
--- a/include/core/SkVertices.h
+++ b/include/core/SkVertices.h
@@ -55,70 +55,6 @@
nullptr);
}
- static constexpr int kMaxCustomAttributes = 8;
-
- /**
- * EXPERIMENTAL - An SkVertices object can be constructed with a custom collection of vertex
- * attributes. Each attribute is described by a single Attribute struct. Type defines the CPU
- * type of the data. Usage determines what transformation (if any) is applied to that data in
- * the vertex shader. For positions or vectors, markerName identifies what matrix is used in
- * the vertex shader to transform the data. Those names should match a named transform on the
- * CTM stack, created by calling SkCanvas::markCTM().
- *
- * For attributes with a usage of kVector, kNormalVector, or kPosition, a null markerName
- * will transform the attribute by the canvas CTM matrix.
- */
- struct Attribute {
- enum class Type : uint8_t {
- kFloat,
- kFloat2,
- kFloat3,
- kFloat4,
- kByte4_unorm,
- };
-
- enum class Usage : uint8_t {
- // Raw values passed directly to effect
- kRaw,
-
- // sRGB unpremul colors, transformed to destination color space (3 or 4 channels)
- // Colors are always assumed to be in RGBA order, and are automatically premultiplied.
- kColor,
-
- // Local vector, transformed via marker (2 or 3 channels)
- kVector,
-
- // Normal vector (or any other bivector), transformed via marker (2 or 3 channels)
- kNormalVector,
-
- // Local position, transformed via marker (2 or 3 channels)
- kPosition,
- };
-
- /**
- * markerName is not copied by the Attribute, so it must outlive this struct.
- * It is copied when this Attribute is passed to the Builder constructor.
- */
- Attribute(Type t = Type::kFloat, Usage u = Usage::kRaw, const char* markerName = nullptr);
-
- bool operator==(const Attribute& that) const {
- return fType == that.fType && fUsage == that.fUsage && fMarkerID == that.fMarkerID;
- }
- bool operator!=(const Attribute& that) const { return !(*this == that); }
-
- // Number of channels that will be produced for the SkRuntimeEffect to consume.
- // May not match the number of channels in fType. For example, kVector Attributes always
- // produce three channels, even if the input is kFloat2.
- int channelCount() const;
- size_t bytesPerVertex() const;
- bool isValid() const;
-
- Type fType;
- Usage fUsage;
- uint32_t fMarkerID;
- const char* fMarkerName; // Preserved for serialization and debugging
- };
-
enum BuilderFlags {
kHasTexCoords_BuilderFlag = 1 << 0,
kHasColors_BuilderFlag = 1 << 1,
@@ -127,21 +63,11 @@
public:
Builder(VertexMode mode, int vertexCount, int indexCount, uint32_t flags);
- // EXPERIMENTAL -- do not call if you care what happens
- Builder(VertexMode mode,
- int vertexCount,
- int indexCount,
- const Attribute* attrs,
- int attrCount);
-
bool isValid() const { return fVertices != nullptr; }
SkPoint* positions();
uint16_t* indices(); // returns null if there are no indices
- // if we have texCoords or colors, this will always be null
- void* customData(); // returns null if there are no custom attributes
-
// If we have custom attributes, these will always be null
SkPoint* texCoords(); // returns null if there are no texCoords
SkColor* colors(); // returns null if there are no colors
@@ -190,17 +116,14 @@
uint32_t fUniqueID;
// these point inside our allocation, so none of these can be "freed"
- Attribute* fAttributes; // [attributeCount] or null
SkPoint* fPositions; // [vertexCount]
uint16_t* fIndices; // [indexCount] or null
- void* fCustomData; // [customDataSize * vertexCount] or null
SkPoint* fTexs; // [vertexCount] or null
SkColor* fColors; // [vertexCount] or null
SkRect fBounds; // computed to be the union of the fPositions[]
int fVertexCount;
int fIndexCount;
- int fAttributeCount;
VertexMode fMode;
// below here is where the actual array data is stored.
diff --git a/include/effects/SkRuntimeEffect.h b/include/effects/SkRuntimeEffect.h
index 90b6303..6e99faf 100644
--- a/include/effects/SkRuntimeEffect.h
+++ b/include/effects/SkRuntimeEffect.h
@@ -75,11 +75,6 @@
size_t sizeInBytes() const;
};
- struct Varying {
- SkString name;
- int width; // 1 - 4 (floats)
- };
-
struct Options {
// For testing purposes, completely disable the inliner. (Normally, Runtime Effects don't
// run the inliner directly, but they still get an inlining pass once they are painted.)
@@ -172,7 +167,6 @@
ConstIterable<Uniform> uniforms() const { return ConstIterable<Uniform>(fUniforms); }
ConstIterable<SkString> children() const { return ConstIterable<SkString>(fChildren); }
- ConstIterable<Varying> varyings() const { return ConstIterable<Varying>(fVaryings); }
// Returns pointer to the named uniform variable's description, or nullptr if not found
const Uniform* findUniform(const char* name) const;
@@ -204,7 +198,6 @@
std::vector<Uniform>&& uniforms,
std::vector<SkString>&& children,
std::vector<SkSL::SampleUsage>&& sampleUsages,
- std::vector<Varying>&& varyings,
uint32_t flags);
static Result Make(std::unique_ptr<SkSL::Program> program, SkSL::ProgramKind kind);
@@ -241,7 +234,6 @@
std::vector<Uniform> fUniforms;
std::vector<SkString> fChildren;
std::vector<SkSL::SampleUsage> fSampleUsages;
- std::vector<Varying> fVaryings;
SkOnce fColorFilterProgramOnce;
std::unique_ptr<skvm::Program> fColorFilterProgram;
diff --git a/include/private/SkSLModifiers.h b/include/private/SkSLModifiers.h
index 7582409..a5497b7 100644
--- a/include/private/SkSLModifiers.h
+++ b/include/private/SkSLModifiers.h
@@ -27,7 +27,7 @@
kFlat_Flag = 1 << 4,
kNoPerspective_Flag = 1 << 5,
kHasSideEffects_Flag = 1 << 6,
- kVarying_Flag = 1 << 7,
+
kInline_Flag = 1 << 8,
kNoInline_Flag = 1 << 9,
};
@@ -57,9 +57,6 @@
if (fFlags & kHasSideEffects_Flag) {
result += "sk_has_side_effects ";
}
- if (fFlags & kVarying_Flag) {
- result += "varying ";
- }
if (fFlags & kNoInline_Flag) {
result += "noinline ";
}
diff --git a/resources/sksl/errors/BadModifiers.sksl b/resources/sksl/errors/BadModifiers.sksl
index 8f056e7..17065e2 100644
--- a/resources/sksl/errors/BadModifiers.sksl
+++ b/resources/sksl/errors/BadModifiers.sksl
@@ -1,6 +1,6 @@
-const in out uniform flat noperspective sk_has_side_effects varying inline noinline void func1() {}
+const in out uniform flat noperspective sk_has_side_effects inline noinline void func1() {}
-void func2(const in out uniform flat noperspective sk_has_side_effects varying
+void func2(const in out uniform flat noperspective sk_has_side_effects
inline noinline float test) {}
-const in out uniform flat noperspective sk_has_side_effects varying inline noinline float var;
+const in out uniform flat noperspective sk_has_side_effects inline noinline float var;
diff --git a/resources/sksl/errors/ModifiersInStruct.sksl b/resources/sksl/errors/ModifiersInStruct.sksl
index cda500b..ba68d15 100644
--- a/resources/sksl/errors/ModifiersInStruct.sksl
+++ b/resources/sksl/errors/ModifiersInStruct.sksl
@@ -3,5 +3,5 @@
uniform int b;
flat half4 c;
noperspective float4 d;
- inout varying bool e;
+ inout bool e;
};
diff --git a/samplecode/Sample3D.cpp b/samplecode/Sample3D.cpp
index 575110a..89cd578 100644
--- a/samplecode/Sample3D.cpp
+++ b/samplecode/Sample3D.cpp
@@ -423,87 +423,6 @@
};
DEF_SAMPLE( return new SampleBump3D; )
-class SampleVerts3D : public SampleCubeBase {
- sk_sp<SkRuntimeEffect> fEffect;
- sk_sp<SkVertices> fVertices;
-
-public:
- SampleVerts3D() : SampleCubeBase(kShowLightDome) {}
-
- SkString name() override { return SkString("verts3d"); }
-
- void onOnceBeforeDraw() override {
- using Attr = SkVertices::Attribute;
- Attr attrs[] = {
- Attr(Attr::Type::kFloat3, Attr::Usage::kNormalVector),
- };
-
- SkVertices::Builder builder(SkVertices::kTriangleFan_VertexMode, 66, 0, attrs, 1);
-
- SkPoint* pos = builder.positions();
- SkV3* nrm = (SkV3*)builder.customData();
-
- SkPoint center = { 200, 200 };
- SkScalar radius = 200;
-
- pos[0] = center;
- nrm[0] = { 0, 0, 1 };
-
- for (int i = 0; i < 65; ++i) {
- SkScalar t = (i / 64.0f) * 2 * SK_ScalarPI;
- SkScalar s = SkScalarSin(t),
- c = SkScalarCos(t);
- pos[i + 1] = center + SkPoint { c * radius, s * radius };
- nrm[i + 1] = { c, s, 0 };
- }
-
- fVertices = builder.detach();
-
- const char code[] = R"(
- varying float3 vtx_normal;
-
- layout (marker=local_to_world) uniform float4x4 localToWorld;
- layout (marker=normals(local_to_world)) uniform float4x4 localToWorldAdjInv;
- uniform float3 lightPos;
-
- half4 main(float2 p) {
- float3 norm = normalize(vtx_normal);
- float3 plane_norm = normalize(localToWorldAdjInv * norm.xyz0).xyz;
-
- float3 plane_pos = (localToWorld * p.xy01).xyz;
- float3 light_dir = normalize(lightPos - plane_pos);
-
- float ambient = 0.2;
- float dp = dot(plane_norm, light_dir);
- float scale = min(ambient + max(dp, 0), 1);
-
- return half4(0.7, 0.9, 0.3, 1) * scale.xxx1;
- }
- )";
- auto [effect, error] = SkRuntimeEffect::Make(SkString(code));
- if (!effect) {
- SkDebugf("runtime error %s\n", error.c_str());
- }
- fEffect = effect;
- }
-
- void drawContent(SkCanvas* canvas, SkColor color, int index, bool drawFront) override {
- if (!drawFront || !front(canvas->getLocalToDevice())) {
- return;
- }
-
- SkRuntimeShaderBuilder builder(fEffect);
- builder.uniform("lightPos") = fLight.computeWorldPos(fSphere);
-
- SkPaint paint;
- paint.setColor(color);
- paint.setShader(builder.makeShader(nullptr, true));
-
- canvas->drawVertices(fVertices, paint);
- }
-};
-DEF_SAMPLE( return new SampleVerts3D; )
-
#include "modules/skottie/include/Skottie.h"
class SampleSkottieCube : public SampleCubeBase {
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index a3e9dad..d21c503 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -1799,27 +1799,6 @@
// We expect fans to be converted to triangles when building or deserializing SkVertices.
SkASSERT(vertices->priv().mode() != SkVertices::kTriangleFan_VertexMode);
- // If the vertices contain custom attributes, ensure they line up with the paint's shader.
- const SkRuntimeEffect* effect =
- paint.getShader() ? as_SB(paint.getShader())->asRuntimeEffect() : nullptr;
- if ((size_t)vertices->priv().attributeCount() != (effect ? effect->varyings().count() : 0)) {
- return;
- }
- if (effect) {
- int attrIndex = 0;
- for (const auto& v : effect->varyings()) {
- const SkVertices::Attribute& attr(vertices->priv().attributes()[attrIndex++]);
- // Mismatch between the SkSL varying and the vertex shader output for this attribute
- if (attr.channelCount() != v.width) {
- return;
- }
- // If we can't provide any of the asked-for matrices, we can't draw this
- if (attr.fMarkerID && !fMarkerStack->findMarker(attr.fMarkerID, nullptr)) {
- return;
- }
- }
- }
-
#ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
// Preserve legacy behavior for Android: ignore the SkShader if there are no texCoords present
if (paint.getShader() &&
diff --git a/src/core/SkDraw.h b/src/core/SkDraw.h
index f190f4c..8e7aaa3 100644
--- a/src/core/SkDraw.h
+++ b/src/core/SkDraw.h
@@ -128,8 +128,6 @@
void drawBitmapAsMask(const SkBitmap&, const SkSamplingOptions&, const SkPaint&) const;
void draw_fixed_vertices(const SkVertices*, SkBlendMode, const SkPaint&, const SkMatrix&,
const SkPoint dev2[], const SkPoint3 dev3[], SkArenaAlloc*) const;
- void draw_vdata_vertices(const SkVertices*, const SkPaint&, const SkMatrix&,
- const SkPoint[], const SkPoint3[], SkArenaAlloc*) const;
void drawPath(const SkPath&,
const SkPaint&,
diff --git a/src/core/SkDraw_vertices.cpp b/src/core/SkDraw_vertices.cpp
index fca9aad..f7ff3e4 100644
--- a/src/core/SkDraw_vertices.cpp
+++ b/src/core/SkDraw_vertices.cpp
@@ -268,7 +268,6 @@
const SkPoint dev2[], const SkPoint3 dev3[],
SkArenaAlloc* outerAlloc) const {
SkVerticesPriv info(vertices->priv());
- SkASSERT(!info.hasCustomData());
const int vertexCount = info.vertexCount();
const int indexCount = info.indexCount();
@@ -416,13 +415,6 @@
}
}
-void SkDraw::draw_vdata_vertices(const SkVertices* vt, const SkPaint& paint,
- const SkMatrix& ctmInv,
- const SkPoint dev2[], const SkPoint3 dev3[],
- SkArenaAlloc* outerAlloc) const {
- // TODO: Handle custom attributes
-}
-
void SkDraw::drawVertices(const SkVertices* vertices, SkBlendMode bmode,
const SkPaint& paint) const {
SkVerticesPriv info(vertices->priv());
@@ -467,9 +459,5 @@
}
}
- if (!info.hasCustomData()) {
- this->draw_fixed_vertices(vertices, bmode, paint, ctmInv, dev2, dev3, &outerAlloc);
- } else {
- this->draw_vdata_vertices(vertices, paint, ctmInv, dev2, dev3, &outerAlloc);
- }
+ this->draw_fixed_vertices(vertices, bmode, paint, ctmInv, dev2, dev3, &outerAlloc);
}
diff --git a/src/core/SkPicturePriv.h b/src/core/SkPicturePriv.h
index 4dc5bce..3f87424 100644
--- a/src/core/SkPicturePriv.h
+++ b/src/core/SkPicturePriv.h
@@ -106,10 +106,11 @@
kMatrixImageFilterSampling_Version = 83,
kImageFilterImageSampling_Version = 84,
kNoFilterQualityShaders_Version = 85,
+ kVerticesRemoveCustomData_Version = 86,
// Only SKPs within the min/current picture version range (inclusive) can be read.
kMin_Version = kEdgeAAQuadColor4f_Version,
- kCurrent_Version = kNoFilterQualityShaders_Version
+ kCurrent_Version = kVerticesRemoveCustomData_Version
};
static_assert(SkPicturePriv::kMin_Version <= SkPicturePriv::kCubicResamplerImageShader_Version,
diff --git a/src/core/SkRuntimeEffect.cpp b/src/core/SkRuntimeEffect.cpp
index fb8a614..b6055fc 100644
--- a/src/core/SkRuntimeEffect.cpp
+++ b/src/core/SkRuntimeEffect.cpp
@@ -209,7 +209,7 @@
// can sample children with matrices or explicit coords. Because the children are color filters,
// we know (by induction) that they don't use those coords, so we keep the overall invariant.
//
- // Further down, we also ensure that color filters can't use varyings or layout(marker), which
+ // Further down, we also ensure that color filters can't use layout(marker), which
// would allow them to change behavior based on the CTM.
// TODO(skbug.com/11813): When ProgramKind is always kRuntimeColorFilter or kRuntimeShader,
// this can be simpler. There is no way for color filters to refer to sk_FragCoord or sample
@@ -223,12 +223,11 @@
std::vector<Uniform> uniforms;
std::vector<SkString> children;
std::vector<SkSL::SampleUsage> sampleUsages;
- std::vector<Varying> varyings;
const SkSL::Context& ctx(compiler->context());
// Go through program elements, pulling out information that we need
for (const SkSL::ProgramElement* elem : program->elements()) {
- // Variables (uniform, varying, etc.)
+ // Variables (uniform, etc.)
if (elem->is<SkSL::GlobalVarDeclaration>()) {
const SkSL::GlobalVarDeclaration& global = elem->as<SkSL::GlobalVarDeclaration>();
const SkSL::VarDeclaration& varDecl = global.declaration()->as<SkSL::VarDeclaration>();
@@ -236,16 +235,8 @@
const SkSL::Variable& var = varDecl.var();
const SkSL::Type& varType = var.type();
- // Varyings (only used in conjunction with drawVertices)
- if (var.modifiers().fFlags & SkSL::Modifiers::kVarying_Flag) {
- flags &= ~kAllowColorFilter_Flag;
- varyings.push_back({var.name(),
- varType.typeKind() == SkSL::Type::TypeKind::kVector
- ? varType.columns()
- : 1});
- }
// Child effects that can be sampled ('shader' or 'colorFilter')
- else if (varType.isEffectChild()) {
+ if (varType.isEffectChild()) {
children.push_back(var.name());
sampleUsages.push_back(SkSL::Analysis::GetSampleUsage(
*program, var, sampleCoordsUsage.fWrite != 0));
@@ -300,7 +291,6 @@
std::move(uniforms),
std::move(children),
std::move(sampleUsages),
- std::move(varyings),
flags));
return Result{std::move(effect), SkString()};
}
@@ -404,7 +394,6 @@
std::vector<Uniform>&& uniforms,
std::vector<SkString>&& children,
std::vector<SkSL::SampleUsage>&& sampleUsages,
- std::vector<Varying>&& varyings,
uint32_t flags)
: fHash(SkGoodHash()(sksl))
, fSkSL(std::move(sksl))
@@ -413,7 +402,6 @@
, fUniforms(std::move(uniforms))
, fChildren(std::move(children))
, fSampleUsages(std::move(sampleUsages))
- , fVaryings(std::move(varyings))
, fFlags(flags) {
SkASSERT(fBaseProgram);
SkASSERT(fChildren.size() == fSampleUsages.size());
diff --git a/src/core/SkVertices.cpp b/src/core/SkVertices.cpp
index 8933c6a..972ccd8 100644
--- a/src/core/SkVertices.cpp
+++ b/src/core/SkVertices.cpp
@@ -29,107 +29,19 @@
return id;
}
-SkVertices::Attribute::Attribute(Type t, Usage u, const char* markerName)
- : fType(t)
- , fUsage(u)
- , fMarkerName(markerName) {
- fMarkerID = fMarkerName ? SkOpts::hash_fn(fMarkerName, strlen(fMarkerName), 0) : 0;
- SkASSERT(!fMarkerName || fMarkerID != 0);
-}
-
-int SkVertices::Attribute::channelCount() const {
- SkASSERT(this->isValid());
- switch (fUsage) {
- case Usage::kRaw: break;
- case Usage::kColor: return 4;
- case Usage::kVector: return 3;
- case Usage::kNormalVector: return 3;
- case Usage::kPosition: return 3;
- }
- switch (fType) {
- case Type::kFloat: return 1;
- case Type::kFloat2: return 2;
- case Type::kFloat3: return 3;
- case Type::kFloat4: return 4;
- case Type::kByte4_unorm: return 4;
- }
- SkUNREACHABLE;
-}
-
-size_t SkVertices::Attribute::bytesPerVertex() const {
- switch (fType) {
- case Type::kFloat: return 1 * sizeof(float);
- case Type::kFloat2: return 2 * sizeof(float);
- case Type::kFloat3: return 3 * sizeof(float);
- case Type::kFloat4: return 4 * sizeof(float);
- case Type::kByte4_unorm: return 4 * sizeof(uint8_t);
- }
- SkUNREACHABLE;
-}
-
-bool SkVertices::Attribute::isValid() const {
- if (fMarkerName && !SkCanvasPriv::ValidateMarker(fMarkerName)) {
- return false;
- }
- switch (fUsage) {
- case Usage::kRaw:
- return fMarkerID == 0;
- case Usage::kColor:
- return fMarkerID == 0 && (fType == Type::kFloat3 || fType == Type::kFloat4 ||
- fType == Type::kByte4_unorm);
- case Usage::kVector:
- case Usage::kNormalVector:
- case Usage::kPosition:
- return fType == Type::kFloat2 || fType == Type::kFloat3;
- }
- SkUNREACHABLE;
-}
-
-static size_t custom_data_size(const SkVertices::Attribute* attrs, int attrCount) {
- size_t size = 0;
- for (int i = 0; i < attrCount; ++i) {
- size += attrs[i].bytesPerVertex();
- }
- return size;
-}
-
struct SkVertices::Desc {
VertexMode fMode;
int fVertexCount,
fIndexCount;
bool fHasTexs,
fHasColors;
-
- const Attribute* fAttributes;
- int fAttributeCount;
-
- void validate() const {
- SkASSERT(fAttributeCount == 0 || (!fHasTexs && !fHasColors));
- }
};
struct SkVertices::Sizes {
Sizes(const Desc& desc) {
- desc.validate();
-
SkSafeMath safe;
- fNameSize = 0;
- for (int i = 0; i < desc.fAttributeCount; ++i) {
- const Attribute& attr(desc.fAttributes[i]);
- if (!attr.isValid()) {
- return;
- }
- if (attr.fMarkerName) {
- fNameSize = safe.add(fNameSize, strlen(attr.fMarkerName) + 1 /*null terminator*/);
- }
- }
- fNameSize = SkAlign4(fNameSize);
-
- fAttrSize = safe.mul(desc.fAttributeCount, sizeof(Attribute));
fVSize = safe.mul(desc.fVertexCount, sizeof(SkPoint));
- fDSize = safe.mul(custom_data_size(desc.fAttributes, desc.fAttributeCount),
- desc.fVertexCount);
fTSize = desc.fHasTexs ? safe.mul(desc.fVertexCount, sizeof(SkPoint)) : 0;
fCSize = desc.fHasColors ? safe.mul(desc.fVertexCount, sizeof(SkColor)) : 0;
@@ -157,16 +69,13 @@
}
fTotal = safe.add(sizeof(SkVertices),
- safe.add(fAttrSize,
- safe.add(fNameSize,
safe.add(fVSize,
- safe.add(fDSize,
safe.add(fTSize,
safe.add(fCSize,
- fISize)))))));
+ fISize))));
if (safe.ok()) {
- fArrays = fVSize + fDSize + fTSize + fCSize + fISize; // just the sum of the arrays
+ fArrays = fVSize + fTSize + fCSize + fISize; // just the sum of the arrays
} else {
sk_bzero(this, sizeof(*this));
}
@@ -175,11 +84,8 @@
bool isValid() const { return fTotal != 0; }
size_t fTotal = 0; // size of entire SkVertices allocation (obj + arrays)
- size_t fAttrSize; // size of attributes
- size_t fNameSize; // size of attribute marker names
size_t fArrays; // size of all the data arrays (V + D + T + C + I)
size_t fVSize;
- size_t fDSize; // size of all customData = [customDataSize * fVertexCount]
size_t fTSize;
size_t fCSize;
size_t fISize;
@@ -193,18 +99,7 @@
uint32_t builderFlags) {
bool hasTexs = SkToBool(builderFlags & SkVertices::kHasTexCoords_BuilderFlag);
bool hasColors = SkToBool(builderFlags & SkVertices::kHasColors_BuilderFlag);
- this->init({mode, vertexCount, indexCount, hasTexs, hasColors, nullptr, 0});
-}
-
-SkVertices::Builder::Builder(VertexMode mode,
- int vertexCount,
- int indexCount,
- const SkVertices::Attribute* attrs,
- int attrCount) {
- if (attrCount <= 0 || attrCount > kMaxCustomAttributes || !attrs) {
- return;
- }
- this->init({mode, vertexCount, indexCount, false, false, attrs, attrCount});
+ this->init({mode, vertexCount, indexCount, hasTexs, hasColors});
}
SkVertices::Builder::Builder(const Desc& desc) {
@@ -235,31 +130,13 @@
return new_ptr;
};
- fVertices->fAttributes = (Attribute*)advance(sizes.fAttrSize);
- char* markerNames = advance(sizes.fNameSize);
-
- // Copy the attributes into our block of memory (immediately after the SkVertices)
- sk_careful_memcpy(fVertices->fAttributes, desc.fAttributes,
- desc.fAttributeCount * sizeof(Attribute));
-
- // Now copy the marker names, and fix up the pointers in our attributes
- for (int i = 0; i < desc.fAttributeCount; ++i) {
- Attribute& attr(fVertices->fAttributes[i]);
- if (attr.fMarkerName) {
- attr.fMarkerName = strcpy(markerNames, attr.fMarkerName);
- markerNames += (strlen(markerNames) + 1 /*null terminator*/);
- }
- }
-
fVertices->fPositions = (SkPoint*) advance(sizes.fVSize);
- fVertices->fCustomData = (void*) advance(sizes.fDSize);
fVertices->fTexs = (SkPoint*) advance(sizes.fTSize);
fVertices->fColors = (SkColor*) advance(sizes.fCSize);
fVertices->fIndices = (uint16_t*)advance(sizes.fISize);
fVertices->fVertexCount = desc.fVertexCount;
fVertices->fIndexCount = desc.fIndexCount;
- fVertices->fAttributeCount = desc.fAttributeCount;
fVertices->fMode = desc.fMode;
// We defer assigning fBounds and fUniqueID until detach() is called
@@ -299,10 +176,6 @@
return fVertices ? const_cast<SkPoint*>(fVertices->fPositions) : nullptr;
}
-void* SkVertices::Builder::customData() {
- return fVertices ? const_cast<void*>(fVertices->fCustomData) : nullptr;
-}
-
SkPoint* SkVertices::Builder::texCoords() {
return fVertices ? const_cast<SkPoint*>(fVertices->fTexs) : nullptr;
}
@@ -327,7 +200,7 @@
const SkPoint pos[], const SkPoint texs[],
const SkColor colors[],
int indexCount, const uint16_t indices[]) {
- auto desc = Desc{mode, vertexCount, indexCount, !!texs, !!colors, nullptr, 0};
+ auto desc = Desc{mode, vertexCount, indexCount, !!texs, !!colors};
Builder builder(desc);
if (!builder.isValid()) {
return nullptr;
@@ -349,25 +222,11 @@
}
SkVertices::Sizes SkVertices::getSizes() const {
- Sizes sizes(
- {fMode, fVertexCount, fIndexCount, !!fTexs, !!fColors, fAttributes, fAttributeCount});
+ Sizes sizes({fMode, fVertexCount, fIndexCount, !!fTexs, !!fColors});
SkASSERT(sizes.isValid());
return sizes;
}
-size_t SkVerticesPriv::customDataSize() const {
- return custom_data_size(fVertices->fAttributes, fVertices->fAttributeCount);
-}
-
-bool SkVerticesPriv::hasUsage(SkVertices::Attribute::Usage u) const {
- for (int i = 0; i < fVertices->fAttributeCount; ++i) {
- if (fVertices->fAttributes[i].fUsage == u) {
- return true;
- }
- }
- return false;
-}
-
///////////////////////////////////////////////////////////////////////////////////////////////////
// storage = packed | vertex_count | index_count | attr_count
@@ -395,18 +254,9 @@
buffer.writeUInt(packed);
buffer.writeInt(fVertices->fVertexCount);
buffer.writeInt(fVertices->fIndexCount);
- buffer.writeInt(fVertices->fAttributeCount);
-
- // Attribute metadata
- for (int i = 0; i < fVertices->fAttributeCount; ++i) {
- buffer.writeInt(static_cast<int>(fVertices->fAttributes[i].fType));
- buffer.writeInt(static_cast<int>(fVertices->fAttributes[i].fUsage));
- buffer.writeString(fVertices->fAttributes[i].fMarkerName);
- }
// Data arrays
buffer.writeByteArray(fVertices->fPositions, sizes.fVSize);
- buffer.writeByteArray(fVertices->fCustomData, sizes.fDSize);
buffer.writeByteArray(fVertices->fTexs, sizes.fTSize);
buffer.writeByteArray(fVertices->fColors, sizes.fCSize);
// if index-count is odd, we won't be 4-bytes aligned, so we call the pad version
@@ -424,44 +274,24 @@
auto decode = [](SkReadBuffer& buffer) -> sk_sp<SkVertices> {
SkSafeRange safe;
+ bool hasCustomData = buffer.isVersionLT(SkPicturePriv::kVerticesRemoveCustomData_Version);
const uint32_t packed = buffer.readUInt();
const int vertexCount = safe.checkGE(buffer.readInt(), 0);
const int indexCount = safe.checkGE(buffer.readInt(), 0);
- const int attrCount = safe.checkGE(buffer.readInt(), 0);
+ const int attrCount = hasCustomData ? safe.checkGE(buffer.readInt(), 0) : 0;
const SkVertices::VertexMode mode = safe.checkLE<SkVertices::VertexMode>(
packed & kMode_Mask, SkVertices::kLast_VertexMode);
const bool hasTexs = SkToBool(packed & kHasTexs_Mask);
const bool hasColors = SkToBool(packed & kHasColors_Mask);
- if (!safe // Invalid header fields
- || attrCount > SkVertices::kMaxCustomAttributes // Too many custom attributes?
- || (attrCount > 0 && (hasTexs || hasColors))) { // Overspecified (incompatible features)
+ // Check that the header fields and buffer are valid. If this is data with the experimental
+ // custom attributes feature - we don't support that any more.
+ if (!safe || !buffer.isValid() || attrCount) {
return nullptr;
}
- SkVertices::Attribute attrs[SkVertices::kMaxCustomAttributes];
- SkString attrNames[SkVertices::kMaxCustomAttributes];
- for (int i = 0; i < attrCount; ++i) {
- auto type = buffer.checkRange(SkVertices::Attribute::Type::kFloat,
- SkVertices::Attribute::Type::kByte4_unorm);
- auto usage = buffer.checkRange(SkVertices::Attribute::Usage::kRaw,
- SkVertices::Attribute::Usage::kPosition);
- buffer.readString(&attrNames[i]);
- const char* markerName = attrNames[i].isEmpty() ? nullptr : attrNames[i].c_str();
- if (markerName && !SkCanvasPriv::ValidateMarker(markerName)) {
- return nullptr;
- }
- attrs[i] = SkVertices::Attribute(type, usage, markerName);
- }
-
- // Ensure that all of the attribute metadata was valid before proceeding
- if (!buffer.isValid()) {
- return nullptr;
- }
-
- const SkVertices::Desc desc{mode, vertexCount, indexCount, hasTexs, hasColors,
- attrCount ? attrs : nullptr, attrCount};
+ const SkVertices::Desc desc{mode, vertexCount, indexCount, hasTexs, hasColors};
SkVertices::Sizes sizes(desc);
if (!sizes.isValid()) {
return nullptr;
@@ -473,7 +303,13 @@
}
buffer.readByteArray(builder.positions(), sizes.fVSize);
- buffer.readByteArray(builder.customData(), sizes.fDSize);
+ if (hasCustomData) {
+ size_t customDataSize = 0;
+ buffer.skipByteArray(&customDataSize);
+ if (customDataSize != 0) {
+ return nullptr;
+ }
+ }
buffer.readByteArray(builder.texCoords(), sizes.fTSize);
buffer.readByteArray(builder.colors(), sizes.fCSize);
size_t isize = (mode == SkVertices::kTriangleFan_VertexMode) ? sizes.fBuilderTriFanISize
diff --git a/src/core/SkVerticesPriv.h b/src/core/SkVerticesPriv.h
index 73b1a31..3aa0411 100644
--- a/src/core/SkVerticesPriv.h
+++ b/src/core/SkVerticesPriv.h
@@ -22,24 +22,17 @@
public:
SkVertices::VertexMode mode() const { return fVertices->fMode; }
- bool hasCustomData() const { return SkToBool(fVertices->fCustomData); }
bool hasColors() const { return SkToBool(fVertices->fColors); }
bool hasTexCoords() const { return SkToBool(fVertices->fTexs); }
bool hasIndices() const { return SkToBool(fVertices->fIndices); }
- bool hasUsage(SkVertices::Attribute::Usage) const;
-
int vertexCount() const { return fVertices->fVertexCount; }
int indexCount() const { return fVertices->fIndexCount; }
- int attributeCount() const { return fVertices->fAttributeCount; }
- size_t customDataSize() const;
const SkPoint* positions() const { return fVertices->fPositions; }
- const void* customData() const { return fVertices->fCustomData; }
const SkPoint* texCoords() const { return fVertices->fTexs; }
const SkColor* colors() const { return fVertices->fColors; }
const uint16_t* indices() const { return fVertices->fIndices; }
- const SkVertices::Attribute* attributes() const { return fVertices->fAttributes; }
// Never called due to RVO in priv(), but must exist for MSVC 2017.
SkVerticesPriv(const SkVerticesPriv&) = default;
diff --git a/src/gpu/ops/GrDrawVerticesOp.cpp b/src/gpu/ops/GrDrawVerticesOp.cpp
index 4000a67..29ce6ed 100644
--- a/src/gpu/ops/GrDrawVerticesOp.cpp
+++ b/src/gpu/ops/GrDrawVerticesOp.cpp
@@ -37,76 +37,6 @@
kExplicit,
};
-static GrVertexAttribType SkVerticesAttributeToGrVertexAttribType(const SkVertices::Attribute& a) {
- switch (a.fType) {
- case SkVertices::Attribute::Type::kFloat: return kFloat_GrVertexAttribType;
- case SkVertices::Attribute::Type::kFloat2: return kFloat2_GrVertexAttribType;
- case SkVertices::Attribute::Type::kFloat3: return kFloat3_GrVertexAttribType;
- case SkVertices::Attribute::Type::kFloat4: return kFloat4_GrVertexAttribType;
- case SkVertices::Attribute::Type::kByte4_unorm: return kUByte4_norm_GrVertexAttribType;
- }
- SkUNREACHABLE;
-}
-
-static GrSLType SkVerticesAttributeToGrSLType(const SkVertices::Attribute& a) {
- switch (a.fType) {
- case SkVertices::Attribute::Type::kFloat: return kFloat_GrSLType;
- case SkVertices::Attribute::Type::kFloat2: return kFloat2_GrSLType;
- case SkVertices::Attribute::Type::kFloat3: return kFloat3_GrSLType;
- case SkVertices::Attribute::Type::kFloat4: return kFloat4_GrSLType;
- case SkVertices::Attribute::Type::kByte4_unorm: return kHalf4_GrSLType;
- }
- SkUNREACHABLE;
-}
-
-static bool AttributeUsesViewMatrix(const SkVertices::Attribute& attr) {
- return (attr.fMarkerID == 0) && (attr.fUsage == SkVertices::Attribute::Usage::kVector ||
- attr.fUsage == SkVertices::Attribute::Usage::kNormalVector ||
- attr.fUsage == SkVertices::Attribute::Usage::kPosition);
-}
-
-// Container for a collection of [uint32_t, Matrix] pairs. For a GrDrawVerticesOp whose custom
-// attributes reference some set of IDs, this stores the actual values of those matrices,
-// at the time the Op is created.
-class MarkedMatrices {
-public:
- // For each ID required by 'info', fetch the value of that matrix from 'matrixProvider'.
- // For vectors/normals/positions, we let ID 0 refer to the canvas CTM matrix.
- void gather(const SkVerticesPriv& info, const SkMatrixProvider& matrixProvider) {
- for (int i = 0; i < info.attributeCount(); ++i) {
- uint32_t id = info.attributes()[i].fMarkerID;
- if (id != 0 || AttributeUsesViewMatrix(info.attributes()[i])) {
- if (std::none_of(fMatrices.begin(), fMatrices.end(),
- [id](const auto& m) { return m.first == id; })) {
- SkM44 matrix;
- // SkCanvas should guarantee that this succeeds.
- SkAssertResult(matrixProvider.getLocalToMarker(id, &matrix));
- fMatrices.emplace_back(id, matrix);
- }
- }
- }
- }
-
- SkM44 get(uint32_t id) const {
- for (const auto& m : fMatrices) {
- if (m.first == id) {
- return m.second;
- }
- }
- SkASSERT(false);
- return SkM44{};
- }
-
- bool operator==(const MarkedMatrices& that) const { return fMatrices == that.fMatrices; }
- bool operator!=(const MarkedMatrices& that) const { return !(*this == that); }
-
-private:
- // If we expected many MarkerIDs, this should be a hash table. As it is, we're bounded by
- // SkVertices::kMaxCustomAttributes (which is 8). Realistically, we're never going to see
- // more than 1 or 2 unique MarkerIDs, so rely on linear search when inserting and fetching.
- std::vector<std::pair<uint32_t, SkM44>> fMatrices;
-};
-
class VerticesGP : public GrGeometryProcessor {
public:
static GrGeometryProcessor* Make(SkArenaAlloc* arena,
@@ -114,14 +44,10 @@
ColorArrayType colorArrayType,
const SkPMColor4f& color,
sk_sp<GrColorSpaceXform> colorSpaceXform,
- const SkMatrix& viewMatrix,
- const SkVertices::Attribute* attrs,
- int attrCount,
- const MarkedMatrices* customMatrices) {
+ const SkMatrix& viewMatrix) {
return arena->make([&](void* ptr) {
return new (ptr) VerticesGP(localCoordsType, colorArrayType, color,
- std::move(colorSpaceXform), viewMatrix, attrs, attrCount,
- customMatrices);
+ std::move(colorSpaceXform), viewMatrix);
});
}
@@ -192,111 +118,6 @@
: gp.positionAttr();
gpArgs->fLocalCoordVar = coordsAttr.asShaderVar();
- // Add varyings and globals for all custom attributes
- using Usage = SkVertices::Attribute::Usage;
- for (size_t i = kFirstCustomIndex; i < gp.fAttributes.size(); ++i) {
- const auto& attr(gp.fAttributes[i]);
- const int customIdx = i - kFirstCustomIndex;
- const auto& customAttr(gp.fCustomAttributes[customIdx]);
-
- GrSLType varyingType = attr.gpuType();
- SkString varyingIn(attr.name());
-
- UniformHandle matrixHandle;
- if (customAttr.fMarkerID || AttributeUsesViewMatrix(customAttr)) {
- bool normal = customAttr.fUsage == Usage::kNormalVector;
- for (const MarkedUniform& matrixUni : fCustomMatrixUniforms) {
- if (matrixUni.fID == customAttr.fMarkerID && matrixUni.fNormal == normal) {
- matrixHandle = matrixUni.fUniform;
- break;
- }
- }
- if (!matrixHandle.isValid()) {
- SkString uniName = SkStringPrintf("customMatrix_%x%s", customAttr.fMarkerID,
- normal ? "_IT" : "");
- matrixHandle = uniformHandler->addUniform(
- nullptr, kVertex_GrShaderFlag,
- normal ? kFloat3x3_GrSLType : kFloat4x4_GrSLType, uniName.c_str());
- fCustomMatrixUniforms.push_back(
- {customAttr.fMarkerID, normal, matrixHandle});
- }
- }
-
- switch (customAttr.fUsage) {
- case Usage::kRaw:
- break;
- case Usage::kColor: {
- // For RGB colors, expand to RGBA with A = 1
- if (attr.gpuType() == kFloat3_GrSLType) {
- varyingIn = SkStringPrintf("%s.rgb1", attr.name());
- }
- // Convert to half (as expected by the color space transform functions)
- varyingIn = SkStringPrintf("half4(%s)", varyingIn.c_str());
- // Transform to destination color space (possible no-op)
- SkString xformedColor;
- vertBuilder->appendColorGamutXform(&xformedColor, varyingIn.c_str(),
- &fColorSpaceHelper);
- // Store the result of the transform in a temporary
- vertBuilder->codeAppendf(
- "half4 _tmp_clr_%d = %s;", customIdx, xformedColor.c_str());
- // Finally, premultiply
- varyingIn = SkStringPrintf(
- "half4(_tmp_clr_%d.rgb * _tmp_clr_%d.a, _tmp_clr_%d.a)",
- customIdx, customIdx, customIdx);
- varyingType = kHalf4_GrSLType;
- break;
- }
- case Usage::kVector: {
- if (attr.gpuType() == kFloat2_GrSLType) {
- varyingIn = SkStringPrintf("%s.xy0", attr.name());
- }
- if (matrixHandle.isValid()) {
- varyingIn = SkStringPrintf("(%s * %s.xyz0).xyz",
- uniformHandler->getUniformCStr(matrixHandle),
- varyingIn.c_str());
- }
- varyingIn = SkStringPrintf("normalize(%s)", varyingIn.c_str());
- varyingType = kFloat3_GrSLType;
- break;
- }
- case Usage::kNormalVector: {
- if (attr.gpuType() == kFloat2_GrSLType) {
- varyingIn = SkStringPrintf("%s.xy0", attr.name());
- }
- if (matrixHandle.isValid()) {
- varyingIn = SkStringPrintf("(%s * %s)",
- uniformHandler->getUniformCStr(matrixHandle),
- varyingIn.c_str());
- }
- varyingIn = SkStringPrintf("normalize(%s)", varyingIn.c_str());
- varyingType = kFloat3_GrSLType;
- break;
- }
- case Usage::kPosition: {
- if (attr.gpuType() == kFloat2_GrSLType) {
- varyingIn = SkStringPrintf("%s.xy0", attr.name());
- }
- if (matrixHandle.isValid()) {
- vertBuilder->codeAppendf("float4 _tmp_pos_%d = %s * %s.xyz1;",
- customIdx,
- uniformHandler->getUniformCStr(matrixHandle),
- varyingIn.c_str());
- varyingIn = SkStringPrintf("_tmp_pos_%d.xyz / _tmp_pos_%d.w",
- customIdx, customIdx);
- }
- varyingType = kFloat3_GrSLType;
- }
- }
-
- GrGLSLVarying varying(varyingType);
- varyingHandler->addVarying(attr.name(), &varying);
- vertBuilder->codeAppendf("%s = %s;", varying.vsOut(), varyingIn.c_str());
-
- GrShaderVar var(SkStringPrintf("_vtx_attr_%d", customIdx), varyingType);
- fragBuilder->declareGlobal(var);
- fragBuilder->codeAppendf("%s = %s;", var.c_str(), varying.fsIn());
- }
-
fragBuilder->codeAppendf("const half4 %s = half4(1);", args.fOutputCoverage);
}
@@ -309,13 +130,6 @@
key |= ComputeMatrixKey(shaderCaps, vgp.viewMatrix()) << 20;
b->add32(key);
b->add32(GrColorSpaceXform::XformKey(vgp.fColorSpaceXform.get()));
-
- uint32_t usageBits = 0;
- for (int i = 0; i < vgp.fCustomAttributeCount; ++i) {
- b->add32(vgp.fCustomAttributes[i].fMarkerID);
- usageBits = (usageBits << 8) | (uint32_t)vgp.fCustomAttributes[i].fUsage;
- }
- b->add32(usageBits);
}
void setData(const GrGLSLProgramDataManager& pdman,
@@ -331,27 +145,6 @@
}
fColorSpaceHelper.setData(pdman, vgp.fColorSpaceXform.get());
-
- for (const auto& matrixUni : fCustomMatrixUniforms) {
- SkASSERT(matrixUni.fUniform.isValid());
- SkM44 mtx = vgp.fCustomMatrices->get(matrixUni.fID);
- if (matrixUni.fNormal) {
- // Get the upper-left 3x3 (rotation + scale):
- mtx.setCol(3, {0, 0, 0, 1});
- mtx.setRow(3, {0, 0, 0, 1});
- // Invert it...
- SkAssertResult(mtx.invert(&mtx));
- // We want the inverse transpose, but we're going to feed it as a 3x3 column
- // major matrix to the uniform. So copy the (not-yet-transposed) values out in
- // row order.
- float mtxIT[9] = {mtx.rc(0, 0), mtx.rc(0, 1), mtx.rc(0, 2),
- mtx.rc(1, 0), mtx.rc(1, 1), mtx.rc(1, 2),
- mtx.rc(2, 0), mtx.rc(2, 1), mtx.rc(2, 2)};
- pdman.setMatrix3f(matrixUni.fUniform, mtxIT);
- } else {
- pdman.setSkM44(matrixUni.fUniform, mtx);
- }
- }
}
private:
@@ -361,13 +154,6 @@
UniformHandle fColorUniform;
GrGLSLColorSpaceXformHelper fColorSpaceHelper;
- struct MarkedUniform {
- uint32_t fID;
- bool fNormal;
- UniformHandle fUniform;
- };
- std::vector<MarkedUniform> fCustomMatrixUniforms;
-
using INHERITED = GrGLSLGeometryProcessor;
};
@@ -384,18 +170,12 @@
ColorArrayType colorArrayType,
const SkPMColor4f& color,
sk_sp<GrColorSpaceXform> colorSpaceXform,
- const SkMatrix& viewMatrix,
- const SkVertices::Attribute* attrs,
- int attrCount,
- const MarkedMatrices* customMatrices)
+ const SkMatrix& viewMatrix)
: INHERITED(kVerticesGP_ClassID)
, fColorArrayType(colorArrayType)
, fColor(color)
, fViewMatrix(viewMatrix)
- , fColorSpaceXform(std::move(colorSpaceXform))
- , fCustomAttributes(attrs)
- , fCustomAttributeCount(attrCount)
- , fCustomMatrices(customMatrices) {
+ , fColorSpaceXform(std::move(colorSpaceXform)) {
constexpr Attribute missingAttr;
fAttributes.push_back({"position", kFloat2_GrVertexAttribType, kFloat2_GrSLType});
fAttributes.push_back(fColorArrayType != ColorArrayType::kUnused
@@ -405,14 +185,6 @@
? Attribute{"inLocalCoord", kFloat2_GrVertexAttribType, kFloat2_GrSLType}
: missingAttr);
- for (int i = 0; i < attrCount; ++i) {
- // Attributes store char*, so allocate long-lived storage for the (dynamic) names
- fAttrNames.push_back(SkStringPrintf("_vtx_attr%d", i));
- fAttributes.push_back({fAttrNames.back().c_str(),
- SkVerticesAttributeToGrVertexAttribType(attrs[i]),
- SkVerticesAttributeToGrSLType(attrs[i])});
- }
-
this->setVertexAttributes(fAttributes.data(), fAttributes.size());
}
@@ -420,20 +192,14 @@
kPositionIndex = 0,
kColorIndex = 1,
kLocalCoordsIndex = 2,
- kFirstCustomIndex = 3,
};
- std::vector<SkString> fAttrNames;
std::vector<Attribute> fAttributes;
ColorArrayType fColorArrayType;
SkPMColor4f fColor;
SkMatrix fViewMatrix;
sk_sp<GrColorSpaceXform> fColorSpaceXform;
- const SkVertices::Attribute* fCustomAttributes;
- int fCustomAttributeCount;
- const MarkedMatrices* fCustomMatrices;
-
using INHERITED = GrGeometryProcessor;
};
@@ -518,8 +284,7 @@
size_t vertexStride() const {
return sizeof(SkPoint) +
(this->requiresPerVertexColors() ? sizeof(uint32_t) : 0) +
- (this->requiresPerVertexLocalCoords() ? sizeof(SkPoint) : 0) +
- fMeshes[0].fVertices->priv().customDataSize();
+ (this->requiresPerVertexLocalCoords() ? sizeof(SkPoint) : 0);
}
Helper fHelper;
@@ -533,7 +298,6 @@
LocalCoordsType fLocalCoordsType;
ColorArrayType fColorArrayType;
sk_sp<GrColorSpaceXform> fColorSpaceXform;
- MarkedMatrices fCustomMatrices;
GrSimpleMesh* fMesh = nullptr;
GrProgramInfo* fProgramInfo = nullptr;
@@ -564,7 +328,6 @@
: ColorArrayType::kUnused;
fLocalCoordsType = info.hasTexCoords() ? LocalCoordsType::kExplicit
: LocalCoordsType::kUsePosition;
- fCustomMatrices.gather(info, matrixProvider);
Mesh& mesh = fMeshes.push_back();
mesh.fColor = color;
@@ -621,16 +384,11 @@
GrGeometryProcessor* DrawVerticesOp::makeGP(SkArenaAlloc* arena) {
const SkMatrix& vm = fMultipleViewMatrices ? SkMatrix::I() : fMeshes[0].fViewMatrix;
- SkVerticesPriv info(fMeshes[0].fVertices->priv());
-
- sk_sp<GrColorSpaceXform> csxform = (fColorArrayType == ColorArrayType::kSkColor ||
- info.hasUsage(SkVertices::Attribute::Usage::kColor))
- ? fColorSpaceXform
- : nullptr;
+ sk_sp<GrColorSpaceXform> csxform =
+ (fColorArrayType == ColorArrayType::kSkColor) ? fColorSpaceXform : nullptr;
auto gp = VerticesGP::Make(arena, fLocalCoordsType, fColorArrayType, fMeshes[0].fColor,
- std::move(csxform), vm, info.attributes(), info.attributeCount(),
- &fCustomMatrices);
+ std::move(csxform), vm);
SkASSERT(this->vertexStride() == gp->vertexStride());
return gp;
}
@@ -692,8 +450,6 @@
const SkPoint* positions = info.positions();
const SkColor* colors = info.colors();
const SkPoint* localCoords = info.texCoords() ? info.texCoords() : positions;
- const void* custom = info.customData();
- size_t customDataSize = info.customDataSize();
// TODO4F: Preserve float colors
GrColor meshColor = mesh.fColor.toBytes_RGBA();
@@ -708,10 +464,6 @@
if (hasLocalCoordsAttribute) {
verts.write(localCoords[i]);
}
- if (customDataSize) {
- verts.writeRaw(custom, customDataSize);
- custom = SkTAddOffset<const void>(custom, customDataSize);
- }
}
if (fMultipleViewMatrices) {
@@ -767,19 +519,6 @@
return CombineResult::kCannotCombine;
}
- SkVerticesPriv vThis(this->fMeshes[0].fVertices->priv()),
- vThat(that->fMeshes[0].fVertices->priv());
- if (vThis.attributeCount() != vThat.attributeCount() ||
- !std::equal(vThis.attributes(), vThis.attributes() + vThis.attributeCount(),
- vThat.attributes())) {
- return CombineResult::kCannotCombine;
- }
-
- // We can't batch draws if any of the custom matrices have changed.
- if (this->fCustomMatrices != that->fCustomMatrices) {
- return CombineResult::kCannotCombine;
- }
-
// We can't mix draws that use SkColor vertex colors with those that don't. We can mix uniform
// color draws with GrColor draws (by expanding the uniform color into vertex color).
if ((fColorArrayType == ColorArrayType::kSkColor) !=
diff --git a/src/sksl/SkSLAnalysis.cpp b/src/sksl/SkSLAnalysis.cpp
index 23384a0..2a079f3 100644
--- a/src/sksl/SkSLAnalysis.cpp
+++ b/src/sksl/SkSLAnalysis.cpp
@@ -326,8 +326,7 @@
case Expression::Kind::kVariableReference: {
VariableReference& varRef = expr.as<VariableReference>();
const Variable* var = varRef.variable();
- if (var->modifiers().fFlags & (Modifiers::kConst_Flag | Modifiers::kUniform_Flag |
- Modifiers::kVarying_Flag)) {
+ if (var->modifiers().fFlags & (Modifiers::kConst_Flag | Modifiers::kUniform_Flag)) {
fErrors->error(expr.fOffset,
"cannot modify immutable variable '" + var->name() + "'");
} else {
@@ -641,8 +640,8 @@
const Modifiers& modifiers = v.modifiers();
VariableCounts counts = this->get(v);
if ((v.storage() != Variable::Storage::kLocal && counts.fRead) ||
- (modifiers.fFlags & (Modifiers::kIn_Flag | Modifiers::kOut_Flag | Modifiers::kUniform_Flag |
- Modifiers::kVarying_Flag))) {
+ (modifiers.fFlags &
+ (Modifiers::kIn_Flag | Modifiers::kOut_Flag | Modifiers::kUniform_Flag))) {
return false;
}
// Consider the variable dead if it's never read and never written (besides the initial-value).
diff --git a/src/sksl/SkSLIRGenerator.cpp b/src/sksl/SkSLIRGenerator.cpp
index d4f7845..33f480d 100644
--- a/src/sksl/SkSLIRGenerator.cpp
+++ b/src/sksl/SkSLIRGenerator.cpp
@@ -344,21 +344,10 @@
"float3, or float4 variables");
}
}
- if (modifiers.fFlags & Modifiers::kVarying_Flag) {
- if (this->programKind() != ProgramKind::kRuntimeEffect &&
- this->programKind() != ProgramKind::kRuntimeShader) {
- this->errorReporter().error(offset, "'varying' is only permitted in runtime shaders");
- }
- if (!baseType->isFloat() &&
- !(baseType->isVector() && baseType->componentType().isFloat())) {
- this->errorReporter().error(offset, "'varying' must be float scalar or vector");
- }
- }
int permitted = Modifiers::kConst_Flag;
if (storage == Variable::Storage::kGlobal) {
permitted |= Modifiers::kIn_Flag | Modifiers::kOut_Flag | Modifiers::kUniform_Flag |
- Modifiers::kFlat_Flag | Modifiers::kVarying_Flag |
- Modifiers::kNoPerspective_Flag;
+ Modifiers::kFlat_Flag | Modifiers::kNoPerspective_Flag;
}
// TODO(skbug.com/11301): Migrate above checks into building a mask of permitted layout flags
this->checkModifiers(offset, modifiers, permitted, /*permittedLayoutFlags=*/~0);
@@ -845,7 +834,6 @@
checkModifier(Modifiers::kFlat_Flag, "flat");
checkModifier(Modifiers::kNoPerspective_Flag, "noperspective");
checkModifier(Modifiers::kHasSideEffects_Flag, "sk_has_side_effects");
- checkModifier(Modifiers::kVarying_Flag, "varying");
checkModifier(Modifiers::kInline_Flag, "inline");
checkModifier(Modifiers::kNoInline_Flag, "noinline");
SkASSERT(flags == 0);
diff --git a/src/sksl/SkSLLexer.cpp b/src/sksl/SkSLLexer.cpp
index 60d2dca..8bb7bcd 100644
--- a/src/sksl/SkSLLexer.cpp
+++ b/src/sksl/SkSLLexer.cpp
@@ -18,74 +18,74 @@
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 4, 3, 5, 6, 7, 8, 3, 9, 10, 11, 12,
13, 14, 15, 16, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 20, 21, 22, 23, 24, 25, 26,
26, 26, 26, 27, 26, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 28, 3, 29, 30, 31, 3, 32, 33, 34, 35, 36, 37, 38, 39, 40, 6, 41, 42, 43,
- 44, 45, 46, 6, 47, 48, 49, 50, 51, 52, 53, 54, 6, 55, 56, 57, 58};
-static State transitions[59][239] = {
+ 6, 6, 6, 28, 3, 29, 30, 31, 3, 32, 33, 34, 35, 36, 37, 6, 38, 39, 6, 40, 41, 42,
+ 43, 44, 45, 6, 46, 47, 48, 49, 50, 51, 52, 53, 6, 54, 55, 56, 57};
+static State transitions[58][232] = {
{
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
},
{
- 0, 2, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 2, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
},
{
- 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
},
{
- 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
},
{
- 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
},
{
- 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
},
{
0, 9, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -99,64 +99,62 @@
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
+ 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
},
{
- 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
},
{
- 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
},
{
- 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
},
{
- 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
},
{
- 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 35, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 34, 35, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
},
{
0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0,
@@ -168,18 +166,18 @@
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
},
{
- 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
},
{
0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -191,31 +189,29 @@
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
},
{
- 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0,
- 40, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0,
+ 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
},
{
- 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 34, 36, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 37, 34, 36, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
},
{
0, 39, 0, 0, 0, 0, 0, 0, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -229,7 +225,7 @@
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
+ 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
},
{
0, 54, 0, 0, 0, 0, 0, 0, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -243,87 +239,85 @@
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
+ 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
},
{
- 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
},
{
- 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
},
{
- 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
},
{
- 0, 62, 0, 0, 0, 6, 0, 0, 0, 0, 0, 12, 0, 15, 0, 0, 0, 0, 19, 0, 22, 0, 0, 0,
- 26, 0, 0, 0, 0, 0, 0, 0, 0, 38, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 60, 0, 0, 63, 0, 65, 0, 67, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, 0, 0,
+ 0, 62, 0, 0, 0, 6, 0, 0, 0, 0, 0, 12, 0, 15, 0, 0, 0, 0, 19, 0, 22, 0, 0, 0,
+ 26, 0, 0, 0, 0, 0, 0, 0, 0, 38, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 60, 0, 0, 63, 0, 65, 0, 67, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0,
},
{
- 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
},
{
- 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
},
{
- 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
},
{
0, 9, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -337,7 +331,7 @@
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
+ 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
},
{
0, 9, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -351,41 +345,40 @@
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
+ 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
},
{
- 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
},
{
- 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
},
{
- 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
},
{
0, 9, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -399,22 +392,21 @@
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 183, 10, 10, 10, 187, 10, 10, 10, 10, 192, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
+ 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
},
{
- 0, 9, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 53, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 70, 70, 70, 70, 70, 70,
- 70, 70, 70, 0, 0, 0, 0, 0, 10, 10, 87, 10, 10, 90, 10, 10, 10, 94, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 109, 10, 10, 10, 10, 10,
- 10, 116, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 128, 10, 10, 10, 10, 133,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 148, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 185, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 222, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
+ 0, 9, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 53, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 0,
+ 0, 0, 0, 0, 10, 10, 87, 10, 10, 90, 10, 10, 10, 94, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 109, 10, 10, 10, 10, 10, 10, 116, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 128, 10, 10, 10, 10, 133, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 148, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 185, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
},
{
0, 84, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -428,7 +420,7 @@
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
+ 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
},
{
0, 89, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -442,7 +434,7 @@
10, 10, 10, 10, 10, 10, 167, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 197, 10, 10, 10,
10, 10, 203, 10, 10, 10, 10, 208, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
+ 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
},
{
0, 106, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -456,7 +448,7 @@
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 190, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
+ 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
},
{
0, 120, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0,
@@ -471,66 +463,51 @@
10, 10, 10, 166, 10, 10, 10, 10, 171, 10, 10, 10, 10, 176, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 191, 10, 193, 10, 10, 196, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 213, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 232, 10, 0,
- 0, 0, 0, 0, 0,
+ 10, 10, 10, 10, 10, 10, 10, 10, 225, 10, 0, 0, 0, 0, 0, 0,
},
{
- 0, 127, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 53, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 70, 72, 70, 70, 70, 70,
- 70, 70, 70, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 108, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 138, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 194, 195, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 217, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
+ 0, 127, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34,
+ 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 53,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 70, 72,
+ 70, 70, 70, 70, 70, 70, 70, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 108,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 138, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 194, 195, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 217, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
},
{
- 0, 9, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 0,
- 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 227, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
+ 0, 9, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 70, 70, 70, 70, 70, 70, 70, 78, 70, 0,
+ 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 184, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 209, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 222, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
},
{
- 0, 9, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 70, 70, 70, 70, 70, 70, 70, 78, 70, 0,
- 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 184, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 209, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 229, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
- },
- {
- 0, 137, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 70, 70, 70, 70, 75, 70,
- 70, 70, 70, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 102, 10, 10, 10, 10, 113, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 141, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 155, 10, 10, 158, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 169, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 189, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 206, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 216, 10, 10, 10, 10, 10, 10, 10, 10, 225, 10, 10, 10,
- 10, 230, 10, 10, 10, 0, 0, 0, 0, 0, 0,
+ 0, 137, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34,
+ 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 70, 70,
+ 70, 70, 75, 70, 70, 70, 70, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 102, 10, 10, 10, 10, 113, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 141, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 155, 10, 10, 158, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 169, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 189, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 206, 10, 10, 10, 10, 10, 10, 10, 10, 10, 216,
+ 10, 10, 10, 10, 10, 10, 223, 10, 10, 10, 0, 0, 0, 0, 0, 0,
},
{
0, 9, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -544,22 +521,22 @@
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 182, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
+ 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
},
{
- 0, 147, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 70, 70, 70, 70, 70, 70,
- 70, 70, 70, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 93, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 111, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 121, 10, 10, 10, 10, 10, 10, 132, 129, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 140, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 157, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 231, 10, 10, 0, 0, 0, 0, 0, 0,
+ 0, 147, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34,
+ 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 70, 70,
+ 70, 70, 70, 70, 70, 70, 70, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 93,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 111, 10, 10, 10, 10, 10, 10, 10, 10, 10, 121, 10, 10, 10, 10, 10,
+ 10, 132, 129, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 140, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 157, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 224, 10, 10, 0, 0, 0, 0, 0, 0,
},
{
0, 9, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -573,37 +550,37 @@
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 220,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
+ 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
},
{
- 0, 153, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 70, 70, 70, 70, 70, 70,
- 70, 70, 70, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 98, 10, 10, 10, 10, 103, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 124, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 139, 10, 10, 10, 142, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 156, 10, 10, 159, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 180, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 215, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 226, 10, 10,
- 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
+ 0, 153, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34,
+ 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 70, 70,
+ 70, 70, 70, 70, 70, 70, 70, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 98, 10, 10, 10, 10, 103, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 124, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 139, 10, 10, 10, 142, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 156, 10, 10, 159, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 180,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 215, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
},
{
- 0, 172, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 70, 70, 70, 70, 70, 70,
- 70, 70, 70, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 97, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 119, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 135, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 144, 10, 10, 10, 10, 10, 10, 10, 10, 10, 150, 10, 10,
- 10, 154, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 218, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
+ 0, 172, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34,
+ 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 70, 70,
+ 70, 70, 70, 70, 70, 70, 70, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 97,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 119, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 135, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 144, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 150, 10, 10, 10, 154, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 218, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
},
{
0, 9, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -617,37 +594,37 @@
10, 10, 10, 10, 165, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
+ 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
},
{
- 0, 175, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 70, 70, 70, 70, 70, 70,
- 70, 70, 70, 0, 0, 0, 0, 0, 85, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 117, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 136, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 163, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 179, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 201, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 211, 10, 10, 10, 10, 10, 10, 10, 219, 10, 10, 10, 223, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
+ 0, 175, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34,
+ 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 70, 70,
+ 70, 70, 70, 70, 70, 70, 70, 0, 0, 0, 0, 0, 85, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 117, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 136, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 163, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 179, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 201, 10, 10, 10, 10, 10, 10, 10, 10, 10, 211, 10, 10, 10, 10, 10,
+ 10, 10, 219, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
},
{
- 0, 181, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 70, 70, 70, 70, 70, 70,
- 70, 70, 70, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 91, 10, 10, 10, 95,
- 96, 10, 10, 99, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 114,
- 10, 10, 10, 10, 10, 10, 10, 122, 10, 10, 10, 10, 10, 10, 10, 130, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 164, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 186, 10, 188, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 199, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
+ 0, 181, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34,
+ 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 70, 70,
+ 70, 70, 70, 70, 70, 70, 70, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10,
+ 91, 10, 10, 10, 95, 96, 10, 10, 99, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 114, 10, 10, 10, 10, 10, 10, 10, 122, 10, 10, 10, 10,
+ 10, 10, 10, 130, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 164, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 186, 10, 188, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 199, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
},
{
0, 210, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0,
@@ -662,40 +639,39 @@
10, 10, 10, 10, 10, 168, 10, 10, 10, 10, 10, 174, 10, 10, 177, 10, 10, 10,
10, 200, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 198,
10, 10, 10, 10, 10, 204, 10, 10, 207, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0,
- 0, 0, 0, 0, 0,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
},
{
- 0, 214, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 70, 70, 70, 70, 70, 70,
- 70, 70, 70, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 104, 10, 10, 10, 10, 10, 110, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 125, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 145, 10, 10, 10, 10, 10, 151, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 173, 10, 10, 10, 10, 178, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 202, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 212, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
+ 0, 214, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34,
+ 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 70, 70,
+ 70, 70, 70, 70, 70, 70, 70, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 104, 10, 10, 10, 10,
+ 10, 110, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 125, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 145, 10, 10, 10, 10, 10, 151, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 173, 10, 10, 10, 10, 178, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 202, 10, 10, 10, 10, 10, 10, 10, 10, 10, 212, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
},
{
- 0, 221, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 0,
- 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 170, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
+ 0, 9, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 0,
+ 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 170, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
},
{
- 0, 228, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 221, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 70, 70, 70, 74, 70, 70, 70, 70, 70, 0,
@@ -706,7 +682,7 @@
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 205, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
+ 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
},
{
0, 9, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -720,84 +696,80 @@
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
+ 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
},
{
- 0, 9, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 0,
- 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 149, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 224, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
+ 0, 9, 0, 0, 0, 0, 0, 8, 8, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 0,
+ 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 149, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0,
},
{
- 0, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
},
{
- 0, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0,
+ 0, 227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 229, 0, 0, 0, 0,
},
{
- 0, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
},
{
- 0, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
},
};
-static int8_t accepts[239] = {
- -1, -1, 84, 84, 87, 61, 67, 87, 35, 34, 34, 51, 76, 56, 60, 81, 37, 38, 49, 74, 47, 45,
- 72, 44, 48, 46, 73, 83, 43, 1, -1, -1, 1, 50, -1, -1, 86, 85, 75, 2, 1, 1, -1, -1,
- 1, -1, -1, 1, 2, -1, -1, 1, -1, 2, 2, 64, 63, 82, 69, 52, 77, 71, 65, 66, 68, 70,
- 53, 78, 62, 87, 36, 36, 6, 36, 36, 36, 36, 36, 12, 41, 42, 55, 80, 59, 34, 34, 34, 34,
- 15, 34, 34, 34, 13, 34, 34, 34, 33, 34, 34, 34, 23, 34, 34, 34, 34, 16, 34, 34, 34, 34,
- 34, 34, 14, 34, 34, 34, 34, 34, 17, 10, 34, 34, 34, 7, 34, 34, 32, 34, 34, 34, 34, 4,
- 34, 34, 24, 34, 8, 34, 5, 19, 34, 34, 34, 26, 34, 34, 21, 34, 34, 34, 34, 34, 31, 34,
- 34, 34, 34, 34, 34, 34, 27, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 25, 34, 34, 20, 34,
- 34, 34, 34, 34, 18, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
- 34, 28, 34, 34, 34, 34, 30, 34, 34, 34, 34, 11, 34, 34, 34, 3, 34, 34, 34, 34, 34, 34,
- 22, 34, 34, 34, 34, 34, 34, 29, 34, 34, 34, 34, 9, 39, 54, 79, 58, 40, 57,
+static int8_t accepts[232] = {
+ -1, -1, 83, 83, 86, 60, 66, 86, 34, 33, 33, 50, 75, 55, 59, 80, 36, 37, 48, 73, 46, 44,
+ 71, 43, 47, 45, 72, 82, 42, 1, -1, -1, 1, 49, -1, -1, 85, 84, 74, 2, 1, 1, -1, -1,
+ 1, -1, -1, 1, 2, -1, -1, 1, -1, 2, 2, 63, 62, 81, 68, 51, 76, 70, 64, 65, 67, 69,
+ 52, 77, 61, 86, 35, 35, 6, 35, 35, 35, 35, 35, 12, 40, 41, 54, 79, 58, 33, 33, 33, 33,
+ 15, 33, 33, 33, 13, 33, 33, 33, 32, 33, 33, 33, 23, 33, 33, 33, 33, 16, 33, 33, 33, 33,
+ 33, 33, 14, 33, 33, 33, 33, 33, 17, 10, 33, 33, 33, 7, 33, 33, 31, 33, 33, 33, 33, 4,
+ 33, 33, 24, 33, 8, 33, 5, 19, 33, 33, 33, 26, 33, 33, 21, 33, 33, 33, 33, 33, 30, 33,
+ 33, 33, 33, 33, 33, 33, 27, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 25, 33, 33, 20, 33,
+ 33, 33, 33, 33, 18, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 28, 33, 33, 33, 33, 29, 33, 33, 33, 33, 11, 33, 33, 33, 3, 33, 33, 33, 33, 33, 33,
+ 22, 33, 33, 33, 33, 9, 38, 53, 78, 57, 39, 56,
};
Token Lexer::next() {
diff --git a/src/sksl/SkSLLexer.h b/src/sksl/SkSLLexer.h
index 43b0a7d..e7a1168 100644
--- a/src/sksl/SkSLLexer.h
+++ b/src/sksl/SkSLLexer.h
@@ -44,7 +44,6 @@
TK_INLINE,
TK_NOINLINE,
TK_HASSIDEEFFECTS,
- TK_VARYING,
TK_STRUCT,
TK_LAYOUT,
TK_ENUM,
diff --git a/src/sksl/SkSLParser.cpp b/src/sksl/SkSLParser.cpp
index f148cf6..5b74a1d 100644
--- a/src/sksl/SkSLParser.cpp
+++ b/src/sksl/SkSLParser.cpp
@@ -50,7 +50,6 @@
case Token::Kind::TK_FLAT: return Modifiers::kFlat_Flag;
case Token::Kind::TK_NOPERSPECTIVE: return Modifiers::kNoPerspective_Flag;
case Token::Kind::TK_HASSIDEEFFECTS: return Modifiers::kHasSideEffects_Flag;
- case Token::Kind::TK_VARYING: return Modifiers::kVarying_Flag;
case Token::Kind::TK_INLINE: return Modifiers::kInline_Flag;
case Token::Kind::TK_NOINLINE: return Modifiers::kNoInline_Flag;
default: return 0;
@@ -1023,8 +1022,7 @@
primitive, maxVertices, invocations, marker, when, ctype);
}
-/* layout? (UNIFORM | CONST | IN | OUT | INOUT | LOWP | MEDIUMP | HIGHP | FLAT | NOPERSPECTIVE |
- VARYING | INLINE)* */
+/* layout? (UNIFORM | CONST | IN | OUT | INOUT | FLAT | NOPERSPECTIVE | INLINE)* */
Modifiers Parser::modifiers() {
Layout layout = this->layout();
int flags = 0;
diff --git a/src/sksl/codegen/SkSLPipelineStageCodeGenerator.cpp b/src/sksl/codegen/SkSLPipelineStageCodeGenerator.cpp
index b346b12..8308cb6 100644
--- a/src/sksl/codegen/SkSLPipelineStageCodeGenerator.cpp
+++ b/src/sksl/codegen/SkSLPipelineStageCodeGenerator.cpp
@@ -211,41 +211,11 @@
return;
}
- auto varIndexByFlag = [this, &ref](uint32_t flag) {
- int index = 0;
- bool found = false;
- for (const ProgramElement* e : fProgram.elements()) {
- if (found) {
- break;
- }
- if (e->is<GlobalVarDeclaration>()) {
- const GlobalVarDeclaration& global = e->as<GlobalVarDeclaration>();
- const Variable& var = global.declaration()->as<VarDeclaration>().var();
- if (&var == ref.variable()) {
- found = true;
- break;
- }
- // Skip over children (shaders/colorFilters). These are indexed separately from
- // other globals.
- if ((var.modifiers().fFlags & flag) && !var.type().isEffectChild()) {
- ++index;
- }
- }
- }
- SkASSERT(found);
- return index;
- };
-
- if (modifiers.fFlags & Modifiers::kVarying_Flag) {
- this->write("_vtx_attr_");
- this->write(to_string(varIndexByFlag(Modifiers::kVarying_Flag)));
+ auto it = fVariableNames.find(var);
+ if (it != fVariableNames.end()) {
+ this->write(it->second);
} else {
- auto it = fVariableNames.find(var);
- if (it != fVariableNames.end()) {
- this->write(it->second);
- } else {
- this->write(var->name());
- }
+ this->write(var->name());
}
}
diff --git a/src/sksl/generated/sksl_gpu.dehydrated.sksl b/src/sksl/generated/sksl_gpu.dehydrated.sksl
index 2f0ccb4..27a15ee 100644
--- a/src/sksl/generated/sksl_gpu.dehydrated.sksl
+++ b/src/sksl/generated/sksl_gpu.dehydrated.sksl
@@ -3918,13 +3918,13 @@
49,0,0,0,0,1,
41,
1,
-56,161,3,0,47,
+56,161,3,0,46,
1,
1,
26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
46,
-56,161,3,0,1,3,49,
+56,161,3,0,1,3,48,
56,162,3,0,1,0,
29,166,3,
2,
@@ -3934,10 +3934,10 @@
1,
1,
26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
46,
-56,165,3,0,1,3,49,
-56,164,3,0,47,
+56,165,3,0,1,3,48,
+56,164,3,0,46,
56,165,3,0,1,0,
29,169,3,
2,
@@ -3947,7 +3947,7 @@
42,99,8,
51,
1,
-56,167,3,0,66,
+56,167,3,0,65,
12,
47,15,2,1,
26,
@@ -3957,11 +3957,11 @@
26,
47,176,0,0,0,0,0,
1,
-56,167,3,0,49,
+56,167,3,0,48,
46,
56,168,3,0,1,3,
1,
-56,167,3,0,49,
+56,167,3,0,48,
46,
56,168,3,0,1,3,1,0,
29,172,3,
@@ -3979,9 +3979,9 @@
1,
1,
26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
46,
-56,174,3,0,1,3,49,
+56,174,3,0,1,3,48,
56,173,3,0,1,0,
29,178,3,
2,
@@ -3990,9 +3990,9 @@
1,
1,
26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
46,
-56,176,3,0,1,3,49,
+56,176,3,0,1,3,48,
56,177,3,0,1,0,
29,181,3,
2,
@@ -4001,14 +4001,14 @@
1,
1,
46,
-56,180,3,0,1,3,49,
-56,179,3,0,47,
+56,180,3,0,1,3,48,
+56,179,3,0,46,
1,
1,
26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
46,
-56,179,3,0,1,3,49,
+56,179,3,0,1,3,48,
56,180,3,0,1,0,
29,184,3,
2,
@@ -4018,13 +4018,13 @@
1,
1,
26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
46,
-56,183,3,0,1,3,49,
-56,182,3,0,47,
+56,183,3,0,1,3,48,
+56,182,3,0,46,
1,
46,
-56,182,3,0,1,3,49,
+56,182,3,0,1,3,48,
56,183,3,0,1,0,
29,187,3,
2,
@@ -4034,16 +4034,16 @@
1,
1,
26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
46,
-56,186,3,0,1,3,49,
-56,185,3,0,47,
+56,186,3,0,1,3,48,
+56,185,3,0,46,
1,
1,
26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
46,
-56,185,3,0,1,3,49,
+56,185,3,0,1,3,48,
56,186,3,0,1,0,
29,190,3,
2,
@@ -4052,7 +4052,7 @@
28,
47,15,2,204,0,2,
1,
-56,188,3,0,47,
+56,188,3,0,46,
56,189,3,0,
26,
47,176,0,0,0,128,63,1,0,
@@ -4061,19 +4061,19 @@
49,0,0,0,0,1,
41,
1,
-56,191,3,0,49,
+56,191,3,0,48,
56,192,3,0,1,0,
29,196,3,
2,
49,0,0,0,0,1,
41,
1,
-56,194,3,0,47,
+56,194,3,0,46,
1,
1,
26,
-47,176,0,0,0,128,63,48,
-56,194,3,0,49,
+47,176,0,0,0,128,63,47,
+56,194,3,0,48,
56,195,3,0,1,0,
29,199,3,
2,
@@ -4083,37 +4083,37 @@
1,
1,
26,
-47,176,0,0,0,0,64,49,
+47,176,0,0,0,0,64,48,
46,
-56,198,3,0,1,0,71,
+56,198,3,0,1,0,70,
46,
56,198,3,0,1,1,
1,
1,
26,
-47,176,0,0,0,0,64,49,
+47,176,0,0,0,0,64,48,
46,
-56,197,3,0,1,0,49,
+56,197,3,0,1,0,48,
46,
56,198,3,0,1,0,
1,
1,
46,
-56,197,3,0,1,1,49,
+56,197,3,0,1,1,48,
46,
-56,198,3,0,1,1,48,
+56,198,3,0,1,1,47,
1,
1,
26,
-47,176,0,0,0,0,64,49,
+47,176,0,0,0,0,64,48,
1,
46,
-56,198,3,0,1,1,48,
+56,198,3,0,1,1,47,
46,
-56,198,3,0,1,0,49,
+56,198,3,0,1,0,48,
1,
46,
-56,197,3,0,1,1,48,
+56,197,3,0,1,1,47,
46,
56,197,3,0,1,0,1,0,
29,202,3,
@@ -4147,34 +4147,34 @@
56,201,3,0,2,2,3,
1,
46,
-56,200,3,0,1,3,47,
+56,200,3,0,1,3,46,
1,
1,
26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
46,
-56,200,3,0,1,3,49,
+56,200,3,0,1,3,48,
46,
56,201,3,0,1,3,
23,
1,
46,
-56,35,4,2,3,0,1,2,72,
+56,35,4,2,3,0,1,2,71,
1,
1,
46,
-56,201,3,0,3,0,1,2,49,
+56,201,3,0,3,0,1,2,48,
1,
26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
46,
-56,200,3,0,1,3,47,
+56,200,3,0,1,3,46,
1,
46,
-56,200,3,0,3,0,1,2,49,
+56,200,3,0,3,0,1,2,48,
1,
26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
46,
56,201,3,0,1,3,
41,
@@ -4195,7 +4195,7 @@
23,
1,
46,
-56,36,4,1,3,0,1,2,65,
+56,36,4,1,3,0,1,2,64,
28,
47,172,1,200,0,2,
46,
@@ -4204,11 +4204,11 @@
1,
1,
26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
46,
-56,204,3,0,1,3,49,
+56,204,3,0,1,3,48,
46,
-56,203,3,0,3,0,1,2,47,
+56,203,3,0,3,0,1,2,46,
46,
56,204,3,0,3,0,1,2,
41,
@@ -4229,7 +4229,7 @@
23,
1,
46,
-56,37,4,1,3,0,1,2,65,
+56,37,4,1,3,0,1,2,64,
28,
47,172,1,224,0,2,
46,
@@ -4238,11 +4238,11 @@
1,
1,
26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
46,
-56,207,3,0,1,3,49,
+56,207,3,0,1,3,48,
46,
-56,206,3,0,3,0,1,2,47,
+56,206,3,0,3,0,1,2,46,
46,
56,207,3,0,3,0,1,2,
41,
@@ -4254,13 +4254,13 @@
51,
42,144,8,
1,
-56,209,3,0,50,
+56,209,3,0,49,
1,
-56,210,3,0,47,
+56,210,3,0,46,
26,
47,176,0,119,204,43,50,
1,
-56,209,3,0,50,
+56,209,3,0,49,
56,210,3,0,1,0,
29,215,3,
2,
@@ -4269,13 +4269,13 @@
51,
42,144,8,
1,
-56,212,3,0,50,
+56,212,3,0,49,
1,
-56,213,3,0,47,
+56,213,3,0,46,
26,
47,176,0,119,204,43,50,
1,
-56,212,3,0,50,
+56,212,3,0,49,
56,213,3,0,1,0,
29,218,3,
2,
@@ -4283,7 +4283,7 @@
31,0,
1,
46,
-56,217,3,0,1,0,66,
+56,217,3,0,1,0,65,
26,
47,176,0,0,0,0,0,
2,
@@ -4291,10 +4291,10 @@
41,
1,
46,
-56,216,3,0,1,0,49,
+56,216,3,0,1,0,48,
1,
26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
46,
56,217,3,0,1,1,1,
2,
@@ -4307,12 +4307,12 @@
47,176,0,0,
1,
46,
-56,216,3,0,1,1,48,
+56,216,3,0,1,1,47,
46,
56,216,3,0,1,0,
31,0,
1,
-56,38,4,0,66,
+56,38,4,0,65,
26,
47,176,0,0,0,0,0,
2,
@@ -4322,30 +4322,30 @@
1,
1,
46,
-56,216,3,0,1,1,49,
+56,216,3,0,1,1,48,
46,
-56,217,3,0,1,1,47,
+56,217,3,0,1,1,46,
1,
46,
-56,216,3,0,1,0,49,
+56,216,3,0,1,0,48,
1,
26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
46,
-56,217,3,0,1,1,47,
+56,217,3,0,1,1,46,
1,
46,
-56,217,3,0,1,0,49,
+56,217,3,0,1,0,48,
1,
26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
46,
56,216,3,0,1,1,1,
2,
49,0,0,0,0,2,
23,
1,
-56,38,4,1,65,
+56,38,4,1,64,
28,
47,176,0,200,0,2,
46,
@@ -4354,7 +4354,7 @@
47,176,0,211,3,2,
1,
46,
-56,217,3,0,1,0,49,
+56,217,3,0,1,0,48,
46,
56,216,3,0,1,1,
56,38,4,0,
@@ -4362,23 +4362,23 @@
1,
1,
1,
-56,38,4,0,49,
+56,38,4,0,48,
46,
-56,216,3,0,1,1,47,
+56,216,3,0,1,1,46,
1,
46,
-56,216,3,0,1,0,49,
+56,216,3,0,1,0,48,
1,
26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
46,
-56,217,3,0,1,1,47,
+56,217,3,0,1,1,46,
1,
46,
-56,217,3,0,1,0,49,
+56,217,3,0,1,0,48,
1,
26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
46,
56,216,3,0,1,1,1,1,1,1,211,3,
29,221,3,
@@ -4407,13 +4407,13 @@
56,220,3,0,2,2,3,
1,
46,
-56,219,3,0,1,3,47,
+56,219,3,0,1,3,46,
1,
1,
26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
46,
-56,219,3,0,1,3,49,
+56,219,3,0,1,3,48,
46,
56,220,3,0,1,3,1,1,218,3,
29,224,3,
@@ -4422,7 +4422,7 @@
31,0,
1,
46,
-56,223,3,0,1,1,66,
+56,223,3,0,1,1,65,
46,
56,223,3,0,1,0,
2,
@@ -4432,29 +4432,29 @@
1,
1,
46,
-56,222,3,0,1,1,49,
+56,222,3,0,1,1,48,
46,
-56,223,3,0,1,1,47,
+56,223,3,0,1,1,46,
1,
46,
-56,222,3,0,1,0,49,
+56,222,3,0,1,0,48,
1,
26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
46,
-56,223,3,0,1,1,47,
+56,223,3,0,1,1,46,
1,
46,
-56,223,3,0,1,0,49,
+56,223,3,0,1,0,48,
1,
26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
46,
56,222,3,0,1,1,1,
31,0,
1,
46,
-56,222,3,0,1,0,66,
+56,222,3,0,1,0,65,
26,
47,176,0,0,0,0,0,
2,
@@ -4462,10 +4462,10 @@
41,
1,
46,
-56,223,3,0,1,0,49,
+56,223,3,0,1,0,48,
1,
26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
46,
56,222,3,0,1,1,1,
2,
@@ -4482,15 +4482,15 @@
47,176,0,0,0,0,0,
1,
46,
-56,223,3,0,1,1,48,
+56,223,3,0,1,1,47,
28,
47,176,0,211,3,2,
1,
1,
46,
-56,223,3,0,1,1,48,
+56,223,3,0,1,1,47,
46,
-56,223,3,0,1,0,49,
+56,223,3,0,1,0,48,
46,
56,222,3,0,1,1,
46,
@@ -4499,23 +4499,23 @@
1,
1,
1,
-56,39,4,0,49,
+56,39,4,0,48,
46,
-56,222,3,0,1,1,47,
+56,222,3,0,1,1,46,
1,
46,
-56,222,3,0,1,0,49,
+56,222,3,0,1,0,48,
1,
26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
46,
-56,223,3,0,1,1,47,
+56,223,3,0,1,1,46,
1,
46,
-56,223,3,0,1,0,49,
+56,223,3,0,1,0,48,
1,
26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
46,
56,222,3,0,1,1,1,1,1,211,3,
29,227,3,
@@ -4544,13 +4544,13 @@
56,226,3,0,2,2,3,
1,
46,
-56,225,3,0,1,3,47,
+56,225,3,0,1,3,46,
1,
1,
26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
46,
-56,225,3,0,1,3,49,
+56,225,3,0,1,3,48,
46,
56,226,3,0,1,3,1,1,224,3,
29,230,3,
@@ -4568,9 +4568,9 @@
1,
1,
26,
-47,176,0,0,0,0,64,49,
+47,176,0,0,0,0,64,48,
46,
-56,231,3,0,1,0,71,
+56,231,3,0,1,0,70,
46,
56,231,3,0,1,1,
2,
@@ -4583,49 +4583,49 @@
1,
1,
46,
-56,232,3,0,1,0,49,
+56,232,3,0,1,0,48,
46,
-56,232,3,0,1,0,49,
+56,232,3,0,1,0,48,
1,
46,
-56,231,3,0,1,1,48,
-1,
-26,
-47,176,0,0,0,0,64,49,
-46,
-56,231,3,0,1,0,
-46,
-56,232,3,0,1,1,47,
-1,
-1,
-26,
-47,176,0,0,0,128,63,48,
-46,
-56,232,3,0,1,1,49,
-46,
-56,231,3,0,1,0,47,
-1,
-46,
-56,232,3,0,1,0,49,
-1,
-1,
-40,48,
-46,
56,231,3,0,1,1,47,
1,
26,
-47,176,0,0,0,0,64,49,
+47,176,0,0,0,0,64,48,
46,
-56,231,3,0,1,0,47,
+56,231,3,0,1,0,
+46,
+56,232,3,0,1,1,46,
+1,
+1,
+26,
+47,176,0,0,0,128,63,47,
+46,
+56,232,3,0,1,1,48,
+46,
+56,231,3,0,1,0,46,
+1,
+46,
+56,232,3,0,1,0,48,
+1,
+1,
+40,47,
+46,
+56,231,3,0,1,1,46,
+1,
+26,
+47,176,0,0,0,0,64,48,
+46,
+56,231,3,0,1,0,46,
26,
47,176,0,0,0,128,63,1,
31,0,
1,
1,
26,
-47,176,0,0,0,128,64,49,
+47,176,0,0,0,128,64,48,
46,
-56,232,3,0,1,0,71,
+56,232,3,0,1,0,70,
46,
56,232,3,0,1,1,
2,
@@ -4650,26 +4650,26 @@
47,176,0,0,
1,
46,
-56,232,3,0,1,0,49,
+56,232,3,0,1,0,48,
46,
56,232,3,0,1,0,
54,41,4,
47,176,0,0,
1,
-56,40,4,0,49,
+56,40,4,0,48,
46,
56,232,3,0,1,0,
54,42,4,
47,176,0,0,
1,
46,
-56,232,3,0,1,1,49,
+56,232,3,0,1,1,48,
46,
56,232,3,0,1,1,
54,43,4,
47,176,0,0,
1,
-56,42,4,0,49,
+56,42,4,0,48,
46,
56,232,3,0,1,1,
41,
@@ -4679,58 +4679,58 @@
1,
1,
1,
-56,42,4,0,49,
+56,42,4,0,48,
1,
46,
-56,231,3,0,1,0,48,
+56,231,3,0,1,0,47,
1,
46,
-56,232,3,0,1,0,49,
+56,232,3,0,1,0,48,
1,
1,
1,
26,
-47,176,0,0,0,64,64,49,
+47,176,0,0,0,64,64,48,
46,
-56,231,3,0,1,1,48,
+56,231,3,0,1,1,47,
1,
26,
-47,176,0,0,0,192,64,49,
+47,176,0,0,0,192,64,48,
46,
-56,231,3,0,1,0,48,
+56,231,3,0,1,0,47,
26,
-47,176,0,0,0,128,63,47,
+47,176,0,0,0,128,63,46,
1,
1,
1,
26,
-47,176,0,0,0,64,65,49,
+47,176,0,0,0,64,65,48,
46,
-56,232,3,0,1,1,49,
-56,40,4,0,49,
+56,232,3,0,1,1,48,
+56,40,4,0,48,
1,
46,
-56,231,3,0,1,1,48,
+56,231,3,0,1,1,47,
1,
26,
-47,176,0,0,0,0,64,49,
+47,176,0,0,0,0,64,48,
46,
-56,231,3,0,1,0,48,
+56,231,3,0,1,0,47,
1,
1,
26,
-47,176,0,0,0,128,65,49,
-56,41,4,0,49,
+47,176,0,0,0,128,65,48,
+56,41,4,0,48,
1,
46,
-56,231,3,0,1,1,48,
+56,231,3,0,1,1,47,
1,
26,
-47,176,0,0,0,0,64,49,
+47,176,0,0,0,0,64,48,
46,
-56,231,3,0,1,0,48,
+56,231,3,0,1,0,47,
1,
-56,43,4,0,49,
+56,43,4,0,48,
46,
56,231,3,0,1,0,
56,42,4,0,1,
@@ -4742,39 +4742,39 @@
1,
1,
46,
-56,232,3,0,1,0,49,
+56,232,3,0,1,0,48,
1,
1,
46,
-56,231,3,0,1,1,48,
+56,231,3,0,1,1,47,
1,
26,
-47,176,0,0,0,0,64,49,
+47,176,0,0,0,0,64,48,
+46,
+56,231,3,0,1,0,46,
+26,
+47,176,0,0,0,128,63,46,
46,
56,231,3,0,1,0,47,
-26,
-47,176,0,0,0,128,63,47,
-46,
-56,231,3,0,1,0,48,
1,
28,
47,176,0,113,0,1,
1,
46,
-56,232,3,0,1,1,49,
+56,232,3,0,1,1,48,
46,
-56,232,3,0,1,0,49,
+56,232,3,0,1,0,48,
1,
46,
-56,231,3,0,1,1,48,
+56,231,3,0,1,1,47,
1,
26,
-47,176,0,0,0,0,64,49,
+47,176,0,0,0,0,64,48,
46,
-56,231,3,0,1,0,48,
+56,231,3,0,1,0,47,
1,
46,
-56,232,3,0,1,1,49,
+56,232,3,0,1,1,48,
46,
56,231,3,0,1,0,1,1,1,211,3,
29,236,3,
@@ -4784,7 +4784,7 @@
51,
1,
46,
-56,235,3,0,1,3,66,
+56,235,3,0,1,3,65,
26,
47,176,0,0,0,0,0,
56,234,3,0,
@@ -4810,13 +4810,13 @@
56,235,3,0,2,2,3,
1,
46,
-56,234,3,0,1,3,47,
+56,234,3,0,1,3,46,
1,
1,
26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
46,
-56,234,3,0,1,3,49,
+56,234,3,0,1,3,48,
46,
56,235,3,0,1,3,1,1,233,3,
29,239,3,
@@ -4828,33 +4828,33 @@
1,
1,
46,
-56,237,3,0,3,0,1,2,47,
+56,237,3,0,3,0,1,2,46,
46,
-56,238,3,0,3,0,1,2,48,
+56,238,3,0,3,0,1,2,47,
1,
26,
-47,176,0,0,0,0,64,49,
+47,176,0,0,0,0,64,48,
28,
47,172,1,200,0,2,
1,
46,
-56,237,3,0,3,0,1,2,49,
+56,237,3,0,3,0,1,2,48,
46,
56,238,3,0,1,3,
1,
46,
-56,238,3,0,3,0,1,2,49,
+56,238,3,0,3,0,1,2,48,
46,
56,237,3,0,1,3,
1,
46,
-56,237,3,0,1,3,47,
+56,237,3,0,1,3,46,
1,
1,
26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
46,
-56,237,3,0,1,3,49,
+56,237,3,0,1,3,48,
46,
56,238,3,0,1,3,1,0,
29,242,3,
@@ -4866,26 +4866,26 @@
1,
1,
46,
-56,241,3,0,3,0,1,2,47,
+56,241,3,0,3,0,1,2,46,
46,
-56,240,3,0,3,0,1,2,48,
+56,240,3,0,3,0,1,2,47,
1,
1,
26,
-47,176,0,0,0,0,64,49,
+47,176,0,0,0,0,64,48,
46,
-56,241,3,0,3,0,1,2,49,
+56,241,3,0,3,0,1,2,48,
46,
56,240,3,0,3,0,1,2,
1,
46,
-56,240,3,0,1,3,47,
+56,240,3,0,1,3,46,
1,
1,
26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
46,
-56,240,3,0,1,3,49,
+56,240,3,0,1,3,48,
46,
56,241,3,0,1,3,1,0,
29,245,3,
@@ -4899,33 +4899,33 @@
1,
1,
26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
46,
-56,243,3,0,1,3,49,
+56,243,3,0,1,3,48,
46,
-56,244,3,0,3,0,1,2,47,
+56,244,3,0,3,0,1,2,46,
1,
1,
26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
46,
-56,244,3,0,1,3,49,
+56,244,3,0,1,3,48,
46,
-56,243,3,0,3,0,1,2,47,
+56,243,3,0,3,0,1,2,46,
1,
46,
-56,243,3,0,3,0,1,2,49,
+56,243,3,0,3,0,1,2,48,
46,
56,244,3,0,3,0,1,2,
1,
46,
-56,243,3,0,1,3,47,
+56,243,3,0,1,3,46,
1,
1,
26,
-47,176,0,0,0,128,63,48,
+47,176,0,0,0,128,63,47,
46,
-56,243,3,0,1,3,49,
+56,243,3,0,1,3,48,
46,
56,244,3,0,1,3,1,0,
29,247,3,
@@ -4971,10 +4971,10 @@
47,172,1,0,
1,
1,
-56,44,4,0,48,
+56,44,4,0,47,
28,
47,176,0,247,3,1,
-56,248,3,0,47,
+56,248,3,0,46,
56,248,3,0,
54,46,4,
47,176,0,0,
@@ -5003,54 +5003,54 @@
31,0,
1,
1,
-56,46,4,0,69,
+56,46,4,0,68,
26,
-47,176,0,0,0,0,0,60,
+47,176,0,0,0,0,0,59,
1,
-56,44,4,0,67,
+56,44,4,0,66,
56,46,4,0,
2,
49,0,0,0,0,1,
23,
1,
-56,45,4,1,65,
+56,45,4,1,64,
1,
-56,44,4,0,47,
+56,44,4,0,46,
1,
1,
-56,45,4,0,48,
-56,44,4,0,49,
+56,45,4,0,47,
+56,44,4,0,48,
28,
47,176,0,211,3,2,
56,44,4,0,
1,
-56,44,4,0,48,
+56,44,4,0,47,
56,46,4,0,1,
57,
31,0,
1,
1,
-56,47,4,0,68,
-56,249,3,0,60,
-1,
56,47,4,0,67,
+56,249,3,0,59,
+1,
+56,47,4,0,66,
56,44,4,0,
2,
49,0,0,0,0,1,
41,
1,
-56,44,4,0,47,
+56,44,4,0,46,
28,
47,172,1,215,3,2,
1,
1,
-56,45,4,0,48,
-56,44,4,0,49,
+56,45,4,0,47,
+56,44,4,0,48,
1,
-56,249,3,0,48,
+56,249,3,0,47,
56,44,4,0,
1,
-56,47,4,0,48,
+56,47,4,0,47,
56,44,4,0,1,
2,
49,0,0,0,0,1,
@@ -5070,7 +5070,7 @@
46,
56,252,3,0,1,1,
46,
-56,252,3,0,1,2,48,
+56,252,3,0,1,2,47,
28,
47,176,0,200,0,2,
28,
@@ -5087,7 +5087,7 @@
31,0,
1,
46,
-56,254,3,0,1,0,69,
+56,254,3,0,1,0,68,
46,
56,254,3,0,1,2,
2,
@@ -5100,15 +5100,15 @@
28,
47,176,0,211,3,2,
1,
-56,255,3,0,49,
+56,255,3,0,48,
1,
46,
-56,254,3,0,1,1,48,
+56,254,3,0,1,1,47,
46,
56,254,3,0,1,0,
1,
46,
-56,254,3,0,1,2,48,
+56,254,3,0,1,2,47,
46,
56,254,3,0,1,0,
56,255,3,0,1,
@@ -5134,7 +5134,7 @@
31,0,
1,
46,
-56,1,4,0,1,0,71,
+56,1,4,0,1,0,70,
46,
56,1,4,0,1,1,
2,
@@ -5142,7 +5142,7 @@
31,0,
1,
46,
-56,1,4,0,1,1,71,
+56,1,4,0,1,1,70,
46,
56,1,4,0,1,2,
2,
@@ -5155,7 +5155,7 @@
31,0,
1,
46,
-56,1,4,0,1,0,71,
+56,1,4,0,1,0,70,
46,
56,1,4,0,1,2,
2,
@@ -5179,7 +5179,7 @@
31,0,
1,
46,
-56,1,4,0,1,0,71,
+56,1,4,0,1,0,70,
46,
56,1,4,0,1,2,
2,
@@ -5194,7 +5194,7 @@
31,0,
1,
46,
-56,1,4,0,1,1,71,
+56,1,4,0,1,1,70,
46,
56,1,4,0,1,2,
2,
@@ -5234,21 +5234,21 @@
47,176,0,0,
1,
46,
-56,5,4,0,1,3,49,
+56,5,4,0,1,3,48,
46,
56,4,4,0,1,3,
54,50,4,
47,172,1,0,
1,
46,
-56,4,4,0,3,0,1,2,49,
+56,4,4,0,3,0,1,2,48,
46,
56,5,4,0,1,3,
54,51,4,
47,172,1,0,
1,
46,
-56,5,4,0,3,0,1,2,49,
+56,5,4,0,3,0,1,2,48,
46,
56,4,4,0,1,3,
41,
@@ -5265,19 +5265,19 @@
56,50,4,0,
56,51,4,0,
56,49,4,0,
-56,51,4,0,47,
+56,51,4,0,46,
46,
-56,5,4,0,3,0,1,2,48,
-56,51,4,0,47,
+56,5,4,0,3,0,1,2,47,
+56,51,4,0,46,
46,
-56,4,4,0,3,0,1,2,48,
+56,4,4,0,3,0,1,2,47,
56,50,4,0,
1,
1,
46,
-56,4,4,0,1,3,47,
+56,4,4,0,1,3,46,
46,
-56,5,4,0,1,3,48,
+56,5,4,0,1,3,47,
56,49,4,0,1,2,251,3,3,4,
29,9,4,
2,
@@ -5298,21 +5298,21 @@
47,176,0,0,
1,
46,
-56,8,4,0,1,3,49,
+56,8,4,0,1,3,48,
46,
56,7,4,0,1,3,
54,53,4,
47,172,1,0,
1,
46,
-56,7,4,0,3,0,1,2,49,
+56,7,4,0,3,0,1,2,48,
46,
56,8,4,0,1,3,
54,54,4,
47,172,1,0,
1,
46,
-56,8,4,0,3,0,1,2,49,
+56,8,4,0,3,0,1,2,48,
46,
56,7,4,0,1,3,
41,
@@ -5329,19 +5329,19 @@
56,54,4,0,
56,53,4,0,
56,52,4,0,
-56,54,4,0,47,
+56,54,4,0,46,
46,
-56,8,4,0,3,0,1,2,48,
-56,54,4,0,47,
+56,8,4,0,3,0,1,2,47,
+56,54,4,0,46,
46,
-56,7,4,0,3,0,1,2,48,
+56,7,4,0,3,0,1,2,47,
56,53,4,0,
1,
1,
46,
-56,7,4,0,1,3,47,
+56,7,4,0,1,3,46,
46,
-56,8,4,0,1,3,48,
+56,8,4,0,1,3,47,
56,52,4,0,1,2,251,3,3,4,
29,12,4,
2,
@@ -5362,21 +5362,21 @@
47,176,0,0,
1,
46,
-56,11,4,0,1,3,49,
+56,11,4,0,1,3,48,
46,
56,10,4,0,1,3,
54,56,4,
47,172,1,0,
1,
46,
-56,10,4,0,3,0,1,2,49,
+56,10,4,0,3,0,1,2,48,
46,
56,11,4,0,1,3,
54,57,4,
47,172,1,0,
1,
46,
-56,11,4,0,3,0,1,2,49,
+56,11,4,0,3,0,1,2,48,
46,
56,10,4,0,1,3,
41,
@@ -5390,19 +5390,19 @@
47,172,1,251,3,3,
56,56,4,0,
56,55,4,0,
-56,57,4,0,47,
+56,57,4,0,46,
46,
-56,11,4,0,3,0,1,2,48,
-56,57,4,0,47,
+56,11,4,0,3,0,1,2,47,
+56,57,4,0,46,
46,
-56,10,4,0,3,0,1,2,48,
+56,10,4,0,3,0,1,2,47,
56,56,4,0,
1,
1,
46,
-56,10,4,0,1,3,47,
+56,10,4,0,1,3,46,
46,
-56,11,4,0,1,3,48,
+56,11,4,0,1,3,47,
56,55,4,0,1,1,251,3,
29,15,4,
2,
@@ -5423,21 +5423,21 @@
47,176,0,0,
1,
46,
-56,14,4,0,1,3,49,
+56,14,4,0,1,3,48,
46,
56,13,4,0,1,3,
54,59,4,
47,172,1,0,
1,
46,
-56,13,4,0,3,0,1,2,49,
+56,13,4,0,3,0,1,2,48,
46,
56,14,4,0,1,3,
54,60,4,
47,172,1,0,
1,
46,
-56,14,4,0,3,0,1,2,49,
+56,14,4,0,3,0,1,2,48,
46,
56,13,4,0,1,3,
41,
@@ -5451,19 +5451,19 @@
47,172,1,251,3,3,
56,60,4,0,
56,58,4,0,
-56,59,4,0,47,
+56,59,4,0,46,
46,
-56,14,4,0,3,0,1,2,48,
-56,60,4,0,47,
+56,14,4,0,3,0,1,2,47,
+56,60,4,0,46,
46,
-56,13,4,0,3,0,1,2,48,
+56,13,4,0,3,0,1,2,47,
56,59,4,0,
1,
1,
46,
-56,13,4,0,1,3,47,
+56,13,4,0,1,3,46,
46,
-56,14,4,0,1,3,48,
+56,14,4,0,1,3,47,
56,58,4,0,1,1,251,3,
21,2,0,
49,29,0,
@@ -5835,7 +5835,7 @@
47,15,2,2,
1,
46,
-56,20,4,0,3,0,1,2,50,
+56,20,4,0,3,0,1,2,49,
28,
47,176,0,224,0,2,
46,
@@ -5852,7 +5852,7 @@
47,132,1,2,
1,
46,
-56,22,4,0,3,0,1,2,50,
+56,22,4,0,3,0,1,2,49,
28,
47,168,0,216,0,2,
46,
@@ -5867,7 +5867,7 @@
41,
1,
46,
-56,25,4,0,2,0,1,50,
+56,25,4,0,2,0,1,49,
46,
56,25,4,0,1,2,1,0,
29,30,4,
@@ -5885,12 +5885,12 @@
1,
1,
46,
-56,27,4,0,1,0,49,
+56,27,4,0,1,0,48,
46,
-56,28,4,0,1,1,48,
+56,28,4,0,1,1,47,
1,
46,
-56,27,4,0,1,1,49,
+56,27,4,0,1,1,48,
46,
56,28,4,0,1,0,1,0,
29,34,4,
@@ -5908,12 +5908,12 @@
1,
1,
46,
-56,31,4,0,1,0,49,
+56,31,4,0,1,0,48,
46,
-56,32,4,0,1,1,48,
+56,32,4,0,1,1,47,
1,
46,
-56,31,4,0,1,1,49,
+56,31,4,0,1,1,48,
46,
56,32,4,0,1,0,1,0,
20,};
diff --git a/src/sksl/generated/sksl_public.dehydrated.sksl b/src/sksl/generated/sksl_public.dehydrated.sksl
index b6ffce3..8abfa6d 100644
--- a/src/sksl/generated/sksl_public.dehydrated.sksl
+++ b/src/sksl/generated/sksl_public.dehydrated.sksl
@@ -1327,7 +1327,7 @@
47,139,1,2,
1,
46,
-56,138,1,0,3,0,1,2,50,
+56,138,1,0,3,0,1,2,49,
28,
47,123,0,155,0,2,
46,
@@ -1344,7 +1344,7 @@
47,142,1,2,
1,
46,
-56,141,1,0,3,0,1,2,50,
+56,141,1,0,3,0,1,2,49,
28,
47,115,0,147,0,2,
46,
diff --git a/src/sksl/lex/sksl.lex b/src/sksl/lex/sksl.lex
index 93fdf95..23ec9ce 100644
--- a/src/sksl/lex/sksl.lex
+++ b/src/sksl/lex/sksl.lex
@@ -37,7 +37,6 @@
INLINE = "inline"
NOINLINE = "noinline"
HASSIDEEFFECTS = "sk_has_side_effects"
-VARYING = "varying"
STRUCT = "struct"
LAYOUT = "layout"
ENUM = "enum"
diff --git a/tests/VerticesTest.cpp b/tests/VerticesTest.cpp
index d187d1c..cabee01 100644
--- a/tests/VerticesTest.cpp
+++ b/tests/VerticesTest.cpp
@@ -27,18 +27,7 @@
if (v0.indexCount() != v1.indexCount()) {
return false;
}
- if (v0.attributeCount() != v1.attributeCount()) {
- return false;
- }
- for (int i = 0; i < v0.attributeCount(); ++i) {
- if (v0.attributes()[i] != v1.attributes()[i]) {
- return false;
- }
- }
- if (!!v0.customData() != !!v1.customData()) {
- return false;
- }
if (!!v0.texCoords() != !!v1.texCoords()) {
return false;
}
@@ -61,12 +50,6 @@
}
}
}
- size_t totalCustomDataSize = v0.vertexCount() * v0.customDataSize();
- if (totalCustomDataSize) {
- if (0 != memcmp(v0.customData(), v1.customData(), totalCustomDataSize)) {
- return false;
- }
- }
for (int i = 0; i < v0.indexCount(); ++i) {
if (v0.indices()[i] != v1.indices()[i]) {
return false;
@@ -122,41 +105,6 @@
}
}
- // custom data tests
- using AttrType = SkVertices::Attribute::Type;
- struct {
- int count;
- size_t expected_size;
- SkVertices::Attribute attrs[4];
- } attrTests[] = {
- { 1, 4, { AttrType::kFloat } },
- { 1, 8, { AttrType::kFloat2 } },
- { 1, 12, { AttrType::kFloat3 } },
- { 1, 16, { AttrType::kFloat4 } },
- { 1, 4, { AttrType::kByte4_unorm } },
- { 4, 16, { AttrType::kFloat, AttrType::kFloat, AttrType::kFloat, AttrType::kFloat } },
- { 2, 12, { AttrType::kFloat2, AttrType::kByte4_unorm } },
- { 2, 12, { AttrType::kByte4_unorm, AttrType::kFloat2 } },
- };
-
- for (const auto& test : attrTests) {
- SkVertices::Builder builder(SkVertices::kTriangles_VertexMode, vCount, iCount,
- test.attrs, test.count);
-
- float* customData = (float*)builder.customData();
- int customDataCount = test.expected_size / sizeof(float);
- for (int i = 0; i < vCount; ++i) {
- builder.positions()[i].set((float)i, 1);
- for (int j = 0; j < customDataCount; ++j) {
- customData[i * customDataCount + j] = (float)j;
- }
- }
- for (int i = 0; i < iCount; ++i) {
- builder.indices()[i] = i % vCount;
- }
- self_test(builder.detach(), reporter);
- }
-
{
// This has the maximum number of vertices to be rewritten as indexed triangles without
// overflowing a 16bit index.
@@ -188,31 +136,6 @@
SkVertices::kHasColors_BuilderFlag);
REPORTER_ASSERT(reporter, !builder.isValid());
}
-
- // validity tests for per-vertex-data
-
- // Check that invalid counts fail to initialize the builder
- for (int attrCount : {-1, 0, SkVertices::kMaxCustomAttributes + 1}) {
- SkVertices::Attribute attrs[] = { AttrType::kFloat };
- SkVertices::Builder builder(SkVertices::kTriangleFan_VertexMode, 10, 0, attrs, attrCount);
- REPORTER_ASSERT(reporter, !builder.isValid());
- }
- { // nullptr is definitely bad
- SkVertices::Builder builder(SkVertices::kTriangleFan_VertexMode, 10, 0, nullptr, 4);
- REPORTER_ASSERT(reporter, !builder.isValid());
- }
- { // "normal" number of per-vertex-data (all floats)
- SkVertices::Attribute attrs[] = {AttrType::kFloat2, AttrType::kFloat2};
- SkVertices::Builder builder(SkVertices::kTriangleFan_VertexMode, 10, 0, attrs, 2);
- REPORTER_ASSERT(reporter, builder.isValid());
- REPORTER_ASSERT(reporter, builder.customData() != nullptr);
- }
- { // "normal" number of per-vertex-data (with packed bytes)
- SkVertices::Attribute attrs[] = {AttrType::kFloat2, AttrType::kByte4_unorm};
- SkVertices::Builder builder(SkVertices::kTriangleFan_VertexMode, 10, 0, attrs, 2);
- REPORTER_ASSERT(reporter, builder.isValid());
- REPORTER_ASSERT(reporter, builder.customData() != nullptr);
- }
}
static void fill_triangle(SkCanvas* canvas, const SkPoint pts[], SkColor c) {
diff --git a/tests/sksl/errors/BadModifiers.glsl b/tests/sksl/errors/BadModifiers.glsl
index 39a06ec..ebdd703 100644
--- a/tests/sksl/errors/BadModifiers.glsl
+++ b/tests/sksl/errors/BadModifiers.glsl
@@ -6,19 +6,16 @@
error: 1: 'uniform' is not permitted here
error: 1: 'flat' is not permitted here
error: 1: 'noperspective' is not permitted here
-error: 1: 'varying' is not permitted here
error: 1: functions cannot be both 'inline' and 'noinline'
error: 4: 'uniform' is not permitted here
error: 4: 'flat' is not permitted here
error: 4: 'noperspective' is not permitted here
error: 4: 'sk_has_side_effects' is not permitted here
-error: 4: 'varying' is not permitted here
error: 4: 'inline' is not permitted here
error: 4: 'noinline' is not permitted here
error: 6: 'in uniform' variables only permitted within fragment processors
-error: 6: 'varying' is only permitted in runtime shaders
error: 6: 'sk_has_side_effects' is not permitted here
error: 6: 'inline' is not permitted here
error: 6: 'noinline' is not permitted here
error: 6: 'const' variables must be initialized
-21 errors
+18 errors
diff --git a/tests/sksl/errors/ModifiersInStruct.glsl b/tests/sksl/errors/ModifiersInStruct.glsl
index c98590f..c22d25c 100644
--- a/tests/sksl/errors/ModifiersInStruct.glsl
+++ b/tests/sksl/errors/ModifiersInStruct.glsl
@@ -4,5 +4,5 @@
error: 3: modifier 'uniform' is not permitted on a struct field
error: 4: modifier 'flat' is not permitted on a struct field
error: 5: modifier 'noperspective' is not permitted on a struct field
-error: 6: modifier 'varying inout' is not permitted on a struct field
+error: 6: modifier 'inout' is not permitted on a struct field
5 errors