International Program License Agreement

Part 1 - General Terms

BY DOWNLOADING, INSTALLING, COPYING, ACCESSING, CLICKING ON AN "ACCEPT" BUTTON, OR OTHERWISE USING THE PROGRAM, LICENSEE AGREES TO THE TERMS OF THIS AGREEMENT. IF YOU ARE ACCEPTING THESE TERMS ON BEHALF OF LICENSEE, YOU REPRESENT AND WARRANT THAT YOU HAVE FULL AUTHORITY TO BIND LICENSEE TO THESE TERMS. IF YOU DO NOT AGREE TO THESE TERMS,

- DO NOT DOWNLOAD, INSTALL, COPY, ACCESS, CLICK ON AN "ACCEPT" BUTTON, OR USE THE PROGRAM; AND

- PROMPTLY RETURN THE UNUSED MEDIA, DOCUMENTATION, AND PROOF OF ENTITLEMENT TO THE PARTY FROM WHOM IT WAS OBTAINED FOR A REFUND OF THE AMOUNT PAID. IF THE PROGRAM WAS DOWNLOADED, DESTROY ALL COPIES OF THE PROGRAM.

1. Definitions

"Authorized Use" - the specified level at which Licensee is authorized to execute or run the Program. That level may be measured by number of users, millions of service units ("MSUs"), Processor Value Units ("PVUs"), or other level of use specified by IBM.

"IBM" - International Business Machines Corporation or one of its subsidiaries.

"License Information" ("LI") - a document that provides information and any additional terms specific to a Program. The Program's LI is available at www.ibm.com/software/sla. The LI can also be found in the Program's directory, by the use of a system command, or as a booklet included with the Program.

"Program" - the following, including the original and all whole or partial copies: 1) machine-readable instructions and data, 2) components, files, and modules, 3) audio-visual content (such as images, text, recordings, or pictures), and 4) related licensed materials (such as keys and documentation).

"Proof of Entitlement" ("PoE") - evidence of Licensee's Authorized Use. The PoE is also evidence of Licensee's eligibility for warranty, future update prices, if any, and potential special or promotional opportunities. If IBM does not provide Licensee with a PoE, then IBM may accept as the PoE the original paid sales receipt or other sales record from the party (either IBM or its reseller) from whom Licensee obtained the Program, provided that it specifies the Program name and Authorized Use obtained.

"Warranty Period" - one year, starting on the date the original Licensee is granted the license.

2. Agreement Structure

This Agreement includes Part 1 - General Terms, Part 2 - Country-unique Terms (if any), the LI, and the PoE and is the complete agreement between Licensee and IBM regarding the use of the Program. It replaces any prior oral or written communications between Licensee and IBM concerning Licensee's use of the Program. The terms of Part 2 may replace or modify those of Part 1. To the extent of any conflict, the LI prevails over both Parts.

3. License Grant

The Program is owned by IBM or an IBM supplier, and is copyrighted and licensed, not sold.

IBM grants Licensee a nonexclusive license to 1) use the Program up to the Authorized Use specified in the PoE, 2) make and install copies to support such Authorized Use, and 3) make a backup copy, all provided that

a. Licensee has lawfully obtained the Program and complies with the terms of this Agreement;

b. the backup copy does not execute unless the backed-up Program cannot execute;

c. Licensee reproduces all copyright notices and other legends of ownership on each copy, or partial copy, of the Program;

d. Licensee ensures that anyone who uses the Program (accessed either locally or remotely) 1) does so only on Licensee's behalf and 2) complies with the terms of this Agreement;

e. Licensee does not 1) use, copy, modify, or distribute the Program except as expressly permitted in this Agreement; 2) reverse assemble, reverse compile, otherwise translate, or reverse engineer the Program, except as expressly permitted by law without the possibility of contractual waiver; 3) use any of the Program's components, files, modules, audio-visual content, or related licensed materials separately from that Program; or 4) sublicense, rent, or lease the Program; and

f. if Licensee obtains this Program as a Supporting Program, Licensee uses this Program only to support the Principal Program and subject to any limitations in the license to the Principal Program, or, if Licensee obtains this Program as a Principal Program, Licensee uses all Supporting Programs only to support this Program, and subject to any limitations in this Agreement. For purposes of this Item "f," a "Supporting Program" is a Program that is part of another IBM Program ("Principal Program") and identified as a Supporting Program in the Principal Program's LI. (To obtain a separate license to a Supporting Program without these restrictions, Licensee should contact the party from whom Licensee obtained the Supporting Program.)

This license applies to each copy of the Program that Licensee makes.

3.1 Trade-ups, Updates, Fixes, and Patches

3.1.1 Trade-ups

If the Program is replaced by a trade-up Program, the replaced Program's license is promptly terminated.

3.1.2 Updates, Fixes, and Patches

When Licensee receives an update, fix, or patch to a Program, Licensee accepts any additional or different terms that are applicable to such update, fix, or patch that are specified in its LI. If no additional or different terms are provided, then the update, fix, or patch is subject solely to this Agreement. If the Program is replaced by an update, Licensee agrees to promptly discontinue use of the replaced Program.

3.2 Fixed Term Licenses

If IBM licenses the Program for a fixed term, Licensee's license is terminated at the end of the fixed term, unless Licensee and IBM agree to renew it.

3.3 Term and Termination

This Agreement is effective until terminated.

IBM may terminate Licensee's license if Licensee fails to comply with the terms of this Agreement.

If the license is terminated for any reason by either party, Licensee agrees to promptly discontinue use of and destroy all of Licensee's copies of the Program. Any terms of this Agreement that by their nature extend beyond termination of this Agreement remain in effect until fulfilled, and apply to both parties' respective successors and assignees.

4. Charges

Charges are based on Authorized Use obtained, which is specified in the PoE. IBM does not give credits or refunds for charges already due or paid, except as specified elsewhere in this Agreement.

If Licensee wishes to increase its Authorized Use, Licensee must notify IBM or an authorized IBM reseller in advance and pay any applicable charges.

5. Taxes

If any authority imposes on the Program a duty, tax, levy, or fee, excluding those based on IBM's net income, then Licensee agrees to pay that amount, as specified in an invoice, or supply exemption documentation. Licensee is responsible for any personal property taxes for the Program from the date that Licensee obtains it. If any authority imposes a customs duty, tax, levy, or fee for the import into or the export, transfer, access, or use of the Program outside the country in which the original Licensee was granted the license, then Licensee agrees that it is responsible for, and will pay, any amount imposed.

6. Money-back Guarantee

If Licensee is dissatisfied with the Program for any reason and is the original Licensee, Licensee may terminate the license and obtain a refund of the amount Licensee paid for the Program, provided that Licensee returns the Program and PoE to the party from whom Licensee obtained it within 30 days of the date the PoE was issued to Licensee. If the license is for a fixed term that is subject to renewal, then Licensee may obtain a refund only if the Program and its PoE are returned within the first 30 days of the initial term. If Licensee downloaded the Program, Licensee should contact the party from whom Licensee obtained it for instructions on how to obtain the refund.

7. Program Transfer

Licensee may transfer the Program and all of Licensee's license rights and obligations to another party only if that party agrees to the terms of this Agreement. If the license is terminated for any reason by either party, Licensee is prohibited from transferring the Program to another party. Licensee may not transfer a portion of 1) the Program or 2) the Program's Authorized Use. When Licensee transfers the Program, Licensee must also transfer a hard copy of this Agreement, including the LI and PoE. Immediately after the transfer, Licensee's license terminates.

8. Warranty and Exclusions

8.1 Limited Warranty

IBM warrants that the Program, when used in its specified operating environment, will conform to its specifications. The Program's specifications, and specified operating environment information, can be found in documentation accompanying the Program (such as a read-me file) or other information published by IBM (such as an announcement letter). Licensee agrees that such documentation and other Program content may be supplied only in the English language, unless otherwise required by local law without the possibility of contractual waiver or limitation.

The warranty applies only to the unmodified portion of the Program. IBM does not warrant uninterrupted or error-free operation of the Program, or that IBM will correct all Program defects. Licensee is responsible for the results obtained from the use of the Program.

During the Warranty Period, IBM provides Licensee with access to IBM databases containing information on known Program defects, defect corrections, restrictions, and bypasses at no additional charge. Consult the IBM Software Support Handbook for further information at www.ibm.com/software/support.

If the Program does not function as warranted during the Warranty Period and the problem cannot be resolved with information available in the IBM databases, Licensee may return the Program and its PoE to the party (either IBM or its reseller) from whom Licensee obtained it and receive a refund of the amount Licensee paid. After returning the Program, Licensee's license terminates. If Licensee downloaded the Program, Licensee should contact the party from whom Licensee obtained it for instructions on how to obtain the refund.

