#
#   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.
#
Apache Directory Fortress Realm

The purpose of this NOTICE.txt file is to include notices that are required by the copyright owner and their license. Some of the accompanying products have an attribution requirement, so see below. Other accompanying products do not require attribution, so are not listed. 

This product includes software developed by:

1. The Apache Software Foundation (http://www.apache.org/)
2. The Eigenbase Project (http://www.eigenbase.org/)
3. JUnit.org (http://www.junit.org/)
4. The Java Community Process (http://www.jcp.org/)
5. SLF4J (http://www.slf4j.org/)
6. Terracotta (http://www.terracotta.org/TPL)
