// Copyright 2021 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Code generated by gen_exceptions.go; DO NOT EDIT.

//lint:file-ignore ST1018 Ignore staticcheck message about Unicode control characters.

package licenses

import "github.com/google/licensecheck"

var exceptionLicenses = []licensecheck.License{
	{ID: "AGPL-3.0", LRE: license_AGPL_3_0_lre},
	{ID: "Apache-2.0", LRE: license_Apache_2_0_lre},
	{ID: "BSD-1-Clause", LRE: license_BSD_1_Clause_lre},
	{ID: "BSD-1-Clause-Clear", LRE: license_BSD_1_Clause_Clear_lre},
	{ID: "BSD-2-Clause", LRE: license_BSD_2_Clause_lre},
	{ID: "BSD-2-Clause-Patent", LRE: license_BSD_2_Clause_Patent_lre},
	{ID: "BSD-2-Clause-Views", LRE: license_BSD_2_Clause_Views_lre},
	{ID: "BSD-3-Clause", LRE: license_BSD_3_Clause_lre},
	{ID: "BSD-3-Clause-Attribution", LRE: license_BSD_3_Clause_Attribution_lre},
	{ID: "BSD-3-Clause-Clear", LRE: license_BSD_3_Clause_Clear_lre},
	{ID: "BSD-3-Clause-LBNL", LRE: license_BSD_3_Clause_LBNL_lre},
	{ID: "BSD-3-Clause-No-Nuclear-License", LRE: license_BSD_3_Clause_No_Nuclear_License_lre},
	{ID: "BSD-3-Clause-No-Nuclear-License-2014", LRE: license_BSD_3_Clause_No_Nuclear_License_2014_lre},
	{ID: "BSD-3-Clause-No-Nuclear-Warranty", LRE: license_BSD_3_Clause_No_Nuclear_Warranty_lre},
	{ID: "BSD-3-Clause-NoTrademark", LRE: license_BSD_3_Clause_NoTrademark_lre},
	{ID: "BSD-3-Clause-Open-MPI", LRE: license_BSD_3_Clause_Open_MPI_lre},
	{ID: "BSD-4-Clause-UC", LRE: license_BSD_4_Clause_UC_lre},
	{ID: "BSD-4-Clause", LRE: license_BSD_4_Clause_lre},
	{ID: "BSD-Source-Code", LRE: license_BSD_Source_Code_lre},
	{ID: "EUPL-1.2", LRE: license_EUPL_1_2_lre},
	{ID: "GPL-2.0", LRE: license_GPL_2_0_lre},
	{ID: "GPL-3.0", LRE: license_GPL_3_0_lre},
	{ID: "MIT", LRE: license_MIT_lre},
	{ID: "MIT-0", LRE: license_MIT_0_lre},
	{ID: "MIT-NoAd", LRE: license_MIT_NoAd_lre},
	{ID: "MITNFA", LRE: license_MITNFA_lre},
	{ID: "MPL-2.0", LRE: license_MPL_2_0_lre},
	{ID: "MPL-2.0-no-copyleft-exception", LRE: license_MPL_2_0_no_copyleft_exception_lre},
	{ID: "NCSA", LRE: license_NCSA_lre},
	{ID: "Unlicense", LRE: license_Unlicense_lre},
	{ID: "atlantis", LRE: license_atlantis_lre},
	{ID: "atvg", LRE: license_atvg_lre},
	{ID: "autogold", LRE: license_autogold_lre},
	{ID: "autoscaler", LRE: license_autoscaler_lre},
	{ID: "battelle", LRE: license_battelle_lre},
	{ID: "blink", LRE: license_blink_lre},
	{ID: "bsd-eay", LRE: license_bsd_eay_lre},
	{ID: "cc0-1", LRE: license_cc0_1_lre},
	{ID: "cc0-2", LRE: license_cc0_2_lre},
	{ID: "cc0-3", LRE: license_cc0_3_lre},
	{ID: "cc0-4", LRE: license_cc0_4_lre},
	{ID: "ccby3", LRE: license_ccby3_lre},
	{ID: "ccby4", LRE: license_ccby4_lre},
	{ID: "ccbysa4", LRE: license_ccbysa4_lre},
	{ID: "cockroach", LRE: license_cockroach_lre},
	{ID: "dgraph", LRE: license_dgraph_lre},
	{ID: "drone", LRE: license_drone_lre},
	{ID: "dropbox", LRE: license_dropbox_lre},
	{ID: "fontawesome", LRE: license_fontawesome_lre},
	{ID: "freetype", LRE: license_freetype_lre},
	{ID: "frugal", LRE: license_frugal_lre},
	{ID: "geojson", LRE: license_geojson_lre},
	{ID: "glycerine", LRE: license_glycerine_lre},
	{ID: "golangdoc", LRE: license_golangdoc_lre},
	{ID: "gpl2", LRE: license_gpl2_lre},
	{ID: "gpl3", LRE: license_gpl3_lre},
	{ID: "gstats", LRE: license_gstats_lre},
	{ID: "hardikdr", LRE: license_hardikdr_lre},
	{ID: "heim", LRE: license_heim_lre},
	{ID: "hid", LRE: license_hid_lre},
	{ID: "ichain", LRE: license_ichain_lre},
	{ID: "ipld", LRE: license_ipld_lre},
	{ID: "jacamar", LRE: license_jacamar_lre},
	{ID: "learn", LRE: license_learn_lre},
	{ID: "maskimko", LRE: license_maskimko_lre},
	{ID: "mcm", LRE: license_mcm_lre},
	{ID: "micro", LRE: license_micro_lre},
	{ID: "mumax", LRE: license_mumax_lre},
	{ID: "mynewt", LRE: license_mynewt_lre},
	{ID: "newtmgr", LRE: license_newtmgr_lre},
	{ID: "passwordcheck", LRE: license_passwordcheck_lre},
	{ID: "permissive", LRE: license_permissive_lre},
	{ID: "protocol", LRE: license_protocol_lre},
	{ID: "rocketlaunchr", LRE: license_rocketlaunchr_lre},
	{ID: "rwth", LRE: license_rwth_lre},
	{ID: "skipper", LRE: license_skipper_lre},
	{ID: "splunk", LRE: license_splunk_lre},
	{ID: "stc", LRE: license_stc_lre},
	{ID: "tencent-1", LRE: license_tencent_1_lre},
	{ID: "tencent-2", LRE: license_tencent_2_lre},
	{ID: "tendermint", LRE: license_tendermint_lre},
	{ID: "transition", LRE: license_transition_lre},
	{ID: "yottadb", LRE: license_yottadb_lre},
}

var exceptionTypes = map[string][]string{
	"atlantis":      {"Apache-2.0"},
	"atvg":          {"MPL-2.0"},
	"autogold":      {"Apache-2.0", "MIT"},
	"autoscaler":    {"Apache-2.0", "BSD-2-Clause", "BSD-3-Clause", "ISC", "MIT", "MPL-2.0"},
	"battelle":      {"BSD-3-Clause"},
	"blink":         {"CC-BY-SA-4.0"},
	"bsd-eay":       {"BSD-3-Clause"},
	"cc0-1":         {"CC0-1.0"},
	"cc0-2":         {"CC0-1.0"},
	"cc0-3":         {"CC0-1.0"},
	"cc0-4":         {"CC0-1.0"},
	"ccby3":         {"CC-BY-3.0"},
	"ccby4":         {"CC-BY-4.0"},
	"ccbysa4":       {"CC-BY-SA-4.0"},
	"cockroach":     {"Apache-2.0"},
	"dgraph":        {"Apache-2.0", "AGPL-3.0"},
	"drone":         {"Apache-2.0"},
	"dropbox":       {"GPL-2.0"},
	"fontawesome":   {"MIT"},
	"freetype":      {"Freetype"},
	"frugal":        {"Apache-2.0"},
	"geojson":       {"CC-BY-SA-4.0"},
	"glycerine":     {"Apache-2.0"},
	"golangdoc":     {"CC-BY-3.0"},
	"gpl2":          {"GPL-2.0"},
	"gpl3":          {"GPL-3.0"},
	"gstats":        {"CC-BY-SA-4.0"},
	"hardikdr":      {"BSD-3-Clause", "Apache-2.0", "MIT"},
	"heim":          {"CC-BY-4.0", "MIT"},
	"hid":           {"BSD-3-Clause", "LGPL-2.1"},
	"ichain":        {"Apache-2.0"},
	"ipld":          {"Apache-2.0", "MIT"},
	"jacamar":       {"Apache-2.0", "MIT"},
	"learn":         {"CC-BY-4.0"},
	"maskimko":      {"Apache-2.0"},
	"mcm":           {"Apache-2.0", "BSD-3-Clause"},
	"micro":         {"Apache-2.0"},
	"mumax":         {"GPL-3.0-or-later", "CC-BY-3.0", "Freetype"},
	"mynewt":        {"Apache-2.0"},
	"passwordcheck": {"CC0-1.0"},
	"permissive":    {"MIT", "Apache-2.0"},
	"protocol":      {"Apache-2.0", "MIT"},
	"rocketlaunchr": {"MIT"},
	"rwth":          {"Apache-2.0", "MIT"},
	"skipper":       {"Apache-2.0", "MIT"},
	"splunk":        {"Apache-2.0"},
	"stc":           {"GPL-3.0-or-later", "Apache-2.0"},
	"tencent-1":     {"MIT"},
	"tencent-2":     {"MIT"},
	"tendermint":    {"Apache-2.0"},
	"transition":    {"MIT", "Apache-2.0"},
	"yottadb":       {"AGPL-3.0"},
}

const license_AGPL_3_0_lre = `





//**
GNU Affero General Public License v3.0
https://www.gnu.org/licenses/agpl.txt
https://opensource.org/licenses/AGPL-3.0
**//

((
	GNU AFFERO GENERAL PUBLIC LICENSE Version 3, 19 November 2007
	
	((
		((
			Copyright __20__
			((<https://fsf.org/>))??
			
	((
		51 Franklin
		((Street||St))
		((Fifth Floor||Suite 500,))??
		Boston, MA 02110 __1__ USA
	||
		59 Temple Place, Suite 330, Boston, MA  02111 __1__ USA
	||
		675 Mass Ave, Cambridge, MA 02139, USA
	))??
		))??

		Everyone is permitted to copy and distribute verbatim copies
		of this license document, but changing it is not allowed.

		((Copyright __20__))??
	))??

))??


Preamble

The GNU Affero General Public License is a free, copyleft license for software
and other kinds of works, specifically designed to ensure cooperation with the
community in the case of network server software.

The licenses for most software and other practical works are designed to take
away your freedom to share and change the works. By contrast, our General Public
Licenses are intended to guarantee your freedom to share and change all versions
of a program--to make sure it remains free software for all its users.

When we speak of free software, we are referring to freedom, not price. Our
General Public Licenses are designed to make sure that you have the freedom to
distribute copies of free software (and charge for them if you wish), that you
receive source code or can get it if you want it, that you can change the
software or use pieces of it in new free programs, and that you know you can do
these things.

Developers that use our General Public Licenses protect your rights with two
steps: (1) assert copyright on the software, and (2) offer you this License
which gives you legal permission to copy, distribute and/or modify the
software.

A secondary benefit of defending all users' freedom is that improvements made in
alternate versions of the program, if they receive widespread use, become
available for other developers to incorporate. Many developers of free software
are heartened and encouraged by the resulting cooperation. However, in the case
of software used on network servers, this result may fail to come about. The GNU
((Affero))??
General Public License permits making a modified version and letting the public
access it on a server without ever releasing its source code to the public.

The GNU Affero General Public License is designed specifically to ensure that,
in such cases, the modified source code becomes available to the community. It
requires the operator of a network server to provide the source code of the
modified version running there to the users of that server. Therefore, public
use of a modified version, on a publicly accessible server, gives the public
access to the source code of the modified version.

An older license, called the Affero General Public License and published by
Affero, was designed to accomplish similar goals. This is a different license,
not a version of the Affero GPL, but Affero has released a new version of the
Affero GPL which permits relicensing under this license.

The precise terms and conditions for copying, distribution and modification
follow.

TERMS AND CONDITIONS

   __1__ Definitions.

   "This License" refers to version 3 of the GNU Affero General Public License.

   "Copyright" also means copyright-like laws that apply to other kinds of
   works, such as semiconductor masks.

   "The Program" refers to any copyrightable work licensed under this License.
   Each licensee is addressed as "you". "Licensees" and "recipients" may be
   individuals or organizations.

   To "modify" a work means to copy from or adapt all or part of the work in a
   fashion requiring copyright permission, other than the making of an exact
   copy. The resulting work is called a "modified version" of the earlier work
   or a work "based on" the earlier work.

   A "covered work" means either the unmodified Program or a work based on the
   Program.

   To "propagate" a work means to do anything with it that, without permission,
   would make you directly or secondarily liable for infringement under
   applicable copyright law, except executing it on a computer or modifying a
   private copy. Propagation includes copying, distribution (with or without
   modification), making available to the public, and in some countries other
   activities as well.

   To "convey" a work means any kind of propagation that enables other parties
   to make or receive copies. Mere interaction with a user through a computer
   network, with no transfer of a copy, is not conveying.

   An interactive user interface displays "Appropriate Legal Notices" to the
   extent that it includes a convenient and prominently visible feature that (1)
   displays an appropriate copyright notice, and (2) tells the user that there
   is no warranty for the work (except to the extent that warranties are
   provided), that licensees may convey the work under this License, and how to
   view a copy of this License. If the interface presents a list of user
   commands or options, such as a menu, a prominent item in the list meets this
   criterion.

   __1__ Source Code.

   The "source code" for a work means the preferred form of the work for making
   modifications to it. "Object code" means any non-source form of a work.

   A "Standard Interface" means an interface that either is an official standard
   defined by a recognized standards body, or, in the case of interfaces
   specified for a particular programming language, one that is widely used
   among developers working in that language.

   The "System Libraries" of an executable work include anything, other than the
   work as a whole, that (a) is included in the normal form of packaging a Major
   Component, but which is not part of that Major Component, and (b) serves only
   to enable use of the work with that Major Component, or to implement a
   Standard Interface for which an implementation is available to the public in
   source code form. A "Major Component", in this context, means a major
   essential component (kernel, window system, and so on) of the specific
   operating system (if any) on which the executable work runs, or a compiler
   used to produce the work, or an object code interpreter used to run it.

   The "Corresponding Source" for a work in object code form means all the
   source code needed to generate, install, and (for an executable work) run the
   object code and to modify the work, including scripts to control those
   activities. However, it does not include the work's System Libraries, or
   general-purpose tools or generally available free programs which are used
   unmodified in performing those activities but which are not part of the work.
   For example, Corresponding Source includes interface definition files
   associated with source files for the work, and the source code for shared
   libraries and dynamically linked subprograms that the work is specifically
   designed to require, such as by intimate data communication or control flow
   between those

   subprograms and other parts of the work.

   The Corresponding Source need not include anything that users can regenerate
   automatically from other parts of the Corresponding Source.

   The Corresponding Source for a work in source code form is that same work.

   __1__ Basic Permissions.

   All rights granted under this License are granted for the term of copyright
   on the Program, and are irrevocable provided the stated conditions are met.
   This License explicitly affirms your unlimited permission to run the
   unmodified Program. The output from running a covered work is covered by this
   License only if the output, given its content, constitutes a covered work.
   This License acknowledges your rights of fair use or other equivalent, as
   provided by copyright law.

   You may make, run and propagate covered works that you do not convey, without
   conditions so long as your license otherwise remains in force. You may convey
   covered works to others for the sole purpose of having them make
   modifications exclusively for you, or provide you with facilities for running
   those works, provided that you comply with the terms of this License in
   conveying all material for which you do not control copyright. Those thus
   making or running the covered works for you must do so exclusively on your
   behalf, under your direction and control, on terms that prohibit them from
   making any copies of your copyrighted material outside their relationship
   with you.

   Conveying under any other circumstances is permitted solely under the
   conditions stated below. Sublicensing is not allowed; section 10 makes it
   unnecessary.

   __1__ Protecting Users' Legal
   ((Rights || ACLs))
   From Anti-Circumvention Law.

   No covered work shall be deemed part of an effective technological measure
   under any applicable law fulfilling obligations under article 11 of the WIPO
   copyright treaty adopted on 20 December 1996, or similar laws prohibiting or
   restricting circumvention of such measures.

   When you convey a covered work, you waive any legal power to forbid
   circumvention of technological measures to the extent such circumvention is
   effected by exercising rights under this License with respect to the covered
   work, and you disclaim any intention to limit operation or modification of
   the work as a means of enforcing, against the work's users, your or third
   parties' legal rights to forbid circumvention of technological measures.

   __1__ Conveying Verbatim Copies.

   You may convey verbatim copies of the Program's source code as you receive
   it, in any medium, provided that you conspicuously and appropriately publish
   on each copy an appropriate copyright notice; keep intact all notices stating
   that this License and any non-permissive terms added in accord with section 7
   apply to the code; keep intact all notices of the absence of any warranty;
   and give all recipients a copy of this License along with the Program.

   You may charge any price or no price for each copy that you convey, and you
   may offer support or warranty protection for a fee.

   __1__ Conveying Modified Source Versions.

   You may convey a work based on the Program, or the modifications to produce
   it from the Program, in the form of source code under the terms of section 4,
   provided that you also meet all of these conditions:

      __1__ The work must carry prominent notices stating that you modified it,
      and giving a relevant date.

      __1__ The work must carry prominent notices stating that it is released
      under this License and any conditions added under section 7. This
      requirement modifies the requirement in section 4 to "keep intact all
      notices".

      __1__ You must license the entire work, as a whole, under this License to
      anyone who comes into possession of a copy. This License will therefore
      apply, along with any applicable section 7 additional terms, to the whole
      of the work, and all its parts, regardless of how they are packaged. This
      License gives no permission to license the work in any other way, but it
      does not invalidate such permission if you have separately received it.

      __1__ If the work has interactive user interfaces, each must display
      Appropriate Legal Notices; however, if the Program has interactive
      interfaces that do not display Appropriate Legal Notices, your work need
      not make them do so.

   A compilation of a covered work with other separate and independent works,
   which are not by their nature extensions of the covered work, and which are
   not combined with it such as to form a larger program, in or on a volume of a
   storage or distribution medium, is called an "aggregate" if the compilation
   and its resulting copyright are not used to limit the access or legal rights
   of the compilation's users beyond what the individual works permit. Inclusion
   of a covered work in an aggregate does not cause this License to apply to the
   other parts of the aggregate.

   __1__ Conveying Non-Source Forms.

   You may convey a covered work in object code form under the terms of sections
   4 and 5, provided that you also convey the machine-readable Corresponding
   Source under the terms of this License, in one of these ways:

      __1__ Convey the object code in, or embodied in, a physical product
      (including a physical distribution medium), accompanied by the
      Corresponding Source fixed on a durable physical medium customarily used
      for software interchange.

      __1__ Convey the object code in, or embodied in, a physical product
      (including a physical distribution medium), accompanied by a written
      offer, valid for at least three years and valid for as long as you offer
      spare parts or customer support for that product model, to give anyone who
      possesses the object code either (1) a copy of the Corresponding Source
      for all the software in the product that is covered by this License, on a
      durable physical medium customarily used for software interchange, for a
      price no more than your reasonable cost of physically performing this
      conveying of source, or (2) access to copy the Corresponding Source from a
      network server at no charge.

      __1__ Convey individual copies of the object code with a copy of the
      written offer to provide the Corresponding Source. This alternative is
      allowed only occasionally and noncommercially, and only if you received
      the object code with such an offer, in accord with subsection 6b.

      __1__ Convey the object code by offering access from a designated place
      (gratis or for a charge), and offer equivalent access to the Corresponding
      Source in the same way through the same place at no further charge. You
      need not require recipients to copy the Corresponding Source along with
      the object code. If the place to copy the object code is a network server,
      the Corresponding Source may be on a different server (operated by you or
      a third party) that supports equivalent copying facilities, provided you
      maintain clear directions next to the object code saying where to find the
      Corresponding Source. Regardless of what server hosts the Corresponding
      Source, you remain obligated to ensure that it is available for as long as
      needed to satisfy these requirements.

      __1__ Convey the object code using peer-to-peer transmission, provided you
      inform other peers where the object code and Corresponding Source of the
      work are being offered to the general public at no charge under subsection
      6d.

   A separable portion of the object code, whose source code is excluded from
   the Corresponding Source as a System Library, need not be included in
   conveying the object code work.

   A "User Product" is either (1) a "consumer product", which means any tangible
   personal property which is normally used for personal, family, or household
   purposes, or (2) anything designed or sold for incorporation into a dwelling.
   In determining whether a product is a consumer product, doubtful cases shall
   be resolved in favor of coverage. For a particular product received by a
   particular user, "normally used" refers to a typical or common use of that
   class of product, regardless of the status of the particular user or of the
   way in which the particular user actually uses, or expects or is expected to
   use, the product. A product is a consumer product regardless of whether the
   product has substantial commercial, industrial or non-consumer uses, unless
   such uses represent the only significant mode of use of the product.

   "Installation Information" for a User Product means any methods, procedures,
   authorization keys, or other information required to install and execute
   modified versions of a covered work in that User Product from a modified
   version of its Corresponding Source. The information must suffice to ensure
   that the continued functioning of the modified object code is in no case
   prevented or interfered with solely because modification has been made.

   If you convey an object code work under this section in, or with, or
   specifically for use in, a User Product, and the conveying occurs as part of
   a transaction in which the right of possession and use of the User Product is
   transferred to the recipient in perpetuity or for a fixed term (regardless of
   how the transaction is characterized), the Corresponding Source conveyed
   under this section must be accompanied by the Installation Information. But
   this requirement does not apply if neither you nor any third party retains
   the ability to install modified object code on the User Product (for example,
   the work has been installed in ROM).

   The requirement to provide Installation Information does not include a
   requirement to continue to provide support service, warranty, or updates for
   a work that has been modified or installed by the recipient, or for the User
   Product in which it has been modified or installed. Access to a network may
   be denied when the modification itself materially and adversely affects the
   operation of the network or violates the rules and protocols for
   communication across the network.

   Corresponding Source conveyed, and Installation Information provided, in
   accord with this section must be in a format that is publicly documented (and
   with an implementation available to the public in source code form), and must
   require no special password or key for unpacking, reading or copying.

   __1__ Additional Terms.

   "Additional permissions" are terms that supplement the terms of this License
   by making exceptions from one or more of its conditions. Additional
   permissions that are applicable to the entire Program shall be treated as
   though they were included in this License, to the extent that they are valid
   under applicable law. If additional permissions apply only to part of the
   Program, that part may be used separately under those permissions, but the
   entire Program remains governed by this License without regard to the
   additional permissions.

   When you convey a copy of a covered work, you may at your option remove any
   additional permissions from that copy, or from any part of it. (Additional
   permissions may be written to require their own removal in certain cases when
   you modify the work.) You may place additional permissions on material, added
   by you to a covered work, for which you have or can give appropriate
   copyright permission.

   Notwithstanding any other provision of this License, for material you add to
   a covered work, you may (if authorized by the copyright holders of that
   material) supplement the terms of this License with terms:

      __1__ Disclaiming warranty or limiting liability differently from the
      terms of sections 15 and 16 of this License; or

      __1__ Requiring preservation of specified reasonable legal notices or
      author attributions in that material or in the Appropriate Legal Notices
      displayed by works containing it; or

      __1__ Prohibiting misrepresentation of the origin of that material, or
      requiring that modified versions of such material be marked in reasonable
      ways as different from the original version; or

      __1__ Limiting the use for publicity purposes of names of licensors or
      authors of the material; or

      __1__ Declining to grant rights under trademark law for use of some trade
      names, trademarks, or service marks; or

      __1__ Requiring indemnification of licensors and authors of that material
      by anyone who conveys the material (or modified versions of it) with
      contractual assumptions of liability to the recipient, for any liability
      that these contractual assumptions directly impose on those licensors and
      authors.

   All other non-permissive additional terms are considered "further
   restrictions" within the meaning of section 10. If the Program as you
   received it, or any part of it, contains a notice stating that it is governed
   by this License along with a term that is a further restriction, you may
   remove that term. If a license document contains a further restriction but
   permits relicensing or conveying under this License, you may add to a covered
   work material governed by the terms of that license document, provided that
   the further restriction does not survive such relicensing or conveying.

   If you add terms to a covered work in accord with this section, you must
   place, in the relevant source files, a statement of the additional terms that
   apply to those files, or a notice indicating where to find the applicable
   terms.

   Additional terms, permissive or non-permissive, may be stated in the form of
   a separately written license, or stated as exceptions; the above requirements
   apply either way.

   __1__ Termination.

   You may not propagate or modify a covered work except as expressly provided
   under this License. Any attempt otherwise to propagate or modify it is void,
   and will automatically terminate your rights under this License (including
   any patent licenses granted under the third paragraph of section 11).

   However, if you cease all violation of this License, then your license from a
   particular copyright holder is reinstated (a) provisionally, unless and until
   the copyright holder explicitly and finally terminates your license, and (b)
   permanently, if the copyright holder fails to notify you of the violation by
   some reasonable means prior to 60 days after the cessation.

   Moreover, your license from a particular copyright holder is reinstated
   permanently if the copyright holder notifies you of the violation by some
   reasonable means, this is the first time you have received notice of
   violation of this License (for any work) from that copyright holder, and you
   cure the violation prior to 30 days after your receipt of the notice.

   Termination of your rights under this section does not terminate the licenses
   of parties who have received copies or rights from you under this License. If
   your rights have been terminated and not permanently reinstated, you do not
   qualify to receive new licenses for the same material under section 10.

   __1__ Acceptance Not Required for Having Copies.

   You are not required to accept this License in order to receive or run a copy
   of the Program. Ancillary propagation of a covered work occurring solely as a
   consequence of using peer-to-peer transmission to receive a copy likewise
   does not require acceptance. However, nothing other than this License grants
   you permission to propagate or modify any covered work. These actions
   infringe copyright if you do not accept this License. Therefore, by modifying
   or propagating a covered work, you indicate your acceptance of this License
   to do so.

   __1__ Automatic Licensing of Downstream Recipients.

   Each time you convey a covered work, the recipient automatically receives a
   license from the original licensors, to run, modify and propagate that work,
   subject to this License. You are not responsible for enforcing compliance by
   third parties with this License.

   An "entity transaction" is a transaction transferring control of an
   organization, or substantially all assets of one, or subdividing an
   organization, or merging organizations. If propagation of a covered work
   results from an entity transaction, each party to that transaction who
   receives a copy of the work also receives whatever licenses to the work the
   party's predecessor in interest had or could give under the previous
   paragraph, plus a right to possession of the Corresponding Source of the work
   from the predecessor in interest, if the predecessor has it or can get it
   with reasonable efforts.

   You may not impose any further restrictions on the exercise of the rights
   granted or affirmed under this License. For example, you may not impose a
   license fee, royalty, or other charge for exercise of rights granted under
   this License, and you may not initiate litigation (including a cross-claim or
   counterclaim in a lawsuit) alleging that any patent claim is infringed by
   making, using, selling, offering for sale, or importing the Program or any
   portion of it.

   __1__ Patents.

   A "contributor" is a copyright holder who authorizes use under this License
   of the Program or a work on which the Program is based. The work thus
   licensed is called the contributor's "contributor version".

   A contributor's "essential patent claims" are all patent claims owned or
   controlled by the contributor, whether already acquired or hereafter
   acquired, that would be infringed by some manner, permitted by this License,
   of making, using, or selling its contributor version, but do not include
   claims that would be infringed only as a consequence of further modification
   of the contributor version. For purposes of this definition, "control"
   includes the right to grant patent sublicenses in a manner consistent with
   the requirements of this License.

   Each contributor grants you a non-exclusive, worldwide, royalty-free patent
   license under the contributor's essential patent claims, to make, use, sell,
   offer for sale, import and otherwise run, modify and propagate the contents
   of its contributor version.

   In the following three paragraphs, a "patent license" is any express
   agreement or commitment, however denominated, not to enforce a patent (such
   as an express permission to practice a patent or covenant not to s ue for
   patent infringement). To "grant" such a patent license to a party means to
   make such an agreement or commitment not to enforce a patent against the
   party.

   If you convey a covered work, knowingly relying on a patent license, and the
   Corresponding Source of the work is not available for anyone to copy, free of
   charge and under the terms of this License, through a publicly available
   network server or other readily accessible means, then you must either (1)
   cause the Corresponding Source to be so available, or (2) arrange to deprive
   yourself of the benefit of the patent license for this particular work, or
   (3) arrange, in a manner consistent with the requirements of this License, to
   extend the patent

   license to downstream recipients. "Knowingly relying" means you have actual
   knowledge that, but for the patent license, your conveying the covered work
   in a country, or your recipient's use of the covered work in a country, would
   infringe one or more identifiable patents in that country that you have
   reason to believe are valid.

   If, pursuant to or in connection with a single transaction or arrangement,
   you convey, or propagate by procuring conveyance of, a covered work, and
   grant a patent license to some of the parties receiving the covered work
   authorizing them to use, propagate, modify or convey a specific copy of the
   covered work, then the patent license you grant is automatically extended to
   all recipients of the covered work and works based on it.

   A patent license is "discriminatory" if it does not include within the scope
   of its coverage, prohibits the exercise of, or is conditioned on the
   non-exercise of one or more of the rights that are specifically granted under
   this License. You may not convey a covered work if you are a party to an
   arrangement with a third party that is in the business of distributing
   software, under which you make payment to the third party based on the extent
   of your activity of conveying the work, and under which the third party
   grants, to any of the parties who would receive the covered work from you, a
   discriminatory patent license (a) in connection with copies of the covered
   work conveyed by you (or copies made from those copies), or (b) primarily for
   and in connection with specific products or compilations that contain the
   covered work, unless you entered into that arrangement, or that patent
   license was granted, prior to 28 March 2007.

   Nothing in this License shall be construed as excluding or limiting any
   implied license or other defenses to infringement that may otherwise be
   available to you under applicable patent law.

   __1__ No Surrender of Others' Freedom.

   If conditions are imposed on you (whether by court order, agreement or
   otherwise) that contradict the conditions of this License, they do not excuse
   you from the conditions of this License. If you cannot convey a covered work
   so as to satisfy simultaneously your obligations under this License and any
   other pertinent obligations, then as a consequence you may

   not convey it at all. For example, if you agree to terms that obligate you to
   collect a royalty for further conveying from those to whom you convey the
   Program, the only way you could satisfy both those terms and this License
   would be to refrain entirely from conveying the Program.

   __1__ Remote Network Interaction; Use with the GNU
   ((Affero))??
   General Public License.

   Notwithstanding any other provision of this License, if you modify the
   Program, your modified version must prominently offer all users interacting
   with it remotely through a computer network (if your version supports such
   interaction) an opportunity to receive the Corresponding Source of your
   version by providing access to the Corresponding Source from a network server
   at no charge, through some standard or customary means of facilitating
   copying of software. This Corresponding Source shall include the
   Corresponding Source for any work covered by version 3 of the GNU
   ((Affero))??
   General
   Public License that is incorporated pursuant to the following paragraph.

   Notwithstanding any other provision of this License, you have permission to
   link or combine any covered work with a work licensed under version 3 of the
   GNU
   ((Affero))??
   General Public License into a single combined work, and to convey the
   resulting work. The terms of this License will continue to apply to the part
   which is the covered work, but the work with which it is combined will remain
   governed by version 3 of the GNU
   ((Affero))??
   General Public License.

   __1__ Revised Versions of this License.

   The Free Software Foundation may publish revised and/or new versions of the
   GNU Affero General Public License from time to time. Such new versions will
   be similar in spirit to the present version, but may differ in detail to
   address new problems or concerns.

   Each version is given a distinguishing version number. If the Program
   specifies that a certain numbered version of the GNU Affero General Public
   License "or any later version" applies to it, you have the option of
   following the terms and conditions either of that numbered version or of any
   later version published by the Free Software Foundation. If the Program does
   not specify a version number of the GNU Affero General Public License, you
   may choose any version ever published by the Free Software Foundation.

   If the Program specifies that a proxy can decide which future versions of the
   GNU Affero General Public License can be used, that proxy's public statement
   of acceptance of a version permanently authorizes you to choose that version
   for the Program.

   Later license versions may give you additional or different permissions.
   However, no additional obligations are imposed on any author or copyright
   holder as a result of your choosing to follow a later version.

   __1__ Disclaimer of Warranty.

   THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE
   LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
   OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND,
   EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
   ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.
   SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY
   SERVICING, REPAIR OR CORRECTION.

   __1__ Limitation of Liability.

   IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL
   ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE
   PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
   GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE
   OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR
   DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR
   A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH
   HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

   __1__ Interpretation of Sections 15 and 16.

   If the disclaimer of warranty and limitation of liability provided above
   cannot be given local legal effect according to their terms, reviewing courts
   shall apply local law that most closely approximates an absolute waiver of
   all civil liability in connection with the Program, unless a warranty or
   assumption of liability accompanies a copy of the Program in return for a
   fee.

((  END OF TERMS AND CONDITIONS ))??

((

How to Apply These Terms to Your New Programs

If you develop a new program, and you want it to be of the greatest possible use
to the public, the best way to achieve this is to make it free software which
everyone can redistribute and change under these terms.

To do so, attach the following notices to the program. It is safest to attach
them to the start of each source file to most effectively state the exclusion of
warranty; and each file should have at least the "copyright" line and a pointer
to where the full notice is found.

__30__
//**
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
**//

This program is free software: you can redistribute it and/or modify it under
the terms of the GNU Affero General Public License as published by the Free
Software Foundation, either version 3 of the License, or
(( (at your option) ))??
any
later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License along
with this program. If not, see <https:/www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

If your software can interact with users remotely through a computer network,
you should also make sure that it provides a way for users to get its source.
For example, if your program is a web application, its interface could display a
"Source" link that leads users to an archive of the code. There are many ways
you could offer source, and different solutions will be better for different
programs; see section 13 for the specific requirements.

You should also get your employer (if you work as a programmer) or school, if
any, to sign a "copyright disclaimer" for the program, if necessary. For more
information on this, and how to apply and follow the GNU AGPL, see <https:/www.gnu.org/licenses/>. ))??
`
const license_Apache_2_0_lre = `//**
Apache License 2.0
https://spdx.org/licenses/Apache-2.0.json
http://www.apache.org/licenses/LICENSE-2.0
https://opensource.org/licenses/Apache-2.0

exceptions:
  (( i || properties ))		https://github.com/apache/rocketmq-client-go/issues/590
  (( except || expect ))	https://github.com/Dwarfartisan/goparsec2/issues/6
  __1__ License, etc.		github.com/ltto/gomybatis@v5.1.7+incompatible and several others
**//

((
	((This program is))??
	((Licensed || licenses this __1__))
	((to you))??
	under the Apache License, Version 2.0
	(( (the "License") ))??
	((
		((and))??
		you may not use __5__
		except in compliance with the
		((License || Apache License Version 2.0))
	))??

	((
		((
			A copy of the
			((Apache-2.0))??
			License is located
		||
			You may obtain a copy of the
			((
				((Apache-2.0))??
				License
			||
				Apache License Version 2.0
			))
			((in the LICENSE file or))??
		))
		at
		((the following location))??
	))??

	((
		((http))??
		((www))??
		.apache.org/licenses/LICENSE-2.0
		((html))??
	||
		((http))??
		aws.amazon.com/apache2.0/
	))??

	((or in the license file accompanying this
		((file. || software.))
	))??

	((
		((As well as the file __10__))??
		((
			((Unless required by applicable law or agreed to in writing,))??
			((
				this file
			||
				software distributed under the
				((License || Apache License Version 2.0))
			))
			is distributed on an "AS IS" BASIS,
			WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
			either express or implied.
		||
			
((DISCLAIMER))??
((2.))??

THE
((SOFTWARE || MATERIALS))
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 || WILL))
__6__ BE LIABLE
FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION
((OF || F))
CONTRACT,
((TORT || FART))
OR OTHERWISE,
ARISING FROM, OUT OF OR
((IN || I))
CONNECTION WITH
((TE || THE))
((SOFTWARE || MATERIALS))
OR THE USE OR OTHER DEALINGS IN
((THE
	((SOFTWARE || MATERIALS))
))??

		||
			THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
			KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
			WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
			MERCHANTABLITY OR NON-INFRINGEMENT.
		))
	))??

	((
		See the
		((License || Apache Version 2.0 License || Apache License Version 2.0))
		for
		((the))??
		specific language governing permissions and limitations
		((thereunder || there under || under the License.))
	))??

||

(( 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 __1__ document.

      (("Licensor" || "Restream"))
      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 __1__ definition, "control" means (
      (( i || properties || k ))
      ) 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 __1__ 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 || pointer ))
      //** voyagermesh.dev_voyager **//

      "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 __1__ 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 __1__ definition, "submitted" means any form of electronic,
      verbal, or written
      ((communication || token))
      sent to the Licensor or its
      representatives, including but not limited to
      ((communication || token))
      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 || token))
      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 __1__
   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 __1__ License,
   each Contributor hereby grants to You a perpetual, worldwide, non-exclusive,
   no-charge, royalty-free, irrevocable (
   (( except || expect ))
   as stated in __1__ 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 || luit))
   ) 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 __1__ 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:

      (( 1. || (a) ))??
      You must give any other recipients of the Work or Derivative Works a copy
      of __1__ License; and

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

      (( 3. || 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

      (( 4. || (d) || (c) ))??
      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.

      (( 5. ))??
      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
      __1__ 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 __1__ 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. __1__ License does not grant permission to use the trade names,
   trademarks, service marks, or product names of the Licensor,
   (( except || expect ))
   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 __1__ 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 __1__ 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 __1__ 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.

(( END OF TERMS AND CONDITIONS ))??

((
APPENDIX: How to apply the Apache License to your work.

To apply the Apache License to your work, attach the following boilerplate
notice, with the fields enclosed by brackets "[]" replaced with your own
identifying information. (Don't include the brackets!) The text should be
enclosed in the appropriate comment syntax for the file format. We also
recommend that a file or class name and description of purpose be included on
the same "printed page" as the copyright notice for easier identification within
third-party archives.

	Copyright __20__

	Licensed under the Apache License, Version 2.0 (the "License");
	you may not use __1__ file
	(( except || expect ))
	in compliance with the License.
	You may obtain a copy of the License at

	http:/www.apache.org/licenses/LICENSE-2.0

	Unless required by applicable law or agreed to in writing, software
	distributed under the License is distributed on an "AS IS" BASIS,
	WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
	
	See the License for the specific language governing permissions and
	limitations under the License.
))??

))

//** from github.com/jsccast/rocksdb@v0.0.0-20150219174706-b65d32cc6e76/LICENSE **//

((
	Portions Copyright __5__

	

Permission is hereby granted,
((free of charge))??
to any person obtaining a copy of
__7__ //** (allow parenthetical descriptions) **//
((and associated documentation files))??
((
	the
	((Software || Materials || â€œSoftwareâ€))
||
//** Using a __1__ wildcard here causes some licenses to fail to match. **//
	Clausify
||
	EchoWBT
))
to deal in the
((Software || Materials))
((under the copyrights))??
((without restriction))??
including
((without limitation))??
the rights
((to))??
use, copy, modify, merge,
((
    publish, distribute,
    ((sublicense))??
    ((
	    and/or
	    ((sell))??
	    ((modified))??
    ))??
    copies of the
    ((Software || Materials))
))??
((
    and to permit persons to whom the
    ((Software is || Materials are))
    furnished to do so,
))??

subject to
((the following || all))
conditions:

	
__1__
((
	The above
	((copyright || authorship))
	notice
	(( and
		((this permission || thismssion))
		notice
		((including the next paragraph))??
	|| as well as this permission notice
	|| this permission notice, and the below disclaimer
	|| and every other copyright notice found in this software,
		and all the attributions in every file, and this permission notice
	|| and this permission notice (or reference to this permission notice) ))
||
	This permission notice
))
((must || shall))
be included in all
copies
or
((substantial || any))??
portions of the
((Software || Materials))
(( (Unless stated in separate file). ))??

))??
`
const license_BSD_1_Clause_lre = `
//**
BSD 1-Clause License
https://spdx.org/licenses/BSD-1-Clause.json
https://svnweb.freebsd.org/base/head/include/ifaddrs.h?revision=326823
**//

	Redistribution and use
	((of
		((this software || __5__))
	))??
	in source and binary forms
	((of __6__))??
	with or
	((without))??
	modification,
	are permitted
	((subject to the limitations in the disclaimer below))??
	((provided || providing))
	that
	((the))??
	following conditions are met:
	((BSD style license))??


	__1__
	((Redistribution || Redistributions))
	of
	((source code || works))
	must retain the
	((above))??
	((original))??
	copyright
	((notice))??
	((immediately at the beginning of the file, without modification))??
	this
	((list of conditions || condition))
	and the
	((following
		((two paragraphs of))??
		disclaimer
	|| disclaimer that follows))
	((in this position and unchanged))??


	((DISCLAIMER
	))??

	((
		THE
		((SOFTWARE || WORK))
		((AND DOCUMENTATION))??
		IS PROVIDED
		((BY __20__))??
		"AS IS"
		((
			((WITHOUT ANY WARRANTIES WHATSOEVER))??
			((AND))??
			ANY
			((EXPRESS || EXPRESSED))
			OR IMPLIED WARRANTIES,
			INCLUDING, BUT NOT LIMITED TO,
			THE IMPLIED WARRANTIES
			((OF || OR))
			((NONINFRINGEMENT))??
			((MERCHANTABILITY))??
			((AND))??
			FITNESS FOR A PARTICULAR PURPOSE
			((OR NONINFRINGEMENT))??
			ARE
			((EXPRESSLY AND SPECIFICALLY))??
			((HEREBY))??
			DISCLAIMED.
		||
			//** Alternate form in libpcap, which also omits the IN NO EVENT paragraph. **//
			AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
			INCLUDING, WITHOUT LIMITATION,
			THE IMPLIED WARRANTIES OF MERCHANTABILTY
			AND FITNESS FOR A PARTICULAR PURPOSE.
		))

		((
			IN NO EVENT SHALL __20__ 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 || WORK))
				((AND DOCUMENTATION))??
				EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
			))??
		))??

	||

		//**
		Alternate form found in some recent University of California releases.
		**//
		IN NO EVENT SHALL __20__ BE LIABLE
		TO ANY PARTY FOR DIRECT, INDIRECT,
		SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS,
		ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
		__20__ HAS BEEN ADVISED
		OF THE POSSIBILITY OF SUCH DAMAGE.

		__20__ SPECIFICALLY DISCLAIMS
		ANY WARRANTIES, INCLUDING, BUT NOT
		LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
		A PARTICULAR PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF
		ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS"
		__20__ HAS NO OBLIGATION
		TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
		MODIFICATIONS.
	))


`
const license_BSD_1_Clause_Clear_lre = `
//**
Not known to SPDX - BSD-3-Clause-Clear with only 1 Clause
Example:
	https://github.com/spate/glimage
**//

	Redistribution and use
	((of
		((this software || __5__))
	))??
	in source and binary forms
	((of __6__))??
	with or
	((without))??
	modification,
	are permitted
	((subject to the limitations in the disclaimer below))??
	((provided || providing))
	that
	((the))??
	following conditions are met:
	((BSD style license))??


	__1__
	((Redistribution || Redistributions))
	of
	((source code || works))
	must retain the
	((above))??
	((original))??
	copyright
	((notice))??
	((immediately at the beginning of the file, without modification))??
	this
	((list of conditions || condition))
	and the
	((following
		((two paragraphs of))??
		disclaimer
	|| disclaimer that follows))
	((in this position and unchanged))??


	NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S
	PATENT RIGHTS ARE GRANTED BY THIS LICENSE.


	((DISCLAIMER
	))??

	((
		THE
		((SOFTWARE || WORK))
		((AND DOCUMENTATION))??
		IS PROVIDED
		((BY __20__))??
		"AS IS"
		((
			((WITHOUT ANY WARRANTIES WHATSOEVER))??
			((AND))??
			ANY
			((EXPRESS || EXPRESSED))
			OR IMPLIED WARRANTIES,
			INCLUDING, BUT NOT LIMITED TO,
			THE IMPLIED WARRANTIES
			((OF || OR))
			((NONINFRINGEMENT))??
			((MERCHANTABILITY))??
			((AND))??
			FITNESS FOR A PARTICULAR PURPOSE
			((OR NONINFRINGEMENT))??
			ARE
			((EXPRESSLY AND SPECIFICALLY))??
			((HEREBY))??
			DISCLAIMED.
		||
			//** Alternate form in libpcap, which also omits the IN NO EVENT paragraph. **//
			AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
			INCLUDING, WITHOUT LIMITATION,
			THE IMPLIED WARRANTIES OF MERCHANTABILTY
			AND FITNESS FOR A PARTICULAR PURPOSE.
		))

		((
			IN NO EVENT SHALL __20__ 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 || WORK))
				((AND DOCUMENTATION))??
				EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
			))??
		))??

	||

		//**
		Alternate form found in some recent University of California releases.
		**//
		IN NO EVENT SHALL __20__ BE LIABLE
		TO ANY PARTY FOR DIRECT, INDIRECT,
		SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS,
		ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
		__20__ HAS BEEN ADVISED
		OF THE POSSIBILITY OF SUCH DAMAGE.

		__20__ SPECIFICALLY DISCLAIMS
		ANY WARRANTIES, INCLUDING, BUT NOT
		LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
		A PARTICULAR PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF
		ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS"
		__20__ HAS NO OBLIGATION
		TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
		MODIFICATIONS.
	))


`
const license_BSD_2_Clause_lre = `
//**
BSD 2-Clause "Simplified" License
https://spdx.org/licenses/BSD-2-Clause.json
https://opensource.org/licenses/BSD-2-Clause
**//

	Redistribution and use
	((of
		((this software || __5__))
	))??
	in source and binary forms
	((of __6__))??
	with or
	((without))??
	modification,
	are permitted
	((subject to the limitations in the disclaimer below))??
	((provided || providing))
	that
	((the))??
	following conditions are met:
	((BSD style license))??


	__1__
	((Redistribution || Redistributions))
	of
	((source code || works))
	must retain the
	((above))??
	((original))??
	copyright
	((notice))??
	((immediately at the beginning of the file, without modification))??
	this
	((list of conditions || condition))
	and the
	((following
		((two paragraphs of))??
		disclaimer
	|| disclaimer that follows))
	((in this position and unchanged))??


	__1__
	((Redistribution || Redistributions))
	in binary form must reproduce the
	((above))??
	((original))??
	copyright
	((notice))??
	this list of conditions and the
	following
	((two pargraphs of))??
	disclaimer
	((listed in this license))??
	in the documentation
	((and/or || and || or))
	other materials provided with the distribution.


	((DISCLAIMER
	))??

	((
		THE
		((SOFTWARE || WORK))
		((AND DOCUMENTATION))??
		IS PROVIDED
		((BY __20__))??
		"AS IS"
		((
			((WITHOUT ANY WARRANTIES WHATSOEVER))??
			((AND))??
			ANY
			((EXPRESS || EXPRESSED))
			OR IMPLIED WARRANTIES,
			INCLUDING, BUT NOT LIMITED TO,
			THE IMPLIED WARRANTIES
			((OF || OR))
			((NONINFRINGEMENT))??
			((MERCHANTABILITY))??
			((AND))??
			FITNESS FOR A PARTICULAR PURPOSE
			((OR NONINFRINGEMENT))??
			ARE
			((EXPRESSLY AND SPECIFICALLY))??
			((HEREBY))??
			DISCLAIMED.
		||
			//** Alternate form in libpcap, which also omits the IN NO EVENT paragraph. **//
			AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
			INCLUDING, WITHOUT LIMITATION,
			THE IMPLIED WARRANTIES OF MERCHANTABILTY
			AND FITNESS FOR A PARTICULAR PURPOSE.
		))

		((
			IN NO EVENT SHALL __20__ 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 || WORK))
				((AND DOCUMENTATION))??
				EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
			))??
		))??

	||

		//**
		Alternate form found in some recent University of California releases.
		**//
		IN NO EVENT SHALL __20__ BE LIABLE
		TO ANY PARTY FOR DIRECT, INDIRECT,
		SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS,
		ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
		__20__ HAS BEEN ADVISED
		OF THE POSSIBILITY OF SUCH DAMAGE.

		__20__ SPECIFICALLY DISCLAIMS
		ANY WARRANTIES, INCLUDING, BUT NOT
		LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
		A PARTICULAR PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF
		ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS"
		__20__ HAS NO OBLIGATION
		TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
		MODIFICATIONS.
	))


`
const license_BSD_2_Clause_Patent_lre = `
//**
BSD-2-Clause Plus Patent License
https://spdx.org/licenses/BSD-2-Clause-Patent.json
https://opensource.org/licenses/BSDplusPatent
**//

	Redistribution and use
	((of
		((this software || __5__))
	))??
	in source and binary forms
	((of __6__))??
	with or
	((without))??
	modification,
	are permitted
	((subject to the limitations in the disclaimer below))??
	((provided || providing))
	that
	((the))??
	following conditions are met:
	((BSD style license))??


	__1__
	((Redistribution || Redistributions))
	of
	((source code || works))
	must retain the
	((above))??
	((original))??
	copyright
	((notice))??
	((immediately at the beginning of the file, without modification))??
	this
	((list of conditions || condition))
	and the
	((following
		((two paragraphs of))??
		disclaimer
	|| disclaimer that follows))
	((in this position and unchanged))??


	__1__
	((Redistribution || Redistributions))
	in binary form must reproduce the
	((above))??
	((original))??
	copyright
	((notice))??
	this list of conditions and the
	following
	((two pargraphs of))??
	disclaimer
	((listed in this license))??
	in the documentation
	((and/or || and || or))
	other materials provided with the distribution.


	Subject to the terms and conditions of this license, each copyright holder and
	contributor hereby grants to those receiving rights under this license a
	perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable
	(except for failure to satisfy the conditions of this license) patent license to
	make, have made, use, offer to sell, sell, import, and otherwise transfer this
	software, where such license applies only to those patent claims, already
	acquired or hereafter acquired, licensable by such copyright holder or
	contributor that are necessarily infringed by:

	   __1__ their Contribution(s) (the licensed copyrights of copyright holders and
	   non-copyrightable additions of contributors, in source or binary form) alone;
	   or

	   __1__ combination of their Contribution(s) with the work of authorship to
	   which such Contribution(s) was added by such copyright holder or contributor,
	   if, at the time the Contribution is added, such addition causes such
	   combination to be necessarily infringed. The patent license shall not apply
	   to any other combinations which include the Contribution.

	Except as expressly stated above, no rights or licenses from any copyright
	holder or contributor is granted under this license, whether expressly, by
	implication, estoppel or otherwise.


	((DISCLAIMER
	))??

	((
		THE
		((SOFTWARE || WORK))
		((AND DOCUMENTATION))??
		IS PROVIDED
		((BY __20__))??
		"AS IS"
		((
			((WITHOUT ANY WARRANTIES WHATSOEVER))??
			((AND))??
			ANY
			((EXPRESS || EXPRESSED))
			OR IMPLIED WARRANTIES,
			INCLUDING, BUT NOT LIMITED TO,
			THE IMPLIED WARRANTIES
			((OF || OR))
			((NONINFRINGEMENT))??
			((MERCHANTABILITY))??
			((AND))??
			FITNESS FOR A PARTICULAR PURPOSE
			((OR NONINFRINGEMENT))??
			ARE
			((EXPRESSLY AND SPECIFICALLY))??
			((HEREBY))??
			DISCLAIMED.
		||
			//** Alternate form in libpcap, which also omits the IN NO EVENT paragraph. **//
			AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
			INCLUDING, WITHOUT LIMITATION,
			THE IMPLIED WARRANTIES OF MERCHANTABILTY
			AND FITNESS FOR A PARTICULAR PURPOSE.
		))

		((
			IN NO EVENT SHALL __20__ 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 || WORK))
				((AND DOCUMENTATION))??
				EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
			))??
		))??

	||

		//**
		Alternate form found in some recent University of California releases.
		**//
		IN NO EVENT SHALL __20__ BE LIABLE
		TO ANY PARTY FOR DIRECT, INDIRECT,
		SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS,
		ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
		__20__ HAS BEEN ADVISED
		OF THE POSSIBILITY OF SUCH DAMAGE.

		__20__ SPECIFICALLY DISCLAIMS
		ANY WARRANTIES, INCLUDING, BUT NOT
		LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
		A PARTICULAR PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF
		ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS"
		__20__ HAS NO OBLIGATION
		TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
		MODIFICATIONS.
	))


`
const license_BSD_2_Clause_Views_lre = `
//**
BSD 2-Clause Views
https://spdx.org/licenses/BSD-2-Clause-Views.json
http://www.freebsd.org/copyright/freebsd-license.html

This is the same as the BSD-2-Clause plus a paragraph
about the views of the project. It has no effect on use of
the software, so we just merge these two together.
**//

	Redistribution and use
	((of
		((this software || __5__))
	))??
	in source and binary forms
	((of __6__))??
	with or
	((without))??
	modification,
	are permitted
	((subject to the limitations in the disclaimer below))??
	((provided || providing))
	that
	((the))??
	following conditions are met:
	((BSD style license))??


	__1__
	((Redistribution || Redistributions))
	of
	((source code || works))
	must retain the
	((above))??
	((original))??
	copyright
	((notice))??
	((immediately at the beginning of the file, without modification))??
	this
	((list of conditions || condition))
	and the
	((following
		((two paragraphs of))??
		disclaimer
	|| disclaimer that follows))
	((in this position and unchanged))??


	__1__
	((Redistribution || Redistributions))
	in binary form must reproduce the
	((above))??
	((original))??
	copyright
	((notice))??
	this list of conditions and the
	following
	((two pargraphs of))??
	disclaimer
	((listed in this license))??
	in the documentation
	((and/or || and || or))
	other materials provided with the distribution.


	((DISCLAIMER
	))??

	((
		THE
		((SOFTWARE || WORK))
		((AND DOCUMENTATION))??
		IS PROVIDED
		((BY __20__))??
		"AS IS"
		((
			((WITHOUT ANY WARRANTIES WHATSOEVER))??
			((AND))??
			ANY
			((EXPRESS || EXPRESSED))
			OR IMPLIED WARRANTIES,
			INCLUDING, BUT NOT LIMITED TO,
			THE IMPLIED WARRANTIES
			((OF || OR))
			((NONINFRINGEMENT))??
			((MERCHANTABILITY))??
			((AND))??
			FITNESS FOR A PARTICULAR PURPOSE
			((OR NONINFRINGEMENT))??
			ARE
			((EXPRESSLY AND SPECIFICALLY))??
			((HEREBY))??
			DISCLAIMED.
		||
			//** Alternate form in libpcap, which also omits the IN NO EVENT paragraph. **//
			AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
			INCLUDING, WITHOUT LIMITATION,
			THE IMPLIED WARRANTIES OF MERCHANTABILTY
			AND FITNESS FOR A PARTICULAR PURPOSE.
		))

		((
			IN NO EVENT SHALL __20__ 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 || WORK))
				((AND DOCUMENTATION))??
				EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
			))??
		))??

	||

		//**
		Alternate form found in some recent University of California releases.
		**//
		IN NO EVENT SHALL __20__ BE LIABLE
		TO ANY PARTY FOR DIRECT, INDIRECT,
		SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS,
		ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
		__20__ HAS BEEN ADVISED
		OF THE POSSIBILITY OF SUCH DAMAGE.

		__20__ SPECIFICALLY DISCLAIMS
		ANY WARRANTIES, INCLUDING, BUT NOT
		LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
		A PARTICULAR PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF
		ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS"
		__20__ HAS NO OBLIGATION
		TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
		MODIFICATIONS.
	))



	The views and conclusions contained in the software and documentation are those
	of the authors and should not be interpreted as representing official policies,
	either expressed or implied, of
	((The FreeBSD Project || the copyright holders or contributors))??

`
const license_BSD_3_Clause_lre = `
//**
BSD 3-Clause "New" or "Revised" License
https://spdx.org/licenses/BSD-3-Clause.json
https://opensource.org/licenses/BSD-3-Clause
**//

	Redistribution and use
	((of
		((this software || __5__))
	))??
	in source and binary forms
	((of __6__))??
	with or
	((without))??
	modification,
	are permitted
	((subject to the limitations in the disclaimer below))??
	((provided || providing))
	that
	((the))??
	following conditions are met:
	((BSD style license))??


	__1__
	((Redistribution || Redistributions))
	of
	((source code || works))
	must retain the
	((above))??
	((original))??
	copyright
	((notice))??
	((immediately at the beginning of the file, without modification))??
	this
	((list of conditions || condition))
	and the
	((following
		((two paragraphs of))??
		disclaimer
	|| disclaimer that follows))
	((in this position and unchanged))??


	__1__
	((Redistribution || Redistributions))
	in binary form must reproduce the
	((above))??
	((original))??
	copyright
	((notice))??
	this list of conditions and the
	following
	((two pargraphs of))??
	disclaimer
	((listed in this license))??
	in the documentation
	((and/or || and || or))
	other materials provided with the distribution.


	__1__
	((Neither || None || Names || The names || The name))
	__40__ used to endorse
	or promote
	products derived
	((from this || fromthis))
	((software || work))
	without specific
	prior written permission
	((
		((of || from))
		__10__
	))??

((   //** github.com/PointCoin/btcec@v0.0.0-20150217011644-8f70ee2b3691 **//
    
	__1__
	((Neither || None || Names || The names || The name))
	__40__ used to endorse
	or promote
	products derived
	((from this || fromthis))
	((software || work))
	without specific
	prior written permission
	((
		((of || from))
		__10__
	))??

))??

	((DISCLAIMER
	))??

	((
		THE
		((SOFTWARE || WORK))
		((AND DOCUMENTATION))??
		IS PROVIDED
		((BY __20__))??
		"AS IS"
		((
			((WITHOUT ANY WARRANTIES WHATSOEVER))??
			((AND))??
			ANY
			((EXPRESS || EXPRESSED))
			OR IMPLIED WARRANTIES,
			INCLUDING, BUT NOT LIMITED TO,
			THE IMPLIED WARRANTIES
			((OF || OR))
			((NONINFRINGEMENT))??
			((MERCHANTABILITY))??
			((AND))??
			FITNESS FOR A PARTICULAR PURPOSE
			((OR NONINFRINGEMENT))??
			ARE
			((EXPRESSLY AND SPECIFICALLY))??
			((HEREBY))??
			DISCLAIMED.
		||
			//** Alternate form in libpcap, which also omits the IN NO EVENT paragraph. **//
			AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
			INCLUDING, WITHOUT LIMITATION,
			THE IMPLIED WARRANTIES OF MERCHANTABILTY
			AND FITNESS FOR A PARTICULAR PURPOSE.
		))

		((
			IN NO EVENT SHALL __20__ 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 || WORK))
				((AND DOCUMENTATION))??
				EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
			))??
		))??

	||

		//**
		Alternate form found in some recent University of California releases.
		**//
		IN NO EVENT SHALL __20__ BE LIABLE
		TO ANY PARTY FOR DIRECT, INDIRECT,
		SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS,
		ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
		__20__ HAS BEEN ADVISED
		OF THE POSSIBILITY OF SUCH DAMAGE.

		__20__ SPECIFICALLY DISCLAIMS
		ANY WARRANTIES, INCLUDING, BUT NOT
		LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
		A PARTICULAR PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF
		ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS"
		__20__ HAS NO OBLIGATION
		TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
		MODIFICATIONS.
	))


`
const license_BSD_3_Clause_Attribution_lre = `
//**
BSD with attribution
https://spdx.org/licenses/BSD-3-Clause-Attribution.json
https://fedoraproject.org/wiki/Licensing/BSD_with_Attribution
**//

	Redistribution and use
	((of
		((this software || __5__))
	))??
	in source and binary forms
	((of __6__))??
	with or
	((without))??
	modification,
	are permitted
	((subject to the limitations in the disclaimer below))??
	((provided || providing))
	that
	((the))??
	following conditions are met:
	((BSD style license))??


	__1__
	((Redistribution || Redistributions))
	of
	((source code || works))
	must retain the
	((above))??
	((original))??
	copyright
	((notice))??
	((immediately at the beginning of the file, without modification))??
	this
	((list of conditions || condition))
	and the
	((following
		((two paragraphs of))??
		disclaimer
	|| disclaimer that follows))
	((in this position and unchanged))??


	__1__
	((Redistribution || Redistributions))
	in binary form must reproduce the
	((above))??
	((original))??
	copyright
	((notice))??
	this list of conditions and the
	following
	((two pargraphs of))??
	disclaimer
	((listed in this license))??
	in the documentation
	((and/or || and || or))
	other materials provided with the distribution.


	__1__
	((Neither || None || Names || The names || The name))
	__40__ used to endorse
	or promote
	products derived
	((from this || fromthis))
	((software || work))
	without specific
	prior written permission
	((
		((of || from))
		__10__
	))??


	__1__
	Redistributions of any form whatsoever must retain the following
	acknowledgment:
	This product includes software developed by __40__


	((DISCLAIMER
	))??

	((
		THE
		((SOFTWARE || WORK))
		((AND DOCUMENTATION))??
		IS PROVIDED
		((BY __20__))??
		"AS IS"
		((
			((WITHOUT ANY WARRANTIES WHATSOEVER))??
			((AND))??
			ANY
			((EXPRESS || EXPRESSED))
			OR IMPLIED WARRANTIES,
			INCLUDING, BUT NOT LIMITED TO,
			THE IMPLIED WARRANTIES
			((OF || OR))
			((NONINFRINGEMENT))??
			((MERCHANTABILITY))??
			((AND))??
			FITNESS FOR A PARTICULAR PURPOSE
			((OR NONINFRINGEMENT))??
			ARE
			((EXPRESSLY AND SPECIFICALLY))??
			((HEREBY))??
			DISCLAIMED.
		||
			//** Alternate form in libpcap, which also omits the IN NO EVENT paragraph. **//
			AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
			INCLUDING, WITHOUT LIMITATION,
			THE IMPLIED WARRANTIES OF MERCHANTABILTY
			AND FITNESS FOR A PARTICULAR PURPOSE.
		))

		((
			IN NO EVENT SHALL __20__ 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 || WORK))
				((AND DOCUMENTATION))??
				EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
			))??
		))??

	||

		//**
		Alternate form found in some recent University of California releases.
		**//
		IN NO EVENT SHALL __20__ BE LIABLE
		TO ANY PARTY FOR DIRECT, INDIRECT,
		SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS,
		ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
		__20__ HAS BEEN ADVISED
		OF THE POSSIBILITY OF SUCH DAMAGE.

		__20__ SPECIFICALLY DISCLAIMS
		ANY WARRANTIES, INCLUDING, BUT NOT
		LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
		A PARTICULAR PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF
		ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS"
		__20__ HAS NO OBLIGATION
		TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
		MODIFICATIONS.
	))


`
const license_BSD_3_Clause_Clear_lre = `
//**
BSD 3-Clause Clear License
https://spdx.org/licenses/BSD-3-Clause-Clear.json
http://labs.metacarta.com/license-explanation.html#license
**//

	Redistribution and use
	((of
		((this software || __5__))
	))??
	in source and binary forms
	((of __6__))??
	with or
	((without))??
	modification,
	are permitted
	((subject to the limitations in the disclaimer below))??
	((provided || providing))
	that
	((the))??
	following conditions are met:
	((BSD style license))??


	__1__
	((Redistribution || Redistributions))
	of
	((source code || works))
	must retain the
	((above))??
	((original))??
	copyright
	((notice))??
	((immediately at the beginning of the file, without modification))??
	this
	((list of conditions || condition))
	and the
	((following
		((two paragraphs of))??
		disclaimer
	|| disclaimer that follows))
	((in this position and unchanged))??


	__1__
	((Redistribution || Redistributions))
	in binary form must reproduce the
	((above))??
	((original))??
	copyright
	((notice))??
	this list of conditions and the
	following
	((two pargraphs of))??
	disclaimer
	((listed in this license))??
	in the documentation
	((and/or || and || or))
	other materials provided with the distribution.


	__1__
	((Neither || None || Names || The names || The name))
	__40__ used to endorse
	or promote
	products derived
	((from this || fromthis))
	((software || work))
	without specific
	prior written permission
	((
		((of || from))
		__10__
	))??


	NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S
	PATENT RIGHTS ARE GRANTED BY THIS LICENSE.


	((DISCLAIMER
	))??

	((
		THE
		((SOFTWARE || WORK))
		((AND DOCUMENTATION))??
		IS PROVIDED
		((BY __20__))??
		"AS IS"
		((
			((WITHOUT ANY WARRANTIES WHATSOEVER))??
			((AND))??
			ANY
			((EXPRESS || EXPRESSED))
			OR IMPLIED WARRANTIES,
			INCLUDING, BUT NOT LIMITED TO,
			THE IMPLIED WARRANTIES
			((OF || OR))
			((NONINFRINGEMENT))??
			((MERCHANTABILITY))??
			((AND))??
			FITNESS FOR A PARTICULAR PURPOSE
			((OR NONINFRINGEMENT))??
			ARE
			((EXPRESSLY AND SPECIFICALLY))??
			((HEREBY))??
			DISCLAIMED.
		||
			//** Alternate form in libpcap, which also omits the IN NO EVENT paragraph. **//
			AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
			INCLUDING, WITHOUT LIMITATION,
			THE IMPLIED WARRANTIES OF MERCHANTABILTY
			AND FITNESS FOR A PARTICULAR PURPOSE.
		))

		((
			IN NO EVENT SHALL __20__ 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 || WORK))
				((AND DOCUMENTATION))??
				EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
			))??
		))??

	||

		//**
		Alternate form found in some recent University of California releases.
		**//
		IN NO EVENT SHALL __20__ BE LIABLE
		TO ANY PARTY FOR DIRECT, INDIRECT,
		SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS,
		ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
		__20__ HAS BEEN ADVISED
		OF THE POSSIBILITY OF SUCH DAMAGE.

		__20__ SPECIFICALLY DISCLAIMS
		ANY WARRANTIES, INCLUDING, BUT NOT
		LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
		A PARTICULAR PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF
		ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS"
		__20__ HAS NO OBLIGATION
		TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
		MODIFICATIONS.
	))


`
const license_BSD_3_Clause_LBNL_lre = `
//**
Lawrence Berkeley National Labs BSD variant license
https://spdx.org/licenses/BSD-3-Clause-LBNL.json
https://fedoraproject.org/wiki/Licensing/LBNLBSD
**//

//**
BSD 3-Clause "New" or "Revised" License
https://spdx.org/licenses/BSD-3-Clause.json
https://opensource.org/licenses/BSD-3-Clause
**//

	Redistribution and use
	((of
		((this software || __5__))
	))??
	in source and binary forms
	((of __6__))??
	with or
	((without))??
	modification,
	are permitted
	((subject to the limitations in the disclaimer below))??
	((provided || providing))
	that
	((the))??
	following conditions are met:
	((BSD style license))??


	__1__
	((Redistribution || Redistributions))
	of
	((source code || works))
	must retain the
	((above))??
	((original))??
	copyright
	((notice))??
	((immediately at the beginning of the file, without modification))??
	this
	((list of conditions || condition))
	and the
	((following
		((two paragraphs of))??
		disclaimer
	|| disclaimer that follows))
	((in this position and unchanged))??


	__1__
	((Redistribution || Redistributions))
	in binary form must reproduce the
	((above))??
	((original))??
	copyright
	((notice))??
	this list of conditions and the
	following
	((two pargraphs of))??
	disclaimer
	((listed in this license))??
	in the documentation
	((and/or || and || or))
	other materials provided with the distribution.


	__1__
	((Neither || None || Names || The names || The name))
	__40__ used to endorse
	or promote
	products derived
	((from this || fromthis))
	((software || work))
	without specific
	prior written permission
	((
		((of || from))
		__10__
	))??

((   //** github.com/PointCoin/btcec@v0.0.0-20150217011644-8f70ee2b3691 **//
    
	__1__
	((Neither || None || Names || The names || The name))
	__40__ used to endorse
	or promote
	products derived
	((from this || fromthis))
	((software || work))
	without specific
	prior written permission
	((
		((of || from))
		__10__
	))??

))??

	((DISCLAIMER
	))??

	((
		THE
		((SOFTWARE || WORK))
		((AND DOCUMENTATION))??
		IS PROVIDED
		((BY __20__))??
		"AS IS"
		((
			((WITHOUT ANY WARRANTIES WHATSOEVER))??
			((AND))??
			ANY
			((EXPRESS || EXPRESSED))
			OR IMPLIED WARRANTIES,
			INCLUDING, BUT NOT LIMITED TO,
			THE IMPLIED WARRANTIES
			((OF || OR))
			((NONINFRINGEMENT))??
			((MERCHANTABILITY))??
			((AND))??
			FITNESS FOR A PARTICULAR PURPOSE
			((OR NONINFRINGEMENT))??
			ARE
			((EXPRESSLY AND SPECIFICALLY))??
			((HEREBY))??
			DISCLAIMED.
		||
			//** Alternate form in libpcap, which also omits the IN NO EVENT paragraph. **//
			AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
			INCLUDING, WITHOUT LIMITATION,
			THE IMPLIED WARRANTIES OF MERCHANTABILTY
			AND FITNESS FOR A PARTICULAR PURPOSE.
		))

		((
			IN NO EVENT SHALL __20__ 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 || WORK))
				((AND DOCUMENTATION))??
				EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
			))??
		))??

	||

		//**
		Alternate form found in some recent University of California releases.
		**//
		IN NO EVENT SHALL __20__ BE LIABLE
		TO ANY PARTY FOR DIRECT, INDIRECT,
		SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS,
		ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
		__20__ HAS BEEN ADVISED
		OF THE POSSIBILITY OF SUCH DAMAGE.

		__20__ SPECIFICALLY DISCLAIMS
		ANY WARRANTIES, INCLUDING, BUT NOT
		LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
		A PARTICULAR PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF
		ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS"
		__20__ HAS NO OBLIGATION
		TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
		MODIFICATIONS.
	))




You are under no obligation whatsoever to provide any bug fixes, patches, or
upgrades to the features, functionality or performance of the source code
("Enhancements") to anyone; however, if you choose to make your Enhancements
available either publicly, or directly to __5__ , without imposing a separate
written license agreement for such Enhancements, then you hereby grant the
following license: a non-exclusive, royalty-free perpetual license to install,
use, modify, prepare derivative works, incorporate into other computer software,
distribute, and sublicense such Enhancements or derivative works thereof, in
binary and source code form.
`
const license_BSD_3_Clause_No_Nuclear_License_lre = `
//**
BSD 3-Clause No Nuclear License
https://spdx.org/licenses/BSD-3-Clause-No-Nuclear-License.json
http://download.oracle.com/otn-pub/java/licenses/bsd.txt?AuthParam=1467140197_43d516ce1776bd08a58235a7785be1cc
**//


	Redistribution and use
	((of
		((this software || __5__))
	))??
	in source and binary forms
	((of __6__))??
	with or
	((without))??
	modification,
	are permitted
	((subject to the limitations in the disclaimer below))??
	((provided || providing))
	that
	((the))??
	following conditions are met:
	((BSD style license))??


	__1__
	((Redistribution || Redistributions))
	of
	((source code || works))
	must retain the
	((above))??
	((original))??
	copyright
	((notice))??
	((immediately at the beginning of the file, without modification))??
	this
	((list of conditions || condition))
	and the
	((following
		((two paragraphs of))??
		disclaimer
	|| disclaimer that follows))
	((in this position and unchanged))??


	__1__
	((Redistribution || Redistributions))
	in binary form must reproduce the
	((above))??
	((original))??
	copyright
	((notice))??
	this list of conditions and the
	following
	((two pargraphs of))??
	disclaimer
	((listed in this license))??
	in the documentation
	((and/or || and || or))
	other materials provided with the distribution.


	__1__
	((Neither || None || Names || The names || The name))
	__40__ used to endorse
	or promote
	products derived
	((from this || fromthis))
	((software || work))
	without specific
	prior written permission
	((
		((of || from))
		__10__
	))??


This software is provided "AS IS," without a warranty of any kind. ALL EXPRESS
OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY IMPLIED
WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS
LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT
OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO
EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES,
HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE
OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.

You acknowledge that this software is not designed, licensed or intended for use
in the design, construction, operation or maintenance of any nuclear facility.

`
const license_BSD_3_Clause_No_Nuclear_License_2014_lre = `
//**
BSD 3-Clause No Nuclear License 2014
https://spdx.org/licenses/BSD-3-Clause-No-Nuclear-License-2014.json
https://java.net/projects/javaeetutorial/pages/BerkeleyLicense
**//

//**
BSD 3-Clause "New" or "Revised" License
https://spdx.org/licenses/BSD-3-Clause.json
https://opensource.org/licenses/BSD-3-Clause
**//

	Redistribution and use
	((of
		((this software || __5__))
	))??
	in source and binary forms
	((of __6__))??
	with or
	((without))??
	modification,
	are permitted
	((subject to the limitations in the disclaimer below))??
	((provided || providing))
	that
	((the))??
	following conditions are met:
	((BSD style license))??


	__1__
	((Redistribution || Redistributions))
	of
	((source code || works))
	must retain the
	((above))??
	((original))??
	copyright
	((notice))??
	((immediately at the beginning of the file, without modification))??
	this
	((list of conditions || condition))
	and the
	((following
		((two paragraphs of))??
		disclaimer
	|| disclaimer that follows))
	((in this position and unchanged))??


	__1__
	((Redistribution || Redistributions))
	in binary form must reproduce the
	((above))??
	((original))??
	copyright
	((notice))??
	this list of conditions and the
	following
	((two pargraphs of))??
	disclaimer
	((listed in this license))??
	in the documentation
	((and/or || and || or))
	other materials provided with the distribution.


	__1__
	((Neither || None || Names || The names || The name))
	__40__ used to endorse
	or promote
	products derived
	((from this || fromthis))
	((software || work))
	without specific
	prior written permission
	((
		((of || from))
		__10__
	))??

((   //** github.com/PointCoin/btcec@v0.0.0-20150217011644-8f70ee2b3691 **//
    
	__1__
	((Neither || None || Names || The names || The name))
	__40__ used to endorse
	or promote
	products derived
	((from this || fromthis))
	((software || work))
	without specific
	prior written permission
	((
		((of || from))
		__10__
	))??

))??

	((DISCLAIMER
	))??

	((
		THE
		((SOFTWARE || WORK))
		((AND DOCUMENTATION))??
		IS PROVIDED
		((BY __20__))??
		"AS IS"
		((
			((WITHOUT ANY WARRANTIES WHATSOEVER))??
			((AND))??
			ANY
			((EXPRESS || EXPRESSED))
			OR IMPLIED WARRANTIES,
			INCLUDING, BUT NOT LIMITED TO,
			THE IMPLIED WARRANTIES
			((OF || OR))
			((NONINFRINGEMENT))??
			((MERCHANTABILITY))??
			((AND))??
			FITNESS FOR A PARTICULAR PURPOSE
			((OR NONINFRINGEMENT))??
			ARE
			((EXPRESSLY AND SPECIFICALLY))??
			((HEREBY))??
			DISCLAIMED.
		||
			//** Alternate form in libpcap, which also omits the IN NO EVENT paragraph. **//
			AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
			INCLUDING, WITHOUT LIMITATION,
			THE IMPLIED WARRANTIES OF MERCHANTABILTY
			AND FITNESS FOR A PARTICULAR PURPOSE.
		))

		((
			IN NO EVENT SHALL __20__ 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 || WORK))
				((AND DOCUMENTATION))??
				EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
			))??
		))??

	||

		//**
		Alternate form found in some recent University of California releases.
		**//
		IN NO EVENT SHALL __20__ BE LIABLE
		TO ANY PARTY FOR DIRECT, INDIRECT,
		SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS,
		ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
		__20__ HAS BEEN ADVISED
		OF THE POSSIBILITY OF SUCH DAMAGE.

		__20__ SPECIFICALLY DISCLAIMS
		ANY WARRANTIES, INCLUDING, BUT NOT
		LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
		A PARTICULAR PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF
		ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS"
		__20__ HAS NO OBLIGATION
		TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
		MODIFICATIONS.
	))



You acknowledge that this software is not designed, licensed or intended for use
in the design, construction, operation or maintenance of any nuclear facility.
`
const license_BSD_3_Clause_No_Nuclear_Warranty_lre = `
//**
BSD 3-Clause No Nuclear License
https://spdx.org/licenses/BSD-3-Clause-No-Nuclear-License.json
http://download.oracle.com/otn-pub/java/licenses/bsd.txt?AuthParam=1467140197_43d516ce1776bd08a58235a7785be1cc
**//


	Redistribution and use
	((of
		((this software || __5__))
	))??
	in source and binary forms
	((of __6__))??
	with or
	((without))??
	modification,
	are permitted
	((subject to the limitations in the disclaimer below))??
	((provided || providing))
	that
	((the))??
	following conditions are met:
	((BSD style license))??


	__1__
	((Redistribution || Redistributions))
	of
	((source code || works))
	must retain the
	((above))??
	((original))??
	copyright
	((notice))??
	((immediately at the beginning of the file, without modification))??
	this
	((list of conditions || condition))
	and the
	((following
		((two paragraphs of))??
		disclaimer
	|| disclaimer that follows))
	((in this position and unchanged))??


	__1__
	((Redistribution || Redistributions))
	in binary form must reproduce the
	((above))??
	((original))??
	copyright
	((notice))??
	this list of conditions and the
	following
	((two pargraphs of))??
	disclaimer
	((listed in this license))??
	in the documentation
	((and/or || and || or))
	other materials provided with the distribution.


	__1__
	((Neither || None || Names || The names || The name))
	__40__ used to endorse
	or promote
	products derived
	((from this || fromthis))
	((software || work))
	without specific
	prior written permission
	((
		((of || from))
		__10__
	))??


This software is provided "AS IS," without a warranty of any kind. ALL EXPRESS
OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY IMPLIED
WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS
LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT
OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO
EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES,
HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE
OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.

You acknowledge that this software is not designed,  or intended for use
in the design, construction, operation or maintenance of any nuclear facility.

`
const license_BSD_3_Clause_NoTrademark_lre = `
//**
BSD 3-Clause + no-trademark, like Clear is no-patent.
**//

	Redistribution and use
	((of
		((this software || __5__))
	))??
	in source and binary forms
	((of __6__))??
	with or
	((without))??
	modification,
	are permitted
	((subject to the limitations in the disclaimer below))??
	((provided || providing))
	that
	((the))??
	following conditions are met:
	((BSD style license))??


	__1__
	((Redistribution || Redistributions))
	of
	((source code || works))
	must retain the
	((above))??
	((original))??
	copyright
	((notice))??
	((immediately at the beginning of the file, without modification))??
	this
	((list of conditions || condition))
	and the
	((following
		((two paragraphs of))??
		disclaimer
	|| disclaimer that follows))
	((in this position and unchanged))??


	__1__
	((Redistribution || Redistributions))
	in binary form must reproduce the
	((above))??
	((original))??
	copyright
	((notice))??
	this list of conditions and the
	following
	((two pargraphs of))??
	disclaimer
	((listed in this license))??
	in the documentation
	((and/or || and || or))
	other materials provided with the distribution.


	__1__
	((Neither || None || Names || The names || The name))
	__40__ used to endorse
	or promote
	products derived
	((from this || fromthis))
	((software || work))
	without specific
	prior written permission
	((
		((of || from))
		__10__
	))??


	No license is granted to the trademarks of
	the copyright holders even if such marks
	are included in this software.


	((DISCLAIMER
	))??

	((
		THE
		((SOFTWARE || WORK))
		((AND DOCUMENTATION))??
		IS PROVIDED
		((BY __20__))??
		"AS IS"
		((
			((WITHOUT ANY WARRANTIES WHATSOEVER))??
			((AND))??
			ANY
			((EXPRESS || EXPRESSED))
			OR IMPLIED WARRANTIES,
			INCLUDING, BUT NOT LIMITED TO,
			THE IMPLIED WARRANTIES
			((OF || OR))
			((NONINFRINGEMENT))??
			((MERCHANTABILITY))??
			((AND))??
			FITNESS FOR A PARTICULAR PURPOSE
			((OR NONINFRINGEMENT))??
			ARE
			((EXPRESSLY AND SPECIFICALLY))??
			((HEREBY))??
			DISCLAIMED.
		||
			//** Alternate form in libpcap, which also omits the IN NO EVENT paragraph. **//
			AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
			INCLUDING, WITHOUT LIMITATION,
			THE IMPLIED WARRANTIES OF MERCHANTABILTY
			AND FITNESS FOR A PARTICULAR PURPOSE.
		))

		((
			IN NO EVENT SHALL __20__ 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 || WORK))
				((AND DOCUMENTATION))??
				EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
			))??
		))??

	||

		//**
		Alternate form found in some recent University of California releases.
		**//
		IN NO EVENT SHALL __20__ BE LIABLE
		TO ANY PARTY FOR DIRECT, INDIRECT,
		SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS,
		ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
		__20__ HAS BEEN ADVISED
		OF THE POSSIBILITY OF SUCH DAMAGE.

		__20__ SPECIFICALLY DISCLAIMS
		ANY WARRANTIES, INCLUDING, BUT NOT
		LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
		A PARTICULAR PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF
		ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS"
		__20__ HAS NO OBLIGATION
		TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
		MODIFICATIONS.
	))


`
const license_BSD_3_Clause_Open_MPI_lre = `
//**
BSD 3-Clause Open MPI variant
https://spdx.org/licenses/BSD-3-Clause-Open-MPI.json
https://www.open-mpi.org/community/license.php
http://www.netlib.org/lapack/LICENSE.txt
**//

	Redistribution and use
	((of
		((this software || __5__))
	))??
	in source and binary forms
	((of __6__))??
	with or
	((without))??
	modification,
	are permitted
	((subject to the limitations in the disclaimer below))??
	((provided || providing))
	that
	((the))??
	following conditions are met:
	((BSD style license))??


	__1__
	((Redistribution || Redistributions))
	of
	((source code || works))
	must retain the
	((above))??
	((original))??
	copyright
	((notice))??
	((immediately at the beginning of the file, without modification))??
	this
	((list of conditions || condition))
	and the
	((following
		((two paragraphs of))??
		disclaimer
	|| disclaimer that follows))
	((in this position and unchanged))??


	__1__
	((Redistribution || Redistributions))
	in binary form must reproduce the
	((above))??
	((original))??
	copyright
	((notice))??
	this list of conditions and the
	following
	((two pargraphs of))??
	disclaimer
	((listed in this license))??
	in the documentation
	((and/or || and || or))
	other materials provided with the distribution.


	__1__
	((Neither || None || Names || The names || The name))
	__40__ used to endorse
	or promote
	products derived
	((from this || fromthis))
	((software || work))
	without specific
	prior written permission
	((
		((of || from))
		__10__
	))??


The copyright holders provide no reassurances that the source code provided does
not infringe any patent, copyright, or any other intellectual property rights of
third parties. The copyright holders disclaim any liability to any recipient for
claims brought against recipient by any third party for infringement of that
parties intellectual property rights.


	((DISCLAIMER
	))??

	((
		THE
		((SOFTWARE || WORK))
		((AND DOCUMENTATION))??
		IS PROVIDED
		((BY __20__))??
		"AS IS"
		((
			((WITHOUT ANY WARRANTIES WHATSOEVER))??
			((AND))??
			ANY
			((EXPRESS || EXPRESSED))
			OR IMPLIED WARRANTIES,
			INCLUDING, BUT NOT LIMITED TO,
			THE IMPLIED WARRANTIES
			((OF || OR))
			((NONINFRINGEMENT))??
			((MERCHANTABILITY))??
			((AND))??
			FITNESS FOR A PARTICULAR PURPOSE
			((OR NONINFRINGEMENT))??
			ARE
			((EXPRESSLY AND SPECIFICALLY))??
			((HEREBY))??
			DISCLAIMED.
		||
			//** Alternate form in libpcap, which also omits the IN NO EVENT paragraph. **//
			AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
			INCLUDING, WITHOUT LIMITATION,
			THE IMPLIED WARRANTIES OF MERCHANTABILTY
			AND FITNESS FOR A PARTICULAR PURPOSE.
		))

		((
			IN NO EVENT SHALL __20__ 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 || WORK))
				((AND DOCUMENTATION))??
				EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
			))??
		))??

	||

		//**
		Alternate form found in some recent University of California releases.
		**//
		IN NO EVENT SHALL __20__ BE LIABLE
		TO ANY PARTY FOR DIRECT, INDIRECT,
		SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS,
		ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
		__20__ HAS BEEN ADVISED
		OF THE POSSIBILITY OF SUCH DAMAGE.

		__20__ SPECIFICALLY DISCLAIMS
		ANY WARRANTIES, INCLUDING, BUT NOT
		LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
		A PARTICULAR PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF
		ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS"
		__20__ HAS NO OBLIGATION
		TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
		MODIFICATIONS.
	))


`
const license_BSD_4_Clause_UC_lre = `
//**
BSD 4-Clause (University of California-Specific)
https://spdx.org/licenses/BSD-4-Clause-UC.json
http://www.freebsd.org/copyright/license.html
**//

	Redistribution and use
	((of
		((this software || __5__))
	))??
	in source and binary forms
	((of __6__))??
	with or
	((without))??
	modification,
	are permitted
	((subject to the limitations in the disclaimer below))??
	((provided || providing))
	that
	((the))??
	following conditions are met:
	((BSD style license))??


	__1__
	((Redistribution || Redistributions))
	of
	((source code || works))
	must retain the
	((above))??
	((original))??
	copyright
	((notice))??
	((immediately at the beginning of the file, without modification))??
	this
	((list of conditions || condition))
	and the
	((following
		((two paragraphs of))??
		disclaimer
	|| disclaimer that follows))
	((in this position and unchanged))??


	__1__
	((Redistribution || Redistributions))
	in binary form must reproduce the
	((above))??
	((original))??
	copyright
	((notice))??
	this list of conditions and the
	following
	((two pargraphs of))??
	disclaimer
	((listed in this license))??
	in the documentation
	((and/or || and || or))
	other materials provided with the distribution.


	__1__
	All advertising materials mentioning features or use of this software
	must display the following acknowledgement:

	This product includes software developed by
	the University of California, Berkeley and its contributors.

	__1__
	Neither the name of the University 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 REGENTS 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 REGENTS 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.

`
const license_BSD_4_Clause_lre = `
//**
BSD 4-Clause "Original" or "Old" License
https://spdx.org/licenses/BSD-4-Clause.json
http://directory.fsf.org/wiki/License:BSD_4Clause
**//

	Redistribution and use
	((of
		((this software || __5__))
	))??
	in source and binary forms
	((of __6__))??
	with or
	((without))??
	modification,
	are permitted
	((subject to the limitations in the disclaimer below))??
	((provided || providing))
	that
	((the))??
	following conditions are met:
	((BSD style license))??


	__1__
	((Redistribution || Redistributions))
	of
	((source code || works))
	must retain the
	((above))??
	((original))??
	copyright
	((notice))??
	((immediately at the beginning of the file, without modification))??
	this
	((list of conditions || condition))
	and the
	((following
		((two paragraphs of))??
		disclaimer
	|| disclaimer that follows))
	((in this position and unchanged))??


	__1__
	((Redistribution || Redistributions))
	in binary form must reproduce the
	((above))??
	((original))??
	copyright
	((notice))??
	this list of conditions and the
	following
	((two pargraphs of))??
	disclaimer
	((listed in this license))??
	in the documentation
	((and/or || and || or))
	other materials provided with the distribution.


	__1__
	All advertising materials mentioning features or use of this software
	must display the following acknowledgement:

	This product includes software developed by
	__40__

	be used to endorse
	or promote products derived from this software without specific
	prior written permission.


	((DISCLAIMER
	))??

	((
		THE
		((SOFTWARE || WORK))
		((AND DOCUMENTATION))??
		IS PROVIDED
		((BY __20__))??
		"AS IS"
		((
			((WITHOUT ANY WARRANTIES WHATSOEVER))??
			((AND))??
			ANY
			((EXPRESS || EXPRESSED))
			OR IMPLIED WARRANTIES,
			INCLUDING, BUT NOT LIMITED TO,
			THE IMPLIED WARRANTIES
			((OF || OR))
			((NONINFRINGEMENT))??
			((MERCHANTABILITY))??
			((AND))??
			FITNESS FOR A PARTICULAR PURPOSE
			((OR NONINFRINGEMENT))??
			ARE
			((EXPRESSLY AND SPECIFICALLY))??
			((HEREBY))??
			DISCLAIMED.
		||
			//** Alternate form in libpcap, which also omits the IN NO EVENT paragraph. **//
			AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
			INCLUDING, WITHOUT LIMITATION,
			THE IMPLIED WARRANTIES OF MERCHANTABILTY
			AND FITNESS FOR A PARTICULAR PURPOSE.
		))

		((
			IN NO EVENT SHALL __20__ 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 || WORK))
				((AND DOCUMENTATION))??
				EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
			))??
		))??

	||

		//**
		Alternate form found in some recent University of California releases.
		**//
		IN NO EVENT SHALL __20__ BE LIABLE
		TO ANY PARTY FOR DIRECT, INDIRECT,
		SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS,
		ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
		__20__ HAS BEEN ADVISED
		OF THE POSSIBILITY OF SUCH DAMAGE.

		__20__ SPECIFICALLY DISCLAIMS
		ANY WARRANTIES, INCLUDING, BUT NOT
		LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
		A PARTICULAR PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF
		ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS"
		__20__ HAS NO OBLIGATION
		TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
		MODIFICATIONS.
	))


`
const license_BSD_Source_Code_lre = `
//**
BSD 1-Clause License plus non-advertising clause (usual BSD clause #3)
https://spdx.org/licenses/BSD-Source-Code.json

Examples:
	https://github.com/robbiehanson/XMPPFramework/blob/5f24033e/copying.txt
	https://github.com/yapstudios/YapDatabase/blob/e3df69f2/LICENSE.txt
	https://github.com/robbiehanson/CocoaHTTPServer/blob/cb86571a/LICENSE.txt
	https://github.com/skelterjohn/rerun/blob/eb5929af/LICENSE
	https://github.com/skelterjohn/go.matrix/blob/go1/LICENSE
**//

	Redistribution and use
	((of
		((this software || __5__))
	))??
	in source and binary forms
	((of __6__))??
	with or
	((without))??
	modification,
	are permitted
	((subject to the limitations in the disclaimer below))??
	((provided || providing))
	that
	((the))??
	following conditions are met:
	((BSD style license))??


	__1__
	((Redistribution || Redistributions))
	of
	((source code || works))
	must retain the
	((above))??
	((original))??
	copyright
	((notice))??
	((immediately at the beginning of the file, without modification))??
	this
	((list of conditions || condition))
	and the
	((following
		((two paragraphs of))??
		disclaimer
	|| disclaimer that follows))
	((in this position and unchanged))??


	__1__
	((Neither || None || Names || The names || The name))
	__40__ used to endorse
	or promote
	products derived
	((from this || fromthis))
	((software || work))
	without specific
	prior written permission
	((
		((of || from))
		__10__
	))??


	((DISCLAIMER
	))??

	((
		THE
		((SOFTWARE || WORK))
		((AND DOCUMENTATION))??
		IS PROVIDED
		((BY __20__))??
		"AS IS"
		((
			((WITHOUT ANY WARRANTIES WHATSOEVER))??
			((AND))??
			ANY
			((EXPRESS || EXPRESSED))
			OR IMPLIED WARRANTIES,
			INCLUDING, BUT NOT LIMITED TO,
			THE IMPLIED WARRANTIES
			((OF || OR))
			((NONINFRINGEMENT))??
			((MERCHANTABILITY))??
			((AND))??
			FITNESS FOR A PARTICULAR PURPOSE
			((OR NONINFRINGEMENT))??
			ARE
			((EXPRESSLY AND SPECIFICALLY))??
			((HEREBY))??
			DISCLAIMED.
		||
			//** Alternate form in libpcap, which also omits the IN NO EVENT paragraph. **//
			AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
			INCLUDING, WITHOUT LIMITATION,
			THE IMPLIED WARRANTIES OF MERCHANTABILTY
			AND FITNESS FOR A PARTICULAR PURPOSE.
		))

		((
			IN NO EVENT SHALL __20__ 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 || WORK))
				((AND DOCUMENTATION))??
				EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
			))??
		))??

	||

		//**
		Alternate form found in some recent University of California releases.
		**//
		IN NO EVENT SHALL __20__ BE LIABLE
		TO ANY PARTY FOR DIRECT, INDIRECT,
		SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS,
		ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
		__20__ HAS BEEN ADVISED
		OF THE POSSIBILITY OF SUCH DAMAGE.

		__20__ SPECIFICALLY DISCLAIMS
		ANY WARRANTIES, INCLUDING, BUT NOT
		LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
		A PARTICULAR PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF
		ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS"
		__20__ HAS NO OBLIGATION
		TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
		MODIFICATIONS.
	))


`
const license_EUPL_1_2_lre = `//**
European Union Public License 1.2
https://spdx.org/licenses/EUPL-1.2.json
https://joinup.ec.europa.eu/page/eupl-text-11-12
https://joinup.ec.europa.eu/sites/default/files/custom-page/attachment/eupl_v1.2_en.pdf
https://joinup.ec.europa.eu/sites/default/files/inline-files/EUPL%20v1_2%20EN(1).txt
http://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri=CELEX:32017D0863
https://opensource.org/licenses/EUPL-1.2
**//

(( European Union Public Licence v. 1.2 ))??

EUPL © the European Union 2007, 2016

This European Union Public Licence (the 'EUPL') applies to the Work (as defined
below) which is provided under the terms of this Licence. Any use of the Work,
other than as authorised under this Licence is prohibited (to the extent such
use is covered by a right of the copyright holder of the Work).

The Work is provided under the terms of this Licence when the Licensor (as
defined below) has placed the following notice immediately following the
copyright notice for the Work:

   Licensed under the EUPL

   or has expressed by any other means his willingness to license under the
   EUPL.

   (( 1. ))??
   Definitions

   In this Licence, the following terms have the following meaning:

      —
      'The Licence': this Licence.

      —
      'The Original Work': the work or software distributed or communicated by
      the Licensor under this Licence, available as Source Code and also as
      Executable Code as the case may be.

      —
      'Derivative Works': the works or software that could be created by the
      Licensee, based upon the Original Work or modifications thereof. This
      Licence does not define the extent of modification or dependence on the
      Original Work required in order to classify a work as a Derivative Work;
      this extent is determined by copyright law applicable in the country
      mentioned in Article 15.

      —
      'The Work': the Original Work or its Derivative Works.

      —
      'The Source Code': the human-readable form of the Work which is the most
      convenient for people to study and modify.

      —
      'The Executable Code': any code which has generally been compiled and
      which is meant to be interpreted by a computer as a program.

      —
      'The Licensor': the natural or legal person that distributes or
      communicates the Work under the Licence.

      —
      'Contributor(s)': any natural or legal person who modifies the Work under
      the Licence, or otherwise contributes to the creation of a Derivative
      Work.

      —
      'The Licensee' or 'You': any natural or legal person who makes any usage
      of the Work under the terms of the Licence.

      —
      'Distribution' or 'Communication': any act of selling, giving, lending,
      renting, distributing, communicating, transmitting, or otherwise making
      available, online or offline, copies of the Work or providing access to
      its essential functionalities at the disposal of any other natural or
      legal person.

   (( 2. ))??
   Scope of the rights granted by the Licence

   The Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
   sublicensable licence to do the following, for the duration of copyright
   vested in the Original Work:

      —
      use the Work in any circumstance and for all usage,

      —
      reproduce the Work,

      —
      modify the Work, and make Derivative Works based upon the Work,

      —
      communicate to the public, including the right to make available or
      display the Work or copies thereof to the public and perform publicly, as
      the case may be, the Work,

      —
      distribute the Work or copies thereof,

      —
      lend and rent the Work or copies thereof,

      —
      sublicense rights in the Work or copies thereof.

   Those rights can be exercised on any media, supports and formats, whether now
   known or later invented, as far as the applicable law permits so.

   In the countries where moral rights apply, the Licensor waives his right to
   exercise his moral right to the extent allowed by law in order to make
   effective the licence of the economic rights here above listed.

   The Licensor grants to the Licensee royalty-free, non-exclusive usage rights
   to any patents held by the Licensor, to the extent necessary to make use of
   the rights granted on the Work under this Licence.

   (( 3. ))??
   Communication of the Source Code

   The Licensor may provide the Work either in its Source Code form, or as
   Executable Code. If the Work is provided as Executable Code, the Licensor
   provides in addition a machine-readable copy of the Source Code of the Work
   along with each copy of the Work that the Licensor distributes or indicates,
   in a notice following the copyright notice attached to the Work, a repository
   where the Source Code is easily and freely accessible for as long as the
   Licensor continues to distribute or communicate the Work.

   (( 4. ))??
   Limitations on copyright

   Nothing in this Licence is intended to deprive the Licensee of the benefits
   from any exception or limitation to the exclusive rights of the rights owners
   in the Work, of the exhaustion of those rights or of other applicable
   limitations thereto.

   (( 5. ))??
   Obligations of the Licensee

   The grant of the rights mentioned above is subject to some restrictions and
   obligations imposed on the Licensee. Those obligations are the following:

   Attribution right: The Licensee shall keep intact all copyright, patent or
   trademarks notices and all notices that refer to the Licence and to the
   disclaimer of warranties. The Licensee must include a copy of such notices
   and a copy of the Licence with every copy of the Work he/she distributes or
   communicates. The Licensee must cause any Derivative Work to carry prominent
   notices stating that the Work has been modified and the date of
   modification.

   Copyleft clause: If the Licensee distributes or communicates copies of the
   Original Works or Derivative Works, this Distribution or Communication will
   be done under the terms of this Licence or of a later version of this Licence
   unless the Original Work is expressly distributed only under this version of
   the Licence — for example by communicating 'EUPL v. 1.2 only'. The Licensee
   (becoming Licensor) cannot offer or impose any additional terms or conditions
   on the Work or Derivative Work that alter or restrict the terms of the
   Licence.

   Compatibility clause: If the Licensee Distributes or Communicates Derivative
   Works or copies thereof based upon both the Work and another work licensed
   under a Compatible Licence, this Distribution or Communication can be done
   under the terms of this Compatible Licence. For the sake of this clause,
   'Compatible Licence' refers to the licences listed in the appendix attached
   to this Licence. Should the Licensee's obligations under the Compatible
   Licence conflict with his/her obligations under this Licence, the obligations
   of the Compatible Licence shall prevail.

   Provision of Source Code: When distributing or communicating copies of the
   Work, the Licensee will provide a machine-readable copy of the Source Code or
   indicate a repository where this Source will be easily and freely available
   for as long as the Licensee continues to distribute or communicate the Work.

   Legal Protection: This Licence does not grant permission to use the trade
   names, trademarks, service marks, or 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 copyright notice.

   (( 6. ))??
   Chain of Authorship

   The original Licensor warrants that the copyright in the Original Work
   granted hereunder is owned by him/her or licensed to him/her and that he/she
   has the power and authority to grant the Licence.

   Each Contributor warrants that the copyright in the modifications he/she
   brings to the Work are owned by him/her or licensed to him/her and that
   he/she has the power and authority to grant the Licence.

   Each time You accept the Licence, the original Licensor and subsequent
   Contributors grant You a licence to their contributions to the Work, under
   the terms of this Licence.

   (( 7. ))??
   Disclaimer of Warranty

   The Work is a work in progress, which is continuously improved by numerous
   Contributors. It is not a finished work and may therefore contain defects or
   'bugs' inherent to this type of development.

   For the above reason, the Work is provided under the Licence on an 'as is'
   basis and without warranties of any kind concerning the Work, including
   without limitation merchantability, fitness for a particular purpose, absence
   of defects or errors, accuracy, non-infringement of intellectual property
   rights other than copyright as stated in Article 6 of this Licence.

   This disclaimer of warranty is an essential part of the Licence and a
   condition for the grant of any rights to the Work.

   (( 8. ))??
   Disclaimer of Liability

   Except in the cases of wilful misconduct or damages directly caused to
   natural persons, the Licensor will in no event be liable for any direct or
   indirect, material or moral, damages of any kind, arising out of the Licence
   or of the use of the Work, including without limitation, damages for loss of
   goodwill, work stoppage, computer failure or malfunction, loss of data or any
   commercial damage, even if the Licensor has been advised of the possibility
   of such damage. However, the Licensor will be liable under statutory product
   liability laws as far such laws apply to the Work.

   (( 9. ))??
   Additional agreements

   While distributing the Work, You may choose to conclude an additional
   agreement, defining obligations or services consistent with this Licence.
   However, if accepting obligations, You may act only on your own behalf and on
   your sole responsibility, not on behalf of the original Licensor or 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 the fact You have accepted any warranty or
   additional liability.

   (( 10. ))??
   Acceptance of the Licence

   The provisions of this Licence can be accepted by clicking on an icon 'I
   agree' placed under the bottom of a window displaying the text of this
   Licence or by affirming consent in any other similar way, in accordance with
   the rules of applicable law. Clicking on that icon indicates your clear and
   irrevocable acceptance of this Licence and all of its terms and conditions.

   Similarly, you irrevocably accept this Licence and all of its terms and
   conditions by exercising any rights granted to You by Article 2 of this
   Licence, such as the use of the Work, the creation by You of a Derivative
   Work or the Distribution or Communication by You of the Work or copies
   thereof.

   (( 11. ))??
   Information to the public

   In case of any Distribution or Communication of the Work by means of
   electronic communication by You (for example, by offering to download the
   Work from a remote location) the distribution channel or media (for example,
   a website) must at least provide to the public the information requested by
   the applicable law regarding the Licensor, the Licence and the way it may be
   accessible, concluded, stored and reproduced by the Licensee.

   (( 12. ))??
   Termination of the Licence

   The Licence and the rights granted hereunder will terminate automatically
   upon any breach by the Licensee of the terms of the Licence.

   Such a termination will not terminate the licences of any person who has
   received the Work from the Licensee under the Licence, provided such persons
   remain in full compliance with the Licence.

   (( 13. ))??
   Miscellaneous

   Without prejudice of Article 9 above, the Licence represents the complete
   agreement between the Parties as to the Work.

   If any provision of the Licence is invalid or unenforceable under applicable
   law, this will not affect the validity or enforceability of the Licence as a
   whole. Such provision will be construed or reformed so as necessary to make
   it valid and enforceable.

   The European Commission may publish other linguistic versions or new versions
   of this Licence or updated versions of the Appendix, so far this is required
   and reasonable, without reducing the scope of the rights granted by the
   Licence. New versions of the Licence will be published with a unique version
   number.

   All linguistic versions of this Licence, approved by the European Commission,
   have identical value. Parties can take advantage of the linguistic version of
   their choice.

   (( 14. ))??
   Jurisdiction

   Without prejudice to specific agreement between parties,

      —
      any litigation resulting from the interpretation of this License, arising
      between the European Union institutions, bodies, offices or agencies, as a
      Licensor, and any Licensee, will be subject to the jurisdiction of the
      Court of Justice of the European Union, as laid down in article 272 of the
      Treaty on the Functioning of the European Union,

      —
      any litigation arising between other parties and resulting from the
      interpretation of this License, will be subject to the exclusive
      jurisdiction of the competent court where the Licensor resides or conducts
      its primary business.

   (( 15. ))??
   Applicable Law

   Without prejudice to specific agreement between parties,

      —
      this Licence shall be governed by the law of the European Union Member
      State where the Licensor has his seat, resides or has his registered
      office,

      —
      this licence shall be governed by Belgian law if the Licensor has no seat,
      residence or registered office inside a European Union Member State.

Appendix

'Compatible Licences' according to Article 5 EUPL are:

   —
((   GNU General Public License (GPL) v. 2, v. 3 ))??

   —
   GNU Affero General Public License (AGPL) v. 3

   —
  Open Software License (OSL) v. 2.1, v. 3.0

   —
((   
   Eclipse Public License (EPL) v. 1.0

   —
   CeCILL v. 2.0, v. 2.1

   —
   Mozilla Public Licence (MPL) v. 2

   —
   GNU Lesser General Public Licence (LGPL) v. 2.1, v. 3

   —
   Creative Commons Attribution-ShareAlike v. 3.0 Unported (CC BY-SA 3.0) for
   works other than software

   —
   European Union Public Licence (EUPL) v. 1.1, v. 1.2

   —
   Québec Free and Open-Source Licence — Reciprocity (LiLiQ-R) or Strong
   Reciprocity (LiLiQ-R+).

))??
The European Commission may update this Appendix to later versions of the above
licences without producing a new version of the EUPL, as long as they provide
the rights granted in Article 2 of this Licence and protect the covered Source
Code from exclusive appropriation.

All other changes or additions to this Appendix require the production of a new
EUPL version.
`
const license_GPL_2_0_lre = `//**
GNU General Public License v2.0
https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
https://opensource.org/licenses/GPL-2.0

modifications for:
  github.com/fangli/msgfiber@v0.0.0-20140814110733-06877a166a15
  github.com/johnlui/go_static@v0.0.0-20140911161652-2c9393f39253
**//

((
	GNU GENERAL PUBLIC LICENSE Version 2, June 1991
	
	((
		((
			Copyright __20__
			((<https://fsf.org/>))??
			
	((
		51 Franklin
		((Street||St))
		((Fifth Floor||Suite 500,))??
		Boston, MA 02110 __1__ USA
	||
		59 Temple Place, Suite 330, Boston, MA  02111 __1__ USA
	||
		675 Mass Ave, Cambridge, MA 02139, USA
	))??
		))??

		Everyone is permitted to copy and distribute verbatim copies
		of this license document, but changing it is not allowed.

		((Copyright __20__))??
	))??

))??

Preamble

The licenses for most software are designed to take away your freedom to share
and change it. By contrast, the GNU General Public License is intended to
guarantee your freedom to share and change free software--to make sure the
software is free for all its users. This General Public License applies to most
of the __5__ and to any other program whose
authors commit to using it. (Some other Free Software Foundation software is
covered by the GNU
((Lesser||Library))
General Public License instead.) You can apply it to
your programs, too.

When we speak of free software, we are referring to freedom, not price. Our
General Public Licenses are designed to make sure that you have the freedom to
distribute copies of free software (and charge for this service if you wish),
that you receive source code or can get it if you want it, that you can change
the software or use pieces of it in new free programs; and that you know you can
do these things.

To protect your rights, we need to make restrictions that forbid anyone to deny
you these rights or to ask you to surrender the rights. These restrictions
translate to certain responsibilities for you if you distribute copies of the
software, or if you modify it.

For example, if you distribute copies of such a program, whether gratis or for a
fee, you must give the recipients all the rights that you have. You must make
sure that they, too, receive or can get the source code. And you must show them
these terms so they know their rights.

We protect your rights with two steps: (1) copyright the software, and (2) offer
you this license which gives you legal permission to copy, distribute and/or
modify the software.

Also, for each author's protection and ours, we want to make certain that
everyone understands that there is no warranty for this free software. If the
software is modified by someone else and passed on, we want its recipients to
know that what they have is not the original, so that any problems introduced by
others will not reflect on the original authors' reputations.

Finally, any free program is threatened constantly by software patents. We wish
to avoid the danger that redistributors of a free program will individually
obtain patent licenses, in effect making the program proprietary. To prevent
this, we have made it clear that any patent must be licensed for everyone's free
use or not licensed at all.

The precise terms and conditions for copying, distribution and modification
follow.

__5__ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

   __1__ This License applies to any program or other work which contains a
   notice placed by the copyright holder saying it may be distributed under the
   terms of this General Public License. The "Program", below, refers to any
   such program or work, and a "work based on the Program" means either the
   Program or any derivative work under copyright law: that is to say, a work
   containing the Program or a portion of it, either verbatim or with
   modifications and/or translated into another language. (Hereinafter,
   translation is included without limitation in the term "modification".) Each
   licensee is addressed as "you".

   Activities other than copying, distribution and modification are not covered
   by this License; they are outside its scope. The act of running the Program
   is not restricted, and the output from the Program is covered only if its
   contents constitute a work based on the Program (independent of having been
   made by running the Program). Whether that is true depends on what the
   Program does.

   __1__ You may copy and distribute verbatim copies of the Program's source
   code as you receive it, in any medium, provided that you conspicuously and
   appropriately publish on each copy an appropriate copyright notice and
   disclaimer of warranty; keep intact all the notices that refer to this
   License and to the absence of any warranty; and give any other recipients of
   the Program a copy of this License along with the Program.

   You may charge a fee for the physical act of transferring a copy, and you may
   at your option offer warranty protection in exchange for a fee.

   __1__ You may modify your copy or copies of the Program or any portion of it,
   thus forming a work based on the Program, and copy and distribute such
   modifications or work under the terms of Section 1 above, provided that you
   also meet all of these conditions:

      __1__ You must cause the modified files to carry prominent notices stating
      that you changed the files and the date of any change.

      __1__ You must cause any work that you distribute or publish, that in
      whole or in part contains or is derived from the Program or any part
      thereof, to be licensed as a whole at no charge to all third parties under
      the terms of this License.

      __1__ If the modified program normally reads commands interactively when
      run, you must cause it, when started running for such interactive use in
      the most ordinary way, to print or display an announcement including an
      appropriate copyright notice and a notice that there is no warranty (or
      else, saying that you provide a warranty) and that users may redistribute
      the program under these conditions, and telling the user how to view a
      copy of this License. (Exception: if the Program itself is interactive but
      does not normally print such an announcement, your work based on the
      Program is not required to print an announcement.)

   These requirements apply to the modified work as a whole. If identifiable
   sections of that work are not derived from the Program, and can be reasonably
   considered independent and separate works in themselves, then this License,
   and its terms, do not apply to those sections when you distribute them as
   separate works. But when you distribute the same sections as part of a whole
   which is a work based on the Program, the distribution of the whole must be
   on the terms of this License, whose permissions for other licensees extend to
   the entire whole, and thus to each and every part regardless of who wrote
   it.

   Thus, it is not the intent of this section to claim rights or contest your
   rights to work written entirely by you; rather, the intent is to exercise the
   right to control the distribution of derivative or collective works based on
   the Program.

   In addition, mere aggregation of another work not based on the Program with
   the Program (or with a work based on the Program) on a volume of a storage or
   distribution medium does not bring the other work under the scope of this
   License.

   __1__ You may copy and distribute the Program (or a work based on it, under
   Section 2) in object code or executable form under the terms of Sections 1
   and 2 above provided that you also do one of the following:

      __1__ Accompany it with the complete corresponding machine-readable source
      code, which must be distributed under the terms of Sections 1 and 2 above
      on a medium customarily used for software interchange; or,

      __1__ Accompany it with a written offer, valid for at least three years,
      to give any third party, for a charge no more than your cost of physically
      performing source distribution, a complete machine-readable copy of the
      corresponding source code, to be distributed under the terms of Sections 1
      and 2 above on a medium customarily used for software interchange; or,

      __1__ Accompany it with the information you received as to the offer to
      distribute corresponding source code. (This alternative is allowed only
      for noncommercial distribution and only if you received the program in
      object code or executable form with such an offer, in accord with
      Subsection b above.)

   The source code for a work means the preferred form of the work for making
   modifications to it. For an executable work, complete source code means all
   the source code for all modules it contains, plus any associated interface
   definition files, plus the scripts used to control compilation and
   installation of the executable. However, as a special exception, the source
   code distributed need not include anything that is normally distributed (in
   either source or binary form) with the major components (compiler, kernel,
   and so on) of the operating system on which the executable runs, unless that
   component itself accompanies the executable.

   If distribution of executable or object code is made by offering access to
   copy from a designated place, then offering equivalent access to copy the
   source code from the same place counts as distribution of the source code,
   even though third parties are not compelled to copy the source along with the
   object code.

   __1__ You may not copy, modify, sublicense, or distribute the Program except
   as expressly provided under this License. Any attempt otherwise to copy,
   modify, sublicense or distribute the Program is void, and will automatically
   terminate your rights under this License. However, parties who have received
   copies, or rights, from you under this License will not have their licenses
   terminated so long as such parties remain in full compliance.

   __1__ You are not required to accept this License, since you have not signed
   it. However, nothing else grants you permission to modify or distribute the
   Program or its derivative works. These actions are prohibited by law if you
   do not accept this License. Therefore, by modifying or distributing the
   Program (or any work based on the Program), you indicate your acceptance of
   this License to do so, and all its terms and conditions for copying,
   distributing or modifying the Program or works based on it.

   __1__ Each time you redistribute the Program (or any work based on the
   Program), the recipient automatically receives a license from the original
   licensor to copy, distribute or modify the Program subject to these terms and
   conditions. You may not impose any further restrictions on the recipients'
   exercise of the rights granted herein. You are not responsible for enforcing
   compliance by third parties to this License.

   __1__ If, as a consequence of a court judgment or allegation of patent
   infringement or for any other reason (not limited to patent issues),
   conditions are imposed on you (whether by court order, agreement or
   otherwise) that contradict the conditions of this License, they do not excuse
   you from the conditions of this License. If you cannot distribute so as to
   satisfy simultaneously your obligations under this License and any other
   pertinent obligations, then as a consequence you may not distribute the
   Program at all. For example, if a patent license would not permit
   royalty-free redistribution of the Program by all those who receive copies
   directly or indirectly through you, then the only way you could satisfy both
   it and this License would be to refrain entirely from distribution of the
   Program.

   If any portion of this section is held invalid or unenforceable under any
   particular circumstance, the balance of the section is intended to apply and
   the section as a whole is intended to apply in other circumstances.

   It is not the purpose of this section to induce you to infringe any patents
   or other property right claims or to contest validity of any such claims;
   this section has the sole purpose of protecting the integrity of the free
   software distribution system, which is implemented by public license
   practices. Many people have made generous contributions to the wide range of
   software distributed through that system in reliance on consistent
   application of that system; it is up to the author/donor to decide if he or
   she is willing to distribute software through any other system and a licensee
   cannot impose that choice.

   This section is intended to make thoroughly clear what is believed to be a
   consequence of the rest of this License.

   __1__ If the distribution and/or use of the Program is restricted in certain
   countries either by patents or by copyrighted interfaces, the original
   copyright holder who places the Program under this License may add an
   explicit geographical distribution limitation excluding those countries, so
   that distribution is permitted only in or among countries not thus excluded.
   In such case, this License incorporates the limitation as if written in the
   body of this License.

   __1__ The Free Software Foundation may publish revised and/or new versions of
   the General Public License from time to time. Such new versions will be
   similar in spirit to the present version, but may differ in detail to address
   new problems or concerns.

   Each version is given a distinguishing version number. If the Program
   specifies a version number of this License which applies to it and "any later
   version", you have the option of following the terms and conditions either of
   that version or of any later version published by the Free Software
   Foundation. If the Program does not specify a version number of this License,
   you may choose any version ever published by the Free Software Foundation.

   __1__ If you wish to incorporate parts of the Program into other free
   programs whose distribution conditions are different, write to the author to
   ask for permission. For software which is copyrighted by the Free Software
   Foundation, write to the Free Software Foundation; we sometimes make
   exceptions for this. Our decision will be guided by the two goals of
   preserving the free status of all derivatives of our free software and of
   promoting the sharing and reuse of software generally.

   ((NO WARRANTY))??

   __1__ BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
   FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
   OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
   PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR
   IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
   MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO
   THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM
   PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR
   CORRECTION.

   __1__ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
   WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
   REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
   INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
   OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO
   LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR
   THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
   PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
   POSSIBILITY OF SUCH DAMAGES.

((END OF TERMS AND CONDITIONS))??

((
How to Apply These Terms to Your New Programs

If you develop a new program, and you want it to be of the greatest possible use
to the public, the best way to achieve this is to make it free software which
everyone can redistribute and change under these terms.

To do so, attach the following notices to the program. It is safest to attach
them to the start of each source file to most effectively convey the exclusion
of warranty; and each file should have at least the "copyright" line and a
pointer to where the full notice is found.

__30__
//**
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
**//

This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option) any later
version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with
this program; if not,
((
    write to the Free Software Foundation, Inc.,
    
	((
		51 Franklin
		((Street||St))
		((Fifth Floor||Suite 500,))??
		Boston, MA 02110 __1__ USA
	||
		59 Temple Place, Suite 330, Boston, MA  02111 __1__ USA
	||
		675 Mass Ave, Cambridge, MA 02139, USA
	))
||
    see http://www.gnu.org/licenses/gpl-2.0.html.
))

Also add information on how to contact you by electronic and paper mail.

If the program is interactive, make it output a short notice like this when it
starts in an interactive mode:

 __16__

comes with
ABSOLUTELY NO WARRANTY; for details type ` + "`" + `show w'. This is free software, and
you are welcome to redistribute it under certain conditions; type ` + "`" + `show c' for
details.

The hypothetical commands ` + "`" + `show w' and ` + "`" + `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may be
called something other than ` + "`" + `show w' and ` + "`" + `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.

You should also get your employer (if you work as a programmer) or your school,
if any, to sign a "copyright disclaimer" for the program, if necessary. Here is
a sample; alter the names:

__4__ hereby disclaims all copyright interest in the program
__2__ (which makes passes at compilers) written by
((James Hacker || Fang Li))

((__5__ //**<signature of Ty Coon>**//, 1 April 1989 Ty Coon, President of Vice))??
))??

((This General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU
((Lesser||Library))
General Public
License instead of this License.))??
`
const license_GPL_3_0_lre = `//**
GNU General Public License v3.0
https://www.gnu.org/licenses/gpl-3.0-standalone.html
https://opensource.org/licenses/GPL-3.0
**//

((
	GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007
	
	((
		((
			Copyright __20__
			((<https://fsf.org/>))??
			
	((
		51 Franklin
		((Street||St))
		((Fifth Floor||Suite 500,))??
		Boston, MA 02110 __1__ USA
	||
		59 Temple Place, Suite 330, Boston, MA  02111 __1__ USA
	||
		675 Mass Ave, Cambridge, MA 02139, USA
	))??
		))??

		Everyone is permitted to copy and distribute verbatim copies
		of this license document, but changing it is not allowed.

		((Copyright __20__))??
	))??

))??

Preamble

The GNU General Public License is a free, copyleft license for software and
other kinds of works.

The licenses for most software and other practical works are designed to take
away your freedom to share and change the works. By contrast, the GNU General
Public License is intended to guarantee your freedom to share and change all
versions of a program--to make sure it remains free software for all its users.
We, the Free Software Foundation, use the GNU General Public License for most of
our software; it applies also to any other work released this way by its
authors. You can apply it to your programs, too.

When we speak of free software, we are referring to freedom, not price. Our
General Public Licenses are designed to make sure that you have the freedom to
distribute copies of free software (and charge for them if you wish), that you
receive source code or can get it if you want it, that you can change the
software or use pieces of it in new free programs, and that you know you can do
these things.

To protect your rights, we need to prevent others from denying you these rights
or asking you to surrender the rights. Therefore, you have certain
responsibilities if you distribute copies of the software, or if you modify it:
responsibilities to respect the freedom of others.

For example, if you distribute copies of such a program, whether gratis or for a
fee, you must pass on to the recipients the same freedoms that you received. You
must make sure that they, too, receive or can get the source code. And you must
show them these terms so they know their rights.

Developers that use the GNU GPL protect your rights with two steps: (1) assert
copyright on the software, and (2) offer you this License giving you legal
permission to copy, distribute and/or modify it.

For the developers' and authors' protection, the GPL clearly explains that there
is no warranty for this free software. For both users' and authors' sake, the
GPL requires that modified versions be marked as changed, so that their problems
will not be attributed erroneously to authors of previous versions.

Some devices are designed to deny users access to install or run modified
versions of the software inside them, although the manufacturer can do so. This
is fundamentally incompatible with the aim of protecting users' freedom to
change the software. The systematic pattern of such abuse occurs in the area of
products for individuals to use, which is precisely where it is most
unacceptable. Therefore, we have designed this version of the GPL to prohibit
the practice for those products. If such problems arise substantially in other
domains, we stand ready to extend this provision to those domains in future
versions of the GPL, as needed to protect the freedom of users.

Finally, every program is threatened constantly by software patents. States
should not allow patents to restrict development and use of software on
general-purpose computers, but in those that do, we wish to avoid the special
danger that patents applied to a free program could make it effectively
proprietary. To prevent this, the GPL assures that patents cannot be used to
render the program non-free.

The precise terms and conditions for copying, distribution and modification
follow.

TERMS AND CONDITIONS

   __1__ Definitions.

   "This License" refers to version 3 of the GNU General Public License.

   "Copyright" also means copyright-like laws that apply to other kinds of
   works, such as semiconductor masks.

   "The Program" refers to any copyrightable work licensed under this License.
   Each licensee is addressed as __1__. "Licensees" and "recipients" may be
   individuals or organizations.

   To "modify" a work means to copy from or adapt all or part of the work in a
   fashion requiring copyright permission, other than the making of an exact
   copy. The resulting work is called a "modified version" of the earlier work
   or a work "based on" the earlier work.

   A "covered work" means either the unmodified Program or a work based on the
   Program.

   To "propagate" a work means to do anything with it that, without permission,
   would make you directly or secondarily liable for infringement under
   applicable copyright law, except executing it on a computer or modifying a
   private copy. Propagation includes copying, distribution (with or without
   modification), making available to the public, and in some countries other
   activities as well.

   To "convey" a work means any kind of propagation that enables other parties
   to make or receive copies. Mere interaction with a user through a computer
   network, with no transfer of a copy, is not conveying.

   An interactive user interface displays "Appropriate Legal Notices" to the
   extent that it includes a convenient and prominently visible feature that (1)
   displays an appropriate copyright notice, and (2) tells the user that there
   is no warranty for the work (except to the extent that warranties are
   provided), that licensees may convey the work under this License, and how to
   view a copy of this License. If the interface presents a list of user
   commands or options, such as a menu, a prominent item in the list meets this
   criterion.

   __1__ Source Code.

   The "source code" for a work means the preferred form of the work for making
   modifications to it. "Object code" means any non-source form of a work.

   A "Standard Interface" means an interface that either is an official standard
   defined by a recognized standards body, or, in the case of interfaces
   specified for a particular programming language, one that is widely used
   among developers working in that language.

   The "System Libraries" of an executable work include anything, other than the
   work as a whole, that (a) is included in the normal form of packaging a Major
   Component, but which is not part of that Major Component, and (b) serves only
   to enable use of the work with that Major Component, or to implement a
   Standard Interface for which an implementation is available to the public in
   source code form. A "Major Component", in this context, means a major
   essential component (kernel, window system, and so on) of the specific
   operating system (if any) on which the executable work runs, or a compiler
   used to produce the work, or an object code interpreter used to run it.

   The "Corresponding Source" for a work in object code form means all the
   source code needed to generate, install, and (for an executable work) run the
   object code and to modify the work, including scripts to control those
   activities. However, it does not include the work's System Libraries, or
   general-purpose tools or generally available free programs which are used
   unmodified in performing those activities but which are not part of the work.
   For example, Corresponding Source includes interface definition files
   associated with source files for the work, and the source code for shared
   libraries and dynamically linked subprograms that the work is specifically
   designed to require, such as by intimate data communication or control flow
   between those subprograms and other parts of the work.

   The Corresponding Source need not include anything that users can regenerate
   automatically from other parts of the Corresponding Source.

   The Corresponding Source for a work in source code form is that same work.

   __1__ Basic Permissions.

   All rights granted under this License are granted for the term of copyright
   on the Program, and are irrevocable provided the stated conditions are met.
   This License explicitly affirms your unlimited permission to run the
   unmodified Program. The output from running a covered work is covered by this
   License only if the output, given its content, constitutes a covered work.
   This License acknowledges your rights of fair use or other equivalent, as
   provided by copyright law.

   You may make, run and propagate covered works that you do not convey, without
   conditions so long as your license otherwise remains in force. You may convey
   covered works to others for the sole purpose of having them make
   modifications exclusively for you, or provide you with facilities for running
   those works, provided that you comply with the terms of this License in
   conveying all material for which you do not control copyright. Those thus
   making or running the covered works for you must do so exclusively on your
   behalf, under your direction and control, on terms that prohibit them from
   making any copies of your copyrighted material outside their relationship
   with you.

   Conveying under any other circumstances is permitted solely under the
   conditions stated below. Sublicensing is not allowed; section 10 makes it
   unnecessary.

   __1__ Protecting Users' Legal Rights From Anti-Circumvention Law.

   No covered work shall be deemed part of an effective technological measure
   under any applicable law fulfilling obligations under article 11 of the WIPO
   copyright treaty adopted on 20 December 1996, or similar laws prohibiting or
   restricting circumvention of such measures.

   When you convey a covered work, you waive any legal power to forbid
   circumvention of technological measures to the extent such circumvention is
   effected by exercising rights under this License with respect to the covered
   work, and you disclaim any intention to limit operation or modification of
   the work as a means of enforcing, against the work's users, your or third
   parties' legal rights to forbid circumvention of technological measures.

   __1__ Conveying Verbatim Copies.

   You may convey verbatim copies of the Program's source code as you receive
   it, in any medium, provided that you conspicuously and appropriately publish
   on each copy an appropriate copyright notice; keep intact all notices stating
   that this License and any non-permissive terms added in accord with section 7
   apply to the code; keep intact all notices of the absence of any warranty;
   and give all recipients a copy of this License along with the Program.

   You may charge any price or no price for each copy that you convey, and you
   may offer support or warranty protection for a fee.

   __1__ Conveying Modified Source Versions.

   You may convey a work based on the Program, or the modifications to produce
   it from the Program, in the form of source code under the terms of section 4,
   provided that you also meet all of these conditions:

      __1__ The work must carry prominent notices stating that you modified it,
      and giving a relevant date.

      __1__ The work must carry prominent notices stating that it is released
      under this License and any conditions added under section 7. This
      requirement modifies the requirement in section 4 to "keep intact all
      notices".

      __1__ You must license the entire work, as a whole, under this License to
      anyone who comes into possession of a copy. This License will therefore
      apply, along with any applicable section 7 additional terms, to the whole
      of the work, and all its parts, regardless of how they are packaged. This
      License gives no permission to license the work in any other way, but it
      does not invalidate such permission if you have separately received it.

      __1__ If the work has interactive user interfaces, each must display
      Appropriate Legal Notices; however, if the Program has interactive
      interfaces that do not display Appropriate Legal Notices, your work need
      not make them do so.

   A compilation of a covered work with other separate and independent works,
   which are not by their nature extensions of the covered work, and which are
   not combined with it such as to form a larger program, in or on a volume of a
   storage or distribution medium, is called an "aggregate" if the compilation
   and its resulting copyright are not used to limit the access or legal rights
   of the compilation's users beyond what the individual works permit. Inclusion
   of a covered work in an aggregate does not cause this License to apply to the
   other parts of the aggregate.

   __1__ Conveying Non-Source Forms.

   You may convey a covered work in object code form under the terms of sections
   4 and 5, provided that you also convey the machine-readable Corresponding
   Source under the terms of this License, in one of these ways:

      __1__ Convey the object code in, or embodied in, a physical product
      (including a physical distribution medium), accompanied by the
      Corresponding Source fixed on a durable physical medium customarily used
      for software interchange.

      __1__ Convey the object code in, or embodied in, a physical product
      (including a physical distribution medium), accompanied by a written
      offer, valid for at least three years and valid for as long as you offer
      spare parts or customer support for that product model, to give anyone who
      possesses the object code either (1) a copy of the Corresponding Source
      for all the software in the product that is covered by this License, on a
      durable physical medium customarily used for software interchange, for a
      price no more than your reasonable cost of physically performing this
      conveying of source, or (2) access to copy the Corresponding Source from a
      network server at no charge.

      __1__ Convey individual copies of the object code with a copy of the
      written offer to provide the Corresponding Source. This alternative is
      allowed only occasionally and noncommercially, and only if you received
      the object code with such an offer, in accord with subsection 6b.

      __1__ Convey the object code by offering access from a designated place
      (gratis or for a charge), and offer equivalent access to the Corresponding
      Source in the same way through the same place at no further charge. You
      need not require recipients to copy the Corresponding Source along with
      the object code. If the place to copy the object code is a network server,
      the Corresponding Source may be on a different server (operated by you or
      a third party) that supports equivalent copying facilities, provided you
      maintain clear directions next to the object code saying where to find the
      Corresponding Source. Regardless of what server hosts the Corresponding
      Source, you remain obligated to ensure that it is available for as long as
      needed to satisfy these requirements.

      __1__ Convey the object code using peer-to-peer transmission, provided you
      inform other peers where the object code and Corresponding Source of the
      work are being offered to the general public at no charge under subsection
      6d.

   A separable portion of the object code, whose source code is excluded from
   the Corresponding Source as a System Library, need not be included in
   conveying the object code work.

   A "User Product" is either (1) a "consumer product", which means any tangible
   personal property which is normally used for personal, family, or household
   purposes, or (2) anything designed or sold for incorporation into a dwelling.
   In determining whether a product is a consumer product, doubtful cases shall
   be resolved in favor of coverage. For a particular product received by a
   particular user, "normally used" refers to a typical or common use of that
   class of product, regardless of the status of the particular user or of the
   way in which the particular user actually uses, or expects or is expected to
   use, the product. A product is a consumer product regardless of whether the
   product has substantial commercial, industrial or non-consumer uses, unless
   such uses represent the only significant mode of use of the product.

   "Installation Information" for a User Product means any methods, procedures,
   authorization keys, or other information required to install and execute
   modified versions of a covered work in that User Product from a modified
   version of its Corresponding Source. The information must suffice to ensure
   that the continued functioning of the modified object code is in no case
   prevented or interfered with solely because modification has been made.

   If you convey an object code work under this section in, or with, or
   specifically for use in, a User Product, and the conveying occurs as part of
   a transaction in which the right of possession and use of the User Product is
   transferred to the recipient in perpetuity or for a fixed term (regardless of
   how the transaction is characterized), the Corresponding Source conveyed
   under this section must be accompanied by the Installation Information. But
   this requirement does not apply if neither you nor any third party retains
   the ability to install modified object code on the User Product (for example,
   the work has been installed in ROM).

   The requirement to provide Installation Information does not include a
   requirement to continue to provide support service, warranty, or updates for
   a work that has been modified or installed by the recipient, or for the User
   Product in which it has been modified or installed. Access to a network may
   be denied when the modification itself materially and adversely affects the
   operation of the network or violates the rules and protocols for
   communication across the network.

   Corresponding Source conveyed, and Installation Information provided, in
   accord with this section must be in a format that is publicly documented (and
   with an implementation available to the public in source code form), and must
   require no special password or key for unpacking, reading or copying.

   __1__ Additional Terms.

   "Additional permissions" are terms that supplement the terms of this License
   by making exceptions from one or more of its conditions. Additional
   permissions that are applicable to the entire Program shall be treated as
   though they were included in this License, to the extent that they are valid
   under applicable law. If additional permissions apply only to part of the
   Program, that part may be used separately under those permissions, but the
   entire Program remains governed by this License without regard to the
   additional permissions.

   When you convey a copy of a covered work, you may at your option remove any
   additional permissions from that copy, or from any part of it. (Additional
   permissions may be written to require their own removal in certain cases when
   you modify the work.) You may place additional permissions on material, added
   by you to a covered work, for which you have or can give appropriate
   copyright permission.

   Notwithstanding any other provision of this License, for material you add to
   a covered work, you may (if authorized by the copyright holders of that
   material) supplement the terms of this License with terms:

      __1__ Disclaiming warranty or limiting liability differently from the
      terms of sections 15 and 16 of this License; or

      __1__ Requiring preservation of specified reasonable legal notices or
      author attributions in that material or in the Appropriate Legal Notices
      displayed by works containing it; or

      __1__ Prohibiting misrepresentation of the origin of that material, or
      requiring that modified versions of such material be marked in reasonable
      ways as different from the original version; or

      __1__ Limiting the use for publicity purposes of names of licensors or
      authors of the material; or

      __1__ Declining to grant rights under trademark law for use of some trade
      names, trademarks, or service marks; or

      __1__ Requiring indemnification of licensors and authors of that material
      by anyone who conveys the material (or modified versions of it) with
      contractual assumptions of liability to the recipient, for any liability
      that these contractual assumptions directly impose on those licensors and
      authors.

   All other non-permissive additional terms are considered "further
   restrictions" within the meaning of section 10. If the Program as you
   received it, or any part of it, contains a notice stating that it is governed
   by this License along with a term that is a further restriction, you may
   remove that term. If a license document contains a further restriction but
   permits relicensing or conveying under this License, you may add to a covered
   work material governed by the terms of that license document, provided that
   the further restriction does not survive such relicensing or conveying.

   If you add terms to a covered work in accord with this section, you must
   place, in the relevant source files, a statement of the additional terms that
   apply to those files, or a notice indicating where to find the applicable
   terms.

   Additional terms, permissive or non-permissive, may be stated in the form of
   a separately written license, or stated as exceptions; the above requirements
   apply either way.

   __1__ Termination.

   You may not propagate or modify a covered work except as expressly provided
   under this License. Any attempt otherwise to propagate or modify it is void,
   and will automatically terminate your rights under this License (including
   any patent licenses granted under the third paragraph of section 11).

   However, if you cease all violation of this License, then your license from a
   particular copyright holder is reinstated (a) provisionally, unless and until
   the copyright holder explicitly and finally terminates your license, and (b)
   permanently, if the copyright holder fails to notify you of the violation by
   some reasonable means prior to 60 days after the cessation.

   Moreover, your license from a particular copyright holder is reinstated
   permanently if the copyright holder notifies you of the violation by some
   reasonable means, this is the first time you have received notice of
   violation of this License (for any work) from that copyright holder, and you
   cure the violation prior to 30 days after your receipt of the notice.

   Termination of your rights under this section does not terminate the licenses
   of parties who have received copies or rights from you under this License. If
   your rights have been terminated and not permanently reinstated, you do not
   qualify to receive new licenses for the same material under section 10.

   __1__ Acceptance Not Required for Having Copies.

   You are not required to accept this License in order to receive or run a copy
   of the Program. Ancillary propagation of a covered work occurring solely as a
   consequence of using peer-to-peer transmission to receive a copy likewise
   does not require acceptance. However, nothing other than this License grants
   you permission to propagate or modify any covered work. These actions
   infringe copyright if you do not accept this License. Therefore, by modifying
   or propagating a covered work, you indicate your acceptance of this License
   to do so.

   __1__ Automatic Licensing of Downstream Recipients.

   Each time you convey a covered work, the recipient automatically receives a
   license from the original licensors, to run, modify and propagate that work,
   subject to this License. You are not responsible for enforcing compliance by
   third parties with this License.

   An "entity transaction" is a transaction transferring control of an
   organization, or substantially all assets of one, or subdividing an
   organization, or merging organizations. If propagation of a covered work
   results from an entity transaction, each party to that transaction who
   receives a copy of the work also receives whatever licenses to the work the
   party's predecessor in interest had or could give under the previous
   paragraph, plus a right to possession of the Corresponding Source of the work
   from the predecessor in interest, if the predecessor has it or can get it
   with reasonable efforts.

   You may not impose any further restrictions on the exercise of the rights
   granted or affirmed under this License. For example, you may not impose a
   license fee, royalty, or other charge for exercise of rights granted under
   this License, and you may not initiate litigation (including a cross-claim or
   counterclaim in a lawsuit) alleging that any patent claim is infringed by
   making, using, selling, offering for sale, or importing the Program or any
   portion of it.

   __1__ Patents.

   A "contributor" is a copyright holder who authorizes use under this License
   of the Program or a work on which the Program is based. The work thus
   licensed is called the contributor's "contributor version".

   A contributor's "essential patent claims" are all patent claims owned or
   controlled by the contributor, whether already acquired or hereafter
   acquired, that would be infringed by some manner, permitted by this License,
   of making, using, or selling its contributor version, but do not include
   claims that would be infringed only as a consequence of further modification
   of the contributor version. For purposes of this definition, "control"
   includes the right to grant patent sublicenses in a manner consistent with
   the requirements of this License.

   Each contributor grants you a non-exclusive, worldwide, royalty-free patent
   license under the contributor's essential patent claims, to make, use, sell,
   offer for sale, import and otherwise run, modify and propagate the contents
   of its contributor version.

   In the following three paragraphs, a "patent license" is any express
   agreement or commitment, however denominated, not to enforce a patent (such
   as an express permission to practice a patent or covenant not to sue for
   patent infringement). To "grant" such a patent license to a party means to
   make such an agreement or commitment not to enforce a patent against the
   party.

   If you convey a covered work, knowingly relying on a patent license, and the
   Corresponding Source of the work is not available for anyone to copy, free of
   charge and under the terms of this License, through a publicly available
   network server or other readily accessible means, then you must either (1)
   cause the Corresponding Source to be so available, or (2) arrange to deprive
   yourself of the benefit of the patent license for this particular work, or
   (3) arrange, in a manner consistent with the requirements of this License, to
   extend the patent license to downstream recipients. "Knowingly relying" means
   you have actual knowledge that, but for the patent license, your conveying
   the covered work in a country, or your recipient's use of the covered work in
   a country, would infringe one or more identifiable patents in that country
   that you have reason to believe are valid.

   If, pursuant to or in connection with a single transaction or arrangement,
   you convey, or propagate by procuring conveyance of, a covered work, and
   grant a patent license to some of the parties receiving the covered work
   authorizing them to use, propagate, modify or convey a specific copy of the
   covered work, then the patent license you grant is automatically extended to
   all recipients of the covered work and works based on it.

   A patent license is "discriminatory" if it does not include within the scope
   of its coverage, prohibits the exercise of, or is conditioned on the
   non-exercise of one or more of the rights that are specifically granted under
   this License. You may not convey a covered work if you are a party to an
   arrangement with a third party that is in the business of distributing
   software, under which you make payment to the third party based on the extent
   of your activity of conveying the work, and under which the third party
   grants, to any of the parties who would receive the covered work from you, a
   discriminatory patent license (a) in connection with copies of the covered
   work conveyed by you (or copies made from those copies), or (b) primarily for
   and in connection with specific products or compilations that contain the
   covered work, unless you entered into that arrangement, or that patent
   license was granted, prior to 28 March 2007.

   Nothing in this License shall be construed as excluding or limiting any
   implied license or other defenses to infringement that may otherwise be
   available to you under applicable patent law.

   __1__ No Surrender of Others' Freedom.

   If conditions are imposed on you (whether by court order, agreement or
   otherwise) that contradict the conditions of this License, they do not excuse
   you from the conditions of this License. If you cannot convey a covered work
   so as to satisfy simultaneously your obligations under this License and any
   other pertinent obligations, then as a consequence you may not convey it at
   all. For example, if you agree to terms that obligate you to collect a
   royalty for further conveying from those to whom you convey the Program, the
   only way you could satisfy both those terms and this License would be to
   refrain entirely from conveying the Program.

   __1__ Use with the GNU Affero General Public License.

   Notwithstanding any other provision of this License, you have permission to
   link or combine any covered work with a work licensed under version 3 of the
   GNU Affero General Public License into a single combined work, and to convey
   the resulting work. The terms of this License will continue to apply to the
   part which is the covered work, but the special requirements of the GNU
   Affero General Public License, section 13, concerning interaction through a
   network will apply to the combination as such.

   __1__ Revised Versions of this License.

   The Free Software Foundation may publish revised and/or new versions of the
   GNU General Public License from time to time. Such new versions will be
   similar in spirit to the present version, but may differ in detail to address
   new problems or concerns.

   Each version is given a distinguishing version number. If the Program
   specifies that a certain numbered version of the GNU General Public License
   "or any later version" applies to it, you have the option of following the
   terms and conditions either of that numbered version or of any later version
   published by the Free Software Foundation. If the Program does not specify a
   version number of the GNU General Public License, you may choose any version
   ever published by the Free Software Foundation.

   If the Program specifies that a proxy can decide which future versions of the
   GNU General Public License can be used, that proxy's public statement of
   acceptance of a version permanently authorizes you to choose that version for
   the Program.

   Later license versions may give you additional or different permissions.
   However, no additional obligations are imposed on any author or copyright
   holder as a result of your choosing to follow a later version.

   __1__ Disclaimer of Warranty.

   THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE
   LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
   OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND,
   EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
   ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.
   SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY
   SERVICING, REPAIR OR CORRECTION.

   __1__ Limitation of Liability.

   IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL
   ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE
   PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
   GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE
   OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR
   DATA BEING RENDERED
   ((INACCURATE || INADURATE))
   OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR
   A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH
   HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

   __1__ Interpretation of Sections 15 and 16.

   If the disclaimer of warranty and limitation of liability provided above
   cannot be given local legal effect according to their terms, reviewing courts
   shall apply local law that most closely approximates an absolute waiver of
   all civil liability in connection with the Program, unless a warranty or
   assumption of liability accompanies a copy of the Program in return for a
   fee.

(( END OF TERMS AND CONDITIONS))??

((
How to Apply These Terms to Your New Programs

If you develop a new program, and you want it to be of the greatest possible use
to the public, the best way to achieve this is to make it free software which
everyone can redistribute and change under these terms.



To do so, attach the following notices to the program. It is safest to attach
them to the start of each source file to most effectively state the exclusion of
warranty; and each file should have at least the "copyright" line and a pointer
to where the full notice is found.

__30__
//**
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
**//

This program is free software: you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation, either version 3 of the License, or (at your option) any later
version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with
this program. If not, see <https:/www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

If the program does terminal interaction, make it output a short notice like
this when it starts in an interactive mode:

<program> __10__

This program comes with ABSOLUTELY NO WARRANTY; for details type ` + "`" + `show w'.

This is free software, and you are welcome to redistribute it under certain
conditions; type ` + "`" + `show c' for details.

The hypothetical commands ` + "`" + `show w' and ` + "`" + `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands might be
different; for a GUI interface, you would use an "about box".

You should also get your employer (if you work as a programmer) or school, if
any, to sign a "copyright disclaimer" for the program, if necessary. For more
information on this, and how to apply and follow the GNU GPL, see <https:/www.gnu.org/licenses/>.

The GNU General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may consider
it more useful to permit linking proprietary applications with the library. If
this is what you want to do, use the GNU Lesser General Public License instead
of this License. But first, please read <https://www.gnu.org/licenses/why-not-lgpl.html>.))??
`
const license_MIT_lre = `








//**
MIT License
https://spdx.org/licenses/MIT.json
https://opensource.org/licenses/MIT
https://fedoraproject.org/wiki/Licensing:MIT
**//
(( MIT License))??
//**Copyright**//


Permission is hereby granted,
((free of charge))??
to any person obtaining a copy of
__7__ //** (allow parenthetical descriptions) **//
((and associated documentation files))??
((
	the
	((Software || Materials || â€œSoftwareâ€))
||
//** Using a __1__ wildcard here causes some licenses to fail to match. **//
	Clausify
||
	EchoWBT
))
to deal in the
((Software || Materials))
((under the copyrights))??
((without restriction))??
including
((without limitation))??
the rights
((to))??
use, copy, modify, merge,
((
    publish, distribute,
    ((sublicense))??
    ((
	    and/or
	    ((sell))??
	    ((modified))??
    ))??
    copies of the
    ((Software || Materials))
))??
((
    and to permit persons to whom the
    ((Software is || Materials are))
    furnished to do so,
))??

subject to
((the following || all))
conditions:


__1__
((
	The above
	((copyright || authorship))
	notice
	(( and
		((this permission || thismssion))
		notice
		((including the next paragraph))??
	|| as well as this permission notice
	|| this permission notice, and the below disclaimer
	|| and every other copyright notice found in this software,
		and all the attributions in every file, and this permission notice
	|| and this permission notice (or reference to this permission notice) ))
||
	This permission notice
))
((must || shall))
be included in all
copies
or
((substantial || any))??
portions of the
((Software || Materials))
(( (Unless stated in separate file). ))??


((DISCLAIMER))??
((2.))??

THE
((SOFTWARE || MATERIALS))
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 || WILL))
__6__ BE LIABLE
FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION
((OF || F))
CONTRACT,
((TORT || FART))
OR OTHERWISE,
ARISING FROM, OUT OF OR
((IN || I))
CONNECTION WITH
((TE || THE))
((SOFTWARE || MATERIALS))
OR THE USE OR OTHER DEALINGS IN
((THE
	((SOFTWARE || MATERIALS))
))??


//** from https://github.com/ku/go-change-case/blob/master/LICENSE **//
((
    The goworker Logo

    The goworker logo is a work by Rachel Falwell combining the Go mascot by Renée
    French (CC-BY) and the Ruby logo by the Ruby Visual Identity Team (CC-BY-SA).
    The logo is released under a Creative Commons Attribution-ShareAlike 4.0
    International License in keeping with the restrictions of the works from which
    it is derived.
||
    Part of the code: files kdtree.go, kdtree_test.go and kdtree_bench_test.go
    is adapted version of the code from https://godoc.org/code.google.com/p/eaburns/kdtree,
    which is licensed under New BSD License: http://opensource.org/licenses/BSD-3-Clause
||
    Portions adapted from python-unidiff:

    Copyright (c) 2012 Matias Bordese

    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:
||
    Copyright (C) 2015 Glider Labs, LLC

      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.
))??








`
const license_MIT_0_lre = `
//**
MIT No Attribution
https://spdx.org/licenses/MIT-0.json
https://github.com/aws/mit-0
https://romanrm.net/mit-zero
https://github.com/awsdocs/aws-cloud9-user-guide/blob/master/LICENSE-SAMPLECODE
**//

Permission is hereby granted,
((free of charge))??
to any person obtaining a copy of
__7__ //** (allow parenthetical descriptions) **//
((and associated documentation files))??
((
	the
	((Software || Materials || â€œSoftwareâ€))
||
//** Using a __1__ wildcard here causes some licenses to fail to match. **//
	Clausify
||
	EchoWBT
))
to deal in the
((Software || Materials))
((under the copyrights))??
((without restriction))??
including
((without limitation))??
the rights
((to))??
use, copy, modify, merge,
((
    publish, distribute,
    ((sublicense))??
    ((
	    and/or
	    ((sell))??
	    ((modified))??
    ))??
    copies of the
    ((Software || Materials))
))??
((
    and to permit persons to whom the
    ((Software is || Materials are))
    furnished to do so,
))??

((subject to the following conditions))??

((DISCLAIMER))??
((2.))??

THE
((SOFTWARE || MATERIALS))
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 || WILL))
__6__ BE LIABLE
FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION
((OF || F))
CONTRACT,
((TORT || FART))
OR OTHERWISE,
ARISING FROM, OUT OF OR
((IN || I))
CONNECTION WITH
((TE || THE))
((SOFTWARE || MATERIALS))
OR THE USE OR OTHER DEALINGS IN
((THE
	((SOFTWARE || MATERIALS))
))??

`
const license_MIT_NoAd_lre = `


Permission is hereby granted,
((free of charge))??
to any person obtaining a copy of
__7__ //** (allow parenthetical descriptions) **//
((and associated documentation files))??
((
	the
	((Software || Materials || â€œSoftwareâ€))
||
//** Using a __1__ wildcard here causes some licenses to fail to match. **//
	Clausify
||
	EchoWBT
))
to deal in the
((Software || Materials))
((under the copyrights))??
((without restriction))??
including
((without limitation))??
the rights
((to))??
use, copy, modify, merge,
((
    publish, distribute,
    ((sublicense))??
    ((
	    and/or
	    ((sell))??
	    ((modified))??
    ))??
    copies of the
    ((Software || Materials))
))??
((
    and to permit persons to whom the
    ((Software is || Materials are))
    furnished to do so,
))??

subject to
((the following || all))
conditions:


__1__
((
	The above
	((copyright || authorship))
	notice
	(( and
		((this permission || thismssion))
		notice
		((including the next paragraph))??
	|| as well as this permission notice
	|| this permission notice, and the below disclaimer
	|| and every other copyright notice found in this software,
		and all the attributions in every file, and this permission notice
	|| and this permission notice (or reference to this permission notice) ))
||
	This permission notice
))
((must || shall))
be included in all
copies
or
((substantial || any))??
portions of the
((Software || Materials))
(( (Unless stated in separate file). ))??


Except as contained in this notice, the
((name || names))
__10__
shall not be used in advertising or otherwise
to promote the sale, use or other dealings in this Software
without prior written authorization
((
    ((
	    ((of || from))
	    __10__
    ))??

    
((DISCLAIMER))??
((2.))??

THE
((SOFTWARE || MATERIALS))
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 || WILL))
__6__ BE LIABLE
FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION
((OF || F))
CONTRACT,
((TORT || FART))
OR OTHERWISE,
ARISING FROM, OUT OF OR
((IN || I))
CONNECTION WITH
((TE || THE))
((SOFTWARE || MATERIALS))
OR THE USE OR OTHER DEALINGS IN
((THE
	((SOFTWARE || MATERIALS))
))??

||
    from ekino
))

`
const license_MITNFA_lre = `
//**
MIT +no-false-attribs license
https://spdx.org/licenses/MITNFA.json
https://fedoraproject.org/wiki/Licensing/MITNFA
**//


Permission is hereby granted,
((free of charge))??
to any person obtaining a copy of
__7__ //** (allow parenthetical descriptions) **//
((and associated documentation files))??
((
	the
	((Software || Materials || â€œSoftwareâ€))
||
//** Using a __1__ wildcard here causes some licenses to fail to match. **//
	Clausify
||
	EchoWBT
))
to deal in the
((Software || Materials))
((under the copyrights))??
((without restriction))??
including
((without limitation))??
the rights
((to))??
use, copy, modify, merge,
((
    publish, distribute,
    ((sublicense))??
    ((
	    and/or
	    ((sell))??
	    ((modified))??
    ))??
    copies of the
    ((Software || Materials))
))??
((
    and to permit persons to whom the
    ((Software is || Materials are))
    furnished to do so,
))??

subject to
((the following || all))
conditions:


__1__
((
	The above
	((copyright || authorship))
	notice
	(( and
		((this permission || thismssion))
		notice
		((including the next paragraph))??
	|| as well as this permission notice
	|| this permission notice, and the below disclaimer
	|| and every other copyright notice found in this software,
		and all the attributions in every file, and this permission notice
	|| and this permission notice (or reference to this permission notice) ))
||
	This permission notice
))
((must || shall))
be included in all
copies
or
((substantial || any))??
portions of the
((Software || Materials))
(( (Unless stated in separate file). ))??


Distributions of all or part of the Software intended to be used by the
recipients as they would use the unmodified Software, containing modifications
that substantially alter, remove, or disable functionality of the Software,
outside of the documented configuration mechanisms provided by the Software,
shall be modified such that the Original Author's bug reporting email addresses
and urls are either replaced with the contact information of the parties
responsible for the changes, or removed entirely.


((DISCLAIMER))??
((2.))??

THE
((SOFTWARE || MATERIALS))
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 || WILL))
__6__ BE LIABLE
FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION
((OF || F))
CONTRACT,
((TORT || FART))
OR OTHERWISE,
ARISING FROM, OUT OF OR
((IN || I))
CONNECTION WITH
((TE || THE))
((SOFTWARE || MATERIALS))
OR THE USE OR OTHER DEALINGS IN
((THE
	((SOFTWARE || MATERIALS))
))??

`
const license_MPL_2_0_lre = `//**
Mozilla Public License 2.0
https://spdx.org/licenses/MPL-2.0.json
http://www.mozilla.org/MPL/2.0/
https://opensource.org/licenses/MPL-2.0
modifications from: github.com/gardener/test-infra@v0.0.0-20201203144902-44c86b23c403
**//





((

This Source Code Form is subject to the terms of the Mozilla Public License, v.
2.0. If a copy of the MPL was not distributed with this
((file || project))
, You can obtain one
at http:/mozilla.org/MPL/2.0/.


||

Licensed under the Mozilla Public License, Version 2.0 (the "License"); you may
not use this software except in compliance with the License. You may obtain a
copy of the License at

http://mozilla.org/MPL/2.0/

Unless required by applicable law or agreed to in writing, software distributed
under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied. See the License for the
specific language governing permissions and limitations under the License.

||

(( Mozilla Public License Version 2.0 ))??

   (( 1. ))??
   Definitions

      (( 1.1. ))??
      "Contributor" means each individual or legal entity that creates,
      contributes to the creation of, or owns Covered Software.

      (( 1.2. ))??
      "Contributor Version" means the combination of the Contributions of others
      (if any) used by a Contributor and that particular Contributor's
      Contribution.

      (( 1.3. ))??
      "Contribution" means Covered Software of a particular Contributor.

      (( 1.4. ))??
      "Covered Software" means Source Code Form to which the initial Contributor
      has attached the notice in Exhibit A, the Executable Form of such Source
      Code Form, and Modifications of such Source Code Form, in each case
      including portions thereof.

      (( 1.5. ))??
      "Incompatible With Secondary Licenses" means

         (( (a) ))??
         that the initial Contributor has attached the notice described in
         Exhibit B to the Covered Software; or

         (( (b) ))??
         that the Covered Software was made available under the terms of version
         1.1 or earlier of the License, but not also under the terms of a
         Secondary License.

      (( 1.6. ))??
      "Executable Form" means any form of the work other than Source Code Form.

      (( 1.7. ))??
      "Larger Work" means a work that combines Covered Software with other
      material, in a separate file or files, that is not Covered Software.

      (( 1.8. ))??
      "License" means this document.

      (( 1.9. ))??
      "Licensable" means having the right to grant, to the maximum extent
      possible, whether at the time of the initial grant or subsequently, any
      and all of the rights conveyed by this License.

      (( 1.10. ))??
      "Modifications" means any of the following:

         (( (a) ))??
         any file in Source Code Form that results from an addition to, deletion
         from, or modification of the contents of Covered Software; or

         (( (b) ))??
         any new file in Source Code Form that contains any Covered Software.

      (( 1.11. ))??
      "Patent Claims" of a Contributor means any patent claim(s), including
      without limitation, method, process, and apparatus claims, in any patent
      Licensable by such Contributor that would be infringed, but for the grant
      of the License, by the making, using, selling, offering for sale, having
      made, import, or transfer of either its Contributions or its Contributor
      Version.

      (( 1.12. ))??
      "Secondary License" means either the GNU General Public License, Version
      2.0, the GNU Lesser General Public License, Version 2.1, the GNU Affero
      General Public License, Version 3.0, or any later versions of those
      licenses.

      (( 1.13. ))??
      "Source Code Form" means the form of the work preferred for making
      modifications.

      (( 1.14. ))??
      "You" (or "Your") means an individual or a legal entity exercising rights
      under this License. For legal entities, "You" includes any entity that
      controls, is controlled by, or is under common control with You. For
      purposes of this definition, "control" means (a) the power, direct or
      indirect, to cause the direction or management of such entity, whether by
      contract or otherwise, or (b) ownership of more than fifty percent (50%)
      of the outstanding shares or beneficial ownership of such entity.

   (( 1. || 2. ))??
   License Grants and Conditions

      (( 2.1. ))??
      Grants

      Each Contributor hereby grants You a world-wide, royalty-free,
      non-exclusive license:

         (( (a) ))??
         under intellectual property rights (other than patent or trademark)
         Licensable by such Contributor to use, reproduce, make available,
         modify, display, perform, distribute, and otherwise exploit its
         Contributions, either on an unmodified basis, with Modifications, or as
         part of a Larger Work; and

         (( (b) ))??
         under Patent Claims of such Contributor to make, use, sell, offer for
         sale, have made, import, and otherwise transfer either its
         Contributions or its Contributor Version.

      (( 2.2. ))??
      Effective Date

      The licenses granted in Section 2.1 with respect to any Contribution
      become effective for each Contribution on the date the Contributor first
      distributes such Contribution.

      (( 2.3. ))??
      Limitations on Grant Scope

      The licenses granted in this Section 2 are the only rights granted under
      this License. No additional rights or licenses will be implied from the
      distribution or licensing of Covered Software under this License.
      Notwithstanding Section 2.1(b) above, no patent license is granted by a
      Contributor:

         (( (a) ))??
         for any code that a Contributor has removed from Covered Software; or

         (( (b) ))??
         for infringements caused by: (i) Your and any other third party's
         modifications of Covered Software, or (ii) the combination of its
         Contributions with other software (except as part of its Contributor
         Version); or

         (( c ))??
         under Patent Claims infringed by Covered Software in the absence of its
         Contributions.

      This License does not grant any rights in the trademarks, service marks,
      or logos of any Contributor (except as may be necessary to comply with the
      notice requirements in Section 3.4).

      (( 2.4. ))??
      Subsequent Licenses

      No Contributor makes additional grants as a result of Your choice to
      distribute the Covered Software under a subsequent version of this License
      (see Section 10.2) or under the terms of a Secondary License (if permitted
      under the terms of Section 3.3).

      (( 2.5. ))??
      Representation

      Each Contributor represents that the Contributor believes its
      Contributions are its original creation(s) or it has sufficient rights to
      grant the rights to its Contributions conveyed by this License.

      (( 2.6. ))??
      Fair Use

      This License is not intended to limit any rights You have under applicable
      copyright doctrines of fair use, fair dealing, or other equivalents.

      (( 2.7. ))??
      Conditions

      Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in
      Section 2.1.

   (( 1. || 3. ))??
   Responsibilities

      (( 3.1. ))??
      Distribution of Source Form

      All distribution of Covered Software in Source Code Form, including any
      Modifications that You create or to which You contribute, must be under
      the terms of this License. You must inform recipients that the Source Code
      Form of the Covered Software is governed by the terms of this License, and
      how they can obtain a copy of this License. You may not attempt to alter
      or restrict the recipients' rights in the Source Code Form.

      (( 3.2. ))??
      Distribution of Executable Form

      If You distribute Covered Software in Executable Form then:

         (( (a) ))??
         such Covered Software must also be made available in Source Code Form,
         as described in Section 3.1, and You must inform recipients of the
         Executable Form how they can obtain a copy of such Source Code Form by
         reasonable means in a timely manner, at a charge no more than the cost
         of distribution to the recipient; and

         (( (b) ))??
         You may distribute such Executable Form under the terms of this
         License, or sublicense it under different terms, provided that the
         license for the Executable Form does not attempt to limit or alter the
         recipients' rights in the Source Code Form under this License.

      (( 3.3. ))??
      Distribution of a Larger Work

      You may create and distribute a Larger Work under terms of Your choice,
      provided that You also comply with the requirements of this License for
      the Covered Software. If the Larger Work is a combination of Covered
      Software with a work governed by one or more Secondary Licenses, and the
      Covered Software is not Incompatible With Secondary Licenses, this License
      permits You to additionally distribute such Covered Software under the
      terms of such Secondary License(s), so that the recipient of the Larger
      Work may, at their option, further distribute the Covered Software under
      the terms of either this License or such Secondary License(s).

      (( 3.4. ))??
      Notices

      You may not remove or alter the substance of any license notices
      (including copyright notices, patent notices, disclaimers of warranty, or
      limitations of liability) contained within the Source Code Form of the
      Covered Software, except that You may alter any license notices to the
      extent required to remedy known factual inaccuracies.

      (( 3.5. ))??
      Application of Additional Terms

      You may choose to offer, and to charge a fee for, warranty, support,
      indemnity or liability obligations to one or more recipients of Covered
      Software. However, You may do so only on Your own behalf, and not on
      behalf of any Contributor. You must make it absolutely clear that any such
      warranty, support, indemnity, or liability obligation is offered by You
      alone, and You hereby agree to indemnify every Contributor for any
      liability incurred by such Contributor as a result of warranty, support,
      indemnity or liability terms You offer. You may include additional
      disclaimers of warranty and limitations of liability specific to any
      jurisdiction.

   (( 1. || 4. ))??
   Inability to Comply Due to Statute or Regulation

   If it is impossible for You to comply with any of the terms of this License
   with respect to some or all of the Covered Software due to statute, judicial
   order, or regulation then You must: (a) comply with the terms of this License
   to the maximum extent possible; and (b) describe the limitations and the code
   they affect. Such description must be placed in a text file included with all
   distributions of the Covered Software under this License. Except to the
   extent prohibited by statute or regulation, such description must be
   sufficiently detailed for a recipient of ordinary skill to be able to
   understand it.

   (( 1. || 5. ))??
   Termination

      (( 5.1. ))??
      The rights granted under this License will terminate automatically if You
      fail to comply with any of its terms. However, if You become compliant,
      then the rights granted under this License from a particular Contributor
      are reinstated (a) provisionally, unless and until such Contributor
      explicitly and finally terminates Your grants, and (b) on an ongoing
      basis, if such Contributor fails to notify You of the non-compliance by
      some reasonable means prior to 60 days after You have come back into
      compliance. Moreover, Your grants from a particular Contributor are
      reinstated on an ongoing basis if such Contributor notifies You of the
      non-compliance by some reasonable means, this is the first time You have
      received notice of non-compliance with this License from such Contributor,
      and You become compliant prior to 30 days after Your receipt of the
      notice.

      (( 5.2. ))??
      If You initiate litigation against any entity by asserting a patent
      infringement claim (excluding declaratory judgment actions,
      counter-claims, and cross-claims) alleging that a Contributor Version
      directly or indirectly infringes any patent, then the rights granted to
      You by any and all Contributors for the Covered Software under Section 2.1
      of this License shall terminate.

      (( 5.3. ))??
      In the event of termination under Sections 5.1 or 5.2 above, all end user
      license agreements (excluding distributors and resellers) which have been
      validly granted by You or Your distributors under this License prior to
      termination shall survive termination.

   (( 6. ))??
   Disclaimer of Warranty

   Covered Software is provided under this License on an "as is" basis, without
   warranty of any kind, either expressed, implied, or statutory, including,
   without limitation, warranties that the Covered Software is free of defects,
   merchantable, fit for a particular purpose or non-infringing. The entire risk
   as to the quality and performance of the Covered Software is with You. Should
   any Covered Software prove defective in any respect, You (not any
   Contributor) assume the cost of any necessary servicing, repair, or
   correction. This disclaimer of warranty constitutes an essential part of this
   License. No use of any Covered Software is authorized under this License
   except under this disclaimer.

   (( 7. ))??
   Limitation of Liability

   Under no circumstances and under no legal theory, whether tort (including
   negligence), contract, or otherwise, shall any Contributor, or anyone who
   distributes Covered Software as permitted above, be liable to You for any
   direct, indirect, special, incidental, or consequential damages of any
   character including, without limitation, damages for lost profits, loss of
   goodwill, work stoppage, computer failure or malfunction, or any and all
   other commercial damages or losses, even if such party shall have been
   informed of the possibility of such damages. This limitation of liability
   shall not apply to liability for death or personal injury resulting from such
   party's negligence to the extent applicable law prohibits such limitation.
   Some jurisdictions do not allow the exclusion or limitation of incidental or
   consequential damages, so this exclusion and limitation may not apply to
   You.

   (( 1. || 8. ))??
   Litigation

   Any litigation relating to this License may be brought only in the courts of
   a jurisdiction where the defendant maintains its principal place of business
   and such litigation shall be governed by laws of that jurisdiction, without
   reference to its conflict-of-law provisions. Nothing in this Section shall
   prevent a party's ability to bring cross-claims or counter-claims.

   (( 1. || 9. ))??
   Miscellaneous

   This License represents the complete agreement concerning the subject matter
   hereof. If any provision of this License is held to be unenforceable, such
   provision shall be reformed only to the extent necessary to make it
   enforceable. Any law or regulation which provides that the language of a
   contract shall be construed against the drafter shall not be used to construe
   this License against a Contributor.

   (( 1. || 10. ))??
   Versions of the License

      (( 10.1. ))??
      New Versions

      Mozilla Foundation is the license steward. Except as provided in Section
      10.3, no one other than the license steward has the right to modify or
      publish new versions of this License. Each version will be given a
      distinguishing version number.

      (( 10.2. ))??
      Effect of New Versions

      You may distribute the Covered Software under the terms of the version of
      the License under which You originally received the Covered Software, or
      under the terms of any subsequent version published by the license
      steward.

      (( 10.3. ))??
      Modified Versions

      If you create software not governed by this License, and you want to
      create a new license for such software, you may create and use a modified
      version of this License if you rename the license and remove any
      references to the name of the license steward (except to note that such
      modified license differs from this License).

      (( 10.4. ))??
      Distributing Source Code Form that is Incompatible With Secondary
      Licenses

      If You choose to distribute Source Code Form that is Incompatible With
      Secondary Licenses under the terms of this version of the License, the
      notice described in Exhibit B of this License must be attached.
      (( Exhibit A - Source Code Form License Notice

This Source Code Form is subject to the terms of the Mozilla Public License, v.
2.0. If a copy of the MPL was not distributed with this file, You can obtain one
at http:/mozilla.org/MPL/2.0/.

If it is not possible or desirable to put the notice in a particular file, then
You may include the notice in a location (such as a LICENSE file in a relevant
directory) where a recipient would be likely to look for such a notice.

You may add additional accurate notices of copyright ownership.

Exhibit B - "Incompatible With Secondary Licenses" Notice

This Source Code Form is "Incompatible With Secondary Licenses", as defined by
the Mozilla Public License, v. 2.0. ))??

))
`
const license_MPL_2_0_no_copyleft_exception_lre = `

This Source Code Form is subject to the terms of the Mozilla Public License, v.
2.0. If a copy of the MPL was not distributed with this
((file || project))
, You can obtain one
at http:/mozilla.org/MPL/2.0/.

This Source Code Form is "Incompatible With Secondary Licenses", as defined by the Mozilla Public License, v. 2.0.
`
const license_NCSA_lre = `//**
University of Illinois/NCSA Open Source License
https://spdx.org/licenses/NCSA.json
http://otm.illinois.edu/uiuc_openSource
https://opensource.org/licenses/NCSA
**//

(( University of Illinois/NCSA Open Source License
(( Copyright __20__ ))??
))??

((Developed by: __30__))??

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal with
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:

   ((1))??
   Redistributions of source code must retain the above copyright notice, this
   list of conditions and the following disclaimers.

   ((2))??
   Redistributions in binary form must reproduce the above copyright notice,
   this list of conditions and the following disclaimers in the documentation
   and/or other materials provided with the distribution.

   ((3))??
   Neither the names of __10__
   nor the names of its contributors may be used to endorse or promote
   products derived from this Software without specific prior written
   permission.

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 CONTRIBUTORS
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 WITH THE SOFTWARE.
`
const license_Unlicense_lre = `//**
The Unlicense
https://spdx.org/licenses/Unlicense.json
https://unlicense.org/
**//

((
    ((This))??
    is free and unencumbered software released into the public domain.
))??

Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
software, either in source code form or as
((a || assignment))??
compiled binary, for any purpose,
commercial or non-commercial, and by any means.

In jurisdictions that recognize copyright laws, the author or authors of this
software dedicate any and all copyright interest in the software to the public
domain. We make this dedication for the benefit of the public at large and to
the detriment of our heirs and successors. We intend this dedication to be an
overt act of relinquishment in perpetuity of all present and future rights to
this software under copyright law.

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 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.

((
    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.
))??


(( For more information, please refer to <https:/unlicense.org/> ))??
`
const license_atlantis_lre = `//**
source: https://github.com/runatlantis/atlantis/blob/master/LICENSE
**//


Atlantis was originally copyrighted and licensed under:

    Copyright 2017 HootSuite Media Inc.

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.

In 2018 it was forked from github.com/hootsuite/atlantis to
github.com/runatlantis/atlantis. The contents of files created before the fork
are obviously still under the Hootsuite copyright and contain a header to that
effect in addition to a disclaimer that they have subsequently been modified by
contributors to github.com/runatlantis/atlantis. Modifications and new files
hereafter are still under the Apache 2.0 license, but are not under copyright of
Hootsuite Media Inc.

`
const license_atvg_lre = `//** github.com/rokku-aaab/mcleaks@v1.0.0 **//



ATVG-Studios Open Source Project License 20 (Version 2.0, Release Jun 2019)
==================================

0. License Origin
------------------

This is to note that the Open Source Project License 20 and later,
originate from the Mozilla Public License, v. 2.0.

The original steward, Mozilla Foundation, has been replaced with
ATVG-Studios.

This note was created in reference to 10.3 of this license.

1. Definitions
--------------

1.1. "Contributor"
    means each individual or legal entity that creates, contributes to
    the creation of, or owns Covered Software.

1.2. "Contributor Version"
    means the combination of the Contributions of others (if any) used
    by a Contributor and that particular Contributor's Contribution.

1.3. "Contribution"
    means Covered Software of a particular Contributor.

1.4. "Covered Software"
    means Source Code Form to which the initial Contributor has attached
    the notice in Exhibit A, the Executable Form of such Source Code
    Form, and Modifications of such Source Code Form, in each case
    including portions thereof.

1.5. "Incompatible With Secondary Licenses"
    means

    (a) that the initial Contributor has attached the notice described
        in Exhibit B to the Covered Software; or

    (b) that the Covered Software was made available under the terms of
        version 1.4 or earlier of the License, but not also under the
        terms of a Secondary License.

1.6. "Executable Form"
    means any form of the work other than Source Code Form.

1.7. "Larger Work"
    means a work that combines Covered Software with other material, in 
    a separate file or files, that is not Covered Software.

1.8. "License"
    means this document.

1.9. "Licensable"
    means having the right to grant, to the maximum extent possible,
    whether at the time of the initial grant or subsequently, any and
    all of the rights conveyed by this License.

1.10. "Modifications"
    means any of the following:

    (a) any file in Source Code Form that results from an addition to,
        deletion from, or modification of the contents of Covered
        Software; or

    (b) any new file in Source Code Form that contains any Covered
        Software.

1.11. "Patent Claims" of a Contributor
    means any patent claim(s), including without limitation, method,
    process, and apparatus claims, in any patent Licensable by such
    Contributor that would be infringed, but for the grant of the
    License, by the making, using, selling, offering for sale, having
    made, import, or transfer of either its Contributions or its
    Contributor Version.

1.12. "Secondary License"
    means either the GNU General Public License, Version 2.0, the GNU
    Lesser General Public License, Version 2.1, the GNU Affero General
    Public License, Version 3.0, or any later versions of those
    licenses.

1.13. "Source Code Form"
    means the form of the work preferred for making modifications.

1.14. "You" (or "Your")
    means an individual or a legal entity exercising rights under this
    License. For legal entities, "You" includes any entity that
    controls, is controlled by, or is under common control with You. For
    purposes of this definition, "control" means (a) the power, direct
    or indirect, to cause the direction or management of such entity,
    whether by contract or otherwise, or (b) ownership of more than
    fifty percent (50%) of the outstanding shares or beneficial
    ownership of such entity.

2. License Grants and Conditions
--------------------------------

2.1. Grants

Each Contributor hereby grants You a world-wide, royalty-free,
non-exclusive license:

(a) under intellectual property rights (other than patent or trademark)
    Licensable by such Contributor to use, reproduce, make available,
    modify, display, perform, distribute, and otherwise exploit its
    Contributions, either on an unmodified basis, with Modifications, or
    as part of a Larger Work; and

(b) under Patent Claims of such Contributor to make, use, sell, offer
    for sale, have made, import, and otherwise transfer either its
    Contributions or its Contributor Version.

2.2. Effective Date

The licenses granted in Section 2.1 with respect to any Contribution
become effective for each Contribution on the date the Contributor first
distributes such Contribution.

2.3. Limitations on Grant Scope

The licenses granted in this Section 2 are the only rights granted under
this License. No additional rights or licenses will be implied from the
distribution or licensing of Covered Software under this License.
Notwithstanding Section 2.1(b) above, no patent license is granted by a
Contributor:

(a) for any code that a Contributor has removed from Covered Software;
    or

(b) for infringements caused by: (i) Your and any other third party's
    modifications of Covered Software, or (ii) the combination of its
    Contributions with other software (except as part of its Contributor
    Version); or

(c) under Patent Claims infringed by Covered Software in the absence of
    its Contributions.

This License does not grant any rights in the trademarks, service marks,
or logos of any Contributor (except as may be necessary to comply with
the notice requirements in Section 3.4).

2.4. Subsequent Licenses

No Contributor makes additional grants as a result of Your choice to
distribute the Covered Software under a subsequent version of this
License (see Section 10.2) or under the terms of a Secondary License (if
permitted under the terms of Section 3.3).

2.5. Representation

Each Contributor represents that the Contributor believes its
Contributions are its original creation(s) or it has sufficient rights
to grant the rights to its Contributions conveyed by this License.

2.6. Fair Use

This License is not intended to limit any rights You have under
applicable copyright doctrines of fair use, fair dealing, or other
equivalents.

2.7. Conditions

Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
in Section 2.1.

3. Responsibilities
-------------------

3.1. Distribution of Source Form

All distribution of Covered Software in Source Code Form, including any
Modifications that You create or to which You contribute, must be under
the terms of this License. You must inform recipients that the Source
Code Form of the Covered Software is governed by the terms of this
License, and how they can obtain a copy of this License. You may not
attempt to alter or restrict the recipients' rights in the Source Code
Form.

3.2. Distribution of Executable Form

If You distribute Covered Software in Executable Form then:

(a) such Covered Software must also be made available in Source Code
    Form, as described in Section 3.1, and You must inform recipients of
    the Executable Form how they can obtain a copy of such Source Code
    Form by reasonable means in a timely manner, at a charge no more
    than the cost of distribution to the recipient; and

(b) You may distribute such Executable Form under the terms of this
    License, or sublicense it under different terms, provided that the
    license for the Executable Form does not attempt to limit or alter
    the recipients' rights in the Source Code Form under this License.

3.3. Distribution of a Larger Work

You may create and distribute a Larger Work under terms of Your choice,
provided that You also comply with the requirements of this License for
the Covered Software. If the Larger Work is a combination of Covered
Software with a work governed by one or more Secondary Licenses, and the
Covered Software is not Incompatible With Secondary Licenses, this
License permits You to additionally distribute such Covered Software
under the terms of such Secondary License(s), so that the recipient of
the Larger Work may, at their option, further distribute the Covered
Software under the terms of either this License or such Secondary
License(s).

3.4. Notices

You may not remove or alter the substance of any license notices
(including copyright notices, patent notices, disclaimers of warranty,
or limitations of liability) contained within the Source Code Form of
the Covered Software, except that You may alter any license notices to
the extent required to remedy known factual inaccuracies.

3.5. Application of Additional Terms

You may choose to offer, and to charge a fee for, warranty, support,
indemnity or liability obligations to one or more recipients of Covered
Software. However, You may do so only on Your own behalf, and not on
behalf of any Contributor. You must make it absolutely clear that any
such warranty, support, indemnity, or liability obligation is offered by
You alone, and You hereby agree to indemnify every Contributor for any
liability incurred by such Contributor as a result of warranty, support,
indemnity or liability terms You offer. You may include additional
disclaimers of warranty and limitations of liability specific to any
jurisdiction.

4. Inability to Comply Due to Statute or Regulation
---------------------------------------------------

If it is impossible for You to comply with any of the terms of this
License with respect to some or all of the Covered Software due to
statute, judicial order, or regulation then You must: (a) comply with
the terms of this License to the maximum extent possible; and (b)
describe the limitations and the code they affect. Such description must
be placed in a text file included with all distributions of the Covered
Software under this License. Except to the extent prohibited by statute
or regulation, such description must be sufficiently detailed for a
recipient of ordinary skill to be able to understand it.

5. Termination
--------------

5.1. The rights granted under this License will terminate automatically
if You fail to comply with any of its terms. However, if You become
compliant, then the rights granted under this License from a particular
Contributor are reinstated (a) provisionally, unless and until such
Contributor explicitly and finally terminates Your grants, and (b) on an
ongoing basis, if such Contributor fails to notify You of the
non-compliance by some reasonable means prior to 60 days after You have
come back into compliance. Moreover, Your grants from a particular
Contributor are reinstated on an ongoing basis if such Contributor
notifies You of the non-compliance by some reasonable means, this is the
first time You have received notice of non-compliance with this License
from such Contributor, and You become compliant prior to 30 days after
Your receipt of the notice.

5.2. If You initiate litigation against any entity by asserting a patent
infringement claim (excluding declaratory judgment actions,
counter-claims, and cross-claims) alleging that a Contributor Version
directly or indirectly infringes any patent, then the rights granted to
You by any and all Contributors for the Covered Software under Section
2.1 of this License shall terminate.

5.3. In the event of termination under Sections 5.1 or 5.2 above, all
end user license agreements (excluding distributors and resellers) which
have been validly granted by You or Your distributors under this License
prior to termination shall survive termination.

************************************************************************
*                                                                      *
*  6. Disclaimer of Warranty                                           *
*  -------------------------                                           *
*                                                                      *
*  Covered Software is provided under this License on an "as is"       *
*  basis, without warranty of any kind, either expressed, implied, or  *
*  statutory, including, without limitation, warranties that the       *
*  Covered Software is free of defects, merchantable, fit for a        *
*  particular purpose or non-infringing. The entire risk as to the     *
*  quality and performance of the Covered Software is with You.        *
*  Should any Covered Software prove defective in any respect, You     *
*  (not any Contributor) assume the cost of any necessary servicing,   *
*  repair, or correction. This disclaimer of warranty constitutes an   *
*  essential part of this License. No use of any Covered Software is   *
*  authorized under this License except under this disclaimer.         *
*                                                                      *
************************************************************************

************************************************************************
*                                                                      *
*  7. Limitation of Liability                                          *
*  --------------------------                                          *
*                                                                      *
*  Under no circumstances and under no legal theory, whether tort      *
*  (including negligence), contract, or otherwise, shall any           *
*  Contributor, or anyone who distributes Covered Software as          *
*  permitted above, be liable to You for any direct, indirect,         *
*  special, incidental, or consequential damages of any character      *
*  including, without limitation, damages for lost profits, loss of    *
*  goodwill, work stoppage, computer failure or malfunction, or any    *
*  and all other commercial damages or losses, even if such party      *
*  shall have been informed of the possibility of such damages. This   *
*  limitation of liability shall not apply to liability for death or   *
*  personal injury resulting from such party's negligence to the       *
*  extent applicable law prohibits such limitation. Some               *
*  jurisdictions do not allow the exclusion or limitation of           *
*  incidental or consequential damages, so this exclusion and          *
*  limitation may not apply to You.                                    *
*                                                                      *
************************************************************************

8. Litigation
-------------

Any litigation relating to this License may be brought only in the
courts of a jurisdiction where the defendant maintains its principal
place of business and such litigation shall be governed by laws of that
jurisdiction, without reference to its conflict-of-law provisions.
Nothing in this Section shall prevent a party's ability to bring
cross-claims or counter-claims.

9. Miscellaneous
----------------

This License represents the complete agreement concerning the subject
matter hereof. If any provision of this License is held to be
unenforceable, such provision shall be reformed only to the extent
necessary to make it enforceable. Any law or regulation which provides
that the language of a contract shall be construed against the drafter
shall not be used to construe this License against a Contributor.

10. Versions of the License
---------------------------

10.1. New Versions

ATVG-Studios is the license steward. Except as provided in Section
10.3, no one other than the license steward has the right to modify or
publish new versions of this License. Each version will be given a
distinguishing version number.

10.2. Effect of New Versions

You may distribute the Covered Software under the terms of the version
of the License under which You originally received the Covered Software,
or under the terms of any subsequent version published by the license
steward.

10.3. Modified Versions

If you create software not governed by this License, and you want to
create a new license for such software, you may create and use a
modified version of this License if you rename the license and remove
any references to the name of the license steward (except to note that
such modified license differs from this License).

10.4. Distributing Source Code Form that is Incompatible With Secondary
Licenses

If You choose to distribute Source Code Form that is Incompatible With
Secondary Licenses under the terms of this version of the License, the
notice described in Exhibit B of this License must be attached.

Exhibit A - Source Code Form License Notice
-------------------------------------------

  This Source Code Form is subject to the terms of the ATVG-Studios Open
  Source Project License 20. If a copy of the OSPL was not
  distributed with this file, You can obtain one at
  https://atvg-studios.com/ospl/ospl20.

If it is not possible or desirable to put the notice in a particular
file, then You may include the notice in a location (such as a LICENSE
file in a relevant directory) where a recipient would be likely to look
for such a notice.

You may add additional accurate notices of copyright ownership.

Exhibit B - "Incompatible With Secondary Licenses" Notice
---------------------------------------------------------

  This Source Code Form is "Incompatible With Secondary Licenses", as
  defined by the ATVG-Studios Open Source Project License 20.`
const license_autogold_lre = `//** github.com/hexops/autogold@v1.1.0 **//



Licensed under the Apache License, Version 2.0 (see LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
or the MIT license (see LICENSE-MIT or http://opensource.org/licenses/MIT), at
your option. All files in the project without exclusions may not be copied,
modified, or distributed except according to those terms.
`
const license_autoscaler_lre = `//**
source: https://github.com/gardener/autoscaler/blob/v0.1.0/LICENSE
**//



                                 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.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

## APIs

This project may include APIs to SAP or third party products or services. The use of these APIs, products and services may be subject to additional agreements. In no event shall the application of the Apache Software License, v.2 to this project grant any rights in or to these APIs, products or services that would alter, expand, be inconsistent with, or supersede any terms of these additional agreements. API means application programming interfaces, as well as their respective specifications and implementing code that allows other software products to communicate with or call on SAP or third party products or services (for example, SAP Enterprise Services, BAPIs, Idocs, RFCs and ABAP calls or other user exits) and may be made available through SAP or third party products, SDKs, documentation or other media.

## Subcomponents

This project includes the following subcomponents that are subject to separate license terms.
Your use of these subcomponents is subject to the separate license terms applicable to
each subcomponent.

Set of dependencies used by [kubernetes/autoscaler](https://github.wdf.sap.corp/kubernetes/autoscaler/) can be found
at [Godeps.json](./cluster-autoscaler/Godeps/Godeps.json).

Google Cloud Client Libraries for Go
https://github.com/GoogleCloudPlatform/google-cloud-go
Copyright 2014 Google Inc.
Apache 2 license https://github.com/GoogleCloudPlatform/google-cloud-go/blob/master/LICENSE

Microsoft Azure SDK for Go
https://github.com/Azure/azure-sdk-for-go
Copyright 2016 Microsoft Corporation
Apache 2 license https://github.com/Azure/azure-sdk-for-go/blob/master/LICENSE

Go package for ANSI terminal emulation in Windows
https://github.com/Azure/go-ansiterm
Copyright (c) 2015 Microsoft Corporation
MIT license https://github.com/Azure/go-ansiterm/blob/master/LICENSE

https://github.com/Azure/go-ansiterm
Copyright (c) 2015 Microsoft Corporation
MIT license https://github.com/Azure/go-ansiterm/blob/master/LICENSE

Windows Performance Data Helper wrapper package for Go
https://github.com/JeffAshton/win_pdh/
Copyright (c) 2010 The win_pdh Authors. All rights reserved.
3 clause BSD license https://github.com/JeffAshton/win_pdh/blob/master/LICENSE

Package heredoc provides the here-document with keeping indent.
https://github.com/MakeNowJust/heredoc
Copyright (c) 2014-2017 TSUYUSATO Kitsune
MIT license https://github.com/MakeNowJust/heredoc/blob/master/LICENSE

Win32 IO-related utilities for Go
https://github.com/Microsoft/go-winio
Copyright (c) 2015 Microsoft
MIT license https://github.com/Microsoft/go-winio/blob/master/LICENSE

Windows - Host Compute Service Shim
https://github.com/Microsoft/hcsshim
Copyright (c) 2015 Microsoft
MIT license https://github.com/Microsoft/hcsshim/blob/master/LICENSE

Golang middleware to gzip HTTP responses
https://github.com/NYTimes/gziphandler
Copyright 2016-2017 The New York Times Company
Apache 2 license https://github.com/NYTimes/gziphandler/blob/master/LICENSE

Gotty is a library written in Go that provides interpretation and loading of Termcap database files.
https://github.com/Nvveen/Gotty
Copyright (c) 2012, Neal van Veen (nealvanveen@gmail.com)
2 clause BSD license https://github.com/Nvveen/Gotty/blob/master/LICENSE

purell - tiny Go library to normalize URLs
https://github.com/PuerkitoBio/purell
Copyright (c) 2012, Martin Angers
3 clause BSD license https://github.com/PuerkitoBio/purell/blob/master/LICENSE

urlesc - Proper URL escaping as per RFC3986
https://github.com/PuerkitoBio/urlesc
Copyright (c) 2012 The Go Authors. All rights reserved.
3 clause BSD license https://github.com/PuerkitoBio/urlesc/blob/master/LICENSE

go-http-auth - Basic and Digest HTTP Authentication for golang http
https://github.com/abbot/go-http-auth
Apache 2 license https://github.com/abbot/go-http-auth/blob/master/LICENSE

appc spec - App Container Specification and Tooling
https://github.com/appc/spec
Copyright 2015 The appc Authors
Apache 2 license https://github.com/appc/spec/blob/master/LICENSE

circbuf - Golang circular (ring) buffer
https://github.com/armon/circbuf
Copyright (c) 2013 Armon Dadgar
MIT license https://github.com/armon/circbuf/blob/master/LICENSE

AWS SDK for the Go programming language.
https://github.com/aws/aws-sdk-go
Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
Copyright 2014-2015 Stripe, Inc.
Apache 2 license https://github.com/aws/aws-sdk-go/blob/master/LICENSE.txt

perks - Effective Computation of Things
https://github.com/beorn7/perks
Copyright (C) 2013 Blake Mizerany
MIT license https://github.com/beorn7/perks/blob/master/LICENSE

semver - Semantic Versioning (semver) library written in golang
https://github.com/blang/semver
Copyright (c) 2014 Benedikt Lang <github at benediktlang.de>
MIT license https://github.com/blang/semver/blob/master/LICENSE

Flocker go library
https://github.com/clusterhq/flocker-go
Copyright 2014-2016 ClusterHQ
Apache 2 license https://github.com/ClusterHQ/flocker-go/blob/master/LICENSE

goscaleio - ScaleIO package that provides API bindings for Go
https://github.com/thecodeteam/goscaleio
Apache 2 license https://github.com/thecodeteam/goscaleio/blob/master/LICENSE

Container Storage Interface (CSI) Specification.
https://github.com/container-storage-interface/spec
Apache 2 license https://github.com/container-storage-interface/spec/blob/master/LICENSE

containerd console - console package for Go
https://github.com/containerd/console
Copyright The containerd Authors.
Apache 2 license https://github.com/containerd/console/blob/master/LICENSE

containerd - An open and reliable container runtime
https://github.com/containerd/containerd
Copyright The containerd Authors.
Apache 2 license https://github.com/containerd/containerd/blob/master/LICENSE

Container Network Interface - networking for Linux containers
https://github.com/containernetworking/cni
Copyright 2016 CNI authors
Apache 2 license https://github.com/containernetworking/cni/blob/master/LICENSE

etcd - Distributed reliable key-value store for the most critical data of a distributed system
https://github.com/coreos/etcd
Copyright 2014 CoreOS, Inc
Apache 2 license https://github.com/coreos/etcd/blob/master/LICENSE

go-semver - semver library in Go
https://github.com/coreos/go-semver
Copyright 2018 CoreOS, Inc
Apache 2 license https://github.com/coreos/go-semver/blob/master/LICENSE

go-systemd - Go bindings to systemd socket activation, journal, D-Bus, and unit files
https://github.com/coreos/go-systemd
Copyright 2018 CoreOS, Inc
Apache 2 license https://github.com/coreos/go-systemd/blob/master/LICENSE

coreos pkg - a collection of go utility packages
https://github.com/coreos/pkg
Copyright 2014 CoreOS, Inc
Apache 2 license https://github.com/coreos/pkg/blob/master/LICENSE

rkt - is a pod-native container engine for Linux.
https://github.com/rkt/rkt
Copyright 2016 The rkt Authors
Apache 2 license https://github.com/rkt/rkt/blob/master/LICENSE

cyphar filepath-securejoin - Proposed filepath.SecureJoin implementation
https://github.com/cyphar/filepath-securejoin
Copyright (C) 2014-2015 Docker Inc & Go Authors. All rights reserved.
Copyright (C) 2017 SUSE LLC. All rights reserved.
3 clause BSD license https://github.com/cyphar/filepath-securejoin/blob/master/LICENSE

DHCP4 library written in Go.
https://github.com/d2g/dhcp4
Copyright (c) 2013 Skagerrak Software Limited. All rights reserved.
3 clause BSD license https://github.com/d2g/dhcp4/blob/master/LICENSE

dhcp4client - DHCP Client
https://github.com/d2g/dhcp4client
Mozilla Public License, version 2.0

go-spew - Implements a deep pretty printer for Go data structures to aid in debugging
https://github.com/davecgh/go-spew
Copyright (c) 2012-2016 Dave Collins <dave@davec.name>
ISC License

safefile - Go package safefile implements safe "atomic" saving of files.
https://github.com/dchest/safefile
Copyright (c) 2013 Dmitry Chestnykh <dmitry@codingrobots.com>
2 clause BSD license https://github.com/dchest/safefile/blob/master/LICENSE

jwdt-go - Golang implementation of JSON Web Tokens (JWT)
https://github.com/dgrijalva/jwt-go
Copyright (c) 2012 Dave Grijalva
MIT license https://github.com/dgrijalva/jwt-go/blob/master/LICENSE

The Docker toolset to pack, ship, store, and deliver content
https://github.com/docker/distribution
Apache 2 license https://github.com/docker/distribution/blob/master/LICENSE

Moby Project - a collaborative project for the container ecosystem to assemble container-based systems
https://github.com/docker/docker
Copyright 2012-2017 Docker, Inc.
Apache 2 license https://github.com/moby/moby/blob/master/NOTICE

go-connections - Utility package to work with network connections
https://github.com/docker/go-connections
Apache 2 license https://github.com/docker/go-connections/blob/master/LICENSE

go-units - Parse and print size and time units in human-readable format
https://github.com/docker/go-units
Apache 2 license https://github.com/docker/go-units/blob/master/LICENSE

Docker networking
https://github.com/docker/libnetwork
Apache 2 license https://github.com/docker/libnetwork/blob/master/LICENSE

libtrust - Primitives for identity and authorization
https://github.com/docker/libtrust
Copyright 2014 Docker, Inc.
Apache 2 license https://github.com/docker/libtrust/blob/master/LICENSE

spdystream
https://github.com/docker/spdystream
Copyright 2014-2015 Docker, Inc.
Apache 2 license https://github.com/docker/spdystream/blob/master/LICENSE

go-bindata-assetfs - Serves embedded files from 'jteeuwen/go-bindata' with 'net/http'
https://github.com/elazarl/go-bindata-assetfs
Copyright (c) 2014, Elazar Leibovich
2 clause BSD license https://github.com/elazarl/go-bindata-assetfs/blob/master/LICENSE

go-restful-swagger12 - Swagger 1.2 extension to the go-restful package
https://github.com/emicklei/go-restful-swagger12
Copyright (c) 2017 Ernest Micklei
MIT license https://github.com/emicklei/go-restful-swagger12/blob/master/LICENSE

go-restful - package for building REST-style Web Services using Google Go
https://github.com/emicklei/go-restful
Copyright (c) 2012,2013 Ernest Micklei
MIT license https://github.com/emicklei/go-restful/blob/master/LICENSE

go-kmsg-parser - A simpler parser for the /dev/kmsg format
https://github.com/euank/go-kmsg-parser
Copyright 2016 Euan Kemp
Apache 2 license https://github.com/euank/go-kmsg-parser/blob/master/LICENSE

json-patch - A Go library to apply RFC6902 patches and create and apply RFC7386 patches
https://github.com/evanphx/json-patch
Copyright (c) 2014, Evan Phoenix
3 clause BSD license

jsonpath - Extends the Go runtime's json.Decoder enabling navigation of a stream of json tokens.
https://github.com/exponent-io/jsonpath
Copyright (c) 2015 Exponent Labs LLC
MIT license https://github.com/exponent-io/jsonpath/blob/master/LICENSE

camelcase - Split a camelcase word into a slice of words in Go
https://github.com/fatih/camelcase
Copyright (c) 2015 Fatih Arslan
MIT license https://github.com/fatih/camelcase/blob/master/LICENSE.md

fsnotify - Cross-platform file system notifications for Go.
https://github.com/fsnotify/fsnotify
Copyright (c) 2012 The Go Authors. All rights reserved.
Copyright (c) 2012 fsnotify Authors. All rights reserved.
3 clause BSD license https://github.com/fsnotify/fsnotify/blob/master/LICENSE

gardener machine-controller-manager - Declarative way of managing machines for Kubernetes cluster
https://github.com/gardener/machine-controller-manager
Copyright (c) 2017-2018 SAP SE or an SAP affiliate company. All rights reserved.
Apache 2 license https://github.com/gardener/machine-controller-manager/blob/master/LICENSE.md

yaml - A better way to marshal and unmarshal YAML in Golang
https://github.com/ghodss/yaml
Copyright (c) 2014 Sam Ghods
Copyright (c) 2012 The Go Authors. All rights reserved.
MIT License and 3 clause BSD license https://github.com/ghodss/yaml/blob/master/LICENSE

ini - Package ini provides INI file read and write functionality in Go.
https://github.com/go-ini/ini
Apache 2 license

jsonpointer - fork of gojsonpointer with support for structs
https://github.com/go-openapi/jsonpointer
Copyright 2013 sigu-399 ( https://github.com/sigu-399 )
Apache 2 license https://github.com/go-openapi/jsonpointer/blob/master/LICENSE

jsonreference - fork of gojsonreference with support for structs
Copyright 2013 sigu-399 ( https://github.com/sigu-399 )
Apache 2 license https://github.com/go-openapi/jsonreference/blob/master/LICENSE

go-openapi spec - openapi specification object model
https://github.com/go-openapi/spec
Copyright 2015 go-swagger maintainers
Apache 2 license https://github.com/go-openapi/spec/blob/master/LICENSE

go-openapi swag - goodie bag in use in the go-openapi projects
https://github.com/go-openapi/swag
Copyright 2015 go-swagger maintainers
Apache 2 license https://github.com/go-openapi/swag/blob/master/LICENSE

godbus dbus - Native Go bindings for D-Bus
Copyright (c) 2013, Georg Reinke (<guelfey at gmail dot com>), Google
2 clause BSD license https://github.com/godbus/dbus/blob/master/LICENSE

protobuf - Protocol Buffers for Go with Gadgets
https://github.com/gogo/protobuf
Copyright (c) 2013, The GoGo Authors. All rights reserved.
3 clause BSD license https://github.com/gogo/protobuf/blob/master/LICENSE

glog - Leveled execution logs for Go
https://github.com/golang/glog
Copyright 2013 Google Inc. All Rights Reserved.
Apache 2 license https://github.com/golang/glog/blob/master/LICENSE

groupcache - groupcache is a caching and cache-filling library, intended as a replacement for memcached in many cases.
https://github.com/golang/groupcache
Copyright 2012 Google Inc.
Apache 2 license https://github.com/golang/groupcache/blob/master/LICENSE

golang mock - GoMock is a mocking framework for the Go programming language.
https://github.com/golang/mock
Copyright 2012 Google Inc.
Apache 2 license

golang protobuf - Go support for Google's protocol buffers
https://github.com/golang/protobuf
Copyright 2010 The Go Authors.  All rights reserved.
3 clause BSD license https://github.com/golang/protobuf/blob/master/LICENSE

google btree
https://github.com/google/btree
Copyright 2014 Google Inc.
Apache 2 license https://github.com/google/btree/blob/master/LICENSE

google cadvisor - Analyzes resource usage and performance characteristics of running containers.
https://github.com/google/cadvisor
Copyright 2014 The cAdvisor Authors
Apache 2 license https://github.com/google/cadvisor/blob/master/LICENSE

gofuzz - Fuzz testing for go.
https://github.com/google/gofuzz
Copyright 2014 Google Inc. All rights reserved.
Apache 2 license https://github.com/google/gofuzz/blob/master/LICENSE

gnostic - A compiler for API described by the OpenAPI Specification with plugins for code generation and other API support tasks.
https://github.com/googleapis/gnostic
Copyright 2017 Google Inc. All Rights Reserved.
Apache 2 license https://github.com/googleapis/gnostic/blob/master/LICENSE

Gophercloud: an OpenStack SDK for Go
https://github.com/gophercloud/gophercloud/
Copyright 2012-2013 Rackspace, Inc.
Apache 2 license https://github.com/gophercloud/gophercloud/blob/master/LICENSE

websocket - A WebSocket implementation for Go.
https://github.com/gorilla/websocket
Copyright (c) 2013 The Gorilla WebSocket Authors. All rights reserved.
BSD 2 clause license https://github.com/gorilla/websocket/blob/master/LICENSE

httpcache - A Transport for http.Client that will cache responses according to the HTTP RFC
https://github.com/gregjones/httpcache
Copyright © 2012 Greg Jones (greg.jones@gmail.com)
MIT license https://github.com/gregjones/httpcache/blob/master/LICENSE.txt

Golang LRU cache
https://github.com/hashicorp/golang-lru
Mozilla Public License, version 2.0 https://github.com/hashicorp/golang-lru/blob/master/LICENSE

gopass - getpasswd for Go
https://github.com/howeyc/gopass/blob/master/LICENSE.txt
Copyright (c) 2012 Chris Howey
ISC license https://github.com/howeyc/gopass/blob/master/LICENSE.txt

Mergo: merging Go structs and maps since 2013.
https://github.com/imdario/mergo
Copyright (c) 2013 Dario Castañé. All rights reserved.
Copyright (c) 2012 The Go Authors. All rights reserved.
3 clause BSD license https://github.com/imdario/mergo/blob/master/LICENSE

mousetrap - Detect starting from Windows explorer
https://github.com/inconshreveable/mousetrap/blob/master/LICENSE
Copyright 2014 Alan Shreve
Apache 2 license https://github.com/inconshreveable/mousetrap/blob/master/LICENSE

go-jmespath - Golang implementation of JMESPath.
https://github.com/jmespath/go-jmespath
Copyright 2015 James Saryerwinnie
Apache 2 license https://github.com/jmespath/go-jmespath/blob/master/LICENSE

go json-iterator - A high-performance 100% compatible drop-in replacement of "encoding/json"
https://github.com/json-iterator/go
Copyright (c) 2016 json-iterator
MIT license https://github.com/json-iterator/go/blob/master/LICENSE

osext - Extensions to the standard "os" package. Executable and ExecutableFolder.
https://github.com/kardianos/osext/
Copyright (c) 2012 The Go Authors. All rights reserved.
Apache 2 license https://github.com/kardianos/osext/blob/master/LICENSE

fs - Package fs provides filesystem-related functions.
https://github.com/kr/fs
Copyright (c) 2012 The Go Authors. All rights reserved.
3 clause BSD license https://github.com/kr/fs/blob/main/LICENSE

PTY interface for Go
https://github.com/kr/pty/
Copyright (c) 2011 Keith Rarick
MIT license https://github.com/kr/pty/blob/master/License

openstorage - A multi-host clustered implementation of the open storage specification
https://github.com/libopenstorage/openstorage
Copyright 2015 Openstorage.org
Apache 2 license https://github.com/libopenstorage/openstorage/blob/master/LICENSE

godbc - Design by contract for Go
https://github.com/lpabon/godbc
Copyright (c) 2014 The godbc Authors
Apache 2 license https://github.com/lpabon/godbc/blob/master/LICENSE

easyjson - Fast JSON serializer for golang
https://github.com/mailru/easyjson
Copyright (c) 2016 Mail.Ru Group
MIT license https://github.com/mailru/easyjson/blob/master/LICENSE

guid - A Go implementation of Guids as seen in Microsoft's .NET Framework
https://github.com/marstr/guid
Copyright (c) 2016 Martin Strobel
MIT license https://github.com/marstr/guid/blob/master/LICENSE.txt

golang_protobuf_extensions - Support for streaming Protocol Buffer messages for the Go language (golang).
Copyright 2016 Matt T. Proud
Apache 2 license https://github.com/matttproud/golang_protobuf_extensions/blob/master/LICENSE

dns - DNS library in Go
https://github.com/miekg/dns
Copyright (c) 2009 The Go Authors. All rights reserved.
3 clause BSD license https://github.com/miekg/dns/blob/master/LICENSE

onvml - NVIDIA Management Library (NVML) bindings for Go
https://github.com/mindprince/gonvml
Copyright 2017 Google Inc.
Apache 2 license https://github.com/mindprince/gonvml/blob/master/LICENSE

go-zfs - Go wrappers for ZFS commands
https://github.com/mistifyio/go-zfs
Apache 2 license https://github.com/mistifyio/go-zfs/blob/master/LICENSE

go-wordwrap - A Go (golang) library for wrapping words in a string.
https://github.com/mitchellh/go-wordwrap
Copyright (c) 2014 Mitchell Hashimoto
MIT license https://github.com/mitchellh/go-wordwrap/blob/master/LICENSE.md

mapstructure - Go library for decoding generic map values into native Go structures.
https://github.com/mitchellh/mapstructure
Copyright (c) 2013 Mitchell Hashimoto
MIT license https://github.com/mitchellh/mapstructure/blob/master/LICENSE

deepcopy - Deep copy things
https://github.com/mohae/deepcopy
Copyright (c) 2014 Joel
MIT license https://github.com/mohae/deepcopy/blob/master/LICENSE

fileutils - collection of utilities for file manipulation in golang
https://github.com/mrunalp/fileutils/
Apache 2 license https://github.com/mrunalp/fileutils/blob/master/LICENSE

go-digest - Common digest package used across the container ecosystem
https://github.com/opencontainers/go-digest
Copyright 2016 Docker, Inc.
Apache 2 license https://github.com/opencontainers/go-digest/blob/master/LICENSE

image-spec - OCI Image Format
https://github.com/opencontainers/image-spec
Copyright 2016 The Linux Foundation.
Apache 2 license https://github.com/opencontainers/image-spec/blob/master/LICENSE

runc - CLI tool for spawning and running containers according to the OCI specification
https://github.com/opencontainers/runc
Copyright 2014 Docker, Inc.
Apache 2 license https://github.com/opencontainers/runc/blob/master/LICENSE

runtime-spec - OCI Runtime Specification
https://github.com/opencontainers/runtime-spec
Copyright 2015 The Linux Foundation.
Apache 2 license https://github.com/opencontainers/runtime-spec/blob/master/LICENSE

selinux - common selinux implementation
https://github.com/opencontainers/selinux
Apache 2 license https://github.com/opencontainers/selinux/blob/master/LICENSE

uuid - Automatically exported from code.google.com/p/go-uuid
https://github.com/pborman/uuid
Copyright (c) 2009,2014 Google Inc. All rights reserved.
3 clause BSD license https://github.com/pborman/uuid/blob/master/LICENSE

diskv - A disk-backed key-value store.
https://github.com/peterbourgon/diskv
Copyright (c) 2011-2012 Peter Bourgon
MIT license https://github.com/peterbourgon/diskv/blob/master/LICENSE

errors - Simple error handling primitives
https://github.com/pkg/errors
Copyright (c) 2015, Dave Cheney <dave@cheney.net>
BSD 2 clause license https://github.com/pkg/errors/blob/master/LICENSE

SFTP support for the go.crypto/ssh package
https://github.com/pkg/sftp
Copyright (c) 2013, Dave Cheney
BSD 2 clause license https://github.com/pkg/sftp/blob/master/LICENSE

go-difflib - Partial port of Python difflib package to Go
https://github.com/pmezard/go-difflib
Copyright (c) 2013, Patrick Mezard
3 clause BSD license https://github.com/pmezard/go-difflib/blob/master/LICENSE

prometheus client_golang - Prometheus instrumentation library for Go applications
https://github.com/prometheus/client_golang
Copyright 2015 The Prometheus Authors
Apache 2 license https://github.com/prometheus/client_golang/blob/master/LICENSE

prometheus client_model - Data model artifacts for Prometheus.
https://github.com/prometheus/client_model
Copyright 2013 Prometheus Team
Apache 2 license https://github.com/prometheus/client_model/blob/master/LICENSE

prometheus common - Go libraries shared across Prometheus components and libraries.
https://github.com/prometheus/common
Copyright 2015 The Prometheus Authors
Apache 2 license https://github.com/prometheus/common/blob/master/LICENSE

procfs - provides functions to retrieve system, kernel and process metrics from the pseudo-filesystem proc
https://github.com/prometheus/procfs
Copyright 2014-2015 The Prometheus Authors
Apache 2 license https://github.com/prometheus/procfs/blob/master/LICENSE

Quobyte API Clients
https://github.com/quobyte/api
Copyright (c) 2016, Quobyte Inc.
3 clause BSD license https://github.com/quobyte/api/blob/master/LICENSE

go-rancher - Go language bindings for Rancher API
https://github.com/rancher/go-rancher
Apache 2 license https://github.com/rancher/go-rancher/blob/master/LICENSE

dedent - Remove any common leading whitespace from multiline strings
https://github.com/renstrom/dedent
Copyright (c) 2015 Peter Renström
MIT license https://github.com/renstrom/dedent/blob/master/LICENSE

go-vhd - Go package and CLI to work with VHD images
https://github.com/rubiojr/go-vhd
Copyright (c) 2015 Sergio Rubio
MIT license https://github.com/rubiojr/go-vhd/blob/master/LICENSE

Blackfriday: a markdown processor for Go
https://github.com/russross/blackfriday/
Copyright © 2011 Russ Ross
2 clause BSD license https://github.com/russross/blackfriday/blob/master/LICENSE.txt

uuid - UUID package for Go
https://github.com/satori/go.uuid
Copyright (C) 2013-2018 by Maxim Bublis <b@codemonkey.ru>
MIT license https://github.com/satori/go.uuid/blob/master/LICENSE

The libseccomp golang bindings repository
https://github.com/seccomp/libseccomp-golang
Copyright (c) 2015 Matthew Heon <mheon@redhat.com>
Copyright (c) 2015 Paul Moore <pmoore@redhat.com>
MIT license https://github.com/seccomp/libseccomp-golang/blob/master/LICENSE

sanitized_anchor_name - Package sanitized_anchor_name provides a func to create sanitized anchor names.
https://github.com/shurcooL/sanitized_anchor_name
Copyright (c) 2015 Dmitri Shuralyov
MIT license https://github.com/shurcooL/sanitized_anchor_name/blob/master/LICENSE

logrus - Structured, pluggable logging for Go.
https://github.com/sirupsen/logrus
Copyright (c) 2014 Simon Eskildsen
MIT license https://github.com/sirupsen/logrus/blob/master/LICENSE

afero - A FileSystem Abstraction System for Go
https://github.com/spf13/afero
Copyright © 2016 Steve Francia <spf@spf13.com>.
Apache 2 license https://github.com/spf13/afero/blob/master/LICENSE.txt

cobra - A Commander for modern Go CLI interactions
https://github.com/spf13/cobra
Copyright © 2013 Steve Francia <spf@spf13.com>.
Apache 2 license https://github.com/spf13/cobra/blob/master/LICENSE.txt

pflag - Drop-in replacement for Go's flag package, implementing POSIX/GNU-style --flags.
https://github.com/spf13/pflag
Copyright (c) 2012 Alex Ogier. All rights reserved.
Copyright (c) 2012 The Go Authors. All rights reserved.
BSD 3 clause license https://github.com/spf13/pflag/blob/master/LICENSE

objx - Go package for dealing with maps, slices, JSON and other data.
https://github.com/stretchr/objx
Copyright (c) 2014 Stretchr, Inc.
Copyright (c) 2017-2018 objx contributors
MIT license https://github.com/stretchr/objx/blob/master/LICENSE

testify - A toolkit with common assertions and mocks that plays nicely with the standard library
https://github.com/stretchr/testify
Copyright (c) 2012 - 2013 Mat Ryer and Tyler Bunnell
MIT license https://github.com/stretchr/testify/blob/master/LICENSE

gocapability - Utilities for manipulating POSIX capabilities in Go.
https://github.com/syndtr/gocapability
Copyright 2013 Suryandaru Triandana <syndtr@gmail.com>
All rights reserved.
3 clause BSD license https://github.com/syndtr/gocapability/blob/master/LICENSE

ugorji go - idiomatic codec and rpc lib for msgpack, cbor, json, etc. msgpack.org[Go]
https://github.com/ugorji/go
Copyright (c) 2012-2015 Ugorji Nwoke.
All rights reserved.
MIT license https://github.com/ugorji/go/blob/master/LICENSE

netlink - Simple netlink library for go.
https://github.com/vishvananda/netlink
Copyright 2014 Vishvananda Ishaya.
Copyright 2014 Docker, Inc.
Apache 2 license https://github.com/vishvananda/netlink/blob/master/LICENSE

netns - Simple network namespace handling for go.
https://github.com/vishvananda/netns
Copyright 2014 Vishvananda Ishaya.
Copyright 2014 Docker, Inc.
Apache 2 license https://github.com/vishvananda/netns/blob/master/LICENSE

govmomi - Go library for the VMware vSphere API
https://github.com/vmware/govmomi
Copyright (c) 2015-2017 VMware, Inc. All Rights Reserved.
Apache 2 license https://github.com/vmware/govmomi/blob/master/LICENSE.txt

photon-controller-go-sdk
https://github.com/vmware/photon-controller-go-sdk
Copyright (c) 2016 VMware, Inc. All Rights Reserved.
Apache 2 license https://github.com/vmware/photon-controller-go-sdk/blob/master/LICENSE

go-cloudstack - A CloudStack API client enabling Go programs to interact with CloudStack in a simple and uniform way
https://github.com/xanzy/go-cloudstack
Copyright 2018, Sander van Harmelen
Apache 2 license https://github.com/xanzy/go-cloudstack/blob/master/LICENSE

go4.org
https://github.com/go4org/go4/
Copyright 2015 The Go4 Authors
Apache 2 license https://github.com/go4org/go4/blob/master/LICENSE

crypto - [mirror] Go supplementary cryptography libraries
https://github.com/golang/crypto/
Copyright (c) 2009 The Go Authors. All rights reserved.
3 clause BSD license https://github.com/golang/crypto/blob/master/LICENSE

exp - [mirror] Experimental and deprecated packages
https://github.com/golang/exp/
Copyright (c) 2009 The Go Authors. All rights reserved.
3 clause BSD license https://github.com/golang/exp/blob/master/LICENSE

net - [mirror] Go supplementary network libraries
https://github.com/golang/net/
Copyright (c) 2009 The Go Authors. All rights reserved.
3 clause BSD license https://github.com/golang/net/blob/master/LICENSE

Go OAuth2
https://github.com/golang/oauth2/
Copyright (c) 2009 The Go Authors. All rights reserved.
3 clause BSD license https://github.com/golang/oauth2/blob/master/LICENSE

sys - [mirror] Go packages for low-level interaction with the operating system
https://github.com/golang/sys/
Copyright (c) 2009 The Go Authors. All rights reserved.
3 clause BSD license https://github.com/golang/sys/blob/master/LICENSE

text - [mirror] Go text processing support
https://github.com/golang/text/
Copyright (c) 2009 The Go Authors. All rights reserved.
3 clause BSD license https://github.com/golang/text/blob/master/LICENSE

time - [mirror] Go supplementary time packages
https://github.com/golang/time/
Copyright (c) 2009 The Go Authors. All rights reserved.
3 clause BSD license https://github.com/golang/time/blob/master/LICENSE

google-api-go-client - Auto-generated Google APIs for Go
https://github.com/google/google-api-go-client
Copyright (c) 2011 Google Inc. All rights reserved.
3 clause BSD license https://github.com/google/google-api-go-client/blob/master/LICENSE

go-genproto
https://github.com/google/go-genproto
Copyright 2016 Google Inc.
Apache 2 license https://github.com/google/go-genproto/blob/master/LICENSE

grpc-go - The Go language implementation of gRPC. HTTP/2 based RPC
https://github.com/grpc/grpc-go
Copyright 2017 gRPC authors.
Apache 2 license https://github.com/grpc/grpc-go/blob/master/LICENSE

gcfg - read INI-style configuration files into Go structs; supports user-defined types and subsections
https://github.com/go-gcfg/gcfg/
Copyright (c) 2012 Péter Surányi. Portions Copyright (c) 2009 The Go
Authors. All rights reserved.
3 clause BSD license https://github.com/go-gcfg/gcfg/blob/v1/LICENSE

inf - Package inf (type inf.Dec) implements "infinite-precision" decimal arithmetic.
https://github.com/go-inf/inf
Copyright (c) 2012 Péter Surányi. Portions Copyright (c) 2009 The Go
Authors. All rights reserved.
3 clause BSD license https://github.com/go-inf/inf/blob/master/LICENSE

go-jose - An implementation of JOSE standards (JWE, JWS, JWT) in Go
https://github.com/square/go-jose
Copyright 2014 Square Inc.
Apache 2 license https://github.com/square/go-jose/blob/master/LICENSE

warnings - Package warnings implements error handling with non-fatal errors (warnings).
https://github.com/go-warnings/warnings
Copyright (c) 2016 Péter Surányi.
2 clause BSD license https://github.com/go-warnings/warnings/blob/master/LICENSE

yaml - YAML support for the Go language.
https://github.com/go-yaml/yaml
Copyright 2011-2016 Canonical Ltd.
Copyright (c) 2006 Kirill Simonov
Apache 2 license https://github.com/go-yaml/yaml/blob/v2/LICENSE
some files are MIT license https://github.com/go-yaml/yaml/blob/v2/LICENSE.libyaml

kubernetes api - The canonical location of the Kubernetes API definition.
https://github.com/kubernetes/api
Copyright 2018 The Kubernetes Authors.
Apache 2 license https://github.com/kubernetes/api/blob/master/LICENSE

kubernetes API server for API extensions like CustomResourceDefinitions
https://github.com/kubernetes/apiextensions-apiserver
Copyright 2017 The Kubernetes Authors.
Apache 2 license https://github.com/kubernetes/apiextensions-apiserver/blob/master/LICENSE

kubernetes apimachinery
https://github.com/kubernetes/apimachinery
Copyright 2018 The Kubernetes Authors.
Apache 2 license https://github.com/kubernetes/apimachinery/blob/master/LICENSE

kubernetes apiserver - Library for writing a Kubernetes-style API server.
https://github.com/kubernetes/apiserver
Copyright 2018 The Kubernetes Authors.
Apache 2 license https://github.com/kubernetes/apiserver/blob/master/LICENSE

Go client for Kubernetes.
https://github.com/kubernetes/client-go
Copyright 2018 The Kubernetes Authors.
Apache 2 license https://github.com/kubernetes/client-go/blob/master/LICENSE

Kubernetes OpenAPI spec generation & serving
https://github.com/kubernetes/kube-openapi
Copyright 2018 The Kubernetes Authors.
Apache 2 license https://github.com/kubernetes/kube-openapi/blob/master/LICENSE

kubernetes - Production-Grade Container Scheduling and Management
https://github.com/kubernetes/kubernetes
Copyright 2018 The Kubernetes Authors.
Apache 2 license https://github.com/kubernetes/kubernetes/blob/master/LICENSE

utils - Non-Kubernetes-specific utility libraries which are consumed by multiple projects.
https://github.com/kubernetes/utils
Copyright 2018 The Kubernetes Authors.
Apache 2 license https://github.com/kubernetes/utils/blob/master/LICENSE

util - Go utility packages
https://github.com/fvbommel/util
Copyright (c) 2015 Frits van Bommel
MIT license https://github.com/fvbommel/util/blob/master/LICENSE

machine-controller-manager
https://github.com/gardener/machine-controller-manager
Copyright (c) 2017 SAP SE or an SAP affiliate company.
Apache 2 license https://github.com/gardener/machine-controller-manager/blob/master/LICENSE.md

----------------------------------------------------
The MIT License
SPDX short identifier: MIT

Copyright <YEAR> <COPYRIGHT HOLDER>

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.

----------------------------------------------------
The 3-Clause BSD License
SPDX short identifier: BSD-3-Clause

Copyright <YEAR> <COPYRIGHT HOLDER>

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 2-Clause BSD License
SPDX short identifier: BSD-2-Clause

Copyright <YEAR> <COPYRIGHT HOLDER>

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.

----------------------------------------------------
Mozilla Public License 2.0 (MPL-2.0)

1. Definitions 1.1. “Contributor”means each individual or legal entity that
creates, contributes to the creation of, or owns Covered Software.

1.2. “Contributor Version”means the combination of the Contributions of others
(if any) used by a Contributor and that particular Contributor’s Contribution.

1.3. “Contribution”means Covered Software of a particular Contributor.

1.4. “Covered Software”means Source Code Form to which the initial Contributor
has attached the notice in Exhibit A, the Executable Form of such Source Code
Form, and Modifications of such Source Code Form, in each case including
portions thereof.

1.5. “Incompatible With Secondary Licenses”means

that the initial Contributor has attached the notice described in Exhibit B to
the Covered Software; or

that the Covered Software was made available under the terms of version 1.1 or
earlier of the License, but not also under the terms of a Secondary License.

1.6. “Executable Form”means any form of the work other than Source Code Form.

1.7. “Larger Work”means a work that combines Covered Software with other
material, in a separate file or files, that is not Covered Software.

1.8. “License”means this document.

1.9. “Licensable”means having the right to grant, to the maximum extent
possible, whether at the time of the initial grant or subsequently, any and all
of the rights conveyed by this License.

1.10. “Modifications”means any of the following:

any file in Source Code Form that results from an addition to, deletion from, or
modification of the contents of Covered Software; or

any new file in Source Code Form that contains any Covered Software.

1.11. “Patent Claims” of a Contributor means any patent claim(s), including
without limitation, method, process, and apparatus claims, in any patent
Licensable by such Contributor that would be infringed, but for the grant of the
License, by the making, using, selling, offering for sale, having made, import,
or transfer of either its Contributions or its Contributor Version.

1.12. “Secondary License”means either the GNU General Public License, Version
2.0, the GNU Lesser General Public License, Version 2.1, the GNU Affero General
Public License, Version 3.0, or any later versions of those licenses.

1.13. “Source Code Form”means the form of the work preferred for making
modifications.

1.14. “You” (or “Your”) means an individual or a legal entity exercising rights
under this License. For legal entities, “You” includes any entity that controls,
is controlled by, or is under common control with You. For purposes of this
definition, “control” means (a) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or otherwise, or (b)
ownership of more than fifty percent (50%) of the outstanding shares or
beneficial ownership of such entity.

2. License Grants and Conditions 2.1. Grants Each Contributor hereby grants You
a world-wide, royalty-free, non-exclusive license:

under intellectual property rights (other than patent or trademark) Licensable
by such Contributor to use, reproduce, make available, modify, display, perform,
distribute, and otherwise exploit its Contributions, either on an unmodified
basis, with Modifications, or as part of a Larger Work; and

under Patent Claims of such Contributor to make, use, sell, offer for sale, have
made, import, and otherwise transfer either its Contributions or its Contributor
Version.

2.2. Effective Date The licenses granted in Section 2.1 with respect to any
Contribution become effective for each Contribution on the date the Contributor
first distributes such Contribution.

2.3. Limitations on Grant Scope The licenses granted in this Section 2 are the
only rights granted under this License. No additional rights or licenses will be
implied from the distribution or licensing of Covered Software under this
License. Notwithstanding Section 2.1(b) above, no patent license is granted by a
Contributor:

for any code that a Contributor has removed from Covered Software; or

for infringements caused by: (i) Your and any other third party’s modifications
of Covered Software, or (ii) the combination of its Contributions with other
software (except as part of its Contributor Version); or

under Patent Claims infringed by Covered Software in the absence of its
Contributions.

This License does not grant any rights in the trademarks, service marks, or
logos of any Contributor (except as may be necessary to comply with the notice
requirements in Section 3.4).

2.4. Subsequent Licenses No Contributor makes additional grants as a result of
Your choice to distribute the Covered Software under a subsequent version of
this License (see Section 10.2) or under the terms of a Secondary License (if
permitted under the terms of Section 3.3).

2.5. Representation Each Contributor represents that the Contributor believes
its Contributions are its original creation(s) or it has sufficient rights to
grant the rights to its Contributions conveyed by this License.

2.6. Fair Use This License is not intended to limit any rights You have under
applicable copyright doctrines of fair use, fair dealing, or other equivalents.

2.7. Conditions Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses
granted in Section 2.1.

3. Responsibilities 3.1. Distribution of Source Form All distribution of Covered
Software in Source Code Form, including any Modifications that You create or to
which You contribute, must be under the terms of this License. You must inform
recipients that the Source Code Form of the Covered Software is governed by the
terms of this License, and how they can obtain a copy of this License. You may
not attempt to alter or restrict the recipients’ rights in the Source Code Form.

3.2. Distribution of Executable Form If You distribute Covered Software in
Executable Form then:

such Covered Software must also be made available in Source Code Form, as
described in Section 3.1, and You must inform recipients of the Executable Form
how they can obtain a copy of such Source Code Form by reasonable means in a
timely manner, at a charge no more than the cost of distribution to the
recipient; and

You may distribute such Executable Form under the terms of this License, or
sublicense it under different terms, provided that the license for the
Executable Form does not attempt to limit or alter the recipients’ rights in the
Source Code Form under this License.

3.3. Distribution of a Larger Work You may create and distribute a Larger Work
under terms of Your choice, provided that You also comply with the requirements
of this License for the Covered Software. If the Larger Work is a combination of
Covered Software with a work governed by one or more Secondary Licenses, and the
Covered Software is not Incompatible With Secondary Licenses, this License
permits You to additionally distribute such Covered Software under the terms of
such Secondary License(s), so that the recipient of the Larger Work may, at
their option, further distribute the Covered Software under the terms of either
this License or such Secondary License(s).

3.4. Notices You may not remove or alter the substance of any license notices
(including copyright notices, patent notices, disclaimers of warranty, or
limitations of liability) contained within the Source Code Form of the Covered
Software, except that You may alter any license notices to the extent required
to remedy known factual inaccuracies.

3.5. Application of Additional Terms You may choose to offer, and to charge a
fee for, warranty, support, indemnity or liability obligations to one or more
recipients of Covered Software. However, You may do so only on Your own behalf,
and not on behalf of any Contributor. You must make it absolutely clear that any
such warranty, support, indemnity, or liability obligation is offered by You
alone, and You hereby agree to indemnify every Contributor for any liability
incurred by such Contributor as a result of warranty, support, indemnity or
liability terms You offer. You may include additional disclaimers of warranty
and limitations of liability specific to any jurisdiction.

4. Inability to Comply Due to Statute or Regulation If it is impossible for You
to comply with any of the terms of this License with respect to some or all of
the Covered Software due to statute, judicial order, or regulation then You
must: (a) comply with the terms of this License to the maximum extent possible;
and (b) describe the limitations and the code they affect. Such description must
be placed in a text file included with all distributions of the Covered Software
under this License. Except to the extent prohibited by statute or regulation,
such description must be sufficiently detailed for a recipient of ordinary skill
to be able to understand it.

5. Termination 5.1. The rights granted under this License will terminate
automatically if You fail to comply with any of its terms. However, if You
become compliant, then the rights granted under this License from a particular
Contributor are reinstated (a) provisionally, unless and until such Contributor
explicitly and finally terminates Your grants, and (b) on an ongoing basis, if
such Contributor fails to notify You of the non-compliance by some reasonable
means prior to 60 days after You have come back into compliance. Moreover, Your
grants from a particular Contributor are reinstated on an ongoing basis if such
Contributor notifies You of the non-compliance by some reasonable means, this is
the first time You have received notice of non-compliance with this License from
such Contributor, and You become compliant prior to 30 days after Your receipt
of the notice.

5.2. If You initiate litigation against any entity by asserting a patent
infringement claim (excluding declaratory judgment actions, counter-claims, and
cross-claims) alleging that a Contributor Version directly or indirectly
infringes any patent, then the rights granted to You by any and all Contributors
for the Covered Software under Section 2.1 of this License shall terminate.

5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user
license agreements (excluding distributors and resellers) which have been
validly granted by You or Your distributors under this License prior to
termination shall survive termination.

6. Disclaimer of Warranty Covered Software is provided under this License on an
“as is” basis, without warranty of any kind, either expressed, implied, or
statutory, including, without limitation, warranties that the Covered Software
is free of defects, merchantable, fit for a particular purpose or
non-infringing. The entire risk as to the quality and performance of the Covered
Software is with You. Should any Covered Software prove defective in any
respect, You (not any Contributor) assume the cost of any necessary servicing,
repair, or correction. This disclaimer of warranty constitutes an essential part
of this License. No use of any Covered Software is authorized under this License
except under this disclaimer.

7. Limitation of Liability Under no circumstances and under no legal theory,
whether tort (including negligence), contract, or otherwise, shall any
Contributor, or anyone who distributes Covered Software as permitted above, be
liable to You for any direct, indirect, special, incidental, or consequential
damages of any character including, without limitation, damages for lost
profits, loss of goodwill, work stoppage, computer failure or malfunction, or
any and all other commercial damages or losses, even if such party shall have
been informed of the possibility of such damages. This limitation of liability
shall not apply to liability for death or personal injury resulting from such
party’s negligence to the extent applicable law prohibits such limitation. Some
jurisdictions do not allow the exclusion or limitation of incidental or
consequential damages, so this exclusion and limitation may not apply to You.

8. Litigation Any litigation relating to this License may be brought only in the
courts of a jurisdiction where the defendant maintains its principal place of
business and such litigation shall be governed by laws of that jurisdiction,
without reference to its conflict-of-law provisions. Nothing in this Section
shall prevent a party’s ability to bring cross-claims or counter-claims.

9. Miscellaneous This License represents the complete agreement concerning the
subject matter hereof. If any provision of this License is held to be
unenforceable, such provision shall be reformed only to the extent necessary to
make it enforceable. Any law or regulation which provides that the language of a
contract shall be construed against the drafter shall not be used to construe
this License against a Contributor.

10. Versions of the License 10.1. New Versions Mozilla Foundation is the license
steward. Except as provided in Section 10.3, no one other than the license
steward has the right to modify or publish new versions of this License. Each
version will be given a distinguishing version number.

10.2. Effect of New Versions You may distribute the Covered Software under the
terms of the version of the License under which You originally received the
Covered Software, or under the terms of any subsequent version published by the
license steward.

10.3. Modified Versions If you create software not governed by this License, and
you want to create a new license for such software, you may create and use a
modified version of this License if you rename the license and remove any
references to the name of the license steward (except to note that such modified
license differs from this License).

10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses
If You choose to distribute Source Code Form that is Incompatible With Secondary
Licenses under the terms of this version of the License, the notice described in
Exhibit B of this License must be attached.

Exhibit A - Source Code Form License Notice This Source Code Form is subject to
the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not
distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.

If it is not possible or desirable to put the notice in a particular file, then
You may include the notice in a location (such as a LICENSE file in a relevant
directory) where a recipient would be likely to look for such a notice.

You may add additional accurate notices of copyright ownership.

Exhibit B - “Incompatible With Secondary Licenses” Notice This Source Code Form
is “Incompatible With Secondary Licenses”, as defined by the Mozilla Public
License, v. 2.0.

----------------------------------------------------
ISC License (ISC)
Copyright <YEAR> <OWNER>

Permission to use, copy, modify, and/or distribute this software for any purpose
with or without fee is hereby granted, provided that the above copyright notice
and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
THIS SOFTWARE.
----------------------------------------------------
`
const license_battelle_lre = `//** github.com/ovirt/terraform-provider-ovirt **//
//** modified BSD-3 **//



Forked from https://github.com/EMSL-MSC/terraform-provider-ovirt
which is under the following license:

Copyright © __1__, Battelle Memorial Institute

All rights reserved.
1. Battelle Memorial Institute (hereinafter Battelle) hereby grants permission to any person or entity lawfully obtaining a copy of this software and associated documentation files (hereinafter "the Software") to redistribute and use the Software in source and binary forms, with or without modification.  Such person or entity may use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and may permit others to do so, subject to the following conditions:
 * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimers. 
 * 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. 
 * Other than as used herein, neither the name Battelle Memorial Institute or Battelle may be used in any form whatsoever without the express written consent of Battelle.  

2. 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 BATTELLE 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.
`
const license_blink_lre = `//** github.com/todbot/blink1@v0.0.0-20201106195604-e657e2245ef9 **//




blink(1) Copyright (c) by ThingM, 2012-2020

'blink(1)' is a trademark of ThingM Corporation

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

blink(1) is licensed under a
Creative Commons Attribution-ShareAlike 4.0 International License.

You should have received a copy of the license along with this
work. If not, see <http://creativecommons.org/licenses/by-sa/4.0/>.


`
const license_bsd_eay_lre = `//** github.com/tmthrgd/chacha20@v0.0.0-20180315111422-d64f83450a9a **//



/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * 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 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. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ` + "`" + `` + "`" + `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 AUTHOR 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 licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */
`
const license_cc0_1_lre = `//** github.com/18f/e-qip-prototype@v1.0.15 **//



((
As a work of the United States government, this project is in the
public domain within the United States.

Additionally, we waive copyright and related rights in the work
worldwide through the CC0 1.0 Universal public domain dedication.
))??

((
	CC0 1.0 Universal summary
||
	CC0 1.0 Universal (CC0 1.0)
	Public Domain Dedication
))

This is a human-readable summary of the Legal Code.
((
	(read the full text)](https://creativecommons.org/publicdomain/zero/1.0/legalcode).
||
	For the full text, visit:
	http://creativecommons.org/publicdomain/zero/1.0/
))

### No copyright

The person who associated a work with this deed has dedicated the work to
the public domain by waiving all
((of his or her))??
rights to the work worldwide
under copyright law, including all related and neighboring rights, to the
extent allowed by law.

You can copy, modify, distribute and perform the work, even for commercial
purposes, all without asking permission.

(( See Other Information below. ))??


### Other information

In no way are the patent or trademark rights of any person affected by CC0,
nor are the rights that other persons may have in the work or in how the
work is used, such as publicity or privacy rights.

Unless expressly stated otherwise, the person who associated a work with
this deed makes no warranties about the work, and disclaims liability for
all uses of the work, to the fullest extent permitted by applicable law.
When using or citing the work, you should not imply endorsement by the
author or the affirmer.
`
const license_cc0_2_lre = `//** github.com/daveadams/vax **//



This work is dedicated to the public domain. No rights reserved.

I, the copyright holder of this work, hereby release it into the public
domain. This applies worldwide.

I grant any entity the right to use this work for any purpose, without
any conditions, unless such conditions are required by law.

If you require a fuller legal statement, please refer to the Creative
Commons Zero license:

http://creativecommons.org/publicdomain/zero/1.0/
`
const license_cc0_3_lre = `//** github.com/andreasbriese/bbloom@v0.0.0-20190825152654-46b345b51c96 **//



Written in __1__ by __3__

To the extent possible under law, the author have dedicated all copyright
and related and neighboring rights to this software to the public domain
worldwide. This software is distributed without any warranty.
http://creativecommons.org/publicdomain/zero/1.0/

`
const license_cc0_4_lre = `//** Reference to CC-0. Source: numerous modules. **//



((
    This work is subject to the CC0 1.0 Universal (CC0 1.0) Public Domain Dedication
    license. Its contents can be found at:

    http://creativecommons.org/publicdomain/zero/1.0
    ((
    and http://creativecommons.org/publicdomain/zero/1.0/legalcode
    ))??

    ((Copyright (c) __6__ for the edited code.))??
||
    (( CC0 ; http://creativecommons.org/publicdomain/zero/1.0/ ))??

    (( Written in __1__ by __5__ ))??

    To the extent possible under law, __4__
    (( has waived || have dedicated))
    all copyright and related
    ((or || and))
    neighboring rights to __8__ .
    ((
	This work is published from
	(( United States || The Netherlands ))
	(( https://creativecommons.org/publicdomain/zero/1.0/legalcode 	))??
    ||
	This software is distributed without any warranty.

	You should have received a copy of the CC0 Public Domain Dedication along with this software.
	If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
    ))
))
`
const license_ccby3_lre = `//** github.com/swill/svgo@v0.0.0-20150715025413-bc384fa1e849 **//



The contents of this repository are Licensed under 
the Creative Commons Attribution 3.0 license as described in
http://creativecommons.org/licenses/by/3.0/us/
`
const license_ccby4_lre = `//** 
    github.com/wojnosystems/go_reopen@v1.0.0
    github.com/coderconvoy/candlestick@v0.0.0-20161129102306-3081b787cd4a
    github.com/dereklstinson/gocunets@v0.0.0-20200507203743-98db5b7a50a1
**//



((
    Attribution 4.0 International https://creativecommons.org/licenses/by/4.0/
||
    Unique Candlestick
    =================

    Use this code as you wish, 

<a rel="license" href="http://creativecommons.org/licenses/by/4.0/"><img alt="Creative Commons Licence" style="border-width:0" src="https://i.creativecommons.org/l/by/4.0/88x31.png" /></a><br /><span xmlns:dct="http://purl.org/dc/terms/" href="http://purl.org/dc/dcmitype/Text" property="dct:title" rel="dct:type">Unique Candlestick</span> by <a xmlns:cc="http://creativecommons.org/ns#" href="github.com/coderconvoy/candlestick" property="cc:attributionName" rel="cc:attributionURL">Matthew Stoodley</a> is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution 4.0 International License</a>.

||
    This work is licensed under the Creative Commons Attribution 4.0 International
    License. To view a copy of this license, visit
    http://creativecommons.org/licenses/by/4.0/ or send a letter to Creative
    Commons, PO Box 1866, Mountain View, CA 94042, USA.
))

`
const license_ccbysa4_lre = `//** github.com/pathcl/GoCourse@v0.0.0-20200717073734-ce7d49ee58a2 **//



Everything in this repository is under https://creativecommons.org/licenses/by-sa/4.0/ if not stated otherwise.
`
const license_cockroach_lre = `//** github.com/1lann/cockroach@v0.0.0-20170211033204-1db9d1afa7f1 **//



CockroachDB Community License Agreement

  Please read this CockroachDB Community License Agreement (the "Agreement")
  carefully before using CockroachDB (as defined below), which is offered by
  Cockroach Labs, Inc. or its affiliated Legal Entities ("Cockroach Labs").

  By downloading CockroachDB or using it in any manner, You agree that You have
  read and agree to be bound by the terms of this Agreement.  If You are
  accessing CockroachDB on behalf of a Legal Entity, You represent and warrant
  that You have the authority to agree to these terms on its behalf and the
  right to bind that Legal Entity to this Agreement.  Use of CockroachDB is
  expressly conditioned upon Your assent to all the terms of this Agreement, to
  the exclusion of all other terms.

  1. Definitions.  In addition to other terms defined elsewhere in this
     Agreement, the terms below have the following meanings.

    (a) "CockroachDB" shall mean the SQL database software provided by Cockroach
        Labs, including both CockroachDB
	((Community || Core))
	and CockroachDB Enterprise
        editions, as defined below.

    (b)
    (("CockroachDB Community Edition" || "CockroachDB Core"))
    shall mean the open source version of
        CockroachDB, available free of charge at

            https://github.com/cockroachdb/cockroach

    (c)
    ((Cockroach || CockroachDB))
    Enterprise Edition" shall mean the additional features made
        available by Cockroach Labs, the use of which is subject to additional
        terms set out below.

    (d) "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 Cockroach Labs
        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 Cockroach Labs 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, Cockroach Labs
        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."

    (e) "Contributor" shall mean any copyright owner or individual or Legal
        Entity authorized by the copyright owner, other than Cockroach Labs,
        from whom Cockroach Labs receives a Contribution that Cockroach Labs
        subsequently incorporates within the Work.

    (f) "Derivative Works" shall mean any work, whether in Source or Object
        form, that is based on (or derived from) the Work, such as a
        translation, abridgement, condensation, or any other recasting,
        transformation, or adaptation 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.

    (g) "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.

    (h) "License" shall mean the terms and conditions for use, reproduction, and
        distribution of a Work as defined by this Agreement.

    (i) "Licensor" shall mean Cockroach Labs or a Contributor, as applicable.

    (j) "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.

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

    (l) "Third Party Works" shall mean Works, including Contributions, and other
        technology owned by a person or Legal Entity other than Cockroach Labs,
        as indicated by a copyright notice that is included in or attached to
        such Works or technology.

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

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

  2. Licenses.

    (a) License to CockroachDB 
	((Community Edition. || Core.))  
	The License for CockroachDB
        ((Community Edition || Core))
	 is the Apache License, Version 2.0 ("Apache License").
        The Apache License includes a grant of patent license, as well as
        redistribution rights that are contingent on several requirements.
        Please see

            http://www.apache.org/licenses/LICENSE-2.0

        for full terms.  CockroachDB 
	((Community Edition || Core))
	is a no-cost, entry-level
        license and as such, contains the following disclaimers: NOTWITHSTANDING
        ANYTHING TO THE CONTRARY HEREIN, COCKROACHDB 
	((COMMUNITY EDITION || CORE))
	 IS
        PROVIDED "AS IS" AND "AS AVAILABLE", AND ALL EXPRESS OR IMPLIED
        WARRANTIES ARE EXCLUDED AND DISCLAIMED, INCLUDING WITHOUT LIMITATION THE
        IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
        NON-INFRINGEMENT, AND ANY WARRANTIES ARISING BY STATUTE OR OTHERWISE IN
        LAW OR FROM COURSE OF DEALING, COURSE OF PERFORMANCE, OR USE IN TRADE.
        For clarity, the terms of this Agreement, other than the relevant
        definitions in Section 1 and this Section 2(a) do not apply to
        CockroachDB 
	((Community Edition || Core))

    (b) License to CockroachDB Enterprise Edition.

      i   Grant of Copyright License: Subject to the terms of this Agreement,
          Licensor hereby grants to You a worldwide, non-exclusive,
          non-transferable limited license to reproduce, prepare Enterprise
          Derivative Works (as defined below) of, publicly display, publicly
          perform, sublicense, and distribute CockroachDB Enterprise Edition
          for Your business purposes, for so long as You are not in violation
          of this Section 2(b) and are current on all payments required by
          Section 4 below.

      ii  Grant of Patent License: Subject to the terms of this Agreement,
          Licensor hereby grants to You a worldwide, non-exclusive,
          non-transferable limited patent license to make, have made, use,
          offer to sell, sell, import, and otherwise transfer CockroachDB
          Enterprise Edition, where such license applies only to those patent
          claims licensable by Licensor 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.

      iii License to Third Party Works:  From time to time Cockroach Labs may
          use, or provide You access to, Third Party Works in connection
          CockroachDB Enterprise Edition.  You acknowledge and agree that in
          addition to this Agreement, Your use of Third Party Works is subject
          to all other terms and conditions set forth in the License provided
          with or contained in such Third Party Works.  Some Third Party Works
          may be licensed to You solely for use with CockroachDB Enterprise
          Edition under the terms of a third party License, or as otherwise
          notified by Cockroach Labs, and not under the terms of this
          Agreement.  You agree that the owners and third party licensors of
          Third Party Works are intended third party beneficiaries to this
          Agreement.

  3. Support.  From time to time, in its sole discretion, Cockroach Labs may
     offer professional services or support for CockroachDB, which may now or in
     the future be subject to additional fees.

  4. Fees for CockroachDB Enterprise Edition or CockroachDB Support.

    (a) Fees.  The License to CockroachDB Enterprise Edition is conditioned upon
        Your payment of the fees specified on

            https://cockroachlabs.com/pricing

        which You agree to pay to Cockroach Labs in accordance with the payment
        terms set out on that page.  Any professional services or support for
        CockroachDB may also be subject to Your payment of fees, which will be
        specified by Cockroach Labs when you sign up to receive such
        professional services or support. Cockroach Labs reserves the right to
        change the fees at any time with prior written notice; for recurring
        fees, any such adjustments will take effect as of the next pay period.

    (b) Overdue Payments and Taxes. Overdue payments are subject to a service
        charge equal to the lesser of 1.5% per month or the maximum legal
        interest rate allowed by law, and You shall pay all Cockroach Labs’
        reasonable costs of collection, including court costs and attorneys’
        fees.  Fees are stated and payable in U.S. dollars and are exclusive of
        all sales, use, value added and similar taxes, duties, withholdings and
        other governmental assessments (but excluding taxes based on Cockroach
        Labs’ income) that may be levied on the transactions contemplated by
        this Agreement in any jurisdiction, all of which are Your responsibility
        unless you have provided Cockroach Labs with a valid tax-exempt
        certificate.

    (c) Record-keeping and Audit.  If fees for CockroachDB Enterprise Edition
        are based on the number of cores or servers running on CockroachDB
        Enterprise Edition or another use-based unit of measurement, You must
        maintain complete and accurate records with respect to Your use of
        CockroachDB Enterprise Edition and will provide such records to
        Cockroach Labs for inspection or audit upon Cockroach Labs’ reasonable
        request.  If an inspection or audit uncovers additional usage by You for
        which fees are owed under this Agreement, then You shall pay for such
        additional usage at Cockroach Labs’ then-current rates.

  5. Trial License.  If You have signed up for a trial or evaluation of
     CockroachDB Enterprise Edition, Your License to CockroachDB Enterprise
     Edition is granted without charge for the trial or evaluation period
     specified when You signed up, or if no term was specified, for thirty (30)
     calendar days, provided that Your License is granted solely for purposes of
     Your internal evaluation of 
     ((Cockroach || CockroachDB))
     Enterprise Edition during the trial
     or evaluation period (a "Trial License").  You may not use CockroachDB
     Enterprise Edition under a Trial License more than once in any twelve (12)
     month period.  Cockroach Labs may revoke a Trial License at any time and
     for any reason.  Sections 3, 4, 9 and 11 of this Agreement do not apply to
     Trial Licenses.

  6. 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.

    (e) Enterprise Derivative Works: Derivative Works of CockroachDB Enterprise
        Edition ("Enterprise Derivative Works") may be made, reproduced and
        distributed in any medium, with or without modifications, in Source or
        Object form, provided that each Enterprise Derivative Work will be
        considered to include a License to CockroachDB Enterprise Edition and
        thus will be subject to the payment of fees to Cockroach Labs by any
        user of the Enterprise Derivative Work.

  7. Submission of Contributions. Unless You explicitly state otherwise, any
     Contribution intentionally submitted for inclusion in CockroachDB by You to
     Cockroach Labs shall be under the terms and conditions of

         https://cla-assistant.io/cockroachdb/cockroach

     (which is based off of the Apache License), without any additional terms or
     conditions, payments of royalties or otherwise to Your benefit.
     Notwithstanding the above, nothing herein shall supersede or modify the
     terms of any separate license agreement You may have executed with
     Cockroach Labs regarding such Contributions.

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

  9. Limited Warranty.

    (a) Warranties.  Cockroach Labs warrants to You that: (i) CockroachDB
        Enterprise Edition will materially perform in accordance with the
        applicable documentation for ninety (90) days after initial delivery to
        You; and (ii) any professional services performed by Cockroach Labs
        under this Agreement will be performed in a workmanlike manner, in
        accordance with general industry standards.

    (b) Exclusions.  Cockroach Labs’ warranties in this Section 9 do not extend
        to problems that result from: (i) Your failure to implement updates
        issued by Cockroach Labs during the warranty period; (ii) any
        alterations or additions (including Enterprise Derivative Works and
        Contributions) to CockroachDB not performed by or at the direction of
        Cockroach Labs; (iii) failures that are not reproducible by Cockroach
        Labs; (iv) operation of CockroachDB Enterprise Edition in violation of
        this Agreement or not in accordance with its documentation; (v) failures
        caused by software, hardware or products not licensed or provided by
        Cockroach Labs hereunder; or (vi) Third Party Works.

    (c) Remedies.  In the event of a breach of a warranty under this Section 9,
        Cockroach Labs will, at its discretion and cost, either repair, replace
        or re-perform the applicable Works or services or refund a portion of
        fees previously paid to Cockroach Labs that are associated with the
        defective Works or services. This is Your exclusive remedy, and
        Cockroach Labs’ sole liability, arising in connection with the limited
        warranties herein.

  10. Disclaimer of Warranty.  Except as set out in Section 9, unless required
      by applicable law, 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, arising out of course
      of dealing, course of performance, or usage in trade, including, without
      limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT,
      MERCHANTABILITY, CORRECTNESS, RELIABILITY, or FITNESS FOR A PARTICULAR
      PURPOSE, all of which are hereby disclaimed.  You are solely responsible
      for determining the appropriateness of using or redistributing Works and
      assume any risks associated with Your exercise of permissions under the
      applicable License for such Works.

  11. Limited Indemnity.

    (a) Indemnity.  Cockroach Labs will defend, indemnify and hold You harmless
        against any third party claims, liabilities or expenses incurred
        (including reasonable attorneys’ fees), as well as amounts finally
        awarded in a settlement or a non-appealable judgement by a court
        ("Losses"), to the extent arising from any claim or allegation by a
        third party that CockroachDB Enterprise Edition infringes or
        misappropriates a valid United States patent, copyright or trade secret
        right of a third party; provided that You give Cockroach Labs: (i)
        prompt written notice of any such claim or allegation; (ii) sole control
        of the defense and settlement thereof; and (iii) reasonable cooperation
        and assistance in such defense or settlement.  If any Work within
        CockroachDB Enterprise Edition becomes or, in Cockroach Labs’ opinion,
        is likely to become, the subject of an injunction, Cockroach Labs may,
        at its option, (A) procure for You the right to continue using such
        Work, (B) replace or modify such Work so that it becomes non-infringing
        without substantially compromising its functionality, or, if (A) and (B)
        are not commercially practicable, then (C) terminate Your license to the
        allegedly infringing Work and refund to You a prorated portion of the
        prepaid and unearned fees for such infringing Work.  The foregoing
        states the entire liability of Cockroach Labs with respect to
        infringement of patents, copyrights, trade secrets or other intellectual
        property rights.

    (b) Exclusions.  The foregoing obligations shall not apply to: (i) Works
        modified by any party other than Cockroach Labs (including Enterprise
        Derivative Works and Contributions), if the alleged infringement relates
        to such modification, (ii) Works combined or bundled with any products,
        processes or materials not provided by Cockroach Labs where the alleged
        infringement relates to such combination, (iii) use of a version of
        CockroachDB Enterprise Edition other than the version that was current
        at the time of such use, as long as a non-infringing version had been
        released, (iv) any Works created to Your specifications, (v)
        infringement or misappropriation of any proprietary right in which You
        have an interest, or (vi) Third Party Works.  You will defend, indemnify
        and hold Cockroach Labs harmless against any Losses arising from any
        such claim or allegation, subject to conditions reciprocal to those in
        Section 11(a).

  12. Limitation of Liability.  In no event and under no legal or equitable
      theory, whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts), and notwithstanding anything in this Agreement to the
      contrary, shall Licensor or any Contributor be liable to You for (i) any
      amounts in excess, in the aggregate, of the fees paid by You to Cockroach
      Labs under this Agreement in the twelve (12) months preceding the date the
      first cause of liability arose), or (ii) any indirect, special,
      incidental, punitive, exemplary, reliance, or consequential damages of any
      character arising as a result of this Agreement or out of the use or
      inability to use the Work (including but not limited to damages for loss
      of goodwill, profits, data or data use, work stoppage, computer failure or
      malfunction, cost of procurement of substitute goods, technology or
      services, or any and all other commercial damages or losses), even if such
      Licensor or Contributor has been advised of the possibility of such
      damages. THESE LIMITATIONS SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE
      ESSENTIAL PURPOSE OF ANY LIMITED REMEDY.

  13. Accepting Warranty or Additional Liability.  While redistributing Works or
      Derivative Works thereof, and without limiting your obligations under
      Section 6, 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 Cockroach Labs and each other Contributor harmless for
      any liability incurred by, or claims asserted against, such Contributor by
      reason of your accepting any such warranty or additional liability.

  14. General.

    (a) Relationship of Parties.  You and Cockroach Labs are independent
        contractors, and nothing herein shall be deemed to constitute either
        party as the agent or representative of the other or both parties as
        joint venturers or partners for any purpose.

    (b) Export Control.  You shall comply with the U.S. Foreign Corrupt
        Practices Act and all applicable export laws, restrictions and
        regulations of the U.S. Department of Commerce, and any other applicable
        U.S. and foreign authority.

    (c) Assignment.  This Agreement and the rights and obligations herein may
        not be assigned or transferred, in whole or in part, by You without the
        prior written consent of Cockroach Labs.  Any assignment in violation of
        this provision is void.  This Agreement shall be binding upon, and inure
        to the benefit of, the successors and permitted assigns of the parties.

    (d) Governing Law.  This Agreement shall be governed by and construed under
        the laws of the State of New York and the United States without regard
        to conflicts of laws provisions thereof, and without regard to the
        Uniform Computer Information Transactions Act.

    (e) Attorneys’ Fees.  In any action or proceeding to enforce rights under
        this Agreement, the prevailing party shall be entitled to recover its
        costs, expenses and attorneys’ fees.

    (f) Severability.  If any provision of this Agreement is held to be invalid,
        illegal or unenforceable in any respect, that provision shall be limited
        or eliminated to the minimum extent necessary so that this Agreement
        otherwise remains in full force and effect and enforceable.

    (g) Entire Agreement; Waivers; Modification.  This Agreement constitutes the
        entire agreement between the parties relating to the subject matter
        hereof and supersedes all proposals, understandings, or discussions,
        whether written or oral, relating to the subject matter of this
        Agreement and all past dealing or industry custom. The failure of either
        party to enforce its rights under this Agreement at any time for any
        period shall not be construed as a waiver of such rights. No changes,
        modifications or waivers to this Agreement will be effective unless in
        writing and signed by both parties.
`
const license_dgraph_lre = `//**
gopkg.in/adibiarsotp/dgraph.v83@v83.0.0-20171012064944-38e0eed888d7
gopkg.in/adibiarsotp/dgraph.v82@v82.0.0-20170922040331-84d68f09dda5
**//



# Dgraph Licensing

## Server

Dgraph Server is available under [GNU AGPLv3](https://www.gnu.org/licenses/agpl-3.0.html).

## Drivers

Dgraph Go driver and any other drivers are available under [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0).

## Licensing Policy

The reasoning behind chosing AGPL license is explained in this [blog
post](https://blog.dgraph.io/post/licensing/). The general idea is that using
Dgraph for free even for commercial purposes is OK, as long as you release any
modifications to the server code back to the community.

Most users don't need to modify server code, so they can continue to use Dgraph
for free, forever.  But, if you need to modify server code and are not ok with
releasing the changes back, [get in touch](mailto:contact@dgraph.io) with us and
we can set you up with a commercial or enterprise license.

If use of our drivers under the Apache 2.0 or the database under the AGPL v3
does not satisfy your organization's legal department, commercial licenses are
available as well. Please [contact us](mailto:contact@dgraph.io) for more
details.

## Trademark

Dgraph is a registered trademark of Dgraph Labs, Inc.
`
const license_drone_lre = `//**
source: github.com/go-dronex/dronex@v0.0.0-20181220013224-9a7e689831e9/LICENSE
**//


The Drone Community Edition
(( (the "Community Edition") ))??
is licensed under the Apache License, Version 2.0 (the "Apache License").
You may obtain a copy of the Apache License at

    http://www.apache.org/licenses/LICENSE-2.0

((
The Drone Enterprise Edition (the "Enterprise Edition") is licensed under
the Drone Enterprise License, Version 1.1 (the "Enterprise License"). A copy
of the Enterprise License is provided below.

||

The Drone Enterprise Edition is licensed under the Drone
Non-Commercial License (the "Non-Commercial License"). A copy of
the Non-Commercial License is provided below.
))

((
The source files in this repository have a header indicating which license
they are under. The
((BUILDING || BUILDING_OSS))
file provides instructions for creating the
Community Edition distribution subject to the terms of the Apache License.
))??

((

Licensor:             Drone.IO, Inc
Licensed Work:        Drone Enterprise Edition

Additional Use Grant: Usage of the software is free for entities with both:
                      (a) annual gross revenue under (USD) $1 million
                      (according to GAAP, or the equivalent in its country
                      of domicile); and (b) less than (USD) $5 million in
                      aggregate debt and equity funding. 

Change Date:          2022-01-01

Change License:       Apache-2.0

Notice

The Drone Enterprise License (this document, or the "License") is not an Open
Source license. However, the Licensed Work will eventually be made available
under an Open Source License, as stated in this License.
))??

((
Drone Non-Commercial License

Contributor: Drone.IO, Inc.

Source Code: __8__

This license lets you use and share this software for free,
with a trial-length time limit on commercial use. Specifically:

If you follow the rules below, you may do everything with this
software that would otherwise infringe either the contributor's
copyright in it, any patent claim the contributor can license
that covers this software as of the contributor's latest
contribution, or both.

1. You must limit use of this software in any manner primarily
   intended for or directed toward commercial advantage or
   private monetary compensation to a trial period of 32
   consecutive calendar days. This limit does not apply to use in
   developing feedback, modifications, or extensions that you
   contribute back to those giving this license.

2. Ensure everyone who gets a copy of this software from you, in
   source code or any other form, gets the text of this license
   and the contributor and source code lines above.

3. Do not make any legal claim against anyone for infringing any
   patent claim they would infringe by using this software alone,
   accusing this software, with or without changes, alone or as
   part of a larger application.

You are excused for unknowingly breaking rule 1 if you stop
doing anything requiring this license within 30 days of
learning you broke the rule.

**This software comes as is, without any warranty at all. As far
as the law allows, the contributor will not be liable for any
damages related to this software or this license, for any kind of
legal claim.**
))??

((
Drone Enterprise License 1.1

Terms

The Licensor hereby grants you the right to copy, modify, create derivative
works, redistribute, and make non-production use of the Licensed Work. The
Licensor may make an Additional Use Grant, above, permitting limited
production use.

Effective on the Change Date, or the fourth anniversary of the first publicly
available distribution of a specific version of the Licensed Work under this
License, whichever comes first, the Licensor hereby grants you rights under
the terms of the Change License, and the rights granted in the paragraph
above terminate.

If your use of the Licensed Work does not comply with the requirements
currently in effect as described in this License, you must purchase a
commercial license from the Licensor, its affiliated entities, or authorized
resellers, or you must refrain from using the Licensed Work.

All copies of the original and modified Licensed Work, and derivative works
of the Licensed Work, are subject to this License. This License applies
separately for each version of the Licensed Work and the Change Date may vary
for each version of the Licensed Work released by Licensor.

You must conspicuously display this License on each original or modified copy
of the Licensed Work. If you receive the Licensed Work in original or
modified form from a third party, the terms and conditions set forth in this
License apply to your use of that work.

Any use of the Licensed Work in violation of this License will automatically
terminate your rights under this License for the current and all other
versions of the Licensed Work.

This License does not grant you any right in any trademark or logo of
Licensor or its affiliates (provided that you may use a trademark or logo of
Licensor as expressly required by this License).

TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON
AN "AS IS" BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS,
EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND
TITLE.
))??

((
Waiver: Individual and Small Business

Contributor waives the terms of rule 1 for companies meeting all
the following criteria, counting all subsidiaries and affiliated
entities as one:

1. worldwide annual gross revenue under $5 million US dollars,
   per generally accepted accounting principles

2. less than $5 million US dollars in all-time aggregate debt and
   equity financing

Contributor will not revoke this waiver, but may change terms for
future versions of the software.
))??

((
Waiver: Low Usage

Contributor waives the terms of rule 1 for companies meeting all
the following criteria, counting all subsidiaries and affiliated
entities as one:

1. less than 5,000 total pipelines executed using this software
   in the immediately preceding, year-long period

Contributor will not revoke this waiver, but may change terms for
future versions of the software.
))??
`
const license_dropbox_lre = `//** github.com/dropbox/goebpf@v0.0.0-20201020203810-72edb057c378 **//


Licensed under GPL version 2 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
`
const license_fontawesome_lre = `//** github.com/ecletus-pkg/fontawesome_com@v0.0.0-20200904170934-0e02fad1db22 **//



Font Awesome Free License
-------------------------

Font Awesome Free is free, open source, and GPL friendly. You can use it for
commercial projects, open source projects, or really almost whatever you want.
Full Font Awesome Free license: https://fontawesome.com/license/free.

# Icons: CC BY 4.0 License (https://creativecommons.org/licenses/by/4.0/)
In the Font Awesome Free download, the CC BY 4.0 license applies to all icons
packaged as SVG and JS file types.

# Fonts: SIL OFL 1.1 License (https://scripts.sil.org/OFL)
In the Font Awesome Free download, the SIL OLF license applies to all icons
packaged as web and desktop font files.

# Code: MIT License (https://opensource.org/licenses/MIT)
In the Font Awesome Free download, the MIT license applies to all non-font and
non-icon files.

# Attribution
Attribution is required by MIT, SIL OLF, and CC BY licenses. Downloaded Font
Awesome Free files already contain embedded comments with sufficient
attribution, so you shouldn't need to do anything additional when using these
files normally.

We've kept attribution comments terse, so we ask that you do not actively work
to remove them from files, especially code. They're a great way for folks to
learn about Font Awesome.

# Brand Icons
All brand icons are trademarks of their respective owners. The use of these
trademarks does not indicate endorsement of the trademark holder by Font
Awesome, nor vice versa. **Please do not use brand logos for any purpose except
to represent the company, product, or service to which they refer.**
`
const license_freetype_lre = `//**
source: https://github.com/golang/freetype/blob/master/LICENSE
**//


Use of the Freetype-Go software is subject to your choice of exactly one of
the following two licenses:
  * The FreeType License, which is similar to the original BSD license with
    an advertising clause, or
  * The GNU General Public License (GPL), version 2 or later.

The text of these licenses are available in the licenses/ftl.txt and the
licenses/gpl.txt files respectively. They are also available at
http://freetype.sourceforge.net/license.html

The Luxi fonts in the testdata directory are licensed separately. See the
testdata/COPYING file for details.
`
const license_frugal_lre = `//**
source: https://github.com/Workiva/frugal/blob/master/LICENSE
**//


Copyright 2017-2018 Workiva Inc.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

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

This Frugal software includes a number of subcomponents with
separate copyright notices and/or license terms. Your use of the source
code for the these subcomponents is subject to the terms and
conditions of the following licenses:

Apache Thrift software: https://github.com/apache/thrift
Copyright ©2017 Apache Software Foundation.
Licensed under the Apache License v2.0: https://github.com/apache/thrift/blob/master/LICENSE
Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.

--------------------------------------------------
`
const license_geojson_lre = `//** github.com/losinggeneration/geojson@v0.0.0-20160627001320-09bc167a825e **//



Unit test JSON examples:
Most unit test examples are taken from the GeoJSON spec Rev 1.0 at
http://geojson.org/geojson-spec.html
Authors 	Howard Butler (Hobu Inc.), Martin Daly (Cadcorp), Allan Doyle (MIT), Sean Gillies (UNC-Chapel Hill), Tim Schaub (OpenGeo), Christopher Schmidt (MetaCarta)
Copyright © 2008 by the Authors

Unit test JSON examples are thus licensed under a
Creative Commons Attribution 3.0 United States License
http://creativecommons.org/licenses/by/3.0/us/
`
const license_glycerine_lre = `//** github.com/glycerine/fast-elliptic-curve-p256 **//



##############################################################################
#                                                                            #
# Portions Copyright (c) 2015 Intel Corporation                              #
# Portions Copyright (c) 2015 CloudFlare, Inc.                               #
# All rights reserved.                                                       #
#                                                                            #
# This software is made available to you under your choice of the            #
# Apache V.2.0 and/or BSD license below:                                     #
#                                                                            #
##############################################################################
#                                                                            #
# Licensed under the Apache License, Version 2.0 (the "License");            #
# you may not use this file except in compliance with the License.           #
# You may obtain a copy of the License at                                    #
#                                                                            #
#    http://www.apache.org/licenses/LICENSE-2.0                              #
#                                                                            #
# Unless required by applicable law or agreed to in writing, software        #
# distributed under the License is distributed on an "AS IS" BASIS,          #
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   #
# See the License for the specific language governing permissions and        #
# limitations under the License.                                             #
#                                                                            #
##############################################################################
#                                                                            #
#  Redistribution and use in source and binary forms, with or without        #
#  modification, are permitted provided that the following conditions are    #
#  met:                                                                      #
#                                                                            #
#  #  Redistributions of source code must retain the above copyright         #
#     notice, this list of conditions and the following disclaimer.          #
#                                                                            #
#  #  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.                                                          #
#                                                                            #
#  #  Neither the name of the copyright holders 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.              #
#                                                                            #
##############################################################################
#  Developers and authors:                                                   #
#  Shay Gueron (1, 2), and Vlad Krasnov (1, 3)                               #
#  (1) Intel Corporation, Israel Development Center                          #
#  (2) University of Haifa                                                   #
#  (3) CloudFlare, Inc.                                                      #
#  Reference:                                                                #
#  S.Gueron and V.Krasnov, "Fast Prime Field Elliptic Curve Cryptography with#
#                           256 Bit Primes"                                  #
#   https://eprint.iacr.org/2013/816.pdf                                     #
##############################################################################

# Further optimization by <appro@openssl.org>:
#
#                       this/original   with/without -DECP_NISTZ256_ASM(*)
# Opteron               +12-49%         +110-150%
# Bulldozer             +14-45%         +175-210%
# P4                    +18-46%         n/a :-(
# Westmere              +12-34%         +80-87%
# Sandy Bridge          +9-35%          +110-120%
# Ivy Bridge            +9-35%          +110-125%
# Haswell               +8-37%          +140-160%
# Broadwell             +18-58%         +145-210%
# Atom                  +15-50%         +130-180%
# VIA Nano              +43-160%        +300-480%
#
# (*)   "without -DECP_NISTZ256_ASM" refers to build with
#       "enable-ec_nistp_64_gcc_128";
#
# Ranges denote minimum and maximum improvement coefficients depending
# on benchmark. Lower coefficients are for ECDSA sign, relatively fastest
# server-side operation. Keep in mind that +100% means 2x improvement.
*/
`
const license_golangdoc_lre = `//** github.com/golang-china/golangdoc.translations@v0.0.0-20180720044904-fe925a2c9524 **//



除特别注明外, 本站内容均采用[知识共享-署名(CC-BY) 3.0协议](http://creativecommons.org/licenses/by/3.0/)授权,
代码遵循[Go项目的BSD协议](http://golang.org/LICENSE)授权.
`
const license_gpl2_lre = `//**
  github.com/fjl/go-ethereum@v0.6.8
  and others
**//



((
Unless explicitly stated otherwise, the following applies:
))??

This
((library || program))
is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License
(( version 2 ))??
as published by the Free Software Foundation;
(( either version __15__ ))??

This
((library || program))
is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with this
((library || program))
if not,
((
write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301  USA
||
see <http://www.gnu.org/licenses/>.
))

`
const license_gpl3_lre = `//**
    launchpad.net_ubuntu-push@v0.0.0-20170211001545-000000000177
    github.com/monsti/form@v0.0.0-20140713153911-7d350fe5f89b
**//



((This program || monsti/form))
is free software: you can redistribute it and/or modify it
under the terms of the
((
GNU General Public License version 3, as published by the Free Software Foundation.
||
GNU Lesser General Public License as published by the Free
Software Foundation, either version 3 of the License, or (at your option) any
later version.
))

((This program || monsti/form))
is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied
((warranties || warranty))
of
MERCHANTABILITY,
((SATISFACTORY QUALITY))??
or FITNESS FOR A PARTICULAR
PURPOSE.  See the GNU General Public License for more details.

You should have received a copy of the GNU
((Lesser))??
General Public License along with
((this program || monsti/form))
If not, see <http://www.gnu.org/licenses/>.


`
const license_gstats_lre = `//** github.com/cevatbarisyilmaz/gstats@v0.1.5 **//



By default, gstats uses https://github.com/cevatbarisyilmaz/ip2country for geolocation,
which internally uses [GeoLite2](https://dev.maxmind.com/geoip/geoip2/geolite2/)  database by Maxmind.
As GeoLite2 is distributed under
[Creative Commons Attribution-ShareAlike 4.0 International License](https://creativecommons.org/licenses/by-sa/4.0/),
gstats also uses the same license due to license's terms.

However, you can override the geolocation function to use another geolocation source
or maybe to not use geolocation at all. In this case, you can use gstats with
[MIT License](https://opensource.org/licenses/MIT).
`
const license_hardikdr_lre = `

## APIs

This project may include APIs to SAP or third party products or services. The use of these APIs, products and services may be subject to additional agreements. In no event shall the application of the Apache Software License, v.2 to this project grant any rights in or to these APIs, products or services that would alter, expand, be inconsistent with, or supersede any terms of these additional agreements. API means application programming interfaces, as well as their respective specifications and implementing code that allows other software products to communicate with or call on SAP or third party products or services (for example, SAP Enterprise Services, BAPIs, Idocs, RFCs and ABAP calls or other user exits) and may be made available through SAP or third party products, SDKs, documentation or other media.

## Subcomponents

This project includes the following subcomponents that are subject to separate license terms. 
Your use of these subcomponents is subject to the separate license terms applicable to
each subcomponent.

OAI Object Model.   
https://github.com/go-openapi/spec.  
Copyright 2015 go-swagger maintainers.  
Apache 2 license (https://github.com/go-openapi/spec/blob/master/LICENSE ).  

Glog.  
https://github.com/golang/glog.  
Copyright 2013 Google Inc. All Rights Reserved.  
Apache 2 license (https://github.com/golang/glog/blob/master/LICENSE ).  

Prometheus Go Client Library.  
https://github.com/prometheus/client_golang.  
Copyright 2015 The Prometheus Authors.  
Apache 2 license (https://github.com/prometheus/client_golang/blob/master/LICENSE ).  

Pflag.   
https://github.com/spf13/pflag.  
Copyright (c) 2012 Alex Ogier. Copyright (c) 2012 The Go Authors.   
BSD 3-clause "New" or "Revised" License (https://github.com/spf13/pflag/blob/master/LICENSE ).  

API.  
https://github.com/kubernetes/api/.  
Copyright 2017 The Kubernetes Authors.   
Apache 2 license (https://github.com/kubernetes/api/blob/master/LICENSE ).  

APIMachinery.  
https://github.com/kubernetes/apimachinery.  
Copyright 2017 The Kubernetes Authors.      
Apache 2 license (https://github.com/kubernetes/apimachinery/blob/master/LICENSE ).  

APIServer.  
https://github.com/kubernetes/apiserver.  
Copyright 2017 The Kubernetes Authors.   
Apache 2 license (https://github.com/kubernetes/apiserver/blob/master/LICENSE ).  

Client-go.  
https://github.com/kubernetes/client-go.  
Copyright 2017 The Kubernetes Authors.   
Apache 2 license (https://github.com/kubernetes/client-go/blob/master/LICENSE ).  

Code-generator.  
https://github.com/kubernetes/code-generator.  
Copyright 2017 The Kubernetes Authors.   
Apache 2 license (https://github.com/kubernetes/code-generator/blob/master/LICENSE ).  

Gengo.  
https://github.com/kubernetes/gengo.  
Copyright 2017 The Kubernetes Authors.   
Apache 2 license (https://github.com/kubernetes/gengo/blob/master/LICENSE ).   

Kube OpenAPI.  
https://github.com/kubernetes/kube-openapi.  
Copyright 2017 The Kubernetes Authors.   
Apache 2 license (https://github.com/kubernetes/kube-openapi/blob/master/LICENSE ).  

Google Cloud Go SDK.  
https://cloud.google.com/compute/docs/api/libraries#google_apis_go_client_library.  
Copyright (c) 2011 Google Inc. All rights reserved.  
BSD-3 license (https://github.com/google/google-api-go-client/blob/master/LICENSE)  

Gophercloud.  
https://github.com/gophercloud/gophercloud.  
Copyright 2012-2013 Rackspace, Inc.  
Apache 2 license (https://github.com/gophercloud/gophercloud/blob/master/LICENSE)  

Concurrent.  
https://github.com/modern-go/concurrent.  
Apache 2 license (https://github.com/modern-go/concurrent/blob/master/LICENSE)  

Reflect2.  
https://github.com/modern-go/reflect2.  
Apache 2 license (https://github.com/modern-go/reflect2/blob/master/LICENSE)  

Ginkgo.  
https://github.com/onsi/ginkgo.  
Copyright (c) 2013-2014 Onsi Fakhouri
MIT license (https://github.com/onsi/ginkgo/blob/master/LICENSE)  

Gomega.  
https://github.com/onsi/ginkgo.  
Copyright (c) 2013-2014 Onsi Fakhouri
MIT license (https://github.com/onsi/gomega/blob/master/LICENSE)  

Alibaba Cloud Go Software Development Kit.  
https://github.com/aliyun/alibaba-cloud-sdk-go.  
Apache 2 license (https://github.com/aliyun/alibaba-cloud-sdk-go/blob/master/LICENSE)  
`
const license_heim_lre = `//** github.com/euphoria-io/heim@v0.0.0-20191219050951-978c921063e6 **//



# Heim Licensing

All software in this repository is open source. Source code is offered
under the permissive MIT license. Other files, such as documentation,
art, and graphics, are offered under the CC-BY 4.0 license.

Please pay careful attention to the license that applies if you reuse or modify
any of these components.

## art, doc, and client/res

Files under the ` + "`" + `art` + "`" + `, ` + "`" + `doc` + "`" + `, and ` + "`" + `client/res` + "`" + ` directories are offered under
the terms of the [CC BY 4.0](http://creativecommons.org/licenses/by/4.0/)
license.  You'll find a copy in the ` + "`" + `LICENSE` + "`" + ` file in each of these
directories.

## everything else

The heim source code is licensed to the public under the terms of the MIT
license. See ` + "`" + `LICENSE.mit` + "`" + ` for details.
`
const license_hid_lre = `//**
source: https://github.com/mindworks-software/hid/blob/master/LICENSE.md
**//



The components of ` + "`" + `hid` + "`" + ` are licensed as such:

 * ` + "`" + `hidapi` + "`" + ` is released under the [3-clause BSD](https://github.com/signal11/hidapi/blob/master/LICENSE-bsd.txt) license.
 * ` + "`" + `libusb` + "`" + ` is released under the [GNU LGPL 2.1](https://github.com/libusb/libusb/blob/master/COPYING)license.
 * ` + "`" + `go.hid` + "`" + ` is released under the [2-clause BSD](https://github.com/GeertJohan/go.hid/blob/master/LICENSE) license.
 * ` + "`" + `gowchar` + "`" + ` is released under the [3-clause BSD](https://github.com/orofarne/gowchar/blob/master/LICENSE) license.

Given the above, ` + "`" + `hid` + "`" + ` is licensed under GNU LGPL 2.1 or later on Linux and 3-clause BSD on other platforms.
`
const license_ichain_lre = `//** github.com/icheckteam/ichain@v0.22.4 **//



This software is

    Copyright (C) 2016 Alessio Treglia <alessio@debian.org>
                       Baxter-IT (https://www.baxter-it.com/)	

and distributed under the terms of the Apache License, Version 2.0.

You should have received a copy of the license along with this package;
if not, you may find it at 'https://www.apache.org/licenses/LICENSE-2.0` + "`" + `
`
const license_ipld_lre = `//** github.com/ipld/go-ipld-adl-hamt@v0.0.0-20201125163904-25abfe77c0bc **//



This library is dual-licensed under either of Apache 2.0 or MIT terms:

- Apache-2.0 Software License: https://www.apache.org/licenses/LICENSE-2.0

- MIT Software License: https://opensource.org/licenses/MIT

Unless required by applicable law or agreed to in writing, software
distributed under the terms listed in this notice is distributed on
an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
either express or implied. See each License for the specific language
governing permissions and limitations under that License.

<!--- SPDX-License-Identifier: Apache-2.0 OR MIT -->
` + "`" + `SPDX-License-Identifier: Apache-2.0 OR MIT` + "`" + `
`
const license_jacamar_lre = `//**
gitlab.com/ecp-ci/jacamar-plugins@v0.1.0
gitlab.com/ecp-ci/jacamar-ci@v0.3.2
**//



Jacamar
((CI || Plugins))
is licensed under the Apache License, Version 2.0 (LICENSE-APACHE
or http://www.apache.org/licenses/LICENSE-2.0) or the MIT license,
(LICENSE-MIT or http://opensource.org/licenses/MIT), at your option.

Copyrights and patents in the Jacamar
((CI || Plugins))
project are retained
by contributors. No copyright assignment is required to contribute.
`
const license_learn_lre = `//** github.com/gyuho/learn@v0.0.0-20170111014222-d7ea19cb9a88 **//



<a rel="license" href="http://creativecommons.org/licenses/by/4.0/"><img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by/4.0/88x31.png" /></a><br />This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution 4.0 International License</a>.
`
const license_maskimko_lre = `//** github.com/maskimko/3ff@v0.1 **///



This program is Licensed by Apache v2  license http://www.apache.org/licenses/LICENSE-2.0
`
const license_mcm_lre = `//** github.com/prashanth26/machine-controller-manager@v0.0.0-20181102103410-c6b285941cf9 **//




` + "`" + `` + "`" + `` + "`" + `
                                 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.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
` + "`" + `` + "`" + `` + "`" + `

## APIs

This project may include APIs to SAP or third party products or services. The use of these APIs, products and services may be subject to additional agreements. In no event shall the application of the Apache Software License, v.2 to this project grant any rights in or to these APIs, products or services that would alter, expand, be inconsistent with, or supersede any terms of these additional agreements. API means application programming interfaces, as well as their respective specifications and implementing code that allows other software products to communicate with or call on SAP or third party products or services (for example, SAP Enterprise Services, BAPIs, Idocs, RFCs and ABAP calls or other user exits) and may be made available through SAP or third party products, SDKs, documentation or other media.

## Subcomponents

This project includes the following subcomponents that are subject to separate license terms. 
Your use of these subcomponents is subject to the separate license terms applicable to
each subcomponent.

OAI Object Model.   
https://github.com/go-openapi/spec.  
Copyright 2015 go-swagger maintainers.  
Apache 2 license (https://github.com/go-openapi/spec/blob/master/LICENSE ).  

((
    Glog.  
    https://github.com/golang/glog.  
    Copyright 2013 Google Inc. All Rights Reserved.  
    Apache 2 license (https://github.com/golang/glog/blob/master/LICENSE ).  
||
    klog.  
    https://github.com/golang/klog.  
    Copyright 2013 Google Inc. All Rights Reserved.  
    Apache 2 license (https://github.com/kubernetes/klog/blob/master/LICENSE ).  
))

Prometheus Go Client Library.  
https://github.com/prometheus/client_golang.  
Copyright 2015 The Prometheus Authors.  
Apache 2 license (https://github.com/prometheus/client_golang/blob/master/LICENSE ).  

Pflag.   
https://github.com/spf13/pflag.  
Copyright (c) 2012 Alex Ogier. Copyright (c) 2012 The Go Authors.   
BSD 3-clause "New" or "Revised" License (https://github.com/spf13/pflag/blob/master/LICENSE ).  

API.  
https://github.com/kubernetes/api/.  
Copyright 2017 The Kubernetes Authors.   
Apache 2 license (https://github.com/kubernetes/api/blob/master/LICENSE ).  

APIMachinery.  
https://github.com/kubernetes/apimachinery.  
Copyright 2017 The Kubernetes Authors.      
Apache 2 license (https://github.com/kubernetes/apimachinery/blob/master/LICENSE ).  

APIServer.  
https://github.com/kubernetes/apiserver.  
Copyright 2017 The Kubernetes Authors.   
Apache 2 license (https://github.com/kubernetes/apiserver/blob/master/LICENSE ).  

Client-go.  
https://github.com/kubernetes/client-go.  
Copyright 2017 The Kubernetes Authors.   
Apache 2 license (https://github.com/kubernetes/client-go/blob/master/LICENSE ).  

Code-generator.  
https://github.com/kubernetes/code-generator.  
Copyright 2017 The Kubernetes Authors.   
Apache 2 license (https://github.com/kubernetes/code-generator/blob/master/LICENSE ).  

Gengo.  
https://github.com/kubernetes/gengo.  
Copyright 2017 The Kubernetes Authors.   
Apache 2 license (https://github.com/kubernetes/gengo/blob/master/LICENSE ).   

Kube OpenAPI.  
https://github.com/kubernetes/kube-openapi.  
Copyright 2017 The Kubernetes Authors.   
Apache 2 license (https://github.com/kubernetes/kube-openapi/blob/master/LICENSE ).  

Google Cloud Go SDK.  
https://cloud.google.com/compute/docs/api/libraries#google_apis_go_client_library.  
Copyright (c) 2011 Google Inc. All rights reserved.  
BSD-3 license (https://github.com/google/google-api-go-client/blob/master/LICENSE)  

Gophercloud.  
https://github.com/gophercloud/gophercloud.  
Copyright 2012-2013 Rackspace, Inc.  
Apache 2 license (https://github.com/gophercloud/gophercloud/blob/master/LICENSE)  

Concurrent.  
https://github.com/modern-go/concurrent.  
Apache 2 license (https://github.com/modern-go/concurrent/blob/master/LICENSE)  

Reflect2.  
https://github.com/modern-go/reflect2.  
Apache 2 license (https://github.com/modern-go/reflect2/blob/master/LICENSE)  

Ginkgo.  
https://github.com/onsi/ginkgo.  
Copyright (c) 2013-2014 Onsi Fakhouri
MIT license (https://github.com/onsi/ginkgo/blob/master/LICENSE)  

Gomega.  
https://github.com/onsi/ginkgo.  
Copyright (c) 2013-2014 Onsi Fakhouri
MIT license (https://github.com/onsi/gomega/blob/master/LICENSE)  

Alibaba Cloud Go Software Development Kit.  
https://github.com/aliyun/alibaba-cloud-sdk-go.  
Apache 2 license (https://github.com/aliyun/alibaba-cloud-sdk-go/blob/master/LICENSE)  

gRPC-Go.  
https://github.com/grpc/grpc-go.  
Copyright 2017 gRPC authors.  
Apache 2 license (https://github.com/grpc/grpc-go/blob/master/LICENSE)  


------
## BSD 3-clause "New" or "Revised" License

((SPDX short identifier: BSD-3-Clause))??

` + "`" + `` + "`" + `` + "`" + `
    Copyright (c) <year> <author> All rights reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are
    met:

    * Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.
    * 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.
    * Neither the name of Google Inc. 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
    OWNER 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.
` + "`" + `` + "`" + `` + "`" + `
`
const license_micro_lre = `//** github.com/micro/enterprise@v0.4.0 **//



Micro Enterprise License Agreement

  Please read this Micro Enterprise License Agreement (the "Agreement")
  carefully before using Micro (as defined below), which is offered by
  Micro Services, Inc. or its affiliated Legal Entities ("Micro Services").

  By downloading Micro or using it in any manner, You agree that You have
  read and agree to be bound by the terms of this Agreement.  If You are
  accessing Micro on behalf of a Legal Entity, You represent and warrant
  that You have the authority to agree to these terms on its behalf and the
  right to bind that Legal Entity to this Agreement.  Use of Micro is
  expressly conditioned upon Your assent to all the terms of this Agreement, to
  the exclusion of all other terms.

  1. Definitions.  In addition to other terms defined elsewhere in this
     Agreement, the terms below have the following meanings.

    (a) "Micro" shall mean the cloud native toolkit provided by Micro
        Services, including Micro Toolkit and Micro Enterprise
        as defined below.

    (b) "Micro Toolkit" shall mean the open source version of Micro,
        available for free at

            https://github.com/micro/micro

    (c) "Micro Enterprise" shall mean the enterprise version of Micro Toolkit 
        with additional features made available by Micro Services, the
        use of which is subject to additional terms set out below. The Source 
        is available at

            https://github.com/micro/enterprise

    (d) "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 Micro Services
        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 Micro Services 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, Micro Services
        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."

    (e) "Contributor" shall mean any copyright owner or individual or Legal
        Entity authorized by the copyright owner, other than Micro Services,
        from whom Micro Services receives a Contribution that Micro Services
        subsequently incorporates within the Work.

    (f) "Derivative Works" shall mean any work, whether in Source or Object
        form, that is based on (or derived from) the Work, such as a
        translation, abridgement, condensation, or any other recasting,
        transformation, or adaptation 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.

    (g) "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.

    (h) "License" shall mean the terms and conditions for use, reproduction, and
        distribution of a Work as defined by this Agreement.

    (i) "Licensor" shall mean Micro Services or a Contributor, as applicable.

    (j) "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.

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

    (l) "Third Party Works" shall mean Works, including Contributions, and other
        technology owned by a person or Legal Entity other than Micro Services,
        as indicated by a copyright notice that is included in or attached to
        such Works or technology.

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

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

  2. Licenses.

    (a) License to Micro Toolkit.  The License for Micro
        Toolkit is the Apache License, Version 2.0 ("Apache License").
        The Apache License includes a grant of patent license, as well as
        redistribution rights that are contingent on several requirements.
        Please see

            http://www.apache.org/licenses/LICENSE-2.0

        for full terms.  Micro Toolkit is a no-cost, entry-level
        license and as such, contains the following disclaimers: NOTWITHSTANDING
        ANYTHING TO THE CONTRARY HEREIN, MICRO TOOLKIT IS
        PROVIDED "AS IS" AND "AS AVAILABLE", AND ALL EXPRESS OR IMPLIED
        WARRANTIES ARE EXCLUDED AND DISCLAIMED, INCLUDING WITHOUT LIMITATION THE
        IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
        NON-INFRINGEMENT, AND ANY WARRANTIES ARISING BY STATUTE OR OTHERWISE IN
        LAW OR FROM COURSE OF DEALING, COURSE OF PERFORMANCE, OR USE IN TRADE.
        For clarity, the terms of this Agreement, other than the relevant
        definitions in Section 1 and this Section 2(a) do not apply to
        Micro Toolkit.

    (b) License to Micro Enterprise.

      i   Grant of Copyright License: Subject to the terms of this Agreement,
          Licensor hereby grants to You a worldwide, non-exclusive,
          non-transferable limited license to reproduce, prepare Enterprise
          Derivative Works (as defined below) of, publicly display, publicly
          perform, sublicense, and distribute Micro Enterprise
          for Your business purposes, for so long as You are not in violation
          of this Section 2(b) and are current on all payments required by
          Section 4 below.

      ii  Grant of Patent License: Subject to the terms of this Agreement,
          Licensor hereby grants to You a worldwide, non-exclusive,
          non-transferable limited patent license to make, have made, use,
          offer to sell, sell, import, and otherwise transfer Micro
          Enterprise, where such license applies only to those patent
          claims licensable by Licensor 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.

      iii License to Third Party Works:  From time to time Micro Services may
          use, or provide You access to, Third Party Works in connection
          Micro Enterprise.  You acknowledge and agree that in
          addition to this Agreement, Your use of Third Party Works is subject
          to all other terms and conditions set forth in the License provided
          with or contained in such Third Party Works.  Some Third Party Works
          may be licensed to You solely for use with Micro Enterprise
          under the terms of a third party License, or as otherwise
          notified by Micro Services, and not under the terms of this
          Agreement.  You agree that the owners and third party licensors of
          Third Party Works are intended third party beneficiaries to this
          Agreement.

  3. Support.  From time to time, in its sole discretion, Micro Services may
     offer professional services or support for Micro, which may now or in
     the future be subject to additional fees.

  4. Fees for Micro Enterprise or Micro Support.

    (a) Fees.  The License to Micro Enterprise is conditioned upon
        Your payment of the fees specified on

            https://micro.mu/pricing

        which You agree to pay to Micro Services in accordance with the payment
        terms set out on that page.  Any professional services or support for
        Micro may also be subject to Your payment of fees, which will be
        specified by Micro Services when you sign up to receive such
        professional services or support. Micro Services reserves the right to
        change the fees at any time with prior written notice; for recurring
        fees, any such adjustments will take effect as of the next pay period.

    (b) Overdue Payments and Taxes. Overdue payments are subject to a service
        charge equal to the lesser of 1.5% per month or the maximum legal
        interest rate allowed by law, and You shall pay all Micro Services’
        reasonable costs of collection, including court costs and attorneys’
        fees.  Fees are stated and payable in U.S. dollars and are exclusive of
        all sales, use, value added and similar taxes, duties, withholdings and
        other governmental assessments (but excluding taxes based on Micro
        Services’ income) that may be levied on the transactions contemplated by
        this Agreement in any jurisdiction, all of which are Your responsibility
        unless you have provided Micro Services with a valid tax-exempt
        certificate.

    (c) Record-keeping and Audit.  If fees for Micro Enterprise
        are based on the number of cores or servers running on Micro
        Enterprise or another use-based unit of measurement, You must
        maintain complete and accurate records with respect to Your use of
        Micro Enterprise and will provide such records to
        Micro Services for inspection or audit upon Micro Services’ reasonable
        request.  If an inspection or audit uncovers additional usage by You for
        which fees are owed under this Agreement, then You shall pay for such
        additional usage at Micro Services’ then-current rates.

  5. Trial License.  If You have signed up for a trial or evaluation of
     Micro Enterprise, Your License to Micro Enterprise
     is granted without charge for the trial or evaluation period
     specified when You signed up, or if no term was specified, for thirty (14)
     calendar days, provided that Your License is granted solely for purposes of
     Your internal evaluation of Micro Enterprise during the trial
     or evaluation period (a "Trial License").  You may not use Micro
     Enterprise under a Trial License more than once in any twelve (12)
     month period.  Micro Services may revoke a Trial License at any time and
     for any reason.  Sections 3, 4, 9 and 11 of this Agreement do not apply to
     Trial Licenses.

  6. 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.

    (e) Enterprise Derivative Works: Derivative Works of Micro Enterprise
        ("Enterprise Derivative Works") may be made, reproduced and
        distributed in any medium, with or without modifications, in Source or
        Object form, provided that each Enterprise Derivative Work will be
        considered to include a License to Micro Enterprise and
        thus will be subject to the payment of fees to Micro Services by any
        user of the Enterprise Derivative Work.

  7. Submission of Contributions. Unless You explicitly state otherwise, any
     Contribution intentionally submitted for inclusion in Micro by You to
     Micro Services shall be under the terms and conditions of

         https://developercertificate.org/

     without any additional terms or conditions, payments of royalties or otherwise 
     to Your benefit. Notwithstanding the above, nothing herein shall supersede or 
     modify the terms of any separate license agreement You may have executed with
     Micro Services regarding such Contributions.

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

  9. Limited Warranty.

    (a) Warranties.  Micro Services warrants to You that: (i) Micro
        Enterprise will materially perform in accordance with the
        applicable documentation for ninety (90) days after initial delivery to
        You; and (ii) any professional services performed by Micro Services
        under this Agreement will be performed in a workmanlike manner, in
        accordance with general industry standards.

    (b) Exclusions.  Micro Services’ warranties in this Section 9 do not extend
        to problems that result from: (i) Your failure to implement updates
        issued by Micro Services during the warranty period; (ii) any
        alterations or additions (including Enterprise Derivative Works and
        Contributions) to Micro not performed by or at the direction of
        Micro Services; (iii) failures that are not reproducible by Micro
        Services; (iv) operation of Micro Enterprise in violation of
        this Agreement or not in accordance with its documentation; (v) failures
        caused by software, hardware or products not licensed or provided by
        Micro Services hereunder; or (vi) Third Party Works.

    (c) Remedies.  In the event of a breach of a warranty under this Section 9,
        Micro Services will, at its discretion and cost, either repair, replace
        or re-perform the applicable Works or services or refund a portion of
        fees previously paid to Micro Services that are associated with the
        defective Works or services. This is Your exclusive remedy, and
        Micro Services’ sole liability, arising in connection with the limited
        warranties herein.

  10. Disclaimer of Warranty.  Except as set out in Section 9, unless required
      by applicable law, 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, arising out of course
      of dealing, course of performance, or usage in trade, including, without
      limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT,
      MERCHANTABILITY, CORRECTNESS, RELIABILITY, or FITNESS FOR A PARTICULAR
      PURPOSE, all of which are hereby disclaimed.  You are solely responsible
      for determining the appropriateness of using or redistributing Works and
      assume any risks associated with Your exercise of permissions under the
      applicable License for such Works.

  11. Limited Indemnity.

    (a) Indemnity.  Micro Services will defend, indemnify and hold You harmless
        against any third party claims, liabilities or expenses incurred
        (including reasonable attorneys’ fees), as well as amounts finally
        awarded in a settlement or a non-appealable judgement by a court
        ("Losses"), to the extent arising from any claim or allegation by a
        third party that Micro Enterprise infringes or
        misappropriates a valid United States patent, copyright or trade secret
        right of a third party; provided that You give Micro Services: (i)
        prompt written notice of any such claim or allegation; (ii) sole control
        of the defense and settlement thereof; and (iii) reasonable cooperation
        and assistance in such defense or settlement.  If any Work within
        Micro Enterprise becomes or, in Micro Services’ opinion,
        is likely to become, the subject of an injunction, Micro Services may,
        at its option, (A) procure for You the right to continue using such
        Work, (B) replace or modify such Work so that it becomes non-infringing
        without substantially compromising its functionality, or, if (A) and (B)
        are not commercially practicable, then (C) terminate Your license to the
        allegedly infringing Work and refund to You a prorated portion of the
        prepaid and unearned fees for such infringing Work.  The foregoing
        states the entire liability of Micro Services with respect to
        infringement of patents, copyrights, trade secrets or other intellectual
        property rights.

    (b) Exclusions.  The foregoing obligations shall not apply to: (i) Works
        modified by any party other than Micro Services (including Enterprise
        Derivative Works and Contributions), if the alleged infringement relates
        to such modification, (ii) Works combined or bundled with any products,
        processes or materials not provided by Micro Services where the alleged
        infringement relates to such combination, (iii) use of a version of
        Micro Enterprise other than the version that was current
        at the time of such use, as long as a non-infringing version had been
        released, (iv) any Works created to Your specifications, (v)
        infringement or misappropriation of any proprietary right in which You
        have an interest, or (vi) Third Party Works.  You will defend, indemnify
        and hold Micro Services harmless against any Losses arising from any
        such claim or allegation, subject to conditions reciprocal to those in
        Section 11(a).

  12. Limitation of Liability.  In no event and under no legal or equitable
      theory, whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts), and notwithstanding anything in this Agreement to the
      contrary, shall Licensor or any Contributor be liable to You for (i) any
      amounts in excess, in the aggregate, of the fees paid by You to Micro
      Services under this Agreement in the twelve (12) months preceding the date the
      first cause of liability arose), or (ii) any indirect, special,
      incidental, punitive, exemplary, reliance, or consequential damages of any
      character arising as a result of this Agreement or out of the use or
      inability to use the Work (including but not limited to damages for loss
      of goodwill, profits, data or data use, work stoppage, computer failure or
      malfunction, cost of procurement of substitute goods, technology or
      services, or any and all other commercial damages or losses), even if such
      Licensor or Contributor has been advised of the possibility of such
      damages. THESE LIMITATIONS SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE
      ESSENTIAL PURPOSE OF ANY LIMITED REMEDY.

  13. Accepting Warranty or Additional Liability.  While redistributing Works or
      Derivative Works thereof, and without limiting your obligations under
      Section 6, 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 Micro Services and each other Contributor harmless for
      any liability incurred by, or claims asserted against, such Contributor by
      reason of your accepting any such warranty or additional liability.

  14. General.

    (a) Relationship of Parties.  You and Micro Services are independent
        contractors, and nothing herein shall be deemed to constitute either
        party as the agent or representative of the other or both parties as
        joint venturers or partners for any purpose.

    (b) Export Control.  You shall comply with the U.S. Foreign Corrupt
        Practices Act and all applicable export laws, restrictions and
        regulations of the U.S. Department of Commerce, and any other applicable
        U.S. and foreign authority.

    (c) Assignment.  This Agreement and the rights and obligations herein may
        not be assigned or transferred, in whole or in part, by You without the
        prior written consent of Micro Services.  Any assignment in violation of
        this provision is void.  This Agreement shall be binding upon, and inure
        to the benefit of, the successors and permitted assigns of the parties.

    (d) Governing Law.  This Agreement shall be governed by and construed under
        the laws of the State of New York and the United States without regard
        to conflicts of laws provisions thereof, and without regard to the
        Uniform Computer Information Transactions Act.

    (e) Attorneys’ Fees.  In any action or proceeding to enforce rights under
        this Agreement, the prevailing party shall be entitled to recover its
        costs, expenses and attorneys’ fees.

    (f) Severability.  If any provision of this Agreement is held to be invalid,
        illegal or unenforceable in any respect, that provision shall be limited
        or eliminated to the minimum extent necessary so that this Agreement
        otherwise remains in full force and effect and enforceable.

    (g) Entire Agreement; Waivers; Modification.  This Agreement constitutes the
        entire agreement between the parties relating to the subject matter
        hereof and supersedes all proposals, understandings, or discussions,
        whether written or oral, relating to the subject matter of this
        Agreement and all past dealing or industry custom. The failure of either
        party to enforce its rights under this Agreement at any time for any
        period shall not be construed as a waiver of such rights. No changes,
        modifications or waivers to this Agreement will be effective unless in
        writing and signed by both parties.
`
const license_mumax_lre = `//** github.com/jcvernaleo/3@v3.9.2+incompatible **//



Mumax3 GPU-accelerated micromagnetic simulator
Copyright (C) 2012-2014  Arne Vansteenkiste.
Contributions by Ahmad Syukri, Colin Jermain, Jonathan Leliaert, Mykola Dvornik.

Mumax3 is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

Mumax3 uses svgo (http://github.com/ajstarks/svgo), copyright Anthony Starks,
licensed under the Creative Commons Attribution 3.0 license 
as described in http://creativecommons.org/licenses/by/3.0/us/ .

Mumax3 uses freetype-go (http://code.google.com/p/freetype-go/), 
copyright Google Inc., Jeff R. Allen, Rémy Oudompheng, Roger Peppe,
licensed under the FreeType License or the GNU General Public License (GPL), version 2 or later. 

Mumax3 uses CUDA libraries, copyright NVIDIA.
`
const license_mynewt_lre = `//**
source: https://github.com/apache/mynewt-artifact/blob/v0.0.15/LICENSE
**//


//**
Apache License 2.0
https://spdx.org/licenses/Apache-2.0.json
http://www.apache.org/licenses/LICENSE-2.0
https://opensource.org/licenses/Apache-2.0

exceptions:
  (( i || properties ))		https://github.com/apache/rocketmq-client-go/issues/590
  (( except || expect ))	https://github.com/Dwarfartisan/goparsec2/issues/6
  __1__ License, etc.		github.com/ltto/gomybatis@v5.1.7+incompatible and several others
**//

((
	((This program is))??
	((Licensed || licenses this __1__))
	((to you))??
	under the Apache License, Version 2.0
	(( (the "License") ))??
	((
		((and))??
		you may not use __5__
		except in compliance with the
		((License || Apache License Version 2.0))
	))??

	((
		((
			A copy of the
			((Apache-2.0))??
			License is located
		||
			You may obtain a copy of the
			((
				((Apache-2.0))??
				License
			||
				Apache License Version 2.0
			))
			((in the LICENSE file or))??
		))
		at
		((the following location))??
	))??

	((
		((http))??
		((www))??
		.apache.org/licenses/LICENSE-2.0
		((html))??
	||
		((http))??
		aws.amazon.com/apache2.0/
	))??

	((or in the license file accompanying this
		((file. || software.))
	))??

	((
		((As well as the file __10__))??
		((
			((Unless required by applicable law or agreed to in writing,))??
			((
				this file
			||
				software distributed under the
				((License || Apache License Version 2.0))
			))
			is distributed on an "AS IS" BASIS,
			WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
			either express or implied.
		||
			
((DISCLAIMER))??
((2.))??

THE
((SOFTWARE || MATERIALS))
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 || WILL))
__6__ BE LIABLE
FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION
((OF || F))
CONTRACT,
((TORT || FART))
OR OTHERWISE,
ARISING FROM, OUT OF OR
((IN || I))
CONNECTION WITH
((TE || THE))
((SOFTWARE || MATERIALS))
OR THE USE OR OTHER DEALINGS IN
((THE
	((SOFTWARE || MATERIALS))
))??

		||
			THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
			KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
			WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
			MERCHANTABLITY OR NON-INFRINGEMENT.
		))
	))??

	((
		See the
		((License || Apache Version 2.0 License || Apache License Version 2.0))
		for
		((the))??
		specific language governing permissions and limitations
		((thereunder || there under || under the License.))
	))??

||

(( 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 __1__ document.

      (("Licensor" || "Restream"))
      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 __1__ definition, "control" means (
      (( i || properties || k ))
      ) 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 __1__ 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 || pointer ))
      //** voyagermesh.dev_voyager **//

      "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 __1__ 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 __1__ definition, "submitted" means any form of electronic,
      verbal, or written
      ((communication || token))
      sent to the Licensor or its
      representatives, including but not limited to
      ((communication || token))
      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 || token))
      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 __1__
   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 __1__ License,
   each Contributor hereby grants to You a perpetual, worldwide, non-exclusive,
   no-charge, royalty-free, irrevocable (
   (( except || expect ))
   as stated in __1__ 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 || luit))
   ) 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 __1__ 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:

      (( 1. || (a) ))??
      You must give any other recipients of the Work or Derivative Works a copy
      of __1__ License; and

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

      (( 3. || 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

      (( 4. || (d) || (c) ))??
      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.

      (( 5. ))??
      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
      __1__ 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 __1__ 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. __1__ License does not grant permission to use the trade names,
   trademarks, service marks, or product names of the Licensor,
   (( except || expect ))
   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 __1__ 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 __1__ 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 __1__ 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.

(( END OF TERMS AND CONDITIONS ))??

((
APPENDIX: How to apply the Apache License to your work.

To apply the Apache License to your work, attach the following boilerplate
notice, with the fields enclosed by brackets "[]" replaced with your own
identifying information. (Don't include the brackets!) The text should be
enclosed in the appropriate comment syntax for the file format. We also
recommend that a file or class name and description of purpose be included on
the same "printed page" as the copyright notice for easier identification within
third-party archives.

	Copyright __20__

	Licensed under the Apache License, Version 2.0 (the "License");
	you may not use __1__ file
	(( except || expect ))
	in compliance with the License.
	You may obtain a copy of the License at

	http:/www.apache.org/licenses/LICENSE-2.0

	Unless required by applicable law or agreed to in writing, software
	distributed under the License is distributed on an "AS IS" BASIS,
	WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
	
	See the License for the specific language governing permissions and
	limitations under the License.
))??

))

//** from github.com/jsccast/rocksdb@v0.0.0-20150219174706-b65d32cc6e76/LICENSE **//

((
	Portions Copyright __5__

	

Permission is hereby granted,
((free of charge))??
to any person obtaining a copy of
__7__ //** (allow parenthetical descriptions) **//
((and associated documentation files))??
((
	the
	((Software || Materials || â€œSoftwareâ€))
||
//** Using a __1__ wildcard here causes some licenses to fail to match. **//
	Clausify
||
	EchoWBT
))
to deal in the
((Software || Materials))
((under the copyrights))??
((without restriction))??
including
((without limitation))??
the rights
((to))??
use, copy, modify, merge,
((
    publish, distribute,
    ((sublicense))??
    ((
	    and/or
	    ((sell))??
	    ((modified))??
    ))??
    copies of the
    ((Software || Materials))
))??
((
    and to permit persons to whom the
    ((Software is || Materials are))
    furnished to do so,
))??

subject to
((the following || all))
conditions:

	
__1__
((
	The above
	((copyright || authorship))
	notice
	(( and
		((this permission || thismssion))
		notice
		((including the next paragraph))??
	|| as well as this permission notice
	|| this permission notice, and the below disclaimer
	|| and every other copyright notice found in this software,
		and all the attributions in every file, and this permission notice
	|| and this permission notice (or reference to this permission notice) ))
||
	This permission notice
))
((must || shall))
be included in all
copies
or
((substantial || any))??
portions of the
((Software || Materials))
(( (Unless stated in separate file). ))??

))??


This product bundles pretty, which is available under the MIT license.  For
details, see:
     * newt/vendor/github.com/kr/pretty/License
     * newtmgr/vendor/github.com/kr/pretty/License

This product bundles kr/text, which is available under the MIT license.  For
details, see:
     * newt/vendor/github.com/kr/text/License
     * newtmgr/vendor/github.com/kr/text/License

This product bundles mapstructure, which is available under the MIT license.
For details, see:
    * newt/vendor/github.com/mitchellh/mapstructure/LICENSE
    * newtmgr/vendor/github.com/mitchellh/mapstructure/LICENSE

This product bundles logrus, which is available under the MIT license.  For
details, see:
    * newt/vendor/github.com/sirupsen/logrus/LICENSE
    * newtmgr/vendor/github.com/sirupsen/logrus/LICENSE

This product bundles Cast, which is available under the MIT license.  For
details, see:
    * newt/vendor/github.com/spf13/cast/LICENSE
    * newtmgr/vendor/github.com/spf13/cast/LICENSE

This product bundles jWalterWeatherman, which is available under the MIT
license.  For details, see:
    * newt/vendor/github.com/spf13/jwalterweatherman/LICENSE
    * newtmgr/vendor/github.com/spf13/jwalterweatherman/LICENSE

This product bundles pflag, which is available under the "3-clause BSD"
license.  For details, see:
    * newt/vendor/github.com/spf13/pflag/LICENSE
    * newtmgr/vendor/github.com/spf13/pflag/LICENSE

This product bundles the unix Go package, which is available under the
"3-clause BSD" license.  For details, see:
    * newt/vendor/golang.org/x/sys/LICENSE
    * newtmgr/vendor/golang.org/x/sys/LICENSE

This product bundles fsnotify.v1, which is available under the "3-clause BSD"
license.  For details, see:
    * newt/vendor/gopkg.in/fsnotify.v1/LICENSE
    * newtmgr/vendor/gopkg.in/fsnotify.v1/LICENSE

This product bundles yaml.v2's Go port of libyaml, which is available under the
MIT license.  For details, see:
    * newt/vendor/mynewt.apache.org/newt/yaml/apic.go
    * newt/vendor/mynewt.apache.org/newt/yaml/emitterc.go
    * newt/vendor/mynewt.apache.org/newt/yaml/parserc.go
    * newt/vendor/mynewt.apache.org/newt/yaml/readerc.go
    * newt/vendor/mynewt.apache.org/newt/yaml/scannerc.go
    * newt/vendor/mynewt.apache.org/newt/yaml/writerc.go
    * newt/vendor/mynewt.apache.org/newt/yaml/yamlh.go
    * newt/vendor/mynewt.apache.org/newt/yaml/yamlprivateh.go
    * newtmgr/vendor/mynewt.apache.org/newt/yaml/apic.go
    * newtmgr/vendor/mynewt.apache.org/newt/yaml/emitterc.go
    * newtmgr/vendor/mynewt.apache.org/newt/yaml/parserc.go
    * newtmgr/vendor/mynewt.apache.org/newt/yaml/readerc.go
    * newtmgr/vendor/mynewt.apache.org/newt/yaml/scannerc.go
    * newtmgr/vendor/mynewt.apache.org/newt/yaml/writerc.go
    * newtmgr/vendor/mynewt.apache.org/newt/yaml/yamlh.go
    * newtmgr/vendor/mynewt.apache.org/newt/yaml/yamlprivateh.go
    * yaml/apic.go
    * yaml/emitterc.go
    * yaml/parserc.go
    * yaml/readerc.go
    * yaml/scannerc.go
    * yaml/writerc.go
    * yaml/yamlh.go
    * yaml/yamlprivateh.go

This product bundles viper, which is available under the MIT license.  For
details, see:
    * newt/vendor/mynewt.apache.org/newt/viper/LICENSE
    * newtmgr/vendor/mynewt.apache.org/newt/viper/LICENSE
    * viper/LICENSE

This product bundles go-crc16, which is available under the MIT license.  For
details, see:
    * newtmgr/vendor/github.com/joaojeronimo/go-crc16/README.md

This product bundles GATT, which is available under the "3-clause BSD" license.
For details, see:
    * newtmgr/vendor/github.com/runtimeinc/gatt

This product bundles xpc, which is available under the MIT license.  For
details, see:
    * newtmgr/vendor/github.com/runtimeinc/gatt/xpc/LICENSE

This product bundles gioctl, which is available under the MIT license.  For
details, see:
    * newtmgr/vendor/github.com/runtimeinc/gatt/linux/gioctl/LICENSE.md

This product bundles tarm/serial, which is available under the "3-clause BSD"
license.  For details, see:
    * newtmgr/vendor/github.com/tarm/serial/LICENSE

This product bundles ugorji/go/codec, which is available under the MIT license.
For details, see:
    * newtmgr/vendor/github.com/ugorji/go/LICENSE

This product bundles go-coap which is available under the MIT license.
For details, see:
    * newtmgr/vendor/github.com/dustin/go-coap/LICENSE

This product bundles go-homedir which is available under the MIT license.
For details, see:
    * newtmgr/vendor/github.com/mitchellh/go-homedir/LICENSE
`
const license_newtmgr_lre = `//**
source: https://github.com/apache/mynewt-artifact/blob/v0.0.15/LICENSE
**//

//**
Apache License 2.0
https://spdx.org/licenses/Apache-2.0.json
http://www.apache.org/licenses/LICENSE-2.0
https://opensource.org/licenses/Apache-2.0

exceptions:
  (( i || properties ))		https://github.com/apache/rocketmq-client-go/issues/590
  (( except || expect ))	https://github.com/Dwarfartisan/goparsec2/issues/6
  __1__ License, etc.		github.com/ltto/gomybatis@v5.1.7+incompatible and several others
**//

((
	((This program is))??
	((Licensed || licenses this __1__))
	((to you))??
	under the Apache License, Version 2.0
	(( (the "License") ))??
	((
		((and))??
		you may not use __5__
		except in compliance with the
		((License || Apache License Version 2.0))
	))??

	((
		((
			A copy of the
			((Apache-2.0))??
			License is located
		||
			You may obtain a copy of the
			((
				((Apache-2.0))??
				License
			||
				Apache License Version 2.0
			))
			((in the LICENSE file or))??
		))
		at
		((the following location))??
	))??

	((
		((http))??
		((www))??
		.apache.org/licenses/LICENSE-2.0
		((html))??
	||
		((http))??
		aws.amazon.com/apache2.0/
	))??

	((or in the license file accompanying this
		((file. || software.))
	))??

	((
		((As well as the file __10__))??
		((
			((Unless required by applicable law or agreed to in writing,))??
			((
				this file
			||
				software distributed under the
				((License || Apache License Version 2.0))
			))
			is distributed on an "AS IS" BASIS,
			WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
			either express or implied.
		||
			
((DISCLAIMER))??
((2.))??

THE
((SOFTWARE || MATERIALS))
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 || WILL))
__6__ BE LIABLE
FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION
((OF || F))
CONTRACT,
((TORT || FART))
OR OTHERWISE,
ARISING FROM, OUT OF OR
((IN || I))
CONNECTION WITH
((TE || THE))
((SOFTWARE || MATERIALS))
OR THE USE OR OTHER DEALINGS IN
((THE
	((SOFTWARE || MATERIALS))
))??

		||
			THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
			KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
			WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
			MERCHANTABLITY OR NON-INFRINGEMENT.
		))
	))??

	((
		See the
		((License || Apache Version 2.0 License || Apache License Version 2.0))
		for
		((the))??
		specific language governing permissions and limitations
		((thereunder || there under || under the License.))
	))??

||

(( 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 __1__ document.

      (("Licensor" || "Restream"))
      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 __1__ definition, "control" means (
      (( i || properties || k ))
      ) 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 __1__ 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 || pointer ))
      //** voyagermesh.dev_voyager **//

      "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 __1__ 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 __1__ definition, "submitted" means any form of electronic,
      verbal, or written
      ((communication || token))
      sent to the Licensor or its
      representatives, including but not limited to
      ((communication || token))
      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 || token))
      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 __1__
   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 __1__ License,
   each Contributor hereby grants to You a perpetual, worldwide, non-exclusive,
   no-charge, royalty-free, irrevocable (
   (( except || expect ))
   as stated in __1__ 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 || luit))
   ) 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 __1__ 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:

      (( 1. || (a) ))??
      You must give any other recipients of the Work or Derivative Works a copy
      of __1__ License; and

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

      (( 3. || 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

      (( 4. || (d) || (c) ))??
      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.

      (( 5. ))??
      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
      __1__ 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 __1__ 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. __1__ License does not grant permission to use the trade names,
   trademarks, service marks, or product names of the Licensor,
   (( except || expect ))
   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 __1__ 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 __1__ 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 __1__ 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.

(( END OF TERMS AND CONDITIONS ))??

((
APPENDIX: How to apply the Apache License to your work.

To apply the Apache License to your work, attach the following boilerplate
notice, with the fields enclosed by brackets "[]" replaced with your own
identifying information. (Don't include the brackets!) The text should be
enclosed in the appropriate comment syntax for the file format. We also
recommend that a file or class name and description of purpose be included on
the same "printed page" as the copyright notice for easier identification within
third-party archives.

	Copyright __20__

	Licensed under the Apache License, Version 2.0 (the "License");
	you may not use __1__ file
	(( except || expect ))
	in compliance with the License.
	You may obtain a copy of the License at

	http:/www.apache.org/licenses/LICENSE-2.0

	Unless required by applicable law or agreed to in writing, software
	distributed under the License is distributed on an "AS IS" BASIS,
	WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
	
	See the License for the specific language governing permissions and
	limitations under the License.
))??

))

//** from github.com/jsccast/rocksdb@v0.0.0-20150219174706-b65d32cc6e76/LICENSE **//

((
	Portions Copyright __5__

	

Permission is hereby granted,
((free of charge))??
to any person obtaining a copy of
__7__ //** (allow parenthetical descriptions) **//
((and associated documentation files))??
((
	the
	((Software || Materials || â€œSoftwareâ€))
||
//** Using a __1__ wildcard here causes some licenses to fail to match. **//
	Clausify
||
	EchoWBT
))
to deal in the
((Software || Materials))
((under the copyrights))??
((without restriction))??
including
((without limitation))??
the rights
((to))??
use, copy, modify, merge,
((
    publish, distribute,
    ((sublicense))??
    ((
	    and/or
	    ((sell))??
	    ((modified))??
    ))??
    copies of the
    ((Software || Materials))
))??
((
    and to permit persons to whom the
    ((Software is || Materials are))
    furnished to do so,
))??

subject to
((the following || all))
conditions:

	
__1__
((
	The above
	((copyright || authorship))
	notice
	(( and
		((this permission || thismssion))
		notice
		((including the next paragraph))??
	|| as well as this permission notice
	|| this permission notice, and the below disclaimer
	|| and every other copyright notice found in this software,
		and all the attributions in every file, and this permission notice
	|| and this permission notice (or reference to this permission notice) ))
||
	This permission notice
))
((must || shall))
be included in all
copies
or
((substantial || any))??
portions of the
((Software || Materials))
(( (Unless stated in separate file). ))??

))??


This product bundles pretty, which is available under the MIT license. For
details, see:
    * vendor/github.com/kr/pretty/License

This product bundles kr/text, which is available under the MIT license. For
details, see:
    * vendor/github.com/kr/text/License

This product bundles mapstructure, which is available under the MIT license.
For details, see:
    * vendor/github.com/mitchellh/mapstructure/LICENSE

This product bundles logrus, which is available under the MIT license. For
details, see:
    * vendor/github.com/Sirupsen/logrus/LICENSE

This product bundles Cast, which is available under the MIT license. For
details, see:
    * vendor/github.com/spf13/cast/LICENSE

This product bundles jWalterWeatherman, which is available under the MIT
license. For details, see:
    * vendor/github.com/spf13/jwalterweatherman/LICENSE

This product bundles pflag, which is available under the "3-clause BSD"
license. For details, see:
    * vendor/github.com/spf13/pflag/LICENSE

This product bundles the unix Go package, which is available under the
"3-clause BSD" license. For details, see:
    * vendor/golang.org/x/sys/LICENSE

This product bundles the Go supplementary cryptography libraries package,
which is available under the "3-clause BSD" license. For details, see:
    * vendor/golang.org/x/crypto/LICENSE

This product bundles the Go supplementary networking libraries package, which
is available under the "3-clause BSD" license. For details, see:
    * vendor/golang.org/x/net/LICENSE

This product bundles fsnotify.v1, which is available under the "3-clause BSD"
license. For details, see:
    * vendor/gopkg.in/fsnotify.v1/LICENSE

This product bundles yaml.v2's Go port of libyaml, which is available under the
MIT license. For details, see:
    * vendor/mynewt.apache.org/newt/yaml/apic.go
    * vendor/mynewt.apache.org/newt/yaml/emitterc.go
    * vendor/mynewt.apache.org/newt/yaml/parserc.go
    * vendor/mynewt.apache.org/newt/yaml/readerc.go
    * vendor/mynewt.apache.org/newt/yaml/scannerc.go
    * vendor/mynewt.apache.org/newt/yaml/writerc.go
    * vendor/mynewt.apache.org/newt/yaml/yamlh.go
    * vendor/mynewt.apache.org/newt/yaml/yamlprivateh.go

This product bundles viper, which is available under the MIT license. For
details, see:
    * vendor/mynewt.apache.org/newt/viper/LICENSE

This product bundles pb, which is available under the "3-clause BSD" license.
For details, see:
    * vendor/github.com/cheggaaa/pb/LICENSE

This product bundles ble, which is available under the "3-clause BSD" license.
For details, see:
    * vendor/github.com/currantlabs/ble/LICENSE

This product bundles structs, which is available under the MIT license. For
details, see:
    * vendor/github.com/fatih/structs/LICENSE

This product bundles structs, which is available under the Apache License 2.0.
For details, see:
    * vendor/github.com/inconshreveable/mousetrap/LICENSE

This product bundles go-crc16, which is available under the MIT license. For
details, see:
    * vendor/github.com/joaojeronimo/go-crc16/README.md

This product bundles ansi, which is available under the MIT license. For
details, see:
    * vendor/github.com/mgutz/ansi/LICENSE

This product bundles logxi, which is available under the MIT license. For
details, see:
    * vendor/github.com/mgutz/logxi/LICENSE

This product bundles go-homedir, which is available under the MIT license. For
details, see:
    * vendor/github.com/mitchellh/go-homedir/LICENSE

This product bundles go-codec, which is available under the MIT license. For
details, see:
    * vendor/github.com/ugorji/go/LICENSE

This product bundles goble, which is available under the MIT license. For
details, see:
    * vendor/github.com/raff/goble/LICENSE

This product bundles go-coap, which is available under the MIT license. For
details, see:
    * vendor/github.com/runtimeco/go-coap/LICENSE

This product bundles structs, which is available under the Apache License 2.0.
For details, see:
    * vendor/github.com/spf13/cobra/LICENSE.txt

This product bundles serial, which is available under the "3-clause BSD"
license. For details, see:
    * vendor/github.com/tarm/serial/LICENSE

This product bundles go-colorable, which is available under the MIT license.
For details, see:
    * vendor/github.com/mattn/go-colorable/LICENSE

This product bundles go-runewidth, which is available under the MIT license.
For details, see:
    * vendor/github.com/mattn/go-runewidth/LICENSE

This product bundles go-isatty, which is available under the MIT license.
For details, see:
    * vendor/github.com/mattn/go-isatty/LICENSE

This product bundles readline, which is available under the MIT license.
For details, see:
    * vendor/github.com/chzyer/readline/LICENSE

This product bundles go-blel, which is available under the "3-clause BSD"
license. For details, see:
    * vendor/github.com/go-ble/ble/LICENSE

This product bundles ishell.v1, which is available under the MIT license.
For details, see:
    * vendor/gopkg.in/abiosoft/ishell.v1/LICENSE
`
const license_passwordcheck_lre = `//** github.com/dchest/passwordcheck@v0.0.0-20140527112020-b2ea14b685bb **//



Go package written in 2014 by Dmitry Chestnykh.

To the extent possible under law, the author have dedicated all copyright
and related and neighboring rights to this software to the public domain
worldwide. This software is distributed without any warranty.
http://creativecommons.org/publicdomain/zero/1.0/

This package is based on passwdqc.
http://www.openwall.com/passwdqc/

passwdqc license:

Two manual pages (pam_passwdqc.8 and passwdqc.conf.5) are under the
3-clause BSD-style license as specified within the files themselves.

concat.c, wordset_4k.c, wordset_4k.h, pam_macros.h, and pwqcheck.php
are in the public domain, but at your option they may also be used under
this package's license below.

The rest of the files in this package fall under the following terms
(heavily cut-down "BSD license"):

Redistribution and use in source and binary forms, with or without
modification, are permitted.

THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.

$Owl: Owl/packages/passwdqc/passwdqc/LICENSE,v 1.8 2013/04/24 02:01:43 solar Exp $
`
const license_permissive_lre = `//** github.com/twitchyliquid64/golang-asm@v0.15.0 **//



Dual-licensed under MIT and ASLv2, by way of the [Permissive License Stack](https://protocol.ai/blog/announcing-the-permissive-license-stack/).

Apache-2.0: https://www.apache.org/licenses/license-2.0
MIT: https://www.opensource.org/licenses/mit
`
const license_protocol_lre = `//** github.com/ipfs/go-pinning-service-http-client@v0.1.0 **//



The software contents of this repository are Copyright (c) Protocol Labs,
Licensed under the ` + "`" + `Permissive License Stack` + "`" + `, meaning either of:

- Apache-2.0 Software License: https://www.apache.org/licenses/LICENSE-2.0
  ([...4tr2kfsq](https://gateway.ipfs.io/ipfs/bafkreiankqxazcae4onkp436wag2lj3ccso4nawxqkkfckd6cg4tr2kfsq) )

- MIT Software License: https://opensource.org/licenses/MIT
  ([...vljevcba](https://gateway.ipfs.io/ipfs/bafkreiepofszg4gfe2gzuhojmksgemsub2h4uy2gewdnr35kswvljevcba) )

You may not use the contents of this repository except in compliance
with one of the listed Licenses. For an extended clarification of the
intent behind the choice of Licensing please refer to
https://protocol.ai/blog/announcing-the-permissive-license-stack/

Unless required by applicable law or agreed to in writing, software
distributed under the terms listed in this notice is distributed on
an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
either express or implied. See each License for the specific language
governing permissions and limitations under that License.

<!--- SPDX-License-Identifier: Apache-2.0 OR MIT -->
` + "`" + `SPDX-License-Identifier: Apache-2.0 OR MIT` + "`" + ``
const license_rocketlaunchr_lre = `//**
source: https://github.com/rocketlaunchr/dataframe-go/blob/master/LICENSE
**//




Permission is hereby granted,
((free of charge))??
to any person obtaining a copy of
__7__ //** (allow parenthetical descriptions) **//
((and associated documentation files))??
((
	the
	((Software || Materials || â€œSoftwareâ€))
||
//** Using a __1__ wildcard here causes some licenses to fail to match. **//
	Clausify
||
	EchoWBT
))
to deal in the
((Software || Materials))
((under the copyrights))??
((without restriction))??
including
((without limitation))??
the rights
((to))??
use, copy, modify, merge,
((
    publish, distribute,
    ((sublicense))??
    ((
	    and/or
	    ((sell))??
	    ((modified))??
    ))??
    copies of the
    ((Software || Materials))
))??
((
    and to permit persons to whom the
    ((Software is || Materials are))
    furnished to do so,
))??

subject to
((the following || all))
conditions:


__1__
((
	The above
	((copyright || authorship))
	notice
	(( and
		((this permission || thismssion))
		notice
		((including the next paragraph))??
	|| as well as this permission notice
	|| this permission notice, and the below disclaimer
	|| and every other copyright notice found in this software,
		and all the attributions in every file, and this permission notice
	|| and this permission notice (or reference to this permission notice) ))
||
	This permission notice
))
((must || shall))
be included in all
copies
or
((substantial || any))??
portions of the
((Software || Materials))
(( (Unless stated in separate file). ))??


((DISCLAIMER))??
((2.))??

THE
((SOFTWARE || MATERIALS))
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 || WILL))
__6__ BE LIABLE
FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION
((OF || F))
CONTRACT,
((TORT || FART))
OR OTHERWISE,
ARISING FROM, OUT OF OR
((IN || I))
CONNECTION WITH
((TE || THE))
((SOFTWARE || MATERIALS))
OR THE USE OR OTHER DEALINGS IN
((THE
	((SOFTWARE || MATERIALS))
))??


The usage of this software must not be knowingly used for an application 
that will be directly or indirectly used for military purposes.

All forks of this package must be subject to the above provisions.
This only applies to the fork itself and NOT the product(s) derived from this package
or a fork of this package.

`
const license_rwth_lre = `//**
git.rwth-aachen.de/acs/public/ontology/owl/owl2go@v1.1.0
git.rwth-aachen.de/acs/public/ontology/owl/saref@v0.0.0-20200525140909-5b44cbefaa17
git.rwth-aachen.de/acs/public/cloud/mas/clonemap@v0.0.0-20201023111149-5c55954d016e
**//




This project is licensed under either of
- Apache License, Version 2.0 (LICENSE-Apache or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or https://opensource.org/licenses/MIT)
at you option.`
const license_skipper_lre = `//** github.com/SPIEGELTechLab/skipper@v0.10.69 **//



Skipper is in general licensed under the following Apache Version 2.0 license with the exception
of the pathmux subdirectory which is licensed under MIT license (see notice file below).

Copyright 2015 Zalando SE

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.


Notice file for pathmux/

The MIT License (MIT)

Copyright (c) 2014 Daniel Imfeld, 2015 Zalando SE

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.


MODIFICATIONS TO pathmux/tree.go and pathmux/tree_test.go:

02.09.2015 - Exposed the internal tree implementation of http://godoc.org/github.com/dimfeld/httptreemux so that
it can be used to look up arbitrary objects in a Patricia tree.

21.04.2016 - Enabled backtracking in the tree lookup.
`
const license_splunk_lre = `

Copyright 2020 Splunk Inc.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.


Credits
Some of the components included in Splunk Operator for Kubernetes (beta) project are licensed under free or open source licenses. We wish to thank the contributors to those projects.

The following components are licensed under Apache 2.0:

go-logr	v0.1.0
https://github.com/go-logr/logr

operator-framework/operator-sdk v0.15.1	
https://github.com/operator-framework/operator-sdk

k8s.io/api 
Copyright The Kubernetes Authors
https://github.com/kubernetes/api
	
k8s.io/apimachinery 
Copyright the Kubernetes Authors.
https://github.com/kubernetes/apimachinery

k8s.io/client-go v12.0.0+incompatible
Copyright the Kubernetes Authors.
https://github.com/kubernetes/client-go

k8s.io/kubectl 
Copyright The Kubernetes Authors.
https://github.com/kubernetes/kubectl

sigs.k8s.io/controller-runtime v0.4.0
Copyright The Kubernetes Authors.
https://github.com/kubernetes-sigs/controller-runtime

k8s.io/apiextensions-apiserver
Copyright The Kubernetes Authors.
https://github.com/kubernetes/apiextensions-apiserver

k8s.io/cli-runtime
Copyright The Kubernetes Authors.
https://github.com/kubernetes/cli-runtime

k8s.io/cloud-provider
Copyright The Kubernetes Authors.
https://github.com/kubernetes/cloud-provider

k8s.io/cluster-bootstrap
Copyright The Kubernetes Authors.
https://github.com/kubernetes/cluster-bootstrap

k8s.io/code-generator
Copyright The Kubernetes Authors.
https://github.com/kubernetes/code-generator

k8s.io/component-base
Copyright The Kubernetes Authors.
https://github.com/kubernetes/component-base

k8s.io/cri-api
Copyright The Kubernetes Authors.
https://github.com/kubernetes/cri-api

k8s.io/csi-translation-lib
Copyright The Kubernetes Authors.
https://github.com/kubernetes/csi-translation-lib

k8s.io/kube-aggregator
Copyright The Kubernetes Authors.
https://github.com/kubernetes/kube-aggregator

k8s.io/kube-controller-manager
Copyright The Kubernetes Authors.
https://github.com/kubernetes/kube-controller-manager

k8s.io/kube-scheduler
Copyright The Kubernetes Authors.
https://github.com/kubernetes/kube-scheduler

k8s.io/kubelet
Copyright The Kubernetes Authors.
https://github.com/kubernetes/kubelet

k8s.io/legacy-cloud-providers
Copyright The Kubernetes Authors.
https://github.com/kubernetes/legacy-cloud-providers

k8s.io/metrics
Copyright The Kubernetes Authors.
https://github.com/kubernetes/metrics

k8s.io/sample-apiserver
Copyright The Kubernetes Authors.
https://github.com/kubernetes/sample-apiserver

Apache Version 2.0 License

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

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

9.	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:

(9)	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

      © 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.

   END OF TERMS AND CONDITIONS


The following components are licensed under the MIT License:

onsi/ginkgo v1.12.2
Copyright © 2013-2014 Onsi Fakhouri
https://github.com/onsi/ginkgo

onsi/gomega v1.10.1
Copyright © 2013-2014 Onsi Fakhouri
https://github.com/onsi/gomega

MIT License

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.

The following components are licensed as follows:

hashicorp/golang-lru v0.5.4
https://github.com/hashicorp/golang-lru

Mozilla Public License, version 2.0

1. Definitions

1.1. "Contributor"

     means each individual or legal entity that creates, contributes to the
     creation of, or owns Covered Software.

1.2. "Contributor Version"

     means the combination of the Contributions of others (if any) used by a
     Contributor and that particular Contributor's Contribution.

1.3. "Contribution"

     means Covered Software of a particular Contributor.

1.4. "Covered Software"

     means Source Code Form to which the initial Contributor has attached the
     notice in Exhibit A, the Executable Form of such Source Code Form, and
     Modifications of such Source Code Form, in each case including portions
     thereof.

1.5. "Incompatible With Secondary Licenses"
     means

     a. that the initial Contributor has attached the notice described in
        Exhibit B to the Covered Software; or

     b. that the Covered Software was made available under the terms of
        version 1.1 or earlier of the License, but not also under the terms of
        a Secondary License.

1.6. "Executable Form"

     means any form of the work other than Source Code Form.

1.7. "Larger Work"

     means a work that combines Covered Software with other material, in a
     separate file or files, that is not Covered Software.

1.8. "License"

     means this document.

1.9. "Licensable"

     means having the right to grant, to the maximum extent possible, whether
     at the time of the initial grant or subsequently, any and all of the
     rights conveyed by this License.

1.10. "Modifications"

     means any of the following:

     a. any file in Source Code Form that results from an addition to,
        deletion from, or modification of the contents of Covered Software; or

     b. any new file in Source Code Form that contains any Covered Software.

1.11. "Patent Claims" of a Contributor

      means any patent claim(s), including without limitation, method,
      process, and apparatus claims, in any patent Licensable by such
      Contributor that would be infringed, but for the grant of the License,
      by the making, using, selling, offering for sale, having made, import,
      or transfer of either its Contributions or its Contributor Version.

1.12. "Secondary License"

      means either the GNU General Public License, Version 2.0, the GNU Lesser
      General Public License, Version 2.1, the GNU Affero General Public
      License, Version 3.0, or any later versions of those licenses.

1.13. "Source Code Form"

      means the form of the work preferred for making modifications.

1.14. "You" (or "Your")

      means an individual or a legal entity exercising rights under this
      License. For legal entities, "You" includes any entity that controls, is
      controlled by, or is under common control with You. For purposes of this
      definition, "control" means (a) the power, direct or indirect, to cause
      the direction or management of such entity, whether by contract or
      otherwise, or (b) ownership of more than fifty percent (50%) of the
      outstanding shares or beneficial ownership of such entity.


2. License Grants and Conditions

2.1. Grants

     Each Contributor hereby grants You a world-wide, royalty-free,
     non-exclusive license:

     a. under intellectual property rights (other than patent or trademark)
        Licensable by such Contributor to use, reproduce, make available,
        modify, display, perform, distribute, and otherwise exploit its
        Contributions, either on an unmodified basis, with Modifications, or
        as part of a Larger Work; and

     b. under Patent Claims of such Contributor to make, use, sell, offer for
        sale, have made, import, and otherwise transfer either its
        Contributions or its Contributor Version.

2.2. Effective Date

     The licenses granted in Section 2.1 with respect to any Contribution
     become effective for each Contribution on the date the Contributor first
     distributes such Contribution.

2.3. Limitations on Grant Scope

     The licenses granted in this Section 2 are the only rights granted under
     this License. No additional rights or licenses will be implied from the
     distribution or licensing of Covered Software under this License.
     Notwithstanding Section 2.1(b) above, no patent license is granted by a
     Contributor:

     a. for any code that a Contributor has removed from Covered Software; or

     b. for infringements caused by: (i) Your and any other third party's
        modifications of Covered Software, or (ii) the combination of its
        Contributions with other software (except as part of its Contributor
        Version); or

     c. under Patent Claims infringed by Covered Software in the absence of
        its Contributions.

     This License does not grant any rights in the trademarks, service marks,
     or logos of any Contributor (except as may be necessary to comply with
     the notice requirements in Section 3.4).

2.4. Subsequent Licenses

     No Contributor makes additional grants as a result of Your choice to
     distribute the Covered Software under a subsequent version of this
     License (see Section 10.2) or under the terms of a Secondary License (if
     permitted under the terms of Section 3.3).

2.5. Representation

     Each Contributor represents that the Contributor believes its
     Contributions are its original creation(s) or it has sufficient rights to
     grant the rights to its Contributions conveyed by this License.

2.6. Fair Use

     This License is not intended to limit any rights You have under
     applicable copyright doctrines of fair use, fair dealing, or other
     equivalents.

2.7. Conditions

     Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in
     Section 2.1.


3. Responsibilities

3.1. Distribution of Source Form

     All distribution of Covered Software in Source Code Form, including any
     Modifications that You create or to which You contribute, must be under
     the terms of this License. You must inform recipients that the Source
     Code Form of the Covered Software is governed by the terms of this
     License, and how they can obtain a copy of this License. You may not
     attempt to alter or restrict the recipients' rights in the Source Code
     Form.

3.2. Distribution of Executable Form

     If You distribute Covered Software in Executable Form then:

     a. such Covered Software must also be made available in Source Code Form,
        as described in Section 3.1, and You must inform recipients of the
        Executable Form how they can obtain a copy of such Source Code Form by
        reasonable means in a timely manner, at a charge no more than the cost
        of distribution to the recipient; and

     b. You may distribute such Executable Form under the terms of this
        License, or sublicense it under different terms, provided that the
        license for the Executable Form does not attempt to limit or alter the
        recipients' rights in the Source Code Form under this License.

3.3. Distribution of a Larger Work

     You may create and distribute a Larger Work under terms of Your choice,
     provided that You also comply with the requirements of this License for
     the Covered Software. If the Larger Work is a combination of Covered
     Software with a work governed by one or more Secondary Licenses, and the
     Covered Software is not Incompatible With Secondary Licenses, this
     License permits You to additionally distribute such Covered Software
     under the terms of such Secondary License(s), so that the recipient of
     the Larger Work may, at their option, further distribute the Covered
     Software under the terms of either this License or such Secondary
     License(s).

3.4. Notices

     You may not remove or alter the substance of any license notices
     (including copyright notices, patent notices, disclaimers of warranty, or
     limitations of liability) contained within the Source Code Form of the
     Covered Software, except that You may alter any license notices to the
     extent required to remedy known factual inaccuracies.

3.5. Application of Additional Terms

     You may choose to offer, and to charge a fee for, warranty, support,
     indemnity or liability obligations to one or more recipients of Covered
     Software. However, You may do so only on Your own behalf, and not on
     behalf of any Contributor. You must make it absolutely clear that any
     such warranty, support, indemnity, or liability obligation is offered by
     You alone, and You hereby agree to indemnify every Contributor for any
     liability incurred by such Contributor as a result of warranty, support,
     indemnity or liability terms You offer. You may include additional
     disclaimers of warranty and limitations of liability specific to any
     jurisdiction.

4. Inability to Comply Due to Statute or Regulation

   If it is impossible for You to comply with any of the terms of this License
   with respect to some or all of the Covered Software due to statute,
   judicial order, or regulation then You must: (a) comply with the terms of
   this License to the maximum extent possible; and (b) describe the
   limitations and the code they affect. Such description must be placed in a
   text file included with all distributions of the Covered Software under
   this License. Except to the extent prohibited by statute or regulation,
   such description must be sufficiently detailed for a recipient of ordinary
   skill to be able to understand it.

5. Termination

5.1. The rights granted under this License will terminate automatically if You
     fail to comply with any of its terms. However, if You become compliant,
     then the rights granted under this License from a particular Contributor
     are reinstated (a) provisionally, unless and until such Contributor
     explicitly and finally terminates Your grants, and (b) on an ongoing
     basis, if such Contributor fails to notify You of the non-compliance by
     some reasonable means prior to 60 days after You have come back into
     compliance. Moreover, Your grants from a particular Contributor are
     reinstated on an ongoing basis if such Contributor notifies You of the
     non-compliance by some reasonable means, this is the first time You have
     received notice of non-compliance with this License from such
     Contributor, and You become compliant prior to 30 days after Your receipt
     of the notice.

5.2. If You initiate litigation against any entity by asserting a patent
     infringement claim (excluding declaratory judgment actions,
     counter-claims, and cross-claims) alleging that a Contributor Version
     directly or indirectly infringes any patent, then the rights granted to
     You by any and all Contributors for the Covered Software under Section
     2.1 of this License shall terminate.

5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user
     license agreements (excluding distributors and resellers) which have been
     validly granted by You or Your distributors under this License prior to
     termination shall survive termination.

6. Disclaimer of Warranty

   Covered Software is provided under this License on an "as is" basis,
   without warranty of any kind, either expressed, implied, or statutory,
   including, without limitation, warranties that the Covered Software is free
   of defects, merchantable, fit for a particular purpose or non-infringing.
   The entire risk as to the quality and performance of the Covered Software
   is with You. Should any Covered Software prove defective in any respect,
   You (not any Contributor) assume the cost of any necessary servicing,
   repair, or correction. This disclaimer of warranty constitutes an essential
   part of this License. No use of  any Covered Software is authorized under
   this License except under this disclaimer.

7. Limitation of Liability

   Under no circumstances and under no legal theory, whether tort (including
   negligence), contract, or otherwise, shall any Contributor, or anyone who
   distributes Covered Software as permitted above, be liable to You for any
   direct, indirect, special, incidental, or consequential damages of any
   character including, without limitation, damages for lost profits, loss of
   goodwill, work stoppage, computer failure or malfunction, or any and all
   other commercial damages or losses, even if such party shall have been
   informed of the possibility of such damages. This limitation of liability
   shall not apply to liability for death or personal injury resulting from
   such party's negligence to the extent applicable law prohibits such
   limitation. Some jurisdictions do not allow the exclusion or limitation of
   incidental or consequential damages, so this exclusion and limitation may
   not apply to You.

8. Litigation

   Any litigation relating to this License may be brought only in the courts
   of a jurisdiction where the defendant maintains its principal place of
   business and such litigation shall be governed by laws of that
   jurisdiction, without reference to its conflict-of-law provisions. Nothing
   in this Section shall prevent a party's ability to bring cross-claims or
   counter-claims.

9. Miscellaneous

   This License represents the complete agreement concerning the subject
   matter hereof. If any provision of this License is held to be
   unenforceable, such provision shall be reformed only to the extent
   necessary to make it enforceable. Any law or regulation which provides that
   the language of a contract shall be construed against the drafter shall not
   be used to construe this License against a Contributor.


10. Versions of the License

10.1. New Versions

      Mozilla Foundation is the license steward. Except as provided in Section
      10.3, no one other than the license steward has the right to modify or
      publish new versions of this License. Each version will be given a
      distinguishing version number.

10.2. Effect of New Versions

      You may distribute the Covered Software under the terms of the version
      of the License under which You originally received the Covered Software,
      or under the terms of any subsequent version published by the license
      steward.

10.3. Modified Versions

      If you create software not governed by this License, and you want to
      create a new license for such software, you may create and use a
      modified version of this License if you rename the license and remove
      any references to the name of the license steward (except to note that
      such modified license differs from this License).

10.4. Distributing Source Code Form that is Incompatible With Secondary
      Licenses If You choose to distribute Source Code Form that is
      Incompatible With Secondary Licenses under the terms of this version of
      the License, the notice described in Exhibit B of this License must be
      attached.

Exhibit A - Source Code Form License Notice

      This Source Code Form is subject to the
      terms of the Mozilla Public License, v.
      2.0. If a copy of the MPL was not
      distributed with this file, You can
      obtain one at
      http://mozilla.org/MPL/2.0/.

If it is not possible or desirable to put the notice in a particular file,
then You may include the notice in a location (such as a LICENSE file in a
relevant directory) where a recipient would be likely to look for such a
notice.

You may add additional accurate notices of copyright ownership.

Exhibit B - "Incompatible With Secondary Licenses" Notice

      This Source Code Form is "Incompatible
      With Secondary Licenses", as defined by
      the Mozilla Public License, v. 2.0.

spf13/pflag v1.0.5
Copyright (c) 2012 Alex Ogier. All rights reserved.
Copyright (c) 2012 The Go Authors. All rights reserved.
https://github.com/spf13/pflag
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

   * Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
   * 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.
   * Neither the name of Google Inc. 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
OWNER 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.

Goautoneg v0.0.0-20120707110453-a547fc61f48d
Copyright (c) 2011, Open Knowledge Foundation Ltd.
All rights reserved.
https://github.com/munnerz/goautoneg


Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

    Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.

    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.

    Neither the name of the Open Knowledge Foundation Ltd. 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.
`
const license_stc_lre = `//** github.com/xdrpp/stc@v0.1.2 **//




Anyone is premitted to distribute this software under the terms of the
GNU General Public License (GPL) version 3 or later.  An acceptable
version of this license is available at the following URL:

        http://www.gnu.org/licenses/gpl-3.0.html

If the Free Software Foundation publishes a higher-numbered GPL
license, you may at your option distribute this software under the
terms of that license as well.


Anyone is also permitted to distributed this software under the terms
of the Apache License version 2.0, available at the following URL:

        http://www.apache.org/licenses/LICENSE-2.0


Stellar Development Foundation may, at the foundation's option,
relicense any version of this software under any license the
foundation sees fit.
`
const license_tencent_1_lre = `//** github.com/Tencent/bk-cmdb@v3.1.0-rc.1.0.20200226072203-90d9a93e8e0c+incompatible **//



Tencent is pleased to support the open source community by making 蓝鲸 available.  
Copyright (C) 2017-2018 THL A29 Limited, a Tencent company.  All rights reserved.
If you have downloaded a copy of the 蓝鲸 binary from Tencent, please note that the 蓝鲸 binary is licensed under the MIT License.
If you have downloaded a copy of the 蓝鲸 source code from Tencent, please note that 蓝鲸 source code is licensed under the MIT License, except for the third-party components listed below which are subject to different license terms.  Your integration of 蓝鲸 into your own projects may require compliance with the MIT License, as well as the other licenses applicable to the third-party components included within 蓝鲸.
A copy of the MIT License is included in this file.

Other dependencies and licenses:

Open Source Software Licensed Under the BSD 2-Clause License: 
----------------------------------------------------------------------------------------
1. mgo  r2016.08.01
Copyright (c) 2010-2013 - Gustavo Niemeyer <gustavo@niemeyer.net>
All rights reserved.

2. go-redis  v6.7.4
Copyright (c) 2013 The github.com/go-redis/redis Authors.
All rights reserved.


Terms of 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:

Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
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.



Open Source Software Licensed Under the BSD 3-Clause License: 
----------------------------------------------------------------------------------------
1. protobuf  master
Copyright 2010 The Go Authors.  All rights reserved.
https://github.com/golang/protobuf

2. sessions  1.1
Copyright (c) 2012 Rodrigo Moraes. All rights reserved.

3. securecookie  1.1
Copyright (c) 2012 Rodrigo Moraes. All rights reserved.

4. context  1.1
Copyright (c) 2012 Rodrigo Moraes. All rights reserved.

5. pflag  1.0.0
Copyright (c) 2012 Alex Ogier. All rights reserved.
Copyright (c) 2012 The Go Authors. All rights reserved.

6. xlsx  v1.0.0
Copyright (c) 2011-2017, Geoffrey J. Teale
All rights reserved.

7. go-zookeeper master
Copyright (c) 2013, Samuel Stauffer <samuel@descolada.com>
All rights reserved.

8.qs v6.5.1
Copyright (c) 2014 Nathan LaFreniere and other contributors.
All rights reserved.



Terms of the BSD 3-Clause License:
--------------------------------------------------------------------

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
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.
Neither the name of [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.



Open Source Software Licensed Under the Apache License, Version 2.0: 
----------------------------------------------------------------------------------------
1. redigo  v1.2.0
Copyright 2010-2014 Gary Burd

2. glog  maser
Copyright 2013 Google Inc. All Rights Reserved.

3. Cobra  0.0.1
Copyright 2013-2017 Steve Francia spf@spf13.com

4. go-yaml  master

5. echarts 4.0.4

6.vis v4.21.0
Copyright (C) 2010-2017 Almende B.V. and Contributors

7.vue-upload-component v2.6.2



Terms of the 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.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work
To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.



Open Source Software Licensed Under the Mozilla Public License, Version 2.0: 
----------------------------------------------------------------------------------------
1. Go-MySQL-Driver  1.3
Copyright 2012-2017 The Go-MySQL-Driver Authors. All rights reserved.


Terms of the Mozilla Public License, Version 2.0:
---------------------------------------------------
Mozilla Public License, version 2.0

1. Definitions

1.1. “Contributor”
means each individual or legal entity that creates, contributes to the creation of, or owns Covered Software.
1.2. “Contributor Version”
means the combination of the Contributions of others (if any) used by a Contributor and that particular Contributor’s Contribution.
1.3. “Contribution”
means Covered Software of a particular Contributor.
1.4. “Covered Software”
means Source Code Form to which the initial Contributor has attached the notice in Exhibit A, the Executable Form of such Source Code Form, and Modifications of such Source Code Form, in each case including portions thereof.
1.5. “Incompatible With Secondary Licenses”
means
1.that the initial Contributor has attached the notice described in Exhibit B to the Covered Software; or
2.that the Covered Software was made available under the terms of version 1.1 or earlier of the License, but not also under the terms of a Secondary License.
1.6. “Executable Form”
means any form of the work other than Source Code Form.
1.7. “Larger Work”
means a work that combines Covered Software with other material, in a separate file or files, that is not Covered Software.
1.8. “License”
means this document.
1.9. “Licensable”
means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently, any and all of the rights conveyed by this License.
1.10. “Modifications”
means any of the following:
1.any file in Source Code Form that results from an addition to, deletion from, or modification of the contents of Covered Software; or
2.any new file in Source Code Form that contains any Covered Software.
1.11. “Patent Claims” of a Contributor
means any patent claim(s), including without limitation, method, process, and apparatus claims, in any patent Licensable by such Contributor that would be infringed, but for the grant of the License, by the making, using, selling, offering for sale, having made, import, or transfer of either its Contributions or its Contributor Version.
1.12. “Secondary License”
means either the GNU General Public License, Version 2.0, the GNU Lesser General Public License, Version 2.1, the GNU Affero General Public License, Version 3.0, or any later versions of those licenses.
1.13. “Source Code Form”
means the form of the work preferred for making modifications.
1.14. “You” (or “Your”)
means an individual or a legal entity exercising rights under this License. For legal entities, “You” includes any entity that controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity.
2. License Grants and Conditions

2.1. Grants

Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license:
1.under intellectual property rights (other than patent or trademark) Licensable by such Contributor to use, reproduce, make available, modify, display, perform, distribute, and otherwise exploit its Contributions, either on an unmodified basis, with Modifications, or as part of a Larger Work; and
2.under Patent Claims of such Contributor to make, use, sell, offer for sale, have made, import, and otherwise transfer either its Contributions or its Contributor Version.
2.2. Effective Date

The licenses granted in Section 2.1 with respect to any Contribution become effective for each Contribution on the date the Contributor first distributes such Contribution.
2.3. Limitations on Grant Scope

The licenses granted in this Section 2 are the only rights granted under this License. No additional rights or licenses will be implied from the distribution or licensing of Covered Software under this License. Notwithstanding Section 2.1(b) above, no patent license is granted by a Contributor:
1.for any code that a Contributor has removed from Covered Software; or
2.for infringements caused by: (i) Your and any other third party’s modifications of Covered Software, or (ii) the combination of its Contributions with other software (except as part of its Contributor Version); or
3.under Patent Claims infringed by Covered Software in the absence of its Contributions.
This License does not grant any rights in the trademarks, service marks, or logos of any Contributor (except as may be necessary to comply with the notice requirements in Section 3.4).
2.4. Subsequent Licenses

No Contributor makes additional grants as a result of Your choice to distribute the Covered Software under a subsequent version of this License (see Section 10.2) or under the terms of a Secondary License (if permitted under the terms of Section 3.3).
2.5. Representation

Each Contributor represents that the Contributor believes its Contributions are its original creation(s) or it has sufficient rights to grant the rights to its Contributions conveyed by this License.
2.6. Fair Use

This License is not intended to limit any rights You have under applicable copyright doctrines of fair use, fair dealing, or other equivalents.
2.7. Conditions

Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in Section 2.1.
3. Responsibilities

3.1. Distribution of Source Form

All distribution of Covered Software in Source Code Form, including any Modifications that You create or to which You contribute, must be under the terms of this License. You must inform recipients that the Source Code Form of the Covered Software is governed by the terms of this License, and how they can obtain a copy of this License. You may not attempt to alter or restrict the recipients’ rights in the Source Code Form.
3.2. Distribution of Executable Form

If You distribute Covered Software in Executable Form then:
1.such Covered Software must also be made available in Source Code Form, as described in Section 3.1, and You must inform recipients of the Executable Form how they can obtain a copy of such Source Code Form by reasonable means in a timely manner, at a charge no more than the cost of distribution to the recipient; and
2.You may distribute such Executable Form under the terms of this License, or sublicense it under different terms, provided that the license for the Executable Form does not attempt to limit or alter the recipients’ rights in the Source Code Form under this License.
3.3. Distribution of a Larger Work

You may create and distribute a Larger Work under terms of Your choice, provided that You also comply with the requirements of this License for the Covered Software. If the Larger Work is a combination of Covered Software with a work governed by one or more Secondary Licenses, and the Covered Software is not Incompatible With Secondary Licenses, this License permits You to additionally distribute such Covered Software under the terms of such Secondary License(s), so that the recipient of the Larger Work may, at their option, further distribute the Covered Software under the terms of either this License or such Secondary License(s).
3.4. Notices

You may not remove or alter the substance of any license notices (including copyright notices, patent notices, disclaimers of warranty, or limitations of liability) contained within the Source Code Form of the Covered Software, except that You may alter any license notices to the extent required to remedy known factual inaccuracies.
3.5. Application of Additional Terms

You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, You may do so only on Your own behalf, and not on behalf of any Contributor. You must make it absolutely clear that any such warranty, support, indemnity, or liability obligation is offered by You alone, and You hereby agree to indemnify every Contributor for any liability incurred by such Contributor as a result of warranty, support, indemnity or liability terms You offer. You may include additional disclaimers of warranty and limitations of liability specific to any jurisdiction.
4. Inability to Comply Due to Statute or Regulation

If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Software due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be placed in a text file included with all distributions of the Covered Software under this License. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it.
5. Termination

5.1. The rights granted under this License will terminate automatically if You fail to comply with any of its terms. However, if You become compliant, then the rights granted under this License from a particular Contributor are reinstated (a) provisionally, unless and until such Contributor explicitly and finally terminates Your grants, and (b) on an ongoing basis, if such Contributor fails to notify You of the non-compliance by some reasonable means prior to 60 days after You have come back into compliance. Moreover, Your grants from a particular Contributor are reinstated on an ongoing basis if such Contributor notifies You of the non-compliance by some reasonable means, this is the first time You have received notice of non-compliance with this License from such Contributor, and You become compliant prior to 30 days after Your receipt of the notice.
5.2. If You initiate litigation against any entity by asserting a patent infringement claim (excluding declaratory judgment actions, counter-claims, and cross-claims) alleging that a Contributor Version directly or indirectly infringes any patent, then the rights granted to You by any and all Contributors for the Covered Software under Section 2.1 of this License shall terminate.
5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or Your distributors under this License prior to termination shall survive termination.
6. Disclaimer of Warranty

Covered Software is provided under this License on an “as is” basis, without warranty of any kind, either expressed, implied, or statutory, including, without limitation, warranties that the Covered Software is free of defects, merchantable, fit for a particular purpose or non-infringing. The entire risk as to the quality and performance of the Covered Software is with You. Should any Covered Software prove defective in any respect, You (not any Contributor) assume the cost of any necessary servicing, repair, or correction. This disclaimer of warranty constitutes an essential part of this License. No use of any Covered Software is authorized under this License except under this disclaimer.
7. Limitation of Liability

Under no circumstances and under no legal theory, whether tort (including negligence), contract, or otherwise, shall any Contributor, or anyone who distributes Covered Software as permitted above, be liable to You for any direct, indirect, special, incidental, or consequential damages of any character including, without limitation, damages for lost profits, loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses, even if such party shall have been informed of the possibility of such damages. This limitation of liability shall not apply to liability for death or personal injury resulting from such party’s negligence to the extent applicable law prohibits such limitation. Some jurisdictions do not allow the exclusion or limitation of incidental or consequential damages, so this exclusion and limitation may not apply to You.
8. Litigation

Any litigation relating to this License may be brought only in the courts of a jurisdiction where the defendant maintains its principal place of business and such litigation shall be governed by laws of that jurisdiction, without reference to its conflict-of-law provisions. Nothing in this Section shall prevent a party’s ability to bring cross-claims or counter-claims.
9. Miscellaneous

This License represents the complete agreement concerning the subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not be used to construe this License against a Contributor.
10. Versions of the License

10.1. New Versions

Mozilla Foundation is the license steward. Except as provided in Section 10.3, no one other than the license steward has the right to modify or publish new versions of this License. Each version will be given a distinguishing version number.
10.2. Effect of New Versions

You may distribute the Covered Software under the terms of the version of the License under which You originally received the Covered Software, or under the terms of any subsequent version published by the license steward.
10.3. Modified Versions

If you create software not governed by this License, and you want to create a new license for such software, you may create and use a modified version of this License if you rename the license and remove any references to the name of the license steward (except to note that such modified license differs from this License).
10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses

If You choose to distribute Source Code Form that is Incompatible With Secondary Licenses under the terms of this version of the License, the notice described in Exhibit B of this License must be attached.
Exhibit A - Source Code Form License Notice

This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
If it is not possible or desirable to put the notice in a particular file, then You may include the notice in a location (such as a LICENSE file in a relevant directory) where a recipient would be likely to look for such a notice.
You may add additional accurate notices of copyright ownership.
Exhibit B - “Incompatible With Secondary Licenses” Notice

This Source Code Form is “Incompatible With Secondary Licenses”, as defined by the Mozilla Public License, v. 2.0.



Open Source Software Licensed Under the MIT License: 
----------------------------------------------------------------------------------------
1. go-simplejson  v0.5.0

2. redistore  v1
Copyright (c) 2013 Brian Jones

3. go-restful  v1.2
Copyright (c) 2012, 2013 Ernest Micklei

4. sse  master
Copyright (c) 2014 Manuel Martínez-Almeida

5. gin  v1.2
Copyright (c) 2014 Manuel Martínez-Almeida

6. universal-translator  0.16.0
Copyright (c) 2016 Go Playground

7. validator  v9
Copyright (c) 2015 Dean Karn

8. gorm  v1.0
Copyright (c) 2013-NOW  Jinzhu wosmvp@gmail.com

9. inflection  master
Copyright (c) 2015 – Jinzhu

10. go-isatty  v0.0.3
Copyright (c) Yasuhiro MATSUMOTO mattn.jp@gmail.com

11. xid  v1.1
Copyright (c) 2015 Olivier Poitrey rs@dailymotion.com

12. go-codec  master
Copyright (c) 2012-2015 Ugorji Nwoke.
All rights reserved.

13. libyaml  0.1.7
Copyright (c) 2006-2016 Kirill Simonov

14. VUE  v2.5.9
Copyright (c) 2013-present, Yuxi (Evan) You

15. jquery  1.11.0
Copyright 2014 jQuery Foundation and other contributors
http://jquery.com/

16. vue-uploader  0.3
Copyright (c) 2017 simple-uploader

17. axios  v0.16.0
Copyright (c) 2014 Matt Zabriskie

18. vuex  v3.0.1
Copyright (c) 2015-2016 Evan You

19. vue-router  v3.0.1
Copyright (c) 2013-2016 Evan You

20. httpexpect master
Copyright (c) 2016 Victor Gaydov

21.go-isatty v.0.03
Copyright (c) Yasuhiro MATSUMOTO <mattn.jp@gmail.com>

22.gjson v1.1.0
Copyright (c) 2016 Josh Baker

23.match master
Copyright (c) 2016 Josh Baker

24.vue-dragging master
Copyright (c) 2016 Awe

25.axios v0.17.1
Copyright (c) 2014-present Matt Zabriskie

26.brace v0.11.1
Copyright 2013 Thorsten Lorenz. 
All rights reserved.

27.clipboard v2.0.0

28.jquery 3.3.1
Copyright JS Foundation and other contributors, https://js.foundation/

29.js-cookie v2.2.0
Copyright 2014 Klaus Hartl

30.lodash 4.17.7-es
Copyright JS Foundation and other contributors <https://js.foundation/>

31.moment 2.21.0
Copyright (c) JS Foundation and other contributors

32.popper.js v1.14.1
Copyright © 2016 Federico Zivolo and contributors

33.v-click-outside v1.0.3
Copyright (c) 2017 Nicolas Del Valle

34.vuex v3.0.1
Copyright (c) 2015-present Evan You


Terms of the MIT License:
---------------------------------------------------
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.`
const license_tencent_2_lre = `//** github.com/Tencent/bk-bcs@v0.0.0-20210107073425-12adaa1f349f **//



Tencent is pleased to support the open source community by making Blueking Container Service available.
Copyright (C) 2019 THL A29 Limited, a Tencent company.  All rights reserved.
If you have downloaded a copy of the Blueking Container Service binary from Tencent, please note that the Blueking Container Service binary is licensed under the MIT License.
If you have downloaded a copy of the Blueking Container Service source code from Tencent, please note that Blueking Container Service source code is licensed under the MIT License, except for the third-party components listed below which are subject to different license terms.  Your integration of Blueking Container Service into your own projects may require compliance with the MIT License, as well as the other licenses applicable to the third-party components included within Blueking Container Service.
A copy of the MIT License is included in this file.


Other dependencies and licenses:
Open Source Software Licensed Under the BSD 2-Clause License:
----------------------------------------------------------------------------------------
1. fnmatch
Copyright (c) 2016, Daniel Wakefield All rights reserved.

2. go-dockerclient  v1.3.1
Copyright (c) 2013-2018, go-dockerclient authors
All rights reserved.

3. websocket  v1.4.0
Copyright (c) 2013 The Gorilla WebSocket Authors. All rights reserved.

4. properties  v1.8.0
Copyright (c) 2013-2018 - Frank Schroeder
All rights reserved.

5. errors  v0.8.0
Copyright (c) 2015, Dave Cheney <dave@cheney.net>
All rights reserved.

6. go-metrics
Copyright 2012 Richard Crowley. All rights reserved.

7. mgo  v2
Copyright (c) 2010-2013 - Gustavo Niemeyer <gustavo@niemeyer.net>
All rights reserved.


Terms of 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:

	Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
	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.



Open Source Software Licensed Under the BSD 3-Clause License:
----------------------------------------------------------------------------------------
1. protobuf  v1.1.0
Copyright 2010 The Go Authors.  All rights reserved.
https://github.com/golang/protobuf

2. snappy
Copyright (c) 2011 The Snappy-Go Authors. All rights reserved.

3. go-cmp  v0.2.0
Copyright (c) 2017 The Go Authors. All rights reserved.

4. go-querystring  v1.0.0
Copyright (c) 2013 Google. All rights reserved.

5. uuid  v1.1.0
Copyright (c) 2009,2014 Google Inc. All rights reserved.

6. context  v1.1.1
Copyright (c) 2012 Rodrigo Moraes. All rights reserved.

7. mux  v1.6.2
Copyright (c) 2012 Rodrigo Moraes. All rights reserved.

8. grpc-opentracing
Copyright (c) 2016, gRPC Ecosystem
All rights reserved.

9. strcase
Copyright (c) 2015 Ian Coleman
Copyright (c) 2018 Ma_124, <github.com/Ma124>

10. mergo  v0.3.5
Copyright (c) 2013 Dario Castañé. All rights reserved.
Copyright (c) 2012 The Go Authors. All rights reserved.

11. osext
Copyright (c) 2012 The Go Authors. All rights reserved.

12. compress  v1.4.1
Copyright (c) 2012 The Go Authors. All rights reserved.

13. dns  v1.1.1
copyright (c) 2011 Miek Gieben
Copyright (c) 2009 The Go Authors. All rights reserved.

14. go-flowrate
Copyright (c) 2014 The Go-FlowRate Authors. All rights reserved.

15. go-libGeoIP
Copyright (c) 2010, Nikola Ranchev
All rights reserved.

16. uuid  v1.2
Copyright (c) 2009,2014 Google Inc. All rights reserved.

17. GoLLRB
Copyright (c) 2010, Petar Maymounkov
All rights reserved.

18. lz4  v2.0.7
Copyright (c) 2015, Pierre Curto
All rights reserved.

19. go-zookeeper
Copyright (c) 2013, Samuel Stauffer <samuel@descolada.com>
All rights reserved.

20. pflag  v1.0.3
Copyright (c) 2012 Alex Ogier. All rights reserved.
Copyright (c) 2012 The Go Authors. All rights reserved.

21. crypto
Copyright (c) 2009 The Go Authors. All rights reserved.

22. net
Copyright (c) 2009 The Go Authors. All rights reserved.

23. oauth2
Copyright (c) 2009 The Go Authors. All rights reserved.

24. sys
Copyright (c) 2009 The Go Authors. All rights reserved.

25. text  v0.3.0
Copyright (c) 2009 The Go Authors. All rights reserved.

26. time
Copyright (c) 2009 The Go Authors. All rights reserved.

27. fsnotify  v1.4.7
Copyright (c) 2012 fsnotify Authors. All rights reserved.
Copyright (c) 2012 The Go Authors. All rights reserved.

28. inf  v0.9.0
Copyright (c) 2012 Péter Surányi. Portions Copyright (c) 2009 The Go Authors.
All rights reserved.

29. tomb  v1
Copyright (c) 2010-2011 - Gustavo Niemeyer <gustavo@niemeyer.net>
All rights reserved.

30. zstd  v1.3.4
Copyright (c) 2016, Datadog <info@datadoghq.com>
All rights reserved.


Terms of the BSD 3-Clause License:
--------------------------------------------------------------------
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
	Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
	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.
	Neither the name of [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.



Open Source Software Licensed Under the Apache License, Version 2.0:
----------------------------------------------------------------------------------------
1.  thrift  0.11.0
Copyright 2006-2017 The Apache Software Foundation.

2. aws-sdk-go  v1.16.11
Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
Copyright 2014-2015 Stripe, Inc.

3. continuity
Copyright The containerd Authors.

4. cni  v0.6.0
Copyright 2014-2017 CNI authors

5. etcd  v3.3.10
Copyright 2015-2018 The etcd Authors

6. go-semver  v0.2.0
Copyright 2013-2015 CoreOS, Inc.

7. engine-api  v0.4.0
Copyright 2015-2016 Docker, Inc.

8. go-connections  v0.4.0
Copyright 2015 Docker, Inc.

9. go-units  v0.3.3
Copyright 2015 Docker, Inc.

10. beats  v5.6.14
Copyright (c) 2012–2016 Elasticsearch <http://www.elastic.co>

11. go-lumber  v0.1.0
Copyright (c) 2012–2016 Elasticsearch http://www.elastic.co

12. go-shlex
Copyright 2011-2012 Google Inc. All Rights Reserved.

13. redigo  v1.6.0
Copyright 2011-2018 Gary Burd

14. glog
Copyright 2013 Google Inc. All Rights Reserved.

15. btree
Copyright 2014 Google Inc.

16. gofuzz
Copyright 2014 Google Inc. All rights reserved.

17. gophercloud
Copyright 2012-2013 Rackspace, Inc.

18. mousetrap  v1.0
Copyright 2014 Alan Shreve

19. go-jmespath  0.2.2
Copyright 2015 James Saryerwinnie

20. golang_protobuf_extensions  v1.0.1
Copyright 2012 Matt T. Proud (matt.proud@gmail.com)

21. mesos-go  v0.0.2
Copyright 2013-2015, Mesosphere, Inc.

22. caddy  v0.11.1
Copyright 2015 Light Code Labs, LLC

23. image-spec  v1.0.1
Copyright 2016 The Linux Foundation.

24. go-observer
Copyright (c) 2017 opentracing-contrib

25. client_golang  v0.9.2
Copyright 2012-2015 The Prometheus Authors

26. procfs
Copyright 2014-2015 The Prometheus Authors

27. cobra  v0.0.3
Copyright © 2013-2018 Steve Francia spf@spf13.com

28. appengine  v1.4.0
Copyright 2011-2018 Google Inc. All rights reserved.
Copyright 2011 The Go Authors.  All rights reserved.

29. go-genproto
Copyright 2016-2019 Google Inc.

30. grpc-go  v1.17.0
Copyright 2014-2018 gRPC authors.

31. yaml  v2.2.2
Copyright 2011-2016 Canonical Ltd.

32. api  release-1.12
Copyright 2015-2018 The Kubernetes Authors.

33. apimachinery  kubernetes-1.12.0
Copyright 2014-2018 The Kubernetes Authors.

34. client-go  v9.0.0
Copyright 2014-2018 The Kubernetes Authors.

35. kubernetes  v1.13.1
Copyright 2015-2018 The Kubernetes Authors.


Terms of the 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.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work
To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.



Open Source Software Licensed Under the ISC License:
----------------------------------------------------------------------------------------
1. gopass
Copyright (c) 2012 Chris Howey


Terms of the ISC License:
--------------------------------------------------------------------
ISC License

Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.



Open Source Software Licensed Under the CC0 1.0 Universal Public Domain Dedication (CC0 1.0):
----------------------------------------------------------------------------------------
1. uniuri
Written in 2011-2014 by Dmitry Chestnykh


Terms of the CC0 1.0 Universal Public Domain Dedication (CC0 1.0):
--------------------------------------------------------------------
Statement of Purpose

The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an "owner") of an original work of authorship and/or a database (each, a "Work").

Certain owners wish to permanently relinquish those rights to a Work for the purpose of contributing to a commons of creative, cultural and scientific works ("Commons") that the public can reliably and without fear of later claims of infringement build upon, modify, incorporate in other works, reuse and redistribute as freely as possible in any form whatsoever and for any purposes, including without limitation commercial purposes. These owners may contribute to the Commons to promote the ideal of a free culture and the further production of creative, cultural and scientific works, or to gain reputation or greater distribution for their Work in part through the use and efforts of others.

For these and/or other purposes and motivations, and without any expectation of additional consideration or compensation, the person associating CC0 with a Work (the "Affirmer"), to the extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on those rights.

1. Copyright and Related Rights. A Work made available under CC0 may be protected by copyright and related or neighboring rights ("Copyright and Related Rights"). Copyright and Related Rights include, but are not limited to, the following:

i. the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work;

ii. moral rights retained by the original author(s) and/or performer(s);

iii. publicity and privacy rights pertaining to a person's image or likeness depicted in a Work;

iv. rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(a), below;

v. rights protecting the extraction, dissemination, use and reuse of data in a Work;

vi. database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and

vii. other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof.

2. Waiver. To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer's Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer's heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer's express Statement of Purpose.

3. Public License Fallback. Should any part of the Waiver for any reason be judged legally invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum extent permitted taking into account Affirmer's express Statement of Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, non transferable, non sublicensable, non exclusive, irrevocable and unconditional license to exercise Affirmer's Copyright and Related Rights in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "License"). The License shall be deemed effective as of the date CC0 was applied by Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate the remainder of the License, and in such case Affirmer hereby affirms that he or she will not (i) exercise any of his or her remaining Copyright and Related Rights in the Work or (ii) assert any associated claims and causes of action with respect to the Work, in either case contrary to Affirmer's express Statement of Purpose.

4. Limitations and Disclaimers.
a. No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document.

b. Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law.

c. Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work.

d. Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work.



Open Source Software Licensed Under the MIT License:
----------------------------------------------------------------------------------------
1. go-colorable  v0.0.9
Copyright (c) 2016 Yasuhiro Matsumoto

2. go-isatty  v0.0.4
Copyright (c) Yasuhiro MATSUMOTO mattn.jp@gmail.com

3. google-cloud-go  v0.34.0
Copyright 2016 Google LLC

4. go-ansiterm
Copyright © 2015 Microsoft Corporation

5. go-winio  v0.4.11
Copyright (c) 2015 Microsoft Corporation

6. sarama  v1.20.0
Copyright (c) 2013 Shopify

7. megos
Copyright (c) 2015 Andy Grunwald

8. govalidator  v9
Copyright (c) 2014 Alex Saskevich

9. perks
Copyright (C) 2013 Blake Mizerany

10. golang-set  v1.7.1
Copyright (c) 2013 Ralph Caraveo (deckarep@gmail.com)

11. jwt-go  v3.2.0
Copyright (c) 2012 Dave Grijalva

12. go-resiliency  v1.1.0
Copyright (c) 2014 Evan Huus

13. go-xerial-snappy
Copyright (c) 2016 Evan Huus

14. queue  v1.1.0
Copyright (c) 2014 Evan Huus

15. go-restful  v2.8.0
Copyright (c) 2012,2013 Ernest Micklei

16. logfmt  v0.4.0
Copyright (c) 2015 go-logfmt

17. locales  v0.12.1
Copyright (c) 2016 Go Playground

18. universal-translator  v0.16.0
Copyright (c) 2016 Go Playground

19. httpcache
Copyright © 2012 Greg Jones (greg.jones@gmail.com)

20. gorm  v1.9.2
Copyright (c) 2013-NOW Jinzhu wosmvp@gmail.com

21. inflection
Copyright (c) 2015 – Jinzhu

22. multierror
Copyright (c) 2014 Joe Shaw

23. go  v1.1.5
Copyright (c) 2016 json-iterator

24. cupid  v1.2.0
Copyright (c) 2015 Klaus Post

25. go-windows-terminal-sequences  v1.0.1
Copyright (c) 2017 marvin + konsorten GmbH (open-source@konsorten.de)

26. logfmt
Copyright (C) 2013 Keith Rarick, Blake Mizerany

27. hashstructure  v1.0.0
Copyright (c) 2016 Mitchell Hashimoto

28. mapstructure  v1.1.2
Copyright (c) 2013 Mitchell Hashimoto

29. http2curl  v1.0.0
Copyright (c) 2015 Manfred Touron

30. ginkgo  v1.7.0
Copyright (c) 2013-2014 Onsi Fakhouri

31. gomega  v1.4.3
Copyright (c) 2013-2014 Onsi Fakhouri

32. opentracing-go  v1.0.2
Copyright (c) 2016 The OpenTracing Authors

33. zipkin-go-opentracing  v0.3.5
Copyright (c) 2016 The OpenTracing Authors
Copyright (c) 2016 Bas van Beek

34. gorequest  v0.2.15
Copyright (c) 2014 Theeraphol Wattanavekin

35. go-toml  v1.2.0
Copyright (c) 2013 - 2017 Thomas Pelletier, Eric Anderton

36. diskv  v2.0.1
Copyright (c) 2011-2012 Peter Bourgon

37. go.uuid  v1.2.0
Copyright (C) 2013-2018 by Maxim Bublis b@codemonkey.ru

38. logrus  v1.2.0
Copyright (c) 2014 Simon Eskildsen

39. cast  v1.3.0
Copyright (c) 2014 Steve Francia

40. jwalterweatherman  v1.0.0
Copyright (c) 2014 Steve Francia

41. viper  v1.3.1
Copyright (c) 2014 Steve Francia

42. testify  v1.1.4
Copyright (c) 2012 - 2013 Mat Ryer and Tyler Bunnell

43. go  v1.1.1
Copyright (c) 2012-2015 Ugorji Nwoke.
All rights reserved.

44. cli  v1.20.0
Copyright (c) 2016 Jeremy Saenz & Contributors

45. validator  v9.24.0
Copyright (c) 2015 Dean Karn



Terms of the MIT License:
--------------------------------------------------------------------
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.
`
const license_tendermint_lre = `//** github.com/tendermint/dex-demo@v0.0.2 **//



This software is distrbuted under the terms of the terms of Apache License
Version 2.0 and is:

  Copyright __8__

You should have received a copy of the Apache License version 2.0 along with
this program. If not, see <https://www.apache.org/licenses/LICENSE-2.0>.
`
const license_transition_lre = `//** github.com/libp2p/hydra-booster@v0.7.3 **//



This project is transitioning from an MIT-only license to a dual MIT/Apache-2.0 license. 
Unless otherwise noted, all code contributed prior to __3__ and not contributed by 
a user listed in [this signoff issue]( __8__ ) is 
licensed under MIT-only. All new contributions (and past contributions since __3__ ) 
are licensed under a dual MIT/Apache-2.0 license.

MIT: https://www.opensource.org/licenses/mit
Apache-2.0: https://www.apache.org/licenses/license-2.0
`
const license_yottadb_lre = `//** lang.yottadb.com/go/yottadb@v1.1.0 **//



All software in this package is part of YottaDB (http://yottadb.com) each file of which contains notices from its copyright holders. YottaDB is provided to you under the terms of a license that you must comply with. If there is a COPYING file included in this package, it contains the terms of the license under which the package is provided to you.

If there is not a COPYING file in the package, you must do one of the following:
 (a) Ensure that there is a signed license under which the software is made available to you.
 (b) Create a COPYING file by copying the contents of https://www.gnu.org/licenses/agpl.txt and use it as the license.

With free / open source software, the question arises from time to time as to whether an application that uses software licensed under the GNU Affero General Public License must itself use that license or a compatible license. For clarity, our view is:
 (a) If you distribute software that uses, or is built on, unmodified YottaDB software, that software is not a covered work. Simple recompilation of YottaDB software from unmodified sources also results in an unmodified YottaDB software.
 (b) If you distribute software that uses, or is built on, a modified version of YottaDB software, your modified version of YottaDB software is a covered work, and the source code to your modified version must be made available per the terms of the license. However that part of the software not required to build the modified version of YottaDB software can be part of an aggregate with the modified version of YottaDB software and made available under a different, unrelated license.
 (c) Distributing software that is covered and software is not covered in separate directories or folders suffices to create an aggregate with separable licenses.

This clarification is the same as that which also has been made on multiple occasions (e.g., https://groups.google.com/d/msg/hardhats/A4qV-L4ZCjk/xf4fBWm2iisJ) by the upstream GT.M project.

If you submit source code you would like YottaDB to include, please ensure that you understand and agree with the above clarification.
`