8.2 Exclusions

THESE WARRANTIES ARE LICENSEE'S EXCLUSIVE WARRANTIES AND REPLACE ALL OTHER WARRANTIES OR CONDITIONS, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES OR CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, AND ANY WARRANTY OR CONDITION OF NON-INFRINGEMENT. SOME STATES OR JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF EXPRESS OR IMPLIED WARRANTIES, SO THE ABOVE EXCLUSION MAY NOT APPLY TO LICENSEE. IN THAT EVENT, SUCH WARRANTIES ARE LIMITED IN DURATION TO THE WARRANTY PERIOD. NO WARRANTIES APPLY AFTER THAT PERIOD. SOME STATES OR JURISDICTIONS DO NOT ALLOW LIMITATIONS ON HOW LONG AN IMPLIED WARRANTY LASTS, SO THE ABOVE LIMITATION MAY NOT APPLY TO LICENSEE.

THESE WARRANTIES GIVE LICENSEE SPECIFIC LEGAL RIGHTS. LICENSEE MAY ALSO HAVE OTHER RIGHTS THAT VARY FROM STATE TO STATE OR JURISDICTION TO JURISDICTION.

THE WARRANTIES IN THIS SECTION 8 (WARRANTY AND EXCLUSIONS) ARE PROVIDED SOLELY BY IBM. THE DISCLAIMERS IN THIS SUBSECTION 8.2 (EXCLUSIONS), HOWEVER, ALSO APPLY TO IBM'S SUPPLIERS OF THIRD PARTY CODE. THOSE SUPPLIERS PROVIDE SUCH CODE WITHOUT WARRANTIES OR CONDITION OF ANY KIND. THIS PARAGRAPH DOES NOT NULLIFY IBM'S WARRANTY OBLIGATIONS UNDER THIS AGREEMENT.

9. Licensee Data and Databases

To assist Licensee in isolating the cause of a problem with the Program, IBM may request that Licensee 1) allow IBM to remotely access Licensee's system or 2) send Licensee information or system data to IBM. However, IBM is not obligated to provide such assistance unless IBM and Licensee enter a separate written agreement under which IBM agrees to provide to Licensee that type of technical support, which is beyond IBM's warranty obligations in this Agreement. In any event, IBM uses information about errors and problems to improve its products and services, and assist with its provision of related support offerings. For these purposes, IBM may use IBM entities and subcontractors (including in one or more countries other than the one in which Licensee is located), and Licensee authorizes IBM to do so.

Licensee remains responsible for 1) any data and the content of any database Licensee makes available to IBM, 2) the selection and implementation of procedures and controls regarding access, security, encryption, use, and transmission of data (including any personally-identifiable data), and 3) backup and recovery of any database and any stored data. Licensee will not send or provide IBM access to any personally-identifiable information, whether in data or any other form, and will be responsible for reasonable costs and other amounts that IBM may incur relating to any such information mistakenly provided to IBM or the loss or disclosure of such information by IBM, including those arising out of any third party claims.

10. Limitation of Liability

The limitations and exclusions in this Section 10 (Limitation of Liability) apply to the full extent they are not prohibited by applicable law without the possibility of contractual waiver.

10.1 Items for Which IBM May Be Liable

Circumstances may arise where, because of a default on IBM's part or other liability, Licensee is entitled to recover damages from IBM. Regardless of the basis on which Licensee is entitled to claim damages from IBM (including fundamental breach, negligence, misrepresentation, or other contract or tort claim), IBM's entire liability for all claims in the aggregate arising from or related to each Program or otherwise arising under this Agreement will not exceed the amount of any 1) damages for bodily injury (including death) and damage to real property and tangible personal property and 2) other actual direct damages up to the charges (if the Program is subject to fixed term charges, up to twelve months' charges) Licensee paid for the Program that is the subject of the claim.

This limit also applies to any of IBM's Program developers and suppliers. It is the maximum for which IBM and its Program developers and suppliers are collectively responsible.

10.2 Items for Which IBM Is Not Liable

UNDER NO CIRCUMSTANCES IS IBM, ITS PROGRAM DEVELOPERS OR SUPPLIERS LIABLE FOR ANY OF THE FOLLOWING, EVEN IF INFORMED OF THEIR POSSIBILITY:

a. LOSS OF, OR DAMAGE TO, DATA;

b. SPECIAL, INCIDENTAL, EXEMPLARY, OR INDIRECT DAMAGES, OR FOR ANY ECONOMIC CONSEQUENTIAL DAMAGES; OR

c. LOST PROFITS, BUSINESS, REVENUE, GOODWILL, OR ANTICIPATED SAVINGS.

11. Compliance Verification

For purposes of this Section 11 (Compliance Verification), "IPLA Program Terms" means 1) this Agreement and applicable amendments and transaction documents provided by IBM, and 2) IBM software policies that may be found at the IBM Software Policy website (www.ibm.com/softwarepolicies), including but not limited to those policies concerning backup, sub-capacity pricing, and migration.

The rights and obligations set forth in this Section 11 remain in effect during the period the Program is licensed to Licensee, and for two years thereafter.

11.1 Verification Process

Licensee agrees to create, retain, and provide to IBM and its auditors accurate written records, system tool outputs, and other system information sufficient to provide auditable verification that Licensee's use of all Programs is in compliance with the IPLA Program Terms, including, without limitation, all of IBM's applicable licensing and pricing qualification terms. Licensee is responsible for 1) ensuring that it does not exceed its Authorized Use, and 2) remaining in compliance with IPLA Program Terms.

Upon reasonable notice, IBM may verify Licensee's compliance with IPLA Program Terms at all sites and for all environments in which Licensee uses (for any purpose) Programs subject to IPLA Program Terms. Such verification will be conducted in a manner that minimizes disruption to Licensee's business, and may be conducted on Licensee's premises, during normal business hours. IBM may use an independent auditor to assist with such verification, provided IBM has a written confidentiality agreement in place with such auditor.

11.2 Resolution

IBM will notify Licensee in writing if any such verification indicates that Licensee has used any Program in excess of its Authorized Use or is otherwise not in compliance with the IPLA Program Terms. Licensee agrees to promptly pay directly to IBM the charges that IBM specifies in an invoice for 1) any such excess use, 2) support for such excess use for the lesser of the duration of such excess use or two years, and 3) any additional charges and other liabilities determined as a result of such verification.

12. Third Party Notices

The Program may include third party code that IBM, not the third party, licenses to Licensee under this Agreement. Notices, if any, for the third party code ("Third Party Notices") are included for Licensee's information only. These notices can be found in the Program's NOTICES file(s). Information on how to obtain source code for certain third party code can be found in the Third Party Notices. If in the Third Party Notices IBM identifies third party code as "Modifiable Third Party Code," IBM authorizes Licensee to 1) modify the Modifiable Third Party Code and 2) reverse engineer the Program modules that directly interface with the Modifiable Third Party Code provided that it is only for the purpose of debugging Licensee's modifications to such third party code. IBM's service and support obligations, if any, apply only to the unmodified Program.

13. General

a. Nothing in this Agreement affects any statutory rights of consumers that cannot be waived or limited by contract.

b. For Programs IBM provides to Licensee in tangible form, IBM fulfills its shipping and delivery obligations upon the delivery of such Programs to the IBM-designated carrier, unless otherwise agreed to in writing by Licensee and IBM.

c. If any provision of this Agreement is held to be invalid or unenforceable, the remaining provisions of this Agreement remain in full force and effect.

d. Licensee agrees to comply with all applicable export and import laws and regulations, including U.S. embargo and sanctions regulations and prohibitions on export for certain end uses or to certain users.

e. Licensee authorizes International Business Machines Corporation and its subsidiaries (and their successors and assigns, contractors and IBM Business Partners) to store and use Licensee's business contact information wherever they do business, in connection with IBM products and services, or in furtherance of IBM's business relationship with Licensee.

f. Each party will allow the other reasonable opportunity to comply before it claims that the other has not met its obligations under this Agreement. The parties will attempt in good faith to resolve all disputes, disagreements, or claims between the parties relating to this Agreement.

g. Unless otherwise required by applicable law without the possibility of contractual waiver or limitation: 1) neither party will bring a legal action, regardless of form, for any claim arising out of or related to this Agreement more than two years after the cause of action arose; and 2) upon the expiration of such time limit, any such claim and all respective rights related to the claim lapse.

h. Neither Licensee nor IBM is responsible for failure to fulfill any obligations due to causes beyond its control.

i. No right or cause of action for any third party is created by this Agreement, nor is IBM responsible for any third party claims against Licensee, except as permitted in Subsection 10.1 (Items for Which IBM May Be Liable) above for bodily injury (including death) or damage to real or tangible personal property for which IBM is legally liable to that third party.

