Эх сурвалжийг харах

Slight refactoring of Extensions to support lookup by name, added compatibility tests for text and binary formats.

csharptest 14 жил өмнө
parent
commit
27bfcc5e1a
28 өөрчлөгдсөн 13109 нэмэгдсэн , 248 устгасан
  1. 16 1
      build/build.csproj
  2. 53 0
      protos/extest/unittest_extras_xmltest.proto
  3. 140 0
      protos/google/test/google_size.proto
  4. 140 0
      protos/google/test/google_speed.proto
  5. 1 1
      src/ProtoGen/FieldGeneratorBase.cs
  6. 22 0
      src/ProtocolBuffers.Test/CompatTests/BinaryCompatibilityTests.cs
  7. 172 0
      src/ProtocolBuffers.Test/CompatTests/CompatibilityTests.cs
  8. 77 0
      src/ProtocolBuffers.Test/CompatTests/TestResources.Designer.cs
  9. 127 0
      src/ProtocolBuffers.Test/CompatTests/TestResources.resx
  10. 60 0
      src/ProtocolBuffers.Test/CompatTests/TextCompatibilityTests.cs
  11. BIN
      src/ProtocolBuffers.Test/CompatTests/google_message1.dat
  12. BIN
      src/ProtocolBuffers.Test/CompatTests/google_message2.dat
  13. 22 0
      src/ProtocolBuffers.Test/ProtocolBuffers.Test.csproj
  14. 4178 0
      src/ProtocolBuffers.Test/TestProtos/UnitTestGoogleSizeProtoFile.cs
  15. 6131 0
      src/ProtocolBuffers.Test/TestProtos/UnitTestGoogleSpeedProtoFile.cs
  16. 1680 0
      src/ProtocolBuffers.Test/TestProtos/UnitTestXmlSerializerTestProtoFile.cs
  17. 2 2
      src/ProtocolBuffers.Test/TextFormatTest.cs
  18. 155 157
      src/ProtocolBuffers.sln
  19. 6 1
      src/ProtocolBuffers/ByteString.cs
  20. 1 1
      src/ProtocolBuffers/ExtensionInfo.cs
  21. 19 38
      src/ProtocolBuffers/ExtensionRegistry.cs
  22. 38 19
      src/ProtocolBuffers/ExtensionRegistryLite.cs
  23. 1 0
      src/ProtocolBuffers/FieldSet.cs
  24. 12 0
      src/ProtocolBuffers/GeneratedExtensionLite.cs
  25. 11 3
      src/ProtocolBuffers/TextFormat.cs
  26. 1 5
      src/ProtocolBuffers/WireFormat.cs
  27. 3 19
      src/ProtocolBuffers2008.sln
  28. 41 1
      src/ProtocolBuffersLite.Test/TestProtos/UnitTestExtrasLiteProtoFile.cs

+ 16 - 1
build/build.csproj

@@ -38,6 +38,7 @@
 
     <Protos Include="$(ProtosDirectory)\extest\unittest_extras_full.proto" />
     <Protos Include="$(ProtosDirectory)\extest\unittest_extras_lite.proto" />
+    <Protos Include="$(ProtosDirectory)\extest\unittest_extras_xmltest.proto" />
     <Protos Include="$(ProtosDirectory)\extest\unittest_generic_services.proto" />
     <Protos Include="$(ProtosDirectory)\extest\unittest_rpc_interop.proto" />
     <Protos Include="$(ProtosDirectory)\google\protobuf\descriptor.proto" />
@@ -54,6 +55,8 @@
     <Protos Include="$(ProtosDirectory)\google\protobuf\unittest_mset.proto" />
     <Protos Include="$(ProtosDirectory)\google\protobuf\unittest_no_generic_services.proto" />
     <Protos Include="$(ProtosDirectory)\google\protobuf\unittest_optimize_for.proto" />
+    <Protos Include="$(ProtosDirectory)\google\test\google_size.proto" />
+    <Protos Include="$(ProtosDirectory)\google\test\google_speed.proto" />
 
     <!-- Main protos -->
     <GeneratedSource Include="$(BuildTempDirectory)\CSharpOptions.cs">
@@ -68,6 +71,9 @@
       <TargetDirectory>$(SourceDirectory)\AddressBook</TargetDirectory>
     </GeneratedSource>
     <!-- Unit test -->
+    <GeneratedSource Include="$(BuildTempDirectory)\UnitTestXmlSerializerTestProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
     <GeneratedSource Include="$(BuildTempDirectory)\UnitTestCSharpOptionsProtoFile.cs">
       <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
     </GeneratedSource>
@@ -108,6 +114,9 @@
     <GeneratedSource Include="$(BuildTempDirectory)\UnitTestExtrasFullProtoFile.cs">
       <TargetDirectory>$(SourceDirectory)\ProtocolBuffersLite.Test\TestProtos</TargetDirectory>
     </GeneratedSource>
+    <GeneratedSource Include="$(BuildTempDirectory)\UnitTestExtrasLiteProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffersLite.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
     <GeneratedSource Include="$(BuildTempDirectory)\UnitTestImportLiteProtoFile.cs">
       <TargetDirectory>$(SourceDirectory)\ProtocolBuffersLite.Test\TestProtos</TargetDirectory>
     </GeneratedSource>
@@ -123,7 +132,13 @@
     <GeneratedSource Include="$(BuildTempDirectory)\UnitTestProtoFile.cs">
       <TargetDirectory>$(SourceDirectory)\ProtocolBuffersLite.Test\TestProtos</TargetDirectory>
     </GeneratedSource>
-  
+    <GeneratedSource Include="$(BuildTempDirectory)\UnitTestGoogleSizeProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+    <GeneratedSource Include="$(BuildTempDirectory)\UnitTestGoogleSpeedProtoFile.cs">
+      <TargetDirectory>$(SourceDirectory)\ProtocolBuffers.Test\TestProtos</TargetDirectory>
+    </GeneratedSource>
+
     <TestContainer Include="$(SourceDirectory)\ProtocolBuffers.Test\bin\$(BuildConfiguration)\Google.ProtocolBuffers.Test.dll" />
     <TestContainer Include="$(SourceDirectory)\ProtocolBuffersLite.Test\bin\$(BuildConfiguration)\Google.ProtocolBuffersLite.Test.dll" />
     <TestContainer Include="$(SourceDirectory)\ProtocolBuffersLite.Test\bin\$(BuildConfiguration)\Google.ProtocolBuffersMixedLite.Test.dll" />

+ 53 - 0
protos/extest/unittest_extras_xmltest.proto

@@ -0,0 +1,53 @@
+// Additional options required for C# generation. File from copyright
+// line onwards is as per original distribution.
+import "google/protobuf/csharp_options.proto";
+option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos";
+option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestXmlSerializerTestProtoFile";
+
+package protobuf_unittest_extra;
+
+option optimize_for = SPEED;
+
+enum EnumOptions {
+    ONE = 0;
+    TWO = 1;
+    THREE = 2;
+}
+
+message TestXmlChild
+{
+    repeated EnumOptions options = 3;
+    optional bytes binary = 4;
+}
+
+message TestXmlNoFields {
+}
+
+message TestXmlMessage {
+
+    optional int64 number = 6;
+    repeated int32 numbers = 2;
+    optional string text = 3;
+    repeated string textlines = 700;
+    optional bool valid = 5;
+    
+    optional TestXmlChild child = 1;
+    repeated group Children = 401 
+    {
+        repeated EnumOptions options = 3;
+        optional bytes binary = 4;
+    }
+
+    extensions 100 to 199;
+}
+
+message  TestXmlExtension {
+  required int32 number = 1;
+}
+  
+extend TestXmlMessage {
+  optional EnumOptions extension_enum = 101;
+  optional string extension_text = 102;
+  repeated int32 extension_number = 103 [packed = true];
+  optional TestXmlExtension extension_message = 199;
+}

+ 140 - 0
protos/google/test/google_size.proto

@@ -0,0 +1,140 @@
+package benchmarks;
+
+import "google/protobuf/csharp_options.proto";
+option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos";
+option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestGoogleSizeProtoFile";
+
+option java_outer_classname = "GoogleSize";
+option optimize_for = CODE_SIZE;
+
+message SizeMessage1 {
+  required string field1 = 1;
+  optional string field9 = 9;
+  optional string field18 = 18;
+  optional bool field80 = 80 [default=false];
+  optional bool field81 = 81 [default=true];
+  required int32 field2 = 2;
+  required int32 field3 = 3;
+  optional int32 field280 = 280;
+  optional int32 field6 = 6 [default=0];
+  optional int64 field22 = 22;
+  optional string field4 = 4;
+  repeated fixed64 field5 = 5;
+  optional bool field59 = 59 [default=false];
+  optional string field7 = 7;
+  optional int32 field16 = 16;
+  optional int32 field130 = 130 [default=0];
+  optional bool field12 = 12 [default=true];
+  optional bool field17 = 17 [default=true];
+  optional bool field13 = 13 [default=true];
+  optional bool field14 = 14 [default=true];
+  optional int32 field104 = 104 [default=0];
+  optional int32 field100 = 100 [default=0];
+  optional int32 field101 = 101 [default=0];
+  optional string field102 = 102;
+  optional string field103 = 103;
+  optional int32 field29 = 29 [default=0];
+  optional bool field30 = 30 [default=false];
+  optional int32 field60 = 60 [default=-1];
+  optional int32 field271 = 271 [default=-1];
+  optional int32 field272 = 272 [default=-1];
+  optional int32 field150 = 150;
+  optional int32 field23 = 23 [default=0];
+  optional bool field24 = 24 [default=false];
+  optional int32 field25 = 25 [default=0];
+  optional SizeMessage1SubMessage field15 = 15;
+  optional bool field78 = 78;
+  optional int32 field67 = 67 [default=0];
+  optional int32 field68 = 68;
+  optional int32 field128 = 128 [default=0];
+  optional string field129 = 129 [default="xxxxxxxxxxxxxxxxxxxxx"];
+  optional int32 field131 = 131 [default=0];
+}
+
+message SizeMessage1SubMessage {
+  optional int32 field1 = 1 [default=0];
+  optional int32 field2 = 2 [default=0];
+  optional int32 field3 = 3 [default=0];
+  optional string field15 = 15;
+  optional bool field12 = 12 [default=true];
+  optional int64 field13 = 13;
+  optional int64 field14 = 14;
+  optional int32 field16 = 16;
+  optional int32 field19 = 19 [default=2];
+  optional bool field20  = 20 [default=true];
+  optional bool field28 = 28 [default=true];
+  optional fixed64 field21 = 21;
+  optional int32 field22 = 22;
+  optional bool field23 = 23 [ default=false ];
+  optional bool field206 = 206 [default=false];
+  optional fixed32 field203 = 203;
+  optional int32 field204 = 204;
+  optional string field205 = 205;
+  optional uint64 field207 = 207;
+  optional uint64 field300 = 300;
+}
+
+message SizeMessage2 {
+  optional string field1 = 1;
+  optional int64 field3 = 3;
+  optional int64 field4 = 4;
+  optional int64 field30 = 30;
+  optional bool field75  = 75 [default=false];
+  optional string field6 = 6;
+  optional bytes field2 = 2;
+  optional int32 field21 = 21 [default=0];
+  optional int32 field71 = 71;
+  optional float field25 = 25;
+  optional int32 field109 = 109 [default=0];
+  optional int32 field210 = 210 [default=0];
+  optional int32 field211 = 211 [default=0];
+  optional int32 field212 = 212 [default=0];
+  optional int32 field213 = 213 [default=0];
+  optional int32 field216 = 216 [default=0];
+  optional int32 field217 = 217 [default=0];
+  optional int32 field218 = 218 [default=0];
+  optional int32 field220 = 220 [default=0];
+  optional int32 field221 = 221 [default=0];
+  optional float field222 = 222 [default=0.0];
+  optional int32 field63 = 63;
+
+  repeated group Group1 = 10 {
+    required float field11 = 11;
+    optional float field26 = 26;
+    optional string field12 = 12;
+    optional string field13 = 13;
+    repeated string field14 = 14;
+    required uint64 field15 = 15;
+    optional int32 field5 = 5;
+    optional string field27 = 27;
+    optional int32 field28 = 28;
+    optional string field29 = 29;
+    optional string field16 = 16;
+    repeated string field22 = 22;
+    repeated int32 field73 = 73;
+    optional int32 field20 = 20 [default=0];
+    optional string field24 = 24;
+    optional SizeMessage2GroupedMessage field31 = 31;
+  }
+  repeated string field128 = 128;
+  optional int64 field131 = 131;
+  repeated string field127 = 127;
+  optional int32 field129 = 129;
+  repeated int64 field130 = 130;
+  optional bool field205 = 205 [default=false];
+  optional bool field206 = 206 [default=false];
+}
+
+message SizeMessage2GroupedMessage {
+  optional float field1 = 1;
+  optional float field2 = 2;
+  optional float field3 = 3 [default=0.0];
+  optional bool field4 = 4;
+  optional bool field5 = 5;
+  optional bool field6 = 6 [default=true];
+  optional bool field7 = 7 [default=false];
+  optional float field8 = 8;
+  optional bool field9 = 9;
+  optional float field10 = 10;
+  optional int64 field11 = 11;
+}

+ 140 - 0
protos/google/test/google_speed.proto

@@ -0,0 +1,140 @@
+package benchmarks;
+
+import "google/protobuf/csharp_options.proto";
+option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos";
+option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestGoogleSpeedProtoFile";
+
+option java_outer_classname = "GoogleSpeed";
+option optimize_for = SPEED;
+
+message SpeedMessage1 {
+  required string field1 = 1;
+  optional string field9 = 9;
+  optional string field18 = 18;
+  optional bool field80 = 80 [default=false];
+  optional bool field81 = 81 [default=true];
+  required int32 field2 = 2;
+  required int32 field3 = 3;
+  optional int32 field280 = 280;
+  optional int32 field6 = 6 [default=0];
+  optional int64 field22 = 22;
+  optional string field4 = 4;
+  repeated fixed64 field5 = 5;
+  optional bool field59 = 59 [default=false];
+  optional string field7 = 7;
+  optional int32 field16 = 16;
+  optional int32 field130 = 130 [default=0];
+  optional bool field12 = 12 [default=true];
+  optional bool field17 = 17 [default=true];
+  optional bool field13 = 13 [default=true];
+  optional bool field14 = 14 [default=true];
+  optional int32 field104 = 104 [default=0];
+  optional int32 field100 = 100 [default=0];
+  optional int32 field101 = 101 [default=0];
+  optional string field102 = 102;
+  optional string field103 = 103;
+  optional int32 field29 = 29 [default=0];
+  optional bool field30 = 30 [default=false];
+  optional int32 field60 = 60 [default=-1];
+  optional int32 field271 = 271 [default=-1];
+  optional int32 field272 = 272 [default=-1];
+  optional int32 field150 = 150;
+  optional int32 field23 = 23 [default=0];
+  optional bool field24 = 24 [default=false];
+  optional int32 field25 = 25 [default=0];
+  optional SpeedMessage1SubMessage field15 = 15;
+  optional bool field78 = 78;
+  optional int32 field67 = 67 [default=0];
+  optional int32 field68 = 68;
+  optional int32 field128 = 128 [default=0];
+  optional string field129 = 129 [default="xxxxxxxxxxxxxxxxxxxxx"];
+  optional int32 field131 = 131 [default=0];
+}
+
+message SpeedMessage1SubMessage {
+  optional int32 field1 = 1 [default=0];
+  optional int32 field2 = 2 [default=0];
+  optional int32 field3 = 3 [default=0];
+  optional string field15 = 15;
+  optional bool field12 = 12 [default=true];
+  optional int64 field13 = 13;
+  optional int64 field14 = 14;
+  optional int32 field16 = 16;
+  optional int32 field19 = 19 [default=2];
+  optional bool field20  = 20 [default=true];
+  optional bool field28 = 28 [default=true];
+  optional fixed64 field21 = 21;
+  optional int32 field22 = 22;
+  optional bool field23 = 23 [ default=false ];
+  optional bool field206 = 206 [default=false];
+  optional fixed32 field203 = 203;
+  optional int32 field204 = 204;
+  optional string field205 = 205;
+  optional uint64 field207 = 207;
+  optional uint64 field300 = 300;
+}
+
+message SpeedMessage2 {
+  optional string field1 = 1;
+  optional int64 field3 = 3;
+  optional int64 field4 = 4;
+  optional int64 field30 = 30;
+  optional bool field75  = 75 [default=false];
+  optional string field6 = 6;
+  optional bytes field2 = 2;
+  optional int32 field21 = 21 [default=0];
+  optional int32 field71 = 71;
+  optional float field25 = 25;
+  optional int32 field109 = 109 [default=0];
+  optional int32 field210 = 210 [default=0];
+  optional int32 field211 = 211 [default=0];
+  optional int32 field212 = 212 [default=0];
+  optional int32 field213 = 213 [default=0];
+  optional int32 field216 = 216 [default=0];
+  optional int32 field217 = 217 [default=0];
+  optional int32 field218 = 218 [default=0];
+  optional int32 field220 = 220 [default=0];
+  optional int32 field221 = 221 [default=0];
+  optional float field222 = 222 [default=0.0];
+  optional int32 field63 = 63;
+
+  repeated group Group1 = 10 {
+    required float field11 = 11;
+    optional float field26 = 26;
+    optional string field12 = 12;
+    optional string field13 = 13;
+    repeated string field14 = 14;
+    required uint64 field15 = 15;
+    optional int32 field5 = 5;
+    optional string field27 = 27;
+    optional int32 field28 = 28;
+    optional string field29 = 29;
+    optional string field16 = 16;
+    repeated string field22 = 22;
+    repeated int32 field73 = 73;
+    optional int32 field20 = 20 [default=0];
+    optional string field24 = 24;
+    optional SpeedMessage2GroupedMessage field31 = 31;
+  }
+  repeated string field128 = 128;
+  optional int64 field131 = 131;
+  repeated string field127 = 127;
+  optional int32 field129 = 129;
+  repeated int64 field130 = 130;
+  optional bool field205 = 205 [default=false];
+  optional bool field206 = 206 [default=false];
+}
+
+message SpeedMessage2GroupedMessage {
+  optional float field1 = 1;
+  optional float field2 = 2;
+  optional float field3 = 3 [default=0.0];
+  optional bool field4 = 4;
+  optional bool field5 = 5;
+  optional bool field6 = 6 [default=true];
+  optional bool field7 = 7 [default=false];
+  optional float field8 = 8;
+  optional bool field9 = 9;
+  optional float field10 = 10;
+  optional int64 field11 = 11;
+}

+ 1 - 1
src/ProtoGen/FieldGeneratorBase.cs

@@ -133,7 +133,7 @@ namespace Google.ProtocolBuffers.ProtoGen
                         }
                         if (UseLiteRuntime && Descriptor.DefaultValue is ByteString)
                         {
-                            string temp = Convert.ToBase64String(((ByteString) Descriptor.DefaultValue).ToByteArray());
+                            string temp = (((ByteString) Descriptor.DefaultValue).ToBase64());
                             return String.Format("ByteString.FromBase64(\"{0}\")", temp);
                         }
                         return string.Format("(pb::ByteString) {0}.Descriptor.Fields[{1}].DefaultValue",

+ 22 - 0
src/ProtocolBuffers.Test/CompatTests/BinaryCompatibilityTests.cs

@@ -0,0 +1,22 @@
+using System;
+using NUnit.Framework;
+
+namespace Google.ProtocolBuffers.CompatTests
+{
+    [TestFixture]
+    public class BinaryCompatibilityTests : CompatibilityTests
+    {
+        protected override string TestName { get { return "binary"; } }
+
+        protected override object SerializeMessage<TMessage, TBuilder>(TMessage message)
+        {
+            byte[] bresult = message.ToByteArray();
+            return bresult;
+        }
+
+        protected override TBuilder DeerializeMessage<TMessage, TBuilder>(object message, TBuilder builder, ExtensionRegistry registry)
+        {
+            return builder.MergeFrom((byte[])message, registry);
+        }
+    }
+}

+ 172 - 0
src/ProtocolBuffers.Test/CompatTests/CompatibilityTests.cs

@@ -0,0 +1,172 @@
+using System;
+using Google.ProtocolBuffers.TestProtos;
+using NUnit.Framework;
+
+namespace Google.ProtocolBuffers.CompatTests
+{
+    public abstract class CompatibilityTests
+    {
+        protected abstract string TestName { get; }
+        protected abstract object SerializeMessage<TMessage, TBuilder>(TMessage message)
+            where TMessage : IMessageLite<TMessage, TBuilder>
+            where TBuilder : IBuilderLite<TMessage, TBuilder>;
+
+        protected abstract TBuilder DeerializeMessage<TMessage, TBuilder>(object message, TBuilder builder, ExtensionRegistry registry)
+            where TMessage : IMessageLite<TMessage, TBuilder>
+            where TBuilder : IBuilderLite<TMessage, TBuilder>;
+
+        #region RunBenchmark
+
+        protected void RunBenchmark<TMessage, TBuilder>(byte[] buffer, bool write)
+            where TMessage : IMessageLite<TMessage, TBuilder>
+            where TBuilder : IBuilderLite<TMessage, TBuilder>, new()
+        {
+            TBuilder builder = new TBuilder();
+            TMessage message = new TBuilder().MergeFrom(buffer).Build();
+            System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
+            //simple warm-up
+            object content = SerializeMessage<TMessage, TBuilder>(message);
+            Assert.AreEqual(message, DeerializeMessage<TMessage, TBuilder>(content, new TBuilder(), ExtensionRegistry.Empty).Build());
+            //timming
+            long time = 0, sample = 1;
+            while (time < 100)
+            {
+                sample *= 10;
+                watch.Reset();
+                watch.Start();
+                if (write)
+                {
+                    for (int i = 0; i < sample; i++)
+                        SerializeMessage<TMessage, TBuilder>(message);
+                }
+                else
+                {
+                    for (int i = 0; i < sample; i++)
+                        DeerializeMessage<TMessage, TBuilder>(content, builder, ExtensionRegistry.Empty);
+                }
+                watch.Stop();
+                time = watch.ElapsedMilliseconds;
+            }
+
+            ulong rounds = (ulong)((100.0 / watch.ElapsedMilliseconds) * sample);
+            //test
+            watch.Reset();
+            watch.Start();
+
+            if (write)
+            {
+                for (ulong i = 0; i < rounds; i++)
+                    SerializeMessage<TMessage, TBuilder>(message);
+            }
+            else
+            {
+                for (ulong i = 0; i < rounds; i++)
+                    DeerializeMessage<TMessage, TBuilder>(content, builder, ExtensionRegistry.Empty);
+            }
+
+            watch.Stop();
+            System.Diagnostics.Trace.TraceInformation(
+                "\r\n{0} {4} {5} {3:n0} rps ({1:n0} rounds in {2:n0} ms)", typeof(TMessage).Name, rounds,
+                watch.ElapsedMilliseconds, (1000.0 / watch.ElapsedMilliseconds) * (double)rounds, TestName, write ? " write" : " read");
+            GC.GetTotalMemory(true);
+            GC.WaitForPendingFinalizers();
+        }
+
+        [Test]
+        public virtual void Message1OptimizeSizeWriterPerf()
+        {
+            RunBenchmark<SizeMessage1, SizeMessage1.Builder>(TestResources.google_message1, true);
+        }
+        [Test]
+        public virtual void Message1OptimizeSpeedWriterPerf()
+        {
+            RunBenchmark<SpeedMessage1, SpeedMessage1.Builder>(TestResources.google_message1, true);
+        }
+        [Test]
+        public virtual void Message2OptimizeSizeWriterPerf()
+        {
+            RunBenchmark<SizeMessage2, SizeMessage2.Builder>(TestResources.google_message2, true);
+        }
+        [Test]
+        public virtual void Message2OptimizeSpeedWriterPerf()
+        {
+            RunBenchmark<SpeedMessage2, SpeedMessage2.Builder>(TestResources.google_message2, true);
+        }
+
+        [Test]
+        public virtual void Message1OptimizeSizeReadPerf()
+        {
+            RunBenchmark<SizeMessage1, SizeMessage1.Builder>(TestResources.google_message1, false);
+        }
+        [Test]
+        public virtual void Message1OptimizeSpeedReadPerf()
+        {
+            RunBenchmark<SpeedMessage1, SpeedMessage1.Builder>(TestResources.google_message1, false);
+        }
+        [Test]
+        public virtual void Message2OptimizeSizeReadPerf()
+        {
+            RunBenchmark<SizeMessage2, SizeMessage2.Builder>(TestResources.google_message2, false);
+        }
+        [Test]
+        public virtual void Message2OptimizeSpeedReadPerf()
+        {
+            RunBenchmark<SpeedMessage2, SpeedMessage2.Builder>(TestResources.google_message2, false);
+        }
+        
+        #endregion
+
+        [Test]
+        public virtual void RoundTripMessage1OptimizeSize()
+        {
+            SizeMessage1 msg = SizeMessage1.CreateBuilder().MergeFrom(TestResources.google_message1).Build();
+            object content = SerializeMessage<SizeMessage1, SizeMessage1.Builder>(msg);
+
+            SizeMessage1 copy = DeerializeMessage<SizeMessage1, SizeMessage1.Builder>(content, SizeMessage1.CreateBuilder(), ExtensionRegistry.Empty).Build();
+
+            Assert.AreEqual(msg, copy);
+            Assert.AreEqual(content, SerializeMessage<SizeMessage1,SizeMessage1.Builder>(copy));
+            Assert.AreEqual(TestResources.google_message1, copy.ToByteArray());
+        }
+
+        [Test]
+        public virtual void RoundTripMessage2OptimizeSize()
+        {
+            SizeMessage2 msg = SizeMessage2.CreateBuilder().MergeFrom(TestResources.google_message2).Build();
+            object content = SerializeMessage<SizeMessage2, SizeMessage2.Builder>(msg);
+
+            SizeMessage2 copy = DeerializeMessage<SizeMessage2, SizeMessage2.Builder>(content, SizeMessage2.CreateBuilder(), ExtensionRegistry.Empty).Build();
+
+            Assert.AreEqual(msg, copy);
+            Assert.AreEqual(content, SerializeMessage<SizeMessage2, SizeMessage2.Builder>(copy));
+            Assert.AreEqual(TestResources.google_message2, copy.ToByteArray());
+        }
+
+        [Test]
+        public virtual void RoundTripMessage1OptimizeSpeed()
+        {
+            SpeedMessage1 msg = SpeedMessage1.CreateBuilder().MergeFrom(TestResources.google_message1).Build();
+            object content = SerializeMessage<SpeedMessage1, SpeedMessage1.Builder>(msg);
+
+            SpeedMessage1 copy = DeerializeMessage<SpeedMessage1, SpeedMessage1.Builder>(content, SpeedMessage1.CreateBuilder(), ExtensionRegistry.Empty).Build();
+
+            Assert.AreEqual(msg, copy);
+            Assert.AreEqual(content, SerializeMessage<SpeedMessage1, SpeedMessage1.Builder>(copy));
+            Assert.AreEqual(TestResources.google_message1, copy.ToByteArray());
+        }
+
+        [Test]
+        public virtual void RoundTripMessage2OptimizeSpeed()
+        {
+            SpeedMessage2 msg = SpeedMessage2.CreateBuilder().MergeFrom(TestResources.google_message2).Build();
+            object content = SerializeMessage<SpeedMessage2, SpeedMessage2.Builder>(msg);
+
+            SpeedMessage2 copy = DeerializeMessage<SpeedMessage2, SpeedMessage2.Builder>(content, SpeedMessage2.CreateBuilder(), ExtensionRegistry.Empty).Build();
+
+            Assert.AreEqual(msg, copy);
+            Assert.AreEqual(content, SerializeMessage<SpeedMessage2, SpeedMessage2.Builder>(copy));
+            Assert.AreEqual(TestResources.google_message2, copy.ToByteArray());
+        }
+
+    }
+}

+ 77 - 0
src/ProtocolBuffers.Test/CompatTests/TestResources.Designer.cs

@@ -0,0 +1,77 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:2.0.50727.5444
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace Google.ProtocolBuffers.CompatTests {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class TestResources {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal TestResources() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Google.ProtocolBuffers.CompatTests.TestResources", typeof(TestResources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        internal static byte[] google_message1 {
+            get {
+                object obj = ResourceManager.GetObject("google_message1", resourceCulture);
+                return ((byte[])(obj));
+            }
+        }
+        
+        internal static byte[] google_message2 {
+            get {
+                object obj = ResourceManager.GetObject("google_message2", resourceCulture);
+                return ((byte[])(obj));
+            }
+        }
+    }
+}

+ 127 - 0
src/ProtocolBuffers.Test/CompatTests/TestResources.resx

@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="google_message1" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>google_message1.dat;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+  <data name="google_message2" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>google_message2.dat;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
+</root>

+ 60 - 0
src/ProtocolBuffers.Test/CompatTests/TextCompatibilityTests.cs

@@ -0,0 +1,60 @@
+using System.ComponentModel;
+using System.IO;
+using NUnit.Framework;
+
+namespace Google.ProtocolBuffers.CompatTests
+{
+    [TestFixture]
+    public class TextCompatibilityTests : CompatibilityTests
+    {
+        protected override string TestName { get { return "text"; } }
+
+        protected override object SerializeMessage<TMessage, TBuilder>(TMessage message)
+        {
+            StringWriter text = new StringWriter();
+            message.PrintTo(text);
+            return text.ToString();
+        }
+
+        protected override TBuilder DeerializeMessage<TMessage, TBuilder>(object message, TBuilder builder, ExtensionRegistry registry)
+        {
+            TextFormat.Merge(new StringReader((string)message), registry, (IBuilder)builder);
+            return builder;
+        }
+
+        [Test, Explicit, Description("This test can take a very long time to run.")]
+        public override void Message2OptimizeSizeReadPerf()
+        {
+            base.Message2OptimizeSizeReadPerf();
+        }
+        [Test, Explicit, Description("This test can take a very long time to run.")]
+        public override void Message2OptimizeSpeedReadPerf()
+        {
+            base.Message2OptimizeSpeedReadPerf();
+        }
+
+        [Test, Explicit, Description("This test can take a very long time to run.")]
+        public override void RoundTripMessage2OptimizeSize()
+        {
+            base.RoundTripMessage2OptimizeSize();
+        }
+
+        [Test, Explicit, Description("This test can take a very long time to run.")]
+        public override void RoundTripMessage2OptimizeSpeed()
+        {
+            base.RoundTripMessage2OptimizeSpeed();
+        }
+
+        [Test, Explicit, Description("This test can take a very long time to run.")]
+        public override void Message2OptimizeSizeWriterPerf()
+        {
+            base.Message2OptimizeSizeWriterPerf();
+        }
+        [Test, Explicit, Description("This test can take a very long time to run.")]
+        public override void Message2OptimizeSpeedWriterPerf()
+        {
+            base.Message2OptimizeSpeedWriterPerf();
+        }
+
+    }
+}

BIN
src/ProtocolBuffers.Test/CompatTests/google_message1.dat


BIN
src/ProtocolBuffers.Test/CompatTests/google_message2.dat


+ 22 - 0
src/ProtocolBuffers.Test/ProtocolBuffers.Test.csproj

@@ -34,6 +34,7 @@
     <IsWebBootstrapper>false</IsWebBootstrapper>
     <UseApplicationTrust>false</UseApplicationTrust>
     <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TrackFileAccess>false</TrackFileAccess>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>true</DebugSymbols>
@@ -74,6 +75,14 @@
     <Compile Include="CodedInputStreamTest.cs" />
     <Compile Include="CodedOutputStreamTest.cs" />
     <Compile Include="Collections\PopsicleListTest.cs" />
+    <Compile Include="CompatTests\BinaryCompatibilityTests.cs" />
+    <Compile Include="CompatTests\CompatibilityTests.cs" />
+    <Compile Include="CompatTests\TestResources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>TestResources.resx</DependentUpon>
+    </Compile>
+    <Compile Include="CompatTests\TextCompatibilityTests.cs" />
     <Compile Include="CSharpOptionsTest.cs" />
     <Compile Include="DescriptorsTest.cs" />
     <Compile Include="Descriptors\MessageDescriptorTest.cs" />
@@ -93,6 +102,8 @@
     <Compile Include="TestProtos\UnitTestEmbedOptimizeForProtoFile.cs" />
     <Compile Include="TestProtos\UnitTestEmptyProtoFile.cs" />
     <Compile Include="TestProtos\UnitTestGenericServices.cs" />
+    <Compile Include="TestProtos\UnitTestGoogleSizeProtoFile.cs" />
+    <Compile Include="TestProtos\UnitTestGoogleSpeedProtoFile.cs" />
     <Compile Include="TestProtos\UnitTestImportLiteProtoFile.cs" />
     <Compile Include="TestProtos\UnitTestImportProtoFile.cs" />
     <Compile Include="TestProtos\UnitTestMessageSetProtoFile.cs" />
@@ -100,6 +111,7 @@
     <Compile Include="TestProtos\UnitTestOptimizeForProtoFile.cs" />
     <Compile Include="TestProtos\UnitTestProtoFile.cs" />
     <Compile Include="TestProtos\UnitTestRpcInterop.cs" />
+    <Compile Include="TestProtos\UnitTestXmlSerializerTestProtoFile.cs" />
     <Compile Include="TestRpcGenerator.cs" />
     <Compile Include="TestUtil.cs" />
     <Compile Include="TextFormatTest.cs" />
@@ -129,6 +141,16 @@
       <Install>true</Install>
     </BootstrapperPackage>
   </ItemGroup>
+  <ItemGroup>
+    <None Include="CompatTests\google_message1.dat" />
+    <None Include="CompatTests\google_message2.dat" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="CompatTests\TestResources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>TestResources.Designer.cs</LastGenOutput>
+    </EmbeddedResource>
+  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" Condition=" '$(Configuration)' == 'Debug' " />
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" Condition=" '$(Configuration)' == 'Release' " />
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 

+ 4178 - 0
src/ProtocolBuffers.Test/TestProtos/UnitTestGoogleSizeProtoFile.cs

@@ -0,0 +1,4178 @@
+// Generated by ProtoGen, Version=2.3.0.277, Culture=neutral, PublicKeyToken=17b3b1f090c3ea48.  DO NOT EDIT!
+
+using pb = global::Google.ProtocolBuffers;
+using pbc = global::Google.ProtocolBuffers.Collections;
+using pbd = global::Google.ProtocolBuffers.Descriptors;
+using scg = global::System.Collections.Generic;
+namespace Google.ProtocolBuffers.TestProtos {
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+  [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
+  public static partial class UnitTestGoogleSizeProtoFile {
+  
+    #region Extension registration
+    public static void RegisterAllExtensions(pb::ExtensionRegistry registry) {
+    }
+    #endregion
+    #region Static variables
+    internal static pbd::MessageDescriptor internal__static_benchmarks_SizeMessage1__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SizeMessage1, global::Google.ProtocolBuffers.TestProtos.SizeMessage1.Builder> internal__static_benchmarks_SizeMessage1__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_benchmarks_SizeMessage1SubMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SizeMessage1SubMessage, global::Google.ProtocolBuffers.TestProtos.SizeMessage1SubMessage.Builder> internal__static_benchmarks_SizeMessage1SubMessage__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_benchmarks_SizeMessage2__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SizeMessage2, global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Builder> internal__static_benchmarks_SizeMessage2__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_benchmarks_SizeMessage2_Group1__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Types.Group1, global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Types.Group1.Builder> internal__static_benchmarks_SizeMessage2_Group1__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_benchmarks_SizeMessage2GroupedMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SizeMessage2GroupedMessage, global::Google.ProtocolBuffers.TestProtos.SizeMessage2GroupedMessage.Builder> internal__static_benchmarks_SizeMessage2GroupedMessage__FieldAccessorTable;
+    #endregion
+    #region Descriptor
+    public static pbd::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbd::FileDescriptor descriptor;
+    
+    static UnitTestGoogleSizeProtoFile() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          "Ch1nb29nbGUvdGVzdC9nb29nbGVfc2l6ZS5wcm90bxIKYmVuY2htYXJrcxok" + 
+          "Z29vZ2xlL3Byb3RvYnVmL2NzaGFycF9vcHRpb25zLnByb3RvIvYGCgxTaXpl" + 
+          "TWVzc2FnZTESDgoGZmllbGQxGAEgAigJEg4KBmZpZWxkORgJIAEoCRIPCgdm" + 
+          "aWVsZDE4GBIgASgJEhYKB2ZpZWxkODAYUCABKAg6BWZhbHNlEhUKB2ZpZWxk" + 
+          "ODEYUSABKAg6BHRydWUSDgoGZmllbGQyGAIgAigFEg4KBmZpZWxkMxgDIAIo" + 
+          "BRIRCghmaWVsZDI4MBiYAiABKAUSEQoGZmllbGQ2GAYgASgFOgEwEg8KB2Zp" + 
+          "ZWxkMjIYFiABKAMSDgoGZmllbGQ0GAQgASgJEg4KBmZpZWxkNRgFIAMoBhIW" + 
+          "CgdmaWVsZDU5GDsgASgIOgVmYWxzZRIOCgZmaWVsZDcYByABKAkSDwoHZmll" + 
+          "bGQxNhgQIAEoBRIUCghmaWVsZDEzMBiCASABKAU6ATASFQoHZmllbGQxMhgM" + 
+          "IAEoCDoEdHJ1ZRIVCgdmaWVsZDE3GBEgASgIOgR0cnVlEhUKB2ZpZWxkMTMY" + 
+          "DSABKAg6BHRydWUSFQoHZmllbGQxNBgOIAEoCDoEdHJ1ZRITCghmaWVsZDEw" + 
+          "NBhoIAEoBToBMBITCghmaWVsZDEwMBhkIAEoBToBMBITCghmaWVsZDEwMRhl" + 
+          "IAEoBToBMBIQCghmaWVsZDEwMhhmIAEoCRIQCghmaWVsZDEwMxhnIAEoCRIS" + 
+          "CgdmaWVsZDI5GB0gASgFOgEwEhYKB2ZpZWxkMzAYHiABKAg6BWZhbHNlEhMK" + 
+          "B2ZpZWxkNjAYPCABKAU6Ai0xEhUKCGZpZWxkMjcxGI8CIAEoBToCLTESFQoI" + 
+          "ZmllbGQyNzIYkAIgASgFOgItMRIRCghmaWVsZDE1MBiWASABKAUSEgoHZmll" + 
+          "bGQyMxgXIAEoBToBMBIWCgdmaWVsZDI0GBggASgIOgVmYWxzZRISCgdmaWVs" + 
+          "ZDI1GBkgASgFOgEwEjMKB2ZpZWxkMTUYDyABKAsyIi5iZW5jaG1hcmtzLlNp" + 
+          "emVNZXNzYWdlMVN1Yk1lc3NhZ2USDwoHZmllbGQ3OBhOIAEoCBISCgdmaWVs" + 
+          "ZDY3GEMgASgFOgEwEg8KB2ZpZWxkNjgYRCABKAUSFAoIZmllbGQxMjgYgAEg" + 
+          "ASgFOgEwEigKCGZpZWxkMTI5GIEBIAEoCToVeHh4eHh4eHh4eHh4eHh4eHh4" + 
+          "eHh4EhQKCGZpZWxkMTMxGIMBIAEoBToBMCKhAwoWU2l6ZU1lc3NhZ2UxU3Vi" + 
+          "TWVzc2FnZRIRCgZmaWVsZDEYASABKAU6ATASEQoGZmllbGQyGAIgASgFOgEw" + 
+          "EhEKBmZpZWxkMxgDIAEoBToBMBIPCgdmaWVsZDE1GA8gASgJEhUKB2ZpZWxk" + 
+          "MTIYDCABKAg6BHRydWUSDwoHZmllbGQxMxgNIAEoAxIPCgdmaWVsZDE0GA4g" + 
+          "ASgDEg8KB2ZpZWxkMTYYECABKAUSEgoHZmllbGQxORgTIAEoBToBMhIVCgdm" + 
+          "aWVsZDIwGBQgASgIOgR0cnVlEhUKB2ZpZWxkMjgYHCABKAg6BHRydWUSDwoH" + 
+          "ZmllbGQyMRgVIAEoBhIPCgdmaWVsZDIyGBYgASgFEhYKB2ZpZWxkMjMYFyAB" + 
+          "KAg6BWZhbHNlEhgKCGZpZWxkMjA2GM4BIAEoCDoFZmFsc2USEQoIZmllbGQy" + 
+          "MDMYywEgASgHEhEKCGZpZWxkMjA0GMwBIAEoBRIRCghmaWVsZDIwNRjNASAB" + 
+          "KAkSEQoIZmllbGQyMDcYzwEgASgEEhEKCGZpZWxkMzAwGKwCIAEoBCLHBwoM" + 
+          "U2l6ZU1lc3NhZ2UyEg4KBmZpZWxkMRgBIAEoCRIOCgZmaWVsZDMYAyABKAMS" + 
+          "DgoGZmllbGQ0GAQgASgDEg8KB2ZpZWxkMzAYHiABKAMSFgoHZmllbGQ3NRhL" + 
+          "IAEoCDoFZmFsc2USDgoGZmllbGQ2GAYgASgJEg4KBmZpZWxkMhgCIAEoDBIS" + 
+          "CgdmaWVsZDIxGBUgASgFOgEwEg8KB2ZpZWxkNzEYRyABKAUSDwoHZmllbGQy" + 
+          "NRgZIAEoAhITCghmaWVsZDEwORhtIAEoBToBMBIUCghmaWVsZDIxMBjSASAB" + 
+          "KAU6ATASFAoIZmllbGQyMTEY0wEgASgFOgEwEhQKCGZpZWxkMjEyGNQBIAEo" + 
+          "BToBMBIUCghmaWVsZDIxMxjVASABKAU6ATASFAoIZmllbGQyMTYY2AEgASgF" + 
+          "OgEwEhQKCGZpZWxkMjE3GNkBIAEoBToBMBIUCghmaWVsZDIxOBjaASABKAU6" + 
+          "ATASFAoIZmllbGQyMjAY3AEgASgFOgEwEhQKCGZpZWxkMjIxGN0BIAEoBToB" + 
+          "MBIUCghmaWVsZDIyMhjeASABKAI6ATASDwoHZmllbGQ2Mxg/IAEoBRIvCgZn" + 
+          "cm91cDEYCiADKAoyHy5iZW5jaG1hcmtzLlNpemVNZXNzYWdlMi5Hcm91cDES" + 
+          "EQoIZmllbGQxMjgYgAEgAygJEhEKCGZpZWxkMTMxGIMBIAEoAxIQCghmaWVs" + 
+          "ZDEyNxh/IAMoCRIRCghmaWVsZDEyORiBASABKAUSEQoIZmllbGQxMzAYggEg" + 
+          "AygDEhgKCGZpZWxkMjA1GM0BIAEoCDoFZmFsc2USGAoIZmllbGQyMDYYzgEg" + 
+          "ASgIOgVmYWxzZRrCAgoGR3JvdXAxEg8KB2ZpZWxkMTEYCyACKAISDwoHZmll" + 
+          "bGQyNhgaIAEoAhIPCgdmaWVsZDEyGAwgASgJEg8KB2ZpZWxkMTMYDSABKAkS" + 
+          "DwoHZmllbGQxNBgOIAMoCRIPCgdmaWVsZDE1GA8gAigEEg4KBmZpZWxkNRgF" + 
+          "IAEoBRIPCgdmaWVsZDI3GBsgASgJEg8KB2ZpZWxkMjgYHCABKAUSDwoHZmll" + 
+          "bGQyORgdIAEoCRIPCgdmaWVsZDE2GBAgASgJEg8KB2ZpZWxkMjIYFiADKAkS" + 
+          "DwoHZmllbGQ3MxhJIAMoBRISCgdmaWVsZDIwGBQgASgFOgEwEg8KB2ZpZWxk" + 
+          "MjQYGCABKAkSNwoHZmllbGQzMRgfIAEoCzImLmJlbmNobWFya3MuU2l6ZU1l" + 
+          "c3NhZ2UyR3JvdXBlZE1lc3NhZ2Ui3gEKGlNpemVNZXNzYWdlMkdyb3VwZWRN" + 
+          "ZXNzYWdlEg4KBmZpZWxkMRgBIAEoAhIOCgZmaWVsZDIYAiABKAISEQoGZmll" + 
+          "bGQzGAMgASgCOgEwEg4KBmZpZWxkNBgEIAEoCBIOCgZmaWVsZDUYBSABKAgS" + 
+          "FAoGZmllbGQ2GAYgASgIOgR0cnVlEhUKBmZpZWxkNxgHIAEoCDoFZmFsc2US" + 
+          "DgoGZmllbGQ4GAggASgCEg4KBmZpZWxkORgJIAEoCBIPCgdmaWVsZDEwGAog" + 
+          "ASgCEg8KB2ZpZWxkMTEYCyABKANCUUIKR29vZ2xlU2l6ZUgCwj5ACiFHb29n" + 
+          "bGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MSG1VuaXRUZXN0R29vZ2xl" + 
+          "U2l6ZVByb3RvRmlsZQ==");
+      pbd::FileDescriptor.InternalDescriptorAssigner assigner = delegate(pbd::FileDescriptor root) {
+        descriptor = root;
+        internal__static_benchmarks_SizeMessage1__Descriptor = Descriptor.MessageTypes[0];
+        internal__static_benchmarks_SizeMessage1__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SizeMessage1, global::Google.ProtocolBuffers.TestProtos.SizeMessage1.Builder>(internal__static_benchmarks_SizeMessage1__Descriptor,
+                new string[] { "Field1", "Field9", "Field18", "Field80", "Field81", "Field2", "Field3", "Field280", "Field6", "Field22", "Field4", "Field5", "Field59", "Field7", "Field16", "Field130", "Field12", "Field17", "Field13", "Field14", "Field104", "Field100", "Field101", "Field102", "Field103", "Field29", "Field30", "Field60", "Field271", "Field272", "Field150", "Field23", "Field24", "Field25", "Field15", "Field78", "Field67", "Field68", "Field128", "Field129", "Field131", });
+        internal__static_benchmarks_SizeMessage1SubMessage__Descriptor = Descriptor.MessageTypes[1];
+        internal__static_benchmarks_SizeMessage1SubMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SizeMessage1SubMessage, global::Google.ProtocolBuffers.TestProtos.SizeMessage1SubMessage.Builder>(internal__static_benchmarks_SizeMessage1SubMessage__Descriptor,
+                new string[] { "Field1", "Field2", "Field3", "Field15", "Field12", "Field13", "Field14", "Field16", "Field19", "Field20", "Field28", "Field21", "Field22", "Field23", "Field206", "Field203", "Field204", "Field205", "Field207", "Field300", });
+        internal__static_benchmarks_SizeMessage2__Descriptor = Descriptor.MessageTypes[2];
+        internal__static_benchmarks_SizeMessage2__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SizeMessage2, global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Builder>(internal__static_benchmarks_SizeMessage2__Descriptor,
+                new string[] { "Field1", "Field3", "Field4", "Field30", "Field75", "Field6", "Field2", "Field21", "Field71", "Field25", "Field109", "Field210", "Field211", "Field212", "Field213", "Field216", "Field217", "Field218", "Field220", "Field221", "Field222", "Field63", "Group1", "Field128", "Field131", "Field127", "Field129", "Field130", "Field205", "Field206", });
+        internal__static_benchmarks_SizeMessage2_Group1__Descriptor = internal__static_benchmarks_SizeMessage2__Descriptor.NestedTypes[0];
+        internal__static_benchmarks_SizeMessage2_Group1__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Types.Group1, global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Types.Group1.Builder>(internal__static_benchmarks_SizeMessage2_Group1__Descriptor,
+                new string[] { "Field11", "Field26", "Field12", "Field13", "Field14", "Field15", "Field5", "Field27", "Field28", "Field29", "Field16", "Field22", "Field73", "Field20", "Field24", "Field31", });
+        internal__static_benchmarks_SizeMessage2GroupedMessage__Descriptor = Descriptor.MessageTypes[3];
+        internal__static_benchmarks_SizeMessage2GroupedMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SizeMessage2GroupedMessage, global::Google.ProtocolBuffers.TestProtos.SizeMessage2GroupedMessage.Builder>(internal__static_benchmarks_SizeMessage2GroupedMessage__Descriptor,
+                new string[] { "Field1", "Field2", "Field3", "Field4", "Field5", "Field6", "Field7", "Field8", "Field9", "Field10", "Field11", });
+        pb::ExtensionRegistry registry = pb::ExtensionRegistry.CreateInstance();
+        RegisterAllExtensions(registry);
+        global::Google.ProtocolBuffers.DescriptorProtos.CSharpOptions.RegisterAllExtensions(registry);
+        return registry;
+      };
+      pbd::FileDescriptor.InternalBuildGeneratedFileFrom(descriptorData,
+          new pbd::FileDescriptor[] {
+          global::Google.ProtocolBuffers.DescriptorProtos.CSharpOptions.Descriptor, 
+          }, assigner);
+    }
+    #endregion
+    
+  }
+  #region Messages
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+  [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
+  public sealed partial class SizeMessage1 : pb::GeneratedMessage<SizeMessage1, SizeMessage1.Builder> {
+    private static readonly SizeMessage1 defaultInstance = new Builder().BuildPartial();
+    public static SizeMessage1 DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override SizeMessage1 DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    protected override SizeMessage1 ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestGoogleSizeProtoFile.internal__static_benchmarks_SizeMessage1__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<SizeMessage1, SizeMessage1.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestGoogleSizeProtoFile.internal__static_benchmarks_SizeMessage1__FieldAccessorTable; }
+    }
+    
+    public const int Field1FieldNumber = 1;
+    private bool hasField1;
+    private string field1_ = "";
+    public bool HasField1 {
+      get { return hasField1; }
+    }
+    public string Field1 {
+      get { return field1_; }
+    }
+    
+    public const int Field9FieldNumber = 9;
+    private bool hasField9;
+    private string field9_ = "";
+    public bool HasField9 {
+      get { return hasField9; }
+    }
+    public string Field9 {
+      get { return field9_; }
+    }
+    
+    public const int Field18FieldNumber = 18;
+    private bool hasField18;
+    private string field18_ = "";
+    public bool HasField18 {
+      get { return hasField18; }
+    }
+    public string Field18 {
+      get { return field18_; }
+    }
+    
+    public const int Field80FieldNumber = 80;
+    private bool hasField80;
+    private bool field80_ = false;
+    public bool HasField80 {
+      get { return hasField80; }
+    }
+    public bool Field80 {
+      get { return field80_; }
+    }
+    
+    public const int Field81FieldNumber = 81;
+    private bool hasField81;
+    private bool field81_ = true;
+    public bool HasField81 {
+      get { return hasField81; }
+    }
+    public bool Field81 {
+      get { return field81_; }
+    }
+    
+    public const int Field2FieldNumber = 2;
+    private bool hasField2;
+    private int field2_ = 0;
+    public bool HasField2 {
+      get { return hasField2; }
+    }
+    public int Field2 {
+      get { return field2_; }
+    }
+    
+    public const int Field3FieldNumber = 3;
+    private bool hasField3;
+    private int field3_ = 0;
+    public bool HasField3 {
+      get { return hasField3; }
+    }
+    public int Field3 {
+      get { return field3_; }
+    }
+    
+    public const int Field280FieldNumber = 280;
+    private bool hasField280;
+    private int field280_ = 0;
+    public bool HasField280 {
+      get { return hasField280; }
+    }
+    public int Field280 {
+      get { return field280_; }
+    }
+    
+    public const int Field6FieldNumber = 6;
+    private bool hasField6;
+    private int field6_ = 0;
+    public bool HasField6 {
+      get { return hasField6; }
+    }
+    public int Field6 {
+      get { return field6_; }
+    }
+    
+    public const int Field22FieldNumber = 22;
+    private bool hasField22;
+    private long field22_ = 0L;
+    public bool HasField22 {
+      get { return hasField22; }
+    }
+    public long Field22 {
+      get { return field22_; }
+    }
+    
+    public const int Field4FieldNumber = 4;
+    private bool hasField4;
+    private string field4_ = "";
+    public bool HasField4 {
+      get { return hasField4; }
+    }
+    public string Field4 {
+      get { return field4_; }
+    }
+    
+    public const int Field5FieldNumber = 5;
+    private pbc::PopsicleList<ulong> field5_ = new pbc::PopsicleList<ulong>();
+    [global::System.CLSCompliant(false)]
+    public scg::IList<ulong> Field5List {
+      get { return pbc::Lists.AsReadOnly(field5_); }
+    }
+    public int Field5Count {
+      get { return field5_.Count; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong GetField5(int index) {
+      return field5_[index];
+    }
+    
+    public const int Field59FieldNumber = 59;
+    private bool hasField59;
+    private bool field59_ = false;
+    public bool HasField59 {
+      get { return hasField59; }
+    }
+    public bool Field59 {
+      get { return field59_; }
+    }
+    
+    public const int Field7FieldNumber = 7;
+    private bool hasField7;
+    private string field7_ = "";
+    public bool HasField7 {
+      get { return hasField7; }
+    }
+    public string Field7 {
+      get { return field7_; }
+    }
+    
+    public const int Field16FieldNumber = 16;
+    private bool hasField16;
+    private int field16_ = 0;
+    public bool HasField16 {
+      get { return hasField16; }
+    }
+    public int Field16 {
+      get { return field16_; }
+    }
+    
+    public const int Field130FieldNumber = 130;
+    private bool hasField130;
+    private int field130_ = 0;
+    public bool HasField130 {
+      get { return hasField130; }
+    }
+    public int Field130 {
+      get { return field130_; }
+    }
+    
+    public const int Field12FieldNumber = 12;
+    private bool hasField12;
+    private bool field12_ = true;
+    public bool HasField12 {
+      get { return hasField12; }
+    }
+    public bool Field12 {
+      get { return field12_; }
+    }
+    
+    public const int Field17FieldNumber = 17;
+    private bool hasField17;
+    private bool field17_ = true;
+    public bool HasField17 {
+      get { return hasField17; }
+    }
+    public bool Field17 {
+      get { return field17_; }
+    }
+    
+    public const int Field13FieldNumber = 13;
+    private bool hasField13;
+    private bool field13_ = true;
+    public bool HasField13 {
+      get { return hasField13; }
+    }
+    public bool Field13 {
+      get { return field13_; }
+    }
+    
+    public const int Field14FieldNumber = 14;
+    private bool hasField14;
+    private bool field14_ = true;
+    public bool HasField14 {
+      get { return hasField14; }
+    }
+    public bool Field14 {
+      get { return field14_; }
+    }
+    
+    public const int Field104FieldNumber = 104;
+    private bool hasField104;
+    private int field104_ = 0;
+    public bool HasField104 {
+      get { return hasField104; }
+    }
+    public int Field104 {
+      get { return field104_; }
+    }
+    
+    public const int Field100FieldNumber = 100;
+    private bool hasField100;
+    private int field100_ = 0;
+    public bool HasField100 {
+      get { return hasField100; }
+    }
+    public int Field100 {
+      get { return field100_; }
+    }
+    
+    public const int Field101FieldNumber = 101;
+    private bool hasField101;
+    private int field101_ = 0;
+    public bool HasField101 {
+      get { return hasField101; }
+    }
+    public int Field101 {
+      get { return field101_; }
+    }
+    
+    public const int Field102FieldNumber = 102;
+    private bool hasField102;
+    private string field102_ = "";
+    public bool HasField102 {
+      get { return hasField102; }
+    }
+    public string Field102 {
+      get { return field102_; }
+    }
+    
+    public const int Field103FieldNumber = 103;
+    private bool hasField103;
+    private string field103_ = "";
+    public bool HasField103 {
+      get { return hasField103; }
+    }
+    public string Field103 {
+      get { return field103_; }
+    }
+    
+    public const int Field29FieldNumber = 29;
+    private bool hasField29;
+    private int field29_ = 0;
+    public bool HasField29 {
+      get { return hasField29; }
+    }
+    public int Field29 {
+      get { return field29_; }
+    }
+    
+    public const int Field30FieldNumber = 30;
+    private bool hasField30;
+    private bool field30_ = false;
+    public bool HasField30 {
+      get { return hasField30; }
+    }
+    public bool Field30 {
+      get { return field30_; }
+    }
+    
+    public const int Field60FieldNumber = 60;
+    private bool hasField60;
+    private int field60_ = -1;
+    public bool HasField60 {
+      get { return hasField60; }
+    }
+    public int Field60 {
+      get { return field60_; }
+    }
+    
+    public const int Field271FieldNumber = 271;
+    private bool hasField271;
+    private int field271_ = -1;
+    public bool HasField271 {
+      get { return hasField271; }
+    }
+    public int Field271 {
+      get { return field271_; }
+    }
+    
+    public const int Field272FieldNumber = 272;
+    private bool hasField272;
+    private int field272_ = -1;
+    public bool HasField272 {
+      get { return hasField272; }
+    }
+    public int Field272 {
+      get { return field272_; }
+    }
+    
+    public const int Field150FieldNumber = 150;
+    private bool hasField150;
+    private int field150_ = 0;
+    public bool HasField150 {
+      get { return hasField150; }
+    }
+    public int Field150 {
+      get { return field150_; }
+    }
+    
+    public const int Field23FieldNumber = 23;
+    private bool hasField23;
+    private int field23_ = 0;
+    public bool HasField23 {
+      get { return hasField23; }
+    }
+    public int Field23 {
+      get { return field23_; }
+    }
+    
+    public const int Field24FieldNumber = 24;
+    private bool hasField24;
+    private bool field24_ = false;
+    public bool HasField24 {
+      get { return hasField24; }
+    }
+    public bool Field24 {
+      get { return field24_; }
+    }
+    
+    public const int Field25FieldNumber = 25;
+    private bool hasField25;
+    private int field25_ = 0;
+    public bool HasField25 {
+      get { return hasField25; }
+    }
+    public int Field25 {
+      get { return field25_; }
+    }
+    
+    public const int Field15FieldNumber = 15;
+    private bool hasField15;
+    private global::Google.ProtocolBuffers.TestProtos.SizeMessage1SubMessage field15_ = global::Google.ProtocolBuffers.TestProtos.SizeMessage1SubMessage.DefaultInstance;
+    public bool HasField15 {
+      get { return hasField15; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.SizeMessage1SubMessage Field15 {
+      get { return field15_; }
+    }
+    
+    public const int Field78FieldNumber = 78;
+    private bool hasField78;
+    private bool field78_ = false;
+    public bool HasField78 {
+      get { return hasField78; }
+    }
+    public bool Field78 {
+      get { return field78_; }
+    }
+    
+    public const int Field67FieldNumber = 67;
+    private bool hasField67;
+    private int field67_ = 0;
+    public bool HasField67 {
+      get { return hasField67; }
+    }
+    public int Field67 {
+      get { return field67_; }
+    }
+    
+    public const int Field68FieldNumber = 68;
+    private bool hasField68;
+    private int field68_ = 0;
+    public bool HasField68 {
+      get { return hasField68; }
+    }
+    public int Field68 {
+      get { return field68_; }
+    }
+    
+    public const int Field128FieldNumber = 128;
+    private bool hasField128;
+    private int field128_ = 0;
+    public bool HasField128 {
+      get { return hasField128; }
+    }
+    public int Field128 {
+      get { return field128_; }
+    }
+    
+    public const int Field129FieldNumber = 129;
+    private bool hasField129;
+    private string field129_ = "xxxxxxxxxxxxxxxxxxxxx";
+    public bool HasField129 {
+      get { return hasField129; }
+    }
+    public string Field129 {
+      get { return field129_; }
+    }
+    
+    public const int Field131FieldNumber = 131;
+    private bool hasField131;
+    private int field131_ = 0;
+    public bool HasField131 {
+      get { return hasField131; }
+    }
+    public int Field131 {
+      get { return field131_; }
+    }
+    
+    public static SizeMessage1 ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SizeMessage1 ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SizeMessage1 ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SizeMessage1 ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SizeMessage1 ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SizeMessage1 ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static SizeMessage1 ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static SizeMessage1 ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static SizeMessage1 ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SizeMessage1 ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(SizeMessage1 prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
+    public sealed partial class Builder : pb::GeneratedBuilder<SizeMessage1, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {}
+      
+      SizeMessage1 result = new SizeMessage1();
+      
+      protected override SizeMessage1 MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override Builder Clear() {
+        result = new SizeMessage1();
+        return this;
+      }
+      
+      public override Builder Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.SizeMessage1.Descriptor; }
+      }
+      
+      public override SizeMessage1 DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.SizeMessage1.DefaultInstance; }
+      }
+      
+      public override SizeMessage1 BuildPartial() {
+        if (result == null) {
+          throw new global::System.InvalidOperationException("build() has already been called on this Builder");
+        }
+        result.field5_.MakeReadOnly();
+        SizeMessage1 returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      
+      public bool HasField1 {
+        get { return result.HasField1; }
+      }
+      public string Field1 {
+        get { return result.Field1; }
+        set { SetField1(value); }
+      }
+      public Builder SetField1(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.hasField1 = true;
+        result.field1_ = value;
+        return this;
+      }
+      public Builder ClearField1() {
+        result.hasField1 = false;
+        result.field1_ = "";
+        return this;
+      }
+      
+      public bool HasField9 {
+        get { return result.HasField9; }
+      }
+      public string Field9 {
+        get { return result.Field9; }
+        set { SetField9(value); }
+      }
+      public Builder SetField9(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.hasField9 = true;
+        result.field9_ = value;
+        return this;
+      }
+      public Builder ClearField9() {
+        result.hasField9 = false;
+        result.field9_ = "";
+        return this;
+      }
+      
+      public bool HasField18 {
+        get { return result.HasField18; }
+      }
+      public string Field18 {
+        get { return result.Field18; }
+        set { SetField18(value); }
+      }
+      public Builder SetField18(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.hasField18 = true;
+        result.field18_ = value;
+        return this;
+      }
+      public Builder ClearField18() {
+        result.hasField18 = false;
+        result.field18_ = "";
+        return this;
+      }
+      
+      public bool HasField80 {
+        get { return result.HasField80; }
+      }
+      public bool Field80 {
+        get { return result.Field80; }
+        set { SetField80(value); }
+      }
+      public Builder SetField80(bool value) {
+        result.hasField80 = true;
+        result.field80_ = value;
+        return this;
+      }
+      public Builder ClearField80() {
+        result.hasField80 = false;
+        result.field80_ = false;
+        return this;
+      }
+      
+      public bool HasField81 {
+        get { return result.HasField81; }
+      }
+      public bool Field81 {
+        get { return result.Field81; }
+        set { SetField81(value); }
+      }
+      public Builder SetField81(bool value) {
+        result.hasField81 = true;
+        result.field81_ = value;
+        return this;
+      }
+      public Builder ClearField81() {
+        result.hasField81 = false;
+        result.field81_ = true;
+        return this;
+      }
+      
+      public bool HasField2 {
+        get { return result.HasField2; }
+      }
+      public int Field2 {
+        get { return result.Field2; }
+        set { SetField2(value); }
+      }
+      public Builder SetField2(int value) {
+        result.hasField2 = true;
+        result.field2_ = value;
+        return this;
+      }
+      public Builder ClearField2() {
+        result.hasField2 = false;
+        result.field2_ = 0;
+        return this;
+      }
+      
+      public bool HasField3 {
+        get { return result.HasField3; }
+      }
+      public int Field3 {
+        get { return result.Field3; }
+        set { SetField3(value); }
+      }
+      public Builder SetField3(int value) {
+        result.hasField3 = true;
+        result.field3_ = value;
+        return this;
+      }
+      public Builder ClearField3() {
+        result.hasField3 = false;
+        result.field3_ = 0;
+        return this;
+      }
+      
+      public bool HasField280 {
+        get { return result.HasField280; }
+      }
+      public int Field280 {
+        get { return result.Field280; }
+        set { SetField280(value); }
+      }
+      public Builder SetField280(int value) {
+        result.hasField280 = true;
+        result.field280_ = value;
+        return this;
+      }
+      public Builder ClearField280() {
+        result.hasField280 = false;
+        result.field280_ = 0;
+        return this;
+      }
+      
+      public bool HasField6 {
+        get { return result.HasField6; }
+      }
+      public int Field6 {
+        get { return result.Field6; }
+        set { SetField6(value); }
+      }
+      public Builder SetField6(int value) {
+        result.hasField6 = true;
+        result.field6_ = value;
+        return this;
+      }
+      public Builder ClearField6() {
+        result.hasField6 = false;
+        result.field6_ = 0;
+        return this;
+      }
+      
+      public bool HasField22 {
+        get { return result.HasField22; }
+      }
+      public long Field22 {
+        get { return result.Field22; }
+        set { SetField22(value); }
+      }
+      public Builder SetField22(long value) {
+        result.hasField22 = true;
+        result.field22_ = value;
+        return this;
+      }
+      public Builder ClearField22() {
+        result.hasField22 = false;
+        result.field22_ = 0L;
+        return this;
+      }
+      
+      public bool HasField4 {
+        get { return result.HasField4; }
+      }
+      public string Field4 {
+        get { return result.Field4; }
+        set { SetField4(value); }
+      }
+      public Builder SetField4(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.hasField4 = true;
+        result.field4_ = value;
+        return this;
+      }
+      public Builder ClearField4() {
+        result.hasField4 = false;
+        result.field4_ = "";
+        return this;
+      }
+      
+      [global::System.CLSCompliant(false)]
+      public pbc::IPopsicleList<ulong> Field5List {
+        get { return result.field5_; }
+      }
+      public int Field5Count {
+        get { return result.Field5Count; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong GetField5(int index) {
+        return result.GetField5(index);
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetField5(int index, ulong value) {
+        result.field5_[index] = value;
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddField5(ulong value) {
+        result.field5_.Add(value);
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRangeField5(scg::IEnumerable<ulong> values) {
+        base.AddRange(values, result.field5_);
+        return this;
+      }
+      public Builder ClearField5() {
+        result.field5_.Clear();
+        return this;
+      }
+      
+      public bool HasField59 {
+        get { return result.HasField59; }
+      }
+      public bool Field59 {
+        get { return result.Field59; }
+        set { SetField59(value); }
+      }
+      public Builder SetField59(bool value) {
+        result.hasField59 = true;
+        result.field59_ = value;
+        return this;
+      }
+      public Builder ClearField59() {
+        result.hasField59 = false;
+        result.field59_ = false;
+        return this;
+      }
+      
+      public bool HasField7 {
+        get { return result.HasField7; }
+      }
+      public string Field7 {
+        get { return result.Field7; }
+        set { SetField7(value); }
+      }
+      public Builder SetField7(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.hasField7 = true;
+        result.field7_ = value;
+        return this;
+      }
+      public Builder ClearField7() {
+        result.hasField7 = false;
+        result.field7_ = "";
+        return this;
+      }
+      
+      public bool HasField16 {
+        get { return result.HasField16; }
+      }
+      public int Field16 {
+        get { return result.Field16; }
+        set { SetField16(value); }
+      }
+      public Builder SetField16(int value) {
+        result.hasField16 = true;
+        result.field16_ = value;
+        return this;
+      }
+      public Builder ClearField16() {
+        result.hasField16 = false;
+        result.field16_ = 0;
+        return this;
+      }
+      
+      public bool HasField130 {
+        get { return result.HasField130; }
+      }
+      public int Field130 {
+        get { return result.Field130; }
+        set { SetField130(value); }
+      }
+      public Builder SetField130(int value) {
+        result.hasField130 = true;
+        result.field130_ = value;
+        return this;
+      }
+      public Builder ClearField130() {
+        result.hasField130 = false;
+        result.field130_ = 0;
+        return this;
+      }
+      
+      public bool HasField12 {
+        get { return result.HasField12; }
+      }
+      public bool Field12 {
+        get { return result.Field12; }
+        set { SetField12(value); }
+      }
+      public Builder SetField12(bool value) {
+        result.hasField12 = true;
+        result.field12_ = value;
+        return this;
+      }
+      public Builder ClearField12() {
+        result.hasField12 = false;
+        result.field12_ = true;
+        return this;
+      }
+      
+      public bool HasField17 {
+        get { return result.HasField17; }
+      }
+      public bool Field17 {
+        get { return result.Field17; }
+        set { SetField17(value); }
+      }
+      public Builder SetField17(bool value) {
+        result.hasField17 = true;
+        result.field17_ = value;
+        return this;
+      }
+      public Builder ClearField17() {
+        result.hasField17 = false;
+        result.field17_ = true;
+        return this;
+      }
+      
+      public bool HasField13 {
+        get { return result.HasField13; }
+      }
+      public bool Field13 {
+        get { return result.Field13; }
+        set { SetField13(value); }
+      }
+      public Builder SetField13(bool value) {
+        result.hasField13 = true;
+        result.field13_ = value;
+        return this;
+      }
+      public Builder ClearField13() {
+        result.hasField13 = false;
+        result.field13_ = true;
+        return this;
+      }
+      
+      public bool HasField14 {
+        get { return result.HasField14; }
+      }
+      public bool Field14 {
+        get { return result.Field14; }
+        set { SetField14(value); }
+      }
+      public Builder SetField14(bool value) {
+        result.hasField14 = true;
+        result.field14_ = value;
+        return this;
+      }
+      public Builder ClearField14() {
+        result.hasField14 = false;
+        result.field14_ = true;
+        return this;
+      }
+      
+      public bool HasField104 {
+        get { return result.HasField104; }
+      }
+      public int Field104 {
+        get { return result.Field104; }
+        set { SetField104(value); }
+      }
+      public Builder SetField104(int value) {
+        result.hasField104 = true;
+        result.field104_ = value;
+        return this;
+      }
+      public Builder ClearField104() {
+        result.hasField104 = false;
+        result.field104_ = 0;
+        return this;
+      }
+      
+      public bool HasField100 {
+        get { return result.HasField100; }
+      }
+      public int Field100 {
+        get { return result.Field100; }
+        set { SetField100(value); }
+      }
+      public Builder SetField100(int value) {
+        result.hasField100 = true;
+        result.field100_ = value;
+        return this;
+      }
+      public Builder ClearField100() {
+        result.hasField100 = false;
+        result.field100_ = 0;
+        return this;
+      }
+      
+      public bool HasField101 {
+        get { return result.HasField101; }
+      }
+      public int Field101 {
+        get { return result.Field101; }
+        set { SetField101(value); }
+      }
+      public Builder SetField101(int value) {
+        result.hasField101 = true;
+        result.field101_ = value;
+        return this;
+      }
+      public Builder ClearField101() {
+        result.hasField101 = false;
+        result.field101_ = 0;
+        return this;
+      }
+      
+      public bool HasField102 {
+        get { return result.HasField102; }
+      }
+      public string Field102 {
+        get { return result.Field102; }
+        set { SetField102(value); }
+      }
+      public Builder SetField102(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.hasField102 = true;
+        result.field102_ = value;
+        return this;
+      }
+      public Builder ClearField102() {
+        result.hasField102 = false;
+        result.field102_ = "";
+        return this;
+      }
+      
+      public bool HasField103 {
+        get { return result.HasField103; }
+      }
+      public string Field103 {
+        get { return result.Field103; }
+        set { SetField103(value); }
+      }
+      public Builder SetField103(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.hasField103 = true;
+        result.field103_ = value;
+        return this;
+      }
+      public Builder ClearField103() {
+        result.hasField103 = false;
+        result.field103_ = "";
+        return this;
+      }
+      
+      public bool HasField29 {
+        get { return result.HasField29; }
+      }
+      public int Field29 {
+        get { return result.Field29; }
+        set { SetField29(value); }
+      }
+      public Builder SetField29(int value) {
+        result.hasField29 = true;
+        result.field29_ = value;
+        return this;
+      }
+      public Builder ClearField29() {
+        result.hasField29 = false;
+        result.field29_ = 0;
+        return this;
+      }
+      
+      public bool HasField30 {
+        get { return result.HasField30; }
+      }
+      public bool Field30 {
+        get { return result.Field30; }
+        set { SetField30(value); }
+      }
+      public Builder SetField30(bool value) {
+        result.hasField30 = true;
+        result.field30_ = value;
+        return this;
+      }
+      public Builder ClearField30() {
+        result.hasField30 = false;
+        result.field30_ = false;
+        return this;
+      }
+      
+      public bool HasField60 {
+        get { return result.HasField60; }
+      }
+      public int Field60 {
+        get { return result.Field60; }
+        set { SetField60(value); }
+      }
+      public Builder SetField60(int value) {
+        result.hasField60 = true;
+        result.field60_ = value;
+        return this;
+      }
+      public Builder ClearField60() {
+        result.hasField60 = false;
+        result.field60_ = -1;
+        return this;
+      }
+      
+      public bool HasField271 {
+        get { return result.HasField271; }
+      }
+      public int Field271 {
+        get { return result.Field271; }
+        set { SetField271(value); }
+      }
+      public Builder SetField271(int value) {
+        result.hasField271 = true;
+        result.field271_ = value;
+        return this;
+      }
+      public Builder ClearField271() {
+        result.hasField271 = false;
+        result.field271_ = -1;
+        return this;
+      }
+      
+      public bool HasField272 {
+        get { return result.HasField272; }
+      }
+      public int Field272 {
+        get { return result.Field272; }
+        set { SetField272(value); }
+      }
+      public Builder SetField272(int value) {
+        result.hasField272 = true;
+        result.field272_ = value;
+        return this;
+      }
+      public Builder ClearField272() {
+        result.hasField272 = false;
+        result.field272_ = -1;
+        return this;
+      }
+      
+      public bool HasField150 {
+        get { return result.HasField150; }
+      }
+      public int Field150 {
+        get { return result.Field150; }
+        set { SetField150(value); }
+      }
+      public Builder SetField150(int value) {
+        result.hasField150 = true;
+        result.field150_ = value;
+        return this;
+      }
+      public Builder ClearField150() {
+        result.hasField150 = false;
+        result.field150_ = 0;
+        return this;
+      }
+      
+      public bool HasField23 {
+        get { return result.HasField23; }
+      }
+      public int Field23 {
+        get { return result.Field23; }
+        set { SetField23(value); }
+      }
+      public Builder SetField23(int value) {
+        result.hasField23 = true;
+        result.field23_ = value;
+        return this;
+      }
+      public Builder ClearField23() {
+        result.hasField23 = false;
+        result.field23_ = 0;
+        return this;
+      }
+      
+      public bool HasField24 {
+        get { return result.HasField24; }
+      }
+      public bool Field24 {
+        get { return result.Field24; }
+        set { SetField24(value); }
+      }
+      public Builder SetField24(bool value) {
+        result.hasField24 = true;
+        result.field24_ = value;
+        return this;
+      }
+      public Builder ClearField24() {
+        result.hasField24 = false;
+        result.field24_ = false;
+        return this;
+      }
+      
+      public bool HasField25 {
+        get { return result.HasField25; }
+      }
+      public int Field25 {
+        get { return result.Field25; }
+        set { SetField25(value); }
+      }
+      public Builder SetField25(int value) {
+        result.hasField25 = true;
+        result.field25_ = value;
+        return this;
+      }
+      public Builder ClearField25() {
+        result.hasField25 = false;
+        result.field25_ = 0;
+        return this;
+      }
+      
+      public bool HasField15 {
+       get { return result.HasField15; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.SizeMessage1SubMessage Field15 {
+        get { return result.Field15; }
+        set { SetField15(value); }
+      }
+      public Builder SetField15(global::Google.ProtocolBuffers.TestProtos.SizeMessage1SubMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.hasField15 = true;
+        result.field15_ = value;
+        return this;
+      }
+      public Builder SetField15(global::Google.ProtocolBuffers.TestProtos.SizeMessage1SubMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        result.hasField15 = true;
+        result.field15_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeField15(global::Google.ProtocolBuffers.TestProtos.SizeMessage1SubMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        if (result.HasField15 &&
+            result.field15_ != global::Google.ProtocolBuffers.TestProtos.SizeMessage1SubMessage.DefaultInstance) {
+            result.field15_ = global::Google.ProtocolBuffers.TestProtos.SizeMessage1SubMessage.CreateBuilder(result.field15_).MergeFrom(value).BuildPartial();
+        } else {
+          result.field15_ = value;
+        }
+        result.hasField15 = true;
+        return this;
+      }
+      public Builder ClearField15() {
+        result.hasField15 = false;
+        result.field15_ = global::Google.ProtocolBuffers.TestProtos.SizeMessage1SubMessage.DefaultInstance;
+        return this;
+      }
+      
+      public bool HasField78 {
+        get { return result.HasField78; }
+      }
+      public bool Field78 {
+        get { return result.Field78; }
+        set { SetField78(value); }
+      }
+      public Builder SetField78(bool value) {
+        result.hasField78 = true;
+        result.field78_ = value;
+        return this;
+      }
+      public Builder ClearField78() {
+        result.hasField78 = false;
+        result.field78_ = false;
+        return this;
+      }
+      
+      public bool HasField67 {
+        get { return result.HasField67; }
+      }
+      public int Field67 {
+        get { return result.Field67; }
+        set { SetField67(value); }
+      }
+      public Builder SetField67(int value) {
+        result.hasField67 = true;
+        result.field67_ = value;
+        return this;
+      }
+      public Builder ClearField67() {
+        result.hasField67 = false;
+        result.field67_ = 0;
+        return this;
+      }
+      
+      public bool HasField68 {
+        get { return result.HasField68; }
+      }
+      public int Field68 {
+        get { return result.Field68; }
+        set { SetField68(value); }
+      }
+      public Builder SetField68(int value) {
+        result.hasField68 = true;
+        result.field68_ = value;
+        return this;
+      }
+      public Builder ClearField68() {
+        result.hasField68 = false;
+        result.field68_ = 0;
+        return this;
+      }
+      
+      public bool HasField128 {
+        get { return result.HasField128; }
+      }
+      public int Field128 {
+        get { return result.Field128; }
+        set { SetField128(value); }
+      }
+      public Builder SetField128(int value) {
+        result.hasField128 = true;
+        result.field128_ = value;
+        return this;
+      }
+      public Builder ClearField128() {
+        result.hasField128 = false;
+        result.field128_ = 0;
+        return this;
+      }
+      
+      public bool HasField129 {
+        get { return result.HasField129; }
+      }
+      public string Field129 {
+        get { return result.Field129; }
+        set { SetField129(value); }
+      }
+      public Builder SetField129(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.hasField129 = true;
+        result.field129_ = value;
+        return this;
+      }
+      public Builder ClearField129() {
+        result.hasField129 = false;
+        result.field129_ = "xxxxxxxxxxxxxxxxxxxxx";
+        return this;
+      }
+      
+      public bool HasField131 {
+        get { return result.HasField131; }
+      }
+      public int Field131 {
+        get { return result.Field131; }
+        set { SetField131(value); }
+      }
+      public Builder SetField131(int value) {
+        result.hasField131 = true;
+        result.field131_ = value;
+        return this;
+      }
+      public Builder ClearField131() {
+        result.hasField131 = false;
+        result.field131_ = 0;
+        return this;
+      }
+    }
+    static SizeMessage1() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestGoogleSizeProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+  [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
+  public sealed partial class SizeMessage1SubMessage : pb::GeneratedMessage<SizeMessage1SubMessage, SizeMessage1SubMessage.Builder> {
+    private static readonly SizeMessage1SubMessage defaultInstance = new Builder().BuildPartial();
+    public static SizeMessage1SubMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override SizeMessage1SubMessage DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    protected override SizeMessage1SubMessage ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestGoogleSizeProtoFile.internal__static_benchmarks_SizeMessage1SubMessage__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<SizeMessage1SubMessage, SizeMessage1SubMessage.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestGoogleSizeProtoFile.internal__static_benchmarks_SizeMessage1SubMessage__FieldAccessorTable; }
+    }
+    
+    public const int Field1FieldNumber = 1;
+    private bool hasField1;
+    private int field1_ = 0;
+    public bool HasField1 {
+      get { return hasField1; }
+    }
+    public int Field1 {
+      get { return field1_; }
+    }
+    
+    public const int Field2FieldNumber = 2;
+    private bool hasField2;
+    private int field2_ = 0;
+    public bool HasField2 {
+      get { return hasField2; }
+    }
+    public int Field2 {
+      get { return field2_; }
+    }
+    
+    public const int Field3FieldNumber = 3;
+    private bool hasField3;
+    private int field3_ = 0;
+    public bool HasField3 {
+      get { return hasField3; }
+    }
+    public int Field3 {
+      get { return field3_; }
+    }
+    
+    public const int Field15FieldNumber = 15;
+    private bool hasField15;
+    private string field15_ = "";
+    public bool HasField15 {
+      get { return hasField15; }
+    }
+    public string Field15 {
+      get { return field15_; }
+    }
+    
+    public const int Field12FieldNumber = 12;
+    private bool hasField12;
+    private bool field12_ = true;
+    public bool HasField12 {
+      get { return hasField12; }
+    }
+    public bool Field12 {
+      get { return field12_; }
+    }
+    
+    public const int Field13FieldNumber = 13;
+    private bool hasField13;
+    private long field13_ = 0L;
+    public bool HasField13 {
+      get { return hasField13; }
+    }
+    public long Field13 {
+      get { return field13_; }
+    }
+    
+    public const int Field14FieldNumber = 14;
+    private bool hasField14;
+    private long field14_ = 0L;
+    public bool HasField14 {
+      get { return hasField14; }
+    }
+    public long Field14 {
+      get { return field14_; }
+    }
+    
+    public const int Field16FieldNumber = 16;
+    private bool hasField16;
+    private int field16_ = 0;
+    public bool HasField16 {
+      get { return hasField16; }
+    }
+    public int Field16 {
+      get { return field16_; }
+    }
+    
+    public const int Field19FieldNumber = 19;
+    private bool hasField19;
+    private int field19_ = 2;
+    public bool HasField19 {
+      get { return hasField19; }
+    }
+    public int Field19 {
+      get { return field19_; }
+    }
+    
+    public const int Field20FieldNumber = 20;
+    private bool hasField20;
+    private bool field20_ = true;
+    public bool HasField20 {
+      get { return hasField20; }
+    }
+    public bool Field20 {
+      get { return field20_; }
+    }
+    
+    public const int Field28FieldNumber = 28;
+    private bool hasField28;
+    private bool field28_ = true;
+    public bool HasField28 {
+      get { return hasField28; }
+    }
+    public bool Field28 {
+      get { return field28_; }
+    }
+    
+    public const int Field21FieldNumber = 21;
+    private bool hasField21;
+    private ulong field21_ = 0;
+    public bool HasField21 {
+      get { return hasField21; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong Field21 {
+      get { return field21_; }
+    }
+    
+    public const int Field22FieldNumber = 22;
+    private bool hasField22;
+    private int field22_ = 0;
+    public bool HasField22 {
+      get { return hasField22; }
+    }
+    public int Field22 {
+      get { return field22_; }
+    }
+    
+    public const int Field23FieldNumber = 23;
+    private bool hasField23;
+    private bool field23_ = false;
+    public bool HasField23 {
+      get { return hasField23; }
+    }
+    public bool Field23 {
+      get { return field23_; }
+    }
+    
+    public const int Field206FieldNumber = 206;
+    private bool hasField206;
+    private bool field206_ = false;
+    public bool HasField206 {
+      get { return hasField206; }
+    }
+    public bool Field206 {
+      get { return field206_; }
+    }
+    
+    public const int Field203FieldNumber = 203;
+    private bool hasField203;
+    private uint field203_ = 0;
+    public bool HasField203 {
+      get { return hasField203; }
+    }
+    [global::System.CLSCompliant(false)]
+    public uint Field203 {
+      get { return field203_; }
+    }
+    
+    public const int Field204FieldNumber = 204;
+    private bool hasField204;
+    private int field204_ = 0;
+    public bool HasField204 {
+      get { return hasField204; }
+    }
+    public int Field204 {
+      get { return field204_; }
+    }
+    
+    public const int Field205FieldNumber = 205;
+    private bool hasField205;
+    private string field205_ = "";
+    public bool HasField205 {
+      get { return hasField205; }
+    }
+    public string Field205 {
+      get { return field205_; }
+    }
+    
+    public const int Field207FieldNumber = 207;
+    private bool hasField207;
+    private ulong field207_ = 0UL;
+    public bool HasField207 {
+      get { return hasField207; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong Field207 {
+      get { return field207_; }
+    }
+    
+    public const int Field300FieldNumber = 300;
+    private bool hasField300;
+    private ulong field300_ = 0UL;
+    public bool HasField300 {
+      get { return hasField300; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong Field300 {
+      get { return field300_; }
+    }
+    
+    public static SizeMessage1SubMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SizeMessage1SubMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SizeMessage1SubMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SizeMessage1SubMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SizeMessage1SubMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SizeMessage1SubMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static SizeMessage1SubMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static SizeMessage1SubMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static SizeMessage1SubMessage ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SizeMessage1SubMessage ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(SizeMessage1SubMessage prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
+    public sealed partial class Builder : pb::GeneratedBuilder<SizeMessage1SubMessage, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {}
+      
+      SizeMessage1SubMessage result = new SizeMessage1SubMessage();
+      
+      protected override SizeMessage1SubMessage MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override Builder Clear() {
+        result = new SizeMessage1SubMessage();
+        return this;
+      }
+      
+      public override Builder Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.SizeMessage1SubMessage.Descriptor; }
+      }
+      
+      public override SizeMessage1SubMessage DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.SizeMessage1SubMessage.DefaultInstance; }
+      }
+      
+      public override SizeMessage1SubMessage BuildPartial() {
+        if (result == null) {
+          throw new global::System.InvalidOperationException("build() has already been called on this Builder");
+        }
+        SizeMessage1SubMessage returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      
+      public bool HasField1 {
+        get { return result.HasField1; }
+      }
+      public int Field1 {
+        get { return result.Field1; }
+        set { SetField1(value); }
+      }
+      public Builder SetField1(int value) {
+        result.hasField1 = true;
+        result.field1_ = value;
+        return this;
+      }
+      public Builder ClearField1() {
+        result.hasField1 = false;
+        result.field1_ = 0;
+        return this;
+      }
+      
+      public bool HasField2 {
+        get { return result.HasField2; }
+      }
+      public int Field2 {
+        get { return result.Field2; }
+        set { SetField2(value); }
+      }
+      public Builder SetField2(int value) {
+        result.hasField2 = true;
+        result.field2_ = value;
+        return this;
+      }
+      public Builder ClearField2() {
+        result.hasField2 = false;
+        result.field2_ = 0;
+        return this;
+      }
+      
+      public bool HasField3 {
+        get { return result.HasField3; }
+      }
+      public int Field3 {
+        get { return result.Field3; }
+        set { SetField3(value); }
+      }
+      public Builder SetField3(int value) {
+        result.hasField3 = true;
+        result.field3_ = value;
+        return this;
+      }
+      public Builder ClearField3() {
+        result.hasField3 = false;
+        result.field3_ = 0;
+        return this;
+      }
+      
+      public bool HasField15 {
+        get { return result.HasField15; }
+      }
+      public string Field15 {
+        get { return result.Field15; }
+        set { SetField15(value); }
+      }
+      public Builder SetField15(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.hasField15 = true;
+        result.field15_ = value;
+        return this;
+      }
+      public Builder ClearField15() {
+        result.hasField15 = false;
+        result.field15_ = "";
+        return this;
+      }
+      
+      public bool HasField12 {
+        get { return result.HasField12; }
+      }
+      public bool Field12 {
+        get { return result.Field12; }
+        set { SetField12(value); }
+      }
+      public Builder SetField12(bool value) {
+        result.hasField12 = true;
+        result.field12_ = value;
+        return this;
+      }
+      public Builder ClearField12() {
+        result.hasField12 = false;
+        result.field12_ = true;
+        return this;
+      }
+      
+      public bool HasField13 {
+        get { return result.HasField13; }
+      }
+      public long Field13 {
+        get { return result.Field13; }
+        set { SetField13(value); }
+      }
+      public Builder SetField13(long value) {
+        result.hasField13 = true;
+        result.field13_ = value;
+        return this;
+      }
+      public Builder ClearField13() {
+        result.hasField13 = false;
+        result.field13_ = 0L;
+        return this;
+      }
+      
+      public bool HasField14 {
+        get { return result.HasField14; }
+      }
+      public long Field14 {
+        get { return result.Field14; }
+        set { SetField14(value); }
+      }
+      public Builder SetField14(long value) {
+        result.hasField14 = true;
+        result.field14_ = value;
+        return this;
+      }
+      public Builder ClearField14() {
+        result.hasField14 = false;
+        result.field14_ = 0L;
+        return this;
+      }
+      
+      public bool HasField16 {
+        get { return result.HasField16; }
+      }
+      public int Field16 {
+        get { return result.Field16; }
+        set { SetField16(value); }
+      }
+      public Builder SetField16(int value) {
+        result.hasField16 = true;
+        result.field16_ = value;
+        return this;
+      }
+      public Builder ClearField16() {
+        result.hasField16 = false;
+        result.field16_ = 0;
+        return this;
+      }
+      
+      public bool HasField19 {
+        get { return result.HasField19; }
+      }
+      public int Field19 {
+        get { return result.Field19; }
+        set { SetField19(value); }
+      }
+      public Builder SetField19(int value) {
+        result.hasField19 = true;
+        result.field19_ = value;
+        return this;
+      }
+      public Builder ClearField19() {
+        result.hasField19 = false;
+        result.field19_ = 2;
+        return this;
+      }
+      
+      public bool HasField20 {
+        get { return result.HasField20; }
+      }
+      public bool Field20 {
+        get { return result.Field20; }
+        set { SetField20(value); }
+      }
+      public Builder SetField20(bool value) {
+        result.hasField20 = true;
+        result.field20_ = value;
+        return this;
+      }
+      public Builder ClearField20() {
+        result.hasField20 = false;
+        result.field20_ = true;
+        return this;
+      }
+      
+      public bool HasField28 {
+        get { return result.HasField28; }
+      }
+      public bool Field28 {
+        get { return result.Field28; }
+        set { SetField28(value); }
+      }
+      public Builder SetField28(bool value) {
+        result.hasField28 = true;
+        result.field28_ = value;
+        return this;
+      }
+      public Builder ClearField28() {
+        result.hasField28 = false;
+        result.field28_ = true;
+        return this;
+      }
+      
+      public bool HasField21 {
+        get { return result.HasField21; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong Field21 {
+        get { return result.Field21; }
+        set { SetField21(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetField21(ulong value) {
+        result.hasField21 = true;
+        result.field21_ = value;
+        return this;
+      }
+      public Builder ClearField21() {
+        result.hasField21 = false;
+        result.field21_ = 0;
+        return this;
+      }
+      
+      public bool HasField22 {
+        get { return result.HasField22; }
+      }
+      public int Field22 {
+        get { return result.Field22; }
+        set { SetField22(value); }
+      }
+      public Builder SetField22(int value) {
+        result.hasField22 = true;
+        result.field22_ = value;
+        return this;
+      }
+      public Builder ClearField22() {
+        result.hasField22 = false;
+        result.field22_ = 0;
+        return this;
+      }
+      
+      public bool HasField23 {
+        get { return result.HasField23; }
+      }
+      public bool Field23 {
+        get { return result.Field23; }
+        set { SetField23(value); }
+      }
+      public Builder SetField23(bool value) {
+        result.hasField23 = true;
+        result.field23_ = value;
+        return this;
+      }
+      public Builder ClearField23() {
+        result.hasField23 = false;
+        result.field23_ = false;
+        return this;
+      }
+      
+      public bool HasField206 {
+        get { return result.HasField206; }
+      }
+      public bool Field206 {
+        get { return result.Field206; }
+        set { SetField206(value); }
+      }
+      public Builder SetField206(bool value) {
+        result.hasField206 = true;
+        result.field206_ = value;
+        return this;
+      }
+      public Builder ClearField206() {
+        result.hasField206 = false;
+        result.field206_ = false;
+        return this;
+      }
+      
+      public bool HasField203 {
+        get { return result.HasField203; }
+      }
+      [global::System.CLSCompliant(false)]
+      public uint Field203 {
+        get { return result.Field203; }
+        set { SetField203(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetField203(uint value) {
+        result.hasField203 = true;
+        result.field203_ = value;
+        return this;
+      }
+      public Builder ClearField203() {
+        result.hasField203 = false;
+        result.field203_ = 0;
+        return this;
+      }
+      
+      public bool HasField204 {
+        get { return result.HasField204; }
+      }
+      public int Field204 {
+        get { return result.Field204; }
+        set { SetField204(value); }
+      }
+      public Builder SetField204(int value) {
+        result.hasField204 = true;
+        result.field204_ = value;
+        return this;
+      }
+      public Builder ClearField204() {
+        result.hasField204 = false;
+        result.field204_ = 0;
+        return this;
+      }
+      
+      public bool HasField205 {
+        get { return result.HasField205; }
+      }
+      public string Field205 {
+        get { return result.Field205; }
+        set { SetField205(value); }
+      }
+      public Builder SetField205(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.hasField205 = true;
+        result.field205_ = value;
+        return this;
+      }
+      public Builder ClearField205() {
+        result.hasField205 = false;
+        result.field205_ = "";
+        return this;
+      }
+      
+      public bool HasField207 {
+        get { return result.HasField207; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong Field207 {
+        get { return result.Field207; }
+        set { SetField207(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetField207(ulong value) {
+        result.hasField207 = true;
+        result.field207_ = value;
+        return this;
+      }
+      public Builder ClearField207() {
+        result.hasField207 = false;
+        result.field207_ = 0UL;
+        return this;
+      }
+      
+      public bool HasField300 {
+        get { return result.HasField300; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong Field300 {
+        get { return result.Field300; }
+        set { SetField300(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetField300(ulong value) {
+        result.hasField300 = true;
+        result.field300_ = value;
+        return this;
+      }
+      public Builder ClearField300() {
+        result.hasField300 = false;
+        result.field300_ = 0UL;
+        return this;
+      }
+    }
+    static SizeMessage1SubMessage() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestGoogleSizeProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+  [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
+  public sealed partial class SizeMessage2 : pb::GeneratedMessage<SizeMessage2, SizeMessage2.Builder> {
+    private static readonly SizeMessage2 defaultInstance = new Builder().BuildPartial();
+    public static SizeMessage2 DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override SizeMessage2 DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    protected override SizeMessage2 ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestGoogleSizeProtoFile.internal__static_benchmarks_SizeMessage2__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<SizeMessage2, SizeMessage2.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestGoogleSizeProtoFile.internal__static_benchmarks_SizeMessage2__FieldAccessorTable; }
+    }
+    
+    #region Nested types
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
+    public static class Types {
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+      [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
+      public sealed partial class Group1 : pb::GeneratedMessage<Group1, Group1.Builder> {
+        private static readonly Group1 defaultInstance = new Builder().BuildPartial();
+        public static Group1 DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override Group1 DefaultInstanceForType {
+          get { return defaultInstance; }
+        }
+        
+        protected override Group1 ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.ProtocolBuffers.TestProtos.UnitTestGoogleSizeProtoFile.internal__static_benchmarks_SizeMessage2_Group1__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<Group1, Group1.Builder> InternalFieldAccessors {
+          get { return global::Google.ProtocolBuffers.TestProtos.UnitTestGoogleSizeProtoFile.internal__static_benchmarks_SizeMessage2_Group1__FieldAccessorTable; }
+        }
+        
+        public const int Field11FieldNumber = 11;
+        private bool hasField11;
+        private float field11_ = 0F;
+        public bool HasField11 {
+          get { return hasField11; }
+        }
+        public float Field11 {
+          get { return field11_; }
+        }
+        
+        public const int Field26FieldNumber = 26;
+        private bool hasField26;
+        private float field26_ = 0F;
+        public bool HasField26 {
+          get { return hasField26; }
+        }
+        public float Field26 {
+          get { return field26_; }
+        }
+        
+        public const int Field12FieldNumber = 12;
+        private bool hasField12;
+        private string field12_ = "";
+        public bool HasField12 {
+          get { return hasField12; }
+        }
+        public string Field12 {
+          get { return field12_; }
+        }
+        
+        public const int Field13FieldNumber = 13;
+        private bool hasField13;
+        private string field13_ = "";
+        public bool HasField13 {
+          get { return hasField13; }
+        }
+        public string Field13 {
+          get { return field13_; }
+        }
+        
+        public const int Field14FieldNumber = 14;
+        private pbc::PopsicleList<string> field14_ = new pbc::PopsicleList<string>();
+        public scg::IList<string> Field14List {
+          get { return pbc::Lists.AsReadOnly(field14_); }
+        }
+        public int Field14Count {
+          get { return field14_.Count; }
+        }
+        public string GetField14(int index) {
+          return field14_[index];
+        }
+        
+        public const int Field15FieldNumber = 15;
+        private bool hasField15;
+        private ulong field15_ = 0UL;
+        public bool HasField15 {
+          get { return hasField15; }
+        }
+        [global::System.CLSCompliant(false)]
+        public ulong Field15 {
+          get { return field15_; }
+        }
+        
+        public const int Field5FieldNumber = 5;
+        private bool hasField5;
+        private int field5_ = 0;
+        public bool HasField5 {
+          get { return hasField5; }
+        }
+        public int Field5 {
+          get { return field5_; }
+        }
+        
+        public const int Field27FieldNumber = 27;
+        private bool hasField27;
+        private string field27_ = "";
+        public bool HasField27 {
+          get { return hasField27; }
+        }
+        public string Field27 {
+          get { return field27_; }
+        }
+        
+        public const int Field28FieldNumber = 28;
+        private bool hasField28;
+        private int field28_ = 0;
+        public bool HasField28 {
+          get { return hasField28; }
+        }
+        public int Field28 {
+          get { return field28_; }
+        }
+        
+        public const int Field29FieldNumber = 29;
+        private bool hasField29;
+        private string field29_ = "";
+        public bool HasField29 {
+          get { return hasField29; }
+        }
+        public string Field29 {
+          get { return field29_; }
+        }
+        
+        public const int Field16FieldNumber = 16;
+        private bool hasField16;
+        private string field16_ = "";
+        public bool HasField16 {
+          get { return hasField16; }
+        }
+        public string Field16 {
+          get { return field16_; }
+        }
+        
+        public const int Field22FieldNumber = 22;
+        private pbc::PopsicleList<string> field22_ = new pbc::PopsicleList<string>();
+        public scg::IList<string> Field22List {
+          get { return pbc::Lists.AsReadOnly(field22_); }
+        }
+        public int Field22Count {
+          get { return field22_.Count; }
+        }
+        public string GetField22(int index) {
+          return field22_[index];
+        }
+        
+        public const int Field73FieldNumber = 73;
+        private pbc::PopsicleList<int> field73_ = new pbc::PopsicleList<int>();
+        public scg::IList<int> Field73List {
+          get { return pbc::Lists.AsReadOnly(field73_); }
+        }
+        public int Field73Count {
+          get { return field73_.Count; }
+        }
+        public int GetField73(int index) {
+          return field73_[index];
+        }
+        
+        public const int Field20FieldNumber = 20;
+        private bool hasField20;
+        private int field20_ = 0;
+        public bool HasField20 {
+          get { return hasField20; }
+        }
+        public int Field20 {
+          get { return field20_; }
+        }
+        
+        public const int Field24FieldNumber = 24;
+        private bool hasField24;
+        private string field24_ = "";
+        public bool HasField24 {
+          get { return hasField24; }
+        }
+        public string Field24 {
+          get { return field24_; }
+        }
+        
+        public const int Field31FieldNumber = 31;
+        private bool hasField31;
+        private global::Google.ProtocolBuffers.TestProtos.SizeMessage2GroupedMessage field31_ = global::Google.ProtocolBuffers.TestProtos.SizeMessage2GroupedMessage.DefaultInstance;
+        public bool HasField31 {
+          get { return hasField31; }
+        }
+        public global::Google.ProtocolBuffers.TestProtos.SizeMessage2GroupedMessage Field31 {
+          get { return field31_; }
+        }
+        
+        public static Group1 ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static Group1 ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static Group1 ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static Group1 ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static Group1 ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static Group1 ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static Group1 ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static Group1 ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static Group1 ParseFrom(pb::CodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static Group1 ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(Group1 prototype) {
+          return (Builder) new Builder().MergeFrom(prototype);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
+        public sealed partial class Builder : pb::GeneratedBuilder<Group1, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {}
+          
+          Group1 result = new Group1();
+          
+          protected override Group1 MessageBeingBuilt {
+            get { return result; }
+          }
+          
+          public override Builder Clear() {
+            result = new Group1();
+            return this;
+          }
+          
+          public override Builder Clone() {
+            return new Builder().MergeFrom(result);
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Types.Group1.Descriptor; }
+          }
+          
+          public override Group1 DefaultInstanceForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Types.Group1.DefaultInstance; }
+          }
+          
+          public override Group1 BuildPartial() {
+            if (result == null) {
+              throw new global::System.InvalidOperationException("build() has already been called on this Builder");
+            }
+            result.field14_.MakeReadOnly();
+            result.field22_.MakeReadOnly();
+            result.field73_.MakeReadOnly();
+            Group1 returnMe = result;
+            result = null;
+            return returnMe;
+          }
+          
+          
+          public bool HasField11 {
+            get { return result.HasField11; }
+          }
+          public float Field11 {
+            get { return result.Field11; }
+            set { SetField11(value); }
+          }
+          public Builder SetField11(float value) {
+            result.hasField11 = true;
+            result.field11_ = value;
+            return this;
+          }
+          public Builder ClearField11() {
+            result.hasField11 = false;
+            result.field11_ = 0F;
+            return this;
+          }
+          
+          public bool HasField26 {
+            get { return result.HasField26; }
+          }
+          public float Field26 {
+            get { return result.Field26; }
+            set { SetField26(value); }
+          }
+          public Builder SetField26(float value) {
+            result.hasField26 = true;
+            result.field26_ = value;
+            return this;
+          }
+          public Builder ClearField26() {
+            result.hasField26 = false;
+            result.field26_ = 0F;
+            return this;
+          }
+          
+          public bool HasField12 {
+            get { return result.HasField12; }
+          }
+          public string Field12 {
+            get { return result.Field12; }
+            set { SetField12(value); }
+          }
+          public Builder SetField12(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.hasField12 = true;
+            result.field12_ = value;
+            return this;
+          }
+          public Builder ClearField12() {
+            result.hasField12 = false;
+            result.field12_ = "";
+            return this;
+          }
+          
+          public bool HasField13 {
+            get { return result.HasField13; }
+          }
+          public string Field13 {
+            get { return result.Field13; }
+            set { SetField13(value); }
+          }
+          public Builder SetField13(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.hasField13 = true;
+            result.field13_ = value;
+            return this;
+          }
+          public Builder ClearField13() {
+            result.hasField13 = false;
+            result.field13_ = "";
+            return this;
+          }
+          
+          public pbc::IPopsicleList<string> Field14List {
+            get { return result.field14_; }
+          }
+          public int Field14Count {
+            get { return result.Field14Count; }
+          }
+          public string GetField14(int index) {
+            return result.GetField14(index);
+          }
+          public Builder SetField14(int index, string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.field14_[index] = value;
+            return this;
+          }
+          public Builder AddField14(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.field14_.Add(value);
+            return this;
+          }
+          public Builder AddRangeField14(scg::IEnumerable<string> values) {
+            base.AddRange(values, result.field14_);
+            return this;
+          }
+          public Builder ClearField14() {
+            result.field14_.Clear();
+            return this;
+          }
+          
+          public bool HasField15 {
+            get { return result.HasField15; }
+          }
+          [global::System.CLSCompliant(false)]
+          public ulong Field15 {
+            get { return result.Field15; }
+            set { SetField15(value); }
+          }
+          [global::System.CLSCompliant(false)]
+          public Builder SetField15(ulong value) {
+            result.hasField15 = true;
+            result.field15_ = value;
+            return this;
+          }
+          public Builder ClearField15() {
+            result.hasField15 = false;
+            result.field15_ = 0UL;
+            return this;
+          }
+          
+          public bool HasField5 {
+            get { return result.HasField5; }
+          }
+          public int Field5 {
+            get { return result.Field5; }
+            set { SetField5(value); }
+          }
+          public Builder SetField5(int value) {
+            result.hasField5 = true;
+            result.field5_ = value;
+            return this;
+          }
+          public Builder ClearField5() {
+            result.hasField5 = false;
+            result.field5_ = 0;
+            return this;
+          }
+          
+          public bool HasField27 {
+            get { return result.HasField27; }
+          }
+          public string Field27 {
+            get { return result.Field27; }
+            set { SetField27(value); }
+          }
+          public Builder SetField27(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.hasField27 = true;
+            result.field27_ = value;
+            return this;
+          }
+          public Builder ClearField27() {
+            result.hasField27 = false;
+            result.field27_ = "";
+            return this;
+          }
+          
+          public bool HasField28 {
+            get { return result.HasField28; }
+          }
+          public int Field28 {
+            get { return result.Field28; }
+            set { SetField28(value); }
+          }
+          public Builder SetField28(int value) {
+            result.hasField28 = true;
+            result.field28_ = value;
+            return this;
+          }
+          public Builder ClearField28() {
+            result.hasField28 = false;
+            result.field28_ = 0;
+            return this;
+          }
+          
+          public bool HasField29 {
+            get { return result.HasField29; }
+          }
+          public string Field29 {
+            get { return result.Field29; }
+            set { SetField29(value); }
+          }
+          public Builder SetField29(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.hasField29 = true;
+            result.field29_ = value;
+            return this;
+          }
+          public Builder ClearField29() {
+            result.hasField29 = false;
+            result.field29_ = "";
+            return this;
+          }
+          
+          public bool HasField16 {
+            get { return result.HasField16; }
+          }
+          public string Field16 {
+            get { return result.Field16; }
+            set { SetField16(value); }
+          }
+          public Builder SetField16(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.hasField16 = true;
+            result.field16_ = value;
+            return this;
+          }
+          public Builder ClearField16() {
+            result.hasField16 = false;
+            result.field16_ = "";
+            return this;
+          }
+          
+          public pbc::IPopsicleList<string> Field22List {
+            get { return result.field22_; }
+          }
+          public int Field22Count {
+            get { return result.Field22Count; }
+          }
+          public string GetField22(int index) {
+            return result.GetField22(index);
+          }
+          public Builder SetField22(int index, string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.field22_[index] = value;
+            return this;
+          }
+          public Builder AddField22(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.field22_.Add(value);
+            return this;
+          }
+          public Builder AddRangeField22(scg::IEnumerable<string> values) {
+            base.AddRange(values, result.field22_);
+            return this;
+          }
+          public Builder ClearField22() {
+            result.field22_.Clear();
+            return this;
+          }
+          
+          public pbc::IPopsicleList<int> Field73List {
+            get { return result.field73_; }
+          }
+          public int Field73Count {
+            get { return result.Field73Count; }
+          }
+          public int GetField73(int index) {
+            return result.GetField73(index);
+          }
+          public Builder SetField73(int index, int value) {
+            result.field73_[index] = value;
+            return this;
+          }
+          public Builder AddField73(int value) {
+            result.field73_.Add(value);
+            return this;
+          }
+          public Builder AddRangeField73(scg::IEnumerable<int> values) {
+            base.AddRange(values, result.field73_);
+            return this;
+          }
+          public Builder ClearField73() {
+            result.field73_.Clear();
+            return this;
+          }
+          
+          public bool HasField20 {
+            get { return result.HasField20; }
+          }
+          public int Field20 {
+            get { return result.Field20; }
+            set { SetField20(value); }
+          }
+          public Builder SetField20(int value) {
+            result.hasField20 = true;
+            result.field20_ = value;
+            return this;
+          }
+          public Builder ClearField20() {
+            result.hasField20 = false;
+            result.field20_ = 0;
+            return this;
+          }
+          
+          public bool HasField24 {
+            get { return result.HasField24; }
+          }
+          public string Field24 {
+            get { return result.Field24; }
+            set { SetField24(value); }
+          }
+          public Builder SetField24(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.hasField24 = true;
+            result.field24_ = value;
+            return this;
+          }
+          public Builder ClearField24() {
+            result.hasField24 = false;
+            result.field24_ = "";
+            return this;
+          }
+          
+          public bool HasField31 {
+           get { return result.HasField31; }
+          }
+          public global::Google.ProtocolBuffers.TestProtos.SizeMessage2GroupedMessage Field31 {
+            get { return result.Field31; }
+            set { SetField31(value); }
+          }
+          public Builder SetField31(global::Google.ProtocolBuffers.TestProtos.SizeMessage2GroupedMessage value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.hasField31 = true;
+            result.field31_ = value;
+            return this;
+          }
+          public Builder SetField31(global::Google.ProtocolBuffers.TestProtos.SizeMessage2GroupedMessage.Builder builderForValue) {
+            pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+            result.hasField31 = true;
+            result.field31_ = builderForValue.Build();
+            return this;
+          }
+          public Builder MergeField31(global::Google.ProtocolBuffers.TestProtos.SizeMessage2GroupedMessage value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            if (result.HasField31 &&
+                result.field31_ != global::Google.ProtocolBuffers.TestProtos.SizeMessage2GroupedMessage.DefaultInstance) {
+                result.field31_ = global::Google.ProtocolBuffers.TestProtos.SizeMessage2GroupedMessage.CreateBuilder(result.field31_).MergeFrom(value).BuildPartial();
+            } else {
+              result.field31_ = value;
+            }
+            result.hasField31 = true;
+            return this;
+          }
+          public Builder ClearField31() {
+            result.hasField31 = false;
+            result.field31_ = global::Google.ProtocolBuffers.TestProtos.SizeMessage2GroupedMessage.DefaultInstance;
+            return this;
+          }
+        }
+        static Group1() {
+          object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestGoogleSizeProtoFile.Descriptor, null);
+        }
+      }
+      
+    }
+    #endregion
+    
+    public const int Field1FieldNumber = 1;
+    private bool hasField1;
+    private string field1_ = "";
+    public bool HasField1 {
+      get { return hasField1; }
+    }
+    public string Field1 {
+      get { return field1_; }
+    }
+    
+    public const int Field3FieldNumber = 3;
+    private bool hasField3;
+    private long field3_ = 0L;
+    public bool HasField3 {
+      get { return hasField3; }
+    }
+    public long Field3 {
+      get { return field3_; }
+    }
+    
+    public const int Field4FieldNumber = 4;
+    private bool hasField4;
+    private long field4_ = 0L;
+    public bool HasField4 {
+      get { return hasField4; }
+    }
+    public long Field4 {
+      get { return field4_; }
+    }
+    
+    public const int Field30FieldNumber = 30;
+    private bool hasField30;
+    private long field30_ = 0L;
+    public bool HasField30 {
+      get { return hasField30; }
+    }
+    public long Field30 {
+      get { return field30_; }
+    }
+    
+    public const int Field75FieldNumber = 75;
+    private bool hasField75;
+    private bool field75_ = false;
+    public bool HasField75 {
+      get { return hasField75; }
+    }
+    public bool Field75 {
+      get { return field75_; }
+    }
+    
+    public const int Field6FieldNumber = 6;
+    private bool hasField6;
+    private string field6_ = "";
+    public bool HasField6 {
+      get { return hasField6; }
+    }
+    public string Field6 {
+      get { return field6_; }
+    }
+    
+    public const int Field2FieldNumber = 2;
+    private bool hasField2;
+    private pb::ByteString field2_ = pb::ByteString.Empty;
+    public bool HasField2 {
+      get { return hasField2; }
+    }
+    public pb::ByteString Field2 {
+      get { return field2_; }
+    }
+    
+    public const int Field21FieldNumber = 21;
+    private bool hasField21;
+    private int field21_ = 0;
+    public bool HasField21 {
+      get { return hasField21; }
+    }
+    public int Field21 {
+      get { return field21_; }
+    }
+    
+    public const int Field71FieldNumber = 71;
+    private bool hasField71;
+    private int field71_ = 0;
+    public bool HasField71 {
+      get { return hasField71; }
+    }
+    public int Field71 {
+      get { return field71_; }
+    }
+    
+    public const int Field25FieldNumber = 25;
+    private bool hasField25;
+    private float field25_ = 0F;
+    public bool HasField25 {
+      get { return hasField25; }
+    }
+    public float Field25 {
+      get { return field25_; }
+    }
+    
+    public const int Field109FieldNumber = 109;
+    private bool hasField109;
+    private int field109_ = 0;
+    public bool HasField109 {
+      get { return hasField109; }
+    }
+    public int Field109 {
+      get { return field109_; }
+    }
+    
+    public const int Field210FieldNumber = 210;
+    private bool hasField210;
+    private int field210_ = 0;
+    public bool HasField210 {
+      get { return hasField210; }
+    }
+    public int Field210 {
+      get { return field210_; }
+    }
+    
+    public const int Field211FieldNumber = 211;
+    private bool hasField211;
+    private int field211_ = 0;
+    public bool HasField211 {
+      get { return hasField211; }
+    }
+    public int Field211 {
+      get { return field211_; }
+    }
+    
+    public const int Field212FieldNumber = 212;
+    private bool hasField212;
+    private int field212_ = 0;
+    public bool HasField212 {
+      get { return hasField212; }
+    }
+    public int Field212 {
+      get { return field212_; }
+    }
+    
+    public const int Field213FieldNumber = 213;
+    private bool hasField213;
+    private int field213_ = 0;
+    public bool HasField213 {
+      get { return hasField213; }
+    }
+    public int Field213 {
+      get { return field213_; }
+    }
+    
+    public const int Field216FieldNumber = 216;
+    private bool hasField216;
+    private int field216_ = 0;
+    public bool HasField216 {
+      get { return hasField216; }
+    }
+    public int Field216 {
+      get { return field216_; }
+    }
+    
+    public const int Field217FieldNumber = 217;
+    private bool hasField217;
+    private int field217_ = 0;
+    public bool HasField217 {
+      get { return hasField217; }
+    }
+    public int Field217 {
+      get { return field217_; }
+    }
+    
+    public const int Field218FieldNumber = 218;
+    private bool hasField218;
+    private int field218_ = 0;
+    public bool HasField218 {
+      get { return hasField218; }
+    }
+    public int Field218 {
+      get { return field218_; }
+    }
+    
+    public const int Field220FieldNumber = 220;
+    private bool hasField220;
+    private int field220_ = 0;
+    public bool HasField220 {
+      get { return hasField220; }
+    }
+    public int Field220 {
+      get { return field220_; }
+    }
+    
+    public const int Field221FieldNumber = 221;
+    private bool hasField221;
+    private int field221_ = 0;
+    public bool HasField221 {
+      get { return hasField221; }
+    }
+    public int Field221 {
+      get { return field221_; }
+    }
+    
+    public const int Field222FieldNumber = 222;
+    private bool hasField222;
+    private float field222_ = 0F;
+    public bool HasField222 {
+      get { return hasField222; }
+    }
+    public float Field222 {
+      get { return field222_; }
+    }
+    
+    public const int Field63FieldNumber = 63;
+    private bool hasField63;
+    private int field63_ = 0;
+    public bool HasField63 {
+      get { return hasField63; }
+    }
+    public int Field63 {
+      get { return field63_; }
+    }
+    
+    public const int Group1FieldNumber = 10;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Types.Group1> group1_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Types.Group1>();
+    public scg::IList<global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Types.Group1> Group1List {
+      get { return group1_; }
+    }
+    public int Group1Count {
+      get { return group1_.Count; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Types.Group1 GetGroup1(int index) {
+      return group1_[index];
+    }
+    
+    public const int Field128FieldNumber = 128;
+    private pbc::PopsicleList<string> field128_ = new pbc::PopsicleList<string>();
+    public scg::IList<string> Field128List {
+      get { return pbc::Lists.AsReadOnly(field128_); }
+    }
+    public int Field128Count {
+      get { return field128_.Count; }
+    }
+    public string GetField128(int index) {
+      return field128_[index];
+    }
+    
+    public const int Field131FieldNumber = 131;
+    private bool hasField131;
+    private long field131_ = 0L;
+    public bool HasField131 {
+      get { return hasField131; }
+    }
+    public long Field131 {
+      get { return field131_; }
+    }
+    
+    public const int Field127FieldNumber = 127;
+    private pbc::PopsicleList<string> field127_ = new pbc::PopsicleList<string>();
+    public scg::IList<string> Field127List {
+      get { return pbc::Lists.AsReadOnly(field127_); }
+    }
+    public int Field127Count {
+      get { return field127_.Count; }
+    }
+    public string GetField127(int index) {
+      return field127_[index];
+    }
+    
+    public const int Field129FieldNumber = 129;
+    private bool hasField129;
+    private int field129_ = 0;
+    public bool HasField129 {
+      get { return hasField129; }
+    }
+    public int Field129 {
+      get { return field129_; }
+    }
+    
+    public const int Field130FieldNumber = 130;
+    private pbc::PopsicleList<long> field130_ = new pbc::PopsicleList<long>();
+    public scg::IList<long> Field130List {
+      get { return pbc::Lists.AsReadOnly(field130_); }
+    }
+    public int Field130Count {
+      get { return field130_.Count; }
+    }
+    public long GetField130(int index) {
+      return field130_[index];
+    }
+    
+    public const int Field205FieldNumber = 205;
+    private bool hasField205;
+    private bool field205_ = false;
+    public bool HasField205 {
+      get { return hasField205; }
+    }
+    public bool Field205 {
+      get { return field205_; }
+    }
+    
+    public const int Field206FieldNumber = 206;
+    private bool hasField206;
+    private bool field206_ = false;
+    public bool HasField206 {
+      get { return hasField206; }
+    }
+    public bool Field206 {
+      get { return field206_; }
+    }
+    
+    public static SizeMessage2 ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SizeMessage2 ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SizeMessage2 ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SizeMessage2 ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SizeMessage2 ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SizeMessage2 ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static SizeMessage2 ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static SizeMessage2 ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static SizeMessage2 ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SizeMessage2 ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(SizeMessage2 prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
+    public sealed partial class Builder : pb::GeneratedBuilder<SizeMessage2, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {}
+      
+      SizeMessage2 result = new SizeMessage2();
+      
+      protected override SizeMessage2 MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override Builder Clear() {
+        result = new SizeMessage2();
+        return this;
+      }
+      
+      public override Builder Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Descriptor; }
+      }
+      
+      public override SizeMessage2 DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.SizeMessage2.DefaultInstance; }
+      }
+      
+      public override SizeMessage2 BuildPartial() {
+        if (result == null) {
+          throw new global::System.InvalidOperationException("build() has already been called on this Builder");
+        }
+        result.group1_.MakeReadOnly();
+        result.field128_.MakeReadOnly();
+        result.field127_.MakeReadOnly();
+        result.field130_.MakeReadOnly();
+        SizeMessage2 returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      
+      public bool HasField1 {
+        get { return result.HasField1; }
+      }
+      public string Field1 {
+        get { return result.Field1; }
+        set { SetField1(value); }
+      }
+      public Builder SetField1(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.hasField1 = true;
+        result.field1_ = value;
+        return this;
+      }
+      public Builder ClearField1() {
+        result.hasField1 = false;
+        result.field1_ = "";
+        return this;
+      }
+      
+      public bool HasField3 {
+        get { return result.HasField3; }
+      }
+      public long Field3 {
+        get { return result.Field3; }
+        set { SetField3(value); }
+      }
+      public Builder SetField3(long value) {
+        result.hasField3 = true;
+        result.field3_ = value;
+        return this;
+      }
+      public Builder ClearField3() {
+        result.hasField3 = false;
+        result.field3_ = 0L;
+        return this;
+      }
+      
+      public bool HasField4 {
+        get { return result.HasField4; }
+      }
+      public long Field4 {
+        get { return result.Field4; }
+        set { SetField4(value); }
+      }
+      public Builder SetField4(long value) {
+        result.hasField4 = true;
+        result.field4_ = value;
+        return this;
+      }
+      public Builder ClearField4() {
+        result.hasField4 = false;
+        result.field4_ = 0L;
+        return this;
+      }
+      
+      public bool HasField30 {
+        get { return result.HasField30; }
+      }
+      public long Field30 {
+        get { return result.Field30; }
+        set { SetField30(value); }
+      }
+      public Builder SetField30(long value) {
+        result.hasField30 = true;
+        result.field30_ = value;
+        return this;
+      }
+      public Builder ClearField30() {
+        result.hasField30 = false;
+        result.field30_ = 0L;
+        return this;
+      }
+      
+      public bool HasField75 {
+        get { return result.HasField75; }
+      }
+      public bool Field75 {
+        get { return result.Field75; }
+        set { SetField75(value); }
+      }
+      public Builder SetField75(bool value) {
+        result.hasField75 = true;
+        result.field75_ = value;
+        return this;
+      }
+      public Builder ClearField75() {
+        result.hasField75 = false;
+        result.field75_ = false;
+        return this;
+      }
+      
+      public bool HasField6 {
+        get { return result.HasField6; }
+      }
+      public string Field6 {
+        get { return result.Field6; }
+        set { SetField6(value); }
+      }
+      public Builder SetField6(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.hasField6 = true;
+        result.field6_ = value;
+        return this;
+      }
+      public Builder ClearField6() {
+        result.hasField6 = false;
+        result.field6_ = "";
+        return this;
+      }
+      
+      public bool HasField2 {
+        get { return result.HasField2; }
+      }
+      public pb::ByteString Field2 {
+        get { return result.Field2; }
+        set { SetField2(value); }
+      }
+      public Builder SetField2(pb::ByteString value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.hasField2 = true;
+        result.field2_ = value;
+        return this;
+      }
+      public Builder ClearField2() {
+        result.hasField2 = false;
+        result.field2_ = pb::ByteString.Empty;
+        return this;
+      }
+      
+      public bool HasField21 {
+        get { return result.HasField21; }
+      }
+      public int Field21 {
+        get { return result.Field21; }
+        set { SetField21(value); }
+      }
+      public Builder SetField21(int value) {
+        result.hasField21 = true;
+        result.field21_ = value;
+        return this;
+      }
+      public Builder ClearField21() {
+        result.hasField21 = false;
+        result.field21_ = 0;
+        return this;
+      }
+      
+      public bool HasField71 {
+        get { return result.HasField71; }
+      }
+      public int Field71 {
+        get { return result.Field71; }
+        set { SetField71(value); }
+      }
+      public Builder SetField71(int value) {
+        result.hasField71 = true;
+        result.field71_ = value;
+        return this;
+      }
+      public Builder ClearField71() {
+        result.hasField71 = false;
+        result.field71_ = 0;
+        return this;
+      }
+      
+      public bool HasField25 {
+        get { return result.HasField25; }
+      }
+      public float Field25 {
+        get { return result.Field25; }
+        set { SetField25(value); }
+      }
+      public Builder SetField25(float value) {
+        result.hasField25 = true;
+        result.field25_ = value;
+        return this;
+      }
+      public Builder ClearField25() {
+        result.hasField25 = false;
+        result.field25_ = 0F;
+        return this;
+      }
+      
+      public bool HasField109 {
+        get { return result.HasField109; }
+      }
+      public int Field109 {
+        get { return result.Field109; }
+        set { SetField109(value); }
+      }
+      public Builder SetField109(int value) {
+        result.hasField109 = true;
+        result.field109_ = value;
+        return this;
+      }
+      public Builder ClearField109() {
+        result.hasField109 = false;
+        result.field109_ = 0;
+        return this;
+      }
+      
+      public bool HasField210 {
+        get { return result.HasField210; }
+      }
+      public int Field210 {
+        get { return result.Field210; }
+        set { SetField210(value); }
+      }
+      public Builder SetField210(int value) {
+        result.hasField210 = true;
+        result.field210_ = value;
+        return this;
+      }
+      public Builder ClearField210() {
+        result.hasField210 = false;
+        result.field210_ = 0;
+        return this;
+      }
+      
+      public bool HasField211 {
+        get { return result.HasField211; }
+      }
+      public int Field211 {
+        get { return result.Field211; }
+        set { SetField211(value); }
+      }
+      public Builder SetField211(int value) {
+        result.hasField211 = true;
+        result.field211_ = value;
+        return this;
+      }
+      public Builder ClearField211() {
+        result.hasField211 = false;
+        result.field211_ = 0;
+        return this;
+      }
+      
+      public bool HasField212 {
+        get { return result.HasField212; }
+      }
+      public int Field212 {
+        get { return result.Field212; }
+        set { SetField212(value); }
+      }
+      public Builder SetField212(int value) {
+        result.hasField212 = true;
+        result.field212_ = value;
+        return this;
+      }
+      public Builder ClearField212() {
+        result.hasField212 = false;
+        result.field212_ = 0;
+        return this;
+      }
+      
+      public bool HasField213 {
+        get { return result.HasField213; }
+      }
+      public int Field213 {
+        get { return result.Field213; }
+        set { SetField213(value); }
+      }
+      public Builder SetField213(int value) {
+        result.hasField213 = true;
+        result.field213_ = value;
+        return this;
+      }
+      public Builder ClearField213() {
+        result.hasField213 = false;
+        result.field213_ = 0;
+        return this;
+      }
+      
+      public bool HasField216 {
+        get { return result.HasField216; }
+      }
+      public int Field216 {
+        get { return result.Field216; }
+        set { SetField216(value); }
+      }
+      public Builder SetField216(int value) {
+        result.hasField216 = true;
+        result.field216_ = value;
+        return this;
+      }
+      public Builder ClearField216() {
+        result.hasField216 = false;
+        result.field216_ = 0;
+        return this;
+      }
+      
+      public bool HasField217 {
+        get { return result.HasField217; }
+      }
+      public int Field217 {
+        get { return result.Field217; }
+        set { SetField217(value); }
+      }
+      public Builder SetField217(int value) {
+        result.hasField217 = true;
+        result.field217_ = value;
+        return this;
+      }
+      public Builder ClearField217() {
+        result.hasField217 = false;
+        result.field217_ = 0;
+        return this;
+      }
+      
+      public bool HasField218 {
+        get { return result.HasField218; }
+      }
+      public int Field218 {
+        get { return result.Field218; }
+        set { SetField218(value); }
+      }
+      public Builder SetField218(int value) {
+        result.hasField218 = true;
+        result.field218_ = value;
+        return this;
+      }
+      public Builder ClearField218() {
+        result.hasField218 = false;
+        result.field218_ = 0;
+        return this;
+      }
+      
+      public bool HasField220 {
+        get { return result.HasField220; }
+      }
+      public int Field220 {
+        get { return result.Field220; }
+        set { SetField220(value); }
+      }
+      public Builder SetField220(int value) {
+        result.hasField220 = true;
+        result.field220_ = value;
+        return this;
+      }
+      public Builder ClearField220() {
+        result.hasField220 = false;
+        result.field220_ = 0;
+        return this;
+      }
+      
+      public bool HasField221 {
+        get { return result.HasField221; }
+      }
+      public int Field221 {
+        get { return result.Field221; }
+        set { SetField221(value); }
+      }
+      public Builder SetField221(int value) {
+        result.hasField221 = true;
+        result.field221_ = value;
+        return this;
+      }
+      public Builder ClearField221() {
+        result.hasField221 = false;
+        result.field221_ = 0;
+        return this;
+      }
+      
+      public bool HasField222 {
+        get { return result.HasField222; }
+      }
+      public float Field222 {
+        get { return result.Field222; }
+        set { SetField222(value); }
+      }
+      public Builder SetField222(float value) {
+        result.hasField222 = true;
+        result.field222_ = value;
+        return this;
+      }
+      public Builder ClearField222() {
+        result.hasField222 = false;
+        result.field222_ = 0F;
+        return this;
+      }
+      
+      public bool HasField63 {
+        get { return result.HasField63; }
+      }
+      public int Field63 {
+        get { return result.Field63; }
+        set { SetField63(value); }
+      }
+      public Builder SetField63(int value) {
+        result.hasField63 = true;
+        result.field63_ = value;
+        return this;
+      }
+      public Builder ClearField63() {
+        result.hasField63 = false;
+        result.field63_ = 0;
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Types.Group1> Group1List {
+        get { return result.group1_; }
+      }
+      public int Group1Count {
+        get { return result.Group1Count; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Types.Group1 GetGroup1(int index) {
+        return result.GetGroup1(index);
+      }
+      public Builder SetGroup1(int index, global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Types.Group1 value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.group1_[index] = value;
+        return this;
+      }
+      public Builder SetGroup1(int index, global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Types.Group1.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        result.group1_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddGroup1(global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Types.Group1 value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.group1_.Add(value);
+        return this;
+      }
+      public Builder AddGroup1(global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Types.Group1.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        result.group1_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeGroup1(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.SizeMessage2.Types.Group1> values) {
+        base.AddRange(values, result.group1_);
+        return this;
+      }
+      public Builder ClearGroup1() {
+        result.group1_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<string> Field128List {
+        get { return result.field128_; }
+      }
+      public int Field128Count {
+        get { return result.Field128Count; }
+      }
+      public string GetField128(int index) {
+        return result.GetField128(index);
+      }
+      public Builder SetField128(int index, string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.field128_[index] = value;
+        return this;
+      }
+      public Builder AddField128(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.field128_.Add(value);
+        return this;
+      }
+      public Builder AddRangeField128(scg::IEnumerable<string> values) {
+        base.AddRange(values, result.field128_);
+        return this;
+      }
+      public Builder ClearField128() {
+        result.field128_.Clear();
+        return this;
+      }
+      
+      public bool HasField131 {
+        get { return result.HasField131; }
+      }
+      public long Field131 {
+        get { return result.Field131; }
+        set { SetField131(value); }
+      }
+      public Builder SetField131(long value) {
+        result.hasField131 = true;
+        result.field131_ = value;
+        return this;
+      }
+      public Builder ClearField131() {
+        result.hasField131 = false;
+        result.field131_ = 0L;
+        return this;
+      }
+      
+      public pbc::IPopsicleList<string> Field127List {
+        get { return result.field127_; }
+      }
+      public int Field127Count {
+        get { return result.Field127Count; }
+      }
+      public string GetField127(int index) {
+        return result.GetField127(index);
+      }
+      public Builder SetField127(int index, string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.field127_[index] = value;
+        return this;
+      }
+      public Builder AddField127(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.field127_.Add(value);
+        return this;
+      }
+      public Builder AddRangeField127(scg::IEnumerable<string> values) {
+        base.AddRange(values, result.field127_);
+        return this;
+      }
+      public Builder ClearField127() {
+        result.field127_.Clear();
+        return this;
+      }
+      
+      public bool HasField129 {
+        get { return result.HasField129; }
+      }
+      public int Field129 {
+        get { return result.Field129; }
+        set { SetField129(value); }
+      }
+      public Builder SetField129(int value) {
+        result.hasField129 = true;
+        result.field129_ = value;
+        return this;
+      }
+      public Builder ClearField129() {
+        result.hasField129 = false;
+        result.field129_ = 0;
+        return this;
+      }
+      
+      public pbc::IPopsicleList<long> Field130List {
+        get { return result.field130_; }
+      }
+      public int Field130Count {
+        get { return result.Field130Count; }
+      }
+      public long GetField130(int index) {
+        return result.GetField130(index);
+      }
+      public Builder SetField130(int index, long value) {
+        result.field130_[index] = value;
+        return this;
+      }
+      public Builder AddField130(long value) {
+        result.field130_.Add(value);
+        return this;
+      }
+      public Builder AddRangeField130(scg::IEnumerable<long> values) {
+        base.AddRange(values, result.field130_);
+        return this;
+      }
+      public Builder ClearField130() {
+        result.field130_.Clear();
+        return this;
+      }
+      
+      public bool HasField205 {
+        get { return result.HasField205; }
+      }
+      public bool Field205 {
+        get { return result.Field205; }
+        set { SetField205(value); }
+      }
+      public Builder SetField205(bool value) {
+        result.hasField205 = true;
+        result.field205_ = value;
+        return this;
+      }
+      public Builder ClearField205() {
+        result.hasField205 = false;
+        result.field205_ = false;
+        return this;
+      }
+      
+      public bool HasField206 {
+        get { return result.HasField206; }
+      }
+      public bool Field206 {
+        get { return result.Field206; }
+        set { SetField206(value); }
+      }
+      public Builder SetField206(bool value) {
+        result.hasField206 = true;
+        result.field206_ = value;
+        return this;
+      }
+      public Builder ClearField206() {
+        result.hasField206 = false;
+        result.field206_ = false;
+        return this;
+      }
+    }
+    static SizeMessage2() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestGoogleSizeProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+  [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
+  public sealed partial class SizeMessage2GroupedMessage : pb::GeneratedMessage<SizeMessage2GroupedMessage, SizeMessage2GroupedMessage.Builder> {
+    private static readonly SizeMessage2GroupedMessage defaultInstance = new Builder().BuildPartial();
+    public static SizeMessage2GroupedMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override SizeMessage2GroupedMessage DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    protected override SizeMessage2GroupedMessage ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestGoogleSizeProtoFile.internal__static_benchmarks_SizeMessage2GroupedMessage__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<SizeMessage2GroupedMessage, SizeMessage2GroupedMessage.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestGoogleSizeProtoFile.internal__static_benchmarks_SizeMessage2GroupedMessage__FieldAccessorTable; }
+    }
+    
+    public const int Field1FieldNumber = 1;
+    private bool hasField1;
+    private float field1_ = 0F;
+    public bool HasField1 {
+      get { return hasField1; }
+    }
+    public float Field1 {
+      get { return field1_; }
+    }
+    
+    public const int Field2FieldNumber = 2;
+    private bool hasField2;
+    private float field2_ = 0F;
+    public bool HasField2 {
+      get { return hasField2; }
+    }
+    public float Field2 {
+      get { return field2_; }
+    }
+    
+    public const int Field3FieldNumber = 3;
+    private bool hasField3;
+    private float field3_ = 0F;
+    public bool HasField3 {
+      get { return hasField3; }
+    }
+    public float Field3 {
+      get { return field3_; }
+    }
+    
+    public const int Field4FieldNumber = 4;
+    private bool hasField4;
+    private bool field4_ = false;
+    public bool HasField4 {
+      get { return hasField4; }
+    }
+    public bool Field4 {
+      get { return field4_; }
+    }
+    
+    public const int Field5FieldNumber = 5;
+    private bool hasField5;
+    private bool field5_ = false;
+    public bool HasField5 {
+      get { return hasField5; }
+    }
+    public bool Field5 {
+      get { return field5_; }
+    }
+    
+    public const int Field6FieldNumber = 6;
+    private bool hasField6;
+    private bool field6_ = true;
+    public bool HasField6 {
+      get { return hasField6; }
+    }
+    public bool Field6 {
+      get { return field6_; }
+    }
+    
+    public const int Field7FieldNumber = 7;
+    private bool hasField7;
+    private bool field7_ = false;
+    public bool HasField7 {
+      get { return hasField7; }
+    }
+    public bool Field7 {
+      get { return field7_; }
+    }
+    
+    public const int Field8FieldNumber = 8;
+    private bool hasField8;
+    private float field8_ = 0F;
+    public bool HasField8 {
+      get { return hasField8; }
+    }
+    public float Field8 {
+      get { return field8_; }
+    }
+    
+    public const int Field9FieldNumber = 9;
+    private bool hasField9;
+    private bool field9_ = false;
+    public bool HasField9 {
+      get { return hasField9; }
+    }
+    public bool Field9 {
+      get { return field9_; }
+    }
+    
+    public const int Field10FieldNumber = 10;
+    private bool hasField10;
+    private float field10_ = 0F;
+    public bool HasField10 {
+      get { return hasField10; }
+    }
+    public float Field10 {
+      get { return field10_; }
+    }
+    
+    public const int Field11FieldNumber = 11;
+    private bool hasField11;
+    private long field11_ = 0L;
+    public bool HasField11 {
+      get { return hasField11; }
+    }
+    public long Field11 {
+      get { return field11_; }
+    }
+    
+    public static SizeMessage2GroupedMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SizeMessage2GroupedMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SizeMessage2GroupedMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SizeMessage2GroupedMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SizeMessage2GroupedMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SizeMessage2GroupedMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static SizeMessage2GroupedMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static SizeMessage2GroupedMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static SizeMessage2GroupedMessage ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SizeMessage2GroupedMessage ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(SizeMessage2GroupedMessage prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
+    public sealed partial class Builder : pb::GeneratedBuilder<SizeMessage2GroupedMessage, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {}
+      
+      SizeMessage2GroupedMessage result = new SizeMessage2GroupedMessage();
+      
+      protected override SizeMessage2GroupedMessage MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override Builder Clear() {
+        result = new SizeMessage2GroupedMessage();
+        return this;
+      }
+      
+      public override Builder Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.SizeMessage2GroupedMessage.Descriptor; }
+      }
+      
+      public override SizeMessage2GroupedMessage DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.SizeMessage2GroupedMessage.DefaultInstance; }
+      }
+      
+      public override SizeMessage2GroupedMessage BuildPartial() {
+        if (result == null) {
+          throw new global::System.InvalidOperationException("build() has already been called on this Builder");
+        }
+        SizeMessage2GroupedMessage returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      
+      public bool HasField1 {
+        get { return result.HasField1; }
+      }
+      public float Field1 {
+        get { return result.Field1; }
+        set { SetField1(value); }
+      }
+      public Builder SetField1(float value) {
+        result.hasField1 = true;
+        result.field1_ = value;
+        return this;
+      }
+      public Builder ClearField1() {
+        result.hasField1 = false;
+        result.field1_ = 0F;
+        return this;
+      }
+      
+      public bool HasField2 {
+        get { return result.HasField2; }
+      }
+      public float Field2 {
+        get { return result.Field2; }
+        set { SetField2(value); }
+      }
+      public Builder SetField2(float value) {
+        result.hasField2 = true;
+        result.field2_ = value;
+        return this;
+      }
+      public Builder ClearField2() {
+        result.hasField2 = false;
+        result.field2_ = 0F;
+        return this;
+      }
+      
+      public bool HasField3 {
+        get { return result.HasField3; }
+      }
+      public float Field3 {
+        get { return result.Field3; }
+        set { SetField3(value); }
+      }
+      public Builder SetField3(float value) {
+        result.hasField3 = true;
+        result.field3_ = value;
+        return this;
+      }
+      public Builder ClearField3() {
+        result.hasField3 = false;
+        result.field3_ = 0F;
+        return this;
+      }
+      
+      public bool HasField4 {
+        get { return result.HasField4; }
+      }
+      public bool Field4 {
+        get { return result.Field4; }
+        set { SetField4(value); }
+      }
+      public Builder SetField4(bool value) {
+        result.hasField4 = true;
+        result.field4_ = value;
+        return this;
+      }
+      public Builder ClearField4() {
+        result.hasField4 = false;
+        result.field4_ = false;
+        return this;
+      }
+      
+      public bool HasField5 {
+        get { return result.HasField5; }
+      }
+      public bool Field5 {
+        get { return result.Field5; }
+        set { SetField5(value); }
+      }
+      public Builder SetField5(bool value) {
+        result.hasField5 = true;
+        result.field5_ = value;
+        return this;
+      }
+      public Builder ClearField5() {
+        result.hasField5 = false;
+        result.field5_ = false;
+        return this;
+      }
+      
+      public bool HasField6 {
+        get { return result.HasField6; }
+      }
+      public bool Field6 {
+        get { return result.Field6; }
+        set { SetField6(value); }
+      }
+      public Builder SetField6(bool value) {
+        result.hasField6 = true;
+        result.field6_ = value;
+        return this;
+      }
+      public Builder ClearField6() {
+        result.hasField6 = false;
+        result.field6_ = true;
+        return this;
+      }
+      
+      public bool HasField7 {
+        get { return result.HasField7; }
+      }
+      public bool Field7 {
+        get { return result.Field7; }
+        set { SetField7(value); }
+      }
+      public Builder SetField7(bool value) {
+        result.hasField7 = true;
+        result.field7_ = value;
+        return this;
+      }
+      public Builder ClearField7() {
+        result.hasField7 = false;
+        result.field7_ = false;
+        return this;
+      }
+      
+      public bool HasField8 {
+        get { return result.HasField8; }
+      }
+      public float Field8 {
+        get { return result.Field8; }
+        set { SetField8(value); }
+      }
+      public Builder SetField8(float value) {
+        result.hasField8 = true;
+        result.field8_ = value;
+        return this;
+      }
+      public Builder ClearField8() {
+        result.hasField8 = false;
+        result.field8_ = 0F;
+        return this;
+      }
+      
+      public bool HasField9 {
+        get { return result.HasField9; }
+      }
+      public bool Field9 {
+        get { return result.Field9; }
+        set { SetField9(value); }
+      }
+      public Builder SetField9(bool value) {
+        result.hasField9 = true;
+        result.field9_ = value;
+        return this;
+      }
+      public Builder ClearField9() {
+        result.hasField9 = false;
+        result.field9_ = false;
+        return this;
+      }
+      
+      public bool HasField10 {
+        get { return result.HasField10; }
+      }
+      public float Field10 {
+        get { return result.Field10; }
+        set { SetField10(value); }
+      }
+      public Builder SetField10(float value) {
+        result.hasField10 = true;
+        result.field10_ = value;
+        return this;
+      }
+      public Builder ClearField10() {
+        result.hasField10 = false;
+        result.field10_ = 0F;
+        return this;
+      }
+      
+      public bool HasField11 {
+        get { return result.HasField11; }
+      }
+      public long Field11 {
+        get { return result.Field11; }
+        set { SetField11(value); }
+      }
+      public Builder SetField11(long value) {
+        result.hasField11 = true;
+        result.field11_ = value;
+        return this;
+      }
+      public Builder ClearField11() {
+        result.hasField11 = false;
+        result.field11_ = 0L;
+        return this;
+      }
+    }
+    static SizeMessage2GroupedMessage() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestGoogleSizeProtoFile.Descriptor, null);
+    }
+  }
+  
+  #endregion
+  
+}

+ 6131 - 0
src/ProtocolBuffers.Test/TestProtos/UnitTestGoogleSpeedProtoFile.cs

@@ -0,0 +1,6131 @@
+// Generated by ProtoGen, Version=2.3.0.277, Culture=neutral, PublicKeyToken=17b3b1f090c3ea48.  DO NOT EDIT!
+
+using pb = global::Google.ProtocolBuffers;
+using pbc = global::Google.ProtocolBuffers.Collections;
+using pbd = global::Google.ProtocolBuffers.Descriptors;
+using scg = global::System.Collections.Generic;
+namespace Google.ProtocolBuffers.TestProtos {
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+  [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
+  public static partial class UnitTestGoogleSpeedProtoFile {
+  
+    #region Extension registration
+    public static void RegisterAllExtensions(pb::ExtensionRegistry registry) {
+    }
+    #endregion
+    #region Static variables
+    internal static pbd::MessageDescriptor internal__static_benchmarks_SpeedMessage1__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SpeedMessage1, global::Google.ProtocolBuffers.TestProtos.SpeedMessage1.Builder> internal__static_benchmarks_SpeedMessage1__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_benchmarks_SpeedMessage1SubMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage, global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.Builder> internal__static_benchmarks_SpeedMessage1SubMessage__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_benchmarks_SpeedMessage2__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SpeedMessage2, global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Builder> internal__static_benchmarks_SpeedMessage2__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_benchmarks_SpeedMessage2_Group1__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1, global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1.Builder> internal__static_benchmarks_SpeedMessage2_Group1__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_benchmarks_SpeedMessage2GroupedMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage, global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.Builder> internal__static_benchmarks_SpeedMessage2GroupedMessage__FieldAccessorTable;
+    #endregion
+    #region Descriptor
+    public static pbd::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbd::FileDescriptor descriptor;
+    
+    static UnitTestGoogleSpeedProtoFile() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          "Ch5nb29nbGUvdGVzdC9nb29nbGVfc3BlZWQucHJvdG8SCmJlbmNobWFya3Ma" + 
+          "JGdvb2dsZS9wcm90b2J1Zi9jc2hhcnBfb3B0aW9ucy5wcm90byL4BgoNU3Bl" + 
+          "ZWRNZXNzYWdlMRIOCgZmaWVsZDEYASACKAkSDgoGZmllbGQ5GAkgASgJEg8K" + 
+          "B2ZpZWxkMTgYEiABKAkSFgoHZmllbGQ4MBhQIAEoCDoFZmFsc2USFQoHZmll" + 
+          "bGQ4MRhRIAEoCDoEdHJ1ZRIOCgZmaWVsZDIYAiACKAUSDgoGZmllbGQzGAMg" + 
+          "AigFEhEKCGZpZWxkMjgwGJgCIAEoBRIRCgZmaWVsZDYYBiABKAU6ATASDwoH" + 
+          "ZmllbGQyMhgWIAEoAxIOCgZmaWVsZDQYBCABKAkSDgoGZmllbGQ1GAUgAygG" + 
+          "EhYKB2ZpZWxkNTkYOyABKAg6BWZhbHNlEg4KBmZpZWxkNxgHIAEoCRIPCgdm" + 
+          "aWVsZDE2GBAgASgFEhQKCGZpZWxkMTMwGIIBIAEoBToBMBIVCgdmaWVsZDEy" + 
+          "GAwgASgIOgR0cnVlEhUKB2ZpZWxkMTcYESABKAg6BHRydWUSFQoHZmllbGQx" + 
+          "MxgNIAEoCDoEdHJ1ZRIVCgdmaWVsZDE0GA4gASgIOgR0cnVlEhMKCGZpZWxk" + 
+          "MTA0GGggASgFOgEwEhMKCGZpZWxkMTAwGGQgASgFOgEwEhMKCGZpZWxkMTAx" + 
+          "GGUgASgFOgEwEhAKCGZpZWxkMTAyGGYgASgJEhAKCGZpZWxkMTAzGGcgASgJ" + 
+          "EhIKB2ZpZWxkMjkYHSABKAU6ATASFgoHZmllbGQzMBgeIAEoCDoFZmFsc2US" + 
+          "EwoHZmllbGQ2MBg8IAEoBToCLTESFQoIZmllbGQyNzEYjwIgASgFOgItMRIV" + 
+          "CghmaWVsZDI3MhiQAiABKAU6Ai0xEhEKCGZpZWxkMTUwGJYBIAEoBRISCgdm" + 
+          "aWVsZDIzGBcgASgFOgEwEhYKB2ZpZWxkMjQYGCABKAg6BWZhbHNlEhIKB2Zp" + 
+          "ZWxkMjUYGSABKAU6ATASNAoHZmllbGQxNRgPIAEoCzIjLmJlbmNobWFya3Mu" + 
+          "U3BlZWRNZXNzYWdlMVN1Yk1lc3NhZ2USDwoHZmllbGQ3OBhOIAEoCBISCgdm" + 
+          "aWVsZDY3GEMgASgFOgEwEg8KB2ZpZWxkNjgYRCABKAUSFAoIZmllbGQxMjgY" + 
+          "gAEgASgFOgEwEigKCGZpZWxkMTI5GIEBIAEoCToVeHh4eHh4eHh4eHh4eHh4" + 
+          "eHh4eHh4EhQKCGZpZWxkMTMxGIMBIAEoBToBMCKiAwoXU3BlZWRNZXNzYWdl" + 
+          "MVN1Yk1lc3NhZ2USEQoGZmllbGQxGAEgASgFOgEwEhEKBmZpZWxkMhgCIAEo" + 
+          "BToBMBIRCgZmaWVsZDMYAyABKAU6ATASDwoHZmllbGQxNRgPIAEoCRIVCgdm" + 
+          "aWVsZDEyGAwgASgIOgR0cnVlEg8KB2ZpZWxkMTMYDSABKAMSDwoHZmllbGQx" + 
+          "NBgOIAEoAxIPCgdmaWVsZDE2GBAgASgFEhIKB2ZpZWxkMTkYEyABKAU6ATIS" + 
+          "FQoHZmllbGQyMBgUIAEoCDoEdHJ1ZRIVCgdmaWVsZDI4GBwgASgIOgR0cnVl" + 
+          "Eg8KB2ZpZWxkMjEYFSABKAYSDwoHZmllbGQyMhgWIAEoBRIWCgdmaWVsZDIz" + 
+          "GBcgASgIOgVmYWxzZRIYCghmaWVsZDIwNhjOASABKAg6BWZhbHNlEhEKCGZp" + 
+          "ZWxkMjAzGMsBIAEoBxIRCghmaWVsZDIwNBjMASABKAUSEQoIZmllbGQyMDUY" + 
+          "zQEgASgJEhEKCGZpZWxkMjA3GM8BIAEoBBIRCghmaWVsZDMwMBisAiABKAQi" + 
+          "ygcKDVNwZWVkTWVzc2FnZTISDgoGZmllbGQxGAEgASgJEg4KBmZpZWxkMxgD" + 
+          "IAEoAxIOCgZmaWVsZDQYBCABKAMSDwoHZmllbGQzMBgeIAEoAxIWCgdmaWVs" + 
+          "ZDc1GEsgASgIOgVmYWxzZRIOCgZmaWVsZDYYBiABKAkSDgoGZmllbGQyGAIg" + 
+          "ASgMEhIKB2ZpZWxkMjEYFSABKAU6ATASDwoHZmllbGQ3MRhHIAEoBRIPCgdm" + 
+          "aWVsZDI1GBkgASgCEhMKCGZpZWxkMTA5GG0gASgFOgEwEhQKCGZpZWxkMjEw" + 
+          "GNIBIAEoBToBMBIUCghmaWVsZDIxMRjTASABKAU6ATASFAoIZmllbGQyMTIY" + 
+          "1AEgASgFOgEwEhQKCGZpZWxkMjEzGNUBIAEoBToBMBIUCghmaWVsZDIxNhjY" + 
+          "ASABKAU6ATASFAoIZmllbGQyMTcY2QEgASgFOgEwEhQKCGZpZWxkMjE4GNoB" + 
+          "IAEoBToBMBIUCghmaWVsZDIyMBjcASABKAU6ATASFAoIZmllbGQyMjEY3QEg" + 
+          "ASgFOgEwEhQKCGZpZWxkMjIyGN4BIAEoAjoBMBIPCgdmaWVsZDYzGD8gASgF" + 
+          "EjAKBmdyb3VwMRgKIAMoCjIgLmJlbmNobWFya3MuU3BlZWRNZXNzYWdlMi5H" + 
+          "cm91cDESEQoIZmllbGQxMjgYgAEgAygJEhEKCGZpZWxkMTMxGIMBIAEoAxIQ" + 
+          "CghmaWVsZDEyNxh/IAMoCRIRCghmaWVsZDEyORiBASABKAUSEQoIZmllbGQx" + 
+          "MzAYggEgAygDEhgKCGZpZWxkMjA1GM0BIAEoCDoFZmFsc2USGAoIZmllbGQy" + 
+          "MDYYzgEgASgIOgVmYWxzZRrDAgoGR3JvdXAxEg8KB2ZpZWxkMTEYCyACKAIS" + 
+          "DwoHZmllbGQyNhgaIAEoAhIPCgdmaWVsZDEyGAwgASgJEg8KB2ZpZWxkMTMY" + 
+          "DSABKAkSDwoHZmllbGQxNBgOIAMoCRIPCgdmaWVsZDE1GA8gAigEEg4KBmZp" + 
+          "ZWxkNRgFIAEoBRIPCgdmaWVsZDI3GBsgASgJEg8KB2ZpZWxkMjgYHCABKAUS" + 
+          "DwoHZmllbGQyORgdIAEoCRIPCgdmaWVsZDE2GBAgASgJEg8KB2ZpZWxkMjIY" + 
+          "FiADKAkSDwoHZmllbGQ3MxhJIAMoBRISCgdmaWVsZDIwGBQgASgFOgEwEg8K" + 
+          "B2ZpZWxkMjQYGCABKAkSOAoHZmllbGQzMRgfIAEoCzInLmJlbmNobWFya3Mu" + 
+          "U3BlZWRNZXNzYWdlMkdyb3VwZWRNZXNzYWdlIt8BChtTcGVlZE1lc3NhZ2Uy" + 
+          "R3JvdXBlZE1lc3NhZ2USDgoGZmllbGQxGAEgASgCEg4KBmZpZWxkMhgCIAEo" + 
+          "AhIRCgZmaWVsZDMYAyABKAI6ATASDgoGZmllbGQ0GAQgASgIEg4KBmZpZWxk" + 
+          "NRgFIAEoCBIUCgZmaWVsZDYYBiABKAg6BHRydWUSFQoGZmllbGQ3GAcgASgI" + 
+          "OgVmYWxzZRIOCgZmaWVsZDgYCCABKAISDgoGZmllbGQ5GAkgASgIEg8KB2Zp" + 
+          "ZWxkMTAYCiABKAISDwoHZmllbGQxMRgLIAEoA0JTQgtHb29nbGVTcGVlZEgB" + 
+          "wj5BCiFHb29nbGUuUHJvdG9jb2xCdWZmZXJzLlRlc3RQcm90b3MSHFVuaXRU" + 
+          "ZXN0R29vZ2xlU3BlZWRQcm90b0ZpbGU=");
+      pbd::FileDescriptor.InternalDescriptorAssigner assigner = delegate(pbd::FileDescriptor root) {
+        descriptor = root;
+        internal__static_benchmarks_SpeedMessage1__Descriptor = Descriptor.MessageTypes[0];
+        internal__static_benchmarks_SpeedMessage1__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SpeedMessage1, global::Google.ProtocolBuffers.TestProtos.SpeedMessage1.Builder>(internal__static_benchmarks_SpeedMessage1__Descriptor,
+                new string[] { "Field1", "Field9", "Field18", "Field80", "Field81", "Field2", "Field3", "Field280", "Field6", "Field22", "Field4", "Field5", "Field59", "Field7", "Field16", "Field130", "Field12", "Field17", "Field13", "Field14", "Field104", "Field100", "Field101", "Field102", "Field103", "Field29", "Field30", "Field60", "Field271", "Field272", "Field150", "Field23", "Field24", "Field25", "Field15", "Field78", "Field67", "Field68", "Field128", "Field129", "Field131", });
+        internal__static_benchmarks_SpeedMessage1SubMessage__Descriptor = Descriptor.MessageTypes[1];
+        internal__static_benchmarks_SpeedMessage1SubMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage, global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.Builder>(internal__static_benchmarks_SpeedMessage1SubMessage__Descriptor,
+                new string[] { "Field1", "Field2", "Field3", "Field15", "Field12", "Field13", "Field14", "Field16", "Field19", "Field20", "Field28", "Field21", "Field22", "Field23", "Field206", "Field203", "Field204", "Field205", "Field207", "Field300", });
+        internal__static_benchmarks_SpeedMessage2__Descriptor = Descriptor.MessageTypes[2];
+        internal__static_benchmarks_SpeedMessage2__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SpeedMessage2, global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Builder>(internal__static_benchmarks_SpeedMessage2__Descriptor,
+                new string[] { "Field1", "Field3", "Field4", "Field30", "Field75", "Field6", "Field2", "Field21", "Field71", "Field25", "Field109", "Field210", "Field211", "Field212", "Field213", "Field216", "Field217", "Field218", "Field220", "Field221", "Field222", "Field63", "Group1", "Field128", "Field131", "Field127", "Field129", "Field130", "Field205", "Field206", });
+        internal__static_benchmarks_SpeedMessage2_Group1__Descriptor = internal__static_benchmarks_SpeedMessage2__Descriptor.NestedTypes[0];
+        internal__static_benchmarks_SpeedMessage2_Group1__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1, global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1.Builder>(internal__static_benchmarks_SpeedMessage2_Group1__Descriptor,
+                new string[] { "Field11", "Field26", "Field12", "Field13", "Field14", "Field15", "Field5", "Field27", "Field28", "Field29", "Field16", "Field22", "Field73", "Field20", "Field24", "Field31", });
+        internal__static_benchmarks_SpeedMessage2GroupedMessage__Descriptor = Descriptor.MessageTypes[3];
+        internal__static_benchmarks_SpeedMessage2GroupedMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage, global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.Builder>(internal__static_benchmarks_SpeedMessage2GroupedMessage__Descriptor,
+                new string[] { "Field1", "Field2", "Field3", "Field4", "Field5", "Field6", "Field7", "Field8", "Field9", "Field10", "Field11", });
+        pb::ExtensionRegistry registry = pb::ExtensionRegistry.CreateInstance();
+        RegisterAllExtensions(registry);
+        global::Google.ProtocolBuffers.DescriptorProtos.CSharpOptions.RegisterAllExtensions(registry);
+        return registry;
+      };
+      pbd::FileDescriptor.InternalBuildGeneratedFileFrom(descriptorData,
+          new pbd::FileDescriptor[] {
+          global::Google.ProtocolBuffers.DescriptorProtos.CSharpOptions.Descriptor, 
+          }, assigner);
+    }
+    #endregion
+    
+  }
+  #region Messages
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+  [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
+  public sealed partial class SpeedMessage1 : pb::GeneratedMessage<SpeedMessage1, SpeedMessage1.Builder> {
+    private static readonly SpeedMessage1 defaultInstance = new Builder().BuildPartial();
+    public static SpeedMessage1 DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override SpeedMessage1 DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    protected override SpeedMessage1 ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestGoogleSpeedProtoFile.internal__static_benchmarks_SpeedMessage1__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<SpeedMessage1, SpeedMessage1.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestGoogleSpeedProtoFile.internal__static_benchmarks_SpeedMessage1__FieldAccessorTable; }
+    }
+    
+    public const int Field1FieldNumber = 1;
+    private bool hasField1;
+    private string field1_ = "";
+    public bool HasField1 {
+      get { return hasField1; }
+    }
+    public string Field1 {
+      get { return field1_; }
+    }
+    
+    public const int Field9FieldNumber = 9;
+    private bool hasField9;
+    private string field9_ = "";
+    public bool HasField9 {
+      get { return hasField9; }
+    }
+    public string Field9 {
+      get { return field9_; }
+    }
+    
+    public const int Field18FieldNumber = 18;
+    private bool hasField18;
+    private string field18_ = "";
+    public bool HasField18 {
+      get { return hasField18; }
+    }
+    public string Field18 {
+      get { return field18_; }
+    }
+    
+    public const int Field80FieldNumber = 80;
+    private bool hasField80;
+    private bool field80_ = false;
+    public bool HasField80 {
+      get { return hasField80; }
+    }
+    public bool Field80 {
+      get { return field80_; }
+    }
+    
+    public const int Field81FieldNumber = 81;
+    private bool hasField81;
+    private bool field81_ = true;
+    public bool HasField81 {
+      get { return hasField81; }
+    }
+    public bool Field81 {
+      get { return field81_; }
+    }
+    
+    public const int Field2FieldNumber = 2;
+    private bool hasField2;
+    private int field2_ = 0;
+    public bool HasField2 {
+      get { return hasField2; }
+    }
+    public int Field2 {
+      get { return field2_; }
+    }
+    
+    public const int Field3FieldNumber = 3;
+    private bool hasField3;
+    private int field3_ = 0;
+    public bool HasField3 {
+      get { return hasField3; }
+    }
+    public int Field3 {
+      get { return field3_; }
+    }
+    
+    public const int Field280FieldNumber = 280;
+    private bool hasField280;
+    private int field280_ = 0;
+    public bool HasField280 {
+      get { return hasField280; }
+    }
+    public int Field280 {
+      get { return field280_; }
+    }
+    
+    public const int Field6FieldNumber = 6;
+    private bool hasField6;
+    private int field6_ = 0;
+    public bool HasField6 {
+      get { return hasField6; }
+    }
+    public int Field6 {
+      get { return field6_; }
+    }
+    
+    public const int Field22FieldNumber = 22;
+    private bool hasField22;
+    private long field22_ = 0L;
+    public bool HasField22 {
+      get { return hasField22; }
+    }
+    public long Field22 {
+      get { return field22_; }
+    }
+    
+    public const int Field4FieldNumber = 4;
+    private bool hasField4;
+    private string field4_ = "";
+    public bool HasField4 {
+      get { return hasField4; }
+    }
+    public string Field4 {
+      get { return field4_; }
+    }
+    
+    public const int Field5FieldNumber = 5;
+    private pbc::PopsicleList<ulong> field5_ = new pbc::PopsicleList<ulong>();
+    [global::System.CLSCompliant(false)]
+    public scg::IList<ulong> Field5List {
+      get { return pbc::Lists.AsReadOnly(field5_); }
+    }
+    public int Field5Count {
+      get { return field5_.Count; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong GetField5(int index) {
+      return field5_[index];
+    }
+    
+    public const int Field59FieldNumber = 59;
+    private bool hasField59;
+    private bool field59_ = false;
+    public bool HasField59 {
+      get { return hasField59; }
+    }
+    public bool Field59 {
+      get { return field59_; }
+    }
+    
+    public const int Field7FieldNumber = 7;
+    private bool hasField7;
+    private string field7_ = "";
+    public bool HasField7 {
+      get { return hasField7; }
+    }
+    public string Field7 {
+      get { return field7_; }
+    }
+    
+    public const int Field16FieldNumber = 16;
+    private bool hasField16;
+    private int field16_ = 0;
+    public bool HasField16 {
+      get { return hasField16; }
+    }
+    public int Field16 {
+      get { return field16_; }
+    }
+    
+    public const int Field130FieldNumber = 130;
+    private bool hasField130;
+    private int field130_ = 0;
+    public bool HasField130 {
+      get { return hasField130; }
+    }
+    public int Field130 {
+      get { return field130_; }
+    }
+    
+    public const int Field12FieldNumber = 12;
+    private bool hasField12;
+    private bool field12_ = true;
+    public bool HasField12 {
+      get { return hasField12; }
+    }
+    public bool Field12 {
+      get { return field12_; }
+    }
+    
+    public const int Field17FieldNumber = 17;
+    private bool hasField17;
+    private bool field17_ = true;
+    public bool HasField17 {
+      get { return hasField17; }
+    }
+    public bool Field17 {
+      get { return field17_; }
+    }
+    
+    public const int Field13FieldNumber = 13;
+    private bool hasField13;
+    private bool field13_ = true;
+    public bool HasField13 {
+      get { return hasField13; }
+    }
+    public bool Field13 {
+      get { return field13_; }
+    }
+    
+    public const int Field14FieldNumber = 14;
+    private bool hasField14;
+    private bool field14_ = true;
+    public bool HasField14 {
+      get { return hasField14; }
+    }
+    public bool Field14 {
+      get { return field14_; }
+    }
+    
+    public const int Field104FieldNumber = 104;
+    private bool hasField104;
+    private int field104_ = 0;
+    public bool HasField104 {
+      get { return hasField104; }
+    }
+    public int Field104 {
+      get { return field104_; }
+    }
+    
+    public const int Field100FieldNumber = 100;
+    private bool hasField100;
+    private int field100_ = 0;
+    public bool HasField100 {
+      get { return hasField100; }
+    }
+    public int Field100 {
+      get { return field100_; }
+    }
+    
+    public const int Field101FieldNumber = 101;
+    private bool hasField101;
+    private int field101_ = 0;
+    public bool HasField101 {
+      get { return hasField101; }
+    }
+    public int Field101 {
+      get { return field101_; }
+    }
+    
+    public const int Field102FieldNumber = 102;
+    private bool hasField102;
+    private string field102_ = "";
+    public bool HasField102 {
+      get { return hasField102; }
+    }
+    public string Field102 {
+      get { return field102_; }
+    }
+    
+    public const int Field103FieldNumber = 103;
+    private bool hasField103;
+    private string field103_ = "";
+    public bool HasField103 {
+      get { return hasField103; }
+    }
+    public string Field103 {
+      get { return field103_; }
+    }
+    
+    public const int Field29FieldNumber = 29;
+    private bool hasField29;
+    private int field29_ = 0;
+    public bool HasField29 {
+      get { return hasField29; }
+    }
+    public int Field29 {
+      get { return field29_; }
+    }
+    
+    public const int Field30FieldNumber = 30;
+    private bool hasField30;
+    private bool field30_ = false;
+    public bool HasField30 {
+      get { return hasField30; }
+    }
+    public bool Field30 {
+      get { return field30_; }
+    }
+    
+    public const int Field60FieldNumber = 60;
+    private bool hasField60;
+    private int field60_ = -1;
+    public bool HasField60 {
+      get { return hasField60; }
+    }
+    public int Field60 {
+      get { return field60_; }
+    }
+    
+    public const int Field271FieldNumber = 271;
+    private bool hasField271;
+    private int field271_ = -1;
+    public bool HasField271 {
+      get { return hasField271; }
+    }
+    public int Field271 {
+      get { return field271_; }
+    }
+    
+    public const int Field272FieldNumber = 272;
+    private bool hasField272;
+    private int field272_ = -1;
+    public bool HasField272 {
+      get { return hasField272; }
+    }
+    public int Field272 {
+      get { return field272_; }
+    }
+    
+    public const int Field150FieldNumber = 150;
+    private bool hasField150;
+    private int field150_ = 0;
+    public bool HasField150 {
+      get { return hasField150; }
+    }
+    public int Field150 {
+      get { return field150_; }
+    }
+    
+    public const int Field23FieldNumber = 23;
+    private bool hasField23;
+    private int field23_ = 0;
+    public bool HasField23 {
+      get { return hasField23; }
+    }
+    public int Field23 {
+      get { return field23_; }
+    }
+    
+    public const int Field24FieldNumber = 24;
+    private bool hasField24;
+    private bool field24_ = false;
+    public bool HasField24 {
+      get { return hasField24; }
+    }
+    public bool Field24 {
+      get { return field24_; }
+    }
+    
+    public const int Field25FieldNumber = 25;
+    private bool hasField25;
+    private int field25_ = 0;
+    public bool HasField25 {
+      get { return hasField25; }
+    }
+    public int Field25 {
+      get { return field25_; }
+    }
+    
+    public const int Field15FieldNumber = 15;
+    private bool hasField15;
+    private global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage field15_ = global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.DefaultInstance;
+    public bool HasField15 {
+      get { return hasField15; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage Field15 {
+      get { return field15_; }
+    }
+    
+    public const int Field78FieldNumber = 78;
+    private bool hasField78;
+    private bool field78_ = false;
+    public bool HasField78 {
+      get { return hasField78; }
+    }
+    public bool Field78 {
+      get { return field78_; }
+    }
+    
+    public const int Field67FieldNumber = 67;
+    private bool hasField67;
+    private int field67_ = 0;
+    public bool HasField67 {
+      get { return hasField67; }
+    }
+    public int Field67 {
+      get { return field67_; }
+    }
+    
+    public const int Field68FieldNumber = 68;
+    private bool hasField68;
+    private int field68_ = 0;
+    public bool HasField68 {
+      get { return hasField68; }
+    }
+    public int Field68 {
+      get { return field68_; }
+    }
+    
+    public const int Field128FieldNumber = 128;
+    private bool hasField128;
+    private int field128_ = 0;
+    public bool HasField128 {
+      get { return hasField128; }
+    }
+    public int Field128 {
+      get { return field128_; }
+    }
+    
+    public const int Field129FieldNumber = 129;
+    private bool hasField129;
+    private string field129_ = "xxxxxxxxxxxxxxxxxxxxx";
+    public bool HasField129 {
+      get { return hasField129; }
+    }
+    public string Field129 {
+      get { return field129_; }
+    }
+    
+    public const int Field131FieldNumber = 131;
+    private bool hasField131;
+    private int field131_ = 0;
+    public bool HasField131 {
+      get { return hasField131; }
+    }
+    public int Field131 {
+      get { return field131_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        if (!hasField1) return false;
+        if (!hasField2) return false;
+        if (!hasField3) return false;
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      int size = SerializedSize;
+      if (HasField1) {
+        output.WriteString(1, Field1);
+      }
+      if (HasField2) {
+        output.WriteInt32(2, Field2);
+      }
+      if (HasField3) {
+        output.WriteInt32(3, Field3);
+      }
+      if (HasField4) {
+        output.WriteString(4, Field4);
+      }
+      if (field5_.Count > 0) {
+        foreach (ulong element in field5_) {
+          output.WriteFixed64(5, element);
+        }
+      }
+      if (HasField6) {
+        output.WriteInt32(6, Field6);
+      }
+      if (HasField7) {
+        output.WriteString(7, Field7);
+      }
+      if (HasField9) {
+        output.WriteString(9, Field9);
+      }
+      if (HasField12) {
+        output.WriteBool(12, Field12);
+      }
+      if (HasField13) {
+        output.WriteBool(13, Field13);
+      }
+      if (HasField14) {
+        output.WriteBool(14, Field14);
+      }
+      if (HasField15) {
+        output.WriteMessage(15, Field15);
+      }
+      if (HasField16) {
+        output.WriteInt32(16, Field16);
+      }
+      if (HasField17) {
+        output.WriteBool(17, Field17);
+      }
+      if (HasField18) {
+        output.WriteString(18, Field18);
+      }
+      if (HasField22) {
+        output.WriteInt64(22, Field22);
+      }
+      if (HasField23) {
+        output.WriteInt32(23, Field23);
+      }
+      if (HasField24) {
+        output.WriteBool(24, Field24);
+      }
+      if (HasField25) {
+        output.WriteInt32(25, Field25);
+      }
+      if (HasField29) {
+        output.WriteInt32(29, Field29);
+      }
+      if (HasField30) {
+        output.WriteBool(30, Field30);
+      }
+      if (HasField59) {
+        output.WriteBool(59, Field59);
+      }
+      if (HasField60) {
+        output.WriteInt32(60, Field60);
+      }
+      if (HasField67) {
+        output.WriteInt32(67, Field67);
+      }
+      if (HasField68) {
+        output.WriteInt32(68, Field68);
+      }
+      if (HasField78) {
+        output.WriteBool(78, Field78);
+      }
+      if (HasField80) {
+        output.WriteBool(80, Field80);
+      }
+      if (HasField81) {
+        output.WriteBool(81, Field81);
+      }
+      if (HasField100) {
+        output.WriteInt32(100, Field100);
+      }
+      if (HasField101) {
+        output.WriteInt32(101, Field101);
+      }
+      if (HasField102) {
+        output.WriteString(102, Field102);
+      }
+      if (HasField103) {
+        output.WriteString(103, Field103);
+      }
+      if (HasField104) {
+        output.WriteInt32(104, Field104);
+      }
+      if (HasField128) {
+        output.WriteInt32(128, Field128);
+      }
+      if (HasField129) {
+        output.WriteString(129, Field129);
+      }
+      if (HasField130) {
+        output.WriteInt32(130, Field130);
+      }
+      if (HasField131) {
+        output.WriteInt32(131, Field131);
+      }
+      if (HasField150) {
+        output.WriteInt32(150, Field150);
+      }
+      if (HasField271) {
+        output.WriteInt32(271, Field271);
+      }
+      if (HasField272) {
+        output.WriteInt32(272, Field272);
+      }
+      if (HasField280) {
+        output.WriteInt32(280, Field280);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasField1) {
+          size += pb::CodedOutputStream.ComputeStringSize(1, Field1);
+        }
+        if (HasField9) {
+          size += pb::CodedOutputStream.ComputeStringSize(9, Field9);
+        }
+        if (HasField18) {
+          size += pb::CodedOutputStream.ComputeStringSize(18, Field18);
+        }
+        if (HasField80) {
+          size += pb::CodedOutputStream.ComputeBoolSize(80, Field80);
+        }
+        if (HasField81) {
+          size += pb::CodedOutputStream.ComputeBoolSize(81, Field81);
+        }
+        if (HasField2) {
+          size += pb::CodedOutputStream.ComputeInt32Size(2, Field2);
+        }
+        if (HasField3) {
+          size += pb::CodedOutputStream.ComputeInt32Size(3, Field3);
+        }
+        if (HasField280) {
+          size += pb::CodedOutputStream.ComputeInt32Size(280, Field280);
+        }
+        if (HasField6) {
+          size += pb::CodedOutputStream.ComputeInt32Size(6, Field6);
+        }
+        if (HasField22) {
+          size += pb::CodedOutputStream.ComputeInt64Size(22, Field22);
+        }
+        if (HasField4) {
+          size += pb::CodedOutputStream.ComputeStringSize(4, Field4);
+        }
+        {
+          int dataSize = 0;
+          dataSize = 8 * field5_.Count;
+          size += dataSize;
+          size += 1 * field5_.Count;
+        }
+        if (HasField59) {
+          size += pb::CodedOutputStream.ComputeBoolSize(59, Field59);
+        }
+        if (HasField7) {
+          size += pb::CodedOutputStream.ComputeStringSize(7, Field7);
+        }
+        if (HasField16) {
+          size += pb::CodedOutputStream.ComputeInt32Size(16, Field16);
+        }
+        if (HasField130) {
+          size += pb::CodedOutputStream.ComputeInt32Size(130, Field130);
+        }
+        if (HasField12) {
+          size += pb::CodedOutputStream.ComputeBoolSize(12, Field12);
+        }
+        if (HasField17) {
+          size += pb::CodedOutputStream.ComputeBoolSize(17, Field17);
+        }
+        if (HasField13) {
+          size += pb::CodedOutputStream.ComputeBoolSize(13, Field13);
+        }
+        if (HasField14) {
+          size += pb::CodedOutputStream.ComputeBoolSize(14, Field14);
+        }
+        if (HasField104) {
+          size += pb::CodedOutputStream.ComputeInt32Size(104, Field104);
+        }
+        if (HasField100) {
+          size += pb::CodedOutputStream.ComputeInt32Size(100, Field100);
+        }
+        if (HasField101) {
+          size += pb::CodedOutputStream.ComputeInt32Size(101, Field101);
+        }
+        if (HasField102) {
+          size += pb::CodedOutputStream.ComputeStringSize(102, Field102);
+        }
+        if (HasField103) {
+          size += pb::CodedOutputStream.ComputeStringSize(103, Field103);
+        }
+        if (HasField29) {
+          size += pb::CodedOutputStream.ComputeInt32Size(29, Field29);
+        }
+        if (HasField30) {
+          size += pb::CodedOutputStream.ComputeBoolSize(30, Field30);
+        }
+        if (HasField60) {
+          size += pb::CodedOutputStream.ComputeInt32Size(60, Field60);
+        }
+        if (HasField271) {
+          size += pb::CodedOutputStream.ComputeInt32Size(271, Field271);
+        }
+        if (HasField272) {
+          size += pb::CodedOutputStream.ComputeInt32Size(272, Field272);
+        }
+        if (HasField150) {
+          size += pb::CodedOutputStream.ComputeInt32Size(150, Field150);
+        }
+        if (HasField23) {
+          size += pb::CodedOutputStream.ComputeInt32Size(23, Field23);
+        }
+        if (HasField24) {
+          size += pb::CodedOutputStream.ComputeBoolSize(24, Field24);
+        }
+        if (HasField25) {
+          size += pb::CodedOutputStream.ComputeInt32Size(25, Field25);
+        }
+        if (HasField15) {
+          size += pb::CodedOutputStream.ComputeMessageSize(15, Field15);
+        }
+        if (HasField78) {
+          size += pb::CodedOutputStream.ComputeBoolSize(78, Field78);
+        }
+        if (HasField67) {
+          size += pb::CodedOutputStream.ComputeInt32Size(67, Field67);
+        }
+        if (HasField68) {
+          size += pb::CodedOutputStream.ComputeInt32Size(68, Field68);
+        }
+        if (HasField128) {
+          size += pb::CodedOutputStream.ComputeInt32Size(128, Field128);
+        }
+        if (HasField129) {
+          size += pb::CodedOutputStream.ComputeStringSize(129, Field129);
+        }
+        if (HasField131) {
+          size += pb::CodedOutputStream.ComputeInt32Size(131, Field131);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static SpeedMessage1 ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SpeedMessage1 ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SpeedMessage1 ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SpeedMessage1 ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SpeedMessage1 ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SpeedMessage1 ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static SpeedMessage1 ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static SpeedMessage1 ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static SpeedMessage1 ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SpeedMessage1 ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(SpeedMessage1 prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
+    public sealed partial class Builder : pb::GeneratedBuilder<SpeedMessage1, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {}
+      
+      SpeedMessage1 result = new SpeedMessage1();
+      
+      protected override SpeedMessage1 MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override Builder Clear() {
+        result = new SpeedMessage1();
+        return this;
+      }
+      
+      public override Builder Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.SpeedMessage1.Descriptor; }
+      }
+      
+      public override SpeedMessage1 DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.SpeedMessage1.DefaultInstance; }
+      }
+      
+      public override SpeedMessage1 BuildPartial() {
+        if (result == null) {
+          throw new global::System.InvalidOperationException("build() has already been called on this Builder");
+        }
+        result.field5_.MakeReadOnly();
+        SpeedMessage1 returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is SpeedMessage1) {
+          return MergeFrom((SpeedMessage1) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(SpeedMessage1 other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.SpeedMessage1.DefaultInstance) return this;
+        if (other.HasField1) {
+          Field1 = other.Field1;
+        }
+        if (other.HasField9) {
+          Field9 = other.Field9;
+        }
+        if (other.HasField18) {
+          Field18 = other.Field18;
+        }
+        if (other.HasField80) {
+          Field80 = other.Field80;
+        }
+        if (other.HasField81) {
+          Field81 = other.Field81;
+        }
+        if (other.HasField2) {
+          Field2 = other.Field2;
+        }
+        if (other.HasField3) {
+          Field3 = other.Field3;
+        }
+        if (other.HasField280) {
+          Field280 = other.Field280;
+        }
+        if (other.HasField6) {
+          Field6 = other.Field6;
+        }
+        if (other.HasField22) {
+          Field22 = other.Field22;
+        }
+        if (other.HasField4) {
+          Field4 = other.Field4;
+        }
+        if (other.field5_.Count != 0) {
+          base.AddRange(other.field5_, result.field5_);
+        }
+        if (other.HasField59) {
+          Field59 = other.Field59;
+        }
+        if (other.HasField7) {
+          Field7 = other.Field7;
+        }
+        if (other.HasField16) {
+          Field16 = other.Field16;
+        }
+        if (other.HasField130) {
+          Field130 = other.Field130;
+        }
+        if (other.HasField12) {
+          Field12 = other.Field12;
+        }
+        if (other.HasField17) {
+          Field17 = other.Field17;
+        }
+        if (other.HasField13) {
+          Field13 = other.Field13;
+        }
+        if (other.HasField14) {
+          Field14 = other.Field14;
+        }
+        if (other.HasField104) {
+          Field104 = other.Field104;
+        }
+        if (other.HasField100) {
+          Field100 = other.Field100;
+        }
+        if (other.HasField101) {
+          Field101 = other.Field101;
+        }
+        if (other.HasField102) {
+          Field102 = other.Field102;
+        }
+        if (other.HasField103) {
+          Field103 = other.Field103;
+        }
+        if (other.HasField29) {
+          Field29 = other.Field29;
+        }
+        if (other.HasField30) {
+          Field30 = other.Field30;
+        }
+        if (other.HasField60) {
+          Field60 = other.Field60;
+        }
+        if (other.HasField271) {
+          Field271 = other.Field271;
+        }
+        if (other.HasField272) {
+          Field272 = other.Field272;
+        }
+        if (other.HasField150) {
+          Field150 = other.Field150;
+        }
+        if (other.HasField23) {
+          Field23 = other.Field23;
+        }
+        if (other.HasField24) {
+          Field24 = other.Field24;
+        }
+        if (other.HasField25) {
+          Field25 = other.Field25;
+        }
+        if (other.HasField15) {
+          MergeField15(other.Field15);
+        }
+        if (other.HasField78) {
+          Field78 = other.Field78;
+        }
+        if (other.HasField67) {
+          Field67 = other.Field67;
+        }
+        if (other.HasField68) {
+          Field68 = other.Field68;
+        }
+        if (other.HasField128) {
+          Field128 = other.Field128;
+        }
+        if (other.HasField129) {
+          Field129 = other.Field129;
+        }
+        if (other.HasField131) {
+          Field131 = other.Field131;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0: {
+              if (unknownFields != null) {
+                this.UnknownFields = unknownFields.Build();
+              }
+              return this;
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag);
+              break;
+            }
+            case 10: {
+              Field1 = input.ReadString();
+              break;
+            }
+            case 16: {
+              Field2 = input.ReadInt32();
+              break;
+            }
+            case 24: {
+              Field3 = input.ReadInt32();
+              break;
+            }
+            case 34: {
+              Field4 = input.ReadString();
+              break;
+            }
+            case 41: {
+              AddField5(input.ReadFixed64());
+              break;
+            }
+            case 48: {
+              Field6 = input.ReadInt32();
+              break;
+            }
+            case 58: {
+              Field7 = input.ReadString();
+              break;
+            }
+            case 74: {
+              Field9 = input.ReadString();
+              break;
+            }
+            case 96: {
+              Field12 = input.ReadBool();
+              break;
+            }
+            case 104: {
+              Field13 = input.ReadBool();
+              break;
+            }
+            case 112: {
+              Field14 = input.ReadBool();
+              break;
+            }
+            case 122: {
+              global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.CreateBuilder();
+              if (HasField15) {
+                subBuilder.MergeFrom(Field15);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              Field15 = subBuilder.BuildPartial();
+              break;
+            }
+            case 128: {
+              Field16 = input.ReadInt32();
+              break;
+            }
+            case 136: {
+              Field17 = input.ReadBool();
+              break;
+            }
+            case 146: {
+              Field18 = input.ReadString();
+              break;
+            }
+            case 176: {
+              Field22 = input.ReadInt64();
+              break;
+            }
+            case 184: {
+              Field23 = input.ReadInt32();
+              break;
+            }
+            case 192: {
+              Field24 = input.ReadBool();
+              break;
+            }
+            case 200: {
+              Field25 = input.ReadInt32();
+              break;
+            }
+            case 232: {
+              Field29 = input.ReadInt32();
+              break;
+            }
+            case 240: {
+              Field30 = input.ReadBool();
+              break;
+            }
+            case 472: {
+              Field59 = input.ReadBool();
+              break;
+            }
+            case 480: {
+              Field60 = input.ReadInt32();
+              break;
+            }
+            case 536: {
+              Field67 = input.ReadInt32();
+              break;
+            }
+            case 544: {
+              Field68 = input.ReadInt32();
+              break;
+            }
+            case 624: {
+              Field78 = input.ReadBool();
+              break;
+            }
+            case 640: {
+              Field80 = input.ReadBool();
+              break;
+            }
+            case 648: {
+              Field81 = input.ReadBool();
+              break;
+            }
+            case 800: {
+              Field100 = input.ReadInt32();
+              break;
+            }
+            case 808: {
+              Field101 = input.ReadInt32();
+              break;
+            }
+            case 818: {
+              Field102 = input.ReadString();
+              break;
+            }
+            case 826: {
+              Field103 = input.ReadString();
+              break;
+            }
+            case 832: {
+              Field104 = input.ReadInt32();
+              break;
+            }
+            case 1024: {
+              Field128 = input.ReadInt32();
+              break;
+            }
+            case 1034: {
+              Field129 = input.ReadString();
+              break;
+            }
+            case 1040: {
+              Field130 = input.ReadInt32();
+              break;
+            }
+            case 1048: {
+              Field131 = input.ReadInt32();
+              break;
+            }
+            case 1200: {
+              Field150 = input.ReadInt32();
+              break;
+            }
+            case 2168: {
+              Field271 = input.ReadInt32();
+              break;
+            }
+            case 2176: {
+              Field272 = input.ReadInt32();
+              break;
+            }
+            case 2240: {
+              Field280 = input.ReadInt32();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      public bool HasField1 {
+        get { return result.HasField1; }
+      }
+      public string Field1 {
+        get { return result.Field1; }
+        set { SetField1(value); }
+      }
+      public Builder SetField1(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.hasField1 = true;
+        result.field1_ = value;
+        return this;
+      }
+      public Builder ClearField1() {
+        result.hasField1 = false;
+        result.field1_ = "";
+        return this;
+      }
+      
+      public bool HasField9 {
+        get { return result.HasField9; }
+      }
+      public string Field9 {
+        get { return result.Field9; }
+        set { SetField9(value); }
+      }
+      public Builder SetField9(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.hasField9 = true;
+        result.field9_ = value;
+        return this;
+      }
+      public Builder ClearField9() {
+        result.hasField9 = false;
+        result.field9_ = "";
+        return this;
+      }
+      
+      public bool HasField18 {
+        get { return result.HasField18; }
+      }
+      public string Field18 {
+        get { return result.Field18; }
+        set { SetField18(value); }
+      }
+      public Builder SetField18(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.hasField18 = true;
+        result.field18_ = value;
+        return this;
+      }
+      public Builder ClearField18() {
+        result.hasField18 = false;
+        result.field18_ = "";
+        return this;
+      }
+      
+      public bool HasField80 {
+        get { return result.HasField80; }
+      }
+      public bool Field80 {
+        get { return result.Field80; }
+        set { SetField80(value); }
+      }
+      public Builder SetField80(bool value) {
+        result.hasField80 = true;
+        result.field80_ = value;
+        return this;
+      }
+      public Builder ClearField80() {
+        result.hasField80 = false;
+        result.field80_ = false;
+        return this;
+      }
+      
+      public bool HasField81 {
+        get { return result.HasField81; }
+      }
+      public bool Field81 {
+        get { return result.Field81; }
+        set { SetField81(value); }
+      }
+      public Builder SetField81(bool value) {
+        result.hasField81 = true;
+        result.field81_ = value;
+        return this;
+      }
+      public Builder ClearField81() {
+        result.hasField81 = false;
+        result.field81_ = true;
+        return this;
+      }
+      
+      public bool HasField2 {
+        get { return result.HasField2; }
+      }
+      public int Field2 {
+        get { return result.Field2; }
+        set { SetField2(value); }
+      }
+      public Builder SetField2(int value) {
+        result.hasField2 = true;
+        result.field2_ = value;
+        return this;
+      }
+      public Builder ClearField2() {
+        result.hasField2 = false;
+        result.field2_ = 0;
+        return this;
+      }
+      
+      public bool HasField3 {
+        get { return result.HasField3; }
+      }
+      public int Field3 {
+        get { return result.Field3; }
+        set { SetField3(value); }
+      }
+      public Builder SetField3(int value) {
+        result.hasField3 = true;
+        result.field3_ = value;
+        return this;
+      }
+      public Builder ClearField3() {
+        result.hasField3 = false;
+        result.field3_ = 0;
+        return this;
+      }
+      
+      public bool HasField280 {
+        get { return result.HasField280; }
+      }
+      public int Field280 {
+        get { return result.Field280; }
+        set { SetField280(value); }
+      }
+      public Builder SetField280(int value) {
+        result.hasField280 = true;
+        result.field280_ = value;
+        return this;
+      }
+      public Builder ClearField280() {
+        result.hasField280 = false;
+        result.field280_ = 0;
+        return this;
+      }
+      
+      public bool HasField6 {
+        get { return result.HasField6; }
+      }
+      public int Field6 {
+        get { return result.Field6; }
+        set { SetField6(value); }
+      }
+      public Builder SetField6(int value) {
+        result.hasField6 = true;
+        result.field6_ = value;
+        return this;
+      }
+      public Builder ClearField6() {
+        result.hasField6 = false;
+        result.field6_ = 0;
+        return this;
+      }
+      
+      public bool HasField22 {
+        get { return result.HasField22; }
+      }
+      public long Field22 {
+        get { return result.Field22; }
+        set { SetField22(value); }
+      }
+      public Builder SetField22(long value) {
+        result.hasField22 = true;
+        result.field22_ = value;
+        return this;
+      }
+      public Builder ClearField22() {
+        result.hasField22 = false;
+        result.field22_ = 0L;
+        return this;
+      }
+      
+      public bool HasField4 {
+        get { return result.HasField4; }
+      }
+      public string Field4 {
+        get { return result.Field4; }
+        set { SetField4(value); }
+      }
+      public Builder SetField4(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.hasField4 = true;
+        result.field4_ = value;
+        return this;
+      }
+      public Builder ClearField4() {
+        result.hasField4 = false;
+        result.field4_ = "";
+        return this;
+      }
+      
+      [global::System.CLSCompliant(false)]
+      public pbc::IPopsicleList<ulong> Field5List {
+        get { return result.field5_; }
+      }
+      public int Field5Count {
+        get { return result.Field5Count; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong GetField5(int index) {
+        return result.GetField5(index);
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetField5(int index, ulong value) {
+        result.field5_[index] = value;
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddField5(ulong value) {
+        result.field5_.Add(value);
+        return this;
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder AddRangeField5(scg::IEnumerable<ulong> values) {
+        base.AddRange(values, result.field5_);
+        return this;
+      }
+      public Builder ClearField5() {
+        result.field5_.Clear();
+        return this;
+      }
+      
+      public bool HasField59 {
+        get { return result.HasField59; }
+      }
+      public bool Field59 {
+        get { return result.Field59; }
+        set { SetField59(value); }
+      }
+      public Builder SetField59(bool value) {
+        result.hasField59 = true;
+        result.field59_ = value;
+        return this;
+      }
+      public Builder ClearField59() {
+        result.hasField59 = false;
+        result.field59_ = false;
+        return this;
+      }
+      
+      public bool HasField7 {
+        get { return result.HasField7; }
+      }
+      public string Field7 {
+        get { return result.Field7; }
+        set { SetField7(value); }
+      }
+      public Builder SetField7(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.hasField7 = true;
+        result.field7_ = value;
+        return this;
+      }
+      public Builder ClearField7() {
+        result.hasField7 = false;
+        result.field7_ = "";
+        return this;
+      }
+      
+      public bool HasField16 {
+        get { return result.HasField16; }
+      }
+      public int Field16 {
+        get { return result.Field16; }
+        set { SetField16(value); }
+      }
+      public Builder SetField16(int value) {
+        result.hasField16 = true;
+        result.field16_ = value;
+        return this;
+      }
+      public Builder ClearField16() {
+        result.hasField16 = false;
+        result.field16_ = 0;
+        return this;
+      }
+      
+      public bool HasField130 {
+        get { return result.HasField130; }
+      }
+      public int Field130 {
+        get { return result.Field130; }
+        set { SetField130(value); }
+      }
+      public Builder SetField130(int value) {
+        result.hasField130 = true;
+        result.field130_ = value;
+        return this;
+      }
+      public Builder ClearField130() {
+        result.hasField130 = false;
+        result.field130_ = 0;
+        return this;
+      }
+      
+      public bool HasField12 {
+        get { return result.HasField12; }
+      }
+      public bool Field12 {
+        get { return result.Field12; }
+        set { SetField12(value); }
+      }
+      public Builder SetField12(bool value) {
+        result.hasField12 = true;
+        result.field12_ = value;
+        return this;
+      }
+      public Builder ClearField12() {
+        result.hasField12 = false;
+        result.field12_ = true;
+        return this;
+      }
+      
+      public bool HasField17 {
+        get { return result.HasField17; }
+      }
+      public bool Field17 {
+        get { return result.Field17; }
+        set { SetField17(value); }
+      }
+      public Builder SetField17(bool value) {
+        result.hasField17 = true;
+        result.field17_ = value;
+        return this;
+      }
+      public Builder ClearField17() {
+        result.hasField17 = false;
+        result.field17_ = true;
+        return this;
+      }
+      
+      public bool HasField13 {
+        get { return result.HasField13; }
+      }
+      public bool Field13 {
+        get { return result.Field13; }
+        set { SetField13(value); }
+      }
+      public Builder SetField13(bool value) {
+        result.hasField13 = true;
+        result.field13_ = value;
+        return this;
+      }
+      public Builder ClearField13() {
+        result.hasField13 = false;
+        result.field13_ = true;
+        return this;
+      }
+      
+      public bool HasField14 {
+        get { return result.HasField14; }
+      }
+      public bool Field14 {
+        get { return result.Field14; }
+        set { SetField14(value); }
+      }
+      public Builder SetField14(bool value) {
+        result.hasField14 = true;
+        result.field14_ = value;
+        return this;
+      }
+      public Builder ClearField14() {
+        result.hasField14 = false;
+        result.field14_ = true;
+        return this;
+      }
+      
+      public bool HasField104 {
+        get { return result.HasField104; }
+      }
+      public int Field104 {
+        get { return result.Field104; }
+        set { SetField104(value); }
+      }
+      public Builder SetField104(int value) {
+        result.hasField104 = true;
+        result.field104_ = value;
+        return this;
+      }
+      public Builder ClearField104() {
+        result.hasField104 = false;
+        result.field104_ = 0;
+        return this;
+      }
+      
+      public bool HasField100 {
+        get { return result.HasField100; }
+      }
+      public int Field100 {
+        get { return result.Field100; }
+        set { SetField100(value); }
+      }
+      public Builder SetField100(int value) {
+        result.hasField100 = true;
+        result.field100_ = value;
+        return this;
+      }
+      public Builder ClearField100() {
+        result.hasField100 = false;
+        result.field100_ = 0;
+        return this;
+      }
+      
+      public bool HasField101 {
+        get { return result.HasField101; }
+      }
+      public int Field101 {
+        get { return result.Field101; }
+        set { SetField101(value); }
+      }
+      public Builder SetField101(int value) {
+        result.hasField101 = true;
+        result.field101_ = value;
+        return this;
+      }
+      public Builder ClearField101() {
+        result.hasField101 = false;
+        result.field101_ = 0;
+        return this;
+      }
+      
+      public bool HasField102 {
+        get { return result.HasField102; }
+      }
+      public string Field102 {
+        get { return result.Field102; }
+        set { SetField102(value); }
+      }
+      public Builder SetField102(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.hasField102 = true;
+        result.field102_ = value;
+        return this;
+      }
+      public Builder ClearField102() {
+        result.hasField102 = false;
+        result.field102_ = "";
+        return this;
+      }
+      
+      public bool HasField103 {
+        get { return result.HasField103; }
+      }
+      public string Field103 {
+        get { return result.Field103; }
+        set { SetField103(value); }
+      }
+      public Builder SetField103(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.hasField103 = true;
+        result.field103_ = value;
+        return this;
+      }
+      public Builder ClearField103() {
+        result.hasField103 = false;
+        result.field103_ = "";
+        return this;
+      }
+      
+      public bool HasField29 {
+        get { return result.HasField29; }
+      }
+      public int Field29 {
+        get { return result.Field29; }
+        set { SetField29(value); }
+      }
+      public Builder SetField29(int value) {
+        result.hasField29 = true;
+        result.field29_ = value;
+        return this;
+      }
+      public Builder ClearField29() {
+        result.hasField29 = false;
+        result.field29_ = 0;
+        return this;
+      }
+      
+      public bool HasField30 {
+        get { return result.HasField30; }
+      }
+      public bool Field30 {
+        get { return result.Field30; }
+        set { SetField30(value); }
+      }
+      public Builder SetField30(bool value) {
+        result.hasField30 = true;
+        result.field30_ = value;
+        return this;
+      }
+      public Builder ClearField30() {
+        result.hasField30 = false;
+        result.field30_ = false;
+        return this;
+      }
+      
+      public bool HasField60 {
+        get { return result.HasField60; }
+      }
+      public int Field60 {
+        get { return result.Field60; }
+        set { SetField60(value); }
+      }
+      public Builder SetField60(int value) {
+        result.hasField60 = true;
+        result.field60_ = value;
+        return this;
+      }
+      public Builder ClearField60() {
+        result.hasField60 = false;
+        result.field60_ = -1;
+        return this;
+      }
+      
+      public bool HasField271 {
+        get { return result.HasField271; }
+      }
+      public int Field271 {
+        get { return result.Field271; }
+        set { SetField271(value); }
+      }
+      public Builder SetField271(int value) {
+        result.hasField271 = true;
+        result.field271_ = value;
+        return this;
+      }
+      public Builder ClearField271() {
+        result.hasField271 = false;
+        result.field271_ = -1;
+        return this;
+      }
+      
+      public bool HasField272 {
+        get { return result.HasField272; }
+      }
+      public int Field272 {
+        get { return result.Field272; }
+        set { SetField272(value); }
+      }
+      public Builder SetField272(int value) {
+        result.hasField272 = true;
+        result.field272_ = value;
+        return this;
+      }
+      public Builder ClearField272() {
+        result.hasField272 = false;
+        result.field272_ = -1;
+        return this;
+      }
+      
+      public bool HasField150 {
+        get { return result.HasField150; }
+      }
+      public int Field150 {
+        get { return result.Field150; }
+        set { SetField150(value); }
+      }
+      public Builder SetField150(int value) {
+        result.hasField150 = true;
+        result.field150_ = value;
+        return this;
+      }
+      public Builder ClearField150() {
+        result.hasField150 = false;
+        result.field150_ = 0;
+        return this;
+      }
+      
+      public bool HasField23 {
+        get { return result.HasField23; }
+      }
+      public int Field23 {
+        get { return result.Field23; }
+        set { SetField23(value); }
+      }
+      public Builder SetField23(int value) {
+        result.hasField23 = true;
+        result.field23_ = value;
+        return this;
+      }
+      public Builder ClearField23() {
+        result.hasField23 = false;
+        result.field23_ = 0;
+        return this;
+      }
+      
+      public bool HasField24 {
+        get { return result.HasField24; }
+      }
+      public bool Field24 {
+        get { return result.Field24; }
+        set { SetField24(value); }
+      }
+      public Builder SetField24(bool value) {
+        result.hasField24 = true;
+        result.field24_ = value;
+        return this;
+      }
+      public Builder ClearField24() {
+        result.hasField24 = false;
+        result.field24_ = false;
+        return this;
+      }
+      
+      public bool HasField25 {
+        get { return result.HasField25; }
+      }
+      public int Field25 {
+        get { return result.Field25; }
+        set { SetField25(value); }
+      }
+      public Builder SetField25(int value) {
+        result.hasField25 = true;
+        result.field25_ = value;
+        return this;
+      }
+      public Builder ClearField25() {
+        result.hasField25 = false;
+        result.field25_ = 0;
+        return this;
+      }
+      
+      public bool HasField15 {
+       get { return result.HasField15; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage Field15 {
+        get { return result.Field15; }
+        set { SetField15(value); }
+      }
+      public Builder SetField15(global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.hasField15 = true;
+        result.field15_ = value;
+        return this;
+      }
+      public Builder SetField15(global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        result.hasField15 = true;
+        result.field15_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeField15(global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        if (result.HasField15 &&
+            result.field15_ != global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.DefaultInstance) {
+            result.field15_ = global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.CreateBuilder(result.field15_).MergeFrom(value).BuildPartial();
+        } else {
+          result.field15_ = value;
+        }
+        result.hasField15 = true;
+        return this;
+      }
+      public Builder ClearField15() {
+        result.hasField15 = false;
+        result.field15_ = global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.DefaultInstance;
+        return this;
+      }
+      
+      public bool HasField78 {
+        get { return result.HasField78; }
+      }
+      public bool Field78 {
+        get { return result.Field78; }
+        set { SetField78(value); }
+      }
+      public Builder SetField78(bool value) {
+        result.hasField78 = true;
+        result.field78_ = value;
+        return this;
+      }
+      public Builder ClearField78() {
+        result.hasField78 = false;
+        result.field78_ = false;
+        return this;
+      }
+      
+      public bool HasField67 {
+        get { return result.HasField67; }
+      }
+      public int Field67 {
+        get { return result.Field67; }
+        set { SetField67(value); }
+      }
+      public Builder SetField67(int value) {
+        result.hasField67 = true;
+        result.field67_ = value;
+        return this;
+      }
+      public Builder ClearField67() {
+        result.hasField67 = false;
+        result.field67_ = 0;
+        return this;
+      }
+      
+      public bool HasField68 {
+        get { return result.HasField68; }
+      }
+      public int Field68 {
+        get { return result.Field68; }
+        set { SetField68(value); }
+      }
+      public Builder SetField68(int value) {
+        result.hasField68 = true;
+        result.field68_ = value;
+        return this;
+      }
+      public Builder ClearField68() {
+        result.hasField68 = false;
+        result.field68_ = 0;
+        return this;
+      }
+      
+      public bool HasField128 {
+        get { return result.HasField128; }
+      }
+      public int Field128 {
+        get { return result.Field128; }
+        set { SetField128(value); }
+      }
+      public Builder SetField128(int value) {
+        result.hasField128 = true;
+        result.field128_ = value;
+        return this;
+      }
+      public Builder ClearField128() {
+        result.hasField128 = false;
+        result.field128_ = 0;
+        return this;
+      }
+      
+      public bool HasField129 {
+        get { return result.HasField129; }
+      }
+      public string Field129 {
+        get { return result.Field129; }
+        set { SetField129(value); }
+      }
+      public Builder SetField129(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.hasField129 = true;
+        result.field129_ = value;
+        return this;
+      }
+      public Builder ClearField129() {
+        result.hasField129 = false;
+        result.field129_ = "xxxxxxxxxxxxxxxxxxxxx";
+        return this;
+      }
+      
+      public bool HasField131 {
+        get { return result.HasField131; }
+      }
+      public int Field131 {
+        get { return result.Field131; }
+        set { SetField131(value); }
+      }
+      public Builder SetField131(int value) {
+        result.hasField131 = true;
+        result.field131_ = value;
+        return this;
+      }
+      public Builder ClearField131() {
+        result.hasField131 = false;
+        result.field131_ = 0;
+        return this;
+      }
+    }
+    static SpeedMessage1() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestGoogleSpeedProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+  [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
+  public sealed partial class SpeedMessage1SubMessage : pb::GeneratedMessage<SpeedMessage1SubMessage, SpeedMessage1SubMessage.Builder> {
+    private static readonly SpeedMessage1SubMessage defaultInstance = new Builder().BuildPartial();
+    public static SpeedMessage1SubMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override SpeedMessage1SubMessage DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    protected override SpeedMessage1SubMessage ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestGoogleSpeedProtoFile.internal__static_benchmarks_SpeedMessage1SubMessage__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<SpeedMessage1SubMessage, SpeedMessage1SubMessage.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestGoogleSpeedProtoFile.internal__static_benchmarks_SpeedMessage1SubMessage__FieldAccessorTable; }
+    }
+    
+    public const int Field1FieldNumber = 1;
+    private bool hasField1;
+    private int field1_ = 0;
+    public bool HasField1 {
+      get { return hasField1; }
+    }
+    public int Field1 {
+      get { return field1_; }
+    }
+    
+    public const int Field2FieldNumber = 2;
+    private bool hasField2;
+    private int field2_ = 0;
+    public bool HasField2 {
+      get { return hasField2; }
+    }
+    public int Field2 {
+      get { return field2_; }
+    }
+    
+    public const int Field3FieldNumber = 3;
+    private bool hasField3;
+    private int field3_ = 0;
+    public bool HasField3 {
+      get { return hasField3; }
+    }
+    public int Field3 {
+      get { return field3_; }
+    }
+    
+    public const int Field15FieldNumber = 15;
+    private bool hasField15;
+    private string field15_ = "";
+    public bool HasField15 {
+      get { return hasField15; }
+    }
+    public string Field15 {
+      get { return field15_; }
+    }
+    
+    public const int Field12FieldNumber = 12;
+    private bool hasField12;
+    private bool field12_ = true;
+    public bool HasField12 {
+      get { return hasField12; }
+    }
+    public bool Field12 {
+      get { return field12_; }
+    }
+    
+    public const int Field13FieldNumber = 13;
+    private bool hasField13;
+    private long field13_ = 0L;
+    public bool HasField13 {
+      get { return hasField13; }
+    }
+    public long Field13 {
+      get { return field13_; }
+    }
+    
+    public const int Field14FieldNumber = 14;
+    private bool hasField14;
+    private long field14_ = 0L;
+    public bool HasField14 {
+      get { return hasField14; }
+    }
+    public long Field14 {
+      get { return field14_; }
+    }
+    
+    public const int Field16FieldNumber = 16;
+    private bool hasField16;
+    private int field16_ = 0;
+    public bool HasField16 {
+      get { return hasField16; }
+    }
+    public int Field16 {
+      get { return field16_; }
+    }
+    
+    public const int Field19FieldNumber = 19;
+    private bool hasField19;
+    private int field19_ = 2;
+    public bool HasField19 {
+      get { return hasField19; }
+    }
+    public int Field19 {
+      get { return field19_; }
+    }
+    
+    public const int Field20FieldNumber = 20;
+    private bool hasField20;
+    private bool field20_ = true;
+    public bool HasField20 {
+      get { return hasField20; }
+    }
+    public bool Field20 {
+      get { return field20_; }
+    }
+    
+    public const int Field28FieldNumber = 28;
+    private bool hasField28;
+    private bool field28_ = true;
+    public bool HasField28 {
+      get { return hasField28; }
+    }
+    public bool Field28 {
+      get { return field28_; }
+    }
+    
+    public const int Field21FieldNumber = 21;
+    private bool hasField21;
+    private ulong field21_ = 0;
+    public bool HasField21 {
+      get { return hasField21; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong Field21 {
+      get { return field21_; }
+    }
+    
+    public const int Field22FieldNumber = 22;
+    private bool hasField22;
+    private int field22_ = 0;
+    public bool HasField22 {
+      get { return hasField22; }
+    }
+    public int Field22 {
+      get { return field22_; }
+    }
+    
+    public const int Field23FieldNumber = 23;
+    private bool hasField23;
+    private bool field23_ = false;
+    public bool HasField23 {
+      get { return hasField23; }
+    }
+    public bool Field23 {
+      get { return field23_; }
+    }
+    
+    public const int Field206FieldNumber = 206;
+    private bool hasField206;
+    private bool field206_ = false;
+    public bool HasField206 {
+      get { return hasField206; }
+    }
+    public bool Field206 {
+      get { return field206_; }
+    }
+    
+    public const int Field203FieldNumber = 203;
+    private bool hasField203;
+    private uint field203_ = 0;
+    public bool HasField203 {
+      get { return hasField203; }
+    }
+    [global::System.CLSCompliant(false)]
+    public uint Field203 {
+      get { return field203_; }
+    }
+    
+    public const int Field204FieldNumber = 204;
+    private bool hasField204;
+    private int field204_ = 0;
+    public bool HasField204 {
+      get { return hasField204; }
+    }
+    public int Field204 {
+      get { return field204_; }
+    }
+    
+    public const int Field205FieldNumber = 205;
+    private bool hasField205;
+    private string field205_ = "";
+    public bool HasField205 {
+      get { return hasField205; }
+    }
+    public string Field205 {
+      get { return field205_; }
+    }
+    
+    public const int Field207FieldNumber = 207;
+    private bool hasField207;
+    private ulong field207_ = 0UL;
+    public bool HasField207 {
+      get { return hasField207; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong Field207 {
+      get { return field207_; }
+    }
+    
+    public const int Field300FieldNumber = 300;
+    private bool hasField300;
+    private ulong field300_ = 0UL;
+    public bool HasField300 {
+      get { return hasField300; }
+    }
+    [global::System.CLSCompliant(false)]
+    public ulong Field300 {
+      get { return field300_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      int size = SerializedSize;
+      if (HasField1) {
+        output.WriteInt32(1, Field1);
+      }
+      if (HasField2) {
+        output.WriteInt32(2, Field2);
+      }
+      if (HasField3) {
+        output.WriteInt32(3, Field3);
+      }
+      if (HasField12) {
+        output.WriteBool(12, Field12);
+      }
+      if (HasField13) {
+        output.WriteInt64(13, Field13);
+      }
+      if (HasField14) {
+        output.WriteInt64(14, Field14);
+      }
+      if (HasField15) {
+        output.WriteString(15, Field15);
+      }
+      if (HasField16) {
+        output.WriteInt32(16, Field16);
+      }
+      if (HasField19) {
+        output.WriteInt32(19, Field19);
+      }
+      if (HasField20) {
+        output.WriteBool(20, Field20);
+      }
+      if (HasField21) {
+        output.WriteFixed64(21, Field21);
+      }
+      if (HasField22) {
+        output.WriteInt32(22, Field22);
+      }
+      if (HasField23) {
+        output.WriteBool(23, Field23);
+      }
+      if (HasField28) {
+        output.WriteBool(28, Field28);
+      }
+      if (HasField203) {
+        output.WriteFixed32(203, Field203);
+      }
+      if (HasField204) {
+        output.WriteInt32(204, Field204);
+      }
+      if (HasField205) {
+        output.WriteString(205, Field205);
+      }
+      if (HasField206) {
+        output.WriteBool(206, Field206);
+      }
+      if (HasField207) {
+        output.WriteUInt64(207, Field207);
+      }
+      if (HasField300) {
+        output.WriteUInt64(300, Field300);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasField1) {
+          size += pb::CodedOutputStream.ComputeInt32Size(1, Field1);
+        }
+        if (HasField2) {
+          size += pb::CodedOutputStream.ComputeInt32Size(2, Field2);
+        }
+        if (HasField3) {
+          size += pb::CodedOutputStream.ComputeInt32Size(3, Field3);
+        }
+        if (HasField15) {
+          size += pb::CodedOutputStream.ComputeStringSize(15, Field15);
+        }
+        if (HasField12) {
+          size += pb::CodedOutputStream.ComputeBoolSize(12, Field12);
+        }
+        if (HasField13) {
+          size += pb::CodedOutputStream.ComputeInt64Size(13, Field13);
+        }
+        if (HasField14) {
+          size += pb::CodedOutputStream.ComputeInt64Size(14, Field14);
+        }
+        if (HasField16) {
+          size += pb::CodedOutputStream.ComputeInt32Size(16, Field16);
+        }
+        if (HasField19) {
+          size += pb::CodedOutputStream.ComputeInt32Size(19, Field19);
+        }
+        if (HasField20) {
+          size += pb::CodedOutputStream.ComputeBoolSize(20, Field20);
+        }
+        if (HasField28) {
+          size += pb::CodedOutputStream.ComputeBoolSize(28, Field28);
+        }
+        if (HasField21) {
+          size += pb::CodedOutputStream.ComputeFixed64Size(21, Field21);
+        }
+        if (HasField22) {
+          size += pb::CodedOutputStream.ComputeInt32Size(22, Field22);
+        }
+        if (HasField23) {
+          size += pb::CodedOutputStream.ComputeBoolSize(23, Field23);
+        }
+        if (HasField206) {
+          size += pb::CodedOutputStream.ComputeBoolSize(206, Field206);
+        }
+        if (HasField203) {
+          size += pb::CodedOutputStream.ComputeFixed32Size(203, Field203);
+        }
+        if (HasField204) {
+          size += pb::CodedOutputStream.ComputeInt32Size(204, Field204);
+        }
+        if (HasField205) {
+          size += pb::CodedOutputStream.ComputeStringSize(205, Field205);
+        }
+        if (HasField207) {
+          size += pb::CodedOutputStream.ComputeUInt64Size(207, Field207);
+        }
+        if (HasField300) {
+          size += pb::CodedOutputStream.ComputeUInt64Size(300, Field300);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static SpeedMessage1SubMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SpeedMessage1SubMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SpeedMessage1SubMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SpeedMessage1SubMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SpeedMessage1SubMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SpeedMessage1SubMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static SpeedMessage1SubMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static SpeedMessage1SubMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static SpeedMessage1SubMessage ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SpeedMessage1SubMessage ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(SpeedMessage1SubMessage prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
+    public sealed partial class Builder : pb::GeneratedBuilder<SpeedMessage1SubMessage, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {}
+      
+      SpeedMessage1SubMessage result = new SpeedMessage1SubMessage();
+      
+      protected override SpeedMessage1SubMessage MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override Builder Clear() {
+        result = new SpeedMessage1SubMessage();
+        return this;
+      }
+      
+      public override Builder Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.Descriptor; }
+      }
+      
+      public override SpeedMessage1SubMessage DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.DefaultInstance; }
+      }
+      
+      public override SpeedMessage1SubMessage BuildPartial() {
+        if (result == null) {
+          throw new global::System.InvalidOperationException("build() has already been called on this Builder");
+        }
+        SpeedMessage1SubMessage returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is SpeedMessage1SubMessage) {
+          return MergeFrom((SpeedMessage1SubMessage) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(SpeedMessage1SubMessage other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.SpeedMessage1SubMessage.DefaultInstance) return this;
+        if (other.HasField1) {
+          Field1 = other.Field1;
+        }
+        if (other.HasField2) {
+          Field2 = other.Field2;
+        }
+        if (other.HasField3) {
+          Field3 = other.Field3;
+        }
+        if (other.HasField15) {
+          Field15 = other.Field15;
+        }
+        if (other.HasField12) {
+          Field12 = other.Field12;
+        }
+        if (other.HasField13) {
+          Field13 = other.Field13;
+        }
+        if (other.HasField14) {
+          Field14 = other.Field14;
+        }
+        if (other.HasField16) {
+          Field16 = other.Field16;
+        }
+        if (other.HasField19) {
+          Field19 = other.Field19;
+        }
+        if (other.HasField20) {
+          Field20 = other.Field20;
+        }
+        if (other.HasField28) {
+          Field28 = other.Field28;
+        }
+        if (other.HasField21) {
+          Field21 = other.Field21;
+        }
+        if (other.HasField22) {
+          Field22 = other.Field22;
+        }
+        if (other.HasField23) {
+          Field23 = other.Field23;
+        }
+        if (other.HasField206) {
+          Field206 = other.Field206;
+        }
+        if (other.HasField203) {
+          Field203 = other.Field203;
+        }
+        if (other.HasField204) {
+          Field204 = other.Field204;
+        }
+        if (other.HasField205) {
+          Field205 = other.Field205;
+        }
+        if (other.HasField207) {
+          Field207 = other.Field207;
+        }
+        if (other.HasField300) {
+          Field300 = other.Field300;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0: {
+              if (unknownFields != null) {
+                this.UnknownFields = unknownFields.Build();
+              }
+              return this;
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag);
+              break;
+            }
+            case 8: {
+              Field1 = input.ReadInt32();
+              break;
+            }
+            case 16: {
+              Field2 = input.ReadInt32();
+              break;
+            }
+            case 24: {
+              Field3 = input.ReadInt32();
+              break;
+            }
+            case 96: {
+              Field12 = input.ReadBool();
+              break;
+            }
+            case 104: {
+              Field13 = input.ReadInt64();
+              break;
+            }
+            case 112: {
+              Field14 = input.ReadInt64();
+              break;
+            }
+            case 122: {
+              Field15 = input.ReadString();
+              break;
+            }
+            case 128: {
+              Field16 = input.ReadInt32();
+              break;
+            }
+            case 152: {
+              Field19 = input.ReadInt32();
+              break;
+            }
+            case 160: {
+              Field20 = input.ReadBool();
+              break;
+            }
+            case 169: {
+              Field21 = input.ReadFixed64();
+              break;
+            }
+            case 176: {
+              Field22 = input.ReadInt32();
+              break;
+            }
+            case 184: {
+              Field23 = input.ReadBool();
+              break;
+            }
+            case 224: {
+              Field28 = input.ReadBool();
+              break;
+            }
+            case 1629: {
+              Field203 = input.ReadFixed32();
+              break;
+            }
+            case 1632: {
+              Field204 = input.ReadInt32();
+              break;
+            }
+            case 1642: {
+              Field205 = input.ReadString();
+              break;
+            }
+            case 1648: {
+              Field206 = input.ReadBool();
+              break;
+            }
+            case 1656: {
+              Field207 = input.ReadUInt64();
+              break;
+            }
+            case 2400: {
+              Field300 = input.ReadUInt64();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      public bool HasField1 {
+        get { return result.HasField1; }
+      }
+      public int Field1 {
+        get { return result.Field1; }
+        set { SetField1(value); }
+      }
+      public Builder SetField1(int value) {
+        result.hasField1 = true;
+        result.field1_ = value;
+        return this;
+      }
+      public Builder ClearField1() {
+        result.hasField1 = false;
+        result.field1_ = 0;
+        return this;
+      }
+      
+      public bool HasField2 {
+        get { return result.HasField2; }
+      }
+      public int Field2 {
+        get { return result.Field2; }
+        set { SetField2(value); }
+      }
+      public Builder SetField2(int value) {
+        result.hasField2 = true;
+        result.field2_ = value;
+        return this;
+      }
+      public Builder ClearField2() {
+        result.hasField2 = false;
+        result.field2_ = 0;
+        return this;
+      }
+      
+      public bool HasField3 {
+        get { return result.HasField3; }
+      }
+      public int Field3 {
+        get { return result.Field3; }
+        set { SetField3(value); }
+      }
+      public Builder SetField3(int value) {
+        result.hasField3 = true;
+        result.field3_ = value;
+        return this;
+      }
+      public Builder ClearField3() {
+        result.hasField3 = false;
+        result.field3_ = 0;
+        return this;
+      }
+      
+      public bool HasField15 {
+        get { return result.HasField15; }
+      }
+      public string Field15 {
+        get { return result.Field15; }
+        set { SetField15(value); }
+      }
+      public Builder SetField15(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.hasField15 = true;
+        result.field15_ = value;
+        return this;
+      }
+      public Builder ClearField15() {
+        result.hasField15 = false;
+        result.field15_ = "";
+        return this;
+      }
+      
+      public bool HasField12 {
+        get { return result.HasField12; }
+      }
+      public bool Field12 {
+        get { return result.Field12; }
+        set { SetField12(value); }
+      }
+      public Builder SetField12(bool value) {
+        result.hasField12 = true;
+        result.field12_ = value;
+        return this;
+      }
+      public Builder ClearField12() {
+        result.hasField12 = false;
+        result.field12_ = true;
+        return this;
+      }
+      
+      public bool HasField13 {
+        get { return result.HasField13; }
+      }
+      public long Field13 {
+        get { return result.Field13; }
+        set { SetField13(value); }
+      }
+      public Builder SetField13(long value) {
+        result.hasField13 = true;
+        result.field13_ = value;
+        return this;
+      }
+      public Builder ClearField13() {
+        result.hasField13 = false;
+        result.field13_ = 0L;
+        return this;
+      }
+      
+      public bool HasField14 {
+        get { return result.HasField14; }
+      }
+      public long Field14 {
+        get { return result.Field14; }
+        set { SetField14(value); }
+      }
+      public Builder SetField14(long value) {
+        result.hasField14 = true;
+        result.field14_ = value;
+        return this;
+      }
+      public Builder ClearField14() {
+        result.hasField14 = false;
+        result.field14_ = 0L;
+        return this;
+      }
+      
+      public bool HasField16 {
+        get { return result.HasField16; }
+      }
+      public int Field16 {
+        get { return result.Field16; }
+        set { SetField16(value); }
+      }
+      public Builder SetField16(int value) {
+        result.hasField16 = true;
+        result.field16_ = value;
+        return this;
+      }
+      public Builder ClearField16() {
+        result.hasField16 = false;
+        result.field16_ = 0;
+        return this;
+      }
+      
+      public bool HasField19 {
+        get { return result.HasField19; }
+      }
+      public int Field19 {
+        get { return result.Field19; }
+        set { SetField19(value); }
+      }
+      public Builder SetField19(int value) {
+        result.hasField19 = true;
+        result.field19_ = value;
+        return this;
+      }
+      public Builder ClearField19() {
+        result.hasField19 = false;
+        result.field19_ = 2;
+        return this;
+      }
+      
+      public bool HasField20 {
+        get { return result.HasField20; }
+      }
+      public bool Field20 {
+        get { return result.Field20; }
+        set { SetField20(value); }
+      }
+      public Builder SetField20(bool value) {
+        result.hasField20 = true;
+        result.field20_ = value;
+        return this;
+      }
+      public Builder ClearField20() {
+        result.hasField20 = false;
+        result.field20_ = true;
+        return this;
+      }
+      
+      public bool HasField28 {
+        get { return result.HasField28; }
+      }
+      public bool Field28 {
+        get { return result.Field28; }
+        set { SetField28(value); }
+      }
+      public Builder SetField28(bool value) {
+        result.hasField28 = true;
+        result.field28_ = value;
+        return this;
+      }
+      public Builder ClearField28() {
+        result.hasField28 = false;
+        result.field28_ = true;
+        return this;
+      }
+      
+      public bool HasField21 {
+        get { return result.HasField21; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong Field21 {
+        get { return result.Field21; }
+        set { SetField21(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetField21(ulong value) {
+        result.hasField21 = true;
+        result.field21_ = value;
+        return this;
+      }
+      public Builder ClearField21() {
+        result.hasField21 = false;
+        result.field21_ = 0;
+        return this;
+      }
+      
+      public bool HasField22 {
+        get { return result.HasField22; }
+      }
+      public int Field22 {
+        get { return result.Field22; }
+        set { SetField22(value); }
+      }
+      public Builder SetField22(int value) {
+        result.hasField22 = true;
+        result.field22_ = value;
+        return this;
+      }
+      public Builder ClearField22() {
+        result.hasField22 = false;
+        result.field22_ = 0;
+        return this;
+      }
+      
+      public bool HasField23 {
+        get { return result.HasField23; }
+      }
+      public bool Field23 {
+        get { return result.Field23; }
+        set { SetField23(value); }
+      }
+      public Builder SetField23(bool value) {
+        result.hasField23 = true;
+        result.field23_ = value;
+        return this;
+      }
+      public Builder ClearField23() {
+        result.hasField23 = false;
+        result.field23_ = false;
+        return this;
+      }
+      
+      public bool HasField206 {
+        get { return result.HasField206; }
+      }
+      public bool Field206 {
+        get { return result.Field206; }
+        set { SetField206(value); }
+      }
+      public Builder SetField206(bool value) {
+        result.hasField206 = true;
+        result.field206_ = value;
+        return this;
+      }
+      public Builder ClearField206() {
+        result.hasField206 = false;
+        result.field206_ = false;
+        return this;
+      }
+      
+      public bool HasField203 {
+        get { return result.HasField203; }
+      }
+      [global::System.CLSCompliant(false)]
+      public uint Field203 {
+        get { return result.Field203; }
+        set { SetField203(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetField203(uint value) {
+        result.hasField203 = true;
+        result.field203_ = value;
+        return this;
+      }
+      public Builder ClearField203() {
+        result.hasField203 = false;
+        result.field203_ = 0;
+        return this;
+      }
+      
+      public bool HasField204 {
+        get { return result.HasField204; }
+      }
+      public int Field204 {
+        get { return result.Field204; }
+        set { SetField204(value); }
+      }
+      public Builder SetField204(int value) {
+        result.hasField204 = true;
+        result.field204_ = value;
+        return this;
+      }
+      public Builder ClearField204() {
+        result.hasField204 = false;
+        result.field204_ = 0;
+        return this;
+      }
+      
+      public bool HasField205 {
+        get { return result.HasField205; }
+      }
+      public string Field205 {
+        get { return result.Field205; }
+        set { SetField205(value); }
+      }
+      public Builder SetField205(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.hasField205 = true;
+        result.field205_ = value;
+        return this;
+      }
+      public Builder ClearField205() {
+        result.hasField205 = false;
+        result.field205_ = "";
+        return this;
+      }
+      
+      public bool HasField207 {
+        get { return result.HasField207; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong Field207 {
+        get { return result.Field207; }
+        set { SetField207(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetField207(ulong value) {
+        result.hasField207 = true;
+        result.field207_ = value;
+        return this;
+      }
+      public Builder ClearField207() {
+        result.hasField207 = false;
+        result.field207_ = 0UL;
+        return this;
+      }
+      
+      public bool HasField300 {
+        get { return result.HasField300; }
+      }
+      [global::System.CLSCompliant(false)]
+      public ulong Field300 {
+        get { return result.Field300; }
+        set { SetField300(value); }
+      }
+      [global::System.CLSCompliant(false)]
+      public Builder SetField300(ulong value) {
+        result.hasField300 = true;
+        result.field300_ = value;
+        return this;
+      }
+      public Builder ClearField300() {
+        result.hasField300 = false;
+        result.field300_ = 0UL;
+        return this;
+      }
+    }
+    static SpeedMessage1SubMessage() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestGoogleSpeedProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+  [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
+  public sealed partial class SpeedMessage2 : pb::GeneratedMessage<SpeedMessage2, SpeedMessage2.Builder> {
+    private static readonly SpeedMessage2 defaultInstance = new Builder().BuildPartial();
+    public static SpeedMessage2 DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override SpeedMessage2 DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    protected override SpeedMessage2 ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestGoogleSpeedProtoFile.internal__static_benchmarks_SpeedMessage2__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<SpeedMessage2, SpeedMessage2.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestGoogleSpeedProtoFile.internal__static_benchmarks_SpeedMessage2__FieldAccessorTable; }
+    }
+    
+    #region Nested types
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
+    public static class Types {
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+      [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
+      public sealed partial class Group1 : pb::GeneratedMessage<Group1, Group1.Builder> {
+        private static readonly Group1 defaultInstance = new Builder().BuildPartial();
+        public static Group1 DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override Group1 DefaultInstanceForType {
+          get { return defaultInstance; }
+        }
+        
+        protected override Group1 ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.ProtocolBuffers.TestProtos.UnitTestGoogleSpeedProtoFile.internal__static_benchmarks_SpeedMessage2_Group1__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<Group1, Group1.Builder> InternalFieldAccessors {
+          get { return global::Google.ProtocolBuffers.TestProtos.UnitTestGoogleSpeedProtoFile.internal__static_benchmarks_SpeedMessage2_Group1__FieldAccessorTable; }
+        }
+        
+        public const int Field11FieldNumber = 11;
+        private bool hasField11;
+        private float field11_ = 0F;
+        public bool HasField11 {
+          get { return hasField11; }
+        }
+        public float Field11 {
+          get { return field11_; }
+        }
+        
+        public const int Field26FieldNumber = 26;
+        private bool hasField26;
+        private float field26_ = 0F;
+        public bool HasField26 {
+          get { return hasField26; }
+        }
+        public float Field26 {
+          get { return field26_; }
+        }
+        
+        public const int Field12FieldNumber = 12;
+        private bool hasField12;
+        private string field12_ = "";
+        public bool HasField12 {
+          get { return hasField12; }
+        }
+        public string Field12 {
+          get { return field12_; }
+        }
+        
+        public const int Field13FieldNumber = 13;
+        private bool hasField13;
+        private string field13_ = "";
+        public bool HasField13 {
+          get { return hasField13; }
+        }
+        public string Field13 {
+          get { return field13_; }
+        }
+        
+        public const int Field14FieldNumber = 14;
+        private pbc::PopsicleList<string> field14_ = new pbc::PopsicleList<string>();
+        public scg::IList<string> Field14List {
+          get { return pbc::Lists.AsReadOnly(field14_); }
+        }
+        public int Field14Count {
+          get { return field14_.Count; }
+        }
+        public string GetField14(int index) {
+          return field14_[index];
+        }
+        
+        public const int Field15FieldNumber = 15;
+        private bool hasField15;
+        private ulong field15_ = 0UL;
+        public bool HasField15 {
+          get { return hasField15; }
+        }
+        [global::System.CLSCompliant(false)]
+        public ulong Field15 {
+          get { return field15_; }
+        }
+        
+        public const int Field5FieldNumber = 5;
+        private bool hasField5;
+        private int field5_ = 0;
+        public bool HasField5 {
+          get { return hasField5; }
+        }
+        public int Field5 {
+          get { return field5_; }
+        }
+        
+        public const int Field27FieldNumber = 27;
+        private bool hasField27;
+        private string field27_ = "";
+        public bool HasField27 {
+          get { return hasField27; }
+        }
+        public string Field27 {
+          get { return field27_; }
+        }
+        
+        public const int Field28FieldNumber = 28;
+        private bool hasField28;
+        private int field28_ = 0;
+        public bool HasField28 {
+          get { return hasField28; }
+        }
+        public int Field28 {
+          get { return field28_; }
+        }
+        
+        public const int Field29FieldNumber = 29;
+        private bool hasField29;
+        private string field29_ = "";
+        public bool HasField29 {
+          get { return hasField29; }
+        }
+        public string Field29 {
+          get { return field29_; }
+        }
+        
+        public const int Field16FieldNumber = 16;
+        private bool hasField16;
+        private string field16_ = "";
+        public bool HasField16 {
+          get { return hasField16; }
+        }
+        public string Field16 {
+          get { return field16_; }
+        }
+        
+        public const int Field22FieldNumber = 22;
+        private pbc::PopsicleList<string> field22_ = new pbc::PopsicleList<string>();
+        public scg::IList<string> Field22List {
+          get { return pbc::Lists.AsReadOnly(field22_); }
+        }
+        public int Field22Count {
+          get { return field22_.Count; }
+        }
+        public string GetField22(int index) {
+          return field22_[index];
+        }
+        
+        public const int Field73FieldNumber = 73;
+        private pbc::PopsicleList<int> field73_ = new pbc::PopsicleList<int>();
+        public scg::IList<int> Field73List {
+          get { return pbc::Lists.AsReadOnly(field73_); }
+        }
+        public int Field73Count {
+          get { return field73_.Count; }
+        }
+        public int GetField73(int index) {
+          return field73_[index];
+        }
+        
+        public const int Field20FieldNumber = 20;
+        private bool hasField20;
+        private int field20_ = 0;
+        public bool HasField20 {
+          get { return hasField20; }
+        }
+        public int Field20 {
+          get { return field20_; }
+        }
+        
+        public const int Field24FieldNumber = 24;
+        private bool hasField24;
+        private string field24_ = "";
+        public bool HasField24 {
+          get { return hasField24; }
+        }
+        public string Field24 {
+          get { return field24_; }
+        }
+        
+        public const int Field31FieldNumber = 31;
+        private bool hasField31;
+        private global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage field31_ = global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.DefaultInstance;
+        public bool HasField31 {
+          get { return hasField31; }
+        }
+        public global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage Field31 {
+          get { return field31_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            if (!hasField11) return false;
+            if (!hasField15) return false;
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::CodedOutputStream output) {
+          int size = SerializedSize;
+          if (HasField5) {
+            output.WriteInt32(5, Field5);
+          }
+          if (HasField11) {
+            output.WriteFloat(11, Field11);
+          }
+          if (HasField12) {
+            output.WriteString(12, Field12);
+          }
+          if (HasField13) {
+            output.WriteString(13, Field13);
+          }
+          if (field14_.Count > 0) {
+            foreach (string element in field14_) {
+              output.WriteString(14, element);
+            }
+          }
+          if (HasField15) {
+            output.WriteUInt64(15, Field15);
+          }
+          if (HasField16) {
+            output.WriteString(16, Field16);
+          }
+          if (HasField20) {
+            output.WriteInt32(20, Field20);
+          }
+          if (field22_.Count > 0) {
+            foreach (string element in field22_) {
+              output.WriteString(22, element);
+            }
+          }
+          if (HasField24) {
+            output.WriteString(24, Field24);
+          }
+          if (HasField26) {
+            output.WriteFloat(26, Field26);
+          }
+          if (HasField27) {
+            output.WriteString(27, Field27);
+          }
+          if (HasField28) {
+            output.WriteInt32(28, Field28);
+          }
+          if (HasField29) {
+            output.WriteString(29, Field29);
+          }
+          if (HasField31) {
+            output.WriteMessage(31, Field31);
+          }
+          if (field73_.Count > 0) {
+            foreach (int element in field73_) {
+              output.WriteInt32(73, element);
+            }
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (HasField11) {
+              size += pb::CodedOutputStream.ComputeFloatSize(11, Field11);
+            }
+            if (HasField26) {
+              size += pb::CodedOutputStream.ComputeFloatSize(26, Field26);
+            }
+            if (HasField12) {
+              size += pb::CodedOutputStream.ComputeStringSize(12, Field12);
+            }
+            if (HasField13) {
+              size += pb::CodedOutputStream.ComputeStringSize(13, Field13);
+            }
+            {
+              int dataSize = 0;
+              foreach (string element in Field14List) {
+                dataSize += pb::CodedOutputStream.ComputeStringSizeNoTag(element);
+              }
+              size += dataSize;
+              size += 1 * field14_.Count;
+            }
+            if (HasField15) {
+              size += pb::CodedOutputStream.ComputeUInt64Size(15, Field15);
+            }
+            if (HasField5) {
+              size += pb::CodedOutputStream.ComputeInt32Size(5, Field5);
+            }
+            if (HasField27) {
+              size += pb::CodedOutputStream.ComputeStringSize(27, Field27);
+            }
+            if (HasField28) {
+              size += pb::CodedOutputStream.ComputeInt32Size(28, Field28);
+            }
+            if (HasField29) {
+              size += pb::CodedOutputStream.ComputeStringSize(29, Field29);
+            }
+            if (HasField16) {
+              size += pb::CodedOutputStream.ComputeStringSize(16, Field16);
+            }
+            {
+              int dataSize = 0;
+              foreach (string element in Field22List) {
+                dataSize += pb::CodedOutputStream.ComputeStringSizeNoTag(element);
+              }
+              size += dataSize;
+              size += 2 * field22_.Count;
+            }
+            {
+              int dataSize = 0;
+              foreach (int element in Field73List) {
+                dataSize += pb::CodedOutputStream.ComputeInt32SizeNoTag(element);
+              }
+              size += dataSize;
+              size += 2 * field73_.Count;
+            }
+            if (HasField20) {
+              size += pb::CodedOutputStream.ComputeInt32Size(20, Field20);
+            }
+            if (HasField24) {
+              size += pb::CodedOutputStream.ComputeStringSize(24, Field24);
+            }
+            if (HasField31) {
+              size += pb::CodedOutputStream.ComputeMessageSize(31, Field31);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static Group1 ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static Group1 ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static Group1 ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static Group1 ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static Group1 ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static Group1 ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static Group1 ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static Group1 ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static Group1 ParseFrom(pb::CodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static Group1 ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(Group1 prototype) {
+          return (Builder) new Builder().MergeFrom(prototype);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
+        public sealed partial class Builder : pb::GeneratedBuilder<Group1, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {}
+          
+          Group1 result = new Group1();
+          
+          protected override Group1 MessageBeingBuilt {
+            get { return result; }
+          }
+          
+          public override Builder Clear() {
+            result = new Group1();
+            return this;
+          }
+          
+          public override Builder Clone() {
+            return new Builder().MergeFrom(result);
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1.Descriptor; }
+          }
+          
+          public override Group1 DefaultInstanceForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1.DefaultInstance; }
+          }
+          
+          public override Group1 BuildPartial() {
+            if (result == null) {
+              throw new global::System.InvalidOperationException("build() has already been called on this Builder");
+            }
+            result.field14_.MakeReadOnly();
+            result.field22_.MakeReadOnly();
+            result.field73_.MakeReadOnly();
+            Group1 returnMe = result;
+            result = null;
+            return returnMe;
+          }
+          
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is Group1) {
+              return MergeFrom((Group1) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(Group1 other) {
+            if (other == global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1.DefaultInstance) return this;
+            if (other.HasField11) {
+              Field11 = other.Field11;
+            }
+            if (other.HasField26) {
+              Field26 = other.Field26;
+            }
+            if (other.HasField12) {
+              Field12 = other.Field12;
+            }
+            if (other.HasField13) {
+              Field13 = other.Field13;
+            }
+            if (other.field14_.Count != 0) {
+              base.AddRange(other.field14_, result.field14_);
+            }
+            if (other.HasField15) {
+              Field15 = other.Field15;
+            }
+            if (other.HasField5) {
+              Field5 = other.Field5;
+            }
+            if (other.HasField27) {
+              Field27 = other.Field27;
+            }
+            if (other.HasField28) {
+              Field28 = other.Field28;
+            }
+            if (other.HasField29) {
+              Field29 = other.Field29;
+            }
+            if (other.HasField16) {
+              Field16 = other.Field16;
+            }
+            if (other.field22_.Count != 0) {
+              base.AddRange(other.field22_, result.field22_);
+            }
+            if (other.field73_.Count != 0) {
+              base.AddRange(other.field73_, result.field73_);
+            }
+            if (other.HasField20) {
+              Field20 = other.Field20;
+            }
+            if (other.HasField24) {
+              Field24 = other.Field24;
+            }
+            if (other.HasField31) {
+              MergeField31(other.Field31);
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::CodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            while (true) {
+              uint tag = input.ReadTag();
+              switch (tag) {
+                case 0: {
+                  if (unknownFields != null) {
+                    this.UnknownFields = unknownFields.Build();
+                  }
+                  return this;
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag);
+                  break;
+                }
+                case 40: {
+                  Field5 = input.ReadInt32();
+                  break;
+                }
+                case 93: {
+                  Field11 = input.ReadFloat();
+                  break;
+                }
+                case 98: {
+                  Field12 = input.ReadString();
+                  break;
+                }
+                case 106: {
+                  Field13 = input.ReadString();
+                  break;
+                }
+                case 114: {
+                  AddField14(input.ReadString());
+                  break;
+                }
+                case 120: {
+                  Field15 = input.ReadUInt64();
+                  break;
+                }
+                case 130: {
+                  Field16 = input.ReadString();
+                  break;
+                }
+                case 160: {
+                  Field20 = input.ReadInt32();
+                  break;
+                }
+                case 178: {
+                  AddField22(input.ReadString());
+                  break;
+                }
+                case 194: {
+                  Field24 = input.ReadString();
+                  break;
+                }
+                case 213: {
+                  Field26 = input.ReadFloat();
+                  break;
+                }
+                case 218: {
+                  Field27 = input.ReadString();
+                  break;
+                }
+                case 224: {
+                  Field28 = input.ReadInt32();
+                  break;
+                }
+                case 234: {
+                  Field29 = input.ReadString();
+                  break;
+                }
+                case 250: {
+                  global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.CreateBuilder();
+                  if (HasField31) {
+                    subBuilder.MergeFrom(Field31);
+                  }
+                  input.ReadMessage(subBuilder, extensionRegistry);
+                  Field31 = subBuilder.BuildPartial();
+                  break;
+                }
+                case 584: {
+                  AddField73(input.ReadInt32());
+                  break;
+                }
+              }
+            }
+          }
+          
+          
+          public bool HasField11 {
+            get { return result.HasField11; }
+          }
+          public float Field11 {
+            get { return result.Field11; }
+            set { SetField11(value); }
+          }
+          public Builder SetField11(float value) {
+            result.hasField11 = true;
+            result.field11_ = value;
+            return this;
+          }
+          public Builder ClearField11() {
+            result.hasField11 = false;
+            result.field11_ = 0F;
+            return this;
+          }
+          
+          public bool HasField26 {
+            get { return result.HasField26; }
+          }
+          public float Field26 {
+            get { return result.Field26; }
+            set { SetField26(value); }
+          }
+          public Builder SetField26(float value) {
+            result.hasField26 = true;
+            result.field26_ = value;
+            return this;
+          }
+          public Builder ClearField26() {
+            result.hasField26 = false;
+            result.field26_ = 0F;
+            return this;
+          }
+          
+          public bool HasField12 {
+            get { return result.HasField12; }
+          }
+          public string Field12 {
+            get { return result.Field12; }
+            set { SetField12(value); }
+          }
+          public Builder SetField12(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.hasField12 = true;
+            result.field12_ = value;
+            return this;
+          }
+          public Builder ClearField12() {
+            result.hasField12 = false;
+            result.field12_ = "";
+            return this;
+          }
+          
+          public bool HasField13 {
+            get { return result.HasField13; }
+          }
+          public string Field13 {
+            get { return result.Field13; }
+            set { SetField13(value); }
+          }
+          public Builder SetField13(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.hasField13 = true;
+            result.field13_ = value;
+            return this;
+          }
+          public Builder ClearField13() {
+            result.hasField13 = false;
+            result.field13_ = "";
+            return this;
+          }
+          
+          public pbc::IPopsicleList<string> Field14List {
+            get { return result.field14_; }
+          }
+          public int Field14Count {
+            get { return result.Field14Count; }
+          }
+          public string GetField14(int index) {
+            return result.GetField14(index);
+          }
+          public Builder SetField14(int index, string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.field14_[index] = value;
+            return this;
+          }
+          public Builder AddField14(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.field14_.Add(value);
+            return this;
+          }
+          public Builder AddRangeField14(scg::IEnumerable<string> values) {
+            base.AddRange(values, result.field14_);
+            return this;
+          }
+          public Builder ClearField14() {
+            result.field14_.Clear();
+            return this;
+          }
+          
+          public bool HasField15 {
+            get { return result.HasField15; }
+          }
+          [global::System.CLSCompliant(false)]
+          public ulong Field15 {
+            get { return result.Field15; }
+            set { SetField15(value); }
+          }
+          [global::System.CLSCompliant(false)]
+          public Builder SetField15(ulong value) {
+            result.hasField15 = true;
+            result.field15_ = value;
+            return this;
+          }
+          public Builder ClearField15() {
+            result.hasField15 = false;
+            result.field15_ = 0UL;
+            return this;
+          }
+          
+          public bool HasField5 {
+            get { return result.HasField5; }
+          }
+          public int Field5 {
+            get { return result.Field5; }
+            set { SetField5(value); }
+          }
+          public Builder SetField5(int value) {
+            result.hasField5 = true;
+            result.field5_ = value;
+            return this;
+          }
+          public Builder ClearField5() {
+            result.hasField5 = false;
+            result.field5_ = 0;
+            return this;
+          }
+          
+          public bool HasField27 {
+            get { return result.HasField27; }
+          }
+          public string Field27 {
+            get { return result.Field27; }
+            set { SetField27(value); }
+          }
+          public Builder SetField27(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.hasField27 = true;
+            result.field27_ = value;
+            return this;
+          }
+          public Builder ClearField27() {
+            result.hasField27 = false;
+            result.field27_ = "";
+            return this;
+          }
+          
+          public bool HasField28 {
+            get { return result.HasField28; }
+          }
+          public int Field28 {
+            get { return result.Field28; }
+            set { SetField28(value); }
+          }
+          public Builder SetField28(int value) {
+            result.hasField28 = true;
+            result.field28_ = value;
+            return this;
+          }
+          public Builder ClearField28() {
+            result.hasField28 = false;
+            result.field28_ = 0;
+            return this;
+          }
+          
+          public bool HasField29 {
+            get { return result.HasField29; }
+          }
+          public string Field29 {
+            get { return result.Field29; }
+            set { SetField29(value); }
+          }
+          public Builder SetField29(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.hasField29 = true;
+            result.field29_ = value;
+            return this;
+          }
+          public Builder ClearField29() {
+            result.hasField29 = false;
+            result.field29_ = "";
+            return this;
+          }
+          
+          public bool HasField16 {
+            get { return result.HasField16; }
+          }
+          public string Field16 {
+            get { return result.Field16; }
+            set { SetField16(value); }
+          }
+          public Builder SetField16(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.hasField16 = true;
+            result.field16_ = value;
+            return this;
+          }
+          public Builder ClearField16() {
+            result.hasField16 = false;
+            result.field16_ = "";
+            return this;
+          }
+          
+          public pbc::IPopsicleList<string> Field22List {
+            get { return result.field22_; }
+          }
+          public int Field22Count {
+            get { return result.Field22Count; }
+          }
+          public string GetField22(int index) {
+            return result.GetField22(index);
+          }
+          public Builder SetField22(int index, string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.field22_[index] = value;
+            return this;
+          }
+          public Builder AddField22(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.field22_.Add(value);
+            return this;
+          }
+          public Builder AddRangeField22(scg::IEnumerable<string> values) {
+            base.AddRange(values, result.field22_);
+            return this;
+          }
+          public Builder ClearField22() {
+            result.field22_.Clear();
+            return this;
+          }
+          
+          public pbc::IPopsicleList<int> Field73List {
+            get { return result.field73_; }
+          }
+          public int Field73Count {
+            get { return result.Field73Count; }
+          }
+          public int GetField73(int index) {
+            return result.GetField73(index);
+          }
+          public Builder SetField73(int index, int value) {
+            result.field73_[index] = value;
+            return this;
+          }
+          public Builder AddField73(int value) {
+            result.field73_.Add(value);
+            return this;
+          }
+          public Builder AddRangeField73(scg::IEnumerable<int> values) {
+            base.AddRange(values, result.field73_);
+            return this;
+          }
+          public Builder ClearField73() {
+            result.field73_.Clear();
+            return this;
+          }
+          
+          public bool HasField20 {
+            get { return result.HasField20; }
+          }
+          public int Field20 {
+            get { return result.Field20; }
+            set { SetField20(value); }
+          }
+          public Builder SetField20(int value) {
+            result.hasField20 = true;
+            result.field20_ = value;
+            return this;
+          }
+          public Builder ClearField20() {
+            result.hasField20 = false;
+            result.field20_ = 0;
+            return this;
+          }
+          
+          public bool HasField24 {
+            get { return result.HasField24; }
+          }
+          public string Field24 {
+            get { return result.Field24; }
+            set { SetField24(value); }
+          }
+          public Builder SetField24(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.hasField24 = true;
+            result.field24_ = value;
+            return this;
+          }
+          public Builder ClearField24() {
+            result.hasField24 = false;
+            result.field24_ = "";
+            return this;
+          }
+          
+          public bool HasField31 {
+           get { return result.HasField31; }
+          }
+          public global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage Field31 {
+            get { return result.Field31; }
+            set { SetField31(value); }
+          }
+          public Builder SetField31(global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.hasField31 = true;
+            result.field31_ = value;
+            return this;
+          }
+          public Builder SetField31(global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.Builder builderForValue) {
+            pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+            result.hasField31 = true;
+            result.field31_ = builderForValue.Build();
+            return this;
+          }
+          public Builder MergeField31(global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            if (result.HasField31 &&
+                result.field31_ != global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.DefaultInstance) {
+                result.field31_ = global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.CreateBuilder(result.field31_).MergeFrom(value).BuildPartial();
+            } else {
+              result.field31_ = value;
+            }
+            result.hasField31 = true;
+            return this;
+          }
+          public Builder ClearField31() {
+            result.hasField31 = false;
+            result.field31_ = global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.DefaultInstance;
+            return this;
+          }
+        }
+        static Group1() {
+          object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestGoogleSpeedProtoFile.Descriptor, null);
+        }
+      }
+      
+    }
+    #endregion
+    
+    public const int Field1FieldNumber = 1;
+    private bool hasField1;
+    private string field1_ = "";
+    public bool HasField1 {
+      get { return hasField1; }
+    }
+    public string Field1 {
+      get { return field1_; }
+    }
+    
+    public const int Field3FieldNumber = 3;
+    private bool hasField3;
+    private long field3_ = 0L;
+    public bool HasField3 {
+      get { return hasField3; }
+    }
+    public long Field3 {
+      get { return field3_; }
+    }
+    
+    public const int Field4FieldNumber = 4;
+    private bool hasField4;
+    private long field4_ = 0L;
+    public bool HasField4 {
+      get { return hasField4; }
+    }
+    public long Field4 {
+      get { return field4_; }
+    }
+    
+    public const int Field30FieldNumber = 30;
+    private bool hasField30;
+    private long field30_ = 0L;
+    public bool HasField30 {
+      get { return hasField30; }
+    }
+    public long Field30 {
+      get { return field30_; }
+    }
+    
+    public const int Field75FieldNumber = 75;
+    private bool hasField75;
+    private bool field75_ = false;
+    public bool HasField75 {
+      get { return hasField75; }
+    }
+    public bool Field75 {
+      get { return field75_; }
+    }
+    
+    public const int Field6FieldNumber = 6;
+    private bool hasField6;
+    private string field6_ = "";
+    public bool HasField6 {
+      get { return hasField6; }
+    }
+    public string Field6 {
+      get { return field6_; }
+    }
+    
+    public const int Field2FieldNumber = 2;
+    private bool hasField2;
+    private pb::ByteString field2_ = pb::ByteString.Empty;
+    public bool HasField2 {
+      get { return hasField2; }
+    }
+    public pb::ByteString Field2 {
+      get { return field2_; }
+    }
+    
+    public const int Field21FieldNumber = 21;
+    private bool hasField21;
+    private int field21_ = 0;
+    public bool HasField21 {
+      get { return hasField21; }
+    }
+    public int Field21 {
+      get { return field21_; }
+    }
+    
+    public const int Field71FieldNumber = 71;
+    private bool hasField71;
+    private int field71_ = 0;
+    public bool HasField71 {
+      get { return hasField71; }
+    }
+    public int Field71 {
+      get { return field71_; }
+    }
+    
+    public const int Field25FieldNumber = 25;
+    private bool hasField25;
+    private float field25_ = 0F;
+    public bool HasField25 {
+      get { return hasField25; }
+    }
+    public float Field25 {
+      get { return field25_; }
+    }
+    
+    public const int Field109FieldNumber = 109;
+    private bool hasField109;
+    private int field109_ = 0;
+    public bool HasField109 {
+      get { return hasField109; }
+    }
+    public int Field109 {
+      get { return field109_; }
+    }
+    
+    public const int Field210FieldNumber = 210;
+    private bool hasField210;
+    private int field210_ = 0;
+    public bool HasField210 {
+      get { return hasField210; }
+    }
+    public int Field210 {
+      get { return field210_; }
+    }
+    
+    public const int Field211FieldNumber = 211;
+    private bool hasField211;
+    private int field211_ = 0;
+    public bool HasField211 {
+      get { return hasField211; }
+    }
+    public int Field211 {
+      get { return field211_; }
+    }
+    
+    public const int Field212FieldNumber = 212;
+    private bool hasField212;
+    private int field212_ = 0;
+    public bool HasField212 {
+      get { return hasField212; }
+    }
+    public int Field212 {
+      get { return field212_; }
+    }
+    
+    public const int Field213FieldNumber = 213;
+    private bool hasField213;
+    private int field213_ = 0;
+    public bool HasField213 {
+      get { return hasField213; }
+    }
+    public int Field213 {
+      get { return field213_; }
+    }
+    
+    public const int Field216FieldNumber = 216;
+    private bool hasField216;
+    private int field216_ = 0;
+    public bool HasField216 {
+      get { return hasField216; }
+    }
+    public int Field216 {
+      get { return field216_; }
+    }
+    
+    public const int Field217FieldNumber = 217;
+    private bool hasField217;
+    private int field217_ = 0;
+    public bool HasField217 {
+      get { return hasField217; }
+    }
+    public int Field217 {
+      get { return field217_; }
+    }
+    
+    public const int Field218FieldNumber = 218;
+    private bool hasField218;
+    private int field218_ = 0;
+    public bool HasField218 {
+      get { return hasField218; }
+    }
+    public int Field218 {
+      get { return field218_; }
+    }
+    
+    public const int Field220FieldNumber = 220;
+    private bool hasField220;
+    private int field220_ = 0;
+    public bool HasField220 {
+      get { return hasField220; }
+    }
+    public int Field220 {
+      get { return field220_; }
+    }
+    
+    public const int Field221FieldNumber = 221;
+    private bool hasField221;
+    private int field221_ = 0;
+    public bool HasField221 {
+      get { return hasField221; }
+    }
+    public int Field221 {
+      get { return field221_; }
+    }
+    
+    public const int Field222FieldNumber = 222;
+    private bool hasField222;
+    private float field222_ = 0F;
+    public bool HasField222 {
+      get { return hasField222; }
+    }
+    public float Field222 {
+      get { return field222_; }
+    }
+    
+    public const int Field63FieldNumber = 63;
+    private bool hasField63;
+    private int field63_ = 0;
+    public bool HasField63 {
+      get { return hasField63; }
+    }
+    public int Field63 {
+      get { return field63_; }
+    }
+    
+    public const int Group1FieldNumber = 10;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1> group1_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1>();
+    public scg::IList<global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1> Group1List {
+      get { return group1_; }
+    }
+    public int Group1Count {
+      get { return group1_.Count; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1 GetGroup1(int index) {
+      return group1_[index];
+    }
+    
+    public const int Field128FieldNumber = 128;
+    private pbc::PopsicleList<string> field128_ = new pbc::PopsicleList<string>();
+    public scg::IList<string> Field128List {
+      get { return pbc::Lists.AsReadOnly(field128_); }
+    }
+    public int Field128Count {
+      get { return field128_.Count; }
+    }
+    public string GetField128(int index) {
+      return field128_[index];
+    }
+    
+    public const int Field131FieldNumber = 131;
+    private bool hasField131;
+    private long field131_ = 0L;
+    public bool HasField131 {
+      get { return hasField131; }
+    }
+    public long Field131 {
+      get { return field131_; }
+    }
+    
+    public const int Field127FieldNumber = 127;
+    private pbc::PopsicleList<string> field127_ = new pbc::PopsicleList<string>();
+    public scg::IList<string> Field127List {
+      get { return pbc::Lists.AsReadOnly(field127_); }
+    }
+    public int Field127Count {
+      get { return field127_.Count; }
+    }
+    public string GetField127(int index) {
+      return field127_[index];
+    }
+    
+    public const int Field129FieldNumber = 129;
+    private bool hasField129;
+    private int field129_ = 0;
+    public bool HasField129 {
+      get { return hasField129; }
+    }
+    public int Field129 {
+      get { return field129_; }
+    }
+    
+    public const int Field130FieldNumber = 130;
+    private pbc::PopsicleList<long> field130_ = new pbc::PopsicleList<long>();
+    public scg::IList<long> Field130List {
+      get { return pbc::Lists.AsReadOnly(field130_); }
+    }
+    public int Field130Count {
+      get { return field130_.Count; }
+    }
+    public long GetField130(int index) {
+      return field130_[index];
+    }
+    
+    public const int Field205FieldNumber = 205;
+    private bool hasField205;
+    private bool field205_ = false;
+    public bool HasField205 {
+      get { return hasField205; }
+    }
+    public bool Field205 {
+      get { return field205_; }
+    }
+    
+    public const int Field206FieldNumber = 206;
+    private bool hasField206;
+    private bool field206_ = false;
+    public bool HasField206 {
+      get { return hasField206; }
+    }
+    public bool Field206 {
+      get { return field206_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      int size = SerializedSize;
+      if (HasField1) {
+        output.WriteString(1, Field1);
+      }
+      if (HasField2) {
+        output.WriteBytes(2, Field2);
+      }
+      if (HasField3) {
+        output.WriteInt64(3, Field3);
+      }
+      if (HasField4) {
+        output.WriteInt64(4, Field4);
+      }
+      if (HasField6) {
+        output.WriteString(6, Field6);
+      }
+      foreach (global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1 element in Group1List) {
+        output.WriteGroup(10, element);
+      }
+      if (HasField21) {
+        output.WriteInt32(21, Field21);
+      }
+      if (HasField25) {
+        output.WriteFloat(25, Field25);
+      }
+      if (HasField30) {
+        output.WriteInt64(30, Field30);
+      }
+      if (HasField63) {
+        output.WriteInt32(63, Field63);
+      }
+      if (HasField71) {
+        output.WriteInt32(71, Field71);
+      }
+      if (HasField75) {
+        output.WriteBool(75, Field75);
+      }
+      if (HasField109) {
+        output.WriteInt32(109, Field109);
+      }
+      if (field127_.Count > 0) {
+        foreach (string element in field127_) {
+          output.WriteString(127, element);
+        }
+      }
+      if (field128_.Count > 0) {
+        foreach (string element in field128_) {
+          output.WriteString(128, element);
+        }
+      }
+      if (HasField129) {
+        output.WriteInt32(129, Field129);
+      }
+      if (field130_.Count > 0) {
+        foreach (long element in field130_) {
+          output.WriteInt64(130, element);
+        }
+      }
+      if (HasField131) {
+        output.WriteInt64(131, Field131);
+      }
+      if (HasField205) {
+        output.WriteBool(205, Field205);
+      }
+      if (HasField206) {
+        output.WriteBool(206, Field206);
+      }
+      if (HasField210) {
+        output.WriteInt32(210, Field210);
+      }
+      if (HasField211) {
+        output.WriteInt32(211, Field211);
+      }
+      if (HasField212) {
+        output.WriteInt32(212, Field212);
+      }
+      if (HasField213) {
+        output.WriteInt32(213, Field213);
+      }
+      if (HasField216) {
+        output.WriteInt32(216, Field216);
+      }
+      if (HasField217) {
+        output.WriteInt32(217, Field217);
+      }
+      if (HasField218) {
+        output.WriteInt32(218, Field218);
+      }
+      if (HasField220) {
+        output.WriteInt32(220, Field220);
+      }
+      if (HasField221) {
+        output.WriteInt32(221, Field221);
+      }
+      if (HasField222) {
+        output.WriteFloat(222, Field222);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasField1) {
+          size += pb::CodedOutputStream.ComputeStringSize(1, Field1);
+        }
+        if (HasField3) {
+          size += pb::CodedOutputStream.ComputeInt64Size(3, Field3);
+        }
+        if (HasField4) {
+          size += pb::CodedOutputStream.ComputeInt64Size(4, Field4);
+        }
+        if (HasField30) {
+          size += pb::CodedOutputStream.ComputeInt64Size(30, Field30);
+        }
+        if (HasField75) {
+          size += pb::CodedOutputStream.ComputeBoolSize(75, Field75);
+        }
+        if (HasField6) {
+          size += pb::CodedOutputStream.ComputeStringSize(6, Field6);
+        }
+        if (HasField2) {
+          size += pb::CodedOutputStream.ComputeBytesSize(2, Field2);
+        }
+        if (HasField21) {
+          size += pb::CodedOutputStream.ComputeInt32Size(21, Field21);
+        }
+        if (HasField71) {
+          size += pb::CodedOutputStream.ComputeInt32Size(71, Field71);
+        }
+        if (HasField25) {
+          size += pb::CodedOutputStream.ComputeFloatSize(25, Field25);
+        }
+        if (HasField109) {
+          size += pb::CodedOutputStream.ComputeInt32Size(109, Field109);
+        }
+        if (HasField210) {
+          size += pb::CodedOutputStream.ComputeInt32Size(210, Field210);
+        }
+        if (HasField211) {
+          size += pb::CodedOutputStream.ComputeInt32Size(211, Field211);
+        }
+        if (HasField212) {
+          size += pb::CodedOutputStream.ComputeInt32Size(212, Field212);
+        }
+        if (HasField213) {
+          size += pb::CodedOutputStream.ComputeInt32Size(213, Field213);
+        }
+        if (HasField216) {
+          size += pb::CodedOutputStream.ComputeInt32Size(216, Field216);
+        }
+        if (HasField217) {
+          size += pb::CodedOutputStream.ComputeInt32Size(217, Field217);
+        }
+        if (HasField218) {
+          size += pb::CodedOutputStream.ComputeInt32Size(218, Field218);
+        }
+        if (HasField220) {
+          size += pb::CodedOutputStream.ComputeInt32Size(220, Field220);
+        }
+        if (HasField221) {
+          size += pb::CodedOutputStream.ComputeInt32Size(221, Field221);
+        }
+        if (HasField222) {
+          size += pb::CodedOutputStream.ComputeFloatSize(222, Field222);
+        }
+        if (HasField63) {
+          size += pb::CodedOutputStream.ComputeInt32Size(63, Field63);
+        }
+        foreach (global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1 element in Group1List) {
+          size += pb::CodedOutputStream.ComputeGroupSize(10, element);
+        }
+        {
+          int dataSize = 0;
+          foreach (string element in Field128List) {
+            dataSize += pb::CodedOutputStream.ComputeStringSizeNoTag(element);
+          }
+          size += dataSize;
+          size += 2 * field128_.Count;
+        }
+        if (HasField131) {
+          size += pb::CodedOutputStream.ComputeInt64Size(131, Field131);
+        }
+        {
+          int dataSize = 0;
+          foreach (string element in Field127List) {
+            dataSize += pb::CodedOutputStream.ComputeStringSizeNoTag(element);
+          }
+          size += dataSize;
+          size += 2 * field127_.Count;
+        }
+        if (HasField129) {
+          size += pb::CodedOutputStream.ComputeInt32Size(129, Field129);
+        }
+        {
+          int dataSize = 0;
+          foreach (long element in Field130List) {
+            dataSize += pb::CodedOutputStream.ComputeInt64SizeNoTag(element);
+          }
+          size += dataSize;
+          size += 2 * field130_.Count;
+        }
+        if (HasField205) {
+          size += pb::CodedOutputStream.ComputeBoolSize(205, Field205);
+        }
+        if (HasField206) {
+          size += pb::CodedOutputStream.ComputeBoolSize(206, Field206);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static SpeedMessage2 ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SpeedMessage2 ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SpeedMessage2 ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SpeedMessage2 ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SpeedMessage2 ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SpeedMessage2 ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static SpeedMessage2 ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static SpeedMessage2 ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static SpeedMessage2 ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SpeedMessage2 ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(SpeedMessage2 prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
+    public sealed partial class Builder : pb::GeneratedBuilder<SpeedMessage2, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {}
+      
+      SpeedMessage2 result = new SpeedMessage2();
+      
+      protected override SpeedMessage2 MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override Builder Clear() {
+        result = new SpeedMessage2();
+        return this;
+      }
+      
+      public override Builder Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Descriptor; }
+      }
+      
+      public override SpeedMessage2 DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.DefaultInstance; }
+      }
+      
+      public override SpeedMessage2 BuildPartial() {
+        if (result == null) {
+          throw new global::System.InvalidOperationException("build() has already been called on this Builder");
+        }
+        result.group1_.MakeReadOnly();
+        result.field128_.MakeReadOnly();
+        result.field127_.MakeReadOnly();
+        result.field130_.MakeReadOnly();
+        SpeedMessage2 returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is SpeedMessage2) {
+          return MergeFrom((SpeedMessage2) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(SpeedMessage2 other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.DefaultInstance) return this;
+        if (other.HasField1) {
+          Field1 = other.Field1;
+        }
+        if (other.HasField3) {
+          Field3 = other.Field3;
+        }
+        if (other.HasField4) {
+          Field4 = other.Field4;
+        }
+        if (other.HasField30) {
+          Field30 = other.Field30;
+        }
+        if (other.HasField75) {
+          Field75 = other.Field75;
+        }
+        if (other.HasField6) {
+          Field6 = other.Field6;
+        }
+        if (other.HasField2) {
+          Field2 = other.Field2;
+        }
+        if (other.HasField21) {
+          Field21 = other.Field21;
+        }
+        if (other.HasField71) {
+          Field71 = other.Field71;
+        }
+        if (other.HasField25) {
+          Field25 = other.Field25;
+        }
+        if (other.HasField109) {
+          Field109 = other.Field109;
+        }
+        if (other.HasField210) {
+          Field210 = other.Field210;
+        }
+        if (other.HasField211) {
+          Field211 = other.Field211;
+        }
+        if (other.HasField212) {
+          Field212 = other.Field212;
+        }
+        if (other.HasField213) {
+          Field213 = other.Field213;
+        }
+        if (other.HasField216) {
+          Field216 = other.Field216;
+        }
+        if (other.HasField217) {
+          Field217 = other.Field217;
+        }
+        if (other.HasField218) {
+          Field218 = other.Field218;
+        }
+        if (other.HasField220) {
+          Field220 = other.Field220;
+        }
+        if (other.HasField221) {
+          Field221 = other.Field221;
+        }
+        if (other.HasField222) {
+          Field222 = other.Field222;
+        }
+        if (other.HasField63) {
+          Field63 = other.Field63;
+        }
+        if (other.group1_.Count != 0) {
+          base.AddRange(other.group1_, result.group1_);
+        }
+        if (other.field128_.Count != 0) {
+          base.AddRange(other.field128_, result.field128_);
+        }
+        if (other.HasField131) {
+          Field131 = other.Field131;
+        }
+        if (other.field127_.Count != 0) {
+          base.AddRange(other.field127_, result.field127_);
+        }
+        if (other.HasField129) {
+          Field129 = other.Field129;
+        }
+        if (other.field130_.Count != 0) {
+          base.AddRange(other.field130_, result.field130_);
+        }
+        if (other.HasField205) {
+          Field205 = other.Field205;
+        }
+        if (other.HasField206) {
+          Field206 = other.Field206;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0: {
+              if (unknownFields != null) {
+                this.UnknownFields = unknownFields.Build();
+              }
+              return this;
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag);
+              break;
+            }
+            case 10: {
+              Field1 = input.ReadString();
+              break;
+            }
+            case 18: {
+              Field2 = input.ReadBytes();
+              break;
+            }
+            case 24: {
+              Field3 = input.ReadInt64();
+              break;
+            }
+            case 32: {
+              Field4 = input.ReadInt64();
+              break;
+            }
+            case 50: {
+              Field6 = input.ReadString();
+              break;
+            }
+            case 83: {
+              global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1.CreateBuilder();
+              input.ReadGroup(10, subBuilder, extensionRegistry);
+              AddGroup1(subBuilder.BuildPartial());
+              break;
+            }
+            case 168: {
+              Field21 = input.ReadInt32();
+              break;
+            }
+            case 205: {
+              Field25 = input.ReadFloat();
+              break;
+            }
+            case 240: {
+              Field30 = input.ReadInt64();
+              break;
+            }
+            case 504: {
+              Field63 = input.ReadInt32();
+              break;
+            }
+            case 568: {
+              Field71 = input.ReadInt32();
+              break;
+            }
+            case 600: {
+              Field75 = input.ReadBool();
+              break;
+            }
+            case 872: {
+              Field109 = input.ReadInt32();
+              break;
+            }
+            case 1018: {
+              AddField127(input.ReadString());
+              break;
+            }
+            case 1026: {
+              AddField128(input.ReadString());
+              break;
+            }
+            case 1032: {
+              Field129 = input.ReadInt32();
+              break;
+            }
+            case 1040: {
+              AddField130(input.ReadInt64());
+              break;
+            }
+            case 1048: {
+              Field131 = input.ReadInt64();
+              break;
+            }
+            case 1640: {
+              Field205 = input.ReadBool();
+              break;
+            }
+            case 1648: {
+              Field206 = input.ReadBool();
+              break;
+            }
+            case 1680: {
+              Field210 = input.ReadInt32();
+              break;
+            }
+            case 1688: {
+              Field211 = input.ReadInt32();
+              break;
+            }
+            case 1696: {
+              Field212 = input.ReadInt32();
+              break;
+            }
+            case 1704: {
+              Field213 = input.ReadInt32();
+              break;
+            }
+            case 1728: {
+              Field216 = input.ReadInt32();
+              break;
+            }
+            case 1736: {
+              Field217 = input.ReadInt32();
+              break;
+            }
+            case 1744: {
+              Field218 = input.ReadInt32();
+              break;
+            }
+            case 1760: {
+              Field220 = input.ReadInt32();
+              break;
+            }
+            case 1768: {
+              Field221 = input.ReadInt32();
+              break;
+            }
+            case 1781: {
+              Field222 = input.ReadFloat();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      public bool HasField1 {
+        get { return result.HasField1; }
+      }
+      public string Field1 {
+        get { return result.Field1; }
+        set { SetField1(value); }
+      }
+      public Builder SetField1(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.hasField1 = true;
+        result.field1_ = value;
+        return this;
+      }
+      public Builder ClearField1() {
+        result.hasField1 = false;
+        result.field1_ = "";
+        return this;
+      }
+      
+      public bool HasField3 {
+        get { return result.HasField3; }
+      }
+      public long Field3 {
+        get { return result.Field3; }
+        set { SetField3(value); }
+      }
+      public Builder SetField3(long value) {
+        result.hasField3 = true;
+        result.field3_ = value;
+        return this;
+      }
+      public Builder ClearField3() {
+        result.hasField3 = false;
+        result.field3_ = 0L;
+        return this;
+      }
+      
+      public bool HasField4 {
+        get { return result.HasField4; }
+      }
+      public long Field4 {
+        get { return result.Field4; }
+        set { SetField4(value); }
+      }
+      public Builder SetField4(long value) {
+        result.hasField4 = true;
+        result.field4_ = value;
+        return this;
+      }
+      public Builder ClearField4() {
+        result.hasField4 = false;
+        result.field4_ = 0L;
+        return this;
+      }
+      
+      public bool HasField30 {
+        get { return result.HasField30; }
+      }
+      public long Field30 {
+        get { return result.Field30; }
+        set { SetField30(value); }
+      }
+      public Builder SetField30(long value) {
+        result.hasField30 = true;
+        result.field30_ = value;
+        return this;
+      }
+      public Builder ClearField30() {
+        result.hasField30 = false;
+        result.field30_ = 0L;
+        return this;
+      }
+      
+      public bool HasField75 {
+        get { return result.HasField75; }
+      }
+      public bool Field75 {
+        get { return result.Field75; }
+        set { SetField75(value); }
+      }
+      public Builder SetField75(bool value) {
+        result.hasField75 = true;
+        result.field75_ = value;
+        return this;
+      }
+      public Builder ClearField75() {
+        result.hasField75 = false;
+        result.field75_ = false;
+        return this;
+      }
+      
+      public bool HasField6 {
+        get { return result.HasField6; }
+      }
+      public string Field6 {
+        get { return result.Field6; }
+        set { SetField6(value); }
+      }
+      public Builder SetField6(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.hasField6 = true;
+        result.field6_ = value;
+        return this;
+      }
+      public Builder ClearField6() {
+        result.hasField6 = false;
+        result.field6_ = "";
+        return this;
+      }
+      
+      public bool HasField2 {
+        get { return result.HasField2; }
+      }
+      public pb::ByteString Field2 {
+        get { return result.Field2; }
+        set { SetField2(value); }
+      }
+      public Builder SetField2(pb::ByteString value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.hasField2 = true;
+        result.field2_ = value;
+        return this;
+      }
+      public Builder ClearField2() {
+        result.hasField2 = false;
+        result.field2_ = pb::ByteString.Empty;
+        return this;
+      }
+      
+      public bool HasField21 {
+        get { return result.HasField21; }
+      }
+      public int Field21 {
+        get { return result.Field21; }
+        set { SetField21(value); }
+      }
+      public Builder SetField21(int value) {
+        result.hasField21 = true;
+        result.field21_ = value;
+        return this;
+      }
+      public Builder ClearField21() {
+        result.hasField21 = false;
+        result.field21_ = 0;
+        return this;
+      }
+      
+      public bool HasField71 {
+        get { return result.HasField71; }
+      }
+      public int Field71 {
+        get { return result.Field71; }
+        set { SetField71(value); }
+      }
+      public Builder SetField71(int value) {
+        result.hasField71 = true;
+        result.field71_ = value;
+        return this;
+      }
+      public Builder ClearField71() {
+        result.hasField71 = false;
+        result.field71_ = 0;
+        return this;
+      }
+      
+      public bool HasField25 {
+        get { return result.HasField25; }
+      }
+      public float Field25 {
+        get { return result.Field25; }
+        set { SetField25(value); }
+      }
+      public Builder SetField25(float value) {
+        result.hasField25 = true;
+        result.field25_ = value;
+        return this;
+      }
+      public Builder ClearField25() {
+        result.hasField25 = false;
+        result.field25_ = 0F;
+        return this;
+      }
+      
+      public bool HasField109 {
+        get { return result.HasField109; }
+      }
+      public int Field109 {
+        get { return result.Field109; }
+        set { SetField109(value); }
+      }
+      public Builder SetField109(int value) {
+        result.hasField109 = true;
+        result.field109_ = value;
+        return this;
+      }
+      public Builder ClearField109() {
+        result.hasField109 = false;
+        result.field109_ = 0;
+        return this;
+      }
+      
+      public bool HasField210 {
+        get { return result.HasField210; }
+      }
+      public int Field210 {
+        get { return result.Field210; }
+        set { SetField210(value); }
+      }
+      public Builder SetField210(int value) {
+        result.hasField210 = true;
+        result.field210_ = value;
+        return this;
+      }
+      public Builder ClearField210() {
+        result.hasField210 = false;
+        result.field210_ = 0;
+        return this;
+      }
+      
+      public bool HasField211 {
+        get { return result.HasField211; }
+      }
+      public int Field211 {
+        get { return result.Field211; }
+        set { SetField211(value); }
+      }
+      public Builder SetField211(int value) {
+        result.hasField211 = true;
+        result.field211_ = value;
+        return this;
+      }
+      public Builder ClearField211() {
+        result.hasField211 = false;
+        result.field211_ = 0;
+        return this;
+      }
+      
+      public bool HasField212 {
+        get { return result.HasField212; }
+      }
+      public int Field212 {
+        get { return result.Field212; }
+        set { SetField212(value); }
+      }
+      public Builder SetField212(int value) {
+        result.hasField212 = true;
+        result.field212_ = value;
+        return this;
+      }
+      public Builder ClearField212() {
+        result.hasField212 = false;
+        result.field212_ = 0;
+        return this;
+      }
+      
+      public bool HasField213 {
+        get { return result.HasField213; }
+      }
+      public int Field213 {
+        get { return result.Field213; }
+        set { SetField213(value); }
+      }
+      public Builder SetField213(int value) {
+        result.hasField213 = true;
+        result.field213_ = value;
+        return this;
+      }
+      public Builder ClearField213() {
+        result.hasField213 = false;
+        result.field213_ = 0;
+        return this;
+      }
+      
+      public bool HasField216 {
+        get { return result.HasField216; }
+      }
+      public int Field216 {
+        get { return result.Field216; }
+        set { SetField216(value); }
+      }
+      public Builder SetField216(int value) {
+        result.hasField216 = true;
+        result.field216_ = value;
+        return this;
+      }
+      public Builder ClearField216() {
+        result.hasField216 = false;
+        result.field216_ = 0;
+        return this;
+      }
+      
+      public bool HasField217 {
+        get { return result.HasField217; }
+      }
+      public int Field217 {
+        get { return result.Field217; }
+        set { SetField217(value); }
+      }
+      public Builder SetField217(int value) {
+        result.hasField217 = true;
+        result.field217_ = value;
+        return this;
+      }
+      public Builder ClearField217() {
+        result.hasField217 = false;
+        result.field217_ = 0;
+        return this;
+      }
+      
+      public bool HasField218 {
+        get { return result.HasField218; }
+      }
+      public int Field218 {
+        get { return result.Field218; }
+        set { SetField218(value); }
+      }
+      public Builder SetField218(int value) {
+        result.hasField218 = true;
+        result.field218_ = value;
+        return this;
+      }
+      public Builder ClearField218() {
+        result.hasField218 = false;
+        result.field218_ = 0;
+        return this;
+      }
+      
+      public bool HasField220 {
+        get { return result.HasField220; }
+      }
+      public int Field220 {
+        get { return result.Field220; }
+        set { SetField220(value); }
+      }
+      public Builder SetField220(int value) {
+        result.hasField220 = true;
+        result.field220_ = value;
+        return this;
+      }
+      public Builder ClearField220() {
+        result.hasField220 = false;
+        result.field220_ = 0;
+        return this;
+      }
+      
+      public bool HasField221 {
+        get { return result.HasField221; }
+      }
+      public int Field221 {
+        get { return result.Field221; }
+        set { SetField221(value); }
+      }
+      public Builder SetField221(int value) {
+        result.hasField221 = true;
+        result.field221_ = value;
+        return this;
+      }
+      public Builder ClearField221() {
+        result.hasField221 = false;
+        result.field221_ = 0;
+        return this;
+      }
+      
+      public bool HasField222 {
+        get { return result.HasField222; }
+      }
+      public float Field222 {
+        get { return result.Field222; }
+        set { SetField222(value); }
+      }
+      public Builder SetField222(float value) {
+        result.hasField222 = true;
+        result.field222_ = value;
+        return this;
+      }
+      public Builder ClearField222() {
+        result.hasField222 = false;
+        result.field222_ = 0F;
+        return this;
+      }
+      
+      public bool HasField63 {
+        get { return result.HasField63; }
+      }
+      public int Field63 {
+        get { return result.Field63; }
+        set { SetField63(value); }
+      }
+      public Builder SetField63(int value) {
+        result.hasField63 = true;
+        result.field63_ = value;
+        return this;
+      }
+      public Builder ClearField63() {
+        result.hasField63 = false;
+        result.field63_ = 0;
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1> Group1List {
+        get { return result.group1_; }
+      }
+      public int Group1Count {
+        get { return result.Group1Count; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1 GetGroup1(int index) {
+        return result.GetGroup1(index);
+      }
+      public Builder SetGroup1(int index, global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1 value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.group1_[index] = value;
+        return this;
+      }
+      public Builder SetGroup1(int index, global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        result.group1_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddGroup1(global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1 value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.group1_.Add(value);
+        return this;
+      }
+      public Builder AddGroup1(global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        result.group1_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeGroup1(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.SpeedMessage2.Types.Group1> values) {
+        base.AddRange(values, result.group1_);
+        return this;
+      }
+      public Builder ClearGroup1() {
+        result.group1_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<string> Field128List {
+        get { return result.field128_; }
+      }
+      public int Field128Count {
+        get { return result.Field128Count; }
+      }
+      public string GetField128(int index) {
+        return result.GetField128(index);
+      }
+      public Builder SetField128(int index, string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.field128_[index] = value;
+        return this;
+      }
+      public Builder AddField128(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.field128_.Add(value);
+        return this;
+      }
+      public Builder AddRangeField128(scg::IEnumerable<string> values) {
+        base.AddRange(values, result.field128_);
+        return this;
+      }
+      public Builder ClearField128() {
+        result.field128_.Clear();
+        return this;
+      }
+      
+      public bool HasField131 {
+        get { return result.HasField131; }
+      }
+      public long Field131 {
+        get { return result.Field131; }
+        set { SetField131(value); }
+      }
+      public Builder SetField131(long value) {
+        result.hasField131 = true;
+        result.field131_ = value;
+        return this;
+      }
+      public Builder ClearField131() {
+        result.hasField131 = false;
+        result.field131_ = 0L;
+        return this;
+      }
+      
+      public pbc::IPopsicleList<string> Field127List {
+        get { return result.field127_; }
+      }
+      public int Field127Count {
+        get { return result.Field127Count; }
+      }
+      public string GetField127(int index) {
+        return result.GetField127(index);
+      }
+      public Builder SetField127(int index, string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.field127_[index] = value;
+        return this;
+      }
+      public Builder AddField127(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.field127_.Add(value);
+        return this;
+      }
+      public Builder AddRangeField127(scg::IEnumerable<string> values) {
+        base.AddRange(values, result.field127_);
+        return this;
+      }
+      public Builder ClearField127() {
+        result.field127_.Clear();
+        return this;
+      }
+      
+      public bool HasField129 {
+        get { return result.HasField129; }
+      }
+      public int Field129 {
+        get { return result.Field129; }
+        set { SetField129(value); }
+      }
+      public Builder SetField129(int value) {
+        result.hasField129 = true;
+        result.field129_ = value;
+        return this;
+      }
+      public Builder ClearField129() {
+        result.hasField129 = false;
+        result.field129_ = 0;
+        return this;
+      }
+      
+      public pbc::IPopsicleList<long> Field130List {
+        get { return result.field130_; }
+      }
+      public int Field130Count {
+        get { return result.Field130Count; }
+      }
+      public long GetField130(int index) {
+        return result.GetField130(index);
+      }
+      public Builder SetField130(int index, long value) {
+        result.field130_[index] = value;
+        return this;
+      }
+      public Builder AddField130(long value) {
+        result.field130_.Add(value);
+        return this;
+      }
+      public Builder AddRangeField130(scg::IEnumerable<long> values) {
+        base.AddRange(values, result.field130_);
+        return this;
+      }
+      public Builder ClearField130() {
+        result.field130_.Clear();
+        return this;
+      }
+      
+      public bool HasField205 {
+        get { return result.HasField205; }
+      }
+      public bool Field205 {
+        get { return result.Field205; }
+        set { SetField205(value); }
+      }
+      public Builder SetField205(bool value) {
+        result.hasField205 = true;
+        result.field205_ = value;
+        return this;
+      }
+      public Builder ClearField205() {
+        result.hasField205 = false;
+        result.field205_ = false;
+        return this;
+      }
+      
+      public bool HasField206 {
+        get { return result.HasField206; }
+      }
+      public bool Field206 {
+        get { return result.Field206; }
+        set { SetField206(value); }
+      }
+      public Builder SetField206(bool value) {
+        result.hasField206 = true;
+        result.field206_ = value;
+        return this;
+      }
+      public Builder ClearField206() {
+        result.hasField206 = false;
+        result.field206_ = false;
+        return this;
+      }
+    }
+    static SpeedMessage2() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestGoogleSpeedProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+  [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
+  public sealed partial class SpeedMessage2GroupedMessage : pb::GeneratedMessage<SpeedMessage2GroupedMessage, SpeedMessage2GroupedMessage.Builder> {
+    private static readonly SpeedMessage2GroupedMessage defaultInstance = new Builder().BuildPartial();
+    public static SpeedMessage2GroupedMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override SpeedMessage2GroupedMessage DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    protected override SpeedMessage2GroupedMessage ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestGoogleSpeedProtoFile.internal__static_benchmarks_SpeedMessage2GroupedMessage__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<SpeedMessage2GroupedMessage, SpeedMessage2GroupedMessage.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestGoogleSpeedProtoFile.internal__static_benchmarks_SpeedMessage2GroupedMessage__FieldAccessorTable; }
+    }
+    
+    public const int Field1FieldNumber = 1;
+    private bool hasField1;
+    private float field1_ = 0F;
+    public bool HasField1 {
+      get { return hasField1; }
+    }
+    public float Field1 {
+      get { return field1_; }
+    }
+    
+    public const int Field2FieldNumber = 2;
+    private bool hasField2;
+    private float field2_ = 0F;
+    public bool HasField2 {
+      get { return hasField2; }
+    }
+    public float Field2 {
+      get { return field2_; }
+    }
+    
+    public const int Field3FieldNumber = 3;
+    private bool hasField3;
+    private float field3_ = 0F;
+    public bool HasField3 {
+      get { return hasField3; }
+    }
+    public float Field3 {
+      get { return field3_; }
+    }
+    
+    public const int Field4FieldNumber = 4;
+    private bool hasField4;
+    private bool field4_ = false;
+    public bool HasField4 {
+      get { return hasField4; }
+    }
+    public bool Field4 {
+      get { return field4_; }
+    }
+    
+    public const int Field5FieldNumber = 5;
+    private bool hasField5;
+    private bool field5_ = false;
+    public bool HasField5 {
+      get { return hasField5; }
+    }
+    public bool Field5 {
+      get { return field5_; }
+    }
+    
+    public const int Field6FieldNumber = 6;
+    private bool hasField6;
+    private bool field6_ = true;
+    public bool HasField6 {
+      get { return hasField6; }
+    }
+    public bool Field6 {
+      get { return field6_; }
+    }
+    
+    public const int Field7FieldNumber = 7;
+    private bool hasField7;
+    private bool field7_ = false;
+    public bool HasField7 {
+      get { return hasField7; }
+    }
+    public bool Field7 {
+      get { return field7_; }
+    }
+    
+    public const int Field8FieldNumber = 8;
+    private bool hasField8;
+    private float field8_ = 0F;
+    public bool HasField8 {
+      get { return hasField8; }
+    }
+    public float Field8 {
+      get { return field8_; }
+    }
+    
+    public const int Field9FieldNumber = 9;
+    private bool hasField9;
+    private bool field9_ = false;
+    public bool HasField9 {
+      get { return hasField9; }
+    }
+    public bool Field9 {
+      get { return field9_; }
+    }
+    
+    public const int Field10FieldNumber = 10;
+    private bool hasField10;
+    private float field10_ = 0F;
+    public bool HasField10 {
+      get { return hasField10; }
+    }
+    public float Field10 {
+      get { return field10_; }
+    }
+    
+    public const int Field11FieldNumber = 11;
+    private bool hasField11;
+    private long field11_ = 0L;
+    public bool HasField11 {
+      get { return hasField11; }
+    }
+    public long Field11 {
+      get { return field11_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      int size = SerializedSize;
+      if (HasField1) {
+        output.WriteFloat(1, Field1);
+      }
+      if (HasField2) {
+        output.WriteFloat(2, Field2);
+      }
+      if (HasField3) {
+        output.WriteFloat(3, Field3);
+      }
+      if (HasField4) {
+        output.WriteBool(4, Field4);
+      }
+      if (HasField5) {
+        output.WriteBool(5, Field5);
+      }
+      if (HasField6) {
+        output.WriteBool(6, Field6);
+      }
+      if (HasField7) {
+        output.WriteBool(7, Field7);
+      }
+      if (HasField8) {
+        output.WriteFloat(8, Field8);
+      }
+      if (HasField9) {
+        output.WriteBool(9, Field9);
+      }
+      if (HasField10) {
+        output.WriteFloat(10, Field10);
+      }
+      if (HasField11) {
+        output.WriteInt64(11, Field11);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasField1) {
+          size += pb::CodedOutputStream.ComputeFloatSize(1, Field1);
+        }
+        if (HasField2) {
+          size += pb::CodedOutputStream.ComputeFloatSize(2, Field2);
+        }
+        if (HasField3) {
+          size += pb::CodedOutputStream.ComputeFloatSize(3, Field3);
+        }
+        if (HasField4) {
+          size += pb::CodedOutputStream.ComputeBoolSize(4, Field4);
+        }
+        if (HasField5) {
+          size += pb::CodedOutputStream.ComputeBoolSize(5, Field5);
+        }
+        if (HasField6) {
+          size += pb::CodedOutputStream.ComputeBoolSize(6, Field6);
+        }
+        if (HasField7) {
+          size += pb::CodedOutputStream.ComputeBoolSize(7, Field7);
+        }
+        if (HasField8) {
+          size += pb::CodedOutputStream.ComputeFloatSize(8, Field8);
+        }
+        if (HasField9) {
+          size += pb::CodedOutputStream.ComputeBoolSize(9, Field9);
+        }
+        if (HasField10) {
+          size += pb::CodedOutputStream.ComputeFloatSize(10, Field10);
+        }
+        if (HasField11) {
+          size += pb::CodedOutputStream.ComputeInt64Size(11, Field11);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static SpeedMessage2GroupedMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SpeedMessage2GroupedMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SpeedMessage2GroupedMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static SpeedMessage2GroupedMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static SpeedMessage2GroupedMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SpeedMessage2GroupedMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static SpeedMessage2GroupedMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static SpeedMessage2GroupedMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static SpeedMessage2GroupedMessage ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static SpeedMessage2GroupedMessage ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(SpeedMessage2GroupedMessage prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
+    public sealed partial class Builder : pb::GeneratedBuilder<SpeedMessage2GroupedMessage, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {}
+      
+      SpeedMessage2GroupedMessage result = new SpeedMessage2GroupedMessage();
+      
+      protected override SpeedMessage2GroupedMessage MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override Builder Clear() {
+        result = new SpeedMessage2GroupedMessage();
+        return this;
+      }
+      
+      public override Builder Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.Descriptor; }
+      }
+      
+      public override SpeedMessage2GroupedMessage DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.DefaultInstance; }
+      }
+      
+      public override SpeedMessage2GroupedMessage BuildPartial() {
+        if (result == null) {
+          throw new global::System.InvalidOperationException("build() has already been called on this Builder");
+        }
+        SpeedMessage2GroupedMessage returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is SpeedMessage2GroupedMessage) {
+          return MergeFrom((SpeedMessage2GroupedMessage) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(SpeedMessage2GroupedMessage other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.SpeedMessage2GroupedMessage.DefaultInstance) return this;
+        if (other.HasField1) {
+          Field1 = other.Field1;
+        }
+        if (other.HasField2) {
+          Field2 = other.Field2;
+        }
+        if (other.HasField3) {
+          Field3 = other.Field3;
+        }
+        if (other.HasField4) {
+          Field4 = other.Field4;
+        }
+        if (other.HasField5) {
+          Field5 = other.Field5;
+        }
+        if (other.HasField6) {
+          Field6 = other.Field6;
+        }
+        if (other.HasField7) {
+          Field7 = other.Field7;
+        }
+        if (other.HasField8) {
+          Field8 = other.Field8;
+        }
+        if (other.HasField9) {
+          Field9 = other.Field9;
+        }
+        if (other.HasField10) {
+          Field10 = other.Field10;
+        }
+        if (other.HasField11) {
+          Field11 = other.Field11;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0: {
+              if (unknownFields != null) {
+                this.UnknownFields = unknownFields.Build();
+              }
+              return this;
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag);
+              break;
+            }
+            case 13: {
+              Field1 = input.ReadFloat();
+              break;
+            }
+            case 21: {
+              Field2 = input.ReadFloat();
+              break;
+            }
+            case 29: {
+              Field3 = input.ReadFloat();
+              break;
+            }
+            case 32: {
+              Field4 = input.ReadBool();
+              break;
+            }
+            case 40: {
+              Field5 = input.ReadBool();
+              break;
+            }
+            case 48: {
+              Field6 = input.ReadBool();
+              break;
+            }
+            case 56: {
+              Field7 = input.ReadBool();
+              break;
+            }
+            case 69: {
+              Field8 = input.ReadFloat();
+              break;
+            }
+            case 72: {
+              Field9 = input.ReadBool();
+              break;
+            }
+            case 85: {
+              Field10 = input.ReadFloat();
+              break;
+            }
+            case 88: {
+              Field11 = input.ReadInt64();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      public bool HasField1 {
+        get { return result.HasField1; }
+      }
+      public float Field1 {
+        get { return result.Field1; }
+        set { SetField1(value); }
+      }
+      public Builder SetField1(float value) {
+        result.hasField1 = true;
+        result.field1_ = value;
+        return this;
+      }
+      public Builder ClearField1() {
+        result.hasField1 = false;
+        result.field1_ = 0F;
+        return this;
+      }
+      
+      public bool HasField2 {
+        get { return result.HasField2; }
+      }
+      public float Field2 {
+        get { return result.Field2; }
+        set { SetField2(value); }
+      }
+      public Builder SetField2(float value) {
+        result.hasField2 = true;
+        result.field2_ = value;
+        return this;
+      }
+      public Builder ClearField2() {
+        result.hasField2 = false;
+        result.field2_ = 0F;
+        return this;
+      }
+      
+      public bool HasField3 {
+        get { return result.HasField3; }
+      }
+      public float Field3 {
+        get { return result.Field3; }
+        set { SetField3(value); }
+      }
+      public Builder SetField3(float value) {
+        result.hasField3 = true;
+        result.field3_ = value;
+        return this;
+      }
+      public Builder ClearField3() {
+        result.hasField3 = false;
+        result.field3_ = 0F;
+        return this;
+      }
+      
+      public bool HasField4 {
+        get { return result.HasField4; }
+      }
+      public bool Field4 {
+        get { return result.Field4; }
+        set { SetField4(value); }
+      }
+      public Builder SetField4(bool value) {
+        result.hasField4 = true;
+        result.field4_ = value;
+        return this;
+      }
+      public Builder ClearField4() {
+        result.hasField4 = false;
+        result.field4_ = false;
+        return this;
+      }
+      
+      public bool HasField5 {
+        get { return result.HasField5; }
+      }
+      public bool Field5 {
+        get { return result.Field5; }
+        set { SetField5(value); }
+      }
+      public Builder SetField5(bool value) {
+        result.hasField5 = true;
+        result.field5_ = value;
+        return this;
+      }
+      public Builder ClearField5() {
+        result.hasField5 = false;
+        result.field5_ = false;
+        return this;
+      }
+      
+      public bool HasField6 {
+        get { return result.HasField6; }
+      }
+      public bool Field6 {
+        get { return result.Field6; }
+        set { SetField6(value); }
+      }
+      public Builder SetField6(bool value) {
+        result.hasField6 = true;
+        result.field6_ = value;
+        return this;
+      }
+      public Builder ClearField6() {
+        result.hasField6 = false;
+        result.field6_ = true;
+        return this;
+      }
+      
+      public bool HasField7 {
+        get { return result.HasField7; }
+      }
+      public bool Field7 {
+        get { return result.Field7; }
+        set { SetField7(value); }
+      }
+      public Builder SetField7(bool value) {
+        result.hasField7 = true;
+        result.field7_ = value;
+        return this;
+      }
+      public Builder ClearField7() {
+        result.hasField7 = false;
+        result.field7_ = false;
+        return this;
+      }
+      
+      public bool HasField8 {
+        get { return result.HasField8; }
+      }
+      public float Field8 {
+        get { return result.Field8; }
+        set { SetField8(value); }
+      }
+      public Builder SetField8(float value) {
+        result.hasField8 = true;
+        result.field8_ = value;
+        return this;
+      }
+      public Builder ClearField8() {
+        result.hasField8 = false;
+        result.field8_ = 0F;
+        return this;
+      }
+      
+      public bool HasField9 {
+        get { return result.HasField9; }
+      }
+      public bool Field9 {
+        get { return result.Field9; }
+        set { SetField9(value); }
+      }
+      public Builder SetField9(bool value) {
+        result.hasField9 = true;
+        result.field9_ = value;
+        return this;
+      }
+      public Builder ClearField9() {
+        result.hasField9 = false;
+        result.field9_ = false;
+        return this;
+      }
+      
+      public bool HasField10 {
+        get { return result.HasField10; }
+      }
+      public float Field10 {
+        get { return result.Field10; }
+        set { SetField10(value); }
+      }
+      public Builder SetField10(float value) {
+        result.hasField10 = true;
+        result.field10_ = value;
+        return this;
+      }
+      public Builder ClearField10() {
+        result.hasField10 = false;
+        result.field10_ = 0F;
+        return this;
+      }
+      
+      public bool HasField11 {
+        get { return result.HasField11; }
+      }
+      public long Field11 {
+        get { return result.Field11; }
+        set { SetField11(value); }
+      }
+      public Builder SetField11(long value) {
+        result.hasField11 = true;
+        result.field11_ = value;
+        return this;
+      }
+      public Builder ClearField11() {
+        result.hasField11 = false;
+        result.field11_ = 0L;
+        return this;
+      }
+    }
+    static SpeedMessage2GroupedMessage() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestGoogleSpeedProtoFile.Descriptor, null);
+    }
+  }
+  
+  #endregion
+  
+}

+ 1680 - 0
src/ProtocolBuffers.Test/TestProtos/UnitTestXmlSerializerTestProtoFile.cs

@@ -0,0 +1,1680 @@
+// Generated by ProtoGen, Version=2.3.0.277, Culture=neutral, PublicKeyToken=17b3b1f090c3ea48.  DO NOT EDIT!
+
+using pb = global::Google.ProtocolBuffers;
+using pbc = global::Google.ProtocolBuffers.Collections;
+using pbd = global::Google.ProtocolBuffers.Descriptors;
+using scg = global::System.Collections.Generic;
+namespace Google.ProtocolBuffers.TestProtos {
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+  [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
+  public static partial class UnitTestXmlSerializerTestProtoFile {
+  
+    #region Extension registration
+    public static void RegisterAllExtensions(pb::ExtensionRegistry registry) {
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestXmlSerializerTestProtoFile.ExtensionEnum);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestXmlSerializerTestProtoFile.ExtensionText);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestXmlSerializerTestProtoFile.ExtensionNumber);
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestXmlSerializerTestProtoFile.ExtensionMessage);
+    }
+    #endregion
+    #region Extensions
+    public const int ExtensionEnumFieldNumber = 101;
+    public static pb::GeneratedExtensionBase<global::Google.ProtocolBuffers.TestProtos.EnumOptions> ExtensionEnum;
+    public const int ExtensionTextFieldNumber = 102;
+    public static pb::GeneratedExtensionBase<string> ExtensionText;
+    public const int ExtensionNumberFieldNumber = 103;
+    public static pb::GeneratedExtensionBase<scg::IList<int>> ExtensionNumber;
+    public const int ExtensionMessageFieldNumber = 199;
+    public static pb::GeneratedExtensionBase<global::Google.ProtocolBuffers.TestProtos.TestXmlExtension> ExtensionMessage;
+    #endregion
+    
+    #region Static variables
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_extra_TestXmlChild__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestXmlChild, global::Google.ProtocolBuffers.TestProtos.TestXmlChild.Builder> internal__static_protobuf_unittest_extra_TestXmlChild__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_extra_TestXmlNoFields__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestXmlNoFields, global::Google.ProtocolBuffers.TestProtos.TestXmlNoFields.Builder> internal__static_protobuf_unittest_extra_TestXmlNoFields__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_extra_TestXmlMessage__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestXmlMessage, global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.Builder> internal__static_protobuf_unittest_extra_TestXmlMessage__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_extra_TestXmlMessage_Children__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.Types.Children, global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.Types.Children.Builder> internal__static_protobuf_unittest_extra_TestXmlMessage_Children__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_extra_TestXmlExtension__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestXmlExtension, global::Google.ProtocolBuffers.TestProtos.TestXmlExtension.Builder> internal__static_protobuf_unittest_extra_TestXmlExtension__FieldAccessorTable;
+    #endregion
+    #region Descriptor
+    public static pbd::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbd::FileDescriptor descriptor;
+    
+    static UnitTestXmlSerializerTestProtoFile() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          "CiRleHRlc3QvdW5pdHRlc3RfZXh0cmFzX3htbHRlc3QucHJvdG8SF3Byb3Rv" + 
+          "YnVmX3VuaXR0ZXN0X2V4dHJhGiRnb29nbGUvcHJvdG9idWYvY3NoYXJwX29w" + 
+          "dGlvbnMucHJvdG8iVQoMVGVzdFhtbENoaWxkEjUKB29wdGlvbnMYAyADKA4y" + 
+          "JC5wcm90b2J1Zl91bml0dGVzdF9leHRyYS5FbnVtT3B0aW9ucxIOCgZiaW5h" + 
+          "cnkYBCABKAwiEQoPVGVzdFhtbE5vRmllbGRzIrcCCg5UZXN0WG1sTWVzc2Fn" + 
+          "ZRIOCgZudW1iZXIYBiABKAMSDwoHbnVtYmVycxgCIAMoBRIMCgR0ZXh0GAMg" + 
+          "ASgJEhIKCXRleHRsaW5lcxi8BSADKAkSDQoFdmFsaWQYBSABKAgSNAoFY2hp" + 
+          "bGQYASABKAsyJS5wcm90b2J1Zl91bml0dGVzdF9leHRyYS5UZXN0WG1sQ2hp" + 
+          "bGQSQwoIY2hpbGRyZW4YkQMgAygKMjAucHJvdG9idWZfdW5pdHRlc3RfZXh0" + 
+          "cmEuVGVzdFhtbE1lc3NhZ2UuQ2hpbGRyZW4aUQoIQ2hpbGRyZW4SNQoHb3B0" + 
+          "aW9ucxgDIAMoDjIkLnByb3RvYnVmX3VuaXR0ZXN0X2V4dHJhLkVudW1PcHRp" + 
+          "b25zEg4KBmJpbmFyeRgEIAEoDCoFCGQQyAEiIgoQVGVzdFhtbEV4dGVuc2lv" + 
+          "bhIOCgZudW1iZXIYASACKAUqKgoLRW51bU9wdGlvbnMSBwoDT05FEAASBwoD" + 
+          "VFdPEAESCQoFVEhSRUUQAjplCg5leHRlbnNpb25fZW51bRInLnByb3RvYnVm" + 
+          "X3VuaXR0ZXN0X2V4dHJhLlRlc3RYbWxNZXNzYWdlGGUgASgOMiQucHJvdG9i" + 
+          "dWZfdW5pdHRlc3RfZXh0cmEuRW51bU9wdGlvbnM6PwoOZXh0ZW5zaW9uX3Rl" + 
+          "eHQSJy5wcm90b2J1Zl91bml0dGVzdF9leHRyYS5UZXN0WG1sTWVzc2FnZRhm" + 
+          "IAEoCTpFChBleHRlbnNpb25fbnVtYmVyEicucHJvdG9idWZfdW5pdHRlc3Rf" + 
+          "ZXh0cmEuVGVzdFhtbE1lc3NhZ2UYZyADKAVCAhABOm4KEWV4dGVuc2lvbl9t" + 
+          "ZXNzYWdlEicucHJvdG9idWZfdW5pdHRlc3RfZXh0cmEuVGVzdFhtbE1lc3Nh" + 
+          "Z2UYxwEgASgLMikucHJvdG9idWZfdW5pdHRlc3RfZXh0cmEuVGVzdFhtbEV4" + 
+          "dGVuc2lvbkJMSAHCPkcKIUdvb2dsZS5Qcm90b2NvbEJ1ZmZlcnMuVGVzdFBy" + 
+          "b3RvcxIiVW5pdFRlc3RYbWxTZXJpYWxpemVyVGVzdFByb3RvRmlsZQ==");
+      pbd::FileDescriptor.InternalDescriptorAssigner assigner = delegate(pbd::FileDescriptor root) {
+        descriptor = root;
+        internal__static_protobuf_unittest_extra_TestXmlChild__Descriptor = Descriptor.MessageTypes[0];
+        internal__static_protobuf_unittest_extra_TestXmlChild__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestXmlChild, global::Google.ProtocolBuffers.TestProtos.TestXmlChild.Builder>(internal__static_protobuf_unittest_extra_TestXmlChild__Descriptor,
+                new string[] { "Options", "Binary", });
+        internal__static_protobuf_unittest_extra_TestXmlNoFields__Descriptor = Descriptor.MessageTypes[1];
+        internal__static_protobuf_unittest_extra_TestXmlNoFields__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestXmlNoFields, global::Google.ProtocolBuffers.TestProtos.TestXmlNoFields.Builder>(internal__static_protobuf_unittest_extra_TestXmlNoFields__Descriptor,
+                new string[] { });
+        internal__static_protobuf_unittest_extra_TestXmlMessage__Descriptor = Descriptor.MessageTypes[2];
+        internal__static_protobuf_unittest_extra_TestXmlMessage__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestXmlMessage, global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.Builder>(internal__static_protobuf_unittest_extra_TestXmlMessage__Descriptor,
+                new string[] { "Number", "Numbers", "Text", "Textlines", "Valid", "Child", "Children", });
+        internal__static_protobuf_unittest_extra_TestXmlMessage_Children__Descriptor = internal__static_protobuf_unittest_extra_TestXmlMessage__Descriptor.NestedTypes[0];
+        internal__static_protobuf_unittest_extra_TestXmlMessage_Children__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.Types.Children, global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.Types.Children.Builder>(internal__static_protobuf_unittest_extra_TestXmlMessage_Children__Descriptor,
+                new string[] { "Options", "Binary", });
+        internal__static_protobuf_unittest_extra_TestXmlExtension__Descriptor = Descriptor.MessageTypes[3];
+        internal__static_protobuf_unittest_extra_TestXmlExtension__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestXmlExtension, global::Google.ProtocolBuffers.TestProtos.TestXmlExtension.Builder>(internal__static_protobuf_unittest_extra_TestXmlExtension__Descriptor,
+                new string[] { "Number", });
+        global::Google.ProtocolBuffers.TestProtos.UnitTestXmlSerializerTestProtoFile.ExtensionEnum = pb::GeneratedSingleExtension<global::Google.ProtocolBuffers.TestProtos.EnumOptions>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestXmlSerializerTestProtoFile.Descriptor.Extensions[0]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestXmlSerializerTestProtoFile.ExtensionText = pb::GeneratedSingleExtension<string>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestXmlSerializerTestProtoFile.Descriptor.Extensions[1]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestXmlSerializerTestProtoFile.ExtensionNumber = pb::GeneratedRepeatExtension<int>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestXmlSerializerTestProtoFile.Descriptor.Extensions[2]);
+        global::Google.ProtocolBuffers.TestProtos.UnitTestXmlSerializerTestProtoFile.ExtensionMessage = pb::GeneratedSingleExtension<global::Google.ProtocolBuffers.TestProtos.TestXmlExtension>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestXmlSerializerTestProtoFile.Descriptor.Extensions[3]);
+        pb::ExtensionRegistry registry = pb::ExtensionRegistry.CreateInstance();
+        RegisterAllExtensions(registry);
+        global::Google.ProtocolBuffers.DescriptorProtos.CSharpOptions.RegisterAllExtensions(registry);
+        return registry;
+      };
+      pbd::FileDescriptor.InternalBuildGeneratedFileFrom(descriptorData,
+          new pbd::FileDescriptor[] {
+          global::Google.ProtocolBuffers.DescriptorProtos.CSharpOptions.Descriptor, 
+          }, assigner);
+    }
+    #endregion
+    
+  }
+  #region Enums
+  [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+  [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
+  public enum EnumOptions {
+    ONE = 0,
+    TWO = 1,
+    THREE = 2,
+  }
+  
+  #endregion
+  
+  #region Messages
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+  [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
+  public sealed partial class TestXmlChild : pb::GeneratedMessage<TestXmlChild, TestXmlChild.Builder> {
+    private static readonly TestXmlChild defaultInstance = new Builder().BuildPartial();
+    public static TestXmlChild DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestXmlChild DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    protected override TestXmlChild ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestXmlSerializerTestProtoFile.internal__static_protobuf_unittest_extra_TestXmlChild__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<TestXmlChild, TestXmlChild.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestXmlSerializerTestProtoFile.internal__static_protobuf_unittest_extra_TestXmlChild__FieldAccessorTable; }
+    }
+    
+    public const int OptionsFieldNumber = 3;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.EnumOptions> options_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.EnumOptions>();
+    public scg::IList<global::Google.ProtocolBuffers.TestProtos.EnumOptions> OptionsList {
+      get { return pbc::Lists.AsReadOnly(options_); }
+    }
+    public int OptionsCount {
+      get { return options_.Count; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.EnumOptions GetOptions(int index) {
+      return options_[index];
+    }
+    
+    public const int BinaryFieldNumber = 4;
+    private bool hasBinary;
+    private pb::ByteString binary_ = pb::ByteString.Empty;
+    public bool HasBinary {
+      get { return hasBinary; }
+    }
+    public pb::ByteString Binary {
+      get { return binary_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      int size = SerializedSize;
+      if (options_.Count > 0) {
+        foreach (int element in options_) {
+          output.WriteEnum(3, element);
+        }
+      }
+      if (HasBinary) {
+        output.WriteBytes(4, Binary);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        {
+          int dataSize = 0;
+          if (options_.Count > 0) {
+            foreach (global::Google.ProtocolBuffers.TestProtos.EnumOptions element in options_) {
+              dataSize += pb::CodedOutputStream.ComputeEnumSizeNoTag((int) element);
+            }
+            size += dataSize;
+            size += 1 * options_.Count;
+          }
+        }
+        if (HasBinary) {
+          size += pb::CodedOutputStream.ComputeBytesSize(4, Binary);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static TestXmlChild ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestXmlChild ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestXmlChild ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestXmlChild ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestXmlChild ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestXmlChild ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestXmlChild ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestXmlChild ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestXmlChild ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestXmlChild ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestXmlChild prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestXmlChild, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {}
+      
+      TestXmlChild result = new TestXmlChild();
+      
+      protected override TestXmlChild MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override Builder Clear() {
+        result = new TestXmlChild();
+        return this;
+      }
+      
+      public override Builder Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestXmlChild.Descriptor; }
+      }
+      
+      public override TestXmlChild DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestXmlChild.DefaultInstance; }
+      }
+      
+      public override TestXmlChild BuildPartial() {
+        if (result == null) {
+          throw new global::System.InvalidOperationException("build() has already been called on this Builder");
+        }
+        result.options_.MakeReadOnly();
+        TestXmlChild returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestXmlChild) {
+          return MergeFrom((TestXmlChild) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(TestXmlChild other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestXmlChild.DefaultInstance) return this;
+        if (other.options_.Count != 0) {
+          base.AddRange(other.options_, result.options_);
+        }
+        if (other.HasBinary) {
+          Binary = other.Binary;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0: {
+              if (unknownFields != null) {
+                this.UnknownFields = unknownFields.Build();
+              }
+              return this;
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag);
+              break;
+            }
+            case 24: {
+              int rawValue = input.ReadEnum();
+              if (!global::System.Enum.IsDefined(typeof(global::Google.ProtocolBuffers.TestProtos.EnumOptions), rawValue)) {
+                if (unknownFields == null) {
+                  unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                }
+                unknownFields.MergeVarintField(3, (ulong) rawValue);
+              } else {
+                AddOptions((global::Google.ProtocolBuffers.TestProtos.EnumOptions) rawValue);
+              }
+              break;
+            }
+            case 34: {
+              Binary = input.ReadBytes();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.EnumOptions> OptionsList {
+        get { return result.options_; }
+      }
+      public int OptionsCount {
+        get { return result.OptionsCount; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.EnumOptions GetOptions(int index) {
+        return result.GetOptions(index);
+      }
+      public Builder SetOptions(int index, global::Google.ProtocolBuffers.TestProtos.EnumOptions value) {
+        result.options_[index] = value;
+        return this;
+      }
+      public Builder AddOptions(global::Google.ProtocolBuffers.TestProtos.EnumOptions value) {
+        result.options_.Add(value);
+        return this;
+      }
+      public Builder AddRangeOptions(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.EnumOptions> values) {
+        base.AddRange(values, result.options_);
+        return this;
+      }
+      public Builder ClearOptions() {
+        result.options_.Clear();
+        return this;
+      }
+      
+      public bool HasBinary {
+        get { return result.HasBinary; }
+      }
+      public pb::ByteString Binary {
+        get { return result.Binary; }
+        set { SetBinary(value); }
+      }
+      public Builder SetBinary(pb::ByteString value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.hasBinary = true;
+        result.binary_ = value;
+        return this;
+      }
+      public Builder ClearBinary() {
+        result.hasBinary = false;
+        result.binary_ = pb::ByteString.Empty;
+        return this;
+      }
+    }
+    static TestXmlChild() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestXmlSerializerTestProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+  [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
+  public sealed partial class TestXmlNoFields : pb::GeneratedMessage<TestXmlNoFields, TestXmlNoFields.Builder> {
+    private static readonly TestXmlNoFields defaultInstance = new Builder().BuildPartial();
+    public static TestXmlNoFields DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestXmlNoFields DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    protected override TestXmlNoFields ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestXmlSerializerTestProtoFile.internal__static_protobuf_unittest_extra_TestXmlNoFields__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<TestXmlNoFields, TestXmlNoFields.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestXmlSerializerTestProtoFile.internal__static_protobuf_unittest_extra_TestXmlNoFields__FieldAccessorTable; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      int size = SerializedSize;
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static TestXmlNoFields ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestXmlNoFields ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestXmlNoFields ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestXmlNoFields ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestXmlNoFields ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestXmlNoFields ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestXmlNoFields ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestXmlNoFields ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestXmlNoFields ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestXmlNoFields ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestXmlNoFields prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestXmlNoFields, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {}
+      
+      TestXmlNoFields result = new TestXmlNoFields();
+      
+      protected override TestXmlNoFields MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override Builder Clear() {
+        result = new TestXmlNoFields();
+        return this;
+      }
+      
+      public override Builder Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestXmlNoFields.Descriptor; }
+      }
+      
+      public override TestXmlNoFields DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestXmlNoFields.DefaultInstance; }
+      }
+      
+      public override TestXmlNoFields BuildPartial() {
+        if (result == null) {
+          throw new global::System.InvalidOperationException("build() has already been called on this Builder");
+        }
+        TestXmlNoFields returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestXmlNoFields) {
+          return MergeFrom((TestXmlNoFields) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(TestXmlNoFields other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestXmlNoFields.DefaultInstance) return this;
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0: {
+              if (unknownFields != null) {
+                this.UnknownFields = unknownFields.Build();
+              }
+              return this;
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag);
+              break;
+            }
+          }
+        }
+      }
+      
+    }
+    static TestXmlNoFields() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestXmlSerializerTestProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+  [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
+  public sealed partial class TestXmlMessage : pb::ExtendableMessage<TestXmlMessage, TestXmlMessage.Builder> {
+    private static readonly TestXmlMessage defaultInstance = new Builder().BuildPartial();
+    public static TestXmlMessage DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestXmlMessage DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    protected override TestXmlMessage ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestXmlSerializerTestProtoFile.internal__static_protobuf_unittest_extra_TestXmlMessage__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<TestXmlMessage, TestXmlMessage.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestXmlSerializerTestProtoFile.internal__static_protobuf_unittest_extra_TestXmlMessage__FieldAccessorTable; }
+    }
+    
+    #region Nested types
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
+    public static class Types {
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+      [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
+      public sealed partial class Children : pb::GeneratedMessage<Children, Children.Builder> {
+        private static readonly Children defaultInstance = new Builder().BuildPartial();
+        public static Children DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override Children DefaultInstanceForType {
+          get { return defaultInstance; }
+        }
+        
+        protected override Children ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.ProtocolBuffers.TestProtos.UnitTestXmlSerializerTestProtoFile.internal__static_protobuf_unittest_extra_TestXmlMessage_Children__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<Children, Children.Builder> InternalFieldAccessors {
+          get { return global::Google.ProtocolBuffers.TestProtos.UnitTestXmlSerializerTestProtoFile.internal__static_protobuf_unittest_extra_TestXmlMessage_Children__FieldAccessorTable; }
+        }
+        
+        public const int OptionsFieldNumber = 3;
+        private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.EnumOptions> options_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.EnumOptions>();
+        public scg::IList<global::Google.ProtocolBuffers.TestProtos.EnumOptions> OptionsList {
+          get { return pbc::Lists.AsReadOnly(options_); }
+        }
+        public int OptionsCount {
+          get { return options_.Count; }
+        }
+        public global::Google.ProtocolBuffers.TestProtos.EnumOptions GetOptions(int index) {
+          return options_[index];
+        }
+        
+        public const int BinaryFieldNumber = 4;
+        private bool hasBinary;
+        private pb::ByteString binary_ = pb::ByteString.Empty;
+        public bool HasBinary {
+          get { return hasBinary; }
+        }
+        public pb::ByteString Binary {
+          get { return binary_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::CodedOutputStream output) {
+          int size = SerializedSize;
+          if (options_.Count > 0) {
+            foreach (int element in options_) {
+              output.WriteEnum(3, element);
+            }
+          }
+          if (HasBinary) {
+            output.WriteBytes(4, Binary);
+          }
+          UnknownFields.WriteTo(output);
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            {
+              int dataSize = 0;
+              if (options_.Count > 0) {
+                foreach (global::Google.ProtocolBuffers.TestProtos.EnumOptions element in options_) {
+                  dataSize += pb::CodedOutputStream.ComputeEnumSizeNoTag((int) element);
+                }
+                size += dataSize;
+                size += 1 * options_.Count;
+              }
+            }
+            if (HasBinary) {
+              size += pb::CodedOutputStream.ComputeBytesSize(4, Binary);
+            }
+            size += UnknownFields.SerializedSize;
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static Children ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static Children ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static Children ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static Children ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static Children ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static Children ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static Children ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static Children ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static Children ParseFrom(pb::CodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static Children ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(Children prototype) {
+          return (Builder) new Builder().MergeFrom(prototype);
+        }
+        
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
+        public sealed partial class Builder : pb::GeneratedBuilder<Children, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {}
+          
+          Children result = new Children();
+          
+          protected override Children MessageBeingBuilt {
+            get { return result; }
+          }
+          
+          public override Builder Clear() {
+            result = new Children();
+            return this;
+          }
+          
+          public override Builder Clone() {
+            return new Builder().MergeFrom(result);
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.Types.Children.Descriptor; }
+          }
+          
+          public override Children DefaultInstanceForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.Types.Children.DefaultInstance; }
+          }
+          
+          public override Children BuildPartial() {
+            if (result == null) {
+              throw new global::System.InvalidOperationException("build() has already been called on this Builder");
+            }
+            result.options_.MakeReadOnly();
+            Children returnMe = result;
+            result = null;
+            return returnMe;
+          }
+          
+          public override Builder MergeFrom(pb::IMessage other) {
+            if (other is Children) {
+              return MergeFrom((Children) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(Children other) {
+            if (other == global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.Types.Children.DefaultInstance) return this;
+            if (other.options_.Count != 0) {
+              base.AddRange(other.options_, result.options_);
+            }
+            if (other.HasBinary) {
+              Binary = other.Binary;
+            }
+            this.MergeUnknownFields(other.UnknownFields);
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::CodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            pb::UnknownFieldSet.Builder unknownFields = null;
+            while (true) {
+              uint tag = input.ReadTag();
+              switch (tag) {
+                case 0: {
+                  if (unknownFields != null) {
+                    this.UnknownFields = unknownFields.Build();
+                  }
+                  return this;
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    if (unknownFields != null) {
+                      this.UnknownFields = unknownFields.Build();
+                    }
+                    return this;
+                  }
+                  if (unknownFields == null) {
+                    unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                  }
+                  ParseUnknownField(input, unknownFields, extensionRegistry, tag);
+                  break;
+                }
+                case 24: {
+                  int rawValue = input.ReadEnum();
+                  if (!global::System.Enum.IsDefined(typeof(global::Google.ProtocolBuffers.TestProtos.EnumOptions), rawValue)) {
+                    if (unknownFields == null) {
+                      unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+                    }
+                    unknownFields.MergeVarintField(3, (ulong) rawValue);
+                  } else {
+                    AddOptions((global::Google.ProtocolBuffers.TestProtos.EnumOptions) rawValue);
+                  }
+                  break;
+                }
+                case 34: {
+                  Binary = input.ReadBytes();
+                  break;
+                }
+              }
+            }
+          }
+          
+          
+          public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.EnumOptions> OptionsList {
+            get { return result.options_; }
+          }
+          public int OptionsCount {
+            get { return result.OptionsCount; }
+          }
+          public global::Google.ProtocolBuffers.TestProtos.EnumOptions GetOptions(int index) {
+            return result.GetOptions(index);
+          }
+          public Builder SetOptions(int index, global::Google.ProtocolBuffers.TestProtos.EnumOptions value) {
+            result.options_[index] = value;
+            return this;
+          }
+          public Builder AddOptions(global::Google.ProtocolBuffers.TestProtos.EnumOptions value) {
+            result.options_.Add(value);
+            return this;
+          }
+          public Builder AddRangeOptions(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.EnumOptions> values) {
+            base.AddRange(values, result.options_);
+            return this;
+          }
+          public Builder ClearOptions() {
+            result.options_.Clear();
+            return this;
+          }
+          
+          public bool HasBinary {
+            get { return result.HasBinary; }
+          }
+          public pb::ByteString Binary {
+            get { return result.Binary; }
+            set { SetBinary(value); }
+          }
+          public Builder SetBinary(pb::ByteString value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.hasBinary = true;
+            result.binary_ = value;
+            return this;
+          }
+          public Builder ClearBinary() {
+            result.hasBinary = false;
+            result.binary_ = pb::ByteString.Empty;
+            return this;
+          }
+        }
+        static Children() {
+          object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestXmlSerializerTestProtoFile.Descriptor, null);
+        }
+      }
+      
+    }
+    #endregion
+    
+    public const int NumberFieldNumber = 6;
+    private bool hasNumber;
+    private long number_ = 0L;
+    public bool HasNumber {
+      get { return hasNumber; }
+    }
+    public long Number {
+      get { return number_; }
+    }
+    
+    public const int NumbersFieldNumber = 2;
+    private pbc::PopsicleList<int> numbers_ = new pbc::PopsicleList<int>();
+    public scg::IList<int> NumbersList {
+      get { return pbc::Lists.AsReadOnly(numbers_); }
+    }
+    public int NumbersCount {
+      get { return numbers_.Count; }
+    }
+    public int GetNumbers(int index) {
+      return numbers_[index];
+    }
+    
+    public const int TextFieldNumber = 3;
+    private bool hasText;
+    private string text_ = "";
+    public bool HasText {
+      get { return hasText; }
+    }
+    public string Text {
+      get { return text_; }
+    }
+    
+    public const int TextlinesFieldNumber = 700;
+    private pbc::PopsicleList<string> textlines_ = new pbc::PopsicleList<string>();
+    public scg::IList<string> TextlinesList {
+      get { return pbc::Lists.AsReadOnly(textlines_); }
+    }
+    public int TextlinesCount {
+      get { return textlines_.Count; }
+    }
+    public string GetTextlines(int index) {
+      return textlines_[index];
+    }
+    
+    public const int ValidFieldNumber = 5;
+    private bool hasValid;
+    private bool valid_ = false;
+    public bool HasValid {
+      get { return hasValid; }
+    }
+    public bool Valid {
+      get { return valid_; }
+    }
+    
+    public const int ChildFieldNumber = 1;
+    private bool hasChild;
+    private global::Google.ProtocolBuffers.TestProtos.TestXmlChild child_ = global::Google.ProtocolBuffers.TestProtos.TestXmlChild.DefaultInstance;
+    public bool HasChild {
+      get { return hasChild; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestXmlChild Child {
+      get { return child_; }
+    }
+    
+    public const int ChildrenFieldNumber = 401;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.Types.Children> children_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.Types.Children>();
+    public scg::IList<global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.Types.Children> ChildrenList {
+      get { return children_; }
+    }
+    public int ChildrenCount {
+      get { return children_.Count; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.Types.Children GetChildren(int index) {
+      return children_[index];
+    }
+    
+    public override bool IsInitialized {
+      get {
+        if (!ExtensionsAreInitialized) return false;
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      int size = SerializedSize;
+      pb::ExtendableMessage<TestXmlMessage, TestXmlMessage.Builder>.ExtensionWriter extensionWriter = CreateExtensionWriter(this);
+      if (HasChild) {
+        output.WriteMessage(1, Child);
+      }
+      if (numbers_.Count > 0) {
+        foreach (int element in numbers_) {
+          output.WriteInt32(2, element);
+        }
+      }
+      if (HasText) {
+        output.WriteString(3, Text);
+      }
+      if (HasValid) {
+        output.WriteBool(5, Valid);
+      }
+      if (HasNumber) {
+        output.WriteInt64(6, Number);
+      }
+      extensionWriter.WriteUntil(200, output);
+      foreach (global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.Types.Children element in ChildrenList) {
+        output.WriteGroup(401, element);
+      }
+      if (textlines_.Count > 0) {
+        foreach (string element in textlines_) {
+          output.WriteString(700, element);
+        }
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasNumber) {
+          size += pb::CodedOutputStream.ComputeInt64Size(6, Number);
+        }
+        {
+          int dataSize = 0;
+          foreach (int element in NumbersList) {
+            dataSize += pb::CodedOutputStream.ComputeInt32SizeNoTag(element);
+          }
+          size += dataSize;
+          size += 1 * numbers_.Count;
+        }
+        if (HasText) {
+          size += pb::CodedOutputStream.ComputeStringSize(3, Text);
+        }
+        {
+          int dataSize = 0;
+          foreach (string element in TextlinesList) {
+            dataSize += pb::CodedOutputStream.ComputeStringSizeNoTag(element);
+          }
+          size += dataSize;
+          size += 2 * textlines_.Count;
+        }
+        if (HasValid) {
+          size += pb::CodedOutputStream.ComputeBoolSize(5, Valid);
+        }
+        if (HasChild) {
+          size += pb::CodedOutputStream.ComputeMessageSize(1, Child);
+        }
+        foreach (global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.Types.Children element in ChildrenList) {
+          size += pb::CodedOutputStream.ComputeGroupSize(401, element);
+        }
+        size += ExtensionsSerializedSize;
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static TestXmlMessage ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestXmlMessage ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestXmlMessage ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestXmlMessage ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestXmlMessage ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestXmlMessage ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestXmlMessage ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestXmlMessage ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestXmlMessage ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestXmlMessage ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestXmlMessage prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
+    public sealed partial class Builder : pb::ExtendableBuilder<TestXmlMessage, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {}
+      
+      TestXmlMessage result = new TestXmlMessage();
+      
+      protected override TestXmlMessage MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override Builder Clear() {
+        result = new TestXmlMessage();
+        return this;
+      }
+      
+      public override Builder Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.Descriptor; }
+      }
+      
+      public override TestXmlMessage DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.DefaultInstance; }
+      }
+      
+      public override TestXmlMessage BuildPartial() {
+        if (result == null) {
+          throw new global::System.InvalidOperationException("build() has already been called on this Builder");
+        }
+        result.numbers_.MakeReadOnly();
+        result.textlines_.MakeReadOnly();
+        result.children_.MakeReadOnly();
+        TestXmlMessage returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestXmlMessage) {
+          return MergeFrom((TestXmlMessage) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(TestXmlMessage other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.DefaultInstance) return this;
+        if (other.HasNumber) {
+          Number = other.Number;
+        }
+        if (other.numbers_.Count != 0) {
+          base.AddRange(other.numbers_, result.numbers_);
+        }
+        if (other.HasText) {
+          Text = other.Text;
+        }
+        if (other.textlines_.Count != 0) {
+          base.AddRange(other.textlines_, result.textlines_);
+        }
+        if (other.HasValid) {
+          Valid = other.Valid;
+        }
+        if (other.HasChild) {
+          MergeChild(other.Child);
+        }
+        if (other.children_.Count != 0) {
+          base.AddRange(other.children_, result.children_);
+        }
+          this.MergeExtensionFields(other);
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0: {
+              if (unknownFields != null) {
+                this.UnknownFields = unknownFields.Build();
+              }
+              return this;
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag);
+              break;
+            }
+            case 10: {
+              global::Google.ProtocolBuffers.TestProtos.TestXmlChild.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestXmlChild.CreateBuilder();
+              if (HasChild) {
+                subBuilder.MergeFrom(Child);
+              }
+              input.ReadMessage(subBuilder, extensionRegistry);
+              Child = subBuilder.BuildPartial();
+              break;
+            }
+            case 16: {
+              AddNumbers(input.ReadInt32());
+              break;
+            }
+            case 26: {
+              Text = input.ReadString();
+              break;
+            }
+            case 40: {
+              Valid = input.ReadBool();
+              break;
+            }
+            case 48: {
+              Number = input.ReadInt64();
+              break;
+            }
+            case 3211: {
+              global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.Types.Children.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.Types.Children.CreateBuilder();
+              input.ReadGroup(401, subBuilder, extensionRegistry);
+              AddChildren(subBuilder.BuildPartial());
+              break;
+            }
+            case 5602: {
+              AddTextlines(input.ReadString());
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      public bool HasNumber {
+        get { return result.HasNumber; }
+      }
+      public long Number {
+        get { return result.Number; }
+        set { SetNumber(value); }
+      }
+      public Builder SetNumber(long value) {
+        result.hasNumber = true;
+        result.number_ = value;
+        return this;
+      }
+      public Builder ClearNumber() {
+        result.hasNumber = false;
+        result.number_ = 0L;
+        return this;
+      }
+      
+      public pbc::IPopsicleList<int> NumbersList {
+        get { return result.numbers_; }
+      }
+      public int NumbersCount {
+        get { return result.NumbersCount; }
+      }
+      public int GetNumbers(int index) {
+        return result.GetNumbers(index);
+      }
+      public Builder SetNumbers(int index, int value) {
+        result.numbers_[index] = value;
+        return this;
+      }
+      public Builder AddNumbers(int value) {
+        result.numbers_.Add(value);
+        return this;
+      }
+      public Builder AddRangeNumbers(scg::IEnumerable<int> values) {
+        base.AddRange(values, result.numbers_);
+        return this;
+      }
+      public Builder ClearNumbers() {
+        result.numbers_.Clear();
+        return this;
+      }
+      
+      public bool HasText {
+        get { return result.HasText; }
+      }
+      public string Text {
+        get { return result.Text; }
+        set { SetText(value); }
+      }
+      public Builder SetText(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.hasText = true;
+        result.text_ = value;
+        return this;
+      }
+      public Builder ClearText() {
+        result.hasText = false;
+        result.text_ = "";
+        return this;
+      }
+      
+      public pbc::IPopsicleList<string> TextlinesList {
+        get { return result.textlines_; }
+      }
+      public int TextlinesCount {
+        get { return result.TextlinesCount; }
+      }
+      public string GetTextlines(int index) {
+        return result.GetTextlines(index);
+      }
+      public Builder SetTextlines(int index, string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.textlines_[index] = value;
+        return this;
+      }
+      public Builder AddTextlines(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.textlines_.Add(value);
+        return this;
+      }
+      public Builder AddRangeTextlines(scg::IEnumerable<string> values) {
+        base.AddRange(values, result.textlines_);
+        return this;
+      }
+      public Builder ClearTextlines() {
+        result.textlines_.Clear();
+        return this;
+      }
+      
+      public bool HasValid {
+        get { return result.HasValid; }
+      }
+      public bool Valid {
+        get { return result.Valid; }
+        set { SetValid(value); }
+      }
+      public Builder SetValid(bool value) {
+        result.hasValid = true;
+        result.valid_ = value;
+        return this;
+      }
+      public Builder ClearValid() {
+        result.hasValid = false;
+        result.valid_ = false;
+        return this;
+      }
+      
+      public bool HasChild {
+       get { return result.HasChild; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestXmlChild Child {
+        get { return result.Child; }
+        set { SetChild(value); }
+      }
+      public Builder SetChild(global::Google.ProtocolBuffers.TestProtos.TestXmlChild value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.hasChild = true;
+        result.child_ = value;
+        return this;
+      }
+      public Builder SetChild(global::Google.ProtocolBuffers.TestProtos.TestXmlChild.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        result.hasChild = true;
+        result.child_ = builderForValue.Build();
+        return this;
+      }
+      public Builder MergeChild(global::Google.ProtocolBuffers.TestProtos.TestXmlChild value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        if (result.HasChild &&
+            result.child_ != global::Google.ProtocolBuffers.TestProtos.TestXmlChild.DefaultInstance) {
+            result.child_ = global::Google.ProtocolBuffers.TestProtos.TestXmlChild.CreateBuilder(result.child_).MergeFrom(value).BuildPartial();
+        } else {
+          result.child_ = value;
+        }
+        result.hasChild = true;
+        return this;
+      }
+      public Builder ClearChild() {
+        result.hasChild = false;
+        result.child_ = global::Google.ProtocolBuffers.TestProtos.TestXmlChild.DefaultInstance;
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.Types.Children> ChildrenList {
+        get { return result.children_; }
+      }
+      public int ChildrenCount {
+        get { return result.ChildrenCount; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.Types.Children GetChildren(int index) {
+        return result.GetChildren(index);
+      }
+      public Builder SetChildren(int index, global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.Types.Children value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.children_[index] = value;
+        return this;
+      }
+      public Builder SetChildren(int index, global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.Types.Children.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        result.children_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddChildren(global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.Types.Children value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.children_.Add(value);
+        return this;
+      }
+      public Builder AddChildren(global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.Types.Children.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        result.children_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeChildren(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.TestXmlMessage.Types.Children> values) {
+        base.AddRange(values, result.children_);
+        return this;
+      }
+      public Builder ClearChildren() {
+        result.children_.Clear();
+        return this;
+      }
+    }
+    static TestXmlMessage() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestXmlSerializerTestProtoFile.Descriptor, null);
+    }
+  }
+  
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+  [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
+  public sealed partial class TestXmlExtension : pb::GeneratedMessage<TestXmlExtension, TestXmlExtension.Builder> {
+    private static readonly TestXmlExtension defaultInstance = new Builder().BuildPartial();
+    public static TestXmlExtension DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestXmlExtension DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    protected override TestXmlExtension ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestXmlSerializerTestProtoFile.internal__static_protobuf_unittest_extra_TestXmlExtension__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<TestXmlExtension, TestXmlExtension.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestXmlSerializerTestProtoFile.internal__static_protobuf_unittest_extra_TestXmlExtension__FieldAccessorTable; }
+    }
+    
+    public const int NumberFieldNumber = 1;
+    private bool hasNumber;
+    private int number_ = 0;
+    public bool HasNumber {
+      get { return hasNumber; }
+    }
+    public int Number {
+      get { return number_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        if (!hasNumber) return false;
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      int size = SerializedSize;
+      if (HasNumber) {
+        output.WriteInt32(1, Number);
+      }
+      UnknownFields.WriteTo(output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasNumber) {
+          size += pb::CodedOutputStream.ComputeInt32Size(1, Number);
+        }
+        size += UnknownFields.SerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static TestXmlExtension ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestXmlExtension ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestXmlExtension ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestXmlExtension ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestXmlExtension ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestXmlExtension ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestXmlExtension ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestXmlExtension ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestXmlExtension ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestXmlExtension ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestXmlExtension prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
+    public sealed partial class Builder : pb::GeneratedBuilder<TestXmlExtension, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {}
+      
+      TestXmlExtension result = new TestXmlExtension();
+      
+      protected override TestXmlExtension MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override Builder Clear() {
+        result = new TestXmlExtension();
+        return this;
+      }
+      
+      public override Builder Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestXmlExtension.Descriptor; }
+      }
+      
+      public override TestXmlExtension DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestXmlExtension.DefaultInstance; }
+      }
+      
+      public override TestXmlExtension BuildPartial() {
+        if (result == null) {
+          throw new global::System.InvalidOperationException("build() has already been called on this Builder");
+        }
+        TestXmlExtension returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override Builder MergeFrom(pb::IMessage other) {
+        if (other is TestXmlExtension) {
+          return MergeFrom((TestXmlExtension) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(TestXmlExtension other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestXmlExtension.DefaultInstance) return this;
+        if (other.HasNumber) {
+          Number = other.Number;
+        }
+        this.MergeUnknownFields(other.UnknownFields);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        pb::UnknownFieldSet.Builder unknownFields = null;
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0: {
+              if (unknownFields != null) {
+                this.UnknownFields = unknownFields.Build();
+              }
+              return this;
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                if (unknownFields != null) {
+                  this.UnknownFields = unknownFields.Build();
+                }
+                return this;
+              }
+              if (unknownFields == null) {
+                unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+              }
+              ParseUnknownField(input, unknownFields, extensionRegistry, tag);
+              break;
+            }
+            case 8: {
+              Number = input.ReadInt32();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      public bool HasNumber {
+        get { return result.HasNumber; }
+      }
+      public int Number {
+        get { return result.Number; }
+        set { SetNumber(value); }
+      }
+      public Builder SetNumber(int value) {
+        result.hasNumber = true;
+        result.number_ = value;
+        return this;
+      }
+      public Builder ClearNumber() {
+        result.hasNumber = false;
+        result.number_ = 0;
+        return this;
+      }
+    }
+    static TestXmlExtension() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestXmlSerializerTestProtoFile.Descriptor, null);
+    }
+  }
+  
+  #endregion
+  
+}

+ 2 - 2
src/ProtocolBuffers.Test/TextFormatTest.cs

@@ -404,8 +404,8 @@ namespace Google.ProtocolBuffers
                 "1:2: Extension \"nosuchext\" not found in the ExtensionRegistry.",
                 "[nosuchext]: 123");
             AssertParseError(
-                "1:20: Extension \"protobuf_unittest.optional_int32_extension\" does " +
-                "not extend message type \"protobuf_unittest.TestAllTypes\".",
+                "1:20: Extension \"protobuf_unittest.optional_int32_extension\" " +
+                "not found in the ExtensionRegistry.",
                 "[protobuf_unittest.optional_int32_extension]: 123");
             AssertParseError(
                 "1:1: Message type \"protobuf_unittest.TestAllTypes\" has no field " +

+ 155 - 157
src/ProtocolBuffers.sln

@@ -1,157 +1,155 @@
-
-Microsoft Visual Studio Solution File, Format Version 11.00
-# Visual Studio 2010
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "proto", "proto", "{1F896D5C-5FC2-4671-9216-781CB8187EC7}"
-	ProjectSection(SolutionItems) = preProject
-		..\protos\tutorial\addressbook.proto = ..\protos\tutorial\addressbook.proto
-		..\protos\google\protobuf\csharp_options.proto = ..\protos\google\protobuf\csharp_options.proto
-		..\protos\google\protobuf\descriptor.proto = ..\protos\google\protobuf\descriptor.proto
-		..\ProtocolBuffers.build = ..\ProtocolBuffers.build
-		..\todo.txt = ..\todo.txt
-	EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "unittest", "unittest", "{C8D3015A-EA39-4F03-AEEC-3FF1F2087A12}"
-	ProjectSection(SolutionItems) = preProject
-		..\..\..\DotNet\ProtoFiles\Test\Protos\SampleComplex.proto = ..\..\..\DotNet\ProtoFiles\Test\Protos\SampleComplex.proto
-		..\protos\google\protobuf\unittest.proto = ..\protos\google\protobuf\unittest.proto
-		..\protos\google\protobuf\unittest_csharp_options.proto = ..\protos\google\protobuf\unittest_csharp_options.proto
-		..\protos\google\protobuf\unittest_custom_options.proto = ..\protos\google\protobuf\unittest_custom_options.proto
-		..\protos\google\protobuf\unittest_embed_optimize_for.proto = ..\protos\google\protobuf\unittest_embed_optimize_for.proto
-		..\protos\google\protobuf\unittest_empty.proto = ..\protos\google\protobuf\unittest_empty.proto
-		..\protos\google\protobuf\unittest_enormous_descriptor.proto = ..\protos\google\protobuf\unittest_enormous_descriptor.proto
-		..\protos\extest\unittest_extras_lite.proto = ..\protos\extest\unittest_extras_lite.proto
-		..\protos\google\protobuf\unittest_import.proto = ..\protos\google\protobuf\unittest_import.proto
-		..\protos\google\protobuf\unittest_import_lite.proto = ..\protos\google\protobuf\unittest_import_lite.proto
-		..\protos\google\protobuf\unittest_lite.proto = ..\protos\google\protobuf\unittest_lite.proto
-		..\protos\google\protobuf\unittest_lite_imports_nonlite.proto = ..\protos\google\protobuf\unittest_lite_imports_nonlite.proto
-		..\protos\google\protobuf\unittest_mset.proto = ..\protos\google\protobuf\unittest_mset.proto
-		..\protos\google\protobuf\unittest_no_generic_services.proto = ..\protos\google\protobuf\unittest_no_generic_services.proto
-		..\protos\google\protobuf\unittest_optimize_for.proto = ..\protos\google\protobuf\unittest_optimize_for.proto
-	EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProtocolBuffers", "ProtocolBuffers\ProtocolBuffers.csproj", "{6908BDCE-D925-43F3-94AC-A531E6DF2591}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProtocolBuffers.Test", "ProtocolBuffers.Test\ProtocolBuffers.Test.csproj", "{DD01ED24-3750-4567-9A23-1DB676A15610}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProtoGen", "ProtoGen\ProtoGen.csproj", "{250ADE34-82FD-4BAE-86D5-985FBE589C4A}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProtoGen.Test", "ProtoGen.Test\ProtoGen.Test.csproj", "{C268DA4C-4004-47DA-AF23-44C983281A68}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AddressBook", "AddressBook\AddressBook.csproj", "{A31F5FB2-4FF3-432A-B35B-5CD203606311}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProtoMunge", "ProtoMunge\ProtoMunge.csproj", "{8F09AF72-3327-4FA7-BC09-070B80221AB9}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProtoBench", "ProtoBench\ProtoBench.csproj", "{C7A4A435-2813-41C8-AA87-BD914BA5223D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProtoDump", "ProtoDump\ProtoDump.csproj", "{D7282E99-2DC3-405B-946F-177DB2FD2AE2}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProtocolBuffersLite", "ProtocolBuffers\ProtocolBuffersLite.csproj", "{6969BDCE-D925-43F3-94AC-A531E6DF2591}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProtocolBuffersLite.Test", "ProtocolBuffersLite.Test\ProtocolBuffersLite.Test.csproj", "{EE01ED24-3750-4567-9A23-1DB676A15610}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProtocolBuffersLiteMixed.Test", "ProtocolBuffersLite.Test\ProtocolBuffersLiteMixed.Test.csproj", "{EEFFED24-3750-4567-9A23-1DB676A15610}"
-EndProject
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug_Silverlight2|Any CPU = Debug_Silverlight2|Any CPU
-		Debug|Any CPU = Debug|Any CPU
-		Release_Silverlight2|Any CPU = Release_Silverlight2|Any CPU
-		Release|Any CPU = Release|Any CPU
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{6908BDCE-D925-43F3-94AC-A531E6DF2591}.Debug_Silverlight2|Any CPU.ActiveCfg = Debug_Silverlight2|Any CPU
-		{6908BDCE-D925-43F3-94AC-A531E6DF2591}.Debug_Silverlight2|Any CPU.Build.0 = Debug_Silverlight2|Any CPU
-		{6908BDCE-D925-43F3-94AC-A531E6DF2591}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{6908BDCE-D925-43F3-94AC-A531E6DF2591}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{6908BDCE-D925-43F3-94AC-A531E6DF2591}.Release_Silverlight2|Any CPU.ActiveCfg = Release_Silverlight2|Any CPU
-		{6908BDCE-D925-43F3-94AC-A531E6DF2591}.Release_Silverlight2|Any CPU.Build.0 = Release_Silverlight2|Any CPU
-		{6908BDCE-D925-43F3-94AC-A531E6DF2591}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{6908BDCE-D925-43F3-94AC-A531E6DF2591}.Release|Any CPU.Build.0 = Release|Any CPU
-		{DD01ED24-3750-4567-9A23-1DB676A15610}.Debug_Silverlight2|Any CPU.ActiveCfg = Debug|Any CPU
-		{DD01ED24-3750-4567-9A23-1DB676A15610}.Debug_Silverlight2|Any CPU.Build.0 = Debug|Any CPU
-		{DD01ED24-3750-4567-9A23-1DB676A15610}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{DD01ED24-3750-4567-9A23-1DB676A15610}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{DD01ED24-3750-4567-9A23-1DB676A15610}.Release_Silverlight2|Any CPU.ActiveCfg = Release|Any CPU
-		{DD01ED24-3750-4567-9A23-1DB676A15610}.Release_Silverlight2|Any CPU.Build.0 = Release|Any CPU
-		{DD01ED24-3750-4567-9A23-1DB676A15610}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{DD01ED24-3750-4567-9A23-1DB676A15610}.Release|Any CPU.Build.0 = Release|Any CPU
-		{250ADE34-82FD-4BAE-86D5-985FBE589C4A}.Debug_Silverlight2|Any CPU.ActiveCfg = Debug|Any CPU
-		{250ADE34-82FD-4BAE-86D5-985FBE589C4A}.Debug_Silverlight2|Any CPU.Build.0 = Debug|Any CPU
-		{250ADE34-82FD-4BAE-86D5-985FBE589C4A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{250ADE34-82FD-4BAE-86D5-985FBE589C4A}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{250ADE34-82FD-4BAE-86D5-985FBE589C4A}.Release_Silverlight2|Any CPU.ActiveCfg = Release|Any CPU
-		{250ADE34-82FD-4BAE-86D5-985FBE589C4A}.Release_Silverlight2|Any CPU.Build.0 = Release|Any CPU
-		{250ADE34-82FD-4BAE-86D5-985FBE589C4A}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{250ADE34-82FD-4BAE-86D5-985FBE589C4A}.Release|Any CPU.Build.0 = Release|Any CPU
-		{C268DA4C-4004-47DA-AF23-44C983281A68}.Debug_Silverlight2|Any CPU.ActiveCfg = Debug|Any CPU
-		{C268DA4C-4004-47DA-AF23-44C983281A68}.Debug_Silverlight2|Any CPU.Build.0 = Debug|Any CPU
-		{C268DA4C-4004-47DA-AF23-44C983281A68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{C268DA4C-4004-47DA-AF23-44C983281A68}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{C268DA4C-4004-47DA-AF23-44C983281A68}.Release_Silverlight2|Any CPU.ActiveCfg = Release|Any CPU
-		{C268DA4C-4004-47DA-AF23-44C983281A68}.Release_Silverlight2|Any CPU.Build.0 = Release|Any CPU
-		{C268DA4C-4004-47DA-AF23-44C983281A68}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{C268DA4C-4004-47DA-AF23-44C983281A68}.Release|Any CPU.Build.0 = Release|Any CPU
-		{A31F5FB2-4FF3-432A-B35B-5CD203606311}.Debug_Silverlight2|Any CPU.ActiveCfg = Debug|Any CPU
-		{A31F5FB2-4FF3-432A-B35B-5CD203606311}.Debug_Silverlight2|Any CPU.Build.0 = Debug|Any CPU
-		{A31F5FB2-4FF3-432A-B35B-5CD203606311}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{A31F5FB2-4FF3-432A-B35B-5CD203606311}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{A31F5FB2-4FF3-432A-B35B-5CD203606311}.Release_Silverlight2|Any CPU.ActiveCfg = Release|Any CPU
-		{A31F5FB2-4FF3-432A-B35B-5CD203606311}.Release_Silverlight2|Any CPU.Build.0 = Release|Any CPU
-		{A31F5FB2-4FF3-432A-B35B-5CD203606311}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{A31F5FB2-4FF3-432A-B35B-5CD203606311}.Release|Any CPU.Build.0 = Release|Any CPU
-		{8F09AF72-3327-4FA7-BC09-070B80221AB9}.Debug_Silverlight2|Any CPU.ActiveCfg = Debug|Any CPU
-		{8F09AF72-3327-4FA7-BC09-070B80221AB9}.Debug_Silverlight2|Any CPU.Build.0 = Debug|Any CPU
-		{8F09AF72-3327-4FA7-BC09-070B80221AB9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{8F09AF72-3327-4FA7-BC09-070B80221AB9}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{8F09AF72-3327-4FA7-BC09-070B80221AB9}.Release_Silverlight2|Any CPU.ActiveCfg = Release|Any CPU
-		{8F09AF72-3327-4FA7-BC09-070B80221AB9}.Release_Silverlight2|Any CPU.Build.0 = Release|Any CPU
-		{8F09AF72-3327-4FA7-BC09-070B80221AB9}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{8F09AF72-3327-4FA7-BC09-070B80221AB9}.Release|Any CPU.Build.0 = Release|Any CPU
-		{C7A4A435-2813-41C8-AA87-BD914BA5223D}.Debug_Silverlight2|Any CPU.ActiveCfg = Debug|Any CPU
-		{C7A4A435-2813-41C8-AA87-BD914BA5223D}.Debug_Silverlight2|Any CPU.Build.0 = Debug|Any CPU
-		{C7A4A435-2813-41C8-AA87-BD914BA5223D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{C7A4A435-2813-41C8-AA87-BD914BA5223D}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{C7A4A435-2813-41C8-AA87-BD914BA5223D}.Release_Silverlight2|Any CPU.ActiveCfg = Release|Any CPU
-		{C7A4A435-2813-41C8-AA87-BD914BA5223D}.Release_Silverlight2|Any CPU.Build.0 = Release|Any CPU
-		{C7A4A435-2813-41C8-AA87-BD914BA5223D}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{C7A4A435-2813-41C8-AA87-BD914BA5223D}.Release|Any CPU.Build.0 = Release|Any CPU
-		{D7282E99-2DC3-405B-946F-177DB2FD2AE2}.Debug_Silverlight2|Any CPU.ActiveCfg = Debug|Any CPU
-		{D7282E99-2DC3-405B-946F-177DB2FD2AE2}.Debug_Silverlight2|Any CPU.Build.0 = Debug|Any CPU
-		{D7282E99-2DC3-405B-946F-177DB2FD2AE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{D7282E99-2DC3-405B-946F-177DB2FD2AE2}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{D7282E99-2DC3-405B-946F-177DB2FD2AE2}.Release_Silverlight2|Any CPU.ActiveCfg = Release|Any CPU
-		{D7282E99-2DC3-405B-946F-177DB2FD2AE2}.Release_Silverlight2|Any CPU.Build.0 = Release|Any CPU
-		{D7282E99-2DC3-405B-946F-177DB2FD2AE2}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{D7282E99-2DC3-405B-946F-177DB2FD2AE2}.Release|Any CPU.Build.0 = Release|Any CPU
-		{6969BDCE-D925-43F3-94AC-A531E6DF2591}.Debug_Silverlight2|Any CPU.ActiveCfg = Debug_Silverlight2|Any CPU
-		{6969BDCE-D925-43F3-94AC-A531E6DF2591}.Debug_Silverlight2|Any CPU.Build.0 = Debug_Silverlight2|Any CPU
-		{6969BDCE-D925-43F3-94AC-A531E6DF2591}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{6969BDCE-D925-43F3-94AC-A531E6DF2591}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{6969BDCE-D925-43F3-94AC-A531E6DF2591}.Release_Silverlight2|Any CPU.ActiveCfg = Release_Silverlight2|Any CPU
-		{6969BDCE-D925-43F3-94AC-A531E6DF2591}.Release_Silverlight2|Any CPU.Build.0 = Release_Silverlight2|Any CPU
-		{6969BDCE-D925-43F3-94AC-A531E6DF2591}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{6969BDCE-D925-43F3-94AC-A531E6DF2591}.Release|Any CPU.Build.0 = Release|Any CPU
-		{EE01ED24-3750-4567-9A23-1DB676A15610}.Debug_Silverlight2|Any CPU.ActiveCfg = Debug|Any CPU
-		{EE01ED24-3750-4567-9A23-1DB676A15610}.Debug_Silverlight2|Any CPU.Build.0 = Debug|Any CPU
-		{EE01ED24-3750-4567-9A23-1DB676A15610}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{EE01ED24-3750-4567-9A23-1DB676A15610}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{EE01ED24-3750-4567-9A23-1DB676A15610}.Release_Silverlight2|Any CPU.ActiveCfg = Release|Any CPU
-		{EE01ED24-3750-4567-9A23-1DB676A15610}.Release_Silverlight2|Any CPU.Build.0 = Release|Any CPU
-		{EE01ED24-3750-4567-9A23-1DB676A15610}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{EE01ED24-3750-4567-9A23-1DB676A15610}.Release|Any CPU.Build.0 = Release|Any CPU
-		{EEFFED24-3750-4567-9A23-1DB676A15610}.Debug_Silverlight2|Any CPU.ActiveCfg = Debug|Any CPU
-		{EEFFED24-3750-4567-9A23-1DB676A15610}.Debug_Silverlight2|Any CPU.Build.0 = Debug|Any CPU
-		{EEFFED24-3750-4567-9A23-1DB676A15610}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{EEFFED24-3750-4567-9A23-1DB676A15610}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{EEFFED24-3750-4567-9A23-1DB676A15610}.Release_Silverlight2|Any CPU.ActiveCfg = Release|Any CPU
-		{EEFFED24-3750-4567-9A23-1DB676A15610}.Release_Silverlight2|Any CPU.Build.0 = Release|Any CPU
-		{EEFFED24-3750-4567-9A23-1DB676A15610}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{EEFFED24-3750-4567-9A23-1DB676A15610}.Release|Any CPU.Build.0 = Release|Any CPU
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
-	EndGlobalSection
-	GlobalSection(NestedProjects) = preSolution
-		{C8D3015A-EA39-4F03-AEEC-3FF1F2087A12} = {1F896D5C-5FC2-4671-9216-781CB8187EC7}
-	EndGlobalSection
-EndGlobal
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "proto", "proto", "{1F896D5C-5FC2-4671-9216-781CB8187EC7}"
+	ProjectSection(SolutionItems) = preProject
+		..\protos\tutorial\addressbook.proto = ..\protos\tutorial\addressbook.proto
+		..\protos\google\protobuf\csharp_options.proto = ..\protos\google\protobuf\csharp_options.proto
+		..\protos\google\protobuf\descriptor.proto = ..\protos\google\protobuf\descriptor.proto
+	EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "unittest", "unittest", "{C8D3015A-EA39-4F03-AEEC-3FF1F2087A12}"
+	ProjectSection(SolutionItems) = preProject
+		..\protos\google\test\google_size.proto = ..\protos\google\test\google_size.proto
+		..\protos\google\test\google_speed.proto = ..\protos\google\test\google_speed.proto
+		..\protos\google\protobuf\unittest.proto = ..\protos\google\protobuf\unittest.proto
+		..\protos\google\protobuf\unittest_csharp_options.proto = ..\protos\google\protobuf\unittest_csharp_options.proto
+		..\protos\google\protobuf\unittest_custom_options.proto = ..\protos\google\protobuf\unittest_custom_options.proto
+		..\protos\google\protobuf\unittest_embed_optimize_for.proto = ..\protos\google\protobuf\unittest_embed_optimize_for.proto
+		..\protos\google\protobuf\unittest_empty.proto = ..\protos\google\protobuf\unittest_empty.proto
+		..\protos\google\protobuf\unittest_enormous_descriptor.proto = ..\protos\google\protobuf\unittest_enormous_descriptor.proto
+		..\protos\extest\unittest_extras_lite.proto = ..\protos\extest\unittest_extras_lite.proto
+		..\protos\extest\unittest_extras_xmltest.proto = ..\protos\extest\unittest_extras_xmltest.proto
+		..\protos\extest\unittest_generic_services.proto = ..\protos\extest\unittest_generic_services.proto
+		..\protos\google\protobuf\unittest_import.proto = ..\protos\google\protobuf\unittest_import.proto
+		..\protos\google\protobuf\unittest_import_lite.proto = ..\protos\google\protobuf\unittest_import_lite.proto
+		..\protos\google\protobuf\unittest_lite.proto = ..\protos\google\protobuf\unittest_lite.proto
+		..\protos\google\protobuf\unittest_lite_imports_nonlite.proto = ..\protos\google\protobuf\unittest_lite_imports_nonlite.proto
+		..\protos\google\protobuf\unittest_mset.proto = ..\protos\google\protobuf\unittest_mset.proto
+		..\protos\google\protobuf\unittest_no_generic_services.proto = ..\protos\google\protobuf\unittest_no_generic_services.proto
+		..\protos\google\protobuf\unittest_optimize_for.proto = ..\protos\google\protobuf\unittest_optimize_for.proto
+		..\protos\extest\unittest_rpc_interop.proto = ..\protos\extest\unittest_rpc_interop.proto
+	EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProtocolBuffers", "ProtocolBuffers\ProtocolBuffers.csproj", "{6908BDCE-D925-43F3-94AC-A531E6DF2591}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProtocolBuffers.Test", "ProtocolBuffers.Test\ProtocolBuffers.Test.csproj", "{DD01ED24-3750-4567-9A23-1DB676A15610}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProtoGen", "ProtoGen\ProtoGen.csproj", "{250ADE34-82FD-4BAE-86D5-985FBE589C4A}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProtoGen.Test", "ProtoGen.Test\ProtoGen.Test.csproj", "{C268DA4C-4004-47DA-AF23-44C983281A68}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AddressBook", "AddressBook\AddressBook.csproj", "{A31F5FB2-4FF3-432A-B35B-5CD203606311}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProtoMunge", "ProtoMunge\ProtoMunge.csproj", "{8F09AF72-3327-4FA7-BC09-070B80221AB9}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProtoBench", "ProtoBench\ProtoBench.csproj", "{C7A4A435-2813-41C8-AA87-BD914BA5223D}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProtoDump", "ProtoDump\ProtoDump.csproj", "{D7282E99-2DC3-405B-946F-177DB2FD2AE2}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProtocolBuffersLite", "ProtocolBuffers\ProtocolBuffersLite.csproj", "{6969BDCE-D925-43F3-94AC-A531E6DF2591}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProtocolBuffersLite.Test", "ProtocolBuffersLite.Test\ProtocolBuffersLite.Test.csproj", "{EE01ED24-3750-4567-9A23-1DB676A15610}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProtocolBuffersLiteMixed.Test", "ProtocolBuffersLite.Test\ProtocolBuffersLiteMixed.Test.csproj", "{EEFFED24-3750-4567-9A23-1DB676A15610}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{66ED1950-AD27-42D7-88F8-94355AEC8225}"
+	ProjectSection(SolutionItems) = preProject
+		..\build\Build.bat = ..\build\Build.bat
+		..\build\build.csproj = ..\build\build.csproj
+		..\build\build35.bat = ..\build\build35.bat
+		..\build\BuildAll.bat = ..\build\BuildAll.bat
+		..\build\BuildSilverlight2.bat = ..\build\BuildSilverlight2.bat
+		..\build\Common.targets = ..\build\Common.targets
+		..\build\GenerateCompletePackage.bat = ..\build\GenerateCompletePackage.bat
+		..\build\GenerateReleasePackage.bat = ..\build\GenerateReleasePackage.bat
+		..\build\PublishRelease.bat = ..\build\PublishRelease.bat
+		..\build\RunBenchmarks.bat = ..\build\RunBenchmarks.bat
+	EndProjectSection
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug_Silverlight2|Any CPU = Debug_Silverlight2|Any CPU
+		Debug|Any CPU = Debug|Any CPU
+		Release_Silverlight2|Any CPU = Release_Silverlight2|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{6908BDCE-D925-43F3-94AC-A531E6DF2591}.Debug_Silverlight2|Any CPU.ActiveCfg = Debug_Silverlight2|Any CPU
+		{6908BDCE-D925-43F3-94AC-A531E6DF2591}.Debug_Silverlight2|Any CPU.Build.0 = Debug_Silverlight2|Any CPU
+		{6908BDCE-D925-43F3-94AC-A531E6DF2591}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{6908BDCE-D925-43F3-94AC-A531E6DF2591}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{6908BDCE-D925-43F3-94AC-A531E6DF2591}.Release_Silverlight2|Any CPU.ActiveCfg = Release_Silverlight2|Any CPU
+		{6908BDCE-D925-43F3-94AC-A531E6DF2591}.Release_Silverlight2|Any CPU.Build.0 = Release_Silverlight2|Any CPU
+		{6908BDCE-D925-43F3-94AC-A531E6DF2591}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{6908BDCE-D925-43F3-94AC-A531E6DF2591}.Release|Any CPU.Build.0 = Release|Any CPU
+		{DD01ED24-3750-4567-9A23-1DB676A15610}.Debug_Silverlight2|Any CPU.ActiveCfg = Debug|Any CPU
+		{DD01ED24-3750-4567-9A23-1DB676A15610}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{DD01ED24-3750-4567-9A23-1DB676A15610}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{DD01ED24-3750-4567-9A23-1DB676A15610}.Release_Silverlight2|Any CPU.ActiveCfg = Release|Any CPU
+		{DD01ED24-3750-4567-9A23-1DB676A15610}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{DD01ED24-3750-4567-9A23-1DB676A15610}.Release|Any CPU.Build.0 = Release|Any CPU
+		{250ADE34-82FD-4BAE-86D5-985FBE589C4A}.Debug_Silverlight2|Any CPU.ActiveCfg = Debug|Any CPU
+		{250ADE34-82FD-4BAE-86D5-985FBE589C4A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{250ADE34-82FD-4BAE-86D5-985FBE589C4A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{250ADE34-82FD-4BAE-86D5-985FBE589C4A}.Release_Silverlight2|Any CPU.ActiveCfg = Release|Any CPU
+		{250ADE34-82FD-4BAE-86D5-985FBE589C4A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{250ADE34-82FD-4BAE-86D5-985FBE589C4A}.Release|Any CPU.Build.0 = Release|Any CPU
+		{C268DA4C-4004-47DA-AF23-44C983281A68}.Debug_Silverlight2|Any CPU.ActiveCfg = Debug|Any CPU
+		{C268DA4C-4004-47DA-AF23-44C983281A68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{C268DA4C-4004-47DA-AF23-44C983281A68}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{C268DA4C-4004-47DA-AF23-44C983281A68}.Release_Silverlight2|Any CPU.ActiveCfg = Release|Any CPU
+		{C268DA4C-4004-47DA-AF23-44C983281A68}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{C268DA4C-4004-47DA-AF23-44C983281A68}.Release|Any CPU.Build.0 = Release|Any CPU
+		{A31F5FB2-4FF3-432A-B35B-5CD203606311}.Debug_Silverlight2|Any CPU.ActiveCfg = Debug|Any CPU
+		{A31F5FB2-4FF3-432A-B35B-5CD203606311}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{A31F5FB2-4FF3-432A-B35B-5CD203606311}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{A31F5FB2-4FF3-432A-B35B-5CD203606311}.Release_Silverlight2|Any CPU.ActiveCfg = Release|Any CPU
+		{A31F5FB2-4FF3-432A-B35B-5CD203606311}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{A31F5FB2-4FF3-432A-B35B-5CD203606311}.Release|Any CPU.Build.0 = Release|Any CPU
+		{8F09AF72-3327-4FA7-BC09-070B80221AB9}.Debug_Silverlight2|Any CPU.ActiveCfg = Debug|Any CPU
+		{8F09AF72-3327-4FA7-BC09-070B80221AB9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{8F09AF72-3327-4FA7-BC09-070B80221AB9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{8F09AF72-3327-4FA7-BC09-070B80221AB9}.Release_Silverlight2|Any CPU.ActiveCfg = Release|Any CPU
+		{8F09AF72-3327-4FA7-BC09-070B80221AB9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{8F09AF72-3327-4FA7-BC09-070B80221AB9}.Release|Any CPU.Build.0 = Release|Any CPU
+		{C7A4A435-2813-41C8-AA87-BD914BA5223D}.Debug_Silverlight2|Any CPU.ActiveCfg = Debug|Any CPU
+		{C7A4A435-2813-41C8-AA87-BD914BA5223D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{C7A4A435-2813-41C8-AA87-BD914BA5223D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{C7A4A435-2813-41C8-AA87-BD914BA5223D}.Release_Silverlight2|Any CPU.ActiveCfg = Release|Any CPU
+		{C7A4A435-2813-41C8-AA87-BD914BA5223D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{C7A4A435-2813-41C8-AA87-BD914BA5223D}.Release|Any CPU.Build.0 = Release|Any CPU
+		{D7282E99-2DC3-405B-946F-177DB2FD2AE2}.Debug_Silverlight2|Any CPU.ActiveCfg = Debug|Any CPU
+		{D7282E99-2DC3-405B-946F-177DB2FD2AE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{D7282E99-2DC3-405B-946F-177DB2FD2AE2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{D7282E99-2DC3-405B-946F-177DB2FD2AE2}.Release_Silverlight2|Any CPU.ActiveCfg = Release|Any CPU
+		{D7282E99-2DC3-405B-946F-177DB2FD2AE2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{D7282E99-2DC3-405B-946F-177DB2FD2AE2}.Release|Any CPU.Build.0 = Release|Any CPU
+		{6969BDCE-D925-43F3-94AC-A531E6DF2591}.Debug_Silverlight2|Any CPU.ActiveCfg = Debug_Silverlight2|Any CPU
+		{6969BDCE-D925-43F3-94AC-A531E6DF2591}.Debug_Silverlight2|Any CPU.Build.0 = Debug_Silverlight2|Any CPU
+		{6969BDCE-D925-43F3-94AC-A531E6DF2591}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{6969BDCE-D925-43F3-94AC-A531E6DF2591}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{6969BDCE-D925-43F3-94AC-A531E6DF2591}.Release_Silverlight2|Any CPU.ActiveCfg = Release_Silverlight2|Any CPU
+		{6969BDCE-D925-43F3-94AC-A531E6DF2591}.Release_Silverlight2|Any CPU.Build.0 = Release_Silverlight2|Any CPU
+		{6969BDCE-D925-43F3-94AC-A531E6DF2591}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{6969BDCE-D925-43F3-94AC-A531E6DF2591}.Release|Any CPU.Build.0 = Release|Any CPU
+		{EE01ED24-3750-4567-9A23-1DB676A15610}.Debug_Silverlight2|Any CPU.ActiveCfg = Debug|Any CPU
+		{EE01ED24-3750-4567-9A23-1DB676A15610}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{EE01ED24-3750-4567-9A23-1DB676A15610}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{EE01ED24-3750-4567-9A23-1DB676A15610}.Release_Silverlight2|Any CPU.ActiveCfg = Release|Any CPU
+		{EE01ED24-3750-4567-9A23-1DB676A15610}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{EE01ED24-3750-4567-9A23-1DB676A15610}.Release|Any CPU.Build.0 = Release|Any CPU
+		{EEFFED24-3750-4567-9A23-1DB676A15610}.Debug_Silverlight2|Any CPU.ActiveCfg = Debug|Any CPU
+		{EEFFED24-3750-4567-9A23-1DB676A15610}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{EEFFED24-3750-4567-9A23-1DB676A15610}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{EEFFED24-3750-4567-9A23-1DB676A15610}.Release_Silverlight2|Any CPU.ActiveCfg = Release|Any CPU
+		{EEFFED24-3750-4567-9A23-1DB676A15610}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{EEFFED24-3750-4567-9A23-1DB676A15610}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(NestedProjects) = preSolution
+		{C8D3015A-EA39-4F03-AEEC-3FF1F2087A12} = {1F896D5C-5FC2-4671-9216-781CB8187EC7}
+	EndGlobalSection
+EndGlobal

+ 6 - 1
src/ProtocolBuffers/ByteString.cs

@@ -91,7 +91,12 @@ namespace Google.ProtocolBuffers
 
         public byte[] ToByteArray()
         {
-            return (byte[]) bytes.Clone();
+            return (byte[])bytes.Clone();
+        }
+
+        public string ToBase64()
+        {
+            return Convert.ToBase64String(bytes);
         }
 
         /// <summary>

+ 1 - 1
src/ProtocolBuffers/ExtensionInfo.cs

@@ -75,7 +75,7 @@ namespace Google.ProtocolBuffers
 
         object IGeneratedExtensionLite.ContainingType
         {
-            get { return Descriptor; }
+            get { return Descriptor.ContainingType; }
         }
 
         IMessageLite IGeneratedExtensionLite.MessageDefaultInstance

+ 19 - 38
src/ProtocolBuffers/ExtensionRegistry.cs

@@ -93,53 +93,27 @@ namespace Google.ProtocolBuffers
     /// </remarks>
     public sealed partial class ExtensionRegistry
     {
-#if !LITE
-        private static readonly ExtensionRegistry empty = new ExtensionRegistry(
-            new Dictionary<string, ExtensionInfo>(),
-            new Dictionary<ExtensionIntPair, IGeneratedExtensionLite>(),
-            true);
-
-        private readonly IDictionary<string, ExtensionInfo> extensionsByName;
-
-        private ExtensionRegistry(IDictionary<String, ExtensionInfo> extensionsByName,
-                                  IDictionary<ExtensionIntPair, IGeneratedExtensionLite> extensionsByNumber,
-                                  bool readOnly)
-            : this(extensionsByNumber, readOnly)
-        {
-            this.extensionsByName = extensionsByName;
-        }
-
-        /// <summary>
-        /// Construct a new, empty instance.
-        /// </summary>
-        public static ExtensionRegistry CreateInstance()
-        {
-            return new ExtensionRegistry(new Dictionary<string, ExtensionInfo>(),
-                                         new Dictionary<ExtensionIntPair, IGeneratedExtensionLite>(), false);
-        }
-
-        public ExtensionRegistry AsReadOnly()
-        {
-            return new ExtensionRegistry(extensionsByName, extensionsByNumber, true);
-        }
-#endif
-
         /// <summary>
         /// Finds an extension by fully-qualified field name, in the
         /// proto namespace, i.e. result.Descriptor.FullName will match
         /// <paramref name="fullName"/> if a match is found. A null
         /// reference is returned if the extension can't be found.
         /// </summary>
+        [Obsolete("Please use the FindByName method instead.", true)]
         public ExtensionInfo this[string fullName]
         {
             get
             {
-                ExtensionInfo ret;
-                extensionsByName.TryGetValue(fullName, out ret);
-                return ret;
+                foreach (IGeneratedExtensionLite ext in extensionsByNumber.Values)
+                {
+                    if (StringComparer.Ordinal.Equals(ext.Descriptor.FullName, fullName))
+                        return ext as ExtensionInfo;
+                }
+                return null;
             }
         }
 
+#if !LITE
         /// <summary>
         /// Finds an extension by containing type and field number.
         /// A null reference is returned if the extension can't be found.
@@ -154,6 +128,12 @@ namespace Google.ProtocolBuffers
             }
         }
 
+        public ExtensionInfo FindByName(MessageDescriptor containingType, string fieldName)
+        {
+            return FindExtensionByName(containingType, fieldName) as ExtensionInfo;
+        }
+#endif
+
         /// <summary>
         /// Add an extension from a generated file to the registry.
         /// </summary>
@@ -210,9 +190,8 @@ namespace Google.ProtocolBuffers
                                             + "regular (non-extension) field.");
             }
 
-            extensionsByName[extension.Descriptor.FullName] = extension;
-            extensionsByNumber[new ExtensionIntPair(extension.Descriptor.ContainingType,
-                                                    extension.Descriptor.FieldNumber)] = extension;
+            IGeneratedExtensionLite liteExtension = extension;
+            Add(liteExtension);
 
             FieldDescriptor field = extension.Descriptor;
             if (field.ContainingType.Options.MessageSetWireFormat
@@ -223,7 +202,9 @@ namespace Google.ProtocolBuffers
                 // This is an extension of a MessageSet type defined within the extension
                 // type's own scope. For backwards-compatibility, allow it to be looked
                 // up by type name.
-                extensionsByName[field.MessageType.FullName] = extension;
+                Dictionary<string, IGeneratedExtensionLite> map;
+                if (extensionsByName.TryGetValue(liteExtension.ContainingType, out map))
+                    map[field.MessageType.FullName] = extension;
             }
         }
     }

+ 38 - 19
src/ProtocolBuffers/ExtensionRegistryLite.cs

@@ -36,6 +36,7 @@
 
 using System.Collections.Generic;
 using System;
+using Google.ProtocolBuffers.Descriptors;
 
 namespace Google.ProtocolBuffers
 {
@@ -92,37 +93,39 @@ namespace Google.ProtocolBuffers
     /// </remarks>
     public sealed partial class ExtensionRegistry
     {
-        private readonly IDictionary<ExtensionIntPair, IGeneratedExtensionLite> extensionsByNumber;
+        class ExtensionByNameMap : Dictionary<object, Dictionary<string, IGeneratedExtensionLite>> { }
+        class ExtensionByIdMap : Dictionary<ExtensionIntPair, IGeneratedExtensionLite> { }
+
+        private static readonly ExtensionRegistry empty = new ExtensionRegistry(
+            new ExtensionByNameMap(),
+            new ExtensionByIdMap(),
+            true);
+
+        private readonly ExtensionByNameMap extensionsByName;
+        private readonly ExtensionByIdMap extensionsByNumber;
+
         private readonly bool readOnly;
 
-        private ExtensionRegistry(IDictionary<ExtensionIntPair, IGeneratedExtensionLite> extensionsByNumber,
-                                  bool readOnly)
+        private ExtensionRegistry(ExtensionByNameMap byName, ExtensionByIdMap byNumber, bool readOnly)
         {
-            this.extensionsByNumber = extensionsByNumber;
+            this.extensionsByName = byName;
+            this.extensionsByNumber = byNumber;
             this.readOnly = readOnly;
         }
 
-#if LITE
-        private static readonly ExtensionRegistry empty = new ExtensionRegistry(
-            new Dictionary<ExtensionIntPair, IGeneratedExtensionLite>(),
-            true);
-
         /// <summary>
         /// Construct a new, empty instance.
         /// </summary>
         public static ExtensionRegistry CreateInstance()
         {
-            return new ExtensionRegistry(
-                new Dictionary<ExtensionIntPair, IGeneratedExtensionLite>(), false);
+            return new ExtensionRegistry(new ExtensionByNameMap(), new ExtensionByIdMap(), false);
         }
 
         public ExtensionRegistry AsReadOnly()
         {
-            return new ExtensionRegistry(extensionsByNumber, true);
+            return new ExtensionRegistry(extensionsByName, extensionsByNumber, true);
         }
 
-#endif
-
         /// <summary>
         /// Get the unmodifiable singleton empty instance.
         /// </summary>
@@ -145,6 +148,18 @@ namespace Google.ProtocolBuffers
             }
         }
 
+        public IGeneratedExtensionLite FindByName(IMessageLite defaultInstanceOfType, string fieldName)
+        { return FindExtensionByName(defaultInstanceOfType, fieldName); }
+
+        IGeneratedExtensionLite FindExtensionByName(object forwhat, string fieldName)
+        {
+            IGeneratedExtensionLite extension = null;
+            Dictionary<string, IGeneratedExtensionLite> map;
+            if (extensionsByName.TryGetValue(forwhat, out map) && map.TryGetValue(fieldName, out extension))
+                return extension;
+            return null;
+        }
+
         /// <summary>
         /// Add an extension from a generated file to the registry.
         /// </summary>
@@ -154,9 +169,13 @@ namespace Google.ProtocolBuffers
             {
                 throw new InvalidOperationException("Cannot add entries to a read-only extension registry");
             }
-            extensionsByNumber.Add(
-                new ExtensionIntPair(extension.ContainingType, extension.Number),
-                extension);
+            extensionsByNumber.Add(new ExtensionIntPair(extension.ContainingType, extension.Number), extension);
+
+            Dictionary<string, IGeneratedExtensionLite> map;
+            if (!extensionsByName.TryGetValue(extension.ContainingType, out map))
+                extensionsByName.Add(extension.ContainingType, map = new Dictionary<string, IGeneratedExtensionLite>());
+            map[extension.Descriptor.Name] = extension;
+            map[extension.Descriptor.FullName] = extension;
         }
 
         /// <summary>
@@ -176,7 +195,7 @@ namespace Google.ProtocolBuffers
 
             public override int GetHashCode()
             {
-                return msgType.GetHashCode()*((1 << 16) - 1) + number;
+                return msgType.GetHashCode() * ((1 << 16) - 1) + number;
             }
 
             public override bool Equals(object obj)
@@ -185,7 +204,7 @@ namespace Google.ProtocolBuffers
                 {
                     return false;
                 }
-                return Equals((ExtensionIntPair) obj);
+                return Equals((ExtensionIntPair)obj);
             }
 
             public bool Equals(ExtensionIntPair other)

+ 1 - 0
src/ProtocolBuffers/FieldSet.cs

@@ -50,6 +50,7 @@ namespace Google.ProtocolBuffers
         bool IsExtension { get; }
         bool MessageSetWireFormat { get; } //field.ContainingType.Options.MessageSetWireFormat
         int FieldNumber { get; }
+        string Name { get; }
         string FullName { get; }
         IEnumLiteMap EnumType { get; }
         FieldType FieldType { get; }

+ 12 - 0
src/ProtocolBuffers/GeneratedExtensionLite.cs

@@ -74,6 +74,18 @@ namespace Google.ProtocolBuffers
             this.defaultValue = defaultValue;
         }
 
+        public string Name
+        {
+            get 
+            {
+                string name = fullName;
+                int offset = name.LastIndexOf('.');
+                if (offset >= 0)
+                    name = name.Substring(offset);
+                return name;
+            }
+        }
+
         public string FullName
         {
             get { return fullName; }

+ 11 - 3
src/ProtocolBuffers/TextFormat.cs

@@ -166,14 +166,22 @@ namespace Google.ProtocolBuffers
         {
             switch (field.FieldType)
             {
+                // The Float and Double types must specify the "r" format to preserve their precision, otherwise,
+                // the double to/from string will trim the precision to 6 places.  As with other numeric formats
+                // below, always use the invariant culture so it's predictable.
+                case FieldType.Float:
+                    generator.Print(((float)value).ToString("r", CultureInfo.InvariantCulture));
+                    break;
+                case FieldType.Double:
+                    generator.Print(((double)value).ToString("r", CultureInfo.InvariantCulture));
+                    break;
+
                 case FieldType.Int32:
                 case FieldType.Int64:
                 case FieldType.SInt32:
                 case FieldType.SInt64:
                 case FieldType.SFixed32:
                 case FieldType.SFixed64:
-                case FieldType.Float:
-                case FieldType.Double:
                 case FieldType.UInt32:
                 case FieldType.UInt64:
                 case FieldType.Fixed32:
@@ -670,7 +678,7 @@ namespace Google.ProtocolBuffers
                     name.Append(tokenizer.ConsumeIdentifier());
                 }
 
-                extension = extensionRegistry[name.ToString()];
+                extension = extensionRegistry.FindByName(type, name.ToString());
 
                 if (extension == null)
                 {

+ 1 - 5
src/ProtocolBuffers/WireFormat.cs

@@ -35,12 +35,8 @@
 #endregion
 
 using System;
-
-#if !LITE
 using Google.ProtocolBuffers.Descriptors;
 
-#endif
-
 namespace Google.ProtocolBuffers
 {
     /// <summary>
@@ -146,6 +142,7 @@ namespace Google.ProtocolBuffers
             return descriptor.IsPacked ? WireType.LengthDelimited : GetWireType(descriptor.FieldType);
         }
 
+#endif
         /// <summary>
         /// Converts a field type to its wire type. Done with a switch for the sake
         /// of speed - this is significantly faster than a dictionary lookup.
@@ -190,6 +187,5 @@ namespace Google.ProtocolBuffers
                     throw new ArgumentOutOfRangeException("No such field type");
             }
         }
-#endif
     }
 }

+ 3 - 19
src/ProtocolBuffers2008.sln

@@ -10,14 +10,16 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "proto", "proto", "{1F896D5C
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "unittest", "unittest", "{C8D3015A-EA39-4F03-AEEC-3FF1F2087A12}"
 	ProjectSection(SolutionItems) = preProject
+		..\protos\google\test\google_size.proto = ..\protos\google\test\google_size.proto
+		..\protos\google\test\google_speed.proto = ..\protos\google\test\google_speed.proto
 		..\protos\google\protobuf\unittest.proto = ..\protos\google\protobuf\unittest.proto
 		..\protos\google\protobuf\unittest_csharp_options.proto = ..\protos\google\protobuf\unittest_csharp_options.proto
 		..\protos\google\protobuf\unittest_custom_options.proto = ..\protos\google\protobuf\unittest_custom_options.proto
 		..\protos\google\protobuf\unittest_embed_optimize_for.proto = ..\protos\google\protobuf\unittest_embed_optimize_for.proto
 		..\protos\google\protobuf\unittest_empty.proto = ..\protos\google\protobuf\unittest_empty.proto
 		..\protos\google\protobuf\unittest_enormous_descriptor.proto = ..\protos\google\protobuf\unittest_enormous_descriptor.proto
-		..\protos\extest\unittest_extras_full.proto = ..\protos\extest\unittest_extras_full.proto
 		..\protos\extest\unittest_extras_lite.proto = ..\protos\extest\unittest_extras_lite.proto
+		..\protos\extest\unittest_extras_xmltest.proto = ..\protos\extest\unittest_extras_xmltest.proto
 		..\protos\extest\unittest_generic_services.proto = ..\protos\extest\unittest_generic_services.proto
 		..\protos\google\protobuf\unittest_import.proto = ..\protos\google\protobuf\unittest_import.proto
 		..\protos\google\protobuf\unittest_import_lite.proto = ..\protos\google\protobuf\unittest_import_lite.proto
@@ -82,59 +84,45 @@ Global
 		{6908BDCE-D925-43F3-94AC-A531E6DF2591}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{6908BDCE-D925-43F3-94AC-A531E6DF2591}.Release|Any CPU.Build.0 = Release|Any CPU
 		{DD01ED24-3750-4567-9A23-1DB676A15610}.Debug_Silverlight2|Any CPU.ActiveCfg = Debug|Any CPU
-		{DD01ED24-3750-4567-9A23-1DB676A15610}.Debug_Silverlight2|Any CPU.Build.0 = Debug|Any CPU
 		{DD01ED24-3750-4567-9A23-1DB676A15610}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{DD01ED24-3750-4567-9A23-1DB676A15610}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{DD01ED24-3750-4567-9A23-1DB676A15610}.Release_Silverlight2|Any CPU.ActiveCfg = Release|Any CPU
-		{DD01ED24-3750-4567-9A23-1DB676A15610}.Release_Silverlight2|Any CPU.Build.0 = Release|Any CPU
 		{DD01ED24-3750-4567-9A23-1DB676A15610}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{DD01ED24-3750-4567-9A23-1DB676A15610}.Release|Any CPU.Build.0 = Release|Any CPU
 		{250ADE34-82FD-4BAE-86D5-985FBE589C4A}.Debug_Silverlight2|Any CPU.ActiveCfg = Debug|Any CPU
-		{250ADE34-82FD-4BAE-86D5-985FBE589C4A}.Debug_Silverlight2|Any CPU.Build.0 = Debug|Any CPU
 		{250ADE34-82FD-4BAE-86D5-985FBE589C4A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{250ADE34-82FD-4BAE-86D5-985FBE589C4A}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{250ADE34-82FD-4BAE-86D5-985FBE589C4A}.Release_Silverlight2|Any CPU.ActiveCfg = Release|Any CPU
-		{250ADE34-82FD-4BAE-86D5-985FBE589C4A}.Release_Silverlight2|Any CPU.Build.0 = Release|Any CPU
 		{250ADE34-82FD-4BAE-86D5-985FBE589C4A}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{250ADE34-82FD-4BAE-86D5-985FBE589C4A}.Release|Any CPU.Build.0 = Release|Any CPU
 		{C268DA4C-4004-47DA-AF23-44C983281A68}.Debug_Silverlight2|Any CPU.ActiveCfg = Debug|Any CPU
-		{C268DA4C-4004-47DA-AF23-44C983281A68}.Debug_Silverlight2|Any CPU.Build.0 = Debug|Any CPU
 		{C268DA4C-4004-47DA-AF23-44C983281A68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{C268DA4C-4004-47DA-AF23-44C983281A68}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{C268DA4C-4004-47DA-AF23-44C983281A68}.Release_Silverlight2|Any CPU.ActiveCfg = Release|Any CPU
-		{C268DA4C-4004-47DA-AF23-44C983281A68}.Release_Silverlight2|Any CPU.Build.0 = Release|Any CPU
 		{C268DA4C-4004-47DA-AF23-44C983281A68}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{C268DA4C-4004-47DA-AF23-44C983281A68}.Release|Any CPU.Build.0 = Release|Any CPU
 		{A31F5FB2-4FF3-432A-B35B-5CD203606311}.Debug_Silverlight2|Any CPU.ActiveCfg = Debug|Any CPU
-		{A31F5FB2-4FF3-432A-B35B-5CD203606311}.Debug_Silverlight2|Any CPU.Build.0 = Debug|Any CPU
 		{A31F5FB2-4FF3-432A-B35B-5CD203606311}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{A31F5FB2-4FF3-432A-B35B-5CD203606311}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{A31F5FB2-4FF3-432A-B35B-5CD203606311}.Release_Silverlight2|Any CPU.ActiveCfg = Release|Any CPU
-		{A31F5FB2-4FF3-432A-B35B-5CD203606311}.Release_Silverlight2|Any CPU.Build.0 = Release|Any CPU
 		{A31F5FB2-4FF3-432A-B35B-5CD203606311}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{A31F5FB2-4FF3-432A-B35B-5CD203606311}.Release|Any CPU.Build.0 = Release|Any CPU
 		{8F09AF72-3327-4FA7-BC09-070B80221AB9}.Debug_Silverlight2|Any CPU.ActiveCfg = Debug|Any CPU
-		{8F09AF72-3327-4FA7-BC09-070B80221AB9}.Debug_Silverlight2|Any CPU.Build.0 = Debug|Any CPU
 		{8F09AF72-3327-4FA7-BC09-070B80221AB9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{8F09AF72-3327-4FA7-BC09-070B80221AB9}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{8F09AF72-3327-4FA7-BC09-070B80221AB9}.Release_Silverlight2|Any CPU.ActiveCfg = Release|Any CPU
-		{8F09AF72-3327-4FA7-BC09-070B80221AB9}.Release_Silverlight2|Any CPU.Build.0 = Release|Any CPU
 		{8F09AF72-3327-4FA7-BC09-070B80221AB9}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{8F09AF72-3327-4FA7-BC09-070B80221AB9}.Release|Any CPU.Build.0 = Release|Any CPU
 		{C7A4A435-2813-41C8-AA87-BD914BA5223D}.Debug_Silverlight2|Any CPU.ActiveCfg = Debug|Any CPU
-		{C7A4A435-2813-41C8-AA87-BD914BA5223D}.Debug_Silverlight2|Any CPU.Build.0 = Debug|Any CPU
 		{C7A4A435-2813-41C8-AA87-BD914BA5223D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{C7A4A435-2813-41C8-AA87-BD914BA5223D}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{C7A4A435-2813-41C8-AA87-BD914BA5223D}.Release_Silverlight2|Any CPU.ActiveCfg = Release|Any CPU
-		{C7A4A435-2813-41C8-AA87-BD914BA5223D}.Release_Silverlight2|Any CPU.Build.0 = Release|Any CPU
 		{C7A4A435-2813-41C8-AA87-BD914BA5223D}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{C7A4A435-2813-41C8-AA87-BD914BA5223D}.Release|Any CPU.Build.0 = Release|Any CPU
 		{D7282E99-2DC3-405B-946F-177DB2FD2AE2}.Debug_Silverlight2|Any CPU.ActiveCfg = Debug|Any CPU
-		{D7282E99-2DC3-405B-946F-177DB2FD2AE2}.Debug_Silverlight2|Any CPU.Build.0 = Debug|Any CPU
 		{D7282E99-2DC3-405B-946F-177DB2FD2AE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{D7282E99-2DC3-405B-946F-177DB2FD2AE2}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{D7282E99-2DC3-405B-946F-177DB2FD2AE2}.Release_Silverlight2|Any CPU.ActiveCfg = Release|Any CPU
-		{D7282E99-2DC3-405B-946F-177DB2FD2AE2}.Release_Silverlight2|Any CPU.Build.0 = Release|Any CPU
 		{D7282E99-2DC3-405B-946F-177DB2FD2AE2}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{D7282E99-2DC3-405B-946F-177DB2FD2AE2}.Release|Any CPU.Build.0 = Release|Any CPU
 		{6969BDCE-D925-43F3-94AC-A531E6DF2591}.Debug_Silverlight2|Any CPU.ActiveCfg = Debug_Silverlight2|Any CPU
@@ -146,19 +134,15 @@ Global
 		{6969BDCE-D925-43F3-94AC-A531E6DF2591}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{6969BDCE-D925-43F3-94AC-A531E6DF2591}.Release|Any CPU.Build.0 = Release|Any CPU
 		{EE01ED24-3750-4567-9A23-1DB676A15610}.Debug_Silverlight2|Any CPU.ActiveCfg = Debug|Any CPU
-		{EE01ED24-3750-4567-9A23-1DB676A15610}.Debug_Silverlight2|Any CPU.Build.0 = Debug|Any CPU
 		{EE01ED24-3750-4567-9A23-1DB676A15610}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{EE01ED24-3750-4567-9A23-1DB676A15610}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{EE01ED24-3750-4567-9A23-1DB676A15610}.Release_Silverlight2|Any CPU.ActiveCfg = Release|Any CPU
-		{EE01ED24-3750-4567-9A23-1DB676A15610}.Release_Silverlight2|Any CPU.Build.0 = Release|Any CPU
 		{EE01ED24-3750-4567-9A23-1DB676A15610}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{EE01ED24-3750-4567-9A23-1DB676A15610}.Release|Any CPU.Build.0 = Release|Any CPU
 		{EEFFED24-3750-4567-9A23-1DB676A15610}.Debug_Silverlight2|Any CPU.ActiveCfg = Debug|Any CPU
-		{EEFFED24-3750-4567-9A23-1DB676A15610}.Debug_Silverlight2|Any CPU.Build.0 = Debug|Any CPU
 		{EEFFED24-3750-4567-9A23-1DB676A15610}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{EEFFED24-3750-4567-9A23-1DB676A15610}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{EEFFED24-3750-4567-9A23-1DB676A15610}.Release_Silverlight2|Any CPU.ActiveCfg = Release|Any CPU
-		{EEFFED24-3750-4567-9A23-1DB676A15610}.Release_Silverlight2|Any CPU.Build.0 = Release|Any CPU
 		{EEFFED24-3750-4567-9A23-1DB676A15610}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{EEFFED24-3750-4567-9A23-1DB676A15610}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection

+ 41 - 1
src/ProtocolBuffersLite.Test/TestProtos/UnitTestExtrasLiteProtoFile.cs

@@ -1,4 +1,4 @@
-// Generated by ProtoGen, Version=0.9.0.0, Culture=neutral, PublicKeyToken=8fd7408b07f8d2cd.  DO NOT EDIT!
+// Generated by ProtoGen, Version=2.3.0.277, Culture=neutral, PublicKeyToken=17b3b1f090c3ea48.  DO NOT EDIT!
 
 using pb = global::Google.ProtocolBuffers;
 using pbc = global::Google.ProtocolBuffers.Collections;
@@ -6,6 +6,9 @@ using pbd = global::Google.ProtocolBuffers.Descriptors;
 using scg = global::System.Collections.Generic;
 namespace Google.ProtocolBuffers.TestProtos {
   
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+  [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
   public static partial class UnitTestExtrasLiteProtoFile {
   
     #region Extension registration
@@ -38,6 +41,8 @@ namespace Google.ProtocolBuffers.TestProtos {
     
   }
   #region Enums
+  [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+  [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
   public enum ExtraEnum {
     DEFAULT = 10,
     EXLITE_FOO = 7,
@@ -48,6 +53,9 @@ namespace Google.ProtocolBuffers.TestProtos {
   #endregion
   
   #region Messages
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+  [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
   public sealed partial class TestRequiredLite : pb::GeneratedMessageLite<TestRequiredLite, TestRequiredLite.Builder> {
     private static readonly TestRequiredLite defaultInstance = new Builder().BuildPartial();
     public static TestRequiredLite DefaultInstance {
@@ -177,6 +185,9 @@ namespace Google.ProtocolBuffers.TestProtos {
       return (Builder) new Builder().MergeFrom(prototype);
     }
     
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
     public sealed partial class Builder : pb::GeneratedBuilderLite<TestRequiredLite, Builder> {
       protected override Builder ThisBuilder {
         get { return this; }
@@ -307,6 +318,9 @@ namespace Google.ProtocolBuffers.TestProtos {
     }
   }
   
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+  [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
   public sealed partial class TestInteropPersonLite : pb::ExtendableMessageLite<TestInteropPersonLite, TestInteropPersonLite.Builder> {
     private static readonly TestInteropPersonLite defaultInstance = new Builder().BuildPartial();
     public static TestInteropPersonLite DefaultInstance {
@@ -322,13 +336,21 @@ namespace Google.ProtocolBuffers.TestProtos {
     }
     
     #region Nested types
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
     public static class Types {
+      [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+      [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
       public enum PhoneType {
         MOBILE = 0,
         HOME = 1,
         WORK = 2,
       }
       
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+      [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
       public sealed partial class PhoneNumber : pb::GeneratedMessageLite<PhoneNumber, PhoneNumber.Builder> {
         private static readonly PhoneNumber defaultInstance = new Builder().BuildPartial();
         public static PhoneNumber DefaultInstance {
@@ -457,6 +479,9 @@ namespace Google.ProtocolBuffers.TestProtos {
           return (Builder) new Builder().MergeFrom(prototype);
         }
         
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
         public sealed partial class Builder : pb::GeneratedBuilderLite<PhoneNumber, Builder> {
           protected override Builder ThisBuilder {
             get { return this; }
@@ -588,6 +613,9 @@ namespace Google.ProtocolBuffers.TestProtos {
         }
       }
       
+      [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+      [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+      [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
       public sealed partial class Addresses : pb::GeneratedMessageLite<Addresses, Addresses.Builder> {
         private static readonly Addresses defaultInstance = new Builder().BuildPartial();
         public static Addresses DefaultInstance {
@@ -777,6 +805,9 @@ namespace Google.ProtocolBuffers.TestProtos {
           return (Builder) new Builder().MergeFrom(prototype);
         }
         
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
         public sealed partial class Builder : pb::GeneratedBuilderLite<Addresses, Builder> {
           protected override Builder ThisBuilder {
             get { return this; }
@@ -1216,6 +1247,9 @@ namespace Google.ProtocolBuffers.TestProtos {
       return (Builder) new Builder().MergeFrom(prototype);
     }
     
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
     public sealed partial class Builder : pb::ExtendableBuilderLite<TestInteropPersonLite, Builder> {
       protected override Builder ThisBuilder {
         get { return this; }
@@ -1505,6 +1539,9 @@ namespace Google.ProtocolBuffers.TestProtos {
     }
   }
   
+  [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+  [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+  [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
   public sealed partial class TestInteropEmployeeIdLite : pb::GeneratedMessageLite<TestInteropEmployeeIdLite, TestInteropEmployeeIdLite.Builder> {
     private static readonly TestInteropEmployeeIdLite defaultInstance = new Builder().BuildPartial();
     public static TestInteropEmployeeIdLite DefaultInstance {
@@ -1614,6 +1651,9 @@ namespace Google.ProtocolBuffers.TestProtos {
       return (Builder) new Builder().MergeFrom(prototype);
     }
     
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ProtoGen", "2.3.0.277")]
     public sealed partial class Builder : pb::GeneratedBuilderLite<TestInteropEmployeeIdLite, Builder> {
       protected override Builder ThisBuilder {
         get { return this; }