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

# If you choose to use this file, rename it to env.properties and uncomment the
# properties you wish to set.

# For each of
#
#   AIR_HOME
#   FLASHPLAYER_DEBUGGER
#   PLAYERGLOBAL_HOME
#   PIXELBENDER_HOME
#   ADOBE_EXTENSION_MANAGER
#
# you need to set an environment variable with that name or set the property here
# prefixed with "env.".  If a property is set in this file, and the corresponding 
# environment variable is also set, the property set here takes precedence over the 
# corresponding environment variable.
#
# Use absolute file paths. 
# 
# This is a Java property file.  On Windows if you use the '\' file 
# separator you must use "\\", but not escape spaces, for example,
#
#       env.FLASHPLAYER_DEBUGGER=z:\\tools\\player\\flashplayer_11_sa_debug_32bit.exe
#                      or
#       env.PIXELBENDER_HOME=C:\\Program Files (x86)\\Adobe\\Adobe Utilities - CS5\\Pixel Bender Toolkit 2
#
# See the README file for more information about the different variables.

#
# Set this to the directory that contains the unzipped Adobe AIR SDK for your
# platform.
#
#env.AIR_HOME=

#
# Set this to absolute path that contains the Adobe Flash Player content debugger
# for your platform.  
#
#env.FLASHPLAYER_DEBUGGER=

#
# PLAYERGLOBAL_HOME is a directory which contains one or more subdirectories.
# The name of each subdirectory corresponds to a supported target player version and
# in each of the subdirectories is the playerglobal.swc that corresponds to that target 
# player.  The default 
# 
# For this sample directory structure, set PLAYERGLOBAL_HOME to the full path of the
# player directory.
#
#       - player (dir)
#           - 11.1 (dir)
#               playerglobal.swc (file)
#
#env.PLAYERGLOBAL_HOME=

#
# Set this to the directory that contains the Adobe Pixel Bender Toolkit
# for your platform.
#
# On Windows (32-bit), if installed to the default location, the setting would be
#   env.PIXELBENDER_HOME=C:\\Program Files\\Adobe\\Adobe Utilities - CS5\\Pixel Bender Toolkit 2
#
# or on a 64-bit version of Windows
#	env.PIXELBENDER_HOME=C:\\Program Files (x86)\\Adobe\\Adobe Utilities - CS5\\Pixel Bender Toolkit 2
#
# Note: the folder "Program Files" (or "Program Files (x86)") might have a different name
# depending on the language of your Windows installation.
#
# On Mac, if installed to the default location, the setting would be
#   env.PIXELBENDER_HOME=/Applications/Utilities/Adobe Utilities-CS5.localized/Pixel Bender Toolkit 2/
#
#env.PIXELBENDER_HOME=

#
# Set this to the file that contains the Adobe Extension Manager CS5
# for your platform.  This is optional and is only required for those
# who need flash integration in order to build the MXP for the flash integration kit.
#
# On Windows (32-bit), if installed to the default location, the setting would be
#   env.ADOBE_EXTENSION_MANAGER=C:\\Program Files\\Adobe\\Adobe Extension Manager CS5\\Adobe Extension Manager CS5.exe
#
# or on a 64-bit version of Windows
#   env.ADOBE_EXTENSION_MANAGER=C:\\Program Files (x86)\\Adobe\\Adobe Extension Manager CS5\\Adobe Extension Manager CS5.exe
#
# Note: the folder "Program Files" (or "Program Files (x86)") might have a different name
# depending on the language of your Windows installation.
#
# On Mac, if installed to the default location, the setting would be
#   env.ADOBE_EXTENSION_MANAGER=/Applications/Adobe Extension Manager CS5/Adobe Extension Manager CS5.app/Contents/MacOS/Adobe Extension Manager CS5
#
#env.ADOBE_EXTENSION_MANAGER=

