Note: There are multiple End User License Agreements in this document. Please read to the end:

IMPORTANT - READ BEFORE COPYING, INSTALLING OR USING.
Do not copy, install, distribute, publicly display, or use the Materials (as
defined below) provided under this license agreement ("Agreement") until you
("You" or "Your") have carefully read and agreed to the following terms and
conditions.

This Agreement forms a legally binding contract between You and Intel
Corporation ("Intel") regarding Your use of the Materials.  By copying,
installing, distributing, publicly displaying, or otherwise using the Materials,
You agree to be bound by the terms of this Agreement.  If You do not agree to
the terms of this Agreement, do not copy, install, distribute, publicly display,
or use the Materials.

If You are agreeing to the terms and conditions of this Agreement on behalf of a
company or other legal entity, You represent and warrant that You have the legal
authority to bind that legal entity to the Agreement, in which case, "You" or
"Your" will mean such entity.

Third Party Programs (as defined below), even if included with the distribution
of the Materials, are governed by separate third party license terms, including
without limitation, open source software license terms. Such third party license
terms (and not this Agreement) govern Your use of the Third Party Programs, and
Intel is not liable for the Third Party Programs.

End User License Agreement for the Intel(R) Software Development Products
                            (Version March 2015)


1. LICENSE DEFINITIONS:

   A. "Confidential Information" means all Materials (as defined below),
   including without limitation, any Pre-Release Materials, that are identified
   (in the product release notes, on Intel's download website for the Materials
   or elsewhere) or labeled as Intel confidential information or a similar
   legend.

   B. "Excluded License" means a license that requires, as a condition of use,
   modification, or distribution, that the licensed software or other software
   incorporated into, derived from or distributed with such software (a) be
   disclosed or distributed in Source Code form; (b) be licensed by the user to
   third parties for the purpose of making and/or distributing derivative works;
   or (c) be redistributable at no charge.  Excluded Licenses include, without
   limitation, licenses that license or distribute software under any of the
   following licenses or distribution models, or licenses or distribution models
   substantially similar to any of the following: (a) GNU's General Public
   License (GPL) or Lesser/Library GPL (LGPL), (b) the Artistic License (e.g.,
   PERL), (c) the Mozilla Public License, (d) the Netscape Public License, (e)
   the Sun Community Source License (SCSL), (f) the Sun Industry Source License
   (SISL), and (g) the Common Public License (CPL).
   
   C. "IPP Sample Source" is the Source Code file(s) that: (i) demonstrates
   certain limited functions included in the binary libraries of the Intel(R)
   Integrated Performance Primitives ("Intel(R) IPP"); (ii) is identified as
   Intel IPP sample source code; (iii) is obtained separately from Intel after
   You register Your copy of the Intel(R) IPP product with Intel; and (iv) is
   subject to all of the terms and conditions of this Agreement.
   
   D. "Licensed Patent Claims" means the claims of Intel's patents that are
   necessarily and directly infringed by the reproduction and distribution of
   the Materials that is authorized in Section 2 below, when the Materials is in
   its unmodified form as delivered by Intel to You and not modified or combined
   with anything else.  Licensed Patent Claims are only those claims that Intel
   can license without paying, or getting the consent of, a third party.
   
   E. "Materials" are defined as the software, documentation, the software
   product serial number and license key codes (if applicable), and other
   materials, including any modifications, updates and upgrades thereto, that
   are provided to You under this Agreement.  Materials also include any
   Redistributables, Source Code, and Pre-Release Materials, as defined below
   but do not include Third Party Programs.
   
   F. "Microsoft Platforms" means any current and future Microsoft operating
   system products, Microsoft run-time technologies (such as the .NET
   Framework), and Microsoft application platforms (such as Microsoft Office or
   Microsoft Dynamics) that Microsoft offers.
   
   G. "Redistributables" are the files listed in the following text files that
   may be included in the Materials for the applicable Intel Software
   Development Product: clredist.txt, credist.txt, fredist.txt, redist.txt, and
   redist-rt.txt.
   
   H. "Sample Source Code" is those portions of the Materials that are Source
   Code files and are identified as sample source code, including without
   limitation, the IPP Sample Source.

   I. "Source Code" is defined as the software (and not documentation or text)
   portion of the Materials provided in human readable format, and includes
   modifications that You make or are made on Your behalf as expressly permitted
   under the terms of this Agreement.
   
   J. "Third Party Programs" (if any) are the files listed in the
   "third-party-programs.txt" text file that may be included in the Materials
   for the applicable software.
   
   K. "Your Product" means one or more applications or products developed by or
   for You using the Materials.
   

2. CONSENT.  You agree that Intel, its subsidiaries or suppliers may collect and
use technical and related information, including but not limited to the software
product serial number, technical information about Your computer, system and
application software, and peripherals, that is gathered periodically to
facilitate the provision of software updates, product support and other services
to You (if any) related to the Materials, and to verify compliance with the
terms of this Agreement.  Intel may use this information, as long as it is in a
form that does not personally identify You, to improve our products or to
develop and provide services or technologies.

