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

-->
<assembly>
<!-- We deliberately don't specify an ID here, because during the assembly process we don't want the
		bin assembly to have any suffix on its name. Other assemblies need their Id suffixed, but this one
		doesn't 
		<id>bin</id> -->
	<id>bin</id>
    <formats>
		<format>zip</format>
		<format>tar.gz</format>
	</formats>
	<includeSiteDirectory>true</includeSiteDirectory>
	<dependencySets>
	   <dependencySet/>
	</dependencySets>
	<fileSets>
		<fileSet>
			<includes>
				<include>LICENSE</include>
				<include>NOTICE</include>
				<include>build.xml</include>
				<include>pom.xml</include>
				<include>src/**</include>
			</includes>
		</fileSet>
		<fileSet>
			<directory>target</directory>
			<outputDirectory>.</outputDirectory>
			<includes>
				<include>apache-chainsaw-${project.version}.jar</include>
			</includes>
		</fileSet>
	</fileSets>
	
</assembly>
