<!--

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 Flex
Copyright 2014 The Apache Software Foundation

Apache Flex SDK Installer 3.0
1. Now uses external localized strings
2. Added support for install scripts based on Apache Ant

Apache Flex SDK Installer 2.7
1. Added support for OSMF2.0 [http://blogs.adobe.com/osmf/2012/03/osmf-2-0-now-available.html]
	From Apache Flex 4.11.0 onwards, support for OSMF2.0 has been added.  
2. The osmf.swf RSL now gets generated by the Installer.  

Apache Flex SDK Installer 2.6
Here is a list of significant issues that were fixed with this release:
1. Able to select which version of AIR and Flash Player to use.

Apache Flex SDK Installer 2.5

Issues addressed in this release:
Here is a list of significant issues that were fixed with this release:
1.  Enable Flex SDK download stats tracking
2.  https://issues.apache.org/jira/browse/FLEX-33426 (UI fix for license screen (show regular checkboxes))
3.  https://issues.apache.org/jira/browse/FLEX-33151 (Auto-update logic fix)
4.  French and Dutch language locale fixes.
5.  Added the SDK version number to be downloaded in the window title.
6.  https://issues.apache.org/jira/browse/FLEX-33202 (more issues).
7.  https://issues.apache.org/jira/browse/FLEX-33419 (added germain language).


Apache Flex SDK Installer 2.0
1.  If you have previously installed a release candidate (RC) version of  Apache Flex SDK Installer, you need to uninstall it first.  And then run the downloaded installer file.
2.  From Flex 4.9 onwards, the Text Layout Framework (TLF) is part of the Flex SDK.  So the installer does not download it separately anymore.
3.  By default, Apache Flex SDK Installer 2.0 downloads Adobe Flash Player 11.1 and Adobe AIR SDK 3.4.  If you want to change it to any other supported combination, save a copy
	of the config file found at: http://incubator.apache.org/flex/sdk-installer-config-2.0.xml, modify the download urls to point to the required versions.  Then run the app from command
	line mode with the optional command line parameter: -config=<path to config file>.  The new urls will be used to download the required dependencies.

Issues addressed in this release:
Here is a list of significant issues that were fixed with this release:
1.  https://issues.apache.org/jira/browse/FLEX-33214 (Fix UI of license screen)
2.  https://issues.apache.org/jira/browse/FLEX-33122 (Enable language switching)
	Available languages: English(US), English(AU), English(GB), Español (ES), Français, Greek, Nederlands and Português

Apache Flex Installer SDK 1.0

1.  If you have previously installed a pre-release version of  Apache Flex SDK Installer, you need to uninstall it first.  And then run the downloaded installer file.
