This file contains a list of people who have made large contributions
to the public version of Protocol Buffers.

Original Protocol Buffers design and implementation:
  Sanjay Ghemawat <sanjay@google.com>
  Jeff Dean <jeff@google.com>
  Daniel Dulitz <daniel@google.com>
  Craig Silverstein
  Paul Haahr <haahr@google.com>
  Corey Anderson <corin@google.com>
  (and many others)

Proto2 C++ and Java primary author:
  Kenton Varda <kenton@google.com>

Proto2 Python primary authors:
  Will Robinson <robinson@google.com>
  Petar Petrov <petar@google.com>

Java Nano primary authors:
  Brian Duff <bduff@google.com>
  Tom Chao <chaot@google.com>
  Max Cai <maxtroy@google.com>
  Ulas Kirazci <ulas@google.com>

Large code contributions:
  Jason Hsueh <jasonh@google.com>
  Joseph Schorr <jschorr@google.com>
  Wenbo Zhu <wenboz@google.com>

Large quantity of code reviews:
  Scott Bruce <sbruce@google.com>
  Frank Yellin
  Neal Norwitz <nnorwitz@google.com>
  Jeffrey Yasskin <jyasskin@google.com>
  Ambrose Feinstein <ambrose@google.com>

Documentation:
  Lisa Carey <lcarey@google.com>

Maven packaging:
  Gregory Kick <gak@google.com>

Patch contributors:
  Kevin Ko <kevin.s.ko@gmail.com>
    * Small patch to handle trailing slashes in --proto_path flag.
  Johan Euphrosine <proppy@aminche.com>
    * Small patch to fix Python CallMethod().
  Ulrich Kunitz <kune@deine-taler.de>
    * Small optimizations to Python serialization.
  Leandro Lucarella <llucax@gmail.com>
    * VI syntax highlighting tweaks.
    * Fix compiler to not make output executable.
  Dilip Joseph <dilip.antony.joseph@gmail.com>
    * Heuristic detection of sub-messages when printing unknown fields in
      text format.
  Brian Atkinson <nairb774@gmail.com>
    * Added @Override annotation to generated Java code where appropriate.
  Vincent Choinière <Choiniere.Vincent@hydro.qc.ca>
    * Tru64 support.
  Monty Taylor <monty.taylor@gmail.com>
    * Solaris 10 + Sun Studio fixes.
  Alek Storm <alek.storm@gmail.com>
    * Slicing support for repeated scalar fields for the Python API.
  Oleg Smolsky <oleg.smolsky@gmail.com>
    * MS Visual Studio error format option.
    * Detect unordered_map in stl_hash.m4.
  Brian Olson <brianolson@google.com>
    * gzip/zlib I/O support.
  Michael Poole <mdpoole@troilus.org>
    * Fixed warnings about generated constructors not explicitly initializing
      all fields (only present with certain compiler settings).
    * Added generation of field number constants.
  Wink Saville <wink@google.com>
    * Fixed initialization ordering problem in logging code.
  Will Pierce <willp@nuclei.com>
    * Small patch improving performance of in Python serialization.
  Alexandre Vassalotti <alexandre@peadrop.com>
    * Emacs mode for Protocol Buffers (editors/protobuf-mode.el).
  Scott Stafford <scott.stafford@gmail.com>
    * Added Swap(), SwapElements(), and RemoveLast() to Reflection interface.
  Alexander Melnikov <alm@sibmail.ru>
    * HPUX support.
  Oliver Jowett <oliver.jowett@gmail.com>
    * Detect whether zlib is new enough in configure script.
    * Fixes for Solaris 10 32/64-bit confusion.
  Evan Jones <evanj@mit.edu>
    * Optimize Java serialization code when writing a small message to a stream.
    * Optimize Java serialization of strings so that UTF-8 encoding happens only
      once per string per serialization call.
    * Clean up some Java warnings.
    * Fix bug with permanent callbacks that delete themselves when run.
  Michael Kucharski <m.kucharski@gmail.com>
    * Added CodedInputStream.getTotalBytesRead().
  Kacper Kowalik <xarthisius.kk@gmail.com>
    * Fixed m4/acx_pthread.m4 problem for some Linux distributions.
  William Orr <will@worrbase.com>
    * Fixed detection of sched_yield on Solaris.
    * Added atomicops for Solaris
  Andrew Paprocki <andrew@ishiboo.com>
    * Fixed minor IBM xlC compiler build issues
    * Added atomicops for AIX (POWER)
  Nipunn Koorapati <nipunn1313@gmail.com>
    * Provide a type alias field ValueType on EnumTypeWrapper
    * Match service argument names to abstract interface


