
This software is distributed under the Apache License, version 2.0. See (1) below.
This software is copyright (c) The Apache Software Foundation and contributors.

Contents:

  (1) This software license: Apache License, version 2.0
  (2) Notices for bundled software
  (3) Licenses for bundled software


---------------------------------------------------

(1) This software license: Apache License, version 2.0


                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) 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. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.


---------------------------------------------------

(2) Notices for bundled software

This project includes the software: async.js
  Available at: https://github.com/p15martin/google-maps-hello-world/blob/master/js/libs/async.js
  Developed by: Miller Medeiros (https://github.com/millermedeiros/)
  Version used: 0.1.1
  Used under the following license: The MIT License (http://opensource.org/licenses/MIT)
  Copyright (c) Miller Medeiros (2011)

This project includes the software: backbone.js
  Available at: http://backbonejs.org
  Developed by: DocumentCloud Inc. (http://www.documentcloud.org/)
  Version used: 1.0.0
  Used under the following license: The MIT License (http://opensource.org/licenses/MIT)
  Copyright (c) Jeremy Ashkenas, DocumentCloud Inc. (2010-2013)

This project includes the software: bootstrap.js
  Available at: http://twitter.github.com/bootstrap/javascript.html#transitions
  Version used: 2.0.4
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
  Copyright (c) Twitter, Inc. (2012)

This project includes the software: codemirror.js
  Available at: http://codemirror.net/
  Inclusive of: codemirror.{js,css}, show-hint.{js,css}, placeholder.js, anyword-hint.js, yaml.js
  Version used: 5.11.1
  Used under the following license: The MIT License (http://opensource.org/licenses/MIT)
  CodeMirror (c) Marijn Haverbeke and others

This project includes the software: Font Awesome (code)
  Available at: http://fontawesome.io/
  Inclusive of: font-awesome/{css,scss,less}/*
  Version used: 4.5.0
  Used under the following license: The MIT License (http://opensource.org/licenses/MIT)
  Copyright (c) Dave Gandy (2016)

This project includes the software: Font Awesome (fonts)
  Available at: http://fontawesome.io/
  Inclusive of: font-awesome/fonts/*
  Version used: 4.5.0
  Used under the following license: SIL OFL 1.1 (http://scripts.sil.org/OFL)
  Copyright (c) Dave Gandy (2016)

This project includes the software: github.com/NodePrime/jsonpath/cli/jsonpath
  Available at: github.com/NodePrime/jsonpath/
  Used under the following license: The MIT License (http://opensource.org/licenses/MIT)
  Copyright (c) 2015 NodePrime Inc.

This project includes the software: github.com/urfave/cli
  Available at: https://github.com/urfave/cli
  Used under the following license: The MIT License (http://opensource.org/licenses/MIT)
  Copyright (c) 2016 Jeremy Saenz & Contributors

This project includes the software: golang.org/x/crypto/ssh
  Available at: https://godoc.org/golang.org/x/crypto/ssh
  Used under the following license: The BSD 3-Clause (New BSD) License (http://opensource.org/licenses/BSD-3-Clause)
  Copyright (c) 2009 The Go Authors. All rights reserved.

This project includes the software: handlebars.js
  Available at: https://github.com/wycats/handlebars.js
  Developed by: Yehuda Katz (https://github.com/wycats/)
  Inclusive of: handlebars*.js
  Version used: 1.0-rc1
  Used under the following license: The MIT License (http://opensource.org/licenses/MIT)
  Copyright (c) Yehuda Katz (2012)

This project includes the software: jQuery JavaScript Library
  Available at: http://jquery.com/
  Developed by: The jQuery Foundation (http://jquery.org/)
  Inclusive of: jquery.js
  Version used: 1.7.2
  Used under the following license: The MIT License (http://opensource.org/licenses/MIT)
  Copyright (c) John Resig (2005-2011)
  Includes code fragments from sizzle.js:
    Copyright (c) The Dojo Foundation
    Available at http://sizzlejs.com
    Used under the MIT license

This project includes the software: jQuery BBQ: Back Button & Query Library
  Available at: http://benalman.com/projects/jquery-bbq-plugin/
  Developed by: "Cowboy" Ben Alman (http://benalman.com/)
  Inclusive of: jquery.ba-bbq*.js
  Version used: 1.2.1
  Used under the following license: The MIT License (http://opensource.org/licenses/MIT)
  Copyright (c) "Cowboy" Ben Alman (2010)"

This project includes the software: jQuery hashchange event
  Available at: http://benalman.com/projects/jquery-hashchange-plugin/
  Developed by: "Cowboy" Ben Alman (http://benalman.com/)
  Inclusive of: jquery.ba-bbq*.js
  Version used: 1.2
  Used under the following license: The MIT License (http://opensource.org/licenses/MIT)
  Copyright (c) "Cowboy" Ben Alman (2010)"

This project includes the software: DataTables Table plug-in for jQuery
  Available at: http://www.datatables.net/
  Developed by: SpryMedia Ltd (http://sprymedia.co.uk/)
  Inclusive of: jquery.dataTables.{js,css}
  Version used: 1.9.4
  Used under the following license: The BSD 3-Clause (New BSD) License (http://opensource.org/licenses/BSD-3-Clause)
  Copyright (c) Allan Jardine (2008-2012)

This project includes the software: jquery.easy-autocomplete.js
  Available at: https://github.com/pawelczak/EasyAutocomplete
  Version used: 1.3.3
  Used under the following license: The MIT License (http://opensource.org/licenses/MIT)
  Copyright (c) Łukasz Pawełczak (2015)

This project includes the software: jQuery Form Plugin
  Available at: https://github.com/malsup/form
  Developed by: Mike Alsup (http://malsup.com/)
  Inclusive of: jquery.form.js
  Version used: 3.09
  Used under the following license: The MIT License (http://opensource.org/licenses/MIT)
  Copyright (c) M. Alsup (2006-2013)

This project includes the software: jQuery Wiggle
  Available at: https://github.com/jordanthomas/jquery-wiggle
  Inclusive of: jquery.wiggle.min.js
  Version used: swagger-ui:1.0.1
  Used under the following license: The MIT License (http://opensource.org/licenses/MIT)
  Copyright (c) WonderGroup and Jordan Thomas (2010)
  Previously online at http://labs.wondergroup.com/demos/mini-ui/index.html.
  The version included here is from the Swagger UI distribution.

This project includes the software: js-uri
  Available at: http://code.google.com/p/js-uri/
  Developed by: js-uri contributors (https://code.google.com/js-uri)
  Inclusive of: URI.js
  Version used: 0.1
  Used under the following license: The BSD 3-Clause (New BSD) License (http://opensource.org/licenses/BSD-3-Clause)
  Copyright (c) js-uri contributors (2013)

This project includes the software: js-yaml.js
  Available at: https://github.com/nodeca/
  Developed by: Vitaly Puzrin (https://github.com/nodeca/)
  Version used: 3.5.2
  Used under the following license: The MIT License (http://opensource.org/licenses/MIT)
  Copyright (c) Vitaly Puzrin (2011-2015)

This project includes the software: marked.js
  Available at: https://github.com/chjj/marked
  Developed by: Christopher Jeffrey (https://github.com/chjj)
  Version used: 0.3.1
  Used under the following license: The MIT License (http://opensource.org/licenses/MIT)
  Copyright (c) Christopher Jeffrey (2011-2014)

This project includes the software: moment.js
  Available at: http://momentjs.com
  Developed by: Tim Wood (http://momentjs.com)
  Version used: 2.1.0
  Used under the following license: The MIT License (http://opensource.org/licenses/MIT)
  Copyright (c) Tim Wood, Iskren Chernev, Moment.js contributors (2011-2014)

This project includes the software: RequireJS
  Available at: http://requirejs.org/
  Developed by: The Dojo Foundation (http://dojofoundation.org/)
  Inclusive of: require.js, text.js
  Version used: 2.0.6
  Used under the following license: The MIT License (http://opensource.org/licenses/MIT)
  Copyright (c) The Dojo Foundation (2010-2012)

This project includes the software: RequireJS (r.js maven plugin)
  Available at: http://github.com/jrburke/requirejs
  Developed by: The Dojo Foundation (http://dojofoundation.org/)
  Inclusive of: r.js
  Version used: 2.1.6
  Used under the following license: The MIT License (http://opensource.org/licenses/MIT)
  Copyright (c) The Dojo Foundation (2009-2013)
  Includes code fragments for source-map and other functionality:
    Copyright (c) The Mozilla Foundation and contributors (2011)
    Used under the BSD 2-Clause license.
  Includes code fragments for parse-js and other functionality:
    Copyright (c) Mihai Bazon (2010, 2012)
    Used under the BSD 2-Clause license.
  Includes code fragments for uglifyjs/consolidator:
    Copyright (c) Robert Gust-Bardon (2012)
    Used under the BSD 2-Clause license.
  Includes code fragments for the esprima parser:
    Copyright (c):
      Ariya Hidayat (2011, 2012)
      Mathias Bynens (2012)
      Joost-Wim Boekesteijn (2012)
      Kris Kowal (2012)
      Yusuke Suzuki (2012)
      Arpad Borsos (2012)
    Used under the BSD 2-Clause license.

This project includes the software: Swagger UI
  Available at: https://github.com/swagger-api/swagger-ui
  Inclusive of: swagger*.{js,css,html}
  Version used: 2.1.4
  Used under the following license: Apache License, version 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
  Copyright (c) SmartBear Software (2011-2015)

This project includes the software: typeahead.js
  Available at: https://github.com/twitter/typeahead.js
  Developed by: Twitter, Inc (http://twitter.com)
  Version used: 0.10.5
  Used under the following license: The MIT License (http://opensource.org/licenses/MIT)
  Copyright (c) Twitter, Inc. and other contributors (2013-2014)

This project includes the software: underscore.js
  Available at: http://underscorejs.org
  Developed by: DocumentCloud Inc. (http://www.documentcloud.org/)
  Inclusive of: underscore*.{js,map}
  Version used: 1.4.4
  Used under the following license: The MIT License (http://opensource.org/licenses/MIT)
  Copyright (c) Jeremy Ashkenas, DocumentCloud Inc. (2009-2013)

This project includes the software: underscore.js:1.7.0
  Available at: http://underscorejs.org
  Developed by: DocumentCloud Inc. (http://www.documentcloud.org/)
  Inclusive of: underscore*.{js,map}
  Version used: 1.7.0
  Used under the following license: The MIT License (http://opensource.org/licenses/MIT)
  Copyright (c) Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors (2009-2014)

This project includes the software: ZeroClipboard
  Available at: http://zeroclipboard.org/
  Developed by: ZeroClipboard contributors (https://github.com/zeroclipboard)
  Inclusive of: ZeroClipboard.*
  Version used: 1.3.1
  Used under the following license: The MIT License (http://opensource.org/licenses/MIT)
  Copyright (c) Jon Rohan, James M. Greene (2014)


---------------------------------------------------

(3) Licenses for bundled software

Contents:

  Apache License, Version 2.0
  The BSD 2-Clause License
  The BSD 3-Clause License ("New BSD")
  The MIT License ("MIT")


Apache License, Version 2.0

  Apache License
  Version 2.0, January 2004
  http://www.apache.org/licenses/
  
  TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
  
  1. Definitions.
  
  "License" shall mean the terms and conditions for use, reproduction,
  and distribution as defined by Sections 1 through 9 of this document.
  
  "Licensor" shall mean the copyright owner or entity authorized by
  the copyright owner that is granting the License.
  
  "Legal Entity" shall mean the union of the acting entity and all
  other entities that control, are controlled by, or are under common
  control with that entity. For the purposes of this definition,
  "control" means (i) the power, direct or indirect, to cause the
  direction or management of such entity, whether by contract or
  otherwise, or (ii) ownership of fifty percent (50%) or more of the
  outstanding shares, or (iii) beneficial ownership of such entity.
  
  "You" (or "Your") shall mean an individual or Legal Entity
  exercising permissions granted by this License.
  
  "Source" form shall mean the preferred form for making modifications,
  including but not limited to software source code, documentation
  source, and configuration files.
  
  "Object" form shall mean any form resulting from mechanical
  transformation or translation of a Source form, including but
  not limited to compiled object code, generated documentation,
  and conversions to other media types.
  
  "Work" shall mean the work of authorship, whether in Source or
  Object form, made available under the License, as indicated by a
  copyright notice that is included in or attached to the work
  (an example is provided in the Appendix below).
  
  "Derivative Works" shall mean any work, whether in Source or Object
  form, that is based on (or derived from) the Work and for which the
  editorial revisions, annotations, elaborations, or other modifications
  represent, as a whole, an original work of authorship. For the purposes
  of this License, Derivative Works shall not include works that remain
  separable from, or merely link (or bind by name) to the interfaces of,
  the Work and Derivative Works thereof.
  
  "Contribution" shall mean any work of authorship, including
  the original version of the Work and any modifications or additions
  to that Work or Derivative Works thereof, that is intentionally
  submitted to Licensor for inclusion in the Work by the copyright owner
  or by an individual or Legal Entity authorized to submit on behalf of
  the copyright owner. For the purposes of this definition, "submitted"
  means any form of electronic, verbal, or written communication sent
  to the Licensor or its representatives, including but not limited to
  communication on electronic mailing lists, source code control systems,
  and issue tracking systems that are managed by, or on behalf of, the
  Licensor for the purpose of discussing and improving the Work, but
  excluding communication that is conspicuously marked or otherwise
  designated in writing by the copyright owner as "Not a Contribution."
  
  "Contributor" shall mean Licensor and any individual or Legal Entity
  on behalf of whom a Contribution has been received by Licensor and
  subsequently incorporated within the Work.
  
  2. Grant of Copyright License. Subject to the terms and conditions of
  this License, each Contributor hereby grants to You a perpetual,
  worldwide, non-exclusive, no-charge, royalty-free, irrevocable
  copyright license to reproduce, prepare Derivative Works of,
  publicly display, publicly perform, sublicense, and distribute the
  Work and such Derivative Works in Source or Object form.
  
  3. Grant of Patent License. Subject to the terms and conditions of
  this License, each Contributor hereby grants to You a perpetual,
  worldwide, non-exclusive, no-charge, royalty-free, irrevocable
  (except as stated in this section) patent license to make, have made,
  use, offer to sell, sell, import, and otherwise transfer the Work,
  where such license applies only to those patent claims licensable
  by such Contributor that are necessarily infringed by their
  Contribution(s) alone or by combination of their Contribution(s)
  with the Work to which such Contribution(s) was submitted. If You
  institute patent litigation against any entity (including a
  cross-claim or counterclaim in a lawsuit) alleging that the Work
  or a Contribution incorporated within the Work constitutes direct
  or contributory patent infringement, then any patent licenses
  granted to You under this License for that Work shall terminate
  as of the date such litigation is filed.
  
  4. Redistribution. You may reproduce and distribute copies of the
  Work or Derivative Works thereof in any medium, with or without
  modifications, and in Source or Object form, provided that You
  meet the following conditions:
  
  (a) You must give any other recipients of the Work or
  Derivative Works a copy of this License; and
  
  (b) You must cause any modified files to carry prominent notices
  stating that You changed the files; and
  
  (c) You must retain, in the Source form of any Derivative Works
  that You distribute, all copyright, patent, trademark, and
  attribution notices from the Source form of the Work,
  excluding those notices that do not pertain to any part of
  the Derivative Works; and
  
  (d) If the Work includes a "NOTICE" text file as part of its
  distribution, then any Derivative Works that You distribute must
  include a readable copy of the attribution notices contained
  within such NOTICE file, excluding those notices that do not
  pertain to any part of the Derivative Works, in at least one
  of the following places: within a NOTICE text file distributed
  as part of the Derivative Works; within the Source form or
  documentation, if provided along with the Derivative Works; or,
  within a display generated by the Derivative Works, if and
  wherever such third-party notices normally appear. The contents
  of the NOTICE file are for informational purposes only and
  do not modify the License. You may add Your own attribution
  notices within Derivative Works that You distribute, alongside
  or as an addendum to the NOTICE text from the Work, provided
  that such additional attribution notices cannot be construed
  as modifying the License.
  
  You may add Your own copyright statement to Your modifications and
  may provide additional or different license terms and conditions
  for use, reproduction, or distribution of Your modifications, or
  for any such Derivative Works as a whole, provided Your use,
  reproduction, and distribution of the Work otherwise complies with
  the conditions stated in this License.
  
  5. Submission of Contributions. Unless You explicitly state otherwise,
  any Contribution intentionally submitted for inclusion in the Work
  by You to the Licensor shall be under the terms and conditions of
  this License, without any additional terms or conditions.
  Notwithstanding the above, nothing herein shall supersede or modify
  the terms of any separate license agreement you may have executed
  with Licensor regarding such Contributions.
  
  6. Trademarks. This License does not grant permission to use the trade
  names, trademarks, service marks, or product names of the Licensor,
  except as required for reasonable and customary use in describing the
  origin of the Work and reproducing the content of the NOTICE file.
  
  7. Disclaimer of Warranty. Unless required by applicable law or
  agreed to in writing, Licensor provides the Work (and each
  Contributor provides its Contributions) 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. You are solely responsible for determining the
  appropriateness of using or redistributing the Work and assume any
  risks associated with Your exercise of permissions under this License.
  
  8. Limitation of Liability. In no event and under no legal theory,
  whether in tort (including negligence), contract, or otherwise,
  unless required by applicable law (such as deliberate and grossly
  negligent acts) or agreed to in writing, shall any Contributor be
  liable to You for damages, including any direct, indirect, special,
  incidental, or consequential damages of any character arising as a
  result of this License or out of the use or inability to use the
  Work (including but not limited to damages for loss of goodwill,
  work stoppage, computer failure or malfunction, or any and all
  other commercial damages or losses), even if such Contributor
  has been advised of the possibility of such damages.
  
  9. Accepting Warranty or Additional Liability. While redistributing
  the Work or Derivative Works thereof, You may choose to offer,
  and charge a fee for, acceptance of support, warranty, indemnity,
  or other liability obligations and/or rights consistent with this
  License. However, in accepting such obligations, You may act only
  on Your own behalf and on Your sole responsibility, not on behalf
  of any other Contributor, and only if You agree to indemnify,
  defend, and hold each Contributor harmless for any liability
  incurred by, or claims asserted against, such Contributor by reason
  of your accepting any such warranty or additional liability.
  

The BSD 2-Clause License

  Redistribution and use in source and binary forms, with or without
  modification, are permitted provided that the following conditions are met:
  
  1. Redistributions of source code must retain the above copyright notice, this
  list of conditions and the following disclaimer.
  
  2. Redistributions in binary form must reproduce the above copyright notice,
  this list of conditions and the following disclaimer in the documentation
  and/or other materials provided with the distribution.
  
  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  

The BSD 3-Clause License ("New BSD")

  Redistribution and use in source and binary forms, with or without modification,
  are permitted provided that the following conditions are met:
  
  1. Redistributions of source code must retain the above copyright notice, 
  this list of conditions and the following disclaimer.
  
  2. Redistributions in binary form must reproduce the above copyright notice, 
  this list of conditions and the following disclaimer in the documentation 
  and/or other materials provided with the distribution.
  
  3. Neither the name of the copyright holder nor the names of its contributors 
  may be used to endorse or promote products derived from this software without 
  specific prior written permission.
  
  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
  PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
  POSSIBILITY OF SUCH DAMAGE.
  

The MIT License ("MIT")

  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files (the "Software"), to deal
  in the Software without restriction, including without limitation the rights
  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  copies of the Software, and to permit persons to whom the Software is
  furnished to do so, subject to the following conditions:
  
  The above copyright notice and this permission notice shall be included in
  all copies or substantial portions of the Software.
  
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  THE SOFTWARE.
  

