// 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: "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: "atc-dependency", LRE: license_atc_dependency_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: "thepiachu", LRE: license_thepiachu_lre},
	{ID: "transition", LRE: license_transition_lre},
	{ID: "workiva", LRE: license_workiva_lre},
	{ID: "yottadb", LRE: license_yottadb_lre},
}

var exceptionTypes = map[string][]string{
	"atc-dependency": {"Apache-2.0", "BSD-2-Clause", "BSD-3-Clause", "MIT"},
	"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"},
	"thepiachu":      {"BSD-3-Clause"},
	"transition":     {"MIT", "Apache-2.0"},
	"workiva":        {"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_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>.
||
	<http://www.gnu.org/philosophy/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_atc_dependency_lre = `//**
source: https://github.com/apache/trafficcontrol/blob/master/LICENSE
**//


This product bundles __4__, which
(( is || are ))
available under
(( a || an ))
(( Apache-2.0 || BSD-2-Clause || BSD-3-Clause || MIT ))
license.
__15__
(( /* || .css || .js || .scss ))
(( ./licenses/__4__ || ./vendor/__16__/LICENSE
(( .libyaml || .md || .txt ))??
))
Refer to the above license for the full text.
`
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_thepiachu_lre = `//** https://github.com/ThePiachu/Golang-Koblitz-elliptic-curve-DSA-library **//



Copyright (c) 2009 The Go Authors. All rights reserved.
Copyright (c) __1__ ThePiachu. All rights reserved.
(( Copyright __10__ ))??

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.
   * The name of ThePiachu may not 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_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_workiva_lre = `//** https://raw.githubusercontent.com/Workiva/ssllabs-go/v0.1.4/LICENSE **//



Copyright 2018 - __1__ 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 ssllabs-go software contains source code from the ssllabs-scan repository. Your use of the source
code for ssllabs-scan repository is subject to the following terms and conditions:

	- ssllabs-scan: https://github.com/ssllabs/ssllabs-scan
		- Copyright (c) __5__ Qualys, Inc.
    - License under the Apache License, Version 2.0: https://github.com/ssllabs/ssllabs-scan/blob/master/LICENSE
`
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.
`
