Squashed 'third_party/protobuf/' changes from e35e248..48cb18e

48cb18e Updated change log for 3.6.1 release
9e1286b Updated version numbers to 3.6.1
e508fc0 Check the message to be encoded is the wrong type. (#4885) (#4949)
fc90fd6 Make assertEquals pass for message (#4947)
d85ffdc Merge pull request #4924 from xfxyjwf/3.6.x
8356d27 Add continuous test for ruby 2.3, 2.4 and 2.5 (#4829)
7fdebf2 Fix cpp_distcheck
6c82411 Fix php conformance test.
11e2eca protoc-artifacts: Update centos base from 6.6 to 6.9
6fc2bac Updated Docker setup to use GCC 4.8
b3e4e3a Remove js_embed binary. (#4709)
0b3b470 Fix cpp benchmark dependency on mac
ae8def6 Comment out unused command from release script.
9327dc7 Run autogen.sh in release script.
9209a41 Add protoc release script for Linux build.
4d0fbd1 Add cpp tests under release docker image.
474fd31 Update protoc build scripts.
b23429e Fix 32bit php tests
8758cc1 Fix php tests
bd1224e fix golang kokoro linux build
359889b fix python cpp kokoro build
c1e6c4d fix linux kokoro build in docker
22503a0 fix for API change in PHP 7.3 (#4898)
e529d16 Make ruby release configs consistent with protoc.
82019f9 Merge pull request #4900 from xfxyjwf/3.6.x
0e38f9e Fix bazel build of examples.
b5975c1 Add kokoro bazel configs for 3.6.x branch.
4a4a60b Merge pull request #4880 from nashimus/3.6.x
e184577 Merge pull request #4878 from acozzette/fix-msvc-initialization
1f7837a Additional support for building and deploying ppcle_64 artifacts
a9abc78 Fix initialization with Visual Studio
f7ada12 Build ruby gem on kokoro (#4819)
56d2753 Rename build_artifacts.cfg to release.cfg (#4818)
b907a03 Add files to build ruby artifact for mac on kokoro (#4814)
ad85c3b Added Kokoro protoc release build for OS X (#4770)
885be9c Work around MSVC issue with std::atomic initialization (#4777)
b0a8220 Added Kokoro Windows release build config for protoc (#4766)
ce04481 Use legacy name in php runtime (#4741)
d6353b4 Update php version to 3.6.0 (#4736)
ab8edf1 Merge pull request #4713 from acozzette/changelog
6ed0141 Merge pull request #4730 from acozzette/xcode
a3f31bf Update code to work for Xcode 10b1 (#4729)
9b77e9e Removed javanano from post_process_dist.sh
adf84b4 Updated the change log with changes for 3.6.0
7e199b9 Merge pull request #4706 from acozzette/cxx-11
39d2f70 Require C++11 and pass -std=c++11
a239ed2 Merge pull request #4702 from TeBoring/3.6.x
4f5eb10 Move methods out of class (#4697)
397ddf9 Add back GeneratedClassName to public (#4686)
d31864a Merge pull request #4696 from acozzette/csharp-fix
6c12ff5 Merge pull request #4695 from TeBoring/3.6.x
9d64d74 Removed duplicate using statement from ReflectionUtil.cs
5bf35ec Fix php memory leak test (#4692)
edaaea0 Merge pull request #4687 from acozzette/js-map-parsing-fix
d1af029 Fixed JS parsing of unspecified map keys
6f723a6 Always add -std=c++11 for mac (#4684)
4885b80 Merge pull request #4675 from TeBoring/3.6.x
dadc954 Fix array constructor in c extension for compatibility (#4667)
2774e54 PHP namespaces for nested messages and enums (#4536)
8b336f8 Implement array constructor in php c extension.
c9b404d PHP array constructors for protobuf messages (#4530)
7eba624 Add missing ruby/tests/test_ruby_package.proto
c19fcee Allows the json marshaller to be passed json marshal options (#4252)
5289ee0 Adopt ruby_package in ruby generated code. (#4627)
d8483a9 Adopt php_metadata_namespace in php code generator (#4622)
449e532 Merge pull request #4673 from acozzette/memory-leak-fix
daf039b Make sure to delete temporary maps used by FileDescriptorTables
15cde29 Merge pull request #4625 from liujisi/3.6.x
45eb28b Update version number to 3.6.0
b61dd9d Add file option php_metadata_namespace and ruby_package (#4609)
2213c1c Merge pull request #4538 from Mizux/patch-2
7377d81 Throw error if user want to access message properties (#4603)
5f7334f Avoid direct check of class name (#4601)
5f9232b use brew install instead of easy_install in OSX (#4537)
25625b9 Merge pull request #4590 from PetterS/undefined_fix
d14cacd Fix error in Clang UndefinedBehaviorSanitizer
513b35d Add VS2017 optional component dependency details to the C# readme (#4128)
4a09836 Fix python ext build on kokoro (#4527)
92898e9 Merge pull request #4586 from chronoxor/master
3474155 MinGW build failed
b0403a7 Merge pull request #4583 from chronoxor/master
f80a886 Cygwin build failed
05c2d01 Fix RepeatedField#delete_if (#4292)
0869b1a Add space between class name and concat message (#4577)
306f4e3 Merge pull request #4581 from Yeolar/3rd_rpc_raster
7d97808 [objectivec] Fix memory leak of exceptions raised by RaiseException() (#4556)
35e4430 Add third-party RPC implementation: raster - a network framework supports pbrpc by 'service' keyword.
fc922d1 Merge pull request #4568 from hectim/master
7f2c3ce Merge pull request #4550 from Mizux/master
1b219a1 Fix to allow AOT compilers to play nicely with reflection
9ba2fd3 typo
a21f225 Merge pull request #4553 from pherl/ruby
9972e16 Set ext.no_native = true for non mac platform
2bd7f51 fix duplicate mkdir in update_file_lists.sh
c3b152c CMake: Update CXX Standard management
3ad8efc Add .proto files to extract_includes.bat
8417871 Move to Xcode 9.3 which also means a High Sierra image.
b59da6d Remove the iOS Test App.
c36eeed Merge pull request #4520 from BSBandme/fix_kokoro_benchmark_build
4ca46ed Write messages to backing field in generated C# cloning code (#4440)
0dc4d75 Merge pull request #4504 from xfxyjwf/lite
a29e2bf Update Makefile.am for Java lite files.
8f35073 Fix benchmark build
9497a65 Merge pull request #4517 from rcane/feature/vc2017_build_fix
a9d9326 Merge pull request #4510 from BSBandme/fix_kokoro_benchmark_build
7d6d5f9 Fixed a Visual Studio 2017 build error. (#4488)
0921345 fix java benchmark, fix dashboard build
7d55040 Cleanup + documentation for Java Lite runtime.
320d56c Merge pull request #4478 from BSBandme/proto2_to_proto3_tools
e3af023 fix python
76d76ae fix conflicts
c703061 Add gogo benchmark
5fb73f8 Merge pull request #4415 from BSBandme/experiement
805174e Add script for run and upload the benchmark result to bq
d7d863e fix json_decode call parameters (#4381)
13e627a includes the expected class in the exception, otherwise the error is harder to track down (#3371)
451e044 Add __init__.py files to compiler and util subpackages (#4117)
3b6d027 For windows, all python version should use /MT (#4468)
dce8229 Add the files added in #4485.
ce24b8a Update Xcode settings
da3ce67 Deliberately call simple code to avoid Unity linker pruning
a72da27 Merge pull request #4475 from chenchuanyin/patch-1
e7e6c6b Merge pull request #4283 from ObsidianMinor/csharp/better-test-runners
f72ac9f Updated csharp/README.md to reflect testing changes
d3e8a54 Fix problem: cmake build failed in c++11  by clang
c931743 Merge branch (#4466)
579f81e js message support for jstype string on integers (#4332)
40d6eca Merge pull request #4467 from xfxyjwf/error
8f88a50 Improve error message when googletest is missing.
7f92711 Merge pull request #4411 from pravin-dsilva/protobuf-ppc64le
4274e6a Merge pull request #4447 from ejona86/cleaner-protoc-artifacts
c934d1d Merge pull request #4452 from xfxyjwf/doc
aab0f89 Merge pull request #4464 from thomasvl/includes3
bd941d5 Don't generate imports for the WKTs unless generating the WKTs.
e998b8f Add compile test sources for to test include order.
bca797d Trim imports for bundled generated protos.
014e76e Update instructions about getting protobuf source.
cdbfdd8 protoc-artifacts: Use ENTRYPOINT to enable devtoolset-1.1
67c1cd4 protoc-artifacts: Avoid storing temporary files and use fewer layers
5f052ae protoc-artifacts: Avoid checking out protobuf code
7bf47a6 Merge pull request #4433 from xfxyjwf/license
c8ed695 Merge pull request #4445 from xfxyjwf/badge
eac0e92 Add kokoro build status badges.
59c4328 Merge pull request #4442 from xfxyjwf/clean
107cd70 Delete unused directories.
d3d7cdb Merge pull request #4439 from acozzette/remove-atomicops-stub
612b670 Updated .gitignore to exclude downloaded gmock/ directory
4875dfe Removed atomicops.h since it is no longer used
2537bea Merge pull request #3794 from jskeet/reflection
9c05c35 Address review comments
7b19d20 Add extra C# file to Makefile.am
8e23d4e Work around an "old runtime" issue with reflection
aa59eaa Introduce a compatiblity shim to support .NET 3.5 delegate creation
8ba420f Change C# reflection to avoid using expression trees
63bba9b Merge pull request #4432 from xfxyjwf/rmnanokokoro
5050269 Merge pull request #4434 from xfxyjwf/buildstatus
9f5bded Remove broken build status icons.
9e080f7 Cleanup LICENSE file.
68de0cf Delete javanano kokoro build configs.
3c5442a Include googletest as a submodule (#3993)
1156ee7 source code info for interpreted options; fix source code info for extension range options (#4342)
d34e319 Merge pull request #4431 from xfxyjwf/rmnano
379b7ff Fixes MSVC compiler warning C4800 "Forcing value to bool 'true' or 'false'" (#4350)
ac67376 Merge pull request #4395 from stone4774/fixbug_enum2json2
d5a0024 Remove javanano.
416d418 Merge pull request #4424 from egorpugin/patch-1
dc68d98 Fix missing LIBPROTOC_EXPORT.
2c963d3 Merge pull request #4413 from pmuetschard/msvc
eff52b1 Merge pull request #4422 from acozzette/ruby-conformance
cf7af01 Merge pull request #4421 from acozzette/fix-bazel-build
f91cf05 Updated Ruby conformance test failure list
5bed368 Added missing .inc files to BUILD
a7a746f Merge pull request #4346 from BSBandme/performance_result
745ef89 Add performance.md and add instruction for linking tcmalloc
227363b Merge pull request #4412 from acozzette/remove-old-files
a6957f2 Don't assume Windows builds use MSVC.
0c5fcde Removed some unused C++ source files
36ba04b Add support for power ppc64le
c99f527 Merge branch 'master' into fixbug_enum2json2
d053271 Use the first enum value instead of 0 in DefaultValueObjectWriter::FindEnumDefault
ed4321d Merge pull request #4387 from acozzette/down-integrate
e436ee0 Merge pull request #4361 from BSBandme/go_benchmark
88a4884 Merge pull request #4345 from jskeet/list-json-null
11d26ce Removed unused variables in repeated_scalar_container.cc
fcde518 Try using a new version of Visual Studio on AppVeyor
8b3a72f Removed unused code pertaining to shared_ptr
ec40953 Updated conformance failure lists
ec57f51 Added map_lite_test.proto to fix LiteTest
c5fcce5 Added pyext/thread_unsafe_shared_ptr.h
3fa5dad Removed unrecognized option from no_package.proto
00b1c14 Added new test source files to Makefile.am
616fe05 Removed use of some type traits
d6323c8 Change to deal all messages in one loop
d6a17aa Merge pull request #4397 from pherl/catlog
4880027 Cat the test-suite.log on errors for presubits
773d8c3 Fix bug: whether always_print_enums_as_ints is true or false, it always print the default value of enums as strings
ab95b1b Merge pull request #4371 from Rasrack/gnuc_minor
aae10ed Merge pull request #4370 from felixjendrusch/objc-output-stream-write-check
813848d Merge pull request #4222 from JohnHBrock/increasing_max_csharp_message_size
d5f5725 Merge pull request #4310 from KindDragon/patch-1
837c94b Include no_package.proto in Python test
67952fa Deleted scoped_ptr.h
b1216d9 Updated checked-in generated code
64a5c80 Fixed up proto3_lite_unittest.cc
501c13f Rewrite go_benchmark
afe96b6 Merge branch 'master' into down-integrate
0400cca Integrated internal changes from Google
89b5333 Merge pull request #4378 from acozzette/node-buffer
4f11025 Merge pull request #4167 from mike9005/patch-1
6d2c6a0 some fix
5487d8c Merge pull request #4380 from mateuszmatejczyk/patch-1
4787519 Merge pull request #1333 from cgull/pkg-config-issue
294b575 Output *_pb2_grpc.py when use_grpc_plugin=True
0e34c86 Fix spelling error of __GNUC_MINOR__
f8005a5 Revert "Removed mention of Buffer in byteSourceToUint8Array"
8e44a86 Merge pull request #4347 from xfxyjwf/pluginpb
6ebfa14 Merge pull request #4375 from jo2y/protoc-default
950f5e4 Replace //:protoc and similar default macro arguments with @com_google_protobuf prefixed versions. This allows them to work in 3rd party repositories.
6dd563a Sync upb change (#4373)
1da9ffe Check return value on write of raw pointer
38508e9 Add test for failing write of raw pointer to output stream
4e3c413 Add go benchmark
a48d58d Convert descriptortype to type for upb_msgval_sizeof (#4357)
0f4ad85 For encoding upb needs descriptor type instead of type. (#4354)
55d0758 Merge pull request #4355 from acozzette/typo
5004d09 PHP: fixed typo in message.c
fd595fc Revert "Move `compiler/plugin.pb.cc` to libprotobuf with the other WKT sources."
5140bae Add conformance test for null value in list JSON
822b924 Allow list values to be null when parsing
9dc0a4d Merge pull request #4183 from pcc/win-libcxx
325ecff Merge pull request #4333 from jmillikin/update-file-lists-needs-bash
32db4d3 Merge pull request #4334 from jmillikin/blacklist-internal-proto-srcs
3aaed96 Merge pull request #4195 from alexey-malov/IgnoreUnknownEnumsInJson
bb40c0c Merge pull request #4291 from google/3.5.x
350b135 Blacklist all WELL_KNOWN_PROTOS from Bazel C++ code generation.
724f0be Move `compiler/plugin.pb.cc` to libprotobuf with the other WKT sources.
2e4c52a `update_file_lists.sh` depends on Bash features, thus needs Bash sebang.
a6037c5 Merge pull request #4324 from abdul-sami/master
ac021a0 Merge pull request #1 from abdul-sami/abdul-sami-patch-1
fe33c5f Added instruction for existing ZLIB configuration
177108a Merge pull request #4323 from dtapuska/master
af3813c Rename a shadowed variable.
0475607 Merge pull request #3186 from gkelly/remove-unused-variable
22c477d Support using MSVC intrinsics in Log2FloorNonZero
02452db The JsonParseOptions::ignore_unknown_fields option behavior treats unrecognized string values in enum fields as default ones.
e34ec60 Only check filenames when end with .py in _CalledFromGeneratedFile() (#4262)
96b535c Merge pull request #4302 from BSBandme/down_integ_benchmark
6cd4ec4 Sync internal benchmark changes
4da7706 Remove stray indent on normal imports.
b8e4783 Merge pull request #4288 from nico/nofall
07f0231 Fix up the docs to mention the WKTs generated files also.
c66dd6c Remove use of GOOGLE_FALLTHROUGH_INTENDED from protobuf.
8b2ba9e Remove Google.Protobuf.Test/Program.cs from Makefile.am
a731ecb Adjusted appveyor batch
e823897 Updated NUnit packages, removed NUnitLite added packages for dotnet and Visual Studio, changed dotnet command in buildall to dotnet test, and deleted Program.cs (because it's no longer required).
82e0231 Merge pull request #4259 from Mizux/master
5dad7cc Merge pull request #4257 from davido/support_java9
9717d6f Merge pull request #4265 from BSBandme/upgrade_benchmark_submodule
1ec9beb Use NEW behaviour for project VERSION variables.
8dd0f4e Even with MSVC enable zlib support as default behaviour.
f7a0584 Add CMake ALIAS targets
3bc0282 Add VERSION property to CMake library targets
7f14915 upgrade submodule
4e2bd9e Merge pull request #4266 from brunokim/patch-1
0d397a1 Fix link markup in third party list.
6456e5d Merge pull request #4239 from mrpi/master
85b488f Bazel: Support building with Java 9
864df89 Remove 64MB memory limit when deserializing messages in C#
cf016a4 Work around strange error with atomic and swift under Xcode 8.3.3.
d570d48 Don't assume c-strings are 4 byte aligned.
d83837d Fix to use "nil" instead of "NULL" for objc objects.
81aeed0 Work around the static analyzer false report.
953adb1 Add casts to removed undefined behaviors around shifts.
b718551 Merge pull request #4249 from nlochschmidt/patch-1
204a641 Move kokoro macOS builds to to Xcode 9.1.
14e8852 Fix -fpermissive: '<::' cannot begin a template-argument list
69b1fdc Propose kotlinx.serialization as 3rd party lib
25a90e8 Merge pull request #3825 from ras0219-msft/patch-1
aaf41c6 Add Vcpkg to C++ installation instructions for Windows
1681fe6 Merge pull request #4196 from mathstuf/cmake-private-target-sources
f438ebd Merge pull request #4240 from davido/generate_warning_free_java_code
da6b07a Merge pull request #4209 from acozzette/using-statements
86fdad0 Java: Generate warning free code
39a789e Removed using statements from common.h
91317c2 Merge pull request #4236 from pherl/3.5.x
2a8e102 Bumping number to fix ruby 2.1 on mac
c236896 Merge pull request #4229 from leighmcculloch/patch-1
4a3b42e Remove broken link to code.google.com/p/protorpc
ed14fe4 Merge pull request #3934 from xfxyjwf/builtsources
0c52335 Update .NET SDK to 2.0.3
51293f3 Fix more memory leak for php c extension (#4211)
94f3be0 Merge pull request #4226 from themattchan/patch-1
3e1587f Add an explicit import of stdatomic.h.
6fd2ae7 Bring back import of OSAtomic.
72337d6 Add Haskell implementations
1d02e45 Merge pull request #4224 from davido/drop_java_6_support
019ceea Drop java 6 support
c337d9f Remove the use of BUILT_SOURCES
9ab859f Create std::string in Arena memory
80e016e Merge pull request #4205 from xuwei-k/patch-2
a721bf6 Migrate away from deprecated OSAtomic APIs. (#4184)
1c3b20b fix typo in FieldMaskTree.java comment
9d0a44c cmake: privately add sources to targets
cbdeb6a Merge pull request #4185 from pherl/ruby2.5
53d907f Update rake file to build of 2.1.6.
3ba21cd Add support for libc++ on Windows.
979c2cd Merge pull request #4182 from pherl/ruby2.5
d9f0f0b Support ruby2.5
47b7d2c Add DiscardUnknownFields support for C#
2a6eaeb Fix scope resolution for MessageExts in Ruby
9f80df0 Merge pull request #4158 from BSBandme/FixBenchmarks
473a810 Update py_benchmark.py
fa60e55 Fix java benchmark to use parser, fix cpp benchmark new arena to use Reset, format some files
b77aa80 Merge pull request #4148 from datacompboy/patch-2
d4afdba Merge pull request #4147 from datacompboy/patch-1
bab843b Merge pull request #4132 from BSBandme/JavaCaliperCounter
195253c Add counter to Java benchmark
4adc5a4 Merge pull request #4065 from BSBandme/python_benchmark_real
091eeb1 Update time_test.cc
473c5cf Fix ValidateDateTime: check day instead month
3823897 Well known types are not initialized properly. (#4139)
2fc69b1 Add python benchmark
5aa8f98 Merge pull request #4146 from pherl/fix_protoc
366192f Bump protoc-artifact version for a patch rebuild
a3868af Merge pull request #4131 from pherl/merge
eca1d2a Merge pull request #4116 from amandeepgautam/master
0c0d481 whitelisting aix platform as it has sched_yield
4588e6e Force a copy when saving the NSData that came from another.
43caa38 Merge pull request #4014 from BSBandme/JavaCaliper
ec826c5 Merge remote-tracking branch 'origin/3.5.x' into master
383a494 Merge remote-tracking branch 'origin/3.5.x' into master
39f577c Merge pull request #4124 from pherl/nullptr
5b1caea Merge pull request #4090 from pherl/nopassword
156161d Properly copy maps with string keys but pod values.
aca6c15 Fix some bug
4f3d865 remove nullptr
a147a21 Changed README
8529f2a Resolved issue #3510. Malformed errorr messages replaced with meaningful description
8fc40b5 Fix uploading binary wheel.
88e5573 Merge pull request #4089 from pherl/nocache
7ad8e7a Disable pip cache when testing uploaded packages
099d997 Merge pull request #4083 from matt-kwong/kokoro_jobs
0b2be3c Shard 64-bit Linux languages into different Kokoro jobs
4b2977b Merge pull request #4082 from matt-kwong/kokoro_jobs
ae49cfd Collect xml results for Kokoro
106ffc0 Merge pull request #4073 from pherl/changelog
d69f333 Merge pull request #4080 from pherl/arm64
6003a61 Make Kokoro job pull Dockerimage from Dockerhub
ad8a82e Add support for Windows ARM64 build
b5f09c1 Merge pull request #4077 from mkamilov/master
a5b743f Merge pull request #4030 from cyyber/master
7bf1e19 Update changelog
1e418e4 Merge pull request #4068 from wsw2016/fix_4032
ac1fdd1 line breaks adjsted
e68caa3 formatting issues
d106399 Merge pull request #4072 from google/jieluo
6c3c7f6 Merge pull request #4076 from pherl/stringback
b308580 Cherrypick for csharp, including: Add preserve UnknownFields Compare floating point values bitwise Add auto-generated header to C# generated files
19d0e99 Fix string::back() usage in googletest.cc
62616e1 Update changelog
96810de Merge branch '3.5.x' of github.com:google/protobuf into changelog
eff55ec Merge pull request #4074 from pherl/mapat
8ac050f Migrate Jenkins jobs to Kokoro
9ce29bd Merge pull request #4070 from pherl/3.5.x
501093d Replace C++11 only method std::map::at
7bd1606 Update changelog for 3.5.1
050fc9a Update version number to 3.5.1
ffa18ad resolve issue 4032 and added a unit test
03fb099 Add support for Windows ARM64 build
860d693 Add Xcode 9.2 to the testing support
3a06fe1 Fix file permission for python package.
77d32bc Merge pull request #4053 from xfxyjwf/fixumask
c79ba5c Merge pull request #4034 from TeBoring/php-timestamp-bug
269884a Merge pull request #4040 from bazurbat/3.5.x
0fc85ac Fix file permission for python package.
4b02091 add cpp
396336e Merge pull request #4046 from acozzette/deprecated-valueof-issue-2054
8d6f13e Fix for php5.5
1237c3f Merge pull request #4045 from pherl/deprecate
d971cbf Merge pull request #4049 from pherl/py26
39159c8 Accept DatetimeInterface in fromDatetime
0e2089c Calling Keychecker before checking key in MessageMap
acadade Remove py2.6 support.
594ec22 Fix python descriptor test.
cd32aae Merge branch 'master' of https://github.com/google/protobuf into JavaCaliper
75523ec fix bugs
1a549d9 Avoid using php_date_get_date_ce() in case date extension is not available.
0350111 Generate an annotation to suppress deprecation warnings
426cf6f Add auto-generated header to C# generated files (#4038)
34843ed Fix bugs
a4f68d4 Merge pull request #4044 from xfxyjwf/issue3268
00ac5c1 Merge pull request #4041 from acozzette/fix-license-issue-1775
22e1cfd Add deprecation annotation for oneof case.
b3ac441 Update generated code.
bfd254e  Add unknown field support for csharp (#3936)
50ef6a6 Avoid two consecutive underscores in macro name.
82724e2 Merge pull request #4042 from pherl/cpp_enum
8521624 Merge pull request #4043 from pherl/flush
0a7120a Merge pull request #4037 from xfxyjwf/issue2880
6b01e64 Explicitly propagate the status of Flush().
7ef21dd Use matching enum type for IsPOD.
ecab9c6 Added our standard license header to structurally_valid.cc and its test
edcf15e Create containing directory before generating well_known_types_embed.cc
5ce724b Merge pull request #4036 from xfxyjwf/issue3093
fffe8d3 Call php method via function name instead of calling directly.
0f9bfa8 Merge pull request #4016 from jquesnelle/string-access-ub
27e877f Merge pull request #2834 from aj-michael/master
6c27550 Clarify default value behavior in JSON conversion.
75eceb8 Update generated code.
8489612 Update comments for Timestamp JSON format.
f69a5db Merge pull request #4028 from TeBoring/3.5.x
88102ea Replace private timelib_update_ts with public date_timestamp_get
9f6acea Add PROTOBUF_ENABLE_TIMESTAMP to let user decide whether timestamp util can be used at install time.
5e732e3 Add caliper supported to java benchmark
b1386e7 Merge pull request #4026 from TeBoring/3.5.x
3b13c3f Add backslach to make class explict in global namespace
fc5818b Merge branch '3.5.0.1' into 3.5.x
31c54d1 Regenerated code from previous C# codegen commit
3e5bd2f C# code generation changes to use bitwise comparisons for doubles
f3e9a65 Compare floating point values bitwise in C#
618f06f Merge pull request #4007 from graywolf/patch-1
a426833 Merge pull request #4000 from Kwizatz/master
cf7c15e Fix ruby gc_test in ruby 2.4 (#4011)
9b09a2a Merge pull request #4017 from acozzette/update-file-lists
0fcca8f Merge pull request #4018 from acozzette/android-portable-log2-floor
f5b0862 use const char* instead of const std::string& in normalize()
63a0afc Use the portable version of Log2Floor for Clang with older Android NDK versions
0e7b589 Add discard unknown API in ruby. (#3990)
609d752 Ran update_file_lists.sh to update Bazel and CMake file lists
b32c2a8 fix undefined behavior in C++03
24493ee Using binary one's complement to negate an unsigned int
c370f88 Recursively clear unknown fields in submessages. (#3982)
1b5b3b2 Merge pull request #4013 from laszlocsomor/io_win32
a3a1c93 io_win32_unittest: remove incorrect error check
eb3bd6e io_win32_unittest: fix condition in GetCwdAsUtf8
3f1b1a6 io_win32_unittest: use CWD as last tempdir
57a01c7 io_win32: add more encoding-related tests
65da9fd io_win32: support non-ASCII paths
953a025 io_win32_unittest: make //:win32_test run again
457f6a6 Add release log
ba60b85 Update php c extension version number to 3.5.0.1
212563d Fix memory leak in php7
3b7a5f4 Fix several more memory leak
7d34371 Fix memory leak when creating map field via array.
e0d3aa0 Fix memory leak when creating repeated field via array.
de44982 Remove duplicate typedef. (#3975)
0316ae8 --pre is not necessary
9021f62 Merge pull request #3988 from acozzette/down-integrate
173f304 Merge pull request #3926 from BSBandme/down_sync_benchmark
e372df5 Fixed failing JS tests
db7c043 Merge pull request #3968 from fahhem/patch-2
35119e3 Add a check_protobuf_required_bazel_version() for use in WORKSPACEs
1fd6c17 Fix bugs to pass tests
7bb8584 Updated conformance failure lists
b140cb3 Fix memory leak when creating map field via array.
716acc3 Remove Xcode directives on some configs.
1acacf4 Fix memory leak when creating repeated field via array.
1c062a6 Sync internal benchmark changes
5d647e1 Updated Makefile.am to add a new file to EXTRA_DIST
0ba8eea Merge branch 'master' into down-integrate
92a7e77 Integrated internal changes from Google
a711e3d Merge pull request #3979 from acozzette/3.5.x-merge
a27da09 Merge branch '3.5.x' into 3.5.x-merge
94bb1ee Remove duplicate typedef. (#3975)
74e7dec Provide discardUnknonwnFields API in php (#3976)
6de51ca Merge pull request #3824 from anuraaga/dev_rag
da89eb2 Merge pull request #3955 from linux-on-ibm-z/master
6d60995 Update csharp version number (#3958)
0289dd8 Merge pull request #2519 from rubynerd-forks/ruby-fix-repeated-message-type-field
74f64b6 Fix JsonTokenizer exception message
3e944ae Add a UTF-8 decoder that uses Unsafe to directly decode a byte buffer.
3c6fd3f Merge pull request #3960 from acozzette/libprotoc-export-fix
1b1d1ea Added back in LIBPROTOC_EXPORT which was removed by mistake
34e30e5 Merge pull request #3962 from jleni/fix_dotnet
582d6ac Upgrading dotnet to 1.0.4
f2127b6 Merge pull request #3416 from xiaoshuang-lu/PROTOBUF-3404
642e1ac Adding Release_CompareAndSwap 64-bit variant
8ff2284 [PROTOBUF-3404] add --with-zlib=PATH to configure.ac script
cf65a79 Update version for 3.5.0.post1
f466709 Merge pull request #3941 from google/anandolee-patch-2
45d99a1 Add _file_desc_by_toplevel_extension back
f08e4dd Merge pull request #3919 from jart/less-warnings
b819abf Merge pull request #3918 from OEP/fix-sdist
ac5371d Remove unhelpful build warnings
9935829 Include .cc and .h files in source distribution
baed06e Small code reorder to maybe make #3893 happy.
6700f41 Travis config cleanups and move ObjC to Xcode 9.1.
2b3aa1c Add Setter/Getter type verification. (#3880)
8537f1e Fix up warnings from Xcode 9.1 (#3887)
98836a5 Update version number for php c extension (#3896)
e99e5d0 Merge pull request #3895 from pherl/3.5.x
1ec45f8 Add protobuf-all in post release
857a021 Use fully qualifed name for DescriptorPool in Any.php to avoid name (#3886)
0d46688 Update README.md: C extension works on PHP 7 (#3888)
696653d Merge pull request #3892 from sergiocampama/32bit
7daa320 Merge pull request #3878 from Yangqing/master
02129f0 Fixes 32bit tests.
cf68531 Merge pull request #3891 from thomasvl/travis_cleanups
7417755 Merge pull request #3883 from dmaclach/map_optimizations
8ae6844 codereview cleanup
6552c5a Merge pull request #3884 from dmaclach/unsafe
4ba3092 code review cleanup
af5ad24 Merge pull request #3882 from dmaclach/removeclass2
a839c67 Remove the allowed_failure for python_cpp as the bug was fixed.
2e17639 Remove the ruby tests from travis configs.
c46571b Update some comments about testing.
73e8c8a Instead of listing and then excluding osx builds, just don't list them.
949596e Simplify getter/setter method implementations
9d7f313 Reduce size of GPBDictionary by getting rid of class creation methods
37a6672 Remove unreferenced 'GPBMessageSignatureProtocol' class.
91ff83c Remove non-C# options from C#-only test protos
cba18ef Allow one to omit building libprotoc and protoc binaries
d3537c2 Merge pull request #3834 from sviterok/patch-1
0cd2ad1 Update protoc-artfacts
2720cdc Update README.md
4041600 Merge branch '3.5.x' of github.com:google/protobuf into 3.5.x
4493595 Update release date
2761122 Merge pull request #3868 from pherl/3.5.x
b9f891e Merge pull request #3875 from hchasestevens/add-hypothesis-protobuf-doc
188f180 All integer types should accept null in json. (#3869)
3c33143 Add hypothesis-protobuf library to the 3rd party doc.
8cf53f8 MMinor fix-ups to C# tests from changes in earlier commits
b5cdf0e Regenerated test code for C#
aa77eab Move C#-only test protos to csharp/protos
9a9a66e Run C# codegen when testing it
9c197b7 Support win32 long path for cross compiled build
fe2b4af Merge pull request #3867 from jtattermusch/update_changelog
07df230 update changelog
966a9ed Merge pull request #3861 from jtattermusch/backport_3858
5f96191 ParseFrom<T> for array slice is missing
4a5e1bd check already performed by MergeFrom
435f611 allow message parsing from an array slice
ce0a532 Merge pull request #3858 from jtattermusch/parsing_from_slice
5eb717c Fix arm64 name
b879abc Supports Arm64 (aarch64) protoc artifacts
30b6e54 ParseFrom<T> for array slice is missing
07542e7 check already performed by MergeFrom
0c874a6 allow message parsing from an array slice
0971efb Merge pull request #3854 from pherl/3.5.x
662e8b2 Provide util funtions to figure out correct php class names. (#3850)
181e284 Fix Atomic32/AtomicWord on some platforms.
1144768 Merge pull request #3835 from pherl/3.5.x
8a3c5cc Fix java code example
ce2d528 Changelog for 3.5.0
c258fb3 Merge pull request #3822 from mehrdada/update-benchmark-submodule
2df4726 Fix php well known type conformance tests (#3828) (#3840)
bcda919 Fix php well known type conformance tests (#3828)
239dba5 Merge pull request #3839 from thomasvl/message_equality
1f57e54 When comparing message, require them to have the same descriptor.
1908012 Update generated descritpors.
97dd175 Update version number to 3.5.0
da3bfa6 Fix a typo in WKT's test suite
cbe2505 Fix merging with message-valued oneof
bb35f04 Update google/benchmark submodule to v1.2
6dd8224 Merge pull request #3817 from xuwei-k/joda-url
05b56d0 update joda-time javadoc url
e8c9ae1 Add parser settings WithXyz methods
a985451 Add JsonParser setting to ignore unknown field values
4526d8b Merge pull request #3722 from timou/cmake-windows-clean
23adfeb Reserve unknown in Ruby (#3763)
a08b03d Add missing files
9aaa8e1 Merge pull request #3804 from pherl/merge
2fc7aea Merge pull request #3791 from signalwerk/patch-1
cdc0d95 Merge remote-tracking branch 'origin/3.4.x' into master
ee8a091 Merge pull request #3787 from sergiocampama/coverage
b1f954e Improves coverage of GPBCodedInputStream
44daa59 To be clear that we set a new variable
a23669c Sort MSVC warning suppressions
cefa9d7 Merge pull request #3758 from spinorx/3.4.x
b189389 Merge pull request #3757 from spinorx/master
09e0dbc Merge pull request #3743 from Schtolc/master
2a14214 Merge pull request #3754 from toanju/gcc-fallthrough
07b9238 Merge pull request #3770 from pherl/3.5-integrate
2ee294d Fix Java 1.6 compile
9c407a1 Merge pull request #3751 from uykusuz/master
ca6187d Merge pull request #3578 from pherl/filedeprecation
dedf904 Merge pull request #3764 from zearen/patch-1
37f984f Merge pull request #3698 from hesmar/hesmar/fixProtocIncludeDirs
3d6cc0e Merge pull request #3641 from drivehappy/3.4.x_clang_cleanup_3
2e2614e Merge pull request #3706 from johanbrandhorst/patch-1
188755c Fix JS conformance tests
1c682e0 Fix bazel build
ecf2957 Update descriptor protos
30bfe36 Merge pull request #3736 from jleni/fix_rbpi
6b5912b Merge branch 'master' of github.com:google/protobuf
1a7a7fc Merge from google internal
dc9190f Merge pull request #3769 from pherl/io_win32
cc58be6 Fix unsiged underflow
7dbee32 Remove C++11 only usages in io_win32 tests.
c4f59dc Merge pull request #3760 from jmillikin-stripe/descriptor-memset-ub
aff1097 Fix undefined memory management found by Clang's sanitizers.
3130ce0 Fix iOS cc_library build for protobuf.
16792c6 Fix iOS cc_library build for protobuf.
37e112f fix implicit fallthrough in gcc 7
be13314 fixes issue #3750
f850188 Merge pull request #3744 from fmarier/json-escaping-namespace
5992e24 Move namespace closing brace inside the header guard block
a632f0d Merge pull request #3739 from pherl/merge3.4
1e58006 test for field reassignment
38fd94e CodedInputStream::SetTotalBytesLimit description fix
dd980cc Fix distcheck
de15e73 Merge remote-tracking branch 'origin/3.4.x' into master
08334f0 Converting to immutable hashable types
c4083bb Merge pull request #3735 from sgreenstein/patch-1
68ee916 Don't pass -lpthread and -lm on Windows
6032746 Reserve unknown fields in php (#3659)
d2a5f8b Update third_party.md
2a72840 Suppress VS2017 compiler/linker warnings
77f64bb Add well known types to php runtime. (#3697)
cd5f49d Fix ruby segment fault (#3708)
d6c32a8 Merge pull request #3714 from thomasvl/objc_increase_test_coverage
a274c67 Build out more complete code coverage in the tests.
9477123 Let Xcode 9 update project/scheme settings.
4207066 Merge pull request #3710 from thomasvl/xcode9
c4dce01 Merge pull request #3709 from thomasvl/unknown_field_merge_issue
b586e64 Add Xcode 9 support to the helper script.
3f2dcae ObjC: Fix merging of length delimited unknown fields.
210be26 Use constexpr more with VC++ 2017 (#3707)
fc7a6a2 Add GopherJS protobuf and gRPC links
bd798df Merge pull request #3690 from pherl/3.4.x
a38f876 Merge pull request #3691 from pherl/stringback
f7e2099 protobuf_generate: create include path only for proto files
d2738c0 Add spaces
5a501c6 Fix C++11 string accessors
6d0cf1b Remove ranged based for in io_win32.cc
fc5aa5d Merge pull request #3676 from hesmar/hesmar/fixProtobufGeneratePython
0e069e5 generate python code when calling PROTOBUF_GENERATE_PYTHON
ae55fd2 Enforce all error report for php tests. (#3670)
c204402 Merge pull request #3675 from hesmar/hesmar/cmakeAddDllExport
9829b8f protobuf_generate: add EXPORT_MACRO option
c627530 Merge pull request #3674 from pherl/shutdown
4fc7529 Merge pull request #3627 from zanker/zanker/add-submsg-hash-init
b091bfb Test Shutdown can be called multiple times.
633ef8b Update message.c
2b0ee3f Add $ before url_prefix_len to make it a variable. (#3668)
eade82c Merge pull request #3639 from zanker/zanker/fix-embedded-to_h
8eae3fe Update message.c
8771483 Allow initializing a chain of protos using only a hash
83264bd Fixed to_h with repeated messages to return hashes in Ruby
cf1b29d Merge pull request #2377 from mcos/chore/conformance-null-tests
fa5a69e Merge pull request #3624 from acozzette/down-integrate
655cc83 Merge pull request #3651 from pherl/3.4.x
2eb1bac Bumping minor version for ruby gems
5dd818c Merge pull request #3612 from TeBoring/php-bug
b04e5cb Merge pull request #3642 from pherl/3.4.x
dba647a Bump version for minor release
e3be1fe Clang warning cleanup for unused parameter.
13fd045 Integrated internal changes from Google
d1bc27c Merge pull request #3626 from xfxyjwf/fixgo
8136ccb Fix go example test.
c0d88ae Merge pull request #3635 from drivehappy/clang_cleanup
7f3ded6 Clang warning cleanup for unused parameter.
471b45e Merge pull request #3158 from yeswalrus/fix-policy-warning
3d78561 Merge pull request #3634 from TeBoring/ruby-bug
a459b22 Storing the frame on the map means we don't need the array
c1dd8e8 Move parse frame array to the Map object
8741da3 Revert "Fix js conformance tests. (#3604)" (#3633)
a425dd9 Rename ClassNamePrefix to ConstantNamePrefix
2bd55a9 Fix js conformance tests. (#3604)
f46a01d Exclude valid constant name from reserved name.
06aa8dc Merge pull request #3621 from jtattermusch/upport_3596
ed0a07e Merge pull request #3618 from hesmar/fix_protobuf_generate
5de0565 Google.Protobuf should target net45
444aecd fix protobuf_generate function
b1befb0 Merge pull request #3613 from xfxyjwf/bazel_examples
6945203 Exclude addressbook.proto from C# boostrap test.
ddb9ef9 Change array to map for reserved names in c extension
49b31dc Update C# generated file for addressbook.proto
49b88af Update examples file list.
89069de Change array to associate array.
174c82d Add well-known timestamps to JSON for PHP (#3564)
74bf45f Add bazel support for examples.
e5d000c Add prefix to php reserved keywords.
2ad5c0a Merge pull request #2576 from cristicbz/py-strutil
6a4ffb2 Merge pull request #3596 from jtattermusch/csharp_target_net45
054054c Merge pull request #3590 from NanXiao/patch-1
7f8b91f Add native php support for Duration. (#3583)
35b852f Merge pull request #3594 from buchgr/well-known-protos
699c0eb bazel: Add proto_library rules for well known types. Fixes #2763
50a6475 Google.Protobuf should target net45
f4ff17b Update autogen.sh
6699f2c Merge pull request #3560 from tenderlove/thread-safe-map
f9b8169 Add TODO
dd69d5c Fix dist check
baae7ea Add @Deprecated annotation support for proto file.
b70e0fd Add php support for Timestamp. (#3575)
2807436 change the field number of php_generic_service to fix the conflict with (#3576)
f55c6ec Storing the frame on the map means we don't need the array
d6152dd Move parse frame array to the Map object
c7457ef Add any support in php runtime. (#3486)
21b2372 Merge pull request #3565 from pherl/fixdist
d8c6193 Add mising cmake files in dist
98a3734 Merge pull request #3503 from gburgessiv/master
859d94a Merge pull request #3544 from anandolee/master
92ea0d2 Merge pull request #3556 from matt-kwong/kokoro_mac_v3
78432ea Remove pre-installed softwares
07de70e Merge pull request #3555 from pherl/fixdist
364060b Merge pull request #3547 from matt-kwong/kokoro_mac_build
55fdbe5 Make distcheck aware of test proto files.
e46caba Remove pre-installed softwares
c44c3af Merge pull request #3548 from google/3.4.x
30681c7 Merge pull request #3546 from pherl/deathtest
610e433 Drop python2.6
028d6f1 Add Python 3.5 3.6
6609e52 Disable death tests on windows
e416f5d Merge pull request #3537 from TeBoring/php-bug
7273b3c Merge pull request #3539 from drivehappy/3.4.x_clang_cleanup_1
09fd125 Merge pull request #3540 from drivehappy/3.4.x_clang_cleanup_2
7a43137 Merge pull request #3543 from tony612/patch-1
6cecd20 Work around a bug in clang's static analyzer
2fb7479 Add Elixir protobuf and gRPC to 3rd party doc
c27b56c Merge pull request #3494 from drivehappy/clang_warning_macro
36ac06f Merge pull request #3535 from drivehappy/clang_warn_cleanup
0b7e978 Merge pull request #3535 from drivehappy/clang_warn_cleanup
92d768c Merge pull request #3536 from pherl/io32_11
77a453a Fix compile errors
dd51909 Use message name as defined in php runtime.
4aadcd3 Remove C++11 features in io_win32.cc
ba4e547 Merge pull request #3529 from pherl/merge3.4.x
472f700 remove the parens from the cmp() lambda definition (#3526)
1183f48 Fixing unused parameter warnings under Clang.
139775c Merge remote-tracking branch 'origin/3.4.x' into mergemaster
26ac3e8 Merge pull request #3528 from pherl/rubyfix
fdb5cd5 Merge pull request #3504 from pherl/3.4.x
d76e4c7 Bump gemspec again
1825d6d Merge pull request #3317 from ejona86/protoc-artifacts-jdk8
c2aa26e Revert "Drop Python 3.3 from testing & add Python 3.5, 3.6 (#3512)" (#3524)
703f414 Drop Python 3.3 from testing & add Python 3.5, 3.6 (#3512)
a04eb8c Define cmp() for Python 3 (#3517)
1aa2c34 Merge pull request #3516 from cclauss/patch-3
dded80f define long() for Python 3
6f4c9b0 print() function for Python 3
a1acf25 print() function and lose the semicolons (;)
067543c from __future__ import print_function
7daedbd print() function & define raw_input() for Python 3
45483fd file() was removed in Python 3, use open() instead
5ab8ae7 Merge pull request #3511 from cclauss/patch-3
fa46d11 Merge pull request #3514 from pherl/rubyfix
29c24ab Merge pull request #3502 from pherl/pypi
1926636 Bump gem version for the next upload
958412e Old style exception --> new style exception
d1484cd Update CHANGES.txt
55d938c Update CHANGES.txt
98c6d04 Prefer system distributed binaries/libraries.
e243082 Update php version number to 3.4.0
82dd4b3 Update php c extension version number.
5d5df84 clean up
19a7e20 Update testpypi addresses.
80a37e0 Merge pull request #3495 from pherl/c++11
5e39ecc Merge pull request #3494 from drivehappy/clang_warning_macro
3d2f72b Merge pull request #3496 from pherl/mingw64
6654c8d Update readme
f619621 Merge pull request #3493 from pherl/cmath
d909834 static link for 32 bit build as well.
f7b3dd4 Update comments that cross compile is feasible now
fa086c8 First try static linking pthread
4a4c67b Add std::forward and std::move autoconf check
a23e198 Fixing warning under Clang 6.x (-Wexpansion-to-defined) where the macro expansion producing 'defined' was warning on undefined behavior.
3908b4e Fix cmath/math.h include with non C++11 libstdc++
1cc4ecd Merge pull request #3488 from pherl/changelog
3ae8c4c Update changelog for 3.4.x
eaeca0d Merge pull request #3485 from pherl/mingw
1bd2d1f Merge pull request #3484 from pherl/qualifier
651429b Fix comments
31b3bd9 Make compilers without ref-qualifier support happy.
b4c0cfe Add malloc cast
fd31899 implement remove strdup usage and implement our own
34ebca0 Adding missing imports for strdup
40d1855 Fix mkdir
564f02c Make win32_io only for MSVC
7afa796 Fix the declaration order in ming32
db125b8 Fixing io_win32 for MinGW32
e0d24cc Detect invalid tags with a field number of 0 in C#
d2f3adb Merge pull request #3481 from pherl/nowarning
ccb6b62 Merge pull request #3480 from bklarson/master
1b42347 Clean up typedefs for Atomic32/Atomic64
e8fc066 Make no warning test stricter.
9adb4e8 Merge pull request #3478 from pherl/warning
97d50e3 Make code free of missing-field-initializers warnings
35db267 Merge pull request #3473 from AlanBurlison/master
80e984e Merge pull request #3467 from thomasvl/bump_xcode_version
a68a800 PROTBUF-3394 Potential SIGBUS with UnsafeUtil.getLong
3afcded Merge pull request #3461 from TeBoring/3.4.x
176713d Merge pull request #3468 from vladmos/3.4.x
fae3816 Merge pull request #3454 from anandolee/master
06a825c Make .bzl files compatible with future versions of Bazel
d08c291 Merge pull request #3465 from vladmos/list_plus_equals
fe68821 Move travis to the Xcode 8.3 (8.3.3) image.
ba81c59 Fix up Xcode 8.3.x support.
4fc9304 Make .bzl files compatible with future versions of Bazel
8f4b8e4 Merge branch 'master' into 3.4.x
f14703c Update commit id in Dockerfile to reflect change in #3391 (#3459)
49b44bf Fix the bug in php c extension that setting one field can change anotherĀ field's value. (#3455)
21b0e55 Update PHP descriptors (#3391)
f5817b3 PY26 tests compatibility 1, Some tests in reflection_test PY26 raise TypeError but other versions raise ValueError for convert negative long to unsigned 2, Change compare exception type to compare exception str for testDuplicateExtensionNumber. Original code raise 'Double registration of Extensions' is not an instance of (<type 'exceptions.AssertionError'>, <type 'exceptions.ValueError'>) for PY26 cpp implementation
1ab5adb Merge pull request #3456 from giorgioazzinnaro/patch-1
a3e1752 Update third party addons with ProfaneDB
9150cd8 Skip setUpClass which is newly added in python2.7 for python2.6
d58df3b Add python 2.6 test back for cpp implementation. Json format issue was fixed in #869
c2f69d6 Merge pull request #3450 from pherl/invalidoffset
e243fd8 Merge pull request #3451 from pherl/fixtypo
39a91d3 Fix typo.
4cbbf33 Fix invalid offsetof warning.
25672c1 Add getClass for php Descriptor in c extension (#3443)
7781784 Add destructors for default instances to the shutdown code. Verified test succeed under draconian heap checker
53ae6de Merge pull request #3442 from pherl/csharpversion
6c64f11 Bump csharp version
e0288e7 Merge pull request #3438 from pherl/changelog
9df89cc Fixing HHVM Compatibility (#3437)
c15a326 Expose descriptor API in php c extension (#3422)
8a5208f Update change log
502624f Merge pull request #3419 from pherl/3.4.x
d77c8c5 remove the duplication
bcf1733 Adding the missing header
ebeb472 Export functions in io_win32.h in win DLL build
be73938 Change divideInt64ToInt32 to static (#3436)
d32f5b4 Removes unnecessary pass-by-references in PHP internal classes (#3433)
0724314 Merge pull request #3429 from king6cong/master
d6bd959 Merge pull request #3406 from ax3l/bg-3.4-cmake-pkgconfig
547d76e Add classpath for java example Makefile
9b505a9 Merge pull request #3421 from thomasvl/update_comment
9a4692d Update the comment on the message_type to cover what it should be.
5eb95ef Merge pull request #3420 from thomasvl/objc_proto2_conformance
3caf9fd Review feedback.
c2831a3 Add the proto2 message conformance support for ObjC.
9fd5e59 Generate the proto2 test file and link it in for ObjC.
21800ff Add a objc_class_prefix to test_messages_proto3.proto.
19b8c8b Update conformance tests again.
8d5f2c5 Merge pull request #3410 from adam-26/1745
12c186f Fix makefile.am
de6debc Fix conformance tests
e177739 Fix build files
9b8f658 Remove dependency on guava 20
d974cc2 Update conformance tests
f39d4de Merge remote-tracking branch 'origin/master' into merge
759245a Merge from master
bb86644 need for php math functions. used in mergeFromJsonString (#3409)
e9f4e8e Merge pull request #3407 from bklarson/master
451d061 Fix cycle dependency for repeated field not collected by gc (#3399)
4bff88e Merge pull request #3413 from pherl/3.4.x
ce44167 Merge remote-tracking branch 'origin/3.4.x' into vb
4ae94d6 Merge pull request #3414 from pherl/fixzip
eb6b332 Merge pull request #3412 from anandolee/3.4.x
02250a7 Omit the zip test if tools are not available
9c012ed Add __bool__ as well as __nonzero__ for python3
11b4d5e Update required version on pre-generated files
8b24feb Update pre generated files
7bb39be Update version number for 3.4.0
a484794 Use keys() instead of iterkeys() to be python3 compatbile.
72cc5a6 Merge pull request #3393 from pherl/3.4.x
b6da226 Put AddDescriptorsImpl() in anonymous namespace
a713b73 Merge pull request #3281 from BSBandme/ConformanceTestYilunChong
2b6db00 Fix quotation marks
a3a65b3 Fix issue #1745 - javascript allow dot in filename
f15185d Merge pull request #2969 from laszlocsomor/master
0d9a34c Add -Werror=missing-declarations to test builds
ebe659d Travis: Exclude CMake .pc files
2f3cf52 CMake: Install .pc Files
eef2edc Merge pull request #3403 from ax3l/topic-cmake-pkgconfig
74dcf44 Travis: Exclude CMake .pc files
668712c CMake: Install .pc Files
e8a32d0 Merge pull request #3401 from aschrijver/patch-2
d640cdd Updated outdated hyperlink
062df3d Merge pull request #3179 from bjwatson/fix-duration-typo
040f56e Merge pull request #3397 from acozzette/initialization
bba4c4a Merge pull request #3262 from snnn/master
417aae6 Fixed dynamic initialization for C++ lite
dd091aa Fix code to use values() instead
aa61bb0 compiles removal of newline (#3333) (#3370)
1876a27 Update filelist again
66c1dac Add lite and python extra_dist files
bf658c2 Add java and JS dist files.
988376c remove broken imports in JS
b07cdb6 Use itmes() instead of itervalues() to be python3 compatbile.
e45214e Fix distcheck
8084e03 remove profile
11b6661 update build file list
7986ca7 Update conformance tests
50aa4fe Merge pull request #3375 from TeBoring/3.3.x
3af881c Merge master into 3.4.x
8697530 Update csharp and php descriptor
09354db Merge from Google internal for 3.4 release
942a29c Merge pull request #3390 from danielgtaylor-isp/patch-1
6ec0b7e Merge 3.3.x into master
3370299 Merge pull request #3385 from anandolee/master
4b5b1e6 Add note about includes to README
9e745f7 Support PHP generic services (#3269)
b764e67 Set PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION for pure python comformance test
3354558 Merge pull request #3348 from matthauck/fix-gcc41-again
dd6e420 Merge pull request #3357 from bklarson/master
eb8e3d3 Merge pull request #3134 from lundefugl/javabug1
aaa2550 Merge pull request #3372 from dylanetaft/master
324b20a remove pass by reference for php setters (#3344)
29ff49f Fix Implicit Return Types (#3363)
36fcc2a Expand documentation in Readme.md
c78dbd7 Initial value in generated code cannot be used by c extension. (#3367)
ec3f5dc removes an accidental newline in printing for the php generator (#3333)
3a0382e Add map iterator for c extension (#3350)
d3bbf1c Add space between arrow and casted type (#3353)
6aa4b20 Merge pull request #3327 from htuch/fix-3322
71f2f0d Fix repository URL in C# project file
81142e1 Fix build when using -Werror=undef
727c0dc C#: Implement IReadOnlyDictionary<K,V> in MapField<K,V>
2130fea Fix map_field_inl.h for gcc 4.1
e05e777 Windows: support long paths
9ab7c73 Fix missing std::tr1::hash on GCC 4.1 (#2907)
126082c Add std:: namespace prefix to set and map (#3332)
b9c4daa Uncomment php tests (#3301)
f6ff32c Use consistent hash across NDEBUG/!NDEBUG builds.
bd5ab15 Merge pull request #2482 from andreaseger/fix_ruby_timestamp_accuracy
a9e7a15 protoc-artifacts: Bump JDK to 8u131
bceb830 add comments in makefile.am
6bd51a5 add Grpc Protobuf validation (#3311)
32c8ed3 change csharp failure list
30b4194 Merge branch 'ConformanceTestYilunChong' of github.com:BSBandme/protobuf into ConformanceTestYilunChong
7339c25 delete backup files
cbf7dfb fix php failing list and csharp generated proto
e264b20 Merge pull request #3315 from thomasvl/mutate_unknowns
b30dee3 Expose the initializer for unknown fields.
cdd524a Ensure leaveOpen is true when writing to a buffer
62d7fe5 Make Any easier to work with in C#
e82ba0b Merge branch 'master' into ConformanceTestYilunChong
726ba33 changed php's failing list
5085102 remove backup files
3adb054 add some test proto2 supported, add js proto2 supported, fixed some error
ecca6ea Add json encode/decode for php. (#3226)
a7d5be6 change php objc nodejs csharp ruby
fcb9268 change java to uniform message, revert TestValidDataForType's parameters
020a24d change cpp and python to uniform message
5a52b35 Merge pull request #3287 from sergiocampama/initialized
e55782f Add initialized as a reserved keyword as that's the actual property name
467c1cc fix csharp conformance test
db379e6 fix csharp conformance test
176bac6 Add scripts to build python wheel for linux. (#2693)
ff773c1 fix csharp
cd1dc3f add csharp support
3645021 add message set test case
06c9057 add objec support
5e7e2d3 revert ruby proto built files
cf7b6a4 delete backup files
6c59c25 delete binary
91da852 update .gitignore
0255431 revert .gitignore
696cf77 add java supported
0fa4e58 change ignore
18a0c2c add proto2 supported for cpp,python,nodejs,ruby,php
12acbc2 adds PHPDoc @return and @param for getters and setters respectively (#3131)
2ad74e1 add support for proto2
097bfb5 Merge pull request #3084 from lukaszx0/patch-1
dd7265e Merge pull request #3264 from TeBoring/php-bug
e3c807d Fix more implicit type conversions in public headers and generated code.
1a7e49d Merge pull request #2968 from ngg/cpp-proper-fwd
9c0b35c Enusre public header and generated code have no implicit converion.
4e67590 fix readme.md
58a3c74 add test_proto2_message.proto and change conformnace/makefile.am
f752d81 Merge pull request #3266 from mbrickn/patch-1
d07efba Updated links to use https
eca0f4e Merge pull request #3261 from thomasvl/super_oddcase
db45687 If we fail to get a descriptor just super the method resolving.
4987dda Fix a bazel build error on Windows
5555d3b Fix typos in comment
5532abc Merge pull request #3258 from TeBoring/3.3.x
5520b43 Update C++ generated code.
e7bcfc4 Update version number to 3.3.2
8ecae34 Merge pull request #3255 from TeBoring/3.3.x-3
3b1a875 Remove inclusion of ext/json/php_json.h. (#3241)
c344fe8 Oneof field should be serialized even it's equal to default. (#3153)
dba8928 Add ARRAY for reserved name (#3150)
703cd8e Switch to addEnumType to fix fatal error (#3225)
1325588 Updated upb to fix JSON conformance issues. (#3206)
c2fdef0 Merge pull request #3243 from yjjnls/master
73b7cc0 Merge pull request #3244 from thomasvl/complete_docs
5fd71ce ObjC: Document the exceptions on some of the writing apis.
72e293a Merge pull request #3240 from thomasvl/float_fun
8f367c0 replenish missed header files in install step
5729cf7 Remove inclusion of ext/json/php_json.h. (#3241)
dd19b87 Raise the number of digits used for floats.
710543d Merge pull request #3237 from calder/patch-1
491b320 Merge pull request #3236 from buchgr/bazel-links
888e287 Merge pull request #3235 from buchgr/java-target
4b36d40 Qualify string in java_options.h
36e63da bazel: Make compiled jars java 6 binary compatible.
d0e6f3b bazel: add bazel symlinks to .gitignore
91bf623 Fix php jenkins test (#3233)
8d97b3d Fix incorrect function call (#3232)
b9b34e9 Follows proper autoloading standards (#3123)
09d2994 Merge pull request #3228 from thomasvl/add_tvos_to_podspec
6ecf38f Add tvOS to the podspec.
c722c3d Merge pull request #3216 from traversaro/patch-1
9094bf0 Export symbols used in inline functions
9ba7d1c C++: Do not forward-declare dependencies in generated .h files
96095f3 Merge pull request #3176 from acozzette/fix-3114
c202b06 Merge pull request #3196 from matt-kwong/kokoro
0871e6a Add continuous testing config files for Kokoro
d4d41af Merge pull request #3191 from matt-kwong/kokoro
6156af1 Add MacOS and Linux tests to Kokoro
d555775 Merge pull request #3189 from thomasvl/objc_proto3_unknown_fields
2aeb4ab Merge pull request #3160 from meteorcloudy/winbuild
ddbe360 Merge pull request #3159 from yeswalrus/new-generate
1d0988b ObjC: Preserve unknown fields in proto3 syntax files.
516a81a Merge pull request #3190 from thomasvl/objc_IllegalZeroFieldNum
ecc0f54 Properly error on a tag with field number zero.
656dedb Merge pull request #3157 from yeswalrus/fix-version-check
7ccb251 Remove unused output_file variable from js_embed
6f32580 Add new file option php_namespace. (#3162)
df3f8cf fix check_and_save_build_option not correctly exporting build options
0336770 add protobuf_generate function, allows use of target_sources where available
e9c15d6 Ensure that for Java, imports of .proto files with empty packages works
fbaad36 Merge pull request #3169 from dmaclach/master
63a9728 Merge pull request #3170 from thomasvl/int64_map_issue
46f36d7 Fix some cases of reading of 64bit map values.
ea43e0c Optimize GPBDictionary.m codegen to reduce size of overall library by 46K per architecture.
0b059a3 Refactor cc options in BUILD file for Windows
d8c5865 Fix policy warning CMP0054
a183a0d Fix the check_and_save_build_option macro never evaluating to true
faa5398 fix check_and_save_build_option not correctly exporting build options
ae85cb8 Fix find module not working when no version number was given
d6470ab not to use std::random_device for map.Seed(). (#3133)
e222997 Merge pull request #3149 from KarrokDC/master
1e86ef4 Oneof field should be serialized even it's equal to default. (#3153)
282fb9e Add ARRAY for reserved name (#3150)
4d5daf4 Adds fluent setters for PHP (#3130)
4eb02fe Add headers as part of cmake project tested only on windows with visual studio 2015 as generator
4674cc7 Merge pull request #3113 from phst/master
95749d5 update csharp README and fix .NET 3.5 build error
aea4374 Issue 3112: Object class with fully qualified name
0b07d7e Add IncludeSource in csproj as per review comments
f26e8c2 Convert C# projects to MSBuild (csproj) format
40da1ed Removing undefined behavior and compiler warnings (#1315)
ba987a7 Merge pull request #3126 from mbrukman/fix-readme-formatting
c5125f3 Merge pull request #3117 from KarrokDC/master
d2c1865 Merge pull request #3103 from sergiocampama/perf
2465ae7 Adds serial and parallel parsing tests to check if parallel parsing is faster than serial parsing, which it should
6775570 Fix Markdown formatting in README.
979107e Improve fix for https://github.com/google/protobuf/issues/295
3b22761 show help if protoc is called without any arguments, pre-empts -h and --help to show a useful message instead of just 'Missing input file.'
bf04c83 Merge pull request #3085 from scpeters/issue_3059
8546620 Merge pull request #3104 from thomasvl/ext_registry_copy
49e4ba6 Fix ExtensionRegistry copying and add tests.
b28617b Merge pull request #2815 from devwout/ruby_json_emit_defaults
78cb804 change test for nanosecond accurate timestamps
ad203bc fix floating point accuracy problem in Timestamp#to_f
49a56da Update jenkins Java deps.
129a6e2 Revert guava depedency to version 19.
969e0be regenerate plugin and profile message code
26f0011 Use bool deterministic to suppress warning
474cca5 Add LICENSE in package.xml (#3083)
13f532e Merge pull request #3074 from xfxyjwf/3.3.x
82e50ba Workaround the docker bug when compiling artifacts
de6ae7d Fix upb load descriptor when no messages defined in prorto. (#3080)
2231931 Fix c extension for php7.1. (#3077)
757cc9f Update C++ generated code.
58538ea Update version number to 3.3.1
c2154e1 Merge pull request #3073 from xfxyjwf/3.3.x
d22493b Merge pull request #3064 from randomguy3/offset-type
9b82fce Workaround gcc < 4.5.0 bug
455b61c Merge pull request #3062 from Oppen/master
e062f70 Fix compilation
e82d81a Fix offset type to match the tables it is used in
25abd7b Add compatibility test for php. (#3041)
3c369dc Merge pull request #3057 from xfxyjwf/3.3.x
cd0efc0 Workaround gcc < 4.5.0 bug
99cf2ef Merge pull request #3056 from acozzette/cherry-pick-pr-2873
7378ec2 Add missing LIBRPOTOC_EXPORT.
3a5a072 Skip C# test in C++ only distribution.
8859c07 Add missing files to build files.
4833960 Merge pull request #3043 from acozzette/javascript
22c8772 Fix #1562 by using goog.crypt.byteArrayToString instead of String.fromCharCode.apply
dd0a233 Merge pull request #3055 from chrisn-arm/3.3.x
c3093d3 Fix issue 3046: compilation on alpine 3.5
f00e06c Removed mention of Buffer in byteSourceToUint8Array
a64497c Merge pull request #2873 from myitcv/fix_1562
bcb3506 Fix #1562 by using goog.crypt.byteArrayToString instead of String.fromCharCode.apply
2f4489a Merge pull request #3024 from acozzette/merge-3.3-to-master
286f059 added "objectivec" build target (#3033)
9053033 Merge remote-tracking branch 'remotes/google/3.3.x' into merge-3.3-to-master
067b1ee Merge pull request #3023 from acozzette/min
07c284f Fully qualify min as std::min in wire_format_lite.cc
a6189ac Add prefix to enum value with reserved name. (#3020)
cbd08cb Merge pull request #3018 from acozzette/using-namespace-std
54d1701 Merge pull request #3015 from buchgr/unused-consts
7c76ac1 Remove "using namespace std" from stubs/common.h
3c0855e Add a test case for nested enum, which was missed previously. (#3010)
b1c75bc Remove unused constants.
4920e27 Merge pull request #3008 from postmasters/patch-1
fba2acd Add nested enum descriptor in php rumtime. (#3009)
e64b618 Update php version number to 3.3.0 (#3001)
4777574 Add a link to dart-lang/protobuf
6fff091 Throw exception when parsing invalid data. (#3000)
f418b9e Merge pull request #2996 from xfxyjwf/3.3.x
4523c9c Allow proto files to import descriptor.proto (#2995)
478119f Fix python3 issue.
14afc3f Merge pull request #2992 from xiaogaozi/patch-1
f85eecb Add gogoprotobuf to third-party add-ons list
4c57e84 Prepend "PB" to generated classes whose name are reserved words. (#2990)
b97cd57 Add test for nested enum for php (#2989)
7be0882 Enum defined without package have incorrect class name. (#2988)
190b527 Make PHP c extension work with PHP7 (#2951)
357afc3 Merge pull request #2508 from yliu120/pass_default_env_to_protoc
0a93f67 Merge pull request #2987 from konsumer/patch-1
594f810 Merge pull request #2982 from mda000/issue2972
3055a02 Add node-protoc-plugin to "Other Utilities"
a3873ca Merge pull request #2985 from thomasvl/class_check_tweaks
f5a01d1 Tighten up class usage/checks.
2240a78 Simplify the Element dtor invocation when freeing elements in InternalDeallocate to avoid confusing the compiler when there's a class named Element already defined in the global namespace.
8aa927f Merge pull request #2950 from anuraaga/dev_rag
4323482 Merge pull request #2967 from xfxyjwf/3.3.x
5777259 Cherry-pick cl/152450543
cad0258 Cherry-pick cl/151775298
fc3ea97 Merge pull request #2955 from xfxyjwf/3.3.x
899460c cherrypick descriptor_pool.FindFileContainingSymbol by extensions (#2962)
bfeeb98 Add include for INT_MAX
e91caa1 Merge pull request #2949 from xfxyjwf/3.3.x
bf483df Allow unknown values for Map put*Value methods just like every other enum mutation method.
ee9c7f1 Cleanup reflection objects for map entry.
efec757 Merge pull request #2937 from anuraaga/dev_rag2
18c13c9 Merge pull request #2942 from xfxyjwf/3.3.x
21b0b3c Update generated code.
80f0c0a Update version number and changelog for 3.3.0
69bfde2 Merge pull request #2922 from anandolee/master
09328db Fix test for unexpected type url when parsing Any. Currently, the test fails since TestAllTypes doesn't have field '@type', which is the same test as testUnknownFields.
139fd0a Merge pull request #2933 from mharrend/patch-1
37c7b76 Merge pull request #2930 from anuraaga/dev_rag
662f978 Fix duplicate fields test. The repeated version is passing because null values in a repeated field are rejected and not testing what it wanted to. Also adds a oneof version that verifies the case of oneof fields of different names (currently only same name check seems to be tested).
cc3fa2e Merge pull request #2676 from acozzette/js-compatibility-tests
10ea251 Added compatibility tests for version 3.0.0
7e5f980 Split test protos into two groups
dd04ffb Adding default shell env
58373fa Fix error message for int64 parse error.
11c902e Add IntelliJ project to gitignore for java project.
bd74319 Update Java conformance failure list.
32ad5a3 Use "git reset --hard" to actually reset the code.
b7c813f Update jenkins Java dependencies.
c2b3b3e Update Java version number and dependency.
624d44f Update objective-c conformance failure list.
d582778 Fix C++ distcheck.
fe97d79 Fix MSVC DLL build.
fab8812 Update python conformance failure list.
c52e54f Update jenkins Java maven dependencies.
057a285 Update C# conformance failure list.
e47c068 Update python conformance failure list.
84f6954 Fix Java build.
c348d46 Use PyUnicode_AsEncodedString() instead of PyUnicode_AsEncodedObject()
acde165 Update BUILD file for C# tests.
32d7830 Fix C++ build for down-integration.
d36c0c5 Down-integrate from google3.
4a0dd03 Removes ignored const from return type (#2915)
258406b Merge pull request #2919 from thomasvl/drop_dispatch
130c166 Remove the use of dispatch_once that is heap backed.
ba3fa41 Merge pull request #2918 from thomasvl/xcode_8_3
558ba98 Add support for Xcode 8.3 to the build helper.
04c77c4 Merge pull request #2913 from thomasvl/conformance_ignores
d43eaf2 Fix gcc warning when using map (#2213)
5859932 Merge pull request #2914 from acozzette/nacl
f316375 Added a workaround to allow building for NaCl
8adf57e Add some new ignores for things generated in conformance.
b3f3e12 Merge pull request #2912 from thomasvl/objc_recursion_limit
ddb4388 Raise the recursion limit to 100 to match other languages.
d9e0119 Merge pull request #2858 from haberman/gopackage
c565e25 Merge pull request #1662 from haberman/jsconformance
7610f10 Merge pull request #2884 from anandolee/master
689e4bf Add FormatEnumAsInt support for Json Format. And scale JsonFormatter.Settings to multiple options.
373809e Merge pull request #2897 from cgrushko/patch-5
6f21e29 Compile the Java proto runtime with Java 6
1387a67 Update commit number in Docker to update composer dependency (#2869)
ffa932b Merge pull request #2861 from byronyi/#710
312e2db Update BUILD
db3ef48 Merge pull request #2860 from prehistoric-penguin/master
20181f6 Merge pull request #2854 from hesmar/attributesFix
4d273f2 Merge pull request #2870 from acozzette/memcpy-memmove
15b60bc Merge pull request #2867 from mojoBrendan/master
ea5ef14 Ruby: only link against specific version of memcpy if we're using glibc
c12cc34 Merge pull request #2837 from anandolee/master
6b27c1f Add file option php_class_prefix (#2849)
c0871aa Merge pull request #2848 from xfxyjwf/freebsd
e8e6aa2 Update delimited_message_util_test.cc
89eb4e5 Add option to preserve original proto field names
aec0711 Ruby tests compare parsed JSON instead of raw JSON
1eee320 Add use_snake_case_for_field_names option to JsonPrintOptions
c415a14 fix several issues
44dc555 Merge pull request #2866 from xfxyjwf/nano
ddc0096 Add a notice for nano.
1b0db1c Removed obsolete comments and added docs.
0df2028 Properly regenerated descriptor.proto.
89c3c45 Merge pull request #2859 from haberman/junit-dep-scope
2957703 Merge pull request #2847 from haberman/ruby-toh
0fad0e1 Merge pull request #2794 from acozzette/jspb-extensions
acaa940 add delimited_message_util.cc to libprotobuf.cmake
7008a88 add LIBPROTOBUF_EXPORT to make msvc happy
cb3e84b migrate delimited messages functions to util package
33cc25f Remove duplicated copyright statement
496cd48 Changed scope of Java deps to "test".
e62e30c Changed go_package for plugin.proto.
4842363 Merge pull request #2023 from odeke-em/fix-print-help-to-stdout
e77a09e Incremented Ruby version number to 3.2.0.1
8c40b51 Ruby: update Gemspec.
97cbc42 Fix libprotoc.cmake to generate well_known_types_embed.cc
f23869c Bug fix: When encoding, negative int32 values should be padded to int64 (#2660)
014a550 Ruby: build packages for Ruby 2.4.
c57c77b Merge pull request #2829 from afrantzis/hide-unnecessary-library-symbols
324a299 Made formatting more consistent.
ed0ef54 Merge pull request #2846 from acozzette/bytestream-comment
d18df81 Merge pull request #2855 from thomasvl/copy_note
5e4f14f Document deep copy in the header
b4b855c fix attributes warning
416f909 Fix freebsd build.
9c6b8cb Ruby: fixed Message#to_h for map fields.
95b4427 Build system fixes for JS conformance tests.
43f2db7 Merge pull request #2843 from haberman/check
746ca59 Updated an outdated comment in bytestream.h
874e382 Replace CHECK() with GOOGLE_CHECK().
8df69f0 Conformance test for JS now work, though 15 tests fail.
f0a5c10 Merge pull request #2836 from xfxyjwf/i894
ddfc86b Merge pull request #2835 from pherl/javaep
13d165d Hide unnecessary exported library symbols
d59592a DefaultValueObjectWriter should populate oneof message field
c94555f Double-quote file paths in extract_includes.bat.in
f4f31e7 Suppress the last unchecked warning.
a69bc9d Merge pull request #2822 from anandolee/master
f54fb9d Merge pull request #2832 from pherl/javaep
e11cd3e Merge pull request #2818 from xfxyjwf/i1470
6044b24 Make //:protobuf_python have correct __init__.py.
92064a4 Merge pull request #2824 from xfxyjwf/i1415
cd6eb91 Merge pull request #2826 from xfxyjwf/i1374
81f4fe5 Merge pull request #2827 from xfxyjwf/i1251
81fe52f Fix java code according to error prone.
616e68e Repeated/Map field setter should accept a regular PHP array (#2817)
ae220cd Add auto detect for generated code of WKT protos, addressbook.proto and conformance.proto
03c8c8b Update comments for setSizeLimit.
a1bb147 Merge pull request #2825 from pherl/javawarning
1ece7c0 Add missing thread dependency in cmake.
009e491 Fix GeneratedMessageV3 warnings.
da00355 Merge pull request #2809 from xfxyjwf/i2464
61e87f3 Use per-type table to lookup JSON name.
7c75344 Fix lint warnings in the javalite branch.
cad6a51 Merge pull request #2819 from haberman/pythonexcept
3e6245e update_failure_list.py: fixed Python "raise" statement.
075475f Don't expose gson exceptions in JsonFormat.
bbfb9d5 Merge pull request #2804 from acozzette/ruby-memcpy
8e465dc Merge pull request #2810 from xfxyjwf/i1994
af2d5f5 Merge pull request #2775 from xfxyjwf/fixmajor
9afacb4 Merge pull request #2814 from pherl/javadeprecate
baceff7 Add annotations for deprecated messages in Java
008dc92 Ruby version optionally emits default values in JSON encoding.
9fa4031 Ruby: wrap calls to memcpy so that gem is compatible with pre-2.14 glibc
c311543 Avoid redundant type casts for oneof bytes fields.
4ae8656 Make JsonFormat locale independent.
fa17880 Merge pull request #2602 from GreatFruitOmsk/issue-2428
920af75 Fix Bad Link for Common Lisp
dd8d5f5 Rename encode/decode to serializeToString/mergeFromString (#2795)
769b693 compiler/cli: PrintHelpText prints to stdout instead of stderr
2b7430d Merge pull request #2793 from keveman/master
f6d8c83 Merge pull request #2613 from aausch/fix_memory_leak
21b58b5 Removed a stray return statement, causing compilation error.
651ba62 JS: ensure that extension values are serialized even if they're falsy
06f9f60 Detect if Descriptor.cs changes for csharp
f873d32 Added JavaScript conformance tests.  All tests pass!
27b1f2b WIP.
0c0a887 Merge pull request #2751 from keveman/master
008ff03 Merge pull request #2784 from acozzette/log-2-floor-int
6837b2d Added comment explaining the protobuf_headers target.
af13bff Detect if Descriptor.cs changes for csharp
8610d0a Merge pull request #2755 from xfxyjwf/rubycomp
352526c Merge pull request #2785 from thomasvl/threading_race
2d1c5e2 Handing threading race resolving methods.
938206d Return uint32 from Log2FloorNonZero64
a7e3b0a Merge pull request #2774 from acozzette/closure-builder
8b182cc Disable static analyzer for message semaphore creation (#2748)
6011d7c Fix gcc 4.1 build (#1035) (#1913)
25ecd55 Change hint type to `const void*` (#2568)
bcbaabe Add mergeFrom method on Message (#2766)
671e075 Use closurebuilder.py in favor of calcdeps.py for compiling JavaScript
7339fc0 Merge pull request #2674 from acozzette/js-test-cleanup
b7f25d4 Undef major/minor if they are defined as macro.
aff9d9d Removed log statement from writer_test.js
5274d6e Merge pull request #2770 from xfxyjwf/fixcmake
83b0cc9 Merge pull request #2772 from sschuberth/master
606cb7e There might be duplicated enum values when allow_alias is true. Add PreferredAlias into OriginalNameAttribute to remove the duplication (#2727)
902af08 Prefer the term "3-Clause BSD License" over "New BSD License"
6395a1c Fix links to the New BSD License in meta-data
ffde972 Remove the use of C++11 features.
9118ad6 Add Ruby compatibilty test against 3.0.0.
d41c47f Merge pull request #2733 from wmamrak/patch-1
8d61f9c Merge pull request #2729 from MarcelRaad/fix_inline_msvc12
b4b0e30 Merge pull request #2355 from xfxyjwf/fixjson
8387b88 Merge pull request #2732 from AsturaPhoenix/master
66c64e7 Merge pull request #2747 from liutikas/master
8c8b8e6 Merge pull request #2734 from msabramo/patch-1
72b82e6 Merge pull request #2630 from blodan/master
963473b Merge pull request #2753 from thomasvl/recursive_drop
d071766 Add GPBMessageDropUnknownFieldsRecursively() and tests.
2d430f8 Added a header only cc_library target for the protobuf library.
17174b5 Updating README
f83d129 Upgrading test-related libraries
c9b2c8f Fixes for .NET 3.5 compatibility
a434bfc Fix compiler warnings about unused variables in generated_message_reflection.h
1a8cbfd Merge pull request #2736 from na-ka-na/master3
172e0a6 Add an option to always print enums as ints in Json API
86208c5 README.md: Make docs URL a link
37bd5d5 Disable MSVC warning C4309
01a05a5 const FieldDescriptorCompare
8f9c0a4 Fix unresolved symbols with MSVC12 and /Zc:inline
a9ab38c Merge pull request #2722 from ckennelly/unified
8af35f2 Keep loop bounds in a local variable for string fields.
a6c30d9 Keep loop bounds in a local variable.
9db5b11 Work with truncated tag numbers.
0026dff Expose rvalue setters for repeated string fields.
38b1440 Merge pull request #2663 from ckennelly/varint-size
15360e5 Merge pull request #2689 from ckennelly/aliasing-fixed32-fixed64
38c238e Improve support for plugin parameters.
d2dfe46 Merge pull request #2609 from yixiang/patch-1
3f6f73b Merge pull request #2701 from anandolee/master
ed423c2 Merge pull request #2451 from podsvirov/json-primitive-map
aa78aeb Merge pull request #2704 from liutikas/master
74eb9a0 Add clear method to PHP message (#2700)
46c022a JsonUtilTest: Add ParsePrimitiveMapIn subtest
9079079 Fix compiler warnings about unused variables in wire_format.h
ef927cc Switch to gcc atomic intrinsics for macOS and delete the file that uses (#2699)
7288689 Add csharp compatibility tests against v3.0.0 and run on Travis.
1d2736f Merge pull request #2656 from pcj/patch-1
9f09d18 Add proto and test files for csharp compatibility tests against v3.0.0. All the files are copied from 3.0.0 (JosnFormaterTest was deleted)
c6e0d0e Merge pull request #2647 from anandolee/master
42e1e2a Fix python compatibility test when a new generated code imports an old version(2.6.1 or older) generated code.
e844510 Merge pull request #2692 from cgrushko/patch-3
65a4d20 Update load() statement to latest style
a60cc08 Merge pull request #2691 from cgrushko/patch-3
cba04b1 Implement json encoding decoding for php. (#2682)
6fffd4a Bazel can build protobuf when it's not in the root
56da828 Avoid aliasing CodedInputStream::buffer_ when parsing little endian integers.
c002743 Add fixed version to phpunit used in travis (#2673)
36f51f9 Merge pull request #2681 from sergiocampama/spaces
e7f5c9d Removes trailing whitespaces
5a3405c Update upb for php. (#2662)
bd29f86 Fix CopyTo argument validation
36f68e0 Inline branch-less VarintSize32/VarintSize64 implementations.
3975664 Add conformance test for php (#2655)
7b54b34 Add bazel protobuf resources
7f3e237 Merge 3.2.x branch into master (#2648)
9d3288e Merge pull request #2226 from kchodorow/master
2c36cc3 cache generated classes, optimization and quick workaround to memory leak
afc59ab C#: Implement IReadOnlyList<T> in RepeatedField<T>
87e4976 Merge pull request #2639 from anandolee/master
1ee09c8 python: do not include internal 'strutil.h' header
a83ac86 fix compile error on centos in metadata.h for constructors. (#2599)
a323f1e Oneof accessor should return the field name that is actually set. (#2631)
ccb76ff Add Oneof custom options test
5af0b54 Merge pull request #2619 from anandolee/master
1f09786 Merge pull request #2633 from anandolee/jieluo_branch1
ea51149 Add python compatibility tests against v2.5.0 amd run on Travis.
c15217f Allow OneofOptions to be extended in proto3.
c2a5669 Merge pull request #2626 from sergiocampama/8_3
32fa55e FreeBSD compatibility
4e7ecde Update genfiles paths to work with a different execroot arrangement
3d7b42d Adds nullability modifiers to resolve Xcode 8.3 warnings
140e28d Add python compatibility tests against v2.5.0: copy tests and proto files from v2.5.0
0aa5af3 Merge pull request #2614 from acozzette/gzip-output-stream-options
a101fa5 Set LIBPROTOBUF_EXPORT on GzipOutputStream::Options
e41b667 Undef TYPE_BOOL to avoid conflict with iOS.
047575f Support custom options in C#
eed9951 Merge pull request #2591 from thomasvl/objc_timestamps_take2
24908e1 Update AbstractMessage.java
d0bc096 Timestamp helper fix, Duration helper cleanup.
c9cd6ac Merge pull request #2587 from google/revert-2586-objc_timestamp
1651342 Revert "Fix Timestamps with dates before the Unix epoch that contain fractional seconds."
cf477d4 Merge pull request #2586 from thomasvl/objc_timestamp
adcccd0 Fix Timestamps with dates before the Unix epoch that contain fractional seconds.
feb78fb Merge pull request #2584 from cgrushko/patch-2
e4baf3f Add a proto_lang_toolchain for Java
e53dd99 Merge pull request #2529 from wackoisgod/master
fac90c6 Update AbstractMessage.java
75ac397 Fixing code formatting issues
effcb13 Merge branch 'master' of https://github.com/wackoisgod/protobuf
228d242 Merge pull request #2567 from acozzette/distcheck-fix
fb71df9 Add ByteString.FromStream and ByteString.FromStreamAsync in C#
e76d91a Add global.json file to pick dotnet core SDK version.
0bdf4a6 Fixed "make distcheck" for the Autotools build
2bddffc PHP fix int64 decoding (#2516)
2c16f69 Fix generation of extending nested messages in JavaScript (#2439)
ffa71f8 A few more cases for binary conformance tests. (#2500)
1041710 Merge pull request #2565 from acozzette/cross-compilation
24f0d56 Merge pull request #2563 from thomasvl/autocreator_tweaks
988ffe0 Minor fix for autocreated object repeated fields and maps.
2deb139 Merge pull request #2544 from tiziano88/master
17a8a76 Merge pull request #2536 from jbrianceau/fix-js-embed-include-style
c55175c Merge pull request #2564 from acozzette/arena-nc
a592052 Removed arena_nc.cc and arena_nc_test.py
b40d318 Fixed cross compilations with the Autotools build
f3e86fd handle sanity check for repeating enums correctly
4cb113a Fixed issue with autoloading - Invalid paths (#2538)
30250cd Add link to Elm proto plugin
5f65ee6 Merge pull request #2542 from jbrianceau/fix-embed-cc-warning
4455cdf Fix include in auto-generated well_known_types_embed.cc
05b019a Fix warning in compiler/js/embed.cc
f52e188 Merge pull request #2523 from jbrianceau/init-index-in-metadata
137dc02 Merge pull request #2525 from camillol/lite
abe1725 simpler, cheaper callback to LazyStringOutputStream
4e229c8 add MethodResultCallback_0_0
15a15e3 Init index_in_metadata_ without condition
6c021b3 Added the support for class level deprecation which will in turn also deprecate any fields that are currently using that type
d948b66 Merge pull request #2521 from acozzette/fix-bazel
5731ca5 Added well_known_types_embed.cc to CLEANFILES so that it gets cleaned up
ee0a243 Updated Makefile.am to fix out-of-tree builds
d1e7bd9 Added Bazel genrule for generating well_known_types_embed.cc
cdc2766 Merge pull request #2506 from ckennelly/rvalue-setters
bb2c6b2 Merge pull request #2505 from ckennelly/master
c64830b unwrap descriptor class before comparison of RepeatedField types
fb15862 Merge pull request #2517 from acozzette/js-embed
98d89d4 Fixed "make check" for cmake build
1b3a0c1 Auto-generate well_known_types_embed.cc
183d31c Add rvalue setters for non-arena strings on C++11.
f39cf88 Merge pull request #2227 from KindDragon/3.1.x
b18bc9b Give C# ByteString a sensible GetHashCode implementation.
ef61a9d add a key to ctx.action dict to prevent protoc losing the default env
ba63fa7 Remove spurious NULL checks in ArenaStringPtr::CreateInstance.
a95e38c Merge pull request #2499 from ckennelly/master
a902e25 Define LANG_CXX11 for port.h and use this to guard C++11 features.
83d681e Merge pull request #2495 from acozzette/android-hash
d1c1dad Merge pull request #2498 from sergiocampama/enum
c68fc58 Fixes and expands comments on how to use GPB_ENUM_FWD_DECLARE
2ff42dc Added conformance testing for binary primitive types. (#2491)
f983302 Merge pull request #2496 from xyzzyz/fix-overflow
837fd6b Merge pull request #2493 from jbrianceau/add-missing-climits-include
f77b7d9 Merge pull request #2484 from ngg/uwp_build
4c5d3ed Fix integer overflow in FastUInt32ToBufferLeft
5587562 Removed Android-specific code from stubs/hash.h
7b220f3 Add missing include in embed.cc
9d709f4 Merge pull request #2487 from jtattermusch/csharp_leading_whitespace
83c728a Add missing includes
eb455ce Merge pull request #2471 from jbrianceau/fix-include-style
6b86a89 Merge pull request #2490 from xfxyjwf/icon2
4c252dd Add a badge for bazel build status.
ec021f5 Add support for Windows ARM builds
29fb87e Merge pull request #2454 from pongad/go_package
fda9049 remove leading whitespace in C# xml comments
277a8b6 generate_changelog.py: flush output so piping works correctly.
8494846 Merge pull request #2476 from acozzette/generated-message-reflection-fix
dc11940 Merge pull request #2475 from sergiocampama/rvm2
e19f3b5 Use uint32 in GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET macro
1ac8944 Reenable cocoapods objc test and remove unnecessary workaround for rvm
e43f73e Merge pull request #2473 from thomasvl/update_xcodes
70e21d7 Mark objectivec_cocoapods_integration as failing
bc9d077 Skip benchmark test if cmake isn't installed.
2754586 Xcode 8.1 support
e3da722 Fix #include in cc files
243ebec Merge pull request #2468 from sergei-ivanov/patch-1
d8f54c4 Disable jruby test. (#2469)
09dc933 Update third_party.md
e3e38b8 Update commit id in Dockerfile to trigger update. (#2467)
4474c04 Merge pull request #2462 from jbrianceau/fix-comp-builds-part2
6b4eee4 Merge pull request #2461 from jbrianceau/add-missing-include-in-embed-cc
34a1b6e Merge pull request #2394 from cwelton/formatting
46ae90d Make php generated code conform to PSR-4. (#2435)
631f461 Merge pull request #2466 from thomasvl/deprecation_followup
4c84b47 Merge pull request #2460 from sergiocampama/c11
dad775b Improve ObjC deprecated annotation support.
e219be7 Regenerate descriptor proto
b1295ee C++: export _xxx_default_instance_ symbols
867dbac Add missing include in embed.cc
c836ad4 Merge pull request #2459 from acozzette/android-logging
1d91c25 Include -std=c++11 when compiling protobuf if available.
2f29f0a Send all protobuf logging to logcat by default on Android
057389c Ruby: removed redundant RepeatedField#slice. (#2449)
850d573 Merge pull request #2407 from jbrianceau/fix-comp-builds
788d14a Export symbols used in inline functions
bb77cbf update descriptor.proto's go_package
607b921 Merge pull request #2437 from xfxyjwf/plugin
1a56251 oneOf fix for JsonFormat includingDefaultValueFields
ced8f73 Add version number to plugin protocol.
0509072 Merge pull request #2445 from ramrunner/master
c664b66 Merge pull request #2442 from pherl/fix-bazel
4cc160e when on OpenBSD we include the correct headers for endianess and check the apropriate defines
f92b455 Add missing files.
f1ce60e Factored Conformance and Benchmark test messages into shared test schema. (#1971)
4280c27 Merge pull request #2436 from cgrushko/patch-1
45d92ae Add a proto_lang_toolchain() for cc_proto_library
6b60ddd Merge pull request #2431 from saintstack/2228v2
7550bcd Change CodedInputStream#DEFAULT_SIZE_LIMIT from 64MB to Integer.MAX_SIZE (0x7FFFFFF) #2228
f8ca3ac Generate phpdoc in php generated files. (#2406)
34dc96b LIBPROTOC_EXPORT added to others functions in csharp_names.h and objectivec_helpers.h
b790da5 Missed LIBPROTOC_EXPORT for GRPC added
851cb81 Merge pull request #2429 from thomasvl/issue1833_swift_prefix
f813bd9 Add a swift_prefix file option.
39f9b43 Merge pull request #2403 from google/down-integrate-with-msvc-fix
65479cb Fixed Ruby tests for JRuby 1.7
259dd7e Updated descriptor_pool.py to be compatible with Python 3
db35fe7 Add a "u" suffix to tag numbers in generated code
a7f300d Fixed descriptor_pool_test.py for Python 2.6
c950471 Merge pull request #2404 from wiktortomczak/master
0fa31b2 Support grpc plugin in py_proto_library
a41090e Updated failure_list_java.txt for Java conformance test
72002d8 Merge pull request #2400 from acozzette/jspb-test-fixes
fda876a Added back in binary serialization round-trip in message_test.js
b763246 Merge pull request #2398 from jbrianceau/no-static-init-define-fix
04bd614 Merge pull request #2392 from xfxyjwf/fixdown
40f3586 Fixed remaining JSPB test failures
315350b Updated message_test.js so that it does not depend on fromObject
b4dd686 Updated enum names in test.proto to avoid conflicting with testbinary.proto
a5c30ce C++: Fix use with GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER
7807932 Restore jenkins files.
599613e Update EXTRA_DIST lists.
1f077a0 Update conformance failure lists.
530ae30 Add back missing LIBPROTOBUF_EXPORT.
1673389 Updated libprotoc.cmake
5d63097 Merge branch 'master' into down-integrate-with-msvc-fix
5a76e63 Integrated internal changes from Google
cd315dc Merge pull request #2383 from snapsam/patch-1
44edefa Merge pull request #2382 from zhsyourai/master
d571d39 Update README.md
14c147e Add LL to large constant
cb54caf Add tests to demonstrate json parsing for null Timestamp and Duration types
99564c3 Rename Empty to GPBEmpty in php generated file.
fc27ead Merge pull request #2362 from wujingchao/patch-1
a3dfbe6 Merge pull request #2378 from ianfhunter/patch-1
01d321c Merge pull request #2367 from jbrianceau/add-missing-include-in-message-lite-cc
130bb07 typo
83d6411 Fix jenkins tests.
bf37971 Merge pull request #2323 from marcinwyszynski/master
c6f3d70 Merge pull request #1907 from evokly/js-utf8-fix
bd850a2 JS: Well, this is the right place for surrogates.
292c2c9 JS: Re-added comment, moved surrogates code to the right place
6e93fa4 Merge pull request #2366 from jbrianceau/reland-fix-include-js-generator
a95d052 Merge pull request #2368 from jbrianceau/fix-json-style-in-project-json
3c0e0ce Fix csharp/src/Google.Protobuf.Test/project.json
aac9ed8 Add missing include in message_lite.cc
3316062 Fix #include in js_generator.cc
74a636a Move variable declarations before actual code
0c0f7e2 Merge pull request #2364 from haberman/jslicense
5d9dbe3 Fixed JavaScript license declaration.
abeff7b Class is final but declares protected field
a30e5af Merge pull request #2358 from ckennelly/master
e02cb2b Resolve old TODO for StringTypeHandler.
8a4b2c5 Merge pull request #2353 from guptasu/master
df56736 Merge pull request #2357 from D3Hunter/master
ed08341 #2356 : fix ExceptionInInitializerError on IBM J9
bd158fc Speed up JSON parsing.
df83907 Fix php c extension on 32-bit machines. (#2348)
9f75c5a Merge pull request #2337 from sergiocampama/deprecation
fce8b6b Made helper code also consider package name 'proto2' when dealing with MessageOptions.
e75cf40 Fixing references to the removed atomicops_internals_pnacl.h file.
ce5160b Merge pull request #2332 from Kwizatz/master
d584321 Merge pull request #2327 from ctubbsii/fix-maven-compiler-plugin
1f2dbc8 Implement RepeatedFieldIter for c extension. (#2333)
ecc460a Renamed the pnacl version of atomicops.h into C11 atomic, and flagged the mac version to that if atomic is enabled
975d577 Added explicit cast to avoid size warning on Win64.
0d7199e Merge pull request #2329 from acozzette/unused-parameter
ca800ea Merge pull request #2330 from manupsunny/master
089aaa9 Fix message for InvalidProtocolBufferException
8785004 Fix unused parameter warnings in arena_free
eb7f3a3 Use latest maven-compiler-plugin (2.6.0)
7bd11fc Merge pull request #2301 from jbrianceau/arm-atomic-kuser-helpers-fix-v2
4c310d7 Update conformance test failure list
50a37e0 Change JSON field name formatting
cb81314 Fix copy pasta in test
3bdaaa5 More Ruby-eqsue interface
93a4fa2 Merge pull request #2302 from jbrianceau/generic-gcc-atomics-strong-cmpxchg
750b9e2 Merge pull request #2318 from mavrukin/patch-1
4d813de Fix compiler warnings when running :protobuf_test
8fcd24b Merge pull request #2307 from sinzianag/swift_protobuf
ea928a1 Merge pull request #2309 from thomasvl/note_about_coding_support
98c0185 Add note about extension use and Coding support.
9819b72 Adding Apple's Swift Protobuf
a5a2c1d generic atomicops: Use strong compare_exchange
4587a3f [arm/gcc] Don't rely on KUSER_HELPERS feature for atomics
d58b92a Adds pushLimit: and popLimit: into GPBCodedInputStream (#2297)
795976e Trigger update of docker for new changes in #2282. (#2288)
e9d9e56 Merge pull request #2290 from ramrunner/OpenBSDsupport
bfc1299 define no_threadlocal on OpenBSD
734930f Merge pull request #2284 from pherl/plugin_opt
2e314a6 Add comments about converting directives into PluginName
59cd5d0 Support extra parameters for plugins.
51c5ff8 Fix pure php implementation for 32-bit machine. (#2282)
58580da Merge pull request #2274 from nmittler/gae
c0f95c6 Hacking ByteBufferWriter to work with GAE
9c6940f Merge pull request #2264 from rshin/master
7c913d8 Use -DPROTOBUF_PYTHON_ALLOW_OVERSIZE_PROTOS
df5841f Place Python extensions correctly in Bazel build.
008b5a2 Merge pull request #2254 from JasonLunn/patch-1
9ec7a47 Use git clean before installing via bundler
993d604 Merge pull request #1959 from abergmeier-dsfishlabs/feature/cpp
ad88f90 Merge pull request #2251 from TeBoring/master
686a19c Merge 3.1.x into master.
e28286f Add 32-bit machine test on jenkins. (#2245)
afaa827 Merge pull request #2246 from fweikert/patch-1
c2b3e70 Declare all inputs of protoc action
60d95f3 Fix the bug that message without namespace is not found in the descriptor pool. (#2240)
0321baf Merge pull request #2203 from mrry/msvc_fix
7332ffb JS: Replaced fromCodePoint/codePointAt with fromCharCode/charCodeAt because of functions limited availability, fixed typo in tests.
fd046f6 Merge pull request #2234 from TeBoring/master
daba665 Fix python_cpp test on Mac. Link staticly when building extension, so that the extension doesn't require installing protobuf library. (#2232)
5be6325 Add csharp/build_tools.sh for dist check.
63448e6 Fix compile error for php on Mac.
4f3d20a Fix segmentation fault when ZTS is defined.
1e5d4ba PHP: fix ZTS tsrm_ls errors (#2189)
c96dd66 Add test for php zts build.
447dee1 Prepare jenkins for testing php zts build.
7047761 Do strict enum name checking only for proto3
34cdaf4 Add travis test on Mac for php.
c8bd36e Test php5.5_c test on jenkins
c0719f0 Trigger automated tests for php.
91bbff2 Set up environment for php automated tests.
fd332d1 Add php test script for automated tests.
89db7ce Add script to build Google.Protobuf.Tools for csharp.
f2eeaf7 Added alias getFieldProto3 as used by older generated code.
4a4a162 Fixed references to foreign nested messages with CommonJS-style imports
0bf5482 Fixing inconsistent php version number.
ae9455c Fix MSVC stack overflow issue.
e0a6e52 Add php files for make dist.
17cc42a Update change log for 3.1.0 (#2173)
8db25a2 Force a rebuild of Jenkins docker image.
a41349d php: support 5.5.9 for pecl extension (#2174)
39685f6 Fix VS test failures.
2937c67 Use "appveyor DownloadFile"
b155958 Update php supported version.
9e260a3 Reduce test length to avoid stack overflow on VS.
1c4cf0e Fix python cpp.
460e7dd Fix Visual Studio compile issues.
4cf0722 Fix default instance destructor
f9f3c35 Update version number.
0c78525 Bump library version to 11
e62d1f1 Add back removed descriptor field.
fac876d Modify php api version and minimum supported php version.
9372292 PHP: support 7.0 on PHP implementation (#2162)
f933d10 Update version number.
04d72c2 Fix java compatibilty tests.
9d4657a update files to include php generators
633fdfb Update minimum support php version to 5.5
9526385 Fix bugs for internal integration.
89d8e43 Fix travis, jenkins environment issues.
7fecfdb Added new has_bits.h file to cmake/extract_includes.bat.in (#2152)
f7bb847 Fixed quadratic behavior in JSPB deserialization of repeated fields (#2117) (#2146)
31dd499 Fix bugs for csharp and ruby for internal integration.
23d4688 Fix python bugs for internal integration.
93007e1 Bump library veriosn to 3.1
fe1aaad Fix bugs for internal integration.
15f4db6 Bump version number to 3.1.0-alpha-1.
af62fde Fix for maps_test.js in JavaScript. (#2145)
e3f0689 Fix bugs for internal integration.
cc8ca5b Integrate internal changes
337a028 Merge pull request #2236 from hochhaus/master
b2b6584 Silence compile warnings in bazel
bc3bff1 Fix python_cpp test on Mac. Link staticly when building extension, so that the extension doesn't require installing protobuf library. (#2232)
c0c3aee Merge pull request #2229 from xfxyjwf/fixbuild
431cee6 Remove inexist files from build.
d947308 update files to include php generators (#2165)
b0d62dd Add csharp/build_tools.sh for dist check.
96e2d76 Fix compile error for php on Mac.
75b6988 Fix segmentation fault when ZTS is defined.
52ab3b0 PHP: fix ZTS tsrm_ls errors (#2189)
71e5994 Merge pull request #2193 from acozzette/common-js-fix
60bc203 Merge pull request #2199 from JasonLunn/patch-1
2d897c8 Add test for php zts build.
3a055be Prepare jenkins for testing php zts build.
640c947 Merge pull request #2204 from acozzette/enum-names
149659b Do strict enum name checking only for proto3
858db7a Add travis test on Mac for php.
4d87527 Merge pull request #2218 from thomasvl/xcode8_updates
bcb32c0 Test php5.5_c test on jenkins
297449a Update the ObjC projects for Xcode 8
fe1d0a1 JS: Added string encoding/decoding tests for UTF-8
23f108d JS: Fixed UTF-8 string encoder/decoder for high codepoints.
350d494 Merge pull request #2206 from acozzette/gitignore
dae50dc Trigger automated tests for php.
f17528a Set up environment for php automated tests.
1baaedf Add php test script for automated tests.
25dbc8b Updated .gitignore with Java and JavaScript build artifacts
6005648 Add development dependency requirements
1d2c7b6 Fix MSVC build when HAVE_LONG_LONG is defined.
ee19a7c Remove hanging reference to Gemfile.lock
d94ff41 Delete Gemfile.lock
07f3cab Set platform to "java" under JRuby
b9bad65 Add script to build Google.Protobuf.Tools for csharp.
3b88a4a Merge pull request #2196 from haberman/nodefix
3d598ee Merge pull request #2197 from thomasvl/swift_docs
fb85b43 Drop the swift docs directory (and content).
8b54280 Added alias getFieldProto3 as used by older generated code.
c4d7012 Fixed references to foreign nested messages with CommonJS-style imports
3f59452 Merge pull request #2192 from google/3.0.x
787f3fb Fixing inconsistent php version number.
c531b49 Merge pull request #2181 from google/jtattermusch-patch-2
530eede Update README.md
4d3e4cf Fix MSVC stack overflow issue.
a428e42 Add php files for make dist.
e7269aa Update change log for 3.1.0 (#2173)
87d61e4 Merge pull request #2175 from xfxyjwf/fix_json
5248f61 Force a rebuild of Jenkins docker image.
907a075 php: support 5.5.9 for pecl extension (#2174)
3c88e1b Fix VS test failures.
c454b44 Merge pull request #2171 from xfxyjwf/fix_json
73c8723 Use "appveyor DownloadFile"
18f336b Update php supported version.
f6b4d18 Reduce test length to avoid stack overflow on VS.
411968d Fix python cpp.
37c3d05 Merge pull request #2167 from xfxyjwf/fix_vs
0798d91 Fix Visual Studio compile issues.
3bfc09d Merge pull request #2170 from pherl/3.1.x
f184cb6 Fix default instance destructor
34996c3 Merge branch '3.1.x' of github.com:google/protobuf into 3.1.x
a289d43 Added C++ benchmark. (#1525)
d9ff3ef Merge pull request #2153 from haberman/generatechangelog
8c88762 Update version number.
94bbeb4 Bump library version to 11
1b7a844 Add back removed descriptor field.
9cb812f Modify php api version and minimum supported php version.
11433f7 PHP: support 7.0 on PHP implementation (#2162)
39a2a25 update files to include php generators (#2165)
2649844 Update version number.
5270e93 Fix java compatibilty tests.
923314c update files to include php generators
1bf97d8 Merge pull request #2159 from google/jtattermusch-patch-1
da7c026 Update README.md
ca21b28 Merge pull request #2157 from google/csharp_remove_beta_notice
ca8120c Update README.md
8352d52 Update minimum support php version to 5.5
bee5213 Fix bugs for internal integration.
525c632 Fix hash computation for JRuby's RubyMessage
b8e7e89 Fix travis, jenkins environment issues.
b28ab73 Fix gson dependency. gson 2.3 has internal bug that it doesn't work with some versions of maven.
142e2fa Merge pull request #2035 from sergiocampama/cpp
a2e7364 Added convenient script for generating changelog draft.
e25c56a Merge pull request #2149 from khingblue/remove-obsoleted-project
050c014 Added new has_bits.h file to cmake/extract_includes.bat.in (#2152)
f81d44f Fixed quadratic behavior in JSPB deserialization of repeated fields (#2117) (#2146)
741aa87 Remove obsoleted project of j2me
b9bc990 Fix bugs for csharp and ruby for internal integration.
c8b9d41 Fix python bugs for internal integration.
1af7c4c Fixes static analyzer issues from xcode.
08e9f70 Bump library veriosn to 3.1
22d7248 Fix bugs for internal integration.
4f379f8 Merge pull request #2144 from abscondment/fix-jruby-hash
6cb6bd9 Fix gson dependency. gson 2.3 has internal bug that it doesn't work with some versions of maven.
ebcda12 Bump version number to 3.1.0-alpha-1.
679381f Fix for maps_test.js in JavaScript. (#2145)
05aa0df Fix hash computation for JRuby's RubyMessage
a2c6501 Fix bugs for internal integration.
0dca5a5 Use a custom dictionary to avoid NSNumber operations.
96c469d Remove the custom key functions and just use the system provided defaults.
98835fb Integrate internal changes
7b00595 Merge pull request #2137 from thomasvl/objc_extensions_tweak
6ab51a0 Use a custom dictionary to avoid NSNumber operations.
5904279 Remove the custom key functions and just use the system provided defaults.
b5bbdb0 Merge pull request #2037 from abscondment/fix-2036-ruby-hash
c44ca26 Merge pull request #2130 from kilink/substring-comment-fix
9ac84f8 Fix erroneous comment regarding String.substring
3b001ca Some php engine implementation doesn't have return_value_ptr properly set. Explicitly use &return_value.
c6fa9c7 Auto-generate proto files for tests.
f174d36 Add back missing test proto files.
37e0e1f Merge pull request #2111 from pherl/3.0.x
9c4be5f Merge pull request #2112 from pherl/merge
b4235ac Merge pull request #2123 from thomasvl/objc_better_versioning_take2
1aa6500 Update the ObjC version checks to support a min and current version.
e0e5466 Check in php implementation. (#2052)
683412b Update generated files.
58860c0 Merge remote-tracking branch 'origin/3.0.x' into merge
13d6d17 Fix the version number for 3.0.2
86fcd87 Merge pull request #1765 from mbarbon/master
1affbd8 Merge pull request #2021 from zlim/bench-fix
4f032cd Merge pull request #2100 from vladmos/patch-1
22e7fa6 Merge pull request #2092 from dprotaso/master
5caf516 Resolved a conflict
78aee1b Merge pull request #2044 from wychen/Win32ANSI
643a02b Merge pull request #1636 from yugui/feature/generic-plugin
53387e5 Merge pull request #2090 from guoxiao/find
e90292b Merge pull request #2103 from adrianludwin/fix-gtest
1327e6f Update repo to use google test
7377eb2 Merge pull request #1970 from thomasvl/objc_any_helpers
a86e6d8 Compatibility with the new version of Bazel.
5d35e60 Merge pull request #2094 from thomasvl/update_wkt_comments
57170b9 Merge pull request #2096 from pherl/3.0.x
5699b92 More complete nil/reset tests within a oneof
708296e Fix some constants to be correct for the message class in use.
161b937 Fix error and add note about lossy issues
14e74f6 Support the -Wassign-enum compiler flag. (#2085)
1fc416b Allow the JsonFormat.Parser to ignore unknown fields
a15df74 Merge pull request #2087 from khingblue/fix-unused-param
337ec30 Add ObjC helpers for Any WKT.
82133ba include std::find()
08b1c71 Fix #2032 unused parameter 'deterministic'
4bc1657 Merge pull request #2079 from khingblue/fix-generate-descriptor
30e55ae Merge pull request #2083 from pherl/3.0.x
7645a3d Merge pull request #1884 from hochhaus/valueWriterFn
f9fc56c Fix #2071 replacing /bin/sh with bash
1a58673 Merge pull request #2077 from pherl/3.0.x
e298ce5 Update release date in the change log
74638a2 Merge pull request #2047 from jonathon-love/master
65a595d Merge pull request #2062 from pherl/3.0.2
01d1750 Merge pull request #2061 from pherl/changelog
9b8da10 Rm check on dependency in the C# reflection API (#2051)
96a9d97 Merge pull request #2059 from chih-hung/master
7c3f7c6 Fix #1955 clang-tidy warning misc-macro-parentheses
6e11540 Bump version number to 3.0.2
0c9999f ruby, js and c# changes
a098e80 Merge pull request #1862 from pherl/3.0.0-GA
4041ed4 objc change log
9befe47 Merge pull request #1978 from pherl/cp
9d30a98 Merge pull request #2026 from pherl/cpjs
fa6428e Merge pull request #2045 from mike07026/master
85c1adf Merge pull request #2053 from thomasvl/improve_root_registry_wiring
64958cd Fix to typo/oversight in python tests
a7eaf36 Rename UNICODE to protobuf_UNICODE
13a4124 Make Root's +extensionRegistry generation smarter.
d00cab0 Merge pull request #2039 from khingblue/remove-unused-vector
df6088a detect invaild JSON encoding in bytes field
5a17660 detect invaild JSON encoding in bytes field
e514f23 fix #1342 cause by ownership issues
48811b2 Fix Win32ErrorMessage on Unicode build
11d6cb5 Add test for Win32ErrorMessage
588a803 Support Unicode build on Windows
b964976 Merge pull request #2024 from pstavirs/master
52e491b Use 64-bit protoc binaries in compatibility tests.
8ee6f56 Remove unused vector
de02863 fix #2036: use `rb_hash_*` to accumulate hashes
047419a failing test for #2036:
c0a6a6b Merge pull request #2033 from frett/osgiExport
b6dec9b update the OSGi SymbolicName and ExportedPackage for the javanano library
dd45c0b Merge pull request #2012 from haberman/rubymapgcfix
8c93606 Merge pull request #2031 from thomasvl/dont_require_filegenerators
78a6d31 Speed up ObjC Generation with large dependency trees
e721ce6 Merge pull request #2012 from haberman/rubymapgcfix
8335b7d Fix missing import of jspb.Map (#1885)
3a674ff upb bugfix: JSON map entry keys were passing the wrong closure.
eedc7be Restore New*Callback into google::protobuf namespace since these are used by the service stubs code
7e62773 Merge pull request #1920 from gegles/master
c32b9dd Merge pull request #2018 from thomasvl/support_generate_all
f5c7a48 benchmarks: update readme.txt
4fd4471 Merge pull request #2014 from pherl/fixgmock
2e66a61 Support GenerateAll().
1760feb Update gmock links.
1e6dc7d Update links in appveyor.yml
d4213d8 Ruby: make sure map parsing frames are GC-rooted.
3d9d1a1 Merge pull request #2013 from xfxyjwf/gmock
c4a84ab Update links in appveyor.yml
bba446b Update gmock links.
08951c3 Merge pull request #2011 from tomas-abrahamsson/patch-1
4d04fcd Add an Erlang project, gpb, to third_party.md
b97a4a5 Merge pull request #2001 from nicolasnoble/patch-1
866d3e5 Fixing regular expression...
569d5ce Merge pull request #1997 from thomasvl/move_include_package_into_helpers
290d26b Remove the compiler options from ImportWriter.
93362a5 Move the ImportWriter into the ObjC Helpers.
80f65d2 Add note about JSON tests maybe being wrong. (#1992)
b5794ed Merge pull request #1984 from thomasvl/more_json_tests
7437774 More JSON tests
ff2a660 Adds better support for protos without packages  (#1979)
8b30145 Add a jenkins test status badge.
45d04d0 Merge pull request #1977 from thomasvl/bump_cocoapod_spec
584917f Bump the version in prep for the 3.0.2 tag being cut
564c02f Merge pull request #1975 from pherl/cp
a877fdf Record zero for "has" for proto3 if in a oneof.
116596a Never use strlen on utf8 runs so null characters work.
62f2ff8 Fixes extra whitespace on generated comments. (#1950)
a989501 Adds support for appledoc in generated code.  (#1928)
42ab9b4 Migrating documentation of the ObjectiveC runtime code to appledoc. (#1867)
549dde1 Merge pull request #1967 from sergiocampama/cast
e505098 Adding casts so that code importing protobug using -Wconversion does not generate warnings.
e389165 Add more JSON tests around underscores (#1963)
4763e64 Merge pull request #1957 from xfxyjwf/jenkins_badge
d9ccf4d Merge pull request #1964 from thomasvl/missing_ignores
8156410 Fix up ignores and conformance generation
336ee28 Merge pull request #1960 from jskeet/oneof
f9d93f3 Regenerate conformance files to include extra oneof fields.
bbeb983 Need to expose generated protobuf C++ headers so they can actually be accessed from other libraries.
f8c37b9 Add a jenkins test status badge.
a248420 Fixes extra whitespace on generated comments. (#1950)
cd561dd Merge pull request #1949 from thomasvl/objc_more_reset_tests
ff85a17 More complete nil/reset tests within a oneof
a0df678 Fix some constants to be correct for the message class in use.
17d601a More explicit tests for nil behaviors on fields.
91b6d04 Merge pull request #1942 from thomasvl/objc_fix_oneof_zeros
27c8962 Add more types to the zero oneof cases.
ca5b775 Record zero for "has" for proto3 if in a oneof.
ac3df39 Add conformance test for zero fields in oneofs. (#1939)
30bbbe9 Merge pull request #1934 from thomasvl/objc_strings_with_null
1a6c1d0 Never use strlen on utf8 runs so null characters work.
237f321 Adds support for appledoc in generated code.  (#1928)
56b8f44 Merge pull request #1842 from udnaan/master
32fadc0 Migrating documentation of the ObjectiveC runtime code to appledoc. (#1867)
1102a8a Merge pull request #1923 from bryongloden/patch-1
a375e1a close opened file descriptors properly
e30b7b4 Merge pull request #1924 from PiotrSikora/export_license
f1f30b5 Merge pull request #1926 from hotpxl/master
ddf6d1e [master] Add dependency cl. Fixes google/protobuf#295.
faea19c Bazel: export LICENSE file.
c59473d Merge pull request #1044 from mark-whiting/master
6d134ea Merge pull request #1898 from sergiocampama/watchos
ea081fe Fix missing import of jspb.Map (#1885)
0dca3cc Merge pull request #1865 from podsvirov/topic-cmake-project
dedd8ae Merge pull request #1914 from adamatan/typo-fix
3886860 Typo: beffer -> buffer
cf42b60 Merge pull request #1905 from pherl/fixdoc
eefd1fd CMake: Auto find ZLIB from package config if nedded
3916a0a Add and fix C++ runtime docs
8d8115b Merge pull request #1878 from haberman/rubywkt
e0779d5 Merge pull request #1903 from xfxyjwf/compatibility_tests
3cec2ea Ruby: added custom Struct exception type and fixed Makefile.am.
30647ca Use 64-bit protoc binaries in compatibility tests.
ff46627 Merge pull request #1902 from podsvirov/topic-cmake-extract-includes
7d275ec CMake: remove repeated_field_reflection.h from extract list
00d5a7f Amend the conformance tests to only use Int64/Uint64 non-wrapped values which (#1164)
275db04 Adds watch os deployment target for protobuf
6b3d120 Merge pull request #1887 from sheffatguidance/fix-js-api-documentation
1112989 Merge pull request #1884 from hochhaus/valueWriterFn
915d79e Merge pull request #1895 from google/3.0.0-GA
3ef0756 Merge pull request #1894 from pherl/fixdist
e139117 Add python/setup.cfg into dist files
169d0ca Merge pull request #1893 from google/3.0.0-GA
c479042 Merge pull request #1892 from xfxyjwf/compatibility_tests
baa4023 Run Java compatibility tests on Travis.
f3449e5 Merge pull request #1891 from pherl/python
811674f add setup.cfg for building wheels
42e5487 Merge pull request #1882 from legrosbuffle/fix-check
7e93458 Merge pull request #1888 from pherl/fixbuildzip
6a59ac9 Fix the build-zip.sh to add .exe for win packages.
9a11ab4 Fix Issue #1869: faulty js API documentation
a217408 Fix valueWriterFn variable name
c466f4b Be consistent with the use of CHECK()/ GOOGLE_CHECK().
a207a2b Fix for JRuby (assert_true is not present).
e3094a8 Ruby: added API support for well-known types.
de30c56 Merge pull request #1874 from pherl/buildzip
e3fac65 Change the build.zip.sh to support lite
2662fd3 Merge pull request #1871 from pherl/fixwin
1b1a8f4 Fix build protoc script for windows
33d2b2a CMake: Bugfix for protobuf_MODULE_COMPATIBLE
38c5f2f CMake: Link to ZLIB only if protobuf_WITH_ZLIB enabled
e8ae137 Merge pull request #1864 from pherl/galogs
e7982e4 Fixed Makefile.am for Ruby file rename.
e0d817e Change log for 3.0 GA release.
4e169bf Bring C#'s ToPascalCase method in line with C++. (This still doesn't fix the conformance tests, but at least we're now consistent with the C++ code.)
86535a1 Remove legacy_enum_values flag for GA.
be78976 Merge pull request #1861 from jskeet/fix_to_camel_case
af2fa05 Merge pull request #1859 from jskeet/remove-flag
a8aae89 Bring C#'s ToPascalCase method in line with C++. (This still doesn't fix the conformance tests, but at least we're now consistent with the C++ code.)
e672047 Remove legacy_enum_values flag for GA.
7ba044a Merge pull request #1853 from pherl/3.0.0-GA
7c9c314 fix comments.
0750797 Merge remote-tracking branch 'origin/3.0.0-GA' into 3.0.0-GA
54feb9a Fix the script comments.
b1aac0b Make protoc-artifacts able to build plugin.
032fb91 Merge branch 'master' of github.com:google/protobuf into 3.0.0-GA
154e278 fixed cmake config files install path
b6b521b Merge pull request #1851 from xfxyjwf/cint
12581b4 Fixes traivs cpp build.
234ec01 Merge pull request #1847 from haberman/GAfixes
43b36dd Fixed Makefile.am for Ruby file rename.
f11a4f1 Merge pull request #1841 from pherl/3.0.0-GA
b3b07cd Merge branch 'master' into 3.0.0-GA
ba52f2b Merge pull request #1788 from google/rubypackagecap
c43f718 Merge pull request #1846 from xfxyjwf/zip
97e2026 Added new file to ruby_EXTRA_DIST.
6d92233 Added unit test for PascalCasing package names in Ruby.
6cab568 Ruby: translate package names from snake_case -> PascalCase.
b553b87 Add a script to build protoc zip packages.
b1cecb6 Merge pull request #1837 from haberman/rubygencodename
0973822 remove extra zeros.
5a6c921 Make jruby still depend on beta-4
a17367f Define intX as standard exact-width integer types.
fb7a7c5 Bump version number for GA
4f19797 Ruby: generated foo.proto -> foo_pb.rb instead of foo.rb.
868ea59 Merge pull request #1831 from xfxyjwf/protoc
b6cd9dd Merge pull request #1834 from sergiocampama/framework
44bd6bd Merge pull request #1821 from haberman/rubyfreezestr
d07a996 Ruby: fixed string freezing for JRuby.
9e3c98f Fix maven path.
3a1259c Correctly sets the generate_for_named_framework option after parsing.
0622030 Merge pull request #1830 from xfxyjwf/travis
1b3796c Merge pull request #1829 from xfxyjwf/fixcpp
fdd970e Fix maven links.
9702b9f Keep cpp_distcheck on travis for now.
c2ced9a Remove linux tests from travis.
9009662 Fix sign-comparison warnings in public header files.
16adea3 Add a test to catch sign-comparison warnings.
4ddaad4 Merge pull request #1825 from xfxyjwf/jenkins2
de5236d Merge pull request #1828 from sergiocampama/framework
2ff9349 Fixes the parsing of the proto-framework map file.
20fbb35 Add more tests to jenkins.
2ba058c Merge pull request #1822 from xfxyjwf/java6
ff7f68a Ruby: encode and freeze strings when the are assigned or decoded.
ad49ed7 Update travis tests for Java.
30d8416 Merge pull request #1811 from xfxyjwf/fixdist
a4f68b1 Add missing files in EXTRA_DIST and add a test.
af8732e Merge pull request #1810 from xfxyjwf/versioning
e465f26 Merge pull request #1812 from jskeet/fix-travis
dd3d9d6 Merge pull request #1447 from seishun/defaults
73e0b49 fix debug.dump
deaea21 Use the dotnet-release package feed for Travis.
60cb094 Add files missing from "make dist".
36adb40 Update compatibility tests as well.
2e30301 Versioning Java GeneratedMessage.
e4b129f restore old behavior for toObject
db1b2a0 nits
970a4fd Make implicit defaults consistent with explicit defaults
77b08af Merge pull request #1802 from haberman/jsmapbin
e0e7377 Fix goog.require()/goog.provide() ordering.
24ac9c0 Merge pull request #1803 from xfxyjwf/javadoc
fa52702 Include javadoc/source in Java release packages.
7429b91 JavaScript: move extension binary info to separate struct.
2078f61 Merge remote-tracking branch 'origin/3.0.0-beta-4'
923eae8 JavaScript maps: move binary callbacks out of constructor.
56855f6 Merge pull request #1792 from xfxyjwf/changelog
82b43d1 Remove Java deterministic API.
b6a620d Merge pull request #1801 from thomasvl/oneof_framework_build_issues
2e98ed5 Use public methods to fetch oneofs in generated code.
3d9726f Mention Java lite in the changelog.
b99577c Exposes the currently registered extensions for a message and removes the internal sortedExtensionsInUse
f6d1d1a Uses head version of rvm to avoid shell_update_session not found error (#1791)
1349fb8 Added 3.0.0-beta-4 changelog.
3a8d8ea Merge pull request #1787 from xfxyjwf/steppingstone
1bce70d Fix compatiblity issues.
0b68255 Add missing golden test file.
e1f146b Merge pull request #1785 from jskeet/merge-csharp
b5ce525 Move to dotnet cli for building, and .NET Core (netstandard1.0) as target platform (#1727)
5e0de1e Remove the overload for Add(RepeatedField<T>)
2ee1e52 Optimize AddRange for sequences implementing ICollection
b053b92 Implement RepeatedField.AddRange.
d9334ea Improve exception throwing implementation in collections
10a8fb4 Move to dotnet cli for building, and .NET Core (netstandard1.0) as target platform (#1727)
4e0d051 Merge pull request #1781 from xfxyjwf/update_version
c2ebdec Update version number in AssemblyInfo.cs.
8b659b2 Merge pull request #1783 from xfxyjwf/fixlite
047a3b4 Exclude Java lite module from parent pom.xml
dd37b99 Comment out lite conformance test.
932f94e Update version number to 3.0.0-beta-4
06a0248 Add missing LIBPROTOBUF_EXPORT
7a7913e Add missing LIBPROTOBUF_EXPORT.
443eb27 Update generated files.
9086d96 Integrate from internal code base.
042993b Implement RepeatedField.AddRange (#1733)
8eb90e3 Merge pull request #1778 from yeswalrus/fix-prerelease-version
5520447 Fix a bad variable dereference causing <package>_FIND_VERSION_PRERELEASE to be ignored.
70c1ac7 Merge pull request #1776 from thomasvl/fix_dist
0d079bc Remove the baseline files from the make dist file list.
790e6af Fixed out-of-date documentation for CodedInputStream.ReadEnum. (#1581)
3560cc9 Merge pull request #1702 from lukebakken/csharp-nuget-doc-update
297ec74 Add https://metacpan.org/pod/Google::ProtocolBuffers::Dynamic
8779cba Merge pull request #1764 from jskeet/remove-is-value-type
3df146e Remove unnecessary reflection call
c404c2a Merge pull request #1762 from thomasvl/drop_perf_profiles
8c23655 Drop the performace baselines.
8b00675 Merge pull request #1757 from thomasvl/avoid_importing_src
03d9e09 Merge pull request #1735 from jskeet/attribute-placement
c850ebc Merge pull request #1758 from dago/pathmax2
e9a7fc8 Remove WriteGeneratedTypeAttributes which is a no-op
57638d5 Make sure also Solaris x86 gets PATH_MAX
eaf3451 Merge pull request #1753 from xfxyjwf/fixup
be0d7f6 Don't #import the .m files.
0d5091e Merge pull request #1742 from ottok/fix-spelling
d84d0ca Fix data member declaration order.
a29a9c5 Don't support global ::string in stringpiece.h
c10938a Merge pull request #1752 from acozzette/fix-js-tests
c64d86e Fixed failing JS tests
ec45897 Merge pull request #1712 from dkharrat/swift-error-handling
523bfd4 add nullable qualifier to nil return types
c534845 Changes to generated code from previous commit
ada0a81 Move DebuggerNonUserCodeAttribute to function members
d2ae496 Fix spelling error in function ParseTime parameter
3808d09 Fix spelling in strings and comments
cae3b0c Merge pull request #1704 from lizan/json_parse_options
02b55d2 Merge pull request #1738 from xfxyjwf/fixbuild
e102db1 Fix some failing travis tests.
aeff638 Merge pull request #1710 from chezRong/master
7e8c893 Merge pull request #1723 from thomasvl/objc_test_coverage
454dbf1 added minified JSON formatting functionality with test
2fe0556 Fix windows build.
69cc213 Updated failure_list_java.txt to remove tests that now pass
b83af52 Fixed string formatting in text_format.py to be Python2.6-compatible
d64a2d9 Integrated internal changes from Google
6cfc19e Xcode project cleanup/setup.
c18aa77 Validate the tag numbers when parsing. (#1725)
e0016c5 Merge pull request #1720 from thomasvl/issue_1716
31999a3 Add JsonParseOptions to ignore unknown fields
dc0aeaa Adding conditional compiler symbol to support .NET 3.5 (#1713)
fc4c617 Fix GPBGetMessage{Repeated,Map}Field()
7b5648c Merge pull request #1719 from esteluk/patch-1
3be6110 Fix Objective-C generator option typo
2bcd43a Merge pull request #1714 from dnkoutso/master
37ca94f Get value from text format name in GPBEnumDescriptor
0ab78e1 Merge pull request #1705 from haberman/revjsver
6a6f95d JS package.json: Added author and updated Closure Library version.
6f67be6 Merge pull request #1707 from jskeet/format-value
0421238 Expose JsonFormatter.WriteValue.
1dc6280 Moved all dependencies to devDependencies.
48735cb Add "google" to package.json "files" for WKT.
c4b40a3 Create patch release for JS to include WKT.
8069466 Modify csharp README since there are now two NuGet packages
a897ebb Merge pull request #1700 from jskeet/ordering
a230b5d Rename methods to avoid ObjC KVC collisions. (#1699)
e3f6e2b Remove ordering guarantees in the MapField documentation
1a5333b Adds destination flag to xcodebuild to avoid possible flake errors (#1697)
4f93098 Merge pull request #1666 from yeswalrus/cmake-prerelease-examples
b7560df Merge pull request #1696 from haberman/jswkt
8c20e55 Add new generation option for using proto sources from other frameworks.
104723f Fix tests for CommonJS.
98bd6d7 Merge pull request #1692 from vjpai/friendless
4308cc4 Added plugin.proto to well-known types for JS.
6daf3d2 Address review comments on function name
0e27112 Bugfix: base the require logic on the file being required.
1337486 JS: import well-known types from google-protobuf package.
37eaae2 Remove a friend-class template that is only used for the constructor, and instead create an _internal_only getter that gets the needed information. This is a workaround for a deficiency in gcc-4.4 that does not properly support templated friend classes.
52598c6 Merge pull request #1658 from yeswalrus/cmake-fixup-module
a5e116a Merge pull request #1665 from yeswalrus/cmake-package-requirements
f180ef6 Merge pull request #1683 from thomasvl/third_party_framework
a2a3399 Add support for generation sources into a framework.
f0c1492 Add the CocoaPods integration tests to Travis.
71f4a9c Fixes Xcode 8 analyzer warning saying that it was missing a release in dealloc (#1678)
088c5c4 Merge pull request #1664 from bshaffer/patch-1
4150a91 make protobuf_MSVC_STATIC_RUNTIME a dependent option to reflect it's use.
78b3498 Save the relevant options used to create a package, allow users to reject packages based on them.
5ebcfc1 Fix prerelease version matching to be more consistent with the find_package arguments.
f8a969d proper codeblock in README
fba7976 Merge pull request #879 from mathstuf/support-equals-in-proto-path
cadfbc8 Removed handling for ALIASED targets since they are unused.
401e07d Add GOOGLE_ prefix before PROTOBUF_DEPRECATED_ATTR
b60e615 Fix the undefined behavior for opensource users.
6aa981f Merge pull request #1624 from yeswalrus/cmake-prerelease-versioning
dfe0c9a Merge pull request #1643 from yeswalrus/cmake-examples
ed1d560 Merge pull request #1541 from haberman/conformancestrict
350453f Make surrogate regex even more lenient.
923d2c7 JSON surrogates Python: adjust regex for OSX error message.
23fef56 Replace handwritten protobuf-targets with exported version.
09f6a5c Use ExternalProject_Add to build the examples in a stand-alone fashion.
7155629 CMake project updates
6a61894 Added test for surrogates (valid and invalid).
84a1b60 Added update_failure_list.py.
4833b4c Surrogate checking is unpredictable, so always manually check.
bd98eae Fixed Python by updating failure lists and fixed a few broken tests.
ef7894e Make conformance tests more strict about the failure list.
20b5325 Integrate interanl changes
e34c091 Improving the granularity parsing errors (#1623)
0ab7a7f Merge pull request #1640 from os72/master
5977fb0 Generalize plugin support in Bazel Skylark rule
f6be0d1 Add https://github.com/os72/protobuf-dynamic
0420eab For prerelease versions, require protobuf_FIND_VERSION to be set.
f1091ab Include the prerelease version in the protobuf_VERSION
18a9140 Merge pull request #1625 from yeswalrus/note-versions
cc30be1 Merge pull request #1613 from yeswalrus/cmake-min-version
c461193 Merge pull request #1629 from zhongfq/patch-1
a315bb8 Merge pull request #1614 from yeswalrus/cmake-cleanup
e215828 Merge pull request #1630 from google/beta-3
e845187 Merge pull request #1620 from sergiocampama/cleanup1
4629659 add protobuf as3 lib and code generator for as3
457a297 Remove __PROTOBUF_PACKAGE_PREFIX
61c9696 Update the list of places where the version is stored.
a714c40 Removing unused GPBExceptionMessageKey
40ff94e Merge pull request #1617 from thomasvl/more_warnings
86e8f1f Merge pull request #1604 from jonwallg/repeated_types
38b9e74 Add -Woverriding-method-mismatch.
d13b3d0 remove useless cleanup - config.cmake files are executed in their own context.
c57c6ea Bump to the *real* minimum required version. Setting CMP0022 breaks CMake versions < 2.8.12
04265e4 Remove if(TRUE)
e72805e fix expected class checking in GPBSetMessageRepeatedField
0f27cab Merge pull request #1600 from thomasvl/objc_tighter_warnings
ed87c1f Merge pull request #1586 from davidzchen/python
02cd45c Bazel build: Keep generated sources and Python runtime in the same directory.
c8a440d Add more warnings to for the ObjC runtime build
d089f04 Merge pull request #1595 from thomasvl/objc_travis_tweaks
368a2f4 Automated testing tweaks for ObjC
5d0c2ee Merge pull request #1593 from thomasvl/framework_includes
173daf1 Merge pull request #1589 from hochhaus/master
7da023b Better support for using the proto library from a framework.
2131b2d Merge pull request #1588 from jeffmvr/master
7336092 Add js/binary/encoder.js to js_EXTRA_DIST.
733ef98 added missing closing bracket for _cmakedir_desc in cmake/install.cmake line 88
594ce56 Merge pull request #1578 from wal-rus/cmake-install-namespace
28f35b4 add protobuf:: namespace to installed targets
38e4713 Merge pull request #1523 from xfxyjwf/compatibility_tests
a31d14b Describe platform requirements for the compatibility tests.
5c6518f Merge pull request #1583 from thomasvl/pods_integration_followup
2338e03 Merge pull request #1576 from wal-rus/cmake-versionfile
beca1f5 Merge pull request #1575 from wal-rus/cmake-install-msvc
6c47faa Make the CocoaPods integration tests more robust
02a28a8 Update protobuf-config-version.cmake.in to correctly set the required variables (PACKAGE_VERSION_EXACT, PACKAGE_VERSION_COMPATIBLE, PACKAGE_VERSION_UNSUITABLE)
7d79458 Fix the cmake configuration file install path to be more standards compliant (See the description of cmake's config search behavior on https://cmake.org/cmake/help/v3.4/command/find_package.html)
c034ba7 Merge pull request #1574 from thomasvl/test_schemes
20b5bf6 Add shared schemes for the CocoaPods integration tests
12dffd9 Merge pull request #1572 from thomasvl/podspec_tests_2
16dd477 CocoaPod Integration Tests
cc5296b Merge pull request #1558 from haberman/rubyoneof
daec44f Expand the OS X/Xcode gitignores
2d514ce Fixed oneof behavior for enums and fixed JRuby.
b8ded18 Merge pull request #1561 from pherl/beta-3
d550528 Bump objc podspec version number
431ba4b Merge pull request #1549 from xyzzyz/arena_export
ba696e7 Merge pull request #1547 from xyzzyz/js_generator
cbb9183 Merge pull request #1559 from google/beta-3
545527e Ruby oneofs: return default instead of nil for unset fields.
32e3d7a Merge pull request #1412 from google/internal
6673283 Integrate interanl changes
718eb75 Merge pull request #1548 from anandolee/master
97aa8a0 Merge pull request #1551 from pherl/beta-3
fe06eb6 Fix protoc artifact pom version
b01b1a8 JSON format for Any message must print @type first, use OrderedDict instead of {}
4f630a6 Add compatiblity tests against v2.5.0
810ba9b Export class Arena to shared library.
f2885f6 Fix #include in js_generator.cc
67d2d45 Merge pull request #1546 from pherl/beta-3
b3bb46c Added download_url to be able to upload to pypi.
c8be6ee Merge pull request #1542 from google/beta-3
3470b68 Merge pull request #1540 from pherl/changelog
cf1fd7e Merge pull request #1533 from pherl/mapcomment
0ec34bf Update changes for lite
5e7c4cb Remove the comments about iterator validation
f2db1e0 Merge pull request #1532 from pherl/changelog
034867f Update changelogs for C++ maps
dc49706 Merge pull request #1529 from gkraynov/test-redundant-varint
5c29835 Merge pull request #1528 from pherl/master
b126706 Merge pull request #1527 from haberman/changelog
d346f49 Added release notes for Ruby and JavaScript.
ce7e502 Remove the instructions for pbconfig.h
7b87f77 Merge pull request #1521 from zhangkun83/master
04757db Fix the server id in example
9f84114 Merge pull request #1520 from pherl/hashmapvs2008
325cc42 Merge pull request #1522 from xfxyjwf/compatibility_notice
f9fd450 Merge pull request #1524 from anandolee/master
5d54a85 Test redundant varint fields decoding in JS.
371d341 Merge pull request #1518 from jskeet/move_test
e4ca694 python changes
09732c9 Add compatibility notice for Java.
28cb77f Fine-tune build scripts and better documentation.
e1f588a Merge pull request #1 from google/beta-3
71dd9c4 Merge pull request #1515 from pherl/changelog-beta3
ede9cc4 Update comments for csharp, zero-copy and objc.
19472bf Merge pull request #1512 from pherl/beta-3
017d390 Fix csharp version
dbdf6d9 Bridge vs2008 hashmaps.
5668e2e Fix typo.
920ee73 Merge pull request #1483 from wal-rus/fix-boost-incompatibility
7cc9cb4 Move test for standalone BoolValue to JsonParserTest
cca2d44 Merge pull request #1517 from jhickson/boolvalue
835fb94 Fixed parsing of BoolValue.
2b22b61 Merge remote-tracking branch 'refs/remotes/google/master'
c67879b Merge pull request #1514 from pherl/fix_heap_check
0e4d1ea Initial draft for changelog.
e8737d8 Fix the command line interface unittest again
cdd3ec7 Merge pull request #1513 from pherl/fix-build-protoc
25dd690 Fix protoc build artifact script.
5dea201 Update version numbers for other languages
dbed8a0 Update version numbers for beta3
a1938b2 Merge pull request #1510 from thomasvl/nonnull
4755bdc Declare an init and avoid passing NULL to initWithValue:count:
4c6259b Merge pull request #1498 from thomasvl/build_cleanup
f4bc9e0 Remove confounding and unused #define - breaks boost/predef/other/endian.h
d392ed4 Merge pull request #1502 from pherl/master
ce6bec7 Remove accidentally restored deleted files.
9d0f560 Merge pull request #1494 from pherl/master
76a96d4 Merge pull request #1499 from beardedN5rd/master
2eb774e after comment of Feng Xiao changed the entry to g++
ace2690 Merge pull request #1496 from ozkuran/master
b661fb5 Add the missing maintiner-clean entry for benchmarks
ce2ef0d Properly express all outputs for the conformance build
f367642 Add two missing ignores for conformance directory.
b12f630 updated README
9b3357d Updated README.md
5b5e369 Merge pull request #1471 from jskeet/any-host
f8a5c5f Fix using std::shared_ptr
75e5898 Fix the std::string error introduced in integration.
17b6fc3 Merge pull request #1409 from eeight/fix_enum_corruption
72e162c Merge pull request #1482 from nicolasnoble/rake-tweaks-2
edd2949 Properly generating well known proto files for the macos build.
07bcf21 Merge pull request #1464 from google/benchmarks
7dda312 Merge pull request #1473 from nicolasnoble/rake-tweaks
247ef1f Addressed PR comments.
09f1757 Merge pull request #1467 from pherl/master
236b939 Addressing concerns.
e0df23a Update descritpor protos for objc
aed7b34 Merge pull request #1474 from pherl/fixscript
454d5be Merge the script fix.
cf7e99d Fix cp -r usage to be portable.
1f8b6da Few tweaks to the rakefile to permit native gems compilation with the proto files generation.
b2d4b1a Fixed for pre-C++11 ifstream which does not accept std::string.
49a8918 Read files directly from filesystem since xxd isn't always available.
cb36bde Make the C++ tests build the benchmarking code.
1ce5bd8 Updates for PR comments.
61307b8 Allow custom type URL prefixes in Any.Pack
f86d39c Update file lists.
12fdeb9 Merge branch 'master' of github.com:google/protobuf
cf14183 Down integrate from Google internal.
b53417c Merge pull request #1462 from acozzette/ruby-2.3
30a2f70 Added README describing the directory.
2e83110 Added framework for generating/consuming benchmarking data sets.
cbb6b28 Merge pull request #1461 from thomasvl/fix_bool_handing
3064628 Fix up -hash/-isEqual: for bool storage.
bbb68fe Added dig and bsearch_index to RepeatedField methods forwarded to array
f53f911 Merge pull request #1455 from haberman/updateupb
66f0745 Merge pull request #1454 from thomasvl/enum_defaults
18b6a32 Proper checking of enum with non zero default
d419ca1 Updated upb and simplified ruby code a bit with new upb method.
4057447 Merge pull request #1444 from mbrtargeting/master
385755e Add initial design document for Swift protocol buffers. (#1442)
db93833 Added serialVersionUID to ExtendableMessage.
034294b Merge pull request #1438 from xfxyjwf/docs
f4f9aec Fix bug with silent message corruption in LITE_RUNTIME.
0ad2048 Merge pull request #1416 from cwhipkey/master
8052dc7 Add a docs directory and move the third-party add-ons page here.
462e7fa protoc: support '=' in --proto_path arguments
f00300d Merge pull request #1414 from xyzzyz/googletest
1ccb4ca Merge pull request #1434 from jskeet/regenerate
c588ac4 Regenerate well-known types for C#
e539e98 Merge pull request #1433 from thomasvl/check_wkt
511f28b ObjC support for failing the build in the generated WKTs are out of date
f265fb8 Merge pull request #1401 from jskeet/enum-casing
36978c3 Merge pull request #1417 from seishun/windows2
d90d615 Attempt to fix AppVeyor build by exporting GetEnumValueName
790f4c8 Use the original name in JSON formatting.
84ea2c7 Regenerate all C# code and make it compile
75626ed Add C# codegen changes to enum value names (mostly C++)
1dc8194 Merge pull request #1428 from pherl/master
1b0ff34 Add missing includes in field mask test
52825bf Merge pull request #1426 from thomasvl/fix_comment_typo
e664aa6 Regenerate the WKT to pick up current changes to the proto files.
83a7a5e Merge pull request #1402 from davidzchen/py2and3
3633bcd Fix comment typo
072296f Merge pull request #1422 from pherl/master
1f4f3e2 Update file list to include the missing extension lite file.
7ff229f Support Windows in gulpfile.js
ca9bbd7 Merge pull request #1413 from haberman/updateupb
baf52bd Change protobuf CPP proto generator to support the 'lite' option in proto3.
e67ef3d Bugfix for JSON error case.
800e986 Remove no longer applicable documentation from README.md.
194ad62 Ruby JSON: always accept both camelCase and original field names.
1b912fc Remove googletest.h header from stringprintf.cc
90c7f6e Documented the JSON change and compatibility flags.
94e54b3 Updated upb: picked up legacy JSON flags to help Ruby users migrate.
814685c Merge pull request #1397 from google/internal-merge
3c4ce52 Fix for gulpfile.js.
2a197b3 Use 0 as the default value for all enums, rather than finding the actual enum value name
3ffbdd7 Merge pull request #1400 from jskeet/fix-internal
5ebeefb Add missing PY2AND3 srcs_versions attributes to Python Bazel build targets.
0a902ee Fix to csharp_options - initialize internal_access to false.
2cd79bf Removed duplicated operator delete from merge conflict.
4465daa Merge branch 'master' into internal-merge
667f4a6 Merge pull request #1393 from gvaish/master
1523936 Fix for CommonJS tests.
09292d5 Merge pull request #1392 from anandolee/master
a6e3931 Added support for internal_access for C#
cef46e1 Merge pull request #1390 from jskeet/tidy-up
c612074 sync the Manually integrate changes in google3/third_party
28c5c25 Merge pull request #1391 from thomasvl/string_tweaks
f98d2f5 Updating Xcode Settings to use iOS 9.3
2a18bb5 Add more documentation for csharp_options.h
bfd1c84 Line-wrapping changes only for C# generator code
c9167f2 Error during parsing for invalid UTF-8 instead of dropping dropping data.
f3f5b3f Add tests to ensure we read strings with BOMs so we don't forget about lessons of the past.
89719f0 Merge pull request #1349 from gvaish/master
f3fe75b Merge pull request #1386 from andrewharp/patch-2
74d8b0b Added access_level for types
3b4e7dc Update BUILD
b56b461 Do not link in pthread library for Android builds.
a771c9e Merge pull request #852 from qzix/master
268ce28 Added deprecated option handling for objective-c generator
aeacf51 Merge pull request #1381 from pherl/internal-merge
7630a83 Merge branch 'master' into internal-merge
cba75ad Merge branch 'master' of github.com:google/protobuf
89343d8 Do not use C++11 unicode escape in unittest.
452e2b2 Merge pull request #1353 from keveman/master
cf828de Linking the cpp implementation extension statically with libprotobuf
93811ca Do not let windows.h define min/max macros
3b6df06 Allow bigobj for map_unittest
9d7a172 Merge pull request #1377 from jskeet/remove-duplicate-tests
a293180 Merge pull request #1378 from thomasvl/manual_stream_parsing_helpers
331cee5 Add -position and -isAtEnd for use when manually parsing input streams.
46e088e Remove duplicate test cases.
099ff1e Merge pull request #1369 from jskeet/tools-nuspec
203bb5e Fix re-definition issue of winsock.h and winsock2.h
1bf446c Disable sign-compare warning.
7b1cbbd Fix signed-compare warning.
012ac9a revert unexpected change for py26
bc1f2e7 Fix WIN32 build for map_test.
cbfd9d4 Remove export macros for classes nested in a template class.
81eb84c Merge pull request #1371 from keveman/oversize_protos
1283625 Added an API to allow oversize protos when using C++ extension in Python
5805c2d Fix javanano package
fc7eeda Fix json_format.py in py26
5c63266 Merge pull request #1366 from xyzzyz/int128_ostream
94aa50f Fix breakage of referring to table_ in static func
9e7fa06 Temporarily disable begin is fast test.
dfd4760 Remove duplicate line
ca0461c Introduce a new nuget package, Google.Protobuf.Tools, basically to contain protoc on multiple platforms.
a16c8a5 Merge pull request #1362 from jskeet/tweak_json_name
955841e Replace #include <iostream> with #include <ostream>
0de06f5 Merge branch 'master' of github.com:google/protobuf
3b3c8ab Integrate google internal changes.
a25e996 Merge pull request #1360 from pherl/master
34d0cc2 Merge pull request #1295 from haberman/docker
71e8dca Refactoring of FieldDescriptor
261fde1 Merge pull request #1326 from the-alien/csharp_json_name
a15b916 Merge branch 'master' into docker
e164f10 Use the T() instead of NULL for the default value.
af34538 Merge branch 'master' of https://github.com/google/protobuf into csharp_json_name
6f8dd21 Code review fixes
261ee02 Merge pull request #1358 from thomasvl/travis_tweaks
8d47d78 Mark iOS tests as able to fail.
9240acd Merge pull request #1350 from thomasvl/over_release
3f91744 The message was autoreleased, the -releases are an over release.
8126912 Merge pull request #1345 from smparkes/smparkes/well-known-protos
d5a5732 export well known protos
34eeeff Merge pull request #1344 from topillar/patch-1
64dfb5f Update coded_stream.h
698fa8e Merge pull request #1335 from pradeepg26/master
9209136 Merge pull request #1339 from thomasvl/delay_dispatch_semaphore_creation
bd41a39 Only create the readonlySemaphore on demand.
4d98369 Allow custom URLs for Any in JsonFormat
cab5eae Replace ancient m4/acx_pthread.m4 with m4/ax_pthread.m4
0d32ab3 csharp: add support for the json_name option
5e93384 Merge pull request #1325 from thomasvl/shrink_overhead
79a23c4 Shrink ObjC overhead (generated size and some runtime sizes)
ca3dc15 Merge pull request #1318 from smparkes/smparkes/grpc
44fdead Merge pull request #1291 from sergiocampama/devel
9aea0ef Merge pull request #1312 from petewarden/master
a9244ca add java/util support based on java/util/pom.xml
c71f184 Merge pull request #1278 from smparkes/master
dfaf1aa Merge pull request #1317 from benvanik/patch-1
58f0764 Fixing compilation error when building with emscripten.
ea18866 pass correct args to protoc for java wellknown protos when used as an external repository
bc2d6c2 Merge remote-tracking branch 'upstream/master'
f0c1a86 Added iOS settings to Bazel build
48ebb29 Merge pull request #1299 from tatraian/master
e2fb1d9 Comment has been added to fix (issue #1266)
a8db268 Merge pull request #1309 from thomasvl/leading_special_prop_names
1bf4b38 Fix up handing of fields with leading names that should be all caps.
3dd3238 Merge pull request #1306 from silviulica/master
4573edb Update version to 3.0.0b2.post2
6a8815b Merge pull request #1304 from thomasvl/headerdocs
36650a0 HeaderDoc support in the library and generated sources
f2d3408 Merge pull request #1301 from avgweb/master
ad2d775 Replace StringBuilder with TextWriter in JsonFormatter
9242d9b Merge pull request #1298 from craigcitro/fix_setup
3cc35ad Fix compiling clang/libc++ builds. (Issue: #1266)
0e7c0c2 Add back the namespace_packages arg in setup.py.
e70f925 Merge pull request #1139 from haberman/rubyjsoncamel
67c727c Rearranged and commented files for running under Jenkins.
37663e8 Merge pull request #1292 from haberman/ruby-allow-descriptor
35227b4 Removed the generated Ruby file from Makefile.am.
7d793c1 Disable attempt to use ccache for docker build.
2bda98f Properly report C++ build time.
1ee0fda Use a local Maven repository to avoid network fetches during tests.
513875d Generate well-known types in Ruby extension and prune unneeded proto2 dependencies.
b5a35b4 Adds more information to Objective C error when the expected objc_class_prefix option is missing.
2f3f1de Make Java copy into separate directories so the tests can run concurrently.
38bc155 Added code to generate XML output file for more granular results.
ffc8118 Added Ruby 2.1, Oracle Java, and C#.
78f9b68 Upgrade Python packages using pip.
f6153b5 Work around tox bug.
b28b3f6 Configure ccache directory.
d08c39c Put Maven in batch mode to avoid spamming the logs.
483533d Install Python deps in Docker image.
0b931bc Add another test (javanano), but run it in parallel.
0f8c25d Properly add JDK deps in the Docker image.
738393b Try running multiple tests in a row.
d33e93b Added ccache support.
57be1d7 Added some initial shell scripts and docker file.
7810589 Merge pull request #1260 from legrosbuffle/master
584233b Merge pull request #1287 from jskeet/fix-typo
f222a9a Fix copy/paste typo in CodedInputStreamTest
52f62e3 Merge pull request #1274 from murgatroid99/node_relative_requires
9f775a8 Merge pull request #1286 from jskeet/idisposable
c0cf71b Implement IDisposable for CodedInputStream and CodedOutputStream
60a0d41 Merge pull request #1233 from davidzchen/python-path
985c968 Remove hack for building Python support with Bazel.
fb714b3 Merge pull request #1275 from keveman/grpc_support
f5c7363 Fixed grpc C++ plugin support.
c9f8a1b Moved CommonJS-specific files into commonjs directory
a862b6b Fix CommonJS relative require generation, and test it
cc775f7 Merge pull request #1259 from silviulica/master
fc51bdc Merge pull request #1268 from keveman/grpc_support
cb39204 Updated library generation with iOS options
f0966a7 Added grpc plugin support to cc_proto_library.
8f67b16 Merge pull request #1267 from jskeet/vs2015
513a8a6 Merge pull request #804 from bsilver8192/master
4237146 Require VS2015 in the solution file
32daf51 Merge pull request #1215 from haberman/commonjs
24c5424 Added a bit more to README.md, and allowed custom PROTOC var in tests.
894c4d6 Merge pull request #1257 from thomasvl/objc_generics
b3d802d Make cpp generated enum constants constexpr when Options::proto_h is specified.
786f80f Add a modified patch from craigcitro@ to handle namespace sharing.
c003abb Merge pull request #1240 from jskeet/validate_group
4ab9186 Merge pull request #1258 from haberman/releasenotes
81e75c1 Some fixes for the most recent release notes.
f654d49 Updated upb from latest changes.
2480acb Support ObjC Generic Collections
78da666 Changed Ruby to properly camelCase its JSON by default.
907ad4a Properly camelCase when translating to CommonJS.
29d58d3 Removed unused directives from tests that aren't run under CommonJS.
c348af2 Addressed more code review comments.
7726cd2 Integrate review comments.
5195b7f Greatly expanded README.md.
59ea500 Use "node" as binary instead of "nodejs".
35298f9 Fixed definition of extensions, and added CommonJS tests to Travis.
77af5d0 Fixed nested message scopes for CommonJS.
d6a186a Added some documentation in comments.
9e60036 Moved CommonJS-specific files to commonjs/.
e9f31ee CommonJS tests are now passing.
55cc3aa WIP.
9ab11c6 Merge pull request #1255 from thomasvl/mark_os_x_python_cpp_failing
e0dd14c List python_cpp as failing on OS X
507213b Merge pull request #1254 from thomasvl/disable_xctool_updates
8c78450 Disable the xctool updates
abc09f7 Merge pull request #1239 from jskeet/call_generate_protos
c40f8c1 Merge pull request #1229 from keveman/unlimited_binary_proto
61e8e21 Merge pull request #1241 from jskeet/more-merge-wrapper-tests
d41db75 Merge pull request #260 from ejsd1989/issue-#242
8fc045d Merge pull request #1224 from google/rubysentinel
99a3e30 Added PROTOBUF_PYTHON_ALLOW_OVERSIZE_PROTOS macro and setting it when --allow_oversize_protos=true is passed to bazel build. When this macro is set, SetTotalBytesLimit is called to remove the 64MB limit on binary protos when during ParseFromString.
7cf5b81 Merge pull request #1247 from thomasvl/xctool_plain_output
efca368 Move the xctool use of -reporter into a common spot and always use "plain" to get more readable logs on travis.
ee819ea Merge pull request #1245 from thomasvl/tweak_xctool_ios_run
30e645b Tweak the xctool run for iOS tests to try and sort out flake
7d1cc10 Merge pull request #1244 from thomasvl/bump_xcode_version
1324119 Bump up travis to Xcode 7.2
0262e04 Add more tests around merging wrappers
9bdc848 Validate that end-group tags match their corresponding start-group tags
957e877 Generate C# code whenever descriptor.proto changes
69ac430 Removed 'optional' from proto3 syntax file.
fd1c289 Adding missing generic gcc 64-bit atomicops.
ff156e4 Add atomics support for 32-bit PPC.
914605c Removal of null check
a1c5e45 Removal of null check

Change-Id: Id88028efe92b49fd68a02de01e4f991765798c40
git-subtree-dir: third_party/protobuf
git-subtree-split: 48cb18e5c419ddd23d9badcfe4e9df7bde1979b2
diff --git a/benchmarks/Makefile.am b/benchmarks/Makefile.am
new file mode 100644
index 0000000..3ae14ff
--- /dev/null
+++ b/benchmarks/Makefile.am
@@ -0,0 +1,519 @@
+benchmarks_protoc_inputs_benchmark_wrapper =                               \
+	benchmarks.proto
+
+benchmarks_protoc_inputs =                                                 \
+	datasets/google_message1/proto3/benchmark_message1_proto3.proto
+
+benchmarks_protoc_inputs_proto2 =                                          \
+	datasets/google_message1/proto2/benchmark_message1_proto2.proto          \
+	datasets/google_message2/benchmark_message2.proto                        \
+	datasets/google_message3/benchmark_message3.proto                        \
+	datasets/google_message3/benchmark_message3_1.proto                      \
+	datasets/google_message3/benchmark_message3_2.proto                      \
+	datasets/google_message3/benchmark_message3_3.proto                      \
+	datasets/google_message3/benchmark_message3_4.proto                      \
+	datasets/google_message3/benchmark_message3_5.proto                      \
+	datasets/google_message3/benchmark_message3_6.proto                      \
+	datasets/google_message3/benchmark_message3_7.proto                      \
+	datasets/google_message3/benchmark_message3_8.proto                      \
+	datasets/google_message4/benchmark_message4.proto                        \
+	datasets/google_message4/benchmark_message4_1.proto                      \
+	datasets/google_message4/benchmark_message4_2.proto                      \
+	datasets/google_message4/benchmark_message4_3.proto
+
+make_tmp_dir:
+	mkdir -p 'tmp/java/src/main/java'
+	touch make_tmp_dir
+
+# We have to cd to $(srcdir) before executing protoc because $(protoc_inputs) is
+# relative to srcdir, which may not be the same as the current directory when
+# building out-of-tree.
+protoc_middleman: make_tmp_dir $(top_srcdir)/src/protoc$(EXEEXT) $(benchmarks_protoc_inputs) $(well_known_type_protoc_inputs) $(benchmarks_protoc_inputs_benchmark_wrapper)
+	oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --cpp_out=$$oldpwd/cpp --java_out=$$oldpwd/tmp/java/src/main/java --python_out=$$oldpwd/tmp $(benchmarks_protoc_inputs) $(benchmarks_protoc_inputs_benchmark_wrapper) )
+	touch protoc_middleman
+
+protoc_middleman2:  make_tmp_dir $(top_srcdir)/src/protoc$(EXEEXT) $(benchmarks_protoc_inputs_proto2) $(well_known_type_protoc_inputs)
+	oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --cpp_out=$$oldpwd/cpp --java_out=$$oldpwd/tmp/java/src/main/java --python_out=$$oldpwd/tmp $(benchmarks_protoc_inputs_proto2) )
+	touch protoc_middleman2
+
+all_data = $$(find $(srcdir) -type f -name "dataset.*.pb" -not -path "./tmp/*")
+
+############# CPP RULES ##############
+
+benchmarks_protoc_outputs =                                                \
+	cpp/benchmarks.pb.cc                                                     \
+	cpp/datasets/google_message1/proto3/benchmark_message1_proto3.pb.cc
+
+benchmarks_protoc_outputs_header =                                         \
+	cpp/benchmarks.pb.h                                                      \
+	cpp/datasets/google_message1/proto3/benchmark_message1_proto3.pb.h
+
+benchmarks_protoc_outputs_proto2_header =                                  \
+	cpp/datasets/google_message1/proto2/benchmark_message1_proto2.pb.h       \
+	cpp/datasets/google_message2/benchmark_message2.pb.h                     \
+	cpp/datasets/google_message3/benchmark_message3.pb.h                     \
+	cpp/datasets/google_message3/benchmark_message3_1.pb.h                   \
+	cpp/datasets/google_message3/benchmark_message3_2.pb.h                   \
+	cpp/datasets/google_message3/benchmark_message3_3.pb.h                   \
+	cpp/datasets/google_message3/benchmark_message3_4.pb.h                   \
+	cpp/datasets/google_message3/benchmark_message3_5.pb.h                   \
+	cpp/datasets/google_message3/benchmark_message3_6.pb.h                   \
+	cpp/datasets/google_message3/benchmark_message3_7.pb.h                   \
+	cpp/datasets/google_message3/benchmark_message3_8.pb.h                   \
+	cpp/datasets/google_message4/benchmark_message4.pb.h                     \
+	cpp/datasets/google_message4/benchmark_message4_1.pb.h                   \
+	cpp/datasets/google_message4/benchmark_message4_2.pb.h                   \
+	cpp/datasets/google_message4/benchmark_message4_3.pb.h
+
+benchmarks_protoc_outputs_proto2 =                                         \
+	cpp/datasets/google_message1/proto2/benchmark_message1_proto2.pb.cc      \
+	cpp/datasets/google_message2/benchmark_message2.pb.cc                    \
+	cpp/datasets/google_message3/benchmark_message3.pb.cc                    \
+	cpp/datasets/google_message3/benchmark_message3_1.pb.cc                  \
+	cpp/datasets/google_message3/benchmark_message3_2.pb.cc                  \
+	cpp/datasets/google_message3/benchmark_message3_3.pb.cc                  \
+	cpp/datasets/google_message3/benchmark_message3_4.pb.cc                  \
+	cpp/datasets/google_message3/benchmark_message3_5.pb.cc                  \
+	cpp/datasets/google_message3/benchmark_message3_6.pb.cc                  \
+	cpp/datasets/google_message3/benchmark_message3_7.pb.cc                  \
+	cpp/datasets/google_message3/benchmark_message3_8.pb.cc                  \
+	cpp/datasets/google_message4/benchmark_message4.pb.cc                    \
+	cpp/datasets/google_message4/benchmark_message4_1.pb.cc                  \
+	cpp/datasets/google_message4/benchmark_message4_2.pb.cc                  \
+	cpp/datasets/google_message4/benchmark_message4_3.pb.cc
+
+
+$(benchmarks_protoc_outputs): protoc_middleman
+$(benchmarks_protoc_outputs_header): protoc_middleman
+$(benchmarks_protoc_outputs_proto2): protoc_middleman2
+$(benchmarks_protoc_outputs_proto2_header): protoc_middleman2
+
+initialize_submodule:
+	oldpwd=`pwd`
+	cd $(top_srcdir)/third_party
+	git submodule update --init -r
+	cd $(top_srcdir)/third_party/benchmark && cmake -DCMAKE_BUILD_TYPE=Release && make
+	cd $$oldpwd
+	touch initialize_submodule
+
+$(top_srcdir)/third_party/benchmark/src/libbenchmark.a: initialize_submodule
+
+AM_CXXFLAGS = $(NO_OPT_CXXFLAGS) $(PROTOBUF_OPT_FLAG) -Wall -Wwrite-strings -Woverloaded-virtual -Wno-sign-compare
+
+bin_PROGRAMS = cpp-benchmark
+
+cpp_benchmark_LDADD = $(top_srcdir)/src/libprotobuf.la $(top_srcdir)/third_party/benchmark/src/libbenchmark.a
+cpp_benchmark_SOURCES = cpp/cpp_benchmark.cc
+cpp_benchmark_CPPFLAGS = -I$(top_srcdir)/src -I$(srcdir)/cpp -I$(top_srcdir)/third_party/benchmark/include
+# Explicit deps because BUILT_SOURCES are only done before a "make all/check"
+# so a direct "make test_cpp" could fail if parallel enough.
+# See: https://www.gnu.org/software/automake/manual/html_node/Built-Sources-Example.html#Recording-Dependencies-manually
+cpp/cpp_benchmark-cpp_benchmark.$(OBJEXT): $(benchmarks_protoc_outputs) $(benchmarks_protoc_outputs_proto2) $(benchmarks_protoc_outputs_header) $(benchmarks_protoc_outputs_proto2_header) $(top_srcdir)/src/libprotobuf.la $(top_srcdir)/third_party/benchmark/src/libbenchmark.a
+cpp/benchmark-cpp_benchmark.$(OBJEXT): $(benchmarks_protoc_outputs) $(benchmarks_protoc_outputs_proto2) $(benchmarks_protoc_outputs_header) $(benchmarks_protoc_outputs_proto2_header) $(top_srcdir)/src/libprotobuf.la $(top_srcdir)/third_party/benchmark/src/libbenchmark.a
+nodist_cpp_benchmark_SOURCES =                                             \
+	$(benchmarks_protoc_outputs)                                             \
+	$(benchmarks_protoc_outputs_proto2)                                      \
+	$(benchmarks_protoc_outputs_proto2_header)                               \
+	$(benchmarks_protoc_outputs_header)
+
+cpp: protoc_middleman protoc_middleman2 cpp-benchmark initialize_submodule
+	./cpp-benchmark $(all_data)
+
+############ CPP RULES END ############
+
+############# JAVA RULES ##############
+
+java_benchmark_testing_files =                                      \
+	java/src/main/java/com/google/protobuf/ProtoCaliperBenchmark.java
+
+javac_middleman: $(java_benchmark_testing_files) protoc_middleman protoc_middleman2
+	cp -r $(srcdir)/java tmp && cd tmp/java &&  mvn clean compile assembly:single
+	cd ../..
+	@touch javac_middleman
+
+java-benchmark: javac_middleman
+	@echo "Writing shortcut script java-benchmark..."
+	@echo '#! /bin/bash' > java-benchmark
+	@echo 'all_data=""' >> java-benchmark
+	@echo 'conf=()' >> java-benchmark
+	@echo 'data_files=""' >> java-benchmark
+	@echo 'for arg in $$@; do if [[ $${arg:0:1} == "-" ]]; then conf+=($$arg); else data_files+="$$arg,"; fi; done' >> java-benchmark
+	@echo 'java -cp '"tmp/java/target/*.jar"' com.google.caliper.runner.CaliperMain com.google.protobuf.ProtoCaliperBenchmark -i runtime '"\\"  >> java-benchmark
+	@echo '-b serializeToByteString,serializeToByteArray,serializeToMemoryStream,'"\\"  >> java-benchmark
+	@echo 'deserializeFromByteString,deserializeFromByteArray,deserializeFromMemoryStream '"\\" >> java-benchmark
+	@echo '-DdataFile=$${data_files:0:-1} $${conf[*]}' >> java-benchmark
+	@chmod +x java-benchmark
+
+java: protoc_middleman protoc_middleman2 java-benchmark
+	./java-benchmark $(all_data)
+
+############# JAVA RULES END ##############
+
+
+############# PYTHON RULES ##############
+
+python_add_init: protoc_middleman protoc_middleman2
+	all_file=`find tmp -type f -regex '.*\.py'` &&                   \
+	for file in $${all_file[@]}; do                                  \
+		path="$${file%/*}";                                            \
+		while true; do                                                 \
+			touch "$$path/__init__.py" && chmod +x "$$path/__init__.py"; \
+			if [[ $$path != *"/"* ]]; then break; fi;                    \
+			path=$${path%/*};                                            \
+		done                                                           \
+	done
+
+python_cpp_pkg_flags = `pkg-config --cflags --libs python`
+
+lib_LTLIBRARIES = libbenchmark_messages.la
+libbenchmark_messages_la_SOURCES = python/python_benchmark_messages.cc
+libbenchmark_messages_la_LIBADD = $(top_srcdir)/src/.libs/libprotobuf.la
+libbenchmark_messages_la_LDFLAGS = -version-info 1:0:0 -export-dynamic
+libbenchmark_messages_la_CPPFLAGS = -I$(top_srcdir)/src -I$(srcdir)/cpp $(python_cpp_pkg_flags)
+libbenchmark_messages_la-python_benchmark_messages.$(OBJEXT): $(benchmarks_protoc_outputs_header) $(benchmarks_protoc_outputs_proto2_header) $(benchmarks_protoc_outputs) $(benchmarks_protoc_outputs_proto2)
+nodist_libbenchmark_messages_la_SOURCES =                         \
+	$(benchmarks_protoc_outputs)                                    \
+	$(benchmarks_protoc_outputs_proto2)                             \
+	$(benchmarks_protoc_outputs_proto2_header)                      \
+	$(benchmarks_protoc_outputs_header)
+
+python-pure-python-benchmark: python_add_init
+	@echo "Writing shortcut script python-pure-python-benchmark..."
+	@echo '#! /bin/bash' > python-pure-python-benchmark
+	@echo export LD_LIBRARY_PATH=$(top_srcdir)/src/libprotobuf.la >> python-pure-python-benchmark
+	@echo export DYLD_LIBRARY_PATH=$(top_srcdir)/src/libprotobuf.la >> python-pure-python-benchmark
+	@echo export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=\'python\' >> python-pure-python-benchmark
+	@echo cp $(srcdir)/python/py_benchmark.py tmp >> python-pure-python-benchmark
+	@echo python tmp/py_benchmark.py '$$@' >> python-pure-python-benchmark
+	@chmod +x python-pure-python-benchmark
+
+python-cpp-reflection-benchmark: python_add_init
+	@echo "Writing shortcut script python-cpp-reflection-benchmark..."
+	@echo '#! /bin/bash' > python-cpp-reflection-benchmark
+	@echo export LD_LIBRARY_PATH=$(top_srcdir)/src/libprotobuf.la >> python-cpp-reflection-benchmark
+	@echo export DYLD_LIBRARY_PATH=$(top_srcdir)/src/libprotobuf.la >> python-cpp-reflection-benchmark
+	@echo export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=\'cpp\' >> python-cpp-reflection-benchmark
+	@echo cp $(srcdir)/python/py_benchmark.py tmp >> python-cpp-reflection-benchmark
+	@echo python tmp/py_benchmark.py '$$@' >> python-cpp-reflection-benchmark
+	@chmod +x python-cpp-reflection-benchmark
+
+python-cpp-generated-code-benchmark: python_add_init libbenchmark_messages.la
+	@echo "Writing shortcut script python-cpp-generated-code-benchmark..."
+	@echo '#! /bin/bash' > python-cpp-generated-code-benchmark
+	@echo export LD_LIBRARY_PATH=$(top_srcdir)/src/libprotobuf.la >> python-cpp-generated-code-benchmark
+	@echo export DYLD_LIBRARY_PATH=$(top_srcdir)/src/libprotobuf.la >> python-cpp-generated-code-benchmark
+	@echo export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=\'cpp\' >> python-cpp-generated-code-benchmark
+	@echo cp $(srcdir)/python/py_benchmark.py tmp >> python-cpp-generated-code-benchmark
+	@echo python tmp/py_benchmark.py --cpp_generated '$$@' >> python-cpp-generated-code-benchmark
+	@chmod +x python-cpp-generated-code-benchmark
+
+python-pure-python: python-pure-python-benchmark
+	./python-pure-python-benchmark $(all_data)
+
+python-cpp-reflection: python-cpp-reflection-benchmark
+	./python-cpp-reflection-benchmark $(all_data)
+
+python-cpp-generated-code: python-cpp-generated-code-benchmark
+	./python-cpp-generated-code-benchmark $(all_data)
+
+############# PYTHON RULES END ##############
+
+############# GO RULES BEGIN ##############
+
+benchmarks_protoc_inputs_proto2_message1 =                                 \
+	datasets/google_message1/proto2/benchmark_message1_proto2.proto
+
+benchmarks_protoc_inputs_proto2_message2 =                                 \
+	datasets/google_message2/benchmark_message2.proto
+
+benchmarks_protoc_inputs_proto2_message3 =                                 \
+	datasets/google_message3/benchmark_message3.proto                        \
+	datasets/google_message3/benchmark_message3_1.proto                      \
+	datasets/google_message3/benchmark_message3_2.proto                      \
+	datasets/google_message3/benchmark_message3_3.proto                      \
+	datasets/google_message3/benchmark_message3_4.proto                      \
+	datasets/google_message3/benchmark_message3_5.proto                      \
+	datasets/google_message3/benchmark_message3_6.proto                      \
+	datasets/google_message3/benchmark_message3_7.proto                      \
+	datasets/google_message3/benchmark_message3_8.proto
+
+benchmarks_protoc_inputs_proto2_message4 =                                 \
+	datasets/google_message4/benchmark_message4.proto                        \
+	datasets/google_message4/benchmark_message4_1.proto                      \
+	datasets/google_message4/benchmark_message4_2.proto                      \
+	datasets/google_message4/benchmark_message4_3.proto
+
+go_protoc_middleman: make_tmp_dir $(top_srcdir)/src/protoc$(EXEEXT) $(benchmarks_protoc_inputs) $(well_known_type_protoc_inputs) $(benchmarks_protoc_inputs_proto2_message1) $(benchmarks_protoc_inputs_proto2_message2) $(benchmarks_protoc_inputs_proto2_message3) $(benchmarks_protoc_inputs_proto2_message4) $(well_known_type_protoc_inputs)
+	oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --go_out=$$oldpwd/tmp $(benchmarks_protoc_inputs) )
+	oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --go_out=$$oldpwd/tmp $(benchmarks_protoc_inputs_benchmark_wrapper) )
+	oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --go_out=$$oldpwd/tmp $(benchmarks_protoc_inputs_proto2_message1) )
+	oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --go_out=$$oldpwd/tmp $(benchmarks_protoc_inputs_proto2_message2) )
+	oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --go_out=$$oldpwd/tmp $(benchmarks_protoc_inputs_proto2_message3) )
+	oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --go_out=$$oldpwd/tmp $(benchmarks_protoc_inputs_proto2_message4) )
+	touch go_protoc_middleman
+
+go-benchmark: go_protoc_middleman 
+	@echo "Writing shortcut script go-benchmark..."
+	@echo '#! /bin/bash' > go-benchmark
+	@echo 'cd $(srcdir)/go' >> go-benchmark
+	@echo 'all_data=""' >> go-benchmark
+	@echo 'conf=()' >> go-benchmark
+	@echo 'data_files=()' >> go-benchmark
+	@echo 'for arg in $$@; do if [[ $${arg:0:1} == "-" ]]; then conf+=($$arg); else data_files+=("../$$arg"); fi; done' >> go-benchmark
+	@echo 'go test -bench=. $${conf[*]} -- $${data_files[*]}' >> go-benchmark
+	@echo 'cd ..' >> go-benchmark
+	@chmod +x go-benchmark
+
+go: go_protoc_middleman go-benchmark 
+	./go-benchmark $(all_data)
+
+############# GO RULES END ##############
+
+############# GOGO RULES BEGIN ############
+
+cpp_no_group_benchmarks_protoc_outputs_header =                             \
+	gogo/cpp_no_group/benchmarks.pb.h                                         \
+	gogo/cpp_no_group/datasets/google_message1/proto3/benchmark_message1_proto3.pb.h
+
+cpp_no_group_benchmarks_protoc_outputs =                                    \
+	gogo/cpp_no_group/benchmarks.pb.cc                                        \
+	gogo/cpp_no_group/datasets/google_message1/proto3/benchmark_message1_proto3.pb.cc
+
+cpp_no_group_benchmarks_protoc_outputs_proto2_header =                      \
+	gogo/cpp_no_group/datasets/google_message1/proto2/benchmark_message1_proto2.pb.h \
+	gogo/cpp_no_group/datasets/google_message2/benchmark_message2.pb.h        \
+	gogo/cpp_no_group/datasets/google_message3/benchmark_message3.pb.h        \
+	gogo/cpp_no_group/datasets/google_message3/benchmark_message3_1.pb.h      \
+	gogo/cpp_no_group/datasets/google_message3/benchmark_message3_2.pb.h      \
+	gogo/cpp_no_group/datasets/google_message3/benchmark_message3_3.pb.h      \
+	gogo/cpp_no_group/datasets/google_message3/benchmark_message3_4.pb.h      \
+	gogo/cpp_no_group/datasets/google_message3/benchmark_message3_5.pb.h      \
+	gogo/cpp_no_group/datasets/google_message3/benchmark_message3_6.pb.h      \
+	gogo/cpp_no_group/datasets/google_message3/benchmark_message3_7.pb.h      \
+	gogo/cpp_no_group/datasets/google_message3/benchmark_message3_8.pb.h      \
+	gogo/cpp_no_group/datasets/google_message4/benchmark_message4.pb.h        \
+	gogo/cpp_no_group/datasets/google_message4/benchmark_message4_1.pb.h      \
+	gogo/cpp_no_group/datasets/google_message4/benchmark_message4_2.pb.h      \
+	gogo/cpp_no_group/datasets/google_message4/benchmark_message4_3.pb.h
+
+cpp_no_group_benchmarks_protoc_outputs_proto2 =                             \
+	gogo/cpp_no_group/datasets/google_message1/proto2/benchmark_message1_proto2.pb.cc \
+	gogo/cpp_no_group/datasets/google_message2/benchmark_message2.pb.cc       \
+	gogo/cpp_no_group/datasets/google_message3/benchmark_message3.pb.cc       \
+	gogo/cpp_no_group/datasets/google_message3/benchmark_message3_1.pb.cc     \
+	gogo/cpp_no_group/datasets/google_message3/benchmark_message3_2.pb.cc     \
+	gogo/cpp_no_group/datasets/google_message3/benchmark_message3_3.pb.cc     \
+	gogo/cpp_no_group/datasets/google_message3/benchmark_message3_4.pb.cc     \
+	gogo/cpp_no_group/datasets/google_message3/benchmark_message3_5.pb.cc     \
+	gogo/cpp_no_group/datasets/google_message3/benchmark_message3_6.pb.cc     \
+	gogo/cpp_no_group/datasets/google_message3/benchmark_message3_7.pb.cc     \
+	gogo/cpp_no_group/datasets/google_message3/benchmark_message3_8.pb.cc     \
+	gogo/cpp_no_group/datasets/google_message4/benchmark_message4.pb.cc       \
+	gogo/cpp_no_group/datasets/google_message4/benchmark_message4_1.pb.cc     \
+	gogo/cpp_no_group/datasets/google_message4/benchmark_message4_2.pb.cc     \
+	gogo/cpp_no_group/datasets/google_message4/benchmark_message4_3.pb.cc
+
+$(cpp_no_group_benchmarks_protoc_outputs): cpp_no_group_protoc_middleman
+$(cpp_no_group_benchmarks_protoc_outputs_header): cpp_no_group_protoc_middleman
+$(cpp_no_group_benchmarks_protoc_outputs_proto2): cpp_no_group_protoc_middleman
+$(cpp_no_group_benchmarks_protoc_outputs_proto2_header): cpp_no_group_protoc_middleman
+
+generate_cpp_no_group_benchmark_code:
+	cp $(srcdir)/cpp/cpp_benchmark.cc gogo/cpp_no_group/cpp_benchmark.cc
+	sed -i -e "s/\#include \"datasets/\#include \"gogo\/cpp_no_group\/datasets/g" gogo/cpp_no_group/cpp_benchmark.cc
+	sed -i -e "s/\#include \"benchmarks.pb.h/\#include \"gogo\/cpp_no_group\/benchmarks.pb.h/g" gogo/cpp_no_group/cpp_benchmark.cc  
+	touch generate_cpp_no_group_benchmark_code
+	
+bin_PROGRAMS += cpp-no-group-benchmark
+cpp_no_group_benchmark_LDADD = $(top_srcdir)/src/libprotobuf.la $(top_srcdir)/third_party/benchmark/src/libbenchmark.a
+cpp_no_group_benchmark_SOURCES = gogo/cpp_no_group/cpp_benchmark.cc
+cpp_no_group_benchmark_CPPFLAGS = -I$(top_srcdir)/src -I$(srcdir)/gogo/cpp_no_group -I$(top_srcdir)/third_party/benchmark/include
+# Explicit deps because BUILT_SOURCES are only done before a "make all/check"
+# so a direct "make test_cpp" could fail if parallel enough.
+# See: https://www.gnu.org/software/automake/manual/html_node/Built-Sources-Example.html#Recording-Dependencies-manually
+gogo/cpp_no_group/cpp_no_group_benchmark-cpp_benchmark.$(OBJEXT): $(cpp_no_group_benchmarks_protoc_outputs) $(cpp_no_group_benchmarks_protoc_outputs_proto2) $(cpp_no_group_benchmarks_protoc_outputs_header) \
+	$(cpp_no_group_benchmarks_protoc_outputs_proto2_header) $(top_srcdir)/third_party/benchmark/src/libbenchmark.a generate_cpp_no_group_benchmark_code
+gogo/cpp_no_group/cpp_benchmark.cc: generate_cpp_no_group_benchmark_code
+nodist_cpp_no_group_benchmark_SOURCES =                                    \
+	$(cpp_no_group_benchmarks_protoc_outputs_proto2)                         \
+	$(cpp_no_group_benchmarks_protoc_outputs)                                \
+	$(cpp_no_group_benchmarks_protoc_outputs_header)                         \
+	$(cpp_no_group_benchmarks_protoc_outputs_proto2_header)
+
+cpp_no_group: cpp_no_group_protoc_middleman generate_gogo_data cpp-no-group-benchmark
+	./cpp-no-group-benchmark $(gogo_data)
+ 
+gogo_proto_middleman: protoc-gen-gogoproto
+	mkdir -p "tmp/gogo_proto"
+	oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I$(srcdir) -I$(top_srcdir) --plugin=protoc-gen-gogoproto --gogoproto_out=$$oldpwd/tmp/gogo_proto $(benchmarks_protoc_inputs) $(benchmarks_protoc_inputs_benchmark_wrapper) $(benchmarks_protoc_inputs_proto2) )
+	touch gogo_proto_middleman
+
+new_data = $$(for data in $(all_data); do echo "tmp$${data\#$(srcdir)}"; done | xargs)
+
+generate_gogo_data: protoc_middleman protoc_middleman2 gogo-data-scrubber
+	mkdir -p `dirname $(new_data)`
+	./gogo-data-scrubber $(all_data) $(new_data)
+	touch generate_gogo_data
+	
+make_tmp_dir_gogo:
+	mkdir -p tmp/go_no_group/benchmark_code
+	mkdir -p tmp/gogofast/benchmark_code
+	mkdir -p tmp/gogofaster/benchmark_code
+	mkdir -p tmp/gogoslick/benchmark_code
+	touch make_tmp_dir_gogo
+
+go_no_group_protoc_middleman: make_tmp_dir_gogo $(top_srcdir)/src/protoc$(EXEEXT) gogo_proto_middleman $(well_known_type_protoc_inputs)
+	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --go_out=$$oldpwd/tmp/go_no_group $(benchmarks_protoc_inputs) )
+	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --go_out=$$oldpwd/tmp/go_no_group $(benchmarks_protoc_inputs_benchmark_wrapper) )
+	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --go_out=$$oldpwd/tmp/go_no_group $(benchmarks_protoc_inputs_proto2_message1) )
+	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --go_out=$$oldpwd/tmp/go_no_group $(benchmarks_protoc_inputs_proto2_message2) )
+	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --go_out=$$oldpwd/tmp/go_no_group $(benchmarks_protoc_inputs_proto2_message3) )
+	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --go_out=$$oldpwd/tmp/go_no_group $(benchmarks_protoc_inputs_proto2_message4) )
+	touch go_no_group_protoc_middleman
+
+cpp_no_group_protoc_middleman: make_tmp_dir_gogo $(top_srcdir)/src/protoc$(EXEEXT) gogo_proto_middleman $(well_known_type_protoc_inputs)
+	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --cpp_out=$$oldpwd/gogo/cpp_no_group $(benchmarks_protoc_inputs) )
+	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --cpp_out=$$oldpwd/gogo/cpp_no_group $(benchmarks_protoc_inputs_benchmark_wrapper) )
+	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --cpp_out=$$oldpwd/gogo/cpp_no_group $(benchmarks_protoc_inputs_proto2_message1) )
+	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --cpp_out=$$oldpwd/gogo/cpp_no_group $(benchmarks_protoc_inputs_proto2_message2) )
+	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --cpp_out=$$oldpwd/gogo/cpp_no_group $(benchmarks_protoc_inputs_proto2_message3) )
+	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --cpp_out=$$oldpwd/gogo/cpp_no_group $(benchmarks_protoc_inputs_proto2_message4) )
+	touch cpp_no_group_protoc_middleman
+
+gogofast_protoc_middleman: make_tmp_dir_gogo $(top_srcdir)/src/protoc$(EXEEXT) gogo_proto_middleman $(well_known_type_protoc_inputs)
+	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogofast_out=$$oldpwd/tmp/gogofast $(benchmarks_protoc_inputs) )
+	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogofast_out=$$oldpwd/tmp/gogofast $(benchmarks_protoc_inputs_benchmark_wrapper) )
+	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogofast_out=$$oldpwd/tmp/gogofast $(benchmarks_protoc_inputs_proto2_message1) )
+	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogofast_out=$$oldpwd/tmp/gogofast $(benchmarks_protoc_inputs_proto2_message2) )
+	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogofast_out=$$oldpwd/tmp/gogofast $(benchmarks_protoc_inputs_proto2_message3) )
+	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogofast_out=$$oldpwd/tmp/gogofast $(benchmarks_protoc_inputs_proto2_message4) )
+	touch gogofast_protoc_middleman
+
+gogofaster_protoc_middleman: make_tmp_dir_gogo $(top_srcdir)/src/protoc$(EXEEXT) gogo_proto_middleman $(well_known_type_protoc_inputs)
+	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogofaster_out=$$oldpwd/tmp/gogofaster $(benchmarks_protoc_inputs) )
+	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogofaster_out=$$oldpwd/tmp/gogofaster $(benchmarks_protoc_inputs_benchmark_wrapper) )
+	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogofaster_out=$$oldpwd/tmp/gogofaster $(benchmarks_protoc_inputs_proto2_message1) )
+	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogofaster_out=$$oldpwd/tmp/gogofaster $(benchmarks_protoc_inputs_proto2_message2) )
+	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogofaster_out=$$oldpwd/tmp/gogofaster $(benchmarks_protoc_inputs_proto2_message3) )
+	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogofaster_out=$$oldpwd/tmp/gogofaster $(benchmarks_protoc_inputs_proto2_message4) )
+	touch gogofaster_protoc_middleman
+
+gogoslick_protoc_middleman: make_tmp_dir_gogo $(top_srcdir)/src/protoc$(EXEEXT) gogo_proto_middleman $(well_known_type_protoc_inputs)
+	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogoslick_out=$$oldpwd/tmp/gogoslick $(benchmarks_protoc_inputs) )
+	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogoslick_out=$$oldpwd/tmp/gogoslick $(benchmarks_protoc_inputs_benchmark_wrapper) )
+	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogoslick_out=$$oldpwd/tmp/gogoslick $(benchmarks_protoc_inputs_proto2_message1) )
+	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogoslick_out=$$oldpwd/tmp/gogoslick $(benchmarks_protoc_inputs_proto2_message2) )
+	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogoslick_out=$$oldpwd/tmp/gogoslick $(benchmarks_protoc_inputs_proto2_message3) )
+	oldpwd=`pwd` && ( cd $(srcdir)/tmp/gogo_proto && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$$oldpwd/$(top_srcdir)/src --gogoslick_out=$$oldpwd/tmp/gogoslick $(benchmarks_protoc_inputs_proto2_message4) )
+	touch gogoslick_protoc_middleman
+
+gogo_data = $$(find . -type f -name "dataset.*.pb" -path "./tmp/*")
+
+generate-gogo-benchmark-code:
+	@echo '#! /bin/bash' > generate-gogo-benchmark-code
+	@echo 'cp $(srcdir)/go/go_benchmark_test.go tmp/$$1/benchmark_code/$$1_benchmark1_test.go' >> generate-gogo-benchmark-code
+	@echo 'sed -i -e "s/\.\.\/tmp/../g" tmp/$$1/benchmark_code/$$1_benchmark1_test.go' >> generate-gogo-benchmark-code
+	@echo 'sed -i -e "s/b\.Run(\"\(.*\)\"/b.Run(\"\1\_$$1\"/g" tmp/$$1/benchmark_code/$$1_benchmark1_test.go' >> generate-gogo-benchmark-code
+	@echo 'if [[ $$2 == 1 ]]; then sed -i -e "s/github\.com\/golang/github.com\/gogo/g" tmp/$$1/benchmark_code/$$1_benchmark1_test.go; fi ' >> generate-gogo-benchmark-code
+	@chmod +x generate-gogo-benchmark-code
+
+generate_all_gogo_benchmark_code: generate-gogo-benchmark-code make_tmp_dir_gogo
+	./generate-gogo-benchmark-code go_no_group 0
+	./generate-gogo-benchmark-code gogofast 1
+	./generate-gogo-benchmark-code gogofaster 1
+	./generate-gogo-benchmark-code gogoslick 1
+
+gogo-benchmark:
+	@echo "Writing shortcut script gogo-benchmark..."
+	@echo '#! /bin/bash' > gogo-benchmark
+	@echo 'cd tmp/$$1/benchmark_code' >> gogo-benchmark
+	@echo 'shift' >> gogo-benchmark
+	@echo 'all_data=""' >> gogo-benchmark
+	@echo 'for data_file in $$@; do all_data="$$all_data ../../../$$data_file"; done' >> gogo-benchmark
+	@echo 'go test -bench=. -- $$all_data' >> gogo-benchmark
+	@echo 'cd ../..' >> gogo-benchmark
+	@chmod +x gogo-benchmark
+
+go_no_group: go_no_group_protoc_middleman generate_gogo_data generate_all_gogo_benchmark_code gogo-benchmark
+	./gogo-benchmark go_no_group $(gogo_data)
+	
+gogofast: gogofast_protoc_middleman generate_gogo_data gogo-benchmark generate_all_gogo_benchmark_code 
+	./gogo-benchmark gogofast $(gogo_data)
+	
+gogofaster: gogofaster_protoc_middleman  generate_gogo_data gogo-benchmark generate_all_gogo_benchmark_code
+	./gogo-benchmark gogofaster $(gogo_data)
+
+gogoslick: gogoslick_protoc_middleman  generate_gogo_data gogo-benchmark generate_all_gogo_benchmark_code
+	./gogo-benchmark gogoslick $(gogo_data)
+
+
+############# GOGO RULES END ############
+
+ 
+############ UTIL RULES BEGIN ############
+
+bin_PROGRAMS += protoc-gen-gogoproto gogo-data-scrubber
+
+protoc_gen_gogoproto_LDADD = $(top_srcdir)/src/libprotobuf.la $(top_srcdir)/src/libprotoc.la
+protoc_gen_gogoproto_SOURCES = util/protoc-gen-gogoproto.cc
+protoc_gen_gogoproto_CPPFLAGS = -I$(top_srcdir)/src -I$(srcdir)/cpp -I$(srcdir)/util
+
+gogo_data_scrubber_LDADD = $(top_srcdir)/src/libprotobuf.la
+gogo_data_scrubber_SOURCES = util/gogo_data_scrubber.cc
+gogo_data_scrubber_CPPFLAGS = -I$(top_srcdir)/src -I$(srcdir)/cpp -I$(srcdir)/util
+util/gogo_data_scrubber-gogo_data_scrubber.$(OBJEXT): $(benchmarks_protoc_outputs) $(benchmarks_protoc_outputs_proto2) $(benchmarks_protoc_outputs_header) $(benchmarks_protoc_outputs_proto2_header)
+nodist_gogo_data_scrubber_SOURCES =                                        \
+	$(benchmarks_protoc_outputs)                                             \
+	$(benchmarks_protoc_outputs_proto2)                                      \
+	$(benchmarks_protoc_outputs_proto2_header)                               \
+	$(benchmarks_protoc_outputs_header)
+	
+############ UTIL RULES END ############
+
+MAINTAINERCLEANFILES =                                                     \
+	Makefile.in
+
+CLEANFILES =                                                               \
+	$(benchmarks_protoc_outputs)                                             \
+	$(benchmarks_protoc_outputs_header)                                      \
+	$(benchmarks_protoc_outputs_proto2)                                      \
+	$(benchmarks_protoc_outputs_proto2_header)                               \
+	initialize_submodule                                                     \
+	make_tmp_dir                                                             \
+	protoc_middleman                                                         \
+	protoc_middleman2                                                        \
+	javac_middleman                                                          \
+	java-benchmark                                                           \
+	python_cpp_proto_library                                                 \
+	python-pure-python-benchmark                                             \
+	python-cpp-reflection-benchmark                                          \
+	python-cpp-generated-code-benchmark                                      \
+	go-benchmark                                                             \
+	go_protoc_middleman                                                      \
+	make_tmp_dir_gogo                                                        \
+	gogo_proto_middleman                                                     \
+	generate_gogo_data                                                       \
+	go_no_group_protoc_middleman                                             \
+	go_no_group                                                              \
+	go-no-group-benchmark                                                    \
+	$(cpp_no_group_benchmarks_protoc_outputs_header)                         \
+	$(cpp_no_group_benchmarks_protoc_outputs)                                \
+	$(cpp_no_group_benchmarks_protoc_outputs_proto2_header)                  \
+	$(cpp_no_group_benchmarks_protoc_outputs_proto2)                         \
+	generate_all_gogo_benchmark_code                                         \
+	generate-gogo-benchmark-code                                             \
+	cpp_no_group_protoc_middleman                                            \
+	generate_cpp_no_group_benchmark_code                                     \
+	generate_gogo_benchmark_code                                             \
+	gogofast_protoc_middleman                                                \
+	gogofast                                                                 \
+	gogofaster_protoc_middleman                                              \
+	gogofaster                                                               \
+	gogoslick_protoc_middleman                                               \
+	gogoslick                                                                \
+	gogo-benchmark                                                           \
+	gogo/cpp_no_group/cpp_benchmark.* 
+	
+
+clean-local:
+	-rm -rf tmp/*
diff --git a/benchmarks/ProtoBench.java b/benchmarks/ProtoBench.java
deleted file mode 100644
index 86d62fe..0000000
--- a/benchmarks/ProtoBench.java
+++ /dev/null
@@ -1,203 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2009 Google Inc.  All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//     * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-package com.google.protocolbuffers;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.RandomAccessFile;
-import java.lang.reflect.Method;
-
-import com.google.protobuf.ByteString;
-import com.google.protobuf.CodedInputStream;
-import com.google.protobuf.CodedOutputStream;
-import com.google.protobuf.Message;
-
-public class ProtoBench {
-  
-  private static final long MIN_SAMPLE_TIME_MS = 2 * 1000;
-  private static final long TARGET_TIME_MS = 30 * 1000;
-
-  private ProtoBench() {
-    // Prevent instantiation
-  }
-  
-  public static void main(String[] args) {
-    if (args.length < 2 || (args.length % 2) != 0) {
-      System.err.println("Usage: ProtoBench <descriptor type name> <input data>");
-      System.err.println("The descriptor type name is the fully-qualified message name,");
-      System.err.println("e.g. com.google.protocolbuffers.benchmark.Message1");
-      System.err.println("(You can specify multiple pairs of descriptor type name and input data.)");
-      System.exit(1);
-    }
-    boolean success = true;
-    for (int i = 0; i < args.length; i += 2) {
-      success &= runTest(args[i], args[i + 1]);
-    }
-    System.exit(success ? 0 : 1);
-  }
-
-  /**
-   * Runs a single test. Error messages are displayed to stderr, and the return value
-   * indicates general success/failure.
-   */
-  public static boolean runTest(String type, String file) {
-    System.out.println("Benchmarking " + type + " with file " + file);
-    final Message defaultMessage;
-    try {
-      Class<?> clazz = Class.forName(type);
-      Method method = clazz.getDeclaredMethod("getDefaultInstance");
-      defaultMessage = (Message) method.invoke(null);
-    } catch (Exception e) {
-      // We want to do the same thing with all exceptions. Not generally nice,
-      // but this is slightly different.
-      System.err.println("Unable to get default message for " + type);
-      return false;
-    }
-    
-    try {
-      final byte[] inputData = readAllBytes(file);
-      final ByteArrayInputStream inputStream = new ByteArrayInputStream(inputData);
-      final ByteString inputString = ByteString.copyFrom(inputData);
-      final Message sampleMessage = defaultMessage.newBuilderForType().mergeFrom(inputString).build();
-      FileOutputStream devNullTemp = null;
-      CodedOutputStream reuseDevNullTemp = null;
-      try {
-        devNullTemp = new FileOutputStream("/dev/null");
-        reuseDevNullTemp = CodedOutputStream.newInstance(devNullTemp);
-      } catch (FileNotFoundException e) {
-        // ignore: this is probably Windows, where /dev/null does not exist
-      }
-      final FileOutputStream devNull = devNullTemp;
-      final CodedOutputStream reuseDevNull = reuseDevNullTemp;
-      benchmark("Serialize to byte string", inputData.length, new Action() {
-        public void execute() { sampleMessage.toByteString(); }
-      });      
-      benchmark("Serialize to byte array", inputData.length, new Action() {
-        public void execute() { sampleMessage.toByteArray(); }
-      });
-      benchmark("Serialize to memory stream", inputData.length, new Action() {
-        public void execute() throws IOException { 
-          sampleMessage.writeTo(new ByteArrayOutputStream()); 
-        }
-      });
-      if (devNull != null) {
-        benchmark("Serialize to /dev/null with FileOutputStream", inputData.length, new Action() {
-          public void execute() throws IOException {
-            sampleMessage.writeTo(devNull);
-          }
-        });
-        benchmark("Serialize to /dev/null reusing FileOutputStream", inputData.length, new Action() {
-          public void execute() throws IOException {
-            sampleMessage.writeTo(reuseDevNull);
-            reuseDevNull.flush();  // force the write to the OutputStream
-          }
-        });
-      }
-      benchmark("Deserialize from byte string", inputData.length, new Action() {
-        public void execute() throws IOException { 
-          defaultMessage.newBuilderForType().mergeFrom(inputString).build();
-        }
-      });
-      benchmark("Deserialize from byte array", inputData.length, new Action() {
-        public void execute() throws IOException { 
-          defaultMessage.newBuilderForType()
-            .mergeFrom(CodedInputStream.newInstance(inputData)).build();
-        }
-      });
-      benchmark("Deserialize from memory stream", inputData.length, new Action() {
-        public void execute() throws IOException { 
-          defaultMessage.newBuilderForType()
-            .mergeFrom(CodedInputStream.newInstance(inputStream)).build();
-          inputStream.reset();
-        }
-      });
-      System.out.println();
-      return true;
-    } catch (Exception e) {
-      System.err.println("Error: " + e.getMessage());
-      System.err.println("Detailed exception information:");
-      e.printStackTrace(System.err);
-      return false;
-    }
-  }
-  
-  private static void benchmark(String name, long dataSize, Action action) throws IOException {
-    // Make sure it's JITted "reasonably" hard before running the first progress test
-    for (int i=0; i < 100; i++) {
-      action.execute();
-    }
-    
-    // Run it progressively more times until we've got a reasonable sample
-    int iterations = 1;
-    long elapsed = timeAction(action, iterations);
-    while (elapsed < MIN_SAMPLE_TIME_MS) {
-      iterations *= 2;
-      elapsed = timeAction(action, iterations);
-    }
-    
-    // Upscale the sample to the target time. Do this in floating point arithmetic
-    // to avoid overflow issues.
-    iterations = (int) ((TARGET_TIME_MS / (double) elapsed) * iterations);
-    elapsed = timeAction(action, iterations);
-    System.out.println(name + ": " + iterations + " iterations in "
-         + (elapsed/1000f) + "s; " 
-         + (iterations * dataSize) / (elapsed * 1024 * 1024 / 1000f) 
-         + "MB/s");
-  }
-  
-  private static long timeAction(Action action, int iterations) throws IOException {
-    System.gc();    
-    long start = System.currentTimeMillis();
-    for (int i = 0; i < iterations; i++) {
-      action.execute();
-    }
-    long end = System.currentTimeMillis();
-    return end - start;
-  }
-  
-  private static byte[] readAllBytes(String filename) throws IOException {
-    RandomAccessFile file = new RandomAccessFile(new File(filename), "r");
-    byte[] content = new byte[(int) file.length()];
-    file.readFully(content);
-    return content;
-  }
-
-  /**
-   * Interface used to capture a single action to benchmark.
-   */
-  interface Action {
-    void execute() throws IOException;
-  }
-}
diff --git a/benchmarks/README.md b/benchmarks/README.md
new file mode 100644
index 0000000..21cd735
--- /dev/null
+++ b/benchmarks/README.md
@@ -0,0 +1,187 @@
+
+# Protocol Buffers Benchmarks
+
+This directory contains benchmarking schemas and data sets that you
+can use to test a variety of performance scenarios against your
+protobuf language runtime. If you are looking for performance 
+numbers of officially support languages, see [here](
+https://github.com/google/protobuf/blob/master/docs/Performance.md)
+
+## Prerequisite
+
+First, you need to follow the instruction in the root directory's README to
+build your language's protobuf, then:
+
+### CPP
+You need to install [cmake](https://cmake.org/) before building the benchmark.
+
+We are using [google/benchmark](https://github.com/google/benchmark) as the
+benchmark tool for testing cpp. This will be automaticly made during build the
+cpp benchmark.
+
+The cpp protobuf performance can be improved by linking with [tcmalloc library](
+https://gperftools.github.io/gperftools/tcmalloc.html). For using tcmalloc, you
+need to build [gpertools](https://github.com/gperftools/gperftools) to generate
+libtcmallc.so library.
+
+### Java
+We're using maven to build the java benchmarks, which is the same as to build
+the Java protobuf. There're no other tools need to install. We're using
+[google/caliper](https://github.com/google/caliper) as benchmark tool, which
+can be automaticly included by maven.
+
+### Python
+We're using python C++ API for testing the generated
+CPP proto version of python protobuf, which is also a prerequisite for Python
+protobuf cpp implementation. You need to install the correct version of Python
+C++ extension package before run generated CPP proto version of Python
+protobuf's benchmark. e.g. under Ubuntu, you need to
+
+```
+$ sudo apt-get install python-dev
+$ sudo apt-get install python3-dev
+```
+And you also need to make sure `pkg-config` is installed.
+
+### Go
+Go protobufs are maintained at [github.com/golang/protobuf](
+http://github.com/golang/protobuf). If not done already, you need to install the 
+toolchain and the Go protoc-gen-go plugin for protoc. 
+
+To install protoc-gen-go, run:
+
+```
+$ go get -u github.com/golang/protobuf/protoc-gen-go
+$ export PATH=$PATH:$(go env GOPATH)/bin
+```
+
+The first command installs `protoc-gen-go` into the `bin` directory in your local `GOPATH`.
+The second command adds the `bin` directory to your `PATH` so that `protoc` can locate the plugin later.
+
+### Big data
+
+There's some optional big testing data which is not included in the directory
+initially, you need to run the following command to download the testing data:
+
+```
+$ ./download_data.sh
+```
+
+After doing this the big data file will automaticly generated in the
+benchmark directory.
+
+## Run instructions
+
+To run all the benchmark dataset:
+
+### Java:
+
+```
+$ make java
+```
+
+### CPP:
+
+```
+$ make cpp
+```
+
+For linking with tcmalloc:
+
+```
+$ env LD_PRELOAD={directory to libtcmalloc.so} make cpp
+```
+
+### Python:
+
+We have three versions of python protobuf implementation: pure python, cpp
+reflection and cpp generated code. To run these version benchmark, you need to:
+
+#### Pure Python:
+
+```
+$ make python-pure-python
+```
+
+#### CPP reflection:
+
+```
+$ make python-cpp-reflection
+```
+
+#### CPP generated code:
+
+```
+$ make python-cpp-generated-code
+```
+
+### Go
+```
+$ make go
+```
+
+To run a specific dataset or run with specific options:
+
+### Java:
+
+```
+$ make java-benchmark
+$ ./java-benchmark $(specific generated dataset file name) [$(caliper options)]
+```
+
+### CPP:
+
+```
+$ make cpp-benchmark
+$ ./cpp-benchmark $(specific generated dataset file name) [$(benchmark options)]
+```
+
+### Python:
+
+For Python benchmark we have `--json` for outputing the json result
+
+#### Pure Python:
+
+```
+$ make python-pure-python-benchmark
+$ ./python-pure-python-benchmark [--json] $(specific generated dataset file name)
+```
+
+#### CPP reflection:
+
+```
+$ make python-cpp-reflection-benchmark
+$ ./python-cpp-reflection-benchmark [--json] $(specific generated dataset file name)
+```
+
+#### CPP generated code:
+
+```
+$ make python-cpp-generated-code-benchmark
+$ ./python-cpp-generated-code-benchmark [--json] $(specific generated dataset file name)
+```
+
+### Go:
+```
+$ make go-benchmark
+$ ./go-benchmark $(specific generated dataset file name) [go testing options]
+```
+
+
+## Benchmark datasets
+
+Each data set is in the format of benchmarks.proto:
+
+1. name is the benchmark dataset's name.
+2. message_name is the benchmark's message type full name (including package and message name)
+3. payload is the list of raw data.
+
+The schema for the datasets is described in `benchmarks.proto`.
+
+Benchmark likely want to run several benchmarks against each data set (parse,
+serialize, possibly JSON, possibly using different APIs, etc).
+
+We would like to add more data sets.  In general we will favor data sets
+that make the overall suite diverse without being too large or having
+too many similar tests.  Ideally everyone can run through the entire
+suite without the test run getting too long.
diff --git a/benchmarks/__init__.py b/benchmarks/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/benchmarks/__init__.py
diff --git a/benchmarks/benchmarks.proto b/benchmarks/benchmarks.proto
new file mode 100644
index 0000000..51c0b54
--- /dev/null
+++ b/benchmarks/benchmarks.proto
@@ -0,0 +1,63 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+syntax = "proto3";
+package benchmarks;
+option java_package = "com.google.protobuf.benchmarks";
+
+message BenchmarkDataset {
+  // Name of the benchmark dataset.  This should be unique across all datasets.
+  // Should only contain word characters: [a-zA-Z0-9_]
+  string name = 1;
+
+  // Fully-qualified name of the protobuf message for this dataset.
+  // It will be one of the messages defined benchmark_messages_proto2.proto
+  // or benchmark_messages_proto3.proto.
+  //
+  // Implementations that do not support reflection can implement this with
+  // an explicit "if/else" chain that lists every known message defined
+  // in those files.
+  string message_name = 2;
+
+  // The payload(s) for this dataset.  They should be parsed or serialized
+  // in sequence, in a loop, ie.
+  //
+  //  while (!benchmarkDone) {  // Benchmark runner decides when to exit.
+  //    for (i = 0; i < benchmark.payload.length; i++) {
+  //      parse(benchmark.payload[i])
+  //    }
+  //  }
+  //
+  // This is intended to let datasets include a variety of data to provide
+  // potentially more realistic results than just parsing the same message
+  // over and over.  A single message parsed repeatedly could yield unusually
+  // good branch prediction performance.
+  repeated bytes payload = 3;
+}
diff --git a/benchmarks/cpp/cpp_benchmark.cc b/benchmarks/cpp/cpp_benchmark.cc
new file mode 100644
index 0000000..f8b5529
--- /dev/null
+++ b/benchmarks/cpp/cpp_benchmark.cc
@@ -0,0 +1,254 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include <fstream>
+#include <iostream>
+#include "benchmark/benchmark_api.h"
+#include "benchmarks.pb.h"
+#include "datasets/google_message1/proto2/benchmark_message1_proto2.pb.h"
+#include "datasets/google_message1/proto3/benchmark_message1_proto3.pb.h"
+#include "datasets/google_message2/benchmark_message2.pb.h"
+#include "datasets/google_message3/benchmark_message3.pb.h"
+#include "datasets/google_message4/benchmark_message4.pb.h"
+
+
+#define PREFIX "dataset."
+#define SUFFIX ".pb"
+
+using benchmarks::BenchmarkDataset;
+using google::protobuf::Arena;
+using google::protobuf::Descriptor;
+using google::protobuf::DescriptorPool;
+using google::protobuf::Message;
+using google::protobuf::MessageFactory;
+
+class Fixture : public benchmark::Fixture {
+ public:
+  Fixture(const BenchmarkDataset& dataset, const std::string& suffix) {
+    for (int i = 0; i < dataset.payload_size(); i++) {
+      payloads_.push_back(dataset.payload(i));
+    }
+
+    const Descriptor* d =
+        DescriptorPool::generated_pool()->FindMessageTypeByName(
+            dataset.message_name());
+
+    if (!d) {
+      std::cerr << "Couldn't find message named '" << dataset.message_name()
+                << "\n";
+    }
+
+    prototype_ = MessageFactory::generated_factory()->GetPrototype(d);
+    SetName((dataset.name() + suffix).c_str());
+  }
+
+ protected:
+  std::vector<std::string> payloads_;
+  const Message* prototype_;
+};
+
+class WrappingCounter {
+ public:
+  WrappingCounter(size_t limit) : value_(0), limit_(limit) {}
+
+  size_t Next() {
+    size_t ret = value_;
+    if (++value_ == limit_) {
+      value_ = 0;
+    }
+    return ret;
+  }
+
+ private:
+  size_t value_;
+  size_t limit_;
+};
+
+template <class T>
+class ParseNewFixture : public Fixture {
+ public:
+  ParseNewFixture(const BenchmarkDataset& dataset)
+      : Fixture(dataset, "_parse_new") {}
+
+  virtual void BenchmarkCase(benchmark::State& state) {
+    WrappingCounter i(payloads_.size());
+    size_t total = 0;
+
+    while (state.KeepRunning()) {
+      T m;
+      const std::string& payload = payloads_[i.Next()];
+      total += payload.size();
+      m.ParseFromString(payload);
+    }
+
+    state.SetBytesProcessed(total);
+  }
+};
+
+template <class T>
+class ParseNewArenaFixture : public Fixture {
+ public:
+  ParseNewArenaFixture(const BenchmarkDataset& dataset)
+      : Fixture(dataset, "_parse_newarena") {}
+
+  virtual void BenchmarkCase(benchmark::State& state) {
+    WrappingCounter i(payloads_.size());
+    size_t total = 0;
+    Arena arena;
+
+    while (state.KeepRunning()) {
+      arena.Reset();
+      Message* m = Arena::CreateMessage<T>(&arena);
+      const std::string& payload = payloads_[i.Next()];
+      total += payload.size();
+      m->ParseFromString(payload);
+    }
+
+    state.SetBytesProcessed(total);
+  }
+};
+
+template <class T>
+class ParseReuseFixture : public Fixture {
+ public:
+  ParseReuseFixture(const BenchmarkDataset& dataset)
+      : Fixture(dataset, "_parse_reuse") {}
+
+  virtual void BenchmarkCase(benchmark::State& state) {
+    T m;
+    WrappingCounter i(payloads_.size());
+    size_t total = 0;
+
+    while (state.KeepRunning()) {
+      const std::string& payload = payloads_[i.Next()];
+      total += payload.size();
+      m.ParseFromString(payload);
+    }
+
+    state.SetBytesProcessed(total);
+  }
+};
+
+template <class T>
+class SerializeFixture : public Fixture {
+ public:
+  SerializeFixture(const BenchmarkDataset& dataset)
+      : Fixture(dataset, "_serialize") {
+    for (size_t i = 0; i < payloads_.size(); i++) {
+      message_.push_back(new T);
+      message_.back()->ParseFromString(payloads_[i]);
+    }
+  }
+
+  ~SerializeFixture() {
+    for (size_t i = 0; i < message_.size(); i++) {
+      delete message_[i];
+    }
+  }
+
+  virtual void BenchmarkCase(benchmark::State& state) {
+    size_t total = 0;
+    std::string str;
+    WrappingCounter i(payloads_.size());
+
+    while (state.KeepRunning()) {
+      str.clear();
+      message_[i.Next()]->SerializeToString(&str);
+      total += str.size();
+    }
+
+    state.SetBytesProcessed(total);
+  }
+
+ private:
+  std::vector<T*> message_;
+};
+
+std::string ReadFile(const std::string& name) {
+  std::ifstream file(name.c_str());
+  GOOGLE_CHECK(file.is_open()) << "Couldn't find file '" << name <<
+                                  "', please make sure you are running "
+                                  "this command from the benchmarks/ "
+                                  "directory.\n";
+  return std::string((std::istreambuf_iterator<char>(file)),
+                     std::istreambuf_iterator<char>());
+}
+
+template <class T>
+void RegisterBenchmarksForType(const BenchmarkDataset& dataset) {
+  ::benchmark::internal::RegisterBenchmarkInternal(
+      new ParseNewFixture<T>(dataset));
+  ::benchmark::internal::RegisterBenchmarkInternal(
+      new ParseReuseFixture<T>(dataset));
+  ::benchmark::internal::RegisterBenchmarkInternal(
+      new ParseNewArenaFixture<T>(dataset));
+  ::benchmark::internal::RegisterBenchmarkInternal(
+      new SerializeFixture<T>(dataset));
+}
+
+void RegisterBenchmarks(const std::string& dataset_bytes) {
+  BenchmarkDataset dataset;
+  GOOGLE_CHECK(dataset.ParseFromString(dataset_bytes));
+
+  if (dataset.message_name() == "benchmarks.proto3.GoogleMessage1") {
+    RegisterBenchmarksForType<benchmarks::proto3::GoogleMessage1>(dataset);
+  } else if (dataset.message_name() == "benchmarks.proto2.GoogleMessage1") {
+    RegisterBenchmarksForType<benchmarks::proto2::GoogleMessage1>(dataset);
+  } else if (dataset.message_name() == "benchmarks.proto2.GoogleMessage2") {
+    RegisterBenchmarksForType<benchmarks::proto2::GoogleMessage2>(dataset);
+  } else if (dataset.message_name() ==
+      "benchmarks.google_message3.GoogleMessage3") {
+    RegisterBenchmarksForType
+    <benchmarks::google_message3::GoogleMessage3>(dataset);
+  } else if (dataset.message_name() ==
+      "benchmarks.google_message4.GoogleMessage4") {
+    RegisterBenchmarksForType
+    <benchmarks::google_message4::GoogleMessage4>(dataset);
+  } else {
+    std::cerr << "Unknown message type: " << dataset.message_name();
+    exit(1);
+  }
+}
+
+int main(int argc, char *argv[]) {
+  ::benchmark::Initialize(&argc, argv);
+  if (argc == 1) {
+    std::cerr << "Usage: ./cpp-benchmark <input data>" << std::endl;
+    std::cerr << "input data is in the format of \"benchmarks.proto\""
+        << std::endl;
+    return 1;
+  } else {
+    for (int i = 1; i < argc; i++) {
+      RegisterBenchmarks(ReadFile(argv[i]));
+    }
+  }
+
+  ::benchmark::RunSpecifiedBenchmarks();
+}
diff --git a/benchmarks/datasets/google_message1/proto2/benchmark_message1_proto2.proto b/benchmarks/datasets/google_message1/proto2/benchmark_message1_proto2.proto
new file mode 100644
index 0000000..2126190
--- /dev/null
+++ b/benchmarks/datasets/google_message1/proto2/benchmark_message1_proto2.proto
@@ -0,0 +1,78 @@
+// Benchmark messages for proto2.
+
+syntax = "proto2";
+
+package benchmarks.proto2;
+option java_package = "com.google.protobuf.benchmarks";
+
+// This is the default, but we specify it here explicitly.
+option optimize_for = SPEED;
+
+option cc_enable_arenas = true;
+
+message GoogleMessage1 {
+  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 GoogleMessage1SubMessage 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 GoogleMessage1SubMessage {
+  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;
+}
diff --git a/benchmarks/google_message1.dat b/benchmarks/datasets/google_message1/proto2/dataset.google_message1_proto2.pb
similarity index 78%
copy from benchmarks/google_message1.dat
copy to benchmarks/datasets/google_message1/proto2/dataset.google_message1_proto2.pb
index bc0f064..f6fe784 100644
--- a/benchmarks/google_message1.dat
+++ b/benchmarks/datasets/google_message1/proto2/dataset.google_message1_proto2.pb
Binary files differ
diff --git a/benchmarks/datasets/google_message1/proto3/benchmark_message1_proto3.proto b/benchmarks/datasets/google_message1/proto3/benchmark_message1_proto3.proto
new file mode 100644
index 0000000..090b554
--- /dev/null
+++ b/benchmarks/datasets/google_message1/proto3/benchmark_message1_proto3.proto
@@ -0,0 +1,78 @@
+// Benchmark messages for proto3.
+
+syntax = "proto3";
+
+package benchmarks.proto3;
+option java_package = "com.google.protobuf.benchmarks";
+
+// This is the default, but we specify it here explicitly.
+option optimize_for = SPEED;
+
+option cc_enable_arenas = true;
+
+message GoogleMessage1 {
+  string field1 = 1;
+  string field9 = 9;
+  string field18 = 18;
+  bool field80 = 80;
+  bool field81 = 81;
+  int32 field2 = 2;
+  int32 field3 = 3;
+  int32 field280 = 280;
+  int32 field6 = 6;
+  int64 field22 = 22;
+  string field4 = 4;
+  repeated fixed64 field5 = 5;
+  bool field59 = 59;
+  string field7 = 7;
+  int32 field16 = 16;
+  int32 field130 = 130;
+  bool field12 = 12;
+  bool field17 = 17;
+  bool field13 = 13;
+  bool field14 = 14;
+  int32 field104 = 104;
+  int32 field100 = 100;
+  int32 field101 = 101;
+  string field102 = 102;
+  string field103 = 103;
+  int32 field29 = 29;
+  bool field30 = 30;
+  int32 field60 = 60;
+  int32 field271 = 271;
+  int32 field272 = 272;
+  int32 field150 = 150;
+  int32 field23 = 23;
+  bool field24 = 24;
+  int32 field25 = 25;
+  GoogleMessage1SubMessage field15 = 15;
+  bool field78 = 78;
+  int32 field67 = 67;
+  int32 field68 = 68;
+  int32 field128 = 128;
+  string field129 = 129;
+  int32 field131 = 131;
+}
+
+message GoogleMessage1SubMessage {
+  int32 field1 = 1;
+  int32 field2 = 2;
+  int32 field3 = 3;
+  string field15 = 15;
+  bool field12 = 12;
+  int64 field13 = 13;
+  int64 field14 = 14;
+  int32 field16 = 16;
+  int32 field19 = 19;
+  bool field20  = 20;
+  bool field28 = 28;
+  fixed64 field21 = 21;
+  int32 field22 = 22;
+  bool field23 = 23;
+  bool field206 = 206;
+  fixed32 field203 = 203;
+  int32 field204 = 204;
+  string field205 = 205;
+  uint64 field207 = 207;
+  uint64 field300 = 300;
+}
diff --git a/benchmarks/google_message1.dat b/benchmarks/datasets/google_message1/proto3/dataset.google_message1_proto3.pb
similarity index 78%
rename from benchmarks/google_message1.dat
rename to benchmarks/datasets/google_message1/proto3/dataset.google_message1_proto3.pb
index bc0f064..4955bed 100644
--- a/benchmarks/google_message1.dat
+++ b/benchmarks/datasets/google_message1/proto3/dataset.google_message1_proto3.pb
Binary files differ
diff --git a/benchmarks/datasets/google_message2/benchmark_message2.proto b/benchmarks/datasets/google_message2/benchmark_message2.proto
new file mode 100644
index 0000000..820630e
--- /dev/null
+++ b/benchmarks/datasets/google_message2/benchmark_message2.proto
@@ -0,0 +1,76 @@
+// Benchmark messages for proto2.
+
+syntax = "proto2";
+
+package benchmarks.proto2;
+option java_package = "com.google.protobuf.benchmarks";
+
+// This is the default, but we specify it here explicitly.
+option optimize_for = SPEED;
+
+option cc_enable_arenas = true;
+
+message GoogleMessage2 {
+  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 GoogleMessage2GroupedMessage 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 GoogleMessage2GroupedMessage {
+  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;
+}
diff --git a/benchmarks/google_message2.dat b/benchmarks/datasets/google_message2/dataset.google_message2.pb
similarity index 98%
rename from benchmarks/google_message2.dat
rename to benchmarks/datasets/google_message2/dataset.google_message2.pb
index 06c0944..3fa0e49 100644
--- a/benchmarks/google_message2.dat
+++ b/benchmarks/datasets/google_message2/dataset.google_message2.pb
Binary files differ
diff --git a/benchmarks/datasets/google_message3/benchmark_message3.proto b/benchmarks/datasets/google_message3/benchmark_message3.proto
new file mode 100644
index 0000000..d6f0d14
--- /dev/null
+++ b/benchmarks/datasets/google_message3/benchmark_message3.proto
@@ -0,0 +1,534 @@
+syntax = "proto2";
+
+import "datasets/google_message3/benchmark_message3_1.proto";
+import "datasets/google_message3/benchmark_message3_2.proto";
+import "datasets/google_message3/benchmark_message3_3.proto";
+import "datasets/google_message3/benchmark_message3_4.proto";
+import "datasets/google_message3/benchmark_message3_5.proto";
+import "datasets/google_message3/benchmark_message3_7.proto";
+import "datasets/google_message3/benchmark_message3_8.proto";
+package benchmarks.google_message3;
+
+option cc_enable_arenas = true;
+option java_package = "com.google.protobuf.benchmarks";
+
+message GoogleMessage3 {
+  optional .benchmarks.google_message3.Message37487 field37519 = 2;
+  optional .benchmarks.google_message3.Message36876 field37520 = 3;
+  optional .benchmarks.google_message3.Message13062 field37521 = 4;
+  optional .benchmarks.google_message3.Message952 field37522 = 5;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field37523 = 6;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field37524 = 7;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field37525 = 8;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field37526 = 9;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field37527 = 10;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field37528 = 11;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field37529 = 12;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field37530 = 13;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field37531 = 14;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field37532 = 15;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field37533 = 16;
+}
+
+message Message1327 {
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field1369 = 1;
+  repeated .benchmarks.google_message3.Message1328 field1370 = 3;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field1371 = 5;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field1372 = 6;
+  extend .benchmarks.google_message3.Message0 {
+    optional .benchmarks.google_message3.Message1327 field1373 = 23104162;
+  }
+}
+
+message Message3672 {
+  optional .benchmarks.google_message3.Enum3476 field3727 = 1;
+  optional int32 field3728 = 11;
+  optional int32 field3729 = 2;
+  repeated group Message3673 = 3 {
+    required .benchmarks.google_message3.Enum3476 field3738 = 4;
+    required int32 field3739 = 5;
+  }
+  repeated group Message3674 = 6 {
+    required .benchmarks.google_message3.Enum3476 field3740 = 7;
+    required int32 field3741 = 8;
+  }
+  optional bool field3732 = 9;
+  optional int32 field3733 = 10;
+  optional .benchmarks.google_message3.Enum3476 field3734 = 20;
+  optional int32 field3735 = 21;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field3736 = 50;
+  extend .benchmarks.google_message3.Message0 {
+    optional .benchmarks.google_message3.Message3672 field3737 = 3144435;
+  }
+}
+
+message Message3804 {
+  required int64 field3818 = 1;
+  required bool field3819 = 2;
+  repeated .benchmarks.google_message3.Enum3805 field3820 = 4;
+  optional int32 field3821 = 5;
+  optional bool field3822 = 6;
+  optional int64 field3823 = 7;
+  optional .benchmarks.google_message3.Enum3783 field3824 = 8;
+  extend .benchmarks.google_message3.Message0 {
+    optional .benchmarks.google_message3.Message3804 field3825 = 59241828;
+  }
+}
+
+message Message6849 {
+  repeated .benchmarks.google_message3.Message6850 field6910 = 1;
+  extend .benchmarks.google_message3.Message0 {
+    optional .benchmarks.google_message3.Message6849 field6911 = 107558455;
+  }
+}
+
+message Message6866 {
+  repeated .benchmarks.google_message3.Message6863 field6973 = 1;
+  extend .benchmarks.google_message3.Message0 {
+    optional .benchmarks.google_message3.Message6866 field6974 = 22259060;
+  }
+}
+
+message Message6870 {
+  repeated .benchmarks.google_message3.Message6871 field6991 = 1;
+  extend .benchmarks.google_message3.Message0 {
+    optional .benchmarks.google_message3.Message6870 field6992 = 90034652;
+  }
+}
+
+message Message7651 {
+  optional string field7685 = 1;
+  optional int64 field7686 = 2;
+  optional int64 field7687 = 3;
+  optional int64 field7688 = 4;
+  optional int32 field7689 = 5;
+  optional int32 field7690 = 6;
+  optional int32 field7691 = 7;
+  optional int32 field7692 = 8;
+  optional int32 field7693 = 9;
+  optional int32 field7694 = 10;
+  optional int32 field7695 = 11;
+  optional int32 field7696 = 12;
+  optional int32 field7697 = 13;
+  optional int32 field7698 = 14;
+  optional int32 field7699 = 15;
+  optional int32 field7700 = 16;
+  optional int32 field7701 = 17;
+  optional int32 field7702 = 18;
+  optional bool field7703 = 19;
+  repeated int32 field7704 = 20;
+  repeated int32 field7705 = 21;
+  repeated string field7706 = 22;
+  repeated string field7707 = 23;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field7708 = 24;
+  optional int32 field7709 = 25;
+  optional int32 field7710 = 26;
+  optional int32 field7711 = 27;
+  optional int32 field7712 = 43;
+  optional int32 field7713 = 28;
+  optional int32 field7714 = 29;
+  repeated .benchmarks.google_message3.Message7547 field7715 = 30;
+  repeated .benchmarks.google_message3.Message7547 field7716 = 31;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field7717 = 32;
+  repeated string field7718 = 33;
+  repeated string field7719 = 34;
+  repeated .benchmarks.google_message3.Message7648 field7720 = 35;
+  optional bool field7721 = 36;
+  optional bool field7722 = 37;
+  optional bool field7723 = 38;
+  optional bool field7724 = 39;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field7725 = 40;
+  optional .benchmarks.google_message3.UnusedEnum field7726 = 41;
+  optional .benchmarks.google_message3.Enum7654 field7727 = 42;
+  optional string field7728 = 44;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field7729 = 45;
+  extend .benchmarks.google_message3.Message0 {
+    optional .benchmarks.google_message3.Message7651 field7730 = 55876009;
+  }
+}
+
+message Message7864 {
+  optional string field7866 = 1;
+  optional string field7867 = 2;
+  repeated .benchmarks.google_message3.Message7865 field7868 = 5;
+  repeated .benchmarks.google_message3.Message7865 field7869 = 6;
+  repeated .benchmarks.google_message3.Message7865 field7870 = 7;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field7871 = 8;
+  extend .benchmarks.google_message3.Message0 {
+    optional .benchmarks.google_message3.Message7864 field7872 = 44542730;
+  }
+}
+
+message Message7929 {
+  optional int64 field7942 = 1;
+  optional int64 field7943 = 4;
+  optional int64 field7944 = 5;
+  optional int64 field7945 = 12;
+  optional int64 field7946 = 13;
+  optional int64 field7947 = 18;
+  optional int64 field7948 = 6;
+  optional int64 field7949 = 7;
+  repeated .benchmarks.google_message3.Message7919 field7950 = 8;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field7951 = 20;
+  repeated .benchmarks.google_message3.Message7920 field7952 = 14;
+  repeated .benchmarks.google_message3.Message7921 field7953 = 15;
+  repeated .benchmarks.google_message3.Message7928 field7954 = 17;
+  optional int64 field7955 = 19;
+  optional bool field7956 = 2;
+  optional int64 field7957 = 3;
+  optional int64 field7958 = 9;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field7959 = 10;
+  repeated bytes field7960 = 11;
+  optional int64 field7961 = 16;
+  extend .benchmarks.google_message3.Message0 {
+    optional .benchmarks.google_message3.Message7929 field7962 = 53392238;
+  }
+}
+
+message Message8508 {
+  repeated .benchmarks.google_message3.Message8511 field8517 = 8;
+  repeated .benchmarks.google_message3.Message8512 field8518 = 9;
+  repeated .benchmarks.google_message3.Message8513 field8519 = 11;
+  optional bool field8520 = 13;
+  optional .benchmarks.google_message3.Message8514 field8521 = 14;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field8522 = 15;
+  repeated .benchmarks.google_message3.Message8515 field8523 = 16;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field8524 = 17;
+  optional int64 field8525 = 1;
+  optional float field8526 = 2;
+  optional int64 field8527 = 3;
+  optional int64 field8528 = 4;
+  optional int32 field8529 = 5;
+  optional bytes field8530 = 6;
+  repeated bytes field8531 = 7;
+  optional bool field8532 = 10;
+  optional bytes field8533 = 12;
+  extend .benchmarks.google_message3.Message0 {
+    optional .benchmarks.google_message3.Message8508 field8534 = 3811804;
+  }
+}
+
+message Message9122 {
+  optional float field9132 = 1;
+  optional float field9133 = 2;
+  extend .benchmarks.google_message3.Message0 {
+    optional .benchmarks.google_message3.Message9122 field9134 = 120398939;
+  }
+}
+
+message Message10177 {
+  repeated .benchmarks.google_message3.Message10155 field10270 = 1;
+  extend .benchmarks.google_message3.Message0 {
+    optional .benchmarks.google_message3.Message10177 field10271 = 26801105;
+  }
+}
+
+message Message10278 {
+  repeated int32 field10286 = 1 [packed = true];
+  repeated int32 field10287 = 2 [packed = true];
+  optional int32 field10288 = 3;
+  extend .benchmarks.google_message3.Message10155 {
+    optional .benchmarks.google_message3.Message10278 field10289 = 29374161;
+  }
+}
+
+message Message10323 {
+  repeated .benchmarks.google_message3.Message10320 field10360 = 1;
+  extend .benchmarks.google_message3.Message10155 {
+    optional .benchmarks.google_message3.Message10323 field10361 = 27922524;
+  }
+}
+
+message Message10324 {
+  repeated .benchmarks.google_message3.Message10322 field10362 = 1;
+  optional .benchmarks.google_message3.Message10321 field10363 = 2;
+  extend .benchmarks.google_message3.Message10155 {
+    optional .benchmarks.google_message3.Message10324 field10364 = 27832297;
+  }
+}
+
+message Message11990 {
+  repeated .benchmarks.google_message3.Message11988 field12030 = 1;
+  extend .benchmarks.google_message3.Message0 {
+    optional .benchmarks.google_message3.Message11990 field12031 = 21265426;
+  }
+}
+
+message Message12691 {
+  optional string field12713 = 1;
+  optional int32 field12714 = 2;
+  optional .benchmarks.google_message3.Message12668 field12715 = 3;
+  extend .benchmarks.google_message3.Message0 {
+    optional .benchmarks.google_message3.Message12691 field12716 = 28426536;
+  }
+}
+
+message Message12870 {
+  required int32 field12879 = 1;
+  optional int32 field12880 = 7;
+  required int32 field12881 = 2;
+  optional uint64 field12882 = 3;
+  optional string field12883 = 2001;
+  optional fixed64 field12884 = 4;
+  repeated fixed64 field12885 = 14;
+  optional int32 field12886 = 9;
+  optional int64 field12887 = 18;
+  repeated .benchmarks.google_message3.Message12870 field12888 = 8;
+  optional int32 field12889 = 5;
+  optional uint64 field12890 = 6;
+  optional int32 field12891 = 10;
+  optional int32 field12892 = 11;
+  optional double field12893 = 12;
+  optional .benchmarks.google_message3.Message12825 field12894 = 13;
+  optional double field12895 = 15;
+  optional string field12896 = 16;
+  optional .benchmarks.google_message3.Enum12871 field12897 = 17;
+  optional int32 field12898 = 19;
+  extend .benchmarks.google_message3.Message0 {
+    optional .benchmarks.google_message3.Message12870 field12899 = 5447656;
+  }
+}
+
+message Message13154 {
+  required float field13164 = 1;
+  required float field13165 = 2;
+  extend .benchmarks.google_message3.Message13145 {
+    optional .benchmarks.google_message3.Message13154 field13166 = 47301086;
+  }
+}
+
+message Message16507 {
+  optional bool field16510 = 3;
+  optional bool field16511 = 4;
+  optional bool field16512 = 14;
+  repeated string field16513 = 5;
+  repeated string field16514 = 6;
+  optional string field16515 = 8;
+  repeated int32 field16516 = 9;
+  repeated int32 field16517 = 10;
+  optional int32 field16518 = 7;
+  optional string field16519 = 15;
+  repeated string field16520 = 11;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field16521 = 27;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field16522 = 22;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field16523 = 28;
+  optional string field16524 = 18;
+  optional int32 field16525 = 19;
+  optional int32 field16526 = 20;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field16527 = 23;
+  optional bool field16528 = 24;
+  repeated string field16529 = 25;
+  optional double field16530 = 26;
+  optional .benchmarks.google_message3.Message16478 field16531 = 30;
+  optional bool field16532 = 31;
+  optional string field16533 = 32;
+  optional bool field16534 = 33;
+  optional bool field16535 = 35;
+  optional bool field16536 = 36;
+  optional bool field16537 = 37;
+  optional bool field16538 = 38;
+  optional bool field16539 = 39;
+  optional bool field16540 = 40;
+  repeated string field16541 = 41;
+  extensions 21 to 21;
+  extend .benchmarks.google_message3.Message0 {
+    optional .benchmarks.google_message3.Message16507 field16542 = 5569941;
+  }
+}
+
+message Message16564 {
+  repeated .benchmarks.google_message3.Message16552 field16568 = 1;
+  extend .benchmarks.google_message3.Message0 {
+    optional .benchmarks.google_message3.Message16564 field16569 = 25830030;
+  }
+}
+
+message Message16661 {
+  repeated .benchmarks.google_message3.Message16660 field16671 = 1;
+  repeated uint64 field16672 = 2;
+  extend .benchmarks.google_message3.Message0 {
+    optional .benchmarks.google_message3.Message16661 field16673 = 31274398;
+  }
+}
+
+message Message16746 {
+  repeated .benchmarks.google_message3.Message16727 field16806 = 1;
+  optional bool field16807 = 2;
+  optional bool field16808 = 3;
+  repeated .benchmarks.google_message3.Message16725 field16809 = 4;
+  extend .benchmarks.google_message3.Message0 {
+    optional .benchmarks.google_message3.Message16746 field16810 = 28406765;
+  }
+}
+
+message Message17786 {
+  repeated group Message17787 = 1 {
+    required int32 field18177 = 2;
+    required int32 field18178 = 3;
+    optional .benchmarks.google_message3.Message17783 field18179 = 4;
+    optional .benchmarks.google_message3.UnusedEmptyMessage field18180 = 5;
+    optional .benchmarks.google_message3.UnusedEmptyMessage field18181 = 6;
+    repeated .benchmarks.google_message3.UnusedEmptyMessage field18182 = 8;
+    optional .benchmarks.google_message3.UnusedEmptyMessage field18183 = 9;
+    optional .benchmarks.google_message3.Message17726 field18184 = 10;
+    optional .benchmarks.google_message3.UnusedEmptyMessage field18185 = 11;
+    optional .benchmarks.google_message3.Message16945 field18186 = 102;
+    optional .benchmarks.google_message3.UnusedEmptyMessage field18187 = 12;
+    optional .benchmarks.google_message3.UnusedEmptyMessage field18188 = 13;
+    optional .benchmarks.google_message3.UnusedEmptyMessage field18189 = 7;
+    optional .benchmarks.google_message3.UnusedEmptyMessage field18190 = 100;
+    optional .benchmarks.google_message3.UnusedEmptyMessage field18191 = 101;
+    optional .benchmarks.google_message3.UnusedEmptyMessage field18192 = 14;
+    optional .benchmarks.google_message3.UnusedEmptyMessage field18193 = 19;
+    optional .benchmarks.google_message3.UnusedEmptyMessage field18194 = 22;
+    optional .benchmarks.google_message3.UnusedEmptyMessage field18195 = 24;
+    optional .benchmarks.google_message3.Enum16925 field18196 = 21;
+    optional bool field18197 = 18;
+    repeated .benchmarks.google_message3.UnusedEnum field18198 = 23;
+    optional .benchmarks.google_message3.UnusedEmptyMessage field18199 = 15;
+    optional string field18200 = 16;
+    optional string field18201 = 17;
+    optional bool field18202 = 99;
+  }
+  repeated .benchmarks.google_message3.Message17782 field18175 = 20;
+  extend .benchmarks.google_message3.Message0 {
+    optional .benchmarks.google_message3.Message17786 field18176 = 11823055;
+  }
+}
+
+message Message22857 {
+  repeated .benchmarks.google_message3.Message22853 field22874 = 1;
+  extend .benchmarks.google_message3.Message10155 {
+    optional .benchmarks.google_message3.Message22857 field22875 = 67799715;
+  }
+}
+
+message Message24404 {
+  repeated group Message24405 = 1 {
+    required int32 field24686 = 2;
+    required int32 field24687 = 3;
+    optional .benchmarks.google_message3.Message24317 field24688 = 4;
+    optional .benchmarks.google_message3.UnusedEmptyMessage field24689 = 5;
+    optional .benchmarks.google_message3.Message24376 field24690 = 6;
+    optional .benchmarks.google_message3.Message24345 field24691 = 7;
+    optional .benchmarks.google_message3.UnusedEmptyMessage field24692 = 8;
+    optional .benchmarks.google_message3.Message24379 field24693 = 9;
+    optional .benchmarks.google_message3.UnusedEmptyMessage field24694 = 10;
+    optional .benchmarks.google_message3.UnusedEmptyMessage field24695 = 11;
+    optional .benchmarks.google_message3.Message24391 field24696 = 12;
+    optional .benchmarks.google_message3.UnusedEmptyMessage field24697 = 13;
+    optional .benchmarks.google_message3.UnusedEmptyMessage field24698 = 14;
+    optional .benchmarks.google_message3.UnusedEmptyMessage field24699 = 22;
+    optional .benchmarks.google_message3.UnusedEmptyMessage field24700 = 23;
+    optional .benchmarks.google_message3.UnusedEmptyMessage field24701 = 25;
+    optional .benchmarks.google_message3.Enum16925 field24702 = 18;
+    optional float field24703 = 20;
+    optional bool field24704 = 19;
+    repeated .benchmarks.google_message3.Enum16891 field24705 = 24;
+    optional .benchmarks.google_message3.UnusedEmptyMessage field24706 = 15;
+    optional string field24707 = 16;
+    optional string field24708 = 17;
+    optional float field24709 = 21;
+    optional bool field24710 = 26;
+    optional .benchmarks.google_message3.UnusedEnum field24711 = 27;
+    optional bool field24712 = 28;
+    optional .benchmarks.google_message3.UnusedEnum field24713 = 29;
+    optional bool field24714 = 31;
+    optional bool field24715 = 99;
+    optional int64 field24716 = 32;
+  }
+  optional .benchmarks.google_message3.Message24403 field24684 = 30;
+  extend .benchmarks.google_message3.Message0 {
+    optional .benchmarks.google_message3.Message24404 field24685 = 9129287;
+  }
+}
+
+message Message27300 {
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field27302 = 1;
+  optional string field27303 = 2;
+  extend .benchmarks.google_message3.Message0 {
+    optional .benchmarks.google_message3.Message27300 field27304 = 24956467;
+  }
+}
+
+message Message27453 {
+  optional string field27459 = 15;
+  repeated string field27460 = 1;
+  repeated float field27461 = 6;
+  repeated int32 field27462 = 27;
+  repeated int32 field27463 = 28;
+  repeated .benchmarks.google_message3.Message27454 field27464 = 24;
+  repeated string field27465 = 2;
+  repeated float field27466 = 7;
+  repeated string field27467 = 22;
+  repeated string field27468 = 23;
+  optional string field27469 = 26;
+  repeated .benchmarks.google_message3.Message27357 field27470 = 8;
+  optional .benchmarks.google_message3.Message27360 field27471 = 16;
+  optional string field27472 = 25;
+  optional string field27473 = 11;
+  optional bool field27474 = 13;
+  optional bool field27475 = 14;
+  optional bool field27476 = 17;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field27477 = 12;
+  optional bool field27478 = 34268945;
+  optional bool field27479 = 20;
+  optional string field27480 = 21;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field27481 = 10;
+  extend .benchmarks.google_message3.Message0 {
+    optional .benchmarks.google_message3.Message27453 field27482 = 8086204;
+  }
+}
+
+extend .benchmarks.google_message3.Message16945 {
+  optional string field17026 = 472;
+  repeated string field17027 = 818;
+  optional .benchmarks.google_message3.Message0 field17031 = 215;
+  repeated .benchmarks.google_message3.Message0 field17032 = 292;
+  repeated .benchmarks.google_message3.Message0 field17038 = 234;
+  repeated .benchmarks.google_message3.Message0 field17039 = 235;
+  optional .benchmarks.google_message3.Message0 field17042 = 246;
+  optional string field17043 = 224;
+  optional string field17044 = 225;
+  repeated string field17048 = 63;
+  repeated string field17049 = 64;
+  repeated .benchmarks.google_message3.Message0 field17052 = 233;
+  repeated .benchmarks.google_message3.Message0 field17053 = 66;
+  repeated string field17056 = 275;
+  optional string field17057 = 226;
+  repeated .benchmarks.google_message3.Message0 field17060 = 27;
+  repeated string field17073 = 75;
+  repeated .benchmarks.google_message3.Message0 field17076 = 77;
+  repeated string field17078 = 296;
+  repeated .benchmarks.google_message3.Message0 field17082 = 160;
+  repeated .benchmarks.google_message3.Message0 field17091 = 585;
+  repeated .benchmarks.google_message3.Message0 field17098 = 987;
+  repeated .benchmarks.google_message3.Message0 field17101 = 157;
+  repeated string field17102 = 158;
+  repeated string field17107 = 166;
+  repeated string field17133 = 567;
+  repeated string field17134 = 572;
+  repeated string field17160 = 49;
+  repeated string field17168 = 32;
+  repeated string field17170 = 34;
+  repeated .benchmarks.google_message3.Message0 field17172 = 509;
+  repeated string field17174 = 39;
+  repeated .benchmarks.google_message3.Message0 field17175 = 40;
+  repeated .benchmarks.google_message3.Message0 field17178 = 511;
+  repeated .benchmarks.google_message3.Message0 field17185 = 50;
+  repeated int32 field17207 = 1081;
+  repeated .benchmarks.google_message3.Message0 field17238 = 184;
+  repeated .benchmarks.google_message3.Message0 field17289 = 177;
+  repeated .benchmarks.google_message3.Message0 field17290 = 178;
+  repeated .benchmarks.google_message3.Message0 field17296 = 474;
+  repeated string field17298 = 44;
+  repeated .benchmarks.google_message3.Message0 field17301 = 47;
+  optional .benchmarks.google_message3.Message0 field17412 = 21;
+  repeated .benchmarks.google_message3.Message0 field17438 = 132;
+  repeated .benchmarks.google_message3.Message0 field17458 = 512;
+  repeated string field17460 = 560;
+  repeated string field17466 = 552;
+  repeated .benchmarks.google_message3.Message0 field17617 = 1080;
+  repeated int32 field17618 = 1084;
+}
+
diff --git a/benchmarks/datasets/google_message3/benchmark_message3_1.proto b/benchmarks/datasets/google_message3/benchmark_message3_1.proto
new file mode 100644
index 0000000..3219553
--- /dev/null
+++ b/benchmarks/datasets/google_message3/benchmark_message3_1.proto
@@ -0,0 +1,1280 @@
+syntax = "proto2";
+
+import "datasets/google_message3/benchmark_message3_2.proto";
+import "datasets/google_message3/benchmark_message3_3.proto";
+import "datasets/google_message3/benchmark_message3_5.proto";
+import "datasets/google_message3/benchmark_message3_7.proto";
+import "datasets/google_message3/benchmark_message3_8.proto";
+package benchmarks.google_message3;
+
+option cc_enable_arenas = true;
+option java_package = "com.google.protobuf.benchmarks";
+
+message Message34390 {
+  repeated .benchmarks.google_message3.Message34387 field34452 = 1;
+  extend .benchmarks.google_message3.Message0 {
+    optional .benchmarks.google_message3.Message34390 field34453 = 92144610;
+  }
+}
+
+message Message34624 {
+  optional .benchmarks.google_message3.Message34621 field34683 = 1;
+  optional .benchmarks.google_message3.Message34621 field34684 = 2;
+  extend .benchmarks.google_message3.Message0 {
+    optional .benchmarks.google_message3.Message34624 field34685 = 18178548;
+  }
+}
+
+message Message34791 {
+  optional fixed64 field34793 = 1;
+  repeated group Message34792 = 2 {
+    required string field34808 = 3;
+    optional string field34809 = 4;
+  }
+  optional int32 field34795 = 5;
+  optional int32 field34796 = 6;
+  optional int32 field34797 = 7;
+  optional int32 field34798 = 8;
+  optional int32 field34799 = 9;
+  optional int32 field34800 = 10;
+  optional bool field34801 = 11;
+  optional float field34802 = 12;
+  optional int32 field34803 = 13;
+  optional string field34804 = 14;
+  optional int64 field34805 = 15;
+  repeated fixed64 field34806 = 17 [packed = true];
+  extend .benchmarks.google_message3.Message0 {
+    optional .benchmarks.google_message3.Message34791 field34807 = 6330340;
+  }
+}
+
+message Message35483 {
+  optional int32 field35499 = 1;
+  optional string field35500 = 2;
+  optional string field35501 = 3;
+  optional string field35502 = 4;
+  repeated .benchmarks.google_message3.Message35476 field35503 = 5;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field35504 = 6;
+  extend .benchmarks.google_message3.Message0 {
+    optional .benchmarks.google_message3.Message35483 field35505 = 7913554;
+  }
+}
+
+message Message35807 {
+  optional int32 field35810 = 1;
+  optional int32 field35811 = 2;
+  optional int32 field35812 = 3;
+  optional int32 field35813 = 4;
+  optional int32 field35814 = 5;
+  optional int32 field35815 = 6;
+  optional int32 field35816 = 7;
+  optional int32 field35817 = 8;
+  extend .benchmarks.google_message3.Message0 {
+    optional .benchmarks.google_message3.Message35807 field35818 = 3803299;
+  }
+}
+
+message Message37487 {
+  optional bytes field37501 = 2;
+  optional bool field37502 = 3;
+}
+
+message Message13062 {
+  optional int64 field13075 = 1;
+  optional string field13076 = 2;
+  optional int32 field13077 = 3;
+  optional string field13078 = 4;
+  optional int32 field13079 = 5;
+}
+
+message Message952 {
+  repeated .benchmarks.google_message3.Message949 field963 = 1;
+}
+
+message Message36876 {
+  optional .benchmarks.google_message3.Message2356 field36980 = 1;
+  repeated group Message36877 = 111 {
+    required string field37044 = 112;
+    optional int32 field37045 = 113;
+    optional bytes field37046 = 114;
+    optional int32 field37047 = 115;
+    optional int32 field37048 = 157;
+  }
+  repeated group Message36878 = 168 {
+  }
+  repeated group Message36879 = 55 {
+    required string field37050 = 56;
+    optional int32 field37051 = 69;
+  }
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field36984 = 78;
+  optional group Message36880 = 137 {
+  }
+  optional uint64 field36986 = 59;
+  optional bytes field36987 = 121;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field36988 = 2;
+  optional .benchmarks.google_message3.Message7029 field36989 = 118;
+  optional .benchmarks.google_message3.Message35573 field36990 = 11;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field36991 = 21;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field36992 = 22;
+  optional float field36993 = 13;
+  optional int32 field36994 = 20;
+  optional bool field36995 = 51;
+  optional bool field36996 = 57;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field36997 = 100;
+  optional int32 field36998 = 47;
+  optional int32 field36999 = 48;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field37000 = 68;
+  repeated group Message36881 = 23 {
+  }
+  optional .benchmarks.google_message3.Message4144 field37002 = 125;
+  repeated group Message36882 = 35 {
+  }
+  optional .benchmarks.google_message3.UnusedEmptyMessage field37004 = 49;
+  optional .benchmarks.google_message3.Message18921 field37005 = 52;
+  optional .benchmarks.google_message3.Message36858 field37006 = 46;
+  optional .benchmarks.google_message3.Message18831 field37007 = 54;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field37008 = 58;
+  optional .benchmarks.google_message3.Message18283 field37009 = 10;
+  optional string field37010 = 44;
+  optional string field37011 = 103;
+  optional .benchmarks.google_message3.Message0 field37012 = 43;
+  optional .benchmarks.google_message3.Message0 field37013 = 143;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field37014 = 53;
+  optional .benchmarks.google_message3.Message36869 field37015 = 15;
+  optional group Message36883 = 3 {
+  }
+  repeated group Message36884 = 16 {
+  }
+  repeated group Message36885 = 27 {
+  }
+  optional group Message36886 = 32 {
+  }
+  repeated .benchmarks.google_message3.UnusedEnum field37020 = 71;
+  repeated int32 field37021 = 70;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field37022 = 66;
+  optional .benchmarks.google_message3.Message13090 field37023 = 67;
+  optional group Message36887 = 62 {
+  }
+  repeated .benchmarks.google_message3.Message10155 field37025 = 50;
+  repeated .benchmarks.google_message3.Message11874 field37026 = 151;
+  optional string field37027 = 12;
+  optional int64 field37028 = 72;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field37029 = 73;
+  optional .benchmarks.google_message3.Message35546 field37030 = 108;
+  optional group Message36888 = 74 {
+    optional uint64 field37089 = 75;
+    optional bool field37090 = 76;
+    optional uint64 field37091 = 165;
+    optional double field37092 = 166;
+    optional uint64 field37093 = 109;
+    optional bytes field37094 = 122;
+  }
+  repeated .benchmarks.google_message3.Message19255 field37032 = 104;
+  optional .benchmarks.google_message3.Message33968 field37033 = 105;
+  optional bool field37034 = 106;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field37035 = 107;
+  optional .benchmarks.google_message3.Message6644 field37036 = 110;
+  optional bytes field37037 = 133;
+  optional group Message36889 = 116 {
+    optional int64 field37095 = 117;
+    optional string field37096 = 145;
+    optional int32 field37097 = 123;
+    optional bool field37098 = 163;
+    optional int32 field37099 = 164;
+    optional int32 field37100 = 149;
+    optional .benchmarks.google_message3.UnusedEmptyMessage field37101 = 129;
+    optional .benchmarks.google_message3.Message13174 field37102 = 124;
+    optional .benchmarks.google_message3.Message13169 field37103 = 128;
+    optional uint64 field37104 = 132;
+    repeated .benchmarks.google_message3.Enum36890 field37105 = 131;
+    optional bool field37106 = 134;
+    optional bool field37107 = 140;
+    optional .benchmarks.google_message3.UnusedEmptyMessage field37108 = 135;
+    optional float field37109 = 136;
+    optional float field37110 = 156;
+    optional bool field37111 = 142;
+    optional int64 field37112 = 167;
+    optional .benchmarks.google_message3.UnusedEmptyMessage field37113 = 146;
+    optional bool field37114 = 148;
+    optional .benchmarks.google_message3.UnusedEmptyMessage field37115 = 154;
+    optional .benchmarks.google_message3.UnusedEnum field37116 = 158;
+    repeated .benchmarks.google_message3.UnusedEnum field37117 = 159;
+    optional int32 field37118 = 160;
+    repeated string field37119 = 161;
+  }
+  repeated group Message36910 = 119 {
+  }
+  optional group Message36911 = 126 {
+    optional .benchmarks.google_message3.UnusedEmptyMessage field37121 = 127;
+    optional .benchmarks.google_message3.Message35538 field37122 = 130;
+    optional .benchmarks.google_message3.Message35540 field37123 = 144;
+    optional .benchmarks.google_message3.Message35542 field37124 = 150;
+  }
+  optional group Message36912 = 152 {
+    optional .benchmarks.google_message3.Message3901 field37125 = 153;
+    optional .benchmarks.google_message3.Message3901 field37126 = 162;
+  }
+  optional .benchmarks.google_message3.UnusedEmptyMessage field37042 = 155;
+}
+
+message Message1328 {
+}
+
+message Message6850 {
+}
+
+message Message6863 {
+  optional .benchmarks.google_message3.Enum6858 field6931 = 1;
+  optional .benchmarks.google_message3.Enum6858 field6932 = 2;
+  optional .benchmarks.google_message3.UnusedEnum field6933 = 36;
+  optional bool field6934 = 27;
+  optional .benchmarks.google_message3.Message6773 field6935 = 26;
+  optional int32 field6936 = 30;
+  optional int32 field6937 = 37;
+  optional .benchmarks.google_message3.Enum6815 field6938 = 31;
+  optional string field6939 = 3;
+  optional int32 field6940 = 4;
+  optional .benchmarks.google_message3.Enum6822 field6941 = 15;
+  optional bool field6942 = 10;
+  optional bool field6943 = 17;
+  optional float field6944 = 18;
+  optional float field6945 = 19;
+  optional int32 field6946 = 5;
+  optional int32 field6947 = 6;
+  optional bool field6948 = 7;
+  optional int32 field6949 = 12;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field6950 = 8;
+  optional uint64 field6951 = 9;
+  optional string field6952 = 11;
+  optional bytes field6953 = 13;
+  optional int32 field6954 = 14;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field6955 = 16;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field6956 = 22;
+  optional .benchmarks.google_message3.Message3886 field6957 = 38;
+  optional string field6958 = 20;
+  optional uint32 field6959 = 21;
+  optional .benchmarks.google_message3.Message6743 field6960 = 23;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field6961 = 29;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field6962 = 33;
+  optional bool field6963 = 34;
+}
+
+message Message6871 {
+}
+
+message Message7547 {
+  required bytes field7549 = 1;
+  required int32 field7550 = 2;
+}
+
+message Message7648 {
+  optional string field7669 = 1;
+  optional int32 field7670 = 2;
+  optional int32 field7671 = 3;
+  optional int32 field7672 = 4;
+  optional int32 field7673 = 5;
+  optional int32 field7674 = 6;
+  optional float field7675 = 7;
+  optional bool field7676 = 8;
+  optional bool field7677 = 9;
+  optional bool field7678 = 10;
+  optional bool field7679 = 11;
+  optional bool field7680 = 12;
+}
+
+message Message7865 {
+}
+
+message Message7928 {
+  optional string field7940 = 1;
+  optional int64 field7941 = 2;
+}
+
+message Message7919 {
+  optional fixed64 field7931 = 1;
+  optional int64 field7932 = 2;
+  optional bytes field7933 = 3;
+}
+
+message Message7920 {
+  optional int64 field7934 = 1;
+  optional int64 field7935 = 2;
+}
+
+message Message7921 {
+  optional int32 field7936 = 1;
+  optional int64 field7937 = 2;
+  optional float field7938 = 3;
+  optional .benchmarks.google_message3.UnusedEnum field7939 = 4;
+}
+
+message Message8511 {
+  optional .benchmarks.google_message3.Message8224 field8539 = 1;
+  optional string field8540 = 2;
+  optional bool field8541 = 3;
+  optional int64 field8542 = 4;
+  optional string field8543 = 5;
+}
+
+message Message8512 {
+  optional .benchmarks.google_message3.Message8301 field8544 = 1;
+  optional .benchmarks.google_message3.Message8302 field8545 = 2;
+  optional string field8546 = 3;
+  optional bool field8547 = 4;
+  optional int64 field8548 = 5;
+  optional string field8549 = 6;
+}
+
+message Message8513 {
+  repeated .benchmarks.google_message3.Message8392 field8550 = 1;
+  optional string field8551 = 2;
+  optional bool field8552 = 3;
+  optional string field8553 = 4;
+}
+
+message Message8514 {
+  optional string field8554 = 1;
+  optional int64 field8555 = 2;
+  optional bool field8556 = 3;
+  repeated .benchmarks.google_message3.Message8130 field8557 = 4;
+  optional string field8558 = 5;
+}
+
+message Message8515 {
+  optional .benchmarks.google_message3.Message8479 field8559 = 1;
+  optional .benchmarks.google_message3.Message8478 field8560 = 2;
+  optional string field8561 = 3;
+}
+
+message Message10320 {
+  optional .benchmarks.google_message3.Enum10335 field10347 = 1;
+  repeated .benchmarks.google_message3.Message10319 field10348 = 2;
+  optional int32 field10349 = 3;
+  optional int32 field10350 = 4;
+  optional int32 field10351 = 5;
+  optional int32 field10352 = 6;
+  optional .benchmarks.google_message3.Enum10337 field10353 = 7;
+}
+
+message Message10321 {
+  optional int32 field10354 = 1;
+  optional int32 field10355 = 2;
+  optional uint64 field10356 = 3;
+}
+
+message Message10322 {
+  optional .benchmarks.google_message3.Message4016 field10357 = 1;
+  optional bool field10358 = 2;
+  optional bool field10359 = 3;
+}
+
+message Message11988 {
+  optional string field12021 = 1;
+  optional string field12022 = 2;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field12023 = 3;
+  optional .benchmarks.google_message3.Message10155 field12024 = 4;
+}
+
+message Message12668 {
+  repeated .benchmarks.google_message3.Message12669 field12677 = 1;
+  optional int32 field12678 = 2;
+  optional int32 field12679 = 3;
+  optional int32 field12680 = 4;
+}
+
+message Message12825 {
+  repeated .benchmarks.google_message3.Message12818 field12862 = 1;
+  optional int32 field12863 = 2;
+  optional .benchmarks.google_message3.Message12819 field12864 = 3;
+  optional .benchmarks.google_message3.Message12820 field12865 = 4;
+  optional int32 field12866 = 5;
+  repeated .benchmarks.google_message3.Message12821 field12867 = 6;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field12868 = 7;
+}
+
+message Message16478 {
+  repeated .benchmarks.google_message3.Message16479 field16481 = 1;
+  optional bool field16482 = 3;
+  optional int32 field16483 = 2;
+}
+
+message Message16552 {
+  optional fixed64 field16565 = 1;
+  optional int32 field16566 = 2;
+  optional .benchmarks.google_message3.Enum16553 field16567 = 3;
+}
+
+message Message16660 {
+  optional string field16668 = 1;
+  optional string field16669 = 2;
+  optional int32 field16670 = 3;
+}
+
+message Message16727 {
+  required .benchmarks.google_message3.Enum16728 field16782 = 1;
+  required string field16783 = 2;
+  optional string field16784 = 3;
+  optional int32 field16785 = 23;
+  required string field16786 = 4;
+  optional string field16787 = 5;
+  optional string field16788 = 6;
+  required .benchmarks.google_message3.Enum16732 field16789 = 7;
+  optional string field16790 = 8;
+  optional string field16791 = 9;
+  optional string field16792 = 10;
+  optional .benchmarks.google_message3.Enum16738 field16793 = 11;
+  optional int32 field16794 = 12;
+  repeated .benchmarks.google_message3.Message16722 field16795 = 13;
+  optional bool field16796 = 19;
+  optional bool field16797 = 24;
+  optional string field16798 = 14;
+  optional int64 field16799 = 15;
+  optional bool field16800 = 16;
+  optional string field16801 = 17;
+  optional .benchmarks.google_message3.Enum16698 field16802 = 18;
+  optional .benchmarks.google_message3.Message16724 field16803 = 20;
+  optional bool field16804 = 22;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field16805 = 25;
+  extensions 1000 to 536870911;
+}
+
+message Message16725 {
+  optional .benchmarks.google_message3.Enum16728 field16774 = 1;
+  repeated string field16775 = 2;
+}
+
+message Message17726 {
+  optional string field17801 = 1;
+  repeated string field17802 = 2;
+  optional string field17803 = 3;
+  repeated string field17804 = 4;
+  optional string field17805 = 5;
+  repeated string field17806 = 6;
+  optional string field17807 = 7;
+  optional string field17808 = 8;
+  repeated string field17809 = 15;
+  repeated string field17810 = 16;
+  repeated string field17811 = 17;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field17812 = 18;
+  optional string field17813 = 9;
+  optional string field17814 = 10;
+  optional string field17815 = 11;
+  optional string field17816 = 12;
+  optional string field17817 = 13;
+  optional string field17818 = 14;
+  optional string field17819 = 19;
+  repeated .benchmarks.google_message3.Message17728 field17820 = 20;
+  repeated .benchmarks.google_message3.Message17728 field17821 = 21;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field17822 = 30;
+}
+
+message Message17782 {
+  optional string field18153 = 1;
+  optional string field18154 = 2;
+}
+
+message Message17783 {
+  optional string field18155 = 1;
+  optional string field18156 = 2;
+  optional string field18157 = 3;
+  repeated group Message17784 = 4 {
+    optional string field18162 = 5;
+    optional string field18163 = 6;
+    optional string field18164 = 7;
+    repeated string field18165 = 8;
+    optional string field18166 = 17;
+    optional string field18167 = 18;
+  }
+  repeated group Message17785 = 9 {
+    optional string field18168 = 10;
+    optional string field18169 = 11;
+    optional .benchmarks.google_message3.Message17783 field18170 = 12;
+    optional string field18171 = 13;
+    optional string field18172 = 14;
+    repeated string field18173 = 15;
+  }
+  repeated string field18160 = 16;
+}
+
+message Message16945 {
+  optional string field16946 = 1;
+  optional string field16947 = 2;
+  optional string field16948 = 3;
+  optional string field16949 = 4;
+  optional string field16950 = 5;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field16951 = 872;
+  repeated .benchmarks.google_message3.Message0 field16952 = 16;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field16953 = 54;
+  repeated .benchmarks.google_message3.Message0 field16954 = 55;
+  repeated string field16955 = 58;
+  repeated string field16956 = 59;
+  repeated string field16957 = 62;
+  repeated string field16958 = 37;
+  repeated string field16959 = 18;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field16960 = 38;
+  repeated .benchmarks.google_message3.Message0 field16961 = 67;
+  repeated .benchmarks.google_message3.Message0 field16962 = 130;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field16963 = 136;
+  repeated string field16964 = 138;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field16965 = 156;
+  repeated string field16966 = 139;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field16967 = 126;
+  repeated string field16968 = 152;
+  repeated .benchmarks.google_message3.Message0 field16969 = 183;
+  repeated string field16970 = 168;
+  repeated string field16971 = 212;
+  repeated string field16972 = 213;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field16973 = 189;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field16974 = 190;
+  repeated string field16975 = 191;
+  repeated string field16976 = 192;
+  repeated .benchmarks.google_message3.Message0 field16977 = 193;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field16978 = 194;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field16979 = 195;
+  repeated int32 field16980 = 196;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field16981 = 95;
+  repeated string field16982 = 96;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field16983 = 97;
+  repeated string field16984 = 1086;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field16985 = 98;
+  repeated string field16986 = 99;
+  repeated string field16987 = 100;
+  repeated string field16988 = 48;
+  optional string field16989 = 22;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field16990 = 51;
+  repeated string field16991 = 81;
+  repeated string field16992 = 85;
+  repeated string field16993 = 169;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field16994 = 260;
+  optional int32 field16995 = 198;
+  optional int32 field16996 = 204;
+  optional string field16997 = 1087;
+  repeated string field16998 = 197;
+  repeated string field16999 = 206;
+  optional string field17000 = 211;
+  repeated string field17001 = 205;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field17002 = 68;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field17003 = 69;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field17004 = 70;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field17005 = 71;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field17006 = 72;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field17007 = 19;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field17008 = 24;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field17009 = 23;
+  repeated .benchmarks.google_message3.Message0 field17010 = 131;
+  repeated string field17011 = 133;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field17012 = 142;
+  repeated string field17013 = 143;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field17014 = 153;
+  repeated .benchmarks.google_message3.Message0 field17015 = 170;
+  repeated string field17016 = 171;
+  repeated string field17017 = 172;
+  repeated string field17018 = 173;
+  repeated string field17019 = 174;
+  repeated string field17020 = 175;
+  repeated string field17021 = 186;
+  repeated string field17022 = 101;
+  repeated .benchmarks.google_message3.Message0 field17023 = 102;
+  repeated string field17024 = 274;
+  extensions 17 to 17;
+  extensions 21 to 21;
+  extensions 25 to 25;
+  extensions 27 to 27;
+  extensions 29 to 29;
+  extensions 30 to 30;
+  extensions 31 to 31;
+  extensions 32 to 32;
+  extensions 33 to 33;
+  extensions 34 to 34;
+  extensions 35 to 35;
+  extensions 36 to 36;
+  extensions 39 to 39;
+  extensions 40 to 40;
+  extensions 41 to 41;
+  extensions 42 to 42;
+  extensions 43 to 43;
+  extensions 44 to 44;
+  extensions 45 to 45;
+  extensions 46 to 46;
+  extensions 47 to 47;
+  extensions 49 to 49;
+  extensions 50 to 50;
+  extensions 52 to 52;
+  extensions 53 to 53;
+  extensions 56 to 56;
+  extensions 57 to 57;
+  extensions 60 to 60;
+  extensions 61 to 61;
+  extensions 63 to 63;
+  extensions 64 to 64;
+  extensions 65 to 65;
+  extensions 66 to 66;
+  extensions 73 to 73;
+  extensions 74 to 74;
+  extensions 75 to 75;
+  extensions 76 to 76;
+  extensions 77 to 77;
+  extensions 78 to 78;
+  extensions 79 to 79;
+  extensions 80 to 80;
+  extensions 82 to 82;
+  extensions 83 to 83;
+  extensions 84 to 84;
+  extensions 86 to 86;
+  extensions 87 to 87;
+  extensions 88 to 88;
+  extensions 89 to 89;
+  extensions 90 to 90;
+  extensions 91 to 91;
+  extensions 92 to 92;
+  extensions 93 to 93;
+  extensions 94 to 94;
+  extensions 103 to 103;
+  extensions 104 to 104;
+  extensions 105 to 105;
+  extensions 106 to 106;
+  extensions 107 to 107;
+  extensions 108 to 108;
+  extensions 109 to 109;
+  extensions 110 to 110;
+  extensions 111 to 111;
+  extensions 112 to 112;
+  extensions 113 to 113;
+  extensions 114 to 114;
+  extensions 115 to 115;
+  extensions 116 to 116;
+  extensions 117 to 117;
+  extensions 118 to 118;
+  extensions 119 to 119;
+  extensions 120 to 120;
+  extensions 121 to 121;
+  extensions 122 to 122;
+  extensions 123 to 123;
+  extensions 124 to 124;
+  extensions 125 to 125;
+  extensions 127 to 127;
+  extensions 128 to 128;
+  extensions 129 to 129;
+  extensions 132 to 132;
+  extensions 134 to 134;
+  extensions 135 to 135;
+  extensions 137 to 137;
+  extensions 140 to 140;
+  extensions 141 to 141;
+  extensions 144 to 144;
+  extensions 145 to 145;
+  extensions 146 to 146;
+  extensions 147 to 147;
+  extensions 148 to 148;
+  extensions 149 to 149;
+  extensions 150 to 150;
+  extensions 151 to 151;
+  extensions 154 to 154;
+  extensions 155 to 155;
+  extensions 157 to 157;
+  extensions 158 to 158;
+  extensions 159 to 159;
+  extensions 160 to 160;
+  extensions 161 to 161;
+  extensions 162 to 162;
+  extensions 163 to 163;
+  extensions 164 to 164;
+  extensions 165 to 165;
+  extensions 166 to 166;
+  extensions 167 to 167;
+  extensions 176 to 176;
+  extensions 177 to 177;
+  extensions 178 to 178;
+  extensions 179 to 179;
+  extensions 180 to 180;
+  extensions 181 to 181;
+  extensions 182 to 182;
+  extensions 184 to 184;
+  extensions 185 to 185;
+  extensions 187 to 187;
+  extensions 188 to 188;
+  extensions 199 to 199;
+  extensions 200 to 200;
+  extensions 201 to 201;
+  extensions 202 to 202;
+  extensions 203 to 203;
+  extensions 207 to 207;
+  extensions 208 to 208;
+  extensions 209 to 209;
+  extensions 210 to 210;
+  extensions 214 to 214;
+  extensions 215 to 215;
+  extensions 216 to 216;
+  extensions 217 to 217;
+  extensions 218 to 218;
+  extensions 219 to 219;
+  extensions 220 to 220;
+  extensions 221 to 221;
+  extensions 222 to 222;
+  extensions 223 to 223;
+  extensions 224 to 224;
+  extensions 225 to 225;
+  extensions 226 to 226;
+  extensions 227 to 227;
+  extensions 228 to 228;
+  extensions 229 to 229;
+  extensions 230 to 230;
+  extensions 231 to 231;
+  extensions 232 to 232;
+  extensions 233 to 233;
+  extensions 234 to 234;
+  extensions 235 to 235;
+  extensions 236 to 236;
+  extensions 237 to 237;
+  extensions 238 to 238;
+  extensions 239 to 239;
+  extensions 240 to 240;
+  extensions 241 to 241;
+  extensions 242 to 242;
+  extensions 243 to 243;
+  extensions 244 to 244;
+  extensions 245 to 245;
+  extensions 246 to 246;
+  extensions 247 to 247;
+  extensions 248 to 248;
+  extensions 249 to 249;
+  extensions 250 to 250;
+  extensions 251 to 251;
+  extensions 252 to 252;
+  extensions 253 to 253;
+  extensions 254 to 254;
+  extensions 255 to 255;
+  extensions 256 to 256;
+  extensions 257 to 257;
+  extensions 258 to 258;
+  extensions 259 to 259;
+  extensions 261 to 261;
+  extensions 262 to 262;
+  extensions 263 to 263;
+  extensions 264 to 264;
+  extensions 265 to 265;
+  extensions 266 to 266;
+  extensions 267 to 267;
+  extensions 268 to 268;
+  extensions 269 to 269;
+  extensions 270 to 270;
+  extensions 271 to 271;
+  extensions 272 to 272;
+  extensions 273 to 273;
+  extensions 275 to 275;
+  extensions 276 to 276;
+  extensions 277 to 277;
+  extensions 278 to 278;
+  extensions 279 to 279;
+  extensions 280 to 280;
+  extensions 281 to 281;
+  extensions 282 to 282;
+  extensions 283 to 283;
+  extensions 284 to 284;
+  extensions 285 to 285;
+  extensions 286 to 286;
+  extensions 290 to 290;
+  extensions 291 to 291;
+  extensions 292 to 292;
+  extensions 293 to 293;
+  extensions 294 to 294;
+  extensions 295 to 295;
+  extensions 296 to 296;
+  extensions 297 to 297;
+  extensions 298 to 298;
+  extensions 299 to 299;
+  extensions 300 to 300;
+  extensions 301 to 301;
+  extensions 302 to 302;
+  extensions 303 to 303;
+  extensions 304 to 304;
+  extensions 305 to 305;
+  extensions 306 to 306;
+  extensions 307 to 307;
+  extensions 308 to 308;
+  extensions 309 to 309;
+  extensions 310 to 310;
+  extensions 311 to 311;
+  extensions 312 to 312;
+  extensions 313 to 313;
+  extensions 314 to 314;
+  extensions 315 to 315;
+  extensions 316 to 316;
+  extensions 317 to 317;
+  extensions 318 to 318;
+  extensions 319 to 319;
+  extensions 320 to 320;
+  extensions 321 to 321;
+  extensions 322 to 322;
+  extensions 323 to 323;
+  extensions 324 to 324;
+  extensions 325 to 325;
+  extensions 326 to 326;
+  extensions 327 to 327;
+  extensions 328 to 328;
+  extensions 329 to 329;
+  extensions 330 to 330;
+  extensions 331 to 331;
+  extensions 332 to 332;
+  extensions 333 to 333;
+  extensions 334 to 334;
+  extensions 335 to 335;
+  extensions 336 to 336;
+  extensions 337 to 337;
+  extensions 338 to 338;
+  extensions 339 to 339;
+  extensions 340 to 340;
+  extensions 341 to 341;
+  extensions 342 to 342;
+  extensions 343 to 343;
+  extensions 344 to 344;
+  extensions 345 to 345;
+  extensions 346 to 346;
+  extensions 347 to 347;
+  extensions 348 to 348;
+  extensions 349 to 349;
+  extensions 350 to 350;
+  extensions 351 to 351;
+  extensions 352 to 352;
+  extensions 353 to 353;
+  extensions 354 to 354;
+  extensions 355 to 355;
+  extensions 356 to 356;
+  extensions 357 to 357;
+  extensions 358 to 358;
+  extensions 359 to 359;
+  extensions 360 to 360;
+  extensions 361 to 361;
+  extensions 362 to 362;
+  extensions 363 to 363;
+  extensions 364 to 364;
+  extensions 365 to 365;
+  extensions 366 to 366;
+  extensions 367 to 367;
+  extensions 368 to 368;
+  extensions 369 to 369;
+  extensions 370 to 370;
+  extensions 371 to 371;
+  extensions 372 to 372;
+  extensions 373 to 373;
+  extensions 374 to 374;
+  extensions 375 to 375;
+  extensions 376 to 376;
+  extensions 377 to 377;
+  extensions 378 to 378;
+  extensions 379 to 379;
+  extensions 380 to 380;
+  extensions 381 to 381;
+  extensions 382 to 382;
+  extensions 383 to 383;
+  extensions 384 to 384;
+  extensions 385 to 385;
+  extensions 386 to 386;
+  extensions 387 to 387;
+  extensions 388 to 388;
+  extensions 389 to 389;
+  extensions 390 to 390;
+  extensions 391 to 391;
+  extensions 392 to 392;
+  extensions 393 to 393;
+  extensions 394 to 394;
+  extensions 395 to 395;
+  extensions 396 to 396;
+  extensions 397 to 397;
+  extensions 398 to 398;
+  extensions 399 to 399;
+  extensions 400 to 400;
+  extensions 401 to 401;
+  extensions 402 to 402;
+  extensions 403 to 403;
+  extensions 404 to 404;
+  extensions 405 to 405;
+  extensions 406 to 406;
+  extensions 407 to 407;
+  extensions 408 to 408;
+  extensions 409 to 409;
+  extensions 410 to 410;
+  extensions 411 to 411;
+  extensions 412 to 412;
+  extensions 413 to 413;
+  extensions 414 to 414;
+  extensions 415 to 415;
+  extensions 416 to 416;
+  extensions 417 to 417;
+  extensions 418 to 418;
+  extensions 419 to 419;
+  extensions 420 to 420;
+  extensions 421 to 421;
+  extensions 422 to 422;
+  extensions 423 to 423;
+  extensions 424 to 424;
+  extensions 425 to 425;
+  extensions 426 to 426;
+  extensions 427 to 427;
+  extensions 428 to 428;
+  extensions 429 to 429;
+  extensions 430 to 430;
+  extensions 431 to 431;
+  extensions 432 to 432;
+  extensions 433 to 433;
+  extensions 434 to 434;
+  extensions 435 to 435;
+  extensions 436 to 436;
+  extensions 437 to 437;
+  extensions 438 to 438;
+  extensions 439 to 439;
+  extensions 440 to 440;
+  extensions 441 to 441;
+  extensions 442 to 442;
+  extensions 443 to 443;
+  extensions 444 to 444;
+  extensions 445 to 445;
+  extensions 446 to 446;
+  extensions 447 to 447;
+  extensions 448 to 448;
+  extensions 449 to 449;
+  extensions 450 to 450;
+  extensions 451 to 451;
+  extensions 452 to 452;
+  extensions 453 to 453;
+  extensions 454 to 454;
+  extensions 455 to 455;
+  extensions 456 to 456;
+  extensions 457 to 457;
+  extensions 458 to 458;
+  extensions 459 to 459;
+  extensions 460 to 460;
+  extensions 461 to 461;
+  extensions 462 to 462;
+  extensions 463 to 463;
+  extensions 464 to 464;
+  extensions 465 to 465;
+  extensions 466 to 466;
+  extensions 467 to 467;
+  extensions 468 to 468;
+  extensions 469 to 469;
+  extensions 470 to 470;
+  extensions 471 to 471;
+  extensions 472 to 472;
+  extensions 473 to 473;
+  extensions 474 to 474;
+  extensions 509 to 509;
+  extensions 511 to 511;
+  extensions 512 to 512;
+  extensions 513 to 513;
+  extensions 514 to 514;
+  extensions 515 to 515;
+  extensions 516 to 516;
+  extensions 517 to 517;
+  extensions 518 to 518;
+  extensions 519 to 519;
+  extensions 520 to 520;
+  extensions 521 to 521;
+  extensions 522 to 522;
+  extensions 523 to 523;
+  extensions 524 to 524;
+  extensions 525 to 525;
+  extensions 526 to 526;
+  extensions 527 to 527;
+  extensions 528 to 528;
+  extensions 529 to 529;
+  extensions 530 to 530;
+  extensions 531 to 531;
+  extensions 532 to 532;
+  extensions 533 to 533;
+  extensions 534 to 534;
+  extensions 535 to 535;
+  extensions 536 to 536;
+  extensions 537 to 537;
+  extensions 538 to 538;
+  extensions 539 to 539;
+  extensions 540 to 540;
+  extensions 541 to 541;
+  extensions 542 to 542;
+  extensions 543 to 543;
+  extensions 544 to 544;
+  extensions 545 to 545;
+  extensions 546 to 546;
+  extensions 547 to 547;
+  extensions 548 to 548;
+  extensions 549 to 549;
+  extensions 550 to 550;
+  extensions 551 to 551;
+  extensions 552 to 552;
+  extensions 553 to 553;
+  extensions 554 to 554;
+  extensions 555 to 555;
+  extensions 556 to 556;
+  extensions 557 to 557;
+  extensions 558 to 558;
+  extensions 559 to 559;
+  extensions 560 to 560;
+  extensions 561 to 561;
+  extensions 562 to 562;
+  extensions 563 to 563;
+  extensions 564 to 564;
+  extensions 565 to 565;
+  extensions 566 to 566;
+  extensions 567 to 567;
+  extensions 568 to 568;
+  extensions 569 to 569;
+  extensions 570 to 570;
+  extensions 571 to 571;
+  extensions 572 to 572;
+  extensions 573 to 573;
+  extensions 574 to 574;
+  extensions 575 to 575;
+  extensions 576 to 576;
+  extensions 577 to 577;
+  extensions 578 to 578;
+  extensions 579 to 579;
+  extensions 580 to 580;
+  extensions 581 to 581;
+  extensions 582 to 582;
+  extensions 583 to 583;
+  extensions 584 to 584;
+  extensions 585 to 585;
+  extensions 586 to 586;
+  extensions 587 to 587;
+  extensions 588 to 588;
+  extensions 589 to 589;
+  extensions 590 to 590;
+  extensions 604 to 604;
+  extensions 605 to 605;
+  extensions 606 to 606;
+  extensions 607 to 607;
+  extensions 608 to 608;
+  extensions 609 to 609;
+  extensions 610 to 610;
+  extensions 611 to 611;
+  extensions 612 to 612;
+  extensions 613 to 613;
+  extensions 614 to 614;
+  extensions 615 to 615;
+  extensions 616 to 616;
+  extensions 617 to 617;
+  extensions 618 to 618;
+  extensions 619 to 619;
+  extensions 620 to 620;
+  extensions 621 to 621;
+  extensions 622 to 622;
+  extensions 623 to 623;
+  extensions 624 to 624;
+  extensions 625 to 625;
+  extensions 626 to 626;
+  extensions 627 to 627;
+  extensions 628 to 628;
+  extensions 629 to 629;
+  extensions 813 to 813;
+  extensions 814 to 814;
+  extensions 815 to 815;
+  extensions 816 to 816;
+  extensions 817 to 817;
+  extensions 818 to 818;
+  extensions 819 to 819;
+  extensions 820 to 820;
+  extensions 821 to 821;
+  extensions 822 to 822;
+  extensions 823 to 823;
+  extensions 824 to 824;
+  extensions 827 to 827;
+  extensions 828 to 828;
+  extensions 829 to 829;
+  extensions 830 to 830;
+  extensions 831 to 831;
+  extensions 832 to 832;
+  extensions 833 to 833;
+  extensions 834 to 834;
+  extensions 835 to 835;
+  extensions 836 to 836;
+  extensions 837 to 837;
+  extensions 838 to 838;
+  extensions 839 to 839;
+  extensions 840 to 840;
+  extensions 841 to 841;
+  extensions 842 to 842;
+  extensions 843 to 843;
+  extensions 844 to 844;
+  extensions 845 to 845;
+  extensions 846 to 846;
+  extensions 847 to 847;
+  extensions 848 to 848;
+  extensions 849 to 849;
+  extensions 850 to 850;
+  extensions 851 to 851;
+  extensions 852 to 852;
+  extensions 853 to 853;
+  extensions 854 to 854;
+  extensions 855 to 855;
+  extensions 856 to 856;
+  extensions 857 to 857;
+  extensions 858 to 858;
+  extensions 859 to 859;
+  extensions 860 to 860;
+  extensions 861 to 861;
+  extensions 862 to 862;
+  extensions 863 to 863;
+  extensions 864 to 864;
+  extensions 865 to 865;
+  extensions 866 to 866;
+  extensions 867 to 867;
+  extensions 868 to 868;
+  extensions 869 to 869;
+  extensions 870 to 870;
+  extensions 871 to 871;
+  extensions 880 to 880;
+  extensions 881 to 881;
+  extensions 882 to 882;
+  extensions 883 to 883;
+  extensions 884 to 884;
+  extensions 885 to 885;
+  extensions 886 to 886;
+  extensions 887 to 887;
+  extensions 888 to 888;
+  extensions 890 to 890;
+  extensions 891 to 891;
+  extensions 892 to 892;
+  extensions 912 to 912;
+  extensions 914 to 914;
+  extensions 915 to 915;
+  extensions 916 to 916;
+  extensions 917 to 917;
+  extensions 918 to 918;
+  extensions 919 to 919;
+  extensions 920 to 920;
+  extensions 921 to 921;
+  extensions 922 to 922;
+  extensions 923 to 923;
+  extensions 924 to 924;
+  extensions 925 to 925;
+  extensions 926 to 926;
+  extensions 927 to 927;
+  extensions 928 to 928;
+  extensions 929 to 929;
+  extensions 930 to 930;
+  extensions 931 to 931;
+  extensions 932 to 932;
+  extensions 933 to 933;
+  extensions 934 to 934;
+  extensions 935 to 935;
+  extensions 936 to 936;
+  extensions 937 to 937;
+  extensions 938 to 938;
+  extensions 939 to 939;
+  extensions 940 to 940;
+  extensions 941 to 941;
+  extensions 942 to 942;
+  extensions 943 to 943;
+  extensions 944 to 944;
+  extensions 945 to 945;
+  extensions 946 to 946;
+  extensions 947 to 947;
+  extensions 949 to 949;
+  extensions 950 to 950;
+  extensions 951 to 951;
+  extensions 952 to 952;
+  extensions 954 to 954;
+  extensions 955 to 955;
+  extensions 956 to 956;
+  extensions 957 to 957;
+  extensions 958 to 958;
+  extensions 959 to 959;
+  extensions 960 to 960;
+  extensions 961 to 961;
+  extensions 962 to 962;
+  extensions 963 to 963;
+  extensions 964 to 964;
+  extensions 965 to 965;
+  extensions 966 to 966;
+  extensions 967 to 967;
+  extensions 968 to 968;
+  extensions 969 to 969;
+  extensions 970 to 970;
+  extensions 971 to 971;
+  extensions 972 to 972;
+  extensions 973 to 973;
+  extensions 974 to 974;
+  extensions 975 to 975;
+  extensions 976 to 976;
+  extensions 977 to 977;
+  extensions 978 to 978;
+  extensions 979 to 979;
+  extensions 980 to 980;
+  extensions 981 to 981;
+  extensions 982 to 982;
+  extensions 983 to 983;
+  extensions 984 to 984;
+  extensions 985 to 985;
+  extensions 987 to 987;
+  extensions 988 to 988;
+  extensions 1000 to 1000;
+  extensions 1001 to 1001;
+  extensions 1002 to 1002;
+  extensions 1003 to 1003;
+  extensions 1004 to 1004;
+  extensions 1005 to 1005;
+  extensions 1006 to 1006;
+  extensions 1007 to 1007;
+  extensions 1008 to 1008;
+  extensions 1009 to 1009;
+  extensions 1010 to 1010;
+  extensions 1011 to 1011;
+  extensions 1012 to 1012;
+  extensions 1013 to 1013;
+  extensions 1014 to 1014;
+  extensions 1015 to 1015;
+  extensions 1016 to 1016;
+  extensions 1017 to 1017;
+  extensions 1018 to 1018;
+  extensions 1019 to 1019;
+  extensions 1020 to 1020;
+  extensions 1021 to 1021;
+  extensions 1022 to 1022;
+  extensions 1023 to 1023;
+  extensions 1024 to 1024;
+  extensions 1025 to 1025;
+  extensions 1026 to 1026;
+  extensions 1027 to 1027;
+  extensions 1028 to 1028;
+  extensions 1029 to 1029;
+  extensions 1030 to 1030;
+  extensions 1031 to 1031;
+  extensions 1032 to 1032;
+  extensions 1033 to 1033;
+  extensions 1034 to 1034;
+  extensions 1035 to 1035;
+  extensions 1036 to 1036;
+  extensions 1037 to 1037;
+  extensions 1038 to 1038;
+  extensions 1039 to 1039;
+  extensions 1040 to 1040;
+  extensions 1041 to 1041;
+  extensions 1042 to 1042;
+  extensions 1043 to 1043;
+  extensions 1044 to 1044;
+  extensions 1045 to 1045;
+  extensions 1046 to 1046;
+  extensions 1047 to 1047;
+  extensions 1048 to 1048;
+  extensions 1049 to 1049;
+  extensions 1050 to 1050;
+  extensions 1051 to 1051;
+  extensions 1052 to 1052;
+  extensions 1053 to 1053;
+  extensions 1054 to 1054;
+  extensions 1055 to 1055;
+  extensions 1056 to 1056;
+  extensions 1057 to 1057;
+  extensions 1058 to 1058;
+  extensions 1079 to 1079;
+  extensions 1080 to 1080;
+  extensions 1081 to 1081;
+  extensions 1082 to 1082;
+  extensions 1083 to 1083;
+  extensions 1084 to 1084;
+  extensions 1085 to 1085;
+  extend .benchmarks.google_message3.Message0 {
+    optional .benchmarks.google_message3.Message16945 field17025 = 22068132;
+  }
+}
+
diff --git a/benchmarks/datasets/google_message3/benchmark_message3_2.proto b/benchmarks/datasets/google_message3/benchmark_message3_2.proto
new file mode 100644
index 0000000..7ab993b
--- /dev/null
+++ b/benchmarks/datasets/google_message3/benchmark_message3_2.proto
@@ -0,0 +1,499 @@
+syntax = "proto2";
+
+import "datasets/google_message3/benchmark_message3_3.proto";
+import "datasets/google_message3/benchmark_message3_4.proto";
+import "datasets/google_message3/benchmark_message3_5.proto";
+import "datasets/google_message3/benchmark_message3_7.proto";
+import "datasets/google_message3/benchmark_message3_8.proto";
+package benchmarks.google_message3;
+
+option cc_enable_arenas = true;
+option java_package = "com.google.protobuf.benchmarks";
+
+message Message22853 {
+  optional .benchmarks.google_message3.Enum22854 field22869 = 1;
+  repeated uint32 field22870 = 2 [packed = true];
+  repeated float field22871 = 3 [packed = true];
+  repeated float field22872 = 5 [packed = true];
+  optional .benchmarks.google_message3.UnusedEmptyMessage field22873 = 4;
+}
+
+message Message24345 {
+  optional string field24533 = 1;
+  optional .benchmarks.google_message3.UnusedEnum field24534 = 22;
+  optional .benchmarks.google_message3.Message24346 field24535 = 2;
+  optional string field24536 = 3;
+  optional string field24537 = 4;
+  optional .benchmarks.google_message3.UnusedEnum field24538 = 23;
+  optional string field24539 = 5;
+  required string field24540 = 6;
+  optional string field24541 = 7;
+  optional string field24542 = 8;
+  optional .benchmarks.google_message3.Message24316 field24543 = 9;
+  optional .benchmarks.google_message3.Message24376 field24544 = 10;
+  optional string field24545 = 11;
+  optional string field24546 = 19;
+  optional string field24547 = 20;
+  optional string field24548 = 21;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field24549 = 12;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field24550 = 13;
+  repeated string field24551 = 14;
+  optional string field24552 = 15;
+  optional int32 field24553 = 18;
+  optional .benchmarks.google_message3.Message24379 field24554 = 16;
+  optional string field24555 = 17;
+  repeated .benchmarks.google_message3.Message24356 field24556 = 24;
+  repeated .benchmarks.google_message3.Message24366 field24557 = 25;
+}
+
+message Message24403 {
+  optional .benchmarks.google_message3.Message24401 field24681 = 1;
+  optional .benchmarks.google_message3.Message24402 field24682 = 2;
+}
+
+message Message24391 {
+  optional string field24631 = 1;
+  optional string field24632 = 2;
+  repeated string field24633 = 3;
+  optional string field24634 = 4;
+  repeated string field24635 = 5;
+  repeated string field24636 = 16;
+  optional string field24637 = 17;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field24638 = 25;
+  optional string field24639 = 7;
+  optional string field24640 = 18;
+  optional string field24641 = 19;
+  optional string field24642 = 20;
+  optional int32 field24643 = 24;
+  optional .benchmarks.google_message3.Message24379 field24644 = 8;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field24645 = 9;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field24646 = 10;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field24647 = 11;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field24648 = 12;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field24649 = 13;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field24650 = 14;
+  optional string field24651 = 21;
+  optional int32 field24652 = 22;
+  optional int32 field24653 = 23;
+  repeated string field24654 = 15;
+  repeated string field24655 = 6;
+}
+
+message Message27454 {
+}
+
+message Message27357 {
+  optional string field27410 = 1;
+  optional float field27411 = 2;
+  optional string field27412 = 3;
+  optional bool field27413 = 4;
+  optional bool field27414 = 5;
+}
+
+message Message27360 {
+  optional .benchmarks.google_message3.Message27358 field27426 = 1;
+  optional .benchmarks.google_message3.Enum27361 field27427 = 2;
+  optional .benchmarks.google_message3.Message27358 field27428 = 3;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field27429 = 4;
+}
+
+message Message34387 {
+  optional string field34446 = 1;
+  repeated .benchmarks.google_message3.Message34381 field34447 = 2;
+  optional .benchmarks.google_message3.UnusedEnum field34448 = 3;
+  optional .benchmarks.google_message3.Enum34388 field34449 = 4;
+  optional int64 field34450 = 5;
+}
+
+message Message34621 {
+  optional double field34651 = 1;
+  optional double field34652 = 2;
+  optional double field34653 = 3;
+  optional double field34654 = 4;
+  optional double field34655 = 11;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field34656 = 13;
+  optional .benchmarks.google_message3.Message34619 field34657 = 14;
+  optional string field34658 = 5;
+  optional string field34659 = 9;
+  optional double field34660 = 12;
+  optional bytes field34661 = 19;
+  optional string field34662 = 15;
+  optional string field34663 = 16;
+  optional string field34664 = 17;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field34665 = 18;
+  optional .benchmarks.google_message3.Message34621 field34666 = 20;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field34667 = 100;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field34668 = 101;
+  extend .benchmarks.google_message3.Message0 {
+    optional .benchmarks.google_message3.Message34621 field34669 = 17562023;
+  }
+}
+
+message Message35476 {
+  optional string field35484 = 1;
+  optional string field35485 = 2;
+  optional string field35486 = 3;
+  optional .benchmarks.google_message3.Enum35477 field35487 = 4;
+  optional float field35488 = 5;
+  optional float field35489 = 6;
+  optional float field35490 = 7;
+  optional float field35491 = 8;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field35492 = 9;
+  optional int32 field35493 = 10;
+  optional int32 field35494 = 11;
+  optional int32 field35495 = 12;
+  optional string field35496 = 13;
+  optional string field35497 = 14;
+}
+
+message Message949 {
+  optional string field955 = 1;
+  optional int64 field956 = 2;
+  optional int64 field957 = 3;
+  optional .benchmarks.google_message3.Message730 field958 = 4;
+  repeated string field959 = 5;
+  optional string field960 = 6;
+  optional bool field961 = 7;
+}
+
+message Message36869 {
+  optional int32 field36970 = 1;
+  optional int32 field36971 = 2;
+}
+
+message Message33968 {
+  repeated group Message33969 = 1 {
+  }
+  repeated .benchmarks.google_message3.Message33958 field33989 = 3;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field33990 = 106;
+  optional bool field33991 = 108;
+  optional .benchmarks.google_message3.UnusedEnum field33992 = 107;
+}
+
+message Message6644 {
+  optional .benchmarks.google_message3.UnusedEmptyMessage field6701 = 8;
+  optional string field6702 = 1;
+  optional double field6703 = 2;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field6704 = 9;
+  optional bytes field6705 = 3;
+  optional bytes field6706 = 19;
+  optional .benchmarks.google_message3.Message6637 field6707 = 4;
+  repeated .benchmarks.google_message3.Message6126 field6708 = 18;
+  optional bool field6709 = 6;
+  optional .benchmarks.google_message3.Message6643 field6710 = 10;
+  optional string field6711 = 12;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field6712 = 14;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field6713 = 15;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field6714 = 16;
+  optional int32 field6715 = 17;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field6716 = 20;
+}
+
+message Message18831 {
+  repeated group Message18832 = 1 {
+    optional int32 field18836 = 2;
+    optional string field18837 = 5;
+    optional float field18838 = 3;
+    optional float field18839 = 9;
+    optional int32 field18840 = 11;
+    repeated uint64 field18841 = 4;
+    repeated group Message18833 = 6 {
+      required uint64 field18843 = 7;
+      optional string field18844 = 8;
+      optional float field18845 = 10;
+      optional int32 field18846 = 12;
+      optional bool field18847 = 13;
+    }
+  }
+}
+
+message Message13090 {
+  optional .benchmarks.google_message3.Message13083 field13141 = 1;
+  optional .benchmarks.google_message3.Message13088 field13142 = 2;
+}
+
+message Message11874 {
+  optional .benchmarks.google_message3.Message10391 field11888 = 3;
+  optional string field11889 = 4;
+  optional .benchmarks.google_message3.Message11873 field11890 = 6;
+  optional bool field11891 = 7;
+  extensions 1 to 1;
+  extensions 2 to 2;
+  extensions 5 to 5;
+}
+
+message Message4144 {
+  repeated group Message4145 = 1 {
+    required .benchmarks.google_message3.Enum4146 field4165 = 2;
+    required int32 field4166 = 3;
+    optional .benchmarks.google_message3.Enum4160 field4167 = 9;
+    optional bytes field4168 = 4;
+    optional .benchmarks.google_message3.Enum4152 field4169 = 5;
+    optional string field4170 = 6;
+  }
+}
+
+message Message35573 {
+  optional fixed64 field35695 = 16;
+  optional string field35696 = 1000;
+  optional string field35697 = 1004;
+  optional int32 field35698 = 1003;
+  repeated group Message35574 = 1012 {
+  }
+  optional int64 field35700 = 1011;
+  optional int64 field35701 = 1005;
+  optional int64 field35702 = 1006;
+  optional int64 field35703 = 1007;
+  optional int64 field35704 = 1008;
+  repeated group Message35575 = 1 {
+    optional int64 field35709 = 2;
+    optional string field35710 = 3;
+    optional string field35711 = 19;
+    optional int32 field35712 = 20;
+    optional int32 field35713 = 21;
+    optional int32 field35714 = 22;
+    optional bool field35715 = 23;
+    optional int32 field35716 = 47;
+    optional int32 field35717 = 48;
+    optional bool field35718 = 24;
+    optional fixed64 field35719 = 25;
+    optional bytes field35720 = 52;
+    optional int32 field35721 = 18;
+    optional fixed32 field35722 = 43;
+    optional bool field35723 = 26;
+    optional int32 field35724 = 27;
+    optional int32 field35725 = 17;
+    optional bool field35726 = 45;
+    repeated int32 field35727 = 33;
+    repeated int32 field35728 = 58;
+    optional float field35729 = 34;
+    optional float field35730 = 1009;
+    optional int32 field35731 = 28;
+    repeated fixed64 field35732 = 1001;
+    repeated fixed64 field35733 = 1002;
+    optional int32 field35734 = 44;
+    optional int32 field35735 = 50;
+    optional int32 field35736 = 36;
+    optional int32 field35737 = 40;
+    optional bool field35738 = 1016;
+    optional bool field35739 = 1010;
+    optional int32 field35740 = 37;
+    optional int32 field35741 = 38;
+    optional string field35742 = 46;
+    optional uint32 field35743 = 60;
+    repeated bytes field35744 = 56;
+    optional .benchmarks.google_message3.Message0 field35745 = 57;
+    required group Message35576 = 4 {
+      optional fixed64 field35747 = 5;
+      optional int32 field35748 = 6;
+      optional int32 field35749 = 49;
+      optional int32 field35750 = 7;
+      optional uint32 field35751 = 59;
+      optional int32 field35752 = 14;
+      optional int32 field35753 = 15;
+      optional int32 field35754 = 35;
+      optional bytes field35755 = 53;
+      optional int32 field35756 = 8;
+      optional string field35757 = 9;
+      optional fixed64 field35758 = 10;
+      optional int32 field35759 = 11;
+      optional int32 field35760 = 12;
+      optional int32 field35761 = 41;
+      optional int32 field35762 = 30;
+      optional int32 field35763 = 31;
+      optional int32 field35764 = 13;
+      optional bytes field35765 = 39;
+      optional string field35766 = 29;
+      optional int32 field35767 = 42;
+      repeated int32 field35768 = 32;
+      repeated int32 field35769 = 51;
+      optional int64 field35770 = 54;
+      optional .benchmarks.google_message3.Message0 field35771 = 55;
+    }
+  }
+}
+
+message Message36858 {
+  repeated int32 field36956 = 1;
+  repeated string field36957 = 2;
+  repeated string field36958 = 12;
+  optional int32 field36959 = 3;
+  optional int32 field36960 = 4;
+  optional int32 field36961 = 14;
+  optional string field36962 = 11;
+  optional bool field36963 = 5;
+  optional bool field36964 = 13;
+  optional int64 field36965 = 6;
+  optional .benchmarks.google_message3.Message35506 field36966 = 7;
+  repeated group Message36859 = 8 {
+    required .benchmarks.google_message3.Enum36860 field36968 = 9;
+    optional float field36969 = 10;
+  }
+}
+
+message Message13174 {
+  required int32 field13237 = 6;
+  optional int32 field13238 = 3;
+  required int32 field13239 = 4;
+  optional int32 field13240 = 8;
+  optional double field13241 = 5;
+  optional double field13242 = 7;
+  optional int32 field13243 = 17;
+  optional int32 field13244 = 19;
+  optional double field13245 = 20;
+  optional int32 field13246 = 9;
+  optional double field13247 = 10;
+  optional int32 field13248 = 11;
+  optional .benchmarks.google_message3.Message13151 field13249 = 21;
+  optional int32 field13250 = 1;
+  optional double field13251 = 2;
+  optional double field13252 = 15;
+  optional double field13253 = 16;
+  optional double field13254 = 12;
+  optional double field13255 = 13;
+  optional double field13256 = 14;
+  optional int32 field13257 = 18;
+}
+
+message Message18283 {
+  optional .benchmarks.google_message3.UnusedEmptyMessage field18478 = 1;
+  optional int32 field18479 = 4;
+  optional int32 field18480 = 106;
+  optional int32 field18481 = 107;
+  optional int32 field18482 = 108;
+  optional int32 field18483 = 109;
+  optional int32 field18484 = 105;
+  optional int32 field18485 = 113;
+  optional int32 field18486 = 114;
+  optional int32 field18487 = 124;
+  optional int32 field18488 = 125;
+  optional int32 field18489 = 128;
+  optional int32 field18490 = 135;
+  optional bool field18491 = 166;
+  optional bool field18492 = 136;
+  optional int32 field18493 = 140;
+  optional int32 field18494 = 171;
+  optional int32 field18495 = 148;
+  optional int32 field18496 = 145;
+  optional float field18497 = 117;
+  optional int32 field18498 = 146;
+  optional string field18499 = 3;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field18500 = 5;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field18501 = 6;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field18502 = 9;
+  optional .benchmarks.google_message3.Message18253 field18503 = 155;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field18504 = 184;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field18505 = 163;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field18506 = 16;
+  repeated int32 field18507 = 20;
+  repeated int32 field18508 = 7;
+  repeated string field18509 = 194;
+  optional bytes field18510 = 30;
+  optional int32 field18511 = 31;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field18512 = 178;
+  optional string field18513 = 8;
+  optional float field18514 = 2;
+  optional float field18515 = 100;
+  optional float field18516 = 101;
+  optional float field18517 = 102;
+  optional int32 field18518 = 103;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field18519 = 104;
+  optional int32 field18520 = 110;
+  optional int32 field18521 = 112;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field18522 = 111;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field18523 = 115;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field18524 = 119;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field18525 = 127;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field18526 = 185;
+  optional int32 field18527 = 120;
+  optional int32 field18528 = 132;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field18529 = 126;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field18530 = 129;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field18531 = 131;
+  optional fixed64 field18532 = 150;
+  optional int32 field18533 = 133;
+  optional int32 field18534 = 134;
+  optional int32 field18535 = 139;
+  optional fixed64 field18536 = 137;
+  optional fixed64 field18537 = 138;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field18538 = 141;
+  optional int32 field18539 = 142;
+  optional int32 field18540 = 181;
+  optional .benchmarks.google_message3.Message16816 field18541 = 143;
+  optional .benchmarks.google_message3.Message16685 field18542 = 154;
+  optional int32 field18543 = 144;
+  optional int64 field18544 = 147;
+  optional int64 field18545 = 149;
+  optional int32 field18546 = 151;
+  optional int32 field18547 = 152;
+  optional int32 field18548 = 153;
+  optional float field18549 = 161;
+  optional .benchmarks.google_message3.Message0 field18550 = 123;
+  repeated int64 field18551 = 156;
+  optional int32 field18552 = 157;
+  repeated fixed64 field18553 = 188;
+  optional int32 field18554 = 158;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field18555 = 159;
+  optional bool field18556 = 160;
+  optional uint64 field18557 = 162;
+  optional int32 field18558 = 164;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field18559 = 10;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field18560 = 167;
+  optional int32 field18561 = 168;
+  repeated fixed64 field18562 = 169;
+  repeated string field18563 = 170;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field18564 = 172;
+  optional int64 field18565 = 173;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field18566 = 174;
+  optional int64 field18567 = 175;
+  optional uint32 field18568 = 189;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field18569 = 176;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field18570 = 177;
+  optional uint32 field18571 = 179;
+  optional uint32 field18572 = 180;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field18573 = 182;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field18574 = 183;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field18575 = 121;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field18576 = 186;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field18577 = 187;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field18578 = 190;
+  optional int32 field18579 = 191;
+  optional float field18580 = 192;
+  optional bool field18581 = 193;
+  extensions 116 to 116;
+  extensions 118 to 118;
+  extensions 130 to 130;
+  extensions 165 to 165;
+}
+
+message Message13169 {
+  repeated .benchmarks.google_message3.Message13168 field13223 = 1;
+  required .benchmarks.google_message3.Message13167 field13224 = 2;
+  optional string field13225 = 3;
+}
+
+message Message19255 {
+  optional string field19257 = 1;
+}
+
+message Message35542 {
+  optional bool field35543 = 1;
+  optional bool field35544 = 2;
+  optional bool field35545 = 3;
+}
+
+message Message3901 {
+  optional int32 field3990 = 1;
+  optional int32 field3991 = 2;
+  optional int32 field3992 = 3;
+  optional int32 field3993 = 4;
+  optional int32 field3994 = 7;
+  optional int32 field3995 = 8;
+  optional int32 field3996 = 9;
+  optional int32 field3997 = 10;
+  optional int32 field3998 = 11;
+  optional int32 field3999 = 12;
+  optional .benchmarks.google_message3.UnusedEnum field4000 = 6;
+  optional int32 field4001 = 5;
+}
+
diff --git a/benchmarks/datasets/google_message3/benchmark_message3_3.proto b/benchmarks/datasets/google_message3/benchmark_message3_3.proto
new file mode 100644
index 0000000..e71d266
--- /dev/null
+++ b/benchmarks/datasets/google_message3/benchmark_message3_3.proto
@@ -0,0 +1,466 @@
+syntax = "proto2";
+
+import "datasets/google_message3/benchmark_message3_4.proto";
+import "datasets/google_message3/benchmark_message3_5.proto";
+import "datasets/google_message3/benchmark_message3_7.proto";
+import "datasets/google_message3/benchmark_message3_8.proto";
+package benchmarks.google_message3;
+
+option cc_enable_arenas = true;
+option java_package = "com.google.protobuf.benchmarks";
+
+message Message35546 {
+  optional int64 field35556 = 1;
+  optional int32 field35557 = 2;
+  optional bool field35558 = 3;
+  optional int64 field35559 = 13;
+  optional group Message35547 = 4 {
+    required int32 field35569 = 5;
+    required int32 field35570 = 6;
+  }
+  optional group Message35548 = 10 {
+    required int64 field35571 = 11;
+    required int64 field35572 = 12;
+  }
+  optional bool field35562 = 14;
+  optional bool field35563 = 15;
+  optional int32 field35564 = 16;
+  optional bool field35565 = 17;
+  optional bool field35566 = 18;
+  optional string field35567 = 100;
+}
+
+message Message2356 {
+  optional .benchmarks.google_message3.Message1374 field2368 = 121;
+  optional uint64 field2369 = 1;
+  optional int32 field2370 = 2;
+  optional int32 field2371 = 17;
+  required string field2372 = 3;
+  optional int32 field2373 = 7;
+  optional bytes field2374 = 8;
+  optional string field2375 = 4;
+  optional string field2376 = 101;
+  optional int32 field2377 = 102;
+  optional int32 field2378 = 103;
+  optional int32 field2379 = 104;
+  optional int32 field2380 = 113;
+  optional int32 field2381 = 114;
+  optional int32 field2382 = 115;
+  optional int32 field2383 = 117;
+  optional int32 field2384 = 118;
+  optional int32 field2385 = 119;
+  optional int32 field2386 = 105;
+  optional bytes field2387 = 5;
+  optional group Message2357 = 6 {
+    optional int64 field2399 = 9;
+    optional int32 field2400 = 10;
+    optional int32 field2401 = 11;
+    optional int32 field2402 = 12;
+    optional int32 field2403 = 13;
+    optional int32 field2404 = 116;
+    optional int32 field2405 = 106;
+    required bytes field2406 = 14;
+    optional int32 field2407 = 45;
+    optional int32 field2408 = 112;
+    optional bool field2409 = 122;
+    optional bytes field2410 = 124;
+  }
+  optional string field2389 = 120;
+  optional group Message2358 = 107 {
+  }
+  repeated group Message2359 = 40 {
+    optional string field2413 = 41;
+    optional string field2414 = 42;
+    optional string field2415 = 43;
+    optional string field2416 = 44;
+    optional int32 field2417 = 46;
+    optional string field2418 = 47;
+    optional float field2419 = 110;
+    optional float field2420 = 111;
+  }
+  optional int32 field2392 = 50;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field2393 = 60;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field2394 = 70;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field2395 = 80;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field2396 = 90;
+  optional string field2397 = 100;
+  optional string field2398 = 123;
+}
+
+message Message7029 {
+  required int32 field7183 = 1;
+  optional int32 field7184 = 2;
+  optional int32 field7185 = 3;
+  optional int32 field7186 = 4;
+  optional int32 field7187 = 5;
+  optional int32 field7188 = 6;
+  optional int32 field7189 = 17;
+  optional int32 field7190 = 18;
+  optional int32 field7191 = 49;
+  optional int32 field7192 = 28;
+  optional int32 field7193 = 33;
+  optional int32 field7194 = 25;
+  optional int32 field7195 = 26;
+  optional int32 field7196 = 40;
+  optional int32 field7197 = 41;
+  optional int32 field7198 = 42;
+  optional int32 field7199 = 43;
+  optional int32 field7200 = 19;
+  optional int32 field7201 = 7;
+  optional int32 field7202 = 8;
+  optional int32 field7203 = 9;
+  optional int32 field7204 = 10;
+  optional int32 field7205 = 11;
+  optional int32 field7206 = 12;
+  repeated group Message7030 = 13 {
+    optional string field7226 = 14;
+    optional string field7227 = 15;
+    optional int64 field7228 = 16;
+  }
+  repeated group Message7031 = 21 {
+    optional string field7229 = 22;
+    optional int32 field7230 = 23;
+    optional int32 field7231 = 24;
+    optional int32 field7232 = 30;
+    optional int32 field7233 = 31;
+    optional int32 field7234 = 35;
+  }
+  optional int32 field7209 = 20;
+  optional float field7210 = 27;
+  optional int32 field7211 = 29;
+  optional int32 field7212 = 32;
+  optional string field7213 = 48;
+  optional bool field7214 = 34;
+  optional int32 field7215 = 36;
+  optional float field7216 = 37;
+  optional bool field7217 = 38;
+  optional bool field7218 = 39;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field7219 = 44;
+  optional int32 field7220 = 45;
+  optional int32 field7221 = 46;
+  optional int32 field7222 = 47;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field7223 = 50;
+  optional int32 field7224 = 51;
+}
+
+message Message35538 {
+  required int64 field35539 = 1;
+}
+
+message Message18921 {
+  optional string field18946 = 1;
+  optional fixed64 field18947 = 2;
+  optional int32 field18948 = 3;
+  optional double field18949 = 4;
+  optional bool field18950 = 17;
+  optional bool field18951 = 23;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field18952 = 24;
+  repeated group Message18922 = 5 {
+    optional uint64 field18959 = 6;
+    optional string field18960 = 13;
+    optional bool field18961 = 21;
+    optional bool field18962 = 33;
+    optional int32 field18963 = 7;
+    optional int32 field18964 = 8;
+    optional string field18965 = 9;
+    optional .benchmarks.google_message3.Message18856 field18966 = 10;
+    optional uint64 field18967 = 34;
+    optional .benchmarks.google_message3.UnusedEmptyMessage field18968 = 11;
+    optional uint64 field18969 = 35;
+    optional float field18970 = 12;
+    repeated string field18971 = 14;
+    optional bool field18972 = 15;
+    optional bool field18973 = 16;
+    optional float field18974 = 22;
+    optional int32 field18975 = 18;
+    optional int32 field18976 = 19;
+    optional int32 field18977 = 20;
+    optional .benchmarks.google_message3.UnusedEmptyMessage field18978 = 25;
+    optional .benchmarks.google_message3.UnusedEnum field18979 = 26;
+    repeated string field18980 = 27;
+    optional float field18981 = 28;
+  }
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field18954 = 29;
+  repeated .benchmarks.google_message3.Message18943 field18955 = 30;
+  repeated .benchmarks.google_message3.Message18944 field18956 = 31;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field18957 = 32;
+}
+
+message Message35540 {
+  optional bool field35541 = 1;
+}
+
+message Message3886 {
+  repeated group Message3887 = 1 {
+    required string field3932 = 2;
+    optional string field3933 = 9;
+    optional .benchmarks.google_message3.Message3850 field3934 = 3;
+    optional bytes field3935 = 8;
+  }
+}
+
+message Message6743 {
+  optional .benchmarks.google_message3.Message6721 field6759 = 1;
+  optional .benchmarks.google_message3.Message6723 field6760 = 2;
+  optional .benchmarks.google_message3.Message6723 field6761 = 8;
+  optional .benchmarks.google_message3.Message6725 field6762 = 3;
+  optional .benchmarks.google_message3.Message6726 field6763 = 4;
+  optional .benchmarks.google_message3.Message6733 field6764 = 5;
+  optional .benchmarks.google_message3.Message6734 field6765 = 6;
+  optional .benchmarks.google_message3.Message6742 field6766 = 7;
+}
+
+message Message6773 {
+  optional .benchmarks.google_message3.Enum6769 field6794 = 1;
+  optional int32 field6795 = 9;
+  optional .benchmarks.google_message3.UnusedEnum field6796 = 10;
+  optional int32 field6797 = 11;
+  optional int32 field6798 = 2;
+  optional .benchmarks.google_message3.Enum6774 field6799 = 3;
+  optional double field6800 = 5;
+  optional double field6801 = 7;
+  optional double field6802 = 8;
+  optional .benchmarks.google_message3.Enum6782 field6803 = 6;
+}
+
+message Message8224 {
+  optional .benchmarks.google_message3.UnusedEmptyMessage field8255 = 1;
+  optional .benchmarks.google_message3.Message8184 field8256 = 2;
+  optional .benchmarks.google_message3.Message7966 field8257 = 3;
+  optional string field8258 = 4;
+  optional string field8259 = 5;
+  optional bool field8260 = 6;
+  optional int64 field8261 = 7;
+  optional string field8262 = 8;
+  optional int64 field8263 = 9;
+  optional double field8264 = 10;
+  optional int64 field8265 = 11;
+  repeated string field8266 = 12;
+  optional int64 field8267 = 13;
+  optional int32 field8268 = 14;
+  optional int32 field8269 = 15;
+  optional int64 field8270 = 16;
+  optional double field8271 = 17;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field8272 = 18;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field8273 = 19;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field8274 = 20;
+  optional bool field8275 = 21;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field8276 = 22;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field8277 = 23;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field8278 = 24;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field8279 = 25;
+  optional bool field8280 = 26;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field8281 = 27;
+}
+
+message Message8392 {
+  optional string field8395 = 1;
+  optional string field8396 = 2;
+  optional .benchmarks.google_message3.Message7966 field8397 = 3;
+  optional string field8398 = 4;
+  optional string field8399 = 5;
+  optional string field8400 = 6;
+  optional string field8401 = 7;
+  optional string field8402 = 8;
+  optional string field8403 = 9;
+}
+
+message Message8130 {
+  optional string field8156 = 1;
+  optional string field8157 = 2;
+  optional string field8158 = 4;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field8159 = 6;
+  repeated string field8160 = 7;
+  optional int64 field8161 = 8;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field8162 = 9;
+  optional string field8163 = 10;
+  optional string field8164 = 11;
+  optional string field8165 = 12;
+  optional string field8166 = 13;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field8167 = 14;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field8168 = 15;
+  optional string field8169 = 16;
+  optional .benchmarks.google_message3.UnusedEnum field8170 = 17;
+  optional .benchmarks.google_message3.UnusedEnum field8171 = 18;
+  optional bool field8172 = 19;
+  optional bool field8173 = 20;
+  optional double field8174 = 21;
+  optional int32 field8175 = 22;
+  optional int32 field8176 = 23;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field8177 = 24;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field8178 = 25;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field8179 = 26;
+}
+
+message Message8478 {
+  optional string field8489 = 7;
+  optional .benchmarks.google_message3.Message7966 field8490 = 1;
+  optional .benchmarks.google_message3.Message8476 field8491 = 2;
+  optional int64 field8492 = 3;
+  optional .benchmarks.google_message3.Message8476 field8493 = 4;
+  repeated .benchmarks.google_message3.Message8477 field8494 = 5;
+  optional .benchmarks.google_message3.Message8454 field8495 = 6;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field8496 = 8;
+}
+
+message Message8479 {
+  optional .benchmarks.google_message3.Message8475 field8497 = 1;
+  optional .benchmarks.google_message3.Message7966 field8498 = 2;
+  optional .benchmarks.google_message3.Message8476 field8499 = 3;
+  optional .benchmarks.google_message3.Message8476 field8500 = 4;
+  optional string field8501 = 6;
+  optional string field8502 = 7;
+  optional .benchmarks.google_message3.Message7966 field8503 = 8;
+  optional .benchmarks.google_message3.Message8455 field8504 = 5;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field8505 = 9;
+}
+
+message Message10319 {
+  optional .benchmarks.google_message3.Enum10325 field10340 = 1;
+  optional int32 field10341 = 4;
+  optional int32 field10342 = 5;
+  optional bytes field10343 = 3;
+  optional string field10344 = 2;
+  optional string field10345 = 6;
+  optional string field10346 = 7;
+}
+
+message Message4016 {
+  required int32 field4017 = 1;
+  required int32 field4018 = 2;
+  required int32 field4019 = 3;
+  required int32 field4020 = 4;
+}
+
+message Message12669 {
+  optional .benchmarks.google_message3.Message12559 field12681 = 1;
+  optional float field12682 = 2;
+  optional bool field12683 = 3;
+  optional .benchmarks.google_message3.Enum12670 field12684 = 4;
+}
+
+message Message12819 {
+  optional double field12834 = 1;
+  optional double field12835 = 2;
+  optional double field12836 = 3;
+  optional double field12837 = 4;
+  optional double field12838 = 5;
+  optional double field12839 = 6;
+}
+
+message Message12820 {
+  optional int32 field12840 = 1;
+  optional int32 field12841 = 2;
+  optional int32 field12842 = 3;
+  optional int32 field12843 = 8;
+  optional int32 field12844 = 4;
+  optional int32 field12845 = 5;
+  optional int32 field12846 = 6;
+  optional int32 field12847 = 7;
+}
+
+message Message12821 {
+  optional int32 field12848 = 1;
+  optional int32 field12849 = 2;
+  optional int32 field12850 = 3;
+  optional int32 field12851 = 4;
+  optional int32 field12852 = 5;
+}
+
+message Message12818 {
+  optional uint64 field12829 = 1;
+  optional int32 field12830 = 2;
+  optional int32 field12831 = 3;
+  optional int32 field12832 = 5;
+  repeated .benchmarks.google_message3.Message12817 field12833 = 4;
+}
+
+message Message16479 {
+  optional .benchmarks.google_message3.Message16480 field16484 = 1;
+  optional int32 field16485 = 5;
+  optional float field16486 = 2;
+  optional uint32 field16487 = 4;
+  optional bool field16488 = 3;
+  optional uint32 field16489 = 6;
+}
+
+message Message16722 {
+  optional string field16752 = 1;
+  optional string field16753 = 2;
+  optional string field16754 = 3;
+  optional int32 field16755 = 5;
+  optional string field16756 = 4;
+}
+
+message Message16724 {
+  optional int64 field16761 = 1;
+  optional float field16762 = 2;
+  optional int64 field16763 = 3;
+  optional int64 field16764 = 4;
+  optional bool field16765 = 5;
+  repeated string field16766 = 6;
+  repeated string field16767 = 7;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field16768 = 8;
+  optional bool field16769 = 9;
+  optional uint32 field16770 = 10;
+  optional .benchmarks.google_message3.Enum16728 field16771 = 11;
+  repeated int32 field16772 = 12;
+  optional bool field16773 = 13;
+}
+
+message Message17728 {
+}
+
+message Message24356 {
+  optional string field24559 = 1;
+  optional string field24560 = 2;
+  optional int32 field24561 = 14;
+  optional string field24562 = 3;
+  optional string field24563 = 4;
+  optional string field24564 = 5;
+  optional .benchmarks.google_message3.UnusedEnum field24565 = 13;
+  optional string field24566 = 6;
+  optional .benchmarks.google_message3.Enum24361 field24567 = 12;
+  optional string field24568 = 7;
+  optional string field24569 = 8;
+  optional string field24570 = 9;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field24571 = 10;
+  repeated string field24572 = 11;
+  repeated string field24573 = 15;
+}
+
+message Message24376 {
+  optional string field24589 = 1;
+  optional string field24590 = 2;
+  optional string field24591 = 3;
+  required .benchmarks.google_message3.Message24377 field24592 = 4;
+  optional .benchmarks.google_message3.Message24317 field24593 = 5;
+  optional string field24594 = 6;
+  optional .benchmarks.google_message3.Message24378 field24595 = 7;
+  repeated string field24596 = 8;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field24597 = 14;
+  repeated string field24598 = 9;
+  repeated string field24599 = 10;
+  repeated string field24600 = 11;
+  optional string field24601 = 12;
+  repeated string field24602 = 13;
+}
+
+message Message24366 {
+  optional string field24574 = 1;
+  optional string field24575 = 2;
+  optional string field24576 = 3;
+  optional int32 field24577 = 10;
+  optional string field24578 = 13;
+  optional string field24579 = 4;
+  optional string field24580 = 5;
+  optional .benchmarks.google_message3.UnusedEnum field24581 = 9;
+  optional string field24582 = 14;
+  optional .benchmarks.google_message3.UnusedEnum field24583 = 15;
+  optional string field24584 = 6;
+  optional string field24585 = 12;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field24586 = 7;
+  repeated string field24587 = 8;
+  repeated string field24588 = 11;
+}
+
diff --git a/benchmarks/datasets/google_message3/benchmark_message3_4.proto b/benchmarks/datasets/google_message3/benchmark_message3_4.proto
new file mode 100644
index 0000000..597cec6
--- /dev/null
+++ b/benchmarks/datasets/google_message3/benchmark_message3_4.proto
@@ -0,0 +1,491 @@
+syntax = "proto2";
+
+import "datasets/google_message3/benchmark_message3_5.proto";
+import "datasets/google_message3/benchmark_message3_6.proto";
+import "datasets/google_message3/benchmark_message3_7.proto";
+import "datasets/google_message3/benchmark_message3_8.proto";
+package benchmarks.google_message3;
+
+option cc_enable_arenas = true;
+option java_package = "com.google.protobuf.benchmarks";
+
+message Message24346 {
+}
+
+message Message24401 {
+  optional .benchmarks.google_message3.Message24400 field24679 = 1;
+}
+
+message Message24402 {
+  optional .benchmarks.google_message3.Message24400 field24680 = 1;
+}
+
+message Message24379 {
+  optional string field24603 = 1;
+  optional string field24604 = 2;
+  optional string field24605 = 3;
+  required .benchmarks.google_message3.Message24380 field24606 = 4;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field24607 = 5;
+  optional string field24608 = 6;
+  optional .benchmarks.google_message3.Message24381 field24609 = 7;
+  repeated string field24610 = 8;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field24611 = 17;
+  repeated string field24612 = 9;
+  repeated string field24613 = 10;
+  repeated string field24614 = 11;
+  optional string field24615 = 14;
+  optional string field24616 = 12;
+  optional string field24617 = 16;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field24618 = 13;
+  repeated string field24619 = 15;
+  repeated string field24620 = 18;
+}
+
+message Message27358 {
+  optional int32 field27415 = 1;
+  optional int32 field27416 = 2;
+}
+
+message Message34381 {
+  optional string field34398 = 1;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field34399 = 2;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field34400 = 3;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field34401 = 4;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field34402 = 5;
+  optional bool field34403 = 6;
+  optional bool field34404 = 7;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field34405 = 8;
+  optional bool field34406 = 9;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field34407 = 10;
+}
+
+message Message34619 {
+  optional double field34641 = 1;
+  optional double field34642 = 2;
+  optional double field34643 = 3;
+  optional double field34644 = 4;
+  optional double field34645 = 11;
+  optional double field34646 = 5;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field34647 = 100;
+}
+
+message Message730 {
+  optional string field897 = 19;
+  repeated string field898 = 27;
+  repeated string field899 = 28;
+  repeated string field900 = 21;
+  optional string field901 = 30;
+  repeated uint32 field902 = 20;
+  repeated uint32 field903 = 32;
+  repeated string field904 = 16;
+  repeated .benchmarks.google_message3.Message697 field905 = 6;
+  repeated .benchmarks.google_message3.Message704 field906 = 7;
+  repeated string field907 = 18;
+  repeated .benchmarks.google_message3.Message703 field908 = 8;
+  repeated string field909 = 9;
+  optional .benchmarks.google_message3.Message716 field910 = 10;
+  optional .benchmarks.google_message3.Message718 field911 = 11;
+  optional bool field912 = 14;
+  repeated .benchmarks.google_message3.Message715 field913 = 4;
+  repeated string field914 = 17;
+  repeated string field915 = 23;
+  repeated .benchmarks.google_message3.Message719 field916 = 24;
+  repeated .benchmarks.google_message3.Message728 field917 = 26;
+  repeated .benchmarks.google_message3.Message702 field918 = 35;
+  optional string field919 = 36;
+  repeated string field920 = 37;
+  optional int64 field921 = 38;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field922 = 39;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field923 = 1;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field924 = 2;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field925 = 3;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field926 = 5;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field927 = 13;
+  repeated string field928 = 22;
+  optional bytes field929 = 31;
+  extensions 25 to 25;
+  extensions 29 to 29;
+  extensions 34 to 34;
+  extensions 15 to 15;
+}
+
+message Message33958 {
+  optional string field33977 = 1;
+  optional string field33978 = 9;
+  repeated group Message33959 = 2 {
+    required string field33982 = 3;
+    optional string field33983 = 4;
+    optional string field33984 = 5;
+    optional fixed64 field33985 = 8;
+    optional bool field33986 = 10;
+    optional .benchmarks.google_message3.Message0 field33987 = 6;
+  }
+  optional .benchmarks.google_message3.Enum33960 field33980 = 7;
+  extend .benchmarks.google_message3.Message0 {
+    optional .benchmarks.google_message3.Message33958 field33981 = 10747482;
+  }
+}
+
+message Message6637 {
+  optional .benchmarks.google_message3.UnusedEmptyMessage field6670 = 2;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field6671 = 1;
+  optional int32 field6672 = 3;
+  repeated string field6673 = 4;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field6674 = 5;
+}
+
+message Message6643 {
+  optional .benchmarks.google_message3.UnusedEmptyMessage field6683 = 3;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field6684 = 4;
+  optional double field6685 = 5;
+  optional double field6686 = 6;
+  optional int32 field6687 = 1;
+  optional int32 field6688 = 2;
+  optional double field6689 = 9;
+  optional bytes field6690 = 10;
+  optional int32 field6691 = 11;
+  optional bool field6692 = 12;
+  optional bool field6693 = 13;
+  optional .benchmarks.google_message3.Message6578 field6694 = 15;
+  optional .benchmarks.google_message3.UnusedEnum field6695 = 16;
+  optional int64 field6696 = 17;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field6697 = 22;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field6698 = 19;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field6699 = 20;
+  optional int32 field6700 = 21;
+}
+
+message Message6126 {
+  required string field6152 = 1;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field6153 = 9;
+  optional int32 field6154 = 14;
+  optional bytes field6155 = 10;
+  optional .benchmarks.google_message3.Message6024 field6156 = 12;
+  optional int32 field6157 = 4;
+  optional string field6158 = 5;
+  optional int32 field6159 = 6;
+  repeated int32 field6160 = 2;
+  repeated int32 field6161 = 3;
+  repeated .benchmarks.google_message3.Message6052 field6162 = 7;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field6163 = 11;
+  optional .benchmarks.google_message3.Enum6065 field6164 = 15;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field6165 = 8;
+  optional bool field6166 = 13;
+  optional bool field6167 = 16;
+  optional bool field6168 = 18;
+  repeated .benchmarks.google_message3.Message6054 field6169 = 17;
+  optional int32 field6170 = 19;
+}
+
+message Message13083 {
+  optional float field13096 = 1;
+  repeated group Message13084 = 2 {
+    required float field13107 = 3;
+    required int32 field13108 = 4;
+    optional float field13109 = 5;
+    repeated .benchmarks.google_message3.Enum13092 field13110 = 6;
+  }
+  optional float field13098 = 44;
+  optional float field13099 = 45;
+  optional uint64 field13100 = 46;
+  optional float field13101 = 47;
+  optional group Message13085 = 16 {
+  }
+  repeated group Message13086 = 23 {
+  }
+  repeated group Message13087 = 29 {
+  }
+  optional .benchmarks.google_message3.UnusedEmptyMessage field13105 = 43;
+}
+
+message Message13088 {
+  repeated group Message13089 = 1 {
+    required string field13139 = 2;
+    optional float field13140 = 3;
+  }
+  optional int64 field13136 = 4;
+  optional bool field13137 = 5;
+}
+
+message Message10391 {
+  optional .benchmarks.google_message3.Enum10392 field10411 = 1;
+  optional .benchmarks.google_message3.UnusedEnum field10412 = 2;
+  optional int64 field10413 = 3;
+  optional string field10414 = 4;
+  optional string field10415 = 5;
+  optional bytes field10416 = 6;
+  optional bool field10417 = 8;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field10418 = 9;
+  optional bool field10419 = 10;
+}
+
+message Message11873 {
+  optional string field11876 = 1;
+  optional string field11877 = 4;
+  optional .benchmarks.google_message3.Message10573 field11878 = 5;
+  optional .benchmarks.google_message3.Message10582 field11879 = 6;
+  optional .benchmarks.google_message3.Message10824 field11880 = 7;
+  optional .benchmarks.google_message3.Message10773 field11881 = 12;
+  optional .benchmarks.google_message3.Message11866 field11882 = 8;
+  optional .benchmarks.google_message3.Message10818 field11883 = 13;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field11884 = 16;
+  optional .benchmarks.google_message3.Message10155 field11885 = 11;
+  optional .benchmarks.google_message3.Message10469 field11886 = 14;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field11887 = 15;
+  extensions 9 to 9;
+  extensions 10 to 10;
+}
+
+message Message35506 {
+  optional int32 field35524 = 1;
+  optional string field35525 = 2;
+  optional .benchmarks.google_message3.Enum35507 field35526 = 3;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field35527 = 4;
+}
+
+message Message13151 {
+  repeated .benchmarks.google_message3.Message13145 field13158 = 1;
+}
+
+message Message18253 {
+  repeated group Message18254 = 1 {
+    required fixed64 field18362 = 2;
+    required double field18363 = 3;
+  }
+}
+
+message Message16685 {
+  repeated .benchmarks.google_message3.Message16686 field16694 = 2;
+}
+
+message Message16816 {
+  optional float field16826 = 1;
+  optional .benchmarks.google_message3.Enum16819 field16827 = 2;
+  optional float field16828 = 3;
+  repeated group Message16817 = 4 {
+  }
+  optional bool field16830 = 7;
+  optional bool field16831 = 8;
+  repeated group Message16818 = 12 {
+  }
+  optional string field16833 = 10;
+  optional bool field16834 = 13;
+  optional bool field16835 = 14;
+}
+
+message Message13168 {
+  required int32 field13212 = 1;
+  optional fixed64 field13213 = 7;
+  optional bool field13214 = 8;
+  optional fixed64 field13215 = 10;
+  optional bool field13216 = 11;
+  optional .benchmarks.google_message3.Message12796 field13217 = 9;
+  required double field13218 = 2;
+  required bool field13219 = 3;
+  optional int32 field13220 = 4;
+  required bool field13221 = 5;
+  optional int32 field13222 = 6;
+}
+
+message Message13167 {
+  required int32 field13199 = 1;
+  optional int32 field13200 = 2;
+  optional int32 field13201 = 3;
+  optional bool field13202 = 8;
+  optional fixed64 field13203 = 12;
+  optional bool field13204 = 13;
+  optional .benchmarks.google_message3.Message12796 field13205 = 11;
+  optional fixed64 field13206 = 9;
+  optional bool field13207 = 10;
+  repeated int32 field13208 = 4;
+  optional int32 field13209 = 5;
+  optional int32 field13210 = 6;
+  optional int32 field13211 = 7;
+}
+
+message Message1374 {
+  required string field1375 = 1;
+  optional string field1376 = 2;
+}
+
+message Message18943 {
+}
+
+message Message18944 {
+}
+
+message Message18856 {
+  optional string field18857 = 1;
+  optional string field18858 = 2;
+  optional bool field18859 = 31;
+  optional string field18860 = 26;
+  optional string field18861 = 3;
+  optional string field18862 = 4;
+  optional string field18863 = 5;
+  optional string field18864 = 17;
+  optional string field18865 = 6;
+  optional string field18866 = 7;
+  optional string field18867 = 8;
+  optional string field18868 = 9;
+  optional string field18869 = 10;
+  optional string field18870 = 11;
+  optional string field18871 = 21;
+  optional string field18872 = 18;
+  optional string field18873 = 19;
+  optional string field18874 = 20;
+  optional string field18875 = 22;
+  optional string field18876 = 23;
+  optional string field18877 = 24;
+  optional string field18878 = 25;
+  optional string field18879 = 12;
+  optional string field18880 = 13;
+  optional string field18881 = 29;
+  optional string field18882 = 30;
+  optional string field18883 = 15;
+  optional string field18884 = 16;
+  repeated string field18885 = 14;
+  optional string field18886 = 27;
+  optional string field18887 = 28;
+}
+
+message Message3850 {
+  optional .benchmarks.google_message3.Enum3851 field3924 = 2;
+  optional bool field3925 = 12;
+  optional int32 field3926 = 4;
+  optional bool field3927 = 10;
+  optional bool field3928 = 13;
+  optional bool field3929 = 14;
+}
+
+message Message6721 {
+  optional .benchmarks.google_message3.Message6722 field6744 = 1;
+  optional bool field6745 = 2;
+  optional bool field6746 = 3;
+  optional bool field6747 = 4;
+}
+
+message Message6742 {
+  optional bool field6758 = 1;
+}
+
+message Message6726 {
+  optional int64 field6752 = 1;
+  repeated .benchmarks.google_message3.Message6727 field6753 = 2;
+}
+
+message Message6733 {
+  optional int64 field6754 = 1;
+  optional int64 field6755 = 2;
+  optional bool field6756 = 3;
+}
+
+message Message6723 {
+  optional int64 field6748 = 1;
+  repeated .benchmarks.google_message3.Message6724 field6749 = 2;
+}
+
+message Message6725 {
+  optional int32 field6750 = 1;
+  optional int32 field6751 = 2;
+}
+
+message Message6734 {
+  repeated .benchmarks.google_message3.Message6735 field6757 = 1;
+}
+
+message Message8184 {
+  optional .benchmarks.google_message3.Message7966 field8228 = 1;
+  optional bool field8229 = 2;
+  repeated .benchmarks.google_message3.Message8183 field8230 = 3;
+}
+
+message Message8477 {
+  optional .benchmarks.google_message3.Message7966 field8486 = 1;
+  optional int64 field8487 = 2;
+  optional string field8488 = 3;
+}
+
+message Message8454 {
+  optional .benchmarks.google_message3.Message8449 field8465 = 1;
+  optional int64 field8466 = 3;
+  optional int32 field8467 = 4;
+  optional bool field8468 = 5;
+  extend .benchmarks.google_message3.Message8301 {
+    optional .benchmarks.google_message3.Message8454 field8469 = 66;
+  }
+}
+
+message Message8476 {
+  optional string field8483 = 1;
+  optional string field8484 = 2;
+  optional string field8485 = 3;
+}
+
+message Message8455 {
+  optional .benchmarks.google_message3.Message8449 field8470 = 1;
+  repeated .benchmarks.google_message3.Message8456 field8471 = 2;
+  optional .benchmarks.google_message3.Message8457 field8472 = 5;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field8473 = 6;
+  extend .benchmarks.google_message3.Message8302 {
+    optional .benchmarks.google_message3.Message8455 field8474 = 66;
+  }
+}
+
+message Message8475 {
+  optional string field8481 = 1;
+  optional int64 field8482 = 2;
+}
+
+message Message12559 {
+}
+
+message Message12817 {
+  optional int32 field12826 = 1;
+  optional int32 field12827 = 2;
+  optional int32 field12828 = 3;
+}
+
+message Message16480 {
+  optional .benchmarks.google_message3.Message13358 field16490 = 1;
+  optional .benchmarks.google_message3.Enum16042 field16491 = 2;
+  optional .benchmarks.google_message3.Message13912 field16492 = 3;
+  optional string field16493 = 4;
+  optional string field16494 = 5;
+  optional string field16495 = 6;
+  optional string field16496 = 7;
+  optional .benchmarks.google_message3.Message13358 field16497 = 8;
+  optional fixed32 field16498 = 9;
+}
+
+message Message24317 {
+  optional string field24446 = 1;
+  optional .benchmarks.google_message3.Message24312 field24447 = 2;
+  repeated .benchmarks.google_message3.Message24315 field24448 = 3;
+  repeated .benchmarks.google_message3.Message24313 field24449 = 4;
+  repeated .benchmarks.google_message3.Message24316 field24450 = 5;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field24451 = 6;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field24452 = 7;
+  repeated string field24453 = 8;
+  repeated string field24454 = 9;
+  repeated string field24455 = 10;
+  repeated string field24456 = 28;
+  optional string field24457 = 11;
+  optional string field24458 = 12;
+  optional string field24459 = 13;
+  optional string field24460 = 14;
+  repeated string field24461 = 15;
+  optional string field24462 = 16;
+  repeated string field24463 = 17;
+  repeated string field24464 = 18;
+  repeated string field24465 = 19;
+  repeated string field24466 = 20;
+  repeated string field24467 = 21;
+  repeated string field24468 = 22;
+  repeated string field24469 = 23;
+  repeated string field24470 = 24;
+  optional string field24471 = 25;
+  optional string field24472 = 26;
+  repeated string field24473 = 27;
+  optional bool field24474 = 40;
+}
+
diff --git a/benchmarks/datasets/google_message3/benchmark_message3_5.proto b/benchmarks/datasets/google_message3/benchmark_message3_5.proto
new file mode 100644
index 0000000..bc6cbc1
--- /dev/null
+++ b/benchmarks/datasets/google_message3/benchmark_message3_5.proto
@@ -0,0 +1,473 @@
+syntax = "proto2";
+
+import "datasets/google_message3/benchmark_message3_6.proto";
+import "datasets/google_message3/benchmark_message3_7.proto";
+import "datasets/google_message3/benchmark_message3_8.proto";
+package benchmarks.google_message3;
+
+option cc_enable_arenas = true;
+option java_package = "com.google.protobuf.benchmarks";
+
+message Message24377 {
+}
+
+message Message24378 {
+}
+
+message Message24400 {
+  optional int32 field24674 = 1;
+  optional int32 field24675 = 2;
+  optional int32 field24676 = 3;
+  optional int32 field24677 = 4;
+  optional int32 field24678 = 5;
+}
+
+message Message24380 {
+}
+
+message Message24381 {
+}
+
+message Message719 {
+  repeated string field881 = 1;
+  repeated string field882 = 2;
+  repeated string field883 = 3;
+  optional .benchmarks.google_message3.Enum720 field884 = 4;
+}
+
+message Message728 {
+  required string field887 = 1;
+  repeated string field888 = 2;
+  repeated .benchmarks.google_message3.Message703 field889 = 3;
+  repeated .benchmarks.google_message3.Message715 field890 = 4;
+  repeated string field891 = 5;
+  repeated string field892 = 6;
+  optional .benchmarks.google_message3.Message718 field893 = 7;
+  optional .benchmarks.google_message3.Message716 field894 = 8;
+  repeated string field895 = 9;
+  extensions 10 to 10;
+  extensions 11 to 11;
+  extensions 12 to 12;
+}
+
+message Message704 {
+  optional string field800 = 1;
+  optional string field801 = 7;
+  optional string field802 = 2;
+  optional string field803 = 3;
+  optional string field804 = 4;
+  optional string field805 = 5;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field806 = 6;
+}
+
+message Message697 {
+  optional string field743 = 7;
+  repeated string field744 = 1;
+  repeated string field745 = 2;
+  repeated string field746 = 33;
+  repeated string field747 = 29;
+  repeated string field748 = 30;
+  repeated string field749 = 31;
+  repeated string field750 = 32;
+  repeated string field751 = 13;
+  repeated string field752 = 6;
+  repeated string field753 = 3;
+  repeated string field754 = 14;
+  repeated string field755 = 15;
+  repeated string field756 = 16;
+  repeated string field757 = 4;
+  repeated string field758 = 34;
+  repeated string field759 = 35;
+  repeated string field760 = 5;
+  repeated string field761 = 17;
+  repeated string field762 = 18;
+  repeated string field763 = 19;
+  optional bool field764 = 36;
+  repeated string field765 = 8;
+  repeated string field766 = 9;
+  optional string field767 = 27;
+  optional bool field768 = 25;
+  optional .benchmarks.google_message3.Message700 field769 = 10;
+  optional bool field770 = 11;
+  optional bool field771 = 24;
+  repeated string field772 = 12;
+  repeated string field773 = 20;
+  repeated string field774 = 21;
+  repeated string field775 = 22;
+  repeated .benchmarks.google_message3.Message699 field776 = 23;
+  repeated .benchmarks.google_message3.Message698 field777 = 37;
+  optional int64 field778 = 38;
+  extensions 28 to 28;
+  extensions 26 to 26;
+}
+
+message Message0 {
+  option message_set_wire_format = true;
+  extensions 4 to 2147483646;
+}
+
+message Message6578 {
+  optional .benchmarks.google_message3.Enum6579 field6632 = 1;
+  optional .benchmarks.google_message3.Enum6588 field6633 = 2;
+}
+
+message Message6024 {
+  optional .benchmarks.google_message3.Enum6025 field6048 = 1;
+  optional string field6049 = 2;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field6050 = 3;
+}
+
+message Message6052 {
+  required string field6084 = 1;
+  required bytes field6085 = 2;
+}
+
+message Message6054 {
+  required string field6089 = 1;
+  optional string field6090 = 2;
+}
+
+message Message10573 {
+  repeated .benchmarks.google_message3.Message10576 field10580 = 1;
+  optional string field10581 = 2;
+  extensions 10000 to 536870911;
+}
+
+message Message10824 {
+  required string field10825 = 1;
+  optional int32 field10826 = 2;
+}
+
+message Message10582 {
+  required bool field10583 = 1;
+  required double field10584 = 2;
+  optional bool field10585 = 3;
+  optional double field10586 = 4;
+  optional double field10587 = 5;
+  optional bool field10588 = 6;
+}
+
+message Message10155 {
+  required int32 field10195 = 1;
+  required int32 field10196 = 2;
+  optional .benchmarks.google_message3.Enum10157 field10197 = 59;
+  optional int32 field10198 = 18;
+  optional int32 field10199 = 19;
+  optional int32 field10200 = 21;
+  repeated group Message10156 = 50 {
+    optional .benchmarks.google_message3.Enum8862 field10266 = 51;
+    optional int32 field10267 = 52;
+    optional int32 field10268 = 53;
+    optional int32 field10269 = 54;
+  }
+  optional int32 field10202 = 3;
+  optional int32 field10203 = 4;
+  optional int32 field10204 = 5;
+  optional bool field10205 = 84;
+  optional bool field10206 = 33;
+  optional int32 field10207 = 75;
+  optional float field10208 = 26;
+  optional int32 field10209 = 27;
+  optional int32 field10210 = 49;
+  optional int32 field10211 = 10;
+  optional float field10212 = 78;
+  optional .benchmarks.google_message3.Message9151 field10213 = 91;
+  optional int32 field10214 = 11;
+  optional int32 field10215 = 12;
+  optional float field10216 = 41;
+  optional .benchmarks.google_message3.Message10154 field10217 = 61;
+  optional int32 field10218 = 23;
+  optional bytes field10219 = 24;
+  optional int32 field10220 = 65;
+  repeated bytes field10221 = 66;
+  optional int32 field10222 = 70;
+  optional bytes field10223 = 71;
+  repeated fixed64 field10224 = 73;
+  optional float field10225 = 29;
+  optional int32 field10226 = 30;
+  optional float field10227 = 31;
+  optional int32 field10228 = 32;
+  optional float field10229 = 34;
+  optional int32 field10230 = 35;
+  optional string field10231 = 22;
+  optional fixed64 field10232 = 13;
+  optional fixed64 field10233 = 20;
+  optional bool field10234 = 79;
+  repeated .benchmarks.google_message3.Enum10167 field10235 = 80 [packed = true];
+  optional int32 field10236 = 14;
+  optional int32 field10237 = 15;
+  optional int32 field10238 = 28;
+  repeated string field10239 = 16;
+  optional .benchmarks.google_message3.Message9182 field10240 = 17;
+  optional int32 field10241 = 63;
+  optional float field10242 = 64;
+  optional float field10243 = 37;
+  repeated float field10244 = 43;
+  optional int32 field10245 = 44;
+  optional .benchmarks.google_message3.Message9242 field10246 = 45;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field10247 = 46;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field10248 = 62;
+  optional .benchmarks.google_message3.Message8944 field10249 = 48;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field10250 = 87;
+  optional int32 field10251 = 58;
+  optional int32 field10252 = 92;
+  optional .benchmarks.google_message3.Message9123 field10253 = 93;
+  optional .benchmarks.google_message3.Message9160 field10254 = 60;
+  optional .benchmarks.google_message3.Message8890 field10255 = 67;
+  optional string field10256 = 69;
+  optional int64 field10257 = 74;
+  optional float field10258 = 82;
+  optional float field10259 = 85;
+  optional float field10260 = 86;
+  optional int64 field10261 = 83;
+  optional string field10262 = 77;
+  optional bool field10263 = 88;
+  repeated .benchmarks.google_message3.Message9628 field10264 = 94;
+  extensions 57 to 57;
+  extensions 1000 to 536870911;
+}
+
+message Message11866 {
+  required .benchmarks.google_message3.Message11014 field11868 = 1;
+  optional bool field11869 = 2;
+  optional double field11870 = 3;
+  optional double field11871 = 4;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field11872 = 5;
+}
+
+message Message10469 {
+  optional string field10473 = 1;
+  optional float field10474 = 2;
+  optional int32 field10475 = 3;
+  optional int32 field10476 = 4;
+  optional int32 field10477 = 5;
+  optional bool field10478 = 6;
+  optional bool field10479 = 7;
+  optional int32 field10480 = 8;
+  optional float field10481 = 9;
+}
+
+message Message10818 {
+  optional .benchmarks.google_message3.Message10800 field10819 = 1;
+  optional .benchmarks.google_message3.Message10801 field10820 = 2;
+}
+
+message Message10773 {
+  optional bool field10774 = 9;
+  optional bool field10775 = 1;
+  optional bool field10776 = 23;
+  optional bool field10777 = 2;
+  optional bool field10778 = 3;
+  optional int32 field10779 = 4;
+  optional int32 field10780 = 5;
+  optional int32 field10781 = 6;
+  optional int32 field10782 = 7;
+  optional int32 field10783 = 8;
+  optional int32 field10784 = 10;
+  optional .benchmarks.google_message3.Message10749 field10785 = 11;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field10786 = 12;
+  optional bool field10787 = 13;
+  optional bool field10788 = 15;
+  optional bool field10789 = 16;
+  optional int32 field10790 = 17;
+  optional int32 field10791 = 18;
+  optional bool field10792 = 19;
+  optional bool field10793 = 20;
+  optional bool field10794 = 21;
+  optional .benchmarks.google_message3.UnusedEnum field10795 = 14;
+  optional .benchmarks.google_message3.UnusedEnum field10796 = 22;
+}
+
+message Message13145 {
+  required .benchmarks.google_message3.Enum13146 field13155 = 1;
+  optional float field13156 = 2;
+  optional float field13157 = 3;
+  extensions 1000 to 536870911;
+}
+
+message Message16686 {
+}
+
+message Message12796 {
+  repeated fixed64 field12800 = 1;
+  optional uint64 field12801 = 2;
+}
+
+message Message6722 {
+}
+
+message Message6727 {
+}
+
+message Message6724 {
+}
+
+message Message6735 {
+}
+
+message Message8183 {
+  optional string field8226 = 1;
+  optional string field8227 = 2;
+}
+
+message Message8301 {
+  optional string field8328 = 1;
+  optional .benchmarks.google_message3.Message7966 field8329 = 2;
+  optional string field8330 = 3;
+  optional string field8331 = 4;
+  repeated .benchmarks.google_message3.Message8290 field8332 = 5;
+  optional .benchmarks.google_message3.Message7966 field8333 = 6;
+  repeated .benchmarks.google_message3.Message8298 field8334 = 7;
+  optional .benchmarks.google_message3.Message8300 field8335 = 8;
+  optional int64 field8336 = 9;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field8337 = 10;
+  optional .benchmarks.google_message3.Message7965 field8338 = 11;
+  extensions 64 to 536870911;
+}
+
+message Message8456 {
+}
+
+message Message8302 {
+  optional string field8339 = 1;
+  optional .benchmarks.google_message3.Message7966 field8340 = 2;
+  optional string field8341 = 3;
+  optional string field8342 = 4;
+  optional string field8343 = 5;
+  optional string field8344 = 6;
+  optional string field8345 = 7;
+  optional int64 field8346 = 8;
+  optional int64 field8347 = 9;
+  repeated .benchmarks.google_message3.Message8290 field8348 = 10;
+  optional string field8349 = 11;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field8350 = 12;
+  optional .benchmarks.google_message3.Message8291 field8351 = 13;
+  optional int64 field8352 = 14;
+  optional .benchmarks.google_message3.Message8296 field8353 = 15;
+  optional string field8354 = 16;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field8355 = 17;
+  repeated int32 field8356 = 18;
+  repeated int32 field8357 = 19;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field8358 = 20;
+  optional .benchmarks.google_message3.Message7965 field8359 = 21;
+  extensions 64 to 536870911;
+}
+
+message Message8457 {
+}
+
+message Message8449 {
+  optional string field8458 = 1;
+  optional bool field8459 = 2;
+  optional .benchmarks.google_message3.Enum8450 field8460 = 3;
+  repeated string field8461 = 4;
+  optional string field8462 = 5;
+  optional string field8463 = 6;
+  optional .benchmarks.google_message3.Message7966 field8464 = 7;
+}
+
+message Message13358 {
+  required fixed64 field13359 = 1;
+  required fixed64 field13360 = 2;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field13361 = 3;
+}
+
+message Message13912 {
+  required fixed32 field13913 = 1;
+  required fixed32 field13914 = 2;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field13915 = 500;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field13916 = 15;
+}
+
+message Message24316 {
+  repeated string field24443 = 1;
+  repeated string field24444 = 2;
+  repeated string field24445 = 3;
+}
+
+message Message24312 {
+  optional string field24421 = 1;
+  optional string field24422 = 2;
+  repeated string field24423 = 3;
+  repeated string field24424 = 4;
+  repeated string field24425 = 5;
+  repeated string field24426 = 6;
+}
+
+message Message24313 {
+  optional string field24427 = 1;
+  optional string field24428 = 2;
+  repeated string field24429 = 3;
+  optional string field24430 = 4;
+  optional string field24431 = 5;
+  optional string field24432 = 6;
+  optional string field24433 = 7;
+  repeated string field24434 = 8;
+  optional string field24435 = 9;
+  repeated string field24436 = 10;
+}
+
+message Message24315 {
+  required string field24440 = 1;
+  repeated string field24441 = 2;
+  repeated string field24442 = 3;
+}
+
+message Message716 {
+  required string field872 = 1;
+  required int32 field873 = 2;
+  optional bool field874 = 3;
+  optional .benchmarks.google_message3.Message717 field875 = 4;
+}
+
+message Message718 {
+  repeated string field878 = 1;
+  repeated string field879 = 2;
+  optional string field880 = 3;
+}
+
+message Message703 {
+  required string field795 = 1;
+  repeated string field796 = 2;
+  repeated string field797 = 3;
+  optional string field798 = 4;
+  repeated string field799 = 5;
+}
+
+message Message715 {
+  required string field859 = 1;
+  optional string field860 = 7;
+  repeated .benchmarks.google_message3.Message707 field861 = 2;
+  repeated .benchmarks.google_message3.Message708 field862 = 3;
+  repeated .benchmarks.google_message3.Message711 field863 = 4;
+  repeated .benchmarks.google_message3.Message712 field864 = 5;
+  repeated .benchmarks.google_message3.Message713 field865 = 6;
+  repeated .benchmarks.google_message3.Message714 field866 = 8;
+  repeated .benchmarks.google_message3.Message710 field867 = 9;
+  repeated .benchmarks.google_message3.Message709 field868 = 10;
+  repeated .benchmarks.google_message3.Message705 field869 = 11;
+  repeated .benchmarks.google_message3.Message702 field870 = 12;
+  repeated .benchmarks.google_message3.Message706 field871 = 13;
+}
+
+message Message700 {
+  repeated string field789 = 1;
+  repeated string field790 = 2;
+}
+
+message Message699 {
+  required string field787 = 1;
+  repeated string field788 = 2;
+}
+
+message Message698 {
+  optional string field779 = 1;
+  optional string field780 = 2;
+  optional string field781 = 3;
+  optional string field782 = 4;
+  optional uint64 field783 = 5;
+  optional uint32 field784 = 6;
+  optional int64 field785 = 7;
+  repeated string field786 = 8;
+}
+
diff --git a/benchmarks/datasets/google_message3/benchmark_message3_6.proto b/benchmarks/datasets/google_message3/benchmark_message3_6.proto
new file mode 100644
index 0000000..98e1529
--- /dev/null
+++ b/benchmarks/datasets/google_message3/benchmark_message3_6.proto
@@ -0,0 +1,454 @@
+syntax = "proto2";
+
+import "datasets/google_message3/benchmark_message3_7.proto";
+import "datasets/google_message3/benchmark_message3_8.proto";
+package benchmarks.google_message3;
+
+option cc_enable_arenas = true;
+option java_package = "com.google.protobuf.benchmarks";
+
+message Message10576 {
+}
+
+message Message10154 {
+  optional bytes field10192 = 1;
+  optional int32 field10193 = 2;
+}
+
+message Message8944 {
+  optional string field9045 = 2;
+  optional string field9046 = 3;
+  optional string field9047 = 23;
+  optional string field9048 = 52;
+  optional int32 field9049 = 53;
+  optional int32 field9050 = 54;
+  optional float field9051 = 55;
+  optional float field9052 = 56;
+  optional string field9053 = 57;
+  optional int64 field9054 = 1;
+  optional bool field9055 = 4;
+  optional int32 field9056 = 5;
+  optional int32 field9057 = 6;
+  optional int32 field9058 = 7;
+  optional float field9059 = 8;
+  optional float field9060 = 11;
+  optional float field9061 = 9;
+  optional float field9062 = 10;
+  optional float field9063 = 13;
+  optional bool field9064 = 14;
+  optional float field9065 = 70;
+  optional int32 field9066 = 71;
+  optional .benchmarks.google_message3.Enum8945 field9067 = 15;
+  optional int32 field9068 = 16;
+  optional int32 field9069 = 17;
+  optional float field9070 = 18;
+  optional float field9071 = 19;
+  optional int32 field9072 = 28;
+  optional int32 field9073 = 29;
+  optional float field9074 = 60;
+  optional float field9075 = 61;
+  optional int32 field9076 = 72;
+  optional int32 field9077 = 73;
+  optional .benchmarks.google_message3.Enum8951 field9078 = 62;
+  optional string field9079 = 20;
+  optional string field9080 = 21;
+  optional string field9081 = 22;
+  optional double field9082 = 31;
+  optional double field9083 = 32;
+  optional double field9084 = 33;
+  optional double field9085 = 36;
+  optional .benchmarks.google_message3.UnusedEnum field9086 = 37;
+  optional double field9087 = 38;
+  optional double field9088 = 39;
+  optional double field9089 = 63;
+  optional double field9090 = 64;
+  optional double field9091 = 65;
+  optional double field9092 = 34;
+  optional .benchmarks.google_message3.UnusedEnum field9093 = 35;
+  optional .benchmarks.google_message3.UnusedEnum field9094 = 66;
+  optional string field9095 = 40;
+  optional string field9096 = 41;
+  optional string field9097 = 42;
+  optional string field9098 = 43;
+  optional string field9099 = 44;
+  optional string field9100 = 45;
+  optional string field9101 = 46;
+  optional string field9102 = 47;
+  optional string field9103 = 48;
+  optional string field9104 = 49;
+  optional .benchmarks.google_message3.Message8939 field9105 = 100;
+  optional int64 field9106 = 101;
+}
+
+message Message9182 {
+  optional string field9205 = 1;
+  optional string field9206 = 2;
+  optional float field9207 = 16;
+  optional int32 field9208 = 17;
+  optional int32 field9209 = 27;
+  optional int32 field9210 = 7;
+  optional int32 field9211 = 8;
+  optional float field9212 = 26;
+  optional float field9213 = 22;
+  optional bool field9214 = 28;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field9215 = 21;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field9216 = 25;
+  repeated .benchmarks.google_message3.Message9181 field9217 = 29;
+  optional bool field9218 = 18;
+  optional bool field9219 = 19;
+  optional bool field9220 = 20;
+  optional .benchmarks.google_message3.Message9164 field9221 = 30;
+  optional .benchmarks.google_message3.Message9165 field9222 = 31;
+  optional .benchmarks.google_message3.Message9166 field9223 = 32;
+  optional float field9224 = 33;
+  optional .benchmarks.google_message3.Message9151 field9225 = 34;
+  optional float field9226 = 35;
+  optional float field9227 = 36;
+  optional float field9228 = 37;
+  optional float field9229 = 38;
+  optional float field9230 = 39;
+  extensions 3 to 6;
+  extensions 9 to 15;
+  extensions 23 to 23;
+  extensions 24 to 24;
+  extensions 1000 to 536870911;
+}
+
+message Message9160 {
+  optional int32 field9161 = 1;
+  optional bytes field9162 = 2;
+}
+
+message Message9242 {
+  repeated .benchmarks.google_message3.Enum9243 field9327 = 1;
+}
+
+message Message8890 {
+  repeated .benchmarks.google_message3.Message8888 field8916 = 1;
+}
+
+message Message9123 {
+  optional float field9135 = 1;
+}
+
+message Message9628 {
+  optional .benchmarks.google_message3.Message9627 field9673 = 1;
+  optional string field9674 = 2;
+  repeated int32 field9675 = 3;
+  optional int32 field9676 = 4;
+}
+
+message Message11014 {
+  optional int32 field11780 = 40;
+  optional string field11781 = 46;
+  optional bool field11782 = 47;
+  optional .benchmarks.google_message3.Enum11107 field11783 = 1;
+  optional int32 field11784 = 2;
+  optional double field11785 = 4;
+  optional int32 field11786 = 5;
+  optional int32 field11787 = 6;
+  optional double field11788 = 7;
+  optional double field11789 = 8;
+  optional int64 field11790 = 9;
+  optional bool field11791 = 10;
+  optional int64 field11792 = 28;
+  optional bool field11793 = 37;
+  optional .benchmarks.google_message3.Enum11541 field11794 = 44;
+  optional double field11795 = 49;
+  optional double field11796 = 51;
+  optional int64 field11797 = 54;
+  optional int64 field11798 = 55;
+  optional .benchmarks.google_message3.UnusedEnum field11799 = 57;
+  optional .benchmarks.google_message3.Enum11468 field11800 = 58;
+  optional int32 field11801 = 59;
+  optional .benchmarks.google_message3.UnusedEnum field11802 = 60;
+  optional int32 field11803 = 61;
+  optional int32 field11804 = 62;
+  optional int32 field11805 = 69;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field11806 = 68;
+  repeated .benchmarks.google_message3.Message11018 field11807 = 71;
+  optional bool field11808 = 50;
+  optional bool field11809 = 56;
+  optional bool field11810 = 66;
+  optional bool field11811 = 63;
+  optional bool field11812 = 64;
+  optional bool field11813 = 65;
+  optional bool field11814 = 67;
+  optional .benchmarks.google_message3.Enum11107 field11815 = 15;
+  optional int64 field11816 = 16;
+  optional double field11817 = 17;
+  optional int64 field11818 = 18;
+  optional int32 field11819 = 19;
+  optional int64 field11820 = 20;
+  optional int32 field11821 = 42;
+  optional int64 field11822 = 52;
+  optional int64 field11823 = 53;
+  optional int64 field11824 = 41;
+  optional double field11825 = 48;
+  repeated .benchmarks.google_message3.Message11020 field11826 = 70;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field11827 = 72;
+  optional double field11828 = 25;
+  optional string field11829 = 26;
+  optional int64 field11830 = 27;
+  optional int64 field11831 = 32;
+  optional uint64 field11832 = 33;
+  optional bool field11833 = 29;
+  optional bool field11834 = 34;
+  optional string field11835 = 30;
+  optional int32 field11836 = 3;
+  optional int32 field11837 = 31;
+  optional int32 field11838 = 73;
+  optional int32 field11839 = 35;
+  optional .benchmarks.google_message3.Enum11022 field11840 = 36;
+  optional .benchmarks.google_message3.Message11013 field11841 = 38;
+  optional double field11842 = 39;
+  optional int32 field11843 = 45;
+  optional bool field11844 = 74;
+}
+
+message Message10801 {
+  optional .benchmarks.google_message3.Message10800 field10812 = 1;
+  repeated .benchmarks.google_message3.Message10802 field10813 = 2;
+  optional int32 field10814 = 3;
+}
+
+message Message10749 {
+  repeated .benchmarks.google_message3.Message10748 field10754 = 1;
+}
+
+message Message8298 {
+  optional .benchmarks.google_message3.Message7966 field8321 = 1;
+  optional int64 field8322 = 2;
+  optional string field8323 = 3;
+}
+
+message Message8300 {
+  optional string field8326 = 1;
+  optional .benchmarks.google_message3.Message7966 field8327 = 2;
+}
+
+message Message8291 {
+  optional string field8306 = 1;
+  optional int32 field8307 = 2;
+  optional string field8308 = 3;
+  optional string field8309 = 4;
+  optional .benchmarks.google_message3.Enum8292 field8310 = 5;
+}
+
+message Message8296 {
+  optional .benchmarks.google_message3.Message7966 field8311 = 1;
+  optional string field8312 = 2;
+  optional .benchmarks.google_message3.Message7966 field8313 = 3;
+  optional int32 field8314 = 4;
+  optional int32 field8315 = 5;
+  optional string field8316 = 6;
+}
+
+message Message7965 {
+  optional int32 field7967 = 1;
+  optional int32 field7968 = 2;
+}
+
+message Message8290 {
+  optional string field8304 = 1;
+  optional string field8305 = 2;
+}
+
+message Message717 {
+  repeated string field876 = 1;
+  optional double field877 = 2;
+}
+
+message Message713 {
+  required .benchmarks.google_message3.Message708 field852 = 1;
+  repeated string field853 = 2;
+}
+
+message Message705 {
+  required string field807 = 1;
+  optional string field808 = 2;
+  optional string field809 = 3;
+  optional bool field810 = 4;
+  optional string field811 = 5;
+  optional string field812 = 6;
+  repeated string field813 = 7;
+}
+
+message Message709 {
+  repeated string field829 = 1;
+  repeated string field830 = 2;
+  repeated string field831 = 3;
+  repeated string field832 = 4;
+  repeated string field833 = 5;
+}
+
+message Message702 {
+  optional string field793 = 1;
+  optional string field794 = 2;
+}
+
+message Message714 {
+  optional string field854 = 1;
+  optional string field855 = 2;
+  optional string field856 = 3;
+  optional string field857 = 4;
+  optional uint32 field858 = 5;
+}
+
+message Message710 {
+  repeated string field834 = 1;
+  optional string field835 = 2;
+  optional string field836 = 3;
+  repeated string field837 = 4;
+  repeated string field838 = 5;
+}
+
+message Message706 {
+  repeated string field814 = 1;
+  optional string field815 = 2;
+  repeated string field816 = 3;
+  repeated string field817 = 4;
+}
+
+message Message707 {
+  required string field818 = 1;
+  required string field819 = 2;
+  required string field820 = 3;
+  optional bool field821 = 4;
+  repeated string field822 = 5;
+}
+
+message Message711 {
+  optional .benchmarks.google_message3.UnusedEmptyMessage field839 = 1;
+  repeated string field840 = 4;
+  repeated string field841 = 2;
+  repeated string field842 = 3;
+}
+
+message Message712 {
+  repeated string field843 = 1;
+  required string field844 = 2;
+  optional string field845 = 3;
+  repeated string field846 = 4;
+  repeated string field847 = 5;
+  optional string field848 = 6;
+  repeated string field849 = 7;
+  optional string field850 = 8;
+  optional string field851 = 9;
+}
+
+message Message8939 {
+  optional string field9010 = 1;
+  optional string field9011 = 2;
+  optional string field9012 = 3;
+  repeated string field9013 = 4;
+  optional string field9014 = 5;
+  repeated group Message8940 = 11 {
+  }
+  optional int64 field9016 = 21;
+  optional int64 field9017 = 22;
+  optional int64 field9018 = 23;
+  optional group Message8941 = 31 {
+    optional string field9033 = 32;
+    optional string field9034 = 33;
+    optional string field9035 = 34;
+    optional string field9036 = 35;
+    optional string field9037 = 36;
+    optional string field9038 = 37;
+  }
+  optional .benchmarks.google_message3.Message8942 field9020 = 38;
+  repeated .benchmarks.google_message3.UnusedEmptyMessage field9021 = 39;
+  repeated string field9022 = 41;
+  optional string field9023 = 42;
+  optional string field9024 = 43;
+  optional string field9025 = 44;
+  optional string field9026 = 45;
+  optional string field9027 = 46;
+  optional string field9028 = 47;
+  optional .benchmarks.google_message3.UnusedEnum field9029 = 48;
+  optional .benchmarks.google_message3.UnusedEnum field9030 = 49;
+  optional group Message8943 = 51 {
+    optional string field9039 = 1;
+    optional string field9040 = 2;
+    optional string field9041 = 3;
+    optional string field9042 = 4;
+    optional string field9043 = 5;
+    optional string field9044 = 6;
+  }
+}
+
+message Message9181 {
+  optional string field9204 = 1;
+}
+
+message Message9164 {
+  optional int32 field9168 = 1;
+  optional int32 field9169 = 2;
+  optional int32 field9170 = 3;
+}
+
+message Message9165 {
+  optional float field9171 = 1;
+  optional float field9172 = 2;
+}
+
+message Message9166 {
+  optional float field9173 = 1;
+  optional int32 field9174 = 2;
+}
+
+message Message9151 {
+  optional double field9152 = 1;
+  optional double field9153 = 2;
+  optional float field9154 = 3;
+  optional float field9155 = 4;
+  optional float field9156 = 5;
+  optional float field9157 = 6;
+  optional float field9158 = 7;
+  optional float field9159 = 8;
+}
+
+message Message8888 {
+  optional int32 field8908 = 1;
+  optional .benchmarks.google_message3.Enum8900 field8909 = 4;
+  repeated int32 field8910 = 2 [packed = true];
+  optional bytes field8911 = 3;
+}
+
+message Message9627 {
+  required int32 field9668 = 1;
+  required int32 field9669 = 2;
+  required int32 field9670 = 3;
+  required int32 field9671 = 4;
+  optional float field9672 = 5;
+}
+
+message Message11020 {
+}
+
+message Message11013 {
+  optional bytes field11757 = 19;
+  optional bytes field11758 = 1;
+  optional bytes field11759 = 2;
+  optional bytes field11760 = 3;
+  optional bytes field11761 = 4;
+  optional bytes field11762 = 5;
+  optional bytes field11763 = 6;
+  optional bytes field11764 = 7;
+  optional bytes field11765 = 8;
+  optional bytes field11766 = 9;
+  optional bytes field11767 = 10;
+  optional bytes field11768 = 11;
+  optional bytes field11769 = 12;
+  optional bytes field11770 = 13;
+  optional bytes field11771 = 14;
+  optional bytes field11772 = 15;
+  optional bytes field11773 = 16;
+  optional bytes field11774 = 17;
+  optional bytes field11775 = 18;
+  optional bytes field11776 = 20;
+  optional bytes field11777 = 21;
+  optional .benchmarks.google_message3.UnusedEmptyMessage field11778 = 23;
+  repeated .benchmarks.google_message3.Message11011 field11779 = 22;
+}
+
diff --git a/benchmarks/datasets/google_message3/benchmark_message3_7.proto b/benchmarks/datasets/google_message3/benchmark_message3_7.proto
new file mode 100644
index 0000000..2497db5
--- /dev/null
+++ b/benchmarks/datasets/google_message3/benchmark_message3_7.proto
@@ -0,0 +1,56 @@
+syntax = "proto2";
+
+package benchmarks.google_message3;
+
+option cc_enable_arenas = true;
+option java_package = "com.google.protobuf.benchmarks";
+
+message Message11018 {
+}
+
+message Message10800 {
+  optional string field10808 = 1;
+  optional int64 field10809 = 2;
+  optional bool field10810 = 3;
+  optional float field10811 = 4;
+}
+
+message Message10802 {
+}
+
+message Message10748 {
+  optional string field10750 = 1;
+  optional int32 field10751 = 2;
+  optional int32 field10752 = 3;
+  optional int32 field10753 = 4;
+}
+
+message Message7966 {
+  optional string field7969 = 1;
+  optional bool field7970 = 2;
+}
+
+message Message708 {
+  optional .benchmarks.google_message3.Message741 field823 = 1;
+  repeated string field824 = 6;
+  optional string field825 = 2;
+  optional string field826 = 3;
+  repeated string field827 = 4;
+  repeated string field828 = 5;
+}
+
+message Message8942 {
+}
+
+message Message11011 {
+  required bytes field11752 = 1;
+  required bytes field11753 = 2;
+}
+
+message UnusedEmptyMessage {
+}
+
+message Message741 {
+  repeated string field936 = 1;
+}
+
diff --git a/benchmarks/datasets/google_message3/benchmark_message3_8.proto b/benchmarks/datasets/google_message3/benchmark_message3_8.proto
new file mode 100644
index 0000000..1d2b147
--- /dev/null
+++ b/benchmarks/datasets/google_message3/benchmark_message3_8.proto
@@ -0,0 +1,1900 @@
+syntax = "proto2";
+
+package benchmarks.google_message3;
+
+option cc_enable_arenas = true;
+option java_package = "com.google.protobuf.benchmarks";
+
+enum Enum720 {
+  ENUM_VALUE721 = 1;
+  ENUM_VALUE722 = 2;
+}
+
+enum Enum3476 {
+  ENUM_VALUE3477 = 0;
+  ENUM_VALUE3478 = 1;
+  ENUM_VALUE3479 = 2;
+  ENUM_VALUE3480 = 3;
+  ENUM_VALUE3481 = 4;
+  ENUM_VALUE3482 = 5;
+  ENUM_VALUE3483 = 6;
+  ENUM_VALUE3484 = 7;
+  ENUM_VALUE3485 = 8;
+  ENUM_VALUE3486 = 9;
+  ENUM_VALUE3487 = 10;
+  ENUM_VALUE3488 = 11;
+  ENUM_VALUE3489 = 12;
+  ENUM_VALUE3490 = 13;
+  ENUM_VALUE3491 = 14;
+  ENUM_VALUE3492 = 15;
+  ENUM_VALUE3493 = 16;
+  ENUM_VALUE3494 = 17;
+  ENUM_VALUE3495 = 18;
+  ENUM_VALUE3496 = 19;
+  ENUM_VALUE3497 = 20;
+  ENUM_VALUE3498 = 21;
+  ENUM_VALUE3499 = 22;
+  ENUM_VALUE3500 = 23;
+  ENUM_VALUE3501 = 24;
+  ENUM_VALUE3502 = 25;
+  ENUM_VALUE3503 = 26;
+  ENUM_VALUE3504 = 27;
+  ENUM_VALUE3505 = 28;
+  ENUM_VALUE3506 = 29;
+  ENUM_VALUE3507 = 30;
+  ENUM_VALUE3508 = 31;
+  ENUM_VALUE3509 = 32;
+  ENUM_VALUE3510 = 33;
+  ENUM_VALUE3511 = 34;
+  ENUM_VALUE3512 = 35;
+  ENUM_VALUE3513 = 36;
+  ENUM_VALUE3514 = 37;
+  ENUM_VALUE3515 = 38;
+  ENUM_VALUE3516 = 39;
+  ENUM_VALUE3517 = 40;
+  ENUM_VALUE3518 = 41;
+  ENUM_VALUE3519 = 42;
+  ENUM_VALUE3520 = 43;
+  ENUM_VALUE3521 = 44;
+  ENUM_VALUE3522 = 45;
+  ENUM_VALUE3523 = 46;
+  ENUM_VALUE3524 = 47;
+  ENUM_VALUE3525 = 48;
+  ENUM_VALUE3526 = 49;
+  ENUM_VALUE3527 = 50;
+  ENUM_VALUE3528 = 51;
+  ENUM_VALUE3529 = 52;
+  ENUM_VALUE3530 = 53;
+  ENUM_VALUE3531 = 54;
+  ENUM_VALUE3532 = 55;
+  ENUM_VALUE3533 = 56;
+  ENUM_VALUE3534 = 57;
+  ENUM_VALUE3535 = 58;
+  ENUM_VALUE3536 = 59;
+  ENUM_VALUE3537 = 60;
+  ENUM_VALUE3538 = 61;
+  ENUM_VALUE3539 = 62;
+  ENUM_VALUE3540 = 63;
+  ENUM_VALUE3541 = 64;
+  ENUM_VALUE3542 = 65;
+  ENUM_VALUE3543 = 66;
+  ENUM_VALUE3544 = 67;
+  ENUM_VALUE3545 = 68;
+  ENUM_VALUE3546 = 69;
+  ENUM_VALUE3547 = 70;
+  ENUM_VALUE3548 = 71;
+  ENUM_VALUE3549 = 72;
+  ENUM_VALUE3550 = 73;
+  ENUM_VALUE3551 = 74;
+  ENUM_VALUE3552 = 75;
+  ENUM_VALUE3553 = 76;
+  ENUM_VALUE3554 = 77;
+  ENUM_VALUE3555 = 78;
+  ENUM_VALUE3556 = 79;
+  ENUM_VALUE3557 = 80;
+  ENUM_VALUE3558 = 81;
+  ENUM_VALUE3559 = 82;
+  ENUM_VALUE3560 = 83;
+  ENUM_VALUE3561 = 84;
+  ENUM_VALUE3562 = 85;
+  ENUM_VALUE3563 = 86;
+  ENUM_VALUE3564 = 87;
+  ENUM_VALUE3565 = 88;
+  ENUM_VALUE3566 = 89;
+  ENUM_VALUE3567 = 90;
+  ENUM_VALUE3568 = 91;
+  ENUM_VALUE3569 = 92;
+  ENUM_VALUE3570 = 93;
+  ENUM_VALUE3571 = 94;
+  ENUM_VALUE3572 = 95;
+  ENUM_VALUE3573 = 96;
+  ENUM_VALUE3574 = 97;
+  ENUM_VALUE3575 = 98;
+  ENUM_VALUE3576 = 99;
+  ENUM_VALUE3577 = 100;
+  ENUM_VALUE3578 = 101;
+  ENUM_VALUE3579 = 102;
+  ENUM_VALUE3580 = 103;
+  ENUM_VALUE3581 = 104;
+  ENUM_VALUE3582 = 105;
+  ENUM_VALUE3583 = 106;
+  ENUM_VALUE3584 = 107;
+  ENUM_VALUE3585 = 108;
+  ENUM_VALUE3586 = 109;
+  ENUM_VALUE3587 = 110;
+  ENUM_VALUE3588 = 111;
+  ENUM_VALUE3589 = 112;
+  ENUM_VALUE3590 = 113;
+  ENUM_VALUE3591 = 114;
+  ENUM_VALUE3592 = 115;
+  ENUM_VALUE3593 = 116;
+  ENUM_VALUE3594 = 117;
+  ENUM_VALUE3595 = 118;
+  ENUM_VALUE3596 = 119;
+  ENUM_VALUE3597 = 120;
+  ENUM_VALUE3598 = 121;
+  ENUM_VALUE3599 = 122;
+  ENUM_VALUE3600 = 123;
+  ENUM_VALUE3601 = 124;
+  ENUM_VALUE3602 = 125;
+  ENUM_VALUE3603 = 126;
+  ENUM_VALUE3604 = 127;
+  ENUM_VALUE3605 = 128;
+  ENUM_VALUE3606 = 129;
+  ENUM_VALUE3607 = 130;
+  ENUM_VALUE3608 = 131;
+  ENUM_VALUE3609 = 132;
+  ENUM_VALUE3610 = 133;
+  ENUM_VALUE3611 = 134;
+  ENUM_VALUE3612 = 135;
+  ENUM_VALUE3613 = 136;
+  ENUM_VALUE3614 = 137;
+  ENUM_VALUE3615 = 138;
+  ENUM_VALUE3616 = 139;
+  ENUM_VALUE3617 = 140;
+  ENUM_VALUE3618 = 141;
+  ENUM_VALUE3619 = 142;
+  ENUM_VALUE3620 = 143;
+  ENUM_VALUE3621 = 144;
+  ENUM_VALUE3622 = 145;
+  ENUM_VALUE3623 = 146;
+  ENUM_VALUE3624 = 147;
+  ENUM_VALUE3625 = 148;
+  ENUM_VALUE3626 = 149;
+  ENUM_VALUE3627 = 150;
+  ENUM_VALUE3628 = 151;
+  ENUM_VALUE3629 = 152;
+  ENUM_VALUE3630 = 153;
+  ENUM_VALUE3631 = 154;
+  ENUM_VALUE3632 = 155;
+  ENUM_VALUE3633 = 156;
+  ENUM_VALUE3634 = 157;
+  ENUM_VALUE3635 = 158;
+  ENUM_VALUE3636 = 159;
+  ENUM_VALUE3637 = 160;
+  ENUM_VALUE3638 = 161;
+  ENUM_VALUE3639 = 162;
+  ENUM_VALUE3640 = 163;
+  ENUM_VALUE3641 = 164;
+  ENUM_VALUE3642 = 165;
+  ENUM_VALUE3643 = 166;
+  ENUM_VALUE3644 = 167;
+  ENUM_VALUE3645 = 168;
+  ENUM_VALUE3646 = 169;
+  ENUM_VALUE3647 = 170;
+  ENUM_VALUE3648 = 171;
+  ENUM_VALUE3649 = 172;
+  ENUM_VALUE3650 = 173;
+  ENUM_VALUE3651 = 174;
+  ENUM_VALUE3652 = 175;
+  ENUM_VALUE3653 = 176;
+  ENUM_VALUE3654 = 177;
+  ENUM_VALUE3655 = 178;
+  ENUM_VALUE3656 = 179;
+  ENUM_VALUE3657 = 180;
+  ENUM_VALUE3658 = 181;
+  ENUM_VALUE3659 = 182;
+  ENUM_VALUE3660 = 183;
+}
+
+enum Enum3805 {
+  ENUM_VALUE3806 = 0;
+  ENUM_VALUE3807 = 1;
+  ENUM_VALUE3808 = 2;
+  ENUM_VALUE3809 = 3;
+  ENUM_VALUE3810 = 4;
+  ENUM_VALUE3811 = 5;
+  ENUM_VALUE3812 = 6;
+  ENUM_VALUE3813 = 7;
+  ENUM_VALUE3814 = 8;
+  ENUM_VALUE3815 = 9;
+  ENUM_VALUE3816 = 11;
+  ENUM_VALUE3817 = 10;
+}
+
+enum Enum3783 {
+  ENUM_VALUE3784 = 0;
+  ENUM_VALUE3785 = 1;
+  ENUM_VALUE3786 = 2;
+  ENUM_VALUE3787 = 3;
+  ENUM_VALUE3788 = 4;
+  ENUM_VALUE3789 = 5;
+  ENUM_VALUE3790 = 6;
+  ENUM_VALUE3791 = 7;
+  ENUM_VALUE3792 = 8;
+  ENUM_VALUE3793 = 9;
+  ENUM_VALUE3794 = 10;
+  ENUM_VALUE3795 = 11;
+  ENUM_VALUE3796 = 12;
+  ENUM_VALUE3797 = 13;
+  ENUM_VALUE3798 = 14;
+  ENUM_VALUE3799 = 15;
+  ENUM_VALUE3800 = 16;
+  ENUM_VALUE3801 = 20;
+  ENUM_VALUE3802 = 21;
+  ENUM_VALUE3803 = 50;
+}
+
+enum Enum3851 {
+  ENUM_VALUE3852 = 0;
+  ENUM_VALUE3853 = 1;
+  ENUM_VALUE3854 = 2;
+  ENUM_VALUE3855 = 3;
+  ENUM_VALUE3856 = 4;
+  ENUM_VALUE3857 = 5;
+  ENUM_VALUE3858 = 6;
+  ENUM_VALUE3859 = 7;
+  ENUM_VALUE3860 = 8;
+  ENUM_VALUE3861 = 9;
+  ENUM_VALUE3862 = 10;
+  ENUM_VALUE3863 = 11;
+  ENUM_VALUE3864 = 12;
+  ENUM_VALUE3865 = 13;
+  ENUM_VALUE3866 = 14;
+  ENUM_VALUE3867 = 15;
+  ENUM_VALUE3868 = 16;
+  ENUM_VALUE3869 = 17;
+}
+
+enum UnusedEnum {
+  UNUSED_ENUM_VALUE1 = 0;
+  UNUSED_ENUM_VALUE2 = 1;
+}
+
+enum Enum4146 {
+  ENUM_VALUE4147 = 0;
+  ENUM_VALUE4148 = 1;
+  ENUM_VALUE4149 = 2;
+  ENUM_VALUE4150 = 3;
+  ENUM_VALUE4151 = 4;
+}
+
+enum Enum4160 {
+  ENUM_VALUE4161 = 0;
+  ENUM_VALUE4162 = 1;
+}
+
+enum Enum4152 {
+  ENUM_VALUE4153 = 0;
+  ENUM_VALUE4154 = 1;
+  ENUM_VALUE4155 = 2;
+  ENUM_VALUE4156 = 3;
+  ENUM_VALUE4157 = 4;
+  ENUM_VALUE4158 = 5;
+  ENUM_VALUE4159 = 6;
+}
+
+enum Enum6025 {
+  ENUM_VALUE6026 = 0;
+  ENUM_VALUE6027 = 1;
+  ENUM_VALUE6028 = 2;
+  ENUM_VALUE6029 = 3;
+  ENUM_VALUE6030 = 4;
+  ENUM_VALUE6031 = 5;
+  ENUM_VALUE6032 = 6;
+  ENUM_VALUE6033 = 7;
+  ENUM_VALUE6034 = 8;
+  ENUM_VALUE6035 = 9;
+  ENUM_VALUE6036 = 10;
+  ENUM_VALUE6037 = 11;
+  ENUM_VALUE6038 = 12;
+  ENUM_VALUE6039 = 13;
+  ENUM_VALUE6040 = 14;
+  ENUM_VALUE6041 = 15;
+  ENUM_VALUE6042 = 16;
+  ENUM_VALUE6043 = 17;
+  ENUM_VALUE6044 = 18;
+  ENUM_VALUE6045 = 19;
+  ENUM_VALUE6046 = 20;
+  ENUM_VALUE6047 = 21;
+}
+
+enum Enum6065 {
+  ENUM_VALUE6066 = 0;
+  ENUM_VALUE6067 = 1;
+  ENUM_VALUE6068 = 2;
+  ENUM_VALUE6069 = 3;
+  ENUM_VALUE6070 = 4;
+  ENUM_VALUE6071 = 5;
+  ENUM_VALUE6072 = 6;
+  ENUM_VALUE6073 = 7;
+  ENUM_VALUE6074 = 8;
+  ENUM_VALUE6075 = 9;
+  ENUM_VALUE6076 = 10;
+  ENUM_VALUE6077 = 11;
+  ENUM_VALUE6078 = 12;
+  ENUM_VALUE6079 = 13;
+  ENUM_VALUE6080 = 14;
+}
+
+enum Enum6579 {
+  ENUM_VALUE6580 = 0;
+  ENUM_VALUE6581 = 2;
+  ENUM_VALUE6582 = 3;
+  ENUM_VALUE6583 = 5;
+  ENUM_VALUE6584 = 10;
+  ENUM_VALUE6585 = 15;
+  ENUM_VALUE6586 = 25;
+  ENUM_VALUE6587 = 30;
+}
+
+enum Enum6588 {
+  ENUM_VALUE6589 = 0;
+  ENUM_VALUE6590 = 1;
+  ENUM_VALUE6591 = 2;
+  ENUM_VALUE6592 = 3;
+  ENUM_VALUE6593 = 4;
+  ENUM_VALUE6594 = 5;
+  ENUM_VALUE6595 = 6;
+  ENUM_VALUE6596 = 7;
+  ENUM_VALUE6597 = 8;
+  ENUM_VALUE6598 = 9;
+  ENUM_VALUE6599 = 10;
+  ENUM_VALUE6600 = 11;
+  ENUM_VALUE6601 = 12;
+  ENUM_VALUE6602 = 13;
+  ENUM_VALUE6603 = 14;
+  ENUM_VALUE6604 = 15;
+  ENUM_VALUE6605 = 16;
+  ENUM_VALUE6606 = 17;
+  ENUM_VALUE6607 = 19;
+  ENUM_VALUE6608 = 20;
+  ENUM_VALUE6609 = 21;
+  ENUM_VALUE6610 = 22;
+  ENUM_VALUE6611 = 23;
+  ENUM_VALUE6612 = 24;
+  ENUM_VALUE6613 = 25;
+  ENUM_VALUE6614 = 26;
+  ENUM_VALUE6615 = 27;
+  ENUM_VALUE6616 = 28;
+  ENUM_VALUE6617 = 29;
+  ENUM_VALUE6618 = 30;
+  ENUM_VALUE6619 = 31;
+  ENUM_VALUE6620 = 32;
+  ENUM_VALUE6621 = 33;
+  ENUM_VALUE6622 = 34;
+}
+
+enum Enum6769 {
+  ENUM_VALUE6770 = 0;
+  ENUM_VALUE6771 = 1;
+  ENUM_VALUE6772 = 2;
+}
+
+enum Enum6774 {
+  ENUM_VALUE6775 = 0;
+  ENUM_VALUE6776 = 1;
+  ENUM_VALUE6777 = 2;
+  ENUM_VALUE6778 = 3;
+  ENUM_VALUE6779 = 4;
+  ENUM_VALUE6780 = 5;
+  ENUM_VALUE6781 = 6;
+}
+
+enum Enum6782 {
+  ENUM_VALUE6783 = 0;
+  ENUM_VALUE6784 = 1;
+  ENUM_VALUE6785 = 2;
+  ENUM_VALUE6786 = 3;
+  ENUM_VALUE6787 = 4;
+  ENUM_VALUE6788 = 5;
+}
+
+enum Enum6858 {
+  ENUM_VALUE6859 = 1;
+  ENUM_VALUE6860 = 2;
+  ENUM_VALUE6861 = 3;
+  ENUM_VALUE6862 = 4;
+}
+
+enum Enum6815 {
+  ENUM_VALUE6816 = 0;
+  ENUM_VALUE6817 = 1;
+  ENUM_VALUE6818 = 2;
+  ENUM_VALUE6819 = 3;
+  ENUM_VALUE6820 = 4;
+  ENUM_VALUE6821 = 5;
+}
+
+enum Enum6822 {
+  ENUM_VALUE6823 = 0;
+  ENUM_VALUE6824 = 1;
+  ENUM_VALUE6825 = 2;
+  ENUM_VALUE6826 = 3;
+}
+
+enum Enum7654 {
+  ENUM_VALUE7655 = 1;
+  ENUM_VALUE7656 = 2;
+  ENUM_VALUE7657 = 3;
+}
+
+enum Enum8292 {
+  ENUM_VALUE8293 = 0;
+  ENUM_VALUE8294 = 1;
+  ENUM_VALUE8295 = 2;
+}
+
+enum Enum8450 {
+  ENUM_VALUE8451 = 0;
+  ENUM_VALUE8452 = 1;
+  ENUM_VALUE8453 = 2;
+}
+
+enum Enum8900 {
+  ENUM_VALUE8901 = 0;
+  ENUM_VALUE8902 = 1;
+  ENUM_VALUE8903 = 2;
+  ENUM_VALUE8904 = 3;
+  ENUM_VALUE8905 = 4;
+}
+
+enum Enum8945 {
+  ENUM_VALUE8946 = 0;
+  ENUM_VALUE8947 = 1;
+  ENUM_VALUE8948 = 2;
+  ENUM_VALUE8949 = 3;
+  ENUM_VALUE8950 = 4;
+}
+
+enum Enum8951 {
+  ENUM_VALUE8952 = 1;
+  ENUM_VALUE8953 = 2;
+  ENUM_VALUE8954 = 3;
+  ENUM_VALUE8955 = 4;
+  ENUM_VALUE8956 = 5;
+  ENUM_VALUE8957 = 6;
+  ENUM_VALUE8958 = 7;
+  ENUM_VALUE8959 = 8;
+}
+
+enum Enum9243 {
+  ENUM_VALUE9244 = -1;
+  ENUM_VALUE9245 = 0;
+  ENUM_VALUE9246 = 1;
+  ENUM_VALUE9247 = 2;
+  ENUM_VALUE9248 = 3;
+  ENUM_VALUE9249 = 4;
+  ENUM_VALUE9250 = 5;
+  ENUM_VALUE9251 = 6;
+  ENUM_VALUE9252 = 7;
+  ENUM_VALUE9253 = 8;
+  ENUM_VALUE9254 = 9;
+  ENUM_VALUE9255 = 10;
+  ENUM_VALUE9256 = 11;
+  ENUM_VALUE9257 = 12;
+  ENUM_VALUE9258 = 13;
+  ENUM_VALUE9259 = 14;
+  ENUM_VALUE9260 = 15;
+  ENUM_VALUE9261 = 16;
+  ENUM_VALUE9262 = 17;
+  ENUM_VALUE9263 = 71;
+  ENUM_VALUE9264 = 72;
+  ENUM_VALUE9265 = 73;
+  ENUM_VALUE9266 = 74;
+  ENUM_VALUE9267 = 18;
+  ENUM_VALUE9268 = 20;
+  ENUM_VALUE9269 = 21;
+  ENUM_VALUE9270 = 22;
+  ENUM_VALUE9271 = 23;
+  ENUM_VALUE9272 = 61;
+  ENUM_VALUE9273 = 62;
+  ENUM_VALUE9274 = 63;
+  ENUM_VALUE9275 = 64;
+  ENUM_VALUE9276 = 66;
+  ENUM_VALUE9277 = 67;
+  ENUM_VALUE9278 = 24;
+  ENUM_VALUE9279 = 25;
+  ENUM_VALUE9280 = 26;
+  ENUM_VALUE9281 = 27;
+  ENUM_VALUE9282 = 28;
+  ENUM_VALUE9283 = 29;
+  ENUM_VALUE9284 = 30;
+  ENUM_VALUE9285 = 31;
+  ENUM_VALUE9286 = 32;
+  ENUM_VALUE9287 = 33;
+  ENUM_VALUE9288 = 34;
+  ENUM_VALUE9289 = 35;
+  ENUM_VALUE9290 = 36;
+  ENUM_VALUE9291 = 37;
+  ENUM_VALUE9292 = 38;
+  ENUM_VALUE9293 = 39;
+  ENUM_VALUE9294 = 40;
+  ENUM_VALUE9295 = 41;
+  ENUM_VALUE9296 = 42;
+  ENUM_VALUE9297 = 43;
+  ENUM_VALUE9298 = 44;
+  ENUM_VALUE9299 = 45;
+  ENUM_VALUE9300 = 46;
+  ENUM_VALUE9301 = 47;
+  ENUM_VALUE9302 = 48;
+  ENUM_VALUE9303 = 49;
+  ENUM_VALUE9304 = 50;
+  ENUM_VALUE9305 = 51;
+  ENUM_VALUE9306 = 52;
+  ENUM_VALUE9307 = 53;
+  ENUM_VALUE9308 = 54;
+  ENUM_VALUE9309 = 55;
+  ENUM_VALUE9310 = 56;
+  ENUM_VALUE9311 = 57;
+  ENUM_VALUE9312 = 58;
+  ENUM_VALUE9313 = 59;
+  ENUM_VALUE9314 = 60;
+  ENUM_VALUE9315 = 68;
+  ENUM_VALUE9316 = 69;
+  ENUM_VALUE9317 = 70;
+  ENUM_VALUE9318 = 1000;
+  ENUM_VALUE9319 = 1001;
+  ENUM_VALUE9320 = 1002;
+  ENUM_VALUE9321 = 1003;
+  ENUM_VALUE9322 = 1004;
+  ENUM_VALUE9323 = 1005;
+  ENUM_VALUE9324 = 1006;
+  ENUM_VALUE9325 = 1007;
+  ENUM_VALUE9326 = 65;
+}
+
+enum Enum10157 {
+  ENUM_VALUE10158 = 0;
+  ENUM_VALUE10159 = 1;
+  ENUM_VALUE10160 = 2;
+  ENUM_VALUE10161 = 3;
+  ENUM_VALUE10162 = 4;
+  ENUM_VALUE10163 = 5;
+  ENUM_VALUE10164 = 6;
+  ENUM_VALUE10165 = 7;
+  ENUM_VALUE10166 = 8;
+}
+
+enum Enum10167 {
+  ENUM_VALUE10168 = 0;
+  ENUM_VALUE10169 = 1;
+  ENUM_VALUE10170 = 2;
+  ENUM_VALUE10171 = 3;
+  ENUM_VALUE10172 = 4;
+  ENUM_VALUE10173 = 5;
+  ENUM_VALUE10174 = 6;
+  ENUM_VALUE10175 = 7;
+  ENUM_VALUE10176 = 8;
+}
+
+enum Enum8862 {
+  ENUM_VALUE8863 = 0;
+  ENUM_VALUE8864 = 1;
+  ENUM_VALUE8865 = 2;
+  ENUM_VALUE8866 = 3;
+  ENUM_VALUE8867 = 4;
+  ENUM_VALUE8868 = 5;
+  ENUM_VALUE8869 = 6;
+  ENUM_VALUE8870 = 7;
+  ENUM_VALUE8871 = 13;
+  ENUM_VALUE8872 = 14;
+  ENUM_VALUE8873 = 8;
+  ENUM_VALUE8874 = 9;
+  ENUM_VALUE8875 = 10;
+  ENUM_VALUE8876 = 11;
+  ENUM_VALUE8877 = 12;
+  ENUM_VALUE8878 = 15;
+}
+
+enum Enum10325 {
+  ENUM_VALUE10326 = 0;
+  ENUM_VALUE10327 = 1;
+  ENUM_VALUE10328 = 2;
+  ENUM_VALUE10329 = 3;
+  ENUM_VALUE10330 = 4;
+  ENUM_VALUE10331 = 5;
+  ENUM_VALUE10332 = 6;
+  ENUM_VALUE10333 = 7;
+  ENUM_VALUE10334 = 8;
+}
+
+enum Enum10335 {
+  ENUM_VALUE10336 = 0;
+}
+
+enum Enum10337 {
+  ENUM_VALUE10338 = 0;
+  ENUM_VALUE10339 = 1;
+}
+
+enum Enum10392 {
+  ENUM_VALUE10393 = 0;
+  ENUM_VALUE10394 = 1;
+  ENUM_VALUE10395 = 2;
+  ENUM_VALUE10396 = 3;
+  ENUM_VALUE10397 = 4;
+  ENUM_VALUE10398 = 5;
+  ENUM_VALUE10399 = 6;
+  ENUM_VALUE10400 = 7;
+  ENUM_VALUE10401 = 8;
+  ENUM_VALUE10402 = 15;
+  ENUM_VALUE10403 = 9;
+  ENUM_VALUE10404 = 10;
+  ENUM_VALUE10405 = 11;
+  ENUM_VALUE10406 = 12;
+  ENUM_VALUE10407 = 13;
+  ENUM_VALUE10408 = 14;
+  ENUM_VALUE10409 = 101;
+  ENUM_VALUE10410 = 102;
+}
+
+enum Enum11107 {
+  ENUM_VALUE11108 = 0;
+  ENUM_VALUE11109 = 1;
+  ENUM_VALUE11110 = 2;
+  ENUM_VALUE11111 = 3;
+  ENUM_VALUE11112 = 4;
+  ENUM_VALUE11113 = 5;
+  ENUM_VALUE11114 = 6;
+  ENUM_VALUE11115 = 7;
+  ENUM_VALUE11116 = 8;
+  ENUM_VALUE11117 = 9;
+  ENUM_VALUE11118 = 10;
+  ENUM_VALUE11119 = 11;
+  ENUM_VALUE11120 = 12;
+  ENUM_VALUE11121 = 13;
+  ENUM_VALUE11122 = 14;
+  ENUM_VALUE11123 = 15;
+  ENUM_VALUE11124 = 16;
+  ENUM_VALUE11125 = 17;
+  ENUM_VALUE11126 = 18;
+  ENUM_VALUE11127 = 19;
+  ENUM_VALUE11128 = 20;
+  ENUM_VALUE11129 = 21;
+  ENUM_VALUE11130 = 22;
+  ENUM_VALUE11131 = 23;
+  ENUM_VALUE11132 = 24;
+  ENUM_VALUE11133 = 25;
+  ENUM_VALUE11134 = 26;
+  ENUM_VALUE11135 = 27;
+  ENUM_VALUE11136 = 28;
+  ENUM_VALUE11137 = 29;
+  ENUM_VALUE11138 = 30;
+  ENUM_VALUE11139 = 31;
+  ENUM_VALUE11140 = 32;
+  ENUM_VALUE11141 = 33;
+  ENUM_VALUE11142 = 34;
+  ENUM_VALUE11143 = 35;
+  ENUM_VALUE11144 = 36;
+  ENUM_VALUE11145 = 37;
+  ENUM_VALUE11146 = 38;
+  ENUM_VALUE11147 = 39;
+  ENUM_VALUE11148 = 40;
+  ENUM_VALUE11149 = 41;
+  ENUM_VALUE11150 = 42;
+  ENUM_VALUE11151 = 43;
+  ENUM_VALUE11152 = 44;
+  ENUM_VALUE11153 = 45;
+  ENUM_VALUE11154 = 46;
+  ENUM_VALUE11155 = 47;
+  ENUM_VALUE11156 = 48;
+  ENUM_VALUE11157 = 49;
+  ENUM_VALUE11158 = 50;
+  ENUM_VALUE11159 = 51;
+  ENUM_VALUE11160 = 52;
+  ENUM_VALUE11161 = 53;
+  ENUM_VALUE11162 = 54;
+  ENUM_VALUE11163 = 55;
+  ENUM_VALUE11164 = 56;
+  ENUM_VALUE11165 = 57;
+  ENUM_VALUE11166 = 58;
+  ENUM_VALUE11167 = 59;
+  ENUM_VALUE11168 = 60;
+  ENUM_VALUE11169 = 61;
+  ENUM_VALUE11170 = 62;
+  ENUM_VALUE11171 = 63;
+  ENUM_VALUE11172 = 64;
+  ENUM_VALUE11173 = 65;
+  ENUM_VALUE11174 = 66;
+  ENUM_VALUE11175 = 67;
+  ENUM_VALUE11176 = 68;
+  ENUM_VALUE11177 = 69;
+  ENUM_VALUE11178 = 70;
+  ENUM_VALUE11179 = 71;
+  ENUM_VALUE11180 = 72;
+  ENUM_VALUE11181 = 73;
+  ENUM_VALUE11182 = 74;
+  ENUM_VALUE11183 = 75;
+  ENUM_VALUE11184 = 76;
+  ENUM_VALUE11185 = 77;
+  ENUM_VALUE11186 = 78;
+  ENUM_VALUE11187 = 79;
+  ENUM_VALUE11188 = 80;
+  ENUM_VALUE11189 = 81;
+  ENUM_VALUE11190 = 82;
+  ENUM_VALUE11191 = 83;
+  ENUM_VALUE11192 = 84;
+  ENUM_VALUE11193 = 85;
+  ENUM_VALUE11194 = 86;
+  ENUM_VALUE11195 = 87;
+  ENUM_VALUE11196 = 88;
+  ENUM_VALUE11197 = 89;
+  ENUM_VALUE11198 = 90;
+  ENUM_VALUE11199 = 91;
+  ENUM_VALUE11200 = 92;
+  ENUM_VALUE11201 = 93;
+  ENUM_VALUE11202 = 94;
+  ENUM_VALUE11203 = 95;
+  ENUM_VALUE11204 = 96;
+  ENUM_VALUE11205 = 97;
+  ENUM_VALUE11206 = 98;
+  ENUM_VALUE11207 = 99;
+  ENUM_VALUE11208 = 100;
+  ENUM_VALUE11209 = 101;
+  ENUM_VALUE11210 = 102;
+  ENUM_VALUE11211 = 103;
+  ENUM_VALUE11212 = 104;
+  ENUM_VALUE11213 = 105;
+  ENUM_VALUE11214 = 106;
+  ENUM_VALUE11215 = 107;
+  ENUM_VALUE11216 = 108;
+  ENUM_VALUE11217 = 109;
+  ENUM_VALUE11218 = 110;
+  ENUM_VALUE11219 = 111;
+  ENUM_VALUE11220 = 112;
+  ENUM_VALUE11221 = 113;
+  ENUM_VALUE11222 = 114;
+  ENUM_VALUE11223 = 115;
+  ENUM_VALUE11224 = 116;
+  ENUM_VALUE11225 = 117;
+  ENUM_VALUE11226 = 118;
+  ENUM_VALUE11227 = 119;
+  ENUM_VALUE11228 = 120;
+  ENUM_VALUE11229 = 121;
+  ENUM_VALUE11230 = 122;
+  ENUM_VALUE11231 = 123;
+  ENUM_VALUE11232 = 124;
+  ENUM_VALUE11233 = 125;
+  ENUM_VALUE11234 = 126;
+  ENUM_VALUE11235 = 127;
+  ENUM_VALUE11236 = 128;
+  ENUM_VALUE11237 = 129;
+  ENUM_VALUE11238 = 130;
+  ENUM_VALUE11239 = 131;
+  ENUM_VALUE11240 = 132;
+  ENUM_VALUE11241 = 133;
+  ENUM_VALUE11242 = 134;
+  ENUM_VALUE11243 = 135;
+  ENUM_VALUE11244 = 136;
+  ENUM_VALUE11245 = 137;
+  ENUM_VALUE11246 = 138;
+  ENUM_VALUE11247 = 139;
+  ENUM_VALUE11248 = 140;
+  ENUM_VALUE11249 = 141;
+  ENUM_VALUE11250 = 142;
+  ENUM_VALUE11251 = 143;
+  ENUM_VALUE11252 = 144;
+  ENUM_VALUE11253 = 145;
+  ENUM_VALUE11254 = 146;
+  ENUM_VALUE11255 = 147;
+  ENUM_VALUE11256 = 148;
+  ENUM_VALUE11257 = 149;
+  ENUM_VALUE11258 = 150;
+  ENUM_VALUE11259 = 151;
+  ENUM_VALUE11260 = 152;
+  ENUM_VALUE11261 = 153;
+  ENUM_VALUE11262 = 154;
+  ENUM_VALUE11263 = 155;
+  ENUM_VALUE11264 = 156;
+  ENUM_VALUE11265 = 157;
+  ENUM_VALUE11266 = 158;
+  ENUM_VALUE11267 = 159;
+  ENUM_VALUE11268 = 160;
+  ENUM_VALUE11269 = 161;
+  ENUM_VALUE11270 = 163;
+  ENUM_VALUE11271 = 164;
+  ENUM_VALUE11272 = 165;
+  ENUM_VALUE11273 = 166;
+  ENUM_VALUE11274 = 167;
+  ENUM_VALUE11275 = 168;
+  ENUM_VALUE11276 = 169;
+  ENUM_VALUE11277 = 170;
+  ENUM_VALUE11278 = 171;
+  ENUM_VALUE11279 = 172;
+  ENUM_VALUE11280 = 173;
+  ENUM_VALUE11281 = 174;
+  ENUM_VALUE11282 = 175;
+  ENUM_VALUE11283 = 176;
+  ENUM_VALUE11284 = 177;
+  ENUM_VALUE11285 = 178;
+  ENUM_VALUE11286 = 179;
+  ENUM_VALUE11287 = 180;
+  ENUM_VALUE11288 = 181;
+  ENUM_VALUE11289 = 182;
+  ENUM_VALUE11290 = 183;
+  ENUM_VALUE11291 = 184;
+  ENUM_VALUE11292 = 185;
+  ENUM_VALUE11293 = 187;
+  ENUM_VALUE11294 = 188;
+  ENUM_VALUE11295 = 189;
+  ENUM_VALUE11296 = 190;
+  ENUM_VALUE11297 = 191;
+  ENUM_VALUE11298 = 192;
+  ENUM_VALUE11299 = 193;
+  ENUM_VALUE11300 = 194;
+  ENUM_VALUE11301 = 195;
+  ENUM_VALUE11302 = 196;
+  ENUM_VALUE11303 = 197;
+  ENUM_VALUE11304 = 198;
+  ENUM_VALUE11305 = 65535;
+  ENUM_VALUE11306 = 65536;
+  ENUM_VALUE11307 = 65537;
+  ENUM_VALUE11308 = 65538;
+  ENUM_VALUE11309 = 65539;
+  ENUM_VALUE11310 = 65540;
+  ENUM_VALUE11311 = 65541;
+  ENUM_VALUE11312 = 65542;
+  ENUM_VALUE11313 = 65543;
+  ENUM_VALUE11314 = 65544;
+  ENUM_VALUE11315 = 65545;
+  ENUM_VALUE11316 = 65546;
+  ENUM_VALUE11317 = 65547;
+  ENUM_VALUE11318 = 65548;
+  ENUM_VALUE11319 = 65549;
+  ENUM_VALUE11320 = 65550;
+  ENUM_VALUE11321 = 65551;
+  ENUM_VALUE11322 = 65552;
+  ENUM_VALUE11323 = 65553;
+  ENUM_VALUE11324 = 65554;
+  ENUM_VALUE11325 = 65555;
+  ENUM_VALUE11326 = 65556;
+  ENUM_VALUE11327 = 65557;
+  ENUM_VALUE11328 = 65558;
+  ENUM_VALUE11329 = 65559;
+  ENUM_VALUE11330 = 65560;
+  ENUM_VALUE11331 = 65561;
+  ENUM_VALUE11332 = 65562;
+  ENUM_VALUE11333 = 65563;
+  ENUM_VALUE11334 = 69632;
+  ENUM_VALUE11335 = 69633;
+  ENUM_VALUE11336 = 69634;
+  ENUM_VALUE11337 = 69635;
+  ENUM_VALUE11338 = 69636;
+  ENUM_VALUE11339 = 69637;
+  ENUM_VALUE11340 = 69638;
+  ENUM_VALUE11341 = 69639;
+  ENUM_VALUE11342 = 69640;
+  ENUM_VALUE11343 = 69641;
+  ENUM_VALUE11344 = 69642;
+  ENUM_VALUE11345 = 69643;
+  ENUM_VALUE11346 = 69644;
+  ENUM_VALUE11347 = 69645;
+  ENUM_VALUE11348 = 69646;
+  ENUM_VALUE11349 = 69647;
+  ENUM_VALUE11350 = 69648;
+  ENUM_VALUE11351 = 69649;
+  ENUM_VALUE11352 = 69650;
+  ENUM_VALUE11353 = 69651;
+  ENUM_VALUE11354 = 69652;
+  ENUM_VALUE11355 = 69653;
+  ENUM_VALUE11356 = 69654;
+  ENUM_VALUE11357 = 69655;
+  ENUM_VALUE11358 = 69656;
+  ENUM_VALUE11359 = 69657;
+  ENUM_VALUE11360 = 69658;
+  ENUM_VALUE11361 = 69659;
+  ENUM_VALUE11362 = 69660;
+  ENUM_VALUE11363 = 69661;
+  ENUM_VALUE11364 = 69662;
+  ENUM_VALUE11365 = 73728;
+  ENUM_VALUE11366 = 73729;
+  ENUM_VALUE11367 = 77824;
+  ENUM_VALUE11368 = 77825;
+  ENUM_VALUE11369 = 81920;
+  ENUM_VALUE11370 = 81921;
+  ENUM_VALUE11371 = 81922;
+  ENUM_VALUE11372 = 81923;
+  ENUM_VALUE11373 = 86016;
+  ENUM_VALUE11374 = 86017;
+  ENUM_VALUE11375 = 86018;
+  ENUM_VALUE11376 = 86019;
+  ENUM_VALUE11377 = 86020;
+  ENUM_VALUE11378 = 86021;
+  ENUM_VALUE11379 = 86022;
+  ENUM_VALUE11380 = 86023;
+  ENUM_VALUE11381 = 86024;
+  ENUM_VALUE11382 = 86025;
+  ENUM_VALUE11383 = 86026;
+  ENUM_VALUE11384 = 86027;
+  ENUM_VALUE11385 = 86028;
+  ENUM_VALUE11386 = 86029;
+  ENUM_VALUE11387 = 86030;
+  ENUM_VALUE11388 = 86031;
+  ENUM_VALUE11389 = 86032;
+  ENUM_VALUE11390 = 86033;
+  ENUM_VALUE11391 = 86034;
+  ENUM_VALUE11392 = 86035;
+  ENUM_VALUE11393 = 86036;
+  ENUM_VALUE11394 = 86037;
+  ENUM_VALUE11395 = 86038;
+  ENUM_VALUE11396 = 86039;
+  ENUM_VALUE11397 = 86040;
+  ENUM_VALUE11398 = 86041;
+  ENUM_VALUE11399 = 86042;
+  ENUM_VALUE11400 = 86043;
+  ENUM_VALUE11401 = 86044;
+  ENUM_VALUE11402 = 86045;
+  ENUM_VALUE11403 = 86046;
+  ENUM_VALUE11404 = 86047;
+  ENUM_VALUE11405 = 86048;
+  ENUM_VALUE11406 = 86049;
+  ENUM_VALUE11407 = 86050;
+  ENUM_VALUE11408 = 86051;
+  ENUM_VALUE11409 = 86052;
+  ENUM_VALUE11410 = 86053;
+  ENUM_VALUE11411 = 86054;
+  ENUM_VALUE11412 = 86055;
+  ENUM_VALUE11413 = 86056;
+  ENUM_VALUE11414 = 86057;
+  ENUM_VALUE11415 = 86058;
+  ENUM_VALUE11416 = 86059;
+  ENUM_VALUE11417 = 86060;
+  ENUM_VALUE11418 = 86061;
+  ENUM_VALUE11419 = 86062;
+  ENUM_VALUE11420 = 86063;
+  ENUM_VALUE11421 = 86064;
+  ENUM_VALUE11422 = 86065;
+  ENUM_VALUE11423 = 86066;
+  ENUM_VALUE11424 = 86067;
+  ENUM_VALUE11425 = 86068;
+  ENUM_VALUE11426 = 86069;
+  ENUM_VALUE11427 = 86070;
+  ENUM_VALUE11428 = 86071;
+  ENUM_VALUE11429 = 86072;
+  ENUM_VALUE11430 = 86073;
+  ENUM_VALUE11431 = 86074;
+  ENUM_VALUE11432 = 86077;
+  ENUM_VALUE11433 = 86078;
+  ENUM_VALUE11434 = 86079;
+  ENUM_VALUE11435 = 86080;
+  ENUM_VALUE11436 = 86081;
+  ENUM_VALUE11437 = 86082;
+  ENUM_VALUE11438 = 86083;
+  ENUM_VALUE11439 = 86084;
+  ENUM_VALUE11440 = 90112;
+  ENUM_VALUE11441 = 94208;
+  ENUM_VALUE11442 = 94209;
+  ENUM_VALUE11443 = 94210;
+  ENUM_VALUE11444 = 94211;
+  ENUM_VALUE11445 = 94212;
+  ENUM_VALUE11446 = 94213;
+  ENUM_VALUE11447 = 94214;
+  ENUM_VALUE11448 = 94215;
+  ENUM_VALUE11449 = 94216;
+  ENUM_VALUE11450 = 94217;
+  ENUM_VALUE11451 = 94218;
+  ENUM_VALUE11452 = 94219;
+  ENUM_VALUE11453 = 94220;
+  ENUM_VALUE11454 = 94221;
+  ENUM_VALUE11455 = 94222;
+  ENUM_VALUE11456 = 94223;
+  ENUM_VALUE11457 = 94224;
+  ENUM_VALUE11458 = 98304;
+  ENUM_VALUE11459 = 98305;
+  ENUM_VALUE11460 = 98306;
+  ENUM_VALUE11461 = 98307;
+  ENUM_VALUE11462 = 98308;
+  ENUM_VALUE11463 = 102400;
+  ENUM_VALUE11464 = 131072;
+  ENUM_VALUE11465 = 131073;
+  ENUM_VALUE11466 = 135168;
+  ENUM_VALUE11467 = 9439507;
+}
+
+enum Enum11541 {
+  ENUM_VALUE11542 = -1;
+  ENUM_VALUE11543 = 0;
+  ENUM_VALUE11544 = 1;
+  ENUM_VALUE11545 = 2;
+  ENUM_VALUE11546 = 3;
+  ENUM_VALUE11547 = 4;
+  ENUM_VALUE11548 = 5;
+  ENUM_VALUE11549 = 6;
+  ENUM_VALUE11550 = 7;
+  ENUM_VALUE11551 = 8;
+  ENUM_VALUE11552 = 9;
+  ENUM_VALUE11553 = 10;
+  ENUM_VALUE11554 = 11;
+  ENUM_VALUE11555 = 12;
+  ENUM_VALUE11556 = 13;
+  ENUM_VALUE11557 = 14;
+  ENUM_VALUE11558 = 15;
+  ENUM_VALUE11559 = 16;
+  ENUM_VALUE11560 = 17;
+  ENUM_VALUE11561 = 18;
+  ENUM_VALUE11562 = 19;
+  ENUM_VALUE11563 = 20;
+  ENUM_VALUE11564 = 21;
+  ENUM_VALUE11565 = 22;
+  ENUM_VALUE11566 = 23;
+  ENUM_VALUE11567 = 24;
+  ENUM_VALUE11568 = 25;
+  ENUM_VALUE11569 = 26;
+  ENUM_VALUE11570 = 27;
+  ENUM_VALUE11571 = 28;
+  ENUM_VALUE11572 = 29;
+  ENUM_VALUE11573 = 30;
+  ENUM_VALUE11574 = 31;
+  ENUM_VALUE11575 = 32;
+  ENUM_VALUE11576 = 33;
+  ENUM_VALUE11577 = 34;
+  ENUM_VALUE11578 = 35;
+  ENUM_VALUE11579 = 36;
+  ENUM_VALUE11580 = 37;
+  ENUM_VALUE11581 = 38;
+  ENUM_VALUE11582 = 39;
+  ENUM_VALUE11583 = 40;
+  ENUM_VALUE11584 = 41;
+  ENUM_VALUE11585 = 42;
+  ENUM_VALUE11586 = 43;
+  ENUM_VALUE11587 = 44;
+  ENUM_VALUE11588 = 45;
+  ENUM_VALUE11589 = 46;
+  ENUM_VALUE11590 = 47;
+  ENUM_VALUE11591 = 48;
+  ENUM_VALUE11592 = 49;
+  ENUM_VALUE11593 = 50;
+  ENUM_VALUE11594 = 51;
+  ENUM_VALUE11595 = 52;
+  ENUM_VALUE11596 = 53;
+  ENUM_VALUE11597 = 54;
+  ENUM_VALUE11598 = 55;
+  ENUM_VALUE11599 = 56;
+  ENUM_VALUE11600 = 57;
+  ENUM_VALUE11601 = 58;
+  ENUM_VALUE11602 = 59;
+  ENUM_VALUE11603 = 60;
+  ENUM_VALUE11604 = 61;
+  ENUM_VALUE11605 = 62;
+  ENUM_VALUE11606 = 63;
+  ENUM_VALUE11607 = 64;
+  ENUM_VALUE11608 = 65;
+  ENUM_VALUE11609 = 66;
+  ENUM_VALUE11610 = 67;
+  ENUM_VALUE11611 = 68;
+  ENUM_VALUE11612 = 69;
+  ENUM_VALUE11613 = 70;
+  ENUM_VALUE11614 = 71;
+  ENUM_VALUE11615 = 72;
+  ENUM_VALUE11616 = 73;
+  ENUM_VALUE11617 = 74;
+  ENUM_VALUE11618 = 75;
+  ENUM_VALUE11619 = 76;
+  ENUM_VALUE11620 = 77;
+  ENUM_VALUE11621 = 78;
+  ENUM_VALUE11622 = 79;
+  ENUM_VALUE11623 = 80;
+  ENUM_VALUE11624 = 81;
+  ENUM_VALUE11625 = 82;
+  ENUM_VALUE11626 = 83;
+  ENUM_VALUE11627 = 84;
+  ENUM_VALUE11628 = 85;
+  ENUM_VALUE11629 = 86;
+  ENUM_VALUE11630 = 87;
+  ENUM_VALUE11631 = 88;
+  ENUM_VALUE11632 = 89;
+  ENUM_VALUE11633 = 90;
+  ENUM_VALUE11634 = 91;
+  ENUM_VALUE11635 = 92;
+  ENUM_VALUE11636 = 93;
+  ENUM_VALUE11637 = 94;
+  ENUM_VALUE11638 = 95;
+  ENUM_VALUE11639 = 96;
+  ENUM_VALUE11640 = 97;
+  ENUM_VALUE11641 = 98;
+  ENUM_VALUE11642 = 99;
+  ENUM_VALUE11643 = 100;
+  ENUM_VALUE11644 = 101;
+  ENUM_VALUE11645 = 102;
+  ENUM_VALUE11646 = 103;
+  ENUM_VALUE11647 = 104;
+  ENUM_VALUE11648 = 105;
+  ENUM_VALUE11649 = 106;
+  ENUM_VALUE11650 = 107;
+  ENUM_VALUE11651 = 108;
+  ENUM_VALUE11652 = 109;
+  ENUM_VALUE11653 = 110;
+  ENUM_VALUE11654 = 111;
+  ENUM_VALUE11655 = 112;
+  ENUM_VALUE11656 = 113;
+  ENUM_VALUE11657 = 114;
+  ENUM_VALUE11658 = 115;
+  ENUM_VALUE11659 = 116;
+  ENUM_VALUE11660 = 117;
+  ENUM_VALUE11661 = 118;
+  ENUM_VALUE11662 = 119;
+  ENUM_VALUE11663 = 120;
+  ENUM_VALUE11664 = 121;
+  ENUM_VALUE11665 = 122;
+  ENUM_VALUE11666 = 123;
+  ENUM_VALUE11667 = 124;
+  ENUM_VALUE11668 = 125;
+  ENUM_VALUE11669 = 126;
+  ENUM_VALUE11670 = 127;
+  ENUM_VALUE11671 = 128;
+  ENUM_VALUE11672 = 129;
+  ENUM_VALUE11673 = 130;
+  ENUM_VALUE11674 = 131;
+  ENUM_VALUE11675 = 132;
+  ENUM_VALUE11676 = 133;
+  ENUM_VALUE11677 = 134;
+  ENUM_VALUE11678 = 135;
+  ENUM_VALUE11679 = 136;
+  ENUM_VALUE11680 = 137;
+  ENUM_VALUE11681 = 138;
+  ENUM_VALUE11682 = 139;
+  ENUM_VALUE11683 = 140;
+  ENUM_VALUE11684 = 141;
+  ENUM_VALUE11685 = 142;
+  ENUM_VALUE11686 = 143;
+  ENUM_VALUE11687 = 144;
+  ENUM_VALUE11688 = 145;
+  ENUM_VALUE11689 = 146;
+  ENUM_VALUE11690 = 147;
+  ENUM_VALUE11691 = 148;
+  ENUM_VALUE11692 = 149;
+  ENUM_VALUE11693 = 150;
+  ENUM_VALUE11694 = 151;
+  ENUM_VALUE11695 = 152;
+  ENUM_VALUE11696 = 153;
+  ENUM_VALUE11697 = 154;
+  ENUM_VALUE11698 = 155;
+  ENUM_VALUE11699 = 156;
+  ENUM_VALUE11700 = 157;
+  ENUM_VALUE11701 = 158;
+  ENUM_VALUE11702 = 159;
+  ENUM_VALUE11703 = 160;
+  ENUM_VALUE11704 = 161;
+  ENUM_VALUE11705 = 162;
+  ENUM_VALUE11706 = 163;
+  ENUM_VALUE11707 = 164;
+  ENUM_VALUE11708 = 165;
+  ENUM_VALUE11709 = 166;
+  ENUM_VALUE11710 = 167;
+  ENUM_VALUE11711 = 168;
+  ENUM_VALUE11712 = 169;
+  ENUM_VALUE11713 = 170;
+  ENUM_VALUE11714 = 171;
+  ENUM_VALUE11715 = 172;
+  ENUM_VALUE11716 = 173;
+  ENUM_VALUE11717 = 174;
+  ENUM_VALUE11718 = 175;
+  ENUM_VALUE11719 = 176;
+  ENUM_VALUE11720 = 177;
+  ENUM_VALUE11721 = 178;
+  ENUM_VALUE11722 = 179;
+  ENUM_VALUE11723 = 180;
+  ENUM_VALUE11724 = 181;
+  ENUM_VALUE11725 = 182;
+  ENUM_VALUE11726 = 183;
+  ENUM_VALUE11727 = 184;
+  ENUM_VALUE11728 = 185;
+  ENUM_VALUE11729 = 186;
+  ENUM_VALUE11730 = 187;
+  ENUM_VALUE11731 = 188;
+  ENUM_VALUE11732 = 16777215;
+}
+
+enum Enum11468 {
+  ENUM_VALUE11469 = -99;
+  ENUM_VALUE11470 = 0;
+  ENUM_VALUE11471 = 1;
+  ENUM_VALUE11472 = 2;
+  ENUM_VALUE11473 = 3;
+  ENUM_VALUE11474 = 4;
+  ENUM_VALUE11475 = 28;
+  ENUM_VALUE11476 = 22;
+  ENUM_VALUE11477 = 38;
+  ENUM_VALUE11478 = 512;
+  ENUM_VALUE11479 = 2048;
+  ENUM_VALUE11480 = 66;
+  ENUM_VALUE11481 = 578;
+  ENUM_VALUE11482 = 77;
+  ENUM_VALUE11483 = 88;
+  ENUM_VALUE11484 = 100;
+  ENUM_VALUE11485 = 110;
+  ENUM_VALUE11486 = 2158;
+  ENUM_VALUE11487 = 122;
+  ENUM_VALUE11488 = 2170;
+  ENUM_VALUE11489 = 144;
+  ENUM_VALUE11490 = 244;
+  ENUM_VALUE11491 = 2292;
+  ENUM_VALUE11492 = 44;
+}
+
+enum Enum11022 {
+  ENUM_VALUE11023 = 0;
+  ENUM_VALUE11024 = 1;
+  ENUM_VALUE11025 = 2;
+  ENUM_VALUE11026 = 3;
+  ENUM_VALUE11027 = 4;
+  ENUM_VALUE11028 = 5;
+  ENUM_VALUE11029 = 6;
+  ENUM_VALUE11030 = 7;
+  ENUM_VALUE11031 = 8;
+  ENUM_VALUE11032 = 9;
+  ENUM_VALUE11033 = 10;
+  ENUM_VALUE11034 = 11;
+  ENUM_VALUE11035 = 12;
+  ENUM_VALUE11036 = 13;
+  ENUM_VALUE11037 = 14;
+  ENUM_VALUE11038 = 15;
+  ENUM_VALUE11039 = 16;
+  ENUM_VALUE11040 = 17;
+  ENUM_VALUE11041 = 18;
+  ENUM_VALUE11042 = 19;
+  ENUM_VALUE11043 = 20;
+  ENUM_VALUE11044 = 21;
+  ENUM_VALUE11045 = 22;
+  ENUM_VALUE11046 = 23;
+  ENUM_VALUE11047 = 24;
+  ENUM_VALUE11048 = 25;
+  ENUM_VALUE11049 = 26;
+  ENUM_VALUE11050 = 27;
+  ENUM_VALUE11051 = 28;
+  ENUM_VALUE11052 = 29;
+  ENUM_VALUE11053 = 30;
+  ENUM_VALUE11054 = 31;
+  ENUM_VALUE11055 = 32;
+  ENUM_VALUE11056 = 33;
+  ENUM_VALUE11057 = 34;
+  ENUM_VALUE11058 = 35;
+  ENUM_VALUE11059 = 36;
+  ENUM_VALUE11060 = 37;
+  ENUM_VALUE11061 = 38;
+  ENUM_VALUE11062 = 39;
+  ENUM_VALUE11063 = 40;
+  ENUM_VALUE11064 = 41;
+  ENUM_VALUE11065 = 42;
+  ENUM_VALUE11066 = 43;
+  ENUM_VALUE11067 = 44;
+  ENUM_VALUE11068 = 45;
+  ENUM_VALUE11069 = 46;
+  ENUM_VALUE11070 = 47;
+  ENUM_VALUE11071 = 48;
+  ENUM_VALUE11072 = 49;
+  ENUM_VALUE11073 = 50;
+  ENUM_VALUE11074 = 51;
+  ENUM_VALUE11075 = 52;
+  ENUM_VALUE11076 = 53;
+  ENUM_VALUE11077 = 54;
+  ENUM_VALUE11078 = 55;
+  ENUM_VALUE11079 = 56;
+  ENUM_VALUE11080 = 57;
+  ENUM_VALUE11081 = 58;
+  ENUM_VALUE11082 = 59;
+  ENUM_VALUE11083 = 60;
+  ENUM_VALUE11084 = 61;
+  ENUM_VALUE11085 = 62;
+  ENUM_VALUE11086 = 63;
+  ENUM_VALUE11087 = 64;
+  ENUM_VALUE11088 = 65;
+  ENUM_VALUE11089 = 66;
+  ENUM_VALUE11090 = 67;
+  ENUM_VALUE11091 = 68;
+  ENUM_VALUE11092 = 69;
+  ENUM_VALUE11093 = 70;
+  ENUM_VALUE11094 = 71;
+  ENUM_VALUE11095 = 72;
+  ENUM_VALUE11096 = 73;
+  ENUM_VALUE11097 = 74;
+  ENUM_VALUE11098 = 75;
+  ENUM_VALUE11099 = 76;
+  ENUM_VALUE11100 = 77;
+  ENUM_VALUE11101 = 78;
+  ENUM_VALUE11102 = 79;
+  ENUM_VALUE11103 = 80;
+  ENUM_VALUE11104 = 81;
+  ENUM_VALUE11105 = 82;
+  ENUM_VALUE11106 = 83;
+}
+
+enum Enum12670 {
+  ENUM_VALUE12671 = 0;
+  ENUM_VALUE12672 = 1;
+  ENUM_VALUE12673 = 2;
+}
+
+enum Enum12871 {
+  ENUM_VALUE12872 = 1;
+  ENUM_VALUE12873 = 2;
+  ENUM_VALUE12874 = 3;
+  ENUM_VALUE12875 = 4;
+  ENUM_VALUE12876 = 5;
+  ENUM_VALUE12877 = 6;
+}
+
+enum Enum13092 {
+  ENUM_VALUE13093 = 1;
+  ENUM_VALUE13094 = 2;
+  ENUM_VALUE13095 = 3;
+}
+
+enum Enum13146 {
+  ENUM_VALUE13147 = 0;
+  ENUM_VALUE13148 = 1;
+  ENUM_VALUE13149 = 2;
+  ENUM_VALUE13150 = 3;
+}
+
+enum Enum16042 {
+  ENUM_VALUE16043 = 0;
+  ENUM_VALUE16044 = 1;
+  ENUM_VALUE16045 = 17;
+  ENUM_VALUE16046 = 273;
+  ENUM_VALUE16047 = 274;
+  ENUM_VALUE16048 = 4385;
+  ENUM_VALUE16049 = 4386;
+  ENUM_VALUE16050 = 4387;
+  ENUM_VALUE16051 = 4388;
+  ENUM_VALUE16052 = 4389;
+  ENUM_VALUE16053 = 4390;
+  ENUM_VALUE16054 = 4391;
+  ENUM_VALUE16055 = 4392;
+  ENUM_VALUE16056 = 4393;
+  ENUM_VALUE16057 = 276;
+  ENUM_VALUE16058 = 277;
+  ENUM_VALUE16059 = 18;
+  ENUM_VALUE16060 = 289;
+  ENUM_VALUE16061 = 291;
+  ENUM_VALUE16062 = 4657;
+  ENUM_VALUE16063 = 74513;
+  ENUM_VALUE16064 = 4658;
+  ENUM_VALUE16065 = 4659;
+  ENUM_VALUE16066 = 4660;
+  ENUM_VALUE16067 = 4661;
+  ENUM_VALUE16068 = 4662;
+  ENUM_VALUE16069 = 4663;
+  ENUM_VALUE16070 = 4664;
+  ENUM_VALUE16071 = 292;
+  ENUM_VALUE16072 = 4673;
+  ENUM_VALUE16073 = 4674;
+  ENUM_VALUE16074 = 293;
+  ENUM_VALUE16075 = 19;
+  ENUM_VALUE16076 = 20;
+  ENUM_VALUE16077 = 321;
+  ENUM_VALUE16078 = 5137;
+  ENUM_VALUE16079 = 5138;
+  ENUM_VALUE16080 = 5139;
+  ENUM_VALUE16081 = 5140;
+  ENUM_VALUE16082 = 5141;
+  ENUM_VALUE16083 = 5142;
+  ENUM_VALUE16084 = 82273;
+  ENUM_VALUE16085 = 82274;
+  ENUM_VALUE16086 = 82275;
+  ENUM_VALUE16087 = 82276;
+  ENUM_VALUE16088 = 82277;
+  ENUM_VALUE16089 = 82278;
+  ENUM_VALUE16090 = 5143;
+  ENUM_VALUE16091 = 5144;
+  ENUM_VALUE16092 = 5145;
+  ENUM_VALUE16093 = 5146;
+  ENUM_VALUE16094 = 82337;
+  ENUM_VALUE16095 = 5147;
+  ENUM_VALUE16096 = 5148;
+  ENUM_VALUE16097 = 322;
+  ENUM_VALUE16098 = 323;
+  ENUM_VALUE16099 = 324;
+  ENUM_VALUE16100 = 325;
+  ENUM_VALUE16101 = 326;
+  ENUM_VALUE16102 = 327;
+  ENUM_VALUE16103 = 328;
+  ENUM_VALUE16104 = 21;
+  ENUM_VALUE16105 = 337;
+  ENUM_VALUE16106 = 22;
+  ENUM_VALUE16107 = 23;
+  ENUM_VALUE16108 = 24;
+  ENUM_VALUE16109 = 2;
+  ENUM_VALUE16110 = 33;
+  ENUM_VALUE16111 = 34;
+  ENUM_VALUE16112 = 545;
+  ENUM_VALUE16113 = 8721;
+  ENUM_VALUE16114 = 8723;
+  ENUM_VALUE16115 = 8724;
+  ENUM_VALUE16116 = 546;
+  ENUM_VALUE16117 = 8739;
+  ENUM_VALUE16118 = 8740;
+  ENUM_VALUE16119 = 547;
+  ENUM_VALUE16120 = 548;
+  ENUM_VALUE16121 = 549;
+  ENUM_VALUE16122 = 550;
+  ENUM_VALUE16123 = 551;
+  ENUM_VALUE16124 = 552;
+  ENUM_VALUE16125 = 553;
+  ENUM_VALUE16126 = 35;
+  ENUM_VALUE16127 = 36;
+  ENUM_VALUE16128 = 37;
+  ENUM_VALUE16129 = 593;
+  ENUM_VALUE16130 = 594;
+  ENUM_VALUE16131 = 595;
+  ENUM_VALUE16132 = 596;
+  ENUM_VALUE16133 = 597;
+  ENUM_VALUE16134 = 38;
+  ENUM_VALUE16135 = 609;
+  ENUM_VALUE16136 = 610;
+  ENUM_VALUE16137 = 617;
+  ENUM_VALUE16138 = 614;
+  ENUM_VALUE16139 = 615;
+  ENUM_VALUE16140 = 616;
+  ENUM_VALUE16141 = 618;
+  ENUM_VALUE16142 = 620;
+  ENUM_VALUE16143 = 9937;
+  ENUM_VALUE16144 = 9938;
+  ENUM_VALUE16145 = 9939;
+  ENUM_VALUE16146 = 9940;
+  ENUM_VALUE16147 = 9941;
+  ENUM_VALUE16148 = 39;
+  ENUM_VALUE16149 = 40;
+  ENUM_VALUE16150 = 41;
+  ENUM_VALUE16151 = 42;
+  ENUM_VALUE16152 = 43;
+  ENUM_VALUE16153 = 44;
+  ENUM_VALUE16154 = 45;
+  ENUM_VALUE16155 = 11793;
+  ENUM_VALUE16156 = 3;
+  ENUM_VALUE16157 = 49;
+  ENUM_VALUE16158 = 50;
+  ENUM_VALUE16159 = 51;
+  ENUM_VALUE16160 = 817;
+  ENUM_VALUE16161 = 818;
+  ENUM_VALUE16162 = 819;
+  ENUM_VALUE16163 = 52;
+  ENUM_VALUE16164 = 833;
+  ENUM_VALUE16165 = 53;
+  ENUM_VALUE16166 = 54;
+  ENUM_VALUE16167 = 4;
+  ENUM_VALUE16168 = 1041;
+  ENUM_VALUE16169 = 16657;
+  ENUM_VALUE16170 = 16658;
+  ENUM_VALUE16171 = 16659;
+  ENUM_VALUE16172 = 16660;
+  ENUM_VALUE16173 = 16661;
+  ENUM_VALUE16174 = 1042;
+  ENUM_VALUE16175 = 16673;
+  ENUM_VALUE16176 = 1043;
+  ENUM_VALUE16177 = 16689;
+  ENUM_VALUE16178 = 16690;
+  ENUM_VALUE16179 = 16691;
+  ENUM_VALUE16180 = 16692;
+  ENUM_VALUE16181 = 16693;
+  ENUM_VALUE16182 = 16694;
+  ENUM_VALUE16183 = 16695;
+  ENUM_VALUE16184 = 1044;
+  ENUM_VALUE16185 = 16705;
+  ENUM_VALUE16186 = 16706;
+  ENUM_VALUE16187 = 16707;
+  ENUM_VALUE16188 = 16708;
+  ENUM_VALUE16189 = 16709;
+  ENUM_VALUE16190 = 16710;
+  ENUM_VALUE16191 = 16711;
+  ENUM_VALUE16192 = 16712;
+  ENUM_VALUE16193 = 16713;
+  ENUM_VALUE16194 = 1046;
+  ENUM_VALUE16195 = 16737;
+  ENUM_VALUE16196 = 1047;
+  ENUM_VALUE16197 = 16753;
+  ENUM_VALUE16198 = 268049;
+  ENUM_VALUE16199 = 268050;
+  ENUM_VALUE16200 = 268051;
+  ENUM_VALUE16201 = 268052;
+  ENUM_VALUE16202 = 1048;
+  ENUM_VALUE16203 = 16769;
+  ENUM_VALUE16204 = 16770;
+  ENUM_VALUE16205 = 16771;
+  ENUM_VALUE16206 = 16772;
+  ENUM_VALUE16207 = 16773;
+  ENUM_VALUE16208 = 1049;
+  ENUM_VALUE16209 = 1056;
+  ENUM_VALUE16210 = 1058;
+  ENUM_VALUE16211 = 1059;
+  ENUM_VALUE16212 = 1060;
+  ENUM_VALUE16213 = 1061;
+  ENUM_VALUE16214 = 5;
+  ENUM_VALUE16215 = 6;
+  ENUM_VALUE16216 = 97;
+  ENUM_VALUE16217 = 98;
+  ENUM_VALUE16218 = 99;
+  ENUM_VALUE16219 = 100;
+  ENUM_VALUE16220 = 101;
+  ENUM_VALUE16221 = 102;
+  ENUM_VALUE16222 = 103;
+  ENUM_VALUE16223 = 104;
+  ENUM_VALUE16224 = 105;
+  ENUM_VALUE16225 = 106;
+  ENUM_VALUE16226 = 108;
+  ENUM_VALUE16227 = 1729;
+  ENUM_VALUE16228 = 1730;
+  ENUM_VALUE16229 = 1731;
+  ENUM_VALUE16230 = 7;
+  ENUM_VALUE16231 = 8;
+  ENUM_VALUE16232 = 9;
+  ENUM_VALUE16233 = 10;
+  ENUM_VALUE16234 = 161;
+  ENUM_VALUE16235 = 2577;
+  ENUM_VALUE16236 = 41233;
+  ENUM_VALUE16237 = 41234;
+  ENUM_VALUE16238 = 2578;
+  ENUM_VALUE16239 = 2579;
+  ENUM_VALUE16240 = 41265;
+  ENUM_VALUE16241 = 2580;
+  ENUM_VALUE16242 = 2581;
+  ENUM_VALUE16243 = 41297;
+  ENUM_VALUE16244 = 41298;
+  ENUM_VALUE16245 = 41299;
+  ENUM_VALUE16246 = 41300;
+  ENUM_VALUE16247 = 2582;
+  ENUM_VALUE16248 = 2583;
+  ENUM_VALUE16249 = 2584;
+  ENUM_VALUE16250 = 162;
+  ENUM_VALUE16251 = 2593;
+  ENUM_VALUE16252 = 41489;
+  ENUM_VALUE16253 = 663825;
+  ENUM_VALUE16254 = 663826;
+  ENUM_VALUE16255 = 41490;
+  ENUM_VALUE16256 = 41491;
+  ENUM_VALUE16257 = 41492;
+  ENUM_VALUE16258 = 663873;
+  ENUM_VALUE16259 = 2594;
+  ENUM_VALUE16260 = 41505;
+  ENUM_VALUE16261 = 41506;
+  ENUM_VALUE16262 = 41507;
+  ENUM_VALUE16263 = 2595;
+  ENUM_VALUE16264 = 41521;
+  ENUM_VALUE16265 = 41522;
+  ENUM_VALUE16266 = 41523;
+  ENUM_VALUE16267 = 41524;
+  ENUM_VALUE16268 = 41525;
+  ENUM_VALUE16269 = 664401;
+  ENUM_VALUE16270 = 664402;
+  ENUM_VALUE16271 = 41526;
+  ENUM_VALUE16272 = 41527;
+  ENUM_VALUE16273 = 2596;
+  ENUM_VALUE16274 = 2597;
+  ENUM_VALUE16275 = 2598;
+  ENUM_VALUE16276 = 41569;
+  ENUM_VALUE16277 = 41570;
+  ENUM_VALUE16278 = 41571;
+  ENUM_VALUE16279 = 41572;
+  ENUM_VALUE16280 = 41573;
+  ENUM_VALUE16281 = 665169;
+  ENUM_VALUE16282 = 665170;
+  ENUM_VALUE16283 = 665171;
+  ENUM_VALUE16284 = 665172;
+  ENUM_VALUE16285 = 2599;
+  ENUM_VALUE16286 = 2600;
+  ENUM_VALUE16287 = 2601;
+  ENUM_VALUE16288 = 2603;
+  ENUM_VALUE16289 = 2604;
+  ENUM_VALUE16290 = 163;
+  ENUM_VALUE16291 = 2608;
+  ENUM_VALUE16292 = 2609;
+  ENUM_VALUE16293 = 2610;
+  ENUM_VALUE16294 = 2611;
+  ENUM_VALUE16295 = 2612;
+  ENUM_VALUE16296 = 164;
+  ENUM_VALUE16297 = 2625;
+  ENUM_VALUE16298 = 2626;
+  ENUM_VALUE16299 = 42017;
+  ENUM_VALUE16300 = 42018;
+  ENUM_VALUE16301 = 42019;
+  ENUM_VALUE16302 = 2627;
+  ENUM_VALUE16303 = 2628;
+  ENUM_VALUE16304 = 165;
+  ENUM_VALUE16305 = 2641;
+  ENUM_VALUE16306 = 42257;
+  ENUM_VALUE16307 = 42258;
+  ENUM_VALUE16308 = 2642;
+  ENUM_VALUE16309 = 2643;
+  ENUM_VALUE16310 = 2644;
+  ENUM_VALUE16311 = 2646;
+  ENUM_VALUE16312 = 2647;
+  ENUM_VALUE16313 = 42353;
+  ENUM_VALUE16314 = 2648;
+  ENUM_VALUE16315 = 2649;
+  ENUM_VALUE16316 = 2650;
+  ENUM_VALUE16317 = 2651;
+  ENUM_VALUE16318 = 2652;
+  ENUM_VALUE16319 = 2653;
+  ENUM_VALUE16320 = 2654;
+  ENUM_VALUE16321 = 42481;
+  ENUM_VALUE16322 = 42482;
+  ENUM_VALUE16323 = 42483;
+  ENUM_VALUE16324 = 166;
+  ENUM_VALUE16325 = 2657;
+  ENUM_VALUE16326 = 2658;
+  ENUM_VALUE16327 = 42529;
+  ENUM_VALUE16328 = 2659;
+  ENUM_VALUE16329 = 2660;
+  ENUM_VALUE16330 = 2661;
+  ENUM_VALUE16331 = 2662;
+  ENUM_VALUE16332 = 2663;
+  ENUM_VALUE16333 = 42609;
+  ENUM_VALUE16334 = 2664;
+  ENUM_VALUE16335 = 2665;
+  ENUM_VALUE16336 = 42753;
+  ENUM_VALUE16337 = 42754;
+  ENUM_VALUE16338 = 42755;
+  ENUM_VALUE16339 = 11;
+  ENUM_VALUE16340 = 177;
+  ENUM_VALUE16341 = 2833;
+  ENUM_VALUE16342 = 179;
+  ENUM_VALUE16343 = 180;
+  ENUM_VALUE16344 = 2881;
+  ENUM_VALUE16345 = 182;
+  ENUM_VALUE16346 = 183;
+  ENUM_VALUE16347 = 12;
+  ENUM_VALUE16348 = 3089;
+  ENUM_VALUE16349 = 194;
+  ENUM_VALUE16350 = 195;
+  ENUM_VALUE16351 = 196;
+  ENUM_VALUE16352 = 198;
+  ENUM_VALUE16353 = 3169;
+  ENUM_VALUE16354 = 199;
+  ENUM_VALUE16355 = 200;
+  ENUM_VALUE16356 = 208;
+  ENUM_VALUE16357 = 3329;
+  ENUM_VALUE16358 = 3330;
+  ENUM_VALUE16359 = 3331;
+  ENUM_VALUE16360 = 209;
+  ENUM_VALUE16361 = 210;
+  ENUM_VALUE16362 = 211;
+  ENUM_VALUE16363 = 3377;
+  ENUM_VALUE16364 = 3378;
+  ENUM_VALUE16365 = 3379;
+  ENUM_VALUE16366 = 3380;
+  ENUM_VALUE16367 = 3381;
+  ENUM_VALUE16368 = 865809;
+  ENUM_VALUE16369 = 865810;
+  ENUM_VALUE16370 = 865811;
+  ENUM_VALUE16371 = 865812;
+  ENUM_VALUE16372 = 865813;
+  ENUM_VALUE16373 = 865814;
+  ENUM_VALUE16374 = 865815;
+  ENUM_VALUE16375 = 865816;
+  ENUM_VALUE16376 = 865817;
+  ENUM_VALUE16377 = 865818;
+  ENUM_VALUE16378 = 865819;
+  ENUM_VALUE16379 = 865820;
+  ENUM_VALUE16380 = 865821;
+  ENUM_VALUE16381 = 865822;
+  ENUM_VALUE16382 = 865823;
+  ENUM_VALUE16383 = 865824;
+  ENUM_VALUE16384 = 865825;
+  ENUM_VALUE16385 = 865826;
+  ENUM_VALUE16386 = 865827;
+  ENUM_VALUE16387 = 865828;
+  ENUM_VALUE16388 = 865829;
+  ENUM_VALUE16389 = 212;
+  ENUM_VALUE16390 = 3393;
+  ENUM_VALUE16391 = 3394;
+  ENUM_VALUE16392 = 3395;
+  ENUM_VALUE16393 = 213;
+  ENUM_VALUE16394 = 214;
+  ENUM_VALUE16395 = 215;
+  ENUM_VALUE16396 = 3441;
+  ENUM_VALUE16397 = 3442;
+  ENUM_VALUE16398 = 216;
+  ENUM_VALUE16399 = 217;
+  ENUM_VALUE16400 = 3473;
+  ENUM_VALUE16401 = 3474;
+  ENUM_VALUE16402 = 3475;
+  ENUM_VALUE16403 = 254;
+  ENUM_VALUE16404 = 255;
+}
+
+enum Enum16553 {
+  ENUM_VALUE16554 = 0;
+  ENUM_VALUE16555 = 1;
+  ENUM_VALUE16556 = 2;
+  ENUM_VALUE16557 = 3;
+  ENUM_VALUE16558 = 4;
+  ENUM_VALUE16559 = 5;
+  ENUM_VALUE16560 = 6;
+  ENUM_VALUE16561 = 7;
+  ENUM_VALUE16562 = 8;
+  ENUM_VALUE16563 = 9;
+}
+
+enum Enum16728 {
+  ENUM_VALUE16729 = 1;
+  ENUM_VALUE16730 = 2;
+  ENUM_VALUE16731 = 3;
+}
+
+enum Enum16732 {
+  ENUM_VALUE16733 = 1;
+  ENUM_VALUE16734 = 2;
+  ENUM_VALUE16735 = 3;
+  ENUM_VALUE16736 = 4;
+  ENUM_VALUE16737 = 5;
+}
+
+enum Enum16738 {
+  ENUM_VALUE16739 = 1;
+  ENUM_VALUE16740 = 2;
+  ENUM_VALUE16741 = 3;
+  ENUM_VALUE16742 = 4;
+  ENUM_VALUE16743 = 5;
+  ENUM_VALUE16744 = 6;
+  ENUM_VALUE16745 = 7;
+}
+
+enum Enum16698 {
+  ENUM_VALUE16699 = -1;
+  ENUM_VALUE16700 = 100;
+  ENUM_VALUE16701 = 2;
+  ENUM_VALUE16702 = 0;
+  ENUM_VALUE16703 = 1;
+  ENUM_VALUE16704 = 4;
+  ENUM_VALUE16705 = 11;
+  ENUM_VALUE16706 = 12;
+  ENUM_VALUE16707 = 3;
+  ENUM_VALUE16708 = 5;
+  ENUM_VALUE16709 = 6;
+  ENUM_VALUE16710 = 7;
+  ENUM_VALUE16711 = 8;
+  ENUM_VALUE16712 = 9;
+  ENUM_VALUE16713 = 10;
+  ENUM_VALUE16714 = 13;
+  ENUM_VALUE16715 = 14;
+  ENUM_VALUE16716 = 15;
+  ENUM_VALUE16717 = 16;
+  ENUM_VALUE16718 = 18;
+  ENUM_VALUE16719 = 17;
+  ENUM_VALUE16720 = 19;
+  ENUM_VALUE16721 = 20;
+}
+
+enum Enum16819 {
+  ENUM_VALUE16820 = 0;
+  ENUM_VALUE16821 = 1;
+  ENUM_VALUE16822 = 2;
+  ENUM_VALUE16823 = 3;
+  ENUM_VALUE16824 = 4;
+  ENUM_VALUE16825 = 5;
+}
+
+enum Enum16925 {
+  ENUM_VALUE16926 = 0;
+  ENUM_VALUE16927 = 1;
+  ENUM_VALUE16928 = 2;
+  ENUM_VALUE16929 = 3;
+  ENUM_VALUE16930 = 4;
+  ENUM_VALUE16931 = 5;
+  ENUM_VALUE16932 = 6;
+  ENUM_VALUE16933 = 7;
+  ENUM_VALUE16934 = 8;
+  ENUM_VALUE16935 = 9;
+  ENUM_VALUE16936 = 10;
+  ENUM_VALUE16937 = 11;
+  ENUM_VALUE16938 = 12;
+  ENUM_VALUE16939 = 13;
+}
+
+enum Enum22854 {
+  ENUM_VALUE22855 = 0;
+  ENUM_VALUE22856 = 1;
+}
+
+enum Enum24361 {
+  ENUM_VALUE24362 = 0;
+  ENUM_VALUE24363 = 1;
+  ENUM_VALUE24364 = 2;
+  ENUM_VALUE24365 = 3;
+}
+
+enum Enum16891 {
+  ENUM_VALUE16892 = 0;
+  ENUM_VALUE16893 = 1;
+  ENUM_VALUE16894 = 2;
+  ENUM_VALUE16895 = 3;
+  ENUM_VALUE16896 = 4;
+  ENUM_VALUE16897 = 5;
+  ENUM_VALUE16898 = 6;
+  ENUM_VALUE16899 = 7;
+  ENUM_VALUE16900 = 8;
+  ENUM_VALUE16901 = 9;
+  ENUM_VALUE16902 = 10;
+  ENUM_VALUE16903 = 11;
+  ENUM_VALUE16904 = 12;
+  ENUM_VALUE16905 = 13;
+  ENUM_VALUE16906 = 14;
+  ENUM_VALUE16907 = 15;
+  ENUM_VALUE16908 = 16;
+  ENUM_VALUE16909 = 17;
+  ENUM_VALUE16910 = 18;
+  ENUM_VALUE16911 = 19;
+  ENUM_VALUE16912 = 20;
+  ENUM_VALUE16913 = 21;
+  ENUM_VALUE16914 = 22;
+  ENUM_VALUE16915 = 23;
+  ENUM_VALUE16916 = 24;
+  ENUM_VALUE16917 = 25;
+  ENUM_VALUE16918 = 26;
+  ENUM_VALUE16919 = 27;
+  ENUM_VALUE16920 = 28;
+  ENUM_VALUE16921 = 29;
+  ENUM_VALUE16922 = 30;
+  ENUM_VALUE16923 = 31;
+}
+
+enum Enum27361 {
+  ENUM_VALUE27362 = 0;
+  ENUM_VALUE27363 = 1;
+  ENUM_VALUE27364 = 2;
+  ENUM_VALUE27365 = 3;
+  ENUM_VALUE27366 = 4;
+}
+
+enum Enum33960 {
+  ENUM_VALUE33961 = 0;
+  ENUM_VALUE33962 = 1;
+  ENUM_VALUE33963 = 2;
+  ENUM_VALUE33964 = 3;
+  ENUM_VALUE33965 = 4;
+  ENUM_VALUE33966 = 5;
+  ENUM_VALUE33967 = 6;
+}
+
+enum Enum34388 {
+  ENUM_VALUE34389 = 1;
+}
+
+enum Enum35477 {
+  ENUM_VALUE35478 = 4;
+  ENUM_VALUE35479 = 3;
+  ENUM_VALUE35480 = 2;
+  ENUM_VALUE35481 = 1;
+  ENUM_VALUE35482 = 0;
+}
+
+enum Enum35507 {
+  ENUM_VALUE35508 = 0;
+  ENUM_VALUE35509 = 1;
+  ENUM_VALUE35510 = 2;
+  ENUM_VALUE35511 = 3;
+  ENUM_VALUE35512 = 4;
+  ENUM_VALUE35513 = 5;
+  ENUM_VALUE35514 = 6;
+  ENUM_VALUE35515 = 7;
+  ENUM_VALUE35516 = 8;
+  ENUM_VALUE35517 = 9;
+}
+
+enum Enum36860 {
+  ENUM_VALUE36861 = 0;
+  ENUM_VALUE36862 = 1;
+  ENUM_VALUE36863 = 2;
+  ENUM_VALUE36864 = 3;
+  ENUM_VALUE36865 = 4;
+  ENUM_VALUE36866 = 5;
+  ENUM_VALUE36867 = 6;
+  ENUM_VALUE36868 = 7;
+}
+
+enum Enum36890 {
+  ENUM_VALUE36891 = 0;
+  ENUM_VALUE36892 = 1;
+}
+
diff --git a/benchmarks/datasets/google_message4/benchmark_message4.proto b/benchmarks/datasets/google_message4/benchmark_message4.proto
new file mode 100644
index 0000000..2161393
--- /dev/null
+++ b/benchmarks/datasets/google_message4/benchmark_message4.proto
@@ -0,0 +1,454 @@
+syntax = "proto2";
+
+import "datasets/google_message4/benchmark_message4_1.proto";
+import "datasets/google_message4/benchmark_message4_2.proto";
+import "datasets/google_message4/benchmark_message4_3.proto";
+package benchmarks.google_message4;
+
+option cc_enable_arenas = true;
+option java_package = "com.google.protobuf.benchmarks";
+
+message GoogleMessage4 {
+  optional int32 field37503 = 1;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field37504 = 2;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field37505 = 3;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field37506 = 4;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field37507 = 5;
+  optional .benchmarks.google_message4.Message37489 field37508 = 6;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field37509 = 7;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field37510 = 8;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field37511 = 9;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field37512 = 10;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field37513 = 11;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field37514 = 12;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field37515 = 13;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field37516 = 14;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field37517 = 15;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field37518 = 16;
+}
+
+message Message37489 {
+  optional .benchmarks.google_message4.Message2517 field37534 = 3;
+  optional .benchmarks.google_message4.Message7330 field37535 = 4;
+  optional .benchmarks.google_message4.Message8815 field37536 = 6;
+  optional .benchmarks.google_message4.Message8817 field37537 = 7;
+  optional .benchmarks.google_message4.Message8835 field37538 = 8;
+  optional .benchmarks.google_message4.Message8848 field37539 = 9;
+  optional .benchmarks.google_message4.Message8856 field37540 = 11;
+  optional .benchmarks.google_message4.Message12717 field37541 = 15;
+  optional .benchmarks.google_message4.Message12748 field37542 = 20;
+  optional .benchmarks.google_message4.Message7319 field37543 = 22;
+  optional .benchmarks.google_message4.Message12908 field37544 = 24;
+  optional .benchmarks.google_message4.Message12910 field37545 = 25;
+  optional .benchmarks.google_message4.Message12960 field37546 = 30;
+  optional .benchmarks.google_message4.Message176 field37547 = 33;
+  optional .benchmarks.google_message4.Message13000 field37548 = 34;
+  optional .benchmarks.google_message4.Message13035 field37549 = 35;
+  optional .benchmarks.google_message4.Message37331 field37550 = 36;
+  optional .benchmarks.google_message4.Message37329 field37551 = 37;
+  optional .benchmarks.google_message4.Message37327 field37552 = 38;
+  optional .benchmarks.google_message4.Message37333 field37553 = 39;
+  optional .benchmarks.google_message4.Message37335 field37554 = 40;
+}
+
+message Message7319 {
+  optional .benchmarks.google_message4.UnusedEmptyMessage field7321 = 1;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field7322 = 7;
+}
+
+message Message12717 {
+  optional .benchmarks.google_message4.UnusedEmptyMessage field12719 = 1;
+  optional string field12720 = 2;
+  optional uint32 field12721 = 3;
+  optional .benchmarks.google_message4.Message11976 field12722 = 4;
+  repeated .benchmarks.google_message4.Message11948 field12723 = 5;
+  optional .benchmarks.google_message4.Message11947 field12724 = 6;
+  optional .benchmarks.google_message4.Message12687 field12725 = 7;
+  repeated .benchmarks.google_message4.Message11948 field12726 = 8;
+  optional int64 field12727 = 9;
+}
+
+message Message37331 {
+  optional .benchmarks.google_message4.UnusedEmptyMessage field37367 = 4;
+  required .benchmarks.google_message4.Message37326 field37368 = 1;
+  required int64 field37369 = 2;
+  required bytes field37370 = 3;
+}
+
+message Message8815 {
+  optional .benchmarks.google_message4.UnusedEmptyMessage field8819 = 1;
+  repeated .benchmarks.google_message4.Message8768 field8820 = 2;
+  optional bool field8821 = 3;
+}
+
+message Message7330 {
+  optional .benchmarks.google_message4.UnusedEmptyMessage field7332 = 1;
+  optional .benchmarks.google_message4.Message3069 field7333 = 2;
+  optional .benchmarks.google_message4.Message7320 field7334 = 3;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field7335 = 4;
+  optional bool field7336 = 5;
+  optional int64 field7337 = 6;
+}
+
+message Message12960 {
+  optional .benchmarks.google_message4.UnusedEmptyMessage field12962 = 1;
+  optional .benchmarks.google_message4.Message12948 field12963 = 2;
+}
+
+message Message176 {
+  required string field408 = 1;
+  optional int32 field409 = 4;
+  optional string field410 = 50;
+  optional int32 field411 = 2;
+  optional uint64 field412 = 47;
+  optional string field413 = 56;
+  optional int32 field414 = 24;
+  optional string field415 = 21;
+  optional bytes field416 = 3;
+  optional string field417 = 57;
+  optional int32 field418 = 51;
+  optional float field419 = 7;
+  optional bool field420 = 5;
+  optional bool field421 = 28;
+  optional int32 field422 = 6;
+  repeated int32 field423 = 40;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field424 = 41;
+  optional bool field425 = 25;
+  optional uint64 field426 = 26;
+  optional int32 field427 = 38;
+  optional bytes field428 = 15;
+  optional bytes field429 = 55;
+  optional bytes field430 = 16;
+  optional bytes field431 = 23;
+  optional bool field432 = 33;
+  optional bytes field433 = 31;
+  optional bytes field434 = 32;
+  optional int32 field435 = 36;
+  optional uint64 field436 = 17;
+  optional int32 field437 = 45;
+  optional uint64 field438 = 18;
+  optional string field439 = 46;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field440 = 64;
+  optional int32 field441 = 39;
+  optional uint64 field442 = 48;
+  optional bytes field443 = 19;
+  optional bytes field444 = 42;
+  optional bytes field445 = 43;
+  optional string field446 = 44;
+  optional string field447 = 49;
+  optional int64 field448 = 20;
+  optional bool field449 = 53;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field450 = 54;
+  repeated .benchmarks.google_message4.UnusedEmptyMessage field451 = 22;
+  optional .benchmarks.google_message4.UnusedEnum field452 = 27;
+  optional int32 field453 = 29;
+  optional int32 field454 = 30;
+  optional .benchmarks.google_message4.UnusedEnum field455 = 37;
+  optional .benchmarks.google_message4.UnusedEnum field456 = 34;
+  optional int32 field457 = 35;
+  repeated group Message178 = 101 {
+  }
+  optional bool field459 = 52;
+  optional uint64 field460 = 58;
+  optional uint64 field461 = 59;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field462 = 60;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field463 = 61;
+  optional .benchmarks.google_message4.UnusedEnum field464 = 62;
+  repeated string field465 = 63;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field466 = 65;
+}
+
+message Message8817 {
+  optional .benchmarks.google_message4.UnusedEmptyMessage field8825 = 1;
+  repeated .benchmarks.google_message4.Message8768 field8826 = 2;
+  optional string field8827 = 3;
+}
+
+message Message8835 {
+  optional .benchmarks.google_message4.UnusedEmptyMessage field8837 = 1;
+  repeated string field8838 = 2;
+  optional .benchmarks.google_message4.UnusedEnum field8839 = 3;
+}
+
+message Message37333 {
+  optional .benchmarks.google_message4.UnusedEmptyMessage field37372 = 3;
+  required .benchmarks.google_message4.Message37326 field37373 = 1;
+  optional uint64 field37374 = 2;
+}
+
+message Message13000 {
+  optional int64 field13015 = 1;
+  repeated .benchmarks.google_message4.Message12979 field13016 = 2;
+}
+
+message Message37335 {
+  optional .benchmarks.google_message4.UnusedEmptyMessage field37376 = 4;
+  required .benchmarks.google_message4.Message37326 field37377 = 1;
+  required .benchmarks.google_message4.Message37173 field37378 = 2;
+  optional uint64 field37379 = 3;
+}
+
+message Message8848 {
+  optional .benchmarks.google_message4.UnusedEmptyMessage field8850 = 1;
+  optional string field8851 = 2;
+  optional bytes field8852 = 3;
+}
+
+message Message13035 {
+  optional int64 field13058 = 1;
+  repeated int64 field13059 = 2;
+}
+
+message Message8856 {
+  optional .benchmarks.google_message4.UnusedEmptyMessage field8858 = 1;
+  optional string field8859 = 2;
+}
+
+message Message12908 {
+  optional .benchmarks.google_message4.UnusedEmptyMessage field12912 = 1;
+  optional string field12913 = 2;
+  optional .benchmarks.google_message4.Message12799 field12914 = 3;
+  optional int64 field12915 = 4;
+  optional .benchmarks.google_message4.Message3804 field12916 = 5;
+  optional .benchmarks.google_message4.Message12870 field12917 = 6;
+}
+
+message Message12910 {
+  optional .benchmarks.google_message4.UnusedEmptyMessage field12920 = 1;
+  optional .benchmarks.google_message4.Message12818 field12921 = 2;
+  repeated .benchmarks.google_message4.Message12903 field12922 = 3;
+}
+
+message Message37327 {
+  optional .benchmarks.google_message4.UnusedEmptyMessage field37347 = 11;
+  required .benchmarks.google_message4.Message37326 field37348 = 1;
+  optional bool field37349 = 2;
+  optional bool field37350 = 3;
+  optional bool field37351 = 4;
+  optional bool field37352 = 5;
+  optional bool field37353 = 6;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field37354 = 7;
+  optional uint64 field37355 = 8;
+  optional bool field37356 = 9;
+  optional bool field37357 = 10;
+}
+
+message Message37329 {
+  optional .benchmarks.google_message4.UnusedEmptyMessage field37359 = 6;
+  required .benchmarks.google_message4.Message37326 field37360 = 1;
+  required int64 field37361 = 2;
+  required int64 field37362 = 3;
+  optional bool field37363 = 4;
+}
+
+message Message2517 {
+  optional .benchmarks.google_message4.UnusedEmptyMessage field2519 = 1;
+  optional .benchmarks.google_message4.Message2356 field2520 = 2;
+  optional .benchmarks.google_message4.Message0 field2521 = 3;
+  optional .benchmarks.google_message4.Message2463 field2522 = 4;
+  repeated .benchmarks.google_message4.Message971 field2523 = 5;
+}
+
+message Message12748 {
+  optional .benchmarks.google_message4.UnusedEmptyMessage field12754 = 1;
+  optional string field12755 = 2;
+  optional string field12756 = 3;
+  optional .benchmarks.google_message4.Enum12735 field12757 = 4;
+}
+
+message Message12687 {
+  repeated .benchmarks.google_message4.Message12686 field12701 = 1;
+}
+
+message Message11948 {
+  optional string field11954 = 1;
+  repeated .benchmarks.google_message4.Message11949 field11955 = 2;
+  optional bool field11956 = 3;
+}
+
+message Message11976 {
+  repeated .benchmarks.google_message4.Message11975 field12002 = 1;
+}
+
+message Message7320 {
+  optional .benchmarks.google_message4.UnusedEmptyMessage field7323 = 1;
+  optional .benchmarks.google_message4.Message7287 field7324 = 8;
+}
+
+message Message3069 {
+  optional .benchmarks.google_message4.Message3061 field3374 = 1;
+  optional bytes field3375 = 2;
+  repeated group Message3070 = 3 {
+    required .benchmarks.google_message4.Enum3071 field3378 = 4;
+    required bytes field3379 = 5;
+  }
+  extensions 10000 to 536870911;
+}
+
+message Message12948 {
+  repeated .benchmarks.google_message4.Message12949 field12958 = 1;
+}
+
+message Message8768 {
+  optional string field8782 = 1;
+  optional .benchmarks.google_message4.Message8572 field8783 = 2;
+  optional bool field8784 = 3;
+  repeated .benchmarks.google_message4.Message8774 field8785 = 4;
+  optional int64 field8786 = 5;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field8787 = 6;
+  optional string field8788 = 7;
+}
+
+message Message12979 {
+  required bytes field12981 = 1;
+  repeated string field12982 = 2;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field12983 = 3;
+  optional int64 field12984 = 4;
+  optional string field12985 = 5;
+  optional int32 field12986 = 6;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field12987 = 7;
+}
+
+message Message37173 {
+  optional string field37252 = 1;
+  optional int64 field37253 = 2;
+  optional .benchmarks.google_message4.UnusedEnum field37254 = 4;
+  optional bool field37255 = 5;
+  optional bool field37256 = 6;
+  optional bool field37257 = 7;
+  optional string field37258 = 8;
+  optional string field37259 = 9;
+  optional uint32 field37260 = 10;
+  optional fixed32 field37261 = 11;
+  optional string field37262 = 12;
+  optional string field37263 = 13;
+  optional string field37264 = 14;
+  optional int32 field37265 = 15;
+  optional int64 field37266 = 16;
+  optional int64 field37267 = 17;
+  optional int32 field37268 = 18;
+  optional int32 field37269 = 19;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field37270 = 20;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field37271 = 21;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field37272 = 22;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field37273 = 23;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field37274 = 24;
+  optional string field37275 = 25;
+  optional bool field37276 = 26;
+}
+
+message Message12799 {
+  required string field12809 = 1;
+  repeated fixed64 field12810 = 2;
+  repeated .benchmarks.google_message4.Message12776 field12811 = 8;
+  repeated int32 field12812 = 4;
+  repeated .benchmarks.google_message4.Message12798 field12813 = 5;
+  required int32 field12814 = 3;
+  optional int32 field12815 = 6;
+  optional .benchmarks.google_message4.Message12797 field12816 = 7;
+}
+
+message Message12870 {
+  required int32 field12879 = 1;
+  optional int32 field12880 = 7;
+  required int32 field12881 = 2;
+  optional uint64 field12882 = 3;
+  optional string field12883 = 2001;
+  optional fixed64 field12884 = 4;
+  repeated fixed64 field12885 = 14;
+  optional int32 field12886 = 9;
+  optional int64 field12887 = 18;
+  repeated .benchmarks.google_message4.Message12870 field12888 = 8;
+  optional int32 field12889 = 5;
+  optional uint64 field12890 = 6;
+  optional int32 field12891 = 10;
+  optional int32 field12892 = 11;
+  optional double field12893 = 12;
+  optional .benchmarks.google_message4.Message12825 field12894 = 13;
+  optional double field12895 = 15;
+  optional string field12896 = 16;
+  optional .benchmarks.google_message4.Enum12871 field12897 = 17;
+  optional int32 field12898 = 19;
+}
+
+message Message3804 {
+  required int64 field3818 = 1;
+  required bool field3819 = 2;
+  repeated .benchmarks.google_message4.Enum3805 field3820 = 4;
+  optional int32 field3821 = 5;
+  optional bool field3822 = 6;
+  optional int64 field3823 = 7;
+  optional .benchmarks.google_message4.Enum3783 field3824 = 8;
+}
+
+message Message12903 {
+  optional string field12905 = 1;
+  optional .benchmarks.google_message4.Message8587 field12906 = 2;
+  repeated .benchmarks.google_message4.Message8590 field12907 = 3;
+}
+
+message Message37326 {
+  required string field37345 = 1;
+  optional string field37346 = 2;
+}
+
+message Message2356 {
+  optional .benchmarks.google_message4.Message1374 field2368 = 121;
+  optional uint64 field2369 = 1;
+  optional int32 field2370 = 2;
+  optional int32 field2371 = 17;
+  required string field2372 = 3;
+  optional int32 field2373 = 7;
+  optional bytes field2374 = 8;
+  optional string field2375 = 4;
+  optional string field2376 = 101;
+  optional int32 field2377 = 102;
+  optional int32 field2378 = 103;
+  optional int32 field2379 = 104;
+  optional int32 field2380 = 113;
+  optional int32 field2381 = 114;
+  optional int32 field2382 = 115;
+  optional int32 field2383 = 117;
+  optional int32 field2384 = 118;
+  optional int32 field2385 = 119;
+  optional int32 field2386 = 105;
+  optional bytes field2387 = 5;
+  optional group Message2357 = 6 {
+    optional int64 field2399 = 9;
+    optional int32 field2400 = 10;
+    optional int32 field2401 = 11;
+    optional int32 field2402 = 12;
+    optional int32 field2403 = 13;
+    optional int32 field2404 = 116;
+    optional int32 field2405 = 106;
+    required bytes field2406 = 14;
+    optional int32 field2407 = 45;
+    optional int32 field2408 = 112;
+    optional bool field2409 = 122;
+    optional bytes field2410 = 124;
+  }
+  optional string field2389 = 120;
+  optional group Message2358 = 107 {
+  }
+  repeated group Message2359 = 40 {
+  }
+  optional int32 field2392 = 50;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field2393 = 60;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field2394 = 70;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field2395 = 80;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field2396 = 90;
+  optional string field2397 = 100;
+  optional string field2398 = 123;
+}
+
+message Message0 {
+  option message_set_wire_format = true;
+  extensions 4 to 2147483646;
+}
+
+message Message971 {
+  optional string field972 = 1;
+  optional int32 field973 = 2;
+  optional bool field974 = 3;
+}
+
diff --git a/benchmarks/datasets/google_message4/benchmark_message4_1.proto b/benchmarks/datasets/google_message4/benchmark_message4_1.proto
new file mode 100644
index 0000000..e769748
--- /dev/null
+++ b/benchmarks/datasets/google_message4/benchmark_message4_1.proto
@@ -0,0 +1,474 @@
+syntax = "proto2";
+
+import "datasets/google_message4/benchmark_message4_2.proto";
+import "datasets/google_message4/benchmark_message4_3.proto";
+package benchmarks.google_message4;
+
+option cc_enable_arenas = true;
+option java_package = "com.google.protobuf.benchmarks";
+
+message Message2463 {
+  repeated .benchmarks.google_message4.Message2462 field2498 = 1;
+}
+
+message Message12686 {
+  optional string field12699 = 1;
+  optional .benchmarks.google_message4.Message12685 field12700 = 2;
+}
+
+message Message11949 {
+}
+
+message Message11975 {
+  optional string field11992 = 1;
+  optional int32 field11993 = 2;
+  repeated .benchmarks.google_message4.Message10320 field11994 = 3;
+  optional .benchmarks.google_message4.Message11947 field11995 = 4;
+  optional .benchmarks.google_message4.Message11920 field11996 = 5;
+  optional bool field11997 = 6;
+  repeated string field11998 = 7;
+  optional float field11999 = 8;
+  repeated .benchmarks.google_message4.UnusedEnum field12000 = 9;
+  optional int32 field12001 = 11;
+}
+
+message Message7287 {
+  optional .benchmarks.google_message4.Message6133 field7311 = 1;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field7312 = 8;
+  optional string field7313 = 3;
+  optional .benchmarks.google_message4.Message6643 field7314 = 4;
+  optional .benchmarks.google_message4.Enum7288 field7315 = 5;
+  optional bytes field7316 = 6;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field7317 = 7;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field7318 = 9;
+}
+
+message Message3061 {
+  optional string field3286 = 2;
+  optional int32 field3287 = 77;
+  optional string field3288 = 49;
+  required .benchmarks.google_message4.Message3046 field3289 = 3;
+  optional .benchmarks.google_message4.Message3046 field3290 = 58;
+  optional group Message3062 = 4 {
+    required int32 field3335 = 5;
+    optional int32 field3336 = 6;
+    optional int32 field3337 = 7;
+  }
+  optional .benchmarks.google_message4.Message3060 field3292 = 104;
+  optional int64 field3293 = 32;
+  optional int32 field3294 = 41;
+  optional group Message3063 = 13 {
+    required int32 field3338 = 14;
+    optional .benchmarks.google_message4.Enum2851 field3339 = 18;
+    optional int64 field3340 = 15;
+    optional int64 field3341 = 23;
+  }
+  optional .benchmarks.google_message4.Enum2834 field3296 = 94;
+  optional bool field3297 = 25;
+  optional bool field3298 = 50;
+  optional string field3299 = 89;
+  optional string field3300 = 91;
+  optional string field3301 = 105;
+  optional .benchmarks.google_message4.Message3050 field3302 = 53;
+  optional fixed64 field3303 = 51;
+  optional fixed64 field3304 = 106;
+  optional int32 field3305 = 60;
+  optional string field3306 = 44;
+  optional bytes field3307 = 81;
+  optional string field3308 = 70;
+  optional bytes field3309 = 45;
+  optional .benchmarks.google_message4.Enum2806 field3310 = 71;
+  optional int32 field3311 = 72;
+  optional bytes field3312 = 78;
+  optional int32 field3313 = 20;
+  repeated group Message3064 = 8 {
+    required .benchmarks.google_message4.Enum2602 field3342 = 9;
+    optional int32 field3343 = 92;
+    optional string field3344 = 10;
+    optional bytes field3345 = 11;
+    optional int32 field3346 = 12;
+    optional .benchmarks.google_message4.Message3060 field3347 = 98;
+    optional .benchmarks.google_message4.UnusedEmptyMessage field3348 = 82;
+    optional .benchmarks.google_message4.Message3050 field3349 = 80;
+    optional fixed64 field3350 = 52;
+    optional int32 field3351 = 33;
+    optional string field3352 = 42;
+    optional string field3353 = 69;
+    optional bytes field3354 = 43;
+    optional .benchmarks.google_message4.Enum2806 field3355 = 73;
+    optional int32 field3356 = 74;
+    optional int32 field3357 = 90;
+    optional bytes field3358 = 79;
+    optional int32 field3359 = 19;
+    optional .benchmarks.google_message4.Enum2834 field3360 = 95;
+  }
+  optional .benchmarks.google_message4.UnusedEmptyMessage field3315 = 39;
+  optional int32 field3316 = 76;
+  optional group Message3065 = 63 {
+  }
+  optional .benchmarks.google_message4.Enum2806 field3318 = 54;
+  optional int32 field3319 = 46;
+  repeated string field3320 = 24;
+  optional fixed32 field3321 = 38;
+  optional bytes field3322 = 99;
+  optional fixed64 field3323 = 1;
+  optional fixed64 field3324 = 97;
+  repeated .benchmarks.google_message4.Message3040 field3325 = 16;
+  repeated .benchmarks.google_message4.Message3041 field3326 = 61;
+  optional group Message3066 = 21 {
+    optional int32 field3366 = 22;
+    optional int32 field3367 = 55;
+    optional int32 field3368 = 88;
+    optional int32 field3369 = 56;
+    optional int32 field3370 = 75;
+    optional int32 field3371 = 57;
+    optional .benchmarks.google_message4.UnusedEmptyMessage field3372 = 85;
+    optional .benchmarks.google_message4.UnusedEmptyMessage field3373 = 96;
+  }
+  optional .benchmarks.google_message4.UnusedEmptyMessage field3328 = 47;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field3329 = 48;
+  optional fixed64 field3330 = 40;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field3331 = 86;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field3332 = 59;
+  optional int32 field3333 = 17;
+}
+
+message Message12949 {
+}
+
+message Message8572 {
+  optional bytes field8647 = 1;
+  optional bytes field8648 = 3;
+  optional .benchmarks.google_message4.Message3886 field8649 = 4;
+  optional .benchmarks.google_message4.Message3919 field8650 = 57;
+  optional bool field8651 = 5;
+  optional int32 field8652 = 6;
+  optional int32 field8653 = 49;
+  optional .benchmarks.google_message4.Message7905 field8654 = 7;
+  optional int32 field8655 = 10;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field8656 = 11;
+  optional bool field8657 = 35;
+  optional bytes field8658 = 12;
+  optional string field8659 = 14;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field8660 = 13;
+  optional bytes field8661 = 15;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field8662 = 17;
+  optional int32 field8663 = 18;
+  optional int32 field8664 = 19;
+  optional bool field8665 = 20;
+  optional .benchmarks.google_message4.Enum3476 field8666 = 31;
+  optional bool field8667 = 36;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field8668 = 39;
+  optional bytes field8669 = 22;
+  optional int32 field8670 = 24;
+  optional .benchmarks.google_message4.Message3052 field8671 = 25;
+  optional bytes field8672 = 26;
+  optional bytes field8673 = 28;
+  optional int32 field8674 = 29;
+  optional bytes field8675 = 30;
+  optional bytes field8676 = 32;
+  optional string field8677 = 33;
+  optional int32 field8678 = 34;
+  optional int32 field8679 = 37;
+  optional double field8680 = 38;
+  optional double field8681 = 42;
+  optional .benchmarks.google_message4.Message3922 field8682 = 40;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field8683 = 43;
+  optional int64 field8684 = 44;
+  optional .benchmarks.google_message4.Message7929 field8685 = 45;
+  optional uint64 field8686 = 46;
+  optional uint32 field8687 = 48;
+  optional .benchmarks.google_message4.Message7843 field8688 = 47;
+  optional .benchmarks.google_message4.Message7864 field8689 = 50;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field8690 = 52;
+  optional bool field8691 = 58;
+  optional bool field8692 = 54;
+  optional string field8693 = 55;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field8694 = 41;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field8695 = 53;
+  optional .benchmarks.google_message4.Message8575 field8696 = 61;
+}
+
+message Message8774 {
+  optional string field8810 = 1;
+  optional string field8811 = 2;
+  optional string field8812 = 3;
+  optional string field8813 = 4;
+  optional string field8814 = 5;
+}
+
+message Message12776 {
+  optional string field12786 = 1;
+  optional fixed64 field12787 = 11;
+  optional int32 field12788 = 6;
+  optional int32 field12789 = 13;
+  optional int32 field12790 = 14;
+  optional int32 field12791 = 15;
+  optional int32 field12792 = 16;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field12793 = 8;
+  optional .benchmarks.google_message4.Message12774 field12794 = 10;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field12795 = 12;
+  extensions 2 to 2;
+  extensions 3 to 3;
+  extensions 4 to 4;
+  extensions 5 to 5;
+  extensions 7 to 7;
+  extensions 9 to 9;
+}
+
+message Message12798 {
+  optional int32 field12805 = 1;
+  optional int32 field12806 = 2;
+  optional .benchmarks.google_message4.Message12774 field12807 = 6;
+  optional bool field12808 = 7;
+}
+
+message Message12797 {
+  optional .benchmarks.google_message4.Message12796 field12802 = 1;
+  repeated .benchmarks.google_message4.Message12796 field12803 = 2;
+  optional string field12804 = 3;
+}
+
+message Message12825 {
+  repeated .benchmarks.google_message4.Message12818 field12862 = 1;
+  optional int32 field12863 = 2;
+  optional .benchmarks.google_message4.Message12819 field12864 = 3;
+  optional .benchmarks.google_message4.Message12820 field12865 = 4;
+  optional int32 field12866 = 5;
+  repeated .benchmarks.google_message4.Message12821 field12867 = 6;
+  repeated .benchmarks.google_message4.UnusedEmptyMessage field12868 = 7;
+}
+
+message Message8590 {
+}
+
+message Message8587 {
+}
+
+message Message1374 {
+  required string field1375 = 1;
+  optional string field1376 = 2;
+}
+
+message Message2462 {
+  required bytes field2496 = 1;
+  required double field2497 = 2;
+}
+
+message Message12685 {
+  repeated string field12692 = 1;
+  repeated string field12693 = 2;
+  optional int64 field12694 = 3;
+  optional uint32 field12695 = 4;
+  repeated string field12696 = 5;
+  optional string field12697 = 6;
+  optional string field12698 = 7;
+}
+
+message Message10320 {
+  optional .benchmarks.google_message4.Enum10335 field10347 = 1;
+  repeated .benchmarks.google_message4.Message10319 field10348 = 2;
+  optional int32 field10349 = 3;
+  optional int32 field10350 = 4;
+  optional int32 field10351 = 5;
+  optional int32 field10352 = 6;
+  optional .benchmarks.google_message4.Enum10337 field10353 = 7;
+}
+
+message Message11947 {
+  optional uint32 field11951 = 1;
+  optional bool field11952 = 2;
+  optional int32 field11953 = 3;
+}
+
+message Message11920 {
+  optional .benchmarks.google_message4.Enum11901 field11945 = 1;
+  optional .benchmarks.google_message4.UnusedEnum field11946 = 2;
+}
+
+message Message6643 {
+  optional .benchmarks.google_message4.UnusedEmptyMessage field6683 = 3;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field6684 = 4;
+  optional double field6685 = 5;
+  optional double field6686 = 6;
+  optional int32 field6687 = 1;
+  optional int32 field6688 = 2;
+  optional double field6689 = 9;
+  optional bytes field6690 = 10;
+  optional int32 field6691 = 11;
+  optional bool field6692 = 12;
+  optional bool field6693 = 13;
+  optional .benchmarks.google_message4.Message6578 field6694 = 15;
+  optional .benchmarks.google_message4.UnusedEnum field6695 = 16;
+  optional int64 field6696 = 17;
+  repeated .benchmarks.google_message4.UnusedEmptyMessage field6697 = 22;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field6698 = 19;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field6699 = 20;
+  optional int32 field6700 = 21;
+}
+
+message Message6133 {
+  optional .benchmarks.google_message4.Message4016 field6173 = 12;
+  optional double field6174 = 16;
+  required string field6175 = 1;
+  required string field6176 = 2;
+  required string field6177 = 3;
+  optional string field6178 = 4;
+  optional string field6179 = 8;
+  repeated .benchmarks.google_message4.Message6109 field6180 = 5;
+  repeated .benchmarks.google_message4.Message5908 field6181 = 13;
+  repeated .benchmarks.google_message4.Message6107 field6182 = 7;
+  repeated .benchmarks.google_message4.Message6126 field6183 = 9;
+  repeated .benchmarks.google_message4.Message6129 field6184 = 15;
+  optional int32 field6185 = 10;
+  optional int32 field6186 = 11;
+  optional .benchmarks.google_message4.Message4016 field6187 = 17;
+  optional double field6188 = 14;
+  optional double field6189 = 18;
+  optional string field6190 = 19;
+  optional string field6191 = 20;
+  repeated .benchmarks.google_message4.Message5881 field6192 = 21;
+}
+
+message Message6109 {
+  optional string field6140 = 1;
+  required .benchmarks.google_message4.Enum6111 field6141 = 2;
+  optional int32 field6142 = 9;
+  optional string field6143 = 3;
+  repeated .benchmarks.google_message4.Message6110 field6144 = 4;
+  repeated int32 field6145 = 7;
+  repeated int32 field6146 = 8;
+  optional .benchmarks.google_message4.Message6133 field6147 = 10;
+  repeated int32 field6148 = 11;
+  optional string field6149 = 12;
+  optional string field6150 = 13;
+  optional bool field6151 = 14;
+  extensions 1000 to 536870911;
+}
+
+message Message3046 {
+  required .benchmarks.google_message4.Enum2593 field3222 = 1;
+  optional int32 field3223 = 4;
+}
+
+message Message3060 {
+  optional int64 field3283 = 1;
+  optional int64 field3284 = 2;
+  optional int64 field3285 = 3;
+}
+
+message Message3041 {
+  optional string field3214 = 1;
+  optional int32 field3215 = 2;
+}
+
+message Message3040 {
+  required fixed64 field3209 = 1;
+  repeated fixed64 field3210 = 4;
+  optional int32 field3211 = 5;
+  optional fixed64 field3212 = 2;
+  required string field3213 = 3;
+}
+
+message Message3050 {
+  optional bytes field3245 = 5;
+  optional int32 field3246 = 2;
+  optional bytes field3247 = 6;
+  optional int32 field3248 = 4;
+  optional fixed32 field3249 = 1;
+  optional fixed32 field3250 = 3;
+}
+
+message Message7905 {
+  optional int32 field7911 = 1;
+  optional bool field7912 = 2;
+  optional bytes field7913 = 3;
+  optional int32 field7914 = 4;
+  optional int32 field7915 = 5;
+  optional bytes field7916 = 6;
+  optional int32 field7917 = 7;
+}
+
+message Message3886 {
+  repeated group Message3887 = 1 {
+    required string field3932 = 2;
+    optional string field3933 = 9;
+    optional .benchmarks.google_message4.Message3850 field3934 = 3;
+    optional bytes field3935 = 8;
+  }
+}
+
+message Message7864 {
+  optional string field7866 = 1;
+  optional string field7867 = 2;
+  repeated .benchmarks.google_message4.Message7865 field7868 = 5;
+  repeated .benchmarks.google_message4.Message7865 field7869 = 6;
+  repeated .benchmarks.google_message4.Message7865 field7870 = 7;
+  repeated .benchmarks.google_message4.UnusedEmptyMessage field7871 = 8;
+}
+
+message Message3922 {
+  optional uint64 field4012 = 1;
+}
+
+message Message3052 {
+  repeated string field3254 = 1;
+  repeated string field3255 = 2;
+  repeated bytes field3256 = 3;
+  repeated string field3257 = 4;
+  optional bool field3258 = 5;
+  optional int32 field3259 = 6;
+  optional int32 field3260 = 7;
+  optional string field3261 = 8;
+  optional string field3262 = 9;
+}
+
+message Message8575 {
+}
+
+message Message7843 {
+  optional bool field7844 = 5;
+  optional int32 field7845 = 1;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field7846 = 22;
+  repeated int32 field7847 = 3;
+  repeated string field7848 = 11;
+  optional .benchmarks.google_message4.UnusedEnum field7849 = 15;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field7850 = 6;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field7851 = 14;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field7852 = 10;
+  optional .benchmarks.google_message4.Message7511 field7853 = 13;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field7854 = 16;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field7855 = 17;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field7856 = 19;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field7857 = 18;
+  optional .benchmarks.google_message4.UnusedEnum field7858 = 20;
+  optional int32 field7859 = 2;
+}
+
+message Message3919 {
+  repeated .benchmarks.google_message4.Message3920 field4009 = 1;
+}
+
+message Message7929 {
+  optional int64 field7942 = 1;
+  optional int64 field7943 = 4;
+  optional int64 field7944 = 5;
+  optional int64 field7945 = 12;
+  optional int64 field7946 = 13;
+  optional int64 field7947 = 18;
+  optional int64 field7948 = 6;
+  optional int64 field7949 = 7;
+  repeated .benchmarks.google_message4.Message7919 field7950 = 8;
+  repeated .benchmarks.google_message4.UnusedEmptyMessage field7951 = 20;
+  repeated .benchmarks.google_message4.Message7920 field7952 = 14;
+  repeated .benchmarks.google_message4.Message7921 field7953 = 15;
+  repeated .benchmarks.google_message4.Message7928 field7954 = 17;
+  optional int64 field7955 = 19;
+  optional bool field7956 = 2;
+  optional int64 field7957 = 3;
+  optional int64 field7958 = 9;
+  repeated .benchmarks.google_message4.UnusedEmptyMessage field7959 = 10;
+  repeated bytes field7960 = 11;
+  optional int64 field7961 = 16;
+}
+
diff --git a/benchmarks/datasets/google_message4/benchmark_message4_2.proto b/benchmarks/datasets/google_message4/benchmark_message4_2.proto
new file mode 100644
index 0000000..d5e9da5
--- /dev/null
+++ b/benchmarks/datasets/google_message4/benchmark_message4_2.proto
@@ -0,0 +1,292 @@
+syntax = "proto2";
+
+import "datasets/google_message4/benchmark_message4_3.proto";
+package benchmarks.google_message4;
+
+option cc_enable_arenas = true;
+option java_package = "com.google.protobuf.benchmarks";
+
+message Message12774 {
+  optional uint32 field12777 = 1;
+  optional uint32 field12778 = 2;
+  optional uint32 field12779 = 3;
+  optional uint32 field12780 = 4;
+  optional uint32 field12781 = 5;
+  optional bool field12782 = 6;
+}
+
+message Message12796 {
+  repeated fixed64 field12800 = 1;
+  optional uint64 field12801 = 2;
+}
+
+message Message12821 {
+  optional int32 field12848 = 1;
+  optional int32 field12849 = 2;
+  optional int32 field12850 = 3;
+  optional int32 field12851 = 4;
+  optional int32 field12852 = 5;
+}
+
+message Message12820 {
+  optional int32 field12840 = 1;
+  optional int32 field12841 = 2;
+  optional int32 field12842 = 3;
+  optional int32 field12843 = 8;
+  optional int32 field12844 = 4;
+  optional int32 field12845 = 5;
+  optional int32 field12846 = 6;
+  optional int32 field12847 = 7;
+}
+
+message Message12819 {
+  optional double field12834 = 1;
+  optional double field12835 = 2;
+  optional double field12836 = 3;
+  optional double field12837 = 4;
+  optional double field12838 = 5;
+  optional double field12839 = 6;
+}
+
+message Message12818 {
+  optional uint64 field12829 = 1;
+  optional int32 field12830 = 2;
+  optional int32 field12831 = 3;
+  optional int32 field12832 = 5;
+  repeated .benchmarks.google_message4.Message12817 field12833 = 4;
+}
+
+message Message10319 {
+  optional .benchmarks.google_message4.Enum10325 field10340 = 1;
+  optional int32 field10341 = 4;
+  optional int32 field10342 = 5;
+  optional bytes field10343 = 3;
+  optional string field10344 = 2;
+  optional string field10345 = 6;
+  optional string field10346 = 7;
+}
+
+message Message6578 {
+  optional .benchmarks.google_message4.Enum6579 field6632 = 1;
+  optional .benchmarks.google_message4.Enum6588 field6633 = 2;
+}
+
+message Message6126 {
+  required string field6152 = 1;
+  repeated .benchmarks.google_message4.Message6127 field6153 = 9;
+  optional int32 field6154 = 14;
+  optional bytes field6155 = 10;
+  optional .benchmarks.google_message4.Message6024 field6156 = 12;
+  optional int32 field6157 = 4;
+  optional string field6158 = 5;
+  optional int32 field6159 = 6;
+  repeated int32 field6160 = 2;
+  repeated int32 field6161 = 3;
+  repeated .benchmarks.google_message4.Message6052 field6162 = 7;
+  repeated .benchmarks.google_message4.UnusedEmptyMessage field6163 = 11;
+  optional .benchmarks.google_message4.Enum6065 field6164 = 15;
+  repeated .benchmarks.google_message4.Message6127 field6165 = 8;
+  optional bool field6166 = 13;
+  optional bool field6167 = 16;
+  optional bool field6168 = 18;
+  repeated .benchmarks.google_message4.Message6054 field6169 = 17;
+  optional int32 field6170 = 19;
+}
+
+message Message5881 {
+  required double field5897 = 1;
+  optional string field5898 = 5;
+  optional .benchmarks.google_message4.Message5861 field5899 = 2;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field5900 = 3;
+  optional .benchmarks.google_message4.Message5867 field5901 = 4;
+  optional .benchmarks.google_message4.Message5880 field5902 = 6;
+}
+
+message Message6110 {
+}
+
+message Message6107 {
+  optional .benchmarks.google_message4.Message4016 field6134 = 1;
+  optional int32 field6135 = 2;
+  optional string field6136 = 3;
+  repeated int32 field6137 = 4;
+  optional int32 field6138 = 5;
+  repeated .benchmarks.google_message4.Message6108 field6139 = 6;
+}
+
+message Message6129 {
+  required .benchmarks.google_message4.Enum6130 field6171 = 1;
+  required string field6172 = 2;
+}
+
+message Message5908 {
+  optional string field5971 = 1;
+  optional int32 field5972 = 2;
+  optional int32 field5973 = 3;
+  optional .benchmarks.google_message4.Enum5909 field5974 = 45;
+  optional .benchmarks.google_message4.Enum5912 field5975 = 4;
+  optional fixed32 field5976 = 50;
+  optional fixed32 field5977 = 5;
+  optional fixed32 field5978 = 6;
+  optional string field5979 = 7;
+  optional .benchmarks.google_message4.Enum5915 field5980 = 8;
+  optional .benchmarks.google_message4.Message5903 field5981 = 9;
+  optional .benchmarks.google_message4.Message5903 field5982 = 10;
+  optional .benchmarks.google_message4.Enum5920 field5983 = 11;
+  optional .benchmarks.google_message4.Enum5923 field5984 = 40;
+  optional .benchmarks.google_message4.Message5903 field5985 = 41;
+  optional .benchmarks.google_message4.Message5903 field5986 = 42;
+  optional .benchmarks.google_message4.Enum5928 field5987 = 47;
+  optional bool field5988 = 48;
+  repeated fixed32 field5989 = 49;
+  optional string field5990 = 12;
+  optional .benchmarks.google_message4.Message5903 field5991 = 13;
+  optional .benchmarks.google_message4.Message5903 field5992 = 14;
+  optional .benchmarks.google_message4.Message5903 field5993 = 15;
+  optional .benchmarks.google_message4.Message5903 field5994 = 16;
+  optional .benchmarks.google_message4.Message5903 field5995 = 32;
+  optional .benchmarks.google_message4.Message5903 field5996 = 33;
+  optional .benchmarks.google_message4.Message5903 field5997 = 34;
+  optional .benchmarks.google_message4.Message5903 field5998 = 35;
+  optional .benchmarks.google_message4.Enum5931 field5999 = 17;
+  optional .benchmarks.google_message4.Enum5935 field6000 = 18;
+  optional .benchmarks.google_message4.Enum5939 field6001 = 36;
+  optional .benchmarks.google_message4.Enum5939 field6002 = 37;
+  repeated int32 field6003 = 19;
+  optional uint32 field6004 = 20;
+  optional uint32 field6005 = 21;
+  optional uint32 field6006 = 22;
+  optional uint32 field6007 = 23;
+  optional .benchmarks.google_message4.Enum5946 field6008 = 24;
+  optional .benchmarks.google_message4.Enum5946 field6009 = 25;
+  optional .benchmarks.google_message4.Enum5946 field6010 = 26;
+  optional .benchmarks.google_message4.Enum5946 field6011 = 27;
+  optional fixed32 field6012 = 28;
+  optional fixed32 field6013 = 29;
+  optional fixed32 field6014 = 30;
+  optional fixed32 field6015 = 31;
+  optional int32 field6016 = 38;
+  optional float field6017 = 39;
+  optional .benchmarks.google_message4.Enum5957 field6018 = 43;
+  optional .benchmarks.google_message4.Message5907 field6019 = 44;
+  optional .benchmarks.google_message4.Enum5962 field6020 = 46;
+}
+
+message Message3850 {
+  optional .benchmarks.google_message4.Enum3851 field3924 = 2;
+  optional bool field3925 = 12;
+  optional int32 field3926 = 4;
+  optional bool field3927 = 10;
+  optional bool field3928 = 13;
+  optional bool field3929 = 14;
+}
+
+message Message7865 {
+}
+
+message Message7511 {
+  optional bool field7523 = 1;
+  optional .benchmarks.google_message4.Enum7512 field7524 = 2;
+  optional int32 field7525 = 3;
+  optional int32 field7526 = 4;
+  optional bool field7527 = 5;
+  optional int32 field7528 = 6;
+  optional int32 field7529 = 7;
+}
+
+message Message3920 {
+}
+
+message Message7928 {
+  optional string field7940 = 1;
+  optional int64 field7941 = 2;
+}
+
+message Message7921 {
+  optional int32 field7936 = 1;
+  optional int64 field7937 = 2;
+  optional float field7938 = 3;
+  optional .benchmarks.google_message4.Enum7922 field7939 = 4;
+}
+
+message Message7920 {
+  optional int64 field7934 = 1;
+  optional int64 field7935 = 2;
+}
+
+message Message7919 {
+  optional fixed64 field7931 = 1;
+  optional int64 field7932 = 2;
+  optional bytes field7933 = 3;
+}
+
+message Message12817 {
+  optional int32 field12826 = 1;
+  optional int32 field12827 = 2;
+  optional int32 field12828 = 3;
+}
+
+message Message6054 {
+  required string field6089 = 1;
+  optional string field6090 = 2;
+}
+
+message Message6127 {
+}
+
+message Message6052 {
+  required string field6084 = 1;
+  required bytes field6085 = 2;
+}
+
+message Message6024 {
+  optional .benchmarks.google_message4.Enum6025 field6048 = 1;
+  optional string field6049 = 2;
+  optional .benchmarks.google_message4.UnusedEmptyMessage field6050 = 3;
+}
+
+message Message5861 {
+  required .benchmarks.google_message4.Enum5862 field5882 = 1;
+  required string field5883 = 2;
+  optional bool field5884 = 3;
+  optional string field5885 = 4;
+}
+
+message Message5880 {
+  optional string field5896 = 1;
+}
+
+message Message5867 {
+  optional .benchmarks.google_message4.Enum5868 field5890 = 1;
+  optional string field5891 = 2;
+  optional .benchmarks.google_message4.Enum5873 field5892 = 3;
+  optional int32 field5893 = 4;
+  optional .benchmarks.google_message4.UnusedEnum field5894 = 5;
+  optional bool field5895 = 6;
+}
+
+message Message4016 {
+  required int32 field4017 = 1;
+  required int32 field4018 = 2;
+  required int32 field4019 = 3;
+  required int32 field4020 = 4;
+}
+
+message Message6108 {
+}
+
+message Message5907 {
+  optional .benchmarks.google_message4.Message5903 field5967 = 1;
+  optional .benchmarks.google_message4.Message5903 field5968 = 2;
+  optional .benchmarks.google_message4.Message5903 field5969 = 3;
+  optional .benchmarks.google_message4.Message5903 field5970 = 4;
+}
+
+message UnusedEmptyMessage {
+}
+
+message Message5903 {
+  required int32 field5965 = 1;
+  optional .benchmarks.google_message4.Enum5904 field5966 = 2;
+}
+
diff --git a/benchmarks/datasets/google_message4/benchmark_message4_3.proto b/benchmarks/datasets/google_message4/benchmark_message4_3.proto
new file mode 100644
index 0000000..544fad2
--- /dev/null
+++ b/benchmarks/datasets/google_message4/benchmark_message4_3.proto
@@ -0,0 +1,751 @@
+syntax = "proto2";
+
+package benchmarks.google_message4;
+
+option cc_enable_arenas = true;
+option java_package = "com.google.protobuf.benchmarks";
+
+enum UnusedEnum {
+  UNUSED_ENUM_VALUE1 = 0;
+  UNUSED_ENUM_VALUE2 = 1;
+}
+
+enum Enum2593 {
+  ENUM_VALUE2594 = 0;
+  ENUM_VALUE2595 = 1;
+  ENUM_VALUE2596 = 2;
+  ENUM_VALUE2597 = 3;
+  ENUM_VALUE2598 = 4;
+  ENUM_VALUE2599 = 5;
+  ENUM_VALUE2600 = 6;
+  ENUM_VALUE2601 = 7;
+}
+
+enum Enum2834 {
+  ENUM_VALUE2835 = 0;
+  ENUM_VALUE2836 = 1;
+  ENUM_VALUE2837 = 2;
+}
+
+enum Enum2806 {
+  ENUM_VALUE2807 = 0;
+  ENUM_VALUE2808 = 1;
+  ENUM_VALUE2809 = 2;
+  ENUM_VALUE2810 = 3;
+  ENUM_VALUE2811 = 4;
+  ENUM_VALUE2812 = 5;
+  ENUM_VALUE2813 = 6;
+  ENUM_VALUE2814 = 7;
+  ENUM_VALUE2815 = 8;
+  ENUM_VALUE2816 = 9;
+  ENUM_VALUE2817 = 10;
+  ENUM_VALUE2818 = 11;
+  ENUM_VALUE2819 = 12;
+  ENUM_VALUE2820 = 13;
+  ENUM_VALUE2821 = 14;
+}
+
+enum Enum2851 {
+  option allow_alias = true;
+  ENUM_VALUE2852 = 0;
+  ENUM_VALUE2853 = 0;
+  ENUM_VALUE2854 = 1;
+  ENUM_VALUE2855 = 2;
+  ENUM_VALUE2856 = 3;
+  ENUM_VALUE2857 = 4;
+  ENUM_VALUE2858 = 5;
+  ENUM_VALUE2859 = 6;
+  ENUM_VALUE2860 = 7;
+  ENUM_VALUE2861 = 8;
+  ENUM_VALUE2862 = 9;
+  ENUM_VALUE2863 = 10;
+  ENUM_VALUE2864 = 11;
+  ENUM_VALUE2865 = 12;
+  ENUM_VALUE2866 = 13;
+  ENUM_VALUE2867 = 14;
+  ENUM_VALUE2868 = 15;
+  ENUM_VALUE2869 = 16;
+  ENUM_VALUE2870 = 17;
+  ENUM_VALUE2871 = 18;
+  ENUM_VALUE2872 = 19;
+  ENUM_VALUE2873 = 20;
+  ENUM_VALUE2874 = 21;
+  ENUM_VALUE2875 = 22;
+  ENUM_VALUE2876 = 23;
+  ENUM_VALUE2877 = 24;
+  ENUM_VALUE2878 = 25;
+  ENUM_VALUE2879 = 26;
+  ENUM_VALUE2880 = 27;
+  ENUM_VALUE2881 = 28;
+  ENUM_VALUE2882 = 29;
+  ENUM_VALUE2883 = 30;
+  ENUM_VALUE2884 = 31;
+  ENUM_VALUE2885 = 32;
+  ENUM_VALUE2886 = 33;
+  ENUM_VALUE2887 = 34;
+  ENUM_VALUE2888 = 35;
+  ENUM_VALUE2889 = 36;
+  ENUM_VALUE2890 = 37;
+  ENUM_VALUE2891 = 38;
+  ENUM_VALUE2892 = 39;
+  ENUM_VALUE2893 = 40;
+  ENUM_VALUE2894 = 41;
+  ENUM_VALUE2895 = 42;
+  ENUM_VALUE2896 = 43;
+  ENUM_VALUE2897 = 44;
+  ENUM_VALUE2898 = 45;
+  ENUM_VALUE2899 = 46;
+  ENUM_VALUE2900 = 47;
+  ENUM_VALUE2901 = 48;
+  ENUM_VALUE2902 = 49;
+  ENUM_VALUE2903 = 50;
+  ENUM_VALUE2904 = 51;
+  ENUM_VALUE2905 = 52;
+  ENUM_VALUE2906 = 53;
+  ENUM_VALUE2907 = 54;
+  ENUM_VALUE2908 = 55;
+  ENUM_VALUE2909 = 56;
+  ENUM_VALUE2910 = 57;
+  ENUM_VALUE2911 = 58;
+  ENUM_VALUE2912 = 59;
+  ENUM_VALUE2913 = 60;
+  ENUM_VALUE2914 = 61;
+  ENUM_VALUE2915 = 62;
+  ENUM_VALUE2916 = 63;
+  ENUM_VALUE2917 = 64;
+  ENUM_VALUE2918 = 65;
+  ENUM_VALUE2919 = 66;
+  ENUM_VALUE2920 = 67;
+  ENUM_VALUE2921 = 68;
+  ENUM_VALUE2922 = 69;
+  ENUM_VALUE2923 = 70;
+  ENUM_VALUE2924 = 71;
+  ENUM_VALUE2925 = 72;
+  ENUM_VALUE2926 = 73;
+  ENUM_VALUE2927 = 74;
+  ENUM_VALUE2928 = 75;
+  ENUM_VALUE2929 = 76;
+  ENUM_VALUE2930 = 77;
+  ENUM_VALUE2931 = 78;
+  ENUM_VALUE2932 = 79;
+  ENUM_VALUE2933 = 80;
+  ENUM_VALUE2934 = 81;
+  ENUM_VALUE2935 = 82;
+  ENUM_VALUE2936 = 83;
+  ENUM_VALUE2937 = 84;
+  ENUM_VALUE2938 = 85;
+  ENUM_VALUE2939 = 86;
+  ENUM_VALUE2940 = 87;
+  ENUM_VALUE2941 = 88;
+  ENUM_VALUE2942 = 89;
+  ENUM_VALUE2943 = 90;
+  ENUM_VALUE2944 = 91;
+  ENUM_VALUE2945 = 92;
+  ENUM_VALUE2946 = 93;
+  ENUM_VALUE2947 = 94;
+  ENUM_VALUE2948 = 95;
+  ENUM_VALUE2949 = 96;
+  ENUM_VALUE2950 = 97;
+  ENUM_VALUE2951 = 98;
+  ENUM_VALUE2952 = 99;
+  ENUM_VALUE2953 = 100;
+  ENUM_VALUE2954 = 101;
+  ENUM_VALUE2955 = 102;
+  ENUM_VALUE2956 = 103;
+  ENUM_VALUE2957 = 104;
+  ENUM_VALUE2958 = 105;
+  ENUM_VALUE2959 = 106;
+  ENUM_VALUE2960 = 107;
+  ENUM_VALUE2961 = 108;
+  ENUM_VALUE2962 = 109;
+  ENUM_VALUE2963 = 110;
+  ENUM_VALUE2964 = 111;
+  ENUM_VALUE2965 = 112;
+  ENUM_VALUE2966 = 113;
+  ENUM_VALUE2967 = 114;
+  ENUM_VALUE2968 = 115;
+  ENUM_VALUE2969 = 116;
+  ENUM_VALUE2970 = 117;
+  ENUM_VALUE2971 = 118;
+  ENUM_VALUE2972 = 119;
+}
+
+enum Enum2602 {
+  ENUM_VALUE2603 = 0;
+  ENUM_VALUE2604 = 1;
+  ENUM_VALUE2605 = 2;
+  ENUM_VALUE2606 = 3;
+  ENUM_VALUE2607 = 4;
+  ENUM_VALUE2608 = 5;
+  ENUM_VALUE2609 = 6;
+  ENUM_VALUE2610 = 7;
+  ENUM_VALUE2611 = 8;
+  ENUM_VALUE2612 = 9;
+  ENUM_VALUE2613 = 10;
+  ENUM_VALUE2614 = 11;
+}
+
+enum Enum3071 {
+  ENUM_VALUE3072 = 1;
+  ENUM_VALUE3073 = 2;
+  ENUM_VALUE3074 = 3;
+  ENUM_VALUE3075 = 4;
+  ENUM_VALUE3076 = 5;
+  ENUM_VALUE3077 = 6;
+  ENUM_VALUE3078 = 7;
+  ENUM_VALUE3079 = 8;
+  ENUM_VALUE3080 = 9;
+  ENUM_VALUE3081 = 10;
+  ENUM_VALUE3082 = 11;
+  ENUM_VALUE3083 = 12;
+  ENUM_VALUE3084 = 13;
+  ENUM_VALUE3085 = 14;
+  ENUM_VALUE3086 = 15;
+  ENUM_VALUE3087 = 16;
+  ENUM_VALUE3088 = 17;
+  ENUM_VALUE3089 = 18;
+  ENUM_VALUE3090 = 19;
+  ENUM_VALUE3091 = 20;
+  ENUM_VALUE3092 = 21;
+  ENUM_VALUE3093 = 22;
+  ENUM_VALUE3094 = 23;
+  ENUM_VALUE3095 = 24;
+  ENUM_VALUE3096 = 25;
+  ENUM_VALUE3097 = 26;
+  ENUM_VALUE3098 = 27;
+  ENUM_VALUE3099 = 28;
+}
+
+enum Enum3805 {
+  ENUM_VALUE3806 = 0;
+  ENUM_VALUE3807 = 1;
+  ENUM_VALUE3808 = 2;
+  ENUM_VALUE3809 = 3;
+  ENUM_VALUE3810 = 4;
+  ENUM_VALUE3811 = 5;
+  ENUM_VALUE3812 = 6;
+  ENUM_VALUE3813 = 7;
+  ENUM_VALUE3814 = 8;
+  ENUM_VALUE3815 = 9;
+  ENUM_VALUE3816 = 11;
+  ENUM_VALUE3817 = 10;
+}
+
+enum Enum3783 {
+  ENUM_VALUE3784 = 0;
+  ENUM_VALUE3785 = 1;
+  ENUM_VALUE3786 = 2;
+  ENUM_VALUE3787 = 3;
+  ENUM_VALUE3788 = 4;
+  ENUM_VALUE3789 = 5;
+  ENUM_VALUE3790 = 6;
+  ENUM_VALUE3791 = 7;
+  ENUM_VALUE3792 = 8;
+  ENUM_VALUE3793 = 9;
+  ENUM_VALUE3794 = 10;
+  ENUM_VALUE3795 = 11;
+  ENUM_VALUE3796 = 12;
+  ENUM_VALUE3797 = 13;
+  ENUM_VALUE3798 = 14;
+  ENUM_VALUE3799 = 15;
+  ENUM_VALUE3800 = 16;
+  ENUM_VALUE3801 = 20;
+  ENUM_VALUE3802 = 21;
+  ENUM_VALUE3803 = 50;
+}
+
+enum Enum3851 {
+  ENUM_VALUE3852 = 0;
+  ENUM_VALUE3853 = 1;
+  ENUM_VALUE3854 = 2;
+  ENUM_VALUE3855 = 3;
+  ENUM_VALUE3856 = 4;
+  ENUM_VALUE3857 = 5;
+  ENUM_VALUE3858 = 6;
+  ENUM_VALUE3859 = 7;
+  ENUM_VALUE3860 = 8;
+  ENUM_VALUE3861 = 9;
+  ENUM_VALUE3862 = 10;
+  ENUM_VALUE3863 = 11;
+  ENUM_VALUE3864 = 12;
+  ENUM_VALUE3865 = 13;
+  ENUM_VALUE3866 = 14;
+  ENUM_VALUE3867 = 15;
+  ENUM_VALUE3868 = 16;
+  ENUM_VALUE3869 = 17;
+}
+
+enum Enum5862 {
+  ENUM_VALUE5863 = 1;
+  ENUM_VALUE5864 = 2;
+  ENUM_VALUE5865 = 3;
+}
+
+enum Enum5868 {
+  ENUM_VALUE5869 = 0;
+  ENUM_VALUE5870 = 1;
+  ENUM_VALUE5871 = 2;
+  ENUM_VALUE5872 = 3;
+}
+
+enum Enum5873 {
+  ENUM_VALUE5874 = 0;
+  ENUM_VALUE5875 = 1;
+  ENUM_VALUE5876 = 2;
+}
+
+enum Enum5904 {
+  ENUM_VALUE5905 = 0;
+  ENUM_VALUE5906 = 1;
+}
+
+enum Enum5909 {
+  ENUM_VALUE5910 = 0;
+  ENUM_VALUE5911 = 1;
+}
+
+enum Enum5912 {
+  ENUM_VALUE5913 = 0;
+  ENUM_VALUE5914 = 1;
+}
+
+enum Enum5915 {
+  ENUM_VALUE5916 = 0;
+  ENUM_VALUE5917 = 1;
+  ENUM_VALUE5918 = 2;
+  ENUM_VALUE5919 = 3;
+}
+
+enum Enum5920 {
+  ENUM_VALUE5921 = 0;
+  ENUM_VALUE5922 = 1;
+}
+
+enum Enum5923 {
+  ENUM_VALUE5924 = 0;
+  ENUM_VALUE5925 = 1;
+  ENUM_VALUE5926 = 2;
+  ENUM_VALUE5927 = 3;
+}
+
+enum Enum5928 {
+  ENUM_VALUE5929 = 0;
+  ENUM_VALUE5930 = 1;
+}
+
+enum Enum5931 {
+  ENUM_VALUE5932 = 0;
+  ENUM_VALUE5933 = 1;
+  ENUM_VALUE5934 = 2;
+}
+
+enum Enum5935 {
+  ENUM_VALUE5936 = 0;
+  ENUM_VALUE5937 = 1;
+  ENUM_VALUE5938 = 2;
+}
+
+enum Enum5939 {
+  ENUM_VALUE5940 = 0;
+  ENUM_VALUE5941 = 1;
+  ENUM_VALUE5942 = 2;
+  ENUM_VALUE5943 = 3;
+  ENUM_VALUE5944 = 4;
+  ENUM_VALUE5945 = 5;
+}
+
+enum Enum5946 {
+  ENUM_VALUE5947 = 0;
+  ENUM_VALUE5948 = 1;
+  ENUM_VALUE5949 = 2;
+  ENUM_VALUE5950 = 3;
+  ENUM_VALUE5951 = 4;
+  ENUM_VALUE5952 = 5;
+  ENUM_VALUE5953 = 6;
+  ENUM_VALUE5954 = 7;
+  ENUM_VALUE5955 = 8;
+  ENUM_VALUE5956 = 9;
+}
+
+enum Enum5957 {
+  ENUM_VALUE5958 = 0;
+  ENUM_VALUE5959 = 1;
+  ENUM_VALUE5960 = 2;
+  ENUM_VALUE5961 = 3;
+}
+
+enum Enum5962 {
+  ENUM_VALUE5963 = 0;
+  ENUM_VALUE5964 = 1;
+}
+
+enum Enum6025 {
+  ENUM_VALUE6026 = 0;
+  ENUM_VALUE6027 = 1;
+  ENUM_VALUE6028 = 2;
+  ENUM_VALUE6029 = 3;
+  ENUM_VALUE6030 = 4;
+  ENUM_VALUE6031 = 5;
+  ENUM_VALUE6032 = 6;
+  ENUM_VALUE6033 = 7;
+  ENUM_VALUE6034 = 8;
+  ENUM_VALUE6035 = 9;
+  ENUM_VALUE6036 = 10;
+  ENUM_VALUE6037 = 11;
+  ENUM_VALUE6038 = 12;
+  ENUM_VALUE6039 = 13;
+  ENUM_VALUE6040 = 14;
+  ENUM_VALUE6041 = 15;
+  ENUM_VALUE6042 = 16;
+  ENUM_VALUE6043 = 17;
+  ENUM_VALUE6044 = 18;
+  ENUM_VALUE6045 = 19;
+  ENUM_VALUE6046 = 20;
+  ENUM_VALUE6047 = 21;
+}
+
+enum Enum6111 {
+  ENUM_VALUE6112 = 1;
+  ENUM_VALUE6113 = 2;
+  ENUM_VALUE6114 = 3;
+  ENUM_VALUE6115 = 4;
+  ENUM_VALUE6116 = 5;
+  ENUM_VALUE6117 = 6;
+  ENUM_VALUE6118 = 7;
+  ENUM_VALUE6119 = 8;
+  ENUM_VALUE6120 = 9;
+  ENUM_VALUE6121 = 10;
+  ENUM_VALUE6122 = 11;
+  ENUM_VALUE6123 = 12;
+  ENUM_VALUE6124 = 13;
+  ENUM_VALUE6125 = 14;
+}
+
+enum Enum6065 {
+  ENUM_VALUE6066 = 0;
+  ENUM_VALUE6067 = 1;
+  ENUM_VALUE6068 = 2;
+  ENUM_VALUE6069 = 3;
+  ENUM_VALUE6070 = 4;
+  ENUM_VALUE6071 = 5;
+  ENUM_VALUE6072 = 6;
+  ENUM_VALUE6073 = 7;
+  ENUM_VALUE6074 = 8;
+  ENUM_VALUE6075 = 9;
+  ENUM_VALUE6076 = 10;
+  ENUM_VALUE6077 = 11;
+  ENUM_VALUE6078 = 12;
+  ENUM_VALUE6079 = 13;
+  ENUM_VALUE6080 = 14;
+}
+
+enum Enum6130 {
+  ENUM_VALUE6131 = 0;
+  ENUM_VALUE6132 = 1;
+}
+
+enum Enum6579 {
+  ENUM_VALUE6580 = 0;
+  ENUM_VALUE6581 = 2;
+  ENUM_VALUE6582 = 3;
+  ENUM_VALUE6583 = 5;
+  ENUM_VALUE6584 = 10;
+  ENUM_VALUE6585 = 15;
+  ENUM_VALUE6586 = 25;
+  ENUM_VALUE6587 = 30;
+}
+
+enum Enum6588 {
+  ENUM_VALUE6589 = 0;
+  ENUM_VALUE6590 = 1;
+  ENUM_VALUE6591 = 2;
+  ENUM_VALUE6592 = 3;
+  ENUM_VALUE6593 = 4;
+  ENUM_VALUE6594 = 5;
+  ENUM_VALUE6595 = 6;
+  ENUM_VALUE6596 = 7;
+  ENUM_VALUE6597 = 8;
+  ENUM_VALUE6598 = 9;
+  ENUM_VALUE6599 = 10;
+  ENUM_VALUE6600 = 11;
+  ENUM_VALUE6601 = 12;
+  ENUM_VALUE6602 = 13;
+  ENUM_VALUE6603 = 14;
+  ENUM_VALUE6604 = 15;
+  ENUM_VALUE6605 = 16;
+  ENUM_VALUE6606 = 17;
+  ENUM_VALUE6607 = 19;
+  ENUM_VALUE6608 = 20;
+  ENUM_VALUE6609 = 21;
+  ENUM_VALUE6610 = 22;
+  ENUM_VALUE6611 = 23;
+  ENUM_VALUE6612 = 24;
+  ENUM_VALUE6613 = 25;
+  ENUM_VALUE6614 = 26;
+  ENUM_VALUE6615 = 27;
+  ENUM_VALUE6616 = 28;
+  ENUM_VALUE6617 = 29;
+  ENUM_VALUE6618 = 30;
+  ENUM_VALUE6619 = 31;
+  ENUM_VALUE6620 = 32;
+  ENUM_VALUE6621 = 33;
+  ENUM_VALUE6622 = 34;
+}
+
+enum Enum7288 {
+  ENUM_VALUE7289 = 0;
+  ENUM_VALUE7290 = 1;
+  ENUM_VALUE7291 = 2;
+  ENUM_VALUE7292 = 3;
+}
+
+enum Enum7512 {
+  ENUM_VALUE7513 = 0;
+  ENUM_VALUE7514 = 1;
+  ENUM_VALUE7515 = 2;
+  ENUM_VALUE7516 = 3;
+  ENUM_VALUE7517 = 4;
+  ENUM_VALUE7518 = 5;
+  ENUM_VALUE7519 = 6;
+  ENUM_VALUE7520 = 7;
+}
+
+enum Enum7922 {
+  ENUM_VALUE7923 = 1;
+  ENUM_VALUE7924 = 2;
+  ENUM_VALUE7925 = 3;
+  ENUM_VALUE7926 = 4;
+  ENUM_VALUE7927 = 5;
+}
+
+enum Enum3476 {
+  ENUM_VALUE3477 = 0;
+  ENUM_VALUE3478 = 1;
+  ENUM_VALUE3479 = 2;
+  ENUM_VALUE3480 = 3;
+  ENUM_VALUE3481 = 4;
+  ENUM_VALUE3482 = 5;
+  ENUM_VALUE3483 = 6;
+  ENUM_VALUE3484 = 7;
+  ENUM_VALUE3485 = 8;
+  ENUM_VALUE3486 = 9;
+  ENUM_VALUE3487 = 10;
+  ENUM_VALUE3488 = 11;
+  ENUM_VALUE3489 = 12;
+  ENUM_VALUE3490 = 13;
+  ENUM_VALUE3491 = 14;
+  ENUM_VALUE3492 = 15;
+  ENUM_VALUE3493 = 16;
+  ENUM_VALUE3494 = 17;
+  ENUM_VALUE3495 = 18;
+  ENUM_VALUE3496 = 19;
+  ENUM_VALUE3497 = 20;
+  ENUM_VALUE3498 = 21;
+  ENUM_VALUE3499 = 22;
+  ENUM_VALUE3500 = 23;
+  ENUM_VALUE3501 = 24;
+  ENUM_VALUE3502 = 25;
+  ENUM_VALUE3503 = 26;
+  ENUM_VALUE3504 = 27;
+  ENUM_VALUE3505 = 28;
+  ENUM_VALUE3506 = 29;
+  ENUM_VALUE3507 = 30;
+  ENUM_VALUE3508 = 31;
+  ENUM_VALUE3509 = 32;
+  ENUM_VALUE3510 = 33;
+  ENUM_VALUE3511 = 34;
+  ENUM_VALUE3512 = 35;
+  ENUM_VALUE3513 = 36;
+  ENUM_VALUE3514 = 37;
+  ENUM_VALUE3515 = 38;
+  ENUM_VALUE3516 = 39;
+  ENUM_VALUE3517 = 40;
+  ENUM_VALUE3518 = 41;
+  ENUM_VALUE3519 = 42;
+  ENUM_VALUE3520 = 43;
+  ENUM_VALUE3521 = 44;
+  ENUM_VALUE3522 = 45;
+  ENUM_VALUE3523 = 46;
+  ENUM_VALUE3524 = 47;
+  ENUM_VALUE3525 = 48;
+  ENUM_VALUE3526 = 49;
+  ENUM_VALUE3527 = 50;
+  ENUM_VALUE3528 = 51;
+  ENUM_VALUE3529 = 52;
+  ENUM_VALUE3530 = 53;
+  ENUM_VALUE3531 = 54;
+  ENUM_VALUE3532 = 55;
+  ENUM_VALUE3533 = 56;
+  ENUM_VALUE3534 = 57;
+  ENUM_VALUE3535 = 58;
+  ENUM_VALUE3536 = 59;
+  ENUM_VALUE3537 = 60;
+  ENUM_VALUE3538 = 61;
+  ENUM_VALUE3539 = 62;
+  ENUM_VALUE3540 = 63;
+  ENUM_VALUE3541 = 64;
+  ENUM_VALUE3542 = 65;
+  ENUM_VALUE3543 = 66;
+  ENUM_VALUE3544 = 67;
+  ENUM_VALUE3545 = 68;
+  ENUM_VALUE3546 = 69;
+  ENUM_VALUE3547 = 70;
+  ENUM_VALUE3548 = 71;
+  ENUM_VALUE3549 = 72;
+  ENUM_VALUE3550 = 73;
+  ENUM_VALUE3551 = 74;
+  ENUM_VALUE3552 = 75;
+  ENUM_VALUE3553 = 76;
+  ENUM_VALUE3554 = 77;
+  ENUM_VALUE3555 = 78;
+  ENUM_VALUE3556 = 79;
+  ENUM_VALUE3557 = 80;
+  ENUM_VALUE3558 = 81;
+  ENUM_VALUE3559 = 82;
+  ENUM_VALUE3560 = 83;
+  ENUM_VALUE3561 = 84;
+  ENUM_VALUE3562 = 85;
+  ENUM_VALUE3563 = 86;
+  ENUM_VALUE3564 = 87;
+  ENUM_VALUE3565 = 88;
+  ENUM_VALUE3566 = 89;
+  ENUM_VALUE3567 = 90;
+  ENUM_VALUE3568 = 91;
+  ENUM_VALUE3569 = 92;
+  ENUM_VALUE3570 = 93;
+  ENUM_VALUE3571 = 94;
+  ENUM_VALUE3572 = 95;
+  ENUM_VALUE3573 = 96;
+  ENUM_VALUE3574 = 97;
+  ENUM_VALUE3575 = 98;
+  ENUM_VALUE3576 = 99;
+  ENUM_VALUE3577 = 100;
+  ENUM_VALUE3578 = 101;
+  ENUM_VALUE3579 = 102;
+  ENUM_VALUE3580 = 103;
+  ENUM_VALUE3581 = 104;
+  ENUM_VALUE3582 = 105;
+  ENUM_VALUE3583 = 106;
+  ENUM_VALUE3584 = 107;
+  ENUM_VALUE3585 = 108;
+  ENUM_VALUE3586 = 109;
+  ENUM_VALUE3587 = 110;
+  ENUM_VALUE3588 = 111;
+  ENUM_VALUE3589 = 112;
+  ENUM_VALUE3590 = 113;
+  ENUM_VALUE3591 = 114;
+  ENUM_VALUE3592 = 115;
+  ENUM_VALUE3593 = 116;
+  ENUM_VALUE3594 = 117;
+  ENUM_VALUE3595 = 118;
+  ENUM_VALUE3596 = 119;
+  ENUM_VALUE3597 = 120;
+  ENUM_VALUE3598 = 121;
+  ENUM_VALUE3599 = 122;
+  ENUM_VALUE3600 = 123;
+  ENUM_VALUE3601 = 124;
+  ENUM_VALUE3602 = 125;
+  ENUM_VALUE3603 = 126;
+  ENUM_VALUE3604 = 127;
+  ENUM_VALUE3605 = 128;
+  ENUM_VALUE3606 = 129;
+  ENUM_VALUE3607 = 130;
+  ENUM_VALUE3608 = 131;
+  ENUM_VALUE3609 = 132;
+  ENUM_VALUE3610 = 133;
+  ENUM_VALUE3611 = 134;
+  ENUM_VALUE3612 = 135;
+  ENUM_VALUE3613 = 136;
+  ENUM_VALUE3614 = 137;
+  ENUM_VALUE3615 = 138;
+  ENUM_VALUE3616 = 139;
+  ENUM_VALUE3617 = 140;
+  ENUM_VALUE3618 = 141;
+  ENUM_VALUE3619 = 142;
+  ENUM_VALUE3620 = 143;
+  ENUM_VALUE3621 = 144;
+  ENUM_VALUE3622 = 145;
+  ENUM_VALUE3623 = 146;
+  ENUM_VALUE3624 = 147;
+  ENUM_VALUE3625 = 148;
+  ENUM_VALUE3626 = 149;
+  ENUM_VALUE3627 = 150;
+  ENUM_VALUE3628 = 151;
+  ENUM_VALUE3629 = 152;
+  ENUM_VALUE3630 = 153;
+  ENUM_VALUE3631 = 154;
+  ENUM_VALUE3632 = 155;
+  ENUM_VALUE3633 = 156;
+  ENUM_VALUE3634 = 157;
+  ENUM_VALUE3635 = 158;
+  ENUM_VALUE3636 = 159;
+  ENUM_VALUE3637 = 160;
+  ENUM_VALUE3638 = 161;
+  ENUM_VALUE3639 = 162;
+  ENUM_VALUE3640 = 163;
+  ENUM_VALUE3641 = 164;
+  ENUM_VALUE3642 = 165;
+  ENUM_VALUE3643 = 166;
+  ENUM_VALUE3644 = 167;
+  ENUM_VALUE3645 = 168;
+  ENUM_VALUE3646 = 169;
+  ENUM_VALUE3647 = 170;
+  ENUM_VALUE3648 = 171;
+  ENUM_VALUE3649 = 172;
+  ENUM_VALUE3650 = 173;
+  ENUM_VALUE3651 = 174;
+  ENUM_VALUE3652 = 175;
+  ENUM_VALUE3653 = 176;
+  ENUM_VALUE3654 = 177;
+  ENUM_VALUE3655 = 178;
+  ENUM_VALUE3656 = 179;
+  ENUM_VALUE3657 = 180;
+  ENUM_VALUE3658 = 181;
+  ENUM_VALUE3659 = 182;
+  ENUM_VALUE3660 = 183;
+}
+
+enum Enum10325 {
+  ENUM_VALUE10326 = 0;
+  ENUM_VALUE10327 = 1;
+  ENUM_VALUE10328 = 2;
+  ENUM_VALUE10329 = 3;
+  ENUM_VALUE10330 = 4;
+  ENUM_VALUE10331 = 5;
+  ENUM_VALUE10332 = 6;
+  ENUM_VALUE10333 = 7;
+  ENUM_VALUE10334 = 8;
+}
+
+enum Enum10335 {
+  ENUM_VALUE10336 = 0;
+}
+
+enum Enum10337 {
+  ENUM_VALUE10338 = 0;
+  ENUM_VALUE10339 = 1;
+}
+
+enum Enum11901 {
+  ENUM_VALUE11902 = 0;
+  ENUM_VALUE11903 = 1;
+  ENUM_VALUE11904 = 2;
+  ENUM_VALUE11905 = 3;
+}
+
+enum Enum12735 {
+  ENUM_VALUE12736 = 0;
+  ENUM_VALUE12737 = 1;
+  ENUM_VALUE12738 = 2;
+  ENUM_VALUE12739 = 3;
+}
+
+enum Enum12871 {
+  ENUM_VALUE12872 = 1;
+  ENUM_VALUE12873 = 2;
+  ENUM_VALUE12874 = 3;
+  ENUM_VALUE12875 = 4;
+  ENUM_VALUE12876 = 5;
+  ENUM_VALUE12877 = 6;
+}
+
diff --git a/benchmarks/download_data.sh b/benchmarks/download_data.sh
new file mode 100755
index 0000000..fa0729e
--- /dev/null
+++ b/benchmarks/download_data.sh
@@ -0,0 +1,5 @@
+#! /bin/sh
+
+curl -O https://storage.googleapis.com/protobuf_opensource_benchmark_data/datasets.tar.gz
+tar -zvxf datasets.tar.gz
+
diff --git a/benchmarks/go/go_benchmark_test.go b/benchmarks/go/go_benchmark_test.go
new file mode 100644
index 0000000..8c741b7
--- /dev/null
+++ b/benchmarks/go/go_benchmark_test.go
@@ -0,0 +1,124 @@
+package main
+
+import (
+	benchmarkWrapper "../tmp"
+	googleMessage1Proto2 "../tmp/datasets/google_message1/proto2"
+	googleMessage1Proto3 "../tmp/datasets/google_message1/proto3"
+	googleMessage2 "../tmp/datasets/google_message2"
+	googleMessage3 "../tmp/datasets/google_message3"
+	googleMessage4 "../tmp/datasets/google_message4"
+	"flag"
+	"github.com/golang/protobuf/proto"
+	"io/ioutil"
+	"testing"
+)
+
+// Data is returned by the Load function.
+type Dataset struct {
+	name        string
+	newMessage  func() proto.Message
+	marshaled   [][]byte
+	unmarshaled []proto.Message
+}
+
+var datasets []Dataset
+
+// This is used to getDefaultInstance for a message type.
+func generateNewMessageFunction(dataset benchmarkWrapper.BenchmarkDataset) func() proto.Message {
+	switch dataset.MessageName {
+	case "benchmarks.proto3.GoogleMessage1":
+		return func() proto.Message { return new(googleMessage1Proto3.GoogleMessage1) }
+	case "benchmarks.proto2.GoogleMessage1":
+		return func() proto.Message { return new(googleMessage1Proto2.GoogleMessage1) }
+	case "benchmarks.proto2.GoogleMessage2":
+		return func() proto.Message { return new(googleMessage2.GoogleMessage2) }
+	case "benchmarks.google_message3.GoogleMessage3":
+		return func() proto.Message { return new(googleMessage3.GoogleMessage3) }
+	case "benchmarks.google_message4.GoogleMessage4":
+		return func() proto.Message { return new(googleMessage4.GoogleMessage4) }
+	default:
+		panic("Unknown message type: " + dataset.MessageName)
+	}
+}
+
+func init() {
+	flag.Parse()
+	for _, f := range flag.Args() {
+		// Load the benchmark.
+		b, err := ioutil.ReadFile(f)
+		if err != nil {
+			panic(err)
+		}
+
+		// Parse the benchmark.
+		var dm benchmarkWrapper.BenchmarkDataset
+		if err := proto.Unmarshal(b, &dm); err != nil {
+			panic(err)
+		}
+
+		// Determine the concrete protobuf message type to use.
+		var ds Dataset
+		ds.newMessage = generateNewMessageFunction(dm)
+
+		// Unmarshal each test message.
+		for _, payload := range dm.Payload {
+			ds.marshaled = append(ds.marshaled, payload)
+			m := ds.newMessage()
+			if err := proto.Unmarshal(payload, m); err != nil {
+				panic(err)
+			}
+			ds.unmarshaled = append(ds.unmarshaled, m)
+		}
+		ds.name = f
+
+		datasets = append(datasets, ds)
+	}
+}
+
+func Benchmark(b *testing.B) {
+	for _, ds := range datasets {
+		b.Run(ds.name, func(b *testing.B) {
+			b.Run("Unmarshal", func(b *testing.B) {
+				for i := 0; i < b.N; i++ {
+					for j, payload := range ds.marshaled {
+						out := ds.newMessage()
+						if err := proto.Unmarshal(payload, out); err != nil {
+							b.Fatalf("can't unmarshal message %d %v", j, err)
+						}
+					}
+				}
+			})
+			b.Run("Marshal", func(b *testing.B) {
+				for i := 0; i < b.N; i++ {
+					for j, m := range ds.unmarshaled {
+						if _, err := proto.Marshal(m); err != nil {
+							b.Fatalf("can't marshal message %d %+v: %v", j, m, err)
+						}
+					}
+				}
+			})
+			b.Run("Size", func(b *testing.B) {
+				for i := 0; i < b.N; i++ {
+					for _, m := range ds.unmarshaled {
+						proto.Size(m)
+					}
+				}
+			})
+			b.Run("Clone", func(b *testing.B) {
+				for i := 0; i < b.N; i++ {
+					for _, m := range ds.unmarshaled {
+						proto.Clone(m)
+					}
+				}
+			})
+			b.Run("Merge", func(b *testing.B) {
+				for i := 0; i < b.N; i++ {
+					for _, m := range ds.unmarshaled {
+						out := ds.newMessage()
+						proto.Merge(out, m)
+					}
+				}
+			})
+		})
+	}
+}
diff --git a/benchmarks/google_speed.proto b/benchmarks/google_speed.proto
deleted file mode 100644
index 16f6d67..0000000
--- a/benchmarks/google_speed.proto
+++ /dev/null
@@ -1,138 +0,0 @@
-syntax = "proto2";
-
-package benchmarks;
-
-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;
-}
diff --git a/benchmarks/java/pom.xml b/benchmarks/java/pom.xml
new file mode 100755
index 0000000..c2cd78a
--- /dev/null
+++ b/benchmarks/java/pom.xml
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+  <modelVersion>4.0.0</modelVersion>
+  <artifactId>protobuf-java-benchmark</artifactId>
+  <groupId>com.google.protobuf</groupId>
+  <version>1.0.0</version>
+  <name>Protocol Buffers [Benchmark]</name>
+  <description>The benchmark tools for Protobuf Java.</description>
+
+  <dependencies>
+    <dependency>
+      <groupId>com.google.protobuf</groupId>
+      <artifactId>protobuf-java</artifactId>
+      <version>3.5.0</version>
+    </dependency>
+    <dependency>
+      <groupId>com.google.caliper</groupId>
+      <artifactId>caliper</artifactId>
+      <version>1.0-beta-2</version>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-assembly-plugin</artifactId>
+          <version>2.4.1</version>
+          <configuration>
+            <!-- get all project dependencies -->
+            <descriptorRefs>
+              <descriptorRef>jar-with-dependencies</descriptorRef>
+            </descriptorRefs>
+            <!-- MainClass in mainfest make a executable jar -->
+            <archive>
+              <manifest>
+                <mainClass>com.mkyong.core.utils.App</mainClass>
+              </manifest>
+            </archive>
+          </configuration>
+          <executions>
+            <execution>
+              <id>make-assembly</id>
+              <!-- bind to the packaging phase -->
+              <phase>package</phase>
+              <goals>
+                <goal>single</goal>
+              </goals>
+            </execution>
+          </executions>
+        </plugin>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-compiler-plugin</artifactId>
+          <version>3.5.1</version>
+          <configuration>
+            <source>1.8</source>
+            <target>1.8</target>
+          </configuration>
+        </plugin>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-jar-plugin</artifactId>
+          <version>2.5</version>
+          <configuration>
+            <archive>
+              <manifest>
+                <addClasspath>true</addClasspath>
+                <mainClass>com.google.protocolbuffers.ProtoBench</mainClass>
+              </manifest>
+            </archive>
+          </configuration>
+        </plugin>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-source-plugin</artifactId>
+          <version>2.4</version>
+          <executions>
+            <execution>
+              <id>attach-sources</id>
+              <goals>
+                <goal>jar-no-fork</goal>
+              </goals>
+            </execution>
+          </executions>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+  </build>
+</project>
+
diff --git a/benchmarks/java/src/main/java/com/google/protobuf/ProtoCaliperBenchmark.java b/benchmarks/java/src/main/java/com/google/protobuf/ProtoCaliperBenchmark.java
new file mode 100755
index 0000000..94568ae
--- /dev/null
+++ b/benchmarks/java/src/main/java/com/google/protobuf/ProtoCaliperBenchmark.java
@@ -0,0 +1,232 @@
+
+package com.google.protobuf;
+
+import com.google.caliper.BeforeExperiment;
+import com.google.caliper.AfterExperiment;
+import com.google.caliper.Benchmark;
+import com.google.caliper.Param;
+import com.google.protobuf.ByteString;
+import com.google.protobuf.CodedOutputStream;
+import com.google.protobuf.ExtensionRegistry;
+import com.google.protobuf.Message;
+import com.google.protobuf.benchmarks.Benchmarks.BenchmarkDataset;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.util.ArrayList;
+import java.util.List;
+
+public class ProtoCaliperBenchmark {
+  public enum BenchmarkMessageType {
+    GOOGLE_MESSAGE1_PROTO3 {
+      @Override ExtensionRegistry getExtensionRegistry() { return ExtensionRegistry.newInstance(); }
+      @Override
+      Message getDefaultInstance() {
+        return com.google.protobuf.benchmarks.BenchmarkMessage1Proto3.GoogleMessage1
+            .getDefaultInstance();
+      }
+    },
+    GOOGLE_MESSAGE1_PROTO2 {
+      @Override ExtensionRegistry getExtensionRegistry() { return ExtensionRegistry.newInstance(); }
+      @Override
+      Message getDefaultInstance() {
+        return com.google.protobuf.benchmarks.BenchmarkMessage1Proto2.GoogleMessage1
+            .getDefaultInstance();
+      }
+    },
+    GOOGLE_MESSAGE2 {
+      @Override ExtensionRegistry getExtensionRegistry() { return ExtensionRegistry.newInstance(); }
+      @Override
+      Message getDefaultInstance() {
+        return com.google.protobuf.benchmarks.BenchmarkMessage2.GoogleMessage2.getDefaultInstance();
+      }
+    },
+    GOOGLE_MESSAGE3 {
+      @Override
+      ExtensionRegistry getExtensionRegistry() {
+        ExtensionRegistry extensions = ExtensionRegistry.newInstance();
+        com.google.protobuf.benchmarks.BenchmarkMessage38.registerAllExtensions(extensions);
+        com.google.protobuf.benchmarks.BenchmarkMessage37.registerAllExtensions(extensions);
+        com.google.protobuf.benchmarks.BenchmarkMessage36.registerAllExtensions(extensions);
+        com.google.protobuf.benchmarks.BenchmarkMessage35.registerAllExtensions(extensions);
+        com.google.protobuf.benchmarks.BenchmarkMessage34.registerAllExtensions(extensions);
+        com.google.protobuf.benchmarks.BenchmarkMessage33.registerAllExtensions(extensions);
+        com.google.protobuf.benchmarks.BenchmarkMessage32.registerAllExtensions(extensions);
+        com.google.protobuf.benchmarks.BenchmarkMessage31.registerAllExtensions(extensions);
+        com.google.protobuf.benchmarks.BenchmarkMessage3.registerAllExtensions(extensions);
+        return extensions;
+      }
+      @Override
+      Message getDefaultInstance() {
+        return com.google.protobuf.benchmarks.BenchmarkMessage3.GoogleMessage3.getDefaultInstance();
+      }
+    },
+    GOOGLE_MESSAGE4 {
+      @Override
+      ExtensionRegistry getExtensionRegistry() {
+        ExtensionRegistry extensions = ExtensionRegistry.newInstance();
+        com.google.protobuf.benchmarks.BenchmarkMessage43.registerAllExtensions(extensions);
+        com.google.protobuf.benchmarks.BenchmarkMessage42.registerAllExtensions(extensions);
+        com.google.protobuf.benchmarks.BenchmarkMessage41.registerAllExtensions(extensions);
+        com.google.protobuf.benchmarks.BenchmarkMessage4.registerAllExtensions(extensions);
+        return extensions;
+      }
+      @Override
+      Message getDefaultInstance() {
+        return com.google.protobuf.benchmarks.BenchmarkMessage4.GoogleMessage4.getDefaultInstance();
+      }
+    };
+    
+    abstract ExtensionRegistry getExtensionRegistry();
+    abstract Message getDefaultInstance();
+  }
+
+  private BenchmarkMessageType benchmarkMessageType;
+  @Param("")
+  private String dataFile;
+  
+  private byte[] inputData;
+  private BenchmarkDataset benchmarkDataset;
+  private Message defaultMessage;
+  private ExtensionRegistry extensions;
+  private List<byte[]> inputDataList;
+  private List<ByteArrayInputStream> inputStreamList;
+  private List<ByteString> inputStringList;
+  private List<Message> sampleMessageList;
+
+  private BenchmarkMessageType getMessageType() throws IOException {
+    if (benchmarkDataset.getMessageName().equals("benchmarks.proto3.GoogleMessage1")) {
+      return BenchmarkMessageType.GOOGLE_MESSAGE1_PROTO3;
+    } else if (benchmarkDataset.getMessageName().equals("benchmarks.proto2.GoogleMessage1")) {
+      return BenchmarkMessageType.GOOGLE_MESSAGE1_PROTO2;
+    } else if (benchmarkDataset.getMessageName().equals("benchmarks.proto2.GoogleMessage2")) {
+      return BenchmarkMessageType.GOOGLE_MESSAGE2;
+    } else if (benchmarkDataset.getMessageName().
+        equals("benchmarks.google_message3.GoogleMessage3")) {
+      return BenchmarkMessageType.GOOGLE_MESSAGE3;
+    } else if (benchmarkDataset.getMessageName().
+        equals("benchmarks.google_message4.GoogleMessage4")) {
+      return BenchmarkMessageType.GOOGLE_MESSAGE4;
+    } else {
+      throw new IllegalStateException("Invalid DataFile! There's no testing message named "
+          + benchmarkDataset.getMessageName());
+    }
+  }
+  
+  @BeforeExperiment
+  void setUp() throws IOException {
+    if (!dataFile.equals("")) {
+      RandomAccessFile file = new RandomAccessFile(new File(dataFile), "r");
+      inputData = new byte[(int) file.length()];
+      file.readFully(inputData);
+      benchmarkDataset = BenchmarkDataset.parseFrom(inputData);
+      benchmarkMessageType = getMessageType();
+    } else {
+      inputData = new byte[0];
+      benchmarkDataset = BenchmarkDataset.parseFrom(inputData);
+      benchmarkMessageType = BenchmarkMessageType.GOOGLE_MESSAGE2;
+    }
+    defaultMessage = benchmarkMessageType.getDefaultInstance();
+    extensions = benchmarkMessageType.getExtensionRegistry();
+    inputDataList = new ArrayList<byte[]>();
+    inputStreamList = new ArrayList<ByteArrayInputStream>();
+    inputStringList = new ArrayList<ByteString>();
+    sampleMessageList = new ArrayList<Message>();
+    
+    for (int i = 0; i < benchmarkDataset.getPayloadCount(); i++) {
+      byte[] singleInputData = benchmarkDataset.getPayload(i).toByteArray();
+      inputDataList.add(benchmarkDataset.getPayload(i).toByteArray());
+      inputStreamList.add(new ByteArrayInputStream(
+          benchmarkDataset.getPayload(i).toByteArray()));
+      inputStringList.add(benchmarkDataset.getPayload(i));
+      sampleMessageList.add(
+          defaultMessage.newBuilderForType().mergeFrom(singleInputData, extensions).build());
+    }
+  }
+  
+  
+  @Benchmark
+  void serializeToByteString(int reps) throws IOException {
+    if (sampleMessageList.size() == 0) {
+      return;
+    }
+    for (int i = 0; i < reps; i++) {
+      for (int j = 0; j < sampleMessageList.size(); j++) {
+        sampleMessageList.get(j).toByteString();        
+      }
+    }
+  }
+  
+  @Benchmark
+  void serializeToByteArray(int reps) throws IOException {
+    if (sampleMessageList.size() == 0) {
+      return;
+    }
+    for (int i = 0; i < reps; i++) {
+      for (int j = 0; j < sampleMessageList.size(); j++) {
+        sampleMessageList.get(j).toByteArray();  
+      }
+    }
+  }
+  
+  @Benchmark
+  void serializeToMemoryStream(int reps) throws IOException {
+    if (sampleMessageList.size() == 0) {
+      return;
+    }
+    for (int i = 0; i < reps; i++) {
+      for (int j = 0; j < sampleMessageList.size(); j++) {
+        ByteArrayOutputStream output = new ByteArrayOutputStream();
+        sampleMessageList.get(j).writeTo(output); 
+      }
+    }
+  }
+  
+  @Benchmark
+  void deserializeFromByteString(int reps) throws IOException {
+    if (inputStringList.size() == 0) {
+      return;
+    }
+    for (int i = 0; i < reps; i++) {
+      for (int j = 0; j < inputStringList.size(); j++) {
+        benchmarkMessageType.getDefaultInstance().getParserForType().parseFrom(
+          inputStringList.get(j), extensions);
+      }
+    }
+  }
+  
+  @Benchmark
+  void deserializeFromByteArray(int reps) throws IOException {
+    if (inputDataList.size() == 0) {
+      return;
+    }
+    for (int i = 0; i < reps; i++) {
+      for (int j = 0; j < inputDataList.size(); j++) {
+        benchmarkMessageType.getDefaultInstance().getParserForType().parseFrom(
+          inputDataList.get(j), extensions);
+      }
+    }
+  }
+  
+  @Benchmark
+  void deserializeFromMemoryStream(int reps) throws IOException {
+    if (inputStreamList.size() == 0) {
+      return;
+    }
+    for (int i = 0; i < reps; i++) {
+      for (int j = 0; j < inputStreamList.size(); j++) {
+        benchmarkMessageType.getDefaultInstance().getParserForType().parseFrom(
+            inputStreamList.get(j), extensions);
+        inputStreamList.get(j).reset();
+      }
+    }
+  }
+}
+
+
diff --git a/benchmarks/python/__init__.py b/benchmarks/python/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/benchmarks/python/__init__.py
diff --git a/benchmarks/python/py_benchmark.py b/benchmarks/python/py_benchmark.py
new file mode 100755
index 0000000..6942d20
--- /dev/null
+++ b/benchmarks/python/py_benchmark.py
@@ -0,0 +1,152 @@
+import sys
+import os
+import timeit
+import math
+import argparse
+import fnmatch
+import json
+
+parser = argparse.ArgumentParser(description="Python protobuf benchmark")
+parser.add_argument("data_files", metavar="dataFile", nargs="+", 
+                    help="testing data files.")
+parser.add_argument("--json", action="store_const", dest="json",
+                    const="yes", default="no",
+                    help="Whether to output json results")
+parser.add_argument("--behavior_prefix", dest="behavior_prefix",
+                    help="The output json format's behavior's name's prefix",
+                    default="")
+# BEGIN CPP GENERATED MESSAGE
+parser.add_argument("--cpp_generated", action="store_const",
+                    dest="cpp_generated", const="yes", default="no",
+                    help="Whether to link generated code library")
+# END CPP GENERATED MESSAGE
+args = parser.parse_args()
+# BEGIN CPP GENERATED MESSAGE
+# CPP generated code must be linked before importing the generated Python code
+# for the descriptor can be found in the pool
+if args.cpp_generated != "no":
+  sys.path.append( os.path.dirname( os.path.dirname( os.path.abspath(__file__) ) ) + "/.libs" )
+  import libbenchmark_messages
+  sys.path.append( os.path.dirname( os.path.dirname( os.path.abspath(__file__) ) ) + "/tmp" )
+# END CPP GENERATED MESSAGE
+
+
+import datasets.google_message1.proto2.benchmark_message1_proto2_pb2 as benchmark_message1_proto2_pb2
+import datasets.google_message1.proto3.benchmark_message1_proto3_pb2 as benchmark_message1_proto3_pb2
+import datasets.google_message2.benchmark_message2_pb2 as benchmark_message2_pb2
+import datasets.google_message3.benchmark_message3_pb2 as benchmark_message3_pb2
+import datasets.google_message4.benchmark_message4_pb2 as benchmark_message4_pb2
+import benchmarks_pb2 as benchmarks_pb2
+
+
+def run_one_test(filename):
+  data = open(filename).read()
+  benchmark_dataset = benchmarks_pb2.BenchmarkDataset()
+  benchmark_dataset.ParseFromString(data)
+  benchmark_util = Benchmark(full_iteration=len(benchmark_dataset.payload),
+                             module="py_benchmark",
+                             setup_method="init")
+  result={}
+  result["filename"] =  filename
+  result["message_name"] =  benchmark_dataset.message_name
+  result["benchmarks"] = {}
+  benchmark_util.set_test_method("parse_from_benchmark")
+  result["benchmarks"][args.behavior_prefix + "_parse_from_benchmark"] = \
+    benchmark_util.run_benchmark(setup_method_args='"%s"' % (filename))
+  benchmark_util.set_test_method("serialize_to_benchmark")
+  result["benchmarks"][args.behavior_prefix + "_serialize_to_benchmark"] = \
+    benchmark_util.run_benchmark(setup_method_args='"%s"' % (filename))
+  return result
+
+
+def init(filename):
+  global benchmark_dataset, message_class, message_list, counter
+  message_list=[]
+  counter = 0
+  data = open(os.path.dirname(sys.argv[0]) + "/../" + filename).read()
+  benchmark_dataset = benchmarks_pb2.BenchmarkDataset()
+  benchmark_dataset.ParseFromString(data)
+
+  if benchmark_dataset.message_name == "benchmarks.proto3.GoogleMessage1":
+    message_class = benchmark_message1_proto3_pb2.GoogleMessage1
+  elif benchmark_dataset.message_name == "benchmarks.proto2.GoogleMessage1":
+    message_class = benchmark_message1_proto2_pb2.GoogleMessage1
+  elif benchmark_dataset.message_name == "benchmarks.proto2.GoogleMessage2":
+    message_class = benchmark_message2_pb2.GoogleMessage2
+  elif benchmark_dataset.message_name == "benchmarks.google_message3.GoogleMessage3":
+    message_class = benchmark_message3_pb2.GoogleMessage3
+  elif benchmark_dataset.message_name == "benchmarks.google_message4.GoogleMessage4":
+    message_class = benchmark_message4_pb2.GoogleMessage4
+  else:
+    raise IOError("Message %s not found!" % (benchmark_dataset.message_name))
+
+  for one_payload in benchmark_dataset.payload:
+    temp = message_class()
+    temp.ParseFromString(one_payload)
+    message_list.append(temp)
+
+
+def parse_from_benchmark():
+  global counter, message_class, benchmark_dataset
+  m = message_class().ParseFromString(benchmark_dataset.payload[counter % len(benchmark_dataset.payload)])
+  counter = counter + 1
+
+
+def serialize_to_benchmark():
+  global counter, message_list, message_class
+  s = message_list[counter % len(benchmark_dataset.payload)].SerializeToString()
+  counter = counter + 1
+
+
+class Benchmark:
+  def __init__(self, module=None, test_method=None,
+               setup_method=None, full_iteration = 1):
+    self.full_iteration = full_iteration
+    self.module = module
+    self.test_method = test_method
+    self.setup_method = setup_method
+
+  def set_test_method(self, test_method):
+    self.test_method = test_method
+
+  def full_setup_code(self, setup_method_args=''):
+    setup_code = ""
+    setup_code += "from %s import %s\n" % (self.module, self.test_method)
+    setup_code += "from %s import %s\n" % (self.module, self.setup_method)
+    setup_code += "%s(%s)\n" % (self.setup_method, setup_method_args)
+    return setup_code
+
+  def dry_run(self, test_method_args='', setup_method_args=''):
+    return timeit.timeit(stmt="%s(%s)" % (self.test_method, test_method_args),
+                         setup=self.full_setup_code(setup_method_args),
+                         number=self.full_iteration);
+
+  def run_benchmark(self, test_method_args='', setup_method_args=''):
+    reps = self.full_iteration;
+    t = self.dry_run(test_method_args, setup_method_args);
+    if t < 3 :
+      reps = int(math.ceil(3 / t)) * self.full_iteration
+    t = timeit.timeit(stmt="%s(%s)" % (self.test_method, test_method_args),
+                      setup=self.full_setup_code(setup_method_args),
+                      number=reps);
+    return 1.0 * t / reps * (10 ** 9)
+  
+
+if __name__ == "__main__":
+  results = []
+  for file in args.data_files:
+    results.append(run_one_test(file))
+  
+  if args.json != "no":
+    print json.dumps(results)
+  else:
+    for result in results:
+      print "Message %s of dataset file %s" % \
+          (result["message_name"], result["filename"])
+      print "Average time for parse_from_benchmark: %.2f ns" % \
+          (result["benchmarks"][ \
+                      args.behavior_prefix + "_parse_from_benchmark"])
+      print "Average time for serialize_to_benchmark: %.2f ns" % \
+          (result["benchmarks"][ \
+                      args.behavior_prefix + "_serialize_to_benchmark"])
+      print ""
diff --git a/benchmarks/python/python_benchmark_messages.cc b/benchmarks/python/python_benchmark_messages.cc
new file mode 100644
index 0000000..ded16fe
--- /dev/null
+++ b/benchmarks/python/python_benchmark_messages.cc
@@ -0,0 +1,29 @@
+#include <Python.h>
+
+#include "benchmarks.pb.h"
+#include "datasets/google_message1/proto2/benchmark_message1_proto2.pb.h"
+#include "datasets/google_message1/proto3/benchmark_message1_proto3.pb.h"
+#include "datasets/google_message2/benchmark_message2.pb.h"
+#include "datasets/google_message3/benchmark_message3.pb.h"
+#include "datasets/google_message4/benchmark_message4.pb.h"
+
+static PyMethodDef python_benchmark_methods[] = {
+    {NULL, NULL, 0, NULL}        /* Sentinel */
+};
+
+
+PyMODINIT_FUNC
+initlibbenchmark_messages() {
+  benchmarks::BenchmarkDataset().descriptor();
+  benchmarks::proto3::GoogleMessage1().descriptor();
+  benchmarks::proto2::GoogleMessage1().descriptor();
+  benchmarks::proto2::GoogleMessage2().descriptor();
+  benchmarks::google_message3::GoogleMessage3().descriptor();
+  benchmarks::google_message4::GoogleMessage4().descriptor();
+
+  PyObject *m;
+
+  m = Py_InitModule("libbenchmark_messages", python_benchmark_methods);
+  if (m == NULL)
+      return;
+}
diff --git a/benchmarks/readme.txt b/benchmarks/readme.txt
deleted file mode 100644
index 2c836d0..0000000
--- a/benchmarks/readme.txt
+++ /dev/null
@@ -1,50 +0,0 @@
-Contents
---------
-
-This folder contains three kinds of file:
-
-- Code, such as ProtoBench.java, to build the benchmarking framework.
-- Protocol buffer definitions (.proto files)
-- Sample data files
-
-If we end up with a lot of different benchmarks it may be worth
-separating these out info different directories, but while there are
-so few they might as well all be together.
-
-Running a benchmark (Java)
---------------------------
-
-1) Build protoc and the Java protocol buffer library. The examples
-   below assume a jar file (protobuf.jar) has been built and copied
-   into this directory.
-
-2) Build ProtoBench:
-   $ javac -d tmp -cp protobuf.jar ProtoBench.java
-   
-3) Generate code for the relevant benchmark protocol buffer, e.g.
-   $ protoc --java_out=tmp google_size.proto google_speed.proto
-   
-4) Build the generated code, e.g.
-   $ cd tmp
-   $ javac -d . -cp ../protobuf.jar benchmarks/*.java
-           
-5) Run the test. Arguments are given in pairs - the first argument
-   is the descriptor type; the second is the filename. For example:
-   $ java -cp .;../protobuf.jar com.google.protocolbuffers.ProtoBench
-          benchmarks.GoogleSize$SizeMessage1 ../google_message1.dat
-          benchmarks.GoogleSpeed$SpeedMessage1 ../google_message1.dat
-          benchmarks.GoogleSize$SizeMessage2 ../google_message2.dat
-          benchmarks.GoogleSpeed$SpeedMessage2 ../google_message2.dat
-          
-6) Wait! Each test runs for around 30 seconds, and there are 6 tests
-   per class/data combination. The above command would therefore take
-   about 12 minutes to run.
-
-   
-Benchmarks available
---------------------
-
-From Google:
-google_size.proto and google_speed.proto, messages
-google_message1.dat and google_message2.dat. The proto files are
-equivalent, but optimized differently.
diff --git a/benchmarks/util/__init__.py b/benchmarks/util/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/benchmarks/util/__init__.py
diff --git a/benchmarks/util/big_query_utils.py b/benchmarks/util/big_query_utils.py
new file mode 100755
index 0000000..14105aa
--- /dev/null
+++ b/benchmarks/util/big_query_utils.py
@@ -0,0 +1,188 @@
+#!/usr/bin/env python2.7
+
+import argparse
+import json
+import uuid
+import httplib2
+
+from apiclient import discovery
+from apiclient.errors import HttpError
+from oauth2client.client import GoogleCredentials
+
+# 30 days in milliseconds
+_EXPIRATION_MS = 30 * 24 * 60 * 60 * 1000
+NUM_RETRIES = 3
+
+
+def create_big_query():
+    """Authenticates with cloud platform and gets a BiqQuery service object
+  """
+    creds = GoogleCredentials.get_application_default()
+    return discovery.build(
+        'bigquery', 'v2', credentials=creds, cache_discovery=False)
+
+
+def create_dataset(biq_query, project_id, dataset_id):
+    is_success = True
+    body = {
+        'datasetReference': {
+            'projectId': project_id,
+            'datasetId': dataset_id
+        }
+    }
+
+    try:
+        dataset_req = biq_query.datasets().insert(
+            projectId=project_id, body=body)
+        dataset_req.execute(num_retries=NUM_RETRIES)
+    except HttpError as http_error:
+        if http_error.resp.status == 409:
+            print 'Warning: The dataset %s already exists' % dataset_id
+        else:
+            # Note: For more debugging info, print "http_error.content"
+            print 'Error in creating dataset: %s. Err: %s' % (dataset_id,
+                                                              http_error)
+            is_success = False
+    return is_success
+
+
+def create_table(big_query, project_id, dataset_id, table_id, table_schema,
+                 description):
+    fields = [{
+        'name': field_name,
+        'type': field_type,
+        'description': field_description
+    } for (field_name, field_type, field_description) in table_schema]
+    return create_table2(big_query, project_id, dataset_id, table_id, fields,
+                         description)
+
+
+def create_partitioned_table(big_query,
+                             project_id,
+                             dataset_id,
+                             table_id,
+                             table_schema,
+                             description,
+                             partition_type='DAY',
+                             expiration_ms=_EXPIRATION_MS):
+    """Creates a partitioned table. By default, a date-paritioned table is created with
+  each partition lasting 30 days after it was last modified.
+  """
+    fields = [{
+        'name': field_name,
+        'type': field_type,
+        'description': field_description
+    } for (field_name, field_type, field_description) in table_schema]
+    return create_table2(big_query, project_id, dataset_id, table_id, fields,
+                         description, partition_type, expiration_ms)
+
+
+def create_table2(big_query,
+                  project_id,
+                  dataset_id,
+                  table_id,
+                  fields_schema,
+                  description,
+                  partition_type=None,
+                  expiration_ms=None):
+    is_success = True
+
+    body = {
+        'description': description,
+        'schema': {
+            'fields': fields_schema
+        },
+        'tableReference': {
+            'datasetId': dataset_id,
+            'projectId': project_id,
+            'tableId': table_id
+        }
+    }
+
+    if partition_type and expiration_ms:
+        body["timePartitioning"] = {
+            "type": partition_type,
+            "expirationMs": expiration_ms
+        }
+
+    try:
+        table_req = big_query.tables().insert(
+            projectId=project_id, datasetId=dataset_id, body=body)
+        res = table_req.execute(num_retries=NUM_RETRIES)
+        print 'Successfully created %s "%s"' % (res['kind'], res['id'])
+    except HttpError as http_error:
+        if http_error.resp.status == 409:
+            print 'Warning: Table %s already exists' % table_id
+        else:
+            print 'Error in creating table: %s. Err: %s' % (table_id,
+                                                            http_error)
+            is_success = False
+    return is_success
+
+
+def patch_table(big_query, project_id, dataset_id, table_id, fields_schema):
+    is_success = True
+
+    body = {
+        'schema': {
+            'fields': fields_schema
+        },
+        'tableReference': {
+            'datasetId': dataset_id,
+            'projectId': project_id,
+            'tableId': table_id
+        }
+    }
+
+    try:
+        table_req = big_query.tables().patch(
+            projectId=project_id,
+            datasetId=dataset_id,
+            tableId=table_id,
+            body=body)
+        res = table_req.execute(num_retries=NUM_RETRIES)
+        print 'Successfully patched %s "%s"' % (res['kind'], res['id'])
+    except HttpError as http_error:
+        print 'Error in creating table: %s. Err: %s' % (table_id, http_error)
+        is_success = False
+    return is_success
+
+
+def insert_rows(big_query, project_id, dataset_id, table_id, rows_list):
+    is_success = True
+    body = {'rows': rows_list}
+    try:
+        insert_req = big_query.tabledata().insertAll(
+            projectId=project_id,
+            datasetId=dataset_id,
+            tableId=table_id,
+            body=body)
+        res = insert_req.execute(num_retries=NUM_RETRIES)
+        if res.get('insertErrors', None):
+            print 'Error inserting rows! Response: %s' % res
+            is_success = False
+    except HttpError as http_error:
+        print 'Error inserting rows to the table %s' % table_id
+        is_success = False
+
+    return is_success
+
+
+def sync_query_job(big_query, project_id, query, timeout=5000):
+    query_data = {'query': query, 'timeoutMs': timeout}
+    query_job = None
+    try:
+        query_job = big_query.jobs().query(
+            projectId=project_id,
+            body=query_data).execute(num_retries=NUM_RETRIES)
+    except HttpError as http_error:
+        print 'Query execute job failed with error: %s' % http_error
+        print http_error.content
+    return query_job
+
+
+    # List of (column name, column type, description) tuples
+def make_row(unique_row_id, row_values_dict):
+    """row_values_dict is a dictionary of column name and column value.
+  """
+    return {'insertId': unique_row_id, 'json': row_values_dict}
diff --git a/benchmarks/util/gogo_data_scrubber.cc b/benchmarks/util/gogo_data_scrubber.cc
new file mode 100644
index 0000000..fb9af6e
--- /dev/null
+++ b/benchmarks/util/gogo_data_scrubber.cc
@@ -0,0 +1,105 @@
+#include "benchmarks.pb.h"
+#include "datasets/google_message1/proto2/benchmark_message1_proto2.pb.h"
+#include "datasets/google_message1/proto3/benchmark_message1_proto3.pb.h"
+#include "datasets/google_message2/benchmark_message2.pb.h"
+#include "datasets/google_message3/benchmark_message3.pb.h"
+#include "datasets/google_message4/benchmark_message4.pb.h"
+
+#include "google/protobuf/message.h"
+#include "google/protobuf/descriptor.h"
+
+#include <fstream>
+
+using google::protobuf::FieldDescriptor;
+using google::protobuf::Message;
+using google::protobuf::Reflection;
+
+
+class DataGroupStripper {
+ public:
+  static void StripMessage(Message *message) {
+    std::vector<const FieldDescriptor*> set_fields;
+    const Reflection* reflection = message->GetReflection();
+    reflection->ListFields(*message, &set_fields);
+
+    for (size_t i = 0; i < set_fields.size(); i++) {
+      const FieldDescriptor* field = set_fields[i];
+      if (field->type() == FieldDescriptor::TYPE_GROUP) {
+        reflection->ClearField(message, field);
+      }
+      if (field->type() == FieldDescriptor::TYPE_MESSAGE) {
+        if (field->is_repeated()) {
+          for (int j = 0; j < reflection->FieldSize(*message, field); j++) {
+            StripMessage(reflection->MutableRepeatedMessage(message, field, j));
+          }
+        } else {
+          StripMessage(reflection->MutableMessage(message, field));
+        }
+      }
+    }
+
+    reflection->MutableUnknownFields(message)->Clear();
+  }
+};
+
+std::string ReadFile(const std::string& name) {
+  std::ifstream file(name.c_str());
+  GOOGLE_CHECK(file.is_open()) << "Couldn't find file '"
+      << name
+      << "', please make sure you are running this command from the benchmarks"
+      << " directory.\n";
+  return std::string((std::istreambuf_iterator<char>(file)),
+                     std::istreambuf_iterator<char>());
+}
+
+int main(int argc, char *argv[]) {
+  if (argc % 2 == 0 || argc == 1) {
+    std::cerr << "Usage: [input_files] [output_file_names] where " <<
+        "input_files are one to one mapping to output_file_names." <<
+        std::endl;
+    return 1;
+  }
+
+  for (int i = argc / 2; i > 0; i--) {
+    const std::string &input_file = argv[i];
+    const std::string &output_file = argv[i + argc / 2];
+
+    std::cerr << "Generating " << input_file
+        << " to " << output_file << std::endl;
+    benchmarks::BenchmarkDataset dataset;
+    Message* message;
+    std::string dataset_payload = ReadFile(input_file);
+    GOOGLE_CHECK(dataset.ParseFromString(dataset_payload))
+      << "Can' t parse data file " << input_file;
+
+    if (dataset.message_name() == "benchmarks.proto3.GoogleMessage1") {
+      message = new benchmarks::proto3::GoogleMessage1;
+    } else if (dataset.message_name() == "benchmarks.proto2.GoogleMessage1") {
+      message = new benchmarks::proto2::GoogleMessage1;
+    } else if (dataset.message_name() == "benchmarks.proto2.GoogleMessage2") {
+      message = new benchmarks::proto2::GoogleMessage2;
+    } else if (dataset.message_name() ==
+        "benchmarks.google_message3.GoogleMessage3") {
+      message = new benchmarks::google_message3::GoogleMessage3;
+    } else if (dataset.message_name() ==
+        "benchmarks.google_message4.GoogleMessage4") {
+      message = new benchmarks::google_message4::GoogleMessage4;
+    } else {
+      std::cerr << "Unknown message type: " << dataset.message_name();
+      exit(1);
+    }
+
+    for (int i = 0; i < dataset.payload_size(); i++) {
+      message->ParseFromString(dataset.payload(i));
+      DataGroupStripper::StripMessage(message);
+      dataset.set_payload(i, message->SerializeAsString());
+    }
+
+    std::ofstream ofs(output_file);
+    ofs << dataset.SerializeAsString();
+    ofs.close();
+  }
+
+
+  return 0;
+}
diff --git a/benchmarks/util/protoc-gen-gogoproto.cc b/benchmarks/util/protoc-gen-gogoproto.cc
new file mode 100644
index 0000000..bfa6a5e
--- /dev/null
+++ b/benchmarks/util/protoc-gen-gogoproto.cc
@@ -0,0 +1,103 @@
+#include "google/protobuf/compiler/code_generator.h"
+#include "google/protobuf/io/zero_copy_stream.h"
+#include "google/protobuf/io/printer.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/descriptor.pb.h"
+#include "schema_proto2_to_proto3_util.h"
+
+#include "google/protobuf/compiler/plugin.h"
+
+using google::protobuf::FileDescriptorProto;
+using google::protobuf::FileDescriptor;
+using google::protobuf::DescriptorPool;
+using google::protobuf::io::Printer;
+using google::protobuf::util::SchemaGroupStripper;
+using google::protobuf::util::SchemaAddZeroEnumValue;
+
+namespace google {
+namespace protobuf {
+namespace compiler {
+
+namespace {
+
+string StripProto(string filename) {
+  if (filename.substr(filename.size() - 11) == ".protodevel") {
+    // .protodevel
+    return filename.substr(0, filename.size() - 11);
+  } else {
+    // .proto
+    return filename.substr(0, filename.size() - 6);
+  }
+}
+
+DescriptorPool new_pool_;
+
+}  // namespace
+
+class GoGoProtoGenerator : public CodeGenerator {
+ public:
+  virtual bool GenerateAll(const std::vector<const FileDescriptor*>& files,
+                           const string& parameter,
+                           GeneratorContext* context,
+                           string* error) const {
+    for (int i = 0; i < files.size(); i++) {
+      for (auto file : files) {
+        bool can_generate =
+            (new_pool_.FindFileByName(file->name()) == nullptr);
+        for (int j = 0; j < file->dependency_count(); j++) {
+          can_generate &= (new_pool_.FindFileByName(
+              file->dependency(j)->name()) != nullptr);
+        }
+        for (int j = 0; j < file->public_dependency_count(); j++) {
+          can_generate &= (new_pool_.FindFileByName(
+              file->public_dependency(j)->name()) != nullptr);
+        }
+        for (int j = 0; j < file->weak_dependency_count(); j++) {
+          can_generate &= (new_pool_.FindFileByName(
+              file->weak_dependency(j)->name()) != nullptr);
+        }
+        if (can_generate) {
+          Generate(file, parameter, context, error);
+          break;
+        }
+      }
+    }
+
+    return true;
+  }
+
+  virtual bool Generate(const FileDescriptor* file,
+                        const string& parameter,
+                        GeneratorContext* context,
+                        string* error) const {
+    FileDescriptorProto new_file;
+    file->CopyTo(&new_file);
+    SchemaGroupStripper::StripFile(file, &new_file);
+
+    SchemaAddZeroEnumValue enum_scrubber;
+    enum_scrubber.ScrubFile(&new_file);
+
+    string filename = file->name();
+    string basename = StripProto(filename);
+
+    std::vector<std::pair<string,string>> option_pairs;
+    ParseGeneratorParameter(parameter, &option_pairs);
+
+    std::unique_ptr<google::protobuf::io::ZeroCopyOutputStream> output(
+        context->Open(basename + ".proto"));
+    string content = new_pool_.BuildFile(new_file)->DebugString();
+    Printer printer(output.get(), '$');
+    printer.WriteRaw(content.c_str(), content.size());
+
+    return true;
+  }
+};
+
+}  // namespace compiler
+}  // namespace protobuf
+}  // namespace google
+
+int main(int argc, char* argv[]) {
+  google::protobuf::compiler::GoGoProtoGenerator generator;
+  return google::protobuf::compiler::PluginMain(argc, argv, &generator);
+}
diff --git a/benchmarks/util/run_and_upload.py b/benchmarks/util/run_and_upload.py
new file mode 100755
index 0000000..ae22a66
--- /dev/null
+++ b/benchmarks/util/run_and_upload.py
@@ -0,0 +1,290 @@
+import argparse
+import os
+import re
+import copy
+import uuid
+import calendar
+import time
+import big_query_utils
+import datetime
+import json
+# This import depends on the automake rule protoc_middleman, please make sure
+# protoc_middleman has been built before run this file.
+import os.path, sys
+sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), os.pardir))
+import tmp.benchmarks_pb2 as benchmarks_pb2
+from click.types import STRING
+
+_PROJECT_ID = 'grpc-testing'
+_DATASET = 'protobuf_benchmark_result'
+_TABLE = 'opensource_result_v1'
+_NOW = "%d%02d%02d" % (datetime.datetime.now().year,
+                       datetime.datetime.now().month,
+                       datetime.datetime.now().day)
+
+file_size_map = {}
+
+def get_data_size(file_name):
+  if file_name in file_size_map:
+    return file_size_map[file_name]
+  benchmark_dataset = benchmarks_pb2.BenchmarkDataset()
+  benchmark_dataset.ParseFromString(
+      open(os.path.dirname(os.path.abspath(__file__)) + "/../" + file_name).read())
+  size = 0
+  count = 0
+  for payload in benchmark_dataset.payload:
+    size += len(payload)
+    count += 1
+  file_size_map[file_name] = (size, 1.0 * size / count)
+  return size, 1.0 * size / count
+
+
+def extract_file_name(file_name):
+  name_list = re.split("[/\.]", file_name)
+  short_file_name = ""
+  for name in name_list:
+    if name[:14] == "google_message":
+      short_file_name = name
+  return short_file_name
+
+
+cpp_result = []
+python_result = []
+java_result = []
+go_result = []
+
+
+# CPP results example:
+# [ 
+#   "benchmarks": [ 
+#     {
+#       "bytes_per_second": int,
+#       "cpu_time": int,
+#       "name: string,
+#       "time_unit: string,
+#       ...
+#     },
+#     ... 
+#   ],
+#   ... 
+# ]
+def parse_cpp_result(filename):
+  global cpp_result
+  if filename == "":
+    return
+  if filename[0] != '/':
+    filename = os.path.dirname(os.path.abspath(__file__)) + '/' + filename
+  with open(filename) as f:
+    results = json.loads(f.read())
+    for benchmark in results["benchmarks"]:
+      data_filename = "".join(
+          re.split("(_parse_|_serialize)", benchmark["name"])[0])
+      behavior = benchmark["name"][len(data_filename) + 1:]
+      cpp_result.append({
+        "language": "cpp",
+        "dataFileName": data_filename,
+        "behavior": behavior,
+        "throughput": benchmark["bytes_per_second"] / 2.0 ** 20
+      })
+
+
+# Python results example:
+# [ 
+#   [ 
+#     {
+#       "filename": string,
+#       "benchmarks": {
+#         behavior: results, 
+#         ...
+#       },
+#       "message_name": STRING
+#     },
+#     ... 
+#   ], #pure-python
+#   ... 
+# ]
+def parse_python_result(filename):
+  global python_result
+  if filename == "":
+    return
+  if filename[0] != '/':
+    filename = os.path.dirname(os.path.abspath(__file__)) + '/' + filename
+  with open(filename) as f:
+    results_list = json.loads(f.read())
+    for results in results_list:
+      for result in results:
+        _, avg_size = get_data_size(result["filename"])
+        for behavior in result["benchmarks"]:
+          python_result.append({
+            "language": "python",
+            "dataFileName": extract_file_name(result["filename"]),
+            "behavior": behavior,
+            "throughput": avg_size /
+                          result["benchmarks"][behavior] * 1e9 / 2 ** 20
+          })
+
+
+# Java results example:
+# [ 
+#   {
+#     "id": string,
+#     "instrumentSpec": {...},
+#     "measurements": [
+#       {
+#         "weight": float,
+#         "value": {
+#           "magnitude": float,
+#           "unit": string
+#         },
+#         ...
+#       },
+#       ...
+#     ],
+#     "run": {...},
+#     "scenario": {
+#       "benchmarkSpec": {
+#         "methodName": string,
+#         "parameters": {
+#            defined parameters in the benchmark: parameters value
+#         },
+#         ...
+#       },
+#       ...
+#     }
+#     
+#   }, 
+#   ... 
+# ]
+def parse_java_result(filename):
+  global average_bytes_per_message, java_result
+  if filename == "":
+    return
+  if filename[0] != '/':
+    filename = os.path.dirname(os.path.abspath(__file__)) + '/' + filename
+  with open(filename) as f:
+    results = json.loads(f.read())
+    for result in results:
+      total_weight = 0
+      total_value = 0
+      for measurement in result["measurements"]:
+        total_weight += measurement["weight"]
+        total_value += measurement["value"]["magnitude"]
+      avg_time = total_value * 1.0 / total_weight
+      total_size, _ = get_data_size(
+          result["scenario"]["benchmarkSpec"]["parameters"]["dataFile"])
+      java_result.append({
+        "language": "java",
+        "throughput": total_size / avg_time * 1e9 / 2 ** 20,
+        "behavior": result["scenario"]["benchmarkSpec"]["methodName"],
+        "dataFileName": extract_file_name(
+            result["scenario"]["benchmarkSpec"]["parameters"]["dataFile"])
+      })
+
+
+# Go benchmark results:
+#
+# goos: linux
+# goarch: amd64
+# Benchmark/.././datasets/google_message2/dataset.google_message2.pb/Unmarshal-12               3000      705784 ns/op
+# Benchmark/.././datasets/google_message2/dataset.google_message2.pb/Marshal-12                 2000      634648 ns/op
+# Benchmark/.././datasets/google_message2/dataset.google_message2.pb/Size-12                    5000      244174 ns/op
+# Benchmark/.././datasets/google_message2/dataset.google_message2.pb/Clone-12                    300     4120954 ns/op
+# Benchmark/.././datasets/google_message2/dataset.google_message2.pb/Merge-12                    300     4108632 ns/op
+# PASS
+# ok    _/usr/local/google/home/yilunchong/mygit/protobuf/benchmarks  124.173s
+def parse_go_result(filename):
+  global go_result
+  if filename == "":
+    return
+  if filename[0] != '/':
+    filename = os.path.dirname(os.path.abspath(__file__)) + '/' + filename
+  with open(filename) as f:
+    for line in f:
+      result_list = re.split("[\ \t]+", line)
+      if result_list[0][:9] != "Benchmark":
+        continue
+      first_slash_index = result_list[0].find('/')
+      last_slash_index = result_list[0].rfind('/')
+      full_filename = result_list[0][first_slash_index+4:last_slash_index] # delete ../ prefix
+      total_bytes, _ = get_data_size(full_filename)
+      behavior_with_suffix = result_list[0][last_slash_index+1:]
+      last_dash = behavior_with_suffix.rfind("-")
+      if last_dash == -1:
+        behavior = behavior_with_suffix
+      else:
+        behavior = behavior_with_suffix[:last_dash]
+      go_result.append({
+        "dataFilename": extract_file_name(full_filename),
+        "throughput": total_bytes / float(result_list[2]) * 1e9 / 2 ** 20,
+        "behavior": behavior,
+        "language": "go"
+      })
+
+
+def get_metadata():
+  build_number = os.getenv('BUILD_NUMBER')
+  build_url = os.getenv('BUILD_URL')
+  job_name = os.getenv('JOB_NAME')
+  git_commit = os.getenv('GIT_COMMIT')
+  # actual commit is the actual head of PR that is getting tested
+  git_actual_commit = os.getenv('ghprbActualCommit')
+
+  utc_timestamp = str(calendar.timegm(time.gmtime()))
+  metadata = {'created': utc_timestamp}
+
+  if build_number:
+    metadata['buildNumber'] = build_number
+  if build_url:
+    metadata['buildUrl'] = build_url
+  if job_name:
+    metadata['jobName'] = job_name
+  if git_commit:
+    metadata['gitCommit'] = git_commit
+  if git_actual_commit:
+    metadata['gitActualCommit'] = git_actual_commit
+
+  return metadata
+
+
+def upload_result(result_list, metadata):
+  for result in result_list:
+    new_result = copy.deepcopy(result)
+    new_result['metadata'] = metadata
+    bq = big_query_utils.create_big_query()
+    row = big_query_utils.make_row(str(uuid.uuid4()), new_result)
+    if not big_query_utils.insert_rows(bq, _PROJECT_ID, _DATASET,
+                                       _TABLE + "$" + _NOW,
+                                       [row]):
+      print 'Error when uploading result', new_result
+
+
+if __name__ == "__main__":
+  parser = argparse.ArgumentParser()
+  parser.add_argument("-cpp", "--cpp_input_file",
+                      help="The CPP benchmark result file's name",
+                      default="")
+  parser.add_argument("-java", "--java_input_file",
+                      help="The Java benchmark result file's name",
+                      default="")
+  parser.add_argument("-python", "--python_input_file",
+                      help="The Python benchmark result file's name",
+                      default="")
+  parser.add_argument("-go", "--go_input_file",
+                      help="The golang benchmark result file's name",
+                      default="")
+  args = parser.parse_args()
+
+  parse_cpp_result(args.cpp_input_file)
+  parse_python_result(args.python_input_file)
+  parse_java_result(args.java_input_file)
+  parse_go_result(args.go_input_file)
+
+  metadata = get_metadata()
+  print "uploading cpp results..."
+  upload_result(cpp_result, metadata)
+  print "uploading java results..."
+  upload_result(java_result, metadata)
+  print "uploading python results..."
+  upload_result(python_result, metadata)
+  print "uploading go results..."
+  upload_result(go_result, metadata)
diff --git a/benchmarks/util/schema_proto2_to_proto3_util.h b/benchmarks/util/schema_proto2_to_proto3_util.h
new file mode 100644
index 0000000..089012d
--- /dev/null
+++ b/benchmarks/util/schema_proto2_to_proto3_util.h
@@ -0,0 +1,137 @@
+#ifndef PROTOBUF_BENCHMARKS_UTIL_SCHEMA_PROTO2_TO_PROTO3_UTIL_H_
+#define PROTOBUF_BENCHMARKS_UTIL_SCHEMA_PROTO2_TO_PROTO3_UTIL_H_
+
+#include "google/protobuf/message.h"
+#include "google/protobuf/descriptor.h"
+#include "google/protobuf/descriptor.pb.h"
+
+#include <sstream>
+#include <algorithm>
+
+using google::protobuf::Descriptor;
+using google::protobuf::DescriptorProto;
+using google::protobuf::FileDescriptorProto;
+using google::protobuf::FieldDescriptorProto;
+using google::protobuf::Message;
+using google::protobuf::EnumValueDescriptorProto;
+
+namespace google {
+namespace protobuf {
+namespace util {
+
+class SchemaGroupStripper {
+
+ public:
+  static void StripFile(const FileDescriptor* old_file,
+                        FileDescriptorProto *file) {
+    for (int i = file->mutable_message_type()->size() - 1; i >= 0; i--) {
+      if (IsMessageSet(old_file->message_type(i))) {
+        file->mutable_message_type()->DeleteSubrange(i, 1);
+        continue;
+      }
+      StripMessage(old_file->message_type(i), file->mutable_message_type(i));
+    }
+    for (int i = file->mutable_extension()->size() - 1; i >= 0; i--) {
+      auto field = old_file->extension(i);
+      if (field->type() == FieldDescriptor::TYPE_GROUP ||
+          IsMessageSet(field->message_type()) ||
+          IsMessageSet(field->containing_type())) {
+        file->mutable_extension()->DeleteSubrange(i, 1);
+      }
+    }
+  }
+
+ private:
+  static bool IsMessageSet(const Descriptor *descriptor) {
+    if (descriptor != nullptr
+        && descriptor->options().message_set_wire_format()) {
+      return true;
+    }
+    return false;
+  }
+
+  static void StripMessage(const Descriptor *old_message,
+                           DescriptorProto *new_message) {
+    for (int i = new_message->mutable_field()->size() - 1; i >= 0; i--) {
+      if (old_message->field(i)->type() == FieldDescriptor::TYPE_GROUP ||
+          IsMessageSet(old_message->field(i)->message_type())) {
+        new_message->mutable_field()->DeleteSubrange(i, 1);
+      }
+    }
+    for (int i = new_message->mutable_extension()->size() - 1; i >= 0; i--) {
+      auto field_type_name = new_message->mutable_extension(i)->type_name();
+      if (old_message->extension(i)->type() == FieldDescriptor::TYPE_GROUP ||
+          IsMessageSet(old_message->extension(i)->containing_type()) ||
+          IsMessageSet(old_message->extension(i)->message_type())) {
+        new_message->mutable_extension()->DeleteSubrange(i, 1);
+      }
+    }
+    for (int i = 0; i < new_message->mutable_nested_type()->size(); i++) {
+      StripMessage(old_message->nested_type(i),
+                   new_message->mutable_nested_type(i));
+    }
+  }
+
+};
+
+class SchemaAddZeroEnumValue {
+
+ public:
+  SchemaAddZeroEnumValue()
+      : total_added_(0) {
+  }
+
+  void ScrubFile(FileDescriptorProto *file) {
+    for (int i = 0; i < file->enum_type_size(); i++) {
+      ScrubEnum(file->mutable_enum_type(i));
+    }
+    for (int i = 0; i < file->mutable_message_type()->size(); i++) {
+      ScrubMessage(file->mutable_message_type(i));
+    }
+  }
+
+ private:
+  void ScrubEnum(EnumDescriptorProto *enum_type) {
+    if (enum_type->value(0).number() != 0) {
+      bool has_zero = false;
+      for (int j = 0; j < enum_type->value().size(); j++) {
+        if (enum_type->value(j).number() == 0) {
+          EnumValueDescriptorProto temp_enum_value;
+          temp_enum_value.CopyFrom(enum_type->value(j));
+          enum_type->mutable_value(j)->CopyFrom(enum_type->value(0));
+          enum_type->mutable_value(0)->CopyFrom(temp_enum_value);
+          has_zero = true;
+          break;
+        }
+      }
+      if (!has_zero) {
+        enum_type->mutable_value()->Add();
+        for (int i = enum_type->mutable_value()->size() - 1; i > 0; i--) {
+          enum_type->mutable_value(i)->CopyFrom(
+              *enum_type->mutable_value(i - 1));
+        }
+        enum_type->mutable_value(0)->set_number(0);
+        enum_type->mutable_value(0)->set_name("ADDED_ZERO_VALUE_" +
+                                              std::to_string(total_added_++));
+      }
+    }
+
+  }
+
+  void ScrubMessage(DescriptorProto *message_type) {
+    for (int i = 0; i < message_type->mutable_enum_type()->size(); i++) {
+      ScrubEnum(message_type->mutable_enum_type(i));
+    }
+    for (int i = 0; i < message_type->mutable_nested_type()->size(); i++) {
+      ScrubMessage(message_type->mutable_nested_type(i));
+    }
+  }
+
+  int total_added_;
+};
+
+}  // namespace util
+}  // namespace protobuf
+}  // namespace google
+
+#endif  // PROTOBUF_BENCHMARKS_UTIL_SCHEMA_PROTO2_TO_PROTO3_UTIL_H_