3. LICENSE GRANT:

3.1 Subject to the terms and conditions of this Agreement, and timely
payment of any fees (if applicable), Intel grants You a non-exclusive,
worldwide, perpetual, non-assignable (except as expressly permitted hereunder),
limited right and license:

A. under its copyrights, to:

   (1)     reproduce internally copies of the Materials for your internal use in
   accordance with the applicable license rights and restrictions specified in
   Section 4.D below; provided, however, that this license does not include the
   right to sublicense and may only be exercised by You or Your employees and
   only within Your facilities;

   (2)     use the Materials solely for Your internal use to develop Your
   Product, in accordance with the applicable license rights and restrictions
   specified in Section 4.D below and the documentation or text files included
   as part of the Materials; provided, however, that this license does not
   include the right to sublicense and may only be exercised by You or Your
   employees and only within Your facilities;

   (3)     modify or create derivative works of the Materials, or any portions
   thereof, that are provided in Source Code form, provided, however, that this
   license does not include the right to sublicense and may be exercised only by
   You or Your employees and only within Your facilities;
   
   (4)     publicly perform, display, and distribute (directly and through Your
   distributors, resellers and other channel partners) or otherwise make
   publicly available the Redistributables, including any modifications to or
   derivative works of the Redistributables made pursuant to Section 3.1.A(3),
   or any portions thereof, subject to the following restrictions:
   
      (i)     any distribution of the Redistributables must only be as part of
      Your Product which must add significantly more functionality than the
      Redistributables themselves;
   
      (ii)    any additional restrictions which may appear in the
      Redistributables text files specified in Section 1.G above and in
      Section 4 below; and
    
      (iii)   the license under Section 3.1.A(4) includes the right to
      sublicense the Redistributables, but the sublicense rights are
      limited to sublicensing of any Intel copyrights in the
      Redistributables and only to the extent necessary to perform,
      display, and distribute the Redistributables (including Your
      modifications and derivative works thereto) solely as incorporated
      in Your Product. IF YOU RECEIVED THE MATERIALS FOR EVALUATION,
      HOWEVER, YOU HAVE NO RIGHTS TO DISTRIBUTE THE REDISTRIBUTABLES,
      INCLUDING WITHOUT LIMITATION, ANY PORTIONS, MODIFICATIONS OR
      DERIVATIVE WORKS.
      ; and

B.	under Intel's Licensed Patent Claims, to:

   (1)	make copies of the Materials internally only;

   (2)	use the Materials internally only; and

   (3)  offer to distribute, and distribute, but not sell, the
   Redistributables only as part of Your Product, under Intel's copyright
   license granted in Section 3.1(A), but only under the terms of that copyright
   license and not as a sale (but this right does not include the right to
   sub-license);

   (4)  provided, further, that the license under the Licensed Patent Claims
   does not and will not apply to any modifications to, or derivative works of,
   the Materials, whether made by You, Your customer (which, for all purposes
   under this Agreement, will mean either a customer, reseller, distributor or
   other channel partner), or any third party even if the modification and
   derivative works are permitted under 3.1(A)(3).

3.2 If the Materials You receive are packaged, as a single orderable item
(i.e., as a single SKU), with hardware that includes one or more Intel
manufactured microprocessors ("Intel Target Hardware"), then the licenses
granted in Section 3.1 above are restricted to the sole purpose of producing and
releasing Your Product to execute on computer systems that include the same or
new versions of the Intel manufactured microprocessor included in the Intel
Target Hardware.

Intel expressly does not grant You a patent license in this Agreement to any
modifications or derivative works of the Materials, whether made by You, Your
contractor, Your customer, or any other third party in creating the derivative
works even to the extent creation of derivative works is permitted under Section
3.1(A)(3) above.