j. In entering into this Agreement, neither party is relying on any representation not specified in this Agreement, including but not limited to any representation concerning: 1) the performance or function of the Program, other than as expressly warranted in Section 8 (Warranty and Exclusions) above; 2) the experiences or recommendations of other parties; or 3) any results or savings that Licensee may achieve.

k. IBM has signed agreements with certain organizations (called "IBM Business Partners") to promote, market, and support certain Programs. IBM Business Partners remain independent and separate from IBM. IBM is not responsible for the actions or statements of IBM Business Partners or obligations they have to Licensee.

l. The license and intellectual property indemnification terms of Licensee's other agreements with IBM (such as the IBM Customer Agreement) do not apply to Program licenses granted under this Agreement.

14. Geographic Scope and Governing Law

14.1 Governing Law

Both parties agree to the application of the laws of the country in which Licensee obtained the Program license to govern, interpret, and enforce all of Licensee's and IBM's respective rights, duties, and obligations arising from, or relating in any manner to, the subject matter of this Agreement, without regard to conflict of law principles.

The United Nations Convention on Contracts for the International Sale of Goods does not apply.

14.2 Jurisdiction

All rights, duties, and obligations are subject to the courts of the country in which Licensee obtained the Program license.

Part 2 - Country-unique Terms

For licenses granted in the countries specified below, the following terms replace or modify the referenced terms in Part 1. All terms in Part 1 that are not changed by these amendments remain unchanged and in effect. This Part 2 is organized as follows:

- Multiple country amendments to Part 1, Section 14 (Governing Law and Jurisdiction);

- Americas country amendments to other Agreement terms;

- Asia Pacific country amendments to other Agreement terms; and

- Europe, Middle East, and Africa country amendments to other Agreement terms.

Multiple country amendments to Part 1, Section 14 (Governing Law and Jurisdiction)

14.1 Governing Law

The phrase "the laws of the country in which Licensee obtained the Program license" in the first paragraph of 14.1 Governing Law is replaced by the following phrases in the countries below:

AMERICAS

(1) in Canada: the laws in the Province of Ontario;

(2) in Mexico: the federal laws of the Republic of Mexico;

(3) in the United States, Anguilla, Antigua/Barbuda, Aruba, British Virgin Islands, Cayman Islands, Dominica, Grenada, Guyana, Saint Kitts and Nevis, Saint Lucia, Saint Maarten, and Saint Vincent and the Grenadines: the laws of the State of New York, United States;

(4) in Venezuela: the laws of the Bolivarian Republic of Venezuela;

ASIA PACIFIC

(5) in Cambodia and Laos: the laws of the State of New York, United States;

(6) in Australia: the laws of the State or Territory in which the transaction is performed;

(7) in Hong Kong SAR and Macau SAR: the laws of Hong Kong Special Administrative Region ("SAR");

(8) in Taiwan: the laws of Taiwan

EUROPE, MIDDLE EAST, AND AFRICA

(9) in Albania, Armenia, Azerbaijan, Belarus, Bosnia-Herzegovina, Bulgaria, Croatia, Former Yugoslav Republic of Macedonia, Georgia, Hungary, Kazakhstan, Kyrgyzstan, Moldova, Montenegro, Poland, Romania, Russia, Serbia, Slovakia, Tajikistan, Turkmenistan, Ukraine, and Uzbekistan: the laws of Austria;

(10) in Algeria, Andorra, Benin, Burkina Faso, Cameroon, Cape Verde, Central African Republic, Chad, Comoros, Congo Republic, Djibouti, Democratic Republic of Congo, Equatorial Guinea, French Guiana, French Polynesia, Gabon, Gambia, Guinea, Guinea-Bissau, Ivory Coast, Lebanon, Madagascar, Mali, Mauritania, Mauritius, Mayotte, Morocco, New Caledonia, Niger, Reunion, Senegal, Seychelles, Togo, Tunisia, Vanuatu, and Wallis and Futuna: the laws of France;

(11) in Estonia, Latvia, and Lithuania: the laws of Finland;

(12) in Angola, Bahrain, Botswana, Burundi, Egypt, Eritrea, Ethiopia, Ghana, Jordan, Kenya, Kuwait, Liberia, Malawi, Malta, Mozambique, Nigeria, Oman, Pakistan, Qatar, Rwanda, Sao Tome and Principe, Saudi Arabia, Sierra Leone, Somalia, Tanzania, Uganda, United Arab Emirates, the United Kingdom, West Bank/Gaza, Yemen, Zambia, and Zimbabwe: the laws of England; and

(13) in South Africa, Namibia, Lesotho, and Swaziland: the laws of the Republic of South Africa.

14.2 Jurisdiction

The following paragraph pertains to jurisdiction and replaces Subsection 14.2 (Jurisdiction) as it applies for those countries identified in bold below:

All rights, duties, and obligations are subject to the courts of the country in which Licensee obtained the Program license except that in the countries identified below all disputes arising out of or related to this Agreement, including summary proceedings, will be brought before and subject to the exclusive jurisdiction of the following courts of competent jurisdiction:

AMERICAS

(1) in Argentina: the Ordinary Commercial Court of the city of Buenos Aires,

(2) in Brazil: the court of Rio de Janeiro, RJ;

(3) in Chile: the Civil Courts of Justice of Santiago;

(4) in Ecuador: the civil judges of Quito for executory or summary proceedings (as applicable);

(5) in Mexico: the courts located in Mexico City, Federal District;

(6) in Peru: the judges and tribunals of the judicial district of Lima, Cercado;

(7) in Uruguay: the courts of the city of Montevideo;

(8) in Venezuela: the courts of the metropolitan area of the city of Caracas;

EUROPE, MIDDLE EAST, AND AFRICA

(9) in Austria: the court of law in Vienna, Austria (Inner-City);

(10) in Algeria, Andorra, Benin, Burkina Faso, Cameroon, Cape Verde, Central African Republic, Chad, Comoros, Congo Republic, Djibouti, Democratic Republic of Congo, Equatorial Guinea, France, French Guiana, French Polynesia, Gabon, Gambia, Guinea, Guinea-Bissau, Ivory Coast, Lebanon, Madagascar, Mali, Mauritania, Mauritius, Mayotte, Monaco, Morocco, New Caledonia, Niger, Reunion, Senegal, Seychelles, Togo, Tunisia, Vanuatu, and Wallis and Futuna: the Commercial Court of Paris;

(11) in Angola, Bahrain, Botswana, Burundi, Egypt, Eritrea, Ethiopia, Ghana, Jordan, Kenya, Kuwait, Liberia, Malawi, Malta, Mozambique, Nigeria, Oman, Pakistan, Qatar, Rwanda, Sao Tome and Principe, Saudi Arabia, Sierra Leone, Somalia, Tanzania, Uganda, United Arab Emirates, the United Kingdom, West Bank/Gaza, Yemen, Zambia, and Zimbabwe: the English courts;

(12) in South Africa, Namibia, Lesotho, and Swaziland: the High Court in Johannesburg;

(13) in Greece: the competent court of Athens;

(14) in Israel: the courts of Tel Aviv-Jaffa;

(15) in Italy: the courts of Milan;

(16) in Portugal: the courts of Lisbon;

(17) in Spain: the courts of Madrid; and

(18) in Turkey: the Istanbul Central Courts and Execution Directorates of Istanbul, the Republic of Turkey.

14.3 Arbitration

The following paragraph is added as a new Subsection 14.3 (Arbitration) as it applies for those countries identified in bold below. The provisions of this Subsection 14.3 prevail over those of Subsection 14.2 (Jurisdiction) to the extent permitted by the applicable governing law and rules of procedure:

ASIA PACIFIC

(1) In Cambodia, India, Indonesia, Laos, Philippines, and Vietnam:

Disputes arising out of or in connection with this Agreement will be finally settled by arbitration which will be held in Singapore in accordance with the Arbitration Rules of Singapore International Arbitration Center ("SIAC Rules") then in effect. The arbitration award will be final and binding for the parties without appeal and will be in writing and set forth the findings of fact and the conclusions of law.

The number of arbitrators will be three, with each side to the dispute being entitled to appoint one arbitrator. The two arbitrators appointed by the parties will appoint a third arbitrator who will act as chairman of the proceedings. Vacancies in the post of chairman will be filled by the president of the SIAC. Other vacancies will be filled by the respective nominating party. Proceedings will continue from the stage they were at when the vacancy occurred.

If one of the parties refuses or otherwise fails to appoint an arbitrator within 30 days of the date the other party appoints its, the first appointed arbitrator will be the sole arbitrator, provided that the arbitrator was validly and properly appointed. All proceedings will be conducted, including all documents presented in such proceedings, in the English language. The English language version of this Agreement prevails over any other language version.

