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


The SINGA 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 SINGA community has developers mainly from National University of Singapore, Zhejiang University, NetEase, Osaka University, yzBigData, etc.

PMC
---

+--------------------+--------------------------------+-----------------------------------------------+
| Name               | Email                          | Organization                                  |
+====================+================================+===============================================+
| Anh Dinh           | dinhtta@apache.org             | Singapore University of Technology and Design |
+--------------------+--------------------------------+-----------------------------------------------+
| Alan Gates         | gates@apache.org               | Apache Software Foundation                    |
+--------------------+--------------------------------+-----------------------------------------------+
| Beng Chin Ooi      | ooibc@apache.org               | National University of Singapore              |
+--------------------+--------------------------------+-----------------------------------------------+
| Gang Chen          | cg@apache.org                  | Zhejiang University                           |
+--------------------+--------------------------------+-----------------------------------------------+
| Jinyang Gao        | jinyang@apache.org             | DAMO Academy, Alibaba Group                   |
+--------------------+--------------------------------+-----------------------------------------------+
| Kaiping Zheng      | kaiping@apache.org             | National University of Singapore              |
+--------------------+--------------------------------+-----------------------------------------------+
| Kian-Lee Tan       | tankianlee@apache.org          | National University of Singapore              |
+--------------------+--------------------------------+-----------------------------------------------+
| Moaz Reyad         | moaz@apache.org                | Université Grenoble Alpes                     |
+--------------------+--------------------------------+-----------------------------------------------+
| Ted Dunning        | tdunning@apache.org            | Apache Software Foundation                    |
+--------------------+--------------------------------+-----------------------------------------------+
| Thejas Nair        | thejas@apache.org              | Apache Software Foundation                    |
+--------------------+--------------------------------+-----------------------------------------------+
| Wei Wang           | wangwei@apache.org             | National University of Singapore              |
+--------------------+--------------------------------+-----------------------------------------------+
| Zhaojing Luo       | zhaojing@apache.org            | National University of Singapore              |
+--------------------+--------------------------------+-----------------------------------------------+
| Zhongle Xie        | zhongle@apache.org             | Hangzhou MZH Technologies                     |
+--------------------+--------------------------------+-----------------------------------------------+

Committers
----------

+--------------------+--------------------------------+-----------------------------------------------+
| Name               | Email                          | Organization                                  |
+====================+================================+===============================================+
| Chonho Lee         | chonho@apache.org              | Osaka University                              |
+--------------------+--------------------------------+-----------------------------------------------+
| Sheng Wang         | wangsh@apache.org              | DAMO Academy, Alibaba Group                   |
+--------------------+--------------------------------+-----------------------------------------------+
| Wanqi Xue          | xuewanqi@apache.org            | National University of Singapore              |
+--------------------+--------------------------------+-----------------------------------------------+
| Xiangrui Cai       | caixr@apache.org               | National University of Singapore              |
+--------------------+--------------------------------+-----------------------------------------------+

Contributors
------------

+--------------------+--------------------------------+-----------------------------------------------+
| Name               | Email                          | Organization                                  |
+====================+================================+===============================================+
| Haibo Chen         | hzchenhaibo@corp.netease.com   | NetEase                                       |
+--------------------+--------------------------------+-----------------------------------------------+
| Xin Ji             | jixin@comp.nus.edu.sg          | Visenze, Singapore                            |
+--------------------+--------------------------------+-----------------------------------------------+
| Anthony K. H. Tung | atung@comp.nus.edu.sg          | National University of Singapore              |
+--------------------+--------------------------------+-----------------------------------------------+
| Ji Wang            | wangji@comp.nus.edu.sg         | Hangzhou MZH Technologies                     |
+--------------------+--------------------------------+-----------------------------------------------+
| Yuan Wang          | wangyuan@corp.netease.com      | NetEase                                       |
+--------------------+--------------------------------+-----------------------------------------------+
| Wenfeng Wu         | wuwf@comp.nus.edu.sg           | Freelancer, China                             |
+--------------------+--------------------------------+-----------------------------------------------+
| Meihui Zhang       | meihui_zhang@sutd.edu.sg       | Beijing Institute of Technology               |
+--------------------+--------------------------------+-----------------------------------------------+
| Chang Yao          | yaochang2009@gmail.com         | Hangzhou MZH Technologies                     |
+--------------------+--------------------------------+-----------------------------------------------+

