Apache Flex
Copyright 2014 The Apache Software Foundation

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

The Initial Developer of the Original Code, known as Adobe Flex, is Adobe
Systems Incorporated (http://www.adobe.com/).
    Copyright 2003 - 2012 Adobe Systems Incorporated. All Rights Reserved.

The asc compiler contains code written by Jeff Dyer at: 
    Copyright Mountain View Compiler Company (1998-2003).

The easing equations in the mx tween class are based on code written by Robert
Penner.
    Copyright 2001 Robert Penner. All rights reserved.

The Batik SVG toolkit source contains code from the World Wide Web Consortium
(W3C) for the Document Object Model API (DOM API) and SVG Document Type
Definition (DTD).

The Batik SVG toolkit source contains code from the International Organisation
for Standardization for the definition of character entities used in the
software's documentation.

The Open Source Media Framework used by the video components is licensed under
the Mozilla Public License Version 1.1. The source code can be found here:
    http://sourceforge.net/projects/osmf.adobe/files/OSMF%201.0%20%28final%20source%2C%20ASDocs%2C%20PDF%20guides%2C%20and%20release%20notes%29/OSMF_1.0.zip