4. LICENSE CONDITIONS:

   A. If You are an entity, each of Your employees and Your contractors may use
   the Materials as specified in Section 3 above, provided: (i) their use of the
   Materials is solely on behalf of and in support of Your business, (ii) they
   agree to the terms and conditions of this Agreement, and (iii) You are solely
   responsible for their use of the Materials.

   B. If Your Product is a software development library, then attribution (if
   any), as specified in the product release notes of the corresponding
   Materials shall be displayed prominently in Your Product's associated
   documentation and on the web site (if any) for Your Product.
   
   C. If You receive Your first copy of the Materials electronically, and a
   second copy on media, then you may use the second copy only in accordance
   with Your applicable license stated in this Agreement, or for backup or
   archival purposes.  You may not provide the second copy to another user.
   
   D. Except as expressly provided in this Agreement, You may NOT:  (i) use,
   copy, distribute, or publicly display the Materials; (ii) rent or lease the
   Materials to any third party; (iii) assign this Agreement or transfer the
   Materials; (iv) modify, adapt, or translate the Materials in whole or in
   part; (v) reverse engineer, decompile, or disassemble the Materials; (vi)
   attempt to modify or tamper with the normal function of any license manager
   that may regulate usage of the Materials; (vii) distribute, sublicense or
   transfer the Source Code form of any components of the Materials or
   derivatives thereof to any third party; (viii) distribute Redistributables
   except as part of a larger program that adds significant primary
   functionality different from that of the Redistributables; (ix) distribute
   the Redistributables to run on a platform other than a Microsoft Platform if
   according to the accompanying user documentation the Materials are meant to
   execute only on a Microsoft Platform; (x) include the Redistributables in
   malicious, deceptive, or unlawful programs or products; or (xi) modify,
   create a derivative work, link, or distribute the Materials so that any part
   of it becomes subject to an Excluded License.
   
   E. The scope and term of Your license depends on the type of license You are
   provided by Intel.  The variety of license types are set forth below, which
   may not be available for all "Intel(R) Software Development Products" and
   therefore may not apply to the particular Materials You are licensing.  For
   more information on the types of licenses, please contact Intel or Your sales
   representative.
   
   i. PRE-RELEASE LICENSE: If the Materials, or portions thereof, are identified
   (in the product release notes, on Intel's download website for the Materials
   or elsewhere) or labeled as pre-release ("Pre-Release Materials"), (a) the
   Pre-Release Materials are deemed to be pre-release code (e.g., alpha or beta
   release, etc.), which may not be fully functional and which Intel may
   substantially modify in development of a  commercial version, and for which
   Intel makes no assurances that it will ever develop or make generally
   available a commercial version,and (b) You have the right to use the
   Pre-Release Materials only for the duration of the pre-release term, which is
   specified in the product release notes, on Intel's download website for the
   Materials or elsewhere, or until the commercial release, if any, of the
   Pre-Release Materials, whichever is shorter, and (c) Your right to use the
   Pre-Release Material is also restricted to the license type (i.e., Evaluation
   License, Named-User License, Floating License, specified below) issued to You
   for the Pre-Release Materials.
   
   ii. EVALUATION LICENSE: If You obtained the Materials pursuant to an
   evaluation license, You may use the Materials only for internal evaluation
   purposes and only for the term of the evaluation period, as specified on
   Intel's download website or which may be controlled by the license key for
   the Materials.  NOTWITHSTANDING ANYTHING TO THE CONTRARY ELSEWHERE IN THIS
   AGREEMENT, YOU MAY NOT DISTRIBUTE ANY PORTION OF THE MATERIALS, AND THE
   APPLICATION AND/OR PRODUCT DEVELOPED BY YOU MAY ONLY BE USED FOR EVALUATION
   PURPOSES AND ONLY FOR THE TERM OF THE EVALUATION.  You may install copies of
   the Materials on a reasonable number of computers to conduct Your evaluation
   provided that You are the only individual using the Materials and only one
   copy of the Materials is in use at any one time.  A separate license key is
   required for each additional use and/or individual user in all other cases,
   including without limitation, use by persons, computer systems, and other use
   methods known now and in the future.  Intel may provide You with a license
   key that enables the Materials for an evaluation license.  If You are an
   entity, Intel grants You the right to designate one individual within Your
   organization to have the sole right to use the Materials in the manner
   provided above.
   
   iii. NONCOMMERCIAL USE LICENSE:  If You obtained the Materials under a
   noncommercial use license, You may use the Materials only for non-commercial
   use where You receive no fee, salary or any other form of compensation.  The
   Materials may not be used for any other purpose, whether "for profit" or "not
   for profit."  Any work performed or produced as a result of use of the
   Materials cannot be performed or produced for the benefit of other parties
   for a fee, compensation or any other reimbursement or remuneration.  You may
   install copies of the Materials on an unlimited number of computers provided
   that You are the only individual using the Materials and only one copy of the
   Materials is in use at any one time.  A separate license is required for each
   additional use and/or individual user in all other cases, including without
   limitation, use by persons, computer systems, and other methods of use known
   now and in the future.  Intel will provide You with a license key that
   enables the Materials for a noncommercial-use license.  If You obtained a
   time-limited noncommercial-use license, the duration (time period) of Your
   license and Your ability to use the Materials is limited to the time period
   of the obtained license, which is specified on Intel's download website,
   specified in the applicable documentation or controlled by the license key
   for the Materials.
   
   iv. NAMED-USER LICENSE: If You obtained the Materials under a named-user
   license, You may allow only one (1) individual to install and use the
   Materials on no more than three (3) computers provided that same individual
   is using the Materials only on one (1) computer at a time.  If You obtained a
   time-limited named-user license, the term of Your license and your ability to
   use the Materials is limited to the time period of the obtained license,
   which is specified on Intel's download website, specified in the applicable
   documentation or controlled by the license key for the Materials.
   
   v. NODE-LOCKED LICENSE: If You obtained the Materials under a node-locked
   license, You may use the Materials only on a single designated computer by no
   more than the authorized number of concurrent users. If You obtained a
   time-limited node-locked license, the term of Your license and Your ability
   to use the Materials is limited to the time period of the obtained license,
   which is specified on Intel's download website, specified in the applicable
   documentation or controlled by the license key for the Materials.
   
   vi. FLOATING LICENSE: If You obtained the Materials under a floating license,
   you may (a) install the Materials on an unlimited number of computers that
   are connected to the designated network and (b) use the Material by no more
   than the authorized number of concurrent individual users.  If You obtained a
   time-limited Floating license key, the term of Your license and Your ability
   to use the Materials is limited to the time period of the obtained license,
   which is specified on Intel's download website, specified in the applicable
   documentation or controlled by the license key for the Materials.
   
   F. DISTRIBUTION:  Distribution of the Redistributables is also subject to the
   following limitations:  You (i) will be solely responsible to Your customers for
   any update, support obligation or other liability which may arise from the
   distribution, (ii) will not make any statement that Your Product is "certified"
   or that its performance is guaranteed by Intel, (iii) will not use Intel's name
   or trademarks to market Your Product without written permission from Intel, (iv)
   will provide a license agreement with distribution of the Redistributables that
   prohibits disassembly and reverse engineering of the Redistributables, (v) will
   indemnify, hold harmless, and defend Intel and its suppliers from and against
   any claims or lawsuits, including attorney's fees, that arise or result from
   Your modifications, derivative works or Your distribution of Your Product.
   
   G. INTEL(R) INTEGRATED PERFORMANCE PRIMITIVES ("INTEL IPP"). The following terms
   and conditions apply only to the Intel IPP.
   
   i. Notwithstanding anything in this Agreement to the contrary, if You
   implement Intel IPP Sample Source Code in Your Product or if You use Intel
   IPP to implement algorithms that are the intellectual property of third
   parties, then you may need additional licenses from such entities.Should any
   such additional licenses be required, You are solely responsible for
   obtaining any such licenses and agree to obtain any such licenses at Your own
   expense.

   ii. Notwithstanding anything herein to the contrary, a valid license to Intel
   IPP is a prerequisite to any license for Intel IPP Sample Source Code, and
   possession of Intel IPP Sample Source Code does not grant any license to
   Intel IPP (or any portion thereof).  To access Intel IPP Sample Source Code,
   You must first register Your licensed copy of the Intel IPP with Intel.  By
   downloading, installing or copying any Intel IPP Sample Source Code file, You
   agree to be bound by terms of this Agreement.
   
   H. MEDIA FORMAT CODECS AND DIGITAL RIGHTS MANAGEMENT. You acknowledge and agree
   that your use of the Materials or distribution of the Materials with Your
   Product as permitted by this license may require you to procure license(s) from
   one or more third parties that may hold intellectual property rights applicable
   to any media decoding, encoding or transcoding technology (such as, for example,
   through use of an audio or video codec) and/or digital rights management
   capabilities of the Materials, if any.  Should any such additional licenses be
   required, You are solely responsible for obtaining any such licenses and agree
   to obtain any such licenses at Your own expense.
   
   I. MATERIALS TRANSFER:  Except for the Pre-Release Licenses or Evaluation
   Licenses or Non-Commercial Licenses, as specified above, You may permanently
   transfer the Materials you received pursuant to a license type listed in Section
   4(D) above, and all of Your rights under this Agreement, to another party
   ("Recipient") solely in conjunction with a change of ownership, merger,
   acquisition, sale or transfer of all or substantially all of Your business or
   assets, either voluntarily, by operation of law or otherwise subject to the
   following: You must notify Intel of the transfer by sending a letter to Intel
   (i) identifying the legal entities of Recipient and You, (ii) identifying the
   Materials (i.e., the specific Intel software and version) and the associated
   serial numbers to be transferred, (iii) certifying that You retain no copies of
   the Materials or portions thereof, (iv) certifying that the Recipient has agreed
   in writing to be bound by all of the terms and conditions of this Agreement, (v)
   certifying that the Recipient has been notified that in order to receive support
   from Intel for the Materials they must notify Intel in writing of the transfer
   and provide Intel with the information specified in subsection (ii) above along
   with the name and email address of the individual assigned to use the Materials,
   and (vi) providing Your email address so that Intel may confirm receipt of Your
   letter.  Please send such letter to:

Intel Corporation
2111 NE 25th Avenue
Hillsboro, OR 97124
Attn: DPD Contracts Management, JF1-15

5. PRIVACY:

   A. Data Collection:  Intel has collected or will collect certain personal
   information from You in order to inform You of updates to the Materials, based
   on the personal information collected when You registered the license to the
   Materials with Intel.
   
   B. Revoking Consent to Data Collection:  You can revoke Your consent to this
   collection of personal information at any time by clicking on the link to
   "unsubscribe" at the bottom of any communication from Intel related to the
   Materials which will allow You to opt-out of receiving future messages related
   to the Materials.
   
   C. Intel's Privacy Notice:  Intel is committed to respecting Your privacy. To
   learn more about Intel's privacy practices, please visit
   http://www.intel.com/privacy.

6. OWNERSHIP: Title to the Materials and all copies thereof remain with Intel or
its suppliers.  The Materials are protected by intellectual property rights,
including without limitation, United States copyright laws and international
treaty provisions.  You will not remove any copyright or other proprietary
notice from the Materials.  You agree to prevent any unauthorized copying of the
Materials.  Except as expressly provided herein, no license or right is granted
to You directly or by implication, inducement, estoppel or otherwise;
specifically Intel does not grant any express or implied right to You under
Intel patents, copyrights, trademarks, or trade secrets.