(2) In the People's Republic of China:

In case no settlement can be reached, the disputes will be submitted to China International Economic and Trade Arbitration Commission for arbitration according to the then effective rules of the said Arbitration Commission. The arbitration will take place in Beijing and be conducted in Chinese. The arbitration award will be final and binding on both parties. During the course of arbitration, this agreement will continue to be performed except for the part which the parties are disputing and which is undergoing arbitration.

EUROPE, MIDDLE EAST, AND AFRICA

(3) In Albania, Armenia, Azerbaijan, Belarus, Bosnia-Herzegovina, Bulgaria, Croatia, Former Yugoslav Republic of Macedonia, Georgia, Hungary, Kazakhstan, Kyrgyzstan, Moldova, Montenegro, Poland, Romania, Russia, Serbia, Slovakia, Tajikistan, Turkmenistan, Ukraine, and Uzbekistan:

All disputes arising out of this Agreement or related to its violation, termination or nullity will be finally settled under the Rules of Arbitration and Conciliation of the International Arbitral Center of the Federal Economic Chamber in Vienna (Vienna Rules) by three arbitrators appointed in accordance with these rules. The arbitration will be held in Vienna, Austria, and the official language of the proceedings will be English. The decision of the arbitrators will be final and binding upon both parties. Therefore, pursuant to paragraph 598 (2) of the Austrian Code of Civil Procedure, the parties expressly waive the application of paragraph 595 (1) figure 7 of the Code. IBM may, however, institute proceedings in a competent court in the country of installation.

(4) In Estonia, Latvia, and Lithuania:

All disputes arising in connection with this Agreement will be finally settled in arbitration that will be held in Helsinki, Finland in accordance with the arbitration laws of Finland then in effect. Each party will appoint one arbitrator. The arbitrators will then jointly appoint the chairman. If arbitrators cannot agree on the chairman, then the Central Chamber of Commerce in Helsinki will appoint the chairman.

AMERICAS COUNTRY AMENDMENTS

CANADA

10.1 Items for Which IBM May be Liable

The following replaces Item 1 in the first paragraph of this Subsection 10.1 (Items for Which IBM May be Liable):

1) damages for bodily injury (including death) and physical harm to real property and tangible personal property caused by IBM's negligence; and

13. General

The following replaces Item 13.d:

d. Licensee agrees to comply with all applicable export and import laws and regulations, including those of that apply to goods of United States origin and that prohibit or limit export for certain uses or to certain users.

The following replaces Item 13.i:

i. No right or cause of action for any third party is created by this Agreement or any transaction under it, nor is IBM responsible for any third party claims against Licensee except as permitted by the Limitation of Liability section above for bodily injury (including death) or physical harm to real or tangible personal property caused by IBM's negligence for which IBM is legally liable to that third party.

The following is added as Item 13.m:

m. For purposes of this Item 13.m, "Personal Data" refers to information relating to an identified or identifiable individual made available by one of the parties, its personnel or any other individual to the other in connection with this Agreement. The following provisions apply in the event that one party makes Personal Data available to the other:

(1) General

(a) Each party is responsible for complying with any obligations applying to it under applicable Canadian data privacy laws and regulations ("Laws").

(b) Neither party will request Personal Data beyond what is necessary to fulfill the purpose(s) for which it is requested. The purpose(s) for requesting Personal Data must be reasonable. Each party will agree in advance as to the type of Personal Data that is required to be made available.

(2) Security Safeguards

(a) Each party acknowledges that it is solely responsible for determining and communicating to the other the appropriate technological, physical and organizational security measures required to protect Personal Data.

(b) Each party will ensure that Personal Data is protected in accordance with the security safeguards communicated and agreed to by the other.

(c) Each party will ensure that any third party to whom Personal Data is transferred is bound by the applicable terms of this section.

(d) Additional or different services required to comply with the Laws will be deemed a request for new services.

(3) Use

Each party agrees that Personal Data will only be used, accessed, managed, transferred, disclosed to third parties or otherwise processed to fulfill the purpose(s) for which it was made available.

(4) Access Requests

(a) Each party agrees to reasonably cooperate with the other in connection with requests to access or amend Personal Data.

(b) Each party agrees to reimburse the other for any reasonable charges incurred in providing each other assistance.

(c) Each party agrees to amend Personal Data only upon receiving instructions to do so from the other party or its personnel.

(5) Retention

Each party will promptly return to the other or destroy all Personal Data that is no longer necessary to fulfill the purpose(s) for which it was made available, unless otherwise instructed by the other or its personnel or required by law.

(6) Public Bodies Who Are Subject to Public Sector Privacy Legislation

For Customers who are public bodies subject to public sector privacy legislation, this Item 13.m applies only to Personal Data made available to Customer in connection with this Agreement, and the obligations in this section apply only to Customer, except that: 1) section (2)(a) applies only to IBM; 2) sections (1)(a) and (4)(a) apply to both parties; and 3) section (4)(b) and the last sentence in (1)(b) do not apply.

PERU

10. Limitation of Liability

The following is added to the end of this Section 10 (Limitation of Liability):

Except as expressly required by law without the possibility of contractual waiver, Licensee and IBM intend that the limitation of liability in this Limitation of Liability section applies to damages caused by all types of claims and causes of action. If any limitation on or exclusion from liability in this section is held by a court of competent jurisdiction to be unenforceable with respect to a particular claim or cause of action, the parties intend that it nonetheless apply to the maximum extent permitted by applicable law to all other claims and causes of action.

10.1 Items for Which IBM May be Liable

The following is added at the end of this Subsection 10.1:

In accordance with Article 1328 of the Peruvian Civil Code, the limitations and exclusions specified in this section will not apply to damages caused by IBM's willful misconduct ("dolo") or gross negligence ("culpa inexcusable").

UNITED STATES OF AMERICA:

5. Taxes

The following is added at the end of this Section 5 (Taxes)

For Programs delivered electronically in the United States for which Licensee claims a state sales and use tax exemption, Licensee agrees not to receive any tangible personal property (e.g., media and publications) associated with the electronic program.

Licensee agrees to be responsible for any sales and use tax liabilities that may arise as a result of Licensee's subsequent redistribution of Programs after delivery by IBM.

13. General

The following is added to Section 13 as Item 13.m:

U.S. Government Users Restricted Rights - Use, duplication or disclosure is restricted by the GSA IT Schedule 70 Contract with the IBM Corporation.

The following is added to Item 13.f:

Each party waives any right to a jury trial in any proceeding arising out of or related to this Agreement.

ASIA PACIFIC COUNTRY AMENDMENTS

AUSTRALIA:

5. Taxes

The following sentences replace the first two sentences of Section 5 (Taxes):

If any government or authority imposes a duty, tax (other than income tax), levy, or fee, on this Agreement or on the Program itself, that is not otherwise provided for in the amount payable, Licensee agrees to pay it when IBM invoices Licensee. If the rate of GST changes, IBM may adjust the charge or other amount payable to take into account that change from the date the change becomes effective.

8.1 Limited Warranty

The following is added Subsection 8.1 (Limited Warranty):

The warranties specified this Section are in addition to any rights Licensee may have under the Trade Practices Act 1974 or other legislation and are only limited to the extent permitted by the applicable legislation.

10.1 Items for Which IBM May be Liable

The following is added to Subsection 10.1 (Items for Which IBM Maybe Liable):

Where IBM is in breach of a condition or warranty implied by the Trade Practices Act 1974, IBM's liability is limited to the repair or replacement of the goods, or the supply of equivalent goods. Where that condition or warranty relates to right to sell, quiet possession or clear title, or the goods are of a kind ordinarily obtained for personal, domestic or household use or consumption, then none of the limitations in this paragraph apply.

HONG KONG SAR, MACAU SAR, AND TAIWAN

As applies to licenses obtained in Taiwan and the special administrative regions, phrases throughout this Agreement containing the word "country" (for example, "the country in which the original Licensee was granted the license" and "the country in which Licensee obtained the Program license") are replaced with the following:

(1) In Hong Kong SAR: "Hong Kong SAR"

(2) In Macau SAR: "Macau SAR" except in the Governing Law clause (Section 14.1)

(3) In Taiwan: "Taiwan."

INDIA

10.1 Items for Which IBM May be Liable

The following replaces the terms of Items 1 and 2 of the first paragraph:

1) liability for bodily injury (including death) or damage to real property and tangible personal property will be limited to that caused by IBM's negligence; and 2) as to any other actual damage arising in any situation involving nonperformance by IBM pursuant to, or in any way related to the subject of this Agreement, IBM's liability will be limited to the charge paid by Licensee for the individual Program that is the subject of the claim.

13. General

The following replaces the terms of Item 13.g:

If no suit or other legal action is brought, within three years after the cause of action arose, in respect of any claim that either party may have against the other, the rights of the concerned party in respect of such claim will be forfeited and the other party will stand released from its obligations in respect of such claim.

INDONESIA

3.3 Term and Termination

The following is added to the last paragraph:

Both parties waive the provision of article 1266 of the Indonesian Civil Code, to the extent the article provision requires such court decree for the termination of an agreement creating mutual obligations.

JAPAN

13. General

The following is inserted after Item 13.f:

Any doubts concerning this Agreement will be initially resolved between us in good faith and in accordance with the principle of mutual trust.

MALAYSIA

10.2 Items for Which IBM Is not Liable

The word "SPECIAL" in Item 10.2b is deleted.

NEW ZEALAND

8.1 Limited Warranty

The following is added:

The warranties specified in this Section are in addition to any rights Licensee may have under the Consumer Guarantees Act 1993 or other legislation which cannot be excluded or limited. The Consumer Guarantees Act 1993 will not apply in respect of any goods which IBM provides, if Licensee requires the goods for the purposes of a business as defined in that Act.

10. Limitation of Liability

The following is added:

Where Programs are not obtained for the purposes of a business as defined in the Consumer Guarantees Act 1993, the limitations in this Section are subject to the limitations in that Act.

PEOPLE'S REPUBLIC OF CHINA

4. Charges

The following is added:

All banking charges incurred in the People's Republic of China will be borne by Licensee and those incurred outside the People's Republic of China will be borne by IBM.

PHILIPPINES

10.2 Items for Which IBM Is not Liable

The following replaces the terms of Item 10.2b:

b. special (including nominal and exemplary damages), moral, incidental, or indirect damages or for any economic consequential damages; or

SINGAPORE

10.2 Items for Which IBM Is not Liable

The words "SPECIAL" and "ECONOMIC" are deleted from Item 10.2b.

13. General

The following replaces the terms of Item 13.i:

Subject to the rights provided to IBM's suppliers and Program developers as provided in Section 10 above (Limitation of Liability), a person who is not a party to this Agreement will have no right under the Contracts (Right of Third Parties) Act to enforce any of its terms.

TAIWAN

8.1 Limited Warranty

The last paragraph is deleted.

10.1 Items for Which IBM May Be Liable

The following sentences are deleted

This limit also applies to any of IBM's subcontractors and Program developers. It is the maximum for which IBM and its subcontractors and Program developers are collectively responsible.

EUROPE, MIDDLE EAST, AFRICA (EMEA) COUNTRY AMENDMENTS

EUROPEAN UNION MEMBER STATES

8. Warranty and Exclusions

The following is added to Section 8 (Warranty and Exclusion):

In the European Union ("EU"), consumers have legal rights under applicable national legislation governing the sale of consumer goods. Such rights are not affected by the provisions set out in this Section 8 Warranty and Exclusions. The territorial scope of the Limited Warranty is worldwide.

EU MEMBER STATES AND THE COUNTRIES IDENTIFIED BELOW

Iceland, Liechtenstein, Norway, Switzerland, Turkey, and any other European country that has enacted local data privacy or protection legislation similar to the EU model.

13. General

The following replaces Item 13.e:

(1) Definitions - For the purposes of this Item 13.e, the following additional definitions apply:

(a) Business Contact Information - business-related contact information disclosed by Licensee to IBM, including names, job titles, business addresses, telephone numbers and email addresses of Licensee's employees and contractors. For Austria, Italy and Switzerland, Business Contact Information also includes information about Customer and its contractors as legal entities (for example, Customer's revenue data and other transactional information)

(b) Business Contact Personnel - Licensee employees and contractors to whom the Business Contact Information relates.

(c) Data Protection Authority - the authority established by the Data Protection and Electronic Communications Legislation in the applicable country or, for non-EU countries, the authority responsible for supervising the protection of personal data in that country, or (for any of the foregoing) any duly appointed successor entity thereto.

(d) Data Protection & Electronic Communications Legislation - (i) the applicable local legislation and regulations in force implementing the requirements of EU Directive 95/46/EC (on the protection of individuals with regard to the processing of personal data and on the free movement of such data) and of EU Directive 2002/58/EC (concerning the processing of personal data and the protection of privacy in the electronic communications sector); or (ii) for non-EU countries, the legislation and/or regulations passed in the applicable country relating to the protection of personal data and the regulation of electronic communications involving personal data, including (for any of the foregoing) any statutory replacement or modification thereof.

(e) IBM Group - International Business Machines Corporation of Armonk, New York, USA, its subsidiaries, and their respective Business Partners and subcontractors.

(2) Licensee authorises IBM:

(a) to process and use Business Contact Information within IBM Group in support of Licensee including the provision of support services, and for the purpose of furthering the business relationship between Licensee and IBM Group, including, without limitation, contacting Business Contact Personnel (by email or otherwise) and marketing IBM Group products and services (the "Specified Purpose"); and

(b) to disclose Business Contact Information to other members of IBM Group in pursuit of the Specified Purpose only.

(3) IBM agrees that all Business Contact Information will be processed in accordance with the Data Protection & Electronic Communications Legislation and will be used only for the Specified Purpose.

(4) To the extent required by the Data Protection & Electronic Communications Legislation, Licensee represents that (a) it has obtained (or will obtain) any consents from (and has issued (or will issue) any notices to) the Business Contact Personnel as are necessary in order to enable IBM Group to process and use the Business Contact Information for the Specified Purpose.

(5) Licensee authorises IBM to transfer Business Contact Information outside the European Economic Area, provided that the transfer is made on contractual terms approved by the Data Protection Authority or the transfer is otherwise permitted under the Data Protection & Electronic Communications Legislation.

AUSTRIA

8.2 Exclusions

The following is deleted from the first paragraph:

MERCHANTABILITY, SATISFACTORY QUALITY

10. Limitation of Liability

The following is added:

The following limitations and exclusions of IBM's liability do not apply for damages caused by gross negligence or willful misconduct.

10.1 Items for Which IBM May Be Liable

The following replaces the first sentence in the first paragraph:

Circumstances may arise where, because of a default by IBM in the performance of its obligations under this Agreement or other liability, Licensee is entitled to recover damages from IBM.

In the second sentence of the first paragraph, delete entirely the parenthetical phrase:

"(including fundamental breach, negligence, misrepresentation, or other contract or tort claim)".

10.2 Items for Which IBM Is Not Liable

The following replaces Item 10.2b:

b. indirect damages or consequential damages; or

BELGIUM, FRANCE, ITALY, AND LUXEMBOURG

10. Limitation of Liability

The following replaces the terms of Section 10 (Limitation of Liability) in its entirety:

Except as otherwise provided by mandatory law:

10.1 Items for Which IBM May Be Liable

IBM's entire liability for all claims in the aggregate for any damages and losses that may arise as a consequence of the fulfillment of its obligations under or in connection with this Agreement or due to any other cause related to this Agreement is limited to the compensation of only those damages and losses proved and actually arising as an immediate and direct consequence of the non-fulfillment of such obligations (if IBM is at fault) or of such cause, for a maximum amount equal to the charges (if the Program is subject to fixed term charges, up to twelve months' charges) Licensee paid for the Program that has caused the damages.

The above limitation will not apply to damages for bodily injuries (including death) and damages to real property and tangible personal property for which IBM is legally liable.

10.2 Items for Which IBM Is Not Liable

UNDER NO CIRCUMSTANCES IS IBM OR ANY OF ITS PROGRAM DEVELOPERS LIABLE FOR ANY OF THE FOLLOWING, EVEN IF INFORMED OF THEIR POSSIBILITY: 1) LOSS OF, OR DAMAGE TO, DATA; 2) INCIDENTAL, EXEMPLARY OR INDIRECT DAMAGES, OR FOR ANY ECONOMIC CONSEQUENTIAL DAMAGES; AND / OR 3) LOST PROFITS, BUSINESS, REVENUE, GOODWILL, OR ANTICIPATED SAVINGS, EVEN IF THEY ARISE AS AN IMMEDIATE CONSEQUENCE OF THE EVENT THAT GENERATED THE DAMAGES.

10.3 Suppliers and Program Developers

The limitation and exclusion of liability herein agreed applies not only to the activities performed by IBM but also to the activities performed by its suppliers and Program developers, and represents the maximum amount for which IBM as well as its suppliers and Program developers are collectively responsible.

GERMANY

8.1 Limited Warranty

The following is inserted at the beginning of Section 8.1:

The Warranty Period is twelve months from the date of delivery of the Program to the original Licensee.

8.2 Exclusions

Section 8.2 is deleted in its entirety and replaced with the following:

Section 8.1 defines IBM's entire warranty obligations to Licensee except as otherwise required by applicable statutory law.

10. Limitation of Liability

