langtable 0.0.65__tar.gz → 0.0.66__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. {langtable-0.0.65 → langtable-0.0.66}/ChangeLog +15 -0
  2. {langtable-0.0.65 → langtable-0.0.66}/MANIFEST.in +3 -0
  3. {langtable-0.0.65 → langtable-0.0.66}/Makefile +16 -6
  4. {langtable-0.0.65 → langtable-0.0.66}/PKG-INFO +25 -28
  5. {langtable-0.0.65 → langtable-0.0.66}/README +21 -17
  6. langtable-0.0.66/README.html +226 -0
  7. langtable-0.0.66/README.md +72 -0
  8. langtable-0.0.66/langtable/data/languages.xml.gz +0 -0
  9. langtable-0.0.66/langtable/data/territories.xml.gz +0 -0
  10. {langtable-0.0.65 → langtable-0.0.66}/langtable/langtable.py +7 -1
  11. {langtable-0.0.65 → langtable-0.0.66}/langtable.egg-info/PKG-INFO +25 -28
  12. {langtable-0.0.65 → langtable-0.0.66}/langtable.egg-info/SOURCES.txt +2 -0
  13. {langtable-0.0.65 → langtable-0.0.66}/main.py +14 -9
  14. {langtable-0.0.65 → langtable-0.0.66}/setup.py +3 -2
  15. {langtable-0.0.65 → langtable-0.0.66}/test_cases.py +6 -5
  16. langtable-0.0.65/langtable/data/languages.xml.gz +0 -0
  17. langtable-0.0.65/langtable/data/territories.xml.gz +0 -0
  18. {langtable-0.0.65 → langtable-0.0.66}/COPYING +0 -0
  19. {langtable-0.0.65 → langtable-0.0.66}/langtable/__init__.py +0 -0
  20. {langtable-0.0.65 → langtable-0.0.66}/langtable/data/keyboards.xml.gz +0 -0
  21. {langtable-0.0.65 → langtable-0.0.66}/langtable/data/timezoneidparts.xml.gz +0 -0
  22. {langtable-0.0.65 → langtable-0.0.66}/langtable/data/timezones.xml.gz +0 -0
  23. {langtable-0.0.65 → langtable-0.0.66}/langtable/schemas/keyboards.rng +0 -0
  24. {langtable-0.0.65 → langtable-0.0.66}/langtable/schemas/languages.rng +0 -0
  25. {langtable-0.0.65 → langtable-0.0.66}/langtable/schemas/territories.rng +0 -0
  26. {langtable-0.0.65 → langtable-0.0.66}/langtable/schemas/timezoneidparts.rng +0 -0
  27. {langtable-0.0.65 → langtable-0.0.66}/langtable/schemas/timezones.rng +0 -0
  28. {langtable-0.0.65 → langtable-0.0.66}/langtable.egg-info/dependency_links.txt +0 -0
  29. {langtable-0.0.65 → langtable-0.0.66}/langtable.egg-info/not-zip-safe +0 -0
  30. {langtable-0.0.65 → langtable-0.0.66}/langtable.egg-info/top_level.txt +0 -0
  31. {langtable-0.0.65 → langtable-0.0.66}/setup.cfg +0 -0
  32. {langtable-0.0.65 → langtable-0.0.66}/tools/compare_with_glib_source.py +0 -0
  33. {langtable-0.0.65 → langtable-0.0.66}/tools/list-missing-regions-and-languages.sh +0 -0
  34. {langtable-0.0.65 → langtable-0.0.66}/unicode-license.txt +0 -0