7. NO WARRANTY AND NO SUPPORT:  Disclaimer.  Intel disclaims all warranties of
any kind and the terms and remedies provided in this Agreement are instead of
any other warranty or condition, express, implied or statutory, including those
regarding merchantability, fitness for any particular purpose, non-infringement
or any warranty arising out of any course of dealing, usage of trade, proposal,
specification or sample.  Intel does not assume (and does not authorize any
person to assume on its behalf) any other liability.

Intel may make changes to the Materials, or to items referenced therein, at any
time without notice, but is not obligated to support, update or provide training
for the Materials. Intel may in its sole discretion offer such support, update
or training services under separate terms at Intel's then-current rates. You may
request additional information on Intel's service offerings from an Intel sales
representative.

8. LIMITATION OF LIABILITY:  Neither Intel nor its suppliers shall be liable for
any damages whatsoever (including, without limitation, damages for loss of
business profits, business interruption, loss of business information, or other
loss) arising out of the use of or inability to use the Materials, even if Intel
has been advised of the possibility of such damages.  Because some jurisdictions
prohibit the exclusion or limitation of liability for consequential or
incidental damages, the above limitation may not apply to you.

9. UNAUTHORIZED USE:  The Materials are not designed, intended, or authorized
for use in any type of a system or application in which the failure of the
Materials could create a situation where personal injury or death may occur
(e.g.,  medical systems, life sustaining or lifesaving systems).  Should You use
the Materials for any such unintended or unauthorized use, You hereby indemnify,
defend, and hold Intel and its officers, subsidiaries and affiliates harmless
against all claims, costs, damages, expenses, and reasonable attorney fees
arising out of, directly or indirectly, such use and any claim of product
liability, personal injury or death associated with such unintended or
unauthorized use, even if such claim alleges that Intel was negligent regarding
the design or manufacture of the Materials.

10. USER SUBMISSIONS:  This Agreement does not obligate You to provide Intel
with materials, information, comments, suggestions or other communication
regarding the Materials.  However, You agree that any material, information,
comments, suggestions or other communication You transmit or post to an Intel
website (including but not limited to, submissions to the Intel Premier Support
and/or other customer support websites or online portals) or provide to Intel
under this Agreement related to the features, functions, performance or use of
the Materials are deemed non-confidential and non-proprietary
("Communications").  Intel will have no obligations with respect to the
Communications.  You hereby grant to Intel a non-exclusive, perpetual,
irrevocable, royalty-free, copyright license to copy, modify, create derivative
works, publicly display, disclose, distribute, license and sublicense through
multiple tiers of distribution and licensees, incorporate and otherwise use the
Communications and all data, images, sounds, text, and other things embodied
therein, including derivative works thereto, for any and all commercial or
non-commercial purposes. You are prohibited from posting or transmitting to or
from an Intel website or provide to Intel any unlawful, threatening, libelous,
defamatory, obscene, pornographic, or other material that would violate any law.
If You wish to provide Intel with information that You intend to be treated as
confidential information, Intel requires that such confidential information be
provided pursuant to a non-disclosure agreement ("NDA"), so please contact Your
Intel representative to ensure the proper NDA is in place.

Nothing in this Agreement will be construed as preventing Intel from reviewing
Your Communications and errors or defects in Intel products discovered while
reviewing Your Communications. Furthermore, nothing in this Agreement will be
construed as preventing Intel from implementing independently-developed
enhancements to Intel's own error diagnosis methodology to detect errors or
defects in Intel products discovered while reviewing Your Communications or to
implement bug fixes or enhancements in Intel products. The foregoing may include
the right to include Your Communications in regression test suites.