The following replaces the Limitation of Liability section in its entirety:

a. IBM will be liable without limit for 1) loss or damage caused by a breach of an express guarantee; 2) damages or losses resulting in bodily injury (including death); and 3) damages caused intentionally or by gross negligence.

b. In the event of loss, damage and frustrated expenditures caused by slight negligence or in breach of essential contractual obligations, IBM will be liable, regardless of the basis on which Licensee is entitled to claim damages from IBM (including fundamental breach, negligence, misrepresentation, or other contract or tort claim), per claim only up to the greater of 500,000 euro or the charges (if the Program is subject to fixed term charges, up to 12 months' charges) Licensee paid for the Program that caused the loss or damage. A number of defaults which together result in, or contribute to, substantially the same loss or damage will be treated as one default.

c. In the event of loss, damage and frustrated expenditures caused by slight negligence, IBM will not be liable for indirect or consequential damages, even if IBM was informed about the possibility of such loss or damage.

d. In case of delay on IBM's part: 1) IBM will pay to Licensee an amount not exceeding the loss or damage caused by IBM's delay and 2) IBM will be liable only in respect of the resulting damages that Licensee suffers, subject to the provisions of Items a and b above.

13. General

The following replaces the provisions of 13.g:

Any claims resulting from this Agreement are subject to a limitation period of three years, except as stated in Section 8.1 (Limited Warranty) of this Agreement.

The following replaces the provisions of 13.i:

No right or cause of action for any third party is created by this Agreement, nor is IBM responsible for any third party claims against Licensee, except (to the extent permitted in Section 10 (Limitation of Liability)) for: i) bodily injury (including death); or ii) damage to real or tangible personal property for which (in either case) IBM is legally liable to that third party.

IRELAND

8.2 Exclusions

The following paragraph is added:

Except as expressly provided in these terms and conditions, or Section 12 of the Sale of Goods Act 1893 as amended by the Sale of Goods and Supply of Services Act, 1980 (the "1980 Act"), all conditions or warranties (express or implied, statutory or otherwise) are hereby excluded including, without limitation, any warranties implied by the Sale of Goods Act 1893 as amended by the 1980 Act (including, for the avoidance of doubt, Section 39 of the 1980 Act).

IRELAND AND UNITED KINGDOM

2. Agreement Structure

The following sentence is added:

Nothing in this paragraph shall have the effect of excluding or limiting liability for fraud.

10.1 Items for Which IBM May Be Liable

The following replaces the first paragraph of the Subsection:

For the purposes of this section, a "Default" means any act, statement, omission or negligence on the part of IBM in connection with, or in relation to, the subject matter of an Agreement in respect of which IBM is legally liable to Licensee, whether in contract or in tort. A number of Defaults which together result in, or contribute to, substantially the same loss or damage will be treated as one Default.

Circumstances may arise where, because of a Default by IBM in the performance of its obligations under this Agreement or other liability, Licensee is entitled to recover damages from IBM. Regardless of the basis on which Licensee is entitled to claim damages from IBM and except as expressly required by law without the possibility of contractual waiver, IBM's entire liability for any one Default will not exceed the amount of any direct damages, to the extent actually suffered by Licensee as an immediate and direct consequence of the default, up to the greater of (1) 500,000 euro (or the equivalent in local currency) or (2) 125% of the charges (if the Program is subject to fixed term charges, up to 12 months' charges) for the Program that is the subject of the claim. Notwithstanding the foregoing, the amount of any damages for bodily injury (including death) and damage to real property and tangible personal property for which IBM is legally liable is not subject to such limitation.

10.2 Items for Which IBM is Not Liable

The following replaces Items 10.2b and 10.2c:

b. special, incidental, exemplary, or indirect damages or consequential damages; or

c. wasted management time or lost profits, business, revenue, goodwill, or anticipated savings.

Z125-3301-13 (05/2009)


NOTICE

This document includes License Information documents below for multiple Programs. Each License Information document identifies the Program(s) to which it applies. Only those License Information documents for the Program(s) for which Licensee has acquired entitlements apply.


=========================


LICENSE INFORMATION

The Programs listed below are licensed under the following terms and conditions in addition to those of the International Program License Agreement.

Program Name: IBM Lotus Domino Messaging Client Access License 8.5.3
Program Number: 5724Z09

Supporting Programs

The Program is licensed as a multi-product package and includes the Supporting Programs identified below. Licensee is authorized to install and use such Supporting Programs only to support Licensee's use of the Principal Program under this Agreement and within the limits of the Proofs of Entitlement for the Program (unless broader rights are provided elsewhere in this License Information document). The phrase "to support Licensee's use" would include only those uses that are necessary or otherwise directly related to a licensed use of the Principal Program or another Supporting Program. The Supporting Programs may not be used for any other purpose. Licensee is not authorized to transfer or remarket the Supporting Programs separate from the Principal Program. The terms of this Agreement may replace or modify the license terms for the Supporting Programs. In the event of conflict, these terms supersede the terms of the license agreement which accompanies the Supporting Programs. When Licensee's right to use the Program expires or terminates, Licensee must discontinue use, destroy or promptly return all copies of the Supporting Programs to the party from whom Licensee acquired the Program. If Licensee downloaded the Supporting Programs, Licensee should contact the party from whom Licensee acquired the Program. If Licensee wishes to license the Supporting Programs for any use beyond the limits set forth above, please contact an IBM Sales Representative or the party from whom Licensee acquired the Program to obtain the appropriate license.

The following are Supporting Programs licensed with the Program:
IBM Connections
IBM Lotus Expeditor
IBM Lotus Notes Traveler
IBM Lotus Symphony
IBM Sametime Entry
IBM Sametime Proxy Server


Prohibited Components

Notwithstanding any provision in the Agreement, Licensee is not authorized to use any of the following components or functions of the Program:
Activities (of IBM Connections)
Blogs (of IBM Connections)
Bookmarks (of IBM Connections)
Communities (of IBM Connections)
Forums (of IBM Connections)
HomePage (of IBM Connections)
Mobile (of IBM Connections)
Wikis (of IBM Connections)

Redistributables

If the Program includes components that are Redistributable, they will be identified in the REDIST file that accompanies the Program. In addition to the license rights granted in the Agreement, Licensee may distribute the Redistributables subject to the following terms:
1) Redistribution must be in object code form only and must conform to all directions, instruction and specifications in the Program's accompanying REDIST or documentation;
2) If the Program's accompanying documentation expressly allows Licensee to modify the Redistributables, such modification must conform to all directions, instruction and specifications in that documentation and these modifications, if any, must be treated as Redistributables;
3) Redistributables may be distributed only as part of Licensee's application that was developed using the Program ("Licensee's Application") and only to support Licensee's customers in connection with their use of Licensee's Application. Licensee's Application must constitute significant value add such that the Redistributables are not a substantial motivation for the acquisition by end users of Licensee's software product;
4) If the Redistributables include a Java Runtime Environment, Licensee must also include other non-Java Redistributables with Licensee's Application, unless the Application is designed to run only on general computer devices (for example, laptops, desktops and servers) and not on handheld or other pervasive devices (i.e., devices that contain a microprocessor but do not have computing as their primary purpose);
5) Licensee may not remove any copyright or notice files contained in the Redistributables;
6) Licensee must hold IBM, its suppliers or distributors harmless from and against any claim arising out of the use or distribution of Licensee's Application;
7) Licensee may not use the same path name as the original Redistributable files/modules;
8) Licensee may not use IBM's, its suppliers or distributors names or trademarks in connection with the marketing of Licensee's Application without IBM's or that supplier's or distributor's prior written consent;
9) IBM, its suppliers and distributors provide the Redistributables and related documentation without obligation of support and "AS IS", WITH NO WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTY OF TITLE, NON-INFRINGEMENT OR NON-INTERFERENCE AND THE IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE;
10) Licensee is responsible for all technical assistance for Licensee's Application and any modifications to the Redistributables; and
11) Licensee's license agreement with the end user of Licensee's Application must notify the end user that the Redistributables or their modifications may not be i) used for any purpose other than to enable Licensee's Application, ii) copied (except for backup purposes), iii) further distributed or transferred without Licensee's Application or iv) reverse assembled, reverse compiled, or otherwise translated except as specifically permitted by law and without the possibility of a contractual waiver. Furthermore, Licensee's license agreement must be at least as protective of IBM as the terms of this Agreement.

Source Components and Sample Materials

The Program may include some components in source code form ("Source Components") and other materials identified as Sample Materials. Licensee may copy and modify Source Components and Sample Materials for internal use only provided such use is within the limits of the license rights under this Agreement, provided however that Licensee may not alter or delete any copyright information or notices contained in the Source Components or Sample Materials. IBM provides the Source Components and Sample Materials without obligation of support and "AS IS", WITH NO WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTY OF TITLE, NON-INFRINGEMENT OR NON-INTERFERENCE AND THE IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.

