##
## 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.
##
## $Date$ $Rev$
##
// ------------------------------------------------------------------
// NOTICE file corresponding to the section 4d of The Apache License,
// Version 2.0, in this case for #if ($projectName)$projectName#else${project.name}#end

// ------------------------------------------------------------------

#if ($projectName)$projectName#else${project.name}#end

Copyright ${projectTimespan}#if($project.organization.name) $project.organization.name#else The Apache Software Foundation#end


This product includes software developed at
Apache Software Foundation (http://www.apache.org/).

#if($preProjectText)
$preProjectText
#end

#if($includeProjectDependencies)
#foreach ( $organizationName in $projectsSortedByOrganization.keySet() )
This product includes/uses software(s) developed by '$organizationName.name'#if($organizationName.url) ($organizationName.url)#end

#foreach ( $project in $projectsSortedByOrganization.get( $organizationName ) )
  - $project.name#if ($addVersion) (version $project.version)#end#if ($addArtifact) ($project.artifact)#end#if($project.url) ($project.url)#end
#if ($addLicense)#foreach ( $license in $project.licenses)

      License: $license.name #if ($license.url) ($license.url)#end
#end
#end
    
#end
    
#end
    
#end

#if($postProjectText)
$postProjectText
#end