@@ -1,3 +1,18 @@
1
+ 2024-05-07 Mike FABIAN <mfabian@redhat.com>
2
+
3
+ * Fix syntax error in a keyboard layout name for th
4
+ (Resolves: https://github.com/mike-fabian/langtable/issues/21xs)
5
+ * Add mdf
6
+ * Use “in(eng)” keyboard layout instead of “us” for BD to get AltGr enabled
7
+ * Get translation changes from CLDR
8
+ * Add option to include changed translations as well to the script getting translations from CLDR
9
+ * Add reference to the the PyPI package to the README.md.
10
+ And add a README.html and README generated from the README.md.
11
+ * Make test outputs somewhat more verbose, even when all tests pass
12
+ (Resolves: https://github.com/mike-fabian/langtable/pull/20).
13
+ Thanks to Sebastian <seb128@ubuntu.com> for the pull request.
14
+ * Fix Makefile twine-upload target for new authentification
15
+
1
16
  2024-02-08 Mike FABIAN <mfabian@redhat.com>
2
17
 
3
18
  * Add wuu, tok, glk, gbm, ssy
@@ -1,3 +1,6 @@
1
+ include README.html
2
+ include README.md
3
+ include README
1
4
  include unicode-license.txt
2
5
  include COPYING
3
6
  include ChangeLog
@@ -9,13 +9,13 @@ gzip: langtable/data/keyboards.xml.gz langtable/data/languages.xml.gz langtable/
9
9
 
10
10
  .PHONY: test
11
11
  test: gzip
12
- (cd langtable; python3 langtable.py)
12
+ python3 langtable/langtable.py
13
13
  python3 test_cases.py
14
- (cd langtable; xmllint --noout --relaxng schemas/keyboards.rng data/keyboards.xml.gz)
15
- (cd langtable; xmllint --noout --relaxng schemas/languages.rng data/languages.xml.gz)
16
- (cd langtable; xmllint --noout --relaxng schemas/territories.rng data/territories.xml.gz)
17
- (cd langtable; xmllint --noout --relaxng schemas/timezones.rng data/timezones.xml.gz)
18
- (cd langtable; xmllint --noout --relaxng schemas/timezoneidparts.rng data/timezoneidparts.xml.gz)
14
+ xmllint --noout --relaxng langtable/schemas/keyboards.rng langtable/data/keyboards.xml.gz
15
+ xmllint --noout --relaxng langtable/schemas/languages.rng langtable/data/languages.xml.gz
16
+ xmllint --noout --relaxng langtable/schemas/territories.rng langtable/data/territories.xml.gz
17
+ xmllint --noout --relaxng langtable/schemas/timezones.rng langtable/data/timezones.xml.gz
18
+ xmllint --noout --relaxng langtable/schemas/timezoneidparts.rng langtable/data/timezoneidparts.xml.gz
19
19
 
20
20
  .PHONY: check
21
21
  check: test
@@ -30,6 +30,10 @@ install: dist
30
30
  DISTUTILS_DEBUG=$(DEBUG) python3 ./setup.py install --prefix=$(DESTDIR)
31
31
  # DISTUTILS_DEBUG=$(DEBUG) python3 ./setup.py install_data --install-dir=$(DATADIR)
32
32
 
33
+ .PHONY: twine-check
34
+ twine-check: dist
35
+ twine check dist/*
36
+
33
37
  # check it here: https://test.pypi.org/manage/project/langtable/releases/
34
38
  .PHONY: twine-upload-test
35
39
  twine-upload-test: dist
@@ -76,3 +80,9 @@ review: mockbuild
76
80
 
77
81
  rnc: schemas/keyboards.rnc schemas/languages.rnc schemas/territories.rnc schemas/timezones.rnc schemas/timezoneidparts.rnc
78
82
  cp schemas/*.rnc data/
83
+
84
+ README: README.html
85
+ w3m -cols 78 -o display_borders=1 -o display_link_number=1 $< > $@
86
+
87
+ README.html: README.md
88
+ pandoc -f gfm -t html --standalone --self-contained --metadata pagetitle="langtable README" $< > $@
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: langtable
3
- Version: 0.0.65
3
+ Version: 0.0.66
4
4
  Summary: guess reasonable defaults for locale, keyboard, territory, ...
5
5
  Home-page: https://github.com/mike-fabian/langtable
6
6
  Author: Mike FABIAN
@@ -13,55 +13,52 @@ Classifier: License :: OSI Approved :: GNU General Public License v3 or later (G
13
13
  Classifier: Operating System :: POSIX :: Linux
14
14
  Classifier: Programming Language :: Python
15
15
  Classifier: Topic :: System :: Installation/Setup
16
+ Description-Content-Type: text/markdown
16
17
  License-File: COPYING
17
18
 
18
- ======================================================================
19
- langtable
20
- ======================================================================
19
+ # langtable
21
20
 
22
- Purpose of this package
23
- =======================
21
+ [![PyPI version](https://badge.fury.io/py/langtable.svg)](https://badge.fury.io/py/langtable)
24
22
 
25
- langtable is used to guess reasonable defaults for locale, keyboard,
26
- territory, …, if part of that information is already known. For
27
- example, guess the territory and the keyboard layout if the language
28
- is known or guess the language and keyboard layout if the territory is
29
- already known.
23
+ Guessing reasonable defaults for locale, keyboard layout, territory, and language.
30
24
 
31
- License
32
- =======
25
+ ## Purpose of this package
26
+ _langtable_ is used to guess reasonable defaults for locale, keyboard, territory, …, if part of that information is already known. For example, guess the territory and the keyboard layout if the language is known or guess the language and keyboard layout if the territory is already known.
27
+
28
+ ## License
33
29
 
34
30
  GPLv3+, see the included file “COPYING”.
35
31
 
36
- Translations for languages and territory names are from CLDR which is
37
- governed by the Unicode Terms of Use, see the included file
38
- “unicode-license.txt”. The short name for this Unicode license is
39
- “MIT”. See:
32
+ Translations for languages and territory names are from CLDR which is governed by the Unicode Terms of Use, see the included file “unicode-license.txt”. The short name for this Unicode license is “MIT”. See:
40
33
 
41
34
  https://fedoraproject.org/wiki/Licensing:MIT?rd=Licensing/MIT#Modern_Style_without_sublicense_.28Unicode.29
42
35
 
43
- Installation
44
- ============
36
+ ## Installation
45
37
 
46
38
  To install langtable, run
47
39
 
40
+ ```
48
41
  make install DESTDIR=/usr
42
+ ```
49
43
 
50
44
  To create a distribution tarball run
51
-
45
+ ```
52
46
  make dist
53
-
47
+ ```
54
48
  To run the test cases in the source directory:
49
+ ```
50
+ make check
51
+ ```
55
52
 
56
- make test
57
-
58
- How to use it
59
- =============
53
+ ## How to use it
60
54
 
55
+ ```
61
56
  import langtable
57
+ ```
62
58
 
63
59
  Functions in the public API:
64
60
 
61
+ ```
65
62
  parse_locale()
66
63
  list_locales()
67
64
  list_keyboards()
@@ -86,8 +83,8 @@ Functions in the public API:
86
83
  list_all_scripts()
87
84
  list_all_input_methods()
88
85
  list_all_console_fonts()
86
+ ```
89
87
 
90
- Some examples to show the usage are found in the documentation
91
- of the public functions in langtable.py.
88
+ Some examples to show the usage are found in the documentation of the public functions in `langtable.py`.
92
89
 
93
- (Some more examples are in the test cases in the file test_cases.py):
90
+ Some more examples are in the test cases in the file `test_cases.py`.
@@ -1,30 +1,29 @@
1
- ======================================================================
2
1
  langtable
3
- ======================================================================
2
+
3
+ [1]PyPI version
4
+
5
+ Guessing reasonable defaults for locale, keyboard layout, territory, and
6
+ language.
4
7
 
5
8
  Purpose of this package
6
- =======================
7
9
 
8
10
  langtable is used to guess reasonable defaults for locale, keyboard,
9
- territory, …, if part of that information is already known. For
10
- example, guess the territory and the keyboard layout if the language
11
- is known or guess the language and keyboard layout if the territory is
12
- already known.
11
+ territory, …, if part of that information is already known. For example,
12
+ guess the territory and the keyboard layout if the language is known or guess
13
+ the language and keyboard layout if the territory is already known.
13
14
 
14
15
  License
15
- =======
16
16
 
17
17
  GPLv3+, see the included file “COPYING”.
18
18
 
19
19
  Translations for languages and territory names are from CLDR which is
20
20
  governed by the Unicode Terms of Use, see the included file
21
- “unicode-license.txt”. The short name for this Unicode license is
22
- “MIT”. See:
21
+ “unicode-license.txt”. The short name for this Unicode license is “MIT”. See:
23
22
 
24
- https://fedoraproject.org/wiki/Licensing:MIT?rd=Licensing/MIT#Modern_Style_without_sublicense_.28Unicode.29
23
+ [2]https://fedoraproject.org/wiki/Licensing:MIT?rd=Licensing/MIT#
24
+ Modern_Style_without_sublicense_.28Unicode.29
25
25
 
26
26
  Installation
27
- ============
28
27
 
29
28
  To install langtable, run
30
29
 
@@ -36,10 +35,9 @@ To create a distribution tarball run
36
35
 
37
36
  To run the test cases in the source directory:
38
37
 
39
- make test
38
+ make check
40
39
 
41
40
  How to use it
42
- =============
43
41
 
44
42
  import langtable
45
43
 
@@ -70,7 +68,13 @@ Functions in the public API:
70
68
  list_all_input_methods()
71
69
  list_all_console_fonts()
72
70
 
73
- Some examples to show the usage are found in the documentation
74
- of the public functions in langtable.py.
71
+ Some examples to show the usage are found in the documentation of the public
72
+ functions in langtable.py.
73
+
74
+ Some more examples are in the test cases in the file test_cases.py.
75
+
76
+
77
+ References:
75
78
 
76
- (Some more examples are in the test cases in the file test_cases.py):
79
+ [1] https://badge.fury.io/py/langtable
80
+ [2] https://fedoraproject.org/wiki/Licensing:MIT?rd=Licensing/MIT#Modern_Style_without_sublicense_.28Unicode.29
@@ -0,0 +1,226 @@
1
+ <!DOCTYPE html>
2
+ <html xmlns="http://www.w3.org/1999/xhtml" lang xml:lang>
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="generator" content="pandoc" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
7
+ <title>langtable README</title>
8
+ <style>
9
+ html {
10
+ color: #1a1a1a;
11
+ background-color: #fdfdfd;
12
+ }
13
+ body {
14
+ margin: 0 auto;
15
+ max-width: 36em;
16
+ padding-left: 50px;
17
+ padding-right: 50px;
18
+ padding-top: 50px;
19
+ padding-bottom: 50px;
20
+ hyphens: auto;
21
+ overflow-wrap: break-word;
22
+ text-rendering: optimizeLegibility;
23
+ font-kerning: normal;
24
+ }
25
+ @media (max-width: 600px) {
26
+ body {
27
+ font-size: 0.9em;
28
+ padding: 12px;
29
+ }
30
+ h1 {
31
+ font-size: 1.8em;
32
+ }
33
+ }
34
+ @media print {
35
+ html {
36
+ background-color: white;
37
+ }
38
+ body {
39
+ background-color: transparent;
40
+ color: black;
41
+ font-size: 12pt;
42
+ }
43
+ p, h2, h3 {
44
+ orphans: 3;
45
+ widows: 3;
46
+ }
47
+ h2, h3, h4 {
48
+ page-break-after: avoid;
49
+ }
50
+ }
51
+ p {
52
+ margin: 1em 0;
53
+ }
54
+ a {
55
+ color: #1a1a1a;
56
+ }
57
+ a:visited {
58
+ color: #1a1a1a;
59
+ }
60
+ img {
61
+ max-width: 100%;
62
+ }
63
+ h1, h2, h3, h4, h5, h6 {
64
+ margin-top: 1.4em;
65
+ }
66
+ h5, h6 {
67
+ font-size: 1em;
68
+ font-style: italic;
69
+ }
70
+ h6 {
71
+ font-weight: normal;
72
+ }
73
+ ol, ul {
74
+ padding-left: 1.7em;
75
+ margin-top: 1em;
76
+ }
77
+ li > ol, li > ul {
78
+ margin-top: 0;
79
+ }
80
+ blockquote {
81
+ margin: 1em 0 1em 1.7em;
82
+ padding-left: 1em;
83
+ border-left: 2px solid #e6e6e6;
84
+ color: #606060;
85
+ }
86
+ code {
87
+ font-family: Menlo, Monaco, Consolas, 'Lucida Console', monospace;
88
+ font-size: 85%;
89
+ margin: 0;
90
+ hyphens: manual;
91
+ }
92
+ pre {
93
+ margin: 1em 0;
94
+ overflow: auto;
95
+ }
96
+ pre code {
97
+ padding: 0;
98
+ overflow: visible;
99
+ overflow-wrap: normal;
100
+ }
101
+ .sourceCode {
102
+ background-color: transparent;
103
+ overflow: visible;
104
+ }
105
+ hr {
106
+ background-color: #1a1a1a;
107
+ border: none;
108
+ height: 1px;
109
+ margin: 1em 0;
110
+ }
111
+ table {
112
+ margin: 1em 0;
113
+ border-collapse: collapse;
114
+ width: 100%;
115
+ overflow-x: auto;
116
+ display: block;
117
+ font-variant-numeric: lining-nums tabular-nums;
118
+ }
119
+ table caption {
120
+ margin-bottom: 0.75em;
121
+ }
122
+ tbody {
123
+ margin-top: 0.5em;
124
+ border-top: 1px solid #1a1a1a;
125
+ border-bottom: 1px solid #1a1a1a;
126
+ }
127
+ th {
128
+ border-top: 1px solid #1a1a1a;
129
+ padding: 0.25em 0.5em 0.25em 0.5em;
130
+ }
131
+ td {
132
+ padding: 0.125em 0.5em 0.25em 0.5em;
133
+ }
134
+ header {
135
+ margin-bottom: 4em;
136
+ text-align: center;
137
+ }
138
+ #TOC li {
139
+ list-style: none;
140
+ }
141
+ #TOC ul {
142
+ padding-left: 1.3em;
143
+ }
144
+ #TOC > ul {
145
+ padding-left: 0;
146
+ }
147
+ #TOC a:not(:hover) {
148
+ text-decoration: none;
149
+ }
150
+ code{white-space: pre-wrap;}
151
+ span.smallcaps{font-variant: small-caps;}
152
+ div.columns{display: flex; gap: min(4vw, 1.5em);}
153
+ div.column{flex: auto; overflow-x: auto;}
154
+ div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
155
+
156
+ ul.task-list[class]{list-style: none;}
157
+ ul.task-list li input[type="checkbox"] {
158
+ font-size: inherit;
159
+ width: 0.8em;
160
+ margin: 0 0.8em 0.2em -1.6em;
161
+ vertical-align: middle;
162
+ }
163
+ .display.math{display: block; text-align: center; margin: 0.5rem auto;}
164
+ </style>
165
+ <!--[if lt IE 9]>
166
+ <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
167
+ <![endif]-->
168
+ </head>
169
+ <body>
170
+ <h1 id="langtable">langtable</h1>
171
+ <p><a href="https://badge.fury.io/py/langtable"><img src="data:image/svg+xml;base64,PHN2ZwogIHdpZHRoPSIxMzIiCiAgaGVpZ2h0PSIyMCIKICB2aWV3Qm94PSIwIDAgMTMyIDIwIgogIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPGRlZnM+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgaWQ9ImEiCiAgICAgIHgxPSIwIgogICAgICB5MT0iMCIKICAgICAgeDI9IjAiCiAgICAgIHkyPSIxIj4KICAgICAgPHN0b3AKICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgc3RvcC1jb2xvcj0iI2JiYmJiYiIKICAgICAgICBzdG9wLW9wYWNpdHk9IjAuMSIvPgogICAgICA8c3RvcAogICAgICAgIG9mZnNldD0iMSIKICAgICAgICBzdG9wLWNvbG9yPSIjMDAwMDAwIgogICAgICAgIHN0b3Atb3BhY2l0eT0iMC4xIi8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogIDwvZGVmcz4KICA8cGF0aAogICAgZmlsbD0iIzU1NTU1NSIKICAgIHN0cm9rZT0ibm9uZSIKICAgIGQ9Ik0gMyAwIEwgMTI5IDAgQyAxMzAuNjU2ODYgMCAxMzIgMS4zNDMxNDU3IDEzMiAzIEwgMTMyIDE3IEMgMTMyIDE4LjY1Njg1NSAxMzAuNjU2ODYgMjAgMTI5IDIwIEwgMyAyMCBDIDEuMzQzMTQ1NyAyMCAwIDE4LjY1Njg1NSAwIDE3IEwgMCAzIEMgLTAgMS4zNDMxNDU3IDEuMzQzMTQ1NyAwIDMgMCBaIi8+CiAgPHBhdGgKICAgIGZpbGw9IiM0NGNjMTEiCiAgICBzdHJva2U9Im5vbmUiCiAgICBkPSJNIDg5IDAgTCAxMjkgMCBDIDEzMC42NTY4NiAwIDEzMiAxLjM0MzE0NTcgMTMyIDMgTCAxMzIgMTcgQyAxMzIgMTguNjU2ODU1IDEzMC42NTY4NiAyMCAxMjkgMjAgTCA4OSAyMCBDIDg3LjM0MzE1IDIwIDg2IDE4LjY1Njg1NSA4NiAxNyBMIDg2IDMgQyA4NiAxLjM0MzE0NTcgODcuMzQzMTUgMCA4OSAwIFoiLz4KICA8cGF0aAogICAgZmlsbD0iIzQ0Y2MxMSIKICAgIHN0cm9rZT0ibm9uZSIKICAgIGQ9Ik0gODYgMCBMIDk5IDAgTCA5OSAyMCBMIDg2IDIwIFoiLz4KICA8cGF0aAogICAgZmlsbD0idXJsKCNhKSIKICAgIHN0cm9rZT0ibm9uZSIKICAgIGQ9Ik0gMyAwIEwgMTI5IDAgQyAxMzAuNjU2ODYgMCAxMzIgMS4zNDMxNDU3IDEzMiAzIEwgMTMyIDE3IEMgMTMyIDE4LjY1Njg1NSAxMzAuNjU2ODYgMjAgMTI5IDIwIEwgMyAyMCBDIDEuMzQzMTQ1NyAyMCAwIDE4LjY1Njg1NSAwIDE3IEwgMCAzIEMgLTAgMS4zNDMxNDU3IDEuMzQzMTQ1NyAwIDMgMCBaIi8+CiAgPGc+CiAgICA8ZwogICAgICBpZD0idEJhY2siPgogICAgICA8cGF0aAogICAgICAgIGZpbGw9IiMwMTAxMDEiCiAgICAgICAgZmlsbC1vcGFjaXR5PSIwLjMiCiAgICAgICAgc3Ryb2tlPSIjMDEwMTAxIgogICAgICAgIHN0cm9rZS1vcGFjaXR5PSIwLjA5ODAzOTIyIgogICAgICAgIHN0cm9rZS13aWR0aD0iMC4zIgogICAgICAgIGQ9Ik0gNy45OTI2NzYgMTQuMDk3NjU2IEwgNy45OTI2NzYgMTcuMjg4MDg2IEwgNi45OTkwMjM0IDE3LjI4ODA4NiBMIDYuOTk5MDIzNCA4Ljk4NDM3NSBMIDcuOTkyNjc2IDguOTg0Mzc1IEwgNy45OTI2NzYgOS44OTc0NjEgUSA4LjMwNDE5OSA5LjM2MDM1MiA4Ljc3OTU0MSA5LjA5OTg1MzUgUSA5LjI1NDg4MyA4LjgzOTM1NSA5LjkxNTUyNyA4LjgzOTM1NSBRIDExLjAxMTIzIDguODM5MzU1IDExLjY5NjA0NSA5LjcwOTQ3MyBRIDEyLjM4MDg1OCAxMC41Nzk1OSAxMi4zODA4NTggMTEuOTk3NTU5IFEgMTIuMzgwODU4IDEzLjQxNTUyNyAxMS42OTYwNDUgMTQuMjg1NjQ1IFEgMTEuMDExMjMgMTUuMTU1NzYyIDkuOTE1NTI3IDE1LjE1NTc2MiBRIDkuMjU0ODgzIDE1LjE1NTc2MiA4Ljc3OTU0MSAxNC44OTUyNjQgUSA4LjMwNDE5OSAxNC42MzQ3NjYgNy45OTI2NzYgMTQuMDk3NjU2IFogTSAxMS4zNTQ5Nzk1IDExLjk5NzU1OSBRIDExLjM1NDk3OTUgMTAuOTA3MjI3IDEwLjkwNjQ5NSAxMC4yODY4NjUgUSAxMC40NTgwMDggOS42NjY1MDQgOS42NzM4MjggOS42NjY1MDQgUSA4Ljg4OTY0OCA5LjY2NjUwNCA4LjQ0MTE2MiAxMC4yODY4NjUgUSA3Ljk5MjY3NiAxMC45MDcyMjcgNy45OTI2NzYgMTEuOTk3NTU5IFEgNy45OTI2NzYgMTMuMDg3ODkyIDguNDQxMTYyIDEzLjcwODI1MiBRIDguODg5NjQ4IDE0LjMyODYxMyA5LjY3MzgyOCAxNC4zMjg2MTMgUSAxMC40NTgwMDggMTQuMzI4NjEzIDEwLjkwNjQ5NSAxMy43MDgyNTIgUSAxMS4zNTQ5Nzk1IDEzLjA4Nzg5MiAxMS4zNTQ5Nzk1IDExLjk5NzU1OSBaIE0gMTYuNTIxOTczIDE1LjU1ODU5NCBRIDE2LjEwMzAyNyAxNi42MzI4MTMgMTUuNzA1NTY2IDE2Ljk2MDQ1IFEgMTUuMzA4MTA0NSAxNy4yODgwODYgMTQuNjQyMDkgMTcuMjg4MDg2IEwgMTMuODUyNTM5IDE3LjI4ODA4NiBMIDEzLjg1MjUzOSAxNi40NjA5MzggTCAxNC40MzI2MTcgMTYuNDYwOTM4IFEgMTQuODQwODIgMTYuNDYwOTM4IDE1LjA2NjQwNiAxNi4yNjc1NzggUSAxNS4yOTE5OTIgMTYuMDc0MjE5IDE1LjU2NTkxNyAxNS4zNTQ0OTIgTCAxNS43NDMxNjQgMTQuOTAzMzIgTCAxMy4zMTAwNTkgOC45ODQzNzUgTCAxNC4zNTc0MjIgOC45ODQzNzUgTCAxNi4yMzczMDUgMTMuNjg5NDUzIEwgMTguMTE3MTg4IDguOTg0Mzc1IEwgMTkuMTY0NTUgOC45ODQzNzUgTCAxNi41MjE5NzMgMTUuNTU4NTk0IFogTSAyMS40ODQ4NjMgMTQuMDk3NjU2IEwgMjEuNDg0ODYzIDE3LjI4ODA4NiBMIDIwLjQ5MTIxIDE3LjI4ODA4NiBMIDIwLjQ5MTIxIDguOTg0Mzc1IEwgMjEuNDg0ODYzIDguOTg0Mzc1IEwgMjEuNDg0ODYzIDkuODk3NDYxIFEgMjEuNzk2Mzg5IDkuMzYwMzUyIDIyLjI3MTcyOSA5LjA5OTg1MzUgUSAyMi43NDcwNyA4LjgzOTM1NSAyMy40MDc3MTcgOC44MzkzNTUgUSAyNC41MDM0MTggOC44MzkzNTUgMjUuMTg4MjMyIDkuNzA5NDczIFEgMjUuODczMDQ3IDEwLjU3OTU5IDI1Ljg3MzA0NyAxMS45OTc1NTkgUSAyNS44NzMwNDcgMTMuNDE1NTI3IDI1LjE4ODIzMiAxNC4yODU2NDUgUSAyNC41MDM0MTggMTUuMTU1NzYyIDIzLjQwNzcxNyAxNS4xNTU3NjIgUSAyMi43NDcwNyAxNS4xNTU3NjIgMjIuMjcxNzI5IDE0Ljg5NTI2NCBRIDIxLjc5NjM4OSAxNC42MzQ3NjYgMjEuNDg0ODYzIDE0LjA5NzY1NiBaIE0gMjQuODQ3MTY4IDExLjk5NzU1OSBRIDI0Ljg0NzE2OCAxMC45MDcyMjcgMjQuMzk4NjgyIDEwLjI4Njg2NSBRIDIzLjk1MDE5NSA5LjY2NjUwNCAyMy4xNjYwMTYgOS42NjY1MDQgUSAyMi4zODE4MzYgOS42NjY1MDQgMjEuOTMzMzUgMTAuMjg2ODY1IFEgMjEuNDg0ODYzIDEwLjkwNzIyNyAyMS40ODQ4NjMgMTEuOTk3NTU5IFEgMjEuNDg0ODYzIDEzLjA4Nzg5MiAyMS45MzMzNSAxMy43MDgyNTIgUSAyMi4zODE4MzYgMTQuMzI4NjEzIDIzLjE2NjAxNiAxNC4zMjg2MTMgUSAyMy45NTAxOTUgMTQuMzI4NjEzIDI0LjM5ODY4MiAxMy43MDgyNTIgUSAyNC44NDcxNjggMTMuMDg3ODkyIDI0Ljg0NzE2OCAxMS45OTc1NTkgWiBNIDI3LjUxMTIyOSA4Ljk4NDM3NSBMIDI4LjQ5OTUxMiA4Ljk4NDM3NSBMIDI4LjQ5OTUxMiAxNSBMIDI3LjUxMTIyOSAxNSBMIDI3LjUxMTIyOSA4Ljk4NDM3NSBaIE0gMjcuNTExMjI5IDYuNjQyNTc4IEwgMjguNDk5NTEyIDYuNjQyNTc4IEwgMjguNDk5NTEyIDcuODk0MDQzIEwgMjcuNTExMjI5IDcuODk0MDQzIEwgMjcuNTExMjI5IDYuNjQyNTc4IFogTSAzNS4wMjAwMiAxNC4wOTc2NTYgTCAzNS4wMjAwMiAxNy4yODgwODYgTCAzNC4wMjYzNjcgMTcuMjg4MDg2IEwgMzQuMDI2MzY3IDguOTg0Mzc1IEwgMzUuMDIwMDIgOC45ODQzNzUgTCAzNS4wMjAwMiA5Ljg5NzQ2MSBRIDM1LjMzMTU0MyA5LjM2MDM1MiAzNS44MDY4ODUgOS4wOTk4NTM1IFEgMzYuMjgyMjI3IDguODM5MzU1IDM2Ljk0Mjg3IDguODM5MzU1IFEgMzguMDM4NTc0IDguODM5MzU1IDM4LjcyMzM5IDkuNzA5NDczIFEgMzkuNDA4MjAzIDEwLjU3OTU5IDM5LjQwODIwMyAxMS45OTc1NTkgUSAzOS40MDgyMDMgMTMuNDE1NTI3IDM4LjcyMzM5IDE0LjI4NTY0NSBRIDM4LjAzODU3NCAxNS4xNTU3NjIgMzYuOTQyODcgMTUuMTU1NzYyIFEgMzYuMjgyMjI3IDE1LjE1NTc2MiAzNS44MDY4ODUgMTQuODk1MjY0IFEgMzUuMzMxNTQzIDE0LjYzNDc2NiAzNS4wMjAwMiAxNC4wOTc2NTYgWiBNIDM4LjM4MjMyNCAxMS45OTc1NTkgUSAzOC4zODIzMjQgMTAuOTA3MjI3IDM3LjkzMzgzOCAxMC4yODY4NjUgUSAzNy40ODUzNSA5LjY2NjUwNCAzNi43MDExNyA5LjY2NjUwNCBRIDM1LjkxNjk5MiA5LjY2NjUwNCAzNS40Njg1MDYgMTAuMjg2ODY1IFEgMzUuMDIwMDIgMTAuOTA3MjI3IDM1LjAyMDAyIDExLjk5NzU1OSBRIDM1LjAyMDAyIDEzLjA4Nzg5MiAzNS40Njg1MDYgMTMuNzA4MjUyIFEgMzUuOTE2OTkyIDE0LjMyODYxMyAzNi43MDExNyAxNC4zMjg2MTMgUSAzNy40ODUzNSAxNC4zMjg2MTMgMzcuOTMzODM4IDEzLjcwODI1MiBRIDM4LjM4MjMyNCAxMy4wODc4OTIgMzguMzgyMzI0IDExLjk5NzU1OSBaIE0gNDMuNzgwMjczIDExLjk3NjA3NCBRIDQyLjU4MjUyIDExLjk3NjA3NCA0Mi4xMjA2MDUgMTIuMjQ5OTk5IFEgNDEuNjU4NjkgMTIuNTIzOTI2IDQxLjY1ODY5IDEzLjE4NDU3MSBRIDQxLjY1ODY5IDEzLjcxMDkzNzUgNDIuMDA1MTI3IDE0LjAxOTc3NiBRIDQyLjM1MTU2MyAxNC4zMjg2MTMgNDIuOTQ3NzU0IDE0LjMyODYxMyBRIDQzLjc2OTUzNSAxNC4zMjg2MTMgNDQuMjY2MzU3IDEzLjc0NTg1IFEgNDQuNzYzMTg0IDEzLjE2MzA4NiA0NC43NjMxODQgMTIuMTk2Mjg5IEwgNDQuNzYzMTg0IDExLjk3NjA3NCBMIDQzLjc4MDI3MyAxMS45NzYwNzQgWiBNIDQ1Ljc1MTQ2NSAxMS41Njc4NzEgTCA0NS43NTE0NjUgMTUgTCA0NC43NjMxODQgMTUgTCA0NC43NjMxODQgMTQuMDg2OTE1IFEgNDQuNDI0ODA1IDE0LjYzNDc2NiA0My45MTk5MiAxNC44OTUyNjQgUSA0My40MTUwNCAxNS4xNTU3NjIgNDIuNjg0NTcgMTUuMTU1NzYyIFEgNDEuNzYwNzQyIDE1LjE1NTc2MiA0MS4yMTU1NzYgMTQuNjM3NDUxIFEgNDAuNjcwNDEgMTQuMTE5MTQyIDQwLjY3MDQxIDEzLjI0OTAyNCBRIDQwLjY3MDQxIDEyLjIzMzg4NyA0MS4zNDk4NTQgMTEuNzE4MjYyIFEgNDIuMDI5Mjk3IDExLjIwMjYzNyA0My4zNzc0NDUgMTEuMjAyNjM3IEwgNDQuNzYzMTg0IDExLjIwMjYzNyBMIDQ0Ljc2MzE4NCAxMS4xMDU5NTcgUSA0NC43NjMxODQgMTAuNDIzODI4IDQ0LjMxNDY5NyAxMC4wNTA1MzcgUSA0My44NjYyMSA5LjY3NzI0NiA0My4wNTUxNzYgOS42NzcyNDYgUSA0Mi41Mzk1NSA5LjY3NzI0NiA0Mi4wNTA3OCA5LjgwMDc4MSBRIDQxLjU2MjAxIDkuOTI0MzE2IDQxLjExMDg0IDEwLjE3MTM4NyBMIDQxLjExMDg0IDkuMjU4MzAxIFEgNDEuNjUzMzIgOS4wNDg4MjggNDIuMTYzNTc0IDguOTQ0MDkyIFEgNDIuNjczODMgOC44MzkzNTUgNDMuMTU3MjI3IDguODM5MzU1IFEgNDQuNDYyNDAyIDguODM5MzU1IDQ1LjEwNjkzNCA5LjUxNjExMyBRIDQ1Ljc1MTQ2NSAxMC4xOTI4NzEgNDUuNzUxNDY1IDExLjU2Nzg3MSBaIE0gNTIuMTE2MjA3IDkuMjE1MzMyIEwgNTIuMTE2MjA3IDEwLjEzOTE2IFEgNTEuNjk3MjY2IDkuOTA4MjAzIDUxLjI3NTYzIDkuNzkyNzI1IFEgNTAuODU0MDA0IDkuNjc3MjQ2IDUwLjQyNDMxNiA5LjY3NzI0NiBRIDQ5LjQ2Mjg5IDkuNjc3MjQ2IDQ4LjkzMTE1MiAxMC4yODY4NjUgUSA0OC4zOTk0MTggMTAuODk2NDgzIDQ4LjM5OTQxOCAxMS45OTc1NTkgUSA0OC4zOTk0MTggMTMuMDk4NjMzIDQ4LjkzMTE1MiAxMy43MDgyNTIgUSA0OS40NjI4OSAxNC4zMTc4NzEgNTAuNDI0MzE2IDE0LjMxNzg3MSBRIDUwLjg1NDAwNCAxNC4zMTc4NzEgNTEuMjc1NjMgMTQuMjAyMzkzIFEgNTEuNjk3MjY2IDE0LjA4NjkxNSA1Mi4xMTYyMDcgMTMuODU1OTU2IEwgNTIuMTE2MjA3IDE0Ljc2OTA0MyBRIDUxLjcwMjYzNyAxNC45NjI0MDIgNTEuMjU5NTIgMTUuMDU5MDgyIFEgNTAuODE2NDA2IDE1LjE1NTc2MiA1MC4zMTY4OSAxNS4xNTU3NjIgUSA0OC45NTgwMDggMTUuMTU1NzYyIDQ4LjE1NzcxNSAxNC4zMDE3NTggUSA0Ny4zNTc0MTggMTMuNDQ3NzU0IDQ3LjM1NzQxOCAxMS45OTc1NTkgUSA0Ny4zNTc0MTggMTAuNTI1ODc5IDQ4LjE2NTc3IDkuNjgyNjE3IFEgNDguOTc0MTIgOC44MzkzNTUgNTAuMzgxMzQ4IDguODM5MzU1IFEgNTAuODM3ODk0IDguODM5MzU1IDUxLjI3Mjk1IDguOTMzMzUgUSA1MS43MDgwMDggOS4wMjczNDQgNTIuMTE2MjA3IDkuMjE1MzMyIFogTSA1My43OTczNjcgNi42NDI1NzggTCA1NC43OTEwMTYgNi42NDI1NzggTCA1NC43OTEwMTYgMTEuNTc4NjE0IEwgNTcuNzM5NzQ2IDguOTg0Mzc1IEwgNTkuMDAxOTUzIDguOTg0Mzc1IEwgNTUuODExNTIzIDExLjc5ODgyNyBMIDU5LjEzNjIzIDE1IEwgNTcuODQ3MTY4IDE1IEwgNTQuNzkxMDE2IDEyLjA2MjAxMiBMIDU0Ljc5MTAxNiAxNSBMIDUzLjc5NzM2NyAxNSBMIDUzLjc5NzM2NyA2LjY0MjU3OCBaIE0gNjIuNzQ1NjA1IDExLjk3NjA3NCBRIDYxLjU0Nzg1IDExLjk3NjA3NCA2MS4wODU5MzggMTIuMjQ5OTk5IFEgNjAuNjI0MDI3IDEyLjUyMzkyNiA2MC42MjQwMjcgMTMuMTg0NTcxIFEgNjAuNjI0MDI3IDEzLjcxMDkzNzUgNjAuOTcwNDYgMTQuMDE5Nzc2IFEgNjEuMzE2ODk1IDE0LjMyODYxMyA2MS45MTMwOSAxNC4zMjg2MTMgUSA2Mi43MzQ4NjMgMTQuMzI4NjEzIDYzLjIzMTY5IDEzLjc0NTg1IFEgNjMuNzI4NTE2IDEzLjE2MzA4NiA2My43Mjg1MTYgMTIuMTk2Mjg5IEwgNjMuNzI4NTE2IDExLjk3NjA3NCBMIDYyLjc0NTYwNSAxMS45NzYwNzQgWiBNIDY0LjcxNjggMTEuNTY3ODcxIEwgNjQuNzE2OCAxNSBMIDYzLjcyODUxNiAxNSBMIDYzLjcyODUxNiAxNC4wODY5MTUgUSA2My4zOTAxMzcgMTQuNjM0NzY2IDYyLjg4NTI1NCAxNC44OTUyNjQgUSA2Mi4zODAzNyAxNS4xNTU3NjIgNjEuNjQ5OTA2IDE1LjE1NTc2MiBRIDYwLjcyNjA3NCAxNS4xNTU3NjIgNjAuMTgwOTEgMTQuNjM3NDUxIFEgNTkuNjM1NzQyIDE0LjExOTE0MiA1OS42MzU3NDIgMTMuMjQ5MDI0IFEgNTkuNjM1NzQyIDEyLjIzMzg4NyA2MC4zMTUxODYgMTEuNzE4MjYyIFEgNjAuOTk0NjI1IDExLjIwMjYzNyA2Mi4zNDI3NzMgMTEuMjAyNjM3IEwgNjMuNzI4NTE2IDExLjIwMjYzNyBMIDYzLjcyODUxNiAxMS4xMDU5NTcgUSA2My43Mjg1MTYgMTAuNDIzODI4IDYzLjI4MDAzIDEwLjA1MDUzNyBRIDYyLjgzMTU0MyA5LjY3NzI0NiA2Mi4wMjA1MDQgOS42NzcyNDYgUSA2MS41MDQ4OCA5LjY3NzI0NiA2MS4wMTYxMTcgOS44MDA3ODEgUSA2MC41MjczNDQgOS45MjQzMTYgNjAuMDc2MTcgMTAuMTcxMzg3IEwgNjAuMDc2MTcgOS4yNTgzMDEgUSA2MC42MTg2NTYgOS4wNDg4MjggNjEuMTI4OTEgOC45NDQwOTIgUSA2MS42MzkxNTYgOC44MzkzNTUgNjIuMTIyNTYgOC44MzkzNTUgUSA2My40Mjc3MzQgOC44MzkzNTUgNjQuMDcyMjY2IDkuNTE2MTEzIFEgNjQuNzE2OCAxMC4xOTI4NzEgNjQuNzE2OCAxMS41Njc4NzEgWiBNIDcwLjcxMDk0IDExLjkyMjM2MyBRIDcwLjcxMDk0IDEwLjg0ODE0NSA3MC4yNjc4MiAxMC4yNTczMjQgUSA2OS44MjQ3MSA5LjY2NjUwNCA2OS4wMjQ0MTQgOS42NjY1MDQgUSA2OC4yMjk0OSA5LjY2NjUwNCA2Ny43ODYzOCAxMC4yNTczMjQgUSA2Ny4zNDMyNiAxMC44NDgxNDUgNjcuMzQzMjYgMTEuOTIyMzYzIFEgNjcuMzQzMjYgMTIuOTkxMjEyIDY3Ljc4NjM4IDEzLjU4MjAzMSBRIDY4LjIyOTQ5IDE0LjE3Mjg1MiA2OS4wMjQ0MTQgMTQuMTcyODUyIFEgNjkuODI0NzEgMTQuMTcyODUyIDcwLjI2NzgyIDEzLjU4MjAzMSBRIDcwLjcxMDk0IDEyLjk5MTIxMiA3MC43MTA5NCAxMS45MjIzNjMgWiBNIDcxLjY5OTIyIDE0LjI1MzQxOCBRIDcxLjY5OTIyIDE1Ljc4OTU1MiA3MS4wMTcwOSAxNi41Mzg4MTggUSA3MC4zMzQ5NiAxNy4yODgwODYgNjguOTI3NzM0IDE3LjI4ODA4NiBRIDY4LjQwNjc0IDE3LjI4ODA4NiA2Ny45NDQ4MjQgMTcuMjEwMjA1IFEgNjcuNDgyOTEgMTcuMTMyMzI0IDY3LjA0Nzg1IDE2Ljk3MTE5MSBMIDY3LjA0Nzg1IDE2LjAwOTc2NiBRIDY3LjQ4MjkxIDE2LjI0NjA5NCA2Ny45MDcyMyAxNi4zNTg4ODcgUSA2OC4zMzE1NCAxNi40NzE2OCA2OC43NzE5NyAxNi40NzE2OCBRIDY5Ljc0NDE0IDE2LjQ3MTY4IDcwLjIyNzU0IDE1Ljk2NDExMSBRIDcwLjcxMDk0IDE1LjQ1NjU0MyA3MC43MTA5NCAxNC40MzA2NjQgTCA3MC43MTA5NCAxMy45NDE4OTUgUSA3MC40MDQ3ODUgMTQuNDczNjMzIDY5LjkyNjc2IDE0LjczNjgxNiBRIDY5LjQ0ODczIDE1IDY4Ljc4MjcxNSAxNSBRIDY3LjY3NjI3IDE1IDY2Ljk5OTUxIDE0LjE1NjczOCBRIDY2LjMyMjc1NCAxMy4zMTM0Nzc1IDY2LjMyMjc1NCAxMS45MjIzNjMgUSA2Ni4zMjI3NTQgMTAuNTI1ODc5IDY2Ljk5OTUxIDkuNjgyNjE3IFEgNjcuNjc2MjcgOC44MzkzNTUgNjguNzgyNzE1IDguODM5MzU1IFEgNjkuNDQ4NzMgOC44MzkzNTUgNjkuOTI2NzYgOS4xMDI1MzkgUSA3MC40MDQ3ODUgOS4zNjU3MjMgNzAuNzEwOTQgOS44OTc0NjEgTCA3MC43MTA5NCA4Ljk4NDM3NSBMIDcxLjY5OTIyIDguOTg0Mzc1IEwgNzEuNjk5MjIgMTQuMjUzNDE4IFogTSA3OC44ODAzNyAxMS43NDUxMTcgTCA3OC44ODAzNyAxMi4yMjg1MTYgTCA3NC4zMzY0MjYgMTIuMjI4NTE2IFEgNzQuNDAwODggMTMuMjQ5MDI0IDc0Ljk1MTQxNiAxMy43ODM0NDcgUSA3NS41MDE5NSAxNC4zMTc4NzEgNzYuNDg0ODYgMTQuMzE3ODcxIFEgNzcuMDU0MiAxNC4zMTc4NzEgNzcuNTg4NjIgMTQuMTc4MjIyIFEgNzguMTIzMDUgMTQuMDM4NTc0IDc4LjY0OTQxNCAxMy43NTkyNzYgTCA3OC42NDk0MTQgMTQuNjkzODQ3IFEgNzguMTE3Njc2IDE0LjkxOTQzMyA3Ny41NTkwOCAxNS4wMzc1OTggUSA3Ny4wMDA0OSAxNS4xNTU3NjIgNzYuNDI1NzggMTUuMTU1NzYyIFEgNzQuOTg2MzMgMTUuMTU1NzYyIDc0LjE0NTc1IDE0LjMxNzg3MSBRIDczLjMwNTE3NiAxMy40Nzk5OCA3My4zMDUxNzYgMTIuMDUxMjcgUSA3My4zMDUxNzYgMTAuNTc0MjE5IDc0LjEwMjc4IDkuNzA2Nzg3IFEgNzQuOTAwMzkgOC44MzkzNTUgNzYuMjUzOTEgOC44MzkzNTUgUSA3Ny40Njc3NyA4LjgzOTM1NSA3OC4xNzQwNyA5LjYyMDg1IFEgNzguODgwMzcgMTAuNDAyMzQ0IDc4Ljg4MDM3IDExLjc0NTExNyBaIE0gNzcuODkyMDkgMTEuNDU1MDc4IFEgNzcuODgxMzUgMTAuNjQ0MDQzIDc3LjQzODIzIDEwLjE2MDY0NSBRIDc2Ljk5NTEyIDkuNjc3MjQ2IDc2LjI2NDY1IDkuNjc3MjQ2IFEgNzUuNDM3NSA5LjY3NzI0NiA3NC45NDA2NzQgMTAuMTQ0NTMxIFEgNzQuNDQzODUgMTAuNjExODE2IDc0LjM2ODY1IDExLjQ2MDQ0OSBMIDc3Ljg5MjA5IDExLjQ1NTA3OCBaIi8+CiAgICA8L2c+CiAgICA8ZwogICAgICBpZD0idFRleHQiPgogICAgICA8cGF0aAogICAgICAgIGZpbGw9IiNmZmZmZmYiCiAgICAgICAgc3Ryb2tlPSIjZmZmZmZmIgogICAgICAgIHN0cm9rZS13aWR0aD0iMC4zIgogICAgICAgIGQ9Ik0gNy45OTI2NzYgMTMuMDk3NjU2IEwgNy45OTI2NzYgMTYuMjg4MDg2IEwgNi45OTkwMjM0IDE2LjI4ODA4NiBMIDYuOTk5MDIzNCA3Ljk4NDM3NSBMIDcuOTkyNjc2IDcuOTg0Mzc1IEwgNy45OTI2NzYgOC44OTc0NjEgUSA4LjMwNDE5OSA4LjM2MDM1MiA4Ljc3OTU0MSA4LjA5OTg1MzUgUSA5LjI1NDg4MyA3LjgzOTM1NTUgOS45MTU1MjcgNy44MzkzNTU1IFEgMTEuMDExMjMgNy44MzkzNTU1IDExLjY5NjA0NSA4LjcwOTQ3MyBRIDEyLjM4MDg1OCA5LjU3OTU5IDEyLjM4MDg1OCAxMC45OTc1NTkgUSAxMi4zODA4NTggMTIuNDE1NTI3IDExLjY5NjA0NSAxMy4yODU2NDUgUSAxMS4wMTEyMyAxNC4xNTU3NjIgOS45MTU1MjcgMTQuMTU1NzYyIFEgOS4yNTQ4ODMgMTQuMTU1NzYyIDguNzc5NTQxIDEzLjg5NTI2NCBRIDguMzA0MTk5IDEzLjYzNDc2NiA3Ljk5MjY3NiAxMy4wOTc2NTYgWiBNIDExLjM1NDk3OTUgMTAuOTk3NTU5IFEgMTEuMzU0OTc5NSA5LjkwNzIyNyAxMC45MDY0OTUgOS4yODY4NjUgUSAxMC40NTgwMDggOC42NjY1MDQgOS42NzM4MjggOC42NjY1MDQgUSA4Ljg4OTY0OCA4LjY2NjUwNCA4LjQ0MTE2MiA5LjI4Njg2NSBRIDcuOTkyNjc2IDkuOTA3MjI3IDcuOTkyNjc2IDEwLjk5NzU1OSBRIDcuOTkyNjc2IDEyLjA4Nzg5MiA4LjQ0MTE2MiAxMi43MDgyNTIgUSA4Ljg4OTY0OCAxMy4zMjg2MTMgOS42NzM4MjggMTMuMzI4NjEzIFEgMTAuNDU4MDA4IDEzLjMyODYxMyAxMC45MDY0OTUgMTIuNzA4MjUyIFEgMTEuMzU0OTc5NSAxMi4wODc4OTIgMTEuMzU0OTc5NSAxMC45OTc1NTkgWiBNIDE2LjUyMTk3MyAxNC41NTg1OTQgUSAxNi4xMDMwMjcgMTUuNjMyODEyNSAxNS43MDU1NjYgMTUuOTYwNDQ5IFEgMTUuMzA4MTA0NSAxNi4yODgwODYgMTQuNjQyMDkgMTYuMjg4MDg2IEwgMTMuODUyNTM5IDE2LjI4ODA4NiBMIDEzLjg1MjUzOSAxNS40NjA5MzcgTCAxNC40MzI2MTcgMTUuNDYwOTM3IFEgMTQuODQwODIgMTUuNDYwOTM3IDE1LjA2NjQwNiAxNS4yNjc1NzcgUSAxNS4yOTE5OTIgMTUuMDc0MjE4IDE1LjU2NTkxNyAxNC4zNTQ0OTIgTCAxNS43NDMxNjQgMTMuOTAzMzIgTCAxMy4zMTAwNTkgNy45ODQzNzUgTCAxNC4zNTc0MjIgNy45ODQzNzUgTCAxNi4yMzczMDUgMTIuNjg5NDUzIEwgMTguMTE3MTg4IDcuOTg0Mzc1IEwgMTkuMTY0NTUgNy45ODQzNzUgTCAxNi41MjE5NzMgMTQuNTU4NTk0IFogTSAyMS40ODQ4NjMgMTMuMDk3NjU2IEwgMjEuNDg0ODYzIDE2LjI4ODA4NiBMIDIwLjQ5MTIxIDE2LjI4ODA4NiBMIDIwLjQ5MTIxIDcuOTg0Mzc1IEwgMjEuNDg0ODYzIDcuOTg0Mzc1IEwgMjEuNDg0ODYzIDguODk3NDYxIFEgMjEuNzk2Mzg5IDguMzYwMzUyIDIyLjI3MTcyOSA4LjA5OTg1MzUgUSAyMi43NDcwNyA3LjgzOTM1NTUgMjMuNDA3NzE3IDcuODM5MzU1NSBRIDI0LjUwMzQxOCA3LjgzOTM1NTUgMjUuMTg4MjMyIDguNzA5NDczIFEgMjUuODczMDQ3IDkuNTc5NTkgMjUuODczMDQ3IDEwLjk5NzU1OSBRIDI1Ljg3MzA0NyAxMi40MTU1MjcgMjUuMTg4MjMyIDEzLjI4NTY0NSBRIDI0LjUwMzQxOCAxNC4xNTU3NjIgMjMuNDA3NzE3IDE0LjE1NTc2MiBRIDIyLjc0NzA3IDE0LjE1NTc2MiAyMi4yNzE3MjkgMTMuODk1MjY0IFEgMjEuNzk2Mzg5IDEzLjYzNDc2NiAyMS40ODQ4NjMgMTMuMDk3NjU2IFogTSAyNC44NDcxNjggMTAuOTk3NTU5IFEgMjQuODQ3MTY4IDkuOTA3MjI3IDI0LjM5ODY4MiA5LjI4Njg2NSBRIDIzLjk1MDE5NSA4LjY2NjUwNCAyMy4xNjYwMTYgOC42NjY1MDQgUSAyMi4zODE4MzYgOC42NjY1MDQgMjEuOTMzMzUgOS4yODY4NjUgUSAyMS40ODQ4NjMgOS45MDcyMjcgMjEuNDg0ODYzIDEwLjk5NzU1OSBRIDIxLjQ4NDg2MyAxMi4wODc4OTIgMjEuOTMzMzUgMTIuNzA4MjUyIFEgMjIuMzgxODM2IDEzLjMyODYxMyAyMy4xNjYwMTYgMTMuMzI4NjEzIFEgMjMuOTUwMTk1IDEzLjMyODYxMyAyNC4zOTg2ODIgMTIuNzA4MjUyIFEgMjQuODQ3MTY4IDEyLjA4Nzg5MiAyNC44NDcxNjggMTAuOTk3NTU5IFogTSAyNy41MTEyMjkgNy45ODQzNzUgTCAyOC40OTk1MTIgNy45ODQzNzUgTCAyOC40OTk1MTIgMTQgTCAyNy41MTEyMjkgMTQgTCAyNy41MTEyMjkgNy45ODQzNzUgWiBNIDI3LjUxMTIyOSA1LjY0MjU3OCBMIDI4LjQ5OTUxMiA1LjY0MjU3OCBMIDI4LjQ5OTUxMiA2Ljg5NDA0MyBMIDI3LjUxMTIyOSA2Ljg5NDA0MyBMIDI3LjUxMTIyOSA1LjY0MjU3OCBaIE0gMzUuMDIwMDIgMTMuMDk3NjU2IEwgMzUuMDIwMDIgMTYuMjg4MDg2IEwgMzQuMDI2MzY3IDE2LjI4ODA4NiBMIDM0LjAyNjM2NyA3Ljk4NDM3NSBMIDM1LjAyMDAyIDcuOTg0Mzc1IEwgMzUuMDIwMDIgOC44OTc0NjEgUSAzNS4zMzE1NDMgOC4zNjAzNTIgMzUuODA2ODg1IDguMDk5ODUzNSBRIDM2LjI4MjIyNyA3LjgzOTM1NTUgMzYuOTQyODcgNy44MzkzNTU1IFEgMzguMDM4NTc0IDcuODM5MzU1NSAzOC43MjMzOSA4LjcwOTQ3MyBRIDM5LjQwODIwMyA5LjU3OTU5IDM5LjQwODIwMyAxMC45OTc1NTkgUSAzOS40MDgyMDMgMTIuNDE1NTI3IDM4LjcyMzM5IDEzLjI4NTY0NSBRIDM4LjAzODU3NCAxNC4xNTU3NjIgMzYuOTQyODcgMTQuMTU1NzYyIFEgMzYuMjgyMjI3IDE0LjE1NTc2MiAzNS44MDY4ODUgMTMuODk1MjY0IFEgMzUuMzMxNTQzIDEzLjYzNDc2NiAzNS4wMjAwMiAxMy4wOTc2NTYgWiBNIDM4LjM4MjMyNCAxMC45OTc1NTkgUSAzOC4zODIzMjQgOS45MDcyMjcgMzcuOTMzODM4IDkuMjg2ODY1IFEgMzcuNDg1MzUgOC42NjY1MDQgMzYuNzAxMTcgOC42NjY1MDQgUSAzNS45MTY5OTIgOC42NjY1MDQgMzUuNDY4NTA2IDkuMjg2ODY1IFEgMzUuMDIwMDIgOS45MDcyMjcgMzUuMDIwMDIgMTAuOTk3NTU5IFEgMzUuMDIwMDIgMTIuMDg3ODkyIDM1LjQ2ODUwNiAxMi43MDgyNTIgUSAzNS45MTY5OTIgMTMuMzI4NjEzIDM2LjcwMTE3IDEzLjMyODYxMyBRIDM3LjQ4NTM1IDEzLjMyODYxMyAzNy45MzM4MzggMTIuNzA4MjUyIFEgMzguMzgyMzI0IDEyLjA4Nzg5MiAzOC4zODIzMjQgMTAuOTk3NTU5IFogTSA0My43ODAyNzMgMTAuOTc2MDc0IFEgNDIuNTgyNTIgMTAuOTc2MDc0IDQyLjEyMDYwNSAxMS4yNDk5OTkgUSA0MS42NTg2OSAxMS41MjM5MjYgNDEuNjU4NjkgMTIuMTg0NTcxIFEgNDEuNjU4NjkgMTIuNzEwOTM3NSA0Mi4wMDUxMjcgMTMuMDE5Nzc2IFEgNDIuMzUxNTYzIDEzLjMyODYxMyA0Mi45NDc3NTQgMTMuMzI4NjEzIFEgNDMuNzY5NTM1IDEzLjMyODYxMyA0NC4yNjYzNTcgMTIuNzQ1ODUgUSA0NC43NjMxODQgMTIuMTYzMDg2IDQ0Ljc2MzE4NCAxMS4xOTYyODkgTCA0NC43NjMxODQgMTAuOTc2MDc0IEwgNDMuNzgwMjczIDEwLjk3NjA3NCBaIE0gNDUuNzUxNDY1IDEwLjU2Nzg3MSBMIDQ1Ljc1MTQ2NSAxNCBMIDQ0Ljc2MzE4NCAxNCBMIDQ0Ljc2MzE4NCAxMy4wODY5MTUgUSA0NC40MjQ4MDUgMTMuNjM0NzY2IDQzLjkxOTkyIDEzLjg5NTI2NCBRIDQzLjQxNTA0IDE0LjE1NTc2MiA0Mi42ODQ1NyAxNC4xNTU3NjIgUSA0MS43NjA3NDIgMTQuMTU1NzYyIDQxLjIxNTU3NiAxMy42Mzc0NTEgUSA0MC42NzA0MSAxMy4xMTkxNDIgNDAuNjcwNDEgMTIuMjQ5MDI0IFEgNDAuNjcwNDEgMTEuMjMzODg3IDQxLjM0OTg1NCAxMC43MTgyNjIgUSA0Mi4wMjkyOTcgMTAuMjAyNjM3IDQzLjM3NzQ0NSAxMC4yMDI2MzcgTCA0NC43NjMxODQgMTAuMjAyNjM3IEwgNDQuNzYzMTg0IDEwLjEwNTk1NyBRIDQ0Ljc2MzE4NCA5LjQyMzgyOCA0NC4zMTQ2OTcgOS4wNTA1MzcgUSA0My44NjYyMSA4LjY3NzI0NiA0My4wNTUxNzYgOC42NzcyNDYgUSA0Mi41Mzk1NSA4LjY3NzI0NiA0Mi4wNTA3OCA4LjgwMDc4MSBRIDQxLjU2MjAxIDguOTI0MzE2IDQxLjExMDg0IDkuMTcxMzg3IEwgNDEuMTEwODQgOC4yNTgzMDEgUSA0MS42NTMzMiA4LjA0ODgyOCA0Mi4xNjM1NzQgNy45NDQwOTEzIFEgNDIuNjczODMgNy44MzkzNTU1IDQzLjE1NzIyNyA3LjgzOTM1NTUgUSA0NC40NjI0MDIgNy44MzkzNTU1IDQ1LjEwNjkzNCA4LjUxNjExMyBRIDQ1Ljc1MTQ2NSA5LjE5Mjg3MSA0NS43NTE0NjUgMTAuNTY3ODcxIFogTSA1Mi4xMTYyMDcgOC4yMTUzMzIgTCA1Mi4xMTYyMDcgOS4xMzkxNiBRIDUxLjY5NzI2NiA4LjkwODIwMyA1MS4yNzU2MyA4Ljc5MjcyNSBRIDUwLjg1NDAwNCA4LjY3NzI0NiA1MC40MjQzMTYgOC42NzcyNDYgUSA0OS40NjI4OSA4LjY3NzI0NiA0OC45MzExNTIgOS4yODY4NjUgUSA0OC4zOTk0MTggOS44OTY0ODQgNDguMzk5NDE4IDEwLjk5NzU1OSBRIDQ4LjM5OTQxOCAxMi4wOTg2MzMgNDguOTMxMTUyIDEyLjcwODI1MiBRIDQ5LjQ2Mjg5IDEzLjMxNzg3MSA1MC40MjQzMTYgMTMuMzE3ODcxIFEgNTAuODU0MDA0IDEzLjMxNzg3MSA1MS4yNzU2MyAxMy4yMDIzOTMgUSA1MS42OTcyNjYgMTMuMDg2OTE1IDUyLjExNjIwNyAxMi44NTU5NTYgTCA1Mi4xMTYyMDcgMTMuNzY5MDQzIFEgNTEuNzAyNjM3IDEzLjk2MjQwMiA1MS4yNTk1MiAxNC4wNTkwODIgUSA1MC44MTY0MDYgMTQuMTU1NzYyIDUwLjMxNjg5IDE0LjE1NTc2MiBRIDQ4Ljk1ODAwOCAxNC4xNTU3NjIgNDguMTU3NzE1IDEzLjMwMTc1OCBRIDQ3LjM1NzQxOCAxMi40NDc3NTQgNDcuMzU3NDE4IDEwLjk5NzU1OSBRIDQ3LjM1NzQxOCA5LjUyNTg3OSA0OC4xNjU3NyA4LjY4MjYxNyBRIDQ4Ljk3NDEyIDcuODM5MzU1NSA1MC4zODEzNDggNy44MzkzNTU1IFEgNTAuODM3ODk0IDcuODM5MzU1NSA1MS4yNzI5NSA3LjkzMzM0OTYgUSA1MS43MDgwMDggOC4wMjczNDQgNTIuMTE2MjA3IDguMjE1MzMyIFogTSA1My43OTczNjcgNS42NDI1NzggTCA1NC43OTEwMTYgNS42NDI1NzggTCA1NC43OTEwMTYgMTAuNTc4NjEzIEwgNTcuNzM5NzQ2IDcuOTg0Mzc1IEwgNTkuMDAxOTUzIDcuOTg0Mzc1IEwgNTUuODExNTIzIDEwLjc5ODgyNyBMIDU5LjEzNjIzIDE0IEwgNTcuODQ3MTY4IDE0IEwgNTQuNzkxMDE2IDExLjA2MjAxMiBMIDU0Ljc5MTAxNiAxNCBMIDUzLjc5NzM2NyAxNCBMIDUzLjc5NzM2NyA1LjY0MjU3OCBaIE0gNjIuNzQ1NjA1IDEwLjk3NjA3NCBRIDYxLjU0Nzg1IDEwLjk3NjA3NCA2MS4wODU5MzggMTEuMjQ5OTk5IFEgNjAuNjI0MDI3IDExLjUyMzkyNiA2MC42MjQwMjcgMTIuMTg0NTcxIFEgNjAuNjI0MDI3IDEyLjcxMDkzNzUgNjAuOTcwNDYgMTMuMDE5Nzc2IFEgNjEuMzE2ODk1IDEzLjMyODYxMyA2MS45MTMwOSAxMy4zMjg2MTMgUSA2Mi43MzQ4NjMgMTMuMzI4NjEzIDYzLjIzMTY5IDEyLjc0NTg1IFEgNjMuNzI4NTE2IDEyLjE2MzA4NiA2My43Mjg1MTYgMTEuMTk2Mjg5IEwgNjMuNzI4NTE2IDEwLjk3NjA3NCBMIDYyLjc0NTYwNSAxMC45NzYwNzQgWiBNIDY0LjcxNjggMTAuNTY3ODcxIEwgNjQuNzE2OCAxNCBMIDYzLjcyODUxNiAxNCBMIDYzLjcyODUxNiAxMy4wODY5MTUgUSA2My4zOTAxMzcgMTMuNjM0NzY2IDYyLjg4NTI1NCAxMy44OTUyNjQgUSA2Mi4zODAzNyAxNC4xNTU3NjIgNjEuNjQ5OTA2IDE0LjE1NTc2MiBRIDYwLjcyNjA3NCAxNC4xNTU3NjIgNjAuMTgwOTEgMTMuNjM3NDUxIFEgNTkuNjM1NzQyIDEzLjExOTE0MiA1OS42MzU3NDIgMTIuMjQ5MDI0IFEgNTkuNjM1NzQyIDExLjIzMzg4NyA2MC4zMTUxODYgMTAuNzE4MjYyIFEgNjAuOTk0NjI1IDEwLjIwMjYzNyA2Mi4zNDI3NzMgMTAuMjAyNjM3IEwgNjMuNzI4NTE2IDEwLjIwMjYzNyBMIDYzLjcyODUxNiAxMC4xMDU5NTcgUSA2My43Mjg1MTYgOS40MjM4MjggNjMuMjgwMDMgOS4wNTA1MzcgUSA2Mi44MzE1NDMgOC42NzcyNDYgNjIuMDIwNTA0IDguNjc3MjQ2IFEgNjEuNTA0ODggOC42NzcyNDYgNjEuMDE2MTE3IDguODAwNzgxIFEgNjAuNTI3MzQ0IDguOTI0MzE2IDYwLjA3NjE3IDkuMTcxMzg3IEwgNjAuMDc2MTcgOC4yNTgzMDEgUSA2MC42MTg2NTYgOC4wNDg4MjggNjEuMTI4OTEgNy45NDQwOTEzIFEgNjEuNjM5MTU2IDcuODM5MzU1NSA2Mi4xMjI1NiA3LjgzOTM1NTUgUSA2My40Mjc3MzQgNy44MzkzNTU1IDY0LjA3MjI2NiA4LjUxNjExMyBRIDY0LjcxNjggOS4xOTI4NzEgNjQuNzE2OCAxMC41Njc4NzEgWiBNIDcwLjcxMDk0IDEwLjkyMjM2MyBRIDcwLjcxMDk0IDkuODQ4MTQ1IDcwLjI2NzgyIDkuMjU3MzI0IFEgNjkuODI0NzEgOC42NjY1MDQgNjkuMDI0NDE0IDguNjY2NTA0IFEgNjguMjI5NDkgOC42NjY1MDQgNjcuNzg2MzggOS4yNTczMjQgUSA2Ny4zNDMyNiA5Ljg0ODE0NSA2Ny4zNDMyNiAxMC45MjIzNjMgUSA2Ny4zNDMyNiAxMS45OTEyMTIgNjcuNzg2MzggMTIuNTgyMDMxIFEgNjguMjI5NDkgMTMuMTcyODUyIDY5LjAyNDQxNCAxMy4xNzI4NTIgUSA2OS44MjQ3MSAxMy4xNzI4NTIgNzAuMjY3ODIgMTIuNTgyMDMxIFEgNzAuNzEwOTQgMTEuOTkxMjEyIDcwLjcxMDk0IDEwLjkyMjM2MyBaIE0gNzEuNjk5MjIgMTMuMjUzNDE4IFEgNzEuNjk5MjIgMTQuNzg5NTUyIDcxLjAxNzA5IDE1LjUzODgxOCBRIDcwLjMzNDk2IDE2LjI4ODA4NiA2OC45Mjc3MzQgMTYuMjg4MDg2IFEgNjguNDA2NzQgMTYuMjg4MDg2IDY3Ljk0NDgyNCAxNi4yMTAyMDUgUSA2Ny40ODI5MSAxNi4xMzIzMjQgNjcuMDQ3ODUgMTUuOTcxMTkxIEwgNjcuMDQ3ODUgMTUuMDA5NzY1IFEgNjcuNDgyOTEgMTUuMjQ2MDk0IDY3LjkwNzIzIDE1LjM1ODg4NyBRIDY4LjMzMTU0IDE1LjQ3MTY4IDY4Ljc3MTk3IDE1LjQ3MTY4IFEgNjkuNzQ0MTQgMTUuNDcxNjggNzAuMjI3NTQgMTQuOTY0MTExIFEgNzAuNzEwOTQgMTQuNDU2NTQzIDcwLjcxMDk0IDEzLjQzMDY2NCBMIDcwLjcxMDk0IDEyLjk0MTg5NSBRIDcwLjQwNDc4NSAxMy40NzM2MzMgNjkuOTI2NzYgMTMuNzM2ODE2IFEgNjkuNDQ4NzMgMTQgNjguNzgyNzE1IDE0IFEgNjcuNjc2MjcgMTQgNjYuOTk5NTEgMTMuMTU2NzM4IFEgNjYuMzIyNzU0IDEyLjMxMzQ3NzUgNjYuMzIyNzU0IDEwLjkyMjM2MyBRIDY2LjMyMjc1NCA5LjUyNTg3OSA2Ni45OTk1MSA4LjY4MjYxNyBRIDY3LjY3NjI3IDcuODM5MzU1NSA2OC43ODI3MTUgNy44MzkzNTU1IFEgNjkuNDQ4NzMgNy44MzkzNTU1IDY5LjkyNjc2IDguMTAyNTM5IFEgNzAuNDA0Nzg1IDguMzY1NzIzIDcwLjcxMDk0IDguODk3NDYxIEwgNzAuNzEwOTQgNy45ODQzNzUgTCA3MS42OTkyMiA3Ljk4NDM3NSBMIDcxLjY5OTIyIDEzLjI1MzQxOCBaIE0gNzguODgwMzcgMTAuNzQ1MTE3IEwgNzguODgwMzcgMTEuMjI4NTE2IEwgNzQuMzM2NDI2IDExLjIyODUxNiBRIDc0LjQwMDg4IDEyLjI0OTAyNCA3NC45NTE0MTYgMTIuNzgzNDQ3IFEgNzUuNTAxOTUgMTMuMzE3ODcxIDc2LjQ4NDg2IDEzLjMxNzg3MSBRIDc3LjA1NDIgMTMuMzE3ODcxIDc3LjU4ODYyIDEzLjE3ODIyMiBRIDc4LjEyMzA1IDEzLjAzODU3NCA3OC42NDk0MTQgMTIuNzU5Mjc2IEwgNzguNjQ5NDE0IDEzLjY5Mzg0NyBRIDc4LjExNzY3NiAxMy45MTk0MzMgNzcuNTU5MDggMTQuMDM3NTk4IFEgNzcuMDAwNDkgMTQuMTU1NzYyIDc2LjQyNTc4IDE0LjE1NTc2MiBRIDc0Ljk4NjMzIDE0LjE1NTc2MiA3NC4xNDU3NSAxMy4zMTc4NzEgUSA3My4zMDUxNzYgMTIuNDc5OTggNzMuMzA1MTc2IDExLjA1MTI3IFEgNzMuMzA1MTc2IDkuNTc0MjE5IDc0LjEwMjc4IDguNzA2Nzg3IFEgNzQuOTAwMzkgNy44MzkzNTU1IDc2LjI1MzkxIDcuODM5MzU1NSBRIDc3LjQ2Nzc3IDcuODM5MzU1NSA3OC4xNzQwNyA4LjYyMDg1IFEgNzguODgwMzcgOS40MDIzNDQgNzguODgwMzcgMTAuNzQ1MTE3IFogTSA3Ny44OTIwOSAxMC40NTUwNzggUSA3Ny44ODEzNSA5LjY0NDA0MyA3Ny40MzgyMyA5LjE2MDY0NSBRIDc2Ljk5NTEyIDguNjc3MjQ2IDc2LjI2NDY1IDguNjc3MjQ2IFEgNzUuNDM3NSA4LjY3NzI0NiA3NC45NDA2NzQgOS4xNDQ1MzEgUSA3NC40NDM4NSA5LjYxMTgxNiA3NC4zNjg2NSAxMC40NjA0NDkgTCA3Ny44OTIwOSAxMC40NTUwNzggWiIvPgogICAgPC9nPgogIDwvZz4KICA8Zz4KICAgIDxnCiAgICAgIGlkPSJ2QmFjayI+CiAgICAgIDxwYXRoCiAgICAgICAgZmlsbD0iIzAxMDEwMSIKICAgICAgICBmaWxsLW9wYWNpdHk9IjAuMyIKICAgICAgICBzdHJva2U9IiMwMTAxMDEiCiAgICAgICAgc3Ryb2tlLW9wYWNpdHk9IjAuMDk4MDM5MjIiCiAgICAgICAgc3Ryb2tlLXdpZHRoPSIwLjMiCiAgICAgICAgZD0iTSA5NC40OTY1OCA3LjY5NTMxMjUgUSA5My42NTg3IDcuNjk1MzEyNSA5My4yMzcwNiA4LjUxOTc3NSBRIDkyLjgxNTQzIDkuMzQ0MjM4IDkyLjgxNTQzIDEwLjk5ODUzNiBRIDkyLjgxNTQzIDEyLjY0NzQ2MSA5My4yMzcwNiAxMy40NzE5MjMgUSA5My42NTg3IDE0LjI5NjM4NyA5NC40OTY1OCAxNC4yOTYzODcgUSA5NS4zMzk4NSAxNC4yOTYzODcgOTUuNzYxNDggMTMuNDcxOTIzIFEgOTYuMTgzMSAxMi42NDc0NjEgOTYuMTgzMSAxMC45OTg1MzYgUSA5Ni4xODMxIDkuMzQ0MjM4IDk1Ljc2MTQ4IDguNTE5Nzc1IFEgOTUuMzM5ODUgNy42OTUzMTI1IDk0LjQ5NjU4IDcuNjk1MzEyNSBaIE0gOTQuNDk2NTggNi44MzU5Mzc1IFEgOTUuODQ0NzM0IDYuODM1OTM3NSA5Ni41NTY0MDQgNy45MDIwOTk2IFEgOTcuMjY4MDc0IDguOTY4MjYyIDk3LjI2ODA3NCAxMC45OTg1MzYgUSA5Ny4yNjgwNzQgMTMuMDIzNDM4IDk2LjU1NjQwNCAxNC4wODk2IFEgOTUuODQ0NzM0IDE1LjE1NTc2MiA5NC40OTY1OCAxNS4xNTU3NjIgUSA5My4xNDg0NCAxNS4xNTU3NjIgOTIuNDM2NzcgMTQuMDg5NiBRIDkxLjcyNTEgMTMuMDIzNDM4IDkxLjcyNTEgMTAuOTk4NTM2IFEgOTEuNzI1MSA4Ljk2ODI2MiA5Mi40MzY3NyA3LjkwMjA5OTYgUSA5My4xNDg0NCA2LjgzNTkzNzUgOTQuNDk2NTggNi44MzU5Mzc1IFogTSA5OS4xNzQ4MSAxMy42MzU3NDMgTCAxMDAuMzA4MSAxMy42MzU3NDMgTCAxMDAuMzA4MSAxNSBMIDk5LjE3NDgxIDE1IEwgOTkuMTc0ODEgMTMuNjM1NzQzIFogTSAxMDQuOTkxNzEgNy42OTUzMTI1IFEgMTA0LjE1MzgxIDcuNjk1MzEyNSAxMDMuNzMyMTcgOC41MTk3NzUgUSAxMDMuMzEwNTU1IDkuMzQ0MjM4IDEwMy4zMTA1NTUgMTAuOTk4NTM2IFEgMTAzLjMxMDU1NSAxMi42NDc0NjEgMTAzLjczMjE3IDEzLjQ3MTkyMyBRIDEwNC4xNTM4MSAxNC4yOTYzODcgMTA0Ljk5MTcxIDE0LjI5NjM4NyBRIDEwNS44MzQ5NSAxNC4yOTYzODcgMTA2LjI1NjU5IDEzLjQ3MTkyMyBRIDEwNi42NzgyMiAxMi42NDc0NjEgMTA2LjY3ODIyIDEwLjk5ODUzNiBRIDEwNi42NzgyMiA5LjM0NDIzOCAxMDYuMjU2NTkgOC41MTk3NzUgUSAxMDUuODM0OTUgNy42OTUzMTI1IDEwNC45OTE3MSA3LjY5NTMxMjUgWiBNIDEwNC45OTE3MSA2LjgzNTkzNzUgUSAxMDYuMzM5ODQgNi44MzU5Mzc1IDEwNy4wNTE1MDYgNy45MDIwOTk2IFEgMTA3Ljc2MzE3NiA4Ljk2ODI2MiAxMDcuNzYzMTc2IDEwLjk5ODUzNiBRIDEwNy43NjMxNzYgMTMuMDIzNDM4IDEwNy4wNTE1MDYgMTQuMDg5NiBRIDEwNi4zMzk4NCAxNS4xNTU3NjIgMTA0Ljk5MTcxIDE1LjE1NTc2MiBRIDEwMy42NDM1NTUgMTUuMTU1NzYyIDEwMi45MzE4ODUgMTQuMDg5NiBRIDEwMi4yMjAyMTUgMTMuMDIzNDM4IDEwMi4yMjAyMTUgMTAuOTk4NTM2IFEgMTAyLjIyMDIxNSA4Ljk2ODI2MiAxMDIuOTMxODg1IDcuOTAyMDk5NiBRIDEwMy42NDM1NTUgNi44MzU5Mzc1IDEwNC45OTE3MSA2LjgzNTkzNzUgWiBNIDEwOS42Njk5MiAxMy42MzU3NDMgTCAxMTAuODAzMjIgMTMuNjM1NzQzIEwgMTEwLjgwMzIyIDE1IEwgMTA5LjY2OTkyIDE1IEwgMTA5LjY2OTkyIDEzLjYzNTc0MyBaIE0gMTE1LjYyMTA4NiAxMC41NTgxMDUgUSAxMTQuODkwNjMgMTAuNTU4MTA1IDExNC40NjM2MiAxMS4wNTc2MTYgUSAxMTQuMDM2NjIgMTEuNTU3MTI5IDExNC4wMzY2MiAxMi40MjcyNDYgUSAxMTQuMDM2NjIgMTMuMjkxOTkyIDExNC40NjM2MiAxMy43OTQxOSBRIDExNC44OTA2MyAxNC4yOTYzODcgMTE1LjYyMTA4NiAxNC4yOTYzODcgUSAxMTYuMzUxNTYgMTQuMjk2Mzg3IDExNi43Nzg1NjQgMTMuNzk0MTkgUSAxMTcuMjA1NTcgMTMuMjkxOTkyIDExNy4yMDU1NyAxMi40MjcyNDYgUSAxMTcuMjA1NTcgMTEuNTU3MTI5IDExNi43Nzg1NjQgMTEuMDU3NjE2IFEgMTE2LjM1MTU2IDEwLjU1ODEwNSAxMTUuNjIxMDg2IDEwLjU1ODEwNSBaIE0gMTE3Ljc3NDkgNy4xNTgyMDI2IEwgMTE3Ljc3NDkgOC4xNDY0ODQgUSAxMTcuMzY2NyA3Ljk1MzEyNSAxMTYuOTUwNDQgNy44NTEwNzM3IFEgMTE2LjUzNDE4IDcuNzQ5MDIzNCAxMTYuMTI1OTcgNy43NDkwMjM0IFEgMTE1LjA1MTc2IDcuNzQ5MDIzNCAxMTQuNDg1MTEgOC40NzQxMjEgUSAxMTMuOTE4NDYgOS4xOTkyMTkgMTEzLjgzNzkgMTAuNjY1NTI3IFEgMTE0LjE1NDc4NSAxMC4xOTgyNDIgMTE0LjYzMjgyIDkuOTQ4NDg2IFEgMTE1LjExMDg0IDkuNjk4NzMgMTE1LjY4NTU1IDkuNjk4NzMgUSAxMTYuODk0MDQgOS42OTg3MyAxMTcuNTk0OTcgMTAuNDMxODg1IFEgMTE4LjI5NTkgMTEuMTY1MDM5IDExOC4yOTU5IDEyLjQyNzI0NiBRIDExOC4yOTU5IDEzLjY2MjU5NyAxMTcuNTY1NDMgMTQuNDA5MTggUSAxMTYuODM0OTYgMTUuMTU1NzYyIDExNS42MjEwODYgMTUuMTU1NzYyIFEgMTE0LjIyOTk5IDE1LjE1NTc2MiAxMTMuNDk0MTQgMTQuMDg5NiBRIDExMi43NTgzIDEzLjAyMzQzOCAxMTIuNzU4MyAxMC45OTg1MzYgUSAxMTIuNzU4MyA5LjA5NzE2OCAxMTMuNjYwNjQ1IDcuOTY2NTUyNyBRIDExNC41NjI5OSA2LjgzNTkzNzUgMTE2LjA4MzAxIDYuODM1OTM3NSBRIDExNi40OTEyMSA2LjgzNTkzNzUgMTE2LjkwNzQ3IDYuOTE2NTA0IFEgMTE3LjMyMzc0IDYuOTk3MDcwMyAxMTcuNzc0OSA3LjE1ODIwMjYgWiBNIDEyMC4xNzU3OCA2Ljk4MDk1NyBMIDEyNC40MzUwNiA2Ljk4MDk1NyBMIDEyNC40MzUwNiA3Ljg5NDA0MyBMIDEyMS4xNjk0MjYgNy44OTQwNDMgTCAxMjEuMTY5NDI2IDkuODU5ODYzIFEgMTIxLjQwNTc1NCA5Ljc3OTI5NyAxMjEuNjQyMDkgOS43MzkwMTQgUSAxMjEuODc4NDIgOS42OTg3MyAxMjIuMTE0NzQ2IDkuNjk4NzMgUSAxMjMuNDU3NTEgOS42OTg3MyAxMjQuMjQxNjkgMTAuNDM0NTcgUSAxMjUuMDI1ODcgMTEuMTcwNDEgMTI1LjAyNTg3IDEyLjQyNzI0NiBRIDEyNS4wMjU4NyAxMy43MjE2OCAxMjQuMjIwMjE1IDE0LjQzODcyMiBRIDEyMy40MTQ1NSAxNS4xNTU3NjIgMTIxLjk0ODI0IDE1LjE1NTc2MiBRIDEyMS40NDMzNiAxNS4xNTU3NjIgMTIwLjkxOTY4IDE1LjA2OTgyNCBRIDEyMC4zOTU5OSAxNC45ODM4ODYgMTE5LjgzNzQgMTQuODEyMDEyIEwgMTE5LjgzNzQgMTMuNzIxNjggUSAxMjAuMzIwOCAxMy45ODQ4NjIgMTIwLjgzNjQyNiAxNC4xMTM3NjkgUSAxMjEuMzUyMDUgMTQuMjQyNjc1IDEyMS45MjY3NiAxNC4yNDI2NzUgUSAxMjIuODU1OTYgMTQuMjQyNjc1IDEyMy4zOTg0NCAxMy43NTM5MDYgUSAxMjMuOTQwOTIgMTMuMjY1MTM3IDEyMy45NDA5MiAxMi40MjcyNDYgUSAxMjMuOTQwOTIgMTEuNTg5MzU1IDEyMy4zOTg0NCAxMS4xMDA1ODYgUSAxMjIuODU1OTYgMTAuNjExODE2IDEyMS45MjY3NiAxMC42MTE4MTYgUSAxMjEuNDkxNyAxMC42MTE4MTYgMTIxLjA1OTMyNiAxMC43MDg0OTYgUSAxMjAuNjI2OTUgMTAuODA1MTc3IDEyMC4xNzU3OCAxMS4wMDkyNzcgTCAxMjAuMTc1NzggNi45ODA5NTcgWiIvPgogICAgPC9nPgogICAgPGcKICAgICAgaWQ9InZUZXh0Ij4KICAgICAgPHBhdGgKICAgICAgICBmaWxsPSIjZmZmZmZmIgogICAgICAgIHN0cm9rZT0iI2ZmZmZmZiIKICAgICAgICBzdHJva2Utd2lkdGg9IjAuMyIKICAgICAgICBkPSJNIDk0LjQ5NjU4IDYuNjk1MzEyNSBRIDkzLjY1ODcgNi42OTUzMTI1IDkzLjIzNzA2IDcuNTE5Nzc1NCBRIDkyLjgxNTQzIDguMzQ0MjM4IDkyLjgxNTQzIDkuOTk4NTM1IFEgOTIuODE1NDMgMTEuNjQ3NDYxIDkzLjIzNzA2IDEyLjQ3MTkyMyBRIDkzLjY1ODcgMTMuMjk2Mzg3IDk0LjQ5NjU4IDEzLjI5NjM4NyBRIDk1LjMzOTg1IDEzLjI5NjM4NyA5NS43NjE0OCAxMi40NzE5MjMgUSA5Ni4xODMxIDExLjY0NzQ2MSA5Ni4xODMxIDkuOTk4NTM1IFEgOTYuMTgzMSA4LjM0NDIzOCA5NS43NjE0OCA3LjUxOTc3NTQgUSA5NS4zMzk4NSA2LjY5NTMxMjUgOTQuNDk2NTggNi42OTUzMTI1IFogTSA5NC40OTY1OCA1LjgzNTkzNzUgUSA5NS44NDQ3MzQgNS44MzU5Mzc1IDk2LjU1NjQwNCA2LjkwMjA5OTYgUSA5Ny4yNjgwNzQgNy45NjgyNjE3IDk3LjI2ODA3NCA5Ljk5ODUzNSBRIDk3LjI2ODA3NCAxMi4wMjM0MzggOTYuNTU2NDA0IDEzLjA4OTYgUSA5NS44NDQ3MzQgMTQuMTU1NzYyIDk0LjQ5NjU4IDE0LjE1NTc2MiBRIDkzLjE0ODQ0IDE0LjE1NTc2MiA5Mi40MzY3NyAxMy4wODk2IFEgOTEuNzI1MSAxMi4wMjM0MzggOTEuNzI1MSA5Ljk5ODUzNSBRIDkxLjcyNTEgNy45NjgyNjE3IDkyLjQzNjc3IDYuOTAyMDk5NiBRIDkzLjE0ODQ0IDUuODM1OTM3NSA5NC40OTY1OCA1LjgzNTkzNzUgWiBNIDk5LjE3NDgxIDEyLjYzNTc0MyBMIDEwMC4zMDgxIDEyLjYzNTc0MyBMIDEwMC4zMDgxIDE0IEwgOTkuMTc0ODEgMTQgTCA5OS4xNzQ4MSAxMi42MzU3NDMgWiBNIDEwNC45OTE3MSA2LjY5NTMxMjUgUSAxMDQuMTUzODEgNi42OTUzMTI1IDEwMy43MzIxNyA3LjUxOTc3NTQgUSAxMDMuMzEwNTU1IDguMzQ0MjM4IDEwMy4zMTA1NTUgOS45OTg1MzUgUSAxMDMuMzEwNTU1IDExLjY0NzQ2MSAxMDMuNzMyMTcgMTIuNDcxOTIzIFEgMTA0LjE1MzgxIDEzLjI5NjM4NyAxMDQuOTkxNzEgMTMuMjk2Mzg3IFEgMTA1LjgzNDk1IDEzLjI5NjM4NyAxMDYuMjU2NTkgMTIuNDcxOTIzIFEgMTA2LjY3ODIyIDExLjY0NzQ2MSAxMDYuNjc4MjIgOS45OTg1MzUgUSAxMDYuNjc4MjIgOC4zNDQyMzggMTA2LjI1NjU5IDcuNTE5Nzc1NCBRIDEwNS44MzQ5NSA2LjY5NTMxMjUgMTA0Ljk5MTcxIDYuNjk1MzEyNSBaIE0gMTA0Ljk5MTcxIDUuODM1OTM3NSBRIDEwNi4zMzk4NCA1LjgzNTkzNzUgMTA3LjA1MTUwNiA2LjkwMjA5OTYgUSAxMDcuNzYzMTc2IDcuOTY4MjYxNyAxMDcuNzYzMTc2IDkuOTk4NTM1IFEgMTA3Ljc2MzE3NiAxMi4wMjM0MzggMTA3LjA1MTUwNiAxMy4wODk2IFEgMTA2LjMzOTg0IDE0LjE1NTc2MiAxMDQuOTkxNzEgMTQuMTU1NzYyIFEgMTAzLjY0MzU1NSAxNC4xNTU3NjIgMTAyLjkzMTg4NSAxMy4wODk2IFEgMTAyLjIyMDIxNSAxMi4wMjM0MzggMTAyLjIyMDIxNSA5Ljk5ODUzNSBRIDEwMi4yMjAyMTUgNy45NjgyNjE3IDEwMi45MzE4ODUgNi45MDIwOTk2IFEgMTAzLjY0MzU1NSA1LjgzNTkzNzUgMTA0Ljk5MTcxIDUuODM1OTM3NSBaIE0gMTA5LjY2OTkyIDEyLjYzNTc0MyBMIDExMC44MDMyMiAxMi42MzU3NDMgTCAxMTAuODAzMjIgMTQgTCAxMDkuNjY5OTIgMTQgTCAxMDkuNjY5OTIgMTIuNjM1NzQzIFogTSAxMTUuNjIxMDg2IDkuNTU4MTA1IFEgMTE0Ljg5MDYzIDkuNTU4MTA1IDExNC40NjM2MiAxMC4wNTc2MTcgUSAxMTQuMDM2NjIgMTAuNTU3MTI5IDExNC4wMzY2MiAxMS40MjcyNDYgUSAxMTQuMDM2NjIgMTIuMjkxOTkyIDExNC40NjM2MiAxMi43OTQxOSBRIDExNC44OTA2MyAxMy4yOTYzODcgMTE1LjYyMTA4NiAxMy4yOTYzODcgUSAxMTYuMzUxNTYgMTMuMjk2Mzg3IDExNi43Nzg1NjQgMTIuNzk0MTkgUSAxMTcuMjA1NTcgMTIuMjkxOTkyIDExNy4yMDU1NyAxMS40MjcyNDYgUSAxMTcuMjA1NTcgMTAuNTU3MTI5IDExNi43Nzg1NjQgMTAuMDU3NjE3IFEgMTE2LjM1MTU2IDkuNTU4MTA1IDExNS42MjEwODYgOS41NTgxMDUgWiBNIDExNy43NzQ5IDYuMTU4MjAyNiBMIDExNy43NzQ5IDcuMTQ2NDg0NCBRIDExNy4zNjY3IDYuOTUzMTI1IDExNi45NTA0NCA2Ljg1MTA3MzcgUSAxMTYuNTM0MTggNi43NDkwMjM0IDExNi4xMjU5NyA2Ljc0OTAyMzQgUSAxMTUuMDUxNzYgNi43NDkwMjM0IDExNC40ODUxMSA3LjQ3NDEyMSBRIDExMy45MTg0NiA4LjE5OTIxOSAxMTMuODM3OSA5LjY2NTUyNyBRIDExNC4xNTQ3ODUgOS4xOTgyNDIgMTE0LjYzMjgyIDguOTQ4NDg2IFEgMTE1LjExMDg0IDguNjk4NzMgMTE1LjY4NTU1IDguNjk4NzMgUSAxMTYuODk0MDQgOC42OTg3MyAxMTcuNTk0OTcgOS40MzE4ODUgUSAxMTguMjk1OSAxMC4xNjUwMzkgMTE4LjI5NTkgMTEuNDI3MjQ2IFEgMTE4LjI5NTkgMTIuNjYyNTk3IDExNy41NjU0MyAxMy40MDkxOCBRIDExNi44MzQ5NiAxNC4xNTU3NjIgMTE1LjYyMTA4NiAxNC4xNTU3NjIgUSAxMTQuMjI5OTkgMTQuMTU1NzYyIDExMy40OTQxNCAxMy4wODk2IFEgMTEyLjc1ODMgMTIuMDIzNDM4IDExMi43NTgzIDkuOTk4NTM1IFEgMTEyLjc1ODMgOC4wOTcxNjggMTEzLjY2MDY0NSA2Ljk2NjU1MjcgUSAxMTQuNTYyOTkgNS44MzU5Mzc1IDExNi4wODMwMSA1LjgzNTkzNzUgUSAxMTYuNDkxMjEgNS44MzU5Mzc1IDExNi45MDc0NyA1LjkxNjUwNCBRIDExNy4zMjM3NCA1Ljk5NzA3MDMgMTE3Ljc3NDkgNi4xNTgyMDI2IFogTSAxMjAuMTc1NzggNS45ODA5NTcgTCAxMjQuNDM1MDYgNS45ODA5NTcgTCAxMjQuNDM1MDYgNi44OTQwNDMgTCAxMjEuMTY5NDI2IDYuODk0MDQzIEwgMTIxLjE2OTQyNiA4Ljg1OTg2MyBRIDEyMS40MDU3NTQgOC43NzkyOTcgMTIxLjY0MjA5IDguNzM5MDE0IFEgMTIxLjg3ODQyIDguNjk4NzMgMTIyLjExNDc0NiA4LjY5ODczIFEgMTIzLjQ1NzUxIDguNjk4NzMgMTI0LjI0MTY5IDkuNDM0NTcgUSAxMjUuMDI1ODcgMTAuMTcwNDEgMTI1LjAyNTg3IDExLjQyNzI0NiBRIDEyNS4wMjU4NyAxMi43MjE2OCAxMjQuMjIwMjE1IDEzLjQzODcyMiBRIDEyMy40MTQ1NSAxNC4xNTU3NjIgMTIxLjk0ODI0IDE0LjE1NTc2MiBRIDEyMS40NDMzNiAxNC4xNTU3NjIgMTIwLjkxOTY4IDE0LjA2OTgyNCBRIDEyMC4zOTU5OSAxMy45ODM4ODYgMTE5LjgzNzQgMTMuODEyMDEyIEwgMTE5LjgzNzQgMTIuNzIxNjggUSAxMjAuMzIwOCAxMi45ODQ4NjIgMTIwLjgzNjQyNiAxMy4xMTM3NjkgUSAxMjEuMzUyMDUgMTMuMjQyNjc1IDEyMS45MjY3NiAxMy4yNDI2NzUgUSAxMjIuODU1OTYgMTMuMjQyNjc1IDEyMy4zOTg0NCAxMi43NTM5MDYgUSAxMjMuOTQwOTIgMTIuMjY1MTM3IDEyMy45NDA5MiAxMS40MjcyNDYgUSAxMjMuOTQwOTIgMTAuNTg5MzU1IDEyMy4zOTg0NCAxMC4xMDA1ODYgUSAxMjIuODU1OTYgOS42MTE4MTYgMTIxLjkyNjc2IDkuNjExODE2IFEgMTIxLjQ5MTcgOS42MTE4MTYgMTIxLjA1OTMyNiA5LjcwODQ5NiBRIDEyMC42MjY5NSA5LjgwNTE3NiAxMjAuMTc1NzggMTAuMDA5Mjc3IEwgMTIwLjE3NTc4IDUuOTgwOTU3IFoiLz4KICAgIDwvZz4KICA8L2c+Cjwvc3ZnPgo=" alt="PyPI version" /></a></p>
172
+ <p>Guessing reasonable defaults for locale, keyboard layout, territory,
173
+ and language.</p>
174
+ <h2 id="purpose-of-this-package">Purpose of this package</h2>
175
+ <p><em>langtable</em> is used to guess reasonable defaults for locale,
176
+ keyboard, territory, …, if part of that information is already known.
177
+ For example, guess the territory and the keyboard layout if the language
178
+ is known or guess the language and keyboard layout if the territory is
179
+ already known.</p>
180
+ <h2 id="license">License</h2>
181
+ <p>GPLv3+, see the included file “COPYING”.</p>
182
+ <p>Translations for languages and territory names are from CLDR which is
183
+ governed by the Unicode Terms of Use, see the included file
184
+ “unicode-license.txt”. The short name for this Unicode license is “MIT”.
185
+ See:</p>
186
+ <p><a href="https://fedoraproject.org/wiki/Licensing:MIT?rd=Licensing/MIT#Modern_Style_without_sublicense_.28Unicode.29">https://fedoraproject.org/wiki/Licensing:MIT?rd=Licensing/MIT#Modern_Style_without_sublicense_.28Unicode.29</a></p>
187
+ <h2 id="installation">Installation</h2>
188
+ <p>To install langtable, run</p>
189
+ <pre><code> make install DESTDIR=/usr</code></pre>
190
+ <p>To create a distribution tarball run</p>
191
+ <pre><code> make dist</code></pre>
192
+ <p>To run the test cases in the source directory:</p>
193
+ <pre><code> make check</code></pre>
194
+ <h2 id="how-to-use-it">How to use it</h2>
195
+ <pre><code>import langtable</code></pre>
196
+ <p>Functions in the public API:</p>
197
+ <pre><code> parse_locale()
198
+ list_locales()
199
+ list_keyboards()
200
+ list_common_languages()
201
+ list_common_locales()
202
+ list_common_keyboards()
203
+ list_consolefonts()
204
+ list_inputmethods()
205
+ list_timezones()
206
+ list_scripts()
207
+ language_name()
208
+ territory_name()
209
+ timezone_name()
210
+ languageId()
211
+ territoryId()
212
+ supports_ascii()
213
+ list_all_languages()
214
+ list_all_locales()
215
+ list_all_keyboards()
216
+ list_all_territories()
217
+ list_all_timezones()
218
+ list_all_scripts()
219
+ list_all_input_methods()
220
+ list_all_console_fonts()</code></pre>
221
+ <p>Some examples to show the usage are found in the documentation of the
222
+ public functions in <code>langtable.py</code>.</p>
223
+ <p>Some more examples are in the test cases in the file
224
+ <code>test_cases.py</code>.</p>
225
+ </body>
226
+ </html>
@@ -0,0 +1,72 @@
1
+ # langtable
2
+
3
+ [![PyPI version](https://badge.fury.io/py/langtable.svg)](https://badge.fury.io/py/langtable)
4
+
5
+ Guessing reasonable defaults for locale, keyboard layout, territory, and language.
6
+
7
+ ## Purpose of this package
8
+ _langtable_ is used to guess reasonable defaults for locale, keyboard, territory, …, if part of that information is already known. For example, guess the territory and the keyboard layout if the language is known or guess the language and keyboard layout if the territory is already known.
9
+
10
+ ## License
11
+
12
+ GPLv3+, see the included file “COPYING”.
13
+
14
+ Translations for languages and territory names are from CLDR which is governed by the Unicode Terms of Use, see the included file “unicode-license.txt”. The short name for this Unicode license is “MIT”. See:
15
+
16
+ https://fedoraproject.org/wiki/Licensing:MIT?rd=Licensing/MIT#Modern_Style_without_sublicense_.28Unicode.29
17
+
18
+ ## Installation
19
+
20
+ To install langtable, run
21
+
22
+ ```
23
+ make install DESTDIR=/usr
24
+ ```
25
+
26
+ To create a distribution tarball run
27
+ ```
28
+ make dist
29
+ ```
30
+ To run the test cases in the source directory:
31
+ ```
32
+ make check
33
+ ```
34
+
35
+ ## How to use it
36
+
37
+ ```
38
+ import langtable
39
+ ```
40
+
41
+ Functions in the public API:
42
+
43
+ ```
44
+ parse_locale()
45
+ list_locales()
46
+ list_keyboards()
47
+ list_common_languages()
48
+ list_common_locales()
49
+ list_common_keyboards()
50
+ list_consolefonts()
51
+ list_inputmethods()
52
+ list_timezones()
53
+ list_scripts()
54
+ language_name()
55
+ territory_name()
56
+ timezone_name()
57
+ languageId()
58
+ territoryId()
59
+ supports_ascii()
60
+ list_all_languages()
61
+ list_all_locales()
62
+ list_all_keyboards()
63
+ list_all_territories()
64
+ list_all_timezones()
65
+ list_all_scripts()
66
+ list_all_input_methods()
67
+ list_all_console_fonts()
68
+ ```
69
+
70
+ Some examples to show the usage are found in the documentation of the public functions in `langtable.py`.
71
+
72
+ Some more examples are in the test cases in the file `test_cases.py`.
@@ -2719,5 +2719,11 @@ __module_init = __ModuleInitializer()
2719
2719
 
2720
2720
  if __name__ == "__main__":
2721
2721
  import doctest
2722
+ import sys
2722
2723
  _init()
2723
- doctest.testmod()
2724
+ (FAILED, ATTEMPTED) = doctest.testmod()
2725
+ print(f'{ATTEMPTED} tests run. {ATTEMPTED - FAILED} passed and {FAILED} failed.')
2726
+ if FAILED:
2727
+ sys.exit(FAILED)
2728
+ print(f'All tests passed.')
2729
+ sys.exit(0)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: langtable
3
- Version: 0.0.65
3
+ Version: 0.0.66
4
4
  Summary: guess reasonable defaults for locale, keyboard, territory, ...
5
5
  Home-page: https://github.com/mike-fabian/langtable
6
6
  Author: Mike FABIAN
@@ -13,55 +13,52 @@ Classifier: License :: OSI Approved :: GNU General Public License v3 or later (G
13
13
  Classifier: Operating System :: POSIX :: Linux
14
14
  Classifier: Programming Language :: Python
15
15
  Classifier: Topic :: System :: Installation/Setup
16
+ Description-Content-Type: text/markdown
16
17
  License-File: COPYING
17
18
 
18
- ======================================================================
19
- langtable
20
- ======================================================================
19
+ # langtable
21
20
 
22
- Purpose of this package
23
- =======================
21
+ [![PyPI version](https://badge.fury.io/py/langtable.svg)](https://badge.fury.io/py/langtable)
24
22
 
25
- langtable is used to guess reasonable defaults for locale, keyboard,
26
- territory, …, if part of that information is already known. For
27
- example, guess the territory and the keyboard layout if the language
28
- is known or guess the language and keyboard layout if the territory is
29
- already known.
23
+ Guessing reasonable defaults for locale, keyboard layout, territory, and language.
30
24
 
31
- License
32
- =======
25
+ ## Purpose of this package
26
+ _langtable_ is used to guess reasonable defaults for locale, keyboard, territory, …, if part of that information is already known. For example, guess the territory and the keyboard layout if the language is known or guess the language and keyboard layout if the territory is already known.
27
+
28
+ ## License
33
29
 
34
30
  GPLv3+, see the included file “COPYING”.
35
31
 
36
- Translations for languages and territory names are from CLDR which is
37
- governed by the Unicode Terms of Use, see the included file
38
- “unicode-license.txt”. The short name for this Unicode license is
39
- “MIT”. See:
32
+ Translations for languages and territory names are from CLDR which is governed by the Unicode Terms of Use, see the included file “unicode-license.txt”. The short name for this Unicode license is “MIT”. See:
40
33
 
41
34
  https://fedoraproject.org/wiki/Licensing:MIT?rd=Licensing/MIT#Modern_Style_without_sublicense_.28Unicode.29
42
35
 
43
- Installation
44
- ============
36
+ ## Installation
45
37
 
46
38
  To install langtable, run
47
39
 
40
+ ```
48
41
  make install DESTDIR=/usr
42
+ ```
49
43
 
50
44
  To create a distribution tarball run
51
-
45
+ ```
52
46
  make dist
53
-
47
+ ```
54
48
  To run the test cases in the source directory:
49
+ ```
50
+ make check
51
+ ```
55
52
 
56
- make test
57
-
58
- How to use it
59
- =============
53
+ ## How to use it
60
54
 
55
+ ```
61
56
  import langtable
57
+ ```
62
58
 
63
59
  Functions in the public API:
64
60
 
61
+ ```
65
62
  parse_locale()
66
63
  list_locales()
67
64
  list_keyboards()
@@ -86,8 +83,8 @@ Functions in the public API:
86
83
  list_all_scripts()
87
84
  list_all_input_methods()
88
85
  list_all_console_fonts()
86
+ ```
89
87
 
90
- Some examples to show the usage are found in the documentation
91
- of the public functions in langtable.py.
88
+ Some examples to show the usage are found in the documentation of the public functions in `langtable.py`.
92
89
 
93
- (Some more examples are in the test cases in the file test_cases.py):
90
+ Some more examples are in the test cases in the file `test_cases.py`.
@@ -3,6 +3,8 @@ ChangeLog
3
3
  MANIFEST.in
4
4
  Makefile
5
5
  README
6
+ README.html
7
+ README.md
6
8
  main.py
7
9
  setup.py
8
10
  test_cases.py
@@ -61,6 +61,10 @@ def parse_args():
61
61
  type=str,
62
62
  default='./langtable.log',
63
63
  help='log file, default is %(default)s')
64
+ parser.add_argument('-c', '--include_changes',
65
+ action='store_true',
66
+ default=False,
67
+ help='Also write changed translations, not only new translations, default is %(default)s.')
64
68
  parser.add_argument('-d', '--debug',
65
69
  action='store_true',
66
70
  help='print debugging output')
@@ -133,7 +137,7 @@ def read_translations_from_cldr_file(file = None):
133
137
  translations_timezone_cities[timezone_city_aliases[alias]] = translations_timezone_cities[alias]
134
138
  return
135
139
 
136
- def get_translations_from_cldr(main_cldr_dir = None):
140
+ def get_translations_from_cldr(main_cldr_dir = None, include_changes=False):
137
141
  for target_language in sorted(langtable._languages_db):
138
142
  cldr_file = main_cldr_dir+'/'+target_language+'.xml'
139
143
  if not os.path.exists(cldr_file):
@@ -165,8 +169,8 @@ def get_translations_from_cldr(main_cldr_dir = None):
165
169
  'language_to_translate': language_to_translate,
166
170
  'target_language': target_language,
167
171
  'tr': translations_languages[language_to_translate]})
168
- # Uncomment this to really make the change:
169
- #langtable._languages_db[language_to_translate].names[target_language] = translations_languages[language_to_translate]
172
+ if include_changes:
173
+ langtable._languages_db[language_to_translate].names[target_language] = translations_languages[language_to_translate]
170
174
  else:
171
175
  if opts['debug']:
172
176
  print("Not in langtable: %(language_to_translate)s" %{
@@ -194,8 +198,8 @@ def get_translations_from_cldr(main_cldr_dir = None):
194
198
  print("+ %(territory_to_translate)s → %(target_language)s = %(tr)s" %{'territory_to_translate': territory_to_translate,
195
199
  'target_language': target_language,
196
200
  'tr': translations_territories[territory_to_translate]})
197
- # Uncomment this to really make the change:
198
- #langtable._territories_db[territory_to_translate].names[target_language] = translations_territories[territory_to_translate]
201
+ if include_changes:
202
+ langtable._territories_db[territory_to_translate].names[target_language] = translations_territories[territory_to_translate]
199
203
  else:
200
204
  if opts['debug']:
201
205
  print("Not in langtable: %(territory_to_translate)s" %{
@@ -228,8 +232,8 @@ def get_translations_from_cldr(main_cldr_dir = None):
228
232
  'timezone_city_to_translate': timezone_city_to_translate,
229
233
  'target_language': target_language,
230
234
  'tr': translations_timezone_cities[timezone_city_to_translate]})
231
- # Uncomment this to really make the change:
232
- #langtable._timezoneIdParts_db[timezone_city_to_translate].names[target_language] = translations_timezone_cities[timezone_city_to_translate]
235
+ if include_changes:
236
+ langtable._timezoneIdParts_db[timezone_city_to_translate].names[target_language] = translations_timezone_cities[timezone_city_to_translate]
233
237
  return
234
238
 
235
239
  def _test_timezone_names():
@@ -251,7 +255,9 @@ def main():
251
255
  langtable._init(debug = True,
252
256
  logfilename = args.logfilename)
253
257
 
254
- get_translations_from_cldr(main_cldr_dir='/local/mfabian/src/cldr/common/main')
258
+ get_translations_from_cldr(
259
+ main_cldr_dir='/local/mfabian/src/cldr/common/main',
260
+ include_changes=args.include_changes)
255
261
 
256
262
  #_test_timezone_names()
257
263
 
@@ -261,6 +267,5 @@ def main():
261
267
  timezonesfilename = args.timezonesoutputfile,
262
268
  timezoneidpartsfilename = args.timezoneidpartsoutputfile)
263
269
 
264
-
265
270
  if __name__ == '__main__':
266
271
  main()
@@ -8,10 +8,11 @@ setuptools.setup(
8
8
  # within the egg directory easily:
9
9
  zip_safe=False,
10
10
  name='langtable',
11
- version='0.0.65',
11
+ version='0.0.66',
12
12
  packages=setuptools.find_packages(),
13
13
  description='guess reasonable defaults for locale, keyboard, territory, ...',
14
- long_description=codecs.open('README', encoding='UTF-8').read(),
14
+ long_description=codecs.open('README.md', encoding='UTF-8').read(),
15
+ long_description_content_type='text/markdown',
15
16
  license="GPL-3.0-or-later",
16
17
  author='Mike FABIAN',
17
18
  author_email='mfabian@redhat.com',
@@ -761,8 +761,8 @@ def dummy():
761
761
  BD: ['bn_BD.UTF-8']
762
762
  +: ['bn_BD.UTF-8']
763
763
  bn: ['in(eng)']
764
- BD: ['us']
765
- +: ['us', 'in(eng)']
764
+ BD: ['in(eng)']
765
+ +: ['in(eng)']
766
766
 
767
767
  >>> _test_language_territory(show_weights=False, languageId="bn", territoryId="IN") # doctest: +NORMALIZE_WHITESPACE
768
768
  bn: ['bn_BD.UTF-8', 'bn_IN.UTF-8']
@@ -2155,9 +2155,9 @@ def dummy():
2155
2155
  ['ar', 'en', 'fr', 'de', 'ja', 'zh', 'ru', 'es']
2156
2156
 
2157
2157
  >>> print(list_all_languages()) # doctest: +NORMALIZE_WHITESPACE
2158
- ['aa', 'ab', 'af', 'agq', 'agr', 'ak', 'am', 'an', 'anp', 'ar', 'as', 'asa', 'ast', 'av', 'ay', 'ayc', 'ayr', 'az', 'ba', 'bas', 'be', 'bem', 'ber', 'bez', 'bg', 'bhb', 'bho', 'bi', 'bih', 'bin', 'bm', 'bn', 'bo', 'br', 'brx', 'bs', 'bua', 'byn', 'ca', 'ca_ES_VALENCIA', 'ccp', 'ce', 'cgg', 'ch', 'chm', 'chr', 'ckb', 'cmn', 'co', 'cop', 'crh', 'cs', 'csb', 'cu', 'cv', 'cy', 'da', 'dav', 'de', 'dje', 'doi', 'dsb', 'dua', 'dv', 'dyo', 'dz', 'ebu', 'ee', 'el', 'en', 'eo', 'es', 'et', 'eu', 'ewo', 'fa', 'fat', 'ff', 'fi', 'fil', 'fj', 'fo', 'fr', 'fur', 'fy', 'ga', 'gbm', 'gd', 'gez', 'gl', 'glk', 'gn', 'grc', 'gsw', 'gu', 'guz', 'gv', 'ha', 'hak', 'haw', 'he', 'hi', 'hif', 'hil', 'hne', 'ho', 'hr', 'hsb', 'ht', 'hu', 'hy', 'hz', 'ia', 'id', 'ie', 'ig', 'ii', 'ik', 'ilo', 'io', 'is', 'it', 'iu', 'iw', 'ja', 'jgo', 'jmc', 'jv', 'ka', 'kaa', 'kab', 'kam', 'kde', 'kea', 'kg', 'khb', 'khq', 'ki', 'kj', 'kk', 'kkj', 'kl', 'kln', 'km', 'kn', 'ko', 'kok', 'kr', 'ks', 'ks_Arab', 'ks_Deva', 'ksb', 'ksf', 'ksh', 'ku', 'kum', 'kv', 'kw', 'kwm', 'ky', 'la', 'lag', 'lah', 'lb', 'lez', 'lg', 'li', 'lij', 'lkt', 'ln', 'lo', 'lrc', 'lt', 'lu', 'luo', 'luy', 'lv', 'lzh', 'mag', 'mai', 'mas', 'mer', 'mfe', 'mg', 'mgh', 'mgo', 'mh', 'mhr', 'mi', 'miq', 'mjw', 'mk', 'ml', 'mn', 'mni', 'mnw', 'mo', 'mos', 'mr', 'ms', 'mt', 'mua', 'my', 'mzn', 'na', 'nan', 'naq', 'nb', 'nd', 'nds', 'ne', 'new', 'ng', 'nhn', 'niu', 'nl', 'nmg', 'nn', 'nnh', 'no', 'nqo', 'nr', 'nso', 'nus', 'nv', 'ny', 'nyn', 'oc', 'om', 'or', 'os', 'osa', 'ota', 'pa', 'pap', 'pl', 'prg', 'ps', 'pt', 'qu', 'quh', 'quz', 'raj', 'rif', 'rm', 'rn', 'ro', 'rof', 'ru', 'rw', 'rwk', 'sa', 'sah', 'saq', 'sat', 'sbp', 'sc', 'sco', 'sd', 'sd_Arab', 'sd_Deva', 'se', 'seh', 'sel', 'ses', 'sg', 'sgs', 'sh', 'shi', 'shn', 'shs', 'si', 'sid', 'sk', 'sl', 'sm', 'sma', 'smj', 'smn', 'sms', 'sn', 'so', 'sq', 'sr', 'sr_Cyrl', 'sr_Latn', 'ss', 'ssy', 'st', 'su', 'sv', 'sw', 'syc', 'syr', 'szl', 'ta', 'tcy', 'te', 'teo', 'tet', 'tg', 'th', 'the', 'ti', 'tig', 'tk', 'tl', 'tn', 'to', 'tok', 'tpi', 'tr', 'ts', 'tt', 'tt_Cyrl', 'tt_Latn', 'tw', 'twq', 'txg', 'ty', 'tyv', 'tzm', 'udm', 'ug', 'uk', 'unm', 'ur', 'uz', 'vai', 've', 'vi', 'vo', 'vot', 'vun', 'wa', 'wae', 'wal', 'wen', 'wo', 'wuu', 'xal', 'xh', 'xog', 'xzh', 'yap', 'yav', 'yi', 'yo', 'yue', 'yuw', 'za', 'zgh', 'zh', 'zh_Hans', 'zh_Hans_CN', 'zh_Hans_SG', 'zh_Hant', 'zh_Hant_HK', 'zh_Hant_MO', 'zh_Hant_TW', 'zu']
2158
+ ['aa', 'ab', 'af', 'agq', 'agr', 'ak', 'am', 'an', 'anp', 'ar', 'as', 'asa', 'ast', 'av', 'ay', 'ayc', 'ayr', 'az', 'ba', 'bas', 'be', 'bem', 'ber', 'bez', 'bg', 'bhb', 'bho', 'bi', 'bih', 'bin', 'bm', 'bn', 'bo', 'br', 'brx', 'bs', 'bua', 'byn', 'ca', 'ca_ES_VALENCIA', 'ccp', 'ce', 'cgg', 'ch', 'chm', 'chr', 'ckb', 'cmn', 'co', 'cop', 'crh', 'cs', 'csb', 'cu', 'cv', 'cy', 'da', 'dav', 'de', 'dje', 'doi', 'dsb', 'dua', 'dv', 'dyo', 'dz', 'ebu', 'ee', 'el', 'en', 'eo', 'es', 'et', 'eu', 'ewo', 'fa', 'fat', 'ff', 'fi', 'fil', 'fj', 'fo', 'fr', 'fur', 'fy', 'ga', 'gbm', 'gd', 'gez', 'gl', 'glk', 'gn', 'grc', 'gsw', 'gu', 'guz', 'gv', 'ha', 'hak', 'haw', 'he', 'hi', 'hif', 'hil', 'hne', 'ho', 'hr', 'hsb', 'ht', 'hu', 'hy', 'hz', 'ia', 'id', 'ie', 'ig', 'ii', 'ik', 'ilo', 'io', 'is', 'it', 'iu', 'iw', 'ja', 'jgo', 'jmc', 'jv', 'ka', 'kaa', 'kab', 'kam', 'kde', 'kea', 'kg', 'khb', 'khq', 'ki', 'kj', 'kk', 'kkj', 'kl', 'kln', 'km', 'kn', 'ko', 'kok', 'kr', 'ks', 'ks_Arab', 'ks_Deva', 'ksb', 'ksf', 'ksh', 'ku', 'kum', 'kv', 'kw', 'kwm', 'ky', 'la', 'lag', 'lah', 'lb', 'lez', 'lg', 'li', 'lij', 'lkt', 'ln', 'lo', 'lrc', 'lt', 'lu', 'luo', 'luy', 'lv', 'lzh', 'mag', 'mai', 'mas', 'mdf', 'mer', 'mfe', 'mg', 'mgh', 'mgo', 'mh', 'mhr', 'mi', 'miq', 'mjw', 'mk', 'ml', 'mn', 'mni', 'mnw', 'mo', 'mos', 'mr', 'ms', 'mt', 'mua', 'my', 'mzn', 'na', 'nan', 'naq', 'nb', 'nd', 'nds', 'ne', 'new', 'ng', 'nhn', 'niu', 'nl', 'nmg', 'nn', 'nnh', 'no', 'nqo', 'nr', 'nso', 'nus', 'nv', 'ny', 'nyn', 'oc', 'om', 'or', 'os', 'osa', 'ota', 'pa', 'pap', 'pl', 'prg', 'ps', 'pt', 'qu', 'quh', 'quz', 'raj', 'rif', 'rm', 'rn', 'ro', 'rof', 'ru', 'rw', 'rwk', 'sa', 'sah', 'saq', 'sat', 'sbp', 'sc', 'sco', 'sd', 'sd_Arab', 'sd_Deva', 'se', 'seh', 'sel', 'ses', 'sg', 'sgs', 'sh', 'shi', 'shn', 'shs', 'si', 'sid', 'sk', 'sl', 'sm', 'sma', 'smj', 'smn', 'sms', 'sn', 'so', 'sq', 'sr', 'sr_Cyrl', 'sr_Latn', 'ss', 'ssy', 'st', 'su', 'sv', 'sw', 'syc', 'syr', 'szl', 'ta', 'tcy', 'te', 'teo', 'tet', 'tg', 'th', 'the', 'ti', 'tig', 'tk', 'tl', 'tn', 'to', 'tok', 'tpi', 'tr', 'ts', 'tt', 'tt_Cyrl', 'tt_Latn', 'tw', 'twq', 'txg', 'ty', 'tyv', 'tzm', 'udm', 'ug', 'uk', 'unm', 'ur', 'uz', 'vai', 've', 'vi', 'vo', 'vot', 'vun', 'wa', 'wae', 'wal', 'wen', 'wo', 'wuu', 'xal', 'xh', 'xog', 'xzh', 'yap', 'yav', 'yi', 'yo', 'yue', 'yuw', 'za', 'zgh', 'zh', 'zh_Hans', 'zh_Hans_CN', 'zh_Hans_SG', 'zh_Hant', 'zh_Hant_HK', 'zh_Hant_MO', 'zh_Hant_TW', 'zu']
2159
2159
  >>> print(list_all_locales()) # doctest: +NORMALIZE_WHITESPACE
2160
- ['aa_DJ.UTF-8', 'aa_ER.UTF-8', 'aa_ET.UTF-8', 'ab_GE.UTF-8', 'af_ZA.UTF-8', 'agr_PE.UTF-8', 'ak_GH.UTF-8', 'am_ET.UTF-8', 'an_ES.UTF-8', 'anp_IN.UTF-8', 'ar_AE.UTF-8', 'ar_BH.UTF-8', 'ar_DZ.UTF-8', 'ar_EG.UTF-8', 'ar_IN.UTF-8', 'ar_IQ.UTF-8', 'ar_JO.UTF-8', 'ar_KW.UTF-8', 'ar_LB.UTF-8', 'ar_LY.UTF-8', 'ar_MA.UTF-8', 'ar_OM.UTF-8', 'ar_QA.UTF-8', 'ar_SA.UTF-8', 'ar_SD.UTF-8', 'ar_SS.UTF-8', 'ar_SY.UTF-8', 'ar_TN.UTF-8', 'ar_YE.UTF-8', 'as_IN.UTF-8', 'ast_ES.UTF-8', 'ayc_PE.UTF-8', 'az_AZ.UTF-8', 'az_IR.UTF-8', 'be_BY.UTF-8', 'be_BY.UTF-8@latin', 'bem_ZM.UTF-8', 'ber_DZ.UTF-8', 'ber_MA.UTF-8', 'bg_BG.UTF-8', 'bhb_IN.UTF-8', 'bho_IN.UTF-8', 'bho_NP.UTF-8', 'bi_VU.UTF-8', 'bn_BD.UTF-8', 'bn_IN.UTF-8', 'bo_CN.UTF-8', 'bo_IN.UTF-8', 'br_FR.UTF-8', 'brx_IN.UTF-8', 'bs_BA.UTF-8', 'byn_ER.UTF-8', 'ca_AD.UTF-8', 'ca_ES.UTF-8', 'ca_ES.UTF-8@valencia', 'ca_FR.UTF-8', 'ca_IT.UTF-8', 'ce_RU.UTF-8', 'chr_US.UTF-8', 'ckb_IQ.UTF-8', 'cmn_TW.UTF-8', 'crh_RU.UTF-8', 'crh_UA.UTF-8', 'cs_CZ.UTF-8', 'csb_PL.UTF-8', 'cv_RU.UTF-8', 'cy_GB.UTF-8', 'da_DK.UTF-8', 'de_AT.UTF-8', 'de_BE.UTF-8', 'de_CH.UTF-8', 'de_DE.UTF-8', 'de_IT.UTF-8', 'de_LI.UTF-8', 'de_LU.UTF-8', 'doi_IN.UTF-8', 'dsb_DE.UTF-8', 'dv_MV.UTF-8', 'dz_BT.UTF-8', 'el_CY.UTF-8', 'el_GR.UTF-8', 'en_AG.UTF-8', 'en_AU.UTF-8', 'en_BW.UTF-8', 'en_CA.UTF-8', 'en_DK.UTF-8', 'en_GB.UTF-8', 'en_HK.UTF-8', 'en_IE.UTF-8', 'en_IL.UTF-8', 'en_IN.UTF-8', 'en_NG.UTF-8', 'en_NZ.UTF-8', 'en_PH.UTF-8', 'en_SC.UTF-8', 'en_SG.UTF-8', 'en_US.UTF-8', 'en_ZA.UTF-8', 'en_ZM.UTF-8', 'en_ZW.UTF-8', 'eo.UTF-8', 'es_AR.UTF-8', 'es_BO.UTF-8', 'es_CL.UTF-8', 'es_CO.UTF-8', 'es_CR.UTF-8', 'es_CU.UTF-8', 'es_DO.UTF-8', 'es_EC.UTF-8', 'es_ES.UTF-8', 'es_GT.UTF-8', 'es_HN.UTF-8', 'es_MX.UTF-8', 'es_NI.UTF-8', 'es_PA.UTF-8', 'es_PE.UTF-8', 'es_PR.UTF-8', 'es_PY.UTF-8', 'es_SV.UTF-8', 'es_US.UTF-8', 'es_UY.UTF-8', 'es_VE.UTF-8', 'et_EE.UTF-8', 'eu_ES.UTF-8', 'fa_IR.UTF-8', 'ff_SN.UTF-8', 'fi_FI.UTF-8', 'fil_PH.UTF-8', 'fo_FO.UTF-8', 'fr_BE.UTF-8', 'fr_CA.UTF-8', 'fr_CH.UTF-8', 'fr_FR.UTF-8', 'fr_HT.UTF-8', 'fr_LU.UTF-8', 'fur_IT.UTF-8', 'fy_DE.UTF-8', 'fy_NL.UTF-8', 'ga_IE.UTF-8', 'gbm_IN.UTF-8', 'gd_GB.UTF-8', 'gez_ER.UTF-8', 'gez_ER.UTF-8@abegede', 'gez_ET.UTF-8', 'gez_ET.UTF-8@abegede', 'gl_ES.UTF-8', 'glk_IR.UTF-8', 'gu_IN.UTF-8', 'gv_GB.UTF-8', 'ha_NG.UTF-8', 'hak_TW.UTF-8', 'he_IL.UTF-8', 'hi_IN.UTF-8', 'hif_FJ.UTF-8', 'hne_IN.UTF-8', 'hr_HR.UTF-8', 'hsb_DE.UTF-8', 'ht_HT.UTF-8', 'hu_HU.UTF-8', 'hy_AM.UTF-8', 'ia_FR.UTF-8', 'id_ID.UTF-8', 'ig_NG.UTF-8', 'ik_CA.UTF-8', 'ilo_PH.UTF-8', 'is_IS.UTF-8', 'it_CH.UTF-8', 'it_IT.UTF-8', 'iu_CA.UTF-8', 'iw_IL.UTF-8', 'ja_JP.UTF-8', 'ka_GE.UTF-8', 'kab_DZ.UTF-8', 'kk_KZ.UTF-8', 'kl_GL.UTF-8', 'km_KH.UTF-8', 'kn_IN.UTF-8', 'ko_KR.UTF-8', 'kok_IN.UTF-8', 'ks_IN.UTF-8', 'ks_IN.UTF-8@devanagari', 'ku_TR.UTF-8', 'kv_RU.UTF-8', 'kw_GB.UTF-8', 'ky_KG.UTF-8', 'lb_LU.UTF-8', 'lg_UG.UTF-8', 'li_BE.UTF-8', 'li_NL.UTF-8', 'lij_IT.UTF-8', 'ln_CD.UTF-8', 'lo_LA.UTF-8', 'lt_LT.UTF-8', 'lv_LV.UTF-8', 'lzh_TW.UTF-8', 'mag_IN.UTF-8', 'mai_IN.UTF-8', 'mai_NP.UTF-8', 'mfe_MU.UTF-8', 'mg_MG.UTF-8', 'mhr_RU.UTF-8', 'mi_NZ.UTF-8', 'miq_NI.UTF-8', 'mjw_IN.UTF-8', 'mk_MK.UTF-8', 'ml_IN.UTF-8', 'mn_MN.UTF-8', 'mni_IN.UTF-8', 'mnw_MM.UTF-8', 'mr_IN.UTF-8', 'ms_MY.UTF-8', 'mt_MT.UTF-8', 'my_MM.UTF-8', 'nan_TW.UTF-8', 'nan_TW.UTF-8@latin', 'nb_NO.UTF-8', 'nds_DE.UTF-8', 'nds_NL.UTF-8', 'ne_NP.UTF-8', 'nhn_MX.UTF-8', 'niu_NU.UTF-8', 'niu_NZ.UTF-8', 'nl_AW.UTF-8', 'nl_BE.UTF-8', 'nl_NL.UTF-8', 'nn_NO.UTF-8', 'no_NO.UTF-8', 'nr_ZA.UTF-8', 'nso_ZA.UTF-8', 'oc_FR.UTF-8', 'om_ET.UTF-8', 'om_KE.UTF-8', 'or_IN.UTF-8', 'os_RU.UTF-8', 'pa_IN.UTF-8', 'pa_PK.UTF-8', 'pap_AN.UTF-8', 'pap_AW.UTF-8', 'pap_CW.UTF-8', 'pl_PL.UTF-8', 'ps_AF.UTF-8', 'pt_BR.UTF-8', 'pt_PT.UTF-8', 'quz_PE.UTF-8', 'raj_IN.UTF-8', 'rif_MA.UTF-8', 'ro_RO.UTF-8', 'ru_RU.UTF-8', 'ru_UA.UTF-8', 'rw_RW.UTF-8', 'sa_IN.UTF-8', 'sah_RU.UTF-8', 'sat_IN.UTF-8', 'sc_IT.UTF-8', 'sd_IN.UTF-8', 'sd_IN.UTF-8@devanagari', 'se_NO.UTF-8', 'sgs_LT.UTF-8', 'shn_MM.UTF-8', 'shs_CA.UTF-8', 'si_LK.UTF-8', 'sid_ET.UTF-8', 'sk_SK.UTF-8', 'sl_SI.UTF-8', 'sm_WS.UTF-8', 'so_DJ.UTF-8', 'so_ET.UTF-8', 'so_KE.UTF-8', 'so_SO.UTF-8', 'sq_AL.UTF-8', 'sq_MK.UTF-8', 'sr_ME.UTF-8', 'sr_ME.UTF-8@latin', 'sr_RS.UTF-8', 'sr_RS.UTF-8@latin', 'ss_ZA.UTF-8', 'ssy_ER.UTF-8', 'st_ZA.UTF-8', 'sv_FI.UTF-8', 'sv_SE.UTF-8', 'sw_KE.UTF-8', 'sw_TZ.UTF-8', 'syr.UTF-8', 'szl_PL.UTF-8', 'ta_IN.UTF-8', 'ta_LK.UTF-8', 'ta_SG.UTF-8', 'tcy_IN.UTF-8', 'te_IN.UTF-8', 'tg_TJ.UTF-8', 'th_TH.UTF-8', 'the_NP.UTF-8', 'ti_ER.UTF-8', 'ti_ET.UTF-8', 'tig_ER.UTF-8', 'tk_TM.UTF-8', 'tl_PH.UTF-8', 'tn_BW.UTF-8', 'tn_ZA.UTF-8', 'to_TO.UTF-8', 'tok.UTF-8', 'tpi_PG.UTF-8', 'tr_CY.UTF-8', 'tr_TR.UTF-8', 'ts_ZA.UTF-8', 'tt_RU.UTF-8', 'tt_RU.UTF-8@iqtelif', 'ug_CN.UTF-8', 'uk_UA.UTF-8', 'unm_US.UTF-8', 'ur_IN.UTF-8', 'ur_PK.UTF-8', 'uz_UZ.UTF-8', 'uz_UZ.UTF-8@cyrillic', 've_ZA.UTF-8', 'vi_VN.UTF-8', 'wa_BE.UTF-8', 'wae_CH.UTF-8', 'wal_ET.UTF-8', 'wo_SN.UTF-8', 'xh_ZA.UTF-8', 'yi_US.UTF-8', 'yo_NG.UTF-8', 'yue_HK.UTF-8', 'yuw_PG.UTF-8', 'zh_CN.UTF-8', 'zh_HK.UTF-8', 'zh_MO.UTF-8', 'zh_SG.UTF-8', 'zh_TW.UTF-8', 'zu_ZA.UTF-8']
2160
+ ['aa_DJ.UTF-8', 'aa_ER.UTF-8', 'aa_ET.UTF-8', 'ab_GE.UTF-8', 'af_ZA.UTF-8', 'agr_PE.UTF-8', 'ak_GH.UTF-8', 'am_ET.UTF-8', 'an_ES.UTF-8', 'anp_IN.UTF-8', 'ar_AE.UTF-8', 'ar_BH.UTF-8', 'ar_DZ.UTF-8', 'ar_EG.UTF-8', 'ar_IN.UTF-8', 'ar_IQ.UTF-8', 'ar_JO.UTF-8', 'ar_KW.UTF-8', 'ar_LB.UTF-8', 'ar_LY.UTF-8', 'ar_MA.UTF-8', 'ar_OM.UTF-8', 'ar_QA.UTF-8', 'ar_SA.UTF-8', 'ar_SD.UTF-8', 'ar_SS.UTF-8', 'ar_SY.UTF-8', 'ar_TN.UTF-8', 'ar_YE.UTF-8', 'as_IN.UTF-8', 'ast_ES.UTF-8', 'ayc_PE.UTF-8', 'az_AZ.UTF-8', 'az_IR.UTF-8', 'be_BY.UTF-8', 'be_BY.UTF-8@latin', 'bem_ZM.UTF-8', 'ber_DZ.UTF-8', 'ber_MA.UTF-8', 'bg_BG.UTF-8', 'bhb_IN.UTF-8', 'bho_IN.UTF-8', 'bho_NP.UTF-8', 'bi_VU.UTF-8', 'bn_BD.UTF-8', 'bn_IN.UTF-8', 'bo_CN.UTF-8', 'bo_IN.UTF-8', 'br_FR.UTF-8', 'brx_IN.UTF-8', 'bs_BA.UTF-8', 'byn_ER.UTF-8', 'ca_AD.UTF-8', 'ca_ES.UTF-8', 'ca_ES.UTF-8@valencia', 'ca_FR.UTF-8', 'ca_IT.UTF-8', 'ce_RU.UTF-8', 'chr_US.UTF-8', 'ckb_IQ.UTF-8', 'cmn_TW.UTF-8', 'crh_RU.UTF-8', 'crh_UA.UTF-8', 'cs_CZ.UTF-8', 'csb_PL.UTF-8', 'cv_RU.UTF-8', 'cy_GB.UTF-8', 'da_DK.UTF-8', 'de_AT.UTF-8', 'de_BE.UTF-8', 'de_CH.UTF-8', 'de_DE.UTF-8', 'de_IT.UTF-8', 'de_LI.UTF-8', 'de_LU.UTF-8', 'doi_IN.UTF-8', 'dsb_DE.UTF-8', 'dv_MV.UTF-8', 'dz_BT.UTF-8', 'el_CY.UTF-8', 'el_GR.UTF-8', 'en_AG.UTF-8', 'en_AU.UTF-8', 'en_BW.UTF-8', 'en_CA.UTF-8', 'en_DK.UTF-8', 'en_GB.UTF-8', 'en_HK.UTF-8', 'en_IE.UTF-8', 'en_IL.UTF-8', 'en_IN.UTF-8', 'en_NG.UTF-8', 'en_NZ.UTF-8', 'en_PH.UTF-8', 'en_SC.UTF-8', 'en_SG.UTF-8', 'en_US.UTF-8', 'en_ZA.UTF-8', 'en_ZM.UTF-8', 'en_ZW.UTF-8', 'eo.UTF-8', 'es_AR.UTF-8', 'es_BO.UTF-8', 'es_CL.UTF-8', 'es_CO.UTF-8', 'es_CR.UTF-8', 'es_CU.UTF-8', 'es_DO.UTF-8', 'es_EC.UTF-8', 'es_ES.UTF-8', 'es_GT.UTF-8', 'es_HN.UTF-8', 'es_MX.UTF-8', 'es_NI.UTF-8', 'es_PA.UTF-8', 'es_PE.UTF-8', 'es_PR.UTF-8', 'es_PY.UTF-8', 'es_SV.UTF-8', 'es_US.UTF-8', 'es_UY.UTF-8', 'es_VE.UTF-8', 'et_EE.UTF-8', 'eu_ES.UTF-8', 'fa_IR.UTF-8', 'ff_SN.UTF-8', 'fi_FI.UTF-8', 'fil_PH.UTF-8', 'fo_FO.UTF-8', 'fr_BE.UTF-8', 'fr_CA.UTF-8', 'fr_CH.UTF-8', 'fr_FR.UTF-8', 'fr_HT.UTF-8', 'fr_LU.UTF-8', 'fur_IT.UTF-8', 'fy_DE.UTF-8', 'fy_NL.UTF-8', 'ga_IE.UTF-8', 'gbm_IN.UTF-8', 'gd_GB.UTF-8', 'gez_ER.UTF-8', 'gez_ER.UTF-8@abegede', 'gez_ET.UTF-8', 'gez_ET.UTF-8@abegede', 'gl_ES.UTF-8', 'glk_IR.UTF-8', 'gu_IN.UTF-8', 'gv_GB.UTF-8', 'ha_NG.UTF-8', 'hak_TW.UTF-8', 'he_IL.UTF-8', 'hi_IN.UTF-8', 'hif_FJ.UTF-8', 'hne_IN.UTF-8', 'hr_HR.UTF-8', 'hsb_DE.UTF-8', 'ht_HT.UTF-8', 'hu_HU.UTF-8', 'hy_AM.UTF-8', 'ia_FR.UTF-8', 'id_ID.UTF-8', 'ig_NG.UTF-8', 'ik_CA.UTF-8', 'ilo_PH.UTF-8', 'is_IS.UTF-8', 'it_CH.UTF-8', 'it_IT.UTF-8', 'iu_CA.UTF-8', 'iw_IL.UTF-8', 'ja_JP.UTF-8', 'ka_GE.UTF-8', 'kab_DZ.UTF-8', 'kk_KZ.UTF-8', 'kl_GL.UTF-8', 'km_KH.UTF-8', 'kn_IN.UTF-8', 'ko_KR.UTF-8', 'kok_IN.UTF-8', 'ks_IN.UTF-8', 'ks_IN.UTF-8@devanagari', 'ku_TR.UTF-8', 'kv_RU.UTF-8', 'kw_GB.UTF-8', 'ky_KG.UTF-8', 'lb_LU.UTF-8', 'lg_UG.UTF-8', 'li_BE.UTF-8', 'li_NL.UTF-8', 'lij_IT.UTF-8', 'ln_CD.UTF-8', 'lo_LA.UTF-8', 'lt_LT.UTF-8', 'lv_LV.UTF-8', 'lzh_TW.UTF-8', 'mag_IN.UTF-8', 'mai_IN.UTF-8', 'mai_NP.UTF-8', 'mdf_RU.UTF-8', 'mfe_MU.UTF-8', 'mg_MG.UTF-8', 'mhr_RU.UTF-8', 'mi_NZ.UTF-8', 'miq_NI.UTF-8', 'mjw_IN.UTF-8', 'mk_MK.UTF-8', 'ml_IN.UTF-8', 'mn_MN.UTF-8', 'mni_IN.UTF-8', 'mnw_MM.UTF-8', 'mr_IN.UTF-8', 'ms_MY.UTF-8', 'mt_MT.UTF-8', 'my_MM.UTF-8', 'nan_TW.UTF-8', 'nan_TW.UTF-8@latin', 'nb_NO.UTF-8', 'nds_DE.UTF-8', 'nds_NL.UTF-8', 'ne_NP.UTF-8', 'nhn_MX.UTF-8', 'niu_NU.UTF-8', 'niu_NZ.UTF-8', 'nl_AW.UTF-8', 'nl_BE.UTF-8', 'nl_NL.UTF-8', 'nn_NO.UTF-8', 'no_NO.UTF-8', 'nr_ZA.UTF-8', 'nso_ZA.UTF-8', 'oc_FR.UTF-8', 'om_ET.UTF-8', 'om_KE.UTF-8', 'or_IN.UTF-8', 'os_RU.UTF-8', 'pa_IN.UTF-8', 'pa_PK.UTF-8', 'pap_AN.UTF-8', 'pap_AW.UTF-8', 'pap_CW.UTF-8', 'pl_PL.UTF-8', 'ps_AF.UTF-8', 'pt_BR.UTF-8', 'pt_PT.UTF-8', 'quz_PE.UTF-8', 'raj_IN.UTF-8', 'rif_MA.UTF-8', 'ro_RO.UTF-8', 'ru_RU.UTF-8', 'ru_UA.UTF-8', 'rw_RW.UTF-8', 'sa_IN.UTF-8', 'sah_RU.UTF-8', 'sat_IN.UTF-8', 'sc_IT.UTF-8', 'sd_IN.UTF-8', 'sd_IN.UTF-8@devanagari', 'se_NO.UTF-8', 'sgs_LT.UTF-8', 'shn_MM.UTF-8', 'shs_CA.UTF-8', 'si_LK.UTF-8', 'sid_ET.UTF-8', 'sk_SK.UTF-8', 'sl_SI.UTF-8', 'sm_WS.UTF-8', 'so_DJ.UTF-8', 'so_ET.UTF-8', 'so_KE.UTF-8', 'so_SO.UTF-8', 'sq_AL.UTF-8', 'sq_MK.UTF-8', 'sr_ME.UTF-8', 'sr_ME.UTF-8@latin', 'sr_RS.UTF-8', 'sr_RS.UTF-8@latin', 'ss_ZA.UTF-8', 'ssy_ER.UTF-8', 'st_ZA.UTF-8', 'sv_FI.UTF-8', 'sv_SE.UTF-8', 'sw_KE.UTF-8', 'sw_TZ.UTF-8', 'syr.UTF-8', 'szl_PL.UTF-8', 'ta_IN.UTF-8', 'ta_LK.UTF-8', 'ta_SG.UTF-8', 'tcy_IN.UTF-8', 'te_IN.UTF-8', 'tg_TJ.UTF-8', 'th_TH.UTF-8', 'the_NP.UTF-8', 'ti_ER.UTF-8', 'ti_ET.UTF-8', 'tig_ER.UTF-8', 'tk_TM.UTF-8', 'tl_PH.UTF-8', 'tn_BW.UTF-8', 'tn_ZA.UTF-8', 'to_TO.UTF-8', 'tok.UTF-8', 'tpi_PG.UTF-8', 'tr_CY.UTF-8', 'tr_TR.UTF-8', 'ts_ZA.UTF-8', 'tt_RU.UTF-8', 'tt_RU.UTF-8@iqtelif', 'ug_CN.UTF-8', 'uk_UA.UTF-8', 'unm_US.UTF-8', 'ur_IN.UTF-8', 'ur_PK.UTF-8', 'uz_UZ.UTF-8', 'uz_UZ.UTF-8@cyrillic', 've_ZA.UTF-8', 'vi_VN.UTF-8', 'wa_BE.UTF-8', 'wae_CH.UTF-8', 'wal_ET.UTF-8', 'wo_SN.UTF-8', 'xh_ZA.UTF-8', 'yi_US.UTF-8', 'yo_NG.UTF-8', 'yue_HK.UTF-8', 'yuw_PG.UTF-8', 'zh_CN.UTF-8', 'zh_HK.UTF-8', 'zh_MO.UTF-8', 'zh_SG.UTF-8', 'zh_TW.UTF-8', 'zu_ZA.UTF-8']
2161
2161
  >>> print(list_all_keyboards()) # doctest: +NORMALIZE_WHITESPACE
2162
2162
  ['ad', 'af', 'af(fa-olpc)', 'af(ps)', 'af(ps-olpc)', 'af(uz)', 'af(uz-olpc)', 'al', 'am', 'am(eastern)', 'am(eastern-alt)', 'am(phonetic)', 'am(phonetic-alt)', 'am(western)', 'ara', 'ara(azerty)', 'ara(azerty_digits)', 'ara(buckwalter)', 'ara(digits)', 'ara(qwerty)', 'ara(qwerty_digits)', 'at(nodeadkeys)', 'az', 'az(cyrillic)', 'ba', 'bd', 'bd(probhat)', 'be', 'be(oss)', 'bg', 'bg(bas_phonetic)', 'bg(phonetic)', 'br', 'brai', 'brai(left_hand)', 'brai(right_hand)', 'bt', 'by', 'by(legacy)', 'ca', 'ca(eng)', 'ca(ike)', 'ca(multi)', 'ca(multi-2gr)', 'ca(shs)', 'ch', 'ch(fr)', 'cn', 'cn(tib)', 'cn(tib_asciinum)', 'cn(ug)', 'cz', 'cz(ucw)', 'de', 'de(deadacute)', 'de(nodeadkeys)', 'de(ru)', 'dk', 'ee', 'es', 'es(ast)', 'es(cat)', 'et', 'fi', 'fi(classic)', 'fi(nodeadkeys)', 'fo', 'fr', 'fr(geo)', 'fr(latin9)', 'fr(oss)', 'gb', 'ge', 'ge(os)', 'gr', 'gr(extended)', 'gr(nodeadkeys)', 'gr(polytonic)', 'gr(simple)', 'hr', 'hu', 'ie', 'ie(CloGaelach)', 'ie(ogam)', 'il', 'il(biblical)', 'il(lyx)', 'il(phonetic)', 'in', 'in(ben)', 'in(ben_baishakhi)', 'in(ben_bornona)', 'in(ben_gitanjali)', 'in(ben_inscript)', 'in(ben_probhat)', 'in(bolnagri)', 'in(deva)', 'in(eng)', 'in(guj)', 'in(guru)', 'in(hin-kagapa)', 'in(hin-wx)', 'in(jhelum)', 'in(kan)', 'in(kan-kagapa)', 'in(mal)', 'in(mal_enhanced)', 'in(mal_lalitha)', 'in(mar-kagapa)', 'in(ori)', 'in(san-kagapa)', 'in(tam)', 'in(tam_tamilnet)', 'in(tam_tamilnet_TAB)', 'in(tam_tamilnet_TSCII)', 'in(tam_tamilnet_with_tam_nums)', 'in(tel)', 'in(tel-kagapa)', 'in(urd-phonetic)', 'in(urd-phonetic3)', 'in(urd-winkeys)', 'iq', 'ir', 'ir(pes_keypad)', 'it', 'jp', 'jp(kana)', 'jp(mac)', 'ke', 'kg', 'kg(phonetic)', 'kh', 'kr', 'kz', 'kz(kazrus)', 'kz(ruskaz)', 'la', 'la(stea)', 'latam', 'lk', 'lk(tam_TAB)', 'lk(tam_unicode)', 'lt', 'lv', 'ma', 'ma(french)', 'ma(tifinagh)', 'ma(tifinagh-alt)', 'ma(tifinagh-alt-phonetic)', 'ma(tifinagh-extended)', 'ma(tifinagh-extended-phonetic)', 'ma(tifinagh-phonetic)', 'me', 'me(cyrillic)', 'me(cyrillicalternatequotes)', 'me(cyrillicyz)', 'mk', 'mk(nodeadkeys)', 'mm', 'mn', 'mt', 'mt(us)', 'mv', 'ng', 'ng(hausa)', 'ng(igbo)', 'ng(yoruba)', 'nl', 'no', 'np', 'ph', 'ph(capewell-dvorak-bay)', 'ph(capewell-qwerf2k6-bay)', 'ph(colemak-bay)', 'ph(dvorak-bay)', 'ph(qwerty-bay)', 'pk', 'pk(ara)', 'pk(snd)', 'pk(urd-crulp)', 'pk(urd-nla)', 'pl', 'pl(ru_phonetic_dvorak)', 'pt', 'ro', 'rs', 'rs(alternatequotes)', 'rs(latin)', 'rs(rue)', 'rs(yz)', 'ru', 'ru(bak)', 'ru(chm)', 'ru(cv)', 'ru(dos)', 'ru(kom)', 'ru(legacy)', 'ru(mac)', 'ru(os_legacy)', 'ru(os_winkeys)', 'ru(phonetic)', 'ru(phonetic_winkeys)', 'ru(sah)', 'ru(srp)', 'ru(tt)', 'ru(typewriter)', 'ru(typewriter-legacy)', 'ru(udm)', 'ru(xal)', 'se', 'se(nodeadkeys)', 'se(rus)', 'se(rus_nodeadkeys)', 'se(swl)', 'si', 'sk', 'sn', 'sy', 'sy(syc)', 'sy(syc_phonetic)', 'th', 'th(pat)', 'th(tis)', 'tj', 'tj(legacy)', 'tm', 'tr', 'tr(crh)', 'tr(ku)', 'tz', 'ua', 'ua(homophonic)', 'ua(legacy)', 'ua(phonetic)', 'ua(rstu)', 'ua(rstu_ru)', 'ua(typewriter)', 'ua(winkeys)', 'us', 'us(altgr-intl)', 'us(chr)', 'us(euro)', 'us(intl)', 'us(rus)', 'uz', 'uz(latin)', 'vn', 'za']
2163
2163
  >>> print(list_all_territories()) # doctest: +NORMALIZE_WHITESPACE
@@ -2176,7 +2176,8 @@ def dummy():
2176
2176
  if __name__ == "__main__":
2177
2177
  import doctest
2178
2178
  (FAILED, ATTEMPTED) = doctest.testmod()
2179
+ print(f'{ATTEMPTED} tests run. {ATTEMPTED - FAILED} passed and {FAILED} failed.')
2179
2180
  if FAILED:
2180
- # Return number of failed tests:
2181
2181
  sys.exit(FAILED)
2182
+ print(f'All tests passed.')
2182
2183
  sys.exit(0)
File without changes
File without changes