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

report.team-list.intro.description2 = The team is comprised of the PMC, \
Committers and Contributors. The PMC (project management committee) is a\
committee of the Apache Software Foundation charged with responsibility \
for a top level project. Committers have direct access to the source of \
a project and actively evolve the code-base. Contributors improve the \
project in various ways such as submission of patches, improving \
documentation, testing the product and by providing suggestions to the \
Committers. The number of Contributors to the project is unbounded. Get \
involved today. All contributions to the project are greatly appreciated.
report.team-list.nocontributor = The contributors to this project can be\
 tracked by looking at the <a href="https://issues.apache.org/jira/browse/TEZ" \
class="externalLink">Apache Tez JIRAi website</a>.
