.. 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.


SINGA团队
==============

一个成功的项目需要很多人扮演很多角色. 一些成员编写代码或文档, 而其他成员则作为测试人员提供补丁和建议.

指导
-------

==================   ============
姓名                 Email
==================   ============
Daniel Dai           daijy@apache.org
Ted Dunning          tdunning@apache.org
Alan Gates           gates@apache.org
Thejas Nair          thejas@apache.org
==================   ============


开发人员
----------

SINGA社区的开发者主要来自新加坡国立大学，浙江大学，网易，大阪大学，yzBigData等.

+--------------------+--------------------------------+-----------------------------------------------+
| 姓名               | Email                          | 组织		                          |
+====================+================================+===============================================+
| Gang Chen          | cg@zju.edu.cn                  | Zhejiang University                           |
+--------------------+--------------------------------+-----------------------------------------------+
| Haibo Chen         | hzchenhaibo@corp.netease.com   | NetEase                                       |
+--------------------+--------------------------------+-----------------------------------------------+
| Anh Dinh           | dinhtta@apache.org             | National University of Singapore              |
+--------------------+--------------------------------+-----------------------------------------------+
| Jinyang Gao        | jinyang@apache.org             | National University of Singapore              |
+--------------------+--------------------------------+-----------------------------------------------+
| Xing Ji            | jixin@comp.nus.edu.sg          | National University of Singapore              |
+--------------------+--------------------------------+-----------------------------------------------+
| Chonho Lee         | chonho@gmail.com               | Osaka University                              |
+--------------------+--------------------------------+-----------------------------------------------+
| Zhaojing Luo       | zhaojing@apache.org            | National University of Singapore              |
+--------------------+--------------------------------+-----------------------------------------------+
| Beng Chin Ooi      | ooibc@comp.nus.edu.sg          | National University of Singapore              |
+--------------------+--------------------------------+-----------------------------------------------+
| Kian-Lee Tan       | tankl@apache.org               | National University of Singapore              |
+--------------------+--------------------------------+-----------------------------------------------+
| Anthony K. H. Tung | atung@comp.nus.edu.sg          | National University of Singapore              |
+--------------------+--------------------------------+-----------------------------------------------+
| Ji Wang            | wangji@comp.nus.edu.sg         | National University of Singapore              |
+--------------------+--------------------------------+-----------------------------------------------+
| Sheng Wang         | wangsh@apache.org              | National University of Singapore              |
+--------------------+--------------------------------+-----------------------------------------------+
| Wei Wang           | wangwei@apache.org             | National University of Singapore              |
+--------------------+--------------------------------+-----------------------------------------------+
| Yuan Wang          | wangyuan@corp.netease.com      | NetEase                                       |
+--------------------+--------------------------------+-----------------------------------------------+
| Wenfeng Wu         | wuwf@comp.nus.edu.sg           | National University of Singapore              |
+--------------------+--------------------------------+-----------------------------------------------+
| Zhongle Xie        | zhongle@apache.org             | National University of Singapore              |
+--------------------+--------------------------------+-----------------------------------------------+
| Meihui Zhang       | meihui_zhang@sutd.edu.sg       | Singapore University of Technology and Design |
+--------------------+--------------------------------+-----------------------------------------------+
| Kaiping Zheng      | kaiping@apache.org             | National University of Singapore              |
+--------------------+--------------------------------+-----------------------------------------------+
| Moaz Reyad         | moaz@apache.org                | University of Genoa                           |
+--------------------+--------------------------------+-----------------------------------------------+
| Chang Yao          | yaochang2009@gmail.com         | yzBigdata                                     |
+--------------------+--------------------------------+-----------------------------------------------+