11.  NON-DISCLOSURE: The following provisions will apply if there is no existing
non-disclosure agreement between You and Intel. You will maintain the
confidentiality of the Confidential Information (if any) with at least the same
degree of care that You use to protect Your own confidential and proprietary
information, but no less than a reasonable degree of care under the
circumstances.  You will not disclose the Confidential Information to any
employees or to any third parties except to Your employees who have a need to
know and who agree to abide by nondisclosure terms at least as comprehensive as
those set forth herein; provided that You will be liable for breach by any such
entity.  For the purposes of this Agreement, the term "employee" will include
Your independent contractors, who have signed confidentiality agreements with
You.  You will not make any copies of the Confidential Information except as
necessary for Your employees with a need to know.  Any copies which are made
will be identified as belonging to Intel and marked "confidential",
"proprietary" or with similar legend.  You will not be liable for the disclosure
of any Confidential Information which is (a) generally made available publicly
or to third parties by Intel without restriction on disclosure; (b) rightfully
received from a third party without obligation of confidentiality; (c)
rightfully known to You without any limitation on disclosure prior to Your
receipt from Intel; (d) independently developed by Your employees; or (e)
required to be disclosed in accordance with applicable laws, regulations, court,
judicial or other government order, provided that You will give Intel reasonable
notice prior to such disclosure and will comply with any applicable protective
order.

12. TERMINATION OF THIS LICENSE: This Agreement becomes effective on the date
You accept this Agreement and will continue until terminated as provided for in
this Agreement.  If You are using the Materials under a time-limited license,
for example an Evaluation License, this Agreement terminates without notice on
the last day of the time period, which is specified in the Materials or on
Intel's website, and/or controlled by the license key code for the Materials.
Intel may terminate this license immediately if You are in breach of any of its
terms and conditions and such breach is not cured within thirty (30) days of
written notice from Intel.  Upon termination, You will immediately return to
Intel or destroy the Materials and all copies thereof.  In the event of
termination of this Agreement, the license grant to any Materials or
Redistributables distributed by You in accordance with the terms and conditions
of this Agreement, prior to the effective date of such termination, will survive
any such termination of this Agreement. Sections 1, 5, 6, 7, 8, 9, 10, 11, 12,
and 14 will survive expiration or termination of this Agreement.

13. U.S. GOVERNMENT RESTRICTED RIGHTS: The technical data and computer software
covered by this license is a "Commercial Item," as such term is defined by the
FAR 2.101 (48 C.F.R. 2.101) and is "commercial computer software" and
"commercial computer software documentation" as specified under FAR 12.212 (48
C.F.R. 12.212) or DFARS 227.7202 (48 C.F.R. 227.7202), as applicable. This
commercial computer software and related documentation is provided to end users
for use by and on behalf of the U.S. Government, with only those rights as are
granted to all other end users pursuant to the terms and conditions herein. Use
for or on behalf of the U.S. Government is permitted only if the party acquiring
or using this software is properly authorized by an appropriate U.S. Government
official. This use by or for the U.S. Government clause is in lieu of, and
supersedes, any other FAR, DFARS, or other provision that addresses Government
rights in the computer software or documentation covered by this license. All
copyright licenses granted to the U.S. Government are coextensive with the
technical data and computer software licenses granted herein. The U.S.
Government will only have the right to reproduce, distribute, perform, display,
and prepare derivative works as needed to implement those rights.

14. GENERAL PROVISIONS

   A. ENTIRE AGREEMENT: This Agreement contains the complete and exclusive
   agreement and understanding between the parties concerning the subject matter
   of this Agreement, and supersedes all prior and contemporaneous proposals,
   agreements, understanding, negotiations, representations, warranties,
   conditions, and communications, oral or written, between the parties relating
   to the same subject matter. This Agreement, including without limitation its
   termination, has no effect on any signed non-disclosure agreements between
   the parties, which remain in full force and effect as separate agreements to
   their terms. Each party acknowledges and agrees that in entering into this
   Agreement it has not relied on, and will not be entitled to rely on, any oral
   or written representations, warranties, conditions, understanding, or
   communications between the parties that are not expressly set forth in this
   Agreement. The express provisions of this Agreement control over any course
   of performance, course of dealing, or usage of the trade inconsistent with
   any of the provisions of this Agreement. The provisions of this Agreement
   will prevail notwithstanding any different, conflicting, or additional
   provisions that may appear on any purchase order, acknowledgement, invoice,
   or other writing issued by either party in connection with this Agreement. No
   modification or amendment to this Agreement will be effective unless in
   writing and signed by authorized representatives of each party, and must
   specifically identify this Agreement by its title (e.g., "End User License
   Agreement for the Intel(R) software and version, i.e., March 2015).    If You
   received a copy of this Agreement translated into another language, the
   English language version of this Agreement will prevail in the event of any
   conflict between versions.

   B. EXPORT. You must comply with all laws and regulations of the United States
   and other countries governing the export, re-export, import, transfer,
   distribution, use, and servicing of Software.  In particular, You must not:
   (a) sell or transfer Software to a country subject to sanctions, or to any
   entity listed on a denial order published by the United States government or
   any other relevant government; or (b) use, sell, or transfer Software for the
   development, design, manufacture, or production of nuclear, missile, chemical
   or biological weapons, or for any other purpose prohibited by the United
   States government or other applicable government; without first obtaining all
   authorizations required by all applicable laws.  For more details on Your
   export obligations, please visit
   http://www.intel.com/content/www/us/en/legal/export-compliance.html?wapkw=export.


   C. GOVERNING LAW, JURISDICTION, AND VENUE: All disputes arising out of or
   related to this Agreement, whether based on contract, tort, or any other
   legal or equitable theory, will in all respects be governed by, and construed
   and interpreted under, the laws of the United States of America and the State
   of Delaware, without reference to conflict of laws principles. The parties
   agree that the United Nations Convention on Contracts for the International
   Sale of Goods (1980) is specifically excluded from and will not apply to this
   Agreement. All disputes arising out of or related to this Agreement, whether
   based on contract, tort, or any other legal or equitable theory, will be
   subject to the exclusive jurisdiction of the courts of the State of Delaware
   or of the Federal courts sitting in that State. Each party submits to the
   personal jurisdiction of those courts and waives all objections to that
   jurisdiction and venue for those disputes.

   D. SEVERABILITY: The parties intend that if a court holds that any provision
   or part of this Agreement is invalid or unenforceable under applicable law,
   the court will modify the provision to the minimum extent necessary to make
   it valid and enforceable, or if it cannot be made valid and enforceable, the
   parties intend that the court will sever and delete the provision or part
   from this Agreement. Any change to or deletion of a provision or part of this
   Agreement under this Section will not affect the validity or enforceability
   of the remainder of this Agreement, which will continue in full force and
   effect.
   
   
