NAME
Regexp::Pattern::License - Regular expressions for legal licenses
VERSION
Version v3.11.0
SYNOPSIS
use Regexp::Pattern::License;
use Regexp::Pattern;
my $string = 'GNU General Public License version 3 or later';
print "Found!\n" if $string =~ re( 'License::gpl_3' ); # prints "Found!"
DESCRIPTION
Regexp::Pattern::License provides a hash of regular expression patterns related to legal software licenses.
Regexp::Pattern is a convention for organizing reusable regex patterns.
PATTERNS
Licensing traits
Patterns each covering a single trait occuring in licenses.
Each of these patterns has the tag type:trait .
addr_fsf
Since v3.4.0.
addr_fsf_franklin
Since v3.4.0.
addr_fsf_franklin_steet
Since v3.4.0.
addr_fsf_mass
Since v3.4.0.
addr_fsf_temple
Since v3.4.0.
any_of
Since v3.1.92.
by
Since v3.3.0.
by_apache
Since v3.3.0.
by_fsf
Since v3.3.0.
by_james_clark
Since v3.3.0.
by_psf
Since v3.3.0.
by_sam_hocevar
Since v3.3.0.
clause_retention
clause_reproduction
clause_advertising
clause_advertising_always
clause_non_endorsement
except_389
except_autoconf_data
Since v3.4.0.
except_autoconf_2
Since v3.4.0.
except_autoconf_2_archive
Since v3.4.0.
except_autoconf_2_autotroll
Since v3.4.0.
except_autoconf_2_g10
Since v3.4.0.
except_autoconf_3
Since v3.4.0.
except_bison_1_24
Since v3.4.0.
except_bison_2_2
Since v3.4.0.
except_classpath_2
except_ecos_2
Since v3.6.0.
except_epl
except_epl_mpl
except_faust
Since v3.4.0.
except_font_2
Since v3.7.0.
except_gcc_2
Since v3.7.0.
except_gcc_3_1
Since v3.7.0.
except_gstreamer
except_libtool
except_mif
except_openssl
Since v3.4.0.
except_ocaml-lgpl
except_openssl-lgpl
Since v3.4.0.
except_openssl_s3
Since v3.4.0.
except_prefix_agpl
Since v3.4.0.
except_prefix_generic
Since v3.4.0.
except_prefix_gpl
Since v3.4.0.
except_prefix_gpl_clisp
Since v3.4.0.
except_prefix_lgpl
Since v3.4.0.
except_proguard
Since v3.4.0.
except_qt_gpl_1
Since v3.4.0.
except_qt_gpl_eclipse
Since v3.4.0.
except_qt_gpl_openssl
Since v3.4.0.
except_qt_kernel
Since v3.4.0.
except_qt_lgpl_1_1
Since v3.4.0.
except_qt_nosource
Since v3.4.0.
except_sdc
Since v3.4.0.
except_sollya_4_1
Since v3.4.0.
except_warzone
Since v3.4.0.
except_wxwindows
Since v3.6.0.
except_xerces
Since v3.4.0.
fsf_unlimited
fsf_unlimited_retention
generated
Since v3.4.0.
license_label
license_label_spdx
Since v3.9.0.
license_label_trove
Since v3.1.100.
licensed_under
Since v3.1.92.
usage_rfn
Since v3.2.0.
version
Optionally provides the following numbered and named captures:
"Under GPL, v2 or later of the license." [ ] # -> $& I # -> $1, $-{version_number} [ ] # -> $2, $-{version_later} "Under version 2 or 3 only of the GPL." [ ] # -> $& I # -> $1, $-{version_number} I # -> $3, $-{version_number_2} [ ] # -> $4, $-{version_only} [] # -> $5, $-{version_of}
Captures stable since v3.11.0.
version_later
Optionally provides the following numbered and named captures:
"Under GPLv2, or later of the license." [ ] # -> $& [ ] # -> $1, $-{version_later}
Captures stable since v3.11.0.
version_numberstring
Optionally provides the following numbered and named captures:
"Under GPL, v2 or later of the license." [ ] # -> $& I # -> $1, $-{version_number} "Under version 2 or 3 only of the GPL." [ ] # -> $& I # -> $1, $-{version_number}
Since v3.1.92. Captures stable since v3.11.0.
version_only
Optionally provides the following numbered and named captures:
"Under GPL version 2 only of the license." [ ] # -> $& [ ] # -> $1, $-{version_only}
Captures stable since v3.11.0.
version_prefix
Single licenses
Patterns each covering a single license.
Each of these patterns has exactly one of these tags: type:unversioned type:versioned:decimal type:singleversion:* type:usage:*:* .
aal
abstyles
adobe_2006
adobe_glyph
adsl
afl
afl_1_1
Since v3.1.95.
afl_1_2
Since v3.1.95.
afl_2
Since v3.1.95.
afl_2_1
Since v3.1.95.
afl_3
Since v3.1.95.
afmparse
agpl
agpl_1
Since v3.1.102.
agpl_1_only
agpl_1_or_later
agpl_2
agpl_3
agpl_3_only
agpl_3_or_later
aladdin
aladdin_8
Since v3.1.91.
aladdin_9
Since v3.1.91.
amdplpa
aml
ampas
antlr_pd
apache
apache_1
Since v3.1.95.
apache_1_1
Since v3.1.95.
apache_2
Since v3.1.95.
apafml
apl
apl_1
apsl
apsl_1
apsl_1_1
apsl_1_2
apsl_2
artistic
artistic_1
Since v3.1.95.
artistic_1_cl8
Since v3.1.95.
artistic_1_perl
Since v3.1.95.
artistic_2
bahyph
barr
bdwgc
Since v3.1.0.
bdwgc_matlab
Since v3.1.0.
beerware
bittorrent
bittorrent_1
bittorrent_1_1
borceux
bsd_0_clause
Since v3.5.0.
bsd_1_clause
Since v3.6.0.
bsd_2_clause
bsd_2_clause_freebsd
Since v3.6.0.
bsd_2_clause_netbsd
Since v3.6.0.
bsd_2_clause_patent
Since v3.6.0.
bsd_2_clause_views
bsd_3_clause
bsd_3_clause_attribution
Since v3.6.0.
bsd_3_clause_clear
Since v3.6.0.
bsd_3_clause_eclipse
Since v3.9.0.
bsd_3_clause_lbnl
Since v3.6.0.
bsd_3_clause_modification
bsd_3_clause_no_military_license
Since v3.6.0.
bsd_3_clause_no_nuclear_license
Since v3.6.0.
bsd_3_clause_no_nuclear_license_2014
Since v3.6.0.
bsd_3_clause_no_nuclear_warranty
Since v3.6.0.
bsd_3_clause_refractions
Since v3.9.0.
bsd_4_clause
bsd_4_clause_uc
Since v3.7.0.
bsd_protection
Since v3.8.0.
bsl
Since v3.1.90.
bsl_1
Since v3.1.90.
bzip2
bzip2_1_0_5
bzip2_1_0_6
cal
Since v3.5.0.
cal_1
Since v3.5.0.
caldera
catosl
catosl_1_1
cc_by
cc_by_1
Since v3.1.101.
cc_by_2
Since v3.1.101.
cc_by_2_5
Since v3.1.101.
cc_by_3
Since v3.1.101.
cc_by_4
Since v3.1.101.
cc_by_nc
cc_by_nc_1
Since v3.1.101.
cc_by_nc_2
Since v3.1.101.
cc_by_nc_2_5
Since v3.1.101.
cc_by_nc_3
Since v3.1.101.
cc_by_nc_4
Since v3.1.101.
cc_by_nc_nd
cc_by_nc_nd_1
Since v3.1.101.
cc_by_nc_nd_2
Since v3.1.101.
cc_by_nc_nd_2_5
Since v3.1.101.
cc_by_nc_nd_3
Since v3.1.101.
cc_by_nc_nd_4
Since v3.1.101.
cc_by_nc_sa
cc_by_nc_sa_1
Since v3.1.101.
cc_by_nc_sa_2
Since v3.1.101.
cc_by_nc_sa_2_5
Since v3.1.101.
cc_by_nc_sa_3
Since v3.1.101.
cc_by_nc_sa_4
Since v3.1.101.
cc_by_nd
cc_by_nd_1
Since v3.1.101.
cc_by_nd_2
Since v3.1.101.
cc_by_nd_2_5
Since v3.1.101.
cc_by_nd_3
Since v3.1.101.
cc_by_nd_4
Since v3.1.101.
cc_by_sa
cc_by_sa_1
Since v3.1.101.
cc_by_sa_2
Since v3.1.101.
cc_by_sa_2_5
Since v3.1.101.
cc_by_sa_3
Since v3.1.101.
cc_by_sa_4
Since v3.1.101.
cc_cc0
cc_cc0_1
Since v3.1.101.
cc_devnations
Since v3.7.0.
cc_devnations_2
Since v3.7.0.
cc_nc
Since v3.1.101.
cc_nc_1
Since v3.1.101.
cc_nc_sa
Since v3.7.0.
cc_nc_sa_1
Since v3.7.0.
cc_nc_sp
Since v3.7.0.
cc_nc_sp_1
Since v3.7.0.
cc_nd_nc
Since v3.7.0.
cc_nd_nc_1
Since v3.7.0.
cc_nd
Since v3.1.101.
cc_nd_1
Since v3.1.101.
cc_pd
Since v3.7.0.
cc_pdd
Since v3.7.0.
cc_pddc
Since v3.7.0.
cc_sa
Since v3.1.101.
cc_sa_1
Since v3.1.101.
cc_sampling
Since v3.7.0.
cc_sampling_1
Since v3.7.0.
cc_sp
cc_sp_1
Since v3.7.0.
cddl
cddl_1
Since v3.1.101.
cddl_1_1
Since v3.1.101.
cecill
cecill_1
cecill_1_1
cecill_2
cecill_2_1
cecill_b
cecill_b_1
Since v3.1.95.
cecill_c
cecill_c_1
Since v3.1.95.
cnri_jython
cnri_python
cnri_python_gpl_compat
condor
Since v3.8.0.
condor_1_1
Since v3.8.0.
cpal
cpal_1
cpl
Since v3.1.101.
cpl_1
Since v3.1.101.
cpol
cpol_1_02
crossword
Since v3.8.0.
cryptix
cua_opl
cua_opl_1
cube
curl
cvw
Since v3.5.0.
d_fsl
Since v3.8.0.
d_fsl_1
Since v3.8.0.
dbad
Since v3.8.0.
dbad_0_2
Since v3.8.0.
dbad_0_3
Since v3.8.0.
dbad_1
Since v3.8.0.
dbad_1_1
Since v3.8.0.
dont_ask
Since v3.8.0.
dsdp
ecl
ecl_1
ecl_2
ecos_1_1
Since v3.6.0.
ecos_2
Since v3.6.0.
efl
Since v3.6.0.
efl_1
Since v3.6.0.
efl_2
Since v3.6.0.
entessa
Since v3.6.0.
epl
epl_1
epl_2
erlpl
Since v3.7.0.
erlpl_1_1
Since v3.7.0.
eudatagrid
Since v3.6.0.
eupl
eupl_1
eupl_1_1
eupl_1_2
eurosym
fair
Since v3.6.0.
fair_source
Since v3.8.0.
fair_source_0_9
Since v3.8.0.
fal
Since v3.8.0.
fal_1_1
Since v3.8.0.
fal_1_2
Since v3.8.0.
fal_1_3
Since v3.8.0.
festival
Since v3.8.0.
frameworx
Since v3.6.0.
frameworx_1
Since v3.6.0.
fsfap
fsful
fsfullr
ftl
gfdl
gfdl_1_1
gfdl_1_1_only
gfdl_1_1_or_later
gfdl_1_2
gfdl_1_2_only
gfdl_1_2_or_later
gfdl_1_3
gfdl_1_3_only
gfdl_1_3_or_later
gfdl_niv
glide
Since v3.8.0.
gpl
gpl_1
Since v3.3.0.
gpl_1_only
gpl_1_or_later
gpl_2
Since v3.3.0.
gpl_2_only
gpl_2_or_later
gpl_3
Since v3.3.0.
gpl_3_only
gpl_3_or_later
gsoap
Since v3.7.0.
gsoap_1.3b
Since v3.7.0.
hpnd
Since v3.6.0.
hpnd_sell
Since v3.6.0.
ibm_pibs
Since v3.8.0.
icu
ijg
Since v3.8.0.
imlib2
Since v3.8.0.
intel
Since v3.5.0.
ipa
Since v3.6.0.
ipl
ipl_1
isc
jabberpl
Since v3.5.0.
json
Since v3.1.90.
jython
Since v3.1.90.
kevlin_henney
Since v3.1.90.
leptonica
Since v3.8.0.
lgpl
lgpl_2
lgpl_2_only
lgpl_2_or_later
lgpl_2_1
lgpl_2_1_only
lgpl_2_1_or_later
lgpl_3
lgpl_3_only
lgpl_3_or_later
lgpl_bdwgc
Since v3.1.0.
libpng
libtiff
Since v3.8.0.
liliq_p
Since v3.6.0.
liliq_p_1_1
Since v3.6.0.
liliq_r
Since v3.6.0.
liliq_r_1_1
Since v3.6.0.
liliq_r_plus
Since v3.6.0.
liliq_r_plus_1_1
Since v3.6.0.
llgpl
lpl
Since v3.6.0.
lpl_1
Since v3.6.0.
lpl_1_02
Since v3.6.0.
lppl
lppl_1
lppl_1_1
lppl_1_2
lppl_1_3a
lppl_1_3c
miros
Since v3.6.0.
mit_0
Since v3.6.0.
mit_advertising
mit_cmu
mit_cmu_warranty
mit_enna
mit_epinions
Since v3.7.0.
mit_feh
mit_new
mit_new_materials
mit_old
mit_oldstyle
mit_oldstyle_disclaimer
mit_oldstyle_permission
mit_open_group
Since v3.6.0.
mit_openvision
Since v3.7.0.
mit_osf
Since v3.7.0.
mit_unixcrypt
Since v3.7.0.
mit_whatever
Since v3.7.0.
mit_widget
Since v3.7.0.
mit_xfig
Since v3.7.0.
motosoto
Since v3.5.0.
mpich2
Since v3.8.0.
mpl
mpl_1
Since v3.1.101.
mpl_1_1
Since v3.1.101.
mpl_2
Since v3.1.101.
mpl_2_no_copyleft_exception
Since v3.8.0.
ms_cl
Since v3.8.0.
ms_pl
ms_rl
mulan
Since v3.5.0.
mulan_1
Since v3.5.0.
mulan_2
Since v3.5.0.
multics
Since v3.6.0.
nasa
Since v3.6.0.
nasa_1_3
Since v3.6.0.
naumen
Since v3.6.0.
nbpl
Since v3.8.0.
nbpl_1
Since v3.8.0.
ncsa
Since v3.6.0.
ngpl
nokia
Since v3.6.0.
nosl
Since v3.8.0.
nosl_1
Since v3.8.0.
npl
npl_1
npl_1_1
nposl
Since v3.6.0.
nposl_3
Since v3.6.0.
ntp
ntp_disclaimer
oclc
oclc_1
oclc_2
odbl
Since v3.8.0.
odbl_1
Since v3.8.0.
odc_by
Since v3.8.0.
odc_by_1
Since v3.8.0.
ofl
ofl_1
Since v3.1.101.
ofl_1_no_rfn
Since v3.2.0.
ofl_1_rfn
Since v3.2.0.
ofl_1_1
Since v3.1.101.
ofl_1_1_no_rfn
Since v3.2.0.
ofl_1_1_rfn
Since v3.2.0.
ogc
Since v3.6.0.
ogc_1
Since v3.6.0.
ogtsl
oldap
Since v3.5.0.
oldap_1_1
Since v3.5.0.
oldap_1_2
Since v3.5.0.
oldap_1_3
Since v3.5.0.
oldap_1_4
Since v3.5.0.
oldap_2
Since v3.5.0.
oldap_2_0_1
Since v3.5.0.
oldap_2_1
Since v3.5.0.
oldap_2_2
Since v3.5.0.
oldap_2_2_1
Since v3.5.0.
oldap_2_2_2
Since v3.5.0.
oldap_2_3
Since v3.5.0.
oldap_2_4
Since v3.5.0.
oldap_2_5
Since v3.5.0.
oldap_2_6
Since v3.5.0.
oldap_2_7
Since v3.5.0.
oldap_2_8
Since v3.5.0.
openssl
opl
Since v3.6.0.
opl_1
Since v3.6.0.
oset_pl
Since v3.6.0.
oset_pl_2_1
Since v3.6.0.
osl
osl_1
osl_1_1
osl_2
osl_2_1
osl_3
pddl
Since v3.8.0.
pddl_1
Since v3.8.0.
peer_production
Since v3.8.0.
php
Since v3.6.0.
php_3
Since v3.6.0.
php_3_01
Since v3.6.0.
postgresql
psf_2
Since v3.9.0.
public_domain
qpl
qpl_1
rpl
rpl_1
rpl_1_1
rpl_1_3
rpl_1_5
rpsl
rpsl_1
Since v3.1.95.
ruby
rscpl
sax_pd
Since v3.8.0.
sds
Since v3.8.0.
sds_1
Since v3.8.0.
sgi_b
sgi_b_1
Since v3.1.101.
sgi_b_1_1
Since v3.1.101.
sgi_b_2
Since v3.1.101.
simpl
Since v3.6.0.
simpl_2
Since v3.6.0.
simple_w3c
Since v3.6.0.
simple_w3c_1_1
Since v3.6.0.
sissl
Since v3.5.0.
sissl_1_1
Since v3.5.0.
sissl_1_2
Since v3.5.0.
sleepycat
Since v3.6.0.
sncl
Since v3.8.0.
sncl_1_10
Since v3.8.0.
sncl_2_0_1
Since v3.8.0.
sncl_2_0_2
Since v3.8.0.
sncl_2_1
Since v3.8.0.
sncl_2_3
Since v3.8.0.
spl
spl_1
ssleay
Since v3.2.0.
stlport
Since v3.8.0.
sugarcrm
sugarcrm_1_1_3
tosl
Since v3.6.0.
truecrypt
Since v3.8.0.
truecrypt_3
Since v3.8.0.
ucl
Since v3.6.0.
ucl_1
Since v3.6.0.
unicode_dfs
Since v3.9.0.
unicode_dfs_2015
Since v3.6.0.
unicode_dfs_2016
Since v3.6.0.
unicode_strict
unicode_tou
unlicense
upl
Since v3.6.0.
upl_1
Since v3.6.0.
vsl
Since v3.6.0.
vsl_1
Since v3.6.0.
vspl
Since v3.8.0.
w3c
Since v3.6.0.
w3c_19980519
Since v3.6.0.
w3c_19980720
Since v3.6.0.
w3c_20021231
Since v3.6.0.
w3c_20150513
Since v3.6.0.
watcom
watcom_1
wordnet
Since v3.8.0.
wtfpl
wtfpl_1
Since v3.1.95.
wtfpl_2
Since v3.1.95.
wtfnmfpl
Since v3.1.95.
wtfnmfpl_1
Since v3.1.95.
x11
Since v3.6.0.
xfree86
Since v3.8.0.
xfree86_1_1
Since v3.8.0.
xnet
Since v3.6.0.
ypl
Since v3.8.0.
ypl_1
Since v3.8.0.
ypl_1_1
Since v3.8.0.
zed
Since v3.8.0.
zend
Since v3.8.0.
zend_2
Since v3.8.0.
zimbra
Since v3.8.0.
zimbra_1_3
Since v3.8.0.
zimbra_1_4
zlib
zlib_acknowledgement
zpl
Since v3.1.102.
zpl_1
Since v3.1.102.
zpl_1_1
Since v3.1.102.
zpl_2
Since v3.1.102.
zpl_2_1
Since v3.1.102.
License combinations
Patterns each covering a combination of multiple licenses.
Each of these patterns has the tag type:combo .
net_snmp
Since v3.6.0.
perl
python_2
Since v3.9.0.
License groups
Patterns each covering either of multiple licenses.
Each of these patterns has the tag type:group .
bsd
cc
Since v3.6.0.
gnu
mit
STRUCTURE
The regexp patterns follows the DefHash specification, and more specifically the structure of Regexp::Pattern, defining access to one pattern per DefHash object, as pat
.
Additionally, (sub)patterns are available in plaintext form, as pat.alt.*
.
SUBJECT
Each pattern targets one or more subjects, i.e. ways to directly or indirectly represent a license.
Beware that not all pattern objects fully cover all subjects.
- trait
-
Distinguishing trait or feature expressed in licensing strings, e.g. an advertising clause or granting "...or any later version."
Coverage for this subject is currently rather weak.
- name
-
Distinguishing name, e.g. usable in license grant.
- grant
-
Text granting the license.
- license
-
Text containing licensing terms.
Texts containing both license grant and licensing terms (e.g. BSD- and MIT-style licensing) may be classified as either subject grant or subject license. This may change, as needs for distinction is better understood.
SCOPE
Each pattern can process material within some scope, i.e. a certain sample size of the full subject.
As an example, https://codesearch.debian.net/ use line-based processing, where patterns spanning multiple lines are not applicable.
- line
-
Pattern typically found within a single line. Typically this means less than 70 characters within scope.
- sentence
-
Pattern matching within a sentence.
May span multiple lines, but not across multiple sentences. Typically this means no full-stop or colon within scope.
- paragraph
-
Pattern matching distinguishing paragraph.
May span multiple sentences, but not multiple paragraphs. Typically this means no newline within scope.
- section
-
Pattern matching distinguishing section.
May span multiple paragraphs, but not multiple sections. Typically this means blank line within scope.
- multisection
-
Pattern may span multiple sections.
OBSOLETE OBJECTS
License objects obsoleted by improved coverage of other objects, and provided only as dummy objects.
or_at_option
Since v3.11.0.
version_later_paragraph
Since v3.11.0.
version_later_postfix
Since v3.11.0.
version_number
Since v3.11.0.
version_number_suffix
Since v3.11.0.
python
Since v3.9.0.
Replaced by "psf_2" and "python_2".
wordnet_3
Since v3.9.0.
Replaced by "wordnet".
TAGS
Pattern defhashes optionally includes tags, which may help in selecting multiple related patterns.
Tags are hierarchical, with :
as separator, and may be extended without notice. Therefore take care to permit sub-parts when tag-matching, e.g. using a regex like /\Asome:tag(?:\z|:)/
.
family:bsd
family:cc
family:gpl
family:mit
family:zlib
Pattern covers a license part of a family of licenses.
license:contains:grant:*
License mentions a preferred form for granting the license.
This implies that license is commonly granted by use of a different (typically far shorter) text.
Fourth part (optional) is the key to corresponding license pattern, for a grant belonging to a different license (when omitted then a grant for same license is assumed).
license:contains:license:*
License contains another license.
Wildcard is the key to corresponding license pattern.
license:contains:name:*
License mentions name of another license.
license:includes:license:*
License references coverage of another license.
Wildcard is the key to corresponding license pattern.
license:is:grant
License is commonly granted by stating the whole license.
license:published:*
License grant may include an "as published by..." reference.
Third part is the key to corresponding trait pattern.
type:trait:publisher:*
Pattern covers an "as published by ..." license grant phrase.
Third part (optional) is the key to corresponding license pattern.
type:usage:*:*
Pattern covers a specific usage of a license.
Third part is the key of the corresponding non-usage-specific pattern.
Fourth part is the key of the corresponding usage trait pattern.
type:combo
Pattern covers a combination of multiple licenses.
type:group
Pattern covers either of multiple licenses.
type:singleversion:*
Pattern covers a specific version of a license.
Third part is the key of the corresponding non-version-specific pattern.
type:trait
Pattern covers a single trait occuring in licenses.
type:unversioned
Pattern covers a license without versioning scheme.
type:versioned:decimal
Pattern covers a license using decimal number versioning scheme.
EXAMPLES
Browse patterns
The "official" way to browse patterns is using App::RegexpPatternUtils:
show-regexp-pattern-module --page-result -- License
Unfortunately, App::RegexpPatternUtils has a deep dependency tree. An alternative is to use Data::Printer and less
:
perl -CS -MRegexp::Pattern::License -MDDP -e 'p %Regexp::Pattern::License::RE, fulldump => 1, output => stdout' | less -RS
AUTHOR
Jonas Smedegaard <dr@jones.dk>
COPYRIGHT AND LICENSE
Copyright © 2016-2021 Jonas Smedegaard
Copyright © 2017-2021 Purism SPC
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, 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/>.