For Source Components and Sample Materials listed in a Program's REDIST file, Licensee may redistribute modified versions of those Source Components or Sample Materials consistent with the terms of this license and any instructions in the REDIST file.

Export and Import Restrictions

This Program may contain cryptography. Transfer to, or use by, users of the Program may be prohibited or subject to export or import laws, regulations or policies, including those of the United States Export Administration Regulations. Licensee assumes all responsibility for complying with all applicable laws, regulations, and policies regarding the export, import, or use of this Program, including but not limited to, U.S. restrictions on exports or reexports. To obtain the export classification of this Program refer to: https://www.ibm.com/products/exporting/.

Authorized User

Authorized User is a unit of measure by which the Program can be licensed. An Authorized User is a unique person who is given access to the Program. The Program may be installed on any number of computers or servers and each Authorized User may have simultaneous access to any number of instances of the Program at one time. Licensee must obtain separate, dedicated entitlements for each Authorized User given access to the Program in any manner directly or indirectly (for example: via a multiplexing program, device, or application server) through any means. An entitlement for an Authorized User is unique to that Authorized User and may not be shared, nor may it be reassigned other than for the permanent transfer of the Authorized User entitlement to another person.

Program-unique Terms

Multi Product Install Image

The Program is provided as part of a multi-product install image. Licensee is authorized to install and use only the Program (and its Supporting Programs, if any) for which an valid entitlement is obtained and may not install or use any of the other software included in the image unless Licensee has acquired separate entitlements for that other software.

Third Party Data and Services

The Program may contain links to or be able to be used to access third party data services, databases, web services, software, or other third party content (all, "content"). Access to this content is provided "as-is", without any warranty or guarantee on IBM's part, and can be terminated by the relevant third party at its sole discretion at any time. Licensee may be required to enter into a separate agreement with the third party for the access to or use of such content. IBM is not a party to any such separate agreement and as an express condition of this license Licensee agrees to comply with the terms of such separate agreement. To the extent that IBM has provided any warranty in respect of the Program, that IBM warranty does not apply to any such content.

If Licensee uses the Google Desktop Search feature of the Program, Licensee must review and agree to be bound by the Terms and Conditions set forth at http://desktop.google.com/eula.html. If Licensee places Google Gadgets on web pages through Licensee's use of the Program, Licensee must review and agree to be bound by the Syndicated Google Gadgets Terms of Service for Webmasters set forth at http://www.google.com/webmasters/gadgets/terms.html.

If Licensee uses the Google Web Search feature of the Program, Licensee acknowledges that Google, Inc., owns all right, title and interest, including without limitation all intellectual property rights, in and to the Google Web Search Service (including Google's search engine technology and Google brand features, and excluding items licensed by Google from third parties), and that Licensee does not acquire any right, title, or interest in or to the Google Web Search Service (including Google's search engine technology and Google brand features) by using this feature.

If Licensee uses the Yahoo! Web Search feature of the Program, Licensee must review and agree to be bound by the Terms of Service set forth at: http://info.yahoo.com/legal/us/yahoo/utos/utos-173.html. If Licensee uses the Yahoo! Web Search feature of the Program in a country other the United States, Licensee must review and agree to be bound by the Terms of Service applicable to such country set forth at http://world.yahoo.com/.

Permitted Components

Notwithstanding any provision in the Agreement, Licensee is permitted to use only the following components or functions of the identified Supporting Program:

- Presence and instant messaging capabilities (of Lotus Sametime Entry), but only with a single Sametime community (a "community" is a shared directory, or set of directories, that lists the Authorized Users and groups within Licensee's enterprise on one or more IBM Lotus Sametime servers that each have access to the shared directory or set of directories) and only when utilized within the IBM Lotus Notes client or the IBM Lotus iNotes environment.
- Chat logging service provider interface (of Lotus Sametime Entry).
- Plug-ins for integration with Microsoft applications (of Lotus Sametime Entry). 
- Web chat client (of Sametime Proxy Server), but only when utilized within the IBM Lotus iNotes environment. 

Licensees of IBM Lotus Domino Messaging Client Access License are authorized to access an IBM Lotus Domino Server via:

a) a standards-based (Post Office Protocol "POP" or Internet Message Access Protocol "IMAP") client and/or Web browser, or 

b) IBM Lotus Notes and IBM Lotus iNotes.

Licensee's authorized use of the Program includes rights to use IBM Lotus Notes only for email, and Personal Information Manager data, for exclusive use with the following templates that are included in or provided with the Program: Messaging/Calendar & Scheduling, Personal Directory, Personal Journal, Discussion, and Document Libraries, and not for any other purpose.


D/N:  L-GHUS-8EHK63
P/N:  CT64RML 

=========================


LICENSE INFORMATION

The Programs listed below are licensed under the following terms and conditions in addition to those of the International Program License Agreement.

Program Name: IBM Lotus Domino Enterprise Client Access License 8.5.3
Program Number: 5724Z08

Multi-Product Install Image

The Program is provided as part of a multi-product install image. Licensee is authorized to install and use only the Program (and its Supporting Programs, if any) for which a valid entitlement is obtained and may not install or use any of the other software included in the image unless Licensee has acquired separate entitlements for that other software.

Supporting Programs

The Program is licensed as a multi-product package and includes the Supporting Programs identified below. Licensee is authorized to install and use such Supporting Programs only to support Licensee's use of the Principal Program under this Agreement and within the limits of the Proofs of Entitlement for the Program (unless broader rights are provided elsewhere in this License Information document). The phrase "to support Licensee's use" would include only those uses that are necessary or otherwise directly related to a licensed use of the Principal Program or another Supporting Program. The Supporting Programs may not be used for any other purpose. Licensee is not authorized to transfer or remarket the Supporting Programs separate from the Principal Program. The terms of this Agreement may replace or modify the license terms for the Supporting Programs. In the event of conflict, these terms supersede the terms of the license agreement which accompanies the Supporting Programs. When Licensee's right to use the Program expires or terminates, Licensee must discontinue use, destroy or promptly return all copies of the Supporting Programs to the party from whom Licensee acquired the Program. If Licensee downloaded the Supporting Programs, Licensee should contact the party from whom Licensee acquired the Program. If Licensee wishes to license the Supporting Programs for any use beyond the limits set forth above, please contact an IBM Sales Representative or the party from whom Licensee acquired the Program to obtain the appropriate license.

The following are Supporting Programs licensed with the Program:
IBM Connections
IBM Lotus Domino Designer
IBM Lotus Domino Global Workbench
IBM Lotus Expeditor
IBM Lotus Mobile Connect Client
IBM Lotus Notes Traveler
IBM Lotus Symphony
IBM Sametime Entry
IBM Sametime Proxy Server

Prohibited Components

Notwithstanding any provision in the Agreement, Licensee is not authorized to use any of the following components or functions of the Program:
Activities (of IBM Connections)
Blogs (of IBM Connections)
Bookmarks (of IBM Connections)
Communities (of IBM Connections)
Forums (of IBM Connections)
HomePage (of IBM Connections)
Mobile (of IBM Connections)
Wikis (of IBM Connections)

Redistributables

If the Program includes components that are Redistributable, they will be identified in the REDIST file that accompanies the Program. In addition to the license rights granted in the Agreement, Licensee may distribute the Redistributables subject to the following terms:
1) Redistribution must be in object code form only and must conform to all directions, instruction and specifications in the Program's accompanying REDIST or documentation;
2) If the Program's accompanying documentation expressly allows Licensee to modify the Redistributables, such modification must conform to all directions, instruction and specifications in that documentation and these modifications, if any, must be treated as Redistributables;
3) Redistributables may be distributed only as part of Licensee's application that was developed using the Program ("Licensee's Application") and only to support Licensee's customers in connection with their use of Licensee's Application. Licensee's Application must constitute significant value add such that the Redistributables are not a substantial motivation for the acquisition by end users of Licensee's software product;
4) If the Redistributables include a Java Runtime Environment, Licensee must also include other non-Java Redistributables with Licensee's Application, unless the Application is designed to run only on general computer devices (for example, laptops, desktops and servers) and not on handheld or other pervasive devices (i.e., devices that contain a microprocessor but do not have computing as their primary purpose);
5) Licensee may not remove any copyright or notice files contained in the Redistributables;
6) Licensee must hold IBM, its suppliers or distributors harmless from and against any claim arising out of the use or distribution of Licensee's Application;
7) Licensee may not use the same path name as the original Redistributable files/modules;
8) Licensee may not use IBM's, its suppliers or distributors names or trademarks in connection with the marketing of Licensee's Application without IBM's or that supplier's or distributor's prior written consent;
9) IBM, its suppliers and distributors provide the Redistributables and related documentation without obligation of support and "AS IS", WITH NO WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTY OF TITLE, NON-INFRINGEMENT OR NON-INTERFERENCE AND THE IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE;
10) Licensee is responsible for all technical assistance for Licensee's Application and any modifications to the Redistributables; and
11) Licensee's license agreement with the end user of Licensee's Application must notify the end user that the Redistributables or their modifications may not be i) used for any purpose other than to enable Licensee's Application, ii) copied (except for backup purposes), iii) further distributed or transferred without Licensee's Application or iv) reverse assembled, reverse compiled, or otherwise translated except as specifically permitted by law and without the possibility of a contractual waiver. Furthermore, Licensee's license agreement must be at least as protective of IBM as the terms of this Agreement.