* Other names and brands may be claimed as the property of others




	
Common Public License Version 1.0

THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON
PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF
THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. 

1. DEFINITIONS 

"Contribution" means:

  a) in the case of the initial Contributor, the initial code and
     documentation distributed under this Agreement, and 

  b) in the case of each subsequent Contributor:
     i)  changes to the Program, and
     ii) additions to the Program; where such changes and/or additions
         to the Program originate from and are distributed by that
         particular Contributor. A Contribution 'originates' from a
         Contributor if it was added to the Program by such
         Contributor itself or anyone acting on such Contributor's
         behalf. Contributions do not include additions to the Program
         which: (i) are separate modules of software distributed in
         conjunction with the Program under their own license
         agreement, and (ii) are not derivative works of the Program.

"Contributor" means any person or entity that distributes the Program. 

"Licensed Patents " mean patent claims licensable by a Contributor
which are necessarily infringed by the use or sale of its Contribution
alone or when combined with the Program.

"Program" means the Contributions distributed in accordance with this
Agreement.  

"Recipient" means anyone who receives the Program under this
Agreement, including all Contributors. 
 
2. GRANT OF RIGHTS

  a) Subject to the terms of this Agreement, each Contributor hereby
     grants Recipient a non-exclusive, worldwide, royalty-free
     copyright license to reproduce, prepare derivative works of,
     publicly display, publicly perform, distribute and sublicense the
     Contribution of such Contributor, if any, and such derivative
     works, in source code and object code form.

  b) Subject to the terms of this Agreement, each Contributor hereby
     grants Recipient a non-exclusive, worldwide, royalty-free patent
     license under Licensed Patents to make, use, sell, offer to sell,
     import and otherwise transfer the Contribution of such
     Contributor, if any, in source code and object code form. This
     patent license shall apply to the combination of the Contribution
     and the Program if, at the time the Contribution is added by the
     Contributor, such addition of the Contribution causes such
     combination to be covered by the Licensed Patents. The patent
     license shall not apply to any other combinations which include
     the Contribution. No hardware per se is licensed hereunder.

  c) Recipient understands that although each Contributor grants the
     licenses to its Contributions set forth herein, no assurances are
     provided by any Contributor that the Program does not infringe
     the patent or other intellectual property rights of any other
     entity. Each Contributor disclaims any liability to Recipient for
     claims brought by any other entity based on infringement of
     intellectual property rights or otherwise. As a condition to
     exercising the rights and licenses granted hereunder, each
     Recipient hereby assumes sole responsibility to secure any other
     intellectual property rights needed, if any. For example, if a
     third party patent license is required to allow Recipient to
     distribute the Program, it is Recipient's responsibility to
     acquire that license before distributing the Program.

  d) Each Contributor represents that to its knowledge it has
     sufficient copyright rights in its Contribution, if any, to grant
     the copyright license set forth in this Agreement.

3. REQUIREMENTS

A Contributor may choose to distribute the Program in object code form
under its own license agreement, provided that:  

  a) it complies with the terms and conditions of this Agreement; and

  b) its license agreement:
     i)  effectively disclaims on behalf of all Contributors all
         warranties and conditions, express and implied, including
         warranties or conditions of title and non-infringement, and
         implied warranties or conditions of merchantability and
         fitness for a particular purpose;
     ii) effectively excludes on behalf of all Contributors all
         liability for damages, including direct, indirect, special,
         incidental and consequential damages, such as lost profits;
     iii) states that any provisions which differ from this Agreement
         are offered by that Contributor alone and not by any other
         party; and
     iv) states that source code for the Program is available from
         such Contributor, and informs licensees how to obtain it in a
         reasonable manner on or through a medium customarily used for
         software exchange.

