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

# -------------------------------------------------------------------
# build.properties.sample
#
# This is an example "build.properties" file, used to customize 
# building Jakarta Tomcat Connectors Util for your local environment.  
# Make any changes you need, and rename this file to 
# "build.properties" 
#
# $Id$
# -------------------------------------------------------------------


# -------------------------------------------------------------------
# CONFIGURATION OPTIONS
# -------------------------------------------------------------------

# 


# -------------------------------------------------------------------
# EXTERNAL DEPENDENCIES 
# -------------------------------------------------------------------

# ----- (optional) Java Secure Sockets Extension (JSSE), v1.0.2 or later -----
jsse.home=${base.path}/jsse1.0.2
jsse.lib=${jsse.home}/lib


# ----- (optional) PureTLS Extension -----
puretls.home=${base.path}/puretls-0.9b2
puretls.lib=${puretls.home}/build
puretls.jar=${puretls.lib}/puretls.jar