Source Components and Sample Materials

The Program may include some components in source code form ("Source Components") and other materials identified as Sample Materials. Licensee may copy and modify Source Components and Sample Materials for internal use only provided such use is within the limits of the license rights under this Agreement, provided however that Licensee may not alter or delete any copyright information or notices contained in the Source Components or Sample Materials. IBM provides the Source Components and Sample Materials without obligation of support and "AS IS", WITH NO WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTY OF TITLE, NON-INFRINGEMENT OR NON-INTERFERENCE AND THE IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.

For Source Components and Sample Materials listed in a Program's REDIST file, Licensee may redistribute modified versions of those Source Components or Sample Materials consistent with the terms of this license and any instructions in the REDIST file.

Export and Import Restrictions

This Program may contain cryptography. Transfer to, or use by, users of the Program may be prohibited or subject to export or import laws, regulations or policies, including those of the United States Export Administration Regulations. Licensee assumes all responsibility for complying with all applicable laws, regulations, and policies regarding the export, import, or use of this Program, including but not limited to, U.S. restrictions on exports or reexports. To obtain the export classification of this Program refer to: https://www.ibm.com/products/exporting/.

Authorized User

Authorized User is a unit of measure by which the Program can be licensed. An Authorized User is a unique person who is given access to the Program. The Program may be installed on any number of computers or servers and each Authorized User may have simultaneous access to any number of instances of the Program at one time. Licensee must obtain separate, dedicated entitlements for each Authorized User given access to the Program in any manner directly or indirectly (for example: via a multiplexing program, device, or application server) through any means. An entitlement for an Authorized User is unique to that Authorized User and may not be shared, nor may it be reassigned other than for the permanent transfer of the Authorized User entitlement to another person.

Program-unique Terms

Third Party Data and Services

The Program may contain links to or be able to be used to access third party data services, databases, web services, software, or other third party content (all, "content"). Access to this content is provided "as-is", without any warranty or guarantee on IBM's part, and can be terminated by the relevant third party at its sole discretion at any time. Licensee may be required to enter into a separate agreement with the third party for the access to or use of such content. IBM is not a party to any such separate agreement and as an express condition of this license Licensee agrees to comply with the terms of such separate agreement. To the extent that IBM has provided any warranty in respect of the Program, that IBM warranty does not apply to any such content.

If Licensee uses the Google Desktop Search feature of the Program, Licensee must review and agree to be bound by the Terms and Conditions set forth at http://desktop.google.com/eula.html. If Licensee places Google Gadgets on web pages through Licensee's use of the Program, Licensee must review and agree to be bound by the Syndicated Google Gadgets Terms of Service for Webmasters set forth at http://www.google.com/webmasters/gadgets/terms.html.

If Licensee uses the Google Web Search feature of the Program, Licensee acknowledges that Google, Inc., owns all right, title and interest, including without limitation all intellectual property rights, in and to the Google Web Search Service (including Google's search engine technology and Google brand features, and excluding items licensed by Google from third parties), and that Licensee does not acquire any right, title, or interest in or to the Google Web Search Service (including Google's search engine technology and Google brand features) by using this feature.

If Licensee uses the Yahoo! Web Search feature of the Program, Licensee must review and agree to be bound by the Terms of Service set forth at: http://info.yahoo.com/legal/us/yahoo/utos/utos-173.html. If Licensee uses the Yahoo! Web Search feature of the Program in a country other the United States, Licensee must review and agree to be bound by the Terms of Service applicable to such country set forth at http://world.yahoo.com/.

Permitted Components

Notwithstanding any provision in the Agreement, Licensee is permitted to use only the following components or functions of the identified Supporting Program:

- Presence and instant messaging capabilities (of Lotus Sametime Entry), but only with a single Sametime community (a "community" is a shared directory, or set of directories, that lists the Authorized Users and groups within Licensee's enterprise on one or more IBM Lotus Sametime servers that each have access to the shared directory or set of directories) and only when utilized within the IBM Lotus Notes client or the IBM Lotus iNotes environment.

- Chat logging service provider interface (of Lotus Sametime Entry).

- Plug-ins for integration with Microsoft applications (of Lotus Sametime Entry).

- Web chat client (of Sametime Proxy Server), but only when utilized within the IBM Lotus iNotes environment. 

Licensees of the Program are authorized to access an IBM Lotus Domino Server via:

a) a standards-based (Post Office Protocol "POP" or Internet Message Access Protocol "IMAP") client and/or Web browser, or 

b) IBM Lotus Notes and IBM Lotus iNotes.


D/N:  L-GHUS-8EHKAB
P/N:  CT64SML 

=========================


LICENSE INFORMATION

The Programs listed below are licensed under the following terms and conditions in addition to those of the International Program License Agreement.

Program Name: IBM Lotus Domino Designer 8.5.3
Program Number: 5724Z08

Multi-Product Install Image

The Program is provided as part of a multi-product install image. Licensee is authorized to install and use only the Program (and its Supporting Programs, if any) for which a valid entitlement is obtained and may not install or use any of the other software included in the image unless Licensee has acquired separate entitlements for that other software.

Limited Use Program

This Program is supplied only for use with Named Program(s) identified below or their successors. Licensee is prohibited from using this Program in connection with any other software.

Named Program(s):
IBM Lotus Domino Enterprise Client Access License

Export and Import Restrictions

This Program may contain cryptography. Transfer to, or use by, users of the Program may be prohibited or subject to export or import laws, regulations or policies, including those of the United States Export Administration Regulations. Licensee assumes all responsibility for complying with all applicable laws, regulations, and policies regarding the export, import, or use of this Program, including but not limited to, U.S. restrictions on exports or reexports. To obtain the export classification of this Program refer to: https://www.ibm.com/products/exporting/.

Program-unique Terms

Multi Product Install Image 

The Program is provided as part of a multi-product install image.  Licensee is authorized to install and use only the Program (and its Supporting Programs, if any) for which an valid entitlement is obtained and may not install or use any of the other software included in the image unless Licensee has acquired separate entitlements for that other software.

Third Party Data and Services

The Program may contain links to or be used to access third party data services, databases, web services, software, or other third party content (all, "content").  Access to this content is provided "AS-IS", WITH NO WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING THE WARRANTY OF TITLE, NON-INFRINGEMENT OR NON-INTERFERENCE AND THE IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, on IBM's part, and can be terminated by the relevant third parties at their sole discretion at any time.  Licensee may be required to enter into separate agreements with the third parties for the access to or use of such content.  IBM is not a party to any such separate agreements and as an express condition of this license Licensee agrees to comply with the terms of such separate agreements.  

If Licensee uses the Google Desktop Search feature of the Program, Licensee must review and agree to be bound by the Terms and Conditions set forth at http://desktop.google.com/eula.html. If Licensee places Google Gadgets on web pages through Licensee's use of the Program, Licensee must review and agree to be bound by the Syndicated Google Gadgets Terms of Service for Webmasters set forth at http://www.google.com/webmasters/gadgets/terms.html.

If Licensee uses the Google Web Search feature of the Program, Licensee acknowledges that Google, Inc., owns all right, title and interest, including without limitation all intellectual property rights, in and to the Google Web Search Service (including Google's search engine technology and Google brand features, and excluding items licensed by Google from third parties), and that Licensee does not acquire any right, title, or interest in or to the Google Web Search Service (including Google's search engine technology and Google brand features) by using this feature.

If Licensee uses the Yahoo! Web Search feature of the Program, Licensee must review and agree to be bound by the Terms of Service set forth at: http://info.yahoo.com/legal/us/yahoo/utos/utos-173.html. If Licensee uses the Yahoo! Web Search feature of the Program in a country other the United States, Licensee must review and agree to be bound by the Terms of Service applicable to such country set forth at http://world.yahoo.com/.

Licensee's authorized use of the Program includes the right to create or modify IBM Lotus Notes applications. 


D/N:  L-GHUS-8EHKDH
P/N:  CT64TML 