When the Program is made available in source code form:

  a) it must be made available under this Agreement; and

  b) a copy of this Agreement must be included with each copy of the
     Program.  Contributors may not remove or alter any copyright
     notices contained within the Program.

Each Contributor must identify itself as the originator of its
Contribution, if any, in a manner that reasonably allows subsequent
Recipients to identify the originator of the Contribution.

4. COMMERCIAL DISTRIBUTION 

Commercial distributors of software may accept certain
responsibilities with respect to end users, business partners and the
like. While this license is intended to facilitate the commercial use
of the Program, the Contributor who includes the Program in a
commercial product offering should do so in a manner which does not
create potential liability for other Contributors. Therefore, if a
Contributor includes the Program in a commercial product offering,
such Contributor ("Commercial Contributor") hereby agrees to defend
and indemnify every other Contributor ("Indemnified Contributor")
against any losses, damages and costs (collectively "Losses") arising
from claims, lawsuits and other legal actions brought by a third party
against the Indemnified Contributor to the extent caused by the acts
or omissions of such Commercial Contributor in connection with its
distribution of the Program in a commercial product offering. The
obligations in this section do not apply to any claims or Losses
relating to any actual or alleged intellectual property
infringement. In order to qualify, an Indemnified Contributor must:

  a) promptly notify the Commercial Contributor in writing of such
     claim, and

  b) allow the Commercial Contributor to control, and cooperate with
     the Commercial Contributor in, the defense and any related
     settlement negotiations. The Indemnified Contributor may
     participate in any such claim at its own expense.

For example, a Contributor might include the Program in a commercial
product offering, Product X. That Contributor is then a Commercial
Contributor. If that Commercial Contributor then makes performance
claims, or offers warranties related to Product X, those performance
claims and warranties are such Commercial Contributor's responsibility
alone. Under this section, the Commercial Contributor would have to
defend claims against the other Contributors related to those
performance claims and warranties, and if a court requires any other
Contributor to pay any damages as a result, the Commercial Contributor
must pay those damages.  

5. NO WARRANTY

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY
WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
responsible for determining the appropriateness of using and
distributing the Program and assumes all risks associated with its
exercise of rights under this Agreement, including but not limited to
the risks and costs of program errors, compliance with applicable
laws, damage to or loss of data, programs or equipment, and
unavailability or interruption of operations. 

6. DISCLAIMER OF LIABILITY 

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR
ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 

7. GENERAL

If any provision of this Agreement is invalid or unenforceable under
applicable law, it shall not affect the validity or enforceability of
the remainder of the terms of this Agreement, and without further
action by the parties hereto, such provision shall be reformed to the
minimum extent necessary to make such provision valid and
enforceable. 

If Recipient institutes patent litigation against a Contributor with
respect to a patent applicable to software (including a cross-claim or
counterclaim in a lawsuit), then any patent licenses granted by that
Contributor to such Recipient under this Agreement shall terminate as
of the date such litigation is filed. In addition, if Recipient
institutes patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Program
itself (excluding combinations of the Program with other software or
hardware) infringes such Recipient's patent(s), then such Recipient's
rights granted under Section 2(b) shall terminate as of the date such
litigation is filed.

All Recipient's rights under this Agreement shall terminate if it
fails to comply with any of the material terms or conditions of this
Agreement and does not cure such failure in a reasonable period of
time after becoming aware of such noncompliance. If all Recipient's
rights under this Agreement terminate, Recipient agrees to cease use
and distribution of the Program as soon as reasonably
practicable. However, Recipient's obligations under this Agreement and
any licenses granted by Recipient relating to the Program shall
continue and survive.
 
Everyone is permitted to copy and distribute copies of this Agreement,
but in order to avoid inconsistency the Agreement is copyrighted and
may only be modified in the following manner. The Agreement Steward
reserves the right to publish new versions (including revisions) of
this Agreement from time to time. No one other than the Agreement
Steward has the right to modify this Agreement. IBM is the initial
Agreement Steward. IBM may assign the responsibility to serve as the
Agreement Steward to a suitable separate entity. Each new version of
the Agreement will be given a distinguishing version number. The
Program (including Contributions) may always be distributed subject to
the version of the Agreement under which it was received. In addition,
after a new version of the Agreement is published, Contributor may
elect to distribute the Program (including its Contributions) under
the new version. Except as expressly stated in Sections 2(a) and 2(b)
above, Recipient receives no rights or licenses to the intellectual
property of any Contributor under this Agreement, whether expressly,
by implication, estoppel or otherwise. All rights in the Program not
expressly granted under this Agreement are reserved. 

This Agreement is governed by the laws of the State of New York and
the intellectual property laws of the United States of America. No
party to this Agreement will bring a legal action under this Agreement
more than one year after the cause of action arose. Each party waives
its rights to a jury trial in any resulting litigation.


