	------
	Team
	------
	------

~~ Licensed to the Apache Software Foundation (ASF) under one
~~ or more contributor license agreements.  See the NOTICE file
~~ distributed with this work for additional information
~~ regarding copyright ownership.  The ASF licenses this file
~~ to you under the Apache License, Version 2.0 (the
~~ "License"); you may not use this file except in compliance
~~ with the License.  You may obtain a copy of the License at
~~
~~ http://www.apache.org/licenses/LICENSE-2.0

~~ Unless required by applicable law or agreed to in writing,
~~ software distributed under the License is distributed on an
~~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
~~ KIND, either express or implied.  See the License for the
~~ specific language governing permissions and limitations
~~ under the License.

Team

    A successful project requires many people to play many roles. Some members write code or documentation, while others are valuable as testers, submitting patches and suggestions.

    The team is comprised of Project Management Committee Members and Contributors. Members have direct access to the source of a project and actively evolve the code-base. Contributors improve the project through submission of patches and suggestions to the Members. The number of Contributors to the project is unbounded. Get involved today. All contributions to the project are greatly appreciated.

*Committers

*------------*--------------------------*---------------------------*
  <<ID>> ||         <<Full Name>>        ||       <<Affiliation(s)>>      |
*------------*--------------------------*---------------------------*
   weimer   |       Markus Weimer      |         Microsoft         |
*------------*--------------------------*---------------------------*
    motus   |     Sergiy Matusevych    |         Microsoft         |
*------------*--------------------------*---------------------------*
   juliaw   |        Julia Wang        |         Microsoft         |
*------------*--------------------------*---------------------------*
   shravan  | Shravan M Narayanamurthy |         Microsoft         |
*------------*--------------------------*---------------------------*
 yingdachen |        Yingda Chen       |         Microsoft         |
*------------*--------------------------*---------------------------*
   tmajest  |       Tony Majestro      |         Microsoft         |
*------------*--------------------------*---------------------------*
   sezgin   |       Beysim Sezgin      |         Microsoft         |
*------------*--------------------------*---------------------------*
  shulmanb  |       Boris Shulman      |         Microsoft         |
*------------*--------------------------*---------------------------*
   mariia   |     Mariia Mykhailova    |         Microsoft         |
*------------*--------------------------*---------------------------*
  afchung90 |       Andrew Chung       |         Microsoft         |
*------------*--------------------------*---------------------------*
   dhruv    |       Dhruv Mahajan      |         Microsoft         |
*------------*--------------------------*---------------------------*
  cdouglas  |      Chris Douglas       |         Microsoft         |
*------------*--------------------------*---------------------------*
   anupam   |        Anupam            |         Microsoft         |
*------------*--------------------------*---------------------------*
  rgardler  |      Ross Gardler        |         Microsoft         |
*------------*--------------------------*---------------------------*
  mattmann  |     Chris Mattmann       |         Jet Propulsion Laboratory         |
*------------*--------------------------*---------------------------*
   omalley  |      Owen O'Malley       |         HortonWorks         |
*------------*--------------------------*---------------------------*
    sears   |       Russell Sears      |        Purestorage        |
*------------*--------------------------*---------------------------*
    jrlee   |      Jung Ryong Lee      |         SK Telecom        |
*------------*--------------------------*---------------------------*
  jerryjung |       You Sun Jung       |         SK Telecom        |
*------------*--------------------------*---------------------------*
  dongjoon  |      Dongjoon Hyun       |           Apple           |
*------------*--------------------------*---------------------------*
  joshrosen |        Josh Rosen        |        UC Berkeley        |
*------------*--------------------------*---------------------------*
   tcondie  |       Tyson Condie       |            UCLA           |
*------------*--------------------------*---------------------------*
   bmyers   |       Brandon Myers      |     University of Iowa    |
*------------*--------------------------*---------------------------*
  yunseong  |       Yunseong Lee       | Seoul National University |
*------------*--------------------------*---------------------------*
  taegeonum |        Taegeon Um        | Seoul National University |
*------------*--------------------------*---------------------------*
  johnyangk |      Youngseok Yang      | Seoul National University |
*------------*--------------------------*---------------------------*
  chobrian  |         Brian Cho        | Seoul National University |
*------------*--------------------------*---------------------------*
   bgchun   |      Byung-Gon Chun      | Seoul National University |
*------------*--------------------------*---------------------------*
    gwlee   |        Gyewon Lee        | Seoul National University |
*------------*--------------------------*---------------------------*
   jsjason  |  Joo Seong (Jason) Jeong | Seoul National University |
*------------*--------------------------*---------------------------*
   gwkim    |       Geon-Woo Kim       | Seoul National University |
*------------*--------------------------*---------------------------*
    ssd     |     Sergey Dudoladov     | Technische Universität Berlin |
*------------*--------------------------*---------------------------*
 dougservice|      Doug Service        |         Microsoft          |
*------------*--------------------------*---------------------------*
